diff options
author | Kostya Shishkov <kostya.shishkov@gmail.com> | 2019-01-17 12:25:49 +0100 |
---|---|---|
committer | Kostya Shishkov <kostya.shishkov@gmail.com> | 2019-01-17 12:25:49 +0100 |
commit | 5641dccfbf2a70d589cf094a0d4ed5a10f919f00 (patch) | |
tree | ab444f3e91b46723187546b1b2820924fb332513 /src | |
parent | b74ff9fac35d41737d71d97227fad233aa4a4b49 (diff) | |
download | nihav-5641dccfbf2a70d589cf094a0d4ed5a10f919f00.tar.gz |
split NihAV into subcrates
Diffstat (limited to 'src')
62 files changed, 0 insertions, 52564 deletions
diff --git a/src/TODO b/src/TODO deleted file mode 100644 index 6abbf2b..0000000 --- a/src/TODO +++ /dev/null @@ -1,15 +0,0 @@ - Design: -better interface for registered demuxers/codecs -paletted formats support -MDCT - - Formats: -Smacker -Bink - - Demuxers: -seeking - maybe with more generic interface too -index reading - - Misc: -indeo3: requantisation, better data end check diff --git a/src/codecs/aac.rs b/src/codecs/aac.rs deleted file mode 100644 index 23d6689..0000000 --- a/src/codecs/aac.rs +++ /dev/null @@ -1,1768 +0,0 @@ -use crate::formats::*; -use crate::frame::*; -use crate::codecs::*; -use crate::dsp::fft::FFTMode; -use crate::dsp::mdct::IMDCT; -use crate::dsp::window::*; -use crate::io::bitreader::*; -use crate::io::codebook::*; -use std::fmt; -use crate::io::intcode::*; -use std::mem; -use std::ptr; -use std::str::FromStr; -use std::f32::consts; - -#[allow(non_camel_case_types)] -#[derive(Clone,Copy,PartialEq)] -enum M4AType { - None, - Main, - LC, - SSR, - LTP, - SBR, - Scalable, - TwinVQ, - CELP, - HVXC, - TTSI, - MainSynth, - WavetableSynth, - GeneralMIDI, - Algorithmic, - ER_AAC_LC, - ER_AAC_LTP, - ER_AAC_Scalable, - ER_TwinVQ, - ER_BSAC, - ER_AAC_LD, - ER_CELP, - ER_HVXC, - ER_HILN, - ER_Parametric, - SSC, - PS, - MPEGSurround, - Layer1, - Layer2, - Layer3, - DST, - ALS, - SLS, - SLSNonCore, - ER_AAC_ELD, - SMRSimple, - SMRMain, - Reserved, - Unknown, -} - -const M4A_TYPES: &[M4AType] = &[ - M4AType::None, M4AType::Main, M4AType::LC, M4AType::SSR, - M4AType::LTP, M4AType::SBR, M4AType::Scalable, M4AType::TwinVQ, - M4AType::CELP, M4AType::HVXC, M4AType::Reserved, M4AType::Reserved, - M4AType::TTSI, M4AType::MainSynth, M4AType::WavetableSynth, M4AType::GeneralMIDI, - M4AType::Algorithmic, M4AType::ER_AAC_LC, M4AType::Reserved, M4AType::ER_AAC_LTP, - M4AType::ER_AAC_Scalable, M4AType::ER_TwinVQ, M4AType::ER_BSAC, M4AType::ER_AAC_LD, - M4AType::ER_CELP, M4AType::ER_HVXC, M4AType::ER_HILN, M4AType::ER_Parametric, - M4AType::SSC, M4AType::PS, M4AType::MPEGSurround, M4AType::Reserved /*escape*/, - M4AType::Layer1, M4AType::Layer2, M4AType::Layer3, M4AType::DST, - M4AType::ALS, M4AType::SLS, M4AType::SLSNonCore, M4AType::ER_AAC_ELD, - M4AType::SMRSimple, M4AType::SMRMain, -]; -const M4A_TYPE_NAMES: &[&str] = &[ - "None", "AAC Main", "AAC LC", "AAC SSR", "AAC LTP", "SBR", "AAC Scalable", "TwinVQ", "CELP", "HVXC", - /*"(reserved10)", "(reserved11)", */ "TTSI", - "Main synthetic", "Wavetable synthesis", "General MIDI", "Algorithmic Synthesis and Audio FX", - "ER AAC LC", /*"(reserved18)",*/ "ER AAC LTP", "ER AAC Scalable", "ER TwinVQ", "ER BSAC", "ER AAC LD", - "ER CELP", "ER HVXC", "ER HILN", "ER Parametric", "SSC", "PS", "MPEG Surround", /*"(escape)",*/ - "Layer-1", "Layer-2", "Layer-3", "DST", "ALS", "SLS", "SLS non-core", "ER AAC ELD", "SMR Simple", "SMR Main", - "(reserved)", "(unknown)", -]; - -impl fmt::Display for M4AType { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - write!(f, "{}", M4A_TYPE_NAMES[*self as usize]) - } -} - -const AAC_SAMPLE_RATES: [u32; 16] = [ - 96000, 88200, 64000, 48000, 44100, 32000, 24000, 22050, - 16000, 12000, 11025, 8000, 7350, 0, 0, 0 -]; - -const AAC_CHANNELS: [usize; 8] = [ 0, 1, 2, 3, 4, 5, 6, 8 ]; - -struct M4AInfo { - otype: M4AType, - srate: u32, - channels: usize, - samples: usize, - sbr_ps_info: Option<(u32, usize)>, - sbr_present: bool, - ps_present: bool, -} - -impl M4AInfo { - fn new() -> Self { - Self { - otype: M4AType::None, - srate: 0, - channels: 0, - samples: 0, - sbr_ps_info: Option::None, - sbr_present: false, - ps_present: false, - } - } - fn read_object_type(br: &mut BitReader) -> DecoderResult<M4AType> { - let otypeidx; - if br.peek(5) == 31 { - br.skip(5)?; - otypeidx = (br.read(6)? as usize) + 32; - } else { - otypeidx = br.read(5)? as usize; - } - if otypeidx >= M4A_TYPES.len() { - Ok(M4AType::Unknown) - } else { - Ok(M4A_TYPES[otypeidx]) - } - } - fn read_sampling_frequency(br: &mut BitReader) -> DecoderResult<u32> { - if br.peek(4) == 15 { - let srate = br.read(24)?; - Ok(srate) - } else { - let srate_idx = br.read(4)? as usize; - Ok(AAC_SAMPLE_RATES[srate_idx]) - } - } - fn read_channel_config(br: &mut BitReader) -> DecoderResult<usize> { - let chidx = br.read(4)? as usize; - if chidx < AAC_CHANNELS.len() { - Ok(AAC_CHANNELS[chidx]) - } else { - Ok(chidx) - } - } - fn read(&mut self, src: &[u8]) -> DecoderResult<()> { - let mut br = BitReader::new(src, src.len(), BitReaderMode::BE); - self.otype = Self::read_object_type(&mut br)?; - self.srate = Self::read_sampling_frequency(&mut br)?; - validate!(self.srate > 0); - self.channels = Self::read_channel_config(&mut br)?; - - if (self.otype == M4AType::SBR) || (self.otype == M4AType::PS) { - let ext_srate = Self::read_sampling_frequency(&mut br)?; - self.otype = Self::read_object_type(&mut br)?; - let ext_chans; - if self.otype == M4AType::ER_BSAC { - ext_chans = Self::read_channel_config(&mut br)?; - } else { - ext_chans = 0; - } - self.sbr_ps_info = Some((ext_srate, ext_chans)); - } - - match self.otype { - M4AType::Main | M4AType::LC | M4AType::SSR | M4AType::Scalable | M4AType::TwinVQ | - M4AType::ER_AAC_LC | M4AType::ER_AAC_LTP | M4AType::ER_AAC_Scalable | M4AType::ER_TwinVQ | - M4AType::ER_BSAC | M4AType::ER_AAC_LD => { - // GASpecificConfig - let short_frame = br.read_bool()?; - self.samples = if short_frame { 960 } else { 1024 }; - let depends_on_core = br.read_bool()?; - if depends_on_core { - let _delay = br.read(14)?; - } - let extension_flag = br.read_bool()?; - if self.channels == 0 { - unimplemented!("program config element"); - } - if (self.otype == M4AType::Scalable) || (self.otype == M4AType::ER_AAC_Scalable) { - let _layer = br.read(3)?; - } - if extension_flag { - if self.otype == M4AType::ER_BSAC { - let _num_subframes = br.read(5)? as usize; - let _layer_length = br.read(11)?; - } - if (self.otype == M4AType::ER_AAC_LC) || - (self.otype == M4AType::ER_AAC_LTP) || - (self.otype == M4AType::ER_AAC_Scalable) || - (self.otype == M4AType::ER_AAC_LD) { - let _section_data_resilience = br.read_bool()?; - let _scalefactors_resilience = br.read_bool()?; - let _spectral_data_resilience = br.read_bool()?; - } - let extension_flag3 = br.read_bool()?; - if extension_flag3 { - unimplemented!("version3 extensions"); - } - } - }, - M4AType::CELP => { unimplemented!("CELP config"); }, - M4AType::HVXC => { unimplemented!("HVXC config"); }, - M4AType::TTSI => { unimplemented!("TTS config"); }, - M4AType::MainSynth | M4AType::WavetableSynth | M4AType::GeneralMIDI | M4AType::Algorithmic => { unimplemented!("structured audio config"); }, - M4AType::ER_CELP => { unimplemented!("ER CELP config"); }, - M4AType::ER_HVXC => { unimplemented!("ER HVXC config"); }, - M4AType::ER_HILN | M4AType::ER_Parametric => { unimplemented!("parametric config"); }, - M4AType::SSC => { unimplemented!("SSC config"); }, - M4AType::MPEGSurround => { - br.skip(1)?; // sacPayloadEmbedding - unimplemented!("MPEG Surround config"); - }, - M4AType::Layer1 | M4AType::Layer2 | M4AType::Layer3 => { unimplemented!("MPEG Layer 1/2/3 config"); }, - M4AType::DST => { unimplemented!("DST config"); }, - M4AType::ALS => { - br.skip(5)?; // fillBits - unimplemented!("ALS config"); - }, - M4AType::SLS | M4AType::SLSNonCore => { unimplemented!("SLS config"); }, - M4AType::ER_AAC_ELD => { unimplemented!("ELD config"); }, - M4AType::SMRSimple | M4AType::SMRMain => { unimplemented!("symbolic music config"); }, - _ => {}, - }; - match self.otype { - M4AType::ER_AAC_LC | M4AType::ER_AAC_LTP | M4AType::ER_AAC_Scalable | M4AType::ER_TwinVQ | - M4AType::ER_BSAC | M4AType::ER_AAC_LD | M4AType::ER_CELP | M4AType::ER_HVXC | - M4AType::ER_HILN | M4AType::ER_Parametric | M4AType::ER_AAC_ELD => { - let ep_config = br.read(2)?; - if (ep_config == 2) || (ep_config == 3) { - unimplemented!("error protection config"); - } - if ep_config == 3 { - let direct_mapping = br.read_bool()?; - validate!(direct_mapping); - } - }, - _ => {}, - }; - if self.sbr_ps_info.is_some() && (br.left() >= 16) { - let sync = br.read(11)?; - if sync == 0x2B7 { - let ext_otype = Self::read_object_type(&mut br)?; - if ext_otype == M4AType::SBR { - self.sbr_present = br.read_bool()?; - if self.sbr_present { - let _ext_srate = Self::read_sampling_frequency(&mut br)?; - if br.left() >= 12 { - let sync = br.read(11)?; - if sync == 0x548 { - self.ps_present = br.read_bool()?; - } - } - } - } - if ext_otype == M4AType::PS { - self.sbr_present = br.read_bool()?; - if self.sbr_present { - let _ext_srate = Self::read_sampling_frequency(&mut br)?; - } - let _ext_channels = br.read(4)?; - } - } - } - - Ok(()) - } -} - -impl fmt::Display for M4AInfo { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - write!(f, "MPEG 4 Audio {}, {} Hz, {} channels, {} samples per frame", - self.otype, self.srate, self.channels, self.samples) - } -} - -const MAX_WINDOWS: usize = 8; -const MAX_SFBS: usize = 64; - -#[derive(Clone,Copy)] -struct ICSInfo { - window_sequence: u8, - prev_window_sequence: u8, - window_shape: bool, - prev_window_shape: bool, - scale_factor_grouping: [bool; MAX_WINDOWS], - group_start: [usize; MAX_WINDOWS], - window_groups: usize, - num_windows: usize, - max_sfb: usize, - predictor_data: Option<LTPData>, - long_win: bool, -} - -const ONLY_LONG_SEQUENCE: u8 = 0; -const LONG_START_SEQUENCE: u8 = 1; -const EIGHT_SHORT_SEQUENCE: u8 = 2; -const LONG_STOP_SEQUENCE: u8 = 3; - -impl ICSInfo { - fn new() -> Self { - Self { - window_sequence: 0, - prev_window_sequence: 0, - window_shape: false, - prev_window_shape: false, - scale_factor_grouping: [false; MAX_WINDOWS], - group_start: [0; MAX_WINDOWS], - num_windows: 0, - window_groups: 0, - max_sfb: 0, - predictor_data: None, - long_win: true, - } - } - fn decode_ics_info(&mut self, br: &mut BitReader) -> DecoderResult<()> { - self.prev_window_sequence = self.window_sequence; - self.prev_window_shape = self.window_shape; - let ics_reserved_bit = br.read(1)?; - validate!(ics_reserved_bit == 0); - self.window_sequence = br.read(2)? as u8; - match self.prev_window_sequence { - ONLY_LONG_SEQUENCE | LONG_STOP_SEQUENCE => { - validate!((self.window_sequence == ONLY_LONG_SEQUENCE) || - (self.window_sequence == LONG_START_SEQUENCE)); - }, - LONG_START_SEQUENCE | EIGHT_SHORT_SEQUENCE => { - validate!((self.window_sequence == EIGHT_SHORT_SEQUENCE) || - (self.window_sequence == LONG_STOP_SEQUENCE)); - }, - _ => {}, - }; - self.window_shape = br.read_bool()?; - self.window_groups = 1; - if self.window_sequence == EIGHT_SHORT_SEQUENCE { - self.long_win = false; - self.num_windows = 8; - self.max_sfb = br.read(4)? as usize; - for i in 0..MAX_WINDOWS-1 { - self.scale_factor_grouping[i] = br.read_bool()?; - if !self.scale_factor_grouping[i] { - self.group_start[self.window_groups] = i + 1; - self.window_groups += 1; - } - } - } else { - self.long_win = true; - self.num_windows = 1; - self.max_sfb = br.read(6)? as usize; - self.predictor_data = LTPData::read(br)?; - } - Ok(()) - } - fn get_group_start(&self, g: usize) -> usize { - if g == 0 { - 0 - } else if g >= self.window_groups { - if self.long_win { 1 } else { 8 } - } else { - self.group_start[g] - } - } -} - -#[derive(Clone,Copy)] -struct LTPData { -} - -impl LTPData { - fn read(br: &mut BitReader) -> DecoderResult<Option<Self>> { - let predictor_data_present = br.read_bool()?; - if !predictor_data_present { return Ok(None); } -unimplemented!("predictor data"); -/* - if is_main { - let predictor_reset = br.read_bool()?; - if predictor_reset { - let predictor_reset_group_number = br.read(5)?; - } - for sfb in 0..max_sfb.min(PRED_SFB_MAX) { - prediction_used[sfb] = br.read_bool()?; - } - } else { - let ltp_data_present = br.read_bool()?; - if ltp_data_present { - //ltp data - } - if common_window { - let ltp_data_present = br.read_bool()?; - if ltp_data_present { - //ltp data - } - } - } - Ok(Some(Self { })) -*/ - } -} - -#[derive(Clone,Copy)] -#[allow(dead_code)] -struct PulseData { - number_pulse: usize, - pulse_start_sfb: usize, - pulse_offset: [u8; 4], - pulse_amp: [u8; 4], -} - -impl PulseData { - fn read(br: &mut BitReader) -> DecoderResult<Option<Self>> { - let pulse_data_present = br.read_bool()?; - if !pulse_data_present { return Ok(None); } - - let number_pulse = (br.read(2)? as usize) + 1; - let pulse_start_sfb = br.read(6)? as usize; - let mut pulse_offset: [u8; 4] = [0; 4]; - let mut pulse_amp: [u8; 4] = [0; 4]; - for i in 0..number_pulse { - pulse_offset[i] = br.read(5)? as u8; - pulse_amp[i] = br.read(4)? as u8; - } - Ok(Some(Self{ number_pulse, pulse_start_sfb, pulse_offset, pulse_amp })) - } -} - -const TNS_MAX_ORDER: usize = 20; -const TNS_MAX_LONG_BANDS: [usize; 12] = [ 31, 31, 34, 40, 42, 51, 46, 46, 42, 42, 42, 39 ]; -const TNS_MAX_SHORT_BANDS: [usize; 12] = [ 9, 9, 10, 14, 14, 14, 14, 14, 14, 14, 14, 14 ]; - -#[derive(Clone,Copy)] -struct TNSCoeffs { - length: usize, - order: usize, - direction: bool, - compress: bool, - coef: [f32; TNS_MAX_ORDER + 1], -} - -impl TNSCoeffs { - fn new() -> Self { - Self { - length: 0, order: 0, direction: false, compress: false, coef: [0.0; TNS_MAX_ORDER + 1], - } - } - fn read(&mut self, br: &mut BitReader, long_win: bool, coef_res: bool, max_order: usize) -> DecoderResult<()> { - self.length = br.read(if long_win { 6 } else { 4 })? as usize; - self.order = br.read(if long_win { 5 } else { 3 })? as usize; - validate!(self.order <= max_order); - if self.order > 0 { - self.direction = br.read_bool()?; - self.compress = br.read_bool()?; - let mut coef_bits = 3; - if coef_res { coef_bits += 1; } - if self.compress { coef_bits -= 1; } - let sign_mask = 1 << (coef_bits - 1); - let neg_mask = !(sign_mask * 2 - 1); - - let fac_base = if coef_res { 1 << 3 } else { 1 << 2 } as f32; - let iqfac = (fac_base - 0.5) / (consts::PI / 2.0); - let iqfac_m = (fac_base + 0.5) / (consts::PI / 2.0); - let mut tmp: [f32; TNS_MAX_ORDER] = [0.0; TNS_MAX_ORDER]; - for i in 0..self.order { - let val = br.read(coef_bits)? as i8; - let c = if (val & sign_mask) != 0 { val | neg_mask } else { val } as f32; - tmp[i] = (if c >= 0.0 { c / iqfac } else { c / iqfac_m }).sin(); - } - // convert to LPC coefficients - let mut b: [f32; TNS_MAX_ORDER + 1] = [0.0; TNS_MAX_ORDER + 1]; - for m in 1..(self.order + 1) { - for i in 1..m { - b[i] = self.coef[i - 1] + tmp[m - 1] * self.coef[m - i - 1]; - } - for i in 1..m { - self.coef[i - 1] = b[i]; - } - self.coef[m - 1] = tmp[m - 1]; - } - } - Ok(()) - } -} - -#[derive(Clone,Copy)] -#[allow(dead_code)] -struct TNSData { - n_filt: [usize; MAX_WINDOWS], - coef_res: [bool; MAX_WINDOWS], - coeffs: [[TNSCoeffs; 4]; MAX_WINDOWS], -} - -impl TNSData { - fn read(br: &mut BitReader, long_win: bool, num_windows: usize, max_order: usize) -> DecoderResult<Option<Self>> { - let tns_data_present = br.read_bool()?; - if !tns_data_present { return Ok(None); } - let mut n_filt: [usize; MAX_WINDOWS] = [0; MAX_WINDOWS]; - let mut coef_res: [bool; MAX_WINDOWS] = [false; MAX_WINDOWS]; - let mut coeffs: [[TNSCoeffs; 4]; MAX_WINDOWS] = [[TNSCoeffs::new(); 4]; MAX_WINDOWS]; - for w in 0..num_windows { - n_filt[w] = br.read(if long_win { 2 } else { 1 })? as usize; - if n_filt[w] != 0 { - coef_res[w] = br.read_bool()?; - } - for filt in 0..n_filt[w] { - coeffs[w][filt].read(br, long_win, coef_res[w], max_order)?; - } - } - Ok(Some(Self { n_filt, coef_res, coeffs })) - } -} - -#[derive(Clone,Copy)] -#[allow(dead_code)] -struct GainControlData { - max_band: u8, -} - -impl GainControlData { - fn read(br: &mut BitReader) -> DecoderResult<Option<Self>> { - let gain_control_data_present = br.read_bool()?; - if !gain_control_data_present { return Ok(None); } -unimplemented!("gain control data"); -/* self.max_band = br.read(2)? as u8; - if window_sequence == ONLY_LONG_SEQUENCE { - for bd in 0..max_band -... - } - Ok(Some(Self { }))*/ - } -} - -const ZERO_HCB: u8 = 0; -const FIRST_PAIR_HCB: u8 = 5; -const ESC_HCB: u8 = 11; -const RESERVED_HCB: u8 = 12; -const NOISE_HCB: u8 = 13; -const INTENSITY_HCB2: u8 = 14; -const INTENSITY_HCB: u8 = 15; - -struct Codebooks { - scale_cb: Codebook<i8>, - spec_cb: [Codebook<u16>; 11], -} - -fn scale_map(idx: usize) -> i8 { (idx as i8) - 60 } -fn cb_map(idx: usize) -> u16 { idx as u16 } - -impl Codebooks { - fn new() -> Self { - let mut coderead = TableCodebookDescReader::new(AAC_SCF_CODEBOOK_CODES, AAC_SCF_CODEBOOK_BITS, scale_map); - let scale_cb = Codebook::new(&mut coderead, CodebookMode::MSB).unwrap(); - let mut spec_cb: [Codebook<u16>; 11]; - unsafe { - spec_cb = mem::uninitialized(); - for i in 0..AAC_SPEC_CODES.len() { - let mut coderead = TableCodebookDescReader::new(AAC_SPEC_CODES[i], AAC_SPEC_BITS[i], cb_map); - ptr::write(&mut spec_cb[i], Codebook::new(&mut coderead, CodebookMode::MSB).unwrap()); - } - } - Self { scale_cb, spec_cb } - } -} - -#[derive(Clone)] -struct ICS { - global_gain: u8, - info: ICSInfo, - pulse_data: Option<PulseData>, - tns_data: Option<TNSData>, - gain_control: Option<GainControlData>, - sect_cb: [[u8; MAX_SFBS]; MAX_WINDOWS], - sect_len: [[usize; MAX_SFBS]; MAX_WINDOWS], - sfb_cb: [[u8; MAX_SFBS]; MAX_WINDOWS], - num_sec: [usize; MAX_WINDOWS], - scales: [[u8; MAX_SFBS]; MAX_WINDOWS], - sbinfo: GASubbandInfo, - coeffs: [f32; 1024], - delay: [f32; 1024], -} - -const INTENSITY_SCALE_MIN: i16 = -155; -const NOISE_SCALE_MIN: i16 = -100; -impl ICS { - fn new(sbinfo: GASubbandInfo) -> Self { - Self { - global_gain: 0, - info: ICSInfo::new(), - pulse_data: None, - tns_data: None, - gain_control: None, - sect_cb: [[0; MAX_SFBS]; MAX_WINDOWS], - sect_len: [[0; MAX_SFBS]; MAX_WINDOWS], - sfb_cb: [[0; MAX_SFBS]; MAX_WINDOWS], - scales: [[0; MAX_SFBS]; MAX_WINDOWS], - num_sec: [0; MAX_WINDOWS], - sbinfo, - coeffs: [0.0; 1024], - delay: [0.0; 1024], - } - } - fn decode_section_data(&mut self, br: &mut BitReader, may_have_intensity: bool) -> DecoderResult<()> { - let sect_bits = if self.info.long_win { 5 } else { 3 }; - let sect_esc_val = (1 << sect_bits) - 1; - - for g in 0..self.info.window_groups { - let mut k = 0; - let mut l = 0; - while k < self.info.max_sfb { - self.sect_cb[g][l] = br.read(4)? as u8; - self.sect_len[g][l] = 0; - validate!(self.sect_cb[g][l] != RESERVED_HCB); - if ((self.sect_cb[g][l] == INTENSITY_HCB) || (self.sect_cb[g][l] == INTENSITY_HCB2)) && !may_have_intensity { - return Err(DecoderError::InvalidData); - } - loop { - let sect_len_incr = br.read(sect_bits)? as usize; - self.sect_len[g][l] += sect_len_incr; - if sect_len_incr < sect_esc_val { break; } - } - validate!(k + self.sect_len[g][l] <= self.info.max_sfb); - for _ in 0..self.sect_len[g][l] { - self.sfb_cb[g][k] = self.sect_cb[g][l]; - k += 1; - } - l += 1; - } - self.num_sec[g] = l; - } - Ok(()) - } - fn is_intensity(&self, g: usize, sfb: usize) -> bool { - (self.sfb_cb[g][sfb] == INTENSITY_HCB) || (self.sfb_cb[g][sfb] == INTENSITY_HCB2) - } - fn get_intensity_dir(&self, g: usize, sfb: usize) -> bool { - self.sfb_cb[g][sfb] == INTENSITY_HCB - } - fn decode_scale_factor_data(&mut self, br: &mut BitReader, codebooks: &Codebooks) -> DecoderResult<()> { - let mut noise_pcm_flag = true; - let mut scf_normal = self.global_gain as i16; - let mut scf_intensity = 0i16; - let mut scf_noise = 0i16; - for g in 0..self.info.window_groups { - for sfb in 0..self.info.max_sfb { - if self.sfb_cb[g][sfb] != ZERO_HCB { - if self.is_intensity(g, sfb) { - let diff = br.read_cb(&codebooks.scale_cb)? as i16; - scf_intensity += diff; - validate!((scf_intensity >= INTENSITY_SCALE_MIN) && (scf_intensity < INTENSITY_SCALE_MIN + 256)); - self.scales[g][sfb] = (scf_intensity - INTENSITY_SCALE_MIN) as u8; - } else { - if self.sfb_cb[g][sfb] == NOISE_HCB { - if noise_pcm_flag { - noise_pcm_flag = false; - scf_noise = (br.read(9)? as i16) - 256 + (self.global_gain as i16) - 90; - } else { - scf_noise += br.read_cb(&codebooks.scale_cb)? as i16; - } - validate!((scf_noise >= NOISE_SCALE_MIN) && (scf_noise < NOISE_SCALE_MIN + 256)); - self.scales[g][sfb] = (scf_noise - NOISE_SCALE_MIN) as u8; - } else { - scf_normal += br.read_cb(&codebooks.scale_cb)? as i16; - validate!((scf_normal >= 0) && (scf_normal < 255)); - self.scales[g][sfb] = scf_normal as u8; - } - } - } - } - } - Ok(()) - } - fn get_band_start(&self, swb: usize) -> usize { - if self.info.long_win { - self.sbinfo.long_bands[swb] - } else { - self.sbinfo.short_bands[swb] - } - } - fn get_num_bands(&self) -> usize { - if self.info.long_win { - self.sbinfo.long_bands.len() - 1 - } else { - self.sbinfo.short_bands.len() - 1 - } - } - fn decode_spectrum(&mut self, br: &mut BitReader, codebooks: &Codebooks) -> DecoderResult<()> { - self.coeffs = [0.0; 1024]; - for g in 0..self.info.window_groups { - let cur_w = self.info.get_group_start(g); - let next_w = self.info.get_group_start(g + 1); - for sfb in 0..self.info.max_sfb { - let start = self.get_band_start(sfb); - let end = self.get_band_start(sfb + 1); - let cb_idx = self.sfb_cb[g][sfb]; - for w in cur_w..next_w { - let dst = &mut self.coeffs[start + w*128..end + w*128]; - match cb_idx { - ZERO_HCB => { /* zeroes */ }, - NOISE_HCB => { /* noise */ }, - INTENSITY_HCB | INTENSITY_HCB2 => { /* intensity */ }, - _ => { - let unsigned = AAC_UNSIGNED_CODEBOOK[(cb_idx - 1) as usize]; - let scale = get_scale(self.scales[g][sfb]); - let cb = &codebooks.spec_cb[(cb_idx - 1) as usize]; - if cb_idx < FIRST_PAIR_HCB { - decode_quads(br, cb, unsigned, scale, dst)?; - } else { - decode_pairs(br, cb, unsigned, cb_idx == ESC_HCB, - AAC_CODEBOOK_MODULO[(cb_idx - FIRST_PAIR_HCB) as usize], scale, dst)?; - } - }, - }; - } - } - } - Ok(()) - } - fn place_pulses(&mut self) { - if let Some(ref pdata) = self.pulse_data { - if pdata.pulse_start_sfb >= self.sbinfo.long_bands.len() - 1 { return; } - let mut k = self.get_band_start(pdata.pulse_start_sfb); - let mut band = pdata.pulse_start_sfb; - for pno in 0..pdata.number_pulse { - k += pdata.pulse_offset[pno] as usize; - if k >= 1024 { return; } - while self.get_band_start(band + 1) <= k { band += 1; } - let scale = get_scale(self.scales[0][band]); - let mut base = self.coeffs[k]; - if base != 0.0 { - base = requant(self.coeffs[k], scale); - } - if base > 0.0 { - base += pdata.pulse_amp[pno] as f32; - } else { - base -= pdata.pulse_amp[pno] as f32; - } - self.coeffs[k] = iquant(base) * scale; - } - } - } - fn decode_ics(&mut self, br: &mut BitReader, codebooks: &Codebooks, m4atype: M4AType, common_window: bool, may_have_intensity: bool) -> DecoderResult<()> { - self.global_gain = br.read(8)? as u8; - if !common_window { - self.info.decode_ics_info(br)?; - } - self.decode_section_data(br, may_have_intensity)?; - self.decode_scale_factor_data(br, codebooks)?; - self.pulse_data = PulseData::read(br)?; - validate!(self.pulse_data.is_none() || self.info.long_win); - let tns_max_order; - if !self.info.long_win { - tns_max_order = 7; - } else if m4atype == M4AType::LC { - tns_max_order = 12; - } else { - tns_max_order = TNS_MAX_ORDER; - } - self.tns_data = TNSData::read(br, self.info.long_win, self.info.num_windows, tns_max_order)?; - if m4atype == M4AType::SSR { - self.gain_control = GainControlData::read(br)?; - } else { - let gain_control_data_present = br.read_bool()?; - validate!(!gain_control_data_present); - } - self.decode_spectrum(br, codebooks)?; - Ok(()) - } - fn synth_channel(&mut self, dsp: &mut DSP, dst: &mut [f32], srate_idx: usize) { - self.place_pulses(); - if let Some(ref tns_data) = self.tns_data { - let tns_max_bands = (if self.info.long_win { - TNS_MAX_LONG_BANDS[srate_idx] - } else { - TNS_MAX_SHORT_BANDS[srate_idx] - }).min(self.info.max_sfb); - for w in 0..self.info.num_windows { - let mut bottom = self.get_num_bands(); - for f in 0..tns_data.n_filt[w] { - let top = bottom; - bottom = if top >= tns_data.coeffs[w][f].length { top - tns_data.coeffs[w][f].length } else { 0 }; - let order = tns_data.coeffs[w][f].order; - if order == 0 { continue; } - let start = w * 128 + self.get_band_start(tns_max_bands.min(bottom)); - let end = w * 128 + self.get_band_start(tns_max_bands.min(top)); - let lpc = &tns_data.coeffs[w][f].coef; - if !tns_data.coeffs[w][f].direction { - for m in start..end { - for i in 0..order.min(m) { - self.coeffs[m] -= self.coeffs[m - i - 1] * lpc[i]; - } - } - } else { - for m in (start..end).rev() { - for i in 0..order.min(m) { - self.coeffs[m] -= self.coeffs[m + i - 1] * lpc[i]; - } - } - } - } - } - } - dsp.synth(&self.coeffs, &mut self.delay, self.info.window_sequence, self.info.window_shape, self.info.prev_window_shape, dst); - } -} - -fn get_scale(scale: u8) -> f32 { - 2.0f32.powf(0.25 * ((scale as f32) - 100.0 - 56.0)) -} -fn iquant(val: f32) -> f32 { - if val < 0.0 { - -((-val).powf(4.0 / 3.0)) - } else { - val.powf(4.0 / 3.0) - } -} -fn requant(val: f32, scale: f32) -> f32 { - if scale == 0.0 { return 0.0; } - let bval = val / scale; - if bval >= 0.0 { - val.powf(3.0 / 4.0) - } else { - -((-val).powf(3.0 / 4.0)) - } -} -fn decode_quads(br: &mut BitReader, cb: &Codebook<u16>, unsigned: bool, scale: f32, dst: &mut [f32]) -> DecoderResult<()> { - for out in dst.chunks_mut(4) { - let cw = br.read_cb(cb)? as usize; - if unsigned { - for i in 0..4 { - let val = AAC_QUADS[cw][i]; - if val != 0 { - if br.read_bool()? { - out[i] = iquant(-val as f32) * scale; - } else { - out[i] = iquant( val as f32) * scale; - } - } - } - } else { - for i in 0..4 { - out[i] = iquant((AAC_QUADS[cw][i] - 1) as f32) * scale; - } - } - } - Ok(()) -} -fn decode_pairs(br: &mut BitReader, cb: &Codebook<u16>, unsigned: bool, escape: bool, modulo: u16, scale: f32, dst: &mut [f32]) -> DecoderResult<()> { - for out in dst.chunks_mut(2) { - let cw = br.read_cb(cb)?; - let mut x = (cw / modulo) as i16; - let mut y = (cw % modulo) as i16; - if unsigned { - if x != 0 && br.read_bool()? { - x = -x; - } - if y != 0 && br.read_bool()? { - y = -y; - } - } else { - x -= (modulo >> 1) as i16; - y -= (modulo >> 1) as i16; - } - if escape { - if (x == 16) || (x == -16) { - x += read_escape(br, x > 0)?; - } - if (y == 16) || (y == -16) { - y += read_escape(br, y > 0)?; - } - } - out[0] = iquant(x as f32) * scale; - out[1] = iquant(y as f32) * scale; - } - Ok(()) -} -fn read_escape(br: &mut BitReader, sign: bool) -> DecoderResult<i16> { - let prefix = br.read_code(UintCodeType::UnaryOnes)? as u8; - validate!(prefix < 9); - let bits = br.read(prefix + 4)? as i16; - if sign { - Ok(bits) - } else { - Ok(-bits) - } -} - -#[derive(Clone)] -struct ChannelPair { - pair: bool, - channel: usize, - common_window: bool, - ms_mask_present: u8, - ms_used: [[bool; MAX_SFBS]; MAX_WINDOWS], - ics: [ICS; 2], -} - -impl ChannelPair { - fn new(pair: bool, channel: usize, sbinfo: GASubbandInfo) -> Self { - Self { - pair, channel, - common_window: false, - ms_mask_present: 0, - ms_used: [[false; MAX_SFBS]; MAX_WINDOWS], - ics: [ICS::new(sbinfo), ICS::new(sbinfo)], - } - } - fn decode_ga_sce(&mut self, br: &mut BitReader, codebooks: &Codebooks, m4atype: M4AType) -> DecoderResult<()> { - self.ics[0].decode_ics(br, codebooks, m4atype, false, false)?; - Ok(()) - } - fn decode_ga_cpe(&mut self, br: &mut BitReader, codebooks: &Codebooks, m4atype: M4AType) -> DecoderResult<()> { - let common_window = br.read_bool()?; - self.common_window = common_window; - if common_window { - self.ics[0].info.decode_ics_info(br)?; - self.ms_mask_present = br.read(2)? as u8; - validate!(self.ms_mask_present != 3); - if self.ms_mask_present == 1 { - for g in 0..self.ics[0].info.window_groups { - for sfb in 0..self.ics[0].info.max_sfb { - self.ms_used[g][sfb] = br.read_bool()?; - } - } - } - self.ics[1].info = self.ics[0].info; - } - self.ics[0].decode_ics(br, codebooks, m4atype, common_window, true)?; - self.ics[1].decode_ics(br, codebooks, m4atype, common_window, false)?; - if common_window && self.ms_mask_present != 0 { - let mut g = 0; - for w in 0..self.ics[0].info.num_windows { - if w > 0 && self.ics[0].info.scale_factor_grouping[w - 1] { - g += 1; - } - for sfb in 0..self.ics[0].info.max_sfb { - let start = w * 128 + self.ics[0].get_band_start(sfb); - let end = w * 128 + self.ics[0].get_band_start(sfb + 1); - if self.ics[0].is_intensity(g, sfb) { - let invert = (self.ms_mask_present == 1) && self.ms_used[g][sfb]; - let dir = self.ics[0].get_intensity_dir(g, sfb) ^ invert; - let scale = 0.5f32.powf(0.25 * ((self.ics[0].scales[g][sfb] as f32) + (INTENSITY_SCALE_MIN as f32))); - if !dir { - for i in start..end { - self.ics[1].coeffs[i] = scale * self.ics[0].coeffs[i]; - } - } else { - for i in start..end { - self.ics[1].coeffs[i] = -scale * self.ics[0].coeffs[i]; - } - } - } else if (self.ms_mask_present == 2) || self.ms_used[g][sfb] { - for i in start..end { - let tmp = self.ics[0].coeffs[i] - self.ics[1].coeffs[i]; - self.ics[0].coeffs[i] += self.ics[1].coeffs[i]; - self.ics[1].coeffs[i] = tmp; - } - } - } - } - } - Ok(()) - } - fn synth_audio(&mut self, dsp: &mut DSP, abuf: &mut NABufferType, srate_idx: usize) { - let mut adata = abuf.get_abuf_f32().unwrap(); - let mut output = adata.get_data_mut(); - let off0 = abuf.get_offset(self.channel); - let off1 = abuf.get_offset(self.channel + 1); - self.ics[0].synth_channel(dsp, &mut output[off0..], srate_idx); - if self.pair { - self.ics[1].synth_channel(dsp, &mut output[off1..], srate_idx); - } - } -} - -struct DSP { - kbd_long_win: [f32; 1024], - kbd_short_win: [f32; 128], - sine_long_win: [f32; 1024], - sine_short_win: [f32; 128], - imdct_long: IMDCT, - imdct_short: IMDCT, - tmp: [f32; 2048], - ew_buf: [f32; 1152], -} - -const SHORT_WIN_POINT0: usize = 512 - 64; -const SHORT_WIN_POINT1: usize = 512 + 64; - -impl DSP { - fn new() -> Self { - let mut kbd_long_win: [f32; 1024] = [0.0; 1024]; - let mut kbd_short_win: [f32; 128] = [0.0; 128]; - generate_window(WindowType::KaiserBessel(4.0), 1.0, 1024, true, &mut kbd_long_win); - generate_window(WindowType::KaiserBessel(6.0), 1.0, 128, true, &mut kbd_short_win); - let mut sine_long_win: [f32; 1024] = [0.0; 1024]; - let mut sine_short_win: [f32; 128] = [0.0; 128]; - generate_window(WindowType::Sine, 1.0, 1024, true, &mut sine_long_win); - generate_window(WindowType::Sine, 1.0, 128, true, &mut sine_short_win); - Self { - kbd_long_win, kbd_short_win, - sine_long_win, sine_short_win, - imdct_long: IMDCT::new(FFTMode::SplitRadix, 1024 * 2, true), - imdct_short: IMDCT::new(FFTMode::SplitRadix, 128 * 2, true), - tmp: [0.0; 2048], ew_buf: [0.0; 1152], - } - } - fn synth(&mut self, coeffs: &[f32; 1024], delay: &mut [f32; 1024], seq: u8, window_shape: bool, prev_window_shape: bool, dst: &mut [f32]) { - let long_win = if window_shape { &self.kbd_long_win } else { &self.sine_long_win }; - let short_win = if window_shape { &self.kbd_short_win } else { &self.sine_short_win }; - let left_long_win = if prev_window_shape { &self.kbd_long_win } else { &self.sine_long_win }; - let left_short_win = if prev_window_shape { &self.kbd_short_win } else { &self.sine_short_win }; - if seq != EIGHT_SHORT_SEQUENCE { - self.imdct_long.imdct(coeffs, &mut self.tmp); - } else { - for (ain, aout) in coeffs.chunks(128).zip(self.tmp.chunks_mut(256)) { - self.imdct_short.imdct(ain, aout); - } - self.ew_buf = [0.0; 1152]; - for (w, src) in self.tmp.chunks(256).enumerate() { - if w > 0 { - for i in 0..128 { - self.ew_buf[w * 128 + i] += src[i] * short_win[i]; - } - } else { // to be left-windowed - for i in 0..128 { - self.ew_buf[i] = src[i]; - } - } - for i in 0..128 { - self.ew_buf[w * 128 + i + 128] += src[i + 128] * short_win[127 - i]; - } - } - } - if seq == ONLY_LONG_SEQUENCE { // should be the most common case - for i in 0..1024 { - dst[i] = delay[i] + self.tmp[i] * left_long_win[i]; - delay[i] = self.tmp[i + 1024] * long_win[1023 - i]; - } - return; - } - // output new data - match seq { - ONLY_LONG_SEQUENCE | LONG_START_SEQUENCE => { - for i in 0..1024 { - dst[i] = self.tmp[i] * left_long_win[i] + delay[i]; - } - }, - EIGHT_SHORT_SEQUENCE => { - for i in 0..SHORT_WIN_POINT0 { - dst[i] = delay[i]; - } - for i in SHORT_WIN_POINT0..SHORT_WIN_POINT1 { - let j = i - SHORT_WIN_POINT0; - dst[i] = delay[i] + self.ew_buf[j] * left_short_win[j]; - } - for i in SHORT_WIN_POINT1..1024 { - let j = i - SHORT_WIN_POINT0; - dst[i] = self.ew_buf[j]; - } - }, - LONG_STOP_SEQUENCE => { - for i in 0..SHORT_WIN_POINT0 { - dst[i] = delay[i]; - } - for i in SHORT_WIN_POINT0..SHORT_WIN_POINT1 { - dst[i] = delay[i] + self.tmp[i] * left_short_win[i - SHORT_WIN_POINT0]; - } - for i in SHORT_WIN_POINT1..1024 { - dst[i] = self.tmp[i]; - } - }, - _ => unreachable!(""), - }; - // save delay - match seq { - ONLY_LONG_SEQUENCE | LONG_STOP_SEQUENCE => { - for i in 0..1024 { - delay[i] = self.tmp[i + 1024] * long_win[1023 - i]; - } - }, - EIGHT_SHORT_SEQUENCE => { - for i in 0..SHORT_WIN_POINT1 { // last part is already windowed - delay[i] = self.ew_buf[i + 512+64]; - } - for i in SHORT_WIN_POINT1..1024 { - delay[i] = 0.0; - } - }, - LONG_START_SEQUENCE => { - for i in 0..SHORT_WIN_POINT0 { - delay[i] = self.tmp[i + 1024]; - } - for i in SHORT_WIN_POINT0..SHORT_WIN_POINT1 { - delay[i] = self.tmp[i + 1024] * short_win[127 - (i - SHORT_WIN_POINT0)]; - } - for i in SHORT_WIN_POINT1..1024 { - delay[i] = 0.0; - } - }, - _ => unreachable!(""), - }; - } -} - -struct AACDecoder { - info: Rc<NACodecInfo>, - chmap: NAChannelMap, - m4ainfo: M4AInfo, - pairs: Vec<ChannelPair>, - codebooks: Codebooks, - dsp: DSP, - sbinfo: GASubbandInfo, -} - -impl AACDecoder { - fn new() -> Self { - AACDecoder { - info: NACodecInfo::new_dummy(), - chmap: NAChannelMap::new(), - m4ainfo: M4AInfo::new(), - pairs: Vec::new(), - codebooks: Codebooks::new(), - dsp: DSP::new(), - sbinfo: AAC_SUBBAND_INFO[0], - } - } - fn set_pair(&mut self, pair_no: usize, channel: usize, pair: bool) -> DecoderResult<()> { - if self.pairs.len() <= pair_no { - self.pairs.push(ChannelPair::new(pair, channel, self.sbinfo)); - } else { - validate!(self.pairs[pair_no].channel == channel); - validate!(self.pairs[pair_no].pair == pair); - } - validate!(if pair { channel + 1 } else { channel } < self.m4ainfo.channels); - Ok(()) - } - fn decode_ga(&mut self, br: &mut BitReader, abuf: &mut NABufferType) -> DecoderResult<()> { - let mut cur_pair = 0; - let mut cur_ch = 0; - while br.left() > 3 { - let id = br.read(3)?; - match id { - 0 => { // ID_SCE - let _tag = br.read(4)?; - self.set_pair(cur_pair, cur_ch, false)?; - self.pairs[cur_pair].decode_ga_sce(br, &self.codebooks, self.m4ainfo.otype)?; - cur_pair += 1; - cur_ch += 1; - }, - 1 => { // ID_CPE - let _tag = br.read(4)?; - self.set_pair(cur_pair, cur_ch, true)?; - self.pairs[cur_pair].decode_ga_cpe(br, &self.codebooks, self.m4ainfo.otype)?; - cur_pair += 1; - cur_ch += 2; - }, - 2 => { // ID_CCE - unimplemented!("coupling channel element"); - }, - 3 => { // ID_LFE - let _tag = br.read(4)?; - self.set_pair(cur_pair, cur_ch, false)?; - self.pairs[cur_pair].decode_ga_sce(br, &self.codebooks, self.m4ainfo.otype)?; - cur_pair += 1; - cur_ch += 1; - }, - 4 => { // ID_DSE - let _id = br.read(4)?; - let align = br.read_bool()?; - let mut count = br.read(8)? as u32; - if count == 255 { count += br.read(8)? as u32; } - if align { br.align(); } - br.skip(count * 8)?; // no SBR payload or such - }, - 5 => { // ID_PCE - unimplemented!("program config"); - }, - 6 => { // ID_FIL - let mut count = br.read(4)? as usize; - if count == 15 { - count += br.read(8)? as usize; - count -= 1; - } - for _ in 0..count { - // ext payload - br.skip(8)?; - } - }, - 7 => { // ID_TERM - break; - }, - _ => { unreachable!(); }, - }; - } - let srate_idx = GASubbandInfo::find_idx(self.m4ainfo.srate); - for pair in 0..cur_pair { - self.pairs[pair].synth_audio(&mut self.dsp, abuf, srate_idx); - } - Ok(()) - } -} - -impl NADecoder for AACDecoder { - fn init(&mut self, info: Rc<NACodecInfo>) -> DecoderResult<()> { - if let NACodecTypeInfo::Audio(_) = info.get_properties() { - let edata = info.get_extradata().unwrap(); - validate!(edata.len() >= 2); - -//print!("edata:"); for s in edata.iter() { print!(" {:02X}", *s);}println!(""); - self.m4ainfo.read(&edata)?; - - //println!("{}", self.m4ainfo); - if (self.m4ainfo.otype != M4AType::LC) || (self.m4ainfo.channels > 2) || (self.m4ainfo.samples != 1024) { - return Err(DecoderError::NotImplemented); - } - self.sbinfo = GASubbandInfo::find(self.m4ainfo.srate); - - let ainfo = NAAudioInfo::new(self.m4ainfo.srate, self.m4ainfo.channels as u8, - SND_F32P_FORMAT, self.m4ainfo.samples); - self.info = info.replace_info(NACodecTypeInfo::Audio(ainfo)); - - if self.m4ainfo.channels >= DEFAULT_CHANNEL_MAP.len() { - return Err(DecoderError::NotImplemented); - } - let chmap_str = DEFAULT_CHANNEL_MAP[self.m4ainfo.channels]; - if chmap_str.len() == 0 { return Err(DecoderError::NotImplemented); } - self.chmap = NAChannelMap::from_str(chmap_str).unwrap(); - - Ok(()) - } else { - Err(DecoderError::InvalidData) - } - } - fn decode(&mut self, pkt: &NAPacket) -> DecoderResult<NAFrameRef> { - let info = pkt.get_stream().get_info(); - validate!(info.get_properties().is_audio()); - let pktbuf = pkt.get_buffer(); - - let ainfo = self.info.get_properties().get_audio_info().unwrap(); - let mut abuf = alloc_audio_buffer(ainfo, self.m4ainfo.samples, self.chmap.clone())?; - - let mut br = BitReader::new(&pktbuf, pktbuf.len(), BitReaderMode::BE); - match self.m4ainfo.otype { - M4AType::LC => { - self.decode_ga(&mut br, &mut abuf)?; - }, - _ => { unimplemented!(""); } - } - - let mut frm = NAFrame::new_from_pkt(pkt, self.info.replace_info(NACodecTypeInfo::Audio(ainfo)), abuf); - frm.set_keyframe(true); - Ok(Rc::new(RefCell::new(frm))) - } -} - -pub fn get_decoder() -> Box<NADecoder> { - Box::new(AACDecoder::new()) -} - -#[cfg(test)] -mod test { - use crate::test::dec_video::*; - #[test] - fn test_aac() { -// let file = "assets/RV/rv40_weighted_mc.rmvb"; - let file = "assets/RV/rv40_weighted_mc_2.rmvb"; - test_decode_audio("realmedia", file, Some(12000), "aac"); - } -} - -const AAC_SCF_CODEBOOK_BITS: &[u8] = &[ - 18, 18, 18, 18, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 18, 19, 18, 17, 17, 16, 17, 16, 16, 16, 16, 15, 15, - 14, 14, 14, 14, 14, 14, 13, 13, 12, 12, 12, 11, 12, 11, 10, 10, - 10, 9, 9, 8, 8, 8, 7, 6, 6, 5, 4, 3, 1, 4, 4, 5, - 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 10, 11, 11, 11, 11, 12, - 12, 13, 13, 13, 14, 14, 16, 15, 16, 15, 18, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, 19 -]; - -const AAC_SCF_CODEBOOK_CODES: &[u32] = &[ - 0x3FFE8, 0x3FFE6, 0x3FFE7, 0x3FFE5, 0x7FFF5, 0x7FFF1, 0x7FFED, 0x7FFF6, - 0x7FFEE, 0x7FFEF, 0x7FFF0, 0x7FFFC, 0x7FFFD, 0x7FFFF, 0x7FFFE, 0x7FFF7, - 0x7FFF8, 0x7FFFB, 0x7FFF9, 0x3FFE4, 0x7FFFA, 0x3FFE3, 0x1FFEF, 0x1FFF0, - 0x0FFF5, 0x1FFEE, 0x0FFF2, 0x0FFF3, 0x0FFF4, 0x0FFF1, 0x07FF6, 0x07FF7, - 0x03FF9, 0x03FF5, 0x03FF7, 0x03FF3, 0x03FF6, 0x03FF2, 0x01FF7, 0x01FF5, - 0x00FF9, 0x00FF7, 0x00FF6, 0x007F9, 0x00FF4, 0x007F8, 0x003F9, 0x003F7, - 0x003F5, 0x001F8, 0x001F7, 0x000FA, 0x000F8, 0x000F6, 0x00079, 0x0003A, - 0x00038, 0x0001A, 0x0000B, 0x00004, 0x00000, 0x0000A, 0x0000C, 0x0001B, - 0x00039, 0x0003B, 0x00078, 0x0007A, 0x000F7, 0x000F9, 0x001F6, 0x001F9, - 0x003F4, 0x003F6, 0x003F8, 0x007F5, 0x007F4, 0x007F6, 0x007F7, 0x00FF5, - 0x00FF8, 0x01FF4, 0x01FF6, 0x01FF8, 0x03FF8, 0x03FF4, 0x0FFF0, 0x07FF4, - 0x0FFF6, 0x07FF5, 0x3FFE2, 0x7FFD9, 0x7FFDA, 0x7FFDB, 0x7FFDC, 0x7FFDD, - 0x7FFDE, 0x7FFD8, 0x7FFD2, 0x7FFD3, 0x7FFD4, 0x7FFD5, 0x7FFD6, 0x7FFF2, - 0x7FFDF, 0x7FFE7, 0x7FFE8, 0x7FFE9, 0x7FFEA, 0x7FFEB, 0x7FFE6, 0x7FFE0, - 0x7FFE1, 0x7FFE2, 0x7FFE3, 0x7FFE4, 0x7FFE5, 0x7FFD7, 0x7FFEC, 0x7FFF4, - 0x7FFF3 -]; - -const AAC_SPEC_CB1_BITS: &[u8] = &[ - 11, 9, 11, 10, 7, 10, 11, 9, 11, 10, 7, 10, 7, 5, 7, 9, - 7, 10, 11, 9, 11, 9, 7, 9, 11, 9, 11, 9, 7, 9, 7, 5, - 7, 9, 7, 9, 7, 5, 7, 5, 1, 5, 7, 5, 7, 9, 7, 9, - 7, 5, 7, 9, 7, 9, 11, 9, 11, 9, 7, 9, 11, 9, 11, 10, - 7, 9, 7, 5, 7, 9, 7, 10, 11, 9, 11, 10, 7, 9, 11, 9, - 11 -]; -const AAC_SPEC_CB1_CODES: &[u16] = &[ - 0x7f8, 0x1f1, 0x7fd, 0x3f5, 0x068, 0x3f0, 0x7f7, 0x1ec, - 0x7f5, 0x3f1, 0x072, 0x3f4, 0x074, 0x011, 0x076, 0x1eb, - 0x06c, 0x3f6, 0x7fc, 0x1e1, 0x7f1, 0x1f0, 0x061, 0x1f6, - 0x7f2, 0x1ea, 0x7fb, 0x1f2, 0x069, 0x1ed, 0x077, 0x017, - 0x06f, 0x1e6, 0x064, 0x1e5, 0x067, 0x015, 0x062, 0x012, - 0x000, 0x014, 0x065, 0x016, 0x06d, 0x1e9, 0x063, 0x1e4, - 0x06b, 0x013, 0x071, 0x1e3, 0x070, 0x1f3, 0x7fe, 0x1e7, - 0x7f3, 0x1ef, 0x060, 0x1ee, 0x7f0, 0x1e2, 0x7fa, 0x3f3, - 0x06a, 0x1e8, 0x075, 0x010, 0x073, 0x1f4, 0x06e, 0x3f7, - 0x7f6, 0x1e0, 0x7f9, 0x3f2, 0x066, 0x1f5, 0x7ff, 0x1f7, - 0x7f4 -]; -const AAC_SPEC_CB2_BITS: &[u8] = &[ - 9, 7, 9, 8, 6, 8, 9, 8, 9, 8, 6, 7, 6, 5, 6, 7, - 6, 8, 9, 7, 8, 8, 6, 8, 9, 7, 9, 8, 6, 7, 6, 5, - 6, 7, 6, 8, 6, 5, 6, 5, 3, 5, 6, 5, 6, 8, 6, 7, - 6, 5, 6, 8, 6, 8, 9, 7, 9, 8, 6, 8, 8, 7, 9, 8, - 6, 7, 6, 4, 6, 8, 6, 7, 9, 7, 9, 7, 6, 8, 9, 7, - 9 -]; -const AAC_SPEC_CB2_CODES: &[u16] = &[ - 0x1f3, 0x06f, 0x1fd, 0x0eb, 0x023, 0x0ea, 0x1f7, 0x0e8, - 0x1fa, 0x0f2, 0x02d, 0x070, 0x020, 0x006, 0x02b, 0x06e, - 0x028, 0x0e9, 0x1f9, 0x066, 0x0f8, 0x0e7, 0x01b, 0x0f1, - 0x1f4, 0x06b, 0x1f5, 0x0ec, 0x02a, 0x06c, 0x02c, 0x00a, - 0x027, 0x067, 0x01a, 0x0f5, 0x024, 0x008, 0x01f, 0x009, - 0x000, 0x007, 0x01d, 0x00b, 0x030, 0x0ef, 0x01c, 0x064, - 0x01e, 0x00c, 0x029, 0x0f3, 0x02f, 0x0f0, 0x1fc, 0x071, - 0x1f2, 0x0f4, 0x021, 0x0e6, 0x0f7, 0x068, 0x1f8, 0x0ee, - 0x022, 0x065, 0x031, 0x002, 0x026, 0x0ed, 0x025, 0x06a, - 0x1fb, 0x072, 0x1fe, 0x069, 0x02e, 0x0f6, 0x1ff, 0x06d, - 0x1f6 -]; -const AAC_SPEC_CB3_BITS: &[u8] = &[ - 1, 4, 8, 4, 5, 8, 9, 9, 10, 4, 6, 9, 6, 6, 9, 9, - 9, 10, 9, 10, 13, 9, 9, 11, 11, 10, 12, 4, 6, 10, 6, 7, - 10, 10, 10, 12, 5, 7, 11, 6, 7, 10, 9, 9, 11, 9, 10, 13, - 8, 9, 12, 10, 11, 12, 8, 10, 15, 9, 11, 15, 13, 14, 16, 8, - 10, 14, 9, 10, 14, 12, 12, 15, 11, 12, 16, 10, 11, 15, 12, 12, - 15 -]; -const AAC_SPEC_CB3_CODES: &[u16] = &[ - 0x0000, 0x0009, 0x00ef, 0x000b, 0x0019, 0x00f0, 0x01eb, 0x01e6, - 0x03f2, 0x000a, 0x0035, 0x01ef, 0x0034, 0x0037, 0x01e9, 0x01ed, - 0x01e7, 0x03f3, 0x01ee, 0x03ed, 0x1ffa, 0x01ec, 0x01f2, 0x07f9, - 0x07f8, 0x03f8, 0x0ff8, 0x0008, 0x0038, 0x03f6, 0x0036, 0x0075, - 0x03f1, 0x03eb, 0x03ec, 0x0ff4, 0x0018, 0x0076, 0x07f4, 0x0039, - 0x0074, 0x03ef, 0x01f3, 0x01f4, 0x07f6, 0x01e8, 0x03ea, 0x1ffc, - 0x00f2, 0x01f1, 0x0ffb, 0x03f5, 0x07f3, 0x0ffc, 0x00ee, 0x03f7, - 0x7ffe, 0x01f0, 0x07f5, 0x7ffd, 0x1ffb, 0x3ffa, 0xffff, 0x00f1, - 0x03f0, 0x3ffc, 0x01ea, 0x03ee, 0x3ffb, 0x0ff6, 0x0ffa, 0x7ffc, - 0x07f2, 0x0ff5, 0xfffe, 0x03f4, 0x07f7, 0x7ffb, 0x0ff7, 0x0ff9, - 0x7ffa -]; -const AAC_SPEC_CB4_BITS: &[u8] = &[ - 4, 5, 8, 5, 4, 8, 9, 8, 11, 5, 5, 8, 5, 4, 8, 8, - 7, 10, 9, 8, 11, 8, 8, 10, 11, 10, 11, 4, 5, 8, 4, 4, - 8, 8, 8, 10, 4, 4, 8, 4, 4, 7, 8, 7, 9, 8, 8, 10, - 7, 7, 9, 10, 9, 10, 8, 8, 11, 8, 7, 10, 11, 10, 12, 8, - 7, 10, 7, 7, 9, 10, 9, 11, 11, 10, 12, 10, 9, 11, 11, 10, - 11 -]; -const AAC_SPEC_CB4_CODES: &[u16] = &[ - 0x007, 0x016, 0x0f6, 0x018, 0x008, 0x0ef, 0x1ef, 0x0f3, - 0x7f8, 0x019, 0x017, 0x0ed, 0x015, 0x001, 0x0e2, 0x0f0, - 0x070, 0x3f0, 0x1ee, 0x0f1, 0x7fa, 0x0ee, 0x0e4, 0x3f2, - 0x7f6, 0x3ef, 0x7fd, 0x005, 0x014, 0x0f2, 0x009, 0x004, - 0x0e5, 0x0f4, 0x0e8, 0x3f4, 0x006, 0x002, 0x0e7, 0x003, - 0x000, 0x06b, 0x0e3, 0x069, 0x1f3, 0x0eb, 0x0e6, 0x3f6, - 0x06e, 0x06a, 0x1f4, 0x3ec, 0x1f0, 0x3f9, 0x0f5, 0x0ec, - 0x7fb, 0x0ea, 0x06f, 0x3f7, 0x7f9, 0x3f3, 0xfff, 0x0e9, - 0x06d, 0x3f8, 0x06c, 0x068, 0x1f5, 0x3ee, 0x1f2, 0x7f4, - 0x7f7, 0x3f1, 0xffe, 0x3ed, 0x1f1, 0x7f5, 0x7fe, 0x3f5, - 0x7fc -]; -const AAC_SPEC_CB5_BITS: &[u8] = &[ - 13, 12, 11, 11, 10, 11, 11, 12, 13, 12, 11, 10, 9, 8, 9, 10, - 11, 12, 12, 10, 9, 8, 7, 8, 9, 10, 11, 11, 9, 8, 5, 4, - 5, 8, 9, 11, 10, 8, 7, 4, 1, 4, 7, 8, 11, 11, 9, 8, - 5, 4, 5, 8, 9, 11, 11, 10, 9, 8, 7, 8, 9, 10, 11, 12, - 11, 10, 9, 8, 9, 10, 11, 12, 13, 12, 12, 11, 10, 10, 11, 12, - 13 -]; -const AAC_SPEC_CB5_CODES: &[u16] = &[ - 0x1fff, 0x0ff7, 0x07f4, 0x07e8, 0x03f1, 0x07ee, 0x07f9, 0x0ff8, - 0x1ffd, 0x0ffd, 0x07f1, 0x03e8, 0x01e8, 0x00f0, 0x01ec, 0x03ee, - 0x07f2, 0x0ffa, 0x0ff4, 0x03ef, 0x01f2, 0x00e8, 0x0070, 0x00ec, - 0x01f0, 0x03ea, 0x07f3, 0x07eb, 0x01eb, 0x00ea, 0x001a, 0x0008, - 0x0019, 0x00ee, 0x01ef, 0x07ed, 0x03f0, 0x00f2, 0x0073, 0x000b, - 0x0000, 0x000a, 0x0071, 0x00f3, 0x07e9, 0x07ef, 0x01ee, 0x00ef, - 0x0018, 0x0009, 0x001b, 0x00eb, 0x01e9, 0x07ec, 0x07f6, 0x03eb, - 0x01f3, 0x00ed, 0x0072, 0x00e9, 0x01f1, 0x03ed, 0x07f7, 0x0ff6, - 0x07f0, 0x03e9, 0x01ed, 0x00f1, 0x01ea, 0x03ec, 0x07f8, 0x0ff9, - 0x1ffc, 0x0ffc, 0x0ff5, 0x07ea, 0x03f3, 0x03f2, 0x07f5, 0x0ffb, - 0x1ffe -]; -const AAC_SPEC_CB6_BITS: &[u8] = &[ - 11, 10, 9, 9, 9, 9, 9, 10, 11, 10, 9, 8, 7, 7, 7, 8, - 9, 10, 9, 8, 6, 6, 6, 6, 6, 8, 9, 9, 7, 6, 4, 4, - 4, 6, 7, 9, 9, 7, 6, 4, 4, 4, 6, 7, 9, 9, 7, 6, - 4, 4, 4, 6, 7, 9, 9, 8, 6, 6, 6, 6, 6, 8, 9, 10, - 9, 8, 7, 7, 7, 7, 8, 10, 11, 10, 9, 9, 9, 9, 9, 10, - 11 -]; -const AAC_SPEC_CB6_CODES: &[u16] = &[ - 0x7fe, 0x3fd, 0x1f1, 0x1eb, 0x1f4, 0x1ea, 0x1f0, 0x3fc, - 0x7fd, 0x3f6, 0x1e5, 0x0ea, 0x06c, 0x071, 0x068, 0x0f0, - 0x1e6, 0x3f7, 0x1f3, 0x0ef, 0x032, 0x027, 0x028, 0x026, - 0x031, 0x0eb, 0x1f7, 0x1e8, 0x06f, 0x02e, 0x008, 0x004, - 0x006, 0x029, 0x06b, 0x1ee, 0x1ef, 0x072, 0x02d, 0x002, - 0x000, 0x003, 0x02f, 0x073, 0x1fa, 0x1e7, 0x06e, 0x02b, - 0x007, 0x001, 0x005, 0x02c, 0x06d, 0x1ec, 0x1f9, 0x0ee, - 0x030, 0x024, 0x02a, 0x025, 0x033, 0x0ec, 0x1f2, 0x3f8, - 0x1e4, 0x0ed, 0x06a, 0x070, 0x069, 0x074, 0x0f1, 0x3fa, - 0x7ff, 0x3f9, 0x1f6, 0x1ed, 0x1f8, 0x1e9, 0x1f5, 0x3fb, - 0x7fc -]; -const AAC_SPEC_CB7_BITS: &[u8] = &[ - 1, 3, 6, 7, 8, 9, 10, 11, 3, 4, 6, 7, 8, 8, 9, 9, - 6, 6, 7, 8, 8, 9, 9, 10, 7, 7, 8, 8, 9, 9, 10, 10, - 8, 8, 9, 9, 10, 10, 10, 11, 9, 8, 9, 9, 10, 10, 11, 11, - 10, 9, 9, 10, 10, 11, 12, 12, 11, 10, 10, 10, 11, 11, 12, 12 -]; -const AAC_SPEC_CB7_CODES: &[u16] = &[ - 0x000, 0x005, 0x037, 0x074, 0x0f2, 0x1eb, 0x3ed, 0x7f7, - 0x004, 0x00c, 0x035, 0x071, 0x0ec, 0x0ee, 0x1ee, 0x1f5, - 0x036, 0x034, 0x072, 0x0ea, 0x0f1, 0x1e9, 0x1f3, 0x3f5, - 0x073, 0x070, 0x0eb, 0x0f0, 0x1f1, 0x1f0, 0x3ec, 0x3fa, - 0x0f3, 0x0ed, 0x1e8, 0x1ef, 0x3ef, 0x3f1, 0x3f9, 0x7fb, - 0x1ed, 0x0ef, 0x1ea, 0x1f2, 0x3f3, 0x3f8, 0x7f9, 0x7fc, - 0x3ee, 0x1ec, 0x1f4, 0x3f4, 0x3f7, 0x7f8, 0xffd, 0xffe, - 0x7f6, 0x3f0, 0x3f2, 0x3f6, 0x7fa, 0x7fd, 0xffc, 0xfff -]; -const AAC_SPEC_CB8_BITS: &[u8] = &[ - 5, 4, 5, 6, 7, 8, 9, 10, 4, 3, 4, 5, 6, 7, 7, 8, - 5, 4, 4, 5, 6, 7, 7, 8, 6, 5, 5, 6, 6, 7, 8, 8, - 7, 6, 6, 6, 7, 7, 8, 9, 8, 7, 6, 7, 7, 8, 8, 10, - 9, 7, 7, 8, 8, 8, 9, 9, 10, 8, 8, 8, 9, 9, 9, 10 -]; -const AAC_SPEC_CB8_CODES: &[u16] = &[ - 0x00e, 0x005, 0x010, 0x030, 0x06f, 0x0f1, 0x1fa, 0x3fe, - 0x003, 0x000, 0x004, 0x012, 0x02c, 0x06a, 0x075, 0x0f8, - 0x00f, 0x002, 0x006, 0x014, 0x02e, 0x069, 0x072, 0x0f5, - 0x02f, 0x011, 0x013, 0x02a, 0x032, 0x06c, 0x0ec, 0x0fa, - 0x071, 0x02b, 0x02d, 0x031, 0x06d, 0x070, 0x0f2, 0x1f9, - 0x0ef, 0x068, 0x033, 0x06b, 0x06e, 0x0ee, 0x0f9, 0x3fc, - 0x1f8, 0x074, 0x073, 0x0ed, 0x0f0, 0x0f6, 0x1f6, 0x1fd, - 0x3fd, 0x0f3, 0x0f4, 0x0f7, 0x1f7, 0x1fb, 0x1fc, 0x3ff -]; -const AAC_SPEC_CB9_BITS: &[u8] = &[ - 1, 3, 6, 8, 9, 10, 10, 11, 11, 12, 12, 13, 13, 3, 4, 6, - 7, 8, 8, 9, 10, 10, 10, 11, 12, 12, 6, 6, 7, 8, 8, 9, - 10, 10, 10, 11, 12, 12, 12, 8, 7, 8, 9, 9, 10, 10, 11, 11, - 11, 12, 12, 13, 9, 8, 9, 9, 10, 10, 11, 11, 11, 12, 12, 12, - 13, 10, 9, 9, 10, 11, 11, 11, 12, 11, 12, 12, 13, 13, 11, 9, - 10, 11, 11, 11, 12, 12, 12, 12, 13, 13, 13, 11, 10, 10, 11, 11, - 12, 12, 13, 13, 13, 13, 13, 13, 11, 10, 10, 11, 11, 11, 12, 12, - 13, 13, 14, 13, 14, 11, 10, 11, 11, 12, 12, 12, 12, 13, 13, 14, - 14, 14, 12, 11, 11, 12, 12, 12, 13, 13, 13, 14, 14, 14, 15, 12, - 11, 12, 12, 12, 13, 13, 13, 13, 14, 14, 15, 15, 13, 12, 12, 12, - 13, 13, 13, 13, 14, 14, 14, 14, 15 -]; -const AAC_SPEC_CB9_CODES: &[u16] = &[ - 0x0000, 0x0005, 0x0037, 0x00e7, 0x01de, 0x03ce, 0x03d9, 0x07c8, - 0x07cd, 0x0fc8, 0x0fdd, 0x1fe4, 0x1fec, 0x0004, 0x000c, 0x0035, - 0x0072, 0x00ea, 0x00ed, 0x01e2, 0x03d1, 0x03d3, 0x03e0, 0x07d8, - 0x0fcf, 0x0fd5, 0x0036, 0x0034, 0x0071, 0x00e8, 0x00ec, 0x01e1, - 0x03cf, 0x03dd, 0x03db, 0x07d0, 0x0fc7, 0x0fd4, 0x0fe4, 0x00e6, - 0x0070, 0x00e9, 0x01dd, 0x01e3, 0x03d2, 0x03dc, 0x07cc, 0x07ca, - 0x07de, 0x0fd8, 0x0fea, 0x1fdb, 0x01df, 0x00eb, 0x01dc, 0x01e6, - 0x03d5, 0x03de, 0x07cb, 0x07dd, 0x07dc, 0x0fcd, 0x0fe2, 0x0fe7, - 0x1fe1, 0x03d0, 0x01e0, 0x01e4, 0x03d6, 0x07c5, 0x07d1, 0x07db, - 0x0fd2, 0x07e0, 0x0fd9, 0x0feb, 0x1fe3, 0x1fe9, 0x07c4, 0x01e5, - 0x03d7, 0x07c6, 0x07cf, 0x07da, 0x0fcb, 0x0fda, 0x0fe3, 0x0fe9, - 0x1fe6, 0x1ff3, 0x1ff7, 0x07d3, 0x03d8, 0x03e1, 0x07d4, 0x07d9, - 0x0fd3, 0x0fde, 0x1fdd, 0x1fd9, 0x1fe2, 0x1fea, 0x1ff1, 0x1ff6, - 0x07d2, 0x03d4, 0x03da, 0x07c7, 0x07d7, 0x07e2, 0x0fce, 0x0fdb, - 0x1fd8, 0x1fee, 0x3ff0, 0x1ff4, 0x3ff2, 0x07e1, 0x03df, 0x07c9, - 0x07d6, 0x0fca, 0x0fd0, 0x0fe5, 0x0fe6, 0x1feb, 0x1fef, 0x3ff3, - 0x3ff4, 0x3ff5, 0x0fe0, 0x07ce, 0x07d5, 0x0fc6, 0x0fd1, 0x0fe1, - 0x1fe0, 0x1fe8, 0x1ff0, 0x3ff1, 0x3ff8, 0x3ff6, 0x7ffc, 0x0fe8, - 0x07df, 0x0fc9, 0x0fd7, 0x0fdc, 0x1fdc, 0x1fdf, 0x1fed, 0x1ff5, - 0x3ff9, 0x3ffb, 0x7ffd, 0x7ffe, 0x1fe7, 0x0fcc, 0x0fd6, 0x0fdf, - 0x1fde, 0x1fda, 0x1fe5, 0x1ff2, 0x3ffa, 0x3ff7, 0x3ffc, 0x3ffd, - 0x7fff -]; -const AAC_SPEC_CB10_BITS: &[u8] = &[ - 6, 5, 6, 6, 7, 8, 9, 10, 10, 10, 11, 11, 12, 5, 4, 4, - 5, 6, 7, 7, 8, 8, 9, 10, 10, 11, 6, 4, 5, 5, 6, 6, - 7, 8, 8, 9, 9, 10, 10, 6, 5, 5, 5, 6, 7, 7, 8, 8, - 9, 9, 10, 10, 7, 6, 6, 6, 6, 7, 7, 8, 8, 9, 9, 10, - 10, 8, 7, 6, 7, 7, 7, 8, 8, 8, 9, 10, 10, 11, 9, 7, - 7, 7, 7, 8, 8, 9, 9, 9, 10, 10, 11, 9, 8, 8, 8, 8, - 8, 9, 9, 9, 10, 10, 11, 11, 9, 8, 8, 8, 8, 8, 9, 9, - 10, 10, 10, 11, 11, 10, 9, 9, 9, 9, 9, 9, 10, 10, 10, 11, - 11, 12, 10, 9, 9, 9, 9, 10, 10, 10, 10, 11, 11, 11, 12, 11, - 10, 9, 10, 10, 10, 10, 10, 11, 11, 11, 11, 12, 11, 10, 10, 10, - 10, 10, 10, 11, 11, 12, 12, 12, 12 -]; -const AAC_SPEC_CB10_CODES: &[u16] = &[ - 0x022, 0x008, 0x01d, 0x026, 0x05f, 0x0d3, 0x1cf, 0x3d0, - 0x3d7, 0x3ed, 0x7f0, 0x7f6, 0xffd, 0x007, 0x000, 0x001, - 0x009, 0x020, 0x054, 0x060, 0x0d5, 0x0dc, 0x1d4, 0x3cd, - 0x3de, 0x7e7, 0x01c, 0x002, 0x006, 0x00c, 0x01e, 0x028, - 0x05b, 0x0cd, 0x0d9, 0x1ce, 0x1dc, 0x3d9, 0x3f1, 0x025, - 0x00b, 0x00a, 0x00d, 0x024, 0x057, 0x061, 0x0cc, 0x0dd, - 0x1cc, 0x1de, 0x3d3, 0x3e7, 0x05d, 0x021, 0x01f, 0x023, - 0x027, 0x059, 0x064, 0x0d8, 0x0df, 0x1d2, 0x1e2, 0x3dd, - 0x3ee, 0x0d1, 0x055, 0x029, 0x056, 0x058, 0x062, 0x0ce, - 0x0e0, 0x0e2, 0x1da, 0x3d4, 0x3e3, 0x7eb, 0x1c9, 0x05e, - 0x05a, 0x05c, 0x063, 0x0ca, 0x0da, 0x1c7, 0x1ca, 0x1e0, - 0x3db, 0x3e8, 0x7ec, 0x1e3, 0x0d2, 0x0cb, 0x0d0, 0x0d7, - 0x0db, 0x1c6, 0x1d5, 0x1d8, 0x3ca, 0x3da, 0x7ea, 0x7f1, - 0x1e1, 0x0d4, 0x0cf, 0x0d6, 0x0de, 0x0e1, 0x1d0, 0x1d6, - 0x3d1, 0x3d5, 0x3f2, 0x7ee, 0x7fb, 0x3e9, 0x1cd, 0x1c8, - 0x1cb, 0x1d1, 0x1d7, 0x1df, 0x3cf, 0x3e0, 0x3ef, 0x7e6, - 0x7f8, 0xffa, 0x3eb, 0x1dd, 0x1d3, 0x1d9, 0x1db, 0x3d2, - 0x3cc, 0x3dc, 0x3ea, 0x7ed, 0x7f3, 0x7f9, 0xff9, 0x7f2, - 0x3ce, 0x1e4, 0x3cb, 0x3d8, 0x3d6, 0x3e2, 0x3e5, 0x7e8, - 0x7f4, 0x7f5, 0x7f7, 0xffb, 0x7fa, 0x3ec, 0x3df, 0x3e1, - 0x3e4, 0x3e6, 0x3f0, 0x7e9, 0x7ef, 0xff8, 0xffe, 0xffc, - 0xfff -]; -const AAC_SPEC_CB11_BITS: &[u8] = &[ - 4, 5, 6, 7, 8, 8, 9, 10, 10, 10, 11, 11, 12, 11, 12, 12, - 10, 5, 4, 5, 6, 7, 7, 8, 8, 9, 9, 9, 10, 10, 10, 10, - 11, 8, 6, 5, 5, 6, 7, 7, 8, 8, 8, 9, 9, 9, 10, 10, - 10, 10, 8, 7, 6, 6, 6, 7, 7, 8, 8, 8, 9, 9, 9, 10, - 10, 10, 10, 8, 8, 7, 7, 7, 7, 8, 8, 8, 8, 9, 9, 9, - 10, 10, 10, 10, 8, 8, 7, 7, 7, 7, 8, 8, 8, 9, 9, 9, - 9, 10, 10, 10, 10, 8, 9, 8, 8, 8, 8, 8, 8, 8, 9, 9, - 9, 10, 10, 10, 10, 10, 8, 9, 8, 8, 8, 8, 8, 8, 9, 9, - 9, 10, 10, 10, 10, 10, 10, 8, 10, 9, 8, 8, 9, 9, 9, 9, - 9, 10, 10, 10, 10, 10, 10, 11, 8, 10, 9, 9, 9, 9, 9, 9, - 9, 10, 10, 10, 10, 10, 10, 11, 11, 8, 11, 9, 9, 9, 9, 9, - 9, 10, 10, 10, 10, 10, 11, 10, 11, 11, 8, 11, 10, 9, 9, 10, - 9, 10, 10, 10, 10, 10, 11, 11, 11, 11, 11, 8, 11, 10, 10, 10, - 10, 10, 10, 10, 10, 10, 10, 11, 11, 11, 11, 11, 9, 11, 10, 9, - 9, 10, 10, 10, 10, 10, 10, 11, 11, 11, 11, 11, 11, 9, 11, 10, - 10, 10, 10, 10, 10, 10, 10, 10, 11, 11, 11, 11, 11, 11, 9, 12, - 10, 10, 10, 10, 10, 10, 10, 11, 11, 11, 11, 11, 11, 12, 12, 9, - 9, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 9, - 5 -]; -const AAC_SPEC_CB11_CODES: &[u16] = &[ - 0x000, 0x006, 0x019, 0x03d, 0x09c, 0x0c6, 0x1a7, 0x390, - 0x3c2, 0x3df, 0x7e6, 0x7f3, 0xffb, 0x7ec, 0xffa, 0xffe, - 0x38e, 0x005, 0x001, 0x008, 0x014, 0x037, 0x042, 0x092, - 0x0af, 0x191, 0x1a5, 0x1b5, 0x39e, 0x3c0, 0x3a2, 0x3cd, - 0x7d6, 0x0ae, 0x017, 0x007, 0x009, 0x018, 0x039, 0x040, - 0x08e, 0x0a3, 0x0b8, 0x199, 0x1ac, 0x1c1, 0x3b1, 0x396, - 0x3be, 0x3ca, 0x09d, 0x03c, 0x015, 0x016, 0x01a, 0x03b, - 0x044, 0x091, 0x0a5, 0x0be, 0x196, 0x1ae, 0x1b9, 0x3a1, - 0x391, 0x3a5, 0x3d5, 0x094, 0x09a, 0x036, 0x038, 0x03a, - 0x041, 0x08c, 0x09b, 0x0b0, 0x0c3, 0x19e, 0x1ab, 0x1bc, - 0x39f, 0x38f, 0x3a9, 0x3cf, 0x093, 0x0bf, 0x03e, 0x03f, - 0x043, 0x045, 0x09e, 0x0a7, 0x0b9, 0x194, 0x1a2, 0x1ba, - 0x1c3, 0x3a6, 0x3a7, 0x3bb, 0x3d4, 0x09f, 0x1a0, 0x08f, - 0x08d, 0x090, 0x098, 0x0a6, 0x0b6, 0x0c4, 0x19f, 0x1af, - 0x1bf, 0x399, 0x3bf, 0x3b4, 0x3c9, 0x3e7, 0x0a8, 0x1b6, - 0x0ab, 0x0a4, 0x0aa, 0x0b2, 0x0c2, 0x0c5, 0x198, 0x1a4, - 0x1b8, 0x38c, 0x3a4, 0x3c4, 0x3c6, 0x3dd, 0x3e8, 0x0ad, - 0x3af, 0x192, 0x0bd, 0x0bc, 0x18e, 0x197, 0x19a, 0x1a3, - 0x1b1, 0x38d, 0x398, 0x3b7, 0x3d3, 0x3d1, 0x3db, 0x7dd, - 0x0b4, 0x3de, 0x1a9, 0x19b, 0x19c, 0x1a1, 0x1aa, 0x1ad, - 0x1b3, 0x38b, 0x3b2, 0x3b8, 0x3ce, 0x3e1, 0x3e0, 0x7d2, - 0x7e5, 0x0b7, 0x7e3, 0x1bb, 0x1a8, 0x1a6, 0x1b0, 0x1b2, - 0x1b7, 0x39b, 0x39a, 0x3ba, 0x3b5, 0x3d6, 0x7d7, 0x3e4, - 0x7d8, 0x7ea, 0x0ba, 0x7e8, 0x3a0, 0x1bd, 0x1b4, 0x38a, - 0x1c4, 0x392, 0x3aa, 0x3b0, 0x3bc, 0x3d7, 0x7d4, 0x7dc, - 0x7db, 0x7d5, 0x7f0, 0x0c1, 0x7fb, 0x3c8, 0x3a3, 0x395, - 0x39d, 0x3ac, 0x3ae, 0x3c5, 0x3d8, 0x3e2, 0x3e6, 0x7e4, - 0x7e7, 0x7e0, 0x7e9, 0x7f7, 0x190, 0x7f2, 0x393, 0x1be, - 0x1c0, 0x394, 0x397, 0x3ad, 0x3c3, 0x3c1, 0x3d2, 0x7da, - 0x7d9, 0x7df, 0x7eb, 0x7f4, 0x7fa, 0x195, 0x7f8, 0x3bd, - 0x39c, 0x3ab, 0x3a8, 0x3b3, 0x3b9, 0x3d0, 0x3e3, 0x3e5, - 0x7e2, 0x7de, 0x7ed, 0x7f1, 0x7f9, 0x7fc, 0x193, 0xffd, - 0x3dc, 0x3b6, 0x3c7, 0x3cc, 0x3cb, 0x3d9, 0x3da, 0x7d3, - 0x7e1, 0x7ee, 0x7ef, 0x7f5, 0x7f6, 0xffc, 0xfff, 0x19d, - 0x1c2, 0x0b5, 0x0a1, 0x096, 0x097, 0x095, 0x099, 0x0a0, - 0x0a2, 0x0ac, 0x0a9, 0x0b1, 0x0b3, 0x0bb, 0x0c0, 0x18f, - 0x004 -]; - -const AAC_SPEC_BITS: [&[u8]; 11] = [ - AAC_SPEC_CB1_BITS, AAC_SPEC_CB2_BITS, AAC_SPEC_CB3_BITS, AAC_SPEC_CB4_BITS, - AAC_SPEC_CB5_BITS, AAC_SPEC_CB6_BITS, AAC_SPEC_CB7_BITS, AAC_SPEC_CB8_BITS, - AAC_SPEC_CB9_BITS, AAC_SPEC_CB10_BITS, AAC_SPEC_CB11_BITS -]; -const AAC_SPEC_CODES: [&[u16]; 11] = [ - AAC_SPEC_CB1_CODES, AAC_SPEC_CB2_CODES, AAC_SPEC_CB3_CODES, AAC_SPEC_CB4_CODES, - AAC_SPEC_CB5_CODES, AAC_SPEC_CB6_CODES, AAC_SPEC_CB7_CODES, AAC_SPEC_CB8_CODES, - AAC_SPEC_CB9_CODES, AAC_SPEC_CB10_CODES, AAC_SPEC_CB11_CODES -]; -const AAC_UNSIGNED_CODEBOOK: [bool; 11] = [ - false, false, true, true, false, false, true, true, true, true, true -]; -const AAC_CODEBOOK_MODULO: [u16; 7] = [ - 9, 9, 8, 8, 13, 13, 17 -]; - -const AAC_QUADS: [[i8; 4]; 81] = [ - [ 0, 0, 0, 0 ], [ 0, 0, 0, 1 ], [ 0, 0, 0, 2 ], - [ 0, 0, 1, 0 ], [ 0, 0, 1, 1 ], [ 0, 0, 1, 2 ], - [ 0, 0, 2, 0 ], [ 0, 0, 2, 1 ], [ 0, 0, 2, 2 ], - [ 0, 1, 0, 0 ], [ 0, 1, 0, 1 ], [ 0, 1, 0, 2 ], - [ 0, 1, 1, 0 ], [ 0, 1, 1, 1 ], [ 0, 1, 1, 2 ], - [ 0, 1, 2, 0 ], [ 0, 1, 2, 1 ], [ 0, 1, 2, 2 ], - [ 0, 2, 0, 0 ], [ 0, 2, 0, 1 ], [ 0, 2, 0, 2 ], - [ 0, 2, 1, 0 ], [ 0, 2, 1, 1 ], [ 0, 2, 1, 2 ], - [ 0, 2, 2, 0 ], [ 0, 2, 2, 1 ], [ 0, 2, 2, 2 ], - [ 1, 0, 0, 0 ], [ 1, 0, 0, 1 ], [ 1, 0, 0, 2 ], - [ 1, 0, 1, 0 ], [ 1, 0, 1, 1 ], [ 1, 0, 1, 2 ], - [ 1, 0, 2, 0 ], [ 1, 0, 2, 1 ], [ 1, 0, 2, 2 ], - [ 1, 1, 0, 0 ], [ 1, 1, 0, 1 ], [ 1, 1, 0, 2 ], - [ 1, 1, 1, 0 ], [ 1, 1, 1, 1 ], [ 1, 1, 1, 2 ], - [ 1, 1, 2, 0 ], [ 1, 1, 2, 1 ], [ 1, 1, 2, 2 ], - [ 1, 2, 0, 0 ], [ 1, 2, 0, 1 ], [ 1, 2, 0, 2 ], - [ 1, 2, 1, 0 ], [ 1, 2, 1, 1 ], [ 1, 2, 1, 2 ], - [ 1, 2, 2, 0 ], [ 1, 2, 2, 1 ], [ 1, 2, 2, 2 ], - [ 2, 0, 0, 0 ], [ 2, 0, 0, 1 ], [ 2, 0, 0, 2 ], - [ 2, 0, 1, 0 ], [ 2, 0, 1, 1 ], [ 2, 0, 1, 2 ], - [ 2, 0, 2, 0 ], [ 2, 0, 2, 1 ], [ 2, 0, 2, 2 ], - [ 2, 1, 0, 0 ], [ 2, 1, 0, 1 ], [ 2, 1, 0, 2 ], - [ 2, 1, 1, 0 ], [ 2, 1, 1, 1 ], [ 2, 1, 1, 2 ], - [ 2, 1, 2, 0 ], [ 2, 1, 2, 1 ], [ 2, 1, 2, 2 ], - [ 2, 2, 0, 0 ], [ 2, 2, 0, 1 ], [ 2, 2, 0, 2 ], - [ 2, 2, 1, 0 ], [ 2, 2, 1, 1 ], [ 2, 2, 1, 2 ], - [ 2, 2, 2, 0 ], [ 2, 2, 2, 1 ], [ 2, 2, 2, 2 ], -]; - -const DEFAULT_CHANNEL_MAP: [&str; 9] = [ - "", - "C", - "L,R", - "C,L,R", - "C,L,R,Cs", - "C,L,R,Ls,Rs", - "C,L,R,Ls,Rs,LFE", - "", - "C,L,R,Ls,Rs,Lss,Rss,LFE", -]; - -const SWB_OFFSET_48K_LONG: [usize; 49+1] = [ - 0, 4, 8, 12, 16, 20, 24, 28, - 32, 36, 40, 48, 56, 64, 72, 80, - 88, 96, 108, 120, 132, 144, 160, 176, - 196, 216, 240, 264, 292, 320, 352, 384, - 416, 448, 480, 512, 544, 576, 608, 640, - 672, 704, 736, 768, 800, 832, 864, 896, - 928, 1024 -]; -const SWB_OFFSET_48K_SHORT: [usize; 14+1] = [ - 0, 4, 8, 12, 16, 20, 28, 36, 44, 56, 68, 80, 96, 112, 128 -]; -const SWB_OFFSET_32K_LONG: [usize; 51+1] = [ - 0, 4, 8, 12, 16, 20, 24, 28, - 32, 36, 40, 48, 56, 64, 72, 80, - 88, 96, 108, 120, 132, 144, 160, 176, - 196, 216, 240, 264, 292, 320, 352, 384, - 416, 448, 480, 512, 544, 576, 608, 640, - 672, 704, 736, 768, 800, 832, 864, 896, - 928, 960, 992, 1024 -]; -const SWB_OFFSET_8K_LONG: [usize; 40+1] = [ - 0, 12, 24, 36, 48, 60, 72, 84, - 96, 108, 120, 132, 144, 156, 172, 188, - 204, 220, 236, 252, 268, 288, 308, 328, - 348, 372, 396, 420, 448, 476, 508, 544, - 580, 620, 664, 712, 764, 820, 880, 944, - 1024 -]; -const SWB_OFFSET_8K_SHORT: [usize; 15+1] = [ - 0, 4, 8, 12, 16, 20, 24, 28, 36, 44, 52, 60, 72, 88, 108, 128 -]; -const SWB_OFFSET_16K_LONG: [usize; 43+1] = [ - 0, 8, 16, 24, 32, 40, 48, 56, - 64, 72, 80, 88, 100, 112, 124, 136, - 148, 160, 172, 184, 196, 212, 228, 244, - 260, 280, 300, 320, 344, 368, 396, 424, - 456, 492, 532, 572, 616, 664, 716, 772, - 832, 896, 960, 1024 -]; -const SWB_OFFSET_16K_SHORT: [usize; 15+1] = [ - 0, 4, 8, 12, 16, 20, 24, 28, 32, 40, 48, 60, 72, 88, 108, 128 -]; -const SWB_OFFSET_24K_LONG: [usize; 47+1] = [ - 0, 4, 8, 12, 16, 20, 24, 28, - 32, 36, 40, 44, 52, 60, 68, 76, - 84, 92, 100, 108, 116, 124, 136, 148, - 160, 172, 188, 204, 220, 240, 260, 284, - 308, 336, 364, 396, 432, 468, 508, 552, - 600, 652, 704, 768, 832, 896, 960, 1024 -]; -const SWB_OFFSET_24K_SHORT: [usize; 15+1] = [ - 0, 4, 8, 12, 16, 20, 24, 28, 36, 44, 52, 64, 76, 92, 108, 128 -]; -const SWB_OFFSET_64K_LONG: [usize; 47+1] = [ - 0, 4, 8, 12, 16, 20, 24, 28, - 32, 36, 40, 44, 48, 52, 56, 64, - 72, 80, 88, 100, 112, 124, 140, 156, - 172, 192, 216, 240, 268, 304, 344, 384, - 424, 464, 504, 544, 584, 624, 664, 704, - 744, 784, 824, 864, 904, 944, 984, 1024 -]; -const SWB_OFFSET_64K_SHORT: [usize; 12+1] = [ - 0, 4, 8, 12, 16, 20, 24, 32, 40, 48, 64, 92, 128 -]; -const SWB_OFFSET_96K_LONG: [usize; 41+1] = [ - 0, 4, 8, 12, 16, 20, 24, 28, - 32, 36, 40, 44, 48, 52, 56, 64, - 72, 80, 88, 96, 108, 120, 132, 144, - 156, 172, 188, 212, 240, 276, 320, 384, - 448, 512, 576, 640, 704, 768, 832, 896, - 960, 1024 -]; - -#[derive(Clone,Copy)] -struct GASubbandInfo { - min_srate: u32, - long_bands: &'static [usize], - short_bands: &'static [usize], -} - -impl GASubbandInfo { - fn find(srate: u32) -> GASubbandInfo { - for i in 0..AAC_SUBBAND_INFO.len() { - if srate >= AAC_SUBBAND_INFO[i].min_srate { - return AAC_SUBBAND_INFO[i]; - } - } - unreachable!("") - } - fn find_idx(srate: u32) -> usize { - for i in 0..AAC_SUBBAND_INFO.len() { - if srate >= AAC_SUBBAND_INFO[i].min_srate { - return i; - } - } - unreachable!("") - } -} - -const AAC_SUBBAND_INFO: [GASubbandInfo; 12] = [ - GASubbandInfo { min_srate: 92017, long_bands: &SWB_OFFSET_96K_LONG, short_bands: &SWB_OFFSET_64K_SHORT }, //96K - GASubbandInfo { min_srate: 75132, long_bands: &SWB_OFFSET_96K_LONG, short_bands: &SWB_OFFSET_64K_SHORT }, //88.2K - GASubbandInfo { min_srate: 55426, long_bands: &SWB_OFFSET_64K_LONG, short_bands: &SWB_OFFSET_64K_SHORT }, //64K - GASubbandInfo { min_srate: 46009, long_bands: &SWB_OFFSET_48K_LONG, short_bands: &SWB_OFFSET_48K_SHORT }, //48K - GASubbandInfo { min_srate: 37566, long_bands: &SWB_OFFSET_48K_LONG, short_bands: &SWB_OFFSET_48K_SHORT }, //44.1K - GASubbandInfo { min_srate: 27713, long_bands: &SWB_OFFSET_32K_LONG, short_bands: &SWB_OFFSET_48K_SHORT }, //32K - GASubbandInfo { min_srate: 23004, long_bands: &SWB_OFFSET_24K_LONG, short_bands: &SWB_OFFSET_24K_SHORT }, //24K - GASubbandInfo { min_srate: 18783, long_bands: &SWB_OFFSET_24K_LONG, short_bands: &SWB_OFFSET_24K_SHORT }, //22.05K - GASubbandInfo { min_srate: 13856, long_bands: &SWB_OFFSET_16K_LONG, short_bands: &SWB_OFFSET_16K_SHORT }, //16K - GASubbandInfo { min_srate: 11502, long_bands: &SWB_OFFSET_16K_LONG, short_bands: &SWB_OFFSET_16K_SHORT }, //12K - GASubbandInfo { min_srate: 9391, long_bands: &SWB_OFFSET_16K_LONG, short_bands: &SWB_OFFSET_16K_SHORT }, //11.025K - GASubbandInfo { min_srate: 0, long_bands: &SWB_OFFSET_8K_LONG, short_bands: &SWB_OFFSET_8K_SHORT }, //8K -]; diff --git a/src/codecs/atrac3.rs b/src/codecs/atrac3.rs deleted file mode 100644 index 5281892..0000000 --- a/src/codecs/atrac3.rs +++ /dev/null @@ -1,765 +0,0 @@ -use crate::formats::*; -use crate::frame::*; -use super::*; -use crate::io::bitreader::*; -use crate::io::byteio::*; -use crate::io::codebook::*; -use crate::dsp::fft::FFTMode; -use crate::dsp::mdct::IMDCT; -use std::f32::consts; - -#[derive(Clone,Copy,PartialEq)] -enum Mode { - Mono, - Stereo, - JointStereo, -} - -const ATRAC3_FRAME_SIZE: usize = 1024; - -#[derive(Clone,Copy)] -struct Tone { - pos: usize, - ncoeffs: usize, - coeffs: [f32; 8], -} - -struct GainData { - ngains: [usize; 4], - gain_lev: [[usize; 8]; 4], - gain_loc: [[usize; 8]; 4], -} - -impl GainData { - fn new() -> Self { - Self { - ngains: [0; 4], - gain_lev: [[0; 8]; 4], - gain_loc: [[0; 8]; 4], - } - } - fn read(&mut self, br: &mut BitReader, bands: usize) -> DecoderResult<()> { - self.ngains = [0; 4]; - for band in 0..bands { - self.ngains[band] = br.read(3)? as usize; - for i in 0..self.ngains[band] { - self.gain_lev[band][i] = br.read(4)? as usize; - self.gain_loc[band][i] = br.read(5)? as usize; - } - } - Ok(()) - } -} - -struct Channel { - data: [f32; ATRAC3_FRAME_SIZE], - delay: [f32; ATRAC3_FRAME_SIZE], - qmf_delay: [f32; 64 * 3], - - bands: usize, - block_no: usize, - - gain_data: [GainData; 2], - - subbands: usize, - components: usize, - ntones: usize, - tones: [Tone; 64], -} - -impl Channel { - fn new() -> Self { - Self { - data: [0.0; ATRAC3_FRAME_SIZE], - delay: [0.0; ATRAC3_FRAME_SIZE], - qmf_delay: [0.0; 64 * 3], - - bands: 0, - block_no: 0, - - gain_data: [GainData::new(), GainData::new()], - - subbands: 0, - components: 0, - ntones: 0, - tones: [Tone {pos: 0, ncoeffs: 0, coeffs: [0.0; 8]}; 64], - } - } - fn decode_unit(&mut self, br: &mut BitReader, codebooks: &[Codebook<u8>; 7], scalefactors: &[f32; 64]) -> DecoderResult<()> { - self.bands = (br.read(2)? as usize) + 1; - self.gain_data[self.block_no].read(br, self.bands)?; - self.data = [0.0; ATRAC3_FRAME_SIZE]; - - self.ntones = 0; - self.components = br.read(5)? as usize; - if self.components > 0 { - let selector = br.read(2)?; - validate!(selector != 2); - let mut mode0 = (selector & 1) != 0; - - for _ in 0..self.components { - let mut flags: [bool; 4] = [false; 4]; - for band in 0..self.bands { - flags[band] = br.read_bool()?; - } - let nvals = br.read(3)? as usize; - let quant = br.read(3)? as usize; - validate!(quant > 1); - if selector == 3 { - mode0 = br.read_bool()?; - } - for j in 0..self.bands*4 { - if !flags[j >> 2] { continue; } - let count = br.read(3)? as usize; - validate!(self.ntones + count < 64); - for _ in 0..count { - let scale_idx = br.read(6)? as usize; - let tone = &mut self.tones[self.ntones]; - tone.pos = (br.read(6)? as usize) + j * 64; - tone.ncoeffs = (ATRAC3_FRAME_SIZE - tone.pos).min(nvals + 1); - let scale = scalefactors[scale_idx] * ATRAC3_MAX_QUANT[quant]; - read_coeffs(br, codebooks, &mut tone.coeffs[..tone.ncoeffs], quant, scale, mode0)?; - self.ntones += 1; - } - } - } - } - - // spectrum - let mut quants: [usize; 32] = [0; 32]; - let mut scf: [usize; 32] = [0; 32]; - self.subbands = (br.read(5)? as usize) + 1; - let mode0 = br.read_bool()?; - for i in 0..self.subbands { - quants[i] = br.read(3)? as usize; - } - for i in 0..self.subbands { - if quants[i] == 0 { continue; } - scf[i] = br.read(6)? as usize; - } - - self.data = [0.0; ATRAC3_FRAME_SIZE]; - for i in 0..self.subbands { - if quants[i] == 0 { continue; } - let start = ATRAC3_SUBBANDS[i]; - let end = ATRAC3_SUBBANDS[i + 1]; - let scale = scalefactors[scf[i]] * ATRAC3_MAX_QUANT[quants[i]]; - read_coeffs(br, codebooks, &mut self.data[start..end], quants[i], scale, mode0)?; - } - - for i in 0..self.ntones { - let tone = &self.tones[i]; - for j in 0..tone.ncoeffs { - self.data[tone.pos + j] += tone.coeffs[j]; - } - } - Ok(()) - } - fn synth(&mut self, dsp: &mut DSP) { - let mut flag = 0; - let mut band = 0; - for (data, delay) in self.data.chunks_mut(256).zip(self.delay.chunks_mut(256)) { - if (flag & 1) != 0 { - for i in 0..128 { - let t0 = data[i]; - let t1 = data[255 - i]; - data[i] = t1; - data[255 - i] = t0; - } - } - dsp.synth_band(data); - dsp.apply_gains(data, delay, &mut self.gain_data, self.block_no, band); - delay.copy_from_slice(&dsp.tmp[256..512]); - flag ^= 1; - band += 1; - } - self.block_no ^= 1; - } - fn do_qmf(&mut self, dsp: &mut DSP, dst: &mut [f32]) { - let mut qchunks = self.qmf_delay.chunks_mut(64); - let qmf0 = qchunks.next().unwrap(); - let qmf1 = qchunks.next().unwrap(); - let qmf2 = qchunks.next().unwrap(); - { - let mut tchunks = self.data.chunks_mut(512); - let tmp0 = tchunks.next().unwrap(); - let tmp1 = tchunks.next().unwrap(); - dsp.do_qmf(tmp0, qmf0, false); - dsp.do_qmf(tmp1, qmf1, true); - } - dsp.do_qmf_out(dst, &self.data, qmf2); - } -} - -const ATRAC3_DEFAULT_DELAY: usize = 2190; -const ATRAC3_WEIGHTING_DELAYS: [u8; 6] = [ 0, 7, 0, 7, 0, 7 ]; - -fn read_coeffs(br: &mut BitReader, cb: &[Codebook<u8>; 7], dst: &mut [f32], quant: usize, scale: f32, mode0: bool) -> DecoderResult<()> { - if mode0 { - read_coeffs_mode0(br, dst, quant, scale) - } else if quant == 1 { - read_coeffs_mode1(br, &cb[0], dst, scale) - } else { - read_coeffs_other(br, &cb[quant - 1], dst, scale) - } -} - -const ATRAC3_MODE0_CB: [f32; 4] = [ 0.0, 1.0, -2.0, -1.0 ]; -const ATRAC3_MODE0_BITS: [u8; 8] = [ 0, 4, 3, 3, 4, 4, 5, 6 ]; - -fn read_coeffs_mode0(br: &mut BitReader, dst: &mut [f32], quant: usize, scale: f32) -> DecoderResult<()> { - let bits = ATRAC3_MODE0_BITS[quant]; - if bits > 0 { - for i in 0..dst.len() { - let val = br.read_s(bits)? as f32; - dst[i] = val * scale; - } - } else { - for i in (0..dst.len()).step_by(2) { - let val = br.read(4)? as usize; - dst[i + 0] = ATRAC3_MODE0_CB[val >> 2] * scale; - dst[i + 1] = ATRAC3_MODE0_CB[val & 3] * scale; - } - } - Ok(()) -} - -const ATRAC3_MODE1_CB: [f32; 9 * 2] = [ - 0.0, 0.0, - 0.0, 1.0, - 0.0, -1.0, - 1.0, 0.0, - -1.0, 0.0, - 1.0, 1.0, - 1.0, -1.0, - -1.0, 1.0, - -1.0, -1.0 -]; - -fn read_coeffs_mode1(br: &mut BitReader, cb: &Codebook<u8>, dst: &mut [f32], scale: f32) -> DecoderResult<()> { - for i in (0..dst.len()).step_by(2) { - let val = br.read_cb(cb)? as usize; - dst[i + 0] = ATRAC3_MODE1_CB[val * 2 + 0] * scale; - dst[i + 1] = ATRAC3_MODE1_CB[val * 2 + 1] * scale; - } - Ok(()) -} - -fn read_coeffs_other(br: &mut BitReader, cb: &Codebook<u8>, dst: &mut [f32], scale: f32) -> DecoderResult<()> { - for i in 0..dst.len() { - let val = (br.read_cb(cb)? as i8) + 1; - let sign = (val & 1) != 0; - let coef = (if sign { -(val >> 1) } else { val >> 1 }) as f32; - dst[i] = coef * scale; - } - Ok(()) -} - -struct DSP { - imdct: IMDCT, - window: [f32; 512], - gain_tab: [f32; 16], - gain_tab2: [f32; 32], - tmp: [f32; ATRAC3_FRAME_SIZE + 64], -} - -impl DSP { - fn new() -> Self { - let mut gain_tab: [f32; 16] = [0.0; 16]; - let mut gain_tab2: [f32; 32] = [0.0; 32]; - - for i in 0..16 { - gain_tab[i] = 2.0f32.powf(4.0 - (i as f32)); - } - for i in 0..32 { - gain_tab2[i] = 2.0f32.powf(((i as f32) - 15.0) * -0.125); - } - - let mut tmpw: [f32; 256] = [0.0; 256]; - for i in 0..tmpw.len() { - tmpw[i] = (((((i as f32) + 0.5) / 256.0 - 0.5) * consts::PI).sin() + 1.0) * 0.5; - } - - let mut window: [f32; 512] = [0.0; 512]; - for i in 0..tmpw.len() { - let w = tmpw[i] / (tmpw[i] * tmpw[i] + tmpw[255 - i] * tmpw[255 - i]); - window[i] = w; - window[512 - 1 - i] = w; - } - - Self { - imdct: IMDCT::new(FFTMode::SplitRadix, 512, false), - tmp: [0.0; ATRAC3_FRAME_SIZE + 64], - gain_tab, gain_tab2, window, - } - } - fn synth_band(&mut self, src: &[f32]) { - let dst = &mut self.tmp; - self.imdct.imdct(src, dst); - for i in 0..512 { - dst[i] *= self.window[i]; - } - } - fn apply_gains(&mut self, dst: &mut [f32], delay: &[f32], gain_data: &mut [GainData; 2], block_no: usize, band: usize) { - let prev_ngains = gain_data[block_no ^ 1].ngains[band]; - let gain1 = if gain_data[block_no].ngains[band] > 0 { - self.gain_tab[gain_data[block_no].gain_lev[band][0]] - } else { 1.0 }; - - if prev_ngains == 0 { - for i in 0..256 { - dst[i] = self.tmp[i] * gain1 + delay[i]; - } - return; - } - - gain_data[block_no ^ 1].gain_lev[band][prev_ngains] = 4; - gain_data[block_no ^ 1].gain_loc[band][prev_ngains] = 32; - - let mut off = 0; - for i in 0..prev_ngains { - let start = gain_data[block_no ^ 1].gain_loc[band][i] * 8; - let end = start + 8; - - let mut gain2 = self.gain_tab [gain_data[block_no ^ 1].gain_lev[band][i]]; - let gain_inc = self.gain_tab2[gain_data[block_no ^ 1].gain_lev[band][i + 1] + 15 - - gain_data[block_no ^ 1].gain_lev[band][i]]; - - while off < start { - dst[off] = (self.tmp[off] * gain1 + delay[off]) * gain2; - off += 1; - } - while off < end { - dst[off] = (self.tmp[off] * gain1 + delay[off]) * gain2; - gain2 *= gain_inc; - off += 1; - } - } - for i in off..256 { - dst[i] = self.tmp[i] * gain1 + delay[i]; - } - } - fn qmf_prepare(&mut self, src: &[f32], delay: &[f32], size: usize, swap: bool) { - for i in 0..46 { - self.tmp[i] = delay[i]; - } - let (s0, s1) = if !swap { - (&src[0..], &src[size/2..]) - } else { - (&src[size/2..], &src[0..]) - }; - for i in (0..size).step_by(4) { - self.tmp[46 + i + 0] = s0[i / 2 + 0] + s1[i / 2 + 0]; - self.tmp[46 + i + 1] = s0[i / 2 + 0] - s1[i / 2 + 0]; - self.tmp[46 + i + 2] = s0[i / 2 + 1] + s1[i / 2 + 1]; - self.tmp[46 + i + 3] = s0[i / 2 + 1] - s1[i / 2 + 1]; - } - } - fn qmf_synth(&mut self, dst: &mut [f32], size: usize) { - for i in (0..size).step_by(2) { - let mut acc0 = 0.0; - let mut acc1 = 0.0; - - for j in (0..ATRAC3_QMF_FILTER.len()).step_by(2) { - acc0 += self.tmp[i + j + 0] * ATRAC3_QMF_FILTER[j + 0]; - acc1 += self.tmp[i + j + 1] * ATRAC3_QMF_FILTER[j + 1]; - } - dst[i + 0] = acc1 * consts::SQRT_2 / 256.0; - dst[i + 1] = acc0 * consts::SQRT_2 / 256.0; - } - } - fn do_qmf(&mut self, dst: &mut [f32], delay: &mut [f32], swap: bool) { - self.qmf_prepare(dst, delay, 512, swap); - self.qmf_synth(dst, 512); - for i in 0..46 { - delay[i] = self.tmp[512 + i]; - } - } - fn do_qmf_out(&mut self, dst: &mut [f32], src: &[f32], delay: &mut [f32]) { - self.qmf_prepare(src, delay, 1024, false); - self.qmf_synth(dst, 1024); - for i in 0..46 { - delay[i] = self.tmp[1024 + i]; - } - } -} - -struct Atrac3Decoder { - info: Rc<NACodecInfo>, - channels: usize, - chmap: NAChannelMap, - samples: usize, - mode: Mode, - scrambled: bool, - - codebooks: [Codebook<u8>; 7], - dsp: DSP, - ch_data: [Channel; 2], - scalefactors: [f32; 64], - - mci_prev: [usize; 4], - mci_cur: [usize; 4], - mci_next: [usize; 4], - - weighting_delay: [u8; 6], - - pkt_buf: Vec<u8>, -} - -struct Atrac3CodebookReader { - bits: &'static [u8], - codes: &'static [u8], -} -impl CodebookDescReader<u8> for Atrac3CodebookReader { - fn bits(&mut self, idx: usize) -> u8 { self.bits[idx] } - fn code(&mut self, idx: usize) -> u32 { self.codes[idx] as u32 } - fn sym (&mut self, idx: usize) -> u8 { idx as u8 } - fn len(&mut self) -> usize { self.bits.len() } -} - -impl Atrac3Decoder { - fn new() -> Self { - let mut scalefactors: [f32; 64] = [0.0; 64]; - for i in 0..scalefactors.len() { - scalefactors[i] = 2.0f32.powf(((i as f32) - 15.0) / 3.0); - } - - let mut cb0 = Atrac3CodebookReader { codes: ATRAC3_HUFF_CODES[0], bits: ATRAC3_HUFF_BITS[0] }; - let mut cb1 = Atrac3CodebookReader { codes: ATRAC3_HUFF_CODES[1], bits: ATRAC3_HUFF_BITS[1] }; - let mut cb2 = Atrac3CodebookReader { codes: ATRAC3_HUFF_CODES[2], bits: ATRAC3_HUFF_BITS[2] }; - let mut cb3 = Atrac3CodebookReader { codes: ATRAC3_HUFF_CODES[3], bits: ATRAC3_HUFF_BITS[3] }; - let mut cb4 = Atrac3CodebookReader { codes: ATRAC3_HUFF_CODES[4], bits: ATRAC3_HUFF_BITS[4] }; - let mut cb5 = Atrac3CodebookReader { codes: ATRAC3_HUFF_CODES[5], bits: ATRAC3_HUFF_BITS[5] }; - let mut cb6 = Atrac3CodebookReader { codes: ATRAC3_HUFF_CODES[6], bits: ATRAC3_HUFF_BITS[6] }; - Self { - info: NACodecInfo::new_dummy(), - chmap: NAChannelMap::new(), - channels: 0, - samples: 0, - mode: Mode::Mono, - scrambled: false, - - dsp: DSP::new(), - ch_data: [Channel::new(), Channel::new()], - codebooks: [Codebook::new(&mut cb0, CodebookMode::MSB).unwrap(), - Codebook::new(&mut cb1, CodebookMode::MSB).unwrap(), - Codebook::new(&mut cb2, CodebookMode::MSB).unwrap(), - Codebook::new(&mut cb3, CodebookMode::MSB).unwrap(), - Codebook::new(&mut cb4, CodebookMode::MSB).unwrap(), - Codebook::new(&mut cb5, CodebookMode::MSB).unwrap(), - Codebook::new(&mut cb6, CodebookMode::MSB).unwrap() ], - - mci_prev: [3; 4], - mci_cur: [3; 4], - mci_next: [3; 4], - - weighting_delay: ATRAC3_WEIGHTING_DELAYS, - pkt_buf: Vec::with_capacity(65536), - scalefactors, - } - } - fn rev_matrix(&mut self) { - for i in 0..4 { - let c0 = self.mci_prev[i]; - let c1 = self.mci_cur[i]; - let off; - if c0 != c1 { - let l0 = ATRAC3_MATRIX_COEFFS[c0 * 2 + 0]; - let r0 = ATRAC3_MATRIX_COEFFS[c1 * 2 + 0]; - let l1 = ATRAC3_MATRIX_COEFFS[c0 * 2 + 1]; - let r1 = ATRAC3_MATRIX_COEFFS[c1 * 2 + 1]; - for idx in 0..8 { - let t0 = self.ch_data[0].data[idx + i * 256]; - let t1 = self.ch_data[1].data[idx + i * 256]; - let n1 = t0 * interp(l0, r0, idx) + t1 * interp(l1, r1, idx); - self.ch_data[0].data[idx + i * 256] = n1; - self.ch_data[1].data[idx + i * 256] = t0 * 2.0 - n1; - } - off = i * 256 + 8; - } else { - off = i * 256; - } - match c1 { - 0 => { - for i in off..256 { - let t0 = self.ch_data[0].data[i]; - let t1 = self.ch_data[1].data[i]; - self.ch_data[0].data[i] = t1 * 2.0; - self.ch_data[1].data[i] = (t0 - t1) * 2.0; - } - }, - 1 => { - for i in off..256 { - let t0 = self.ch_data[0].data[i]; - let t1 = self.ch_data[1].data[i]; - self.ch_data[0].data[i] = (t0 + t1) * 2.0; - self.ch_data[1].data[i] = t1 * -2.0; - } - }, - _ => { - for i in off..256 { - let t0 = self.ch_data[0].data[i]; - let t1 = self.ch_data[1].data[i]; - self.ch_data[0].data[i] = t0 + t1; - self.ch_data[1].data[i] = t0 - t1; - } - }, - }; - } - } - fn weigh_channels(&mut self) { - if (self.weighting_delay[1] == 7) && (self.weighting_delay[3] == 7) { return; } - let pw: [f32; 2]; - if self.weighting_delay[1] == 7 { - pw = [1.0; 2]; - } else { - let w = (self.weighting_delay[1] as f32) / 7.0; - let iw = (2.0 - w * w).sqrt(); - if self.weighting_delay[0] == 0 { - pw = [w, iw]; - } else { - pw = [iw, w]; - } - } - let cw: [f32; 2]; - if self.weighting_delay[3] == 7 { - cw = [1.0; 2]; - } else { - let w = (self.weighting_delay[3] as f32) / 7.0; - let iw = (2.0 - w * w).sqrt(); - if self.weighting_delay[2] == 0 { - cw = [w, iw]; - } else { - cw = [iw, w]; - } - } - - for i in 0..4 { - let off = i * 256; - for j in 0..8 { - self.ch_data[0].data[off + j] *= interp(pw[0], pw[1], j); - self.ch_data[1].data[off + j] *= interp(pw[0], pw[1], j); - } - for j in 8..256 { - self.ch_data[0].data[off + j] *= cw[0]; - self.ch_data[1].data[off + j] *= cw[1]; - } - } - } -} - -fn interp(a: f32, b: f32, pos: usize) -> f32 { - a + ((pos as f32) / 8.0) * (b - a) -} - -impl NADecoder for Atrac3Decoder { - fn init(&mut self, info: Rc<NACodecInfo>) -> DecoderResult<()> { - if let NACodecTypeInfo::Audio(ainfo) = info.get_properties() { - self.info = info.clone(); - let edata = info.get_extradata().unwrap(); - validate!(edata.len() >= 4); - - let mut mr = MemoryReader::new_read(&edata); - let mut br = ByteReader::new(&mut mr); - - match edata.len() { - 10 => { - let version = br.read_u32be()?; - validate!(version == 4); - self.samples = br.read_u16be()? as usize; - let delay = br.read_u16be()? as usize; - validate!(delay == ATRAC3_DEFAULT_DELAY); - let mode = br.read_u16be()?; - self.mode = match mode { - 0 => Mode::Mono, - 2 => Mode::Stereo, - 0x12 => Mode::JointStereo, - _ => return Err(DecoderError::InvalidData), - }; - self.channels = if self.mode == Mode::Mono { 1 } else { 2 }; - self.scrambled = true; - }, - 14 | 16 => { - if edata.len() == 16 { br.read_skip(2)?; } - self.samples = br.read_u32be()? as usize; - let mode = br.read_u16be()?; - self.mode = if mode != 0 { Mode::JointStereo } else { Mode::Stereo }; - self.channels = 2; - br.read_skip(2)?; - let ffactor = br.read_u16be()? as usize; - validate!((ffactor > 0) && (ffactor <= 16)); - // calculate block_align / channels / ffactor, validate it's 96/152/192 - }, - _ => { return Err(DecoderError::InvalidData) } - }; - validate!(self.samples == ATRAC3_FRAME_SIZE * self.channels); - if self.mode == Mode::Mono { - self.chmap.add_channel(NAChannelType::C); - } else { - self.chmap.add_channel(NAChannelType::L); - self.chmap.add_channel(NAChannelType::R); - } - let ainfo = NAAudioInfo::new(ainfo.get_sample_rate(), self.channels as u8, - SND_F32P_FORMAT, self.samples); - self.info = info.replace_info(NACodecTypeInfo::Audio(ainfo)); - Ok(()) - } else { - Err(DecoderError::InvalidData) - } - } - fn decode(&mut self, pkt: &NAPacket) -> DecoderResult<NAFrameRef> { - let info = pkt.get_stream().get_info(); - validate!(info.get_properties().is_audio()); - let pktbuf = pkt.get_buffer(); - validate!(pktbuf.len() > 5); - - let frame_size = pktbuf.len(); - self.pkt_buf.resize(frame_size, 0); - if self.scrambled { - for (i, s) in pktbuf.iter().enumerate() { - self.pkt_buf[i] = s ^ ATRAC3_XOR_KEY[i & 3]; - } - } else { - let dst = &mut self.pkt_buf[0..frame_size]; - dst.copy_from_slice(pktbuf.as_slice()); - } - - { - let mut br = BitReader::new(self.pkt_buf.as_slice(), frame_size, BitReaderMode::BE); - let id = br.read(6)?; - validate!(id == 0x28); - self.ch_data[0].decode_unit(&mut br, &self.codebooks, &self.scalefactors)?; - self.ch_data[0].synth(&mut self.dsp); - } - if self.channels == 2 { - let off; - if self.mode == Mode::JointStereo { - for i in 0..frame_size / 2 { - let b0 = self.pkt_buf[i]; - let b1 = self.pkt_buf[frame_size - i - 1]; - self.pkt_buf[i] = b1; - self.pkt_buf[frame_size - i - 1] = b0; - } - let mut i = 0; - while (i < frame_size) && (self.pkt_buf[i] == 0xF8) { i += 1; } - validate!(frame_size - i > 4); - off = i; - } else { - off = frame_size / 2; - } - let mut br = BitReader::new(&self.pkt_buf[off..], frame_size - off, BitReaderMode::BE); - if self.mode == Mode::JointStereo { - let id = br.read(2)?; - validate!(id == 0x3); - } else { - let id = br.read(6)?; - validate!(id == 0x28); - } - if self.mode == Mode::JointStereo { - for i in 0..self.weighting_delay.len() - 2 { - self.weighting_delay[i] = self.weighting_delay[i + 2]; - } - self.weighting_delay[4] = br.read(1)? as u8; - self.weighting_delay[5] = br.read(3)? as u8; - self.mci_prev = self.mci_cur; - self.mci_cur = self.mci_next; - for i in 0..4 { - self.mci_next[i] = br.read(2)? as usize; - } - } - self.ch_data[1].decode_unit(&mut br, &self.codebooks, &self.scalefactors)?; - self.ch_data[1].synth(&mut self.dsp); - } - if self.mode == Mode::JointStereo { - self.rev_matrix(); - self.weigh_channels(); - } - - let ainfo = self.info.get_properties().get_audio_info().unwrap(); - - let mut abuf = alloc_audio_buffer(ainfo, ATRAC3_FRAME_SIZE, self.chmap.clone())?; - let mut adata = abuf.get_abuf_f32().unwrap(); - let mut output = adata.get_data_mut(); - - for ch in 0..self.channels { - let dpos = abuf.get_offset(ch); - self.ch_data[ch].do_qmf(&mut self.dsp, &mut output[dpos..][..ATRAC3_FRAME_SIZE]); - } - - let mut frm = NAFrame::new_from_pkt(pkt, self.info.replace_info(NACodecTypeInfo::Audio(ainfo)), abuf); - frm.set_keyframe(true); - Ok(Rc::new(RefCell::new(frm))) - } -} - -pub fn get_decoder() -> Box<NADecoder> { - Box::new(Atrac3Decoder::new()) -} - -#[cfg(test)] -mod test { - use crate::test::dec_video::*; - #[test] - fn test_atrac3() { - let file = "assets/RV/rv30_atrc_384x208_realproducer_plus_8.51.rm"; -// let file = "assets/RV/rv20_svt_atrc_640x352_realproducer_plus_8.51.rm"; - test_decode_audio("realmedia", file, Some(12000), "atrac3"); - } -} - -const ATRAC3_XOR_KEY: [u8; 4] = [ 0x53, 0x7F, 0x61, 0x03 ]; - -const ATRAC3_HUFF_CODES: [&[u8]; 7] = [ - &[ 0x00, 0x04, 0x05, 0x0C, 0x0D, 0x1C, 0x1D, 0x1E, 0x1F ], - &[ 0x00, 0x04, 0x05, 0x06, 0x07 ], - &[ 0x00, 0x04, 0x05, 0x0C, 0x0D, 0x0E, 0x0F ], - &[ 0x00, 0x04, 0x05, 0x0C, 0x0D, 0x1C, 0x1D, 0x1E, 0x1F ], // same as 0 - &[ 0x00, 0x02, 0x03, 0x08, 0x09, 0x0A, 0x0B, 0x1C, 0x1D, 0x3C, 0x3D, 0x3E, 0x3F, 0x0C, 0x0D ], - &[ 0x00, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x14, - 0x15, 0x16, 0x17, 0x18, 0x19, 0x34, 0x35, 0x36, - 0x37, 0x38, 0x39, 0x3A, 0x3B, 0x78, 0x79, 0x7A, - 0x7B, 0x7C, 0x7D, 0x7E, 0x7F, 0x08, 0x09 ], - &[ 0x00, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, - 0x0F, 0x10, 0x11, 0x24, 0x25, 0x26, 0x27, 0x28, - 0x29, 0x2A, 0x2B, 0x2C, 0x2D, 0x2E, 0x2F, 0x30, - 0x31, 0x32, 0x33, 0x68, 0x69, 0x6A, 0x6B, 0x6C, - 0x6D, 0x6E, 0x6F, 0x70, 0x71, 0x72, 0x73, 0x74, - 0x75, 0xEC, 0xED, 0xEE, 0xEF, 0xF0, 0xF1, 0xF2, - 0xF3, 0xF4, 0xF5, 0xF6, 0xF7, 0xF8, 0xF9, 0xFA, - 0xFB, 0xFC, 0xFD, 0xFE, 0xFF, 0x02, 0x03 ] -]; -const ATRAC3_HUFF_BITS: [&[u8]; 7] = [ - &[ 1, 3, 3, 4, 4, 5, 5, 5, 5 ], - &[ 1, 3, 3, 3, 3 ], - &[ 1, 3, 3, 4, 4, 4, 4 ], - &[ 1, 3, 3, 4, 4, 5, 5, 5, 5 ], - &[ 2, 3, 3, 4, 4, 4, 4, 5, 5, 6, 6, 6, 6, 4, 4 ], - &[ 3, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 4, 4 ], - &[ 3, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 4, 4 ], -]; - -const ATRAC3_MAX_QUANT: [f32; 8] = [ 0.0, 1.0/1.5, 1.0/2.5, 1.0/3.5, 1.0/4.5, 1.0/7.5, 1.0/15.5, 1.0/31.5 ]; - -const ATRAC3_SUBBANDS: [usize; 32 + 1] = [ - 0, 8, 16, 24, 32, 40, 48, 56, 64, 80, 96, 112, 128, 144, 160, 176, - 192, 224, 256, 288, 320, 352, 384, 416, 448, 480, 512, 576, 640, 704, 768, 896, - 1024 -]; - -const ATRAC3_MATRIX_COEFFS: [f32; 8] = [ 0.0, 2.0, 2.0, 2.0, 0.0, 0.0, 1.0, 1.0 ]; - -const ATRAC3_QMF_FILTER: [f32; 48] = [ - -0.000029238139, -0.000184109580, -0.000112315138, 0.000602345390, - 0.000484503806, -0.001705877949, -0.001041114796, 0.004068033770, - 0.001566677820, -0.008430772461, -0.001512299757, 0.015680588782, - -0.000122339843, -0.026883240789, 0.004925364163, 0.043472178280, - -0.015603342094, -0.068180441856, 0.037618979812, 0.108652018011, - -0.087192758918, -0.198768734932, 0.264158189297, 0.928483188152, - 0.928483188152, 0.264158189297, -0.198768734932, -0.087192758918, - 0.108652018011, 0.037618979812, -0.068180441856, -0.015603342094, - 0.043472178280, 0.004925364163, -0.026883240789, -0.000122339843, - 0.015680588782, -0.001512299757, -0.008430772461, 0.001566677820, - 0.004068033770, -0.001041114796, -0.001705877949, 0.000484503806, - 0.000602345390, -0.000112315138, -0.000184109580, -0.000029238139 -]; diff --git a/src/codecs/blockdsp.rs b/src/codecs/blockdsp.rs deleted file mode 100644 index 33d682a..0000000 --- a/src/codecs/blockdsp.rs +++ /dev/null @@ -1,185 +0,0 @@ -use crate::frame::*; - -pub fn put_blocks(buf: &mut NAVideoBuffer<u8>, xpos: usize, ypos: usize, blk: &[[i16;64]; 6]) { - let stridey = buf.get_stride(0); - let strideu = buf.get_stride(1); - let stridev = buf.get_stride(2); - let mut idxy = buf.get_offset(0) + xpos * 16 + ypos * 16 * stridey; - let mut idxu = buf.get_offset(1) + xpos * 8 + ypos * 8 * strideu; - let mut idxv = buf.get_offset(2) + xpos * 8 + ypos * 8 * stridev; - - let mut data = buf.get_data_mut(); - let framebuf: &mut [u8] = data.as_mut_slice(); - - for j in 0..8 { - for k in 0..8 { - let mut v = blk[0][k + j * 8]; - if v < 0 { v = 0; } if v > 255 { v = 255; } - framebuf[idxy + k] = v as u8; - } - for k in 0..8 { - let mut v = blk[1][k + j * 8]; - if v < 0 { v = 0; } if v > 255 { v = 255; } - framebuf[idxy + k + 8] = v as u8; - } - idxy += stridey; - } - for j in 0..8 { - for k in 0..8 { - let mut v = blk[2][k + j * 8]; - if v < 0 { v = 0; } if v > 255 { v = 255; } - framebuf[idxy + k] = v as u8; - } - for k in 0..8 { - let mut v = blk[3][k + j * 8]; - if v < 0 { v = 0; } if v > 255 { v = 255; } - framebuf[idxy + k + 8] = v as u8; - } - idxy += stridey; - } - - for j in 0..8 { - for k in 0..8 { - let mut v = blk[4][k + j * 8]; - if v < 0 { v = 0; } if v > 255 { v = 255; } - framebuf[idxu + k] = v as u8; - } - for k in 0..8 { - let mut v = blk[5][k + j * 8]; - if v < 0 { v = 0; } if v > 255 { v = 255; } - framebuf[idxv + k] = v as u8; - } - idxu += strideu; - idxv += stridev; - } -} - -pub fn add_blocks(buf: &mut NAVideoBuffer<u8>, xpos: usize, ypos: usize, blk: &[[i16;64]; 6]) { - let stridey = buf.get_stride(0); - let strideu = buf.get_stride(1); - let stridev = buf.get_stride(2); - let mut idxy = buf.get_offset(0) + xpos * 16 + ypos * 16 * stridey; - let mut idxu = buf.get_offset(1) + xpos * 8 + ypos * 8 * strideu; - let mut idxv = buf.get_offset(2) + xpos * 8 + ypos * 8 * stridev; - - let mut data = buf.get_data_mut(); - let framebuf: &mut [u8] = data.as_mut_slice(); - - for j in 0..8 { - for k in 0..8 { - let mut v = blk[0][k + j * 8] + (framebuf[idxy + k] as i16); - if v < 0 { v = 0; } if v > 255 { v = 255; } - framebuf[idxy + k] = v as u8; - } - for k in 0..8 { - let mut v = blk[1][k + j * 8] + (framebuf[idxy + k + 8] as i16); - if v < 0 { v = 0; } if v > 255 { v = 255; } - framebuf[idxy + k + 8] = v as u8; - } - idxy += stridey; - } - for j in 0..8 { - for k in 0..8 { - let mut v = blk[2][k + j * 8] + (framebuf[idxy + k] as i16); - if v < 0 { v = 0; } if v > 255 { v = 255; } - framebuf[idxy + k] = v as u8; - } - for k in 0..8 { - let mut v = blk[3][k + j * 8] + (framebuf[idxy + k + 8] as i16); - if v < 0 { v = 0; } if v > 255 { v = 255; } - framebuf[idxy + k + 8] = v as u8; - } - idxy += stridey; - } - - for j in 0..8 { - for k in 0..8 { - let mut v = blk[4][k + j * 8] + (framebuf[idxu + k] as i16); - if v < 0 { v = 0; } if v > 255 { v = 255; } - framebuf[idxu + k] = v as u8; - } - for k in 0..8 { - let mut v = blk[5][k + j * 8] + (framebuf[idxv + k] as i16); - if v < 0 { v = 0; } if v > 255 { v = 255; } - framebuf[idxv + k] = v as u8; - } - idxu += strideu; - idxv += stridev; - } -} - -pub fn edge_emu(src: &NAVideoBuffer<u8>, xpos: isize, ypos: isize, bw: usize, bh: usize, dst: &mut [u8], dstride: usize, comp: usize) { - let stride = src.get_stride(comp); - let offs = src.get_offset(comp); - let (w, h) = src.get_dimensions(comp); - let data = src.get_data(); - let framebuf: &[u8] = data.as_slice(); - - for y in 0..bh { - let srcy; - if (y as isize) + ypos < 0 { srcy = 0; } - else if (y as isize) + ypos >= (h as isize) { srcy = h - 1; } - else { srcy = ((y as isize) + ypos) as usize; } - - for x in 0..bw { - let srcx; - if (x as isize) + xpos < 0 { srcx = 0; } - else if (x as isize) + xpos >= (w as isize) { srcx = w - 1; } - else { srcx = ((x as isize) + xpos) as usize; } - dst[x + y * dstride] = framebuf[offs + srcx + srcy * stride]; - } - } -} - -pub fn copy_blocks(dst: &mut NAVideoBuffer<u8>, src: &NAVideoBuffer<u8>, - dx: usize, dy: usize, sx: isize, sy: isize, bw: usize, bh: usize, - preborder: usize, postborder: usize, - mode: usize, interp: &[fn(&mut [u8], usize, &[u8], usize, usize, usize)]) -{ - let pre = if mode != 0 { preborder as isize } else { 0 }; - let post = if mode != 0 { postborder as isize } else { 0 }; - let (w, h) = src.get_dimensions(0); - - if (sx - pre < 0) || ((sx >> 1) - pre < 0) || (sx + (bw as isize) + post > (w as isize)) || - (sy - pre < 0) || ((sy >> 1) - pre < 0) || (sy + (bh as isize) + post > (h as isize)) { - let ebuf_stride: usize = 32; - let mut ebuf: Vec<u8> = Vec::with_capacity(ebuf_stride * (bh + ((pre + post) as usize))); - ebuf.resize((((pre + post) as usize) + bh) * ebuf_stride, 0); - - for comp in 0..3 { - let dstride = dst.get_stride(comp); - let doff = dst.get_offset(comp); - let mut ddta = dst.get_data_mut(); - let dbuf: &mut [u8] = ddta.as_mut_slice(); - let x = if comp > 0 { dx/2 } else { dx }; - let y = if comp > 0 { dy/2 } else { dy }; - let sx_ = (if comp > 0 { sx >> 1 } else { sx }) - pre; - let sy_ = (if comp > 0 { sy >> 1 } else { sy }) - pre; - let bw_ = (if comp > 0 { bw/2 } else { bw }) + ((pre + post) as usize); - let bh_ = (if comp > 0 { bh/2 } else { bh }) + ((pre + post) as usize); - edge_emu(src, sx_ - pre, sy_ - pre, bw_, bh_, - ebuf.as_mut_slice(), ebuf_stride, comp); - let bw_ = if comp > 0 { bw/2 } else { bw }; - let bh_ = if comp > 0 { bh/2 } else { bh }; - (interp[mode])(&mut dbuf[doff + x + y * dstride..], dstride, ebuf.as_slice(), ebuf_stride, bw_, bh_); - } - } else { - for comp in 0..3 { - let sstride = src.get_stride(comp); - let soff = src.get_offset(comp); - let sdta = src.get_data(); - let sbuf: &[u8] = sdta.as_slice(); - let dstride = dst.get_stride(comp); - let doff = dst.get_offset(comp); - let mut ddta = dst.get_data_mut(); - let dbuf: &mut [u8] = ddta.as_mut_slice(); - let x = if comp > 0 { dx/2 } else { dx }; - let y = if comp > 0 { dy/2 } else { dy }; - let sx_ = ((if comp > 0 { sx >> 1 } else { sx }) - pre) as usize; - let sy_ = ((if comp > 0 { sy >> 1 } else { sy }) - pre) as usize; - let bw_ = if comp > 0 { bw/2 } else { bw }; - let bh_ = if comp > 0 { bh/2 } else { bh }; - (interp[mode])(&mut dbuf[doff + x + y * dstride..], dstride, &sbuf[(soff + sx_ + sy_ * sstride)..], sstride, bw_, bh_); - } - } -} diff --git a/src/codecs/clearvideo.rs b/src/codecs/clearvideo.rs deleted file mode 100644 index 8a27006..0000000 --- a/src/codecs/clearvideo.rs +++ /dev/null @@ -1,2570 +0,0 @@ -use crate::io::byteio::{ByteReader,MemoryReader}; -use crate::io::bitreader::*; -use crate::io::codebook::*; -use crate::formats; -use super::*; -use std::fmt; -use std::ops::{Add, Sub}; - -struct CLVDCCodeReader { } -struct CLVACCodeReader { } -struct CLVFlagsCodeReader { codes: &'static [u16], bits: &'static [u8] } -struct CLVSym16CodeReader { codes: &'static [u16], bits: &'static [u8], syms: &'static [u16] } - -impl CodebookDescReader<i8> for CLVDCCodeReader { - fn bits(&mut self, idx: usize) -> u8 { CLV_DC_BITS[idx] } - fn code(&mut self, idx: usize) -> u32 { CLV_DC_CODES[idx] as u32 } - fn sym (&mut self, idx: usize) -> i8 { (idx as i8) - 63 } - fn len(&mut self) -> usize { CLV_DC_BITS.len() } -} - -impl CodebookDescReader<u16> for CLVACCodeReader { - fn bits(&mut self, idx: usize) -> u8 { CLV_AC_BITS[idx] } - fn code(&mut self, idx: usize) -> u32 { CLV_AC_CODES[idx] as u32 } - fn sym (&mut self, idx: usize) -> u16 { CLV_AC_SYMS[idx] } - fn len(&mut self) -> usize { CLV_AC_BITS.len() } -} - -impl CodebookDescReader<u8> for CLVFlagsCodeReader { - fn bits(&mut self, idx: usize) -> u8 { self.bits[idx] } - fn code(&mut self, idx: usize) -> u32 { self.codes[idx] as u32 } - fn sym (&mut self, idx: usize) -> u8 { idx as u8 } - fn len(&mut self) -> usize { self.bits.len() } -} - -impl CodebookDescReader<u16> for CLVSym16CodeReader { - fn bits(&mut self, idx: usize) -> u8 { self.bits[idx] } - fn code(&mut self, idx: usize) -> u32 { self.codes[idx] as u32 } - fn sym (&mut self, idx: usize) -> u16 { self.syms[idx] } - fn len(&mut self) -> usize { self.bits.len() } -} - -#[allow(dead_code)] -struct LevelCodes { - flags_cb: Option<Codebook<u8>>, - mv_cb: Option<Codebook<u16>>, - mv_esc: u16, - bias_cb: Option<Codebook<u16>>, - bias_esc: u16, -} - -impl LevelCodes { - fn new(flgd: Option<(&'static [u8], &'static [u16])>, - mvd: Option<(&'static [u8], &'static [u16], &'static [u16])>, mv_esc: u16, - bias: Option<(&'static [u8], &'static [u16], &'static [u16])>, bias_esc: u16) -> Self { - let flags_cb = if let Some((bits, codes)) = flgd { - let mut coderead = CLVFlagsCodeReader { bits: bits, codes: codes }; - Some(Codebook::new(&mut coderead, CodebookMode::MSB).unwrap()) - } else { - None - }; - let mv_cb = if let Some((bits, codes, syms)) = mvd { - let mut coderead = CLVSym16CodeReader { bits: bits, codes: codes, syms: syms }; - Some(Codebook::new(&mut coderead, CodebookMode::MSB).unwrap()) - } else { - None - }; - let bias_cb = if let Some((bits, codes, syms)) = bias { - let mut coderead = CLVSym16CodeReader { bits: bits, codes: codes, syms: syms }; - Some(Codebook::new(&mut coderead, CodebookMode::MSB).unwrap()) - } else { - None - }; - LevelCodes { flags_cb: flags_cb, mv_cb: mv_cb, mv_esc: mv_esc, bias_cb: bias_cb, bias_esc: bias_esc } - } -} - -#[derive(Debug,Clone,Copy)] -pub struct MV { - x: i16, - y: i16, -} - -impl MV { - pub fn new(x: i16, y: i16) -> Self { MV{ x: x, y: y } } - pub fn pred(a: MV, b: MV, c: MV) -> Self { - let x; - if a.x < b.x { - if b.x < c.x { - x = b.x; - } else { - if a.x < c.x { x = c.x; } else { x = a.x; } - } - } else { - if b.x < c.x { - if a.x < c.x { x = a.x; } else { x = c.x; } - } else { - x = b.x; - } - } - let y; - if a.y < b.y { - if b.y < c.y { - y = b.y; - } else { - if a.y < c.y { y = c.y; } else { y = a.y; } - } - } else { - if b.y < c.y { - if a.y < c.y { y = a.y; } else { y = c.y; } - } else { - y = b.y; - } - } - MV { x: x, y: y } - } -} - -pub const ZERO_MV: MV = MV { x: 0, y: 0 }; - -impl Add for MV { - type Output = MV; - fn add(self, other: MV) -> MV { MV { x: self.x + other.x, y: self.y + other.y } } -} - -impl Sub for MV { - type Output = MV; - fn sub(self, other: MV) -> MV { MV { x: self.x - other.x, y: self.y - other.y } } -} - -impl fmt::Display for MV { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - write!(f, "{},{}", self.x, self.y) - } -} - -struct MVInfo { - mv: Vec<MV>, - mb_w: usize, - mb_h: usize, - mb_size: usize, - mb_stride: usize, - top: bool, -} - -impl MVInfo { - fn new() -> Self { MVInfo{ mv: Vec::new(), mb_w: 0, mb_h: 0, mb_size: 0, mb_stride: 0, top: true } } - fn reset(&mut self, mb_w: usize, mb_h: usize, mb_size: usize) { - self.mb_w = mb_w; - self.mb_h = mb_h; - self.mb_size = mb_size; - self.mb_stride = mb_w; - self.mv.resize(self.mb_stride * 2, ZERO_MV); - } - fn update_row(&mut self) { - self.top = false; - for i in 0..self.mb_stride { - self.mv[i] = self.mv[self.mb_stride + i]; - } - } - #[allow(non_snake_case)] - fn predict(&mut self, mb_x: usize, mb_y: usize, diff: MV) -> MV { - let pred_mv = if self.top { - if mb_x > 0 { self.mv[self.mb_stride + mb_x - 1] } else { ZERO_MV } - } else if (mb_x == 0) || (mb_x == self.mb_w - 1) { - self.mv[mb_x] - } else { - let A = self.mv[self.mb_stride + mb_x - 1]; - let B = self.mv[ mb_x]; - let C = self.mv[ mb_x + 1]; - MV::pred(A, B, C) - }; - let mut res = pred_mv; - - let left_mv = -((mb_x * self.mb_size) as i16); - let right_mv = ((self.mb_w - mb_x - 1) * self.mb_size) as i16; - if res.x < left_mv { res.x = left_mv; } - if res.x > right_mv { res.x = right_mv; } - let top_mv = -((mb_y * self.mb_size) as i16); - let bot_mv = ((self.mb_h - mb_y - 1) * self.mb_size) as i16; - if res.y < top_mv { res.y = top_mv; } - if res.y > bot_mv { res.y = bot_mv; } - - self.mv[self.mb_stride + mb_x] = res + diff; - - res - } -} - - -struct TileInfo { - flags: u8, - mv: MV, - bias: i16, - child: [Option<Box<TileInfo>>; 4], -} - -#[allow(non_snake_case)] -fn dct_row(blk: &mut [i32]) { - let dshift = 11; - let shift = 8; - let t0 = 2841 * blk[1] + 565 * blk[7]; - let t1 = 565 * blk[1] - 2841 * blk[7]; - let t2 = 1609 * blk[5] + 2408 * blk[3]; - let t3 = 2408 * blk[5] - 1609 * blk[3]; - let t4 = 1108 * blk[2] - 2676 * blk[6]; - let t5 = 2676 * blk[2] + 1108 * blk[6]; - let t6 = ((blk[0] + blk[4]) << dshift) + (1 << (shift - 1)); - let t7 = ((blk[0] - blk[4]) << dshift) + (1 << (shift - 1)); - let t8 = t0 + t2; - let t9 = t0 - t2; - let tA = 181 * (t9 + (t1 - t3)) + 0x80 >> 8; - let tB = 181 * (t9 - (t1 - t3)) + 0x80 >> 8; - let tC = t1 + t3; - - blk[0] = (t6 + t5 + t8) >> shift; - blk[1] = (t7 + t4 + tA) >> shift; - blk[2] = (t7 - t4 + tB) >> shift; - blk[3] = (t6 - t5 + tC) >> shift; - blk[4] = (t6 - t5 - tC) >> shift; - blk[5] = (t7 - t4 - tB) >> shift; - blk[6] = (t7 + t4 - tA) >> shift; - blk[7] = (t6 + t5 - t8) >> shift; -} - -#[allow(non_snake_case)] -fn dct_col(blk: &mut [i32; 64], col: usize) { - let dshift = 8; - let shift = 14; - let t0 = (2841 * blk[1*8 + col] + 565 * blk[7*8 + col] + 4) >> 3; - let t1 = ( 565 * blk[1*8 + col] - 2841 * blk[7*8 + col] + 4) >> 3; - let t2 = (1609 * blk[5*8 + col] + 2408 * blk[3*8 + col] + 4) >> 3; - let t3 = (2408 * blk[5*8 + col] - 1609 * blk[3*8 + col] + 4) >> 3; - let t4 = (1108 * blk[2*8 + col] - 2676 * blk[6*8 + col] + 4) >> 3; - let t5 = (2676 * blk[2*8 + col] + 1108 * blk[6*8 + col] + 4) >> 3; - let t6 = ((blk[0*8 + col] + blk[4*8 + col]) << dshift) + (1 << (shift - 1)); - let t7 = ((blk[0*8 + col] - blk[4*8 + col]) << dshift) + (1 << (shift - 1)); - let t8 = t0 + t2; - let t9 = t0 - t2; - let tA = 181 * (t9 + (t1 - t3)) + 0x80 >> 8; - let tB = 181 * (t9 - (t1 - t3)) + 0x80 >> 8; - let tC = t1 + t3; - - blk[0*8 + col] = (t6 + t5 + t8) >> shift; - blk[1*8 + col] = (t7 + t4 + tA) >> shift; - blk[2*8 + col] = (t7 - t4 + tB) >> shift; - blk[3*8 + col] = (t6 - t5 + tC) >> shift; - blk[4*8 + col] = (t6 - t5 - tC) >> shift; - blk[5*8 + col] = (t7 - t4 - tB) >> shift; - blk[6*8 + col] = (t7 + t4 - tA) >> shift; - blk[7*8 + col] = (t6 + t5 - t8) >> shift; -} - -fn clv_dct(blk: &mut [i32; 64]) { - for row in blk.chunks_mut(8) { dct_row(row); } - for i in 0..8 { dct_col(blk, i); } -} - -fn clv_dct_dc(blk: &mut [i32; 64]) { - let dval = blk[0] >> 3; - for i in 0..64 { blk[i] = dval; } -} - -fn put_blocks(buf: &mut NAVideoBuffer<u8>, xpos: usize, ypos: usize, blk: &[[i32;64]; 6]) { - let stridey = buf.get_stride(0); - let strideu = buf.get_stride(1); - let stridev = buf.get_stride(2); - let mut idxy = buf.get_offset(0) + xpos * 16 + ypos * 16 * stridey; - let mut idxu = buf.get_offset(1) + xpos * 8 + ypos * 8 * strideu; - let mut idxv = buf.get_offset(2) + xpos * 8 + ypos * 8 * stridev; - - let mut data = buf.get_data_mut(); - let framebuf: &mut [u8] = data.as_mut_slice(); - - for j in 0..8 { - for k in 0..8 { - let mut v = blk[0][k + j * 8] + 128; - if v < 0 { v = 0; } if v > 255 { v = 255; } - framebuf[idxy + k] = v as u8; - } - for k in 0..8 { - let mut v = blk[1][k + j * 8] + 128; - if v < 0 { v = 0; } if v > 255 { v = 255; } - framebuf[idxy + k + 8] = v as u8; - } - idxy += stridey; - } - for j in 0..8 { - for k in 0..8 { - let mut v = blk[2][k + j * 8] + 128; - if v < 0 { v = 0; } if v > 255 { v = 255; } - framebuf[idxy + k] = v as u8; - } - for k in 0..8 { - let mut v = blk[3][k + j * 8] + 128; - if v < 0 { v = 0; } if v > 255 { v = 255; } - framebuf[idxy + k + 8] = v as u8; - } - idxy += stridey; - } - - for j in 0..8 { - for k in 0..8 { - let mut v = blk[4][k + j * 8] + 128; - if v < 0 { v = 0; } if v > 255 { v = 255; } - framebuf[idxu + k] = v as u8; - } - for k in 0..8 { - let mut v = blk[5][k + j * 8] + 128; - if v < 0 { v = 0; } if v > 255 { v = 255; } - framebuf[idxv + k] = v as u8; - } - idxu += strideu; - idxv += stridev; - } -} - -fn copy_block(dst: &mut NAVideoBuffer<u8>, src: &NAVideoBuffer<u8>, - plane: usize, x: usize, y: usize, dx: isize, dy: isize, size: usize) -{ - let sx: isize = (x as isize) + dx; - let sy: isize = (y as isize) + dy; - - let sstride = src.get_stride(plane); - let mut soff = src.get_offset(plane) + (sx as usize) + (sy as usize) * sstride; - let sdta = src.get_data(); - let sbuf: &[u8] = sdta.as_slice(); - let dstride = dst.get_stride(plane); - let mut doff = dst.get_offset(plane) + x + y * dstride; - let mut ddta = dst.get_data_mut(); - let dbuf: &mut [u8] = ddta.as_mut_slice(); - for _ in 0..size { - let dst = &mut dbuf[doff..][..size]; - let src = &sbuf[soff..][..size]; - dst.copy_from_slice(src); - doff += dstride; - soff += sstride; - } -} - -fn copyadd_block(dst: &mut NAVideoBuffer<u8>, src: &NAVideoBuffer<u8>, - plane: usize, x: usize, y: usize, dx: isize, dy: isize, size: usize, bias: i16) -{ - let sx: isize = (x as isize) + dx; - let sy: isize = (y as isize) + dy; - - let sstride = src.get_stride(plane); - let mut soff = src.get_offset(plane) + (sx as usize) + (sy as usize) * sstride; - let sdta = src.get_data(); - let sbuf: &[u8] = sdta.as_slice(); - let dstride = dst.get_stride(plane); - let mut doff = dst.get_offset(plane) + x + y * dstride; - let mut ddta = dst.get_data_mut(); - let dbuf: &mut [u8] = ddta.as_mut_slice(); - for _ in 0..size { - let dst = &mut dbuf[doff..][..size]; - let src = &sbuf[soff..][..size]; - for i in 0..size { - let val = (src[i] as i16) + bias; - if val < 0x00 { dst[i] = 0x00; } - else if val > 0xFF { dst[i] = 0xFF; } - else { dst[i] = val as u8; } - } - doff += dstride; - soff += sstride; - } -} - -fn tile_do_block(dst: &mut NAVideoBuffer<u8>, src: &NAVideoBuffer<u8>, - plane: usize, x: usize, y: usize, dx: i16, dy: i16, size: usize, bias: i16) -{ - if bias == 0 { - copy_block(dst, src, plane, x, y, dx as isize, dy as isize, size); - } else { - copyadd_block(dst, src, plane, x, y, dx as isize, dy as isize, size, bias); - } -} - -fn restore_tree(dst: &mut NAVideoBuffer<u8>, src: &NAVideoBuffer<u8>, plane: usize, - x: usize, y: usize, size: usize, tile: &TileInfo, root_mv: MV) { - let mv = root_mv + tile.mv; - - if tile.flags == 0 { - tile_do_block(dst, src, plane, x, y, mv.x, mv.y, size, tile.bias); - } else { - let hsize = size >> 1; - for i in 0..4 { - let xoff = if (i & 2) == 0 { 0 } else { hsize }; - let yoff = if (i & 1) == 0 { 0 } else { hsize }; - - if let Some(ref subtile) = tile.child[i] { - restore_tree(dst, src, plane, x + xoff, y + yoff, hsize, subtile, root_mv); - } else { - tile_do_block(dst, src, plane, x + xoff, y + yoff, mv.x, mv.y, hsize, tile.bias); - } - } - } -} - -fn extend_edges(buf: &mut NAVideoBuffer<u8>, tile_size: usize) { - for comp in 0..3 { - let (w, h) = buf.get_dimensions(comp); - let size = if comp == 0 { tile_size } else { tile_size >> 1 }; - let stride = buf.get_stride(comp); - let planeoff = buf.get_offset(comp); - let mut data = buf.get_data_mut(); - let framebuf: &mut [u8] = data.as_mut_slice(); - - let right = size - (w & (size - 1)); - let bottom = size - (h & (size - 1)); - - if (right == size) && (bottom == size) { return; } - if right != size { - let mut off = planeoff + w; - for _ in 0..h { - for i in 0..right { framebuf[off + i] = 0x80; } - off += stride; - } - } - if bottom != size { - let mut off = planeoff + h * stride; - for _ in 0..bottom { - for i in 0..stride { framebuf[off + i] = 0x80; } - off += stride; - } - } - } -} - -#[allow(dead_code)] -struct ClearVideoDecoder { - info: Rc<NACodecInfo>, - dc_cb: Codebook<i8>, - ac_cb: Codebook<u16>, - frmmgr: HAMShuffler, - is_rm: bool, - ylev: [LevelCodes; 4], - ulev: [LevelCodes; 3], - vlev: [LevelCodes; 3], - tsize: u8, -} - -fn decode_dct_block(br: &mut BitReader, blk: &mut [i32; 64], ac_quant: i32, has_ac: bool, - dc_cb: &Codebook<i8>, ac_cb: &Codebook<u16>) -> DecoderResult<()> { - let mut idx = 1; - let mut eob = false; - - blk[0] = br.read_cb(dc_cb)? as i32; - - if !has_ac { return Ok(()); } - - while (idx < 64) && !eob { - let val = br.read_cb(ac_cb)?; - let (level, skip) = if val != CLV_AC_ESCAPE { - eob = ((val >> 12) & 1) != 0; - let run = ((val >> 4) & 0xFF) as usize; - let lev = (val & 0xF) as i32; - if br.read_bool()? { - (-lev, run) - } else { - ( lev, run) - } - } else { - eob = br.read_bool()?; - let run = br.read(6)? as usize; - let lev = br.read_s(8)? as i32; - (lev, run) - }; - idx += skip; - validate!(idx < 64); - if level != 0 { - let (aval, sign) = if level >= 0 { (level, false) } else { (-level, true) }; - let mut val = ac_quant * (2 * aval + 1); - if (ac_quant & 1) == 0 { - val -= 1; - } - if sign { - val = -val; - } - blk[ZIGZAG[idx]] = val; - } - idx += 1; - } - - validate!(idx <= 64 && eob); - - Ok(()) -} - -fn decode_tile_info(br: &mut BitReader, lc: &[LevelCodes], level: usize) -> DecoderResult<Box<TileInfo>> { - let flags = if let Some(ref cb) = lc[level].flags_cb { - br.read_cb(cb)? - } else { - 0 - }; - let mv = if let Some(ref cb) = lc[level].mv_cb { - let mv_code = br.read_cb(cb)?; - if mv_code != lc[level].mv_esc { - MV::new(((mv_code & 0xFF) as i8) as i16, (mv_code as i16) >> 8) - } else { - let x = br.read_s(8)? as i16; - let y = br.read_s(8)? as i16; - MV::new(x, y) - } - } else { - ZERO_MV - }; - let bias = if let Some(ref cb) = lc[level].bias_cb { - let bias_val = br.read_cb(cb)?; - if bias_val != lc[level].bias_esc { - bias_val as i16 - } else { - br.read_s(16)? as i16 - } - } else { - 0 - }; - let mut ti = TileInfo { flags: flags, mv: mv, bias: bias, child: [None, None, None, None] }; - if ti.flags != 0 { - for i in 0..4 { - if (ti.flags & (1 << i)) != 0 { - let subti = decode_tile_info(br, lc, level + 1)?; - ti.child[i] = Some(subti); - } - } - } - Ok(Box::new(ti)) -} - -impl ClearVideoDecoder { - fn new(is_rm: bool) -> Self { - let dummy_info = Rc::new(DUMMY_CODEC_INFO); - let mut coderead = CLVDCCodeReader{}; - let dc_cb = Codebook::new(&mut coderead, CodebookMode::MSB).unwrap(); - let mut coderead = CLVACCodeReader{}; - let ac_cb = Codebook::new(&mut coderead, CodebookMode::MSB).unwrap(); - - ClearVideoDecoder { - info: dummy_info, - dc_cb: dc_cb, ac_cb: ac_cb, - frmmgr: HAMShuffler::new(), - is_rm: is_rm, - ylev: [ - LevelCodes::new(Some((CLV_FLAGSY_0_BITS, CLV_FLAGSY_0_CODES)), - Some((CLV_MVY_0_BITS, CLV_MVY_0_CODES, CLV_MVY_0_SYMS)), CLV_MVY_0_ESCAPE, - None, 0), - LevelCodes::new(Some((CLV_FLAGSY_1_BITS, CLV_FLAGSY_1_CODES)), - Some((CLV_MVY_1_BITS, CLV_MVY_1_CODES, CLV_MVY_1_SYMS)), CLV_MVY_1_ESCAPE, - Some((CLV_BIASY_1_BITS, CLV_BIASY_1_CODES, CLV_BIASY_1_SYMS)), CLV_BIAS_ESCAPE), - LevelCodes::new(Some((CLV_FLAGSY_2_BITS, CLV_FLAGSY_2_CODES)), - Some((CLV_MVY_2_BITS, CLV_MVY_2_CODES, CLV_MVY_2_SYMS)), CLV_MVY_2_ESCAPE, - Some((CLV_BIASY_2_BITS, CLV_BIASY_2_CODES, CLV_BIASY_2_SYMS)), CLV_BIAS_ESCAPE), - LevelCodes::new(None, - Some((CLV_MVY_3_BITS, CLV_MVY_3_CODES, CLV_MVY_3_SYMS)), CLV_MVY_3_ESCAPE, - Some((CLV_BIASY_3_BITS, CLV_BIASY_3_CODES, CLV_BIASY_3_SYMS)), CLV_BIAS_ESCAPE) - ], - ulev: [ - LevelCodes::new(Some((CLV_FLAGSU_0_BITS, CLV_FLAGSU_0_CODES)), - None, 0, - None, 0), - LevelCodes::new(Some((CLV_FLAGSU_1_BITS, CLV_FLAGSU_1_CODES)), - Some((CLV_MVU_1_BITS, CLV_MVU_1_CODES, CLV_MVU_1_SYMS)), CLV_MVU_1_ESCAPE, - Some((CLV_BIASU_1_BITS, CLV_BIASU_1_CODES, CLV_BIASU_1_SYMS)), CLV_BIAS_ESCAPE), - LevelCodes::new(None, - Some((CLV_MVU_2_BITS, CLV_MVU_2_CODES, CLV_MVU_2_SYMS)), CLV_MVU_2_ESCAPE, - Some((CLV_BIASU_2_BITS, CLV_BIASU_2_CODES, CLV_BIASU_2_SYMS)), CLV_BIAS_ESCAPE), - ], - vlev: [ - LevelCodes::new(Some((CLV_FLAGSV_0_BITS, CLV_FLAGSV_0_CODES)), - None, 0, - None, 0), - LevelCodes::new(Some((CLV_FLAGSV_1_BITS, CLV_FLAGSV_1_CODES)), - Some((CLV_MVV_1_BITS, CLV_MVV_1_CODES, CLV_MVV_1_SYMS)), CLV_MVV_1_ESCAPE, - Some((CLV_BIASV_1_BITS, CLV_BIASV_1_CODES, CLV_BIASV_1_SYMS)), CLV_BIAS_ESCAPE), - LevelCodes::new(None, - Some((CLV_MVV_2_BITS, CLV_MVV_2_CODES, CLV_MVV_2_SYMS)), CLV_MVV_2_ESCAPE, - Some((CLV_BIASV_2_BITS, CLV_BIASV_2_CODES, CLV_BIASV_2_SYMS)), CLV_BIAS_ESCAPE), - ], - tsize: 0, - } - } - - fn decode_frame_intra(&mut self, br: &mut BitReader, buf: &mut NAVideoBuffer<u8>, - width: usize, height: usize) -> DecoderResult<()> { - let ac_quant = br.read(8)? as i32; - - let mut top_dc: [i32; 3] = [0; 3]; - let mut left_dc: [i32; 4] = [0; 4]; - - let mb_w = (width + 0xF) >> 4; - let mb_h = (height + 0xF) >> 4; - for mb_y in 0..mb_h { - for mb_x in 0..mb_w { - let mut blks: [[i32; 64]; 6] = [[0; 64]; 6]; - let mut has_ac: [bool; 6] = [false; 6]; - - for i in 0..6 { has_ac[i] = br.read_bool()? } - - for i in 0..4 { - decode_dct_block(br, &mut blks[i], ac_quant, has_ac[i], &self.dc_cb, &self.ac_cb)?; - if (mb_x == 0) && (i == 0 || i == 2) { - blks[i][0] += top_dc[0]; - top_dc[0] = blks[i][0]; - } else { - blks[i][0] += left_dc[(i & 2) >> 1]; - } - left_dc[(i & 2) >> 1] = blks[i][0]; - blks[i][0] <<= 5; // DC dequant - if has_ac[i] { - clv_dct(&mut blks[i]); - } else { - clv_dct_dc(&mut blks[i]); - } - } - for i in 1..3 { - let blk_idx = i + 3; - decode_dct_block(br, &mut blks[blk_idx], ac_quant, has_ac[blk_idx], &self.dc_cb, &self.ac_cb)?; - if mb_x == 0 { - blks[blk_idx][0] += top_dc[i]; - top_dc[i] = blks[blk_idx][0]; - } else { - blks[blk_idx][0] += left_dc[i + 1]; - } - left_dc[i + 1] = blks[blk_idx][0]; - blks[blk_idx][0] <<= 5; // DC dequant - if has_ac[blk_idx] { - clv_dct(&mut blks[blk_idx]); - } else { - clv_dct_dc(&mut blks[blk_idx]); - } - } - put_blocks(buf, mb_x, mb_y, &blks); - } - } - Ok(()) - } - fn decode_frame_inter(&mut self, br: &mut BitReader, - buf: &mut NAVideoBuffer<u8>, prev: &mut NAVideoBuffer<u8>, - width: usize, height: usize) -> DecoderResult<()> { - let mb_size = 1 << self.tsize; - let mb_w = (width + mb_size - 1) >> self.tsize; - let mb_h = (height + mb_size - 1) >> self.tsize; - - let mut mvi = MVInfo::new(); - mvi.reset(mb_w, mb_h, mb_size); - - for t_y in 0..mb_h { - for t_x in 0..mb_w { - if !br.read_bool()? { - let x = t_x << self.tsize; - let y = t_y << self.tsize; - let size = 1 << self.tsize; - let tile = decode_tile_info(br, &self.ylev, 0)?; - let mv = mvi.predict(t_x, t_y, tile.mv); - restore_tree(buf, prev, 0, x, y, size, &tile, mv); - let x = t_x << (self.tsize - 1); - let y = t_y << (self.tsize - 1); - let size = 1 << (self.tsize - 1); - let mut cmv = mv + tile.mv; - cmv.x /= 2; - cmv.y /= 2; - let tile = decode_tile_info(br, &self.ulev, 0)?; - restore_tree(buf, prev, 1, x, y, size, &tile, cmv); - let tile = decode_tile_info(br, &self.vlev, 0)?; - restore_tree(buf, prev, 2, x, y, size, &tile, cmv); - } else { - let mv = mvi.predict(t_x, t_y, ZERO_MV); - for plane in 0..3 { - let x = if plane == 0 { t_x << self.tsize } else { t_x << (self.tsize - 1) }; - let y = if plane == 0 { t_y << self.tsize } else { t_y << (self.tsize - 1) }; - let size = if plane == 0 { 1 << self.tsize } else { 1 << (self.tsize - 1) }; - let mx = if plane == 0 { mv.x as isize } else { (mv.x >> 1) as isize }; - let my = if plane == 0 { mv.y as isize } else { (mv.y >> 1) as isize }; - copy_block(buf, prev, plane, x, y, mx, my, size); - } - } - } - mvi.update_row(); - } - Ok(()) - } -} - -impl NADecoder for ClearVideoDecoder { - fn init(&mut self, info: Rc<NACodecInfo>) -> DecoderResult<()> { - if info.get_extradata().is_none() { return Err(DecoderError::InvalidData); } - if let NACodecTypeInfo::Video(vinfo) = info.get_properties() { - let w = vinfo.get_width(); - let h = vinfo.get_height(); - let f = vinfo.is_flipped(); - let fmt = formats::YUV420_FORMAT; - let myinfo = NACodecTypeInfo::Video(NAVideoInfo::new(w, h, f, fmt)); - self.info = Rc::new(NACodecInfo::new_ref(info.get_name(), myinfo, info.get_extradata())); - self.frmmgr.clear(); - let edata = info.get_extradata().unwrap(); -//todo detect simply by extradata contents? - if !self.is_rm { - let mut mr = MemoryReader::new_read(edata.as_slice()); - let mut br = ByteReader::new(&mut mr); - br.read_skip(0x5E).unwrap(); - let tile_size = br.read_u32le()?; - self.tsize = tile_size.trailing_zeros() as u8; - } else { - let mut mr = MemoryReader::new_read(edata.as_slice()); - let mut br = ByteReader::new(&mut mr); - br.read_skip(0x86).unwrap(); - let tile_size = br.read_u32be()?; - self.tsize = tile_size.trailing_zeros() as u8; - } - Ok(()) - } else { - Err(DecoderError::InvalidData) - } - } - fn decode(&mut self, pkt: &NAPacket) -> DecoderResult<NAFrameRef> { - let src = pkt.get_buffer(); - if src.len() <= 1 { return Err(DecoderError::ShortData); } - let off = if self.is_rm { - let nhdr = src[0] as usize; - (nhdr + 1) * 8 + 1 - } else { - 0 - }; - if src.len() <= off + 1 { return Err(DecoderError::ShortData); } - - if (src[off] & 0x7F) == 0x30 { - let mut frm = NAFrame::new_from_pkt(pkt, self.info.clone(), NABufferType::None); - frm.set_keyframe(false); - frm.set_frame_type(FrameType::Skip); - return Ok(Rc::new(RefCell::new(frm))); - } - - let is_intra = (src[off] & 2) == 2; - let mut br = BitReader::new(&src[(off + 1)..], src.len() - (off + 1), BitReaderMode::BE); - - let vinfo = self.info.get_properties().get_video_info().unwrap(); - let bufret = alloc_video_buffer(vinfo, self.tsize); - if let Err(_) = bufret { return Err(DecoderError::InvalidData); } - let mut bufinfo = bufret.unwrap(); - let mut buf = bufinfo.get_vbuf().unwrap(); - - if is_intra { - let fsize = br.read(32)? as usize; - validate!(fsize <= src.len() - off); - self.decode_frame_intra(&mut br, &mut buf, vinfo.get_width(), vinfo.get_height())?; - extend_edges(&mut buf, 1 << self.tsize); - } else { - let mut prev = self.frmmgr.clone_ref().unwrap(); - extend_edges(&mut prev, 1 << self.tsize); - self.decode_frame_inter(&mut br, &mut buf, &mut prev, vinfo.get_width(), vinfo.get_height())?; - extend_edges(&mut buf, 1 << self.tsize); - } - self.frmmgr.add_frame(buf); - let mut frm = NAFrame::new_from_pkt(pkt, self.info.clone(), bufinfo); - frm.set_keyframe(is_intra); - if is_intra { - frm.set_frame_type(FrameType::I); - } else { - frm.set_frame_type(FrameType::P); - } - Ok(Rc::new(RefCell::new(frm))) - } -} - -pub fn get_decoder() -> Box<NADecoder> { - Box::new(ClearVideoDecoder::new(false)) -} - -pub fn get_decoder_rm() -> Box<NADecoder> { - Box::new(ClearVideoDecoder::new(true)) -} - -#[cfg(test)] -mod test { - use crate::test::dec_video::test_file_decoding; - #[test] - fn test_clv() { - test_file_decoding("avi", "assets/TalkingHead_352x288.avi", Some(10), true, false, None/*Some("clv")*/); -// test_file_decoding("avi", "assets/basketball.avi", None/*Some(10)*/, true, false, Some("clv1")); -//panic!("debug"); - } -} - -const CLV_DC_CODES: &[u8] = &[ - 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, - 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, - 0x10, 0x11, 0x12, 0x13, 0x13, 0x14, 0x07, 0x0B, - 0x0C, 0x08, 0x08, 0x09, 0x04, 0x06, 0x07, 0x05, - 0x04, 0x05, 0x04, 0x06, 0x05, 0x06, 0x07, 0x05, - 0x06, 0x07, 0x06, 0x07, 0x08, 0x06, 0x07, 0x08, - 0x09, 0x0A, 0x0B, 0x07, 0x08, 0x09, 0x07, 0x08, - 0x06, 0x07, 0x08, 0x06, 0x04, 0x05, 0x02, 0x01, - 0x03, 0x06, 0x07, 0x07, 0x09, 0x0A, 0x0B, 0x09, - 0x0A, 0x0B, 0x0A, 0x0B, 0x0C, 0x0D, 0x0C, 0x09, - 0x0D, 0x0A, 0x0B, 0x08, 0x09, 0x0A, 0x0B, 0x07, - 0x08, 0x09, 0x0A, 0x0B, 0x06, 0x07, 0x06, 0x08, - 0x07, 0x09, 0x0A, 0x0B, 0x09, 0x0A, 0x0B, 0x0C, - 0x14, 0x0D, 0x0D, 0x0E, 0x0F, 0x15, 0x15, 0x16, - 0x17, 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, - 0x1F, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, -]; - -const CLV_DC_BITS: &[u8] = &[ - 22, 22, 22, 22, 22, 22, 22, 22, - 22, 22, 22, 22, 22, 22, 22, 22, - 22, 22, 22, 21, 22, 22, 19, 20, - 20, 19, 18, 18, 15, 17, 17, 16, - 14, 15, 12, 13, 14, 14, 14, 12, - 12, 12, 11, 11, 11, 10, 10, 10, - 10, 10, 10, 9, 9, 9, 8, 8, - 7, 7, 7, 6, 5, 5, 3, 1, - 3, 5, 5, 6, 7, 7, 7, 8, - 8, 8, 9, 9, 9, 9, 10, 11, - 10, 11, 11, 12, 12, 12, 12, 13, - 14, 14, 14, 14, 15, 15, 16, 17, - 16, 17, 18, 18, 19, 19, 19, 19, - 21, 19, 20, 19, 19, 21, 22, 22, - 22, 22, 22, 22, 22, 22, 22, 22, - 22, 22, 22, 22, 22, 22, 22, -]; - -const CLV_AC_SYMS: &[u16] = &[ - 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, - 0x0009, 0x000A, 0x000B, 0x000C, 0x0011, 0x0012, 0x0013, 0x0014, - 0x0015, 0x0016, 0x0021, 0x0022, 0x0023, 0x0024, 0x0031, 0x0032, - 0x0033, 0x0041, 0x0042, 0x0043, 0x0051, 0x0052, 0x0053, 0x0061, - 0x0062, 0x0063, 0x0071, 0x0072, 0x0081, 0x0082, 0x0091, 0x0092, - 0x00A1, 0x00A2, 0x00B1, 0x00C1, 0x00D1, 0x00E1, 0x00F1, 0x0101, - 0x0111, 0x0121, 0x0131, 0x0141, 0x0151, 0x0161, 0x0171, 0x0181, - 0x0191, 0x01A1, 0x1001, 0x1002, 0x1003, 0x1011, 0x1012, 0x1021, - 0x1031, 0x1041, 0x1051, 0x1061, 0x1071, 0x1081, 0x1091, 0x10A1, - 0x10B1, 0x10C1, 0x10D1, 0x10E1, 0x10F1, 0x1101, 0x1111, 0x1121, - 0x1131, 0x1141, 0x1151, 0x1161, 0x1171, 0x1181, 0x1191, 0x11A1, - 0x11B1, 0x11C1, 0x11D1, 0x11E1, 0x11F1, 0x1201, 0x1211, 0x1221, - 0x1231, 0x1241, 0x1251, 0x1261, 0x1271, 0x1281, 0x1BFF, -]; - -const CLV_AC_CODES: &[u8] = &[ - 0x02, 0x0F, 0x15, 0x17, 0x1F, 0x25, 0x24, 0x21, - 0x20, 0x07, 0x06, 0x20, 0x06, 0x14, 0x1E, 0x0F, - 0x21, 0x50, 0x0E, 0x1D, 0x0E, 0x51, 0x0D, 0x23, - 0x0D, 0x0C, 0x22, 0x52, 0x0B, 0x0C, 0x53, 0x13, - 0x0B, 0x54, 0x12, 0x0A, 0x11, 0x09, 0x10, 0x08, - 0x16, 0x55, 0x15, 0x14, 0x1C, 0x1B, 0x21, 0x20, - 0x1F, 0x1E, 0x1D, 0x1C, 0x1B, 0x1A, 0x22, 0x23, - 0x56, 0x57, 0x07, 0x19, 0x05, 0x0F, 0x04, 0x0E, - 0x0D, 0x0C, 0x13, 0x12, 0x11, 0x10, 0x1A, 0x19, - 0x18, 0x17, 0x16, 0x15, 0x14, 0x13, 0x18, 0x17, - 0x16, 0x15, 0x14, 0x13, 0x12, 0x11, 0x07, 0x06, - 0x05, 0x04, 0x24, 0x25, 0x26, 0x27, 0x58, 0x59, - 0x5A, 0x5B, 0x5C, 0x5D, 0x5E, 0x5F, 0x03, -]; - -const CLV_AC_BITS: &[u8] = &[ - 2, 4, 6, 7, 8, 9, 9, 10, - 10, 11, 11, 11, 3, 6, 8, 10, - 11, 12, 4, 8, 10, 12, 5, 9, - 10, 5, 9, 12, 5, 10, 12, 6, - 10, 12, 6, 10, 6, 10, 6, 10, - 7, 12, 7, 7, 8, 8, 9, 9, - 9, 9, 9, 9, 9, 9, 11, 11, - 12, 12, 4, 9, 11, 6, 11, 6, - 6, 6, 7, 7, 7, 7, 8, 8, - 8, 8, 8, 8, 8, 8, 9, 9, - 9, 9, 9, 9, 9, 9, 10, 10, - 10, 10, 11, 11, 11, 11, 12, 12, - 12, 12, 12, 12, 12, 12, 7, -]; - -const CLV_AC_ESCAPE: u16 = 0x1BFF; - -const ZIGZAG: &[usize] = &[ - 0, 1, 8, 16, 9, 2, 3, 10, - 17, 24, 32, 25, 18, 11, 4, 5, - 12, 19, 26, 33, 40, 48, 41, 34, - 27, 20, 13, 6, 7, 14, 21, 28, - 35, 42, 49, 56, 57, 50, 43, 36, - 29, 22, 15, 23, 30, 37, 44, 51, - 58, 59, 52, 45, 38, 31, 39, 46, - 53, 60, 61, 54, 47, 55, 62, 63 -]; - -const CLV_BIAS_ESCAPE: u16 = 0x100; - -const CLV_MVY_0_BITS: &[u8] = &[ - 16, 14, 13, 13, 13, 12, 11, 11, 9, 11, 11, 12, 13, 13, 13, 14, - 16, 15, 14, 14, 14, 13, 13, 12, 10, 7, 10, 12, 13, 13, 14, 14, - 14, 15, 15, 14, 14, 14, 13, 13, 11, 10, 7, 10, 11, 13, 13, 14, - 14, 14, 15, 15, 14, 14, 13, 13, 12, 11, 10, 7, 10, 11, 12, 13, - 13, 14, 14, 15, 16, 15, 14, 12, 12, 12, 11, 10, 6, 10, 11, 12, - 12, 12, 14, 15, 16, 15, 14, 13, 13, 12, 11, 10, 9, 6, 9, 10, - 11, 12, 13, 13, 14, 15, 14, 14, 13, 12, 12, 11, 10, 8, 6, 8, - 10, 11, 12, 12, 13, 14, 14, 14, 13, 13, 13, 11, 11, 9, 7, 4, - 7, 9, 11, 11, 12, 13, 13, 14, 11, 10, 10, 9, 9, 8, 7, 5, - 1, 5, 7, 8, 9, 9, 10, 10, 11, 14, 13, 13, 12, 11, 11, 9, - 7, 4, 7, 9, 11, 11, 13, 13, 13, 14, 14, 14, 13, 12, 12, 11, - 10, 8, 6, 8, 10, 11, 12, 12, 13, 14, 14, 15, 14, 13, 13, 12, - 11, 10, 9, 7, 9, 10, 11, 12, 13, 13, 14, 15, 16, 15, 14, 12, - 12, 12, 11, 10, 6, 10, 11, 12, 12, 12, 14, 15, 16, 15, 14, 14, - 13, 13, 12, 11, 10, 7, 10, 11, 12, 13, 13, 14, 14, 15, 15, 14, - 14, 14, 13, 13, 11, 10, 7, 10, 11, 13, 13, 14, 14, 14, 15, 15, - 14, 14, 14, 13, 13, 12, 10, 7, 10, 12, 13, 13, 14, 14, 14, 15, - 16, 14, 13, 13, 13, 12, 11, 11, 9, 11, 11, 12, 13, 13, 13, 14, - 16, 6, -]; -const CLV_MVY_0_CODES: &[u16] = &[ - 0xFFFD, 0x3FE5, 0x1FD8, 0x1FC4, 0x1FBC, 0x0FCB, 0x07CF, 0x07C4, - 0x01D7, 0x07C6, 0x07CE, 0x0FCA, 0x1FBD, 0x1FC2, 0x1FD9, 0x3FE4, - 0xFFFE, 0x7FF0, 0x3FEF, 0x3FD2, 0x3FC9, 0x1FCC, 0x1FC0, 0x0FB6, - 0x03D6, 0x0070, 0x03D7, 0x0FB7, 0x1FC1, 0x1FCD, 0x3FCB, 0x3FD0, - 0x3FED, 0x7FF2, 0x7FFB, 0x3FDC, 0x3FD9, 0x3FD4, 0x1FB6, 0x1FAE, - 0x07C0, 0x03BC, 0x006D, 0x03BD, 0x07C1, 0x1FAF, 0x1FB7, 0x3FD1, - 0x3FDB, 0x3FDF, 0x7FF9, 0x7FEE, 0x3FF0, 0x3FC7, 0x1FC9, 0x1FA7, - 0x0FAD, 0x07D2, 0x03CE, 0x006C, 0x03CF, 0x07D0, 0x0FAF, 0x1FA6, - 0x1FC6, 0x3FC4, 0x3FF1, 0x7FED, 0xFFFB, 0x7FF6, 0x3FE6, 0x0FCC, - 0x0FC4, 0x0FB0, 0x07B0, 0x03C6, 0x0031, 0x03C7, 0x07B1, 0x0FB1, - 0x0FC5, 0x0FCD, 0x3FEA, 0x7FF7, 0xFFF9, 0x7FE9, 0x3FCE, 0x1FCF, - 0x1FB2, 0x0FB8, 0x07BC, 0x03D0, 0x01DA, 0x002F, 0x01DB, 0x03D1, - 0x07BE, 0x0FBA, 0x1FB4, 0x1FD0, 0x3FCD, 0x7FEB, 0x3FE1, 0x3FC1, - 0x1FD3, 0x0FC3, 0x0FBE, 0x07B6, 0x03C4, 0x00E4, 0x002D, 0x00E5, - 0x03C5, 0x07B7, 0x0FBF, 0x0FC1, 0x1FD2, 0x3FC3, 0x3FE2, 0x3FBF, - 0x1FDB, 0x1FAD, 0x1FA5, 0x07CB, 0x07BB, 0x01D5, 0x0068, 0x0008, - 0x0065, 0x01D2, 0x07B8, 0x07C8, 0x0FD0, 0x1FAA, 0x1FDA, 0x3FBC, - 0x07D4, 0x03CA, 0x03C0, 0x01D8, 0x01D0, 0x00E6, 0x0069, 0x0014, - 0x0000, 0x0015, 0x006A, 0x00E7, 0x01D1, 0x01D9, 0x03C1, 0x03CB, - 0x07D5, 0x3FBE, 0x1FDC, 0x1FAB, 0x0FD1, 0x07C9, 0x07B9, 0x01D3, - 0x0066, 0x0009, 0x0067, 0x01D4, 0x07BA, 0x07CA, 0x1FA4, 0x1FAC, - 0x1FDD, 0x3FBD, 0x3FE0, 0x3FC0, 0x1FD5, 0x0FC0, 0x0FBC, 0x07B4, - 0x03C2, 0x00E2, 0x002C, 0x00E3, 0x03C3, 0x07B5, 0x0FBD, 0x0FC2, - 0x1FD7, 0x3FC2, 0x3FE3, 0x7FEA, 0x3FCC, 0x1FCE, 0x1FB3, 0x0FB9, - 0x07BD, 0x03D2, 0x01DC, 0x0064, 0x01DD, 0x03D3, 0x07BF, 0x0FBB, - 0x1FB5, 0x1FD1, 0x3FCF, 0x7FE8, 0xFFFA, 0x7FF4, 0x3FEB, 0x0FCE, - 0x0FC6, 0x0FB2, 0x07B2, 0x03C8, 0x0030, 0x03C9, 0x07B3, 0x0FB3, - 0x0FC7, 0x0FCF, 0x3FE9, 0x7FF5, 0xFFF8, 0x7FF3, 0x3FF3, 0x3FC6, - 0x1FC8, 0x1FA8, 0x0FAC, 0x07D1, 0x03CC, 0x006B, 0x03CD, 0x07D3, - 0x0FAE, 0x1FA9, 0x1FC7, 0x3FC5, 0x3FF2, 0x7FEC, 0x7FFA, 0x3FDE, - 0x3FDA, 0x3FD7, 0x1FB9, 0x1FB0, 0x07C2, 0x03BE, 0x006E, 0x03BF, - 0x07C3, 0x1FB1, 0x1FB8, 0x3FD3, 0x3FD8, 0x3FDD, 0x7FF8, 0x7FEF, - 0x3FEE, 0x3FD6, 0x3FC8, 0x1FCB, 0x1FBE, 0x0FB5, 0x03D4, 0x006F, - 0x03D5, 0x0FB4, 0x1FBF, 0x1FCA, 0x3FCA, 0x3FD5, 0x3FEC, 0x7FF1, - 0xFFFF, 0x3FE8, 0x1FD4, 0x1FC5, 0x1FBA, 0x0FC9, 0x07CD, 0x07C7, - 0x01D6, 0x07C5, 0x07CC, 0x0FC8, 0x1FBB, 0x1FC3, 0x1FD6, 0x3FE7, - 0xFFFC, 0x002E, -]; -const CLV_MVY_0_SYMS: &[u16] = &[ - 0xF8F8, 0xF9F8, 0xFAF8, 0xFBF8, 0xFCF8, 0xFDF8, 0xFEF8, 0xFFF8, - 0x00F8, 0x01F8, 0x02F8, 0x03F8, 0x04F8, 0x05F8, 0x06F8, 0x07F8, - 0x08F8, 0xF8F9, 0xF9F9, 0xFAF9, 0xFBF9, 0xFCF9, 0xFDF9, 0xFEF9, - 0xFFF9, 0x00F9, 0x01F9, 0x02F9, 0x03F9, 0x04F9, 0x05F9, 0x06F9, - 0x07F9, 0x08F9, 0xF8FA, 0xF9FA, 0xFAFA, 0xFBFA, 0xFCFA, 0xFDFA, - 0xFEFA, 0xFFFA, 0x00FA, 0x01FA, 0x02FA, 0x03FA, 0x04FA, 0x05FA, - 0x06FA, 0x07FA, 0x08FA, 0xF8FB, 0xF9FB, 0xFAFB, 0xFBFB, 0xFCFB, - 0xFDFB, 0xFEFB, 0xFFFB, 0x00FB, 0x01FB, 0x02FB, 0x03FB, 0x04FB, - 0x05FB, 0x06FB, 0x07FB, 0x08FB, 0xF8FC, 0xF9FC, 0xFAFC, 0xFBFC, - 0xFCFC, 0xFDFC, 0xFEFC, 0xFFFC, 0x00FC, 0x01FC, 0x02FC, 0x03FC, - 0x04FC, 0x05FC, 0x06FC, 0x07FC, 0x08FC, 0xF8FD, 0xF9FD, 0xFAFD, - 0xFBFD, 0xFCFD, 0xFDFD, 0xFEFD, 0xFFFD, 0x00FD, 0x01FD, 0x02FD, - 0x03FD, 0x04FD, 0x05FD, 0x06FD, 0x07FD, 0x08FD, 0xF8FE, 0xF9FE, - 0xFAFE, 0xFBFE, 0xFCFE, 0xFDFE, 0xFEFE, 0xFFFE, 0x00FE, 0x01FE, - 0x02FE, 0x03FE, 0x04FE, 0x05FE, 0x06FE, 0x07FE, 0x08FE, 0xF8FF, - 0xF9FF, 0xFAFF, 0xFBFF, 0xFCFF, 0xFDFF, 0xFEFF, 0xFFFF, 0x00FF, - 0x01FF, 0x02FF, 0x03FF, 0x04FF, 0x05FF, 0x06FF, 0x07FF, 0x08FF, - 0xF800, 0xF900, 0xFA00, 0xFB00, 0xFC00, 0xFD00, 0xFE00, 0xFF00, - 0x0000, 0x0100, 0x0200, 0x0300, 0x0400, 0x0500, 0x0600, 0x0700, - 0x0800, 0xF801, 0xF901, 0xFA01, 0xFB01, 0xFC01, 0xFD01, 0xFE01, - 0xFF01, 0x0001, 0x0101, 0x0201, 0x0301, 0x0401, 0x0501, 0x0601, - 0x0701, 0x0801, 0xF802, 0xF902, 0xFA02, 0xFB02, 0xFC02, 0xFD02, - 0xFE02, 0xFF02, 0x0002, 0x0102, 0x0202, 0x0302, 0x0402, 0x0502, - 0x0602, 0x0702, 0x0802, 0xF803, 0xF903, 0xFA03, 0xFB03, 0xFC03, - 0xFD03, 0xFE03, 0xFF03, 0x0003, 0x0103, 0x0203, 0x0303, 0x0403, - 0x0503, 0x0603, 0x0703, 0x0803, 0xF804, 0xF904, 0xFA04, 0xFB04, - 0xFC04, 0xFD04, 0xFE04, 0xFF04, 0x0004, 0x0104, 0x0204, 0x0304, - 0x0404, 0x0504, 0x0604, 0x0704, 0x0804, 0xF805, 0xF905, 0xFA05, - 0xFB05, 0xFC05, 0xFD05, 0xFE05, 0xFF05, 0x0005, 0x0105, 0x0205, - 0x0305, 0x0405, 0x0505, 0x0605, 0x0705, 0x0805, 0xF806, 0xF906, - 0xFA06, 0xFB06, 0xFC06, 0xFD06, 0xFE06, 0xFF06, 0x0006, 0x0106, - 0x0206, 0x0306, 0x0406, 0x0506, 0x0606, 0x0706, 0x0806, 0xF807, - 0xF907, 0xFA07, 0xFB07, 0xFC07, 0xFD07, 0xFE07, 0xFF07, 0x0007, - 0x0107, 0x0207, 0x0307, 0x0407, 0x0507, 0x0607, 0x0707, 0x0807, - 0xF808, 0xF908, 0xFA08, 0xFB08, 0xFC08, 0xFD08, 0xFE08, 0xFF08, - 0x0008, 0x0108, 0x0208, 0x0308, 0x0408, 0x0508, 0x0608, 0x0708, - 0x0808, 0x0909, -]; -const CLV_MVY_0_ESCAPE: u16 = 0x0909; - -const CLV_FLAGSY_0_BITS: &[u8] = &[ - 3, 4, 4, 4, 4, 4, 6, 5, 4, 7, 4, 5, 4, 7, 5, 2, -]; -const CLV_FLAGSY_0_CODES: &[u16] = &[ - 0x0002, 0x0009, 0x000B, 0x0006, 0x000C, 0x0007, 0x003E, 0x001C, - 0x000D, 0x007E, 0x000A, 0x001D, 0x0008, 0x007F, 0x001E, 0x0000, -]; - -const CLV_MVY_1_BITS: &[u8] = &[ - 15, 15, 15, 15, 14, 14, 13, 13, 11, 9, 11, 13, 13, 14, 14, 15, - 15, 15, 15, 15, 14, 14, 13, 13, 12, 12, 12, 10, 9, 10, 12, 12, - 12, 13, 13, 14, 14, 15, 15, 15, 14, 14, 13, 13, 13, 12, 11, 8, - 11, 12, 13, 13, 13, 14, 14, 15, 15, 14, 14, 14, 14, 13, 12, 12, - 12, 10, 8, 10, 12, 12, 12, 13, 14, 14, 14, 14, 15, 14, 14, 13, - 13, 12, 12, 11, 10, 8, 10, 11, 12, 12, 13, 13, 14, 14, 15, 14, - 14, 13, 13, 13, 12, 12, 11, 9, 7, 9, 11, 12, 12, 13, 13, 13, - 14, 14, 14, 14, 13, 13, 13, 12, 11, 10, 9, 7, 9, 10, 11, 12, - 13, 13, 13, 14, 14, 14, 13, 13, 12, 12, 11, 11, 10, 8, 7, 8, - 10, 11, 11, 12, 12, 13, 13, 14, 13, 13, 13, 12, 11, 11, 10, 9, - 6, 4, 6, 9, 10, 11, 12, 12, 13, 13, 13, 12, 11, 10, 10, 10, - 9, 9, 7, 5, 1, 5, 7, 9, 9, 10, 10, 10, 11, 12, 13, 13, - 13, 12, 11, 11, 10, 9, 6, 4, 6, 9, 10, 11, 11, 12, 13, 13, - 13, 14, 13, 13, 12, 12, 11, 11, 10, 8, 7, 8, 10, 11, 11, 12, - 12, 13, 13, 14, 14, 14, 13, 13, 13, 12, 11, 10, 9, 7, 9, 10, - 11, 12, 13, 13, 13, 14, 14, 14, 14, 13, 13, 13, 12, 12, 11, 9, - 7, 9, 11, 12, 12, 13, 13, 13, 14, 14, 15, 14, 14, 13, 13, 12, - 12, 11, 10, 8, 10, 11, 12, 12, 13, 13, 14, 14, 15, 14, 14, 14, - 14, 13, 12, 12, 12, 10, 8, 10, 12, 12, 12, 13, 14, 14, 14, 14, - 15, 15, 14, 14, 13, 13, 13, 12, 11, 8, 11, 12, 13, 13, 13, 14, - 14, 15, 15, 15, 14, 14, 13, 13, 12, 12, 12, 10, 9, 10, 12, 12, - 12, 13, 13, 14, 14, 15, 15, 15, 15, 15, 14, 14, 13, 13, 11, 9, - 11, 13, 13, 14, 14, 15, 15, 15, 15, 5, -]; -const CLV_MVY_1_CODES: &[u16] = &[ - 0x7FF9, 0x7FF6, 0x7FEB, 0x7FE3, 0x3FCF, 0x3FB3, 0x1FBD, 0x1FA1, - 0x07AD, 0x01CE, 0x07AF, 0x1FA0, 0x1FBB, 0x3FB0, 0x3FCC, 0x7FE2, - 0x7FE9, 0x7FF4, 0x7FFB, 0x7FF1, 0x3FE7, 0x3FBD, 0x1FA5, 0x1F9B, - 0x0FB4, 0x0FAF, 0x0FAA, 0x03CC, 0x01CD, 0x03CD, 0x0FAB, 0x0FAD, - 0x0FB1, 0x1F9C, 0x1FA3, 0x3FBE, 0x3FE6, 0x7FF0, 0x7FFC, 0x7FE5, - 0x3FB5, 0x3FAE, 0x1FB4, 0x1FAA, 0x1F97, 0x0F85, 0x07A2, 0x00DD, - 0x07A3, 0x0F86, 0x1F99, 0x1FAD, 0x1FB2, 0x3FAC, 0x3FB7, 0x7FE4, - 0x7FFD, 0x3FEA, 0x3FD8, 0x3FC3, 0x3FBB, 0x1FC9, 0x0FBC, 0x0F97, - 0x0F8F, 0x03B8, 0x00DA, 0x03B9, 0x0F90, 0x0F98, 0x0FB9, 0x1FC6, - 0x3FBA, 0x3FC0, 0x3FD9, 0x3FEB, 0x7FEF, 0x3FEE, 0x3FD7, 0x1FC3, - 0x1F96, 0x0FC0, 0x0FA8, 0x07AA, 0x03BE, 0x00D9, 0x03BF, 0x07AB, - 0x0FA7, 0x0FBF, 0x1F98, 0x1FC5, 0x3FD6, 0x3FEF, 0x7FEE, 0x3FDC, - 0x3FCA, 0x1FBF, 0x1F8B, 0x1F87, 0x0FA2, 0x0F94, 0x07A5, 0x01D4, - 0x0069, 0x01D5, 0x07A6, 0x0F95, 0x0FA3, 0x1F89, 0x1F8D, 0x1FC0, - 0x3FC6, 0x3FDE, 0x3FE0, 0x3FD3, 0x1FB8, 0x1F8F, 0x1F84, 0x0F89, - 0x07BC, 0x03C6, 0x01C6, 0x0067, 0x01C7, 0x03C7, 0x07BD, 0x0F87, - 0x1F82, 0x1F8A, 0x1FB6, 0x3FD1, 0x3FE2, 0x3FC5, 0x1FCE, 0x1FAE, - 0x0FB5, 0x0F8B, 0x07B4, 0x07B0, 0x03B4, 0x00DE, 0x0064, 0x00DF, - 0x03B5, 0x07B1, 0x07B5, 0x0F8C, 0x0FB6, 0x1FAF, 0x1FD1, 0x3FCB, - 0x1FD3, 0x1FCC, 0x1FA7, 0x0F9B, 0x07BE, 0x079C, 0x03C0, 0x01C8, - 0x002E, 0x0008, 0x002F, 0x01C9, 0x03C1, 0x079D, 0x0F82, 0x0F9A, - 0x1FA9, 0x1FCA, 0x1FD4, 0x0F9F, 0x07B6, 0x03C8, 0x03B2, 0x03B0, - 0x01D6, 0x01D0, 0x006A, 0x0014, 0x0000, 0x0015, 0x006B, 0x01D1, - 0x01D7, 0x03B1, 0x03B3, 0x03C9, 0x07B7, 0x0FA0, 0x1FD5, 0x1FCB, - 0x1FAB, 0x0F9C, 0x07BF, 0x079E, 0x03C2, 0x01CA, 0x0030, 0x0009, - 0x0031, 0x01CB, 0x03C3, 0x079F, 0x07C0, 0x0F9D, 0x1FAC, 0x1FCD, - 0x1FD2, 0x3FC8, 0x1FD0, 0x1FB0, 0x0FB7, 0x0F8D, 0x07B8, 0x07B2, - 0x03B6, 0x00E0, 0x0065, 0x00E1, 0x03B7, 0x07B3, 0x07B9, 0x0F8E, - 0x0FB8, 0x1FB1, 0x1FCF, 0x3FC9, 0x3FE1, 0x3FD2, 0x1FB7, 0x1F8E, - 0x1F83, 0x0F88, 0x07BA, 0x03C4, 0x01C4, 0x0066, 0x01C5, 0x03C5, - 0x07BB, 0x0F8A, 0x1F85, 0x1F90, 0x1FB9, 0x3FD0, 0x3FE3, 0x3FDD, - 0x3FC7, 0x1FC1, 0x1F91, 0x1F88, 0x0FA4, 0x0F96, 0x07A7, 0x01D2, - 0x0068, 0x01D3, 0x07A4, 0x0F93, 0x0FA1, 0x1F86, 0x1F8C, 0x1FBE, - 0x3FC4, 0x3FDF, 0x7FED, 0x3FEC, 0x3FD4, 0x1FC4, 0x1F92, 0x0FBD, - 0x0FA5, 0x07A8, 0x03BC, 0x00D8, 0x03BD, 0x07A9, 0x0FA6, 0x0FBE, - 0x1F93, 0x1FC2, 0x3FD5, 0x3FED, 0x7FEC, 0x3FE8, 0x3FDB, 0x3FC1, - 0x3FB9, 0x1FC7, 0x0FBA, 0x0F9E, 0x0F91, 0x03BA, 0x00DB, 0x03BB, - 0x0F92, 0x0F99, 0x0FBB, 0x1FC8, 0x3FB8, 0x3FC2, 0x3FDA, 0x3FE9, - 0x7FFF, 0x7FE7, 0x3FB6, 0x3FAF, 0x1FB3, 0x1FA6, 0x1F94, 0x0F83, - 0x07A0, 0x00DC, 0x07A1, 0x0F84, 0x1F95, 0x1FA8, 0x1FB5, 0x3FAD, - 0x3FB4, 0x7FE6, 0x7FFE, 0x7FF3, 0x3FE5, 0x3FBC, 0x1FA4, 0x1F9D, - 0x0FB2, 0x0FAE, 0x0FA9, 0x03CA, 0x01CC, 0x03CB, 0x0FAC, 0x0FB0, - 0x0FB3, 0x1F9A, 0x1FA2, 0x3FBF, 0x3FE4, 0x7FF2, 0x7FF8, 0x7FF5, - 0x7FEA, 0x7FE0, 0x3FCD, 0x3FB1, 0x1FBA, 0x1F9F, 0x07AE, 0x01CF, - 0x07AC, 0x1F9E, 0x1FBC, 0x3FB2, 0x3FCE, 0x7FE1, 0x7FE8, 0x7FF7, - 0x7FFA, 0x0016, -]; -const CLV_MVY_1_SYMS: &[u16] = &[ - 0xF7F7, 0xF8F7, 0xF9F7, 0xFAF7, 0xFBF7, 0xFCF7, 0xFDF7, 0xFEF7, - 0xFFF7, 0x00F7, 0x01F7, 0x02F7, 0x03F7, 0x04F7, 0x05F7, 0x06F7, - 0x07F7, 0x08F7, 0x09F7, 0xF7F8, 0xF8F8, 0xF9F8, 0xFAF8, 0xFBF8, - 0xFCF8, 0xFDF8, 0xFEF8, 0xFFF8, 0x00F8, 0x01F8, 0x02F8, 0x03F8, - 0x04F8, 0x05F8, 0x06F8, 0x07F8, 0x08F8, 0x09F8, 0xF7F9, 0xF8F9, - 0xF9F9, 0xFAF9, 0xFBF9, 0xFCF9, 0xFDF9, 0xFEF9, 0xFFF9, 0x00F9, - 0x01F9, 0x02F9, 0x03F9, 0x04F9, 0x05F9, 0x06F9, 0x07F9, 0x08F9, - 0x09F9, 0xF7FA, 0xF8FA, 0xF9FA, 0xFAFA, 0xFBFA, 0xFCFA, 0xFDFA, - 0xFEFA, 0xFFFA, 0x00FA, 0x01FA, 0x02FA, 0x03FA, 0x04FA, 0x05FA, - 0x06FA, 0x07FA, 0x08FA, 0x09FA, 0xF7FB, 0xF8FB, 0xF9FB, 0xFAFB, - 0xFBFB, 0xFCFB, 0xFDFB, 0xFEFB, 0xFFFB, 0x00FB, 0x01FB, 0x02FB, - 0x03FB, 0x04FB, 0x05FB, 0x06FB, 0x07FB, 0x08FB, 0x09FB, 0xF7FC, - 0xF8FC, 0xF9FC, 0xFAFC, 0xFBFC, 0xFCFC, 0xFDFC, 0xFEFC, 0xFFFC, - 0x00FC, 0x01FC, 0x02FC, 0x03FC, 0x04FC, 0x05FC, 0x06FC, 0x07FC, - 0x08FC, 0x09FC, 0xF7FD, 0xF8FD, 0xF9FD, 0xFAFD, 0xFBFD, 0xFCFD, - 0xFDFD, 0xFEFD, 0xFFFD, 0x00FD, 0x01FD, 0x02FD, 0x03FD, 0x04FD, - 0x05FD, 0x06FD, 0x07FD, 0x08FD, 0x09FD, 0xF7FE, 0xF8FE, 0xF9FE, - 0xFAFE, 0xFBFE, 0xFCFE, 0xFDFE, 0xFEFE, 0xFFFE, 0x00FE, 0x01FE, - 0x02FE, 0x03FE, 0x04FE, 0x05FE, 0x06FE, 0x07FE, 0x08FE, 0x09FE, - 0xF7FF, 0xF8FF, 0xF9FF, 0xFAFF, 0xFBFF, 0xFCFF, 0xFDFF, 0xFEFF, - 0xFFFF, 0x00FF, 0x01FF, 0x02FF, 0x03FF, 0x04FF, 0x05FF, 0x06FF, - 0x07FF, 0x08FF, 0x09FF, 0xF700, 0xF800, 0xF900, 0xFA00, 0xFB00, - 0xFC00, 0xFD00, 0xFE00, 0xFF00, 0x0000, 0x0100, 0x0200, 0x0300, - 0x0400, 0x0500, 0x0600, 0x0700, 0x0800, 0x0900, 0xF701, 0xF801, - 0xF901, 0xFA01, 0xFB01, 0xFC01, 0xFD01, 0xFE01, 0xFF01, 0x0001, - 0x0101, 0x0201, 0x0301, 0x0401, 0x0501, 0x0601, 0x0701, 0x0801, - 0x0901, 0xF702, 0xF802, 0xF902, 0xFA02, 0xFB02, 0xFC02, 0xFD02, - 0xFE02, 0xFF02, 0x0002, 0x0102, 0x0202, 0x0302, 0x0402, 0x0502, - 0x0602, 0x0702, 0x0802, 0x0902, 0xF703, 0xF803, 0xF903, 0xFA03, - 0xFB03, 0xFC03, 0xFD03, 0xFE03, 0xFF03, 0x0003, 0x0103, 0x0203, - 0x0303, 0x0403, 0x0503, 0x0603, 0x0703, 0x0803, 0x0903, 0xF704, - 0xF804, 0xF904, 0xFA04, 0xFB04, 0xFC04, 0xFD04, 0xFE04, 0xFF04, - 0x0004, 0x0104, 0x0204, 0x0304, 0x0404, 0x0504, 0x0604, 0x0704, - 0x0804, 0x0904, 0xF705, 0xF805, 0xF905, 0xFA05, 0xFB05, 0xFC05, - 0xFD05, 0xFE05, 0xFF05, 0x0005, 0x0105, 0x0205, 0x0305, 0x0405, - 0x0505, 0x0605, 0x0705, 0x0805, 0x0905, 0xF706, 0xF806, 0xF906, - 0xFA06, 0xFB06, 0xFC06, 0xFD06, 0xFE06, 0xFF06, 0x0006, 0x0106, - 0x0206, 0x0306, 0x0406, 0x0506, 0x0606, 0x0706, 0x0806, 0x0906, - 0xF707, 0xF807, 0xF907, 0xFA07, 0xFB07, 0xFC07, 0xFD07, 0xFE07, - 0xFF07, 0x0007, 0x0107, 0x0207, 0x0307, 0x0407, 0x0507, 0x0607, - 0x0707, 0x0807, 0x0907, 0xF708, 0xF808, 0xF908, 0xFA08, 0xFB08, - 0xFC08, 0xFD08, 0xFE08, 0xFF08, 0x0008, 0x0108, 0x0208, 0x0308, - 0x0408, 0x0508, 0x0608, 0x0708, 0x0808, 0x0908, 0xF709, 0xF809, - 0xF909, 0xFA09, 0xFB09, 0xFC09, 0xFD09, 0xFE09, 0xFF09, 0x0009, - 0x0109, 0x0209, 0x0309, 0x0409, 0x0509, 0x0609, 0x0709, 0x0809, - 0x0909, 0x0A0A, -]; -const CLV_MVY_1_ESCAPE: u16 = 0x0A0A; - -const CLV_BIASY_1_BITS: &[u8] = &[ - 16, 15, 15, 15, 15, 15, 15, 15, 15, 15, 14, 14, 14, 13, 13, 13, - 13, 13, 13, 13, 13, 12, 12, 12, 12, 11, 11, 11, 10, 10, 10, 9, - 8, 8, 7, 7, 5, 2, 1, 3, 5, 7, 7, 8, 9, 9, 10, 10, - 10, 11, 11, 12, 12, 12, 12, 12, 13, 13, 13, 13, 13, 13, 13, 13, - 14, 14, 14, 14, 15, 15, 15, 15, 15, 15, 15, 15, 16, 12, -]; -const CLV_BIASY_1_CODES: &[u16] = &[ - 0xFFFE, 0x7FFE, 0x7FFC, 0x7FFA, 0x7FF6, 0x7FF7, 0x7FF3, 0x7FF2, - 0x7FEF, 0x7FEE, 0x3FF5, 0x3FF3, 0x3FF1, 0x1FF7, 0x1FF5, 0x1FF2, - 0x1FF0, 0x1FEE, 0x1FEC, 0x1FEA, 0x1FE8, 0x0FF2, 0x0FF0, 0x0FEE, - 0x0FEB, 0x07F4, 0x07F3, 0x07F1, 0x03F7, 0x03F5, 0x03F3, 0x01F7, - 0x00FA, 0x00F8, 0x007A, 0x0078, 0x001C, 0x0002, 0x0000, 0x0006, - 0x001D, 0x0079, 0x007B, 0x00F9, 0x01F6, 0x01F8, 0x03F2, 0x03F4, - 0x03F6, 0x07F0, 0x07F2, 0x0FEA, 0x0FEC, 0x0FEF, 0x0FF1, 0x0FF3, - 0x1FE9, 0x1FEB, 0x1FED, 0x1FEF, 0x1FF1, 0x1FF3, 0x1FF4, 0x1FF6, - 0x3FF0, 0x3FF2, 0x3FF4, 0x3FF6, 0x7FF0, 0x7FF1, 0x7FF4, 0x7FF8, - 0x7FF5, 0x7FF9, 0x7FFB, 0x7FFD, 0xFFFF, 0x0FED, -]; -const CLV_BIASY_1_SYMS: &[u16] = &[ - 0xFF68, 0xFF6C, 0xFF70, 0xFF74, 0xFF78, 0xFF7C, 0xFF80, 0xFF84, - 0xFF88, 0xFF8C, 0xFF90, 0xFF94, 0xFF98, 0xFF9C, 0xFFA0, 0xFFA4, - 0xFFA8, 0xFFAC, 0xFFB0, 0xFFB4, 0xFFB8, 0xFFBC, 0xFFC0, 0xFFC4, - 0xFFC8, 0xFFCC, 0xFFD0, 0xFFD4, 0xFFD8, 0xFFDC, 0xFFE0, 0xFFE4, - 0xFFE8, 0xFFEC, 0xFFF0, 0xFFF4, 0xFFF8, 0xFFFC, 0x0000, 0x0004, - 0x0008, 0x000C, 0x0010, 0x0014, 0x0018, 0x001C, 0x0020, 0x0024, - 0x0028, 0x002C, 0x0030, 0x0034, 0x0038, 0x003C, 0x0040, 0x0044, - 0x0048, 0x004C, 0x0050, 0x0054, 0x0058, 0x005C, 0x0060, 0x0064, - 0x0068, 0x006C, 0x0070, 0x0074, 0x0078, 0x007C, 0x0080, 0x0084, - 0x0088, 0x008C, 0x0090, 0x0094, 0x0098, 0x0100, -]; - -const CLV_FLAGSY_1_BITS: &[u8] = &[ - 2, 4, 4, 3, 4, 4, 7, 6, 4, 6, 4, 6, 4, 8, 8, 3, -]; -const CLV_FLAGSY_1_CODES: &[u16] = &[ - 0x0000, 0x000A, 0x000C, 0x0003, 0x000B, 0x0009, 0x007E, 0x003D, - 0x000D, 0x003E, 0x000E, 0x003C, 0x0008, 0x00FE, 0x00FF, 0x0002, -]; - -const CLV_MVY_2_BITS: &[u8] = &[ - 16, 16, 15, 15, 15, 15, 15, 15, 15, 14, 14, 14, 13, 13, 12, 11, - 12, 13, 13, 14, 14, 14, 15, 15, 15, 15, 15, 15, 15, 16, 16, 16, - 15, 15, 15, 15, 15, 14, 14, 14, 14, 13, 13, 13, 13, 11, 10, 11, - 13, 13, 13, 13, 14, 14, 14, 14, 15, 15, 15, 15, 15, 16, 16, 15, - 15, 15, 15, 14, 14, 14, 14, 14, 14, 13, 13, 13, 11, 10, 11, 13, - 13, 13, 14, 14, 14, 14, 14, 14, 15, 15, 15, 15, 16, 16, 15, 15, - 15, 14, 14, 14, 14, 14, 14, 13, 13, 13, 12, 11, 9, 11, 12, 13, - 13, 13, 14, 14, 14, 14, 14, 14, 15, 15, 15, 16, 16, 15, 15, 14, - 14, 13, 13, 13, 13, 13, 13, 13, 12, 11, 11, 9, 11, 11, 12, 13, - 13, 13, 13, 13, 13, 13, 14, 14, 14, 15, 16, 16, 15, 15, 15, 14, - 13, 13, 13, 13, 13, 13, 13, 12, 11, 11, 9, 11, 11, 12, 13, 13, - 13, 13, 13, 13, 13, 14, 15, 15, 15, 16, 16, 15, 15, 15, 15, 14, - 14, 13, 13, 13, 12, 12, 12, 11, 11, 9, 11, 11, 12, 12, 12, 13, - 13, 13, 14, 14, 15, 15, 15, 15, 16, 16, 15, 15, 14, 14, 14, 13, - 13, 13, 12, 12, 12, 12, 11, 10, 8, 10, 11, 12, 12, 12, 12, 13, - 13, 13, 14, 14, 14, 15, 15, 16, 16, 15, 14, 14, 14, 13, 13, 13, - 13, 12, 12, 12, 11, 11, 10, 8, 10, 11, 11, 12, 12, 12, 13, 13, - 13, 13, 14, 14, 14, 15, 16, 15, 15, 14, 14, 13, 13, 13, 13, 13, - 12, 12, 12, 11, 10, 9, 8, 9, 10, 11, 12, 12, 12, 13, 13, 13, - 13, 13, 14, 14, 15, 15, 15, 15, 14, 14, 13, 13, 13, 13, 13, 12, - 12, 11, 11, 10, 10, 7, 10, 10, 11, 11, 12, 12, 13, 13, 13, 13, - 13, 14, 14, 15, 15, 14, 14, 14, 14, 13, 13, 12, 12, 12, 12, 12, - 11, 11, 10, 9, 7, 9, 10, 11, 11, 12, 12, 12, 12, 12, 13, 13, - 14, 14, 14, 14, 15, 13, 13, 13, 13, 13, 12, 12, 12, 11, 11, 11, - 11, 10, 8, 7, 8, 10, 11, 11, 11, 11, 12, 12, 12, 13, 13, 13, - 13, 13, 15, 14, 14, 14, 13, 13, 12, 12, 12, 11, 11, 11, 10, 10, - 9, 8, 6, 8, 9, 10, 10, 11, 11, 11, 12, 12, 12, 13, 13, 14, - 14, 14, 16, 13, 13, 13, 12, 12, 12, 11, 11, 11, 10, 9, 9, 8, - 6, 4, 6, 8, 9, 9, 10, 11, 11, 11, 12, 12, 12, 13, 13, 13, - 16, 12, 12, 12, 12, 11, 11, 10, 10, 9, 9, 8, 8, 8, 7, 4, - 2, 4, 7, 8, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 12, 12, - 16, 13, 13, 13, 12, 12, 12, 11, 11, 11, 10, 9, 9, 8, 6, 4, - 6, 8, 9, 9, 10, 11, 11, 11, 12, 12, 12, 13, 13, 13, 16, 14, - 14, 14, 13, 13, 12, 12, 12, 11, 11, 11, 10, 10, 9, 8, 6, 8, - 9, 10, 10, 11, 11, 11, 12, 12, 12, 13, 13, 14, 14, 14, 15, 13, - 13, 13, 13, 13, 12, 12, 12, 11, 11, 11, 11, 10, 8, 7, 8, 10, - 11, 11, 11, 11, 12, 12, 12, 13, 13, 13, 13, 13, 15, 14, 14, 14, - 14, 13, 13, 12, 12, 12, 12, 12, 11, 11, 10, 9, 7, 9, 10, 11, - 11, 12, 12, 12, 12, 12, 13, 13, 14, 14, 14, 14, 15, 15, 14, 14, - 13, 13, 13, 13, 13, 12, 12, 11, 11, 10, 10, 7, 10, 10, 11, 11, - 12, 12, 13, 13, 13, 13, 13, 14, 14, 15, 15, 15, 15, 14, 14, 13, - 13, 13, 13, 13, 12, 12, 12, 11, 10, 9, 8, 9, 10, 11, 12, 12, - 12, 13, 13, 13, 13, 13, 14, 14, 15, 15, 16, 15, 14, 14, 14, 13, - 13, 13, 13, 12, 12, 12, 11, 11, 10, 8, 10, 11, 11, 12, 12, 12, - 13, 13, 13, 13, 14, 14, 14, 15, 16, 16, 15, 15, 14, 14, 14, 13, - 13, 13, 12, 12, 12, 12, 11, 10, 8, 10, 11, 12, 12, 12, 12, 13, - 13, 13, 14, 14, 14, 15, 15, 16, 16, 15, 15, 15, 15, 14, 14, 13, - 13, 13, 12, 12, 12, 11, 11, 9, 11, 11, 12, 12, 12, 13, 13, 13, - 14, 14, 15, 15, 15, 15, 16, 16, 15, 15, 15, 14, 13, 13, 13, 13, - 13, 13, 13, 12, 11, 11, 9, 11, 11, 12, 13, 13, 13, 13, 13, 13, - 13, 14, 15, 15, 15, 16, 16, 15, 15, 14, 14, 13, 13, 13, 13, 13, - 13, 13, 12, 11, 11, 9, 11, 11, 12, 13, 13, 13, 13, 13, 13, 13, - 14, 14, 14, 15, 16, 16, 15, 15, 15, 14, 14, 14, 14, 14, 14, 13, - 13, 13, 12, 11, 9, 11, 12, 13, 13, 13, 14, 14, 14, 14, 14, 14, - 15, 15, 15, 16, 16, 15, 15, 15, 15, 14, 14, 14, 14, 14, 14, 13, - 13, 13, 11, 10, 11, 13, 13, 13, 14, 14, 14, 14, 14, 14, 15, 15, - 15, 15, 16, 16, 15, 15, 15, 15, 15, 14, 14, 14, 14, 13, 13, 13, - 13, 12, 10, 12, 13, 13, 13, 13, 14, 14, 14, 14, 15, 15, 15, 15, - 15, 16, 16, 16, 15, 15, 15, 15, 15, 15, 15, 14, 14, 14, 13, 13, - 12, 11, 12, 13, 13, 14, 14, 14, 15, 15, 15, 15, 15, 15, 15, 16, - 16, 7, -]; -const CLV_MVY_2_CODES: &[u16] = &[ - 0xFFF5, 0xFFD8, 0x7FE6, 0x7FB9, 0x7FB5, 0x7FB0, 0x7FA0, 0x7F99, - 0x7F93, 0x3FAA, 0x3F9B, 0x3F52, 0x1F76, 0x1EF5, 0x0F0B, 0x06F0, - 0x0F08, 0x1EF0, 0x1F75, 0x3F53, 0x3F9A, 0x3FA8, 0x7F94, 0x7F98, - 0x7F9E, 0x7FAE, 0x7FAF, 0x7FB7, 0x7FE9, 0xFFDB, 0xFFF6, 0xFFFD, - 0x7FD9, 0x7FCC, 0x7FC6, 0x7F9C, 0x7F80, 0x3FA5, 0x3F80, 0x3F6A, - 0x3F31, 0x1F54, 0x1F40, 0x1F11, 0x1F05, 0x075E, 0x0360, 0x075F, - 0x1F07, 0x1F12, 0x1F43, 0x1F56, 0x3F33, 0x3F68, 0x3F83, 0x3FA6, - 0x7F7F, 0x7F9A, 0x7FC9, 0x7FCA, 0x7FDB, 0xFFF8, 0xFFEC, 0x7FDE, - 0x7FE2, 0x7FA6, 0x7F6F, 0x3FA1, 0x3F8D, 0x3F5C, 0x3F39, 0x3F21, - 0x3F18, 0x1F58, 0x1F1E, 0x1EF1, 0x0740, 0x035A, 0x0741, 0x1EF2, - 0x1F1F, 0x1F5A, 0x3F19, 0x3F22, 0x3F3B, 0x3F5E, 0x3F8E, 0x3FA3, - 0x7F6B, 0x7FA2, 0x7FE3, 0x7FE1, 0xFFEE, 0xFFFC, 0x7FC3, 0x7FBC, - 0x7F71, 0x3F96, 0x3F86, 0x3F7A, 0x3F72, 0x3F59, 0x3F46, 0x1F0A, - 0x1EFD, 0x1ED0, 0x0F02, 0x0712, 0x019F, 0x0713, 0x0F03, 0x1ED3, - 0x1EFF, 0x1F09, 0x3F4A, 0x3F5A, 0x3F76, 0x3F7B, 0x3F87, 0x3F97, - 0x7F73, 0x7FBB, 0x7FBF, 0xFFFB, 0xFFEB, 0x7F88, 0x7F5C, 0x3F7C, - 0x3F3C, 0x1F60, 0x1F4C, 0x1F14, 0x1F0C, 0x1F00, 0x1EF9, 0x1ED8, - 0x0F42, 0x075A, 0x0714, 0x0186, 0x0715, 0x075B, 0x0F43, 0x1EDA, - 0x1EFA, 0x1F01, 0x1F0E, 0x1F15, 0x1F4D, 0x1F62, 0x3F3D, 0x3F7D, - 0x3FAC, 0x7F86, 0xFFE8, 0xFFE7, 0x7FA7, 0x7F8C, 0x7F68, 0x3F9C, - 0x1F7C, 0x1F6C, 0x1F69, 0x1EEC, 0x1EE4, 0x1ED5, 0x1ECD, 0x0EF0, - 0x0752, 0x06F6, 0x018C, 0x06F7, 0x0753, 0x0EF1, 0x1ECE, 0x1ED6, - 0x1EE5, 0x1EED, 0x1F6A, 0x1F6E, 0x1F7D, 0x3F9F, 0x7F66, 0x7F8A, - 0x7FA5, 0xFFE6, 0xFFDC, 0x7FDA, 0x7FC0, 0x7FAC, 0x7F61, 0x3F42, - 0x3F0E, 0x1F45, 0x1F2C, 0x1ECA, 0x0F27, 0x0EF6, 0x0EEE, 0x072E, - 0x06F4, 0x0185, 0x06F5, 0x072F, 0x0EEF, 0x0EF7, 0x0F28, 0x1ECB, - 0x1F2F, 0x1F46, 0x3F0F, 0x3F40, 0x7F5F, 0x7FB4, 0x7FC2, 0x7FDC, - 0xFFDA, 0xFFE0, 0x7F72, 0x7F63, 0x3F70, 0x3F1C, 0x3F16, 0x1F82, - 0x1EE2, 0x1EB2, 0x0F4C, 0x0EFC, 0x0EE0, 0x0ED3, 0x0722, 0x036C, - 0x00BF, 0x036D, 0x0723, 0x0ECC, 0x0EE1, 0x0EFF, 0x0F4D, 0x1EB3, - 0x1EE3, 0x1F83, 0x3F17, 0x3F1F, 0x3F75, 0x7F65, 0x7F70, 0xFFE2, - 0xFFD7, 0x7F76, 0x3F2B, 0x3F13, 0x3F0A, 0x1F33, 0x1F23, 0x1EB4, - 0x1EA0, 0x0F46, 0x0F32, 0x0F1A, 0x0756, 0x0728, 0x0356, 0x00B0, - 0x0357, 0x0729, 0x0757, 0x0F1B, 0x0F33, 0x0F47, 0x1EA1, 0x1EB5, - 0x1F20, 0x1F30, 0x3F08, 0x3F10, 0x3F28, 0x7F77, 0xFFD5, 0x7FD5, - 0x7FD1, 0x3F5D, 0x3F25, 0x1F34, 0x1F24, 0x1EE8, 0x1EBC, 0x1EA8, - 0x0F3A, 0x0F2E, 0x0EE2, 0x071C, 0x0374, 0x01A0, 0x00AE, 0x01A1, - 0x0375, 0x071D, 0x0EE3, 0x0F2F, 0x0F3C, 0x1EA9, 0x1EBD, 0x1EE9, - 0x1F25, 0x1F36, 0x3F24, 0x3F61, 0x7FCE, 0x7FD2, 0x7F91, 0x7F7D, - 0x3F6C, 0x3F34, 0x1F72, 0x1F61, 0x1EDD, 0x1EC5, 0x1EA5, 0x0F05, - 0x0ED6, 0x0750, 0x073E, 0x0368, 0x034A, 0x0052, 0x034B, 0x0369, - 0x073F, 0x0751, 0x0ED7, 0x0F07, 0x1EA7, 0x1EC7, 0x1EDF, 0x1F65, - 0x1F70, 0x3F36, 0x3F6F, 0x7F7C, 0x7F8F, 0x3F90, 0x3F66, 0x3F58, - 0x3F4E, 0x1F48, 0x1EBB, 0x0F40, 0x0F18, 0x0F10, 0x0EDA, 0x0ECF, - 0x0732, 0x0704, 0x0354, 0x0190, 0x004F, 0x0191, 0x0355, 0x0705, - 0x0733, 0x0ED0, 0x0EDB, 0x0F11, 0x0F19, 0x0F41, 0x1EB8, 0x1F4B, - 0x3F4F, 0x3F55, 0x3F65, 0x3F92, 0x7F85, 0x1F51, 0x1F39, 0x1F2B, - 0x1F18, 0x1EC2, 0x0F38, 0x0F14, 0x0ECA, 0x074C, 0x0736, 0x0700, - 0x06FC, 0x0350, 0x00BA, 0x004D, 0x00BB, 0x0351, 0x06FD, 0x0701, - 0x0737, 0x074D, 0x0ECB, 0x0F15, 0x0F39, 0x1EC3, 0x1F1B, 0x1F2E, - 0x1F3A, 0x1F53, 0x7F82, 0x3F8A, 0x3F47, 0x3F2E, 0x1F5E, 0x1E9E, - 0x0F24, 0x0F20, 0x0EC6, 0x0746, 0x0726, 0x070E, 0x0370, 0x035E, - 0x018A, 0x00AC, 0x0021, 0x00AD, 0x018B, 0x035F, 0x0371, 0x070F, - 0x0727, 0x0747, 0x0EC7, 0x0F21, 0x0F25, 0x1E9F, 0x1F5F, 0x3F2D, - 0x3F48, 0x3F8B, 0xFFF1, 0x1F78, 0x1F3D, 0x1EAD, 0x0F2B, 0x0EF9, - 0x0EE9, 0x0739, 0x0719, 0x0709, 0x0363, 0x019B, 0x0195, 0x00B3, - 0x0023, 0x0005, 0x0024, 0x00B4, 0x0196, 0x019C, 0x0364, 0x070A, - 0x071A, 0x073A, 0x0EEA, 0x0EFA, 0x0F2C, 0x1EAE, 0x1F3E, 0x1F79, - 0xFFF0, 0x0F0C, 0x0EE6, 0x0EDC, 0x0EC2, 0x0748, 0x0706, 0x0372, - 0x034C, 0x0198, 0x0192, 0x00C0, 0x00BC, 0x00B6, 0x0053, 0x0006, - 0x0000, 0x0007, 0x0054, 0x00B7, 0x00BD, 0x00C1, 0x0193, 0x0199, - 0x034D, 0x0373, 0x0707, 0x0749, 0x0EC3, 0x0EDD, 0x0EE7, 0x0F0D, - 0xFFF2, 0x1F7A, 0x1F3F, 0x1EAF, 0x0F2D, 0x0EFB, 0x0EEB, 0x073B, - 0x071B, 0x070B, 0x0365, 0x019D, 0x0197, 0x00B5, 0x0025, 0x0004, - 0x0022, 0x00B2, 0x0194, 0x019A, 0x0362, 0x0708, 0x0718, 0x0738, - 0x0EE8, 0x0EF8, 0x0F2A, 0x1EAC, 0x1F3C, 0x1F7B, 0xFFF3, 0x3F89, - 0x3F44, 0x3F2F, 0x1F5C, 0x1E9C, 0x0F22, 0x0F1E, 0x0EC4, 0x0744, - 0x0724, 0x070C, 0x036E, 0x035C, 0x0188, 0x00AA, 0x0020, 0x00AB, - 0x0189, 0x035D, 0x036F, 0x070D, 0x0725, 0x0745, 0x0EC5, 0x0F1F, - 0x0F23, 0x1E9D, 0x1F5D, 0x3F2C, 0x3F45, 0x3F88, 0x7F81, 0x1F52, - 0x1F38, 0x1F28, 0x1F19, 0x1EC0, 0x0F36, 0x0F12, 0x0EC8, 0x074A, - 0x0734, 0x06FE, 0x06FA, 0x034E, 0x00B8, 0x004C, 0x00B9, 0x034F, - 0x06FB, 0x06FF, 0x0735, 0x074B, 0x0EC9, 0x0F13, 0x0F37, 0x1EC1, - 0x1F1A, 0x1F29, 0x1F3B, 0x1F50, 0x7F84, 0x3F91, 0x3F64, 0x3F54, - 0x3F4C, 0x1F49, 0x1EB9, 0x0F3B, 0x0F16, 0x0F0E, 0x0ED8, 0x0ECD, - 0x0730, 0x0702, 0x0352, 0x018E, 0x004E, 0x018F, 0x0353, 0x0703, - 0x0731, 0x0ECE, 0x0ED9, 0x0F0F, 0x0F17, 0x0F3D, 0x1EBA, 0x1F4A, - 0x3F4D, 0x3F51, 0x3F67, 0x3F93, 0x7F90, 0x7F7A, 0x3F6E, 0x3F37, - 0x1F71, 0x1F63, 0x1EDC, 0x1EC4, 0x1EA4, 0x0F04, 0x0ED4, 0x074E, - 0x073C, 0x0366, 0x0348, 0x0051, 0x0349, 0x0367, 0x073D, 0x074F, - 0x0ED5, 0x0F06, 0x1EA6, 0x1EC6, 0x1EDE, 0x1F64, 0x1F73, 0x3F35, - 0x3F6D, 0x7F7B, 0x7F8E, 0x7FD4, 0x7FD0, 0x3F5F, 0x3F26, 0x1F35, - 0x1F27, 0x1EEA, 0x1EBE, 0x1EAA, 0x0F3E, 0x0F30, 0x0EE4, 0x071E, - 0x0376, 0x01A2, 0x00AF, 0x01A3, 0x0377, 0x071F, 0x0EE5, 0x0F31, - 0x0F3F, 0x1EAB, 0x1EBF, 0x1EEB, 0x1F26, 0x1F37, 0x3F27, 0x3F62, - 0x7FCF, 0x7FD3, 0xFFD4, 0x7F78, 0x3F29, 0x3F11, 0x3F0B, 0x1F32, - 0x1F22, 0x1EB6, 0x1EA2, 0x0F48, 0x0F34, 0x0F1C, 0x0758, 0x072A, - 0x0358, 0x00B1, 0x0359, 0x072B, 0x0759, 0x0F1D, 0x0F35, 0x0F49, - 0x1EA3, 0x1EB7, 0x1F21, 0x1F31, 0x3F09, 0x3F12, 0x3F2A, 0x7F79, - 0xFFD6, 0xFFE1, 0x7F6D, 0x7F64, 0x3F73, 0x3F1D, 0x3F14, 0x1F81, - 0x1EE0, 0x1EB0, 0x0F4A, 0x0EFD, 0x0EDE, 0x0ED1, 0x0720, 0x036A, - 0x00BE, 0x036B, 0x0721, 0x0ED2, 0x0EDF, 0x0EFE, 0x0F4B, 0x1EB1, - 0x1EE1, 0x1F7E, 0x3F15, 0x3F1E, 0x3F74, 0x7F62, 0x7F75, 0xFFE3, - 0xFFDE, 0x7FDD, 0x7FBE, 0x7FB3, 0x7F60, 0x3F43, 0x3F0C, 0x1F47, - 0x1F2D, 0x1EC8, 0x0F26, 0x0EF4, 0x0EEC, 0x072C, 0x06F2, 0x0184, - 0x06F3, 0x072D, 0x0EED, 0x0EF5, 0x0F29, 0x1EC9, 0x1F2A, 0x1F44, - 0x3F0D, 0x3F41, 0x7F5E, 0x7FB1, 0x7FC1, 0x7FD7, 0xFFDF, 0xFFEA, - 0x7FA3, 0x7F8B, 0x7F69, 0x3F9E, 0x1F7F, 0x1F6D, 0x1F6B, 0x1EEE, - 0x1EE6, 0x1ED4, 0x1ECF, 0x0EF2, 0x0754, 0x06F8, 0x018D, 0x06F9, - 0x0755, 0x0EF3, 0x1ECC, 0x1ED7, 0x1EE7, 0x1EEF, 0x1F68, 0x1F6F, - 0x1F80, 0x3F9D, 0x7F67, 0x7F8D, 0x7FA8, 0xFFE9, 0xFFE5, 0x7F89, - 0x7F5D, 0x3F7F, 0x3F3F, 0x1F67, 0x1F4F, 0x1F17, 0x1F0F, 0x1F02, - 0x1EFB, 0x1ED9, 0x0F45, 0x075C, 0x0716, 0x0187, 0x0717, 0x075D, - 0x0F44, 0x1EDB, 0x1EF8, 0x1F03, 0x1F0D, 0x1F16, 0x1F4E, 0x1F66, - 0x3F3E, 0x3F7E, 0x3FAD, 0x7F87, 0xFFE4, 0xFFF9, 0x7FC4, 0x7FBA, - 0x7F6E, 0x3F95, 0x3F85, 0x3F78, 0x3F77, 0x3F5B, 0x3F49, 0x1F08, - 0x1EFE, 0x1ED2, 0x0F01, 0x0710, 0x019E, 0x0711, 0x0F00, 0x1ED1, - 0x1EFC, 0x1F0B, 0x3F4B, 0x3F57, 0x3F71, 0x3F79, 0x3F84, 0x3F94, - 0x7F74, 0x7FBD, 0x7FC5, 0xFFFE, 0xFFED, 0x7FE0, 0x7FDF, 0x7FA4, - 0x7F6A, 0x3FA0, 0x3F8F, 0x3F63, 0x3F3A, 0x3F23, 0x3F1A, 0x1F59, - 0x1F1D, 0x1EF3, 0x0743, 0x035B, 0x0742, 0x1EF7, 0x1F1C, 0x1F5B, - 0x3F1B, 0x3F20, 0x3F38, 0x3F60, 0x3F8C, 0x3FA2, 0x7F6C, 0x7FA9, - 0x7FE5, 0x7FE4, 0xFFEF, 0xFFFF, 0x7FD6, 0x7FCB, 0x7FC7, 0x7F9B, - 0x7F83, 0x3FA4, 0x3F81, 0x3F69, 0x3F30, 0x1F57, 0x1F41, 0x1F13, - 0x1F06, 0x0EC0, 0x0361, 0x0EC1, 0x1F04, 0x1F10, 0x1F42, 0x1F55, - 0x3F32, 0x3F6B, 0x3F82, 0x3FA7, 0x7F7E, 0x7F9D, 0x7FC8, 0x7FCD, - 0x7FD8, 0xFFFA, 0xFFF7, 0xFFD9, 0x7FE8, 0x7FB6, 0x7FAB, 0x7FAA, - 0x7FA1, 0x7F96, 0x7F95, 0x3FAB, 0x3F98, 0x3F50, 0x1F77, 0x1EF4, - 0x0F0A, 0x06F1, 0x0F09, 0x1EF6, 0x1F74, 0x3F56, 0x3F99, 0x3FA9, - 0x7F92, 0x7F97, 0x7F9F, 0x7FAD, 0x7FB2, 0x7FB8, 0x7FE7, 0xFFDD, - 0xFFF4, 0x0050, -]; -const CLV_MVY_2_SYMS: &[u16] = &[ - 0xF1F1, 0xF2F1, 0xF3F1, 0xF4F1, 0xF5F1, 0xF6F1, 0xF7F1, 0xF8F1, - 0xF9F1, 0xFAF1, 0xFBF1, 0xFCF1, 0xFDF1, 0xFEF1, 0xFFF1, 0x00F1, - 0x01F1, 0x02F1, 0x03F1, 0x04F1, 0x05F1, 0x06F1, 0x07F1, 0x08F1, - 0x09F1, 0x0AF1, 0x0BF1, 0x0CF1, 0x0DF1, 0x0EF1, 0x0FF1, 0xF1F2, - 0xF2F2, 0xF3F2, 0xF4F2, 0xF5F2, 0xF6F2, 0xF7F2, 0xF8F2, 0xF9F2, - 0xFAF2, 0xFBF2, 0xFCF2, 0xFDF2, 0xFEF2, 0xFFF2, 0x00F2, 0x01F2, - 0x02F2, 0x03F2, 0x04F2, 0x05F2, 0x06F2, 0x07F2, 0x08F2, 0x09F2, - 0x0AF2, 0x0BF2, 0x0CF2, 0x0DF2, 0x0EF2, 0x0FF2, 0xF1F3, 0xF2F3, - 0xF3F3, 0xF4F3, 0xF5F3, 0xF6F3, 0xF7F3, 0xF8F3, 0xF9F3, 0xFAF3, - 0xFBF3, 0xFCF3, 0xFDF3, 0xFEF3, 0xFFF3, 0x00F3, 0x01F3, 0x02F3, - 0x03F3, 0x04F3, 0x05F3, 0x06F3, 0x07F3, 0x08F3, 0x09F3, 0x0AF3, - 0x0BF3, 0x0CF3, 0x0DF3, 0x0EF3, 0x0FF3, 0xF1F4, 0xF2F4, 0xF3F4, - 0xF4F4, 0xF5F4, 0xF6F4, 0xF7F4, 0xF8F4, 0xF9F4, 0xFAF4, 0xFBF4, - 0xFCF4, 0xFDF4, 0xFEF4, 0xFFF4, 0x00F4, 0x01F4, 0x02F4, 0x03F4, - 0x04F4, 0x05F4, 0x06F4, 0x07F4, 0x08F4, 0x09F4, 0x0AF4, 0x0BF4, - 0x0CF4, 0x0DF4, 0x0EF4, 0x0FF4, 0xF1F5, 0xF2F5, 0xF3F5, 0xF4F5, - 0xF5F5, 0xF6F5, 0xF7F5, 0xF8F5, 0xF9F5, 0xFAF5, 0xFBF5, 0xFCF5, - 0xFDF5, 0xFEF5, 0xFFF5, 0x00F5, 0x01F5, 0x02F5, 0x03F5, 0x04F5, - 0x05F5, 0x06F5, 0x07F5, 0x08F5, 0x09F5, 0x0AF5, 0x0BF5, 0x0CF5, - 0x0DF5, 0x0EF5, 0x0FF5, 0xF1F6, 0xF2F6, 0xF3F6, 0xF4F6, 0xF5F6, - 0xF6F6, 0xF7F6, 0xF8F6, 0xF9F6, 0xFAF6, 0xFBF6, 0xFCF6, 0xFDF6, - 0xFEF6, 0xFFF6, 0x00F6, 0x01F6, 0x02F6, 0x03F6, 0x04F6, 0x05F6, - 0x06F6, 0x07F6, 0x08F6, 0x09F6, 0x0AF6, 0x0BF6, 0x0CF6, 0x0DF6, - 0x0EF6, 0x0FF6, 0xF1F7, 0xF2F7, 0xF3F7, 0xF4F7, 0xF5F7, 0xF6F7, - 0xF7F7, 0xF8F7, 0xF9F7, 0xFAF7, 0xFBF7, 0xFCF7, 0xFDF7, 0xFEF7, - 0xFFF7, 0x00F7, 0x01F7, 0x02F7, 0x03F7, 0x04F7, 0x05F7, 0x06F7, - 0x07F7, 0x08F7, 0x09F7, 0x0AF7, 0x0BF7, 0x0CF7, 0x0DF7, 0x0EF7, - 0x0FF7, 0xF1F8, 0xF2F8, 0xF3F8, 0xF4F8, 0xF5F8, 0xF6F8, 0xF7F8, - 0xF8F8, 0xF9F8, 0xFAF8, 0xFBF8, 0xFCF8, 0xFDF8, 0xFEF8, 0xFFF8, - 0x00F8, 0x01F8, 0x02F8, 0x03F8, 0x04F8, 0x05F8, 0x06F8, 0x07F8, - 0x08F8, 0x09F8, 0x0AF8, 0x0BF8, 0x0CF8, 0x0DF8, 0x0EF8, 0x0FF8, - 0xF1F9, 0xF2F9, 0xF3F9, 0xF4F9, 0xF5F9, 0xF6F9, 0xF7F9, 0xF8F9, - 0xF9F9, 0xFAF9, 0xFBF9, 0xFCF9, 0xFDF9, 0xFEF9, 0xFFF9, 0x00F9, - 0x01F9, 0x02F9, 0x03F9, 0x04F9, 0x05F9, 0x06F9, 0x07F9, 0x08F9, - 0x09F9, 0x0AF9, 0x0BF9, 0x0CF9, 0x0DF9, 0x0EF9, 0x0FF9, 0xF1FA, - 0xF2FA, 0xF3FA, 0xF4FA, 0xF5FA, 0xF6FA, 0xF7FA, 0xF8FA, 0xF9FA, - 0xFAFA, 0xFBFA, 0xFCFA, 0xFDFA, 0xFEFA, 0xFFFA, 0x00FA, 0x01FA, - 0x02FA, 0x03FA, 0x04FA, 0x05FA, 0x06FA, 0x07FA, 0x08FA, 0x09FA, - 0x0AFA, 0x0BFA, 0x0CFA, 0x0DFA, 0x0EFA, 0x0FFA, 0xF1FB, 0xF2FB, - 0xF3FB, 0xF4FB, 0xF5FB, 0xF6FB, 0xF7FB, 0xF8FB, 0xF9FB, 0xFAFB, - 0xFBFB, 0xFCFB, 0xFDFB, 0xFEFB, 0xFFFB, 0x00FB, 0x01FB, 0x02FB, - 0x03FB, 0x04FB, 0x05FB, 0x06FB, 0x07FB, 0x08FB, 0x09FB, 0x0AFB, - 0x0BFB, 0x0CFB, 0x0DFB, 0x0EFB, 0x0FFB, 0xF1FC, 0xF2FC, 0xF3FC, - 0xF4FC, 0xF5FC, 0xF6FC, 0xF7FC, 0xF8FC, 0xF9FC, 0xFAFC, 0xFBFC, - 0xFCFC, 0xFDFC, 0xFEFC, 0xFFFC, 0x00FC, 0x01FC, 0x02FC, 0x03FC, - 0x04FC, 0x05FC, 0x06FC, 0x07FC, 0x08FC, 0x09FC, 0x0AFC, 0x0BFC, - 0x0CFC, 0x0DFC, 0x0EFC, 0x0FFC, 0xF1FD, 0xF2FD, 0xF3FD, 0xF4FD, - 0xF5FD, 0xF6FD, 0xF7FD, 0xF8FD, 0xF9FD, 0xFAFD, 0xFBFD, 0xFCFD, - 0xFDFD, 0xFEFD, 0xFFFD, 0x00FD, 0x01FD, 0x02FD, 0x03FD, 0x04FD, - 0x05FD, 0x06FD, 0x07FD, 0x08FD, 0x09FD, 0x0AFD, 0x0BFD, 0x0CFD, - 0x0DFD, 0x0EFD, 0x0FFD, 0xF1FE, 0xF2FE, 0xF3FE, 0xF4FE, 0xF5FE, - 0xF6FE, 0xF7FE, 0xF8FE, 0xF9FE, 0xFAFE, 0xFBFE, 0xFCFE, 0xFDFE, - 0xFEFE, 0xFFFE, 0x00FE, 0x01FE, 0x02FE, 0x03FE, 0x04FE, 0x05FE, - 0x06FE, 0x07FE, 0x08FE, 0x09FE, 0x0AFE, 0x0BFE, 0x0CFE, 0x0DFE, - 0x0EFE, 0x0FFE, 0xF1FF, 0xF2FF, 0xF3FF, 0xF4FF, 0xF5FF, 0xF6FF, - 0xF7FF, 0xF8FF, 0xF9FF, 0xFAFF, 0xFBFF, 0xFCFF, 0xFDFF, 0xFEFF, - 0xFFFF, 0x00FF, 0x01FF, 0x02FF, 0x03FF, 0x04FF, 0x05FF, 0x06FF, - 0x07FF, 0x08FF, 0x09FF, 0x0AFF, 0x0BFF, 0x0CFF, 0x0DFF, 0x0EFF, - 0x0FFF, 0xF100, 0xF200, 0xF300, 0xF400, 0xF500, 0xF600, 0xF700, - 0xF800, 0xF900, 0xFA00, 0xFB00, 0xFC00, 0xFD00, 0xFE00, 0xFF00, - 0x0000, 0x0100, 0x0200, 0x0300, 0x0400, 0x0500, 0x0600, 0x0700, - 0x0800, 0x0900, 0x0A00, 0x0B00, 0x0C00, 0x0D00, 0x0E00, 0x0F00, - 0xF101, 0xF201, 0xF301, 0xF401, 0xF501, 0xF601, 0xF701, 0xF801, - 0xF901, 0xFA01, 0xFB01, 0xFC01, 0xFD01, 0xFE01, 0xFF01, 0x0001, - 0x0101, 0x0201, 0x0301, 0x0401, 0x0501, 0x0601, 0x0701, 0x0801, - 0x0901, 0x0A01, 0x0B01, 0x0C01, 0x0D01, 0x0E01, 0x0F01, 0xF102, - 0xF202, 0xF302, 0xF402, 0xF502, 0xF602, 0xF702, 0xF802, 0xF902, - 0xFA02, 0xFB02, 0xFC02, 0xFD02, 0xFE02, 0xFF02, 0x0002, 0x0102, - 0x0202, 0x0302, 0x0402, 0x0502, 0x0602, 0x0702, 0x0802, 0x0902, - 0x0A02, 0x0B02, 0x0C02, 0x0D02, 0x0E02, 0x0F02, 0xF103, 0xF203, - 0xF303, 0xF403, 0xF503, 0xF603, 0xF703, 0xF803, 0xF903, 0xFA03, - 0xFB03, 0xFC03, 0xFD03, 0xFE03, 0xFF03, 0x0003, 0x0103, 0x0203, - 0x0303, 0x0403, 0x0503, 0x0603, 0x0703, 0x0803, 0x0903, 0x0A03, - 0x0B03, 0x0C03, 0x0D03, 0x0E03, 0x0F03, 0xF104, 0xF204, 0xF304, - 0xF404, 0xF504, 0xF604, 0xF704, 0xF804, 0xF904, 0xFA04, 0xFB04, - 0xFC04, 0xFD04, 0xFE04, 0xFF04, 0x0004, 0x0104, 0x0204, 0x0304, - 0x0404, 0x0504, 0x0604, 0x0704, 0x0804, 0x0904, 0x0A04, 0x0B04, - 0x0C04, 0x0D04, 0x0E04, 0x0F04, 0xF105, 0xF205, 0xF305, 0xF405, - 0xF505, 0xF605, 0xF705, 0xF805, 0xF905, 0xFA05, 0xFB05, 0xFC05, - 0xFD05, 0xFE05, 0xFF05, 0x0005, 0x0105, 0x0205, 0x0305, 0x0405, - 0x0505, 0x0605, 0x0705, 0x0805, 0x0905, 0x0A05, 0x0B05, 0x0C05, - 0x0D05, 0x0E05, 0x0F05, 0xF106, 0xF206, 0xF306, 0xF406, 0xF506, - 0xF606, 0xF706, 0xF806, 0xF906, 0xFA06, 0xFB06, 0xFC06, 0xFD06, - 0xFE06, 0xFF06, 0x0006, 0x0106, 0x0206, 0x0306, 0x0406, 0x0506, - 0x0606, 0x0706, 0x0806, 0x0906, 0x0A06, 0x0B06, 0x0C06, 0x0D06, - 0x0E06, 0x0F06, 0xF107, 0xF207, 0xF307, 0xF407, 0xF507, 0xF607, - 0xF707, 0xF807, 0xF907, 0xFA07, 0xFB07, 0xFC07, 0xFD07, 0xFE07, - 0xFF07, 0x0007, 0x0107, 0x0207, 0x0307, 0x0407, 0x0507, 0x0607, - 0x0707, 0x0807, 0x0907, 0x0A07, 0x0B07, 0x0C07, 0x0D07, 0x0E07, - 0x0F07, 0xF108, 0xF208, 0xF308, 0xF408, 0xF508, 0xF608, 0xF708, - 0xF808, 0xF908, 0xFA08, 0xFB08, 0xFC08, 0xFD08, 0xFE08, 0xFF08, - 0x0008, 0x0108, 0x0208, 0x0308, 0x0408, 0x0508, 0x0608, 0x0708, - 0x0808, 0x0908, 0x0A08, 0x0B08, 0x0C08, 0x0D08, 0x0E08, 0x0F08, - 0xF109, 0xF209, 0xF309, 0xF409, 0xF509, 0xF609, 0xF709, 0xF809, - 0xF909, 0xFA09, 0xFB09, 0xFC09, 0xFD09, 0xFE09, 0xFF09, 0x0009, - 0x0109, 0x0209, 0x0309, 0x0409, 0x0509, 0x0609, 0x0709, 0x0809, - 0x0909, 0x0A09, 0x0B09, 0x0C09, 0x0D09, 0x0E09, 0x0F09, 0xF10A, - 0xF20A, 0xF30A, 0xF40A, 0xF50A, 0xF60A, 0xF70A, 0xF80A, 0xF90A, - 0xFA0A, 0xFB0A, 0xFC0A, 0xFD0A, 0xFE0A, 0xFF0A, 0x000A, 0x010A, - 0x020A, 0x030A, 0x040A, 0x050A, 0x060A, 0x070A, 0x080A, 0x090A, - 0x0A0A, 0x0B0A, 0x0C0A, 0x0D0A, 0x0E0A, 0x0F0A, 0xF10B, 0xF20B, - 0xF30B, 0xF40B, 0xF50B, 0xF60B, 0xF70B, 0xF80B, 0xF90B, 0xFA0B, - 0xFB0B, 0xFC0B, 0xFD0B, 0xFE0B, 0xFF0B, 0x000B, 0x010B, 0x020B, - 0x030B, 0x040B, 0x050B, 0x060B, 0x070B, 0x080B, 0x090B, 0x0A0B, - 0x0B0B, 0x0C0B, 0x0D0B, 0x0E0B, 0x0F0B, 0xF10C, 0xF20C, 0xF30C, - 0xF40C, 0xF50C, 0xF60C, 0xF70C, 0xF80C, 0xF90C, 0xFA0C, 0xFB0C, - 0xFC0C, 0xFD0C, 0xFE0C, 0xFF0C, 0x000C, 0x010C, 0x020C, 0x030C, - 0x040C, 0x050C, 0x060C, 0x070C, 0x080C, 0x090C, 0x0A0C, 0x0B0C, - 0x0C0C, 0x0D0C, 0x0E0C, 0x0F0C, 0xF10D, 0xF20D, 0xF30D, 0xF40D, - 0xF50D, 0xF60D, 0xF70D, 0xF80D, 0xF90D, 0xFA0D, 0xFB0D, 0xFC0D, - 0xFD0D, 0xFE0D, 0xFF0D, 0x000D, 0x010D, 0x020D, 0x030D, 0x040D, - 0x050D, 0x060D, 0x070D, 0x080D, 0x090D, 0x0A0D, 0x0B0D, 0x0C0D, - 0x0D0D, 0x0E0D, 0x0F0D, 0xF10E, 0xF20E, 0xF30E, 0xF40E, 0xF50E, - 0xF60E, 0xF70E, 0xF80E, 0xF90E, 0xFA0E, 0xFB0E, 0xFC0E, 0xFD0E, - 0xFE0E, 0xFF0E, 0x000E, 0x010E, 0x020E, 0x030E, 0x040E, 0x050E, - 0x060E, 0x070E, 0x080E, 0x090E, 0x0A0E, 0x0B0E, 0x0C0E, 0x0D0E, - 0x0E0E, 0x0F0E, 0xF10F, 0xF20F, 0xF30F, 0xF40F, 0xF50F, 0xF60F, - 0xF70F, 0xF80F, 0xF90F, 0xFA0F, 0xFB0F, 0xFC0F, 0xFD0F, 0xFE0F, - 0xFF0F, 0x000F, 0x010F, 0x020F, 0x030F, 0x040F, 0x050F, 0x060F, - 0x070F, 0x080F, 0x090F, 0x0A0F, 0x0B0F, 0x0C0F, 0x0D0F, 0x0E0F, - 0x0F0F, 0x1010, -]; -const CLV_MVY_2_ESCAPE: u16 = 0x1010; - -const CLV_BIASY_2_BITS: &[u8] = &[ - 16, 16, 16, 16, 16, 16, 16, 15, 15, 15, 15, 15, 15, 15, 15, 15, - 15, 15, 14, 14, 14, 14, 13, 13, 13, 13, 12, 12, 12, 12, 12, 11, - 11, 11, 10, 10, 10, 10, 9, 9, 8, 8, 8, 7, 6, 6, 4, 3, - 1, 3, 4, 6, 6, 7, 8, 8, 8, 9, 9, 10, 10, 10, 10, 11, - 11, 11, 12, 12, 12, 12, 12, 13, 13, 13, 13, 13, 14, 14, 14, 15, - 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 16, 16, 16, 16, 16, 16, - 16, 15, -]; -const CLV_BIASY_2_CODES: &[u16] = &[ - 0xFFFE, 0xFFFC, 0xFFFA, 0xFFF9, 0xFFF6, 0xFFF5, 0xFFF3, 0x7FF7, - 0x7FF5, 0x7FF1, 0x7FF3, 0x7FF0, 0x7FEE, 0x7FEC, 0x7FE9, 0x7FE6, - 0x7FE4, 0x7FE2, 0x3FEF, 0x3FEE, 0x3FEC, 0x3FEA, 0x1FF2, 0x1FF1, - 0x1FEF, 0x1FED, 0x0FF4, 0x0FF3, 0x0FF1, 0x0FEF, 0x0FED, 0x07F4, - 0x07F3, 0x07F1, 0x03F6, 0x03F4, 0x03F2, 0x03F0, 0x01F6, 0x01F4, - 0x00F8, 0x00F6, 0x00F4, 0x0078, 0x003A, 0x0038, 0x000C, 0x0004, - 0x0000, 0x0005, 0x000D, 0x0039, 0x003B, 0x0079, 0x00F5, 0x00F7, - 0x00F9, 0x01F5, 0x01F7, 0x03F1, 0x03F3, 0x03F5, 0x03F7, 0x07F0, - 0x07F2, 0x07F5, 0x0FEC, 0x0FEE, 0x0FF0, 0x0FF2, 0x0FF5, 0x1FEC, - 0x1FEE, 0x1FF0, 0x1FF3, 0x1FF4, 0x3FEB, 0x3FED, 0x3FF0, 0x7FE3, - 0x7FE5, 0x7FE7, 0x7FEA, 0x7FEB, 0x7FED, 0x7FEF, 0x7FF4, 0x7FF2, - 0x7FF6, 0x7FF8, 0xFFF2, 0xFFF4, 0xFFF7, 0xFFF8, 0xFFFB, 0xFFFD, - 0xFFFF, 0x7FE8, -]; -const CLV_BIASY_2_SYMS: &[u16] = &[ - 0xFF40, 0xFF44, 0xFF48, 0xFF4C, 0xFF50, 0xFF54, 0xFF58, 0xFF5C, - 0xFF60, 0xFF64, 0xFF68, 0xFF6C, 0xFF70, 0xFF74, 0xFF78, 0xFF7C, - 0xFF80, 0xFF84, 0xFF88, 0xFF8C, 0xFF90, 0xFF94, 0xFF98, 0xFF9C, - 0xFFA0, 0xFFA4, 0xFFA8, 0xFFAC, 0xFFB0, 0xFFB4, 0xFFB8, 0xFFBC, - 0xFFC0, 0xFFC4, 0xFFC8, 0xFFCC, 0xFFD0, 0xFFD4, 0xFFD8, 0xFFDC, - 0xFFE0, 0xFFE4, 0xFFE8, 0xFFEC, 0xFFF0, 0xFFF4, 0xFFF8, 0xFFFC, - 0x0000, 0x0004, 0x0008, 0x000C, 0x0010, 0x0014, 0x0018, 0x001C, - 0x0020, 0x0024, 0x0028, 0x002C, 0x0030, 0x0034, 0x0038, 0x003C, - 0x0040, 0x0044, 0x0048, 0x004C, 0x0050, 0x0054, 0x0058, 0x005C, - 0x0060, 0x0064, 0x0068, 0x006C, 0x0070, 0x0074, 0x0078, 0x007C, - 0x0080, 0x0084, 0x0088, 0x008C, 0x0090, 0x0094, 0x0098, 0x009C, - 0x00A0, 0x00A4, 0x00A8, 0x00AC, 0x00B0, 0x00B4, 0x00B8, 0x00BC, - 0x00C0, 0x0100, -]; - -const CLV_FLAGSY_2_BITS: &[u8] = &[ - 1, 4, 4, 4, 4, 5, 7, 5, 4, 6, 5, 8, 4, 9, 10, 10, -]; -const CLV_FLAGSY_2_CODES: &[u16] = &[ - 0x0000, 0x000C, 0x000B, 0x0008, 0x000A, 0x001C, 0x007E, 0x001D, - 0x000D, 0x003E, 0x001E, 0x00FE, 0x0009, 0x01FE, 0x03FE, 0x03FF, -]; - -const CLV_MVY_3_BITS: &[u8] = &[ - 16, 16, 16, 16, 16, 16, 16, 15, 15, 15, 15, 15, 15, 14, 14, 13, - 13, 12, 11, 12, 13, 13, 14, 14, 15, 15, 15, 15, 15, 15, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 15, 15, 15, 15, 15, - 15, 15, 14, 14, 14, 13, 12, 11, 12, 13, 14, 14, 14, 15, 15, 15, - 15, 15, 15, 15, 16, 16, 16, 16, 16, 16, 16, 16, 16, 15, 15, 15, - 15, 15, 15, 14, 14, 14, 14, 14, 14, 14, 14, 12, 11, 12, 14, 14, - 14, 14, 14, 14, 14, 14, 15, 15, 15, 15, 15, 15, 16, 16, 16, 16, - 16, 16, 15, 15, 15, 15, 15, 15, 15, 14, 14, 14, 14, 14, 13, 13, - 12, 11, 12, 13, 13, 14, 14, 14, 14, 14, 15, 15, 15, 15, 15, 15, - 15, 16, 16, 16, 16, 16, 15, 15, 15, 15, 14, 14, 14, 14, 14, 14, - 14, 14, 14, 13, 13, 12, 10, 12, 13, 13, 14, 14, 14, 14, 14, 14, - 14, 14, 14, 15, 15, 15, 15, 16, 16, 16, 16, 16, 15, 15, 15, 15, - 14, 14, 14, 14, 13, 13, 13, 13, 13, 12, 12, 10, 12, 12, 13, 13, - 13, 13, 13, 14, 14, 14, 14, 15, 15, 15, 15, 16, 16, 16, 15, 15, - 15, 15, 14, 14, 14, 14, 14, 14, 14, 13, 13, 13, 13, 13, 13, 11, - 10, 11, 13, 13, 13, 13, 13, 13, 14, 14, 14, 14, 14, 14, 14, 15, - 15, 15, 15, 15, 15, 15, 15, 14, 14, 14, 13, 13, 13, 13, 12, 12, - 12, 12, 12, 11, 10, 9, 10, 11, 12, 12, 12, 12, 12, 13, 13, 13, - 13, 14, 14, 14, 15, 15, 15, 15, 15, 15, 15, 14, 14, 14, 13, 13, - 12, 12, 12, 12, 12, 12, 12, 11, 11, 10, 9, 10, 11, 11, 12, 12, - 12, 12, 12, 12, 12, 13, 13, 14, 14, 14, 15, 15, 15, 16, 15, 15, - 15, 15, 14, 14, 13, 13, 12, 12, 12, 12, 12, 11, 11, 11, 10, 9, - 10, 11, 11, 11, 12, 12, 12, 12, 12, 13, 13, 14, 14, 15, 15, 15, - 15, 16, 15, 15, 14, 14, 14, 14, 14, 13, 13, 12, 12, 12, 12, 12, - 11, 11, 11, 10, 9, 10, 11, 11, 11, 12, 12, 12, 12, 12, 13, 13, - 14, 14, 14, 14, 14, 15, 15, 15, 15, 15, 14, 14, 14, 13, 13, 12, - 12, 12, 12, 12, 12, 11, 11, 11, 10, 8, 10, 11, 11, 11, 12, 12, - 12, 12, 12, 12, 13, 13, 14, 14, 14, 15, 15, 15, 15, 15, 14, 14, - 14, 14, 13, 13, 12, 12, 12, 12, 12, 11, 11, 11, 10, 10, 8, 10, - 10, 11, 11, 11, 12, 12, 12, 12, 12, 13, 13, 14, 14, 14, 14, 15, - 15, 15, 14, 14, 14, 14, 13, 13, 13, 12, 12, 12, 12, 11, 11, 11, - 10, 10, 9, 7, 9, 10, 10, 11, 11, 11, 12, 12, 12, 12, 13, 13, - 13, 14, 14, 14, 14, 15, 15, 14, 14, 14, 14, 13, 13, 13, 12, 12, - 12, 12, 11, 11, 11, 10, 10, 9, 7, 9, 10, 10, 11, 11, 11, 12, - 12, 12, 12, 13, 13, 13, 14, 14, 14, 14, 15, 15, 14, 14, 14, 14, - 13, 13, 12, 12, 12, 12, 11, 11, 11, 11, 10, 9, 9, 7, 9, 9, - 10, 11, 11, 11, 11, 12, 12, 12, 12, 13, 13, 14, 14, 14, 14, 15, - 15, 14, 14, 14, 13, 13, 13, 13, 12, 11, 11, 11, 11, 10, 10, 10, - 9, 8, 6, 8, 9, 10, 10, 10, 11, 11, 11, 11, 12, 13, 13, 13, - 13, 14, 14, 14, 15, 15, 14, 14, 14, 13, 13, 12, 12, 11, 11, 11, - 11, 10, 10, 9, 9, 8, 6, 4, 6, 8, 9, 9, 10, 10, 11, 11, - 11, 11, 12, 12, 13, 13, 14, 14, 14, 15, 13, 13, 13, 12, 12, 12, - 12, 11, 10, 10, 10, 10, 9, 9, 8, 8, 7, 5, 2, 5, 7, 8, - 8, 9, 9, 10, 10, 10, 10, 11, 12, 12, 12, 12, 13, 13, 13, 15, - 14, 14, 14, 13, 13, 12, 12, 11, 11, 11, 11, 10, 10, 9, 9, 8, - 6, 4, 6, 8, 9, 9, 10, 10, 11, 11, 11, 11, 12, 12, 13, 13, - 14, 14, 14, 15, 15, 14, 14, 14, 13, 13, 13, 13, 12, 11, 11, 11, - 11, 10, 10, 10, 9, 8, 6, 8, 9, 10, 10, 10, 11, 11, 11, 11, - 12, 13, 13, 13, 13, 14, 14, 14, 15, 15, 14, 14, 14, 14, 13, 13, - 12, 12, 12, 12, 11, 11, 11, 11, 10, 9, 9, 7, 9, 9, 10, 11, - 11, 11, 11, 12, 12, 12, 12, 13, 13, 14, 14, 14, 14, 15, 15, 14, - 14, 14, 14, 13, 13, 13, 12, 12, 12, 12, 11, 11, 11, 10, 10, 9, - 7, 9, 10, 10, 11, 11, 11, 12, 12, 12, 12, 13, 13, 13, 14, 14, - 14, 14, 15, 15, 14, 14, 14, 14, 13, 13, 13, 12, 12, 12, 12, 11, - 11, 11, 10, 10, 9, 7, 9, 10, 10, 11, 11, 11, 12, 12, 12, 12, - 13, 13, 13, 14, 14, 14, 14, 15, 15, 15, 14, 14, 14, 14, 13, 13, - 12, 12, 12, 12, 12, 11, 11, 11, 10, 10, 8, 10, 10, 11, 11, 11, - 12, 12, 12, 12, 12, 13, 13, 14, 14, 14, 14, 15, 15, 15, 15, 15, - 14, 14, 14, 13, 13, 12, 12, 12, 12, 12, 12, 11, 11, 11, 10, 8, - 10, 11, 11, 11, 12, 12, 12, 12, 12, 12, 13, 13, 14, 14, 14, 15, - 15, 15, 15, 15, 14, 14, 14, 14, 14, 13, 13, 12, 12, 12, 12, 12, - 11, 11, 11, 10, 9, 10, 11, 11, 11, 12, 12, 12, 12, 12, 13, 13, - 14, 14, 14, 14, 14, 15, 15, 16, 15, 15, 15, 15, 14, 14, 13, 13, - 12, 12, 12, 12, 12, 11, 11, 11, 10, 9, 10, 11, 11, 11, 12, 12, - 12, 12, 12, 13, 13, 14, 14, 15, 15, 15, 15, 16, 15, 15, 15, 14, - 14, 14, 13, 13, 12, 12, 12, 12, 12, 12, 12, 11, 11, 10, 9, 10, - 11, 11, 12, 12, 12, 12, 12, 12, 12, 13, 13, 14, 14, 14, 15, 15, - 15, 15, 15, 15, 15, 14, 14, 14, 13, 13, 13, 13, 12, 12, 12, 12, - 12, 11, 10, 9, 10, 11, 12, 12, 12, 12, 12, 13, 13, 13, 13, 14, - 14, 14, 15, 15, 15, 15, 15, 15, 15, 15, 14, 14, 14, 14, 14, 14, - 13, 13, 13, 13, 13, 13, 13, 11, 10, 11, 13, 13, 13, 13, 13, 13, - 14, 14, 14, 14, 14, 14, 14, 15, 15, 15, 15, 16, 16, 16, 15, 15, - 15, 15, 14, 14, 14, 14, 13, 13, 13, 13, 13, 12, 12, 10, 12, 12, - 13, 13, 13, 13, 13, 14, 14, 14, 14, 15, 15, 15, 15, 16, 16, 16, - 16, 16, 15, 15, 15, 15, 14, 14, 14, 14, 14, 14, 14, 14, 14, 13, - 13, 12, 10, 12, 13, 13, 14, 14, 14, 14, 14, 14, 14, 14, 14, 15, - 15, 15, 15, 16, 16, 16, 16, 16, 15, 15, 15, 15, 15, 15, 15, 14, - 14, 14, 14, 14, 13, 13, 12, 11, 12, 13, 13, 14, 14, 14, 14, 14, - 15, 15, 15, 15, 15, 15, 15, 16, 16, 16, 16, 16, 16, 15, 15, 15, - 15, 15, 15, 14, 14, 14, 14, 14, 14, 14, 14, 12, 11, 12, 14, 14, - 14, 14, 14, 14, 14, 14, 15, 15, 15, 15, 15, 15, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 15, 15, 15, 15, 15, 15, 15, 14, 14, 14, 13, - 12, 11, 12, 13, 14, 14, 14, 15, 15, 15, 15, 15, 15, 15, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 15, 15, 15, 15, 15, - 15, 14, 14, 13, 13, 12, 11, 12, 13, 13, 14, 14, 15, 15, 15, 15, - 15, 15, 16, 16, 16, 16, 16, 16, 16, 7, -]; -const CLV_MVY_3_CODES: &[u16] = &[ - 0xFFF6, 0xFFEE, 0xFFDC, 0xFFD7, 0xFFB4, 0xFFAA, 0xFFA0, 0x7FCC, - 0x7F8E, 0x7F7B, 0x7F77, 0x7F13, 0x7F11, 0x3F56, 0x3F48, 0x1F16, - 0x1E94, 0x0F28, 0x06F0, 0x0F2A, 0x1E96, 0x1F1C, 0x3F46, 0x3F58, - 0x7F15, 0x7F0E, 0x7F76, 0x7F80, 0x7F90, 0x7FC8, 0xFFA2, 0xFFA7, - 0xFFB5, 0xFFD8, 0xFFDD, 0xFFEC, 0xFFF5, 0xFFF1, 0xFFEA, 0xFFE4, - 0xFFD1, 0xFFC1, 0xFFA8, 0x7F70, 0x7F5C, 0x7F44, 0x7F40, 0x7F2A, - 0x7F16, 0x7EDF, 0x3ED6, 0x3ECA, 0x3ECC, 0x1EB5, 0x0EDE, 0x06D3, - 0x0EDF, 0x1EB6, 0x3ECE, 0x3ED0, 0x3ED8, 0x7EE5, 0x7F19, 0x7F31, - 0x7F3E, 0x7F45, 0x7F5B, 0x7F6F, 0xFFA9, 0xFFC0, 0xFFCE, 0xFFE5, - 0xFFE8, 0xFFF2, 0xFFFE, 0xFFE2, 0xFFBE, 0x7FBB, 0x7F75, 0x7F6B, - 0x7F58, 0x7EF9, 0x7EDC, 0x3F68, 0x3F27, 0x3F28, 0x3EDF, 0x3ED2, - 0x3EC1, 0x3EA6, 0x3E87, 0x0F0F, 0x06B3, 0x0F10, 0x3E89, 0x3EA8, - 0x3EC3, 0x3ED5, 0x3EE0, 0x3F2B, 0x3F26, 0x3F67, 0x7EDA, 0x7EFB, - 0x7F56, 0x7F6A, 0x7F72, 0x7FC1, 0xFFBC, 0xFFE0, 0xFFFF, 0xFFF8, - 0xFFD3, 0xFFB9, 0x7FAC, 0x7F94, 0x7F8B, 0x7F62, 0x7F4A, 0x7F05, - 0x7EEE, 0x3F44, 0x3EA4, 0x3E78, 0x3E6F, 0x3E54, 0x1EEF, 0x1EA9, - 0x0ED4, 0x06A8, 0x0ED5, 0x1EA8, 0x1EEC, 0x3E51, 0x3E69, 0x3E75, - 0x3EA3, 0x3F43, 0x7EF1, 0x7F04, 0x7F4B, 0x7F5D, 0x7F89, 0x7F95, - 0x7FAA, 0xFFBB, 0xFFC8, 0xFFF9, 0xFFD9, 0xFFCA, 0x7FC3, 0x7F8C, - 0x7F38, 0x7F02, 0x3F5A, 0x3F4A, 0x3F30, 0x3EFF, 0x3EF4, 0x3EE9, - 0x3E95, 0x3E73, 0x3E43, 0x1F08, 0x1E81, 0x0E84, 0x0349, 0x0E85, - 0x1E82, 0x1F07, 0x3E45, 0x3E74, 0x3E96, 0x3EEA, 0x3EF1, 0x3F00, - 0x3F32, 0x3F4F, 0x3F5C, 0x7F01, 0x7F3B, 0x7F8D, 0x7FC2, 0xFFCF, - 0xFFD6, 0xFFC7, 0xFFB1, 0xFFA6, 0x7FA1, 0x7F2F, 0x7F24, 0x7F0A, - 0x3EF6, 0x3E97, 0x3E83, 0x3E7F, 0x1F04, 0x1EE1, 0x1ECB, 0x1EAE, - 0x1E7E, 0x0EBA, 0x0E8C, 0x0333, 0x0E8D, 0x0EBB, 0x1E7F, 0x1EAF, - 0x1ECC, 0x1EE2, 0x1F05, 0x3E80, 0x3E84, 0x3E98, 0x3EF9, 0x7F06, - 0x7F1B, 0x7F2D, 0x7F9F, 0xFFAF, 0xFFB0, 0xFFC6, 0x7FB5, 0x7FB1, - 0x7F36, 0x7F25, 0x3F63, 0x3F3A, 0x3F1B, 0x3EBB, 0x3E63, 0x3E5B, - 0x3E40, 0x1F14, 0x1EF5, 0x1EEB, 0x1EBE, 0x1E92, 0x1E6A, 0x070C, - 0x032D, 0x070D, 0x1E6B, 0x1E93, 0x1EBF, 0x1EE8, 0x1EF3, 0x1F15, - 0x3E3F, 0x3E5C, 0x3E64, 0x3EB9, 0x3F1C, 0x3F3C, 0x3F62, 0x7F22, - 0x7F39, 0x7FAF, 0x7FAE, 0x7FC6, 0x7F7F, 0x7F53, 0x7F32, 0x3F66, - 0x3EF0, 0x3E65, 0x1EDA, 0x1ED3, 0x1E98, 0x1E74, 0x0F20, 0x0F1D, - 0x0EEA, 0x0EA9, 0x0E70, 0x0718, 0x033E, 0x0179, 0x033F, 0x0719, - 0x0E71, 0x0EAB, 0x0EE9, 0x0F1F, 0x0F22, 0x1E76, 0x1E9B, 0x1ED5, - 0x1EDD, 0x3E68, 0x3EF3, 0x3F6C, 0x7F33, 0x7F4E, 0x7F7D, 0x7FCB, - 0x7FBD, 0x7F21, 0x7EF6, 0x3F0C, 0x3EBE, 0x3EAE, 0x1EA3, 0x1E85, - 0x0F0C, 0x0F06, 0x0EEE, 0x0EE6, 0x0ECA, 0x0EA2, 0x0E78, 0x0720, - 0x06BA, 0x0326, 0x015D, 0x0327, 0x06BB, 0x0721, 0x0E79, 0x0EA3, - 0x0ECB, 0x0EE7, 0x0EEF, 0x0F07, 0x0F0D, 0x1E86, 0x1EA4, 0x3EAF, - 0x3EBF, 0x3F0A, 0x7EF8, 0x7F1E, 0x7FBF, 0xFF9F, 0x7FB3, 0x7F96, - 0x7F0B, 0x7EF5, 0x3E85, 0x3E4E, 0x1EB3, 0x1E6E, 0x0F2D, 0x0EBD, - 0x0E97, 0x0E93, 0x0E86, 0x071A, 0x06E4, 0x06BC, 0x0338, 0x015A, - 0x0339, 0x06BD, 0x06E5, 0x071B, 0x0E87, 0x0E94, 0x0E98, 0x0EBE, - 0x0F2E, 0x1E6F, 0x1EB4, 0x3E4F, 0x3E88, 0x7EF4, 0x7F07, 0x7F99, - 0x7FB7, 0xFF9D, 0x7FA8, 0x7EEB, 0x3F5D, 0x3EB2, 0x3EAA, 0x3E5D, - 0x3E49, 0x1EFE, 0x1E89, 0x0F16, 0x0F12, 0x0EE0, 0x0E7A, 0x0E6A, - 0x070E, 0x06FA, 0x06B4, 0x0314, 0x0158, 0x0315, 0x06B5, 0x06FB, - 0x070F, 0x0E6B, 0x0E7B, 0x0EE1, 0x0F13, 0x0F17, 0x1E8A, 0x1EFF, - 0x3E4A, 0x3E5E, 0x3EAB, 0x3EB3, 0x3F59, 0x7EEC, 0x7FA2, 0x7F82, - 0x7F5E, 0x7F28, 0x3EDA, 0x3EC9, 0x3E7A, 0x1ED6, 0x1ECE, 0x0EFC, - 0x0EF0, 0x0E9A, 0x0E7E, 0x0E66, 0x0E5E, 0x0722, 0x06C0, 0x06A0, - 0x02FA, 0x00A8, 0x02FB, 0x06A1, 0x06C1, 0x0723, 0x0E5F, 0x0E67, - 0x0E7F, 0x0E9B, 0x0EF1, 0x0EFD, 0x1ECF, 0x1ED7, 0x3E79, 0x3ECD, - 0x3EDB, 0x7F26, 0x7F5A, 0x7F83, 0x7F54, 0x7EE8, 0x3F54, 0x3F0E, - 0x3EFB, 0x3E47, 0x1EC1, 0x1EB9, 0x0EF9, 0x0EF3, 0x0EC1, 0x0E8F, - 0x0E74, 0x0714, 0x06F4, 0x06B0, 0x0336, 0x030A, 0x009F, 0x030B, - 0x0337, 0x06B1, 0x06F5, 0x0715, 0x0E75, 0x0E91, 0x0EC3, 0x0EF6, - 0x0EFB, 0x1EBB, 0x1EC3, 0x3E41, 0x3EF8, 0x3F10, 0x3F4D, 0x7EE9, - 0x7F52, 0x7F9A, 0x3F3F, 0x3F1F, 0x3F03, 0x3EA0, 0x1F0F, 0x1E72, - 0x1E62, 0x0EDA, 0x0ED2, 0x0EB2, 0x0E64, 0x0708, 0x06EA, 0x06DA, - 0x0346, 0x032A, 0x0176, 0x004B, 0x0177, 0x032B, 0x0347, 0x06DB, - 0x06EB, 0x0709, 0x0E65, 0x0EB3, 0x0ED3, 0x0EDB, 0x1E63, 0x1E6C, - 0x1F0E, 0x3E9E, 0x3F01, 0x3F1D, 0x3F3D, 0x7F9B, 0x7EDE, 0x3F36, - 0x3F2E, 0x3F07, 0x3E99, 0x1F0D, 0x1EA1, 0x1E8C, 0x0EB4, 0x0EAC, - 0x0E5A, 0x0E50, 0x0702, 0x06D4, 0x06C6, 0x032E, 0x0310, 0x0162, - 0x0046, 0x0163, 0x0311, 0x032F, 0x06C7, 0x06D5, 0x0703, 0x0E51, - 0x0E5B, 0x0EAD, 0x0EB5, 0x1E8F, 0x1EA7, 0x1F0C, 0x3E9A, 0x3F02, - 0x3F2D, 0x3F35, 0x7EE0, 0x7F66, 0x3F11, 0x3EE1, 0x3EBC, 0x3E56, - 0x1EC4, 0x1E64, 0x0F04, 0x0EC7, 0x0E56, 0x0E4C, 0x06EC, 0x06DC, - 0x069C, 0x0694, 0x0320, 0x016C, 0x0154, 0x0044, 0x0155, 0x016D, - 0x0321, 0x0695, 0x069D, 0x06DD, 0x06ED, 0x0E4D, 0x0E57, 0x0EC4, - 0x0F05, 0x1E65, 0x1EC5, 0x3E55, 0x3EB7, 0x3EE3, 0x3F13, 0x7F67, - 0x7FA7, 0x3F49, 0x3F22, 0x3EE5, 0x1EF6, 0x1EE5, 0x1E9C, 0x1E78, - 0x0EA4, 0x06F6, 0x06DE, 0x06CE, 0x06AA, 0x0340, 0x0318, 0x02FE, - 0x015E, 0x009A, 0x001C, 0x009B, 0x015F, 0x02FF, 0x0319, 0x0341, - 0x06AB, 0x06CF, 0x06DF, 0x06F7, 0x0EA5, 0x1E79, 0x1E9D, 0x1EE7, - 0x1EF7, 0x3EE6, 0x3F23, 0x3F4B, 0x7FA3, 0x7F49, 0x3F14, 0x3E8D, - 0x3E6B, 0x1F17, 0x1EF8, 0x0F24, 0x0ECC, 0x06FE, 0x06CA, 0x06A4, - 0x0698, 0x030C, 0x0302, 0x0170, 0x0168, 0x00A0, 0x001E, 0x0004, - 0x001F, 0x00A1, 0x0169, 0x0171, 0x0303, 0x030D, 0x0699, 0x06A5, - 0x06CB, 0x06FF, 0x0ECD, 0x0F25, 0x1EF9, 0x1F18, 0x3E6C, 0x3E8E, - 0x3F15, 0x7F46, 0x1EF0, 0x1EDE, 0x1EC8, 0x0F1A, 0x0F00, 0x0E9E, - 0x0E54, 0x06C4, 0x031E, 0x031C, 0x0306, 0x02F8, 0x017A, 0x0166, - 0x00A6, 0x00A4, 0x0048, 0x000C, 0x0000, 0x000D, 0x0049, 0x00A5, - 0x00A7, 0x0167, 0x017B, 0x02F9, 0x0307, 0x031D, 0x031F, 0x06C5, - 0x0E55, 0x0E9F, 0x0F01, 0x0F1B, 0x1EC9, 0x1EDF, 0x1EF1, 0x7F47, - 0x3F12, 0x3E8F, 0x3E6D, 0x1F1B, 0x1EFA, 0x0F26, 0x0ECE, 0x0700, - 0x06CC, 0x06A6, 0x069A, 0x030E, 0x0304, 0x0172, 0x016A, 0x00A2, - 0x0020, 0x0005, 0x0021, 0x00A3, 0x016B, 0x0173, 0x0305, 0x030F, - 0x069B, 0x06A7, 0x06CD, 0x0701, 0x0ECF, 0x0F27, 0x1EFB, 0x1F1D, - 0x3E6E, 0x3E90, 0x3F17, 0x7F48, 0x7FA9, 0x3F50, 0x3F24, 0x3EE7, - 0x1EFC, 0x1EE9, 0x1E9E, 0x1E7A, 0x0EA6, 0x06F8, 0x06E0, 0x06D0, - 0x06AC, 0x0342, 0x031A, 0x0300, 0x0160, 0x009C, 0x001D, 0x009D, - 0x0161, 0x0301, 0x031B, 0x0343, 0x06AD, 0x06D1, 0x06E1, 0x06F9, - 0x0EA7, 0x1E7B, 0x1E9F, 0x1EEA, 0x1EFD, 0x3EE8, 0x3F21, 0x3F52, - 0x7F9E, 0x7F68, 0x3F16, 0x3EE2, 0x3EBA, 0x3E57, 0x1EC6, 0x1E66, - 0x0F08, 0x0EC5, 0x0E58, 0x0E4E, 0x06EE, 0x06E2, 0x069E, 0x0696, - 0x0322, 0x016E, 0x0156, 0x0045, 0x0157, 0x016F, 0x0323, 0x0697, - 0x069F, 0x06E3, 0x06EF, 0x0E4F, 0x0E59, 0x0EC6, 0x0F09, 0x1E67, - 0x1EC7, 0x3E58, 0x3EB8, 0x3EE4, 0x3F18, 0x7F69, 0x7EE2, 0x3F38, - 0x3F33, 0x3F04, 0x3E9C, 0x1F0A, 0x1EA5, 0x1E8D, 0x0EB6, 0x0EAE, - 0x0E5C, 0x0E52, 0x0704, 0x06D6, 0x06C8, 0x0330, 0x0312, 0x0164, - 0x0047, 0x0165, 0x0313, 0x0331, 0x06C9, 0x06D7, 0x0705, 0x0E53, - 0x0E5D, 0x0EAF, 0x0EB7, 0x1E8E, 0x1EA6, 0x1F0B, 0x3E9B, 0x3F05, - 0x3F31, 0x3F39, 0x7EE1, 0x7F9C, 0x3F40, 0x3F1E, 0x3F06, 0x3E9D, - 0x1F10, 0x1E70, 0x1E60, 0x0ED8, 0x0ED0, 0x0EB0, 0x0E62, 0x0706, - 0x06E8, 0x06D8, 0x0344, 0x0328, 0x0174, 0x004A, 0x0175, 0x0329, - 0x0345, 0x06D9, 0x06E9, 0x0707, 0x0E63, 0x0EB1, 0x0ED1, 0x0ED9, - 0x1E61, 0x1E71, 0x1F11, 0x3E9F, 0x3F08, 0x3F20, 0x3F3E, 0x7F9D, - 0x7F4F, 0x7EE6, 0x3F53, 0x3F0D, 0x3EFA, 0x3E46, 0x1EC0, 0x1EB8, - 0x0EF8, 0x0EF2, 0x0EC0, 0x0E8E, 0x0E72, 0x0712, 0x06F2, 0x06AE, - 0x0334, 0x0308, 0x009E, 0x0309, 0x0335, 0x06AF, 0x06F3, 0x0713, - 0x0E73, 0x0E90, 0x0EC2, 0x0EF4, 0x0EFA, 0x1EBA, 0x1EC2, 0x3E48, - 0x3EFC, 0x3F0B, 0x3F51, 0x7EE7, 0x7F51, 0x7F84, 0x7F61, 0x7F27, - 0x3EDC, 0x3EC5, 0x3E7C, 0x1ED8, 0x1ED0, 0x0EFE, 0x0EF5, 0x0E9C, - 0x0E80, 0x0E68, 0x0E60, 0x0724, 0x06C2, 0x06A2, 0x02FC, 0x00A9, - 0x02FD, 0x06A3, 0x06C3, 0x0725, 0x0E61, 0x0E69, 0x0E81, 0x0E9D, - 0x0EF7, 0x0EFF, 0x1ED1, 0x1ED9, 0x3E7B, 0x3ECF, 0x3ED9, 0x7F29, - 0x7F65, 0x7F85, 0x7FA0, 0x7EEA, 0x3F60, 0x3EB4, 0x3EAC, 0x3E5F, - 0x3E4B, 0x1F00, 0x1E8B, 0x0F18, 0x0F14, 0x0EE2, 0x0E7C, 0x0E6C, - 0x0710, 0x06FC, 0x06B6, 0x0316, 0x0159, 0x0317, 0x06B7, 0x06FD, - 0x0711, 0x0E6D, 0x0E7D, 0x0EE3, 0x0F15, 0x0F19, 0x1E88, 0x1F01, - 0x3E4C, 0x3E60, 0x3EA9, 0x3EB1, 0x3F5B, 0x7EED, 0x7FA5, 0xFF9E, - 0x7FBE, 0x7F98, 0x7F0D, 0x7EF3, 0x3E8C, 0x3E50, 0x1EB7, 0x1E73, - 0x0F2F, 0x0EBF, 0x0E99, 0x0E95, 0x0E88, 0x071C, 0x06E6, 0x06BE, - 0x033A, 0x015B, 0x033B, 0x06BF, 0x06E7, 0x071D, 0x0E89, 0x0E92, - 0x0E96, 0x0EBC, 0x0F2C, 0x1E6D, 0x1EB0, 0x3E4D, 0x3E8B, 0x7EF2, - 0x7F08, 0x7F97, 0x7FB0, 0xFF9C, 0x7FB2, 0x7F23, 0x7EFA, 0x3F0F, - 0x3EBD, 0x3EAD, 0x1EA0, 0x1E87, 0x0F0A, 0x0F02, 0x0EED, 0x0EE4, - 0x0EC8, 0x0EA0, 0x0E76, 0x071E, 0x06B8, 0x0324, 0x015C, 0x0325, - 0x06B9, 0x071F, 0x0E77, 0x0EA1, 0x0EC9, 0x0EE5, 0x0EEC, 0x0F03, - 0x0F0B, 0x1E84, 0x1EA2, 0x3EB0, 0x3EC4, 0x3F09, 0x7EF7, 0x7F1D, - 0x7FBC, 0x7FCD, 0x7F81, 0x7F50, 0x7F34, 0x3F65, 0x3EED, 0x3E67, - 0x1EDB, 0x1ED2, 0x1E99, 0x1E77, 0x0F21, 0x0F1C, 0x0EE8, 0x0EA8, - 0x0E6E, 0x0716, 0x033C, 0x0178, 0x033D, 0x0717, 0x0E6F, 0x0EAA, - 0x0EEB, 0x0F1E, 0x0F23, 0x1E75, 0x1E9A, 0x1ED4, 0x1EDC, 0x3E66, - 0x3EEE, 0x3F6B, 0x7F35, 0x7F55, 0x7F7A, 0x7FCA, 0x7FB6, 0x7FB8, - 0x7F37, 0x7F1F, 0x3F61, 0x3F37, 0x3F1A, 0x3EB5, 0x3E62, 0x3E5A, - 0x1F1E, 0x1F13, 0x1EF2, 0x1EE6, 0x1EBC, 0x1E91, 0x1E68, 0x070A, - 0x032C, 0x070B, 0x1E69, 0x1E90, 0x1EBD, 0x1EE4, 0x1EF4, 0x1F12, - 0x3E3E, 0x3E59, 0x3E61, 0x3EB6, 0x3F19, 0x3F3B, 0x3F64, 0x7F1C, - 0x7F3D, 0x7FB4, 0x7FB9, 0xFFC5, 0xFFB6, 0xFFAD, 0x7FA4, 0x7F2C, - 0x7F20, 0x7F09, 0x3EF5, 0x3E93, 0x3E82, 0x3E7E, 0x1F02, 0x1EE3, - 0x1ECA, 0x1EAD, 0x1E7C, 0x0EB8, 0x0E8A, 0x0332, 0x0E8B, 0x0EB9, - 0x1E7D, 0x1EAC, 0x1ECD, 0x1EE0, 0x1F03, 0x3E7D, 0x3E81, 0x3E91, - 0x3EF7, 0x7F0C, 0x7F1A, 0x7F2E, 0x7FA6, 0xFFA4, 0xFFB7, 0xFFC4, - 0xFFD4, 0xFFCC, 0x7FC5, 0x7F8A, 0x7F3C, 0x7EFF, 0x3F5E, 0x3F4E, - 0x3F2F, 0x3EFD, 0x3EEF, 0x3EEB, 0x3E92, 0x3E71, 0x3E42, 0x1F09, - 0x1E83, 0x0E82, 0x0348, 0x0E83, 0x1E80, 0x1F06, 0x3E44, 0x3E72, - 0x3E94, 0x3EEC, 0x3EF2, 0x3EFE, 0x3F34, 0x3F4C, 0x3F5F, 0x7EFE, - 0x7F3A, 0x7F86, 0x7FC4, 0xFFD2, 0xFFD5, 0xFFFA, 0xFFCD, 0xFFBA, - 0x7FAB, 0x7F92, 0x7F87, 0x7F63, 0x7F4C, 0x7F03, 0x7EF0, 0x3F42, - 0x3EA1, 0x3E76, 0x3E6A, 0x3E52, 0x1EEE, 0x1EAB, 0x0ED6, 0x06A9, - 0x0ED7, 0x1EAA, 0x1EED, 0x3E53, 0x3E70, 0x3E77, 0x3EA2, 0x3F41, - 0x7EEF, 0x7F00, 0x7F4D, 0x7F60, 0x7F88, 0x7F93, 0x7FAD, 0xFFB8, - 0xFFCB, 0xFFFB, 0xFFFC, 0xFFE1, 0xFFBF, 0x7FBA, 0x7F73, 0x7F6C, - 0x7F57, 0x7EFC, 0x7EDD, 0x3F6A, 0x3F2A, 0x3F25, 0x3EDD, 0x3ED3, - 0x3EC2, 0x3EA7, 0x3E86, 0x0F11, 0x06B2, 0x0F0E, 0x3E8A, 0x3EA5, - 0x3EC0, 0x3ED1, 0x3EDE, 0x3F2C, 0x3F29, 0x3F69, 0x7EDB, 0x7EFD, - 0x7F59, 0x7F6D, 0x7F74, 0x7FC0, 0xFFC3, 0xFFE3, 0xFFFD, 0xFFF0, - 0xFFE9, 0xFFE7, 0xFFC9, 0xFFBD, 0xFFAE, 0x7F71, 0x7F5F, 0x7F42, - 0x7F41, 0x7F30, 0x7F17, 0x7EE4, 0x3ED7, 0x3EC7, 0x3ECB, 0x1EB1, - 0x0EDC, 0x06D2, 0x0EDD, 0x1EB2, 0x3EC6, 0x3EC8, 0x3ED4, 0x7EE3, - 0x7F18, 0x7F2B, 0x7F3F, 0x7F43, 0x7F64, 0x7F6E, 0xFFAB, 0xFFC2, - 0xFFD0, 0xFFE6, 0xFFEF, 0xFFF3, 0xFFF7, 0xFFEB, 0xFFDE, 0xFFDA, - 0xFFB3, 0xFFAC, 0xFFA3, 0x7FC9, 0x7F8F, 0x7F7C, 0x7F79, 0x7F0F, - 0x7F10, 0x3F55, 0x3F45, 0x1F1A, 0x1E95, 0x0F2B, 0x06F1, 0x0F29, - 0x1E97, 0x1F19, 0x3F47, 0x3F57, 0x7F14, 0x7F12, 0x7F78, 0x7F7E, - 0x7F91, 0x7FC7, 0xFFA1, 0xFFA5, 0xFFB2, 0xFFDB, 0xFFDF, 0xFFED, - 0xFFF4, 0x004C, -]; -const CLV_MVY_3_SYMS: &[u16] = &[ - 0xEEEE, 0xEFEE, 0xF0EE, 0xF1EE, 0xF2EE, 0xF3EE, 0xF4EE, 0xF5EE, - 0xF6EE, 0xF7EE, 0xF8EE, 0xF9EE, 0xFAEE, 0xFBEE, 0xFCEE, 0xFDEE, - 0xFEEE, 0xFFEE, 0x00EE, 0x01EE, 0x02EE, 0x03EE, 0x04EE, 0x05EE, - 0x06EE, 0x07EE, 0x08EE, 0x09EE, 0x0AEE, 0x0BEE, 0x0CEE, 0x0DEE, - 0x0EEE, 0x0FEE, 0x10EE, 0x11EE, 0x12EE, 0xEEEF, 0xEFEF, 0xF0EF, - 0xF1EF, 0xF2EF, 0xF3EF, 0xF4EF, 0xF5EF, 0xF6EF, 0xF7EF, 0xF8EF, - 0xF9EF, 0xFAEF, 0xFBEF, 0xFCEF, 0xFDEF, 0xFEEF, 0xFFEF, 0x00EF, - 0x01EF, 0x02EF, 0x03EF, 0x04EF, 0x05EF, 0x06EF, 0x07EF, 0x08EF, - 0x09EF, 0x0AEF, 0x0BEF, 0x0CEF, 0x0DEF, 0x0EEF, 0x0FEF, 0x10EF, - 0x11EF, 0x12EF, 0xEEF0, 0xEFF0, 0xF0F0, 0xF1F0, 0xF2F0, 0xF3F0, - 0xF4F0, 0xF5F0, 0xF6F0, 0xF7F0, 0xF8F0, 0xF9F0, 0xFAF0, 0xFBF0, - 0xFCF0, 0xFDF0, 0xFEF0, 0xFFF0, 0x00F0, 0x01F0, 0x02F0, 0x03F0, - 0x04F0, 0x05F0, 0x06F0, 0x07F0, 0x08F0, 0x09F0, 0x0AF0, 0x0BF0, - 0x0CF0, 0x0DF0, 0x0EF0, 0x0FF0, 0x10F0, 0x11F0, 0x12F0, 0xEEF1, - 0xEFF1, 0xF0F1, 0xF1F1, 0xF2F1, 0xF3F1, 0xF4F1, 0xF5F1, 0xF6F1, - 0xF7F1, 0xF8F1, 0xF9F1, 0xFAF1, 0xFBF1, 0xFCF1, 0xFDF1, 0xFEF1, - 0xFFF1, 0x00F1, 0x01F1, 0x02F1, 0x03F1, 0x04F1, 0x05F1, 0x06F1, - 0x07F1, 0x08F1, 0x09F1, 0x0AF1, 0x0BF1, 0x0CF1, 0x0DF1, 0x0EF1, - 0x0FF1, 0x10F1, 0x11F1, 0x12F1, 0xEEF2, 0xEFF2, 0xF0F2, 0xF1F2, - 0xF2F2, 0xF3F2, 0xF4F2, 0xF5F2, 0xF6F2, 0xF7F2, 0xF8F2, 0xF9F2, - 0xFAF2, 0xFBF2, 0xFCF2, 0xFDF2, 0xFEF2, 0xFFF2, 0x00F2, 0x01F2, - 0x02F2, 0x03F2, 0x04F2, 0x05F2, 0x06F2, 0x07F2, 0x08F2, 0x09F2, - 0x0AF2, 0x0BF2, 0x0CF2, 0x0DF2, 0x0EF2, 0x0FF2, 0x10F2, 0x11F2, - 0x12F2, 0xEEF3, 0xEFF3, 0xF0F3, 0xF1F3, 0xF2F3, 0xF3F3, 0xF4F3, - 0xF5F3, 0xF6F3, 0xF7F3, 0xF8F3, 0xF9F3, 0xFAF3, 0xFBF3, 0xFCF3, - 0xFDF3, 0xFEF3, 0xFFF3, 0x00F3, 0x01F3, 0x02F3, 0x03F3, 0x04F3, - 0x05F3, 0x06F3, 0x07F3, 0x08F3, 0x09F3, 0x0AF3, 0x0BF3, 0x0CF3, - 0x0DF3, 0x0EF3, 0x0FF3, 0x10F3, 0x11F3, 0x12F3, 0xEEF4, 0xEFF4, - 0xF0F4, 0xF1F4, 0xF2F4, 0xF3F4, 0xF4F4, 0xF5F4, 0xF6F4, 0xF7F4, - 0xF8F4, 0xF9F4, 0xFAF4, 0xFBF4, 0xFCF4, 0xFDF4, 0xFEF4, 0xFFF4, - 0x00F4, 0x01F4, 0x02F4, 0x03F4, 0x04F4, 0x05F4, 0x06F4, 0x07F4, - 0x08F4, 0x09F4, 0x0AF4, 0x0BF4, 0x0CF4, 0x0DF4, 0x0EF4, 0x0FF4, - 0x10F4, 0x11F4, 0x12F4, 0xEEF5, 0xEFF5, 0xF0F5, 0xF1F5, 0xF2F5, - 0xF3F5, 0xF4F5, 0xF5F5, 0xF6F5, 0xF7F5, 0xF8F5, 0xF9F5, 0xFAF5, - 0xFBF5, 0xFCF5, 0xFDF5, 0xFEF5, 0xFFF5, 0x00F5, 0x01F5, 0x02F5, - 0x03F5, 0x04F5, 0x05F5, 0x06F5, 0x07F5, 0x08F5, 0x09F5, 0x0AF5, - 0x0BF5, 0x0CF5, 0x0DF5, 0x0EF5, 0x0FF5, 0x10F5, 0x11F5, 0x12F5, - 0xEEF6, 0xEFF6, 0xF0F6, 0xF1F6, 0xF2F6, 0xF3F6, 0xF4F6, 0xF5F6, - 0xF6F6, 0xF7F6, 0xF8F6, 0xF9F6, 0xFAF6, 0xFBF6, 0xFCF6, 0xFDF6, - 0xFEF6, 0xFFF6, 0x00F6, 0x01F6, 0x02F6, 0x03F6, 0x04F6, 0x05F6, - 0x06F6, 0x07F6, 0x08F6, 0x09F6, 0x0AF6, 0x0BF6, 0x0CF6, 0x0DF6, - 0x0EF6, 0x0FF6, 0x10F6, 0x11F6, 0x12F6, 0xEEF7, 0xEFF7, 0xF0F7, - 0xF1F7, 0xF2F7, 0xF3F7, 0xF4F7, 0xF5F7, 0xF6F7, 0xF7F7, 0xF8F7, - 0xF9F7, 0xFAF7, 0xFBF7, 0xFCF7, 0xFDF7, 0xFEF7, 0xFFF7, 0x00F7, - 0x01F7, 0x02F7, 0x03F7, 0x04F7, 0x05F7, 0x06F7, 0x07F7, 0x08F7, - 0x09F7, 0x0AF7, 0x0BF7, 0x0CF7, 0x0DF7, 0x0EF7, 0x0FF7, 0x10F7, - 0x11F7, 0x12F7, 0xEEF8, 0xEFF8, 0xF0F8, 0xF1F8, 0xF2F8, 0xF3F8, - 0xF4F8, 0xF5F8, 0xF6F8, 0xF7F8, 0xF8F8, 0xF9F8, 0xFAF8, 0xFBF8, - 0xFCF8, 0xFDF8, 0xFEF8, 0xFFF8, 0x00F8, 0x01F8, 0x02F8, 0x03F8, - 0x04F8, 0x05F8, 0x06F8, 0x07F8, 0x08F8, 0x09F8, 0x0AF8, 0x0BF8, - 0x0CF8, 0x0DF8, 0x0EF8, 0x0FF8, 0x10F8, 0x11F8, 0x12F8, 0xEEF9, - 0xEFF9, 0xF0F9, 0xF1F9, 0xF2F9, 0xF3F9, 0xF4F9, 0xF5F9, 0xF6F9, - 0xF7F9, 0xF8F9, 0xF9F9, 0xFAF9, 0xFBF9, 0xFCF9, 0xFDF9, 0xFEF9, - 0xFFF9, 0x00F9, 0x01F9, 0x02F9, 0x03F9, 0x04F9, 0x05F9, 0x06F9, - 0x07F9, 0x08F9, 0x09F9, 0x0AF9, 0x0BF9, 0x0CF9, 0x0DF9, 0x0EF9, - 0x0FF9, 0x10F9, 0x11F9, 0x12F9, 0xEEFA, 0xEFFA, 0xF0FA, 0xF1FA, - 0xF2FA, 0xF3FA, 0xF4FA, 0xF5FA, 0xF6FA, 0xF7FA, 0xF8FA, 0xF9FA, - 0xFAFA, 0xFBFA, 0xFCFA, 0xFDFA, 0xFEFA, 0xFFFA, 0x00FA, 0x01FA, - 0x02FA, 0x03FA, 0x04FA, 0x05FA, 0x06FA, 0x07FA, 0x08FA, 0x09FA, - 0x0AFA, 0x0BFA, 0x0CFA, 0x0DFA, 0x0EFA, 0x0FFA, 0x10FA, 0x11FA, - 0x12FA, 0xEEFB, 0xEFFB, 0xF0FB, 0xF1FB, 0xF2FB, 0xF3FB, 0xF4FB, - 0xF5FB, 0xF6FB, 0xF7FB, 0xF8FB, 0xF9FB, 0xFAFB, 0xFBFB, 0xFCFB, - 0xFDFB, 0xFEFB, 0xFFFB, 0x00FB, 0x01FB, 0x02FB, 0x03FB, 0x04FB, - 0x05FB, 0x06FB, 0x07FB, 0x08FB, 0x09FB, 0x0AFB, 0x0BFB, 0x0CFB, - 0x0DFB, 0x0EFB, 0x0FFB, 0x10FB, 0x11FB, 0x12FB, 0xEEFC, 0xEFFC, - 0xF0FC, 0xF1FC, 0xF2FC, 0xF3FC, 0xF4FC, 0xF5FC, 0xF6FC, 0xF7FC, - 0xF8FC, 0xF9FC, 0xFAFC, 0xFBFC, 0xFCFC, 0xFDFC, 0xFEFC, 0xFFFC, - 0x00FC, 0x01FC, 0x02FC, 0x03FC, 0x04FC, 0x05FC, 0x06FC, 0x07FC, - 0x08FC, 0x09FC, 0x0AFC, 0x0BFC, 0x0CFC, 0x0DFC, 0x0EFC, 0x0FFC, - 0x10FC, 0x11FC, 0x12FC, 0xEEFD, 0xEFFD, 0xF0FD, 0xF1FD, 0xF2FD, - 0xF3FD, 0xF4FD, 0xF5FD, 0xF6FD, 0xF7FD, 0xF8FD, 0xF9FD, 0xFAFD, - 0xFBFD, 0xFCFD, 0xFDFD, 0xFEFD, 0xFFFD, 0x00FD, 0x01FD, 0x02FD, - 0x03FD, 0x04FD, 0x05FD, 0x06FD, 0x07FD, 0x08FD, 0x09FD, 0x0AFD, - 0x0BFD, 0x0CFD, 0x0DFD, 0x0EFD, 0x0FFD, 0x10FD, 0x11FD, 0x12FD, - 0xEEFE, 0xEFFE, 0xF0FE, 0xF1FE, 0xF2FE, 0xF3FE, 0xF4FE, 0xF5FE, - 0xF6FE, 0xF7FE, 0xF8FE, 0xF9FE, 0xFAFE, 0xFBFE, 0xFCFE, 0xFDFE, - 0xFEFE, 0xFFFE, 0x00FE, 0x01FE, 0x02FE, 0x03FE, 0x04FE, 0x05FE, - 0x06FE, 0x07FE, 0x08FE, 0x09FE, 0x0AFE, 0x0BFE, 0x0CFE, 0x0DFE, - 0x0EFE, 0x0FFE, 0x10FE, 0x11FE, 0x12FE, 0xEEFF, 0xEFFF, 0xF0FF, - 0xF1FF, 0xF2FF, 0xF3FF, 0xF4FF, 0xF5FF, 0xF6FF, 0xF7FF, 0xF8FF, - 0xF9FF, 0xFAFF, 0xFBFF, 0xFCFF, 0xFDFF, 0xFEFF, 0xFFFF, 0x00FF, - 0x01FF, 0x02FF, 0x03FF, 0x04FF, 0x05FF, 0x06FF, 0x07FF, 0x08FF, - 0x09FF, 0x0AFF, 0x0BFF, 0x0CFF, 0x0DFF, 0x0EFF, 0x0FFF, 0x10FF, - 0x11FF, 0x12FF, 0xEE00, 0xEF00, 0xF000, 0xF100, 0xF200, 0xF300, - 0xF400, 0xF500, 0xF600, 0xF700, 0xF800, 0xF900, 0xFA00, 0xFB00, - 0xFC00, 0xFD00, 0xFE00, 0xFF00, 0x0000, 0x0100, 0x0200, 0x0300, - 0x0400, 0x0500, 0x0600, 0x0700, 0x0800, 0x0900, 0x0A00, 0x0B00, - 0x0C00, 0x0D00, 0x0E00, 0x0F00, 0x1000, 0x1100, 0x1200, 0xEE01, - 0xEF01, 0xF001, 0xF101, 0xF201, 0xF301, 0xF401, 0xF501, 0xF601, - 0xF701, 0xF801, 0xF901, 0xFA01, 0xFB01, 0xFC01, 0xFD01, 0xFE01, - 0xFF01, 0x0001, 0x0101, 0x0201, 0x0301, 0x0401, 0x0501, 0x0601, - 0x0701, 0x0801, 0x0901, 0x0A01, 0x0B01, 0x0C01, 0x0D01, 0x0E01, - 0x0F01, 0x1001, 0x1101, 0x1201, 0xEE02, 0xEF02, 0xF002, 0xF102, - 0xF202, 0xF302, 0xF402, 0xF502, 0xF602, 0xF702, 0xF802, 0xF902, - 0xFA02, 0xFB02, 0xFC02, 0xFD02, 0xFE02, 0xFF02, 0x0002, 0x0102, - 0x0202, 0x0302, 0x0402, 0x0502, 0x0602, 0x0702, 0x0802, 0x0902, - 0x0A02, 0x0B02, 0x0C02, 0x0D02, 0x0E02, 0x0F02, 0x1002, 0x1102, - 0x1202, 0xEE03, 0xEF03, 0xF003, 0xF103, 0xF203, 0xF303, 0xF403, - 0xF503, 0xF603, 0xF703, 0xF803, 0xF903, 0xFA03, 0xFB03, 0xFC03, - 0xFD03, 0xFE03, 0xFF03, 0x0003, 0x0103, 0x0203, 0x0303, 0x0403, - 0x0503, 0x0603, 0x0703, 0x0803, 0x0903, 0x0A03, 0x0B03, 0x0C03, - 0x0D03, 0x0E03, 0x0F03, 0x1003, 0x1103, 0x1203, 0xEE04, 0xEF04, - 0xF004, 0xF104, 0xF204, 0xF304, 0xF404, 0xF504, 0xF604, 0xF704, - 0xF804, 0xF904, 0xFA04, 0xFB04, 0xFC04, 0xFD04, 0xFE04, 0xFF04, - 0x0004, 0x0104, 0x0204, 0x0304, 0x0404, 0x0504, 0x0604, 0x0704, - 0x0804, 0x0904, 0x0A04, 0x0B04, 0x0C04, 0x0D04, 0x0E04, 0x0F04, - 0x1004, 0x1104, 0x1204, 0xEE05, 0xEF05, 0xF005, 0xF105, 0xF205, - 0xF305, 0xF405, 0xF505, 0xF605, 0xF705, 0xF805, 0xF905, 0xFA05, - 0xFB05, 0xFC05, 0xFD05, 0xFE05, 0xFF05, 0x0005, 0x0105, 0x0205, - 0x0305, 0x0405, 0x0505, 0x0605, 0x0705, 0x0805, 0x0905, 0x0A05, - 0x0B05, 0x0C05, 0x0D05, 0x0E05, 0x0F05, 0x1005, 0x1105, 0x1205, - 0xEE06, 0xEF06, 0xF006, 0xF106, 0xF206, 0xF306, 0xF406, 0xF506, - 0xF606, 0xF706, 0xF806, 0xF906, 0xFA06, 0xFB06, 0xFC06, 0xFD06, - 0xFE06, 0xFF06, 0x0006, 0x0106, 0x0206, 0x0306, 0x0406, 0x0506, - 0x0606, 0x0706, 0x0806, 0x0906, 0x0A06, 0x0B06, 0x0C06, 0x0D06, - 0x0E06, 0x0F06, 0x1006, 0x1106, 0x1206, 0xEE07, 0xEF07, 0xF007, - 0xF107, 0xF207, 0xF307, 0xF407, 0xF507, 0xF607, 0xF707, 0xF807, - 0xF907, 0xFA07, 0xFB07, 0xFC07, 0xFD07, 0xFE07, 0xFF07, 0x0007, - 0x0107, 0x0207, 0x0307, 0x0407, 0x0507, 0x0607, 0x0707, 0x0807, - 0x0907, 0x0A07, 0x0B07, 0x0C07, 0x0D07, 0x0E07, 0x0F07, 0x1007, - 0x1107, 0x1207, 0xEE08, 0xEF08, 0xF008, 0xF108, 0xF208, 0xF308, - 0xF408, 0xF508, 0xF608, 0xF708, 0xF808, 0xF908, 0xFA08, 0xFB08, - 0xFC08, 0xFD08, 0xFE08, 0xFF08, 0x0008, 0x0108, 0x0208, 0x0308, - 0x0408, 0x0508, 0x0608, 0x0708, 0x0808, 0x0908, 0x0A08, 0x0B08, - 0x0C08, 0x0D08, 0x0E08, 0x0F08, 0x1008, 0x1108, 0x1208, 0xEE09, - 0xEF09, 0xF009, 0xF109, 0xF209, 0xF309, 0xF409, 0xF509, 0xF609, - 0xF709, 0xF809, 0xF909, 0xFA09, 0xFB09, 0xFC09, 0xFD09, 0xFE09, - 0xFF09, 0x0009, 0x0109, 0x0209, 0x0309, 0x0409, 0x0509, 0x0609, - 0x0709, 0x0809, 0x0909, 0x0A09, 0x0B09, 0x0C09, 0x0D09, 0x0E09, - 0x0F09, 0x1009, 0x1109, 0x1209, 0xEE0A, 0xEF0A, 0xF00A, 0xF10A, - 0xF20A, 0xF30A, 0xF40A, 0xF50A, 0xF60A, 0xF70A, 0xF80A, 0xF90A, - 0xFA0A, 0xFB0A, 0xFC0A, 0xFD0A, 0xFE0A, 0xFF0A, 0x000A, 0x010A, - 0x020A, 0x030A, 0x040A, 0x050A, 0x060A, 0x070A, 0x080A, 0x090A, - 0x0A0A, 0x0B0A, 0x0C0A, 0x0D0A, 0x0E0A, 0x0F0A, 0x100A, 0x110A, - 0x120A, 0xEE0B, 0xEF0B, 0xF00B, 0xF10B, 0xF20B, 0xF30B, 0xF40B, - 0xF50B, 0xF60B, 0xF70B, 0xF80B, 0xF90B, 0xFA0B, 0xFB0B, 0xFC0B, - 0xFD0B, 0xFE0B, 0xFF0B, 0x000B, 0x010B, 0x020B, 0x030B, 0x040B, - 0x050B, 0x060B, 0x070B, 0x080B, 0x090B, 0x0A0B, 0x0B0B, 0x0C0B, - 0x0D0B, 0x0E0B, 0x0F0B, 0x100B, 0x110B, 0x120B, 0xEE0C, 0xEF0C, - 0xF00C, 0xF10C, 0xF20C, 0xF30C, 0xF40C, 0xF50C, 0xF60C, 0xF70C, - 0xF80C, 0xF90C, 0xFA0C, 0xFB0C, 0xFC0C, 0xFD0C, 0xFE0C, 0xFF0C, - 0x000C, 0x010C, 0x020C, 0x030C, 0x040C, 0x050C, 0x060C, 0x070C, - 0x080C, 0x090C, 0x0A0C, 0x0B0C, 0x0C0C, 0x0D0C, 0x0E0C, 0x0F0C, - 0x100C, 0x110C, 0x120C, 0xEE0D, 0xEF0D, 0xF00D, 0xF10D, 0xF20D, - 0xF30D, 0xF40D, 0xF50D, 0xF60D, 0xF70D, 0xF80D, 0xF90D, 0xFA0D, - 0xFB0D, 0xFC0D, 0xFD0D, 0xFE0D, 0xFF0D, 0x000D, 0x010D, 0x020D, - 0x030D, 0x040D, 0x050D, 0x060D, 0x070D, 0x080D, 0x090D, 0x0A0D, - 0x0B0D, 0x0C0D, 0x0D0D, 0x0E0D, 0x0F0D, 0x100D, 0x110D, 0x120D, - 0xEE0E, 0xEF0E, 0xF00E, 0xF10E, 0xF20E, 0xF30E, 0xF40E, 0xF50E, - 0xF60E, 0xF70E, 0xF80E, 0xF90E, 0xFA0E, 0xFB0E, 0xFC0E, 0xFD0E, - 0xFE0E, 0xFF0E, 0x000E, 0x010E, 0x020E, 0x030E, 0x040E, 0x050E, - 0x060E, 0x070E, 0x080E, 0x090E, 0x0A0E, 0x0B0E, 0x0C0E, 0x0D0E, - 0x0E0E, 0x0F0E, 0x100E, 0x110E, 0x120E, 0xEE0F, 0xEF0F, 0xF00F, - 0xF10F, 0xF20F, 0xF30F, 0xF40F, 0xF50F, 0xF60F, 0xF70F, 0xF80F, - 0xF90F, 0xFA0F, 0xFB0F, 0xFC0F, 0xFD0F, 0xFE0F, 0xFF0F, 0x000F, - 0x010F, 0x020F, 0x030F, 0x040F, 0x050F, 0x060F, 0x070F, 0x080F, - 0x090F, 0x0A0F, 0x0B0F, 0x0C0F, 0x0D0F, 0x0E0F, 0x0F0F, 0x100F, - 0x110F, 0x120F, 0xEE10, 0xEF10, 0xF010, 0xF110, 0xF210, 0xF310, - 0xF410, 0xF510, 0xF610, 0xF710, 0xF810, 0xF910, 0xFA10, 0xFB10, - 0xFC10, 0xFD10, 0xFE10, 0xFF10, 0x0010, 0x0110, 0x0210, 0x0310, - 0x0410, 0x0510, 0x0610, 0x0710, 0x0810, 0x0910, 0x0A10, 0x0B10, - 0x0C10, 0x0D10, 0x0E10, 0x0F10, 0x1010, 0x1110, 0x1210, 0xEE11, - 0xEF11, 0xF011, 0xF111, 0xF211, 0xF311, 0xF411, 0xF511, 0xF611, - 0xF711, 0xF811, 0xF911, 0xFA11, 0xFB11, 0xFC11, 0xFD11, 0xFE11, - 0xFF11, 0x0011, 0x0111, 0x0211, 0x0311, 0x0411, 0x0511, 0x0611, - 0x0711, 0x0811, 0x0911, 0x0A11, 0x0B11, 0x0C11, 0x0D11, 0x0E11, - 0x0F11, 0x1011, 0x1111, 0x1211, 0xEE12, 0xEF12, 0xF012, 0xF112, - 0xF212, 0xF312, 0xF412, 0xF512, 0xF612, 0xF712, 0xF812, 0xF912, - 0xFA12, 0xFB12, 0xFC12, 0xFD12, 0xFE12, 0xFF12, 0x0012, 0x0112, - 0x0212, 0x0312, 0x0412, 0x0512, 0x0612, 0x0712, 0x0812, 0x0912, - 0x0A12, 0x0B12, 0x0C12, 0x0D12, 0x0E12, 0x0F12, 0x1012, 0x1112, - 0x1212, 0x1313, -]; -const CLV_MVY_3_ESCAPE: u16 = 0x1313; - -const CLV_BIASY_3_BITS: &[u8] = &[ - 16, 16, 16, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 14, 14, 14, - 14, 14, 13, 13, 13, 13, 12, 12, 12, 11, 11, 11, 11, 10, 10, 10, - 10, 9, 9, 9, 9, 8, 8, 7, 7, 6, 5, 4, 4, 2, 2, 3, - 4, 5, 6, 6, 7, 7, 8, 8, 9, 9, 9, 9, 10, 10, 10, 10, - 11, 11, 11, 11, 12, 12, 12, 12, 13, 13, 13, 14, 14, 14, 14, 14, - 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 16, 16, 16, 15, -]; -const CLV_BIASY_3_CODES: &[u16] = &[ - 0xFFFF, 0xFFFC, 0xFFFA, 0x7FFC, 0x7FF9, 0x7FF6, 0x7FF4, 0x7FF2, - 0x7FF1, 0x7FEF, 0x7FEC, 0x7FEB, 0x7FE9, 0x3FF3, 0x3FF0, 0x3FEE, - 0x3FED, 0x3FEA, 0x1FF3, 0x1FF2, 0x1FF0, 0x1FEE, 0x0FF4, 0x0FF3, - 0x0FF1, 0x07F7, 0x07F5, 0x07F3, 0x07F1, 0x03F7, 0x03F4, 0x03F2, - 0x03F0, 0x01F6, 0x01F4, 0x01F2, 0x01F0, 0x00F6, 0x00F4, 0x0078, - 0x0076, 0x0039, 0x001B, 0x000C, 0x000A, 0x0001, 0x0000, 0x0004, - 0x000B, 0x001A, 0x0038, 0x003A, 0x0077, 0x0079, 0x00F5, 0x00F7, - 0x01F1, 0x01F3, 0x01F5, 0x01F7, 0x03F1, 0x03F3, 0x03F5, 0x03F6, - 0x07F0, 0x07F2, 0x07F4, 0x07F6, 0x0FF0, 0x0FF2, 0x0FF5, 0x0FF6, - 0x1FEF, 0x1FF1, 0x1FF4, 0x3FEB, 0x3FEC, 0x3FEF, 0x3FF1, 0x3FF2, - 0x7FE8, 0x7FEA, 0x7FED, 0x7FEE, 0x7FF0, 0x7FF3, 0x7FF5, 0x7FF7, - 0x7FFA, 0x7FFB, 0xFFFB, 0xFFFD, 0xFFFE, 0x7FF8, -]; -const CLV_BIASY_3_SYMS: &[u16] = &[ - 0xFF48, 0xFF4C, 0xFF50, 0xFF54, 0xFF58, 0xFF5C, 0xFF60, 0xFF64, - 0xFF68, 0xFF6C, 0xFF70, 0xFF74, 0xFF78, 0xFF7C, 0xFF80, 0xFF84, - 0xFF88, 0xFF8C, 0xFF90, 0xFF94, 0xFF98, 0xFF9C, 0xFFA0, 0xFFA4, - 0xFFA8, 0xFFAC, 0xFFB0, 0xFFB4, 0xFFB8, 0xFFBC, 0xFFC0, 0xFFC4, - 0xFFC8, 0xFFCC, 0xFFD0, 0xFFD4, 0xFFD8, 0xFFDC, 0xFFE0, 0xFFE4, - 0xFFE8, 0xFFEC, 0xFFF0, 0xFFF4, 0xFFF8, 0xFFFC, 0x0000, 0x0004, - 0x0008, 0x000C, 0x0010, 0x0014, 0x0018, 0x001C, 0x0020, 0x0024, - 0x0028, 0x002C, 0x0030, 0x0034, 0x0038, 0x003C, 0x0040, 0x0044, - 0x0048, 0x004C, 0x0050, 0x0054, 0x0058, 0x005C, 0x0060, 0x0064, - 0x0068, 0x006C, 0x0070, 0x0074, 0x0078, 0x007C, 0x0080, 0x0084, - 0x0088, 0x008C, 0x0090, 0x0094, 0x0098, 0x009C, 0x00A0, 0x00A4, - 0x00A8, 0x00AC, 0x00B0, 0x00B4, 0x00B8, 0x0100, -]; - -const CLV_FLAGSU_0_BITS: &[u8] = &[ - 1, 4, 4, 4, 5, 5, 9, 7, 5, 9, 4, 7, 4, 8, 7, 4, -]; -const CLV_FLAGSU_0_CODES: &[u16] = &[ - 0x0000, 0x000B, 0x000D, 0x0009, 0x001D, 0x001C, 0x01FF, 0x007D, - 0x001E, 0x01FE, 0x000C, 0x007C, 0x000A, 0x00FE, 0x007E, 0x0008, -]; - -const CLV_MVU_1_BITS: &[u8] = &[ - 16, 14, 14, 14, 13, 12, 12, 10, 12, 12, 13, 14, 14, 14, 16, 15, - 13, 13, 12, 12, 11, 11, 7, 11, 11, 12, 12, 13, 13, 15, 16, 16, - 16, 13, 12, 10, 10, 6, 10, 10, 12, 13, 16, 16, 16, 14, 14, 11, - 11, 11, 11, 9, 7, 9, 11, 11, 11, 11, 14, 14, 15, 13, 13, 12, - 9, 8, 8, 4, 8, 8, 9, 12, 13, 13, 15, 14, 14, 11, 11, 10, - 9, 8, 4, 8, 9, 10, 11, 12, 14, 14, 12, 12, 11, 10, 10, 8, - 6, 3, 6, 8, 10, 10, 11, 12, 12, 11, 10, 9, 6, 6, 6, 5, - 4, 5, 6, 6, 6, 9, 10, 11, 12, 12, 11, 10, 10, 8, 6, 3, - 6, 7, 10, 10, 11, 12, 12, 14, 14, 11, 11, 10, 9, 8, 4, 8, - 9, 10, 11, 11, 14, 14, 15, 13, 13, 12, 9, 8, 8, 4, 8, 8, - 9, 12, 13, 13, 15, 14, 14, 11, 11, 11, 11, 9, 7, 9, 11, 11, - 11, 11, 14, 14, 16, 16, 16, 13, 12, 10, 10, 6, 10, 10, 12, 13, - 16, 16, 16, 15, 13, 13, 12, 12, 11, 11, 7, 11, 11, 12, 12, 13, - 13, 15, 16, 14, 14, 14, 13, 12, 12, 10, 12, 12, 13, 14, 14, 14, - 16, 7, -]; -const CLV_MVU_1_CODES: &[u16] = &[ - 0xFFFC, 0x3FED, 0x3FE5, 0x3FE3, 0x1FD9, 0x0FD9, 0x0FD6, 0x03CE, - 0x0FD3, 0x0FD8, 0x1FD6, 0x3FE0, 0x3FE8, 0x3FEC, 0xFFFE, 0x7FF3, - 0x1FE7, 0x1FDA, 0x0FCF, 0x0FCC, 0x07DD, 0x07CC, 0x006B, 0x07CD, - 0x07DE, 0x0FCE, 0x0FD2, 0x1FDD, 0x1FEC, 0x7FF0, 0xFFF6, 0xFFFA, - 0xFFF2, 0x1FDE, 0x0FDB, 0x03D8, 0x03CA, 0x002E, 0x03CB, 0x03D9, - 0x0FDC, 0x1FDF, 0xFFF3, 0xFFF9, 0xFFF5, 0x3FF3, 0x3FDD, 0x07DA, - 0x07D2, 0x07CA, 0x07C2, 0x01DE, 0x0069, 0x01DF, 0x07C3, 0x07CB, - 0x07D3, 0x07DB, 0x3FDF, 0x3FF6, 0x7FF7, 0x1FED, 0x1FE5, 0x0FDF, - 0x01D8, 0x00E3, 0x00DF, 0x0007, 0x00E0, 0x00E4, 0x01D9, 0x0FE0, - 0x1FE3, 0x1FE9, 0x7FF4, 0x3FF5, 0x3FE7, 0x07E4, 0x07C6, 0x03D2, - 0x01E2, 0x00E9, 0x0006, 0x00EA, 0x01E3, 0x03D3, 0x07C7, 0x0FCA, - 0x3FE9, 0x3FF0, 0x0FE8, 0x0FE5, 0x07D5, 0x03DD, 0x03D5, 0x00DC, - 0x002B, 0x0001, 0x002C, 0x00DD, 0x03D6, 0x03DE, 0x07D6, 0x0FE4, - 0x0FE9, 0x07E0, 0x03C8, 0x01D6, 0x0032, 0x0030, 0x0028, 0x0012, - 0x0004, 0x0013, 0x0029, 0x0031, 0x0033, 0x01D7, 0x03C9, 0x07E1, - 0x0FEA, 0x0FE6, 0x07D7, 0x03DF, 0x03D7, 0x00DE, 0x002D, 0x0000, - 0x002A, 0x006D, 0x03D4, 0x03DC, 0x07D4, 0x0FE3, 0x0FE7, 0x3FF1, - 0x3FE4, 0x07E2, 0x07C4, 0x03D0, 0x01E0, 0x00E7, 0x0005, 0x00E8, - 0x01E1, 0x03D1, 0x07C5, 0x07E3, 0x3FEA, 0x3FF7, 0x7FF6, 0x1FE6, - 0x1FE4, 0x0FE1, 0x01DA, 0x00E5, 0x00E1, 0x0008, 0x00E2, 0x00E6, - 0x01DB, 0x0FE2, 0x1FE2, 0x1FEB, 0x7FF5, 0x3FF4, 0x3FDC, 0x07D9, - 0x07D0, 0x07C8, 0x07C0, 0x01DC, 0x0068, 0x01DD, 0x07C1, 0x07C9, - 0x07D1, 0x07D8, 0x3FDE, 0x3FF2, 0xFFFB, 0xFFF4, 0xFFF0, 0x1FE1, - 0x0FDD, 0x03DA, 0x03CC, 0x002F, 0x03CD, 0x03DB, 0x0FDE, 0x1FE0, - 0xFFF1, 0xFFF7, 0xFFF8, 0x7FF2, 0x1FEA, 0x1FDC, 0x0FD1, 0x0FCD, - 0x07DC, 0x07CF, 0x006C, 0x07CE, 0x07DF, 0x0FCB, 0x0FD0, 0x1FDB, - 0x1FE8, 0x7FF1, 0xFFFD, 0x3FEE, 0x3FEB, 0x3FE1, 0x1FD7, 0x0FD7, - 0x0FD5, 0x03CF, 0x0FD4, 0x0FDA, 0x1FD8, 0x3FE2, 0x3FE6, 0x3FEF, - 0xFFFF, 0x006A, -]; -const CLV_MVU_1_SYMS: &[u16] = &[ - 0xF9F9, 0xFAF9, 0xFBF9, 0xFCF9, 0xFDF9, 0xFEF9, 0xFFF9, 0x00F9, - 0x01F9, 0x02F9, 0x03F9, 0x04F9, 0x05F9, 0x06F9, 0x07F9, 0xF9FA, - 0xFAFA, 0xFBFA, 0xFCFA, 0xFDFA, 0xFEFA, 0xFFFA, 0x00FA, 0x01FA, - 0x02FA, 0x03FA, 0x04FA, 0x05FA, 0x06FA, 0x07FA, 0xF9FB, 0xFAFB, - 0xFBFB, 0xFCFB, 0xFDFB, 0xFEFB, 0xFFFB, 0x00FB, 0x01FB, 0x02FB, - 0x03FB, 0x04FB, 0x05FB, 0x06FB, 0x07FB, 0xF9FC, 0xFAFC, 0xFBFC, - 0xFCFC, 0xFDFC, 0xFEFC, 0xFFFC, 0x00FC, 0x01FC, 0x02FC, 0x03FC, - 0x04FC, 0x05FC, 0x06FC, 0x07FC, 0xF9FD, 0xFAFD, 0xFBFD, 0xFCFD, - 0xFDFD, 0xFEFD, 0xFFFD, 0x00FD, 0x01FD, 0x02FD, 0x03FD, 0x04FD, - 0x05FD, 0x06FD, 0x07FD, 0xF9FE, 0xFAFE, 0xFBFE, 0xFCFE, 0xFDFE, - 0xFEFE, 0xFFFE, 0x00FE, 0x01FE, 0x02FE, 0x03FE, 0x04FE, 0x05FE, - 0x06FE, 0x07FE, 0xF9FF, 0xFAFF, 0xFBFF, 0xFCFF, 0xFDFF, 0xFEFF, - 0xFFFF, 0x00FF, 0x01FF, 0x02FF, 0x03FF, 0x04FF, 0x05FF, 0x06FF, - 0x07FF, 0xF900, 0xFA00, 0xFB00, 0xFC00, 0xFD00, 0xFE00, 0xFF00, - 0x0000, 0x0100, 0x0200, 0x0300, 0x0400, 0x0500, 0x0600, 0x0700, - 0xF901, 0xFA01, 0xFB01, 0xFC01, 0xFD01, 0xFE01, 0xFF01, 0x0001, - 0x0101, 0x0201, 0x0301, 0x0401, 0x0501, 0x0601, 0x0701, 0xF902, - 0xFA02, 0xFB02, 0xFC02, 0xFD02, 0xFE02, 0xFF02, 0x0002, 0x0102, - 0x0202, 0x0302, 0x0402, 0x0502, 0x0602, 0x0702, 0xF903, 0xFA03, - 0xFB03, 0xFC03, 0xFD03, 0xFE03, 0xFF03, 0x0003, 0x0103, 0x0203, - 0x0303, 0x0403, 0x0503, 0x0603, 0x0703, 0xF904, 0xFA04, 0xFB04, - 0xFC04, 0xFD04, 0xFE04, 0xFF04, 0x0004, 0x0104, 0x0204, 0x0304, - 0x0404, 0x0504, 0x0604, 0x0704, 0xF905, 0xFA05, 0xFB05, 0xFC05, - 0xFD05, 0xFE05, 0xFF05, 0x0005, 0x0105, 0x0205, 0x0305, 0x0405, - 0x0505, 0x0605, 0x0705, 0xF906, 0xFA06, 0xFB06, 0xFC06, 0xFD06, - 0xFE06, 0xFF06, 0x0006, 0x0106, 0x0206, 0x0306, 0x0406, 0x0506, - 0x0606, 0x0706, 0xF907, 0xFA07, 0xFB07, 0xFC07, 0xFD07, 0xFE07, - 0xFF07, 0x0007, 0x0107, 0x0207, 0x0307, 0x0407, 0x0507, 0x0607, - 0x0707, 0x0808, -]; -const CLV_MVU_1_ESCAPE: u16 = 0x0808; - -const CLV_BIASU_1_BITS: &[u8] = &[ - 16, 15, 14, 13, 13, 13, 12, 12, 12, 12, 11, 10, 10, 9, 9, 8, - 7, 6, 5, 2, 1, 3, 5, 7, 7, 8, 9, 9, 10, 10, 11, 12, - 12, 12, 12, 13, 13, 13, 14, 15, 15, 16, -]; -const CLV_BIASU_1_CODES: &[u16] = &[ - 0xFFFE, 0x7FFC, 0x3FFC, 0x1FFC, 0x1FFA, 0x1FF9, 0x0FFA, 0x0FF7, - 0x0FF8, 0x0FF5, 0x07F8, 0x03FA, 0x03F8, 0x01FA, 0x01F9, 0x00FA, - 0x007B, 0x003C, 0x001C, 0x0002, 0x0000, 0x0006, 0x001D, 0x007A, - 0x007C, 0x00FB, 0x01F8, 0x01FB, 0x03F9, 0x03FB, 0x07F9, 0x0FF4, - 0x0FF6, 0x0FF9, 0x0FFB, 0x1FF8, 0x1FFB, 0x1FFD, 0x3FFD, 0x7FFD, - 0x7FFE, 0xFFFF, -]; -const CLV_BIASU_1_SYMS: &[u16] = &[ - 0xFFB0, 0xFFB4, 0xFFB8, 0xFFBC, 0xFFC0, 0xFFC4, 0xFFC8, 0xFFCC, - 0xFFD0, 0xFFD4, 0xFFD8, 0xFFDC, 0xFFE0, 0xFFE4, 0xFFE8, 0xFFEC, - 0xFFF0, 0xFFF4, 0xFFF8, 0xFFFC, 0x0000, 0x0004, 0x0008, 0x000C, - 0x0010, 0x0014, 0x0018, 0x001C, 0x0020, 0x0024, 0x0028, 0x002C, - 0x0030, 0x0034, 0x0038, 0x003C, 0x0040, 0x0044, 0x0048, 0x004C, - 0x0050, 0x0100, -]; - -const CLV_FLAGSU_1_BITS: &[u8] = &[ - 1, 4, 4, 4, 4, 4, 8, 6, 4, 8, 5, 8, 4, 10, 9, 10, -]; -const CLV_FLAGSU_1_CODES: &[u16] = &[ - 0x0000, 0x000C, 0x0008, 0x000A, 0x000B, 0x000E, 0x00FD, 0x003E, - 0x000D, 0x00FC, 0x001E, 0x00FE, 0x0009, 0x03FE, 0x01FE, 0x03FF, -]; - -const CLV_MVU_2_BITS: &[u8] = &[ - 16, 16, 16, 15, 15, 15, 15, 14, 14, 14, 14, 14, 14, 14, 15, 15, - 15, 15, 16, 16, 16, 16, 15, 15, 15, 14, 14, 14, 14, 14, 13, 13, - 13, 14, 14, 14, 14, 14, 15, 15, 15, 16, 16, 15, 15, 14, 14, 14, - 14, 14, 14, 13, 13, 13, 14, 14, 14, 14, 14, 14, 15, 15, 16, 16, - 15, 15, 14, 13, 13, 13, 13, 13, 12, 12, 12, 13, 13, 13, 13, 13, - 14, 15, 15, 16, 14, 14, 14, 14, 13, 12, 12, 12, 12, 11, 10, 11, - 12, 12, 12, 12, 13, 14, 14, 14, 14, 14, 14, 14, 13, 12, 12, 12, - 12, 11, 10, 9, 10, 11, 12, 12, 12, 12, 13, 14, 14, 14, 15, 14, - 13, 13, 12, 12, 12, 12, 11, 10, 8, 10, 11, 12, 12, 12, 12, 13, - 13, 14, 15, 14, 14, 14, 13, 12, 12, 11, 11, 10, 9, 7, 9, 10, - 11, 11, 12, 12, 13, 14, 14, 14, 14, 14, 13, 12, 12, 11, 11, 10, - 9, 8, 7, 8, 9, 10, 11, 11, 12, 12, 13, 14, 14, 14, 13, 13, - 12, 11, 9, 9, 8, 7, 6, 5, 6, 7, 8, 9, 9, 11, 12, 13, - 13, 14, 14, 13, 13, 13, 11, 11, 10, 8, 7, 4, 1, 4, 7, 8, - 10, 11, 11, 13, 13, 13, 14, 14, 13, 13, 12, 11, 9, 9, 8, 7, - 6, 5, 6, 7, 8, 9, 9, 11, 12, 13, 13, 14, 14, 14, 13, 12, - 11, 11, 11, 9, 9, 8, 7, 8, 9, 10, 11, 11, 12, 12, 13, 14, - 14, 14, 14, 14, 13, 12, 12, 11, 11, 10, 9, 7, 9, 10, 11, 11, - 12, 12, 13, 14, 14, 14, 15, 14, 13, 13, 12, 12, 12, 12, 11, 10, - 9, 10, 11, 12, 12, 12, 12, 13, 13, 14, 15, 14, 14, 14, 13, 12, - 12, 12, 12, 11, 10, 8, 10, 11, 12, 12, 12, 12, 13, 14, 14, 14, - 14, 14, 14, 14, 13, 12, 12, 12, 12, 11, 10, 11, 12, 12, 12, 12, - 13, 14, 14, 14, 14, 16, 15, 15, 14, 13, 13, 13, 13, 13, 12, 12, - 12, 13, 13, 13, 13, 13, 14, 15, 15, 16, 16, 15, 15, 14, 14, 14, - 14, 14, 14, 13, 12, 13, 14, 14, 14, 14, 14, 14, 15, 15, 16, 16, - 15, 15, 15, 14, 14, 14, 14, 14, 13, 13, 13, 14, 14, 14, 14, 14, - 15, 15, 15, 16, 16, 16, 16, 15, 15, 15, 15, 14, 14, 14, 14, 14, - 14, 14, 15, 15, 15, 15, 16, 16, 16, 6, -]; -const CLV_MVU_2_CODES: &[u16] = &[ - 0xFFF2, 0xFFEF, 0xFFEA, 0x7FEC, 0x7FD5, 0x7FC5, 0x7FCF, 0x3FD3, - 0x3FC9, 0x3FB4, 0x3F72, 0x3FAE, 0x3FDC, 0x3FE1, 0x7FC4, 0x7FC8, - 0x7FD7, 0x7FF0, 0xFFE9, 0xFFEC, 0xFFF8, 0xFFF4, 0x7FF3, 0x7FDE, - 0x7FD3, 0x3FC0, 0x3F99, 0x3FA8, 0x3FAC, 0x3F8E, 0x1FA8, 0x1F79, - 0x1FA2, 0x3F89, 0x3F93, 0x3F95, 0x3F9C, 0x3FB8, 0x7FD2, 0x7FE6, - 0x7FDA, 0xFFF7, 0xFFFE, 0x7FED, 0x7FE2, 0x3FD5, 0x3FD7, 0x3FB3, - 0x3FA2, 0x3F80, 0x3F7A, 0x1F88, 0x1F70, 0x1F8A, 0x3F83, 0x3F84, - 0x3FAA, 0x3FC4, 0x3FDA, 0x3FDF, 0x7FDB, 0x7FE3, 0xFFF1, 0xFFFB, - 0x7FE1, 0x7FC7, 0x3FB0, 0x1FAA, 0x1FAB, 0x1FA3, 0x1F8E, 0x1F81, - 0x0FA7, 0x0F7F, 0x0FA8, 0x1F82, 0x1F8F, 0x1FA4, 0x1FAC, 0x1FAD, - 0x3FB5, 0x7FC6, 0x7FDD, 0xFFF3, 0x3FDD, 0x3FBE, 0x3FB9, 0x3F7C, - 0x1F77, 0x0FB5, 0x0F9D, 0x0F99, 0x0F90, 0x0794, 0x03BE, 0x0795, - 0x0F92, 0x0F9A, 0x0F9E, 0x0FB6, 0x1F78, 0x3F78, 0x3FB2, 0x3FBF, - 0x3FD2, 0x3FA7, 0x3F8C, 0x3F75, 0x1F9E, 0x0F93, 0x0F94, 0x0F7B, - 0x0F73, 0x07B4, 0x03BB, 0x01D9, 0x03BC, 0x07B5, 0x0F74, 0x0F7C, - 0x0F95, 0x0F96, 0x1FA0, 0x3F76, 0x3F8F, 0x3FA5, 0x7FE5, 0x3FC7, - 0x1F95, 0x1F71, 0x0FAB, 0x0FAC, 0x0F9F, 0x0F7D, 0x0796, 0x03BF, - 0x00DE, 0x03C0, 0x0797, 0x0F7E, 0x0FA0, 0x0FAD, 0x0FAE, 0x1F72, - 0x1F97, 0x3FD1, 0x7FD8, 0x3FA9, 0x3FA0, 0x3F6D, 0x1F99, 0x0F87, - 0x0F77, 0x07A8, 0x079C, 0x03C5, 0x01CA, 0x0067, 0x01CB, 0x03C6, - 0x079D, 0x07A9, 0x0F78, 0x0F8A, 0x1F9F, 0x3F6E, 0x3F98, 0x3F9A, - 0x3FCA, 0x3F70, 0x1FAF, 0x0F8D, 0x0F6F, 0x07AC, 0x07A0, 0x03B7, - 0x01CE, 0x00DA, 0x0063, 0x00DB, 0x01CF, 0x03B8, 0x07A1, 0x07AD, - 0x0F70, 0x0F91, 0x1FB2, 0x3F73, 0x3FD6, 0x3F7D, 0x1F91, 0x1F85, - 0x0FA3, 0x07A2, 0x01D4, 0x01D0, 0x00E0, 0x0068, 0x002C, 0x0014, - 0x002D, 0x0069, 0x00E1, 0x01D1, 0x01D5, 0x07A3, 0x0FA4, 0x1F89, - 0x1F92, 0x3F81, 0x3FA6, 0x1F7B, 0x1F7C, 0x1F7D, 0x07B0, 0x07AE, - 0x03C7, 0x00DC, 0x0064, 0x0008, 0x0000, 0x0009, 0x0065, 0x00DD, - 0x03C8, 0x07AF, 0x07B1, 0x1F7E, 0x1F7F, 0x1F80, 0x3F9E, 0x3F85, - 0x1F93, 0x1F8B, 0x0FA5, 0x07A4, 0x01D6, 0x01D2, 0x00E2, 0x006A, - 0x002E, 0x0015, 0x002F, 0x006B, 0x00E3, 0x01D3, 0x01D7, 0x07A5, - 0x0FA6, 0x1F8C, 0x1F94, 0x3F87, 0x3FCE, 0x3F77, 0x1FB4, 0x0F83, - 0x07B6, 0x07AA, 0x079E, 0x01DA, 0x01CC, 0x00D8, 0x0062, 0x00D9, - 0x01CD, 0x03B6, 0x079F, 0x07AB, 0x0F6E, 0x0F84, 0x1FA9, 0x3F6A, - 0x3FCD, 0x3F90, 0x3F92, 0x3F6B, 0x1F96, 0x0F85, 0x0F75, 0x07A6, - 0x079A, 0x03C3, 0x01C8, 0x0066, 0x01C9, 0x03C4, 0x079B, 0x07A7, - 0x0F76, 0x0F86, 0x1F9D, 0x3F6C, 0x3F96, 0x3F97, 0x7FE9, 0x3FD8, - 0x1F98, 0x1F73, 0x0FAF, 0x0FB0, 0x0FA1, 0x0F80, 0x0798, 0x03C1, - 0x01D8, 0x03C2, 0x0799, 0x0F81, 0x0FA2, 0x0FB1, 0x0FB2, 0x1F74, - 0x1F9A, 0x3FE0, 0x7FEE, 0x3F94, 0x3F8B, 0x3F6F, 0x1F9B, 0x0F88, - 0x0F89, 0x0F79, 0x0F71, 0x07B2, 0x03B9, 0x00DF, 0x03BA, 0x07B3, - 0x0F72, 0x0F7A, 0x0F8B, 0x0F8C, 0x1F9C, 0x3F71, 0x3F8A, 0x3F9B, - 0x3FC8, 0x3FBD, 0x3FC5, 0x3F79, 0x1F75, 0x0FB3, 0x0F9C, 0x0F97, - 0x0F8E, 0x0792, 0x03BD, 0x0793, 0x0F8F, 0x0F98, 0x0F9B, 0x0FB4, - 0x1F76, 0x3F82, 0x3FC3, 0x3FBA, 0x3FC6, 0xFFFD, 0x7FDF, 0x7FCC, - 0x3FBB, 0x1FB0, 0x1FAE, 0x1FA1, 0x1F90, 0x1F83, 0x0FAA, 0x0F82, - 0x0FA9, 0x1F84, 0x1F8D, 0x1FA5, 0x1FB1, 0x1FB3, 0x3FC2, 0x7FCA, - 0x7FE8, 0xFFF5, 0xFFFF, 0x7FDC, 0x7FD9, 0x3FCC, 0x3FD9, 0x3FB7, - 0x3F9F, 0x3F7E, 0x3F86, 0x1F86, 0x0FB7, 0x1F87, 0x3F7B, 0x3F7F, - 0x3FA1, 0x3FBC, 0x3FCB, 0x3FD4, 0x7FF1, 0x7FF2, 0xFFFA, 0xFFFC, - 0x7FE4, 0x7FE7, 0x7FD4, 0x3FAF, 0x3FA3, 0x3F91, 0x3F9D, 0x3F88, - 0x1FA6, 0x1F7A, 0x1FA7, 0x3F8D, 0x3FAB, 0x3FAD, 0x3FA4, 0x3FB6, - 0x7FD0, 0x7FE0, 0x7FEB, 0xFFF0, 0xFFF9, 0xFFEB, 0xFFED, 0x7FEA, - 0x7FD6, 0x7FC9, 0x7FCB, 0x3FD0, 0x3FDE, 0x3FB1, 0x3F74, 0x3FC1, - 0x3FCF, 0x3FDB, 0x7FCD, 0x7FCE, 0x7FD1, 0x7FEF, 0xFFE8, 0xFFEE, - 0xFFF6, 0x0030, -]; -const CLV_MVU_2_SYMS: &[u16] = &[ - 0xF6F6, 0xF7F6, 0xF8F6, 0xF9F6, 0xFAF6, 0xFBF6, 0xFCF6, 0xFDF6, - 0xFEF6, 0xFFF6, 0x00F6, 0x01F6, 0x02F6, 0x03F6, 0x04F6, 0x05F6, - 0x06F6, 0x07F6, 0x08F6, 0x09F6, 0x0AF6, 0xF6F7, 0xF7F7, 0xF8F7, - 0xF9F7, 0xFAF7, 0xFBF7, 0xFCF7, 0xFDF7, 0xFEF7, 0xFFF7, 0x00F7, - 0x01F7, 0x02F7, 0x03F7, 0x04F7, 0x05F7, 0x06F7, 0x07F7, 0x08F7, - 0x09F7, 0x0AF7, 0xF6F8, 0xF7F8, 0xF8F8, 0xF9F8, 0xFAF8, 0xFBF8, - 0xFCF8, 0xFDF8, 0xFEF8, 0xFFF8, 0x00F8, 0x01F8, 0x02F8, 0x03F8, - 0x04F8, 0x05F8, 0x06F8, 0x07F8, 0x08F8, 0x09F8, 0x0AF8, 0xF6F9, - 0xF7F9, 0xF8F9, 0xF9F9, 0xFAF9, 0xFBF9, 0xFCF9, 0xFDF9, 0xFEF9, - 0xFFF9, 0x00F9, 0x01F9, 0x02F9, 0x03F9, 0x04F9, 0x05F9, 0x06F9, - 0x07F9, 0x08F9, 0x09F9, 0x0AF9, 0xF6FA, 0xF7FA, 0xF8FA, 0xF9FA, - 0xFAFA, 0xFBFA, 0xFCFA, 0xFDFA, 0xFEFA, 0xFFFA, 0x00FA, 0x01FA, - 0x02FA, 0x03FA, 0x04FA, 0x05FA, 0x06FA, 0x07FA, 0x08FA, 0x09FA, - 0x0AFA, 0xF6FB, 0xF7FB, 0xF8FB, 0xF9FB, 0xFAFB, 0xFBFB, 0xFCFB, - 0xFDFB, 0xFEFB, 0xFFFB, 0x00FB, 0x01FB, 0x02FB, 0x03FB, 0x04FB, - 0x05FB, 0x06FB, 0x07FB, 0x08FB, 0x09FB, 0x0AFB, 0xF6FC, 0xF7FC, - 0xF8FC, 0xF9FC, 0xFAFC, 0xFBFC, 0xFCFC, 0xFDFC, 0xFEFC, 0xFFFC, - 0x00FC, 0x01FC, 0x02FC, 0x03FC, 0x04FC, 0x05FC, 0x06FC, 0x07FC, - 0x08FC, 0x09FC, 0x0AFC, 0xF6FD, 0xF7FD, 0xF8FD, 0xF9FD, 0xFAFD, - 0xFBFD, 0xFCFD, 0xFDFD, 0xFEFD, 0xFFFD, 0x00FD, 0x01FD, 0x02FD, - 0x03FD, 0x04FD, 0x05FD, 0x06FD, 0x07FD, 0x08FD, 0x09FD, 0x0AFD, - 0xF6FE, 0xF7FE, 0xF8FE, 0xF9FE, 0xFAFE, 0xFBFE, 0xFCFE, 0xFDFE, - 0xFEFE, 0xFFFE, 0x00FE, 0x01FE, 0x02FE, 0x03FE, 0x04FE, 0x05FE, - 0x06FE, 0x07FE, 0x08FE, 0x09FE, 0x0AFE, 0xF6FF, 0xF7FF, 0xF8FF, - 0xF9FF, 0xFAFF, 0xFBFF, 0xFCFF, 0xFDFF, 0xFEFF, 0xFFFF, 0x00FF, - 0x01FF, 0x02FF, 0x03FF, 0x04FF, 0x05FF, 0x06FF, 0x07FF, 0x08FF, - 0x09FF, 0x0AFF, 0xF600, 0xF700, 0xF800, 0xF900, 0xFA00, 0xFB00, - 0xFC00, 0xFD00, 0xFE00, 0xFF00, 0x0000, 0x0100, 0x0200, 0x0300, - 0x0400, 0x0500, 0x0600, 0x0700, 0x0800, 0x0900, 0x0A00, 0xF601, - 0xF701, 0xF801, 0xF901, 0xFA01, 0xFB01, 0xFC01, 0xFD01, 0xFE01, - 0xFF01, 0x0001, 0x0101, 0x0201, 0x0301, 0x0401, 0x0501, 0x0601, - 0x0701, 0x0801, 0x0901, 0x0A01, 0xF602, 0xF702, 0xF802, 0xF902, - 0xFA02, 0xFB02, 0xFC02, 0xFD02, 0xFE02, 0xFF02, 0x0002, 0x0102, - 0x0202, 0x0302, 0x0402, 0x0502, 0x0602, 0x0702, 0x0802, 0x0902, - 0x0A02, 0xF603, 0xF703, 0xF803, 0xF903, 0xFA03, 0xFB03, 0xFC03, - 0xFD03, 0xFE03, 0xFF03, 0x0003, 0x0103, 0x0203, 0x0303, 0x0403, - 0x0503, 0x0603, 0x0703, 0x0803, 0x0903, 0x0A03, 0xF604, 0xF704, - 0xF804, 0xF904, 0xFA04, 0xFB04, 0xFC04, 0xFD04, 0xFE04, 0xFF04, - 0x0004, 0x0104, 0x0204, 0x0304, 0x0404, 0x0504, 0x0604, 0x0704, - 0x0804, 0x0904, 0x0A04, 0xF605, 0xF705, 0xF805, 0xF905, 0xFA05, - 0xFB05, 0xFC05, 0xFD05, 0xFE05, 0xFF05, 0x0005, 0x0105, 0x0205, - 0x0305, 0x0405, 0x0505, 0x0605, 0x0705, 0x0805, 0x0905, 0x0A05, - 0xF606, 0xF706, 0xF806, 0xF906, 0xFA06, 0xFB06, 0xFC06, 0xFD06, - 0xFE06, 0xFF06, 0x0006, 0x0106, 0x0206, 0x0306, 0x0406, 0x0506, - 0x0606, 0x0706, 0x0806, 0x0906, 0x0A06, 0xF607, 0xF707, 0xF807, - 0xF907, 0xFA07, 0xFB07, 0xFC07, 0xFD07, 0xFE07, 0xFF07, 0x0007, - 0x0107, 0x0207, 0x0307, 0x0407, 0x0507, 0x0607, 0x0707, 0x0807, - 0x0907, 0x0A07, 0xF608, 0xF708, 0xF808, 0xF908, 0xFA08, 0xFB08, - 0xFC08, 0xFD08, 0xFE08, 0xFF08, 0x0008, 0x0108, 0x0208, 0x0308, - 0x0408, 0x0508, 0x0608, 0x0708, 0x0808, 0x0908, 0x0A08, 0xF609, - 0xF709, 0xF809, 0xF909, 0xFA09, 0xFB09, 0xFC09, 0xFD09, 0xFE09, - 0xFF09, 0x0009, 0x0109, 0x0209, 0x0309, 0x0409, 0x0509, 0x0609, - 0x0709, 0x0809, 0x0909, 0x0A09, 0xF60A, 0xF70A, 0xF80A, 0xF90A, - 0xFA0A, 0xFB0A, 0xFC0A, 0xFD0A, 0xFE0A, 0xFF0A, 0x000A, 0x010A, - 0x020A, 0x030A, 0x040A, 0x050A, 0x060A, 0x070A, 0x080A, 0x090A, - 0x0A0A, 0x0B0B, -]; -const CLV_MVU_2_ESCAPE: u16 = 0x0B0B; - -const CLV_BIASU_2_BITS: &[u8] = &[ - 16, 16, 16, 16, 15, 15, 15, 14, 14, 14, 13, 12, 12, 11, 11, 10, - 10, 9, 9, 8, 8, 7, 6, 5, 4, 3, 1, 3, 4, 6, 6, 7, - 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 14, 14, 14, 15, 15, - 15, 16, 16, 16, 16, 14, -]; -const CLV_BIASU_2_CODES: &[u16] = &[ - 0xFFFC, 0xFFF8, 0xFFFA, 0xFFFD, 0x7FF8, 0x7FFA, 0x7FF7, 0x3FF6, - 0x3FF7, 0x3FF4, 0x1FF9, 0x0FFB, 0x0FF9, 0x07FB, 0x07F9, 0x03FA, - 0x03F8, 0x01FA, 0x01F9, 0x00FB, 0x00F9, 0x007B, 0x003B, 0x001C, - 0x000C, 0x0004, 0x0000, 0x0005, 0x000D, 0x003A, 0x003C, 0x007A, - 0x00F8, 0x00FA, 0x01F8, 0x01FB, 0x03F9, 0x03FB, 0x07F8, 0x07FA, - 0x0FF8, 0x0FFA, 0x1FF8, 0x3FF5, 0x3FF8, 0x3FF9, 0x7FFB, 0x7FF9, - 0x7FF6, 0xFFF9, 0xFFFF, 0xFFFE, 0xFFFB, 0x3FFA, -]; -const CLV_BIASU_2_SYMS: &[u16] = &[ - 0xFF98, 0xFF9C, 0xFFA0, 0xFFA4, 0xFFA8, 0xFFAC, 0xFFB0, 0xFFB4, - 0xFFB8, 0xFFBC, 0xFFC0, 0xFFC4, 0xFFC8, 0xFFCC, 0xFFD0, 0xFFD4, - 0xFFD8, 0xFFDC, 0xFFE0, 0xFFE4, 0xFFE8, 0xFFEC, 0xFFF0, 0xFFF4, - 0xFFF8, 0xFFFC, 0x0000, 0x0004, 0x0008, 0x000C, 0x0010, 0x0014, - 0x0018, 0x001C, 0x0020, 0x0024, 0x0028, 0x002C, 0x0030, 0x0034, - 0x0038, 0x003C, 0x0040, 0x0044, 0x0048, 0x004C, 0x0050, 0x0054, - 0x0058, 0x005C, 0x0060, 0x0064, 0x0068, 0x0100, -]; - -const CLV_FLAGSV_0_BITS: &[u8] = &[ - 1, 4, 5, 4, 5, 5, 8, 10, 5, 9, 5, 6, 4, 10, 7, 3, -]; -const CLV_FLAGSV_0_CODES: &[u16] = &[ - 0x0000, 0x000A, 0x001B, 0x000C, 0x001E, 0x001C, 0x00FE, 0x03FE, - 0x001D, 0x01FE, 0x001A, 0x003E, 0x000B, 0x03FF, 0x007E, 0x0004, -]; - -const CLV_MVV_1_BITS: &[u8] = &[ - 16, 15, 13, 13, 13, 12, 10, 10, 10, 12, 13, 13, 13, 15, 16, 16, - 15, 14, 13, 12, 11, 10, 9, 10, 11, 12, 13, 14, 15, 16, 15, 14, - 13, 13, 11, 10, 10, 5, 10, 10, 11, 13, 13, 14, 15, 12, 12, 12, - 11, 10, 10, 9, 5, 9, 10, 10, 11, 12, 12, 12, 14, 12, 12, 12, - 11, 9, 8, 5, 8, 9, 11, 12, 12, 12, 14, 14, 11, 11, 9, 9, - 9, 7, 5, 7, 9, 9, 9, 11, 11, 14, 13, 12, 11, 10, 10, 8, - 6, 3, 6, 8, 10, 10, 11, 12, 13, 11, 10, 9, 7, 6, 6, 4, - 4, 4, 6, 7, 7, 10, 10, 11, 13, 12, 11, 10, 10, 8, 6, 3, - 6, 8, 10, 10, 11, 12, 13, 14, 11, 11, 9, 9, 9, 7, 5, 7, - 9, 9, 9, 11, 11, 14, 14, 12, 12, 12, 11, 9, 8, 5, 8, 9, - 11, 12, 12, 12, 14, 12, 12, 12, 11, 10, 10, 9, 5, 9, 10, 10, - 11, 12, 12, 12, 15, 14, 13, 13, 11, 10, 10, 5, 10, 10, 11, 13, - 13, 14, 15, 16, 15, 14, 13, 12, 11, 10, 9, 10, 11, 12, 13, 14, - 15, 16, 16, 15, 13, 13, 13, 12, 10, 10, 10, 12, 13, 13, 13, 15, - 16, 7, -]; -const CLV_MVV_1_CODES: &[u16] = &[ - 0xFFFD, 0x7FF8, 0x1FF2, 0x1FDC, 0x1FDB, 0x0FD2, 0x03D6, 0x03BF, - 0x03D3, 0x0FD0, 0x1FDA, 0x1FDE, 0x1FF0, 0x7FF9, 0xFFFE, 0xFFFA, - 0x7FFB, 0x3FF3, 0x1FE9, 0x0FD6, 0x07CB, 0x03E1, 0x01C8, 0x03E2, - 0x07CC, 0x0FD9, 0x1FE8, 0x3FF6, 0x7FFA, 0xFFF9, 0x7FF1, 0x3FEE, - 0x1FE4, 0x1FE0, 0x07D4, 0x03DB, 0x03CB, 0x0014, 0x03CC, 0x03DC, - 0x07D6, 0x1FE3, 0x1FE7, 0x3FEC, 0x7FF3, 0x0FEA, 0x0FE0, 0x0FDE, - 0x07DE, 0x03C9, 0x03C3, 0x01DC, 0x0013, 0x01DD, 0x03C4, 0x03CA, - 0x07DF, 0x0FDF, 0x0FE3, 0x0FEB, 0x3FF1, 0x0FE7, 0x0FCF, 0x0FC8, - 0x07D8, 0x01D2, 0x00E0, 0x0010, 0x00E1, 0x01D4, 0x07D9, 0x0FC9, - 0x0FCC, 0x0FE6, 0x3FF5, 0x3FEA, 0x07E2, 0x07D2, 0x01D7, 0x01D0, - 0x01CC, 0x006A, 0x000F, 0x006B, 0x01CD, 0x01D1, 0x01D9, 0x07D3, - 0x07E3, 0x3FEB, 0x1FEE, 0x0FD5, 0x07C7, 0x03D8, 0x03D0, 0x00DD, - 0x002D, 0x0001, 0x002E, 0x00DE, 0x03D1, 0x03D9, 0x07C8, 0x0FD8, - 0x1FEF, 0x07CE, 0x03C5, 0x01DE, 0x006C, 0x0032, 0x0030, 0x0005, - 0x0004, 0x0006, 0x0031, 0x0066, 0x006D, 0x03BE, 0x03C6, 0x07CF, - 0x1FEC, 0x0FDA, 0x07C9, 0x03DA, 0x03D2, 0x00DF, 0x002F, 0x0000, - 0x002C, 0x00DC, 0x03CF, 0x03D7, 0x07C6, 0x0FD4, 0x1FED, 0x3FE9, - 0x07E0, 0x07D0, 0x01D3, 0x01CE, 0x01CA, 0x0068, 0x000E, 0x0069, - 0x01CB, 0x01CF, 0x01D5, 0x07D1, 0x07E1, 0x3FE8, 0x3FF4, 0x0FE4, - 0x0FCD, 0x0FCB, 0x07DA, 0x01D6, 0x00E2, 0x0011, 0x00E3, 0x01D8, - 0x07DB, 0x0FCA, 0x0FCE, 0x0FE5, 0x3FF7, 0x0FE8, 0x0FE1, 0x0FDD, - 0x07DD, 0x03C7, 0x03C1, 0x01DA, 0x0012, 0x01DB, 0x03C2, 0x03C8, - 0x07DC, 0x0FDC, 0x0FE2, 0x0FE9, 0x7FF0, 0x3FEF, 0x1FE5, 0x1FE1, - 0x07D7, 0x03DD, 0x03CD, 0x0015, 0x03CE, 0x03DE, 0x07D5, 0x1FE2, - 0x1FE6, 0x3FED, 0x7FF2, 0xFFF8, 0x7FF4, 0x3FF2, 0x1FEB, 0x0FD7, - 0x07CD, 0x03DF, 0x01C9, 0x03E0, 0x07CA, 0x0FDB, 0x1FEA, 0x3FF0, - 0x7FF5, 0xFFFB, 0xFFFC, 0x7FF6, 0x1FF3, 0x1FDD, 0x1FD9, 0x0FD1, - 0x03D5, 0x03C0, 0x03D4, 0x0FD3, 0x1FD8, 0x1FDF, 0x1FF1, 0x7FF7, - 0xFFFF, 0x0067, -]; -const CLV_MVV_1_SYMS: &[u16] = &[ - 0xF9F9, 0xFAF9, 0xFBF9, 0xFCF9, 0xFDF9, 0xFEF9, 0xFFF9, 0x00F9, - 0x01F9, 0x02F9, 0x03F9, 0x04F9, 0x05F9, 0x06F9, 0x07F9, 0xF9FA, - 0xFAFA, 0xFBFA, 0xFCFA, 0xFDFA, 0xFEFA, 0xFFFA, 0x00FA, 0x01FA, - 0x02FA, 0x03FA, 0x04FA, 0x05FA, 0x06FA, 0x07FA, 0xF9FB, 0xFAFB, - 0xFBFB, 0xFCFB, 0xFDFB, 0xFEFB, 0xFFFB, 0x00FB, 0x01FB, 0x02FB, - 0x03FB, 0x04FB, 0x05FB, 0x06FB, 0x07FB, 0xF9FC, 0xFAFC, 0xFBFC, - 0xFCFC, 0xFDFC, 0xFEFC, 0xFFFC, 0x00FC, 0x01FC, 0x02FC, 0x03FC, - 0x04FC, 0x05FC, 0x06FC, 0x07FC, 0xF9FD, 0xFAFD, 0xFBFD, 0xFCFD, - 0xFDFD, 0xFEFD, 0xFFFD, 0x00FD, 0x01FD, 0x02FD, 0x03FD, 0x04FD, - 0x05FD, 0x06FD, 0x07FD, 0xF9FE, 0xFAFE, 0xFBFE, 0xFCFE, 0xFDFE, - 0xFEFE, 0xFFFE, 0x00FE, 0x01FE, 0x02FE, 0x03FE, 0x04FE, 0x05FE, - 0x06FE, 0x07FE, 0xF9FF, 0xFAFF, 0xFBFF, 0xFCFF, 0xFDFF, 0xFEFF, - 0xFFFF, 0x00FF, 0x01FF, 0x02FF, 0x03FF, 0x04FF, 0x05FF, 0x06FF, - 0x07FF, 0xF900, 0xFA00, 0xFB00, 0xFC00, 0xFD00, 0xFE00, 0xFF00, - 0x0000, 0x0100, 0x0200, 0x0300, 0x0400, 0x0500, 0x0600, 0x0700, - 0xF901, 0xFA01, 0xFB01, 0xFC01, 0xFD01, 0xFE01, 0xFF01, 0x0001, - 0x0101, 0x0201, 0x0301, 0x0401, 0x0501, 0x0601, 0x0701, 0xF902, - 0xFA02, 0xFB02, 0xFC02, 0xFD02, 0xFE02, 0xFF02, 0x0002, 0x0102, - 0x0202, 0x0302, 0x0402, 0x0502, 0x0602, 0x0702, 0xF903, 0xFA03, - 0xFB03, 0xFC03, 0xFD03, 0xFE03, 0xFF03, 0x0003, 0x0103, 0x0203, - 0x0303, 0x0403, 0x0503, 0x0603, 0x0703, 0xF904, 0xFA04, 0xFB04, - 0xFC04, 0xFD04, 0xFE04, 0xFF04, 0x0004, 0x0104, 0x0204, 0x0304, - 0x0404, 0x0504, 0x0604, 0x0704, 0xF905, 0xFA05, 0xFB05, 0xFC05, - 0xFD05, 0xFE05, 0xFF05, 0x0005, 0x0105, 0x0205, 0x0305, 0x0405, - 0x0505, 0x0605, 0x0705, 0xF906, 0xFA06, 0xFB06, 0xFC06, 0xFD06, - 0xFE06, 0xFF06, 0x0006, 0x0106, 0x0206, 0x0306, 0x0406, 0x0506, - 0x0606, 0x0706, 0xF907, 0xFA07, 0xFB07, 0xFC07, 0xFD07, 0xFE07, - 0xFF07, 0x0007, 0x0107, 0x0207, 0x0307, 0x0407, 0x0507, 0x0607, - 0x0707, 0x0808, -]; -const CLV_MVV_1_ESCAPE: u16 = 0x0808; - -const CLV_BIASV_1_BITS: &[u8] = &[ - 16, 15, 14, 14, 14, 13, 13, 13, 12, 12, 11, 11, 10, 10, 9, 8, - 7, 6, 5, 2, 1, 3, 5, 6, 8, 8, 9, 10, 10, 11, 12, 12, - 12, 13, 13, 13, 14, 14, 15, 15, 16, 14, -]; -const CLV_BIASV_1_CODES: &[u16] = &[ - 0xFFFF, 0x7FFD, 0x3FFD, 0x3FFB, 0x3FF9, 0x1FFB, 0x1FF8, 0x1FF6, - 0x0FFA, 0x0FF8, 0x07FA, 0x07F8, 0x03FA, 0x03F8, 0x01FB, 0x00FB, - 0x007C, 0x003C, 0x001C, 0x0002, 0x0000, 0x0006, 0x001D, 0x003D, - 0x00FA, 0x00FC, 0x01FA, 0x03F9, 0x03FB, 0x07F9, 0x0FF6, 0x0FF7, - 0x0FF9, 0x1FF7, 0x1FF9, 0x1FFA, 0x3FFA, 0x3FFC, 0x7FFC, 0x7FFE, - 0xFFFE, 0x3FF8, -]; -const CLV_BIASV_1_SYMS: &[u16] = &[ - 0xFFB0, 0xFFB4, 0xFFB8, 0xFFBC, 0xFFC0, 0xFFC4, 0xFFC8, 0xFFCC, - 0xFFD0, 0xFFD4, 0xFFD8, 0xFFDC, 0xFFE0, 0xFFE4, 0xFFE8, 0xFFEC, - 0xFFF0, 0xFFF4, 0xFFF8, 0xFFFC, 0x0000, 0x0004, 0x0008, 0x000C, - 0x0010, 0x0014, 0x0018, 0x001C, 0x0020, 0x0024, 0x0028, 0x002C, - 0x0030, 0x0034, 0x0038, 0x003C, 0x0040, 0x0044, 0x0048, 0x004C, - 0x0050, 0x0100, -]; - -const CLV_FLAGSV_1_BITS: &[u8] = &[ - 1, 4, 4, 4, 4, 5, 8, 6, 3, 7, 5, 10, 5, 11, 9, 11, -]; -const CLV_FLAGSV_1_CODES: &[u16] = &[ - 0x0000, 0x000D, 0x000C, 0x000A, 0x000B, 0x001D, 0x00FE, 0x003E, - 0x0004, 0x007E, 0x001E, 0x03FE, 0x001C, 0x07FE, 0x01FE, 0x07FF, -]; - -const CLV_MVV_2_BITS: &[u8] = &[ - 16, 15, 15, 15, 15, 15, 14, 14, 14, 13, 12, 13, 14, 14, 14, 15, - 15, 15, 15, 15, 16, 16, 16, 16, 15, 15, 14, 14, 14, 13, 13, 12, - 12, 13, 14, 14, 14, 15, 15, 16, 16, 16, 16, 16, 16, 14, 14, 14, - 14, 14, 14, 13, 13, 13, 14, 14, 14, 14, 14, 14, 16, 16, 16, 15, - 15, 14, 14, 14, 13, 13, 13, 13, 12, 12, 12, 13, 13, 13, 13, 14, - 14, 14, 15, 15, 16, 14, 14, 14, 13, 12, 12, 12, 10, 10, 10, 10, - 10, 12, 12, 12, 13, 14, 14, 14, 16, 14, 14, 14, 13, 13, 12, 12, - 12, 10, 10, 7, 10, 10, 12, 12, 12, 13, 13, 14, 14, 14, 14, 14, - 13, 12, 12, 12, 12, 10, 9, 8, 7, 8, 9, 10, 12, 12, 12, 12, - 13, 14, 14, 14, 14, 13, 12, 12, 12, 12, 10, 9, 8, 7, 8, 9, - 10, 12, 12, 12, 12, 13, 14, 14, 14, 14, 13, 13, 12, 12, 11, 10, - 9, 8, 7, 8, 9, 10, 11, 12, 12, 13, 13, 14, 14, 14, 13, 13, - 12, 10, 10, 9, 8, 7, 6, 5, 6, 7, 8, 9, 10, 10, 12, 13, - 13, 14, 13, 13, 13, 13, 11, 10, 9, 8, 7, 5, 1, 5, 7, 8, - 9, 10, 11, 13, 13, 13, 13, 14, 13, 13, 12, 10, 10, 9, 8, 7, - 6, 5, 6, 7, 8, 9, 10, 10, 12, 13, 13, 14, 14, 14, 13, 13, - 12, 12, 11, 9, 9, 8, 7, 8, 9, 9, 11, 12, 12, 13, 13, 14, - 14, 14, 14, 13, 12, 12, 12, 12, 10, 9, 8, 7, 8, 9, 10, 12, - 12, 12, 12, 13, 14, 14, 14, 14, 13, 12, 12, 12, 12, 10, 9, 8, - 7, 8, 9, 10, 12, 12, 12, 12, 13, 14, 14, 14, 14, 14, 13, 13, - 12, 12, 12, 10, 10, 7, 10, 10, 12, 12, 12, 13, 13, 14, 14, 14, - 16, 14, 14, 14, 13, 12, 12, 12, 10, 10, 10, 10, 10, 12, 12, 12, - 13, 14, 14, 14, 16, 15, 15, 14, 14, 14, 13, 13, 13, 13, 12, 12, - 12, 13, 13, 13, 13, 14, 14, 14, 15, 15, 16, 16, 16, 14, 14, 14, - 14, 14, 14, 13, 13, 13, 14, 14, 14, 14, 14, 14, 16, 16, 16, 16, - 16, 16, 15, 15, 14, 14, 14, 13, 12, 12, 12, 13, 14, 14, 14, 15, - 15, 16, 16, 16, 16, 15, 15, 15, 15, 15, 14, 14, 14, 13, 10, 13, - 14, 14, 14, 15, 15, 15, 15, 15, 16, 6, -]; -const CLV_MVV_2_CODES: &[u16] = &[ - 0xFFFF, 0x7FE7, 0x7FD9, 0x7FE6, 0x7FE5, 0x7FCE, 0x3FD6, 0x3FD3, - 0x3F9C, 0x1FB2, 0x0F7A, 0x1FB5, 0x3FA8, 0x3FDD, 0x3FE5, 0x7FD0, - 0x7FEA, 0x7FEC, 0x7FEF, 0x7FDB, 0xFFF3, 0xFFF5, 0xFFE2, 0xFFEB, - 0x7FEB, 0x7FE0, 0x3FA7, 0x3F84, 0x3F79, 0x1FAE, 0x1F70, 0x0F78, - 0x0FAA, 0x1FAA, 0x3F76, 0x3F7E, 0x3FAC, 0x7FE1, 0x7FDD, 0xFFEC, - 0xFFEE, 0xFFF8, 0xFFF9, 0xFFEA, 0xFFE4, 0x3FE1, 0x3FBA, 0x3FC5, - 0x3FB9, 0x3FA1, 0x3FAA, 0x1F8B, 0x1F8D, 0x1F8E, 0x3FA6, 0x3FA9, - 0x3FC4, 0x3FBC, 0x3FC6, 0x3FDB, 0xFFE3, 0xFFE1, 0xFFFB, 0x7FD4, - 0x7FCC, 0x3FCD, 0x3F88, 0x3F7C, 0x1FA1, 0x1FA2, 0x1F95, 0x1F77, - 0x0F95, 0x0F79, 0x0F97, 0x1F78, 0x1F96, 0x1FA3, 0x1FA4, 0x3F7F, - 0x3F8B, 0x3FCB, 0x7FCF, 0x7FD5, 0xFFF6, 0x3FD7, 0x3FE0, 0x3F91, - 0x1F7B, 0x0FB4, 0x0FA5, 0x0FA6, 0x03D5, 0x03CB, 0x03BF, 0x03CC, - 0x03D6, 0x0FA7, 0x0FA8, 0x0FB5, 0x1F7D, 0x3F87, 0x3FD2, 0x3FDF, - 0xFFF0, 0x3F95, 0x3F8A, 0x3F96, 0x1FB7, 0x1F9F, 0x0F9F, 0x0F8F, - 0x0F76, 0x03D1, 0x03BC, 0x0067, 0x03BD, 0x03D2, 0x0F77, 0x0F90, - 0x0FA0, 0x1FA0, 0x1FB9, 0x3F97, 0x3F98, 0x3F99, 0x3FC3, 0x3FAF, - 0x1F81, 0x0FA9, 0x0F91, 0x0F7E, 0x0F68, 0x03B2, 0x01C6, 0x00D4, - 0x0062, 0x00D5, 0x01C7, 0x03B3, 0x0F6A, 0x0F81, 0x0F93, 0x0FAC, - 0x1F83, 0x3FB3, 0x3FB4, 0x3FC7, 0x3FBB, 0x1F86, 0x0FAF, 0x0F98, - 0x0F84, 0x0F6D, 0x03B8, 0x01CC, 0x00DA, 0x0065, 0x00DB, 0x01CD, - 0x03B9, 0x0F6F, 0x0F86, 0x0F9B, 0x0FB1, 0x1F88, 0x3FB8, 0x3FC9, - 0x3FDC, 0x3F80, 0x1FB3, 0x1F93, 0x0F87, 0x0F72, 0x07B0, 0x03B0, - 0x01D4, 0x00E0, 0x0061, 0x00E1, 0x01D5, 0x03B1, 0x07B1, 0x0F73, - 0x0F88, 0x1F94, 0x1FB4, 0x3F81, 0x3FD4, 0x3F9E, 0x1F99, 0x1F73, - 0x0F89, 0x03C4, 0x03C0, 0x01CE, 0x00D0, 0x005C, 0x0028, 0x0010, - 0x0029, 0x005D, 0x00D1, 0x01CF, 0x03C1, 0x03C5, 0x0F8A, 0x1F74, - 0x1F9A, 0x3FA4, 0x1FAC, 0x1F8C, 0x1F7E, 0x1F71, 0x07B2, 0x03CF, - 0x01C4, 0x00DC, 0x005A, 0x0012, 0x0000, 0x0013, 0x005B, 0x00DD, - 0x01C5, 0x03D0, 0x07B3, 0x1F72, 0x1F7F, 0x1F8F, 0x1FAD, 0x3FAB, - 0x1F9B, 0x1F75, 0x0F8B, 0x03C6, 0x03C2, 0x01D0, 0x00D2, 0x005E, - 0x002A, 0x0011, 0x002B, 0x005F, 0x00D3, 0x01D1, 0x03C3, 0x03C7, - 0x0F8C, 0x1F76, 0x1F9C, 0x3FAD, 0x3FCF, 0x3F85, 0x1FBA, 0x1F91, - 0x0F7D, 0x0F70, 0x07AE, 0x01D6, 0x01D2, 0x00DE, 0x0060, 0x00DF, - 0x01D3, 0x01D7, 0x07AF, 0x0F71, 0x0F7F, 0x1F92, 0x1FAF, 0x3F7B, - 0x3FD0, 0x3FC0, 0x3FB1, 0x1F82, 0x0FAB, 0x0F92, 0x0F80, 0x0F69, - 0x03B4, 0x01C8, 0x00D6, 0x0063, 0x00D7, 0x01C9, 0x03B5, 0x0F6B, - 0x0F82, 0x0F94, 0x0FAD, 0x1F84, 0x3FB5, 0x3FC2, 0x3FB6, 0x3FBF, - 0x1F85, 0x0FAE, 0x0F96, 0x0F83, 0x0F6C, 0x03B6, 0x01CA, 0x00D8, - 0x0064, 0x00D9, 0x01CB, 0x03B7, 0x0F6E, 0x0F85, 0x0F99, 0x0FB0, - 0x1F87, 0x3FB0, 0x3FB2, 0x3F93, 0x3F86, 0x3F8E, 0x1FB1, 0x1F9D, - 0x0F9A, 0x0F8D, 0x0F74, 0x03CD, 0x03BA, 0x0066, 0x03BB, 0x03CE, - 0x0F75, 0x0F8E, 0x0F9C, 0x1F9E, 0x1FB0, 0x3F8C, 0x3F94, 0x3F8D, - 0xFFFC, 0x3FCA, 0x3FD5, 0x3F8F, 0x1F79, 0x0FB2, 0x0FA1, 0x0FA2, - 0x03D3, 0x03C9, 0x03BE, 0x03CA, 0x03D4, 0x0FA3, 0x0FA4, 0x0FB3, - 0x1F7A, 0x3F90, 0x3FE3, 0x3FD8, 0xFFF2, 0x7FD7, 0x7FCD, 0x3FE4, - 0x3F92, 0x3F82, 0x1FA6, 0x1FA8, 0x1F98, 0x1F7C, 0x0F9D, 0x0F7B, - 0x0F9E, 0x1F80, 0x1F97, 0x1FA7, 0x1FA5, 0x3F7A, 0x3F89, 0x3FDA, - 0x7FD2, 0x7FD6, 0xFFFE, 0xFFED, 0xFFE8, 0x3FCC, 0x3FBD, 0x3FAE, - 0x3FC1, 0x3F9F, 0x3F9A, 0x1F89, 0x1F90, 0x1F8A, 0x3FA3, 0x3FA0, - 0x3FC8, 0x3FBE, 0x3FB7, 0x3FD1, 0xFFE7, 0xFFE9, 0xFFFD, 0xFFF4, - 0xFFE5, 0xFFEF, 0x7FD8, 0x7FDC, 0x3FA2, 0x3F83, 0x3F78, 0x1FA9, - 0x0FB6, 0x0F7C, 0x0FB7, 0x1FAB, 0x3F77, 0x3F7D, 0x3F9B, 0x7FDE, - 0x7FED, 0xFFE6, 0xFFE0, 0xFFF7, 0xFFF1, 0x7FDA, 0x7FE9, 0x7FE2, - 0x7FE3, 0x7FD1, 0x3FD9, 0x3FE2, 0x3FA5, 0x1FB8, 0x03C8, 0x1FB6, - 0x3F9D, 0x3FDE, 0x3FCE, 0x7FD3, 0x7FEE, 0x7FDF, 0x7FE8, 0x7FE4, - 0xFFFA, 0x002C, -]; -const CLV_MVV_2_SYMS: &[u16] = &[ - 0xF6F6, 0xF7F6, 0xF8F6, 0xF9F6, 0xFAF6, 0xFBF6, 0xFCF6, 0xFDF6, - 0xFEF6, 0xFFF6, 0x00F6, 0x01F6, 0x02F6, 0x03F6, 0x04F6, 0x05F6, - 0x06F6, 0x07F6, 0x08F6, 0x09F6, 0x0AF6, 0xF6F7, 0xF7F7, 0xF8F7, - 0xF9F7, 0xFAF7, 0xFBF7, 0xFCF7, 0xFDF7, 0xFEF7, 0xFFF7, 0x00F7, - 0x01F7, 0x02F7, 0x03F7, 0x04F7, 0x05F7, 0x06F7, 0x07F7, 0x08F7, - 0x09F7, 0x0AF7, 0xF6F8, 0xF7F8, 0xF8F8, 0xF9F8, 0xFAF8, 0xFBF8, - 0xFCF8, 0xFDF8, 0xFEF8, 0xFFF8, 0x00F8, 0x01F8, 0x02F8, 0x03F8, - 0x04F8, 0x05F8, 0x06F8, 0x07F8, 0x08F8, 0x09F8, 0x0AF8, 0xF6F9, - 0xF7F9, 0xF8F9, 0xF9F9, 0xFAF9, 0xFBF9, 0xFCF9, 0xFDF9, 0xFEF9, - 0xFFF9, 0x00F9, 0x01F9, 0x02F9, 0x03F9, 0x04F9, 0x05F9, 0x06F9, - 0x07F9, 0x08F9, 0x09F9, 0x0AF9, 0xF6FA, 0xF7FA, 0xF8FA, 0xF9FA, - 0xFAFA, 0xFBFA, 0xFCFA, 0xFDFA, 0xFEFA, 0xFFFA, 0x00FA, 0x01FA, - 0x02FA, 0x03FA, 0x04FA, 0x05FA, 0x06FA, 0x07FA, 0x08FA, 0x09FA, - 0x0AFA, 0xF6FB, 0xF7FB, 0xF8FB, 0xF9FB, 0xFAFB, 0xFBFB, 0xFCFB, - 0xFDFB, 0xFEFB, 0xFFFB, 0x00FB, 0x01FB, 0x02FB, 0x03FB, 0x04FB, - 0x05FB, 0x06FB, 0x07FB, 0x08FB, 0x09FB, 0x0AFB, 0xF6FC, 0xF7FC, - 0xF8FC, 0xF9FC, 0xFAFC, 0xFBFC, 0xFCFC, 0xFDFC, 0xFEFC, 0xFFFC, - 0x00FC, 0x01FC, 0x02FC, 0x03FC, 0x04FC, 0x05FC, 0x06FC, 0x07FC, - 0x08FC, 0x09FC, 0x0AFC, 0xF6FD, 0xF7FD, 0xF8FD, 0xF9FD, 0xFAFD, - 0xFBFD, 0xFCFD, 0xFDFD, 0xFEFD, 0xFFFD, 0x00FD, 0x01FD, 0x02FD, - 0x03FD, 0x04FD, 0x05FD, 0x06FD, 0x07FD, 0x08FD, 0x09FD, 0x0AFD, - 0xF6FE, 0xF7FE, 0xF8FE, 0xF9FE, 0xFAFE, 0xFBFE, 0xFCFE, 0xFDFE, - 0xFEFE, 0xFFFE, 0x00FE, 0x01FE, 0x02FE, 0x03FE, 0x04FE, 0x05FE, - 0x06FE, 0x07FE, 0x08FE, 0x09FE, 0x0AFE, 0xF6FF, 0xF7FF, 0xF8FF, - 0xF9FF, 0xFAFF, 0xFBFF, 0xFCFF, 0xFDFF, 0xFEFF, 0xFFFF, 0x00FF, - 0x01FF, 0x02FF, 0x03FF, 0x04FF, 0x05FF, 0x06FF, 0x07FF, 0x08FF, - 0x09FF, 0x0AFF, 0xF600, 0xF700, 0xF800, 0xF900, 0xFA00, 0xFB00, - 0xFC00, 0xFD00, 0xFE00, 0xFF00, 0x0000, 0x0100, 0x0200, 0x0300, - 0x0400, 0x0500, 0x0600, 0x0700, 0x0800, 0x0900, 0x0A00, 0xF601, - 0xF701, 0xF801, 0xF901, 0xFA01, 0xFB01, 0xFC01, 0xFD01, 0xFE01, - 0xFF01, 0x0001, 0x0101, 0x0201, 0x0301, 0x0401, 0x0501, 0x0601, - 0x0701, 0x0801, 0x0901, 0x0A01, 0xF602, 0xF702, 0xF802, 0xF902, - 0xFA02, 0xFB02, 0xFC02, 0xFD02, 0xFE02, 0xFF02, 0x0002, 0x0102, - 0x0202, 0x0302, 0x0402, 0x0502, 0x0602, 0x0702, 0x0802, 0x0902, - 0x0A02, 0xF603, 0xF703, 0xF803, 0xF903, 0xFA03, 0xFB03, 0xFC03, - 0xFD03, 0xFE03, 0xFF03, 0x0003, 0x0103, 0x0203, 0x0303, 0x0403, - 0x0503, 0x0603, 0x0703, 0x0803, 0x0903, 0x0A03, 0xF604, 0xF704, - 0xF804, 0xF904, 0xFA04, 0xFB04, 0xFC04, 0xFD04, 0xFE04, 0xFF04, - 0x0004, 0x0104, 0x0204, 0x0304, 0x0404, 0x0504, 0x0604, 0x0704, - 0x0804, 0x0904, 0x0A04, 0xF605, 0xF705, 0xF805, 0xF905, 0xFA05, - 0xFB05, 0xFC05, 0xFD05, 0xFE05, 0xFF05, 0x0005, 0x0105, 0x0205, - 0x0305, 0x0405, 0x0505, 0x0605, 0x0705, 0x0805, 0x0905, 0x0A05, - 0xF606, 0xF706, 0xF806, 0xF906, 0xFA06, 0xFB06, 0xFC06, 0xFD06, - 0xFE06, 0xFF06, 0x0006, 0x0106, 0x0206, 0x0306, 0x0406, 0x0506, - 0x0606, 0x0706, 0x0806, 0x0906, 0x0A06, 0xF607, 0xF707, 0xF807, - 0xF907, 0xFA07, 0xFB07, 0xFC07, 0xFD07, 0xFE07, 0xFF07, 0x0007, - 0x0107, 0x0207, 0x0307, 0x0407, 0x0507, 0x0607, 0x0707, 0x0807, - 0x0907, 0x0A07, 0xF608, 0xF708, 0xF808, 0xF908, 0xFA08, 0xFB08, - 0xFC08, 0xFD08, 0xFE08, 0xFF08, 0x0008, 0x0108, 0x0208, 0x0308, - 0x0408, 0x0508, 0x0608, 0x0708, 0x0808, 0x0908, 0x0A08, 0xF609, - 0xF709, 0xF809, 0xF909, 0xFA09, 0xFB09, 0xFC09, 0xFD09, 0xFE09, - 0xFF09, 0x0009, 0x0109, 0x0209, 0x0309, 0x0409, 0x0509, 0x0609, - 0x0709, 0x0809, 0x0909, 0x0A09, 0xF60A, 0xF70A, 0xF80A, 0xF90A, - 0xFA0A, 0xFB0A, 0xFC0A, 0xFD0A, 0xFE0A, 0xFF0A, 0x000A, 0x010A, - 0x020A, 0x030A, 0x040A, 0x050A, 0x060A, 0x070A, 0x080A, 0x090A, - 0x0A0A, 0x0B0B, -]; -const CLV_MVV_2_ESCAPE: u16 = 0x0B0B; - -const CLV_BIASV_2_BITS: &[u8] = &[ - 16, 15, 14, 13, 13, 13, 13, 13, 12, 12, 11, 10, 10, 9, 9, 8, - 7, 6, 5, 4, 3, 1, 3, 4, 5, 7, 7, 8, 9, 9, 10, 10, - 10, 12, 12, 13, 13, 13, 13, 13, 14, 16, 15, 15, -]; -const CLV_BIASV_2_CODES: &[u16] = &[ - 0xFFFE, 0x7FFD, 0x3FFC, 0x1FFC, 0x1FFB, 0x1FF8, 0x1FF7, 0x1FF4, - 0x0FF8, 0x0FF7, 0x07FA, 0x03FB, 0x03F8, 0x01FA, 0x01F9, 0x00FA, - 0x007B, 0x003C, 0x001C, 0x000C, 0x0004, 0x0000, 0x0005, 0x000D, - 0x001D, 0x007A, 0x007C, 0x00FB, 0x01F8, 0x01FB, 0x03F9, 0x03FA, - 0x03FC, 0x0FF6, 0x0FF9, 0x1FF5, 0x1FF9, 0x1FF6, 0x1FFA, 0x1FFD, - 0x3FFD, 0xFFFF, 0x7FFE, 0x7FFC, -]; -const CLV_BIASV_2_SYMS: &[u16] = &[ - 0xFFAC, 0xFFB0, 0xFFB4, 0xFFB8, 0xFFBC, 0xFFC0, 0xFFC4, 0xFFC8, - 0xFFCC, 0xFFD0, 0xFFD4, 0xFFD8, 0xFFDC, 0xFFE0, 0xFFE4, 0xFFE8, - 0xFFEC, 0xFFF0, 0xFFF4, 0xFFF8, 0xFFFC, 0x0000, 0x0004, 0x0008, - 0x000C, 0x0010, 0x0014, 0x0018, 0x001C, 0x0020, 0x0024, 0x0028, - 0x002C, 0x0030, 0x0034, 0x0038, 0x003C, 0x0040, 0x0044, 0x0048, - 0x004C, 0x0050, 0x0054, 0x0100, -]; - diff --git a/src/codecs/gremlinvideo.rs b/src/codecs/gremlinvideo.rs deleted file mode 100644 index 28663a4..0000000 --- a/src/codecs/gremlinvideo.rs +++ /dev/null @@ -1,566 +0,0 @@ -use crate::formats; -use crate::formats::{NAChannelType, NAChannelMap}; -use super::*; -use crate::io::byteio::*; - -struct GremlinVideoDecoder { - info: Rc<NACodecInfo>, - pal: [u8; 768], - frame: Vec<u8>, - scale_v: bool, - scale_h: bool, -} - -struct Bits8 { - queue: u8, - fill: u8, -} - -struct Bits32 { - queue: u32, - fill: u8, -} - -const PREAMBLE_SIZE: usize = 4096; - -impl Bits8 { - fn new() -> Self { Bits8 { queue: 0, fill: 0 } } - fn read_2bits(&mut self, br: &mut ByteReader) -> ByteIOResult<u8> { - if self.fill == 0 { - self.queue = br.read_byte()?; - self.fill += 8; - } - let res = self.queue >> 6; - self.queue <<= 2; - self.fill -= 2; - Ok(res) - } -} - -impl Bits32 { - fn new() -> Self { Bits32 { queue: 0, fill: 0 } } - fn fill(&mut self, br: &mut ByteReader) -> ByteIOResult<()> { - self.queue = br.read_u32le()?; - self.fill = 32; - Ok(()) - } - fn read_bits(&mut self, br: &mut ByteReader, nbits: u8) -> ByteIOResult<u32> { - let res = self.queue & ((1 << nbits) - 1); - self.queue >>= nbits; - self.fill -= nbits; - if self.fill <= 16 { - self.queue |= (br.read_u16le()? as u32) << self.fill; - self.fill += 16; - } - Ok(res) - } -} - -impl GremlinVideoDecoder { - fn new() -> Self { - let dummy_info = Rc::new(DUMMY_CODEC_INFO); - GremlinVideoDecoder { - info: dummy_info, pal: [0; 768], frame: Vec::new(), - scale_v: false, scale_h: false - } - } - - fn lz_copy(&mut self, idx: usize, offset: isize, len: usize) -> DecoderResult<()> { - if idx + len > self.frame.len() { return Err(DecoderError::InvalidData); } - if offset == -1 { - let c = self.frame[idx - 1]; - for i in 0..len { self.frame[idx + i] = c; } - } else if offset < 0 { - let start = idx - (-offset as usize); - for i in 0..len { self.frame[idx + i] = self.frame[start + i]; } - } else { - if idx + (offset as usize) + len > self.frame.len() { return Err(DecoderError::InvalidData); } - let start = idx + (offset as usize); - for i in 0..len { self.frame[idx + i] = self.frame[start + i]; } - } - Ok(()) - } - - fn rescale(&mut self, w: usize, h: usize, scale_v: bool, scale_h: bool) { - if (self.scale_v == scale_v) && (self.scale_h == scale_h) { return; } - - if self.scale_h && self.scale_v { - for j in 0..h { - let y = h - j - 1; - for i in 0..w { - let x = w - i - 1; - self.frame[PREAMBLE_SIZE + x + y * w] = self.frame[PREAMBLE_SIZE + x/2 + (y/2) * (w/2)]; - } - } - } else if self.scale_h { - for j in 0..h { - let y = h - j - 1; - for x in 0..w { - self.frame[PREAMBLE_SIZE + x + y * w] = self.frame[PREAMBLE_SIZE + x + (y/2) * w]; - } - } - } else if self.scale_v { - for j in 0..h { - let y = h - j - 1; - for i in 0..w { - let x = w - i - 1; - self.frame[PREAMBLE_SIZE + x + y * w] = self.frame[PREAMBLE_SIZE + x/2 + y * (w/2)]; - } - } - } - - if scale_h && scale_v { - for y in 0..h/2 { - for x in 0..w/2 { - self.frame[PREAMBLE_SIZE + x + y * (w/2)] = self.frame[PREAMBLE_SIZE + x*2 + y*2 * w]; - } - } - } else if scale_h { - for y in 0..h/2 { - for x in 0..w { - self.frame[PREAMBLE_SIZE + x + y * w] = self.frame[PREAMBLE_SIZE + x + y*2 * w]; - } - } - } else if scale_v { - for y in 0..h { - for x in 0..w/2 { - self.frame[PREAMBLE_SIZE + x + y * w] = self.frame[PREAMBLE_SIZE + x*2 + y * w]; - } - } - } - - self.scale_v = scale_v; - self.scale_h = scale_h; - } - - fn output_frame(&mut self, bufinfo: &mut NABufferType, w: usize, h: usize) { - let bufo = bufinfo.get_vbuf(); - let mut buf = bufo.unwrap(); - let paloff = buf.get_offset(1); - let stride = buf.get_stride(0); - let mut data = buf.get_data_mut(); - let dst = data.as_mut_slice(); - let mut sidx = PREAMBLE_SIZE; - let mut didx = 0; - - for i in 0..768 { dst[paloff + i] = self.pal[i]; } - if !self.scale_v && !self.scale_h { - for _ in 0..h { - for x in 0..w { dst[didx + x] = self.frame[sidx + x]; } - sidx += w; - didx += stride; - } - } else { - for y in 0..h { - if !self.scale_v { - for x in 0..w { dst[didx + x] = self.frame[sidx + x]; } - } else { - for x in 0..w { dst[didx + x] = self.frame[sidx + x/2]; } - } - if !self.scale_h || ((y & 1) == 1) { - sidx += if !self.scale_v { w } else { w/2 }; - } - didx += stride; - } - } - } - - fn decode_method2(&mut self, br: &mut ByteReader) -> DecoderResult<()> { - let mut bits = Bits8::new(); - - let mut size = self.info.get_properties().get_video_info().unwrap().get_width() * - self.info.get_properties().get_video_info().unwrap().get_height(); - let mut idx = PREAMBLE_SIZE; - if self.frame[8] != 0 { - for c in 0..256 { - for i in 0..16 { self.frame[c * 16 + i] = c as u8; } - } - } - while size > 0 { - let tag = bits.read_2bits(br)?; - if tag == 0 { - self.frame[idx] = br.read_byte()?; - size -= 1; - idx += 1; - } else if tag == 1 { - let b = br.read_byte()?; - let len = ((b & 0xF) as usize) + 3; - let bot = (b >> 4) as isize; - let off = ((br.read_byte()? as isize) << 4) + bot - 4096; - validate!(len <= size); - size -= len; - self.lz_copy(idx, off, len)?; - idx += len; - } else if tag == 2 { - let len = (br.read_byte()? as usize) + 2; - validate!(len <= size); - size -= len; - idx += len; - } else { - break; - } - } - Ok(()) - } - - fn decode_method5(&mut self, br: &mut ByteReader, skip: usize) -> DecoderResult<()> { - let mut bits = Bits8::new(); - - let mut size = self.info.get_properties().get_video_info().unwrap().get_width() * - self.info.get_properties().get_video_info().unwrap().get_height(); - let mut idx = PREAMBLE_SIZE; - validate!(size >= skip); - size -= skip; - idx += skip; - while size > 0 { - let tag = bits.read_2bits(br)?; - if tag == 0 { - self.frame[idx] = br.read_byte()?; - size -= 1; - idx += 1; - } else if tag == 1 { - let b = br.read_byte()?; - let len = ((b & 0xF) as usize) + 3; - let bot = (b >> 4) as isize; - let off = ((br.read_byte()? as isize) << 4) + bot - 4096; - validate!(len <= size); - size -= len; - self.lz_copy(idx, off, len)?; - idx += len; - } else if tag == 2 { - let b = br.read_byte()?; - if b == 0 { break; } - let len: usize = (if b != 0xFF { b as usize } else { br.read_u16le()? as usize }) + 1; - validate!(len <= size); - size -= len; - idx += len; - } else { - let b = br.read_byte()?; - let len = ((b & 0x3) as usize) + 2; - let off = -((b >> 2) as isize) - 1; - validate!(len <= size); - size -= len; - self.lz_copy(idx, off, len)?; - idx += len; - } - } - Ok(()) - } - - fn decode_method68(&mut self, br: &mut ByteReader, - skip: usize, use8: bool) -> DecoderResult<()> { - let mut bits = Bits32::new(); - - let mut size = self.info.get_properties().get_video_info().unwrap().get_width() * - self.info.get_properties().get_video_info().unwrap().get_height(); - let mut idx = PREAMBLE_SIZE; - validate!(size >= skip); - size -= skip; - idx += skip; - bits.fill(br)?; - while size > 0 { - let tag = bits.read_bits(br, 2)?; - if tag == 0 { //draw - let b = bits.read_bits(br, 1)?; - if b == 0 { - self.frame[idx] = br.read_byte()?; - size -= 1; - idx += 1; - } else { - let mut len: usize = 2; - let mut lbits = 0; - loop { - lbits += 1; - let val = bits.read_bits(br, lbits)?; - len += val as usize; - if val != ((1 << lbits) - 1) { break; } - validate!(lbits < 16); - } - validate!(len <= size); - for i in 0..len { self.frame[idx + i] = br.read_byte()?; } - size -= len; - idx += len; - } - } else if tag == 1 { //skip - let b = bits.read_bits(br, 1)?; - let len: usize; - if b == 0 { - len = (bits.read_bits(br, 4)? as usize) + 2; - } else { - let bb = br.read_byte()?; - if (bb & 0x80) == 0 { - len = (bb as usize) + 18; - } else { - let top = ((bb & 0x7F) as usize) << 8; - len = top + (br.read_byte()? as usize) + 146; - } - } - validate!(len <= size); - size -= len; - idx += len; - } else if tag == 2 { - let subtag = bits.read_bits(br, 2)? as usize; - if subtag != 3 { - let top = (bits.read_bits(br, 4)? as usize) << 8; - let offs = top + (br.read_byte()? as usize); - if (subtag != 0) || (offs <= 0xF80) { - let len = (subtag as usize) + 3; - self.lz_copy(idx, (offs as isize) - 4096, len)?; - idx += len; - } else { - if offs == 0xFFF { return Ok(()); } - let real_off = ((offs >> 4) & 0x7) + 1; - let len = ((offs & 0xF) + 2) * 2; - validate!(len <= size); - size -= len; - let c1 = self.frame[idx - real_off]; - let c2 = self.frame[idx - real_off + 1]; - for i in 0..len/2 { - self.frame[idx + i*2 + 0] = c1; - self.frame[idx + i*2 + 1] = c2; - } - idx += len; - } - } else { - let b = br.read_byte()?; - let off = ((b & 0x7F) as usize) + 1; - let len = if (b & 0x80) == 0 { 2 } else { 3 }; - validate!(len <= size); - size -= len; - self.lz_copy(idx, -(off as isize), len)?; - idx += len; - } - } else { - let len: usize; - let off: isize; - if use8 { - let b = br.read_byte()?; - if (b & 0xC0) == 0xC0 { - len = ((b & 0x3F) as usize) + 8; - let q = bits.read_bits(br, 4)? as isize; - off = (q << 8) + (br.read_byte()? as isize) + 1; - } else { - let ofs1: isize; - if (b & 0x80) == 0 { - len = ((b >> 4) as usize) + 6; - ofs1 = (b & 0xF) as isize; - } else { - len = ((b & 0x3F) as usize) + 14; - ofs1 = bits.read_bits(br, 4)? as isize; - } - off = (ofs1 << 8) + (br.read_byte()? as isize) - 4096; - } - } else { - let b = br.read_byte()?; - if (b >> 4) == 0xF { - len = (br.read_byte()? as usize) + 21; - } else { - len = ((b >> 4) as usize) + 6; - } - let ofs1 = (b & 0xF) as isize; - off = (ofs1 << 8) + (br.read_byte()? as isize) - 4096; - } - validate!(len <= size); - size -= len; - self.lz_copy(idx, off, len)?; - idx += len; - } - } - Ok(()) - } -} - -impl NADecoder for GremlinVideoDecoder { - fn init(&mut self, info: Rc<NACodecInfo>) -> DecoderResult<()> { - if let NACodecTypeInfo::Video(vinfo) = info.get_properties() { - let w = vinfo.get_width(); - let h = vinfo.get_height(); - if !vinfo.get_format().is_paletted() { return Err(DecoderError::NotImplemented); } - let fmt = formats::PAL8_FORMAT; - let myinfo = NACodecTypeInfo::Video(NAVideoInfo::new(w, h, false, fmt)); - self.info = Rc::new(NACodecInfo::new_ref(info.get_name(), myinfo, info.get_extradata())); - - self.frame.resize(PREAMBLE_SIZE + w * h, 0); - for i in 0..2 { - for j in 0..256 { - for k in 0..8 { - self.frame[i * 2048 + j * 8 + k] = j as u8; - } - } - } - let edata = info.get_extradata().unwrap(); - validate!(edata.len() == 768); - for c in 0..256 { - for i in 0..3 { - let cc = edata[c * 3 + i]; - self.pal[c * 3 + (2 - i)] = (cc << 2) | (cc >> 4); - } - } - Ok(()) - } else { - Err(DecoderError::InvalidData) - } - } - fn decode(&mut self, pkt: &NAPacket) -> DecoderResult<NAFrameRef> { - let src = pkt.get_buffer(); - let mut mr = MemoryReader::new_read(&src); - let mut br = ByteReader::new(&mut mr); - let flags = br.read_u32le()?; - let w = self.info.get_properties().get_video_info().unwrap().get_width(); - let h = self.info.get_properties().get_video_info().unwrap().get_height(); - - let cmethod = flags & 0xF; - let is_intra = (flags & 0x40) != 0; - let scale_v = (flags & 0x10) != 0; - let scale_h = (flags & 0x20) != 0; - - self.rescale(w, h, scale_v, scale_h); - - if (cmethod == 0) || (cmethod == 1) { - for c in 0..256 { - for i in 0..3 { - let b = br.read_byte()?; - self.pal[c * 3 + (2 - i)] = (b << 2) | (b >> 4); - } - } - if cmethod == 1 { - for i in PREAMBLE_SIZE..self.frame.len() { self.frame[i] = 0x00; } - } - let mut frm = NAFrame::new_from_pkt(pkt, self.info.clone(), NABufferType::None); - frm.set_keyframe(false); - frm.set_frame_type(FrameType::Skip); - return Ok(Rc::new(RefCell::new(frm))) - } else if cmethod == 3 { - let mut frm = NAFrame::new_from_pkt(pkt, self.info.clone(), NABufferType::None); - frm.set_keyframe(false); - frm.set_frame_type(FrameType::Skip); - return Ok(Rc::new(RefCell::new(frm))) - } else if cmethod == 2 { - self.decode_method2(&mut br)?; - } else if cmethod == 5 { - self.decode_method5(&mut br, (flags >> 8) as usize)?; - } else if cmethod == 6 { - self.decode_method68(&mut br, (flags >> 8) as usize, false)?; - } else if cmethod == 8 { - self.decode_method68(&mut br, (flags >> 8) as usize, true)?; - } else { - return Err(DecoderError::NotImplemented); - } - - let bufret = alloc_video_buffer(self.info.get_properties().get_video_info().unwrap(), 0); - if let Err(_) = bufret { return Err(DecoderError::InvalidData); } - let mut bufinfo = bufret.unwrap(); - - self.output_frame(&mut bufinfo, w, h); - - let mut frm = NAFrame::new_from_pkt(pkt, self.info.clone(), bufinfo); - frm.set_keyframe(is_intra); - frm.set_frame_type(if is_intra { FrameType::I } else { FrameType::P }); - Ok(Rc::new(RefCell::new(frm))) - } -} - -pub fn get_decoder_video() -> Box<NADecoder> { - Box::new(GremlinVideoDecoder::new()) -} - -struct GremlinAudioDecoder { - ainfo: NAAudioInfo, - chmap: NAChannelMap, - delta_tab: [i16; 256], - state0: i16, - state1: i16, -} - -impl GremlinAudioDecoder { - fn new() -> Self { - let mut delta_tab: [i16; 256] = [0; 256]; - let mut delta = 0; - let mut code = 64; - let mut step = 45; - for i in 0..127 { - delta += code >> 5; - code += step; - step += 2; - delta_tab[i * 2 + 1] = delta; - delta_tab[i * 2 + 2] = -delta; - } - delta_tab[255] = 32767;//delta + (code >> 5); - GremlinAudioDecoder { - ainfo: NAAudioInfo::new(0, 1, formats::SND_S16_FORMAT, 0), - chmap: NAChannelMap::new(), - delta_tab, - state0: 0, - state1: 0, - } - } -} - -const CHMAP_MONO: [NAChannelType; 1] = [NAChannelType::C]; -const CHMAP_STEREO: [NAChannelType; 2] = [NAChannelType::L, NAChannelType::R]; - -fn get_default_chmap(nch: u8) -> NAChannelMap { - let mut chmap = NAChannelMap::new(); - match nch { - 1 => chmap.add_channels(&CHMAP_MONO), - 2 => chmap.add_channels(&CHMAP_STEREO), - _ => (), - } - chmap -} - -impl NADecoder for GremlinAudioDecoder { - fn init(&mut self, info: Rc<NACodecInfo>) -> DecoderResult<()> { - if let NACodecTypeInfo::Audio(ainfo) = info.get_properties() { - self.ainfo = NAAudioInfo::new(ainfo.get_sample_rate(), ainfo.get_channels(), formats::SND_S16P_FORMAT, ainfo.get_block_len()); - self.chmap = get_default_chmap(ainfo.get_channels()); - if self.chmap.num_channels() == 0 { return Err(DecoderError::InvalidData); } - Ok(()) - } else { - Err(DecoderError::InvalidData) - } - } - fn decode(&mut self, pkt: &NAPacket) -> DecoderResult<NAFrameRef> { - let info = pkt.get_stream().get_info(); - if let NACodecTypeInfo::Audio(_) = info.get_properties() { - let pktbuf = pkt.get_buffer(); - let samples = pktbuf.len() / self.chmap.num_channels(); - let mut abuf = alloc_audio_buffer(self.ainfo, samples, self.chmap.clone())?; - let mut adata = abuf.get_abuf_i16().unwrap(); - let off1 = adata.get_offset(1); - let mut buf = adata.get_data_mut(); - if self.chmap.num_channels() == 2 { - for (i, e) in pktbuf.chunks(2).enumerate() { - self.state0 = self.state0.wrapping_add(self.delta_tab[e[0] as usize]); - buf[i] = self.state0; - self.state1 = self.state1.wrapping_add(self.delta_tab[e[1] as usize]); - buf[off1 + i] = self.state1; - } - } else { - for (i, e) in pktbuf.iter().enumerate() { - self.state0 += self.delta_tab[*e as usize]; - buf[i] = self.state0; - } - } - let mut frm = NAFrame::new_from_pkt(pkt, info, abuf); - frm.set_duration(Some(samples as u64)); - frm.set_keyframe(false); - Ok(Rc::new(RefCell::new(frm))) - } else { - Err(DecoderError::InvalidData) - } - } -} - -pub fn get_decoder_audio() -> Box<NADecoder> { - Box::new(GremlinAudioDecoder::new()) -} - -#[cfg(test)] -mod test { - use crate::test::dec_video::test_file_decoding; - #[test] - fn test_gdv() { - test_file_decoding("gdv", "assets/intro1.gdv", Some(10), true, false, None); - } -} diff --git a/src/codecs/h263/code.rs b/src/codecs/h263/code.rs deleted file mode 100644 index dd1279e..0000000 --- a/src/codecs/h263/code.rs +++ /dev/null @@ -1,497 +0,0 @@ -use crate::frame::NAVideoBuffer; -use super::{BlockDSP, CBPInfo, MV}; -use super::super::blockdsp; -//use super::h263data::*; - -/*const W1: i32 = 22725; -const W2: i32 = 21407; -const W3: i32 = 19266; -const W4: i32 = 16383; -const W5: i32 = 12873; -const W6: i32 = 8867; -const W7: i32 = 4520; - -const ROW_SHIFT: u8 = 11; -const COL_SHIFT: u8 = 20; - -fn idct_row(row: &mut [i16]) { - let in0 = row[0] as i32; - let in1 = row[1] as i32; - let in2 = row[2] as i32; - let in3 = row[3] as i32; - let in4 = row[4] as i32; - let in5 = row[5] as i32; - let in6 = row[6] as i32; - let in7 = row[7] as i32; - - let mut a0 = in0 * W1 + (1 << (ROW_SHIFT - 1)); - let mut a1 = a0; - let mut a2 = a0; - let mut a3 = a0; - - a0 += W2 * in2; - a1 += W6 * in2; - a2 -= W6 * in2; - a3 -= W2 * in2; - - let mut b0 = W1 * in1 + W3 * in3; - let mut b1 = W3 * in1 - W7 * in3; - let mut b2 = W5 * in1 - W1 * in3; - let mut b3 = W7 * in1 - W5 * in3; - - a0 += W4 * in4 + W6 * in6; - a1 -= W4 * in4 + W2 * in6; - a2 -= W4 * in4 - W2 * in6; - a3 += W4 * in4 - W6 * in6; - - b0 += W5 * in5 + W7 * in7; - b1 -= W1 * in5 + W5 * in7; - b2 += W7 * in5 + W3 * in7; - b3 += W3 * in5 - W1 * in7; - - row[0] = ((a0 + b0) >> ROW_SHIFT) as i16; - row[7] = ((a0 - b0) >> ROW_SHIFT) as i16; - row[1] = ((a1 + b1) >> ROW_SHIFT) as i16; - row[6] = ((a1 - b1) >> ROW_SHIFT) as i16; - row[2] = ((a2 + b2) >> ROW_SHIFT) as i16; - row[5] = ((a2 - b2) >> ROW_SHIFT) as i16; - row[3] = ((a3 + b3) >> ROW_SHIFT) as i16; - row[4] = ((a3 - b3) >> ROW_SHIFT) as i16; -} - -fn idct_col(blk: &mut [i16; 64], off: usize) { - let in0 = blk[off + 0*8] as i32; - let in1 = blk[off + 1*8] as i32; - let in2 = blk[off + 2*8] as i32; - let in3 = blk[off + 3*8] as i32; - let in4 = blk[off + 4*8] as i32; - let in5 = blk[off + 5*8] as i32; - let in6 = blk[off + 6*8] as i32; - let in7 = blk[off + 7*8] as i32; - - let mut a0 = in0 * W1 + (1 << (COL_SHIFT - 1)); - let mut a1 = a0; - let mut a2 = a0; - let mut a3 = a0; - - a0 += W2 * in2; - a1 += W6 * in2; - a2 -= W6 * in2; - a3 -= W2 * in2; - - let mut b0 = W1 * in1 + W3 * in3; - let mut b1 = W3 * in1 - W7 * in3; - let mut b2 = W5 * in1 - W1 * in3; - let mut b3 = W7 * in1 - W5 * in3; - - a0 += W4 * in4 + W6 * in6; - a1 -= W4 * in4 + W2 * in6; - a2 -= W4 * in4 - W2 * in6; - a3 += W4 * in4 - W6 * in6; - - b0 += W5 * in5 + W7 * in7; - b1 -= W1 * in5 + W5 * in7; - b2 += W7 * in5 + W3 * in7; - b3 += W3 * in5 - W1 * in7; - - blk[off + 0*8] = ((a0 + b0) >> COL_SHIFT) as i16; - blk[off + 7*8] = ((a0 - b0) >> COL_SHIFT) as i16; - blk[off + 1*8] = ((a1 + b1) >> COL_SHIFT) as i16; - blk[off + 6*8] = ((a1 - b1) >> COL_SHIFT) as i16; - blk[off + 2*8] = ((a2 + b2) >> COL_SHIFT) as i16; - blk[off + 5*8] = ((a2 - b2) >> COL_SHIFT) as i16; - blk[off + 3*8] = ((a3 + b3) >> COL_SHIFT) as i16; - blk[off + 4*8] = ((a3 - b3) >> COL_SHIFT) as i16; -} - -#[allow(dead_code)] -pub fn h263_idct(blk: &mut [i16; 64]) { - for i in 0..8 { idct_row(&mut blk[i*8..(i+1)*8]); } - for i in 0..8 { idct_col(blk, i); } -}*/ - -const W1: i32 = 2841; -const W2: i32 = 2676; -const W3: i32 = 2408; -const W5: i32 = 1609; -const W6: i32 = 1108; -const W7: i32 = 565; -const W8: i32 = 181; - -const ROW_SHIFT: u8 = 8; -const COL_SHIFT: u8 = 14; - -fn idct_row(row: &mut [i16]) { - let in0 = ((row[0] as i32) << 11) + (1 << (ROW_SHIFT - 1)); - let in1 = (row[4] as i32) << 11; - let in2 = row[6] as i32; - let in3 = row[2] as i32; - let in4 = row[1] as i32; - let in5 = row[7] as i32; - let in6 = row[5] as i32; - let in7 = row[3] as i32; - - let tmp = W7 * (in4 + in5); - let a4 = tmp + (W1 - W7) * in4; - let a5 = tmp - (W1 + W7) * in5; - - let tmp = W3 * (in6 + in7); - let a6 = tmp - (W3 - W5) * in6; - let a7 = tmp - (W3 + W5) * in7; - - let tmp = in0 + in1; - - let a0 = in0 - in1; - let t1 = W6 * (in2 + in3); - let a2 = t1 - (W2 + W6) * in2; - let a3 = t1 + (W2 - W6) * in3; - let b1 = a4 + a6; - - let b4 = a4 - a6; - let t2 = a5 - a7; - let b6 = a5 + a7; - let b7 = tmp + a3; - let b5 = tmp - a3; - let b3 = a0 + a2; - let b0 = a0 - a2; - let b2 = (W8 * (b4 + t2) + 128) >> 8; - let b4 = (W8 * (b4 - t2) + 128) >> 8; - - row[0] = ((b7 + b1) >> ROW_SHIFT) as i16; - row[7] = ((b7 - b1) >> ROW_SHIFT) as i16; - row[1] = ((b3 + b2) >> ROW_SHIFT) as i16; - row[6] = ((b3 - b2) >> ROW_SHIFT) as i16; - row[2] = ((b0 + b4) >> ROW_SHIFT) as i16; - row[5] = ((b0 - b4) >> ROW_SHIFT) as i16; - row[3] = ((b5 + b6) >> ROW_SHIFT) as i16; - row[4] = ((b5 - b6) >> ROW_SHIFT) as i16; -} - -fn idct_col(blk: &mut [i16; 64], off: usize) { - let in0 = ((blk[off + 0*8] as i32) << 8) + (1 << (COL_SHIFT - 1)); - let in1 = (blk[off + 4*8] as i32) << 8; - let in2 = blk[off + 6*8] as i32; - let in3 = blk[off + 2*8] as i32; - let in4 = blk[off + 1*8] as i32; - let in5 = blk[off + 7*8] as i32; - let in6 = blk[off + 5*8] as i32; - let in7 = blk[off + 3*8] as i32; - - let tmp = W7 * (in4 + in5); - let a4 = (tmp + (W1 - W7) * in4) >> 3; - let a5 = (tmp - (W1 + W7) * in5) >> 3; - - let tmp = W3 * (in6 + in7); - let a6 = (tmp - (W3 - W5) * in6) >> 3; - let a7 = (tmp - (W3 + W5) * in7) >> 3; - - let tmp = in0 + in1; - - let a0 = in0 - in1; - let t1 = W6 * (in2 + in3); - let a2 = (t1 - (W2 + W6) * in2) >> 3; - let a3 = (t1 + (W2 - W6) * in3) >> 3; - let b1 = a4 + a6; - - let b4 = a4 - a6; - let t2 = a5 - a7; - let b6 = a5 + a7; - let b7 = tmp + a3; - let b5 = tmp - a3; - let b3 = a0 + a2; - let b0 = a0 - a2; - let b2 = (W8 * (b4 + t2) + 128) >> 8; - let b4 = (W8 * (b4 - t2) + 128) >> 8; - - blk[off + 0*8] = ((b7 + b1) >> COL_SHIFT) as i16; - blk[off + 7*8] = ((b7 - b1) >> COL_SHIFT) as i16; - blk[off + 1*8] = ((b3 + b2) >> COL_SHIFT) as i16; - blk[off + 6*8] = ((b3 - b2) >> COL_SHIFT) as i16; - blk[off + 2*8] = ((b0 + b4) >> COL_SHIFT) as i16; - blk[off + 5*8] = ((b0 - b4) >> COL_SHIFT) as i16; - blk[off + 3*8] = ((b5 + b6) >> COL_SHIFT) as i16; - blk[off + 4*8] = ((b5 - b6) >> COL_SHIFT) as i16; -} - -#[allow(dead_code)] -pub fn h263_idct(blk: &mut [i16; 64]) { - for i in 0..8 { idct_row(&mut blk[i*8..(i+1)*8]); } - for i in 0..8 { idct_col(blk, i); } -} - -fn h263_interp00(dst: &mut [u8], dstride: usize, src: &[u8], sstride: usize, bw: usize, bh: usize) -{ - let mut didx = 0; - let mut sidx = 0; - for _ in 0..bh { - for x in 0..bw { dst[didx + x] = src[sidx + x]; } - didx += dstride; - sidx += sstride; - } -} - -fn h263_interp01(dst: &mut [u8], dstride: usize, src: &[u8], sstride: usize, bw: usize, bh: usize) -{ - let mut didx = 0; - let mut sidx = 0; - for _ in 0..bh { - for x in 0..bw { dst[didx + x] = (((src[sidx + x] as u16) + (src[sidx + x + 1] as u16) + 1) >> 1) as u8; } - didx += dstride; - sidx += sstride; - } -} - -fn h263_interp10(dst: &mut [u8], dstride: usize, src: &[u8], sstride: usize, bw: usize, bh: usize) -{ - let mut didx = 0; - let mut sidx = 0; - for _ in 0..bh { - for x in 0..bw { dst[didx + x] = (((src[sidx + x] as u16) + (src[sidx + x + sstride] as u16) + 1) >> 1) as u8; } - didx += dstride; - sidx += sstride; - } -} - -fn h263_interp11(dst: &mut [u8], dstride: usize, src: &[u8], sstride: usize, bw: usize, bh: usize) -{ - let mut didx = 0; - let mut sidx = 0; - for _ in 0..bh { - for x in 0..bw { - dst[didx + x] = (((src[sidx + x] as u16) + - (src[sidx + x + 1] as u16) + - (src[sidx + x + sstride] as u16) + - (src[sidx + x + sstride + 1] as u16) + 2) >> 2) as u8; - } - didx += dstride; - sidx += sstride; - } -} - -pub const H263_INTERP_FUNCS: &[fn(&mut [u8], usize, &[u8], usize, usize, usize)] = &[ - h263_interp00, h263_interp01, h263_interp10, h263_interp11 ]; - -fn h263_interp00_avg(dst: &mut [u8], dstride: usize, src: &[u8], sstride: usize, bw: usize, bh: usize) -{ - let mut didx = 0; - let mut sidx = 0; - for _ in 0..bh { - for x in 0..bw { - let a = dst[didx + x] as u16; - let b = src[sidx + x] as u16; - dst[didx + x] = ((a + b + 1) >> 1) as u8; - } - didx += dstride; - sidx += sstride; - } -} - -fn h263_interp01_avg(dst: &mut [u8], dstride: usize, src: &[u8], sstride: usize, bw: usize, bh: usize) -{ - let mut didx = 0; - let mut sidx = 0; - for _ in 0..bh { - for x in 0..bw { - let a = dst[didx + x] as u16; - let b = ((src[sidx + x] as u16) + (src[sidx + x + 1] as u16) + 1) >> 1; - dst[didx + x] = ((a + b + 1) >> 1) as u8; - } - didx += dstride; - sidx += sstride; - } -} - -fn h263_interp10_avg(dst: &mut [u8], dstride: usize, src: &[u8], sstride: usize, bw: usize, bh: usize) -{ - let mut didx = 0; - let mut sidx = 0; - for _ in 0..bh { - for x in 0..bw { - let a = dst[didx + x] as u16; - let b = ((src[sidx + x] as u16) + (src[sidx + x + sstride] as u16) + 1) >> 1; - dst[didx + x] = ((a + b + 1) >> 1) as u8; - } - didx += dstride; - sidx += sstride; - } -} - -fn h263_interp11_avg(dst: &mut [u8], dstride: usize, src: &[u8], sstride: usize, bw: usize, bh: usize) -{ - let mut didx = 0; - let mut sidx = 0; - for _ in 0..bh { - for x in 0..bw { - let a = dst[didx + x] as u16; - let b = ((src[sidx + x] as u16) + - (src[sidx + x + 1] as u16) + - (src[sidx + x + sstride] as u16) + - (src[sidx + x + sstride + 1] as u16) + 2) >> 2; - dst[didx + x] = ((a + b + 1) >> 1) as u8; - } - didx += dstride; - sidx += sstride; - } -} - -pub const H263_INTERP_AVG_FUNCS: &[fn(&mut [u8], usize, &[u8], usize, usize, usize)] = &[ - h263_interp00_avg, h263_interp01_avg, h263_interp10_avg, h263_interp11_avg ]; - -pub struct H263BlockDSP { } - -impl H263BlockDSP { - pub fn new() -> Self { - H263BlockDSP { } - } -} - -fn deblock_hor(buf: &mut NAVideoBuffer<u8>, comp: usize, q: u8, off: usize) { - let stride = buf.get_stride(comp); - let mut dptr = buf.get_data_mut(); - let buf = dptr.as_mut_slice(); - for x in 0..8 { - let a = buf[off - 2 * stride + x] as i16; - let b = buf[off - 1 * stride + x] as i16; - let c = buf[off + 0 * stride + x] as i16; - let d = buf[off + 1 * stride + x] as i16; - let diff = ((a - d) * 3 + (c - b) * 8) >> 4; - if (diff != 0) && (diff >= -32) && (diff < 32) { - let d0 = diff.abs() * 2 - (q as i16); - let d1 = if d0 < 0 { 0 } else { d0 }; - let d2 = diff.abs() - d1; - let d3 = if d2 < 0 { 0 } else { d2 }; - - let delta = if diff < 0 { -d3 } else { d3 }; - - let b1 = b + delta; - if b1 < 0 { buf[off - 1 * stride + x] = 0; } - else if b1 > 255 { buf[off - 1 * stride + x] = 0xFF; } - else { buf[off - 1 * stride + x] = b1 as u8; } - let c1 = c - delta; - if c1 < 0 { buf[off + x] = 0; } - else if c1 > 255 { buf[off + x] = 0xFF; } - else { buf[off + x] = c1 as u8; } - } - } -} - -fn deblock_ver(buf: &mut NAVideoBuffer<u8>, comp: usize, q: u8, off: usize) { - let stride = buf.get_stride(comp); - let mut dptr = buf.get_data_mut(); - let buf = dptr.as_mut_slice(); - for y in 0..8 { - let a = buf[off - 2 + y * stride] as i16; - let b = buf[off - 1 + y * stride] as i16; - let c = buf[off + 0 + y * stride] as i16; - let d = buf[off + 1 + y * stride] as i16; - let diff = ((a - d) * 3 + (c - b) * 8) >> 4; - if (diff != 0) && (diff >= -32) && (diff < 32) { - let d0 = diff.abs() * 2 - (q as i16); - let d1 = if d0 < 0 { 0 } else { d0 }; - let d2 = diff.abs() - d1; - let d3 = if d2 < 0 { 0 } else { d2 }; - - let delta = if diff < 0 { -d3 } else { d3 }; - - let b1 = b + delta; - if b1 < 0 { buf[off - 1 + y * stride] = 0; } - else if b1 > 255 { buf[off - 1 + y * stride] = 0xFF; } - else { buf[off - 1 + y * stride] = b1 as u8; } - let c1 = c - delta; - if c1 < 0 { buf[off + y * stride] = 0; } - else if c1 > 255 { buf[off + y * stride] = 0xFF; } - else { buf[off + y * stride] = c1 as u8; } - } - } -} - -pub fn h263_filter_row(buf: &mut NAVideoBuffer<u8>, mb_y: usize, mb_w: usize, cbpi: &CBPInfo) { - let stride = buf.get_stride(0); - let mut off = buf.get_offset(0) + mb_y * 16 * stride; - for mb_x in 0..mb_w { - let coff = off; - let coded0 = cbpi.is_coded(mb_x, 0); - let coded1 = cbpi.is_coded(mb_x, 1); - let q = cbpi.get_q(mb_w + mb_x); - if mb_y != 0 { - if coded0 && cbpi.is_coded_top(mb_x, 0) { deblock_hor(buf, 0, q, coff); } - if coded1 && cbpi.is_coded_top(mb_x, 1) { deblock_hor(buf, 0, q, coff + 8); } - } - let coff = off + 8 * stride; - if cbpi.is_coded(mb_x, 2) && coded0 { deblock_hor(buf, 0, q, coff); } - if cbpi.is_coded(mb_x, 3) && coded1 { deblock_hor(buf, 0, q, coff + 8); } - off += 16; - } - let mut leftt = false; - let mut leftc = false; - let mut off = buf.get_offset(0) + mb_y * 16 * stride; - for mb_x in 0..mb_w { - let ctop0 = cbpi.is_coded_top(mb_x, 0); - let ctop1 = cbpi.is_coded_top(mb_x, 0); - let ccur0 = cbpi.is_coded(mb_x, 0); - let ccur1 = cbpi.is_coded(mb_x, 1); - let q = cbpi.get_q(mb_w + mb_x); - if mb_y != 0 { - let coff = off - 8 * stride; - let qtop = cbpi.get_q(mb_x); - if leftt && ctop0 { deblock_ver(buf, 0, qtop, coff); } - if ctop0 && ctop1 { deblock_ver(buf, 0, qtop, coff + 8); } - } - if leftc && ccur0 { deblock_ver(buf, 0, q, off); } - if ccur0 && ccur1 { deblock_ver(buf, 0, q, off + 8); } - leftt = ctop1; - leftc = ccur1; - off += 16; - } - let strideu = buf.get_stride(1); - let stridev = buf.get_stride(2); - let offu = buf.get_offset(1) + mb_y * 8 * strideu; - let offv = buf.get_offset(2) + mb_y * 8 * stridev; - if mb_y != 0 { - for mb_x in 0..mb_w { - let ctu = cbpi.is_coded_top(mb_x, 4); - let ccu = cbpi.is_coded(mb_x, 4); - let ctv = cbpi.is_coded_top(mb_x, 5); - let ccv = cbpi.is_coded(mb_x, 5); - let q = cbpi.get_q(mb_w + mb_x); - if ctu && ccu { deblock_hor(buf, 1, q, offu + mb_x * 8); } - if ctv && ccv { deblock_hor(buf, 2, q, offv + mb_x * 8); } - } - let mut leftu = false; - let mut leftv = false; - let offu = buf.get_offset(1) + (mb_y - 1) * 8 * strideu; - let offv = buf.get_offset(2) + (mb_y - 1) * 8 * stridev; - for mb_x in 0..mb_w { - let ctu = cbpi.is_coded_top(mb_x, 4); - let ctv = cbpi.is_coded_top(mb_x, 5); - let qt = cbpi.get_q(mb_x); - if leftu && ctu { deblock_ver(buf, 1, qt, offu + mb_x * 8); } - if leftv && ctv { deblock_ver(buf, 2, qt, offv + mb_x * 8); } - leftu = ctu; - leftv = ctv; - } - } -} - -impl BlockDSP for H263BlockDSP { - fn idct(&self, blk: &mut [i16; 64]) { - h263_idct(blk) - } - fn copy_blocks(&self, dst: &mut NAVideoBuffer<u8>, src: &NAVideoBuffer<u8>, xpos: usize, ypos: usize, w: usize, h: usize, mv: MV) { - let srcx = ((mv.x >> 1) as isize) + (xpos as isize); - let srcy = ((mv.y >> 1) as isize) + (ypos as isize); - let mode = ((mv.x & 1) + (mv.y & 1) * 2) as usize; - - blockdsp::copy_blocks(dst, src, xpos, ypos, srcx, srcy, w, h, 0, 1, mode, H263_INTERP_FUNCS); - } - fn avg_blocks(&self, dst: &mut NAVideoBuffer<u8>, src: &NAVideoBuffer<u8>, xpos: usize, ypos: usize, w: usize, h: usize, mv: MV) { - let srcx = ((mv.x >> 1) as isize) + (xpos as isize); - let srcy = ((mv.y >> 1) as isize) + (ypos as isize); - let mode = ((mv.x & 1) + (mv.y & 1) * 2) as usize; - - blockdsp::copy_blocks(dst, src, xpos, ypos, srcx, srcy, w, h, 0, 1, mode, H263_INTERP_AVG_FUNCS); - } - fn filter_row(&self, buf: &mut NAVideoBuffer<u8>, mb_y: usize, mb_w: usize, cbpi: &CBPInfo) { - h263_filter_row(buf, mb_y, mb_w, cbpi) - } -} diff --git a/src/codecs/h263/data.rs b/src/codecs/h263/data.rs deleted file mode 100644 index 029c5bb..0000000 --- a/src/codecs/h263/data.rs +++ /dev/null @@ -1,214 +0,0 @@ -use crate::io::codebook::CodebookDescReader; - -#[allow(dead_code)] -pub const H263_SCALES: &[u8] = &[ - 0, 1, 2, 3, 4, 5, 6, 6, 7, 8, 9, 9, 10, 10, 11, 11, 12, 12, 12, 13, 13, 13, 14, 14, 14, 14, 14, 15, 15, 15, 15, 15 ]; - -#[allow(dead_code)] -pub const H263_DC_SCALES: &[u8] = &[ - 0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 42, 44, 46, 48, 50, 52, 54, 56, 58, 60, 62 ]; - -pub const H263_ZIGZAG: &[usize] = &[ - 0, 1, 8, 16, 9, 2, 3, 10, - 17, 24, 32, 25, 18, 11, 4, 5, - 12, 19, 26, 33, 40, 48, 41, 34, - 27, 20, 13, 6, 7, 14, 21, 28, - 35, 42, 49, 56, 57, 50, 43, 36, - 29, 22, 15, 23, 30, 37, 44, 51, - 58, 59, 52, 45, 38, 31, 39, 46, - 53, 60, 61, 54, 47, 55, 62, 63 -]; - -pub const H263_SCAN_H: &[usize] = &[ - 0, 1, 2, 3, 8, 9, 16, 17, - 10, 11, 4, 5, 6, 7, 15, 14, - 13, 12, 19, 18, 24, 25, 32, 33, - 26, 27, 20, 21, 22, 23, 28, 29, - 30, 31, 34, 35, 40, 41, 48, 49, - 42, 43, 36, 37, 38, 39, 44, 45, - 46, 47, 50, 51, 56, 57, 58, 59, - 52, 53, 54, 55, 60, 61, 62, 63 -]; - -pub const H263_SCAN_V: &[usize] = &[ - 0, 8, 16, 24, 1, 9, 2, 10, - 17, 25, 32, 40, 48, 56, 57, 49, - 41, 33, 26, 18, 3, 11, 4, 12, - 19, 27, 34, 42, 50, 58, 35, 43, - 51, 59, 20, 28, 5, 13, 6, 14, - 21, 29, 36, 44, 52, 60, 37, 45, - 53, 61, 22, 30, 7, 15, 23, 31, - 38, 46, 54, 62, 39, 47, 55, 63 -]; - -pub const H263_SIZES: &[(usize, usize)] = &[ - (0, 0), (128, 96), (176, 144), (352, 288), (704, 576), (1408, 1152) -]; - -pub const H263_INTRA_MCBPC: &[(u8, u8)] = &[ - (1, 1), (1, 3), (2, 3), (3, 3), (1, 4), (1, 6), (2, 6), (3, 6), (1, 9) -]; - -pub const H263_INTER_MCBPC: &[(u8, u8)] = &[ - (1, 1), (3, 4), (2, 4), (5, 6), (3, 5), (4, 8), (3, 8), (3, 7), - (3, 3), (7, 7), (6, 7), (5, 9), (4, 6), (4, 9), (3, 9), (2, 9), - (2, 3), (5, 7), (4, 7), (5, 8), (1, 9), (0, 0), (0, 0), (0, 0), - (2, 11), (12, 13), (14, 13), (15, 13) -]; - -pub const H263_CBPY: &[(u8, u8)] = &[ - ( 3, 4), ( 5, 5), ( 4, 5), ( 9, 4), ( 3, 5), ( 7, 4), ( 2, 6), (11, 4), - ( 2, 5), ( 3, 6), ( 5, 4), (10, 4), ( 4, 4), ( 8, 4), ( 6, 4), ( 3, 2) -]; - -pub const H263_MV: &[(u8, u8)] = &[ - ( 1, 1), ( 1, 2), ( 1, 3), ( 1, 4), ( 3, 6), ( 5, 7), ( 4, 7), ( 3, 7), - (11, 9), (10, 9), ( 9, 9), (17, 10), (16, 10), (15, 10), (14, 10), (13, 10), - (12, 10), (11, 10), (10, 10), ( 9, 10), ( 8, 10), ( 7, 10), ( 6, 10), ( 5, 10), - ( 4, 10), ( 7, 11), ( 6, 11), ( 5, 11), ( 4, 11), ( 3, 11), ( 2, 11), ( 3, 12), - ( 2, 12) -]; - -pub const H263_MBTYPE_B: &[(u8, u8)] = &[ - (1, 1), (3, 3), (1, 5), (4, 4), (5, 4), (6, 6), (2, 4), (3, 4), - (7, 6), (4, 6), (5, 6), (1, 6), (1, 7), (1, 8), (1, 10) -]; - -// 0x1 - direct, 0x2 - has quant, 0x4 - has CBP, 0x8 - has dquant, 0x10 - has fwd, 0x20 - has bwd, 0x40 - intra - -pub const H263_MBB_CAP_CODED: u8 = 0x2; -pub const H263_MBB_CAP_DQUANT: u8 = 0x4; -pub const H263_MBB_CAP_FORWARD: u8 = 0x10; -pub const H263_MBB_CAP_BACKWARD: u8 = 0x20; -pub const H263_MBB_CAP_INTRA: u8 = 0x80; - -pub const H263_MBTYPE_B_CAPS: &[u8] = &[ - 0x00, 0x02, 0x06, // skipped, direct, direct+dq - 0x10, 0x12, 0x16, // forward, coded forward, forward+dq - 0x20, 0x22, 0x26, // backward, coded backward, backward+dq - 0x30, 0x32, 0x36, // bidir, coded bidir, bidir+dq - 0x82, 0x86 // intra, intra+dq -]; - -pub const H263_CBPC_B: &[(u8, u8)] = &[ - (0, 1), (2, 2), (7, 3), (6, 3) -]; - -pub const H263_DQUANT_TAB: &[i8] = &[-1, -2, 1, 2]; - -pub const H263_MODIFIED_QUANT: [[u8; 32]; 2] = [ - [ - 0, 3, 1, 2, 3, 4, 5, 6, 7, 8, 9, 9, 10, 11, 12, 13, - 14, 15, 16, 17, 18, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28 - ], [ - 0, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 14, 15, 16, 17, - 18, 19, 20, 21, 22, 24, 25, 26, 27, 28, 29, 30, 31, 31, 31, 26 - ] -]; - -pub const H263_CHROMA_QUANT: [u8; 32] = [ - 0, 1, 2, 3, 4, 5, 6, 6, 7, 8, 9, 9, 10, 10, 11, 11, - 12, 12, 12, 13, 13, 13, 14, 14, 14, 14, 14, 15, 15, 15, 15, 15 -]; - -pub struct H263ShortCodeReader { tab: &'static [(u8, u8)] } - -impl H263ShortCodeReader { - pub fn new(tab: &'static [(u8, u8)]) -> Self { H263ShortCodeReader { tab: tab } } -} - -impl CodebookDescReader<u8> for H263ShortCodeReader { - fn bits(&mut self, idx: usize) -> u8 { let (_, bits) = self.tab[idx]; bits } - fn code(&mut self, idx: usize) -> u32 { let (code, _) = self.tab[idx]; code as u32 } - fn sym (&mut self, idx: usize) -> u8 { idx as u8 } - fn len(&mut self) -> usize { self.tab.len() } -} - -#[derive(Clone,Copy)] -pub struct H263RLSym { run: u8, level: i8 } -impl H263RLSym { - pub fn get_run(&self) -> u8 { self.run } - pub fn is_last(&self) -> bool { self.level < 0 } - pub fn is_escape(&self) -> bool { (self.run == 0) && (self.level == 0) } - pub fn get_level(&self) -> i16 { if self.level < 0 { -self.level as i16 } else { self.level as i16 } } -} - -pub struct H263RLCodeDesc { code: u8, bits: u8, sym: H263RLSym } - -macro_rules! rlcodes{ - ($(($c:expr, $b:expr, $r:expr, $l:expr)),*) => { - &[$(H263RLCodeDesc{ code: $c, bits: $b, sym: H263RLSym{ run: $r, level: $l }}),*] - } -} - -pub const H263_RL_CODES: &[H263RLCodeDesc] = rlcodes!( - (0x02, 2, 0, 1), (0x0F, 4, 0, 2), (0x15, 6, 0, 3), (0x17, 7, 0, 4), - (0x1F, 8, 0, 5), (0x25, 9, 0, 6), (0x24, 9, 0, 7), (0x21, 10, 0, 8), - (0x20, 10, 0, 9), (0x07, 11, 0, 10), (0x06, 11, 0, 11), (0x20, 11, 0, 12), - (0x06, 3, 1, 1), (0x14, 6, 1, 2), (0x1E, 8, 1, 3), (0x0F, 10, 1, 4), - (0x21, 11, 1, 5), (0x50, 12, 1, 6), (0x0E, 4, 2, 1), (0x1D, 8, 2, 2), - (0x0E, 10, 2, 3), (0x51, 12, 2, 4), (0x0D, 5, 3, 1), (0x23, 9, 3, 2), - (0x0D, 10, 3, 3), (0x0C, 5, 4, 1), (0x22, 9, 4, 2), (0x52, 12, 4, 3), - (0x0B, 5, 5, 1), (0x0C, 10, 5, 2), (0x53, 12, 5, 3), (0x13, 6, 6, 1), - (0x0B, 10, 6, 2), (0x54, 12, 6, 3), (0x12, 6, 7, 1), (0x0A, 10, 7, 2), - (0x11, 6, 8, 1), (0x09, 10, 8, 2), (0x10, 6, 9, 1), (0x08, 10, 9, 2), - (0x16, 7, 10, 1), (0x55, 12, 10, 2), (0x15, 7, 11, 1), (0x14, 7, 12, 1), - (0x1C, 8, 13, 1), (0x1B, 8, 14, 1), (0x21, 9, 15, 1), (0x20, 9, 16, 1), - (0x1F, 9, 17, 1), (0x1E, 9, 18, 1), (0x1D, 9, 19, 1), (0x1C, 9, 20, 1), - (0x1B, 9, 21, 1), (0x1A, 9, 22, 1), (0x22, 11, 23, 1), (0x23, 11, 24, 1), - (0x56, 12, 25, 1), (0x57, 12, 26, 1), (0x07, 4, 0, -1), (0x19, 9, 0, -2), - (0x05, 11, 0, -3), (0x0F, 6, 1, -1), (0x04, 11, 1, -2), (0x0E, 6, 2, -1), - (0x0D, 6, 3, -1), (0x0C, 6, 4, -1), (0x13, 7, 5, -1), (0x12, 7, 6, -1), - (0x11, 7, 7, -1), (0x10, 7, 8, -1), (0x1A, 8, 9, -1), (0x19, 8, 10, -1), - (0x18, 8, 11, -1), (0x17, 8, 12, -1), (0x16, 8, 13, -1), (0x15, 8, 14, -1), - (0x14, 8, 15, -1), (0x13, 8, 16, -1), (0x18, 9, 17, -1), (0x17, 9, 18, -1), - (0x16, 9, 19, -1), (0x15, 9, 20, -1), (0x14, 9, 21, -1), (0x13, 9, 22, -1), - (0x12, 9, 23, -1), (0x11, 9, 24, -1), (0x07, 10, 25, -1), (0x06, 10, 26, -1), - (0x05, 10, 27, -1), (0x04, 10, 28, -1), (0x24, 11, 29, -1), (0x25, 11, 30, -1), - (0x26, 11, 31, -1), (0x27, 11, 32, -1), (0x58, 12, 33, -1), (0x59, 12, 34, -1), - (0x5A, 12, 35, -1), (0x5B, 12, 36, -1), (0x5C, 12, 37, -1), (0x5D, 12, 38, -1), - (0x5E, 12, 39, -1), (0x5F, 12, 40, -1), (0x03, 7, 0, 0) -); - -pub const H263_RL_CODES_AIC: &[H263RLCodeDesc] = rlcodes!( - (0x02, 2, 0, 1), (0x06, 3, 0, 2), (0x0E, 4, 0, 3), (0x0C, 5, 0, 4), - (0x0D, 5, 0, 5), (0x10, 6, 0, 6), (0x11, 6, 0, 7), (0x12, 6, 0, 8), - (0x16, 7, 0, 9), (0x1B, 8, 0, 10), (0x20, 9, 0, 11), (0x21, 9, 0, 12), - (0x1A, 9, 0, 13), (0x1B, 9, 0, 14), (0x1C, 9, 0, 15), (0x1D, 9, 0, 16), - (0x1E, 9, 0, 17), (0x1F, 9, 0, 18), (0x23, 11, 0, 19), (0x22, 11, 0, 20), - (0x57, 12, 0, 21), (0x56, 12, 0, 22), (0x55, 12, 0, 23), (0x54, 12, 0, 24), - (0x53, 12, 0, 25), (0x0F, 4, 1, 1), (0x14, 6, 1, 2), (0x14, 7, 1, 3), - (0x1E, 8, 1, 4), (0x0F, 10, 1, 5), (0x21, 11, 1, 6), (0x50, 12, 1, 7), - (0x0B, 5, 2, 1), (0x15, 7, 2, 2), (0x0E, 10, 2, 3), (0x09, 10, 2, 4), - (0x15, 6, 3, 1), (0x1D, 8, 3, 2), (0x0D, 10, 3, 3), (0x51, 12, 3, 4), - (0x13, 6, 4, 1), (0x23, 9, 4, 2), (0x07, 11, 4, 3), (0x17, 7, 5, 1), - (0x22, 9, 5, 2), (0x52, 12, 5, 3), (0x1C, 8, 6, 1), (0x0C, 10, 6, 2), - (0x1F, 8, 7, 1), (0x0B, 10, 7, 2), (0x25, 9, 8, 1), (0x0A, 10, 8, 2), - (0x24, 9, 9, 1), (0x06, 11, 9, 2), (0x21, 10, 10, 1), (0x20, 10, 11, 1), - (0x08, 10, 12, 1), (0x20, 11, 13, 1), (0x07, 4, 0, -1), (0x0C, 6, 0, -2), - (0x10, 7, 0, -3), (0x13, 8, 0, -4), (0x11, 9, 0, -5), (0x12, 9, 0, -6), - (0x04, 10, 0, -7), (0x27, 11, 0, -8), (0x26, 11, 0, -9), (0x5F, 12, 0,-10), - (0x0F, 6, 1, -1), (0x13, 9, 1, -2), (0x05, 10, 1, -3), (0x25, 11, 1, -4), - (0x0E, 6, 2, -1), (0x14, 9, 2, -2), (0x24, 11, 2, -3), (0x0D, 6, 3, -1), - (0x06, 10, 3, -2), (0x5E, 12, 3, -3), (0x11, 7, 4, -1), (0x07, 10, 4, -2), - (0x13, 7, 5, -1), (0x5D, 12, 5, -2), (0x12, 7, 6, -1), (0x5C, 12, 6, -2), - (0x14, 8, 7, -1), (0x5B, 12, 7, -2), (0x15, 8, 8, -1), (0x1A, 8, 9, -1), - (0x19, 8, 10, -1), (0x18, 8, 11, -1), (0x17, 8, 12, -1), (0x16, 8, 13, -1), - (0x19, 9, 14, -1), (0x15, 9, 15, -1), (0x16, 9, 16, -1), (0x18, 9, 17, -1), - (0x17, 9, 18, -1), (0x04, 11, 19, -1), (0x05, 11, 20, -1), (0x58, 12, 21, -1), - (0x59, 12, 22, -1), (0x5A, 12, 23, -1), (0x03, 7, 0, 0) -); - -pub struct H263RLCodeReader { tab: &'static [H263RLCodeDesc] } - -impl H263RLCodeReader { - pub fn new(tab: &'static [H263RLCodeDesc]) -> Self { H263RLCodeReader { tab: tab } } -} - -impl CodebookDescReader<H263RLSym> for H263RLCodeReader { - fn bits(&mut self, idx: usize) -> u8 { self.tab[idx].bits } - fn code(&mut self, idx: usize) -> u32 { self.tab[idx].code as u32 } - fn sym (&mut self, idx: usize) -> H263RLSym { self.tab[idx].sym } - fn len(&mut self) -> usize { self.tab.len() } -} - diff --git a/src/codecs/h263/decoder.rs b/src/codecs/h263/decoder.rs deleted file mode 100644 index fd828fe..0000000 --- a/src/codecs/h263/decoder.rs +++ /dev/null @@ -1,581 +0,0 @@ -//use std::mem; -use crate::frame::*; -use super::super::*; -use super::super::blockdsp; -use super::*; -//use super::code::*; -use crate::formats; - -#[allow(dead_code)] -struct MVInfo { - mv: Vec<MV>, - mb_w: usize, - mb_stride: usize, - mb_start: usize, - top: bool, - mvmode: MVMode, -} - -impl MVInfo { - fn new() -> Self { MVInfo{ mv: Vec::new(), mb_w: 0, mb_stride: 0, mb_start: 0, top: true, mvmode: MVMode::Old } } - fn reset(&mut self, mb_w: usize, mb_start: usize, mvmode: MVMode) { - self.mb_start = mb_start; - self.mb_w = mb_w; - self.mb_stride = mb_w * 2; - self.mv.resize(self.mb_stride * 3, ZERO_MV); - self.mvmode = mvmode; - } - fn update_row(&mut self) { - self.mb_start = self.mb_w + 1; - self.top = false; - for i in 0..self.mb_stride { - self.mv[i] = self.mv[self.mb_stride * 2 + i]; - } - } - #[allow(non_snake_case)] - fn predict(&mut self, mb_x: usize, blk_no: usize, use4: bool, diff: MV, first_line: bool, first_mb: bool) -> MV { - let A; - let B; - let C; - let last = mb_x == self.mb_w - 1; - match blk_no { - 0 => { - if mb_x != self.mb_start { - A = if !first_mb { self.mv[self.mb_stride + mb_x * 2 - 1] } else { ZERO_MV }; - B = if !first_line { self.mv[ mb_x * 2] } else { A }; - C = if !first_line && !last { self.mv[mb_x * 2 + 2] } else { ZERO_MV }; - } else { - A = ZERO_MV; B = ZERO_MV; C = ZERO_MV; - } - }, - 1 => { - A = self.mv[self.mb_stride + mb_x * 2]; - B = if !first_line { self.mv[mb_x * 2 + 1] } else { A }; - C = if !first_line && !last { self.mv[mb_x * 2 + 2] } else { ZERO_MV/*A*/ }; - }, - 2 => { - A = if mb_x != self.mb_start { self.mv[self.mb_stride * 2 + mb_x * 2 - 1] } else { ZERO_MV }; - B = self.mv[self.mb_stride + mb_x * 2]; - C = self.mv[self.mb_stride + mb_x * 2 + 1]; - }, - 3 => { - A = self.mv[self.mb_stride * 2 + mb_x * 2]; - B = self.mv[self.mb_stride * 1 + mb_x * 2 + 1]; - C = self.mv[self.mb_stride * 1 + mb_x * 2]; - }, - _ => { return ZERO_MV; } - } - let pred_mv = MV::pred(A, B, C); - let new_mv = MV::add_umv(pred_mv, diff, self.mvmode); - if !use4 { - self.mv[self.mb_stride * 1 + mb_x * 2 + 0] = new_mv; - self.mv[self.mb_stride * 1 + mb_x * 2 + 1] = new_mv; - self.mv[self.mb_stride * 2 + mb_x * 2 + 0] = new_mv; - self.mv[self.mb_stride * 2 + mb_x * 2 + 1] = new_mv; - } else { - match blk_no { - 0 => { self.mv[self.mb_stride * 1 + mb_x * 2 + 0] = new_mv; }, - 1 => { self.mv[self.mb_stride * 1 + mb_x * 2 + 1] = new_mv; }, - 2 => { self.mv[self.mb_stride * 2 + mb_x * 2 + 0] = new_mv; }, - 3 => { self.mv[self.mb_stride * 2 + mb_x * 2 + 1] = new_mv; }, - _ => {}, - }; - } - - new_mv - } - fn set_zero_mv(&mut self, mb_x: usize) { - self.mv[self.mb_stride * 1 + mb_x * 2 + 0] = ZERO_MV; - self.mv[self.mb_stride * 1 + mb_x * 2 + 1] = ZERO_MV; - self.mv[self.mb_stride * 2 + mb_x * 2 + 0] = ZERO_MV; - self.mv[self.mb_stride * 2 + mb_x * 2 + 1] = ZERO_MV; - } - fn get_mv(&self, mb_x: usize, blk_no: usize) -> MV { - self.mv[self.mb_stride + mb_x * 2 + (blk_no & 1) + (blk_no >> 1) * self.mb_stride] - } -} - -#[allow(dead_code)] -#[derive(Clone,Copy)] -struct BMB { - num_mv: usize, - mv_f: [MV; 4], - mv_b: [MV; 4], - fwd: bool, - blk: [[i16; 64]; 6], - cbp: u8, -} - -impl BMB { - fn new() -> Self { BMB {blk: [[0; 64]; 6], cbp: 0, fwd: false, mv_f: [ZERO_MV; 4], mv_b: [ZERO_MV; 4], num_mv: 0} } -} - -#[derive(Clone,Copy)] -struct PredCoeffs { - hor: [[i16; 8]; 6], - ver: [[i16; 8]; 6], -} - -const ZERO_PRED_COEFFS: PredCoeffs = PredCoeffs { hor: [[0; 8]; 6], ver: [[0; 8]; 6] }; - -pub struct H263BaseDecoder { - w: usize, - h: usize, - mb_w: usize, - mb_h: usize, - num_mb: usize, - ftype: Type, - ipbs: IPBShuffler, - next_ts: u16, - last_ts: u16, - tsdiff: u16, - has_b: bool, - b_data: Vec<BMB>, - pred_coeffs: Vec<PredCoeffs>, - is_gob: bool, - slice_reset: bool, - may_have_b_frames: bool, - mv_data: Vec<BlockMVInfo>, -} - -#[inline] -fn clip_dc(dc: i16) -> i16 { - if dc < 0 { 0 } - else if dc > 2046 { 2046 } - else { (dc + 1) & !1 } -} - -#[inline] -fn clip_ac(ac: i16) -> i16 { - if ac < -2048 { -2048 } - else if ac > 2047 { 2047 } - else { ac } -} - -#[allow(dead_code)] -impl H263BaseDecoder { - pub fn new_with_opts(is_gob: bool, slice_reset: bool, may_have_b_frames: bool) -> Self { - H263BaseDecoder{ - w: 0, h: 0, mb_w: 0, mb_h: 0, num_mb: 0, - ftype: Type::Special, - ipbs: IPBShuffler::new(), - last_ts: 0, next_ts: 0, tsdiff: 0, - has_b: false, b_data: Vec::new(), - pred_coeffs: Vec::new(), - is_gob: is_gob, slice_reset: slice_reset, - may_have_b_frames: may_have_b_frames, - mv_data: Vec::new(), - } - } - pub fn new(is_gob: bool) -> Self { - Self::new_with_opts(is_gob, true, false) - } - pub fn new_b_frames(is_gob: bool) -> Self { - Self::new_with_opts(is_gob, true, true) - } - - pub fn is_intra(&self) -> bool { self.ftype == Type::I } - pub fn get_frame_type(&self) -> FrameType { - match self.ftype { - Type::I => FrameType::I, - Type::P => FrameType::P, - Type::B => FrameType::B, - Type::PB => FrameType::P, - Type::Skip => FrameType::Skip, - Type::Special => FrameType::Skip, - } - } - pub fn get_dimensions(&self) -> (usize, usize) { (self.w, self.h) } - - pub fn parse_frame(&mut self, bd: &mut BlockDecoder, bdsp: &BlockDSP) -> DecoderResult<NABufferType> { - let pinfo = bd.decode_pichdr()?; - let mut mvi = MVInfo::new(); - let mut mvi2 = MVInfo::new(); - let mut cbpi = CBPInfo::new(); - -//todo handle res change - self.w = pinfo.w; - self.h = pinfo.h; - self.mb_w = (pinfo.w + 15) >> 4; - self.mb_h = (pinfo.h + 15) >> 4; - self.num_mb = self.mb_w * self.mb_h; - self.ftype = pinfo.mode; - self.has_b = pinfo.is_pb(); - - if self.has_b { - self.mv_data.truncate(0); - } - - let save_b_data = pinfo.mode.is_ref() && self.may_have_b_frames; - if save_b_data { - self.mv_data.truncate(0); - } - let is_b = pinfo.mode == Type::B; - - let tsdiff = if pinfo.is_pb() { pinfo.ts.wrapping_sub(self.last_ts) >> 1 } - else { self.last_ts.wrapping_sub(self.next_ts) >> 1 }; - let bsdiff = if pinfo.is_pb() { (pinfo.get_pbinfo().get_trb() as u16) << 7 } - else { pinfo.ts.wrapping_sub(self.next_ts) >> 1 }; - - let fmt = formats::YUV420_FORMAT; - let vinfo = NAVideoInfo::new(self.w, self.h, false, fmt); - let bufret = alloc_video_buffer(vinfo, 4); - if let Err(_) = bufret { return Err(DecoderError::InvalidData); } - let mut bufinfo = bufret.unwrap(); - let mut buf = bufinfo.get_vbuf().unwrap(); - - let mut slice = if self.is_gob { - SliceInfo::get_default_slice(&pinfo) - } else { - bd.decode_slice_header(&pinfo)? - }; - mvi.reset(self.mb_w, 0, pinfo.get_mvmode()); - if is_b || pinfo.is_pb() { - mvi2.reset(self.mb_w, 0, pinfo.get_mvmode()); - } - cbpi.reset(self.mb_w); - - let mut blk: [[i16; 64]; 6] = [[0; 64]; 6]; - let mut sstate = SliceState::new(pinfo.mode == Type::I); - let mut mb_pos = 0; - let apply_acpred = (pinfo.mode == Type::I) && pinfo.plusinfo.is_some() && pinfo.plusinfo.unwrap().aic; - if apply_acpred { - self.pred_coeffs.truncate(0); - self.pred_coeffs.resize(self.mb_w * self.mb_h, ZERO_PRED_COEFFS); - } - sstate.quant = slice.quant; - for mb_y in 0..self.mb_h { - for mb_x in 0..self.mb_w { - for i in 0..6 { for j in 0..64 { blk[i][j] = 0; } } - - if slice.is_at_end(mb_pos) || (slice.needs_check() && mb_pos > 0 && bd.is_slice_end()) { - slice = bd.decode_slice_header(&pinfo)?; - if !self.is_gob && self.slice_reset { - mvi.reset(self.mb_w, mb_x, pinfo.get_mvmode()); - if is_b || pinfo.is_pb() { - mvi2.reset(self.mb_w, mb_x, pinfo.get_mvmode()); - } - cbpi.reset(self.mb_w); - sstate.reset_slice(mb_x, mb_y); - sstate.quant = slice.quant; - } - } - - let binfo = bd.decode_block_header(&pinfo, &slice, &sstate)?; - let cbp = binfo.get_cbp(); - cbpi.set_cbp(mb_x, cbp); - cbpi.set_q(mb_x, binfo.get_q()); - sstate.quant = binfo.get_q(); - if binfo.is_intra() { - if save_b_data { - self.mv_data.push(BlockMVInfo::Intra); - } - for i in 0..6 { - bd.decode_block_intra(&binfo, &sstate, binfo.get_q(), i, (cbp & (1 << (5 - i))) != 0, &mut blk[i])?; - if apply_acpred && (binfo.acpred != ACPredMode::None) { - let has_b = (i == 1) || (i == 3) || !sstate.first_mb; - let has_a = (i == 2) || (i == 3) || !sstate.first_line; - let (b_mb, b_blk) = if has_b { - if (i == 1) || (i == 3) { - (mb_pos, i - 1) - } else if i < 4 { - (mb_pos - 1, i + 1) - } else { - (mb_pos - 1, i) - } - } else { (0, 0) }; - let (a_mb, a_blk) = if has_a { - if (i == 2) || (i == 3) { - (mb_pos, i - 2) - } else if i < 4 { - (mb_pos - self.mb_w, i + 2) - } else { - (mb_pos - self.mb_w, i) - } - } else { (0, 0) }; - match binfo.acpred { - ACPredMode::DC => { - let dc; - if has_a && has_b { - dc = (self.pred_coeffs[b_mb].hor[b_blk][0] + self.pred_coeffs[a_mb].ver[a_blk][0]) / 2; - } else if has_a { - dc = self.pred_coeffs[a_mb].ver[a_blk][0]; - } else if has_b { - dc = self.pred_coeffs[b_mb].hor[b_blk][0]; - } else { - dc = 1024; - } - blk[i][0] = clip_dc(blk[i][0] + dc); - }, - ACPredMode::Hor => { - if has_b { - for k in 0..8 { - blk[i][k * 8] += self.pred_coeffs[b_mb].hor[b_blk][k]; - } - for k in 1..8 { - blk[i][k * 8] = clip_ac(blk[i][k * 8]); - } - } else { - blk[i][0] += 1024; - } - blk[i][0] = clip_dc(blk[i][0]); - }, - ACPredMode::Ver => { - if has_a { - for k in 0..8 { - blk[i][k] += self.pred_coeffs[a_mb].ver[a_blk][k]; - } - for k in 1..8 { - blk[i][k] = clip_ac(blk[i][k]); - } - } else { - blk[i][0] += 1024; - } - blk[i][0] = clip_dc(blk[i][0]); - }, - ACPredMode::None => {}, - }; - for t in 0..8 { self.pred_coeffs[mb_pos].hor[i][t] = blk[i][t * 8]; } - for t in 0..8 { self.pred_coeffs[mb_pos].ver[i][t] = blk[i][t]; } - } - bdsp.idct(&mut blk[i]); - } - blockdsp::put_blocks(&mut buf, mb_x, mb_y, &blk); - mvi.set_zero_mv(mb_x); - if is_b { - mvi2.set_zero_mv(mb_x); - } else if pinfo.is_pb() { - mvi2.predict(mb_x, 0, false, binfo.get_mv2(0), sstate.first_line, sstate.first_mb); - } - } else if (binfo.mode != Type::B) && !binfo.is_skipped() { - if binfo.get_num_mvs() == 1 { - let mv = mvi.predict(mb_x, 0, false, binfo.get_mv(0), sstate.first_line, sstate.first_mb); - if save_b_data { - self.mv_data.push(BlockMVInfo::Inter_1MV(mv)); - } - if let Some(ref srcbuf) = self.ipbs.get_lastref() { - bdsp.copy_blocks(&mut buf, srcbuf, mb_x * 16, mb_y * 16, 16, 16, mv); - } - if pinfo.is_pb() { - mvi2.predict(mb_x, 0, false, binfo.get_mv(0), sstate.first_line, sstate.first_mb); - } - } else { - let mut mv: [MV; 4] = [ZERO_MV, ZERO_MV, ZERO_MV, ZERO_MV]; - for blk_no in 0..4 { - mv[blk_no] = mvi.predict(mb_x, blk_no, true, binfo.get_mv(blk_no), sstate.first_line, sstate.first_mb); - if let Some(ref srcbuf) = self.ipbs.get_lastref() { - bdsp.copy_blocks(&mut buf, srcbuf, - mb_x * 16 + (blk_no & 1) * 8, - mb_y * 16 + (blk_no & 2) * 4, 8, 8, mv[blk_no]); - } - } - if pinfo.is_pb() { - for blk_no in 0..4 { - mvi2.predict(mb_x, blk_no, true, binfo.get_mv(blk_no), sstate.first_line, sstate.first_mb); - } - } - if save_b_data { - self.mv_data.push(BlockMVInfo::Inter_4MV(mv)); - } - } - for i in 0..6 { - bd.decode_block_inter(&binfo, &sstate, binfo.get_q(), i, ((cbp >> (5 - i)) & 1) != 0, &mut blk[i])?; - bdsp.idct(&mut blk[i]); - } - blockdsp::add_blocks(&mut buf, mb_x, mb_y, &blk); - if is_b && !pinfo.is_pb() { - mvi2.set_zero_mv(mb_x); - } - } else if binfo.mode != Type::B { - self.mv_data.push(BlockMVInfo::Inter_1MV(ZERO_MV)); - mvi.set_zero_mv(mb_x); - if is_b || pinfo.is_pb() { - mvi2.set_zero_mv(mb_x); - } - if let Some(ref srcbuf) = self.ipbs.get_lastref() { - bdsp.copy_blocks(&mut buf, srcbuf, mb_x * 16, mb_y * 16, 16, 16, ZERO_MV); - } - } else { - let ref_mv_info = self.mv_data[mb_pos]; - let has_fwd = binfo.get_num_mvs() > 0; - let has_bwd = binfo.get_num_mvs2() > 0; -//todo refactor - if has_fwd || has_bwd { - let fwd_mv; - if has_fwd { - fwd_mv = mvi.predict(mb_x, 0, false, binfo.get_mv(0), sstate.first_line, sstate.first_mb); - } else { - fwd_mv = ZERO_MV; - mvi.set_zero_mv(mb_x); - } - let bwd_mv; - if has_bwd { - bwd_mv = mvi2.predict(mb_x, 0, false, binfo.get_mv2(0), sstate.first_line, sstate.first_mb); - } else { - bwd_mv = ZERO_MV; - mvi2.set_zero_mv(mb_x); - } - if let (Some(ref fwd_buf), Some(ref bck_buf)) = (self.ipbs.get_nextref(), self.ipbs.get_lastref()) { - if has_fwd && has_bwd { - bdsp.copy_blocks(&mut buf, fwd_buf, mb_x * 16, mb_y * 16, 16, 16, fwd_mv); - bdsp.avg_blocks (&mut buf, bck_buf, mb_x * 16, mb_y * 16, 16, 16, bwd_mv); - } else if has_fwd { - bdsp.copy_blocks(&mut buf, fwd_buf, mb_x * 16, mb_y * 16, 16, 16, fwd_mv); - } else { - bdsp.copy_blocks(&mut buf, bck_buf, mb_x * 16, mb_y * 16, 16, 16, bwd_mv); - } - } - } else { - if let BlockMVInfo::Inter_4MV(mvs) = ref_mv_info { - for blk_no in 0..4 { - let ref_mv = mvs[blk_no]; - let ref_mv_fwd = ref_mv.scale(bsdiff, tsdiff); - let ref_mv_bwd = ref_mv - ref_mv_fwd; - let xoff = mb_x * 16 + (blk_no & 1) * 8; - let yoff = mb_y * 16 + (blk_no & 2) * 4; - if let (Some(ref fwd_buf), Some(ref bck_buf)) = (self.ipbs.get_nextref(), self.ipbs.get_lastref()) { - bdsp.copy_blocks(&mut buf, fwd_buf, xoff, yoff, 8, 8, ref_mv_fwd); - bdsp.avg_blocks (&mut buf, bck_buf, xoff, yoff, 8, 8, ref_mv_bwd); - } - } - } else { - let ref_mv = if let BlockMVInfo::Inter_1MV(mv_) = ref_mv_info { mv_ } else { ZERO_MV }; - let ref_mv_fwd = ref_mv.scale(bsdiff, tsdiff); - let ref_mv_bwd = MV::b_sub(ref_mv, ref_mv_fwd, ZERO_MV, bsdiff, tsdiff); - - if let (Some(ref fwd_buf), Some(ref bck_buf)) = (self.ipbs.get_nextref(), self.ipbs.get_lastref()) { - bdsp.copy_blocks(&mut buf, fwd_buf, mb_x * 16, mb_y * 16, 16, 16, ref_mv_fwd); - bdsp.avg_blocks (&mut buf, bck_buf, mb_x * 16, mb_y * 16, 16, 16, ref_mv_bwd); - } - } - mvi.set_zero_mv(mb_x); - mvi2.set_zero_mv(mb_x); - } - if cbp != 0 { - for i in 0..6 { - bd.decode_block_inter(&binfo, &sstate, binfo.get_q(), i, ((cbp >> (5 - i)) & 1) != 0, &mut blk[i])?; - bdsp.idct(&mut blk[i]); - } - blockdsp::add_blocks(&mut buf, mb_x, mb_y, &blk); - } - } - if pinfo.is_pb() { - let mut b_mb = BMB::new(); - let cbp = binfo.get_cbp_b(); - let bq = (((pinfo.get_pbinfo().get_dbquant() + 5) as u16) * (binfo.get_q() as u16)) >> 2; - let bquant; - if bq < 1 { bquant = 1; } - else if bq > 31 { bquant = 31; } - else { bquant = bq as u8; } - - b_mb.cbp = cbp; - for i in 0..6 { - bd.decode_block_inter(&binfo, &sstate, bquant, i, (cbp & (1 << (5 - i))) != 0, &mut b_mb.blk[i])?; - bdsp.idct(&mut b_mb.blk[i]); - } - - let is_fwd = binfo.is_b_fwd(); - b_mb.fwd = is_fwd; - if binfo.get_num_mvs() != 4 { - let ref_mv = mvi2.get_mv(mb_x, 0); - let b_mv = if binfo.is_intra() { binfo.get_mv2(1) } else { binfo.get_mv2(0) }; - let src_mv = if is_fwd { ZERO_MV } else { ref_mv.scale(bsdiff, tsdiff) }; - let mv_f = MV::add_umv(src_mv, b_mv, pinfo.get_mvmode()); - let mv_b = MV::b_sub(ref_mv, mv_f, b_mv, bsdiff, tsdiff); - b_mb.mv_f[0] = mv_f; - b_mb.mv_b[0] = mv_b; - b_mb.num_mv = 1; - } else { - for blk_no in 0..4 { - let src_mv = if is_fwd { ZERO_MV } else { mvi2.get_mv(mb_x, blk_no).scale(bsdiff, tsdiff) }; - let mv_f = MV::add_umv(src_mv, binfo.get_mv2(0), pinfo.get_mvmode()); - let mv_b = MV::b_sub(mvi2.get_mv(mb_x, blk_no), mv_f, binfo.get_mv2(0), bsdiff, tsdiff); - b_mb.mv_f[blk_no] = mv_f; - b_mb.mv_b[blk_no] = mv_b; - } - b_mb.num_mv = 4; - } - self.b_data.push(b_mb); - } - sstate.next_mb(); - mb_pos += 1; - } - if let Some(plusinfo) = pinfo.plusinfo { - if plusinfo.deblock { - bdsp.filter_row(&mut buf, mb_y, self.mb_w, &cbpi); - } - } - mvi.update_row(); - if is_b || pinfo.is_pb() { - mvi2.update_row(); - } - cbpi.update_row(); - sstate.new_row(); - } - - if pinfo.mode.is_ref() { - self.ipbs.add_frame(buf); - self.next_ts = self.last_ts; - self.last_ts = pinfo.ts; - self.tsdiff = tsdiff; - } - - Ok(bufinfo) - } - - pub fn get_bframe(&mut self, bdsp: &BlockDSP) -> DecoderResult<NABufferType> { - if !self.has_b || !self.ipbs.get_lastref().is_some() || !self.ipbs.get_nextref().is_some() { - return Err(DecoderError::MissingReference); - } - self.has_b = false; - - let fmt = formats::YUV420_FORMAT; - let vinfo = NAVideoInfo::new(self.w, self.h, false, fmt); - let bufret = alloc_video_buffer(vinfo, 4); - if let Err(_) = bufret { return Err(DecoderError::InvalidData); } - let mut bufinfo = bufret.unwrap(); - let mut b_buf = bufinfo.get_vbuf().unwrap(); - - if let (Some(ref bck_buf), Some(ref fwd_buf)) = (self.ipbs.get_nextref(), self.ipbs.get_lastref()) { - recon_b_frame(&mut b_buf, fwd_buf, bck_buf, self.mb_w, self.mb_h, &self.b_data, bdsp); - } - - self.b_data.truncate(0); - Ok(bufinfo) - } -} - -fn recon_b_frame(b_buf: &mut NAVideoBuffer<u8>, bck_buf: &NAVideoBuffer<u8>, fwd_buf: &NAVideoBuffer<u8>, - mb_w: usize, mb_h: usize, b_data: &Vec<BMB>, bdsp: &BlockDSP) { - let mut cbpi = CBPInfo::new(); - let mut cur_mb = 0; - cbpi.reset(mb_w); - for mb_y in 0..mb_h { - for mb_x in 0..mb_w { - let num_mv = b_data[cur_mb].num_mv; - let is_fwd = b_data[cur_mb].fwd; - let cbp = b_data[cur_mb].cbp; - cbpi.set_cbp(mb_x, cbp); - if num_mv == 1 { - bdsp.copy_blocks(b_buf, fwd_buf, mb_x * 16, mb_y * 16, 16, 16, b_data[cur_mb].mv_b[0]); - if !is_fwd { - bdsp.avg_blocks(b_buf, bck_buf, mb_x * 16, mb_y * 16, 16, 16, b_data[cur_mb].mv_f[0]); - } - } else { - for blk_no in 0..4 { - let xpos = mb_x * 16 + (blk_no & 1) * 8; - let ypos = mb_y * 16 + (blk_no & 2) * 4; - bdsp.copy_blocks(b_buf, fwd_buf, xpos, ypos, 8, 8, b_data[cur_mb].mv_b[blk_no]); - if !is_fwd { - bdsp.avg_blocks(b_buf, bck_buf, xpos, ypos, 8, 8, b_data[cur_mb].mv_f[blk_no]); - } - } - } - if cbp != 0 { - blockdsp::add_blocks(b_buf, mb_x, mb_y, &b_data[cur_mb].blk); - } - cur_mb += 1; - } - cbpi.update_row(); - } -} diff --git a/src/codecs/h263/intel263.rs b/src/codecs/h263/intel263.rs deleted file mode 100644 index 9e36a49..0000000 --- a/src/codecs/h263/intel263.rs +++ /dev/null @@ -1,420 +0,0 @@ -use crate::io::bitreader::*; -use crate::io::codebook::*; -use crate::formats; -use super::super::*; -use super::*; -use super::decoder::*; -use super::data::*; -use super::code::H263BlockDSP; - -#[allow(dead_code)] -struct Tables { - intra_mcbpc_cb: Codebook<u8>, - inter_mcbpc_cb: Codebook<u8>, - cbpy_cb: Codebook<u8>, - rl_cb: Codebook<H263RLSym>, - aic_rl_cb: Codebook<H263RLSym>, - mv_cb: Codebook<u8>, -} - -struct Intel263Decoder { - info: Rc<NACodecInfo>, - dec: H263BaseDecoder, - tables: Tables, - bdsp: H263BlockDSP, -} - -struct Intel263BR<'a> { - br: BitReader<'a>, - tables: &'a Tables, - gob_no: usize, - mb_w: usize, - is_pb: bool, - is_ipb: bool, -} - -fn check_marker<'a>(br: &mut BitReader<'a>) -> DecoderResult<()> { - let mark = br.read(1)?; - validate!(mark == 1); - Ok(()) -} - -impl<'a> Intel263BR<'a> { - fn new(src: &'a [u8], tables: &'a Tables) -> Self { - Intel263BR { - br: BitReader::new(src, src.len(), BitReaderMode::BE), - tables: tables, - gob_no: 0, - mb_w: 0, - is_pb: false, - is_ipb: false, - } - } - - fn decode_block(&mut self, quant: u8, intra: bool, coded: bool, blk: &mut [i16; 64]) -> DecoderResult<()> { - let br = &mut self.br; - let mut idx = 0; - if intra { - let mut dc = br.read(8)?; - if dc == 255 { dc = 128; } - blk[0] = (dc as i16) << 3; - idx = 1; - } - if !coded { return Ok(()); } - - let rl_cb = &self.tables.rl_cb; // could be aic too - let q_add = if quant == 0 { 0i16 } else { ((quant - 1) | 1) as i16 }; - let q = (quant * 2) as i16; - while idx < 64 { - let code = br.read_cb(rl_cb)?; - let run; - let mut level; - let last; - if !code.is_escape() { - run = code.get_run(); - level = code.get_level(); - last = code.is_last(); - if br.read_bool()? { level = -level; } - level = (level * q) + q_add; - } else { - last = br.read_bool()?; - run = br.read(6)? as u8; - level = br.read_s(8)? as i16; - if level == -128 { - let low = br.read(5)? as i16; - let top = br.read_s(6)? as i16; - level = (top << 5) | low; - } - level = (level * q) + q_add; - if level < -2048 { level = -2048; } - if level > 2047 { level = 2047; } - } - idx += run; - validate!(idx < 64); - let oidx = H263_ZIGZAG[idx as usize]; - blk[oidx] = level; - idx += 1; - if last { break; } - } - Ok(()) - } -} - -fn decode_mv_component(br: &mut BitReader, mv_cb: &Codebook<u8>) -> DecoderResult<i16> { - let code = br.read_cb(mv_cb)? as i16; - if code == 0 { return Ok(0) } - if !br.read_bool()? { - Ok(code) - } else { - Ok(-code) - } -} - -fn decode_mv(br: &mut BitReader, mv_cb: &Codebook<u8>) -> DecoderResult<MV> { - let xval = decode_mv_component(br, mv_cb)?; - let yval = decode_mv_component(br, mv_cb)?; - Ok(MV::new(xval, yval)) -} - -fn decode_b_info(br: &mut BitReader, is_pb: bool, is_ipb: bool, is_intra: bool) -> DecoderResult<BBlockInfo> { - if is_pb { // as improved pb - if is_ipb { - let pb_mv_add = if is_intra { 1 } else { 0 }; - if br.read_bool()?{ - if br.read_bool()? { - let pb_mv_count = 1 - (br.read(1)? as usize); - let cbpb = br.read(6)? as u8; - Ok(BBlockInfo::new(true, cbpb, pb_mv_count + pb_mv_add, pb_mv_count == 1)) - } else { - Ok(BBlockInfo::new(true, 0, 1 + pb_mv_add, true)) - } - } else { - Ok(BBlockInfo::new(true, 0, pb_mv_add, false)) - } - } else { - let mvdb = br.read_bool()?; - let cbpb = if mvdb && br.read_bool()? { br.read(6)? as u8 } else { 0 }; - Ok(BBlockInfo::new(true, cbpb, if mvdb { 1 } else { 0 }, false)) - } - } else { - Ok(BBlockInfo::new(false, 0, 0, false)) - } -} - -impl<'a> BlockDecoder for Intel263BR<'a> { - -#[allow(unused_variables)] - fn decode_pichdr(&mut self) -> DecoderResult<PicInfo> { - let br = &mut self.br; - let syncw = br.read(22)?; - validate!(syncw == 0x000020); - let tr = (br.read(8)? << 8) as u16; - check_marker(br)?; - let id = br.read(1)?; - validate!(id == 0); - br.read(1)?; // split screen indicator - br.read(1)?; // document camera indicator - br.read(1)?; // freeze picture release - let mut sfmt = br.read(3)?; - validate!((sfmt != 0b000) && (sfmt != 0b110)); - let is_intra = !br.read_bool()?; - let umv = br.read_bool()?; - br.read(1)?; // syntax arithmetic coding - let apm = br.read_bool()?; - self.is_pb = br.read_bool()?; - let deblock; - let pbplus; - if sfmt == 0b111 { - sfmt = br.read(3)?; - validate!((sfmt != 0b000) && (sfmt != 0b111)); - br.read(2)?; // unknown flags - deblock = br.read_bool()?; - br.read(1)?; // unknown flag - pbplus = br.read_bool()?; - br.read(5)?; // unknown flags - let marker = br.read(5)?; - validate!(marker == 1); - } else { - deblock = false; - pbplus = false; - } - self.is_ipb = pbplus; - let w; let h; - if sfmt == 0b110 { - let par = br.read(4)?; - w = ((br.read(9)? + 1) * 4) as usize; - check_marker(br)?; - h = ((br.read(9)? + 1) * 4) as usize; - if par == 0b1111 { - let pixw = br.read(8)?; - let pixh = br.read(8)?; - validate!((pixw != 0) && (pixh != 0)); - } - } else { - let (w_, h_) = H263_SIZES[sfmt as usize]; - w = w_; - h = h_; - } - let quant = br.read(5)?; - let cpm = br.read_bool()?; - validate!(!cpm); - - let pbinfo; - if self.is_pb { - let trb = br.read(3)?; - let dbquant = br.read(2)?; - pbinfo = Some(PBInfo::new(trb as u8, dbquant as u8, pbplus)); - } else { - pbinfo = None; - } - while br.read_bool()? { // skip PEI - br.read(8)?; - } -//println!("frame {}x{} intra: {} q {} pb {} apm {} umv {} @{}", w, h, is_intra, quant, self.is_pb, apm, umv, br.tell()); - self.gob_no = 0; - self.mb_w = (w + 15) >> 4; - - let ftype = if is_intra { Type::I } else { Type::P }; - let plusinfo = if deblock { Some(PlusInfo::new(false, deblock, false, false)) } else { None }; - let mvmode = if umv { MVMode::UMV } else { MVMode::Old }; - let picinfo = PicInfo::new(w, h, ftype, mvmode, umv, apm, quant as u8, tr, pbinfo, plusinfo); - Ok(picinfo) - } - - #[allow(unused_variables)] - fn decode_slice_header(&mut self, info: &PicInfo) -> DecoderResult<SliceInfo> { - let br = &mut self.br; - let gbsc = br.read(17)?; - validate!(gbsc == 1); - let gn = br.read(5)?; - let gfid = br.read(2)?; - let gquant = br.read(5)?; -//println!("GOB gn {:X} id {} q {}", gn, gfid, gquant); - let ret = SliceInfo::new_gob(0, self.gob_no, gquant as u8); - self.gob_no += 1; - Ok(ret) - } - - #[allow(unused_variables)] - fn decode_block_header(&mut self, info: &PicInfo, slice: &SliceInfo, sstate: &SliceState) -> DecoderResult<BlockInfo> { - let br = &mut self.br; - let mut q = slice.get_quant(); - match info.get_mode() { - Type::I => { - let mut cbpc = br.read_cb(&self.tables.intra_mcbpc_cb)?; - while cbpc == 8 { cbpc = br.read_cb(&self.tables.intra_mcbpc_cb)?; } - let cbpy = br.read_cb(&self.tables.cbpy_cb)?; - let cbp = (cbpy << 2) | (cbpc & 3); - let dquant = (cbpc & 4) != 0; - if dquant { - let idx = br.read(2)? as usize; - q = ((q as i16) + (H263_DQUANT_TAB[idx] as i16)) as u8; - } - Ok(BlockInfo::new(Type::I, cbp, q)) - }, - Type::P => { - if br.read_bool()? { return Ok(BlockInfo::new(Type::Skip, 0, info.get_quant())); } - let mut cbpc = br.read_cb(&self.tables.inter_mcbpc_cb)?; - while cbpc == 20 { cbpc = br.read_cb(&self.tables.inter_mcbpc_cb)?; } - let is_intra = (cbpc & 0x04) != 0; - let dquant = (cbpc & 0x08) != 0; - let is_4x4 = (cbpc & 0x10) != 0; - if is_intra { - let mut mvec: Vec<MV> = Vec::new(); - let bbinfo = decode_b_info(br, self.is_pb, self.is_ipb, true)?; - let cbpy = br.read_cb(&self.tables.cbpy_cb)?; - let cbp = (cbpy << 2) | (cbpc & 3); - if dquant { - let idx = br.read(2)? as usize; - q = ((q as i16) + (H263_DQUANT_TAB[idx] as i16)) as u8; - } - let mut binfo = BlockInfo::new(Type::I, cbp, q); - binfo.set_bpart(bbinfo); - if self.is_pb { - for _ in 0..bbinfo.get_num_mv() { - mvec.push(decode_mv(br, &self.tables.mv_cb)?); - } - binfo.set_b_mv(mvec.as_slice()); - } - return Ok(binfo); - } - - let bbinfo = decode_b_info(br, self.is_pb, self.is_ipb, false)?; - let mut cbpy = br.read_cb(&self.tables.cbpy_cb)?; -// if /* !aiv && */(cbpc & 3) != 3 { - cbpy ^= 0xF; -// } - let cbp = (cbpy << 2) | (cbpc & 3); - if dquant { - let idx = br.read(2)? as usize; - q = ((q as i16) + (H263_DQUANT_TAB[idx] as i16)) as u8; - } - let mut binfo = BlockInfo::new(Type::P, cbp, q); - binfo.set_bpart(bbinfo); - if !is_4x4 { - let mvec: [MV; 1] = [decode_mv(br, &self.tables.mv_cb)?]; - binfo.set_mv(&mvec); - } else { - let mvec: [MV; 4] = [ - decode_mv(br, &self.tables.mv_cb)?, - decode_mv(br, &self.tables.mv_cb)?, - decode_mv(br, &self.tables.mv_cb)?, - decode_mv(br, &self.tables.mv_cb)? - ]; - binfo.set_mv(&mvec); - } - if self.is_pb { - let mut mvec: Vec<MV> = Vec::with_capacity(bbinfo.get_num_mv()); - for _ in 0..bbinfo.get_num_mv() { - let mv = decode_mv(br, &self.tables.mv_cb)?; - mvec.push(mv); - } - binfo.set_b_mv(mvec.as_slice()); - } - Ok(binfo) - }, - _ => { Err(DecoderError::InvalidData) }, - } - } - - #[allow(unused_variables)] - fn decode_block_intra(&mut self, info: &BlockInfo, sstate: &SliceState, quant: u8, no: usize, coded: bool, blk: &mut [i16; 64]) -> DecoderResult<()> { - self.decode_block(quant, true, coded, blk) - } - - #[allow(unused_variables)] - fn decode_block_inter(&mut self, info: &BlockInfo, sstate: &SliceState, quant: u8, no: usize, coded: bool, blk: &mut [i16; 64]) -> DecoderResult<()> { - self.decode_block(quant, false, coded, blk) - } - - fn is_slice_end(&mut self) -> bool { self.br.peek(16) == 0 } -} - -impl Intel263Decoder { - fn new() -> Self { - let mut coderead = H263ShortCodeReader::new(H263_INTRA_MCBPC); - let intra_mcbpc_cb = Codebook::new(&mut coderead, CodebookMode::MSB).unwrap(); - let mut coderead = H263ShortCodeReader::new(H263_INTER_MCBPC); - let inter_mcbpc_cb = Codebook::new(&mut coderead, CodebookMode::MSB).unwrap(); - let mut coderead = H263ShortCodeReader::new(H263_CBPY); - let cbpy_cb = Codebook::new(&mut coderead, CodebookMode::MSB).unwrap(); - let mut coderead = H263RLCodeReader::new(H263_RL_CODES); - let rl_cb = Codebook::new(&mut coderead, CodebookMode::MSB).unwrap(); - let mut coderead = H263RLCodeReader::new(H263_RL_CODES_AIC); - let aic_rl_cb = Codebook::new(&mut coderead, CodebookMode::MSB).unwrap(); - let mut coderead = H263ShortCodeReader::new(H263_MV); - let mv_cb = Codebook::new(&mut coderead, CodebookMode::MSB).unwrap(); - let tables = Tables { - intra_mcbpc_cb: intra_mcbpc_cb, - inter_mcbpc_cb: inter_mcbpc_cb, - cbpy_cb: cbpy_cb, - rl_cb: rl_cb, - aic_rl_cb: aic_rl_cb, - mv_cb: mv_cb, - }; - - Intel263Decoder{ - info: Rc::new(DUMMY_CODEC_INFO), - dec: H263BaseDecoder::new(true), - tables: tables, - bdsp: H263BlockDSP::new(), - } - } -} - -impl NADecoder for Intel263Decoder { - fn init(&mut self, info: Rc<NACodecInfo>) -> DecoderResult<()> { - if let NACodecTypeInfo::Video(vinfo) = info.get_properties() { - let w = vinfo.get_width(); - let h = vinfo.get_height(); - let fmt = formats::YUV420_FORMAT; - let myinfo = NACodecTypeInfo::Video(NAVideoInfo::new(w, h, false, fmt)); - self.info = Rc::new(NACodecInfo::new_ref(info.get_name(), myinfo, info.get_extradata())); - Ok(()) - } else { - Err(DecoderError::InvalidData) - } - } - fn decode(&mut self, pkt: &NAPacket) -> DecoderResult<NAFrameRef> { - let src = pkt.get_buffer(); - - if src.len() == 8 { - let bret = self.dec.get_bframe(&self.bdsp); - let buftype; - let is_skip; - if let Ok(btype) = bret { - buftype = btype; - is_skip = false; - } else { - buftype = NABufferType::None; - is_skip = true; - } - let mut frm = NAFrame::new_from_pkt(pkt, self.info.clone(), buftype); - frm.set_keyframe(false); - frm.set_frame_type(if is_skip { FrameType::Skip } else { FrameType::B }); - return Ok(Rc::new(RefCell::new(frm))); - } - let mut ibr = Intel263BR::new(&src, &self.tables); - - let bufinfo = self.dec.parse_frame(&mut ibr, &self.bdsp)?; - - let mut frm = NAFrame::new_from_pkt(pkt, self.info.clone(), bufinfo); - frm.set_keyframe(self.dec.is_intra()); - frm.set_frame_type(if self.dec.is_intra() { FrameType::I } else { FrameType::P }); - Ok(Rc::new(RefCell::new(frm))) - } -} - - -pub fn get_decoder() -> Box<NADecoder> { - Box::new(Intel263Decoder::new()) -} - -#[cfg(test)] -mod test { - use crate::test::dec_video::test_file_decoding; - #[test] - fn test_intel263() { - test_file_decoding("avi", "assets/neal73_saber.avi", Some(16), true, false, None/*Some("i263")*/); - } -} diff --git a/src/codecs/h263/mod.rs b/src/codecs/h263/mod.rs deleted file mode 100644 index 8718887..0000000 --- a/src/codecs/h263/mod.rs +++ /dev/null @@ -1,396 +0,0 @@ -use super::{DecoderResult, MV, ZERO_MV}; -use crate::frame::NAVideoBuffer; - -pub mod code; -pub mod data; -pub mod decoder; - -#[cfg(feature="decoder_intel263")] -pub mod intel263; -#[cfg(feature="decoder_realvideo1")] -pub mod rv10; -#[cfg(feature="decoder_realvideo2")] -pub mod rv20; - -pub trait BlockDecoder { - fn decode_pichdr(&mut self) -> DecoderResult<PicInfo>; - fn decode_slice_header(&mut self, pinfo: &PicInfo) -> DecoderResult<SliceInfo>; - fn decode_block_header(&mut self, pinfo: &PicInfo, sinfo: &SliceInfo, sstate: &SliceState) -> DecoderResult<BlockInfo>; - fn decode_block_intra(&mut self, info: &BlockInfo, sstate: &SliceState, quant: u8, no: usize, coded: bool, blk: &mut [i16; 64]) -> DecoderResult<()>; - fn decode_block_inter(&mut self, info: &BlockInfo, sstate: &SliceState, quant: u8, no: usize, coded: bool, blk: &mut [i16; 64]) -> DecoderResult<()>; - fn is_slice_end(&mut self) -> bool; -} - -pub trait BlockDSP { - fn idct(&self, blk: &mut [i16; 64]); - fn copy_blocks(&self, dst: &mut NAVideoBuffer<u8>, src: &NAVideoBuffer<u8>, xpos: usize, ypos: usize, w: usize, h: usize, mv: MV); - fn avg_blocks(&self, dst: &mut NAVideoBuffer<u8>, src: &NAVideoBuffer<u8>, xpos: usize, ypos: usize, w: usize, h: usize, mv: MV); - fn filter_row(&self, buf: &mut NAVideoBuffer<u8>, mb_y: usize, mb_w: usize, cbpi: &CBPInfo); -} - -#[allow(dead_code)] -#[derive(Debug,Clone,Copy,PartialEq)] -pub enum Type { - I, P, PB, Skip, B, Special -} - -impl Type { - pub fn is_ref(&self) -> bool { - match *self { - Type::I | Type::P | Type::PB => true, - _ => false, - } - } -} - -#[allow(dead_code)] -#[derive(Debug,Clone,Copy)] -pub struct PBInfo { - trb: u8, - dbquant: u8, - improved: bool, -} - -impl PBInfo { - pub fn new(trb: u8, dbquant: u8, improved: bool) -> Self { - PBInfo{ trb: trb, dbquant: dbquant, improved: improved } - } - pub fn get_trb(&self) -> u8 { self.trb } - pub fn get_dbquant(&self) -> u8 { self.dbquant } - pub fn is_improved(&self) -> bool { self.improved } -} - -#[allow(dead_code)] -#[derive(Debug,Clone,Copy)] -pub struct PicInfo { - pub w: usize, - pub h: usize, - pub mode: Type, - pub mvmode: MVMode, - pub umv: bool, - pub apm: bool, - pub quant: u8, - pub pb: Option<PBInfo>, - pub ts: u16, - pub plusinfo: Option<PlusInfo>, -} - -#[allow(dead_code)] -impl PicInfo { - pub fn new(w: usize, h: usize, mode: Type, mvmode: MVMode, umv: bool, apm: bool, quant: u8, ts: u16, pb: Option<PBInfo>, plusinfo: Option<PlusInfo>) -> Self { - PicInfo { - w: w, h: h, mode: mode, mvmode: mvmode, - umv: umv, apm: apm, quant: quant, - pb: pb, ts: ts, plusinfo: plusinfo - } - } - pub fn get_width(&self) -> usize { self.w } - pub fn get_height(&self) -> usize { self.h } - pub fn get_mode(&self) -> Type { self.mode } - pub fn get_quant(&self) -> u8 { self.quant } - pub fn get_apm(&self) -> bool { self.apm } - pub fn is_pb(&self) -> bool { self.pb.is_some() } - pub fn is_ipb(&self) -> bool { - if let Some(ref pbi) = self.pb { - pbi.is_improved() - } else { - false - } - } - pub fn get_ts(&self) -> u16 { self.ts } - pub fn get_pbinfo(&self) -> PBInfo { self.pb.unwrap() } - pub fn get_plusifo(&self) -> Option<PlusInfo> { self.plusinfo } - pub fn get_mvmode(&self) -> MVMode { self.mvmode } -} - -#[allow(dead_code)] -#[derive(Debug,Clone,Copy)] -pub struct PlusInfo { - pub aic: bool, - pub deblock: bool, - pub aiv_mode: bool, - pub mq_mode: bool, -} - -impl PlusInfo { - pub fn new(aic: bool, deblock: bool, aiv_mode: bool, mq_mode: bool) -> Self { - PlusInfo { aic: aic, deblock: deblock, aiv_mode: aiv_mode, mq_mode: mq_mode } - } -} - -#[allow(dead_code)] -#[derive(Debug,Clone,Copy)] -pub struct SliceInfo { - pub mb_x: usize, - pub mb_y: usize, - pub mb_end: usize, - pub quant: u8, -} - -#[allow(dead_code)] -#[derive(Debug,Clone,Copy)] -pub struct SliceState { - pub is_iframe: bool, - pub mb_x: usize, - pub mb_y: usize, - pub first_line: bool, - pub first_mb: bool, - pub slice_mb_x: usize, - pub slice_mb_y: usize, - pub quant: u8, -} - -const SLICE_NO_END: usize = 99999999; - -impl SliceInfo { - pub fn new(mb_x: usize, mb_y: usize, mb_end: usize, quant: u8) -> Self { - SliceInfo{ mb_x: mb_x, mb_y: mb_y, mb_end: mb_end, quant: quant } - } - pub fn new_gob(mb_x: usize, mb_y: usize, quant: u8) -> Self { - SliceInfo{ mb_x: mb_x, mb_y: mb_y, mb_end: SLICE_NO_END, quant: quant } - } - pub fn get_default_slice(pinfo: &PicInfo) -> Self { - SliceInfo{ mb_x: 0, mb_y: 0, mb_end: SLICE_NO_END, quant: pinfo.get_quant() } - } - pub fn get_quant(&self) -> u8 { self.quant } - pub fn is_at_end(&self, mb_pos: usize) -> bool { self.mb_end == mb_pos } - pub fn needs_check(&self) -> bool { self.mb_end == SLICE_NO_END } -} - -impl SliceState { - pub fn new(is_iframe: bool) -> Self { - SliceState { - is_iframe: is_iframe, mb_x: 0, mb_y: 0, first_line: true, first_mb: true, - slice_mb_x: 0, slice_mb_y: 0, quant: 0 - } - } - pub fn next_mb(&mut self) { - self.mb_x += 1; self.first_mb = false; - if self.mb_x >= self.slice_mb_x && self.mb_y > self.slice_mb_y { - self.first_line = false; - } - } - pub fn new_row(&mut self) { - self.mb_x = 0; self.mb_y += 1; - if self.mb_x >= self.slice_mb_x && self.mb_y > self.slice_mb_y { - self.first_line = false; - } - self.first_mb = true; - } - pub fn reset_slice(&mut self, smb_x: usize, smb_y: usize) { - self.slice_mb_x = smb_x; - self.slice_mb_y = smb_y; - self.first_line = true; - self.first_mb = true; - } -} - -#[derive(Debug,Clone,Copy)] -pub struct BlockInfo { - pub intra: bool, - pub skip: bool, - pub mode: Type, - pub cbp: u8, - pub q: u8, - pub mv: [MV; 4], - pub num_mv: usize, - pub bpart: bool, - pub b_cbp: u8, - pub mv2: [MV; 2], - pub num_mv2: usize, - pub fwd: bool, - pub acpred: ACPredMode, -} - -#[allow(dead_code)] -#[derive(Debug,Clone,Copy)] -pub struct BBlockInfo { - present: bool, - cbp: u8, - num_mv: usize, - fwd: bool, -} - -#[allow(non_camel_case_types)] -#[derive(Debug,Clone,Copy)] -pub enum BlockMVInfo { - Intra, - Inter_1MV(MV), - Inter_4MV([MV; 4]), -} - -#[allow(dead_code)] -#[derive(Debug,Clone,Copy,PartialEq)] -pub enum ACPredMode { - None, - DC, - Ver, - Hor, -} - -#[allow(dead_code)] -impl BlockInfo { - pub fn new(mode: Type, cbp: u8, q: u8) -> Self { - BlockInfo { - intra: mode == Type::I, - skip: (cbp == 0) && (mode != Type::I), - mode: mode, - cbp: cbp, - q: q, - mv: [MV::new(0, 0), MV::new(0, 0), MV::new(0, 0), MV::new(0, 0)], - num_mv: 0, - bpart: false, - b_cbp: 0, - mv2: [ZERO_MV, ZERO_MV], - num_mv2: 0, - fwd: false, - acpred: ACPredMode::None, - } - } - pub fn is_intra(&self) -> bool { self.intra } - pub fn is_skipped(&self) -> bool { self.skip } - pub fn get_mode(&self) -> Type { self.mode } - pub fn get_cbp(&self) -> u8 { self.cbp } - pub fn get_q(&self) -> u8 { self.q } - pub fn get_num_mvs(&self) -> usize { self.num_mv } - pub fn get_mv(&self, idx: usize) -> MV { self.mv[idx] } - pub fn has_b_part(&self) -> bool { self.bpart } - pub fn get_cbp_b(&self) -> u8 { self.b_cbp } - pub fn get_num_mvs2(&self) -> usize { self.num_mv2 } - pub fn get_mv2(&self, idx: usize) -> MV { self.mv2[idx] } - pub fn set_mv(&mut self, mvs: &[MV]) { - if mvs.len() > 0 { self.skip = false; } - let mut mv_arr: [MV; 4] = [MV::new(0, 0), MV::new(0, 0), MV::new(0, 0), MV::new(0, 0)]; - for i in 0..mvs.len() { mv_arr[i] = mvs[i]; } - self.mv = mv_arr; - self.num_mv = mvs.len(); - } - pub fn set_bpart(&mut self, bbinfo: BBlockInfo) { - self.bpart = bbinfo.present; - self.b_cbp = bbinfo.cbp; - self.fwd = bbinfo.fwd; - self.num_mv2 = bbinfo.get_num_mv(); - } - pub fn set_b_mv(&mut self, mvs: &[MV]) { - if mvs.len() > 0 { self.skip = false; } - let mut mv_arr: [MV; 2] = [ZERO_MV, ZERO_MV]; - for i in 0..mvs.len() { mv_arr[i] = mvs[i]; } - self.mv2 = mv_arr; - self.num_mv2 = mvs.len(); - } - pub fn is_b_fwd(&self) -> bool { self.fwd } - pub fn set_acpred(&mut self, acpred: ACPredMode) { self.acpred = acpred } - pub fn get_acpred(&self) -> ACPredMode { self.acpred } -} - -impl BBlockInfo { - pub fn new(present: bool, cbp: u8, num_mv: usize, fwd: bool) -> Self { - BBlockInfo { - present: present, - cbp: cbp, - num_mv: num_mv, - fwd: fwd, - } - } - pub fn get_num_mv(&self) -> usize { self.num_mv } -} - -#[derive(Debug,Clone,Copy)] -pub enum MVMode { - Old, - Long, - UMV, -} - -pub trait H263MVTrait { - fn add_umv(pred_mv: MV, add: MV, mvmode: MVMode) -> MV; - fn scale(&self, trb: u16, trd: u16) -> MV; - fn b_sub(pvec: MV, fwdvec: MV, bvec: MV, trb: u16, trd: u16) -> MV; -} - -impl H263MVTrait for MV { - fn add_umv(pred_mv: MV, add: MV, mvmode: MVMode) -> MV { - let mut new_mv = pred_mv + add; - match mvmode { - MVMode::Old => { - if new_mv.x >= 64 { new_mv.x -= 64; } - else if new_mv.x <= -64 { new_mv.x += 64; } - if new_mv.y >= 64 { new_mv.y -= 64; } - else if new_mv.y <= -64 { new_mv.y += 64; } - }, - MVMode::Long => { - if new_mv.x > 31 { new_mv.x -= 64; } - else if new_mv.x < -32 { new_mv.x += 64; } - if new_mv.y > 31 { new_mv.y -= 64; } - else if new_mv.y < -32 { new_mv.y += 64; } - }, - MVMode::UMV => { - if pred_mv.x > 32 && new_mv.x > 63 { new_mv.x -= 64; } - if pred_mv.x < -31 && new_mv.x < -63 { new_mv.x += 64; } - if pred_mv.y > 32 && new_mv.y > 63 { new_mv.y -= 64; } - if pred_mv.y < -31 && new_mv.y < -63 { new_mv.y += 64; } - }, - }; - new_mv - } - fn scale(&self, trb: u16, trd: u16) -> MV { - if (trd == 0) || (trb == 0) { - ZERO_MV - } else { - MV { x: (((self.x as i32) * (trb as i32)) / (trd as i32)) as i16, y: (((self.y as i32) * (trb as i32)) / (trd as i32)) as i16 } - } - } - fn b_sub(pvec: MV, fwdvec: MV, bvec: MV, trb: u16, trd: u16) -> MV { - let bscale = (trb as i32) - (trd as i32); - let x = if bvec.x != 0 { fwdvec.x - pvec.x } else if trd != 0 { (bscale * (pvec.x as i32) / (trd as i32)) as i16 } else { 0 }; - let y = if bvec.y != 0 { fwdvec.y - pvec.y } else if trd != 0 { (bscale * (pvec.y as i32) / (trd as i32)) as i16 } else { 0 }; - MV { x: x, y: y } - } -} - -#[allow(dead_code)] -pub struct CBPInfo { - cbp: Vec<u8>, - q: Vec<u8>, - mb_w: usize, -} - -impl CBPInfo { - fn new() -> Self { CBPInfo{ cbp: Vec::new(), q: Vec::new(), mb_w: 0 } } - fn reset(&mut self, mb_w: usize) { - self.mb_w = mb_w; - self.cbp.truncate(0); - self.cbp.resize(self.mb_w * 2, 0); - self.q.truncate(0); - self.q.resize(self.mb_w * 2, 0); - } - fn update_row(&mut self) { - for i in 0..self.mb_w { - self.cbp[i] = self.cbp[self.mb_w + i]; - self.q[i] = self.q[self.mb_w + i]; - } - } - fn set_cbp(&mut self, mb_x: usize, cbp: u8) { - self.cbp[self.mb_w + mb_x] = cbp; - } - fn set_q(&mut self, mb_x: usize, q: u8) { - self.q[self.mb_w + mb_x] = q; - } - pub fn get_q(&self, mb_x: usize) -> u8 { self.q[mb_x] } - pub fn is_coded(&self, mb_x: usize, blk_no: usize) -> bool { - (self.cbp[self.mb_w + mb_x] & (1 << (5 - blk_no))) != 0 - } - pub fn is_coded_top(&self, mb_x: usize, blk_no: usize) -> bool { - let cbp = self.cbp[self.mb_w + mb_x]; - let cbp_top = self.cbp[mb_x]; - match blk_no { - 0 => { (cbp_top & 0b001000) != 0 }, - 1 => { (cbp_top & 0b000100) != 0 }, - 2 => { (cbp & 0b100000) != 0 }, - 3 => { (cbp & 0b010000) != 0 }, - 4 => { (cbp_top & 0b000010) != 0 }, - _ => { (cbp_top & 0b000001) != 0 }, - } - } -} - diff --git a/src/codecs/h263/rv10.rs b/src/codecs/h263/rv10.rs deleted file mode 100644 index 7e41b7a..0000000 --- a/src/codecs/h263/rv10.rs +++ /dev/null @@ -1,620 +0,0 @@ -use crate::io::bitreader::*; -use crate::io::codebook::*; -use crate::formats; -use super::super::*; -use super::*; -use super::code::H263BlockDSP; -use super::decoder::*; -use super::data::*; - -#[allow(dead_code)] -struct Tables { - intra_mcbpc_cb: Codebook<u8>, - inter_mcbpc_cb: Codebook<u8>, - cbpy_cb: Codebook<u8>, - rl_cb: Codebook<H263RLSym>, - aic_rl_cb: Codebook<H263RLSym>, - mv_cb: Codebook<u8>, - luma_dc_cb: Codebook<u8>, - chroma_dc_cb: Codebook<u8>, -} - -struct RealVideo10Decoder { - info: Rc<NACodecInfo>, - dec: H263BaseDecoder, - tables: Tables, - w: usize, - h: usize, - new_ver: bool, - bdsp: H263BlockDSP, - mvmode: MVMode, -} - -struct RealVideo10BR<'a> { - br: BitReader<'a>, - tables: &'a Tables, - num_slices: usize, - slice_no: usize, - slice_off: Vec<u32>, - w: usize, - h: usize, - mb_w: usize, - mb_h: usize, - new_ver: bool, - dc_coded: [bool; 3], - last_dc: [i16; 3], - mvmode: MVMode, -} - -struct RV10SliceInfo { - is_p: bool, - qscale: u8, - mb_x: usize, - mb_y: usize, - mb_c: usize, -} - -impl RV10SliceInfo { - fn new(is_p: bool, qscale: u8, mb_x: usize, mb_y: usize, mb_c: usize) -> Self { - RV10SliceInfo { is_p: is_p, qscale: qscale, mb_x: mb_x, mb_y: mb_y, mb_c: mb_c } - } -} - -impl<'a> RealVideo10BR<'a> { - fn new(src: &'a [u8], tables: &'a Tables, width: usize, height: usize, new_ver: bool, mvmode: MVMode) -> Self { - let nslices = (src[0] as usize) + 1; - let mut slice_offs = Vec::with_capacity(nslices); - { - let offs = &src[1..][..nslices * 8]; - let mut br = BitReader::new(offs, offs.len(), BitReaderMode::BE); - for _ in 0..nslices { - br.skip(32).unwrap(); - let off = br.read(32).unwrap(); - slice_offs.push(off); - } - } - let soff = nslices * 8 + 1; - RealVideo10BR { - br: BitReader::new(&src[soff..], src.len() - soff, BitReaderMode::BE), - tables: tables, - num_slices: nslices, - slice_no: 0, - slice_off: slice_offs, - w: width, - h: height, - mb_w: (width + 15) >> 4, - mb_h: (height + 15) >> 4, - new_ver: new_ver, - dc_coded: [false; 3], - last_dc: [0; 3], - mvmode: mvmode, - } - } - -#[allow(unused_variables)] - fn decode_block(&mut self, sstate: &SliceState, quant: u8, intra: bool, coded: bool, blk: &mut [i16; 64], plane_no: usize) -> DecoderResult<()> { - let br = &mut self.br; - let mut idx = 0; - if intra { - let mut dc; - if !self.new_ver || !sstate.is_iframe { - dc = br.read(8)? as i16; - if dc == 255 { dc = 128; } - } else { - if self.dc_coded[plane_no] { - let diff; - let bits = br.peek(14); - let ret = if plane_no == 0 { - br.read_cb(&self.tables.luma_dc_cb) - } else { - br.read_cb(&self.tables.chroma_dc_cb) - }; - if ret.is_err() { - println!("Illegal {} code {:X}", if plane_no==0{"luma"}else{"chroma"},bits); - } - let val = ret.unwrap() as i16; - - if val != 0 { - diff = val - 128; - } else { - let code = br.read(2)?; - match code { - 0x0 => { diff = ((br.read(7)? + 1) as i8) as i16; }, - 0x1 => { diff = (br.read(7)? as i16) - 128; }, - 0x2 => { - if plane_no == 0 { - if br.read_bool()? { - diff = ((br.read(8)? + 1) as i8) as i16; - } else { - diff = (br.read(8)? as i8) as i16; - } - } else { - br.skip(9)?; - diff = 1; - } - }, - _ => { - if plane_no == 0 { - br.skip(4)?; - diff = 1; - } else { - return Err(DecoderError::InvalidData); - } - }, - }; - } - dc = (self.last_dc[plane_no] - diff) & 0xFF; - self.last_dc[plane_no] = dc; - } else { - self.dc_coded[plane_no] = true; - dc = self.last_dc[plane_no]; - } - } - blk[0] = dc << 3; - idx = 1; - } - if !coded { return Ok(()); } - - let rl_cb = &self.tables.rl_cb; // could be aic too - let q_add = if quant == 0 { 0i16 } else { ((quant - 1) | 1) as i16 }; - let q = (quant * 2) as i16; - while idx < 64 { - let code = br.read_cb(rl_cb)?; - let run; - let mut level; - let last; - if !code.is_escape() { - run = code.get_run(); - level = code.get_level(); - last = code.is_last(); - if br.read_bool()? { level = -level; } - level = (level * q) + q_add; - } else { - last = br.read_bool()?; - run = br.read(6)? as u8; - level = br.read_s(8)? as i16; - if level == -128 { - let low = br.read(5)? as i16; - let top = br.read_s(6)? as i16; - level = (top << 5) | low; - } - level = (level * q) + q_add; - if level < -2048 { level = -2048; } - if level > 2047 { level = 2047; } - } - idx += run; - validate!(idx < 64); - let oidx = H263_ZIGZAG[idx as usize]; - blk[oidx] = level; - idx += 1; - if last { break; } - } - Ok(()) - } -} - -fn decode_mv_component(br: &mut BitReader, mv_cb: &Codebook<u8>) -> DecoderResult<i16> { - let code = br.read_cb(mv_cb)? as i16; - if code == 0 { return Ok(0) } - if !br.read_bool()? { - Ok(code) - } else { - Ok(-code) - } -} - -fn decode_mv(br: &mut BitReader, mv_cb: &Codebook<u8>) -> DecoderResult<MV> { - let xval = decode_mv_component(br, mv_cb)?; - let yval = decode_mv_component(br, mv_cb)?; - Ok(MV::new(xval, yval)) -} - -impl<'a> BlockDecoder for RealVideo10BR<'a> { - -#[allow(unused_variables)] - fn decode_pichdr(&mut self) -> DecoderResult<PicInfo> { - self.slice_no = 0; - let shdr = self.read_slice_header()?; - validate!((shdr.mb_x == 0) && (shdr.mb_y == 0)); - - let mb_end = shdr.mb_x + shdr.mb_y * self.mb_w + shdr.mb_c; - - let ftype = if !shdr.is_p { Type::I } else { Type::P }; - let picinfo = PicInfo::new(self.w, self.h, ftype, self.mvmode, false, false, shdr.qscale, 0, None, None); - Ok(picinfo) - } - - #[allow(unused_variables)] - fn decode_slice_header(&mut self, info: &PicInfo) -> DecoderResult<SliceInfo> { - let shdr = self.read_slice_header()?; - self.slice_no += 1; - let mb_end = shdr.mb_x + shdr.mb_y * self.mb_w + shdr.mb_c; - let ret = SliceInfo::new(shdr.mb_x, shdr.mb_y, mb_end, shdr.qscale); - - Ok(ret) - } - - fn decode_block_header(&mut self, info: &PicInfo, slice: &SliceInfo, _sstate: &SliceState) -> DecoderResult<BlockInfo> { - let br = &mut self.br; - let mut q = slice.get_quant(); - match info.get_mode() { - Type::I => { - let mut cbpc = br.read_cb(&self.tables.intra_mcbpc_cb)?; - while cbpc == 8 { cbpc = br.read_cb(&self.tables.intra_mcbpc_cb)?; } - let cbpy = br.read_cb(&self.tables.cbpy_cb)?; - let cbp = (cbpy << 2) | (cbpc & 3); - let dquant = (cbpc & 4) != 0; - if dquant { - let idx = br.read(2)? as usize; - q = ((q as i16) + (H263_DQUANT_TAB[idx] as i16)) as u8; - } - Ok(BlockInfo::new(Type::I, cbp, q)) - }, - Type::P => { - if br.read_bool()? { - return Ok(BlockInfo::new(Type::Skip, 0, info.get_quant())); - } - let mut cbpc = br.read_cb(&self.tables.inter_mcbpc_cb)?; - while cbpc == 20 { cbpc = br.read_cb(&self.tables.inter_mcbpc_cb)?; } - let is_intra = (cbpc & 0x04) != 0; - let dquant = (cbpc & 0x08) != 0; - let is_4x4 = (cbpc & 0x10) != 0; - if is_intra { - let cbpy = br.read_cb(&self.tables.cbpy_cb)?; - let cbp = (cbpy << 2) | (cbpc & 3); - if dquant { - let idx = br.read(2)? as usize; - q = ((q as i16) + (H263_DQUANT_TAB[idx] as i16)) as u8; - } - let binfo = BlockInfo::new(Type::I, cbp, q); - return Ok(binfo); - } - - let mut cbpy = br.read_cb(&self.tables.cbpy_cb)?; -// if /* !aiv && */(cbpc & 3) != 3 { - cbpy ^= 0xF; -// } - let cbp = (cbpy << 2) | (cbpc & 3); - if dquant { - let idx = br.read(2)? as usize; - q = ((q as i16) + (H263_DQUANT_TAB[idx] as i16)) as u8; - } - let mut binfo = BlockInfo::new(Type::P, cbp, q); - if !is_4x4 { - let mvec: [MV; 1] = [decode_mv(br, &self.tables.mv_cb)?]; - binfo.set_mv(&mvec); - } else { - let mvec: [MV; 4] = [ - decode_mv(br, &self.tables.mv_cb)?, - decode_mv(br, &self.tables.mv_cb)?, - decode_mv(br, &self.tables.mv_cb)?, - decode_mv(br, &self.tables.mv_cb)? - ]; - binfo.set_mv(&mvec); - } - Ok(binfo) - }, - _ => { println!("wrong info mode"); Err(DecoderError::InvalidData) }, - } - } - - #[allow(unused_variables)] - fn decode_block_intra(&mut self, info: &BlockInfo, sstate: &SliceState, quant: u8, no: usize, coded: bool, blk: &mut [i16; 64]) -> DecoderResult<()> { - self.decode_block(sstate, quant, true, coded, blk, if no < 4 { 0 } else { no - 3 }) - } - - #[allow(unused_variables)] - fn decode_block_inter(&mut self, info: &BlockInfo, sstate: &SliceState, quant: u8, no: usize, coded: bool, blk: &mut [i16; 64]) -> DecoderResult<()> { - self.decode_block(sstate, quant, false, coded, blk, if no < 4 { 0 } else { no - 3 }) - } - - fn is_slice_end(&mut self) -> bool { false } -} - -impl<'a> RealVideo10BR<'a> { - fn read_slice_header(&mut self) -> DecoderResult<RV10SliceInfo> { - validate!(self.slice_no < self.num_slices); - - let br = &mut self.br; - br.seek(self.slice_off[self.slice_no] * 8)?; - - let marker = br.read(1)?; - validate!(marker == 1); - let is_p = br.read_bool()?; - let pb_frame = br.read_bool()?; - validate!(!pb_frame); - let qscale = br.read(5)? as u8; - validate!(qscale > 0); - - if !is_p && self.new_ver { - self.last_dc[0] = br.read(8)? as i16; - self.last_dc[1] = br.read(8)? as i16; - self.last_dc[2] = br.read(8)? as i16; - } else { - self.last_dc[0] = 0; - self.last_dc[1] = 0; - self.last_dc[2] = 0; - } - self.dc_coded[0] = false; - self.dc_coded[1] = false; - self.dc_coded[2] = false; - - let mb_x; - let mb_y; - let mb_count; - if (br.peek(12) == 0) || (self.slice_no > 0) { - mb_x = br.read(6)? as usize; - mb_y = br.read(6)? as usize; - mb_count = br.read(12)? as usize; - } else { - mb_x = 0; - mb_y = 0; - mb_count = self.mb_w * self.mb_h; - } - br.skip(3)?; - validate!(mb_x + mb_y * self.mb_w + mb_count <= self.mb_w * self.mb_h); - - Ok(RV10SliceInfo::new(is_p, qscale, mb_x, mb_y, mb_count)) - } -} - -impl RealVideo10Decoder { - fn new() -> Self { - let mut coderead = H263ShortCodeReader::new(H263_INTRA_MCBPC); - let intra_mcbpc_cb = Codebook::new(&mut coderead, CodebookMode::MSB).unwrap(); - let mut coderead = H263ShortCodeReader::new(H263_INTER_MCBPC); - let inter_mcbpc_cb = Codebook::new(&mut coderead, CodebookMode::MSB).unwrap(); - let mut coderead = H263ShortCodeReader::new(H263_CBPY); - let cbpy_cb = Codebook::new(&mut coderead, CodebookMode::MSB).unwrap(); - let mut coderead = H263RLCodeReader::new(H263_RL_CODES); - let rl_cb = Codebook::new(&mut coderead, CodebookMode::MSB).unwrap(); - let mut coderead = H263RLCodeReader::new(H263_RL_CODES_AIC); - let aic_rl_cb = Codebook::new(&mut coderead, CodebookMode::MSB).unwrap(); - let mut coderead = H263ShortCodeReader::new(H263_MV); - let mv_cb = Codebook::new(&mut coderead, CodebookMode::MSB).unwrap(); - let mut coderead = CodeReader::new(RV10_LUMA_DC_CODES, RV10_LUMA_DC_BITS); - let luma_dc_cb = Codebook::new(&mut coderead, CodebookMode::MSB).unwrap(); - let mut coderead = CodeReader::new(RV10_CHROMA_DC_CODES, RV10_CHROMA_DC_BITS); - let chroma_dc_cb = Codebook::new(&mut coderead, CodebookMode::MSB).unwrap(); - - let tables = Tables { - intra_mcbpc_cb: intra_mcbpc_cb, - inter_mcbpc_cb: inter_mcbpc_cb, - cbpy_cb: cbpy_cb, - rl_cb: rl_cb, - aic_rl_cb: aic_rl_cb, - mv_cb: mv_cb, - luma_dc_cb: luma_dc_cb, - chroma_dc_cb: chroma_dc_cb, - }; - - RealVideo10Decoder{ - info: Rc::new(DUMMY_CODEC_INFO), - dec: H263BaseDecoder::new_with_opts(false, false, false), - tables: tables, - w: 0, - h: 0, - new_ver: false, - bdsp: H263BlockDSP::new(), - mvmode: MVMode::Long, - } - } -} - -impl NADecoder for RealVideo10Decoder { - fn init(&mut self, info: Rc<NACodecInfo>) -> DecoderResult<()> { - if let NACodecTypeInfo::Video(vinfo) = info.get_properties() { - let w = vinfo.get_width(); - let h = vinfo.get_height(); - let fmt = formats::YUV420_FORMAT; - let myinfo = NACodecTypeInfo::Video(NAVideoInfo::new(w, h, false, fmt)); - self.info = Rc::new(NACodecInfo::new_ref(info.get_name(), myinfo, info.get_extradata())); - self.w = w; - self.h = h; - - let edata = info.get_extradata().unwrap(); - let src: &[u8] = &edata; - let ver = ((src[4] as u32) << 12) | ((src[5] as u32) << 4) | ((src[6] as u32) >> 4); - let maj_ver = ver >> 16; - let mic_ver = ver & 0xFF; -println!("ver {:06X} -> {}", ver, mic_ver); - validate!(maj_ver == 1); - self.new_ver = mic_ver > 1; - if (src[3] & 1) != 0 { - self.mvmode = MVMode::UMV; - } -{ -let mut br = BitReader::new(src, src.len(), BitReaderMode::BE); -println!("edata:"); -println!("{:08X}", br.read(32).unwrap()); -println!("{:08X}", br.read(32).unwrap()); -} - Ok(()) - } else { -println!("???"); - Err(DecoderError::InvalidData) - } - } - fn decode(&mut self, pkt: &NAPacket) -> DecoderResult<NAFrameRef> { - let src = pkt.get_buffer(); - -//println!(" decode frame size {}, {} slices", src.len(), src[0]+1); - let mut ibr = RealVideo10BR::new(&src, &self.tables, self.w, self.h, self.new_ver, self.mvmode); - - let bufinfo = self.dec.parse_frame(&mut ibr, &self.bdsp)?; - - let mut frm = NAFrame::new_from_pkt(pkt, self.info.clone(), bufinfo); - frm.set_keyframe(self.dec.is_intra()); - frm.set_frame_type(if self.dec.is_intra() { FrameType::I } else { FrameType::P }); - Ok(Rc::new(RefCell::new(frm))) - } -} - - -pub fn get_decoder() -> Box<NADecoder> { - Box::new(RealVideo10Decoder::new()) -} - -#[cfg(test)] -mod test { - use crate::test::dec_video::test_file_decoding; - #[test] - fn test_rv10() { - test_file_decoding("realmedia", "assets/RV/rv10_dnet_640x352_realvideo_encoder_4.0.rm", Some(1000), true, false, None/*Some("rv10")*/); - } -} - -pub struct CodeReader { codes: &'static [u16], bits: &'static [u8] } - -impl CodeReader { - pub fn new(codes: &'static [u16], bits: &'static [u8]) -> Self { - CodeReader { codes: codes, bits: bits } - } -} - -impl CodebookDescReader<u8> for CodeReader { - fn bits(&mut self, idx: usize) -> u8 { self.bits[idx] } - fn code(&mut self, idx: usize) -> u32 { self.codes[idx] as u32 } - fn sym (&mut self, idx: usize) -> u8 { idx as u8 } - fn len(&mut self) -> usize { self.bits.len() } -} - -const RV10_LUMA_DC_CODES: &[u16] = &[ - 0x001f, 0x0f00, 0x0f01, 0x0f02, 0x0f03, 0x0f04, 0x0f05, 0x0f06, - 0x0f07, 0x0f08, 0x0f09, 0x0f0a, 0x0f0b, 0x0f0c, 0x0f0d, 0x0f0e, - 0x0f0f, 0x0f10, 0x0f11, 0x0f12, 0x0f13, 0x0f14, 0x0f15, 0x0f16, - 0x0f17, 0x0f18, 0x0f19, 0x0f1a, 0x0f1b, 0x0f1c, 0x0f1d, 0x0f1e, - 0x0f1f, 0x0f20, 0x0f21, 0x0f22, 0x0f23, 0x0f24, 0x0f25, 0x0f26, - 0x0f27, 0x0f28, 0x0f29, 0x0f2a, 0x0f2b, 0x0f2c, 0x0f2d, 0x0f2e, - 0x0f2f, 0x0f30, 0x0f31, 0x0f32, 0x0f33, 0x0f34, 0x0f35, 0x0f36, - 0x0f37, 0x0f38, 0x0f39, 0x0f3a, 0x0f3b, 0x0f3c, 0x0f3d, 0x0f3e, - 0x0f3f, 0x0380, 0x0381, 0x0382, 0x0383, 0x0384, 0x0385, 0x0386, - 0x0387, 0x0388, 0x0389, 0x038a, 0x038b, 0x038c, 0x038d, 0x038e, - 0x038f, 0x0390, 0x0391, 0x0392, 0x0393, 0x0394, 0x0395, 0x0396, - 0x0397, 0x0398, 0x0399, 0x039a, 0x039b, 0x039c, 0x039d, 0x039e, - 0x039f, 0x00c0, 0x00c1, 0x00c2, 0x00c3, 0x00c4, 0x00c5, 0x00c6, - 0x00c7, 0x00c8, 0x00c9, 0x00ca, 0x00cb, 0x00cc, 0x00cd, 0x00ce, - 0x00cf, 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, - 0x0057, 0x0020, 0x0021, 0x0022, 0x0023, 0x000c, 0x000d, 0x0004, - 0x0000, 0x0005, 0x000e, 0x000f, 0x0024, 0x0025, 0x0026, 0x0027, - 0x0058, 0x0059, 0x005a, 0x005b, 0x005c, 0x005d, 0x005e, 0x005f, - 0x00d0, 0x00d1, 0x00d2, 0x00d3, 0x00d4, 0x00d5, 0x00d6, 0x00d7, - 0x00d8, 0x00d9, 0x00da, 0x00db, 0x00dc, 0x00dd, 0x00de, 0x00df, - 0x03a0, 0x03a1, 0x03a2, 0x03a3, 0x03a4, 0x03a5, 0x03a6, 0x03a7, - 0x03a8, 0x03a9, 0x03aa, 0x03ab, 0x03ac, 0x03ad, 0x03ae, 0x03af, - 0x03b0, 0x03b1, 0x03b2, 0x03b3, 0x03b4, 0x03b5, 0x03b6, 0x03b7, - 0x03b8, 0x03b9, 0x03ba, 0x03bb, 0x03bc, 0x03bd, 0x03be, 0x03bf, - 0x0f40, 0x0f41, 0x0f42, 0x0f43, 0x0f44, 0x0f45, 0x0f46, 0x0f47, - 0x0f48, 0x0f49, 0x0f4a, 0x0f4b, 0x0f4c, 0x0f4d, 0x0f4e, 0x0f4f, - 0x0f50, 0x0f51, 0x0f52, 0x0f53, 0x0f54, 0x0f55, 0x0f56, 0x0f57, - 0x0f58, 0x0f59, 0x0f5a, 0x0f5b, 0x0f5c, 0x0f5d, 0x0f5e, 0x0f5f, - 0x0f60, 0x0f61, 0x0f62, 0x0f63, 0x0f64, 0x0f65, 0x0f66, 0x0f67, - 0x0f68, 0x0f69, 0x0f6a, 0x0f6b, 0x0f6c, 0x0f6d, 0x0f6e, 0x0f6f, - 0x0f70, 0x0f71, 0x0f72, 0x0f73, 0x0f74, 0x0f75, 0x0f76, 0x0f77, - 0x0f78, 0x0f79, 0x0f7a, 0x0f7b, 0x0f7c, 0x0f7d, 0x0f7e, 0x0f7f, -]; - -const RV10_LUMA_DC_BITS: &[u8] = &[ - 5, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, - 12, 10, 10, 10, 10, 10, 10, 10, - 10, 10, 10, 10, 10, 10, 10, 10, - 10, 10, 10, 10, 10, 10, 10, 10, - 10, 10, 10, 10, 10, 10, 10, 10, - 10, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, - 8, 7, 7, 7, 7, 7, 7, 7, - 7, 6, 6, 6, 6, 5, 5, 4, - 2, 4, 5, 5, 6, 6, 6, 6, - 7, 7, 7, 7, 7, 7, 7, 7, - 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, - 10, 10, 10, 10, 10, 10, 10, 10, - 10, 10, 10, 10, 10, 10, 10, 10, - 10, 10, 10, 10, 10, 10, 10, 10, - 10, 10, 10, 10, 10, 10, 10, 10, - 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, -]; - -const RV10_CHROMA_DC_CODES: &[u16] = &[ - 0x003f, 0x3f00, 0x3f01, 0x3f02, 0x3f03, 0x3f04, 0x3f05, 0x3f06, - 0x3f07, 0x3f08, 0x3f09, 0x3f0a, 0x3f0b, 0x3f0c, 0x3f0d, 0x3f0e, - 0x3f0f, 0x3f10, 0x3f11, 0x3f12, 0x3f13, 0x3f14, 0x3f15, 0x3f16, - 0x3f17, 0x3f18, 0x3f19, 0x3f1a, 0x3f1b, 0x3f1c, 0x3f1d, 0x3f1e, - 0x3f1f, 0x3f20, 0x3f21, 0x3f22, 0x3f23, 0x3f24, 0x3f25, 0x3f26, - 0x3f27, 0x3f28, 0x3f29, 0x3f2a, 0x3f2b, 0x3f2c, 0x3f2d, 0x3f2e, - 0x3f2f, 0x3f30, 0x3f31, 0x3f32, 0x3f33, 0x3f34, 0x3f35, 0x3f36, - 0x3f37, 0x3f38, 0x3f39, 0x3f3a, 0x3f3b, 0x3f3c, 0x3f3d, 0x3f3e, - 0x3f3f, 0x0f80, 0x0f81, 0x0f82, 0x0f83, 0x0f84, 0x0f85, 0x0f86, - 0x0f87, 0x0f88, 0x0f89, 0x0f8a, 0x0f8b, 0x0f8c, 0x0f8d, 0x0f8e, - 0x0f8f, 0x0f90, 0x0f91, 0x0f92, 0x0f93, 0x0f94, 0x0f95, 0x0f96, - 0x0f97, 0x0f98, 0x0f99, 0x0f9a, 0x0f9b, 0x0f9c, 0x0f9d, 0x0f9e, - 0x0f9f, 0x03c0, 0x03c1, 0x03c2, 0x03c3, 0x03c4, 0x03c5, 0x03c6, - 0x03c7, 0x03c8, 0x03c9, 0x03ca, 0x03cb, 0x03cc, 0x03cd, 0x03ce, - 0x03cf, 0x00e0, 0x00e1, 0x00e2, 0x00e3, 0x00e4, 0x00e5, 0x00e6, - 0x00e7, 0x0030, 0x0031, 0x0032, 0x0033, 0x0008, 0x0009, 0x0002, - 0x0000, 0x0003, 0x000a, 0x000b, 0x0034, 0x0035, 0x0036, 0x0037, - 0x00e8, 0x00e9, 0x00ea, 0x00eb, 0x00ec, 0x00ed, 0x00ee, 0x00ef, - 0x03d0, 0x03d1, 0x03d2, 0x03d3, 0x03d4, 0x03d5, 0x03d6, 0x03d7, - 0x03d8, 0x03d9, 0x03da, 0x03db, 0x03dc, 0x03dd, 0x03de, 0x03df, - 0x0fa0, 0x0fa1, 0x0fa2, 0x0fa3, 0x0fa4, 0x0fa5, 0x0fa6, 0x0fa7, - 0x0fa8, 0x0fa9, 0x0faa, 0x0fab, 0x0fac, 0x0fad, 0x0fae, 0x0faf, - 0x0fb0, 0x0fb1, 0x0fb2, 0x0fb3, 0x0fb4, 0x0fb5, 0x0fb6, 0x0fb7, - 0x0fb8, 0x0fb9, 0x0fba, 0x0fbb, 0x0fbc, 0x0fbd, 0x0fbe, 0x0fbf, - 0x3f40, 0x3f41, 0x3f42, 0x3f43, 0x3f44, 0x3f45, 0x3f46, 0x3f47, - 0x3f48, 0x3f49, 0x3f4a, 0x3f4b, 0x3f4c, 0x3f4d, 0x3f4e, 0x3f4f, - 0x3f50, 0x3f51, 0x3f52, 0x3f53, 0x3f54, 0x3f55, 0x3f56, 0x3f57, - 0x3f58, 0x3f59, 0x3f5a, 0x3f5b, 0x3f5c, 0x3f5d, 0x3f5e, 0x3f5f, - 0x3f60, 0x3f61, 0x3f62, 0x3f63, 0x3f64, 0x3f65, 0x3f66, 0x3f67, - 0x3f68, 0x3f69, 0x3f6a, 0x3f6b, 0x3f6c, 0x3f6d, 0x3f6e, 0x3f6f, - 0x3f70, 0x3f71, 0x3f72, 0x3f73, 0x3f74, 0x3f75, 0x3f76, 0x3f77, - 0x3f78, 0x3f79, 0x3f7a, 0x3f7b, 0x3f7c, 0x3f7d, 0x3f7e, 0x3f7f, -]; - -const RV10_CHROMA_DC_BITS: &[u8] = &[ - 7, 14, 14, 14, 14, 14, 14, 14, - 14, 14, 14, 14, 14, 14, 14, 14, - 14, 14, 14, 14, 14, 14, 14, 14, - 14, 14, 14, 14, 14, 14, 14, 14, - 14, 14, 14, 14, 14, 14, 14, 14, - 14, 14, 14, 14, 14, 14, 14, 14, - 14, 14, 14, 14, 14, 14, 14, 14, - 14, 14, 14, 14, 14, 14, 14, 14, - 14, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, - 12, 10, 10, 10, 10, 10, 10, 10, - 10, 10, 10, 10, 10, 10, 10, 10, - 10, 8, 8, 8, 8, 8, 8, 8, - 8, 6, 6, 6, 6, 4, 4, 3, - 2, 3, 4, 4, 6, 6, 6, 6, - 8, 8, 8, 8, 8, 8, 8, 8, - 10, 10, 10, 10, 10, 10, 10, 10, - 10, 10, 10, 10, 10, 10, 10, 10, - 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, - 14, 14, 14, 14, 14, 14, 14, 14, - 14, 14, 14, 14, 14, 14, 14, 14, - 14, 14, 14, 14, 14, 14, 14, 14, - 14, 14, 14, 14, 14, 14, 14, 14, - 14, 14, 14, 14, 14, 14, 14, 14, - 14, 14, 14, 14, 14, 14, 14, 14, - 14, 14, 14, 14, 14, 14, 14, 14, - 14, 14, 14, 14, 14, 14, 14, 14, -]; diff --git a/src/codecs/h263/rv20.rs b/src/codecs/h263/rv20.rs deleted file mode 100644 index 11dbe2e..0000000 --- a/src/codecs/h263/rv20.rs +++ /dev/null @@ -1,529 +0,0 @@ -use crate::io::bitreader::*; -use crate::io::codebook::*; -use crate::formats; -use super::super::*; -use super::*; -use super::code::H263BlockDSP; -use super::decoder::*; -use super::data::*; - -#[allow(dead_code)] -struct Tables { - intra_mcbpc_cb: Codebook<u8>, - inter_mcbpc_cb: Codebook<u8>, - mbtype_b_cb: Codebook<u8>, - cbpy_cb: Codebook<u8>, - cbpc_b_cb: Codebook<u8>, - rl_cb: Codebook<H263RLSym>, - aic_rl_cb: Codebook<H263RLSym>, - mv_cb: Codebook<u8>, -} - -#[derive(Clone,Copy)] -struct RPRInfo { - present: bool, - bits: u8, - widths: [usize; 8], - heights: [usize; 8], -} - -struct RealVideo20Decoder { - info: Rc<NACodecInfo>, - dec: H263BaseDecoder, - tables: Tables, - w: usize, - h: usize, - minor_ver: u8, - rpr: RPRInfo, - bdsp: H263BlockDSP, -} - -struct RealVideo20BR<'a> { - br: BitReader<'a>, - tables: &'a Tables, - num_slices: usize, - slice_no: usize, - slice_off: Vec<u32>, - w: usize, - h: usize, - mb_w: usize, - mb_h: usize, - mb_pos_bits: u8, - minor_ver: u8, - rpr: RPRInfo, -} - -struct RV20SliceInfo { - ftype: Type, - seq: u32, - qscale: u8, - mb_x: usize, - mb_y: usize, - mb_pos: usize, - w: usize, - h: usize, -} - -impl RV20SliceInfo { - fn new(ftype: Type, seq: u32, qscale: u8, mb_x: usize, mb_y: usize, mb_pos: usize, w: usize, h: usize) -> Self { - RV20SliceInfo { ftype: ftype, seq: seq, qscale: qscale, mb_x: mb_x, mb_y: mb_y, mb_pos: mb_pos, w: w, h: h } - } -} - -impl<'a> RealVideo20BR<'a> { - fn new(src: &'a [u8], tables: &'a Tables, width: usize, height: usize, minor_ver: u8, rpr: RPRInfo) -> Self { - let nslices = (src[0] as usize) + 1; - let mut slice_offs = Vec::with_capacity(nslices); - { - let offs = &src[1..][..nslices * 8]; - let mut br = BitReader::new(offs, offs.len(), BitReaderMode::BE); - for _ in 0..nslices { - br.skip(32).unwrap(); - let off = br.read(32).unwrap(); - slice_offs.push(off); - } - } - let soff = nslices * 8 + 1; - let mb_w = (width + 15) >> 4; - let mb_h = (height + 15) >> 4; - let max_pos = mb_w * mb_h - 1; - let mut mbpb = 0; - for i in 0..H263_MBB.len() { - if max_pos <= H263_MBB[i].blocks { - mbpb = H263_MBB[i].bits; - break; - } - } - RealVideo20BR { - br: BitReader::new(&src[soff..], src.len() - soff, BitReaderMode::BE), - tables: tables, - num_slices: nslices, - slice_no: 0, - slice_off: slice_offs, - w: width, - h: height, - mb_w: mb_w, - mb_h: mb_h, - mb_pos_bits: mbpb, - minor_ver: minor_ver, - rpr: rpr, - } - } - -#[allow(unused_variables)] - fn decode_block(&mut self, sstate: &SliceState, quant: u8, intra: bool, coded: bool, blk: &mut [i16; 64], plane_no: usize, acpred: ACPredMode) -> DecoderResult<()> { - let br = &mut self.br; - let mut idx = 0; - if !sstate.is_iframe && intra { - let mut dc = br.read(8)? as i16; - if dc == 255 { dc = 128; } - blk[0] = dc << 3; - idx = 1; - } - if !coded { return Ok(()); } - let scan = match acpred { - ACPredMode::Hor => H263_SCAN_V, - ACPredMode::Ver => H263_SCAN_H, - _ => H263_ZIGZAG, - }; - - let rl_cb = if sstate.is_iframe { &self.tables.aic_rl_cb } else { &self.tables.rl_cb }; - let q_add = if quant == 0 || sstate.is_iframe { 0i16 } else { ((quant - 1) | 1) as i16 }; - let q = if plane_no == 0 { (quant * 2) as i16 } else { H263_CHROMA_QUANT[quant as usize] as i16 }; - while idx < 64 { - let code = br.read_cb(rl_cb)?; - let run; - let mut level; - let last; - if !code.is_escape() { - run = code.get_run(); - level = code.get_level(); - last = code.is_last(); - if br.read_bool()? { level = -level; } - level = (level * q) + q_add; - } else { - last = br.read_bool()?; - run = br.read(6)? as u8; - level = br.read_s(8)? as i16; - if level == -128 { - let low = br.read(5)? as i16; - let top = br.read_s(6)? as i16; - level = (top << 5) | low; - } - level = (level * q) + q_add; - if level < -2048 { level = -2048; } - if level > 2047 { level = 2047; } - } - idx += run; - validate!(idx < 64); - let oidx = scan[idx as usize]; - blk[oidx] = level; - idx += 1; - if last { break; } - } - Ok(()) - } -} - -fn decode_mv_component(br: &mut BitReader, mv_cb: &Codebook<u8>) -> DecoderResult<i16> { - let code = br.read_cb(mv_cb)? as i16; - if code == 0 { return Ok(0) } - if !br.read_bool()? { - Ok(code) - } else { - Ok(-code) - } -} - -fn decode_mv(br: &mut BitReader, mv_cb: &Codebook<u8>) -> DecoderResult<MV> { - let xval = decode_mv_component(br, mv_cb)?; - let yval = decode_mv_component(br, mv_cb)?; - Ok(MV::new(xval, yval)) -} - -fn read_dquant(br: &mut BitReader, q: u8) -> DecoderResult<u8> { - if br.read_bool()? { - Ok(H263_MODIFIED_QUANT[br.read(1)? as usize][q as usize]) - } else { - Ok(br.read(5)? as u8) - } -} - -impl<'a> BlockDecoder for RealVideo20BR<'a> { - -#[allow(unused_variables)] - fn decode_pichdr(&mut self) -> DecoderResult<PicInfo> { - self.slice_no = 0; - let shdr = self.read_slice_header()?; -// self.slice_no += 1; - validate!((shdr.mb_x == 0) && (shdr.mb_y == 0)); -/* let mb_count; - if self.slice_no < self.num_slices { - let pos = self.br.tell(); - let shdr2 = self.read_slice_header()?; - self.br.seek(pos as u32)?; - mb_count = shdr2.mb_pos - shdr.mb_pos; - } else { - mb_count = self.mb_w * self.mb_h; - }*/ - - let plusinfo = Some(PlusInfo::new(shdr.ftype == Type::I, false, false, false)); - let picinfo = PicInfo::new(shdr.w, shdr.h, shdr.ftype, MVMode::Long, false, false, shdr.qscale, shdr.seq as u16, None, plusinfo); - Ok(picinfo) - } - - #[allow(unused_variables)] - fn decode_slice_header(&mut self, info: &PicInfo) -> DecoderResult<SliceInfo> { - let shdr = self.read_slice_header()?; - self.slice_no += 1; - let mb_count; - if self.slice_no < self.num_slices { - let pos = self.br.tell(); - let shdr2 = self.read_slice_header()?; - mb_count = shdr2.mb_pos - shdr.mb_pos; - self.br.seek(pos as u32)?; - } else { - mb_count = self.mb_w * self.mb_h - shdr.mb_pos; - } - let ret = SliceInfo::new(shdr.mb_x, shdr.mb_y, shdr.mb_pos + mb_count, shdr.qscale); - - Ok(ret) - } - - fn decode_block_header(&mut self, info: &PicInfo, _slice: &SliceInfo, sstate: &SliceState) -> DecoderResult<BlockInfo> { - let br = &mut self.br; - let mut q = sstate.quant; - match info.get_mode() { - Type::I => { - let mut cbpc = br.read_cb(&self.tables.intra_mcbpc_cb)?; - while cbpc == 8 { cbpc = br.read_cb(&self.tables.intra_mcbpc_cb)?; } - let mut acpred = ACPredMode::None; - if let Some(ref pi) = info.plusinfo { - if pi.aic { - let acpp = br.read_bool()?; - acpred = ACPredMode::DC; - if acpp { - acpred = if br.read_bool()? { ACPredMode::Hor } else { ACPredMode::Ver }; - } - } - } - let cbpy = br.read_cb(&self.tables.cbpy_cb)?; - let cbp = (cbpy << 2) | (cbpc & 3); - let dquant = (cbpc & 4) != 0; - if dquant { - q = read_dquant(br, q)?; - } - let mut binfo = BlockInfo::new(Type::I, cbp, q); - binfo.set_acpred(acpred); - Ok(binfo) - }, - Type::P => { - if br.read_bool()? { - return Ok(BlockInfo::new(Type::Skip, 0, info.get_quant())); - } - let mut cbpc = br.read_cb(&self.tables.inter_mcbpc_cb)?; - while cbpc == 20 { cbpc = br.read_cb(&self.tables.inter_mcbpc_cb)?; } - let is_intra = (cbpc & 0x04) != 0; - let dquant = (cbpc & 0x08) != 0; - let is_4x4 = (cbpc & 0x10) != 0; - if is_intra { - let cbpy = br.read_cb(&self.tables.cbpy_cb)?; - let cbp = (cbpy << 2) | (cbpc & 3); - if dquant { - q = read_dquant(br, q)?; - } - let binfo = BlockInfo::new(Type::I, cbp, q); - return Ok(binfo); - } - - let mut cbpy = br.read_cb(&self.tables.cbpy_cb)?; -// if /* !aiv && */(cbpc & 3) != 3 { - cbpy ^= 0xF; -// } - let cbp = (cbpy << 2) | (cbpc & 3); - if dquant { - q = read_dquant(br, q)?; - } - let mut binfo = BlockInfo::new(Type::P, cbp, q); - if !is_4x4 { - let mvec: [MV; 1] = [decode_mv(br, &self.tables.mv_cb)?]; - binfo.set_mv(&mvec); - } else { - let mvec: [MV; 4] = [ - decode_mv(br, &self.tables.mv_cb)?, - decode_mv(br, &self.tables.mv_cb)?, - decode_mv(br, &self.tables.mv_cb)?, - decode_mv(br, &self.tables.mv_cb)? - ]; - binfo.set_mv(&mvec); - } - Ok(binfo) - }, - Type::B => { // B - let mut mbtype = br.read_cb(&self.tables.mbtype_b_cb)? as usize; - while mbtype == 14 { mbtype = br.read_cb(&self.tables.mbtype_b_cb)? as usize; } - - let is_coded = (H263_MBTYPE_B_CAPS[mbtype] & H263_MBB_CAP_CODED) != 0; - let is_intra = (H263_MBTYPE_B_CAPS[mbtype] & H263_MBB_CAP_INTRA) != 0; - let dquant = (H263_MBTYPE_B_CAPS[mbtype] & H263_MBB_CAP_DQUANT) != 0; - let is_fwd = (H263_MBTYPE_B_CAPS[mbtype] & H263_MBB_CAP_FORWARD) != 0; - let is_bwd = (H263_MBTYPE_B_CAPS[mbtype] & H263_MBB_CAP_BACKWARD) != 0; - - let cbp = if is_coded { - let cbpc = br.read_cb(&self.tables.cbpc_b_cb)?; - let mut cbpy = br.read_cb(&self.tables.cbpy_cb)?; - if !is_intra { cbpy ^= 0xF; } - (cbpy << 2) | (cbpc & 3) - } else { 0 }; - - if dquant { - q = read_dquant(br, q)?; - } - - if is_intra { - let binfo = BlockInfo::new(Type::I, cbp, q); - return Ok(binfo); - } - - let mut binfo = BlockInfo::new(Type::B, cbp, q); - if is_fwd { - let mvec: [MV; 1] = [decode_mv(br, &self.tables.mv_cb)?]; - binfo.set_mv(&mvec); - } - if is_bwd { - let mvec: [MV; 1] = [decode_mv(br, &self.tables.mv_cb)?]; - binfo.set_b_mv(&mvec); - } - Ok(binfo) - }, - _ => { unreachable!(); }, - } - } - - fn decode_block_intra(&mut self, info: &BlockInfo, sstate: &SliceState, quant: u8, no: usize, coded: bool, blk: &mut [i16; 64]) -> DecoderResult<()> { - self.decode_block(sstate, quant, true, coded, blk, if no < 4 { 0 } else { no - 3 }, info.get_acpred()) - } - - #[allow(unused_variables)] - fn decode_block_inter(&mut self, info: &BlockInfo, sstate: &SliceState, quant: u8, no: usize, coded: bool, blk: &mut [i16; 64]) -> DecoderResult<()> { - self.decode_block(sstate, quant, false, coded, blk, if no < 4 { 0 } else { no - 3 }, ACPredMode::None) - } - - fn is_slice_end(&mut self) -> bool { false } -} - -impl<'a> RealVideo20BR<'a> { -#[allow(unused_variables)] - fn read_slice_header(&mut self) -> DecoderResult<RV20SliceInfo> { - validate!(self.slice_no < self.num_slices); - - let br = &mut self.br; - br.seek(self.slice_off[self.slice_no] * 8)?; - - let frm_type = br.read(2)?; - let ftype = match frm_type { - 0 | 1 => { Type::I }, - 2 => { Type::P }, - _ => { Type::B }, - }; - - let marker = br.read(1)?; - validate!(marker == 0); - let qscale = br.read(5)? as u8; - validate!(qscale > 0); - if self.minor_ver >= 2 { - br.skip(1)?; // loop filter - } - let seq = if self.minor_ver <= 1 { - br.read(8)? << 8 - } else { - br.read(13)? << 3 - }; - let w; - let h; - if self.rpr.present { - let rpr = br.read(self.rpr.bits)? as usize; - if rpr == 0 { - w = self.w; - h = self.h; - } else { - w = self.rpr.widths[rpr - 1]; - h = self.rpr.heights[rpr - 1]; - validate!((w != 0) && (h != 0)); - } - } else { - w = self.w; - h = self.h; - } - - let mb_pos = br.read(self.mb_pos_bits)? as usize; - let mb_x = mb_pos % self.mb_w; - let mb_y = mb_pos / self.mb_w; - - br.skip(1)?; // no rounding - - if (self.minor_ver <= 1) && (frm_type == 3) { - br.skip(5)?; - } - - Ok(RV20SliceInfo::new(ftype, seq, qscale, mb_x, mb_y, mb_pos, w, h)) - } -} - -impl RealVideo20Decoder { - fn new() -> Self { - let mut coderead = H263ShortCodeReader::new(H263_INTRA_MCBPC); - let intra_mcbpc_cb = Codebook::new(&mut coderead, CodebookMode::MSB).unwrap(); - let mut coderead = H263ShortCodeReader::new(H263_INTER_MCBPC); - let inter_mcbpc_cb = Codebook::new(&mut coderead, CodebookMode::MSB).unwrap(); - let mut coderead = H263ShortCodeReader::new(H263_MBTYPE_B); - let mbtype_b_cb = Codebook::new(&mut coderead, CodebookMode::MSB).unwrap(); - let mut coderead = H263ShortCodeReader::new(H263_CBPY); - let cbpy_cb = Codebook::new(&mut coderead, CodebookMode::MSB).unwrap(); - let mut coderead = H263ShortCodeReader::new(H263_CBPC_B); - let cbpc_b_cb = Codebook::new(&mut coderead, CodebookMode::MSB).unwrap(); - let mut coderead = H263RLCodeReader::new(H263_RL_CODES); - let rl_cb = Codebook::new(&mut coderead, CodebookMode::MSB).unwrap(); - let mut coderead = H263RLCodeReader::new(H263_RL_CODES_AIC); - let aic_rl_cb = Codebook::new(&mut coderead, CodebookMode::MSB).unwrap(); - let mut coderead = H263ShortCodeReader::new(H263_MV); - let mv_cb = Codebook::new(&mut coderead, CodebookMode::MSB).unwrap(); - - let tables = Tables { - intra_mcbpc_cb: intra_mcbpc_cb, - inter_mcbpc_cb: inter_mcbpc_cb, - mbtype_b_cb: mbtype_b_cb, - cbpy_cb: cbpy_cb, - cbpc_b_cb: cbpc_b_cb, - rl_cb: rl_cb, - aic_rl_cb: aic_rl_cb, - mv_cb: mv_cb, - }; - - RealVideo20Decoder{ - info: Rc::new(DUMMY_CODEC_INFO), - dec: H263BaseDecoder::new_b_frames(false), - tables: tables, - w: 0, - h: 0, - minor_ver: 0, - rpr: RPRInfo { present: false, bits: 0, widths: [0; 8], heights: [0; 8] }, - bdsp: H263BlockDSP::new(), - } - } -} - -impl NADecoder for RealVideo20Decoder { -#[allow(unused_variables)] - fn init(&mut self, info: Rc<NACodecInfo>) -> DecoderResult<()> { - if let NACodecTypeInfo::Video(vinfo) = info.get_properties() { - let w = vinfo.get_width(); - let h = vinfo.get_height(); - let fmt = formats::YUV420_FORMAT; - let myinfo = NACodecTypeInfo::Video(NAVideoInfo::new(w, h, false, fmt)); - self.info = Rc::new(NACodecInfo::new_ref(info.get_name(), myinfo, info.get_extradata())); - self.w = w; - self.h = h; - - let edata = info.get_extradata().unwrap(); - let src: &[u8] = &edata; - let ver = ((src[4] as u32) << 12) | ((src[5] as u32) << 4) | ((src[6] as u32) >> 4); - let maj_ver = ver >> 16; - let min_ver = (ver >> 8) & 0xFF; - let mic_ver = ver & 0xFF; - validate!(maj_ver == 2); - self.minor_ver = min_ver as u8; - let rprb = src[1] & 7; - if rprb == 0 { - self.rpr.present = false; - } else { - self.rpr.present = true; - self.rpr.bits = ((rprb >> 1) + 1) as u8; - for i in 4..(src.len()/2) { - self.rpr.widths [i - 4] = (src[i * 2] as usize) * 4; - self.rpr.heights[i - 4] = (src[i * 2 + 1] as usize) * 4; - } - } - Ok(()) - } else { - Err(DecoderError::InvalidData) - } - } - fn decode(&mut self, pkt: &NAPacket) -> DecoderResult<NAFrameRef> { - let src = pkt.get_buffer(); - - let mut ibr = RealVideo20BR::new(&src, &self.tables, self.w, self.h, self.minor_ver, self.rpr); - - let bufinfo = self.dec.parse_frame(&mut ibr, &self.bdsp)?; - - let mut frm = NAFrame::new_from_pkt(pkt, self.info.clone(), bufinfo); - frm.set_keyframe(self.dec.is_intra()); - frm.set_frame_type(self.dec.get_frame_type()); - Ok(Rc::new(RefCell::new(frm))) - } -} - -struct MBB { blocks: usize, bits: u8 } -const H263_MBB: &[MBB; 7] = &[ - MBB{ blocks: 47, bits: 6 }, - MBB{ blocks: 98, bits: 7 }, - MBB{ blocks: 395, bits: 9 }, - MBB{ blocks: 1583, bits: 11 }, - MBB{ blocks: 6335, bits: 13 }, - MBB{ blocks: 9215, bits: 14 }, - MBB{ blocks: 65536, bits: 14 }, -]; - -pub fn get_decoder() -> Box<NADecoder> { - Box::new(RealVideo20Decoder::new()) -} - -#[cfg(test)] -mod test { - use crate::test::dec_video::test_file_decoding; - #[test] - fn test_rv20() { - test_file_decoding("realmedia", "assets/RV/rv20_svt_atrc_640x352_realproducer_plus_8.51.rm", /*None*/Some(3000), true, false, None/*Some("rv20")*/); -// test_file_decoding("realmedia", "assets/RV/rv20_cook_640x352_realproducer_plus_8.51.rm", /*None*/Some(1000), true, false, Some("rv20")); - } -} diff --git a/src/codecs/indeo/imc.rs b/src/codecs/indeo/imc.rs deleted file mode 100644 index f11daa9..0000000 --- a/src/codecs/indeo/imc.rs +++ /dev/null @@ -1,1121 +0,0 @@ -use std::mem; -use std::ptr; -use std::f32::consts; - -use crate::formats::*; -use crate::frame::*; -use super::super::*; -use crate::io::bitreader::*; -use crate::io::codebook::*; -use crate::dsp::fft::*; -use crate::dsp::window::*; - -const BANDS: usize = 32; -const COEFFS: usize = 256; -const BLOCK_SIZE: usize = 64; - -struct IMDCTContext { - pretwiddle1: [f32; COEFFS/2], - pretwiddle2: [f32; COEFFS/2], - posttwiddle: [FFTComplex; COEFFS/2], - tmp: [FFTComplex; COEFFS/2], - fft: FFT, - window: [f32; COEFFS], -} - -struct IMCChannel { - old_floor: [f32; BANDS], - new_floor: [f32; BANDS], - log_floor: [f32; BANDS], - log_floor2: [f32; BANDS], - bit_est: [f32; BANDS], - mask_wght: [f32; BANDS], - adj_floor: [f32; BANDS], - cw: [f32; COEFFS], - last_im: [f32; COEFFS/2], -} - -struct BitAlloc { - band_width: [usize; BANDS], - band_present: [bool; BANDS], - band_skip: [bool; BANDS], - band_bits: [u8; BANDS], - cw_len: [u8; COEFFS], - band_bitsum: [usize; BANDS], - skip_flag: [bool; COEFFS], - skip_flag_bits: [u8; BANDS], - skips_per_band: [usize; BANDS], - keep_flag: [bool; BANDS], - coeff: [u8; COEFFS], -} - -impl IMCChannel { - fn new() -> Self { - IMCChannel { - old_floor: [0.0; BANDS], - new_floor: [0.0; BANDS], - log_floor: [0.0; BANDS], - log_floor2: [0.0; BANDS], - bit_est: [0.0; BANDS], - mask_wght: [0.0; BANDS], - adj_floor: [0.0; BANDS], - cw: [0.0; COEFFS], - last_im: [0.0; COEFFS/2], - } - } - fn reset(&mut self) { - for i in 0..self.old_floor.len() { self.old_floor[i] = 1.0; } - for i in 0..self.cw.len() { self.cw[i] = 0.0; } - } -} - -const BITALLOC_LIMIT: f32 = -1.0e20; -const BITALLOC_TOP_LIMIT: f32 = 1.0e20; -impl BitAlloc { - fn new() -> Self { - BitAlloc { - band_width: [0; BANDS], - band_present: [false; BANDS], - band_skip: [false; BANDS], - band_bits: [0; BANDS], - cw_len: [0; COEFFS], - band_bitsum: [0; BANDS], - skip_flag: [false; COEFFS], - skip_flag_bits: [0; BANDS], - skips_per_band: [0; BANDS], - keep_flag: [false; BANDS], - coeff: [0; COEFFS], - } - } - fn reset(&mut self) { - for i in 0..BANDS { - self.band_width[i] = 0; - self.band_present[i] = false; - self.band_skip[i] = false; - self.band_bits[i] = 0; - self.keep_flag[i] = false; - self.band_bitsum[i] = 0; - self.skips_per_band[i] = 0; - self.skip_flag_bits[i] = 0; - } - for i in 0..COEFFS { - self.cw_len[i] = 0; - self.skip_flag[i] = false; - } - } - fn calculate_bit_allocation(&mut self, ch_data: &mut IMCChannel, bits: usize, fixed_head: bool, adj_idx: usize) -> DecoderResult<()> { - - let mut peak = 0.0; - for coef in ch_data.new_floor.iter() { if *coef > peak { peak = *coef; } } - peak *= 0.25; - - for band in 0..BANDS-1 { - ch_data.bit_est[band] = ch_data.log_floor2[band] - ch_data.mask_wght[band].log2(); - } - ch_data.bit_est[BANDS - 1] = BITALLOC_LIMIT; - - for band in 0..BANDS { - let mut idx = 42; - let band_w = IMC_BANDS[band + 1] - IMC_BANDS[band]; - if band_w == self.band_width[band] { idx = 0; } - if band_w > self.band_width[band] { idx = 1; } - if band_w/2 >= self.band_width[band] { idx = 2; } - validate!(idx <= 2); - idx *= 2; - if ch_data.new_floor[band] < peak { idx += 1; } - ch_data.bit_est[band] += IMC_BITALLOC_ADJ[adj_idx][idx]; - } - - if fixed_head { - for i in 0..4 { - ch_data.bit_est[i] = BITALLOC_LIMIT; - } - } - - let start = if fixed_head { 4 } else { 0 }; - - let mut a_width = 0; - let mut pool = 0.0; - for band in start..BANDS-1 { - a_width += self.band_width[band]; - pool += (self.band_width[band] as f32) * ch_data.bit_est[band]; - } - validate!(a_width > 0); - - self.band_width[BANDS - 1] = 0; - pool = (pool * 0.5 - (bits as f32)) / (a_width as f32); - - let free_bits = bits as i32; - let mut cur_bits: i32 = 0; - let mut flag = 1; - let mut mmcount = 0; - for i in 0..BANDS/2 { - let diff = cur_bits - free_bits; - if diff.abs() <= 8 { break; } - - cur_bits = 0; - let mut acc = 0; - for band in start..BANDS { - let mut len = (ch_data.bit_est[band] * 0.5 - pool + 0.5) as i32; - if len < 0 { len = 0; } - if len > 6 { len = 6; } - self.band_bits[band] = len as u8; - cur_bits += (self.band_width[band] as i32) * (len as i32); - if len > 0 { - acc += self.band_width[band] as i32; - } - } - - let mut lflag = flag; - flag = 1; - if free_bits < cur_bits { flag = -1; } - if i == 0 { lflag = flag; } - if flag != lflag { - mmcount += 1; - } - pool += ((cur_bits - free_bits) as f32) / (((mmcount + 1) * acc) as f32); - } - - for band in start..BANDS { - for i in IMC_BANDS[band]..IMC_BANDS[band + 1] { - self.cw_len[i] = self.band_bits[band]; - } - } - - if free_bits > cur_bits { - let mut tmp: [f32; BANDS] = [BITALLOC_LIMIT; BANDS]; - for band in 0..BANDS { - if self.band_bits[band] != 6 { - tmp[band] = (self.band_bits[band] as f32) * -2.0 + ch_data.bit_est[band] - 0.415; - } - } - let mut peak = 0.0; - while (peak > BITALLOC_LIMIT) && (cur_bits < free_bits) { - peak = BITALLOC_LIMIT; - let mut idx: Option<usize> = None; - for band in 0..BANDS { - if tmp[band] > peak { - peak = tmp[band]; - idx = Some(band); - } - } - if let Some(band) = idx { - tmp[band] -= 2.0; - self.band_bits[band] += 1; - if self.band_bits[band] == 6 { - tmp[band] = BITALLOC_LIMIT; - } - for i in IMC_BANDS[band]..IMC_BANDS[band + 1] { - self.cw_len[i] += 1; - cur_bits += 1; - if cur_bits >= free_bits { - break; - } - } - } - } - } - - if cur_bits > free_bits { - let mut tmp: [f32; BANDS] = [BITALLOC_TOP_LIMIT; BANDS]; - for band in start..BANDS { - if self.band_bits[band] != 0 { - tmp[band] = (self.band_bits[band] as f32) * -2.0 + ch_data.bit_est[band] - 0.415 + 2.0; - } - } - while free_bits < cur_bits { - let mut low = BITALLOC_TOP_LIMIT; - let mut idx = 0; - for band in 0..BANDS { - if tmp[band] < low { - low = tmp[band]; - idx = band; - } - } - tmp[idx] += 2.0; - self.band_bits[idx] -= 1; - if self.band_bits[idx] == 0 { - tmp[idx] = BITALLOC_TOP_LIMIT; - } - for i in IMC_BANDS[idx]..IMC_BANDS[idx + 1] { - if self.cw_len[i] > 0 { - self.cw_len[i] -= 1; - cur_bits -= 1; - if cur_bits <= free_bits { - break; - } - } - } - } - } - - Ok(()) - } - - fn adjust_bit_allocation(&mut self, ch_data: &mut IMCChannel, free_bits: i32) { - let mut tmp: [f32; BANDS] = [BITALLOC_LIMIT; BANDS]; - for band in 0..BANDS { - if self.band_bits[band] != 6 { - tmp[band] = (self.band_bits[band] as f32) * -2.0 + ch_data.bit_est[band] - 0.415; - } - } - let mut used_bits: i32 = 0; - let mut peak = 0.0; - while (peak > BITALLOC_LIMIT) && (used_bits < free_bits) { - peak = BITALLOC_LIMIT; - let mut idx: Option<usize> = None; - for band in 0..BANDS { - if tmp[band] > peak { - peak = tmp[band]; - idx = Some(band); - } - } - if let Some(band) = idx { - tmp[band] -= 2.0; - self.band_bits[band] += 1; - if self.band_bits[band] == 6 { - tmp[band] = BITALLOC_LIMIT; - } - for i in IMC_BANDS[band]..IMC_BANDS[band + 1] { - if self.cw_len[i] >= 6 { continue; } - self.cw_len[i] += 1; - used_bits += 1; - if used_bits >= free_bits { - break; - } - } - } - } - } -} - -struct LUTs { - exp_lev: [f32; 16], - exp_10: [f32; 32], - sqrt_tab: [f32; 32], -} - -impl LUTs { - fn new() -> Self { - let mut exp_lev: [f32; 16] = [0.0; 16]; - for lev in 0..16 { - exp_lev[lev] = 10.0f32.powf(-(lev as f32) * 0.4375); - } - - let mut exp_10: [f32; 32] = [0.0; 32]; - for i in 0..32 { - exp_10[i] = 10.0f32.powf(((i as f32) - 16.0) * 0.25); - } - - let mut sqrt_tab: [f32; 32] = [0.0; 32]; - for i in 0..32 { - sqrt_tab[i] = (i as f32).sqrt(); - } - - LUTs { exp_lev: exp_lev, exp_10: exp_10, sqrt_tab: sqrt_tab } - } -} - -struct IMCDecoder { - is_imc: bool, - - chmap: NAChannelMap, - ainfo: NAAudioInfo, - info: Rc<NACodecInfo>, - - codes: [[Codebook<u8>; 4]; 4], - ch_data: [IMCChannel; 2], - ba: BitAlloc, - imdct: IMDCTContext, - - cycle1: [usize; BANDS], - cycle2: [usize; BANDS], - weights1: [f32; BANDS-1], - weights2: [f32; BANDS-1], - - luts: LUTs, -} - -fn freq2bark(freq: f32) -> f32 { - 3.5 * ((freq / 7500.0) * (freq / 7500.0)).atan() + 13.0 * (freq * 0.00076).atan() -} - -fn calc_maxcoef(coef: f32) -> (f32, f32) { - let c1 = 20000.0 / 10.0f32.powf(coef * 0.057031251); - (c1, c1.log2()) -} - -impl IMCDecoder { - fn new(is_imc: bool) -> Self { - let mut codes: [[Codebook<u8>; 4]; 4]; - let mut cycle1: [usize; BANDS] = [0; BANDS]; - let mut cycle2: [usize; BANDS] = [0; BANDS]; - let mut weights1: [f32; BANDS-1] = [0.0; BANDS-1]; - let mut weights2: [f32; BANDS-1] = [0.0; BANDS-1]; - if is_imc { - cycle1.copy_from_slice(&IMC_CYCLE1); - cycle2.copy_from_slice(&IMC_CYCLE2); - weights1.copy_from_slice(&IMC_WEIGHTS1); - weights2.copy_from_slice(&IMC_WEIGHTS2); - } - unsafe { - codes = mem::uninitialized(); - for i in 0..4 { - for j in 0..4 { - let mut cr = IMCCodeReader::new(i, j); - ptr::write(&mut codes[i][j], Codebook::new(&mut cr, CodebookMode::MSB).unwrap()); - } - } - } - IMCDecoder { - is_imc: is_imc, - chmap: NAChannelMap::new(), - ainfo: NAAudioInfo::new(0, 0, SND_F32P_FORMAT, 0), - info: NACodecInfo::new_dummy(), - - codes: codes, - ch_data: [IMCChannel::new(), IMCChannel::new()], - ba: BitAlloc::new(), - imdct: IMDCTContext::new(), - luts: LUTs::new(), - - cycle1: cycle1, - cycle2: cycle2, - weights1: weights1, - weights2: weights2, - } - } - - fn generate_iac_tables(&mut self, sample_rate: f32) { - let scale = sample_rate / 256.0 / 2.0 * 0.5; - let nyq_freq = sample_rate / 2.0; - let mut last_bark = 0.0; - let mut freq_max: [f32; BANDS] = [0.0; BANDS]; - let mut freq_mid: [f32; BANDS] = [0.0; BANDS]; - let mut freq_min: [f32; BANDS] = [0.0; BANDS]; - for band in 0..BANDS { - let freq = ((IMC_BANDS[band] + IMC_BANDS[band + 1] - 1) as f32) * scale; - let bark = freq2bark(freq); - if band > 0 { - let bark_diff = bark - last_bark; - self.weights1[band - 1] = 10.0f32.powf(-1.0 * bark_diff); - self.weights2[band - 1] = 10.0f32.powf(-2.7 * bark_diff); - } - last_bark = bark; - freq_mid[band] = freq; - - let mut tmp_freq = freq; - while tmp_freq < nyq_freq { - tmp_freq += 0.5; - if freq2bark(tmp_freq) > bark + 0.5 { break; } - } - freq_max[band] = tmp_freq; - - let mut tmp_freq = freq; - while tmp_freq > 0.0 { - tmp_freq -= 0.5; - if freq2bark(tmp_freq) < bark - 0.5 { break; } - } - freq_min[band] = tmp_freq; - } - - for band in 0..BANDS { - let mut s_band = BANDS - 1; - while s_band > 0 && freq_max[band] <= freq_mid[s_band] { s_band -= 1; } - self.cycle1[band] = s_band + 1; - } - - self.cycle2[0] = 0; - for band in 1..BANDS { - let mut s_band = 0; - while s_band < BANDS-1 && freq_min[band] >= freq_mid[s_band] { s_band += 1; } - self.cycle2[band] = s_band - 1; - } - } - - fn read_level_coeffs_raw(&mut self, br: &mut BitReader, ch: usize) -> DecoderResult<()> { - let ch_data = &mut self.ch_data[ch]; - let maxc_pos = br.read(5)? as usize; - let max_coef = br.read(7)? as u8; - - let (c1, c2) = calc_maxcoef(max_coef as f32); - for i in 0..BANDS { - if i != maxc_pos { - let level = br.read(4)?; - ch_data.new_floor[i] = c1 * self.luts.exp_lev[level as usize]; - ch_data.log_floor[i] = c2 - 1.4533435415 * (level as f32); - } else { - ch_data.new_floor[i] = c1; - ch_data.log_floor[i] = c2; - } - self.ba.band_width[i] = IMC_BANDS[i + 1] - IMC_BANDS[i]; - - ch_data.log_floor2[i] = ch_data.log_floor[i] * 2.0; - ch_data.mask_wght[i] = 1.0; - } - - Ok(()) - } - - fn calculate_channel_values(&mut self, ch: usize) { - let ch_data = &mut self.ch_data[ch]; - let mut tmp2: [f32; BANDS+1] = [0.0; BANDS+1]; - let mut tmp3: [f32; BANDS] = [0.0; BANDS]; - - for band in 0..BANDS { - ch_data.mask_wght[band] = 0.0; - let val; - if self.ba.band_width[band] > 0 { - val = (ch_data.new_floor[band] as f64).powi(2); - ch_data.log_floor2[band] = 2.0 * ch_data.log_floor[band]; - } else { - val = 0.0; - ch_data.log_floor2[band] = -30000.0; - } - let tmp = val * (self.ba.band_width[band] as f64) * 0.01; - if val <= 1.0e-30 { tmp3[band] = 0.0; } - else { tmp3[band] = tmp as f32; } - } - - for band in 0..BANDS { - let next_band = self.cycle1[band]; - for band2 in band..next_band { - ch_data.mask_wght[band2] += tmp3[band]; - } - tmp2[next_band] += tmp3[band]; - } - - let mut accum = 0.0; - for band in 1..BANDS { - accum = (tmp2[band] + accum) * self.weights1[band - 1]; - ch_data.mask_wght[band] += accum; - } - - let mut tmp2: [f32; BANDS] = [0.0; BANDS]; - tmp2[0] = tmp3[0]; - for band in 1..BANDS { - let prev_band = self.cycle2[band]; - for band2 in prev_band+1..band { - ch_data.mask_wght[band2] += tmp3[band]; - } - tmp2[prev_band + 1] += tmp3[band]; - } - - let mut accum = 0.0; - for i in 0..BANDS-1 { - let band = BANDS - 2 - i; - accum = (tmp2[band + 1] + accum) * self.weights2[band]; - ch_data.mask_wght[band] += accum; - } - } - - fn read_level_coeffs(&mut self, br: &mut BitReader, reset: bool, sel_idx: usize, ch: usize) -> DecoderResult<()> { - let mut level: [i8; BANDS] = [0; BANDS]; - let start; - if reset { - start = 1; - level[0] = br.read(7)? as i8; - } else { - start = 0; - } - for i in start..BANDS { - level[i] = br.read_cb(&self.codes[sel_idx][IMC_CB_SELECTOR[sel_idx][i]])? as i8; - if level[i] == 17 { - level[i] += br.read(4)? as i8; - } - self.ba.keep_flag[i] = level[i] == 16; - } - if reset { - let ch_data = &mut self.ch_data[ch]; - let (mut c1, mut c2) = calc_maxcoef(level[0] as f32); - ch_data.new_floor[0] = c1; - ch_data.log_floor[0] = c2; - for i in 1..BANDS { - if level[i] == 16 { - ch_data.new_floor[i] = 1.0; - ch_data.log_floor[i] = 0.0; - } else { - let lval; - if level[i] < 17 { - lval = level[i] - 7; - } else if level[i] < 25 { - lval = level[i] - 32; - } else { - lval = level[i] - 16; - } - c1 *= self.luts.exp_10[(lval + 16) as usize]; - c2 += 0.83048 * (lval as f32); - ch_data.new_floor[i] = c1; - ch_data.log_floor[i] = c2; - } - } - } else { - let ch_data = &mut self.ch_data[ch]; - for i in 0..BANDS { - if level[i] < 16 { - let lval = level[i] - 7; - ch_data.new_floor[i] = self.luts.exp_10[(lval + 16) as usize] * ch_data.old_floor[i]; - ch_data.log_floor[i] += (lval as f32) * 0.83048; - } else { - ch_data.new_floor[i] = ch_data.old_floor[i]; - } - } - } - - self.ba.band_width[0] = IMC_BANDS[1] - IMC_BANDS[0]; - for i in 1..BANDS { - if level[i] != 16 { - self.ba.band_width[i] = IMC_BANDS[i + 1] - IMC_BANDS[i]; - } else { - self.ba.band_width[i] = 0; - } - } - - for i in 0..BANDS-1 { - if self.ba.band_width[i] > 0 { - self.ba.band_present[i] = br.read_bool()?; - } - } - self.calculate_channel_values(ch); - - Ok(()) - } - - fn read_skip_flags(&mut self, br: &mut BitReader) -> DecoderResult<()> { - let ba = &mut self.ba; - for band in 0..BANDS { - if !ba.band_present[band] || ba.band_width[band] == 0 { continue; } - - if !ba.band_skip[band] { - ba.skip_flag_bits[band] = (IMC_BANDS[band + 1] - IMC_BANDS[band]) as u8; - for i in IMC_BANDS[band]..IMC_BANDS[band + 1] { - ba.skip_flag[i] = br.read_bool()?; - if ba.skip_flag[i] { - ba.skips_per_band[band] += 1; - } - } - } else { - let mut i = IMC_BANDS[band]; - while i < IMC_BANDS[band + 1] - 1 { - if !br.read_bool()? { - ba.skip_flag_bits[band] += 1; - ba.skip_flag[i] = true; - ba.skip_flag[i + 1] = true; - ba.skips_per_band[band] += 2; - } else { - if br.read_bool()? { - ba.skip_flag_bits[band] += 2; - ba.skip_flag[i] = false; - ba.skip_flag[i + 1] = true; - ba.skips_per_band[band] += 1; - } else { - ba.skip_flag_bits[band] += 3; - if !br.read_bool()? { - ba.skip_flag[i] = true; - ba.skips_per_band[band] += 1; - } else { - ba.skip_flag[i] = false; - } - ba.skip_flag[i + 1] = false; - } - } - i += 2; - } - if i != IMC_BANDS[band + 1] { - ba.skip_flag_bits[band] += 1; - ba.skip_flag[i] = br.read_bool()?; - if ba.skip_flag[i] { - ba.skips_per_band[band] += 1; - } - } - } - } - Ok(()) - } - - fn read_bitalloc_delta(&mut self, br: &mut BitReader, ch: usize) -> DecoderResult<()> { - for band in 0..BANDS { - self.ba.band_bitsum[band] = 0; - self.ba.band_skip[band] = false; - for i in IMC_BANDS[band]..IMC_BANDS[band + 1] { - self.ba.band_bitsum[band] += self.ba.cw_len[i] as usize; - } - if self.ba.band_present[band] { - let band_w = IMC_BANDS[band + 1] - IMC_BANDS[band]; - let bitsum = self.ba.band_bitsum[band] as usize; - if (bitsum > 0) && (((band_w * 3) >> 1) > bitsum) { - self.ba.band_skip[band] = true; - } - } - } - - self.read_skip_flags(br)?; - - let mut ch_data = &mut self.ch_data[ch]; - for band in 0..BANDS { - ch_data.adj_floor[band] = ch_data.new_floor[band]; - let band_w = IMC_BANDS[band + 1] - IMC_BANDS[band]; - let nonskip = band_w - self.ba.skips_per_band[band]; - if self.ba.band_present[band] && nonskip > 0 { - ch_data.adj_floor[band] *= self.luts.sqrt_tab[band_w] / self.luts.sqrt_tab[nonskip]; - } - } - - let mut bits_freed: i32 = 0; - for band in 0..BANDS { - if !self.ba.band_present[band] { continue; } - for i in IMC_BANDS[band]..IMC_BANDS[band + 1] { - if self.ba.skip_flag[i] { - bits_freed += self.ba.cw_len[i] as i32; - self.ba.cw_len[i] = 0; - } - } - bits_freed -= self.ba.skip_flag_bits[band] as i32; - } - - if bits_freed < 0 { return Err(DecoderError::Bug); } - self.ba.adjust_bit_allocation(&mut ch_data, bits_freed); - - Ok(()) - } - - fn read_coeffs(&mut self, br: &mut BitReader) -> DecoderResult<()> { - for band in 0..BANDS { - if self.ba.band_bitsum[band] == 0 { continue; } - if !self.ba.band_present[band] && (self.ba.band_width[band] == 0) { continue; } - for i in IMC_BANDS[band]..IMC_BANDS[band + 1] { - let len = self.ba.cw_len[i]; - if len > 0 && (!self.ba.band_present[band] || !self.ba.skip_flag[i]) { - self.ba.coeff[i] = br.read(len)? as u8; - } else { - self.ba.coeff[i] = 0; - } - } - } - Ok(()) - } - - fn inv_quant(&mut self, ch: usize, raw_coeffs: bool) { - let qidx: usize = if raw_coeffs { 1 } else { 0 }; - let ch_data = &mut self.ch_data[ch]; - for band in 0..BANDS { - for i in IMC_BANDS[band]..IMC_BANDS[band + 1] { - ch_data.cw[i] = 0.0; - let cw_len = self.ba.cw_len[i]; - if cw_len == 0 || self.ba.skip_flag[i] { continue; } - - let val = self.ba.coeff[i] as usize; - let mid = 1 << (cw_len - 1); - let max = (1 << cw_len) - 1; - if cw_len >= 4 { - let quant = &IMC_QUANT_LARGE[qidx]; - if val >= mid { - ch_data.cw[i] = quant[val - 8] * ch_data.adj_floor[band]; - } else { - ch_data.cw[i] = -quant[max - val - 8] * ch_data.adj_floor[band]; - } - } else { - let idx = qidx + (if self.ba.band_present[band] { 2 } else { 0 }); - let quant = &IMC_QUANT_SMALL[idx]; - if val >= mid { - ch_data.cw[i] = quant[val - 1] * ch_data.adj_floor[band]; - } else { - ch_data.cw[i] = -quant[max - val - 1] * ch_data.adj_floor[band]; - } - } - } - } - } - - fn decode_block(&mut self, data: &[u8], ch: usize, dst: &mut [f32]) -> DecoderResult<()> { - let mut br = BitReader::new(&data[BLOCK_SIZE*ch..], BLOCK_SIZE, BitReaderMode::LE16MSB); - let hdr = br.read(9)?; - validate!((hdr & 0x18) == 0); - - let reset = br.read_bool()?; - let fixed_head = br.read_bool()?; - let raw_coeffs = br.read_bool()?; - let weight_idx = br.read(1)? as usize; - - if reset { - self.ch_data[ch].reset(); - } - - self.ba.reset(); - - if raw_coeffs { - self.read_level_coeffs_raw(&mut br, ch)?; - } else { - let cb_idx = (if reset { 2 } else { 0 }) + (if fixed_head { 1 } else { 0 }); - self.read_level_coeffs(&mut br, reset, cb_idx, ch)?; - } - - self.ch_data[ch].old_floor.copy_from_slice(&self.ch_data[ch].new_floor); - - let mut bitcount: usize = 0; - if fixed_head { - bitcount += 15; - self.ba.band_bits[0] = 5; - for i in 0..3 { - self.ba.cw_len[i] = 5; - } - for band in 1..4 { - let bits: u8; - if raw_coeffs || !self.ba.keep_flag[band]{ - bits = 5; - } else { - bits = 0; - } - self.ba.band_bits[band] = bits; - for i in IMC_BANDS[band]..IMC_BANDS[band + 1] { - self.ba.cw_len[i] = bits; - bitcount += bits as usize; - } - } - } - - if !self.is_imc { - if self.ba.band_width[BANDS - 1] != 0 { - bitcount += 1; - } - bitcount += 16; - } else { - if self.ba.band_width[BANDS - 1] != 0 { - bitcount += 1; - } - } - - validate!(br.tell() + bitcount < BLOCK_SIZE * 8); - self.ba.calculate_bit_allocation(&mut self.ch_data[ch], 512 - bitcount - br.tell(), fixed_head, weight_idx)?; - - if !raw_coeffs { - self.read_bitalloc_delta(&mut br, ch)?; - } - - for band in 0..BANDS { - self.ba.band_bitsum[band] = 0; - for i in IMC_BANDS[band]..IMC_BANDS[band + 1] { - if !self.ba.skip_flag[i] { - self.ba.band_bitsum[band] += self.ba.cw_len[i] as usize; - } - } - } - - self.read_coeffs(&mut br)?; - self.inv_quant(ch, raw_coeffs); - self.imdct.imdct(&self.ch_data[ch].cw, dst, &mut self.ch_data[ch].last_im); - - Ok(()) - } -} - -impl IMDCTContext { - fn new() -> Self { - let mut window: [f32; COEFFS] = [0.0; COEFFS]; - generate_window(WindowType::Sine, 1.0, COEFFS, true, &mut window); - let mut pretwiddle1: [f32; COEFFS/2] = [0.0; COEFFS/2]; - let mut pretwiddle2: [f32; COEFFS/2] = [0.0; COEFFS/2]; - let mut posttwiddle: [FFTComplex; COEFFS/2] = [FFTC_ZERO; COEFFS/2]; - for i in 0..COEFFS/2 { - let n = i as f32; - let base = (n * 4.0 + 1.0) / 1024.0 * consts::PI; - let r1 = base.sin(); - let r2 = base.cos(); - if (i & 1) == 0 { - pretwiddle1[i] = -(r1 + r2) * consts::SQRT_2; - pretwiddle2[i] = (r1 - r2) * consts::SQRT_2; - } else { - pretwiddle1[i] = (r1 + r2) * consts::SQRT_2; - pretwiddle2[i] = -(r1 - r2) * consts::SQRT_2; - } - posttwiddle[i] = FFTComplex::exp(consts::PI / 256.0 * n).scale(1.0/32768.0); - } - IMDCTContext { - pretwiddle1: pretwiddle1, - pretwiddle2: pretwiddle2, - posttwiddle: posttwiddle, - tmp: [FFTC_ZERO; COEFFS/2], - fft: FFTBuilder::new_fft(FFTMode::SplitRadix, COEFFS/2), - window: window, - } - } - fn imdct(&mut self, coeffs: &[f32; COEFFS], dst: &mut [f32], last_im: &mut [f32; COEFFS/2]) { - for i in 0..COEFFS/2 { - let in2 = coeffs[i * 2]; - let in1 = coeffs[COEFFS - 1 - i * 2]; - let c2 = self.pretwiddle1[i]; - let c1 = self.pretwiddle2[i]; - self.tmp[i].re = -(c2 * in1 + c1 * in2); - self.tmp[i].im = c1 * in1 - c2 * in2; - } - self.fft.do_fft_inplace(&mut self.tmp, false); - for i in 0..COEFFS/2 { - let tmp = !(self.tmp[i] * self.posttwiddle[i]); - let c1 = self.window[i * 2]; - let c2 = self.window[COEFFS - 1 - i * 2]; - let im = last_im[i]; - dst[i * 2] = c2 * im + c1 * tmp.re; - dst[COEFFS - 1 - i * 2] = c1 * im - c2 * tmp.re; - last_im[i] = tmp.im; - } - } -} - -const CHMAP_MONO: [NAChannelType; 1] = [NAChannelType::C]; -const CHMAP_STEREO: [NAChannelType; 2] = [NAChannelType::L, NAChannelType::R]; - -impl NADecoder for IMCDecoder { - fn init(&mut self, info: Rc<NACodecInfo>) -> DecoderResult<()> { - if let NACodecTypeInfo::Audio(ainfo) = info.get_properties() { - self.chmap = NAChannelMap::new(); - match ainfo.get_channels() { - 1 => { self.chmap.add_channels(&CHMAP_MONO); }, - 2 => { self.chmap.add_channels(&CHMAP_STEREO); }, - _ => { return Err(DecoderError::InvalidData); }, - }; - self.ainfo = NAAudioInfo::new(ainfo.get_sample_rate(), - ainfo.get_channels(), - SND_F32P_FORMAT, 0); - self.info = info.replace_info(NACodecTypeInfo::Audio(self.ainfo.clone())); - - if !self.is_imc { - self.generate_iac_tables(ainfo.get_sample_rate() as f32); - } - Ok(()) - } else { - Err(DecoderError::InvalidData) - } - } - fn decode(&mut self, pkt: &NAPacket) -> DecoderResult<NAFrameRef> { - let info = pkt.get_stream().get_info(); - validate!(info.get_properties().is_audio()); - let pktbuf = pkt.get_buffer(); - - let nblocks = pktbuf.len() / BLOCK_SIZE / (self.ainfo.get_channels() as usize); - let duration = COEFFS * nblocks; - - let mut abuf = alloc_audio_buffer(self.ainfo, duration, self.chmap.clone())?; - let mut adata = abuf.get_abuf_f32().unwrap(); - let mut dst = adata.get_data_mut(); - - let mut start: usize = 0; - let channels = self.ainfo.get_channels() as usize; - for chunk in pktbuf.chunks(BLOCK_SIZE * channels) { - for ch in 0..channels { - let off = abuf.get_offset(ch as usize) + start; - self.decode_block(chunk, ch as usize, &mut dst[off..off+COEFFS])?; - } - if (channels == 2) && ((chunk[1] & 0x20) != 0) { - let off1 = abuf.get_offset(0) + start; - let off2 = abuf.get_offset(1) + start; - for i in 0..COEFFS { - let l = dst[off1 + i]; - let r = dst[off2 + i]; - dst[off1 + i] = l + r; - dst[off2 + i] = l - r; - } - } - start += COEFFS; - } - - let mut frm = NAFrame::new_from_pkt(pkt, self.info.clone(), abuf); - frm.set_keyframe(true); - Ok(Rc::new(RefCell::new(frm))) - } -} - -pub fn get_decoder_imc() -> Box<NADecoder> { - Box::new(IMCDecoder::new(true)) -} - -pub fn get_decoder_iac() -> Box<NADecoder> { - Box::new(IMCDecoder::new(false)) -} - -struct IMCCodeReader { sel1: usize, sel2: usize } - -impl IMCCodeReader { - fn new(sel1: usize, sel2: usize) -> Self { IMCCodeReader { sel1: sel1, sel2: sel2 } } -} - -impl CodebookDescReader<u8> for IMCCodeReader { - fn bits(&mut self, idx: usize) -> u8 { IMC_CODE_LENGTHS[self.sel1][self.sel2][idx] } - fn code(&mut self, idx: usize) -> u32 { IMC_CODE_CODES[self.sel1][self.sel2][idx] as u32 } - fn sym (&mut self, idx: usize) -> u8 { idx as u8 } - fn len(&mut self) -> usize { IMC_CODE_LENGTHS[0][0].len() } -} - -static IMC_BANDS: [usize; 33] = [ - 0, 3, 6, 9, 12, 16, 20, 24, 29, 34, 40, 46, 53, 60, 68, 76, - 84, 93, 102, 111, 121, 131, 141, 151, 162, 173, 184, 195, 207, 219, 231, 243, - 256, -]; - -const IMC_QUANT_SMALL: &[[f32; 8]; 4] = &[ - [ 8.4431201e-1, 4.7358301e-1, 1.448354, 2.7073899e-1, - 7.4449003e-1, 1.241991, 1.845484, 0.0 ], - [ 8.6876702e-1, 4.7659001e-1, 1.478224, 2.5672799e-1, - 7.55777e-1, 1.3229851, 2.03438, 0.0 ], - [ 7.5891501e-1, 6.2272799e-1, 1.271322, 3.47904e-1, - 7.5317699e-1, 1.150767, 1.628476, 0.0 ], - [ 7.65257e-1, 6.44647e-1, 1.263824, 3.4548101e-1, - 7.6384902e-1, 1.214466, 1.7638789, 0.0 ] -]; - -const IMC_QUANT_LARGE: &[[f32; 56]; 2] = &[ - [ 1.39236e-1, 3.50548e-1, 5.9547901e-1, 8.5772401e-1, - 1.121545, 1.3882281, 1.695882, 2.1270809, - 7.2221003e-2, 1.85177e-1, 2.9521701e-1, 4.12568e-1, - 5.4068601e-1, 6.7679501e-1, 8.1196898e-1, 9.4765198e-1, - 1.0779999, 1.203415, 1.337265, 1.481871, - 1.639982, 1.814766, 2.0701399, 2.449862, - 3.7533998e-2, 1.02722e-1, 1.6021401e-1, 2.16043e-1, - 2.7231601e-1, 3.3025399e-1, 3.9022601e-1, 4.52849e-1, - 5.1794899e-1, 5.8529502e-1, 6.53956e-1, 7.2312802e-1, - 7.9150802e-1, 8.5891002e-1, 9.28141e-1, 9.9706203e-1, - 1.062153, 1.12564, 1.189834, 1.256122, - 1.324469, 1.3955311, 1.468906, 1.545084, - 1.6264729, 1.711524, 1.802705, 1.91023, - 2.0533991, 2.22333, 2.4830019, 3.253329 ], - [ 1.11654e-1, 3.54469e-1, 6.4232099e-1, 9.6128798e-1, - 1.295053, 1.61777, 1.989839, 2.51107, - 5.7721999e-2, 1.69879e-1, 2.97589e-1, 4.3858799e-1, - 5.9039903e-1, 7.4934798e-1, 9.1628098e-1, 1.087297, - 1.262751, 1.4288321, 1.6040879, 1.79067, - 2.000668, 2.2394669, 2.649332, 5.2760072, - 2.9722e-2, 8.7316997e-2, 1.4445201e-1, 2.04247e-1, - 2.6879501e-1, 3.3716801e-1, 4.08811e-1, 4.8306999e-1, - 5.6049401e-1, 6.3955498e-1, 7.2044599e-1, 8.0427998e-1, - 8.8933599e-1, 9.7537601e-1, 1.062461, 1.1510431, - 1.240236, 1.326715, 1.412513, 1.500502, - 1.591749, 1.686413, 1.785239, 1.891233, - 2.0051291, 2.127681, 2.2709141, 2.475826, - 2.7219379, 3.101985, 4.686213, 6.2287788 ] -]; - -static IMC_CYCLE1: [usize; BANDS] = [ - 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, - 17, 18, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 32, -]; - -static IMC_CYCLE2: [usize; BANDS] = [ - 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, - 15, 16, 17, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29 -]; - -static IMC_WEIGHTS1: [f32; BANDS-1] = [ - 0.119595, 0.123124, 0.129192, 9.97377e-2, - 8.1923e-2, 9.61153e-2, 8.77885e-2, 8.61174e-2, - 9.00882e-2, 9.91658e-2, 0.112991, 0.131126, - 0.152886, 0.177292, 0.221782, 0.244917, - 0.267386, 0.306816, 0.323046, 0.33729, - 0.366773, 0.392557, 0.398076, 0.403302, - 0.42451, 0.444777, 0.449188, 0.455445, - 0.477853, 0.500669, 0.510395 -]; - -static IMC_WEIGHTS2: [f32; BANDS-1] = [ - 3.23466e-3, 3.49886e-3, 3.98413e-3, 1.98116e-3, - 1.16465e-3, 1.79283e-3, 1.40372e-3, 1.33274e-3, - 1.50523e-3, 1.95064e-3, 2.77472e-3, 4.14725e-3, - 6.2776e-3, 9.36401e-3, 1.71397e-2, 2.24052e-2, - 2.83971e-2, 4.11689e-2, 4.73165e-2, 5.31631e-2, - 6.66614e-2, 8.00824e-2, 8.31588e-2, 8.61397e-2, - 9.89229e-2, 0.112197, 0.115227, 0.119613, - 0.136174, 0.15445, 0.162685 -]; - -static IMC_BITALLOC_ADJ: [[f32; 7]; 2] = [ - [ 7.6, 4.4, 6.1, 2.3, 6.2, 1.8, 0.0 ], - [ 3.6, 3.7, 5.1, 1.6, 1.5, 1.2, 0.0 ] -]; - -static IMC_CODE_LENGTHS: &[[[u8; 18]; 4]; 4] = &[ - [ - [ 16, 15, 13, 11, 8, 5, 3, 1, 2, 4, 6, 9, 10, 12, 14, 16, 7, 0 ], - [ 10, 8, 7, 6, 4, 4, 3, 2, 2, 3, 4, 6, 7, 9, 11, 11, 7, 0 ], - [ 15, 15, 14, 11, 8, 6, 4, 2, 1, 4, 5, 7, 9, 10, 12, 13, 4, 0 ], - [ 13, 11, 10, 8, 6, 4, 2, 2, 2, 3, 5, 7, 9, 12, 15, 15, 14, 0 ], - ], [ - [ 14, 12, 10, 8, 7, 4, 2, 2, 2, 3, 5, 7, 9, 11, 13, 14, 7, 0 ], - [ 14, 13, 11, 8, 6, 4, 3, 2, 2, 3, 5, 7, 9, 10, 12, 14, 3, 0 ], - [ 13, 12, 10, 7, 5, 4, 3, 2, 2, 3, 4, 6, 8, 9, 11, 13, 4, 0 ], - [ 13, 12, 10, 7, 5, 4, 3, 2, 2, 3, 4, 6, 8, 9, 11, 13, 4, 0 ], - ], [ - [ 16, 14, 12, 10, 8, 5, 3, 1, 2, 4, 7, 9, 11, 13, 15, 17, 6, 17 ], - [ 15, 13, 11, 8, 6, 4, 2, 2, 2, 3, 5, 7, 10, 12, 14, 16, 9, 16 ], - [ 14, 12, 11, 9, 8, 6, 3, 1, 2, 5, 7, 10, 13, 15, 16, 17, 4, 17 ], - [ 16, 14, 12, 9, 7, 5, 2, 2, 2, 3, 4, 6, 8, 11, 13, 15, 10, 16 ], - ], [ - [ 13, 11, 10, 8, 7, 5, 2, 2, 2, 4, 6, 9, 12, 14, 15, 16, 3, 16 ], - [ 11, 11, 10, 9, 8, 7, 5, 4, 3, 3, 3, 3, 3, 3, 4, 5, 6, 5 ], - [ 9, 9, 7, 6, 5, 4, 3, 3, 2, 3, 4, 5, 4, 5, 5, 6, 8, 6 ], - [ 13, 12, 10, 8, 5, 3, 3, 2, 2, 3, 4, 7, 9, 11, 14, 15, 6, 15 ] - ] -]; - -static IMC_CODE_CODES: &[[[u16; 18]; 4]; 4] = &[ - [ - [ 0xCC32, 0x6618, 0x1987, 0x0660, 0x00CD, 0x0018, 0x0007, 0x0000, 0x0002, - 0x000D, 0x0032, 0x0199, 0x0331, 0x0CC2, 0x330D, 0xCC33, 0x0067, 0x0000 ], - [ 0x02FE, 0x00BE, 0x005E, 0x002D, 0x000A, 0x0009, 0x0003, 0x0003, 0x0000, - 0x0002, 0x0008, 0x002C, 0x005D, 0x017E, 0x05FE, 0x05FF, 0x005C, 0x0000 ], - [ 0x5169, 0x5168, 0x28B5, 0x0517, 0x00A3, 0x0029, 0x0008, 0x0003, 0x0000, - 0x0009, 0x0015, 0x0050, 0x0144, 0x028A, 0x0A2C, 0x145B, 0x000B, 0x0000 ], - [ 0x1231, 0x048D, 0x0247, 0x0090, 0x0025, 0x0008, 0x0001, 0x0003, 0x0000, - 0x0005, 0x0013, 0x0049, 0x0122, 0x0919, 0x48C3, 0x48C2, 0x2460, 0x0000 ] - ], [ - [ 0x2D1D, 0x0B46, 0x02D0, 0x00B5, 0x0059, 0x000A, 0x0003, 0x0001, 0x0000, - 0x0004, 0x0017, 0x005B, 0x0169, 0x05A2, 0x168F, 0x2D1C, 0x0058, 0x0000 ], - [ 0x1800, 0x0C01, 0x0301, 0x0061, 0x0019, 0x0007, 0x0004, 0x0003, 0x0000, - 0x0005, 0x000D, 0x0031, 0x00C1, 0x0181, 0x0601, 0x1801, 0x0002, 0x0000 ], - [ 0x1556, 0x0AAA, 0x02AB, 0x0054, 0x0014, 0x000B, 0x0002, 0x0003, 0x0000, - 0x0003, 0x0008, 0x002B, 0x00AB, 0x0154, 0x0554, 0x1557, 0x0009, 0x0000 ], - [ 0x1556, 0x0AAA, 0x02AB, 0x0054, 0x0014, 0x000B, 0x0002, 0x0003, 0x0000, - 0x0003, 0x0008, 0x002B, 0x00AB, 0x0154, 0x0554, 0x1557, 0x0009, 0x0000 ] - ], [ - [ 0x2993, 0x0A65, 0x0298, 0x00A7, 0x0028, 0x0004, 0x0000, 0x0001, 0x0001, - 0x0003, 0x0015, 0x0052, 0x014D, 0x0533, 0x14C8, 0x5324, 0x000B, 0x5325 ], - [ 0x09B8, 0x026F, 0x009A, 0x0012, 0x0005, 0x0000, 0x0001, 0x0002, 0x0003, - 0x0001, 0x0003, 0x0008, 0x004C, 0x0136, 0x04DD, 0x1373, 0x0027, 0x1372 ], - [ 0x0787, 0x01E0, 0x00F1, 0x003D, 0x001F, 0x0006, 0x0001, 0x0001, 0x0001, - 0x0002, 0x000E, 0x0079, 0x03C2, 0x0F0D, 0x1E19, 0x3C30, 0x0000, 0x3C31 ], - [ 0x4B06, 0x12C0, 0x04B1, 0x0097, 0x0024, 0x0008, 0x0002, 0x0003, 0x0000, - 0x0003, 0x0005, 0x0013, 0x004A, 0x0259, 0x0961, 0x2582, 0x012D, 0x4B07 ] - ], [ - [ 0x0A5A, 0x0297, 0x014A, 0x0053, 0x0028, 0x000B, 0x0003, 0x0000, 0x0002, - 0x0004, 0x0015, 0x00A4, 0x052C, 0x14B7, 0x296C, 0x52DB, 0x0003, 0x52DA ], - [ 0x0193, 0x0192, 0x00C8, 0x0065, 0x0033, 0x0018, 0x0007, 0x0004, 0x0000, - 0x0004, 0x0005, 0x0007, 0x0006, 0x0003, 0x0005, 0x0005, 0x000D, 0x0004 ], - [ 0x0012, 0x0013, 0x0005, 0x0003, 0x0000, 0x0003, 0x0005, 0x0004, 0x0003, - 0x0003, 0x0005, 0x0005, 0x0004, 0x0004, 0x0003, 0x0005, 0x0008, 0x0004 ], - [ 0x0D66, 0x06B2, 0x01AD, 0x006A, 0x000C, 0x0005, 0x0004, 0x0000, 0x0003, - 0x0002, 0x0007, 0x0034, 0x00D7, 0x0358, 0x1ACF, 0x359C, 0x001B, 0x359D ] - ] -]; - -const IMC_CB_SELECTOR: [[usize; BANDS]; 4] = [ - [ 1, 1, 1, 1, 1, 1, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2 ], - [ 0, 2, 0, 3, 2, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 ], - [ 1, 1, 1, 1, 1, 1, 1, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2 ], - [ 0, 1, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ] -]; - -#[cfg(test)] -mod test { - use crate::test::dec_video::*; - #[test] - fn test_imc() { -// let file = "assets/neal73_saber.avi"; -// let file = "assets/IMC/hvalen.avi"; - let file = "assets/IMC/8khz.avi"; -// let file = "assets/STsKlassFist-1a.avi"; -// let file = "assets/IMC/Angel Bday.avi"; - test_decode_audio("avi", file, None, "imc"); - //test_file_decoding("avi", file, None, false, true, None); - } -} diff --git a/src/codecs/indeo/indeo2.rs b/src/codecs/indeo/indeo2.rs deleted file mode 100644 index 61f1c77..0000000 --- a/src/codecs/indeo/indeo2.rs +++ /dev/null @@ -1,375 +0,0 @@ -use crate::io::bitreader::*; -use crate::io::codebook::*; -use crate::formats; -use super::super::*; - -static INDEO2_DELTA_TABLE: [[u8; 256]; 4] = [ - [ - 0x80, 0x80, 0x84, 0x84, 0x7C, 0x7C, 0x7F, 0x85, - 0x81, 0x7B, 0x85, 0x7F, 0x7B, 0x81, 0x8C, 0x8C, - 0x74, 0x74, 0x83, 0x8D, 0x7D, 0x73, 0x8D, 0x83, - 0x73, 0x7D, 0x77, 0x89, 0x89, 0x77, 0x89, 0x77, - 0x77, 0x89, 0x8C, 0x95, 0x74, 0x6B, 0x95, 0x8C, - 0x6B, 0x74, 0x7C, 0x90, 0x84, 0x70, 0x90, 0x7C, - 0x70, 0x84, 0x96, 0x96, 0x6A, 0x6A, 0x82, 0x98, - 0x7E, 0x68, 0x98, 0x82, 0x68, 0x7E, 0x97, 0xA2, - 0x69, 0x5E, 0xA2, 0x97, 0x5E, 0x69, 0xA2, 0xA2, - 0x5E, 0x5E, 0x8B, 0xA3, 0x75, 0x5D, 0xA3, 0x8B, - 0x5D, 0x75, 0x71, 0x95, 0x8F, 0x6B, 0x95, 0x71, - 0x6B, 0x8F, 0x78, 0x9D, 0x88, 0x63, 0x9D, 0x78, - 0x63, 0x88, 0x7F, 0xA7, 0x81, 0x59, 0xA7, 0x7F, - 0x59, 0x81, 0xA4, 0xB1, 0x5C, 0x4F, 0xB1, 0xA4, - 0x4F, 0x5C, 0x96, 0xB1, 0x6A, 0x4F, 0xB1, 0x96, - 0x4F, 0x6A, 0xB2, 0xB2, 0x4E, 0x4E, 0x65, 0x9B, - 0x9B, 0x65, 0x9B, 0x65, 0x65, 0x9B, 0x89, 0xB4, - 0x77, 0x4C, 0xB4, 0x89, 0x4C, 0x77, 0x6A, 0xA3, - 0x96, 0x5D, 0xA3, 0x6A, 0x5D, 0x96, 0x73, 0xAC, - 0x8D, 0x54, 0xAC, 0x73, 0x54, 0x8D, 0xB4, 0xC3, - 0x4C, 0x3D, 0xC3, 0xB4, 0x3D, 0x4C, 0xA4, 0xC3, - 0x5C, 0x3D, 0xC3, 0xA4, 0x3D, 0x5C, 0xC4, 0xC4, - 0x3C, 0x3C, 0x96, 0xC6, 0x6A, 0x3A, 0xC6, 0x96, - 0x3A, 0x6A, 0x7C, 0xBA, 0x84, 0x46, 0xBA, 0x7C, - 0x46, 0x84, 0x5B, 0xAB, 0xA5, 0x55, 0xAB, 0x5B, - 0x55, 0xA5, 0x63, 0xB4, 0x9D, 0x4C, 0xB4, 0x63, - 0x4C, 0x9D, 0x86, 0xCA, 0x7A, 0x36, 0xCA, 0x86, - 0x36, 0x7A, 0xB6, 0xD7, 0x4A, 0x29, 0xD7, 0xB6, - 0x29, 0x4A, 0xC8, 0xD7, 0x38, 0x29, 0xD7, 0xC8, - 0x29, 0x38, 0xA4, 0xD8, 0x5C, 0x28, 0xD8, 0xA4, - 0x28, 0x5C, 0x6C, 0xC1, 0x94, 0x3F, 0xC1, 0x6C, - 0x3F, 0x94, 0xD9, 0xD9, 0x27, 0x27, 0x80, 0x80, - ], [ - 0x80, 0x80, 0x85, 0x85, 0x7B, 0x7B, 0x7E, 0x87, - 0x82, 0x79, 0x87, 0x7E, 0x79, 0x82, 0x8F, 0x8F, - 0x71, 0x71, 0x84, 0x8F, 0x7C, 0x71, 0x8F, 0x84, - 0x71, 0x7C, 0x75, 0x8B, 0x8B, 0x75, 0x8B, 0x75, - 0x75, 0x8B, 0x8E, 0x9A, 0x72, 0x66, 0x9A, 0x8E, - 0x66, 0x72, 0x7B, 0x93, 0x85, 0x6D, 0x93, 0x7B, - 0x6D, 0x85, 0x9B, 0x9B, 0x65, 0x65, 0x82, 0x9D, - 0x7E, 0x63, 0x9D, 0x82, 0x63, 0x7E, 0x9B, 0xA8, - 0x65, 0x58, 0xA8, 0x9B, 0x58, 0x65, 0xA9, 0xA9, - 0x57, 0x57, 0x8D, 0xAA, 0x73, 0x56, 0xAA, 0x8D, - 0x56, 0x73, 0x6E, 0x99, 0x92, 0x67, 0x99, 0x6E, - 0x67, 0x92, 0x76, 0xA2, 0x8A, 0x5E, 0xA2, 0x76, - 0x5E, 0x8A, 0x7F, 0xAF, 0x81, 0x51, 0xAF, 0x7F, - 0x51, 0x81, 0xAB, 0xBA, 0x55, 0x46, 0xBA, 0xAB, - 0x46, 0x55, 0x9A, 0xBB, 0x66, 0x45, 0xBB, 0x9A, - 0x45, 0x66, 0xBB, 0xBB, 0x45, 0x45, 0x60, 0xA0, - 0xA0, 0x60, 0xA0, 0x60, 0x60, 0xA0, 0x8B, 0xBE, - 0x75, 0x42, 0xBE, 0x8B, 0x42, 0x75, 0x66, 0xAA, - 0x9A, 0x56, 0xAA, 0x66, 0x56, 0x9A, 0x70, 0xB5, - 0x90, 0x4B, 0xB5, 0x70, 0x4B, 0x90, 0xBE, 0xCF, - 0x42, 0x31, 0xCF, 0xBE, 0x31, 0x42, 0xAB, 0xD0, - 0x55, 0x30, 0xD0, 0xAB, 0x30, 0x55, 0xD1, 0xD1, - 0x2F, 0x2F, 0x9A, 0xD3, 0x66, 0x2D, 0xD3, 0x9A, - 0x2D, 0x66, 0x7B, 0xC5, 0x85, 0x3B, 0xC5, 0x7B, - 0x3B, 0x85, 0x54, 0xB4, 0xAC, 0x4C, 0xB4, 0x54, - 0x4C, 0xAC, 0x5E, 0xBE, 0xA2, 0x42, 0xBE, 0x5E, - 0x42, 0xA2, 0x87, 0xD8, 0x79, 0x28, 0xD8, 0x87, - 0x28, 0x79, 0xC0, 0xE8, 0x40, 0x18, 0xE8, 0xC0, - 0x18, 0x40, 0xD5, 0xE8, 0x2B, 0x18, 0xE8, 0xD5, - 0x18, 0x2B, 0xAB, 0xE9, 0x55, 0x17, 0xE9, 0xAB, - 0x17, 0x55, 0x68, 0xCD, 0x98, 0x33, 0xCD, 0x68, - 0x33, 0x98, 0xEA, 0xEA, 0x16, 0x16, 0x80, 0x80, - ], [ - 0x80, 0x80, 0x86, 0x86, 0x7A, 0x7A, 0x7E, 0x88, - 0x82, 0x78, 0x88, 0x7E, 0x78, 0x82, 0x92, 0x92, - 0x6E, 0x6E, 0x85, 0x92, 0x7B, 0x6E, 0x92, 0x85, - 0x6E, 0x7B, 0x73, 0x8D, 0x8D, 0x73, 0x8D, 0x73, - 0x73, 0x8D, 0x91, 0x9E, 0x6F, 0x62, 0x9E, 0x91, - 0x62, 0x6F, 0x79, 0x97, 0x87, 0x69, 0x97, 0x79, - 0x69, 0x87, 0xA0, 0xA0, 0x60, 0x60, 0x83, 0xA2, - 0x7D, 0x5E, 0xA2, 0x83, 0x5E, 0x7D, 0xA0, 0xB0, - 0x60, 0x50, 0xB0, 0xA0, 0x50, 0x60, 0xB1, 0xB1, - 0x4F, 0x4F, 0x8F, 0xB2, 0x71, 0x4E, 0xB2, 0x8F, - 0x4E, 0x71, 0x6B, 0x9E, 0x95, 0x62, 0x9E, 0x6B, - 0x62, 0x95, 0x74, 0xA9, 0x8C, 0x57, 0xA9, 0x74, - 0x57, 0x8C, 0x7F, 0xB8, 0x81, 0x48, 0xB8, 0x7F, - 0x48, 0x81, 0xB4, 0xC5, 0x4C, 0x3B, 0xC5, 0xB4, - 0x3B, 0x4C, 0x9F, 0xC6, 0x61, 0x3A, 0xC6, 0x9F, - 0x3A, 0x61, 0xC6, 0xC6, 0x3A, 0x3A, 0x59, 0xA7, - 0xA7, 0x59, 0xA7, 0x59, 0x59, 0xA7, 0x8D, 0xCA, - 0x73, 0x36, 0xCA, 0x8D, 0x36, 0x73, 0x61, 0xB2, - 0x9F, 0x4E, 0xB2, 0x61, 0x4E, 0x9F, 0x6D, 0xBF, - 0x93, 0x41, 0xBF, 0x6D, 0x41, 0x93, 0xCA, 0xDF, - 0x36, 0x21, 0xDF, 0xCA, 0x21, 0x36, 0xB3, 0xDF, - 0x4D, 0x21, 0xDF, 0xB3, 0x21, 0x4D, 0xE1, 0xE1, - 0x1F, 0x1F, 0x9F, 0xE3, 0x61, 0x1D, 0xE3, 0x9F, - 0x1D, 0x61, 0x7A, 0xD3, 0x86, 0x2D, 0xD3, 0x7A, - 0x2D, 0x86, 0x4C, 0xBE, 0xB4, 0x42, 0xBE, 0x4C, - 0x42, 0xB4, 0x57, 0xCA, 0xA9, 0x36, 0xCA, 0x57, - 0x36, 0xA9, 0x88, 0xE9, 0x78, 0x17, 0xE9, 0x88, - 0x17, 0x78, 0xCC, 0xFB, 0x34, 0x05, 0xFB, 0xCC, - 0x05, 0x34, 0xE6, 0xFB, 0x1A, 0x05, 0xFB, 0xE6, - 0x05, 0x1A, 0xB4, 0xFD, 0x4C, 0x03, 0xFD, 0xB4, - 0x03, 0x4C, 0x63, 0xDC, 0x9D, 0x24, 0xDC, 0x63, - 0x24, 0x9D, 0xFE, 0xFE, 0x02, 0x02, 0x80, 0x80, - ], [ - 0x80, 0x80, 0x87, 0x87, 0x79, 0x79, 0x7E, 0x89, - 0x82, 0x77, 0x89, 0x7E, 0x77, 0x82, 0x95, 0x95, - 0x6B, 0x6B, 0x86, 0x96, 0x7A, 0x6A, 0x96, 0x86, - 0x6A, 0x7A, 0x70, 0x90, 0x90, 0x70, 0x90, 0x70, - 0x70, 0x90, 0x94, 0xA4, 0x6C, 0x5C, 0xA4, 0x94, - 0x5C, 0x6C, 0x78, 0x9B, 0x88, 0x65, 0x9B, 0x78, - 0x65, 0x88, 0xA6, 0xA6, 0x5A, 0x5A, 0x83, 0xA9, - 0x7D, 0x57, 0xA9, 0x83, 0x57, 0x7D, 0xA6, 0xB9, - 0x5A, 0x47, 0xB9, 0xA6, 0x47, 0x5A, 0xBA, 0xBA, - 0x46, 0x46, 0x92, 0xBC, 0x6E, 0x44, 0xBC, 0x92, - 0x44, 0x6E, 0x67, 0xA3, 0x99, 0x5D, 0xA3, 0x67, - 0x5D, 0x99, 0x72, 0xB0, 0x8E, 0x50, 0xB0, 0x72, - 0x50, 0x8E, 0x7F, 0xC3, 0x81, 0x3D, 0xC3, 0x7F, - 0x3D, 0x81, 0xBE, 0xD2, 0x42, 0x2E, 0xD2, 0xBE, - 0x2E, 0x42, 0xA5, 0xD4, 0x5B, 0x2C, 0xD4, 0xA5, - 0x2C, 0x5B, 0xD4, 0xD4, 0x2C, 0x2C, 0x52, 0xAE, - 0xAE, 0x52, 0xAE, 0x52, 0x52, 0xAE, 0x8F, 0xD8, - 0x71, 0x28, 0xD8, 0x8F, 0x28, 0x71, 0x5B, 0xBB, - 0xA5, 0x45, 0xBB, 0x5B, 0x45, 0xA5, 0x69, 0xCB, - 0x97, 0x35, 0xCB, 0x69, 0x35, 0x97, 0xD8, 0xF0, - 0x28, 0x10, 0xF0, 0xD8, 0x10, 0x28, 0xBD, 0xF1, - 0x43, 0x0F, 0xF1, 0xBD, 0x0F, 0x43, 0xF3, 0xF3, - 0x0D, 0x0D, 0xA5, 0xF6, 0x5B, 0x0A, 0xF6, 0xA5, - 0x0A, 0x5B, 0x78, 0xE2, 0x88, 0x1E, 0xE2, 0x78, - 0x1E, 0x88, 0x42, 0xC9, 0xBE, 0x37, 0xC9, 0x42, - 0x37, 0xBE, 0x4F, 0xD8, 0xB1, 0x28, 0xD8, 0x4F, - 0x28, 0xB1, 0x8A, 0xFD, 0x76, 0x03, 0xFD, 0x8A, - 0x03, 0x76, 0xDB, 0xFF, 0x25, 0x01, 0xFF, 0xDB, - 0x01, 0x25, 0xF9, 0xFF, 0x07, 0x01, 0xFF, 0xF9, - 0x01, 0x07, 0xBE, 0xFF, 0x42, 0x01, 0xFF, 0xBE, - 0x01, 0x42, 0x5E, 0xED, 0xA2, 0x13, 0xED, 0x5E, - 0x13, 0xA2, 0xFF, 0xFF, 0x01, 0x01, 0x80, 0x80, - ] -]; - -static INDEO2_CODE_CODES: &[u16] = &[ - 0x0000, 0x0004, 0x0006, 0x0001, 0x0009, 0x0019, 0x000D, 0x001D, - 0x0023, 0x0013, 0x0033, 0x000B, 0x002B, 0x001B, 0x0007, 0x0087, - 0x0027, 0x00A7, 0x0067, 0x00E7, 0x0097, 0x0057, 0x0037, 0x00B7, - 0x00F7, 0x000F, 0x008F, 0x018F, 0x014F, 0x00CF, 0x002F, 0x012F, - 0x01AF, 0x006F, 0x00EF, 0x01EF, 0x001F, 0x021F, 0x011F, 0x031F, - 0x009F, 0x029F, 0x019F, 0x039F, 0x005F, 0x025F, 0x015F, 0x035F, - 0x00DF, 0x02DF, 0x01DF, 0x03DF, 0x003F, 0x103F, 0x083F, 0x183F, - 0x043F, 0x143F, 0x0C3F, 0x1C3F, 0x023F, 0x123F, 0x0A3F, 0x1A3F, - 0x063F, 0x163F, 0x0E3F, 0x1E3F, 0x013F, 0x113F, 0x093F, 0x193F, - 0x053F, 0x153F, 0x0D3F, 0x1D3F, 0x033F, 0x133F, 0x0B3F, 0x1B3F, - 0x073F, 0x173F, 0x0F3F, 0x1F3F, 0x00BF, 0x10BF, 0x08BF, 0x18BF, - 0x04BF, 0x14BF, 0x0CBF, 0x1CBF, 0x02BF, 0x12BF, 0x0ABF, 0x1ABF, - 0x06BF, 0x16BF, 0x0EBF, 0x1EBF, 0x01BF, 0x11BF, 0x09BF, 0x19BF, - 0x05BF, 0x15BF, 0x0DBF, 0x1DBF, 0x03BF, 0x13BF, 0x0BBF, 0x1BBF, - 0x07BF, 0x17BF, 0x0FBF, 0x1FBF, 0x007F, 0x207F, 0x107F, 0x307F, - 0x087F, 0x287F, 0x187F, 0x387F, 0x047F, 0x247F, 0x147F, 0x0002, - 0x0011, 0x0005, 0x0015, 0x0003, 0x003B, 0x0047, 0x00C7, 0x0017, - 0x00D7, 0x0077, 0x010F, 0x004F, 0x01CF, 0x00AF, 0x016F -]; - -static INDEO2_CODE_LENGTHS: &[u8] = &[ - 3, 3, 3, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, - 10, 10, 10, 10, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, - 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, - 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, - 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, - 13, 13, 13, 13, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 3, - 5, 5, 5, 6, 6, 8, 8, 8, 8, 8, 9, 9, 9, 9, 9 -]; - -struct IR2CodeReader { } - -impl CodebookDescReader<u8> for IR2CodeReader { - fn bits(&mut self, idx: usize) -> u8 { INDEO2_CODE_LENGTHS[idx] } - fn code(&mut self, idx: usize) -> u32 { INDEO2_CODE_CODES[idx] as u32 } - fn sym (&mut self, idx: usize) -> u8 { - if idx < 0x7F { (idx + 1) as u8 } else { (idx + 2) as u8 } - } - fn len(&mut self) -> usize { INDEO2_CODE_LENGTHS.len() } -} - -struct Indeo2Decoder { - info: Rc<NACodecInfo>, - cb: Codebook<u8>, - frmmgr: HAMShuffler, -} - -impl Indeo2Decoder { - fn new() -> Self { - let dummy_info = Rc::new(DUMMY_CODEC_INFO); - let mut coderead = IR2CodeReader{}; - let cb = Codebook::new(&mut coderead, CodebookMode::LSB).unwrap(); - Indeo2Decoder { info: dummy_info, cb: cb, frmmgr: HAMShuffler::new() } - } - - fn decode_plane_intra(&self, br: &mut BitReader, - buf: &mut NAVideoBuffer<u8>, planeno: usize, - tableno: usize) -> DecoderResult<()> { - let offs = buf.get_offset(planeno); - let (w, h) = buf.get_dimensions(planeno); - let stride = buf.get_stride(planeno); - let cb = &self.cb; - - let mut data = buf.get_data_mut(); - let framebuf: &mut [u8] = data.as_mut_slice(); - - let table = &INDEO2_DELTA_TABLE[tableno]; - - let mut base = offs; - let mut x: usize = 0; - while x < w { - let idx = br.read_cb(cb)? as usize; - if idx >= 0x80 { - let run = (idx - 0x80) * 2; - if x + run > w { return Err(DecoderError::InvalidData); } - for i in 0..run { - framebuf[base + x + i] = 0x80; - } - x += run; - } else { - framebuf[base + x + 0] = table[(idx * 2 + 0) as usize]; - framebuf[base + x + 1] = table[(idx * 2 + 1) as usize]; - x += 2; - } - } - base += stride; - for _ in 1..h { - let mut x: usize = 0; - while x < w { - let idx = br.read_cb(cb)? as usize; - if idx >= 0x80 { - let run = (idx - 0x80) * 2; - if x + run > w { return Err(DecoderError::InvalidData); } - for i in 0..run { - framebuf[base + x + i] = framebuf[base + x + i - stride]; - } - x += run; - } else { - let delta0 = (table[idx * 2 + 0] as i16) - 0x80; - let delta1 = (table[idx * 2 + 1] as i16) - 0x80; - let mut pix0 = framebuf[base + x + 0 - stride] as i16; - let mut pix1 = framebuf[base + x + 1 - stride] as i16; - pix0 += delta0; - pix1 += delta1; - if pix0 < 0 { pix0 = 0; } - if pix1 < 0 { pix1 = 0; } - if pix0 > 255 { pix0 = 255; } - if pix1 > 255 { pix1 = 255; } - framebuf[base + x + 0] = pix0 as u8; - framebuf[base + x + 1] = pix1 as u8; - x += 2; - } - } - base += stride; - } - Ok(()) - } - - fn decode_plane_inter(&self, br: &mut BitReader, - buf: &mut NAVideoBuffer<u8>, planeno: usize, - tableno: usize) -> DecoderResult<()> { - let offs = buf.get_offset(planeno); - let (w, h) = buf.get_dimensions(planeno); - let stride = buf.get_stride(planeno); - let cb = &self.cb; - - let mut data = buf.get_data_mut(); - let framebuf: &mut [u8] = data.as_mut_slice(); - - let table = &INDEO2_DELTA_TABLE[tableno]; - - let mut base = offs; - for _ in 0..h { - let mut x: usize = 0; - while x < w { - let idx = br.read_cb(cb)? as usize; - if idx >= 0x80 { - let run = (idx - 0x80) * 2; - if x + run > w { return Err(DecoderError::InvalidData); } - x += run; - } else { - let delta0 = (table[idx * 2 + 0] as i16) - 0x80; - let delta1 = (table[idx * 2 + 1] as i16) - 0x80; - let mut pix0 = framebuf[base + x + 0] as i16; - let mut pix1 = framebuf[base + x + 1] as i16; - pix0 += delta0 * 3 >> 2; - pix1 += delta1 * 3 >> 2; - if pix0 < 0 { pix0 = 0; } - if pix1 < 0 { pix1 = 0; } - if pix0 > 255 { pix0 = 255; } - if pix1 > 255 { pix1 = 255; } - framebuf[base + x + 0] = pix0 as u8; - framebuf[base + x + 1] = pix1 as u8; - x += 2; - } - } - base += stride; - } - Ok(()) - } -} - -const IR2_START: usize = 48; - -impl NADecoder for Indeo2Decoder { - fn init(&mut self, info: Rc<NACodecInfo>) -> DecoderResult<()> { - if let NACodecTypeInfo::Video(vinfo) = info.get_properties() { - let w = vinfo.get_width(); - let h = vinfo.get_height(); - let f = vinfo.is_flipped(); - let fmt = formats::YUV410_FORMAT; - let myinfo = NACodecTypeInfo::Video(NAVideoInfo::new(w, h, f, fmt)); - self.info = Rc::new(NACodecInfo::new_ref(info.get_name(), myinfo, info.get_extradata())); - self.frmmgr.clear(); - Ok(()) - } else { - Err(DecoderError::InvalidData) - } - } - fn decode(&mut self, pkt: &NAPacket) -> DecoderResult<NAFrameRef> { - let src = pkt.get_buffer(); - if src.len() <= IR2_START { return Err(DecoderError::ShortData); } - let interframe = src[18]; - let tabs = src[34]; - let mut br = BitReader::new(&src[IR2_START..], src.len() - IR2_START, BitReaderMode::LE); - let luma_tab = tabs & 3; - let chroma_tab = (tabs >> 2) & 3; - if interframe != 0 { - let vinfo = self.info.get_properties().get_video_info().unwrap(); - let bufret = alloc_video_buffer(vinfo, 2); - if let Err(_) = bufret { return Err(DecoderError::InvalidData); } - let mut bufinfo = bufret.unwrap(); - let mut buf = bufinfo.get_vbuf().unwrap(); - for plane in 0..3 { - let tabidx = (if plane == 0 { luma_tab } else { chroma_tab }) as usize; - self.decode_plane_intra(&mut br, &mut buf, plane, tabidx)?; - } - self.frmmgr.add_frame(buf); - let mut frm = NAFrame::new_from_pkt(pkt, self.info.clone(), bufinfo); - frm.set_keyframe(true); - frm.set_frame_type(FrameType::I); - Ok(Rc::new(RefCell::new(frm))) - } else { - let bufret = self.frmmgr.clone_ref(); - if let None = bufret { return Err(DecoderError::MissingReference); } - let mut buf = bufret.unwrap(); - - for plane in 0..3 { - let tabidx = (if plane == 0 { luma_tab } else { chroma_tab }) as usize; - self.decode_plane_inter(&mut br, &mut buf, plane, tabidx)?; - } - let mut frm = NAFrame::new_from_pkt(pkt, self.info.clone(), NABufferType::Video(buf)); - frm.set_keyframe(false); - frm.set_frame_type(FrameType::P); - Ok(Rc::new(RefCell::new(frm))) - } - } -} - -pub fn get_decoder() -> Box<NADecoder> { - Box::new(Indeo2Decoder::new()) -} - -#[cfg(test)] -mod test { - use crate::test::dec_video::test_file_decoding; - #[test] - fn test_indeo2() { - test_file_decoding("avi", "assets/laser05.avi", Some(10), true, false, None); - } -} diff --git a/src/codecs/indeo/indeo3.rs b/src/codecs/indeo/indeo3.rs deleted file mode 100644 index 5b4876d..0000000 --- a/src/codecs/indeo/indeo3.rs +++ /dev/null @@ -1,1460 +0,0 @@ -use crate::formats; -use super::super::*; -use crate::io::byteio::*; -use std::io::SeekFrom; -use std::mem; - -struct IviDeltaCB { - quad_radix: u8, - data: &'static [i8], -} - -#[derive(Clone, Copy)] -struct MV { - x: i8, - y: i8 -} - -struct Buffers { - width: usize, - height: usize, - buf1: Vec<u8>, - buf2: Vec<u8>, - fbuf: bool, -} - -const DEFAULT_PIXEL: u8 = 0x40; - -impl Buffers { - fn new() -> Self { Buffers { width: 0, height: 0, buf1: Vec::new(), buf2: Vec::new(), fbuf: true } } - fn reset(&mut self) { - self.width = 0; - self.height = 0; - self.buf1.truncate(0); - self.buf2.truncate(0); - } - fn alloc(&mut self, w: usize, h: usize) { - self.width = w; - self.height = h; - self.buf1.resize(w * h + (w >> 2) * (h >> 2) * 2, DEFAULT_PIXEL); - self.buf2.resize(w * h + (w >> 2) * (h >> 2) * 2, DEFAULT_PIXEL); - } - fn flip(&mut self) { self.fbuf = !self.fbuf; } - fn get_stride(&mut self, planeno: usize) -> usize { - if planeno == 0 { self.width } else { self.width >> 2 } - } - fn get_offset(&mut self, planeno: usize) -> usize { - match planeno { - 1 => self.width * self.height, - 2 => self.width * self.height + (self.width >> 2) * (self.height >> 2), - _ => 0, - } - } - fn fill_framebuf(&mut self, fbuf: &mut NAVideoBuffer<u8>) { - for planeno in 0..3 { - let mut soff = self.get_offset(planeno); - let mut doff = fbuf.get_offset(planeno); - let sstride = self.get_stride(planeno); - let dstride = fbuf.get_stride(planeno); - let width = if planeno == 0 { self.width } else { self.width >> 2 }; - let height = if planeno == 0 { self.height } else { self.height >> 2 }; - let src = if self.fbuf { &self.buf1[0..] } else { &self.buf2[0..] }; - let mut dst = fbuf.get_data_mut(); - for _ in 0..height { - for x in 0..width { - dst[doff + x] = src[soff + x] * 2; - } - soff += sstride; - doff += dstride; - } - } - } - fn copy_block(&mut self, doff: usize, soff: usize, stride: usize, w: usize, h: usize) { - let mut sidx = soff; - let mut didx = doff; - if self.fbuf { - for _ in 0..h { - for i in 0..w { self.buf1[didx + i] = self.buf2[sidx + i]; } - sidx += stride; - didx += stride; - } - } else { - for _ in 0..h { - for i in 0..w { self.buf2[didx + i] = self.buf1[sidx + i]; } - sidx += stride; - didx += stride; - } - } - } - fn fill_block(&mut self, doff: usize, stride: usize, w: usize, h: usize, topline: bool) { - let mut didx = doff; - let mut buf: [u8; 8] = [0; 8]; - if topline { - if self.fbuf { - for _ in 0..h { - for i in 0..w { self.buf1[didx + i] = DEFAULT_PIXEL; } - didx += stride; - } - } else { - for _ in 0..h { - for i in 0..w { self.buf2[didx + i] = DEFAULT_PIXEL; } - didx += stride; - } - } - } else { - if self.fbuf { - for i in 0..w { buf[i] = self.buf1[didx - stride + i]; } - for _ in 0..h { - for i in 0..w { self.buf1[didx + i] = buf[i]; } - didx += stride; - } - } else { - for i in 0..w { buf[i] = self.buf2[didx - stride + i]; } - for _ in 0..h { - for i in 0..w { self.buf2[didx + i] = buf[i]; } - didx += stride; - } - } - } - } -} - -#[allow(unused_variables)] -fn apply_delta4x4(bufs: &mut Buffers, off: usize, stride: usize, - deltas: &[u8], topline: bool, first_line: bool) { - let dst = if bufs.fbuf { &mut bufs.buf1[off..(off + 4)] } - else { &mut bufs.buf2[off..(off + 4)] }; - for i in 0..4 { dst[i] = dst[i].wrapping_add(deltas[i]) & 0x7F; } -} - -#[allow(unused_variables)] -fn apply_delta4x8(bufs: &mut Buffers, off: usize, stride: usize, - deltas: &[u8], topline: bool, first_line: bool) { - let dst = if bufs.fbuf { &mut bufs.buf1[off..(off + 4 + stride)] } - else { &mut bufs.buf2[off..(off + 4 + stride)] }; - for i in 0..4 { dst[i + stride] = dst[i].wrapping_add(deltas[i]) & 0x7F; } - if !topline { - for i in 0..4 { dst[i] = (dst[i + stride] + dst[i]) >> 1; } - } else { - for i in 0..4 { dst[i] = dst[i + stride]; } - } -} - -#[allow(unused_variables)] -fn apply_delta4x8m11(bufs: &mut Buffers, off: usize, stride: usize, - deltas: &[u8], topline: bool, first_line: bool) { - let dst = if bufs.fbuf { &mut bufs.buf1[off..(off + 4 + stride)] } - else { &mut bufs.buf2[off..(off + 4 + stride)] }; - for i in 0..4 { dst[i] = dst[i] .wrapping_add(deltas[i]) & 0x7F; } - for i in 0..4 { dst[i + stride] = dst[i + stride].wrapping_add(deltas[i]) & 0x7F; } -} - -#[allow(unused_variables)] -fn apply_delta8x8p(bufs: &mut Buffers, off: usize, stride: usize, - deltas: &[u8], topline: bool, first_line: bool) { - let dst = if bufs.fbuf { &mut bufs.buf1[off..(off + 8 + stride)] } - else { &mut bufs.buf2[off..(off + 8 + stride)] }; - for i in 0..8 { dst[i] = dst[i] .wrapping_add(deltas[i >> 1]) & 0x7F; } - for i in 0..8 { dst[i + stride] = dst[i + stride].wrapping_add(deltas[i >> 1]) & 0x7F; } -} - -fn apply_delta8x8i(bufs: &mut Buffers, off: usize, stride: usize, - deltas: &[u8], topline: bool, firstline: bool) { - let dst = if bufs.fbuf { &mut bufs.buf1[off..(off + 8 + stride)] } - else { &mut bufs.buf2[off..(off + 8 + stride)] }; - if !firstline { - for i in 0..8 { dst[i + stride] = dst[i ].wrapping_add(deltas[i >> 1]) & 0x7F; } - } else { - for i in 0..8 { dst[i + stride] = dst[i & !1].wrapping_add(deltas[i >> 1]) & 0x7F; } - } - if !topline { - for i in 0..8 { dst[i] = (dst[i + stride] + dst[i]) >> 1; } - } else { - for i in 0..8 { dst[i] = dst[i + stride]; } - } -} - -fn copy_line_top(bufs: &mut Buffers, off: usize, stride: usize, bw: usize, topline: bool) { - let mut buf: [u8; 8] = [0; 8]; - if !topline { - let src = if bufs.fbuf { &bufs.buf1[(off - stride)..(off - stride + bw)] } - else { &bufs.buf2[(off - stride)..(off - stride + bw)] }; - for i in 0..bw { buf[i] = src[i]; } - } else { - for i in 0..bw { buf[i] = DEFAULT_PIXEL; } - } - let dst = if bufs.fbuf { &mut bufs.buf1[off..(off + bw)] } - else { &mut bufs.buf2[off..(off + bw)] }; - for i in 0..bw { dst[i] = buf[i]; } -} - -fn copy_line_top4x4(bufs: &mut Buffers, off: usize, stride: usize, topline: bool) { - copy_line_top(bufs, off, stride, 4, topline); -} - -fn copy_line_top4x8(bufs: &mut Buffers, off: usize, stride: usize, topline: bool) { - copy_line_top(bufs, off, stride, 4, topline); - copy_line_top(bufs, off + stride, stride, 4, false); -} - -fn copy_line_top8x8(bufs: &mut Buffers, off: usize, stride: usize, topline: bool) { - let mut buf: [u8; 8] = [0; 8]; - if !topline { - let src = if bufs.fbuf { &bufs.buf1[(off - stride)..(off - stride + 8)] } - else { &bufs.buf2[(off - stride)..(off - stride + 8)] }; - for i in 0..8 { buf[i] = src[i & !1]; } - } else { - for i in 0..8 { buf[i] = DEFAULT_PIXEL; } - } - let dst = if bufs.fbuf { &mut bufs.buf1[off..(off + 8)] } - else { &mut bufs.buf2[off..(off + 8)] }; - for i in 0..8 {dst[i] = buf[i]; } -} - -fn fill_block8x8(bufs: &mut Buffers, doff: usize, stride: usize, h: usize, topline: bool, firstline: bool) { - let mut didx = doff; - let mut buf: [u8; 8] = [0; 8]; - if firstline { - for i in 0..8 { buf[i] = DEFAULT_PIXEL; } - } else if bufs.fbuf { - for i in 0..8 { buf[i] = bufs.buf1[doff - stride + i]; } - } else { - for i in 0..8 { buf[i] = bufs.buf1[doff - stride + i]; } - } - if topline && !firstline { - for i in 0..4 { buf[i * 2 + 1] = buf[i * 2]; } - if bufs.fbuf { - for i in 0..8 { bufs.buf1[doff + i] = (bufs.buf1[doff - stride + i] + buf[i]) >> 1; } - } else { - for i in 0..8 { bufs.buf2[doff + i] = (bufs.buf2[doff - stride + i] + buf[i]) >> 1; } - } - } - - let start = if !topline { 0 } else { 1 }; - if bufs.fbuf { - for _ in start..h { - for i in 0..8 { bufs.buf1[didx + i] = buf[i]; } - didx += stride; - } - } else { - for _ in start..h { - for i in 0..8 { bufs.buf2[didx + i] = buf[i]; } - didx += stride; - } - } -} - -struct Indeo3Decoder { - info: Rc<NACodecInfo>, - bpos: u8, - bbuf: u8, - width: u16, - height: u16, - mvs: Vec<MV>, - altquant: [u8; 16], - vq_offset: u8, - bufs: Buffers, -} - -#[derive(Clone,Copy)] -struct IV3Cell { - x: u16, - y: u16, - w: u16, - h: u16, - d: u8, - vqt: bool, - mv: Option<MV>, -} - -impl IV3Cell { - fn new(w: u16, h: u16) -> Self { - IV3Cell { x: 0, y: 0, w: w, h: h, d: 20, vqt: false, mv: None } - } - fn split_h(&self) -> (Self, Self) { - let h1 = if self.h > 2 { ((self.h + 2) >> 2) << 1 } else { 1 }; - let h2 = self.h - h1; - let mut cell1 = *self; - cell1.h = h1; - cell1.d -= 1; - let mut cell2 = *self; - cell2.y += h1; - cell2.h = h2; - cell2.d -= 1; - (cell1, cell2) - } - fn split_w(&self, stripw: u16) -> (Self, Self) { - let w1 = if self.w > stripw { - if self.w > stripw * 2 { stripw * 2 } else { stripw } - } else { - if self.w > 2 { ((self.w + 2) >> 2) << 1 } else { 1 } - }; - let w2 = self.w - w1; - let mut cell1 = *self; - cell1.w = w1; - cell1.d -= 1; - let mut cell2 = *self; - cell2.x += w1; - cell2.w = w2; - cell2.d -= 1; - (cell1, cell2) - } - fn no_mv(&self) -> bool { match self.mv { None => true, Some(_) => false } } -} - -struct CellDecParams { - tab: [usize; 2], - bw: u16, - bh: u16, - swap_q: [bool; 2], - hq: bool, - apply_delta: fn (&mut Buffers, usize, usize, &[u8], bool, bool), - copy_line_top: fn (&mut Buffers, usize, usize, bool), -} - -const FRMH_TAG: u32 = ((b'F' as u32) << 24) | ((b'R' as u32) << 16) - | ((b'M' as u32) << 8) | (b'H' as u32); - -const H_SPLIT: u8 = 0; -const V_SPLIT: u8 = 1; -const SKIP_OR_TREE: u8 = 2; - -impl Indeo3Decoder { - fn new() -> Self { - let dummy_info = Rc::new(DUMMY_CODEC_INFO); - Indeo3Decoder { info: dummy_info, bpos: 0, bbuf: 0, width: 0, height: 0, - mvs: Vec::new(), altquant: [0; 16], - vq_offset: 0, bufs: Buffers::new() } - } - - fn br_reset(&mut self) { - self.bpos = 0; - self.bbuf = 0; - } - - fn get_2bits(&mut self, br: &mut ByteReader) -> DecoderResult<u8> { - if self.bpos == 0 { - self.bbuf = br.read_byte()?; - self.bpos = 8; - } - self.bpos -= 2; - Ok((self.bbuf >> self.bpos) & 0x3) - } - - fn decode_cell_data(&mut self, br: &mut ByteReader, cell: IV3Cell, - off: usize, stride: usize, params: CellDecParams) -> DecoderResult<()> { - let blk_w = cell.w * 4 / params.bw; - let blk_h = cell.h * 4 / params.bh; - let scale: usize = if params.bh == 4 { 1 } else { 2 }; - - validate!((((cell.w * 4) % params.bw) == 0) && (((cell.h * 4) % params.bh) == 0)); - - let mut run_blocks = 0; - let mut run_skip = false; - - let mut didx: usize = ((cell.x*4) as usize) + ((cell.y * 4) as usize) * stride + off; - let mut sidx: usize; - if cell.no_mv() { - sidx = 0; - } else { - let mv = cell.mv.unwrap(); - let mx = mv.x as i16; - let my = mv.y as i16; - let l = (cell.x as i16) * 4 + mx; - let t = (cell.y as i16) * 4 + my; - let r = ((cell.x + cell.w) as i16) * 4 + mx; - let b = ((cell.y + cell.h) as i16) * 4 + my; - validate!(l >= 0); - validate!(t >= 0); - validate!(r <= (self.width as i16)); - validate!(b <= (self.height as i16)); - sidx = (l as usize) + (t as usize) * stride + off; - } - for y in 0..blk_h { - let mut xoff: usize = 0; - for _ in 0..blk_w { - if run_blocks > 0 { - if !run_skip || !cell.no_mv() { - if !(params.bw == 8 && cell.no_mv()) { - if !cell.no_mv() { - self.bufs.copy_block(didx + xoff, sidx + xoff, stride, - params.bw as usize, params.bh as usize); - } else { - self.bufs.fill_block(didx + xoff, stride, - params.bw as usize, params.bh as usize, - (cell.y == 0) && (y == 0)); - } - } else { - fill_block8x8(&mut self.bufs, - didx + xoff, stride, 8, - y == 0, (cell.y == 0) && (y == 0)); - } - } - run_blocks -= 1; - } else { - let mut line: usize = 0; - while line < 4 { - let c = br.read_byte()?; - if c < 0xF8 { - let delta_tab = if params.hq { - IVI3_DELTA_CBS[params.tab[line & 1]] - } else { - IVI3_DELTA_CBS[params.tab[1]] - }; - let mut idx1; - let mut idx2; - if (c as usize) < delta_tab.data.len()/2 { - idx1 = br.read_byte()? as usize; - validate!(idx1 < delta_tab.data.len()); - idx2 = c as usize; - } else { - let tmp = (c as usize) - delta_tab.data.len()/2; - idx1 = tmp / (delta_tab.quad_radix as usize); - idx2 = tmp % (delta_tab.quad_radix as usize); - if params.swap_q[line & 1] { - mem::swap(&mut idx1, &mut idx2); - } - } - let deltas: [u8; 4] = [delta_tab.data[idx1 * 2] as u8, - delta_tab.data[idx1 * 2 + 1] as u8, - delta_tab.data[idx2 * 2 + 0] as u8, - delta_tab.data[idx2 * 2 + 1] as u8]; - let topline = (cell.y == 0) && (y == 0) && (line == 0); - let first_line = (y == 0) && (line == 0); - if cell.no_mv() { - (params.copy_line_top)(&mut self.bufs, - didx + xoff + line * scale * stride, - stride, topline); - } else { - self.bufs.copy_block(didx + xoff + line * scale * stride, - sidx + xoff + line * scale * stride, - stride, params.bw as usize, scale); - } - (params.apply_delta)(&mut self.bufs, - didx + xoff + line * scale * stride, - stride, &deltas, topline, first_line); - line += 1; - } else { - let mut tocopy: usize = 0; - let mut do_copy = true; - if c == 0xF8 { return Err(DecoderError::InvalidData); } - if c == 0xF9 { - run_blocks = 1; - run_skip = true; - validate!(line == 0); - tocopy = 4; - do_copy = !cell.no_mv(); - } - if c == 0xFA { - validate!(line == 0); - tocopy = 4; - do_copy = !cell.no_mv(); - } - if c == 0xFB { - let c = br.read_byte()?; - validate!((c < 64) && ((c & 0x1F) != 0)); - run_blocks = (c & 0x1F) - 1; - run_skip = (c & 0x20) != 0; - tocopy = 4 - line; - if params.bw == 4 && cell.no_mv() && run_skip { - do_copy = false; - } - } - if c == 0xFC { - run_skip = false; - run_blocks = 1; - tocopy = 4 - line; - } - if c >= 0xFD { - let nl = 257 - (c as i16) - (line as i16); - validate!(nl > 0); - tocopy = nl as usize; - } - if do_copy { - if !(params.bw == 8 && cell.no_mv()) { - if !cell.no_mv() { - self.bufs.copy_block(didx + xoff + line * scale * stride, - sidx + xoff + line * scale * stride, - stride, params.bw as usize, - tocopy * scale); - } else { - self.bufs.fill_block(didx + xoff + line * scale * stride, - stride, params.bw as usize, - tocopy * scale, - (cell.y == 0) && (y == 0) && (line == 0)); - } - } else { - fill_block8x8(&mut self.bufs, - didx + xoff + line * 2 * stride, - stride, tocopy * 2, - (y == 0) && (line == 0), - (cell.y == 0) && (y == 0) && (line == 0)); - } - } - line += tocopy; - } - } - } - xoff += params.bw as usize; - } - didx += stride * (params.bh as usize); - sidx += stride * (params.bh as usize); - } - Ok(()) - } - - fn copy_cell(&mut self, cell: IV3Cell, off: usize, stride: usize) -> DecoderResult<()> { - if cell.no_mv() { return Err(DecoderError::InvalidData); } - let mv = cell.mv.unwrap(); - let mx = mv.x as i16; - let my = mv.y as i16; - let l = (cell.x as i16) * 4 + mx; - let t = (cell.y as i16) * 4 + my; - let r = ((cell.x + cell.w) as i16) * 4 + mx; - let b = ((cell.y + cell.h) as i16) * 4 + my; - validate!(l >= 0); - validate!(t >= 0); - validate!(r <= (self.width as i16)); - validate!(b <= (self.height as i16)); - let sidx: usize = off + (l as usize) + (t as usize) * stride; - let didx: usize = off + ((cell.x * 4) as usize) + ((cell.y * 4) as usize) * stride; - self.bufs.copy_block(didx, sidx, stride, (cell.w * 4) as usize, (cell.h * 4) as usize); - Ok(()) - } - - fn decode_cell(&mut self, br: &mut ByteReader, cell: IV3Cell, off: usize, - stride: usize, intra: bool) -> DecoderResult<()> { - let code = br.read_byte()?; - let mode = code >> 4; - let vq_idx = code & 0xF; - - let mut idx1: usize = vq_idx as usize; - let mut idx2: usize = vq_idx as usize; - if (mode == 1) || (mode == 4) { - let c = self.altquant[vq_idx as usize]; - idx1 = (c >> 4) as usize; - idx2 = (c & 0xF) as usize; - } - - idx1 += self.vq_offset as usize; - idx2 += self.vq_offset as usize; - validate!((idx1 < 24) && (idx2 < 24)); - - let mut cp = CellDecParams { - tab: [idx2, idx1], - bw: 0, bh: 0, - swap_q: [idx2 >= 16, idx1 >= 16], - hq: false, - apply_delta: apply_delta4x4, - copy_line_top: copy_line_top4x4, - }; - if (mode == 0) || (mode == 1) { - cp.bw = 4; - cp.bh = 4; - cp.hq = true; - } else if (mode == 3) || (mode == 4) { - if !cell.no_mv() { return Err(DecoderError::InvalidData); } - cp.bw = 4; - cp.bh = 8; - cp.hq = true; - cp.apply_delta = apply_delta4x8; - cp.copy_line_top = copy_line_top4x8; - } else if mode == 10 { - if !cell.no_mv() { - validate!(!intra); - cp.apply_delta = apply_delta8x8p; - } else { - cp.apply_delta = apply_delta8x8i; - } - cp.bw = 8; - cp.bh = 8; - cp.copy_line_top = copy_line_top8x8; - } else if mode == 11 { - if cell.no_mv() { return Err(DecoderError::InvalidData); } - validate!(!intra); - cp.bw = 4; - cp.bh = 8; - cp.apply_delta = apply_delta4x8m11; - cp.copy_line_top = copy_line_top4x8; - } else { - return Err(DecoderError::InvalidData); - } - self.decode_cell_data(br, cell, off, stride, cp) - } - - fn parse_tree(&mut self, br: &mut ByteReader, cell: IV3Cell, off: usize, - stride: usize, stripw: u16, intra: bool) -> DecoderResult<()> { - let op = self.get_2bits(br)?; - if op == H_SPLIT { - validate!(cell.h > 1); - validate!(cell.d > 0); - let (cell1, cell2) = cell.split_h(); - self.parse_tree(br, cell1, off, stride, stripw, intra)?; - self.parse_tree(br, cell2, off, stride, stripw, intra)?; - Ok(()) - } else if op == V_SPLIT { - validate!(cell.w > 1); - validate!(cell.d > 0); - let (cell1, cell2) = cell.split_w(stripw); - self.parse_tree(br, cell1, off, stride, stripw, intra)?; - self.parse_tree(br, cell2, off, stride, stripw, intra)?; - Ok(()) - } else if op == SKIP_OR_TREE { - if !cell.vqt { - let mut newcell = cell; - newcell.vqt = true; - newcell.d -= 1; - self.parse_tree(br, newcell, off, stride, stripw, intra) - } else { - validate!(!intra); - let code = self.get_2bits(br)?; - validate!(code < 2); - if code == 1 { return Err(DecoderError::NotImplemented); } - self.copy_cell(cell, off, stride) - } - } else { - if !cell.vqt { - let mut newcell = cell; - newcell.vqt = true; - newcell.d -= 1; - let mv_idx = br.read_byte()? as usize; - validate!(mv_idx < self.mvs.len()); - newcell.mv = Some(self.mvs[mv_idx]); - self.parse_tree(br, newcell, off, stride, stripw, intra) - } else { - self.decode_cell(br, cell, off, stride, intra) - } - } - } - - fn decode_plane_intra(&mut self, br: &mut ByteReader, planeno: usize, - start: u64, end: u64) -> DecoderResult<()> { - let offs = self.bufs.get_offset(planeno); - let stride = self.bufs.get_stride(planeno); - br.seek(SeekFrom::Start(start))?; - - let nvec = br.read_u32le()?; - validate!(nvec == 0); // for intra there should be no mc_vecs - self.mvs.truncate(0); - for _ in 0..nvec { - let x = br.read_byte()? as i8; - let y = br.read_byte()? as i8; - self.mvs.push(MV{ x: x, y: y }); - } - - let shift = if planeno == 0 { 2 } else { 4 }; - let cell = IV3Cell::new((self.bufs.width >> shift) as u16, - (self.bufs.height >> shift) as u16); - self.br_reset(); - self.parse_tree(br, cell, offs, stride, if planeno > 0 { 10 } else { 40 }, true)?; - validate!(br.tell() <= end); - Ok(()) - } - - fn decode_plane_inter(&mut self, br: &mut ByteReader, planeno: usize, - start: u64, end: u64) -> DecoderResult<()> { - let offs = self.bufs.get_offset(planeno); - let stride = self.bufs.get_stride(planeno); - br.seek(SeekFrom::Start(start))?; - - let nvec = br.read_u32le()?; - validate!(nvec <= 256); // for intra there should be no mc_vecs - self.mvs.truncate(0); - for _ in 0..nvec { - let y = br.read_byte()? as i8; - let x = br.read_byte()? as i8; - self.mvs.push(MV{ x: x, y: y }); - } - - let shift = if planeno == 0 { 2 } else { 4 }; - let cell = IV3Cell::new((self.bufs.width >> shift) as u16, - (self.bufs.height >> shift) as u16); - self.br_reset(); - self.parse_tree(br, cell, offs, stride, if planeno > 0 { 10 } else { 40 }, false)?; - validate!(br.tell() <= end); - Ok(()) - } -} - -const FLAG_KEYFRAME: u16 = 1 << 2; -const FLAG_NONREF: u16 = 1 << 8; - -impl NADecoder for Indeo3Decoder { - fn init(&mut self, info: Rc<NACodecInfo>) -> DecoderResult<()> { - if let NACodecTypeInfo::Video(vinfo) = info.get_properties() { - let w = vinfo.get_width(); - let h = vinfo.get_height(); - let fmt = formats::YUV410_FORMAT; - let myinfo = NACodecTypeInfo::Video(NAVideoInfo::new(w, h, false, fmt)); - self.info = Rc::new(NACodecInfo::new_ref(info.get_name(), myinfo, info.get_extradata())); - self.bufs.reset(); - Ok(()) - } else { - Err(DecoderError::InvalidData) - } - } - fn decode(&mut self, pkt: &NAPacket) -> DecoderResult<NAFrameRef> { - let src = pkt.get_buffer(); - let mut mr = MemoryReader::new_read(&src); - let mut br = ByteReader::new(&mut mr); - let frameno = br.read_u32le()?; - let hdr_2 = br.read_u32le()?; - let check = br.read_u32le()?; - let size = br.read_u32le()?; - - let data_start = br.tell(); - - if (frameno ^ hdr_2 ^ size ^ FRMH_TAG) != check { - return Err(DecoderError::InvalidData); - } - if (size as i64) > br.left() { return Err(DecoderError::InvalidData); } - let ver = br.read_u16le()?; - if ver != 32 { return Err(DecoderError::NotImplemented); } - let flags = br.read_u16le()?; - let size2 = br.read_u32le()?; - validate!(((size2 + 7) >> 3) <= size); - let cb = br.read_byte()?; - self.vq_offset = cb; - br.read_skip(3)?; - let height = br.read_u16le()?; - let width = br.read_u16le()?; - validate!((width >= 16) && (width <= 640)); - validate!((height >= 16) && (height <= 640)); - validate!(((width & 3) == 0) && ((height & 3) == 0)); - if (self.bufs.width != (width as usize)) || (self.bufs.height != (height as usize)) { - self.bufs.alloc(width as usize, height as usize); - } - self.width = width; - self.height = height; - - let yoff = br.read_u32le()?; - let uoff = br.read_u32le()?; - let voff = br.read_u32le()?; - if yoff > size { return Err(DecoderError::InvalidData); } - if uoff > size { return Err(DecoderError::InvalidData); } - if voff > size { return Err(DecoderError::InvalidData); } - - br.read_skip(4)?; - br.read_buf(&mut self.altquant)?; - - let mut yend = src.len() as u32;//size; - if (uoff < yend) && (uoff > yoff) { yend = uoff; } - if (voff < yend) && (voff > yoff) { yend = voff; } - let mut uend = size; - if (yoff < uend) && (yoff > uoff) { uend = yoff; } - if (voff < uend) && (voff > uoff) { uend = voff; } - let mut vend = size; - if (yoff < vend) && (yoff > voff) { vend = yoff; } - if (uoff < vend) && (uoff > voff) { vend = uoff; } - - let intraframe = (flags & FLAG_KEYFRAME) != 0; - let vinfo = self.info.get_properties().get_video_info().unwrap(); - let bufret = alloc_video_buffer(vinfo, 2); - if let Err(_) = bufret { return Err(DecoderError::InvalidData); } - let mut bufinfo = bufret.unwrap(); - let mut buf = bufinfo.get_vbuf().unwrap(); - let ystart = data_start + (yoff as u64); - let ustart = data_start + (uoff as u64); - let vstart = data_start + (voff as u64); - let yendpos = data_start + (yend as u64); - let uendpos = data_start + (uend as u64); - let vendpos = data_start + (vend as u64); - if intraframe { - self.decode_plane_intra(&mut br, 0, ystart, yendpos)?; - self.decode_plane_intra(&mut br, 1, ustart, uendpos)?; - self.decode_plane_intra(&mut br, 2, vstart, vendpos)?; - } else { - self.decode_plane_inter(&mut br, 0, ystart, yendpos)?; - self.decode_plane_inter(&mut br, 1, ustart, uendpos)?; - self.decode_plane_inter(&mut br, 2, vstart, vendpos)?; - } - self.bufs.fill_framebuf(&mut buf); - if (flags & FLAG_NONREF) == 0 { self.bufs.flip(); } - let mut frm = NAFrame::new_from_pkt(pkt, self.info.clone(), bufinfo); - frm.set_keyframe(intraframe); - frm.set_frame_type(if intraframe { FrameType::I } else { FrameType::P }); - Ok(Rc::new(RefCell::new(frm))) - } -} - -pub fn get_decoder() -> Box<NADecoder> { - Box::new(Indeo3Decoder::new()) -} - -#[cfg(test)] -mod test { - use crate::test::dec_video::test_file_decoding; - #[test] - fn test_indeo3() { - test_file_decoding("avi", "assets/iv32_example.avi", Some(10), true, false, None); - } -} - -const DT_1_1: IviDeltaCB = IviDeltaCB{ quad_radix: 7, data: &[ - 0, 0, 2, 2, -2, -2, -1, 3, - 1, -3, 3, -1, -3, 1, 4, 4, - -4, -4, 1, 5, -1, -5, 5, 1, - -5, -1, -4, 4, 4, -4, -2, 6, - 2, -6, 6, -2, -6, 2, 4, 9, - -4, -9, 9, 4, -9, -4, 9, 9, - -9, -9, 1, 10, -1, -10, 10, 1, - -10, -1, -5, 8, 5, -8, 8, -5, - -8, 5, 9, 15, -9, -15, 15, 9, - -15, -9, -3, 12, 3, -12, 12, -3, - -12, 3, 4, 16, -4, -16, 16, 4, - -16, -4, 16, 16, -16, -16, 0, 18, - 0, -18, 18, 0, -18, 0, -12, 12, - 12, -12, -9, 16, 9, -16, 16, -9, - -16, 9, 11, 27, -11, -27, 27, 11, - -27, -11, 19, 28, -19, -28, 28, 19, - -28, -19, -6, 22, 6, -22, 22, -6, - -22, 6, 4, 29, -4, -29, 29, 4, - -29, -4, 30, 30, -30, -30, -2, 33, - 2, -33, 33, -2, -33, 2, -18, 23, - 18, -23, 23, -18, -23, 18, -15, 30, - 15, -30, 30, -15, -30, 15, 22, 46, - -22, -46, 46, 22, -46, -22, 13, 47, - -13, -47, 47, 13, -47, -13, 35, 49, - -35, -49, 49, 35, -49, -35, -11, 41, - 11, -41, 41, -11, -41, 11, 4, 51, - -4, -51, 51, 4, -51, -4, 54, 54, - -54, -54, -34, 34, 34, -34, -29, 42, - 29, -42, 42, -29, -42, 29, -6, 60, - 6, -60, 60, -6, -60, 6, 27, 76, - -27, -76, 76, 27, -76, -27, 43, 77, - -43, -77, 77, 43, -77, -43, -24, 55, - 24, -55, 55, -24, -55, 24, 14, 79, - -14, -79, 79, 14, -79, -14, 63, 83, - -63, -83, 83, 63, -83, -63, -20, 74, - 20, -74, 74, -20, -74, 20, 2, 88, - -2, -88, 88, 2, -88, -2, 93, 93, - -93, -93, -52, 61, 52, -61, 61, -52, - -61, 52, 52, 120, -52, -120, 120, 52, - -120, -52, -45, 75, 45, -75, 75, -45, - -75, 45, 75, 125, -75, -125, 125, 75, - -125, -75, 33, 122, -33, -122, 122, 33, - -122, -33, -13, 103, 13, -103, 103, -13, - -103, 13, -40, 96, 40, -96, 96, -40, - -96, 40, -34, 127, 34, -127, 127, -34, - -127, 34, -89, 89, 89, -89, -78, 105, - 78, -105, 105, -78, -105, 78, 12, 12, - -12, -12, 23, 23, -23, -23, 42, 42, - -42, -42, 73, 73, -73, -73, -]}; - -const DT_1_2: IviDeltaCB = IviDeltaCB{ quad_radix: 9, data: &[ - 0, 0, 3, 3, -3, -3, -1, 4, - 1, -4, 4, -1, -4, 1, 7, 7, - -7, -7, 2, 8, -2, -8, 8, 2, - -8, -2, -2, 9, 2, -9, 9, -2, - -9, 2, -6, 6, 6, -6, 6, 13, - -6, -13, 13, 6, -13, -6, 13, 13, - -13, -13, 1, 14, -1, -14, 14, 1, - -14, -1, -8, 12, 8, -12, 12, -8, - -12, 8, 14, 23, -14, -23, 23, 14, - -23, -14, -5, 18, 5, -18, 18, -5, - -18, 5, 6, 24, -6, -24, 24, 6, - -24, -6, 24, 24, -24, -24, -1, 27, - 1, -27, 27, -1, -27, 1, -17, 17, - 17, -17, -13, 23, 13, -23, 23, -13, - -23, 13, 16, 40, -16, -40, 40, 16, - -40, -16, 28, 41, -28, -41, 41, 28, - -41, -28, -9, 33, 9, -33, 33, -9, - -33, 9, 6, 43, -6, -43, 43, 6, - -43, -6, 46, 46, -46, -46, -4, 50, - 4, -50, 50, -4, -50, 4, -27, 34, - 27, -34, 34, -27, -34, 27, -22, 45, - 22, -45, 45, -22, -45, 22, 34, 69, - -34, -69, 69, 34, -69, -34, 19, 70, - -19, -70, 70, 19, -70, -19, 53, 73, - -53, -73, 73, 53, -73, -53, -17, 62, - 17, -62, 62, -17, -62, 17, 5, 77, - -5, -77, 77, 5, -77, -5, 82, 82, - -82, -82, -51, 51, 51, -51, -43, 64, - 43, -64, 64, -43, -64, 43, -10, 90, - 10, -90, 90, -10, -90, 10, 41, 114, - -41, -114, 114, 41, -114, -41, 64, 116, - -64, -116, 116, 64, -116, -64, -37, 82, - 37, -82, 82, -37, -82, 37, 22, 119, - -22, -119, 119, 22, -119, -22, 95, 124, - -95, -124, 124, 95, -124, -95, -30, 111, - 30, -111, 111, -30, -111, 30, -78, 92, - 78, -92, 92, -78, -92, 78, -68, 113, - 68, -113, 113, -68, -113, 68, 18, 18, - -18, -18, 34, 34, -34, -34, 63, 63, - -63, -63, 109, 109, -109, -109, -]}; - -const DT_1_3: IviDeltaCB = IviDeltaCB{ quad_radix: 10, data: &[ - 0, 0, 4, 4, -4, -4, -1, 5, - 1, -5, 5, -1, -5, 1, 3, 10, - -3, -10, 10, 3, -10, -3, 9, 9, - -9, -9, -7, 7, 7, -7, -3, 12, - 3, -12, 12, -3, -12, 3, 8, 17, - -8, -17, 17, 8, -17, -8, 17, 17, - -17, -17, 1, 19, -1, -19, 19, 1, - -19, -1, -11, 16, 11, -16, 16, -11, - -16, 11, -6, 23, 6, -23, 23, -6, - -23, 6, 18, 31, -18, -31, 31, 18, - -31, -18, 8, 32, -8, -32, 32, 8, - -32, -8, 33, 33, -33, -33, -1, 36, - 1, -36, 36, -1, -36, 1, -23, 23, - 23, -23, -17, 31, 17, -31, 31, -17, - -31, 17, 21, 54, -21, -54, 54, 21, - -54, -21, 37, 55, -37, -55, 55, 37, - -55, -37, -12, 44, 12, -44, 44, -12, - -44, 12, 8, 57, -8, -57, 57, 8, - -57, -8, 61, 61, -61, -61, -5, 66, - 5, -66, 66, -5, -66, 5, -36, 45, - 36, -45, 45, -36, -45, 36, -29, 60, - 29, -60, 60, -29, -60, 29, 45, 92, - -45, -92, 92, 45, -92, -45, 25, 93, - -25, -93, 93, 25, -93, -25, 71, 97, - -71, -97, 97, 71, -97, -71, -22, 83, - 22, -83, 83, -22, -83, 22, 7, 102, - -7, -102, 102, 7, -102, -7, 109, 109, - -109, -109, -68, 68, 68, -68, -57, 85, - 57, -85, 85, -57, -85, 57, -13, 120, - 13, -120, 120, -13, -120, 13, -49, 110, - 49, -110, 110, -49, -110, 49, -104, 123, - 104, -123, 123, -104, -123, 104, 24, 24, - -24, -24, 46, 46, -46, -46, 84, 84, - -84, -84, -]}; - -const DT_1_4: IviDeltaCB = IviDeltaCB{ quad_radix: 11, data: &[ - 0, 0, 5, 5, -5, -5, -2, 7, - 2, -7, 7, -2, -7, 2, 11, 11, - -11, -11, 3, 13, -3, -13, 13, 3, - -13, -3, -9, 9, 9, -9, -4, 15, - 4, -15, 15, -4, -15, 4, 11, 22, - -11, -22, 22, 11, -22, -11, 21, 21, - -21, -21, 2, 24, -2, -24, 24, 2, - -24, -2, -14, 20, 14, -20, 20, -14, - -20, 14, 23, 38, -23, -38, 38, 23, - -38, -23, -8, 29, 8, -29, 29, -8, - -29, 8, 11, 39, -11, -39, 39, 11, - -39, -11, 41, 41, -41, -41, -1, 45, - 1, -45, 45, -1, -45, 1, -29, 29, - 29, -29, -22, 39, 22, -39, 39, -22, - -39, 22, 27, 67, -27, -67, 67, 27, - -67, -27, 47, 69, -47, -69, 69, 47, - -69, -47, -15, 56, 15, -56, 56, -15, - -56, 15, 11, 71, -11, -71, 71, 11, - -71, -11, 76, 76, -76, -76, -6, 83, - 6, -83, 83, -6, -83, 6, -45, 57, - 45, -57, 57, -45, -57, 45, -36, 75, - 36, -75, 75, -36, -75, 36, 56, 115, - -56, -115, 115, 56, -115, -56, 31, 117, - -31, -117, 117, 31, -117, -31, 88, 122, - -88, -122, 122, 88, -122, -88, -28, 104, - 28, -104, 104, -28, -104, 28, -85, 85, - 85, -85, -72, 106, 72, -106, 106, -72, - -106, 72, 30, 30, -30, -30, 58, 58, - -58, -58, 105, 105, -105, -105, -]}; - -const DT_1_5: IviDeltaCB = IviDeltaCB{ quad_radix: 12, data: &[ - 0, 0, 6, 6, -6, -6, -2, 8, - 2, -8, 8, -2, -8, 2, 13, 13, - -13, -13, 4, 15, -4, -15, 15, 4, - -15, -4, -11, 11, 11, -11, -5, 18, - 5, -18, 18, -5, -18, 5, 13, 26, - -13, -26, 26, 13, -26, -13, 26, 26, - -26, -26, 2, 29, -2, -29, 29, 2, - -29, -2, -16, 24, 16, -24, 24, -16, - -24, 16, 28, 46, -28, -46, 46, 28, - -46, -28, -9, 35, 9, -35, 35, -9, - -35, 9, 13, 47, -13, -47, 47, 13, - -47, -13, 49, 49, -49, -49, -1, 54, - 1, -54, 54, -1, -54, 1, -35, 35, - 35, -35, -26, 47, 26, -47, 47, -26, - -47, 26, 32, 81, -32, -81, 81, 32, - -81, -32, 56, 83, -56, -83, 83, 56, - -83, -56, -18, 67, 18, -67, 67, -18, - -67, 18, 13, 86, -13, -86, 86, 13, - -86, -13, 91, 91, -91, -91, -7, 99, - 7, -99, 99, -7, -99, 7, -54, 68, - 54, -68, 68, -54, -68, 54, -44, 90, - 44, -90, 90, -44, -90, 44, -33, 124, - 33, -124, 124, -33, -124, 33, -103, 103, - 103, -103, -86, 127, 86, -127, 127, -86, - -127, 86, 37, 37, -37, -37, 69, 69, - -69, -69, -]}; - -const DT_1_6: IviDeltaCB = IviDeltaCB{ quad_radix: 12, data: &[ - 0, 0, 7, 7, -7, -7, -3, 10, - 3, -10, 10, -3, -10, 3, 16, 16, - -16, -16, 5, 18, -5, -18, 18, 5, - -18, -5, -13, 13, 13, -13, -6, 21, - 6, -21, 21, -6, -21, 6, 15, 30, - -15, -30, 30, 15, -30, -15, 30, 30, - -30, -30, 2, 34, -2, -34, 34, 2, - -34, -2, -19, 28, 19, -28, 28, -19, - -28, 19, 32, 54, -32, -54, 54, 32, - -54, -32, -11, 41, 11, -41, 41, -11, - -41, 11, 15, 55, -15, -55, 55, 15, - -55, -15, 57, 57, -57, -57, -1, 63, - 1, -63, 63, -1, -63, 1, -40, 40, - 40, -40, -30, 55, 30, -55, 55, -30, - -55, 30, 37, 94, -37, -94, 94, 37, - -94, -37, 65, 96, -65, -96, 96, 65, - -96, -65, -21, 78, 21, -78, 78, -21, - -78, 21, 15, 100, -15, -100, 100, 15, - -100, -15, 106, 106, -106, -106, -8, 116, - 8, -116, 116, -8, -116, 8, -63, 79, - 63, -79, 79, -63, -79, 63, -51, 105, - 51, -105, 105, -51, -105, 51, -120, 120, - 120, -120, 43, 43, -43, -43, 80, 80, - -80, -80, -]}; - -const DT_1_7: IviDeltaCB = IviDeltaCB{ quad_radix: 12, data: &[ - 0, 0, 8, 8, -8, -8, -3, 11, - 3, -11, 11, -3, -11, 3, 18, 18, - -18, -18, 5, 20, -5, -20, 20, 5, - -20, -5, -15, 15, 15, -15, -7, 24, - 7, -24, 24, -7, -24, 7, 17, 35, - -17, -35, 35, 17, -35, -17, 34, 34, - -34, -34, 3, 38, -3, -38, 38, 3, - -38, -3, -22, 32, 22, -32, 32, -22, - -32, 22, 37, 61, -37, -61, 61, 37, - -61, -37, -13, 47, 13, -47, 47, -13, - -47, 13, 17, 63, -17, -63, 63, 17, - -63, -17, 65, 65, -65, -65, -1, 72, - 1, -72, 72, -1, -72, 1, -46, 46, - 46, -46, -35, 63, 35, -63, 63, -35, - -63, 35, 43, 107, -43, -107, 107, 43, - -107, -43, 75, 110, -75, -110, 110, 75, - -110, -75, -24, 89, 24, -89, 89, -24, - -89, 24, 17, 114, -17, -114, 114, 17, - -114, -17, 121, 121, -121, -121, -72, 91, - 72, -91, 91, -72, -91, 72, -58, 120, - 58, -120, 120, -58, -120, 58, 49, 49, - -49, -49, 92, 92, -92, -92, -]}; - -const DT_1_8: IviDeltaCB = IviDeltaCB{ quad_radix: 13, data: &[ - 0, 0, 9, 9, -9, -9, -3, 12, - 3, -12, 12, -3, -12, 3, 20, 20, - -20, -20, 6, 23, -6, -23, 23, 6, - -23, -6, -17, 17, 17, -17, -7, 27, - 7, -27, 27, -7, -27, 7, 19, 39, - -19, -39, 39, 19, -39, -19, 39, 39, - -39, -39, 3, 43, -3, -43, 43, 3, - -43, -3, -24, 36, 24, -36, 36, -24, - -36, 24, 42, 69, -42, -69, 69, 42, - -69, -42, -14, 53, 14, -53, 53, -14, - -53, 14, 19, 71, -19, -71, 71, 19, - -71, -19, 73, 73, -73, -73, -2, 80, - 2, -80, 80, -2, -80, 2, -52, 52, - 52, -52, -39, 70, 39, -70, 70, -39, - -70, 39, 48, 121, -48, -121, 121, 48, - -121, -48, 84, 124, -84, -124, 124, 84, - -124, -84, -27, 100, 27, -100, 100, -27, - -100, 27, -81, 102, 81, -102, 102, -81, - -102, 81, 55, 55, -55, -55, 104, 104, - -104, -104, -]}; - -const DT_2_1: IviDeltaCB = IviDeltaCB{ quad_radix: 7, data: &[ - 0, 0, 2, 2, -2, -2, 0, 2, - 0, -2, 2, 0, -2, 0, 4, 4, - -4, -4, 0, 4, 0, -4, 4, 0, - -4, 0, -4, 4, 4, -4, -2, 6, - 2, -6, 6, -2, -6, 2, 4, 8, - -4, -8, 8, 4, -8, -4, 8, 8, - -8, -8, 0, 10, 0, -10, 10, 0, - -10, 0, -4, 8, 4, -8, 8, -4, - -8, 4, 8, 14, -8, -14, 14, 8, - -14, -8, -2, 12, 2, -12, 12, -2, - -12, 2, 4, 16, -4, -16, 16, 4, - -16, -4, 16, 16, -16, -16, 0, 18, - 0, -18, 18, 0, -18, 0, -12, 12, - 12, -12, -8, 16, 8, -16, 16, -8, - -16, 8, 10, 26, -10, -26, 26, 10, - -26, -10, 18, 28, -18, -28, 28, 18, - -28, -18, -6, 22, 6, -22, 22, -6, - -22, 6, 4, 28, -4, -28, 28, 4, - -28, -4, 30, 30, -30, -30, -2, 32, - 2, -32, 32, -2, -32, 2, -18, 22, - 18, -22, 22, -18, -22, 18, -14, 30, - 14, -30, 30, -14, -30, 14, 22, 46, - -22, -46, 46, 22, -46, -22, 12, 46, - -12, -46, 46, 12, -46, -12, 34, 48, - -34, -48, 48, 34, -48, -34, -10, 40, - 10, -40, 40, -10, -40, 10, 4, 50, - -4, -50, 50, 4, -50, -4, 54, 54, - -54, -54, -34, 34, 34, -34, -28, 42, - 28, -42, 42, -28, -42, 28, -6, 60, - 6, -60, 60, -6, -60, 6, 26, 76, - -26, -76, 76, 26, -76, -26, 42, 76, - -42, -76, 76, 42, -76, -42, -24, 54, - 24, -54, 54, -24, -54, 24, 14, 78, - -14, -78, 78, 14, -78, -14, 62, 82, - -62, -82, 82, 62, -82, -62, -20, 74, - 20, -74, 74, -20, -74, 20, 2, 88, - -2, -88, 88, 2, -88, -2, 92, 92, - -92, -92, -52, 60, 52, -60, 60, -52, - -60, 52, 52, 118, -52, -118, 118, 52, - -118, -52, -44, 74, 44, -74, 74, -44, - -74, 44, 74, 118, -74, -118, 118, 74, - -118, -74, 32, 118, -32, -118, 118, 32, - -118, -32, -12, 102, 12, -102, 102, -12, - -102, 12, -40, 96, 40, -96, 96, -40, - -96, 40, -34, 118, 34, -118, 118, -34, - -118, 34, -88, 88, 88, -88, -78, 104, - 78, -104, 104, -78, -104, 78, 12, 12, - -12, -12, 22, 22, -22, -22, 42, 42, - -42, -42, 72, 72, -72, -72, -]}; - -const DT_2_2: IviDeltaCB = IviDeltaCB{ quad_radix: 9, data: &[ - 0, 0, 3, 3, -3, -3, 0, 3, - 0, -3, 3, 0, -3, 0, 6, 6, - -6, -6, 3, 9, -3, -9, 9, 3, - -9, -3, -3, 9, 3, -9, 9, -3, - -9, 3, -6, 6, 6, -6, 6, 12, - -6, -12, 12, 6, -12, -6, 12, 12, - -12, -12, 0, 15, 0, -15, 15, 0, - -15, 0, -9, 12, 9, -12, 12, -9, - -12, 9, 15, 24, -15, -24, 24, 15, - -24, -15, -6, 18, 6, -18, 18, -6, - -18, 6, 6, 24, -6, -24, 24, 6, - -24, -6, 24, 24, -24, -24, 0, 27, - 0, -27, 27, 0, -27, 0, -18, 18, - 18, -18, -12, 24, 12, -24, 24, -12, - -24, 12, 15, 39, -15, -39, 39, 15, - -39, -15, 27, 42, -27, -42, 42, 27, - -42, -27, -9, 33, 9, -33, 33, -9, - -33, 9, 6, 42, -6, -42, 42, 6, - -42, -6, 45, 45, -45, -45, -3, 51, - 3, -51, 51, -3, -51, 3, -27, 33, - 27, -33, 33, -27, -33, 27, -21, 45, - 21, -45, 45, -21, -45, 21, 33, 69, - -33, -69, 69, 33, -69, -33, 18, 69, - -18, -69, 69, 18, -69, -18, 54, 72, - -54, -72, 72, 54, -72, -54, -18, 63, - 18, -63, 63, -18, -63, 18, 6, 78, - -6, -78, 78, 6, -78, -6, 81, 81, - -81, -81, -51, 51, 51, -51, -42, 63, - 42, -63, 63, -42, -63, 42, -9, 90, - 9, -90, 90, -9, -90, 9, 42, 114, - -42, -114, 114, 42, -114, -42, 63, 117, - -63, -117, 117, 63, -117, -63, -36, 81, - 36, -81, 81, -36, -81, 36, 21, 120, - -21, -120, 120, 21, -120, -21, 96, 123, - -96, -123, 123, 96, -123, -96, -30, 111, - 30, -111, 111, -30, -111, 30, -78, 93, - 78, -93, 93, -78, -93, 78, -69, 114, - 69, -114, 114, -69, -114, 69, 18, 18, - -18, -18, 33, 33, -33, -33, 63, 63, - -63, -63, 108, 108, -108, -108, -]}; - -const DT_2_3: IviDeltaCB = IviDeltaCB{ quad_radix: 10, data: &[ - 0, 0, 4, 4, -4, -4, 0, 4, - 0, -4, 4, 0, -4, 0, 4, 8, - -4, -8, 8, 4, -8, -4, 8, 8, - -8, -8, -8, 8, 8, -8, -4, 12, - 4, -12, 12, -4, -12, 4, 8, 16, - -8, -16, 16, 8, -16, -8, 16, 16, - -16, -16, 0, 20, 0, -20, 20, 0, - -20, 0, -12, 16, 12, -16, 16, -12, - -16, 12, -4, 24, 4, -24, 24, -4, - -24, 4, 16, 32, -16, -32, 32, 16, - -32, -16, 8, 32, -8, -32, 32, 8, - -32, -8, 32, 32, -32, -32, 0, 36, - 0, -36, 36, 0, -36, 0, -24, 24, - 24, -24, -16, 32, 16, -32, 32, -16, - -32, 16, 20, 52, -20, -52, 52, 20, - -52, -20, 36, 56, -36, -56, 56, 36, - -56, -36, -12, 44, 12, -44, 44, -12, - -44, 12, 8, 56, -8, -56, 56, 8, - -56, -8, 60, 60, -60, -60, -4, 64, - 4, -64, 64, -4, -64, 4, -36, 44, - 36, -44, 44, -36, -44, 36, -28, 60, - 28, -60, 60, -28, -60, 28, 44, 92, - -44, -92, 92, 44, -92, -44, 24, 92, - -24, -92, 92, 24, -92, -24, 72, 96, - -72, -96, 96, 72, -96, -72, -20, 84, - 20, -84, 84, -20, -84, 20, 8, 100, - -8, -100, 100, 8, -100, -8, 108, 108, - -108, -108, -68, 68, 68, -68, -56, 84, - 56, -84, 84, -56, -84, 56, -12, 120, - 12, -120, 120, -12, -120, 12, -48, 108, - 48, -108, 108, -48, -108, 48, -104, 124, - 104, -124, 124, -104, -124, 104, 24, 24, - -24, -24, 44, 44, -44, -44, 84, 84, - -84, -84, -]}; - -const DT_2_4: IviDeltaCB = IviDeltaCB{ quad_radix: 11, data: &[ - 0, 0, 5, 5, -5, -5, 0, 5, - 0, -5, 5, 0, -5, 0, 10, 10, - -10, -10, 5, 15, -5, -15, 15, 5, - -15, -5, -10, 10, 10, -10, -5, 15, - 5, -15, 15, -5, -15, 5, 10, 20, - -10, -20, 20, 10, -20, -10, 20, 20, - -20, -20, 0, 25, 0, -25, 25, 0, - -25, 0, -15, 20, 15, -20, 20, -15, - -20, 15, 25, 40, -25, -40, 40, 25, - -40, -25, -10, 30, 10, -30, 30, -10, - -30, 10, 10, 40, -10, -40, 40, 10, - -40, -10, 40, 40, -40, -40, 0, 45, - 0, -45, 45, 0, -45, 0, -30, 30, - 30, -30, -20, 40, 20, -40, 40, -20, - -40, 20, 25, 65, -25, -65, 65, 25, - -65, -25, 45, 70, -45, -70, 70, 45, - -70, -45, -15, 55, 15, -55, 55, -15, - -55, 15, 10, 70, -10, -70, 70, 10, - -70, -10, 75, 75, -75, -75, -5, 85, - 5, -85, 85, -5, -85, 5, -45, 55, - 45, -55, 55, -45, -55, 45, -35, 75, - 35, -75, 75, -35, -75, 35, 55, 115, - -55, -115, 115, 55, -115, -55, 30, 115, - -30, -115, 115, 30, -115, -30, 90, 120, - -90, -120, 120, 90, -120, -90, -30, 105, - 30, -105, 105, -30, -105, 30, -85, 85, - 85, -85, -70, 105, 70, -105, 105, -70, - -105, 70, 30, 30, -30, -30, 60, 60, - -60, -60, 105, 105, -105, -105, -]}; - -const DT_2_5: IviDeltaCB = IviDeltaCB{ quad_radix: 12, data: &[ - 0, 0, 6, 6, -6, -6, 0, 6, - 0, -6, 6, 0, -6, 0, 12, 12, - -12, -12, 6, 12, -6, -12, 12, 6, - -12, -6, -12, 12, 12, -12, -6, 18, - 6, -18, 18, -6, -18, 6, 12, 24, - -12, -24, 24, 12, -24, -12, 24, 24, - -24, -24, 0, 30, 0, -30, 30, 0, - -30, 0, -18, 24, 18, -24, 24, -18, - -24, 18, 30, 48, -30, -48, 48, 30, - -48, -30, -6, 36, 6, -36, 36, -6, - -36, 6, 12, 48, -12, -48, 48, 12, - -48, -12, 48, 48, -48, -48, 0, 54, - 0, -54, 54, 0, -54, 0, -36, 36, - 36, -36, -24, 48, 24, -48, 48, -24, - -48, 24, 30, 78, -30, -78, 78, 30, - -78, -30, 54, 84, -54, -84, 84, 54, - -84, -54, -18, 66, 18, -66, 66, -18, - -66, 18, 12, 84, -12, -84, 84, 12, - -84, -12, 90, 90, -90, -90, -6, 96, - 6, -96, 96, -6, -96, 6, -54, 66, - 54, -66, 66, -54, -66, 54, -42, 90, - 42, -90, 90, -42, -90, 42, -30, 126, - 30, -126, 126, -30, -126, 30, -102, 102, - 102, -102, -84, 126, 84, -126, 126, -84, - -126, 84, 36, 36, -36, -36, 66, 66, - -66, -66, -]}; - -const DT_2_6: IviDeltaCB = IviDeltaCB{ quad_radix: 12, data: &[ - 0, 0, 7, 7, -7, -7, 0, 7, - 0, -7, 7, 0, -7, 0, 14, 14, - -14, -14, 7, 21, -7, -21, 21, 7, - -21, -7, -14, 14, 14, -14, -7, 21, - 7, -21, 21, -7, -21, 7, 14, 28, - -14, -28, 28, 14, -28, -14, 28, 28, - -28, -28, 0, 35, 0, -35, 35, 0, - -35, 0, -21, 28, 21, -28, 28, -21, - -28, 21, 35, 56, -35, -56, 56, 35, - -56, -35, -14, 42, 14, -42, 42, -14, - -42, 14, 14, 56, -14, -56, 56, 14, - -56, -14, 56, 56, -56, -56, 0, 63, - 0, -63, 63, 0, -63, 0, -42, 42, - 42, -42, -28, 56, 28, -56, 56, -28, - -56, 28, 35, 91, -35, -91, 91, 35, - -91, -35, 63, 98, -63, -98, 98, 63, - -98, -63, -21, 77, 21, -77, 77, -21, - -77, 21, 14, 98, -14, -98, 98, 14, - -98, -14, 105, 105, -105, -105, -7, 119, - 7, -119, 119, -7, -119, 7, -63, 77, - 63, -77, 77, -63, -77, 63, -49, 105, - 49, -105, 105, -49, -105, 49, -119, 119, - 119, -119, 42, 42, -42, -42, 77, 77, - -77, -77, -]}; - -const DT_2_7: IviDeltaCB = IviDeltaCB{ quad_radix: 12, data: &[ - 0, 0, 8, 8, -8, -8, 0, 8, - 0, -8, 8, 0, -8, 0, 16, 16, - -16, -16, 8, 16, -8, -16, 16, 8, - -16, -8, -16, 16, 16, -16, -8, 24, - 8, -24, 24, -8, -24, 8, 16, 32, - -16, -32, 32, 16, -32, -16, 32, 32, - -32, -32, 0, 40, 0, -40, 40, 0, - -40, 0, -24, 32, 24, -32, 32, -24, - -32, 24, 40, 64, -40, -64, 64, 40, - -64, -40, -16, 48, 16, -48, 48, -16, - -48, 16, 16, 64, -16, -64, 64, 16, - -64, -16, 64, 64, -64, -64, 0, 72, - 0, -72, 72, 0, -72, 0, -48, 48, - 48, -48, -32, 64, 32, -64, 64, -32, - -64, 32, 40, 104, -40, -104, 104, 40, - -104, -40, 72, 112, -72, -112, 112, 72, - -112, -72, -24, 88, 24, -88, 88, -24, - -88, 24, 16, 112, -16, -112, 112, 16, - -112, -16, 120, 120, -120, -120, -72, 88, - 72, -88, 88, -72, -88, 72, -56, 120, - 56, -120, 120, -56, -120, 56, 48, 48, - -48, -48, 88, 88, -88, -88, -]}; - -const DT_2_8: IviDeltaCB = IviDeltaCB{ quad_radix: 13, data: &[ - 0, 0, 9, 9, -9, -9, 0, 9, - 0, -9, 9, 0, -9, 0, 18, 18, - -18, -18, 9, 27, -9, -27, 27, 9, - -27, -9, -18, 18, 18, -18, -9, 27, - 9, -27, 27, -9, -27, 9, 18, 36, - -18, -36, 36, 18, -36, -18, 36, 36, - -36, -36, 0, 45, 0, -45, 45, 0, - -45, 0, -27, 36, 27, -36, 36, -27, - -36, 27, 45, 72, -45, -72, 72, 45, - -72, -45, -18, 54, 18, -54, 54, -18, - -54, 18, 18, 72, -18, -72, 72, 18, - -72, -18, 72, 72, -72, -72, 0, 81, - 0, -81, 81, 0, -81, 0, -54, 54, - 54, -54, -36, 72, 36, -72, 72, -36, - -72, 36, 45, 117, -45, -117, 117, 45, - -117, -45, 81, 126, -81, -126, 126, 81, - -126, -81, -27, 99, 27, -99, 99, -27, - -99, 27, -81, 99, 81, -99, 99, -81, - -99, 81, 54, 54, -54, -54, 108, 108, - -108, -108, -]}; - -const DT_3_1: IviDeltaCB = IviDeltaCB{ quad_radix: 11, data: &[ - 0, 0, 2, 2, -2, -2, 0, 3, - 0, -3, 3, 0, -3, 0, 6, 6, - -6, -6, 0, 7, 0, -7, 7, 0, - -7, 0, -5, 5, 5, -5, 5, -5, - -5, 5, 6, 11, -6, -11, 11, 6, - -11, -6, 0, 8, 0, -8, 8, 0, - -8, 0, 11, 11, -11, -11, 0, 12, - 0, -12, 12, 0, -12, 0, 12, 17, - -12, -17, 17, 12, -17, -12, 17, 17, - -17, -17, 6, 18, -6, -18, 18, 6, - -18, -6, -8, 11, 8, -11, 11, -8, - -11, 8, 0, 15, 0, -15, 15, 0, - -15, 0, 0, 20, 0, -20, 20, 0, - -20, 0, 18, 25, -18, -25, 25, 18, - -25, -18, 11, 25, -11, -25, 25, 11, - -25, -11, 25, 25, -25, -25, -14, 14, - 14, -14, 14, -14, -14, 14, 0, 26, - 0, -26, 26, 0, -26, 0, -11, 18, - 11, -18, 18, -11, -18, 11, -7, 22, - 7, -22, 22, -7, -22, 7, 26, 34, - -26, -34, 34, 26, -34, -26, 18, 34, - -18, -34, 34, 18, -34, -18, 34, 34, - -34, -34, 11, 35, -11, -35, 35, 11, - -35, -11, 0, 29, 0, -29, 29, 0, - -29, 0, -19, 22, 19, -22, 22, -19, - -22, 19, -15, 26, 15, -26, 26, -15, - -26, 15, 0, 37, 0, -37, 37, 0, - -37, 0, 27, 44, -27, -44, 44, 27, - -44, -27, 36, 44, -36, -44, 44, 36, - -44, -36, 18, 44, -18, -44, 44, 18, - -44, -18, -10, 33, 10, -33, 33, -10, - -33, 10, 45, 45, -45, -45, 0, 0, -]}; - -const DT_3_2: IviDeltaCB = IviDeltaCB{ quad_radix: 13, data: &[ - 0, 0, 0, 2, 0, -2, 2, 0, - -2, 0, 2, 2, -2, -2, 6, 6, - -6, -6, 0, 6, 0, -6, 6, 0, - -6, 0, -4, 4, 4, -4, 10, -6, - -10, 6, 0, -12, 0, 12, -6, -12, - 6, -12, -6, 12, 6, 12, -14, 0, - 14, 0, 12, 12, -12, -12, 0, -18, - 0, 18, 14, -12, -14, 12, -18, -6, - 18, -6, -18, 6, 18, 6, -10, -18, - 10, -18, -10, 18, 10, 18, -22, 0, - 22, 0, 0, -24, 0, 24, -22, -12, - 22, -12, -22, 12, 22, 12, -8, -24, - 8, -24, -8, 24, 8, 24, -26, -6, - 26, -6, -26, 6, 26, 6, -28, 0, - 28, 0, 20, 20, -20, -20, -14, -26, - 14, 26, -30, -12, 30, 12, -10, -32, - 10, 32, -18, -32, 18, 32, -26, -26, - 26, 26, -34, -20, 34, 20, -38, -12, - 38, 12, -32, -32, 32, 32, 32, 32, - -22, -40, -34, -34, 34, 34, -]}; - -const DT_3_3: IviDeltaCB = IviDeltaCB{ quad_radix: 13, data: &[ - 0, 0, 0, 2, 0, -2, 2, 0, - -2, 0, 4, 4, -4, -4, 10, 10, - -10, -10, 0, 10, 0, -10, 10, 0, - -10, 0, -6, 6, 6, -6, 14, -8, - -14, 8, -18, 0, 18, 0, 10, -16, - -10, 16, 0, -24, 0, 24, -24, -8, - 24, -8, -24, 8, 24, 8, 18, 18, - -18, -18, 20, -16, -20, 16, -14, -26, - 14, -26, -14, 26, 14, 26, -30, 0, - 30, 0, 0, -34, 0, 34, -34, -8, - 34, -8, -34, 8, 34, 8, -30, -18, - 30, -18, -30, 18, 30, 18, -10, -34, - 10, -34, -10, 34, 10, 34, -20, -34, - 20, 34, -40, 0, 40, 0, 30, 30, - -30, -30, -40, -18, 40, 18, 0, -44, - 0, 44, -16, -44, 16, 44, -36, -36, - -36, -36, 36, 36, -26, -44, 26, 44, - -46, -26, 46, 26, -52, -18, 52, 18, - -20, -54, -44, -44, 44, 44, -32, -54, - -46, -46, -46, -46, 46, 46, -]}; - -const DT_3_4: IviDeltaCB = IviDeltaCB{ quad_radix: 13, data: &[ - 0, 0, 0, 4, 0, -4, 4, 0, - -4, 0, 4, 4, -4, -4, 12, 12, - -12, -12, 0, 12, 0, -12, 12, 0, - -12, 0, -8, 8, 8, -8, 8, -16, - -8, 16, 0, -24, 0, 24, -24, -8, - 24, -8, -24, 8, 24, 8, 20, -16, - -20, 16, -28, 0, 28, 0, -16, -24, - 16, -24, -16, 24, 16, 24, 0, -32, - 0, 32, -28, -16, 28, -16, -28, 16, - 28, 16, -8, -32, 8, -32, -32, -8, - 32, -8, -32, 8, 32, 8, -8, 32, - 8, 32, 24, 24, -24, -24, 24, -24, - -24, 24, -20, -32, 20, 32, -40, 0, - 40, 0, -40, -16, 40, 16, 0, -44, - 0, -44, -44, 0, 44, 0, 0, 44, - 0, 44, -32, -32, 32, 32, -16, -44, - 16, 44, -24, -44, -44, -24, 44, 24, - 24, 44, -48, -16, 48, 16, -36, -36, - -36, -36, 36, 36, 36, 36, -20, -52, - 40, 40, -40, -40, -32, -52, -]}; - -const DT_3_5: IviDeltaCB = IviDeltaCB{ quad_radix: 13, data: &[ - 0, 0, 2, 2, -2, -2, 6, 6, - -6, -6, 12, 12, -12, -12, 20, 20, - -20, -20, 32, 32, -32, -32, 46, 46, - -46, -46, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, -]}; - -const IVI3_DELTA_CBS: [&IviDeltaCB; 24] = [ - &DT_1_1, &DT_1_2, &DT_1_3, &DT_1_4, &DT_1_5, &DT_1_6, &DT_1_7, &DT_1_8, - &DT_2_1, &DT_2_2, &DT_2_3, &DT_2_4, &DT_2_5, &DT_2_6, &DT_2_7, &DT_2_8, - &DT_3_1, &DT_3_2, &DT_3_3, &DT_3_4, &DT_3_5, &DT_3_5, &DT_3_5, &DT_3_5 -]; diff --git a/src/codecs/indeo/indeo4.rs b/src/codecs/indeo/indeo4.rs deleted file mode 100644 index 773b177..0000000 --- a/src/codecs/indeo/indeo4.rs +++ /dev/null @@ -1,773 +0,0 @@ -use std::cell::Ref; -use crate::io::bitreader::*; -use crate::formats; -use super::super::*; -use super::ivi::*; -use super::ivibr::*; - -#[inline(always)] -fn mclip8(a: i32) -> u8 { - if (a as u16) > 255 { !(a >> 16) as u8 } - else { a as u8 } -} - -struct Indeo4Parser { - mb_cb: IVICodebook, - blk_cb: IVICodebook, -} - -fn calc_quant(glob_q: u32, qd: i16) -> u8 { - let q = (glob_q as i16) + qd; - if q < 0 { - 0 - } else if q > 31 { - 31 - } else { - q as u8 - } -} - -impl Indeo4Parser { - fn new() -> Self { - Indeo4Parser { - mb_cb: IVI_CB_ZERO, - blk_cb: IVI_CB_ZERO, - } - } -} - -impl IndeoXParser for Indeo4Parser { -#[allow(unused_variables,unused_assignments)] - fn decode_picture_header(&mut self, br: &mut BitReader) -> DecoderResult<PictureHeader> { - let sync = br.read(18)?; - validate!(sync == 0x3FFF8); - let ftype_idx = br.read(3)?; - validate!(ftype_idx < 7); - let ftype = INDEO4_FRAME_TYPE[ftype_idx as usize]; - let transparent = br.read_bool()?; - br.skip(1)?; - let data_size; - if br.read_bool()? { - data_size = br.read(24)? as usize; - } else { - data_size = 0; - } - if ftype.is_null() { - return Ok(PictureHeader::new_null(ftype)); - } - if br.read_bool()? { - br.skip(32)?; // key lock - } - let width; - let height; - let pic_size_idx = br.read(3)?; - if pic_size_idx < 7 { - width = INDEO4_PICTURE_SIZE_TAB[pic_size_idx as usize][0]; - height = INDEO4_PICTURE_SIZE_TAB[pic_size_idx as usize][1]; - } else { - height = br.read(16)? as usize; - width = br.read(16)? as usize; - validate!((width > 0) && ((width & 3) == 0)); - validate!((height > 0) && ((height & 3) == 0)); - } - - let slice_w; - let slice_h; - if br.read_bool()? { - let idx = br.read(4)? as usize; - if idx < 15 { - slice_w = INDEO4_SLICE_SIZE_TAB[idx]; - slice_h = INDEO4_SLICE_SIZE_TAB[idx]; - } else { - slice_w = width; - slice_h = height; - } - } else { - slice_w = width; - slice_h = height; - } - let subsampling = br.read(2)?; - validate!(subsampling == 0); - let sc_idx = br.read(2)?; - match sc_idx { - 3 => { }, - 2 => { validate!(br.read(2*4)? == 0xFF); } - _ => { return Err(DecoderError::InvalidData); } - }; - let luma_bands = if sc_idx == 2 { 4 } else { 1 }; - let sc_idx = br.read(2)?; - match sc_idx { - 3 => { }, - 2 => { validate!(br.read(2*4)? == 0xFF); } - _ => { return Err(DecoderError::InvalidData); } - }; - let chroma_bands = if sc_idx == 2 { 4 } else { 1 }; - let frame_no; - if br.read_bool()? { - frame_no = br.read(20)?; - } else { - frame_no = 0; - } - if br.read_bool()? { - br.skip(8)?; // decTimeEst - } - let desc_coded = br.read_bool()?; - self.mb_cb = br.read_ivi_codebook_desc(true, desc_coded)?; - let desc_coded = br.read_bool()?; - self.blk_cb = br.read_ivi_codebook_desc(false, desc_coded)?; - let rvmap = if br.read_bool()? { br.read(3)? as usize } else { 8 }; - let in_imf = br.read_bool()?; - let in_q = br.read_bool()?; - let glob_q = br.read(5)? as u8; - if br.read_bool()? { - br.skip(3)?; - } - let checksum = if br.read_bool()? { br.read(16)? } else { 0 }; - if br.read_bool()? { - br.skip(8)?; // pic hdr extension - } - if br.read_bool()? { - println!("bad blocks bits!"); - } - br.align(); - - Ok(PictureHeader::new(ftype, width, height, slice_w, slice_h, transparent, luma_bands, chroma_bands, in_q)) - } - -#[allow(unused_variables,unused_assignments)] - fn decode_band_header(&mut self, br: &mut BitReader, pic_hdr: &PictureHeader, plane: usize, band: usize) -> DecoderResult<BandHeader> { - let plane_no = br.read(2)? as usize; - let band_no = br.read(4)? as usize; - validate!(plane_no == plane); - validate!(band_no == band); - if br.read_bool()? { - br.align(); - return Ok(BandHeader::new_empty(plane_no, band_no)); - } - let hdr_size; - if br.read_bool()? { - hdr_size = br.read(16)? as usize; - } else { - hdr_size = 32; - } - let mv_mode = br.read(2)?; - validate!(mv_mode < 2); - if br.read_bool()? { - br.skip(16)?; //checksum - } - - let scale = br.read(2)?; - validate!(scale != 3); - let mb_size = 16 >> scale; - let blk_size = 8 >> (scale >> 1); - let inherit_mv = br.read_bool()?; - let inherit_qd = br.read_bool()?; - let quant = br.read(5)?; - - let tr: IVITransformType; - let txtype: TxType; - if !br.read_bool()? || pic_hdr.ftype == IVIFrameType::Intra { - let tr_id = br.read(5)?; - validate!(tr_id < 18); - let scan_idx = br.read(4)? as usize; - validate!(scan_idx != 15); - let qmat_idx = br.read(5)? as usize; - - tr = INDEO4_TRANSFORMS[tr_id as usize]; - if (scan_idx < 5) || (scan_idx >= 10) { - validate!(tr.is_8x8()); - validate!(qmat_idx < 15); - let scan = if scan_idx < 5 { INDEO4_SCANS_8X8[scan_idx] } - else { INDEO4_SCANS_8X8[4] }; - let qidx = INDEO4_Q8X8_IDX[qmat_idx]; - let qintra = INDEO4_Q8_INTRA[qidx]; - let qinter = INDEO4_Q8_INTER[qidx]; - txtype = TxType::Transform8(TxParams8x8::new(qintra, qinter, scan)); - } else if scan_idx < 10 { - validate!(!tr.is_8x8()); - validate!((qmat_idx >= 15) && (qmat_idx < 22)); - let scan = INDEO4_SCANS_4X4[scan_idx - 5]; - let qidx = INDEO4_Q4X4_IDX[qmat_idx - 15]; - let qintra = INDEO4_Q4_INTRA[qidx]; - let qinter = INDEO4_Q4_INTER[qidx]; - txtype = TxType::Transform4(TxParams4x4::new(qintra, qinter, scan)); - } else { - unreachable!(); - } - } else { - tr = IVITransformType::None(TSize::T8x8); - txtype = TxType::None; - } - - let blk_cb; - if br.read_bool()? { - blk_cb = br.read_ivi_codebook_desc(false, true)?; - } else { - blk_cb = self.blk_cb; - } - let rvmap_idx; - if br.read_bool()? { - rvmap_idx = br.read(3)? as usize; - } else { - rvmap_idx = 8; - } - let num_corr; - let mut corr_map: [u8; CORR_MAP_SIZE] = [0; CORR_MAP_SIZE]; - if br.read_bool()? { - num_corr = br.read(8)? as usize; - validate!(num_corr*2 <= CORR_MAP_SIZE); - for i in 0..num_corr*2 { - corr_map[i] = br.read(8)? as u8; - } - } else { - num_corr = 0; - } - - br.align(); - Ok(BandHeader::new(plane_no, band_no, mb_size, blk_size, mv_mode == 1, inherit_mv, false, inherit_qd, quant, rvmap_idx, num_corr, corr_map, blk_cb, tr, txtype)) - } - - fn decode_mb_info(&mut self, br: &mut BitReader, pic_hdr: &PictureHeader, band: &BandHeader, tile: &mut IVITile, ref_tile: Option<Ref<IVITile>>, mv_scale: u8) -> DecoderResult<()> { - let mut mv_x = 0; - let mut mv_y = 0; - let mut mb_idx = 0; - - for mb_y in 0..tile.mb_h { - for mb_x in 0..tile.mb_w { - let mut mb = MB::new(tile.pos_x + mb_x * band.mb_size, tile.pos_y + mb_y * band.mb_size); - if !br.read_bool()? { - if pic_hdr.ftype.is_intra() { - mb.mtype = MBType::Intra; - } else if band.inherit_mv { - if let Some(ref tileref) = ref_tile { - mb.mtype = tileref.mb[mb_idx].mtype; - } else { - return Err(DecoderError::MissingReference); - } - } else { - if !pic_hdr.ftype.is_bidir() { - mb.mtype = if br.read_bool()? { MBType::Inter } else { MBType::Intra }; - } else { - mb.mtype = match br.read(2)? { - 0 => { MBType::Intra }, - 1 => { MBType::Inter }, - 2 => { MBType::Backward }, - _ => { MBType::Bidir }, - }; - } - } - if band.mb_size == band.blk_size { - mb.cbp = br.read(1)? as u8; - } else { - mb.cbp = br.read(4)? as u8; - } - if band.inherit_qd { - if let Some(ref tileref) = ref_tile { - mb.qd = tileref.mb[mb_idx].qd; - mb.q = calc_quant(band.quant, mb.qd); - } else { - mb.q = band.quant as u8; - } - } else if (mb.cbp != 0) || ((band.plane_no == 0) && (band.band_no == 0) && pic_hdr.in_q) { - mb.qd = br.read_ivi_cb_s(&self.mb_cb)? as i16; - mb.q = calc_quant(band.quant, mb.qd); - } else { - mb.q = band.quant as u8; - } - - if mb.mtype != MBType::Intra { - if band.inherit_mv { - if let Some(ref tileref) = ref_tile { - let mx = tileref.mb[mb_idx].mv_x; - let my = tileref.mb[mb_idx].mv_y; - if mv_scale == 0 { - mb.mv_x = mx; - mb.mv_y = my; - } else { - mb.mv_x = scale_mv(mx, mv_scale); - mb.mv_y = scale_mv(my, mv_scale); - } - } - } else { - mv_y += br.read_ivi_cb_s(&self.mb_cb)?; - mv_x += br.read_ivi_cb_s(&self.mb_cb)?; - mb.mv_x = mv_x; - mb.mv_y = mv_y; - if mb.mtype == MBType::Backward { - mb.mv_x = -mb.mv_x; - mb.mv_y = -mb.mv_y; - } else if mb.mtype == MBType::Bidir { - mv_y += br.read_ivi_cb_s(&self.mb_cb)?; - mv_x += br.read_ivi_cb_s(&self.mb_cb)?; - mb.mv2_x = -mv_x; - mb.mv2_y = -mv_y; - } - } - } - } else { - validate!(!pic_hdr.ftype.is_intra()); - mb.mtype = MBType::Inter; - mb.cbp = 0; - mb.qd = 0; - if (band.plane_no == 0) && (band.band_no == 0) && pic_hdr.in_q { - mb.qd = br.read_ivi_cb_s(&self.mb_cb)? as i16; - mb.q = calc_quant(band.quant, mb.qd); - } - if band.inherit_mv { - if let Some(ref tileref) = ref_tile { - let mx = tileref.mb[mb_idx].mv_x; - let my = tileref.mb[mb_idx].mv_y; - if mv_scale == 0 { - mb.mv_x = mx; - mb.mv_y = my; - } else { - mb.mv_x = scale_mv(mx, mv_scale); - mb.mv_y = scale_mv(my, mv_scale); - } - } - } - } - tile.mb[mb_idx] = mb; - mb_idx += 1; - } - } - br.align(); - Ok(()) - } - - fn recombine_plane(&mut self, src: &[i16], sstride: usize, dst: &mut [u8], dstride: usize, w: usize, h: usize) { -/* let mut idx0 = 0; - let mut idx1 = w / 2; - let mut idx2 = (h / 2) * sstride; - let mut idx3 = idx2 + idx1; - let mut oidx0 = 0; - let mut oidx1 = dstride; - - for _ in 0..(h/2) { - for x in 0..(w/2) { - let p0 = src[idx0 + x]; - let p1 = src[idx1 + x]; - let p2 = src[idx2 + x]; - let p3 = src[idx3 + x]; - let s0 = p0 + p2; - let d0 = p0 - p2; - let s1 = p1 + p3; - let d1 = p1 - p3; - dst[oidx0 + x * 2 + 0] = clip8(((s0 + s1 + 2) >> 2) + 128); - dst[oidx0 + x * 2 + 1] = clip8(((d0 + d1 + 2) >> 2) + 128); - dst[oidx1 + x * 2 + 0] = clip8(((s0 - s1 + 2) >> 2) + 128); - dst[oidx1 + x * 2 + 1] = clip8(((d0 - d1 + 2) >> 2) + 128); - } - idx0 += sstride; - idx1 += sstride; - idx2 += sstride; - idx3 += sstride; - oidx0 += dstride * 2; - oidx1 += dstride * 2; - }*/ - unsafe { - let hw = (w / 2) as isize; - let hh = (h / 2) as isize; - let mut band0 = src.as_ptr(); - let mut band1 = band0.offset(hw); - let mut band2 = band0.offset(((h / 2) * sstride) as isize); - let mut band3 = band2.offset(hw); - let mut dst0 = dst.as_mut_ptr(); - let mut dst1 = dst0.offset(dstride as isize); - for _ in 0..hh { - let mut b0_ptr = band0; - let mut b1_ptr = band1; - let mut b2_ptr = band2; - let mut b3_ptr = band3; - let mut d0_ptr = dst0; - let mut d1_ptr = dst1; - for _ in 0..hw { - let p0 = *b0_ptr as i32; - let p1 = *b1_ptr as i32; - let p2 = *b2_ptr as i32; - let p3 = *b3_ptr as i32; - let s0 = p0.wrapping_add(p2); - let s1 = p1.wrapping_add(p3); - let d0 = p0.wrapping_sub(p2); - let d1 = p1.wrapping_sub(p3); - let o0 = s0.wrapping_add(s1).wrapping_add(2); - let o1 = d0.wrapping_add(d1).wrapping_add(2); - let o2 = s0.wrapping_sub(s1).wrapping_add(2); - let o3 = d0.wrapping_sub(d1).wrapping_add(2); - *d0_ptr.offset(0) = mclip8((o0 >> 2).wrapping_add(128)); - *d0_ptr.offset(1) = mclip8((o1 >> 2).wrapping_add(128)); - *d1_ptr.offset(0) = mclip8((o2 >> 2).wrapping_add(128)); - *d1_ptr.offset(1) = mclip8((o3 >> 2).wrapping_add(128)); - b0_ptr = b0_ptr.offset(1); - b1_ptr = b1_ptr.offset(1); - b2_ptr = b2_ptr.offset(1); - b3_ptr = b3_ptr.offset(1); - d0_ptr = d0_ptr.offset(2); - d1_ptr = d1_ptr.offset(2); - } - band0 = band0.offset(sstride as isize); - band1 = band1.offset(sstride as isize); - band2 = band2.offset(sstride as isize); - band3 = band3.offset(sstride as isize); - dst0 = dst0.offset((dstride * 2) as isize); - dst1 = dst1.offset((dstride * 2) as isize); - } - } - } -} - -struct Indeo4Decoder { - info: Rc<NACodecInfo>, - dec: IVIDecoder, -} - -impl Indeo4Decoder { - fn new() -> Self { - Indeo4Decoder { - info: NACodecInfo::new_dummy(), - dec: IVIDecoder::new(), - } - } -} - -impl NADecoder for Indeo4Decoder { - fn init(&mut self, info: Rc<NACodecInfo>) -> DecoderResult<()> { - if let NACodecTypeInfo::Video(vinfo) = info.get_properties() { - let w = vinfo.get_width(); - let h = vinfo.get_height(); - let f = vinfo.is_flipped(); - let fmt = formats::YUV410_FORMAT; - let myinfo = NACodecTypeInfo::Video(NAVideoInfo::new(w, h, f, fmt)); - self.info = Rc::new(NACodecInfo::new_ref(info.get_name(), myinfo, info.get_extradata())); - Ok(()) - } else { - Err(DecoderError::InvalidData) - } - } - fn decode(&mut self, pkt: &NAPacket) -> DecoderResult<NAFrameRef> { - let src = pkt.get_buffer(); - let mut br = BitReader::new(src.as_slice(), src.len(), BitReaderMode::LE); - - let mut ip = Indeo4Parser::new(); - let bufinfo = self.dec.decode_frame(&mut ip, &mut br)?; - let mut frm = NAFrame::new_from_pkt(pkt, self.info.clone(), bufinfo); - frm.set_keyframe(self.dec.is_intra()); - frm.set_frame_type(self.dec.get_frame_type()); - Ok(Rc::new(RefCell::new(frm))) - } -} - -const INDEO4_PICTURE_SIZE_TAB: [[usize; 2]; 7] = [ - [640, 480], [320, 240], [160, 120], [704, 480], [352, 240], [352, 288], [176, 144] -]; - -const INDEO4_SLICE_SIZE_TAB: [usize; 15] = [ - 32, 64, 96, 128, 160, 192, 224, 256, 288, 320, 352, 384, 416, 448, 480 -]; - -const INDEO4_FRAME_TYPE: [IVIFrameType; 7] = [ - IVIFrameType::Intra, IVIFrameType::Intra1, IVIFrameType::Inter, IVIFrameType::Bidir, - IVIFrameType::InterDroppable, IVIFrameType::NULL, IVIFrameType::NULL2 -]; - -const INDEO4_TRANSFORMS: [IVITransformType; 18] = [ - IVITransformType::Haar(TSize::T8x8, TDir::TwoD), - IVITransformType::Haar(TSize::T8x8, TDir::Row), - IVITransformType::Haar(TSize::T8x8, TDir::Col), - IVITransformType::None(TSize::T8x8), - IVITransformType::Slant(TSize::T8x8, TDir::TwoD), - IVITransformType::Slant(TSize::T8x8, TDir::Row), - IVITransformType::Slant(TSize::T8x8, TDir::Col), - IVITransformType::DCT(TSize::T8x8, TDir::TwoD), - IVITransformType::DCT(TSize::T8x8, TDir::Row), - IVITransformType::DCT(TSize::T8x8, TDir::Col), - IVITransformType::Haar(TSize::T4x4, TDir::TwoD), - IVITransformType::Slant(TSize::T4x4, TDir::TwoD), - IVITransformType::None(TSize::T4x4), - IVITransformType::Haar(TSize::T4x4, TDir::Row), - IVITransformType::Haar(TSize::T4x4, TDir::Col), - IVITransformType::Slant(TSize::T4x4, TDir::Row), - IVITransformType::Slant(TSize::T4x4, TDir::Col), - IVITransformType::DCT(TSize::T4x4, TDir::TwoD), -]; - -const INDEO4_SCAN_8X8_ALT: [usize; 64] = [ - 0, 8, 1, 9, 16, 24, 2, 3, - 17, 25, 10, 11, 32, 40, 48, 56, - 4, 5, 6, 7, 33, 41, 49, 57, - 18, 19, 26, 27, 12, 13, 14, 15, - 34, 35, 43, 42, 50, 51, 59, 58, - 20, 21, 22, 23, 31, 30, 29, 28, - 36, 37, 38, 39, 47, 46, 45, 44, - 52, 53, 54, 55, 63, 62, 61, 60 -]; -const INDEO4_SCAN_4X4_ALT: [usize; 16] = [ 0, 1, 4, 5, 8, 12, 2, 3, 9, 13, 6, 7, 10, 11, 14, 15 ]; -const INDEO4_SCAN_4X4_VER: [usize; 16] = [ 0, 4, 8, 12, 1, 5, 9, 13, 2, 6, 10, 14, 3, 7, 11, 15 ]; -const INDEO4_SCAN_4X4_HOR: [usize; 16] = [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 ]; - -const INDEO4_SCANS_8X8: [&[usize; 64]; 5] = [ - &IVI_ZIGZAG, &INDEO4_SCAN_8X8_ALT, &IVI_SCAN_8X8_HOR, &IVI_SCAN_8X8_VER, &IVI_ZIGZAG -]; -const INDEO4_SCANS_4X4: [&[usize; 16]; 5] = [ - &IVI_SCAN_4X4, &INDEO4_SCAN_4X4_ALT, &INDEO4_SCAN_4X4_VER, &INDEO4_SCAN_4X4_HOR, &IVI_SCAN_4X4 -]; - -const INDEO4_Q8X8_IDX: [usize; 15] = [ 0, 1, 0, 2, 1, 3, 0, 4, 1, 5, 0, 1, 6, 7, 8 ]; -const INDEO4_Q4X4_IDX: [usize; 7] = [ 0, 1, 2, 2, 3, 3, 4 ]; - -const INDEO4_QUANT8X8_INTRA: [[u16; 64]; 9] = [ - [ - 43, 342, 385, 470, 555, 555, 598, 726, - 342, 342, 470, 513, 555, 598, 726, 769, - 385, 470, 555, 555, 598, 726, 726, 811, - 470, 470, 555, 555, 598, 726, 769, 854, - 470, 555, 555, 598, 683, 726, 854, 1025, - 555, 555, 598, 683, 726, 854, 1025, 1153, - 555, 555, 598, 726, 811, 982, 1195, 1451, - 555, 598, 726, 811, 982, 1195, 1451, 1793 - ], [ - 86, 1195, 2390, 2390, 4865, 4865, 4865, 4865, - 1195, 1195, 2390, 2390, 4865, 4865, 4865, 4865, - 2390, 2390, 4865, 4865, 6827, 6827, 6827, 6827, - 2390, 2390, 4865, 4865, 6827, 6827, 6827, 6827, - 4865, 4865, 6827, 6827, 6827, 6827, 6827, 6827, - 4865, 4865, 6827, 6827, 6827, 6827, 6827, 6827, - 4865, 4865, 6827, 6827, 6827, 6827, 6827, 6827, - 4865, 4865, 6827, 6827, 6827, 6827, 6827, 6827 - ], [ - 235, 1067, 1195, 1323, 1451, 1579, 1707, 1835, - 235, 1067, 1195, 1323, 1451, 1579, 1707, 1835, - 235, 1067, 1195, 1323, 1451, 1579, 1707, 1835, - 235, 1067, 1195, 1323, 1451, 1579, 1707, 1835, - 235, 1067, 1195, 1323, 1451, 1579, 1707, 1835, - 235, 1067, 1195, 1323, 1451, 1579, 1707, 1835, - 235, 1067, 1195, 1323, 1451, 1579, 1707, 1835, - 235, 1067, 1195, 1323, 1451, 1579, 1707, 1835 - ], [ - 1707, 1707, 3414, 3414, 3414, 3414, 3414, 3414, - 1707, 1707, 3414, 3414, 3414, 3414, 3414, 3414, - 1707, 1707, 3414, 3414, 3414, 3414, 3414, 3414, - 1707, 1707, 3414, 3414, 3414, 3414, 3414, 3414, - 1707, 1707, 3414, 3414, 3414, 3414, 3414, 3414, - 1707, 1707, 3414, 3414, 3414, 3414, 3414, 3414, - 1707, 1707, 3414, 3414, 3414, 3414, 3414, 3414, - 1707, 1707, 3414, 3414, 3414, 3414, 3414, 3414 - ], [ - 897, 897, 897, 897, 897, 897, 897, 897, - 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, - 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, - 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, - 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, - 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, - 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, - 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091 - ], [ - 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, - 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, - 3414, 3414, 3414, 3414, 3414, 3414, 3414, 3414, - 3414, 3414, 3414, 3414, 3414, 3414, 3414, 3414, - 3414, 3414, 3414, 3414, 3414, 3414, 3414, 3414, - 3414, 3414, 3414, 3414, 3414, 3414, 3414, 3414, - 3414, 3414, 3414, 3414, 3414, 3414, 3414, 3414, - 3414, 3414, 3414, 3414, 3414, 3414, 3414, 3414 - ], [ - 2390, 2390, 2390, 2390, 2390, 2390, 2390, 2390, - 2390, 2390, 2390, 2390, 2390, 2390, 2390, 2390, - 2390, 2390, 2390, 2390, 2390, 2390, 2390, 2390, - 2390, 2390, 2390, 2390, 2390, 2390, 2390, 2390, - 2390, 2390, 2390, 2390, 2390, 2390, 2390, 2390, - 2390, 2390, 2390, 2390, 2390, 2390, 2390, 2390, - 2390, 2390, 2390, 2390, 2390, 2390, 2390, 2390, - 2390, 2390, 2390, 2390, 2390, 2390, 2390, 2390 - ], [ - 22, 171, 214, 257, 257, 299, 299, 342, - 171, 171, 257, 257, 299, 299, 342, 385, - 214, 257, 257, 299, 299, 342, 342, 385, - 257, 257, 257, 299, 299, 342, 385, 427, - 257, 257, 299, 299, 342, 385, 427, 513, - 257, 299, 299, 342, 385, 427, 513, 598, - 299, 299, 299, 385, 385, 470, 598, 726, - 299, 299, 385, 385, 470, 598, 726, 897 - ], [ - 86, 598, 1195, 1195, 2390, 2390, 2390, 2390, - 598, 598, 1195, 1195, 2390, 2390, 2390, 2390, - 1195, 1195, 2390, 2390, 3414, 3414, 3414, 3414, - 1195, 1195, 2390, 2390, 3414, 3414, 3414, 3414, - 2390, 2390, 3414, 3414, 3414, 3414, 3414, 3414, - 2390, 2390, 3414, 3414, 3414, 3414, 3414, 3414, - 2390, 2390, 3414, 3414, 3414, 3414, 3414, 3414, - 2390, 2390, 3414, 3414, 3414, 3414, 3414, 3414 - ] -]; -const INDEO4_QUANT8X8_INTER: [[u16; 64]; 9] = [ - [ - 427, 427, 470, 427, 427, 427, 470, 470, - 427, 427, 470, 427, 427, 427, 470, 470, - 470, 470, 470, 470, 470, 470, 470, 470, - 427, 427, 470, 470, 427, 427, 470, 470, - 427, 427, 470, 427, 427, 427, 470, 470, - 427, 427, 470, 427, 427, 427, 470, 470, - 470, 470, 470, 470, 470, 470, 470, 470, - 470, 470, 470, 470, 470, 470, 470, 470 - ], [ - 1707, 1707, 2433, 2433, 3414, 3414, 3414, 3414, - 1707, 1707, 2433, 2433, 3414, 3414, 3414, 3414, - 2433, 2433, 3414, 3414, 4822, 4822, 4822, 4822, - 2433, 2433, 3414, 3414, 4822, 4822, 4822, 4822, - 3414, 3414, 4822, 4822, 3414, 3414, 3414, 3414, - 3414, 3414, 4822, 4822, 3414, 3414, 3414, 3414, - 3414, 3414, 4822, 4822, 3414, 3414, 3414, 3414, - 3414, 3414, 4822, 4822, 3414, 3414, 3414, 3414 - ], [ - 1195, 1195, 1281, 1238, 1195, 1195, 1281, 1281, - 1195, 1195, 1281, 1238, 1195, 1195, 1281, 1281, - 1195, 1195, 1281, 1238, 1195, 1195, 1281, 1281, - 1195, 1195, 1281, 1238, 1195, 1195, 1281, 1281, - 1195, 1195, 1281, 1238, 1195, 1195, 1281, 1281, - 1195, 1195, 1281, 1238, 1195, 1195, 1281, 1281, - 1195, 1195, 1281, 1238, 1195, 1195, 1281, 1281, - 1195, 1195, 1281, 1238, 1195, 1195, 1281, 1281 - ], [ - 2433, 2433, 3414, 3414, 2433, 2433, 2433, 2433, - 2433, 2433, 3414, 3414, 2433, 2433, 2433, 2433, - 2433, 2433, 3414, 3414, 2433, 2433, 2433, 2433, - 2433, 2433, 3414, 3414, 2433, 2433, 2433, 2433, - 2433, 2433, 3414, 3414, 2433, 2433, 2433, 2433, - 2433, 2433, 3414, 3414, 2433, 2433, 2433, 2433, - 2433, 2433, 3414, 3414, 2433, 2433, 2433, 2433, - 2433, 2433, 3414, 3414, 2433, 2433, 2433, 2433 - ], [ - 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, - 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, - 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, - 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, - 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, - 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, - 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, - 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281 - ], [ - 2433, 2433, 2433, 2433, 2433, 2433, 2433, 2433, - 2433, 2433, 2433, 2433, 2433, 2433, 2433, 2433, - 3414, 3414, 3414, 3414, 3414, 3414, 3414, 3414, - 3414, 3414, 3414, 3414, 3414, 3414, 3414, 3414, - 2433, 2433, 2433, 2433, 2433, 2433, 2433, 2433, - 2433, 2433, 2433, 2433, 2433, 2433, 2433, 2433, - 2433, 2433, 2433, 2433, 2433, 2433, 2433, 2433, - 2433, 2433, 2433, 2433, 2433, 2433, 2433, 2433 - ], [ - 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, - 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, - 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, - 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, - 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, - 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, - 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, - 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707 - ], [ - 86, 171, 171, 214, 214, 214, 214, 257, - 171, 171, 214, 214, 214, 214, 257, 257, - 171, 214, 214, 214, 214, 257, 257, 257, - 214, 214, 214, 214, 257, 257, 257, 299, - 214, 214, 214, 257, 257, 257, 299, 299, - 214, 214, 257, 257, 257, 299, 299, 299, - 214, 257, 257, 257, 299, 299, 299, 342, - 257, 257, 257, 299, 299, 299, 342, 342 - ], [ - 854, 854, 1195, 1195, 1707, 1707, 1707, 1707, - 854, 854, 1195, 1195, 1707, 1707, 1707, 1707, - 1195, 1195, 1707, 1707, 2390, 2390, 2390, 2390, - 1195, 1195, 1707, 1707, 2390, 2390, 2390, 2390, - 1707, 1707, 2390, 2390, 1707, 1707, 1707, 1707, - 1707, 1707, 2390, 2390, 1707, 1707, 1707, 1707, - 1707, 1707, 2390, 2390, 1707, 1707, 1707, 1707, - 1707, 1707, 2390, 2390, 1707, 1707, 1707, 1707 - ] -]; -const INDEO4_QUANT4X4_INTRA: [[u16; 16]; 5] = [ - [ - 22, 214, 257, 299, - 214, 257, 299, 342, - 257, 299, 342, 427, - 299, 342, 427, 513 - ], [ - 129, 1025, 1451, 1451, - 1025, 1025, 1451, 1451, - 1451, 1451, 2049, 2049, - 1451, 1451, 2049, 2049 - ], [ - 43, 171, 171, 171, - 43, 171, 171, 171, - 43, 171, 171, 171, - 43, 171, 171, 171 - ], [ - 43, 43, 43, 43, - 171, 171, 171, 171, - 171, 171, 171, 171, - 171, 171, 171, 171 - ], [ - 43, 43, 43, 43, - 43, 43, 43, 43, - 43, 43, 43, 43, - 43, 43, 43, 43 - ] -]; -const INDEO4_QUANT4X4_INTER: [[u16; 16]; 5] = [ - [ - 107, 214, 257, 299, - 214, 257, 299, 299, - 257, 299, 299, 342, - 299, 299, 342, 342 - ], [ - 513, 1025, 1238, 1238, - 1025, 1025, 1238, 1238, - 1238, 1238, 1451, 1451, - 1238, 1238, 1451, 1451 - ], [ - 43, 171, 171, 171, - 43, 171, 171, 171, - 43, 171, 171, 171, - 43, 171, 171, 171 - ], [ - 43, 43, 43, 43, - 171, 171, 171, 171, - 171, 171, 171, 171, - 171, 171, 171, 171 - ], [ - 43, 43, 43, 43, - 43, 43, 43, 43, - 43, 43, 43, 43, - 43, 43, 43, 43 - ] -]; -const INDEO4_Q8_INTRA: [&[u16; 64]; 9] = [ - &INDEO4_QUANT8X8_INTRA[0], &INDEO4_QUANT8X8_INTRA[1], &INDEO4_QUANT8X8_INTRA[2], - &INDEO4_QUANT8X8_INTRA[3], &INDEO4_QUANT8X8_INTRA[4], &INDEO4_QUANT8X8_INTRA[5], - &INDEO4_QUANT8X8_INTRA[6], &INDEO4_QUANT8X8_INTRA[7], &INDEO4_QUANT8X8_INTRA[8], -]; -const INDEO4_Q8_INTER: [&[u16; 64]; 9] = [ - &INDEO4_QUANT8X8_INTER[0], &INDEO4_QUANT8X8_INTER[1], &INDEO4_QUANT8X8_INTER[2], - &INDEO4_QUANT8X8_INTER[3], &INDEO4_QUANT8X8_INTER[4], &INDEO4_QUANT8X8_INTER[5], - &INDEO4_QUANT8X8_INTER[6], &INDEO4_QUANT8X8_INTER[7], &INDEO4_QUANT8X8_INTER[8], -]; -const INDEO4_Q4_INTRA: [&[u16; 16]; 5] = [ - &INDEO4_QUANT4X4_INTRA[0], &INDEO4_QUANT4X4_INTRA[1], &INDEO4_QUANT4X4_INTRA[2], - &INDEO4_QUANT4X4_INTRA[3], &INDEO4_QUANT4X4_INTRA[4] -]; -const INDEO4_Q4_INTER: [&[u16; 16]; 5] = [ - &INDEO4_QUANT4X4_INTER[0], &INDEO4_QUANT4X4_INTER[1], &INDEO4_QUANT4X4_INTER[2], - &INDEO4_QUANT4X4_INTER[3], &INDEO4_QUANT4X4_INTER[4] -]; - -pub fn get_decoder() -> Box<NADecoder> { - Box::new(Indeo4Decoder::new()) -} - -#[cfg(test)] -mod test { - use crate::test::dec_video::test_file_decoding; - #[test] - fn test_indeo4() { - test_file_decoding("avi", "assets/IV4/volcano.avi", /*None*/Some(16), true, false, None/*Some("iv4")*/); -//panic!("the end"); - } -} diff --git a/src/codecs/indeo/indeo5.rs b/src/codecs/indeo/indeo5.rs deleted file mode 100644 index c761a8e..0000000 --- a/src/codecs/indeo/indeo5.rs +++ /dev/null @@ -1,727 +0,0 @@ -use std::cell::Ref; -use crate::io::bitreader::*; -use crate::formats; -use super::super::*; -use super::ivi::*; -use super::ivibr::*; - -fn calc_quant(glob_q: u32, qd: i16) -> usize { - let qq = (glob_q as i16) + (qd as i16); - if qq < 0 { - 0 - } else if qq > 23 { - 23 - } else { - qq as usize - } -} - -struct Indeo5Parser { - mb_cb: IVICodebook, - - width: usize, - height: usize, - tile_w: usize, - tile_h: usize, - luma_bands: usize, - chroma_bands: usize, - - is_hpel: [bool; 5], - mb_size: [usize; 5], - blk_size: [usize; 5], -} - -impl Indeo5Parser { - fn new() -> Self { - Indeo5Parser { - mb_cb: IVI_CB_ZERO, - - width: 0, - height: 0, - tile_w: 0, - tile_h: 0, - luma_bands: 0, - chroma_bands: 0, - - is_hpel: [false; 5], - mb_size: [0; 5], - blk_size: [0; 5], - } - } -} - -fn skip_extension(br: &mut BitReader) -> DecoderResult<()> { - loop { - let len = br.read(8)?; - if len == 0 { break; } - br.skip(len * 8)?; - } - Ok(()) -} - -impl IndeoXParser for Indeo5Parser { -#[allow(unused_variables)] -#[allow(unused_assignments)] - fn decode_picture_header(&mut self, br: &mut BitReader) -> DecoderResult<PictureHeader> { - let sync = br.read(5)?; - validate!(sync == 0x1F); - let ftype_idx = br.read(3)?; - validate!(ftype_idx < 5); - let ftype = INDEO5_FRAME_TYPE[ftype_idx as usize]; - let fnum = br.read(8)?; - if ftype == IVIFrameType::Intra { - let gop_flags = br.read(8)?; - let hdr_size; - if (gop_flags & 0x01) != 0 { - hdr_size = br.read(16)?; - } else { - hdr_size = 0; - } - if (gop_flags & 0x20) != 0 { - br.skip(32)?; // lock word - } - self.tile_w = 0; - self.tile_h = 0; - if (gop_flags & 0x40) != 0 { - self.tile_w = 64 << br.read(2)?; - self.tile_h = self.tile_w; - } - validate!(self.tile_w < 256); - self.luma_bands = (br.read(2)? * 3 + 1) as usize; - self.chroma_bands = (br.read(1)? * 3 + 1) as usize; - validate!((self.luma_bands == 4) || (self.luma_bands == 1)); - validate!(self.chroma_bands == 1); - let pic_size_idx = br.read(4)? as usize; - let w; - let h; - if pic_size_idx < 15 { - w = INDEO5_PICTURE_SIZE_TAB[pic_size_idx][0]; - h = INDEO5_PICTURE_SIZE_TAB[pic_size_idx][1]; - } else { - h = br.read(13)? as usize; - w = br.read(13)? as usize; - } - validate!((w != 0) && (h != 0)); - self.width = w; - self.height = h; - - validate!((gop_flags & 0x02) == 0); - if self.tile_w == 0 { - self.tile_w = w; - self.tile_h = h; - } - for b in 0..self.luma_bands+self.chroma_bands { - self.is_hpel[b] = br.read_bool()?; - let mb_scale = br.read(1)?; - self.blk_size[b] = 8 >> br.read(1)?; - self.mb_size[b] = self.blk_size[b] << (1 - mb_scale); - let ext_tr = br.read_bool()?; - validate!(!ext_tr); - let end_marker = br.read(2)?; - validate!(end_marker == 0); - } - if (gop_flags & 0x08) != 0 { - let align = br.read(3)?; - validate!(align == 0); - if br.read_bool()? { - br.skip(24)?; // transparency color - } - } - br.align(); - br.skip(23)?; - if br.read_bool()? { // gop extension - loop { - let v = br.read(16)?; - if (v & 0x8000) == 0 { break; } - } - } - br.align(); - } - if ftype.is_null() { - br.align(); - return Ok(PictureHeader::new_null(ftype)); - } - let flags = br.read(8)?; - let size; - if (flags & 0x01) != 0 { - size = br.read(24)?; - } else { - size = 0; - } - let checksum; - if (flags & 0x10) != 0 { - checksum = br.read(16)?; - } else { - checksum = 0; - } - if (flags & 0x20) != 0 { - skip_extension(br)?; - } - let in_q = (flags & 0x08) != 0; - self.mb_cb = br.read_ivi_codebook_desc(true, (flags & 0x40) != 0)?; - br.skip(3)?; - br.align(); - - Ok(PictureHeader::new(ftype, self.width, self.height, self.tile_w, self.tile_h, false, self.luma_bands, self.chroma_bands, in_q)) - } - -#[allow(unused_variables)] - fn decode_band_header(&mut self, br: &mut BitReader, pic_hdr: &PictureHeader, plane_no: usize, band_no: usize) -> DecoderResult<BandHeader> { - let band_flags = br.read(8)?; - - if (band_flags & 0x01) != 0 { - br.align(); - return Ok(BandHeader::new_empty(plane_no, band_no)); - } - let inherit_mv = (band_flags & 0x02) != 0; - let has_qdelta = (band_flags & 0x04) != 0; - let inherit_qd = ((band_flags & 0x08) != 0) || !has_qdelta; - let data_size: usize; - if (band_flags & 0x80) != 0 { - data_size = br.read(24)? as usize; - } else { - data_size = 0; - } - validate!(data_size <= ((br.left() / 8) as usize)); - - let num_corr: usize; - let mut corr_map: [u8; CORR_MAP_SIZE] = [0; CORR_MAP_SIZE]; - if (band_flags & 0x10) != 0 { - num_corr = br.read(8)? as usize; - validate!(num_corr*2 <= CORR_MAP_SIZE); - for i in 0..num_corr*2 { - corr_map[i] = br.read(8)? as u8; - } - } else { - num_corr = 0; - } - let rvmap_idx; - if (band_flags & 0x40) != 0 { - rvmap_idx = br.read(3)? as usize; - } else { - rvmap_idx = 8; - } - let blk_cb = br.read_ivi_codebook_desc(false, (band_flags & 0x80) != 0)?; - if br.read_bool()? { - br.skip(16)?; // checksum - } - let band_q = br.read(5)?; - if (band_flags & 0x20) != 0 { - skip_extension(br)?; - } - br.align(); - - let tr; - let txtype; - let band_id = if plane_no == 0 { band_no } else { self.luma_bands }; - match plane_no { - 0 => { - let scan = INDEO5_SCAN8X8[band_no]; - let qintra; - let qinter; - validate!(self.blk_size[band_id] == 8); - match band_no { - 0 => { - tr = IVITransformType::Slant(TSize::T8x8, TDir::TwoD); - if self.luma_bands == 1 { - qintra = INDEO5_Q8_INTRA[0]; - qinter = INDEO5_Q8_INTER[0]; - } else { - qintra = INDEO5_Q8_INTRA[1]; - qinter = INDEO5_Q8_INTER[1]; - } - }, - 1 => { - tr = IVITransformType::Slant(TSize::T8x8, TDir::Row); - qintra = INDEO5_Q8_INTRA[2]; - qinter = INDEO5_Q8_INTER[2]; - }, - 2 => { - tr = IVITransformType::Slant(TSize::T8x8, TDir::Col); - qintra = INDEO5_Q8_INTRA[3]; - qinter = INDEO5_Q8_INTER[3]; - }, - 3 => { - tr = IVITransformType::None(TSize::T8x8); - qintra = INDEO5_Q8_INTRA[4]; - qinter = INDEO5_Q8_INTER[4]; - }, - _ => { unreachable!(); } - }; - txtype = TxType::Transform8(TxParams8x8::new(qintra, qinter, scan)); - }, - 1 | 2 => { - validate!(self.blk_size[band_id] == 4); - tr = IVITransformType::Slant(TSize::T4x4, TDir::TwoD); - let scan = INDEO5_SCAN4X4; - let qintra = INDEO5_Q4_INTRA; - let qinter = INDEO5_Q4_INTER; - txtype = TxType::Transform4(TxParams4x4::new(qintra, qinter, scan)); - }, - _ => { unreachable!(); } - }; - - Ok(BandHeader::new(plane_no, band_no, self.mb_size[band_id], self.blk_size[band_id], self.is_hpel[band_id], inherit_mv, has_qdelta, inherit_qd, band_q, rvmap_idx, num_corr, corr_map, blk_cb, tr, txtype)) - } - - fn decode_mb_info(&mut self, br: &mut BitReader, pic_hdr: &PictureHeader, band: &BandHeader, tile: &mut IVITile, ref_tile: Option<Ref<IVITile>>, mv_scale: u8) -> DecoderResult<()> { - let mut mv_x = 0; - let mut mv_y = 0; - let band_id = if pic_hdr.luma_bands == 4 { band.band_no + 1 } else { 0 }; - let mut mb_idx = 0; - for mb_y in 0..tile.mb_h { - for mb_x in 0..tile.mb_w { - let mut mb = MB::new(tile.pos_x + mb_x * band.mb_size, tile.pos_y + mb_y * band.mb_size); - if !br.read_bool()? { - if pic_hdr.ftype.is_intra() { - mb.mtype = MBType::Intra; - } else if band.inherit_mv { - if let Some(ref tileref) = ref_tile { - mb.mtype = tileref.mb[mb_idx].mtype; - } else { - return Err(DecoderError::MissingReference); - } - } else { - mb.mtype = if br.read_bool()? { MBType::Inter } else { MBType::Intra }; - } - if band.mb_size == band.blk_size { - mb.cbp = br.read(1)? as u8; - } else { - mb.cbp = br.read(4)? as u8; - } - let q; - if band.has_qdelta { - if band.inherit_qd { - if let Some(ref tileref) = ref_tile { - mb.qd = tileref.mb[mb_idx].qd; - q = calc_quant(band.quant, mb.qd); - } else { - return Err(DecoderError::MissingReference); - } - } else if (mb.cbp != 0) || ((band.plane_no == 0) && (band.band_no == 0) && pic_hdr.in_q) { - mb.qd = br.read_ivi_cb_s(&self.mb_cb)? as i16; - q = calc_quant(band.quant, mb.qd); - } else { - q = band.quant as usize; - } - } else { - q = band.quant as usize; - } - - if mb.mtype == MBType::Intra { - if band.blk_size == 8 { - mb.q = INDEO5_QSCALE8_INTRA[band_id][q]; - } else { - mb.q = INDEO5_QSCALE4_INTRA[q]; - } - } else { - if band.blk_size == 8 { - mb.q = INDEO5_QSCALE8_INTER[band_id][q]; - } else { - mb.q = INDEO5_QSCALE4_INTER[q]; - } - } - - if mb.mtype != MBType::Intra { - if band.inherit_mv { - if let Some(ref tileref) = ref_tile { - let mx = tileref.mb[mb_idx].mv_x; - let my = tileref.mb[mb_idx].mv_y; - if mv_scale == 0 { - mb.mv_x = mx; - mb.mv_y = my; - } else { - mb.mv_x = scale_mv(mx, mv_scale); - mb.mv_y = scale_mv(my, mv_scale); - } - } - } else { - mv_y += br.read_ivi_cb_s(&self.mb_cb)?; - mv_x += br.read_ivi_cb_s(&self.mb_cb)?; - mb.mv_x = mv_x; - mb.mv_y = mv_y; - } - } - } else { - validate!(!pic_hdr.ftype.is_intra()); - mb.mtype = MBType::Inter; - mb.cbp = 0; - mb.qd = 0; - if (band.plane_no == 0) && (band.band_no == 0) && pic_hdr.in_q { - mb.qd = br.read_ivi_cb_s(&self.mb_cb)? as i16; - let q = calc_quant(band.quant, mb.qd); - if mb.mtype == MBType::Intra { - if band.blk_size == 8 { - mb.q = INDEO5_QSCALE8_INTRA[band_id][q]; - } else { - mb.q = INDEO5_QSCALE4_INTRA[q]; - } - } else { - if band.blk_size == 8 { - mb.q = INDEO5_QSCALE8_INTER[band_id][q]; - } else { - mb.q = INDEO5_QSCALE4_INTER[q]; - } - } - } - if band.inherit_mv { - if let Some(ref tileref) = ref_tile { - let mx = tileref.mb[mb_idx].mv_x; - let my = tileref.mb[mb_idx].mv_y; - if mv_scale == 0 { - mb.mv_x = mx; - mb.mv_y = my; - } else { - mb.mv_x = scale_mv(mx, mv_scale); - mb.mv_y = scale_mv(my, mv_scale); - } - } - } - } - tile.mb[mb_idx] = mb; - mb_idx += 1; - } - } - br.align(); - Ok(()) - } - - fn recombine_plane(&mut self, src: &[i16], sstride: usize, dst: &mut [u8], dstride: usize, w: usize, h: usize) { - let mut idx0 = 0; - let mut idx1 = w / 2; - let mut idx2 = (h / 2) * sstride; - let mut idx3 = idx2 + idx1; - let mut bidx1 = idx1; - let mut bidx3 = idx3; - let mut oidx0 = 0; - let mut oidx1 = dstride; - let filt_lo = |a: i16, b: i16| a + b; - let filt_hi = |a: i16, b: i16, c: i16| a - b * 6 + c; - - for _ in 0..(h/2) { - let mut b0_1 = src[idx0]; - let mut b0_2 = src[idx0 + sstride]; - let mut b1_1 = src[bidx1]; - let mut b1_2 = src[idx1]; - let mut b1_3 = filt_hi(b1_1, b1_2, src[idx1 + sstride]); - let mut b2_1; - let mut b2_2 = src[idx2]; - let mut b2_3 = b2_2; - let mut b2_4; - let mut b2_5 = src[idx2 + sstride]; - let mut b2_6 = b2_5; - let mut b3_1; - let mut b3_2 = src[bidx3]; - let mut b3_3 = b3_2; - let mut b3_4; - let mut b3_5 = src[idx3]; - let mut b3_6 = b3_5; - let mut b3_8 = filt_hi(b3_2, b3_5, src[idx3 + sstride]); - let mut b3_9 = b3_8; - let mut b3_7; - - for x in 0..(w/2) { - b2_1 = b2_2; - b2_2 = b2_3; - b2_4 = b2_5; - b2_5 = b2_6; - b3_1 = b3_2; - b3_2 = b3_3; - b3_4 = b3_5; - b3_5 = b3_6; - b3_7 = b3_8; - b3_8 = b3_9; - - let tmp0 = b0_1; - let tmp1 = b0_2; - b0_1 = src[idx0 + x + 1]; - b0_2 = src[idx0 + x + 1 + sstride]; - let mut p0 = tmp0 << 4; - let mut p1 = (tmp0 + b0_1) << 3; - let mut p2 = (tmp0 + tmp1) << 3; - let mut p3 = (tmp0 + tmp1 + b0_1 + b0_2) << 2; - - let tmp0 = b1_1; - let tmp1 = b1_2; - let tmp2 = filt_lo(tmp0, tmp1); - let tmp3 = filt_hi(tmp0, tmp1, b1_3); - b1_2 = src[ idx1 + x + 1]; - b1_1 = src[bidx1 + x + 1]; - b1_3 = filt_hi(b1_1, b1_2, src[idx1 + x + 1 + sstride]); - p0 += tmp2 << 3; - p1 += (tmp2 + b1_1 + b1_2) << 2; - p2 += tmp3 << 2; - p3 += (tmp3 + b1_3) << 1; - - b2_3 = src[idx2 + x + 1]; - b2_6 = src[idx2 + x + 1 + sstride]; - let tmp0 = filt_lo(b2_1, b2_2); - let tmp1 = filt_hi(b2_1, b2_2, b2_3); - p0 += tmp0 << 3; - p1 += tmp1 << 2; - p2 += (tmp0 + filt_lo(b2_4, b2_5)) << 2; - p3 += (tmp1 + filt_hi(b2_4, b2_5, b2_6)) << 1; - - b3_6 = src[idx3 + x + 1]; - b3_3 = src[bidx3 + x + 1]; - b3_9 = filt_hi(b3_3, b3_6, src[idx3 + x + 1 + sstride]); - let tmp0 = b3_1 + b3_4; - let tmp1 = b3_2 + b3_5; - let tmp2 = b3_3 + b3_6; - p0 += filt_lo(tmp0, tmp1) << 2; - p1 += filt_hi(tmp0, tmp1, tmp2) << 1; - p2 += filt_lo(b3_7, b3_8) << 1; - p3 += filt_hi(b3_7, b3_8, b3_9) << 0; - - dst[oidx0 + x * 2 + 0] = clip8((p0 >> 6) + 128); - dst[oidx0 + x * 2 + 1] = clip8((p1 >> 6) + 128); - dst[oidx1 + x * 2 + 0] = clip8((p2 >> 6) + 128); - dst[oidx1 + x * 2 + 1] = clip8((p3 >> 6) + 128); - } - bidx1 = idx1; - bidx3 = idx3; - idx0 += sstride; - idx1 += sstride; - idx2 += sstride; - idx3 += sstride; - oidx0 += dstride * 2; - oidx1 += dstride * 2; - } - } -} - -struct Indeo5Decoder { - info: Rc<NACodecInfo>, - dec: IVIDecoder, - ip: Indeo5Parser, -} - -impl Indeo5Decoder { - fn new() -> Self { - Indeo5Decoder { - info: NACodecInfo::new_dummy(), - dec: IVIDecoder::new(), - ip: Indeo5Parser::new(), - } - } -} - -impl NADecoder for Indeo5Decoder { - fn init(&mut self, info: Rc<NACodecInfo>) -> DecoderResult<()> { - if let NACodecTypeInfo::Video(vinfo) = info.get_properties() { - let w = vinfo.get_width(); - let h = vinfo.get_height(); - let f = vinfo.is_flipped(); - let fmt = formats::YUV410_FORMAT; - let myinfo = NACodecTypeInfo::Video(NAVideoInfo::new(w, h, f, fmt)); - self.info = Rc::new(NACodecInfo::new_ref(info.get_name(), myinfo, info.get_extradata())); - Ok(()) - } else { - Err(DecoderError::InvalidData) - } - } - fn decode(&mut self, pkt: &NAPacket) -> DecoderResult<NAFrameRef> { - let src = pkt.get_buffer(); - let mut br = BitReader::new(src.as_slice(), src.len(), BitReaderMode::LE); - - let bufinfo = self.dec.decode_frame(&mut self.ip, &mut br)?; - let mut frm = NAFrame::new_from_pkt(pkt, self.info.clone(), bufinfo); - frm.set_keyframe(self.dec.is_intra()); - frm.set_frame_type(self.dec.get_frame_type()); - Ok(Rc::new(RefCell::new(frm))) - } -} - -const INDEO5_PICTURE_SIZE_TAB: [[usize; 2]; 15] = [ - [640, 480], [320, 240], [160, 120], [704, 480], [352, 240], [352, 288], [176, 144], - [240, 180], [640, 240], [704, 240], [80, 60], [88, 72], [0, 0], [0, 0], [0, 0] -]; - -const INDEO5_FRAME_TYPE: [IVIFrameType; 5] = [ - IVIFrameType::Intra, IVIFrameType::Inter, IVIFrameType::InterScal, - IVIFrameType::InterDroppable, IVIFrameType::NULL, -]; - -const INDEO5_QUANT8X8_INTRA: [[u16; 64]; 5] = [ - [ - 0x1a, 0x2e, 0x36, 0x42, 0x46, 0x4a, 0x4e, 0x5a, - 0x2e, 0x32, 0x3e, 0x42, 0x46, 0x4e, 0x56, 0x6a, - 0x36, 0x3e, 0x3e, 0x44, 0x4a, 0x54, 0x66, 0x72, - 0x42, 0x42, 0x44, 0x4a, 0x52, 0x62, 0x6c, 0x7a, - 0x46, 0x46, 0x4a, 0x52, 0x5e, 0x66, 0x72, 0x8e, - 0x4a, 0x4e, 0x54, 0x62, 0x66, 0x6e, 0x86, 0xa6, - 0x4e, 0x56, 0x66, 0x6c, 0x72, 0x86, 0x9a, 0xca, - 0x5a, 0x6a, 0x72, 0x7a, 0x8e, 0xa6, 0xca, 0xfe, - ], [ - 0x26, 0x3a, 0x3e, 0x46, 0x4a, 0x4e, 0x52, 0x5a, - 0x3a, 0x3e, 0x42, 0x46, 0x4a, 0x4e, 0x56, 0x5e, - 0x3e, 0x42, 0x46, 0x48, 0x4c, 0x52, 0x5a, 0x62, - 0x46, 0x46, 0x48, 0x4a, 0x4e, 0x56, 0x5e, 0x66, - 0x4a, 0x4a, 0x4c, 0x4e, 0x52, 0x5a, 0x62, 0x6a, - 0x4e, 0x4e, 0x52, 0x56, 0x5a, 0x5e, 0x66, 0x6e, - 0x52, 0x56, 0x5a, 0x5e, 0x62, 0x66, 0x6a, 0x72, - 0x5a, 0x5e, 0x62, 0x66, 0x6a, 0x6e, 0x72, 0x76, - ], [ - 0x4e, 0xaa, 0xf2, 0xd4, 0xde, 0xc2, 0xd6, 0xc2, - 0x4e, 0xaa, 0xf2, 0xd4, 0xde, 0xc2, 0xd6, 0xc2, - 0x4e, 0xaa, 0xf2, 0xd4, 0xde, 0xc2, 0xd6, 0xc2, - 0x4e, 0xaa, 0xf2, 0xd4, 0xde, 0xc2, 0xd6, 0xc2, - 0x4e, 0xaa, 0xf2, 0xd4, 0xde, 0xc2, 0xd6, 0xc2, - 0x4e, 0xaa, 0xf2, 0xd4, 0xde, 0xc2, 0xd6, 0xc2, - 0x4e, 0xaa, 0xf2, 0xd4, 0xde, 0xc2, 0xd6, 0xc2, - 0x4e, 0xaa, 0xf2, 0xd4, 0xde, 0xc2, 0xd6, 0xc2, - ], [ - 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, - 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, - 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, - 0xd4, 0xd4, 0xd4, 0xd4, 0xd4, 0xd4, 0xd4, 0xd4, - 0xde, 0xde, 0xde, 0xde, 0xde, 0xde, 0xde, 0xde, - 0xc2, 0xc2, 0xc2, 0xc2, 0xc2, 0xc2, 0xc2, 0xc2, - 0xd6, 0xd6, 0xd6, 0xd6, 0xd6, 0xd6, 0xd6, 0xd6, - 0xc2, 0xc2, 0xc2, 0xc2, 0xc2, 0xc2, 0xc2, 0xc2, - ], [ - 0x5e, 0x5e, 0x5e, 0x5e, 0x5e, 0x5e, 0x5e, 0x5e, - 0x5e, 0x5e, 0x5e, 0x5e, 0x5e, 0x5e, 0x5e, 0x5e, - 0x5e, 0x5e, 0x5e, 0x5e, 0x5e, 0x5e, 0x5e, 0x5e, - 0x5e, 0x5e, 0x5e, 0x5e, 0x5e, 0x5e, 0x5e, 0x5e, - 0x5e, 0x5e, 0x5e, 0x5e, 0x5e, 0x5e, 0x5e, 0x5e, - 0x5e, 0x5e, 0x5e, 0x5e, 0x5e, 0x5e, 0x5e, 0x5e, - 0x5e, 0x5e, 0x5e, 0x5e, 0x5e, 0x5e, 0x5e, 0x5e, - 0x5e, 0x5e, 0x5e, 0x5e, 0x5e, 0x5e, 0x5e, 0x5e, - ] -]; -const INDEO5_QUANT8X8_INTER: [[u16; 64]; 5] = [ - [ - 0x26, 0x3a, 0x3e, 0x46, 0x4a, 0x4e, 0x52, 0x5a, - 0x3a, 0x3e, 0x42, 0x46, 0x4a, 0x4e, 0x56, 0x5e, - 0x3e, 0x42, 0x46, 0x48, 0x4c, 0x52, 0x5a, 0x62, - 0x46, 0x46, 0x48, 0x4a, 0x4e, 0x56, 0x5e, 0x66, - 0x4a, 0x4a, 0x4c, 0x4e, 0x52, 0x5a, 0x62, 0x6a, - 0x4e, 0x4e, 0x52, 0x56, 0x5a, 0x5e, 0x66, 0x6e, - 0x52, 0x56, 0x5a, 0x5e, 0x62, 0x66, 0x6a, 0x72, - 0x5a, 0x5e, 0x62, 0x66, 0x6a, 0x6e, 0x72, 0x76, - ], [ - 0x26, 0x3a, 0x3e, 0x46, 0x4a, 0x4e, 0x52, 0x5a, - 0x3a, 0x3e, 0x42, 0x46, 0x4a, 0x4e, 0x56, 0x5e, - 0x3e, 0x42, 0x46, 0x48, 0x4c, 0x52, 0x5a, 0x62, - 0x46, 0x46, 0x48, 0x4a, 0x4e, 0x56, 0x5e, 0x66, - 0x4a, 0x4a, 0x4c, 0x4e, 0x52, 0x5a, 0x62, 0x6a, - 0x4e, 0x4e, 0x52, 0x56, 0x5a, 0x5e, 0x66, 0x6e, - 0x52, 0x56, 0x5a, 0x5e, 0x62, 0x66, 0x6a, 0x72, - 0x5a, 0x5e, 0x62, 0x66, 0x6a, 0x6e, 0x72, 0x76, - ], [ - 0x4e, 0xaa, 0xf2, 0xd4, 0xde, 0xc2, 0xd6, 0xc2, - 0x4e, 0xaa, 0xf2, 0xd4, 0xde, 0xc2, 0xd6, 0xc2, - 0x4e, 0xaa, 0xf2, 0xd4, 0xde, 0xc2, 0xd6, 0xc2, - 0x4e, 0xaa, 0xf2, 0xd4, 0xde, 0xc2, 0xd6, 0xc2, - 0x4e, 0xaa, 0xf2, 0xd4, 0xde, 0xc2, 0xd6, 0xc2, - 0x4e, 0xaa, 0xf2, 0xd4, 0xde, 0xc2, 0xd6, 0xc2, - 0x4e, 0xaa, 0xf2, 0xd4, 0xde, 0xc2, 0xd6, 0xc2, - 0x4e, 0xaa, 0xf2, 0xd4, 0xde, 0xc2, 0xd6, 0xc2, - ], [ - 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, - 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, - 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, - 0xd4, 0xd4, 0xd4, 0xd4, 0xd4, 0xd4, 0xd4, 0xd4, - 0xde, 0xde, 0xde, 0xde, 0xde, 0xde, 0xde, 0xde, - 0xc2, 0xc2, 0xc2, 0xc2, 0xc2, 0xc2, 0xc2, 0xc2, - 0xd6, 0xd6, 0xd6, 0xd6, 0xd6, 0xd6, 0xd6, 0xd6, - 0xc2, 0xc2, 0xc2, 0xc2, 0xc2, 0xc2, 0xc2, 0xc2, - ], [ - 0x5e, 0x5e, 0x5e, 0x5e, 0x5e, 0x5e, 0x5e, 0x5e, - 0x5e, 0x5e, 0x5e, 0x5e, 0x5e, 0x5e, 0x5e, 0x5e, - 0x5e, 0x5e, 0x5e, 0x5e, 0x5e, 0x5e, 0x5e, 0x5e, - 0x5e, 0x5e, 0x5e, 0x5e, 0x5e, 0x5e, 0x5e, 0x5e, - 0x5e, 0x5e, 0x5e, 0x5e, 0x5e, 0x5e, 0x5e, 0x5e, - 0x5e, 0x5e, 0x5e, 0x5e, 0x5e, 0x5e, 0x5e, 0x5e, - 0x5e, 0x5e, 0x5e, 0x5e, 0x5e, 0x5e, 0x5e, 0x5e, - 0x5e, 0x5e, 0x5e, 0x5e, 0x5e, 0x5e, 0x5e, 0x5e, - ] -]; -const INDEO5_QUANT4X4_INTRA: [u16; 16] = [ - 0x1e, 0x3e, 0x4a, 0x52, - 0x3e, 0x4a, 0x52, 0x5e, - 0x4a, 0x52, 0x5e, 0x7a, - 0x52, 0x5e, 0x7a, 0x92 -]; -const INDEO5_QUANT4X4_INTER: [u16; 16] = [ - 0x1e, 0x3e, 0x4a, 0x52, - 0x3e, 0x4a, 0x52, 0x56, - 0x4a, 0x52, 0x56, 0x5e, - 0x52, 0x56, 0x5e, 0x66 -]; -const INDEO5_Q8_INTRA: [&[u16; 64]; 5] = [ - &INDEO5_QUANT8X8_INTRA[0], &INDEO5_QUANT8X8_INTRA[1], &INDEO5_QUANT8X8_INTRA[2], - &INDEO5_QUANT8X8_INTRA[3], &INDEO5_QUANT8X8_INTRA[4], -]; -const INDEO5_Q8_INTER: [&[u16; 64]; 5] = [ - &INDEO5_QUANT8X8_INTER[0], &INDEO5_QUANT8X8_INTER[1], &INDEO5_QUANT8X8_INTER[2], - &INDEO5_QUANT8X8_INTER[3], &INDEO5_QUANT8X8_INTER[4], -]; -const INDEO5_Q4_INTRA: &[u16; 16] = &INDEO5_QUANT4X4_INTRA; -const INDEO5_Q4_INTER: &[u16; 16] = &INDEO5_QUANT4X4_INTER; - -const INDEO5_SCAN8X8: [&[usize; 64]; 4] = [ - &IVI_ZIGZAG, &IVI_SCAN_8X8_VER, &IVI_SCAN_8X8_HOR, &IVI_SCAN_8X8_HOR -]; -const INDEO5_SCAN4X4: &[usize; 16] = &IVI_SCAN_4X4; - -const INDEO5_QSCALE8_INTRA: [[u8; 24]; 5] = [ - [ - 0x0b, 0x0e, 0x10, 0x12, 0x14, 0x16, 0x17, 0x18, 0x1a, 0x1c, 0x1e, 0x20, - 0x22, 0x24, 0x27, 0x28, 0x2a, 0x2d, 0x2f, 0x31, 0x34, 0x37, 0x39, 0x3c, - ], [ - 0x01, 0x10, 0x12, 0x14, 0x16, 0x18, 0x1b, 0x1e, 0x22, 0x25, 0x28, 0x2c, - 0x30, 0x34, 0x38, 0x3d, 0x42, 0x47, 0x4c, 0x52, 0x58, 0x5e, 0x65, 0x6c, - ], [ - 0x13, 0x22, 0x27, 0x2a, 0x2d, 0x33, 0x36, 0x3c, 0x41, 0x45, 0x49, 0x4e, - 0x53, 0x58, 0x5d, 0x63, 0x69, 0x6f, 0x75, 0x7c, 0x82, 0x88, 0x8e, 0x95, - ], [ - 0x13, 0x1f, 0x21, 0x24, 0x27, 0x29, 0x2d, 0x2f, 0x34, 0x37, 0x3a, 0x3d, - 0x40, 0x44, 0x48, 0x4c, 0x4f, 0x52, 0x56, 0x5a, 0x5e, 0x62, 0x66, 0x6b, - ], [ - 0x31, 0x42, 0x47, 0x47, 0x4d, 0x52, 0x58, 0x58, 0x5d, 0x63, 0x67, 0x6b, - 0x6f, 0x73, 0x78, 0x7c, 0x80, 0x84, 0x89, 0x8e, 0x93, 0x98, 0x9d, 0xa4, - ] -]; -const INDEO5_QSCALE8_INTER: [[u8; 24]; 5] = [ - [ - 0x0b, 0x11, 0x13, 0x14, 0x15, 0x16, 0x18, 0x1a, 0x1b, 0x1d, 0x20, 0x22, - 0x23, 0x25, 0x28, 0x2a, 0x2e, 0x32, 0x35, 0x39, 0x3d, 0x41, 0x44, 0x4a, - ], [ - 0x07, 0x14, 0x16, 0x18, 0x1b, 0x1e, 0x22, 0x25, 0x29, 0x2d, 0x31, 0x35, - 0x3a, 0x3f, 0x44, 0x4a, 0x50, 0x56, 0x5c, 0x63, 0x6a, 0x71, 0x78, 0x7e, - ], [ - 0x15, 0x25, 0x28, 0x2d, 0x30, 0x34, 0x3a, 0x3d, 0x42, 0x48, 0x4c, 0x51, - 0x56, 0x5b, 0x60, 0x65, 0x6b, 0x70, 0x76, 0x7c, 0x82, 0x88, 0x8f, 0x97, - ], [ - 0x13, 0x1f, 0x20, 0x22, 0x25, 0x28, 0x2b, 0x2d, 0x30, 0x33, 0x36, 0x39, - 0x3c, 0x3f, 0x42, 0x45, 0x48, 0x4b, 0x4e, 0x52, 0x56, 0x5a, 0x5e, 0x62, - ], [ - 0x3c, 0x52, 0x58, 0x5d, 0x63, 0x68, 0x68, 0x6d, 0x73, 0x78, 0x7c, 0x80, - 0x84, 0x89, 0x8e, 0x93, 0x98, 0x9d, 0xa3, 0xa9, 0xad, 0xb1, 0xb5, 0xba - ] -]; -const INDEO5_QSCALE4_INTRA: [u8; 24] = [ - 0x01, 0x0b, 0x0b, 0x0d, 0x0d, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x13, 0x14, - 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20 -]; -const INDEO5_QSCALE4_INTER: [u8; 24] = [ - 0x0b, 0x0d, 0x0d, 0x0e, 0x11, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, - 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23 -]; - -pub fn get_decoder() -> Box<NADecoder> { - Box::new(Indeo5Decoder::new()) -} - -#[cfg(test)] -mod test { - use crate::test::dec_video::test_file_decoding; - #[test] - fn test_indeo5() { - test_file_decoding("avi", "assets/IV5/sample.avi", /*None*/Some(2), true, false, None); -// test_file_decoding("avi", "assets/IV5/W32mdl_1.avi", None/*Some(2)*/, true, false, Some("iv5")); -//panic!("the end"); - } -} diff --git a/src/codecs/indeo/ivi.rs b/src/codecs/indeo/ivi.rs deleted file mode 100644 index 064da0b..0000000 --- a/src/codecs/indeo/ivi.rs +++ /dev/null @@ -1,287 +0,0 @@ -use super::ivibr::{IVICodebook,IVI_CB_ZERO,RVMap,IVI_ZERO_RVMAP,IVI_RVMAPS}; - -pub fn clip8(a: i16) -> u8 { - if a < 0 { 0 } - else if a > 255 { 255 } - else { a as u8 } -} - -#[derive(Debug,Clone,Copy,PartialEq)] -pub enum IVIFrameType { - Intra, - Inter, - Bidir, - Intra1, - InterDroppable, - InterScal, - NULL, - NULL2, -} - -impl IVIFrameType { - pub fn is_intra(self) -> bool { - (self == IVIFrameType::Intra) || (self == IVIFrameType::Intra1) - } - pub fn is_null(self) -> bool { - (self == IVIFrameType::NULL) || (self == IVIFrameType::NULL2) - } - pub fn is_bidir(self) -> bool { - self == IVIFrameType::Bidir - } -} - -#[derive(Clone,Copy)] -pub struct PictureHeader { - pub ftype: IVIFrameType, - pub width: usize, - pub height: usize, - pub slice_w: usize, - pub slice_h: usize, - pub transparent: bool, - pub luma_bands: usize, - pub chroma_bands: usize, - pub in_q: bool, -} - -impl PictureHeader { - pub fn new(ftype: IVIFrameType, width: usize, height: usize, slice_w: usize, slice_h: usize, transparent: bool, luma_bands: usize, chroma_bands: usize, in_q: bool) -> Self { - PictureHeader { - ftype: ftype, - width: width, height: height, slice_w: slice_w, slice_h: slice_h, - transparent: transparent, - luma_bands: luma_bands, chroma_bands: chroma_bands, - in_q: in_q, - } - } - pub fn new_null(ftype: IVIFrameType) -> Self { - PictureHeader { - ftype: ftype, - width: 0, height: 0, slice_w: 0, slice_h: 0, - transparent: false, - luma_bands: 0, chroma_bands: 0, - in_q: false, - } - } -} - -#[derive(Debug,Clone,Copy,PartialEq)] -pub enum TSize { - T8x8, - T4x4, -} - -#[derive(Debug,Clone,Copy,PartialEq)] -pub enum TDir { - TwoD, - Row, - Col, -} - -#[derive(Debug,Clone,Copy,PartialEq)] -pub enum IVITransformType { - Haar (TSize, TDir), - Slant(TSize, TDir), - DCT (TSize, TDir), - None (TSize), -} - -pub type TrFunc = fn (&mut [i32; 64]); -pub type TrFuncDC = fn (&mut [i32; 64], i32); - -impl IVITransformType { - pub fn is_8x8(&self) -> bool { - match *self { - IVITransformType::Haar (ref sz, _) => { *sz == TSize::T8x8 }, - IVITransformType::Slant(ref sz, _) => { *sz == TSize::T8x8 }, - IVITransformType::DCT (ref sz, _) => { *sz == TSize::T8x8 }, - IVITransformType::None (ref sz) => { *sz == TSize::T8x8 }, - } - } - pub fn is_2d(&self) -> bool { - match *self { - IVITransformType::Haar (_, ref dir) => { *dir == TDir::TwoD }, - IVITransformType::Slant(_, ref dir) => { *dir == TDir::TwoD }, - IVITransformType::DCT (_, ref dir) => { *dir == TDir::TwoD }, - _ => { false }, - } - } -} - -#[allow(dead_code)] -#[derive(Clone)] -pub struct TxParams4x4 { - pub quant_intra: &'static [u16; 16], - pub quant_inter: &'static [u16; 16], - pub scan: &'static [usize; 16], -} - -impl TxParams4x4 { - pub fn new(quant_intra: &'static [u16; 16], quant_inter: &'static [u16; 16], scan: &'static [usize; 16]) -> Self { - TxParams4x4 { - quant_intra: quant_intra, quant_inter: quant_inter, scan: scan, - } - } -} - -#[allow(dead_code)] -#[derive(Clone)] -pub struct TxParams8x8 { - pub quant_intra: &'static [u16; 64], - pub quant_inter: &'static [u16; 64], - pub scan: &'static [usize; 64], -} - -impl TxParams8x8 { - pub fn new(quant_intra: &'static [u16; 64], quant_inter: &'static [u16; 64], scan: &'static [usize; 64]) -> Self { - TxParams8x8 { - quant_intra: quant_intra, quant_inter: quant_inter, scan: scan, - } - } -} - -#[derive(Clone)] -pub enum TxType { - Transform4(TxParams4x4), - Transform8(TxParams8x8), - None, -} - -pub const CORR_MAP_SIZE: usize = 122; - -#[derive(Clone)] -pub struct BandHeader { - pub plane_no: usize, - pub band_no: usize, - pub empty: bool, - pub mb_size: usize, - pub blk_size: usize, - pub halfpel: bool, - pub inherit_mv: bool, - pub has_qdelta: bool, - pub inherit_qd: bool, - pub quant: u32, - pub blk_cb: IVICodebook, - pub rvmap: RVMap, - pub tr: IVITransformType, - pub ttype: TxType, -} - -impl BandHeader { - pub fn new(plane_no: usize, band_no: usize, mb_size: usize, blk_size: usize, halfpel: bool, inherit_mv: bool, has_qdelta: bool, inherit_qd: bool, quant: u32, rvmap_idx: usize, num_corr: usize, corr_map: [u8; CORR_MAP_SIZE], blk_cb: IVICodebook, tr: IVITransformType, ttype: TxType) -> Self { - let mut rvmap = IVI_RVMAPS[rvmap_idx].clone(); - for i in 0..num_corr { - let pos1 = corr_map[i * 2 + 0] as usize; - let pos2 = corr_map[i * 2 + 1] as usize; - let t = rvmap.runtab[pos1]; - rvmap.runtab[pos1] = rvmap.runtab[pos2]; - rvmap.runtab[pos2] = t; - let t = rvmap.valtab[pos1]; - rvmap.valtab[pos1] = rvmap.valtab[pos2]; - rvmap.valtab[pos2] = t; - } - BandHeader { - plane_no: plane_no, band_no: band_no, - empty: false, halfpel: halfpel, - inherit_mv: inherit_mv, - has_qdelta: has_qdelta, inherit_qd: inherit_qd, quant: quant, - mb_size: mb_size, blk_size: blk_size, - rvmap: rvmap, blk_cb: blk_cb, - tr: tr, ttype: ttype, - } - } - pub fn new_empty(plane_no: usize, band_no: usize) -> Self { - BandHeader { - plane_no: plane_no, band_no: band_no, - empty: true, halfpel: true, - inherit_mv: false, has_qdelta: false, inherit_qd: false, quant: 0, - mb_size: 0, blk_size: 0, - rvmap: IVI_ZERO_RVMAP, blk_cb: IVI_CB_ZERO, - tr: IVITransformType::None(TSize::T8x8), ttype: TxType::None, - } - } -} - -#[derive(Debug,Clone,Copy,PartialEq)] -pub enum MBType { - Intra, - Inter, - Backward, - Bidir, -} - -#[derive(Clone,Copy)] -pub struct MB { - pub mtype: MBType, - pub pos_x: usize, - pub pos_y: usize, - pub mv_x: i32, - pub mv_y: i32, - pub mv2_x: i32, - pub mv2_y: i32, - pub qd: i16, - pub q: u8, - pub cbp: u8, -} - -impl MB { - pub fn new(x: usize, y: usize) -> Self { - MB { - mtype: MBType::Intra, - pos_x: x, pos_y: y, - mv_x: 0, mv_y: 0, - mv2_x: 0, mv2_y: 0, - cbp: 0, q: 0, qd: 0, - } - } -} - -pub struct IVITile { - pub pos_x: usize, - pub pos_y: usize, - pub mb_w: usize, - pub mb_h: usize, - pub w: usize, - pub h: usize, - pub mb: Vec<MB>, -} - -impl IVITile { - pub fn new(pos_x: usize, pos_y: usize, w: usize, h: usize) -> Self { - IVITile { - pos_x: pos_x, pos_y: pos_y, w: w, h: h, - mb_w: 0, mb_h: 0, mb: Vec::new(), - } - } -} - -pub const IVI_ZIGZAG: [usize; 64] = [ - 0, 1, 8, 16, 9, 2, 3, 10, - 17, 24, 32, 25, 18, 11, 4, 5, - 12, 19, 26, 33, 40, 48, 41, 34, - 27, 20, 13, 6, 7, 14, 21, 28, - 35, 42, 49, 56, 57, 50, 43, 36, - 29, 22, 15, 23, 30, 37, 44, 51, - 58, 59, 52, 45, 38, 31, 39, 46, - 53, 60, 61, 54, 47, 55, 62, 63 -]; -pub const IVI_SCAN_8X8_VER: [usize; 64] = [ - 0, 8, 16, 24, 32, 40, 48, 56, - 1, 9, 17, 25, 33, 41, 49, 57, - 2, 10, 18, 26, 34, 42, 50, 58, - 3, 11, 19, 27, 35, 43, 51, 59, - 4, 12, 20, 28, 36, 44, 52, 60, - 5, 13, 21, 29, 37, 45, 53, 61, - 6, 14, 22, 30, 38, 46, 54, 62, - 7, 15, 23, 31, 39, 47, 55, 63 -]; -pub const IVI_SCAN_8X8_HOR: [usize; 64] = [ - 0, 1, 2, 3, 4, 5, 6, 7, - 8, 9, 10, 11, 12, 13, 14, 15, - 16, 17, 18, 19, 20, 21, 22, 23, - 24, 25, 26, 27, 28, 29, 30, 31, - 32, 33, 34, 35, 36, 37, 38, 39, - 40, 41, 42, 43, 44, 45, 46, 47, - 48, 49, 50, 51, 52, 53, 54, 55, - 56, 57, 58, 59, 60, 61, 62, 63 -]; -pub const IVI_SCAN_4X4: [usize; 16] = [ 0, 1, 4, 8, 5, 2, 3, 6, 9, 12, 13, 10, 7, 11, 14, 15 ]; diff --git a/src/codecs/indeo/ivibr.rs b/src/codecs/indeo/ivibr.rs deleted file mode 100644 index 3011e1a..0000000 --- a/src/codecs/indeo/ivibr.rs +++ /dev/null @@ -1,1292 +0,0 @@ -use std::mem; -use std::rc::Rc; -use std::cell::{Ref,RefCell}; -use crate::io::bitreader::*; -//use io::intcode::*; -use super::super::*; -use crate::formats::*; -use super::ivi::*; -use super::ividsp::*; - -pub fn scale_mv(val: i32, scale: u8) -> i32 { - (val + (if val > 0 { 1 } else { 0 }) + (scale as i32) - 1) >> scale -} - -#[derive(Clone,Copy)] -pub struct IVICodebook { - len: usize, - bits: [u8; 16], - offs: [u32; 16], -} - -impl IVICodebook { - pub fn init(&self) -> Self { - let mut cb = *self; - let mut base: u32 = 0; - for i in 0..cb.len { - cb.offs[i] = base; - base += 1 << cb.bits[i]; - } - cb - } -} - -pub const IVI_CB_ZERO: IVICodebook = IVICodebook { len: 0, bits: [0; 16], offs: [0; 16] }; - -const IVI_REV0: [u32; 1] = [0]; -const IVI_REV1: [u32; 2] = [0, 1]; -const IVI_REV2: [u32; 4] = [0, 2, 1, 3]; -const IVI_REV3: [u32; 8] = [0, 4, 2, 6, 1, 5, 3, 7]; -const IVI_REV4: [u32; 16] = [ 0, 8, 4, 12, 2, 10, 6, 14, 1, 9, 5, 13, 3, 11, 7, 15]; -const IVI_REV5: [u32; 32] = [ 0, 16, 8, 24, 4, 20, 12, 28, 2, 18, 10, 26, 6, 22, 14, 30, 1, 17, 9, 25, 5, 21, 13, 29, 3, 19, 11, 27, 7, 23, 15, 31]; -const IVI_REV6: [u32; 64] = [ 0, 32, 16, 48, 8, 40, 24, 56, 4, 36, 20, 52, 12, 44, 28, 60, 2, 34, 18, 50, 10, 42, 26, 58, 6, 38, 22, 54, 14, 46, 30, 62, 1, 33, 17, 49, 9, 41, 25, 57, 5, 37, 21, 53, 13, 45, 29, 61, 3, 35, 19, 51, 11, 43, 27, 59, 7, 39, 23, 55, 15, 47, 31, 63]; -const IVI_REV7: [u32; 128] = [ 0, 64, 32, 96, 16, 80, 48, 112, 8, 72, 40, 104, 24, 88, 56, 120, 4, 68, 36, 100, 20, 84, 52, 116, 12, 76, 44, 108, 28, 92, 60, 124, 2, 66, 34, 98, 18, 82, 50, 114, 10, 74, 42, 106, 26, 90, 58, 122, 6, 70, 38, 102, 22, 86, 54, 118, 14, 78, 46, 110, 30, 94, 62, 126, 1, 65, 33, 97, 17, 81, 49, 113, 9, 73, 41, 105, 25, 89, 57, 121, 5, 69, 37, 101, 21, 85, 53, 117, 13, 77, 45, 109, 29, 93, 61, 125, 3, 67, 35, 99, 19, 83, 51, 115, 11, 75, 43, 107, 27, 91, 59, 123, 7, 71, 39, 103, 23, 87, 55, 119, 15, 79, 47, 111, 31, 95, 63, 127]; -const IVI_REV8: [u32; 256] = [ 0, 128, 64, 192, 32, 160, 96, 224, 16, 144, 80, 208, 48, 176, 112, 240, 8, 136, 72, 200, 40, 168, 104, 232, 24, 152, 88, 216, 56, 184, 120, 248, 4, 132, 68, 196, 36, 164, 100, 228, 20, 148, 84, 212, 52, 180, 116, 244, 12, 140, 76, 204, 44, 172, 108, 236, 28, 156, 92, 220, 60, 188, 124, 252, 2, 130, 66, 194, 34, 162, 98, 226, 18, 146, 82, 210, 50, 178, 114, 242, 10, 138, 74, 202, 42, 170, 106, 234, 26, 154, 90, 218, 58, 186, 122, 250, 6, 134, 70, 198, 38, 166, 102, 230, 22, 150, 86, 214, 54, 182, 118, 246, 14, 142, 78, 206, 46, 174, 110, 238, 30, 158, 94, 222, 62, 190, 126, 254, 1, 129, 65, 193, 33, 161, 97, 225, 17, 145, 81, 209, 49, 177, 113, 241, 9, 137, 73, 201, 41, 169, 105, 233, 25, 153, 89, 217, 57, 185, 121, 249, 5, 133, 69, 197, 37, 165, 101, 229, 21, 149, 85, 213, 53, 181, 117, 245, 13, 141, 77, 205, 45, 173, 109, 237, 29, 157, 93, 221, 61, 189, 125, 253, 3, 131, 67, 195, 35, 163, 99, 227, 19, 147, 83, 211, 51, 179, 115, 243, 11, 139, 75, 203, 43, 171, 107, 235, 27, 155, 91, 219, 59, 187, 123, 251, 7, 135, 71, 199, 39, 167, 103, 231, 23, 151, 87, 215, 55, 183, 119, 247, 15, 143, 79, 207, 47, 175, 111, 239, 31, 159, 95, 223, 63, 191, 127, 255]; - -const IVI_REVS: [&[u32]; 9] = [ &IVI_REV0, &IVI_REV1, &IVI_REV2, &IVI_REV3, &IVI_REV4, &IVI_REV5, &IVI_REV6, &IVI_REV7, &IVI_REV8]; - -pub trait IVICodebookReader { - fn read_ivi_codebook_desc(&mut self, mb_cb: bool, try_default: bool) -> DecoderResult<IVICodebook>; - fn read_ivi_cb(&mut self, cb: &IVICodebook) -> BitReaderResult<u32>; - fn read_ivi_cb_s(&mut self, cb: &IVICodebook) -> BitReaderResult<i32>; -} - -impl<'a> IVICodebookReader for BitReader<'a> { - fn read_ivi_codebook_desc(&mut self, mb_cb: bool, desc_coded: bool) -> DecoderResult<IVICodebook> { - if !desc_coded { - if mb_cb { - Ok(IVI_MB_CB[7].init()) - } else { - Ok(IVI_BLK_CB[7].init()) - } - } else { - let idx = self.read(3)? as usize; - if idx != 7 { - if mb_cb { - Ok(IVI_MB_CB[idx].init()) - } else { - Ok(IVI_BLK_CB[idx].init()) - } - } else { - let mut cb = IVI_CB_ZERO; - cb.len = self.read(4)? as usize; - if cb.len == 0 { return Err(DecoderError::InvalidData); } - for i in 0..cb.len { - cb.bits[i] = self.read(4)? as u8; - } - Ok(cb.init()) - } - } - } - #[inline(always)] - fn read_ivi_cb(&mut self, cb: &IVICodebook) -> BitReaderResult<u32> { -/* let pfx = if cb.len == 1 { 0 } else { self.read_code(UintCodeType::LimitedUnary((cb.len - 1) as u32, 0))? as usize }; - let nbits = cb.bits[pfx]; - let mut base: u32 = 0; - for i in 0..pfx { base += 1 << cb.bits[i]; } - let rval = self.read(nbits)?; - let add = reverse_bits(rval, nbits); - Ok(base + add)*/ - if cb.len > 1 { - let len = (!self.peek(16)).trailing_zeros() as usize; - let pfx; - if len >= cb.len - 1 { - pfx = cb.len - 1; - self.skip((cb.len - 1) as u32)?; - } else { - pfx = len; - self.skip((len + 1) as u32)?; - } - let nbits = cb.bits[pfx]; - let base = cb.offs[pfx]; - let rval = self.read(nbits)?; - let add = IVI_REVS[nbits as usize][rval as usize]; - Ok(base + add) - } else { - let nbits = cb.bits[0]; - return Ok(IVI_REVS[nbits as usize][self.read(nbits)? as usize]); - } - } - #[inline(always)] - fn read_ivi_cb_s(&mut self, cb: &IVICodebook) -> BitReaderResult<i32> { - let v = self.read_ivi_cb(cb)?; - if v == 0 { - Ok(0) - } else { - let sign = (v & 1) == 1; - let val = (v >> 1) as i32; - if sign { - Ok(val + 1) - } else { - Ok(-val) - } - } - } -} - -pub const IVI_MB_CB: &[IVICodebook; 8] = &[ - IVICodebook { len: 8, bits: [ 0, 4, 5, 4, 4, 4, 6, 6, 0, 0, 0, 0, 0, 0, 0, 0 ], offs: [0; 16] }, - IVICodebook { len: 12, bits: [ 0, 2, 2, 3, 3, 3, 3, 5, 3, 2, 2, 2, 0, 0, 0, 0 ], offs: [0; 16] }, - IVICodebook { len: 12, bits: [ 0, 2, 3, 4, 3, 3, 3, 3, 4, 3, 2, 2, 0, 0, 0, 0 ], offs: [0; 16] }, - IVICodebook { len: 12, bits: [ 0, 3, 4, 4, 3, 3, 3, 3, 3, 2, 2, 2, 0, 0, 0, 0 ], offs: [0; 16] }, - IVICodebook { len: 13, bits: [ 0, 4, 4, 3, 3, 3, 3, 2, 3, 3, 2, 1, 1, 0, 0, 0 ], offs: [0; 16] }, - IVICodebook { len: 9, bits: [ 0, 4, 4, 4, 4, 3, 3, 3, 2, 0, 0, 0, 0, 0, 0, 0 ], offs: [0; 16] }, - IVICodebook { len: 10, bits: [ 0, 4, 4, 4, 4, 3, 3, 2, 2, 2, 0, 0, 0, 0, 0, 0 ], offs: [0; 16] }, - IVICodebook { len: 12, bits: [ 0, 4, 4, 4, 3, 3, 2, 3, 2, 2, 2, 2, 0, 0, 0, 0 ], offs: [0; 16] } -]; - -pub const IVI_BLK_CB: &[IVICodebook; 8] = &[ - IVICodebook { len: 10, bits: [ 1, 2, 3, 4, 4, 7, 5, 5, 4, 1, 0, 0, 0, 0, 0, 0 ], offs: [0; 16] }, - IVICodebook { len: 11, bits: [ 2, 3, 4, 4, 4, 7, 5, 4, 3, 3, 2, 0, 0, 0, 0, 0 ], offs: [0; 16] }, - IVICodebook { len: 12, bits: [ 2, 4, 5, 5, 5, 5, 6, 4, 4, 3, 1, 1, 0, 0, 0, 0 ], offs: [0; 16] }, - IVICodebook { len: 13, bits: [ 3, 3, 4, 4, 5, 6, 6, 4, 4, 3, 2, 1, 1, 0, 0, 0 ], offs: [0; 16] }, - IVICodebook { len: 11, bits: [ 3, 4, 4, 5, 5, 5, 6, 5, 4, 2, 2, 0, 0, 0, 0, 0 ], offs: [0; 16] }, - IVICodebook { len: 13, bits: [ 3, 4, 5, 5, 5, 5, 6, 4, 3, 3, 2, 1, 1, 0, 0, 0 ], offs: [0; 16] }, - IVICodebook { len: 13, bits: [ 3, 4, 5, 5, 5, 6, 5, 4, 3, 3, 2, 1, 1, 0, 0, 0 ], offs: [0; 16] }, - IVICodebook { len: 9, bits: [ 3, 4, 4, 5, 5, 5, 6, 5, 5, 0, 0, 0, 0, 0, 0, 0 ], offs: [0; 16] } -]; - -#[allow(unused_variables)] -fn read_trans_band_header(br: &mut BitReader, w: usize, h: usize, dst: &mut [i16], dstride: usize) -> DecoderResult<()> { - let color_plane = br.read(2)?; - let bit_depth = br.read(3)?; - let dirty_rects = br.read(8)? as usize; - for i in 0..dirty_rects { - let x = br.read(16)?; - let y = br.read(16)?; - let l = br.read(16)?; - let r = br.read(16)?; - } - let has_trans_color = br.read_bool()?; - if has_trans_color { - let r = br.read(8)?; - let g = br.read(8)?; - let b = br.read(8)?; - } - - br.skip(1)?; - - let mut cb = IVI_CB_ZERO; - cb.len = br.read(4)? as usize; - if cb.len == 0 { return Err(DecoderError::InvalidData); } - for i in 0..cb.len { - cb.bits[i] = br.read(4)? as u8; - } - br.align(); - -let tile_start = br.tell(); - let empty = br.read_bool()?; - if !empty { - br.read_bool()?; - let mut len = br.read(8)? as usize; - if len == 255 { - len = br.read(24)? as usize; - } - br.align(); -let tile_end = tile_start + len * 8; - - let first_val = br.read_bool()?; - - let mut dec_size = 0; - let mut x = 0; - let mut y = 0; - let mut fill = if !first_val { 255-128 } else { 0-128 }; - let tr_w = (w + 31) & !31; - while br.tell() < tile_end { - let code = br.read_ivi_cb(&cb)? as usize; - if code == 0 { - dec_size += 255; - for _ in 0..255 { - if (x < w) && (y < h) { - dst[x + y * dstride] = fill; - } - x += 1; - if x == tr_w { - x = 0; - y += 1; - } - } - } else { - dec_size += code; - for _ in 0..code { - if (x < w) && (y < h) { - dst[x + y * dstride] = fill; - } - x += 1; - if x == tr_w { - x = 0; - y += 1; - } - } - fill = !fill; - } - } - br.align(); - } else { - } - - Ok(()) -} - -fn decode_block8x8(br: &mut BitReader, blk_cb: &IVICodebook, rvmap: &RVMap, tables: &TxParams8x8, is_intra: bool, is_2d: bool, prev_dc: &mut i32, quant: u8, coeffs: &mut [i32; 64], transform: &TrFunc) -> DecoderResult<()> { - let mut idx: isize = -1; - let quant_mat = if is_intra { tables.quant_intra } else { tables.quant_inter }; - while idx <= 64 { - let c = br.read_ivi_cb(blk_cb)?; - if c == rvmap.eob_sym { break; } - let run; - let val: i32; - if c != rvmap.esc_sym { - validate!(c < 256); - run = rvmap.runtab[c as usize] as isize; - val = rvmap.valtab[c as usize] as i32; - } else { - run = (br.read_ivi_cb(blk_cb)? as isize) + 1; - let lo = br.read_ivi_cb(blk_cb)?; - let hi = br.read_ivi_cb(blk_cb)?; - let v = (hi << 6) + lo; - if v == 0 { - val = 0; // should not happen but still... - } else { - let vv = (v >> 1) as i32; - if (v & 1) != 0 { - val = vv + 1; - } else { - val = -vv; - } - } - } - idx += run; - validate!((idx >= 0) && (idx < 64)); - - let spos = tables.scan[idx as usize]; - let q = ((quant_mat[spos] as u32) * (quant as u32)) >> 9; - if q > 1 { - let qq = q as i32; - let bias = (((q ^ 1) - 1) >> 1) as i32; - coeffs[spos] = val * qq; - if val > 0 { coeffs[spos] += bias; } - else { coeffs[spos] -= bias; } - } else { - coeffs[spos] = val; - } - } - if is_intra && is_2d { - *prev_dc += coeffs[0]; - coeffs[0] = *prev_dc; - } - (transform)(coeffs); - Ok(()) -} -fn decode_block4x4(br: &mut BitReader, blk_cb: &IVICodebook, rvmap: &RVMap, tables: &TxParams4x4, is_intra: bool, is_2d: bool, prev_dc: &mut i32, quant: u8, coeffs: &mut [i32; 64], transform: &TrFunc) -> DecoderResult<()> { - let mut idx: isize = -1; - let quant_mat = if is_intra { tables.quant_intra } else { tables.quant_inter }; - while idx <= 64 { - let c = br.read_ivi_cb(blk_cb)?; - if c == rvmap.eob_sym { break; } - let run; - let val: i32; - if c != rvmap.esc_sym { - validate!(c < 256); - run = rvmap.runtab[c as usize] as isize; - val = rvmap.valtab[c as usize] as i32; - } else { - run = (br.read_ivi_cb(blk_cb)? as isize) + 1; - let lo = br.read_ivi_cb(blk_cb)?; - let hi = br.read_ivi_cb(blk_cb)?; - let v = (hi << 6) + lo; - if v == 0 { - val = 0; // should not happen but still... - } else { - if (v & 1) != 0 { - val = ((v >> 1) as i32) + 1; - } else { - val = -((v >> 1) as i32); - } - } - } - idx += run; - validate!((idx >= 0) && (idx < 16)); - - let spos = tables.scan[idx as usize]; - let q = ((quant_mat[spos] as u32) * (quant as u32)) >> 9; - if q > 1 { - let qq = q as i32; - let bias = (((q ^ 1) - 1) >> 1) as i32; - coeffs[spos] = val * qq; - if val > 0 { coeffs[spos] += bias; } - else { coeffs[spos] -= bias; } - } else { - coeffs[spos] = val; - } - } - if is_intra && is_2d { - *prev_dc += coeffs[0]; - coeffs[0] = *prev_dc; - } - (transform)(coeffs); - Ok(()) -} - -fn put_block(frame: &mut [i16], offs: usize, stride: usize, blk: &[i32], blk_size: usize) { - unsafe { - let mut dptr = frame.as_mut_ptr().offset(offs as isize); - for y in 0..blk_size { - for x in 0..blk_size { - *dptr.offset(x as isize) = blk[x + y * blk_size] as i16; - } - dptr = dptr.offset(stride as isize); - } - } -} - -fn add_block(frame: &mut [i16], offs: usize, stride: usize, blk: &[i32], blk_size: usize) { - unsafe { - let mut dptr = frame.as_mut_ptr().offset(offs as isize); - for y in 0..blk_size { - for x in 0..blk_size { - *dptr.offset(x as isize) = (*dptr.offset(x as isize)).wrapping_add(blk[x + y * blk_size] as i16); - } - dptr = dptr.offset(stride as isize); - } - } -} - -struct FrameData { - plane_buf: [Vec<i16>; 4], - plane_stride: [usize; 4], - pic_hdr: PictureHeader, -} - -fn align(val: usize, bits: u8) -> usize { - let mask = (1 << bits) - 1; - (val + mask) & !mask -} - -impl FrameData { - fn new() -> Rc<RefCell<Self>> { - Rc::new(RefCell::new(FrameData { - plane_buf: [Vec::new(), Vec::new(), Vec::new(), Vec::new()], - plane_stride: [0, 0, 0, 0], - pic_hdr: PictureHeader::new_null(IVIFrameType::Intra), - })) - } - fn realloc(&mut self, pic_hdr: &PictureHeader) -> DecoderResult<()> { - let width = align(pic_hdr.width, 6); - let height = align(pic_hdr.height, 6); - - let stride = width; - self.plane_buf[0].resize(stride * height, 0); - self.plane_stride[0] = stride; - for plane in 1..3 { - self.plane_buf[plane].resize((stride >> 1) * (height >> 1), 0); - self.plane_stride[plane] = stride >> 1; - } - if pic_hdr.transparent { - self.plane_buf[3].resize(stride * height, 0); - self.plane_stride[3] = stride; - } - self.pic_hdr = *pic_hdr; - Ok(()) - } - fn fill_plane(&mut self, vb: &mut NAVideoBuffer<u8>, plane: usize) { - let (w, h) = vb.get_dimensions(plane); - let mut didx = vb.get_offset(plane); - let dstride = vb.get_stride(plane); - let mut dst = vb.get_data_mut(); - let src = &self.plane_buf[plane]; - let mut sidx = 0; - let sstride = self.plane_stride[plane]; - for _ in 0..h { - for x in 0..w { - dst[didx + x] = clip8(src[sidx + x] + 128); - } - didx += dstride; - sidx += sstride; - } - } -} - -fn do_mc(dst: &mut [i16], dstride: usize, src: &[i16], sstride: usize, x: usize, y: usize, l: usize, r: usize, t: usize, b: usize, mv_x: i32, mv_y: i32, is_hpel: bool, blk_size: usize) { - let (xoff, yoff, mv_mode) = if is_hpel { - (mv_x >> 1, mv_y >> 1, ((mv_x & 1) + (mv_y & 1) * 2) as u8) - } else{ - (mv_x, mv_y, 0) - }; - let xpos = (x as isize) + (xoff as isize); - let ypos = (y as isize) + (yoff as isize); - if (xpos < (l as isize)) || ((xpos as usize) + blk_size + ((mv_mode & 1) as usize) > r) || - (ypos < (t as isize)) || ((ypos as usize) + blk_size + ((mv_mode >> 1) as usize) > b) { -//println!(" copy from {},{} of {}-{},{}-{} {}x{}!", xpos, ypos, l,r,t,b,blk_size,blk_size); - return; - } - let sidx = (xpos as usize) + (ypos as usize) * sstride; - if blk_size == 8 { - ivi_mc_put(dst, dstride, &src[sidx..], sstride, mv_mode, 8, 8); - } else { - ivi_mc_put(dst, dstride, &src[sidx..], sstride, mv_mode, 4, 4); - } -} - -fn do_mc_b(dst: &mut [i16], dstride: usize, src1: &[i16], sstride1: usize, src2: &[i16], sstride2: usize, x: usize, y: usize, l: usize, r: usize, t: usize, b: usize, mv_x: i32, mv_y: i32, mv2_x: i32, mv2_y: i32, is_hpel: bool, blk_size: usize) { - let (xoff1, yoff1, mv_mode1) = if is_hpel { - (mv_x >> 1, mv_y >> 1, ((mv_x & 1) + (mv_y & 1) * 2) as u8) - } else{ - (mv_x, mv_y, 0) - }; - let xpos1 = (x as isize) + (xoff1 as isize); - let ypos1 = (y as isize) + (yoff1 as isize); - if (xpos1 < (l as isize)) || ((xpos1 as usize) + blk_size + ((mv_mode1 & 1) as usize) > r) || - (ypos1 < (t as isize)) || ((ypos1 as usize) + blk_size + ((mv_mode1 >> 1) as usize) > b) { - return; - } - let sidx1 = (xpos1 as usize) + (ypos1 as usize) * sstride1; - let (xoff2, yoff2, mv_mode2) = if is_hpel { - (mv2_x >> 1, mv2_y >> 1, ((mv2_x & 1) + (mv2_y & 1) * 2) as u8) - } else{ - (mv2_x, mv2_y, 0) - }; - let xpos2 = (x as isize) + (xoff2 as isize); - let ypos2 = (y as isize) + (yoff2 as isize); - if (xpos2 < (l as isize)) || ((xpos2 as usize) + blk_size + ((mv_mode2 & 1) as usize) > r) || - (ypos2 < (t as isize)) || ((ypos2 as usize) + blk_size + ((mv_mode2 >> 1) as usize) > b) { - return; - } - let sidx2 = (xpos2 as usize) + (ypos2 as usize) * sstride2; - ivi_mc_avg(dst, dstride, &src1[sidx1..], sstride1, mv_mode1, &src2[sidx2..], sstride2, mv_mode2, blk_size, blk_size); -} - -pub trait IndeoXParser { - fn decode_picture_header(&mut self, br: &mut BitReader) -> DecoderResult<PictureHeader>; - fn decode_band_header(&mut self, br: &mut BitReader, pic_hdr: &PictureHeader, plane: usize, band: usize) -> DecoderResult<BandHeader>; - fn decode_mb_info(&mut self, br: &mut BitReader, pic_hdr: &PictureHeader, band_hdr: &BandHeader, tile: &mut IVITile, ref_tile: Option<Ref<IVITile>>, mv_scale: u8) -> DecoderResult<()>; - fn recombine_plane(&mut self, src: &[i16], sstride: usize, dst: &mut [u8], dstride: usize, w: usize, h: usize); -} - -const MISSING_REF: usize = 42; - -pub struct IVIDecoder { - ftype: IVIFrameType, - frames: [Rc<RefCell<FrameData>>; 4], - cur_frame: usize, - prev_frame: usize, - next_frame: usize, - iref_0: usize, - iref_1: usize, - scal_ref: usize, - vinfo: NAVideoInfo, - vinfoa: NAVideoInfo, - bref: Option<NABufferType>, - - bands: Vec<BandHeader>, - tiles: Vec<Rc<RefCell<IVITile>>>, - num_tiles: [[usize; 4]; 4], - tile_start: [[usize; 4]; 4], -} - -impl IVIDecoder { - pub fn new() -> Self { - let mut bands: Vec<BandHeader> = Vec::with_capacity(12); - bands.resize(12, BandHeader::new_empty(42, 42)); - IVIDecoder { - ftype: IVIFrameType::NULL, - frames: [FrameData::new(), FrameData::new(), FrameData::new(), FrameData::new()], - cur_frame: 0, prev_frame: MISSING_REF, next_frame: MISSING_REF, - iref_0: MISSING_REF, iref_1: MISSING_REF, scal_ref: MISSING_REF, - vinfo: NAVideoInfo::new(0, 0, false, YUV410_FORMAT), - vinfoa: NAVideoInfo::new(0, 0, false, YUVA410_FORMAT), - bref: None, - - bands: bands, - tiles: Vec::new(), tile_start: [[0; 4]; 4], num_tiles: [[0; 4]; 4], - } - } - - fn realloc(&mut self, pic_hdr: &PictureHeader) -> DecoderResult<()> { - let planes = if pic_hdr.transparent { 4 } else { 3 }; - - //self.bands.truncate(0); - self.tiles.truncate(0); - self.num_tiles = [[0; 4]; 4]; - self.tile_start = [[0; 4]; 4]; - let mut tstart: usize = 0; - for plane in 0..planes { - let is_luma = (plane != 1) && (plane != 2); - let bands = if is_luma { pic_hdr.luma_bands } else { pic_hdr.chroma_bands }; - let mut band_w = if is_luma { pic_hdr.width } else { (pic_hdr.width + 3) >> 2 }; - let mut band_h = if is_luma { pic_hdr.height } else { (pic_hdr.height + 3) >> 2 }; - let mut tile_w = if is_luma { pic_hdr.slice_w } else { (pic_hdr.slice_w + 3) >> 2 }; - let mut tile_h = if is_luma { pic_hdr.slice_h } else { (pic_hdr.slice_h + 3) >> 2 }; - if bands > 1 { - band_w = (band_w + 1) >> 1; - band_h = (band_h + 1) >> 1; - if plane == 0 { - tile_w = (tile_w + 1) >> 1; - tile_h = (tile_h + 1) >> 1; - } - } - for band in 0..bands { - self.tile_start[plane][band] = tstart; - let band_xoff = if (band & 1) == 1 { band_w } else { 0 }; - let band_yoff = if (band & 2) == 2 { band_h } else { 0 }; - let mut y = 0; - while y < band_h { - let cur_h = if y + tile_h <= band_h { tile_h } else { band_h - y }; - let mut x = 0; - while x < band_w { - let cur_w = if x + tile_w <= band_w { tile_w } else { band_w - x }; - let tile = IVITile::new(band_xoff + x, band_yoff + y, cur_w, cur_h); - self.tiles.push(Rc::new(RefCell::new(tile))); - self.num_tiles[plane][band] += 1; - tstart += 1; - x += tile_w; - } - y += tile_h; - } - } - } - Ok(()) - } - fn decode_band(&mut self, pic_hdr: &PictureHeader, dec: &mut IndeoXParser, br: &mut BitReader, plane_no: usize, band_no: usize) -> DecoderResult<()> { - let bidx = match plane_no { - 0 => { band_no }, - _ => { pic_hdr.luma_bands + plane_no - 1 }, - }; - let prev_band = if bidx >= self.bands.len() { BandHeader::new_empty(plane_no, band_no) } else { self.bands[bidx].clone() }; - let mut band = dec.decode_band_header(br, pic_hdr, plane_no, band_no)?; - if let TxType::None = band.ttype { - validate!(band.plane_no == prev_band.plane_no); - validate!(band.band_no == prev_band.band_no); - validate!(band.blk_size == prev_band.blk_size); - band.tr = prev_band.tr; - band.ttype = prev_band.ttype; - }; - - let tstart = self.tile_start[band.plane_no][band.band_no]; - let tend = tstart + self.num_tiles[band.plane_no][band.band_no]; - let mb_size = band.mb_size; - let (tr, tr_dc) = match band.ttype { - TxType::Transform4(_) => { ivi_get_transform4x4_funcs(band.tr) }, - TxType::Transform8(_) => { ivi_get_transform8x8_funcs(band.tr) }, - _ => { ivi_get_transform4x4_funcs(band.tr) }, - }; - for tile_no in tstart..tend { - { - let mut tile = self.tiles[tile_no].borrow_mut(); - let mb_w = (tile.w + mb_size - 1) / mb_size; - let mb_h = (tile.h + mb_size - 1) / mb_size; - tile.mb_w = mb_w; - tile.mb_h = mb_h; - tile.mb.truncate(0); - tile.mb.resize(mb_w * mb_h, MB::new(0, 0)); - } - - let tile_start = br.tell(); - if !br.read_bool()? { - let res = br.read_bool()?; - validate!(res); - let mut len = br.read(8)? as usize; - if len == 255 { - len = br.read(24)? as usize; - } - br.align(); - validate!(len > 0); - let tile_end = tile_start + len * 8; - validate!(tile_end > br.tell()); - validate!(tile_end <= br.tell() + (br.left() as usize)); - { - let mut tile = self.tiles[tile_no].borrow_mut(); - let ref_tile: Option<Ref<IVITile>>; - let mv_scale; - if (plane_no == 0) && (band_no == 0) { - mv_scale = 0; - } else { - mv_scale = (((self.bands[0].mb_size >> 3) as i8) - ((band.mb_size >> 3) as i8)) as u8; - } - if plane_no != 0 || band_no != 0 { - let rtile = self.tiles[0].borrow(); - if (tile.mb_w != rtile.mb_w) || (tile.mb_h != rtile.mb_h) { - ref_tile = None; - } else { - ref_tile = Some(rtile); - } - } else { - ref_tile = None; - } - dec.decode_mb_info(br, pic_hdr, &band, &mut tile, ref_tile, mv_scale)?; - } - - self.decode_tile(br, &band, tile_no, &tr, &tr_dc)?; -let skip_part = tile_end - br.tell(); -br.skip(skip_part as u32)?; - } else { - { - let mut tile = self.tiles[tile_no].borrow_mut(); - let ref_tile: Option<Ref<IVITile>>; - let mv_scale; - if (plane_no == 0) && (band_no == 0) { - mv_scale = 0; - } else { - mv_scale = (((self.bands[0].mb_size >> 3) as i8) - ((band.mb_size >> 3) as i8)) as u8; - } - if plane_no != 0 || band_no != 0 { - let rtile = self.tiles[0].borrow(); - if (tile.mb_w != rtile.mb_w) || (tile.mb_h != rtile.mb_h) { - ref_tile = None; - } else { - ref_tile = Some(rtile); - } - } else { - ref_tile = None; - } - let mut mb_idx = 0; - for mb_y in 0..tile.mb_h { - for mb_x in 0..tile.mb_w { - let mut mb = MB::new(tile.pos_x + mb_x * band.mb_size, tile.pos_y + mb_y * band.mb_size); - mb.mtype = MBType::Inter; - mb.cbp = 0; - if band.inherit_mv { - if let Some(ref tileref) = ref_tile { - let mx = tileref.mb[mb_idx].mv_x; - let my = tileref.mb[mb_idx].mv_y; - mb.mv_x = scale_mv(mx, mv_scale); - mb.mv_y = scale_mv(my, mv_scale); - } - } - tile.mb[mb_idx] = mb; - mb_idx += 1; - } - } - } - self.decode_tile(br, &band, tile_no, &tr, &tr_dc)?; - } - } - self.bands[bidx] = band; - br.align(); - Ok(()) - } - fn decode_tile(&mut self, br: &mut BitReader, band: &BandHeader, tile_no: usize, tr: &TrFunc, transform_dc: &TrFuncDC) -> DecoderResult<()> { - let mut mb_idx = 0; - let mut prev_dc: i32 = 0; - let mut tile = self.tiles[tile_no].borrow_mut(); - let mut frame = self.frames[self.cur_frame].borrow_mut(); - - let stride = frame.plane_stride[band.plane_no]; - let mut dstidx = tile.pos_x + tile.pos_y * stride; - let mut dst = &mut frame.plane_buf[band.plane_no]; - let pos_x = tile.pos_x; - let pos_y = tile.pos_y; - let tile_w = (tile.w + 15) & !15; - let tile_h = (tile.h + 15) & !15; - for mb_y in 0..tile.mb_h { - for mb_x in 0..tile.mb_w { - let mb = &mut tile.mb[mb_idx]; - - let is_intra = mb.mtype == MBType::Intra; - - if band.mb_size != band.blk_size { - let mut cbp = mb.cbp; - for blk_no in 0..4 { - let mut blk: [i32; 64] = [0; 64]; - let boff = (blk_no & 1) * 8 + (blk_no & 2) * 4 * stride + mb_x * 16; - if !is_intra { - if mb.mtype != MBType::Bidir { - let idx; - if mb.mtype != MBType::Backward { - idx = self.prev_frame; - } else { - idx = self.next_frame; - } - let pf = self.frames[idx].borrow(); - do_mc(&mut dst[dstidx + boff..], stride, - &pf.plane_buf[band.plane_no], pf.plane_stride[band.plane_no], - pos_x + mb_x * 16 + (blk_no & 1) * 8, - pos_y + mb_y * 16 + (blk_no & 2) * 4, - pos_x, pos_x + tile_w, pos_y, pos_y + tile_h, - mb.mv_x, mb.mv_y, band.halfpel, 8); - } else { - let pf = self.frames[self.prev_frame].borrow(); - let nf = self.frames[self.next_frame].borrow(); - do_mc_b(&mut dst[dstidx + boff..], stride, - &pf.plane_buf[band.plane_no], pf.plane_stride[band.plane_no], - &nf.plane_buf[band.plane_no], nf.plane_stride[band.plane_no], - pos_x + mb_x * 16 + (blk_no & 1) * 8, - pos_y + mb_y * 16 + (blk_no & 2) * 4, - pos_x, pos_x + tile_w, pos_y, pos_y + tile_h, - mb.mv_x, mb.mv_y, mb.mv2_x, mb.mv2_y, band.halfpel, - band.blk_size); - } - } - if (cbp & 1) != 0 { - if let TxType::Transform8(ref params) = band.ttype { - decode_block8x8(br, &band.blk_cb, &band.rvmap, params, is_intra, band.tr.is_2d(), &mut prev_dc, mb.q, &mut blk, tr)?; - if is_intra { - put_block(&mut dst, dstidx + boff, stride, &blk, 8); - } else { - add_block(&mut dst, dstidx + boff, stride, &blk, 8); - } - } - } else { - if is_intra { - (transform_dc)(&mut blk, prev_dc); - put_block(&mut dst, dstidx + boff, stride, &blk, 8); - } - } - cbp >>= 1; - } - } else { - let mut blk: [i32; 64] = [0; 64]; - if !is_intra { - if mb.mtype != MBType::Bidir { - let idx; - if mb.mtype != MBType::Backward { - idx = self.prev_frame; - } else { - idx = self.next_frame; - } - let pf = self.frames[idx].borrow(); - do_mc(&mut dst[dstidx + mb_x * band.blk_size..], stride, - &pf.plane_buf[band.plane_no], pf.plane_stride[band.plane_no], - pos_x + mb_x * band.mb_size, - pos_y + mb_y * band.mb_size, - pos_x, pos_x + tile_w, pos_y, pos_y + tile_h, - mb.mv_x, mb.mv_y, band.halfpel, band.blk_size); - } else { - let pf = self.frames[self.prev_frame].borrow(); - let nf = self.frames[self.next_frame].borrow(); - do_mc_b(&mut dst[dstidx + mb_x * band.blk_size..], stride, - &pf.plane_buf[band.plane_no], pf.plane_stride[band.plane_no], - &nf.plane_buf[band.plane_no], nf.plane_stride[band.plane_no], - pos_x + mb_x * band.mb_size, - pos_y + mb_y * band.mb_size, - pos_x, pos_x + tile_w, pos_y, pos_y + tile_h, - mb.mv_x, mb.mv_y, mb.mv2_x, mb.mv2_y, band.halfpel, - band.blk_size); - } - } - if mb.cbp != 0 { - if let TxType::Transform8(ref params) = band.ttype { - decode_block8x8(br, &band.blk_cb, &band.rvmap, params, is_intra, band.tr.is_2d(), &mut prev_dc, mb.q, &mut blk, tr)?; - } - if let TxType::Transform4(ref params) = band.ttype { - decode_block4x4(br, &band.blk_cb, &band.rvmap, params, is_intra, band.tr.is_2d(), &mut prev_dc, mb.q, &mut blk, tr)?; - } - if is_intra { - if band.blk_size == 8 { - put_block(&mut dst, dstidx + mb_x * band.blk_size, stride, &blk, 8); - } else { - put_block(&mut dst, dstidx + mb_x * band.blk_size, stride, &blk, 4); - } - } else { - if band.blk_size == 8 { - add_block(&mut dst, dstidx + mb_x * band.blk_size, stride, &blk, 8); - } else { - add_block(&mut dst, dstidx + mb_x * band.blk_size, stride, &blk, 4); - } - } - } else { - if is_intra { - (transform_dc)(&mut blk, prev_dc); - if band.blk_size == 8 { - put_block(&mut dst, dstidx + mb_x * band.blk_size, stride, &blk, 8); - } else { - put_block(&mut dst, dstidx + mb_x * band.blk_size, stride, &blk, 4); - } - } - } - } - mb_idx += 1; - } - dstidx += stride * band.mb_size; - } - br.align(); - Ok(()) - } - - fn find_unused_frame(&self) -> usize { - for fno in 0..4 { - if (fno != self.iref_0) && (fno != self.iref_1) && (fno != self.scal_ref) { - return fno; - } - } - unreachable!(); - } - - fn decode_single_frame<'a>(&mut self, dec: &mut IndeoXParser, br: &mut BitReader<'a>) -> DecoderResult<NABufferType> { - let pic_hdr = dec.decode_picture_header(br)?; - self.ftype = pic_hdr.ftype; - if pic_hdr.ftype.is_null() { - return Ok(NABufferType::None); - } - - self.cur_frame = self.find_unused_frame(); - match self.ftype { - IVIFrameType::Inter => { - self.prev_frame = self.iref_0; - if self.prev_frame == MISSING_REF { - return Err(DecoderError::MissingReference); - } - }, - IVIFrameType::InterDroppable => { - self.prev_frame = self.scal_ref; - if self.prev_frame == MISSING_REF { - return Err(DecoderError::MissingReference); - } - }, - IVIFrameType::InterScal => { - self.prev_frame = self.scal_ref; - if self.prev_frame == MISSING_REF { - return Err(DecoderError::MissingReference); - } - }, - IVIFrameType::Bidir => { - self.prev_frame = self.iref_1; - self.next_frame = self.iref_0; - if (self.prev_frame == MISSING_REF) || (self.next_frame == MISSING_REF) { - return Err(DecoderError::MissingReference); - } - }, - _ => {}, - }; - - let mut vinfo; - if pic_hdr.transparent { - vinfo = self.vinfoa.clone(); - } else { - vinfo = self.vinfo.clone(); - } - vinfo.set_width(pic_hdr.width); - vinfo.set_height(pic_hdr.height); - let mut buftype = alloc_video_buffer(vinfo, 0)?; - self.realloc(&pic_hdr)?; - self.frames[self.cur_frame].borrow_mut().realloc(&pic_hdr)?; - - for plane in 0..3 { - let num_bands = if plane == 0 { pic_hdr.luma_bands } else { pic_hdr.chroma_bands }; - for band in 0..num_bands { - self.decode_band(&pic_hdr, dec, br, plane, band)?; - } - if let NABufferType::Video(ref mut vb) = buftype { - let mut frame = self.frames[self.cur_frame].borrow_mut(); - if num_bands == 1 { - frame.fill_plane(vb, plane); - } else { - let (w, h) = vb.get_dimensions(plane); - let dstride = vb.get_stride(plane); - let off = vb.get_offset(plane); - let mut dst = vb.get_data_mut(); - dec.recombine_plane(&frame.plane_buf[plane], frame.plane_stride[plane], &mut dst[off..], dstride, w, h); - } - } - } - if pic_hdr.transparent { - let mut frame = self.frames[self.cur_frame].borrow_mut(); - let stride = frame.plane_stride[3]; - read_trans_band_header(br, pic_hdr.width, pic_hdr.height, &mut frame.plane_buf[3], stride)?; - if let NABufferType::Video(ref mut vb) = buftype { - frame.fill_plane(vb, 3); - } - } - - match self.ftype { - IVIFrameType::Intra | IVIFrameType::Inter => { - self.iref_1 = self.iref_0; - self.iref_0 = self.cur_frame; - self.scal_ref = self.cur_frame; - }, - IVIFrameType::InterScal => { - self.scal_ref = self.cur_frame; - }, - _ => {}, - }; - - Ok(buftype) - } - - pub fn decode_frame<'a>(&mut self, dec: &mut IndeoXParser, br: &mut BitReader<'a>) -> DecoderResult<NABufferType> { - let res = self.decode_single_frame(dec, br); - if res.is_err() { return res; } - if (self.ftype == IVIFrameType::Intra) && (br.left() > 16) { - loop { - if br.left() < 8 { break; } - if br.read(8)? == 0 { break; } - } - loop { - if br.left() < 8 { break; } - if br.peek(8) != 0 { break; } - br.skip(8)?; - } - if br.left() > 24 { - let seq = br.peek(21); - if seq == 0xBFFF8 { - let res2 = self.decode_single_frame(dec, br); - if res2.is_ok() { - self.bref = Some(res2.unwrap()); - } - } - self.ftype = IVIFrameType::Intra; - } - } - if let Ok(NABufferType::None) = res { - if self.bref.is_some() { - let mut bref: Option<NABufferType> = None; - mem::swap(&mut bref, &mut self.bref); - self.ftype = IVIFrameType::Inter; - return Ok(bref.unwrap()); - } - } - res - } - - pub fn is_intra(&mut self) -> bool { - self.ftype.is_intra() - } - pub fn get_frame_type(&mut self) -> FrameType { - match self.ftype { - IVIFrameType::Intra => { FrameType::I }, - IVIFrameType::Intra1 => { FrameType::I }, - IVIFrameType::Inter => { FrameType::P }, - IVIFrameType::InterDroppable => { FrameType::P }, - IVIFrameType::InterScal => { FrameType::P }, - IVIFrameType::Bidir => { FrameType::B }, - _ => { FrameType::Skip }, - } - } -} - -pub struct RVMap { - pub eob_sym: u32, - pub esc_sym: u32, - pub runtab: [u8; 256], - pub valtab: [i8; 256], -} - -impl Clone for RVMap { - fn clone(&self) -> RVMap { - let mut runtab: [u8; 256] = [0; 256]; - let mut valtab: [i8; 256] = [0; 256]; - runtab.copy_from_slice(&self.runtab); - valtab.copy_from_slice(&self.valtab); - RVMap { eob_sym: self.eob_sym, esc_sym: self.esc_sym, runtab: runtab, valtab: valtab } - } -} - -pub const IVI_ZERO_RVMAP: RVMap = RVMap { eob_sym: 0, esc_sym: 0, runtab: [0; 256], valtab: [0; 256] }; - -pub static IVI_RVMAPS: [RVMap; 9] = [ - RVMap { eob_sym: 5, esc_sym: 2, runtab: [ - 1, 1, 0, 1, 1, 0, 1, 1, 2, 2, 1, 1, 1, 1, 3, 3, - 1, 1, 2, 2, 1, 1, 4, 4, 1, 1, 1, 1, 2, 2, 5, 5, - 1, 1, 3, 3, 1, 1, 6, 6, 1, 2, 1, 2, 7, 7, 1, 1, - 8, 8, 1, 1, 4, 2, 1, 4, 2, 1, 3, 3, 1, 1, 1, 9, - 9, 1, 2, 1, 2, 1, 5, 5, 1, 1, 10, 10, 1, 1, 3, 3, - 2, 2, 1, 1, 11, 11, 6, 4, 4, 1, 6, 1, 2, 1, 2, 12, - 8, 1, 12, 7, 8, 7, 1, 16, 1, 16, 1, 3, 3, 13, 1, 13, - 2, 2, 1, 15, 1, 5, 14, 15, 1, 5, 14, 1, 17, 8, 17, 8, - 1, 4, 4, 2, 2, 1, 25, 25, 24, 24, 1, 3, 1, 3, 1, 8, - 6, 7, 6, 1, 18, 8, 18, 1, 7, 23, 2, 2, 23, 1, 1, 21, - 22, 9, 9, 22, 19, 1, 21, 5, 19, 5, 1, 33, 20, 33, 20, 8, - 4, 4, 1, 32, 2, 2, 8, 3, 32, 26, 3, 1, 7, 7, 26, 6, - 1, 6, 1, 1, 16, 1, 10, 1, 10, 2, 16, 29, 28, 2, 29, 28, - 1, 27, 5, 8, 5, 27, 1, 8, 3, 7, 3, 31, 41, 31, 1, 41, - 6, 1, 6, 7, 4, 4, 1, 1, 2, 1, 2, 11, 34, 30, 11, 1, - 30, 15, 15, 34, 36, 40, 36, 40, 35, 35, 37, 37, 39, 39, 38, 38 ], - valtab: [ - 1, -1, 0, 2, -2, 0, 3, -3, 1, -1, 4, -4, 5, -5, 1, -1, - 6, -6, 2, -2, 7, -7, 1, -1, 8, -8, 9, -9, 3, -3, 1, -1, - 10, -10, 2, -2, 11, -11, 1, -1, 12, 4, -12, -4, 1, -1, 13, -13, - 1, -1, 14, -14, 2, 5, 15, -2, -5, -15, -3, 3, 16, -16, 17, 1, - -1, -17, 6, 18, -6, -18, 2, -2, 19, -19, 1, -1, 20, -20, 4, -4, - 7, -7, 21, -21, 1, -1, 2, 3, -3, 22, -2, -22, 8, 23, -8, 1, - 2, -23, -1, 2, -2, -2, 24, 1, -24, -1, 25, 5, -5, 1, -25, -1, - 9, -9, 26, 1, -26, 3, 1, -1, 27, -3, -1, -27, 1, 3, -1, -3, - 28, -4, 4, 10, -10, -28, 1, -1, 1, -1, 29, 6, -29, -6, 30, -4, - 3, 3, -3, -30, 1, 4, -1, 31, -3, 1, 11, -11, -1, -31, 32, -1, - -1, 2, -2, 1, 1, -32, 1, 4, -1, -4, 33, -1, 1, 1, -1, 5, - 5, -5, -33, -1, -12, 12, -5, -7, 1, 1, 7, 34, 4, -4, -1, 4, - -34, -4, 35, 36, -2, -35, -2, -36, 2, 13, 2, -1, 1, -13, 1, -1, - 37, 1, -5, 6, 5, -1, 38, -6, -8, 5, 8, -1, 1, 1, -37, -1, - 5, 39, -5, -5, 6, -6, -38, -39, -14, 40, 14, 2, 1, 1, -2, -40, - -1, -2, 2, -1, -1, -1, 1, 1, 1, -1, 1, -1, 1, -1, 1, -1 ], - }, - RVMap { eob_sym: 0, esc_sym: 38, runtab: [ - 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 8, 6, 8, 7, - 7, 9, 9, 10, 10, 11, 11, 1, 12, 1, 12, 13, 13, 16, 14, 16, - 14, 15, 15, 17, 17, 18, 0, 18, 19, 20, 21, 19, 22, 21, 20, 22, - 25, 24, 2, 25, 24, 23, 23, 2, 26, 28, 26, 28, 29, 27, 29, 27, - 33, 33, 1, 32, 1, 3, 32, 30, 36, 3, 36, 30, 31, 31, 35, 34, - 37, 41, 34, 35, 37, 4, 41, 4, 49, 8, 8, 49, 40, 38, 5, 38, - 40, 39, 5, 39, 42, 43, 42, 7, 57, 6, 43, 44, 6, 50, 7, 44, - 57, 48, 50, 48, 45, 45, 46, 47, 51, 46, 47, 58, 1, 51, 58, 1, - 52, 59, 53, 9, 52, 55, 55, 59, 53, 56, 54, 56, 54, 9, 64, 64, - 60, 63, 60, 63, 61, 62, 61, 62, 2, 10, 2, 10, 11, 1, 11, 13, - 12, 1, 12, 13, 16, 16, 8, 8, 14, 3, 3, 15, 14, 15, 4, 4, - 1, 17, 17, 5, 1, 7, 7, 5, 6, 1, 2, 2, 6, 22, 1, 25, - 21, 22, 8, 24, 1, 21, 25, 24, 8, 18, 18, 23, 9, 20, 23, 33, - 29, 33, 20, 1, 19, 1, 29, 36, 9, 36, 19, 41, 28, 57, 32, 3, - 28, 3, 1, 27, 49, 49, 1, 32, 26, 26, 2, 4, 4, 7, 57, 41, - 2, 7, 10, 5, 37, 16, 10, 27, 8, 8, 13, 16, 37, 13, 1, 5 ], - valtab: [ - 0, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, 1, -1, -1, 1, - -1, 1, -1, 1, -1, 1, -1, 2, 1, -2, -1, 1, -1, 1, 1, -1, - -1, 1, -1, 1, -1, 1, 0, -1, 1, 1, 1, -1, 1, -1, -1, -1, - 1, 1, 2, -1, -1, 1, -1, -2, 1, 1, -1, -1, 1, 1, -1, -1, - 1, -1, 3, 1, -3, 2, -1, 1, 1, -2, -1, -1, -1, 1, 1, 1, - 1, 1, -1, -1, -1, 2, -1, -2, 1, 2, -2, -1, 1, 1, 2, -1, - -1, 1, -2, -1, 1, 1, -1, 2, 1, 2, -1, 1, -2, -1, -2, -1, - -1, 1, 1, -1, 1, -1, 1, 1, 1, -1, -1, 1, 4, -1, -1, -4, - 1, 1, 1, 2, -1, -1, 1, -1, -1, 1, -1, -1, 1, -2, 1, -1, - 1, 1, -1, -1, 1, 1, -1, -1, 3, 2, -3, -2, 2, 5, -2, 2, - 2, -5, -2, -2, -2, 2, -3, 3, 2, 3, -3, 2, -2, -2, 3, -3, - 6, 2, -2, 3, -6, 3, -3, -3, 3, 7, -4, 4, -3, 2, -7, 2, - 2, -2, -4, 2, 8, -2, -2, -2, 4, 2, -2, 2, 3, 2, -2, -2, - 2, 2, -2, -8, -2, 9, -2, 2, -3, -2, 2, -2, 2, 2, 2, 4, - -2, -4, 10, 2, 2, -2, -9, -2, 2, -2, 5, 4, -4, 4, -2, 2, - -5, -4, -3, 4, 2, -3, 3, -2, -5, 5, 3, 3, -2, -3, -10, -4 ], - }, - RVMap { eob_sym: 2, esc_sym: 11, runtab: [ - 1, 1, 0, 2, 2, 1, 1, 3, 3, 4, 4, 0, 1, 1, 5, 5, - 2, 2, 6, 6, 7, 7, 1, 8, 1, 8, 3, 3, 9, 9, 1, 2, - 2, 1, 4, 10, 4, 10, 11, 11, 1, 5, 12, 12, 1, 5, 13, 13, - 3, 3, 6, 6, 2, 2, 14, 14, 16, 16, 15, 7, 15, 8, 8, 7, - 1, 1, 17, 17, 4, 4, 1, 1, 18, 18, 2, 2, 5, 5, 25, 3, - 9, 3, 25, 9, 19, 24, 19, 24, 1, 21, 20, 1, 21, 22, 20, 22, - 23, 23, 8, 6, 33, 6, 8, 33, 7, 7, 26, 26, 1, 32, 1, 32, - 28, 4, 28, 10, 29, 27, 27, 10, 41, 4, 29, 2, 2, 41, 36, 31, - 49, 31, 34, 30, 34, 36, 30, 35, 1, 49, 11, 5, 35, 11, 1, 3, - 3, 5, 37, 37, 8, 40, 8, 40, 12, 12, 42, 42, 1, 38, 16, 57, - 1, 6, 16, 39, 38, 6, 7, 7, 13, 13, 39, 43, 2, 43, 57, 2, - 50, 9, 44, 9, 50, 4, 15, 48, 44, 4, 1, 15, 48, 14, 14, 1, - 45, 45, 8, 3, 5, 8, 51, 47, 3, 46, 46, 47, 5, 51, 1, 17, - 17, 58, 1, 58, 2, 52, 52, 2, 53, 7, 59, 6, 6, 56, 53, 55, - 7, 55, 1, 54, 59, 56, 54, 10, 1, 10, 4, 60, 1, 60, 8, 4, - 8, 64, 64, 61, 1, 63, 3, 63, 62, 61, 5, 11, 5, 3, 11, 62 ], - valtab: [ - 1, -1, 0, 1, -1, 2, -2, 1, -1, 1, -1, 0, 3, -3, 1, -1, - 2, -2, 1, -1, 1, -1, 4, 1, -4, -1, 2, -2, 1, -1, 5, 3, - -3, -5, 2, 1, -2, -1, 1, -1, 6, 2, 1, -1, -6, -2, 1, -1, - 3, -3, 2, -2, 4, -4, 1, -1, 1, -1, 1, 2, -1, 2, -2, -2, - 7, -7, 1, -1, 3, -3, 8, -8, 1, -1, 5, -5, 3, -3, 1, 4, - 2, -4, -1, -2, 1, 1, -1, -1, 9, 1, 1, -9, -1, 1, -1, -1, - 1, -1, 3, -3, 1, 3, -3, -1, 3, -3, 1, -1, 10, 1, -10, -1, - 1, 4, -1, 2, 1, -1, 1, -2, 1, -4, -1, 6, -6, -1, 1, 1, - 1, -1, 1, 1, -1, -1, -1, 1, 11, -1, -2, 4, -1, 2, -11, 5, - -5, -4, -1, 1, 4, 1, -4, -1, -2, 2, 1, -1, 12, 1, -2, 1, - -12, 4, 2, 1, -1, -4, 4, -4, 2, -2, -1, 1, 7, -1, -1, -7, - -1, -3, 1, 3, 1, 5, 2, 1, -1, -5, 13, -2, -1, 2, -2, -13, - 1, -1, 5, 6, 5, -5, 1, 1, -6, 1, -1, -1, -5, -1, 14, 2, - -2, 1, -14, -1, 8, 1, -1, -8, 1, 5, 1, 5, -5, 1, -1, 1, - -5, -1, 15, 1, -1, -1, -1, 3, -15, -3, 6, 1, 16, -1, 6, -6, - -6, 1, -1, 1, -16, 1, 7, -1, 1, -1, -6, -3, 6, -7, 3, -1 ] - }, - RVMap { eob_sym: 0, esc_sym: 35, runtab: [ - 0, 1, 1, 2, 2, 3, 3, 4, 4, 1, 1, 5, 5, 6, 6, 7, - 7, 8, 8, 9, 9, 2, 2, 10, 10, 1, 1, 11, 11, 12, 12, 3, - 3, 13, 13, 0, 14, 14, 16, 15, 16, 15, 4, 4, 17, 1, 17, 1, - 5, 5, 18, 18, 2, 2, 6, 6, 8, 19, 7, 8, 7, 19, 20, 20, - 21, 21, 22, 24, 22, 24, 23, 23, 1, 1, 25, 25, 3, 3, 26, 26, - 9, 9, 27, 27, 28, 28, 33, 29, 4, 33, 29, 1, 4, 1, 32, 32, - 2, 2, 31, 10, 30, 10, 30, 31, 34, 34, 5, 5, 36, 36, 35, 41, - 35, 11, 41, 11, 37, 1, 8, 8, 37, 6, 1, 6, 40, 7, 7, 40, - 12, 38, 12, 39, 39, 38, 49, 13, 49, 13, 3, 42, 3, 42, 16, 16, - 43, 43, 14, 14, 1, 1, 44, 15, 44, 15, 2, 2, 57, 48, 50, 48, - 57, 50, 4, 45, 45, 4, 46, 47, 47, 46, 1, 51, 1, 17, 17, 51, - 8, 9, 9, 5, 58, 8, 58, 5, 52, 52, 55, 56, 53, 56, 55, 59, - 59, 53, 54, 1, 6, 54, 7, 7, 6, 1, 2, 3, 2, 3, 64, 60, - 60, 10, 10, 64, 61, 62, 61, 63, 1, 63, 62, 1, 18, 24, 18, 4, - 25, 4, 8, 21, 21, 1, 24, 22, 25, 22, 8, 11, 19, 11, 23, 1, - 20, 23, 19, 20, 5, 12, 5, 1, 16, 2, 12, 13, 2, 13, 1, 16 ], - valtab: [ - 0, 1, -1, 1, -1, 1, -1, 1, -1, 2, -2, 1, -1, 1, -1, 1, - -1, 1, -1, 1, -1, 2, -2, 1, -1, 3, -3, 1, -1, 1, -1, 2, - -2, 1, -1, 0, 1, -1, 1, 1, -1, -1, 2, -2, 1, 4, -1, -4, - 2, -2, 1, -1, -3, 3, 2, -2, 2, 1, 2, -2, -2, -1, 1, -1, - 1, -1, 1, 1, -1, -1, 1, -1, 5, -5, 1, -1, 3, -3, 1, -1, - 2, -2, 1, -1, 1, -1, 1, 1, 3, -1, -1, 6, -3, -6, -1, 1, - 4, -4, 1, 2, 1, -2, -1, -1, 1, -1, 3, -3, 1, -1, 1, 1, - -1, 2, -1, -2, 1, 7, -3, 3, -1, 3, -7, -3, 1, -3, 3, -1, - 2, 1, -2, 1, -1, -1, 1, 2, -1, -2, -4, -1, 4, 1, 2, -2, - 1, -1, -2, 2, 8, -8, -1, 2, 1, -2, -5, 5, 1, -1, -1, 1, - -1, 1, 4, -1, 1, -4, -1, -1, 1, 1, 9, 1, -9, 2, -2, -1, - -4, 3, -3, -4, -1, 4, 1, 4, 1, -1, 1, -1, 1, 1, -1, 1, - -1, -1, -1, 10, 4, 1, 4, -4, -4, -10, 6, 5, -6, -5, 1, -1, - 1, 3, -3, -1, 1, -1, -1, -1, 11, 1, 1, -11, -2, -2, 2, 5, - -2, -5, -5, 2, -2, 12, 2, -2, 2, 2, 5, -3, -2, 3, -2, -12, - -2, 2, 2, 2, -5, 3, 5, 13, -3, 7, -3, -3, -7, 3, -13, 3 ] - }, - RVMap { eob_sym: 0, esc_sym: 34, runtab: [ - 0, 1, 1, 1, 2, 2, 1, 3, 3, 1, 1, 1, 4, 4, 1, 5, - 2, 1, 5, 2, 1, 1, 6, 6, 1, 1, 1, 1, 1, 7, 3, 1, - 2, 3, 0, 1, 2, 7, 1, 1, 1, 8, 1, 1, 8, 1, 1, 1, - 9, 1, 9, 1, 2, 1, 1, 2, 1, 1, 10, 4, 1, 10, 1, 4, - 1, 1, 1, 1, 1, 3, 1, 1, 1, 3, 2, 1, 5, 1, 1, 1, - 2, 5, 1, 11, 1, 11, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 2, 1, 6, 1, 6, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 12, - 3, 1, 12, 1, 1, 1, 2, 1, 1, 3, 1, 1, 1, 1, 1, 1, - 4, 1, 1, 1, 2, 1, 1, 4, 1, 1, 1, 1, 1, 1, 2, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 1, 2, 1, 1, 5, - 1, 1, 1, 1, 1, 7, 1, 7, 1, 1, 2, 3, 1, 1, 1, 1, - 5, 1, 1, 1, 1, 1, 1, 2, 13, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 13, 2, 1, 1, 4, 1, 1, 1, - 3, 1, 6, 1, 1, 1, 14, 1, 1, 1, 1, 1, 14, 6, 1, 1, - 1, 1, 15, 2, 4, 1, 2, 3, 15, 1, 1, 1, 8, 1, 1, 8, - 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1 ], - valtab: [ - 0, 1, -1, 2, 1, -1, -2, 1, -1, 3, -3, 4, 1, -1, -4, 1, - 2, 5, -1, -2, -5, 6, 1, -1, -6, 7, -7, 8, -8, 1, 2, 9, - 3, -2, 0, -9, -3, -1, 10, -10, 11, 1, -11, 12, -1, -12, 13, -13, - 1, 14, -1, -14, 4, 15, -15, -4, 16, -16, 1, 2, 17, -1, -17, -2, - 18, -18, 19, -19, 20, 3, -20, 21, -21, -3, 5, 22, 2, -22, -23, 23, - -5, -2, 24, 1, -24, -1, 25, -25, 26, -26, -27, 27, 28, 29, -28, -29, - 6, 30, 2, -31, -2, -30, 31, -6, -32, 32, 33, -33, 34, -35, -34, 1, - 4, -36, -1, 35, 37, 36, 7, -37, 38, -4, -38, 39, 41, 40, -40, -39, - 3, 42, -43, -41, -7, -42, 43, -3, 44, -44, 45, -45, 46, 47, 8, -47, - -48, -46, 50, -50, 48, 49, 51, -49, 52, -52, 5, -51, -8, -53, 53, 3, - -56, 56, 55, 54, -54, 2, 60, -2, -55, 58, 9, -5, 59, 57, -57, -63, - -3, -58, -60, -61, 61, -59, -62, -9, 1, 64, 62, 69, -64, 63, 65, -67, - -68, 66, -65, 68, -66, -69, 67, -70, -1, 10, 71, -71, 4, 73, 72, 70, - 6, -76, -3, 74, -78, -74, 1, 78, 80, -72, -75, 76, -1, 3, -73, 79, - 75, 77, 1, 11, -4, -79, -10, -6, -1, -77, -83, -80, 2, 81, -84, -2, - 83, -81, 82, -82, 84, -87, -86, 85, -11, -85, 86, -89, 87, -88, 88, 89 ] - }, - RVMap { eob_sym: 2, esc_sym: 33, runtab: [ - 1, 1, 0, 2, 1, 2, 1, 3, 3, 1, 1, 4, 4, 2, 2, 1, - 1, 5, 5, 6, 1, 6, 1, 7, 7, 3, 3, 2, 8, 2, 8, 1, - 1, 0, 9, 9, 1, 1, 10, 4, 10, 4, 11, 11, 2, 1, 2, 1, - 12, 12, 3, 3, 1, 1, 13, 5, 5, 13, 14, 1, 1, 14, 2, 2, - 6, 6, 15, 1, 1, 15, 16, 4, 7, 16, 4, 7, 1, 1, 3, 3, - 8, 8, 2, 2, 1, 1, 17, 17, 1, 1, 18, 18, 5, 5, 2, 2, - 1, 1, 9, 19, 9, 19, 20, 3, 3, 20, 1, 10, 21, 1, 10, 4, - 4, 21, 22, 6, 6, 22, 1, 1, 23, 24, 2, 2, 23, 24, 11, 1, - 1, 11, 7, 25, 7, 1, 1, 25, 8, 8, 3, 26, 3, 1, 12, 2, - 2, 26, 1, 12, 5, 5, 27, 4, 1, 4, 1, 27, 28, 1, 28, 13, - 1, 13, 2, 29, 2, 1, 32, 6, 1, 30, 14, 29, 14, 6, 3, 31, - 3, 1, 30, 1, 32, 31, 33, 9, 33, 1, 1, 7, 9, 7, 2, 2, - 1, 1, 4, 36, 34, 4, 5, 10, 10, 5, 34, 1, 1, 35, 8, 8, - 36, 3, 35, 1, 15, 3, 2, 1, 16, 15, 16, 2, 37, 1, 37, 1, - 1, 1, 6, 6, 38, 1, 38, 11, 1, 39, 39, 40, 11, 2, 41, 4, - 40, 1, 2, 4, 1, 1, 1, 41, 3, 1, 3, 1, 5, 7, 5, 7 ], - valtab: [ - 1, -1, 0, 1, 2, -1, -2, 1, -1, 3, -3, 1, -1, 2, -2, 4, - -4, 1, -1, 1, 5, -1, -5, 1, -1, 2, -2, 3, 1, -3, -1, 6, - -6, 0, 1, -1, 7, -7, 1, 2, -1, -2, 1, -1, 4, 8, -4, -8, - 1, -1, 3, -3, 9, -9, 1, 2, -2, -1, 1, 10, -10, -1, 5, -5, - 2, -2, 1, 11, -11, -1, 1, 3, 2, -1, -3, -2, 12, -12, 4, -4, - 2, -2, -6, 6, 13, -13, 1, -1, 14, -14, 1, -1, 3, -3, 7, -7, - 15, -15, 2, 1, -2, -1, 1, 5, -5, -1, -16, 2, 1, 16, -2, 4, - -4, -1, 1, 3, -3, -1, 17, -17, 1, 1, -8, 8, -1, -1, 2, 18, - -18, -2, 3, 1, -3, 19, -19, -1, 3, -3, 6, 1, -6, 20, 2, 9, - -9, -1, -20, -2, 4, -4, 1, -5, 21, 5, -21, -1, 1, -22, -1, 2, - 22, -2, 10, 1, -10, 23, 1, 4, -23, 1, 2, -1, -2, -4, -7, 1, - 7, -24, -1, 24, -1, -1, 1, 3, -1, -25, 25, 4, -3, -4, 11, -11, - 26, -26, 6, 1, 1, -6, -5, -3, 3, 5, -1, -27, 27, 1, 4, -4, - -1, -8, -1, 28, 2, 8, -12, -28, -2, -2, 2, 12, -1, 29, 1, -29, - 30, -30, 5, -5, 1, -31, -1, 3, 31, -1, 1, 1, -3, -13, 1, -7, - -1, -32, 13, 7, 32, 33, -33, -1, -9, -34, 9, 34, -6, 5, 6, -5 ] - }, - RVMap { eob_sym: 2, esc_sym: 13, runtab: [ - 1, 1, 0, 1, 1, 2, 2, 1, 1, 3, 3, 1, 1, 0, 2, 2, - 4, 1, 4, 1, 1, 1, 5, 5, 1, 1, 6, 6, 2, 2, 1, 1, - 3, 3, 7, 7, 1, 1, 8, 8, 1, 1, 2, 2, 1, 9, 1, 9, - 4, 4, 10, 1, 1, 10, 1, 1, 11, 11, 3, 3, 1, 2, 1, 2, - 1, 1, 12, 12, 5, 5, 1, 1, 13, 1, 1, 13, 2, 2, 1, 1, - 6, 6, 1, 1, 4, 14, 4, 14, 3, 1, 3, 1, 1, 1, 15, 7, - 15, 2, 2, 7, 1, 1, 1, 8, 1, 8, 16, 16, 1, 1, 1, 1, - 2, 1, 1, 2, 1, 1, 3, 5, 5, 3, 4, 1, 1, 4, 1, 1, - 17, 17, 9, 1, 1, 9, 2, 2, 1, 1, 10, 10, 1, 6, 1, 1, - 6, 18, 1, 1, 18, 1, 1, 1, 2, 2, 3, 1, 3, 1, 1, 1, - 4, 1, 19, 1, 19, 7, 1, 1, 20, 1, 4, 20, 1, 7, 11, 2, - 1, 11, 21, 2, 8, 5, 1, 8, 1, 5, 21, 1, 1, 1, 22, 1, - 1, 22, 1, 1, 3, 3, 1, 23, 2, 12, 24, 1, 1, 2, 1, 1, - 12, 23, 1, 1, 24, 1, 1, 1, 4, 1, 1, 1, 2, 1, 6, 6, - 4, 2, 1, 1, 1, 1, 1, 1, 1, 14, 13, 3, 1, 25, 9, 25, - 14, 1, 9, 3, 13, 1, 1, 1, 1, 1, 10, 1, 1, 2, 10, 2 ], - valtab: [ - -20, -1, 0, 2, -2, 1, -1, 3, -3, 1, -1, 4, -4, 0, 2, -2, - 1, 5, -1, -5, 6, -6, 1, -1, 7, -7, 1, -1, 3, -3, 8, -8, - 2, -2, 1, -1, 9, -9, 1, -1, 10, -10, 4, -4, 11, 1, -11, -1, - 2, -2, 1, 12, -12, -1, 13, -13, 1, -1, 3, -3, 14, 5, -14, -5, - -15, 15, -1, 1, 2, -2, 16, -16, 1, 17, -17, -1, 6, -6, 18, -18, - 2, -2, -19, 19, -3, 1, 3, -1, 4, 20, -4, 1, -21, 21, 1, 2, - -1, -7, 7, -2, 22, -22, 23, 2, -23, -2, 1, -1, -24, 24, -25, 25, - -8, -26, 26, 8, -27, 27, 5, 3, -3, -5, -4, 28, -28, 4, 29, -29, - 1, -1, -2, -30, 30, 2, 9, -9, -31, 31, 2, -2, -32, 3, 32, -33, - -3, 1, 33, -34, -1, 34, -35, 35, -10, 10, -6, 36, 6, -36, 37, -37, - -5, 38, 1, -38, -1, 3, 39, -39, -1, 40, 5, 1, -40, -3, 2, -11, - -41, -2, 1, 11, -3, -4, 41, 3, 42, 4, -1, -43, -42, 43, 1, -44, - 45, -1, 44, -45, -7, 7, -46, 1, -12, 2, 1, -47, 46, 12, 47, 48, - -2, -1, -48, 49, -1, -50, -49, 50, -6, -51, 51, 52, -13, 53, -4, 4, - 6, 13, -53, -52, -54, 55, 54, -55, -56, -2, 2, -8, 56, 1, -3, -1, - 2, 58, 3, 8, -2, 57, -58, -60, -59, -57, -3, 60, 59, -14, 3, 14 ] - }, - RVMap { eob_sym: 2, esc_sym: 38, runtab: [ - 1, 1, 0, 2, 2, 1, 1, 3, 3, 4, 4, 5, 5, 1, 1, 6, - 6, 2, 2, 7, 7, 8, 8, 1, 1, 3, 3, 9, 9, 10, 10, 1, - 1, 2, 2, 4, 4, 11, 0, 11, 12, 12, 13, 13, 1, 1, 5, 5, - 14, 14, 15, 16, 15, 16, 3, 3, 1, 6, 1, 6, 2, 2, 7, 7, - 8, 8, 17, 17, 1, 1, 4, 4, 18, 18, 2, 2, 1, 19, 1, 20, - 19, 20, 21, 21, 3, 3, 22, 22, 5, 5, 24, 1, 1, 23, 9, 23, - 24, 9, 2, 2, 10, 1, 1, 10, 6, 6, 25, 4, 4, 25, 7, 7, - 26, 8, 1, 8, 3, 1, 26, 3, 11, 11, 27, 27, 2, 28, 1, 2, - 28, 1, 12, 12, 5, 5, 29, 13, 13, 29, 32, 1, 1, 33, 31, 30, - 32, 4, 30, 33, 4, 31, 3, 14, 1, 1, 3, 34, 34, 2, 2, 14, - 6, 6, 35, 36, 35, 36, 1, 15, 1, 16, 16, 15, 7, 9, 7, 9, - 37, 8, 8, 37, 1, 1, 39, 2, 38, 39, 2, 40, 5, 38, 40, 5, - 3, 3, 4, 4, 10, 10, 1, 1, 1, 1, 41, 2, 41, 2, 6, 6, - 1, 1, 11, 42, 11, 43, 3, 42, 3, 17, 4, 43, 1, 17, 7, 1, - 8, 44, 4, 7, 44, 5, 8, 2, 5, 1, 2, 48, 45, 1, 12, 45, - 12, 48, 13, 13, 1, 9, 9, 46, 1, 46, 47, 47, 49, 18, 18, 49 ], - valtab: [ - 1, -1, 0, 1, -1, 2, -2, 1, -1, 1, -1, 1, -1, 3, -3, 1, - -1, -2, 2, 1, -1, 1, -1, 4, -4, -2, 2, 1, -1, 1, -1, 5, - -5, -3, 3, 2, -2, 1, 0, -1, 1, -1, 1, -1, 6, -6, 2, -2, - 1, -1, 1, 1, -1, -1, -3, 3, 7, 2, -7, -2, -4, 4, 2, -2, - 2, -2, 1, -1, 8, -8, 3, -3, 1, -1, -5, 5, 9, 1, -9, 1, - -1, -1, 1, -1, -4, 4, 1, -1, 3, -3, 1, -10, 10, 1, 2, -1, - -1, -2, 6, -6, 2, 11, -11, -2, 3, -3, 1, -4, 4, -1, 3, -3, - 1, 3, 12, -3, -5, -12, -1, 5, 2, -2, 1, -1, -7, 1, 13, 7, - -1, -13, 2, -2, 4, -4, 1, 2, -2, -1, 1, 14, -14, 1, 1, 1, - -1, -5, -1, -1, 5, -1, -6, 2, -15, 15, 6, 1, -1, -8, 8, -2, - -4, 4, 1, 1, -1, -1, 16, 2, -16, -2, 2, -2, 4, 3, -4, -3, - -1, -4, 4, 1, -17, 17, -1, -9, 1, 1, 9, 1, -5, -1, -1, 5, - -7, 7, 6, -6, 3, -3, 18, -18, 19, -19, 1, -10, -1, 10, -5, 5, - 20, -20, -3, 1, 3, 1, 8, -1, -8, 2, 7, -1, -21, -2, 5, 21, - 5, -1, -7, -5, 1, -6, -5, -11, 6, 22, 11, 1, 1, -22, -3, -1, - 3, -1, 3, -3, -23, 4, -4, 1, 23, -1, 1, -1, 1, -2, 2, -1 ] - }, - RVMap { eob_sym: 4, esc_sym: 11, runtab: [ - 1, 1, 1, 1, 0, 2, 2, 1, 1, 3, 3, 0, 1, 1, 2, 2, - 4, 4, 1, 1, 5, 5, 1, 1, 2, 2, 3, 3, 6, 6, 1, 1, - 7, 7, 8, 1, 8, 2, 2, 1, 4, 4, 1, 3, 1, 3, 9, 9, - 2, 2, 1, 5, 1, 5, 10, 10, 1, 1, 11, 11, 3, 6, 3, 4, - 4, 6, 2, 2, 1, 12, 1, 12, 7, 13, 7, 13, 1, 1, 8, 8, - 2, 2, 14, 14, 16, 15, 16, 5, 5, 1, 3, 15, 1, 3, 4, 4, - 1, 1, 17, 17, 2, 2, 6, 6, 1, 18, 1, 18, 22, 21, 22, 21, - 25, 24, 25, 19, 9, 20, 9, 23, 19, 24, 20, 3, 23, 7, 3, 1, - 1, 7, 28, 26, 29, 5, 28, 26, 5, 8, 29, 4, 8, 27, 2, 2, - 4, 27, 1, 1, 10, 36, 10, 33, 33, 36, 30, 1, 32, 32, 1, 30, - 6, 31, 31, 35, 3, 6, 11, 11, 3, 2, 35, 2, 34, 1, 34, 1, - 37, 37, 12, 7, 12, 5, 41, 5, 4, 7, 1, 8, 13, 4, 1, 41, - 13, 38, 8, 38, 9, 1, 40, 40, 9, 1, 39, 2, 2, 49, 39, 42, - 3, 3, 14, 16, 49, 14, 16, 42, 43, 43, 6, 6, 15, 1, 1, 15, - 44, 44, 1, 1, 50, 48, 4, 5, 4, 7, 5, 2, 10, 10, 48, 7, - 50, 45, 2, 1, 45, 8, 8, 1, 46, 46, 3, 47, 47, 3, 1, 1 ], - valtab: [ - 1, -1, 2, -2, 0, 1, -1, 3, -3, 1, -1, 0, 4, -4, 2, -2, - 1, -1, 5, -5, 1, -1, 6, -6, 3, -3, 2, -2, 1, -1, 7, -7, - 1, -1, 1, 8, -1, 4, -4, -8, 2, -2, 9, 3, -9, -3, 1, -1, - 5, -5, 10, 2, -10, -2, 1, -1, 11, -11, 1, -1, -4, 2, 4, 3, - -3, -2, 6, -6, 12, 1, -12, -1, 2, 1, -2, -1, 13, -13, 2, -2, - 7, -7, 1, -1, 1, 1, -1, 3, -3, 14, 5, -1, -14, -5, 4, -4, - 15, -15, 1, -1, 8, -8, -3, 3, 16, 1, -16, -1, 1, 1, -1, -1, - 1, 1, -1, 1, 2, 1, -2, 1, -1, -1, -1, 6, -1, 3, -6, 17, - -17, -3, 1, 1, 1, 4, -1, -1, -4, 3, -1, 5, -3, -1, -9, 9, - -5, 1, 18, -18, 2, 1, -2, 1, -1, -1, 1, 19, -1, 1, -19, -1, - 4, 1, -1, 1, 7, -4, -2, 2, -7, 10, -1, -10, 1, 20, -1, -20, - 1, -1, 2, 4, -2, 5, 1, -5, 6, -4, 21, 4, 2, -6, -21, -1, - -2, 1, -4, -1, -3, 22, -1, 1, 3, -22, -1, 11, -11, 1, 1, 1, - 8, -8, 2, 2, -1, -2, -2, -1, 1, -1, -5, 5, 2, 23, -23, -2, - 1, -1, 24, -24, -1, -1, 7, 6, -7, 5, -6, 12, -3, 3, 1, -5, - 1, 1, -12, 25, -1, -5, 5, -25, -1, 1, 9, 1, -1, -9, 26, -26 ] - } -]; diff --git a/src/codecs/indeo/ividsp.rs b/src/codecs/indeo/ividsp.rs deleted file mode 100644 index 88bc8cc..0000000 --- a/src/codecs/indeo/ividsp.rs +++ /dev/null @@ -1,467 +0,0 @@ -use super::ivi::{IVITransformType,TDir,TrFunc,TrFuncDC}; - -#[inline(always)] -fn hbutterfly(a: i32, b: i32) -> (i32, i32) { - ((a + b) >> 1, (a - b) >> 1) -} -#[inline(always)] -fn butterfly(a: i32, b: i32) -> (i32, i32) { - (a + b, a - b) -} -#[inline(always)] -fn ireflect(a: i32, b: i32) -> (i32, i32) { - (((b * 2 - a + 2) >> 2) - a, ((b + 2 * a + 2) >> 2) + b) -} - -macro_rules! haar_transform { - ($c0:expr, $c1:expr, $c2:expr, $c3:expr) => {{ - let (t0, t1) = hbutterfly($c0, $c1); - let (t2, t3) = hbutterfly(t0, $c2); - $c0 = t2; - $c1 = t3; - let (t4, t5) = hbutterfly(t1, $c3); - $c2 = t4; - $c3 = t5; - }}; - ($c0:expr, $c1:expr, $c2:expr, $c3:expr, $c4:expr, $c5:expr, $c6:expr, $c7:expr) => {{ - let (a0, a1) = hbutterfly($c0 << 1, $c1 << 1); - - let (t0, t1) = hbutterfly(a0, $c2); - let (t2, t3) = hbutterfly(a1, $c3); - let (u0, u1) = hbutterfly(t0, $c4); - let (u2, u3) = hbutterfly(t1, $c5); - let (u4, u5) = hbutterfly(t2, $c6); - let (u6, u7) = hbutterfly(t3, $c7); - - $c0 = u0; - $c1 = u1; - $c2 = u2; - $c3 = u3; - $c4 = u4; - $c5 = u5; - $c6 = u6; - $c7 = u7; - }}; -} -macro_rules! slant_transform { - ($c0:expr, $c1:expr, $c2:expr, $c3:expr, $output:ident) => {{ - let (t0, t1) = butterfly($c0, $c2); - let (t2, t3) = ireflect ($c3, $c1); - let (t4, t5) = butterfly(t0, t3); - let (t6, t7) = butterfly(t1, t2); - $c0 = $output(t4); - $c1 = $output(t6); - $c2 = $output(t7); - $c3 = $output(t5); - }}; - ($c0:expr, $c1:expr, $c2:expr, $c3:expr, $c4:expr, $c5:expr, $c6:expr, $c7:expr, $output:ident) => {{ - let t0 = $c3 + (($c1 * 4 - $c3 + 4) >> 3); - let t1 = $c1 + ((-$c1 - $c3 * 4 + 4) >> 3); - - let (t2, t3) = butterfly($c0, t1); - let (t4, t5) = butterfly($c4, $c5); - let (t6, t7) = butterfly($c7, $c6); - let (t8, t9) = butterfly(t0, $c2); - - let (u0, u1) = butterfly(t2, t4); - let (u2, u3) = ireflect (t7, t8); - let (u4, u5) = butterfly(t3, t5); - let (u6, u7) = ireflect (t6, t9); - - let (t0, t1) = butterfly(u0, u3); - let (t2, t3) = butterfly(u1, u2); - let (t4, t5) = butterfly(u4, u7); - let (t6, t7) = butterfly(u5, u6); - - $c0 = $output(t0); - $c1 = $output(t2); - $c2 = $output(t3); - $c3 = $output(t1); - $c4 = $output(t4); - $c5 = $output(t6); - $c6 = $output(t7); - $c7 = $output(t5); - }}; -} - -fn haar8x8_2d(blk: &mut[i32; 64]) { - for i in 0..4 { - let mut c0 = blk[i + 0*8] << 1; - let mut c1 = blk[i + 1*8] << 1; - let mut c2 = blk[i + 2*8] << 1; - let mut c3 = blk[i + 3*8] << 1; - haar_transform!(c0, c1, c2, c3, - blk[i + 4*8], blk[i + 5*8], blk[i + 6*8], blk[i + 7*8]); - blk[i + 0*8] = c0; - blk[i + 1*8] = c1; - blk[i + 2*8] = c2; - blk[i + 3*8] = c3; - } - for i in 4..8 { - haar_transform!(blk[i + 0*8], blk[i + 1*8], blk[i + 2*8], blk[i + 3*8], - blk[i + 4*8], blk[i + 5*8], blk[i + 6*8], blk[i + 7*8]); - } - for i in 0..8 { - let row = &mut blk[i*8..(i+1)*8]; - haar_transform!(row[0], row[1], row[2], row[3], row[4], row[5], row[6], row[7]); - } -} -fn haar8x8_row(blk: &mut[i32; 64]) { - for i in 0..8 { - let row = &mut blk[i*8..(i+1)*8]; - haar_transform!(row[0], row[1], row[2], row[3], row[4], row[5], row[6], row[7]); - } -} -fn haar8x8_col(blk: &mut[i32; 64]) { - for i in 0..8 { - haar_transform!(blk[i + 0*8], blk[i + 1*8], blk[i + 2*8], blk[i + 3*8], - blk[i + 4*8], blk[i + 5*8], blk[i + 6*8], blk[i + 7*8]); - } -} -fn haar8x8_dc(blk: &mut[i32; 64], in0: i32) { - let dc = in0 >> 3; - for i in 0..64 { blk[i] = dc; } -} - -fn haar4x4_2d(blk: &mut[i32; 64]) { - for i in 0..2 { - let mut c0 = blk[i + 0*4] << 1; - let mut c1 = blk[i + 1*4] << 1; - haar_transform!(c0, c1, blk[i + 2*4], blk[i + 3*4]); - blk[i + 0*4] = c0; - blk[i + 1*4] = c1; - } - for i in 2..4 { - haar_transform!(blk[i + 0*4], blk[i + 1*4], blk[i + 2*4], blk[i + 3*4]); - } - for i in 0..4 { - let row = &mut blk[i*4..(i+1)*4]; - haar_transform!(row[0], row[1], row[2], row[3]); - } -} -fn haar4x4_row(blk: &mut[i32; 64]) { - for i in 0..4 { - let row = &mut blk[i*4..(i+1)*4]; - haar_transform!(row[0], row[1], row[2], row[3]); - } -} -fn haar4x4_col(blk: &mut[i32; 64]) { - for i in 0..4 { - haar_transform!(blk[i + 0*4], blk[i + 1*4], blk[i + 2*4], blk[i + 3*4]); - } -} -fn haar4x4_dc(blk: &mut[i32; 64], in0: i32) { - let dc = in0 >> 3; - for i in 0..16 { blk[i] = dc; } -} - -fn slant8x8_2d(blk: &mut[i32; 64]) { - let pass1 = |x: i32| x; - let pass2 = |x: i32| (x + 1) >> 1; - - for i in 0..8 { - let mut s0 = 0; - for j in 0..8 { s0 |= blk[i + j*8]; } - if s0 == 0 { continue; } - - slant_transform!(blk[i + 0*8], blk[i + 1*8], blk[i + 2*8], blk[i + 3*8], - blk[i + 4*8], blk[i + 5*8], blk[i + 6*8], blk[i + 7*8], pass1); - } - for i in 0..8 { - let row = &mut blk[i*8..(i+1)*8]; - slant_transform!(row[0], row[1], row[2], row[3], row[4], row[5], row[6], row[7], pass2); - } -} -fn slant8x8_2d_dc(blk: &mut[i32; 64], in0: i32) { - let dc = (in0 + 1) >> 1; - for i in 0..64 { blk[i] = dc; } -} -fn slant8x8_row(blk: &mut[i32; 64]) { - let pass = |x: i32| (x + 1) >> 1; - - for i in 0..8 { - let row = &mut blk[i*8..(i+1)*8]; - slant_transform!(row[0], row[1], row[2], row[3], row[4], row[5], row[6], row[7], pass); - } -} -fn slant8x8_row_dc(blk: &mut[i32; 64], in0: i32) { - let dc = (in0 + 1) >> 1; - - for i in 0..8 { blk[i] = dc; } - for i in 8..64 { blk[i] = 0; } -} -fn slant8x8_col(blk: &mut[i32; 64]) { - let pass = |x: i32| (x + 1) >> 1; - - for i in 0..8 { - slant_transform!(blk[i + 0*8], blk[i + 1*8], blk[i + 2*8], blk[i + 3*8], - blk[i + 4*8], blk[i + 5*8], blk[i + 6*8], blk[i + 7*8], pass); - } -} -fn slant8x8_col_dc(blk: &mut[i32; 64], in0: i32) { - let dc = (in0 + 1) >> 1; - - for i in 0..8 { - blk[i * 8] = dc; - for j in 1..8 { blk[i * 8 + j] = 0; } - } -} - -fn slant4x4_2d(blk: &mut[i32; 64]) { - let pass1 = |x: i32| x; - let pass2 = |x: i32| (x + 1) >> 1; - - for i in 0..4 { - slant_transform!(blk[i + 0*4], blk[i + 1*4], blk[i + 2*4], blk[i + 3*4], pass1); - } - for i in 0..4 { - let row = &mut blk[i*4..(i+1)*4]; - slant_transform!(row[0], row[1], row[2], row[3], pass2); - } -} -fn slant4x4_2d_dc(blk: &mut[i32; 64], in0: i32) { - let dc = (in0 + 1) >> 1; - for i in 0..16 { blk[i] = dc; } -} -fn slant4x4_row(blk: &mut[i32; 64]) { - let pass = |x: i32| (x + 1) >> 1; - - for i in 0..4 { - let row = &mut blk[i*4..(i+1)*4]; - slant_transform!(row[0], row[1], row[2], row[3], pass); - } -} -fn slant4x4_row_dc(blk: &mut[i32; 64], in0: i32) { - let dc = (in0 + 1) >> 1; - - for i in 0..4 { blk[i] = dc; } - for i in 4..16 { blk[i] = 0; } -} -fn slant4x4_col(blk: &mut[i32; 64]) { - let pass = |x: i32| (x + 1) >> 1; - - for i in 0..4 { - slant_transform!(blk[i + 0*4], blk[i + 1*4], blk[i + 2*4], blk[i + 3*4], pass); - } -} -fn slant4x4_col_dc(blk: &mut[i32; 64], in0: i32) { - let dc = (in0 + 1) >> 1; - - for i in 0..4 { - blk[i * 4] = dc; - for j in 1..4 { blk[i * 4 + j] = 0; } - } -} - -#[allow(unused_variables)] -fn none8x8(blk: &mut[i32; 64]) { -} -fn none8x8_dc(blk: &mut[i32; 64], dc: i32) { - for i in 1..8 { blk[i] = dc; } - for i in 8..64 { blk[i] = 0; } -} -#[allow(unused_variables)] -fn none4x4(blk: &mut[i32; 64]) { -} -fn none4x4_dc(blk: &mut[i32; 64], dc: i32) { - for i in 1..4 { blk[i] = dc; } - for i in 4..16 { blk[i] = 0; } -} - -pub fn ivi_get_transform8x8_funcs(ttype: IVITransformType) -> (TrFunc, TrFuncDC) { - match ttype { - IVITransformType::Haar(_, ref dir) => { - match *dir { - TDir::TwoD => { (haar8x8_2d, haar8x8_dc) }, - TDir::Row => { (haar8x8_row, haar8x8_dc) }, - TDir::Col => { (haar8x8_col, haar8x8_dc) }, - } }, - IVITransformType::Slant(_, ref dir) => { - match *dir { - TDir::TwoD => { (slant8x8_2d, slant8x8_2d_dc) }, - TDir::Row => { (slant8x8_row, slant8x8_row_dc) }, - TDir::Col => { (slant8x8_col, slant8x8_col_dc) }, - } }, - IVITransformType::DCT(_, _) => { unimplemented!() }, - IVITransformType::None(_) => { (none8x8, none8x8_dc) } - } -} -pub fn ivi_get_transform4x4_funcs(ttype: IVITransformType) -> (TrFunc, TrFuncDC) { - match ttype { - IVITransformType::Haar(_, ref dir) => { - match *dir { - TDir::TwoD => { (haar4x4_2d, haar4x4_dc) }, - TDir::Row => { (haar4x4_row, haar4x4_dc) }, - TDir::Col => { (haar4x4_col, haar4x4_dc) }, - } }, - IVITransformType::Slant(_, ref dir) => { - match *dir { - TDir::TwoD => { (slant4x4_2d, slant4x4_2d_dc) }, - TDir::Row => { (slant4x4_row, slant4x4_row_dc) }, - TDir::Col => { (slant4x4_col, slant4x4_col_dc) }, - } }, - IVITransformType::DCT(_, _) => { unimplemented!() }, - IVITransformType::None(_) => { (none4x4, none4x4_dc) } - } -} - -pub fn ivi_mc_put(dst: &mut [i16], dstride: usize, src: &[i16], sstride: usize, mode: u8, w: usize, h: usize) { - let mut sidx = 0; - let mut didx = 0; - if src.len() < w + h * sstride { return; } - match mode { - 0 => { - for _ in 0..h { - let dest = &mut dst[didx..didx+w]; - dest.copy_from_slice(&src[sidx..sidx+w]); - sidx += sstride; - didx += dstride; - } - }, - 1 => { - /*for _ in 0..h { - for x in 0..w { - let val = (src[sidx + x] + src[sidx + x + 1]) >> 1; - dst[didx + x] = val; - } - sidx += sstride; - didx += dstride; - }*/ - unsafe { - let mut sptr = src.as_ptr(); - let mut dptr = dst.as_mut_ptr(); - for _ in 0..h { - let mut last = *sptr; - for x in 0..w { - let nv = *sptr.offset((x + 1) as isize); - *dptr.offset(x as isize) = nv.wrapping_add(last) >> 1; - last = nv; - } - sptr = sptr.offset(sstride as isize); - dptr = dptr.offset(dstride as isize); - } - } - }, - 2 => { - /*for _ in 0..h { - for x in 0..w { - let val = (src[sidx + x] + src[sidx + x + sstride]) >> 1; - dst[didx + x] = val; - } - sidx += sstride; - didx += dstride; - }*/ - unsafe { - let mut sptr0 = src.as_ptr(); - let mut sptr1 = sptr0.offset(sstride as isize); - let mut dptr = dst.as_mut_ptr(); - for _ in 0..h { - for x in 0..w { - let a = *sptr0.offset(x as isize); - let b = *sptr1.offset(x as isize); - *dptr.offset(x as isize) = a.wrapping_add(b) >> 1; - } - sptr0 = sptr0.offset(sstride as isize); - sptr1 = sptr1.offset(sstride as isize); - dptr = dptr.offset(sstride as isize); - } - } - }, - 3 => { - /*for _ in 0..h { - for x in 0..w { - let val = (src[sidx + x + 0] + src[sidx + x + sstride + 0] + - src[sidx + x + 1] + src[sidx + x + sstride + 1]) >> 2; - dst[didx + x] = val; - } - sidx += sstride; - didx += dstride; - }*/ - unsafe { - let mut sptr0 = src.as_ptr(); - let mut sptr1 = sptr0.offset(sstride as isize); - let mut dptr = dst.as_mut_ptr(); - let mut la = *sptr0; - let mut lb = *sptr1; - for _ in 0..h { - for x in 0..w { - let a = *sptr0.offset((x + 1) as isize); - let b = *sptr1.offset((x + 1) as isize); - let aas = a.wrapping_add(la); - let bbs = b.wrapping_add(lb); - *dptr.offset(x as isize) = aas.wrapping_add(bbs) >> 2; - la = a; - lb = b; - } - sptr0 = sptr0.offset(sstride as isize); - sptr1 = sptr1.offset(sstride as isize); - dptr = dptr.offset(dstride as isize); - } - } - }, - _ => {}, - } -} -fn ivi_mc_add(dst: &mut [i16], dstride: usize, src: &[i16], sstride: usize, mode: u8, w: usize, h: usize) { - let mut sidx = 0; - let mut didx = 0; - match mode { - 0 => { - for _ in 0..h { - for x in 0..w { - dst[didx + x] += src[sidx + x]; - } - sidx += sstride; - didx += dstride; - } - }, - 1 => { - for _ in 0..h { - for x in 0..w { - let val = (src[sidx + x] + src[sidx + x + 1]) >> 1; - dst[didx + x] += val; - } - sidx += sstride; - didx += dstride; - } - }, - 2 => { - for _ in 0..h { - for x in 0..w { - let val = (src[sidx + x] + src[sidx + x + sstride]) >> 1; - dst[didx + x] += val; - } - sidx += sstride; - didx += dstride; - } - }, - 3 => { - for _ in 0..h { - for x in 0..w { - let val = (src[sidx + x + 0] + src[sidx + x + sstride + 0] + - src[sidx + x + 1] + src[sidx + x + sstride + 1]) >> 2; - dst[didx + x] += val; - } - sidx += sstride; - didx += dstride; - } - }, - _ => {}, - } -} -pub fn ivi_mc_avg(dst: &mut [i16], dstride: usize, - src1: &[i16], sstride1: usize, mode1: u8, - src2: &[i16], sstride2: usize, mode2: u8, - w: usize, h: usize) { - let mut tidx = 0; - let tstride = 8; - let mut didx = 0; - let mut tmp: [i16; 64] = [0; 64]; - ivi_mc_add(&mut tmp, tstride, src1, sstride1, mode1, w, h); - ivi_mc_add(&mut tmp, tstride, src2, sstride2, mode2, w, h); - for _ in 0..h { - for x in 0..w { dst[didx + x] = tmp[tidx + x] >> 1; } - tidx += tstride; - didx += dstride; - } -} diff --git a/src/codecs/indeo/mod.rs b/src/codecs/indeo/mod.rs deleted file mode 100644 index e1fcdcd..0000000 --- a/src/codecs/indeo/mod.rs +++ /dev/null @@ -1,18 +0,0 @@ -#[cfg(feature="decoder_indeo2")] -pub mod indeo2; -#[cfg(feature="decoder_indeo3")] -pub mod indeo3; -#[cfg(feature="decoder_indeo4")] -pub mod indeo4; -#[cfg(feature="decoder_indeo5")] -pub mod indeo5; - -#[cfg(any(feature="decoder_indeo4", feature="decoder_indeo5"))] -mod ivi; -#[cfg(any(feature="decoder_indeo4", feature="decoder_indeo5"))] -mod ivibr; -#[cfg(any(feature="decoder_indeo4", feature="decoder_indeo5"))] -mod ividsp; - -#[cfg(feature="decoder_imc")] -pub mod imc; diff --git a/src/codecs/mod.rs b/src/codecs/mod.rs deleted file mode 100644 index 92aba8e..0000000 --- a/src/codecs/mod.rs +++ /dev/null @@ -1,324 +0,0 @@ -use std::fmt; -use std::ops::{Add, AddAssign, Sub, SubAssign}; - -use crate::frame::*; -use std::rc::Rc; -use std::cell::RefCell; -use std::mem; -use crate::io::byteio::ByteIOError; -use crate::io::bitreader::BitReaderError; -use crate::io::codebook::CodebookError; - -#[derive(Debug,Clone,Copy,PartialEq)] -#[allow(dead_code)] -pub enum DecoderError { - NoFrame, - AllocError, - TryAgain, - InvalidData, - ShortData, - MissingReference, - NotImplemented, - Bug, -} - -pub type DecoderResult<T> = Result<T, DecoderError>; - -impl From<ByteIOError> for DecoderError { - fn from(_: ByteIOError) -> Self { DecoderError::ShortData } -} - -impl From<BitReaderError> for DecoderError { - fn from(e: BitReaderError) -> Self { - match e { - BitReaderError::BitstreamEnd => DecoderError::ShortData, - _ => DecoderError::InvalidData, - } - } -} - -impl From<CodebookError> for DecoderError { - fn from(_: CodebookError) -> Self { DecoderError::InvalidData } -} - -impl From<AllocatorError> for DecoderError { - fn from(_: AllocatorError) -> Self { DecoderError::AllocError } -} - -macro_rules! validate { - ($a:expr) => { if !$a { println!("check failed at {}:{}", file!(), line!()); return Err(DecoderError::InvalidData); } }; -} - -#[allow(dead_code)] -struct HAMShuffler { - lastframe: Option<NAVideoBuffer<u8>>, -} - -impl HAMShuffler { - #[allow(dead_code)] - fn new() -> Self { HAMShuffler { lastframe: None } } - #[allow(dead_code)] - fn clear(&mut self) { self.lastframe = None; } - #[allow(dead_code)] - fn add_frame(&mut self, buf: NAVideoBuffer<u8>) { - self.lastframe = Some(buf); - } - #[allow(dead_code)] - fn clone_ref(&mut self) -> Option<NAVideoBuffer<u8>> { - if let Some(ref mut frm) = self.lastframe { - let newfrm = frm.copy_buffer(); - *frm = newfrm.clone(); - Some(newfrm) - } else { - None - } - } - #[allow(dead_code)] - fn get_output_frame(&mut self) -> Option<NAVideoBuffer<u8>> { - match self.lastframe { - Some(ref frm) => Some(frm.clone()), - None => None, - } - } -} - -#[allow(dead_code)] -struct IPShuffler { - lastframe: Option<NAVideoBuffer<u8>>, -} - -impl IPShuffler { - #[allow(dead_code)] - fn new() -> Self { IPShuffler { lastframe: None } } - #[allow(dead_code)] - fn clear(&mut self) { self.lastframe = None; } - #[allow(dead_code)] - fn add_frame(&mut self, buf: NAVideoBuffer<u8>) { - self.lastframe = Some(buf); - } - #[allow(dead_code)] - fn get_ref(&mut self) -> Option<NAVideoBuffer<u8>> { - if let Some(ref frm) = self.lastframe { - Some(frm.clone()) - } else { - None - } - } -} - -#[allow(dead_code)] -struct IPBShuffler { - lastframe: Option<NAVideoBuffer<u8>>, - nextframe: Option<NAVideoBuffer<u8>>, -} - -impl IPBShuffler { - #[allow(dead_code)] - fn new() -> Self { IPBShuffler { lastframe: None, nextframe: None } } - #[allow(dead_code)] - fn clear(&mut self) { self.lastframe = None; self.nextframe = None; } - #[allow(dead_code)] - fn add_frame(&mut self, buf: NAVideoBuffer<u8>) { - mem::swap(&mut self.lastframe, &mut self.nextframe); - self.lastframe = Some(buf); - } - #[allow(dead_code)] - fn get_lastref(&mut self) -> Option<NAVideoBuffer<u8>> { - if let Some(ref frm) = self.lastframe { - Some(frm.clone()) - } else { - None - } - } - #[allow(dead_code)] - fn get_nextref(&mut self) -> Option<NAVideoBuffer<u8>> { - if let Some(ref frm) = self.nextframe { - Some(frm.clone()) - } else { - None - } - } - #[allow(dead_code)] - fn get_b_fwdref(&mut self) -> Option<NAVideoBuffer<u8>> { - if let Some(ref frm) = self.nextframe { - Some(frm.clone()) - } else { - None - } - } - #[allow(dead_code)] - fn get_b_bwdref(&mut self) -> Option<NAVideoBuffer<u8>> { - if let Some(ref frm) = self.lastframe { - Some(frm.clone()) - } else { - None - } - } -} - -#[derive(Debug,Clone,Copy,PartialEq)] -pub struct MV { - pub x: i16, - pub y: i16, -} - -impl MV { - pub fn new(x: i16, y: i16) -> Self { MV{ x: x, y: y } } - pub fn pred(a: MV, b: MV, c: MV) -> Self { - let x; - if a.x < b.x { - if b.x < c.x { - x = b.x; - } else { - if a.x < c.x { x = c.x; } else { x = a.x; } - } - } else { - if b.x < c.x { - if a.x < c.x { x = a.x; } else { x = c.x; } - } else { - x = b.x; - } - } - let y; - if a.y < b.y { - if b.y < c.y { - y = b.y; - } else { - if a.y < c.y { y = c.y; } else { y = a.y; } - } - } else { - if b.y < c.y { - if a.y < c.y { y = a.y; } else { y = c.y; } - } else { - y = b.y; - } - } - MV { x: x, y: y } - } -} - -pub const ZERO_MV: MV = MV { x: 0, y: 0 }; - -impl Add for MV { - type Output = MV; - fn add(self, other: MV) -> MV { MV { x: self.x + other.x, y: self.y + other.y } } -} - -impl AddAssign for MV { - fn add_assign(&mut self, other: MV) { self.x += other.x; self.y += other.y; } -} - -impl Sub for MV { - type Output = MV; - fn sub(self, other: MV) -> MV { MV { x: self.x - other.x, y: self.y - other.y } } -} - -impl SubAssign for MV { - fn sub_assign(&mut self, other: MV) { self.x -= other.x; self.y -= other.y; } -} - -impl fmt::Display for MV { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - write!(f, "{},{}", self.x, self.y) - } -} - - -pub trait NADecoder { - fn init(&mut self, info: Rc<NACodecInfo>) -> DecoderResult<()>; - fn decode(&mut self, pkt: &NAPacket) -> DecoderResult<NAFrameRef>; -} - -#[derive(Clone,Copy)] -pub struct DecoderInfo { - name: &'static str, - get_decoder: fn () -> Box<NADecoder>, -} - -#[cfg(any(feature="h263", feature="decoder_realvideo3", feature="decoder_realvideo4"))] -mod blockdsp; - -#[cfg(feature="decoder_clearvideo")] -mod clearvideo; -#[cfg(feature="decoder_gdvvid")] -mod gremlinvideo; -#[cfg(any(feature="decoder_indeo2", feature="decoder_indeo3", feature="decoder_indeo4", feature="decoder_indeo5", feature="decoder_imc"))] -mod indeo; -#[cfg(feature="h263")] -mod h263; -#[cfg(any(feature="decoder_realvideo3", feature="decoder_realvideo4", feature="decoder_realvideo6", feature="decoder_realaudio144", feature="decoder_realaudio288", feature="decoder_cook", feature="decoder_ralf"))] -mod real; - -#[cfg(feature="decoder_aac")] -mod aac; -#[cfg(feature="decoder_atrac3")] -mod atrac3; -#[cfg(feature="decoder_pcm")] -mod pcm; -#[cfg(feature="decoder_sipro")] -mod sipro; -#[cfg(feature="decoder_ts102366")] -mod ts102366; - -const DECODERS: &[DecoderInfo] = &[ -#[cfg(feature="decoder_clearvideo")] - DecoderInfo { name: "clearvideo", get_decoder: clearvideo::get_decoder }, -#[cfg(feature="decoder_clearvideo")] - DecoderInfo { name: "clearvideo_rm", get_decoder: clearvideo::get_decoder_rm }, -#[cfg(feature="decoder_gdvvid")] - DecoderInfo { name: "gdv-audio", get_decoder: gremlinvideo::get_decoder_audio }, -#[cfg(feature="decoder_gdvvid")] - DecoderInfo { name: "gdv-video", get_decoder: gremlinvideo::get_decoder_video }, -#[cfg(feature="decoder_indeo2")] - DecoderInfo { name: "indeo2", get_decoder: indeo::indeo2::get_decoder }, -#[cfg(feature="decoder_indeo3")] - DecoderInfo { name: "indeo3", get_decoder: indeo::indeo3::get_decoder }, -#[cfg(feature="decoder_indeo4")] - DecoderInfo { name: "indeo4", get_decoder: indeo::indeo4::get_decoder }, -#[cfg(feature="decoder_indeo5")] - DecoderInfo { name: "indeo5", get_decoder: indeo::indeo5::get_decoder }, -#[cfg(feature="decoder_intel263")] - DecoderInfo { name: "intel263", get_decoder: h263::intel263::get_decoder }, -#[cfg(feature="decoder_realvideo1")] - DecoderInfo { name: "realvideo1", get_decoder: h263::rv10::get_decoder }, -#[cfg(feature="decoder_realvideo2")] - DecoderInfo { name: "realvideo2", get_decoder: h263::rv20::get_decoder }, -#[cfg(feature="decoder_realvideo3")] - DecoderInfo { name: "realvideo3", get_decoder: real::rv30::get_decoder }, -#[cfg(feature="decoder_realvideo4")] - DecoderInfo { name: "realvideo4", get_decoder: real::rv40::get_decoder }, -#[cfg(feature="decoder_realvideo6")] - DecoderInfo { name: "realvideo6", get_decoder: real::rv60::get_decoder }, - -#[cfg(feature="decoder_pcm")] - DecoderInfo { name: "pcm", get_decoder: pcm::get_decoder }, -#[cfg(feature="decoder_imc")] - DecoderInfo { name: "imc", get_decoder: indeo::imc::get_decoder_imc }, -#[cfg(feature="decoder_imc")] - DecoderInfo { name: "iac", get_decoder: indeo::imc::get_decoder_iac }, -#[cfg(feature="decoder_realaudio144")] - DecoderInfo { name: "ra14.4", get_decoder: real::ra144::get_decoder }, -#[cfg(feature="decoder_realaudio288")] - DecoderInfo { name: "ra28.8", get_decoder: real::ra288::get_decoder }, -#[cfg(feature="decoder_sipro")] - DecoderInfo { name: "sipro", get_decoder: sipro::get_decoder }, -#[cfg(feature="decoder_ts102366")] - DecoderInfo { name: "ac3", get_decoder: ts102366::get_decoder }, -#[cfg(feature="decoder_cook")] - DecoderInfo { name: "cook", get_decoder: real::cook::get_decoder }, -#[cfg(feature="decoder_atrac3")] - DecoderInfo { name: "atrac3", get_decoder: atrac3::get_decoder }, -#[cfg(feature="decoder_aac")] - DecoderInfo { name: "aac", get_decoder: aac::get_decoder }, -#[cfg(feature="decoder_ralf")] - DecoderInfo { name: "ralf", get_decoder: real::ralf::get_decoder }, -]; - -pub fn find_decoder(name: &str) -> Option<fn () -> Box<NADecoder>> { - for &dec in DECODERS { - if dec.name == name { - return Some(dec.get_decoder); - } - } - None -} diff --git a/src/codecs/pcm.rs b/src/codecs/pcm.rs deleted file mode 100644 index 2a0e510..0000000 --- a/src/codecs/pcm.rs +++ /dev/null @@ -1,65 +0,0 @@ -use crate::formats::*; -use super::*; - -struct PCMDecoder { chmap: NAChannelMap } - -impl PCMDecoder { - fn new() -> Self { - PCMDecoder { chmap: NAChannelMap::new() } - } -} - -const CHMAP_MONO: [NAChannelType; 1] = [NAChannelType::C]; -const CHMAP_STEREO: [NAChannelType; 2] = [NAChannelType::L, NAChannelType::R]; - -fn get_default_chmap(nch: u8) -> NAChannelMap { - let mut chmap = NAChannelMap::new(); - match nch { - 1 => chmap.add_channels(&CHMAP_MONO), - 2 => chmap.add_channels(&CHMAP_STEREO), - _ => (), - } - chmap -} - -fn get_duration(ainfo: &NAAudioInfo, duration: Option<u64>, data_size: usize) -> u64 { - if duration == None { - let size_bits = (data_size as u64) * 8; - let blk_size = (ainfo.get_channels() as u64) * (ainfo.get_format().get_bits() as u64); - size_bits / blk_size - } else { - duration.unwrap() as u64 - } -} - -impl NADecoder for PCMDecoder { - fn init(&mut self, info: Rc<NACodecInfo>) -> DecoderResult<()> { - if let NACodecTypeInfo::Audio(ainfo) = info.get_properties() { - self.chmap = get_default_chmap(ainfo.get_channels()); - if self.chmap.num_channels() == 0 { return Err(DecoderError::InvalidData); } - Ok(()) - } else { - Err(DecoderError::InvalidData) - } - } - fn decode(&mut self, pkt: &NAPacket) -> DecoderResult<NAFrameRef> { - let info = pkt.get_stream().get_info(); - if let NACodecTypeInfo::Audio(ainfo) = info.get_properties() { - let duration = get_duration(&ainfo, pkt.get_duration(), pkt.get_buffer().len()); - let pktbuf = pkt.get_buffer(); - let mut buf: Vec<u8> = Vec::with_capacity(pktbuf.len()); - buf.clone_from(&pktbuf); - let abuf = NAAudioBuffer::new_from_buf(ainfo, Rc::new(RefCell::new(buf)), self.chmap.clone()); - let mut frm = NAFrame::new_from_pkt(pkt, info, NABufferType::AudioPacked(abuf)); - frm.set_duration(Some(duration)); - frm.set_keyframe(true); - Ok(Rc::new(RefCell::new(frm))) - } else { - Err(DecoderError::InvalidData) - } - } -} - -pub fn get_decoder() -> Box<NADecoder> { - Box::new(PCMDecoder::new()) -} diff --git a/src/codecs/real/cook.rs b/src/codecs/real/cook.rs deleted file mode 100644 index 2fcff98..0000000 --- a/src/codecs/real/cook.rs +++ /dev/null @@ -1,1125 +0,0 @@ -use crate::formats::*; -use crate::frame::*; -use super::super::*; -use crate::dsp::fft::FFTMode; -use crate::dsp::mdct::IMDCT; -use crate::io::bitreader::*; -use crate::io::byteio::{ByteReader, MemoryReader}; -use crate::io::codebook::*; -use crate::io::intcode::*; -use std::f32::consts; -use std::mem::swap; - -#[derive(Debug,Clone,Copy,PartialEq)] -enum Mode { - Mono, - Stereo, - JointStereo, -} - -impl Mode { - fn get_channels(&self) -> usize { - match *self { - Mode::Mono => 1, - _ => 2, - } - } -} - -struct CookBookReader { - bits: &'static [u8], - codes: &'static [u16], -} -impl CodebookDescReader<u16> for CookBookReader { - fn bits(&mut self, idx: usize) -> u8 { self.bits[idx] } - fn code(&mut self, idx: usize) -> u32 { self.codes[idx] as u32 } - fn sym (&mut self, idx: usize) -> u16 { idx as u16 } - fn len(&mut self) -> usize { self.bits.len() } -} - -struct Codebooks { - cpl_cb: [Codebook<u16>; 5], - quant_cb: Vec<Codebook<u16>>, - vq_cb: [Codebook<u16>; 7], -} - -impl Codebooks { - fn new() -> Self { - let mut cpl0 = CookBookReader { codes: COOK_CPL_2BITS_CODES, bits: COOK_CPL_2BITS_BITS }; - let mut cpl1 = CookBookReader { codes: COOK_CPL_3BITS_CODES, bits: COOK_CPL_3BITS_BITS }; - let mut cpl2 = CookBookReader { codes: COOK_CPL_4BITS_CODES, bits: COOK_CPL_4BITS_BITS }; - let mut cpl3 = CookBookReader { codes: COOK_CPL_5BITS_CODES, bits: COOK_CPL_5BITS_BITS }; - let mut cpl4 = CookBookReader { codes: COOK_CPL_6BITS_CODES, bits: COOK_CPL_6BITS_BITS }; - let cpl_cb = [Codebook::new(&mut cpl0, CodebookMode::MSB).unwrap(), - Codebook::new(&mut cpl1, CodebookMode::MSB).unwrap(), - Codebook::new(&mut cpl2, CodebookMode::MSB).unwrap(), - Codebook::new(&mut cpl3, CodebookMode::MSB).unwrap(), - Codebook::new(&mut cpl4, CodebookMode::MSB).unwrap()]; - let mut quant_cb: Vec<Codebook<u16>> = Vec::with_capacity(COOK_QUANT_CODES.len()); - for i in 0..COOK_QUANT_CODES.len() { - let mut quant = CookBookReader { codes: COOK_QUANT_CODES[i], bits: COOK_QUANT_BITS[i] }; - quant_cb.push(Codebook::new(&mut quant, CodebookMode::MSB).unwrap()); - } - let mut vq0 = CookBookReader { codes: COOK_VQ0_CODES, bits: COOK_VQ0_BITS }; - let mut vq1 = CookBookReader { codes: COOK_VQ1_CODES, bits: COOK_VQ1_BITS }; - let mut vq2 = CookBookReader { codes: COOK_VQ2_CODES, bits: COOK_VQ2_BITS }; - let mut vq3 = CookBookReader { codes: COOK_VQ3_CODES, bits: COOK_VQ3_BITS }; - let mut vq4 = CookBookReader { codes: COOK_VQ4_CODES, bits: COOK_VQ4_BITS }; - let mut vq5 = CookBookReader { codes: COOK_VQ5_CODES, bits: COOK_VQ5_BITS }; - let mut vq6 = CookBookReader { codes: COOK_VQ6_CODES, bits: COOK_VQ6_BITS }; - let vq_cb = [Codebook::new(&mut vq0, CodebookMode::MSB).unwrap(), - Codebook::new(&mut vq1, CodebookMode::MSB).unwrap(), - Codebook::new(&mut vq2, CodebookMode::MSB).unwrap(), - Codebook::new(&mut vq3, CodebookMode::MSB).unwrap(), - Codebook::new(&mut vq4, CodebookMode::MSB).unwrap(), - Codebook::new(&mut vq5, CodebookMode::MSB).unwrap(), - Codebook::new(&mut vq6, CodebookMode::MSB).unwrap()]; - Codebooks { - cpl_cb: cpl_cb, - quant_cb: quant_cb, - vq_cb: vq_cb, - } - } -} - -struct CookDSP { - imdct: IMDCT, - window: [f32; 1024], - out: [f32; 2048], - size: usize, - pow_tab: [f32; 128], - hpow_tab: [f32; 128], - gain_tab: [f32; 23], -} - -impl CookDSP { - fn new(samples: usize) -> Self { - let fsamples = samples as f32; - let mut window: [f32; 1024] = [0.0; 1024]; - let factor = consts::PI / (2.0 * fsamples); - let scale = (2.0 / fsamples).sqrt() / 32768.0; - for k in 0..samples { - window[k] = (factor * ((k as f32) + 0.5)).sin() * scale; - } - let mut pow_tab: [f32; 128] = [0.0; 128]; - let mut hpow_tab: [f32; 128] = [0.0; 128]; - for i in 0..128 { - pow_tab[i] = 2.0f32.powf((i as f32) - 64.0); - hpow_tab[i] = 2.0f32.powf(((i as f32) - 64.0) * 0.5); - } - let mut gain_tab: [f32; 23] = [0.0; 23]; - for i in 0..23 { - gain_tab[i] = pow_tab[i + 53].powf(8.0 / fsamples); - } - let size = samples; - CookDSP { imdct: IMDCT::new(FFTMode::SplitRadix, samples*2, false), window: window, out: [0.0; 2048], size, pow_tab, hpow_tab, gain_tab } - } -} - -trait ClipCat { - fn clip_cat(&self) -> usize; -} - -impl ClipCat for i32 { - fn clip_cat(&self) -> usize { ((*self).max(0) as usize).min(NUM_CATEGORIES - 1) } -} - -const BAND_SIZE: usize = 20; -const MAX_SAMPLES: usize = MAX_SUBBANDS * BAND_SIZE; -const MAX_PAIRS: usize = 5; -const MAX_SUBBANDS: usize = 52; -const NUM_CATEGORIES: usize = 8; - -#[derive(Clone,Copy)] -struct CookChannelPair { - start_ch: usize, - mode: Mode, - samples: usize, - subbands: usize, - js_start: usize, - js_bits: u8, - vector_bits: u8, - - decouple: [u8; BAND_SIZE], - category: [u8; MAX_SUBBANDS * 2], - - block: [[f32; MAX_SAMPLES * 2]; 2], - delay: [[f32; MAX_SAMPLES]; 2], - gains: [[i32; 9]; 2], - prev_gains: [[i32; 9]; 2], - qindex: [i8; MAX_SUBBANDS * 2], -} - -impl CookChannelPair { - fn new() -> Self { - CookChannelPair { - start_ch: 0, - mode: Mode::Mono, - samples: 0, - subbands: 0, - js_start: 0, - js_bits: 0, - vector_bits: 0, - - decouple: [0; BAND_SIZE], - category: [0; MAX_SUBBANDS * 2], - - block: [[0.0; MAX_SAMPLES * 2]; 2], - delay: [[0.0; MAX_SAMPLES]; 2], - gains: [[0; 9]; 2], - prev_gains: [[0; 9]; 2], - qindex: [0; MAX_SUBBANDS * 2], - } - } - fn read_hdr_v1(&mut self, br: &mut ByteReader) -> DecoderResult<()> { - let ver = br.read_u32be()?; - let micro_ver = ver & 0xFF; - self.samples = br.read_u16be()? as usize; - validate!(self.samples > 0 && ((self.samples & (self.samples - 1)) == 0)); - self.subbands = br.read_u16be()? as usize; - validate!(self.subbands <= MAX_SUBBANDS); - match micro_ver { - 1 => { - self.mode = Mode::Mono; - self.js_start = 0; - self.js_bits = 0; - }, - 2 => { - self.mode = Mode::Stereo; - self.js_start = 0; - self.js_bits = 0; - }, - 3 => { - self.mode = Mode::JointStereo; - let _delay = br.read_u32be()?; - self.js_start = br.read_u16be()? as usize; - self.js_bits = br.read_u16be()? as u8; - validate!(self.js_start < MAX_SUBBANDS); - validate!((self.js_bits >= 2) && (self.js_bits <= 6)); - }, - _ => { return Err(DecoderError::InvalidData);} - } - Ok(()) - } - fn read_hdr_v2(&mut self, br: &mut ByteReader) -> DecoderResult<u32> { - let ver = br.read_u32be()?; - validate!((ver >> 24) == 2); - self.samples = br.read_u16be()? as usize; - self.subbands = br.read_u16be()? as usize; - validate!(self.subbands <= MAX_SUBBANDS); - let _delay = br.read_u32be()?; - self.js_start = br.read_u16be()? as usize; - validate!(self.js_start < MAX_SUBBANDS); - let js_bits = br.read_u16be()?; - let chmap = br.read_u32be()?; - if chmap.count_ones() == 1 { - self.js_bits = 0; - self.mode = Mode::Mono; - } else { - validate!((js_bits >= 2) && (js_bits <= 6)); - self.js_bits = js_bits as u8; - self.mode = Mode::JointStereo; - } - Ok(chmap) - } - fn bitalloc(&mut self, num_vectors: usize, bits: usize) { - let avail_bits = (if bits > self.samples { self.samples + ((bits - self.samples) * 5) / 8 } else { bits }) as i32; - let total_subbands = self.subbands + self.js_start; - - let mut bias: i32 = -32; - for i in 0..6 { - let mut sum = 0; - for j in 0..total_subbands { - let idx = ((32 >> i) + bias - (self.qindex[j] as i32)) / 2; - sum += COOK_EXP_BITS[idx.clip_cat()]; - } - if sum >= (avail_bits - 32) { - bias += 32 >> i; - } - } - - let mut exp_index1: [usize; MAX_SUBBANDS * 2] = [0; MAX_SUBBANDS * 2]; - let mut exp_index2: [usize; MAX_SUBBANDS * 2] = [0; MAX_SUBBANDS * 2]; - let mut sum = 0; - for i in 0..total_subbands { - let idx = ((bias - (self.qindex[i] as i32)) / 2).clip_cat(); - sum += COOK_EXP_BITS[idx]; - exp_index1[i] = idx; - exp_index2[i] = idx; - } - - let mut tbias1 = sum; - let mut tbias2 = sum; - let mut tcat: [usize; 128*2] = [0; 128*2]; - let mut tcat_idx1 = 128; - let mut tcat_idx2 = 128; - for _ in 1..(1 << self.vector_bits) { - if tbias1 + tbias2 > avail_bits * 2 { - let mut max = -999999; - let mut idx = total_subbands + 1; - for j in 0..total_subbands { - if exp_index1[j] >= (NUM_CATEGORIES - 1) { continue; } - let t = -2 * (exp_index1[j] as i32) - (self.qindex[j] as i32) + bias; - if t >= max { - max = t; - idx = j; - } - } - if idx >= total_subbands { break; } - tcat[tcat_idx1] = idx; - tcat_idx1 += 1; - tbias1 -= COOK_EXP_BITS[exp_index1[idx]] - COOK_EXP_BITS[exp_index1[idx] + 1]; - exp_index1[idx] += 1; - } else { - let mut min = 999999; - let mut idx = total_subbands + 1; - for j in 0..total_subbands { - if exp_index2[j] == 0 { continue; } - let t = -2 * (exp_index2[j] as i32) - (self.qindex[j] as i32) + bias; - if t < min { - min = t; - idx = j; - } - } - if idx >= total_subbands { break; } - tcat_idx2 -= 1; - tcat[tcat_idx2] = idx; - tbias2 -= COOK_EXP_BITS[exp_index2[idx]] - COOK_EXP_BITS[exp_index2[idx] - 1]; - exp_index2[idx] -= 1; - } - } - for i in 0..total_subbands { - self.category[i] = exp_index2[i] as u8; - } - - for _ in 0..num_vectors { - let idx = tcat[tcat_idx2]; - tcat_idx2 += 1; - self.category[idx] = (self.category[idx] + 1).min((NUM_CATEGORIES - 1) as u8) as u8; - } - } - fn decode_channel_data(&mut self, dsp: &mut CookDSP, rnd: &mut RND, codebooks: &Codebooks, src: &[u8], buf: &mut [u8], channel: usize) -> DecoderResult<()> { - // decrypt - for (i, b) in src.iter().enumerate() { - buf[i] = b ^ COOK_XOR_KEY[i & 3]; - } - let mut br = BitReader::new(buf, src.len(), BitReaderMode::BE); - - let num_gains = br.read_code(UintCodeType::UnaryOnes)? as usize; - validate!(num_gains <= 8); - - swap(&mut self.gains[channel], &mut self.prev_gains[channel]); - self.block[channel] = [0.0; MAX_SAMPLES * 2]; - - // gains - let mut ipos = 0; - for _ in 0..num_gains { - let idx = br.read(3)? as usize; - let val; - if br.read_bool()? { - val = (br.read(4)? as i32) - 7; - } else { - val = -1; - } - validate!(idx >= ipos); - while ipos <= idx { - self.prev_gains[channel][ipos] = val; - ipos += 1; - } - } - while ipos <= 8 { - self.prev_gains[channel][ipos] = 0; - ipos += 1; - } - - // coupling information - if self.mode == Mode::JointStereo { - let cstart = COOK_CPL_BAND[self.js_start] as usize; - let cend = COOK_CPL_BAND[self.subbands - 1] as usize; - if br.read_bool()? { - let cb = &codebooks.cpl_cb[(self.js_bits - 2) as usize]; - for i in cstart..cend+1 { - self.decouple[i] = br.read_cb(cb)? as u8; - } - } else { - for i in cstart..cend+1 { - self.decouple[i] = br.read(self.js_bits)? as u8; - } - } - } - - // envelope - let tot_subbands = self.subbands + self.js_start; - self.qindex[0] = (br.read(6)? as i8) - 6; - for i in 1..tot_subbands { - let mut pos = i; - if pos >= self.js_start * 2 { - pos -= self.js_start; - } else { - pos >>= 1; - } - let ipos = ((pos as i8) - 1).max(0).min(12); - let cb = &codebooks.quant_cb[ipos as usize]; - self.qindex[i] = (br.read_cb(cb)? as i8) + self.qindex[i - 1] - 12; - validate!((self.qindex[i] >= -63) && (self.qindex[i] <= 63)); - } - let num_vectors = br.read(self.vector_bits)? as usize; - self.bitalloc(num_vectors, br.left() as usize); - - // coefficients - self.block[channel] = [0.0; MAX_SAMPLES * 2]; - let mut off = 0; - for sb in 0..tot_subbands { - let mut coef_index: [u8; BAND_SIZE] = [0; BAND_SIZE]; - let mut coef_sign: [bool; BAND_SIZE] = [false; BAND_SIZE]; - let cat = self.category[sb] as usize; - if (cat < NUM_CATEGORIES - 1) && br.left() > 0 { - unpack_band(&mut br, codebooks, &mut coef_index, &mut coef_sign, cat)?; - } - for i in 0..BAND_SIZE { - let val; - if coef_index[i] == 0 { - let v = COOK_DITHER_TAB[cat]; - val = if !rnd.get_sign() { v } else { -v }; - } else { - let v = COOK_QUANT_CENTROID[cat][coef_index[i] as usize]; - val = if !coef_sign[i] { v } else { -v }; - } - self.block[channel][off + i] = val * dsp.hpow_tab[(self.qindex[sb] + 64) as usize]; - } - off += BAND_SIZE; - } - - Ok(()) - } - fn decode(&mut self, dsp: &mut CookDSP, rnd: &mut RND, codebooks: &Codebooks, src: &[u8], buf: &mut [u8], abuf: &mut NABufferType) -> DecoderResult<()> { - if self.mode == Mode::Stereo { - let mut schunk = src.chunks(src.len() / 2); - self.decode_channel_data(dsp, rnd, codebooks, schunk.next().unwrap(), buf, 0)?; - self.decode_channel_data(dsp, rnd, codebooks, schunk.next().unwrap(), buf, 1)?; - } else { - self.decode_channel_data(dsp, rnd, codebooks, src, buf, 0)?; - } - // uncouple joint stereo channels - if self.mode == Mode::JointStereo { - for i in 0..self.js_start { - for j in 0..BAND_SIZE { - self.block[1][i * BAND_SIZE + j] = self.block[0][(i * 2 + 1) * BAND_SIZE + j]; - self.block[0][i * BAND_SIZE + j] = self.block[0][(i * 2) * BAND_SIZE + j]; - } - } - let scale_idx = (self.js_bits as usize) - 2; - let scale_off = (1 << self.js_bits) as usize; - for i in self.js_start..self.subbands { - let idx = self.decouple[COOK_CPL_BAND[i] as usize] as usize; - let doff = i * BAND_SIZE; - let soff = (i + self.js_start) * BAND_SIZE; - let m1 = COOK_CPL_SCALES[scale_idx][ 1 + idx]; - let m2 = COOK_CPL_SCALES[scale_idx][scale_off - 1 - idx]; - for j in 0..BAND_SIZE { - self.block[0][doff + j] = self.block[0][soff + j] * m1; - self.block[1][doff + j] = self.block[0][soff + j] * m2; - } - } - for i in (self.subbands * BAND_SIZE)..MAX_SAMPLES { - self.block[0][i] = 0.0; - self.block[1][i] = 0.0; - } - self.gains[1] = self.gains[0]; - self.prev_gains[1] = self.prev_gains[0]; - } - for ch in 0..self.mode.get_channels() { - let off = abuf.get_offset(ch + self.start_ch); - let mut adata = abuf.get_abuf_f32().unwrap(); - let mut output = adata.get_data_mut(); - let dst = &mut output[off..]; - - dsp.imdct.imdct(&self.block[ch], &mut dsp.out); - - let prev_gain = dsp.pow_tab[(self.prev_gains[ch][0] + 64) as usize]; - let mut cur_gain = 0.0; - let mut cur_gain2 = 0.0; - let mut gain_idx = 0; - let eighthmask = (self.samples >> 3) - 1; - for (i, out) in dst.iter_mut().take(self.samples).enumerate() { - *out = dsp.out[i + self.samples] * prev_gain * dsp.window[i] - - self.delay[ch][i] * dsp.window[self.samples - i - 1]; - if (i & eighthmask) == 0 { - if (self.gains[ch][gain_idx] == 0) && (self.gains[ch][gain_idx + 1] == 0) { - cur_gain = 1.0; - cur_gain2 = 1.0; - } else { - cur_gain = dsp.pow_tab[(self.gains[ch][gain_idx] + 64) as usize]; - cur_gain2 = dsp.gain_tab[(self.gains[ch][gain_idx + 1] - self.gains[ch][gain_idx] + 11) as usize]; - } - gain_idx += 1; - } - *out *= cur_gain; - cur_gain *= cur_gain2; - } - for i in 0..self.samples { self.delay[ch][i] = dsp.out[i]; } - } - Ok(()) - } -} - -const COOK_VQ_GROUP_SIZE: [usize; 7] = [ 2, 2, 2, 4, 4, 5, 5 ]; -const COOK_NUM_VQ_GROUPS: [usize; 7] = [ 10, 10, 10, 5, 5, 4, 4 ]; -const COOK_VQ_INV_RADIX: [u32; 7] = [ 74899, 104858, 149797, 209716, 262144, 349526, 524288 ]; -const COOK_VQ_MULT: [u32; 7] = [ 13, 9, 6, 4, 3, 2, 1 ]; -fn unpack_band(br: &mut BitReader, codebooks: &Codebooks, coef_index: &mut [u8; BAND_SIZE], coef_sign: &mut [bool; BAND_SIZE], cat: usize) -> DecoderResult<()> { - let cb = &codebooks.vq_cb[cat]; - let group_size = COOK_VQ_GROUP_SIZE[cat]; - let mult = COOK_VQ_MULT[cat] + 1; - for i in 0..COOK_NUM_VQ_GROUPS[cat] { - let ret = br.read_cb(cb); - let mut val; - if let Ok(v) = ret { - val = v as u32; - } else { - let left = br.left() as u32; - br.skip(left)?; - break; - } - let mut nnz = 0; - for j in (0..group_size).rev() { - let t = (val * COOK_VQ_INV_RADIX[cat]) >> 20; - coef_index[i * group_size + j] = (val - t * mult) as u8; - if coef_index[i * group_size + j] != 0 { - nnz += 1; - } - val = t; - } - if (br.left() as usize) < nnz { - let left = br.left() as u32; - br.skip(left)?; - break; - } - for j in 0..group_size { - if coef_index[i * group_size + j] != 0 { - coef_sign[i * group_size + j] = br.read_bool()?; - } else { - coef_sign[i * group_size + j] = false; - } - } - } - Ok(()) -} - -struct RND { - state: u32, -} - -impl RND { - fn new() -> Self { - Self { state: 0xC0DECC00 } - } - fn get_sign(&mut self) -> bool { - self.state = (self.state & 0xFFFF).wrapping_mul(36969).wrapping_add(self.state >> 16); - (self.state & 0x10000) != 0 - } -} - -struct CookDecoder { - info: Rc<NACodecInfo>, - chmap: NAChannelMap, - src: [u8; 65536], - num_pairs: usize, - pairs: [CookChannelPair; MAX_PAIRS], - channels: usize, - samples: usize, - codebooks: Codebooks, - rnd: RND, - dsp: CookDSP, -} - -impl CookDecoder { - fn new() -> Self { - CookDecoder { - info: NACodecInfo::new_dummy(), - chmap: NAChannelMap::new(), - src: [0; 65536], - num_pairs: 0, - channels: 0, - samples: 0, - pairs: [CookChannelPair::new(); MAX_PAIRS], - codebooks: Codebooks::new(), - rnd: RND::new(), - dsp: CookDSP::new(1024), - } - } -} - -impl NADecoder for CookDecoder { - fn init(&mut self, info: Rc<NACodecInfo>) -> DecoderResult<()> { - if let NACodecTypeInfo::Audio(ainfo) = info.get_properties() { - let edata = info.get_extradata().unwrap(); - validate!(edata.len() >= 4); - - let mut mr = MemoryReader::new_read(&edata); - let mut br = ByteReader::new(&mut mr); - let ver = br.peek_u32be()?; - - let maj_ver = ver >> 24; - let mut chmap: u32 = 0; - match maj_ver { - 1 => { - self.num_pairs = 1; - self.pairs[0].read_hdr_v1(&mut br)?; - self.channels = self.pairs[0].mode.get_channels(); - if ainfo.get_channels() == 1 { // forced mono - self.pairs[0].mode = Mode::Mono; - self.channels = 1; - chmap = 0x4; - } else { - chmap = 0x3; - } - }, - 2 => { - self.num_pairs = (edata.len() - (br.tell() as usize)) / 20; - validate!(self.num_pairs <= MAX_PAIRS); - let mut start_ch = 0; - for i in 0..self.num_pairs { - let pair_chmap = self.pairs[i].read_hdr_v2(&mut br)?; - self.pairs[i].start_ch = start_ch; - validate!((chmap & pair_chmap) == 0); - start_ch += self.pairs[i].mode.get_channels(); - } - self.channels = start_ch; - }, - _ => { return Err(DecoderError::InvalidData); } - }; - - self.samples = self.pairs[0].samples / self.pairs[0].mode.get_channels(); - validate!((self.samples >= 16) && (self.samples <= 1024)); - if self.samples != self.dsp.size { - self.dsp = CookDSP::new(self.samples); - } - self.chmap = NAChannelMap::from_ms_mapping(chmap); - - for i in 1..self.num_pairs { - validate!((self.pairs[i].samples / self.pairs[i].mode.get_channels()) == self.samples); - } - - let vector_bits = match self.samples { - 16 | 32 | 64 | 128 | 256 => 5, - 512 => 6, - 1024 => 7, - _ => unreachable!(), - }; - for pair in self.pairs.iter_mut() { - match pair.mode { - Mode::Mono => { - pair.vector_bits = 5; - }, - Mode::Stereo => { - pair.vector_bits = 5; - pair.samples >>= 1; - }, - Mode::JointStereo => { - pair.vector_bits = vector_bits; - pair.samples >>= 1; - }, - }; - } - - let ainfo = NAAudioInfo::new(ainfo.get_sample_rate(), self.channels as u8, - SND_F32P_FORMAT, self.samples); - self.info = info.replace_info(NACodecTypeInfo::Audio(ainfo)); - - Ok(()) - } else { - Err(DecoderError::InvalidData) - } - } - fn decode(&mut self, pkt: &NAPacket) -> DecoderResult<NAFrameRef> { - let info = pkt.get_stream().get_info(); - validate!(info.get_properties().is_audio()); - let pktbuf = pkt.get_buffer(); - validate!(pktbuf.len() > self.num_pairs * 2); - - let mut seg_size: [usize; MAX_PAIRS] = [0; MAX_PAIRS]; - let mut seg_start: [usize; MAX_PAIRS+1] = [0; MAX_PAIRS+1]; - - let ainfo = self.info.get_properties().get_audio_info().unwrap(); - - seg_size[0] = pktbuf.len() - (self.num_pairs - 1); - for i in 1..self.num_pairs { - seg_size[i] = (pktbuf[pktbuf.len() - self.num_pairs + i] as usize) * 2; - validate!(seg_size[i] != 0); - let ret = seg_size[0].checked_sub(seg_size[i]); - if let Some(val) = ret { - seg_size[0] = val; - } else { - return Err(DecoderError::InvalidData); - } - } - validate!(seg_size[0] != 0); - seg_start[0] = 0; - for i in 0..self.num_pairs { - seg_start[i + 1] = seg_start[i] + seg_size[i]; - } - - let mut abuf = alloc_audio_buffer(ainfo, self.samples, self.chmap.clone())?; - - for pair in 0..self.num_pairs { - self.pairs[pair].decode(&mut self.dsp, &mut self.rnd, &self.codebooks, &pktbuf[seg_start[pair]..seg_start[pair + 1]], &mut self.src, &mut abuf)?; - } - - let mut frm = NAFrame::new_from_pkt(pkt, self.info.replace_info(NACodecTypeInfo::Audio(ainfo)), abuf); - frm.set_keyframe(true); - Ok(Rc::new(RefCell::new(frm))) - } -} - -pub fn get_decoder() -> Box<NADecoder> { - Box::new(CookDecoder::new()) -} - -#[cfg(test)] -mod test { - use crate::test::dec_video::*; - #[test] - fn test_cook() { -// let file = "assets/RV/rv30_weighted_mc.rm"; - let file = "assets/RV/multichannel.rma"; - test_decode_audio("realmedia", file, Some(2000), "cook"); - } -} - -const COOK_XOR_KEY: [u8; 4] = [ 0x37, 0xC5, 0x11, 0xF2 ]; - -const COOK_CPL_2BITS_BITS: &[u8; 3] = &[ 2, 1, 2 ]; -const COOK_CPL_2BITS_CODES: &[u16; 3] = &[ 0x02, 0x00, 0x03 ]; -const COOK_CPL_3BITS_BITS: &[u8; 7] = &[ 6, 5, 2, 1, 3, 4, 6 ]; -const COOK_CPL_3BITS_CODES: &[u16; 7] = &[ 0x3e, 0x1e, 0x02, 0x00, 0x06, 0x0e, 0x3f ]; -const COOK_CPL_4BITS_BITS: &[u8; 15] = &[ 8, 8, 7, 6, 5, 4, 3, 1, 3, 4, 5, 6, 7, 8, 8 ]; -const COOK_CPL_4BITS_CODES: &[u16; 15] = &[ - 0xfc, 0xfd, 0x7c, 0x3c, 0x1c, 0x0c, 0x04, 0x00, - 0x05, 0x0d, 0x1d, 0x3d, 0x7d, 0xfe, 0xff -]; -const COOK_CPL_5BITS_BITS: &[u8; 31] = &[ - 10, 10, 10, 10, 9, 9, 8, 8, 7, 7, 6, 6, 5, 5, 3, 1, - 3, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 10, 10 -]; -const COOK_CPL_5BITS_CODES: &[u16; 31] = &[ - 0x03F8, 0x03F9, 0x03FA, 0x03FB, 0x01F8, 0x01F9, 0x00F8, 0x00F9, - 0x0078, 0x0079, 0x0038, 0x0039, 0x0018, 0x0019, 0x0004, 0x0000, - 0x0005, 0x001A, 0x001B, 0x003A, 0x003B, 0x007A, 0x007B, 0x00FA, - 0x00FB, 0x01FA, 0x01FB, 0x03FC, 0x03FD, 0x03FE, 0x03FF -]; -const COOK_CPL_6BITS_BITS: &[u8; 63] = &[ - 16, 15, 14, 13, 12, 11, 11, 11, 11, 10, 10, 10, 10, 9, 9, 9, - 9, 9, 8, 8, 8, 8, 7, 7, 7, 7, 6, 6, 5, 5, 3, 1, - 4, 5, 5, 6, 6, 7, 7, 7, 7, 8, 8, 8, 8, 9, 9, 9, - 9, 10, 10, 10, 10, 10, 11, 11, 11, 11, 12, 13, 14, 14, 16 -]; -const COOK_CPL_6BITS_CODES: &[u16; 63] = &[ - 0xFFFE, 0x7FFE, 0x3FFC, 0x1FFC, 0x0FFC, 0x07F6, 0x07F7, 0x07F8, - 0x07F9, 0x03F2, 0x03F3, 0x03F4, 0x03F5, 0x01F0, 0x01F1, 0x01F2, - 0x01F3, 0x01F4, 0x00F0, 0x00F1, 0x00F2, 0x00F3, 0x0070, 0x0071, - 0x0072, 0x0073, 0x0034, 0x0035, 0x0016, 0x0017, 0x0004, 0x0000, - 0x000A, 0x0018, 0x0019, 0x0036, 0x0037, 0x0074, 0x0075, 0x0076, - 0x0077, 0x00F4, 0x00F5, 0x00F6, 0x00F7, 0x01F5, 0x01F6, 0x01F7, - 0x01F8, 0x03F6, 0x03F7, 0x03F8, 0x03F9, 0x03FA, 0x07FA, 0x07FB, - 0x07FC, 0x07FD, 0x0FFD, 0x1FFD, 0x3FFD, 0x3FFE, 0xFFFF -]; - -const COOK_QUANT_BITS: [&[u8; 24]; 13] = [ - &[ 4, 6, 5, 5, 4, 4, 4, 4, 4, 4, 3, 3, 3, 4, 5, 7, 8, 9, 11, 11, 12, 12, 12, 12 ], - &[ 10, 8, 6, 5, 5, 4, 3, 3, 3, 3, 3, 3, 4, 5, 7, 9, 11, 12, 13, 15, 15, 15, 16, 16 ], - &[ 12, 10, 8, 6, 5, 4, 4, 4, 4, 4, 4, 3, 3, 3, 4, 4, 5, 5, 7, 9, 11, 13, 14, 14 ], - &[ 13, 10, 9, 9, 7, 7, 5, 5, 4, 3, 3, 3, 3, 3, 4, 4, 4, 5, 7, 9, 11, 13, 13, 13 ], - &[ 12, 13, 10, 8, 6, 6, 5, 5, 4, 4, 3, 3, 3, 3, 3, 4, 5, 5, 6, 7, 9, 11, 14, 14 ], - &[ 12, 11, 9, 8, 8, 7, 5, 4, 4, 3, 3, 3, 3, 3, 4, 4, 5, 5, 7, 8, 10, 13, 14, 14 ], - &[ 15, 16, 15, 12, 10, 8, 6, 5, 4, 3, 3, 3, 2, 3, 4, 5, 5, 7, 9, 11, 13, 16, 16, 16 ], - &[ 14, 14, 11, 10, 9, 7, 7, 5, 5, 4, 3, 3, 2, 3, 3, 4, 5, 7, 9, 9, 12, 14, 15, 15 ], - &[ 9, 9, 9, 8, 7, 6, 5, 4, 3, 3, 3, 3, 3, 3, 4, 5, 6, 7, 8, 10, 11, 12, 13, 13 ], - &[ 14, 12, 10, 8, 6, 6, 5, 4, 3, 3, 3, 3, 3, 3, 4, 5, 6, 8, 8, 9, 11, 14, 14, 14 ], - &[ 13, 10, 9, 8, 6, 6, 5, 4, 4, 4, 3, 3, 2, 3, 4, 5, 6, 8, 9, 9, 11, 12, 14, 14 ], - &[ 16, 13, 12, 11, 9, 6, 5, 5, 4, 4, 4, 3, 2, 3, 3, 4, 5, 7, 8, 10, 14, 16, 16, 16 ], - &[ 13, 14, 14, 14, 10, 8, 7, 7, 5, 4, 3, 3, 2, 3, 3, 4, 5, 5, 7, 9, 11, 14, 14, 14 ], -]; -const COOK_QUANT_CODES: [&[u16; 24]; 13] = [ - &[ 0x0006, 0x003e, 0x001c, 0x001d, 0x0007, 0x0008, 0x0009, 0x000a, 0x000b, 0x000c, 0x0000, 0x0001, - 0x0002, 0x000d, 0x001e, 0x007e, 0x00fe, 0x01fe, 0x07fc, 0x07fd, 0x0ffc, 0x0ffd, 0x0ffe, 0x0fff ], - &[ 0x03fe, 0x00fe, 0x003e, 0x001c, 0x001d, 0x000c, 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, - 0x000d, 0x001e, 0x007e, 0x01fe, 0x07fe, 0x0ffe, 0x1ffe, 0x7ffc, 0x7ffd, 0x7ffe, 0xfffe, 0xffff ], - &[ 0x0ffe, 0x03fe, 0x00fe, 0x003e, 0x001c, 0x0006, 0x0007, 0x0008, 0x0009, 0x000a, 0x000b, 0x0000, - 0x0001, 0x0002, 0x000c, 0x000d, 0x001d, 0x001e, 0x007e, 0x01fe, 0x07fe, 0x1ffe, 0x3ffe, 0x3fff ], - &[ 0x1ffc, 0x03fe, 0x01fc, 0x01fd, 0x007c, 0x007d, 0x001c, 0x001d, 0x000a, 0x0000, 0x0001, 0x0002, - 0x0003, 0x0004, 0x000b, 0x000c, 0x000d, 0x001e, 0x007e, 0x01fe, 0x07fe, 0x1ffd, 0x1ffe, 0x1fff ], - &[ 0x0ffe, 0x1ffe, 0x03fe, 0x00fe, 0x003c, 0x003d, 0x001a, 0x001b, 0x000a, 0x000b, 0x0000, 0x0001, - 0x0002, 0x0003, 0x0004, 0x000c, 0x001c, 0x001d, 0x003e, 0x007e, 0x01fe, 0x07fe, 0x3ffe, 0x3fff ], - &[ 0x0ffe, 0x07fe, 0x01fe, 0x00fc, 0x00fd, 0x007c, 0x001c, 0x000a, 0x000b, 0x0000, 0x0001, 0x0002, - 0x0003, 0x0004, 0x000c, 0x000d, 0x001d, 0x001e, 0x007d, 0x00fe, 0x03fe, 0x1ffe, 0x3ffe, 0x3fff ], - &[ 0x7ffc, 0xfffc, 0x7ffd, 0x0ffe, 0x03fe, 0x00fe, 0x003e, 0x001c, 0x000c, 0x0002, 0x0003, 0x0004, - 0x0000, 0x0005, 0x000d, 0x001d, 0x001e, 0x007e, 0x01fe, 0x07fe, 0x1ffe, 0xfffd, 0xfffe, 0xffff ], - &[ 0x3ffc, 0x3ffd, 0x07fe, 0x03fe, 0x01fc, 0x007c, 0x007d, 0x001c, 0x001d, 0x000c, 0x0002, 0x0003, - 0x0000, 0x0004, 0x0005, 0x000d, 0x001e, 0x007e, 0x01fd, 0x01fe, 0x0ffe, 0x3ffe, 0x7ffe, 0x7fff ], - &[ 0x01fc, 0x01fd, 0x01fe, 0x00fc, 0x007c, 0x003c, 0x001c, 0x000c, 0x0000, 0x0001, 0x0002, 0x0003, - 0x0004, 0x0005, 0x000d, 0x001d, 0x003d, 0x007d, 0x00fd, 0x03fe, 0x07fe, 0x0ffe, 0x1ffe, 0x1fff ], - &[ 0x3ffc, 0x0ffe, 0x03fe, 0x00fc, 0x003c, 0x003d, 0x001c, 0x000c, 0x0000, 0x0001, 0x0002, 0x0003, - 0x0004, 0x0005, 0x000d, 0x001d, 0x003e, 0x00fd, 0x00fe, 0x01fe, 0x07fe, 0x3ffd, 0x3ffe, 0x3fff ], - &[ 0x1ffe, 0x03fe, 0x01fc, 0x00fc, 0x003c, 0x003d, 0x001c, 0x000a, 0x000b, 0x000c, 0x0002, 0x0003, - 0x0000, 0x0004, 0x000d, 0x001d, 0x003e, 0x00fd, 0x01fd, 0x01fe, 0x07fe, 0x0ffe, 0x3ffe, 0x3fff ], - &[ 0xfffc, 0x1ffe, 0x0ffe, 0x07fe, 0x01fe, 0x003e, 0x001c, 0x001d, 0x000a, 0x000b, 0x000c, 0x0002, - 0x0000, 0x0003, 0x0004, 0x000d, 0x001e, 0x007e, 0x00fe, 0x03fe, 0x3ffe, 0xfffd, 0xfffe, 0xffff ], - &[ 0x1ffc, 0x3ffa, 0x3ffb, 0x3ffc, 0x03fe, 0x00fe, 0x007c, 0x007d, 0x001c, 0x000c, 0x0002, 0x0003, - 0x0000, 0x0004, 0x0005, 0x000d, 0x001d, 0x001e, 0x007e, 0x01fe, 0x07fe, 0x3ffd, 0x3ffe, 0x3fff ], -]; - -const COOK_VQ0_BITS: &[u8; 191] = &[ - 1, 4, 6, 6, 7, 7, 8, 8, 8, 9, 9, 10, - 11, 11, 4, 5, 6, 7, 7, 8, 8, 9, 9, 9, - 9, 10, 11, 11, 5, 6, 7, 8, 8, 9, 9, 9, - 9, 10, 10, 10, 11, 12, 6, 7, 8, 9, 9, 9, - 9, 10, 10, 10, 10, 11, 12, 13, 7, 7, 8, 9, - 9, 9, 10, 10, 10, 10, 11, 11, 12, 13, 8, 8, - 9, 9, 9, 10, 10, 10, 10, 11, 11, 12, 13, 14, - 8, 8, 9, 9, 10, 10, 11, 11, 11, 12, 12, 13, - 13, 15, 8, 8, 9, 9, 10, 10, 11, 11, 11, 12, - 12, 13, 14, 15, 9, 9, 9, 10, 10, 10, 11, 11, - 12, 13, 12, 14, 15, 16, 9, 9, 10, 10, 10, 10, - 11, 12, 12, 14, 14, 16, 16, 0, 9, 9, 10, 10, - 11, 11, 12, 13, 13, 14, 14, 15, 0, 0, 10, 10, - 10, 11, 11, 12, 12, 13, 15, 15, 16, 0, 0, 0, - 11, 11, 11, 12, 13, 13, 13, 15, 16, 16, 0, 0, - 0, 0, 11, 11, 12, 13, 13, 14, 15, 16, 16 -]; -const COOK_VQ0_CODES: &[u16; 191] = &[ - 0x0000, 0x0008, 0x002c, 0x002d, 0x0062, 0x0063, 0x00d4, 0x00d5, - 0x00d6, 0x01c6, 0x01c7, 0x03ca, 0x07d6, 0x07d7, 0x0009, 0x0014, - 0x002e, 0x0064, 0x0065, 0x00d7, 0x00d8, 0x01c8, 0x01c9, 0x01ca, - 0x01cb, 0x03cb, 0x07d8, 0x07d9, 0x0015, 0x002f, 0x0066, 0x00d9, - 0x00da, 0x01cc, 0x01cd, 0x01ce, 0x01cf, 0x03cc, 0x03cd, 0x03ce, - 0x07da, 0x0fe4, 0x0030, 0x0067, 0x00db, 0x01d0, 0x01d1, 0x01d2, - 0x01d3, 0x03cf, 0x03d0, 0x03d1, 0x03d2, 0x07db, 0x0fe5, 0x1fea, - 0x0068, 0x0069, 0x00dc, 0x01d4, 0x01d5, 0x01d6, 0x03d3, 0x03d4, - 0x03d5, 0x03d6, 0x07dc, 0x07dd, 0x0fe6, 0x1feb, 0x00dd, 0x00de, - 0x01d7, 0x01d8, 0x01d9, 0x03d7, 0x03d8, 0x03d9, 0x03da, 0x07de, - 0x07df, 0x0fe7, 0x1fec, 0x3ff2, 0x00df, 0x00e0, 0x01da, 0x01db, - 0x03db, 0x03dc, 0x07e0, 0x07e1, 0x07e2, 0x0fe8, 0x0fe9, 0x1fed, - 0x1fee, 0x7ff4, 0x00e1, 0x00e2, 0x01dc, 0x01dd, 0x03dd, 0x03de, - 0x07e3, 0x07e4, 0x07e5, 0x0fea, 0x0feb, 0x1fef, 0x3ff3, 0x7ff5, - 0x01de, 0x01df, 0x01e0, 0x03df, 0x03e0, 0x03e1, 0x07e6, 0x07e7, - 0x0fec, 0x1ff0, 0x0fed, 0x3ff4, 0x7ff6, 0xfff8, 0x01e1, 0x01e2, - 0x03e2, 0x03e3, 0x03e4, 0x03e5, 0x07e8, 0x0fee, 0x0fef, 0x3ff5, - 0x3ff6, 0xfff9, 0xfffa, 0xfffa, 0x01e3, 0x01e4, 0x03e6, 0x03e7, - 0x07e9, 0x07ea, 0x0ff0, 0x1ff1, 0x1ff2, 0x3ff7, 0x3ff8, 0x7ff7, - 0x7ff7, 0xfffa, 0x03e8, 0x03e9, 0x03ea, 0x07eb, 0x07ec, 0x0ff1, - 0x0ff2, 0x1ff3, 0x7ff8, 0x7ff9, 0xfffb, 0x3ff8, 0x7ff7, 0x7ff7, - 0x07ed, 0x07ee, 0x07ef, 0x0ff3, 0x1ff4, 0x1ff5, 0x1ff6, 0x7ffa, - 0xfffc, 0xfffd, 0xfffb, 0xfffb, 0x3ff8, 0x7ff7, 0x07f0, 0x07f1, - 0x0ff4, 0x1ff7, 0x1ff8, 0x3ff9, 0x7ffb, 0xfffe, 0xffff -]; -const COOK_VQ1_BITS: &[u8; 97] = &[ - 1, 4, 5, 6, 7, 8, 8, 9, 10, 10, 4, 5, - 6, 7, 7, 8, 8, 9, 9, 11, 5, 5, 6, 7, - 8, 8, 9, 9, 10, 11, 6, 6, 7, 8, 8, 9, - 9, 10, 11, 12, 7, 7, 8, 8, 9, 9, 10, 11, - 11, 13, 8, 8, 8, 9, 9, 10, 10, 11, 12, 14, - 8, 8, 8, 9, 10, 11, 11, 12, 13, 15, 9, 9, - 9, 10, 11, 12, 12, 14, 14, 0, 9, 9, 9, 10, - 11, 12, 14, 16, 0, 0, 10, 10, 11, 12, 13, 14, 16 -]; -const COOK_VQ1_CODES: &[u16; 97] = &[ - 0x0000, 0x0008, 0x0014, 0x0030, 0x006a, 0x00e2, 0x00e3, 0x01e4, - 0x03ec, 0x03ed, 0x0009, 0x0015, 0x0031, 0x006b, 0x006c, 0x00e4, - 0x00e5, 0x01e5, 0x01e6, 0x07f0, 0x0016, 0x0017, 0x0032, 0x006d, - 0x00e6, 0x00e7, 0x01e7, 0x01e8, 0x03ee, 0x07f1, 0x0033, 0x0034, - 0x006e, 0x00e8, 0x00e9, 0x01e9, 0x01ea, 0x03ef, 0x07f2, 0x0ff6, - 0x006f, 0x0070, 0x00ea, 0x00eb, 0x01eb, 0x01ec, 0x03f0, 0x07f3, - 0x07f4, 0x1ffa, 0x00ec, 0x00ed, 0x00ee, 0x01ed, 0x01ee, 0x03f1, - 0x03f2, 0x07f5, 0x0ff7, 0x3ffa, 0x00ef, 0x00f0, 0x00f1, 0x01ef, - 0x03f3, 0x07f6, 0x07f7, 0x0ff8, 0x1ffb, 0x7ffe, 0x01f0, 0x01f1, - 0x01f2, 0x03f4, 0x07f8, 0x0ff9, 0x0ffa, 0x3ffb, 0x3ffc, 0x0000, - 0x01f3, 0x01f4, 0x01f5, 0x03f5, 0x07f9, 0x0ffb, 0x3ffd, 0xfffe, - 0x0000, 0x0000, 0x03f6, 0x03f7, 0x07fa, 0x0ffc, 0x1ffc, 0x3ffe, - 0xffff -]; -const COOK_VQ2_BITS: &[u8; 48] = &[ - 1, 4, 5, 7, 8, 9, 10, 3, 4, 5, 7, 8, - 9, 10, 5, 5, 6, 7, 8, 10, 10, 7, 6, 7, - 8, 9, 10, 12, 8, 8, 8, 9, 10, 12, 14, 8, - 9, 9, 10, 11, 15, 16, 9, 10, 11, 12, 13, 16 -]; -const COOK_VQ2_CODES: &[u16; 48] = &[ - 0x0000, 0x000a, 0x0018, 0x0074, 0x00f2, 0x01f4, 0x03f6, 0x0004, 0x000b, 0x0019, 0x0075, 0x00f3, - 0x01f5, 0x03f7, 0x001a, 0x001b, 0x0038, 0x0076, 0x00f4, 0x03f8, 0x03f9, 0x0077, 0x0039, 0x0078, - 0x00f5, 0x01f6, 0x03fa, 0x0ffc, 0x00f6, 0x00f7, 0x00f8, 0x01f7, 0x03fb, 0x0ffd, 0x3ffe, 0x00f9, - 0x01f8, 0x01f9, 0x03fc, 0x07fc, 0x7ffe, 0xfffe, 0x01fa, 0x03fd, 0x07fd, 0x0ffe, 0x1ffe, 0xffff -]; -const COOK_VQ3_BITS: &[u8; 607] = &[ - 2, 4, 6, 8, 10, 5, 5, 6, 8, 10, 7, 8, - 8, 10, 12, 9, 9, 10, 12, 15, 10, 11, 13, 16, - 16, 5, 6, 8, 10, 11, 5, 6, 8, 10, 12, 7, - 7, 8, 10, 13, 9, 9, 10, 12, 15, 12, 11, 13, - 16, 16, 7, 9, 10, 12, 15, 7, 8, 10, 12, 13, - 9, 9, 11, 13, 16, 11, 11, 12, 14, 16, 12, 12, - 14, 16, 0, 9, 11, 12, 16, 16, 9, 10, 13, 15, - 16, 10, 11, 12, 16, 16, 13, 13, 16, 16, 16, 16, - 16, 15, 16, 0, 11, 13, 16, 16, 15, 11, 13, 15, - 16, 16, 13, 13, 16, 16, 0, 14, 16, 16, 16, 0, - 16, 16, 0, 0, 0, 4, 6, 8, 10, 13, 6, 6, - 8, 10, 13, 9, 8, 10, 12, 16, 10, 10, 11, 15, - 16, 13, 12, 14, 16, 16, 5, 6, 8, 11, 13, 6, - 6, 8, 10, 13, 8, 8, 9, 11, 14, 10, 10, 12, - 12, 16, 13, 12, 13, 15, 16, 7, 8, 9, 12, 16, - 7, 8, 10, 12, 14, 9, 9, 10, 13, 16, 11, 10, - 12, 15, 16, 13, 13, 16, 16, 0, 9, 11, 13, 16, - 16, 9, 10, 12, 15, 16, 10, 11, 13, 16, 16, 13, - 12, 16, 16, 16, 16, 16, 16, 16, 0, 11, 13, 16, - 16, 16, 11, 13, 16, 16, 16, 12, 13, 15, 16, 0, - 16, 16, 16, 16, 0, 16, 16, 0, 0, 0, 6, 8, - 11, 13, 16, 8, 8, 10, 12, 16, 11, 10, 11, 13, - 16, 12, 13, 13, 15, 16, 16, 16, 14, 16, 0, 6, - 8, 10, 13, 16, 8, 8, 10, 12, 16, 10, 10, 11, - 13, 16, 13, 12, 13, 16, 16, 14, 14, 14, 16, 0, - 8, 9, 11, 13, 16, 8, 9, 11, 16, 14, 10, 10, - 12, 15, 16, 12, 12, 13, 16, 16, 15, 16, 16, 16, - 0, 10, 12, 15, 16, 16, 10, 12, 12, 14, 16, 12, - 12, 13, 16, 16, 14, 15, 16, 16, 0, 16, 16, 16, - 0, 0, 12, 15, 15, 16, 0, 13, 13, 16, 16, 0, - 14, 16, 16, 16, 0, 16, 16, 16, 0, 0, 0, 0, - 0, 0, 0, 8, 10, 13, 15, 16, 10, 11, 13, 16, - 16, 13, 13, 14, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 0, 8, 10, 11, 15, 16, 9, 10, 12, - 16, 16, 12, 12, 15, 16, 16, 16, 14, 16, 16, 16, - 16, 16, 16, 16, 0, 9, 11, 14, 16, 16, 10, 11, - 13, 16, 16, 14, 13, 14, 16, 16, 16, 15, 15, 16, - 0, 16, 16, 16, 0, 0, 11, 13, 16, 16, 16, 11, - 13, 15, 16, 16, 13, 16, 16, 16, 0, 16, 16, 16, - 16, 0, 16, 16, 0, 0, 0, 15, 16, 16, 16, 0, - 14, 16, 16, 16, 0, 16, 16, 16, 0, 0, 16, 16, - 0, 0, 0, 0, 0, 0, 0, 0, 9, 13, 16, 16, - 16, 11, 13, 16, 16, 16, 14, 15, 16, 16, 0, 15, - 16, 16, 16, 0, 16, 16, 0, 0, 0, 9, 13, 15, - 15, 16, 12, 13, 14, 16, 16, 16, 15, 16, 16, 0, - 16, 16, 16, 16, 0, 16, 16, 0, 0, 0, 11, 13, - 15, 16, 0, 12, 14, 16, 16, 0, 16, 16, 16, 16, - 0, 16, 16, 16, 0, 0, 0, 0, 0, 0, 0, 16, - 16, 16, 16, 0, 16, 16, 16, 16, 0, 16, 16, 16, - 0, 0, 16, 16, 0, 0, 0, 0, 0, 0, 0, 0, - 16, 16, 0, 0, 0, 16, 16 -]; -const COOK_VQ3_CODES: &[u16; 607] = &[ - 0x0000, 0x0004, 0x0022, 0x00c6, 0x03b0, 0x000c, 0x000d, 0x0023, 0x00c7, 0x03b1, 0x005c, 0x00c8, - 0x00c9, 0x03b2, 0x0fa4, 0x01c2, 0x01c3, 0x03b3, 0x0fa5, 0x7f72, 0x03b4, 0x07b2, 0x1f9a, 0xff24, - 0xff25, 0x000e, 0x0024, 0x00ca, 0x03b5, 0x07b3, 0x000f, 0x0025, 0x00cb, 0x03b6, 0x0fa6, 0x005d, - 0x005e, 0x00cc, 0x03b7, 0x1f9b, 0x01c4, 0x01c5, 0x03b8, 0x0fa7, 0x7f73, 0x0fa8, 0x07b4, 0x1f9c, - 0xff26, 0xff27, 0x005f, 0x01c6, 0x03b9, 0x0fa9, 0x7f74, 0x0060, 0x00cd, 0x03ba, 0x0faa, 0x1f9d, - 0x01c7, 0x01c8, 0x07b5, 0x1f9e, 0xff28, 0x07b6, 0x07b7, 0x0fab, 0x3fa2, 0xff29, 0x0fac, 0x0fad, - 0x3fa3, 0xff2a, 0x3fa2, 0x01c9, 0x07b8, 0x0fae, 0xff2b, 0xff2c, 0x01ca, 0x03bb, 0x1f9f, 0x7f75, - 0xff2d, 0x03bc, 0x07b9, 0x0faf, 0xff2e, 0xff2f, 0x1fa0, 0x1fa1, 0xff30, 0xff31, 0xff32, 0xff33, - 0xff34, 0x7f76, 0xff35, 0xff31, 0x07ba, 0x1fa2, 0xff36, 0xff37, 0x7f77, 0x07bb, 0x1fa3, 0x7f78, - 0xff38, 0xff39, 0x1fa4, 0x1fa5, 0xff3a, 0xff3b, 0xff2e, 0x3fa4, 0xff3c, 0xff3d, 0xff3e, 0xff31, - 0xff3f, 0xff40, 0xff30, 0xff31, 0xff31, 0x0005, 0x0026, 0x00ce, 0x03bd, 0x1fa6, 0x0027, 0x0028, - 0x00cf, 0x03be, 0x1fa7, 0x01cb, 0x00d0, 0x03bf, 0x0fb0, 0xff41, 0x03c0, 0x03c1, 0x07bc, 0x7f79, - 0xff42, 0x1fa8, 0x0fb1, 0x3fa5, 0xff43, 0xff44, 0x0010, 0x0029, 0x00d1, 0x07bd, 0x1fa9, 0x002a, - 0x002b, 0x00d2, 0x03c2, 0x1faa, 0x00d3, 0x00d4, 0x01cc, 0x07be, 0x3fa6, 0x03c3, 0x03c4, 0x0fb2, - 0x0fb3, 0xff45, 0x1fab, 0x0fb4, 0x1fac, 0x7f7a, 0xff46, 0x0061, 0x00d5, 0x01cd, 0x0fb5, 0xff47, - 0x0062, 0x00d6, 0x03c5, 0x0fb6, 0x3fa7, 0x01ce, 0x01cf, 0x03c6, 0x1fad, 0xff48, 0x07bf, 0x03c7, - 0x0fb7, 0x7f7b, 0xff49, 0x1fae, 0x1faf, 0xff4a, 0xff4b, 0x7f7b, 0x01d0, 0x07c0, 0x1fb0, 0xff4c, - 0xff4d, 0x01d1, 0x03c8, 0x0fb8, 0x7f7c, 0xff4e, 0x03c9, 0x07c1, 0x1fb1, 0xff4f, 0xff50, 0x1fb2, - 0x0fb9, 0xff51, 0xff52, 0xff53, 0xff54, 0xff55, 0xff56, 0xff57, 0xff52, 0x07c2, 0x1fb3, 0xff58, - 0xff59, 0xff5a, 0x07c3, 0x1fb4, 0xff5b, 0xff5c, 0xff5d, 0x0fba, 0x1fb5, 0x7f7d, 0xff5e, 0xff4f, - 0xff5f, 0xff60, 0xff61, 0xff62, 0xff52, 0xff63, 0xff64, 0xff51, 0xff52, 0xff52, 0x002c, 0x00d7, - 0x07c4, 0x1fb6, 0xff65, 0x00d8, 0x00d9, 0x03ca, 0x0fbb, 0xff66, 0x07c5, 0x03cb, 0x07c6, 0x1fb7, - 0xff67, 0x0fbc, 0x1fb8, 0x1fb9, 0x7f7e, 0xff68, 0xff69, 0xff6a, 0x3fa8, 0xff6b, 0x7f7e, 0x002d, - 0x00da, 0x03cc, 0x1fba, 0xff6c, 0x00db, 0x00dc, 0x03cd, 0x0fbd, 0xff6d, 0x03ce, 0x03cf, 0x07c7, - 0x1fbb, 0xff6e, 0x1fbc, 0x0fbe, 0x1fbd, 0xff6f, 0xff70, 0x3fa9, 0x3faa, 0x3fab, 0xff71, 0xff6f, - 0x00dd, 0x01d2, 0x07c8, 0x1fbe, 0xff72, 0x00de, 0x01d3, 0x07c9, 0xff73, 0x3fac, 0x03d0, 0x03d1, - 0x0fbf, 0x7f7f, 0xff74, 0x0fc0, 0x0fc1, 0x1fbf, 0xff75, 0xff76, 0x7f80, 0xff77, 0xff78, 0xff79, - 0xff75, 0x03d2, 0x0fc2, 0x7f81, 0xff7a, 0xff7b, 0x03d3, 0x0fc3, 0x0fc4, 0x3fad, 0xff7c, 0x0fc5, - 0x0fc6, 0x1fc0, 0xff7d, 0xff7e, 0x3fae, 0x7f82, 0xff7f, 0xff80, 0xff80, 0xff81, 0xff82, 0xff83, - 0xff80, 0xff80, 0x0fc7, 0x7f83, 0x7f84, 0xff84, 0xff7a, 0x1fc1, 0x1fc2, 0xff85, 0xff86, 0x3fad, - 0x3faf, 0xff87, 0xff88, 0xff89, 0xff7d, 0xff8a, 0xff8b, 0xff8c, 0xff80, 0xff80, 0x3fae, 0x7f82, - 0xff7f, 0xff80, 0xff80, 0x00df, 0x03d4, 0x1fc3, 0x7f85, 0xff8d, 0x03d5, 0x07ca, 0x1fc4, 0xff8e, - 0xff8f, 0x1fc5, 0x1fc6, 0x3fb0, 0xff90, 0xff91, 0xff92, 0xff93, 0xff94, 0xff95, 0xff96, 0xff97, - 0xff98, 0xff99, 0xff9a, 0xff95, 0x00e0, 0x03d6, 0x07cb, 0x7f86, 0xff9b, 0x01d4, 0x03d7, 0x0fc8, - 0xff9c, 0xff9d, 0x0fc9, 0x0fca, 0x7f87, 0xff9e, 0xff9f, 0xffa0, 0x3fb1, 0xffa1, 0xffa2, 0xffa3, - 0xffa4, 0xffa5, 0xffa6, 0xffa7, 0xffa2, 0x01d5, 0x07cc, 0x3fb2, 0xffa8, 0xffa9, 0x03d8, 0x07cd, - 0x1fc7, 0xffaa, 0xffab, 0x3fb3, 0x1fc8, 0x3fb4, 0xffac, 0xffad, 0xffae, 0x7f88, 0x7f89, 0xffaf, - 0xffaf, 0xffb0, 0xffb1, 0xffb2, 0xffaf, 0xffaf, 0x07ce, 0x1fc9, 0xffb3, 0xffb4, 0xffb5, 0x07cf, - 0x1fca, 0x7f8a, 0xffb6, 0xffb7, 0x1fcb, 0xffb8, 0xffb9, 0xffba, 0xffba, 0xffbb, 0xffbc, 0xffbd, - 0xffbe, 0xffbe, 0xffbf, 0xffc0, 0xffbd, 0xffbe, 0xffbe, 0x7f8b, 0xffc1, 0xffc2, 0xffc3, 0xffb4, - 0x3fb5, 0xffc4, 0xffc5, 0xffc6, 0xffb6, 0xffc7, 0xffc8, 0xffc9, 0xffba, 0xffba, 0xffca, 0xffcb, - 0xffbd, 0xffbe, 0xffbe, 0xffbb, 0xffbc, 0xffbd, 0xffbe, 0xffbe, 0x01d6, 0x1fcc, 0xffcc, 0xffcd, - 0xffce, 0x07d0, 0x1fcd, 0xffcf, 0xffd0, 0xffd1, 0x3fb6, 0x7f8c, 0xffd2, 0xffd3, 0xff90, 0x7f8d, - 0xffd4, 0xffd5, 0xffd6, 0xff95, 0xffd7, 0xffd8, 0xff94, 0xff95, 0xff95, 0x01d7, 0x1fce, 0x7f8e, - 0x7f8f, 0xffd9, 0x0fcb, 0x1fcf, 0x3fb7, 0xffda, 0xffdb, 0xffdc, 0x7f90, 0xffdd, 0xffde, 0xff9e, - 0xffdf, 0xffe0, 0xffe1, 0xffe2, 0xffa2, 0xffe3, 0xffe4, 0xffa1, 0xffa2, 0xffa2, 0x07d1, 0x1fd0, - 0x7f91, 0xffe5, 0xffa8, 0x0fcc, 0x3fb8, 0xffe6, 0xffe7, 0xffaa, 0xffe8, 0xffe9, 0xffea, 0xffeb, - 0xffac, 0xffec, 0xffed, 0xffee, 0xffaf, 0xffaf, 0xffae, 0x7f88, 0x7f89, 0xffaf, 0xffaf, 0xffef, - 0xfff0, 0xfff1, 0xfff2, 0xffb4, 0xfff3, 0xfff4, 0xfff5, 0xfff6, 0xffb6, 0xfff7, 0xfff8, 0xfff9, - 0xffba, 0xffba, 0xfffa, 0xfffb, 0xffbd, 0xffbe, 0xffbe, 0xffbb, 0xffbc, 0xffbd, 0xffbe, 0xffbe, - 0xfffc, 0xfffd, 0xffb3, 0xffb4, 0xffb4, 0xfffe, 0xffff -]; -const COOK_VQ4_BITS: &[u8; 246] = &[ - 2, 4, 7, 10, 4, 5, 7, 10, 7, 8, 10, 14, - 11, 11, 15, 15, 4, 5, 9, 12, 5, 5, 8, 12, - 8, 7, 10, 15, 11, 11, 15, 15, 7, 9, 12, 15, - 8, 8, 12, 15, 10, 10, 13, 15, 14, 14, 15, 0, - 11, 13, 15, 15, 11, 13, 15, 15, 14, 15, 15, 0, - 15, 15, 0, 0, 4, 5, 9, 13, 5, 6, 9, 13, - 9, 9, 11, 15, 14, 13, 15, 15, 4, 6, 9, 12, - 5, 6, 9, 13, 9, 8, 11, 15, 13, 12, 15, 15, - 7, 9, 12, 15, 7, 8, 11, 15, 10, 10, 14, 15, - 14, 15, 15, 0, 10, 12, 15, 15, 11, 13, 15, 15, - 15, 15, 15, 0, 15, 15, 0, 0, 6, 9, 13, 14, - 8, 9, 12, 15, 12, 12, 15, 15, 15, 15, 15, 0, - 7, 9, 13, 15, 8, 9, 12, 15, 11, 12, 15, 15, - 15, 15, 15, 0, 9, 11, 15, 15, 9, 11, 15, 15, - 14, 14, 15, 0, 15, 15, 0, 0, 14, 15, 15, 0, - 14, 15, 15, 0, 15, 15, 0, 0, 0, 0, 0, 0, - 9, 12, 15, 15, 12, 13, 15, 15, 15, 15, 15, 0, - 15, 15, 0, 0, 10, 12, 15, 15, 12, 14, 15, 15, - 15, 15, 15, 0, 15, 15, 0, 0, 14, 15, 15, 0, - 15, 15, 15, 0, 15, 15, 0, 0, 0, 0, 0, 0, - 15, 15, 0, 0, 15, 15 -]; -const COOK_VQ4_CODES: &[u16; 246] = &[ - 0x0000, 0x0004, 0x006c, 0x03e6, 0x0005, 0x0012, 0x006d, 0x03e7, 0x006e, 0x00e8, 0x03e8, 0x3fc4, - 0x07e0, 0x07e1, 0x7fa4, 0x7fa5, 0x0006, 0x0013, 0x01e2, 0x0fda, 0x0014, 0x0015, 0x00e9, 0x0fdb, - 0x00ea, 0x006f, 0x03e9, 0x7fa6, 0x07e2, 0x07e3, 0x7fa7, 0x7fa8, 0x0070, 0x01e3, 0x0fdc, 0x7fa9, - 0x00eb, 0x00ec, 0x0fdd, 0x7faa, 0x03ea, 0x03eb, 0x1fd6, 0x7fab, 0x3fc5, 0x3fc6, 0x7fac, 0x1fd6, - 0x07e4, 0x1fd7, 0x7fad, 0x7fae, 0x07e5, 0x1fd8, 0x7faf, 0x7fb0, 0x3fc7, 0x7fb1, 0x7fb2, 0x1fd6, - 0x7fb3, 0x7fb4, 0x1fd6, 0x1fd6, 0x0007, 0x0016, 0x01e4, 0x1fd9, 0x0017, 0x0032, 0x01e5, 0x1fda, - 0x01e6, 0x01e7, 0x07e6, 0x7fb5, 0x3fc8, 0x1fdb, 0x7fb6, 0x7fb7, 0x0008, 0x0033, 0x01e8, 0x0fde, - 0x0018, 0x0034, 0x01e9, 0x1fdc, 0x01ea, 0x00ed, 0x07e7, 0x7fb8, 0x1fdd, 0x0fdf, 0x7fb9, 0x7fba, - 0x0071, 0x01eb, 0x0fe0, 0x7fbb, 0x0072, 0x00ee, 0x07e8, 0x7fbc, 0x03ec, 0x03ed, 0x3fc9, 0x7fbd, - 0x3fca, 0x7fbe, 0x7fbf, 0x3fc9, 0x03ee, 0x0fe1, 0x7fc0, 0x7fc1, 0x07e9, 0x1fde, 0x7fc2, 0x7fc3, - 0x7fc4, 0x7fc5, 0x7fc6, 0x3fc9, 0x7fc7, 0x7fc8, 0x3fc9, 0x3fc9, 0x0035, 0x01ec, 0x1fdf, 0x3fcb, - 0x00ef, 0x01ed, 0x0fe2, 0x7fc9, 0x0fe3, 0x0fe4, 0x7fca, 0x7fcb, 0x7fcc, 0x7fcd, 0x7fce, 0x7fca, - 0x0073, 0x01ee, 0x1fe0, 0x7fcf, 0x00f0, 0x01ef, 0x0fe5, 0x7fd0, 0x07ea, 0x0fe6, 0x7fd1, 0x7fd2, - 0x7fd3, 0x7fd4, 0x7fd5, 0x7fd1, 0x01f0, 0x07eb, 0x7fd6, 0x7fd7, 0x01f1, 0x07ec, 0x7fd8, 0x7fd9, - 0x3fcc, 0x3fcd, 0x7fda, 0x7fda, 0x7fdb, 0x7fdc, 0x7fda, 0x7fda, 0x3fce, 0x7fdd, 0x7fde, 0x7fd6, - 0x3fcf, 0x7fdf, 0x7fe0, 0x7fd8, 0x7fe1, 0x7fe2, 0x7fda, 0x7fda, 0x3fcc, 0x3fcd, 0x7fda, 0x7fda, - 0x01f2, 0x0fe7, 0x7fe3, 0x7fe4, 0x0fe8, 0x1fe1, 0x7fe5, 0x7fe6, 0x7fe7, 0x7fe8, 0x7fe9, 0x7fca, - 0x7fea, 0x7feb, 0x7fca, 0x7fca, 0x03ef, 0x0fe9, 0x7fec, 0x7fed, 0x0fea, 0x3fd0, 0x7fee, 0x7fef, - 0x7ff0, 0x7ff1, 0x7ff2, 0x7fd1, 0x7ff3, 0x7ff4, 0x7fd1, 0x7fd1, 0x3fd1, 0x7ff5, 0x7ff6, 0x7fd6, - 0x7ff7, 0x7ff8, 0x7ff9, 0x7fd8, 0x7ffa, 0x7ffb, 0x7fda, 0x7fda, 0x3fcc, 0x3fcd, 0x7fda, 0x7fda, - 0x7ffc, 0x7ffd, 0x7fd6, 0x7fd6, 0x7ffe, 0x7fff -]; -const COOK_VQ5_BITS: &[u8; 230] = &[ - 2, 4, 8, 4, 5, 9, 9, 10, 14, 4, 6, 11, - 5, 6, 12, 10, 11, 15, 9, 11, 15, 10, 13, 15, - 14, 15, 0, 4, 6, 12, 6, 7, 12, 12, 12, 15, - 5, 7, 13, 6, 7, 13, 12, 13, 15, 10, 12, 15, - 11, 13, 15, 15, 15, 0, 8, 13, 15, 11, 12, 15, - 15, 15, 0, 10, 13, 15, 12, 15, 15, 15, 15, 0, - 15, 15, 0, 15, 15, 0, 0, 0, 0, 4, 5, 11, - 5, 7, 12, 11, 12, 15, 6, 7, 13, 7, 8, 14, - 12, 14, 15, 11, 13, 15, 12, 13, 15, 15, 15, 0, - 5, 6, 13, 7, 8, 15, 12, 14, 15, 6, 8, 14, - 7, 8, 15, 14, 15, 15, 12, 12, 15, 12, 13, 15, - 15, 15, 0, 9, 13, 15, 12, 13, 15, 15, 15, 0, - 11, 13, 15, 13, 13, 15, 15, 15, 0, 14, 15, 0, - 15, 15, 0, 0, 0, 0, 8, 10, 15, 11, 12, 15, - 15, 15, 0, 10, 12, 15, 12, 13, 15, 15, 15, 0, - 14, 15, 0, 15, 15, 0, 0, 0, 0, 8, 12, 15, - 12, 13, 15, 15, 15, 0, 11, 13, 15, 13, 15, 15, - 15, 15, 0, 15, 15, 0, 15, 15, 0, 0, 0, 0, - 14, 15, 0, 15, 15, 0, 0, 0, 0, 15, 15, 0, - 15, 15 -]; -const COOK_VQ5_CODES: &[u16; 230] = &[ - 0x0000, 0x0004, 0x00f0, 0x0005, 0x0012, 0x01f0, 0x01f1, 0x03e8, 0x3fce, 0x0006, 0x0030, 0x07de, - 0x0013, 0x0031, 0x0fd2, 0x03e9, 0x07df, 0x7fb0, 0x01f2, 0x07e0, 0x7fb1, 0x03ea, 0x1fd2, 0x7fb2, - 0x3fcf, 0x7fb3, 0x0031, 0x0007, 0x0032, 0x0fd3, 0x0033, 0x0070, 0x0fd4, 0x0fd5, 0x0fd6, 0x7fb4, - 0x0014, 0x0071, 0x1fd3, 0x0034, 0x0072, 0x1fd4, 0x0fd7, 0x1fd5, 0x7fb5, 0x03eb, 0x0fd8, 0x7fb6, - 0x07e1, 0x1fd6, 0x7fb7, 0x7fb8, 0x7fb9, 0x0072, 0x00f1, 0x1fd7, 0x7fba, 0x07e2, 0x0fd9, 0x7fbb, - 0x7fbc, 0x7fbd, 0x0070, 0x03ec, 0x1fd8, 0x7fbe, 0x0fda, 0x7fbf, 0x7fc0, 0x7fc1, 0x7fc2, 0x0072, - 0x7fc3, 0x7fc4, 0x0071, 0x7fc5, 0x7fc6, 0x0072, 0x0034, 0x0072, 0x0072, 0x0008, 0x0015, 0x07e3, - 0x0016, 0x0073, 0x0fdb, 0x07e4, 0x0fdc, 0x7fc7, 0x0035, 0x0074, 0x1fd9, 0x0075, 0x00f2, 0x3fd0, - 0x0fdd, 0x3fd1, 0x7fc8, 0x07e5, 0x1fda, 0x7fc9, 0x0fde, 0x1fdb, 0x7fca, 0x7fcb, 0x7fcc, 0x00f2, - 0x0017, 0x0036, 0x1fdc, 0x0076, 0x00f3, 0x7fcd, 0x0fdf, 0x3fd2, 0x7fce, 0x0037, 0x00f4, 0x3fd3, - 0x0077, 0x00f5, 0x7fcf, 0x3fd4, 0x7fd0, 0x7fd1, 0x0fe0, 0x0fe1, 0x7fd2, 0x0fe2, 0x1fdd, 0x7fd3, - 0x7fd4, 0x7fd5, 0x00f5, 0x01f3, 0x1fde, 0x7fd6, 0x0fe3, 0x1fdf, 0x7fd7, 0x7fd8, 0x7fd9, 0x00f3, - 0x07e6, 0x1fe0, 0x7fda, 0x1fe1, 0x1fe2, 0x7fdb, 0x7fdc, 0x7fdd, 0x00f5, 0x3fd5, 0x7fde, 0x00f4, - 0x7fdf, 0x7fe0, 0x00f5, 0x0077, 0x00f5, 0x00f5, 0x00f6, 0x03ed, 0x7fe1, 0x07e7, 0x0fe4, 0x7fe2, - 0x7fe3, 0x7fe4, 0x0073, 0x03ee, 0x0fe5, 0x7fe5, 0x0fe6, 0x1fe3, 0x7fe6, 0x7fe7, 0x7fe8, 0x00f2, - 0x3fd6, 0x7fe9, 0x0074, 0x7fea, 0x7feb, 0x00f2, 0x0075, 0x00f2, 0x00f2, 0x00f7, 0x0fe7, 0x7fec, - 0x0fe8, 0x1fe4, 0x7fed, 0x7fee, 0x7fef, 0x00f3, 0x07e8, 0x1fe5, 0x7ff0, 0x1fe6, 0x7ff1, 0x7ff2, - 0x7ff3, 0x7ff4, 0x00f5, 0x7ff5, 0x7ff6, 0x00f4, 0x7ff7, 0x7ff8, 0x00f5, 0x0077, 0x00f5, 0x00f5, - 0x3fd7, 0x7ff9, 0x0036, 0x7ffa, 0x7ffb, 0x00f3, 0x0076, 0x00f3, 0x00f3, 0x7ffc, 0x7ffd, 0x0000, - 0x7ffe, 0x7fff -]; -const COOK_VQ6_BITS: &[u8; 32] = &[ - 1, 4, 4, 6, 4, 6, 6, 8, 4, 6, 6, 8, - 6, 9, 8, 10, 4, 6, 7, 8, 6, 9, 8, 11, - 6, 9, 8, 10, 8, 10, 9, 11 -]; -const COOK_VQ6_CODES: &[u16; 32] = &[ - 0x0000, 0x0008, 0x0009, 0x0034, 0x000a, 0x0035, 0x0036, 0x00f6, - 0x000b, 0x0037, 0x0038, 0x00f7, 0x0039, 0x01fa, 0x00f8, 0x03fc, - 0x000c, 0x003a, 0x007a, 0x00f9, 0x003b, 0x01fb, 0x00fa, 0x07fe, - 0x003c, 0x01fc, 0x00fb, 0x03fd, 0x00fc, 0x03fe, 0x01fd, 0x07ff -]; - -const COOK_CPL_SCALE2: &[f32; 5] = &[ - 1.0, 0.953020632266998, 0.70710676908493, 0.302905440330505, 0.0 -]; -const COOK_CPL_SCALE3: &[f32; 9] = &[ - 1.0, 0.981279790401459, 0.936997592449188, 0.875934481620789, 0.70710676908493, - 0.482430040836334, 0.349335819482803, 0.192587479948997, 0.0 -]; -const COOK_CPL_SCALE4: &[f32; 17] = &[ - 1.0, 0.991486728191376, 0.973249018192291, 0.953020632266998, 0.930133521556854, - 0.903453230857849, 0.870746195316315, 0.826180458068848, 0.70710676908493, - 0.563405573368073, 0.491732746362686, 0.428686618804932, 0.367221474647522, - 0.302905440330505, 0.229752898216248, 0.130207896232605, 0.0 -]; -const COOK_CPL_SCALE5: &[f32; 33] = &[ - 1.0, 0.995926380157471, 0.987517595291138, 0.978726446628571, 0.969505727291107, - 0.95979779958725, 0.949531257152557, 0.938616216182709, 0.926936149597168, - 0.914336204528809, 0.900602877140045, 0.885426938533783, 0.868331849575043, - 0.84851086139679, 0.824381768703461, 0.791833400726318, 0.70710676908493, - 0.610737144947052, 0.566034197807312, 0.529177963733673, 0.495983630418777, - 0.464778542518616, 0.434642940759659, 0.404955863952637, 0.375219136476517, - 0.344963222742081, 0.313672333955765, 0.280692428350449, 0.245068684220314, - 0.205169528722763, 0.157508864998817, 0.0901700109243393, 0.0 -]; -const COOK_CPL_SCALE6: &[f32; 65] = &[ - 1.0, 0.998005926609039, 0.993956744670868, 0.989822506904602, 0.985598564147949, - 0.981279790401459, 0.976860702037811, 0.972335040569305, 0.967696130275726, - 0.962936460971832, 0.958047747612000, 0.953020632266998, 0.947844684123993, - 0.942508161067963, 0.936997592449188, 0.931297719478607, 0.925390899181366, - 0.919256627559662, 0.912870943546295, 0.906205296516418, 0.899225592613220, - 0.891890347003937, 0.884148240089417, 0.875934481620789, 0.867165684700012, - 0.857730865478516, 0.847477376461029, 0.836184680461884, 0.823513329029083, - 0.808890223503113, 0.791194140911102, 0.767520070075989, 0.707106769084930, - 0.641024887561798, 0.611565053462982, 0.587959706783295, 0.567296981811523, - 0.548448026180267, 0.530831515789032, 0.514098942279816, 0.498019754886627, - 0.482430040836334, 0.467206478118896, 0.452251672744751, 0.437485188245773, - 0.422837972640991, 0.408248275518417, 0.393658757209778, 0.379014074802399, - 0.364258885383606, 0.349335819482803, 0.334183186292648, 0.318732559680939, - 0.302905440330505, 0.286608695983887, 0.269728302955627, 0.252119421958923, - 0.233590632677078, 0.213876649737358, 0.192587479948997, 0.169101938605309, - 0.142307326197624, 0.109772264957428, 0.0631198287010193, 0.0 -]; -const COOK_CPL_SCALES: [&[f32]; 5] = [ - COOK_CPL_SCALE2, COOK_CPL_SCALE3, COOK_CPL_SCALE4, COOK_CPL_SCALE5, COOK_CPL_SCALE6 -]; - -const COOK_CPL_BAND: [u8; MAX_SUBBANDS - 1] = [ - 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 11, 12, 12, 13, - 13, 14, 14, 14, 15, 15, 15, 15, 16, 16, 16, 16, 16, 17, 17, 17, - 17, 17, 17, 18, 18, 18, 18, 18, 18, 18, 19, 19, 19, 19, 19, 19, - 19, 19, 19 -]; - -const COOK_DITHER_TAB: [f32; 9] = [ 0.0, 0.0, 0.0, 0.0, 0.0, 0.176777, 0.25, 0.707107, 1.0 ]; - -const COOK_QUANT_CENTROID: [[f32; 14]; 7] = [ - [ 0.000, 0.392, 0.761, 1.120, 1.477, 1.832, 2.183, 2.541, 2.893, 3.245, 3.598, 3.942, 4.288, 4.724 ], - [ 0.000, 0.544, 1.060, 1.563, 2.068, 2.571, 3.072, 3.562, 4.070, 4.620, 0.000, 0.000, 0.000, 0.000 ], - [ 0.000, 0.746, 1.464, 2.180, 2.882, 3.584, 4.316, 0.000, 0.000, 0.000, 0.000, 0.000, 0.000, 0.000 ], - [ 0.000, 1.006, 2.000, 2.993, 3.985, 0.000, 0.000, 0.000, 0.000, 0.000, 0.000, 0.000, 0.000, 0.000 ], - [ 0.000, 1.321, 2.703, 3.983, 0.000, 0.000, 0.000, 0.000, 0.000, 0.000, 0.000, 0.000, 0.000, 0.000 ], - [ 0.000, 1.657, 3.491, 0.000, 0.000, 0.000, 0.000, 0.000, 0.000, 0.000, 0.000, 0.000, 0.000, 0.000 ], - [ 0.000, 1.964, 0.000, 0.000, 0.000, 0.000, 0.000, 0.000, 0.000, 0.000, 0.000, 0.000, 0.000, 0.000 ] -]; - -const COOK_EXP_BITS: [i32; NUM_CATEGORIES] = [ 52, 47, 43, 37, 29, 22, 16, 0 ]; diff --git a/src/codecs/real/mod.rs b/src/codecs/real/mod.rs deleted file mode 100644 index 244b901..0000000 --- a/src/codecs/real/mod.rs +++ /dev/null @@ -1,31 +0,0 @@ -#[cfg(any(feature="decoder_realvideo3", feature="decoder_realvideo4"))] -mod rv3040; -#[cfg(any(feature="decoder_realvideo3", feature="decoder_realvideo4"))] -mod rv34codes; -#[cfg(any(feature="decoder_realvideo3", feature="decoder_realvideo4"))] -mod rv34dsp; - -#[cfg(feature="decoder_realvideo3")] -pub mod rv30; -#[cfg(feature="decoder_realvideo3")] -pub mod rv30dsp; -#[cfg(feature="decoder_realvideo4")] -pub mod rv40; -#[cfg(feature="decoder_realvideo4")] -pub mod rv40dsp; -#[cfg(feature="decoder_realvideo6")] -pub mod rv60; -#[cfg(feature="decoder_realvideo6")] -pub mod rv60codes; -#[cfg(feature="decoder_realvideo6")] -pub mod rv60dsp; - -#[cfg(feature="decoder_realaudio144")] -pub mod ra144; -#[cfg(feature="decoder_realaudio288")] -pub mod ra288; -#[cfg(feature="decoder_cook")] -pub mod cook; -#[cfg(feature="decoder_ralf")] -pub mod ralf; - diff --git a/src/codecs/real/ra144.rs b/src/codecs/real/ra144.rs deleted file mode 100644 index 1fdace0..0000000 --- a/src/codecs/real/ra144.rs +++ /dev/null @@ -1,2305 +0,0 @@ -use crate::formats::*; -use crate::frame::*; -use super::super::*; -use crate::io::bitreader::*; - -const NBLOCKS: usize = 4; -const BLOCKSIZE: usize = 40; -const LPC_ORDER: usize = 10; -const BUFFERSIZE: usize = 146; -const FRAME_SIZE: usize = 20; - -struct RA144Decoder { - chmap: NAChannelMap, - ainfo: NAAudioInfo, - info: Rc<NACodecInfo>, - - old_energy: u16, - lpc_data: [[i32; LPC_ORDER]; 2], - frame_no: usize, - lpc_refl_rms: [u32; 2], - audio: [i16; BLOCKSIZE + LPC_ORDER], - adapt_cb: [i16; BUFFERSIZE + 2], -} - -impl RA144Decoder { - fn new() -> Self { - RA144Decoder { - chmap: NAChannelMap::new(), - ainfo: NAAudioInfo::new(0, 1, SND_S16_FORMAT, NBLOCKS * BLOCKSIZE), - info: NACodecInfo::new_dummy(), - - old_energy: 0, - lpc_data: [[0; 10]; 2], - frame_no: 0, - lpc_refl_rms: [0; 2], - audio: [0; BLOCKSIZE + LPC_ORDER], - adapt_cb: [0; BUFFERSIZE + 2], - } - } - - fn evaluate_coeffs(&mut self, lpc_refl: &[i32; LPC_ORDER]) { - let mut tmp: [i32; LPC_ORDER] = [0; LPC_ORDER]; - - for i in 0..LPC_ORDER { - let src; - let dst; - if (i & 1) == 0 { - src = &self.lpc_data[self.frame_no]; - dst = &mut tmp; - } else { - src = &tmp; - dst = &mut self.lpc_data[self.frame_no]; - } - dst[i] = lpc_refl[i] << 4; - - for j in 0..i { - dst[j] = ((lpc_refl[i] * src[i - j - 1]) >> 12) + src[j]; - } - } - for i in 0..LPC_ORDER { - self.lpc_data[self.frame_no][i] >>= 4; - } - } - fn interpolate(&mut self, coeffs: &mut [i16; LPC_ORDER], scale1: i32, copyold: bool, energy: u16) -> u32 { - let scale2 = (NBLOCKS as i32) - scale1; - { - let src1 = &self.lpc_data[self.frame_no]; - let src2 = &self.lpc_data[self.frame_no ^ 1]; - for i in 0..LPC_ORDER { - coeffs[i] = ((scale1 * src1[i] + scale2 * src2[i]) >> 2) as i16; - } - } - if let Some(rms) = eval_reflection(coeffs) { - rescale_rms(rms, energy) - } else { - let src = if copyold { &self.lpc_data[self.frame_no ^ 1] } else { &self.lpc_data[self.frame_no] }; - for i in 0..LPC_ORDER { - coeffs[i] = src[i] as i16; - } - rescale_rms(self.lpc_refl_rms[if copyold { 1 } else { 0 }], energy) - } - } - fn process_subblock(&mut self, br: &mut BitReader, lpc_coeffs: &[i16; LPC_ORDER], rms: u32) -> DecoderResult<()> { - let cba_idx = br.read(7)? as usize; - let gain = br.read(8)? as usize; - let cb1_idx = br.read(7)? as usize; - let cb2_idx = br.read(7)? as usize; - - let mut tmp_a: [i16; BLOCKSIZE] = [0; BLOCKSIZE]; - let mut m: [u32; 3] = [0; 3]; - if cba_idx != 0 { - let len = cba_idx + BLOCKSIZE/2 - 1; - let soff = BUFFERSIZE - len; - for i in 0..len.min(BLOCKSIZE) { - tmp_a[i] = self.adapt_cb[i + soff]; - } - for i in len..BLOCKSIZE { - tmp_a[i] = self.adapt_cb[i + soff - len]; - } - m[0] = (calc_irms(&tmp_a) * rms) >> 12; - } else { - m[0] = 0; - } - m[1] = ((RA144_CODEBOOK1[cb1_idx] as u32) * rms) >> 8; - m[2] = ((RA144_CODEBOOK2[cb2_idx] as u32) * rms) >> 8; - for i in 0..3 { - m[i] = (m[i] * (RA144_GAIN_VAL_TAB[gain][i] as u32)) >> RA144_GAIN_EXP_TAB[gain]; - } - - for i in 0..(BUFFERSIZE - BLOCKSIZE) { - self.adapt_cb[i] = self.adapt_cb[i + BLOCKSIZE]; - } - - let doff = BUFFERSIZE - BLOCKSIZE; - if m[0] != 0 { - for i in 0..BLOCKSIZE { - let sum = (m[0] as i32) * (tmp_a[i] as i32) - + (m[1] as i32) * (RA144_VECTORS1[cb1_idx][i] as i32) - + (m[2] as i32) * (RA144_VECTORS2[cb2_idx][i] as i32); - self.adapt_cb[i + doff] = (sum >> 12) as i16; - } - } else { - for i in 0..BLOCKSIZE { - let sum = (m[1] as i32) * (RA144_VECTORS1[cb1_idx][i] as i32) - + (m[2] as i32) * (RA144_VECTORS2[cb2_idx][i] as i32); - self.adapt_cb[i + doff] = (sum >> 12) as i16; - } - } - - for i in 0..LPC_ORDER { - self.audio[i] = self.audio[i + BLOCKSIZE]; - } - if celp_synth_filter(&mut self.audio, &self.adapt_cb, lpc_coeffs) { - self.audio = [0; BLOCKSIZE + LPC_ORDER]; - } - Ok(()) - } -} - -const CHMAP_MONO: [NAChannelType; 1] = [NAChannelType::C]; - -fn celp_synth_filter(dst: &mut [i16], src: &[i16], filt: &[i16; LPC_ORDER]) -> bool { //1,0,0xfff - for i in 0..BLOCKSIZE { - let mut sum = -0xFFF; - for j in 0..LPC_ORDER { - sum += (filt[j] as i32) * (dst[LPC_ORDER + i - j - 1] as i32); - } - let sum1 = (-sum >> 12) + (src[BUFFERSIZE - BLOCKSIZE + i] as i32); - if ((sum1 >> 16) != 0) && ((sum1 >> 16) != -1) { // overflow - return true; - } - dst[LPC_ORDER + i] = sum1 as i16; - } - false -} - -fn fixp_sqrt(mut val: u32) -> u32 { - let mut shift = 2; - while val >= (1 << 12) { - val >>= 2; - shift += 1; - } - (SQRT_TABLE[val as usize] as u32) << shift -} - -fn calc_rms(coeffs: &[i32; LPC_ORDER]) -> u32 { - let mut res = 1 << 16; - let mut shift = 10; - - for i in 0..LPC_ORDER { - res = ((((1 << 24) - ((coeffs[i] * coeffs[i]) as u32)) >> 12) * res) >> 12; - if res == 0 { return 0; } - while res < (1 << 14) { - res <<= 2; - shift += 1; - } - } - fixp_sqrt(res) >> shift -} - -fn calc_irms(coeffs: &[i16; BLOCKSIZE]) -> u32 { - let mut sum = 0; - for i in 0..BLOCKSIZE { - sum += ((coeffs[i] as i32) * (coeffs[i] as i32)) as u32; - } - if sum != 0 { - (1 << 29) / (fixp_sqrt(sum) >> 8) - } else { - 0 - } -} - -fn rescale_rms(rms: u32, energy: u16) -> u32 { - (rms * (energy as u32)) >> 10 -} - -fn eval_reflection(coeffs: &[i16; LPC_ORDER]) -> Option<u32> { - let mut tmp1: [i32; LPC_ORDER] = [0; LPC_ORDER]; - let mut tmp2: [i32; LPC_ORDER] = [0; LPC_ORDER]; - let mut tmp3: [i32; LPC_ORDER] = [0; LPC_ORDER]; - - for i in 0..LPC_ORDER { - tmp2[i] = coeffs[i] as i32; - } - tmp3[LPC_ORDER - 1] = tmp2[LPC_ORDER - 1]; - - if (tmp2[LPC_ORDER - 1] as u32).wrapping_add(0x1000) > 0x1FFF { - return None; - } - - for i in (0..(LPC_ORDER - 1)).rev() { - let src; - let dst; - if (i & 1) == 0 { - src = &tmp2; - dst = &mut tmp1; - } else { - src = &tmp1; - dst = &mut tmp2; - } - let a = (1 << 12) - ((src[i + 1] * src[i + 1]) >> 12); - let scale = if a != 0 { (1 << 24) / a } else { (1 << 24) }; - for j in 0..(i+1) { - let result = (src[j] - ((tmp3[i + 1] * src[i - j]) >> 12)).checked_mul(scale); - if let Some(val) = result { - dst[j] = val >> 12; - } else { - return None; - } - } - if (dst[i] as u32).wrapping_add(0x1000) > 0x1FFF { - return None; - } - tmp3[i] = dst[i]; - } - - Some(calc_rms(&tmp3)) -} - -fn clip_out(sample: i16) -> i16 { - sample.max(-16384 >> 2).min(16383 >> 2) -} - -impl NADecoder for RA144Decoder { - fn init(&mut self, info: Rc<NACodecInfo>) -> DecoderResult<()> { - if let NACodecTypeInfo::Audio(ainfo) = info.get_properties() { - self.chmap.add_channels(&CHMAP_MONO); - self.ainfo = NAAudioInfo::new(ainfo.get_sample_rate(), - 1, - SND_S16_FORMAT, NBLOCKS * BLOCKSIZE); - self.info = info.replace_info(NACodecTypeInfo::Audio(self.ainfo.clone())); - Ok(()) - } else { - Err(DecoderError::InvalidData) - } - } - fn decode(&mut self, pkt: &NAPacket) -> DecoderResult<NAFrameRef> { - let info = pkt.get_stream().get_info(); - validate!(info.get_properties().is_audio()); - let pktbuf = pkt.get_buffer(); - let nframes = pktbuf.len() / FRAME_SIZE; - - let duration = NBLOCKS * BLOCKSIZE * nframes; - - let mut abuf = alloc_audio_buffer(self.ainfo, duration, self.chmap.clone())?; - let mut adata = abuf.get_abuf_i16().unwrap(); - let mut dst = adata.get_data_mut(); - - for (input, output) in pktbuf.chunks(FRAME_SIZE).zip(dst.chunks_mut(NBLOCKS * BLOCKSIZE)) { - let mut br = BitReader::new(input, input.len(), BitReaderMode::BE); - - let mut lpc_refl: [i32; LPC_ORDER] = [0; LPC_ORDER]; - for i in 0..LPC_ORDER { - lpc_refl[i] = RA144_LPC_REFL_CODEBOOK[i][br.read(RA144_LPC_SIZES[i])? as usize] as i32; - } - - self.evaluate_coeffs(&lpc_refl); - self.lpc_refl_rms[0] = calc_rms(&lpc_refl); - - let energy = RA144_ENERGY_TAB[br.read(5)? as usize]; - - let mut block_coeffs: [[i16; LPC_ORDER]; NBLOCKS] = [[0; LPC_ORDER]; NBLOCKS]; - let mut refl_rms: [u32; NBLOCKS] = [0; NBLOCKS]; - - let old_energy = self.old_energy; - let interp_energy = (fixp_sqrt((energy as u32) * (old_energy as u32)) >> 12) as u16; - refl_rms[0] = self.interpolate(&mut block_coeffs[0], 1, true, old_energy); - refl_rms[1] = self.interpolate(&mut block_coeffs[1], 2, energy <= old_energy, interp_energy); - refl_rms[2] = self.interpolate(&mut block_coeffs[2], 3, false, energy); - refl_rms[3] = rescale_rms(self.lpc_refl_rms[0], energy); - for i in 0..LPC_ORDER { block_coeffs[3][i] = self.lpc_data[self.frame_no][i] as i16; } - - for (i, block) in output.chunks_mut(BLOCKSIZE).enumerate() { - - self.process_subblock(&mut br, &block_coeffs[i], refl_rms[i])?; - for j in 0..BLOCKSIZE { - block[j] = clip_out(self.audio[j + LPC_ORDER]) << 2; - } - } - - self.old_energy = energy; - self.lpc_refl_rms[1] = self.lpc_refl_rms[0]; - self.frame_no ^= 1; - } - - let mut frm = NAFrame::new_from_pkt(pkt, self.info.clone(), abuf); - frm.set_keyframe(true); - Ok(Rc::new(RefCell::new(frm))) - } -} - -pub fn get_decoder() -> Box<NADecoder> { - Box::new(RA144Decoder::new()) -} - -#[cfg(test)] -mod test { - use crate::test::dec_video::*; - #[test] - fn test_ra144() { - let file = "assets/RV/ra3_in_rm_file.rm"; - test_decode_audio("realmedia", file, Some(5000), "ra14.4"); - } -} - -const RA144_LPC_SIZES: [u8; LPC_ORDER] = [ 6, 5, 5, 4, 4, 3, 3, 3, 3, 2 ]; -const RA144_LPC_REFL_CODEBOOK: [&[i16]; LPC_ORDER] = [ - LPC_REFL_CB0, LPC_REFL_CB1, LPC_REFL_CB2, LPC_REFL_CB3, LPC_REFL_CB4, - LPC_REFL_CB5, LPC_REFL_CB6, LPC_REFL_CB7, LPC_REFL_CB8, LPC_REFL_CB9, -]; -const LPC_REFL_CB0: &[i16; 64] = &[ - -4041, -4018, -3998, -3977, -3954, -3930, -3906, -3879, - -3852, -3825, -3795, -3764, -3731, -3699, -3666, -3631, - -3594, -3555, -3513, -3468, -3420, -3372, -3321, -3268, - -3212, -3153, -3090, -3021, -2944, -2863, -2772, -2676, - -2565, -2445, -2328, -2202, -2072, -1941, -1808, -1660, - -1508, -1348, -1185, -994, -798, -600, -374, -110, - 152, 447, 720, 982, 1229, 1456, 1682, 1916, - 2130, 2353, 2595, 2853, 3118, 3363, 3588, 3814 -]; -const LPC_REFL_CB1: &[i16; 32] = &[ - -3091, -2386, -1871, -1425, -1021, -649, -316, -20, - 267, 544, 810, 1065, 1305, 1534, 1756, 1970, - 2171, 2359, 2536, 2700, 2854, 2996, 3133, 3263, - 3386, 3499, 3603, 3701, 3789, 3870, 3947, 4020 -]; -const LPC_REFL_CB2: &[i16; 32] = &[ - -3525, -3295, -3081, -2890, -2696, -2511, -2328, -2149, - -1979, -1817, -1658, -1498, -1341, -1188, -1032, -876, - -721, -561, -394, -228, -54, 119, 296, 484, - 683, 895, 1123, 1373, 1651, 1965, 2360, 2854 -]; -const LPC_REFL_CB3: &[i16; 16] = &[ - -1845, -1057, -522, -77, 301, 647, 975, 1285, - 1582, 1873, 2163, 2452, 2735, 3017, 3299, 3569 -]; -const LPC_REFL_CB4: &[i16; 16] = &[ - -2691, -2187, -1788, -1435, -1118, -837, -571, -316, - -59, 201, 470, 759, 1077, 1457, 1908, 2495 -]; -const LPC_REFL_CB5: &[i16; 8] = &[ - -1372, -474, 133, 632, 1100, 1571, 2075, 2672 -]; -const LPC_REFL_CB6: &[i16; 8] = &[ - -2389, -1787, -1231, -717, -239, 234, 770, 1474 -]; -const LPC_REFL_CB7: &[i16; 8] = &[ - -1569, -864, -296, 200, 670, 1151, 1709, 2385 -]; -const LPC_REFL_CB8: &[i16; 8] = &[ - -2200, -1608, -1062, -569, -120, 338, 863, 1621 -]; -const LPC_REFL_CB9: &[i16; 4] = &[ - -617, 190, 802, 1483 -]; - -const RA144_ENERGY_TAB: [u16; 32] = [ - 0, 16, 20, 25, 32, 41, 51, 65, - 81, 103, 129, 163, 205, 259, 326, 410, - 516, 650, 819, 1031, 1298, 1634, 2057, 2590, - 3261, 4105, 5168, 6507, 8192, 10313, 12983, 16345 -]; - -const SQRT_TABLE: [u16; 4096] = [ -0x0000,0x0400,0x05a8,0x06ed,0x0800,0x08f1,0x09cc,0x0a95, -0x0b50,0x0c00,0x0ca6,0x0d44,0x0ddb,0x0e6c,0x0ef7,0x0f7d, -0x1000,0x107e,0x10f8,0x116f,0x11e3,0x1254,0x12c2,0x132e, -0x1398,0x1400,0x1465,0x14c8,0x152a,0x158a,0x15e8,0x1645, -0x16a0,0x16fa,0x1752,0x17aa,0x1800,0x1854,0x18a8,0x18fa, -0x194c,0x199c,0x19ec,0x1a3a,0x1a88,0x1ad5,0x1b21,0x1b6c, -0x1bb6,0x1c00,0x1c48,0x1c90,0x1cd8,0x1d1e,0x1d64,0x1daa, -0x1dee,0x1e33,0x1e76,0x1eb9,0x1efb,0x1f3d,0x1f7e,0x1fbf, -0x2000,0x203f,0x207f,0x20bd,0x20fc,0x2139,0x2177,0x21b4, -0x21f0,0x222d,0x2268,0x22a4,0x22df,0x2319,0x2353,0x238d, -0x23c6,0x2400,0x2438,0x2471,0x24a9,0x24e0,0x2518,0x254f, -0x2585,0x25bc,0x25f2,0x2628,0x265d,0x2693,0x26c8,0x26fc, -0x2731,0x2765,0x2799,0x27cc,0x2800,0x2833,0x2865,0x2898, -0x28ca,0x28fc,0x292e,0x2960,0x2991,0x29c2,0x29f3,0x2a24, -0x2a54,0x2a85,0x2ab5,0x2ae5,0x2b14,0x2b44,0x2b73,0x2ba2, -0x2bd1,0x2c00,0x2c2e,0x2c5c,0x2c8a,0x2cb8,0x2ce6,0x2d13, -0x2d41,0x2d6e,0x2d9b,0x2dc8,0x2df4,0x2e21,0x2e4d,0x2e79, -0x2ea5,0x2ed1,0x2efd,0x2f28,0x2f54,0x2f7f,0x2faa,0x2fd5, -0x3000,0x302a,0x3055,0x307f,0x30a9,0x30d3,0x30fd,0x3127, -0x3150,0x317a,0x31a3,0x31cc,0x31f5,0x321e,0x3247,0x3270, -0x3298,0x32c1,0x32e9,0x3311,0x3339,0x3361,0x3389,0x33b0, -0x33d8,0x3400,0x3427,0x344e,0x3475,0x349c,0x34c3,0x34ea, -0x3510,0x3537,0x355d,0x3584,0x35aa,0x35d0,0x35f6,0x361c, -0x3642,0x3667,0x368d,0x36b2,0x36d8,0x36fd,0x3722,0x3747, -0x376c,0x3791,0x37b6,0x37db,0x3800,0x3824,0x3848,0x386d, -0x3891,0x38b5,0x38d9,0x38fd,0x3921,0x3945,0x3969,0x398c, -0x39b0,0x39d3,0x39f7,0x3a1a,0x3a3d,0x3a60,0x3a83,0x3aa6, -0x3ac9,0x3aec,0x3b0f,0x3b31,0x3b54,0x3b76,0x3b99,0x3bbb, -0x3bdd,0x3c00,0x3c22,0x3c44,0x3c66,0x3c87,0x3ca9,0x3ccb, -0x3ced,0x3d0e,0x3d30,0x3d51,0x3d72,0x3d94,0x3db5,0x3dd6, -0x3df7,0x3e18,0x3e39,0x3e5a,0x3e7b,0x3e9c,0x3ebc,0x3edd, -0x3efd,0x3f1e,0x3f3e,0x3f5f,0x3f7f,0x3f9f,0x3fbf,0x3fdf, -0x4000,0x401f,0x403f,0x405f,0x407f,0x409f,0x40be,0x40de, -0x40fe,0x411d,0x413c,0x415c,0x417b,0x419a,0x41ba,0x41d9, -0x41f8,0x4217,0x4236,0x4255,0x4273,0x4292,0x42b1,0x42d0, -0x42ee,0x430d,0x432b,0x434a,0x4368,0x4387,0x43a5,0x43c3, -0x43e1,0x4400,0x441e,0x443c,0x445a,0x4478,0x4495,0x44b3, -0x44d1,0x44ef,0x450c,0x452a,0x4548,0x4565,0x4583,0x45a0, -0x45be,0x45db,0x45f8,0x4615,0x4633,0x4650,0x466d,0x468a, -0x46a7,0x46c4,0x46e1,0x46fe,0x471b,0x4737,0x4754,0x4771, -0x478d,0x47aa,0x47c7,0x47e3,0x4800,0x481c,0x4838,0x4855, -0x4871,0x488d,0x48a9,0x48c6,0x48e2,0x48fe,0x491a,0x4936, -0x4952,0x496e,0x498a,0x49a5,0x49c1,0x49dd,0x49f9,0x4a14, -0x4a30,0x4a4b,0x4a67,0x4a83,0x4a9e,0x4ab9,0x4ad5,0x4af0, -0x4b0b,0x4b27,0x4b42,0x4b5d,0x4b78,0x4b93,0x4bae,0x4bca, -0x4be5,0x4c00,0x4c1a,0x4c35,0x4c50,0x4c6b,0x4c86,0x4ca1, -0x4cbb,0x4cd6,0x4cf1,0x4d0b,0x4d26,0x4d40,0x4d5b,0x4d75, -0x4d90,0x4daa,0x4dc4,0x4ddf,0x4df9,0x4e13,0x4e2d,0x4e48, -0x4e62,0x4e7c,0x4e96,0x4eb0,0x4eca,0x4ee4,0x4efe,0x4f18, -0x4f32,0x4f4c,0x4f65,0x4f7f,0x4f99,0x4fb3,0x4fcc,0x4fe6, -0x5000,0x5019,0x5033,0x504c,0x5066,0x507f,0x5099,0x50b2, -0x50cb,0x50e5,0x50fe,0x5117,0x5130,0x514a,0x5163,0x517c, -0x5195,0x51ae,0x51c7,0x51e0,0x51f9,0x5212,0x522b,0x5244, -0x525d,0x5276,0x528f,0x52a7,0x52c0,0x52d9,0x52f2,0x530a, -0x5323,0x533c,0x5354,0x536d,0x5385,0x539e,0x53b6,0x53cf, -0x53e7,0x5400,0x5418,0x5430,0x5449,0x5461,0x5479,0x5491, -0x54a9,0x54c2,0x54da,0x54f2,0x550a,0x5522,0x553a,0x5552, -0x556a,0x5582,0x559a,0x55b2,0x55ca,0x55e2,0x55fa,0x5611, -0x5629,0x5641,0x5659,0x5670,0x5688,0x56a0,0x56b7,0x56cf, -0x56e6,0x56fe,0x5716,0x572d,0x5745,0x575c,0x5773,0x578b, -0x57a2,0x57ba,0x57d1,0x57e8,0x5800,0x5817,0x582e,0x5845, -0x585c,0x5874,0x588b,0x58a2,0x58b9,0x58d0,0x58e7,0x58fe, -0x5915,0x592c,0x5943,0x595a,0x5971,0x5988,0x599f,0x59b5, -0x59cc,0x59e3,0x59fa,0x5a11,0x5a27,0x5a3e,0x5a55,0x5a6b, -0x5a82,0x5a99,0x5aaf,0x5ac6,0x5adc,0x5af3,0x5b09,0x5b20, -0x5b36,0x5b4d,0x5b63,0x5b7a,0x5b90,0x5ba6,0x5bbd,0x5bd3, -0x5be9,0x5c00,0x5c16,0x5c2c,0x5c42,0x5c58,0x5c6f,0x5c85, -0x5c9b,0x5cb1,0x5cc7,0x5cdd,0x5cf3,0x5d09,0x5d1f,0x5d35, -0x5d4b,0x5d61,0x5d77,0x5d8d,0x5da3,0x5db9,0x5dce,0x5de4, -0x5dfa,0x5e10,0x5e26,0x5e3b,0x5e51,0x5e67,0x5e7c,0x5e92, -0x5ea8,0x5ebd,0x5ed3,0x5ee9,0x5efe,0x5f14,0x5f29,0x5f3f, -0x5f54,0x5f6a,0x5f7f,0x5f95,0x5faa,0x5fbf,0x5fd5,0x5fea, -0x6000,0x6015,0x602a,0x603f,0x6055,0x606a,0x607f,0x6094, -0x60aa,0x60bf,0x60d4,0x60e9,0x60fe,0x6113,0x6128,0x613d, -0x6152,0x6168,0x617d,0x6192,0x61a7,0x61bb,0x61d0,0x61e5, -0x61fa,0x620f,0x6224,0x6239,0x624e,0x6263,0x6277,0x628c, -0x62a1,0x62b6,0x62ca,0x62df,0x62f4,0x6309,0x631d,0x6332, -0x6347,0x635b,0x6370,0x6384,0x6399,0x63ad,0x63c2,0x63d7, -0x63eb,0x6400,0x6414,0x6428,0x643d,0x6451,0x6466,0x647a, -0x648e,0x64a3,0x64b7,0x64cb,0x64e0,0x64f4,0x6508,0x651d, -0x6531,0x6545,0x6559,0x656e,0x6582,0x6596,0x65aa,0x65be, -0x65d2,0x65e6,0x65fa,0x660f,0x6623,0x6637,0x664b,0x665f, -0x6673,0x6687,0x669b,0x66af,0x66c3,0x66d6,0x66ea,0x66fe, -0x6712,0x6726,0x673a,0x674e,0x6761,0x6775,0x6789,0x679d, -0x67b1,0x67c4,0x67d8,0x67ec,0x6800,0x6813,0x6827,0x683b, -0x684e,0x6862,0x6875,0x6889,0x689d,0x68b0,0x68c4,0x68d7, -0x68eb,0x68fe,0x6912,0x6925,0x6939,0x694c,0x6960,0x6973, -0x6986,0x699a,0x69ad,0x69c1,0x69d4,0x69e7,0x69fb,0x6a0e, -0x6a21,0x6a35,0x6a48,0x6a5b,0x6a6e,0x6a82,0x6a95,0x6aa8, -0x6abb,0x6ace,0x6ae2,0x6af5,0x6b08,0x6b1b,0x6b2e,0x6b41, -0x6b54,0x6b67,0x6b7a,0x6b8d,0x6ba1,0x6bb4,0x6bc7,0x6bda, -0x6bed,0x6c00,0x6c12,0x6c25,0x6c38,0x6c4b,0x6c5e,0x6c71, -0x6c84,0x6c97,0x6caa,0x6cbc,0x6ccf,0x6ce2,0x6cf5,0x6d08, -0x6d1a,0x6d2d,0x6d40,0x6d53,0x6d65,0x6d78,0x6d8b,0x6d9e, -0x6db0,0x6dc3,0x6dd6,0x6de8,0x6dfb,0x6e0d,0x6e20,0x6e33, -0x6e45,0x6e58,0x6e6a,0x6e7d,0x6e8f,0x6ea2,0x6eb4,0x6ec7, -0x6ed9,0x6eec,0x6efe,0x6f11,0x6f23,0x6f36,0x6f48,0x6f5a, -0x6f6d,0x6f7f,0x6f92,0x6fa4,0x6fb6,0x6fc9,0x6fdb,0x6fed, -0x7000,0x7012,0x7024,0x7036,0x7049,0x705b,0x706d,0x707f, -0x7091,0x70a4,0x70b6,0x70c8,0x70da,0x70ec,0x70fe,0x7110, -0x7123,0x7135,0x7147,0x7159,0x716b,0x717d,0x718f,0x71a1, -0x71b3,0x71c5,0x71d7,0x71e9,0x71fb,0x720d,0x721f,0x7231, -0x7243,0x7255,0x7267,0x7279,0x728a,0x729c,0x72ae,0x72c0, -0x72d2,0x72e4,0x72f5,0x7307,0x7319,0x732b,0x733d,0x734e, -0x7360,0x7372,0x7384,0x7395,0x73a7,0x73b9,0x73ca,0x73dc, -0x73ee,0x7400,0x7411,0x7423,0x7434,0x7446,0x7458,0x7469, -0x747b,0x748c,0x749e,0x74b0,0x74c1,0x74d3,0x74e4,0x74f6, -0x7507,0x7519,0x752a,0x753c,0x754d,0x755f,0x7570,0x7581, -0x7593,0x75a4,0x75b6,0x75c7,0x75d8,0x75ea,0x75fb,0x760d, -0x761e,0x762f,0x7641,0x7652,0x7663,0x7674,0x7686,0x7697, -0x76a8,0x76ba,0x76cb,0x76dc,0x76ed,0x76fe,0x7710,0x7721, -0x7732,0x7743,0x7754,0x7766,0x7777,0x7788,0x7799,0x77aa, -0x77bb,0x77cc,0x77dd,0x77ee,0x7800,0x7811,0x7822,0x7833, -0x7844,0x7855,0x7866,0x7877,0x7888,0x7899,0x78aa,0x78bb, -0x78cc,0x78dd,0x78ee,0x78fe,0x790f,0x7920,0x7931,0x7942, -0x7953,0x7964,0x7975,0x7986,0x7996,0x79a7,0x79b8,0x79c9, -0x79da,0x79eb,0x79fb,0x7a0c,0x7a1d,0x7a2e,0x7a3e,0x7a4f, -0x7a60,0x7a71,0x7a81,0x7a92,0x7aa3,0x7ab3,0x7ac4,0x7ad5, -0x7ae5,0x7af6,0x7b07,0x7b17,0x7b28,0x7b39,0x7b49,0x7b5a, -0x7b6b,0x7b7b,0x7b8c,0x7b9c,0x7bad,0x7bbd,0x7bce,0x7bde, -0x7bef,0x7c00,0x7c10,0x7c21,0x7c31,0x7c41,0x7c52,0x7c62, -0x7c73,0x7c83,0x7c94,0x7ca4,0x7cb5,0x7cc5,0x7cd5,0x7ce6, -0x7cf6,0x7d07,0x7d17,0x7d27,0x7d38,0x7d48,0x7d58,0x7d69, -0x7d79,0x7d89,0x7d9a,0x7daa,0x7dba,0x7dcb,0x7ddb,0x7deb, -0x7dfb,0x7e0c,0x7e1c,0x7e2c,0x7e3c,0x7e4d,0x7e5d,0x7e6d, -0x7e7d,0x7e8d,0x7e9e,0x7eae,0x7ebe,0x7ece,0x7ede,0x7eee, -0x7efe,0x7f0f,0x7f1f,0x7f2f,0x7f3f,0x7f4f,0x7f5f,0x7f6f, -0x7f7f,0x7f8f,0x7f9f,0x7faf,0x7fbf,0x7fcf,0x7fdf,0x7fef, -0x8000,0x800f,0x801f,0x802f,0x803f,0x804f,0x805f,0x806f, -0x807f,0x808f,0x809f,0x80af,0x80bf,0x80cf,0x80df,0x80ef, -0x80ff,0x810e,0x811e,0x812e,0x813e,0x814e,0x815e,0x816d, -0x817d,0x818d,0x819d,0x81ad,0x81bc,0x81cc,0x81dc,0x81ec, -0x81fc,0x820b,0x821b,0x822b,0x823b,0x824a,0x825a,0x826a, -0x8279,0x8289,0x8299,0x82a8,0x82b8,0x82c8,0x82d7,0x82e7, -0x82f7,0x8306,0x8316,0x8326,0x8335,0x8345,0x8354,0x8364, -0x8374,0x8383,0x8393,0x83a2,0x83b2,0x83c1,0x83d1,0x83e0, -0x83f0,0x8400,0x840f,0x841f,0x842e,0x843e,0x844d,0x845c, -0x846c,0x847b,0x848b,0x849a,0x84aa,0x84b9,0x84c9,0x84d8, -0x84e7,0x84f7,0x8506,0x8516,0x8525,0x8534,0x8544,0x8553, -0x8562,0x8572,0x8581,0x8591,0x85a0,0x85af,0x85be,0x85ce, -0x85dd,0x85ec,0x85fc,0x860b,0x861a,0x862a,0x8639,0x8648, -0x8657,0x8667,0x8676,0x8685,0x8694,0x86a3,0x86b3,0x86c2, -0x86d1,0x86e0,0x86ef,0x86ff,0x870e,0x871d,0x872c,0x873b, -0x874a,0x8759,0x8769,0x8778,0x8787,0x8796,0x87a5,0x87b4, -0x87c3,0x87d2,0x87e1,0x87f0,0x8800,0x880f,0x881e,0x882d, -0x883c,0x884b,0x885a,0x8869,0x8878,0x8887,0x8896,0x88a5, -0x88b4,0x88c3,0x88d2,0x88e1,0x88f0,0x88ff,0x890e,0x891c, -0x892b,0x893a,0x8949,0x8958,0x8967,0x8976,0x8985,0x8994, -0x89a3,0x89b2,0x89c0,0x89cf,0x89de,0x89ed,0x89fc,0x8a0b, -0x8a19,0x8a28,0x8a37,0x8a46,0x8a55,0x8a64,0x8a72,0x8a81, -0x8a90,0x8a9f,0x8aad,0x8abc,0x8acb,0x8ada,0x8ae8,0x8af7, -0x8b06,0x8b15,0x8b23,0x8b32,0x8b41,0x8b50,0x8b5e,0x8b6d, -0x8b7c,0x8b8a,0x8b99,0x8ba8,0x8bb6,0x8bc5,0x8bd4,0x8be2, -0x8bf1,0x8c00,0x8c0e,0x8c1d,0x8c2b,0x8c3a,0x8c49,0x8c57, -0x8c66,0x8c74,0x8c83,0x8c91,0x8ca0,0x8caf,0x8cbd,0x8ccc, -0x8cda,0x8ce9,0x8cf7,0x8d06,0x8d14,0x8d23,0x8d31,0x8d40, -0x8d4e,0x8d5d,0x8d6b,0x8d7a,0x8d88,0x8d97,0x8da5,0x8db4, -0x8dc2,0x8dd1,0x8ddf,0x8ded,0x8dfc,0x8e0a,0x8e19,0x8e27, -0x8e36,0x8e44,0x8e52,0x8e61,0x8e6f,0x8e7d,0x8e8c,0x8e9a, -0x8ea9,0x8eb7,0x8ec5,0x8ed4,0x8ee2,0x8ef0,0x8eff,0x8f0d, -0x8f1b,0x8f2a,0x8f38,0x8f46,0x8f54,0x8f63,0x8f71,0x8f7f, -0x8f8e,0x8f9c,0x8faa,0x8fb8,0x8fc7,0x8fd5,0x8fe3,0x8ff1, -0x9000,0x900e,0x901c,0x902a,0x9038,0x9047,0x9055,0x9063, -0x9071,0x907f,0x908d,0x909c,0x90aa,0x90b8,0x90c6,0x90d4, -0x90e2,0x90f0,0x90ff,0x910d,0x911b,0x9129,0x9137,0x9145, -0x9153,0x9161,0x916f,0x917e,0x918c,0x919a,0x91a8,0x91b6, -0x91c4,0x91d2,0x91e0,0x91ee,0x91fc,0x920a,0x9218,0x9226, -0x9234,0x9242,0x9250,0x925e,0x926c,0x927a,0x9288,0x9296, -0x92a4,0x92b2,0x92c0,0x92ce,0x92dc,0x92ea,0x92f8,0x9306, -0x9314,0x9321,0x932f,0x933d,0x934b,0x9359,0x9367,0x9375, -0x9383,0x9391,0x939f,0x93ac,0x93ba,0x93c8,0x93d6,0x93e4, -0x93f2,0x9400,0x940d,0x941b,0x9429,0x9437,0x9445,0x9452, -0x9460,0x946e,0x947c,0x948a,0x9497,0x94a5,0x94b3,0x94c1, -0x94cf,0x94dc,0x94ea,0x94f8,0x9506,0x9513,0x9521,0x952f, -0x953c,0x954a,0x9558,0x9566,0x9573,0x9581,0x958f,0x959c, -0x95aa,0x95b8,0x95c5,0x95d3,0x95e1,0x95ee,0x95fc,0x960a, -0x9617,0x9625,0x9633,0x9640,0x964e,0x965c,0x9669,0x9677, -0x9684,0x9692,0x96a0,0x96ad,0x96bb,0x96c8,0x96d6,0x96e4, -0x96f1,0x96ff,0x970c,0x971a,0x9727,0x9735,0x9742,0x9750, -0x975d,0x976b,0x9779,0x9786,0x9794,0x97a1,0x97af,0x97bc, -0x97ca,0x97d7,0x97e5,0x97f2,0x9800,0x980d,0x981a,0x9828, -0x9835,0x9843,0x9850,0x985e,0x986b,0x9879,0x9886,0x9893, -0x98a1,0x98ae,0x98bc,0x98c9,0x98d6,0x98e4,0x98f1,0x98ff, -0x990c,0x9919,0x9927,0x9934,0x9942,0x994f,0x995c,0x996a, -0x9977,0x9984,0x9992,0x999f,0x99ac,0x99ba,0x99c7,0x99d4, -0x99e2,0x99ef,0x99fc,0x9a09,0x9a17,0x9a24,0x9a31,0x9a3f, -0x9a4c,0x9a59,0x9a66,0x9a74,0x9a81,0x9a8e,0x9a9b,0x9aa9, -0x9ab6,0x9ac3,0x9ad0,0x9ade,0x9aeb,0x9af8,0x9b05,0x9b12, -0x9b20,0x9b2d,0x9b3a,0x9b47,0x9b54,0x9b62,0x9b6f,0x9b7c, -0x9b89,0x9b96,0x9ba3,0x9bb1,0x9bbe,0x9bcb,0x9bd8,0x9be5, -0x9bf2,0x9c00,0x9c0d,0x9c1a,0x9c27,0x9c34,0x9c41,0x9c4e, -0x9c5b,0x9c68,0x9c75,0x9c83,0x9c90,0x9c9d,0x9caa,0x9cb7, -0x9cc4,0x9cd1,0x9cde,0x9ceb,0x9cf8,0x9d05,0x9d12,0x9d1f, -0x9d2c,0x9d39,0x9d46,0x9d53,0x9d60,0x9d6d,0x9d7a,0x9d87, -0x9d94,0x9da1,0x9dae,0x9dbb,0x9dc8,0x9dd5,0x9de2,0x9def, -0x9dfc,0x9e09,0x9e16,0x9e23,0x9e30,0x9e3d,0x9e4a,0x9e57, -0x9e64,0x9e71,0x9e7e,0x9e8b,0x9e98,0x9ea4,0x9eb1,0x9ebe, -0x9ecb,0x9ed8,0x9ee5,0x9ef2,0x9eff,0x9f0c,0x9f18,0x9f25, -0x9f32,0x9f3f,0x9f4c,0x9f59,0x9f66,0x9f72,0x9f7f,0x9f8c, -0x9f99,0x9fa6,0x9fb3,0x9fbf,0x9fcc,0x9fd9,0x9fe6,0x9ff3, -0xa000,0xa00c,0xa019,0xa026,0xa033,0xa03f,0xa04c,0xa059, -0xa066,0xa073,0xa07f,0xa08c,0xa099,0xa0a6,0xa0b2,0xa0bf, -0xa0cc,0xa0d9,0xa0e5,0xa0f2,0xa0ff,0xa10b,0xa118,0xa125, -0xa132,0xa13e,0xa14b,0xa158,0xa164,0xa171,0xa17e,0xa18a, -0xa197,0xa1a4,0xa1b0,0xa1bd,0xa1ca,0xa1d6,0xa1e3,0xa1f0, -0xa1fc,0xa209,0xa216,0xa222,0xa22f,0xa23c,0xa248,0xa255, -0xa261,0xa26e,0xa27b,0xa287,0xa294,0xa2a0,0xa2ad,0xa2ba, -0xa2c6,0xa2d3,0xa2df,0xa2ec,0xa2f8,0xa305,0xa312,0xa31e, -0xa32b,0xa337,0xa344,0xa350,0xa35d,0xa369,0xa376,0xa382, -0xa38f,0xa39b,0xa3a8,0xa3b5,0xa3c1,0xa3ce,0xa3da,0xa3e7, -0xa3f3,0xa400,0xa40c,0xa418,0xa425,0xa431,0xa43e,0xa44a, -0xa457,0xa463,0xa470,0xa47c,0xa489,0xa495,0xa4a2,0xa4ae, -0xa4ba,0xa4c7,0xa4d3,0xa4e0,0xa4ec,0xa4f9,0xa505,0xa511, -0xa51e,0xa52a,0xa537,0xa543,0xa54f,0xa55c,0xa568,0xa574, -0xa581,0xa58d,0xa59a,0xa5a6,0xa5b2,0xa5bf,0xa5cb,0xa5d7, -0xa5e4,0xa5f0,0xa5fc,0xa609,0xa615,0xa621,0xa62e,0xa63a, -0xa646,0xa653,0xa65f,0xa66b,0xa678,0xa684,0xa690,0xa69d, -0xa6a9,0xa6b5,0xa6c1,0xa6ce,0xa6da,0xa6e6,0xa6f2,0xa6ff, -0xa70b,0xa717,0xa724,0xa730,0xa73c,0xa748,0xa754,0xa761, -0xa76d,0xa779,0xa785,0xa792,0xa79e,0xa7aa,0xa7b6,0xa7c3, -0xa7cf,0xa7db,0xa7e7,0xa7f3,0xa800,0xa80c,0xa818,0xa824, -0xa830,0xa83c,0xa849,0xa855,0xa861,0xa86d,0xa879,0xa885, -0xa892,0xa89e,0xa8aa,0xa8b6,0xa8c2,0xa8ce,0xa8da,0xa8e6, -0xa8f3,0xa8ff,0xa90b,0xa917,0xa923,0xa92f,0xa93b,0xa947, -0xa953,0xa960,0xa96c,0xa978,0xa984,0xa990,0xa99c,0xa9a8, -0xa9b4,0xa9c0,0xa9cc,0xa9d8,0xa9e4,0xa9f0,0xa9fc,0xaa09, -0xaa15,0xaa21,0xaa2d,0xaa39,0xaa45,0xaa51,0xaa5d,0xaa69, -0xaa75,0xaa81,0xaa8d,0xaa99,0xaaa5,0xaab1,0xaabd,0xaac9, -0xaad5,0xaae1,0xaaed,0xaaf9,0xab05,0xab11,0xab1d,0xab29, -0xab35,0xab41,0xab4d,0xab58,0xab64,0xab70,0xab7c,0xab88, -0xab94,0xaba0,0xabac,0xabb8,0xabc4,0xabd0,0xabdc,0xabe8, -0xabf4,0xac00,0xac0b,0xac17,0xac23,0xac2f,0xac3b,0xac47, -0xac53,0xac5f,0xac6b,0xac76,0xac82,0xac8e,0xac9a,0xaca6, -0xacb2,0xacbe,0xacc9,0xacd5,0xace1,0xaced,0xacf9,0xad05, -0xad11,0xad1c,0xad28,0xad34,0xad40,0xad4c,0xad57,0xad63, -0xad6f,0xad7b,0xad87,0xad92,0xad9e,0xadaa,0xadb6,0xadc2, -0xadcd,0xadd9,0xade5,0xadf1,0xadfd,0xae08,0xae14,0xae20, -0xae2c,0xae37,0xae43,0xae4f,0xae5b,0xae66,0xae72,0xae7e, -0xae8a,0xae95,0xaea1,0xaead,0xaeb8,0xaec4,0xaed0,0xaedc, -0xaee7,0xaef3,0xaeff,0xaf0a,0xaf16,0xaf22,0xaf2e,0xaf39, -0xaf45,0xaf51,0xaf5c,0xaf68,0xaf74,0xaf7f,0xaf8b,0xaf97, -0xafa2,0xafae,0xafba,0xafc5,0xafd1,0xafdd,0xafe8,0xaff4, -0xb000,0xb00b,0xb017,0xb022,0xb02e,0xb03a,0xb045,0xb051, -0xb05c,0xb068,0xb074,0xb07f,0xb08b,0xb097,0xb0a2,0xb0ae, -0xb0b9,0xb0c5,0xb0d0,0xb0dc,0xb0e8,0xb0f3,0xb0ff,0xb10a, -0xb116,0xb121,0xb12d,0xb139,0xb144,0xb150,0xb15b,0xb167, -0xb172,0xb17e,0xb189,0xb195,0xb1a0,0xb1ac,0xb1b8,0xb1c3, -0xb1cf,0xb1da,0xb1e6,0xb1f1,0xb1fd,0xb208,0xb214,0xb21f, -0xb22b,0xb236,0xb242,0xb24d,0xb259,0xb264,0xb270,0xb27b, -0xb286,0xb292,0xb29d,0xb2a9,0xb2b4,0xb2c0,0xb2cb,0xb2d7, -0xb2e2,0xb2ee,0xb2f9,0xb305,0xb310,0xb31b,0xb327,0xb332, -0xb33e,0xb349,0xb355,0xb360,0xb36b,0xb377,0xb382,0xb38e, -0xb399,0xb3a4,0xb3b0,0xb3bb,0xb3c7,0xb3d2,0xb3dd,0xb3e9, -0xb3f4,0xb400,0xb40b,0xb416,0xb422,0xb42d,0xb438,0xb444, -0xb44f,0xb45a,0xb466,0xb471,0xb47c,0xb488,0xb493,0xb49f, -0xb4aa,0xb4b5,0xb4c1,0xb4cc,0xb4d7,0xb4e2,0xb4ee,0xb4f9, -0xb504,0xb510,0xb51b,0xb526,0xb532,0xb53d,0xb548,0xb554, -0xb55f,0xb56a,0xb575,0xb581,0xb58c,0xb597,0xb5a3,0xb5ae, -0xb5b9,0xb5c4,0xb5d0,0xb5db,0xb5e6,0xb5f1,0xb5fd,0xb608, -0xb613,0xb61e,0xb62a,0xb635,0xb640,0xb64b,0xb657,0xb662, -0xb66d,0xb678,0xb684,0xb68f,0xb69a,0xb6a5,0xb6b0,0xb6bc, -0xb6c7,0xb6d2,0xb6dd,0xb6e8,0xb6f4,0xb6ff,0xb70a,0xb715, -0xb720,0xb72c,0xb737,0xb742,0xb74d,0xb758,0xb763,0xb76f, -0xb77a,0xb785,0xb790,0xb79b,0xb7a6,0xb7b2,0xb7bd,0xb7c8, -0xb7d3,0xb7de,0xb7e9,0xb7f4,0xb800,0xb80b,0xb816,0xb821, -0xb82c,0xb837,0xb842,0xb84d,0xb858,0xb864,0xb86f,0xb87a, -0xb885,0xb890,0xb89b,0xb8a6,0xb8b1,0xb8bc,0xb8c7,0xb8d3, -0xb8de,0xb8e9,0xb8f4,0xb8ff,0xb90a,0xb915,0xb920,0xb92b, -0xb936,0xb941,0xb94c,0xb957,0xb962,0xb96d,0xb978,0xb983, -0xb98f,0xb99a,0xb9a5,0xb9b0,0xb9bb,0xb9c6,0xb9d1,0xb9dc, -0xb9e7,0xb9f2,0xb9fd,0xba08,0xba13,0xba1e,0xba29,0xba34, -0xba3f,0xba4a,0xba55,0xba60,0xba6b,0xba76,0xba81,0xba8c, -0xba97,0xbaa2,0xbaad,0xbab8,0xbac3,0xbace,0xbad8,0xbae3, -0xbaee,0xbaf9,0xbb04,0xbb0f,0xbb1a,0xbb25,0xbb30,0xbb3b, -0xbb46,0xbb51,0xbb5c,0xbb67,0xbb72,0xbb7d,0xbb88,0xbb92, -0xbb9d,0xbba8,0xbbb3,0xbbbe,0xbbc9,0xbbd4,0xbbdf,0xbbea, -0xbbf5,0xbc00,0xbc0a,0xbc15,0xbc20,0xbc2b,0xbc36,0xbc41, -0xbc4c,0xbc57,0xbc61,0xbc6c,0xbc77,0xbc82,0xbc8d,0xbc98, -0xbca3,0xbcad,0xbcb8,0xbcc3,0xbcce,0xbcd9,0xbce4,0xbcef, -0xbcf9,0xbd04,0xbd0f,0xbd1a,0xbd25,0xbd30,0xbd3a,0xbd45, -0xbd50,0xbd5b,0xbd66,0xbd70,0xbd7b,0xbd86,0xbd91,0xbd9c, -0xbda6,0xbdb1,0xbdbc,0xbdc7,0xbdd2,0xbddc,0xbde7,0xbdf2, -0xbdfd,0xbe08,0xbe12,0xbe1d,0xbe28,0xbe33,0xbe3d,0xbe48, -0xbe53,0xbe5e,0xbe68,0xbe73,0xbe7e,0xbe89,0xbe93,0xbe9e, -0xbea9,0xbeb4,0xbebe,0xbec9,0xbed4,0xbedf,0xbee9,0xbef4, -0xbeff,0xbf0a,0xbf14,0xbf1f,0xbf2a,0xbf34,0xbf3f,0xbf4a, -0xbf55,0xbf5f,0xbf6a,0xbf75,0xbf7f,0xbf8a,0xbf95,0xbf9f, -0xbfaa,0xbfb5,0xbfbf,0xbfca,0xbfd5,0xbfdf,0xbfea,0xbff5, -0xc000,0xc00a,0xc015,0xc01f,0xc02a,0xc035,0xc03f,0xc04a, -0xc055,0xc05f,0xc06a,0xc075,0xc07f,0xc08a,0xc095,0xc09f, -0xc0aa,0xc0b5,0xc0bf,0xc0ca,0xc0d4,0xc0df,0xc0ea,0xc0f4, -0xc0ff,0xc109,0xc114,0xc11f,0xc129,0xc134,0xc13e,0xc149, -0xc154,0xc15e,0xc169,0xc173,0xc17e,0xc189,0xc193,0xc19e, -0xc1a8,0xc1b3,0xc1bd,0xc1c8,0xc1d3,0xc1dd,0xc1e8,0xc1f2, -0xc1fd,0xc207,0xc212,0xc21d,0xc227,0xc232,0xc23c,0xc247, -0xc251,0xc25c,0xc266,0xc271,0xc27b,0xc286,0xc290,0xc29b, -0xc2a5,0xc2b0,0xc2bb,0xc2c5,0xc2d0,0xc2da,0xc2e5,0xc2ef, -0xc2fa,0xc304,0xc30f,0xc319,0xc324,0xc32e,0xc339,0xc343, -0xc34e,0xc358,0xc363,0xc36d,0xc377,0xc382,0xc38c,0xc397, -0xc3a1,0xc3ac,0xc3b6,0xc3c1,0xc3cb,0xc3d6,0xc3e0,0xc3eb, -0xc3f5,0xc400,0xc40a,0xc414,0xc41f,0xc429,0xc434,0xc43e, -0xc449,0xc453,0xc45d,0xc468,0xc472,0xc47d,0xc487,0xc492, -0xc49c,0xc4a6,0xc4b1,0xc4bb,0xc4c6,0xc4d0,0xc4da,0xc4e5, -0xc4ef,0xc4fa,0xc504,0xc50e,0xc519,0xc523,0xc52e,0xc538, -0xc542,0xc54d,0xc557,0xc562,0xc56c,0xc576,0xc581,0xc58b, -0xc595,0xc5a0,0xc5aa,0xc5b4,0xc5bf,0xc5c9,0xc5d4,0xc5de, -0xc5e8,0xc5f3,0xc5fd,0xc607,0xc612,0xc61c,0xc626,0xc631, -0xc63b,0xc645,0xc650,0xc65a,0xc664,0xc66f,0xc679,0xc683, -0xc68e,0xc698,0xc6a2,0xc6ac,0xc6b7,0xc6c1,0xc6cb,0xc6d6, -0xc6e0,0xc6ea,0xc6f5,0xc6ff,0xc709,0xc713,0xc71e,0xc728, -0xc732,0xc73d,0xc747,0xc751,0xc75b,0xc766,0xc770,0xc77a, -0xc784,0xc78f,0xc799,0xc7a3,0xc7ae,0xc7b8,0xc7c2,0xc7cc, -0xc7d7,0xc7e1,0xc7eb,0xc7f5,0xc800,0xc80a,0xc814,0xc81e, -0xc828,0xc833,0xc83d,0xc847,0xc851,0xc85c,0xc866,0xc870, -0xc87a,0xc884,0xc88f,0xc899,0xc8a3,0xc8ad,0xc8b7,0xc8c2, -0xc8cc,0xc8d6,0xc8e0,0xc8ea,0xc8f5,0xc8ff,0xc909,0xc913, -0xc91d,0xc928,0xc932,0xc93c,0xc946,0xc950,0xc95a,0xc965, -0xc96f,0xc979,0xc983,0xc98d,0xc997,0xc9a2,0xc9ac,0xc9b6, -0xc9c0,0xc9ca,0xc9d4,0xc9df,0xc9e9,0xc9f3,0xc9fd,0xca07, -0xca11,0xca1b,0xca26,0xca30,0xca3a,0xca44,0xca4e,0xca58, -0xca62,0xca6c,0xca76,0xca81,0xca8b,0xca95,0xca9f,0xcaa9, -0xcab3,0xcabd,0xcac7,0xcad1,0xcadc,0xcae6,0xcaf0,0xcafa, -0xcb04,0xcb0e,0xcb18,0xcb22,0xcb2c,0xcb36,0xcb40,0xcb4a, -0xcb55,0xcb5f,0xcb69,0xcb73,0xcb7d,0xcb87,0xcb91,0xcb9b, -0xcba5,0xcbaf,0xcbb9,0xcbc3,0xcbcd,0xcbd7,0xcbe1,0xcbeb, -0xcbf5,0xcc00,0xcc0a,0xcc14,0xcc1e,0xcc28,0xcc32,0xcc3c, -0xcc46,0xcc50,0xcc5a,0xcc64,0xcc6e,0xcc78,0xcc82,0xcc8c, -0xcc96,0xcca0,0xccaa,0xccb4,0xccbe,0xccc8,0xccd2,0xccdc, -0xcce6,0xccf0,0xccfa,0xcd04,0xcd0e,0xcd18,0xcd22,0xcd2c, -0xcd36,0xcd40,0xcd4a,0xcd54,0xcd5e,0xcd68,0xcd72,0xcd7c, -0xcd86,0xcd90,0xcd99,0xcda3,0xcdad,0xcdb7,0xcdc1,0xcdcb, -0xcdd5,0xcddf,0xcde9,0xcdf3,0xcdfd,0xce07,0xce11,0xce1b, -0xce25,0xce2f,0xce39,0xce43,0xce4c,0xce56,0xce60,0xce6a, -0xce74,0xce7e,0xce88,0xce92,0xce9c,0xcea6,0xceb0,0xceba, -0xcec3,0xcecd,0xced7,0xcee1,0xceeb,0xcef5,0xceff,0xcf09, -0xcf13,0xcf1d,0xcf26,0xcf30,0xcf3a,0xcf44,0xcf4e,0xcf58, -0xcf62,0xcf6c,0xcf75,0xcf7f,0xcf89,0xcf93,0xcf9d,0xcfa7, -0xcfb1,0xcfbb,0xcfc4,0xcfce,0xcfd8,0xcfe2,0xcfec,0xcff6, -0xd000,0xd009,0xd013,0xd01d,0xd027,0xd031,0xd03b,0xd044, -0xd04e,0xd058,0xd062,0xd06c,0xd076,0xd07f,0xd089,0xd093, -0xd09d,0xd0a7,0xd0b0,0xd0ba,0xd0c4,0xd0ce,0xd0d8,0xd0e1, -0xd0eb,0xd0f5,0xd0ff,0xd109,0xd112,0xd11c,0xd126,0xd130, -0xd13a,0xd143,0xd14d,0xd157,0xd161,0xd16b,0xd174,0xd17e, -0xd188,0xd192,0xd19b,0xd1a5,0xd1af,0xd1b9,0xd1c3,0xd1cc, -0xd1d6,0xd1e0,0xd1ea,0xd1f3,0xd1fd,0xd207,0xd211,0xd21a, -0xd224,0xd22e,0xd238,0xd241,0xd24b,0xd255,0xd25f,0xd268, -0xd272,0xd27c,0xd285,0xd28f,0xd299,0xd2a3,0xd2ac,0xd2b6, -0xd2c0,0xd2c9,0xd2d3,0xd2dd,0xd2e7,0xd2f0,0xd2fa,0xd304, -0xd30d,0xd317,0xd321,0xd32b,0xd334,0xd33e,0xd348,0xd351, -0xd35b,0xd365,0xd36e,0xd378,0xd382,0xd38b,0xd395,0xd39f, -0xd3a8,0xd3b2,0xd3bc,0xd3c6,0xd3cf,0xd3d9,0xd3e3,0xd3ec, -0xd3f6,0xd400,0xd409,0xd413,0xd41c,0xd426,0xd430,0xd439, -0xd443,0xd44d,0xd456,0xd460,0xd46a,0xd473,0xd47d,0xd487, -0xd490,0xd49a,0xd4a3,0xd4ad,0xd4b7,0xd4c0,0xd4ca,0xd4d4, -0xd4dd,0xd4e7,0xd4f0,0xd4fa,0xd504,0xd50d,0xd517,0xd521, -0xd52a,0xd534,0xd53d,0xd547,0xd551,0xd55a,0xd564,0xd56d, -0xd577,0xd581,0xd58a,0xd594,0xd59d,0xd5a7,0xd5b0,0xd5ba, -0xd5c4,0xd5cd,0xd5d7,0xd5e0,0xd5ea,0xd5f4,0xd5fd,0xd607, -0xd610,0xd61a,0xd623,0xd62d,0xd637,0xd640,0xd64a,0xd653, -0xd65d,0xd666,0xd670,0xd679,0xd683,0xd68c,0xd696,0xd6a0, -0xd6a9,0xd6b3,0xd6bc,0xd6c6,0xd6cf,0xd6d9,0xd6e2,0xd6ec, -0xd6f5,0xd6ff,0xd708,0xd712,0xd71b,0xd725,0xd72f,0xd738, -0xd742,0xd74b,0xd755,0xd75e,0xd768,0xd771,0xd77b,0xd784, -0xd78e,0xd797,0xd7a1,0xd7aa,0xd7b4,0xd7bd,0xd7c7,0xd7d0, -0xd7da,0xd7e3,0xd7ed,0xd7f6,0xd800,0xd809,0xd812,0xd81c, -0xd825,0xd82f,0xd838,0xd842,0xd84b,0xd855,0xd85e,0xd868, -0xd871,0xd87b,0xd884,0xd88e,0xd897,0xd8a0,0xd8aa,0xd8b3, -0xd8bd,0xd8c6,0xd8d0,0xd8d9,0xd8e3,0xd8ec,0xd8f5,0xd8ff, -0xd908,0xd912,0xd91b,0xd925,0xd92e,0xd938,0xd941,0xd94a, -0xd954,0xd95d,0xd967,0xd970,0xd979,0xd983,0xd98c,0xd996, -0xd99f,0xd9a9,0xd9b2,0xd9bb,0xd9c5,0xd9ce,0xd9d8,0xd9e1, -0xd9ea,0xd9f4,0xd9fd,0xda07,0xda10,0xda19,0xda23,0xda2c, -0xda35,0xda3f,0xda48,0xda52,0xda5b,0xda64,0xda6e,0xda77, -0xda81,0xda8a,0xda93,0xda9d,0xdaa6,0xdaaf,0xdab9,0xdac2, -0xdacb,0xdad5,0xdade,0xdae8,0xdaf1,0xdafa,0xdb04,0xdb0d, -0xdb16,0xdb20,0xdb29,0xdb32,0xdb3c,0xdb45,0xdb4e,0xdb58, -0xdb61,0xdb6a,0xdb74,0xdb7d,0xdb86,0xdb90,0xdb99,0xdba2, -0xdbac,0xdbb5,0xdbbe,0xdbc8,0xdbd1,0xdbda,0xdbe4,0xdbed, -0xdbf6,0xdc00,0xdc09,0xdc12,0xdc1b,0xdc25,0xdc2e,0xdc37, -0xdc41,0xdc4a,0xdc53,0xdc5d,0xdc66,0xdc6f,0xdc78,0xdc82, -0xdc8b,0xdc94,0xdc9e,0xdca7,0xdcb0,0xdcb9,0xdcc3,0xdccc, -0xdcd5,0xdcde,0xdce8,0xdcf1,0xdcfa,0xdd04,0xdd0d,0xdd16, -0xdd1f,0xdd29,0xdd32,0xdd3b,0xdd44,0xdd4e,0xdd57,0xdd60, -0xdd69,0xdd73,0xdd7c,0xdd85,0xdd8e,0xdd98,0xdda1,0xddaa, -0xddb3,0xddbd,0xddc6,0xddcf,0xddd8,0xdde2,0xddeb,0xddf4, -0xddfd,0xde06,0xde10,0xde19,0xde22,0xde2b,0xde35,0xde3e, -0xde47,0xde50,0xde59,0xde63,0xde6c,0xde75,0xde7e,0xde87, -0xde91,0xde9a,0xdea3,0xdeac,0xdeb5,0xdebf,0xdec8,0xded1, -0xdeda,0xdee3,0xdeed,0xdef6,0xdeff,0xdf08,0xdf11,0xdf1a, -0xdf24,0xdf2d,0xdf36,0xdf3f,0xdf48,0xdf52,0xdf5b,0xdf64, -0xdf6d,0xdf76,0xdf7f,0xdf89,0xdf92,0xdf9b,0xdfa4,0xdfad, -0xdfb6,0xdfbf,0xdfc9,0xdfd2,0xdfdb,0xdfe4,0xdfed,0xdff6, -0xe000,0xe009,0xe012,0xe01b,0xe024,0xe02d,0xe036,0xe03f, -0xe049,0xe052,0xe05b,0xe064,0xe06d,0xe076,0xe07f,0xe088, -0xe092,0xe09b,0xe0a4,0xe0ad,0xe0b6,0xe0bf,0xe0c8,0xe0d1, -0xe0db,0xe0e4,0xe0ed,0xe0f6,0xe0ff,0xe108,0xe111,0xe11a, -0xe123,0xe12c,0xe136,0xe13f,0xe148,0xe151,0xe15a,0xe163, -0xe16c,0xe175,0xe17e,0xe187,0xe190,0xe199,0xe1a3,0xe1ac, -0xe1b5,0xe1be,0xe1c7,0xe1d0,0xe1d9,0xe1e2,0xe1eb,0xe1f4, -0xe1fd,0xe206,0xe20f,0xe218,0xe221,0xe22b,0xe234,0xe23d, -0xe246,0xe24f,0xe258,0xe261,0xe26a,0xe273,0xe27c,0xe285, -0xe28e,0xe297,0xe2a0,0xe2a9,0xe2b2,0xe2bb,0xe2c4,0xe2cd, -0xe2d6,0xe2df,0xe2e8,0xe2f1,0xe2fa,0xe303,0xe30c,0xe315, -0xe31f,0xe328,0xe331,0xe33a,0xe343,0xe34c,0xe355,0xe35e, -0xe367,0xe370,0xe379,0xe382,0xe38b,0xe394,0xe39d,0xe3a6, -0xe3af,0xe3b8,0xe3c1,0xe3ca,0xe3d3,0xe3dc,0xe3e5,0xe3ee, -0xe3f7,0xe400,0xe408,0xe411,0xe41a,0xe423,0xe42c,0xe435, -0xe43e,0xe447,0xe450,0xe459,0xe462,0xe46b,0xe474,0xe47d, -0xe486,0xe48f,0xe498,0xe4a1,0xe4aa,0xe4b3,0xe4bc,0xe4c5, -0xe4ce,0xe4d7,0xe4e0,0xe4e9,0xe4f2,0xe4fa,0xe503,0xe50c, -0xe515,0xe51e,0xe527,0xe530,0xe539,0xe542,0xe54b,0xe554, -0xe55d,0xe566,0xe56f,0xe578,0xe580,0xe589,0xe592,0xe59b, -0xe5a4,0xe5ad,0xe5b6,0xe5bf,0xe5c8,0xe5d1,0xe5da,0xe5e3, -0xe5eb,0xe5f4,0xe5fd,0xe606,0xe60f,0xe618,0xe621,0xe62a, -0xe633,0xe63c,0xe644,0xe64d,0xe656,0xe65f,0xe668,0xe671, -0xe67a,0xe683,0xe68c,0xe694,0xe69d,0xe6a6,0xe6af,0xe6b8, -0xe6c1,0xe6ca,0xe6d3,0xe6db,0xe6e4,0xe6ed,0xe6f6,0xe6ff, -0xe708,0xe711,0xe71a,0xe722,0xe72b,0xe734,0xe73d,0xe746, -0xe74f,0xe758,0xe760,0xe769,0xe772,0xe77b,0xe784,0xe78d, -0xe795,0xe79e,0xe7a7,0xe7b0,0xe7b9,0xe7c2,0xe7cb,0xe7d3, -0xe7dc,0xe7e5,0xe7ee,0xe7f7,0xe800,0xe808,0xe811,0xe81a, -0xe823,0xe82c,0xe834,0xe83d,0xe846,0xe84f,0xe858,0xe861, -0xe869,0xe872,0xe87b,0xe884,0xe88d,0xe895,0xe89e,0xe8a7, -0xe8b0,0xe8b9,0xe8c1,0xe8ca,0xe8d3,0xe8dc,0xe8e5,0xe8ed, -0xe8f6,0xe8ff,0xe908,0xe911,0xe919,0xe922,0xe92b,0xe934, -0xe93c,0xe945,0xe94e,0xe957,0xe960,0xe968,0xe971,0xe97a, -0xe983,0xe98b,0xe994,0xe99d,0xe9a6,0xe9ae,0xe9b7,0xe9c0, -0xe9c9,0xe9d2,0xe9da,0xe9e3,0xe9ec,0xe9f5,0xe9fd,0xea06, -0xea0f,0xea18,0xea20,0xea29,0xea32,0xea3b,0xea43,0xea4c, -0xea55,0xea5e,0xea66,0xea6f,0xea78,0xea80,0xea89,0xea92, -0xea9b,0xeaa3,0xeaac,0xeab5,0xeabe,0xeac6,0xeacf,0xead8, -0xeae0,0xeae9,0xeaf2,0xeafb,0xeb03,0xeb0c,0xeb15,0xeb1d, -0xeb26,0xeb2f,0xeb38,0xeb40,0xeb49,0xeb52,0xeb5a,0xeb63, -0xeb6c,0xeb74,0xeb7d,0xeb86,0xeb8f,0xeb97,0xeba0,0xeba9, -0xebb1,0xebba,0xebc3,0xebcb,0xebd4,0xebdd,0xebe5,0xebee, -0xebf7,0xec00,0xec08,0xec11,0xec1a,0xec22,0xec2b,0xec34, -0xec3c,0xec45,0xec4e,0xec56,0xec5f,0xec68,0xec70,0xec79, -0xec82,0xec8a,0xec93,0xec9c,0xeca4,0xecad,0xecb5,0xecbe, -0xecc7,0xeccf,0xecd8,0xece1,0xece9,0xecf2,0xecfb,0xed03, -0xed0c,0xed15,0xed1d,0xed26,0xed2e,0xed37,0xed40,0xed48, -0xed51,0xed5a,0xed62,0xed6b,0xed74,0xed7c,0xed85,0xed8d, -0xed96,0xed9f,0xeda7,0xedb0,0xedb8,0xedc1,0xedca,0xedd2, -0xeddb,0xede4,0xedec,0xedf5,0xedfd,0xee06,0xee0f,0xee17, -0xee20,0xee28,0xee31,0xee3a,0xee42,0xee4b,0xee53,0xee5c, -0xee65,0xee6d,0xee76,0xee7e,0xee87,0xee8f,0xee98,0xeea1, -0xeea9,0xeeb2,0xeeba,0xeec3,0xeecc,0xeed4,0xeedd,0xeee5, -0xeeee,0xeef6,0xeeff,0xef08,0xef10,0xef19,0xef21,0xef2a, -0xef32,0xef3b,0xef43,0xef4c,0xef55,0xef5d,0xef66,0xef6e, -0xef77,0xef7f,0xef88,0xef90,0xef99,0xefa2,0xefaa,0xefb3, -0xefbb,0xefc4,0xefcc,0xefd5,0xefdd,0xefe6,0xefee,0xeff7, -0xf000,0xf008,0xf011,0xf019,0xf022,0xf02a,0xf033,0xf03b, -0xf044,0xf04c,0xf055,0xf05d,0xf066,0xf06e,0xf077,0xf07f, -0xf088,0xf090,0xf099,0xf0a1,0xf0aa,0xf0b2,0xf0bb,0xf0c3, -0xf0cc,0xf0d4,0xf0dd,0xf0e5,0xf0ee,0xf0f6,0xf0ff,0xf107, -0xf110,0xf118,0xf121,0xf129,0xf132,0xf13a,0xf143,0xf14b, -0xf154,0xf15c,0xf165,0xf16d,0xf176,0xf17e,0xf187,0xf18f, -0xf198,0xf1a0,0xf1a9,0xf1b1,0xf1ba,0xf1c2,0xf1cb,0xf1d3, -0xf1dc,0xf1e4,0xf1ec,0xf1f5,0xf1fd,0xf206,0xf20e,0xf217, -0xf21f,0xf228,0xf230,0xf239,0xf241,0xf24a,0xf252,0xf25a, -0xf263,0xf26b,0xf274,0xf27c,0xf285,0xf28d,0xf296,0xf29e, -0xf2a6,0xf2af,0xf2b7,0xf2c0,0xf2c8,0xf2d1,0xf2d9,0xf2e1, -0xf2ea,0xf2f2,0xf2fb,0xf303,0xf30c,0xf314,0xf31c,0xf325, -0xf32d,0xf336,0xf33e,0xf347,0xf34f,0xf357,0xf360,0xf368, -0xf371,0xf379,0xf381,0xf38a,0xf392,0xf39b,0xf3a3,0xf3ac, -0xf3b4,0xf3bc,0xf3c5,0xf3cd,0xf3d6,0xf3de,0xf3e6,0xf3ef, -0xf3f7,0xf400,0xf408,0xf410,0xf419,0xf421,0xf429,0xf432, -0xf43a,0xf443,0xf44b,0xf453,0xf45c,0xf464,0xf46d,0xf475, -0xf47d,0xf486,0xf48e,0xf496,0xf49f,0xf4a7,0xf4b0,0xf4b8, -0xf4c0,0xf4c9,0xf4d1,0xf4d9,0xf4e2,0xf4ea,0xf4f2,0xf4fb, -0xf503,0xf50c,0xf514,0xf51c,0xf525,0xf52d,0xf535,0xf53e, -0xf546,0xf54e,0xf557,0xf55f,0xf567,0xf570,0xf578,0xf580, -0xf589,0xf591,0xf599,0xf5a2,0xf5aa,0xf5b2,0xf5bb,0xf5c3, -0xf5cb,0xf5d4,0xf5dc,0xf5e4,0xf5ed,0xf5f5,0xf5fd,0xf606, -0xf60e,0xf616,0xf61f,0xf627,0xf62f,0xf638,0xf640,0xf648, -0xf651,0xf659,0xf661,0xf66a,0xf672,0xf67a,0xf682,0xf68b, -0xf693,0xf69b,0xf6a4,0xf6ac,0xf6b4,0xf6bd,0xf6c5,0xf6cd, -0xf6d6,0xf6de,0xf6e6,0xf6ee,0xf6f7,0xf6ff,0xf707,0xf710, -0xf718,0xf720,0xf728,0xf731,0xf739,0xf741,0xf74a,0xf752, -0xf75a,0xf762,0xf76b,0xf773,0xf77b,0xf784,0xf78c,0xf794, -0xf79c,0xf7a5,0xf7ad,0xf7b5,0xf7bd,0xf7c6,0xf7ce,0xf7d6, -0xf7de,0xf7e7,0xf7ef,0xf7f7,0xf800,0xf808,0xf810,0xf818, -0xf821,0xf829,0xf831,0xf839,0xf842,0xf84a,0xf852,0xf85a, -0xf863,0xf86b,0xf873,0xf87b,0xf883,0xf88c,0xf894,0xf89c, -0xf8a4,0xf8ad,0xf8b5,0xf8bd,0xf8c5,0xf8ce,0xf8d6,0xf8de, -0xf8e6,0xf8ef,0xf8f7,0xf8ff,0xf907,0xf90f,0xf918,0xf920, -0xf928,0xf930,0xf939,0xf941,0xf949,0xf951,0xf959,0xf962, -0xf96a,0xf972,0xf97a,0xf982,0xf98b,0xf993,0xf99b,0xf9a3, -0xf9ab,0xf9b4,0xf9bc,0xf9c4,0xf9cc,0xf9d4,0xf9dd,0xf9e5, -0xf9ed,0xf9f5,0xf9fd,0xfa06,0xfa0e,0xfa16,0xfa1e,0xfa26, -0xfa2f,0xfa37,0xfa3f,0xfa47,0xfa4f,0xfa58,0xfa60,0xfa68, -0xfa70,0xfa78,0xfa80,0xfa89,0xfa91,0xfa99,0xfaa1,0xfaa9, -0xfab1,0xfaba,0xfac2,0xfaca,0xfad2,0xfada,0xfae2,0xfaeb, -0xfaf3,0xfafb,0xfb03,0xfb0b,0xfb13,0xfb1c,0xfb24,0xfb2c, -0xfb34,0xfb3c,0xfb44,0xfb4c,0xfb55,0xfb5d,0xfb65,0xfb6d, -0xfb75,0xfb7d,0xfb85,0xfb8e,0xfb96,0xfb9e,0xfba6,0xfbae, -0xfbb6,0xfbbe,0xfbc7,0xfbcf,0xfbd7,0xfbdf,0xfbe7,0xfbef, -0xfbf7,0xfc00,0xfc08,0xfc10,0xfc18,0xfc20,0xfc28,0xfc30, -0xfc38,0xfc40,0xfc49,0xfc51,0xfc59,0xfc61,0xfc69,0xfc71, -0xfc79,0xfc81,0xfc8a,0xfc92,0xfc9a,0xfca2,0xfcaa,0xfcb2, -0xfcba,0xfcc2,0xfcca,0xfcd2,0xfcdb,0xfce3,0xfceb,0xfcf3, -0xfcfb,0xfd03,0xfd0b,0xfd13,0xfd1b,0xfd23,0xfd2c,0xfd34, -0xfd3c,0xfd44,0xfd4c,0xfd54,0xfd5c,0xfd64,0xfd6c,0xfd74, -0xfd7c,0xfd84,0xfd8d,0xfd95,0xfd9d,0xfda5,0xfdad,0xfdb5, -0xfdbd,0xfdc5,0xfdcd,0xfdd5,0xfddd,0xfde5,0xfded,0xfdf5, -0xfdfd,0xfe06,0xfe0e,0xfe16,0xfe1e,0xfe26,0xfe2e,0xfe36, -0xfe3e,0xfe46,0xfe4e,0xfe56,0xfe5e,0xfe66,0xfe6e,0xfe76, -0xfe7e,0xfe86,0xfe8e,0xfe97,0xfe9f,0xfea7,0xfeaf,0xfeb7, -0xfebf,0xfec7,0xfecf,0xfed7,0xfedf,0xfee7,0xfeef,0xfef7, -0xfeff,0xff07,0xff0f,0xff17,0xff1f,0xff27,0xff2f,0xff37, -0xff3f,0xff47,0xff4f,0xff57,0xff5f,0xff67,0xff6f,0xff77, -0xff7f,0xff87,0xff8f,0xff97,0xff9f,0xffa7,0xffaf,0xffb7, -0xffbf,0xffc7,0xffcf,0xffd7,0xffdf,0xffe7,0xffef,0xfff7 -]; - -const RA144_CODEBOOK1: [u16; 128] = [ - 19657, 18474, 18365, 17520, 21048, 18231, 18584, 16671, - 20363, 19069, 19409, 18430, 21844, 18753, 19613, 17411, - 20389, 21772, 20129, 21702, 20978, 20472, 19627, 19387, - 21477, 23134, 21841, 23919, 22089, 21519, 21134, 20852, - 19675, 17821, 19044, 17477, 19986, 16955, 18446, 16086, - 21138, 18899, 20952, 18929, 21452, 17833, 20104, 17159, - 19770, 20056, 20336, 20866, 19329, 18217, 18908, 18004, - 21556, 21948, 23079, 23889, 20922, 19544, 20984, 19781, - 19781, 20984, 19544, 20922, 23889, 23079, 21948, 21556, - 18004, 18908, 18217, 19329, 20866, 20336, 20056, 19770, - 17159, 20104, 17833, 21452, 18929, 20952, 18899, 21138, - 16086, 18446, 16955, 19986, 17477, 19044, 17821, 19675, - 20852, 21134, 21519, 22089, 23919, 21841, 23134, 21477, - 19387, 19627, 20472, 20978, 21702, 20129, 21772, 20389, - 17411, 19613, 18753, 21844, 18430, 19409, 19069, 20363, - 16671, 18584, 18231, 21048, 17520, 18365, 18474, 19657, -]; -const RA144_VECTORS1: [[i8; BLOCKSIZE]; 128] = [ - [ - 38, -4, 15, -4, 14, -13, 12, -11, -2, -6, - -6, -11, -45, -16, -11, -13, -7, 6, -12, 4, - -20, 3, -16, 12, -1, 12, 46, 24, 0, 33, - -3, 9, -12, -12, -8, -7, 17, -6, 0, -2, - ], [ - 60, -16, 3, -22, 10, -32, 0, -28, -17, -18, - -3, -25, -37, -23, -10, 3, 2, 3, 0, 3, - -14, 0, -14, -1, 0, 2, 32, 9, -1, 25, - 7, 13, -5, 13, 8, 1, 2, 8, -10, 6, - ], [ - 27, -12, 28, -2, 6, -7, 15, 9, -11, 1, - -13, -11, -40, 4, -29, -14, -19, -5, -23, -8, - -30, -13, -17, 0, -14, 12, 34, 20, -2, 25, - 2, -16, -4, -12, 15, 16, 29, 7, 24, 10, - ], [ - 49, -24, 16, -20, 2, -26, 2, -7, -25, -10, - -11, -25, -32, -3, -27, 2, -8, -8, -11, -9, - -24, -17, -16, -14, -13, 2, 20, 5, -4, 17, - 14, -12, 3, 13, 33, 25, 14, 23, 15, 19, - ], [ - 46, -6, 21, 8, -2, -16, -5, -8, -11, 4, - 8, 15, -24, 4, -2, -26, -3, -16, -16, -14, - -9, -2, -1, 4, 19, 7, 36, 17, 9, 13, - 0, 31, -5, -12, 7, -8, 11, -15, -13, -4, - ], [ - 68, -18, 9, -9, -6, -35, -18, -25, -26, -7, - 10, 1, -16, -3, -1, -9, 6, -19, -4, -15, - -4, -6, 0, -8, 20, -2, 23, 2, 7, 5, - 12, 35, 1, 13, 24, 0, -3, 0, -22, 4, - ], [ - 35, -14, 34, 10, -10, -10, -1, 12, -20, 12, - 0, 15, -18, 24, -20, -27, -14, -28, -27, -27, - -20, -19, -2, -8, 5, 7, 25, 13, 5, 5, - 6, 5, 2, -12, 31, 15, 23, -1, 12, 8, - ], [ - 57, -26, 22, -7, -14, -28, -14, -3, -35, 0, - 3, 1, -11, 16, -18, -10, -4, -31, -15, -28, - -14, -23, -1, -21, 7, -2, 11, -1, 3, -1, - 18, 9, 10, 13, 49, 24, 8, 14, 2, 16, - ], [ - 25, 15, 22, 11, 18, 4, 15, -22, 8, -2, - -17, -9, -48, -20, -30, -17, -16, 11, -1, 16, - 2, 10, -5, 26, -2, -4, 22, 0, 2, 10, - -6, 13, -14, 10, -23, 0, 10, -2, 1, 0, - ], [ - 47, 3, 11, -6, 15, -13, 2, -38, -6, -13, - -15, -22, -40, -28, -28, 0, -5, 8, 10, 15, - 7, 7, -4, 13, -1, -14, 9, -14, 0, 2, - 4, 18, -7, 36, -6, 8, -3, 13, -7, 8, - ], [ - 14, 7, 36, 13, 10, 10, 18, 0, 0, 5, - -25, -8, -43, 0, -48, -18, -27, 0, -12, 3, - -7, -6, -7, 13, -15, -5, 11, -3, 0, 2, - 0, -12, -6, 10, 0, 23, 22, 11, 26, 12, - ], [ - 36, -5, 24, -4, 7, -7, 6, -17, -14, -5, - -22, -22, -35, -8, -46, -1, -17, -3, 0, 2, - -2, -10, -5, 0, -14, -15, -2, -18, -2, -4, - 11, -7, 1, 36, 18, 32, 7, 27, 17, 20, - ], [ - 33, 13, 29, 24, 1, 1, -2, -18, 0, 9, - -3, 17, -27, 0, -21, -30, -12, -11, -5, -2, - 12, 4, 9, 19, 18, -9, 13, -6, 11, -8, - -2, 35, -8, 10, -7, -1, 4, -11, -10, -2, - ], [ - 55, 1, 17, 6, -1, -16, -15, -35, -15, -2, - 0, 4, -19, -8, -20, -13, -1, -14, 7, -3, - 18, 0, 10, 5, 19, -19, 0, -21, 8, -16, - 9, 39, 0, 36, 10, 7, -9, 4, -20, 5, - ], [ - 22, 5, 42, 26, -6, 8, 1, 2, -9, 17, - -10, 18, -21, 19, -39, -31, -23, -23, -16, -15, - 2, -12, 7, 6, 5, -9, 1, -10, 7, -16, - 4, 9, 0, 10, 17, 22, 16, 2, 14, 9, - ], [ - 44, -6, 30, 8, -9, -10, -11, -14, -23, 5, - -8, 4, -14, 12, -37, -14, -12, -26, -4, -16, - 8, -16, 9, -7, 6, -19, -12, -25, 5, -24, - 15, 13, 8, 36, 34, 31, 1, 18, 4, 18, - ], [ - -3, -5, -9, -7, 15, -1, 5, 13, 2, 12, - 5, 2, -21, -23, -2, -16, 0, 5, -6, 13, - -23, 3, -32, 10, -15, 8, 44, 28, 9, 37, - -2, 13, -9, -15, -12, -27, -7, -12, 0, -11, - ], [ - 18, -17, -21, -25, 11, -19, -6, -3, -11, 0, - 7, -11, -13, -31, -1, 0, 9, 1, 5, 12, - -18, 0, -31, -2, -13, -1, 30, 14, 7, 29, - 9, 18, -1, 10, 4, -18, -22, 3, -10, -2, - ], [ - -13, -13, 3, -5, 7, 4, 9, 34, -5, 20, - -2, 3, -16, -3, -20, -17, -11, -7, -17, 0, - -34, -13, -33, -2, -28, 8, 32, 24, 5, 29, - 3, -12, 0, -15, 11, -3, 3, 2, 24, 1, - ], [ - 8, -25, -8, -23, 3, -13, -3, 17, -20, 8, - 0, -10, -8, -11, -18, 0, -1, -10, -5, 0, - -28, -17, -32, -15, -26, -1, 19, 9, 3, 21, - 15, -7, 6, 9, 29, 5, -10, 17, 15, 9, - ], [ - 4, -6, -3, 5, -1, -4, -11, 16, -6, 23, - 19, 29, 0, -3, 6, -30, 3, -17, -10, -5, - -13, -2, -17, 3, 5, 3, 35, 21, 17, 17, - 2, 35, -2, -15, 3, -28, -13, -21, -13, -13, - ], [ - 26, -19, -15, -12, -5, -22, -24, 0, -21, 12, - 21, 15, 8, -11, 7, -12, 14, -20, 2, -6, - -7, -6, -16, -9, 6, -5, 21, 7, 15, 10, - 13, 39, 5, 10, 20, -19, -28, -5, -22, -5, - ], [ - -5, -15, 9, 7, -9, 2, -8, 37, -14, 31, - 11, 29, 5, 16, -11, -30, -7, -29, -21, -18, - -23, -19, -18, -9, -7, 3, 23, 17, 14, 9, - 8, 9, 6, -15, 27, -4, -2, -6, 12, -1, - ], [ - 16, -27, -2, -10, -13, -16, -20, 20, -29, 20, - 14, 16, 13, 8, -9, -13, 2, -33, -9, -19, - -17, -23, -17, -22, -6, -6, 9, 2, 12, 2, - 20, 13, 13, 10, 45, 4, -16, 8, 2, 7, - ], [ - -16, 14, -2, 8, 20, 17, 9, 2, 14, 16, - -6, 5, -24, -28, -21, -20, -8, 9, 4, 25, - -1, 11, -22, 24, -15, -8, 21, 5, 11, 14, - -5, 18, -11, 7, -27, -20, -14, -7, 1, -9, - ], [ - 6, 2, -14, -9, 16, -1, -3, -14, 0, 5, - -3, -8, -16, -36, -19, -3, 1, 6, 17, 24, - 4, 7, -21, 11, -14, -18, 7, -9, 9, 7, - 6, 22, -3, 33, -10, -11, -28, 7, -7, 0, - ], [ - -26, 6, 11, 10, 12, 23, 12, 23, 5, 24, - -13, 5, -19, -8, -38, -21, -20, -2, -6, 12, - -11, -5, -23, 11, -29, -9, 9, 0, 7, 6, - 1, -7, -2, 7, -3, 3, -2, 6, 27, 3, - ], [ - -4, -6, 0, -7, 8, 4, 0, 6, -9, 13, - -11, -7, -11, -15, -37, -4, -9, -5, 5, 11, - -5, -9, -22, -1, -27, -18, -4, -14, 5, 0, - 12, -3, 4, 32, 14, 12, -17, 22, 17, 11, - ], [ - -8, 12, 3, 21, 3, 14, -8, 5, 4, 28, - 7, 32, -2, -8, -12, -34, -4, -12, 1, 6, - 9, 4, -7, 17, 4, -13, 11, -1, 19, -4, - 0, 39, -4, 7, -11, -21, -20, -16, -10, -11, - ], [ - 13, 0, -8, 3, 0, -4, -21, -11, -9, 16, - 10, 18, 5, -16, -10, -16, 5, -15, 13, 5, - 15, 1, -6, 4, 6, -23, -2, -16, 17, -12, - 10, 44, 3, 33, 6, -12, -34, -1, -20, -3, - ], [ - -18, 4, 17, 23, -4, 20, -4, 26, -3, 36, - 0, 32, 2, 12, -29, -34, -16, -24, -10, -6, - 0, -12, -8, 4, -8, -13, 0, -6, 16, -12, - 5, 13, 3, 7, 13, 3, -8, -2, 14, 0, - ], [ - 3, -7, 5, 5, -8, 2, -17, 9, -18, 24, - 2, 19, 10, 4, -28, -17, -5, -28, 2, -7, - 4, -15, -7, -8, -6, -23, -13, -21, 14, -20, - 17, 18, 11, 33, 30, 11, -23, 13, 5, 9, - ], [ - 60, 10, 7, -1, 9, -8, 6, -13, 2, -15, - -1, -10, -13, -11, 15, 0, 6, 9, -1, 0, - -13, 1, -11, -3, -13, 21, 13, 26, -7, 31, - -10, -7, -16, -33, -31, -10, 22, -8, 1, -2, - ], [ - 82, -1, -4, -19, 6, -27, -6, -29, -12, -26, - 1, -24, -5, -18, 17, 17, 17, 6, 10, 0, - -7, -2, -9, -16, -12, 11, 0, 11, -9, 23, - 0, -3, -8, -8, -13, -1, 8, 7, -7, 6, - ], [ - 49, 2, 21, 0, 1, -2, 9, 8, -6, -6, - -8, -10, -8, 9, -2, 0, -4, -2, -13, -12, - -23, -15, -12, -16, -26, 21, 2, 21, -11, 23, - -4, -33, -7, -33, -6, 13, 34, 5, 27, 10, - ], [ - 71, -10, 9, -17, -1, -20, -3, -8, -21, -18, - -6, -24, 0, 1, 0, 16, 6, -5, 0, -13, - -17, -19, -11, -29, -25, 11, -11, 6, -13, 15, - 7, -29, 0, -8, 11, 22, 20, 21, 17, 18, - ], [ - 67, 8, 14, 11, -7, -11, -11, -9, -7, -3, - 13, 16, 8, 9, 24, -12, 10, -13, -5, -17, - -2, -4, 3, -10, 6, 17, 4, 19, 0, 11, - -6, 13, -9, -33, -14, -10, 16, -17, -10, -4, - ], [ - 90, -3, 2, -6, -10, -29, -24, -26, -21, -15, - 15, 2, 16, 1, 25, 4, 21, -16, 6, -18, - 3, -8, 5, -24, 8, 7, -9, 4, -1, 3, - 5, 18, -1, -7, 2, -1, 2, -1, -19, 3, - ], [ - 57, 0, 27, 13, -14, -5, -7, 11, -15, 4, - 5, 16, 13, 29, 6, -13, 0, -25, -16, -31, - -12, -22, 2, -23, -6, 16, -7, 14, -2, 3, - 0, -12, 0, -33, 9, 13, 28, -3, 14, 7, - ], [ - 79, -11, 15, -4, -18, -23, -20, -5, -30, -7, - 7, 2, 21, 21, 8, 3, 10, -28, -4, -31, - -6, -25, 3, -37, -4, 7, -20, 0, -4, -4, - 11, -7, 6, -8, 27, 22, 14, 12, 5, 16, - ], [ - 47, 30, 15, 14, 14, 9, 9, -23, 13, -10, - -12, -7, -16, -15, -3, -3, -1, 14, 9, 12, - 9, 8, 0, 10, -14, 4, -9, 2, -5, 8, - -13, -3, -18, -10, -45, -3, 16, -4, 4, 0, - ], [ - 69, 17, 3, -3, 10, -8, -3, -40, -1, -21, - -10, -21, -8, -23, -1, 13, 8, 11, 21, 11, - 15, 4, 0, -2, -13, -5, -23, -12, -7, 0, - -1, 0, -10, 14, -28, 5, 1, 11, -5, 7, - ], [ - 36, 21, 28, 16, 6, 16, 12, -2, 4, -2, - -20, -7, -11, 4, -20, -4, -12, 2, -1, 0, - 0, -8, -2, -2, -27, 4, -21, -2, -9, 0, - -6, -29, -9, -10, -21, 21, 28, 10, 29, 11, - ], [ - 58, 9, 16, -1, 2, -2, 0, -19, -10, -13, - -17, -21, -3, -3, -19, 12, -2, 0, 10, -1, - 5, -12, 0, -15, -26, -5, -34, -16, -11, -7, - 4, -25, -2, 14, -3, 29, 13, 25, 20, 20, - ], [ - 55, 28, 21, 27, -2, 7, -8, -20, 4, 1, - 1, 18, 5, 4, 5, -16, 2, -8, 5, -5, - 19, 2, 14, 3, 6, 0, -18, -4, 2, -11, - -8, 18, -11, -10, -29, -3, 10, -13, -8, -3, - ], [ - 77, 16, 9, 9, -6, -11, -21, -37, -10, -10, - 4, 5, 13, -3, 7, 0, 13, -11, 17, -6, - 25, -1, 15, -9, 7, -9, -32, -19, 0, -18, - 2, 22, -3, 15, -12, 5, -4, 2, -17, 5, - ], [ - 44, 20, 34, 29, -10, 13, -4, 0, -4, 9, - -5, 19, 10, 24, -11, -17, -8, -20, -5, -19, - 9, -14, 12, -9, -6, 0, -30, -9, 0, -19, - -2, -7, -2, -10, -5, 20, 21, 1, 17, 9, - ], [ - 66, 8, 23, 11, -14, -5, -17, -16, -19, -2, - -3, 5, 18, 17, -10, 0, 1, -23, 6, -20, - 15, -18, 14, -22, -5, -10, -44, -23, -2, -26, - 9, -3, 4, 14, 12, 29, 7, 16, 7, 18, - ], [ - 18, 9, -17, -4, 11, 3, 0, 11, 7, 4, - 10, 3, 10, -18, 24, -3, 14, 7, 4, 10, - -16, 1, -27, -4, -27, 17, 12, 30, 0, 35, - -9, -3, -12, -36, -35, -30, -2, -13, 2, -11, - ], [ - 40, -2, -29, -22, 7, -14, -12, -5, -7, -7, - 12, -9, 18, -26, 26, 14, 24, 4, 16, 9, - -10, -2, -26, -18, -26, 7, -1, 15, -1, 27, - 2, 0, -4, -11, -17, -21, -16, 1, -7, -3, - ], [ - 8, 1, -3, -2, 3, 10, 3, 32, -1, 12, - 2, 4, 15, 1, 7, -3, 2, -4, -6, -3, - -26, -15, -29, -17, -40, 17, 0, 26, -2, 27, - -2, -29, -4, -36, -10, -6, 9, 0, 27, 0, - ], [ - 30, -11, -15, -20, 0, -8, -9, 15, -15, 0, - 5, -9, 23, -6, 8, 13, 13, -7, 5, -3, - -20, -19, -27, -31, -39, 7, -13, 11, -4, 19, - 8, -25, 3, -11, 7, 2, -4, 16, 18, 9, - ], [ - 26, 7, -11, 8, -5, 1, -17, 14, -1, 15, - 24, 30, 32, 1, 33, -16, 18, -14, 0, -8, - -6, -4, -12, -12, -6, 13, 2, 23, 8, 15, - -4, 17, -5, -36, -18, -30, -8, -22, -10, -14, - ], [ - 48, -4, -23, -9, -9, -17, -30, -2, -16, 3, - 26, 16, 40, -6, 35, 1, 28, -17, 12, -9, - 0, -8, -11, -25, -5, 3, -10, 8, 6, 7, - 6, 22, 1, -11, -1, -21, -22, -7, -19, -5, - ], [ - 15, 0, 2, 10, -13, 7, -14, 35, -10, 23, - 16, 31, 37, 21, 16, -17, 6, -26, -10, -21, - -16, -21, -13, -25, -19, 13, -8, 19, 5, 7, - 1, -8, 2, -36, 5, -6, 3, -8, 15, -1, - ], [ - 37, -12, -9, -7, -17, -11, -26, 18, -25, 12, - 19, 17, 45, 14, 17, 0, 17, -30, 1, -22, - -10, -25, -12, -38, -18, 3, -22, 4, 3, 0, - 13, -3, 10, -11, 23, 2, -10, 7, 5, 7, - ], [ - 5, 29, -9, 11, 15, 22, 3, 0, 18, 8, - -1, 6, 7, -23, 6, -6, 5, 12, 15, 21, - 5, 8, -17, 9, -28, 0, -11, 6, 2, 12, - -11, 0, -14, -13, -49, -22, -8, -9, 4, -9, - ], [ - 27, 16, -21, -6, 12, 3, -9, -16, 3, -2, - 1, -7, 15, -31, 7, 10, 16, 9, 27, 21, - 11, 5, -16, -3, -26, -9, -24, -7, 0, 4, - 0, 4, -6, 11, -32, -14, -23, 6, -5, -1, - ], [ - -4, 20, 3, 13, 8, 28, 6, 21, 10, 16, - -8, 7, 12, -3, -11, -7, -5, 0, 4, 8, - -4, -8, -18, -3, -41, 0, -22, 2, 0, 4, - -5, -25, -6, -14, -25, 1, 2, 4, 29, 2, - ], [ - 17, 8, -8, -4, 4, 10, -6, 5, -4, 5, - -6, -6, 20, -10, -9, 9, 4, -2, 16, 7, - 1, -12, -17, -16, -39, -9, -36, -12, -2, -3, - 6, -21, 1, 11, -7, 10, -11, 20, 20, 11, - ], [ - 13, 27, -3, 24, -1, 19, -14, 3, 9, 20, - 12, 33, 29, -3, 15, -20, 9, -9, 11, 3, - 16, 2, -2, 2, -7, -3, -20, 0, 10, -7, - -7, 22, -7, -13, -33, -23, -14, -18, -7, -12, - ], [ - 35, 15, -15, 6, -4, 1, -27, -12, -5, 8, - 15, 19, 37, -11, 16, -2, 20, -12, 23, 2, - 22, -1, -1, -11, -5, -13, -34, -14, 8, -14, - 4, 26, 0, 11, -16, -14, -29, -2, -17, -3, - ], [ - 3, 19, 9, 26, -8, 26, -10, 24, 0, 28, - 5, 33, 34, 17, -2, -20, -1, -22, 0, -10, - 6, -14, -3, -10, -20, -4, -32, -4, 7, -15, - 0, -3, 0, -13, -9, 0, -3, -4, 17, 0, - ], [ - 25, 7, -2, 8, -12, 7, -23, 8, -13, 16, - 7, 20, 42, 9, 0, -3, 9, -25, 12, -10, - 12, -18, -2, -24, -19, -13, -46, -19, 5, -22, - 10, 0, 8, 11, 8, 9, -17, 11, 7, 8, - ], [ - -25, -7, 2, -8, 12, -7, 23, -8, 13, -16, - -7, -20, -42, -9, 0, 3, -9, 25, -12, 10, - -12, 18, 2, 24, 19, 13, 46, 19, -5, 22, - -10, 0, -8, -11, -8, -9, 17, -11, -7, -8, - ], [ - -3, -19, -9, -26, 8, -26, 10, -24, 0, -28, - -5, -33, -34, -17, 2, 20, 1, 22, 0, 10, - -6, 14, 3, 10, 20, 4, 32, 4, -7, 15, - 0, 3, 0, 13, 9, 0, 3, 4, -17, 0, - ], [ - -35, -15, 15, -6, 4, -1, 27, 12, 5, -8, - -15, -19, -37, 11, -16, 2, -20, 12, -23, -2, - -22, 1, 1, 11, 5, 13, 34, 14, -8, 14, - -4, -26, 0, -11, 16, 14, 29, 2, 17, 3, - ], [ - -13, -27, 3, -24, 1, -19, 14, -3, -9, -20, - -12, -33, -29, 3, -15, 20, -9, 9, -11, -3, - -16, -2, 2, -2, 7, 3, 20, 0, -10, 7, - 7, -22, 7, 13, 33, 23, 14, 18, 7, 12, - ], [ - -17, -8, 8, 4, -4, -10, 6, -5, 4, -5, - 6, 6, -20, 10, 9, -9, -4, 2, -16, -7, - -1, 12, 17, 16, 39, 9, 36, 12, 2, 3, - -6, 21, -1, -11, 7, -10, 11, -20, -20, -11, - ], [ - 4, -20, -3, -13, -8, -28, -6, -21, -10, -16, - 8, -7, -12, 3, 11, 7, 5, 0, -4, -8, - 4, 8, 18, 3, 41, 0, 22, -2, 0, -4, - 5, 25, 6, 14, 25, -1, -2, -4, -29, -2, - ], [ - -27, -16, 21, 6, -12, -3, 9, 16, -3, 2, - -1, 7, -15, 31, -7, -10, -16, -9, -27, -21, - -11, -5, 16, 3, 26, 9, 24, 7, 0, -4, - 0, -4, 6, -11, 32, 14, 23, -6, 5, 1, - ], [ - -5, -29, 9, -11, -15, -22, -3, 0, -18, -8, - 1, -6, -7, 23, -6, 6, -5, -12, -15, -21, - -5, -8, 17, -9, 28, 0, 11, -6, -2, -12, - 11, 0, 14, 13, 49, 22, 8, 9, -4, 9, - ], [ - -37, 12, 9, 7, 17, 11, 26, -18, 25, -12, - -19, -17, -45, -14, -17, 0, -17, 30, -1, 22, - 10, 25, 12, 38, 18, -3, 22, -4, -3, 0, - -13, 3, -10, 11, -23, -2, 10, -7, -5, -7, - ], [ - -15, 0, -2, -10, 13, -7, 14, -35, 10, -23, - -16, -31, -37, -21, -16, 17, -6, 26, 10, 21, - 16, 21, 13, 25, 19, -13, 8, -19, -5, -7, - -1, 8, -2, 36, -5, 6, -3, 8, -15, 1, - ], [ - -48, 4, 23, 9, 9, 17, 30, 2, 16, -3, - -26, -16, -40, 6, -35, -1, -28, 17, -12, 9, - 0, 8, 11, 25, 5, -3, 10, -8, -6, -7, - -6, -22, -1, 11, 1, 21, 22, 7, 19, 5, - ], [ - -26, -7, 11, -8, 5, -1, 17, -14, 1, -15, - -24, -30, -32, -1, -33, 16, -18, 14, 0, 8, - 6, 4, 12, 12, 6, -13, -2, -23, -8, -15, - 4, -17, 5, 36, 18, 30, 8, 22, 10, 14, - ], [ - -30, 11, 15, 20, 0, 8, 9, -15, 15, 0, - -5, 9, -23, 6, -8, -13, -13, 7, -5, 3, - 20, 19, 27, 31, 39, -7, 13, -11, 4, -19, - -8, 25, -3, 11, -7, -2, 4, -16, -18, -9, - ], [ - -8, -1, 3, 2, -3, -10, -3, -32, 1, -12, - -2, -4, -15, -1, -7, 3, -2, 4, 6, 3, - 26, 15, 29, 17, 40, -17, 0, -26, 2, -27, - 2, 29, 4, 36, 10, 6, -9, 0, -27, 0, - ], [ - -40, 2, 29, 22, -7, 14, 12, 5, 7, 7, - -12, 9, -18, 26, -26, -14, -24, -4, -16, -9, - 10, 2, 26, 18, 26, -7, 1, -15, 1, -27, - -2, 0, 4, 11, 17, 21, 16, -1, 7, 3, - ], [ - -18, -9, 17, 4, -11, -3, 0, -11, -7, -4, - -10, -3, -10, 18, -24, 3, -14, -7, -4, -10, - 16, -1, 27, 4, 27, -17, -12, -30, 0, -35, - 9, 3, 12, 36, 35, 30, 2, 13, -2, 11, - ], [ - -66, -8, -23, -11, 14, 5, 17, 16, 19, 2, - 3, -5, -18, -17, 10, 0, -1, 23, -6, 20, - -15, 18, -14, 22, 5, 10, 44, 23, 2, 26, - -9, 3, -4, -14, -12, -29, -7, -16, -7, -18, - ], [ - -44, -20, -34, -29, 10, -13, 4, 0, 4, -9, - 5, -19, -10, -24, 11, 17, 8, 20, 5, 19, - -9, 14, -12, 9, 6, 0, 30, 9, 0, 19, - 2, 7, 2, 10, 5, -20, -21, -1, -17, -9, - ], [ - -77, -16, -9, -9, 6, 11, 21, 37, 10, 10, - -4, -5, -13, 3, -7, 0, -13, 11, -17, 6, - -25, 1, -15, 9, -7, 9, 32, 19, 0, 18, - -2, -22, 3, -15, 12, -5, 4, -2, 17, -5, - ], [ - -55, -28, -21, -27, 2, -7, 8, 20, -4, -1, - -1, -18, -5, -4, -5, 16, -2, 8, -5, 5, - -19, -2, -14, -3, -6, 0, 18, 4, -2, 11, - 8, -18, 11, 10, 29, 3, -10, 13, 8, 3, - ], [ - -58, -9, -16, 1, -2, 2, 0, 19, 10, 13, - 17, 21, 3, 3, 19, -12, 2, 0, -10, 1, - -5, 12, 0, 15, 26, 5, 34, 16, 11, 7, - -4, 25, 2, -14, 3, -29, -13, -25, -20, -20, - ], [ - -36, -21, -28, -16, -6, -16, -12, 2, -4, 2, - 20, 7, 11, -4, 20, 4, 12, -2, 1, 0, - 0, 8, 2, 2, 27, -4, 21, 2, 9, 0, - 6, 29, 9, 10, 21, -21, -28, -10, -29, -11, - ], [ - -69, -17, -3, 3, -10, 8, 3, 40, 1, 21, - 10, 21, 8, 23, 1, -13, -8, -11, -21, -11, - -15, -4, 0, 2, 13, 5, 23, 12, 7, 0, - 1, 0, 10, -14, 28, -5, -1, -11, 5, -7, - ], [ - -47, -30, -15, -14, -14, -9, -9, 23, -13, 10, - 12, 7, 16, 15, 3, 3, 1, -14, -9, -12, - -9, -8, 0, -10, 14, -4, 9, -2, 5, -8, - 13, 3, 18, 10, 45, 3, -16, 4, -4, 0, - ], [ - -79, 11, -15, 4, 18, 23, 20, 5, 30, 7, - -7, -2, -21, -21, -8, -3, -10, 28, 4, 31, - 6, 25, -3, 37, 4, -7, 20, 0, 4, 4, - -11, 7, -6, 8, -27, -22, -14, -12, -5, -16, - ], [ - -57, 0, -27, -13, 14, 5, 7, -11, 15, -4, - -5, -16, -13, -29, -6, 13, 0, 25, 16, 31, - 12, 22, -2, 23, 6, -16, 7, -14, 2, -3, - 0, 12, 0, 33, -9, -13, -28, 3, -14, -7, - ], [ - -90, 3, -2, 6, 10, 29, 24, 26, 21, 15, - -15, -2, -16, -1, -25, -4, -21, 16, -6, 18, - -3, 8, -5, 24, -8, -7, 9, -4, 1, -3, - -5, -18, 1, 7, -2, 1, -2, 1, 19, -3, - ], [ - -67, -8, -14, -11, 7, 11, 11, 9, 7, 3, - -13, -16, -8, -9, -24, 12, -10, 13, 5, 17, - 2, 4, -3, 10, -6, -17, -4, -19, 0, -11, - 6, -13, 9, 33, 14, 10, -16, 17, 10, 4, - ], [ - -71, 10, -9, 17, 1, 20, 3, 8, 21, 18, - 6, 24, 0, -1, 0, -16, -6, 5, 0, 13, - 17, 19, 11, 29, 25, -11, 11, -6, 13, -15, - -7, 29, 0, 8, -11, -22, -20, -21, -17, -18, - ], [ - -49, -2, -21, 0, -1, 2, -9, -8, 6, 6, - 8, 10, 8, -9, 2, 0, 4, 2, 13, 12, - 23, 15, 12, 16, 26, -21, -2, -21, 11, -23, - 4, 33, 7, 33, 6, -13, -34, -5, -27, -10, - ], [ - -82, 1, 4, 19, -6, 27, 6, 29, 12, 26, - -1, 24, 5, 18, -17, -17, -17, -6, -10, 0, - 7, 2, 9, 16, 12, -11, 0, -11, 9, -23, - 0, 3, 8, 8, 13, 1, -8, -7, 7, -6, - ], [ - -60, -10, -7, 1, -9, 8, -6, 13, -2, 15, - 1, 10, 13, 11, -15, 0, -6, -9, 1, 0, - 13, -1, 11, 3, 13, -21, -13, -26, 7, -31, - 10, 7, 16, 33, 31, 10, -22, 8, -1, 2, - ], [ - -3, 7, -5, -5, 8, -2, 17, -9, 18, -24, - -2, -19, -10, -4, 28, 17, 5, 28, -2, 7, - -4, 15, 7, 8, 6, 23, 13, 21, -14, 20, - -17, -18, -11, -33, -30, -11, 23, -13, -5, -9, - ], [ - 18, -4, -17, -23, 4, -20, 4, -26, 3, -36, - 0, -32, -2, -12, 29, 34, 16, 24, 10, 6, - 0, 12, 8, -4, 8, 13, 0, 6, -16, 12, - -5, -13, -3, -7, -13, -3, 8, 2, -14, 0, - ], [ - -13, 0, 8, -3, 0, 4, 21, 11, 9, -16, - -10, -18, -5, 16, 10, 16, -5, 15, -13, -5, - -15, -1, 6, -4, -6, 23, 2, 16, -17, 12, - -10, -44, -3, -33, -6, 12, 34, 1, 20, 3, - ], [ - 8, -12, -3, -21, -3, -14, 8, -5, -4, -28, - -7, -32, 2, 8, 12, 34, 4, 12, -1, -6, - -9, -4, 7, -17, -4, 13, -11, 1, -19, 4, - 0, -39, 4, -7, 11, 21, 20, 16, 10, 11, - ], [ - 4, 6, 0, 7, -8, -4, 0, -6, 9, -13, - 11, 7, 11, 15, 37, 4, 9, 5, -5, -11, - 5, 9, 22, 1, 27, 18, 4, 14, -5, 0, - -12, 3, -4, -32, -14, -12, 17, -22, -17, -11, - ], [ - 26, -6, -11, -10, -12, -23, -12, -23, -5, -24, - 13, -5, 19, 8, 38, 21, 20, 2, 6, -12, - 11, 5, 23, -11, 29, 9, -9, 0, -7, -6, - -1, 7, 2, -7, 3, -3, 2, -6, -27, -3, - ], [ - -6, -2, 14, 9, -16, 1, 3, 14, 0, -5, - 3, 8, 16, 36, 19, 3, -1, -6, -17, -24, - -4, -7, 21, -11, 14, 18, -7, 9, -9, -7, - -6, -22, 3, -33, 10, 11, 28, -7, 7, 0, - ], [ - 16, -14, 2, -8, -20, -17, -9, -2, -14, -16, - 6, -5, 24, 28, 21, 20, 8, -9, -4, -25, - 1, -11, 22, -24, 15, 8, -21, -5, -11, -14, - 5, -18, 11, -7, 27, 20, 14, 7, -1, 9, - ], [ - -16, 27, 2, 10, 13, 16, 20, -20, 29, -20, - -14, -16, -13, -8, 9, 13, -2, 33, 9, 19, - 17, 23, 17, 22, 6, 6, -9, -2, -12, -2, - -20, -13, -13, -10, -45, -4, 16, -8, -2, -7, - ], [ - 5, 15, -9, -7, 9, -2, 8, -37, 14, -31, - -11, -29, -5, -16, 11, 30, 7, 29, 21, 18, - 23, 19, 18, 9, 7, -3, -23, -17, -14, -9, - -8, -9, -6, 15, -27, 4, 2, 6, -12, 1, - ], [ - -26, 19, 15, 12, 5, 22, 24, 0, 21, -12, - -21, -15, -8, 11, -7, 12, -14, 20, -2, 6, - 7, 6, 16, 9, -6, 5, -21, -7, -15, -10, - -13, -39, -5, -10, -20, 19, 28, 5, 22, 5, - ], [ - -4, 6, 3, -5, 1, 4, 11, -16, 6, -23, - -19, -29, 0, 3, -6, 30, -3, 17, 10, 5, - 13, 2, 17, -3, -5, -3, -35, -21, -17, -17, - -2, -35, 2, 15, -3, 28, 13, 21, 13, 13, - ], [ - -8, 25, 8, 23, -3, 13, 3, -17, 20, -8, - 0, 10, 8, 11, 18, 0, 1, 10, 5, 0, - 28, 17, 32, 15, 26, 1, -19, -9, -3, -21, - -15, 7, -6, -9, -29, -5, 10, -17, -15, -9, - ], [ - 13, 13, -3, 5, -7, -4, -9, -34, 5, -20, - 2, -3, 16, 3, 20, 17, 11, 7, 17, 0, - 34, 13, 33, 2, 28, -8, -32, -24, -5, -29, - -3, 12, 0, 15, -11, 3, -3, -2, -24, -1, - ], [ - -18, 17, 21, 25, -11, 19, 6, 3, 11, 0, - -7, 11, 13, 31, 1, 0, -9, -1, -5, -12, - 18, 0, 31, 2, 13, 1, -30, -14, -7, -29, - -9, -18, 1, -10, -4, 18, 22, -3, 10, 2, - ], [ - 3, 5, 9, 7, -15, 1, -5, -13, -2, -12, - -5, -2, 21, 23, 2, 16, 0, -5, 6, -13, - 23, -3, 32, -10, 15, -8, -44, -28, -9, -37, - 2, -13, 9, 15, 12, 27, 7, 12, 0, 11, - ], [ - -44, 6, -30, -8, 9, 10, 11, 14, 23, -5, - 8, -4, 14, -12, 37, 14, 12, 26, 4, 16, - -8, 16, -9, 7, -6, 19, 12, 25, -5, 24, - -15, -13, -8, -36, -34, -31, -1, -18, -4, -18, - ], [ - -22, -5, -42, -26, 6, -8, -1, -2, 9, -17, - 10, -18, 21, -19, 39, 31, 23, 23, 16, 15, - -2, 12, -7, -6, -5, 9, -1, 10, -7, 16, - -4, -9, 0, -10, -17, -22, -16, -2, -14, -9, - ], [ - -55, -1, -17, -6, 1, 16, 15, 35, 15, 2, - 0, -4, 19, 8, 20, 13, 1, 14, -7, 3, - -18, 0, -10, -5, -19, 19, 0, 21, -8, 16, - -9, -39, 0, -36, -10, -7, 9, -4, 20, -5, - ], [ - -33, -13, -29, -24, -1, -1, 2, 18, 0, -9, - 3, -17, 27, 0, 21, 30, 12, 11, 5, 2, - -12, -4, -9, -19, -18, 9, -13, 6, -11, 8, - 2, -35, 8, -10, 7, 1, -4, 11, 10, 2, - ], [ - -36, 5, -24, 4, -7, 7, -6, 17, 14, 5, - 22, 22, 35, 8, 46, 1, 17, 3, 0, -2, - 2, 10, 5, 0, 14, 15, 2, 18, 2, 4, - -11, 7, -1, -36, -18, -32, -7, -27, -17, -20, - ], [ - -14, -7, -36, -13, -10, -10, -18, 0, 0, -5, - 25, 8, 43, 0, 48, 18, 27, 0, 12, -3, - 7, 6, 7, -13, 15, 5, -11, 3, 0, -2, - 0, 12, 6, -10, 0, -23, -22, -11, -26, -12, - ], [ - -47, -3, -11, 6, -15, 13, -2, 38, 6, 13, - 15, 22, 40, 28, 28, 0, 5, -8, -10, -15, - -7, -7, 4, -13, 1, 14, -9, 14, 0, -2, - -4, -18, 7, -36, 6, -8, 3, -13, 7, -8, - ], [ - -25, -15, -22, -11, -18, -4, -15, 22, -8, 2, - 17, 9, 48, 20, 30, 17, 16, -11, 1, -16, - -2, -10, 5, -26, 2, 4, -22, 0, -2, -10, - 6, -13, 14, -10, 23, 0, -10, 2, -1, 0, - ], [ - -57, 26, -22, 7, 14, 28, 14, 3, 35, 0, - -3, -1, 11, -16, 18, 10, 4, 31, 15, 28, - 14, 23, 1, 21, -7, 2, -11, 1, -3, 1, - -18, -9, -10, -13, -49, -24, -8, -14, -2, -16, - ], [ - -35, 14, -34, -10, 10, 10, 1, -12, 20, -12, - 0, -15, 18, -24, 20, 27, 14, 28, 27, 27, - 20, 19, 2, 8, -5, -7, -25, -13, -5, -5, - -6, -5, -2, 12, -31, -15, -23, 1, -12, -8, - ], [ - -68, 18, -9, 9, 6, 35, 18, 25, 26, 7, - -10, -1, 16, 3, 1, 9, -6, 19, 4, 15, - 4, 6, 0, 8, -20, 2, -23, -2, -7, -5, - -12, -35, -1, -13, -24, 0, 3, 0, 22, -4, - ], [ - -46, 6, -21, -8, 2, 16, 5, 8, 11, -4, - -8, -15, 24, -4, 2, 26, 3, 16, 16, 14, - 9, 2, 1, -4, -19, -7, -36, -17, -9, -13, - 0, -31, 5, 12, -7, 8, -11, 15, 13, 4, - ], [ - -49, 24, -16, 20, -2, 26, -2, 7, 25, 10, - 11, 25, 32, 3, 27, -2, 8, 8, 11, 9, - 24, 17, 16, 14, 13, -2, -20, -5, 4, -17, - -14, 12, -3, -13, -33, -25, -14, -23, -15, -19, - ], [ - -27, 12, -28, 2, -6, 7, -15, -9, 11, -1, - 13, 11, 40, -4, 29, 14, 19, 5, 23, 8, - 30, 13, 17, 0, 14, -12, -34, -20, 2, -25, - -2, 16, 4, 12, -15, -16, -29, -7, -24, -10, - ], [ - -60, 16, -3, 22, -10, 32, 0, 28, 17, 18, - 3, 25, 37, 23, 10, -3, -2, -3, 0, -3, - 14, 0, 14, 1, 0, -2, -32, -9, 1, -25, - -7, -13, 5, -13, -8, -1, -2, -8, 10, -6, - ], [ - -38, 4, -15, 4, -14, 13, -12, 11, 2, 6, - 6, 11, 45, 16, 11, 13, 7, -6, 12, -4, - 20, -3, 16, -12, 1, -12, -46, -24, 0, -33, - 3, -9, 12, 12, 8, 7, -17, 6, 0, 2 - ] -]; -const RA144_CODEBOOK2: [u16; 128] = [ - 12174, 13380, 13879, 13832, 13170, 13227, 13204, 12053, - 12410, 13988, 14348, 14631, 13100, 13415, 13224, 12268, - 11982, 13825, 13499, 14210, 13877, 14788, 13811, 13109, - 11449, 13275, 12833, 13717, 12728, 13696, 12759, 12405, - 10230, 12185, 11628, 13161, 11762, 13458, 12312, 12818, - 10443, 12773, 12011, 14020, 11818, 13825, 12453, 13226, - 10446, 13162, 11881, 14300, 12859, 16288, 13490, 15053, - 10155, 12820, 11519, 13973, 12041, 15081, 12635, 14198, - 14198, 12635, 15081, 12041, 13973, 11519, 12820, 10155, - 15053, 13490, 16288, 12859, 14300, 11881, 13162, 10446, - 13226, 12453, 13825, 11818, 14020, 12011, 12773, 10443, - 12818, 12312, 13458, 11762, 13161, 11628, 12185, 10230, - 12405, 12759, 13696, 12728, 13717, 12833, 13275, 11449, - 13109, 13811, 14788, 13877, 14210, 13499, 13825, 11982, - 12268, 13224, 13415, 13100, 14631, 14348, 13988, 12410, - 12053, 13204, 13227, 13170, 13832, 13879, 13380, 12174, -]; -const RA144_VECTORS2: [[i8; BLOCKSIZE]; 128] = [ - [ - 73, -32, -60, -15, -26, 59, 2, -33, 30, -10, - -3, -17, 8, 30, -1, -26, -4, -22, 10, 16, - -36, -5, -11, 56, 37, 6, -10, -5, -13, -3, - 6, -5, 11, 4, -19, -5, -16, 41, 24, 13, - ], [ - 4, -11, -37, 23, -5, 46, -2, -29, -5, -39, - -21, -9, 0, 49, 12, -9, -16, -26, 22, 15, - -45, -20, -5, 40, 22, 17, -26, 31, -14, 2, - -14, 10, 30, 20, -27, -9, -39, 39, 18, 5, - ], [ - 34, -25, -48, -28, -11, 34, -2, -41, 9, -7, - -17, 21, 20, 24, -17, -33, 0, -24, 10, 42, - 3, -5, 10, 42, 11, 8, -3, 3, 16, 9, - 22, -2, 0, -33, -10, 18, 7, 58, 10, 28, - ], [ - -34, -4, -25, 10, 9, 21, -7, -36, -26, -36, - -35, 28, 12, 42, -3, -16, -12, -28, 21, 42, - -5, -21, 16, 26, -4, 19, -19, 39, 15, 15, - 1, 13, 19, -17, -17, 14, -15, 55, 4, 19, - ], [ - 28, -20, -51, -14, -6, 7, 0, -26, 27, -4, - 18, -40, -6, 16, -1, -15, 0, -55, -5, -16, - -19, 14, -3, 49, 14, 1, -22, -30, -12, 0, - 24, 15, 9, -17, -45, -29, 4, 28, 51, 35, - ], [ - -40, 0, -28, 24, 14, -5, -4, -21, -7, -33, - 0, -32, -15, 35, 12, 1, -11, -58, 5, -16, - -28, 0, 1, 33, 0, 11, -39, 5, -14, 6, - 3, 31, 28, -1, -53, -33, -19, 25, 46, 26, - ], [ - -11, -14, -39, -27, 9, -17, -4, -33, 6, 0, - 4, -1, 5, 10, -17, -22, 5, -57, -5, 9, - 20, 13, 18, 35, -11, 3, -16, -22, 17, 13, - 40, 19, -1, -55, -35, -5, 27, 44, 37, 49, - ], [ - -80, 6, -16, 11, 30, -30, -9, -28, -28, -29, - -13, 6, -2, 28, -3, -5, -7, -60, 5, 9, - 11, -1, 24, 19, -27, 13, -32, 13, 15, 19, - 19, 35, 17, -39, -43, -9, 4, 42, 32, 41, - ], [ - 78, -21, -43, 4, -38, 17, 17, -5, 55, 24, - -15, -36, 14, 4, 24, -24, 12, 5, 17, 31, - -54, -5, -2, 27, 43, -12, 2, 9, -9, -15, - 22, -3, 28, 21, -20, 3, 20, 28, 9, -5, - ], [ - 9, -1, -20, 43, -17, 3, 12, 0, 20, -4, - -33, -29, 6, 22, 38, -7, 0, 1, 29, 30, - -63, -21, 3, 11, 27, -1, -14, 45, -10, -9, - 1, 12, 47, 37, -28, 0, -2, 26, 4, -13, - ], [ - 39, -14, -30, -8, -22, -8, 12, -12, 34, 27, - -29, 2, 26, -2, 8, -31, 16, 3, 17, 57, - -14, -6, 19, 13, 16, -10, 8, 17, 20, -2, - 38, 0, 17, -16, -11, 27, 44, 45, -4, 8, - ], [ - -29, 5, -7, 30, -1, -21, 7, -7, 0, 0, - -47, 9, 18, 15, 22, -14, 4, 0, 28, 57, - -23, -21, 25, -2, 1, 0, -7, 53, 19, 3, - 17, 15, 36, 0, -19, 24, 21, 43, -9, 0, - ], [ - 33, -10, -34, 5, -17, -35, 15, 1, 53, 30, - 6, -59, 0, -10, 24, -13, 17, -27, 1, -1, - -37, 13, 4, 20, 20, -18, -10, -16, -8, -11, - 39, 18, 26, 0, -46, -20, 41, 15, 37, 15, - ], [ - -35, 10, -11, 44, 3, -48, 10, 6, 17, 2, - -11, -51, -8, 8, 38, 3, 4, -31, 12, -2, - -46, -1, 10, 4, 5, -7, -26, 19, -10, -5, - 18, 34, 45, 15, -54, -24, 18, 13, 31, 7, - ], [ - -5, -3, -21, -7, -2, -60, 10, -5, 32, 34, - -7, -20, 11, -16, 8, -20, 21, -29, 1, 24, - 2, 13, 27, 6, -5, -15, -3, -8, 21, 1, - 55, 21, 15, -38, -37, 3, 65, 32, 23, 30, - ], [ - -74, 17, 0, 31, 18, -73, 5, 0, -3, 5, - -25, -12, 3, 1, 22, -3, 9, -33, 12, 24, - -6, -2, 33, -9, -21, -5, -20, 27, 19, 7, - 34, 37, 34, -22, -44, 0, 41, 29, 17, 21, - ], [ - 76, -35, -31, -28, -49, 43, -40, 0, 29, -14, - 8, 5, 10, 18, -26, -46, 0, 7, 6, 3, - -25, -7, -2, 40, 28, 14, 18, -3, -27, -28, - -8, -45, -13, 34, -13, -27, -15, 31, 12, 3, - ], [ - 7, -15, -9, 9, -28, 29, -45, 5, -6, -43, - -9, 12, 2, 36, -12, -30, -11, 3, 17, 3, - -34, -22, 3, 24, 12, 24, 2, 32, -28, -22, - -29, -29, 5, 50, -21, -31, -38, 29, 7, -5, - ], [ - 36, -29, -19, -41, -34, 18, -45, -6, 8, -10, - -5, 43, 23, 11, -42, -53, 5, 5, 6, 30, - 14, -8, 20, 26, 1, 16, 25, 4, 3, -15, - 7, -41, -23, -3, -4, -3, 8, 48, -1, 17, - ], [ - -32, -8, 3, -2, -13, 4, -50, -1, -27, -39, - -23, 51, 15, 30, -27, -37, -7, 1, 17, 29, - 5, -23, 25, 10, -14, 26, 8, 41, 1, -9, - -13, -26, -5, 12, -12, -7, -14, 45, -6, 9, - ], [ - 31, -24, -23, -27, -29, -9, -43, 8, 26, -7, - 30, -17, -4, 3, -26, -35, 5, -24, -10, -28, - -9, 12, 5, 33, 5, 8, 5, -29, -26, -24, - 9, -23, -14, 12, -39, -52, 5, 18, 39, 24, - ], [ - -37, -3, 0, 10, -7, -22, -48, 12, -8, -36, - 12, -9, -12, 22, -12, -19, -6, -28, 0, -29, - -18, -3, 11, 17, -10, 18, -10, 7, -27, -18, - -11, -7, 3, 28, -47, -55, -18, 15, 34, 16, - ], [ - -8, -17, -10, -40, -13, -34, -47, 0, 5, -4, - 16, 21, 8, -2, -42, -43, 10, -26, -10, -2, - 31, 11, 27, 19, -21, 10, 12, -20, 3, -11, - 25, -20, -25, -25, -29, -28, 28, 34, 25, 38, - ], [ - -77, 2, 11, -1, 7, -47, -52, 5, -29, -33, - -1, 28, 0, 15, -28, -26, -2, -30, 0, -2, - 22, -4, 33, 3, -36, 21, -3, 15, 2, -5, - 4, -4, -6, -9, -37, -31, 5, 32, 20, 30, - ], [ - 81, -25, -14, -8, -61, 0, -25, 28, 54, 20, - -3, -14, 17, -8, 0, -44, 16, 35, 13, 18, - -43, -7, 6, 11, 33, -4, 30, 11, -22, -40, - 6, -43, 3, 50, -14, -18, 22, 18, -1, -16, - ], [ - 12, -4, 8, 29, -39, -12, -30, 33, 19, -8, - -21, -6, 8, 9, 13, -28, 4, 31, 24, 18, - -52, -23, 12, -4, 18, 5, 14, 47, -24, -34, - -14, -27, 22, 66, -22, -22, -1, 16, -6, -24, - ], [ - 41, -18, -2, -21, -45, -24, -30, 21, 33, 24, - -17, 24, 29, -15, -16, -51, 21, 33, 13, 45, - -3, -8, 28, -2, 7, -2, 37, 19, 7, -27, - 22, -39, -7, 12, -5, 5, 45, 35, -15, -1, - ], [ - -27, 1, 20, 17, -24, -38, -35, 26, -1, -4, - -35, 32, 21, 3, -2, -35, 8, 29, 24, 44, - -12, -24, 34, -18, -8, 7, 21, 55, 5, -21, - 2, -23, 11, 28, -13, 1, 22, 33, -21, -10, - ], [ - 36, -13, -5, -7, -40, -51, -28, 36, 52, 27, - 18, -36, 2, -22, 0, -33, 21, 2, -3, -13, - -26, 11, 14, 4, 10, -10, 18, -14, -22, -36, - 24, -21, 1, 28, -40, -42, 42, 5, 25, 5, - ], [ - -32, 6, 17, 31, -19, -65, -33, 41, 16, -1, - 0, -29, -6, -4, 13, -17, 9, -1, 8, -14, - -35, -3, 19, -11, -4, 0, 1, 21, -23, -30, - 3, -5, 20, 44, -48, -46, 19, 3, 20, -3, - ], [ - -3, -7, 6, -20, -25, -77, -32, 29, 31, 30, - 4, 2, 14, -29, -16, -40, 26, 0, -3, 12, - 13, 10, 36, -9, -15, -8, 24, -6, 7, -22, - 40, -17, -8, -9, -31, -18, 66, 22, 11, 19, - ], [ - -72, 13, 29, 18, -4, -90, -37, 34, -4, 1, - -13, 9, 6, -11, -2, -24, 13, -3, 7, 11, - 4, -4, 42, -25, -31, 1, 8, 29, 6, -17, - 19, -2, 10, 6, -38, -22, 42, 19, 6, 11, - ], [ - 116, -20, -68, -30, -28, 83, 28, -18, 32, -22, - -13, -21, 5, 28, 5, -7, -24, -8, -22, 17, - -23, 30, -25, 45, 15, -9, -11, -18, 22, -10, - 4, -2, 19, -12, 23, 3, -43, 2, 12, -4, - ], [ - 47, 0, -45, 7, -7, 69, 23, -13, -2, -51, - -32, -14, -3, 47, 19, 8, -37, -11, -10, 16, - -32, 15, -19, 29, 0, 1, -28, 18, 20, -4, - -16, 13, 38, 3, 15, 0, -66, 0, 7, -13, - ], [ - 77, -13, -56, -43, -13, 57, 23, -26, 11, -19, - -27, 16, 17, 22, -10, -15, -19, -10, -22, 43, - 16, 30, -2, 31, -11, -6, -5, -9, 52, 2, - 20, 0, 8, -50, 33, 27, -19, 19, -1, 9, - ], [ - 8, 6, -33, -4, 7, 44, 18, -21, -23, -48, - -46, 24, 9, 40, 3, 1, -32, -13, -11, 43, - 7, 14, 3, 15, -26, 3, -21, 26, 50, 8, - 0, 16, 27, -34, 25, 23, -43, 17, -6, 1, - ], [ - 71, -9, -59, -29, -8, 30, 26, -11, 30, -16, - 8, -44, -9, 14, 5, 2, -19, -40, -38, -15, - -7, 50, -17, 38, -7, -14, -24, -43, 22, -6, - 22, 19, 17, -34, -2, -20, -23, -10, 39, 16, - ], [ - 2, 11, -36, 9, 13, 17, 21, -6, -5, -45, - -10, -36, -18, 33, 19, 19, -31, -44, -27, -15, - -16, 34, -11, 22, -22, -4, -40, -7, 21, 0, - 1, 35, 36, -18, -10, -24, -46, -12, 34, 8, - ], [ - 32, -2, -47, -42, 7, 5, 21, -18, 9, -12, - -5, -5, 2, 8, -10, -4, -14, -42, -38, 10, - 33, 49, 5, 24, -33, -12, -17, -35, 52, 6, - 38, 22, 7, -72, 7, 3, 0, 6, 25, 30, - ], [ - -36, 18, -24, -3, 28, -7, 16, -13, -26, -41, - -24, 1, -5, 26, 3, 12, -27, -46, -27, 10, - 24, 34, 10, 8, -49, -2, -34, 0, 51, 12, - 17, 38, 25, -56, 0, 0, -22, 3, 20, 22, - ], [ - 121, -9, -50, -10, -40, 40, 43, 9, 58, 12, - -25, -41, 11, 2, 31, -5, -8, 19, -15, 32, - -41, 30, -16, 16, 20, -28, 0, -3, 26, -22, - 19, 0, 36, 4, 22, 12, -6, -9, -1, -24, - ], [ - 52, 10, -27, 27, -18, 26, 38, 14, 23, -16, - -44, -33, 3, 20, 45, 10, -20, 15, -3, 31, - -50, 14, -10, 0, 5, -17, -15, 32, 24, -16, - -1, 15, 55, 20, 14, 8, -29, -12, -7, -32, - ], [ - 82, -3, -38, -23, -24, 15, 38, 2, 37, 15, - -39, -2, 23, -4, 15, -12, -3, 17, -15, 58, - -1, 29, 6, 2, -5, -26, 7, 4, 56, -9, - 35, 3, 25, -33, 32, 36, 17, 7, -15, -9, - ], [ - 13, 17, -15, 15, -3, 1, 33, 7, 1, -12, - -58, 5, 15, 13, 29, 3, -16, 13, -4, 57, - -10, 13, 11, -13, -21, -15, -9, 40, 55, -3, - 14, 19, 44, -17, 24, 32, -5, 4, -21, -18, - ], [ - 76, 1, -41, -9, -19, -12, 41, 17, 55, 18, - -3, -63, -3, -12, 30, 5, -3, -12, -31, 0, - -24, 49, -8, 9, -1, -33, -12, -29, 27, -18, - 37, 21, 34, -17, -3, -11, 14, -23, 25, -2, - ], [ - 7, 22, -18, 29, 1, -25, 36, 21, 20, -9, - -22, -56, -11, 6, 45, 21, -15, -16, -20, -1, - -33, 34, -2, -6, -17, -23, -28, 6, 25, -12, - 16, 37, 53, -1, -11, -15, -8, -25, 20, -11, - ], [ - 37, 8, -29, -22, -4, -37, 36, 9, 34, 22, - -17, -24, 8, -18, 15, -2, 1, -14, -31, 25, - 15, 48, 13, -4, -28, -31, -5, -21, 57, -4, - 53, 24, 23, -55, 6, 12, 37, -6, 11, 11, - ], [ - -31, 28, -6, 16, 16, -50, 31, 14, 0, -6, - -36, -17, 0, 0, 29, 14, -11, -18, -20, 25, - 6, 33, 19, -20, -43, -21, -21, 14, 55, 0, - 32, 40, 42, -39, -1, 8, 14, -8, 6, 3, - ], [ - 119, -24, -39, -44, -51, 66, -14, 15, 31, -26, - -1, 0, 7, 16, -19, -28, -19, 22, -26, 4, - -13, 28, -16, 29, 5, -1, 16, -16, 8, -35, - -10, -42, -4, 17, 29, -19, -42, -7, 0, -15, - ], [ - 50, -3, -16, -5, -30, 53, -19, 20, -3, -55, - -19, 8, 0, 34, -5, -11, -32, 18, -15, 4, - -22, 13, -10, 13, -9, 8, 0, 19, 7, -29, - -31, -26, 13, 33, 21, -22, -65, -9, -4, -23, - ], [ - 79, -17, -27, -56, -36, 41, -19, 8, 10, -22, - -15, 39, 20, 9, -35, -35, -15, 20, -26, 31, - 26, 27, 6, 15, -20, 0, 23, -8, 38, -22, - 5, -38, -15, -20, 39, 4, -18, 9, -13, -1, - ], [ - 10, 3, -4, -18, -15, 27, -24, 13, -24, -51, - -34, 47, 12, 28, -21, -19, -27, 16, -15, 30, - 17, 12, 12, 0, -36, 10, 7, 27, 37, -16, - -15, -22, 3, -4, 31, 1, -42, 7, -18, -9, - ], [ - 74, -12, -30, -42, -30, 14, -16, 23, 29, -19, - 20, -21, -7, 1, -19, -17, -14, -10, -43, -27, - 3, 48, -8, 22, -16, -7, 4, -42, 9, -31, - 6, -20, -6, -4, 3, -43, -22, -20, 28, 5, - ], [ - 5, 7, -7, -4, -9, 0, -21, 28, -6, -48, - 2, -14, -15, 20, -5, 0, -27, -14, -32, -28, - -5, 32, -2, 6, -32, 3, -12, -5, 8, -25, - -14, -4, 12, 11, -4, -47, -45, -22, 22, -2, - ], [ - 34, -6, -18, -55, -15, -11, -21, 16, 8, -16, - 6, 16, 5, -4, -35, -24, -10, -12, -43, -1, - 43, 47, 14, 8, -43, -5, 10, -34, 39, -18, - 22, -16, -17, -42, 13, -19, 1, -3, 14, 20, - ], [ - -34, 14, 4, -17, 5, -24, -26, 20, -27, -45, - -12, 24, -2, 13, -21, -8, -22, -16, -32, -2, - 34, 31, 20, -7, -58, 5, -5, 2, 38, -12, - 2, -1, 1, -26, 5, -23, -21, -6, 8, 11, - ], [ - 124, -13, -21, -23, -62, 23, 0, 43, 57, 8, - -13, -18, 14, -10, 6, -26, -3, 49, -19, 19, - -31, 27, -7, 0, 11, -20, 29, -1, 12, -47, - 4, -39, 11, 34, 28, -9, -5, -19, -13, -34, - ], [ - 55, 6, 1, 14, -41, 10, -4, 48, 22, -20, - -31, -10, 5, 7, 20, -9, -16, 45, -8, 19, - -40, 12, -1, -15, -4, -10, 12, 34, 11, -41, - -16, -24, 30, 49, 20, -13, -28, -22, -18, -43, - ], [ - 84, -6, -9, -36, -47, -1, -4, 36, 36, 12, - -27, 20, 26, -17, -9, -33, 1, 47, -19, 46, - 9, 27, 15, -13, -15, -18, 35, 6, 42, -33, - 20, -36, 1, -4, 38, 14, 18, -2, -27, -20, - ], [ - 15, 13, 13, 1, -26, -14, -9, 41, 1, -16, - -46, 27, 18, 1, 4, -16, -11, 43, -8, 45, - 0, 11, 21, -29, -30, -8, 19, 42, 41, -28, - 0, -20, 20, 11, 30, 10, -4, -5, -32, -28, - ], [ - 79, -2, -12, -22, -42, -28, -1, 51, 54, 15, - 8, -41, 0, -24, 6, -15, 1, 17, -36, -12, - -14, 47, 0, -6, -11, -26, 16, -27, 13, -43, - 22, -18, 10, 12, 2, -34, 15, -33, 13, -13, - ], [ - 10, 18, 10, 15, -21, -41, -6, 56, 19, -13, - -9, -33, -9, -6, 20, 1, -11, 13, -24, -13, - -23, 32, 6, -22, -26, -15, 0, 8, 12, -37, - 1, -2, 28, 27, -5, -37, -7, -35, 8, -21, - ], [ - 39, 4, 0, -35, -27, -53, -6, 44, 33, 18, - -5, -2, 11, -31, -9, -22, 6, 15, -36, 13, - 25, 46, 23, -20, -37, -24, 23, -19, 43, -29, - 38, -14, 0, -26, 12, -10, 38, -16, 0, 0, - ], [ - -29, 25, 22, 2, -6, -67, -11, 49, -1, -10, - -24, 5, 3, -13, 4, -5, -6, 11, -25, 12, - 16, 31, 28, -36, -53, -13, 6, 16, 42, -24, - 17, 1, 18, -10, 4, -13, 15, -18, -5, -7, - ], [ - 29, -25, -22, -2, 6, 67, 11, -49, 1, 10, - 24, -5, -3, 13, -4, 5, 6, -11, 25, -12, - -16, -31, -28, 36, 53, 13, -6, -16, -42, 24, - -17, -1, -18, 10, -4, 13, -15, 18, 5, 7, - ], [ - -39, -4, 0, 35, 27, 53, 6, -44, -33, -18, - 5, 2, -11, 31, 9, 22, -6, -15, 36, -13, - -25, -46, -23, 20, 37, 24, -23, 19, -43, 29, - -38, 14, 0, 26, -12, 10, -38, 16, 0, 0, - ], [ - -10, -18, -10, -15, 21, 41, 6, -56, -19, 13, - 9, 33, 9, 6, -20, -1, 11, -13, 24, 13, - 23, -32, -6, 22, 26, 15, 0, -8, -12, 37, - -1, 2, -28, -27, 5, 37, 7, 35, -8, 21, - ], [ - -79, 2, 12, 22, 42, 28, 1, -51, -54, -15, - -8, 41, 0, 24, -6, 15, -1, -17, 36, 12, - 14, -47, 0, 6, 11, 26, -16, 27, -13, 43, - -22, 18, -10, -12, -2, 34, -15, 33, -13, 13, - ], [ - -15, -13, -13, -1, 26, 14, 9, -41, -1, 16, - 46, -27, -18, -1, -4, 16, 11, -43, 8, -45, - 0, -11, -21, 29, 30, 8, -19, -42, -41, 28, - 0, 20, -20, -11, -30, -10, 4, 5, 32, 28, - ], [ - -84, 6, 9, 36, 47, 1, 4, -36, -36, -12, - 27, -20, -26, 17, 9, 33, -1, -47, 19, -46, - -9, -27, -15, 13, 15, 18, -35, -6, -42, 33, - -20, 36, -1, 4, -38, -14, -18, 2, 27, 20, - ], [ - -55, -6, -1, -14, 41, -10, 4, -48, -22, 20, - 31, 10, -5, -7, -20, 9, 16, -45, 8, -19, - 40, -12, 1, 15, 4, 10, -12, -34, -11, 41, - 16, 24, -30, -49, -20, 13, 28, 22, 18, 43, - ], [ - -124, 13, 21, 23, 62, -23, 0, -43, -57, -8, - 13, 18, -14, 10, -6, 26, 3, -49, 19, -19, - 31, -27, 7, 0, -11, 20, -29, 1, -12, 47, - -4, 39, -11, -34, -28, 9, 5, 19, 13, 34, - ], [ - 34, -14, -4, 17, -5, 24, 26, -20, 27, 45, - 12, -24, 2, -13, 21, 8, 22, 16, 32, 2, - -34, -31, -20, 7, 58, -5, 5, -2, -38, 12, - -2, 1, -1, 26, -5, 23, 21, 6, -8, -11, - ], [ - -34, 6, 18, 55, 15, 11, 21, -16, -8, 16, - -6, -16, -5, 4, 35, 24, 10, 12, 43, 1, - -43, -47, -14, -8, 43, 5, -10, 34, -39, 18, - -22, 16, 17, 42, -13, 19, -1, 3, -14, -20, - ], [ - -5, -7, 7, 4, 9, 0, 21, -28, 6, 48, - -2, 14, 15, -20, 5, 0, 27, 14, 32, 28, - 5, -32, 2, -6, 32, -3, 12, 5, -8, 25, - 14, 4, -12, -11, 4, 47, 45, 22, -22, 2, - ], [ - -74, 12, 30, 42, 30, -14, 16, -23, -29, 19, - -20, 21, 7, -1, 19, 17, 14, 10, 43, 27, - -3, -48, 8, -22, 16, 7, -4, 42, -9, 31, - -6, 20, 6, 4, -3, 43, 22, 20, -28, -5, - ], [ - -10, -3, 4, 18, 15, -27, 24, -13, 24, 51, - 34, -47, -12, -28, 21, 19, 27, -16, 15, -30, - -17, -12, -12, 0, 36, -10, -7, -27, -37, 16, - 15, 22, -3, 4, -31, -1, 42, -7, 18, 9, - ], [ - -79, 17, 27, 56, 36, -41, 19, -8, -10, 22, - 15, -39, -20, -9, 35, 35, 15, -20, 26, -31, - -26, -27, -6, -15, 20, 0, -23, 8, -38, 22, - -5, 38, 15, 20, -39, -4, 18, -9, 13, 1, - ], [ - -50, 3, 16, 5, 30, -53, 19, -20, 3, 55, - 19, -8, 0, -34, 5, 11, 32, -18, 15, -4, - 22, -13, 10, -13, 9, -8, 0, -19, -7, 29, - 31, 26, -13, -33, -21, 22, 65, 9, 4, 23, - ], [ - -119, 24, 39, 44, 51, -66, 14, -15, -31, 26, - 1, 0, -7, -16, 19, 28, 19, -22, 26, -4, - 13, -28, 16, -29, -5, 1, -16, 16, -8, 35, - 10, 42, 4, -17, -29, 19, 42, 7, 0, 15, - ], [ - 31, -28, 6, -16, -16, 50, -31, -14, 0, 6, - 36, 17, 0, 0, -29, -14, 11, 18, 20, -25, - -6, -33, -19, 20, 43, 21, 21, -14, -55, 0, - -32, -40, -42, 39, 1, -8, -14, 8, -6, -3, - ], [ - -37, -8, 29, 22, 4, 37, -36, -9, -34, -22, - 17, 24, -8, 18, -15, 2, -1, 14, 31, -25, - -15, -48, -13, 4, 28, 31, 5, 21, -57, 4, - -53, -24, -23, 55, -6, -12, -37, 6, -11, -11, - ], [ - -7, -22, 18, -29, -1, 25, -36, -21, -20, 9, - 22, 56, 11, -6, -45, -21, 15, 16, 20, 1, - 33, -34, 2, 6, 17, 23, 28, -6, -25, 12, - -16, -37, -53, 1, 11, 15, 8, 25, -20, 11, - ], [ - -76, -1, 41, 9, 19, 12, -41, -17, -55, -18, - 3, 63, 3, 12, -30, -5, 3, 12, 31, 0, - 24, -49, 8, -9, 1, 33, 12, 29, -27, 18, - -37, -21, -34, 17, 3, 11, -14, 23, -25, 2, - ], [ - -13, -17, 15, -15, 3, -1, -33, -7, -1, 12, - 58, -5, -15, -13, -29, -3, 16, -13, 4, -57, - 10, -13, -11, 13, 21, 15, 9, -40, -55, 3, - -14, -19, -44, 17, -24, -32, 5, -4, 21, 18, - ], [ - -82, 3, 38, 23, 24, -15, -38, -2, -37, -15, - 39, 2, -23, 4, -15, 12, 3, -17, 15, -58, - 1, -29, -6, -2, 5, 26, -7, -4, -56, 9, - -35, -3, -25, 33, -32, -36, -17, -7, 15, 9, - ], [ - -52, -10, 27, -27, 18, -26, -38, -14, -23, 16, - 44, 33, -3, -20, -45, -10, 20, -15, 3, -31, - 50, -14, 10, 0, -5, 17, 15, -32, -24, 16, - 1, -15, -55, -20, -14, -8, 29, 12, 7, 32, - ], [ - -121, 9, 50, 10, 40, -40, -43, -9, -58, -12, - 25, 41, -11, -2, -31, 5, 8, -19, 15, -32, - 41, -30, 16, -16, -20, 28, 0, 3, -26, 22, - -19, 0, -36, -4, -22, -12, 6, 9, 1, 24, - ], [ - 36, -18, 24, 3, -28, 7, -16, 13, 26, 41, - 24, -1, 5, -26, -3, -12, 27, 46, 27, -10, - -24, -34, -10, -8, 49, 2, 34, 0, -51, -12, - -17, -38, -25, 56, 0, 0, 22, -3, -20, -22, - ], [ - -32, 2, 47, 42, -7, -5, -21, 18, -9, 12, - 5, 5, -2, -8, 10, 4, 14, 42, 38, -10, - -33, -49, -5, -24, 33, 12, 17, 35, -52, -6, - -38, -22, -7, 72, -7, -3, 0, -6, -25, -30, - ], [ - -2, -11, 36, -9, -13, -17, -21, 6, 5, 45, - 10, 36, 18, -33, -19, -19, 31, 44, 27, 15, - 16, -34, 11, -22, 22, 4, 40, 7, -21, 0, - -1, -35, -36, 18, 10, 24, 46, 12, -34, -8, - ], [ - -71, 9, 59, 29, 8, -30, -26, 11, -30, 16, - -8, 44, 9, -14, -5, -2, 19, 40, 38, 15, - 7, -50, 17, -38, 7, 14, 24, 43, -22, 6, - -22, -19, -17, 34, 2, 20, 23, 10, -39, -16, - ], [ - -8, -6, 33, 4, -7, -44, -18, 21, 23, 48, - 46, -24, -9, -40, -3, -1, 32, 13, 11, -43, - -7, -14, -3, -15, 26, -3, 21, -26, -50, -8, - 0, -16, -27, 34, -25, -23, 43, -17, 6, -1, - ], [ - -77, 13, 56, 43, 13, -57, -23, 26, -11, 19, - 27, -16, -17, -22, 10, 15, 19, 10, 22, -43, - -16, -30, 2, -31, 11, 6, 5, 9, -52, -2, - -20, 0, -8, 50, -33, -27, 19, -19, 1, -9, - ], [ - -47, 0, 45, -7, 7, -69, -23, 13, 2, 51, - 32, 14, 3, -47, -19, -8, 37, 11, 10, -16, - 32, -15, 19, -29, 0, -1, 28, -18, -20, 4, - 16, -13, -38, -3, -15, 0, 66, 0, -7, 13, - ], [ - -116, 20, 68, 30, 28, -83, -28, 18, -32, 22, - 13, 21, -5, -28, -5, 7, 24, 8, 22, -17, - 23, -30, 25, -45, -15, 9, 11, 18, -22, 10, - -4, 2, -19, 12, -23, -3, 43, -2, -12, 4, - ], [ - 72, -13, -29, -18, 4, 90, 37, -34, 4, -1, - 13, -9, -6, 11, 2, 24, -13, 3, -7, -11, - -4, 4, -42, 25, 31, -1, -8, -29, -6, 17, - -19, 2, -10, -6, 38, 22, -42, -19, -6, -11, - ], [ - 3, 7, -6, 20, 25, 77, 32, -29, -31, -30, - -4, -2, -14, 29, 16, 40, -26, 0, 3, -12, - -13, -10, -36, 9, 15, 8, -24, 6, -7, 22, - -40, 17, 8, 9, 31, 18, -66, -22, -11, -19, - ], [ - 32, -6, -17, -31, 19, 65, 33, -41, -16, 1, - 0, 29, 6, 4, -13, 17, -9, 1, -8, 14, - 35, 3, -19, 11, 4, 0, -1, -21, 23, 30, - -3, 5, -20, -44, 48, 46, -19, -3, -20, 3, - ], [ - -36, 13, 5, 7, 40, 51, 28, -36, -52, -27, - -18, 36, -2, 22, 0, 33, -21, -2, 3, 13, - 26, -11, -14, -4, -10, 10, -18, 14, 22, 36, - -24, 21, -1, -28, 40, 42, -42, -5, -25, -5, - ], [ - 27, -1, -20, -17, 24, 38, 35, -26, 1, 4, - 35, -32, -21, -3, 2, 35, -8, -29, -24, -44, - 12, 24, -34, 18, 8, -7, -21, -55, -5, 21, - -2, 23, -11, -28, 13, -1, -22, -33, 21, 10, - ], [ - -41, 18, 2, 21, 45, 24, 30, -21, -33, -24, - 17, -24, -29, 15, 16, 51, -21, -33, -13, -45, - 3, 8, -28, 2, -7, 2, -37, -19, -7, 27, - -22, 39, 7, -12, 5, -5, -45, -35, 15, 1, - ], [ - -12, 4, -8, -29, 39, 12, 30, -33, -19, 8, - 21, 6, -8, -9, -13, 28, -4, -31, -24, -18, - 52, 23, -12, 4, -18, -5, -14, -47, 24, 34, - 14, 27, -22, -66, 22, 22, 1, -16, 6, 24, - ], [ - -81, 25, 14, 8, 61, 0, 25, -28, -54, -20, - 3, 14, -17, 8, 0, 44, -16, -35, -13, -18, - 43, 7, -6, -11, -33, 4, -30, -11, 22, 40, - -6, 43, -3, -50, 14, 18, -22, -18, 1, 16, - ], [ - 77, -2, -11, 1, -7, 47, 52, -5, 29, 33, - 1, -28, 0, -15, 28, 26, 2, 30, 0, 2, - -22, 4, -33, -3, 36, -21, 3, -15, -2, 5, - -4, 4, 6, 9, 37, 31, -5, -32, -20, -30, - ], [ - 8, 17, 10, 40, 13, 34, 47, 0, -5, 4, - -16, -21, -8, 2, 42, 43, -10, 26, 10, 2, - -31, -11, -27, -19, 21, -10, -12, 20, -3, 11, - -25, 20, 25, 25, 29, 28, -28, -34, -25, -38, - ], [ - 37, 3, 0, -10, 7, 22, 48, -12, 8, 36, - -12, 9, 12, -22, 12, 19, 6, 28, 0, 29, - 18, 3, -11, -17, 10, -18, 10, -7, 27, 18, - 11, 7, -3, -28, 47, 55, 18, -15, -34, -16, - ], [ - -31, 24, 23, 27, 29, 9, 43, -8, -26, 7, - -30, 17, 4, -3, 26, 35, -5, 24, 10, 28, - 9, -12, -5, -33, -5, -8, -5, 29, 26, 24, - -9, 23, 14, -12, 39, 52, -5, -18, -39, -24, - ], [ - 32, 8, -3, 2, 13, -4, 50, 1, 27, 39, - 23, -51, -15, -30, 27, 37, 7, -1, -17, -29, - -5, 23, -25, -10, 14, -26, -8, -41, -1, 9, - 13, 26, 5, -12, 12, 7, 14, -45, 6, -9, - ], [ - -36, 29, 19, 41, 34, -18, 45, 6, -8, 10, - 5, -43, -23, -11, 42, 53, -5, -5, -6, -30, - -14, 8, -20, -26, -1, -16, -25, -4, -3, 15, - -7, 41, 23, 3, 4, 3, -8, -48, 1, -17, - ], [ - -7, 15, 9, -9, 28, -29, 45, -5, 6, 43, - 9, -12, -2, -36, 12, 30, 11, -3, -17, -3, - 34, 22, -3, -24, -12, -24, -2, -32, 28, 22, - 29, 29, -5, -50, 21, 31, 38, -29, -7, 5, - ], [ - -76, 35, 31, 28, 49, -43, 40, 0, -29, 14, - -8, -5, -10, -18, 26, 46, 0, -7, -6, -3, - 25, 7, 2, -40, -28, -14, -18, 3, 27, 28, - 8, 45, 13, -34, 13, 27, 15, -31, -12, -3, - ], [ - 74, -17, 0, -31, -18, 73, -5, 0, 3, -5, - 25, 12, -3, -1, -22, 3, -9, 33, -12, -24, - 6, 2, -33, 9, 21, 5, 20, -27, -19, -7, - -34, -37, -34, 22, 44, 0, -41, -29, -17, -21, - ], [ - 5, 3, 21, 7, 2, 60, -10, 5, -32, -34, - 7, 20, -11, 16, -8, 20, -21, 29, -1, -24, - -2, -13, -27, -6, 5, 15, 3, 8, -21, -1, - -55, -21, -15, 38, 37, -3, -65, -32, -23, -30, - ], [ - 35, -10, 11, -44, -3, 48, -10, -6, -17, -2, - 11, 51, 8, -8, -38, -3, -4, 31, -12, 2, - 46, 1, -10, -4, -5, 7, 26, -19, 10, 5, - -18, -34, -45, -15, 54, 24, -18, -13, -31, -7, - ], [ - -33, 10, 34, -5, 17, 35, -15, -1, -53, -30, - -6, 59, 0, 10, -24, 13, -17, 27, -1, 1, - 37, -13, -4, -20, -20, 18, 10, 16, 8, 11, - -39, -18, -26, 0, 46, 20, -41, -15, -37, -15, - ], [ - 29, -5, 7, -30, 1, 21, -7, 7, 0, 0, - 47, -9, -18, -15, -22, 14, -4, 0, -28, -57, - 23, 21, -25, 2, -1, 0, 7, -53, -19, -3, - -17, -15, -36, 0, 19, -24, -21, -43, 9, 0, - ], [ - -39, 14, 30, 8, 22, 8, -12, 12, -34, -27, - 29, -2, -26, 2, -8, 31, -16, -3, -17, -57, - 14, 6, -19, -13, -16, 10, -8, -17, -20, 2, - -38, 0, -17, 16, 11, -27, -44, -45, 4, -8, - ], [ - -9, 1, 20, -43, 17, -3, -12, 0, -20, 4, - 33, 29, -6, -22, -38, 7, 0, -1, -29, -30, - 63, 21, -3, -11, -27, 1, 14, -45, 10, 9, - -1, -12, -47, -37, 28, 0, 2, -26, -4, 13, - ], [ - -78, 21, 43, -4, 38, -17, -17, 5, -55, -24, - 15, 36, -14, -4, -24, 24, -12, -5, -17, -31, - 54, 5, 2, -27, -43, 12, -2, -9, 9, 15, - -22, 3, -28, -21, 20, -3, -20, -28, -9, 5, - ], [ - 80, -6, 16, -11, -30, 30, 9, 28, 28, 29, - 13, -6, 2, -28, 3, 5, 7, 60, -5, -9, - -11, 1, -24, -19, 27, -13, 32, -13, -15, -19, - -19, -35, -17, 39, 43, 9, -4, -42, -32, -41, - ], [ - 11, 14, 39, 27, -9, 17, 4, 33, -6, 0, - -4, 1, -5, -10, 17, 22, -5, 57, 5, -9, - -20, -13, -18, -35, 11, -3, 16, 22, -17, -13, - -40, -19, 1, 55, 35, 5, -27, -44, -37, -49, - ], [ - 40, 0, 28, -24, -14, 5, 4, 21, 7, 33, - 0, 32, 15, -35, -12, -1, 11, 58, -5, 16, - 28, 0, -1, -33, 0, -11, 39, -5, 14, -6, - -3, -31, -28, 1, 53, 33, 19, -25, -46, -26, - ], [ - -28, 20, 51, 14, 6, -7, 0, 26, -27, 4, - -18, 40, 6, -16, 1, 15, 0, 55, 5, 16, - 19, -14, 3, -49, -14, -1, 22, 30, 12, 0, - -24, -15, -9, 17, 45, 29, -4, -28, -51, -35, - ], [ - 34, 4, 25, -10, -9, -21, 7, 36, 26, 36, - 35, -28, -12, -42, 3, 16, 12, 28, -21, -42, - 5, 21, -16, -26, 4, -19, 19, -39, -15, -15, - -1, -13, -19, 17, 17, -14, 15, -55, -4, -19, - ], [ - -34, 25, 48, 28, 11, -34, 2, 41, -9, 7, - 17, -21, -20, -24, 17, 33, 0, 24, -10, -42, - -3, 5, -10, -42, -11, -8, 3, -3, -16, -9, - -22, 2, 0, 33, 10, -18, -7, -58, -10, -28, - ], [ - -4, 11, 37, -23, 5, -46, 2, 29, 5, 39, - 21, 9, 0, -49, -12, 9, 16, 26, -22, -15, - 45, 20, 5, -40, -22, -17, 26, -31, 14, -2, - 14, -10, -30, -20, 27, 9, 39, -39, -18, -5, - ], [ - -73, 32, 60, 15, 26, -59, -2, 33, -30, 10, - 3, 17, -8, -30, 1, 26, 4, 22, -10, -16, - 36, 5, 11, -56, -37, -6, 10, 5, 13, 3, - -6, 5, -11, -4, 19, 5, 16, -41, -24, -13 - ] -]; - -const RA144_GAIN_VAL_TAB: [[u16; 3]; 256] = [ - [ 541, 956, 768], [ 877, 581, 568], [ 675,1574, 635], [1248,1464, 668], - [1246, 839, 1394], [2560,1386, 991], [ 925, 687, 608], [2208, 797, 1144], - [ 535, 832, 799], [ 762, 605, 1154], [ 832,1122, 1003], [1180, 687, 1176], - [1292, 901, 732], [1656, 689, 896], [1750,1248, 848], [2284, 942, 1022], - [ 824,1472, 643], [ 517, 765, 512], [ 562,1816, 1522], [ 694,1826, 2700], - [ 704, 524, 672], [1442, 757, 2232], [ 884, 551, 1266], [2232,1007, 1692], - [ 932, 746, 777], [1132, 822, 926], [1226, 771, 611], [2948,1342, 1008], - [1302, 594, 1158], [1602, 636, 1128], [3408, 910, 1438], [1996, 614, 575], - [ 665, 935, 628], [ 631,1192, 829], [ 644, 926, 1052], [ 879, 988, 1226], - [ 941,2768, 2772], [ 565,1344, 2304], [ 547, 628, 740], [ 639, 532, 1074], - [ 955,1208, 598], [1124,1160, 900], [1206, 899, 1242], [ 746, 533, 624], - [1458,1028, 735], [1706,1102, 692], [1898,1018, 1004], [2176, 988, 735], - [1578, 782, 1642], [ 897, 516, 754], [2068, 702, 1656], [2344, 818, 1526], - [ 907, 652, 592], [1056, 652, 642], [2124,1416, 780], [2664,1250, 727], - [1894, 727, 1108], [2196, 657, 981], [4840, 920, 1704], [4992,1238, 983], - [2420, 909, 1094], [2760, 935, 1032], [2800, 612, 853], [3068, 832, 574], - [ 523,1796, 923], [ 722,1916, 1382], [1226,1542, 928], [ 758, 757, 584], - [ 512,1134, 577], [ 615,1276, 698], [ 574,2568, 2356], [ 993,2728, 3512], - [ 539, 890, 913], [ 694, 928, 1088], [ 805, 600, 1360], [2160, 951, 3128], - [ 816, 950, 590], [ 955, 847, 811], [1094, 883, 556], [1304, 888, 604], - [ 863,1170, 855], [1023, 997, 1032], [ 932,1228, 1280], [ 627, 564, 573], - [ 876, 900, 1448], [1030, 857, 1792], [1294, 953, 1758], [1612, 854, 1714], - [1090,1166, 631], [1314,1202, 751], [1480, 905, 795], [1682,1016, 568], - [1494,1178, 983], [ 878, 613, 526], [1728,1446, 779], [2136,1348, 774], - [ 950, 649, 939], [1180, 703, 899], [1236, 527, 1158], [1450, 647, 972], - [1282, 647, 707], [1460, 663, 644], [1614, 572, 578], [3516,1222, 821], - [2668, 729, 1682], [3128, 585, 1502], [3208, 733, 976], [6800, 871, 1416], - [3480, 743, 1408], [3764, 899, 1170], [3772, 632, 875], [4092, 732, 638], - [3112, 753, 2620], [3372, 945, 1890], [3768, 969, 2288], [2016, 559, 854], - [1736, 729, 787], [1940, 686, 547], [2140, 635, 674], [4480,1272, 828], - [3976, 592, 1666], [4384, 621, 1388], [4400, 801, 955], [4656, 522, 646], - [4848, 625, 1636], [4984, 591, 874], [5352, 535, 1001], [11216,938, 1184], - [ 925,3280, 1476], [ 735,1580, 1088], [1150,1576, 674], [ 655, 783, 528], - [ 527,2052, 1354], [ 782,1704, 1880], [ 578, 910, 1026], [ 692, 882, 1468], - [ 586, 683, 715], [ 739, 609, 717], [ 778, 773, 697], [ 922, 785, 813], - [ 766, 651, 984], [ 978, 596, 1030], [1070, 757, 1080], [1324, 687, 1178], - [1108,2144, 979], [ 723, 982, 690], [ 936, 956, 527], [1180,1002, 547], - [ 517,1306, 825], [ 832,1184, 974], [1024, 957, 903], [1262,1090, 906], - [1028, 720, 649], [1192, 679, 694], [2468,1480, 979], [2844,1370, 877], - [1310, 835, 848], [1508, 839, 698], [1742,1030, 769], [1910, 852, 573], - [1280, 859, 1174], [1584, 863, 1108], [1686, 708, 1364], [1942, 768, 1104], - [ 891, 536, 690], [1016, 560, 663], [2172, 870, 1348], [2404, 999, 1170], - [1890, 966, 889], [2116, 912, 777], [2296,1020, 714], [4872,1844, 932], - [2392, 778, 929], [2604, 772, 744], [2764, 957, 722], [5832,1532, 984], - [2188, 519, 1264], [2332, 532, 922], [5064, 995, 2412], [2708, 571, 874], - [2408, 545, 666], [5016,1084, 875], [5376, 983, 1196], [5536, 979, 730], - [5344, 634, 1744], [5688, 706, 1348], [5912, 977, 1190], [6072, 905, 763], - [6048, 582, 1526], [11968,1013,1816], [12864,937, 1900], [12560,1086, 998], - [1998, 684, 1884], [2504, 633, 1992], [1252, 567, 835], [1478, 571, 973], - [2620, 769, 1414], [2808, 952, 1142], [2908, 712, 1028], [2976, 686, 741], - [1462, 552, 714], [3296, 991, 1452], [1590, 615, 544], [3480,1150, 824], - [3212, 832, 923], [3276, 839, 531], [3548, 786, 852], [3732, 764, 570], - [5728, 906, 2616], [6272, 804, 2252], [3096, 535, 876], [3228, 598, 649], - [6536, 759, 1436], [6648, 993, 846], [6864, 567, 1210],[14016,1012, 1302], - [3408, 548, 1098], [7160,1008, 1742], [7136,1000, 1182], [7480,1032, 836], - [7448, 612, 1552], [7744, 614, 816], [8384, 777, 1438], [8784, 694, 786], - [ 882,1508, 1068], [ 597, 837, 766], [1270, 954, 1408], [ 803, 550, 798], - [1398,1308, 798], [1848,1534, 738], [ 970, 675, 608], [1264, 706, 684], - [1716, 767, 1126], [2108, 765, 1404], [2236, 924, 1003], [2472,1048, 611], - [ 999, 942, 963], [1094, 857, 935], [2936, 926, 1138], [1934, 746, 551], - [3336, 633, 1762], [3764, 701, 1454], [1890, 564, 636], [4096,1126, 793], - [3936, 556, 1140], [3936, 540, 740], [4216, 764, 874], [8480,1328, 1014], - [2184, 515, 1042], [4432, 934, 1344], [4784, 945, 1112], [5016,1062, 733], - [9216,1020, 2028], [9968, 924, 1188], [5424, 909, 1206], [6512, 744, 1086] -]; -const RA144_GAIN_EXP_TAB: [u8; 256] = [ - 15, 15, 15, 15, 15, 16, 14, 15, 14, 14, 14, 14, 14, 14, 14, 14, - 14, 13, 14, 14, 13, 14, 13, 14, 13, 13, 13, 14, 13, 13, 14, 13, - 13, 13, 13, 13, 14, 13, 12, 12, 13, 13, 13, 12, 13, 13, 13, 13, - 13, 12, 13, 13, 12, 12, 13, 13, 13, 13, 14, 14, 13, 13, 13, 13, - 13, 13, 13, 12, 12, 12, 13, 13, 12, 12, 12, 13, 12, 12, 12, 12, - 12, 12, 12, 11, 12, 12, 12, 12, 12, 12, 12, 12, 12, 11, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 13, 13, 13, 13, 14, 13, 13, 13, 13, - 13, 13, 13, 12, 12, 12, 12, 13, 13, 13, 13, 13, 13, 13, 13, 14, - 13, 12, 12, 11, 12, 12, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, - 12, 11, 11, 11, 11, 11, 11, 11, 11, 11, 12, 12, 11, 11, 11, 11, - 12, 12, 12, 12, 11, 11, 12, 12, 12, 12, 12, 13, 12, 12, 12, 13, - 12, 12, 13, 12, 12, 13, 13, 13, 13, 13, 13, 13, 13, 14, 14, 14, - 12, 12, 11, 11, 12, 12, 12, 12, 11, 12, 11, 12, 12, 12, 12, 12, - 13, 13, 12, 12, 13, 13, 13, 14, 12, 13, 13, 13, 13, 13, 13, 13, - 11, 10, 11, 10, 11, 11, 10, 10, 11, 11, 11, 11, 10, 9, 11, 10, - 12, 12, 11, 12, 12, 12, 12, 13, 11, 12, 12, 12, 13, 13, 12, 12 -]; diff --git a/src/codecs/real/ra288.rs b/src/codecs/real/ra288.rs deleted file mode 100644 index 6a5a352..0000000 --- a/src/codecs/real/ra288.rs +++ /dev/null @@ -1,330 +0,0 @@ -use crate::formats::*; -use crate::frame::*; -use super::super::*; -use crate::io::bitreader::*; -const CHMAP_MONO: [NAChannelType; 1] = [NAChannelType::C]; -const NBLOCKS: usize = 32; -const BLOCKSIZE: usize = 5; -const FRAME_SIZE: usize = 38; - -const SP_LPC_ORDER: usize = 36; -const SP_START: usize = 70; -const GAIN_LPC_ORDER: usize = 10; -const GAIN_START: usize = 28; - -struct RA288Decoder { - chmap: NAChannelMap, - ainfo: NAAudioInfo, - info: Rc<NACodecInfo>, - - speech_lpc: [f32; SP_LPC_ORDER], - speech_hist: [f32; 111], - speech_rec: [f32; SP_LPC_ORDER + 1], - gain_lpc: [f32; GAIN_LPC_ORDER], - gain_hist: [f32; GAIN_LPC_ORDER + GAIN_START], - gain_rec: [f32; GAIN_LPC_ORDER + 1], -} - -const BF_ORDER: usize = SP_LPC_ORDER + 1; -const BF_WORK_SIZE: usize = SP_LPC_ORDER + 40 + 35; - -fn backfilter(hist: &mut [f32], rec: &mut [f32], filt: &mut [f32], win: &[f32], bw_tab: &[f32], start: usize, non_rec: usize, move_size: usize) { - let mut temp: [f32; BF_ORDER] = [0.0; BF_ORDER]; - let order = filt.len(); - - let mut tmp1: [f32; BF_ORDER] = [0.0; BF_ORDER]; - let mut tmp2: [f32; BF_ORDER] = [0.0; BF_ORDER]; - let mut work: [f32; BF_WORK_SIZE] = [0.0; BF_WORK_SIZE]; - for i in 0..(order + start + non_rec) { - work[i] = win[i] * hist[i]; - } - for i in (0..order + 1).rev() { - let src1 = &work[(order - i)..]; - let src2 = &work[order + start - i..]; - tmp1[i] = scalarprod(&work[order..], src1, start); - tmp2[i] = scalarprod(&work[order + start..], src2, non_rec); - } - - for i in 0..(order + 1) { - rec[i] = rec[i] * 0.5625 + tmp1[i]; - temp[i] = rec[i] + tmp2[i]; - } - temp[0] *= 257.0 / 256.0; - - if compute_lpc(&temp, filt) { - for (f, c) in filt.iter_mut().zip(bw_tab.iter()) { - *f *= c; - } - } - for i in 0..move_size { - hist[i] = hist[i + start]; - } -} - -fn scalarprod(src0: &[f32], src1: &[f32], len: usize) -> f32 { - let mut sum: f32 = 0.0; - for (a, b) in src0.iter().take(len).zip(src1.iter().take(len)) { - sum += *a * *b; - } - sum -} - -fn compute_lpc(autoc: &[f32], filt: &mut [f32]) -> bool { - let order = filt.len(); - let mut err = autoc[0]; - if (err <= 0.0) || (autoc[order] == 0.0) { - return false; - } - for i in 0..order { - let mut r = -autoc[i + 1]; - for j in 0..i { - r -= filt[j] * autoc[i - j]; - } - r /= err; - err *= 1.0 - r * r; - filt[i] = r; - - for j in 0..((i + 1) >> 1) { - let f = filt[j]; - let b = filt[i - j - 1]; - filt[j] = f + r * b; - filt[i - j - 1] = b + r * f; - } - - if err < 0.0 { return false; } - } - true -} - -fn celp_lp_synth_filter(dst: &mut [f32], start: usize, filt: &[f32], src: &[f32]) { - for (i, el) in src.iter().enumerate() { - dst[start + i] = *el; - for (j, coeff) in filt.iter().enumerate() { - dst[start + i] -= *coeff * dst[start + i - j - 1]; - } - } -} - -impl RA288Decoder { - fn new() -> Self { - RA288Decoder { - chmap: NAChannelMap::new(), - ainfo: NAAudioInfo::new(0, 1, SND_F32P_FORMAT, NBLOCKS * BLOCKSIZE), - info: NACodecInfo::new_dummy(), - - speech_lpc: [0.0; SP_LPC_ORDER], - speech_hist: [0.0; 111], - speech_rec: [0.0; SP_LPC_ORDER + 1], - gain_lpc: [0.0; GAIN_LPC_ORDER], - gain_hist: [0.0; 38], - gain_rec: [0.0; GAIN_LPC_ORDER + 1], - } - } - - fn process_subblock(&mut self, gain: f32, cb_idx: usize) { - for i in 0..SP_LPC_ORDER { - self.speech_hist[SP_START + i] = self.speech_hist[75 + i]; - } - let mut sum: f32 = 32.0; - for i in 0..GAIN_LPC_ORDER { - sum -= self.gain_hist[GAIN_START + GAIN_LPC_ORDER - 1 - i] * self.gain_lpc[i]; - } - sum = sum.max(0.0).min(60.0); - - let scale = (sum * 0.1151292546497).exp() * gain * (1.0 / ((1 << 23) as f32)); - let mut buf: [f32; BLOCKSIZE] = [0.0; BLOCKSIZE]; - for i in 0..BLOCKSIZE { - buf[i] = (RA288_CODEBOOK[cb_idx][i] as f32) * scale; - } - - let mut sum: f32 = 0.0; - for el in buf.iter() { - sum += *el * *el * (((1 << 24) as f32) / 5.0); - } - sum = sum.max(1.0); - for i in 0..(GAIN_LPC_ORDER - 1) { - self.gain_hist[GAIN_START + i] = self.gain_hist[GAIN_START + i + 1]; - } - self.gain_hist[GAIN_START + GAIN_LPC_ORDER - 1] = 10.0 * sum.log10() - 32.0; - celp_lp_synth_filter(&mut self.speech_hist, SP_START + SP_LPC_ORDER, &self.speech_lpc, &buf); - } -} - -impl NADecoder for RA288Decoder { - fn init(&mut self, info: Rc<NACodecInfo>) -> DecoderResult<()> { - if let NACodecTypeInfo::Audio(ainfo) = info.get_properties() { - self.chmap.add_channels(&CHMAP_MONO); - self.ainfo = NAAudioInfo::new(ainfo.get_sample_rate(), - 1, - SND_F32P_FORMAT, NBLOCKS * BLOCKSIZE); - self.info = info.replace_info(NACodecTypeInfo::Audio(self.ainfo.clone())); - Ok(()) - } else { - Err(DecoderError::InvalidData) - } - } - fn decode(&mut self, pkt: &NAPacket) -> DecoderResult<NAFrameRef> { - let info = pkt.get_stream().get_info(); - validate!(info.get_properties().is_audio()); - let pktbuf = pkt.get_buffer(); - let nframes = pktbuf.len() / FRAME_SIZE; - let duration = NBLOCKS * BLOCKSIZE * nframes; - - let mut abuf = alloc_audio_buffer(self.ainfo, duration, self.chmap.clone())?; - let mut adata = abuf.get_abuf_f32().unwrap(); - let mut dst = adata.get_data_mut(); - - for (input, output) in pktbuf.chunks(FRAME_SIZE).zip(dst.chunks_mut(NBLOCKS * BLOCKSIZE)) { - let mut br = BitReader::new(input, input.len(), BitReaderMode::LE); - - for (i, block) in output.chunks_mut(BLOCKSIZE).enumerate() { - let gain = RA288_GAIN_TAB[br.read(3)? as usize]; - let cb = br.read((6 + (i & 1)) as u8)? as usize; - - self.process_subblock(gain, cb); - - for j in 0..BLOCKSIZE { - block[j] = self.speech_hist[SP_START + SP_LPC_ORDER + j]; - } - if (i & 7) == 3 { - backfilter(&mut self.speech_hist, &mut self.speech_rec, &mut self.speech_lpc, RA288_SPEECH_WINDOW, RA288_SPEECH_BW_TAB, 40, 35, SP_START); - backfilter(&mut self.gain_hist, &mut self.gain_rec, &mut self.gain_lpc, RA288_GAIN_WINDOW, RA288_GAIN_BW_TAB, 8, 20, GAIN_START); - } - } - } - - let mut frm = NAFrame::new_from_pkt(pkt, self.info.clone(), abuf); - frm.set_keyframe(true); - Ok(Rc::new(RefCell::new(frm))) - } -} - -pub fn get_decoder() -> Box<NADecoder> { - Box::new(RA288Decoder::new()) -} - -#[cfg(test)] -mod test { - use crate::test::dec_video::*; - #[test] - fn test_ra288() { - let file = "assets/RV/A0000044.rm"; - test_decode_audio("realmedia", file, Some(5000), "ra28.8"); - } -} - -const RA288_GAIN_TAB: [f32; 8] = [ - 0.515625, 0.90234375, 1.57910156, 2.76342773, - -0.515625, -0.90234375, -1.57910156, -2.76342773 -]; - -const RA288_CODEBOOK: [[i16; 5]; 128] = [ - [ 668, -2950, -1254, -1790, -2553], [ -5032, -4577, -1045, 2908, 3318], - [ -2819, -2677, -948, -2825, -4450], [ -6679, -340, 1482, -1276, 1262], - [ -562, -6757, 1281, 179, -1274], [ -2512, -7130, -4925, 6913, 2411], - [ -2478, -156, 4683, -3873, 0], [ -8208, 2140, -478, -2785, 533], - [ 1889, 2759, 1381, -6955, -5913], [ 5082, -2460, -5778, 1797, 568], - [ -2208, -3309, -4523, -6236, -7505], [ -2719, 4358, -2988, -1149, 2664], - [ 1259, 995, 2711, -2464,-10390], [ 1722, -7569, -2742, 2171, -2329], - [ 1032, 747, -858, -7946,-12843], [ 3106, 4856, -4193, -2541, 1035], - [ 1862, -960, -6628, 410, 5882], [ -2493, -2628, -4000, -60, 7202], - [ -2672, 1446, 1536, -3831, 1233], [ -5302, 6912, 1589, -4187, 3665], - [ -3456, -8170, -7709, 1384, 4698], [ -4699, -6209,-11176, 8104, 16830], - [ 930, 7004, 1269, -8977, 2567], [ 4649, 11804, 3441, -5657, 1199], - [ 2542, -183, -8859, -7976, 3230], [ -2872, -2011, -9713, -8385, 12983], - [ 3086, 2140, -3680, -9643, -2896], [ -7609, 6515, -2283, -2522, 6332], - [ -3333, -5620, -9130,-11131, 5543], [ -407, -6721,-17466, -2889, 11568], - [ 3692, 6796, -262,-10846, -1856], [ 7275, 13404, -2989,-10595, 4936], - [ 244, -2219, 2656, 3776, -5412], [ -4043, -5934, 2131, 863, -2866], - [ -3302, 1743, -2006, -128, -2052], [ -6361, 3342, -1583, -21, 1142], - [ -3837, -1831, 6397, 2545, -2848], [ -9332, -6528, 5309, 1986, -2245], - [ -4490, 748, 1935, -3027, -493], [ -9255, 5366, 3193, -4493, 1784], - [ 4784, -370, 1866, 1057, -1889], [ 7342, -2690, -2577, 676, -611], - [ -502, 2235, -1850, -1777, -2049], [ 1011, 3880, -2465, 2209, -152], - [ 2592, 2829, 5588, 2839, -7306], [ -3049, -4918, 5955, 9201, -4447], - [ 697, 3908, 5798, -4451, -4644], [ -2121, 5444, -2570, 321, -1202], - [ 2846, -2086, 3532, 566, -708], [ -4279, 950, 4980, 3749, 452], - [ -2484, 3502, 1719, -170, 238], [ -3435, 263, 2114, -2005, 2361], - [ -7338, -1208, 9347, -1216, -4013], [-13498, -439, 8028, -4232, 361], - [ -3729, 5433, 2004, -4727, -1259], [ -3986, 7743, 8429, -3691, -987], - [ 5198, -423, 1150, -1281, 816], [ 7409, 4109, -3949, 2690, 30], - [ 1246, 3055, -35, -1370, -246], [ -1489, 5635, -678, -2627, 3170], - [ 4830, -4585, 2008, -1062, 799], [ -129, 717, 4594, 14937, 10706], - [ 417, 2759, 1850, -5057, -1153], [ -3887, 7361, -5768, 4285, 666], - [ 1443, -938, 20, -2119, -1697], [ -3712, -3402, -2212, 110, 2136], - [ -2952, 12, -1568, -3500, -1855], [ -1315, -1731, 1160, -558, 1709], - [ 88, -4569, 194, -454, -2957], [ -2839, -1666, -273, 2084, -155], - [ -189, -2376, 1663, -1040, -2449], [ -2842, -1369, 636, -248, -2677], - [ 1517, 79, -3013, -3669, -973], [ 1913, -2493, -5312, -749, 1271], - [ -2903, -3324, -3756, -3690, -1829], [ -2913, -1547, -2760, -1406, 1124], - [ 1844, -1834, 456, 706, -4272], [ 467, -4256, -1909, 1521, 1134], - [ -127, -994, -637, -1491, -6494], [ 873, -2045, -3828, -2792, -578], - [ 2311, -1817, 2632, -3052, 1968], [ 641, 1194, 1893, 4107, 6342], - [ -45, 1198, 2160, -1449, 2203], [ -2004, 1713, 3518, 2652, 4251], - [ 2936, -3968, 1280, 131, -1476], [ 2827, 8, -1928, 2658, 3513], - [ 3199, -816, 2687, -1741, -1407], [ 2948, 4029, 394, -253, 1298], - [ 4286, 51, -4507, -32, -659], [ 3903, 5646, -5588, -2592, 5707], - [ -606, 1234, -1607, -5187, 664], [ -525, 3620, -2192, -2527, 1707], - [ 4297, -3251, -2283, 812, -2264], [ 5765, 528, -3287, 1352, 1672], - [ 2735, 1241, -1103, -3273, -3407], [ 4033, 1648, -2965, -1174, 1444], - [ 74, 918, 1999, 915, -1026], [ -2496, -1605, 2034, 2950, 229], - [ -2168, 2037, 15, -1264, -208], [ -3552, 1530, 581, 1491, 962], - [ -2613, -2338, 3621, -1488, -2185], [ -1747, 81, 5538, 1432, -2257], - [ -1019, 867, 214, -2284, -1510], [ -1684, 2816, -229, 2551, -1389], - [ 2707, 504, 479, 2783, -1009], [ 2517, -1487, -1596, 621, 1929], - [ -148, 2206, -4288, 1292, -1401], [ -527, 1243, -2731, 1909, 1280], - [ 2149, -1501, 3688, 610, -4591], [ 3306, -3369, 1875, 3636, -1217], - [ 2574, 2513, 1449, -3074, -4979], [ 814, 1826, -2497, 4234, -4077], - [ 1664, -220, 3418, 1002, 1115], [ 781, 1658, 3919, 6130, 3140], - [ 1148, 4065, 1516, 815, 199], [ 1191, 2489, 2561, 2421, 2443], - [ 770, -5915, 5515, -368, -3199], [ 1190, 1047, 3742, 6927, -2089], - [ 292, 3099, 4308, -758, -2455], [ 523, 3921, 4044, 1386, 85], - [ 4367, 1006, -1252, -1466, -1383], [ 3852, 1579, -77, 2064, 868], - [ 5109, 2919, -202, 359, -509], [ 3650, 3206, 2303, 1693, 1296], - [ 2905, -3907, 229, -1196, -2332], [ 5977, -3585, 805, 3825, -3138], - [ 3746, -606, 53, -269, -3301], [ 606, 2018, -1316, 4064, 398] -]; - -const RA288_SPEECH_WINDOW: &[f32] = &[ - 0.576690972, 0.580838025, 0.585013986, 0.589219987, 0.59345597, 0.597723007, - 0.602020264, 0.606384277, 0.610748291, 0.615142822, 0.619598389, 0.624084473, - 0.628570557, 0.633117676, 0.637695313, 0.642272949, 0.646911621, 0.651580811, - 0.656280518, 0.66104126, 0.665802002, 0.670593262, 0.675445557, 0.680328369, - 0.685241699, 0.690185547, 0.695159912, 0.700164795, 0.705230713, 0.710327148, - 0.715454102, 0.720611572, 0.725830078, 0.731048584, 0.736328125, 0.741638184, - 0.747009277, 0.752380371, 0.7578125, 0.763305664, 0.768798828, 0.774353027, - 0.779937744, 0.785583496, 0.791229248, 0.796936035, 0.802703857, 0.808502197, - 0.814331055, 0.820220947, 0.826141357, 0.832092285, 0.838104248, 0.844146729, - 0.850250244, 0.856384277, 0.862548828, 0.868774414, 0.875061035, 0.881378174, - 0.88772583, 0.894134521, 0.900604248, 0.907104492, 0.913635254, 0.920227051, - 0.926879883, 0.933563232, 0.940307617, 0.94708252, 0.953918457, 0.96081543, - 0.96774292, 0.974731445, 0.981781006, 0.988861084, 0.994842529, 0.998565674, - 0.999969482, 0.99911499, 0.996002197, 0.990600586, 0.982910156, 0.973022461, - 0.960876465, 0.946533203, 0.930053711, 0.911437988, 0.89074707, 0.868041992, - 0.843322754, 0.816680908, 0.788208008, 0.757904053, 0.725891113, 0.692199707, - 0.656921387, 0.620178223, 0.582000732, 0.542480469, 0.501739502, 0.459838867, - 0.416900635, 0.373016357, 0.328277588, 0.282775879, 0.236663818, 0.189971924, - 0.142852783, 0.0954284668,0.0477600098 -]; -const RA288_SPEECH_BW_TAB: &[f32] = &[ - 0.98828125, 0.976699829, 0.965254128, 0.953942537, 0.942763507, 0.931715488, - 0.920796931, 0.910006344, 0.899342179, 0.888803005, 0.878387332, 0.868093729, - 0.857920766, 0.847867012, 0.837931097, 0.828111589, 0.818407178, 0.808816493, - 0.799338162, 0.789970934, 0.780713439, 0.771564424, 0.762522638, 0.753586829, - 0.744755745, 0.736028135, 0.727402806, 0.718878567, 0.710454226, 0.702128589, - 0.693900526, 0.685768902, 0.677732527, 0.669790328, 0.66194123, 0.654184103 -]; - -const RA288_GAIN_WINDOW: &[f32] = &[ - 0.505699992, 0.524200022, 0.54339999, 0.563300014, 0.583953857, 0.60534668, - 0.627502441, 0.650482178, 0.674316406, 0.699005127, 0.724578857, 0.75112915, - 0.778625488, 0.807128906, 0.836669922, 0.86730957, 0.899078369, 0.932006836, - 0.961486816, 0.982757568, 0.995635986, 1.0, 0.995819092, 0.983154297, - 0.96206665, 0.932769775, 0.895507813, 0.850585938, 0.798400879, 0.739379883, - 0.674072266, 0.602996826, 0.526763916, 0.446014404, 0.361480713, 0.273834229, - 0.183868408, 0.0923461914 -]; -const RA288_GAIN_BW_TAB: &[f32] = &[ - 0.90625, 0.821289063, 0.74432373, 0.674499512, 0.61126709, - 0.553955078, 0.50201416, 0.454956055, 0.41229248, 0.373657227 -]; diff --git a/src/codecs/real/ralf.rs b/src/codecs/real/ralf.rs deleted file mode 100644 index 3b5d88f..0000000 --- a/src/codecs/real/ralf.rs +++ /dev/null @@ -1,10377 +0,0 @@ -use crate::formats::*; -use crate::frame::*; -use crate::codecs::*; -use crate::io::byteio::*; -use crate::io::bitreader::*; -use crate::io::codebook::*; -use crate::io::intcode::*; - -struct CodebookSet { - filter_params_cb: Codebook<u16>, - bias_cb: Codebook<u16>, - coding_mode_cb: Codebook<u16>, - filter_coeffs_cb: Vec<Vec<Codebook<u16>>>, - short_codes_cb: Vec<Codebook<u16>>, - long_codes_cb: Vec<Codebook<u16>>, -} - -const MAX_ELEMS: usize = 644; -struct RALFCodebookDescReader { - len: usize, - codes: [u32; MAX_ELEMS], - bits: [u8; MAX_ELEMS], -} - -impl RALFCodebookDescReader { - fn new(table: &'static [u8], len: usize) -> Self { - let mut prefixes: [u32; 18] = [0; 18]; - let mut counts: [usize; 17] = [0; 17]; - - let mut codes: [u32; MAX_ELEMS] = [0; MAX_ELEMS]; - let mut bits: [u8; MAX_ELEMS] = [0; MAX_ELEMS]; - for i in 0..len { - let b = (if (i & 1) == 0 { table[i >> 1] >> 4 } else { table[i >> 1] & 0xF }) + 1; - bits[i] = b; - counts[b as usize] += 1; - } - for i in 1..17 { - prefixes[i + 1] = (prefixes[i] + (counts[i] as u32)) << 1; - } - for i in 0..len { - codes[i] = prefixes[bits[i] as usize]; - prefixes[bits[i] as usize] += 1; - } - - Self { len, codes, bits } - } -} - -impl CodebookDescReader<u16> for RALFCodebookDescReader { - fn bits(&mut self, idx: usize) -> u8 { self.bits[idx] } - fn code(&mut self, idx: usize) -> u32 { self.codes[idx] } - fn sym (&mut self, idx: usize) -> u16 { idx as u16 } - fn len(&mut self) -> usize { self.len } -} - -impl CodebookSet { - fn new(idx: usize) -> Self { - let mut cbr = RALFCodebookDescReader::new(&RALF_FILTER_PARAM_TAB[idx], RALF_FILTER_PARAM_LEN); - let filter_params_cb = Codebook::new(&mut cbr, CodebookMode::MSB).unwrap(); - - let mut cbr = RALFCodebookDescReader::new(&RALF_BIAS_TAB[idx], RALF_BIAS_LEN); - let bias_cb = Codebook::new(&mut cbr, CodebookMode::MSB).unwrap(); - - let mut cbr = RALFCodebookDescReader::new(&RALF_CODING_MODE_TAB[idx], RALF_CODING_MODE_LEN); - let coding_mode_cb = Codebook::new(&mut cbr, CodebookMode::MSB).unwrap(); - - let mut filter_coeffs_cb: Vec<Vec<Codebook<u16>>> = Vec::with_capacity(10); - for i in 0..10 { - let mut fcb: Vec<Codebook<u16>> = Vec::with_capacity(11); - for j in 0..11 { - let mut cbr = RALFCodebookDescReader::new(&RALF_FILTER_COEFFS_TAB[idx][i][j], RALF_FILTER_COEFFS_LEN); - fcb.push(Codebook::new(&mut cbr, CodebookMode::MSB).unwrap()); - } - filter_coeffs_cb.push(fcb); - } - - let mut short_codes_cb: Vec<Codebook<u16>> = Vec::with_capacity(15); - for i in 0..15 { - let mut cbr = RALFCodebookDescReader::new(&RALF_SHORT_CODES_TAB[idx][i], RALF_SHORT_CODES_LEN); - short_codes_cb.push(Codebook::new(&mut cbr, CodebookMode::MSB).unwrap()); - } - let mut long_codes_cb: Vec<Codebook<u16>> = Vec::with_capacity(125); - for i in 0..125 { - let mut cbr = RALFCodebookDescReader::new(&RALF_LONG_CODES_TAB[idx][i], RALF_LONG_CODES_LEN); - long_codes_cb.push(Codebook::new(&mut cbr, CodebookMode::MSB).unwrap()); - } - - Self { filter_params_cb, bias_cb, coding_mode_cb, filter_coeffs_cb, short_codes_cb, long_codes_cb } - } -} - -const FILTER_NONE: u16 = 0; -const FILTER_RAW: u16 = 642; -struct Filter { - params: u16, - length: usize, - bits: u8, - coeffs: [i32; 64], -} - -impl Filter { - fn new() -> Self { - Self { params: 0, length: 0, bits: 0, coeffs: [0; 64] } - } - fn init(&mut self) { - if self.params > 1 { - self.bits = ((self.params - 2) >> 6) as u8; - self.length = (self.params as usize) - ((self.bits as usize) << 6) - 1; - } else { - self.bits = 0; - self.length = 0; - } - } - fn is_none(&self) -> bool { self.params == FILTER_NONE } - fn is_raw(&self) -> bool { self.params == FILTER_RAW } - fn read_coeffs(&mut self, br: &mut BitReader, cset: &CodebookSet) -> DecoderResult<()> { - let coeff_cb = &cset.filter_coeffs_cb[self.bits as usize]; - let mut cmode: i32 = 0; - let mut coeff = 0; - for i in 0..self.length { - let val = br.read_cb(&coeff_cb[(cmode + 5) as usize]).unwrap(); - let m = extend_code(br, val, 21, self.bits).unwrap(); - if cmode == 0 { - coeff -= 12 << self.bits; - } - coeff = m - coeff; - self.coeffs[i] = coeff; - - cmode = coeff >> self.bits; - if cmode < 0 { - cmode = -1 - (31 - ((-cmode).leading_zeros() as i32)); - if cmode < -5 { cmode = -5; } - } else if cmode > 0 { - cmode = 1 + (31 - (cmode.leading_zeros() as i32)); - if cmode > 5 { cmode = 5; } - } - } - if !self.is_raw() && (self.params > 1) { self.bits += 3; } - Ok(()) - } - fn predict(&self, src: &[i32], bits: u8) -> i32 { - let mut acc: i32 = 0; - for (f, s) in src.iter().rev().take(self.length).zip(self.coeffs.into_iter()) { - acc += *f * *s; - } - let bias = 1 << (self.bits - 1); - if acc < 0 { - let low_bound = -(1 << bits); - ((acc + bias - 1) >> self.bits).max(low_bound) - } else { - let high_bound = (1 << bits) - 1; - ((acc + bias) >> self.bits).min(high_bound) - } - } -} - -struct Channel { - bias: i32, - mode: u8, - bits: u8, - data: [i32; 4096], - filter: Filter, -} - -fn extend_code(br: &mut BitReader, code: u16, range: i32, bits: u8) -> DecoderResult<i32> { - let mut val; - if code == 0 { - val = -range - (br.read_code(UintCodeType::GammaP).unwrap() as i32) + 1; - } else if (code as i32) == range * 2 { - val = range + (br.read_code(UintCodeType::GammaP).unwrap() as i32) - 1; - } else { - val = (code as i32) - range; - } - if bits != 0 { - val = (val << bits) | (br.read(bits).unwrap() as i32); - } - - Ok(val) -} - -impl Channel { - fn new() -> Self { - Self { bias: 0, mode: 0, bits: 0, data: [0; 4096], filter: Filter::new() } - } - fn decode(&mut self, br: &mut BitReader, codebooks: &[CodebookSet; 3], length: usize) -> DecoderResult<()> { - let cset = &codebooks[self.mode as usize]; - self.filter.params = br.read_cb(&cset.filter_params_cb).unwrap(); - self.filter.init(); - - if self.filter.is_raw() { - for i in 0..length { - self.data[i] = br.read(self.filter.bits).unwrap() as i32; - } - self.bias = 0; - return Ok(()); - } - let bias = br.read_cb(&cset.bias_cb).unwrap(); - self.bias = extend_code(br, bias, 127, 4).unwrap(); - if self.filter.is_none() { - self.data = [0; 4096]; - return Ok(()); - } - - self.filter.read_coeffs(br, cset).unwrap(); - - let code_params = br.read_cb(&cset.coding_mode_cb).unwrap(); - let (add_bits, range, range2, codes_cb) = if code_params >= 15 { - let mut add_bits = ((code_params / 5 - 3) / 2).max(0).min(10) as u8; - if add_bits > 9 && ((code_params % 5) != 2) { - add_bits -= 1; - } - (add_bits, 10, 21, &cset.long_codes_cb[(code_params as usize) - 15]) - } else { - (0, 6, 13, &cset.short_codes_cb[code_params as usize]) - }; - - for i in 0..length/2 { - let val = br.read_cb(codes_cb).unwrap(); - let code0 = val / range2; - let code1 = val % range2; - self.data[i*2 + 0] = extend_code(br, code0, range, 0).unwrap() << add_bits; - self.data[i*2 + 1] = extend_code(br, code1, range, 0).unwrap() << add_bits; - if add_bits != 0 { - self.data[i*2 + 0] |= br.read(add_bits).unwrap() as i32; - self.data[i*2 + 1] |= br.read(add_bits).unwrap() as i32; - } - } - - Ok(()) - } - fn restore(&mut self, length: usize) { - if self.filter.is_none() || (self.filter.params == 1) { return; } - for i in 1..length { - self.data[i] += self.filter.predict(&self.data[..i], self.bits); - } - } -} - -#[derive(Clone,Copy)] -struct Block { - size: usize, - _pts: u16, -} - -const RALF_MAX_PACKET_SIZE: usize = 8192; -struct RALFDecoder { - info: Rc<NACodecInfo>, - chmap: NAChannelMap, - channels: u8, - - max_frame_size: usize, - - codebooks: [CodebookSet; 3], - ch_data: [Channel; 2], - - sample_offset: usize, - blocks: Vec<Block>, - - has_pkt: bool, - pkt_buf: [u8; 16384], -} - -impl RALFDecoder { - fn new() -> Self { - RALFDecoder { - info: NACodecInfo::new_dummy(), - chmap: NAChannelMap::new(), - channels: 0, - - has_pkt: false, - pkt_buf: [0; 16384], - codebooks: [CodebookSet::new(0), CodebookSet::new(1), CodebookSet::new(2)], - ch_data: [Channel::new(), Channel::new()], - sample_offset: 0, - max_frame_size: 0, - blocks: Vec::with_capacity(32), - } - } - fn decode_block(&mut self, off: usize, size: usize, abuf: &mut NABufferType) -> DecoderResult<()> { - let mut br = BitReader::new(&self.pkt_buf[off..][..size], size, BitReaderMode::BE); - - let length = read_block_length(&mut br).unwrap(); - validate!(length + self.sample_offset <= self.max_frame_size); - - let dmode; - if self.channels > 1 { - dmode = (br.read(2).unwrap() + 1) as u8; - } else { - dmode = 0; - } - self.ch_data[0].mode = dmode >> 2; - self.ch_data[0].bits = 16; - self.ch_data[1].mode = if dmode >= 2 { 2 } else { 0 }; - self.ch_data[1].bits = if self.ch_data[1].mode == 2 { 17 } else { 16 }; - - for ch in 0..self.channels { - self.ch_data[ch as usize].decode(&mut br, &self.codebooks, length).unwrap(); - self.ch_data[ch as usize].restore(length); - } - - let ch0 = abuf.get_offset(0) + self.sample_offset; - let ch1 = abuf.get_offset(1) + self.sample_offset; - let mut adata = abuf.get_abuf_i16().unwrap(); - let mut output = adata.get_data_mut(); - match dmode { - 0 => { - for i in 0..length { - output[ch0 + i] = (self.ch_data[0].data[i] + self.ch_data[0].bias) as i16; - } - }, - 1 => { - for i in 0..length { - output[ch0 + i] = (self.ch_data[0].data[i] + self.ch_data[0].bias) as i16; - output[ch1 + i] = (self.ch_data[1].data[i] + self.ch_data[1].bias) as i16; - } - }, - 2 => { - for i in 0..length { - let c0v = self.ch_data[0].data[i] + self.ch_data[0].bias; - let c1v = self.ch_data[1].data[i] + self.ch_data[1].bias; - output[ch0 + i] = c0v as i16; - output[ch1 + i] = (c0v - c1v) as i16; - } - }, - 3 => { - for i in 0..length { - let c0v = self.ch_data[0].data[i] + self.ch_data[0].bias; - let c1v = self.ch_data[1].data[i] + self.ch_data[1].bias; - output[ch0 + i] = (c0v + c1v) as i16; - output[ch1 + i] = c0v as i16; - } - }, - 4 => { - for i in 0..length { - let c0v = self.ch_data[0].data[i] + self.ch_data[0].bias; - let c1v = self.ch_data[1].data[i] + self.ch_data[1].bias; - let t = (c0v << 1) | (c1v & 1); - output[ch0 + i] = ((t + c1v) / 2) as i16; - output[ch1 + i] = ((t - c1v) / 2) as i16; - } - }, - _ => unreachable!(), - } - self.sample_offset += length; - - Ok(()) - } -} - -fn read_block_length(br: &mut BitReader) -> DecoderResult<usize> { - let code = br.read_code(UintCodeType::LimitedUnary(6, 0)).unwrap() as usize; - let mut len = 12 - code; - if len <= 7 { len ^= 1; } - Ok(1 << len) -} - -impl NADecoder for RALFDecoder { - fn init(&mut self, info: Rc<NACodecInfo>) -> DecoderResult<()> { - if let NACodecTypeInfo::Audio(ainfo) = info.get_properties() { - let edata = info.get_extradata().unwrap(); - - validate!(edata.len() >= 20); - let mut mr = MemoryReader::new_read(&edata); - let mut br = ByteReader::new(&mut mr); - br.read_skip(4).unwrap(); - let version = br.read_u16be().unwrap(); - br.read_skip(2).unwrap(); - validate!(version == 0x103); - let channels = br.read_u16be().unwrap(); - let _bits = br.read_u16be().unwrap(); - let sample_rate = br.read_u32be().unwrap(); - let max_frame_size = br.read_u32be().unwrap(); - validate!((channels == 1 || channels == 2) && (sample_rate >= 8000 && sample_rate <= 96000)); - self.max_frame_size = max_frame_size.max(sample_rate) as usize; - - let ainfo = NAAudioInfo::new(ainfo.get_sample_rate(), channels as u8, - SND_S16P_FORMAT, self.max_frame_size); - self.info = info.replace_info(NACodecTypeInfo::Audio(ainfo)); - self.channels = channels as u8; - if channels == 1 { - self.chmap.add_channel(NAChannelType::C); - } else { - self.chmap.add_channel(NAChannelType::L); - self.chmap.add_channel(NAChannelType::R); - } - - Ok(()) - } else { - Err(DecoderError::InvalidData) - } - } - fn decode(&mut self, pkt: &NAPacket) -> DecoderResult<NAFrameRef> { - let info = pkt.get_stream().get_info(); - validate!(info.get_properties().is_audio()); - let pktbuf = pkt.get_buffer(); - let ainfo = self.info.get_properties().get_audio_info().unwrap(); - - let src_len; - if self.has_pkt { - self.has_pkt = false; - let table_bits = ((pktbuf[0] as usize) << 8) | (pktbuf[1] as usize); - let table_bytes = table_bits >> 3; - validate!((table_bytes + 3 <= pktbuf.len()) && (pktbuf.len() <= RALF_MAX_PACKET_SIZE)); - let cmp_len = table_bytes + 2; - validate!(&pktbuf[..cmp_len] == &self.pkt_buf[..cmp_len]); - { - let copy_size = pktbuf.len() - cmp_len; - let dst = &mut self.pkt_buf[RALF_MAX_PACKET_SIZE..][..copy_size]; - dst.copy_from_slice(&pktbuf[cmp_len..]); - src_len = RALF_MAX_PACKET_SIZE + copy_size; - } - } else { - let dst = &mut self.pkt_buf[..pktbuf.len()]; - dst.copy_from_slice(&pktbuf[0..]); - if pktbuf.len() == RALF_MAX_PACKET_SIZE { //todo better solution - self.has_pkt = true; - - let mut frm = NAFrame::new_from_pkt(pkt, self.info.replace_info(NACodecTypeInfo::Audio(ainfo)), NABufferType::None); - frm.set_frame_type(FrameType::Skip); - return Ok(Rc::new(RefCell::new(frm))); - } - src_len = pktbuf.len(); - } - validate!(src_len >= 5); - - let table_bits = ((self.pkt_buf[0] as usize) << 8) | (self.pkt_buf[1] as usize); - let table_bytes = (table_bits + 7) >> 3; - validate!(src_len > table_bytes + 3); - self.blocks.truncate(0); - { - let mut br = BitReader::new(&self.pkt_buf[2..], table_bytes, BitReaderMode::BE); - while br.tell() < table_bits.into() { - let size = br.read(13 + self.channels).unwrap() as usize; - let pts; - if br.read_bool().unwrap() { - pts = br.read(9).unwrap() as u16; - } else { - pts = 0; - } - self.blocks.push(Block{ size, _pts: pts }); - } - } - let mut off = table_bytes + 2; - let mut alength: usize = 0; - for blk_no in 0..self.blocks.len() { - let bsize = self.blocks[blk_no].size; - validate!(src_len - off >= bsize); - let mut bits = 12 - (!self.pkt_buf[off]).leading_zeros(); - if bits < 6 { bits = 6; } - if bits <= 7 { bits ^= 1; } - alength += 1 << bits; - off += bsize; - } - validate!(alength <= self.max_frame_size); - let mut abuf = alloc_audio_buffer(ainfo, alength, self.chmap.clone()).unwrap(); - - self.sample_offset = 0; - let mut off = table_bytes + 2; - for blk_no in 0..self.blocks.len() { - let bsize = self.blocks[blk_no].size; - validate!(src_len - off >= bsize); - self.decode_block(off, bsize, &mut abuf).unwrap(); - off += bsize; - } - - let mut frm = NAFrame::new_from_pkt(pkt, self.info.replace_info(NACodecTypeInfo::Audio(ainfo)), abuf); - frm.set_keyframe(true); - Ok(Rc::new(RefCell::new(frm))) - } -} - -pub fn get_decoder() -> Box<NADecoder> { - Box::new(RALFDecoder::new()) -} - -#[cfg(test)] -mod test { - use crate::test::dec_video::*; - #[test] - fn test_ralf() { - let file = "assets/RV/rv40_ralf.rmvb"; - test_decode_audio("realmedia", file, Some(2000), "ralf"); -//panic!("end"); - } -} - -const RALF_FILTER_PARAM_LEN: usize = 643; -const RALF_BIAS_LEN: usize = 255; -const RALF_CODING_MODE_LEN: usize = 140; -const RALF_FILTER_COEFFS_LEN: usize = 43; -const RALF_SHORT_CODES_LEN: usize = 169; -const RALF_LONG_CODES_LEN: usize = 441; - -const RALF_FILTER_PARAM_TAB: [[u8; 324]; 3] = [ - [ - 0x48, 0x86, 0x66, 0x8A, 0xBB, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xB4, 0x54, 0x45, - 0x66, 0x88, 0xAA, 0xAB, 0xCF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x65, 0x45, 0x55, 0x66, 0x77, 0x78, - 0x99, 0x99, 0xAA, 0xAB, 0xBB, 0xBC, 0xCB, 0xBF, 0xFF, 0xCF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xF9, 0x86, 0x55, 0x55, 0x55, 0x66, 0x67, 0x77, 0x88, 0x88, 0x99, - 0x99, 0x99, 0x99, 0x99, 0x9A, 0xAA, 0x9B, 0xBB, 0xCB, 0xBB, 0xCC, 0xCC, - 0xCF, 0xFF, 0xCC, 0xCF, 0xFC, 0xBC, 0xCC, 0xFB, 0xB9, 0xFC, 0xA8, 0x76, - 0x66, 0x56, 0x66, 0x67, 0x67, 0x77, 0x78, 0x88, 0x88, 0x89, 0x88, 0x89, - 0x99, 0x99, 0x9A, 0x9A, 0x9A, 0x9A, 0xAA, 0xAA, 0xAA, 0xAA, 0x9A, 0xA9, - 0xAB, 0xA9, 0xA9, 0x98, 0x86, 0xFF, 0xCA, 0x88, 0x77, 0x77, 0x77, 0x77, - 0x77, 0x88, 0x88, 0x88, 0x88, 0x99, 0x99, 0x99, 0x98, 0x99, 0x99, 0x9A, - 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x98, 0x88, 0x87, - 0x65, 0xFF, 0xFB, 0xAA, 0xA9, 0x88, 0x88, 0x89, 0x99, 0x98, 0x99, 0x9A, - 0xA9, 0x9A, 0xA9, 0xAA, 0xA9, 0x9A, 0xAA, 0xA9, 0xAA, 0xA9, 0x99, 0x99, - 0xA9, 0x9A, 0x99, 0x99, 0x99, 0x98, 0x88, 0x77, 0x64, 0xFF, 0xFF, 0xFC, - 0xBB, 0xBA, 0xB9, 0xAA, 0xAB, 0xAA, 0xAA, 0xBA, 0xAB, 0xAB, 0xAB, 0xCB, - 0xBA, 0xAB, 0xBB, 0xBB, 0xAA, 0xBA, 0xAA, 0xAA, 0xAA, 0xA9, 0xAA, 0x99, - 0x99, 0x99, 0x88, 0x87, 0x64, 0xFF, 0xFF, 0xFF, 0xFF, 0xCB, 0xBB, 0xBB, - 0xBB, 0xBB, 0xBB, 0xCB, 0xBB, 0xBC, 0xBB, 0xCC, 0xFB, 0xCC, 0xCF, 0xCF, - 0xCC, 0xFC, 0xFC, 0xCF, 0xCB, 0xCC, 0xBB, 0xBB, 0xCB, 0xBB, 0xAA, 0x99, - 0x86, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xB8, 0xA0, 0x00, 0x00, - ], [ - 0xFB, 0x95, 0x67, 0x8B, 0xFB, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF7, 0x55, 0x56, - 0x77, 0x89, 0xBA, 0xBB, 0xCF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xB8, 0x65, 0x55, 0x55, 0x56, 0x77, 0x78, - 0x89, 0x9A, 0xAA, 0xAA, 0xBC, 0xBC, 0xCB, 0xBC, 0xCF, 0xCF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFB, 0x86, 0x55, 0x55, 0x55, 0x55, 0x56, 0x67, 0x77, 0x77, 0x88, - 0x89, 0x9A, 0x99, 0x99, 0xAA, 0xBB, 0xBB, 0xAB, 0xBF, 0xCB, 0xFA, 0xCC, - 0xFC, 0xEC, 0xEF, 0xFB, 0xBC, 0xFF, 0xBC, 0xBB, 0xA9, 0xFF, 0x98, 0x76, - 0x66, 0x66, 0x65, 0x66, 0x66, 0x76, 0x77, 0x77, 0x77, 0x88, 0x88, 0x88, - 0x89, 0x99, 0x99, 0x99, 0x99, 0xA9, 0x99, 0x99, 0x9A, 0x99, 0x99, 0xAA, - 0xAA, 0xA9, 0x99, 0x98, 0x76, 0xFF, 0xF9, 0x87, 0x77, 0x77, 0x77, 0x77, - 0x77, 0x77, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88, 0x99, 0x99, 0x89, 0x99, - 0x99, 0x99, 0x99, 0x89, 0x99, 0x99, 0x99, 0x98, 0x99, 0x98, 0x77, 0x77, - 0x65, 0xFF, 0xCA, 0xA9, 0x99, 0x89, 0x88, 0x88, 0x98, 0x89, 0x99, 0x98, - 0x99, 0x99, 0x99, 0x99, 0x9A, 0x99, 0x99, 0xA9, 0x9A, 0xA9, 0x99, 0x99, - 0x99, 0x99, 0xA9, 0x99, 0x99, 0x98, 0x88, 0x77, 0x64, 0xFF, 0xCB, 0xA9, - 0xA9, 0xAA, 0xAA, 0xAA, 0x9A, 0xAB, 0xAA, 0x9A, 0xBB, 0xAB, 0xAB, 0xBB, - 0xAB, 0xBA, 0xBB, 0xBA, 0xAA, 0xBA, 0xBA, 0xAA, 0xAA, 0xA9, 0xA9, 0x99, - 0x99, 0x99, 0x88, 0x77, 0x64, 0xFF, 0xFF, 0xFF, 0xBC, 0xFB, 0xCB, 0xBB, - 0xBB, 0xBB, 0xBA, 0xBA, 0xAB, 0xBF, 0xCB, 0xBB, 0xBB, 0xBC, 0xBF, 0xCC, - 0xCB, 0xCB, 0xCC, 0xBB, 0xBB, 0xFB, 0xCB, 0xBC, 0xCA, 0xBC, 0xAA, 0xA9, - 0x86, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xCF, 0xFF, 0xFC, 0xFF, 0xFF, 0xCF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFA, 0xF0, 0x00, 0x00, - ], [ - 0x9B, 0x65, 0x67, 0xAB, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xB5, 0x54, 0x56, - 0x67, 0x88, 0xA9, 0xAB, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xA8, 0x65, 0x44, 0x45, 0x56, 0x67, 0x78, - 0x89, 0x99, 0xA9, 0xAA, 0xBB, 0xBB, 0xAB, 0xBC, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xF9, 0x76, 0x55, 0x54, 0x55, 0x55, 0x56, 0x67, 0x77, 0x77, 0x88, - 0x89, 0x99, 0x98, 0x99, 0x8A, 0x99, 0xBB, 0xAB, 0xBC, 0xAB, 0xBA, 0xAA, - 0xBB, 0xCB, 0xCC, 0xBB, 0xCC, 0xBB, 0xAC, 0xBA, 0x97, 0xFB, 0x97, 0x76, - 0x66, 0x66, 0x66, 0x66, 0x67, 0x77, 0x77, 0x77, 0x88, 0x88, 0x88, 0x88, - 0x99, 0x89, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x9A, 0x98, 0x99, 0x99, - 0xA9, 0x99, 0x88, 0x87, 0x65, 0xFF, 0xCA, 0x98, 0x87, 0x77, 0x77, 0x87, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, - 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x88, 0x87, 0x77, - 0x64, 0xFF, 0xFC, 0xCA, 0xAA, 0x99, 0x99, 0x99, 0x99, 0x99, 0xAA, 0x9A, - 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, - 0xAA, 0xAA, 0x99, 0x99, 0x99, 0x89, 0x88, 0x87, 0x64, 0xFF, 0xFF, 0xFB, - 0xFF, 0xBC, 0xFC, 0xBB, 0xCB, 0xBB, 0xCA, 0xCB, 0xBC, 0xCC, 0xBF, 0xBC, - 0xBB, 0xBB, 0xBE, 0xBC, 0xCB, 0xCC, 0xBB, 0xFC, 0xBC, 0xCC, 0xAB, 0xCB, - 0xAB, 0xBB, 0xAA, 0xA9, 0x97, 0xFF, 0xFF, 0xFF, 0xFF, 0xBB, 0xCF, 0xFB, - 0xCC, 0xFC, 0xCF, 0xFC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFB, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00, - ] -]; - -const RALF_BIAS_TAB: [[u8; 128]; 3] = [ - [ - 0x4A, 0xAA, 0xAA, 0xAA, 0xBA, 0xBA, 0xBA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, - 0xAA, 0xAA, 0xAA, 0xAB, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0x9A, 0xA9, 0xA9, - 0x99, 0xA9, 0x99, 0x99, 0xA9, 0xA9, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, - 0x99, 0x99, 0x88, 0x98, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x77, 0x78, 0x77, 0x77, 0x77, 0x77, 0x66, 0x66, 0x66, 0x55, 0x55, 0x55, - 0x55, 0x54, 0x44, 0x32, 0x44, 0x55, 0x55, 0x66, 0x66, 0x66, 0x66, 0x77, - 0x77, 0x77, 0x77, 0x77, 0x77, 0x87, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x89, 0x88, 0x89, 0x89, 0x99, 0x99, 0x98, 0x99, 0x9A, - 0x99, 0x99, 0x99, 0x99, 0x9A, 0xA9, 0x9A, 0x99, 0x9A, 0xA9, 0xA9, 0xA9, - 0xAA, 0xAA, 0xA9, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xBB, 0xAA, 0xAA, 0xAA, - 0xAA, 0xBA, 0xAA, 0xAA, 0xAA, 0xAA, 0xBA, 0x40, - ], [ - 0x4C, 0xBC, 0xAC, 0xBC, 0xBA, 0xAB, 0xAB, 0xBB, 0xBA, 0xAA, 0xAB, 0xAA, - 0xBB, 0xAA, 0xBB, 0xAA, 0xAB, 0xBA, 0xBA, 0xAA, 0xBB, 0xAA, 0xA9, 0xAA, - 0xBB, 0xAA, 0xAA, 0x9A, 0x9A, 0xAA, 0xA9, 0xAA, 0x99, 0x99, 0x99, 0x99, - 0x99, 0x99, 0x99, 0x99, 0x98, 0x98, 0x98, 0x89, 0x88, 0x88, 0x88, 0x88, - 0x87, 0x78, 0x77, 0x77, 0x77, 0x77, 0x67, 0x66, 0x66, 0x55, 0x44, 0x45, - 0x54, 0x44, 0x44, 0x33, 0x44, 0x45, 0x55, 0x56, 0x66, 0x66, 0x66, 0x67, - 0x77, 0x77, 0x77, 0x77, 0x87, 0x87, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x99, 0x88, 0x99, 0x99, 0x89, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0xA9, - 0xA9, 0xAA, 0x9A, 0xA9, 0xAA, 0x9A, 0xAA, 0x9A, 0xAA, 0xAB, 0xAA, 0xAA, - 0xAA, 0xAA, 0xAA, 0xAA, 0xBB, 0xBC, 0xBB, 0xBA, 0xAA, 0xAB, 0xAB, 0xAA, - 0xAB, 0xAB, 0xAC, 0xBB, 0xAA, 0xBB, 0xBB, 0x40, - ], [ - 0x5B, 0xBB, 0xBC, 0xBB, 0xCB, 0xCC, 0xBB, 0xBB, 0xBC, 0xCC, 0xBB, 0xCB, - 0xBA, 0xCB, 0xBC, 0xBB, 0xAA, 0xBB, 0xAB, 0xBA, 0xBB, 0xBB, 0xAB, 0xBB, - 0xAA, 0xBA, 0xBA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xA9, 0x9A, - 0x9A, 0x99, 0x9A, 0x99, 0x99, 0x99, 0x99, 0x99, 0x98, 0x98, 0x89, 0x99, - 0x88, 0x88, 0x88, 0x88, 0x77, 0x77, 0x77, 0x77, 0x77, 0x66, 0x66, 0x55, - 0x54, 0x44, 0x43, 0x22, 0x34, 0x44, 0x55, 0x56, 0x66, 0x66, 0x67, 0x77, - 0x77, 0x77, 0x87, 0x88, 0x88, 0x88, 0x88, 0x88, 0x99, 0x89, 0x99, 0x99, - 0x99, 0x99, 0x99, 0x9A, 0x9A, 0xA9, 0xA9, 0x9A, 0x9A, 0xAA, 0x9A, 0xAA, - 0xAA, 0xAA, 0xBA, 0xAA, 0xAA, 0xAA, 0xBA, 0xAA, 0xAA, 0xAB, 0xBA, 0xBB, - 0xAA, 0xBB, 0xAB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBC, - 0xBB, 0xBC, 0xBB, 0xBB, 0xCC, 0xBC, 0xCB, 0x50, - ] -]; - -const RALF_CODING_MODE_TAB: [[u8; 72]; 3] = [ - [ - 0xAA, 0x99, 0xAC, 0xB9, 0xBD, 0xAA, 0x7A, 0xA8, 0xA8, 0xA8, 0x79, 0x79, - 0x77, 0xA8, 0x97, 0x79, 0x89, 0x77, 0x87, 0x87, 0x68, 0x78, 0x66, 0x86, - 0x87, 0x67, 0x68, 0x66, 0x76, 0x76, 0x57, 0x67, 0x55, 0x75, 0x65, 0x56, - 0x56, 0x55, 0x65, 0x65, 0x56, 0x45, 0x55, 0x54, 0x55, 0x55, 0x45, 0x55, - 0x54, 0x55, 0x55, 0x45, 0x56, 0x64, 0x66, 0x76, 0x57, 0x67, 0x77, 0x77, - 0x98, 0x88, 0x9D, 0xBF, 0xBA, 0xEC, 0xFC, 0xBA, 0xEF, 0xFC, 0x00, 0x00, - ], [ - 0xCF, 0x9B, 0xAF, 0xFF, 0xFF, 0xAB, 0x8A, 0x98, 0xB8, 0xF9, 0x78, 0x89, - 0x77, 0xF9, 0xF7, 0x79, 0x89, 0x77, 0x97, 0x97, 0x68, 0x68, 0x66, 0xA6, - 0x87, 0x77, 0x68, 0x66, 0x75, 0x76, 0x67, 0x56, 0x65, 0x75, 0x75, 0x56, - 0x56, 0x55, 0x65, 0x65, 0x56, 0x56, 0x55, 0x54, 0x55, 0x55, 0x45, 0x55, - 0x53, 0x55, 0x65, 0x35, 0x67, 0x64, 0x66, 0x66, 0x56, 0x78, 0x86, 0x88, - 0xA8, 0xFB, 0xAF, 0xFF, 0xAF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, - ], [ - 0xDC, 0xAD, 0xCC, 0xCA, 0xCF, 0xFE, 0xDF, 0xFF, 0xE9, 0xFF, 0x99, 0x79, - 0x97, 0x97, 0x97, 0x79, 0x79, 0x77, 0x97, 0x97, 0x79, 0x79, 0x77, 0x86, - 0x87, 0x68, 0x68, 0x76, 0x76, 0x76, 0x67, 0x57, 0x66, 0x65, 0x76, 0x66, - 0x56, 0x55, 0x64, 0x65, 0x55, 0x45, 0x55, 0x54, 0x55, 0x55, 0x35, 0x55, - 0x53, 0x55, 0x65, 0x35, 0x67, 0x64, 0x67, 0x87, 0x57, 0x8A, 0x86, 0x8B, - 0xBA, 0x9A, 0xCD, 0xAA, 0xAF, 0xFC, 0xFF, 0xFF, 0xDF, 0xFF, 0x00, 0x00, - ] -]; - -const RALF_FILTER_COEFFS_TAB: [[[[u8; 24]; 11]; 10]; 3] = [ - [ - [ - [ - 0x47, 0x88, 0x76, 0x52, 0x12, 0x35, 0x44, 0x43, 0x34, 0x45, 0x77, 0x67, - 0x66, 0x87, 0x87, 0x7D, 0x8A, 0x89, 0x9D, 0xDD, 0x9C, 0xC0, 0x00, 0x00, - ], - [ - 0x7C, 0xCC, 0xC7, 0x65, 0xCC, 0x22, 0x23, 0x46, 0x32, 0x22, 0x46, 0x7B, - 0xB6, 0xBB, 0xBB, 0xBC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xC0, 0x00, 0x00, - ], - [ - 0xBB, 0xBB, 0xB4, 0x43, 0x25, 0x5B, 0x5A, 0xAB, 0x5B, 0x22, 0x22, 0x2B, - 0xBA, 0xAA, 0x46, 0x5B, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xB0, 0x00, 0x00, - ], - [ - 0x99, 0x89, 0x88, 0x89, 0x31, 0x88, 0x88, 0x89, 0x88, 0x38, 0x88, 0x13, - 0x28, 0x88, 0x88, 0x28, 0x88, 0x88, 0x88, 0x88, 0x99, 0x90, 0x00, 0x00, - ], - [ - 0x99, 0x89, 0x88, 0x89, 0x88, 0x88, 0x88, 0x39, 0x98, 0x88, 0x88, 0x88, - 0x08, 0x88, 0x88, 0x81, 0x99, 0x88, 0x99, 0x99, 0x99, 0x20, 0x00, 0x00, - ], - [ - 0xAA, 0xD9, 0x86, 0xCD, 0xDD, 0xDD, 0x98, 0x76, 0x43, 0x65, 0x35, 0x63, - 0x23, 0x44, 0x33, 0x24, 0x45, 0x44, 0x45, 0x59, 0xA8, 0x90, 0x00, 0x00, - ], - [ - 0x99, 0x89, 0x88, 0x89, 0x98, 0x88, 0x88, 0x89, 0x98, 0x08, 0x88, 0x88, - 0x28, 0x88, 0x88, 0x83, 0x19, 0x98, 0x88, 0x99, 0x99, 0x90, 0x00, 0x00, - ], - [ - 0xBA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xA5, 0xA4, 0x01, 0x4A, 0xAA, - 0x53, 0x4A, 0xA4, 0xAA, 0x5A, 0xAA, 0xAA, 0xAA, 0xAA, 0xB0, 0x00, 0x00, - ], - [ - 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0x9A, 0xAA, 0xA3, 0x31, 0x31, - 0x34, 0x34, 0xA9, 0xA5, 0x44, 0x4A, 0xAA, 0xAA, 0xAA, 0xA0, 0x00, 0x00, - ], - [ - 0xEE, 0xDE, 0xED, 0xDE, 0xEE, 0xED, 0xDD, 0xDE, 0xE8, 0xEE, 0xE7, 0x64, - 0x47, 0x43, 0x30, 0x43, 0x43, 0x36, 0x7E, 0xEE, 0xEE, 0x90, 0x00, 0x00, - ], - [ - 0x67, 0x87, 0x87, 0x66, 0x65, 0x55, 0x44, 0x45, 0x65, 0x54, 0x54, 0x32, - 0x34, 0x66, 0x63, 0x55, 0x44, 0x54, 0x34, 0x45, 0x56, 0x60, 0x00, 0x00, - ], - ], - [ - [ - 0x56, 0x66, 0x65, 0x54, 0x33, 0x34, 0x33, 0x33, 0x33, 0x34, 0x44, 0x45, - 0x56, 0x66, 0x67, 0x77, 0x77, 0x77, 0x78, 0x89, 0x89, 0x60, 0x00, 0x00, - ], - [ - 0x78, 0x89, 0x98, 0x65, 0x65, 0x32, 0x22, 0x32, 0x33, 0x33, 0x45, 0x77, - 0x77, 0x8B, 0x9A, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0xEE, 0xF0, 0x00, 0x00, - ], - [ - 0x9D, 0xD8, 0x8D, 0x57, 0x56, 0x55, 0x44, 0x45, 0x22, 0x22, 0x23, 0x34, - 0x57, 0x78, 0x88, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xD0, 0x00, 0x00, - ], - [ - 0xDC, 0xCC, 0x8C, 0xCC, 0x87, 0x65, 0x55, 0x54, 0x23, 0x44, 0x21, 0x23, - 0x46, 0x56, 0x87, 0x7C, 0x8C, 0x8C, 0xCC, 0xCC, 0xCC, 0xD0, 0x00, 0x00, - ], - [ - 0xDD, 0xCD, 0xCC, 0xCD, 0xDC, 0xC7, 0x64, 0x58, 0x31, 0x25, 0x33, 0x22, - 0x44, 0x56, 0x66, 0x6D, 0xDD, 0xDD, 0xDC, 0xDC, 0xDC, 0xD0, 0x00, 0x00, - ], - [ - 0xB9, 0x99, 0xA6, 0x67, 0x78, 0x76, 0x78, 0x88, 0x66, 0x55, 0x44, 0x43, - 0x23, 0x33, 0x33, 0x33, 0x34, 0x45, 0x56, 0x66, 0x88, 0xB0, 0x00, 0x00, - ], - [ - 0xDD, 0xCD, 0xDC, 0xCD, 0xDC, 0xCC, 0x77, 0xC5, 0x53, 0x12, 0x23, 0x33, - 0x33, 0x46, 0x65, 0x75, 0x8D, 0xDD, 0xDD, 0xDC, 0xDC, 0xD0, 0x00, 0x00, - ], - [ - 0xDD, 0xCD, 0xCC, 0xCD, 0xDC, 0xCC, 0x8C, 0x85, 0x55, 0x33, 0x21, 0x23, - 0x33, 0x44, 0x56, 0x56, 0x56, 0x8D, 0xDD, 0xCC, 0xDC, 0xD0, 0x00, 0x00, - ], - [ - 0xEE, 0xDE, 0xDD, 0xDE, 0xDD, 0xDD, 0xDD, 0x87, 0x75, 0x55, 0x43, 0x22, - 0x21, 0x25, 0x65, 0x55, 0x66, 0x77, 0xD8, 0x8D, 0xDD, 0x90, 0x00, 0x00, - ], - [ - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xAA, 0x98, 0x77, 0x55, 0x43, - 0x33, 0x33, 0x21, 0x33, 0x34, 0x66, 0x89, 0xAF, 0xFF, 0xC0, 0x00, 0x00, - ], - [ - 0x57, 0x77, 0x76, 0x66, 0x65, 0x55, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, - 0x33, 0x44, 0x43, 0x44, 0x44, 0x45, 0x56, 0x66, 0x77, 0x50, 0x00, 0x00, - ], - ], - [ - [ - 0x57, 0x76, 0x66, 0x65, 0x44, 0x44, 0x43, 0x33, 0x33, 0x33, 0x33, 0x34, - 0x45, 0x56, 0x67, 0x77, 0x77, 0x89, 0x88, 0x89, 0x99, 0x60, 0x00, 0x00, - ], - [ - 0x8A, 0x99, 0x88, 0x77, 0x66, 0x44, 0x43, 0x32, 0x32, 0x22, 0x33, 0x45, - 0x67, 0x89, 0xEB, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00, - ], - [ - 0xFF, 0xFB, 0xBA, 0xA7, 0x78, 0x66, 0x65, 0x54, 0x22, 0x21, 0x23, 0x44, - 0x56, 0x8A, 0x9E, 0xAF, 0xFB, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00, - ], - [ - 0xFF, 0xAF, 0xFD, 0xDF, 0xAC, 0x98, 0x77, 0x66, 0x44, 0x31, 0x11, 0x35, - 0x67, 0x88, 0x8A, 0xAA, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00, - ], - [ - 0xFF, 0xEF, 0xEE, 0xEF, 0xA8, 0x8E, 0x97, 0x66, 0x43, 0x22, 0x21, 0x23, - 0x45, 0x67, 0x97, 0x7F, 0xFF, 0xEE, 0xE9, 0xEE, 0xEE, 0xF0, 0x00, 0x00, - ], - [ - 0xAA, 0xA9, 0x97, 0x65, 0x45, 0x45, 0x67, 0x66, 0x55, 0x54, 0x44, 0x44, - 0x33, 0x33, 0x33, 0x33, 0x44, 0x45, 0x56, 0x68, 0x8B, 0xB0, 0x00, 0x00, - ], - [ - 0xEE, 0xDE, 0xED, 0xDE, 0xED, 0xDD, 0xD8, 0x77, 0x65, 0x43, 0x11, 0x22, - 0x34, 0x66, 0x78, 0x87, 0xEE, 0xEE, 0xEE, 0x9D, 0xED, 0xE0, 0x00, 0x00, - ], - [ - 0xFF, 0xFF, 0xFF, 0xDC, 0xFF, 0xAE, 0xEA, 0x98, 0x76, 0x54, 0x31, 0x11, - 0x34, 0x56, 0x88, 0x99, 0x9B, 0xFF, 0xFF, 0xBF, 0xFF, 0xF0, 0x00, 0x00, - ], - [ - 0xFF, 0xFF, 0xFF, 0xCF, 0xDF, 0xFF, 0xFD, 0x9A, 0x76, 0x65, 0x43, 0x21, - 0x12, 0x35, 0x56, 0x67, 0x89, 0x99, 0xAF, 0xAF, 0xFF, 0xF0, 0x00, 0x00, - ], - [ - 0xFF, 0xFF, 0xFE, 0xEF, 0xDB, 0xBA, 0xAA, 0x99, 0x76, 0x55, 0x43, 0x22, - 0x22, 0x33, 0x33, 0x44, 0x55, 0x67, 0x8A, 0xFA, 0xFB, 0xA0, 0x00, 0x00, - ], - [ - 0x57, 0x77, 0x77, 0x66, 0x65, 0x55, 0x54, 0x44, 0x44, 0x44, 0x43, 0x33, - 0x33, 0x34, 0x44, 0x44, 0x55, 0x55, 0x66, 0x77, 0x88, 0x60, 0x00, 0x00, - ], - ], - [ - [ - 0x58, 0x77, 0x76, 0x66, 0x55, 0x54, 0x44, 0x33, 0x33, 0x23, 0x33, 0x33, - 0x45, 0x56, 0x66, 0x77, 0x88, 0x88, 0x88, 0x88, 0x99, 0x60, 0x00, 0x00, - ], - [ - 0x9A, 0xA9, 0xA9, 0x88, 0x76, 0x55, 0x44, 0x33, 0x22, 0x22, 0x23, 0x45, - 0x56, 0x99, 0x9D, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00, - ], - [ - 0xFD, 0xBB, 0xAA, 0xBA, 0xA9, 0x87, 0x77, 0x54, 0x33, 0x21, 0x12, 0x45, - 0x68, 0x8A, 0xAA, 0xCB, 0xFF, 0xCF, 0xFF, 0xFF, 0xFE, 0xF0, 0x00, 0x00, - ], - [ - 0xFF, 0xFF, 0xFF, 0xEF, 0xFE, 0xA9, 0x98, 0x87, 0x65, 0x41, 0x02, 0x45, - 0x77, 0x88, 0xAC, 0xAF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00, - ], - [ - 0xBF, 0xFC, 0xAB, 0xFB, 0xBA, 0xAB, 0xB8, 0x88, 0x76, 0x52, 0x01, 0x35, - 0x78, 0x99, 0xAB, 0xAA, 0xCF, 0xBB, 0xCF, 0xFC, 0xFC, 0xF0, 0x00, 0x00, - ], - [ - 0xBA, 0xCA, 0x98, 0x75, 0x21, 0x35, 0x77, 0x77, 0x76, 0x65, 0x54, 0x44, - 0x44, 0x34, 0x44, 0x44, 0x45, 0x56, 0x78, 0x88, 0x9A, 0xC0, 0x00, 0x00, - ], - [ - 0xDF, 0xCF, 0xCC, 0xFF, 0xAB, 0xC9, 0xB9, 0x98, 0x97, 0x75, 0x20, 0x13, - 0x56, 0x89, 0x89, 0xAA, 0xFC, 0xBC, 0xAF, 0xCC, 0xFF, 0xD0, 0x00, 0x00, - ], - [ - 0xFF, 0xFF, 0xBB, 0xFB, 0xFF, 0xFB, 0xBA, 0xA8, 0x77, 0x54, 0x21, 0x11, - 0x45, 0x67, 0x88, 0x8A, 0xEF, 0xBB, 0xFF, 0xBB, 0xFF, 0xF0, 0x00, 0x00, - ], - [ - 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xFB, 0xCB, 0xB9, 0x88, 0x65, 0x31, 0x12, - 0x23, 0x35, 0x67, 0x88, 0xAA, 0xAC, 0xFC, 0xFF, 0xFF, 0xF0, 0x00, 0x00, - ], - [ - 0xFF, 0xFF, 0xFC, 0xEF, 0xFF, 0xBB, 0xAA, 0xA9, 0x76, 0x55, 0x32, 0x22, - 0x22, 0x33, 0x34, 0x56, 0x67, 0x68, 0x9A, 0xAA, 0xCD, 0xE0, 0x00, 0x00, - ], - [ - 0x58, 0x77, 0x77, 0x66, 0x66, 0x55, 0x54, 0x44, 0x44, 0x43, 0x33, 0x33, - 0x33, 0x34, 0x44, 0x55, 0x55, 0x66, 0x67, 0x78, 0x88, 0x60, 0x00, 0x00, - ], - ], - [ - [ - 0x57, 0x77, 0x76, 0x66, 0x55, 0x55, 0x54, 0x43, 0x33, 0x22, 0x33, 0x34, - 0x45, 0x55, 0x66, 0x67, 0x77, 0x77, 0x78, 0x88, 0x99, 0x50, 0x00, 0x00, - ], - [ - 0xAC, 0x99, 0x98, 0x87, 0x76, 0x66, 0x54, 0x43, 0x32, 0x21, 0x23, 0x45, - 0x66, 0x89, 0x99, 0x99, 0xAA, 0xBF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00, - ], - [ - 0xFF, 0xFF, 0xFF, 0xB9, 0xAA, 0x98, 0x77, 0x65, 0x42, 0x21, 0x12, 0x45, - 0x78, 0x8A, 0xBA, 0xAA, 0xFB, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00, - ], - [ - 0xFF, 0xFF, 0xFF, 0xFD, 0xBC, 0xBB, 0xB9, 0x98, 0x76, 0x32, 0x01, 0x46, - 0x79, 0xAB, 0xBB, 0xBE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00, - ], - [ - 0xFF, 0xFF, 0xFF, 0xFF, 0xCF, 0xAA, 0xAA, 0x99, 0x76, 0x42, 0x01, 0x36, - 0x79, 0x9A, 0xAB, 0xBF, 0xFD, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00, - ], - [ - 0xCC, 0xDC, 0xB9, 0x75, 0x10, 0x47, 0x89, 0x99, 0x98, 0x87, 0x76, 0x66, - 0x55, 0x55, 0x55, 0x56, 0x66, 0x67, 0x78, 0x99, 0xBE, 0xE0, 0x00, 0x00, - ], - [ - 0xFF, 0xFF, 0xFF, 0xFC, 0xCC, 0xFF, 0xFB, 0xAB, 0x87, 0x64, 0x10, 0x23, - 0x67, 0x99, 0x9A, 0xAD, 0xCE, 0xFF, 0xFC, 0xFF, 0xFF, 0xF0, 0x00, 0x00, - ], - [ - 0xFF, 0xFF, 0xFF, 0xFB, 0xFF, 0xFD, 0xFA, 0xB9, 0x97, 0x65, 0x20, 0x13, - 0x56, 0x78, 0xAA, 0x9B, 0xFB, 0xFC, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00, - ], - [ - 0xFF, 0xFF, 0xFF, 0xCF, 0xFC, 0xC9, 0xAC, 0x98, 0x87, 0x54, 0x31, 0x12, - 0x23, 0x45, 0x67, 0x78, 0x9A, 0xAA, 0xEB, 0xFF, 0xFF, 0xE0, 0x00, 0x00, - ], - [ - 0xFF, 0xFF, 0xFE, 0xCA, 0xFA, 0x99, 0x98, 0x88, 0x65, 0x44, 0x32, 0x22, - 0x22, 0x33, 0x45, 0x56, 0x67, 0x78, 0x99, 0xBB, 0xAB, 0xA0, 0x00, 0x00, - ], - [ - 0x48, 0x77, 0x76, 0x66, 0x65, 0x55, 0x55, 0x44, 0x44, 0x43, 0x33, 0x33, - 0x33, 0x34, 0x45, 0x55, 0x55, 0x66, 0x67, 0x77, 0x78, 0x60, 0x00, 0x00, - ], - ], - [ - [ - 0x68, 0x87, 0x77, 0x77, 0x66, 0x55, 0x54, 0x43, 0x33, 0x22, 0x23, 0x34, - 0x45, 0x55, 0x66, 0x78, 0x88, 0x98, 0x88, 0x88, 0x89, 0x60, 0x00, 0x00, - ], - [ - 0xAB, 0xBA, 0xAA, 0xBA, 0x99, 0x87, 0x76, 0x54, 0x33, 0x21, 0x12, 0x46, - 0x67, 0x89, 0x9A, 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00, - ], - [ - 0xFF, 0xFF, 0xFF, 0xFD, 0xCA, 0x98, 0x87, 0x76, 0x54, 0x21, 0x11, 0x45, - 0x78, 0x8A, 0x9A, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00, - ], - [ - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xBC, 0xAA, 0x99, 0x76, 0x32, 0x01, 0x46, - 0x78, 0x9A, 0xAB, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00, - ], - [ - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xCA, 0xE9, 0x89, 0x76, 0x52, 0x01, 0x35, - 0x68, 0x98, 0x9A, 0xAF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00, - ], - [ - 0xAD, 0xCB, 0xA9, 0x74, 0x10, 0x46, 0x89, 0x9A, 0xA9, 0x98, 0x77, 0x76, - 0x66, 0x55, 0x55, 0x56, 0x66, 0x66, 0x78, 0x88, 0x8A, 0xD0, 0x00, 0x00, - ], - [ - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, 0xAA, 0xAA, 0x87, 0x63, 0x10, 0x24, - 0x67, 0x89, 0xAF, 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00, - ], - [ - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xBB, 0x9A, 0x97, 0x64, 0x20, 0x13, - 0x67, 0x89, 0x9A, 0xCF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00, - ], - [ - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x99, 0x87, 0x76, 0x43, 0x21, 0x12, - 0x34, 0x56, 0x67, 0x88, 0x89, 0xAE, 0xCF, 0xFD, 0xEF, 0xF0, 0x00, 0x00, - ], - [ - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, 0xAA, 0x87, 0x66, 0x54, 0x31, 0x12, - 0x33, 0x44, 0x55, 0x67, 0x77, 0x89, 0xAB, 0xAB, 0xCF, 0xC0, 0x00, 0x00, - ], - [ - 0x58, 0x87, 0x87, 0x77, 0x76, 0x66, 0x55, 0x55, 0x44, 0x43, 0x32, 0x22, - 0x33, 0x44, 0x55, 0x56, 0x67, 0x77, 0x78, 0x88, 0x88, 0x70, 0x00, 0x00, - ], - ], - [ - [ - 0x67, 0x76, 0x66, 0x76, 0x66, 0x55, 0x44, 0x44, 0x33, 0x22, 0x22, 0x34, - 0x56, 0x67, 0x77, 0x89, 0x88, 0x99, 0xAB, 0x9A, 0xAB, 0x70, 0x00, 0x00, - ], - [ - 0x9B, 0xA9, 0x88, 0x88, 0x87, 0x77, 0x65, 0x54, 0x43, 0x21, 0x12, 0x45, - 0x67, 0x9A, 0x9A, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0xEE, 0xF0, 0x00, 0x00, - ], - [ - 0xFF, 0xFF, 0xFC, 0xCB, 0xBA, 0xAA, 0x98, 0x87, 0x65, 0x31, 0x02, 0x56, - 0x89, 0xAB, 0xCB, 0xBC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00, - ], - [ - 0xFF, 0xFF, 0xFF, 0xFF, 0xFA, 0xAA, 0x9A, 0x98, 0x76, 0x42, 0x01, 0x36, - 0x79, 0xAF, 0xCF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00, - ], - [ - 0xFF, 0xFF, 0xFF, 0xFF, 0xFA, 0x78, 0xA9, 0x98, 0x76, 0x52, 0x01, 0x35, - 0x78, 0x8E, 0xCB, 0xBF, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00, - ], - [ - 0x8C, 0xBA, 0x99, 0x74, 0x10, 0x36, 0x89, 0x9A, 0xA9, 0x99, 0x88, 0x87, - 0x76, 0x66, 0x66, 0x66, 0x66, 0x56, 0x66, 0x78, 0x89, 0xC0, 0x00, 0x00, - ], - [ - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF9, 0x8A, 0xA9, 0x88, 0x63, 0x10, 0x24, - 0x67, 0x8B, 0xBC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00, - ], - [ - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC9, 0x99, 0x76, 0x54, 0x10, 0x24, - 0x56, 0x78, 0x9A, 0xAA, 0xFF, 0xFF, 0xFF, 0xFF, 0xEF, 0xF0, 0x00, 0x00, - ], - [ - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xD9, 0x87, 0x54, 0x20, 0x22, - 0x45, 0x67, 0x77, 0x89, 0xAC, 0xAB, 0xFB, 0xFF, 0xFF, 0xF0, 0x00, 0x00, - ], - [ - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xAD, 0xAB, 0x86, 0x54, 0x21, 0x12, - 0x34, 0x45, 0x66, 0x77, 0x67, 0x77, 0x88, 0x99, 0x9A, 0x90, 0x00, 0x00, - ], - [ - 0x57, 0x77, 0x76, 0x66, 0x65, 0x55, 0x55, 0x55, 0x54, 0x43, 0x32, 0x23, - 0x33, 0x44, 0x55, 0x55, 0x66, 0x67, 0x88, 0x77, 0x77, 0x50, 0x00, 0x00, - ], - ], - [ - [ - 0x35, 0x44, 0x45, 0x55, 0x54, 0x44, 0x44, 0x43, 0x33, 0x33, 0x23, 0x44, - 0x68, 0x99, 0xAA, 0xAA, 0xCB, 0xAB, 0xAF, 0xFE, 0xEB, 0xE0, 0x00, 0x00, - ], - [ - 0x77, 0x66, 0x67, 0x66, 0x66, 0x66, 0x54, 0x44, 0x33, 0x22, 0x12, 0x45, - 0x68, 0xAA, 0xBE, 0xAF, 0xFF, 0xFF, 0xFF, 0xFF, 0xEE, 0xF0, 0x00, 0x00, - ], - [ - 0xFF, 0xEA, 0x98, 0x88, 0x87, 0x77, 0x65, 0x55, 0x44, 0x32, 0x02, 0x46, - 0x78, 0x89, 0xAA, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00, - ], - [ - 0xFF, 0xFF, 0xFF, 0xFF, 0xAB, 0xAB, 0x99, 0x76, 0x65, 0x42, 0x01, 0x45, - 0x78, 0xAA, 0xAD, 0xAC, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00, - ], - [ - 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xEB, 0xBA, 0xA9, 0x86, 0x42, 0x01, 0x36, - 0x77, 0x8A, 0xBB, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00, - ], - [ - 0xAC, 0xBB, 0x98, 0x74, 0x10, 0x36, 0x77, 0x89, 0x99, 0x99, 0x88, 0x77, - 0x76, 0x66, 0x66, 0x55, 0x56, 0x67, 0x89, 0xAA, 0xAB, 0xC0, 0x00, 0x00, - ], - [ - 0xFF, 0xFF, 0xFF, 0xFF, 0xDF, 0xC9, 0x99, 0x99, 0x88, 0x64, 0x10, 0x24, - 0x55, 0x68, 0x89, 0xBB, 0xAD, 0xBF, 0xBF, 0xFF, 0xFF, 0xF0, 0x00, 0x00, - ], - [ - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x97, 0x65, 0x65, 0x54, 0x20, 0x23, - 0x45, 0x56, 0x77, 0x77, 0x8E, 0xCB, 0xBE, 0xDF, 0xFF, 0xF0, 0x00, 0x00, - ], - [ - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xBA, 0x76, 0x53, 0x21, 0x13, - 0x34, 0x55, 0x45, 0x55, 0x67, 0x79, 0xAB, 0xFA, 0xFB, 0xA0, 0x00, 0x00, - ], - [ - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xBF, 0xFE, 0x87, 0x54, 0x21, 0x23, - 0x33, 0x44, 0x55, 0x55, 0x44, 0x45, 0x57, 0x8A, 0xAA, 0x80, 0x00, 0x00, - ], - [ - 0x79, 0x99, 0x99, 0x97, 0x77, 0x76, 0x54, 0x44, 0x44, 0x44, 0x32, 0x33, - 0x33, 0x33, 0x44, 0x45, 0x56, 0x67, 0x88, 0x77, 0x78, 0x60, 0x00, 0x00, - ], - ], - [ - [ - 0x34, 0x54, 0x45, 0x55, 0x54, 0x44, 0x44, 0x33, 0x32, 0x43, 0x34, 0x44, - 0x56, 0x77, 0xBB, 0xB6, 0xCC, 0xCC, 0xCC, 0xC8, 0xCB, 0x70, 0x00, 0x00, - ], - [ - 0x7E, 0x67, 0x55, 0x65, 0x44, 0x55, 0x44, 0x33, 0x22, 0x23, 0x23, 0x57, - 0x98, 0xDD, 0xDD, 0xDE, 0xED, 0xDD, 0xDD, 0xDD, 0xDD, 0xE0, 0x00, 0x00, - ], - [ - 0xFF, 0xEF, 0xEE, 0x97, 0x75, 0x54, 0x43, 0x33, 0x33, 0x32, 0x12, 0x58, - 0x88, 0xEE, 0xAE, 0xEF, 0xFF, 0xFF, 0xFF, 0xFE, 0xEE, 0xF0, 0x00, 0x00, - ], - [ - 0xFF, 0xFF, 0xFF, 0xFF, 0xFA, 0x88, 0x87, 0x66, 0x53, 0x22, 0x02, 0x57, - 0x9D, 0xFF, 0xFF, 0xEF, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00, - ], - [ - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFA, 0xA9, 0x78, 0x76, 0x42, 0x01, 0x36, - 0x99, 0x9A, 0xFF, 0xDF, 0xFF, 0xFD, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00, - ], - [ - 0xAB, 0xAA, 0xA8, 0x75, 0x10, 0x26, 0x79, 0x88, 0x77, 0x77, 0x66, 0x66, - 0x57, 0x78, 0x88, 0x89, 0x98, 0x9A, 0xBB, 0xBB, 0xDD, 0xC0, 0x00, 0x00, - ], - [ - 0xFF, 0xFF, 0xFE, 0xEF, 0xFF, 0xFE, 0xA8, 0x78, 0x76, 0x54, 0x20, 0x22, - 0x45, 0x6E, 0x8E, 0xEF, 0xFF, 0xF9, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00, - ], - [ - 0xFF, 0xFF, 0xFF, 0xEF, 0xFF, 0xFF, 0xFA, 0xE7, 0x66, 0x64, 0x20, 0x23, - 0x34, 0x56, 0x78, 0x88, 0xAF, 0xFC, 0xFF, 0xFF, 0xAF, 0xF0, 0x00, 0x00, - ], - [ - 0xEE, 0xDE, 0xED, 0xDE, 0xED, 0x8D, 0xDD, 0xD9, 0xE6, 0x63, 0x21, 0x23, - 0x43, 0x34, 0x35, 0x55, 0x65, 0x47, 0xEE, 0xED, 0xED, 0xE0, 0x00, 0x00, - ], - [ - 0xDD, 0xCD, 0xDC, 0xCD, 0xDD, 0xCC, 0xCC, 0xCD, 0xDD, 0x76, 0x43, 0x44, - 0x44, 0x43, 0x34, 0x33, 0x22, 0x33, 0x35, 0xD8, 0xCC, 0xD0, 0x00, 0x00, - ], - [ - 0x6B, 0x77, 0xBB, 0xB6, 0x96, 0x55, 0x55, 0x54, 0x44, 0x44, 0x33, 0x43, - 0x33, 0x33, 0x45, 0x34, 0x44, 0x68, 0x57, 0x78, 0x86, 0x50, 0x00, 0x00, - ], - ], - [ - [ - 0x4A, 0xAA, 0xAA, 0x9A, 0x44, 0x44, 0x45, 0x23, 0x24, 0x22, 0xA3, 0x3A, - 0x44, 0x99, 0x99, 0x9A, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xA0, 0x00, 0x00, - ], - [ - 0xAA, 0x45, 0x34, 0x94, 0x4A, 0x4A, 0x32, 0x23, 0x32, 0x24, 0x4A, 0xAA, - 0xAA, 0xA9, 0x99, 0x9A, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xA0, 0x00, 0x00, - ], - [ - 0xAA, 0xAA, 0xAA, 0xAA, 0x4A, 0xA4, 0x44, 0x21, 0x43, 0x32, 0x23, 0x5A, - 0xAA, 0xAA, 0x99, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xA0, 0x00, 0x00, - ], - [ - 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0x7D, 0x8D, 0x74, 0x21, 0x11, 0x35, 0x7D, - 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xD0, 0x00, 0x00, - ], - [ - 0xFE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xE9, 0x64, 0x32, 0x01, 0x57, - 0xE8, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xF0, 0x00, 0x00, - ], - [ - 0xEE, 0xDE, 0xE9, 0x55, 0x10, 0x27, 0x98, 0x65, 0x48, 0xAE, 0x99, 0x88, - 0x77, 0x87, 0x79, 0x89, 0xEA, 0xEE, 0xAE, 0xEE, 0xEE, 0xE0, 0x00, 0x00, - ], - [ - 0xCB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xB6, 0x45, 0x11, 0x13, - 0x44, 0x3B, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xC0, 0x00, 0x00, - ], - [ - 0xBB, 0xAB, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0x5A, 0x31, 0x12, - 0x23, 0x34, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xB0, 0x00, 0x00, - ], - [ - 0xBB, 0xBB, 0xBB, 0xAB, 0xBB, 0xBB, 0xAA, 0xAB, 0xBB, 0xBB, 0xB5, 0x55, - 0x64, 0x22, 0x24, 0x55, 0x32, 0x14, 0xBB, 0xBB, 0xBB, 0xB0, 0x00, 0x00, - ], - [ - 0xAA, 0xAA, 0xA9, 0x9A, 0xAA, 0xA9, 0x99, 0x9A, 0x4A, 0xAA, 0xA3, 0x33, - 0x32, 0x34, 0x35, 0x44, 0x42, 0x24, 0xA4, 0xAA, 0xAA, 0xA0, 0x00, 0x00, - ], - [ - 0xAA, 0x9A, 0x99, 0x9A, 0xA9, 0x54, 0x94, 0x95, 0x44, 0x53, 0x34, 0x53, - 0x23, 0x34, 0x34, 0x45, 0x33, 0x4A, 0x99, 0x99, 0xA9, 0xA0, 0x00, 0x00, - ], - ], - ], - [ - [ - [ - 0x57, 0xAB, 0x66, 0x52, 0x12, 0x44, 0x45, 0x43, 0x33, 0x45, 0x77, 0xA6, - 0x77, 0xA7, 0xA7, 0x65, 0x77, 0xBB, 0xB7, 0xBB, 0x7B, 0xB0, 0x00, 0x00, - ], - [ - 0xBB, 0x5B, 0xBB, 0x5B, 0xBB, 0x21, 0x22, 0x45, 0x62, 0x26, 0x56, 0xBB, - 0xBB, 0xBA, 0xAA, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xB0, 0x00, 0x00, - ], - [ - 0xAA, 0x3A, 0x99, 0x93, 0x19, 0x99, 0x99, 0x99, 0x99, 0x24, 0x19, 0x33, - 0x99, 0x93, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0xA0, 0x00, 0x00, - ], - [ - 0x77, 0x67, 0x66, 0x67, 0x76, 0x66, 0x66, 0x67, 0x77, 0x66, 0x66, 0x66, - 0x66, 0x66, 0x66, 0x10, 0x77, 0x76, 0x77, 0x77, 0x77, 0x70, 0x00, 0x00, - ], - [ - 0x77, 0x67, 0x66, 0x67, 0x76, 0x66, 0x66, 0x67, 0x77, 0x66, 0x66, 0x66, - 0x61, 0x66, 0x66, 0x67, 0x07, 0x76, 0x77, 0x77, 0x77, 0x70, 0x00, 0x00, - ], - [ - 0xDD, 0xDD, 0xD6, 0xCD, 0xDD, 0xD9, 0x88, 0xC9, 0x64, 0x76, 0x34, 0x42, - 0x12, 0x54, 0x53, 0x34, 0x54, 0x56, 0x66, 0x79, 0xDD, 0xD0, 0x00, 0x00, - ], - [ - 0x88, 0x78, 0x77, 0x78, 0x77, 0x77, 0x77, 0x78, 0x87, 0x07, 0x77, 0x77, - 0x21, 0x77, 0x77, 0x78, 0x88, 0x87, 0x87, 0x88, 0x88, 0x80, 0x00, 0x00, - ], - [ - 0xAA, 0x9A, 0x99, 0x9A, 0x99, 0x99, 0x99, 0x9A, 0x99, 0x01, 0x99, 0x99, - 0x43, 0x99, 0x34, 0x99, 0x94, 0x99, 0x99, 0x99, 0xAA, 0xA0, 0x00, 0x00, - ], - [ - 0x99, 0x89, 0x88, 0x89, 0x88, 0x88, 0x88, 0x89, 0x88, 0x82, 0x88, 0x21, - 0x82, 0x82, 0x83, 0x88, 0x82, 0x88, 0x88, 0x88, 0x99, 0x90, 0x00, 0x00, - ], - [ - 0xDD, 0xDD, 0xDD, 0xCD, 0xDD, 0xDD, 0xCC, 0xCD, 0xDD, 0xDD, 0xD6, 0x74, - 0x56, 0x64, 0x20, 0x54, 0x42, 0x38, 0xDD, 0xDD, 0xDD, 0xD0, 0x00, 0x00, - ], - [ - 0x79, 0x87, 0x96, 0x76, 0x76, 0x55, 0x66, 0x44, 0x55, 0x44, 0x55, 0x32, - 0x24, 0x88, 0x62, 0x55, 0x45, 0x43, 0x47, 0x66, 0x76, 0x60, 0x00, 0x00, - ], - ], - [ - [ - 0x57, 0x66, 0x65, 0x54, 0x43, 0x34, 0x33, 0x33, 0x33, 0x33, 0x44, 0x45, - 0x55, 0x66, 0x77, 0x77, 0x77, 0x77, 0x98, 0x88, 0x79, 0x60, 0x00, 0x00, - ], - [ - 0x88, 0x98, 0x8D, 0x65, 0x66, 0x32, 0x33, 0x22, 0x23, 0x33, 0x45, 0x67, - 0x78, 0x68, 0x8D, 0xCD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xD0, 0x00, 0x00, - ], - [ - 0x8D, 0xCD, 0xDC, 0xC5, 0x56, 0x46, 0x45, 0x54, 0x22, 0x22, 0x22, 0x45, - 0x57, 0x6C, 0xCC, 0xCD, 0xDD, 0xDD, 0xDD, 0xDC, 0xCC, 0xD0, 0x00, 0x00, - ], - [ - 0xCC, 0xCC, 0xCB, 0xBC, 0xCC, 0xC7, 0xB5, 0x54, 0x12, 0x33, 0x22, 0x25, - 0x56, 0xB6, 0x7B, 0xB7, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xC0, 0x00, 0x00, - ], - [ - 0xBB, 0xAB, 0xBA, 0xAB, 0xBB, 0xA5, 0xA5, 0x55, 0x21, 0x2B, 0x33, 0x23, - 0x44, 0x55, 0xA6, 0x5B, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xB0, 0x00, 0x00, - ], - [ - 0xAC, 0xAB, 0xC6, 0x66, 0x87, 0x87, 0x77, 0x98, 0x66, 0x54, 0x43, 0x43, - 0x33, 0x32, 0x33, 0x33, 0x44, 0x45, 0x66, 0x68, 0x79, 0xA0, 0x00, 0x00, - ], - [ - 0xBB, 0xBB, 0xBB, 0xAB, 0xBB, 0xBB, 0xBA, 0x4B, 0x43, 0x22, 0x22, 0x32, - 0x44, 0x34, 0xA5, 0xA6, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xB0, 0x00, 0x00, - ], - [ - 0xBB, 0xAB, 0xAA, 0xAB, 0xBA, 0xAA, 0xA6, 0x65, 0x54, 0x43, 0x21, 0x23, - 0x34, 0x34, 0x55, 0x56, 0x6B, 0xBB, 0xB6, 0xBA, 0xBA, 0xB0, 0x00, 0x00, - ], - [ - 0xDD, 0xCD, 0xDC, 0xCD, 0xDD, 0xCC, 0xCC, 0xC6, 0x66, 0x44, 0x43, 0x32, - 0x21, 0x25, 0x65, 0x46, 0x54, 0x8D, 0xDD, 0xDC, 0xD7, 0xC0, 0x00, 0x00, - ], - [ - 0xFF, 0xEF, 0xEE, 0xEF, 0xEE, 0xEE, 0xEE, 0x9A, 0xF7, 0x66, 0x55, 0x43, - 0x33, 0x22, 0x22, 0x33, 0x34, 0x78, 0x98, 0xEE, 0xFE, 0x90, 0x00, 0x00, - ], - [ - 0x57, 0x67, 0x66, 0x76, 0x65, 0x55, 0x44, 0x54, 0x44, 0x43, 0x43, 0x34, - 0x43, 0x44, 0x44, 0x44, 0x45, 0x45, 0x55, 0x67, 0x77, 0x60, 0x00, 0x00, - ], - ], - [ - [ - 0x78, 0x88, 0x76, 0x66, 0x55, 0x54, 0x44, 0x33, 0x22, 0x23, 0x33, 0x44, - 0x55, 0x67, 0x67, 0x78, 0x98, 0x98, 0x99, 0x9A, 0xA9, 0x90, 0x00, 0x00, - ], - [ - 0x99, 0xAA, 0xAB, 0x97, 0x65, 0x55, 0x44, 0x32, 0x22, 0x22, 0x33, 0x45, - 0x67, 0x89, 0xFF, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00, - ], - [ - 0xFF, 0xFC, 0xBB, 0xA8, 0x88, 0x77, 0x76, 0x54, 0x32, 0x11, 0x23, 0x46, - 0x77, 0x8A, 0xF8, 0xCF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00, - ], - [ - 0xEE, 0xDE, 0xED, 0xDE, 0xE9, 0xDD, 0x77, 0x65, 0x43, 0x21, 0x12, 0x34, - 0x57, 0x7D, 0x78, 0xDE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xE0, 0x00, 0x00, - ], - [ - 0xEE, 0xEE, 0xEE, 0xDE, 0xEE, 0xE7, 0x7D, 0x96, 0x54, 0x22, 0x11, 0x24, - 0x56, 0x87, 0xDD, 0xDE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xE0, 0x00, 0x00, - ], - [ - 0xCB, 0xAA, 0x97, 0x65, 0x44, 0x45, 0x77, 0x76, 0x66, 0x55, 0x44, 0x33, - 0x33, 0x33, 0x33, 0x33, 0x44, 0x55, 0x68, 0x99, 0x9A, 0xC0, 0x00, 0x00, - ], - [ - 0xDD, 0xDD, 0xDD, 0x7D, 0xDD, 0xDC, 0xCC, 0x66, 0x66, 0x43, 0x11, 0x22, - 0x34, 0x56, 0x8C, 0xCD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xD0, 0x00, 0x00, - ], - [ - 0xFF, 0xEF, 0xFE, 0xEF, 0xFF, 0xEE, 0xE9, 0x88, 0x76, 0x54, 0x31, 0x11, - 0x34, 0x57, 0x77, 0x8F, 0xAF, 0xFF, 0xFF, 0xFE, 0xFE, 0xF0, 0x00, 0x00, - ], - [ - 0xFE, 0xEE, 0xEE, 0xEA, 0xAE, 0xEE, 0xA9, 0xE9, 0x87, 0x65, 0x43, 0x11, - 0x22, 0x35, 0x56, 0x66, 0x88, 0x9A, 0xEE, 0xEA, 0xEE, 0xF0, 0x00, 0x00, - ], - [ - 0xFF, 0xFF, 0xFF, 0xEA, 0xFF, 0xFB, 0xEA, 0x98, 0x76, 0x55, 0x43, 0x22, - 0x22, 0x33, 0x33, 0x44, 0x46, 0x78, 0xAA, 0xFF, 0xFB, 0xB0, 0x00, 0x00, - ], - [ - 0x79, 0x99, 0x77, 0x77, 0x66, 0x55, 0x54, 0x44, 0x43, 0x43, 0x33, 0x33, - 0x33, 0x34, 0x44, 0x55, 0x55, 0x66, 0x66, 0x79, 0x99, 0x80, 0x00, 0x00, - ], - ], - [ - [ - 0x68, 0x87, 0x77, 0x66, 0x55, 0x55, 0x54, 0x43, 0x32, 0x22, 0x33, 0x34, - 0x45, 0x66, 0x77, 0x78, 0x88, 0x89, 0x98, 0x88, 0x88, 0x60, 0x00, 0x00, - ], - [ - 0xAA, 0xAB, 0xAB, 0xA9, 0x88, 0x66, 0x65, 0x43, 0x22, 0x21, 0x23, 0x46, - 0x78, 0xA9, 0xBF, 0xEF, 0xFF, 0xFF, 0xFF, 0xEF, 0xFF, 0xF0, 0x00, 0x00, - ], - [ - 0xFD, 0xFF, 0xFF, 0xBC, 0x99, 0x98, 0x76, 0x65, 0x42, 0x21, 0x12, 0x46, - 0x67, 0x99, 0xFF, 0xEF, 0xFF, 0xFF, 0xBF, 0xFF, 0xFF, 0xF0, 0x00, 0x00, - ], - [ - 0xFF, 0xFF, 0xFF, 0xFF, 0xBE, 0xFA, 0xB9, 0x87, 0x65, 0x31, 0x02, 0x56, - 0x79, 0x9A, 0xAF, 0xEA, 0xFF, 0xFF, 0xFF, 0xCF, 0xFF, 0xF0, 0x00, 0x00, - ], - [ - 0x9B, 0xAE, 0xBE, 0x9B, 0xBB, 0xAB, 0xAA, 0x98, 0x76, 0x52, 0x01, 0x35, - 0x88, 0x99, 0x9A, 0xAC, 0xBA, 0xBB, 0xEA, 0xBA, 0xEA, 0xB0, 0x00, 0x00, - ], - [ - 0xCC, 0xBC, 0xA7, 0x65, 0x21, 0x46, 0x88, 0x87, 0x77, 0x65, 0x44, 0x44, - 0x43, 0x33, 0x44, 0x45, 0x55, 0x56, 0x78, 0x9A, 0x9B, 0xC0, 0x00, 0x00, - ], - [ - 0x9E, 0x9E, 0xA9, 0xAB, 0xAA, 0xA9, 0x9D, 0x99, 0x87, 0x65, 0x10, 0x23, - 0x68, 0x88, 0x98, 0x9A, 0xA9, 0xAA, 0xDA, 0xAD, 0xAA, 0x90, 0x00, 0x00, - ], - [ - 0xFF, 0xFF, 0xFE, 0xEF, 0xFF, 0xFC, 0xBB, 0xA9, 0xA7, 0x65, 0x30, 0x12, - 0x56, 0x78, 0x9A, 0x9A, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00, - ], - [ - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xCC, 0xBA, 0x98, 0x76, 0x41, 0x11, - 0x24, 0x47, 0x77, 0x89, 0xBB, 0xED, 0xCF, 0xFF, 0xFF, 0xF0, 0x00, 0x00, - ], - [ - 0xFF, 0xCF, 0xFF, 0xEF, 0xCF, 0xCE, 0x9B, 0xA9, 0x87, 0x65, 0x42, 0x11, - 0x23, 0x44, 0x55, 0x66, 0x67, 0x9A, 0xAB, 0xCF, 0xCC, 0xD0, 0x00, 0x00, - ], - [ - 0x68, 0x78, 0x77, 0x76, 0x66, 0x55, 0x55, 0x54, 0x44, 0x33, 0x33, 0x32, - 0x33, 0x34, 0x55, 0x55, 0x66, 0x66, 0x77, 0x77, 0x88, 0x60, 0x00, 0x00, - ], - ], - [ - [ - 0x68, 0x77, 0x76, 0x66, 0x55, 0x55, 0x54, 0x44, 0x32, 0x22, 0x33, 0x34, - 0x55, 0x56, 0x66, 0x66, 0x67, 0x78, 0x88, 0x99, 0x99, 0x50, 0x00, 0x00, - ], - [ - 0xCB, 0xCA, 0xAA, 0xA9, 0x97, 0x77, 0x66, 0x54, 0x32, 0x21, 0x13, 0x46, - 0x79, 0xAA, 0xAB, 0xBF, 0xCD, 0xFD, 0xCF, 0xFF, 0xFF, 0xF0, 0x00, 0x00, - ], - [ - 0xFF, 0xFF, 0xFC, 0xFF, 0xBB, 0xA9, 0xA8, 0x87, 0x65, 0x31, 0x02, 0x56, - 0x89, 0xAB, 0xBB, 0xBB, 0xBC, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00, - ], - [ - 0xFF, 0xFF, 0xFB, 0xFF, 0xCD, 0xCF, 0x99, 0x87, 0x65, 0x42, 0x01, 0x45, - 0x67, 0x9A, 0xBB, 0xAF, 0xBD, 0xBF, 0xFC, 0xFF, 0xFF, 0xF0, 0x00, 0x00, - ], - [ - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xCF, 0xF9, 0xA8, 0x86, 0x42, 0x01, 0x36, - 0x78, 0x8A, 0xBF, 0x9F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xB0, 0x00, 0x00, - ], - [ - 0xCF, 0xDB, 0xBA, 0x85, 0x10, 0x47, 0x89, 0x99, 0x99, 0x87, 0x66, 0x65, - 0x55, 0x55, 0x55, 0x56, 0x66, 0x77, 0x89, 0xAC, 0xCE, 0xF0, 0x00, 0x00, - ], - [ - 0xFF, 0xFF, 0xFF, 0xCF, 0xFF, 0xBF, 0xBB, 0xFF, 0x98, 0x63, 0x10, 0x24, - 0x59, 0x99, 0xBF, 0xFB, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00, - ], - [ - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xCB, 0xBB, 0xAF, 0x97, 0x65, 0x20, 0x13, - 0x56, 0x78, 0x99, 0xAB, 0xFD, 0xAF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00, - ], - [ - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xCC, 0xBB, 0xAA, 0x97, 0x65, 0x30, 0x13, - 0x44, 0x56, 0x88, 0x89, 0xA9, 0xBF, 0xFF, 0xCF, 0xFC, 0xF0, 0x00, 0x00, - ], - [ - 0xFF, 0xFF, 0xFD, 0xFF, 0xFA, 0xBA, 0xBA, 0xB9, 0x87, 0x65, 0x32, 0x11, - 0x23, 0x45, 0x56, 0x67, 0x77, 0x9A, 0xBA, 0xBF, 0xFF, 0xF0, 0x00, 0x00, - ], - [ - 0x57, 0x78, 0x77, 0x66, 0x66, 0x55, 0x55, 0x44, 0x44, 0x43, 0x33, 0x23, - 0x33, 0x44, 0x45, 0x55, 0x56, 0x66, 0x66, 0x77, 0x78, 0x60, 0x00, 0x00, - ], - ], - [ - [ - 0x68, 0x87, 0x87, 0x77, 0x66, 0x55, 0x54, 0x44, 0x32, 0x22, 0x23, 0x44, - 0x45, 0x56, 0x66, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x50, 0x00, 0x00, - ], - [ - 0x9A, 0xB9, 0xA9, 0xA8, 0x87, 0x76, 0x65, 0x54, 0x43, 0x21, 0x12, 0x45, - 0x68, 0x88, 0xAA, 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00, - ], - [ - 0xFF, 0xFF, 0xFF, 0xFC, 0xCF, 0xBA, 0x98, 0x77, 0x65, 0x31, 0x02, 0x56, - 0x89, 0xAC, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00, - ], - [ - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xB9, 0x87, 0x76, 0x42, 0x01, 0x36, - 0x89, 0xAA, 0xBD, 0xFF, 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00, - ], - [ - 0xFF, 0xFF, 0xBF, 0xFF, 0xEF, 0xBF, 0xAC, 0x99, 0x87, 0x42, 0x01, 0x35, - 0x79, 0xAA, 0xBB, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00, - ], - [ - 0xCD, 0xCC, 0xB9, 0x74, 0x10, 0x46, 0x8A, 0xA9, 0x99, 0x98, 0x77, 0x66, - 0x66, 0x55, 0x55, 0x55, 0x66, 0x67, 0x89, 0x9A, 0xAB, 0xD0, 0x00, 0x00, - ], - [ - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xBB, 0xDA, 0xA8, 0x53, 0x10, 0x24, - 0x68, 0x9A, 0xAE, 0xFF, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00, - ], - [ - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xFB, 0x98, 0x74, 0x10, 0x23, - 0x57, 0x89, 0xAB, 0xBC, 0xFF, 0xFF, 0xCF, 0xFF, 0xFF, 0xF0, 0x00, 0x00, - ], - [ - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xBB, 0xBA, 0x98, 0x65, 0x20, 0x13, - 0x56, 0x78, 0x89, 0x9A, 0xAC, 0xEF, 0xFB, 0xFF, 0xDF, 0xF0, 0x00, 0x00, - ], - [ - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xBB, 0x99, 0x86, 0x54, 0x21, 0x12, - 0x34, 0x45, 0x56, 0x67, 0x67, 0x99, 0xAB, 0xEB, 0xFF, 0xB0, 0x00, 0x00, - ], - [ - 0x57, 0x87, 0x77, 0x77, 0x66, 0x66, 0x65, 0x55, 0x44, 0x43, 0x32, 0x22, - 0x33, 0x44, 0x55, 0x56, 0x67, 0x77, 0x77, 0x88, 0x99, 0x70, 0x00, 0x00, - ], - ], - [ - [ - 0x78, 0x88, 0x88, 0x77, 0x76, 0x65, 0x54, 0x44, 0x33, 0x32, 0x12, 0x34, - 0x46, 0x78, 0x99, 0x9A, 0xBA, 0xAC, 0xAB, 0xCB, 0xAA, 0x90, 0x00, 0x00, - ], - [ - 0x9A, 0x98, 0x88, 0x98, 0x87, 0x77, 0x65, 0x54, 0x43, 0x21, 0x12, 0x45, - 0x67, 0x8B, 0xFF, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00, - ], - [ - 0xFF, 0xFF, 0xFF, 0xBD, 0xA9, 0x99, 0x87, 0x77, 0x55, 0x41, 0x02, 0x46, - 0x79, 0xAB, 0xFC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00, - ], - [ - 0xFF, 0xFE, 0xFF, 0xFF, 0xDB, 0x9A, 0xBA, 0x98, 0x76, 0x42, 0x01, 0x36, - 0x79, 0xBB, 0xCB, 0xFC, 0xFF, 0xFC, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00, - ], - [ - 0xFF, 0xFF, 0xFF, 0xFE, 0xFF, 0xFA, 0x9A, 0xAA, 0x87, 0x42, 0x01, 0x35, - 0x78, 0xDA, 0xFF, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00, - ], - [ - 0xBC, 0xCC, 0xA9, 0x74, 0x10, 0x36, 0x8A, 0xAA, 0xA9, 0x99, 0x88, 0x77, - 0x76, 0x66, 0x65, 0x66, 0x55, 0x66, 0x78, 0x88, 0xAB, 0xC0, 0x00, 0x00, - ], - [ - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xBF, 0xAA, 0x97, 0x63, 0x10, 0x24, - 0x67, 0x88, 0x9B, 0xFD, 0xFD, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00, - ], - [ - 0xFF, 0xFF, 0xFF, 0xFF, 0xFB, 0xFF, 0xFC, 0xBB, 0x97, 0x64, 0x10, 0x23, - 0x67, 0x88, 0xAA, 0xAB, 0xFF, 0xFF, 0xEF, 0xFF, 0xFF, 0xF0, 0x00, 0x00, - ], - [ - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xCF, 0xFF, 0xBD, 0xA7, 0x64, 0x20, 0x14, - 0x55, 0x77, 0x78, 0x8A, 0xAA, 0xAB, 0xFD, 0xCC, 0xBF, 0xF0, 0x00, 0x00, - ], - [ - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xEA, 0x76, 0x54, 0x21, 0x12, - 0x34, 0x45, 0x56, 0x67, 0x77, 0x8A, 0xAA, 0x99, 0xBA, 0x90, 0x00, 0x00, - ], - [ - 0x68, 0x88, 0x77, 0x66, 0x66, 0x55, 0x55, 0x55, 0x54, 0x43, 0x22, 0x23, - 0x34, 0x44, 0x44, 0x56, 0x77, 0x77, 0x78, 0x99, 0x99, 0x60, 0x00, 0x00, - ], - ], - [ - [ - 0x45, 0x56, 0x66, 0x65, 0x55, 0x54, 0x44, 0x44, 0x44, 0x42, 0x12, 0x35, - 0x68, 0x8E, 0x9A, 0xBC, 0xEB, 0xBB, 0xEB, 0xBB, 0xBE, 0xB0, 0x00, 0x00, - ], - [ - 0x87, 0x77, 0x76, 0x76, 0x66, 0x66, 0x55, 0x54, 0x43, 0x31, 0x12, 0x45, - 0x56, 0xA9, 0xEE, 0xDE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xE0, 0x00, 0x00, - ], - [ - 0xFF, 0xFF, 0xAF, 0x98, 0x97, 0x78, 0x75, 0x55, 0x44, 0x32, 0x02, 0x45, - 0x68, 0x8E, 0x9C, 0xEF, 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00, - ], - [ - 0xFF, 0xFF, 0xFF, 0xFF, 0xFB, 0xBA, 0x98, 0x77, 0x65, 0x42, 0x01, 0x45, - 0x69, 0x9C, 0x9B, 0xDF, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00, - ], - [ - 0xFF, 0xFF, 0xFB, 0xFF, 0xFF, 0xCA, 0xAA, 0xA8, 0x76, 0x52, 0x01, 0x35, - 0x67, 0x8A, 0xEA, 0xBF, 0xFF, 0xFF, 0xFE, 0xFF, 0xFF, 0xF0, 0x00, 0x00, - ], - [ - 0xA9, 0xAB, 0x98, 0x74, 0x10, 0x36, 0x89, 0x99, 0x99, 0x88, 0x87, 0x87, - 0x76, 0x66, 0x66, 0x55, 0x56, 0x67, 0x79, 0x9B, 0x9B, 0xB0, 0x00, 0x00, - ], - [ - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xB8, 0x88, 0x87, 0x54, 0x10, 0x24, - 0x56, 0x77, 0x89, 0xBF, 0xFF, 0xEC, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00, - ], - [ - 0xFF, 0xFF, 0xFF, 0xDC, 0xFF, 0xFB, 0xDB, 0xB9, 0x86, 0x53, 0x20, 0x23, - 0x44, 0x56, 0x88, 0x78, 0xAA, 0xFF, 0xAB, 0xFF, 0xFF, 0xF0, 0x00, 0x00, - ], - [ - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xAF, 0xBF, 0xFA, 0x97, 0x64, 0x20, 0x23, - 0x44, 0x55, 0x56, 0x67, 0x77, 0x89, 0x9B, 0xB9, 0xFF, 0xF0, 0x00, 0x00, - ], - [ - 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xD9, 0x75, 0x43, 0x21, 0x23, - 0x34, 0x44, 0x44, 0x55, 0x55, 0x66, 0x66, 0x78, 0x8A, 0x80, 0x00, 0x00, - ], - [ - 0x79, 0x89, 0x98, 0x88, 0x77, 0x77, 0x54, 0x44, 0x44, 0x43, 0x22, 0x33, - 0x33, 0x44, 0x45, 0x45, 0x66, 0x68, 0x77, 0x98, 0x88, 0x60, 0x00, 0x00, - ], - ], - [ - [ - 0x25, 0x45, 0x57, 0x45, 0x45, 0x55, 0x43, 0x33, 0x33, 0x33, 0x34, 0x44, - 0x55, 0xBB, 0xBB, 0x6B, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xB0, 0x00, 0x00, - ], - [ - 0x86, 0x76, 0x75, 0x55, 0x55, 0x65, 0x74, 0x44, 0x33, 0x32, 0x12, 0x35, - 0x6C, 0xCC, 0xCC, 0xCD, 0xDD, 0xCC, 0xCC, 0xCC, 0xCC, 0xD0, 0x00, 0x00, - ], - [ - 0xEE, 0xDE, 0xDD, 0x8E, 0x76, 0x55, 0x43, 0x44, 0x32, 0x32, 0x12, 0x46, - 0x87, 0x99, 0x9D, 0xDE, 0xEE, 0xEE, 0xDD, 0xDD, 0xDD, 0xE0, 0x00, 0x00, - ], - [ - 0xFF, 0xFF, 0xFE, 0xEF, 0xFF, 0xA9, 0x96, 0x55, 0x43, 0x32, 0x02, 0x45, - 0x88, 0xEE, 0xE9, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00, - ], - [ - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFA, 0xAF, 0x89, 0x66, 0x42, 0x01, 0x36, - 0xD9, 0x8A, 0xFF, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00, - ], - [ - 0xAA, 0xEA, 0xF9, 0x74, 0x10, 0x35, 0x79, 0x98, 0x87, 0x66, 0x66, 0x55, - 0x56, 0x67, 0x77, 0x77, 0x88, 0x99, 0xAA, 0xFC, 0xEE, 0xB0, 0x00, 0x00, - ], - [ - 0xFF, 0xFF, 0xFF, 0xEF, 0xFF, 0xFF, 0xE9, 0x97, 0xF7, 0x65, 0x20, 0x13, - 0x56, 0x79, 0xEA, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00, - ], - [ - 0xEE, 0xEE, 0xED, 0xDE, 0xEE, 0xED, 0xDD, 0xDE, 0x75, 0x63, 0x11, 0x22, - 0x34, 0x45, 0x67, 0x78, 0x9E, 0xEE, 0xEE, 0xEE, 0xEE, 0xE0, 0x00, 0x00, - ], - [ - 0xEE, 0xDE, 0xDD, 0xDE, 0xED, 0xD8, 0xDD, 0xDE, 0x87, 0x54, 0x20, 0x23, - 0x46, 0x46, 0x56, 0x67, 0x76, 0x79, 0x8E, 0xED, 0xED, 0xE0, 0x00, 0x00, - ], - [ - 0xEE, 0xDE, 0xDD, 0xDE, 0xDD, 0xDD, 0xDD, 0xD9, 0x98, 0x54, 0x32, 0x23, - 0x45, 0x44, 0x34, 0x43, 0x23, 0x66, 0x36, 0xD8, 0xDD, 0x90, 0x00, 0x00, - ], - [ - 0x7B, 0x7B, 0xA7, 0x77, 0x6A, 0x57, 0x56, 0x55, 0x45, 0x43, 0x33, 0x33, - 0x33, 0x33, 0x44, 0x43, 0x35, 0xBB, 0xBA, 0xAA, 0xB7, 0x50, 0x00, 0x00, - ], - ], - [ - [ - 0x24, 0xA3, 0x44, 0x44, 0xAA, 0x49, 0x34, 0x43, 0x24, 0x42, 0x35, 0xA9, - 0x99, 0x49, 0x99, 0x9A, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xA0, 0x00, 0x00, - ], - [ - 0x99, 0x39, 0x94, 0x94, 0x39, 0x43, 0x92, 0x33, 0x29, 0x22, 0x39, 0x99, - 0x99, 0x99, 0x88, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x90, 0x00, 0x00, - ], - [ - 0x99, 0x99, 0x99, 0x99, 0x49, 0x49, 0x33, 0x34, 0x33, 0x21, 0x23, 0x99, - 0x99, 0x99, 0x98, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x90, 0x00, 0x00, - ], - [ - 0xDC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xC6, 0x32, 0x21, 0x12, 0x45, - 0xC7, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xD0, 0x00, 0x00, - ], - [ - 0xED, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xD7, 0xDD, 0x75, 0x42, 0x01, 0x38, - 0xDD, 0x7D, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xE0, 0x00, 0x00, - ], - [ - 0xCC, 0x8C, 0x87, 0x64, 0x10, 0x37, 0x86, 0x66, 0x67, 0x69, 0x78, 0x77, - 0x76, 0x66, 0x66, 0x67, 0x68, 0x77, 0x88, 0xCC, 0xCC, 0xC0, 0x00, 0x00, - ], - [ - 0xBB, 0xAB, 0xAA, 0xAB, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xA4, 0x20, 0x22, - 0x44, 0xA5, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xBA, 0xB0, 0x00, 0x00, - ], - [ - 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0x4B, 0x33, 0x03, - 0x23, 0x46, 0x4B, 0x5B, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xB0, 0x00, 0x00, - ], - [ - 0xBB, 0xBB, 0xBB, 0xAB, 0xBB, 0xBB, 0xAA, 0xAB, 0xBB, 0xBB, 0xB2, 0x43, - 0x44, 0x32, 0x13, 0x46, 0x34, 0x35, 0xBB, 0xBB, 0xBB, 0xB0, 0x00, 0x00, - ], - [ - 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xA9, 0x9A, 0xAA, 0xAA, 0xA4, 0x23, - 0x32, 0xA5, 0x32, 0xA2, 0x24, 0xA3, 0xAA, 0x4A, 0xAA, 0xA0, 0x00, 0x00, - ], - [ - 0xA9, 0x59, 0x99, 0x99, 0x99, 0x54, 0x49, 0x45, 0x55, 0x45, 0x43, 0x39, - 0x52, 0x33, 0x43, 0x44, 0x25, 0x59, 0x59, 0x99, 0x59, 0xA0, 0x00, 0x00, - ], - ], - ], - [ - [ - [ - 0x58, 0x76, 0x5B, 0x53, 0x21, 0x25, 0x54, 0x43, 0x33, 0x48, 0x88, 0x56, - 0x67, 0x6B, 0x87, 0xBC, 0x7C, 0x8C, 0xCC, 0xCC, 0x8C, 0xB0, 0x00, 0x00, - ], - [ - 0xCC, 0xCC, 0x6C, 0x4C, 0xCC, 0x12, 0x12, 0x45, 0x53, 0x35, 0x7C, 0xCC, - 0xCC, 0xCC, 0xBB, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xC0, 0x00, 0x00, - ], - [ - 0xAA, 0xAA, 0xA4, 0xA1, 0x44, 0x55, 0xA9, 0x9A, 0xAA, 0xA2, 0x22, 0x24, - 0xA5, 0xA4, 0x49, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xA0, 0x00, 0x00, - ], - [ - 0x99, 0x88, 0x33, 0x88, 0x88, 0x88, 0x88, 0x28, 0x88, 0x88, 0x88, 0x21, - 0x33, 0x88, 0x83, 0x82, 0x88, 0x88, 0x88, 0x88, 0x89, 0x90, 0x00, 0x00, - ], - [ - 0x66, 0x56, 0x55, 0x56, 0x65, 0x55, 0x55, 0x56, 0x06, 0x65, 0x55, 0x55, - 0x55, 0x55, 0x55, 0x56, 0x66, 0x66, 0x66, 0x66, 0x66, 0x60, 0x00, 0x00, - ], - [ - 0xEE, 0x9D, 0xA6, 0x9D, 0xDA, 0xD9, 0x97, 0x55, 0x42, 0x64, 0x43, 0x32, - 0x24, 0x44, 0x33, 0x44, 0x66, 0x55, 0x58, 0x7D, 0xDD, 0xA0, 0x00, 0x00, - ], - [ - 0x88, 0x78, 0x77, 0x78, 0x77, 0x77, 0x77, 0x78, 0x82, 0x07, 0x77, 0x77, - 0x72, 0x27, 0x77, 0x78, 0x87, 0x77, 0x87, 0x88, 0x88, 0x80, 0x00, 0x00, - ], - [ - 0xBB, 0xAB, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0x44, 0x01, 0x3A, 0xAA, - 0x4A, 0x4A, 0x45, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xB0, 0x00, 0x00, - ], - [ - 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x89, 0x99, 0x92, 0x39, 0x21, - 0x49, 0x43, 0x33, 0x99, 0x34, 0x39, 0x99, 0x99, 0x99, 0x90, 0x00, 0x00, - ], - [ - 0xEE, 0xEE, 0xED, 0xDE, 0xEE, 0xED, 0xDD, 0xDE, 0xEE, 0xEE, 0x97, 0x75, - 0x55, 0x75, 0x20, 0x34, 0x63, 0x26, 0x8E, 0xEE, 0xEE, 0xE0, 0x00, 0x00, - ], - [ - 0x69, 0xB8, 0x77, 0x8B, 0x85, 0x56, 0x55, 0x44, 0x65, 0x44, 0x33, 0x32, - 0x23, 0x67, 0xA4, 0x74, 0x45, 0x44, 0x45, 0x68, 0x86, 0x70, 0x00, 0x00, - ], - ], - [ - [ - 0x67, 0x76, 0x66, 0x54, 0x43, 0x43, 0x33, 0x33, 0x33, 0x33, 0x44, 0x44, - 0x55, 0x66, 0x67, 0x67, 0x77, 0x77, 0x89, 0x89, 0x99, 0x60, 0x00, 0x00, - ], - [ - 0xA9, 0x99, 0x99, 0x66, 0x66, 0x43, 0x33, 0x22, 0x22, 0x33, 0x34, 0x57, - 0x78, 0xFF, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00, - ], - [ - 0xFE, 0xE9, 0xE9, 0x87, 0x65, 0x55, 0x44, 0x44, 0x32, 0x22, 0x22, 0x34, - 0x56, 0x79, 0x8E, 0xEA, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xF0, 0x00, 0x00, - ], - [ - 0xEE, 0xDE, 0xDD, 0xD8, 0xDD, 0x75, 0x54, 0x54, 0x33, 0x44, 0x31, 0x13, - 0x45, 0x66, 0x88, 0x89, 0x8E, 0xDD, 0xDD, 0xDD, 0xED, 0xE0, 0x00, 0x00, - ], - [ - 0xCC, 0xBC, 0xBB, 0xBC, 0xCB, 0x75, 0x65, 0x45, 0x32, 0x24, 0x43, 0x12, - 0x46, 0x54, 0x77, 0xBC, 0xCC, 0xCC, 0xCB, 0xCB, 0xCB, 0xC0, 0x00, 0x00, - ], - [ - 0xA9, 0x8B, 0x97, 0x56, 0x88, 0x76, 0x77, 0x66, 0x55, 0x44, 0x33, 0x33, - 0x33, 0x33, 0x33, 0x33, 0x45, 0x56, 0x67, 0x8A, 0xCA, 0xC0, 0x00, 0x00, - ], - [ - 0xDD, 0xCD, 0xCC, 0xCD, 0xDC, 0xCC, 0x68, 0x55, 0x53, 0x21, 0x23, 0x33, - 0x33, 0x45, 0x77, 0x67, 0xDD, 0xDD, 0xDD, 0xDC, 0xDC, 0xD0, 0x00, 0x00, - ], - [ - 0xEE, 0xDE, 0xDD, 0xDE, 0xE9, 0x8D, 0xD8, 0x67, 0x44, 0x32, 0x22, 0x22, - 0x33, 0x44, 0x46, 0x87, 0xEE, 0xEE, 0xEE, 0xDD, 0xDD, 0xE0, 0x00, 0x00, - ], - [ - 0xFF, 0xEF, 0xEE, 0xEF, 0xFE, 0xEE, 0xE9, 0x78, 0x67, 0x54, 0x43, 0x22, - 0x12, 0x35, 0x53, 0x55, 0x56, 0x7A, 0xFE, 0xEE, 0xFE, 0xF0, 0x00, 0x00, - ], - [ - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xBA, 0xFB, 0x87, 0x66, 0x54, 0x33, - 0x33, 0x22, 0x22, 0x33, 0x46, 0x67, 0x7A, 0xCF, 0xCF, 0xF0, 0x00, 0x00, - ], - [ - 0x67, 0x77, 0x77, 0x66, 0x66, 0x55, 0x55, 0x44, 0x43, 0x44, 0x33, 0x34, - 0x43, 0x44, 0x43, 0x44, 0x44, 0x55, 0x66, 0x76, 0x88, 0x70, 0x00, 0x00, - ], - ], - [ - [ - 0x78, 0x77, 0x76, 0x66, 0x55, 0x44, 0x44, 0x33, 0x33, 0x22, 0x33, 0x34, - 0x45, 0x67, 0x78, 0x88, 0x88, 0x99, 0x89, 0xA9, 0xA9, 0x70, 0x00, 0x00, - ], - [ - 0xA9, 0x9B, 0x99, 0x87, 0x77, 0x54, 0x44, 0x33, 0x22, 0x22, 0x23, 0x45, - 0x67, 0x9F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00, - ], - [ - 0xFF, 0xFF, 0xFD, 0xAA, 0x98, 0x87, 0x77, 0x65, 0x32, 0x11, 0x23, 0x44, - 0x57, 0x9A, 0xCE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00, - ], - [ - 0xFF, 0xFF, 0xFF, 0xFF, 0xFA, 0x88, 0x77, 0x65, 0x54, 0x31, 0x11, 0x35, - 0x57, 0x88, 0x8F, 0xDF, 0xFC, 0x9F, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00, - ], - [ - 0xFF, 0xEF, 0xEE, 0xEF, 0xFE, 0x99, 0x87, 0x77, 0x54, 0x22, 0x11, 0x24, - 0x66, 0x77, 0x78, 0xEA, 0xF9, 0xFF, 0xEE, 0xEE, 0xFE, 0xF0, 0x00, 0x00, - ], - [ - 0xAB, 0xAA, 0x97, 0x65, 0x44, 0x45, 0x66, 0x65, 0x54, 0x44, 0x43, 0x33, - 0x33, 0x33, 0x33, 0x44, 0x55, 0x66, 0x78, 0x8B, 0xAB, 0xB0, 0x00, 0x00, - ], - [ - 0xEE, 0xDE, 0xED, 0xDE, 0x98, 0x8D, 0xDD, 0x67, 0x66, 0x43, 0x11, 0x22, - 0x34, 0x57, 0x77, 0x8E, 0xEE, 0xEE, 0xEE, 0xED, 0xDD, 0xE0, 0x00, 0x00, - ], - [ - 0xFF, 0xFF, 0xFF, 0xEF, 0xFB, 0xFF, 0xBB, 0x98, 0x66, 0x54, 0x31, 0x11, - 0x34, 0x56, 0x98, 0xBF, 0xDC, 0xBF, 0xBF, 0xFF, 0xFF, 0xF0, 0x00, 0x00, - ], - [ - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xCB, 0xAA, 0x88, 0x66, 0x32, 0x11, - 0x23, 0x35, 0x66, 0x77, 0x99, 0xCE, 0xFE, 0xCD, 0xFF, 0xF0, 0x00, 0x00, - ], - [ - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xCA, 0xA9, 0x76, 0x54, 0x42, 0x22, - 0x22, 0x33, 0x34, 0x55, 0x56, 0x77, 0x9B, 0xBF, 0xFF, 0xC0, 0x00, 0x00, - ], - [ - 0x69, 0x88, 0x77, 0x77, 0x76, 0x65, 0x55, 0x44, 0x43, 0x43, 0x33, 0x33, - 0x33, 0x34, 0x44, 0x44, 0x55, 0x67, 0x77, 0x88, 0x89, 0x70, 0x00, 0x00, - ], - ], - [ - [ - 0x79, 0x98, 0x87, 0x77, 0x66, 0x55, 0x44, 0x43, 0x33, 0x22, 0x23, 0x33, - 0x45, 0x66, 0x77, 0x88, 0x89, 0x99, 0x9A, 0xA9, 0x99, 0x70, 0x00, 0x00, - ], - [ - 0xBB, 0xFB, 0xBA, 0xA9, 0x98, 0x76, 0x65, 0x44, 0x32, 0x21, 0x22, 0x35, - 0x79, 0xAE, 0xCC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00, - ], - [ - 0xFF, 0xCF, 0xFA, 0xAA, 0x99, 0x88, 0x77, 0x65, 0x33, 0x21, 0x12, 0x44, - 0x57, 0x89, 0xAB, 0xBE, 0xCF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00, - ], - [ - 0xFF, 0xFF, 0xFF, 0xBF, 0xDB, 0xA9, 0x99, 0x86, 0x65, 0x41, 0x02, 0x45, - 0x78, 0x89, 0xCA, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00, - ], - [ - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xAB, 0xA9, 0x98, 0x76, 0x52, 0x01, 0x35, - 0x68, 0x89, 0x9E, 0xEF, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0x00, 0x00, - ], - [ - 0xDB, 0xCA, 0x98, 0x75, 0x21, 0x46, 0x77, 0x76, 0x66, 0x54, 0x44, 0x44, - 0x33, 0x34, 0x44, 0x45, 0x66, 0x77, 0x89, 0xAC, 0xCB, 0xD0, 0x00, 0x00, - ], - [ - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xBB, 0x98, 0x77, 0x65, 0x10, 0x23, - 0x56, 0x89, 0xAA, 0xFF, 0xFC, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00, - ], - [ - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xBB, 0xCA, 0x87, 0x65, 0x30, 0x12, - 0x56, 0x78, 0xA9, 0xBA, 0xFD, 0xCF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00, - ], - [ - 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xED, 0xAA, 0xA9, 0x97, 0x64, 0x31, 0x12, - 0x23, 0x45, 0x56, 0x78, 0xA9, 0xAC, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00, - ], - [ - 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xFC, 0xCB, 0xA8, 0x65, 0x54, 0x32, 0x12, - 0x23, 0x34, 0x45, 0x56, 0x77, 0x88, 0xAC, 0xDF, 0xDF, 0xE0, 0x00, 0x00, - ], - [ - 0x68, 0x98, 0x88, 0x77, 0x77, 0x66, 0x55, 0x54, 0x44, 0x43, 0x32, 0x22, - 0x33, 0x44, 0x55, 0x56, 0x66, 0x77, 0x78, 0x89, 0x99, 0x70, 0x00, 0x00, - ], - ], - [ - [ - 0x8A, 0xA9, 0x88, 0x87, 0x66, 0x65, 0x54, 0x43, 0x33, 0x22, 0x23, 0x33, - 0x45, 0x55, 0x67, 0x78, 0x88, 0x88, 0x88, 0x99, 0x99, 0x60, 0x00, 0x00, - ], - [ - 0xCF, 0xBF, 0xCA, 0xAA, 0x98, 0x87, 0x76, 0x54, 0x33, 0x21, 0x12, 0x45, - 0x78, 0x8A, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00, - ], - [ - 0xFF, 0xFF, 0xFF, 0xEF, 0xBE, 0xBA, 0x99, 0x77, 0x65, 0x31, 0x02, 0x56, - 0x89, 0x9B, 0xBC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00, - ], - [ - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xBB, 0x97, 0x76, 0x32, 0x01, 0x46, - 0x88, 0x9B, 0xAB, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00, - ], - [ - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, 0xFC, 0xA8, 0x97, 0x42, 0x01, 0x35, - 0x78, 0x9A, 0xBC, 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00, - ], - [ - 0xDC, 0xCB, 0xB9, 0x75, 0x10, 0x47, 0x89, 0x89, 0x88, 0x76, 0x66, 0x55, - 0x55, 0x55, 0x55, 0x66, 0x77, 0x78, 0x9A, 0xAC, 0xFE, 0xF0, 0x00, 0x00, - ], - [ - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFB, 0xCA, 0xA9, 0x87, 0x63, 0x10, 0x24, - 0x67, 0x8A, 0xCA, 0xFF, 0xFE, 0xCF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00, - ], - [ - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, 0xAA, 0x98, 0x74, 0x20, 0x13, - 0x57, 0x8A, 0x9E, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00, - ], - [ - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xBC, 0xA9, 0x87, 0x65, 0x30, 0x13, - 0x44, 0x56, 0x78, 0x9A, 0xBE, 0xEF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00, - ], - [ - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xBB, 0x98, 0x65, 0x54, 0x31, 0x12, - 0x33, 0x44, 0x55, 0x67, 0x78, 0x9A, 0xAC, 0xFC, 0xFF, 0xF0, 0x00, 0x00, - ], - [ - 0x68, 0x88, 0x87, 0x77, 0x77, 0x76, 0x55, 0x54, 0x44, 0x43, 0x32, 0x22, - 0x33, 0x44, 0x45, 0x56, 0x67, 0x78, 0x89, 0x9A, 0xBB, 0x90, 0x00, 0x00, - ], - ], - [ - [ - 0x8A, 0x99, 0x88, 0x77, 0x76, 0x66, 0x55, 0x43, 0x33, 0x22, 0x22, 0x33, - 0x45, 0x67, 0x77, 0x88, 0x88, 0x99, 0xAA, 0x9A, 0xAA, 0x80, 0x00, 0x00, - ], - [ - 0xBC, 0xAA, 0xAB, 0xA9, 0x98, 0x87, 0x66, 0x54, 0x33, 0x21, 0x12, 0x45, - 0x89, 0xCF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00, - ], - [ - 0xFF, 0xFF, 0xEF, 0xFC, 0xCC, 0xBA, 0x98, 0x87, 0x65, 0x31, 0x02, 0x56, - 0x79, 0xBB, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00, - ], - [ - 0xFF, 0xFF, 0xFF, 0xDF, 0xFF, 0xFD, 0xBA, 0x98, 0x76, 0x42, 0x01, 0x36, - 0x78, 0x9A, 0xFB, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00, - ], - [ - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFA, 0xBB, 0xA9, 0x87, 0x42, 0x01, 0x35, - 0x78, 0xAB, 0xFB, 0xCF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00, - ], - [ - 0xDD, 0xEC, 0xC9, 0x74, 0x10, 0x47, 0x89, 0x99, 0x99, 0x87, 0x76, 0x66, - 0x55, 0x55, 0x55, 0x56, 0x67, 0x78, 0x89, 0xBC, 0xCD, 0xE0, 0x00, 0x00, - ], - [ - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xDA, 0x98, 0x63, 0x10, 0x24, - 0x58, 0x9A, 0xBF, 0xEF, 0xFF, 0xBF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00, - ], - [ - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xDB, 0x97, 0x74, 0x10, 0x23, - 0x57, 0x9A, 0xAB, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00, - ], - [ - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xCA, 0xA8, 0x65, 0x20, 0x13, - 0x56, 0x77, 0x89, 0x9B, 0xCE, 0xCF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00, - ], - [ - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xCB, 0x9A, 0xAA, 0x76, 0x54, 0x21, 0x12, - 0x34, 0x45, 0x56, 0x66, 0x78, 0x99, 0xAF, 0xEC, 0xEF, 0xB0, 0x00, 0x00, - ], - [ - 0x78, 0x88, 0x87, 0x77, 0x66, 0x66, 0x65, 0x55, 0x54, 0x43, 0x22, 0x22, - 0x33, 0x44, 0x55, 0x67, 0x77, 0x88, 0x98, 0x99, 0xAA, 0x80, 0x00, 0x00, - ], - ], - [ - [ - 0x67, 0x77, 0x86, 0x66, 0x66, 0x65, 0x54, 0x44, 0x33, 0x32, 0x12, 0x34, - 0x57, 0x99, 0xAC, 0x9A, 0xAC, 0xFB, 0xCF, 0xEE, 0xEB, 0xA0, 0x00, 0x00, - ], - [ - 0xAA, 0x99, 0x88, 0x87, 0x77, 0x77, 0x66, 0x55, 0x43, 0x21, 0x12, 0x35, - 0x8A, 0xFB, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00, - ], - [ - 0xFF, 0xFA, 0xDA, 0x99, 0x98, 0x77, 0x76, 0x65, 0x53, 0x32, 0x02, 0x45, - 0x67, 0x9A, 0xCF, 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00, - ], - [ - 0xFF, 0xFF, 0xFF, 0xCF, 0xFB, 0xBB, 0xE9, 0x87, 0x76, 0x42, 0x01, 0x36, - 0x89, 0xBB, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00, - ], - [ - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xAA, 0xA9, 0x76, 0x52, 0x01, 0x35, - 0x67, 0x8A, 0x9A, 0xC9, 0xFF, 0xFE, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00, - ], - [ - 0xEC, 0xCC, 0xA9, 0x74, 0x10, 0x37, 0x88, 0x89, 0x99, 0x88, 0x87, 0x76, - 0x66, 0x55, 0x55, 0x56, 0x77, 0x78, 0xAA, 0xFE, 0xFF, 0xF0, 0x00, 0x00, - ], - [ - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xED, 0xBA, 0x87, 0x64, 0x10, 0x24, - 0x46, 0x77, 0xAB, 0xFF, 0xFF, 0xFF, 0xEF, 0xFF, 0xFF, 0xF0, 0x00, 0x00, - ], - [ - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xCF, 0xFF, 0x88, 0x64, 0x10, 0x24, - 0x46, 0x78, 0x88, 0xAA, 0xBF, 0xCC, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00, - ], - [ - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xDC, 0xA7, 0x65, 0x20, 0x14, - 0x55, 0x57, 0x77, 0x88, 0x9A, 0xAA, 0xBB, 0xFF, 0xFF, 0xF0, 0x00, 0x00, - ], - [ - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xF9, 0x97, 0x76, 0x53, 0x21, 0x13, - 0x34, 0x45, 0x55, 0x66, 0x66, 0x77, 0x88, 0xAA, 0xDC, 0xA0, 0x00, 0x00, - ], - [ - 0x9D, 0xAC, 0xBA, 0x98, 0x88, 0x77, 0x65, 0x54, 0x54, 0x43, 0x21, 0x23, - 0x34, 0x45, 0x55, 0x66, 0x67, 0x79, 0x99, 0x9D, 0xBB, 0x80, 0x00, 0x00, - ], - ], - [ - [ - 0x47, 0x7C, 0x65, 0x45, 0x45, 0x45, 0x45, 0x33, 0x43, 0x22, 0x23, 0x44, - 0x57, 0x77, 0xCC, 0xB8, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xC0, 0x00, 0x00, - ], - [ - 0x89, 0x88, 0x67, 0x68, 0x67, 0x76, 0x55, 0x55, 0x43, 0x21, 0x12, 0x46, - 0x8E, 0xEA, 0xEE, 0xEF, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xF0, 0x00, 0x00, - ], - [ - 0xEE, 0xDE, 0xD9, 0xD8, 0x87, 0x66, 0x64, 0x55, 0x44, 0x42, 0x02, 0x45, - 0x67, 0x8D, 0xDD, 0xDE, 0xEE, 0xEE, 0xEE, 0xED, 0xDD, 0xE0, 0x00, 0x00, - ], - [ - 0xFF, 0xFF, 0xFA, 0xFF, 0xCF, 0xB7, 0x98, 0x66, 0x54, 0x42, 0x01, 0x57, - 0x89, 0xFA, 0xFF, 0xEF, 0xFB, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00, - ], - [ - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, 0xAA, 0x88, 0x76, 0x42, 0x01, 0x36, - 0x78, 0xFF, 0xFF, 0xEA, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00, - ], - [ - 0xBC, 0xAA, 0xB8, 0x75, 0x10, 0x35, 0x78, 0x88, 0x87, 0x66, 0x66, 0x55, - 0x55, 0x66, 0x77, 0x77, 0x88, 0x99, 0x9A, 0xDB, 0xBB, 0xD0, 0x00, 0x00, - ], - [ - 0xFF, 0xFF, 0xFF, 0xEF, 0xFF, 0xFF, 0xFD, 0x99, 0x87, 0x65, 0x10, 0x23, - 0x56, 0x78, 0x9E, 0xAF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00, - ], - [ - 0xFF, 0xEF, 0xFE, 0xEF, 0xFF, 0xEE, 0xE9, 0xE8, 0x65, 0x54, 0x20, 0x23, - 0x34, 0x67, 0x7A, 0x99, 0x9F, 0xF9, 0xFF, 0xFE, 0xFE, 0xF0, 0x00, 0x00, - ], - [ - 0xFF, 0xEF, 0xEE, 0xEF, 0xFE, 0xEE, 0xE9, 0xEF, 0x87, 0x53, 0x20, 0x23, - 0x55, 0x55, 0x56, 0x68, 0x98, 0x8A, 0x9F, 0xFE, 0xFE, 0xF0, 0x00, 0x00, - ], - [ - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFA, 0x8A, 0x77, 0x54, 0x31, 0x23, - 0x44, 0x34, 0x44, 0x44, 0x43, 0x45, 0x57, 0xFA, 0xFB, 0xF0, 0x00, 0x00, - ], - [ - 0x7C, 0xB7, 0x8B, 0x76, 0x76, 0x66, 0x55, 0x54, 0x44, 0x43, 0x33, 0x32, - 0x33, 0x44, 0x54, 0x44, 0x44, 0x57, 0x98, 0x87, 0xCB, 0x50, 0x00, 0x00, - ], - ], - [ - [ - 0x46, 0xAB, 0x6A, 0x6B, 0x65, 0x54, 0x54, 0x32, 0x22, 0x32, 0x43, 0x44, - 0xA4, 0x6A, 0xAA, 0xAB, 0xBB, 0xBB, 0xBB, 0xAA, 0xAA, 0xB0, 0x00, 0x00, - ], - [ - 0x67, 0x66, 0x6B, 0x6C, 0x56, 0xB5, 0x55, 0x34, 0x32, 0x21, 0x23, 0x64, - 0xBB, 0xBB, 0xBB, 0xBC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCB, 0xC0, 0x00, 0x00, - ], - [ - 0xCC, 0xCC, 0xCC, 0xBC, 0x76, 0x57, 0x55, 0x54, 0x43, 0x21, 0x12, 0x46, - 0x7C, 0xBB, 0xBB, 0xBC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xC0, 0x00, 0x00, - ], - [ - 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0x77, 0x43, 0x22, 0x02, 0x57, - 0x8D, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xD0, 0x00, 0x00, - ], - [ - 0xDD, 0xCD, 0xCC, 0xCD, 0xCC, 0xCC, 0xCC, 0xCC, 0x65, 0x42, 0x01, 0x3C, - 0x7C, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xDC, 0xD0, 0x00, 0x00, - ], - [ - 0xEE, 0x8E, 0xD9, 0x75, 0x10, 0x35, 0x77, 0x66, 0x68, 0x77, 0x66, 0x65, - 0x66, 0x65, 0x66, 0x68, 0x88, 0xEE, 0xAE, 0xED, 0xDD, 0xE0, 0x00, 0x00, - ], - [ - 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xD8, 0xDD, 0x55, 0x20, 0x14, - 0x56, 0x4D, 0x7D, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xD0, 0x00, 0x00, - ], - [ - 0xCC, 0xCC, 0xCC, 0xBC, 0xCC, 0xCC, 0xCB, 0xBC, 0xC7, 0x63, 0x20, 0x23, - 0x44, 0x55, 0x76, 0x7C, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xC0, 0x00, 0x00, - ], - [ - 0xBB, 0xBB, 0xBA, 0xAB, 0xBB, 0xBA, 0xAA, 0xAB, 0xB5, 0xB6, 0x31, 0x22, - 0x34, 0x43, 0x34, 0x54, 0x45, 0x4B, 0xBB, 0xBB, 0xBB, 0xB0, 0x00, 0x00, - ], - [ - 0xCC, 0xBC, 0xCB, 0xBC, 0xCB, 0xBB, 0xBB, 0xB7, 0x66, 0x55, 0x42, 0x22, - 0x23, 0x34, 0x43, 0x35, 0x54, 0x55, 0x6C, 0xCB, 0xCB, 0xC0, 0x00, 0x00, - ], - [ - 0xCB, 0xBB, 0x6B, 0xB7, 0xBB, 0x6B, 0x65, 0x55, 0x34, 0x33, 0x43, 0x32, - 0x23, 0x34, 0x55, 0x44, 0x46, 0xBB, 0xBB, 0xB6, 0xBB, 0xC0, 0x00, 0x00, - ], - ], - [ - [ - 0x88, 0x78, 0x71, 0x78, 0x77, 0x77, 0x77, 0x78, 0x27, 0x71, 0x77, 0x17, - 0x77, 0x77, 0x77, 0x78, 0x88, 0x77, 0x88, 0x87, 0x88, 0x80, 0x00, 0x00, - ], - [ - 0x99, 0x89, 0x88, 0x89, 0x88, 0x82, 0x88, 0x83, 0x83, 0x12, 0x22, 0x38, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x98, 0x90, 0x00, 0x00, - ], - [ - 0x99, 0x89, 0x88, 0x89, 0x88, 0x88, 0x38, 0x89, 0x22, 0x11, 0x28, 0x88, - 0x88, 0x88, 0x88, 0x89, 0x98, 0x88, 0x88, 0x98, 0x98, 0x90, 0x00, 0x00, - ], - [ - 0xAA, 0x9A, 0x99, 0x9A, 0x39, 0x99, 0x99, 0x33, 0x99, 0x42, 0x02, 0x99, - 0x99, 0x99, 0x99, 0x9A, 0xA9, 0x99, 0x99, 0x99, 0xA9, 0xA0, 0x00, 0x00, - ], - [ - 0xAA, 0x9A, 0x99, 0x9A, 0x99, 0x99, 0x99, 0x9A, 0xA9, 0x92, 0x01, 0x34, - 0x99, 0x99, 0x99, 0x9A, 0xA9, 0x99, 0x9A, 0xA9, 0xA9, 0xA0, 0x00, 0x00, - ], - [ - 0xAA, 0xAA, 0xAA, 0xAA, 0x30, 0x4A, 0xAA, 0x9A, 0xAA, 0xA4, 0x43, 0x43, - 0x35, 0x4A, 0x3A, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xA0, 0x00, 0x00, - ], - [ - 0xAA, 0x9A, 0x99, 0x9A, 0x99, 0x99, 0x99, 0x9A, 0x99, 0x93, 0x11, 0x13, - 0x34, 0x99, 0x99, 0x9A, 0x99, 0x99, 0x99, 0x99, 0xA9, 0xA0, 0x00, 0x00, - ], - [ - 0x99, 0x89, 0x88, 0x89, 0x88, 0x88, 0x88, 0x89, 0x88, 0x88, 0x31, 0x12, - 0x88, 0x18, 0x88, 0x89, 0x98, 0x88, 0x89, 0x99, 0x98, 0x90, 0x00, 0x00, - ], - [ - 0x88, 0x78, 0x77, 0x78, 0x77, 0x77, 0x77, 0x78, 0x77, 0x77, 0x71, 0x11, - 0x72, 0x77, 0x77, 0x78, 0x87, 0x77, 0x88, 0x88, 0x88, 0x80, 0x00, 0x00, - ], - [ - 0xAA, 0x9A, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x39, 0x92, 0x21, - 0x19, 0x39, 0x99, 0x94, 0x93, 0x99, 0x99, 0x99, 0xAA, 0xA0, 0x00, 0x00, - ], - [ - 0x88, 0x78, 0x77, 0x78, 0x77, 0x77, 0x77, 0x78, 0x77, 0x72, 0x77, 0x72, - 0x17, 0x27, 0x77, 0x78, 0x87, 0x71, 0x78, 0x87, 0x88, 0x80, 0x00, 0x00, - ], - ], - ], -]; - -const RALF_SHORT_CODES_TAB: [[[u8; 88]; 15]; 3] = [ - [ - [ - 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, 0xCF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xDD, 0xFC, 0xCD, 0xFF, 0xFF, 0xFF, 0xCC, 0xCB, 0xBC, - 0xDF, 0xFF, 0xFD, 0xDB, 0xC9, 0x69, 0xBC, 0xFF, 0xFC, 0xFF, 0xB9, 0x42, - 0x5A, 0xCD, 0xFF, 0xFD, 0xDC, 0x62, 0x03, 0x9B, 0xCF, 0xFF, 0xFD, 0xC9, - 0x53, 0x4A, 0xCC, 0xFF, 0xFF, 0xFF, 0xBA, 0x9A, 0xBC, 0xFF, 0xFF, 0xFC, - 0xDC, 0xBC, 0xBC, 0xFF, 0xFF, 0xFF, 0xFE, 0xCC, 0xCD, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFD, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xF0, 0x00, 0x00, 0x00, - ], - [ - 0xFF, 0xFF, 0xDF, 0xFD, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, 0xCD, 0xFF, - 0xFF, 0xFF, 0xFC, 0xFC, 0xCC, 0xCF, 0xDF, 0xFF, 0xFF, 0xDB, 0xA9, 0x9B, - 0xCF, 0xDF, 0xFF, 0xCB, 0x97, 0x67, 0x9B, 0xFF, 0xFF, 0xDC, 0xA7, 0x42, - 0x47, 0xAD, 0xFF, 0xFF, 0xC9, 0x63, 0x03, 0x69, 0xBF, 0xFF, 0xFC, 0xA7, - 0x53, 0x47, 0xAC, 0xDF, 0xFD, 0xDC, 0x97, 0x77, 0x8C, 0xBD, 0xFF, 0xFF, - 0xCC, 0xAA, 0xAB, 0xCF, 0xFF, 0xFF, 0xFF, 0xCC, 0xCC, 0xCF, 0xFF, 0xFF, - 0xFF, 0xFE, 0xFF, 0xEF, 0xFF, 0xFF, 0xFF, 0xFD, 0xFF, 0xDC, 0xFF, 0xDF, - 0xF0, 0x00, 0x00, 0x00, - ], - [ - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xB9, 0xAF, - 0xFF, 0xFF, 0xFF, 0xFF, 0x96, 0x56, 0x9F, 0xFF, 0xFF, 0xFF, 0xA6, 0x43, - 0x47, 0xEF, 0xFF, 0xFF, 0xF9, 0x53, 0x03, 0x6A, 0xFF, 0xFF, 0xFF, 0xA6, - 0x43, 0x46, 0xAF, 0xFF, 0xFF, 0xFF, 0x96, 0x56, 0x9F, 0xFF, 0xFF, 0xFF, - 0xFF, 0xC9, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xF0, 0x00, 0x00, 0x00, - ], - [ - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFD, 0xDD, 0xFF, 0xFF, 0xFD, 0xFF, 0xFD, 0xFD, 0xFF, - 0xFF, 0xFF, 0xFF, 0xDD, 0xDB, 0xBC, 0xDF, 0xFF, 0xFF, 0xFF, 0xFA, 0x43, - 0x6B, 0xFF, 0xDF, 0xFF, 0xFD, 0xA3, 0x02, 0xAD, 0xFF, 0xFF, 0xFD, 0xFB, - 0x52, 0x3A, 0xDF, 0xFF, 0xFF, 0xFF, 0xCB, 0xAA, 0xCE, 0xFF, 0xDF, 0xFF, - 0xFE, 0xDD, 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0xED, 0xFD, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xF0, 0x00, 0x00, 0x00, - ], - [ - 0xFF, 0xCF, 0xCC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xBF, 0xFF, 0xCC, 0xCA, - 0xFF, 0xCF, 0xFB, 0xAA, 0xAA, 0xCF, 0xCB, 0xFC, 0xFF, 0xAA, 0xA9, 0x99, - 0xAC, 0xBF, 0xFC, 0xA9, 0x98, 0x88, 0x99, 0xAA, 0xCF, 0xCA, 0xA8, 0x53, - 0x58, 0x9F, 0xCC, 0xCC, 0xB9, 0x73, 0x02, 0x68, 0xAC, 0xCF, 0xCA, 0x98, - 0x53, 0x37, 0x9B, 0xAC, 0xFB, 0xAA, 0x97, 0x78, 0x8A, 0xFB, 0xFF, 0xFA, - 0xBB, 0x99, 0x9A, 0xAB, 0xFF, 0xFF, 0xEB, 0xBA, 0xAA, 0xAC, 0xCB, 0xFF, - 0xBF, 0xBC, 0xBC, 0xCF, 0xFF, 0xFF, 0xCF, 0xFC, 0xFC, 0xFF, 0xFF, 0xCF, - 0xA0, 0x00, 0x00, 0x00, - ], - [ - 0xAF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xFD, 0xFC, 0xFF, - 0xFF, 0xFF, 0xFC, 0xAB, 0xBA, 0xFC, 0xFF, 0xFF, 0xFF, 0xA9, 0x77, 0x78, - 0xAF, 0xFF, 0xFF, 0xA8, 0x65, 0x45, 0x68, 0xFF, 0xFC, 0xFB, 0x74, 0x33, - 0x35, 0x7B, 0xFF, 0xFF, 0xB7, 0x43, 0x23, 0x46, 0xAF, 0xFF, 0xCB, 0x75, - 0x33, 0x35, 0x7A, 0xCC, 0xFF, 0xF8, 0x65, 0x45, 0x68, 0xAC, 0xCF, 0xCC, - 0xA8, 0x77, 0x78, 0xBF, 0xFF, 0xFF, 0xFF, 0xB9, 0x99, 0xFC, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xF0, 0x00, 0x00, 0x00, - ], - [ - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xDA, 0xFC, 0xFF, - 0xFF, 0xFC, 0xFB, 0x9A, 0x99, 0xBA, 0xFF, 0xFF, 0xFB, 0x97, 0x77, 0x77, - 0x9C, 0xCF, 0xFC, 0x98, 0x65, 0x45, 0x68, 0xAF, 0xFF, 0xC9, 0x75, 0x33, - 0x35, 0x79, 0xFF, 0xFB, 0x86, 0x43, 0x23, 0x47, 0x9F, 0xFF, 0xC9, 0x75, - 0x33, 0x35, 0x7B, 0xBF, 0xFF, 0xA8, 0x65, 0x45, 0x68, 0xAF, 0xFF, 0xFA, - 0xA8, 0x77, 0x78, 0x9B, 0xFF, 0xFF, 0xFF, 0xFB, 0x99, 0xBB, 0xFF, 0xFF, - 0xFF, 0xFE, 0xCE, 0xFF, 0xCF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xF0, 0x00, 0x00, 0x00, - ], - [ - 0xFF, 0xFF, 0xFD, 0xDE, 0xFF, 0xFF, 0xFF, 0xFF, 0xDC, 0xBB, 0xBC, 0xEF, - 0xFF, 0xFF, 0xDB, 0x99, 0x89, 0xAC, 0xDF, 0xFF, 0xDB, 0x97, 0x66, 0x67, - 0x9C, 0xFF, 0xEC, 0x97, 0x65, 0x45, 0x67, 0xAC, 0xFF, 0xB9, 0x65, 0x33, - 0x35, 0x69, 0xBF, 0xFB, 0x86, 0x43, 0x33, 0x46, 0x9B, 0xEE, 0xB9, 0x65, - 0x33, 0x35, 0x69, 0xBE, 0xFD, 0xA7, 0x65, 0x45, 0x67, 0xAC, 0xDF, 0xDB, - 0x97, 0x66, 0x67, 0x9B, 0xDF, 0xFF, 0xDC, 0xA9, 0x89, 0x9B, 0xCF, 0xFF, - 0xFF, 0xDC, 0xBB, 0xBC, 0xDE, 0xFF, 0xFF, 0xFF, 0xFF, 0xEF, 0xEF, 0xFF, - 0xF0, 0x00, 0x00, 0x00, - ], - [ - 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFB, 0xBB, 0xFF, - 0xFF, 0xFF, 0xFF, 0xAA, 0x99, 0xAB, 0xFF, 0xFF, 0xFA, 0x98, 0x76, 0x67, - 0xAC, 0xCF, 0xFA, 0xA7, 0x64, 0x45, 0x67, 0x9B, 0xFF, 0xF8, 0x74, 0x33, - 0x34, 0x68, 0xAF, 0xFB, 0x96, 0x43, 0x33, 0x46, 0x8B, 0xFF, 0xF9, 0x75, - 0x43, 0x35, 0x69, 0xBF, 0xCC, 0x98, 0x65, 0x45, 0x67, 0x9A, 0xBF, 0xFF, - 0x98, 0x66, 0x68, 0x8F, 0xFF, 0xFF, 0xFF, 0x98, 0x88, 0xAF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xBA, 0xBA, 0xBE, 0xFF, 0xFF, 0xFF, 0xDF, 0xFF, 0xFF, 0xFF, - 0xC0, 0x00, 0x00, 0x00, - ], - [ - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFA, 0xFF, - 0xFF, 0xAA, 0xFF, 0xF9, 0xAF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFA, 0x88, 0x7F, - 0xAF, 0xFA, 0xFF, 0xF8, 0x75, 0x55, 0x79, 0xFF, 0xFF, 0xF9, 0x75, 0x32, - 0x34, 0x8A, 0xFF, 0xFF, 0xB8, 0x43, 0x22, 0x58, 0xFF, 0xFF, 0xCF, 0x95, - 0x33, 0x46, 0x7A, 0xFF, 0xFA, 0xFF, 0x75, 0x46, 0x79, 0xFA, 0xFF, 0xAF, - 0xF9, 0x89, 0x8A, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xAF, 0xAA, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFA, 0xFF, 0xFF, 0xFF, 0xAF, 0xFF, 0xFF, 0xFA, 0xFF, 0xFA, - 0x90, 0x00, 0x00, 0x00, - ], - [ - 0xBC, 0xBA, 0xAA, 0x99, 0xAA, 0xBD, 0xBB, 0xBA, 0x99, 0x88, 0x89, 0x9B, - 0xCC, 0xBA, 0x98, 0x77, 0x77, 0x78, 0x9A, 0xBA, 0x98, 0x76, 0x65, 0x66, - 0x78, 0xAB, 0xA8, 0x76, 0x55, 0x45, 0x56, 0x79, 0xA9, 0x87, 0x55, 0x44, - 0x44, 0x67, 0x8A, 0x98, 0x75, 0x44, 0x44, 0x45, 0x68, 0x9A, 0x87, 0x65, - 0x44, 0x45, 0x67, 0x8A, 0xA9, 0x76, 0x55, 0x45, 0x56, 0x79, 0xAB, 0x98, - 0x76, 0x55, 0x56, 0x78, 0x9A, 0xBA, 0x98, 0x77, 0x77, 0x78, 0x9A, 0xCD, - 0xCB, 0xA9, 0x88, 0x89, 0xAA, 0xBB, 0xDD, 0xCA, 0xA9, 0x9A, 0xAB, 0xCC, - 0xB0, 0x00, 0x00, 0x00, - ], - [ - 0xBD, 0xCA, 0xAA, 0xAA, 0xAB, 0xCE, 0xDC, 0xCB, 0xA9, 0x88, 0x89, 0x9B, - 0xCD, 0xBB, 0x98, 0x87, 0x77, 0x78, 0xAB, 0xDA, 0xA8, 0x76, 0x65, 0x66, - 0x78, 0xAC, 0xA9, 0x76, 0x55, 0x44, 0x56, 0x79, 0xAA, 0x97, 0x65, 0x44, - 0x44, 0x67, 0x9A, 0xA8, 0x75, 0x44, 0x34, 0x45, 0x79, 0x9A, 0x87, 0x65, - 0x44, 0x45, 0x67, 0x9A, 0xB9, 0x76, 0x55, 0x45, 0x56, 0x79, 0xAB, 0xA8, - 0x76, 0x65, 0x66, 0x78, 0xBB, 0xCB, 0xA8, 0x77, 0x77, 0x78, 0xAB, 0xBD, - 0xCB, 0xA9, 0x98, 0x99, 0xAA, 0xCD, 0xFD, 0xFB, 0xAA, 0xAB, 0xAB, 0xCC, - 0xC0, 0x00, 0x00, 0x00, - ], - [ - 0xCD, 0xCB, 0xAA, 0xAA, 0xAB, 0xCE, 0xED, 0xCB, 0xA9, 0x88, 0x89, 0xAB, - 0xCE, 0xCB, 0x98, 0x77, 0x77, 0x78, 0x9B, 0xCB, 0xA8, 0x76, 0x65, 0x56, - 0x78, 0xAB, 0xA9, 0x76, 0x55, 0x45, 0x56, 0x79, 0xBA, 0x87, 0x55, 0x44, - 0x45, 0x57, 0x8A, 0xA8, 0x75, 0x44, 0x34, 0x45, 0x78, 0xAA, 0x87, 0x65, - 0x44, 0x45, 0x67, 0x8A, 0xA9, 0x76, 0x55, 0x45, 0x56, 0x79, 0xAB, 0xA8, - 0x76, 0x65, 0x66, 0x78, 0xAB, 0xCB, 0x98, 0x77, 0x77, 0x78, 0x9B, 0xCD, - 0xCB, 0xA9, 0x88, 0x89, 0xAB, 0xCD, 0xED, 0xCB, 0xAA, 0xAA, 0xAB, 0xCD, - 0xC0, 0x00, 0x00, 0x00, - ], - [ - 0xCD, 0xCB, 0xB9, 0xAA, 0xBB, 0xFF, 0xDD, 0xCB, 0xA9, 0x89, 0x89, 0x9B, - 0xEF, 0xBB, 0xA8, 0x77, 0x77, 0x78, 0x9B, 0xFC, 0xA8, 0x76, 0x55, 0x56, - 0x78, 0xAB, 0xB9, 0x76, 0x55, 0x45, 0x56, 0x79, 0xBB, 0x97, 0x65, 0x44, - 0x44, 0x57, 0x8A, 0xA8, 0x75, 0x44, 0x44, 0x45, 0x68, 0xAA, 0x87, 0x65, - 0x44, 0x45, 0x57, 0x9A, 0xB9, 0x76, 0x55, 0x45, 0x56, 0x79, 0xBB, 0x98, - 0x76, 0x55, 0x66, 0x78, 0xAB, 0xFB, 0xA8, 0x77, 0x77, 0x78, 0xAB, 0xBD, - 0xFB, 0xA9, 0x88, 0x89, 0xAC, 0xCC, 0xBC, 0xCB, 0xBA, 0xAA, 0xAA, 0xBB, - 0xA0, 0x00, 0x00, 0x00, - ], - [ - 0xAC, 0xAB, 0xA9, 0xAA, 0xAB, 0xCC, 0xDC, 0xBA, 0x98, 0x88, 0x88, 0x9A, - 0xBD, 0xBA, 0x98, 0x77, 0x77, 0x78, 0x9B, 0xCA, 0xA8, 0x76, 0x65, 0x56, - 0x78, 0xAB, 0xA9, 0x76, 0x55, 0x45, 0x56, 0x79, 0xBA, 0x87, 0x55, 0x44, - 0x45, 0x57, 0x89, 0x98, 0x75, 0x44, 0x44, 0x45, 0x68, 0x9A, 0x87, 0x55, - 0x44, 0x45, 0x57, 0x89, 0xA8, 0x76, 0x55, 0x55, 0x56, 0x79, 0xAB, 0xA8, - 0x76, 0x55, 0x56, 0x78, 0x9A, 0xCB, 0xA8, 0x77, 0x77, 0x78, 0x9B, 0xDC, - 0xCB, 0xA9, 0x88, 0x89, 0x9A, 0xBD, 0xCB, 0xCB, 0xA9, 0xA9, 0xAA, 0xBB, - 0xB0, 0x00, 0x00, 0x00, - ], - ], - [ - [ - 0xAF, 0xFF, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFB, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xA9, 0xAF, - 0xFF, 0xFF, 0xFF, 0xFB, 0x96, 0x56, 0x9F, 0xFF, 0xFF, 0xFF, 0xA6, 0x32, - 0x36, 0xAF, 0xFF, 0xFF, 0xF9, 0x63, 0x12, 0x6A, 0xFF, 0xFF, 0xFF, 0x96, - 0x33, 0x36, 0xBF, 0xFF, 0xFF, 0xFF, 0x96, 0x56, 0x9A, 0xFF, 0xFF, 0xFF, - 0xFF, 0xDA, 0x9A, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xF0, 0x00, 0x00, 0x00, - ], - [ - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xF7, 0x56, 0xFC, 0xCF, 0xFF, 0xFF, 0xF6, 0x32, - 0x39, 0xFF, 0xFF, 0xFF, 0xF8, 0x62, 0x12, 0x6F, 0xFF, 0xFF, 0xFF, 0xF6, - 0x43, 0x37, 0xFF, 0xFF, 0xFF, 0xFF, 0xA6, 0x58, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xF0, 0x00, 0x00, 0x00, - ], - [ - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xEA, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0x96, 0x56, 0x9F, 0xFF, 0xFF, 0xFF, 0xB6, 0x43, - 0x36, 0xFF, 0xFF, 0xFF, 0xFB, 0x62, 0x12, 0x5B, 0xFF, 0xFF, 0xFF, 0xD6, - 0x42, 0x36, 0xFF, 0xFF, 0xFF, 0xFF, 0x96, 0x56, 0x9F, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFA, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xF0, 0x00, 0x00, 0x00, - ], - [ - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x8F, 0xFF, 0xFF, 0xFF, 0xFF, 0xF9, 0x43, - 0x5F, 0xFF, 0xFF, 0xFF, 0xFF, 0xA3, 0x11, 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, - 0x61, 0x3E, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xF0, 0x00, 0x00, 0x00, - ], - [ - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xF9, 0x8A, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x53, - 0x5E, 0xFF, 0xFF, 0xFF, 0xFF, 0x93, 0x11, 0x8F, 0xFF, 0xFF, 0xFF, 0xFE, - 0x51, 0x39, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x88, 0xCF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xF0, 0x00, 0x00, 0x00, - ], - [ - 0x77, 0x67, 0x76, 0x67, 0x77, 0x66, 0x66, 0x67, 0x77, 0x77, 0x66, 0x66, - 0x66, 0x66, 0x66, 0x67, 0x77, 0x77, 0x77, 0x77, 0x76, 0x66, 0x66, 0x66, - 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x67, 0x77, 0x77, 0x77, 0x77, - 0x77, 0x77, 0x77, 0x77, 0x76, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, - 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, - 0x66, 0x66, 0x66, 0x67, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, - 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, - 0x70, 0x00, 0x00, 0x00, - ], - [ - 0x77, 0x67, 0x76, 0x67, 0x77, 0x66, 0x66, 0x67, 0x77, 0x77, 0x66, 0x66, - 0x66, 0x66, 0x66, 0x67, 0x77, 0x77, 0x77, 0x77, 0x76, 0x66, 0x66, 0x66, - 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x67, 0x77, 0x77, 0x77, 0x77, - 0x77, 0x77, 0x77, 0x77, 0x76, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, - 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, - 0x66, 0x66, 0x66, 0x67, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, - 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, - 0x70, 0x00, 0x00, 0x00, - ], - [ - 0x77, 0x67, 0x76, 0x67, 0x77, 0x66, 0x66, 0x67, 0x77, 0x77, 0x66, 0x66, - 0x66, 0x66, 0x66, 0x67, 0x77, 0x77, 0x77, 0x77, 0x76, 0x66, 0x66, 0x66, - 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x67, 0x77, 0x77, 0x77, 0x77, - 0x77, 0x77, 0x77, 0x77, 0x76, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, - 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, - 0x66, 0x66, 0x66, 0x67, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, - 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, - 0x70, 0x00, 0x00, 0x00, - ], - [ - 0x77, 0x67, 0x76, 0x67, 0x77, 0x66, 0x66, 0x67, 0x77, 0x77, 0x66, 0x66, - 0x66, 0x66, 0x66, 0x67, 0x77, 0x77, 0x77, 0x77, 0x76, 0x66, 0x66, 0x66, - 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x67, 0x77, 0x77, 0x77, 0x77, - 0x77, 0x77, 0x77, 0x77, 0x76, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, - 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, - 0x66, 0x66, 0x66, 0x67, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, - 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, - 0x70, 0x00, 0x00, 0x00, - ], - [ - 0x77, 0x67, 0x76, 0x67, 0x77, 0x66, 0x66, 0x67, 0x77, 0x77, 0x66, 0x66, - 0x66, 0x66, 0x66, 0x67, 0x77, 0x77, 0x77, 0x77, 0x76, 0x66, 0x66, 0x66, - 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x67, 0x77, 0x77, 0x77, 0x77, - 0x77, 0x77, 0x77, 0x77, 0x76, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, - 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, - 0x66, 0x66, 0x66, 0x67, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, - 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, - 0x70, 0x00, 0x00, 0x00, - ], - [ - 0xAC, 0xBB, 0xAA, 0xAA, 0xAC, 0xDE, 0xCB, 0xBA, 0xA9, 0x98, 0x99, 0xAB, - 0xDE, 0xBA, 0x98, 0x77, 0x77, 0x78, 0xAB, 0xEA, 0xA8, 0x76, 0x65, 0x66, - 0x79, 0xAC, 0xA9, 0x86, 0x54, 0x44, 0x56, 0x79, 0xAA, 0x87, 0x65, 0x44, - 0x45, 0x57, 0x9A, 0xA9, 0x75, 0x44, 0x34, 0x45, 0x78, 0x9A, 0x87, 0x65, - 0x44, 0x45, 0x67, 0x9A, 0xB9, 0x86, 0x55, 0x45, 0x56, 0x89, 0xAC, 0xA8, - 0x76, 0x65, 0x66, 0x78, 0x9A, 0xCC, 0xA8, 0x87, 0x77, 0x89, 0x9B, 0xBF, - 0xDB, 0xA9, 0x98, 0x99, 0x9B, 0xBC, 0xDF, 0xCB, 0xAA, 0xB9, 0xAB, 0xBB, - 0xA0, 0x00, 0x00, 0x00, - ], - [ - 0xBC, 0xCB, 0xAA, 0x9A, 0xAB, 0xCE, 0xCD, 0xCB, 0x99, 0x88, 0x89, 0x9B, - 0xCD, 0xCA, 0x98, 0x77, 0x67, 0x78, 0x9B, 0xCB, 0xA8, 0x76, 0x65, 0x56, - 0x78, 0xAB, 0xA9, 0x76, 0x55, 0x45, 0x56, 0x79, 0xAA, 0x87, 0x65, 0x44, - 0x45, 0x57, 0x8A, 0x98, 0x65, 0x44, 0x44, 0x45, 0x78, 0xAA, 0x87, 0x55, - 0x44, 0x45, 0x57, 0x8A, 0xA9, 0x76, 0x55, 0x45, 0x56, 0x79, 0xAB, 0xA8, - 0x76, 0x55, 0x66, 0x78, 0x9B, 0xCB, 0xA8, 0x77, 0x67, 0x78, 0x9B, 0xCD, - 0xDB, 0xA9, 0x88, 0x89, 0x9B, 0xCD, 0xDC, 0xDB, 0xAA, 0xA9, 0xAB, 0xBE, - 0xB0, 0x00, 0x00, 0x00, - ], - [ - 0xBC, 0xBB, 0xAA, 0xAA, 0xAB, 0xCD, 0xDC, 0xCB, 0x99, 0x88, 0x89, 0xAB, - 0xCD, 0xBB, 0x98, 0x77, 0x77, 0x78, 0x9B, 0xCB, 0xA8, 0x76, 0x55, 0x56, - 0x78, 0xAB, 0xA9, 0x76, 0x55, 0x44, 0x56, 0x79, 0xAA, 0x87, 0x65, 0x44, - 0x45, 0x57, 0x8A, 0xA8, 0x75, 0x44, 0x44, 0x45, 0x68, 0xAA, 0x87, 0x55, - 0x44, 0x45, 0x67, 0x89, 0xA9, 0x76, 0x55, 0x45, 0x56, 0x79, 0xAB, 0xA8, - 0x76, 0x65, 0x66, 0x78, 0xAA, 0xCB, 0x98, 0x77, 0x77, 0x78, 0x9A, 0xBD, - 0xCB, 0xA9, 0x88, 0x89, 0xAB, 0xBB, 0xDD, 0xCB, 0xAA, 0x9A, 0xAA, 0xBB, - 0xB0, 0x00, 0x00, 0x00, - ], - [ - 0xDF, 0xEC, 0xBA, 0xAA, 0xBD, 0xEF, 0xDD, 0xCB, 0xA9, 0x99, 0x9A, 0xBD, - 0xCF, 0xDB, 0x98, 0x77, 0x77, 0x88, 0xAC, 0xDE, 0xA9, 0x76, 0x55, 0x66, - 0x79, 0x9F, 0xB9, 0x86, 0x55, 0x45, 0x56, 0x89, 0xBB, 0x97, 0x65, 0x44, - 0x45, 0x67, 0x9B, 0xB8, 0x75, 0x44, 0x34, 0x45, 0x79, 0xAA, 0x97, 0x64, - 0x44, 0x45, 0x57, 0x9B, 0xC9, 0x86, 0x55, 0x44, 0x56, 0x79, 0xBC, 0xA8, - 0x76, 0x55, 0x66, 0x79, 0xBF, 0xFC, 0xA8, 0x87, 0x77, 0x78, 0xAA, 0xFF, - 0xFC, 0xAA, 0x99, 0x99, 0xAC, 0xCF, 0xFF, 0xCB, 0xBA, 0xAB, 0xBC, 0xBE, - 0xB0, 0x00, 0x00, 0x00, - ], - [ - 0xBC, 0xBB, 0xBB, 0x9B, 0xBB, 0xFE, 0xCD, 0xCC, 0xA9, 0x99, 0x99, 0xAC, - 0xED, 0xCC, 0xA8, 0x87, 0x77, 0x88, 0xAB, 0xCB, 0xA8, 0x76, 0x56, 0x66, - 0x79, 0xBC, 0xA9, 0x86, 0x55, 0x44, 0x56, 0x79, 0xCA, 0x97, 0x65, 0x44, - 0x44, 0x67, 0x8A, 0xA9, 0x75, 0x44, 0x34, 0x45, 0x79, 0xBB, 0x97, 0x64, - 0x44, 0x45, 0x67, 0x9A, 0xB9, 0x86, 0x54, 0x45, 0x56, 0x89, 0xBC, 0xA9, - 0x76, 0x66, 0x66, 0x79, 0xAC, 0xFC, 0xA8, 0x87, 0x77, 0x79, 0x9B, 0xDE, - 0xDC, 0xA9, 0x99, 0x9A, 0xAB, 0xBD, 0xBD, 0xDB, 0xBA, 0xAA, 0xBB, 0xCD, - 0xB0, 0x00, 0x00, 0x00, - ], - ], - [ - [ - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xF7, 0x7F, 0xFC, 0xAF, 0xFF, 0xFF, 0xF6, 0x32, - 0x6F, 0xFF, 0xFF, 0xFF, 0xFF, 0x62, 0x03, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0x63, 0x5F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0x9F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xF0, 0x00, 0x00, 0x00, - ], - [ - 0xBF, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xCC, 0xCF, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF, 0xBA, 0x99, 0xBB, - 0xFF, 0xFF, 0xFC, 0xBB, 0x86, 0x56, 0x9B, 0xFF, 0xFF, 0xFB, 0xA7, 0x42, - 0x36, 0xAF, 0xFF, 0xFF, 0xF9, 0x62, 0x13, 0x59, 0xFF, 0xFF, 0xFF, 0xA6, - 0x32, 0x47, 0xAF, 0xEF, 0xFF, 0xFF, 0x96, 0x57, 0x9A, 0xCC, 0xFF, 0xFF, - 0xFB, 0xAA, 0xAA, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFB, 0xBF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xF0, 0x00, 0x00, 0x00, - ], - [ - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFB, 0x99, 0x9B, - 0xFF, 0xFF, 0xFF, 0xFA, 0x86, 0x56, 0x8B, 0xFF, 0xFF, 0xFF, 0xA6, 0x42, - 0x36, 0xAF, 0xFF, 0xFF, 0xF9, 0x52, 0x13, 0x58, 0xFF, 0xFF, 0xFF, 0xA5, - 0x33, 0x36, 0x9F, 0xFF, 0xFF, 0xFE, 0x86, 0x56, 0x8B, 0xFF, 0xFF, 0xFF, - 0xFE, 0xA8, 0x9A, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xF0, 0x00, 0x00, 0x00, - ], - [ - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x77, 0x7F, - 0xFF, 0xFF, 0xFF, 0xFF, 0x75, 0x45, 0x68, 0xCF, 0xFF, 0xFF, 0xB5, 0x43, - 0x35, 0x8F, 0xFF, 0xFF, 0xF8, 0x43, 0x23, 0x57, 0xCF, 0xFF, 0xFF, 0xA5, - 0x32, 0x34, 0x8F, 0xFF, 0xFF, 0xFF, 0x64, 0x44, 0x6F, 0xFF, 0xFF, 0xFF, - 0xFF, 0x87, 0x98, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xF0, 0x00, 0x00, 0x00, - ], - [ - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xED, 0xAF, 0xFF, 0xFF, 0xFF, 0xF3, - 0x3F, 0xFF, 0xFF, 0xFF, 0xFF, 0xF4, 0x02, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0x52, 0x37, 0xFF, 0xFF, 0xFF, 0xFF, 0xF9, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x8F, 0xFF, 0xFF, - 0xF0, 0x00, 0x00, 0x00, - ], - [ - 0x8F, 0xF8, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0x88, 0xEE, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0x8F, 0xF8, 0x67, 0x87, - 0xFF, 0xFF, 0xFF, 0xF8, 0x76, 0x54, 0x77, 0xEF, 0xFF, 0xFF, 0x84, 0x33, - 0x35, 0x7F, 0xFF, 0xF8, 0x86, 0x53, 0x23, 0x57, 0xFF, 0xFF, 0xFF, 0x65, - 0x33, 0x35, 0x78, 0xFF, 0xFF, 0xF8, 0x55, 0x44, 0x58, 0xEE, 0xEE, 0xFE, - 0xFE, 0x67, 0x88, 0x8F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xF0, 0x00, 0x00, 0x00, - ], - [ - 0xFF, 0xFF, 0xFC, 0xCC, 0xFC, 0xFF, 0xFF, 0xFF, 0xBC, 0xA9, 0xA9, 0xCF, - 0xFF, 0xFC, 0xBA, 0x98, 0x77, 0x89, 0xBF, 0xFF, 0xB9, 0x87, 0x66, 0x67, - 0x8A, 0xCF, 0xBA, 0x87, 0x65, 0x44, 0x67, 0x9F, 0xFB, 0xA8, 0x65, 0x43, - 0x45, 0x69, 0xCF, 0xEA, 0x76, 0x43, 0x33, 0x46, 0x8F, 0xFC, 0xA8, 0x65, - 0x43, 0x34, 0x68, 0xAF, 0xF9, 0x97, 0x64, 0x44, 0x57, 0xAF, 0xFF, 0xFA, - 0x97, 0x66, 0x67, 0x9C, 0xFF, 0xFF, 0xFB, 0xA9, 0x99, 0x9B, 0xFF, 0xFF, - 0xFF, 0xFF, 0xCB, 0xCC, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xF0, 0x00, 0x00, 0x00, - ], - [ - 0xFF, 0xFD, 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0xED, 0xDC, 0xCD, 0xCF, 0xFF, - 0xFF, 0xCC, 0xCB, 0xA9, 0x9A, 0xBC, 0xFF, 0xFD, 0xDB, 0xA8, 0x76, 0x78, - 0xAD, 0xFF, 0xDC, 0xA8, 0x65, 0x45, 0x68, 0xBF, 0xFE, 0xCA, 0x75, 0x33, - 0x35, 0x7A, 0xCF, 0xFC, 0xA6, 0x43, 0x23, 0x47, 0x9C, 0xFF, 0xC9, 0x75, - 0x33, 0x35, 0x79, 0xCE, 0xFD, 0xB8, 0x65, 0x45, 0x68, 0xAC, 0xDF, 0xFC, - 0xA8, 0x76, 0x78, 0xAB, 0xDF, 0xFF, 0xFD, 0xBA, 0x99, 0xAB, 0xCF, 0xFF, - 0xFF, 0xFD, 0xDD, 0xCD, 0xDF, 0xDF, 0xFF, 0xFF, 0xFF, 0xFD, 0xFF, 0xFF, - 0xD0, 0x00, 0x00, 0x00, - ], - [ - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0x9D, 0xFF, 0xAF, 0xFF, 0xFF, 0xFF, 0xAF, 0x77, 0x8A, - 0xFF, 0xFF, 0xFF, 0xF9, 0x75, 0x45, 0x68, 0xFF, 0xFF, 0xFF, 0x84, 0x33, - 0x35, 0x9A, 0xFF, 0xFF, 0xF6, 0x43, 0x23, 0x47, 0xFF, 0xFF, 0xFF, 0x75, - 0x33, 0x35, 0x7A, 0xFF, 0xFF, 0xF8, 0x64, 0x45, 0x69, 0xFF, 0xFF, 0xFF, - 0x97, 0x86, 0x78, 0x9F, 0xFF, 0xFF, 0xAF, 0xFF, 0xAF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xDF, 0xFF, 0xFC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xAF, - 0xF0, 0x00, 0x00, 0x00, - ], - [ - 0x77, 0x67, 0x76, 0x67, 0x77, 0x66, 0x66, 0x67, 0x77, 0x77, 0x66, 0x66, - 0x66, 0x66, 0x66, 0x67, 0x77, 0x77, 0x77, 0x77, 0x76, 0x66, 0x66, 0x66, - 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x67, 0x77, 0x77, 0x77, 0x77, - 0x77, 0x77, 0x77, 0x77, 0x76, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, - 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, - 0x66, 0x66, 0x66, 0x67, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, - 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, - 0x70, 0x00, 0x00, 0x00, - ], - [ - 0x77, 0x67, 0x76, 0x67, 0x77, 0x66, 0x66, 0x67, 0x77, 0x77, 0x66, 0x66, - 0x66, 0x66, 0x66, 0x67, 0x77, 0x77, 0x77, 0x77, 0x76, 0x66, 0x66, 0x66, - 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x67, 0x77, 0x77, 0x77, 0x77, - 0x77, 0x77, 0x77, 0x77, 0x76, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, - 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, - 0x66, 0x66, 0x66, 0x67, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, - 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, - 0x70, 0x00, 0x00, 0x00, - ], - [ - 0xEE, 0xDD, 0xDD, 0xDD, 0x5D, 0xDD, 0x4D, 0xDD, 0xDD, 0xD6, 0xDD, 0xD5, - 0xDD, 0xDD, 0x5D, 0xDD, 0x6D, 0xDD, 0xDD, 0xD5, 0xDD, 0xDD, 0xD6, 0xDD, - 0xDD, 0x6D, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xD6, 0xDD, 0xDD, 0xD6, - 0xD5, 0xDD, 0x5D, 0x6D, 0x55, 0xDD, 0x0D, 0x55, 0x65, 0xDD, 0x5D, 0xDD, - 0x66, 0xDD, 0xDD, 0xDD, 0xDD, 0xD5, 0xD5, 0x5D, 0x5D, 0xD6, 0xDD, 0xDD, - 0xDD, 0xDD, 0xD6, 0xD5, 0x6D, 0x6D, 0x6D, 0xD4, 0x6D, 0xDD, 0xDD, 0xDD, - 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0x55, 0xD6, 0xDD, 0xDE, - 0xE0, 0x00, 0x00, 0x00, - ], - [ - 0x9B, 0x9B, 0xA9, 0x9B, 0xAC, 0xCC, 0xFA, 0xBA, 0xBB, 0xA9, 0xAA, 0xBF, - 0xFF, 0xAA, 0xAA, 0x98, 0x88, 0x88, 0xAD, 0xF9, 0x99, 0x88, 0x76, 0x66, - 0x79, 0xAA, 0x99, 0x98, 0x75, 0x54, 0x56, 0x8F, 0xFA, 0xA9, 0x75, 0x43, - 0x34, 0x68, 0xAB, 0xBA, 0x86, 0x53, 0x33, 0x56, 0x8A, 0xBC, 0xB8, 0x64, - 0x33, 0x45, 0x79, 0xAC, 0xCB, 0x86, 0x54, 0x55, 0x67, 0x8A, 0xAC, 0xCA, - 0x76, 0x67, 0x78, 0x89, 0xBB, 0xFF, 0xB9, 0x78, 0x88, 0x9A, 0xBB, 0x9F, - 0xFD, 0xF9, 0xAB, 0x9A, 0xAB, 0xAA, 0xFF, 0xFC, 0xFA, 0xAB, 0x99, 0xAA, - 0x80, 0x00, 0x00, 0x00, - ], - [ - 0xCC, 0xBC, 0xBB, 0xBC, 0xBB, 0xBB, 0xBB, 0xBC, 0xCB, 0xBB, 0xBB, 0xBB, - 0xBB, 0xBB, 0xBB, 0xBC, 0xCB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xB4, 0xBB, - 0xBB, 0xBB, 0xBB, 0xB4, 0x44, 0xB4, 0x2B, 0xBC, 0xCC, 0xCB, 0xBB, 0x33, - 0x4B, 0xBB, 0xBB, 0xBB, 0xB4, 0xBB, 0x44, 0x3B, 0xBB, 0xBB, 0xBB, 0xBB, - 0xB3, 0xB4, 0xBB, 0xBB, 0xBB, 0xBB, 0xB4, 0x44, 0x3B, 0xBB, 0xBB, 0xBB, - 0xB4, 0xB3, 0xBB, 0xBC, 0xCC, 0xCC, 0xCC, 0xCB, 0xB4, 0xBB, 0xBB, 0xBB, - 0xBB, 0xBB, 0xBB, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCB, 0xCC, 0xCC, - 0xC0, 0x00, 0x00, 0x00, - ], - [ - 0x77, 0x67, 0x76, 0x67, 0x77, 0x66, 0x66, 0x67, 0x77, 0x77, 0x66, 0x66, - 0x66, 0x66, 0x66, 0x67, 0x77, 0x77, 0x77, 0x77, 0x76, 0x66, 0x66, 0x66, - 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x67, 0x77, 0x77, 0x77, 0x77, - 0x77, 0x77, 0x77, 0x77, 0x76, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, - 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, - 0x66, 0x66, 0x66, 0x67, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, - 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, - 0x70, 0x00, 0x00, 0x00, - ], - ], -]; - -const RALF_LONG_CODES_TAB: [[[u8; 224]; 125]; 3] = [ - [ - [ - 0xBE, 0xED, 0xDD, 0xDD, 0xDD, 0xDD, 0xFF, 0xFF, 0xFF, 0xFF, 0xBF, 0xFF, - 0xFE, 0xED, 0xDD, 0xCC, 0xDE, 0xEF, 0xFF, 0xFF, 0xFF, 0xFE, 0xED, 0xDC, - 0xCB, 0xCB, 0xBB, 0xCC, 0xDE, 0xEF, 0xFF, 0xFE, 0xED, 0xDC, 0xBB, 0xAA, - 0xAA, 0xAA, 0xBB, 0xDD, 0xFF, 0xFF, 0xFE, 0xDC, 0xBB, 0xA9, 0x99, 0x99, - 0x99, 0xAB, 0xCD, 0xEF, 0xFE, 0xEC, 0xCB, 0xA9, 0x88, 0x87, 0x78, 0x89, - 0xAB, 0xCD, 0xFF, 0xFE, 0xCB, 0xA9, 0x87, 0x77, 0x66, 0x77, 0x89, 0xAB, - 0xDE, 0xFD, 0xDC, 0xAA, 0x87, 0x76, 0x65, 0x66, 0x67, 0x89, 0xBC, 0xEF, - 0xDD, 0xBA, 0x98, 0x76, 0x55, 0x55, 0x56, 0x78, 0x9A, 0xCD, 0xED, 0xDC, - 0xA9, 0x87, 0x65, 0x54, 0x45, 0x56, 0x79, 0xAC, 0xDD, 0xDD, 0xCA, 0x98, - 0x65, 0x54, 0x44, 0x55, 0x67, 0x9A, 0xBD, 0xDE, 0xEB, 0xA9, 0x87, 0x65, - 0x44, 0x55, 0x66, 0x89, 0xAB, 0xDD, 0xED, 0xCA, 0x98, 0x76, 0x55, 0x55, - 0x56, 0x78, 0x9A, 0xCC, 0xDE, 0xFC, 0xBA, 0x87, 0x76, 0x65, 0x66, 0x77, - 0x89, 0xBB, 0xDD, 0xFE, 0xDB, 0xA9, 0x87, 0x76, 0x67, 0x77, 0x89, 0xAB, - 0xCD, 0xDF, 0xEF, 0xCB, 0xA9, 0x88, 0x87, 0x88, 0x89, 0xAB, 0xCC, 0xED, - 0xFF, 0xED, 0xCB, 0xA9, 0x99, 0x99, 0x99, 0xAA, 0xBC, 0xDE, 0xEF, 0xFF, - 0xFD, 0xDB, 0xBA, 0xAA, 0xAA, 0xAB, 0xCC, 0xDE, 0xFD, 0xFF, 0xFF, 0xFD, - 0xDC, 0xCC, 0xBC, 0xCC, 0xDC, 0xDE, 0xEF, 0xEF, 0xFF, 0xFF, 0xFF, 0xDE, - 0xDD, 0xCD, 0xDD, 0xEE, 0xFF, 0xFE, 0xDF, 0xFF, 0xFF, 0xEF, 0xDD, 0xDD, - 0xDD, 0xDD, 0xDD, 0xFD, 0xB0, 0x00, 0x00, 0x00, - ], - [ - 0xBD, 0xCD, 0xCC, 0xCC, 0xCC, 0xCC, 0xCD, 0xEF, 0xFF, 0xFF, 0xCF, 0xFE, - 0xDC, 0xDC, 0xCC, 0xBB, 0xCC, 0xCC, 0xDE, 0xEF, 0xFF, 0xEE, 0xDD, 0xCC, - 0xCB, 0xBA, 0xAA, 0xBB, 0xBC, 0xDD, 0xFF, 0xDC, 0xDD, 0xCB, 0xBA, 0xA9, - 0x99, 0x9A, 0x9A, 0xBC, 0xDF, 0xFF, 0xBD, 0xDB, 0xBA, 0x99, 0x88, 0x88, - 0x88, 0x9A, 0xBC, 0xEF, 0xDD, 0xCC, 0xBA, 0x98, 0x87, 0x77, 0x77, 0x89, - 0x9A, 0xBC, 0xDD, 0xCC, 0xBA, 0x98, 0x87, 0x76, 0x66, 0x67, 0x78, 0x9A, - 0xCC, 0xDC, 0xCB, 0xA9, 0x87, 0x66, 0x65, 0x66, 0x67, 0x88, 0xAB, 0xCC, - 0xCC, 0xA9, 0x87, 0x66, 0x55, 0x55, 0x56, 0x67, 0x89, 0xBC, 0xCC, 0xCA, - 0x98, 0x76, 0x65, 0x55, 0x55, 0x66, 0x78, 0x9A, 0xCC, 0xBB, 0xA9, 0x87, - 0x66, 0x55, 0x55, 0x56, 0x67, 0x89, 0xAC, 0xBC, 0xCA, 0x98, 0x76, 0x65, - 0x55, 0x55, 0x66, 0x78, 0x9A, 0xBC, 0xCC, 0xB9, 0x87, 0x66, 0x55, 0x55, - 0x56, 0x77, 0x89, 0xAB, 0xCD, 0xCB, 0xA9, 0x87, 0x66, 0x66, 0x66, 0x67, - 0x89, 0xAB, 0xBD, 0xDF, 0xCA, 0x98, 0x87, 0x76, 0x66, 0x77, 0x89, 0x9A, - 0xBC, 0xCF, 0xDD, 0xAA, 0x98, 0x87, 0x77, 0x77, 0x88, 0x9A, 0xBC, 0xDD, - 0xFF, 0xDC, 0xBA, 0x99, 0x88, 0x88, 0x89, 0x9A, 0xAB, 0xBC, 0xDF, 0xFF, - 0xDC, 0xBA, 0xAA, 0x99, 0x99, 0xAA, 0xBB, 0xCC, 0xDD, 0xFF, 0xFF, 0xEC, - 0xBB, 0xBA, 0xAA, 0xAB, 0xBB, 0xDC, 0xDF, 0xDF, 0xFF, 0xFD, 0xEE, 0xCC, - 0xBC, 0xBB, 0xCC, 0xDD, 0xCE, 0xFE, 0xCF, 0xFF, 0xDD, 0xDD, 0xCD, 0xDC, - 0xCB, 0xBD, 0xCD, 0xDD, 0xB0, 0x00, 0x00, 0x00, - ], - [ - 0xBD, 0xDD, 0xCC, 0xCC, 0xCC, 0xCC, 0xCD, 0xDD, 0xEF, 0xFF, 0xDD, 0xEE, - 0xDD, 0xCD, 0xCC, 0xCC, 0xCC, 0xCD, 0xDF, 0xFF, 0xFF, 0xDE, 0xDD, 0xCC, - 0xBB, 0xBB, 0xBA, 0xBB, 0xCD, 0xDE, 0xFF, 0xFD, 0xDD, 0xCC, 0xBA, 0xAA, - 0x99, 0x9A, 0xAA, 0xBC, 0xDE, 0xFF, 0xCD, 0xCB, 0xBA, 0x99, 0x98, 0x88, - 0x89, 0x9A, 0xBC, 0xDF, 0xED, 0xCC, 0xBA, 0x98, 0x88, 0x77, 0x77, 0x88, - 0x9A, 0xBC, 0xDE, 0xCC, 0xBA, 0x99, 0x87, 0x76, 0x66, 0x67, 0x78, 0x9A, - 0xCD, 0xDC, 0xCB, 0xA9, 0x87, 0x76, 0x65, 0x56, 0x67, 0x89, 0xAB, 0xCC, - 0xCC, 0xBA, 0x98, 0x76, 0x55, 0x55, 0x56, 0x67, 0x89, 0xBC, 0xCC, 0xCA, - 0x98, 0x76, 0x65, 0x55, 0x55, 0x56, 0x78, 0x9A, 0xCC, 0xCC, 0xB9, 0x87, - 0x65, 0x55, 0x45, 0x56, 0x67, 0x89, 0xAC, 0xCC, 0xCB, 0x98, 0x76, 0x65, - 0x55, 0x55, 0x66, 0x78, 0x9B, 0xCC, 0xCC, 0xBA, 0x87, 0x76, 0x55, 0x55, - 0x56, 0x78, 0x99, 0xBC, 0xCD, 0xCB, 0xA9, 0x87, 0x66, 0x66, 0x66, 0x77, - 0x89, 0xAB, 0xCC, 0xDD, 0xCB, 0x98, 0x87, 0x76, 0x66, 0x77, 0x89, 0x9B, - 0xBC, 0xCE, 0xED, 0xBA, 0x98, 0x87, 0x77, 0x78, 0x89, 0x9A, 0xBC, 0xDC, - 0xEE, 0xDC, 0xBA, 0x99, 0x88, 0x88, 0x99, 0x9A, 0xBC, 0xCD, 0xCF, 0xFE, - 0xDD, 0xBB, 0xAA, 0x99, 0x9A, 0xAA, 0xBC, 0xCC, 0xDC, 0xFF, 0xFE, 0xDC, - 0xCB, 0xBB, 0xBB, 0xBB, 0xBC, 0xCD, 0xDE, 0xDF, 0xFF, 0xFF, 0xED, 0xCC, - 0xCC, 0xCC, 0xCC, 0xDD, 0xDE, 0xFD, 0xDF, 0xFF, 0xED, 0xDD, 0xDC, 0xCC, - 0xCC, 0xCC, 0xCC, 0xDD, 0xB0, 0x00, 0x00, 0x00, - ], - [ - 0xBD, 0xCD, 0xDC, 0xCC, 0xCC, 0xCC, 0xCD, 0xDF, 0xFF, 0xFF, 0xDD, 0xFF, - 0xDF, 0xEC, 0xCC, 0xDC, 0xCD, 0xDD, 0xDF, 0xFF, 0xFF, 0xEE, 0xCC, 0xCC, - 0xBB, 0xBB, 0xBB, 0xAC, 0xCC, 0xEF, 0xEF, 0xFD, 0xDD, 0xCC, 0xBB, 0xAA, - 0x99, 0x9A, 0xAB, 0xBC, 0xDF, 0xFF, 0xDD, 0xCB, 0xBA, 0x99, 0x98, 0x88, - 0x89, 0x9A, 0xBC, 0xDD, 0xFC, 0xDB, 0xBA, 0xA9, 0x88, 0x77, 0x77, 0x88, - 0x9A, 0xBC, 0xED, 0xBC, 0xBA, 0xA9, 0x87, 0x76, 0x66, 0x67, 0x88, 0x9A, - 0xBD, 0xDD, 0xCB, 0xA9, 0x87, 0x66, 0x65, 0x56, 0x67, 0x89, 0xAC, 0xCE, - 0xCC, 0xBA, 0x98, 0x76, 0x55, 0x55, 0x56, 0x67, 0x8A, 0xBC, 0xDC, 0xDB, - 0xA9, 0x76, 0x65, 0x55, 0x55, 0x56, 0x78, 0xAA, 0xCC, 0xCC, 0xB9, 0x87, - 0x66, 0x55, 0x45, 0x55, 0x67, 0x89, 0xBC, 0xCC, 0xDB, 0xA8, 0x76, 0x65, - 0x55, 0x55, 0x66, 0x78, 0x9B, 0xCC, 0xCC, 0xBA, 0x97, 0x66, 0x55, 0x55, - 0x56, 0x78, 0x9A, 0xBC, 0xCF, 0xDC, 0xA9, 0x87, 0x66, 0x65, 0x66, 0x77, - 0x89, 0xAB, 0xCC, 0xFD, 0xCB, 0xA8, 0x87, 0x76, 0x66, 0x77, 0x89, 0xAB, - 0xBC, 0xCF, 0xFD, 0xCB, 0x99, 0x87, 0x77, 0x78, 0x89, 0xAA, 0xCC, 0xCC, - 0xFF, 0xDC, 0xBA, 0xA9, 0x98, 0x88, 0x99, 0x9A, 0xBC, 0xDD, 0xCF, 0xFE, - 0xDD, 0xBB, 0xAA, 0xA9, 0xAA, 0xAA, 0xBB, 0xBD, 0xDC, 0xFF, 0xFF, 0xDD, - 0xBC, 0xBB, 0xBB, 0xBB, 0xCC, 0xCD, 0xFE, 0xCF, 0xFF, 0xFD, 0xFD, 0xDD, - 0xDC, 0xCC, 0xCC, 0xDD, 0xDE, 0xFE, 0xCF, 0xFF, 0xDD, 0xCD, 0xDD, 0xCC, - 0xCD, 0xCC, 0xCD, 0xCD, 0xB0, 0x00, 0x00, 0x00, - ], - [ - 0xBF, 0xEE, 0xDD, 0xDD, 0xCD, 0xDD, 0xDD, 0xEF, 0xFF, 0xFF, 0xDE, 0xFF, - 0xFD, 0xED, 0xDD, 0xCC, 0xDD, 0xEF, 0xFF, 0xFF, 0xFF, 0xFE, 0xEF, 0xDD, - 0xCC, 0xCB, 0xBB, 0xCC, 0xDE, 0xFF, 0xFF, 0xFE, 0xFD, 0xDC, 0xBB, 0xAA, - 0xAA, 0xAA, 0xBB, 0xCD, 0xDF, 0xFF, 0xFF, 0xDC, 0xBA, 0xA9, 0x99, 0x89, - 0x99, 0xAB, 0xCD, 0xFF, 0xFD, 0xDD, 0xCA, 0xA9, 0x88, 0x87, 0x78, 0x89, - 0xAB, 0xCD, 0xFF, 0xDE, 0xCB, 0xA9, 0x87, 0x76, 0x66, 0x77, 0x89, 0xAB, - 0xDF, 0xFE, 0xDC, 0xA9, 0x87, 0x76, 0x65, 0x56, 0x67, 0x89, 0xAC, 0xEF, - 0xED, 0xCA, 0x98, 0x76, 0x55, 0x55, 0x56, 0x78, 0x9A, 0xCD, 0xED, 0xDB, - 0xA9, 0x76, 0x65, 0x54, 0x55, 0x56, 0x79, 0xAB, 0xCE, 0xDD, 0xBA, 0x87, - 0x66, 0x54, 0x44, 0x55, 0x67, 0x9A, 0xBD, 0xDD, 0xDB, 0xA9, 0x86, 0x65, - 0x54, 0x55, 0x66, 0x79, 0xAB, 0xCD, 0xDD, 0xCA, 0x98, 0x76, 0x55, 0x55, - 0x56, 0x78, 0x9A, 0xCD, 0xDF, 0xFC, 0xB9, 0x87, 0x66, 0x65, 0x66, 0x77, - 0x89, 0xBC, 0xDD, 0xFF, 0xDC, 0xA9, 0x87, 0x76, 0x66, 0x77, 0x89, 0xAB, - 0xCD, 0xDF, 0xFF, 0xCB, 0xA9, 0x88, 0x87, 0x78, 0x89, 0xAB, 0xBC, 0xED, - 0xFF, 0xFD, 0xCB, 0xA9, 0x99, 0x99, 0x99, 0xAB, 0xBC, 0xDF, 0xEF, 0xFF, - 0xED, 0xCB, 0xBA, 0xAA, 0xAA, 0xAB, 0xCC, 0xCD, 0xED, 0xFF, 0xFF, 0xFD, - 0xDC, 0xCB, 0xBC, 0xCC, 0xCD, 0xDE, 0xEF, 0xEF, 0xFF, 0xFF, 0xFF, 0xED, - 0xDE, 0xDD, 0xDE, 0xDD, 0xDF, 0xFF, 0xBF, 0xFF, 0xEF, 0xDF, 0xED, 0xDC, - 0xDD, 0xDD, 0xDE, 0xED, 0xB0, 0x00, 0x00, 0x00, - ], - [ - 0xAC, 0xCB, 0xBA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAB, 0xBC, 0xCD, 0xBC, 0xDC, - 0xCC, 0xBB, 0xAA, 0xAA, 0xAA, 0xAB, 0xBB, 0xCD, 0xDD, 0xBC, 0xCB, 0xBA, - 0xA9, 0x99, 0x99, 0x99, 0xAA, 0xAB, 0xCD, 0xDB, 0xCB, 0xAA, 0xA9, 0x98, - 0x88, 0x88, 0x99, 0x9A, 0xBB, 0xCC, 0xBB, 0xBA, 0x99, 0x88, 0x88, 0x88, - 0x88, 0x89, 0x9A, 0xBB, 0xBA, 0xBA, 0x99, 0x88, 0x77, 0x77, 0x77, 0x78, - 0x89, 0x9A, 0xBB, 0xAB, 0xA9, 0x88, 0x77, 0x76, 0x66, 0x67, 0x78, 0x89, - 0xAB, 0xAA, 0xA9, 0x98, 0x77, 0x76, 0x66, 0x66, 0x67, 0x78, 0x99, 0xAA, - 0xAA, 0x98, 0x87, 0x76, 0x66, 0x66, 0x66, 0x67, 0x88, 0x9A, 0xAA, 0xA9, - 0x88, 0x76, 0x66, 0x55, 0x56, 0x66, 0x78, 0x89, 0xAA, 0xAA, 0x98, 0x87, - 0x66, 0x65, 0x55, 0x56, 0x67, 0x88, 0x9A, 0xAA, 0xA9, 0x88, 0x76, 0x66, - 0x55, 0x56, 0x66, 0x78, 0x89, 0xAA, 0xAA, 0x98, 0x87, 0x76, 0x66, 0x66, - 0x66, 0x77, 0x88, 0x9A, 0xAA, 0xA9, 0x98, 0x77, 0x66, 0x66, 0x66, 0x77, - 0x78, 0x99, 0xAA, 0xBA, 0xA9, 0x88, 0x77, 0x76, 0x66, 0x77, 0x78, 0x89, - 0xAB, 0xAB, 0xBA, 0x99, 0x88, 0x77, 0x77, 0x77, 0x88, 0x89, 0xAA, 0xBA, - 0xBC, 0xBA, 0x99, 0x88, 0x88, 0x88, 0x88, 0x89, 0x9A, 0xAB, 0xBC, 0xCB, - 0xBA, 0x99, 0x98, 0x88, 0x89, 0x99, 0x9A, 0xAB, 0xCB, 0xCC, 0xCB, 0xBA, - 0xA9, 0x99, 0x99, 0x99, 0xAA, 0xBB, 0xCC, 0xBD, 0xDD, 0xCB, 0xBB, 0xAA, - 0xAA, 0xAA, 0xAB, 0xBB, 0xCC, 0xDC, 0xBD, 0xCC, 0xBB, 0xAA, 0xAA, 0xAA, - 0xAA, 0xAB, 0xBB, 0xCC, 0xA0, 0x00, 0x00, 0x00, - ], - [ - 0x9B, 0xBB, 0xAA, 0xAA, 0x9A, 0x9A, 0xAA, 0xAB, 0xBB, 0xCD, 0xBB, 0xCC, - 0xBB, 0xBA, 0xAA, 0xAA, 0xAA, 0xAA, 0xBB, 0xCD, 0xDC, 0xBC, 0xBB, 0xAA, - 0x99, 0x99, 0x99, 0x99, 0x9A, 0xBB, 0xCD, 0xCA, 0xBB, 0xAA, 0x99, 0x98, - 0x88, 0x88, 0x99, 0x9A, 0xAB, 0xCB, 0xAB, 0xAA, 0x99, 0x88, 0x88, 0x77, - 0x88, 0x89, 0x9A, 0xAB, 0xBA, 0xBA, 0x99, 0x88, 0x77, 0x77, 0x77, 0x78, - 0x89, 0x9A, 0xBA, 0xAA, 0xA9, 0x88, 0x77, 0x76, 0x66, 0x67, 0x78, 0x89, - 0xAA, 0xAA, 0xA9, 0x98, 0x77, 0x76, 0x66, 0x66, 0x67, 0x78, 0x89, 0xAA, - 0xAA, 0x98, 0x87, 0x76, 0x66, 0x66, 0x66, 0x67, 0x88, 0x9A, 0xA9, 0xA9, - 0x88, 0x76, 0x66, 0x65, 0x66, 0x66, 0x77, 0x89, 0xAA, 0xAA, 0x98, 0x77, - 0x66, 0x65, 0x55, 0x66, 0x67, 0x78, 0x9A, 0x99, 0xA9, 0x88, 0x76, 0x66, - 0x65, 0x66, 0x66, 0x78, 0x89, 0xA9, 0xAA, 0x98, 0x87, 0x76, 0x66, 0x66, - 0x66, 0x77, 0x88, 0x9A, 0xAA, 0xA9, 0x88, 0x77, 0x66, 0x66, 0x66, 0x77, - 0x78, 0x89, 0xAA, 0xAB, 0xA9, 0x88, 0x77, 0x66, 0x66, 0x77, 0x78, 0x89, - 0xAA, 0xAB, 0xBA, 0x99, 0x88, 0x77, 0x77, 0x77, 0x78, 0x89, 0x9A, 0xAA, - 0xBB, 0xBA, 0x99, 0x88, 0x87, 0x78, 0x88, 0x89, 0x9A, 0xAB, 0xAB, 0xCB, - 0xAA, 0x99, 0x98, 0x88, 0x88, 0x99, 0x9A, 0xAB, 0xBA, 0xCC, 0xCB, 0xAA, - 0xA9, 0x99, 0x99, 0x99, 0x9A, 0xAB, 0xBC, 0xBD, 0xDC, 0xCC, 0xBA, 0xAA, - 0xAA, 0xAA, 0xAA, 0xBB, 0xBC, 0xDB, 0xBD, 0xCC, 0xBA, 0xAA, 0xA9, 0x99, - 0xAA, 0xAA, 0xAB, 0xBB, 0x90, 0x00, 0x00, 0x00, - ], - [ - 0x9B, 0xBB, 0xAA, 0xA9, 0x99, 0x99, 0x9A, 0xAA, 0xBB, 0xCC, 0xBB, 0xDC, - 0xBB, 0xAA, 0xAA, 0x99, 0x9A, 0xAA, 0xBB, 0xBC, 0xDD, 0xBC, 0xBB, 0xAA, - 0x99, 0x99, 0x99, 0x99, 0x9A, 0xAB, 0xBC, 0xCB, 0xBB, 0xAA, 0x99, 0x88, - 0x88, 0x88, 0x89, 0x99, 0xAB, 0xBB, 0xAB, 0xAA, 0x99, 0x88, 0x87, 0x77, - 0x78, 0x88, 0x99, 0xAB, 0xBA, 0xAA, 0x99, 0x88, 0x77, 0x77, 0x77, 0x77, - 0x88, 0x9A, 0xAA, 0xAA, 0x99, 0x88, 0x77, 0x76, 0x66, 0x67, 0x77, 0x89, - 0x9A, 0xAA, 0xA9, 0x88, 0x77, 0x76, 0x66, 0x66, 0x67, 0x78, 0x89, 0xAA, - 0x9A, 0x98, 0x87, 0x76, 0x66, 0x66, 0x66, 0x77, 0x78, 0x99, 0x99, 0x99, - 0x87, 0x76, 0x66, 0x66, 0x66, 0x66, 0x77, 0x89, 0x99, 0x99, 0x98, 0x77, - 0x66, 0x66, 0x66, 0x66, 0x67, 0x78, 0x99, 0x99, 0xA9, 0x87, 0x76, 0x66, - 0x66, 0x66, 0x66, 0x77, 0x89, 0x99, 0x9A, 0x98, 0x87, 0x76, 0x66, 0x66, - 0x66, 0x77, 0x88, 0x9A, 0x9A, 0xA9, 0x88, 0x77, 0x66, 0x66, 0x66, 0x77, - 0x78, 0x89, 0xA9, 0xAA, 0x99, 0x88, 0x77, 0x76, 0x66, 0x77, 0x78, 0x89, - 0x9A, 0xAA, 0xAA, 0x98, 0x87, 0x77, 0x77, 0x77, 0x78, 0x89, 0x9A, 0xBA, - 0xBB, 0xAA, 0x98, 0x88, 0x87, 0x77, 0x88, 0x89, 0x9A, 0xAB, 0xAB, 0xBB, - 0xA9, 0x99, 0x88, 0x88, 0x88, 0x89, 0x9A, 0xAB, 0xBB, 0xCC, 0xBB, 0xAA, - 0x99, 0x99, 0x99, 0x99, 0x9A, 0xAB, 0xBC, 0xBC, 0xDC, 0xBB, 0xBA, 0xAA, - 0x99, 0xAA, 0xAA, 0xBB, 0xBC, 0xCB, 0xBC, 0xCB, 0xBA, 0xAA, 0x99, 0x99, - 0x99, 0xAA, 0xAA, 0xBB, 0xA0, 0x00, 0x00, 0x00, - ], - [ - 0x9B, 0xBB, 0xAA, 0xA9, 0x99, 0x99, 0xAA, 0xAB, 0xBB, 0xCD, 0xBB, 0xCC, - 0xCB, 0xBA, 0xAA, 0xAA, 0xAA, 0xAA, 0xBB, 0xBC, 0xDC, 0xBC, 0xBB, 0xAA, - 0xA9, 0x99, 0x99, 0x99, 0x9A, 0xBB, 0xBC, 0xCB, 0xBB, 0xAA, 0x99, 0x98, - 0x88, 0x88, 0x89, 0x9A, 0xAB, 0xCB, 0xAB, 0xAA, 0x99, 0x88, 0x88, 0x78, - 0x88, 0x88, 0x9A, 0xAB, 0xBA, 0xBA, 0x99, 0x88, 0x77, 0x77, 0x77, 0x78, - 0x89, 0x9A, 0xBB, 0xAA, 0xA9, 0x88, 0x77, 0x77, 0x66, 0x77, 0x78, 0x89, - 0x9A, 0xAA, 0xA9, 0x98, 0x77, 0x76, 0x66, 0x66, 0x67, 0x78, 0x89, 0xAA, - 0xAA, 0x98, 0x87, 0x76, 0x66, 0x66, 0x66, 0x67, 0x88, 0x9A, 0x99, 0xA9, - 0x88, 0x76, 0x66, 0x65, 0x66, 0x66, 0x77, 0x89, 0xA9, 0x9A, 0x98, 0x77, - 0x66, 0x65, 0x55, 0x66, 0x67, 0x88, 0x9A, 0x99, 0xA9, 0x88, 0x76, 0x66, - 0x55, 0x66, 0x66, 0x78, 0x89, 0xA9, 0xAA, 0x98, 0x87, 0x76, 0x66, 0x66, - 0x66, 0x77, 0x88, 0x9A, 0x9A, 0xA9, 0x88, 0x77, 0x66, 0x66, 0x66, 0x77, - 0x78, 0x99, 0xAA, 0xAA, 0xA9, 0x88, 0x77, 0x76, 0x66, 0x77, 0x78, 0x89, - 0xAA, 0xAA, 0xBA, 0x99, 0x88, 0x77, 0x77, 0x77, 0x78, 0x89, 0x9A, 0xBA, - 0xBB, 0xAA, 0x99, 0x88, 0x87, 0x77, 0x88, 0x89, 0x9A, 0xAB, 0xAB, 0xBB, - 0xAA, 0x99, 0x98, 0x88, 0x88, 0x99, 0x9A, 0xAB, 0xCB, 0xCD, 0xCB, 0xAA, - 0xA9, 0x99, 0x99, 0x99, 0x9A, 0xAB, 0xBC, 0xBD, 0xDC, 0xCB, 0xBA, 0xAA, - 0xAA, 0xAA, 0xAA, 0xBB, 0xBC, 0xDB, 0xBC, 0xCB, 0xBA, 0xAA, 0x9A, 0x99, - 0x99, 0xAA, 0xAA, 0xBB, 0x90, 0x00, 0x00, 0x00, - ], - [ - 0xAC, 0xBB, 0xBA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAB, 0xBC, 0xDD, 0xCC, 0xDC, - 0xCB, 0xBA, 0xAA, 0xAA, 0xAA, 0xAA, 0xBB, 0xCD, 0xED, 0xBC, 0xCB, 0xAA, - 0xA9, 0x99, 0x99, 0x99, 0xAA, 0xBB, 0xCD, 0xCB, 0xCB, 0xAA, 0x99, 0x98, - 0x88, 0x88, 0x99, 0x9A, 0xBB, 0xCC, 0xBB, 0xAA, 0x99, 0x88, 0x88, 0x78, - 0x88, 0x89, 0x9A, 0xBC, 0xBA, 0xBA, 0x99, 0x88, 0x77, 0x77, 0x77, 0x78, - 0x89, 0xAA, 0xBB, 0xAA, 0xA9, 0x88, 0x77, 0x76, 0x66, 0x77, 0x78, 0x89, - 0xAA, 0xBA, 0xA9, 0x98, 0x77, 0x66, 0x66, 0x66, 0x67, 0x78, 0x99, 0xAA, - 0xAA, 0x98, 0x87, 0x76, 0x66, 0x66, 0x66, 0x77, 0x88, 0x9A, 0xAA, 0xA9, - 0x88, 0x76, 0x66, 0x55, 0x56, 0x66, 0x78, 0x89, 0xAA, 0xAA, 0x98, 0x87, - 0x66, 0x65, 0x55, 0x66, 0x67, 0x88, 0x9A, 0xAA, 0xA9, 0x88, 0x76, 0x66, - 0x55, 0x56, 0x66, 0x78, 0x89, 0xAA, 0xAA, 0x98, 0x87, 0x76, 0x66, 0x66, - 0x66, 0x77, 0x88, 0x9A, 0xAA, 0xA9, 0x98, 0x77, 0x66, 0x66, 0x66, 0x67, - 0x78, 0x99, 0xAA, 0xAB, 0xA9, 0x88, 0x77, 0x76, 0x66, 0x77, 0x78, 0x89, - 0xAA, 0xAB, 0xBA, 0x99, 0x88, 0x77, 0x77, 0x77, 0x78, 0x89, 0x9A, 0xBA, - 0xBC, 0xBA, 0x99, 0x88, 0x88, 0x78, 0x88, 0x89, 0x9A, 0xBB, 0xBC, 0xCB, - 0xBA, 0xA9, 0x98, 0x88, 0x88, 0x99, 0x9A, 0xAB, 0xCB, 0xDD, 0xCB, 0xBA, - 0xA9, 0x99, 0x99, 0x99, 0xAA, 0xBB, 0xCC, 0xCD, 0xED, 0xCB, 0xBB, 0xAA, - 0xAA, 0xAA, 0xAB, 0xBB, 0xCC, 0xDC, 0xBD, 0xDC, 0xBB, 0xAA, 0xAA, 0xAA, - 0xAA, 0xAA, 0xBB, 0xBC, 0xA0, 0x00, 0x00, 0x00, - ], - [ - 0xBF, 0xEE, 0xDD, 0xDD, 0xDD, 0xDE, 0xEE, 0xFF, 0xFF, 0xFF, 0xBF, 0xFF, - 0xFE, 0xED, 0xDD, 0xDD, 0xDE, 0xFF, 0xFF, 0xFF, 0xFF, 0xEF, 0xFE, 0xDD, - 0xCC, 0xCB, 0xBC, 0xCD, 0xDE, 0xFF, 0xFF, 0xFE, 0xFE, 0xDC, 0xCB, 0xBA, - 0xAA, 0xAB, 0xBC, 0xDD, 0xFF, 0xFF, 0xEE, 0xDD, 0xBB, 0xA9, 0x99, 0x99, - 0x9A, 0xBC, 0xDE, 0xFF, 0xFD, 0xDC, 0xBB, 0xA9, 0x88, 0x77, 0x88, 0x99, - 0xAC, 0xDF, 0xFF, 0xDD, 0xCB, 0xA9, 0x87, 0x76, 0x66, 0x78, 0x8A, 0xBC, - 0xEF, 0xFD, 0xDC, 0xB9, 0x87, 0x66, 0x55, 0x56, 0x78, 0x9A, 0xCD, 0xFF, - 0xDD, 0xBA, 0x98, 0x76, 0x55, 0x45, 0x56, 0x78, 0xAB, 0xDE, 0xFD, 0xDB, - 0xA9, 0x76, 0x55, 0x44, 0x45, 0x67, 0x89, 0xBC, 0xEF, 0xED, 0xBA, 0x97, - 0x65, 0x44, 0x44, 0x56, 0x78, 0x9B, 0xCD, 0xEE, 0xDC, 0xA9, 0x86, 0x55, - 0x44, 0x55, 0x67, 0x89, 0xBC, 0xDD, 0xEE, 0xCB, 0x98, 0x76, 0x55, 0x55, - 0x66, 0x78, 0xAB, 0xCE, 0xEF, 0xFD, 0xBA, 0x98, 0x76, 0x66, 0x66, 0x78, - 0x9A, 0xCD, 0xEE, 0xFF, 0xDC, 0xBA, 0x88, 0x77, 0x77, 0x78, 0x9A, 0xBC, - 0xDF, 0xEF, 0xFF, 0xDC, 0xBA, 0x98, 0x88, 0x89, 0x9A, 0xBC, 0xCD, 0xEF, - 0xFF, 0xFE, 0xDC, 0xBA, 0xA9, 0x99, 0xAA, 0xBB, 0xCD, 0xEF, 0xEF, 0xFF, - 0xFE, 0xDC, 0xCB, 0xBB, 0xBB, 0xBC, 0xDD, 0xEF, 0xFE, 0xFF, 0xFF, 0xFE, - 0xDD, 0xDC, 0xCC, 0xCD, 0xDD, 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, - 0xEF, 0xEE, 0xEE, 0xFF, 0xFF, 0xFF, 0xCF, 0xFF, 0xFF, 0xFF, 0xFE, 0xED, - 0xDE, 0xEE, 0xEF, 0xEF, 0xB0, 0x00, 0x00, 0x00, - ], - [ - 0xAD, 0xCD, 0xCB, 0xBC, 0xCB, 0xCC, 0xCD, 0xDD, 0xDE, 0xEF, 0xBD, 0xDE, - 0xDD, 0xCC, 0xCC, 0xCC, 0xDC, 0xDD, 0xFF, 0xFF, 0xFF, 0xDD, 0xDD, 0xCB, - 0xBB, 0xBB, 0xBB, 0xBB, 0xDD, 0xEF, 0xEF, 0xDD, 0xDC, 0xCC, 0xBB, 0xAA, - 0xA9, 0xAA, 0xBB, 0xCC, 0xFF, 0xFE, 0xCD, 0xCC, 0xAA, 0x99, 0x98, 0x88, - 0x99, 0xAB, 0xCE, 0xFE, 0xCC, 0xCB, 0xBA, 0x98, 0x88, 0x77, 0x77, 0x89, - 0xAB, 0xCD, 0xFE, 0xCD, 0xBB, 0x99, 0x87, 0x76, 0x66, 0x77, 0x89, 0xAC, - 0xDE, 0xDC, 0xDB, 0xA9, 0x87, 0x66, 0x55, 0x56, 0x67, 0x8A, 0xBC, 0xFD, - 0xCC, 0xBA, 0x98, 0x76, 0x55, 0x55, 0x56, 0x78, 0x9B, 0xCD, 0xDC, 0xCB, - 0x99, 0x76, 0x55, 0x44, 0x45, 0x67, 0x89, 0xAB, 0xDD, 0xCC, 0xBA, 0x87, - 0x65, 0x54, 0x44, 0x56, 0x78, 0x9A, 0xCD, 0xDC, 0xCB, 0xA8, 0x76, 0x65, - 0x54, 0x55, 0x67, 0x89, 0xAB, 0xDC, 0xCD, 0xBA, 0x98, 0x76, 0x55, 0x55, - 0x66, 0x78, 0x9A, 0xBD, 0xCD, 0xEC, 0xB9, 0x87, 0x76, 0x66, 0x66, 0x78, - 0x9A, 0xBB, 0xDC, 0xDE, 0xCB, 0xA9, 0x87, 0x77, 0x77, 0x78, 0x89, 0xAB, - 0xCD, 0xCE, 0xFD, 0xCB, 0xA9, 0x98, 0x88, 0x88, 0x99, 0xAB, 0xCC, 0xDD, - 0xEF, 0xFD, 0xDB, 0xAA, 0x99, 0x99, 0x9A, 0xAB, 0xCC, 0xDD, 0xDF, 0xFD, - 0xFD, 0xCC, 0xBB, 0xAA, 0xAA, 0xBB, 0xBC, 0xDD, 0xFC, 0xEF, 0xEF, 0xED, - 0xDD, 0xCC, 0xBC, 0xBC, 0xCC, 0xED, 0xEE, 0xDF, 0xFF, 0xFF, 0xFD, 0xED, - 0xDC, 0xDC, 0xDD, 0xDD, 0xDD, 0xED, 0xBE, 0xDD, 0xDD, 0xDD, 0xDC, 0xDC, - 0xCD, 0xCC, 0xCC, 0xDD, 0xB0, 0x00, 0x00, 0x00, - ], - [ - 0xBD, 0xDD, 0xDC, 0xCC, 0xCC, 0xCC, 0xCD, 0xDD, 0xEF, 0xFF, 0xDD, 0xFE, - 0xDD, 0xCC, 0xCC, 0xCB, 0xCC, 0xDD, 0xDE, 0xFF, 0xFF, 0xDE, 0xDD, 0xCB, - 0xBA, 0xAA, 0xAA, 0xBB, 0xCD, 0xDE, 0xFF, 0xFD, 0xDD, 0xCB, 0xAA, 0xA9, - 0x99, 0x99, 0xAB, 0xBC, 0xEF, 0xFF, 0xCD, 0xCB, 0xAA, 0x98, 0x88, 0x88, - 0x89, 0x9A, 0xBC, 0xDE, 0xEC, 0xCB, 0xAA, 0x98, 0x87, 0x77, 0x77, 0x88, - 0x9A, 0xBC, 0xEE, 0xCC, 0xBA, 0x98, 0x77, 0x66, 0x66, 0x67, 0x89, 0xAB, - 0xCD, 0xEC, 0xCA, 0x99, 0x87, 0x66, 0x55, 0x56, 0x67, 0x89, 0xAB, 0xDD, - 0xCB, 0xA9, 0x87, 0x66, 0x55, 0x55, 0x56, 0x78, 0x9A, 0xBD, 0xDC, 0xBA, - 0x98, 0x76, 0x55, 0x55, 0x55, 0x66, 0x78, 0xAB, 0xCD, 0xCB, 0xA9, 0x87, - 0x65, 0x55, 0x45, 0x56, 0x67, 0x8A, 0xBC, 0xCC, 0xCA, 0x98, 0x76, 0x55, - 0x55, 0x55, 0x67, 0x79, 0xAB, 0xCC, 0xCC, 0xB9, 0x87, 0x76, 0x55, 0x55, - 0x66, 0x78, 0x9A, 0xBC, 0xDD, 0xCB, 0xA9, 0x87, 0x66, 0x66, 0x66, 0x77, - 0x89, 0xAB, 0xCC, 0xDD, 0xCB, 0x99, 0x87, 0x76, 0x67, 0x77, 0x89, 0xAB, - 0xCD, 0xDE, 0xDD, 0xBA, 0x99, 0x88, 0x77, 0x88, 0x89, 0xAA, 0xBC, 0xDD, - 0xEF, 0xDC, 0xBA, 0xA9, 0x98, 0x88, 0x99, 0xAA, 0xBC, 0xDD, 0xDF, 0xFF, - 0xDC, 0xCB, 0xAA, 0xAA, 0xAA, 0xAB, 0xBC, 0xCD, 0xED, 0xFF, 0xFE, 0xDC, - 0xCC, 0xBB, 0xBB, 0xBB, 0xCC, 0xCD, 0xEF, 0xEF, 0xFF, 0xFF, 0xED, 0xDC, - 0xCC, 0xCC, 0xCD, 0xDE, 0xEE, 0xFE, 0xDF, 0xFF, 0xFE, 0xED, 0xDD, 0xDC, - 0xCD, 0xDD, 0xDD, 0xEE, 0xC0, 0x00, 0x00, 0x00, - ], - [ - 0xBE, 0xDD, 0xCC, 0xCC, 0xCC, 0xCC, 0xCD, 0xDD, 0xEF, 0xEF, 0xCD, 0xFD, - 0xED, 0xCC, 0xCC, 0xCC, 0xCC, 0xDD, 0xEE, 0xFF, 0xFF, 0xDE, 0xDC, 0xCB, - 0xBB, 0xBA, 0xAB, 0xBB, 0xCC, 0xDD, 0xFF, 0xFD, 0xDD, 0xCB, 0xAA, 0xA9, - 0x99, 0x9A, 0xAB, 0xBC, 0xDE, 0xFE, 0xCD, 0xCB, 0xBA, 0x99, 0x88, 0x88, - 0x89, 0xAA, 0xBD, 0xEF, 0xDC, 0xDC, 0xAA, 0x98, 0x87, 0x77, 0x77, 0x89, - 0x9A, 0xCD, 0xFD, 0xCC, 0xBA, 0x98, 0x77, 0x66, 0x66, 0x77, 0x89, 0xAB, - 0xCD, 0xDC, 0xCB, 0xA9, 0x87, 0x66, 0x55, 0x56, 0x67, 0x89, 0xAC, 0xDD, - 0xCC, 0xB9, 0x87, 0x66, 0x55, 0x55, 0x56, 0x78, 0x9A, 0xBD, 0xCC, 0xCA, - 0x98, 0x76, 0x55, 0x54, 0x55, 0x67, 0x79, 0xAB, 0xDD, 0xCB, 0xA9, 0x87, - 0x65, 0x54, 0x45, 0x56, 0x67, 0x8A, 0xBC, 0xCC, 0xCB, 0x98, 0x76, 0x55, - 0x55, 0x55, 0x67, 0x89, 0xAB, 0xCC, 0xCC, 0xBA, 0x97, 0x76, 0x55, 0x55, - 0x66, 0x78, 0x9A, 0xBC, 0xCD, 0xDB, 0xA9, 0x87, 0x66, 0x66, 0x66, 0x77, - 0x89, 0xAB, 0xDC, 0xDD, 0xCB, 0xA9, 0x87, 0x77, 0x77, 0x78, 0x89, 0xAB, - 0xCD, 0xDD, 0xED, 0xBA, 0xA9, 0x88, 0x77, 0x88, 0x89, 0x9B, 0xBC, 0xDD, - 0xDE, 0xDC, 0xBB, 0xA9, 0x99, 0x99, 0x99, 0xAB, 0xBC, 0xCE, 0xCF, 0xFE, - 0xDC, 0xCB, 0xAA, 0xAA, 0xAA, 0xAB, 0xBC, 0xDD, 0xED, 0xFF, 0xEE, 0xED, - 0xCB, 0xBB, 0xBB, 0xBB, 0xCC, 0xCE, 0xEE, 0xDF, 0xFF, 0xFF, 0xED, 0xDD, - 0xDC, 0xCC, 0xCD, 0xDD, 0xFE, 0xFE, 0xBF, 0xFE, 0xDD, 0xDD, 0xCD, 0xCC, - 0xDD, 0xCC, 0xDD, 0xEE, 0xB0, 0x00, 0x00, 0x00, - ], - [ - 0xBF, 0xFF, 0xFE, 0xEE, 0xEE, 0xDE, 0xFF, 0xFF, 0xFF, 0xFF, 0xCF, 0xFF, - 0xFF, 0xEE, 0xDD, 0xDD, 0xEE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xED, - 0xCC, 0xCB, 0xCC, 0xCD, 0xDF, 0xFF, 0xFF, 0xFF, 0xFE, 0xDC, 0xCB, 0xBA, - 0xAA, 0xAB, 0xBC, 0xDF, 0xFF, 0xFF, 0xEE, 0xDC, 0xBB, 0xA9, 0x99, 0x99, - 0x9A, 0xBC, 0xDF, 0xFF, 0xFE, 0xED, 0xCB, 0xA9, 0x88, 0x77, 0x88, 0x9A, - 0xBC, 0xDF, 0xFF, 0xEE, 0xCB, 0xA9, 0x87, 0x76, 0x66, 0x78, 0x8A, 0xBC, - 0xEF, 0xFD, 0xDC, 0xB9, 0x87, 0x66, 0x55, 0x56, 0x78, 0x9A, 0xCD, 0xFF, - 0xDD, 0xCA, 0x98, 0x76, 0x55, 0x45, 0x56, 0x78, 0xAB, 0xDF, 0xFE, 0xDC, - 0xA9, 0x76, 0x55, 0x44, 0x45, 0x67, 0x89, 0xBC, 0xEF, 0xED, 0xCA, 0x97, - 0x65, 0x44, 0x44, 0x56, 0x78, 0x9B, 0xCE, 0xEE, 0xDC, 0xA9, 0x76, 0x55, - 0x44, 0x55, 0x67, 0x89, 0xBC, 0xEE, 0xEE, 0xCB, 0x98, 0x76, 0x55, 0x55, - 0x66, 0x78, 0xAB, 0xCE, 0xEF, 0xFD, 0xBA, 0x98, 0x76, 0x66, 0x66, 0x78, - 0x9A, 0xBD, 0xEF, 0xFF, 0xEC, 0xB9, 0x98, 0x77, 0x77, 0x78, 0x9A, 0xBC, - 0xDF, 0xFF, 0xFF, 0xDC, 0xBA, 0x98, 0x88, 0x88, 0x9A, 0xBB, 0xDE, 0xFF, - 0xFF, 0xFE, 0xDC, 0xBA, 0xA9, 0x99, 0xAA, 0xBB, 0xCD, 0xFF, 0xFF, 0xFF, - 0xFE, 0xEC, 0xCB, 0xBB, 0xBB, 0xBC, 0xCD, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xED, 0xDC, 0xCC, 0xCD, 0xDE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, - 0xEE, 0xEE, 0xFF, 0xFF, 0xFF, 0xFF, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xEE, 0xFF, 0xFF, 0xFF, 0xC0, 0x00, 0x00, 0x00, - ], - [ - 0xAC, 0xBB, 0xBB, 0xAA, 0xAA, 0xAA, 0xBB, 0xBC, 0xCD, 0xDE, 0xBC, 0xDD, - 0xCB, 0xBB, 0xBA, 0xAA, 0xBB, 0xBB, 0xCC, 0xDD, 0xED, 0xCC, 0xCB, 0xBA, - 0xAA, 0xA9, 0x99, 0xAA, 0xBB, 0xCC, 0xDE, 0xDB, 0xCB, 0xBA, 0xA9, 0x99, - 0x99, 0x99, 0x9A, 0xAB, 0xCD, 0xDC, 0xBC, 0xBA, 0xA9, 0x98, 0x88, 0x88, - 0x88, 0x99, 0xAB, 0xCD, 0xCB, 0xBA, 0xA9, 0x88, 0x77, 0x77, 0x77, 0x88, - 0x9A, 0xAB, 0xCC, 0xAB, 0xA9, 0x88, 0x77, 0x66, 0x66, 0x67, 0x78, 0x9A, - 0xBC, 0xCA, 0xBA, 0x98, 0x77, 0x66, 0x66, 0x66, 0x67, 0x89, 0x9A, 0xBB, - 0xAA, 0xA9, 0x87, 0x66, 0x55, 0x55, 0x66, 0x77, 0x89, 0xAB, 0xBA, 0xA9, - 0x98, 0x76, 0x65, 0x55, 0x55, 0x66, 0x78, 0x9A, 0xBB, 0xAA, 0x99, 0x87, - 0x66, 0x55, 0x55, 0x56, 0x67, 0x89, 0xAB, 0xBB, 0xA9, 0x98, 0x76, 0x65, - 0x55, 0x55, 0x67, 0x78, 0x9A, 0xBB, 0xBB, 0xA9, 0x87, 0x66, 0x65, 0x55, - 0x66, 0x78, 0x89, 0xAB, 0xBB, 0xBA, 0x98, 0x87, 0x66, 0x66, 0x66, 0x77, - 0x89, 0xAA, 0xBB, 0xBB, 0xAA, 0x98, 0x87, 0x77, 0x67, 0x77, 0x88, 0x9A, - 0xBB, 0xBC, 0xCB, 0xA9, 0x98, 0x87, 0x77, 0x78, 0x88, 0x9A, 0xAB, 0xCB, - 0xCC, 0xCB, 0xAA, 0x99, 0x88, 0x88, 0x89, 0x9A, 0xAB, 0xBC, 0xBD, 0xDC, - 0xCB, 0xAA, 0x99, 0x99, 0x99, 0x9A, 0xAB, 0xBC, 0xDC, 0xDE, 0xED, 0xCB, - 0xBA, 0xAA, 0xAA, 0xAA, 0xBB, 0xBC, 0xCD, 0xCD, 0xEE, 0xDD, 0xCC, 0xBB, - 0xBB, 0xBB, 0xBB, 0xCC, 0xDD, 0xDC, 0xAE, 0xDD, 0xCC, 0xBB, 0xBB, 0xBB, - 0xBB, 0xBB, 0xBC, 0xCC, 0xA0, 0x00, 0x00, 0x00, - ], - [ - 0x9B, 0xBA, 0xAA, 0xAA, 0xA9, 0xAA, 0xAA, 0xBB, 0xBC, 0xDC, 0xAB, 0xCB, - 0xBB, 0xAA, 0xAA, 0xAA, 0xAA, 0xAB, 0xBC, 0xCD, 0xED, 0xBB, 0xBB, 0xAA, - 0x99, 0x99, 0x99, 0x99, 0xAA, 0xBC, 0xCD, 0xDA, 0xBA, 0xAA, 0x99, 0x98, - 0x88, 0x88, 0x99, 0xAA, 0xBC, 0xCC, 0xAB, 0xAA, 0x99, 0x88, 0x87, 0x77, - 0x88, 0x89, 0xAA, 0xBC, 0xCA, 0xBA, 0x99, 0x88, 0x77, 0x77, 0x77, 0x88, - 0x89, 0xAB, 0xBB, 0xAA, 0x99, 0x88, 0x77, 0x66, 0x66, 0x77, 0x78, 0x89, - 0xAB, 0xBA, 0xA9, 0x98, 0x77, 0x66, 0x66, 0x66, 0x67, 0x88, 0x9A, 0xBA, - 0x9A, 0x98, 0x87, 0x66, 0x66, 0x56, 0x66, 0x77, 0x89, 0xAB, 0xAA, 0xA9, - 0x87, 0x76, 0x65, 0x55, 0x56, 0x66, 0x78, 0x99, 0xAA, 0xAA, 0x98, 0x77, - 0x66, 0x55, 0x55, 0x66, 0x67, 0x89, 0x9A, 0xAA, 0xA9, 0x88, 0x76, 0x66, - 0x55, 0x56, 0x67, 0x78, 0x9A, 0xAA, 0xAA, 0x99, 0x87, 0x66, 0x66, 0x66, - 0x66, 0x77, 0x89, 0x9A, 0xAA, 0xA9, 0x98, 0x77, 0x66, 0x66, 0x66, 0x77, - 0x88, 0x9A, 0xBA, 0xBB, 0xA9, 0x88, 0x77, 0x76, 0x67, 0x77, 0x88, 0x99, - 0xAB, 0xAB, 0xBA, 0xA9, 0x88, 0x87, 0x77, 0x77, 0x88, 0x89, 0xAA, 0xBA, - 0xBB, 0xBA, 0xA9, 0x88, 0x88, 0x88, 0x88, 0x99, 0xAA, 0xBB, 0xAC, 0xDB, - 0xBA, 0xA9, 0x99, 0x99, 0x99, 0x99, 0xAA, 0xBB, 0xCB, 0xCD, 0xCC, 0xBB, - 0xAA, 0xA9, 0x99, 0x9A, 0xAA, 0xBB, 0xCC, 0xBC, 0xED, 0xDC, 0xBB, 0xBA, - 0xAA, 0xAA, 0xBA, 0xBB, 0xCC, 0xCC, 0xAC, 0xCC, 0xCB, 0xBB, 0xAA, 0xAA, - 0xAA, 0xAA, 0xBB, 0xBB, 0xA0, 0x00, 0x00, 0x00, - ], - [ - 0x9B, 0xBA, 0xAA, 0x99, 0x99, 0x99, 0x99, 0xAA, 0xBB, 0xCC, 0xBB, 0xCC, - 0xBA, 0xAA, 0xA9, 0x99, 0x9A, 0xAA, 0xBB, 0xCC, 0xDC, 0xBB, 0xBA, 0xAA, - 0x99, 0x99, 0x99, 0x99, 0x9A, 0xAB, 0xCC, 0xCA, 0xBA, 0xA9, 0x99, 0x88, - 0x88, 0x88, 0x89, 0x9A, 0xAB, 0xCB, 0xAB, 0xA9, 0x98, 0x88, 0x77, 0x77, - 0x88, 0x89, 0x9A, 0xAB, 0xBA, 0xAA, 0x98, 0x88, 0x77, 0x77, 0x77, 0x78, - 0x89, 0x9A, 0xBA, 0x9A, 0x99, 0x87, 0x77, 0x66, 0x66, 0x67, 0x78, 0x89, - 0xAA, 0xA9, 0xA9, 0x88, 0x77, 0x66, 0x66, 0x66, 0x67, 0x78, 0x99, 0xAA, - 0x99, 0x98, 0x77, 0x66, 0x66, 0x66, 0x66, 0x77, 0x88, 0x9A, 0xA9, 0x99, - 0x87, 0x76, 0x66, 0x55, 0x66, 0x66, 0x78, 0x89, 0xA9, 0x99, 0x98, 0x77, - 0x66, 0x65, 0x56, 0x66, 0x77, 0x88, 0x9A, 0x99, 0x99, 0x87, 0x76, 0x66, - 0x66, 0x66, 0x67, 0x78, 0x89, 0xA9, 0x99, 0x98, 0x77, 0x76, 0x66, 0x66, - 0x66, 0x77, 0x88, 0x9A, 0xAA, 0xA9, 0x88, 0x77, 0x66, 0x66, 0x66, 0x77, - 0x88, 0x99, 0xAA, 0xAA, 0x99, 0x88, 0x77, 0x77, 0x67, 0x77, 0x78, 0x89, - 0xAA, 0xAA, 0xBA, 0x99, 0x88, 0x77, 0x77, 0x77, 0x88, 0x89, 0x9A, 0xBA, - 0xAB, 0xAA, 0x99, 0x88, 0x88, 0x88, 0x88, 0x89, 0x9A, 0xAB, 0xAB, 0xBB, - 0xAA, 0x99, 0x98, 0x88, 0x88, 0x99, 0x9A, 0xAB, 0xBB, 0xCC, 0xCB, 0xAA, - 0xA9, 0x99, 0x99, 0x99, 0xAA, 0xAB, 0xBC, 0xBC, 0xDC, 0xCB, 0xBA, 0xAA, - 0xAA, 0xAA, 0xAA, 0xBB, 0xCC, 0xCB, 0xBC, 0xCB, 0xBB, 0xAA, 0xAA, 0x99, - 0x9A, 0xAA, 0xAB, 0xBB, 0x90, 0x00, 0x00, 0x00, - ], - [ - 0x9B, 0xBB, 0xAA, 0xAA, 0xA9, 0xAA, 0xAA, 0xAB, 0xBB, 0xCC, 0xAB, 0xDC, - 0xBB, 0xBA, 0xAA, 0xAA, 0xAA, 0xAB, 0xBB, 0xCC, 0xEC, 0xBC, 0xBB, 0xAA, - 0xA9, 0x99, 0x99, 0x99, 0xAB, 0xBC, 0xCD, 0xCB, 0xBB, 0xAA, 0x99, 0x88, - 0x88, 0x88, 0x99, 0xAA, 0xBC, 0xCC, 0xAB, 0xAA, 0x99, 0x88, 0x88, 0x78, - 0x88, 0x89, 0xAA, 0xBC, 0xBA, 0xBA, 0x99, 0x88, 0x77, 0x77, 0x77, 0x78, - 0x89, 0xAA, 0xBB, 0xAA, 0xA9, 0x88, 0x77, 0x66, 0x66, 0x77, 0x78, 0x99, - 0xAB, 0xAA, 0xA9, 0x88, 0x77, 0x66, 0x66, 0x66, 0x67, 0x88, 0x9A, 0xBA, - 0x9A, 0x98, 0x87, 0x66, 0x65, 0x55, 0x66, 0x77, 0x89, 0xAA, 0xA9, 0xA9, - 0x87, 0x76, 0x65, 0x55, 0x56, 0x66, 0x78, 0x99, 0xAA, 0xAA, 0x98, 0x77, - 0x66, 0x55, 0x55, 0x66, 0x67, 0x89, 0x9A, 0xAA, 0xA9, 0x88, 0x76, 0x66, - 0x55, 0x56, 0x67, 0x78, 0x99, 0xAA, 0xAA, 0x99, 0x87, 0x66, 0x66, 0x66, - 0x66, 0x77, 0x89, 0xAB, 0xAA, 0xAA, 0x98, 0x77, 0x76, 0x66, 0x66, 0x77, - 0x88, 0x9A, 0xBA, 0xAB, 0xA9, 0x88, 0x77, 0x77, 0x77, 0x77, 0x88, 0x99, - 0xAB, 0xAB, 0xBA, 0xA9, 0x88, 0x87, 0x77, 0x77, 0x88, 0x99, 0xAB, 0xBA, - 0xBC, 0xBA, 0xA9, 0x98, 0x88, 0x88, 0x88, 0x99, 0xAA, 0xBB, 0xBB, 0xCB, - 0xBA, 0xA9, 0x99, 0x98, 0x99, 0x99, 0xAA, 0xBB, 0xCB, 0xCD, 0xCB, 0xBA, - 0xAA, 0xAA, 0x99, 0x9A, 0xAA, 0xBB, 0xCD, 0xCD, 0xED, 0xDC, 0xBB, 0xBB, - 0xAA, 0xAA, 0xAB, 0xBC, 0xCD, 0xDC, 0xAC, 0xCC, 0xBB, 0xBA, 0xAA, 0xAA, - 0xAA, 0xAA, 0xBB, 0xBC, 0xA0, 0x00, 0x00, 0x00, - ], - [ - 0xAC, 0xBB, 0xBB, 0xAA, 0xAA, 0xAA, 0xBB, 0xBB, 0xCC, 0xCE, 0xAC, 0xDD, - 0xCB, 0xBB, 0xAA, 0xAA, 0xAB, 0xBB, 0xCC, 0xDE, 0xFE, 0xBC, 0xCB, 0xBA, - 0xAA, 0x99, 0x9A, 0xAA, 0xAB, 0xCC, 0xDE, 0xDB, 0xCB, 0xBA, 0xA9, 0x99, - 0x98, 0x99, 0x9A, 0xAB, 0xCC, 0xDD, 0xBB, 0xBA, 0x99, 0x88, 0x88, 0x88, - 0x88, 0x99, 0xAB, 0xCD, 0xCB, 0xBA, 0xA9, 0x88, 0x77, 0x77, 0x77, 0x88, - 0x99, 0xAB, 0xCC, 0xAB, 0xA9, 0x88, 0x77, 0x66, 0x66, 0x67, 0x78, 0x9A, - 0xBC, 0xCA, 0xAA, 0x98, 0x77, 0x66, 0x65, 0x66, 0x67, 0x88, 0x9A, 0xBB, - 0xAA, 0xA9, 0x87, 0x66, 0x55, 0x55, 0x66, 0x77, 0x89, 0xAB, 0xBA, 0xA9, - 0x88, 0x76, 0x65, 0x55, 0x55, 0x67, 0x78, 0x9A, 0xBB, 0xAA, 0x99, 0x87, - 0x66, 0x55, 0x55, 0x56, 0x77, 0x89, 0xAB, 0xBA, 0xAA, 0x98, 0x76, 0x65, - 0x55, 0x55, 0x67, 0x78, 0x9A, 0xBB, 0xBB, 0xA9, 0x87, 0x76, 0x65, 0x55, - 0x66, 0x78, 0x89, 0xAB, 0xBB, 0xBA, 0x98, 0x87, 0x66, 0x66, 0x66, 0x77, - 0x89, 0x9A, 0xBB, 0xBB, 0xAA, 0x98, 0x87, 0x77, 0x77, 0x77, 0x88, 0x9A, - 0xBB, 0xBC, 0xCB, 0xA9, 0x98, 0x87, 0x77, 0x78, 0x88, 0x9A, 0xAB, 0xCB, - 0xCC, 0xCB, 0xA9, 0x99, 0x88, 0x88, 0x89, 0x99, 0xAB, 0xBC, 0xBD, 0xDC, - 0xCB, 0xAA, 0x99, 0x99, 0x99, 0x9A, 0xAB, 0xBC, 0xDC, 0xDE, 0xDC, 0xCB, - 0xBA, 0xAA, 0xAA, 0xAA, 0xAB, 0xBC, 0xCD, 0xCE, 0xFE, 0xDC, 0xCC, 0xBB, - 0xBB, 0xBB, 0xBB, 0xCC, 0xCD, 0xEC, 0xBE, 0xDC, 0xCC, 0xCB, 0xBB, 0xBB, - 0xBB, 0xBB, 0xBC, 0xCC, 0xA0, 0x00, 0x00, 0x00, - ], - [ - 0xCE, 0xED, 0xDE, 0xDD, 0xDD, 0xEE, 0xEF, 0xFF, 0xFF, 0xFF, 0xBE, 0xFF, - 0xEE, 0xDD, 0xDD, 0xDD, 0xDE, 0xFF, 0xFF, 0xFF, 0xFF, 0xEF, 0xED, 0xDC, - 0xCC, 0xBC, 0xCC, 0xCD, 0xEE, 0xFF, 0xFF, 0xFD, 0xED, 0xCC, 0xBB, 0xAA, - 0xAA, 0xAB, 0xBC, 0xDF, 0xFF, 0xFF, 0xDD, 0xDC, 0xBA, 0x99, 0x98, 0x99, - 0x9A, 0xBC, 0xDF, 0xFF, 0xFD, 0xDC, 0xBA, 0x98, 0x87, 0x77, 0x88, 0x9A, - 0xBC, 0xEF, 0xFF, 0xDD, 0xCB, 0x98, 0x87, 0x66, 0x66, 0x78, 0x9A, 0xBD, - 0xEF, 0xFD, 0xDC, 0xA9, 0x87, 0x66, 0x55, 0x66, 0x78, 0x9B, 0xCD, 0xFF, - 0xDD, 0xBA, 0x97, 0x66, 0x54, 0x45, 0x56, 0x79, 0xAC, 0xDE, 0xFE, 0xDB, - 0xA9, 0x76, 0x55, 0x44, 0x45, 0x67, 0x8A, 0xBD, 0xFF, 0xDD, 0xCA, 0x97, - 0x65, 0x44, 0x44, 0x56, 0x78, 0xAB, 0xCE, 0xEE, 0xDC, 0xA9, 0x87, 0x65, - 0x44, 0x55, 0x67, 0x8A, 0xBD, 0xEF, 0xEE, 0xCB, 0x98, 0x76, 0x55, 0x55, - 0x66, 0x79, 0xAB, 0xDE, 0xEF, 0xED, 0xBA, 0x98, 0x76, 0x66, 0x67, 0x78, - 0x9A, 0xBD, 0xFE, 0xEF, 0xEC, 0xBA, 0x98, 0x77, 0x77, 0x78, 0x9A, 0xBC, - 0xDE, 0xEF, 0xFF, 0xDC, 0xBA, 0x99, 0x88, 0x89, 0x9A, 0xAB, 0xCD, 0xEE, - 0xFF, 0xFE, 0xDC, 0xBB, 0xAA, 0xAA, 0xAA, 0xBB, 0xCD, 0xEF, 0xEF, 0xFF, - 0xFF, 0xDC, 0xCC, 0xBB, 0xBB, 0xBC, 0xCD, 0xDE, 0xFF, 0xFF, 0xFF, 0xFF, - 0xED, 0xDD, 0xCD, 0xCD, 0xDD, 0xDF, 0xFF, 0xEF, 0xFF, 0xFF, 0xFF, 0xFE, - 0xFE, 0xEE, 0xEF, 0xFF, 0xFF, 0xFF, 0xBF, 0xFF, 0xFF, 0xFF, 0xEE, 0xEE, - 0xEE, 0xEF, 0xEF, 0xFF, 0xC0, 0x00, 0x00, 0x00, - ], - [ - 0xCE, 0xDD, 0xDD, 0xCC, 0xCC, 0xCD, 0xDD, 0xEE, 0xEF, 0xFF, 0xCE, 0xFE, - 0xDD, 0xDC, 0xCC, 0xCC, 0xCC, 0xCD, 0xEE, 0xFF, 0xFF, 0xDF, 0xED, 0xCB, - 0xBA, 0xAA, 0xAA, 0xBB, 0xCC, 0xDF, 0xFF, 0xFE, 0xED, 0xCB, 0xAA, 0x99, - 0x99, 0x99, 0xAB, 0xCD, 0xDF, 0xFF, 0xDD, 0xCB, 0xA9, 0x98, 0x88, 0x88, - 0x89, 0x9A, 0xBC, 0xEF, 0xFD, 0xDB, 0xB9, 0x98, 0x77, 0x77, 0x77, 0x89, - 0xAB, 0xCD, 0xFE, 0xDC, 0xBA, 0x98, 0x77, 0x66, 0x66, 0x67, 0x89, 0xAB, - 0xCD, 0xFC, 0xCB, 0x98, 0x77, 0x66, 0x55, 0x56, 0x67, 0x89, 0xAC, 0xDE, - 0xCB, 0xA9, 0x87, 0x66, 0x55, 0x55, 0x56, 0x78, 0x9A, 0xBD, 0xDC, 0xCA, - 0x98, 0x76, 0x55, 0x54, 0x55, 0x67, 0x79, 0xAB, 0xCD, 0xDC, 0xA9, 0x87, - 0x65, 0x54, 0x45, 0x56, 0x78, 0x9A, 0xBD, 0xDC, 0xCA, 0x98, 0x76, 0x55, - 0x55, 0x55, 0x67, 0x89, 0xAB, 0xCD, 0xDC, 0xBA, 0x87, 0x66, 0x55, 0x55, - 0x66, 0x78, 0x9A, 0xCC, 0xDD, 0xDB, 0xA9, 0x87, 0x66, 0x66, 0x66, 0x78, - 0x89, 0xBC, 0xDD, 0xED, 0xCB, 0xA9, 0x87, 0x77, 0x77, 0x78, 0x89, 0xAB, - 0xCE, 0xDE, 0xEC, 0xBA, 0xA9, 0x88, 0x88, 0x88, 0x89, 0xAB, 0xCD, 0xEE, - 0xFF, 0xEC, 0xBB, 0xA9, 0x99, 0x99, 0x99, 0xAB, 0xCC, 0xDF, 0xEF, 0xFF, - 0xDC, 0xCB, 0xBA, 0xAA, 0xAA, 0xAB, 0xBD, 0xDE, 0xFF, 0xFF, 0xFF, 0xED, - 0xCC, 0xCB, 0xBB, 0xCC, 0xCC, 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0xEE, 0xDD, - 0xDC, 0xDD, 0xDD, 0xEE, 0xFF, 0xFF, 0xBF, 0xFF, 0xFF, 0xEF, 0xED, 0xDD, - 0xDD, 0xDF, 0xFF, 0xFF, 0xD0, 0x00, 0x00, 0x00, - ], - [ - 0xCE, 0xED, 0xDC, 0xCC, 0xCC, 0xCC, 0xCD, 0xDD, 0xEF, 0xFF, 0xCE, 0xFE, - 0xDD, 0xCC, 0xBB, 0xBB, 0xBC, 0xCD, 0xDE, 0xFF, 0xFF, 0xEE, 0xDD, 0xCB, - 0xBA, 0xAA, 0xAA, 0xAB, 0xCC, 0xDE, 0xFF, 0xFD, 0xDC, 0xCB, 0xAA, 0x99, - 0x99, 0x99, 0xAA, 0xBC, 0xDE, 0xFF, 0xDD, 0xCB, 0xA9, 0x98, 0x88, 0x88, - 0x89, 0x9A, 0xBC, 0xDF, 0xED, 0xCB, 0xA9, 0x88, 0x77, 0x77, 0x77, 0x88, - 0x9A, 0xBC, 0xEE, 0xCC, 0xBA, 0x98, 0x76, 0x66, 0x66, 0x67, 0x89, 0x9B, - 0xCD, 0xEC, 0xBA, 0x98, 0x76, 0x66, 0x55, 0x56, 0x67, 0x89, 0xAB, 0xDD, - 0xCB, 0xA9, 0x87, 0x66, 0x55, 0x55, 0x56, 0x78, 0x9A, 0xBC, 0xDC, 0xBA, - 0x98, 0x76, 0x55, 0x55, 0x55, 0x67, 0x78, 0xAB, 0xCD, 0xCB, 0xA9, 0x87, - 0x65, 0x55, 0x55, 0x56, 0x67, 0x8A, 0xBC, 0xDC, 0xBA, 0x98, 0x76, 0x55, - 0x55, 0x55, 0x67, 0x78, 0xAB, 0xCD, 0xCC, 0xA9, 0x87, 0x66, 0x55, 0x55, - 0x66, 0x78, 0x9A, 0xBC, 0xDD, 0xCB, 0xA9, 0x87, 0x66, 0x66, 0x66, 0x77, - 0x89, 0xAB, 0xCD, 0xDD, 0xCA, 0x98, 0x87, 0x77, 0x67, 0x77, 0x89, 0xAB, - 0xCD, 0xDE, 0xEC, 0xBA, 0x99, 0x88, 0x77, 0x78, 0x89, 0xAA, 0xBC, 0xDD, - 0xEE, 0xDC, 0xBA, 0xA9, 0x98, 0x89, 0x99, 0xAA, 0xBC, 0xDE, 0xEF, 0xFE, - 0xDC, 0xBB, 0xAA, 0xAA, 0xAA, 0xAB, 0xCC, 0xDE, 0xFE, 0xFF, 0xFE, 0xED, - 0xCB, 0xBB, 0xBB, 0xBB, 0xCC, 0xDE, 0xFF, 0xEF, 0xFF, 0xFF, 0xED, 0xDC, - 0xCC, 0xCC, 0xDD, 0xDE, 0xFF, 0xFF, 0xDF, 0xFF, 0xEE, 0xDD, 0xDD, 0xCD, - 0xDD, 0xDE, 0xEE, 0xFF, 0xD0, 0x00, 0x00, 0x00, - ], - [ - 0xBD, 0xDC, 0xDC, 0xCC, 0xBC, 0xCC, 0xCD, 0xDD, 0xDE, 0xEE, 0xBE, 0xFE, - 0xDD, 0xCC, 0xCB, 0xBB, 0xCC, 0xCD, 0xEE, 0xFF, 0xFF, 0xDE, 0xDC, 0xCB, - 0xBA, 0xAA, 0xAA, 0xBB, 0xCC, 0xEF, 0xFF, 0xFD, 0xDD, 0xCB, 0xAA, 0x99, - 0x99, 0x9A, 0xAB, 0xCC, 0xDE, 0xFE, 0xCD, 0xCB, 0xAA, 0x98, 0x88, 0x88, - 0x89, 0xAA, 0xCC, 0xEE, 0xEC, 0xCB, 0xA9, 0x98, 0x77, 0x77, 0x77, 0x89, - 0xAB, 0xCD, 0xED, 0xCC, 0xBA, 0x98, 0x77, 0x66, 0x66, 0x77, 0x89, 0xAB, - 0xCE, 0xDC, 0xBA, 0x98, 0x77, 0x66, 0x55, 0x56, 0x77, 0x8A, 0xAC, 0xDD, - 0xCB, 0xA9, 0x87, 0x66, 0x55, 0x55, 0x56, 0x78, 0x9A, 0xBD, 0xDC, 0xBA, - 0x98, 0x76, 0x55, 0x44, 0x55, 0x67, 0x89, 0xAB, 0xCC, 0xCB, 0xA9, 0x87, - 0x65, 0x54, 0x45, 0x56, 0x78, 0x9A, 0xBC, 0xDC, 0xCA, 0x98, 0x76, 0x55, - 0x55, 0x55, 0x67, 0x89, 0xAB, 0xDC, 0xCC, 0xBA, 0x87, 0x76, 0x55, 0x55, - 0x66, 0x78, 0x9A, 0xBC, 0xDC, 0xCB, 0xA9, 0x87, 0x76, 0x66, 0x66, 0x78, - 0x99, 0xAC, 0xDC, 0xDD, 0xCB, 0xA9, 0x87, 0x77, 0x77, 0x78, 0x89, 0xAB, - 0xCD, 0xDD, 0xEC, 0xCA, 0xA9, 0x88, 0x88, 0x88, 0x89, 0xAB, 0xBC, 0xDD, - 0xDE, 0xDC, 0xCB, 0xA9, 0x99, 0x99, 0x99, 0xAB, 0xBC, 0xDE, 0xDE, 0xFE, - 0xDD, 0xCB, 0xBA, 0xAA, 0xAA, 0xAB, 0xBC, 0xDE, 0xDD, 0xEF, 0xEE, 0xDD, - 0xCC, 0xBB, 0xBB, 0xBC, 0xCC, 0xDE, 0xEF, 0xEF, 0xFF, 0xFE, 0xEE, 0xDD, - 0xCD, 0xCD, 0xCD, 0xDD, 0xFF, 0xFE, 0xCE, 0xED, 0xEE, 0xDD, 0xDD, 0xCC, - 0xDD, 0xCD, 0xDE, 0xDE, 0xC0, 0x00, 0x00, 0x00, - ], - [ - 0xBE, 0xEE, 0xED, 0xDD, 0xDD, 0xDD, 0xDD, 0xEE, 0xEF, 0xFF, 0xBE, 0xFF, - 0xFE, 0xDD, 0xDC, 0xCD, 0xDD, 0xEE, 0xFF, 0xFF, 0xFF, 0xEF, 0xED, 0xDC, - 0xCB, 0xBB, 0xBB, 0xCC, 0xDD, 0xFF, 0xFF, 0xFD, 0xEE, 0xCC, 0xBB, 0xAA, - 0xAA, 0xAA, 0xBC, 0xDE, 0xFF, 0xFF, 0xDD, 0xDC, 0xBA, 0x99, 0x98, 0x89, - 0x9A, 0xAB, 0xDD, 0xFF, 0xFD, 0xDC, 0xBA, 0x98, 0x87, 0x77, 0x78, 0x99, - 0xAC, 0xDE, 0xFF, 0xDD, 0xCB, 0x98, 0x87, 0x66, 0x66, 0x78, 0x9A, 0xBC, - 0xDF, 0xED, 0xDC, 0xA9, 0x87, 0x66, 0x55, 0x56, 0x78, 0x9A, 0xBD, 0xEE, - 0xDC, 0xBA, 0x97, 0x66, 0x55, 0x45, 0x56, 0x78, 0xAB, 0xCE, 0xED, 0xDB, - 0xA8, 0x76, 0x55, 0x44, 0x45, 0x67, 0x89, 0xBC, 0xDE, 0xDC, 0xBA, 0x87, - 0x65, 0x54, 0x44, 0x56, 0x78, 0x9B, 0xCE, 0xDD, 0xDB, 0xA9, 0x76, 0x65, - 0x44, 0x55, 0x67, 0x89, 0xBC, 0xDE, 0xDD, 0xCA, 0x98, 0x76, 0x55, 0x55, - 0x66, 0x78, 0xAB, 0xDD, 0xEE, 0xEC, 0xBA, 0x98, 0x76, 0x66, 0x67, 0x78, - 0x9A, 0xBD, 0xEE, 0xEF, 0xDC, 0xB9, 0x98, 0x77, 0x77, 0x78, 0x9A, 0xBC, - 0xDE, 0xEE, 0xFE, 0xDB, 0xAA, 0x98, 0x88, 0x88, 0x9A, 0xAB, 0xCE, 0xFE, - 0xFF, 0xED, 0xDB, 0xBA, 0xAA, 0x99, 0xAA, 0xBB, 0xCD, 0xEF, 0xEF, 0xFF, - 0xFE, 0xDC, 0xBB, 0xBB, 0xBB, 0xBC, 0xCD, 0xEF, 0xFE, 0xFF, 0xFF, 0xFE, - 0xED, 0xCC, 0xCC, 0xCC, 0xDD, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xEE, - 0xDE, 0xDE, 0xEE, 0xEF, 0xFF, 0xFF, 0xBF, 0xFF, 0xFE, 0xEE, 0xED, 0xDE, - 0xED, 0xDE, 0xEE, 0xFE, 0xC0, 0x00, 0x00, 0x00, - ], - [ - 0xAC, 0xCC, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xCC, 0xDD, 0xEE, 0xBC, 0xDD, - 0xCC, 0xBB, 0xBB, 0xBB, 0xBB, 0xBC, 0xCD, 0xEE, 0xFE, 0xCD, 0xCB, 0xBA, - 0xAA, 0xAA, 0xAA, 0xAA, 0xBB, 0xCD, 0xEE, 0xEC, 0xCB, 0xBA, 0xA9, 0x99, - 0x99, 0x99, 0x9A, 0xBB, 0xCD, 0xED, 0xBC, 0xBA, 0x99, 0x88, 0x88, 0x88, - 0x89, 0x9A, 0xBB, 0xCD, 0xDB, 0xBA, 0xA9, 0x88, 0x77, 0x77, 0x77, 0x88, - 0x9A, 0xBC, 0xDD, 0xBB, 0xA9, 0x88, 0x77, 0x66, 0x66, 0x77, 0x88, 0x9A, - 0xBC, 0xCB, 0xBA, 0x98, 0x77, 0x66, 0x55, 0x66, 0x77, 0x89, 0xAB, 0xCC, - 0xBB, 0xA9, 0x87, 0x66, 0x55, 0x55, 0x66, 0x78, 0x9A, 0xBC, 0xCB, 0xA9, - 0x98, 0x76, 0x65, 0x44, 0x55, 0x67, 0x78, 0x9A, 0xBB, 0xBB, 0xA9, 0x87, - 0x66, 0x54, 0x45, 0x56, 0x77, 0x89, 0xAB, 0xBB, 0xBA, 0x98, 0x76, 0x65, - 0x55, 0x56, 0x67, 0x78, 0x9A, 0xBB, 0xBB, 0xA9, 0x87, 0x76, 0x65, 0x56, - 0x66, 0x78, 0x99, 0xAB, 0xBB, 0xBA, 0x99, 0x87, 0x76, 0x66, 0x66, 0x77, - 0x89, 0xAB, 0xCC, 0xCC, 0xBA, 0x98, 0x87, 0x77, 0x77, 0x77, 0x89, 0x9A, - 0xBC, 0xCC, 0xCB, 0xBA, 0x99, 0x88, 0x87, 0x88, 0x88, 0x9A, 0xAB, 0xCC, - 0xDD, 0xCB, 0xBA, 0x99, 0x98, 0x88, 0x99, 0x9A, 0xAB, 0xCD, 0xCD, 0xED, - 0xCB, 0xBA, 0xAA, 0x99, 0x99, 0xAA, 0xAB, 0xCC, 0xDC, 0xDF, 0xED, 0xCC, - 0xBB, 0xBA, 0xAA, 0xAB, 0xBB, 0xCC, 0xDD, 0xDE, 0xFE, 0xED, 0xDC, 0xCB, - 0xBB, 0xBB, 0xCC, 0xCD, 0xDE, 0xFD, 0xAE, 0xDD, 0xDD, 0xCC, 0xCB, 0xBB, - 0xBB, 0xCC, 0xCC, 0xDD, 0xB0, 0x00, 0x00, 0x00, - ], - [ - 0xAB, 0xBA, 0xAA, 0x99, 0x99, 0x99, 0x9A, 0xAA, 0xBB, 0xCC, 0xBB, 0xCC, - 0xBA, 0xAA, 0xA9, 0x99, 0x9A, 0xAA, 0xBB, 0xCC, 0xDD, 0xBC, 0xBA, 0xA9, - 0x99, 0x99, 0x99, 0x99, 0xAA, 0xBB, 0xCC, 0xCA, 0xBA, 0xA9, 0x98, 0x88, - 0x88, 0x88, 0x89, 0x9A, 0xBB, 0xCB, 0xAB, 0xA9, 0x98, 0x88, 0x77, 0x77, - 0x88, 0x89, 0x9A, 0xBB, 0xBA, 0xA9, 0x98, 0x87, 0x77, 0x77, 0x77, 0x78, - 0x89, 0x9A, 0xBB, 0x9A, 0x98, 0x87, 0x77, 0x66, 0x66, 0x77, 0x78, 0x89, - 0xAA, 0xA9, 0xA9, 0x88, 0x77, 0x66, 0x66, 0x66, 0x67, 0x78, 0x9A, 0xAA, - 0x99, 0x98, 0x77, 0x66, 0x66, 0x66, 0x66, 0x77, 0x89, 0x9A, 0xA9, 0x99, - 0x87, 0x76, 0x66, 0x55, 0x56, 0x67, 0x78, 0x89, 0xAA, 0x99, 0x98, 0x77, - 0x66, 0x65, 0x56, 0x66, 0x77, 0x88, 0x9A, 0xA9, 0x99, 0x87, 0x76, 0x66, - 0x55, 0x66, 0x67, 0x78, 0x89, 0xAA, 0x9A, 0x98, 0x77, 0x66, 0x66, 0x66, - 0x66, 0x77, 0x89, 0x9A, 0xAA, 0xA9, 0x88, 0x77, 0x66, 0x66, 0x66, 0x77, - 0x88, 0x9A, 0xAA, 0xAA, 0x99, 0x88, 0x77, 0x77, 0x77, 0x77, 0x88, 0x99, - 0xAB, 0xAA, 0xBA, 0x99, 0x88, 0x77, 0x77, 0x77, 0x88, 0x89, 0xAA, 0xBB, - 0xBB, 0xAA, 0x99, 0x88, 0x88, 0x88, 0x88, 0x99, 0xAA, 0xBB, 0xBB, 0xCB, - 0xAA, 0x99, 0x99, 0x88, 0x89, 0x99, 0xAA, 0xBB, 0xCB, 0xCC, 0xCB, 0xBA, - 0xA9, 0x99, 0x99, 0x99, 0xAA, 0xBB, 0xCC, 0xCC, 0xDC, 0xCB, 0xBB, 0xAA, - 0xAA, 0xAA, 0xAB, 0xBB, 0xCD, 0xDC, 0xAD, 0xCC, 0xBB, 0xAA, 0xAA, 0xAA, - 0xAA, 0xAA, 0xBB, 0xBC, 0xB0, 0x00, 0x00, 0x00, - ], - [ - 0x9B, 0xAA, 0xA9, 0x99, 0x99, 0x99, 0x99, 0xAA, 0xAB, 0xBC, 0xAB, 0xCB, - 0xBA, 0xA9, 0x99, 0x99, 0x99, 0xAA, 0xAB, 0xBC, 0xDC, 0xAB, 0xAA, 0xA9, - 0x99, 0x88, 0x88, 0x99, 0x9A, 0xAB, 0xBC, 0xCA, 0xBA, 0x99, 0x98, 0x88, - 0x88, 0x88, 0x89, 0x9A, 0xAB, 0xBB, 0xAA, 0xA9, 0x88, 0x87, 0x77, 0x77, - 0x78, 0x88, 0x9A, 0xAB, 0xB9, 0xA9, 0x98, 0x87, 0x77, 0x77, 0x77, 0x78, - 0x89, 0x9A, 0xBA, 0x9A, 0x98, 0x87, 0x77, 0x66, 0x66, 0x77, 0x78, 0x89, - 0xAA, 0xA9, 0x99, 0x87, 0x77, 0x66, 0x66, 0x66, 0x67, 0x78, 0x99, 0xAA, - 0x99, 0x88, 0x77, 0x66, 0x66, 0x66, 0x66, 0x77, 0x88, 0x9A, 0xA9, 0x98, - 0x87, 0x76, 0x66, 0x66, 0x66, 0x67, 0x78, 0x89, 0xA9, 0x99, 0x88, 0x77, - 0x66, 0x66, 0x56, 0x66, 0x77, 0x88, 0x9A, 0x99, 0x98, 0x87, 0x76, 0x66, - 0x66, 0x66, 0x67, 0x78, 0x89, 0xA9, 0x99, 0x98, 0x77, 0x66, 0x66, 0x66, - 0x66, 0x77, 0x88, 0x9A, 0x99, 0xA9, 0x88, 0x77, 0x66, 0x66, 0x66, 0x77, - 0x78, 0x99, 0xAA, 0xAA, 0x99, 0x88, 0x77, 0x77, 0x77, 0x77, 0x78, 0x89, - 0xAA, 0xAA, 0xAA, 0x98, 0x88, 0x77, 0x77, 0x77, 0x88, 0x89, 0x9A, 0xBA, - 0xAB, 0xAA, 0x99, 0x88, 0x88, 0x88, 0x88, 0x89, 0x9A, 0xAB, 0xAB, 0xBB, - 0xAA, 0x99, 0x98, 0x88, 0x88, 0x99, 0x9A, 0xAB, 0xCB, 0xBC, 0xBB, 0xAA, - 0x99, 0x99, 0x99, 0x99, 0xAA, 0xAB, 0xBC, 0xBC, 0xDC, 0xCB, 0xBA, 0xAA, - 0xAA, 0xAA, 0xAA, 0xBB, 0xCC, 0xCC, 0xBC, 0xCB, 0xBA, 0xAA, 0x99, 0x99, - 0x9A, 0xAA, 0xBB, 0xBC, 0xA0, 0x00, 0x00, 0x00, - ], - [ - 0x9B, 0xBB, 0xAA, 0xA9, 0x99, 0x99, 0xAA, 0xAB, 0xBB, 0xBC, 0xAB, 0xDC, - 0xBB, 0xAA, 0xAA, 0x9A, 0xAA, 0xAA, 0xBB, 0xCD, 0xDC, 0xBC, 0xBB, 0xAA, - 0x99, 0x99, 0x99, 0x99, 0xAA, 0xBB, 0xCD, 0xCA, 0xBB, 0xA9, 0x98, 0x88, - 0x88, 0x88, 0x99, 0x9A, 0xAB, 0xCC, 0xAB, 0xA9, 0x98, 0x88, 0x77, 0x77, - 0x88, 0x89, 0x9A, 0xBB, 0xBA, 0xA9, 0x98, 0x87, 0x77, 0x77, 0x77, 0x78, - 0x89, 0xAA, 0xBB, 0xAA, 0x99, 0x87, 0x77, 0x66, 0x66, 0x77, 0x78, 0x89, - 0xAB, 0xAA, 0xA9, 0x88, 0x77, 0x66, 0x66, 0x66, 0x67, 0x88, 0x9A, 0xAA, - 0x9A, 0x98, 0x87, 0x66, 0x66, 0x56, 0x66, 0x77, 0x88, 0x9A, 0xA9, 0xA9, - 0x87, 0x76, 0x66, 0x55, 0x56, 0x67, 0x78, 0x89, 0xAA, 0x9A, 0x98, 0x77, - 0x66, 0x55, 0x55, 0x66, 0x77, 0x89, 0x9A, 0xA9, 0xA9, 0x87, 0x76, 0x66, - 0x55, 0x66, 0x67, 0x78, 0x99, 0xAA, 0xAA, 0x98, 0x87, 0x66, 0x66, 0x66, - 0x66, 0x77, 0x89, 0x9A, 0xAA, 0xA9, 0x98, 0x77, 0x66, 0x66, 0x66, 0x77, - 0x88, 0x9A, 0xAA, 0xAA, 0xA9, 0x88, 0x77, 0x77, 0x77, 0x77, 0x88, 0x99, - 0xAB, 0xAA, 0xBA, 0x99, 0x88, 0x77, 0x77, 0x77, 0x88, 0x99, 0xAB, 0xBB, - 0xBB, 0xBA, 0x99, 0x88, 0x88, 0x88, 0x88, 0x99, 0xAA, 0xBB, 0xBB, 0xCB, - 0xAA, 0xA9, 0x99, 0x89, 0x99, 0x99, 0xAA, 0xBB, 0xCB, 0xCC, 0xCB, 0xBA, - 0xAA, 0x99, 0x99, 0xAA, 0xAA, 0xBB, 0xCC, 0xCD, 0xDD, 0xCC, 0xBB, 0xAA, - 0xAA, 0xAA, 0xBB, 0xBC, 0xCD, 0xDC, 0xAD, 0xCB, 0xBB, 0xAA, 0xAA, 0xAA, - 0xAA, 0xAA, 0xBB, 0xCC, 0xA0, 0x00, 0x00, 0x00, - ], - [ - 0xAC, 0xCC, 0xBB, 0xBB, 0xAB, 0xAB, 0xBB, 0xBC, 0xCC, 0xDD, 0xAC, 0xDD, - 0xCC, 0xBB, 0xBB, 0xBA, 0xBB, 0xBC, 0xCD, 0xDE, 0xFD, 0xCD, 0xCB, 0xBA, - 0xAA, 0xA9, 0xAA, 0xAA, 0xBC, 0xCD, 0xDE, 0xDB, 0xCC, 0xBA, 0xA9, 0x99, - 0x99, 0x99, 0x9A, 0xBB, 0xCD, 0xED, 0xBC, 0xBA, 0x99, 0x88, 0x88, 0x88, - 0x89, 0x9A, 0xAB, 0xCD, 0xCB, 0xBA, 0xA9, 0x88, 0x77, 0x77, 0x77, 0x88, - 0x9A, 0xBB, 0xDC, 0xBB, 0xA9, 0x88, 0x77, 0x66, 0x66, 0x77, 0x88, 0x9A, - 0xBC, 0xCB, 0xBA, 0x98, 0x77, 0x66, 0x55, 0x66, 0x77, 0x89, 0xAB, 0xCC, - 0xAA, 0xA9, 0x87, 0x66, 0x55, 0x55, 0x66, 0x78, 0x99, 0xAB, 0xBA, 0xAA, - 0x98, 0x76, 0x65, 0x44, 0x55, 0x67, 0x88, 0x9A, 0xBB, 0xBB, 0xA9, 0x87, - 0x66, 0x54, 0x45, 0x56, 0x77, 0x89, 0xAB, 0xBB, 0xBA, 0x98, 0x76, 0x65, - 0x55, 0x56, 0x67, 0x88, 0x9A, 0xBB, 0xBB, 0xA9, 0x87, 0x76, 0x65, 0x56, - 0x66, 0x78, 0x99, 0xAB, 0xBB, 0xBA, 0x99, 0x87, 0x76, 0x66, 0x66, 0x77, - 0x89, 0xAB, 0xCB, 0xCC, 0xBA, 0x98, 0x87, 0x77, 0x77, 0x77, 0x89, 0x9A, - 0xBC, 0xCC, 0xCB, 0xBA, 0x98, 0x88, 0x87, 0x88, 0x89, 0x9A, 0xAC, 0xCC, - 0xCD, 0xCB, 0xBA, 0x99, 0x98, 0x88, 0x99, 0x9A, 0xAB, 0xCD, 0xCD, 0xDD, - 0xCB, 0xBA, 0xAA, 0x99, 0x99, 0xAA, 0xBB, 0xCC, 0xDC, 0xDE, 0xDD, 0xCC, - 0xBB, 0xAA, 0xAA, 0xAA, 0xBB, 0xCC, 0xDE, 0xDD, 0xFE, 0xED, 0xDC, 0xCB, - 0xBB, 0xBB, 0xCC, 0xCC, 0xDD, 0xED, 0xBD, 0xED, 0xDC, 0xCC, 0xBB, 0xBB, - 0xBB, 0xCC, 0xCC, 0xDD, 0xB0, 0x00, 0x00, 0x00, - ], - [ - 0xCF, 0xFF, 0xFF, 0xEF, 0xEE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xCF, 0xFF, - 0xFF, 0xFE, 0xEE, 0xEE, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xEE, - 0xDD, 0xDC, 0xCD, 0xDE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xED, 0xCC, 0xBB, - 0xBB, 0xBC, 0xCE, 0xEF, 0xFF, 0xFF, 0xFF, 0xFD, 0xCB, 0xAA, 0x99, 0x9A, - 0xAB, 0xCD, 0xFF, 0xFF, 0xFF, 0xFE, 0xCB, 0xA9, 0x88, 0x88, 0x89, 0xAB, - 0xCD, 0xFF, 0xFF, 0xEF, 0xDC, 0xA9, 0x87, 0x77, 0x77, 0x88, 0xAB, 0xCE, - 0xFF, 0xFE, 0xED, 0xBA, 0x87, 0x66, 0x55, 0x66, 0x79, 0xAC, 0xDF, 0xFF, - 0xFF, 0xCB, 0x98, 0x76, 0x54, 0x45, 0x67, 0x8A, 0xBC, 0xFF, 0xFF, 0xEC, - 0xB9, 0x86, 0x54, 0x33, 0x45, 0x68, 0x9B, 0xDE, 0xFF, 0xFE, 0xDB, 0x98, - 0x75, 0x43, 0x34, 0x56, 0x89, 0xBC, 0xEF, 0xFF, 0xED, 0xBA, 0x87, 0x65, - 0x44, 0x55, 0x78, 0x9B, 0xCE, 0xFF, 0xFF, 0xDC, 0xA9, 0x86, 0x65, 0x55, - 0x67, 0x8A, 0xBC, 0xEF, 0xFF, 0xFE, 0xDB, 0xA8, 0x87, 0x66, 0x77, 0x89, - 0xAC, 0xDF, 0xFF, 0xFF, 0xED, 0xCB, 0xA9, 0x88, 0x88, 0x89, 0xAB, 0xCD, - 0xFF, 0xFF, 0xFF, 0xED, 0xCB, 0xA9, 0x99, 0x9A, 0xAB, 0xCD, 0xEF, 0xFF, - 0xFF, 0xFF, 0xED, 0xCC, 0xBB, 0xBB, 0xBB, 0xCD, 0xDF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFE, 0xDD, 0xCC, 0xCC, 0xDD, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFD, 0xEE, 0xEE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xAF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0x00, 0x00, 0x00, - ], - [ - 0xCE, 0xDD, 0xCC, 0xCC, 0xCC, 0xBC, 0xDC, 0xDD, 0xEE, 0xFF, 0xBD, 0xFD, - 0xDC, 0xCC, 0xBB, 0xBB, 0xBC, 0xCD, 0xDE, 0xFF, 0xFF, 0xDE, 0xDC, 0xCB, - 0xBA, 0xAA, 0xAB, 0xBB, 0xCC, 0xDE, 0xFF, 0xED, 0xDC, 0xBB, 0xAA, 0x99, - 0x99, 0x99, 0xAB, 0xBC, 0xDD, 0xEE, 0xCC, 0xCB, 0xA9, 0x98, 0x88, 0x88, - 0x89, 0x9A, 0xBC, 0xDF, 0xEC, 0xCB, 0xA9, 0x98, 0x77, 0x77, 0x77, 0x89, - 0x9B, 0xCD, 0xFD, 0xCC, 0xBA, 0x98, 0x77, 0x66, 0x66, 0x77, 0x89, 0xAB, - 0xCD, 0xDC, 0xCB, 0x98, 0x77, 0x66, 0x55, 0x56, 0x67, 0x89, 0xBC, 0xDD, - 0xCB, 0xA9, 0x87, 0x66, 0x55, 0x55, 0x56, 0x78, 0x9A, 0xCD, 0xDC, 0xCA, - 0x98, 0x76, 0x55, 0x44, 0x55, 0x67, 0x89, 0xAB, 0xDC, 0xCB, 0xA9, 0x87, - 0x65, 0x54, 0x45, 0x56, 0x78, 0x9A, 0xBD, 0xCC, 0xCA, 0x98, 0x76, 0x55, - 0x55, 0x55, 0x67, 0x89, 0xAB, 0xCD, 0xCC, 0xB9, 0x87, 0x76, 0x55, 0x55, - 0x66, 0x78, 0x9A, 0xBD, 0xDD, 0xDB, 0xA9, 0x87, 0x76, 0x66, 0x67, 0x78, - 0x9A, 0xBB, 0xDD, 0xDD, 0xCB, 0xA9, 0x87, 0x77, 0x77, 0x78, 0x89, 0xAB, - 0xCD, 0xDD, 0xEC, 0xBA, 0xA9, 0x88, 0x88, 0x88, 0x99, 0xAA, 0xCC, 0xEE, - 0xEE, 0xDC, 0xBB, 0xA9, 0x99, 0x99, 0x9A, 0xAB, 0xCC, 0xDE, 0xEE, 0xFE, - 0xDC, 0xBB, 0xBA, 0xAA, 0xAA, 0xBB, 0xCC, 0xDD, 0xEE, 0xFF, 0xFE, 0xDD, - 0xCC, 0xBC, 0xBB, 0xBC, 0xCD, 0xDE, 0xEF, 0xEF, 0xFF, 0xFE, 0xED, 0xDD, - 0xCD, 0xCC, 0xCE, 0xDE, 0xFE, 0xFE, 0xAF, 0xFE, 0xEE, 0xDD, 0xDD, 0xCD, - 0xDD, 0xDE, 0xEE, 0xFF, 0xD0, 0x00, 0x00, 0x00, - ], - [ - 0xDE, 0xED, 0xDC, 0xCC, 0xCC, 0xCC, 0xCC, 0xDD, 0xEF, 0xFF, 0xCE, 0xFE, - 0xDD, 0xCC, 0xBB, 0xBB, 0xBC, 0xCD, 0xDE, 0xFF, 0xFF, 0xEE, 0xDC, 0xCB, - 0xAA, 0xAA, 0xAA, 0xAB, 0xBC, 0xDE, 0xFF, 0xFD, 0xDC, 0xBB, 0xA9, 0x99, - 0x99, 0x99, 0xAA, 0xBC, 0xDE, 0xFF, 0xDD, 0xCB, 0xA9, 0x98, 0x88, 0x88, - 0x89, 0x9A, 0xBC, 0xDE, 0xEC, 0xCB, 0xA9, 0x88, 0x77, 0x77, 0x77, 0x88, - 0x9A, 0xBC, 0xDE, 0xCC, 0xA9, 0x88, 0x76, 0x66, 0x66, 0x67, 0x89, 0xAB, - 0xCD, 0xDC, 0xBA, 0x98, 0x76, 0x65, 0x55, 0x56, 0x67, 0x89, 0xAB, 0xDD, - 0xCB, 0xA9, 0x87, 0x65, 0x55, 0x55, 0x56, 0x78, 0x9A, 0xBC, 0xDC, 0xBA, - 0x98, 0x76, 0x55, 0x55, 0x55, 0x67, 0x79, 0xAB, 0xCD, 0xCB, 0xA9, 0x87, - 0x65, 0x55, 0x55, 0x56, 0x77, 0x8A, 0xBC, 0xDC, 0xBA, 0x98, 0x76, 0x55, - 0x55, 0x55, 0x67, 0x89, 0xAB, 0xCD, 0xCC, 0xA9, 0x87, 0x66, 0x55, 0x55, - 0x66, 0x78, 0x9A, 0xBC, 0xDC, 0xCB, 0xA9, 0x87, 0x66, 0x66, 0x66, 0x78, - 0x89, 0xAB, 0xDD, 0xDD, 0xBA, 0x98, 0x87, 0x77, 0x77, 0x78, 0x89, 0xAB, - 0xCD, 0xDD, 0xDC, 0xBA, 0x99, 0x88, 0x77, 0x88, 0x89, 0xAB, 0xCD, 0xEE, - 0xEE, 0xDC, 0xBA, 0xA9, 0x98, 0x89, 0x99, 0xAA, 0xBC, 0xDE, 0xEE, 0xFE, - 0xDC, 0xBB, 0xAA, 0xAA, 0xAA, 0xAB, 0xCC, 0xDE, 0xFF, 0xFF, 0xFE, 0xDD, - 0xCB, 0xBB, 0xBB, 0xBB, 0xCD, 0xDE, 0xEF, 0xFF, 0xFF, 0xFF, 0xED, 0xDC, - 0xCC, 0xCD, 0xDD, 0xEE, 0xFF, 0xFF, 0xCF, 0xFF, 0xFE, 0xDD, 0xDD, 0xDD, - 0xDD, 0xDE, 0xEE, 0xFF, 0xD0, 0x00, 0x00, 0x00, - ], - [ - 0xDF, 0xFD, 0xDD, 0xCC, 0xCC, 0xCC, 0xCD, 0xEE, 0xFF, 0xFF, 0xBF, 0xFE, - 0xED, 0xCC, 0xCC, 0xBB, 0xCC, 0xDD, 0xDF, 0xFF, 0xFF, 0xFE, 0xED, 0xCB, - 0xBA, 0xAA, 0xAA, 0xBB, 0xCC, 0xEF, 0xFF, 0xFD, 0xED, 0xCB, 0xAA, 0x99, - 0x99, 0x99, 0xAB, 0xBC, 0xDE, 0xFF, 0xDD, 0xCB, 0xA9, 0x98, 0x88, 0x88, - 0x89, 0xAA, 0xBD, 0xDF, 0xFD, 0xDB, 0xA9, 0x98, 0x77, 0x77, 0x77, 0x89, - 0x9B, 0xCD, 0xFF, 0xCC, 0xBA, 0x98, 0x76, 0x66, 0x66, 0x77, 0x89, 0xAB, - 0xCD, 0xEC, 0xBB, 0x98, 0x77, 0x65, 0x55, 0x56, 0x67, 0x89, 0xBC, 0xDE, - 0xCB, 0xA9, 0x87, 0x65, 0x55, 0x55, 0x56, 0x78, 0x9A, 0xBD, 0xDC, 0xCA, - 0x98, 0x76, 0x55, 0x54, 0x55, 0x67, 0x89, 0xAB, 0xCD, 0xCB, 0xA9, 0x87, - 0x65, 0x55, 0x45, 0x56, 0x78, 0x9A, 0xBD, 0xDC, 0xCA, 0x98, 0x76, 0x55, - 0x55, 0x55, 0x67, 0x89, 0xAB, 0xDD, 0xDC, 0xA9, 0x87, 0x66, 0x55, 0x55, - 0x66, 0x78, 0x9A, 0xBD, 0xDD, 0xCB, 0xA9, 0x87, 0x66, 0x66, 0x66, 0x78, - 0x99, 0xBC, 0xDD, 0xDD, 0xCA, 0x99, 0x87, 0x77, 0x77, 0x78, 0x89, 0xAB, - 0xCD, 0xEE, 0xEC, 0xBA, 0x99, 0x88, 0x88, 0x88, 0x89, 0xAB, 0xCD, 0xDD, - 0xFF, 0xDC, 0xBA, 0xA9, 0x99, 0x99, 0x99, 0xAB, 0xBC, 0xDE, 0xFF, 0xFF, - 0xDD, 0xCB, 0xBA, 0xAA, 0xAA, 0xBB, 0xCD, 0xDE, 0xFF, 0xFF, 0xFE, 0xED, - 0xCC, 0xCB, 0xBB, 0xBC, 0xCD, 0xEE, 0xEF, 0xFF, 0xFF, 0xFF, 0xFE, 0xDD, - 0xDC, 0xDD, 0xDD, 0xEE, 0xFF, 0xFF, 0xCF, 0xFF, 0xFE, 0xEE, 0xDD, 0xDD, - 0xDD, 0xDE, 0xEF, 0xFF, 0xD0, 0x00, 0x00, 0x00, - ], - [ - 0xCF, 0xEE, 0xEE, 0xDD, 0xDE, 0xDE, 0xEE, 0xEE, 0xFE, 0xEF, 0xAF, 0xFF, - 0xFE, 0xED, 0xDD, 0xDD, 0xDE, 0xEF, 0xFF, 0xFF, 0xFF, 0xEF, 0xFE, 0xDC, - 0xCC, 0xCB, 0xBC, 0xCD, 0xDE, 0xFF, 0xFF, 0xFE, 0xFE, 0xDC, 0xBB, 0xAA, - 0xAA, 0xAB, 0xCC, 0xDE, 0xFF, 0xFF, 0xEE, 0xDC, 0xBA, 0xA9, 0x99, 0x99, - 0x9A, 0xBC, 0xDE, 0xFF, 0xFE, 0xEC, 0xBA, 0x99, 0x87, 0x77, 0x88, 0x9A, - 0xBC, 0xDF, 0xFF, 0xED, 0xCB, 0xA9, 0x87, 0x66, 0x66, 0x78, 0x9A, 0xBD, - 0xEF, 0xFD, 0xDC, 0xA9, 0x87, 0x65, 0x55, 0x66, 0x78, 0x9B, 0xCD, 0xFF, - 0xDD, 0xBA, 0x98, 0x66, 0x54, 0x45, 0x56, 0x89, 0xAC, 0xDE, 0xED, 0xDB, - 0xA9, 0x76, 0x54, 0x44, 0x45, 0x67, 0x9A, 0xBD, 0xEE, 0xED, 0xBA, 0x97, - 0x65, 0x44, 0x44, 0x56, 0x78, 0xAB, 0xDE, 0xFE, 0xDC, 0xA9, 0x87, 0x65, - 0x44, 0x55, 0x67, 0x9A, 0xBD, 0xEE, 0xED, 0xCB, 0x98, 0x76, 0x55, 0x55, - 0x67, 0x89, 0xAC, 0xDE, 0xEE, 0xED, 0xBA, 0x98, 0x76, 0x66, 0x67, 0x78, - 0x9B, 0xCD, 0xFE, 0xFF, 0xDC, 0xBA, 0x98, 0x87, 0x77, 0x88, 0x9A, 0xBC, - 0xDF, 0xFF, 0xFE, 0xDC, 0xBA, 0x99, 0x98, 0x99, 0x9A, 0xBC, 0xDF, 0xFF, - 0xFF, 0xFE, 0xDC, 0xBB, 0xAA, 0xAA, 0xAB, 0xBC, 0xDE, 0xFF, 0xFF, 0xFF, - 0xFE, 0xDD, 0xCC, 0xBB, 0xBB, 0xCC, 0xDD, 0xEF, 0xFF, 0xFF, 0xFF, 0xFE, - 0xEE, 0xDD, 0xDC, 0xDD, 0xDE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xEE, - 0xEE, 0xEE, 0xEF, 0xFF, 0xFF, 0xFF, 0xCF, 0xFF, 0xFF, 0xFF, 0xFE, 0xEE, - 0xEE, 0xFF, 0xFF, 0xFF, 0xC0, 0x00, 0x00, 0x00, - ], - [ - 0xBC, 0xCC, 0xBB, 0xBA, 0xAA, 0xAA, 0xBB, 0xBC, 0xCD, 0xDE, 0xBC, 0xDC, - 0xCB, 0xBB, 0xAA, 0xAA, 0xAB, 0xBB, 0xCD, 0xDE, 0xFE, 0xCC, 0xCB, 0xBA, - 0xAA, 0x99, 0x99, 0xAA, 0xBB, 0xCC, 0xDE, 0xEB, 0xCB, 0xAA, 0x99, 0x98, - 0x88, 0x99, 0x9A, 0xAB, 0xCD, 0xDD, 0xBB, 0xBA, 0x99, 0x88, 0x88, 0x88, - 0x88, 0x9A, 0xAB, 0xCD, 0xDB, 0xBA, 0x99, 0x88, 0x77, 0x77, 0x77, 0x88, - 0x9A, 0xAB, 0xCC, 0xAB, 0xA9, 0x88, 0x77, 0x66, 0x66, 0x77, 0x88, 0x9A, - 0xBC, 0xCA, 0xAA, 0x98, 0x77, 0x66, 0x66, 0x66, 0x77, 0x89, 0xAB, 0xCC, - 0xAA, 0x99, 0x87, 0x66, 0x55, 0x55, 0x66, 0x78, 0x89, 0xAB, 0xBA, 0xA9, - 0x88, 0x76, 0x65, 0x44, 0x55, 0x67, 0x88, 0x9A, 0xBB, 0xAA, 0x98, 0x87, - 0x66, 0x54, 0x45, 0x56, 0x77, 0x89, 0xAB, 0xBB, 0xA9, 0x98, 0x76, 0x65, - 0x55, 0x56, 0x67, 0x88, 0x9A, 0xBB, 0xBB, 0xA9, 0x87, 0x76, 0x65, 0x56, - 0x66, 0x78, 0x99, 0xAB, 0xBB, 0xBA, 0x98, 0x87, 0x76, 0x66, 0x67, 0x77, - 0x89, 0xAA, 0xBB, 0xBB, 0xBA, 0x98, 0x87, 0x77, 0x77, 0x77, 0x89, 0x9A, - 0xBC, 0xCC, 0xCB, 0xAA, 0x98, 0x88, 0x87, 0x88, 0x89, 0x9A, 0xBB, 0xCC, - 0xCD, 0xCB, 0xAA, 0x99, 0x88, 0x88, 0x99, 0x9A, 0xAB, 0xCC, 0xCD, 0xDD, - 0xCB, 0xAA, 0xA9, 0x99, 0x99, 0xAA, 0xAB, 0xCC, 0xDD, 0xDE, 0xDC, 0xCB, - 0xBB, 0xAA, 0xAA, 0xAB, 0xBB, 0xCC, 0xDE, 0xDE, 0xFE, 0xED, 0xCC, 0xBB, - 0xBB, 0xBB, 0xBC, 0xCD, 0xDE, 0xED, 0xAE, 0xDD, 0xDC, 0xCC, 0xBB, 0xBB, - 0xBB, 0xCC, 0xCD, 0xDD, 0xB0, 0x00, 0x00, 0x00, - ], - [ - 0xAB, 0xBA, 0xAA, 0x99, 0x99, 0x99, 0x9A, 0xAA, 0xBB, 0xCC, 0xAB, 0xCB, - 0xBA, 0xAA, 0x99, 0x99, 0x9A, 0xAA, 0xBB, 0xCC, 0xDD, 0xBB, 0xBA, 0xA9, - 0x99, 0x98, 0x89, 0x99, 0xAA, 0xBB, 0xCD, 0xCA, 0xBA, 0xA9, 0x98, 0x88, - 0x88, 0x88, 0x89, 0x9A, 0xBB, 0xCC, 0xAB, 0xA9, 0x98, 0x87, 0x77, 0x77, - 0x88, 0x89, 0x9A, 0xBB, 0xBA, 0xA9, 0x98, 0x87, 0x77, 0x77, 0x77, 0x78, - 0x89, 0x9A, 0xBB, 0x9A, 0x98, 0x87, 0x77, 0x66, 0x66, 0x67, 0x78, 0x89, - 0xAB, 0xA9, 0x99, 0x87, 0x77, 0x66, 0x66, 0x66, 0x67, 0x88, 0x9A, 0xAA, - 0x99, 0x98, 0x77, 0x66, 0x66, 0x66, 0x66, 0x77, 0x89, 0x9A, 0xA9, 0x99, - 0x87, 0x76, 0x66, 0x55, 0x56, 0x67, 0x78, 0x89, 0xAA, 0x99, 0x98, 0x77, - 0x66, 0x65, 0x55, 0x66, 0x77, 0x88, 0x9A, 0xA9, 0x99, 0x87, 0x76, 0x66, - 0x65, 0x66, 0x67, 0x78, 0x99, 0xAA, 0x9A, 0x98, 0x87, 0x76, 0x66, 0x66, - 0x66, 0x77, 0x89, 0x9A, 0xAA, 0xA9, 0x88, 0x77, 0x66, 0x66, 0x66, 0x77, - 0x88, 0x9A, 0xAA, 0xAA, 0xA9, 0x88, 0x77, 0x77, 0x77, 0x77, 0x88, 0x99, - 0xAB, 0xAA, 0xBA, 0x99, 0x88, 0x77, 0x77, 0x77, 0x88, 0x89, 0xAA, 0xBB, - 0xBB, 0xBA, 0x99, 0x88, 0x88, 0x88, 0x88, 0x99, 0xAA, 0xBB, 0xBB, 0xCB, - 0xAA, 0xA9, 0x99, 0x88, 0x89, 0x99, 0xAA, 0xBB, 0xCB, 0xCD, 0xCB, 0xAA, - 0xA9, 0x99, 0x99, 0x9A, 0xAA, 0xBB, 0xCC, 0xCD, 0xDC, 0xCB, 0xBB, 0xAA, - 0xAA, 0xAA, 0xAB, 0xBC, 0xCD, 0xDC, 0xAC, 0xCC, 0xBB, 0xAA, 0xAA, 0xAA, - 0xAA, 0xAB, 0xBB, 0xCC, 0xB0, 0x00, 0x00, 0x00, - ], - [ - 0xAB, 0xBA, 0xA9, 0x99, 0x99, 0x99, 0x99, 0xAA, 0xAB, 0xCC, 0xAB, 0xCB, - 0xBA, 0xAA, 0x99, 0x99, 0x99, 0xAA, 0xAB, 0xCC, 0xDC, 0xBB, 0xBA, 0xA9, - 0x99, 0x88, 0x88, 0x99, 0x9A, 0xAB, 0xCC, 0xCA, 0xBA, 0x99, 0x98, 0x88, - 0x88, 0x88, 0x89, 0x9A, 0xAB, 0xBB, 0xAA, 0xA9, 0x88, 0x87, 0x77, 0x77, - 0x78, 0x89, 0x9A, 0xAB, 0xB9, 0xA9, 0x98, 0x87, 0x77, 0x77, 0x77, 0x78, - 0x89, 0x9A, 0xBB, 0x9A, 0x98, 0x87, 0x76, 0x66, 0x66, 0x77, 0x78, 0x89, - 0xAA, 0xA9, 0x99, 0x87, 0x76, 0x66, 0x66, 0x66, 0x67, 0x78, 0x99, 0xAA, - 0x99, 0x88, 0x77, 0x66, 0x66, 0x66, 0x66, 0x77, 0x88, 0x9A, 0xA9, 0x98, - 0x87, 0x76, 0x66, 0x65, 0x66, 0x67, 0x78, 0x89, 0xAA, 0x99, 0x88, 0x77, - 0x66, 0x65, 0x56, 0x66, 0x77, 0x88, 0x9A, 0xA9, 0x99, 0x87, 0x76, 0x66, - 0x66, 0x66, 0x67, 0x78, 0x89, 0xAA, 0x99, 0x98, 0x77, 0x76, 0x66, 0x66, - 0x66, 0x77, 0x89, 0x9A, 0xA9, 0xA9, 0x88, 0x77, 0x76, 0x66, 0x66, 0x77, - 0x88, 0x99, 0xAA, 0xAA, 0x99, 0x88, 0x77, 0x77, 0x77, 0x77, 0x78, 0x89, - 0xAB, 0xAA, 0xAA, 0x99, 0x88, 0x77, 0x77, 0x77, 0x88, 0x89, 0x9A, 0xBA, - 0xBB, 0xAA, 0x99, 0x88, 0x88, 0x88, 0x88, 0x89, 0x9A, 0xBB, 0xBB, 0xCB, - 0xAA, 0x99, 0x98, 0x88, 0x88, 0x99, 0x9A, 0xBB, 0xCB, 0xCC, 0xCB, 0xAA, - 0xA9, 0x99, 0x99, 0x99, 0xAA, 0xBB, 0xCC, 0xCC, 0xDC, 0xCB, 0xBA, 0xAA, - 0xAA, 0xAA, 0xAA, 0xBB, 0xCD, 0xDC, 0xBC, 0xCB, 0xBA, 0xAA, 0xAA, 0xAA, - 0xAA, 0xAA, 0xBB, 0xCC, 0xB0, 0x00, 0x00, 0x00, - ], - [ - 0xAB, 0xBB, 0xAA, 0x99, 0x99, 0x99, 0x9A, 0xAA, 0xBB, 0xCC, 0xAB, 0xCC, - 0xBB, 0xAA, 0x99, 0x99, 0xAA, 0xAA, 0xBB, 0xCD, 0xDC, 0xBC, 0xBB, 0xA9, - 0x99, 0x99, 0x99, 0x99, 0xAA, 0xBB, 0xCD, 0xCA, 0xBA, 0xA9, 0x98, 0x88, - 0x88, 0x88, 0x89, 0x9A, 0xBB, 0xCC, 0xAB, 0xA9, 0x98, 0x87, 0x77, 0x77, - 0x88, 0x89, 0x9A, 0xBB, 0xBA, 0xAA, 0x98, 0x87, 0x77, 0x77, 0x77, 0x78, - 0x89, 0xAA, 0xBB, 0x9A, 0x98, 0x87, 0x77, 0x66, 0x66, 0x67, 0x78, 0x89, - 0xAB, 0xA9, 0xA9, 0x88, 0x77, 0x66, 0x66, 0x66, 0x67, 0x88, 0x9A, 0xAA, - 0x99, 0x98, 0x77, 0x66, 0x66, 0x56, 0x66, 0x77, 0x89, 0x9A, 0xA9, 0x99, - 0x87, 0x76, 0x66, 0x55, 0x56, 0x67, 0x78, 0x99, 0xAA, 0x99, 0x98, 0x77, - 0x66, 0x65, 0x55, 0x66, 0x77, 0x88, 0x9A, 0xA9, 0xA9, 0x87, 0x76, 0x66, - 0x56, 0x66, 0x67, 0x78, 0x99, 0xAA, 0x9A, 0x98, 0x87, 0x66, 0x66, 0x66, - 0x66, 0x77, 0x89, 0x9A, 0xAA, 0xA9, 0x88, 0x77, 0x66, 0x66, 0x66, 0x77, - 0x88, 0x9A, 0xAA, 0xAA, 0xA9, 0x88, 0x77, 0x77, 0x77, 0x77, 0x88, 0x99, - 0xAB, 0xAA, 0xBA, 0x99, 0x88, 0x77, 0x77, 0x77, 0x88, 0x99, 0xAA, 0xBB, - 0xBB, 0xBA, 0x99, 0x88, 0x88, 0x88, 0x88, 0x99, 0xAA, 0xBC, 0xBB, 0xCB, - 0xAA, 0xA9, 0x99, 0x88, 0x99, 0x99, 0xAA, 0xBB, 0xCB, 0xCD, 0xCC, 0xBA, - 0xAA, 0xA9, 0x99, 0x9A, 0xAA, 0xBB, 0xCD, 0xCC, 0xDC, 0xCC, 0xBB, 0xAA, - 0xAA, 0xAA, 0xAB, 0xBB, 0xCC, 0xDC, 0xAD, 0xCC, 0xBB, 0xAA, 0xAA, 0xAA, - 0xAA, 0xAB, 0xBB, 0xCC, 0xB0, 0x00, 0x00, 0x00, - ], - [ - 0xBC, 0xCB, 0xBB, 0xAA, 0xAA, 0xAA, 0xAB, 0xBC, 0xCC, 0xDD, 0xAC, 0xDC, - 0xCB, 0xBA, 0xAA, 0xAA, 0xAA, 0xBB, 0xCC, 0xDE, 0xEE, 0xCC, 0xCB, 0xAA, - 0xA9, 0x99, 0x99, 0xAA, 0xAB, 0xBC, 0xDE, 0xEB, 0xCB, 0xAA, 0x99, 0x98, - 0x88, 0x89, 0x9A, 0xAB, 0xBC, 0xDD, 0xBB, 0xAA, 0x99, 0x88, 0x87, 0x78, - 0x88, 0x99, 0xAB, 0xCD, 0xCB, 0xBA, 0x99, 0x87, 0x77, 0x77, 0x77, 0x88, - 0x99, 0xAB, 0xCC, 0xAB, 0xA9, 0x87, 0x77, 0x66, 0x66, 0x77, 0x88, 0x9A, - 0xBC, 0xCA, 0xA9, 0x98, 0x77, 0x66, 0x56, 0x66, 0x77, 0x89, 0x9A, 0xBB, - 0xAA, 0x98, 0x87, 0x66, 0x55, 0x55, 0x66, 0x78, 0x89, 0xAB, 0xBA, 0xA9, - 0x87, 0x76, 0x55, 0x55, 0x55, 0x67, 0x78, 0x9A, 0xBB, 0xAA, 0x98, 0x77, - 0x65, 0x55, 0x55, 0x56, 0x77, 0x89, 0xAB, 0xBA, 0xA9, 0x88, 0x76, 0x65, - 0x55, 0x56, 0x67, 0x78, 0x9A, 0xBB, 0xAA, 0xA9, 0x87, 0x76, 0x65, 0x56, - 0x66, 0x78, 0x89, 0xAB, 0xBB, 0xBA, 0x98, 0x87, 0x76, 0x66, 0x66, 0x77, - 0x89, 0xAA, 0xBB, 0xBB, 0xAA, 0x98, 0x87, 0x77, 0x77, 0x77, 0x88, 0x9A, - 0xBC, 0xBC, 0xCB, 0xA9, 0x98, 0x88, 0x77, 0x78, 0x89, 0x9A, 0xAB, 0xCC, - 0xCC, 0xCB, 0xA9, 0x99, 0x88, 0x88, 0x89, 0x9A, 0xAB, 0xCC, 0xCD, 0xDC, - 0xBB, 0xAA, 0x99, 0x99, 0x99, 0x9A, 0xAB, 0xBC, 0xDD, 0xDE, 0xDC, 0xCB, - 0xBA, 0xAA, 0xAA, 0xAA, 0xBB, 0xCC, 0xDE, 0xDE, 0xEE, 0xDD, 0xCC, 0xBB, - 0xBB, 0xBB, 0xBC, 0xCC, 0xDE, 0xED, 0xBE, 0xDD, 0xCC, 0xCB, 0xBB, 0xBB, - 0xBB, 0xBC, 0xCC, 0xDE, 0xC0, 0x00, 0x00, 0x00, - ], - [ - 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xBF, 0xFF, - 0xFF, 0xFE, 0xED, 0xDE, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xED, - 0xCC, 0xCC, 0xCC, 0xDD, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xEC, 0xCB, 0xBA, - 0xAA, 0xBB, 0xCD, 0xEF, 0xFF, 0xFF, 0xFF, 0xDD, 0xBB, 0xA9, 0x99, 0x99, - 0xAA, 0xBD, 0xEF, 0xFF, 0xFF, 0xFD, 0xCB, 0xA9, 0x88, 0x77, 0x88, 0x9A, - 0xCD, 0xFF, 0xFF, 0xFE, 0xDB, 0xA9, 0x87, 0x66, 0x67, 0x78, 0x9A, 0xCD, - 0xFF, 0xFF, 0xDC, 0xB9, 0x87, 0x65, 0x55, 0x56, 0x78, 0xAB, 0xDF, 0xFF, - 0xFD, 0xCA, 0x98, 0x65, 0x54, 0x45, 0x56, 0x89, 0xBC, 0xEF, 0xFE, 0xDC, - 0xA9, 0x76, 0x54, 0x44, 0x45, 0x67, 0x9A, 0xCD, 0xFF, 0xFE, 0xCA, 0x97, - 0x65, 0x44, 0x44, 0x56, 0x79, 0xAC, 0xDF, 0xFF, 0xEC, 0xB9, 0x87, 0x55, - 0x44, 0x55, 0x67, 0x9A, 0xCD, 0xFF, 0xFF, 0xDB, 0xA8, 0x76, 0x55, 0x55, - 0x67, 0x89, 0xAC, 0xDF, 0xFF, 0xFD, 0xCB, 0x98, 0x76, 0x66, 0x67, 0x89, - 0xAB, 0xCF, 0xFF, 0xFF, 0xFD, 0xCA, 0x98, 0x87, 0x77, 0x89, 0x9A, 0xCD, - 0xFF, 0xFF, 0xFF, 0xEC, 0xBB, 0xA9, 0x99, 0x99, 0xAA, 0xBC, 0xDF, 0xFF, - 0xFF, 0xFF, 0xDD, 0xCB, 0xBA, 0xAA, 0xAB, 0xCC, 0xDF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFE, 0xDC, 0xCC, 0xCC, 0xCD, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFD, 0xDD, 0xDE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xAF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xE0, 0x00, 0x00, 0x00, - ], - [ - 0xCE, 0xED, 0xDD, 0xDC, 0xCC, 0xCC, 0xCD, 0xDE, 0xEE, 0xDE, 0xAF, 0xFE, - 0xDD, 0xDC, 0xCC, 0xCC, 0xCC, 0xDD, 0xEF, 0xFF, 0xFF, 0xEF, 0xDD, 0xCB, - 0xBB, 0xAA, 0xAB, 0xBB, 0xCD, 0xEE, 0xFF, 0xEE, 0xED, 0xCB, 0xAA, 0x99, - 0x99, 0x9A, 0xAB, 0xCD, 0xEE, 0xFF, 0xDD, 0xCB, 0xA9, 0x98, 0x88, 0x88, - 0x99, 0xAB, 0xCD, 0xEF, 0xED, 0xDC, 0xA9, 0x98, 0x77, 0x77, 0x77, 0x89, - 0xAB, 0xCE, 0xEE, 0xCC, 0xBA, 0x98, 0x77, 0x66, 0x66, 0x77, 0x89, 0xAB, - 0xDE, 0xEC, 0xCB, 0x98, 0x76, 0x65, 0x55, 0x56, 0x78, 0x9A, 0xBC, 0xDD, - 0xCC, 0xA9, 0x87, 0x65, 0x55, 0x55, 0x56, 0x78, 0x9B, 0xCD, 0xDC, 0xCA, - 0x98, 0x76, 0x55, 0x44, 0x55, 0x67, 0x89, 0xAC, 0xDD, 0xCC, 0xA9, 0x87, - 0x65, 0x54, 0x45, 0x56, 0x78, 0x9A, 0xCD, 0xDC, 0xCB, 0x98, 0x76, 0x55, - 0x55, 0x55, 0x67, 0x89, 0xAC, 0xDE, 0xDC, 0xBA, 0x98, 0x76, 0x55, 0x55, - 0x66, 0x78, 0x9B, 0xCD, 0xDD, 0xDB, 0xA9, 0x87, 0x76, 0x66, 0x66, 0x78, - 0x9A, 0xBC, 0xDD, 0xDD, 0xCB, 0xA9, 0x87, 0x77, 0x77, 0x78, 0x99, 0xAB, - 0xDE, 0xED, 0xED, 0xCB, 0xA9, 0x98, 0x88, 0x88, 0x99, 0xAB, 0xCD, 0xEE, - 0xDE, 0xEC, 0xCB, 0xAA, 0x99, 0x99, 0x9A, 0xAB, 0xCC, 0xEF, 0xEE, 0xFE, - 0xED, 0xCB, 0xBB, 0xAA, 0xAB, 0xBB, 0xCD, 0xEF, 0xFF, 0xFF, 0xFF, 0xED, - 0xDC, 0xCC, 0xCC, 0xCC, 0xCD, 0xEF, 0xFF, 0xFE, 0xFF, 0xFF, 0xEE, 0xED, - 0xDD, 0xDD, 0xDE, 0xEE, 0xFF, 0xFF, 0xAF, 0xEE, 0xEE, 0xED, 0xDD, 0xDD, - 0xDD, 0xED, 0xEF, 0xFF, 0xD0, 0x00, 0x00, 0x00, - ], - [ - 0xCE, 0xDD, 0xCC, 0xCC, 0xCC, 0xBC, 0xCC, 0xDD, 0xDD, 0xEE, 0xBE, 0xFE, - 0xDD, 0xCC, 0xBB, 0xBB, 0xBC, 0xCD, 0xEE, 0xFF, 0xFE, 0xDE, 0xDC, 0xCB, - 0xBA, 0xAA, 0xAA, 0xBB, 0xCC, 0xDE, 0xFF, 0xED, 0xDC, 0xCB, 0xAA, 0x99, - 0x99, 0x99, 0xAB, 0xBC, 0xDE, 0xFE, 0xDD, 0xCB, 0xA9, 0x98, 0x88, 0x88, - 0x89, 0xAB, 0xCC, 0xDE, 0xDC, 0xCB, 0xA9, 0x88, 0x77, 0x77, 0x77, 0x89, - 0xAB, 0xCD, 0xED, 0xCC, 0xBA, 0x98, 0x77, 0x66, 0x66, 0x77, 0x89, 0xAB, - 0xCD, 0xDC, 0xBA, 0x98, 0x77, 0x65, 0x55, 0x66, 0x77, 0x8A, 0xBC, 0xDD, - 0xBC, 0xA9, 0x87, 0x65, 0x55, 0x55, 0x56, 0x78, 0x9A, 0xBD, 0xDC, 0xBA, - 0x98, 0x76, 0x55, 0x44, 0x55, 0x67, 0x89, 0xAB, 0xCD, 0xCB, 0xA9, 0x87, - 0x65, 0x54, 0x45, 0x56, 0x78, 0x9A, 0xBC, 0xCC, 0xBA, 0x98, 0x76, 0x65, - 0x55, 0x55, 0x67, 0x89, 0xAB, 0xCC, 0xCC, 0xB9, 0x87, 0x76, 0x55, 0x55, - 0x66, 0x78, 0x9A, 0xBD, 0xDC, 0xCB, 0xA9, 0x87, 0x76, 0x66, 0x66, 0x78, - 0x9A, 0xBC, 0xDD, 0xDD, 0xCB, 0xA9, 0x87, 0x77, 0x77, 0x78, 0x89, 0xAB, - 0xCD, 0xDD, 0xDD, 0xBA, 0xA9, 0x88, 0x88, 0x88, 0x99, 0xAB, 0xCD, 0xDD, - 0xDE, 0xDC, 0xBB, 0xA9, 0x99, 0x99, 0x9A, 0xAB, 0xBC, 0xDE, 0xED, 0xEE, - 0xDC, 0xCB, 0xBA, 0xAA, 0xAA, 0xAB, 0xCC, 0xDE, 0xFE, 0xEF, 0xFE, 0xDD, - 0xCC, 0xCB, 0xBB, 0xBC, 0xCC, 0xDE, 0xEF, 0xEE, 0xFF, 0xEE, 0xED, 0xDC, - 0xCC, 0xDD, 0xDD, 0xDE, 0xFF, 0xFF, 0xBE, 0xEE, 0xED, 0xDD, 0xDD, 0xCD, - 0xCD, 0xDD, 0xEE, 0xEF, 0xD0, 0x00, 0x00, 0x00, - ], - [ - 0xCE, 0xED, 0xDD, 0xCC, 0xCC, 0xDC, 0xDD, 0xDE, 0xEF, 0xEF, 0xAE, 0xFE, - 0xED, 0xDC, 0xCC, 0xCC, 0xCC, 0xDE, 0xEF, 0xFF, 0xFE, 0xEE, 0xDD, 0xDB, - 0xBB, 0xBA, 0xAB, 0xBC, 0xCD, 0xEE, 0xFF, 0xED, 0xED, 0xCB, 0xAA, 0x99, - 0x99, 0x9A, 0xBB, 0xCD, 0xEF, 0xFE, 0xDD, 0xCB, 0xAA, 0x98, 0x88, 0x88, - 0x99, 0xAB, 0xCD, 0xEF, 0xED, 0xDB, 0xB9, 0x98, 0x77, 0x77, 0x78, 0x89, - 0xAB, 0xCD, 0xEE, 0xCC, 0xBA, 0x98, 0x76, 0x66, 0x66, 0x77, 0x89, 0xAC, - 0xDE, 0xDC, 0xCB, 0x98, 0x76, 0x65, 0x55, 0x56, 0x77, 0x9A, 0xBC, 0xED, - 0xCC, 0xB9, 0x87, 0x65, 0x55, 0x55, 0x56, 0x78, 0x9B, 0xCD, 0xDC, 0xCA, - 0x98, 0x76, 0x55, 0x44, 0x55, 0x67, 0x89, 0xBC, 0xDD, 0xCC, 0xA9, 0x87, - 0x65, 0x54, 0x45, 0x56, 0x78, 0x9A, 0xBD, 0xDC, 0xCB, 0x98, 0x76, 0x55, - 0x55, 0x55, 0x67, 0x89, 0xAC, 0xDD, 0xDC, 0xBA, 0x98, 0x76, 0x55, 0x55, - 0x66, 0x78, 0x9A, 0xCD, 0xDD, 0xDC, 0xB9, 0x87, 0x76, 0x66, 0x66, 0x78, - 0x9A, 0xBC, 0xDD, 0xDE, 0xDB, 0xA9, 0x88, 0x77, 0x77, 0x78, 0x99, 0xAB, - 0xDD, 0xEE, 0xED, 0xCB, 0xA9, 0x98, 0x88, 0x88, 0x99, 0xAB, 0xCD, 0xEE, - 0xFF, 0xED, 0xCB, 0xAA, 0x99, 0x99, 0x9A, 0xAB, 0xCD, 0xDE, 0xEE, 0xFF, - 0xDD, 0xCC, 0xBB, 0xAA, 0xAB, 0xBB, 0xCC, 0xDE, 0xEE, 0xFF, 0xFE, 0xED, - 0xDC, 0xCB, 0xCC, 0xCC, 0xCD, 0xEE, 0xFF, 0xEE, 0xFF, 0xFF, 0xFE, 0xED, - 0xDD, 0xDD, 0xDE, 0xEE, 0xEF, 0xFF, 0xAE, 0xEE, 0xEE, 0xED, 0xED, 0xDD, - 0xDD, 0xDE, 0xEE, 0xFE, 0xD0, 0x00, 0x00, 0x00, - ], - [ - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xAF, 0xFF, - 0xFF, 0xFF, 0xED, 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, - 0xCC, 0xCC, 0xCC, 0xDD, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xDD, 0xCB, 0xBA, - 0xAA, 0xBB, 0xCD, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xBB, 0xA9, 0x99, 0x99, - 0xAB, 0xBD, 0xFF, 0xFF, 0xFF, 0xFD, 0xCA, 0xA9, 0x87, 0x77, 0x88, 0x9A, - 0xBD, 0xFF, 0xFF, 0xFD, 0xCB, 0xA9, 0x87, 0x66, 0x67, 0x78, 0x9A, 0xCD, - 0xFF, 0xFF, 0xFC, 0xB9, 0x87, 0x65, 0x55, 0x56, 0x78, 0xAB, 0xDF, 0xFF, - 0xFD, 0xCA, 0x97, 0x65, 0x54, 0x45, 0x56, 0x89, 0xAC, 0xFF, 0xFF, 0xDC, - 0xA9, 0x76, 0x54, 0x44, 0x45, 0x67, 0x9A, 0xCF, 0xFF, 0xFD, 0xCA, 0x97, - 0x65, 0x44, 0x44, 0x56, 0x79, 0xAC, 0xDF, 0xFF, 0xFC, 0xB9, 0x86, 0x65, - 0x44, 0x55, 0x67, 0x9A, 0xCD, 0xFF, 0xFF, 0xDB, 0xA8, 0x76, 0x55, 0x55, - 0x67, 0x89, 0xAC, 0xEF, 0xFF, 0xFF, 0xCA, 0x98, 0x76, 0x66, 0x67, 0x89, - 0xAB, 0xCF, 0xFF, 0xFF, 0xFD, 0xBA, 0x98, 0x87, 0x77, 0x89, 0x9B, 0xCD, - 0xFF, 0xFF, 0xFF, 0xFC, 0xBA, 0xA9, 0x99, 0x99, 0xAB, 0xBC, 0xFF, 0xFF, - 0xFF, 0xFF, 0xED, 0xCB, 0xBA, 0xAA, 0xAB, 0xCD, 0xEF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFD, 0xDC, 0xCC, 0xCC, 0xCD, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFD, 0xDD, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00, 0x00, - ], - [ - 0xCE, 0xDD, 0xCC, 0xCC, 0xBC, 0xBC, 0xCC, 0xDD, 0xDE, 0xEE, 0xAE, 0xEE, - 0xDD, 0xCC, 0xBB, 0xBB, 0xCC, 0xCD, 0xDE, 0xFF, 0xFE, 0xDE, 0xDC, 0xCB, - 0xBA, 0xAA, 0xAA, 0xBB, 0xCD, 0xDE, 0xEF, 0xED, 0xDC, 0xBB, 0xAA, 0x99, - 0x99, 0x9A, 0xAB, 0xBC, 0xDE, 0xFE, 0xCD, 0xCB, 0xA9, 0x98, 0x88, 0x88, - 0x99, 0xAB, 0xCD, 0xDF, 0xEC, 0xCB, 0xA9, 0x88, 0x77, 0x77, 0x78, 0x89, - 0xAB, 0xCD, 0xEE, 0xCC, 0xBA, 0x98, 0x77, 0x66, 0x66, 0x77, 0x89, 0xAB, - 0xCD, 0xDB, 0xBA, 0x98, 0x77, 0x65, 0x55, 0x66, 0x78, 0x9A, 0xBC, 0xDD, - 0xBB, 0xA9, 0x87, 0x65, 0x55, 0x55, 0x66, 0x78, 0x9A, 0xBD, 0xDB, 0xBA, - 0x98, 0x76, 0x55, 0x44, 0x55, 0x67, 0x89, 0xAB, 0xCC, 0xCB, 0xA9, 0x87, - 0x65, 0x54, 0x44, 0x56, 0x78, 0x9A, 0xBC, 0xDC, 0xBA, 0x98, 0x76, 0x65, - 0x54, 0x55, 0x67, 0x89, 0xAB, 0xCC, 0xCC, 0xBA, 0x98, 0x76, 0x65, 0x55, - 0x67, 0x78, 0x9A, 0xBC, 0xCC, 0xCB, 0xA9, 0x87, 0x76, 0x66, 0x66, 0x78, - 0x9A, 0xAC, 0xDD, 0xDD, 0xCB, 0xA9, 0x88, 0x77, 0x77, 0x78, 0x89, 0xAB, - 0xCD, 0xDD, 0xDD, 0xCB, 0xA9, 0x98, 0x88, 0x88, 0x99, 0xAB, 0xBC, 0xED, - 0xEE, 0xDC, 0xCB, 0xAA, 0x99, 0x99, 0x9A, 0xAB, 0xBC, 0xDE, 0xEE, 0xFE, - 0xDC, 0xCB, 0xBA, 0xAA, 0xAA, 0xBB, 0xBC, 0xDD, 0xEE, 0xEF, 0xFE, 0xDD, - 0xCC, 0xCB, 0xBB, 0xBC, 0xCD, 0xDD, 0xEF, 0xEE, 0xFF, 0xFE, 0xED, 0xDD, - 0xCC, 0xCC, 0xDD, 0xEE, 0xEF, 0xFE, 0x9E, 0xED, 0xDD, 0xDD, 0xDC, 0xCC, - 0xDD, 0xDD, 0xDE, 0xEF, 0xC0, 0x00, 0x00, 0x00, - ], - [ - 0xAC, 0xBB, 0xBA, 0xAA, 0xAA, 0xAA, 0xAA, 0xBB, 0xCC, 0xCD, 0x9C, 0xDC, - 0xBB, 0xBB, 0xAA, 0xAA, 0xAA, 0xBB, 0xCC, 0xDE, 0xED, 0xBC, 0xCB, 0xAA, - 0xA9, 0x99, 0x99, 0x9A, 0xAB, 0xBC, 0xDD, 0xDB, 0xBB, 0xAA, 0x99, 0x98, - 0x88, 0x89, 0x99, 0xAB, 0xBC, 0xDC, 0xBB, 0xAA, 0x99, 0x88, 0x87, 0x78, - 0x88, 0x99, 0xAB, 0xBC, 0xCA, 0xBA, 0x99, 0x87, 0x77, 0x77, 0x77, 0x88, - 0x99, 0xAB, 0xCC, 0xAB, 0xA9, 0x87, 0x76, 0x66, 0x66, 0x67, 0x78, 0x9A, - 0xAC, 0xCA, 0xA9, 0x98, 0x76, 0x66, 0x66, 0x66, 0x77, 0x89, 0x9A, 0xBB, - 0xAA, 0x98, 0x77, 0x66, 0x55, 0x55, 0x66, 0x78, 0x89, 0xAB, 0xBA, 0xA9, - 0x87, 0x76, 0x65, 0x55, 0x55, 0x67, 0x78, 0x9A, 0xBB, 0xAA, 0x98, 0x77, - 0x66, 0x55, 0x55, 0x56, 0x77, 0x89, 0xAB, 0xBA, 0xA9, 0x88, 0x76, 0x65, - 0x55, 0x56, 0x67, 0x78, 0x9A, 0xBB, 0xAA, 0x99, 0x87, 0x76, 0x65, 0x56, - 0x66, 0x78, 0x89, 0xAB, 0xBA, 0xBA, 0x98, 0x87, 0x76, 0x66, 0x66, 0x77, - 0x89, 0xAA, 0xBB, 0xBB, 0xA9, 0x98, 0x87, 0x77, 0x77, 0x77, 0x88, 0x9A, - 0xBC, 0xBB, 0xBB, 0xA9, 0x98, 0x88, 0x77, 0x78, 0x88, 0x9A, 0xAB, 0xCB, - 0xBC, 0xBB, 0xAA, 0x99, 0x88, 0x88, 0x89, 0x9A, 0xAB, 0xCC, 0xCC, 0xCC, - 0xBB, 0xAA, 0x99, 0x99, 0x99, 0x9A, 0xAB, 0xBD, 0xDC, 0xCD, 0xCC, 0xBB, - 0xBA, 0xAA, 0xAA, 0xAA, 0xBB, 0xCC, 0xDE, 0xCC, 0xEE, 0xDC, 0xCB, 0xBB, - 0xBB, 0xBB, 0xBB, 0xCC, 0xDD, 0xED, 0x9D, 0xCC, 0xCB, 0xBB, 0xBB, 0xBB, - 0xBB, 0xBC, 0xCC, 0xDD, 0xC0, 0x00, 0x00, 0x00, - ], - [ - 0xAB, 0xBA, 0xAA, 0x99, 0x99, 0x99, 0x9A, 0xAA, 0xBB, 0xBC, 0x9B, 0xCB, - 0xBA, 0xAA, 0xA9, 0x99, 0xAA, 0xAA, 0xBB, 0xCC, 0xDC, 0xBB, 0xBA, 0xA9, - 0x99, 0x99, 0x99, 0x99, 0xAA, 0xBB, 0xCD, 0xBA, 0xBA, 0xA9, 0x98, 0x88, - 0x88, 0x88, 0x99, 0x9A, 0xBB, 0xCB, 0xAA, 0xA9, 0x98, 0x88, 0x77, 0x77, - 0x88, 0x89, 0x9A, 0xBC, 0xBA, 0xA9, 0x98, 0x87, 0x77, 0x77, 0x77, 0x78, - 0x89, 0xAA, 0xBB, 0x9A, 0x98, 0x87, 0x77, 0x66, 0x66, 0x77, 0x78, 0x99, - 0xAB, 0xA9, 0xA9, 0x88, 0x77, 0x66, 0x66, 0x66, 0x77, 0x88, 0x9A, 0xAA, - 0x99, 0x98, 0x77, 0x66, 0x65, 0x56, 0x66, 0x77, 0x89, 0xAA, 0xA9, 0x99, - 0x87, 0x76, 0x65, 0x55, 0x56, 0x67, 0x78, 0x99, 0xAA, 0x99, 0x98, 0x77, - 0x66, 0x55, 0x55, 0x66, 0x77, 0x89, 0x9A, 0xA9, 0x99, 0x87, 0x76, 0x66, - 0x55, 0x66, 0x67, 0x78, 0x99, 0xAA, 0x9A, 0x98, 0x87, 0x76, 0x66, 0x66, - 0x66, 0x78, 0x89, 0xAA, 0xAA, 0xA9, 0x98, 0x77, 0x76, 0x66, 0x67, 0x77, - 0x88, 0x9A, 0xAA, 0xAA, 0xA9, 0x88, 0x77, 0x77, 0x77, 0x77, 0x88, 0x99, - 0xAB, 0xAA, 0xBA, 0x99, 0x88, 0x87, 0x77, 0x78, 0x88, 0x99, 0xAA, 0xBA, - 0xAB, 0xBA, 0x99, 0x98, 0x88, 0x88, 0x88, 0x99, 0xAA, 0xBB, 0xBB, 0xCB, - 0xBA, 0xA9, 0x99, 0x99, 0x99, 0x99, 0xAA, 0xBB, 0xCB, 0xBC, 0xCB, 0xBA, - 0xAA, 0xA9, 0x99, 0xAA, 0xAA, 0xBB, 0xCC, 0xBC, 0xDC, 0xCC, 0xBB, 0xAA, - 0xAA, 0xAA, 0xAB, 0xBC, 0xCC, 0xDC, 0x9C, 0xCB, 0xBA, 0xAA, 0xAA, 0xAA, - 0xAA, 0xAB, 0xBB, 0xCC, 0xA0, 0x00, 0x00, 0x00, - ], - [ - 0xAB, 0xBB, 0xAA, 0xAA, 0xA9, 0xAA, 0xAA, 0xAB, 0xBB, 0xCC, 0x9B, 0xCC, - 0xBB, 0xBA, 0xAA, 0xAA, 0xAA, 0xAB, 0xBC, 0xCD, 0xDC, 0xBC, 0xBB, 0xAA, - 0x99, 0x99, 0x99, 0x9A, 0xAB, 0xBC, 0xCD, 0xCA, 0xBB, 0xAA, 0x99, 0x88, - 0x88, 0x88, 0x99, 0xAA, 0xBC, 0xCB, 0xAB, 0xA9, 0x98, 0x88, 0x77, 0x77, - 0x88, 0x99, 0xAA, 0xCC, 0xBA, 0xAA, 0x98, 0x87, 0x77, 0x77, 0x77, 0x78, - 0x99, 0xAB, 0xBB, 0xAA, 0x99, 0x87, 0x76, 0x66, 0x66, 0x77, 0x78, 0x9A, - 0xAC, 0xBA, 0xA9, 0x88, 0x76, 0x66, 0x66, 0x66, 0x77, 0x88, 0x9A, 0xBB, - 0x9A, 0x98, 0x77, 0x66, 0x55, 0x55, 0x66, 0x77, 0x89, 0xAB, 0xB9, 0xA9, - 0x87, 0x76, 0x65, 0x55, 0x56, 0x67, 0x78, 0x9A, 0xBA, 0x9A, 0x98, 0x77, - 0x66, 0x55, 0x55, 0x66, 0x77, 0x89, 0xAB, 0xAA, 0xA9, 0x87, 0x76, 0x65, - 0x55, 0x56, 0x67, 0x78, 0x9A, 0xBA, 0xAA, 0x98, 0x87, 0x76, 0x66, 0x66, - 0x66, 0x78, 0x89, 0xAB, 0xAA, 0xBA, 0x98, 0x77, 0x76, 0x66, 0x66, 0x77, - 0x89, 0x9A, 0xBA, 0xAB, 0xA9, 0x98, 0x87, 0x77, 0x77, 0x77, 0x88, 0x9A, - 0xAB, 0xBB, 0xBB, 0xA9, 0x98, 0x88, 0x77, 0x78, 0x88, 0x9A, 0xAB, 0xCB, - 0xBC, 0xBA, 0xA9, 0x98, 0x88, 0x88, 0x89, 0x99, 0xAB, 0xBC, 0xBB, 0xCC, - 0xBB, 0xAA, 0x99, 0x99, 0x99, 0x9A, 0xAB, 0xBC, 0xCB, 0xCD, 0xCC, 0xBB, - 0xAA, 0xAA, 0xAA, 0xAA, 0xBB, 0xBC, 0xCD, 0xCC, 0xDC, 0xCC, 0xCB, 0xBB, - 0xBB, 0xAB, 0xBB, 0xCC, 0xCD, 0xDC, 0x9C, 0xCB, 0xBB, 0xBA, 0xAA, 0xAA, - 0xAA, 0xBB, 0xBB, 0xCC, 0xA0, 0x00, 0x00, 0x00, - ], - [ - 0xCE, 0xDD, 0xCC, 0xCC, 0xCC, 0xCC, 0xCD, 0xDE, 0xEE, 0xEF, 0x9E, 0xFE, - 0xDD, 0xCC, 0xCB, 0xBB, 0xCC, 0xDD, 0xEF, 0xFF, 0xFF, 0xDE, 0xDC, 0xCB, - 0xBA, 0xAA, 0xAB, 0xBB, 0xCD, 0xEE, 0xFF, 0xFD, 0xDC, 0xCB, 0xAA, 0x99, - 0x99, 0x9A, 0xAB, 0xCD, 0xEF, 0xFF, 0xDD, 0xCB, 0xA9, 0x98, 0x88, 0x88, - 0x99, 0xAB, 0xCD, 0xEF, 0xEC, 0xCB, 0xA9, 0x98, 0x77, 0x77, 0x78, 0x89, - 0xAB, 0xCD, 0xEE, 0xCC, 0xBA, 0x98, 0x77, 0x66, 0x66, 0x78, 0x89, 0xAB, - 0xDE, 0xEC, 0xCA, 0x98, 0x77, 0x65, 0x55, 0x66, 0x78, 0x9A, 0xBC, 0xDD, - 0xCB, 0xA9, 0x87, 0x65, 0x55, 0x55, 0x66, 0x78, 0x9B, 0xCD, 0xDC, 0xBA, - 0x98, 0x76, 0x55, 0x44, 0x55, 0x67, 0x89, 0xAC, 0xDD, 0xCC, 0xA9, 0x87, - 0x65, 0x54, 0x44, 0x56, 0x78, 0x9A, 0xBD, 0xDC, 0xCB, 0x98, 0x76, 0x65, - 0x44, 0x55, 0x67, 0x89, 0xAB, 0xDD, 0xCC, 0xBA, 0x98, 0x76, 0x65, 0x55, - 0x67, 0x78, 0x9B, 0xBD, 0xDD, 0xDB, 0xB9, 0x88, 0x76, 0x66, 0x67, 0x78, - 0x9A, 0xBC, 0xDD, 0xDD, 0xCB, 0xA9, 0x88, 0x77, 0x77, 0x78, 0x99, 0xAB, - 0xCD, 0xDD, 0xED, 0xCB, 0xA9, 0x98, 0x88, 0x88, 0x99, 0xAB, 0xCD, 0xED, - 0xEE, 0xED, 0xCB, 0xAA, 0x99, 0x99, 0x9A, 0xAB, 0xCC, 0xDE, 0xEE, 0xFE, - 0xDD, 0xCB, 0xBA, 0xAA, 0xAA, 0xBB, 0xCC, 0xDE, 0xFE, 0xEF, 0xFE, 0xDD, - 0xDC, 0xCB, 0xBB, 0xCC, 0xCD, 0xEE, 0xFF, 0xFE, 0xFF, 0xFF, 0xEE, 0xDD, - 0xDC, 0xDD, 0xDD, 0xEE, 0xFF, 0xFF, 0xAE, 0xFE, 0xEE, 0xED, 0xDD, 0xDD, - 0xDD, 0xDE, 0xEE, 0xFF, 0xC0, 0x00, 0x00, 0x00, - ], - [ - 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xAF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xED, 0xDD, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xDD, 0xCC, - 0xCC, 0xCD, 0xDE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xDC, 0xBB, 0xAA, 0xAB, - 0xBC, 0xDD, 0xFF, 0xFF, 0xFF, 0xFF, 0xEC, 0xBA, 0x99, 0x89, 0x9A, 0xBB, - 0xDF, 0xFF, 0xFF, 0xFF, 0xFD, 0xBA, 0x98, 0x77, 0x77, 0x89, 0xBC, 0xEF, - 0xFF, 0xFF, 0xFF, 0xCB, 0x98, 0x65, 0x55, 0x67, 0x8A, 0xBC, 0xFF, 0xFF, - 0xFF, 0xDC, 0xA9, 0x75, 0x44, 0x44, 0x67, 0x9B, 0xCF, 0xFF, 0xFF, 0xFE, - 0xCA, 0x87, 0x54, 0x33, 0x45, 0x79, 0xAC, 0xDF, 0xFF, 0xFF, 0xDC, 0xA9, - 0x75, 0x43, 0x34, 0x57, 0x8A, 0xCE, 0xFF, 0xFF, 0xFF, 0xCB, 0x97, 0x64, - 0x44, 0x45, 0x79, 0xAC, 0xDF, 0xFF, 0xFF, 0xFD, 0xBA, 0x87, 0x65, 0x55, - 0x68, 0x9B, 0xCD, 0xFF, 0xFF, 0xFF, 0xDC, 0xB9, 0x87, 0x77, 0x78, 0x9A, - 0xBD, 0xFF, 0xFF, 0xFF, 0xFF, 0xDC, 0xBA, 0x98, 0x89, 0x9A, 0xBC, 0xDF, - 0xFF, 0xFF, 0xFF, 0xFE, 0xDC, 0xBB, 0xAA, 0xAB, 0xBC, 0xDF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xDD, 0xCC, 0xCC, 0xCD, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFE, 0xDD, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x9F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xD0, 0x00, 0x00, 0x00, - ], - [ - 0xBD, 0xDD, 0xDC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xDD, 0xCD, 0x9E, 0xFE, - 0xDD, 0xDD, 0xCC, 0xCC, 0xCD, 0xDD, 0xEE, 0xFE, 0xFD, 0xDE, 0xED, 0xDC, - 0xBB, 0xBB, 0xBB, 0xBC, 0xCD, 0xDE, 0xEF, 0xEC, 0xDD, 0xCC, 0xBA, 0xAA, - 0xAA, 0xAA, 0xBB, 0xCD, 0xED, 0xED, 0xCD, 0xCC, 0xBA, 0xA9, 0x99, 0x99, - 0x9A, 0xBB, 0xCD, 0xDF, 0xDC, 0xDC, 0xBA, 0x99, 0x88, 0x77, 0x88, 0x9A, - 0xBC, 0xCD, 0xED, 0xCD, 0xCB, 0xA9, 0x87, 0x66, 0x66, 0x78, 0x9A, 0xBC, - 0xDE, 0xDC, 0xCB, 0xA9, 0x87, 0x65, 0x55, 0x66, 0x78, 0x9B, 0xBD, 0xED, - 0xCC, 0xBA, 0x97, 0x65, 0x54, 0x45, 0x66, 0x89, 0xAB, 0xCD, 0xDC, 0xCB, - 0xA8, 0x76, 0x54, 0x44, 0x45, 0x67, 0x8A, 0xBC, 0xDD, 0xCC, 0xBA, 0x87, - 0x65, 0x44, 0x44, 0x56, 0x78, 0xAB, 0xCD, 0xDC, 0xCB, 0xA9, 0x87, 0x65, - 0x44, 0x55, 0x67, 0x9A, 0xBC, 0xED, 0xCD, 0xCA, 0x98, 0x76, 0x65, 0x55, - 0x67, 0x89, 0xAB, 0xCD, 0xDC, 0xDC, 0xBA, 0x98, 0x77, 0x66, 0x67, 0x88, - 0x9B, 0xCC, 0xED, 0xCD, 0xCB, 0xAA, 0x98, 0x87, 0x77, 0x89, 0x9A, 0xBC, - 0xDD, 0xDC, 0xDC, 0xCC, 0xAA, 0x99, 0x99, 0x99, 0xAA, 0xBC, 0xDE, 0xED, - 0xDE, 0xDD, 0xCC, 0xBA, 0xAA, 0xAA, 0xAB, 0xBC, 0xDD, 0xEE, 0xDC, 0xFE, - 0xDD, 0xCC, 0xCB, 0xBB, 0xBB, 0xBC, 0xCD, 0xEE, 0xFE, 0xDF, 0xEE, 0xDD, - 0xDD, 0xCC, 0xCC, 0xCC, 0xDD, 0xEE, 0xEF, 0xED, 0xFF, 0xEE, 0xED, 0xDD, - 0xDD, 0xDE, 0xEF, 0xEF, 0xFF, 0xEE, 0x9D, 0xDD, 0xCD, 0xDD, 0xDD, 0xDD, - 0xDD, 0xDE, 0xEE, 0xFE, 0xC0, 0x00, 0x00, 0x00, - ], - [ - 0xCE, 0xDD, 0xCC, 0xCB, 0xBB, 0xBC, 0xCC, 0xCD, 0xDD, 0xDE, 0xAE, 0xEE, - 0xDC, 0xCC, 0xBB, 0xBB, 0xBC, 0xCD, 0xDD, 0xEF, 0xFE, 0xDE, 0xDC, 0xCB, - 0xBA, 0xAA, 0xAA, 0xBB, 0xCC, 0xDD, 0xEF, 0xED, 0xDC, 0xCB, 0xAA, 0x99, - 0x99, 0x9A, 0xAB, 0xBC, 0xDE, 0xEE, 0xCC, 0xCB, 0xA9, 0x98, 0x88, 0x88, - 0x99, 0xAA, 0xBC, 0xDE, 0xDC, 0xCB, 0xA9, 0x98, 0x77, 0x77, 0x78, 0x89, - 0xAB, 0xCC, 0xDD, 0xCC, 0xBA, 0x98, 0x77, 0x66, 0x66, 0x77, 0x89, 0xAB, - 0xCD, 0xDB, 0xBA, 0x98, 0x77, 0x65, 0x55, 0x56, 0x77, 0x9A, 0xBC, 0xDD, - 0xBB, 0xA9, 0x87, 0x65, 0x55, 0x55, 0x56, 0x78, 0x9A, 0xCD, 0xDB, 0xBA, - 0x98, 0x76, 0x55, 0x44, 0x55, 0x67, 0x89, 0xAB, 0xCC, 0xBB, 0xA9, 0x87, - 0x65, 0x54, 0x45, 0x56, 0x78, 0x9A, 0xBC, 0xCB, 0xBA, 0x98, 0x76, 0x55, - 0x55, 0x55, 0x67, 0x89, 0xAB, 0xCC, 0xCC, 0xBA, 0x88, 0x76, 0x55, 0x55, - 0x67, 0x78, 0x9A, 0xBD, 0xCC, 0xCB, 0xA9, 0x87, 0x76, 0x66, 0x67, 0x78, - 0x9A, 0xBC, 0xDD, 0xCD, 0xCB, 0xA9, 0x88, 0x77, 0x77, 0x78, 0x99, 0xAB, - 0xCD, 0xDC, 0xDC, 0xBA, 0xA9, 0x88, 0x88, 0x88, 0x99, 0xAB, 0xCD, 0xDD, - 0xDD, 0xDC, 0xBB, 0xA9, 0x99, 0x99, 0x9A, 0xAB, 0xCC, 0xDE, 0xDD, 0xED, - 0xDC, 0xBB, 0xBA, 0xAA, 0xAA, 0xBB, 0xCC, 0xDE, 0xFE, 0xDF, 0xEE, 0xDC, - 0xCC, 0xBB, 0xBB, 0xBC, 0xCC, 0xDE, 0xFF, 0xFE, 0xFE, 0xFE, 0xDD, 0xDD, - 0xCC, 0xCC, 0xDD, 0xDE, 0xFF, 0xFE, 0xAE, 0xED, 0xDD, 0xDD, 0xCC, 0xCC, - 0xCD, 0xDD, 0xEE, 0xEF, 0xD0, 0x00, 0x00, 0x00, - ], - [ - 0xDE, 0xED, 0xDD, 0xCC, 0xCC, 0xCC, 0xCC, 0xDD, 0xDD, 0xDE, 0x9F, 0xFF, - 0xED, 0xDD, 0xDD, 0xCC, 0xCD, 0xDD, 0xEE, 0xEF, 0xFE, 0xEF, 0xED, 0xDC, - 0xBB, 0xBB, 0xBB, 0xCC, 0xCE, 0xEE, 0xFF, 0xED, 0xED, 0xDC, 0xBA, 0xAA, - 0xAA, 0xAA, 0xBB, 0xCD, 0xEE, 0xFD, 0xDE, 0xDC, 0xBA, 0x99, 0x98, 0x89, - 0x9A, 0xAB, 0xCD, 0xEF, 0xDD, 0xDC, 0xBA, 0x98, 0x87, 0x77, 0x78, 0x9A, - 0xBB, 0xCD, 0xED, 0xCD, 0xCB, 0xA8, 0x87, 0x66, 0x66, 0x78, 0x9A, 0xBC, - 0xDE, 0xDC, 0xDB, 0xA9, 0x87, 0x65, 0x55, 0x66, 0x78, 0x9A, 0xBC, 0xED, - 0xCD, 0xBA, 0x97, 0x65, 0x54, 0x45, 0x66, 0x79, 0xAB, 0xCD, 0xDC, 0xCB, - 0xA8, 0x76, 0x54, 0x44, 0x45, 0x67, 0x8A, 0xBC, 0xDD, 0xCC, 0xBA, 0x87, - 0x65, 0x44, 0x44, 0x56, 0x78, 0xAB, 0xCD, 0xDC, 0xCB, 0xA9, 0x76, 0x65, - 0x45, 0x56, 0x67, 0x9A, 0xBC, 0xDD, 0xDD, 0xCA, 0x98, 0x76, 0x65, 0x55, - 0x67, 0x89, 0xAB, 0xCD, 0xDD, 0xDC, 0xBA, 0x98, 0x76, 0x66, 0x67, 0x88, - 0x9A, 0xBD, 0xDD, 0xDD, 0xCB, 0xAA, 0x98, 0x87, 0x77, 0x88, 0x9A, 0xBC, - 0xCE, 0xDE, 0xED, 0xCB, 0xAA, 0x99, 0x88, 0x89, 0x9A, 0xBC, 0xCD, 0xED, - 0xEF, 0xED, 0xCB, 0xBA, 0xAA, 0xAA, 0xAA, 0xBC, 0xCD, 0xEE, 0xDE, 0xFE, - 0xDD, 0xCC, 0xBB, 0xBB, 0xBB, 0xCC, 0xCD, 0xDE, 0xFE, 0xDF, 0xFE, 0xDD, - 0xDC, 0xCC, 0xCC, 0xCC, 0xDE, 0xEE, 0xEF, 0xEE, 0xFF, 0xEF, 0xEE, 0xDE, - 0xDD, 0xDD, 0xDE, 0xEF, 0xFF, 0xFF, 0xAE, 0xDD, 0xDD, 0xED, 0xDD, 0xDD, - 0xDD, 0xDE, 0xEE, 0xEE, 0xC0, 0x00, 0x00, 0x00, - ], - [ - 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x9F, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFE, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xDD, 0xCC, - 0xCC, 0xCD, 0xDD, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xDC, 0xCB, 0xAA, 0xAB, - 0xBC, 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0xDC, 0xBA, 0x99, 0x89, 0x9A, 0xBC, - 0xDF, 0xFF, 0xFF, 0xFF, 0xFD, 0xBA, 0x98, 0x77, 0x77, 0x89, 0xBC, 0xDF, - 0xFF, 0xFF, 0xFF, 0xCB, 0x98, 0x66, 0x55, 0x67, 0x8A, 0xBD, 0xFF, 0xFF, - 0xFF, 0xFC, 0xA9, 0x76, 0x44, 0x45, 0x67, 0x9B, 0xCD, 0xFF, 0xFF, 0xFF, - 0xCA, 0x87, 0x54, 0x33, 0x45, 0x78, 0xAC, 0xFF, 0xFF, 0xFF, 0xFC, 0xA9, - 0x75, 0x43, 0x24, 0x57, 0x8A, 0xCE, 0xFF, 0xFF, 0xFF, 0xCB, 0x97, 0x65, - 0x44, 0x46, 0x79, 0xAC, 0xDF, 0xFF, 0xFF, 0xFD, 0xBA, 0x87, 0x65, 0x56, - 0x68, 0x9B, 0xCD, 0xFF, 0xFF, 0xFF, 0xDC, 0xB9, 0x87, 0x77, 0x78, 0x9A, - 0xBD, 0xFF, 0xFF, 0xFF, 0xFF, 0xDC, 0xBA, 0x99, 0x89, 0x9A, 0xBC, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xDC, 0xBB, 0xAA, 0xAB, 0xBC, 0xDF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xDD, 0xCC, 0xCC, 0xCD, 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xDD, 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x9F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xD0, 0x00, 0x00, 0x00, - ], - [ - 0xCE, 0xED, 0xCD, 0xCC, 0xCC, 0xCC, 0xCC, 0xCD, 0xDD, 0xDD, 0x9E, 0xFE, - 0xDD, 0xDC, 0xCC, 0xBC, 0xCC, 0xDD, 0xEE, 0xEF, 0xFE, 0xDE, 0xDD, 0xCC, - 0xBB, 0xBB, 0xBB, 0xBC, 0xCC, 0xDE, 0xEF, 0xED, 0xED, 0xCB, 0xBA, 0xAA, - 0xAA, 0xAA, 0xBB, 0xCD, 0xDE, 0xEE, 0xDD, 0xCC, 0xBA, 0x99, 0x98, 0x99, - 0x9A, 0xAB, 0xCC, 0xDE, 0xDC, 0xDC, 0xBA, 0x98, 0x88, 0x77, 0x88, 0x99, - 0xAB, 0xCD, 0xED, 0xCC, 0xBA, 0x99, 0x87, 0x76, 0x67, 0x78, 0x9A, 0xBC, - 0xDD, 0xDC, 0xCB, 0xA9, 0x87, 0x66, 0x55, 0x66, 0x78, 0x9A, 0xBC, 0xDD, - 0xCC, 0xBA, 0x98, 0x76, 0x54, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xDC, 0xCB, - 0xA8, 0x76, 0x54, 0x34, 0x55, 0x67, 0x9A, 0xBC, 0xDC, 0xCC, 0xBA, 0x97, - 0x65, 0x44, 0x34, 0x56, 0x78, 0x9B, 0xCD, 0xDC, 0xCB, 0xA9, 0x87, 0x65, - 0x44, 0x56, 0x68, 0x9A, 0xBC, 0xDD, 0xCC, 0xBA, 0x98, 0x76, 0x65, 0x56, - 0x67, 0x89, 0xAB, 0xCD, 0xDC, 0xCB, 0xBA, 0x98, 0x77, 0x66, 0x77, 0x88, - 0x9A, 0xBC, 0xDD, 0xCD, 0xCB, 0xA9, 0x98, 0x87, 0x78, 0x89, 0x9A, 0xBC, - 0xDE, 0xDD, 0xEC, 0xCB, 0xAA, 0x99, 0x88, 0x99, 0x9A, 0xBB, 0xCD, 0xED, - 0xDE, 0xDC, 0xCB, 0xBA, 0xAA, 0xAA, 0xAA, 0xBB, 0xCD, 0xEF, 0xED, 0xEE, - 0xDC, 0xCB, 0xBB, 0xBB, 0xBB, 0xBC, 0xCD, 0xEF, 0xEE, 0xEF, 0xFE, 0xDD, - 0xCC, 0xCC, 0xCC, 0xCC, 0xDD, 0xDE, 0xFF, 0xED, 0xFF, 0xEE, 0xED, 0xDD, - 0xCD, 0xDD, 0xDD, 0xEE, 0xFF, 0xFF, 0x8E, 0xDD, 0xDD, 0xCC, 0xCC, 0xCD, - 0xDD, 0xDD, 0xDE, 0xEE, 0xC0, 0x00, 0x00, 0x00, - ], - [ - 0x9B, 0xBB, 0xAA, 0xAA, 0xA9, 0xAA, 0xAA, 0xAA, 0xBB, 0xBB, 0x9B, 0xCC, - 0xBB, 0xBA, 0xAA, 0xAA, 0xAA, 0xBB, 0xBC, 0xCC, 0xEC, 0xBC, 0xBB, 0xAA, - 0xA9, 0x99, 0x99, 0xAA, 0xAA, 0xBC, 0xCD, 0xBB, 0xBB, 0xAA, 0x99, 0x98, - 0x88, 0x89, 0x9A, 0xAB, 0xBC, 0xCB, 0xAB, 0xAA, 0x99, 0x88, 0x88, 0x88, - 0x88, 0x99, 0xAB, 0xBC, 0xBA, 0xBA, 0x99, 0x88, 0x77, 0x77, 0x77, 0x88, - 0x99, 0xAB, 0xCB, 0xAA, 0xA9, 0x88, 0x77, 0x66, 0x66, 0x77, 0x88, 0x9A, - 0xAB, 0xBA, 0xA9, 0x98, 0x77, 0x66, 0x55, 0x66, 0x77, 0x89, 0xAA, 0xBB, - 0x9A, 0x98, 0x87, 0x66, 0x55, 0x55, 0x66, 0x78, 0x99, 0xAB, 0xA9, 0xA9, - 0x87, 0x76, 0x55, 0x55, 0x55, 0x67, 0x78, 0x9A, 0xBA, 0x9A, 0x98, 0x87, - 0x65, 0x55, 0x55, 0x56, 0x77, 0x89, 0xAB, 0xAA, 0xA9, 0x88, 0x76, 0x65, - 0x55, 0x56, 0x67, 0x88, 0x9A, 0xBA, 0xAA, 0xA9, 0x87, 0x76, 0x65, 0x56, - 0x66, 0x78, 0x99, 0xAB, 0xAA, 0xAA, 0x98, 0x87, 0x76, 0x66, 0x66, 0x78, - 0x89, 0xAA, 0xBA, 0xAB, 0xA9, 0x98, 0x87, 0x77, 0x77, 0x78, 0x89, 0x9A, - 0xBB, 0xBA, 0xBB, 0xA9, 0x98, 0x88, 0x88, 0x88, 0x89, 0x9A, 0xAB, 0xCB, - 0xBC, 0xBB, 0xA9, 0x99, 0x88, 0x88, 0x99, 0x9A, 0xAB, 0xBC, 0xBB, 0xCC, - 0xBB, 0xAA, 0xA9, 0x99, 0x99, 0xAA, 0xAB, 0xBC, 0xCC, 0xBC, 0xCC, 0xBB, - 0xBA, 0xAA, 0xAA, 0xAB, 0xBB, 0xBC, 0xDD, 0xCC, 0xDD, 0xDC, 0xCB, 0xBB, - 0xBB, 0xBB, 0xBC, 0xCC, 0xCD, 0xEC, 0x8C, 0xBB, 0xBB, 0xBA, 0xAA, 0xAA, - 0xAA, 0xBB, 0xBC, 0xCC, 0xA0, 0x00, 0x00, 0x00, - ], - [ - 0x9B, 0xAA, 0xA9, 0x99, 0x99, 0x99, 0x99, 0xAA, 0xAB, 0xBB, 0x9B, 0xCB, - 0xBA, 0xAA, 0xA9, 0x99, 0xAA, 0xAA, 0xBB, 0xCC, 0xCB, 0xAB, 0xBA, 0xA9, - 0x99, 0x99, 0x99, 0x99, 0xAA, 0xAB, 0xCC, 0xBA, 0xBA, 0xA9, 0x98, 0x88, - 0x88, 0x88, 0x99, 0x9A, 0xBB, 0xCB, 0xAA, 0xA9, 0x98, 0x88, 0x77, 0x77, - 0x88, 0x89, 0x9A, 0xBB, 0xB9, 0xA9, 0x98, 0x87, 0x77, 0x77, 0x77, 0x78, - 0x89, 0xAA, 0xBA, 0x9A, 0x99, 0x87, 0x77, 0x66, 0x66, 0x77, 0x78, 0x99, - 0xAB, 0xA9, 0xA9, 0x88, 0x77, 0x66, 0x66, 0x66, 0x77, 0x88, 0x9A, 0xAA, - 0x99, 0x98, 0x77, 0x66, 0x65, 0x56, 0x66, 0x77, 0x89, 0xAA, 0xA9, 0x99, - 0x87, 0x76, 0x65, 0x55, 0x56, 0x67, 0x78, 0x99, 0xAA, 0x99, 0x98, 0x77, - 0x66, 0x55, 0x55, 0x66, 0x77, 0x89, 0x9A, 0xA9, 0xA9, 0x87, 0x76, 0x66, - 0x55, 0x66, 0x67, 0x78, 0x99, 0xAA, 0x9A, 0x98, 0x87, 0x76, 0x66, 0x66, - 0x67, 0x78, 0x89, 0xAA, 0xA9, 0xA9, 0x98, 0x77, 0x76, 0x66, 0x67, 0x77, - 0x88, 0x9A, 0xAA, 0xAA, 0xA9, 0x88, 0x77, 0x77, 0x77, 0x77, 0x88, 0x99, - 0xAB, 0xAA, 0xBA, 0x99, 0x88, 0x87, 0x77, 0x78, 0x88, 0x99, 0xAA, 0xBA, - 0xAB, 0xBA, 0x99, 0x98, 0x88, 0x88, 0x88, 0x99, 0xAA, 0xBB, 0xBB, 0xCB, - 0xAA, 0xA9, 0x99, 0x99, 0x99, 0x99, 0xAA, 0xBB, 0xCB, 0xBC, 0xCB, 0xBA, - 0xAA, 0xA9, 0x99, 0xAA, 0xAA, 0xBB, 0xCC, 0xBB, 0xDC, 0xCB, 0xBB, 0xAA, - 0xAA, 0xAA, 0xBB, 0xBB, 0xCC, 0xDC, 0x9B, 0xBB, 0xAA, 0xAA, 0xAA, 0xAA, - 0xAA, 0xAA, 0xBB, 0xBC, 0xA0, 0x00, 0x00, 0x00, - ], - [ - 0x9B, 0xBB, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xBB, 0xBC, 0x8B, 0xDC, - 0xCB, 0xBB, 0xAA, 0xAA, 0xAB, 0xBB, 0xBC, 0xDD, 0xDC, 0xBC, 0xCB, 0xBA, - 0xA9, 0x99, 0x99, 0xAA, 0xAB, 0xBC, 0xCD, 0xCB, 0xCB, 0xBA, 0x99, 0x98, - 0x88, 0x99, 0x9A, 0xAB, 0xBC, 0xCB, 0xAB, 0xAA, 0x99, 0x88, 0x87, 0x88, - 0x88, 0x9A, 0xAB, 0xBC, 0xBA, 0xBA, 0x99, 0x88, 0x77, 0x77, 0x77, 0x88, - 0x9A, 0xAB, 0xCB, 0xAA, 0xA9, 0x88, 0x76, 0x66, 0x66, 0x77, 0x88, 0x9A, - 0xBB, 0xBA, 0xA9, 0x98, 0x76, 0x66, 0x55, 0x66, 0x77, 0x89, 0x9A, 0xBA, - 0xAA, 0x98, 0x87, 0x66, 0x55, 0x55, 0x66, 0x78, 0x89, 0xAB, 0xBA, 0xA9, - 0x88, 0x76, 0x55, 0x55, 0x55, 0x67, 0x88, 0x9A, 0xBA, 0xAA, 0x98, 0x87, - 0x65, 0x55, 0x55, 0x56, 0x77, 0x89, 0xAB, 0xAA, 0xA9, 0x98, 0x76, 0x65, - 0x55, 0x56, 0x67, 0x88, 0x9A, 0xBA, 0xAA, 0xA9, 0x87, 0x76, 0x65, 0x56, - 0x66, 0x78, 0x99, 0xAB, 0xAA, 0xBA, 0x98, 0x87, 0x76, 0x66, 0x66, 0x77, - 0x89, 0xAB, 0xBB, 0xAB, 0xAA, 0x98, 0x87, 0x77, 0x77, 0x78, 0x89, 0x9A, - 0xBC, 0xBB, 0xCB, 0xAA, 0x98, 0x88, 0x87, 0x88, 0x89, 0x9A, 0xAB, 0xCB, - 0xBC, 0xBB, 0xAA, 0x99, 0x98, 0x88, 0x99, 0x9A, 0xAB, 0xCC, 0xBB, 0xCC, - 0xBB, 0xAA, 0xA9, 0x99, 0x9A, 0xAA, 0xAB, 0xCC, 0xCC, 0xBD, 0xCC, 0xBB, - 0xBA, 0xAA, 0xAA, 0xAB, 0xBB, 0xCC, 0xCD, 0xCC, 0xDD, 0xCC, 0xCB, 0xBB, - 0xBB, 0xBB, 0xBC, 0xCC, 0xDD, 0xDC, 0x8C, 0xBB, 0xBB, 0xBB, 0xAA, 0xAA, - 0xBB, 0xBB, 0xBB, 0xCC, 0xA0, 0x00, 0x00, 0x00, - ], - [ - 0xBD, 0xDD, 0xDD, 0xCC, 0xCC, 0xCC, 0xCC, 0xCD, 0xCD, 0xDD, 0x8E, 0xFE, - 0xED, 0xDD, 0xCC, 0xCC, 0xCD, 0xDD, 0xEF, 0xFF, 0xFD, 0xDE, 0xED, 0xCC, - 0xCB, 0xBB, 0xBB, 0xCC, 0xCD, 0xEE, 0xEF, 0xED, 0xDD, 0xCC, 0xBB, 0xAA, - 0xAA, 0xAA, 0xBB, 0xCD, 0xEE, 0xFD, 0xDD, 0xDC, 0xBA, 0xA9, 0x99, 0x99, - 0x9A, 0xBB, 0xCD, 0xEE, 0xEC, 0xDC, 0xBA, 0xA9, 0x88, 0x77, 0x88, 0x9A, - 0xBC, 0xCE, 0xED, 0xCD, 0xCB, 0xA9, 0x87, 0x76, 0x67, 0x78, 0x9A, 0xBC, - 0xDE, 0xDC, 0xCB, 0xA9, 0x87, 0x66, 0x55, 0x66, 0x78, 0x9A, 0xBC, 0xED, - 0xCC, 0xBA, 0x98, 0x76, 0x54, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xDC, 0xCB, - 0xA9, 0x76, 0x54, 0x34, 0x45, 0x68, 0x9A, 0xBC, 0xDD, 0xCC, 0xBA, 0x98, - 0x65, 0x44, 0x34, 0x56, 0x79, 0xAB, 0xCD, 0xDC, 0xDB, 0xA9, 0x87, 0x65, - 0x44, 0x56, 0x78, 0x9A, 0xBC, 0xDD, 0xDD, 0xBA, 0x98, 0x76, 0x65, 0x55, - 0x67, 0x89, 0xAB, 0xCE, 0xDC, 0xDC, 0xBA, 0x98, 0x77, 0x66, 0x77, 0x89, - 0xAB, 0xCC, 0xDD, 0xDD, 0xDB, 0xAA, 0x98, 0x87, 0x78, 0x89, 0x9A, 0xBC, - 0xDE, 0xDD, 0xED, 0xCB, 0xAA, 0x99, 0x99, 0x99, 0xAA, 0xBC, 0xCD, 0xED, - 0xDE, 0xDD, 0xCB, 0xBA, 0xAA, 0xAA, 0xAB, 0xBC, 0xCD, 0xEF, 0xED, 0xFF, - 0xED, 0xDC, 0xCB, 0xBB, 0xBB, 0xBC, 0xDD, 0xEE, 0xFE, 0xDF, 0xFE, 0xDD, - 0xDC, 0xCC, 0xCC, 0xDD, 0xDD, 0xEE, 0xFF, 0xFD, 0xFF, 0xFE, 0xEE, 0xED, - 0xDD, 0xDD, 0xEE, 0xEE, 0xFF, 0xFF, 0x9D, 0xDD, 0xDE, 0xDD, 0xDD, 0xCD, - 0xDD, 0xEE, 0xDE, 0xEF, 0xC0, 0x00, 0x00, 0x00, - ], - [ - 0xCF, 0xFE, 0xEE, 0xDE, 0xDD, 0xDD, 0xDD, 0xED, 0xDD, 0xDD, 0x9F, 0xFF, - 0xFF, 0xFF, 0xEE, 0xEE, 0xEE, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xEE, - 0xDD, 0xDD, 0xCD, 0xDD, 0xDE, 0xEF, 0xFF, 0xEE, 0xFF, 0xED, 0xDC, 0xCB, - 0xBB, 0xCC, 0xCD, 0xEE, 0xFF, 0xFE, 0xEF, 0xED, 0xCC, 0xBA, 0xAA, 0xAA, - 0xBB, 0xCD, 0xEE, 0xFF, 0xFE, 0xEE, 0xDC, 0xBA, 0x98, 0x88, 0x99, 0xAB, - 0xCD, 0xDE, 0xFE, 0xEF, 0xDC, 0xBA, 0x98, 0x77, 0x77, 0x89, 0xAB, 0xCD, - 0xFF, 0xEE, 0xED, 0xCA, 0x98, 0x76, 0x55, 0x67, 0x89, 0xAC, 0xDE, 0xFF, - 0xEE, 0xCB, 0xA8, 0x76, 0x54, 0x45, 0x67, 0x8A, 0xBD, 0xDF, 0xEE, 0xED, - 0xBA, 0x87, 0x54, 0x33, 0x45, 0x78, 0xAB, 0xDE, 0xFF, 0xDE, 0xCB, 0xA8, - 0x75, 0x43, 0x24, 0x57, 0x8A, 0xBD, 0xEF, 0xED, 0xED, 0xBA, 0x97, 0x65, - 0x44, 0x46, 0x78, 0xAB, 0xDD, 0xFE, 0xDF, 0xDC, 0xA9, 0x87, 0x65, 0x56, - 0x78, 0x9A, 0xCD, 0xEF, 0xEE, 0xED, 0xDB, 0xA9, 0x87, 0x77, 0x78, 0x9A, - 0xBC, 0xDF, 0xFE, 0xDF, 0xED, 0xCB, 0xA9, 0x98, 0x88, 0x9A, 0xBB, 0xDD, - 0xFF, 0xFD, 0xFE, 0xDD, 0xCB, 0xAA, 0xAA, 0xAA, 0xBC, 0xDD, 0xFE, 0xFE, - 0xDF, 0xEE, 0xDD, 0xCC, 0xCB, 0xBB, 0xBC, 0xCD, 0xEF, 0xFF, 0xFD, 0xFE, - 0xFE, 0xDD, 0xDC, 0xCC, 0xDD, 0xDE, 0xFF, 0xFF, 0xFF, 0xDF, 0xFE, 0xFF, - 0xEE, 0xED, 0xEE, 0xEF, 0xFF, 0xFF, 0xFF, 0xFD, 0xFF, 0xFF, 0xFF, 0xEF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x8C, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, - 0xED, 0xFE, 0xEF, 0xFF, 0xC0, 0x00, 0x00, 0x00, - ], - [ - 0xCD, 0xDD, 0xDC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xDD, 0xDD, 0x9E, 0xFE, - 0xDD, 0xDC, 0xCC, 0xCC, 0xCC, 0xDD, 0xDD, 0xEE, 0xEE, 0xDE, 0xDD, 0xCC, - 0xBB, 0xBB, 0xBB, 0xBB, 0xCD, 0xDD, 0xEF, 0xED, 0xDD, 0xCB, 0xBA, 0xAA, - 0xAA, 0xAA, 0xAB, 0xCC, 0xDE, 0xED, 0xCD, 0xCB, 0xBA, 0x99, 0x98, 0x89, - 0x9A, 0xAB, 0xCC, 0xDE, 0xDC, 0xDC, 0xBA, 0x98, 0x87, 0x77, 0x88, 0x99, - 0xAB, 0xCD, 0xED, 0xCC, 0xBA, 0x98, 0x87, 0x66, 0x66, 0x78, 0x99, 0xAB, - 0xCD, 0xDC, 0xCB, 0xA9, 0x87, 0x66, 0x55, 0x66, 0x78, 0x9A, 0xBC, 0xDD, - 0xCC, 0xBA, 0x97, 0x66, 0x54, 0x45, 0x66, 0x89, 0xAB, 0xCD, 0xDC, 0xCB, - 0xA8, 0x76, 0x54, 0x44, 0x45, 0x67, 0x89, 0xBC, 0xDD, 0xCC, 0xBA, 0x87, - 0x65, 0x44, 0x44, 0x56, 0x78, 0xAB, 0xCD, 0xDC, 0xCB, 0xA9, 0x86, 0x65, - 0x44, 0x55, 0x67, 0x9A, 0xBC, 0xDD, 0xCC, 0xBA, 0x98, 0x76, 0x65, 0x56, - 0x67, 0x89, 0xAB, 0xCD, 0xDC, 0xDC, 0xAA, 0x98, 0x77, 0x66, 0x67, 0x88, - 0x9A, 0xBD, 0xED, 0xCD, 0xCB, 0xA9, 0x98, 0x77, 0x77, 0x88, 0x9A, 0xBC, - 0xDE, 0xDD, 0xDC, 0xCB, 0xAA, 0x99, 0x88, 0x89, 0x9A, 0xBC, 0xCD, 0xEE, - 0xDD, 0xDC, 0xCB, 0xAA, 0xAA, 0xAA, 0xAA, 0xBC, 0xCD, 0xEF, 0xED, 0xEE, - 0xDC, 0xCB, 0xBB, 0xBB, 0xBB, 0xBC, 0xCD, 0xEE, 0xFE, 0xDE, 0xEE, 0xDD, - 0xDC, 0xCC, 0xCC, 0xCC, 0xDD, 0xEE, 0xFF, 0xED, 0xFF, 0xEE, 0xEE, 0xDD, - 0xDD, 0xDD, 0xDE, 0xEE, 0xFF, 0xFF, 0x9D, 0xED, 0xDD, 0xDD, 0xDD, 0xDD, - 0xDD, 0xDE, 0xEE, 0xFF, 0xD0, 0x00, 0x00, 0x00, - ], - [ - 0xCE, 0xDD, 0xCC, 0xCB, 0xBB, 0xBB, 0xBC, 0xCC, 0xCD, 0xDD, 0xAE, 0xEE, - 0xDC, 0xCC, 0xBB, 0xBB, 0xBC, 0xCC, 0xDD, 0xDE, 0xED, 0xDE, 0xDC, 0xCB, - 0xBA, 0xAA, 0xAA, 0xAB, 0xBC, 0xCD, 0xDE, 0xDD, 0xDC, 0xCB, 0xAA, 0x99, - 0x99, 0x99, 0xAA, 0xBC, 0xCD, 0xED, 0xCD, 0xCB, 0xA9, 0x98, 0x88, 0x88, - 0x89, 0xAA, 0xBC, 0xDD, 0xDC, 0xCB, 0xA9, 0x98, 0x77, 0x77, 0x77, 0x89, - 0xAA, 0xBC, 0xDD, 0xCC, 0xBA, 0x98, 0x77, 0x66, 0x66, 0x77, 0x89, 0xAB, - 0xCD, 0xCB, 0xBA, 0x98, 0x77, 0x65, 0x55, 0x56, 0x78, 0x89, 0xAB, 0xDC, - 0xBB, 0xA9, 0x87, 0x65, 0x55, 0x55, 0x56, 0x78, 0x9A, 0xBC, 0xCB, 0xBA, - 0x98, 0x76, 0x55, 0x44, 0x55, 0x67, 0x89, 0xAB, 0xCC, 0xBB, 0xA9, 0x87, - 0x65, 0x54, 0x45, 0x56, 0x78, 0x9A, 0xBC, 0xCB, 0xBA, 0x98, 0x76, 0x55, - 0x55, 0x55, 0x67, 0x89, 0xAB, 0xCC, 0xBC, 0xAA, 0x88, 0x76, 0x65, 0x55, - 0x67, 0x78, 0x9A, 0xBC, 0xCC, 0xCB, 0xA9, 0x87, 0x76, 0x66, 0x67, 0x78, - 0x9A, 0xBC, 0xDC, 0xCC, 0xBA, 0xA9, 0x88, 0x77, 0x77, 0x78, 0x99, 0xAB, - 0xCD, 0xDC, 0xCC, 0xBA, 0xA9, 0x88, 0x88, 0x88, 0x99, 0xAB, 0xCC, 0xDD, - 0xCD, 0xCC, 0xBA, 0xA9, 0x99, 0x99, 0x9A, 0xAB, 0xCC, 0xDE, 0xDD, 0xED, - 0xCC, 0xBB, 0xAA, 0xAA, 0xAA, 0xBB, 0xCC, 0xDE, 0xEE, 0xDE, 0xDD, 0xDC, - 0xCB, 0xBB, 0xBB, 0xBC, 0xCC, 0xDE, 0xEF, 0xED, 0xFE, 0xED, 0xDD, 0xCC, - 0xCC, 0xCC, 0xDD, 0xDE, 0xEF, 0xFE, 0xAD, 0xDD, 0xDD, 0xCC, 0xCC, 0xCC, - 0xCD, 0xDD, 0xDE, 0xEE, 0xD0, 0x00, 0x00, 0x00, - ], - [ - 0xBD, 0xDD, 0xDC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xDD, 0xDD, 0x9E, 0xFE, - 0xED, 0xDC, 0xCC, 0xCC, 0xCC, 0xCD, 0xDE, 0xEE, 0xED, 0xDE, 0xED, 0xCC, - 0xCB, 0xBB, 0xBB, 0xBB, 0xCC, 0xDD, 0xEF, 0xDD, 0xED, 0xCB, 0xBB, 0xAA, - 0xAA, 0xAA, 0xBB, 0xCC, 0xDD, 0xED, 0xDD, 0xCC, 0xBA, 0x99, 0x98, 0x99, - 0x9A, 0xAB, 0xCD, 0xDE, 0xDC, 0xDC, 0xBA, 0x99, 0x88, 0x77, 0x88, 0x99, - 0xAB, 0xCD, 0xED, 0xCC, 0xBA, 0xA9, 0x87, 0x66, 0x67, 0x78, 0x9A, 0xBC, - 0xCD, 0xCC, 0xCB, 0xA9, 0x87, 0x65, 0x55, 0x66, 0x78, 0x9A, 0xBC, 0xDC, - 0xCC, 0xBA, 0x98, 0x65, 0x54, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xCC, 0xCB, - 0xA8, 0x76, 0x54, 0x44, 0x45, 0x67, 0x8A, 0xBC, 0xDC, 0xCC, 0xBA, 0x97, - 0x65, 0x44, 0x44, 0x56, 0x78, 0xAB, 0xCD, 0xCC, 0xCB, 0xA9, 0x87, 0x65, - 0x44, 0x55, 0x67, 0x9A, 0xBC, 0xDC, 0xCC, 0xBA, 0x98, 0x76, 0x65, 0x55, - 0x67, 0x89, 0xAB, 0xCD, 0xCC, 0xCC, 0xBA, 0x98, 0x77, 0x66, 0x67, 0x88, - 0x9A, 0xBC, 0xDC, 0xCD, 0xCB, 0xA9, 0x98, 0x87, 0x77, 0x88, 0x9A, 0xBC, - 0xDD, 0xDC, 0xDC, 0xCB, 0xAA, 0x99, 0x88, 0x99, 0x9A, 0xBB, 0xCD, 0xED, - 0xDE, 0xDC, 0xCB, 0xBA, 0xAA, 0xAA, 0xAB, 0xBB, 0xCD, 0xDE, 0xDD, 0xED, - 0xDC, 0xCB, 0xBB, 0xBB, 0xBB, 0xCC, 0xCD, 0xDE, 0xED, 0xDF, 0xED, 0xDD, - 0xCC, 0xCC, 0xCC, 0xCC, 0xDD, 0xDE, 0xEF, 0xDD, 0xEE, 0xEE, 0xDD, 0xDD, - 0xDD, 0xDD, 0xDE, 0xEE, 0xEF, 0xFE, 0x9D, 0xDD, 0xCC, 0xCC, 0xCC, 0xCC, - 0xCD, 0xDD, 0xDD, 0xDE, 0xB0, 0x00, 0x00, 0x00, - ], - [ - 0xDF, 0xFF, 0xFF, 0xFE, 0xFD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0x8F, 0xFF, - 0xFF, 0xFF, 0xFE, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xEE, 0xFE, 0xFF, 0xFF, 0xFF, 0xEF, 0xFF, 0xFF, 0xEE, 0xDD, - 0xDD, 0xDD, 0xFE, 0xFF, 0xEF, 0xFF, 0xFF, 0xFE, 0xFD, 0xCC, 0xBB, 0xBC, - 0xCC, 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0xED, 0xCB, 0xBA, 0xAA, 0xAB, 0xCD, - 0xDE, 0xFF, 0xFF, 0xFF, 0xFD, 0xCB, 0xA9, 0x88, 0x88, 0x9A, 0xCD, 0xEF, - 0xFF, 0xFF, 0xFF, 0xEC, 0xA9, 0x86, 0x66, 0x78, 0x9B, 0xCE, 0xFF, 0xFF, - 0xFF, 0xED, 0xCA, 0x86, 0x54, 0x45, 0x78, 0xAC, 0xDE, 0xFF, 0xFF, 0xFF, - 0xCB, 0xA8, 0x64, 0x22, 0x46, 0x8A, 0xBD, 0xFF, 0xFF, 0xEF, 0xFE, 0xBA, - 0x86, 0x42, 0x24, 0x68, 0xAC, 0xDE, 0xFF, 0xFF, 0xFE, 0xDC, 0xA8, 0x75, - 0x44, 0x56, 0x8A, 0xBD, 0xFF, 0xFF, 0xFF, 0xED, 0xCB, 0x98, 0x76, 0x66, - 0x79, 0xAC, 0xDF, 0xFF, 0xFF, 0xFF, 0xED, 0xCA, 0x98, 0x88, 0x89, 0xAB, - 0xDD, 0xFF, 0xFF, 0xFF, 0xFF, 0xDD, 0xBB, 0xAA, 0xAA, 0xAB, 0xCD, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xDD, 0xCC, 0xBB, 0xCC, 0xDD, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFE, 0xED, 0xDD, 0xDD, 0xDE, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x9E, 0xFE, 0xFF, 0xEF, 0xFF, 0xFE, - 0xFF, 0xFF, 0xFF, 0xFF, 0xE0, 0x00, 0x00, 0x00, - ], - [ - 0xBD, 0xDD, 0xCC, 0xCB, 0xBB, 0xBB, 0xCC, 0xCC, 0xCD, 0xDD, 0x9D, 0xFE, - 0xDD, 0xCC, 0xCB, 0xBB, 0xBC, 0xCC, 0xDD, 0xEE, 0xFE, 0xDE, 0xDD, 0xCC, - 0xBB, 0xAA, 0xAB, 0xBB, 0xBC, 0xDD, 0xEE, 0xED, 0xDD, 0xCB, 0xAA, 0xA9, - 0x99, 0x9A, 0xAB, 0xCC, 0xDD, 0xED, 0xCD, 0xCB, 0xAA, 0x98, 0x88, 0x88, - 0x99, 0xAB, 0xBC, 0xDE, 0xDC, 0xCB, 0xBA, 0x98, 0x87, 0x77, 0x78, 0x89, - 0xAB, 0xCD, 0xED, 0xCC, 0xBA, 0x98, 0x77, 0x66, 0x66, 0x78, 0x89, 0xAB, - 0xCD, 0xCC, 0xCB, 0xA9, 0x87, 0x66, 0x55, 0x66, 0x78, 0x9A, 0xBC, 0xDD, - 0xBB, 0xA9, 0x87, 0x66, 0x54, 0x55, 0x66, 0x78, 0x9A, 0xCD, 0xCB, 0xBA, - 0x98, 0x76, 0x54, 0x44, 0x45, 0x67, 0x89, 0xAB, 0xCC, 0xBC, 0xA9, 0x87, - 0x65, 0x54, 0x44, 0x56, 0x78, 0x9A, 0xBC, 0xCB, 0xCA, 0x98, 0x76, 0x65, - 0x54, 0x55, 0x67, 0x89, 0xAB, 0xCC, 0xCC, 0xBA, 0x98, 0x76, 0x65, 0x56, - 0x67, 0x89, 0xAB, 0xCD, 0xCC, 0xCB, 0xA9, 0x88, 0x76, 0x66, 0x67, 0x78, - 0x9A, 0xBC, 0xDC, 0xCC, 0xCA, 0xA9, 0x88, 0x77, 0x77, 0x88, 0x9A, 0xBB, - 0xCD, 0xDC, 0xDC, 0xBA, 0xA9, 0x98, 0x88, 0x89, 0x9A, 0xAB, 0xCD, 0xDD, - 0xDE, 0xDC, 0xBB, 0xAA, 0x99, 0x99, 0xAA, 0xBB, 0xCD, 0xDE, 0xDD, 0xED, - 0xDC, 0xCB, 0xBA, 0xAA, 0xAB, 0xBB, 0xCD, 0xDE, 0xFE, 0xDE, 0xED, 0xDC, - 0xCC, 0xCB, 0xBB, 0xCC, 0xDD, 0xDE, 0xEF, 0xED, 0xEF, 0xEE, 0xDD, 0xDD, - 0xDC, 0xDD, 0xDD, 0xEE, 0xFF, 0xFE, 0x8D, 0xDC, 0xCC, 0xCC, 0xCC, 0xCC, - 0xCC, 0xCD, 0xDE, 0xEE, 0xC0, 0x00, 0x00, 0x00, - ], - [ - 0xAC, 0xCB, 0xBA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAB, 0xBB, 0xBC, 0x9C, 0xDC, - 0xCB, 0xBB, 0xAA, 0xAA, 0xAA, 0xBB, 0xBC, 0xCD, 0xDC, 0xBC, 0xCB, 0xAA, - 0xA9, 0x99, 0x99, 0xAA, 0xAB, 0xBC, 0xCD, 0xCB, 0xCB, 0xAA, 0x99, 0x98, - 0x88, 0x99, 0x99, 0xAB, 0xBC, 0xDC, 0xBB, 0xBA, 0x99, 0x88, 0x88, 0x88, - 0x88, 0x99, 0xAB, 0xBC, 0xBA, 0xBA, 0x99, 0x88, 0x77, 0x77, 0x77, 0x88, - 0x9A, 0xAB, 0xCB, 0xAB, 0xA9, 0x87, 0x76, 0x66, 0x66, 0x77, 0x88, 0x9A, - 0xBB, 0xBA, 0xA9, 0x98, 0x76, 0x66, 0x55, 0x66, 0x77, 0x89, 0xAB, 0xBB, - 0xAA, 0x98, 0x87, 0x66, 0x55, 0x55, 0x66, 0x78, 0x89, 0xAB, 0xBA, 0xA9, - 0x88, 0x76, 0x55, 0x55, 0x55, 0x67, 0x78, 0x9A, 0xBB, 0xAA, 0x98, 0x87, - 0x65, 0x55, 0x55, 0x56, 0x77, 0x89, 0xAB, 0xBA, 0xA9, 0x98, 0x76, 0x65, - 0x55, 0x56, 0x67, 0x88, 0x9A, 0xBB, 0xAA, 0x99, 0x87, 0x76, 0x65, 0x56, - 0x66, 0x78, 0x99, 0xAB, 0xBA, 0xBA, 0x98, 0x87, 0x76, 0x66, 0x66, 0x77, - 0x89, 0xAA, 0xBB, 0xAB, 0xAA, 0x98, 0x87, 0x77, 0x77, 0x77, 0x89, 0x9A, - 0xBC, 0xBB, 0xBB, 0xA9, 0x98, 0x88, 0x87, 0x88, 0x89, 0x9A, 0xBB, 0xCB, - 0xBC, 0xBB, 0xAA, 0x99, 0x88, 0x88, 0x99, 0x9A, 0xAB, 0xCD, 0xCB, 0xDC, - 0xBB, 0xAA, 0xA9, 0x99, 0x99, 0xAA, 0xBB, 0xCC, 0xDC, 0xBD, 0xCC, 0xBB, - 0xBA, 0xAA, 0xAA, 0xBB, 0xBB, 0xCC, 0xDE, 0xCC, 0xED, 0xCC, 0xCB, 0xBB, - 0xBB, 0xBB, 0xBC, 0xCD, 0xDE, 0xED, 0x8C, 0xCC, 0xBB, 0xBB, 0xBB, 0xBB, - 0xBB, 0xBC, 0xCC, 0xDD, 0xB0, 0x00, 0x00, 0x00, - ], - [ - 0xAB, 0xBA, 0xAA, 0x99, 0x99, 0x99, 0x99, 0xAA, 0xAB, 0xBB, 0x9B, 0xCB, - 0xBB, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xBB, 0xCC, 0xDB, 0xBB, 0xBA, 0xAA, - 0x99, 0x99, 0x99, 0x99, 0xAA, 0xBB, 0xCC, 0xBA, 0xBA, 0xA9, 0x99, 0x88, - 0x88, 0x88, 0x99, 0xAA, 0xBB, 0xCB, 0xAB, 0xA9, 0x98, 0x88, 0x77, 0x78, - 0x88, 0x89, 0xAA, 0xBB, 0xBA, 0xAA, 0x98, 0x87, 0x77, 0x77, 0x77, 0x88, - 0x99, 0xAA, 0xBA, 0x9A, 0x99, 0x87, 0x77, 0x66, 0x66, 0x77, 0x88, 0x99, - 0xAB, 0xA9, 0xA9, 0x88, 0x77, 0x66, 0x66, 0x66, 0x77, 0x88, 0x9A, 0xBA, - 0x9A, 0x98, 0x77, 0x66, 0x55, 0x55, 0x66, 0x78, 0x89, 0xAA, 0xA9, 0xA9, - 0x87, 0x76, 0x65, 0x55, 0x56, 0x67, 0x78, 0x9A, 0xAA, 0x9A, 0x98, 0x77, - 0x66, 0x55, 0x55, 0x66, 0x77, 0x89, 0xAA, 0xA9, 0xA9, 0x88, 0x76, 0x65, - 0x55, 0x56, 0x67, 0x78, 0x9A, 0xAA, 0x9A, 0x98, 0x87, 0x76, 0x66, 0x66, - 0x66, 0x78, 0x89, 0xAA, 0xA9, 0xA9, 0x98, 0x87, 0x76, 0x66, 0x67, 0x77, - 0x89, 0x9A, 0xBA, 0xAA, 0xA9, 0x88, 0x87, 0x77, 0x77, 0x77, 0x88, 0x9A, - 0xAB, 0xAA, 0xBA, 0xA9, 0x98, 0x88, 0x77, 0x78, 0x88, 0x99, 0xAB, 0xBB, - 0xAB, 0xBA, 0xA9, 0x98, 0x88, 0x88, 0x89, 0x99, 0xAA, 0xBC, 0xBA, 0xCB, - 0xAA, 0xA9, 0x99, 0x99, 0x99, 0x9A, 0xAA, 0xBB, 0xCB, 0xBC, 0xCB, 0xBA, - 0xAA, 0xAA, 0xAA, 0xAA, 0xAB, 0xBB, 0xCD, 0xBB, 0xCC, 0xCB, 0xBB, 0xBA, - 0xAA, 0xAA, 0xBB, 0xBC, 0xCD, 0xDC, 0x9B, 0xBB, 0xBA, 0xAA, 0xAA, 0xAA, - 0xAA, 0xAB, 0xBB, 0xCC, 0xA0, 0x00, 0x00, 0x00, - ], - [ - 0xAC, 0xBB, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xBB, 0xBC, 0x9C, 0xDC, - 0xCB, 0xBB, 0xAA, 0xAA, 0xAA, 0xBB, 0xBC, 0xCD, 0xDC, 0xBC, 0xBB, 0xAA, - 0xA9, 0x99, 0x99, 0xAA, 0xAB, 0xBC, 0xCD, 0xBB, 0xCB, 0xAA, 0x99, 0x98, - 0x88, 0x89, 0x99, 0xAB, 0xBC, 0xCB, 0xAB, 0xAA, 0x99, 0x88, 0x88, 0x78, - 0x88, 0x99, 0xAB, 0xBC, 0xBA, 0xBA, 0x99, 0x87, 0x77, 0x77, 0x77, 0x88, - 0x9A, 0xAB, 0xCB, 0xAA, 0xA9, 0x88, 0x76, 0x66, 0x66, 0x77, 0x88, 0x9A, - 0xBB, 0xBA, 0xA9, 0x98, 0x76, 0x66, 0x55, 0x66, 0x77, 0x89, 0x9A, 0xBB, - 0xAA, 0x98, 0x87, 0x66, 0x55, 0x55, 0x66, 0x78, 0x89, 0xAB, 0xAA, 0xA9, - 0x87, 0x76, 0x55, 0x55, 0x55, 0x67, 0x88, 0x9A, 0xBA, 0xAA, 0x98, 0x87, - 0x65, 0x55, 0x55, 0x56, 0x77, 0x89, 0xAB, 0xAA, 0xA9, 0x88, 0x76, 0x65, - 0x55, 0x56, 0x67, 0x88, 0x9A, 0xBA, 0xAA, 0x99, 0x87, 0x76, 0x65, 0x56, - 0x67, 0x78, 0x99, 0xAB, 0xAA, 0xBA, 0x98, 0x87, 0x76, 0x66, 0x67, 0x78, - 0x89, 0xAA, 0xBB, 0xAB, 0xAA, 0x98, 0x87, 0x77, 0x77, 0x78, 0x89, 0x9A, - 0xBC, 0xBA, 0xBB, 0xA9, 0x98, 0x88, 0x87, 0x88, 0x89, 0x9A, 0xAB, 0xCB, - 0xBC, 0xBB, 0xAA, 0x99, 0x88, 0x88, 0x99, 0x9A, 0xAB, 0xBC, 0xBB, 0xCC, - 0xBB, 0xAA, 0xA9, 0x99, 0x99, 0xAA, 0xAB, 0xBC, 0xDB, 0xBD, 0xCC, 0xBB, - 0xBA, 0xAA, 0xAA, 0xAA, 0xBB, 0xCC, 0xDD, 0xCC, 0xDD, 0xCC, 0xCB, 0xBB, - 0xBB, 0xBB, 0xBC, 0xCC, 0xCD, 0xDC, 0x8C, 0xCB, 0xBB, 0xBA, 0xAA, 0xAA, - 0xBB, 0xBB, 0xBC, 0xCC, 0xA0, 0x00, 0x00, 0x00, - ], - [ - 0xBD, 0xDC, 0xCC, 0xCB, 0xBB, 0xBB, 0xBB, 0xCC, 0xCC, 0xCD, 0x8D, 0xEE, - 0xDD, 0xCC, 0xCB, 0xBB, 0xCC, 0xCC, 0xDD, 0xEE, 0xFD, 0xDD, 0xDC, 0xCB, - 0xBA, 0xAA, 0xAB, 0xBB, 0xBC, 0xDD, 0xEF, 0xDD, 0xDC, 0xCB, 0xAA, 0xA9, - 0x99, 0x9A, 0xAB, 0xBC, 0xDD, 0xED, 0xCC, 0xCB, 0xAA, 0x98, 0x88, 0x88, - 0x99, 0xAB, 0xBC, 0xDD, 0xDC, 0xCB, 0xA9, 0x98, 0x87, 0x77, 0x78, 0x89, - 0xAB, 0xCC, 0xDC, 0xCC, 0xBA, 0x98, 0x77, 0x66, 0x66, 0x77, 0x89, 0xAB, - 0xCD, 0xCB, 0xBB, 0xA9, 0x87, 0x66, 0x55, 0x66, 0x78, 0x9A, 0xBC, 0xDC, - 0xBB, 0xA9, 0x87, 0x66, 0x54, 0x55, 0x66, 0x78, 0x9A, 0xBC, 0xCB, 0xBA, - 0x98, 0x76, 0x54, 0x44, 0x45, 0x67, 0x89, 0xAB, 0xCC, 0xBB, 0xA9, 0x87, - 0x65, 0x54, 0x44, 0x56, 0x78, 0x9A, 0xBC, 0xCB, 0xBA, 0x98, 0x76, 0x65, - 0x54, 0x56, 0x67, 0x89, 0xAB, 0xCC, 0xBC, 0xBA, 0x98, 0x76, 0x65, 0x56, - 0x67, 0x88, 0x9B, 0xBD, 0xCC, 0xCB, 0xA9, 0x88, 0x76, 0x66, 0x67, 0x78, - 0x9A, 0xBC, 0xDD, 0xCD, 0xBB, 0xA9, 0x88, 0x77, 0x77, 0x88, 0x9A, 0xAB, - 0xCD, 0xCC, 0xDC, 0xBB, 0xA9, 0x98, 0x88, 0x89, 0x99, 0xAB, 0xCD, 0xDD, - 0xDD, 0xCC, 0xBA, 0xAA, 0x99, 0x99, 0xAA, 0xAB, 0xCC, 0xDE, 0xDD, 0xED, - 0xDC, 0xCB, 0xBA, 0xAA, 0xAB, 0xBB, 0xCD, 0xDE, 0xEE, 0xDE, 0xDD, 0xDC, - 0xCB, 0xBB, 0xBB, 0xBC, 0xCD, 0xDE, 0xFF, 0xED, 0xFF, 0xDE, 0xDD, 0xDC, - 0xCC, 0xCD, 0xDD, 0xEE, 0xEF, 0xFE, 0x9D, 0xDD, 0xCC, 0xCC, 0xCC, 0xCC, - 0xCD, 0xDD, 0xDE, 0xEE, 0xC0, 0x00, 0x00, 0x00, - ], - [ - 0xEF, 0xFF, 0xFF, 0xFE, 0xEF, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0x9F, 0xFF, - 0xFF, 0xFF, 0xFF, 0xEE, 0xDE, 0xFF, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, - 0xDD, 0xDD, 0xDD, 0xDD, 0xEE, 0xFF, 0xFF, 0xEF, 0xFF, 0xFD, 0xDC, 0xCC, - 0xBB, 0xBC, 0xCD, 0xDE, 0xFF, 0xFE, 0xFF, 0xFE, 0xDC, 0xBA, 0xAA, 0xAA, - 0xAB, 0xCD, 0xEF, 0xFF, 0xFF, 0xFF, 0xDC, 0xBA, 0x98, 0x88, 0x89, 0xAB, - 0xCD, 0xEF, 0xFF, 0xEF, 0xDC, 0xBA, 0x98, 0x76, 0x77, 0x89, 0xAB, 0xCD, - 0xFF, 0xEE, 0xED, 0xCA, 0x98, 0x66, 0x55, 0x66, 0x89, 0xAB, 0xDE, 0xFF, - 0xEE, 0xDB, 0xA8, 0x76, 0x44, 0x45, 0x67, 0x8A, 0xCD, 0xFF, 0xFE, 0xFD, - 0xBA, 0x86, 0x54, 0x33, 0x45, 0x78, 0xAB, 0xDE, 0xFF, 0xDE, 0xDB, 0xA8, - 0x75, 0x43, 0x34, 0x56, 0x8A, 0xBD, 0xEF, 0xFE, 0xFD, 0xBA, 0x87, 0x65, - 0x44, 0x45, 0x78, 0xAB, 0xDE, 0xFF, 0xEE, 0xDC, 0xA9, 0x87, 0x65, 0x55, - 0x68, 0x9A, 0xCD, 0xFF, 0xFE, 0xFD, 0xCB, 0xA9, 0x87, 0x76, 0x77, 0x9A, - 0xBC, 0xEF, 0xFF, 0xEF, 0xFD, 0xCB, 0xA9, 0x88, 0x88, 0x9A, 0xBC, 0xDF, - 0xFF, 0xFD, 0xFE, 0xDC, 0xCB, 0xAA, 0x9A, 0xAA, 0xBC, 0xDF, 0xFF, 0xFF, - 0xDF, 0xFE, 0xDD, 0xCC, 0xBB, 0xBB, 0xCD, 0xDD, 0xFF, 0xFF, 0xFD, 0xFF, - 0xFE, 0xED, 0xDC, 0xDC, 0xDD, 0xEE, 0xFF, 0xFF, 0xFF, 0xDF, 0xFF, 0xEE, - 0xEF, 0xED, 0xEE, 0xEF, 0xFF, 0xFF, 0xFF, 0xFD, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x8D, 0xDD, 0xCD, 0xDE, 0xDD, 0xDF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xE0, 0x00, 0x00, 0x00, - ], - [ - 0xDE, 0xDD, 0xDD, 0xDC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCD, 0xDD, 0x9E, 0xFE, - 0xED, 0xDD, 0xCC, 0xCC, 0xCC, 0xDD, 0xDE, 0xEF, 0xFD, 0xEE, 0xED, 0xDC, - 0xCB, 0xBB, 0xBB, 0xBC, 0xCD, 0xDE, 0xEF, 0xED, 0xED, 0xCC, 0xBA, 0xAA, - 0xAA, 0xAA, 0xBB, 0xCC, 0xDE, 0xFD, 0xDE, 0xCC, 0xBA, 0x99, 0x98, 0x99, - 0x9A, 0xAB, 0xCD, 0xDE, 0xDD, 0xDC, 0xBA, 0x98, 0x87, 0x77, 0x88, 0x9A, - 0xAB, 0xCD, 0xED, 0xCD, 0xCB, 0xA8, 0x87, 0x66, 0x67, 0x78, 0x9A, 0xBC, - 0xDD, 0xDC, 0xCB, 0xA9, 0x87, 0x65, 0x55, 0x66, 0x78, 0x9A, 0xBC, 0xDD, - 0xCC, 0xBA, 0x97, 0x65, 0x54, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xDC, 0xCB, - 0xA9, 0x76, 0x54, 0x44, 0x45, 0x67, 0x9A, 0xBC, 0xDD, 0xCC, 0xBA, 0x87, - 0x65, 0x44, 0x44, 0x56, 0x79, 0xAB, 0xCD, 0xDC, 0xCB, 0xA9, 0x87, 0x65, - 0x44, 0x55, 0x67, 0x9A, 0xBC, 0xDD, 0xCD, 0xBA, 0x98, 0x76, 0x65, 0x55, - 0x67, 0x89, 0xAC, 0xCE, 0xDC, 0xCC, 0xBA, 0x98, 0x76, 0x66, 0x67, 0x89, - 0xAB, 0xCD, 0xED, 0xCD, 0xCB, 0xA9, 0x98, 0x87, 0x77, 0x88, 0x9A, 0xBC, - 0xDE, 0xEC, 0xDD, 0xCB, 0xAA, 0x99, 0x89, 0x99, 0xAA, 0xBC, 0xDE, 0xEE, - 0xDD, 0xDC, 0xCB, 0xBA, 0xAA, 0xAA, 0xAB, 0xBC, 0xDD, 0xEF, 0xEC, 0xED, - 0xDC, 0xCB, 0xBB, 0xBB, 0xBB, 0xCC, 0xDD, 0xEF, 0xFE, 0xDF, 0xEE, 0xDD, - 0xCC, 0xCC, 0xCC, 0xCD, 0xED, 0xFE, 0xFF, 0xFC, 0xFF, 0xFE, 0xED, 0xDD, - 0xDD, 0xDD, 0xEE, 0xFE, 0xFF, 0xFF, 0x9D, 0xED, 0xDD, 0xDD, 0xDD, 0xDD, - 0xED, 0xDE, 0xEF, 0xFF, 0xD0, 0x00, 0x00, 0x00, - ], - [ - 0xCE, 0xDD, 0xDC, 0xCC, 0xBB, 0xBB, 0xBC, 0xCC, 0xCD, 0xDD, 0xAE, 0xEE, - 0xDD, 0xCC, 0xCB, 0xBB, 0xBC, 0xCC, 0xDD, 0xEE, 0xEE, 0xDE, 0xDD, 0xCB, - 0xBA, 0xAA, 0xAA, 0xBB, 0xBC, 0xCD, 0xDE, 0xDD, 0xDC, 0xCB, 0xAA, 0x99, - 0x99, 0x9A, 0xAA, 0xBC, 0xCD, 0xED, 0xDD, 0xCB, 0xA9, 0x98, 0x88, 0x88, - 0x89, 0xAA, 0xBC, 0xCD, 0xDC, 0xCB, 0xA9, 0x98, 0x77, 0x77, 0x78, 0x89, - 0xAA, 0xBC, 0xDD, 0xCC, 0xBA, 0x98, 0x77, 0x66, 0x66, 0x77, 0x89, 0xAB, - 0xCD, 0xDC, 0xCA, 0x98, 0x77, 0x65, 0x55, 0x66, 0x78, 0x99, 0xAB, 0xDC, - 0xBB, 0xA9, 0x87, 0x65, 0x55, 0x55, 0x66, 0x78, 0x9A, 0xBC, 0xCB, 0xBA, - 0x98, 0x76, 0x54, 0x44, 0x55, 0x67, 0x89, 0xAB, 0xCC, 0xBB, 0xA9, 0x87, - 0x65, 0x54, 0x45, 0x56, 0x78, 0x9A, 0xBC, 0xCB, 0xBA, 0x98, 0x76, 0x65, - 0x54, 0x55, 0x67, 0x89, 0xAB, 0xCC, 0xBC, 0xAA, 0x98, 0x76, 0x65, 0x55, - 0x67, 0x78, 0x9A, 0xCD, 0xDC, 0xCB, 0xA9, 0x87, 0x76, 0x66, 0x67, 0x78, - 0x9A, 0xBC, 0xDD, 0xCC, 0xBA, 0xA9, 0x88, 0x77, 0x77, 0x78, 0x99, 0xAB, - 0xCD, 0xDC, 0xDC, 0xBA, 0xA9, 0x98, 0x88, 0x88, 0x99, 0xAB, 0xCD, 0xED, - 0xCD, 0xCC, 0xBA, 0xAA, 0x99, 0x99, 0x9A, 0xAB, 0xCC, 0xDE, 0xED, 0xED, - 0xCC, 0xBB, 0xAA, 0xAA, 0xAA, 0xBB, 0xCD, 0xDE, 0xFE, 0xDE, 0xDD, 0xCC, - 0xCC, 0xBB, 0xBB, 0xCC, 0xCD, 0xDE, 0xFF, 0xED, 0xFE, 0xED, 0xDD, 0xCC, - 0xCC, 0xCD, 0xDD, 0xEE, 0xEF, 0xFF, 0xAD, 0xDD, 0xDC, 0xCC, 0xCC, 0xCC, - 0xCD, 0xDD, 0xEE, 0xEF, 0xD0, 0x00, 0x00, 0x00, - ], - [ - 0xCE, 0xED, 0xDD, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xDD, 0x9E, 0xFF, - 0xEE, 0xDD, 0xCC, 0xCC, 0xCC, 0xCD, 0xDE, 0xEF, 0xFD, 0xEF, 0xED, 0xDC, - 0xCB, 0xBB, 0xBB, 0xBB, 0xCC, 0xDD, 0xEF, 0xDD, 0xED, 0xCC, 0xBB, 0xAA, - 0xAA, 0xAA, 0xAB, 0xCC, 0xDD, 0xED, 0xDE, 0xDC, 0xBA, 0xA9, 0x98, 0x89, - 0x9A, 0xAB, 0xCC, 0xDE, 0xDD, 0xDC, 0xBA, 0x98, 0x87, 0x77, 0x88, 0x99, - 0xAB, 0xCD, 0xED, 0xCD, 0xCB, 0xA8, 0x87, 0x66, 0x67, 0x78, 0x9A, 0xBB, - 0xCD, 0xDC, 0xDB, 0xA9, 0x87, 0x65, 0x55, 0x66, 0x78, 0x9A, 0xBC, 0xDD, - 0xCC, 0xBA, 0x97, 0x65, 0x54, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xDC, 0xCB, - 0xA8, 0x76, 0x54, 0x44, 0x45, 0x67, 0x9A, 0xBC, 0xDD, 0xCC, 0xBA, 0x97, - 0x65, 0x44, 0x44, 0x56, 0x78, 0xAB, 0xCD, 0xDC, 0xCB, 0xA9, 0x87, 0x65, - 0x44, 0x55, 0x67, 0x9A, 0xBC, 0xDD, 0xCC, 0xBA, 0x98, 0x76, 0x65, 0x55, - 0x67, 0x89, 0xAB, 0xCD, 0xDC, 0xCC, 0xBA, 0x98, 0x77, 0x66, 0x67, 0x88, - 0x9A, 0xBC, 0xDD, 0xCD, 0xCB, 0xA9, 0x98, 0x87, 0x78, 0x89, 0x9A, 0xBC, - 0xCD, 0xDD, 0xDC, 0xCB, 0xAA, 0x99, 0x98, 0x99, 0x9A, 0xBB, 0xCD, 0xDD, - 0xDE, 0xDC, 0xCB, 0xBA, 0xAA, 0xAA, 0xAB, 0xBB, 0xCD, 0xDD, 0xDD, 0xED, - 0xDC, 0xCB, 0xBB, 0xBB, 0xBB, 0xBC, 0xCC, 0xDE, 0xED, 0xDE, 0xED, 0xDD, - 0xCC, 0xCC, 0xCC, 0xCC, 0xCD, 0xDE, 0xEF, 0xDD, 0xFE, 0xEE, 0xDD, 0xDD, - 0xDD, 0xDD, 0xDE, 0xEE, 0xEF, 0xFE, 0x9D, 0xDD, 0xDD, 0xDD, 0xDD, 0xCC, - 0xDD, 0xDD, 0xDE, 0xDE, 0xC0, 0x00, 0x00, 0x00, - ], - [ - 0xDF, 0xFF, 0xFE, 0xEE, 0xDD, 0xDD, 0xDC, 0xCC, 0xDD, 0xCD, 0x8F, 0xFF, - 0xFF, 0xFF, 0xFE, 0xDE, 0xEE, 0xDF, 0xEF, 0xFF, 0xFE, 0xEF, 0xFF, 0xFF, - 0xDD, 0xDC, 0xCC, 0xDD, 0xDE, 0xEE, 0xFF, 0xDF, 0xFF, 0xEE, 0xDC, 0xCB, - 0xBB, 0xBC, 0xCD, 0xDD, 0xFF, 0xFE, 0xFF, 0xFD, 0xDC, 0xBA, 0xAA, 0xAA, - 0xAB, 0xCD, 0xEE, 0xFF, 0xEE, 0xEE, 0xCC, 0xBA, 0x98, 0x88, 0x89, 0xAB, - 0xCC, 0xEF, 0xFF, 0xFF, 0xDC, 0xBA, 0x88, 0x77, 0x77, 0x89, 0xAB, 0xCD, - 0xEF, 0xFE, 0xED, 0xCA, 0x97, 0x65, 0x55, 0x67, 0x89, 0xAC, 0xDE, 0xFE, - 0xEE, 0xDB, 0xA8, 0x75, 0x44, 0x45, 0x67, 0x8A, 0xBD, 0xEE, 0xED, 0xFC, - 0xBA, 0x87, 0x54, 0x33, 0x45, 0x78, 0x9B, 0xDE, 0xFF, 0xDD, 0xCB, 0xA8, - 0x75, 0x43, 0x34, 0x57, 0x8A, 0xBC, 0xEF, 0xFD, 0xDC, 0xBA, 0x87, 0x65, - 0x44, 0x45, 0x78, 0xAB, 0xDE, 0xFF, 0xDE, 0xDC, 0xA9, 0x87, 0x65, 0x55, - 0x68, 0x9A, 0xCD, 0xEF, 0xFD, 0xED, 0xCB, 0xA9, 0x87, 0x77, 0x78, 0x9A, - 0xBC, 0xEF, 0xFF, 0xDE, 0xEC, 0xCB, 0xA9, 0x88, 0x88, 0x9A, 0xBC, 0xDD, - 0xFF, 0xFF, 0xFF, 0xDC, 0xBB, 0xAA, 0xAA, 0xAA, 0xBC, 0xDD, 0xEF, 0xFF, - 0xEF, 0xFE, 0xDD, 0xCC, 0xBB, 0xBB, 0xCC, 0xDD, 0xFF, 0xFF, 0xFE, 0xFE, - 0xEE, 0xDD, 0xDC, 0xCC, 0xCD, 0xDF, 0xEF, 0xFF, 0xFF, 0xEF, 0xFF, 0xFF, - 0xEE, 0xED, 0xEE, 0xEE, 0xFF, 0xFF, 0xFF, 0xFD, 0xFF, 0xFF, 0xFF, 0xEF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x8D, 0xDD, 0xDE, 0xED, 0xDE, 0xFF, - 0xEF, 0xFF, 0xFF, 0xFF, 0xD0, 0x00, 0x00, 0x00, - ], - [ - 0xCF, 0xDD, 0xDC, 0xCC, 0xCC, 0xCB, 0xCC, 0xCC, 0xCC, 0xCD, 0x8E, 0xFE, - 0xED, 0xDD, 0xCC, 0xCC, 0xCC, 0xCC, 0xEE, 0xEF, 0xFD, 0xDE, 0xED, 0xCC, - 0xBB, 0xBB, 0xBB, 0xBC, 0xCD, 0xDE, 0xEF, 0xED, 0xED, 0xCB, 0xBA, 0xAA, - 0xAA, 0xAA, 0xBB, 0xCC, 0xDE, 0xFD, 0xDD, 0xCC, 0xBA, 0x99, 0x99, 0x99, - 0x9A, 0xAB, 0xCD, 0xEE, 0xDC, 0xDC, 0xBA, 0x98, 0x88, 0x77, 0x88, 0x99, - 0xAB, 0xCD, 0xED, 0xCC, 0xCA, 0x98, 0x87, 0x66, 0x67, 0x78, 0x9A, 0xBB, - 0xDD, 0xDC, 0xCB, 0xA9, 0x87, 0x66, 0x55, 0x66, 0x78, 0x9A, 0xBC, 0xDD, - 0xCC, 0xBA, 0x98, 0x66, 0x54, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xDC, 0xCB, - 0xA8, 0x76, 0x54, 0x44, 0x45, 0x67, 0x9A, 0xBC, 0xDD, 0xCC, 0xBA, 0x97, - 0x65, 0x44, 0x34, 0x56, 0x79, 0xAB, 0xCD, 0xDC, 0xCB, 0xA9, 0x87, 0x65, - 0x44, 0x56, 0x68, 0x9A, 0xBC, 0xDD, 0xCC, 0xBA, 0x98, 0x76, 0x65, 0x56, - 0x67, 0x89, 0xAB, 0xCD, 0xDC, 0xCC, 0xBA, 0x98, 0x77, 0x66, 0x67, 0x88, - 0x9A, 0xBC, 0xED, 0xCD, 0xCB, 0xAA, 0x98, 0x87, 0x77, 0x88, 0x9A, 0xBC, - 0xDE, 0xDC, 0xDC, 0xCB, 0xAA, 0x99, 0x88, 0x99, 0x9A, 0xBC, 0xCD, 0xEE, - 0xDE, 0xDC, 0xCB, 0xBA, 0xAA, 0xAA, 0xAA, 0xBC, 0xCD, 0xDF, 0xED, 0xED, - 0xDC, 0xCB, 0xBB, 0xBB, 0xBB, 0xBC, 0xCD, 0xEE, 0xFE, 0xDE, 0xED, 0xDD, - 0xCC, 0xCC, 0xCC, 0xCC, 0xDD, 0xEF, 0xFF, 0xED, 0xFE, 0xEE, 0xED, 0xDD, - 0xCD, 0xDD, 0xDE, 0xFF, 0xFF, 0xFF, 0x7C, 0xCC, 0xCC, 0xCC, 0xDC, 0xCD, - 0xDD, 0xDE, 0xEE, 0xFF, 0xD0, 0x00, 0x00, 0x00, - ], - [ - 0xBC, 0xCB, 0xBA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAB, 0xBB, 0xBC, 0x8C, 0xDD, - 0xCB, 0xBB, 0xBA, 0xAA, 0xAB, 0xBB, 0xBC, 0xCD, 0xDC, 0xCC, 0xCB, 0xBA, - 0xAA, 0x99, 0x9A, 0xAA, 0xAB, 0xBC, 0xDD, 0xCB, 0xCB, 0xBA, 0xA9, 0x99, - 0x89, 0x99, 0x9A, 0xAB, 0xBC, 0xDC, 0xBB, 0xBA, 0x99, 0x88, 0x88, 0x88, - 0x89, 0x9A, 0xAB, 0xCC, 0xBB, 0xBA, 0xA9, 0x88, 0x77, 0x77, 0x77, 0x88, - 0x9A, 0xAB, 0xCB, 0xAB, 0xA9, 0x88, 0x77, 0x66, 0x66, 0x77, 0x89, 0x9A, - 0xBC, 0xBA, 0xAA, 0x98, 0x77, 0x66, 0x55, 0x66, 0x78, 0x89, 0xAB, 0xCB, - 0xAA, 0xA9, 0x87, 0x66, 0x55, 0x55, 0x66, 0x78, 0x9A, 0xAB, 0xBA, 0xA9, - 0x98, 0x76, 0x55, 0x44, 0x55, 0x67, 0x89, 0x9A, 0xBB, 0xAA, 0x99, 0x87, - 0x66, 0x54, 0x45, 0x56, 0x78, 0x99, 0xAB, 0xBA, 0xAA, 0x98, 0x76, 0x65, - 0x55, 0x56, 0x67, 0x89, 0xAA, 0xBB, 0xAA, 0xA9, 0x88, 0x76, 0x65, 0x56, - 0x66, 0x78, 0x9A, 0xAB, 0xBA, 0xBA, 0x99, 0x87, 0x76, 0x66, 0x67, 0x78, - 0x89, 0xAB, 0xCB, 0xBB, 0xAA, 0x99, 0x87, 0x77, 0x77, 0x78, 0x89, 0x9A, - 0xBC, 0xBB, 0xCB, 0xAA, 0x99, 0x88, 0x88, 0x88, 0x89, 0x9A, 0xBB, 0xCC, - 0xBC, 0xBB, 0xAA, 0x99, 0x99, 0x89, 0x99, 0xAA, 0xBB, 0xCD, 0xCB, 0xCC, - 0xCB, 0xAA, 0xA9, 0x99, 0xAA, 0xAA, 0xBB, 0xCC, 0xDC, 0xBD, 0xDC, 0xBB, - 0xBA, 0xAA, 0xAA, 0xBB, 0xBB, 0xCC, 0xDE, 0xCC, 0xDD, 0xDC, 0xCC, 0xBB, - 0xBB, 0xBB, 0xCC, 0xCD, 0xDD, 0xED, 0x8C, 0xCB, 0xBB, 0xBB, 0xBB, 0xBB, - 0xBB, 0xBC, 0xCC, 0xDD, 0xB0, 0x00, 0x00, 0x00, - ], - [ - 0xAB, 0xBA, 0xAA, 0xA9, 0x99, 0x99, 0x99, 0xAA, 0xAA, 0xBB, 0x9B, 0xCC, - 0xBB, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xBB, 0xCC, 0xCB, 0xBC, 0xBA, 0xAA, - 0x99, 0x99, 0x99, 0x99, 0xAA, 0xBB, 0xCC, 0xBA, 0xBB, 0xA9, 0x99, 0x88, - 0x88, 0x88, 0x99, 0xAA, 0xBB, 0xCB, 0xAB, 0xA9, 0x98, 0x88, 0x77, 0x78, - 0x88, 0x99, 0xAA, 0xBB, 0xBA, 0xAA, 0x98, 0x87, 0x77, 0x77, 0x77, 0x88, - 0x99, 0xAA, 0xBA, 0xAA, 0x99, 0x87, 0x76, 0x66, 0x66, 0x77, 0x88, 0x99, - 0xAB, 0xA9, 0xA9, 0x88, 0x76, 0x66, 0x66, 0x66, 0x77, 0x88, 0x9A, 0xBA, - 0x9A, 0x98, 0x77, 0x66, 0x55, 0x56, 0x66, 0x78, 0x89, 0xAA, 0xA9, 0xA9, - 0x87, 0x76, 0x65, 0x55, 0x56, 0x67, 0x78, 0x9A, 0xAA, 0x9A, 0x98, 0x77, - 0x66, 0x55, 0x55, 0x66, 0x77, 0x89, 0xAA, 0xA9, 0xA9, 0x88, 0x76, 0x65, - 0x55, 0x56, 0x67, 0x78, 0x9A, 0xAA, 0x9A, 0x98, 0x87, 0x76, 0x66, 0x66, - 0x66, 0x78, 0x89, 0xAA, 0xA9, 0xA9, 0x98, 0x87, 0x76, 0x66, 0x66, 0x77, - 0x88, 0x9A, 0xBA, 0xAA, 0xA9, 0x98, 0x87, 0x77, 0x77, 0x77, 0x88, 0x9A, - 0xAB, 0xAA, 0xBA, 0xA9, 0x98, 0x88, 0x77, 0x78, 0x88, 0x99, 0xAB, 0xBB, - 0xAB, 0xBA, 0xA9, 0x98, 0x88, 0x88, 0x89, 0x99, 0xAA, 0xBC, 0xBB, 0xCB, - 0xBA, 0xA9, 0x99, 0x99, 0x99, 0x9A, 0xAA, 0xBC, 0xCB, 0xBC, 0xCB, 0xBA, - 0xAA, 0xAA, 0xAA, 0xAA, 0xAB, 0xBC, 0xCD, 0xCB, 0xDC, 0xCB, 0xBB, 0xBA, - 0xAA, 0xAB, 0xBB, 0xBC, 0xCD, 0xDC, 0x9B, 0xBB, 0xBA, 0xAA, 0xAA, 0xAA, - 0xAA, 0xBB, 0xBC, 0xCC, 0xB0, 0x00, 0x00, 0x00, - ], - [ - 0xAC, 0xCB, 0xBB, 0xAA, 0xAA, 0xAA, 0xAA, 0xAB, 0xBB, 0xBC, 0x8C, 0xDC, - 0xCB, 0xBB, 0xAA, 0xAA, 0xBB, 0xBB, 0xCC, 0xCD, 0xDC, 0xBD, 0xCB, 0xBA, - 0xAA, 0x99, 0xAA, 0xAA, 0xBB, 0xCC, 0xDD, 0xCB, 0xCB, 0xBA, 0xA9, 0x99, - 0x99, 0x99, 0x9A, 0xAB, 0xBC, 0xDB, 0xBB, 0xBA, 0x99, 0x88, 0x88, 0x88, - 0x89, 0x9A, 0xAB, 0xBC, 0xBB, 0xBA, 0xA9, 0x88, 0x77, 0x77, 0x78, 0x88, - 0x9A, 0xBB, 0xCB, 0xAB, 0xA9, 0x88, 0x77, 0x66, 0x66, 0x77, 0x89, 0x9A, - 0xBB, 0xBA, 0xBA, 0x98, 0x77, 0x66, 0x55, 0x66, 0x78, 0x89, 0xAB, 0xBB, - 0xAA, 0x99, 0x87, 0x66, 0x55, 0x55, 0x66, 0x78, 0x99, 0xBB, 0xBA, 0xA9, - 0x98, 0x76, 0x55, 0x44, 0x55, 0x67, 0x89, 0xAA, 0xBB, 0xAA, 0x99, 0x87, - 0x65, 0x54, 0x45, 0x56, 0x78, 0x99, 0xAB, 0xBA, 0xAA, 0x98, 0x76, 0x65, - 0x55, 0x56, 0x67, 0x89, 0x9A, 0xBB, 0xAB, 0xA9, 0x88, 0x76, 0x65, 0x56, - 0x67, 0x78, 0x9A, 0xAB, 0xBA, 0xBA, 0x99, 0x87, 0x76, 0x66, 0x67, 0x78, - 0x89, 0xAB, 0xBB, 0xBB, 0xBA, 0x98, 0x88, 0x77, 0x77, 0x78, 0x89, 0x9A, - 0xBC, 0xBB, 0xBB, 0xAA, 0x99, 0x88, 0x88, 0x88, 0x89, 0x9A, 0xAB, 0xCB, - 0xBC, 0xBB, 0xAA, 0x99, 0x99, 0x99, 0x99, 0x9A, 0xAB, 0xCC, 0xCB, 0xDC, - 0xBB, 0xAA, 0xAA, 0x99, 0x9A, 0xAA, 0xBB, 0xCC, 0xDC, 0xCD, 0xCC, 0xCB, - 0xBB, 0xAA, 0xAA, 0xAB, 0xBB, 0xCC, 0xDD, 0xCC, 0xDD, 0xCC, 0xCC, 0xBB, - 0xBB, 0xBB, 0xCC, 0xCC, 0xDE, 0xED, 0x8C, 0xCB, 0xBB, 0xBB, 0xBB, 0xBB, - 0xBB, 0xBB, 0xCC, 0xCD, 0xB0, 0x00, 0x00, 0x00, - ], - [ - 0xDF, 0xEE, 0xED, 0xDC, 0xCC, 0xBC, 0xCC, 0xCC, 0xDC, 0xCD, 0x7E, 0xFF, - 0xEE, 0xDD, 0xCC, 0xCC, 0xCD, 0xDE, 0xEE, 0xEF, 0xFD, 0xEF, 0xED, 0xDC, - 0xCC, 0xBB, 0xBB, 0xBB, 0xCC, 0xEE, 0xFF, 0xED, 0xEE, 0xDC, 0xBB, 0xAA, - 0xAA, 0xAA, 0xBB, 0xCD, 0xDF, 0xFE, 0xDE, 0xDC, 0xBA, 0xA9, 0x99, 0x99, - 0x9A, 0xAB, 0xCD, 0xEF, 0xED, 0xEC, 0xBA, 0x99, 0x88, 0x77, 0x88, 0x9A, - 0xBB, 0xDD, 0xED, 0xDD, 0xCB, 0x99, 0x87, 0x76, 0x67, 0x78, 0x9A, 0xBC, - 0xCE, 0xDD, 0xDB, 0xA9, 0x87, 0x66, 0x55, 0x66, 0x78, 0x9A, 0xCD, 0xED, - 0xCC, 0xBA, 0x98, 0x76, 0x54, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xDC, 0xCB, - 0xA9, 0x76, 0x54, 0x34, 0x45, 0x67, 0x9A, 0xBC, 0xDD, 0xCC, 0xBA, 0x97, - 0x65, 0x44, 0x34, 0x56, 0x79, 0xAB, 0xCD, 0xEC, 0xCB, 0xA9, 0x87, 0x65, - 0x44, 0x56, 0x78, 0x9A, 0xBC, 0xDD, 0xCC, 0xBA, 0x98, 0x76, 0x65, 0x56, - 0x67, 0x89, 0xAB, 0xCE, 0xDD, 0xDC, 0xBA, 0x98, 0x77, 0x66, 0x77, 0x89, - 0xAB, 0xCD, 0xED, 0xDD, 0xCB, 0xAA, 0x98, 0x87, 0x78, 0x89, 0x9A, 0xBC, - 0xDF, 0xED, 0xED, 0xCB, 0xAA, 0x99, 0x89, 0x99, 0xAA, 0xBC, 0xDE, 0xEF, - 0xDE, 0xDD, 0xCC, 0xBA, 0xAA, 0xAA, 0xAB, 0xBC, 0xDE, 0xFE, 0xFD, 0xFE, - 0xDD, 0xCC, 0xBB, 0xBB, 0xBB, 0xCC, 0xDD, 0xFF, 0xFF, 0xDF, 0xEF, 0xED, - 0xDD, 0xCC, 0xCC, 0xCD, 0xEE, 0xFE, 0xFF, 0xFD, 0xEF, 0xEE, 0xFE, 0xDD, - 0xDD, 0xED, 0xEE, 0xFF, 0xFF, 0xFF, 0x8D, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, - 0xED, 0xFE, 0xEF, 0xFF, 0xD0, 0x00, 0x00, 0x00, - ], - [ - 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xED, 0xDD, 0xDD, 0xDD, 0xCC, 0x8F, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFD, 0xFE, 0xEF, 0xFF, 0xFF, 0xFD, 0xFF, 0xFF, 0xFF, - 0xFE, 0xCD, 0xDC, 0xDD, 0xDD, 0xFF, 0xFF, 0xEF, 0xFF, 0xFF, 0xDC, 0xCC, - 0xBC, 0xBC, 0xDD, 0xDD, 0xFF, 0xFF, 0xFF, 0xFE, 0xDD, 0xBB, 0xAA, 0xAA, - 0xBB, 0xCC, 0xDF, 0xFF, 0xFF, 0xFF, 0xDC, 0xBA, 0x98, 0x88, 0x89, 0xAB, - 0xCC, 0xDE, 0xFF, 0xFF, 0xFD, 0xBA, 0x98, 0x77, 0x77, 0x89, 0xAB, 0xDD, - 0xFF, 0xFF, 0xFE, 0xCB, 0x98, 0x65, 0x55, 0x67, 0x89, 0xAC, 0xDF, 0xFF, - 0xFF, 0xDB, 0xA8, 0x75, 0x44, 0x45, 0x67, 0x8A, 0xCD, 0xFF, 0xFF, 0xFD, - 0xBA, 0x87, 0x54, 0x33, 0x45, 0x78, 0xAB, 0xCE, 0xFF, 0xEF, 0xCB, 0xA8, - 0x75, 0x43, 0x34, 0x57, 0x8A, 0xBD, 0xFF, 0xFE, 0xFD, 0xCA, 0x97, 0x65, - 0x44, 0x45, 0x78, 0xAB, 0xDD, 0xFF, 0xEF, 0xDC, 0xA9, 0x87, 0x65, 0x55, - 0x67, 0x9A, 0xCE, 0xFF, 0xFE, 0xFF, 0xDB, 0xA9, 0x87, 0x76, 0x77, 0x9A, - 0xBC, 0xFF, 0xFF, 0xEF, 0xFC, 0xCB, 0xA9, 0x88, 0x88, 0x9A, 0xBC, 0xDF, - 0xFF, 0xFE, 0xFE, 0xDC, 0xCB, 0xAA, 0xAA, 0xAA, 0xBC, 0xDE, 0xFF, 0xFF, - 0xDF, 0xFE, 0xDC, 0xDC, 0xBB, 0xBB, 0xCC, 0xDF, 0xFF, 0xFF, 0xFD, 0xFF, - 0xFE, 0xED, 0xDD, 0xDC, 0xDE, 0xFE, 0xFF, 0xFF, 0xFF, 0xDF, 0xFF, 0xFF, - 0xEF, 0xEE, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x8C, 0xDC, 0xDC, 0xDE, 0xFE, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00, 0x00, - ], - [ - 0xDE, 0xEE, 0xDD, 0xDC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0x8F, 0xFF, - 0xEE, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xFE, 0xED, 0xFF, 0xFE, 0xDD, - 0xCC, 0xCC, 0xCC, 0xCC, 0xCD, 0xDD, 0xEF, 0xDD, 0xEE, 0xDC, 0xCB, 0xBB, - 0xAB, 0xBB, 0xBC, 0xCD, 0xDE, 0xED, 0xDE, 0xDD, 0xCB, 0xAA, 0x99, 0x99, - 0xAA, 0xBC, 0xCD, 0xEE, 0xDD, 0xDD, 0xCB, 0xA9, 0x88, 0x88, 0x89, 0x9A, - 0xBC, 0xDD, 0xED, 0xCD, 0xCB, 0xA9, 0x87, 0x77, 0x77, 0x88, 0x9A, 0xBC, - 0xDE, 0xDD, 0xDC, 0xBA, 0x87, 0x66, 0x55, 0x67, 0x89, 0xAB, 0xCD, 0xDD, - 0xCD, 0xCA, 0x98, 0x76, 0x54, 0x45, 0x67, 0x8A, 0xAC, 0xDE, 0xDC, 0xDB, - 0xA9, 0x87, 0x54, 0x33, 0x45, 0x78, 0x9A, 0xCD, 0xDD, 0xCD, 0xCA, 0x98, - 0x75, 0x43, 0x34, 0x56, 0x89, 0xAC, 0xCE, 0xDC, 0xDC, 0xBA, 0x87, 0x65, - 0x44, 0x55, 0x78, 0x9A, 0xCD, 0xED, 0xCD, 0xCB, 0xA9, 0x87, 0x65, 0x55, - 0x67, 0x8A, 0xBC, 0xDE, 0xDC, 0xDC, 0xBA, 0x98, 0x87, 0x76, 0x77, 0x89, - 0xAB, 0xCD, 0xEE, 0xCD, 0xDC, 0xBA, 0x99, 0x88, 0x88, 0x89, 0xAB, 0xCD, - 0xDF, 0xDC, 0xED, 0xCB, 0xBA, 0xA9, 0x99, 0x9A, 0xAB, 0xBC, 0xEF, 0xFE, - 0xCE, 0xDD, 0xCC, 0xBB, 0xAA, 0xBB, 0xBB, 0xCC, 0xDE, 0xFF, 0xED, 0xED, - 0xED, 0xDC, 0xCC, 0xCC, 0xCC, 0xDD, 0xDE, 0xFF, 0xFF, 0xDE, 0xEE, 0xDD, - 0xDD, 0xDD, 0xDD, 0xDE, 0xEE, 0xFF, 0xFF, 0xFD, 0xEE, 0xEE, 0xEE, 0xEE, - 0xDE, 0xEE, 0xEF, 0xFF, 0xFF, 0xFF, 0x8D, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, - 0xED, 0xEE, 0xEF, 0xFF, 0xE0, 0x00, 0x00, 0x00, - ], - [ - 0xDF, 0xED, 0xDC, 0xCC, 0xBB, 0xBB, 0xBB, 0xBC, 0xCC, 0xCC, 0xAE, 0xFE, - 0xED, 0xCC, 0xBB, 0xBB, 0xBB, 0xCC, 0xCD, 0xDE, 0xED, 0xEE, 0xDD, 0xCB, - 0xBA, 0xAA, 0xAA, 0xAB, 0xBC, 0xCD, 0xDE, 0xDD, 0xDC, 0xCB, 0xAA, 0x99, - 0x99, 0x99, 0xAA, 0xBB, 0xCD, 0xDC, 0xDD, 0xCB, 0xA9, 0x98, 0x88, 0x88, - 0x89, 0x9A, 0xBC, 0xCD, 0xCC, 0xCB, 0xA9, 0x88, 0x77, 0x77, 0x77, 0x89, - 0x9A, 0xBC, 0xDC, 0xCC, 0xBA, 0x98, 0x76, 0x66, 0x66, 0x77, 0x89, 0xAB, - 0xBC, 0xCC, 0xBA, 0x98, 0x76, 0x65, 0x55, 0x66, 0x77, 0x89, 0xAB, 0xCC, - 0xBB, 0xA9, 0x87, 0x65, 0x55, 0x55, 0x66, 0x78, 0x9A, 0xBC, 0xCB, 0xBA, - 0x98, 0x76, 0x55, 0x44, 0x55, 0x67, 0x89, 0xAB, 0xCC, 0xBB, 0xA9, 0x87, - 0x65, 0x54, 0x45, 0x56, 0x78, 0x9A, 0xBC, 0xCB, 0xBA, 0x98, 0x76, 0x65, - 0x55, 0x55, 0x67, 0x89, 0xAB, 0xCC, 0xBB, 0xA9, 0x88, 0x76, 0x65, 0x55, - 0x66, 0x78, 0x9A, 0xBD, 0xDB, 0xCB, 0xA9, 0x87, 0x76, 0x66, 0x66, 0x78, - 0x9A, 0xBC, 0xDD, 0xCC, 0xBA, 0x99, 0x88, 0x77, 0x77, 0x78, 0x89, 0xAB, - 0xCD, 0xDC, 0xCB, 0xBA, 0x99, 0x88, 0x88, 0x88, 0x99, 0xAB, 0xCD, 0xED, - 0xCD, 0xCB, 0xBA, 0xA9, 0x99, 0x99, 0x9A, 0xAB, 0xCC, 0xDE, 0xEC, 0xDD, - 0xCC, 0xBB, 0xAA, 0xAA, 0xAA, 0xBB, 0xCD, 0xDE, 0xFE, 0xCE, 0xDD, 0xCC, - 0xCB, 0xBB, 0xBB, 0xBC, 0xCD, 0xDE, 0xFF, 0xFC, 0xEE, 0xDD, 0xDC, 0xCC, - 0xCC, 0xCC, 0xDD, 0xEE, 0xFF, 0xFF, 0x9D, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, - 0xDD, 0xDE, 0xEE, 0xFF, 0xE0, 0x00, 0x00, 0x00, - ], - [ - 0xEF, 0xFF, 0xED, 0xDD, 0xDC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0x8F, 0xFF, - 0xEE, 0xDD, 0xDC, 0xCC, 0xCC, 0xDD, 0xDD, 0xEE, 0xED, 0xFF, 0xFD, 0xDC, - 0xCB, 0xBB, 0xBB, 0xBC, 0xCC, 0xDD, 0xEE, 0xDF, 0xFE, 0xDC, 0xBB, 0xAA, - 0xAA, 0xAA, 0xBB, 0xCC, 0xDE, 0xFD, 0xEF, 0xDC, 0xBA, 0x99, 0x98, 0x99, - 0x9A, 0xAB, 0xCC, 0xDE, 0xDE, 0xEC, 0xBA, 0x98, 0x87, 0x77, 0x88, 0x9A, - 0xAB, 0xCD, 0xED, 0xDD, 0xCB, 0xA8, 0x77, 0x66, 0x67, 0x78, 0x9A, 0xBC, - 0xDD, 0xDD, 0xDB, 0xA9, 0x87, 0x65, 0x55, 0x66, 0x78, 0x9A, 0xBD, 0xDD, - 0xDD, 0xBA, 0x97, 0x65, 0x54, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xDC, 0xCB, - 0xA9, 0x76, 0x54, 0x44, 0x45, 0x67, 0x9A, 0xBC, 0xDD, 0xCC, 0xBA, 0x97, - 0x65, 0x44, 0x44, 0x56, 0x78, 0xAB, 0xCD, 0xDC, 0xCB, 0xA9, 0x87, 0x65, - 0x44, 0x55, 0x67, 0x9A, 0xBC, 0xED, 0xCD, 0xBA, 0x98, 0x76, 0x65, 0x55, - 0x67, 0x89, 0xAB, 0xDE, 0xEC, 0xDC, 0xBA, 0x98, 0x77, 0x66, 0x67, 0x88, - 0xAB, 0xCD, 0xEE, 0xDD, 0xCB, 0xA9, 0x98, 0x87, 0x77, 0x88, 0x9A, 0xBC, - 0xEF, 0xED, 0xDD, 0xCB, 0xAA, 0x99, 0x98, 0x99, 0x9A, 0xBC, 0xDE, 0xFE, - 0xDD, 0xDC, 0xCB, 0xBA, 0xAA, 0xAA, 0xAB, 0xBC, 0xDE, 0xFF, 0xFD, 0xFE, - 0xDC, 0xCB, 0xBB, 0xBB, 0xBB, 0xCC, 0xDE, 0xFF, 0xFF, 0xDE, 0xDD, 0xDD, - 0xDC, 0xCC, 0xCC, 0xCD, 0xDE, 0xFF, 0xFF, 0xFD, 0xFE, 0xED, 0xDD, 0xED, - 0xDD, 0xEE, 0xFF, 0xFF, 0xFF, 0xFF, 0x8C, 0xDC, 0xDD, 0xCD, 0xDD, 0xDE, - 0xDE, 0xEF, 0xFF, 0xFF, 0xE0, 0x00, 0x00, 0x00, - ], - [ - 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, 0xDD, 0xDC, 0xDD, 0xCC, 0xCC, 0x7F, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFD, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, 0xFF, 0xFF, 0xFF, - 0xFD, 0xDD, 0xDD, 0xDD, 0xDF, 0xFF, 0xFF, 0xDF, 0xFF, 0xFF, 0xDD, 0xCB, - 0xBB, 0xBC, 0xCC, 0xDF, 0xFF, 0xFF, 0xFF, 0xFD, 0xDC, 0xBA, 0xAA, 0xAA, - 0xBB, 0xCC, 0xDF, 0xFF, 0xFF, 0xFF, 0xFB, 0xBA, 0x98, 0x88, 0x89, 0xAB, - 0xCC, 0xDF, 0xFF, 0xFF, 0xDC, 0xBA, 0x97, 0x77, 0x77, 0x89, 0xAB, 0xCD, - 0xFF, 0xFF, 0xFD, 0xCB, 0x98, 0x65, 0x55, 0x67, 0x89, 0xBC, 0xDF, 0xFF, - 0xFF, 0xDC, 0xA8, 0x75, 0x44, 0x45, 0x67, 0x8A, 0xBD, 0xFF, 0xFF, 0xFD, - 0xBA, 0x87, 0x54, 0x33, 0x45, 0x78, 0xAB, 0xDF, 0xFF, 0xFF, 0xDC, 0x98, - 0x75, 0x43, 0x34, 0x56, 0x8A, 0xCD, 0xFF, 0xFF, 0xFD, 0xCA, 0x97, 0x65, - 0x44, 0x45, 0x78, 0xAC, 0xDF, 0xFF, 0xEF, 0xDC, 0xA9, 0x87, 0x65, 0x55, - 0x68, 0x9A, 0xCE, 0xFF, 0xFF, 0xFE, 0xCB, 0xA9, 0x87, 0x77, 0x78, 0x9A, - 0xBC, 0xDF, 0xFF, 0xFF, 0xFD, 0xCB, 0xA9, 0x98, 0x88, 0x9A, 0xBC, 0xDF, - 0xFF, 0xFD, 0xFF, 0xDD, 0xBB, 0xAA, 0xAA, 0xAA, 0xBC, 0xDE, 0xFF, 0xFF, - 0xDF, 0xFD, 0xDD, 0xCB, 0xBB, 0xBB, 0xCD, 0xDF, 0xFF, 0xFF, 0xFD, 0xFF, - 0xDF, 0xDD, 0xDC, 0xDC, 0xDD, 0xDF, 0xFF, 0xFF, 0xFF, 0xDF, 0xFF, 0xFE, - 0xEF, 0xEF, 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, 0xFF, 0xFF, 0xFE, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x8C, 0xCD, 0xDD, 0xED, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00, 0x00, - ], - [ - 0xEF, 0xFF, 0xEF, 0xEE, 0xDD, 0xDD, 0xDD, 0xDD, 0xDC, 0xDD, 0x7F, 0xFF, - 0xFF, 0xFE, 0xED, 0xEE, 0xDE, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, - 0xDC, 0xCC, 0xCD, 0xDD, 0xEE, 0xEF, 0xFF, 0xEF, 0xFF, 0xFD, 0xDC, 0xCB, - 0xBB, 0xBC, 0xCD, 0xCF, 0xFF, 0xFE, 0xFF, 0xFD, 0xDB, 0xBA, 0xAA, 0xAA, - 0xAB, 0xCC, 0xDE, 0xFF, 0xFF, 0xFD, 0xDC, 0xAA, 0x99, 0x89, 0x99, 0xAB, - 0xBC, 0xDF, 0xFF, 0xFD, 0xDC, 0xBA, 0x98, 0x77, 0x78, 0x89, 0xAB, 0xCD, - 0xFF, 0xEF, 0xED, 0xCA, 0x98, 0x76, 0x56, 0x67, 0x89, 0xBC, 0xDE, 0xFE, - 0xDE, 0xCB, 0xA9, 0x76, 0x54, 0x45, 0x68, 0x9A, 0xBC, 0xEF, 0xEE, 0xED, - 0xBA, 0x87, 0x64, 0x23, 0x46, 0x78, 0xAB, 0xDD, 0xFE, 0xFE, 0xDB, 0xA9, - 0x76, 0x43, 0x24, 0x57, 0x8A, 0xBD, 0xDE, 0xED, 0xFD, 0xBA, 0x98, 0x65, - 0x44, 0x56, 0x79, 0xAB, 0xCD, 0xFF, 0xDD, 0xDC, 0xB9, 0x87, 0x66, 0x56, - 0x78, 0x9A, 0xBD, 0xEF, 0xFD, 0xFD, 0xCB, 0xA9, 0x88, 0x77, 0x78, 0x9A, - 0xBC, 0xDE, 0xFF, 0xDE, 0xDC, 0xBB, 0xA9, 0x98, 0x89, 0x9A, 0xAC, 0xDE, - 0xFF, 0xFE, 0xFE, 0xDD, 0xCB, 0xAA, 0xAA, 0xAA, 0xBB, 0xCD, 0xEF, 0xFF, - 0xDF, 0xED, 0xDC, 0xCC, 0xBB, 0xBB, 0xBC, 0xDD, 0xFF, 0xFF, 0xFD, 0xFF, - 0xEF, 0xDD, 0xDC, 0xCC, 0xDD, 0xDD, 0xEF, 0xFF, 0xFF, 0xDF, 0xFF, 0xEE, - 0xEE, 0xDD, 0xDE, 0xEE, 0xFF, 0xFF, 0xFF, 0xFD, 0xFF, 0xFF, 0xFF, 0xED, - 0xDD, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7C, 0xCC, 0xCC, 0xDD, 0xDC, 0xCE, - 0xEF, 0xFF, 0xFF, 0xFF, 0xE0, 0x00, 0x00, 0x00, - ], - [ - 0xBC, 0xCC, 0xBB, 0xBB, 0xAA, 0xAA, 0xAA, 0xBA, 0xBB, 0xBB, 0x8D, 0xED, - 0xDC, 0xCB, 0xBB, 0xBB, 0xBB, 0xBB, 0xCC, 0xCD, 0xEC, 0xCD, 0xCC, 0xBB, - 0xAA, 0xAA, 0xAA, 0xAA, 0xBB, 0xCC, 0xDD, 0xCC, 0xDC, 0xBA, 0xA9, 0x99, - 0x99, 0x99, 0xAA, 0xBB, 0xCC, 0xDC, 0xBC, 0xBA, 0xA9, 0x88, 0x88, 0x88, - 0x89, 0x9A, 0xAB, 0xCD, 0xBB, 0xBB, 0xA9, 0x88, 0x77, 0x77, 0x78, 0x89, - 0x9A, 0xBC, 0xCC, 0xBB, 0xA9, 0x88, 0x77, 0x66, 0x67, 0x78, 0x89, 0x9A, - 0xBC, 0xBB, 0xBA, 0x98, 0x77, 0x65, 0x55, 0x66, 0x78, 0x89, 0xAB, 0xCB, - 0xAB, 0xA9, 0x87, 0x65, 0x55, 0x55, 0x66, 0x78, 0x9A, 0xBC, 0xBA, 0xBA, - 0x98, 0x76, 0x55, 0x44, 0x55, 0x67, 0x89, 0xAB, 0xCB, 0xAB, 0xA9, 0x87, - 0x65, 0x54, 0x45, 0x56, 0x78, 0x9A, 0xBC, 0xBA, 0xBA, 0x98, 0x77, 0x65, - 0x55, 0x55, 0x67, 0x89, 0xAB, 0xCB, 0xAB, 0xA9, 0x88, 0x76, 0x65, 0x55, - 0x66, 0x78, 0x9A, 0xBC, 0xCB, 0xBA, 0xA9, 0x87, 0x77, 0x66, 0x66, 0x78, - 0x89, 0xAB, 0xCC, 0xBB, 0xBA, 0x99, 0x88, 0x77, 0x77, 0x78, 0x89, 0xAB, - 0xBC, 0xCB, 0xCB, 0xBA, 0x99, 0x88, 0x88, 0x88, 0x89, 0xAA, 0xBC, 0xDC, - 0xBC, 0xCB, 0xBA, 0xA9, 0x99, 0x99, 0x99, 0xAA, 0xBB, 0xDD, 0xDB, 0xCC, - 0xBB, 0xBA, 0xAA, 0xAA, 0xAA, 0xAA, 0xBC, 0xCD, 0xED, 0xCD, 0xCC, 0xCC, - 0xBB, 0xBB, 0xBB, 0xBB, 0xCC, 0xCD, 0xEF, 0xEC, 0xDD, 0xDD, 0xCC, 0xCC, - 0xCB, 0xCC, 0xCD, 0xDE, 0xEE, 0xFE, 0x8C, 0xCC, 0xCB, 0xBB, 0xBB, 0xBB, - 0xCC, 0xCC, 0xDE, 0xDE, 0xC0, 0x00, 0x00, 0x00, - ], - [ - 0xAC, 0xBA, 0xAA, 0x99, 0x99, 0x99, 0x99, 0xAA, 0xAA, 0xBB, 0x9B, 0xCC, - 0xBB, 0xAA, 0xAA, 0xA9, 0xAA, 0xAA, 0xBB, 0xCC, 0xCB, 0xBC, 0xBA, 0xA9, - 0x99, 0x99, 0x99, 0x99, 0xAA, 0xBB, 0xBC, 0xBB, 0xBA, 0xA9, 0x98, 0x88, - 0x88, 0x88, 0x99, 0xAA, 0xAB, 0xCB, 0xAB, 0xA9, 0x98, 0x88, 0x77, 0x78, - 0x88, 0x99, 0x9A, 0xBB, 0xAA, 0xA9, 0x98, 0x87, 0x77, 0x77, 0x77, 0x88, - 0x99, 0xAA, 0xBA, 0xAA, 0x98, 0x87, 0x76, 0x66, 0x66, 0x77, 0x88, 0x99, - 0xAB, 0xA9, 0xA9, 0x88, 0x76, 0x66, 0x66, 0x66, 0x77, 0x88, 0x9A, 0xBA, - 0x9A, 0x98, 0x77, 0x66, 0x55, 0x56, 0x66, 0x78, 0x89, 0xAA, 0xA9, 0xA9, - 0x87, 0x76, 0x65, 0x55, 0x56, 0x67, 0x78, 0x9A, 0xAA, 0x9A, 0x98, 0x77, - 0x66, 0x55, 0x55, 0x66, 0x77, 0x89, 0xAA, 0xA9, 0xA9, 0x88, 0x76, 0x66, - 0x55, 0x56, 0x67, 0x78, 0x9A, 0xAA, 0x9A, 0x98, 0x87, 0x76, 0x66, 0x66, - 0x66, 0x78, 0x89, 0xAA, 0xA9, 0xA9, 0x98, 0x87, 0x76, 0x66, 0x66, 0x77, - 0x88, 0x9A, 0xBA, 0xAA, 0xA9, 0x98, 0x87, 0x77, 0x77, 0x77, 0x88, 0x99, - 0xAB, 0xBA, 0xBA, 0x99, 0x98, 0x88, 0x77, 0x78, 0x88, 0x99, 0xAB, 0xBB, - 0xAB, 0xBA, 0xA9, 0x98, 0x88, 0x88, 0x88, 0x99, 0xAA, 0xBC, 0xBA, 0xBB, - 0xAA, 0xA9, 0x99, 0x99, 0x99, 0x99, 0xAA, 0xBC, 0xCC, 0xBC, 0xCB, 0xBA, - 0xAA, 0xAA, 0xAA, 0xAA, 0xAB, 0xBC, 0xCD, 0xCB, 0xCC, 0xCB, 0xBB, 0xBA, - 0xAA, 0xAB, 0xBB, 0xBC, 0xCD, 0xDC, 0x9B, 0xBB, 0xAA, 0xAA, 0xAA, 0xAA, - 0xAA, 0xBB, 0xBC, 0xCD, 0xB0, 0x00, 0x00, 0x00, - ], - [ - 0xBC, 0xCC, 0xBB, 0xBB, 0xAA, 0xAA, 0xAB, 0xAB, 0xBB, 0xBC, 0x8D, 0xED, - 0xCC, 0xCB, 0xBA, 0xBA, 0xBB, 0xBB, 0xCC, 0xCD, 0xDC, 0xCD, 0xCC, 0xBB, - 0xAA, 0xAA, 0xAA, 0xAA, 0xBB, 0xBC, 0xCD, 0xCC, 0xCB, 0xBA, 0xA9, 0x99, - 0x99, 0x99, 0xAA, 0xAB, 0xBC, 0xDC, 0xBC, 0xBA, 0x99, 0x88, 0x88, 0x88, - 0x89, 0x9A, 0xAB, 0xBC, 0xBB, 0xBA, 0xA9, 0x88, 0x77, 0x77, 0x78, 0x89, - 0x9A, 0xAB, 0xCB, 0xBB, 0xA9, 0x88, 0x76, 0x66, 0x66, 0x77, 0x89, 0x9A, - 0xBC, 0xBA, 0xBA, 0x98, 0x76, 0x65, 0x55, 0x66, 0x78, 0x89, 0xAB, 0xCB, - 0xAB, 0xA9, 0x87, 0x66, 0x55, 0x55, 0x67, 0x78, 0x9A, 0xBB, 0xBA, 0xBA, - 0x98, 0x76, 0x55, 0x44, 0x55, 0x67, 0x89, 0xAB, 0xBB, 0xAA, 0xA9, 0x87, - 0x65, 0x54, 0x45, 0x56, 0x78, 0x9A, 0xAB, 0xBA, 0xBA, 0x98, 0x77, 0x65, - 0x55, 0x56, 0x67, 0x89, 0xAB, 0xBB, 0xAB, 0xA9, 0x88, 0x76, 0x65, 0x55, - 0x67, 0x78, 0x9A, 0xBC, 0xBA, 0xBA, 0x99, 0x87, 0x77, 0x66, 0x66, 0x78, - 0x89, 0xAB, 0xCB, 0xBB, 0xAA, 0x99, 0x88, 0x77, 0x77, 0x78, 0x89, 0xAA, - 0xBC, 0xCB, 0xCB, 0xAA, 0x99, 0x88, 0x88, 0x88, 0x89, 0x9A, 0xBC, 0xDC, - 0xBC, 0xCB, 0xAA, 0x99, 0x99, 0x99, 0x99, 0xAA, 0xBC, 0xCD, 0xCB, 0xCC, - 0xBB, 0xAA, 0xAA, 0xA9, 0xAA, 0xAA, 0xBB, 0xCC, 0xDD, 0xBD, 0xCC, 0xCC, - 0xBB, 0xBA, 0xAB, 0xBB, 0xBC, 0xCD, 0xDE, 0xDC, 0xED, 0xCC, 0xCB, 0xBB, - 0xBB, 0xCC, 0xCC, 0xCD, 0xDE, 0xEE, 0x8C, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, - 0xBB, 0xCC, 0xCD, 0xDD, 0xC0, 0x00, 0x00, 0x00, - ], - [ - 0xEF, 0xFF, 0xEF, 0xED, 0xDC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0x7F, 0xFF, - 0xFF, 0xFF, 0xDD, 0xDC, 0xDE, 0xDE, 0xFF, 0xFF, 0xFD, 0xFF, 0xFF, 0xFE, - 0xDD, 0xCC, 0xBC, 0xCC, 0xDE, 0xEE, 0xFF, 0xEF, 0xFE, 0xED, 0xCB, 0xBB, - 0xAB, 0xBB, 0xBC, 0xDD, 0xEF, 0xFE, 0xEF, 0xED, 0xCB, 0xAA, 0x99, 0x9A, - 0xAB, 0xBC, 0xDE, 0xEF, 0xED, 0xED, 0xCB, 0xA9, 0x98, 0x88, 0x89, 0x9A, - 0xBC, 0xDE, 0xFD, 0xEE, 0xDB, 0xA9, 0x87, 0x77, 0x77, 0x89, 0xAB, 0xCD, - 0xEF, 0xED, 0xEC, 0xBA, 0x87, 0x66, 0x55, 0x67, 0x89, 0xAB, 0xCD, 0xEE, - 0xDE, 0xCB, 0x98, 0x76, 0x44, 0x45, 0x67, 0x8A, 0xBC, 0xDF, 0xED, 0xDC, - 0xB9, 0x86, 0x54, 0x33, 0x45, 0x78, 0x9B, 0xCD, 0xED, 0xDD, 0xCB, 0x98, - 0x75, 0x43, 0x34, 0x57, 0x89, 0xBC, 0xDE, 0xFD, 0xDD, 0xBA, 0x87, 0x65, - 0x44, 0x46, 0x78, 0x9B, 0xCD, 0xEF, 0xEE, 0xCB, 0xA9, 0x87, 0x65, 0x56, - 0x67, 0x8A, 0xBC, 0xDF, 0xFE, 0xDD, 0xCB, 0xA9, 0x87, 0x77, 0x77, 0x89, - 0xAC, 0xCE, 0xEF, 0xDE, 0xDC, 0xBA, 0xA9, 0x88, 0x88, 0x89, 0xAB, 0xCD, - 0xEF, 0xFD, 0xED, 0xDC, 0xBB, 0xA9, 0xA9, 0x9A, 0xBB, 0xCD, 0xEF, 0xFF, - 0xEF, 0xED, 0xCC, 0xCB, 0xBB, 0xBB, 0xBC, 0xCD, 0xDE, 0xFF, 0xED, 0xFF, - 0xED, 0xDC, 0xCC, 0xCC, 0xCC, 0xDE, 0xEF, 0xFF, 0xFF, 0xDF, 0xFF, 0xDD, - 0xDD, 0xDD, 0xDE, 0xDE, 0xEF, 0xFF, 0xFF, 0xFD, 0xFF, 0xFF, 0xFE, 0xEE, - 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x8D, 0xDE, 0xDC, 0xED, 0xDD, 0xDE, - 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00, 0x00, - ], - [ - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, 0xDC, 0xCC, 0x7F, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFD, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xCB, - 0xCE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xBB, 0xAA, 0xAB, 0xBC, - 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xBA, 0x98, 0x89, 0xAB, 0xCD, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFD, 0xBA, 0x87, 0x66, 0x78, 0xAB, 0xCD, 0xFF, 0xFF, - 0xFF, 0xFF, 0xDB, 0x97, 0x54, 0x45, 0x79, 0xAC, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFC, 0xA8, 0x64, 0x22, 0x46, 0x8A, 0xCF, 0xFF, 0xFF, 0xFF, 0xFF, 0xCA, - 0x96, 0x42, 0x24, 0x68, 0xAC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xA9, 0x75, - 0x43, 0x57, 0x9A, 0xCF, 0xFF, 0xFF, 0xFF, 0xFF, 0xCB, 0xA8, 0x76, 0x67, - 0x89, 0xBD, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, 0xCB, 0xA9, 0x88, 0x9A, 0xBC, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xCB, 0xAA, 0xAB, 0xBD, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, 0xCC, 0xBB, 0xCD, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0xDC, 0xDD, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00, 0x00, - ], - [ - 0xDF, 0xFF, 0xDF, 0xDD, 0xDD, 0xCC, 0xDB, 0xCC, 0xCC, 0xCC, 0x8F, 0xFF, - 0xFE, 0xFD, 0xDD, 0xCC, 0xCC, 0xDD, 0xDD, 0xDE, 0xFD, 0xFF, 0xFF, 0xDD, - 0xCC, 0xBB, 0xBB, 0xBC, 0xDD, 0xDD, 0xFF, 0xDF, 0xFD, 0xDD, 0xCB, 0xBA, - 0xAA, 0xAA, 0xAC, 0xCC, 0xFF, 0xFD, 0xFF, 0xDD, 0xCA, 0xA9, 0x99, 0x99, - 0x9A, 0xAB, 0xCD, 0xEF, 0xDF, 0xDD, 0xCB, 0xA9, 0x88, 0x88, 0x88, 0x99, - 0xAC, 0xCD, 0xFD, 0xDE, 0xCB, 0xA9, 0x87, 0x76, 0x77, 0x78, 0x9A, 0xBC, - 0xDF, 0xED, 0xEC, 0xA9, 0x87, 0x66, 0x55, 0x67, 0x78, 0x9B, 0xBE, 0xFF, - 0xDD, 0xCA, 0x98, 0x76, 0x54, 0x45, 0x67, 0x89, 0xAC, 0xDF, 0xFD, 0xCB, - 0xA9, 0x86, 0x54, 0x34, 0x45, 0x78, 0x9A, 0xBD, 0xEF, 0xDC, 0xBA, 0x98, - 0x65, 0x43, 0x34, 0x56, 0x89, 0xAC, 0xDE, 0xFC, 0xDB, 0xA9, 0x87, 0x65, - 0x44, 0x55, 0x78, 0x9A, 0xBD, 0xDF, 0xDD, 0xBB, 0xA8, 0x77, 0x65, 0x55, - 0x67, 0x8A, 0xAC, 0xDF, 0xFC, 0xDC, 0xBA, 0x98, 0x77, 0x76, 0x77, 0x89, - 0xAB, 0xCE, 0xEF, 0xCD, 0xCB, 0xAA, 0x98, 0x88, 0x88, 0x89, 0xAB, 0xCD, - 0xDF, 0xFD, 0xED, 0xCB, 0xBA, 0xA9, 0x99, 0x9A, 0xAA, 0xCD, 0xFF, 0xFF, - 0xDE, 0xDC, 0xCB, 0xBA, 0xAA, 0xAA, 0xBB, 0xCD, 0xDE, 0xFF, 0xFD, 0xFD, - 0xDD, 0xCC, 0xCB, 0xBB, 0xCC, 0xDD, 0xFE, 0xFF, 0xFF, 0xCE, 0xED, 0xED, - 0xDC, 0xCC, 0xDD, 0xDF, 0xFF, 0xFF, 0xFF, 0xFC, 0xFF, 0xFF, 0xEF, 0xEF, - 0xEF, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0x8D, 0xDD, 0xDE, 0xEF, 0xDF, 0xDF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00, 0x00, - ], - [ - 0xFF, 0xFF, 0xED, 0xDC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xDD, 0xAF, 0xFF, - 0xED, 0xDC, 0xCC, 0xBB, 0xBC, 0xCC, 0xCD, 0xDE, 0xED, 0xFF, 0xED, 0xCC, - 0xBB, 0xAA, 0xAA, 0xAB, 0xBC, 0xCD, 0xDE, 0xEF, 0xFD, 0xCB, 0xAA, 0x99, - 0x99, 0x99, 0xAA, 0xBC, 0xCD, 0xDD, 0xEE, 0xDB, 0xA9, 0x98, 0x88, 0x88, - 0x89, 0x9A, 0xBC, 0xCD, 0xDD, 0xDC, 0xA9, 0x98, 0x77, 0x77, 0x77, 0x89, - 0x9A, 0xBC, 0xDD, 0xDC, 0xBA, 0x98, 0x76, 0x66, 0x66, 0x77, 0x89, 0xAB, - 0xCD, 0xDC, 0xCB, 0x98, 0x76, 0x65, 0x55, 0x66, 0x77, 0x89, 0xAC, 0xCD, - 0xCC, 0xA9, 0x87, 0x65, 0x55, 0x55, 0x66, 0x78, 0x9A, 0xBD, 0xDC, 0xBA, - 0x98, 0x76, 0x55, 0x44, 0x55, 0x67, 0x89, 0xAB, 0xCD, 0xCB, 0xA9, 0x87, - 0x65, 0x54, 0x45, 0x56, 0x78, 0x9A, 0xBD, 0xDC, 0xBA, 0x98, 0x76, 0x65, - 0x55, 0x55, 0x67, 0x89, 0xAC, 0xDD, 0xCC, 0xA9, 0x87, 0x76, 0x55, 0x55, - 0x66, 0x78, 0x9B, 0xCD, 0xEC, 0xCB, 0xA9, 0x87, 0x76, 0x66, 0x66, 0x78, - 0x9A, 0xBC, 0xEE, 0xCC, 0xBA, 0x99, 0x87, 0x77, 0x77, 0x78, 0x99, 0xAC, - 0xDE, 0xFC, 0xCC, 0xBA, 0x99, 0x88, 0x88, 0x88, 0x9A, 0xAB, 0xCE, 0xFF, - 0xDD, 0xCC, 0xBA, 0xA9, 0x99, 0x99, 0x9A, 0xAB, 0xCD, 0xEF, 0xFD, 0xED, - 0xCC, 0xBB, 0xAA, 0xAA, 0xAB, 0xBB, 0xCD, 0xEF, 0xFF, 0xDE, 0xED, 0xDC, - 0xCB, 0xBB, 0xBC, 0xCC, 0xDD, 0xEF, 0xFF, 0xFD, 0xFE, 0xED, 0xDD, 0xDC, - 0xDD, 0xDD, 0xDE, 0xFF, 0xFF, 0xFF, 0xAD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, - 0xEE, 0xEF, 0xFF, 0xFF, 0xF0, 0x00, 0x00, 0x00, - ], - [ - 0xFF, 0xFF, 0xFF, 0xFF, 0xEF, 0xDD, 0xDD, 0xDD, 0xDC, 0xCC, 0x8F, 0xFF, - 0xFF, 0xFF, 0xDD, 0xDE, 0xED, 0xDD, 0xDD, 0xFF, 0xFD, 0xFF, 0xFF, 0xFD, - 0xCC, 0xCC, 0xCC, 0xCB, 0xCD, 0xDE, 0xEF, 0xDF, 0xFF, 0xEC, 0xDB, 0xBB, - 0xAA, 0xAB, 0xBB, 0xCC, 0xDF, 0xFD, 0xFF, 0xFD, 0xCB, 0xA9, 0x99, 0x99, - 0xAA, 0xBC, 0xDD, 0xEF, 0xDF, 0xED, 0xCB, 0xA9, 0x88, 0x88, 0x88, 0x9A, - 0xBC, 0xCC, 0xFD, 0xFE, 0xDB, 0xA9, 0x87, 0x76, 0x77, 0x78, 0x9A, 0xBC, - 0xDE, 0xDF, 0xFC, 0xBA, 0x87, 0x66, 0x55, 0x67, 0x78, 0x9B, 0xBD, 0xFE, - 0xEF, 0xCA, 0x98, 0x76, 0x54, 0x45, 0x67, 0x89, 0xAB, 0xCE, 0xED, 0xDC, - 0xA9, 0x86, 0x54, 0x33, 0x45, 0x68, 0x9A, 0xBC, 0xED, 0xED, 0xBA, 0x98, - 0x75, 0x43, 0x34, 0x57, 0x89, 0xAC, 0xDD, 0xED, 0xDC, 0xA9, 0x87, 0x65, - 0x44, 0x56, 0x78, 0x9A, 0xBD, 0xFF, 0xFF, 0xCB, 0xA9, 0x87, 0x65, 0x56, - 0x67, 0x89, 0xBC, 0xDF, 0xED, 0xDC, 0xBA, 0x98, 0x87, 0x76, 0x77, 0x89, - 0xAB, 0xCE, 0xFF, 0xCE, 0xCB, 0xBA, 0x99, 0x88, 0x88, 0x89, 0xAB, 0xDD, - 0xFF, 0xFF, 0xFD, 0xCB, 0xBA, 0xA9, 0x99, 0x9A, 0xAB, 0xCD, 0xDF, 0xFF, - 0xDF, 0xEE, 0xCC, 0xBA, 0xAA, 0xAB, 0xBB, 0xCC, 0xDF, 0xFF, 0xFE, 0xFD, - 0xDD, 0xCC, 0xBB, 0xCC, 0xCC, 0xCD, 0xFF, 0xFF, 0xFF, 0xDD, 0xDE, 0xDD, - 0xDC, 0xCD, 0xCC, 0xDD, 0xEF, 0xFF, 0xFF, 0xFC, 0xFF, 0xED, 0xDD, 0xDD, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x8C, 0xCD, 0xCD, 0xDD, 0xEE, 0xDE, - 0xFE, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00, 0x00, - ], - [ - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, 0xDF, 0x8F, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xCF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xCB, 0xBB, 0xBC, 0xCD, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xCA, 0x99, 0x99, 0xAB, 0xCF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xCA, 0x97, 0x77, 0x89, 0xBC, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xDC, 0x97, 0x54, 0x46, 0x8A, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFD, 0xB9, 0x74, 0x12, 0x57, 0x9B, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xCB, - 0x97, 0x42, 0x24, 0x79, 0xBD, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, 0xB9, 0x86, - 0x44, 0x57, 0x9B, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xA9, 0x87, 0x77, - 0x8A, 0xCF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xDC, 0xAA, 0x99, 0x9A, 0xCF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xCC, 0xBB, 0xBB, 0xCF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xCC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x8F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00, 0x00, - ], - [ - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xDF, 0xFD, 0xDC, 0xDD, 0xCD, 0x7F, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, - 0xCC, 0xCF, 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xCC, 0xBB, 0xBC, - 0xCF, 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, 0xCC, 0xBA, 0xA9, 0xAA, 0xBC, - 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0xCC, 0xA9, 0x88, 0x88, 0x9A, 0xBD, 0xDF, - 0xFF, 0xFF, 0xFF, 0xFB, 0xB9, 0x87, 0x66, 0x78, 0x9A, 0xCD, 0xFF, 0xFF, - 0xFF, 0xFD, 0xCA, 0x87, 0x54, 0x45, 0x78, 0xAB, 0xDF, 0xFF, 0xFF, 0xFF, - 0xDB, 0xA8, 0x64, 0x22, 0x46, 0x8A, 0xBD, 0xFF, 0xFF, 0xFF, 0xFC, 0xBA, - 0x86, 0x42, 0x24, 0x68, 0xAB, 0xCD, 0xFF, 0xFF, 0xFF, 0xDB, 0xA8, 0x75, - 0x44, 0x56, 0x8A, 0xBD, 0xFF, 0xFF, 0xFF, 0xFF, 0xCA, 0x98, 0x76, 0x66, - 0x79, 0xAC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xBA, 0x98, 0x88, 0x89, 0xAB, - 0xCF, 0xFF, 0xFF, 0xFF, 0xFD, 0xFC, 0xBA, 0xAA, 0x9A, 0xAC, 0xCC, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xDC, 0xCB, 0xBB, 0xCC, 0xDF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xDD, 0xDF, 0xDC, 0xCC, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xCF, 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFD, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7D, 0xDC, 0xDC, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00, 0x00, - ], - [ - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xCB, 0xCC, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFB, 0xA9, 0x9A, 0xBC, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xCB, 0x98, 0x77, 0x89, 0xBF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFC, 0xA8, 0x54, 0x46, 0x8A, 0xCF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xCA, 0x74, 0x12, 0x47, 0xAB, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, - 0xA7, 0x42, 0x24, 0x7A, 0xCF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xCA, 0x86, - 0x44, 0x58, 0xAC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xBA, 0x87, 0x78, - 0x9B, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xBA, 0x99, 0xAB, 0xCF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xCC, 0xCC, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00, 0x00, - ], - [ - 0xCC, 0xCB, 0xBA, 0xAA, 0xA9, 0x99, 0x9A, 0xAA, 0xAB, 0xBC, 0x9C, 0xCC, - 0xBB, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xBB, 0xBC, 0xDC, 0xCC, 0xBB, 0xAA, - 0x99, 0x99, 0x99, 0x99, 0xAA, 0xBB, 0xCC, 0xBB, 0xBB, 0xA9, 0x98, 0x88, - 0x88, 0x88, 0x99, 0x9A, 0xBB, 0xCB, 0xBB, 0xA9, 0x98, 0x88, 0x77, 0x77, - 0x88, 0x89, 0xAA, 0xBB, 0xBA, 0xBA, 0x98, 0x87, 0x77, 0x77, 0x77, 0x78, - 0x89, 0xAB, 0xBB, 0xAA, 0x99, 0x87, 0x76, 0x66, 0x66, 0x77, 0x88, 0x99, - 0xAB, 0xBA, 0xA9, 0x88, 0x76, 0x66, 0x66, 0x66, 0x77, 0x88, 0x9A, 0xAA, - 0x9A, 0x98, 0x77, 0x66, 0x55, 0x56, 0x66, 0x77, 0x89, 0xAB, 0xA9, 0xA9, - 0x87, 0x76, 0x65, 0x55, 0x56, 0x67, 0x78, 0x9A, 0xAA, 0x9A, 0x98, 0x77, - 0x66, 0x55, 0x55, 0x66, 0x77, 0x89, 0xAB, 0xA9, 0xA9, 0x87, 0x76, 0x66, - 0x55, 0x56, 0x67, 0x78, 0x9A, 0xAA, 0x9A, 0x98, 0x87, 0x76, 0x66, 0x66, - 0x66, 0x78, 0x89, 0xAB, 0xBA, 0xA9, 0x98, 0x77, 0x76, 0x66, 0x66, 0x77, - 0x88, 0x9A, 0xBB, 0xAA, 0xA9, 0x88, 0x87, 0x77, 0x77, 0x77, 0x88, 0x9A, - 0xBB, 0xBA, 0xBA, 0x99, 0x88, 0x87, 0x77, 0x78, 0x88, 0x99, 0xAB, 0xCC, - 0xBB, 0xBA, 0x99, 0x98, 0x88, 0x88, 0x88, 0x99, 0xAB, 0xBC, 0xCB, 0xCB, - 0xBA, 0xA9, 0x99, 0x99, 0x99, 0x9A, 0xAA, 0xBC, 0xCC, 0xBC, 0xCB, 0xBA, - 0xAA, 0xAA, 0xAA, 0xAA, 0xAB, 0xBC, 0xCD, 0xDC, 0xDC, 0xCB, 0xBB, 0xBB, - 0xBA, 0xBB, 0xBB, 0xCC, 0xDD, 0xEE, 0x9C, 0xCB, 0xBB, 0xBA, 0xAA, 0xAA, - 0xBB, 0xBB, 0xCC, 0xDD, 0xD0, 0x00, 0x00, 0x00, - ], - [ - 0xDF, 0xFF, 0xFF, 0xED, 0xEE, 0xED, 0xDD, 0xDC, 0xCD, 0xDC, 0x7F, 0xFF, - 0xFF, 0xFE, 0xED, 0xDD, 0xDD, 0xFD, 0xFF, 0xEE, 0xFD, 0xFF, 0xFF, 0xDE, - 0xDD, 0xCC, 0xCC, 0xDD, 0xDD, 0xFF, 0xFF, 0xEF, 0xFF, 0xDD, 0xDC, 0xCC, - 0xBB, 0xCC, 0xBD, 0xDD, 0xEF, 0xFE, 0xFF, 0xFD, 0xDC, 0xBB, 0xAA, 0xAA, - 0xBB, 0xCD, 0xDE, 0xEF, 0xDF, 0xFE, 0xDC, 0xBA, 0x99, 0x99, 0x99, 0xAB, - 0xCC, 0xDE, 0xFD, 0xFD, 0xEC, 0xCA, 0x98, 0x87, 0x78, 0x89, 0xAB, 0xCD, - 0xFF, 0xDE, 0xFD, 0xCA, 0x98, 0x76, 0x66, 0x78, 0x9A, 0xBC, 0xDD, 0xFE, - 0xDD, 0xCB, 0xA9, 0x86, 0x54, 0x45, 0x78, 0x9A, 0xCE, 0xDF, 0xEE, 0xDC, - 0xBA, 0x97, 0x64, 0x23, 0x46, 0x79, 0xAB, 0xDD, 0xFD, 0xEE, 0xDB, 0xA9, - 0x76, 0x42, 0x24, 0x67, 0x9A, 0xBC, 0xDE, 0xEF, 0xEE, 0xCA, 0x98, 0x75, - 0x44, 0x56, 0x89, 0xAB, 0xDE, 0xFE, 0xEE, 0xDC, 0xBA, 0x88, 0x76, 0x66, - 0x78, 0x9B, 0xCD, 0xEF, 0xDD, 0xFD, 0xCB, 0xA9, 0x98, 0x77, 0x88, 0x9A, - 0xBC, 0xDF, 0xFF, 0xDF, 0xDD, 0xCB, 0xA9, 0x99, 0x99, 0x9A, 0xBC, 0xDE, - 0xFF, 0xFD, 0xEE, 0xDD, 0xCB, 0xAA, 0xAA, 0xAB, 0xCC, 0xDE, 0xFF, 0xFF, - 0xDF, 0xFD, 0xDC, 0xCC, 0xBC, 0xCB, 0xCC, 0xCE, 0xFF, 0xFF, 0xFD, 0xEF, - 0xFE, 0xDD, 0xDC, 0xCD, 0xCD, 0xDD, 0xFF, 0xFF, 0xFF, 0xCF, 0xEE, 0xDD, - 0xEE, 0xDE, 0xDE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xFF, 0xFF, 0xDF, 0xFF, - 0xFE, 0xEF, 0xEF, 0xFF, 0xFF, 0xFF, 0x7C, 0xCD, 0xCC, 0xDD, 0xEE, 0xEF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00, 0x00, - ], - [ - 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xCF, 0xDF, 0xDC, 0xCB, 0xCD, 0x7F, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFD, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFD, 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, - 0xCC, 0xDD, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xDC, 0xCC, 0xBC, - 0xCD, 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xDC, 0xBB, 0xAA, 0xBB, 0xBC, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xA9, 0x98, 0x89, 0xAB, 0xCD, 0xDF, - 0xFF, 0xFF, 0xFF, 0xFD, 0xBA, 0x87, 0x66, 0x78, 0xAB, 0xCF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xCB, 0x97, 0x54, 0x45, 0x79, 0xBC, 0xDF, 0xFF, 0xFF, 0xFF, - 0xFC, 0xB9, 0x64, 0x22, 0x46, 0x9A, 0xCF, 0xFF, 0xFF, 0xFF, 0xFD, 0xBA, - 0x86, 0x42, 0x23, 0x68, 0xAC, 0xDF, 0xFF, 0xFF, 0xFF, 0xDC, 0xA9, 0x75, - 0x44, 0x57, 0x9B, 0xCF, 0xDF, 0xFF, 0xFF, 0xFD, 0xCB, 0xA8, 0x76, 0x67, - 0x8A, 0xBC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xBB, 0xA9, 0x88, 0x9A, 0xBC, - 0xCF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xCB, 0xBB, 0xAB, 0xBC, 0xCF, 0xFF, - 0xFF, 0xFD, 0xFF, 0xFD, 0xDF, 0xCC, 0xCC, 0xCD, 0xDD, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFD, 0xFF, 0xCD, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFD, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7D, 0xDD, 0xDF, 0xFD, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00, 0x00, - ], - [ - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xDF, 0xFF, 0xFD, 0x7F, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xCD, 0xDD, - 0xCC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, 0xDC, 0xBB, 0xBB, 0xCF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xCB, 0xA9, 0xAA, 0xBC, 0xDD, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xCB, 0x97, 0x77, 0x89, 0xAC, 0xDF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFC, 0xA8, 0x64, 0x46, 0x8A, 0xBD, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xB9, 0x74, 0x12, 0x47, 0x9B, 0xCF, 0xFF, 0xFF, 0xFF, 0xFF, 0xCB, - 0x97, 0x42, 0x24, 0x79, 0xBD, 0xFF, 0xFF, 0xFF, 0xFF, 0xDD, 0xBA, 0x86, - 0x44, 0x58, 0x9C, 0xCF, 0xFF, 0xFF, 0xFF, 0xFF, 0xDB, 0xA9, 0x87, 0x78, - 0x9A, 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xBC, 0xBA, 0x99, 0xAB, 0xBD, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xDF, 0xCC, 0xBB, 0xBC, 0xCE, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xEF, 0xDC, 0xCC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x8D, 0xFF, 0xFF, 0xFF, 0xDF, 0xDF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00, 0x00, - ], - [ - 0xCF, 0xED, 0xCC, 0xED, 0xBB, 0xCB, 0xBB, 0xCC, 0xBC, 0xCC, 0x6D, 0xFF, - 0xED, 0xDC, 0xCC, 0xBD, 0xCC, 0xDC, 0xEE, 0xFF, 0xFC, 0xED, 0xDF, 0xCD, - 0xCC, 0xCB, 0xCC, 0xCD, 0xCD, 0xDE, 0xFF, 0xCF, 0xED, 0xEC, 0xCB, 0xBA, - 0xBB, 0xBB, 0xCC, 0xCC, 0xDD, 0xFC, 0xDD, 0xDC, 0xBA, 0xBA, 0xA9, 0x9A, - 0xAA, 0xBB, 0xCD, 0xEF, 0xDC, 0xDC, 0xCB, 0xA9, 0x98, 0x88, 0x99, 0x9B, - 0xBC, 0xCD, 0xFD, 0xBC, 0xCB, 0xAA, 0x98, 0x77, 0x77, 0x89, 0xAA, 0xBD, - 0xCD, 0xDC, 0xCC, 0xBA, 0x98, 0x76, 0x56, 0x67, 0x89, 0xAB, 0xCC, 0xDC, - 0xBC, 0xBB, 0xA8, 0x76, 0x44, 0x45, 0x67, 0x9A, 0xBC, 0xCE, 0xDC, 0xDB, - 0xB9, 0x87, 0x64, 0x23, 0x46, 0x78, 0xAB, 0xBC, 0xEC, 0xCC, 0xBA, 0x98, - 0x76, 0x43, 0x34, 0x57, 0x89, 0xBB, 0xCD, 0xDB, 0xCB, 0xBA, 0x97, 0x65, - 0x44, 0x56, 0x78, 0x9B, 0xBD, 0xDD, 0xCD, 0xCB, 0xA9, 0x87, 0x66, 0x56, - 0x78, 0x9A, 0xBB, 0xDF, 0xEB, 0xDC, 0xBA, 0xA9, 0x87, 0x77, 0x78, 0x8A, - 0xBB, 0xCD, 0xFD, 0xCC, 0xDB, 0xBB, 0x99, 0x98, 0x88, 0x9A, 0xAA, 0xBC, - 0xDF, 0xDC, 0xDD, 0xBC, 0xBB, 0xAA, 0x99, 0xAA, 0xAB, 0xBC, 0xCE, 0xFE, - 0xDF, 0xFD, 0xCC, 0xBB, 0xAA, 0xBB, 0xBB, 0xCC, 0xDC, 0xFF, 0xEC, 0xFF, - 0xDC, 0xDC, 0xCC, 0xBB, 0xBC, 0xCD, 0xED, 0xED, 0xFE, 0xDE, 0xEE, 0xED, - 0xCD, 0xCC, 0xCC, 0xDD, 0xDD, 0xEF, 0xEF, 0xEC, 0xEF, 0xFE, 0xED, 0xED, - 0xDE, 0xED, 0xEE, 0xFE, 0xFF, 0xFF, 0x6C, 0xCC, 0xDD, 0xDD, 0xDD, 0xBC, - 0xCC, 0xED, 0xDD, 0xEF, 0xC0, 0x00, 0x00, 0x00, - ], - [ - 0xFF, 0xFF, 0xFF, 0xFF, 0xED, 0xDD, 0xDD, 0xDE, 0xEF, 0xFF, 0xCF, 0xFF, - 0xFF, 0xDD, 0xDC, 0xCC, 0xCD, 0xDE, 0xDD, 0xFF, 0xFF, 0xFF, 0xFF, 0xEC, - 0xCB, 0xBA, 0xAA, 0xBB, 0xCC, 0xDF, 0xFF, 0xFF, 0xFF, 0xDC, 0xBA, 0xA9, - 0x99, 0x9A, 0xAA, 0xBC, 0xEF, 0xFF, 0xFD, 0xDC, 0xBA, 0x98, 0x88, 0x88, - 0x99, 0xAA, 0xBC, 0xDF, 0xFF, 0xDD, 0xBA, 0x98, 0x77, 0x77, 0x77, 0x89, - 0xAB, 0xBC, 0xFF, 0xFD, 0xCA, 0x98, 0x76, 0x66, 0x66, 0x77, 0x89, 0xAB, - 0xCD, 0xED, 0xDB, 0xA8, 0x76, 0x65, 0x55, 0x56, 0x78, 0x89, 0xBC, 0xDF, - 0xDC, 0xB9, 0x87, 0x65, 0x55, 0x55, 0x56, 0x78, 0x9B, 0xCD, 0xED, 0xCA, - 0x98, 0x76, 0x55, 0x44, 0x55, 0x67, 0x89, 0xAC, 0xEF, 0xDC, 0xA9, 0x87, - 0x65, 0x54, 0x45, 0x56, 0x78, 0x9A, 0xCD, 0xFD, 0xDA, 0x98, 0x76, 0x55, - 0x55, 0x55, 0x67, 0x89, 0xAC, 0xDF, 0xDC, 0xB9, 0x87, 0x76, 0x55, 0x55, - 0x66, 0x78, 0xAB, 0xDF, 0xFD, 0xCB, 0xA9, 0x87, 0x76, 0x66, 0x66, 0x78, - 0x9A, 0xBE, 0xEF, 0xDE, 0xCB, 0xA9, 0x87, 0x77, 0x77, 0x78, 0x9A, 0xBC, - 0xDF, 0xFE, 0xDC, 0xBA, 0xA9, 0x98, 0x88, 0x88, 0x9A, 0xBC, 0xFE, 0xFF, - 0xFE, 0xDC, 0xBA, 0xA9, 0x99, 0x99, 0xAA, 0xBC, 0xDF, 0xFF, 0xFF, 0xFD, - 0xDC, 0xBB, 0xBB, 0xAA, 0xBB, 0xBC, 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0xDE, - 0xDC, 0xCC, 0xCD, 0xCE, 0xEF, 0xFF, 0xFF, 0xFE, 0xFF, 0xFF, 0xDF, 0xDD, - 0xED, 0xDE, 0xFF, 0xFF, 0xFF, 0xFF, 0xBE, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00, 0x00, - ], - [ - 0xEF, 0xFE, 0xFF, 0xFD, 0xEC, 0xDD, 0xCC, 0xCC, 0xCC, 0xDD, 0x6F, 0xFF, - 0xFF, 0xFF, 0xFD, 0xDD, 0xFF, 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, - 0xED, 0xCC, 0xCD, 0xFF, 0xED, 0xFF, 0xDF, 0xFF, 0xFF, 0xFF, 0xDD, 0xCC, - 0xCC, 0xCC, 0xDD, 0xEF, 0xFF, 0xFE, 0xFF, 0xFE, 0xFD, 0xCC, 0xCB, 0xBB, - 0xBD, 0xFD, 0xEF, 0xFF, 0xDF, 0xEE, 0xFD, 0xCB, 0xBA, 0xA9, 0xAB, 0xBC, - 0xDD, 0xDF, 0xFF, 0xFF, 0xDC, 0xCB, 0xA9, 0x88, 0x88, 0x9A, 0xBC, 0xDF, - 0xFF, 0xFF, 0xFE, 0xDC, 0xA9, 0x87, 0x66, 0x78, 0x9B, 0xCC, 0xDD, 0xFE, - 0xED, 0xDC, 0xBA, 0x97, 0x54, 0x45, 0x79, 0xAB, 0xDD, 0xFF, 0xFD, 0xDD, - 0xCB, 0xA8, 0x64, 0x22, 0x46, 0x8A, 0xBC, 0xDF, 0xFE, 0xDD, 0xDC, 0xBA, - 0x86, 0x42, 0x24, 0x68, 0xAB, 0xCD, 0xFF, 0xED, 0xDD, 0xCB, 0xA9, 0x75, - 0x44, 0x57, 0x8A, 0xBD, 0xDF, 0xFF, 0xDF, 0xDD, 0xCB, 0x98, 0x76, 0x67, - 0x89, 0xBC, 0xCD, 0xFF, 0xFF, 0xFF, 0xDC, 0xBA, 0x98, 0x88, 0x89, 0xAB, - 0xCD, 0xDE, 0xFE, 0xDF, 0xFD, 0xED, 0xBB, 0xA9, 0xAA, 0xBC, 0xCD, 0xDF, - 0xFF, 0xEF, 0xFF, 0xFF, 0xDC, 0xCA, 0xBB, 0xBC, 0xCD, 0xDF, 0xFF, 0xFF, - 0xDF, 0xFF, 0xDC, 0xDD, 0xCC, 0xCC, 0xDD, 0xEF, 0xFF, 0xFF, 0xFD, 0xFF, - 0xFF, 0xEF, 0xDD, 0xDC, 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0xCF, 0xFF, 0xFF, - 0xDF, 0xDD, 0xFD, 0xFD, 0xFF, 0xFF, 0xFF, 0xFD, 0xED, 0xFF, 0xFE, 0xDF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x6C, 0xDD, 0xDC, 0xCC, 0xFD, 0xFD, - 0xDD, 0xDF, 0xFF, 0xFF, 0xE0, 0x00, 0x00, 0x00, - ], - [ - 0xFF, 0xFF, 0xFF, 0xDF, 0xFD, 0xCD, 0xDC, 0xFD, 0xDD, 0xDD, 0x8F, 0xFF, - 0xFF, 0xFF, 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xCD, 0xFF, 0xDD, 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, 0xCC, - 0xCC, 0xCD, 0xDE, 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xCB, 0xBB, 0xCB, - 0xCC, 0xCF, 0xFD, 0xFF, 0xFF, 0xFD, 0xFD, 0xCB, 0xAA, 0xA9, 0xAA, 0xBC, - 0xCD, 0xFF, 0xFF, 0xFF, 0xDF, 0xBB, 0xA9, 0x88, 0x88, 0x9A, 0xBC, 0xDF, - 0xFF, 0xFF, 0xFF, 0xDC, 0xA9, 0x87, 0x66, 0x78, 0x9A, 0xCC, 0xFF, 0xFD, - 0xFF, 0xDC, 0xBA, 0x87, 0x54, 0x45, 0x79, 0xAB, 0xDC, 0xDF, 0xFF, 0xFD, - 0xCA, 0x98, 0x64, 0x22, 0x46, 0x8A, 0xBD, 0xFF, 0xFF, 0xDF, 0xDC, 0xB9, - 0x86, 0x42, 0x24, 0x68, 0x9C, 0xCF, 0xDF, 0xFF, 0xFF, 0xCB, 0xA9, 0x75, - 0x44, 0x56, 0x8A, 0xBD, 0xFF, 0xFF, 0xFF, 0xDD, 0xBB, 0x98, 0x76, 0x66, - 0x79, 0xAB, 0xDF, 0xFF, 0xFF, 0xFF, 0xCC, 0xBA, 0x99, 0x88, 0x89, 0xAB, - 0xDD, 0xFF, 0xFF, 0xEF, 0xFF, 0xCC, 0xBA, 0xAA, 0xAA, 0xAB, 0xCD, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xDC, 0xBB, 0xBB, 0xBC, 0xCD, 0xFF, 0xFF, 0xFF, - 0xDF, 0xFF, 0xDD, 0xDC, 0xDD, 0xCD, 0xDD, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFD, 0xFF, 0xDD, 0xDF, 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, 0xFF, 0xFF, - 0xFD, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7D, 0xDD, 0xDF, 0xFD, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00, 0x00, - ], - [ - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x6F, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xBB, 0xBC, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xCB, 0xA9, 0x9A, 0xBF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFA, 0x98, 0x77, 0x89, 0xAF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFB, 0xA8, 0x64, 0x46, 0x8A, 0xCF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xB9, 0x74, 0x12, 0x47, 0x9A, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFB, - 0x97, 0x42, 0x24, 0x79, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xEA, 0x86, - 0x44, 0x57, 0x9B, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xB9, 0x87, 0x78, - 0x9B, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xAA, 0x99, 0xAA, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, 0xFB, 0xBB, 0xEF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xCF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x9F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00, 0x00, - ], - [ - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, 0xCD, 0xCC, 0xCF, 0xBB, 0x6F, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFD, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xFE, - 0xFC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xBC, 0xBC, - 0xCC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xBA, 0x99, 0xAA, 0xBC, - 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xB9, 0x98, 0x88, 0xAA, 0xBF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xCD, 0xB9, 0x87, 0x66, 0x78, 0x9A, 0xCF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xCA, 0x87, 0x54, 0x45, 0x79, 0xAB, 0xDF, 0xFF, 0xFF, 0xFD, - 0xFB, 0xA8, 0x64, 0x22, 0x46, 0x8A, 0xBD, 0xFF, 0xFF, 0xFF, 0xFF, 0xB9, - 0x86, 0x42, 0x24, 0x68, 0xAB, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xA8, 0x75, - 0x44, 0x56, 0x9B, 0xCD, 0xFF, 0xFF, 0xFF, 0xFF, 0xCA, 0x98, 0x76, 0x66, - 0x89, 0xCC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xBA, 0x98, 0x88, 0x89, 0xBB, - 0xFF, 0xFF, 0xFF, 0xFF, 0xDF, 0xFB, 0xCB, 0xAA, 0xAA, 0xBC, 0xDF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xDC, 0xCC, 0xAB, 0xBC, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFC, 0xCD, 0xFC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xDF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x6C, 0xBC, 0xCF, 0xFF, 0xCD, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00, 0x00, - ], - [ - 0xDC, 0xDB, 0xBA, 0xAA, 0xA9, 0xAA, 0xA9, 0xAB, 0xBB, 0xCC, 0xAF, 0xFD, - 0xBB, 0xBA, 0xA9, 0xAA, 0x9A, 0xAB, 0xBB, 0xCD, 0xDC, 0xCB, 0xBB, 0xAA, - 0x99, 0x99, 0x89, 0x9A, 0xAA, 0xBB, 0xCC, 0xCC, 0xBB, 0xAA, 0x99, 0x88, - 0x88, 0x88, 0x99, 0xAA, 0xAB, 0xCB, 0xBB, 0xB9, 0x88, 0x87, 0x77, 0x77, - 0x88, 0x89, 0xAA, 0xBB, 0xCA, 0xAA, 0x98, 0x87, 0x77, 0x77, 0x77, 0x78, - 0x89, 0xAB, 0xCA, 0xAA, 0x98, 0x87, 0x66, 0x66, 0x66, 0x67, 0x78, 0x9A, - 0xAB, 0xBB, 0xAA, 0x88, 0x77, 0x66, 0x66, 0x66, 0x67, 0x78, 0x9A, 0xBB, - 0xAA, 0x98, 0x77, 0x66, 0x55, 0x56, 0x66, 0x77, 0x89, 0x9B, 0xAA, 0xA9, - 0x87, 0x76, 0x65, 0x55, 0x56, 0x66, 0x78, 0x99, 0xAB, 0xAA, 0x98, 0x77, - 0x66, 0x55, 0x55, 0x66, 0x77, 0x89, 0x9C, 0xA9, 0xA9, 0x87, 0x76, 0x66, - 0x55, 0x66, 0x67, 0x78, 0x9A, 0xBB, 0x9A, 0x98, 0x87, 0x76, 0x66, 0x66, - 0x66, 0x78, 0x89, 0x9A, 0xBA, 0xA9, 0x98, 0x87, 0x76, 0x66, 0x67, 0x77, - 0x88, 0x9B, 0xBC, 0xAA, 0x99, 0x98, 0x77, 0x77, 0x77, 0x77, 0x89, 0x9A, - 0xBC, 0xCA, 0xAA, 0x99, 0x88, 0x87, 0x77, 0x77, 0x89, 0x99, 0xAB, 0xDD, - 0xCB, 0xCB, 0xA9, 0x89, 0x88, 0x88, 0x88, 0x99, 0xAA, 0xBC, 0xCB, 0xDC, - 0xBA, 0xA9, 0x99, 0x98, 0x99, 0x9A, 0xBA, 0xBC, 0xDC, 0xEC, 0xCC, 0xAB, - 0xBA, 0x9A, 0x9A, 0xAA, 0xAB, 0xBC, 0xEF, 0xEC, 0xEC, 0xCB, 0xBB, 0xBB, - 0xBA, 0xBB, 0xBB, 0xCC, 0xDC, 0xEE, 0xAC, 0xBC, 0xCB, 0xBA, 0xCA, 0xBA, - 0xBC, 0xBB, 0xDD, 0xDD, 0xF0, 0x00, 0x00, 0x00, - ], - [ - 0xBF, 0xDF, 0xCC, 0xED, 0xBA, 0xBC, 0xCB, 0xBB, 0xBB, 0xCF, 0x6F, 0xFF, - 0xDC, 0xFF, 0xEF, 0xED, 0xFD, 0xFF, 0xFF, 0xFF, 0xFD, 0xDF, 0xFF, 0xFD, - 0xFF, 0xDC, 0xDF, 0xFD, 0xFD, 0xFD, 0xFF, 0xEF, 0xFF, 0xFF, 0xFF, 0xDC, - 0xBB, 0xCB, 0xFC, 0xFF, 0xFF, 0xFC, 0xCF, 0xFC, 0xFF, 0xCB, 0xBB, 0xAB, - 0xCC, 0xBF, 0xFD, 0xFF, 0xFF, 0xFF, 0xCB, 0xBB, 0xA9, 0xA9, 0xAC, 0xBE, - 0xEE, 0xFE, 0xED, 0xCF, 0xFF, 0xDA, 0xA9, 0x88, 0x88, 0xAA, 0xCD, 0xCD, - 0xFF, 0xDC, 0xFF, 0xFB, 0xA9, 0x86, 0x66, 0x78, 0xAB, 0xCC, 0xFD, 0xFC, - 0xCF, 0xDD, 0xDA, 0x86, 0x54, 0x46, 0x79, 0xAD, 0xCF, 0xFF, 0xCC, 0xFF, - 0xCB, 0xA9, 0x64, 0x22, 0x47, 0x8A, 0xCB, 0xFF, 0xFF, 0xCF, 0xFD, 0xB9, - 0x86, 0x42, 0x24, 0x68, 0x9B, 0xCE, 0xFD, 0xCC, 0xFD, 0xBB, 0xA9, 0x76, - 0x44, 0x57, 0x8A, 0xBC, 0xEE, 0xDE, 0xED, 0xFF, 0xDB, 0xA8, 0x76, 0x66, - 0x78, 0xAC, 0xCD, 0xDF, 0xFD, 0xFF, 0xFB, 0xCB, 0xA9, 0x88, 0x89, 0x9B, - 0xCF, 0xCF, 0xFF, 0xDF, 0xFC, 0xDF, 0xCA, 0xA9, 0xAA, 0xAA, 0xCF, 0xDD, - 0xFF, 0xFC, 0xFF, 0xFD, 0xCC, 0xCC, 0xBB, 0xAB, 0xCC, 0xCF, 0xFF, 0xFC, - 0xCF, 0xDD, 0xFC, 0xFF, 0xCB, 0xCD, 0xFF, 0xDF, 0xFF, 0xFF, 0xFC, 0xFF, - 0xDF, 0xDF, 0xCF, 0xFC, 0xCF, 0xFF, 0xFF, 0xDF, 0xFD, 0xCF, 0xFF, 0xCF, - 0xFF, 0xFC, 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0xCC, 0xFF, 0xFF, 0xFF, 0xCF, - 0xFD, 0xFC, 0xFF, 0xFF, 0xFF, 0xFF, 0x6D, 0xCC, 0xCD, 0xBD, 0xDC, 0xFD, - 0xCD, 0xCF, 0xFF, 0xFF, 0xB0, 0x00, 0x00, 0x00, - ], - [ - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x9F, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, - 0xCC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xCC, 0xCB, 0xCC, - 0xCC, 0xCF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xBC, 0xBA, 0xA9, 0xAA, 0xCF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFB, 0xA9, 0x88, 0x88, 0x9A, 0xBF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFB, 0xB9, 0x86, 0x66, 0x78, 0x9A, 0xCF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xB9, 0x87, 0x54, 0x45, 0x78, 0xAC, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFB, 0xA8, 0x64, 0x22, 0x46, 0x8A, 0xBC, 0xFF, 0xFF, 0xFF, 0xFC, 0xCA, - 0x86, 0x42, 0x24, 0x68, 0x9C, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xA8, 0x75, - 0x44, 0x56, 0x8A, 0xCC, 0xFF, 0xFF, 0xFF, 0xFF, 0xBA, 0x98, 0x76, 0x66, - 0x89, 0xBC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xBA, 0x98, 0x88, 0x89, 0xAC, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFB, 0xCB, 0xAA, 0xA9, 0xBB, 0xCF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xBC, 0xBB, 0xCF, 0xEF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xDE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x6F, 0xFF, 0xCF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00, 0x00, - ], - [ - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF9, 0xFF, 0xFF, 0x9F, 0x6F, 0xFF, - 0xFF, 0xFF, 0xFF, 0x9F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xAF, 0x9C, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x78, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0x65, 0x47, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0x94, 0x12, 0x58, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xF8, 0x52, 0x14, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, - 0x54, 0x78, 0x9F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xDF, 0x87, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x99, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xF9, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00, 0x00, - ], - [ - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF9, 0x6F, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x98, 0x98, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xF9, 0x74, 0x57, 0x9F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFA, 0x85, 0x12, 0x59, 0x9F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xF9, 0x52, 0x14, 0x89, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x97, - 0x54, 0x67, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x89, - 0x9F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x9F, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x5F, 0xFF, 0xFC, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00, 0x00, - ], - [ - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF6, 0xFF, 0xFF, 0xFF, 0xFF, 0x5F, 0xFF, - 0xFF, 0xFF, 0xF6, 0xF6, 0x6F, 0x68, 0xF5, 0xFF, 0xFF, 0xFF, 0xFF, 0xF6, - 0x66, 0xF6, 0xFF, 0x6F, 0xFF, 0xFF, 0xFF, 0xF6, 0xFF, 0xFF, 0xFF, 0xFF, - 0xF6, 0x6F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x66, 0xF6, 0x6F, - 0xFF, 0xFF, 0xFF, 0xFF, 0x6F, 0xFF, 0x6F, 0x66, 0x66, 0xFF, 0x6F, 0xF6, - 0xFF, 0xFF, 0x6F, 0xCF, 0xFF, 0x6F, 0xFF, 0xF6, 0x6F, 0x6F, 0xFF, 0x6F, - 0xFF, 0xF6, 0x56, 0xF6, 0xF6, 0x56, 0xFF, 0xFF, 0x66, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0x65, 0x56, 0x6F, 0xFF, 0xF6, 0xFF, 0x6F, 0xFF, 0xFF, - 0xF6, 0x66, 0xF6, 0xFF, 0x66, 0x6F, 0xFF, 0x6F, 0xFF, 0x6F, 0xF6, 0xFF, - 0x66, 0x6F, 0x56, 0xF6, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF6, 0x6F, - 0x46, 0xF5, 0x6F, 0x6F, 0xFF, 0xF5, 0x6B, 0xAF, 0xFF, 0x5F, 0xFF, 0xFF, - 0x6F, 0x6F, 0xF6, 0xFF, 0xFF, 0xFF, 0xFF, 0x6F, 0xF6, 0x66, 0xF5, 0xFF, - 0x5F, 0xFF, 0xFF, 0x6F, 0xFF, 0xFF, 0xFF, 0xF5, 0x55, 0xF6, 0xF6, 0xFF, - 0xFF, 0x6F, 0xFF, 0xFF, 0x6F, 0xF6, 0xFF, 0xF6, 0xF6, 0xFF, 0xFF, 0xFF, - 0xFF, 0x6F, 0xFF, 0xFF, 0xFF, 0xF6, 0x6F, 0x6F, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0x6F, 0xF6, 0xFF, 0x6F, 0xFF, 0xFF, 0xFF, 0x6F, - 0xF6, 0xFF, 0xF6, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xF6, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF6, 0xFF, 0xFF, 0xFF, 0x6F, 0x6F, - 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00, 0x00, - ], - [ - 0xFF, 0xFF, 0xFF, 0x9F, 0xFF, 0xFF, 0xFF, 0xF9, 0xFF, 0x9F, 0x4F, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xFF, 0xFF, 0xF9, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x98, 0x98, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xF9, 0xF8, 0x67, 0x8F, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xF8, 0x97, 0x54, 0x47, 0x9F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0x8F, 0x74, 0x12, 0x57, 0x8F, 0xF9, 0xFF, 0xFF, 0x9F, 0xFF, 0x9F, - 0x98, 0x52, 0x24, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF7, - 0x54, 0x58, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF7, 0xF8, - 0x9F, 0x9F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF9, 0xFF, 0x89, 0xFF, - 0x9F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF9, 0xF9, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF9, 0xF9, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x9F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0x9F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x5F, 0xF9, 0x99, 0xFF, 0x9F, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00, 0x00, - ], - [ - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x9F, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFB, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xBA, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xAA, 0xBA, 0xFF, 0xFF, 0xBF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xA8, 0x77, 0x9A, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xF8, 0x54, 0x45, 0x9A, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFA, 0x84, 0x22, 0x47, 0xAF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xA8, 0x42, 0x14, 0x7A, 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x96, - 0x44, 0x59, 0xAF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFB, 0x97, 0x78, - 0xAB, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xBF, 0xFA, 0xBF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFB, 0xBF, 0xFB, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x5F, 0xFF, 0xFB, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00, 0x00, - ], - [ - 0xFF, 0xFB, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0xFF, 0xFF, 0x5F, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0x7F, 0xFF, 0xF7, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xF7, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF6, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF7, 0x76, 0xF7, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xEF, 0xFF, 0xFF, 0x6F, 0x67, 0x6F, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xF7, 0xF7, 0x55, 0x5F, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xF7, 0x55, 0x44, 0x46, 0x7F, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, - 0xF7, 0xF5, 0x54, 0x44, 0x57, 0x66, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xF6, - 0x75, 0x44, 0x34, 0x46, 0x6F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0x55, - 0x45, 0x45, 0x56, 0xFF, 0xFF, 0xFF, 0xFD, 0xCF, 0x6F, 0x7F, 0x75, 0x57, - 0x56, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x76, 0x66, 0x7F, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF7, 0x7F, 0xF7, 0x7F, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF7, 0xFF, 0xFF, 0xF7, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0x6F, 0x7F, 0xFF, 0xF7, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x6F, 0xFF, 0x7F, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00, 0x00, - ], - [ - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x8F, 0xFF, 0xFF, 0x5F, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xF9, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF9, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xA7, 0x78, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFC, 0x44, 0x45, 0x8F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0x73, 0x22, 0x48, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xF7, 0x42, 0x24, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x86, - 0x43, 0x4C, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x77, - 0x8F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0xF9, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x9F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x4F, 0xF9, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00, 0x00, - ], - [ - 0x88, 0x88, 0x88, 0x78, 0x88, 0x88, 0x87, 0x78, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x87, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x77, 0x77, 0x77, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x77, 0x77, 0x77, 0x77, 0x77, - 0x77, 0x77, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, - 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x80, 0x00, 0x00, 0x00, - ], - [ - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x8F, 0xFF, 0xFF, 0xFF, 0xFF, 0x6F, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xCF, 0xFF, 0xFF, 0xFF, 0xF7, 0x7F, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x75, 0x67, 0x78, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xF9, 0x76, 0x43, 0x46, 0x8F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xF6, 0x63, 0x23, 0x58, 0x8F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xAF, 0x43, 0x23, 0x57, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xFF, 0x85, - 0x54, 0x45, 0x8F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x8F, 0xF7, 0x55, - 0x68, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0xBF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xF8, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x4F, 0xF8, 0xF8, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00, 0x00, - ], - [ - 0xFF, 0xFF, 0xFB, 0xFF, 0xFF, 0xFB, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xBF, 0xBF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFA, 0xAF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF9, 0x87, 0x88, 0x9F, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xAA, 0x87, 0x66, 0x78, 0xAF, 0xBF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xBF, 0xA7, 0x54, 0x45, 0x6A, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xF7, 0x64, 0x22, 0x46, 0x89, 0xDF, 0xFF, 0xFF, 0xFF, 0xFB, 0xFF, - 0x76, 0x42, 0x24, 0x68, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF9, 0x75, - 0x44, 0x57, 0xA9, 0xFF, 0xFF, 0xFA, 0xFF, 0xFF, 0xFF, 0x97, 0x76, 0x67, - 0x8F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xAF, 0xBA, 0x98, 0x8A, 0xBB, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xAF, 0xFA, 0xAF, 0xBF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFA, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xCF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x4F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00, 0x00, - ], - [ - 0xFF, 0xFF, 0xFF, 0xFF, 0xF9, 0x9F, 0xFF, 0xCF, 0x99, 0xFF, 0x3F, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFD, 0x9F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x78, 0x8F, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0x64, 0x47, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFA, 0x84, 0x22, 0x48, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xF7, 0x42, 0x14, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF7, - 0x44, 0x6F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x99, 0x88, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00, 0x00, - ], - [ - 0xFF, 0xFF, 0xFF, 0xEF, 0xFF, 0xFF, 0xEE, 0xEF, 0xFF, 0xFF, 0x3F, 0xFF, - 0xFE, 0xEE, 0xEE, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x6F, - 0xFF, 0xFF, 0xFF, 0xFE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, - 0xEE, 0xEE, 0xEE, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF6, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0x64, 0x56, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xF3, 0x12, 0x46, 0xFF, 0xFE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, - 0xEE, 0x52, 0x24, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, - 0x44, 0x6E, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, - 0x6F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFE, 0xFE, 0xF0, 0x00, 0x00, 0x00, - ], - [ - 0x88, 0x88, 0x88, 0x78, 0x88, 0x88, 0x87, 0x78, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x87, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x77, 0x77, 0x77, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x77, 0x77, 0x77, 0x77, 0x77, - 0x77, 0x77, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, - 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x80, 0x00, 0x00, 0x00, - ], - [ - 0x88, 0x88, 0x88, 0x78, 0x88, 0x88, 0x87, 0x78, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x87, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x77, 0x77, 0x77, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x77, 0x77, 0x77, 0x77, 0x77, - 0x77, 0x77, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, - 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x80, 0x00, 0x00, 0x00, - ], - [ - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFD, 0x83, 0x47, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xF4, 0x12, 0x4F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xF7, 0x42, 0x24, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF7, - 0x44, 0x77, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, 0x8F, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xBF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0x9C, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x3F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00, 0x00, - ], - ], - [ - [ - 0xBE, 0xDD, 0xEC, 0xDD, 0xDD, 0xDC, 0xDE, 0xEE, 0xFF, 0xFF, 0xCD, 0xFE, - 0xFD, 0xDD, 0xDC, 0xCD, 0xDD, 0xEE, 0xEF, 0xFF, 0xFF, 0xDE, 0xFD, 0xCC, - 0xCC, 0xBB, 0xBB, 0xCC, 0xCD, 0xFF, 0xFF, 0xFD, 0xED, 0xDC, 0xBB, 0xAA, - 0xAA, 0xAA, 0xBB, 0xCD, 0xFF, 0xFF, 0xDF, 0xEC, 0xBB, 0xA9, 0x99, 0x99, - 0x99, 0xAB, 0xCD, 0xFF, 0xFD, 0xEC, 0xBB, 0xA9, 0x88, 0x77, 0x78, 0x89, - 0xAB, 0xCD, 0xFE, 0xED, 0xCB, 0xA9, 0x87, 0x76, 0x66, 0x77, 0x89, 0xAB, - 0xCD, 0xFC, 0xDC, 0xA9, 0x87, 0x76, 0x65, 0x66, 0x67, 0x89, 0xBC, 0xDF, - 0xDC, 0xCA, 0x98, 0x76, 0x55, 0x55, 0x56, 0x78, 0x9A, 0xCD, 0xDD, 0xDB, - 0xA9, 0x87, 0x65, 0x54, 0x55, 0x56, 0x79, 0xAC, 0xDD, 0xDC, 0xBA, 0x97, - 0x65, 0x54, 0x44, 0x55, 0x67, 0x8A, 0xBD, 0xDE, 0xCB, 0xA9, 0x76, 0x65, - 0x54, 0x55, 0x66, 0x79, 0xAB, 0xCD, 0xED, 0xCA, 0x98, 0x76, 0x55, 0x55, - 0x56, 0x78, 0x9A, 0xBD, 0xDE, 0xDC, 0xB9, 0x87, 0x66, 0x65, 0x66, 0x77, - 0x89, 0xAC, 0xDC, 0xEF, 0xCB, 0xA9, 0x87, 0x76, 0x66, 0x77, 0x89, 0xAB, - 0xCD, 0xDF, 0xFE, 0xCB, 0xA9, 0x88, 0x77, 0x78, 0x89, 0xAB, 0xCC, 0xED, - 0xFF, 0xED, 0xCB, 0xA9, 0x99, 0x99, 0x99, 0xAB, 0xBC, 0xDF, 0xDF, 0xFF, - 0xED, 0xCC, 0xBA, 0xAA, 0xAA, 0xAB, 0xBC, 0xDE, 0xFD, 0xFF, 0xFF, 0xFE, - 0xDC, 0xCB, 0xBB, 0xBC, 0xCC, 0xEE, 0xEF, 0xEF, 0xFF, 0xFF, 0xFE, 0xEE, - 0xCC, 0xDD, 0xDD, 0xDF, 0xEF, 0xFF, 0xDF, 0xFF, 0xFE, 0xFF, 0xDD, 0xDD, - 0xDD, 0xDD, 0xDE, 0xDE, 0xB0, 0x00, 0x00, 0x00, - ], - [ - 0xAD, 0xCB, 0xBB, 0xBC, 0xCB, 0xFC, 0xDB, 0xCD, 0xFF, 0xFF, 0xCF, 0xFF, - 0xBD, 0xCC, 0xDC, 0xDB, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xCF, 0xCC, 0xDC, - 0xBB, 0xAB, 0xBA, 0xBC, 0xCD, 0xDD, 0xDD, 0xFB, 0xDD, 0xFB, 0xAB, 0xAA, - 0x9A, 0xAA, 0xAA, 0xBC, 0xFF, 0xFF, 0xCF, 0xFC, 0xCB, 0xBA, 0x99, 0x99, - 0x99, 0xAB, 0xBC, 0xCF, 0xFB, 0xDB, 0xBA, 0xA9, 0x98, 0x87, 0x78, 0x88, - 0xAA, 0xBC, 0xDF, 0xCF, 0xFB, 0xA9, 0x88, 0x77, 0x77, 0x77, 0x89, 0xAA, - 0xBF, 0xCF, 0xCC, 0xA9, 0x98, 0x76, 0x65, 0x56, 0x67, 0x89, 0xAB, 0xFC, - 0xCB, 0xDA, 0xA8, 0x76, 0x65, 0x55, 0x56, 0x78, 0x9A, 0xBC, 0xCB, 0xFB, - 0xA9, 0x87, 0x65, 0x44, 0x45, 0x56, 0x79, 0x9B, 0xCC, 0xBF, 0xBA, 0x97, - 0x75, 0x54, 0x44, 0x56, 0x68, 0x9A, 0xBE, 0xFB, 0xDB, 0xA9, 0x86, 0x65, - 0x44, 0x45, 0x67, 0x89, 0xAA, 0xCC, 0xDF, 0xBB, 0x98, 0x76, 0x55, 0x55, - 0x66, 0x78, 0x9A, 0xAC, 0xDC, 0xFC, 0xA9, 0x87, 0x66, 0x66, 0x66, 0x78, - 0x8A, 0xAB, 0xBB, 0xFC, 0xBC, 0xB9, 0x87, 0x76, 0x77, 0x77, 0x89, 0xAB, - 0xDC, 0xBC, 0xFC, 0xBB, 0xA9, 0x98, 0x88, 0x88, 0x99, 0x9A, 0xCB, 0xCB, - 0xFF, 0xFC, 0xCA, 0xAA, 0x99, 0x99, 0xA9, 0x9B, 0xBC, 0xCD, 0xDF, 0xFF, - 0xCF, 0xBB, 0xBA, 0xAA, 0xAA, 0xBB, 0xBC, 0xCF, 0xDD, 0xFF, 0xFF, 0xFD, - 0xCC, 0xCB, 0xBB, 0xCC, 0xBB, 0xDB, 0xFF, 0xCF, 0xFF, 0xFF, 0xDD, 0xFD, - 0xBF, 0xDC, 0xCB, 0xBF, 0xDF, 0xFC, 0xFF, 0xFF, 0xFE, 0xED, 0xFF, 0xCB, - 0xBC, 0xDC, 0xBC, 0xBC, 0xA0, 0x00, 0x00, 0x00, - ], - [ - 0xCD, 0xDF, 0xDD, 0xDD, 0xDC, 0xDD, 0xDD, 0xDE, 0xFF, 0xFF, 0xDF, 0xFF, - 0xFE, 0xDD, 0xDC, 0xCC, 0xCD, 0xDE, 0xEF, 0xFF, 0xFF, 0xEF, 0xFD, 0xDC, - 0xBB, 0xBB, 0xBB, 0xBB, 0xCD, 0xDF, 0xFF, 0xFD, 0xFE, 0xDC, 0xBB, 0xAA, - 0x9A, 0xAA, 0xAB, 0xCD, 0xEF, 0xFF, 0xDF, 0xDC, 0xBA, 0xA9, 0x98, 0x88, - 0x89, 0xAA, 0xBD, 0xDF, 0xFD, 0xEC, 0xBA, 0x99, 0x88, 0x77, 0x77, 0x89, - 0x9A, 0xBC, 0xEF, 0xDD, 0xCB, 0x99, 0x87, 0x76, 0x66, 0x67, 0x88, 0xAB, - 0xCD, 0xFD, 0xDB, 0xA9, 0x87, 0x66, 0x65, 0x56, 0x67, 0x89, 0xAB, 0xED, - 0xDC, 0xBA, 0x98, 0x76, 0x55, 0x55, 0x56, 0x77, 0x8A, 0xBD, 0xDD, 0xCB, - 0xA8, 0x76, 0x65, 0x55, 0x55, 0x66, 0x78, 0xAB, 0xCD, 0xDC, 0xB9, 0x87, - 0x65, 0x55, 0x44, 0x55, 0x67, 0x89, 0xBD, 0xDD, 0xCB, 0xA8, 0x76, 0x65, - 0x55, 0x55, 0x66, 0x78, 0x9B, 0xCD, 0xDC, 0xBA, 0x98, 0x76, 0x55, 0x55, - 0x56, 0x78, 0x9A, 0xBC, 0xDE, 0xDB, 0xA9, 0x87, 0x66, 0x65, 0x66, 0x67, - 0x89, 0xAB, 0xDD, 0xED, 0xCB, 0xA9, 0x87, 0x76, 0x66, 0x77, 0x89, 0x9B, - 0xCC, 0xDE, 0xEC, 0xCB, 0xA9, 0x88, 0x77, 0x78, 0x89, 0x9A, 0xBC, 0xED, - 0xFF, 0xDD, 0xBA, 0xA9, 0x98, 0x88, 0x89, 0xAA, 0xBC, 0xDD, 0xDF, 0xFF, - 0xFD, 0xBB, 0xAA, 0xAA, 0xAA, 0xAB, 0xBC, 0xDD, 0xED, 0xFF, 0xFE, 0xFD, - 0xCB, 0xBB, 0xBB, 0xBC, 0xBC, 0xDD, 0xEF, 0xEF, 0xFF, 0xFF, 0xFE, 0xDC, - 0xCC, 0xCC, 0xCC, 0xDE, 0xDF, 0xFE, 0xDF, 0xFF, 0xFF, 0xFE, 0xDD, 0xDC, - 0xCD, 0xDD, 0xDE, 0xDE, 0xC0, 0x00, 0x00, 0x00, - ], - [ - 0xEE, 0xEE, 0xEE, 0xDE, 0xEE, 0xEE, 0xDD, 0xDE, 0xEE, 0xEE, 0xEE, 0xEE, - 0xED, 0xDD, 0xDD, 0xDE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, - 0xEE, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDE, 0xEE, 0xEE, 0xEE, 0xEE, - 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, - 0xEE, 0xEE, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0x4D, 0xDD, - 0xDD, 0xDD, 0xDD, 0xDE, 0xEE, 0xEE, 0xE3, 0xEE, 0xE4, 0xEE, 0xEE, 0xEE, - 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0x5E, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, - 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0x3E, 0x4E, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, - 0xEE, 0xEE, 0x44, 0x44, 0x4D, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, - 0x44, 0x4D, 0xDD, 0xD4, 0x4D, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xD4, 0xD3, - 0x3D, 0x4D, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDE, 0xEE, 0xE4, 0xE4, 0xEE, - 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0x4E, 0xEE, 0x44, 0xEE, - 0xE4, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, - 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, - 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xE4, 0xEE, 0xEE, 0xEE, 0xEE, - 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, - 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xED, 0xED, 0xEE, 0xEE, 0xEE, - 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0x4E, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, - 0xED, 0xED, 0xED, 0xEE, 0xE0, 0x00, 0x00, 0x00, - ], - [ - 0xAD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDC, 0xFD, 0xFF, 0xFF, 0xFF, 0xDD, 0xFF, - 0xDF, 0xDD, 0xCC, 0xCC, 0xCC, 0xDF, 0xFF, 0xFF, 0xFF, 0xEF, 0xDD, 0xDC, - 0xCC, 0xBB, 0xBB, 0xBC, 0xCC, 0xDF, 0xFF, 0xFE, 0xFD, 0xEC, 0xBB, 0xAA, - 0x9A, 0xAA, 0xAB, 0xCD, 0xDF, 0xFF, 0xCD, 0xCD, 0xBA, 0xA9, 0x98, 0x88, - 0x99, 0x9A, 0xCD, 0xDF, 0xFD, 0xDC, 0xBA, 0xA9, 0x88, 0x77, 0x78, 0x89, - 0x9A, 0xBD, 0xFF, 0xCC, 0xCB, 0xA9, 0x87, 0x76, 0x66, 0x77, 0x89, 0x9A, - 0xDF, 0xFC, 0xDB, 0xB9, 0x87, 0x66, 0x65, 0x66, 0x67, 0x89, 0xAC, 0xDD, - 0xDD, 0xBA, 0x98, 0x76, 0x55, 0x55, 0x56, 0x78, 0x8A, 0xCD, 0xED, 0xCB, - 0xA8, 0x76, 0x65, 0x55, 0x55, 0x66, 0x78, 0x9B, 0xDE, 0xDC, 0xBA, 0x87, - 0x65, 0x55, 0x45, 0x55, 0x67, 0x8A, 0xBD, 0xCD, 0xCB, 0xA8, 0x76, 0x55, - 0x54, 0x55, 0x56, 0x78, 0xAB, 0xCD, 0xED, 0xBA, 0x98, 0x76, 0x55, 0x55, - 0x56, 0x78, 0x9A, 0xBC, 0xCD, 0xFB, 0xA9, 0x87, 0x66, 0x65, 0x66, 0x67, - 0x89, 0xAB, 0xCD, 0xFF, 0xDB, 0xA8, 0x87, 0x76, 0x66, 0x77, 0x89, 0xAB, - 0xCC, 0xDF, 0xFD, 0xCA, 0x98, 0x88, 0x77, 0x77, 0x89, 0x9A, 0xBC, 0xED, - 0xFF, 0xFD, 0xCB, 0xA9, 0x98, 0x88, 0x99, 0xAA, 0xBC, 0xDD, 0xDF, 0xFF, - 0xDC, 0xCB, 0xAA, 0xAA, 0x9A, 0xAB, 0xBC, 0xCE, 0xED, 0xFF, 0xFF, 0xFD, - 0xCC, 0xBB, 0xBC, 0xBB, 0xCC, 0xDD, 0xFF, 0xEF, 0xFF, 0xFF, 0xFF, 0xDC, - 0xCC, 0xCD, 0xDC, 0xDF, 0xFF, 0xEF, 0xDF, 0xFF, 0xFE, 0xFC, 0xEC, 0xCD, - 0xCC, 0xDD, 0xCD, 0xDD, 0xB0, 0x00, 0x00, 0x00, - ], - [ - 0xAC, 0xCB, 0xBB, 0xBB, 0xBA, 0xAB, 0xBB, 0xCC, 0xCC, 0xEF, 0xBC, 0xDD, - 0xCC, 0xCB, 0xBB, 0xBB, 0xBB, 0xBC, 0xCC, 0xEE, 0xFE, 0xCC, 0xCC, 0xBB, - 0xAA, 0xAA, 0xAA, 0xAA, 0xAB, 0xCC, 0xDE, 0xEC, 0xCC, 0xBA, 0xAA, 0x99, - 0x98, 0x99, 0x9A, 0xAB, 0xBC, 0xDD, 0xBC, 0xBA, 0xA9, 0x98, 0x88, 0x88, - 0x88, 0x99, 0xAB, 0xBC, 0xDB, 0xBB, 0xA9, 0x98, 0x87, 0x77, 0x77, 0x78, - 0x99, 0xAB, 0xCC, 0xBB, 0xAA, 0x98, 0x77, 0x76, 0x66, 0x77, 0x78, 0x9A, - 0xAC, 0xCB, 0xBA, 0x98, 0x87, 0x66, 0x66, 0x66, 0x67, 0x78, 0x9A, 0xBB, - 0xBB, 0xA9, 0x87, 0x76, 0x65, 0x55, 0x66, 0x77, 0x89, 0xAB, 0xBB, 0xBA, - 0x98, 0x76, 0x65, 0x55, 0x55, 0x66, 0x78, 0x9A, 0xAB, 0xBB, 0x99, 0x87, - 0x66, 0x55, 0x55, 0x56, 0x67, 0x89, 0xAA, 0xAB, 0xBA, 0x98, 0x76, 0x65, - 0x55, 0x55, 0x66, 0x78, 0x9A, 0xBB, 0xBB, 0xA9, 0x87, 0x76, 0x65, 0x55, - 0x66, 0x77, 0x89, 0xAB, 0xBB, 0xBA, 0x98, 0x87, 0x66, 0x66, 0x66, 0x67, - 0x88, 0x9A, 0xBB, 0xCC, 0xAA, 0x98, 0x77, 0x76, 0x66, 0x77, 0x78, 0x99, - 0xAB, 0xBC, 0xCB, 0xA9, 0x98, 0x87, 0x77, 0x77, 0x88, 0x99, 0xAB, 0xBB, - 0xCC, 0xCB, 0xA9, 0x98, 0x88, 0x88, 0x88, 0x99, 0xAA, 0xBC, 0xBD, 0xDD, - 0xBB, 0xAA, 0x99, 0x99, 0x99, 0x99, 0xAA, 0xBB, 0xCC, 0xEE, 0xDC, 0xCB, - 0xBA, 0xAA, 0xAA, 0xAA, 0xAB, 0xBC, 0xCD, 0xCF, 0xFE, 0xDD, 0xCC, 0xBB, - 0xBA, 0xBB, 0xBB, 0xBC, 0xCD, 0xDC, 0xCE, 0xDD, 0xDC, 0xCB, 0xBB, 0xBB, - 0xBB, 0xBB, 0xBB, 0xCC, 0xA0, 0x00, 0x00, 0x00, - ], - [ - 0x9B, 0xBB, 0xBA, 0xAA, 0xAA, 0xAA, 0xAB, 0xBB, 0xCC, 0xDD, 0xBC, 0xDC, - 0xCC, 0xBB, 0xBA, 0xAA, 0xAA, 0xAB, 0xCB, 0xCD, 0xEE, 0xBD, 0xCC, 0xBB, - 0xAA, 0x99, 0x99, 0x9A, 0xAA, 0xBC, 0xCD, 0xDB, 0xCC, 0xAA, 0xA9, 0x99, - 0x88, 0x89, 0x99, 0x9A, 0xBC, 0xDC, 0xBC, 0xBA, 0x99, 0x98, 0x88, 0x77, - 0x88, 0x89, 0x9A, 0xBC, 0xCB, 0xBA, 0xA9, 0x88, 0x87, 0x77, 0x77, 0x78, - 0x89, 0x9A, 0xBB, 0xAB, 0xA9, 0x88, 0x77, 0x76, 0x66, 0x67, 0x78, 0x89, - 0xAB, 0xBA, 0xAA, 0x98, 0x77, 0x66, 0x66, 0x66, 0x67, 0x78, 0x9A, 0xBA, - 0xAA, 0x99, 0x87, 0x76, 0x66, 0x66, 0x66, 0x67, 0x89, 0xAA, 0xAA, 0xA9, - 0x88, 0x76, 0x66, 0x55, 0x56, 0x66, 0x78, 0x89, 0xAA, 0xAA, 0x98, 0x77, - 0x66, 0x55, 0x55, 0x66, 0x67, 0x88, 0x9A, 0xAA, 0xA9, 0x88, 0x76, 0x66, - 0x55, 0x56, 0x66, 0x78, 0x89, 0xAA, 0xBA, 0x98, 0x87, 0x66, 0x66, 0x66, - 0x66, 0x77, 0x88, 0x9A, 0xAB, 0xBA, 0x98, 0x77, 0x66, 0x66, 0x66, 0x67, - 0x88, 0x9A, 0xAA, 0xBA, 0xA9, 0x88, 0x77, 0x66, 0x66, 0x77, 0x78, 0x99, - 0xAB, 0xAB, 0xBB, 0xA9, 0x88, 0x77, 0x77, 0x77, 0x78, 0x89, 0xAB, 0xBB, - 0xCC, 0xBA, 0xA9, 0x88, 0x88, 0x88, 0x88, 0x89, 0x9A, 0xBC, 0xBC, 0xCB, - 0xBA, 0x99, 0x99, 0x88, 0x89, 0x99, 0xAA, 0xBB, 0xCB, 0xDD, 0xDC, 0xBA, - 0xA9, 0x99, 0x99, 0xAA, 0xAA, 0xBB, 0xCD, 0xBE, 0xEE, 0xCC, 0xCB, 0xBA, - 0xAA, 0xAA, 0xBB, 0xBC, 0xCD, 0xDB, 0xCD, 0xEC, 0xBB, 0xBB, 0xBA, 0xAA, - 0xAA, 0xAB, 0xBB, 0xBC, 0x90, 0x00, 0x00, 0x00, - ], - [ - 0x9B, 0xBA, 0xAA, 0xAA, 0x99, 0x99, 0xAA, 0xAA, 0xBB, 0xCC, 0xBB, 0xCB, - 0xBB, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xBB, 0xCC, 0xDC, 0xBC, 0xBB, 0xAA, - 0x99, 0x99, 0x99, 0x99, 0xAA, 0xAB, 0xCC, 0xCA, 0xBB, 0xAA, 0x99, 0x98, - 0x88, 0x88, 0x89, 0x9A, 0xAB, 0xCB, 0xAB, 0xAA, 0x99, 0x88, 0x87, 0x77, - 0x88, 0x88, 0x9A, 0xAB, 0xBA, 0xAA, 0x99, 0x88, 0x77, 0x77, 0x77, 0x78, - 0x89, 0x9A, 0xAA, 0xAA, 0xA9, 0x88, 0x77, 0x76, 0x66, 0x77, 0x77, 0x89, - 0x9A, 0xAA, 0xA9, 0x98, 0x77, 0x76, 0x66, 0x66, 0x67, 0x78, 0x89, 0xAA, - 0x9A, 0x98, 0x87, 0x76, 0x66, 0x66, 0x66, 0x77, 0x88, 0x9A, 0x99, 0xA9, - 0x88, 0x76, 0x66, 0x66, 0x66, 0x66, 0x77, 0x89, 0xA9, 0x9A, 0x98, 0x77, - 0x66, 0x65, 0x56, 0x66, 0x67, 0x78, 0x9A, 0x99, 0xA9, 0x87, 0x76, 0x66, - 0x65, 0x66, 0x66, 0x77, 0x89, 0xA9, 0xAA, 0x98, 0x87, 0x66, 0x66, 0x66, - 0x66, 0x77, 0x88, 0x9A, 0x9A, 0xA9, 0x88, 0x77, 0x66, 0x66, 0x66, 0x77, - 0x78, 0x99, 0xAA, 0xAA, 0x99, 0x88, 0x77, 0x66, 0x66, 0x77, 0x78, 0x89, - 0x9A, 0xAA, 0xBA, 0x99, 0x88, 0x77, 0x77, 0x77, 0x78, 0x89, 0x9A, 0xAA, - 0xBB, 0xAA, 0x99, 0x88, 0x87, 0x78, 0x88, 0x89, 0x9A, 0xAB, 0xAB, 0xCB, - 0xAA, 0x99, 0x88, 0x88, 0x88, 0x89, 0x9A, 0xAB, 0xBA, 0xCD, 0xCB, 0xAA, - 0xA9, 0x99, 0x99, 0x99, 0x9A, 0xAB, 0xBC, 0xBD, 0xDC, 0xCB, 0xBA, 0xAA, - 0xAA, 0xAA, 0xAA, 0xBB, 0xBC, 0xCB, 0xCC, 0xCB, 0xBA, 0xAA, 0x99, 0x99, - 0x99, 0xAA, 0xAA, 0xBB, 0x90, 0x00, 0x00, 0x00, - ], - [ - 0x9B, 0xBB, 0xBA, 0xAA, 0xAA, 0xAA, 0xAA, 0xBB, 0xBC, 0xDD, 0xCC, 0xCB, - 0xBC, 0xBA, 0xAA, 0xAA, 0xAA, 0xAB, 0xAC, 0xCD, 0xDE, 0xBD, 0xCB, 0xAA, - 0x99, 0x99, 0x99, 0x99, 0xAA, 0xBB, 0xCC, 0xCA, 0xBC, 0xBA, 0x99, 0x98, - 0x88, 0x89, 0x89, 0x9A, 0xBB, 0xCC, 0xAB, 0xAA, 0x99, 0x88, 0x87, 0x77, - 0x88, 0x89, 0x9A, 0xBB, 0xBA, 0xBA, 0x99, 0x88, 0x77, 0x77, 0x77, 0x78, - 0x89, 0xAA, 0xCC, 0xAA, 0xA9, 0x88, 0x87, 0x76, 0x66, 0x77, 0x78, 0x89, - 0xAB, 0xBA, 0xB9, 0x98, 0x77, 0x66, 0x66, 0x66, 0x77, 0x78, 0x99, 0xAA, - 0xAA, 0x99, 0x87, 0x76, 0x66, 0x66, 0x66, 0x67, 0x88, 0x9A, 0xAA, 0xA9, - 0x87, 0x76, 0x66, 0x65, 0x56, 0x66, 0x78, 0x89, 0xAA, 0xAA, 0x98, 0x87, - 0x66, 0x65, 0x55, 0x66, 0x67, 0x88, 0x9A, 0xAA, 0xA9, 0x88, 0x76, 0x66, - 0x55, 0x56, 0x66, 0x78, 0x89, 0xAA, 0xAA, 0x99, 0x87, 0x76, 0x66, 0x66, - 0x66, 0x77, 0x88, 0x9A, 0xAA, 0xA9, 0x98, 0x77, 0x66, 0x66, 0x66, 0x67, - 0x78, 0x9A, 0xBA, 0xAB, 0xA9, 0x87, 0x77, 0x66, 0x66, 0x77, 0x78, 0x99, - 0xAA, 0xBB, 0xBA, 0x99, 0x88, 0x77, 0x77, 0x77, 0x78, 0x89, 0xAB, 0xBA, - 0xBB, 0xAA, 0x99, 0x88, 0x87, 0x88, 0x88, 0x89, 0x9A, 0xAB, 0xBD, 0xBB, - 0xBA, 0xA9, 0x98, 0x88, 0x88, 0x99, 0x9A, 0xAB, 0xBB, 0xDD, 0xCB, 0xAB, - 0xA9, 0x99, 0x99, 0x9A, 0xAA, 0xBC, 0xBC, 0xBD, 0xDC, 0xBB, 0xBB, 0xAA, - 0xA9, 0xAA, 0xAA, 0xBB, 0xDC, 0xDC, 0xBE, 0xDC, 0xBB, 0xAA, 0xAA, 0xAA, - 0xAA, 0xAA, 0xAB, 0xBB, 0x90, 0x00, 0x00, 0x00, - ], - [ - 0x9C, 0xBB, 0xBB, 0xAA, 0xAA, 0xAA, 0xAB, 0xBB, 0xCC, 0xDE, 0xCB, 0xEC, - 0xCC, 0xBB, 0xAA, 0xAA, 0xAB, 0xBB, 0xBC, 0xDD, 0xEE, 0xBD, 0xCB, 0xBA, - 0xAA, 0x99, 0x99, 0xAA, 0xAB, 0xBC, 0xCE, 0xDB, 0xCB, 0xBA, 0xA9, 0x99, - 0x88, 0x89, 0x99, 0xAA, 0xBC, 0xDC, 0xBC, 0xBA, 0xA9, 0x98, 0x88, 0x88, - 0x88, 0x99, 0xAA, 0xBC, 0xCB, 0xBB, 0xA9, 0x88, 0x87, 0x77, 0x77, 0x78, - 0x89, 0xAB, 0xBC, 0xAB, 0xA9, 0x98, 0x77, 0x76, 0x66, 0x77, 0x78, 0x99, - 0xAB, 0xBA, 0xBA, 0x98, 0x87, 0x76, 0x66, 0x66, 0x67, 0x78, 0x9A, 0xBB, - 0xAA, 0x99, 0x87, 0x76, 0x66, 0x55, 0x66, 0x67, 0x89, 0x9A, 0xAA, 0xA9, - 0x88, 0x76, 0x66, 0x55, 0x55, 0x66, 0x78, 0x99, 0xAA, 0xAA, 0x98, 0x87, - 0x66, 0x55, 0x55, 0x56, 0x67, 0x88, 0x9A, 0xAA, 0xA9, 0x88, 0x76, 0x65, - 0x55, 0x56, 0x66, 0x78, 0x99, 0xAA, 0xAB, 0x99, 0x87, 0x76, 0x66, 0x56, - 0x66, 0x77, 0x89, 0x9A, 0xAB, 0xBA, 0x98, 0x77, 0x66, 0x66, 0x66, 0x77, - 0x88, 0x9A, 0xAA, 0xBB, 0xA9, 0x98, 0x77, 0x76, 0x66, 0x77, 0x78, 0x99, - 0xAB, 0xBB, 0xCB, 0xA9, 0x88, 0x77, 0x77, 0x77, 0x88, 0x99, 0xAA, 0xBB, - 0xCC, 0xBA, 0xA9, 0x98, 0x88, 0x88, 0x88, 0x99, 0xAA, 0xBC, 0xBC, 0xDC, - 0xBA, 0xA9, 0x99, 0x88, 0x99, 0x99, 0xAA, 0xBB, 0xCB, 0xCD, 0xDC, 0xBB, - 0xAA, 0x99, 0x99, 0xAA, 0xAA, 0xBB, 0xCD, 0xBD, 0xED, 0xCC, 0xBB, 0xBB, - 0xAA, 0xAA, 0xAB, 0xBC, 0xCC, 0xDC, 0xBD, 0xDC, 0xCB, 0xBB, 0xAA, 0xAA, - 0xAA, 0xBB, 0xBB, 0xBC, 0x90, 0x00, 0x00, 0x00, - ], - [ - 0xBD, 0xED, 0xDD, 0xDD, 0xDD, 0xDE, 0xEE, 0xFF, 0xFF, 0xEF, 0xBF, 0xFF, - 0xFD, 0xDD, 0xDD, 0xDD, 0xEE, 0xFF, 0xFF, 0xFF, 0xFF, 0xEF, 0xED, 0xDC, - 0xCC, 0xCC, 0xCC, 0xDD, 0xFF, 0xFF, 0xFF, 0xFD, 0xFE, 0xDC, 0xCB, 0xBB, - 0xBB, 0xBB, 0xCC, 0xEF, 0xFF, 0xFF, 0xDE, 0xDC, 0xBB, 0xAA, 0x99, 0x99, - 0xAA, 0xBC, 0xDF, 0xFF, 0xED, 0xEC, 0xCB, 0xA9, 0x98, 0x88, 0x88, 0x9A, - 0xBD, 0xEF, 0xFF, 0xDD, 0xCB, 0xA9, 0x88, 0x76, 0x67, 0x78, 0x9A, 0xCD, - 0xEF, 0xFD, 0xDC, 0xBA, 0x98, 0x76, 0x55, 0x56, 0x78, 0x9B, 0xCD, 0xEE, - 0xDE, 0xCB, 0x98, 0x76, 0x54, 0x44, 0x56, 0x79, 0xAC, 0xDE, 0xED, 0xDC, - 0xB9, 0x87, 0x54, 0x44, 0x45, 0x67, 0x9A, 0xCD, 0xED, 0xDE, 0xCB, 0x98, - 0x65, 0x44, 0x44, 0x56, 0x78, 0xAB, 0xDE, 0xDE, 0xFC, 0xB9, 0x87, 0x55, - 0x44, 0x45, 0x67, 0x9A, 0xBC, 0xED, 0xEE, 0xDB, 0xA8, 0x76, 0x55, 0x55, - 0x67, 0x89, 0xAB, 0xCE, 0xEF, 0xFD, 0xCA, 0x98, 0x76, 0x66, 0x67, 0x78, - 0x9B, 0xBD, 0xED, 0xFF, 0xFD, 0xBA, 0x98, 0x87, 0x77, 0x88, 0x9A, 0xBC, - 0xDE, 0xDF, 0xFE, 0xDC, 0xBA, 0x99, 0x99, 0x99, 0x9A, 0xBB, 0xCD, 0xED, - 0xFF, 0xFF, 0xEC, 0xBB, 0xAA, 0xAA, 0xAA, 0xBB, 0xCD, 0xFE, 0xEF, 0xFF, - 0xFF, 0xEC, 0xDC, 0xBB, 0xBB, 0xCC, 0xCC, 0xDE, 0xFD, 0xFF, 0xFF, 0xFF, - 0xFE, 0xED, 0xDC, 0xCD, 0xDD, 0xDE, 0xEF, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xEE, 0xFE, 0xDE, 0xEE, 0xFF, 0xFF, 0xCF, 0xFF, 0xFF, 0xEE, 0xDD, 0xDE, - 0xFE, 0xDD, 0xDE, 0xEE, 0xB0, 0x00, 0x00, 0x00, - ], - [ - 0x88, 0x88, 0x88, 0x78, 0x88, 0x88, 0x87, 0x78, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x87, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x77, 0x77, 0x77, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x77, 0x77, 0x77, 0x77, 0x77, - 0x77, 0x77, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, - 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x80, 0x00, 0x00, 0x00, - ], - [ - 0xBF, 0xDD, 0xDC, 0xCC, 0xBC, 0xCD, 0xDD, 0xDF, 0xFF, 0xFF, 0xCD, 0xDF, - 0xDC, 0xCB, 0xCB, 0xCB, 0xCC, 0xCD, 0xFF, 0xFF, 0xFF, 0xDE, 0xDC, 0xCC, - 0xBB, 0xBA, 0xAB, 0xBB, 0xCD, 0xFF, 0xFF, 0xFC, 0xDD, 0xBB, 0xAA, 0x99, - 0x99, 0x9A, 0xAB, 0xCD, 0xDF, 0xFF, 0xDC, 0xBB, 0xA9, 0x98, 0x88, 0x88, - 0x89, 0xAB, 0xBC, 0xDF, 0xFC, 0xCC, 0xA9, 0x98, 0x87, 0x77, 0x77, 0x89, - 0xAB, 0xBD, 0xFF, 0xCC, 0xBA, 0x98, 0x77, 0x66, 0x66, 0x77, 0x89, 0xAB, - 0xDD, 0xFC, 0xCA, 0x99, 0x87, 0x66, 0x55, 0x56, 0x67, 0x89, 0xAB, 0xFF, - 0xCC, 0xA9, 0x87, 0x66, 0x55, 0x55, 0x56, 0x78, 0x9A, 0xBE, 0xEC, 0xBA, - 0x98, 0x76, 0x55, 0x54, 0x55, 0x67, 0x89, 0xAB, 0xCD, 0xCC, 0xA9, 0x87, - 0x65, 0x54, 0x45, 0x56, 0x78, 0x9A, 0xBC, 0xDD, 0xCB, 0x98, 0x76, 0x55, - 0x55, 0x55, 0x67, 0x78, 0xAB, 0xCC, 0xCC, 0xBA, 0x97, 0x76, 0x55, 0x55, - 0x66, 0x78, 0x9A, 0xBC, 0xDF, 0xDB, 0xA9, 0x87, 0x76, 0x66, 0x66, 0x77, - 0x89, 0xAB, 0xCD, 0xDD, 0xDB, 0xA8, 0x87, 0x77, 0x67, 0x77, 0x89, 0xAA, - 0xBD, 0xFF, 0xDD, 0xCA, 0xA9, 0x88, 0x77, 0x88, 0x89, 0x9A, 0xBC, 0xDC, - 0xFF, 0xFD, 0xCB, 0xAA, 0x99, 0x89, 0x99, 0xAA, 0xBC, 0xCF, 0xCF, 0xFF, - 0xFD, 0xCB, 0xBA, 0xAA, 0xAA, 0xAB, 0xBC, 0xDC, 0xFF, 0xFF, 0xFF, 0xFD, - 0xCB, 0xBB, 0xBB, 0xBB, 0xCC, 0xCD, 0xDF, 0xFF, 0xFF, 0xFF, 0xFE, 0xDC, - 0xCC, 0xCC, 0xDD, 0xCC, 0xFE, 0xDF, 0xDF, 0xFF, 0xFF, 0xDD, 0xCC, 0xCD, - 0xCC, 0xCF, 0xDD, 0xDD, 0xC0, 0x00, 0x00, 0x00, - ], - [ - 0x88, 0x88, 0x88, 0x78, 0x88, 0x88, 0x87, 0x78, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x87, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x77, 0x77, 0x77, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x77, 0x77, 0x77, 0x77, 0x77, - 0x77, 0x77, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, - 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x80, 0x00, 0x00, 0x00, - ], - [ - 0xBF, 0xDD, 0xED, 0xED, 0xDD, 0xDE, 0xEE, 0xFF, 0xFF, 0xFF, 0xCE, 0xFF, - 0xFF, 0xFE, 0xDE, 0xEE, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0xEF, 0xFE, 0xDD, - 0xCC, 0xCC, 0xCC, 0xDD, 0xDE, 0xFF, 0xFF, 0xFE, 0xFE, 0xED, 0xCC, 0xBB, - 0xBB, 0xBB, 0xCD, 0xEF, 0xFF, 0xFF, 0xDE, 0xDD, 0xBB, 0xAA, 0x99, 0x99, - 0xAB, 0xCD, 0xED, 0xFF, 0xFE, 0xFD, 0xCB, 0xA9, 0x98, 0x88, 0x88, 0x9A, - 0xBD, 0xEF, 0xFF, 0xDF, 0xDC, 0xB9, 0x87, 0x76, 0x67, 0x78, 0x9A, 0xCE, - 0xFF, 0xFE, 0xDD, 0xBA, 0x97, 0x76, 0x55, 0x56, 0x78, 0x9B, 0xCE, 0xFF, - 0xED, 0xDB, 0xA8, 0x76, 0x54, 0x44, 0x56, 0x79, 0xAC, 0xEF, 0xEE, 0xEC, - 0xB9, 0x86, 0x54, 0x44, 0x45, 0x67, 0x9A, 0xCD, 0xFE, 0xEE, 0xCB, 0x98, - 0x65, 0x44, 0x44, 0x56, 0x79, 0xAC, 0xEF, 0xFD, 0xEC, 0xB9, 0x87, 0x55, - 0x44, 0x45, 0x67, 0x9A, 0xCD, 0xFD, 0xEF, 0xDB, 0xA8, 0x76, 0x55, 0x55, - 0x67, 0x89, 0xAC, 0xDF, 0xEE, 0xFD, 0xCB, 0x98, 0x76, 0x66, 0x67, 0x78, - 0xAB, 0xCD, 0xEE, 0xFF, 0xFD, 0xBA, 0x98, 0x87, 0x77, 0x88, 0x9A, 0xBC, - 0xDF, 0xEF, 0xFF, 0xED, 0xBA, 0xA9, 0x99, 0x99, 0xAA, 0xBC, 0xDD, 0xEE, - 0xFF, 0xFF, 0xDC, 0xCB, 0xAA, 0xAA, 0xAB, 0xBC, 0xCD, 0xEE, 0xEF, 0xFF, - 0xFF, 0xED, 0xCC, 0xCC, 0xCC, 0xCC, 0xCD, 0xEF, 0xFE, 0xFF, 0xFF, 0xFF, - 0xED, 0xDD, 0xDD, 0xDD, 0xDD, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xEE, 0xFE, 0xEF, 0xFF, 0xFF, 0xFF, 0xBF, 0xEF, 0xFF, 0xEE, 0xED, 0xEE, - 0xED, 0xFE, 0xFE, 0xEE, 0xB0, 0x00, 0x00, 0x00, - ], - [ - 0xAC, 0xCB, 0xBB, 0xBB, 0xBB, 0xAB, 0xBB, 0xCC, 0xCD, 0xDE, 0xBC, 0xDD, - 0xCC, 0xBB, 0xBB, 0xBB, 0xBB, 0xBC, 0xCD, 0xDF, 0xFD, 0xBC, 0xCB, 0xBA, - 0xAA, 0xAA, 0xAA, 0xAA, 0xBB, 0xCD, 0xEE, 0xEB, 0xCB, 0xBA, 0xA9, 0x99, - 0x99, 0x99, 0xAA, 0xAB, 0xCD, 0xDD, 0xBC, 0xBA, 0x99, 0x88, 0x88, 0x88, - 0x89, 0x9A, 0xAB, 0xCD, 0xCB, 0xBA, 0xA9, 0x88, 0x77, 0x77, 0x77, 0x88, - 0x9A, 0xBC, 0xCC, 0xBB, 0xA9, 0x98, 0x77, 0x66, 0x66, 0x77, 0x88, 0x9A, - 0xBC, 0xCB, 0xBA, 0x98, 0x77, 0x66, 0x65, 0x66, 0x77, 0x89, 0xAB, 0xBB, - 0xBB, 0xA9, 0x87, 0x66, 0x55, 0x55, 0x66, 0x78, 0x99, 0xAB, 0xBA, 0xBA, - 0x98, 0x76, 0x65, 0x54, 0x55, 0x67, 0x78, 0x9A, 0xBB, 0xBB, 0xA9, 0x87, - 0x66, 0x54, 0x45, 0x56, 0x77, 0x89, 0xAB, 0xBB, 0xBA, 0x98, 0x76, 0x65, - 0x55, 0x55, 0x67, 0x78, 0x9A, 0xBB, 0xBB, 0xA9, 0x87, 0x76, 0x65, 0x55, - 0x66, 0x78, 0x89, 0xAB, 0xBB, 0xBA, 0x99, 0x87, 0x76, 0x66, 0x66, 0x77, - 0x89, 0xAA, 0xBB, 0xCC, 0xBA, 0x98, 0x87, 0x77, 0x77, 0x77, 0x88, 0x9A, - 0xAB, 0xBC, 0xCB, 0xBA, 0x99, 0x88, 0x87, 0x78, 0x88, 0x9A, 0xAB, 0xCB, - 0xCD, 0xCB, 0xBA, 0x99, 0x98, 0x88, 0x99, 0x9A, 0xAB, 0xBC, 0xCD, 0xDD, - 0xCB, 0xBA, 0xAA, 0x99, 0x99, 0xAA, 0xAB, 0xBC, 0xDC, 0xDE, 0xDD, 0xCB, - 0xBB, 0xBA, 0xAA, 0xAA, 0xBB, 0xCC, 0xDD, 0xCE, 0xEE, 0xDD, 0xCC, 0xCB, - 0xBB, 0xBB, 0xBB, 0xCC, 0xDD, 0xEC, 0xBD, 0xDD, 0xCC, 0xCC, 0xBB, 0xBB, - 0xBB, 0xBB, 0xCC, 0xCC, 0xA0, 0x00, 0x00, 0x00, - ], - [ - 0x9B, 0xBA, 0xA9, 0x99, 0x99, 0x99, 0x9A, 0xAB, 0xBC, 0xCC, 0xBB, 0xCC, - 0xBB, 0xAA, 0xAA, 0x99, 0xA9, 0xAA, 0xBB, 0xBD, 0xDC, 0xAB, 0xBA, 0xA9, - 0x99, 0x99, 0x99, 0x99, 0x9A, 0xBB, 0xCD, 0xCA, 0xBA, 0xA9, 0x99, 0x88, - 0x88, 0x88, 0x89, 0x9A, 0xBB, 0xCB, 0xAB, 0xA9, 0x98, 0x88, 0x88, 0x77, - 0x88, 0x89, 0x9A, 0xBB, 0xB9, 0xA9, 0x98, 0x87, 0x77, 0x77, 0x77, 0x78, - 0x89, 0xAA, 0xBB, 0x9A, 0x98, 0x87, 0x77, 0x66, 0x66, 0x77, 0x78, 0x89, - 0xAA, 0xA9, 0xA9, 0x88, 0x77, 0x66, 0x66, 0x66, 0x67, 0x78, 0x99, 0xAA, - 0x99, 0x98, 0x77, 0x66, 0x66, 0x66, 0x66, 0x77, 0x88, 0x9A, 0xA9, 0x99, - 0x87, 0x76, 0x66, 0x55, 0x56, 0x67, 0x78, 0x89, 0xAA, 0x9A, 0x98, 0x77, - 0x66, 0x65, 0x55, 0x66, 0x77, 0x88, 0x9A, 0x99, 0xA9, 0x88, 0x76, 0x66, - 0x65, 0x66, 0x67, 0x78, 0x89, 0xA9, 0x99, 0x98, 0x87, 0x76, 0x66, 0x66, - 0x66, 0x77, 0x88, 0x9A, 0x9A, 0xA9, 0x98, 0x77, 0x66, 0x66, 0x66, 0x77, - 0x88, 0x99, 0xAA, 0xAA, 0xA9, 0x88, 0x77, 0x77, 0x77, 0x77, 0x78, 0x89, - 0xAA, 0xAA, 0xBA, 0x99, 0x88, 0x77, 0x77, 0x77, 0x88, 0x89, 0x9A, 0xAA, - 0xBB, 0xBA, 0x99, 0x88, 0x88, 0x88, 0x88, 0x89, 0x9A, 0xAB, 0xBB, 0xCB, - 0xAA, 0xA9, 0x98, 0x88, 0x89, 0x99, 0x9A, 0xAB, 0xBB, 0xCC, 0xBB, 0xAA, - 0xA9, 0x99, 0x99, 0x99, 0x9A, 0xAB, 0xBC, 0xBD, 0xDD, 0xCB, 0xBB, 0xAA, - 0xAA, 0xAA, 0xAA, 0xBB, 0xBC, 0xDB, 0xBD, 0xCB, 0xBA, 0xAA, 0xAA, 0xAA, - 0xAA, 0xAA, 0xAB, 0xBB, 0xA0, 0x00, 0x00, 0x00, - ], - [ - 0x9B, 0xAA, 0xA9, 0x99, 0x99, 0x99, 0x9A, 0xAA, 0xBB, 0xCC, 0xBB, 0xCB, - 0xBA, 0xAA, 0xA9, 0x99, 0x9A, 0xAA, 0xAB, 0xCC, 0xDC, 0xAB, 0xAA, 0xA9, - 0x99, 0x99, 0x99, 0x99, 0x9A, 0xAB, 0xBC, 0xCA, 0xBA, 0x99, 0x98, 0x88, - 0x88, 0x88, 0x89, 0x9A, 0xAB, 0xCB, 0xAA, 0xA9, 0x88, 0x88, 0x77, 0x77, - 0x78, 0x89, 0x9A, 0xAB, 0xB9, 0xA9, 0x98, 0x87, 0x77, 0x77, 0x77, 0x78, - 0x89, 0x9A, 0xBA, 0x9A, 0x98, 0x87, 0x77, 0x66, 0x66, 0x77, 0x78, 0x89, - 0xAA, 0xA9, 0x99, 0x87, 0x77, 0x66, 0x66, 0x66, 0x67, 0x78, 0x89, 0xAA, - 0x99, 0x98, 0x77, 0x66, 0x66, 0x66, 0x66, 0x77, 0x88, 0x9A, 0xA9, 0x99, - 0x87, 0x76, 0x66, 0x66, 0x66, 0x66, 0x78, 0x89, 0xAA, 0x99, 0x98, 0x77, - 0x66, 0x65, 0x56, 0x66, 0x67, 0x88, 0x9A, 0x99, 0x99, 0x87, 0x76, 0x66, - 0x66, 0x66, 0x67, 0x78, 0x89, 0xA9, 0x9A, 0x98, 0x77, 0x76, 0x66, 0x66, - 0x66, 0x77, 0x88, 0x9A, 0xAA, 0xA9, 0x88, 0x77, 0x76, 0x66, 0x66, 0x77, - 0x78, 0x89, 0xAA, 0xAA, 0x99, 0x88, 0x77, 0x77, 0x67, 0x77, 0x78, 0x89, - 0x9A, 0xAA, 0xAA, 0x99, 0x88, 0x77, 0x77, 0x77, 0x78, 0x89, 0x9A, 0xAA, - 0xBB, 0xAA, 0x99, 0x88, 0x88, 0x88, 0x88, 0x88, 0x99, 0xAB, 0xAB, 0xBB, - 0xAA, 0x99, 0x98, 0x88, 0x88, 0x99, 0x99, 0xAA, 0xBB, 0xCC, 0xCB, 0xBA, - 0xA9, 0x99, 0x99, 0x99, 0x9A, 0xAB, 0xBB, 0xBD, 0xDC, 0xCB, 0xBB, 0xAA, - 0xAA, 0xAA, 0xAA, 0xBB, 0xBC, 0xCB, 0xCD, 0xCB, 0xBB, 0xAA, 0xAA, 0x99, - 0xAA, 0xAA, 0xAB, 0xBB, 0xA0, 0x00, 0x00, 0x00, - ], - [ - 0x9B, 0xBA, 0xAA, 0xA9, 0xAA, 0xAA, 0xAB, 0xBB, 0xBC, 0xCD, 0xAB, 0xCC, - 0xBB, 0xBB, 0xAA, 0xAA, 0xBA, 0xBC, 0xCD, 0xED, 0xEC, 0xBC, 0xBB, 0xBA, - 0xA9, 0xA9, 0xA9, 0xAA, 0xAB, 0xBC, 0xDE, 0xDB, 0xBB, 0xBA, 0x99, 0x99, - 0x99, 0x99, 0x9A, 0xAB, 0xBC, 0xDC, 0xAB, 0xAA, 0x99, 0x88, 0x88, 0x88, - 0x88, 0x99, 0xAB, 0xCC, 0xBA, 0xBA, 0x99, 0x88, 0x87, 0x77, 0x77, 0x78, - 0x89, 0xAB, 0xCC, 0xAA, 0xA9, 0x88, 0x77, 0x66, 0x66, 0x77, 0x78, 0x9A, - 0xBB, 0xBA, 0xAA, 0x98, 0x77, 0x66, 0x66, 0x66, 0x67, 0x89, 0x9A, 0xBA, - 0xAA, 0x99, 0x87, 0x66, 0x55, 0x55, 0x66, 0x77, 0x89, 0xAB, 0xAA, 0xAA, - 0x98, 0x76, 0x65, 0x55, 0x55, 0x67, 0x78, 0x9A, 0xBA, 0xAA, 0x99, 0x87, - 0x66, 0x55, 0x55, 0x56, 0x67, 0x89, 0xAA, 0xBA, 0xA9, 0x98, 0x76, 0x65, - 0x55, 0x56, 0x67, 0x78, 0x9A, 0xBA, 0xAB, 0xA9, 0x87, 0x76, 0x65, 0x55, - 0x66, 0x78, 0x89, 0xAA, 0xAB, 0xBA, 0x98, 0x87, 0x66, 0x66, 0x66, 0x77, - 0x89, 0x9A, 0xAA, 0xBB, 0xA9, 0x98, 0x87, 0x77, 0x67, 0x77, 0x88, 0x9A, - 0xAB, 0xAC, 0xCB, 0xAA, 0x98, 0x87, 0x77, 0x78, 0x89, 0x99, 0xAA, 0xBA, - 0xCC, 0xCB, 0xA9, 0x99, 0x88, 0x88, 0x89, 0x99, 0xAA, 0xBB, 0xAC, 0xCC, - 0xBB, 0xAA, 0x99, 0x99, 0x99, 0x9A, 0xAB, 0xBB, 0xCB, 0xCE, 0xDC, 0xCB, - 0xBA, 0xAA, 0xAA, 0xAA, 0xAA, 0xBB, 0xCC, 0xBE, 0xED, 0xDC, 0xCC, 0xBB, - 0xBB, 0xBB, 0xAA, 0xBC, 0xCC, 0xDB, 0xAD, 0xDD, 0xBB, 0xBB, 0xBB, 0xBA, - 0xAA, 0xBB, 0xBB, 0xBC, 0x90, 0x00, 0x00, 0x00, - ], - [ - 0x9B, 0xBB, 0xAA, 0xAA, 0xAA, 0xAA, 0xBB, 0xBC, 0xCD, 0xCD, 0xAB, 0xCC, - 0xCB, 0xBB, 0xAA, 0xAA, 0xBB, 0xBC, 0xCD, 0xDE, 0xFD, 0xBC, 0xBB, 0xAA, - 0xAA, 0x9A, 0xAA, 0xAA, 0xBB, 0xCD, 0xDE, 0xDB, 0xBB, 0xAA, 0x99, 0x99, - 0x89, 0x99, 0x9A, 0xAB, 0xCD, 0xDC, 0xBB, 0xAA, 0x99, 0x88, 0x88, 0x88, - 0x89, 0x9A, 0xBB, 0xCC, 0xCA, 0xBA, 0x99, 0x88, 0x77, 0x77, 0x77, 0x88, - 0x9A, 0xBB, 0xCC, 0xAB, 0xA9, 0x88, 0x77, 0x66, 0x66, 0x77, 0x88, 0x9A, - 0xBC, 0xCA, 0xAA, 0x98, 0x77, 0x66, 0x65, 0x66, 0x67, 0x89, 0xAA, 0xCB, - 0xAA, 0x99, 0x87, 0x66, 0x55, 0x55, 0x66, 0x77, 0x89, 0xAB, 0xBA, 0xAA, - 0x98, 0x76, 0x65, 0x55, 0x55, 0x67, 0x78, 0x9A, 0xBB, 0xAA, 0xA9, 0x87, - 0x66, 0x55, 0x45, 0x56, 0x67, 0x89, 0xAB, 0xBB, 0xBA, 0x98, 0x76, 0x65, - 0x55, 0x55, 0x67, 0x78, 0x9A, 0xBB, 0xBB, 0xA9, 0x87, 0x76, 0x65, 0x55, - 0x66, 0x78, 0x89, 0xAB, 0xBB, 0xBA, 0x99, 0x87, 0x76, 0x66, 0x66, 0x77, - 0x89, 0x9A, 0xBB, 0xBC, 0xBA, 0x98, 0x87, 0x77, 0x77, 0x77, 0x88, 0x9A, - 0xAB, 0xBC, 0xCB, 0xBA, 0x99, 0x88, 0x77, 0x78, 0x88, 0x99, 0xAB, 0xBB, - 0xCD, 0xCB, 0xAA, 0x99, 0x98, 0x88, 0x89, 0x99, 0xAA, 0xBB, 0xBD, 0xED, - 0xCB, 0xBA, 0xA9, 0x99, 0x99, 0xAA, 0xAA, 0xBC, 0xCB, 0xDE, 0xED, 0xCC, - 0xBB, 0xAA, 0xAA, 0xAA, 0xBB, 0xBB, 0xCD, 0xBD, 0xFE, 0xED, 0xCC, 0xCC, - 0xBB, 0xBB, 0xBB, 0xBC, 0xCC, 0xDB, 0xAD, 0xDD, 0xCC, 0xCC, 0xBB, 0xBB, - 0xAB, 0xBB, 0xBB, 0xBC, 0x90, 0x00, 0x00, 0x00, - ], - [ - 0xAF, 0xDF, 0xDF, 0xFD, 0xDD, 0xCD, 0xDF, 0xFD, 0xFF, 0xDD, 0x9F, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xDF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xDF, 0xDF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xDF, 0xDF, 0xCD, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, 0xDF, 0xCC, 0xCD, 0xFD, 0xFF, 0xFF, - 0xFF, 0xFD, 0xFF, 0xFF, 0xFD, 0xBA, 0x88, 0xAC, 0xDF, 0xFD, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xCA, 0x74, 0x46, 0x9C, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xDF, 0xFC, 0x85, 0x22, 0x47, 0xDF, 0xFF, 0xFF, 0xFD, 0xFF, 0xFF, 0xFF, - 0xD8, 0x42, 0x13, 0x7B, 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xDC, 0xA6, - 0x43, 0x58, 0xCF, 0xFD, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, 0xA8, 0x78, - 0xAB, 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xDB, 0xBC, 0xDF, - 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xFF, 0xDD, 0xFD, 0xDF, 0xDF, - 0xFF, 0xFD, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xDF, 0xFF, 0xFF, 0xFD, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xAF, 0xFF, 0xFF, 0xFF, 0xFD, 0xDF, - 0xDD, 0xFD, 0xFF, 0xDD, 0xA0, 0x00, 0x00, 0x00, - ], - [ - 0xDF, 0xFF, 0xFD, 0xDD, 0xCD, 0xDE, 0xDD, 0xFF, 0xFF, 0xFF, 0xCF, 0xFF, - 0xFF, 0xED, 0xDC, 0xCC, 0xCD, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0xEE, 0xDD, - 0xBB, 0xBA, 0xBB, 0xBD, 0xDD, 0xFF, 0xFF, 0xFF, 0xFD, 0xCC, 0xBA, 0xAA, - 0x99, 0xAA, 0xBB, 0xCE, 0xFF, 0xFF, 0xFF, 0xEC, 0xBA, 0x99, 0x88, 0x89, - 0x9A, 0xAB, 0xCE, 0xFF, 0xFE, 0xFC, 0xCA, 0x98, 0x87, 0x77, 0x78, 0x99, - 0xAB, 0xDD, 0xFF, 0xDD, 0xBB, 0x98, 0x77, 0x66, 0x66, 0x77, 0x99, 0xBC, - 0xDF, 0xED, 0xCB, 0xA9, 0x87, 0x66, 0x55, 0x56, 0x78, 0x9A, 0xBC, 0xFF, - 0xFC, 0xB9, 0x87, 0x65, 0x55, 0x55, 0x56, 0x78, 0xAB, 0xCF, 0xFC, 0xDB, - 0xA8, 0x76, 0x55, 0x44, 0x45, 0x67, 0x8A, 0xBC, 0xED, 0xDC, 0xCA, 0x87, - 0x65, 0x54, 0x45, 0x56, 0x78, 0x9B, 0xCE, 0xFE, 0xDB, 0xA9, 0x76, 0x55, - 0x44, 0x55, 0x67, 0x89, 0xBC, 0xDD, 0xDC, 0xCA, 0x98, 0x76, 0x55, 0x55, - 0x66, 0x78, 0xAB, 0xCF, 0xED, 0xFD, 0xBA, 0x87, 0x76, 0x66, 0x66, 0x78, - 0x9A, 0xBE, 0xEF, 0xDF, 0xCB, 0xA9, 0x88, 0x77, 0x77, 0x78, 0x9A, 0xBC, - 0xCF, 0xFE, 0xFF, 0xDC, 0xA9, 0x98, 0x88, 0x88, 0x9A, 0xBC, 0xDF, 0xEF, - 0xFF, 0xFE, 0xCB, 0xBA, 0x99, 0x9A, 0xAA, 0xBC, 0xCD, 0xFF, 0xFF, 0xFF, - 0xFD, 0xCD, 0xCB, 0xBB, 0xBB, 0xBC, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, - 0xED, 0xDC, 0xDC, 0xDD, 0xCF, 0xFF, 0xFF, 0xFE, 0xFF, 0xFF, 0xDF, 0xEF, - 0xDD, 0xEE, 0xFF, 0xDE, 0xFF, 0xFF, 0xBF, 0xFF, 0xFD, 0xFF, 0xFE, 0xED, - 0xFE, 0xFF, 0xFF, 0xFF, 0xC0, 0x00, 0x00, 0x00, - ], - [ - 0xDF, 0xEE, 0xED, 0xDD, 0xCC, 0xCC, 0xDD, 0xEE, 0xEF, 0xFF, 0xDE, 0xFF, - 0xED, 0xCC, 0xCC, 0xBC, 0xCC, 0xDD, 0xEE, 0xFF, 0xFF, 0xEF, 0xED, 0xCC, - 0xBB, 0xAA, 0xAA, 0xBB, 0xCD, 0xDE, 0xFF, 0xFE, 0xFD, 0xCB, 0xAA, 0xA9, - 0x99, 0x99, 0xAB, 0xBC, 0xEF, 0xFF, 0xDD, 0xCB, 0xAA, 0x98, 0x88, 0x88, - 0x89, 0xAA, 0xBC, 0xEF, 0xFD, 0xDB, 0xA9, 0x98, 0x77, 0x77, 0x77, 0x89, - 0x9B, 0xCD, 0xEE, 0xDD, 0xBA, 0x98, 0x77, 0x66, 0x66, 0x67, 0x89, 0xAB, - 0xCE, 0xEC, 0xCB, 0x98, 0x77, 0x66, 0x55, 0x56, 0x67, 0x89, 0xBC, 0xDE, - 0xCC, 0xA9, 0x87, 0x66, 0x55, 0x55, 0x56, 0x78, 0x9A, 0xCD, 0xDC, 0xBA, - 0x98, 0x76, 0x55, 0x54, 0x55, 0x67, 0x89, 0xAB, 0xCD, 0xCB, 0xA9, 0x87, - 0x65, 0x54, 0x45, 0x56, 0x77, 0x9A, 0xBD, 0xDC, 0xCA, 0x98, 0x76, 0x55, - 0x55, 0x55, 0x67, 0x89, 0xAB, 0xDD, 0xDC, 0xB9, 0x87, 0x66, 0x55, 0x55, - 0x66, 0x78, 0x9A, 0xCD, 0xDD, 0xCB, 0xA9, 0x87, 0x66, 0x66, 0x66, 0x78, - 0x9A, 0xBC, 0xED, 0xED, 0xCB, 0x99, 0x87, 0x77, 0x77, 0x78, 0x89, 0xAB, - 0xCD, 0xDE, 0xEC, 0xBA, 0x99, 0x88, 0x87, 0x88, 0x89, 0xAB, 0xCD, 0xEF, - 0xFF, 0xDD, 0xBB, 0xA9, 0x99, 0x99, 0x99, 0xAB, 0xCC, 0xEF, 0xFF, 0xFF, - 0xDC, 0xCB, 0xBA, 0xAA, 0xAA, 0xBB, 0xCD, 0xEF, 0xFF, 0xFF, 0xFF, 0xED, - 0xCC, 0xBB, 0xBB, 0xBC, 0xDC, 0xDE, 0xFF, 0xEF, 0xFF, 0xFF, 0xEE, 0xED, - 0xDC, 0xDD, 0xED, 0xEF, 0xFF, 0xFF, 0xDF, 0xFF, 0xFE, 0xED, 0xDD, 0xDD, - 0xDD, 0xDD, 0xEF, 0xFF, 0xD0, 0x00, 0x00, 0x00, - ], - [ - 0xCD, 0xCD, 0xDC, 0xCC, 0xCD, 0xDE, 0xDD, 0xFF, 0xFF, 0xFF, 0xDD, 0xFE, - 0xDC, 0xCC, 0xCB, 0xCC, 0xCD, 0xDD, 0xFF, 0xFF, 0xFF, 0xDF, 0xDD, 0xCB, - 0xBB, 0xBA, 0xBB, 0xBC, 0xCD, 0xEF, 0xEF, 0xFD, 0xFC, 0xCB, 0xA9, 0xA9, - 0x99, 0x9A, 0xAB, 0xCD, 0xDF, 0xFE, 0xCE, 0xCB, 0xA9, 0x98, 0x88, 0x88, - 0x99, 0xAB, 0xCD, 0xEF, 0xFC, 0xCB, 0xAA, 0x98, 0x77, 0x77, 0x77, 0x89, - 0xAB, 0xCE, 0xFE, 0xCC, 0xBA, 0x98, 0x77, 0x66, 0x66, 0x77, 0x89, 0xAC, - 0xDE, 0xEC, 0xCA, 0x98, 0x77, 0x65, 0x55, 0x56, 0x77, 0x9A, 0xBC, 0xDD, - 0xCC, 0xA9, 0x87, 0x65, 0x55, 0x55, 0x56, 0x78, 0x9A, 0xCD, 0xEC, 0xBA, - 0x98, 0x76, 0x55, 0x44, 0x55, 0x67, 0x89, 0xAB, 0xDD, 0xCC, 0xB9, 0x87, - 0x65, 0x54, 0x45, 0x56, 0x78, 0x9A, 0xBD, 0xDC, 0xCB, 0x98, 0x76, 0x55, - 0x55, 0x55, 0x67, 0x89, 0xAB, 0xDD, 0xDC, 0xBA, 0x98, 0x76, 0x55, 0x55, - 0x66, 0x78, 0x9A, 0xCD, 0xDD, 0xDC, 0xB9, 0x87, 0x76, 0x66, 0x66, 0x78, - 0x99, 0xBB, 0xDF, 0xDE, 0xCB, 0xA9, 0x88, 0x77, 0x77, 0x78, 0x89, 0xAB, - 0xCD, 0xDD, 0xED, 0xBB, 0xA9, 0x98, 0x88, 0x88, 0x89, 0xAA, 0xBD, 0xDD, - 0xFF, 0xED, 0xCB, 0xAA, 0x99, 0x99, 0x9A, 0xAB, 0xBC, 0xDE, 0xEF, 0xFF, - 0xFD, 0xCC, 0xBA, 0xAA, 0xAA, 0xAB, 0xBC, 0xDD, 0xEE, 0xFF, 0xFF, 0xED, - 0xDC, 0xCB, 0xBC, 0xCB, 0xCD, 0xCD, 0xFF, 0xEF, 0xFF, 0xFF, 0xFF, 0xDD, - 0xEC, 0xDC, 0xCC, 0xEF, 0xEF, 0xFF, 0xCF, 0xFF, 0xFF, 0xFD, 0xED, 0xDD, - 0xDC, 0xDD, 0xDD, 0xDF, 0xD0, 0x00, 0x00, 0x00, - ], - [ - 0xBF, 0xEE, 0xED, 0xEF, 0xED, 0xEE, 0xFE, 0xEF, 0xFE, 0xFF, 0xAE, 0xFF, - 0xFE, 0xEE, 0xEE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, 0xDD, - 0xDD, 0xDD, 0xDD, 0xEE, 0xFF, 0xFF, 0xFF, 0xFE, 0xFE, 0xED, 0xCC, 0xCB, - 0xBB, 0xCC, 0xDE, 0xEF, 0xFF, 0xFF, 0xFF, 0xDD, 0xCB, 0xAA, 0xAA, 0xAA, - 0xBB, 0xCD, 0xEF, 0xFF, 0xFE, 0xFE, 0xCB, 0xA9, 0x98, 0x88, 0x89, 0xAB, - 0xCD, 0xFF, 0xFF, 0xEE, 0xDC, 0xA9, 0x88, 0x77, 0x77, 0x89, 0xAB, 0xDE, - 0xFF, 0xFF, 0xFD, 0xBA, 0x97, 0x76, 0x55, 0x66, 0x89, 0xAC, 0xDF, 0xFE, - 0xEE, 0xDB, 0xA8, 0x76, 0x54, 0x45, 0x67, 0x8A, 0xBD, 0xFF, 0xEE, 0xED, - 0xBA, 0x87, 0x54, 0x33, 0x45, 0x68, 0x9B, 0xDF, 0xFE, 0xFF, 0xDB, 0xA8, - 0x75, 0x43, 0x34, 0x56, 0x89, 0xBC, 0xEF, 0xEE, 0xFD, 0xCA, 0x87, 0x65, - 0x44, 0x45, 0x68, 0x9B, 0xCE, 0xFF, 0xFF, 0xEC, 0xB9, 0x86, 0x65, 0x55, - 0x67, 0x8A, 0xBD, 0xEF, 0xFF, 0xFF, 0xDC, 0xA9, 0x87, 0x66, 0x77, 0x89, - 0xAB, 0xCF, 0xFF, 0xFF, 0xFE, 0xCB, 0xA9, 0x88, 0x88, 0x89, 0xAB, 0xCD, - 0xEF, 0xFF, 0xFF, 0xFE, 0xCB, 0xAA, 0x99, 0x9A, 0xAA, 0xBC, 0xDE, 0xFF, - 0xFF, 0xFF, 0xFE, 0xDC, 0xBB, 0xBB, 0xBB, 0xCC, 0xDE, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xED, 0xDD, 0xCD, 0xDD, 0xDE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xEF, 0xEF, 0xEF, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xEF, 0xFF, 0xC0, 0x00, 0x00, 0x00, - ], - [ - 0xAE, 0xDD, 0xED, 0xDD, 0xDD, 0xDD, 0xDD, 0xFE, 0xEE, 0xFF, 0xBD, 0xFF, - 0xEE, 0xED, 0xED, 0xEE, 0xEF, 0xFE, 0xFF, 0xFF, 0xFE, 0xEE, 0xED, 0xDD, - 0xCC, 0xCC, 0xDD, 0xDE, 0xEE, 0xFF, 0xFF, 0xEE, 0xEE, 0xDC, 0xCB, 0xBB, - 0xBB, 0xBC, 0xDD, 0xEE, 0xFF, 0xFE, 0xDE, 0xDC, 0xBB, 0xAA, 0x99, 0xAA, - 0xBB, 0xCD, 0xEF, 0xFF, 0xED, 0xDD, 0xCB, 0xA9, 0x98, 0x88, 0x89, 0xAB, - 0xCD, 0xEF, 0xFE, 0xDD, 0xDB, 0xA9, 0x87, 0x77, 0x77, 0x89, 0xAB, 0xCE, - 0xFF, 0xED, 0xDC, 0xBA, 0x97, 0x76, 0x55, 0x67, 0x89, 0xAC, 0xDE, 0xFE, - 0xDD, 0xCB, 0xA8, 0x76, 0x54, 0x45, 0x67, 0x8A, 0xBC, 0xEF, 0xDD, 0xDC, - 0xB9, 0x87, 0x54, 0x33, 0x45, 0x68, 0x9B, 0xCD, 0xEE, 0xDE, 0xCB, 0xA8, - 0x75, 0x43, 0x34, 0x56, 0x89, 0xBC, 0xDF, 0xDD, 0xED, 0xBA, 0x97, 0x65, - 0x44, 0x45, 0x78, 0x9A, 0xCD, 0xEE, 0xDE, 0xDC, 0xB9, 0x87, 0x65, 0x55, - 0x67, 0x89, 0xBC, 0xDE, 0xDD, 0xEE, 0xDB, 0xA9, 0x87, 0x66, 0x77, 0x89, - 0xAB, 0xCD, 0xFD, 0xDE, 0xED, 0xCB, 0xA9, 0x88, 0x88, 0x89, 0x9A, 0xBC, - 0xDF, 0xDD, 0xFE, 0xED, 0xCB, 0xAA, 0x99, 0x99, 0xAA, 0xBC, 0xDE, 0xFE, - 0xDF, 0xFF, 0xED, 0xCC, 0xBB, 0xAB, 0xBB, 0xBC, 0xDE, 0xEF, 0xDD, 0xFF, - 0xFF, 0xEE, 0xDC, 0xCC, 0xCC, 0xCD, 0xDD, 0xEE, 0xFE, 0xDF, 0xFF, 0xFF, - 0xEE, 0xED, 0xDD, 0xDD, 0xDD, 0xDE, 0xFE, 0xED, 0xFF, 0xFF, 0xFF, 0xEF, - 0xEE, 0xEE, 0xFE, 0xFF, 0xFF, 0xFE, 0x9D, 0xEE, 0xDD, 0xDE, 0xDD, 0xDD, - 0xDD, 0xDD, 0xFE, 0xED, 0xB0, 0x00, 0x00, 0x00, - ], - [ - 0xAB, 0xAA, 0xA9, 0x99, 0x99, 0x99, 0x99, 0x9A, 0xAB, 0xCC, 0xBB, 0xCB, - 0xBA, 0xA9, 0x99, 0x99, 0x99, 0xAA, 0xAB, 0xBC, 0xDC, 0xAB, 0xBA, 0xA9, - 0x99, 0x88, 0x99, 0x99, 0x9A, 0xAB, 0xCC, 0xCA, 0xBA, 0xA9, 0x98, 0x88, - 0x88, 0x88, 0x89, 0x9A, 0xAB, 0xBB, 0xAA, 0xA9, 0x98, 0x87, 0x77, 0x77, - 0x88, 0x89, 0x99, 0xAB, 0xBA, 0xA9, 0x98, 0x87, 0x77, 0x77, 0x77, 0x78, - 0x89, 0x9A, 0xAA, 0x9A, 0x98, 0x87, 0x77, 0x66, 0x66, 0x77, 0x78, 0x89, - 0xAA, 0xA9, 0x99, 0x87, 0x77, 0x66, 0x66, 0x66, 0x67, 0x78, 0x99, 0xAA, - 0x99, 0x98, 0x77, 0x66, 0x66, 0x66, 0x66, 0x77, 0x88, 0x9A, 0xA9, 0x98, - 0x87, 0x76, 0x66, 0x55, 0x66, 0x67, 0x78, 0x89, 0xA9, 0x99, 0x98, 0x77, - 0x66, 0x65, 0x56, 0x66, 0x77, 0x88, 0x9A, 0x99, 0x99, 0x87, 0x76, 0x66, - 0x65, 0x66, 0x67, 0x78, 0x89, 0xAA, 0x99, 0x98, 0x87, 0x76, 0x66, 0x66, - 0x66, 0x77, 0x89, 0x9A, 0xA9, 0xA9, 0x88, 0x77, 0x76, 0x66, 0x67, 0x77, - 0x88, 0x9A, 0xAA, 0xAA, 0x99, 0x88, 0x77, 0x77, 0x77, 0x77, 0x78, 0x89, - 0xAA, 0xAA, 0xA9, 0x99, 0x88, 0x77, 0x77, 0x77, 0x88, 0x89, 0x9A, 0xBA, - 0xAB, 0xAA, 0x99, 0x88, 0x88, 0x88, 0x88, 0x99, 0x9A, 0xAB, 0xAB, 0xCB, - 0xA9, 0x99, 0x98, 0x88, 0x89, 0x99, 0xAA, 0xAB, 0xCB, 0xBC, 0xBA, 0xAA, - 0xA9, 0x99, 0x99, 0x99, 0xAA, 0xBB, 0xCC, 0xBC, 0xCC, 0xCB, 0xBA, 0xAA, - 0xAA, 0xAA, 0xAB, 0xBB, 0xCC, 0xDC, 0xAC, 0xBB, 0xBA, 0xAA, 0x99, 0x99, - 0xAA, 0xAA, 0xAB, 0xCC, 0xA0, 0x00, 0x00, 0x00, - ], - [ - 0x9B, 0xAA, 0xA9, 0x99, 0x99, 0x99, 0x99, 0x9A, 0xAB, 0xBC, 0xAB, 0xCB, - 0xBA, 0xAA, 0x99, 0x99, 0x99, 0xAA, 0xAB, 0xBB, 0xCC, 0xAB, 0xBA, 0xA9, - 0x99, 0x88, 0x89, 0x99, 0x9A, 0xAB, 0xBC, 0xBA, 0xBA, 0xA9, 0x98, 0x88, - 0x88, 0x88, 0x89, 0x99, 0xAB, 0xBB, 0xAA, 0xA9, 0x98, 0x88, 0x77, 0x77, - 0x78, 0x89, 0x99, 0xAB, 0xA9, 0xA9, 0x98, 0x87, 0x77, 0x77, 0x77, 0x78, - 0x89, 0x9A, 0xBA, 0x9A, 0x98, 0x87, 0x77, 0x66, 0x66, 0x77, 0x78, 0x89, - 0x9A, 0xA9, 0xA9, 0x88, 0x77, 0x66, 0x66, 0x66, 0x67, 0x78, 0x89, 0xAA, - 0x99, 0x98, 0x77, 0x66, 0x66, 0x66, 0x66, 0x77, 0x88, 0x9A, 0xA9, 0x98, - 0x87, 0x76, 0x66, 0x56, 0x66, 0x67, 0x78, 0x89, 0xA9, 0x99, 0x88, 0x77, - 0x66, 0x65, 0x56, 0x66, 0x77, 0x88, 0x9A, 0x99, 0x98, 0x87, 0x76, 0x66, - 0x66, 0x66, 0x67, 0x78, 0x89, 0xA9, 0x99, 0x98, 0x77, 0x76, 0x66, 0x66, - 0x66, 0x77, 0x89, 0x9A, 0xA9, 0xA9, 0x88, 0x77, 0x66, 0x66, 0x66, 0x77, - 0x88, 0x99, 0xAA, 0x9A, 0x99, 0x88, 0x77, 0x77, 0x77, 0x77, 0x88, 0x89, - 0xAA, 0xAA, 0xAA, 0x98, 0x88, 0x77, 0x77, 0x77, 0x88, 0x89, 0x9A, 0xBA, - 0xAB, 0xA9, 0x99, 0x88, 0x88, 0x88, 0x88, 0x89, 0x9A, 0xAB, 0xAB, 0xBB, - 0xAA, 0x99, 0x98, 0x88, 0x88, 0x99, 0x9A, 0xAB, 0xCB, 0xBC, 0xBB, 0xAA, - 0xA9, 0x99, 0x99, 0x9A, 0xAA, 0xAB, 0xBC, 0xBC, 0xDC, 0xBB, 0xBA, 0xAA, - 0xAA, 0xAA, 0xAA, 0xBB, 0xCC, 0xDC, 0xAC, 0xBB, 0xBA, 0xAA, 0xA9, 0x99, - 0xAA, 0xAA, 0xAB, 0xBC, 0xA0, 0x00, 0x00, 0x00, - ], - [ - 0xAB, 0xBA, 0xA9, 0x99, 0x99, 0x99, 0x99, 0xAA, 0xBB, 0xBD, 0xAB, 0xCB, - 0xBA, 0xAA, 0x99, 0x99, 0x9A, 0xAA, 0xBB, 0xBC, 0xDC, 0xBC, 0xBA, 0xA9, - 0x99, 0x89, 0x88, 0x99, 0x9A, 0xAB, 0xCD, 0xBA, 0xBA, 0xA9, 0x98, 0x88, - 0x88, 0x88, 0x89, 0x9A, 0xBB, 0xBC, 0xAB, 0xA9, 0x98, 0x87, 0x77, 0x77, - 0x78, 0x89, 0x9A, 0xBC, 0xB9, 0xA9, 0x98, 0x87, 0x77, 0x77, 0x77, 0x78, - 0x89, 0x9A, 0xBA, 0x9A, 0x99, 0x87, 0x77, 0x66, 0x66, 0x77, 0x78, 0x89, - 0xAB, 0xA9, 0x99, 0x87, 0x77, 0x66, 0x66, 0x66, 0x67, 0x78, 0x9A, 0xAA, - 0x99, 0x98, 0x77, 0x66, 0x66, 0x66, 0x66, 0x77, 0x88, 0x9A, 0xA9, 0x98, - 0x87, 0x76, 0x66, 0x65, 0x66, 0x66, 0x78, 0x89, 0xAA, 0x99, 0x98, 0x77, - 0x66, 0x65, 0x56, 0x66, 0x67, 0x88, 0x9A, 0x99, 0x99, 0x87, 0x76, 0x66, - 0x66, 0x66, 0x67, 0x78, 0x89, 0xAA, 0x9A, 0x98, 0x87, 0x66, 0x66, 0x66, - 0x66, 0x77, 0x88, 0x9A, 0xA9, 0xA9, 0x88, 0x77, 0x66, 0x66, 0x66, 0x77, - 0x88, 0x99, 0xAA, 0x9A, 0x99, 0x88, 0x77, 0x77, 0x77, 0x77, 0x78, 0x89, - 0xAA, 0xAA, 0xAA, 0x99, 0x88, 0x77, 0x77, 0x77, 0x88, 0x89, 0x9A, 0xBA, - 0xAB, 0xAA, 0x99, 0x88, 0x88, 0x88, 0x88, 0x99, 0x9A, 0xBB, 0xBB, 0xCB, - 0xAA, 0x99, 0x98, 0x88, 0x88, 0x99, 0xAA, 0xBB, 0xCB, 0xCC, 0xCB, 0xAA, - 0x99, 0x99, 0x99, 0x99, 0xAA, 0xBB, 0xCC, 0xBC, 0xDC, 0xBC, 0xBA, 0xAA, - 0xAA, 0xAA, 0xAB, 0xBB, 0xCC, 0xDC, 0xAD, 0xCB, 0xBA, 0xAA, 0xAA, 0x9A, - 0xAA, 0xAA, 0xBB, 0xCC, 0xA0, 0x00, 0x00, 0x00, - ], - [ - 0xAC, 0xCC, 0xCC, 0xBC, 0xCB, 0xCB, 0xCC, 0xCC, 0xCD, 0xDD, 0x9C, 0xED, - 0xCD, 0xCC, 0xCB, 0xCC, 0xCC, 0xCD, 0xEE, 0xEF, 0xFD, 0xCD, 0xCC, 0xCB, - 0xBB, 0xBB, 0xBB, 0xBC, 0xCD, 0xDE, 0xEF, 0xDC, 0xCC, 0xBA, 0xAA, 0x99, - 0x9A, 0xAA, 0xBB, 0xBC, 0xDE, 0xFD, 0xCD, 0xBB, 0xA9, 0x98, 0x88, 0x89, - 0x9A, 0xAB, 0xCC, 0xEE, 0xDC, 0xCB, 0xA9, 0x98, 0x87, 0x77, 0x88, 0x99, - 0xAB, 0xCD, 0xED, 0xBC, 0xBA, 0x98, 0x77, 0x66, 0x67, 0x78, 0x89, 0xBB, - 0xCE, 0xDC, 0xCB, 0xA8, 0x87, 0x66, 0x55, 0x66, 0x78, 0x9A, 0xBC, 0xDC, - 0xBC, 0xBA, 0x87, 0x66, 0x55, 0x45, 0x66, 0x78, 0x9A, 0xCD, 0xCC, 0xCB, - 0xA8, 0x76, 0x55, 0x44, 0x45, 0x67, 0x89, 0xAC, 0xCC, 0xCC, 0xBA, 0x87, - 0x65, 0x54, 0x44, 0x56, 0x78, 0x9A, 0xBD, 0xCC, 0xCB, 0xA9, 0x87, 0x65, - 0x44, 0x55, 0x67, 0x89, 0xAB, 0xDC, 0xCC, 0xBA, 0x98, 0x76, 0x65, 0x55, - 0x66, 0x78, 0x9A, 0xBD, 0xCD, 0xCC, 0xAA, 0x98, 0x76, 0x66, 0x66, 0x78, - 0x9A, 0xBC, 0xDC, 0xDD, 0xCB, 0xA9, 0x98, 0x87, 0x77, 0x78, 0x89, 0xAB, - 0xCD, 0xDD, 0xED, 0xCB, 0xAA, 0x99, 0x88, 0x88, 0x99, 0xAA, 0xBC, 0xDC, - 0xDE, 0xDD, 0xCB, 0xBA, 0xA9, 0x99, 0x99, 0xAA, 0xBC, 0xDD, 0xDD, 0xEE, - 0xDD, 0xCC, 0xBB, 0xAA, 0xAA, 0xAB, 0xBC, 0xCD, 0xDD, 0xDF, 0xFE, 0xEE, - 0xDC, 0xCC, 0xCB, 0xCC, 0xCC, 0xCD, 0xDE, 0xDE, 0xFF, 0xFF, 0xEE, 0xDD, - 0xDC, 0xCD, 0xDD, 0xDD, 0xED, 0xED, 0xAE, 0xDD, 0xDD, 0xCD, 0xCC, 0xCC, - 0xCC, 0xCD, 0xDD, 0xDD, 0xA0, 0x00, 0x00, 0x00, - ], - [ - 0xDF, 0xFE, 0xEE, 0xDD, 0xDD, 0xDD, 0xEE, 0xEF, 0xEF, 0xFF, 0xBF, 0xFF, - 0xFF, 0xDD, 0xDD, 0xDD, 0xDD, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xDD, - 0xCC, 0xBB, 0xBC, 0xCD, 0xDE, 0xEF, 0xFF, 0xFF, 0xFE, 0xDC, 0xCB, 0xAA, - 0xAA, 0xAB, 0xBC, 0xDE, 0xFF, 0xFF, 0xEF, 0xDC, 0xBB, 0xA9, 0x99, 0x99, - 0x9A, 0xBC, 0xDE, 0xFF, 0xFE, 0xED, 0xBA, 0x99, 0x88, 0x77, 0x78, 0x9A, - 0xBC, 0xDF, 0xFF, 0xED, 0xCB, 0xA9, 0x87, 0x66, 0x66, 0x78, 0x9A, 0xBC, - 0xEF, 0xFD, 0xDC, 0xA9, 0x87, 0x66, 0x55, 0x56, 0x78, 0x9A, 0xCE, 0xFF, - 0xED, 0xBA, 0x97, 0x65, 0x55, 0x45, 0x56, 0x79, 0xAB, 0xDE, 0xFD, 0xCB, - 0xA9, 0x76, 0x55, 0x44, 0x45, 0x67, 0x8A, 0xBC, 0xEF, 0xDD, 0xBA, 0x87, - 0x65, 0x44, 0x44, 0x56, 0x78, 0xAB, 0xDE, 0xEE, 0xDC, 0xA9, 0x76, 0x55, - 0x44, 0x55, 0x67, 0x9A, 0xBD, 0xEF, 0xEE, 0xCA, 0x98, 0x76, 0x55, 0x55, - 0x67, 0x89, 0xAC, 0xDF, 0xFE, 0xED, 0xBA, 0x98, 0x76, 0x66, 0x67, 0x78, - 0x9B, 0xCD, 0xEE, 0xFF, 0xDC, 0xBA, 0x98, 0x77, 0x77, 0x88, 0x9A, 0xBC, - 0xEF, 0xFF, 0xFE, 0xDC, 0xBA, 0x99, 0x88, 0x89, 0xAA, 0xBC, 0xDE, 0xFF, - 0xFF, 0xFF, 0xDC, 0xBA, 0xAA, 0xAA, 0xAB, 0xBC, 0xDE, 0xFF, 0xFF, 0xFF, - 0xFF, 0xDC, 0xCB, 0xBB, 0xBB, 0xCC, 0xDD, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xED, 0xDD, 0xCD, 0xDD, 0xDE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, - 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0x00, 0x00, 0x00, - ], - [ - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFA, 0xAF, 0xFA, 0x7F, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xAF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFA, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFA, 0xFF, 0x9F, 0xAA, 0xBA, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFA, 0xFF, 0xFF, 0x98, 0x89, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFA, 0x76, 0x78, 0x78, 0x8F, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xF7, 0x64, 0x56, 0x78, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xA9, 0x74, 0x22, 0x57, 0x9F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0x97, 0x52, 0x14, 0x69, 0xAF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF9, 0x86, - 0x44, 0x57, 0x8A, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x99, 0x76, 0x77, - 0x89, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC9, 0x89, 0x99, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x9F, 0xAF, 0xFA, 0xFF, 0xFF, - 0xFF, 0xFA, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFA, 0xFF, 0xFF, 0xFF, 0xFF, - 0xAF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFA, - 0xFF, 0xFA, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFA, 0xFF, 0xFF, 0xAF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x79, 0xFA, 0xCF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xAF, 0xA0, 0x00, 0x00, 0x00, - ], - [ - 0xCD, 0xDD, 0xCC, 0xCB, 0xBB, 0xCC, 0xCC, 0xDD, 0xEE, 0xEE, 0xCD, 0xEE, - 0xDD, 0xCC, 0xBB, 0xBB, 0xBC, 0xCD, 0xDE, 0xEF, 0xFF, 0xDE, 0xDC, 0xCB, - 0xBA, 0xAA, 0xAA, 0xAB, 0xBC, 0xDE, 0xFF, 0xFD, 0xDC, 0xBB, 0xAA, 0x99, - 0x99, 0x99, 0xAA, 0xBC, 0xDE, 0xFE, 0xCC, 0xCB, 0xA9, 0x98, 0x88, 0x88, - 0x89, 0x9A, 0xBC, 0xDE, 0xEC, 0xCB, 0xA9, 0x88, 0x77, 0x77, 0x77, 0x88, - 0x9A, 0xBC, 0xDD, 0xCC, 0xBA, 0x98, 0x77, 0x66, 0x66, 0x67, 0x88, 0xAB, - 0xCD, 0xDC, 0xCA, 0x98, 0x77, 0x65, 0x55, 0x56, 0x67, 0x89, 0xAB, 0xDD, - 0xBB, 0xA9, 0x87, 0x65, 0x55, 0x55, 0x56, 0x78, 0x9A, 0xBC, 0xDC, 0xBA, - 0x98, 0x76, 0x55, 0x55, 0x55, 0x67, 0x89, 0xAB, 0xCD, 0xBB, 0xA9, 0x87, - 0x65, 0x55, 0x45, 0x56, 0x77, 0x9A, 0xBC, 0xDC, 0xBA, 0x98, 0x76, 0x55, - 0x55, 0x55, 0x67, 0x89, 0xAB, 0xCC, 0xCC, 0xA9, 0x87, 0x66, 0x55, 0x55, - 0x66, 0x78, 0x9A, 0xBD, 0xDC, 0xCB, 0xA9, 0x87, 0x66, 0x66, 0x66, 0x78, - 0x99, 0xAC, 0xDD, 0xDD, 0xBA, 0x98, 0x87, 0x77, 0x77, 0x78, 0x89, 0xAB, - 0xCD, 0xDD, 0xDC, 0xBA, 0x99, 0x88, 0x78, 0x88, 0x89, 0xAA, 0xBC, 0xDD, - 0xEE, 0xDC, 0xBA, 0xA9, 0x99, 0x99, 0x99, 0xAB, 0xBC, 0xDE, 0xDE, 0xFE, - 0xDC, 0xBB, 0xAA, 0xAA, 0xAA, 0xAB, 0xCC, 0xDD, 0xED, 0xFF, 0xFE, 0xDC, - 0xCB, 0xBB, 0xBB, 0xBC, 0xCC, 0xDE, 0xEF, 0xEF, 0xFF, 0xFF, 0xED, 0xDD, - 0xCC, 0xCC, 0xDD, 0xEE, 0xEF, 0xFE, 0xCF, 0xFF, 0xEE, 0xDD, 0xDD, 0xDD, - 0xDD, 0xDD, 0xDD, 0xEE, 0xC0, 0x00, 0x00, 0x00, - ], - [ - 0xCE, 0xDE, 0xDC, 0xCC, 0xCC, 0xCC, 0xDD, 0xDD, 0xEF, 0xFF, 0xBF, 0xEF, - 0xED, 0xDC, 0xCC, 0xCC, 0xCD, 0xDD, 0xFF, 0xFF, 0xFF, 0xFE, 0xDD, 0xCB, - 0xBB, 0xBA, 0xBB, 0xBC, 0xCD, 0xEF, 0xFF, 0xFD, 0xED, 0xCB, 0xBA, 0xA9, - 0x99, 0x9A, 0xBB, 0xCD, 0xEF, 0xFF, 0xDD, 0xCC, 0xBA, 0x99, 0x88, 0x88, - 0x89, 0xAB, 0xCD, 0xEF, 0xED, 0xCC, 0xBA, 0x98, 0x87, 0x77, 0x77, 0x89, - 0xAB, 0xDE, 0xFF, 0xCC, 0xBA, 0x98, 0x77, 0x66, 0x66, 0x67, 0x89, 0xAC, - 0xDE, 0xED, 0xCB, 0xA9, 0x77, 0x66, 0x55, 0x56, 0x67, 0x8A, 0xBC, 0xDE, - 0xDC, 0xBA, 0x87, 0x65, 0x55, 0x55, 0x56, 0x78, 0x9A, 0xCE, 0xED, 0xCB, - 0x98, 0x76, 0x55, 0x44, 0x55, 0x67, 0x89, 0xAC, 0xDD, 0xDC, 0xB9, 0x87, - 0x65, 0x54, 0x45, 0x56, 0x78, 0x9A, 0xBD, 0xEC, 0xCB, 0x98, 0x76, 0x55, - 0x55, 0x55, 0x67, 0x89, 0xAC, 0xDF, 0xDD, 0xBA, 0x97, 0x66, 0x55, 0x55, - 0x66, 0x78, 0xAB, 0xCD, 0xDD, 0xDB, 0xA9, 0x87, 0x66, 0x66, 0x66, 0x78, - 0x9A, 0xBD, 0xDF, 0xDE, 0xCB, 0xA9, 0x87, 0x77, 0x77, 0x78, 0x9A, 0xAC, - 0xDF, 0xDF, 0xFD, 0xCB, 0xA9, 0x88, 0x88, 0x88, 0x99, 0xBB, 0xCD, 0xEE, - 0xFF, 0xFC, 0xCB, 0xAA, 0x99, 0x99, 0x9A, 0xBB, 0xCD, 0xEF, 0xFF, 0xFE, - 0xEC, 0xCB, 0xBA, 0xAA, 0xAA, 0xBB, 0xCD, 0xEF, 0xED, 0xEF, 0xFF, 0xED, - 0xDD, 0xCB, 0xCB, 0xCC, 0xDD, 0xDE, 0xFF, 0xEF, 0xFF, 0xFF, 0xEE, 0xED, - 0xDD, 0xDE, 0xEE, 0xEE, 0xFF, 0xFE, 0xAE, 0xFF, 0xEE, 0xEE, 0xEE, 0xED, - 0xFD, 0xED, 0xFE, 0xFF, 0xD0, 0x00, 0x00, 0x00, - ], - [ - 0xCF, 0xFE, 0xFF, 0xEE, 0xEF, 0xEF, 0xDF, 0xFF, 0xFF, 0xFF, 0xBF, 0xFF, - 0xFF, 0xFE, 0xEE, 0xDD, 0xDF, 0xEF, 0xFF, 0xFF, 0xFF, 0xEF, 0xFF, 0xFD, - 0xDD, 0xCB, 0xBC, 0xCD, 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0xDD, 0xCB, 0xBA, - 0xAA, 0xBB, 0xBC, 0xDF, 0xFF, 0xFF, 0xEF, 0xDD, 0xCB, 0xA9, 0x99, 0x99, - 0x9A, 0xBC, 0xDF, 0xFF, 0xFF, 0xFD, 0xCB, 0xA9, 0x88, 0x77, 0x88, 0x9A, - 0xBC, 0xDF, 0xFF, 0xFE, 0xCB, 0xA9, 0x87, 0x66, 0x66, 0x78, 0x9A, 0xBD, - 0xFF, 0xFE, 0xDC, 0xB9, 0x87, 0x66, 0x55, 0x56, 0x78, 0x9B, 0xDE, 0xFF, - 0xEE, 0xCA, 0x98, 0x65, 0x54, 0x45, 0x56, 0x79, 0xAC, 0xEF, 0xFF, 0xDC, - 0xA9, 0x76, 0x54, 0x44, 0x45, 0x67, 0x8A, 0xCD, 0xFF, 0xED, 0xCA, 0x97, - 0x65, 0x44, 0x44, 0x56, 0x79, 0xAC, 0xDF, 0xFE, 0xEC, 0xA9, 0x86, 0x65, - 0x44, 0x55, 0x67, 0x9A, 0xCD, 0xFF, 0xEE, 0xCB, 0x98, 0x76, 0x55, 0x55, - 0x67, 0x89, 0xAC, 0xDF, 0xFF, 0xFD, 0xCA, 0x98, 0x76, 0x66, 0x67, 0x89, - 0xAB, 0xCE, 0xEF, 0xFF, 0xEC, 0xBA, 0x98, 0x87, 0x77, 0x89, 0x9B, 0xCD, - 0xEF, 0xFF, 0xFF, 0xEC, 0xBA, 0x99, 0x99, 0x99, 0xAA, 0xBC, 0xDF, 0xFF, - 0xFF, 0xFE, 0xDC, 0xBB, 0xAA, 0xAA, 0xAB, 0xCC, 0xDF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xDD, 0xCB, 0xCB, 0xCC, 0xCD, 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFE, 0xDD, 0xDD, 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0x00, 0x00, 0x00, - ], - [ - 0xAB, 0xBB, 0xAA, 0xAA, 0x99, 0xAA, 0xAA, 0xAB, 0xCC, 0xCD, 0xBB, 0xCC, - 0xBB, 0xAA, 0xAA, 0xAA, 0xAA, 0xBB, 0xBC, 0xDD, 0xEE, 0xBC, 0xBB, 0xA9, - 0x99, 0x99, 0x99, 0x99, 0xAA, 0xBB, 0xCD, 0xDA, 0xBA, 0xA9, 0x99, 0x88, - 0x88, 0x88, 0x99, 0xAA, 0xBC, 0xCC, 0xAB, 0xA9, 0x98, 0x88, 0x77, 0x77, - 0x88, 0x89, 0x9A, 0xBC, 0xCA, 0xA9, 0x98, 0x87, 0x77, 0x77, 0x77, 0x78, - 0x89, 0xAB, 0xBB, 0xAA, 0x99, 0x87, 0x76, 0x66, 0x66, 0x67, 0x78, 0x99, - 0xAB, 0xBA, 0xA9, 0x88, 0x76, 0x66, 0x66, 0x66, 0x67, 0x88, 0x9A, 0xBB, - 0x9A, 0x98, 0x77, 0x66, 0x65, 0x56, 0x66, 0x77, 0x89, 0xAA, 0xB9, 0xA9, - 0x87, 0x76, 0x65, 0x55, 0x56, 0x67, 0x78, 0x9A, 0xAB, 0x9A, 0x98, 0x77, - 0x66, 0x55, 0x55, 0x66, 0x77, 0x89, 0xAA, 0xAA, 0xA9, 0x87, 0x76, 0x66, - 0x55, 0x66, 0x67, 0x78, 0x9A, 0xAA, 0xAA, 0x98, 0x87, 0x76, 0x66, 0x66, - 0x66, 0x77, 0x89, 0xAA, 0xAA, 0xA9, 0x98, 0x77, 0x66, 0x66, 0x66, 0x77, - 0x88, 0x9A, 0xBB, 0xBB, 0xA9, 0x88, 0x77, 0x77, 0x77, 0x77, 0x88, 0x99, - 0xAB, 0xBB, 0xBA, 0xA9, 0x88, 0x87, 0x77, 0x77, 0x88, 0x99, 0xAA, 0xBB, - 0xBC, 0xBA, 0xA9, 0x98, 0x88, 0x88, 0x88, 0x99, 0xAA, 0xBC, 0xBC, 0xCC, - 0xBB, 0xA9, 0x99, 0x99, 0x99, 0x9A, 0xAA, 0xBB, 0xCC, 0xDD, 0xCC, 0xBB, - 0xAA, 0xAA, 0xA9, 0xAA, 0xAB, 0xBB, 0xCD, 0xCD, 0xDD, 0xDC, 0xCB, 0xBB, - 0xAA, 0xAA, 0xBB, 0xBC, 0xCD, 0xEC, 0xAE, 0xDD, 0xCC, 0xBB, 0xAA, 0xAA, - 0xAB, 0xBB, 0xBC, 0xCD, 0xB0, 0x00, 0x00, 0x00, - ], - [ - 0x9B, 0xBA, 0xAA, 0xA9, 0x99, 0x99, 0xAA, 0xAA, 0xBB, 0xCB, 0x9B, 0xCB, - 0xBA, 0xAA, 0xAA, 0xA9, 0xAA, 0xAA, 0xBB, 0xCD, 0xDC, 0xBC, 0xBB, 0xAA, - 0x99, 0x99, 0x99, 0x99, 0xAA, 0xBB, 0xCD, 0xCA, 0xBB, 0xAA, 0x99, 0x88, - 0x88, 0x88, 0x99, 0x9A, 0xBC, 0xCC, 0xAB, 0xA9, 0x98, 0x88, 0x87, 0x77, - 0x88, 0x89, 0x9A, 0xBC, 0xBA, 0xAA, 0x99, 0x87, 0x77, 0x77, 0x77, 0x78, - 0x89, 0xAA, 0xBB, 0xAA, 0x99, 0x88, 0x77, 0x66, 0x66, 0x67, 0x78, 0x89, - 0xAB, 0xB9, 0xA9, 0x88, 0x77, 0x66, 0x66, 0x66, 0x67, 0x88, 0x9A, 0xBB, - 0x9A, 0x98, 0x87, 0x66, 0x65, 0x56, 0x66, 0x77, 0x89, 0xAB, 0xA9, 0xA9, - 0x87, 0x76, 0x65, 0x55, 0x56, 0x67, 0x78, 0x99, 0xAA, 0x9A, 0x98, 0x77, - 0x66, 0x55, 0x55, 0x66, 0x77, 0x89, 0xAA, 0xA9, 0xA9, 0x87, 0x76, 0x65, - 0x55, 0x66, 0x67, 0x78, 0x9A, 0xBA, 0xAA, 0x98, 0x87, 0x66, 0x66, 0x66, - 0x67, 0x78, 0x89, 0xAA, 0xAA, 0xA9, 0x98, 0x77, 0x66, 0x66, 0x67, 0x77, - 0x88, 0x9A, 0xBA, 0xAA, 0xA9, 0x88, 0x77, 0x77, 0x77, 0x77, 0x88, 0x9A, - 0xAB, 0xAA, 0xBA, 0x99, 0x88, 0x77, 0x77, 0x78, 0x88, 0x99, 0xAA, 0xBB, - 0xBB, 0xBA, 0x99, 0x98, 0x88, 0x88, 0x89, 0x99, 0xAA, 0xBC, 0xBB, 0xCB, - 0xBA, 0xA9, 0x99, 0x99, 0x99, 0x99, 0xAA, 0xBB, 0xCB, 0xCD, 0xCC, 0xBB, - 0xAA, 0xA9, 0x99, 0xAA, 0xAB, 0xBB, 0xDD, 0xBC, 0xDC, 0xCC, 0xCB, 0xBA, - 0xAA, 0xBA, 0xBB, 0xBC, 0xCC, 0xDC, 0x9C, 0xCC, 0xBB, 0xBA, 0xAA, 0xAA, - 0xAA, 0xAA, 0xBB, 0xBC, 0xA0, 0x00, 0x00, 0x00, - ], - [ - 0x9B, 0xAA, 0xA9, 0x99, 0x99, 0x99, 0x99, 0xAA, 0xAB, 0xBC, 0xAB, 0xCB, - 0xBA, 0xAA, 0x99, 0x99, 0x99, 0xAA, 0xAB, 0xCC, 0xDC, 0xAB, 0xBA, 0xA9, - 0x99, 0x98, 0x99, 0x99, 0x9A, 0xAB, 0xBC, 0xCA, 0xBA, 0xA9, 0x98, 0x88, - 0x88, 0x88, 0x89, 0x9A, 0xAB, 0xCB, 0xAA, 0xA9, 0x98, 0x88, 0x77, 0x77, - 0x78, 0x89, 0x9A, 0xAB, 0xB9, 0xA9, 0x98, 0x87, 0x77, 0x77, 0x77, 0x78, - 0x89, 0x9A, 0xBA, 0x9A, 0x98, 0x87, 0x77, 0x66, 0x66, 0x67, 0x78, 0x89, - 0xAB, 0xA9, 0xA9, 0x88, 0x77, 0x66, 0x66, 0x66, 0x67, 0x78, 0x99, 0xAA, - 0x99, 0x98, 0x77, 0x66, 0x66, 0x66, 0x66, 0x77, 0x88, 0x9A, 0xA9, 0x98, - 0x87, 0x76, 0x66, 0x55, 0x66, 0x67, 0x78, 0x89, 0xAA, 0x99, 0x88, 0x77, - 0x66, 0x65, 0x55, 0x66, 0x77, 0x88, 0x9A, 0xA9, 0x99, 0x87, 0x76, 0x66, - 0x66, 0x66, 0x67, 0x78, 0x89, 0xAA, 0x99, 0x98, 0x77, 0x66, 0x66, 0x66, - 0x66, 0x77, 0x89, 0x9A, 0xA9, 0xA9, 0x88, 0x77, 0x66, 0x66, 0x67, 0x77, - 0x88, 0x9A, 0xAA, 0xAA, 0x99, 0x88, 0x77, 0x77, 0x77, 0x77, 0x88, 0x99, - 0xAB, 0xAA, 0xBA, 0x99, 0x88, 0x77, 0x77, 0x77, 0x88, 0x99, 0xAA, 0xBA, - 0xAB, 0xAA, 0x99, 0x88, 0x88, 0x88, 0x88, 0x99, 0x9A, 0xBB, 0xAB, 0xBB, - 0xAA, 0x99, 0x99, 0x88, 0x89, 0x99, 0xAA, 0xBB, 0xCB, 0xBC, 0xCB, 0xAA, - 0xA9, 0x99, 0x99, 0x9A, 0xAA, 0xBB, 0xBC, 0xBC, 0xDC, 0xCB, 0xBA, 0xAA, - 0xAA, 0xAA, 0xAB, 0xBB, 0xCC, 0xCB, 0xAC, 0xBB, 0xBA, 0xAA, 0xAA, 0xAA, - 0xAA, 0xAA, 0xAB, 0xBB, 0xA0, 0x00, 0x00, 0x00, - ], - [ - 0xAC, 0xCB, 0xBB, 0xAA, 0xAA, 0xAA, 0xAA, 0xBB, 0xBC, 0xCC, 0x9C, 0xDC, - 0xCB, 0xBA, 0xAA, 0xAA, 0xAA, 0xAB, 0xBC, 0xDD, 0xEC, 0xBC, 0xCB, 0xAA, - 0xA9, 0x99, 0x99, 0x9A, 0xAB, 0xBC, 0xCE, 0xCB, 0xCB, 0xBA, 0x99, 0x98, - 0x88, 0x89, 0x99, 0xAB, 0xBC, 0xDC, 0xBB, 0xBA, 0x98, 0x88, 0x77, 0x77, - 0x88, 0x89, 0xAA, 0xBC, 0xCB, 0xBA, 0x98, 0x87, 0x77, 0x77, 0x77, 0x78, - 0x99, 0xAB, 0xCB, 0xAB, 0xA9, 0x88, 0x77, 0x66, 0x66, 0x67, 0x78, 0x99, - 0xBC, 0xBA, 0xA9, 0x88, 0x77, 0x66, 0x66, 0x66, 0x67, 0x89, 0x9A, 0xBB, - 0xAA, 0x98, 0x87, 0x66, 0x55, 0x55, 0x66, 0x77, 0x89, 0xAB, 0xBA, 0xA9, - 0x87, 0x76, 0x65, 0x55, 0x55, 0x67, 0x78, 0x9A, 0xBB, 0xAA, 0x98, 0x77, - 0x66, 0x55, 0x55, 0x66, 0x77, 0x89, 0xAB, 0xBA, 0xA9, 0x88, 0x76, 0x65, - 0x55, 0x56, 0x67, 0x78, 0x9A, 0xBB, 0xAA, 0x98, 0x87, 0x76, 0x65, 0x66, - 0x66, 0x78, 0x89, 0xAB, 0xBB, 0xAA, 0x98, 0x77, 0x66, 0x66, 0x66, 0x77, - 0x89, 0xAA, 0xCB, 0xBB, 0xA9, 0x98, 0x77, 0x77, 0x77, 0x77, 0x89, 0x9A, - 0xBC, 0xBB, 0xBA, 0xA9, 0x98, 0x87, 0x77, 0x78, 0x88, 0x99, 0xAB, 0xCC, - 0xBC, 0xBB, 0x99, 0x98, 0x88, 0x88, 0x89, 0x9A, 0xAB, 0xCD, 0xCC, 0xDC, - 0xBB, 0xAA, 0x99, 0x99, 0x99, 0xAA, 0xAB, 0xCC, 0xDC, 0xDD, 0xDC, 0xBB, - 0xAA, 0xAA, 0xAA, 0xAA, 0xBC, 0xCC, 0xCD, 0xDD, 0xDE, 0xCD, 0xCB, 0xBB, - 0xBB, 0xBB, 0xBC, 0xCD, 0xDD, 0xED, 0x9D, 0xCC, 0xCC, 0xBB, 0xBB, 0xBB, - 0xBB, 0xBC, 0xCC, 0xDD, 0xB0, 0x00, 0x00, 0x00, - ], - [ - 0xAE, 0xDE, 0xDD, 0xED, 0xDC, 0xCC, 0xDC, 0xDD, 0xDD, 0xDD, 0x9E, 0xFF, - 0xFF, 0xFD, 0xEE, 0xEE, 0xEE, 0xDE, 0xEE, 0xEF, 0xFD, 0xEF, 0xEE, 0xED, - 0xDD, 0xDD, 0xDD, 0xDE, 0xEF, 0xEE, 0xEF, 0xDE, 0xEF, 0xDD, 0xDC, 0xCC, - 0xCC, 0xCC, 0xDD, 0xEE, 0xEF, 0xFD, 0xDF, 0xED, 0xCC, 0xBB, 0xBB, 0xBB, - 0xBC, 0xCD, 0xDD, 0xFF, 0xDE, 0xEE, 0xDC, 0xBA, 0x99, 0x99, 0x9A, 0xBC, - 0xCE, 0xFE, 0xFD, 0xDF, 0xDC, 0xBA, 0x98, 0x87, 0x88, 0x9A, 0xBC, 0xDE, - 0xFE, 0xDD, 0xEE, 0xCB, 0xA8, 0x76, 0x66, 0x67, 0x9A, 0xBC, 0xEE, 0xFD, - 0xDE, 0xDC, 0xA9, 0x86, 0x54, 0x45, 0x68, 0x9B, 0xCD, 0xEF, 0xED, 0xED, - 0xCB, 0x97, 0x64, 0x32, 0x46, 0x79, 0xBC, 0xDE, 0xFE, 0xDE, 0xEC, 0xB9, - 0x86, 0x42, 0x24, 0x57, 0x9A, 0xCD, 0xEF, 0xDD, 0xED, 0xCB, 0x98, 0x75, - 0x44, 0x56, 0x79, 0xAC, 0xDE, 0xEE, 0xDF, 0xED, 0xCA, 0x98, 0x76, 0x66, - 0x78, 0x9B, 0xCD, 0xFF, 0xED, 0xEF, 0xDC, 0xBA, 0x98, 0x77, 0x78, 0x9A, - 0xBC, 0xDE, 0xFE, 0xDF, 0xED, 0xDC, 0xBA, 0x99, 0x99, 0x9A, 0xBC, 0xDD, - 0xEF, 0xEE, 0xFF, 0xED, 0xCC, 0xBB, 0xAA, 0xBB, 0xBC, 0xDD, 0xEF, 0xFE, - 0xDF, 0xFE, 0xEE, 0xDC, 0xCC, 0xCC, 0xCC, 0xDE, 0xEF, 0xFF, 0xEE, 0xFE, - 0xFE, 0xEE, 0xEE, 0xDD, 0xDD, 0xED, 0xEE, 0xEE, 0xFE, 0xEE, 0xEF, 0xFF, - 0xEE, 0xEE, 0xDE, 0xEE, 0xFE, 0xFF, 0xFF, 0xEE, 0xFF, 0xFF, 0xFE, 0xEF, - 0xEF, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xAE, 0xDD, 0xDD, 0xEE, 0xDD, 0xDD, - 0xEE, 0xDE, 0xEE, 0xFE, 0xB0, 0x00, 0x00, 0x00, - ], - [ - 0xCF, 0xFF, 0xFF, 0xFF, 0xFE, 0xEF, 0xFE, 0xEF, 0xFF, 0xEF, 0xAF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xEE, 0xDE, 0xDE, 0xFF, 0xFF, 0xFF, 0xFF, 0xEF, 0xFF, 0xFF, 0xEC, 0xCC, - 0xCC, 0xCC, 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xEC, 0xBA, 0xAA, 0xAA, - 0xBC, 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0xEC, 0xBA, 0x98, 0x88, 0x89, 0xAB, - 0xDE, 0xFF, 0xFF, 0xFF, 0xFD, 0xBA, 0x98, 0x77, 0x77, 0x89, 0xAC, 0xDF, - 0xFF, 0xFF, 0xFE, 0xCB, 0x98, 0x66, 0x55, 0x66, 0x89, 0xBC, 0xDF, 0xFF, - 0xFF, 0xDC, 0xA8, 0x76, 0x44, 0x45, 0x67, 0x8A, 0xCD, 0xFF, 0xFF, 0xFD, - 0xCA, 0x86, 0x54, 0x33, 0x45, 0x68, 0xAC, 0xDF, 0xFF, 0xFF, 0xDC, 0xA8, - 0x75, 0x43, 0x34, 0x56, 0x8A, 0xBD, 0xEF, 0xFE, 0xFE, 0xCA, 0x87, 0x65, - 0x44, 0x45, 0x78, 0xAC, 0xDF, 0xFF, 0xFF, 0xED, 0xB9, 0x86, 0x65, 0x55, - 0x67, 0x9B, 0xCE, 0xFF, 0xFF, 0xFF, 0xDB, 0xA9, 0x87, 0x66, 0x77, 0x8A, - 0xBD, 0xEF, 0xFF, 0xFF, 0xFF, 0xDB, 0xA9, 0x98, 0x88, 0x9A, 0xBC, 0xEF, - 0xFF, 0xFF, 0xFF, 0xFE, 0xDC, 0xBA, 0xAA, 0xAB, 0xBC, 0xDE, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFE, 0xDD, 0xCC, 0xBC, 0xCD, 0xDE, 0xEF, 0xFF, 0xFE, 0xFF, - 0xFF, 0xFF, 0xED, 0xDD, 0xDD, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xAF, 0xFF, 0xFF, 0xFE, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0x00, 0x00, 0x00, - ], - [ - 0xCE, 0xDE, 0xDD, 0xDD, 0xCC, 0xDD, 0xDD, 0xEE, 0xDE, 0xEF, 0xAE, 0xFE, - 0xEE, 0xDD, 0xCC, 0xCC, 0xDD, 0xEE, 0xFF, 0xFF, 0xFF, 0xDF, 0xDE, 0xDC, - 0xCC, 0xBB, 0xBB, 0xCC, 0xDD, 0xFE, 0xEF, 0xEE, 0xFD, 0xDC, 0xBA, 0xAA, - 0x9A, 0xAA, 0xBC, 0xDD, 0xEF, 0xFF, 0xDD, 0xDC, 0xBA, 0xA9, 0x88, 0x88, - 0x99, 0xAB, 0xCD, 0xFF, 0xFC, 0xDC, 0xBA, 0x98, 0x87, 0x77, 0x78, 0x89, - 0xAC, 0xDD, 0xFE, 0xDD, 0xCA, 0x98, 0x77, 0x66, 0x66, 0x77, 0x89, 0xBC, - 0xDE, 0xFC, 0xDB, 0xA9, 0x87, 0x66, 0x55, 0x56, 0x78, 0x9A, 0xCD, 0xEF, - 0xDD, 0xBA, 0x87, 0x66, 0x55, 0x55, 0x56, 0x78, 0xAB, 0xDE, 0xEC, 0xCB, - 0xA8, 0x76, 0x55, 0x44, 0x45, 0x67, 0x89, 0xBD, 0xEF, 0xCC, 0xBA, 0x87, - 0x65, 0x54, 0x44, 0x56, 0x78, 0x9B, 0xCD, 0xDD, 0xDB, 0xA8, 0x76, 0x55, - 0x44, 0x55, 0x67, 0x89, 0xBC, 0xEE, 0xDD, 0xCA, 0x98, 0x76, 0x55, 0x55, - 0x67, 0x89, 0xAB, 0xCE, 0xED, 0xDC, 0xB9, 0x87, 0x76, 0x66, 0x67, 0x78, - 0x9A, 0xBC, 0xFE, 0xED, 0xCB, 0xA9, 0x88, 0x77, 0x77, 0x88, 0x9A, 0xBC, - 0xDE, 0xED, 0xEE, 0xCB, 0xAA, 0x98, 0x88, 0x89, 0x9A, 0xBC, 0xDD, 0xEE, - 0xEF, 0xED, 0xCC, 0xBA, 0xA9, 0x99, 0xAA, 0xBB, 0xCD, 0xEF, 0xED, 0xFE, - 0xED, 0xDC, 0xBB, 0xBB, 0xBB, 0xCC, 0xCD, 0xEF, 0xFE, 0xFF, 0xFF, 0xED, - 0xDD, 0xDC, 0xCD, 0xCD, 0xDD, 0xEE, 0xFF, 0xEE, 0xFF, 0xFF, 0xFE, 0xEE, - 0xDE, 0xDD, 0xEE, 0xEF, 0xFF, 0xFF, 0x9F, 0xEE, 0xED, 0xFE, 0xEF, 0xEE, - 0xDF, 0xEE, 0xEE, 0xFF, 0xD0, 0x00, 0x00, 0x00, - ], - [ - 0xCE, 0xDD, 0xDC, 0xCC, 0xCB, 0xCC, 0xCC, 0xDD, 0xEE, 0xEE, 0xBE, 0xFE, - 0xDD, 0xCC, 0xCB, 0xBB, 0xBC, 0xCD, 0xDE, 0xFF, 0xFF, 0xDE, 0xDC, 0xCB, - 0xBA, 0xAA, 0xAA, 0xBB, 0xCC, 0xDE, 0xFF, 0xFD, 0xDC, 0xCB, 0xAA, 0x99, - 0x99, 0x9A, 0xAB, 0xBC, 0xDE, 0xEE, 0xCD, 0xCB, 0xA9, 0x98, 0x88, 0x88, - 0x89, 0xAA, 0xBC, 0xDE, 0xEC, 0xCB, 0xAA, 0x98, 0x87, 0x77, 0x77, 0x89, - 0xAB, 0xCD, 0xEE, 0xCC, 0xBA, 0x98, 0x77, 0x66, 0x66, 0x67, 0x89, 0xAB, - 0xCD, 0xEC, 0xCA, 0x98, 0x87, 0x66, 0x55, 0x56, 0x67, 0x89, 0xBC, 0xDD, - 0xCB, 0xA9, 0x87, 0x66, 0x55, 0x55, 0x56, 0x78, 0x9A, 0xCD, 0xDC, 0xBA, - 0x98, 0x76, 0x55, 0x44, 0x55, 0x67, 0x89, 0xAB, 0xCD, 0xCC, 0xA9, 0x87, - 0x65, 0x54, 0x45, 0x56, 0x78, 0x9A, 0xCC, 0xDC, 0xBA, 0x98, 0x76, 0x55, - 0x55, 0x55, 0x67, 0x89, 0xAB, 0xCD, 0xCC, 0xBA, 0x87, 0x66, 0x55, 0x55, - 0x67, 0x78, 0x9A, 0xCD, 0xDD, 0xCB, 0xA9, 0x87, 0x66, 0x66, 0x67, 0x78, - 0x9A, 0xBC, 0xDD, 0xDD, 0xCA, 0xA9, 0x87, 0x77, 0x77, 0x78, 0x99, 0xAB, - 0xCD, 0xDD, 0xEC, 0xBA, 0xA9, 0x88, 0x88, 0x88, 0x99, 0xAB, 0xCD, 0xDD, - 0xDE, 0xDC, 0xBB, 0xA9, 0x99, 0x99, 0x9A, 0xAB, 0xCC, 0xDE, 0xEE, 0xEE, - 0xDC, 0xCB, 0xBA, 0xAA, 0xAA, 0xBB, 0xCC, 0xDE, 0xEE, 0xEF, 0xFE, 0xDD, - 0xCC, 0xBB, 0xBB, 0xBC, 0xCD, 0xDE, 0xEF, 0xEE, 0xFF, 0xFF, 0xED, 0xDD, - 0xDC, 0xCD, 0xDD, 0xDE, 0xEF, 0xFE, 0xBE, 0xFE, 0xEE, 0xED, 0xDD, 0xDD, - 0xDD, 0xDD, 0xEE, 0xEE, 0xD0, 0x00, 0x00, 0x00, - ], - [ - 0xCE, 0xED, 0xDC, 0xCC, 0xCC, 0xCC, 0xCD, 0xDD, 0xDD, 0xDD, 0x9D, 0xFF, - 0xDD, 0xCC, 0xCC, 0xCC, 0xCC, 0xCD, 0xEE, 0xEF, 0xFD, 0xEE, 0xDD, 0xCC, - 0xBB, 0xAA, 0xAA, 0xBB, 0xCC, 0xDE, 0xEF, 0xDE, 0xED, 0xCB, 0xBA, 0xA9, - 0x99, 0x9A, 0xAB, 0xCD, 0xDE, 0xFE, 0xDD, 0xCB, 0xAA, 0x99, 0x88, 0x88, - 0x99, 0xAB, 0xCD, 0xEF, 0xDC, 0xCB, 0xBA, 0x98, 0x87, 0x77, 0x77, 0x89, - 0xAB, 0xCD, 0xFD, 0xDC, 0xBA, 0x98, 0x77, 0x66, 0x66, 0x67, 0x89, 0xAB, - 0xCE, 0xEC, 0xDB, 0xA9, 0x87, 0x65, 0x55, 0x56, 0x77, 0x8A, 0xBD, 0xED, - 0xCC, 0xB9, 0x87, 0x65, 0x55, 0x55, 0x56, 0x78, 0x9B, 0xCD, 0xDC, 0xCB, - 0x98, 0x76, 0x55, 0x44, 0x55, 0x67, 0x89, 0xBB, 0xDD, 0xCC, 0xB9, 0x87, - 0x65, 0x54, 0x45, 0x56, 0x78, 0x9A, 0xCD, 0xDC, 0xDB, 0x98, 0x76, 0x55, - 0x45, 0x55, 0x67, 0x89, 0xAB, 0xDD, 0xCC, 0xBA, 0x97, 0x76, 0x55, 0x55, - 0x67, 0x88, 0xAA, 0xCD, 0xDC, 0xDB, 0xA9, 0x87, 0x76, 0x66, 0x67, 0x78, - 0x9A, 0xBC, 0xDD, 0xCC, 0xCB, 0xA9, 0x87, 0x77, 0x77, 0x88, 0x9A, 0xAB, - 0xCD, 0xDE, 0xED, 0xCB, 0xA9, 0x98, 0x88, 0x89, 0x9A, 0xAB, 0xCC, 0xDD, - 0xEE, 0xDC, 0xCB, 0xAA, 0x99, 0x99, 0xAA, 0xAB, 0xCC, 0xEE, 0xDE, 0xFD, - 0xDD, 0xCB, 0xBA, 0xBA, 0xAB, 0xBB, 0xCC, 0xDD, 0xFD, 0xFF, 0xFE, 0xDD, - 0xDC, 0xCC, 0xCC, 0xCC, 0xDC, 0xDD, 0xFE, 0xEF, 0xFF, 0xEF, 0xEE, 0xDD, - 0xDD, 0xDD, 0xDD, 0xDF, 0xFF, 0xEF, 0xAD, 0xDD, 0xDD, 0xDE, 0xDC, 0xDD, - 0xDD, 0xDC, 0xDD, 0xDE, 0xC0, 0x00, 0x00, 0x00, - ], - [ - 0xCF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x9F, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFD, 0xDD, 0xFD, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xDD, 0xCC, - 0xBC, 0xCC, 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xDC, 0xBA, 0xAA, 0xAA, - 0xBC, 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0xDC, 0xBA, 0x98, 0x88, 0x89, 0xAC, - 0xDF, 0xFF, 0xFF, 0xFF, 0xFC, 0xBA, 0x88, 0x76, 0x77, 0x89, 0xAC, 0xDF, - 0xFF, 0xFF, 0xFD, 0xCA, 0x98, 0x66, 0x55, 0x67, 0x89, 0xBC, 0xFF, 0xFF, - 0xFF, 0xFC, 0xA8, 0x76, 0x44, 0x45, 0x67, 0x8A, 0xCF, 0xFF, 0xFF, 0xFD, - 0xBA, 0x87, 0x54, 0x33, 0x45, 0x68, 0xAB, 0xDF, 0xFF, 0xFF, 0xDC, 0xA8, - 0x75, 0x43, 0x34, 0x56, 0x8A, 0xBD, 0xFF, 0xFF, 0xFF, 0xCA, 0x87, 0x65, - 0x44, 0x45, 0x78, 0xAB, 0xDF, 0xFF, 0xFF, 0xFC, 0xB9, 0x86, 0x65, 0x55, - 0x67, 0x9A, 0xCD, 0xFF, 0xFF, 0xFF, 0xDC, 0xA9, 0x87, 0x66, 0x77, 0x8A, - 0xBC, 0xDF, 0xFF, 0xFF, 0xFF, 0xDC, 0xA9, 0x88, 0x88, 0x99, 0xBC, 0xDF, - 0xFF, 0xFF, 0xFF, 0xFD, 0xCC, 0xBA, 0xAA, 0xAA, 0xBC, 0xCF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xEC, 0xCC, 0xBC, 0xCC, 0xDE, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFD, 0xDD, 0xDD, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xAF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xD0, 0x00, 0x00, 0x00, - ], - [ - 0xCE, 0xED, 0xDD, 0xCD, 0xCC, 0xCC, 0xDD, 0xDE, 0xDE, 0xEE, 0x9E, 0xFF, - 0xED, 0xDD, 0xDC, 0xCC, 0xCD, 0xDE, 0xFE, 0xFF, 0xFF, 0xDF, 0xED, 0xCC, - 0xCB, 0xBB, 0xBB, 0xBC, 0xDD, 0xEF, 0xFF, 0xFE, 0xEE, 0xDC, 0xBA, 0xAA, - 0x9A, 0xAA, 0xBB, 0xCD, 0xDF, 0xFE, 0xDD, 0xDC, 0xBA, 0xA9, 0x98, 0x89, - 0x9A, 0xAB, 0xCD, 0xEF, 0xED, 0xDC, 0xBA, 0x99, 0x88, 0x77, 0x88, 0x99, - 0xAB, 0xCD, 0xEE, 0xCC, 0xCB, 0xA8, 0x87, 0x66, 0x67, 0x78, 0x9A, 0xBC, - 0xDE, 0xEC, 0xDB, 0xA9, 0x87, 0x66, 0x55, 0x66, 0x78, 0x9A, 0xBD, 0xED, - 0xCC, 0xBA, 0x98, 0x76, 0x54, 0x55, 0x66, 0x79, 0xAB, 0xCE, 0xDC, 0xCB, - 0xA8, 0x76, 0x54, 0x34, 0x45, 0x67, 0x8A, 0xBC, 0xED, 0xDC, 0xBA, 0x87, - 0x65, 0x54, 0x34, 0x56, 0x78, 0xAB, 0xCD, 0xDC, 0xDB, 0xA9, 0x87, 0x65, - 0x44, 0x56, 0x67, 0x9A, 0xBC, 0xDD, 0xCD, 0xCA, 0x98, 0x76, 0x65, 0x56, - 0x67, 0x89, 0xAB, 0xCD, 0xDD, 0xDC, 0xBA, 0x98, 0x77, 0x66, 0x67, 0x88, - 0x9A, 0xBC, 0xED, 0xDE, 0xDC, 0xA9, 0x98, 0x77, 0x77, 0x89, 0x9A, 0xBC, - 0xDD, 0xDD, 0xFD, 0xCB, 0xAA, 0x99, 0x88, 0x99, 0x9A, 0xBC, 0xCD, 0xFE, - 0xEF, 0xED, 0xCB, 0xBA, 0xAA, 0xAA, 0xAA, 0xBC, 0xCD, 0xEF, 0xED, 0xFF, - 0xED, 0xCC, 0xBB, 0xBB, 0xBB, 0xCC, 0xDD, 0xEE, 0xFE, 0xEF, 0xFF, 0xED, - 0xDD, 0xCC, 0xCC, 0xCC, 0xDD, 0xDF, 0xFF, 0xED, 0xFF, 0xFF, 0xEE, 0xED, - 0xDD, 0xDD, 0xEE, 0xEF, 0xFF, 0xFE, 0x9E, 0xDD, 0xED, 0xDD, 0xDD, 0xDD, - 0xED, 0xDD, 0xDE, 0xEE, 0xB0, 0x00, 0x00, 0x00, - ], - [ - 0xAB, 0xBB, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAB, 0xBC, 0xCD, 0x9B, 0xDC, - 0xCB, 0xBA, 0xAA, 0xAA, 0xAA, 0xAB, 0xBC, 0xDD, 0xED, 0xBC, 0xBB, 0xAA, - 0x99, 0x99, 0x99, 0x9A, 0xAA, 0xBC, 0xCD, 0xCB, 0xBB, 0xAA, 0x99, 0x88, - 0x88, 0x88, 0x99, 0xAA, 0xBC, 0xDC, 0xAB, 0xAA, 0x99, 0x88, 0x77, 0x77, - 0x88, 0x89, 0xAA, 0xCC, 0xCA, 0xBA, 0x99, 0x87, 0x77, 0x77, 0x77, 0x78, - 0x89, 0xAB, 0xCB, 0xAA, 0x99, 0x87, 0x77, 0x66, 0x66, 0x67, 0x78, 0x9A, - 0xAB, 0xBA, 0xA9, 0x88, 0x77, 0x66, 0x66, 0x66, 0x67, 0x88, 0x9A, 0xBB, - 0xAA, 0x98, 0x87, 0x66, 0x55, 0x55, 0x66, 0x77, 0x89, 0xAB, 0xBA, 0xA9, - 0x87, 0x76, 0x65, 0x55, 0x56, 0x67, 0x78, 0x9A, 0xBA, 0xAA, 0x98, 0x77, - 0x66, 0x55, 0x55, 0x66, 0x77, 0x89, 0xAB, 0xAA, 0xA9, 0x87, 0x76, 0x65, - 0x55, 0x56, 0x67, 0x78, 0x9A, 0xBA, 0xAA, 0x98, 0x87, 0x66, 0x66, 0x66, - 0x67, 0x78, 0x89, 0xAB, 0xBA, 0xBA, 0x98, 0x77, 0x66, 0x66, 0x66, 0x77, - 0x89, 0x9A, 0xBB, 0xBB, 0xA9, 0x88, 0x77, 0x77, 0x77, 0x77, 0x89, 0x9A, - 0xBC, 0xBB, 0xBB, 0xA9, 0x88, 0x87, 0x77, 0x78, 0x88, 0x9A, 0xAB, 0xCB, - 0xBC, 0xBB, 0xA9, 0x98, 0x88, 0x88, 0x89, 0x9A, 0xAB, 0xBC, 0xCC, 0xDC, - 0xBB, 0xAA, 0x99, 0x99, 0x99, 0x9A, 0xAB, 0xBC, 0xDC, 0xCD, 0xDC, 0xBB, - 0xAA, 0xAA, 0xAA, 0xAA, 0xAB, 0xBC, 0xDD, 0xCC, 0xDD, 0xCC, 0xBB, 0xBB, - 0xBB, 0xBB, 0xBC, 0xCC, 0xDD, 0xEC, 0x8D, 0xCC, 0xCB, 0xBB, 0xBA, 0xAA, - 0xBB, 0xBB, 0xBC, 0xCD, 0xB0, 0x00, 0x00, 0x00, - ], - [ - 0x9B, 0xBA, 0xA9, 0x99, 0x99, 0x99, 0x9A, 0xAA, 0xBB, 0xBC, 0x9B, 0xCC, - 0xBB, 0xAA, 0xAA, 0x99, 0xAA, 0xAA, 0xBB, 0xCD, 0xDC, 0xAB, 0xBA, 0xAA, - 0x99, 0x99, 0x99, 0x99, 0x9A, 0xBB, 0xCC, 0xCA, 0xBA, 0xA9, 0x99, 0x88, - 0x88, 0x88, 0x99, 0x9A, 0xBB, 0xCB, 0xAB, 0xA9, 0x98, 0x88, 0x77, 0x77, - 0x88, 0x89, 0x9A, 0xBB, 0xBA, 0xA9, 0x98, 0x88, 0x77, 0x77, 0x77, 0x78, - 0x89, 0xAA, 0xBB, 0x9A, 0x99, 0x87, 0x77, 0x66, 0x66, 0x67, 0x78, 0x89, - 0xAB, 0xA9, 0xA9, 0x88, 0x77, 0x66, 0x66, 0x66, 0x67, 0x78, 0x9A, 0xBA, - 0x9A, 0x98, 0x77, 0x66, 0x65, 0x56, 0x66, 0x77, 0x89, 0x9A, 0xA9, 0x99, - 0x87, 0x76, 0x66, 0x55, 0x56, 0x67, 0x78, 0x99, 0xAA, 0x9A, 0x98, 0x77, - 0x66, 0x55, 0x55, 0x66, 0x77, 0x89, 0x9A, 0xA9, 0xA9, 0x87, 0x76, 0x66, - 0x55, 0x66, 0x67, 0x78, 0x99, 0xAA, 0x9A, 0x98, 0x87, 0x66, 0x66, 0x66, - 0x67, 0x78, 0x89, 0xAA, 0xAA, 0xA9, 0x88, 0x77, 0x66, 0x66, 0x67, 0x77, - 0x89, 0x9A, 0xAA, 0xAA, 0xA9, 0x88, 0x77, 0x77, 0x77, 0x77, 0x88, 0x9A, - 0xAB, 0xAA, 0xBA, 0x99, 0x88, 0x87, 0x77, 0x78, 0x88, 0x99, 0xAA, 0xBB, - 0xBB, 0xBA, 0x99, 0x88, 0x88, 0x88, 0x89, 0x99, 0xAA, 0xBB, 0xBB, 0xCB, - 0xBA, 0xA9, 0x99, 0x99, 0x99, 0x99, 0xAA, 0xBB, 0xCB, 0xBC, 0xCB, 0xBA, - 0xAA, 0xA9, 0x9A, 0xAA, 0xAB, 0xBB, 0xCC, 0xBC, 0xDC, 0xCC, 0xBB, 0xAA, - 0xAA, 0xAA, 0xBB, 0xBC, 0xCC, 0xDC, 0x9C, 0xCB, 0xBB, 0xAA, 0xAA, 0xAA, - 0xAA, 0xAA, 0xBB, 0xBC, 0xA0, 0x00, 0x00, 0x00, - ], - [ - 0xAB, 0xBA, 0xAA, 0xAA, 0x99, 0x9A, 0xAA, 0xAB, 0xBB, 0xCC, 0x8B, 0xCC, - 0xBB, 0xAA, 0xAA, 0xAA, 0xAA, 0xAB, 0xBC, 0xCD, 0xDC, 0xBC, 0xBB, 0xAA, - 0x99, 0x99, 0x99, 0x99, 0xAA, 0xBC, 0xCD, 0xCB, 0xBB, 0xAA, 0x99, 0x88, - 0x88, 0x88, 0x99, 0xAA, 0xBC, 0xCC, 0xAB, 0xAA, 0x99, 0x88, 0x87, 0x77, - 0x88, 0x89, 0x9A, 0xBC, 0xBA, 0xAA, 0x99, 0x87, 0x77, 0x77, 0x77, 0x78, - 0x89, 0xAB, 0xBB, 0xAA, 0xA9, 0x88, 0x77, 0x66, 0x66, 0x67, 0x78, 0x9A, - 0xAB, 0xBA, 0xA9, 0x88, 0x77, 0x66, 0x66, 0x66, 0x67, 0x88, 0x9A, 0xBA, - 0x9A, 0x98, 0x77, 0x66, 0x55, 0x55, 0x66, 0x77, 0x89, 0xAB, 0xAA, 0xA9, - 0x87, 0x76, 0x65, 0x55, 0x56, 0x67, 0x78, 0x9A, 0xAA, 0x9A, 0x98, 0x77, - 0x66, 0x55, 0x55, 0x66, 0x77, 0x89, 0xAB, 0xA9, 0xA9, 0x87, 0x76, 0x65, - 0x55, 0x56, 0x67, 0x78, 0x9A, 0xBA, 0xAA, 0x98, 0x87, 0x66, 0x66, 0x66, - 0x67, 0x78, 0x89, 0xAB, 0xAA, 0xA9, 0x98, 0x77, 0x66, 0x66, 0x67, 0x77, - 0x89, 0xAA, 0xBA, 0xAB, 0xA9, 0x98, 0x77, 0x77, 0x77, 0x78, 0x89, 0x9A, - 0xAB, 0xBB, 0xBA, 0xA9, 0x88, 0x87, 0x77, 0x88, 0x89, 0x9A, 0xAB, 0xBB, - 0xBC, 0xBA, 0xA9, 0x98, 0x88, 0x88, 0x89, 0x9A, 0xAB, 0xBC, 0xBB, 0xCC, - 0xBA, 0xA9, 0x99, 0x99, 0x99, 0x9A, 0xAB, 0xBC, 0xCB, 0xCD, 0xCC, 0xBB, - 0xAA, 0xAA, 0xAA, 0xAA, 0xAB, 0xBB, 0xCD, 0xCD, 0xDD, 0xCC, 0xCB, 0xBB, - 0xBA, 0xBB, 0xBB, 0xBC, 0xCD, 0xDC, 0x9C, 0xCB, 0xBB, 0xBA, 0xAA, 0xAA, - 0xAA, 0xAB, 0xBB, 0xBC, 0xA0, 0x00, 0x00, 0x00, - ], - [ - 0xBD, 0xDC, 0xCC, 0xCC, 0xBB, 0xBB, 0xCC, 0xCC, 0xDD, 0xDD, 0x8D, 0xEE, - 0xDD, 0xCC, 0xCC, 0xCB, 0xCC, 0xDD, 0xEF, 0xEE, 0xFE, 0xDE, 0xDC, 0xCC, - 0xBB, 0xAB, 0xBB, 0xBB, 0xCC, 0xDD, 0xFF, 0xED, 0xDD, 0xCB, 0xBA, 0xA9, - 0x99, 0xAA, 0xAB, 0xBC, 0xDD, 0xFD, 0xCD, 0xCB, 0xAA, 0x99, 0x88, 0x88, - 0x99, 0xAA, 0xBC, 0xDE, 0xDC, 0xCB, 0xAA, 0x98, 0x87, 0x77, 0x78, 0x89, - 0xAA, 0xCD, 0xDD, 0xCC, 0xBA, 0x98, 0x87, 0x66, 0x66, 0x77, 0x89, 0xAB, - 0xCE, 0xDC, 0xCB, 0xA9, 0x87, 0x66, 0x55, 0x66, 0x78, 0x8A, 0xBC, 0xDD, - 0xCC, 0xA9, 0x87, 0x66, 0x55, 0x55, 0x66, 0x78, 0x9B, 0xBC, 0xDB, 0xBA, - 0x98, 0x76, 0x55, 0x44, 0x45, 0x67, 0x89, 0xAC, 0xCC, 0xCB, 0xB9, 0x87, - 0x65, 0x54, 0x34, 0x56, 0x78, 0x9A, 0xCC, 0xCC, 0xCA, 0x98, 0x76, 0x55, - 0x54, 0x56, 0x67, 0x89, 0xAB, 0xDC, 0xCC, 0xBA, 0x98, 0x76, 0x65, 0x56, - 0x67, 0x89, 0x9A, 0xCC, 0xCC, 0xCB, 0xA9, 0x87, 0x76, 0x66, 0x67, 0x78, - 0x9A, 0xBC, 0xDC, 0xCC, 0xBB, 0xA9, 0x88, 0x77, 0x77, 0x88, 0x9A, 0xBB, - 0xCD, 0xDD, 0xEC, 0xCB, 0xA9, 0x98, 0x88, 0x89, 0x9A, 0xAB, 0xCC, 0xDD, - 0xDD, 0xEC, 0xBB, 0xAA, 0x99, 0x99, 0xAA, 0xAB, 0xCC, 0xDD, 0xDD, 0xFE, - 0xDC, 0xCB, 0xBB, 0xAA, 0xAB, 0xBB, 0xBC, 0xDD, 0xED, 0xEF, 0xEE, 0xDD, - 0xCC, 0xCB, 0xBB, 0xCC, 0xCC, 0xDD, 0xDE, 0xEE, 0xFF, 0xEE, 0xDE, 0xDD, - 0xCD, 0xDC, 0xDD, 0xED, 0xEF, 0xEE, 0x9E, 0xEE, 0xDD, 0xDD, 0xDC, 0xCC, - 0xCC, 0xCD, 0xDD, 0xDE, 0xC0, 0x00, 0x00, 0x00, - ], - [ - 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xAF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xED, 0xDD, 0xDD, 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, 0xDC, 0xCB, - 0xBB, 0xCC, 0xDD, 0xFF, 0xFF, 0xFF, 0xFF, 0xED, 0xDC, 0xBA, 0xAA, 0xAA, - 0xBB, 0xCD, 0xFF, 0xFF, 0xFF, 0xFF, 0xDC, 0xBA, 0x98, 0x88, 0x89, 0xAB, - 0xCD, 0xFF, 0xFF, 0xFF, 0xEC, 0xBA, 0x98, 0x76, 0x67, 0x89, 0xAB, 0xDD, - 0xFF, 0xFF, 0xED, 0xCA, 0x98, 0x66, 0x55, 0x66, 0x89, 0xBC, 0xDF, 0xFF, - 0xFF, 0xDB, 0xA8, 0x76, 0x54, 0x44, 0x67, 0x8A, 0xBC, 0xFF, 0xFF, 0xFD, - 0xBA, 0x87, 0x54, 0x33, 0x45, 0x68, 0xAB, 0xEF, 0xFF, 0xFF, 0xDB, 0xA8, - 0x65, 0x43, 0x34, 0x56, 0x8A, 0xBD, 0xEF, 0xFE, 0xFD, 0xCA, 0x87, 0x64, - 0x44, 0x56, 0x78, 0xAB, 0xDE, 0xFF, 0xEF, 0xDC, 0xB9, 0x86, 0x65, 0x56, - 0x67, 0x9A, 0xCD, 0xFF, 0xFE, 0xFF, 0xDC, 0xA9, 0x87, 0x66, 0x77, 0x8A, - 0xBC, 0xDF, 0xFF, 0xEF, 0xFD, 0xCB, 0xA9, 0x88, 0x88, 0x9A, 0xBB, 0xDE, - 0xFF, 0xFF, 0xFF, 0xED, 0xCB, 0xAA, 0xA9, 0xAA, 0xBB, 0xCD, 0xFF, 0xFF, - 0xFF, 0xFF, 0xDD, 0xDC, 0xCB, 0xBB, 0xBC, 0xCE, 0xFF, 0xFF, 0xFD, 0xFF, - 0xFF, 0xFF, 0xDD, 0xDD, 0xDD, 0xDF, 0xFF, 0xFF, 0xFF, 0xEF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xEE, 0xEF, 0xFF, 0xFF, 0xFF, 0xFD, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x8D, 0xDD, 0xDD, 0xDF, 0xEE, 0xEF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xD0, 0x00, 0x00, 0x00, - ], - [ - 0xEF, 0xED, 0xED, 0xDD, 0xCC, 0xCD, 0xDD, 0xDD, 0xED, 0xDE, 0x9E, 0xFF, - 0xFE, 0xDD, 0xDC, 0xCC, 0xDD, 0xDE, 0xEE, 0xFE, 0xFE, 0xFE, 0xED, 0xDD, - 0xCC, 0xBB, 0xBB, 0xCC, 0xDD, 0xEE, 0xEF, 0xED, 0xFE, 0xDC, 0xBB, 0xAA, - 0xAA, 0xAA, 0xBC, 0xCD, 0xEF, 0xFF, 0xDE, 0xDC, 0xBA, 0xA9, 0x99, 0x99, - 0x9A, 0xBC, 0xCD, 0xEF, 0xEC, 0xDC, 0xBB, 0xA9, 0x88, 0x77, 0x88, 0x9A, - 0xBC, 0xCE, 0xEE, 0xDD, 0xCB, 0xA9, 0x87, 0x66, 0x66, 0x78, 0x9A, 0xBC, - 0xEF, 0xDD, 0xCB, 0xA9, 0x87, 0x66, 0x55, 0x66, 0x78, 0x9A, 0xCD, 0xEE, - 0xDC, 0xBA, 0x98, 0x66, 0x54, 0x45, 0x56, 0x89, 0xAC, 0xCD, 0xDC, 0xCB, - 0xA9, 0x76, 0x54, 0x44, 0x45, 0x67, 0x9A, 0xBC, 0xED, 0xCC, 0xBA, 0x97, - 0x65, 0x44, 0x44, 0x56, 0x79, 0xAB, 0xDD, 0xDD, 0xDB, 0xA9, 0x86, 0x55, - 0x44, 0x55, 0x67, 0x9A, 0xBD, 0xDD, 0xDE, 0xCB, 0x98, 0x76, 0x55, 0x55, - 0x67, 0x89, 0xAB, 0xDE, 0xED, 0xDC, 0xBA, 0x98, 0x76, 0x66, 0x67, 0x89, - 0xAB, 0xCD, 0xEE, 0xDE, 0xDC, 0xAA, 0x98, 0x87, 0x78, 0x89, 0x9A, 0xBC, - 0xDE, 0xED, 0xED, 0xDB, 0xBA, 0x99, 0x99, 0x99, 0x9A, 0xBC, 0xDD, 0xEF, - 0xEE, 0xED, 0xCB, 0xBA, 0xAA, 0xAA, 0xBB, 0xBC, 0xCD, 0xEF, 0xFD, 0xEF, - 0xDD, 0xDC, 0xCB, 0xBB, 0xBB, 0xCC, 0xDE, 0xEE, 0xFF, 0xDF, 0xFF, 0xED, - 0xDD, 0xCC, 0xDD, 0xCD, 0xDE, 0xEF, 0xFF, 0xFD, 0xFF, 0xFF, 0xEE, 0xEE, - 0xDF, 0xDE, 0xEE, 0xEF, 0xFF, 0xFF, 0x9D, 0xED, 0xDE, 0xDE, 0xDE, 0xED, - 0xEE, 0xEE, 0xFF, 0xEF, 0xE0, 0x00, 0x00, 0x00, - ], - [ - 0xDE, 0xED, 0xDC, 0xCC, 0xBC, 0xCC, 0xCC, 0xDD, 0xDD, 0xDD, 0xAE, 0xFE, - 0xDD, 0xCC, 0xCB, 0xBB, 0xCC, 0xCC, 0xDE, 0xEF, 0xFE, 0xDE, 0xDC, 0xCB, - 0xBA, 0xAA, 0xAA, 0xBB, 0xCC, 0xDE, 0xEF, 0xED, 0xDC, 0xCB, 0xAA, 0x99, - 0x99, 0x99, 0xAB, 0xBC, 0xDE, 0xEE, 0xCD, 0xCB, 0xA9, 0x98, 0x88, 0x88, - 0x89, 0xAA, 0xBC, 0xDE, 0xEC, 0xCB, 0xA9, 0x98, 0x87, 0x77, 0x77, 0x89, - 0xAA, 0xCC, 0xED, 0xCC, 0xBA, 0x98, 0x77, 0x66, 0x66, 0x77, 0x89, 0xAB, - 0xCD, 0xDC, 0xBA, 0x98, 0x87, 0x65, 0x55, 0x56, 0x77, 0x89, 0xBC, 0xDD, - 0xCB, 0xA9, 0x87, 0x65, 0x55, 0x55, 0x56, 0x78, 0x9A, 0xBD, 0xDB, 0xBA, - 0x98, 0x76, 0x55, 0x44, 0x55, 0x67, 0x89, 0xAB, 0xCD, 0xCB, 0xA9, 0x87, - 0x65, 0x54, 0x45, 0x56, 0x78, 0x9A, 0xBC, 0xCC, 0xBA, 0x98, 0x76, 0x55, - 0x55, 0x55, 0x67, 0x89, 0xAB, 0xDD, 0xCC, 0xBA, 0x87, 0x76, 0x55, 0x55, - 0x67, 0x78, 0x9A, 0xBD, 0xDC, 0xCB, 0xA9, 0x87, 0x76, 0x66, 0x67, 0x78, - 0x9A, 0xBC, 0xDD, 0xDD, 0xCB, 0xA9, 0x87, 0x77, 0x77, 0x88, 0x99, 0xAB, - 0xCD, 0xDD, 0xDC, 0xBA, 0xA9, 0x88, 0x88, 0x88, 0x99, 0xAB, 0xCD, 0xDE, - 0xDE, 0xDC, 0xBB, 0xAA, 0x99, 0x99, 0x9A, 0xAB, 0xCC, 0xDE, 0xEE, 0xEE, - 0xDC, 0xCB, 0xBA, 0xAA, 0xAA, 0xBB, 0xCC, 0xDE, 0xFE, 0xDF, 0xED, 0xDD, - 0xCC, 0xCB, 0xBB, 0xBC, 0xCC, 0xDE, 0xEF, 0xED, 0xFF, 0xEE, 0xED, 0xDD, - 0xCD, 0xCD, 0xDD, 0xEE, 0xFF, 0xFF, 0xAE, 0xEE, 0xDD, 0xDD, 0xDD, 0xDD, - 0xDD, 0xDE, 0xEE, 0xEF, 0xE0, 0x00, 0x00, 0x00, - ], - [ - 0xCF, 0xED, 0xDD, 0xDC, 0xDC, 0xDC, 0xCC, 0xCD, 0xDD, 0xDD, 0x8E, 0xFE, - 0xEE, 0xDD, 0xDC, 0xCC, 0xCD, 0xDD, 0xEE, 0xEE, 0xFE, 0xEF, 0xEE, 0xDC, - 0xCC, 0xBB, 0xBB, 0xCC, 0xCD, 0xDE, 0xEF, 0xDE, 0xFE, 0xDC, 0xBB, 0xAA, - 0xAA, 0xAB, 0xBC, 0xCD, 0xDD, 0xED, 0xDE, 0xDC, 0xBB, 0xA9, 0x99, 0x99, - 0x9A, 0xBB, 0xCD, 0xDF, 0xDD, 0xEC, 0xBA, 0x99, 0x88, 0x77, 0x88, 0x9A, - 0xBB, 0xDD, 0xFD, 0xDD, 0xCB, 0xA9, 0x87, 0x66, 0x66, 0x78, 0x9A, 0xBC, - 0xDD, 0xEC, 0xDC, 0xA9, 0x87, 0x66, 0x55, 0x56, 0x78, 0x9A, 0xBD, 0xEC, - 0xCC, 0xBA, 0x98, 0x75, 0x54, 0x45, 0x56, 0x89, 0xAB, 0xCE, 0xDC, 0xCB, - 0xA8, 0x76, 0x54, 0x44, 0x45, 0x67, 0x9A, 0xBC, 0xDD, 0xCC, 0xBA, 0x97, - 0x65, 0x44, 0x44, 0x56, 0x79, 0xAB, 0xCD, 0xDC, 0xDC, 0xA9, 0x86, 0x55, - 0x44, 0x55, 0x78, 0x9A, 0xBC, 0xDD, 0xDD, 0xCA, 0x98, 0x76, 0x55, 0x56, - 0x67, 0x89, 0xAC, 0xDD, 0xDD, 0xDC, 0xBA, 0x98, 0x76, 0x66, 0x77, 0x89, - 0xAB, 0xBD, 0xED, 0xCD, 0xDC, 0xB9, 0x98, 0x87, 0x78, 0x89, 0x9A, 0xBC, - 0xDE, 0xED, 0xDE, 0xCB, 0xBA, 0x99, 0x98, 0x99, 0xAB, 0xBB, 0xCD, 0xEE, - 0xDE, 0xED, 0xDC, 0xBA, 0xAA, 0xAA, 0xAB, 0xBC, 0xCD, 0xEE, 0xDD, 0xEE, - 0xDC, 0xDC, 0xBC, 0xBC, 0xBB, 0xCC, 0xCD, 0xDD, 0xFD, 0xDF, 0xEE, 0xDE, - 0xDC, 0xCD, 0xCD, 0xDD, 0xDD, 0xDE, 0xEE, 0xED, 0xEF, 0xEF, 0xFF, 0xEE, - 0xED, 0xDE, 0xED, 0xDD, 0xFF, 0xFD, 0x9D, 0xDD, 0xDE, 0xCD, 0xDC, 0xDD, - 0xDD, 0xED, 0xDE, 0xEF, 0xC0, 0x00, 0x00, 0x00, - ], - [ - 0xDF, 0xFF, 0xFF, 0xFF, 0xFE, 0xFF, 0xFF, 0xFD, 0xDF, 0xDD, 0x8F, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, 0xDC, - 0xCD, 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, 0xCC, 0xBB, 0xBB, - 0xCC, 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, 0xBB, 0xA9, 0x99, 0x9A, 0xBC, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xCB, 0x98, 0x87, 0x78, 0x8A, 0xBC, 0xFF, - 0xFF, 0xFF, 0xFF, 0xCB, 0xA8, 0x76, 0x55, 0x67, 0x9A, 0xCD, 0xFF, 0xFF, - 0xFF, 0xFD, 0xB9, 0x76, 0x54, 0x45, 0x68, 0x9B, 0xCF, 0xFF, 0xFF, 0xFF, - 0xCB, 0x97, 0x54, 0x23, 0x45, 0x79, 0xBC, 0xFF, 0xFF, 0xFF, 0xFC, 0xA9, - 0x75, 0x43, 0x24, 0x57, 0x9B, 0xCF, 0xFF, 0xFF, 0xFF, 0xDB, 0x98, 0x65, - 0x44, 0x56, 0x79, 0xBC, 0xFF, 0xFF, 0xFF, 0xFD, 0xCA, 0x87, 0x65, 0x56, - 0x78, 0xAB, 0xCF, 0xFF, 0xFF, 0xFF, 0xDC, 0xBA, 0x88, 0x77, 0x78, 0x9A, - 0xCF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xBA, 0x99, 0x99, 0xAA, 0xCD, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xDC, 0xBB, 0xBA, 0xBB, 0xCD, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xDD, 0xFC, 0xCC, 0xCF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xAF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00, 0x00, - ], - [ - 0xCE, 0xDD, 0xDD, 0xCC, 0xCC, 0xCC, 0xCC, 0xCD, 0xDD, 0xDD, 0x9E, 0xEF, - 0xDD, 0xCC, 0xCB, 0xCC, 0xCC, 0xCD, 0xDE, 0xFF, 0xFE, 0xDE, 0xED, 0xCC, - 0xCB, 0xBA, 0xBA, 0xBB, 0xCD, 0xCD, 0xEE, 0xEE, 0xED, 0xCC, 0xBA, 0xA9, - 0x99, 0x9A, 0xBB, 0xBD, 0xDD, 0xFE, 0xDE, 0xCB, 0xBA, 0x99, 0x88, 0x88, - 0x99, 0xAB, 0xBC, 0xDE, 0xDC, 0xCC, 0xBA, 0x98, 0x87, 0x77, 0x78, 0x89, - 0xAB, 0xCD, 0xEE, 0xCD, 0xBA, 0x98, 0x87, 0x66, 0x66, 0x78, 0x89, 0xBB, - 0xCE, 0xDC, 0xCB, 0xA9, 0x87, 0x66, 0x55, 0x66, 0x78, 0x9A, 0xBC, 0xDD, - 0xCC, 0xBA, 0x87, 0x66, 0x54, 0x45, 0x56, 0x78, 0x9B, 0xCD, 0xCB, 0xCB, - 0x98, 0x76, 0x55, 0x44, 0x45, 0x67, 0x89, 0xBC, 0xCD, 0xCC, 0xB9, 0x87, - 0x65, 0x54, 0x44, 0x56, 0x78, 0x9A, 0xBD, 0xDC, 0xCB, 0xA8, 0x76, 0x65, - 0x44, 0x56, 0x67, 0x89, 0xAC, 0xDD, 0xCC, 0xBA, 0x98, 0x76, 0x65, 0x56, - 0x67, 0x89, 0xAB, 0xCD, 0xDC, 0xCC, 0xA9, 0x88, 0x76, 0x66, 0x67, 0x88, - 0x9A, 0xBC, 0xDD, 0xCD, 0xCB, 0xA9, 0x88, 0x77, 0x77, 0x88, 0x9A, 0xBC, - 0xDD, 0xDC, 0xEC, 0xBB, 0xA9, 0x98, 0x88, 0x99, 0x99, 0xBB, 0xCD, 0xDD, - 0xCE, 0xDC, 0xCB, 0xAA, 0xA9, 0x99, 0xAA, 0xBB, 0xBD, 0xDF, 0xDD, 0xEE, - 0xDD, 0xCB, 0xBB, 0xBA, 0xAB, 0xBC, 0xCD, 0xDE, 0xFE, 0xDE, 0xEE, 0xDD, - 0xCC, 0xCC, 0xCC, 0xCC, 0xDD, 0xDE, 0xEF, 0xED, 0xFF, 0xEE, 0xDD, 0xDD, - 0xDC, 0xDE, 0xDD, 0xEE, 0xEF, 0xFD, 0x8D, 0xDD, 0xDC, 0xCC, 0xCC, 0xCC, - 0xDC, 0xDD, 0xDE, 0xDE, 0xC0, 0x00, 0x00, 0x00, - ], - [ - 0xAC, 0xBB, 0xBA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xBB, 0xBC, 0x8C, 0xDC, - 0xCB, 0xBB, 0xBA, 0xAA, 0xAA, 0xBB, 0xBC, 0xCD, 0xDC, 0xBC, 0xCB, 0xBA, - 0xAA, 0x99, 0x99, 0x9A, 0xAB, 0xBC, 0xDC, 0xCB, 0xCB, 0xBA, 0xA9, 0x98, - 0x88, 0x99, 0x99, 0xAB, 0xBC, 0xDC, 0xBC, 0xBA, 0x99, 0x88, 0x88, 0x88, - 0x88, 0x99, 0xAB, 0xCC, 0xBA, 0xBA, 0x99, 0x88, 0x77, 0x77, 0x77, 0x88, - 0x99, 0xAB, 0xCB, 0xAB, 0xA9, 0x88, 0x77, 0x66, 0x66, 0x77, 0x88, 0x9A, - 0xBC, 0xBA, 0xA9, 0x98, 0x77, 0x66, 0x55, 0x66, 0x77, 0x89, 0x9A, 0xBB, - 0xAA, 0x99, 0x87, 0x66, 0x55, 0x55, 0x66, 0x78, 0x89, 0xAB, 0xBA, 0xA9, - 0x87, 0x76, 0x55, 0x55, 0x55, 0x67, 0x78, 0x9A, 0xBB, 0xAA, 0x98, 0x77, - 0x65, 0x55, 0x55, 0x56, 0x77, 0x89, 0xAB, 0xBA, 0xA9, 0x88, 0x76, 0x65, - 0x55, 0x56, 0x67, 0x88, 0x9A, 0xBB, 0xAA, 0xA9, 0x87, 0x66, 0x65, 0x56, - 0x66, 0x78, 0x99, 0xAB, 0xBA, 0xBA, 0x98, 0x87, 0x76, 0x66, 0x66, 0x78, - 0x89, 0xAB, 0xBB, 0xAB, 0xA9, 0x98, 0x87, 0x77, 0x77, 0x77, 0x89, 0x9A, - 0xBC, 0xBB, 0xBB, 0xA9, 0x98, 0x88, 0x77, 0x88, 0x89, 0x9A, 0xAB, 0xCB, - 0xBC, 0xBB, 0xA9, 0x99, 0x88, 0x88, 0x99, 0x9A, 0xAB, 0xCD, 0xCC, 0xCC, - 0xBA, 0xAA, 0x99, 0x99, 0x99, 0xAA, 0xBB, 0xCD, 0xEC, 0xCD, 0xDC, 0xBB, - 0xBA, 0xAA, 0xAA, 0xAB, 0xBC, 0xCC, 0xDE, 0xCC, 0xED, 0xCC, 0xCC, 0xCB, - 0xBB, 0xBB, 0xBC, 0xCC, 0xDE, 0xDD, 0x8C, 0xCB, 0xCB, 0xBB, 0xBB, 0xBB, - 0xBB, 0xCB, 0xCC, 0xCC, 0xB0, 0x00, 0x00, 0x00, - ], - [ - 0x9B, 0xAA, 0xA9, 0x99, 0x99, 0x99, 0x99, 0xAA, 0xAB, 0xBB, 0x9B, 0xCB, - 0xBA, 0xAA, 0xA9, 0x99, 0xAA, 0xAA, 0xBB, 0xCC, 0xDC, 0xAB, 0xBA, 0xA9, - 0x99, 0x99, 0x99, 0x99, 0xAA, 0xAB, 0xCC, 0xBA, 0xBA, 0xA9, 0x98, 0x88, - 0x88, 0x88, 0x99, 0x9A, 0xAB, 0xCB, 0xAA, 0xA9, 0x98, 0x88, 0x77, 0x77, - 0x88, 0x89, 0xAA, 0xBB, 0xA9, 0xAA, 0x98, 0x87, 0x77, 0x77, 0x77, 0x78, - 0x89, 0xAA, 0xBA, 0x9A, 0x98, 0x87, 0x77, 0x66, 0x66, 0x77, 0x78, 0x99, - 0xAA, 0xA9, 0xA9, 0x88, 0x77, 0x66, 0x66, 0x66, 0x77, 0x88, 0x9A, 0xAA, - 0x99, 0x98, 0x77, 0x66, 0x65, 0x56, 0x66, 0x77, 0x89, 0xAA, 0xA9, 0x99, - 0x87, 0x76, 0x65, 0x55, 0x56, 0x67, 0x78, 0x99, 0xAA, 0x9A, 0x98, 0x77, - 0x66, 0x55, 0x55, 0x66, 0x77, 0x89, 0x9A, 0xA9, 0xA9, 0x87, 0x76, 0x66, - 0x55, 0x66, 0x67, 0x78, 0x99, 0xAA, 0x9A, 0x98, 0x87, 0x76, 0x66, 0x66, - 0x67, 0x78, 0x89, 0xAA, 0xA9, 0xA9, 0x98, 0x77, 0x76, 0x66, 0x67, 0x77, - 0x88, 0x9A, 0xBA, 0xAA, 0xA9, 0x88, 0x77, 0x77, 0x77, 0x77, 0x88, 0x99, - 0xAB, 0xAA, 0xBA, 0x99, 0x88, 0x87, 0x77, 0x78, 0x88, 0x99, 0xAA, 0xBA, - 0xAB, 0xBA, 0x99, 0x98, 0x88, 0x88, 0x88, 0x99, 0xAA, 0xBB, 0xBB, 0xBB, - 0xAA, 0xA9, 0x99, 0x99, 0x99, 0x99, 0xAA, 0xBB, 0xCB, 0xBC, 0xCB, 0xBA, - 0xAA, 0xA9, 0x99, 0xAA, 0xAA, 0xBB, 0xCC, 0xBB, 0xCC, 0xCB, 0xBB, 0xBA, - 0xAA, 0xAA, 0xAB, 0xBB, 0xCC, 0xDC, 0x9B, 0xBB, 0xAA, 0xAA, 0xAA, 0xAA, - 0xAA, 0xAA, 0xBB, 0xBC, 0xA0, 0x00, 0x00, 0x00, - ], - [ - 0xAC, 0xBB, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xBB, 0xBB, 0x8B, 0xDC, - 0xCB, 0xBA, 0xAA, 0xAA, 0xAA, 0xBB, 0xBC, 0xCC, 0xDB, 0xBC, 0xCB, 0xAA, - 0xA9, 0x99, 0x99, 0xAA, 0xAB, 0xBC, 0xCD, 0xBB, 0xBB, 0xAA, 0x99, 0x98, - 0x88, 0x99, 0x9A, 0xAB, 0xBB, 0xDB, 0xBB, 0xAA, 0x99, 0x88, 0x88, 0x88, - 0x88, 0x99, 0xAB, 0xBC, 0xBA, 0xBA, 0x99, 0x88, 0x77, 0x77, 0x77, 0x88, - 0x9A, 0xAB, 0xCB, 0xAA, 0xA9, 0x88, 0x77, 0x66, 0x66, 0x77, 0x88, 0x9A, - 0xBB, 0xBA, 0xA9, 0x98, 0x77, 0x66, 0x55, 0x66, 0x77, 0x89, 0xAA, 0xBA, - 0xAA, 0x98, 0x87, 0x66, 0x55, 0x55, 0x66, 0x78, 0x89, 0xAB, 0xAA, 0xA9, - 0x88, 0x76, 0x55, 0x55, 0x55, 0x67, 0x88, 0x9A, 0xBA, 0xAA, 0x98, 0x87, - 0x65, 0x54, 0x55, 0x56, 0x78, 0x89, 0xAB, 0xAA, 0xAA, 0x98, 0x76, 0x65, - 0x55, 0x56, 0x67, 0x88, 0x9A, 0xBA, 0xAB, 0xA9, 0x87, 0x76, 0x65, 0x56, - 0x67, 0x78, 0x99, 0xAB, 0xAA, 0xBA, 0x98, 0x87, 0x76, 0x66, 0x66, 0x78, - 0x89, 0xAA, 0xBA, 0xAB, 0xAA, 0x98, 0x87, 0x77, 0x77, 0x78, 0x89, 0x9A, - 0xBB, 0xBA, 0xBB, 0xAA, 0x98, 0x88, 0x88, 0x88, 0x89, 0x9A, 0xAB, 0xCB, - 0xBC, 0xBB, 0xAA, 0x99, 0x98, 0x88, 0x99, 0x9A, 0xAB, 0xCC, 0xBB, 0xCC, - 0xBB, 0xAA, 0xA9, 0x99, 0x99, 0xAA, 0xAB, 0xCC, 0xCB, 0xBC, 0xCC, 0xBB, - 0xAB, 0xAA, 0xAA, 0xAA, 0xAB, 0xBC, 0xCD, 0xBC, 0xDC, 0xCC, 0xCB, 0xBB, - 0xBB, 0xBB, 0xBB, 0xCC, 0xCD, 0xDC, 0x8B, 0xBB, 0xBB, 0xAA, 0xAA, 0xAA, - 0xAA, 0xBB, 0xBC, 0xCC, 0xA0, 0x00, 0x00, 0x00, - ], - [ - 0xBE, 0xDD, 0xCC, 0xCC, 0xCC, 0xBC, 0xCC, 0xCC, 0xCC, 0xDC, 0x8E, 0xEE, - 0xDD, 0xDC, 0xCC, 0xCC, 0xCC, 0xCD, 0xDD, 0xEF, 0xFD, 0xEE, 0xED, 0xCC, - 0xBB, 0xBB, 0xBB, 0xBC, 0xCC, 0xDD, 0xEE, 0xDD, 0xED, 0xCC, 0xBA, 0xAA, - 0xA9, 0xAA, 0xAB, 0xCC, 0xDE, 0xFD, 0xCD, 0xDC, 0xBA, 0x99, 0x98, 0x89, - 0x9A, 0xAB, 0xCC, 0xDE, 0xDC, 0xDC, 0xBA, 0x98, 0x87, 0x77, 0x78, 0x99, - 0xAB, 0xCD, 0xED, 0xCD, 0xBB, 0x99, 0x87, 0x66, 0x66, 0x78, 0x8A, 0xBB, - 0xCD, 0xDD, 0xCB, 0xA9, 0x87, 0x66, 0x55, 0x66, 0x78, 0x9A, 0xBC, 0xDD, - 0xBC, 0xBA, 0x97, 0x66, 0x54, 0x45, 0x66, 0x89, 0xAB, 0xCD, 0xCC, 0xCB, - 0x98, 0x76, 0x54, 0x44, 0x45, 0x67, 0x89, 0xBC, 0xDD, 0xBC, 0xBA, 0x87, - 0x65, 0x44, 0x44, 0x56, 0x78, 0x9A, 0xCD, 0xCC, 0xCB, 0xA9, 0x86, 0x65, - 0x44, 0x56, 0x67, 0x9A, 0xAC, 0xDD, 0xCC, 0xBA, 0x98, 0x76, 0x65, 0x56, - 0x67, 0x89, 0xAB, 0xCD, 0xDC, 0xCC, 0xA9, 0x98, 0x76, 0x66, 0x67, 0x88, - 0x9A, 0xBC, 0xDD, 0xCD, 0xCB, 0xA9, 0x98, 0x87, 0x77, 0x88, 0x9A, 0xBC, - 0xDD, 0xDC, 0xDD, 0xCB, 0xA9, 0x99, 0x88, 0x99, 0x9A, 0xAB, 0xCD, 0xDD, - 0xCD, 0xDD, 0xCB, 0xBA, 0xAA, 0xAA, 0xAA, 0xBC, 0xCD, 0xEF, 0xDD, 0xEE, - 0xDC, 0xCB, 0xBB, 0xBA, 0xBB, 0xBC, 0xCC, 0xDE, 0xEE, 0xEE, 0xFE, 0xDD, - 0xCC, 0xBC, 0xCC, 0xCC, 0xDD, 0xDE, 0xFF, 0xED, 0xFE, 0xEE, 0xDD, 0xDD, - 0xDD, 0xDD, 0xDD, 0xEE, 0xEF, 0xFD, 0x9D, 0xED, 0xCC, 0xDC, 0xCC, 0xDC, - 0xDD, 0xDD, 0xEE, 0xED, 0xC0, 0x00, 0x00, 0x00, - ], - [ - 0xDF, 0xFF, 0xFF, 0xFF, 0xFE, 0xFF, 0xFE, 0xFF, 0xEE, 0xFE, 0x9F, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFD, 0xEE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xDC, - 0xDC, 0xDD, 0xEE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, 0xDC, 0xBB, 0xBB, - 0xCD, 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, 0xDB, 0xAA, 0x9A, 0xAB, 0xCC, - 0xDF, 0xFF, 0xFF, 0xFF, 0xFD, 0xCB, 0xA9, 0x88, 0x88, 0x9A, 0xBD, 0xEF, - 0xFF, 0xFF, 0xFF, 0xDC, 0xA9, 0x87, 0x66, 0x78, 0x9B, 0xCD, 0xFF, 0xFF, - 0xFF, 0xFD, 0xBA, 0x86, 0x54, 0x45, 0x78, 0xAC, 0xDE, 0xFF, 0xFF, 0xFF, - 0xDB, 0x98, 0x64, 0x22, 0x46, 0x89, 0xBC, 0xFF, 0xFF, 0xFF, 0xFD, 0xBA, - 0x86, 0x42, 0x24, 0x68, 0x9B, 0xDE, 0xFF, 0xFD, 0xFF, 0xCC, 0xA8, 0x75, - 0x44, 0x56, 0x8A, 0xBD, 0xFF, 0xFF, 0xFF, 0xED, 0xCB, 0x98, 0x76, 0x66, - 0x79, 0xAC, 0xDF, 0xFF, 0xFF, 0xFF, 0xFC, 0xCA, 0x98, 0x88, 0x89, 0xAB, - 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0xDC, 0xBB, 0xAA, 0x9A, 0xAB, 0xCD, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFE, 0xDD, 0xCB, 0xBB, 0xBC, 0xCD, 0xEF, 0xFF, 0xFF, - 0xEF, 0xFE, 0xFE, 0xDD, 0xDC, 0xCD, 0xDE, 0xFF, 0xFF, 0xFF, 0xFE, 0xFF, - 0xFF, 0xFF, 0xEF, 0xDE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xEF, 0xFF, 0xFF, - 0xEF, 0xFD, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x8D, 0xDD, 0xDD, 0xDE, 0xDE, 0xDE, - 0xFF, 0xFF, 0xFF, 0xFF, 0xD0, 0x00, 0x00, 0x00, - ], - [ - 0xCE, 0xED, 0xDC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCD, 0xCC, 0xDD, 0x9E, 0xEE, - 0xEE, 0xED, 0xDC, 0xCD, 0xCD, 0xDD, 0xDD, 0xEF, 0xED, 0xEE, 0xDD, 0xCC, - 0xCC, 0xBB, 0xCB, 0xCC, 0xDD, 0xDE, 0xEF, 0xDD, 0xEE, 0xCC, 0xBB, 0xAA, - 0xAA, 0xAB, 0xBC, 0xCC, 0xDE, 0xEE, 0xDE, 0xDC, 0xBA, 0xA9, 0x99, 0x99, - 0xAA, 0xBC, 0xCC, 0xDE, 0xDC, 0xDC, 0xBA, 0x99, 0x88, 0x78, 0x88, 0x9A, - 0xBC, 0xCD, 0xDD, 0xCD, 0xCB, 0xA9, 0x87, 0x66, 0x67, 0x78, 0x9A, 0xBC, - 0xDE, 0xDC, 0xDB, 0xA9, 0x87, 0x65, 0x55, 0x56, 0x78, 0xAB, 0xCD, 0xED, - 0xCD, 0xBA, 0x98, 0x65, 0x54, 0x45, 0x57, 0x89, 0xBB, 0xCD, 0xDC, 0xDB, - 0xA9, 0x76, 0x54, 0x44, 0x45, 0x68, 0x9A, 0xBC, 0xDD, 0xDD, 0xBA, 0x98, - 0x65, 0x44, 0x44, 0x56, 0x79, 0xAB, 0xCD, 0xDC, 0xDB, 0xA9, 0x87, 0x55, - 0x44, 0x55, 0x68, 0x9A, 0xCC, 0xED, 0xCC, 0xCB, 0xA8, 0x76, 0x55, 0x55, - 0x67, 0x89, 0xAB, 0xDD, 0xDC, 0xDC, 0xBA, 0x98, 0x77, 0x66, 0x67, 0x89, - 0xAB, 0xCD, 0xED, 0xCD, 0xCC, 0xBA, 0x98, 0x88, 0x78, 0x89, 0x9A, 0xCC, - 0xDE, 0xEC, 0xDC, 0xCB, 0xBA, 0x99, 0x99, 0x99, 0xAA, 0xBC, 0xDD, 0xEE, - 0xDD, 0xDD, 0xCB, 0xBA, 0xAA, 0xAA, 0xBB, 0xBC, 0xDE, 0xEE, 0xED, 0xED, - 0xDD, 0xDC, 0xCB, 0xBB, 0xBB, 0xBD, 0xCD, 0xFE, 0xEE, 0xCE, 0xEE, 0xDD, - 0xDD, 0xDC, 0xDD, 0xDD, 0xDE, 0xEE, 0xEE, 0xEC, 0xFE, 0xEE, 0xFE, 0xFD, - 0xDD, 0xDD, 0xEE, 0xEF, 0xEF, 0xFE, 0x8D, 0xDC, 0xDD, 0xDD, 0xCD, 0xDD, - 0xDD, 0xDD, 0xDE, 0xFE, 0xD0, 0x00, 0x00, 0x00, - ], - [ - 0xCE, 0xDD, 0xCC, 0xCB, 0xBB, 0xBB, 0xBB, 0xCC, 0xCD, 0xDD, 0xAD, 0xEE, - 0xDD, 0xCC, 0xBB, 0xBB, 0xBB, 0xCC, 0xDD, 0xDE, 0xFD, 0xDE, 0xDC, 0xCB, - 0xBA, 0xAA, 0xAA, 0xAB, 0xBC, 0xCD, 0xEE, 0xDD, 0xDC, 0xCB, 0xAA, 0x99, - 0x99, 0x99, 0xAA, 0xBC, 0xCD, 0xDD, 0xCD, 0xCB, 0xA9, 0x98, 0x88, 0x88, - 0x89, 0xAA, 0xBC, 0xDD, 0xCC, 0xCB, 0xA9, 0x88, 0x77, 0x77, 0x77, 0x89, - 0x9A, 0xBC, 0xDC, 0xCC, 0xAA, 0x98, 0x77, 0x66, 0x66, 0x77, 0x89, 0xAB, - 0xCD, 0xCB, 0xBA, 0x98, 0x77, 0x65, 0x55, 0x66, 0x78, 0x89, 0xAC, 0xCC, - 0xBB, 0xA9, 0x87, 0x65, 0x55, 0x55, 0x56, 0x78, 0x9A, 0xBC, 0xCB, 0xBA, - 0x98, 0x76, 0x55, 0x44, 0x55, 0x67, 0x89, 0xAB, 0xCC, 0xBB, 0xA9, 0x87, - 0x65, 0x54, 0x45, 0x56, 0x78, 0x9A, 0xBC, 0xCB, 0xBA, 0x98, 0x76, 0x65, - 0x55, 0x55, 0x67, 0x89, 0xAB, 0xDC, 0xBB, 0xB9, 0x88, 0x76, 0x55, 0x55, - 0x66, 0x78, 0x9A, 0xBC, 0xCB, 0xCB, 0xA9, 0x87, 0x76, 0x66, 0x67, 0x78, - 0x9A, 0xBC, 0xDC, 0xCC, 0xBA, 0xA9, 0x88, 0x77, 0x77, 0x78, 0x89, 0xAB, - 0xCD, 0xDC, 0xDC, 0xBA, 0x99, 0x88, 0x88, 0x88, 0x99, 0xAB, 0xCC, 0xED, - 0xCD, 0xCC, 0xBA, 0xA9, 0x99, 0x99, 0x9A, 0xAB, 0xBC, 0xDE, 0xDD, 0xDD, - 0xDC, 0xBB, 0xAA, 0xAA, 0xAA, 0xBB, 0xCC, 0xDE, 0xFE, 0xDE, 0xDD, 0xCC, - 0xCB, 0xBB, 0xBB, 0xBC, 0xCD, 0xDE, 0xEF, 0xED, 0xEE, 0xED, 0xDD, 0xCC, - 0xCC, 0xCC, 0xDD, 0xDE, 0xEF, 0xFF, 0xAD, 0xDD, 0xCD, 0xCC, 0xCC, 0xCC, - 0xCD, 0xDD, 0xDE, 0xEE, 0xD0, 0x00, 0x00, 0x00, - ], - [ - 0xCD, 0xDD, 0xDC, 0xCC, 0xCC, 0xCB, 0xCC, 0xCC, 0xCC, 0xDC, 0x9D, 0xFE, - 0xED, 0xDC, 0xCC, 0xCC, 0xCC, 0xCD, 0xDD, 0xDE, 0xED, 0xDE, 0xED, 0xCC, - 0xBB, 0xBB, 0xBB, 0xBB, 0xCC, 0xCD, 0xDE, 0xDD, 0xEC, 0xCB, 0xBA, 0xAA, - 0xAA, 0xAA, 0xAB, 0xBC, 0xDE, 0xDC, 0xCD, 0xDC, 0xBA, 0x99, 0x98, 0x99, - 0x9A, 0xAB, 0xBC, 0xDE, 0xCC, 0xDC, 0xBA, 0x98, 0x87, 0x77, 0x88, 0x9A, - 0xAB, 0xCC, 0xDC, 0xCC, 0xBA, 0xA8, 0x87, 0x66, 0x67, 0x78, 0x9A, 0xBB, - 0xCD, 0xCC, 0xCB, 0xA9, 0x87, 0x65, 0x55, 0x66, 0x78, 0x9A, 0xBC, 0xDC, - 0xCC, 0xBA, 0x98, 0x65, 0x54, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xCC, 0xCB, - 0xA8, 0x76, 0x54, 0x44, 0x45, 0x67, 0x9A, 0xBC, 0xDC, 0xCC, 0xBA, 0x97, - 0x65, 0x44, 0x44, 0x56, 0x79, 0xAB, 0xCD, 0xCC, 0xCB, 0xA9, 0x87, 0x65, - 0x44, 0x55, 0x68, 0x9A, 0xBC, 0xDC, 0xCC, 0xBA, 0x98, 0x76, 0x65, 0x55, - 0x67, 0x89, 0xAB, 0xCD, 0xCC, 0xCB, 0xBA, 0x98, 0x77, 0x66, 0x67, 0x88, - 0xAA, 0xBC, 0xDC, 0xCD, 0xCB, 0xA9, 0x98, 0x87, 0x77, 0x89, 0x9A, 0xBC, - 0xDE, 0xDC, 0xDC, 0xBB, 0xAA, 0x99, 0x98, 0x99, 0x9A, 0xBB, 0xCD, 0xED, - 0xCD, 0xDC, 0xCB, 0xAA, 0xAA, 0xAA, 0xAA, 0xBB, 0xCD, 0xEE, 0xDC, 0xED, - 0xCC, 0xCB, 0xBB, 0xBB, 0xBB, 0xBC, 0xCD, 0xDE, 0xED, 0xDE, 0xDD, 0xDC, - 0xCC, 0xCC, 0xCC, 0xCC, 0xDD, 0xDE, 0xEF, 0xDD, 0xEE, 0xED, 0xDD, 0xDD, - 0xDC, 0xDD, 0xDD, 0xEE, 0xEF, 0xFE, 0x9D, 0xDC, 0xDC, 0xCC, 0xCC, 0xCC, - 0xCC, 0xDD, 0xDD, 0xDE, 0xC0, 0x00, 0x00, 0x00, - ], - [ - 0xDF, 0xFF, 0xFE, 0xEE, 0xDD, 0xDD, 0xDD, 0xDC, 0xDD, 0xDD, 0x8F, 0xFF, - 0xFF, 0xFF, 0xEE, 0xED, 0xDF, 0xDE, 0xFF, 0xFF, 0xFE, 0xFF, 0xFF, 0xED, - 0xDC, 0xDD, 0xDC, 0xDD, 0xDE, 0xFF, 0xFF, 0xEE, 0xFF, 0xDD, 0xDC, 0xCB, - 0xBB, 0xBB, 0xCC, 0xDE, 0xFF, 0xFE, 0xFF, 0xED, 0xDC, 0xBA, 0xAA, 0xAA, - 0xAB, 0xCD, 0xDE, 0xFF, 0xED, 0xFE, 0xDC, 0xBA, 0x98, 0x88, 0x89, 0xAB, - 0xCD, 0xEF, 0xFF, 0xDF, 0xDC, 0xBA, 0x98, 0x76, 0x77, 0x89, 0xAB, 0xCD, - 0xFF, 0xFE, 0xED, 0xCA, 0x98, 0x66, 0x55, 0x67, 0x89, 0xBC, 0xDE, 0xFE, - 0xED, 0xDB, 0xA8, 0x76, 0x44, 0x44, 0x67, 0x8A, 0xBD, 0xDF, 0xFD, 0xFC, - 0xBA, 0x86, 0x54, 0x33, 0x45, 0x78, 0xAB, 0xCE, 0xFE, 0xEE, 0xCB, 0xA8, - 0x75, 0x43, 0x34, 0x57, 0x89, 0xBC, 0xFF, 0xFE, 0xED, 0xBA, 0x87, 0x65, - 0x44, 0x45, 0x78, 0xAB, 0xDE, 0xFF, 0xDF, 0xDC, 0xA9, 0x87, 0x65, 0x56, - 0x68, 0x9A, 0xCD, 0xEF, 0xFE, 0xEE, 0xCB, 0xA9, 0x87, 0x76, 0x78, 0x8A, - 0xBC, 0xDF, 0xFF, 0xDE, 0xED, 0xCB, 0xA9, 0x98, 0x88, 0x9A, 0xBC, 0xDE, - 0xFF, 0xFE, 0xEE, 0xDD, 0xCB, 0xAA, 0x99, 0xAA, 0xBC, 0xCE, 0xFF, 0xFF, - 0xEF, 0xFF, 0xDD, 0xCC, 0xBB, 0xBB, 0xCC, 0xDE, 0xEF, 0xFF, 0xFE, 0xFE, - 0xEF, 0xDD, 0xDC, 0xCD, 0xCD, 0xDE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xFF, - 0xEE, 0xED, 0xDE, 0xEE, 0xEF, 0xFF, 0xFF, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x9E, 0xDF, 0xFF, 0xFF, 0xFD, 0xFE, - 0xFF, 0xFF, 0xFF, 0xFF, 0xE0, 0x00, 0x00, 0x00, - ], - [ - 0xCE, 0xED, 0xDD, 0xDC, 0xCC, 0xCC, 0xCC, 0xCC, 0xDD, 0xDD, 0x9E, 0xFF, - 0xEE, 0xDE, 0xDC, 0xCC, 0xCD, 0xDD, 0xEE, 0xEF, 0xFE, 0xFF, 0xED, 0xDC, - 0xCB, 0xBB, 0xBB, 0xCC, 0xCD, 0xEE, 0xFF, 0xDD, 0xFE, 0xCC, 0xBB, 0xAA, - 0xAA, 0xAA, 0xBB, 0xCD, 0xDD, 0xEE, 0xDE, 0xDC, 0xBA, 0xA9, 0x99, 0x99, - 0x9A, 0xAB, 0xDE, 0xDE, 0xDD, 0xEC, 0xCA, 0x99, 0x88, 0x77, 0x88, 0x9A, - 0xBB, 0xCD, 0xED, 0xCD, 0xCB, 0xA9, 0x87, 0x66, 0x67, 0x78, 0x9A, 0xBC, - 0xDD, 0xDC, 0xDB, 0xA9, 0x87, 0x65, 0x55, 0x66, 0x78, 0x9A, 0xBC, 0xED, - 0xCC, 0xCA, 0x98, 0x65, 0x54, 0x45, 0x66, 0x89, 0xAB, 0xDD, 0xDC, 0xCB, - 0xA8, 0x76, 0x54, 0x44, 0x45, 0x67, 0x9A, 0xBD, 0xDC, 0xCC, 0xBA, 0x87, - 0x65, 0x44, 0x44, 0x56, 0x78, 0xAB, 0xCD, 0xEC, 0xCB, 0xA9, 0x86, 0x65, - 0x44, 0x55, 0x68, 0x9A, 0xBD, 0xDD, 0xCD, 0xCB, 0x98, 0x76, 0x55, 0x55, - 0x67, 0x89, 0xAC, 0xDE, 0xDC, 0xDC, 0xBA, 0x98, 0x77, 0x66, 0x67, 0x89, - 0xAB, 0xCD, 0xFD, 0xCE, 0xCB, 0xBA, 0x98, 0x87, 0x77, 0x89, 0x9A, 0xBC, - 0xEE, 0xDC, 0xDD, 0xCB, 0xAA, 0x99, 0x99, 0x99, 0xAA, 0xBC, 0xDE, 0xFE, - 0xDE, 0xDD, 0xCC, 0xAA, 0xAA, 0xAA, 0xAB, 0xBC, 0xDE, 0xFF, 0xED, 0xEE, - 0xDD, 0xCC, 0xBB, 0xBB, 0xBB, 0xCD, 0xDE, 0xEF, 0xFF, 0xDE, 0xEE, 0xDE, - 0xDD, 0xCC, 0xCD, 0xDE, 0xEE, 0xEF, 0xFF, 0xED, 0xFF, 0xFE, 0xEE, 0xDD, - 0xDD, 0xEE, 0xEE, 0xFF, 0xFF, 0xFF, 0x8D, 0xCD, 0xCD, 0xDD, 0xDC, 0xCD, - 0xED, 0xEE, 0xEE, 0xFF, 0xB0, 0x00, 0x00, 0x00, - ], - [ - 0x9B, 0xBB, 0xBA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xBB, 0xBB, 0x8B, 0xCC, - 0xCB, 0xBB, 0xAA, 0xAA, 0xAA, 0xBB, 0xBC, 0xCD, 0xDC, 0xBC, 0xCB, 0xAA, - 0xAA, 0x99, 0x99, 0xAA, 0xAB, 0xBC, 0xCD, 0xBB, 0xBB, 0xAA, 0x99, 0x98, - 0x88, 0x99, 0x9A, 0xAB, 0xBC, 0xCB, 0xBB, 0xAA, 0x99, 0x88, 0x87, 0x88, - 0x89, 0x99, 0xAB, 0xBC, 0xBA, 0xBA, 0x99, 0x87, 0x77, 0x77, 0x77, 0x88, - 0x99, 0xAB, 0xCB, 0xAB, 0xA9, 0x88, 0x76, 0x66, 0x66, 0x77, 0x88, 0x9A, - 0xBB, 0xBA, 0xAA, 0x98, 0x76, 0x66, 0x55, 0x66, 0x77, 0x89, 0xAA, 0xBB, - 0xAA, 0x98, 0x87, 0x66, 0x55, 0x55, 0x66, 0x78, 0x99, 0xAB, 0xBA, 0xA9, - 0x88, 0x76, 0x55, 0x55, 0x55, 0x67, 0x88, 0x9A, 0xBA, 0xAA, 0x98, 0x87, - 0x65, 0x55, 0x55, 0x56, 0x77, 0x89, 0xAB, 0xBA, 0xA9, 0x98, 0x76, 0x65, - 0x55, 0x56, 0x67, 0x88, 0x9A, 0xBB, 0xAA, 0xA9, 0x87, 0x76, 0x65, 0x56, - 0x66, 0x78, 0x99, 0xAB, 0xBA, 0xBA, 0x98, 0x87, 0x76, 0x66, 0x66, 0x77, - 0x89, 0xAA, 0xBB, 0xAB, 0xAA, 0x98, 0x87, 0x77, 0x77, 0x77, 0x89, 0x9A, - 0xBC, 0xBA, 0xCB, 0xAA, 0x98, 0x88, 0x88, 0x88, 0x89, 0x9A, 0xAB, 0xCB, - 0xBC, 0xBB, 0xAA, 0x99, 0x98, 0x88, 0x89, 0x9A, 0xAB, 0xCC, 0xCB, 0xCC, - 0xBB, 0xAA, 0xA9, 0x99, 0x99, 0xAA, 0xAB, 0xCC, 0xDC, 0xBC, 0xCC, 0xBB, - 0xBA, 0xAA, 0xAA, 0xAA, 0xBB, 0xCC, 0xDE, 0xCC, 0xDD, 0xCC, 0xCB, 0xBB, - 0xBB, 0xBB, 0xBC, 0xCC, 0xDD, 0xED, 0x8C, 0xBB, 0xBB, 0xBB, 0xAB, 0xAB, - 0xBB, 0xBC, 0xCC, 0xCD, 0xA0, 0x00, 0x00, 0x00, - ], - [ - 0x9B, 0xBA, 0xAA, 0x99, 0x99, 0x99, 0x99, 0xAA, 0xAA, 0xBB, 0x8B, 0xCC, - 0xBB, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xBB, 0xCC, 0xCB, 0xBB, 0xBA, 0xAA, - 0x99, 0x99, 0x99, 0x99, 0xAA, 0xBB, 0xCC, 0xBA, 0xBA, 0xA9, 0x99, 0x88, - 0x88, 0x89, 0x99, 0xAA, 0xBB, 0xCB, 0xAB, 0xA9, 0x98, 0x88, 0x77, 0x88, - 0x88, 0x99, 0xAA, 0xBB, 0xAA, 0xAA, 0x98, 0x87, 0x77, 0x77, 0x77, 0x88, - 0x99, 0xAA, 0xBA, 0x9A, 0x99, 0x87, 0x76, 0x66, 0x66, 0x77, 0x88, 0x99, - 0xAB, 0xA9, 0xA9, 0x88, 0x76, 0x66, 0x66, 0x66, 0x77, 0x89, 0x9A, 0xBA, - 0x9A, 0x98, 0x77, 0x66, 0x55, 0x55, 0x66, 0x78, 0x89, 0xAB, 0xA9, 0xA9, - 0x87, 0x76, 0x65, 0x55, 0x56, 0x67, 0x88, 0x9A, 0xAA, 0x9A, 0x98, 0x87, - 0x66, 0x55, 0x55, 0x66, 0x77, 0x89, 0xAA, 0xA9, 0xA9, 0x88, 0x76, 0x65, - 0x55, 0x56, 0x67, 0x78, 0x9A, 0xAA, 0x9A, 0x99, 0x87, 0x76, 0x66, 0x66, - 0x66, 0x78, 0x89, 0xAB, 0xA9, 0xA9, 0x98, 0x87, 0x76, 0x66, 0x66, 0x77, - 0x89, 0x9A, 0xBA, 0xAB, 0xA9, 0x98, 0x87, 0x77, 0x77, 0x77, 0x88, 0x9A, - 0xAB, 0xAA, 0xBA, 0xA9, 0x98, 0x88, 0x77, 0x78, 0x88, 0x99, 0xAB, 0xBB, - 0xAB, 0xBA, 0xA9, 0x99, 0x88, 0x88, 0x89, 0x99, 0xAA, 0xBC, 0xBA, 0xCB, - 0xBA, 0xAA, 0x99, 0x99, 0x99, 0x9A, 0xAA, 0xBB, 0xCB, 0xBC, 0xCB, 0xBB, - 0xAA, 0xAA, 0xAA, 0xAA, 0xAB, 0xBB, 0xCD, 0xBB, 0xDC, 0xCB, 0xBB, 0xBA, - 0xAA, 0xBB, 0xBB, 0xBC, 0xCD, 0xDC, 0x9B, 0xBB, 0xAA, 0xAA, 0xAA, 0xAA, - 0xAA, 0xAB, 0xBB, 0xBC, 0xA0, 0x00, 0x00, 0x00, - ], - [ - 0x9B, 0xBB, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xBB, 0xBB, 0x8B, 0xCC, - 0xCB, 0xBB, 0xAA, 0xAA, 0xAA, 0xBB, 0xBC, 0xCD, 0xDB, 0xBC, 0xBB, 0xAA, - 0xA9, 0x99, 0x99, 0xAA, 0xAB, 0xBB, 0xCD, 0xBB, 0xCB, 0xAA, 0x99, 0x98, - 0x88, 0x99, 0x99, 0xAB, 0xBC, 0xCB, 0xAB, 0xAA, 0x99, 0x88, 0x88, 0x88, - 0x88, 0x9A, 0xAB, 0xBC, 0xBA, 0xBA, 0x99, 0x87, 0x77, 0x77, 0x77, 0x88, - 0x9A, 0xAB, 0xBB, 0xAB, 0xA9, 0x87, 0x76, 0x66, 0x66, 0x77, 0x88, 0x9A, - 0xBB, 0xBA, 0xAA, 0x98, 0x76, 0x66, 0x55, 0x66, 0x77, 0x89, 0xAA, 0xBB, - 0xAA, 0xA8, 0x87, 0x66, 0x55, 0x55, 0x66, 0x78, 0x99, 0xAB, 0xAA, 0xA9, - 0x88, 0x76, 0x55, 0x55, 0x55, 0x67, 0x88, 0x9A, 0xBA, 0xAA, 0x98, 0x87, - 0x65, 0x55, 0x55, 0x56, 0x78, 0x89, 0xAB, 0xAA, 0xA9, 0x98, 0x76, 0x65, - 0x55, 0x56, 0x67, 0x88, 0x9A, 0xBA, 0xAA, 0xA9, 0x87, 0x76, 0x65, 0x56, - 0x66, 0x78, 0x99, 0xAB, 0xAA, 0xBA, 0x98, 0x87, 0x76, 0x66, 0x66, 0x77, - 0x89, 0xAA, 0xBB, 0xAB, 0xAA, 0x98, 0x87, 0x77, 0x77, 0x77, 0x89, 0x9A, - 0xBB, 0xBA, 0xBB, 0xA9, 0x99, 0x88, 0x88, 0x88, 0x89, 0x9A, 0xBB, 0xCB, - 0xBC, 0xBB, 0xAA, 0x99, 0x98, 0x88, 0x99, 0x9A, 0xAB, 0xCD, 0xBB, 0xCC, - 0xBB, 0xAA, 0xA9, 0x99, 0x9A, 0xAA, 0xAB, 0xBC, 0xDC, 0xBC, 0xCC, 0xBB, - 0xBA, 0xAA, 0xAA, 0xAA, 0xBB, 0xCC, 0xDD, 0xCB, 0xDD, 0xCC, 0xCB, 0xBB, - 0xBB, 0xBB, 0xCC, 0xCC, 0xDD, 0xDC, 0x8B, 0xBB, 0xBB, 0xBB, 0xAA, 0xAA, - 0xAB, 0xBB, 0xBB, 0xCC, 0xA0, 0x00, 0x00, 0x00, - ], - [ - 0xBD, 0xEC, 0xCC, 0xCB, 0xCB, 0xBB, 0xCC, 0xCC, 0xCC, 0xCD, 0x8D, 0xED, - 0xED, 0xDC, 0xCB, 0xBB, 0xBC, 0xCD, 0xCD, 0xEF, 0xFD, 0xDE, 0xED, 0xCB, - 0xBB, 0xAA, 0xAA, 0xBB, 0xCC, 0xCE, 0xEE, 0xDD, 0xDD, 0xCB, 0xBA, 0x99, - 0x99, 0x9A, 0xAA, 0xBC, 0xDE, 0xED, 0xDD, 0xCB, 0xBA, 0x99, 0x88, 0x88, - 0x99, 0xAA, 0xBC, 0xDD, 0xDC, 0xDB, 0xAA, 0x98, 0x87, 0x77, 0x78, 0x89, - 0xAB, 0xBC, 0xDC, 0xCD, 0xBA, 0x98, 0x77, 0x66, 0x66, 0x78, 0x89, 0xAB, - 0xCD, 0xCB, 0xCA, 0xA9, 0x87, 0x65, 0x55, 0x66, 0x78, 0x99, 0xBC, 0xDC, - 0xBB, 0xA9, 0x87, 0x66, 0x54, 0x55, 0x66, 0x78, 0x9A, 0xBC, 0xCB, 0xBA, - 0x98, 0x76, 0x54, 0x44, 0x55, 0x67, 0x89, 0xAC, 0xCC, 0xCC, 0xA9, 0x87, - 0x65, 0x54, 0x44, 0x56, 0x78, 0x9A, 0xBC, 0xDB, 0xCB, 0x98, 0x76, 0x65, - 0x54, 0x55, 0x67, 0x89, 0xAC, 0xDC, 0xCC, 0xBA, 0x98, 0x76, 0x65, 0x55, - 0x67, 0x89, 0xAB, 0xCD, 0xDC, 0xCB, 0xA9, 0x88, 0x76, 0x66, 0x67, 0x78, - 0x9A, 0xBC, 0xDC, 0xCC, 0xBB, 0xA9, 0x88, 0x77, 0x77, 0x88, 0x9A, 0xBC, - 0xDD, 0xDC, 0xDC, 0xBA, 0xA9, 0x98, 0x88, 0x89, 0x9A, 0xAB, 0xCD, 0xDD, - 0xCD, 0xDC, 0xBB, 0xAA, 0x99, 0x99, 0xAA, 0xBB, 0xCD, 0xDE, 0xEC, 0xED, - 0xDC, 0xCB, 0xBA, 0xAA, 0xAB, 0xBB, 0xCC, 0xDE, 0xED, 0xDE, 0xED, 0xDC, - 0xCC, 0xBC, 0xBC, 0xCC, 0xDD, 0xDE, 0xFF, 0xED, 0xFF, 0xDD, 0xDD, 0xDD, - 0xCD, 0xDD, 0xDD, 0xEE, 0xEF, 0xFE, 0x9D, 0xDD, 0xDD, 0xDD, 0xCC, 0xCC, - 0xCC, 0xDD, 0xEE, 0xEE, 0xC0, 0x00, 0x00, 0x00, - ], - [ - 0xDF, 0xFE, 0xED, 0xDE, 0xDD, 0xDD, 0xDD, 0xDD, 0xCC, 0xDD, 0x9F, 0xFF, - 0xFF, 0xEE, 0xDE, 0xDD, 0xDD, 0xDE, 0xEE, 0xEF, 0xFD, 0xEF, 0xEF, 0xEE, - 0xDD, 0xCC, 0xCC, 0xCD, 0xCD, 0xEE, 0xFF, 0xDF, 0xFF, 0xED, 0xCC, 0xCB, - 0xBB, 0xBB, 0xCC, 0xDD, 0xDE, 0xFE, 0xDE, 0xDD, 0xCC, 0xAA, 0xAA, 0xAA, - 0xAB, 0xBC, 0xDD, 0xFF, 0xEE, 0xFD, 0xCB, 0xBA, 0x98, 0x88, 0x89, 0xAA, - 0xBC, 0xDF, 0xFF, 0xEE, 0xDC, 0xB9, 0x87, 0x77, 0x77, 0x89, 0xAB, 0xCD, - 0xEF, 0xEE, 0xEC, 0xBA, 0x97, 0x66, 0x55, 0x67, 0x89, 0xAB, 0xCE, 0xFE, - 0xDE, 0xCB, 0xA8, 0x76, 0x44, 0x45, 0x67, 0x8A, 0xBC, 0xDE, 0xED, 0xEC, - 0xB9, 0x87, 0x54, 0x33, 0x45, 0x78, 0x9B, 0xCE, 0xEE, 0xDD, 0xCB, 0x98, - 0x75, 0x43, 0x34, 0x56, 0x8A, 0xBC, 0xDF, 0xED, 0xEC, 0xCA, 0x87, 0x65, - 0x44, 0x45, 0x78, 0xAB, 0xDE, 0xEE, 0xDD, 0xDB, 0xA9, 0x87, 0x65, 0x55, - 0x67, 0x9A, 0xCD, 0xFF, 0xED, 0xDE, 0xCB, 0xA9, 0x87, 0x77, 0x77, 0x8A, - 0xBC, 0xEF, 0xFF, 0xDF, 0xDC, 0xBA, 0xA9, 0x88, 0x88, 0x9A, 0xBB, 0xCE, - 0xEF, 0xFD, 0xED, 0xDC, 0xCB, 0xAA, 0xAA, 0xAA, 0xBB, 0xCD, 0xEF, 0xFF, - 0xDF, 0xED, 0xDC, 0xCB, 0xBB, 0xBB, 0xBC, 0xCD, 0xEF, 0xFF, 0xFD, 0xEE, - 0xDD, 0xDD, 0xCC, 0xCD, 0xCD, 0xDD, 0xFF, 0xFF, 0xFF, 0xDF, 0xEF, 0xEF, - 0xDD, 0xEE, 0xDE, 0xEE, 0xEF, 0xFF, 0xFF, 0xFD, 0xFF, 0xFF, 0xFE, 0xFE, - 0xFF, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0x8C, 0xDD, 0xDE, 0xDE, 0xED, 0xDD, - 0xEE, 0xFF, 0xFF, 0xFF, 0xE0, 0x00, 0x00, 0x00, - ], - [ - 0xCD, 0xDD, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCD, 0x9D, 0xFE, - 0xED, 0xDC, 0xCC, 0xCC, 0xCC, 0xCD, 0xDE, 0xEF, 0xED, 0xDE, 0xDD, 0xCC, - 0xCB, 0xBB, 0xBB, 0xBB, 0xBC, 0xDD, 0xEF, 0xDD, 0xDD, 0xCC, 0xBB, 0xAA, - 0xAA, 0xAA, 0xBB, 0xBC, 0xDD, 0xED, 0xCD, 0xDB, 0xBA, 0x99, 0x98, 0x89, - 0x9A, 0xAB, 0xCC, 0xEE, 0xDC, 0xDC, 0xBA, 0x98, 0x88, 0x77, 0x88, 0x99, - 0xAB, 0xCD, 0xDD, 0xCC, 0xBA, 0x98, 0x87, 0x66, 0x67, 0x78, 0x9A, 0xAB, - 0xDD, 0xDC, 0xCB, 0xA9, 0x87, 0x65, 0x55, 0x66, 0x78, 0x9A, 0xBD, 0xDD, - 0xCC, 0xBA, 0x98, 0x65, 0x54, 0x45, 0x67, 0x89, 0xAB, 0xCE, 0xDB, 0xCB, - 0xA9, 0x76, 0x54, 0x44, 0x45, 0x67, 0x8A, 0xBC, 0xDC, 0xCC, 0xBA, 0x97, - 0x65, 0x44, 0x44, 0x56, 0x79, 0xAB, 0xCD, 0xDC, 0xCB, 0xA9, 0x87, 0x65, - 0x44, 0x55, 0x67, 0x9A, 0xBC, 0xDD, 0xCC, 0xBA, 0x98, 0x76, 0x65, 0x55, - 0x67, 0x89, 0xAB, 0xCE, 0xDC, 0xCC, 0xAA, 0x98, 0x77, 0x66, 0x67, 0x88, - 0x9B, 0xBD, 0xED, 0xCD, 0xCB, 0xA9, 0x98, 0x87, 0x77, 0x88, 0x9A, 0xBC, - 0xEE, 0xDC, 0xDD, 0xCB, 0xAA, 0x99, 0x98, 0x99, 0xAA, 0xBC, 0xDE, 0xEE, - 0xCD, 0xDC, 0xBB, 0xAA, 0xAA, 0xAA, 0xAB, 0xBC, 0xDD, 0xFF, 0xEC, 0xDD, - 0xDC, 0xCB, 0xBB, 0xBB, 0xBB, 0xCC, 0xDD, 0xEF, 0xFE, 0xCF, 0xEE, 0xDD, - 0xCC, 0xCC, 0xCC, 0xCD, 0xDE, 0xEF, 0xFF, 0xED, 0xEE, 0xED, 0xDD, 0xDD, - 0xDD, 0xDD, 0xEE, 0xFE, 0xFF, 0xFE, 0x8C, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, - 0xDD, 0xEE, 0xEE, 0xEF, 0xD0, 0x00, 0x00, 0x00, - ], - [ - 0xDE, 0xDD, 0xCC, 0xCC, 0xBB, 0xBB, 0xBB, 0xCC, 0xCC, 0xCC, 0x9E, 0xEE, - 0xDD, 0xCC, 0xCB, 0xBB, 0xBC, 0xCC, 0xDD, 0xDE, 0xED, 0xDE, 0xDC, 0xCB, - 0xBB, 0xAA, 0xAA, 0xBB, 0xBC, 0xCD, 0xDE, 0xDD, 0xDD, 0xCB, 0xAA, 0xA9, - 0x99, 0x9A, 0xAA, 0xBC, 0xCD, 0xED, 0xCD, 0xCB, 0xAA, 0x98, 0x88, 0x88, - 0x99, 0xAA, 0xBC, 0xDD, 0xDC, 0xCB, 0xA9, 0x98, 0x77, 0x77, 0x78, 0x89, - 0xAB, 0xBC, 0xDC, 0xCC, 0xBA, 0x98, 0x77, 0x66, 0x67, 0x78, 0x89, 0xAB, - 0xCC, 0xCC, 0xCB, 0x99, 0x87, 0x65, 0x55, 0x66, 0x78, 0x9A, 0xBC, 0xDC, - 0xCB, 0xA9, 0x87, 0x65, 0x54, 0x55, 0x67, 0x78, 0x9A, 0xBC, 0xCB, 0xBA, - 0x98, 0x76, 0x54, 0x44, 0x55, 0x67, 0x89, 0xAB, 0xCC, 0xBB, 0xA9, 0x87, - 0x65, 0x54, 0x44, 0x56, 0x78, 0x9A, 0xBC, 0xCB, 0xBA, 0x98, 0x87, 0x65, - 0x54, 0x55, 0x67, 0x89, 0xAC, 0xDC, 0xBC, 0xBA, 0x98, 0x76, 0x65, 0x55, - 0x67, 0x89, 0x9B, 0xCD, 0xCB, 0xCB, 0xA9, 0x88, 0x77, 0x66, 0x67, 0x78, - 0x9A, 0xBC, 0xDD, 0xCC, 0xBB, 0xA9, 0x88, 0x77, 0x77, 0x78, 0x99, 0xAB, - 0xCD, 0xDC, 0xCC, 0xBA, 0xA9, 0x98, 0x88, 0x88, 0x99, 0xAB, 0xCD, 0xDD, - 0xCD, 0xCC, 0xBB, 0xAA, 0x99, 0x99, 0xAA, 0xAB, 0xBC, 0xDE, 0xEC, 0xDD, - 0xCC, 0xBB, 0xBA, 0xAA, 0xAB, 0xBB, 0xCC, 0xDE, 0xEE, 0xDE, 0xDD, 0xCC, - 0xCB, 0xBB, 0xBB, 0xCC, 0xCD, 0xDE, 0xEF, 0xED, 0xEE, 0xDD, 0xDD, 0xCC, - 0xCC, 0xCD, 0xDD, 0xEE, 0xEF, 0xFE, 0xAD, 0xDD, 0xCC, 0xCC, 0xCC, 0xCC, - 0xCD, 0xDD, 0xDE, 0xEF, 0xD0, 0x00, 0x00, 0x00, - ], - [ - 0xCE, 0xDD, 0xDD, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0x9D, 0xFF, - 0xED, 0xDD, 0xCC, 0xCC, 0xCC, 0xDD, 0xDE, 0xEE, 0xFD, 0xDE, 0xED, 0xCC, - 0xCB, 0xBB, 0xBB, 0xBC, 0xCC, 0xDD, 0xEF, 0xDD, 0xDD, 0xCC, 0xBA, 0xAA, - 0xAA, 0xAA, 0xBB, 0xCC, 0xDE, 0xEC, 0xDD, 0xDC, 0xBA, 0x99, 0x99, 0x99, - 0x9A, 0xAB, 0xCD, 0xDE, 0xDC, 0xDC, 0xBA, 0x98, 0x87, 0x77, 0x88, 0x9A, - 0xAB, 0xCD, 0xED, 0xCC, 0xBA, 0x98, 0x77, 0x66, 0x67, 0x78, 0x9A, 0xAC, - 0xCD, 0xDC, 0xCB, 0xA9, 0x87, 0x65, 0x55, 0x66, 0x78, 0x9A, 0xBC, 0xDD, - 0xCC, 0xBA, 0x97, 0x65, 0x54, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xDC, 0xCB, - 0xA9, 0x76, 0x54, 0x44, 0x45, 0x67, 0x9A, 0xBC, 0xDD, 0xCC, 0xBA, 0x97, - 0x65, 0x44, 0x44, 0x56, 0x79, 0xAB, 0xCD, 0xDC, 0xCB, 0xA9, 0x87, 0x65, - 0x44, 0x55, 0x67, 0x9A, 0xBC, 0xDD, 0xCC, 0xBA, 0x98, 0x76, 0x65, 0x55, - 0x67, 0x89, 0xAB, 0xCD, 0xDC, 0xDC, 0xBA, 0x98, 0x77, 0x66, 0x67, 0x88, - 0x9A, 0xCC, 0xDD, 0xCD, 0xCB, 0xBA, 0x98, 0x87, 0x77, 0x88, 0x9A, 0xBC, - 0xDD, 0xDC, 0xDD, 0xCB, 0xAA, 0x99, 0x99, 0x99, 0x9A, 0xBB, 0xCD, 0xED, - 0xCD, 0xDC, 0xCB, 0xBA, 0xAA, 0xAA, 0xAB, 0xBC, 0xCD, 0xEE, 0xDC, 0xED, - 0xDC, 0xCC, 0xBB, 0xBB, 0xBB, 0xBC, 0xCD, 0xDE, 0xFD, 0xCE, 0xED, 0xDD, - 0xCC, 0xCC, 0xCC, 0xCD, 0xDD, 0xEE, 0xFF, 0xED, 0xEE, 0xEE, 0xDE, 0xDD, - 0xDD, 0xDE, 0xDE, 0xEE, 0xFF, 0xFE, 0x9D, 0xDC, 0xCD, 0xDD, 0xCC, 0xCD, - 0xDD, 0xDD, 0xDE, 0xEE, 0xD0, 0x00, 0x00, 0x00, - ], - [ - 0xCF, 0xFF, 0xEE, 0xDD, 0xCD, 0xCC, 0xDC, 0xCC, 0xDD, 0xCD, 0x8F, 0xFF, - 0xFF, 0xFE, 0xED, 0xEE, 0xDD, 0xDE, 0xEE, 0xFF, 0xFD, 0xEF, 0xFF, 0xEE, - 0xDD, 0xCC, 0xCD, 0xDD, 0xDE, 0xEE, 0xEF, 0xDE, 0xFE, 0xED, 0xDC, 0xCB, - 0xBB, 0xBC, 0xCC, 0xDE, 0xEF, 0xFE, 0xEE, 0xEE, 0xCC, 0xBA, 0xAA, 0xAA, - 0xAB, 0xCC, 0xCE, 0xEF, 0xED, 0xED, 0xDC, 0xBA, 0x98, 0x88, 0x89, 0xAA, - 0xCD, 0xDE, 0xFE, 0xDE, 0xDC, 0xBA, 0x88, 0x77, 0x77, 0x89, 0xAB, 0xCD, - 0xEF, 0xEE, 0xED, 0xCB, 0x98, 0x65, 0x55, 0x67, 0x89, 0xAC, 0xDE, 0xFE, - 0xEE, 0xDB, 0xA9, 0x75, 0x44, 0x45, 0x67, 0x8A, 0xBD, 0xEF, 0xED, 0xEC, - 0xCA, 0x87, 0x54, 0x33, 0x45, 0x78, 0xAB, 0xCE, 0xFE, 0xDD, 0xCB, 0xA8, - 0x75, 0x43, 0x34, 0x57, 0x8A, 0xBD, 0xEF, 0xED, 0xDC, 0xBA, 0x97, 0x65, - 0x44, 0x45, 0x78, 0xAB, 0xDE, 0xEE, 0xDE, 0xCB, 0xA9, 0x87, 0x65, 0x55, - 0x68, 0x9A, 0xCD, 0xEF, 0xFD, 0xED, 0xCB, 0xA9, 0x87, 0x76, 0x78, 0x9A, - 0xBC, 0xEE, 0xFF, 0xDF, 0xDC, 0xBA, 0xA9, 0x88, 0x88, 0x9A, 0xBC, 0xDE, - 0xEF, 0xED, 0xFE, 0xDD, 0xCB, 0xBA, 0xAA, 0xAA, 0xBC, 0xDE, 0xDE, 0xFE, - 0xDF, 0xED, 0xDC, 0xCC, 0xBB, 0xBB, 0xCC, 0xDE, 0xEE, 0xFF, 0xED, 0xEF, - 0xED, 0xDD, 0xCD, 0xDD, 0xDD, 0xEE, 0xFF, 0xFE, 0xFE, 0xDF, 0xFE, 0xDE, - 0xEE, 0xEE, 0xDE, 0xEE, 0xFF, 0xEF, 0xFE, 0xFE, 0xFF, 0xEE, 0xEE, 0xEF, - 0xFF, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0x9D, 0xDD, 0xDD, 0xDD, 0xDD, 0xEE, - 0xEE, 0xFE, 0xFF, 0xFF, 0xE0, 0x00, 0x00, 0x00, - ], - [ - 0xBD, 0xDC, 0xCC, 0xBB, 0xBB, 0xCC, 0xCC, 0xBC, 0xBC, 0xCD, 0x8D, 0xEE, - 0xDD, 0xDC, 0xCC, 0xCC, 0xCC, 0xCD, 0xDD, 0xEE, 0xED, 0xDE, 0xED, 0xDC, - 0xBB, 0xBB, 0xBB, 0xBC, 0xCC, 0xCD, 0xDF, 0xDC, 0xDC, 0xCC, 0xBA, 0xAA, - 0xAA, 0xAA, 0xBB, 0xCC, 0xDD, 0xED, 0xCD, 0xCC, 0xBA, 0x99, 0x99, 0x99, - 0x9A, 0xAB, 0xCC, 0xDE, 0xDC, 0xDC, 0xBA, 0x99, 0x88, 0x77, 0x88, 0x99, - 0xAB, 0xCD, 0xED, 0xCD, 0xCB, 0x98, 0x87, 0x66, 0x67, 0x78, 0x9A, 0xBC, - 0xCD, 0xCC, 0xCB, 0xA9, 0x87, 0x65, 0x55, 0x66, 0x78, 0x9A, 0xBD, 0xDC, - 0xCD, 0xBA, 0x97, 0x65, 0x54, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xCC, 0xCB, - 0xA8, 0x76, 0x54, 0x44, 0x45, 0x67, 0x9A, 0xBC, 0xED, 0xCC, 0xBA, 0x97, - 0x65, 0x44, 0x44, 0x56, 0x79, 0xAB, 0xCD, 0xDC, 0xCB, 0xA9, 0x87, 0x65, - 0x44, 0x55, 0x67, 0x9A, 0xBC, 0xDD, 0xCD, 0xBA, 0x98, 0x76, 0x65, 0x55, - 0x67, 0x89, 0xAC, 0xCE, 0xCC, 0xDC, 0xBA, 0x98, 0x77, 0x66, 0x67, 0x89, - 0x9A, 0xBC, 0xED, 0xCC, 0xCB, 0xA9, 0x98, 0x87, 0x77, 0x89, 0x9A, 0xBC, - 0xDF, 0xDC, 0xDC, 0xCB, 0xAA, 0x99, 0x99, 0x99, 0xAA, 0xBC, 0xDD, 0xED, - 0xCE, 0xDC, 0xCB, 0xBA, 0xAA, 0xAA, 0xAA, 0xBB, 0xCD, 0xDF, 0xDC, 0xED, - 0xDD, 0xCC, 0xBB, 0xBB, 0xBB, 0xCC, 0xDD, 0xEE, 0xEE, 0xDE, 0xED, 0xDD, - 0xCC, 0xCC, 0xCC, 0xCD, 0xDD, 0xDF, 0xEF, 0xED, 0xFF, 0xEE, 0xED, 0xDC, - 0xDD, 0xDD, 0xEE, 0xEE, 0xFF, 0xFE, 0x7C, 0xCD, 0xCC, 0xCC, 0xCC, 0xCD, - 0xDD, 0xDD, 0xED, 0xEE, 0xC0, 0x00, 0x00, 0x00, - ], - [ - 0xAB, 0xBB, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xBB, 0x8B, 0xDC, - 0xCB, 0xBA, 0xAA, 0xAA, 0xAA, 0xAB, 0xBC, 0xCC, 0xDC, 0xBC, 0xBB, 0xAA, - 0xA9, 0x99, 0x99, 0x9A, 0xAA, 0xBC, 0xCD, 0xBB, 0xCB, 0xAA, 0x99, 0x98, - 0x88, 0x99, 0x9A, 0xAB, 0xBC, 0xCB, 0xAB, 0xAA, 0x98, 0x88, 0x88, 0x88, - 0x88, 0x99, 0xAB, 0xBC, 0xBA, 0xBA, 0x99, 0x88, 0x77, 0x77, 0x77, 0x88, - 0x99, 0xAB, 0xCB, 0xAA, 0xA9, 0x87, 0x76, 0x66, 0x66, 0x77, 0x88, 0x9A, - 0xBB, 0xBA, 0xA9, 0x98, 0x76, 0x66, 0x55, 0x66, 0x77, 0x89, 0x9A, 0xBB, - 0xAA, 0x98, 0x87, 0x66, 0x55, 0x55, 0x66, 0x78, 0x99, 0xAB, 0xA9, 0xA9, - 0x88, 0x76, 0x55, 0x55, 0x55, 0x67, 0x88, 0x9A, 0xBB, 0xAA, 0x98, 0x87, - 0x66, 0x55, 0x55, 0x56, 0x77, 0x89, 0xAB, 0xAA, 0xA9, 0x98, 0x76, 0x65, - 0x55, 0x56, 0x67, 0x88, 0x9A, 0xBB, 0xAA, 0xA9, 0x87, 0x76, 0x65, 0x56, - 0x66, 0x78, 0x99, 0xAB, 0xBA, 0xBA, 0x98, 0x87, 0x76, 0x66, 0x66, 0x77, - 0x89, 0x9A, 0xBB, 0xAB, 0xAA, 0x98, 0x87, 0x77, 0x77, 0x77, 0x89, 0x9A, - 0xBB, 0xBA, 0xBB, 0xA9, 0x98, 0x88, 0x87, 0x88, 0x89, 0x9A, 0xAB, 0xCB, - 0xAB, 0xBB, 0xAA, 0x99, 0x98, 0x88, 0x99, 0x9A, 0xAB, 0xBC, 0xCB, 0xCB, - 0xBB, 0xAA, 0xA9, 0x99, 0x99, 0xAA, 0xAB, 0xBC, 0xDC, 0xBC, 0xCC, 0xBB, - 0xAA, 0xAA, 0xAA, 0xAA, 0xBB, 0xCC, 0xDD, 0xCB, 0xDD, 0xCC, 0xBB, 0xBB, - 0xBB, 0xBB, 0xBC, 0xCC, 0xDE, 0xED, 0x8B, 0xBB, 0xBB, 0xBB, 0xBA, 0xAA, - 0xBB, 0xBB, 0xCC, 0xCD, 0xB0, 0x00, 0x00, 0x00, - ], - [ - 0xAB, 0xBA, 0xAA, 0x99, 0x99, 0x99, 0x99, 0xAA, 0xAA, 0xBB, 0x8B, 0xCC, - 0xBB, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xBB, 0xCC, 0xCB, 0xBB, 0xBA, 0xA9, - 0x99, 0x99, 0x99, 0x99, 0xAA, 0xAB, 0xBC, 0xBA, 0xBA, 0xA9, 0x98, 0x88, - 0x88, 0x88, 0x99, 0xAA, 0xAB, 0xCB, 0xAB, 0xA9, 0x98, 0x88, 0x77, 0x78, - 0x88, 0x99, 0xAA, 0xBB, 0xAA, 0xA9, 0x98, 0x87, 0x77, 0x77, 0x77, 0x88, - 0x99, 0xAA, 0xBA, 0x9A, 0x98, 0x87, 0x76, 0x66, 0x66, 0x77, 0x88, 0x99, - 0xAB, 0xA9, 0xA9, 0x88, 0x76, 0x66, 0x66, 0x66, 0x77, 0x88, 0x9A, 0xBA, - 0x9A, 0x98, 0x77, 0x66, 0x55, 0x56, 0x66, 0x78, 0x89, 0xAA, 0xA9, 0x99, - 0x87, 0x76, 0x65, 0x55, 0x56, 0x67, 0x78, 0x9A, 0xAA, 0x9A, 0x98, 0x77, - 0x66, 0x55, 0x55, 0x66, 0x77, 0x89, 0xAA, 0xA9, 0xA9, 0x88, 0x76, 0x66, - 0x55, 0x56, 0x67, 0x78, 0x9A, 0xAA, 0x9A, 0x98, 0x87, 0x76, 0x66, 0x66, - 0x66, 0x78, 0x89, 0xAA, 0xA9, 0xA9, 0x98, 0x87, 0x76, 0x66, 0x66, 0x77, - 0x89, 0x9A, 0xBA, 0xAA, 0xA9, 0x98, 0x87, 0x77, 0x77, 0x77, 0x88, 0x9A, - 0xAB, 0xAA, 0xBA, 0xA9, 0x98, 0x88, 0x77, 0x78, 0x88, 0x99, 0xAB, 0xBB, - 0xAB, 0xBA, 0xA9, 0x99, 0x88, 0x88, 0x88, 0x99, 0xAA, 0xBC, 0xBA, 0xBB, - 0xBA, 0xA9, 0x99, 0x99, 0x99, 0x9A, 0xAA, 0xBC, 0xCB, 0xBC, 0xBB, 0xBA, - 0xAA, 0xAA, 0xAA, 0xAA, 0xAB, 0xBC, 0xCD, 0xCB, 0xCC, 0xCB, 0xBB, 0xBA, - 0xAA, 0xAB, 0xBB, 0xBC, 0xCC, 0xDC, 0x8B, 0xBB, 0xAA, 0xAA, 0xAA, 0xAA, - 0xAA, 0xAB, 0xBB, 0xCC, 0xB0, 0x00, 0x00, 0x00, - ], - [ - 0xAC, 0xBB, 0xBA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xBB, 0xBB, 0x8C, 0xDC, - 0xBB, 0xBB, 0xAA, 0xAA, 0xAA, 0xBB, 0xBC, 0xCD, 0xDC, 0xBC, 0xBB, 0xAA, - 0xA9, 0x99, 0x99, 0xAA, 0xAB, 0xBB, 0xCC, 0xBB, 0xBB, 0xAA, 0x99, 0x98, - 0x88, 0x89, 0x9A, 0xAB, 0xBB, 0xCB, 0xBB, 0xAA, 0x99, 0x88, 0x87, 0x88, - 0x89, 0x99, 0xAB, 0xBC, 0xBA, 0xBA, 0x99, 0x87, 0x77, 0x77, 0x77, 0x88, - 0x9A, 0xAB, 0xBB, 0xAA, 0xA9, 0x87, 0x76, 0x66, 0x66, 0x77, 0x89, 0x9A, - 0xBB, 0xBA, 0xA9, 0x98, 0x76, 0x66, 0x55, 0x66, 0x77, 0x89, 0xAA, 0xBB, - 0xAA, 0x98, 0x87, 0x65, 0x55, 0x55, 0x66, 0x78, 0x99, 0xAB, 0xAA, 0xA9, - 0x88, 0x76, 0x55, 0x55, 0x56, 0x67, 0x78, 0x9A, 0xBA, 0xAA, 0x98, 0x87, - 0x65, 0x55, 0x55, 0x56, 0x78, 0x89, 0xAB, 0xAA, 0xA9, 0x98, 0x76, 0x65, - 0x55, 0x56, 0x67, 0x88, 0x9A, 0xBA, 0xAA, 0xA9, 0x87, 0x76, 0x66, 0x56, - 0x66, 0x78, 0x89, 0xAB, 0xAA, 0xBA, 0x98, 0x87, 0x76, 0x66, 0x66, 0x77, - 0x89, 0xAA, 0xBB, 0xAB, 0xA9, 0x98, 0x87, 0x77, 0x77, 0x77, 0x89, 0x9A, - 0xBB, 0xBA, 0xBB, 0xA9, 0x98, 0x88, 0x88, 0x88, 0x89, 0x9A, 0xAB, 0xCB, - 0xBC, 0xBB, 0xAA, 0x99, 0x98, 0x88, 0x89, 0x9A, 0xAB, 0xCC, 0xBB, 0xCC, - 0xBB, 0xAA, 0xA9, 0x99, 0x99, 0xAA, 0xAB, 0xBC, 0xDB, 0xBD, 0xCC, 0xBB, - 0xAA, 0xAA, 0xAA, 0xAB, 0xBB, 0xBC, 0xCD, 0xCB, 0xDC, 0xCC, 0xBB, 0xBB, - 0xBB, 0xBB, 0xBB, 0xCC, 0xDD, 0xDC, 0x8C, 0xBB, 0xBB, 0xBA, 0xAA, 0xAA, - 0xBB, 0xBB, 0xBC, 0xCC, 0xA0, 0x00, 0x00, 0x00, - ], - [ - 0xBD, 0xDD, 0xCD, 0xCB, 0xCB, 0xBB, 0xCB, 0xCB, 0xCC, 0xCC, 0x7D, 0xFF, - 0xDD, 0xCC, 0xCB, 0xBB, 0xCC, 0xCD, 0xDD, 0xDE, 0xED, 0xDD, 0xDC, 0xCC, - 0xBB, 0xAB, 0xAB, 0xBB, 0xCC, 0xDD, 0xEE, 0xDD, 0xDD, 0xCB, 0xBA, 0xA9, - 0x99, 0xAA, 0xAB, 0xBC, 0xCD, 0xEC, 0xCD, 0xCB, 0xAA, 0x99, 0x88, 0x89, - 0x99, 0xAA, 0xBC, 0xDD, 0xDC, 0xDB, 0xBA, 0x98, 0x87, 0x77, 0x78, 0x99, - 0xAB, 0xBC, 0xDD, 0xCC, 0xBA, 0x98, 0x77, 0x66, 0x67, 0x78, 0x89, 0xAB, - 0xCD, 0xCC, 0xCB, 0xA9, 0x87, 0x65, 0x55, 0x66, 0x78, 0x9A, 0xBC, 0xDC, - 0xBC, 0xB9, 0x87, 0x65, 0x54, 0x55, 0x67, 0x79, 0x9B, 0xBC, 0xCC, 0xBA, - 0x98, 0x76, 0x54, 0x44, 0x45, 0x67, 0x89, 0xAC, 0xCD, 0xCC, 0xA9, 0x87, - 0x65, 0x54, 0x44, 0x56, 0x78, 0x9B, 0xBD, 0xDB, 0xCA, 0xA8, 0x87, 0x65, - 0x54, 0x55, 0x67, 0x89, 0xBB, 0xCD, 0xBB, 0xBA, 0x98, 0x76, 0x65, 0x55, - 0x67, 0x89, 0xAA, 0xCD, 0xDC, 0xCB, 0xA9, 0x88, 0x77, 0x66, 0x67, 0x78, - 0x9A, 0xBC, 0xDD, 0xCC, 0xBB, 0xA9, 0x98, 0x77, 0x77, 0x88, 0x9A, 0xBB, - 0xDE, 0xDC, 0xDC, 0xBA, 0xA9, 0x98, 0x88, 0x89, 0x9A, 0xBB, 0xDD, 0xED, - 0xDD, 0xDC, 0xBB, 0xAA, 0xA9, 0x99, 0xAA, 0xBC, 0xCD, 0xEF, 0xDC, 0xED, - 0xDC, 0xBB, 0xBB, 0xAA, 0xBB, 0xBC, 0xCC, 0xEE, 0xEE, 0xDE, 0xED, 0xDD, - 0xCC, 0xCC, 0xCC, 0xCC, 0xCD, 0xEE, 0xEF, 0xFD, 0xFE, 0xDD, 0xDD, 0xDC, - 0xDD, 0xDD, 0xDE, 0xED, 0xFF, 0xFE, 0x8D, 0xCD, 0xCD, 0xCC, 0xCC, 0xCC, - 0xCD, 0xDD, 0xEE, 0xEF, 0xC0, 0x00, 0x00, 0x00, - ], - [ - 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xED, 0xDD, 0xDD, 0xDC, 0x8F, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xEF, 0xFF, 0xFD, 0xFF, 0xFF, 0xFF, - 0xFF, 0xEE, 0xED, 0xDD, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xDD, 0xDC, - 0xCC, 0xCC, 0xCD, 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0xEC, 0xCB, 0xBB, 0xAB, - 0xBC, 0xDD, 0xFF, 0xFF, 0xFF, 0xFF, 0xED, 0xBB, 0xA9, 0x99, 0x9A, 0xAB, - 0xCD, 0xFF, 0xFF, 0xEF, 0xFD, 0xCA, 0x98, 0x77, 0x77, 0x89, 0xAC, 0xDF, - 0xFF, 0xFF, 0xFE, 0xDB, 0xA8, 0x76, 0x56, 0x67, 0x8A, 0xBD, 0xDF, 0xFF, - 0xFF, 0xFC, 0xB9, 0x76, 0x54, 0x45, 0x68, 0x9B, 0xCD, 0xFF, 0xFF, 0xFD, - 0xCB, 0x97, 0x54, 0x23, 0x46, 0x79, 0xAC, 0xEF, 0xFF, 0xFF, 0xEC, 0xA9, - 0x76, 0x43, 0x24, 0x57, 0x9B, 0xCD, 0xFF, 0xFF, 0xFD, 0xCB, 0x98, 0x65, - 0x44, 0x46, 0x79, 0xBC, 0xEF, 0xFF, 0xEF, 0xDD, 0xBA, 0x87, 0x66, 0x56, - 0x78, 0xAB, 0xDF, 0xFF, 0xFF, 0xFE, 0xDC, 0xA9, 0x88, 0x77, 0x78, 0x9A, - 0xCD, 0xFF, 0xFF, 0xDF, 0xFD, 0xCB, 0xAA, 0x99, 0x99, 0xAB, 0xBD, 0xDF, - 0xFF, 0xFD, 0xFF, 0xDD, 0xCB, 0xBB, 0xAA, 0xBB, 0xCC, 0xFE, 0xFF, 0xFF, - 0xEF, 0xFD, 0xED, 0xDC, 0xCC, 0xCC, 0xCD, 0xEF, 0xFF, 0xFF, 0xFD, 0xFF, - 0xEF, 0xDD, 0xDD, 0xDE, 0xEE, 0xFF, 0xFF, 0xFF, 0xFF, 0xCF, 0xFF, 0xFF, - 0xEF, 0xEE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7C, 0xCD, 0xDD, 0xDD, 0xFD, 0xEF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00, 0x00, - ], - [ - 0xDE, 0xEE, 0xDD, 0xDC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0x9E, 0xFF, - 0xEE, 0xED, 0xCC, 0xCC, 0xCC, 0xCD, 0xDD, 0xEE, 0xFD, 0xEF, 0xED, 0xDC, - 0xCB, 0xBB, 0xBB, 0xBC, 0xCC, 0xDD, 0xEF, 0xDD, 0xED, 0xDC, 0xBB, 0xAA, - 0xAA, 0xAA, 0xBB, 0xCC, 0xDD, 0xFE, 0xDE, 0xDC, 0xBA, 0x99, 0x99, 0x99, - 0x9A, 0xAB, 0xCC, 0xDE, 0xDD, 0xDC, 0xBA, 0x98, 0x88, 0x77, 0x88, 0x99, - 0xAB, 0xCD, 0xED, 0xDD, 0xCA, 0x98, 0x77, 0x66, 0x67, 0x78, 0x9A, 0xBC, - 0xDD, 0xDC, 0xDB, 0xA9, 0x87, 0x65, 0x55, 0x66, 0x78, 0x9A, 0xCD, 0xED, - 0xCC, 0xBA, 0x97, 0x65, 0x54, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xDC, 0xCB, - 0xA8, 0x76, 0x54, 0x44, 0x45, 0x67, 0x9A, 0xBC, 0xED, 0xCC, 0xBA, 0x97, - 0x65, 0x44, 0x44, 0x56, 0x78, 0xAB, 0xCD, 0xDC, 0xCB, 0xA9, 0x87, 0x65, - 0x44, 0x55, 0x67, 0x9A, 0xBC, 0xED, 0xCC, 0xBA, 0x98, 0x76, 0x65, 0x55, - 0x67, 0x89, 0xAC, 0xDE, 0xEC, 0xDC, 0xBA, 0x98, 0x77, 0x66, 0x67, 0x78, - 0x9B, 0xCD, 0xED, 0xCD, 0xCB, 0xA9, 0x98, 0x87, 0x77, 0x88, 0x9A, 0xBC, - 0xEF, 0xEC, 0xDC, 0xCB, 0xAA, 0x99, 0x99, 0x99, 0xAA, 0xBC, 0xDE, 0xFE, - 0xCE, 0xDC, 0xCB, 0xBA, 0xAA, 0xAA, 0xAB, 0xBC, 0xDE, 0xFF, 0xEC, 0xED, - 0xDC, 0xCC, 0xBB, 0xBB, 0xBB, 0xCD, 0xDE, 0xEF, 0xFF, 0xCF, 0xED, 0xDD, - 0xDC, 0xCC, 0xCC, 0xCD, 0xDE, 0xEF, 0xFF, 0xFC, 0xFE, 0xFE, 0xDD, 0xDD, - 0xDE, 0xEE, 0xEE, 0xFF, 0xFF, 0xFF, 0x8D, 0xDD, 0xCD, 0xDD, 0xDD, 0xDD, - 0xDD, 0xEE, 0xFF, 0xFF, 0xD0, 0x00, 0x00, 0x00, - ], - [ - 0xDE, 0xED, 0xDC, 0xCC, 0xBB, 0xBB, 0xBB, 0xBC, 0xCC, 0xCC, 0x9E, 0xFE, - 0xED, 0xCC, 0xCB, 0xBB, 0xBB, 0xCC, 0xCD, 0xDE, 0xED, 0xEE, 0xDD, 0xCB, - 0xBA, 0xAA, 0xAA, 0xAB, 0xBB, 0xCC, 0xDE, 0xDD, 0xDC, 0xCB, 0xAA, 0x99, - 0x99, 0x99, 0xAA, 0xBB, 0xCD, 0xDD, 0xDD, 0xCB, 0xA9, 0x98, 0x88, 0x88, - 0x89, 0x9A, 0xBB, 0xCD, 0xCC, 0xCB, 0xA9, 0x88, 0x77, 0x77, 0x77, 0x89, - 0x9A, 0xBC, 0xDC, 0xCC, 0xBA, 0x98, 0x76, 0x66, 0x66, 0x77, 0x89, 0xAB, - 0xCD, 0xCC, 0xBA, 0x98, 0x76, 0x65, 0x55, 0x66, 0x78, 0x89, 0xAB, 0xCC, - 0xBB, 0xA9, 0x87, 0x65, 0x55, 0x55, 0x66, 0x78, 0x9A, 0xBC, 0xCB, 0xBA, - 0x98, 0x76, 0x55, 0x44, 0x55, 0x67, 0x89, 0xAB, 0xCC, 0xBB, 0xA9, 0x87, - 0x65, 0x54, 0x45, 0x56, 0x78, 0x9A, 0xBC, 0xCB, 0xBA, 0x98, 0x76, 0x65, - 0x55, 0x55, 0x67, 0x89, 0xAB, 0xCC, 0xBB, 0xA9, 0x87, 0x76, 0x65, 0x55, - 0x66, 0x78, 0x9A, 0xBD, 0xCB, 0xCB, 0xA9, 0x87, 0x76, 0x66, 0x66, 0x78, - 0x9A, 0xBC, 0xDD, 0xCC, 0xBA, 0x99, 0x88, 0x77, 0x77, 0x78, 0x89, 0xAB, - 0xCD, 0xDC, 0xCB, 0xBA, 0x99, 0x88, 0x88, 0x88, 0x99, 0xAB, 0xCD, 0xEE, - 0xCD, 0xCB, 0xBA, 0xA9, 0x99, 0x99, 0x9A, 0xAB, 0xCC, 0xDE, 0xEC, 0xDD, - 0xCC, 0xBB, 0xAA, 0xAA, 0xAA, 0xBB, 0xCC, 0xDE, 0xFF, 0xCE, 0xDD, 0xCC, - 0xBB, 0xBB, 0xBB, 0xBC, 0xCD, 0xDE, 0xFF, 0xFD, 0xEE, 0xDD, 0xCD, 0xCC, - 0xCC, 0xCC, 0xDD, 0xEF, 0xFF, 0xFF, 0xAD, 0xDC, 0xCC, 0xCC, 0xCC, 0xCC, - 0xDD, 0xDE, 0xEF, 0xFF, 0xE0, 0x00, 0x00, 0x00, - ], - [ - 0xDF, 0xED, 0xEE, 0xDD, 0xDC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0x9F, 0xFF, - 0xFE, 0xED, 0xDC, 0xCC, 0xCC, 0xCD, 0xDD, 0xEE, 0xED, 0xEF, 0xEE, 0xDC, - 0xCC, 0xBB, 0xBB, 0xBC, 0xCC, 0xDD, 0xEE, 0xDE, 0xEE, 0xDC, 0xBB, 0xAA, - 0xAA, 0xAA, 0xBB, 0xBC, 0xDD, 0xED, 0xDE, 0xDC, 0xBA, 0x99, 0x98, 0x99, - 0x9A, 0xAB, 0xCC, 0xDE, 0xDD, 0xDC, 0xBA, 0x98, 0x87, 0x77, 0x88, 0x99, - 0xAB, 0xCD, 0xDD, 0xDD, 0xCB, 0xA8, 0x77, 0x66, 0x67, 0x78, 0x9A, 0xBC, - 0xDD, 0xCC, 0xDB, 0xA9, 0x87, 0x65, 0x55, 0x66, 0x78, 0x9A, 0xBC, 0xDC, - 0xCC, 0xBA, 0x97, 0x65, 0x54, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xCC, 0xCB, - 0xA8, 0x76, 0x54, 0x44, 0x45, 0x67, 0x9A, 0xBC, 0xDC, 0xCC, 0xBA, 0x97, - 0x65, 0x44, 0x44, 0x56, 0x79, 0xAB, 0xCD, 0xDC, 0xCB, 0xA9, 0x87, 0x65, - 0x44, 0x55, 0x67, 0x9A, 0xBC, 0xDD, 0xCC, 0xBA, 0x98, 0x76, 0x65, 0x55, - 0x67, 0x89, 0xAC, 0xCD, 0xDC, 0xDC, 0xBA, 0x98, 0x77, 0x66, 0x67, 0x88, - 0x9B, 0xCD, 0xDD, 0xCD, 0xCB, 0xAA, 0x98, 0x87, 0x77, 0x88, 0x9A, 0xBC, - 0xDF, 0xDD, 0xDC, 0xCB, 0xAA, 0x99, 0x89, 0x99, 0xAA, 0xBC, 0xDD, 0xED, - 0xCD, 0xDC, 0xCB, 0xBA, 0xAA, 0xAA, 0xAB, 0xBC, 0xDD, 0xEF, 0xED, 0xED, - 0xDC, 0xCC, 0xBB, 0xBB, 0xBB, 0xCC, 0xDD, 0xEE, 0xFE, 0xCD, 0xED, 0xDD, - 0xCC, 0xCC, 0xCC, 0xCD, 0xDE, 0xFF, 0xFF, 0xFD, 0xFE, 0xEE, 0xED, 0xDD, - 0xDD, 0xEE, 0xDE, 0xFE, 0xFF, 0xFE, 0x9C, 0xCD, 0xCC, 0xCC, 0xCC, 0xDD, - 0xDD, 0xDE, 0xEF, 0xFF, 0xD0, 0x00, 0x00, 0x00, - ], - [ - 0xEF, 0xFF, 0xFF, 0xFF, 0xEE, 0xDD, 0xDD, 0xDD, 0xCC, 0xCD, 0x7F, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xEF, 0xEE, 0xFE, 0xFF, 0xFD, 0xFF, 0xFF, 0xFF, - 0xEF, 0xDC, 0xDD, 0xDD, 0xFF, 0xEF, 0xFF, 0xDF, 0xFF, 0xFE, 0xDD, 0xCC, - 0xBB, 0xBC, 0xCD, 0xDD, 0xDF, 0xFE, 0xFF, 0xFF, 0xDC, 0xBA, 0xAA, 0xAA, - 0xAB, 0xCC, 0xDF, 0xFF, 0xEF, 0xFF, 0xDC, 0xBA, 0x98, 0x88, 0x99, 0xAB, - 0xCD, 0xDF, 0xFE, 0xFF, 0xFC, 0xBA, 0x98, 0x77, 0x77, 0x89, 0xAB, 0xCD, - 0xFF, 0xFF, 0xFD, 0xCB, 0x97, 0x65, 0x55, 0x67, 0x89, 0xBB, 0xDF, 0xFF, - 0xFF, 0xDC, 0xA8, 0x75, 0x44, 0x45, 0x67, 0x9A, 0xCD, 0xFF, 0xFF, 0xFD, - 0xBA, 0x87, 0x54, 0x33, 0x45, 0x78, 0xAB, 0xDF, 0xFF, 0xFE, 0xDB, 0xA8, - 0x75, 0x43, 0x34, 0x57, 0x8A, 0xBD, 0xFF, 0xFF, 0xED, 0xBA, 0x87, 0x65, - 0x44, 0x45, 0x78, 0xAB, 0xDF, 0xFF, 0xFF, 0xDC, 0xA9, 0x87, 0x65, 0x55, - 0x67, 0x9B, 0xCF, 0xFF, 0xFF, 0xFD, 0xCB, 0xA9, 0x87, 0x76, 0x78, 0x9A, - 0xBC, 0xDF, 0xFF, 0xEF, 0xEC, 0xCB, 0xA9, 0x98, 0x88, 0x9A, 0xBC, 0xDF, - 0xFF, 0xFE, 0xFF, 0xCD, 0xCB, 0xAA, 0xAA, 0xAB, 0xBC, 0xDF, 0xFF, 0xFF, - 0xEF, 0xFF, 0xDD, 0xCB, 0xBB, 0xBB, 0xDC, 0xEE, 0xFF, 0xFF, 0xFD, 0xFE, - 0xEF, 0xDD, 0xDC, 0xDD, 0xDD, 0xEE, 0xFF, 0xFF, 0xFF, 0xEF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x8D, 0xDC, 0xDD, 0xDE, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00, 0x00, - ], - [ - 0xCF, 0xDE, 0xDD, 0xDC, 0xCC, 0xCC, 0xCC, 0xDC, 0xCC, 0xCD, 0x8F, 0xFF, - 0xEE, 0xDC, 0xDC, 0xBC, 0xCD, 0xDE, 0xDD, 0xEF, 0xED, 0xEE, 0xEE, 0xDC, - 0xBB, 0xBB, 0xBB, 0xBB, 0xCD, 0xED, 0xEE, 0xED, 0xFE, 0xDC, 0xBA, 0xAA, - 0xAA, 0xAA, 0xAB, 0xCC, 0xDD, 0xED, 0xDE, 0xCC, 0xBA, 0x99, 0x88, 0x89, - 0x99, 0xAB, 0xBC, 0xDE, 0xDD, 0xDC, 0xBA, 0x98, 0x87, 0x77, 0x88, 0x99, - 0xAB, 0xCE, 0xDD, 0xDD, 0xCA, 0x98, 0x77, 0x66, 0x67, 0x78, 0x99, 0xAB, - 0xCE, 0xDD, 0xCB, 0xA9, 0x87, 0x65, 0x55, 0x66, 0x78, 0x9B, 0xBD, 0xDD, - 0xCC, 0xBA, 0x87, 0x65, 0x54, 0x45, 0x67, 0x89, 0xAB, 0xCE, 0xDC, 0xCB, - 0xA9, 0x76, 0x54, 0x44, 0x45, 0x67, 0x8A, 0xBC, 0xCD, 0xCC, 0xBA, 0x87, - 0x65, 0x54, 0x44, 0x56, 0x78, 0x9B, 0xCD, 0xEC, 0xCB, 0xA9, 0x87, 0x65, - 0x44, 0x55, 0x67, 0x8A, 0xBC, 0xDD, 0xCD, 0xBA, 0x98, 0x76, 0x65, 0x55, - 0x67, 0x89, 0xAB, 0xCD, 0xDC, 0xCC, 0xBA, 0x98, 0x77, 0x66, 0x67, 0x78, - 0x9A, 0xBD, 0xED, 0xCD, 0xCB, 0xA9, 0x98, 0x87, 0x77, 0x88, 0x9A, 0xBC, - 0xDE, 0xDC, 0xDC, 0xCB, 0xAA, 0x99, 0x88, 0x99, 0x9A, 0xBC, 0xDD, 0xEE, - 0xCE, 0xDC, 0xBB, 0xAA, 0xAA, 0xAA, 0xAA, 0xBC, 0xCD, 0xEF, 0xED, 0xEE, - 0xDC, 0xCC, 0xBB, 0xBB, 0xBB, 0xBC, 0xDD, 0xEE, 0xFE, 0xDE, 0xEE, 0xDD, - 0xCC, 0xCC, 0xCC, 0xCD, 0xDF, 0xEE, 0xFF, 0xEC, 0xEF, 0xEE, 0xDD, 0xDD, - 0xDD, 0xDD, 0xEF, 0xFF, 0xFF, 0xFE, 0x8D, 0xDD, 0xDC, 0xDC, 0xDD, 0xDD, - 0xDD, 0xDE, 0xEF, 0xEF, 0xD0, 0x00, 0x00, 0x00, - ], - [ - 0xAC, 0xBB, 0xAA, 0xAA, 0xAA, 0x9A, 0xAA, 0xAA, 0xAB, 0xBB, 0x8B, 0xDC, - 0xCB, 0xBB, 0xAA, 0xAA, 0xAA, 0xAB, 0xBB, 0xCC, 0xDB, 0xBC, 0xBB, 0xAA, - 0xA9, 0x99, 0x99, 0x9A, 0xAA, 0xBC, 0xCD, 0xBB, 0xCB, 0xAA, 0x99, 0x88, - 0x88, 0x99, 0x99, 0xAA, 0xBC, 0xCB, 0xAB, 0xAA, 0x99, 0x88, 0x87, 0x88, - 0x88, 0x99, 0xAB, 0xBC, 0xBA, 0xBA, 0x99, 0x87, 0x77, 0x77, 0x77, 0x88, - 0x99, 0xAB, 0xCB, 0xAB, 0xA9, 0x87, 0x76, 0x66, 0x66, 0x77, 0x88, 0x9A, - 0xBB, 0xAA, 0xA9, 0x98, 0x76, 0x66, 0x56, 0x66, 0x77, 0x89, 0xAA, 0xBA, - 0xAA, 0x98, 0x87, 0x66, 0x55, 0x55, 0x66, 0x78, 0x99, 0xAB, 0xAA, 0xA9, - 0x88, 0x76, 0x55, 0x55, 0x55, 0x67, 0x88, 0x9A, 0xBA, 0xAA, 0x98, 0x87, - 0x66, 0x55, 0x55, 0x56, 0x77, 0x89, 0xAB, 0xAA, 0xA9, 0x98, 0x76, 0x65, - 0x55, 0x56, 0x67, 0x78, 0x9A, 0xBB, 0xAA, 0x99, 0x87, 0x76, 0x66, 0x56, - 0x66, 0x78, 0x89, 0xAB, 0xBA, 0xAA, 0x98, 0x87, 0x76, 0x66, 0x66, 0x77, - 0x89, 0xAA, 0xBB, 0xAB, 0xA9, 0x98, 0x87, 0x77, 0x77, 0x77, 0x88, 0x9A, - 0xBB, 0xBA, 0xBA, 0xA9, 0x98, 0x88, 0x77, 0x78, 0x89, 0x9A, 0xAB, 0xCB, - 0xAC, 0xBA, 0xA9, 0x99, 0x88, 0x88, 0x99, 0x9A, 0xAB, 0xCC, 0xCB, 0xCB, - 0xBA, 0xAA, 0x99, 0x99, 0x99, 0xAA, 0xAB, 0xBC, 0xDC, 0xBC, 0xCB, 0xBB, - 0xAA, 0xAA, 0xAA, 0xAA, 0xBB, 0xCC, 0xDE, 0xDB, 0xDC, 0xCC, 0xBB, 0xBB, - 0xBB, 0xBB, 0xBC, 0xCD, 0xDD, 0xEC, 0x8B, 0xBB, 0xBB, 0xBB, 0xAA, 0xAA, - 0xBB, 0xBB, 0xCC, 0xCD, 0xB0, 0x00, 0x00, 0x00, - ], - [ - 0xAB, 0xBA, 0xAA, 0x99, 0x99, 0x99, 0x99, 0x9A, 0xAA, 0xBB, 0x9B, 0xCC, - 0xBB, 0xAA, 0xAA, 0x99, 0xAA, 0xAA, 0xBB, 0xBC, 0xCB, 0xBC, 0xBA, 0xA9, - 0x99, 0x99, 0x99, 0x99, 0xAA, 0xAB, 0xBC, 0xBA, 0xBA, 0xA9, 0x98, 0x88, - 0x88, 0x88, 0x99, 0x9A, 0xAB, 0xCB, 0xAB, 0xA9, 0x98, 0x88, 0x77, 0x77, - 0x88, 0x99, 0x9A, 0xBB, 0xAA, 0xA9, 0x98, 0x87, 0x77, 0x77, 0x77, 0x88, - 0x99, 0xAA, 0xBA, 0x9A, 0x98, 0x87, 0x76, 0x66, 0x66, 0x77, 0x88, 0x99, - 0xAB, 0xA9, 0xA9, 0x88, 0x76, 0x66, 0x66, 0x66, 0x77, 0x88, 0x9A, 0xAA, - 0x99, 0x98, 0x77, 0x66, 0x65, 0x56, 0x66, 0x78, 0x89, 0xAA, 0xA9, 0x99, - 0x87, 0x76, 0x65, 0x55, 0x56, 0x67, 0x78, 0x99, 0xAA, 0x99, 0x98, 0x77, - 0x66, 0x55, 0x55, 0x66, 0x77, 0x89, 0x9A, 0xA9, 0xA9, 0x88, 0x76, 0x66, - 0x55, 0x66, 0x67, 0x78, 0x99, 0xAA, 0x9A, 0x98, 0x87, 0x76, 0x66, 0x66, - 0x66, 0x77, 0x89, 0xAA, 0xA9, 0xA9, 0x98, 0x87, 0x76, 0x66, 0x66, 0x77, - 0x88, 0x9A, 0xBA, 0x9A, 0xA9, 0x88, 0x87, 0x77, 0x77, 0x77, 0x88, 0x99, - 0xAB, 0xAA, 0xBA, 0x99, 0x88, 0x88, 0x77, 0x78, 0x88, 0x99, 0xAA, 0xBB, - 0xAB, 0xAA, 0x99, 0x98, 0x88, 0x88, 0x88, 0x99, 0xAA, 0xBC, 0xBA, 0xBB, - 0xAA, 0xA9, 0x99, 0x99, 0x99, 0x99, 0xAA, 0xBC, 0xCB, 0xBC, 0xBB, 0xBA, - 0xAA, 0xA9, 0x9A, 0xAA, 0xAB, 0xBB, 0xCD, 0xCB, 0xDC, 0xCB, 0xBB, 0xAA, - 0xAA, 0xAA, 0xBB, 0xBC, 0xCD, 0xDC, 0x9B, 0xBB, 0xAA, 0xAA, 0xAA, 0xAA, - 0xAA, 0xAB, 0xBB, 0xCC, 0xB0, 0x00, 0x00, 0x00, - ], - [ - 0xBC, 0xCB, 0xBB, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xBB, 0xBB, 0x8C, 0xDD, - 0xCB, 0xBA, 0xAA, 0xAA, 0xAA, 0xBB, 0xBC, 0xCC, 0xDC, 0xCD, 0xCB, 0xAA, - 0xA9, 0x99, 0x99, 0x9A, 0xAA, 0xBC, 0xCD, 0xCB, 0xCB, 0xAA, 0x99, 0x98, - 0x88, 0x89, 0x99, 0xAA, 0xBC, 0xCB, 0xBC, 0xAA, 0x98, 0x88, 0x77, 0x78, - 0x88, 0x99, 0xAB, 0xBC, 0xBB, 0xBA, 0x98, 0x87, 0x77, 0x77, 0x77, 0x88, - 0x99, 0xAB, 0xCB, 0xAB, 0xA9, 0x87, 0x76, 0x66, 0x66, 0x77, 0x88, 0x9A, - 0xAB, 0xBA, 0xA9, 0x88, 0x76, 0x66, 0x56, 0x66, 0x77, 0x89, 0xAA, 0xBB, - 0xAA, 0x98, 0x77, 0x66, 0x55, 0x55, 0x66, 0x78, 0x89, 0xAB, 0xBA, 0xA9, - 0x87, 0x76, 0x55, 0x55, 0x56, 0x67, 0x78, 0x9A, 0xBA, 0xAA, 0x98, 0x77, - 0x66, 0x55, 0x55, 0x56, 0x77, 0x89, 0xAB, 0xBA, 0xA9, 0x88, 0x76, 0x65, - 0x55, 0x56, 0x67, 0x88, 0x9A, 0xBB, 0xAA, 0xA9, 0x87, 0x76, 0x66, 0x56, - 0x66, 0x78, 0x89, 0xAB, 0xBA, 0xBA, 0x98, 0x87, 0x76, 0x66, 0x66, 0x77, - 0x89, 0xAA, 0xBB, 0xAB, 0xA9, 0x98, 0x87, 0x77, 0x77, 0x77, 0x88, 0x9A, - 0xBC, 0xBB, 0xBB, 0xA9, 0x98, 0x88, 0x77, 0x78, 0x89, 0x9A, 0xAB, 0xCC, - 0xBC, 0xBB, 0xA9, 0x99, 0x88, 0x88, 0x99, 0x9A, 0xAB, 0xCC, 0xCB, 0xCC, - 0xBB, 0xAA, 0x99, 0x99, 0x99, 0x9A, 0xAB, 0xCC, 0xDC, 0xBD, 0xCC, 0xBB, - 0xBA, 0xAA, 0xAA, 0xAB, 0xBB, 0xBC, 0xDD, 0xCC, 0xDC, 0xCC, 0xCB, 0xBB, - 0xBB, 0xBB, 0xBC, 0xCC, 0xDE, 0xED, 0x8B, 0xBB, 0xBB, 0xBA, 0xAA, 0xBB, - 0xBB, 0xBC, 0xCC, 0xCD, 0xB0, 0x00, 0x00, 0x00, - ], - [ - 0xCF, 0xED, 0xED, 0xDC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0x7E, 0xFF, - 0xFE, 0xDD, 0xDC, 0xCD, 0xDD, 0xCE, 0xEE, 0xFF, 0xFD, 0xDF, 0xDD, 0xDC, - 0xDC, 0xCC, 0xBC, 0xCC, 0xCD, 0xDD, 0xFE, 0xDD, 0xEE, 0xDC, 0xBB, 0xBB, - 0xAA, 0xBB, 0xBB, 0xDD, 0xDE, 0xED, 0xDE, 0xDD, 0xBA, 0xA9, 0x99, 0x99, - 0xAA, 0xBB, 0xCD, 0xDD, 0xDD, 0xDC, 0xBB, 0xA9, 0x88, 0x88, 0x89, 0x9A, - 0xBC, 0xDE, 0xED, 0xCD, 0xCB, 0xA9, 0x87, 0x76, 0x77, 0x88, 0x9A, 0xBC, - 0xDE, 0xDD, 0xDC, 0xBA, 0x87, 0x65, 0x55, 0x67, 0x89, 0xAB, 0xCD, 0xDC, - 0xDD, 0xBA, 0x98, 0x76, 0x54, 0x45, 0x67, 0x89, 0xBC, 0xCE, 0xDC, 0xDB, - 0xA9, 0x86, 0x54, 0x33, 0x45, 0x78, 0x9A, 0xCD, 0xDD, 0xCD, 0xCA, 0x98, - 0x75, 0x43, 0x34, 0x57, 0x89, 0xAC, 0xCE, 0xCC, 0xDB, 0xB9, 0x87, 0x65, - 0x44, 0x56, 0x78, 0x9A, 0xBD, 0xFD, 0xCD, 0xCB, 0xA9, 0x87, 0x65, 0x56, - 0x67, 0x89, 0xBC, 0xDD, 0xDC, 0xDD, 0xBA, 0x98, 0x87, 0x77, 0x77, 0x89, - 0xAB, 0xCD, 0xED, 0xCD, 0xCB, 0xBA, 0x99, 0x88, 0x88, 0x89, 0xAB, 0xCD, - 0xDF, 0xEC, 0xED, 0xDB, 0xBA, 0xA9, 0x99, 0x9A, 0xAB, 0xBC, 0xDE, 0xDE, - 0xCF, 0xDD, 0xCB, 0xBB, 0xAA, 0xAA, 0xAB, 0xBC, 0xDE, 0xDF, 0xED, 0xFE, - 0xDD, 0xCC, 0xCB, 0xCB, 0xCC, 0xCD, 0xDE, 0xEE, 0xFD, 0xDF, 0xEF, 0xFD, - 0xDD, 0xDD, 0xDC, 0xED, 0xED, 0xEE, 0xFF, 0xFD, 0xFF, 0xFD, 0xEE, 0xED, - 0xDD, 0xDF, 0xEE, 0xFE, 0xFF, 0xFF, 0x8D, 0xDD, 0xDC, 0xCD, 0xDD, 0xCD, - 0xCD, 0xDD, 0xED, 0xEE, 0xD0, 0x00, 0x00, 0x00, - ], - [ - 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, 0xFE, 0xCF, 0xCD, 0xCC, 0xCC, 0x8F, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xDD, - 0xFF, 0xCD, 0xDD, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xDB, 0xCC, 0xBB, - 0xCC, 0xCF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xCC, 0xBA, 0xAA, 0xAB, 0xBC, - 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0xCB, 0xA9, 0x88, 0x88, 0x9A, 0xBD, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFD, 0xA9, 0x87, 0x66, 0x78, 0x9B, 0xCD, 0xFF, 0xFF, - 0xFF, 0xDC, 0xBA, 0x86, 0x54, 0x45, 0x78, 0xAC, 0xDF, 0xFF, 0xFF, 0xFF, - 0xFB, 0xA8, 0x64, 0x22, 0x46, 0x89, 0xBD, 0xFF, 0xFF, 0xDF, 0xDC, 0xB9, - 0x86, 0x42, 0x24, 0x68, 0x9B, 0xDD, 0xFF, 0xFF, 0xFF, 0xCC, 0xA8, 0x75, - 0x44, 0x56, 0x8A, 0xBF, 0xFF, 0xFF, 0xFF, 0xCF, 0xCA, 0x98, 0x76, 0x66, - 0x79, 0xAD, 0xFF, 0xFF, 0xFF, 0xFD, 0xFD, 0xBA, 0x98, 0x88, 0x89, 0xAB, - 0xDC, 0xFF, 0xFF, 0xDF, 0xFF, 0xDC, 0xCA, 0xAA, 0xAA, 0xAB, 0xCF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xDB, 0xCC, 0xBB, 0xCC, 0xFD, 0xDF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xDD, 0xCF, 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFD, 0xFF, 0xCD, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xEF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x8D, 0xFF, 0xDF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00, 0x00, - ], - [ - 0xDF, 0xFD, 0xDD, 0xDC, 0xCC, 0xCB, 0xCC, 0xCC, 0xCC, 0xCC, 0x8F, 0xFF, - 0xEE, 0xDD, 0xDC, 0xCC, 0xCD, 0xDC, 0xED, 0xDF, 0xFC, 0xFF, 0xEE, 0xDC, - 0xCC, 0xCB, 0xBB, 0xBC, 0xCC, 0xDE, 0xEF, 0xDF, 0xFD, 0xCC, 0xBB, 0xAB, - 0xAA, 0xAB, 0xBB, 0xCC, 0xDE, 0xED, 0xDD, 0xDC, 0xBB, 0xAA, 0x99, 0x99, - 0x9A, 0xBC, 0xCD, 0xDD, 0xDD, 0xFD, 0xCB, 0xA9, 0x88, 0x88, 0x89, 0x9A, - 0xBB, 0xCD, 0xDD, 0xDC, 0xCB, 0xA9, 0x87, 0x77, 0x77, 0x88, 0x9A, 0xBC, - 0xDE, 0xDD, 0xDC, 0xA9, 0x87, 0x66, 0x55, 0x67, 0x89, 0xAB, 0xCD, 0xED, - 0xCC, 0xCA, 0x98, 0x76, 0x54, 0x45, 0x67, 0x89, 0xAC, 0xDE, 0xDC, 0xCB, - 0xA9, 0x87, 0x54, 0x33, 0x45, 0x78, 0x9A, 0xBC, 0xDD, 0xDC, 0xBA, 0x98, - 0x75, 0x43, 0x34, 0x56, 0x89, 0xAB, 0xCD, 0xDC, 0xCB, 0xA9, 0x87, 0x65, - 0x44, 0x56, 0x78, 0x9A, 0xBD, 0xDD, 0xDD, 0xCB, 0xA9, 0x87, 0x65, 0x55, - 0x67, 0x89, 0xBC, 0xDE, 0xDC, 0xCC, 0xBA, 0x98, 0x87, 0x76, 0x77, 0x89, - 0xAB, 0xCD, 0xEE, 0xCD, 0xCB, 0xBA, 0x99, 0x88, 0x88, 0x89, 0xAB, 0xCD, - 0xDE, 0xFC, 0xED, 0xBB, 0xBA, 0xA9, 0x99, 0x9A, 0xAB, 0xBD, 0xDF, 0xFE, - 0xCD, 0xED, 0xCB, 0xBB, 0xBA, 0xAA, 0xBB, 0xCC, 0xED, 0xFF, 0xEC, 0xEE, - 0xDC, 0xCC, 0xCC, 0xBC, 0xCC, 0xDD, 0xDF, 0xEF, 0xFF, 0xCD, 0xED, 0xDD, - 0xCD, 0xCD, 0xDC, 0xDD, 0xDF, 0xEF, 0xFF, 0xFC, 0xFF, 0xFD, 0xEE, 0xED, - 0xEE, 0xEE, 0xEF, 0xFF, 0xFF, 0xFF, 0x8D, 0xDC, 0xCD, 0xCD, 0xDD, 0xED, - 0xEE, 0xFE, 0xFF, 0xFF, 0xE0, 0x00, 0x00, 0x00, - ], - [ - 0xFF, 0xFF, 0xED, 0xDC, 0xCC, 0xCC, 0xCC, 0xCC, 0xDD, 0xDD, 0xAF, 0xFF, - 0xFD, 0xDC, 0xCB, 0xBB, 0xBC, 0xCC, 0xDD, 0xEF, 0xFE, 0xFF, 0xED, 0xCB, - 0xBB, 0xAA, 0xAA, 0xAB, 0xBC, 0xCD, 0xEF, 0xEE, 0xED, 0xCB, 0xAA, 0x99, - 0x99, 0x99, 0xAA, 0xBC, 0xCD, 0xFE, 0xED, 0xCB, 0xA9, 0x98, 0x88, 0x88, - 0x89, 0x9A, 0xBC, 0xDD, 0xDD, 0xDB, 0xA9, 0x98, 0x77, 0x77, 0x77, 0x89, - 0x9A, 0xBC, 0xDD, 0xCC, 0xBA, 0x98, 0x76, 0x66, 0x66, 0x77, 0x89, 0xAB, - 0xCD, 0xDC, 0xCA, 0x98, 0x76, 0x65, 0x55, 0x66, 0x77, 0x89, 0xAB, 0xDD, - 0xCB, 0xA9, 0x87, 0x65, 0x55, 0x55, 0x56, 0x78, 0x9A, 0xBC, 0xDC, 0xBA, - 0x98, 0x76, 0x55, 0x44, 0x55, 0x67, 0x89, 0xAB, 0xCD, 0xCB, 0xA9, 0x87, - 0x65, 0x54, 0x45, 0x56, 0x78, 0x9A, 0xBD, 0xDC, 0xBA, 0x98, 0x76, 0x65, - 0x55, 0x55, 0x67, 0x89, 0xAB, 0xDD, 0xCB, 0xA9, 0x87, 0x76, 0x65, 0x55, - 0x66, 0x78, 0x9B, 0xCD, 0xEC, 0xCB, 0xA9, 0x87, 0x76, 0x66, 0x66, 0x78, - 0x9A, 0xBC, 0xDE, 0xCC, 0xBA, 0xA9, 0x87, 0x77, 0x77, 0x78, 0x99, 0xAB, - 0xDF, 0xED, 0xDC, 0xBA, 0x99, 0x88, 0x88, 0x88, 0x9A, 0xAB, 0xCD, 0xFF, - 0xDD, 0xCC, 0xBA, 0xA9, 0x99, 0x99, 0x9A, 0xAB, 0xCD, 0xFF, 0xFD, 0xED, - 0xCC, 0xBB, 0xBA, 0xAA, 0xAB, 0xBC, 0xCD, 0xEF, 0xFF, 0xDF, 0xED, 0xDC, - 0xCC, 0xBB, 0xBB, 0xCC, 0xDD, 0xEF, 0xFF, 0xFD, 0xFF, 0xED, 0xDD, 0xDD, - 0xDD, 0xDD, 0xDE, 0xFF, 0xFF, 0xFF, 0xAD, 0xDD, 0xDD, 0xDD, 0xDC, 0xDD, - 0xDE, 0xEF, 0xFF, 0xFF, 0xF0, 0x00, 0x00, 0x00, - ], - [ - 0xEF, 0xFF, 0xED, 0xDC, 0xDC, 0xCC, 0xCC, 0xCC, 0xCD, 0xDD, 0x9F, 0xFF, - 0xFE, 0xDD, 0xCC, 0xCC, 0xCC, 0xCD, 0xDD, 0xEE, 0xFD, 0xFE, 0xEE, 0xCC, - 0xCB, 0xBB, 0xBB, 0xBB, 0xBC, 0xDE, 0xEE, 0xDE, 0xFF, 0xDC, 0xBB, 0xAA, - 0x99, 0xAA, 0xAB, 0xCC, 0xCE, 0xDD, 0xED, 0xEC, 0xBA, 0x99, 0x88, 0x88, - 0x9A, 0xAB, 0xBC, 0xEE, 0xCD, 0xDC, 0xBA, 0x98, 0x87, 0x77, 0x78, 0x89, - 0xAB, 0xCC, 0xED, 0xDD, 0xCA, 0x98, 0x77, 0x66, 0x66, 0x78, 0x89, 0xAB, - 0xCD, 0xDD, 0xDB, 0xA9, 0x87, 0x65, 0x55, 0x66, 0x78, 0x9A, 0xBC, 0xDD, - 0xDC, 0xBA, 0x97, 0x65, 0x54, 0x55, 0x66, 0x78, 0xAB, 0xBD, 0xCC, 0xCB, - 0xA8, 0x76, 0x54, 0x44, 0x55, 0x67, 0x89, 0xAC, 0xDE, 0xCC, 0xA9, 0x87, - 0x65, 0x44, 0x44, 0x56, 0x78, 0x9B, 0xCD, 0xDC, 0xCB, 0xA8, 0x76, 0x65, - 0x54, 0x55, 0x67, 0x9A, 0xBC, 0xDD, 0xCC, 0xBA, 0x98, 0x76, 0x65, 0x55, - 0x67, 0x89, 0xAB, 0xCD, 0xDC, 0xDC, 0xA9, 0x88, 0x76, 0x66, 0x67, 0x78, - 0x9A, 0xBD, 0xDD, 0xDD, 0xCB, 0xA9, 0x88, 0x87, 0x77, 0x88, 0x9A, 0xBC, - 0xDF, 0xDD, 0xDC, 0xCB, 0xA9, 0x98, 0x88, 0x89, 0x9A, 0xBC, 0xCE, 0xFE, - 0xDD, 0xDC, 0xBB, 0xBA, 0xA9, 0xAA, 0xAA, 0xBC, 0xDE, 0xDF, 0xFD, 0xFD, - 0xCC, 0xCB, 0xBB, 0xBA, 0xBB, 0xBC, 0xDD, 0xEF, 0xFF, 0xDF, 0xDD, 0xDC, - 0xCC, 0xCC, 0xCC, 0xCC, 0xDD, 0xEE, 0xFF, 0xFD, 0xEE, 0xDE, 0xDD, 0xDD, - 0xDD, 0xDD, 0xEF, 0xEF, 0xFF, 0xFF, 0x9C, 0xCC, 0xCC, 0xCD, 0xDC, 0xED, - 0xEE, 0xEF, 0xFF, 0xFE, 0xF0, 0x00, 0x00, 0x00, - ], - [ - 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xDD, 0xED, 0xDD, 0xCC, 0xDD, 0x8F, 0xFF, - 0xFF, 0xFE, 0xFE, 0xDD, 0xDD, 0xDF, 0xFF, 0xFF, 0xFE, 0xFF, 0xFF, 0xFF, - 0xFE, 0xDD, 0xDD, 0xDC, 0xEE, 0xEF, 0xFF, 0xFF, 0xFF, 0xFE, 0xDD, 0xCC, - 0xBB, 0xBB, 0xCD, 0xDF, 0xFF, 0xFD, 0xFF, 0xDE, 0xDC, 0xBB, 0xAA, 0xAA, - 0xAA, 0xCC, 0xCF, 0xFF, 0xDF, 0xFF, 0xCC, 0xBA, 0x98, 0x88, 0x99, 0xAB, - 0xCD, 0xFD, 0xFF, 0xED, 0xED, 0xBA, 0x87, 0x77, 0x77, 0x89, 0xAB, 0xCD, - 0xFF, 0xDD, 0xED, 0xCB, 0x97, 0x65, 0x55, 0x67, 0x89, 0xBC, 0xFF, 0xEF, - 0xEF, 0xDB, 0xA8, 0x75, 0x44, 0x45, 0x67, 0x9A, 0xCD, 0xEF, 0xED, 0xEC, - 0xCA, 0x87, 0x54, 0x33, 0x45, 0x78, 0xAB, 0xDF, 0xFE, 0xDE, 0xCB, 0xA8, - 0x75, 0x43, 0x34, 0x57, 0x89, 0xCD, 0xEF, 0xFD, 0xEC, 0xCA, 0x97, 0x65, - 0x44, 0x45, 0x79, 0xAB, 0xDE, 0xDF, 0xFE, 0xDC, 0xA9, 0x87, 0x65, 0x55, - 0x67, 0x9A, 0xCD, 0xFF, 0xFE, 0xDE, 0xCB, 0xA9, 0x87, 0x77, 0x78, 0x9A, - 0xBC, 0xEF, 0xFF, 0xFF, 0xFD, 0xCB, 0xA9, 0x98, 0x88, 0x9A, 0xBC, 0xDE, - 0xFF, 0xFF, 0xDF, 0xCC, 0xBB, 0xAA, 0xA9, 0xAB, 0xBC, 0xDD, 0xFE, 0xFF, - 0xDF, 0xEE, 0xEC, 0xCC, 0xBB, 0xBC, 0xBD, 0xED, 0xFF, 0xFF, 0xFF, 0xEF, - 0xFD, 0xDD, 0xCC, 0xDC, 0xCD, 0xDF, 0xFF, 0xFF, 0xFF, 0xCF, 0xDE, 0xEF, - 0xDE, 0xFD, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, 0xFF, 0xFD, 0xFF, 0xEE, - 0xEE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7C, 0xCB, 0xCD, 0xDE, 0xFF, 0xEE, - 0xDF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00, 0x00, - ], - [ - 0xCD, 0xED, 0xDB, 0xCC, 0xBA, 0xAB, 0xBB, 0xBB, 0xBB, 0xBB, 0x7F, 0xFD, - 0xCD, 0xCB, 0xBA, 0xBB, 0xBB, 0xBF, 0xDC, 0xDC, 0xFD, 0xDD, 0xDC, 0xBB, - 0xAA, 0xAA, 0xAA, 0xBB, 0xBB, 0xED, 0xCF, 0xEC, 0xDC, 0xBA, 0xAA, 0x99, - 0x98, 0x99, 0xAA, 0xBB, 0xCD, 0xDF, 0xDC, 0xBA, 0xA9, 0x88, 0x88, 0x88, - 0x99, 0x9A, 0xBC, 0xCE, 0xDC, 0xDB, 0xA9, 0x88, 0x77, 0x77, 0x77, 0x89, - 0x9A, 0xCD, 0xCF, 0xCC, 0xB9, 0x98, 0x77, 0x66, 0x66, 0x77, 0x89, 0xAA, - 0xCC, 0xDC, 0xCA, 0x98, 0x77, 0x65, 0x55, 0x66, 0x77, 0x89, 0xAC, 0xCC, - 0xBB, 0xA9, 0x87, 0x65, 0x55, 0x55, 0x66, 0x78, 0x9A, 0xBC, 0xDB, 0xCA, - 0x98, 0x76, 0x55, 0x44, 0x55, 0x67, 0x89, 0xAA, 0xCC, 0xCB, 0xA9, 0x87, - 0x65, 0x54, 0x45, 0x56, 0x78, 0x9A, 0xBC, 0xDB, 0xBA, 0x98, 0x76, 0x65, - 0x55, 0x55, 0x67, 0x89, 0xAB, 0xCD, 0xBB, 0xA9, 0x88, 0x76, 0x65, 0x55, - 0x67, 0x78, 0x9A, 0xBD, 0xCB, 0xCB, 0xA9, 0x87, 0x76, 0x66, 0x66, 0x78, - 0x89, 0xAC, 0xCF, 0xCC, 0xBA, 0x99, 0x88, 0x77, 0x77, 0x78, 0x89, 0xAB, - 0xCD, 0xCC, 0xDB, 0xAA, 0x99, 0x88, 0x88, 0x88, 0x99, 0xAB, 0xCC, 0xDD, - 0xDF, 0xCB, 0xAA, 0xA9, 0x98, 0x99, 0x9A, 0xAB, 0xBD, 0xDF, 0xFC, 0xEE, - 0xDB, 0xBA, 0xAA, 0xAA, 0xAA, 0xBB, 0xBD, 0xDE, 0xFF, 0xCF, 0xDD, 0xDD, - 0xBC, 0xBB, 0xBB, 0xBC, 0xCC, 0xDE, 0xFF, 0xDD, 0xDD, 0xED, 0xCD, 0xCD, - 0xDC, 0xCC, 0xCE, 0xDF, 0xFF, 0xFF, 0x8D, 0xBB, 0xED, 0xCC, 0xCB, 0xCD, - 0xCF, 0xDD, 0xDF, 0xFF, 0xF0, 0x00, 0x00, 0x00, - ], - [ - 0xBD, 0xCB, 0xBA, 0xAA, 0x99, 0x99, 0x9A, 0xAA, 0xAA, 0xBB, 0x7C, 0xDC, - 0xCB, 0xBA, 0xAA, 0xAA, 0xAA, 0xAB, 0xBB, 0xBC, 0xDC, 0xCC, 0xBB, 0xAA, - 0x99, 0x99, 0x99, 0x9A, 0xAA, 0xBB, 0xCC, 0xCB, 0xBA, 0xA9, 0x99, 0x88, - 0x88, 0x88, 0x99, 0x9A, 0xBC, 0xDC, 0xBB, 0xAA, 0x98, 0x88, 0x77, 0x77, - 0x88, 0x99, 0xAA, 0xBB, 0xBA, 0xAA, 0x98, 0x87, 0x77, 0x77, 0x77, 0x88, - 0x99, 0xAB, 0xBB, 0xAA, 0x99, 0x87, 0x76, 0x66, 0x66, 0x77, 0x88, 0x9A, - 0xAB, 0xB9, 0xA9, 0x88, 0x76, 0x66, 0x66, 0x66, 0x77, 0x88, 0x9A, 0xAB, - 0x9A, 0x98, 0x77, 0x66, 0x55, 0x55, 0x66, 0x78, 0x89, 0xAB, 0xB9, 0xA9, - 0x87, 0x76, 0x65, 0x55, 0x56, 0x67, 0x78, 0x9A, 0xAA, 0x9A, 0x98, 0x77, - 0x66, 0x55, 0x55, 0x66, 0x77, 0x89, 0x9A, 0xB9, 0xA9, 0x88, 0x76, 0x65, - 0x55, 0x56, 0x67, 0x78, 0x9A, 0xBA, 0x9A, 0x98, 0x87, 0x76, 0x66, 0x66, - 0x66, 0x78, 0x89, 0xAB, 0xBA, 0xAA, 0x98, 0x87, 0x76, 0x66, 0x66, 0x77, - 0x88, 0x9A, 0xBB, 0xAB, 0xA9, 0x98, 0x87, 0x77, 0x77, 0x77, 0x88, 0x9A, - 0xAC, 0xBA, 0xBA, 0xA9, 0x88, 0x87, 0x77, 0x78, 0x88, 0x9A, 0xAB, 0xCC, - 0xBB, 0xBA, 0xA9, 0x98, 0x88, 0x88, 0x89, 0x99, 0xAB, 0xCD, 0xCB, 0xCB, - 0xBA, 0xA9, 0x99, 0x99, 0x99, 0x9A, 0xBB, 0xCC, 0xDE, 0xBC, 0xCC, 0xBB, - 0xAA, 0xAA, 0xAA, 0xAB, 0xBB, 0xCD, 0xCE, 0xDB, 0xDE, 0xCC, 0xCB, 0xBB, - 0xBB, 0xBB, 0xBC, 0xCC, 0xDD, 0xED, 0x9C, 0xCB, 0xBB, 0xAB, 0xAA, 0xBA, - 0xBB, 0xBB, 0xCD, 0xDD, 0xD0, 0x00, 0x00, 0x00, - ], - [ - 0xBC, 0xBB, 0xAA, 0x99, 0x99, 0x99, 0x99, 0xAA, 0xAB, 0xBB, 0x9C, 0xCC, - 0xBB, 0xAA, 0x99, 0x99, 0x9A, 0xAA, 0xAB, 0xBC, 0xDC, 0xBC, 0xBA, 0xA9, - 0x99, 0x99, 0x99, 0x99, 0x9A, 0xAB, 0xBC, 0xBB, 0xBA, 0xA9, 0x98, 0x88, - 0x88, 0x88, 0x99, 0x9A, 0xAB, 0xBB, 0xAA, 0xA9, 0x98, 0x87, 0x77, 0x77, - 0x88, 0x89, 0x9A, 0xAB, 0xBA, 0xA9, 0x98, 0x87, 0x77, 0x77, 0x77, 0x78, - 0x89, 0x9A, 0xBA, 0xAA, 0x98, 0x87, 0x76, 0x66, 0x66, 0x77, 0x78, 0x89, - 0xAB, 0xA9, 0xA9, 0x88, 0x76, 0x66, 0x66, 0x66, 0x77, 0x88, 0x9A, 0xAA, - 0x99, 0x98, 0x77, 0x66, 0x65, 0x66, 0x66, 0x77, 0x89, 0x9A, 0xA9, 0x99, - 0x87, 0x76, 0x65, 0x55, 0x66, 0x67, 0x78, 0x99, 0xAA, 0x99, 0x98, 0x77, - 0x66, 0x65, 0x55, 0x66, 0x77, 0x89, 0x9A, 0xA9, 0x99, 0x87, 0x76, 0x66, - 0x55, 0x66, 0x67, 0x78, 0x9A, 0xAA, 0x9A, 0x98, 0x87, 0x76, 0x66, 0x66, - 0x66, 0x77, 0x89, 0xAA, 0xA9, 0xA9, 0x88, 0x77, 0x76, 0x66, 0x66, 0x77, - 0x88, 0x9A, 0xBB, 0xAA, 0x99, 0x88, 0x77, 0x77, 0x77, 0x77, 0x88, 0x99, - 0xAB, 0xBA, 0xBA, 0x99, 0x88, 0x87, 0x77, 0x77, 0x88, 0x99, 0xAB, 0xBB, - 0xAB, 0xAA, 0x99, 0x88, 0x88, 0x88, 0x88, 0x99, 0xAA, 0xBC, 0xBB, 0xBB, - 0xAA, 0x99, 0x99, 0x99, 0x99, 0x99, 0xAA, 0xBB, 0xDC, 0xBC, 0xBB, 0xAA, - 0xAA, 0x99, 0x99, 0xAA, 0xAA, 0xBC, 0xCD, 0xDB, 0xCD, 0xCB, 0xBB, 0xAA, - 0xAA, 0xAA, 0xAB, 0xBC, 0xCD, 0xDD, 0x9C, 0xBB, 0xBA, 0xAA, 0xAA, 0xAA, - 0xAA, 0xBB, 0xCC, 0xDD, 0xC0, 0x00, 0x00, 0x00, - ], - [ - 0xCC, 0xCB, 0xBA, 0xAA, 0xAA, 0x9A, 0xAA, 0xAA, 0xBB, 0xBB, 0x8C, 0xCD, - 0xBB, 0xBA, 0xAA, 0xAA, 0xAA, 0xAB, 0xBC, 0xCC, 0xDC, 0xCC, 0xBA, 0xBA, - 0xA9, 0x99, 0x99, 0x9A, 0xAA, 0xAB, 0xCC, 0xCC, 0xCB, 0xA9, 0x99, 0x88, - 0x88, 0x89, 0x99, 0x9A, 0xBB, 0xCB, 0xBB, 0xAA, 0x98, 0x88, 0x77, 0x78, - 0x88, 0x99, 0xAA, 0xBC, 0xBB, 0xAA, 0x98, 0x87, 0x77, 0x77, 0x77, 0x88, - 0x99, 0xAB, 0xBB, 0xAA, 0xA9, 0x87, 0x76, 0x66, 0x66, 0x77, 0x88, 0x99, - 0xAB, 0xAA, 0xA9, 0x88, 0x76, 0x66, 0x56, 0x66, 0x77, 0x89, 0x9A, 0xBB, - 0x9A, 0x98, 0x77, 0x66, 0x55, 0x55, 0x66, 0x78, 0x89, 0xAB, 0xAA, 0xA9, - 0x87, 0x76, 0x55, 0x55, 0x56, 0x67, 0x79, 0x9A, 0xBB, 0xAA, 0x98, 0x77, - 0x66, 0x55, 0x55, 0x66, 0x77, 0x89, 0xAA, 0xA9, 0xA9, 0x88, 0x76, 0x65, - 0x55, 0x56, 0x67, 0x78, 0x9A, 0xAA, 0xAA, 0x98, 0x87, 0x76, 0x66, 0x66, - 0x66, 0x78, 0x99, 0xAB, 0xBA, 0xBA, 0x98, 0x87, 0x76, 0x66, 0x66, 0x77, - 0x89, 0xAA, 0xBC, 0xAB, 0xAA, 0x98, 0x87, 0x77, 0x77, 0x77, 0x88, 0x9A, - 0xBC, 0xBA, 0xBA, 0xA9, 0x98, 0x88, 0x77, 0x78, 0x88, 0x9A, 0xBB, 0xCB, - 0xAB, 0xBA, 0xA9, 0x99, 0x88, 0x88, 0x89, 0x9A, 0xAB, 0xCC, 0xCB, 0xDB, - 0xAA, 0xAA, 0x99, 0x99, 0x99, 0x9A, 0xBB, 0xCD, 0xDC, 0xBC, 0xBB, 0xBA, - 0xAA, 0xAA, 0xAA, 0xAB, 0xBB, 0xCC, 0xDE, 0xDB, 0xCC, 0xCC, 0xBB, 0xBB, - 0xBB, 0xBB, 0xBC, 0xCC, 0xCE, 0xDD, 0x7B, 0xBB, 0xBA, 0xAA, 0xAA, 0xAA, - 0xBB, 0xCB, 0xCC, 0xCC, 0xC0, 0x00, 0x00, 0x00, - ], - [ - 0xFF, 0xFF, 0xFF, 0xFF, 0xDF, 0xDC, 0xFE, 0xCD, 0xCC, 0xDD, 0x7F, 0xFF, - 0xFF, 0xFF, 0xFF, 0xDF, 0xFF, 0xFF, 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFD, 0xFF, 0xDF, 0xFF, 0xDD, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xDC, - 0xBD, 0xDF, 0xFD, 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xDC, 0xCC, 0xBB, - 0xCC, 0xFF, 0xDF, 0xFF, 0xFD, 0xFF, 0xFD, 0xCB, 0xAA, 0xAA, 0xAC, 0xBB, - 0xBE, 0xDF, 0xFF, 0xEF, 0xDF, 0xDC, 0xA9, 0x98, 0x89, 0xAA, 0xCB, 0xFF, - 0xFF, 0xFF, 0xFF, 0xCC, 0xA9, 0x86, 0x66, 0x78, 0xAB, 0xCD, 0xFF, 0xFD, - 0xFF, 0xFD, 0xBA, 0x86, 0x54, 0x45, 0x79, 0xAC, 0xCF, 0xDF, 0xFF, 0xFF, - 0xCC, 0xA8, 0x64, 0x22, 0x46, 0x8A, 0xBE, 0xDF, 0xFF, 0xFF, 0xFD, 0xCA, - 0x86, 0x42, 0x24, 0x68, 0xAB, 0xCF, 0xFF, 0xFF, 0xFF, 0xDC, 0xA9, 0x75, - 0x44, 0x56, 0x8A, 0xCD, 0xDF, 0xFE, 0xFF, 0xFD, 0xDB, 0x98, 0x76, 0x66, - 0x89, 0xBC, 0xDF, 0xFF, 0xFF, 0xFF, 0xFC, 0xBA, 0x99, 0x88, 0x89, 0xBB, - 0xDD, 0xFF, 0xFF, 0xFF, 0xFD, 0xCC, 0xBA, 0xA9, 0x9A, 0xBC, 0xDD, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xDC, 0xBC, 0xBB, 0xCC, 0xCC, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xDC, 0xFD, 0xDD, 0xDD, 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xDC, 0xFD, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFD, 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0xCD, 0xDF, 0xFD, 0xEE, 0xDF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00, 0x00, - ], - [ - 0xFF, 0xFF, 0xDF, 0xFF, 0xFD, 0xFF, 0xFC, 0xFF, 0xFC, 0xFF, 0x7F, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, - 0xFF, 0xDF, 0xFF, 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xFC, 0xCC, 0xCF, - 0xDD, 0xFF, 0xFC, 0xFF, 0xFF, 0xFF, 0xCF, 0xDD, 0xBB, 0xBA, 0xAC, 0xCB, - 0xFD, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xAA, 0x99, 0x89, 0xAA, 0xAF, 0xFF, - 0xFF, 0xFF, 0xCF, 0xFC, 0xBA, 0x87, 0x66, 0x79, 0xAB, 0xDD, 0xFF, 0xFF, - 0xFF, 0xFF, 0xCB, 0x97, 0x54, 0x45, 0x79, 0xBC, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xB9, 0x64, 0x22, 0x46, 0x8A, 0xDD, 0xDD, 0xFF, 0xFF, 0xFD, 0xDC, - 0x96, 0x42, 0x23, 0x69, 0xBB, 0xCF, 0xFF, 0xFF, 0xFF, 0xFC, 0xB9, 0x75, - 0x44, 0x57, 0x9B, 0xBF, 0xFF, 0xFF, 0xCF, 0xFF, 0xFF, 0xA9, 0x76, 0x66, - 0x89, 0xFB, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xCB, 0xA9, 0x88, 0x99, 0xAD, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xDC, 0xAA, 0xAB, 0xCC, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xDF, 0xFF, 0xDB, 0xBB, 0xBF, 0xCF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xDD, 0xFD, 0xFD, 0xFC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xDC, 0xDC, 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xDD, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0xDF, 0xFD, 0xFF, 0xFA, 0xBD, - 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00, 0x00, - ], - [ - 0x89, 0x99, 0x98, 0x88, 0x88, 0x88, 0x88, 0x98, 0x98, 0x9A, 0x6A, 0xCB, - 0x9A, 0xA9, 0x99, 0x99, 0xAA, 0x9A, 0xAB, 0xAA, 0xDA, 0x9A, 0xA9, 0x89, - 0x99, 0x89, 0x99, 0x89, 0x8A, 0x99, 0xAA, 0x9A, 0xAA, 0x99, 0x88, 0x88, - 0x88, 0x88, 0x89, 0xA9, 0xAA, 0xAA, 0x89, 0xA9, 0x98, 0x88, 0x88, 0x88, - 0x88, 0x89, 0x9A, 0xB9, 0xA9, 0xA9, 0x98, 0x78, 0x77, 0x77, 0x77, 0x88, - 0x89, 0x9A, 0xA9, 0x89, 0x98, 0x87, 0x76, 0x76, 0x77, 0x77, 0x88, 0x99, - 0x9A, 0xA8, 0x98, 0x88, 0x76, 0x66, 0x66, 0x77, 0x77, 0x88, 0x89, 0x98, - 0x89, 0x98, 0x87, 0x76, 0x66, 0x66, 0x67, 0x78, 0x88, 0x9B, 0xA8, 0x99, - 0x87, 0x76, 0x65, 0x55, 0x66, 0x77, 0x88, 0x98, 0xA8, 0x89, 0x88, 0x87, - 0x76, 0x65, 0x56, 0x67, 0x77, 0x88, 0x99, 0x98, 0x99, 0x78, 0x77, 0x66, - 0x65, 0x66, 0x67, 0x78, 0x8A, 0x99, 0x89, 0x98, 0x78, 0x77, 0x66, 0x66, - 0x67, 0x77, 0x88, 0xAB, 0x98, 0x99, 0x89, 0x87, 0x77, 0x76, 0x67, 0x77, - 0x88, 0x89, 0xA9, 0x9A, 0x9A, 0x98, 0x77, 0x77, 0x77, 0x77, 0x78, 0x89, - 0x9B, 0x98, 0xA9, 0x99, 0x88, 0x88, 0x87, 0x78, 0x88, 0x88, 0x9A, 0xA9, - 0x8A, 0x99, 0x99, 0x89, 0x88, 0x88, 0x88, 0x99, 0x8A, 0xAA, 0xA9, 0xAB, - 0xAA, 0x98, 0x88, 0x89, 0x88, 0x89, 0x9A, 0xBA, 0xA9, 0xAC, 0xBA, 0xB9, - 0xAA, 0x99, 0x99, 0x9A, 0x99, 0xAA, 0xAD, 0xA9, 0xBA, 0xAB, 0xAB, 0xA9, - 0x9A, 0x9A, 0xBA, 0xAA, 0x9C, 0xBB, 0x8B, 0xA9, 0xA8, 0x99, 0x98, 0x88, - 0x99, 0x9A, 0xAA, 0xAB, 0xA0, 0x00, 0x00, 0x00, - ], - [ - 0xFF, 0xFF, 0xFE, 0xDD, 0xCC, 0xCC, 0xDC, 0xDD, 0xED, 0xEF, 0xDF, 0xFF, - 0xED, 0xDC, 0xBB, 0xBB, 0xBC, 0xCC, 0xDE, 0xFF, 0xFF, 0xFF, 0xFE, 0xCB, - 0xBA, 0xAA, 0xAA, 0xAB, 0xBC, 0xDE, 0xFF, 0xFF, 0xFD, 0xCB, 0xAA, 0x99, - 0x99, 0x99, 0xAA, 0xBC, 0xDD, 0xFF, 0xFD, 0xCB, 0xA9, 0x98, 0x87, 0x88, - 0x89, 0x9A, 0xBC, 0xFF, 0xFE, 0xDC, 0xA9, 0x88, 0x77, 0x77, 0x77, 0x88, - 0x9A, 0xBC, 0xDF, 0xDC, 0xBA, 0x98, 0x76, 0x66, 0x66, 0x67, 0x89, 0xAB, - 0xCD, 0xEE, 0xBB, 0x98, 0x76, 0x65, 0x55, 0x56, 0x67, 0x89, 0xAB, 0xDF, - 0xCB, 0xA9, 0x87, 0x65, 0x55, 0x55, 0x56, 0x78, 0x9A, 0xBD, 0xDC, 0xBA, - 0x98, 0x76, 0x55, 0x45, 0x55, 0x67, 0x89, 0xAB, 0xDD, 0xCB, 0xA9, 0x87, - 0x65, 0x55, 0x45, 0x56, 0x78, 0x9A, 0xBC, 0xDC, 0xBA, 0x98, 0x76, 0x65, - 0x55, 0x55, 0x67, 0x89, 0xAC, 0xDD, 0xCC, 0xA9, 0x87, 0x76, 0x55, 0x55, - 0x66, 0x78, 0x9B, 0xCD, 0xEC, 0xCA, 0xA9, 0x87, 0x66, 0x66, 0x66, 0x78, - 0x9A, 0xBC, 0xDF, 0xDC, 0xBA, 0x99, 0x87, 0x77, 0x77, 0x78, 0x89, 0xAB, - 0xDF, 0xFF, 0xDC, 0xBA, 0x99, 0x88, 0x88, 0x88, 0x99, 0xAB, 0xCD, 0xFF, - 0xFE, 0xCB, 0xBA, 0x99, 0x99, 0x99, 0x9A, 0xAB, 0xCD, 0xFF, 0xFF, 0xFD, - 0xDC, 0xCB, 0xAA, 0xAA, 0xAA, 0xBC, 0xCD, 0xFF, 0xFF, 0xFF, 0xEF, 0xDD, - 0xCB, 0xBB, 0xBB, 0xCC, 0xDD, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, 0xDD, - 0xDD, 0xDE, 0xDE, 0xFF, 0xFF, 0xFF, 0xCF, 0xFE, 0xFE, 0xFE, 0xEF, 0xDD, - 0xDF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00, 0x00, - ], - [ - 0x9B, 0xAA, 0x99, 0xA9, 0x89, 0x89, 0x99, 0x98, 0x99, 0xBB, 0x6B, 0xAB, - 0xBA, 0xAA, 0x99, 0x99, 0x99, 0xBA, 0xAB, 0xBE, 0xFB, 0x9B, 0xAA, 0x99, - 0x99, 0x99, 0x99, 0xA9, 0xAC, 0x9B, 0xBA, 0xC9, 0xB9, 0xA9, 0x99, 0x88, - 0x89, 0x88, 0x89, 0xAA, 0xAA, 0xBA, 0x99, 0x99, 0x88, 0x88, 0x77, 0x87, - 0x88, 0x89, 0xAA, 0xAA, 0xA9, 0x9A, 0x88, 0x87, 0x77, 0x77, 0x78, 0x88, - 0x99, 0xAA, 0xA9, 0x9A, 0x99, 0x87, 0x76, 0x66, 0x67, 0x77, 0x88, 0x99, - 0xBB, 0xA9, 0x99, 0x88, 0x77, 0x66, 0x66, 0x66, 0x78, 0x88, 0x99, 0xB9, - 0x9A, 0x98, 0x87, 0x66, 0x55, 0x56, 0x67, 0x78, 0x89, 0xAA, 0x99, 0x99, - 0x87, 0x76, 0x65, 0x55, 0x56, 0x77, 0x78, 0x8A, 0xA9, 0x99, 0x99, 0x87, - 0x66, 0x55, 0x55, 0x66, 0x78, 0x99, 0xAB, 0xA8, 0x99, 0x98, 0x76, 0x66, - 0x55, 0x56, 0x67, 0x78, 0x99, 0xA9, 0x99, 0x98, 0x98, 0x77, 0x66, 0x66, - 0x67, 0x78, 0x98, 0x9B, 0xA9, 0x99, 0x98, 0x87, 0x77, 0x66, 0x77, 0x77, - 0x89, 0x99, 0xCA, 0x9A, 0xA9, 0x88, 0x87, 0x77, 0x77, 0x77, 0x88, 0x9A, - 0xAB, 0x99, 0xBA, 0x99, 0x88, 0x88, 0x87, 0x88, 0x88, 0x89, 0x9B, 0xB9, - 0xAB, 0xA9, 0xAA, 0x88, 0x88, 0x88, 0x88, 0x9A, 0xBA, 0xAB, 0xA9, 0xEA, - 0xAA, 0x9A, 0xA9, 0x9A, 0x89, 0x99, 0x9A, 0xAC, 0xAB, 0xAC, 0xDA, 0xBA, - 0xAA, 0x9A, 0x99, 0xAA, 0xAB, 0xBA, 0xCC, 0xAA, 0xFB, 0xDB, 0xBA, 0xAA, - 0xAA, 0xBA, 0xBB, 0xBB, 0xFC, 0xFB, 0x7A, 0x99, 0x99, 0x99, 0x99, 0x99, - 0x99, 0x9A, 0xAA, 0xAB, 0xA0, 0x00, 0x00, 0x00, - ], - [ - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x9F, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFB, 0xA9, 0xAA, 0xBB, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFB, 0x98, 0x77, 0x89, 0xAF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xA8, 0x54, 0x46, 0x8A, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xDA, 0x74, 0x12, 0x47, 0xAB, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xA7, 0x42, 0x24, 0x79, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xBA, 0x86, - 0x44, 0x57, 0xAF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xB9, 0x87, 0x77, - 0x9B, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFB, 0xBA, 0x9A, 0xAB, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00, 0x00, - ], - [ - 0x8A, 0x98, 0x88, 0x87, 0x77, 0xF7, 0x6F, 0x88, 0x8F, 0xAA, 0x59, 0xFA, - 0xAF, 0xAF, 0x8A, 0x87, 0x8A, 0xA8, 0xFA, 0xA9, 0xF9, 0x9A, 0xAF, 0x98, - 0x9A, 0x79, 0x89, 0x78, 0x9A, 0xFA, 0xFF, 0xAC, 0x88, 0x8F, 0x87, 0x88, - 0xA8, 0x89, 0x9A, 0x87, 0xAF, 0xFA, 0x7A, 0xA9, 0x87, 0x78, 0x77, 0x98, - 0x78, 0x89, 0xAA, 0xFA, 0xA8, 0x98, 0x99, 0x87, 0x78, 0x87, 0x77, 0x87, - 0x87, 0xFA, 0xE8, 0x8B, 0x97, 0x76, 0x88, 0x77, 0x67, 0x77, 0x78, 0x78, - 0x8A, 0x87, 0xA9, 0x8F, 0x77, 0x77, 0x67, 0x97, 0x88, 0x78, 0x99, 0xA8, - 0x79, 0x89, 0x77, 0x76, 0x66, 0x76, 0x77, 0x77, 0x8F, 0x89, 0x98, 0xF9, - 0x88, 0x97, 0x66, 0x57, 0x67, 0x78, 0x77, 0xA9, 0x88, 0x78, 0x87, 0x87, - 0x66, 0x66, 0x66, 0x67, 0x68, 0x97, 0xF9, 0x88, 0xA8, 0x78, 0x87, 0x76, - 0x66, 0x77, 0x68, 0x77, 0x88, 0x89, 0x99, 0xA8, 0x78, 0x77, 0x77, 0x76, - 0x67, 0x76, 0x77, 0x89, 0xA9, 0x8A, 0x87, 0x87, 0x77, 0x68, 0x76, 0x76, - 0x88, 0x9A, 0x9A, 0xAA, 0xA7, 0x97, 0x87, 0x87, 0x87, 0x77, 0x99, 0x77, - 0x9A, 0x87, 0x9A, 0x99, 0x79, 0x79, 0x76, 0x87, 0x98, 0x99, 0xA8, 0x88, - 0x98, 0x9A, 0xA9, 0x99, 0x97, 0x98, 0x8A, 0x98, 0x9A, 0xFF, 0xA8, 0xFA, - 0x7F, 0x8A, 0x8F, 0x98, 0x8A, 0xA8, 0xFF, 0xF9, 0xA8, 0xAF, 0x99, 0x99, - 0x88, 0x99, 0xAA, 0x98, 0x9A, 0xAA, 0xAF, 0xAA, 0xFA, 0xF9, 0x9A, 0xFA, - 0xF9, 0x8A, 0xA8, 0x98, 0xAF, 0xA9, 0x9F, 0xFA, 0x89, 0x87, 0x78, 0x98, - 0x87, 0x8A, 0x87, 0x99, 0x90, 0x00, 0x00, 0x00, - ], - [ - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFB, 0xFF, 0xBF, 0xFF, 0xFF, 0x6F, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFA, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFA, 0xBF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xBA, 0x88, 0xAB, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xF8, 0x65, 0x57, 0x9F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0x84, 0x12, 0x58, 0xAF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xF8, 0x52, 0x14, 0x8F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFB, 0x96, - 0x54, 0x68, 0xAF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFA, 0xA8, 0x89, - 0xAF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xEB, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x6F, 0xFB, 0xFF, 0xFF, 0xFF, 0xBF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00, 0x00, - ], - [ - 0xFF, 0xEF, 0xFE, 0xEF, 0xFF, 0xFE, 0xEE, 0xE5, 0xFF, 0xFF, 0xFF, 0xFE, - 0xEE, 0xEE, 0xEE, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xEE, - 0xEE, 0xEE, 0x4E, 0xEE, 0xEE, 0xEE, 0xEE, 0xEF, 0xFF, 0xFF, 0x5F, 0xFF, - 0xFF, 0xF5, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xEE, 0x5E, - 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xE5, 0xE5, - 0xEE, 0xEE, 0xEE, 0xEF, 0xFF, 0x55, 0xF5, 0x5F, 0xF5, 0xFF, 0x5F, 0x5F, - 0xFF, 0xFF, 0xF4, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x55, 0xFF, 0xFF, 0xFF, - 0xFF, 0xF5, 0xFF, 0xF5, 0xFF, 0x5F, 0x4F, 0xFE, 0xEE, 0xEE, 0xEE, 0xEE, - 0xEE, 0xEE, 0xEE, 0xE3, 0xE5, 0xEE, 0x5E, 0xEE, 0xEE, 0xEE, 0xE5, 0x4E, - 0xEE, 0x5E, 0x5E, 0xE5, 0x5E, 0x5E, 0x55, 0xEE, 0xEE, 0x54, 0xEE, 0xE5, - 0x5E, 0xE5, 0xE6, 0x5E, 0xEE, 0xEE, 0xEE, 0xEF, 0xF5, 0xFF, 0xF5, 0xFF, - 0xF5, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x5F, 0xF5, 0xFF, 0x5F, 0xFF, - 0xF5, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF5, 0xFF, 0x5F, 0xF5, 0x5F, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xF4, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF5, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0x5F, 0xFF, 0xFF, 0xFF, 0xFE, 0xFF, 0xFE, 0xFF, 0x5F, - 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xFF, 0xFE, 0xFE, 0xFF, - 0xFF, 0xFF, 0xFE, 0xFF, 0xF0, 0x00, 0x00, 0x00, - ], - [ - 0x78, 0xF6, 0x66, 0x68, 0x76, 0x67, 0x67, 0x98, 0x78, 0x7F, 0x68, 0x98, - 0x9F, 0xF8, 0xF7, 0xFE, 0x8F, 0xFF, 0x9F, 0xFF, 0x9F, 0x88, 0x7F, 0x88, - 0x9F, 0x79, 0x9F, 0xFF, 0x8F, 0x9F, 0xF9, 0x96, 0x99, 0x97, 0x78, 0x67, - 0xF7, 0x98, 0xFF, 0x79, 0x99, 0xF8, 0x77, 0xF8, 0x89, 0x97, 0x78, 0x89, - 0xF7, 0x8F, 0xFF, 0xFF, 0x78, 0x99, 0x79, 0x97, 0x97, 0x77, 0x99, 0x7F, - 0x79, 0x99, 0x98, 0x77, 0x9F, 0x67, 0x67, 0x67, 0x78, 0x98, 0x9F, 0x99, - 0x89, 0xF6, 0x9F, 0x79, 0x78, 0x76, 0x66, 0xF8, 0x78, 0x89, 0x78, 0xF8, - 0x87, 0x88, 0x99, 0x87, 0x77, 0x69, 0x79, 0x78, 0xF7, 0x9F, 0x77, 0xF9, - 0x99, 0x76, 0x77, 0x77, 0x68, 0x87, 0x78, 0x9F, 0x97, 0x88, 0x78, 0x89, - 0x97, 0x76, 0x77, 0x77, 0x89, 0x8F, 0x8F, 0x67, 0x89, 0x98, 0x89, 0x78, - 0x77, 0x87, 0x78, 0x79, 0x78, 0x96, 0x68, 0x9F, 0xA8, 0x97, 0x78, 0x78, - 0x8F, 0x89, 0x79, 0x8F, 0x67, 0xFF, 0x8F, 0x99, 0x77, 0x66, 0x66, 0x76, - 0x86, 0xF8, 0xF6, 0x99, 0x9F, 0x7F, 0x89, 0x97, 0x79, 0x88, 0x6F, 0x88, - 0x89, 0x68, 0xFF, 0xFF, 0xF9, 0x98, 0x89, 0xF8, 0xFF, 0x98, 0x9F, 0xF7, - 0x78, 0x79, 0xF9, 0x77, 0x89, 0xF8, 0x97, 0x89, 0xF9, 0x98, 0x77, 0x9F, - 0x9F, 0x89, 0x9F, 0x99, 0x98, 0x9F, 0x99, 0x9F, 0x98, 0x89, 0x98, 0xFF, - 0x9F, 0xF8, 0xF9, 0x88, 0x9F, 0x7F, 0xF9, 0x67, 0xFF, 0x99, 0x98, 0xF9, - 0xFF, 0x89, 0x9F, 0xFF, 0x9F, 0xF9, 0x59, 0x77, 0x98, 0x68, 0x96, 0x77, - 0x68, 0x89, 0xF7, 0x6F, 0x60, 0x00, 0x00, 0x00, - ], - [ - 0x68, 0x89, 0x78, 0x77, 0x67, 0x88, 0x88, 0xFF, 0x79, 0x99, 0x69, 0xF9, - 0xF9, 0x88, 0x87, 0x79, 0x8F, 0xF9, 0xF8, 0xF9, 0xF7, 0x8F, 0x98, 0x78, - 0x79, 0xF9, 0xF8, 0x88, 0x79, 0x7F, 0xF9, 0x97, 0xFF, 0x8F, 0x98, 0x78, - 0x77, 0x67, 0xF8, 0xF9, 0xFF, 0xF9, 0x78, 0xF8, 0x88, 0x87, 0x88, 0x77, - 0x98, 0xF7, 0x98, 0xFF, 0x98, 0x9F, 0xF8, 0x98, 0x87, 0x76, 0x79, 0x97, - 0x78, 0x89, 0x8C, 0x77, 0x88, 0x78, 0x77, 0x77, 0x88, 0x77, 0x78, 0x79, - 0x9F, 0x88, 0x79, 0x77, 0x77, 0x77, 0x67, 0x77, 0x77, 0x8F, 0x99, 0x97, - 0x87, 0x77, 0x78, 0x87, 0x78, 0x76, 0x77, 0x78, 0x9F, 0x99, 0xF7, 0x77, - 0x98, 0x76, 0x76, 0x77, 0x68, 0x7F, 0x78, 0xFF, 0xF9, 0x78, 0x88, 0x87, - 0x88, 0x76, 0x67, 0x88, 0x79, 0x78, 0xF9, 0x87, 0x89, 0x97, 0x77, 0x68, - 0x67, 0x77, 0x77, 0x77, 0x8E, 0x78, 0x78, 0x8A, 0x88, 0x77, 0x87, 0x77, - 0x67, 0x88, 0x88, 0x8F, 0x87, 0x89, 0x88, 0x77, 0x76, 0x77, 0x79, 0x77, - 0x77, 0x8F, 0x88, 0x79, 0xF8, 0x77, 0x78, 0x77, 0x88, 0x77, 0x78, 0x98, - 0x89, 0x89, 0xFF, 0xF8, 0x88, 0x99, 0x77, 0x98, 0x78, 0x87, 0x99, 0x99, - 0x98, 0xF8, 0x98, 0xFF, 0xFF, 0x79, 0x88, 0x77, 0x79, 0x8F, 0x88, 0xF8, - 0x88, 0xFF, 0x88, 0x78, 0x99, 0x9F, 0x88, 0xF9, 0xF8, 0x88, 0x99, 0xB9, - 0xF7, 0x88, 0x99, 0xF9, 0x99, 0x9F, 0xFF, 0x99, 0xFF, 0x8F, 0x98, 0x8F, - 0x89, 0x99, 0xF8, 0x99, 0x8F, 0xF9, 0x5F, 0x89, 0x77, 0x87, 0x99, 0x78, - 0x88, 0x77, 0xF8, 0x8F, 0x80, 0x00, 0x00, 0x00, - ], - [ - 0x5E, 0xDE, 0xE5, 0xDE, 0xEE, 0xED, 0xDD, 0xDE, 0xEE, 0xEE, 0x4E, 0xED, - 0xDD, 0xDD, 0xDD, 0xDE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xED, - 0xDD, 0x4D, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDE, 0xEE, 0xEE, 0xEE, 0xEE, - 0xEE, 0x5E, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xDD, - 0x5D, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xD5, 0x45, 0xDD, - 0xDD, 0xDD, 0xDD, 0xDE, 0xEE, 0xEE, 0xE5, 0xEE, 0xEE, 0xE5, 0xEE, 0xEE, - 0x5E, 0xEE, 0xEE, 0xEE, 0xE5, 0xE5, 0xEE, 0xE5, 0x54, 0xEE, 0xEE, 0xEE, - 0xEE, 0xEE, 0x45, 0xEE, 0xEE, 0x55, 0xEE, 0xEE, 0xE5, 0xED, 0xDD, 0xDD, - 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0x5D, 0xDD, 0xDD, 0xDD, 0x55, 0xDD, 0xDD, - 0x55, 0x5D, 0x4D, 0xDD, 0xDD, 0x45, 0xDD, 0x5D, 0xDD, 0xDD, 0xDD, 0xDD, - 0x54, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDE, 0x5E, 0xEE, 0x5E, 0xEE, - 0xEE, 0x5E, 0xEE, 0xEE, 0xE5, 0xEE, 0xEE, 0xEE, 0x4E, 0xEE, 0x4E, 0xEE, - 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0x5E, 0xEE, 0xE4, 0xE5, 0xEE, 0xEE, 0xEE, - 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xE5, 0xEE, 0xEE, 0xEE, 0x5E, 0xEE, - 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0x55, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, - 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xE5, 0x5E, 0xEE, 0xEE, 0xEE, 0xEE, 0xED, - 0xEE, 0xED, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xE5, 0xED, 0xED, - 0xEE, 0xEE, 0xEE, 0x5E, 0xEE, 0xEE, 0xED, 0xED, 0xEE, 0xE5, 0xEE, 0xEE, - 0xED, 0xED, 0xED, 0xEE, 0xE0, 0x00, 0x00, 0x00, - ], - [ - 0x88, 0x88, 0x88, 0x78, 0x88, 0x88, 0x87, 0x78, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x87, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x77, 0x77, 0x77, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x77, 0x77, 0x77, 0x77, 0x77, - 0x77, 0x77, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, - 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x80, 0x00, 0x00, 0x00, - ], - [ - 0x88, 0x88, 0x88, 0x78, 0x88, 0x88, 0x87, 0x78, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x87, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x77, 0x77, 0x77, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x77, 0x77, 0x77, 0x77, 0x77, - 0x77, 0x77, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, - 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x80, 0x00, 0x00, 0x00, - ], - [ - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x9F, 0xFF, 0xF9, 0xF8, 0xF9, 0x4F, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF9, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xF8, 0x64, 0x68, 0x9F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0x85, 0x12, 0x6F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0x52, 0x14, 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF9, - 0x54, 0x5F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x59, 0xFF, 0xFF, 0xFF, 0xFA, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00, 0x00, - ], - [ - 0xF7, 0xFF, 0xFF, 0xFF, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xF7, 0x7F, 0xFF, 0xFF, 0xFF, 0x6F, 0xFF, 0xF6, - 0xF6, 0xFF, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xF6, 0xFF, 0xFF, 0xFF, 0xFF, - 0xF7, 0xF6, 0xFF, 0xF6, 0xFF, 0xFF, 0xFF, 0xF6, 0xFF, 0xFF, 0x66, 0xF6, - 0xFF, 0xF6, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x57, 0x67, 0x6F, 0xFF, - 0xFF, 0xFF, 0xFD, 0xBF, 0xF7, 0xF7, 0x6F, 0x66, 0x6F, 0x66, 0xF6, 0xFF, - 0xFF, 0xF6, 0xF6, 0xFF, 0x75, 0x76, 0xF5, 0x66, 0x66, 0x66, 0xFF, 0xFF, - 0xF6, 0xFF, 0xFF, 0xF5, 0x57, 0x66, 0xFF, 0xFF, 0x7F, 0xFF, 0xFF, 0xF6, - 0xFF, 0x56, 0x56, 0x75, 0x77, 0xFF, 0x6F, 0xFF, 0xFF, 0xFF, 0xF7, 0xF6, - 0xF6, 0xF6, 0x44, 0xF5, 0xF6, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x66, - 0x56, 0x75, 0x56, 0xF6, 0xFF, 0xFD, 0xC6, 0xAF, 0xF6, 0x6F, 0xFF, 0x55, - 0x57, 0x5F, 0x7F, 0xFF, 0xFF, 0xF7, 0xFF, 0xFF, 0x65, 0x6F, 0xFF, 0x68, - 0x7F, 0xFF, 0xFF, 0x6F, 0xFF, 0xF6, 0xF6, 0x5F, 0x65, 0x6F, 0x6F, 0xFF, - 0xFF, 0xFF, 0xF6, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0xF6, 0x6F, 0xFF, 0xFF, 0xFF, - 0xFF, 0x6F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x6F, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0x6F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF6, 0xFF, 0xFF, - 0x6F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x5F, 0x7F, 0x7F, 0xFF, 0xFF, 0x7F, - 0xFF, 0x7F, 0xFF, 0xFF, 0xF0, 0x00, 0x00, 0x00, - ], - [ - 0x88, 0x88, 0x88, 0x78, 0x88, 0x88, 0x87, 0x78, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x87, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x77, 0x77, 0x77, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x77, 0x77, 0x77, 0x77, 0x77, - 0x77, 0x77, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, - 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x80, 0x00, 0x00, 0x00, - ], - [ - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFD, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xF6, 0x6F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0x12, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0x61, 0x15, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xF5, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x3F, 0x9F, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00, 0x00, - ], - [ - 0x88, 0x88, 0x88, 0x78, 0x88, 0x88, 0x87, 0x78, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x87, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x77, 0x77, 0x77, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x77, 0x77, 0x77, 0x77, 0x77, - 0x77, 0x77, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, - 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x80, 0x00, 0x00, 0x00, - ], - [ - 0x88, 0x88, 0x88, 0x78, 0x88, 0x88, 0x87, 0x78, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x87, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x77, 0x77, 0x77, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x77, 0x77, 0x77, 0x77, 0x77, - 0x77, 0x77, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, - 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x80, 0x00, 0x00, 0x00, - ], - [ - 0x88, 0x88, 0x88, 0x78, 0x88, 0x88, 0x87, 0x78, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x87, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x77, 0x77, 0x77, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x77, 0x77, 0x77, 0x77, 0x77, - 0x77, 0x77, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, - 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x80, 0x00, 0x00, 0x00, - ], - [ - 0x88, 0x88, 0x88, 0x78, 0x88, 0x88, 0x87, 0x78, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x87, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x77, 0x77, 0x77, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x77, 0x77, 0x77, 0x77, 0x77, - 0x77, 0x77, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, - 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x80, 0x00, 0x00, 0x00, - ], - [ - 0x88, 0x88, 0x88, 0x78, 0x88, 0x88, 0x87, 0x78, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x87, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x77, 0x77, 0x77, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x77, 0x77, 0x77, 0x77, 0x77, - 0x77, 0x77, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, - 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x80, 0x00, 0x00, 0x00, - ], - [ - 0x88, 0x88, 0x88, 0x78, 0x88, 0x88, 0x87, 0x78, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x87, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x77, 0x77, 0x77, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x77, 0x77, 0x77, 0x77, 0x77, - 0x77, 0x77, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, - 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x80, 0x00, 0x00, 0x00, - ], - [ - 0x88, 0x88, 0x88, 0x78, 0x88, 0x88, 0x87, 0x78, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x87, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x77, 0x77, 0x77, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x77, 0x77, 0x77, 0x77, 0x77, - 0x77, 0x77, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, - 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x80, 0x00, 0x00, 0x00, - ], - [ - 0x88, 0x88, 0x88, 0x78, 0x88, 0x88, 0x87, 0x78, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x87, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x77, 0x77, 0x77, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x77, 0x77, 0x77, 0x77, 0x77, - 0x77, 0x77, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, - 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x80, 0x00, 0x00, 0x00, - ], - ], - [ - [ - 0x88, 0x88, 0x88, 0x78, 0x88, 0x88, 0x87, 0x78, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x87, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x77, 0x77, 0x77, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x77, 0x77, 0x77, 0x77, 0x77, - 0x77, 0x77, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, - 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x80, 0x00, 0x00, 0x00, - ], - [ - 0xEE, 0xEE, 0xEE, 0xDE, 0xEE, 0xEE, 0xDD, 0xDE, 0xEE, 0xEE, 0xEE, 0xED, - 0xDD, 0xDD, 0xDD, 0xDE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xED, - 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDE, 0xEE, 0xEE, 0xEE, 0xEE, - 0x5E, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0x5E, 0xED, - 0xD5, 0x55, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, - 0xDD, 0xDD, 0xDD, 0xDE, 0xEE, 0xEE, 0xE5, 0xE5, 0xEE, 0xEE, 0xEE, 0xEE, - 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xE5, 0xEE, 0xE5, 0xEE, 0xEE, 0xEE, 0xEE, - 0xEE, 0xEE, 0x5E, 0x5E, 0xEE, 0x55, 0x54, 0xEE, 0xEE, 0xEE, 0xEE, 0xED, - 0xDD, 0xDD, 0xD5, 0x5D, 0x44, 0x5D, 0xDD, 0xDD, 0xDD, 0xDD, 0x5D, 0xD5, - 0xD5, 0x5D, 0xDD, 0xD3, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0x5D, - 0xD4, 0x35, 0x5D, 0xDD, 0xDD, 0xDD, 0xDD, 0xD5, 0x5E, 0xE4, 0x54, 0x53, - 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xE5, 0xEE, 0xEE, 0x5E, 0xEE, - 0xEE, 0xEE, 0xEE, 0xEE, 0xE5, 0xEE, 0x5E, 0xEE, 0xE5, 0x5E, 0xEE, 0x5E, - 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, - 0xEE, 0xEE, 0xEE, 0xEE, 0x5E, 0xEE, 0xE4, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, - 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, - 0xE5, 0xEE, 0xEE, 0xED, 0xEE, 0xED, 0xDD, 0xED, 0xED, 0xED, 0xED, 0xEE, - 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xED, 0xEE, 0xEE, 0xED, - 0xEE, 0xED, 0xED, 0xEE, 0xE0, 0x00, 0x00, 0x00, - ], - [ - 0xBD, 0xDC, 0xCD, 0xCC, 0xCC, 0xDC, 0xDD, 0xFF, 0xFF, 0xFF, 0xDD, 0xEF, - 0xED, 0xDC, 0xCC, 0xCC, 0xCC, 0xDF, 0xEF, 0xFF, 0xFF, 0xDF, 0xFD, 0xDC, - 0xBB, 0xBB, 0xAA, 0xBB, 0xCD, 0xDF, 0xFF, 0xFD, 0xED, 0xCC, 0xBB, 0xA9, - 0x99, 0x99, 0xAA, 0xBC, 0xDF, 0xFF, 0xCD, 0xCC, 0xBA, 0x99, 0x88, 0x88, - 0x89, 0x9A, 0xBC, 0xDF, 0xEC, 0xDC, 0xBA, 0x98, 0x87, 0x77, 0x77, 0x88, - 0x9A, 0xBC, 0xEE, 0xDD, 0xBA, 0xA8, 0x87, 0x76, 0x66, 0x67, 0x88, 0x9A, - 0xCD, 0xDD, 0xDB, 0xA9, 0x87, 0x66, 0x66, 0x66, 0x67, 0x89, 0xAB, 0xCD, - 0xCC, 0xA9, 0x87, 0x76, 0x55, 0x55, 0x56, 0x77, 0x89, 0xBD, 0xDC, 0xCB, - 0x98, 0x76, 0x65, 0x55, 0x55, 0x66, 0x78, 0x9A, 0xBD, 0xCC, 0xA9, 0x87, - 0x65, 0x55, 0x55, 0x56, 0x67, 0x89, 0xAD, 0xCD, 0xCA, 0x98, 0x76, 0x65, - 0x55, 0x55, 0x66, 0x78, 0x9A, 0xCC, 0xDC, 0xB9, 0x87, 0x66, 0x55, 0x55, - 0x56, 0x77, 0x8A, 0xBC, 0xDD, 0xDB, 0xA9, 0x87, 0x66, 0x55, 0x66, 0x67, - 0x89, 0xAB, 0xCD, 0xEC, 0xCA, 0x98, 0x87, 0x66, 0x66, 0x77, 0x88, 0x9A, - 0xBC, 0xDE, 0xDC, 0xBA, 0x99, 0x87, 0x77, 0x77, 0x89, 0x9A, 0xBC, 0xDC, - 0xFE, 0xEC, 0xBA, 0x99, 0x88, 0x88, 0x89, 0x9A, 0xBC, 0xCD, 0xDF, 0xFE, - 0xDC, 0xBB, 0xA9, 0x99, 0x9A, 0xAA, 0xBC, 0xCD, 0xEE, 0xFF, 0xFF, 0xDC, - 0xCB, 0xBA, 0xAB, 0xBB, 0xCC, 0xDD, 0xDE, 0xDF, 0xFF, 0xFF, 0xED, 0xCC, - 0xCC, 0xCC, 0xCC, 0xDD, 0xEF, 0xED, 0xDF, 0xFF, 0xDF, 0xDD, 0xDD, 0xDC, - 0xCC, 0xCD, 0xED, 0xCE, 0xB0, 0x00, 0x00, 0x00, - ], - [ - 0xEE, 0xEE, 0xEE, 0xDE, 0xEE, 0xEE, 0xDD, 0xDE, 0xEE, 0xEE, 0xEE, 0xEE, - 0xED, 0xDD, 0xDD, 0xDE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, - 0xEE, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDE, 0xEE, 0xEE, 0xEE, 0xEE, - 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0x4E, - 0xEE, 0xED, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xD4, 0xDD, - 0xDD, 0xDD, 0xDD, 0xDE, 0xEE, 0xEE, 0xEE, 0x4E, 0x4E, 0x4E, 0xEE, 0xEE, - 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0x4E, 0xEE, 0xEE, 0xEE, - 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, - 0xEE, 0xEE, 0xE4, 0xE3, 0x4D, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, - 0xDD, 0xDD, 0xDD, 0x4D, 0x4D, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, - 0x44, 0x4D, 0x4D, 0xDD, 0xDD, 0xDD, 0xDD, 0x4E, 0xE4, 0xEE, 0x3E, 0x4E, - 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xE3, 0xEE, 0xE5, 0xEE, 0xEE, - 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xE4, 0xEE, 0xEE, 0xEE, 0x4E, 0xEE, - 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0x4E, 0x3E, 0xEE, 0xEE, 0xEE, - 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xE4, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, - 0xEE, 0xEE, 0xEE, 0x4E, 0xEE, 0x4E, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, - 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xED, 0xED, 0xEE, 0xEE, 0xEE, - 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, - 0xEE, 0xEE, 0xEE, 0xEE, 0xE0, 0x00, 0x00, 0x00, - ], - [ - 0x88, 0x88, 0x88, 0x78, 0x88, 0x88, 0x87, 0x78, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x87, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x77, 0x77, 0x77, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x77, 0x77, 0x77, 0x77, 0x77, - 0x77, 0x77, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, - 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x80, 0x00, 0x00, 0x00, - ], - [ - 0x9C, 0xBB, 0xAA, 0xAA, 0xAA, 0x9A, 0xAA, 0xAB, 0xBC, 0xCD, 0xBB, 0xCC, - 0xBB, 0xBB, 0xAA, 0xAA, 0xAA, 0xAB, 0xBC, 0xCD, 0xDC, 0xBC, 0xCB, 0xAA, - 0xA9, 0x99, 0x99, 0xAA, 0xAB, 0xAB, 0xCD, 0xDB, 0xCB, 0xAA, 0x99, 0x99, - 0x88, 0x88, 0x89, 0x9A, 0xBB, 0xCC, 0xAB, 0xAA, 0xA9, 0x98, 0x88, 0x88, - 0x88, 0x89, 0x9A, 0xBB, 0xBA, 0xBA, 0x99, 0x88, 0x77, 0x77, 0x77, 0x78, - 0x89, 0x9A, 0xBB, 0xAA, 0xA9, 0x88, 0x77, 0x76, 0x66, 0x77, 0x78, 0x89, - 0xAB, 0xBA, 0xAA, 0x98, 0x77, 0x66, 0x66, 0x66, 0x67, 0x78, 0x99, 0xAA, - 0xAA, 0x99, 0x87, 0x76, 0x66, 0x66, 0x66, 0x77, 0x88, 0x9A, 0xAA, 0xA9, - 0x88, 0x76, 0x66, 0x55, 0x56, 0x66, 0x78, 0x89, 0xAA, 0xAA, 0x98, 0x87, - 0x66, 0x65, 0x55, 0x56, 0x67, 0x88, 0x9A, 0xAA, 0xA9, 0x88, 0x76, 0x66, - 0x55, 0x56, 0x66, 0x78, 0x99, 0xAA, 0xAA, 0x99, 0x87, 0x76, 0x66, 0x56, - 0x66, 0x77, 0x89, 0x9A, 0xAA, 0xA9, 0x98, 0x77, 0x66, 0x66, 0x66, 0x77, - 0x88, 0x99, 0xAA, 0xAB, 0xA9, 0x88, 0x77, 0x76, 0x66, 0x77, 0x78, 0x89, - 0xAB, 0xAB, 0xBA, 0x99, 0x88, 0x77, 0x77, 0x77, 0x88, 0x89, 0xAA, 0xBA, - 0xBB, 0xBA, 0x99, 0x98, 0x88, 0x88, 0x88, 0x89, 0x9A, 0xAB, 0xBC, 0xCC, - 0xBA, 0x99, 0x98, 0x88, 0x88, 0x99, 0xAA, 0xBB, 0xBB, 0xDD, 0xCC, 0xBA, - 0xA9, 0x99, 0x99, 0x99, 0xAA, 0xBB, 0xCC, 0xBD, 0xDD, 0xCB, 0xBB, 0xAA, - 0xAA, 0xAA, 0xAA, 0xBB, 0xBC, 0xCB, 0xBC, 0xCB, 0xBA, 0xAA, 0xA9, 0x9A, - 0xAA, 0xAA, 0xBA, 0xBC, 0x90, 0x00, 0x00, 0x00, - ], - [ - 0x9B, 0xBA, 0xA9, 0x99, 0x99, 0x99, 0x99, 0x9A, 0xBB, 0xCC, 0xBB, 0xCC, - 0xCA, 0xAA, 0xAA, 0x9A, 0xA9, 0xAA, 0xBB, 0xBD, 0xDC, 0xBC, 0xBB, 0xAA, - 0xA9, 0x99, 0x98, 0x99, 0xA9, 0xAB, 0xBB, 0xCB, 0xBA, 0xAA, 0x99, 0x88, - 0x88, 0x88, 0x89, 0x99, 0xAB, 0xBB, 0xAA, 0xA9, 0x98, 0x88, 0x88, 0x77, - 0x88, 0x88, 0x9A, 0xAB, 0xAA, 0xAA, 0x98, 0x88, 0x77, 0x77, 0x77, 0x78, - 0x88, 0x99, 0xBA, 0x9A, 0x99, 0x88, 0x77, 0x76, 0x66, 0x77, 0x77, 0x89, - 0x9A, 0xA9, 0x99, 0x98, 0x77, 0x66, 0x66, 0x66, 0x77, 0x78, 0x89, 0xAA, - 0x99, 0x98, 0x87, 0x76, 0x66, 0x66, 0x66, 0x77, 0x88, 0x9A, 0x99, 0x99, - 0x88, 0x76, 0x66, 0x66, 0x66, 0x67, 0x77, 0x89, 0x99, 0x99, 0x98, 0x77, - 0x66, 0x66, 0x56, 0x66, 0x67, 0x78, 0x99, 0x99, 0xA9, 0x87, 0x76, 0x66, - 0x66, 0x66, 0x66, 0x77, 0x89, 0xA9, 0x99, 0x98, 0x87, 0x76, 0x66, 0x66, - 0x66, 0x77, 0x88, 0x99, 0x99, 0xA9, 0x88, 0x77, 0x66, 0x66, 0x66, 0x77, - 0x78, 0x89, 0xA9, 0xAA, 0x99, 0x88, 0x77, 0x76, 0x67, 0x77, 0x78, 0x89, - 0x9A, 0x9A, 0xA9, 0x98, 0x87, 0x77, 0x77, 0x77, 0x78, 0x88, 0x9A, 0xB9, - 0xAB, 0xAA, 0x99, 0x88, 0x87, 0x77, 0x88, 0x89, 0x99, 0xAB, 0xAB, 0xCA, - 0xAA, 0x99, 0x88, 0x88, 0x88, 0x89, 0x99, 0xAB, 0xBB, 0xBB, 0xBB, 0xAA, - 0x99, 0x99, 0x99, 0x99, 0x99, 0xAA, 0xBC, 0xBC, 0xCC, 0xCB, 0xAA, 0x9A, - 0x99, 0x9A, 0x9A, 0xAB, 0xBC, 0xCC, 0xBC, 0xCA, 0xAA, 0xA9, 0x99, 0x99, - 0x99, 0x9A, 0xAA, 0xAB, 0xA0, 0x00, 0x00, 0x00, - ], - [ - 0xAB, 0xBA, 0xAA, 0x99, 0x99, 0x99, 0x99, 0x9A, 0xAB, 0xBC, 0xBB, 0xCC, - 0xBB, 0xAA, 0x99, 0x99, 0x99, 0xAA, 0xAB, 0xBB, 0xCC, 0xBC, 0xBA, 0xAA, - 0x99, 0x99, 0x89, 0x99, 0x99, 0xAA, 0xBC, 0xBA, 0xBA, 0xA9, 0x99, 0x88, - 0x88, 0x88, 0x88, 0x99, 0xAA, 0xBB, 0xAA, 0xA9, 0x98, 0x88, 0x87, 0x77, - 0x88, 0x88, 0x99, 0xAA, 0xAA, 0xA9, 0x98, 0x88, 0x77, 0x77, 0x77, 0x77, - 0x88, 0x99, 0xAA, 0x9A, 0x99, 0x88, 0x77, 0x77, 0x67, 0x77, 0x77, 0x89, - 0x9A, 0x99, 0xA9, 0x88, 0x77, 0x76, 0x66, 0x66, 0x77, 0x78, 0x89, 0xA9, - 0x99, 0x98, 0x87, 0x76, 0x66, 0x66, 0x66, 0x77, 0x78, 0x99, 0x99, 0x98, - 0x87, 0x77, 0x66, 0x66, 0x66, 0x66, 0x77, 0x89, 0x99, 0x99, 0x88, 0x77, - 0x76, 0x66, 0x66, 0x66, 0x67, 0x78, 0x99, 0x99, 0x99, 0x87, 0x77, 0x66, - 0x66, 0x66, 0x67, 0x77, 0x89, 0x99, 0x99, 0x98, 0x77, 0x76, 0x66, 0x66, - 0x66, 0x77, 0x88, 0x99, 0x99, 0x99, 0x88, 0x77, 0x66, 0x66, 0x66, 0x77, - 0x78, 0x89, 0xA9, 0x9A, 0x98, 0x87, 0x77, 0x77, 0x67, 0x77, 0x78, 0x89, - 0x9A, 0x9A, 0xA9, 0x98, 0x87, 0x77, 0x77, 0x77, 0x78, 0x88, 0x99, 0xA9, - 0xAB, 0xA9, 0x98, 0x88, 0x77, 0x77, 0x88, 0x88, 0x99, 0xAB, 0xAA, 0xBA, - 0xA9, 0x98, 0x88, 0x88, 0x88, 0x89, 0x99, 0xAA, 0xBA, 0xBB, 0xBA, 0xA9, - 0x99, 0x99, 0x89, 0x99, 0x99, 0xAA, 0xBB, 0xBC, 0xCB, 0xBB, 0xAA, 0xA9, - 0x99, 0x99, 0xAA, 0xAA, 0xBC, 0xCB, 0xBC, 0xBB, 0xAA, 0x99, 0x99, 0x99, - 0x99, 0x9A, 0xAA, 0xBB, 0xA0, 0x00, 0x00, 0x00, - ], - [ - 0x9C, 0xBA, 0xAA, 0x9A, 0x99, 0x99, 0x99, 0x9A, 0xAB, 0xCB, 0xAB, 0xCC, - 0xBA, 0xAA, 0xA9, 0x99, 0xA9, 0xAA, 0xAA, 0xBC, 0xCC, 0xAC, 0xBA, 0xAA, - 0x99, 0x99, 0x99, 0x99, 0x9A, 0xAA, 0xBC, 0xBB, 0xCB, 0xA9, 0x99, 0x88, - 0x88, 0x88, 0x89, 0x9A, 0xAB, 0xCC, 0xAA, 0xAA, 0x99, 0x88, 0x77, 0x77, - 0x78, 0x88, 0x99, 0xAA, 0xAA, 0xBA, 0x98, 0x88, 0x77, 0x77, 0x77, 0x78, - 0x89, 0x9A, 0xAA, 0x9A, 0x99, 0x88, 0x77, 0x76, 0x67, 0x77, 0x77, 0x88, - 0x9A, 0x99, 0x99, 0x88, 0x77, 0x66, 0x66, 0x66, 0x67, 0x78, 0x89, 0xA9, - 0x99, 0x98, 0x77, 0x76, 0x66, 0x66, 0x66, 0x67, 0x88, 0x89, 0x99, 0x98, - 0x87, 0x77, 0x66, 0x66, 0x66, 0x66, 0x77, 0x88, 0xA9, 0x99, 0x98, 0x87, - 0x66, 0x66, 0x66, 0x66, 0x67, 0x78, 0x89, 0x99, 0x99, 0x87, 0x76, 0x66, - 0x66, 0x66, 0x67, 0x77, 0x89, 0x99, 0x9A, 0x88, 0x87, 0x76, 0x66, 0x66, - 0x66, 0x77, 0x88, 0x9A, 0x99, 0xA9, 0x88, 0x77, 0x76, 0x66, 0x66, 0x77, - 0x78, 0x89, 0xA9, 0xAA, 0x99, 0x87, 0x77, 0x77, 0x67, 0x77, 0x77, 0x89, - 0x9A, 0xAA, 0xBA, 0x98, 0x88, 0x77, 0x77, 0x77, 0x78, 0x89, 0x99, 0xAA, - 0xAB, 0xAA, 0x98, 0x88, 0x87, 0x77, 0x88, 0x89, 0x9A, 0xAB, 0xAA, 0xBA, - 0xAA, 0x99, 0x88, 0x88, 0x88, 0x89, 0x9A, 0xAA, 0xBB, 0xCC, 0xBA, 0xA9, - 0xA9, 0x99, 0x98, 0x99, 0x99, 0xAB, 0xAB, 0xAC, 0xCC, 0xBA, 0xAA, 0xA9, - 0x99, 0x9A, 0x9A, 0xBB, 0xBC, 0xCB, 0xBC, 0xBB, 0xAA, 0xA9, 0x99, 0x99, - 0x9A, 0x9A, 0xAA, 0xBB, 0xA0, 0x00, 0x00, 0x00, - ], - [ - 0x9B, 0xBB, 0xAA, 0xAA, 0xA9, 0xAA, 0xAA, 0xBB, 0xBC, 0xDD, 0xCB, 0xDC, - 0xBB, 0xBA, 0xAA, 0xAA, 0xAA, 0xAB, 0xBB, 0xCD, 0xDD, 0xCC, 0xBB, 0xAA, - 0xA9, 0x99, 0x99, 0x9A, 0xAA, 0xBC, 0xCD, 0xDB, 0xBB, 0xAA, 0x99, 0x88, - 0x88, 0x88, 0x99, 0x9A, 0xBC, 0xCC, 0xAB, 0xAA, 0x99, 0x88, 0x88, 0x88, - 0x88, 0x89, 0x9A, 0xAB, 0xBA, 0xAA, 0x99, 0x88, 0x77, 0x77, 0x77, 0x78, - 0x89, 0x9A, 0xBB, 0xAA, 0x99, 0x88, 0x77, 0x77, 0x66, 0x77, 0x78, 0x89, - 0xAB, 0xAA, 0xA9, 0x98, 0x77, 0x66, 0x66, 0x66, 0x67, 0x78, 0x99, 0xAA, - 0xAA, 0x98, 0x87, 0x76, 0x66, 0x66, 0x66, 0x77, 0x88, 0x9A, 0xA9, 0xA9, - 0x88, 0x76, 0x66, 0x55, 0x56, 0x66, 0x78, 0x89, 0xAA, 0xAA, 0x98, 0x87, - 0x66, 0x65, 0x55, 0x66, 0x67, 0x88, 0x9A, 0xA9, 0xA9, 0x88, 0x76, 0x66, - 0x55, 0x56, 0x66, 0x78, 0x89, 0xAA, 0xAA, 0x99, 0x87, 0x76, 0x66, 0x66, - 0x66, 0x77, 0x88, 0x9A, 0xAA, 0xB9, 0x98, 0x77, 0x66, 0x66, 0x66, 0x67, - 0x78, 0x99, 0xAA, 0xAA, 0xA9, 0x88, 0x77, 0x76, 0x66, 0x77, 0x78, 0x89, - 0x9A, 0xAA, 0xBA, 0xA9, 0x88, 0x77, 0x77, 0x77, 0x78, 0x89, 0x9A, 0xBA, - 0xBC, 0xBA, 0x99, 0x88, 0x88, 0x88, 0x88, 0x89, 0x9A, 0xAB, 0xAC, 0xCB, - 0xBA, 0x99, 0x98, 0x88, 0x88, 0x89, 0x9A, 0xAB, 0xBB, 0xDC, 0xCB, 0xBA, - 0xA9, 0x99, 0x99, 0x99, 0xAA, 0xAB, 0xBC, 0xCD, 0xDD, 0xCB, 0xBA, 0xAA, - 0xAA, 0xAA, 0xAA, 0xBB, 0xBC, 0xDB, 0xBD, 0xCC, 0xBB, 0xAA, 0xAA, 0xAA, - 0x9A, 0xAA, 0xBB, 0xBC, 0x90, 0x00, 0x00, 0x00, - ], - [ - 0xBD, 0xDC, 0xDD, 0xCC, 0xCC, 0xCD, 0xDE, 0xED, 0xFF, 0xFF, 0xCF, 0xFF, - 0xEE, 0xDD, 0xDC, 0xCD, 0xCD, 0xDE, 0xFF, 0xFF, 0xFF, 0xFF, 0xED, 0xDC, - 0xCB, 0xBB, 0xBB, 0xBC, 0xCD, 0xEF, 0xFF, 0xFF, 0xFE, 0xDC, 0xBB, 0xAA, - 0xA9, 0xAA, 0xAB, 0xCD, 0xEF, 0xFF, 0xDD, 0xCC, 0xBA, 0x99, 0x88, 0x88, - 0x99, 0xAB, 0xCD, 0xEF, 0xFD, 0xDC, 0xBA, 0x99, 0x88, 0x77, 0x78, 0x89, - 0xAB, 0xCE, 0xFE, 0xDD, 0xCA, 0x98, 0x87, 0x76, 0x66, 0x77, 0x89, 0xAB, - 0xDF, 0xFD, 0xCB, 0xA9, 0x87, 0x66, 0x55, 0x56, 0x77, 0x9A, 0xBC, 0xEE, - 0xDC, 0xBA, 0x97, 0x76, 0x55, 0x55, 0x56, 0x78, 0x9A, 0xCD, 0xED, 0xCB, - 0x98, 0x76, 0x55, 0x44, 0x55, 0x67, 0x89, 0xAC, 0xDD, 0xDC, 0xB9, 0x87, - 0x65, 0x54, 0x44, 0x56, 0x78, 0x9A, 0xBC, 0xDD, 0xCB, 0xA8, 0x76, 0x55, - 0x44, 0x55, 0x67, 0x89, 0xAB, 0xCD, 0xDD, 0xBA, 0x98, 0x76, 0x55, 0x55, - 0x66, 0x78, 0x9A, 0xCD, 0xDE, 0xDC, 0xA9, 0x87, 0x76, 0x66, 0x66, 0x78, - 0x9A, 0xBC, 0xDD, 0xFD, 0xDB, 0xA9, 0x87, 0x77, 0x77, 0x78, 0x99, 0xAC, - 0xCD, 0xDF, 0xFD, 0xCB, 0xA9, 0x88, 0x88, 0x88, 0x99, 0xAB, 0xCD, 0xEF, - 0xFF, 0xFD, 0xCB, 0xAA, 0x99, 0x99, 0x9A, 0xAB, 0xCD, 0xEF, 0xDF, 0xFE, - 0xED, 0xCB, 0xBA, 0xAA, 0xAB, 0xBC, 0xCC, 0xDE, 0xFF, 0xFF, 0xFF, 0xFD, - 0xDC, 0xBC, 0xCB, 0xCC, 0xCD, 0xDE, 0xFF, 0xEF, 0xFF, 0xFF, 0xFE, 0xEE, - 0xDD, 0xDE, 0xDE, 0xEF, 0xFF, 0xFF, 0xDF, 0xFF, 0xFF, 0xEE, 0xED, 0xDD, - 0xEE, 0xDF, 0xEE, 0xFE, 0xB0, 0x00, 0x00, 0x00, - ], - [ - 0xBD, 0xDC, 0xCC, 0xCC, 0xCB, 0xCC, 0xCC, 0xEF, 0xFF, 0xDF, 0xCD, 0xFF, - 0xCD, 0xCC, 0xCC, 0xCC, 0xBD, 0xDF, 0xFF, 0xFF, 0xFF, 0xFD, 0xDC, 0xBB, - 0xBB, 0xAB, 0xBA, 0xBC, 0xDC, 0xDF, 0xFF, 0xFD, 0xDC, 0xCB, 0xAA, 0xA9, - 0x99, 0x9A, 0xBB, 0xBC, 0xFF, 0xFF, 0xCC, 0xDB, 0xA9, 0x99, 0x88, 0x88, - 0x89, 0xAB, 0xCC, 0xDF, 0xFC, 0xDC, 0xA9, 0x98, 0x87, 0x77, 0x78, 0x89, - 0xAB, 0xCD, 0xFF, 0xBC, 0xBA, 0x98, 0x77, 0x66, 0x66, 0x77, 0x89, 0xAB, - 0xCF, 0xFC, 0xBB, 0xA9, 0x87, 0x66, 0x55, 0x56, 0x77, 0x89, 0xAB, 0xCF, - 0xCC, 0xA9, 0x87, 0x66, 0x55, 0x55, 0x56, 0x78, 0x9A, 0xBD, 0xFC, 0xBB, - 0x98, 0x76, 0x55, 0x44, 0x55, 0x67, 0x89, 0xAB, 0xCD, 0xCB, 0xA9, 0x87, - 0x65, 0x54, 0x45, 0x56, 0x78, 0x9A, 0xBD, 0xDC, 0xCB, 0xA8, 0x76, 0x55, - 0x55, 0x55, 0x67, 0x89, 0xAB, 0xCD, 0xEC, 0xBA, 0x87, 0x76, 0x55, 0x55, - 0x66, 0x78, 0x9A, 0xBD, 0xCD, 0xCB, 0xA9, 0x87, 0x66, 0x66, 0x66, 0x77, - 0x89, 0xAB, 0xCC, 0xDD, 0xDB, 0x99, 0x87, 0x77, 0x77, 0x77, 0x89, 0xAB, - 0xBC, 0xCF, 0xFD, 0xBB, 0xA9, 0x88, 0x88, 0x88, 0x89, 0x9B, 0xCC, 0xFC, - 0xFF, 0xDD, 0xBA, 0x9A, 0x99, 0x99, 0x99, 0xAA, 0xBC, 0xFD, 0xDF, 0xFD, - 0xFD, 0xCB, 0xAA, 0xAA, 0xAA, 0xAA, 0xBC, 0xCF, 0xFD, 0xFF, 0xFF, 0xDC, - 0xCB, 0xBB, 0xBB, 0xBB, 0xCD, 0xDD, 0xDF, 0xDF, 0xFF, 0xFF, 0xFD, 0xFD, - 0xCC, 0xCC, 0xFC, 0xCD, 0xFE, 0xFE, 0xDF, 0xFF, 0xFD, 0xDD, 0xFC, 0xDC, - 0xDD, 0xCC, 0xCE, 0xFD, 0xB0, 0x00, 0x00, 0x00, - ], - [ - 0xCF, 0xDD, 0xDC, 0xCC, 0xCC, 0xCD, 0xDD, 0xEF, 0xFF, 0xFF, 0xFD, 0xFE, - 0xDD, 0xCC, 0xCC, 0xCC, 0xCC, 0xCE, 0xFF, 0xFF, 0xFF, 0xEF, 0xDD, 0xCB, - 0xBB, 0xAA, 0xAA, 0xBB, 0xCC, 0xDF, 0xFF, 0xFD, 0xED, 0xCB, 0xAA, 0xA9, - 0x99, 0x99, 0xAA, 0xBC, 0xDF, 0xFF, 0xDD, 0xCB, 0xAA, 0x99, 0x88, 0x88, - 0x89, 0x9A, 0xBD, 0xEF, 0xFC, 0xDB, 0xBA, 0x98, 0x87, 0x77, 0x77, 0x88, - 0x9A, 0xBD, 0xFF, 0xCC, 0xBA, 0x98, 0x77, 0x66, 0x66, 0x67, 0x89, 0xAB, - 0xCD, 0xFC, 0xCB, 0xA9, 0x87, 0x66, 0x55, 0x56, 0x67, 0x89, 0xAB, 0xDF, - 0xCC, 0xA9, 0x87, 0x66, 0x55, 0x55, 0x56, 0x78, 0x9A, 0xBD, 0xDC, 0xCA, - 0x98, 0x76, 0x55, 0x55, 0x55, 0x66, 0x78, 0xAB, 0xCD, 0xCC, 0xA9, 0x87, - 0x65, 0x55, 0x45, 0x56, 0x67, 0x8A, 0xBD, 0xDC, 0xCA, 0x98, 0x76, 0x55, - 0x55, 0x55, 0x67, 0x79, 0xAB, 0xCD, 0xDC, 0xB9, 0x87, 0x66, 0x55, 0x55, - 0x66, 0x78, 0x9A, 0xBD, 0xDE, 0xDB, 0xA9, 0x87, 0x66, 0x66, 0x66, 0x77, - 0x89, 0xAC, 0xCD, 0xFD, 0xCB, 0x98, 0x87, 0x76, 0x67, 0x77, 0x89, 0xAB, - 0xCD, 0xDF, 0xFD, 0xBA, 0x99, 0x88, 0x77, 0x78, 0x89, 0xAA, 0xBC, 0xDD, - 0xFF, 0xFD, 0xBA, 0xA9, 0x99, 0x89, 0x99, 0xAA, 0xBC, 0xDD, 0xEF, 0xFF, - 0xED, 0xCB, 0xAA, 0xAA, 0xAA, 0xAB, 0xBC, 0xDD, 0xFF, 0xFF, 0xFF, 0xED, - 0xCB, 0xBB, 0xBB, 0xBB, 0xCC, 0xDD, 0xEF, 0xEF, 0xFF, 0xFF, 0xFE, 0xDD, - 0xCC, 0xCC, 0xDD, 0xEE, 0xFF, 0xFE, 0xFF, 0xFF, 0xFF, 0xFD, 0xED, 0xDD, - 0xDD, 0xDD, 0xED, 0xEE, 0xC0, 0x00, 0x00, 0x00, - ], - [ - 0xAE, 0xCD, 0xCC, 0xEC, 0xCD, 0xCC, 0xCD, 0xEF, 0xFF, 0xFF, 0xDD, 0xFD, - 0xDC, 0xDC, 0xCD, 0xCC, 0xDD, 0xED, 0xDF, 0xFF, 0xFF, 0xCF, 0xDF, 0xCC, - 0xBB, 0xBB, 0xBB, 0xBC, 0xCC, 0xDF, 0xFF, 0xFD, 0xFD, 0xCB, 0xBB, 0xAA, - 0x99, 0xA9, 0xAB, 0xCD, 0xFF, 0xFF, 0xDE, 0xCB, 0xBA, 0x99, 0x88, 0x88, - 0x89, 0xAA, 0xCD, 0xFF, 0xFD, 0xDC, 0xAA, 0x98, 0x87, 0x77, 0x77, 0x88, - 0x9A, 0xBD, 0xFD, 0xCC, 0xBA, 0x99, 0x87, 0x66, 0x66, 0x67, 0x88, 0xAC, - 0xCF, 0xEC, 0xCB, 0xA9, 0x87, 0x66, 0x55, 0x56, 0x67, 0x89, 0xAC, 0xDD, - 0xDD, 0xBA, 0x97, 0x66, 0x55, 0x55, 0x56, 0x78, 0x9A, 0xBC, 0xDC, 0xCB, - 0x98, 0x76, 0x55, 0x54, 0x55, 0x67, 0x79, 0xAB, 0xDD, 0xDC, 0xB9, 0x87, - 0x65, 0x54, 0x45, 0x56, 0x77, 0x9A, 0xBC, 0xDD, 0xCB, 0x98, 0x76, 0x55, - 0x55, 0x55, 0x67, 0x89, 0xAC, 0xBD, 0xDC, 0xB9, 0x97, 0x66, 0x55, 0x55, - 0x66, 0x78, 0x9A, 0xCD, 0xCD, 0xDB, 0xA9, 0x87, 0x66, 0x66, 0x66, 0x78, - 0x99, 0xAC, 0xDC, 0xFE, 0xCA, 0x98, 0x87, 0x76, 0x67, 0x78, 0x99, 0xAC, - 0xCD, 0xCD, 0xED, 0xBA, 0x99, 0x88, 0x78, 0x88, 0x99, 0xAB, 0xCD, 0xDC, - 0xFF, 0xFC, 0xBA, 0xA9, 0x99, 0x89, 0x99, 0xAB, 0xBC, 0xDD, 0xCF, 0xFF, - 0xFD, 0xBB, 0xAA, 0xAA, 0xAA, 0xAB, 0xCB, 0xCD, 0xDC, 0xFF, 0xFF, 0xDD, - 0xCC, 0xBB, 0xBB, 0xBC, 0xCC, 0xDD, 0xFF, 0xDF, 0xFF, 0xFF, 0xEE, 0xDE, - 0xDC, 0xCD, 0xDF, 0xEE, 0xFF, 0xFD, 0xDF, 0xFF, 0xEE, 0xDC, 0xDD, 0xCC, - 0xCC, 0xCC, 0xCC, 0xFD, 0xB0, 0x00, 0x00, 0x00, - ], - [ - 0xAE, 0xED, 0xDE, 0xDD, 0xDD, 0xDE, 0xDF, 0xFF, 0xFF, 0xFF, 0xCD, 0xFE, - 0xFF, 0xEE, 0xDD, 0xDD, 0xCE, 0xFF, 0xFF, 0xFF, 0xFF, 0xEF, 0xEE, 0xDC, - 0xCB, 0xCB, 0xBB, 0xCC, 0xDE, 0xEF, 0xFF, 0xFD, 0xFE, 0xDC, 0xCB, 0xAA, - 0xAA, 0xAA, 0xBC, 0xCD, 0xEF, 0xFF, 0xDF, 0xDC, 0xBB, 0xA9, 0x99, 0x99, - 0x9A, 0xAB, 0xDF, 0xFF, 0xFD, 0xDD, 0xBA, 0xA9, 0x88, 0x77, 0x78, 0x89, - 0xAB, 0xDE, 0xFF, 0xDD, 0xDB, 0xA9, 0x87, 0x76, 0x66, 0x77, 0x89, 0xBC, - 0xFE, 0xFD, 0xDB, 0xB9, 0x87, 0x66, 0x55, 0x56, 0x77, 0x9A, 0xBD, 0xFF, - 0xDD, 0xCA, 0x98, 0x66, 0x55, 0x55, 0x56, 0x78, 0x9B, 0xCE, 0xFD, 0xEB, - 0xA9, 0x76, 0x55, 0x44, 0x45, 0x67, 0x89, 0xBD, 0xFF, 0xDD, 0xBA, 0x97, - 0x65, 0x54, 0x44, 0x56, 0x78, 0x9B, 0xCD, 0xED, 0xDB, 0xA9, 0x76, 0x55, - 0x44, 0x55, 0x67, 0x89, 0xBC, 0xFD, 0xED, 0xCB, 0x98, 0x76, 0x55, 0x55, - 0x66, 0x78, 0xAB, 0xDF, 0xFD, 0xEC, 0xB9, 0x87, 0x66, 0x66, 0x66, 0x78, - 0x9A, 0xBC, 0xED, 0xDF, 0xFC, 0xA9, 0x87, 0x77, 0x77, 0x78, 0x9A, 0xAC, - 0xDE, 0xEF, 0xFF, 0xCB, 0xA9, 0x88, 0x88, 0x88, 0x9A, 0xBB, 0xCE, 0xFE, - 0xFF, 0xFE, 0xCB, 0xBA, 0x99, 0x99, 0xAA, 0xAB, 0xCD, 0xEF, 0xEF, 0xFF, - 0xED, 0xDC, 0xCB, 0xBB, 0xBB, 0xBC, 0xCD, 0xEE, 0xFF, 0xFF, 0xFF, 0xFE, - 0xDC, 0xCC, 0xCC, 0xCC, 0xDD, 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xEF, - 0xDE, 0xDE, 0xEF, 0xFF, 0xFF, 0xFF, 0xBF, 0xFF, 0xFF, 0xDD, 0xED, 0xCD, - 0xDD, 0xCC, 0xDD, 0xDE, 0xB0, 0x00, 0x00, 0x00, - ], - [ - 0xAC, 0xBB, 0xBB, 0xAA, 0xAA, 0xAA, 0xAB, 0xBB, 0xCC, 0xDE, 0xAC, 0xDC, - 0xCB, 0xBB, 0xBA, 0xAA, 0xAA, 0xBB, 0xCD, 0xDD, 0xFE, 0xCC, 0xCB, 0xBA, - 0xAA, 0x99, 0x99, 0xAA, 0xAB, 0xBC, 0xDE, 0xDB, 0xCB, 0xAA, 0xA9, 0x99, - 0x88, 0x89, 0x99, 0xAB, 0xBC, 0xED, 0xBB, 0xBA, 0x99, 0x88, 0x88, 0x88, - 0x88, 0x99, 0xAB, 0xCC, 0xCB, 0xBA, 0xA9, 0x88, 0x77, 0x77, 0x77, 0x78, - 0x99, 0xAB, 0xCC, 0xAB, 0xA9, 0x88, 0x77, 0x66, 0x66, 0x77, 0x78, 0x99, - 0xBC, 0xBA, 0xAA, 0x98, 0x77, 0x66, 0x66, 0x66, 0x67, 0x88, 0x9A, 0xBB, - 0xAA, 0x98, 0x87, 0x66, 0x55, 0x55, 0x66, 0x77, 0x89, 0xAB, 0xBA, 0xA9, - 0x88, 0x76, 0x65, 0x55, 0x55, 0x67, 0x78, 0x9A, 0xBB, 0xAA, 0x98, 0x87, - 0x66, 0x55, 0x55, 0x56, 0x77, 0x89, 0xAB, 0xBA, 0xA9, 0x88, 0x76, 0x65, - 0x55, 0x56, 0x67, 0x78, 0x9A, 0xBB, 0xBB, 0xA9, 0x87, 0x66, 0x65, 0x56, - 0x66, 0x77, 0x89, 0xAB, 0xBB, 0xBA, 0x98, 0x77, 0x66, 0x66, 0x66, 0x77, - 0x89, 0x9A, 0xBB, 0xBB, 0xA9, 0x98, 0x77, 0x77, 0x67, 0x77, 0x88, 0x9A, - 0xBB, 0xBC, 0xCB, 0xA9, 0x98, 0x87, 0x77, 0x77, 0x88, 0x99, 0xAB, 0xCB, - 0xCC, 0xCB, 0xA9, 0x98, 0x88, 0x88, 0x89, 0x9A, 0xAB, 0xBC, 0xBD, 0xDC, - 0xBB, 0xAA, 0x99, 0x99, 0x99, 0x9A, 0xAB, 0xBC, 0xCC, 0xEE, 0xDC, 0xCB, - 0xAA, 0xAA, 0xAA, 0xAA, 0xBB, 0xBC, 0xCD, 0xCD, 0xFD, 0xDC, 0xCB, 0xBB, - 0xBB, 0xBB, 0xBB, 0xCC, 0xDD, 0xEC, 0xBD, 0xDD, 0xCC, 0xCB, 0xBB, 0xBB, - 0xBB, 0xBB, 0xCB, 0xCC, 0xA0, 0x00, 0x00, 0x00, - ], - [ - 0x8A, 0xA9, 0x99, 0x99, 0x98, 0x99, 0x99, 0x9A, 0xAB, 0xBC, 0xAA, 0xBB, - 0xBA, 0xA9, 0x99, 0x99, 0x99, 0x9A, 0xBB, 0xCD, 0xDC, 0xAB, 0xBA, 0xA9, - 0x99, 0x99, 0x88, 0x99, 0x9A, 0xAA, 0xBC, 0xC9, 0xAA, 0xA9, 0x98, 0x88, - 0x88, 0x88, 0x89, 0x99, 0xAB, 0xCB, 0xAB, 0xA9, 0x98, 0x88, 0x77, 0x77, - 0x78, 0x88, 0x99, 0xAB, 0xB9, 0xA9, 0x88, 0x87, 0x77, 0x77, 0x77, 0x77, - 0x88, 0x9A, 0xAA, 0x9A, 0x98, 0x87, 0x77, 0x76, 0x66, 0x77, 0x78, 0x89, - 0xAA, 0xA9, 0x99, 0x88, 0x77, 0x66, 0x66, 0x66, 0x77, 0x78, 0x89, 0xA9, - 0x99, 0x98, 0x87, 0x66, 0x66, 0x66, 0x66, 0x77, 0x88, 0x9A, 0x99, 0x99, - 0x87, 0x76, 0x66, 0x66, 0x66, 0x67, 0x78, 0x89, 0x99, 0x89, 0x88, 0x77, - 0x66, 0x66, 0x66, 0x66, 0x77, 0x78, 0x9A, 0x99, 0x98, 0x87, 0x76, 0x66, - 0x66, 0x66, 0x67, 0x78, 0x89, 0x99, 0x99, 0x98, 0x87, 0x76, 0x66, 0x66, - 0x66, 0x77, 0x88, 0x99, 0x99, 0xA9, 0x88, 0x77, 0x76, 0x66, 0x66, 0x77, - 0x78, 0x89, 0xA9, 0x9A, 0x99, 0x87, 0x77, 0x77, 0x67, 0x77, 0x78, 0x89, - 0x9A, 0x9A, 0xAA, 0x99, 0x88, 0x77, 0x77, 0x77, 0x78, 0x89, 0x9A, 0xBA, - 0xAB, 0xA9, 0x98, 0x88, 0x88, 0x88, 0x88, 0x99, 0x99, 0xAB, 0xAB, 0xBB, - 0xAA, 0x99, 0x88, 0x88, 0x88, 0x89, 0x99, 0xAA, 0xBA, 0xBC, 0xBB, 0xAA, - 0x99, 0x99, 0x99, 0x99, 0x9A, 0xAA, 0xAB, 0xAD, 0xDD, 0xBB, 0xAA, 0xA9, - 0xA9, 0x9A, 0xAA, 0xAB, 0xBB, 0xDB, 0xAC, 0xCB, 0xAA, 0xA9, 0x99, 0x99, - 0x99, 0x9A, 0xAA, 0xAB, 0x90, 0x00, 0x00, 0x00, - ], - [ - 0x9B, 0xAA, 0xAA, 0x99, 0x99, 0x99, 0x9A, 0xAA, 0xBB, 0xCC, 0xBA, 0xCB, - 0xBB, 0xAA, 0xAA, 0xA9, 0xAA, 0xAA, 0xBB, 0xCC, 0xDC, 0xAB, 0xBB, 0xAA, - 0x99, 0x99, 0x99, 0x99, 0xAA, 0xAB, 0xCC, 0xCA, 0xBA, 0xA9, 0x99, 0x88, - 0x88, 0x88, 0x89, 0x9A, 0xAB, 0xCB, 0xAB, 0xA9, 0x98, 0x88, 0x77, 0x77, - 0x88, 0x89, 0x9A, 0xBB, 0xBA, 0xAA, 0x98, 0x88, 0x77, 0x77, 0x77, 0x78, - 0x89, 0x9A, 0xBB, 0x9A, 0x99, 0x88, 0x77, 0x66, 0x66, 0x67, 0x78, 0x89, - 0xAB, 0xA9, 0xA9, 0x88, 0x77, 0x66, 0x66, 0x66, 0x67, 0x78, 0x99, 0xAA, - 0x9A, 0x98, 0x87, 0x66, 0x66, 0x66, 0x66, 0x77, 0x88, 0x9A, 0xA9, 0x99, - 0x87, 0x76, 0x66, 0x55, 0x66, 0x66, 0x78, 0x89, 0xAA, 0x9A, 0x98, 0x77, - 0x66, 0x65, 0x55, 0x66, 0x77, 0x88, 0x9A, 0xA9, 0xA9, 0x87, 0x76, 0x66, - 0x56, 0x66, 0x67, 0x78, 0x89, 0xAA, 0xAA, 0x98, 0x77, 0x66, 0x66, 0x66, - 0x66, 0x77, 0x89, 0x9A, 0xAA, 0xA9, 0x88, 0x77, 0x66, 0x66, 0x66, 0x77, - 0x88, 0x9A, 0xAA, 0xAA, 0xA9, 0x88, 0x77, 0x77, 0x67, 0x77, 0x88, 0x89, - 0xAB, 0xAB, 0xBA, 0x99, 0x88, 0x77, 0x77, 0x77, 0x88, 0x89, 0xAA, 0xBA, - 0xBB, 0xAA, 0x99, 0x88, 0x88, 0x88, 0x88, 0x99, 0x9A, 0xAB, 0xAB, 0xCB, - 0xAA, 0x99, 0x98, 0x88, 0x89, 0x99, 0x9A, 0xAB, 0xBB, 0xCC, 0xCB, 0xBA, - 0xA9, 0x99, 0x99, 0x9A, 0xAA, 0xAB, 0xBC, 0xBD, 0xDC, 0xCB, 0xBB, 0xAA, - 0xAA, 0xAA, 0xAA, 0xBB, 0xBC, 0xDB, 0xBC, 0xCB, 0xBB, 0xAA, 0xAA, 0x9A, - 0xAA, 0xAA, 0xAA, 0xBB, 0x90, 0x00, 0x00, 0x00, - ], - [ - 0xAB, 0xBA, 0xAA, 0xA9, 0x99, 0x9A, 0xAA, 0xAA, 0xBC, 0xBD, 0xBB, 0xCC, - 0xBB, 0xBA, 0xAA, 0xA9, 0xA9, 0xAA, 0xBB, 0xCD, 0xDD, 0xBC, 0xBA, 0xAA, - 0x99, 0x99, 0x99, 0x99, 0xAA, 0xAB, 0xBD, 0xCB, 0xBB, 0xA9, 0x99, 0x88, - 0x88, 0x88, 0x89, 0x9A, 0xAB, 0xCC, 0xAB, 0xAA, 0x99, 0x88, 0x77, 0x77, - 0x88, 0x89, 0x9A, 0xAB, 0xBA, 0xAA, 0x98, 0x88, 0x77, 0x77, 0x77, 0x78, - 0x89, 0x9A, 0xBB, 0xAA, 0x99, 0x87, 0x77, 0x66, 0x66, 0x67, 0x78, 0x89, - 0xAB, 0xAA, 0xA9, 0x88, 0x77, 0x66, 0x66, 0x66, 0x67, 0x78, 0x99, 0xAA, - 0x9A, 0x98, 0x77, 0x66, 0x66, 0x66, 0x66, 0x77, 0x88, 0x9A, 0xAA, 0x99, - 0x87, 0x76, 0x66, 0x55, 0x56, 0x66, 0x78, 0x89, 0xAA, 0x99, 0x98, 0x77, - 0x66, 0x65, 0x56, 0x66, 0x67, 0x88, 0x9A, 0xA9, 0xA9, 0x87, 0x76, 0x66, - 0x65, 0x66, 0x67, 0x78, 0x99, 0xAA, 0x9A, 0x98, 0x77, 0x76, 0x66, 0x66, - 0x66, 0x77, 0x88, 0x9A, 0xAA, 0xA9, 0x88, 0x77, 0x66, 0x66, 0x66, 0x77, - 0x88, 0x9A, 0xAA, 0xAA, 0xA9, 0x88, 0x77, 0x76, 0x67, 0x77, 0x78, 0x99, - 0xAB, 0xAB, 0xBA, 0x99, 0x88, 0x77, 0x77, 0x77, 0x88, 0x99, 0xAA, 0xBB, - 0xBC, 0xBA, 0x99, 0x88, 0x88, 0x88, 0x88, 0x89, 0xAA, 0xBB, 0xBC, 0xCC, - 0xAA, 0x99, 0x98, 0x88, 0x89, 0x99, 0x9A, 0xBB, 0xCB, 0xCD, 0xCB, 0xAA, - 0xA9, 0x99, 0x99, 0x99, 0xAA, 0xAB, 0xCC, 0xBD, 0xDC, 0xCB, 0xBB, 0xAA, - 0xAA, 0xAA, 0xBB, 0xBB, 0xCC, 0xDB, 0xAD, 0xCB, 0xBB, 0xBA, 0xAA, 0xAA, - 0xAA, 0xAA, 0xBB, 0xBC, 0xA0, 0x00, 0x00, 0x00, - ], - [ - 0xAC, 0xBB, 0xBA, 0xAA, 0xAA, 0xAA, 0xAB, 0xBB, 0xCD, 0xDE, 0xBC, 0xDC, - 0xCB, 0xBB, 0xAA, 0xAA, 0xAA, 0xBB, 0xCC, 0xDD, 0xFD, 0xBC, 0xCB, 0xBA, - 0xA9, 0x99, 0x99, 0xAA, 0xAB, 0xBC, 0xCE, 0xDB, 0xBB, 0xAA, 0x99, 0x98, - 0x88, 0x89, 0x99, 0xAB, 0xBC, 0xDD, 0xBB, 0xBA, 0x99, 0x88, 0x88, 0x88, - 0x88, 0x99, 0xAB, 0xBC, 0xCB, 0xBA, 0x99, 0x88, 0x77, 0x77, 0x77, 0x88, - 0x89, 0xAB, 0xCC, 0xAB, 0xA9, 0x88, 0x77, 0x66, 0x66, 0x77, 0x78, 0x9A, - 0xAB, 0xBA, 0xA9, 0x98, 0x77, 0x66, 0x66, 0x66, 0x67, 0x88, 0x9A, 0xBB, - 0xAA, 0x99, 0x87, 0x66, 0x65, 0x55, 0x66, 0x77, 0x89, 0xAB, 0xBA, 0xA9, - 0x88, 0x76, 0x65, 0x55, 0x55, 0x67, 0x78, 0x99, 0xBB, 0xAA, 0x98, 0x77, - 0x66, 0x55, 0x55, 0x56, 0x77, 0x89, 0xAB, 0xBA, 0xA9, 0x88, 0x76, 0x65, - 0x55, 0x56, 0x67, 0x78, 0x9A, 0xBB, 0xAA, 0x99, 0x87, 0x76, 0x65, 0x56, - 0x66, 0x77, 0x89, 0xAB, 0xBB, 0xBA, 0x98, 0x77, 0x66, 0x66, 0x66, 0x77, - 0x89, 0x9A, 0xBB, 0xBB, 0xAA, 0x98, 0x77, 0x76, 0x67, 0x77, 0x88, 0x9A, - 0xAB, 0xBB, 0xCB, 0xA9, 0x98, 0x87, 0x77, 0x77, 0x88, 0x99, 0xAB, 0xBB, - 0xCC, 0xBA, 0xA9, 0x98, 0x88, 0x88, 0x89, 0x99, 0xAA, 0xBC, 0xBC, 0xCC, - 0xBB, 0xAA, 0x99, 0x99, 0x99, 0x9A, 0xAB, 0xBC, 0xDC, 0xDD, 0xDC, 0xBB, - 0xAA, 0xAA, 0xAA, 0xAA, 0xAB, 0xBC, 0xCD, 0xCE, 0xFD, 0xDC, 0xCB, 0xBB, - 0xAB, 0xBB, 0xBB, 0xCC, 0xCD, 0xDC, 0xBD, 0xDC, 0xCC, 0xBB, 0xBB, 0xAA, - 0xAB, 0xBB, 0xBC, 0xCC, 0xA0, 0x00, 0x00, 0x00, - ], - [ - 0xBE, 0xED, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xEF, 0xFF, 0xFF, 0xBE, 0xFF, - 0xED, 0xDD, 0xCD, 0xDD, 0xDE, 0xFF, 0xFF, 0xFF, 0xFF, 0xEF, 0xED, 0xDC, - 0xCC, 0xBC, 0xBC, 0xDD, 0xDE, 0xFF, 0xFF, 0xFD, 0xDD, 0xDC, 0xBB, 0xAA, - 0xAA, 0xBB, 0xCC, 0xDE, 0xFF, 0xFF, 0xDE, 0xDC, 0xBA, 0xA9, 0x99, 0x99, - 0x9A, 0xBC, 0xDE, 0xFF, 0xFD, 0xDC, 0xBA, 0x99, 0x88, 0x88, 0x88, 0x9A, - 0xBC, 0xDF, 0xFF, 0xDD, 0xCB, 0xA9, 0x87, 0x76, 0x67, 0x78, 0x9A, 0xBD, - 0xFF, 0xFD, 0xDC, 0xA9, 0x87, 0x66, 0x55, 0x66, 0x78, 0x9B, 0xCD, 0xFE, - 0xDD, 0xBA, 0x98, 0x76, 0x54, 0x45, 0x56, 0x89, 0xAB, 0xEE, 0xFD, 0xDB, - 0xA9, 0x76, 0x54, 0x44, 0x45, 0x67, 0x9A, 0xBD, 0xEE, 0xDD, 0xBA, 0x98, - 0x65, 0x44, 0x44, 0x56, 0x78, 0xAB, 0xDE, 0xED, 0xEC, 0xA9, 0x87, 0x55, - 0x44, 0x45, 0x67, 0x9A, 0xBC, 0xED, 0xED, 0xCB, 0x98, 0x76, 0x55, 0x55, - 0x67, 0x89, 0xAB, 0xCE, 0xEE, 0xFD, 0xBA, 0x98, 0x76, 0x66, 0x67, 0x78, - 0x9A, 0xBD, 0xEE, 0xFF, 0xDC, 0xBA, 0x98, 0x87, 0x77, 0x88, 0x9A, 0xBC, - 0xDE, 0xEF, 0xFE, 0xDC, 0xBA, 0x99, 0x88, 0x99, 0x9A, 0xBB, 0xCD, 0xFE, - 0xEF, 0xFE, 0xDC, 0xBA, 0xAA, 0xAA, 0xAA, 0xBB, 0xCD, 0xDF, 0xEF, 0xFF, - 0xFE, 0xDC, 0xCC, 0xCB, 0xBB, 0xBC, 0xCD, 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xED, 0xDD, 0xCC, 0xCD, 0xDD, 0xDE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xDE, 0xED, 0xEE, 0xEF, 0xFF, 0xFF, 0xBE, 0xFF, 0xFF, 0xEE, 0xEE, 0xDE, - 0xED, 0xDD, 0xEE, 0xFE, 0xB0, 0x00, 0x00, 0x00, - ], - [ - 0xAC, 0xDC, 0xCC, 0xCC, 0xCC, 0xCC, 0xDD, 0xDF, 0xFE, 0xFF, 0xBC, 0xED, - 0xDD, 0xCC, 0xCC, 0xCC, 0xCC, 0xDE, 0xFF, 0xFF, 0xFF, 0xCD, 0xDC, 0xCC, - 0xBB, 0xAB, 0xAB, 0xBC, 0xCD, 0xEF, 0xFF, 0xFC, 0xDC, 0xCB, 0xAA, 0xA9, - 0x99, 0x9A, 0xAB, 0xCC, 0xFF, 0xFE, 0xCD, 0xCB, 0xAA, 0x99, 0x88, 0x88, - 0x99, 0xAB, 0xCD, 0xEF, 0xFC, 0xCB, 0xBA, 0x98, 0x87, 0x77, 0x77, 0x89, - 0xAB, 0xCE, 0xFE, 0xCC, 0xBA, 0x98, 0x77, 0x66, 0x66, 0x77, 0x89, 0xAB, - 0xDE, 0xDC, 0xCB, 0xA9, 0x87, 0x66, 0x55, 0x56, 0x77, 0x8A, 0xBC, 0xDE, - 0xCC, 0xB9, 0x87, 0x66, 0x55, 0x55, 0x56, 0x78, 0x9B, 0xCD, 0xDC, 0xBA, - 0x98, 0x76, 0x55, 0x44, 0x45, 0x67, 0x89, 0xAC, 0xDD, 0xCC, 0xB9, 0x87, - 0x65, 0x54, 0x45, 0x56, 0x78, 0x9A, 0xCD, 0xDD, 0xCB, 0x98, 0x76, 0x55, - 0x55, 0x55, 0x67, 0x89, 0xAC, 0xCD, 0xCC, 0xBA, 0x98, 0x76, 0x55, 0x55, - 0x66, 0x78, 0x9A, 0xCC, 0xCD, 0xDB, 0xA9, 0x87, 0x66, 0x66, 0x66, 0x78, - 0x9A, 0xBC, 0xDD, 0xDD, 0xCB, 0xA9, 0x87, 0x77, 0x77, 0x78, 0x89, 0xAB, - 0xDD, 0xDE, 0xED, 0xBB, 0xA9, 0x88, 0x88, 0x88, 0x99, 0xAB, 0xCC, 0xDD, - 0xFF, 0xEC, 0xCB, 0xAA, 0x99, 0x99, 0x9A, 0xAA, 0xBC, 0xDD, 0xDF, 0xFF, - 0xFE, 0xCB, 0xBA, 0xAA, 0xAA, 0xBB, 0xCC, 0xED, 0xDD, 0xFF, 0xFF, 0xEE, - 0xCC, 0xCB, 0xBB, 0xCC, 0xCC, 0xDD, 0xEE, 0xDF, 0xFF, 0xFF, 0xFE, 0xED, - 0xDC, 0xCD, 0xCD, 0xDD, 0xDE, 0xED, 0xCF, 0xFF, 0xFE, 0xEE, 0xDD, 0xDD, - 0xCD, 0xCC, 0xDD, 0xDD, 0xB0, 0x00, 0x00, 0x00, - ], - [ - 0xCD, 0xDD, 0xDC, 0xCC, 0xCC, 0xCC, 0xCD, 0xDE, 0xFF, 0xFF, 0xDD, 0xED, - 0xDC, 0xCC, 0xCB, 0xBB, 0xCC, 0xCD, 0xEE, 0xFF, 0xFF, 0xDE, 0xDD, 0xCB, - 0xBB, 0xAA, 0xAA, 0xBB, 0xCD, 0xDF, 0xFF, 0xFD, 0xDC, 0xBB, 0xAA, 0x99, - 0x99, 0x99, 0xAB, 0xBC, 0xDE, 0xFF, 0xCD, 0xCB, 0xA9, 0x98, 0x88, 0x88, - 0x89, 0xAA, 0xBC, 0xEF, 0xFC, 0xCB, 0xA9, 0x98, 0x77, 0x77, 0x77, 0x89, - 0x9B, 0xCD, 0xEE, 0xCC, 0xBA, 0x98, 0x77, 0x66, 0x66, 0x67, 0x89, 0xAB, - 0xCD, 0xEC, 0xCA, 0x98, 0x87, 0x66, 0x55, 0x56, 0x67, 0x89, 0xAC, 0xDE, - 0xCB, 0xA9, 0x87, 0x66, 0x55, 0x55, 0x56, 0x78, 0x9A, 0xCD, 0xDC, 0xBA, - 0x98, 0x76, 0x55, 0x54, 0x55, 0x67, 0x89, 0xAB, 0xCD, 0xCC, 0xA9, 0x87, - 0x65, 0x54, 0x45, 0x56, 0x78, 0x9A, 0xBC, 0xDC, 0xCA, 0x98, 0x76, 0x55, - 0x55, 0x55, 0x67, 0x89, 0xAB, 0xCC, 0xCC, 0xBA, 0x87, 0x66, 0x55, 0x55, - 0x66, 0x78, 0x9A, 0xBC, 0xDD, 0xCB, 0xA9, 0x87, 0x66, 0x66, 0x66, 0x78, - 0x99, 0xAB, 0xDD, 0xDD, 0xCA, 0xA9, 0x87, 0x77, 0x77, 0x78, 0x89, 0xAB, - 0xCD, 0xDE, 0xDC, 0xBA, 0xA9, 0x88, 0x88, 0x88, 0x89, 0xAA, 0xBC, 0xDD, - 0xEE, 0xDC, 0xBB, 0xA9, 0x99, 0x99, 0x99, 0xAA, 0xBC, 0xDE, 0xDF, 0xFF, - 0xDD, 0xCB, 0xBA, 0xAA, 0xAA, 0xAB, 0xBC, 0xDD, 0xFD, 0xFF, 0xFF, 0xED, - 0xCC, 0xBB, 0xBB, 0xBB, 0xCC, 0xDD, 0xEF, 0xDF, 0xFF, 0xFE, 0xED, 0xDD, - 0xCC, 0xCC, 0xCD, 0xDE, 0xEF, 0xFE, 0xCF, 0xFF, 0xFF, 0xDE, 0xDD, 0xDD, - 0xCD, 0xDD, 0xDE, 0xEE, 0xC0, 0x00, 0x00, 0x00, - ], - [ - 0xBE, 0xDD, 0xCC, 0xCC, 0xCC, 0xCD, 0xDF, 0xEE, 0xFF, 0xFF, 0xCD, 0xDE, - 0xCC, 0xCC, 0xCC, 0xCC, 0xCD, 0xDE, 0xFF, 0xFF, 0xFF, 0xDD, 0xCC, 0xBB, - 0xBB, 0xBB, 0xBB, 0xBB, 0xCD, 0xDF, 0xFF, 0xFD, 0xDC, 0xCB, 0xBA, 0xA9, - 0x99, 0xAA, 0xAB, 0xCD, 0xFF, 0xFF, 0xCC, 0xBB, 0xA9, 0x98, 0x88, 0x88, - 0x99, 0xAB, 0xCF, 0xFF, 0xFC, 0xCB, 0xA9, 0x98, 0x77, 0x77, 0x77, 0x89, - 0xAB, 0xCE, 0xFF, 0xCD, 0xBA, 0x98, 0x77, 0x66, 0x66, 0x77, 0x89, 0xAB, - 0xDD, 0xFC, 0xCB, 0x98, 0x87, 0x65, 0x55, 0x56, 0x77, 0x8A, 0xBD, 0xFF, - 0xCC, 0xB9, 0x87, 0x65, 0x55, 0x55, 0x56, 0x78, 0x9A, 0xCD, 0xED, 0xCB, - 0x98, 0x76, 0x55, 0x44, 0x55, 0x67, 0x89, 0xAB, 0xDD, 0xCC, 0xB9, 0x87, - 0x65, 0x54, 0x45, 0x56, 0x78, 0x9A, 0xBD, 0xDD, 0xCB, 0xA8, 0x76, 0x55, - 0x55, 0x55, 0x67, 0x89, 0xAB, 0xCD, 0xED, 0xBA, 0x98, 0x76, 0x55, 0x55, - 0x66, 0x78, 0x9A, 0xBD, 0xCD, 0xFC, 0xB9, 0x87, 0x76, 0x66, 0x66, 0x78, - 0x99, 0xAB, 0xFD, 0xFF, 0xCB, 0xA9, 0x87, 0x77, 0x77, 0x78, 0x89, 0xAB, - 0xCD, 0xDF, 0xFD, 0xBB, 0xA9, 0x98, 0x88, 0x88, 0x89, 0xAB, 0xCC, 0xDD, - 0xFF, 0xDE, 0xCC, 0xAA, 0x99, 0x99, 0x99, 0xAA, 0xBC, 0xDD, 0xCF, 0xFF, - 0xDD, 0xCB, 0xBB, 0xBA, 0xAA, 0xBB, 0xBC, 0xCD, 0xED, 0xFF, 0xFF, 0xDD, - 0xDD, 0xCC, 0xBB, 0xCC, 0xCC, 0xCD, 0xDD, 0xDF, 0xFF, 0xFF, 0xFE, 0xED, - 0xDC, 0xCD, 0xED, 0xDE, 0xDF, 0xEE, 0xBF, 0xFF, 0xFF, 0xFE, 0xED, 0xDC, - 0xDD, 0xCC, 0xCC, 0xDD, 0xB0, 0x00, 0x00, 0x00, - ], - [ - 0xBD, 0xDD, 0xDC, 0xCC, 0xDC, 0xCD, 0xDD, 0xDE, 0xFF, 0xEF, 0xBE, 0xEE, - 0xDD, 0xDC, 0xCC, 0xCD, 0xDD, 0xDE, 0xFF, 0xFF, 0xFE, 0xDE, 0xDD, 0xCB, - 0xBB, 0xBB, 0xBB, 0xCC, 0xDE, 0xEF, 0xFF, 0xFD, 0xDD, 0xCB, 0xBA, 0xAA, - 0xAA, 0xAB, 0xBC, 0xCE, 0xFF, 0xFE, 0xCD, 0xDB, 0xBA, 0x99, 0x98, 0x99, - 0x9A, 0xAC, 0xDD, 0xFF, 0xFD, 0xDC, 0xBA, 0x99, 0x87, 0x77, 0x78, 0x99, - 0xBC, 0xDE, 0xEE, 0xDC, 0xBA, 0x98, 0x87, 0x76, 0x66, 0x78, 0x9A, 0xBC, - 0xDF, 0xFC, 0xDB, 0xA9, 0x87, 0x66, 0x55, 0x66, 0x78, 0x9A, 0xBD, 0xFE, - 0xCC, 0xBA, 0x98, 0x66, 0x55, 0x45, 0x56, 0x78, 0xAB, 0xCE, 0xDD, 0xCB, - 0xA8, 0x76, 0x55, 0x44, 0x45, 0x67, 0x8A, 0xBC, 0xDE, 0xDD, 0xBA, 0x87, - 0x65, 0x44, 0x44, 0x56, 0x78, 0x9B, 0xCD, 0xDD, 0xDB, 0xA9, 0x86, 0x55, - 0x44, 0x55, 0x67, 0x89, 0xBC, 0xDE, 0xDD, 0xCB, 0x98, 0x76, 0x55, 0x55, - 0x67, 0x89, 0xAB, 0xCD, 0xDE, 0xFC, 0xBA, 0x98, 0x76, 0x66, 0x67, 0x78, - 0x9A, 0xBC, 0xDD, 0xFF, 0xDC, 0xAA, 0x98, 0x77, 0x77, 0x88, 0x99, 0xAB, - 0xCD, 0xDE, 0xFE, 0xDB, 0xBA, 0x98, 0x88, 0x89, 0x9A, 0xAB, 0xCD, 0xDE, - 0xEF, 0xEE, 0xCC, 0xBA, 0xA9, 0x99, 0x9A, 0xAB, 0xCC, 0xED, 0xEF, 0xFF, - 0xFD, 0xDC, 0xBB, 0xBB, 0xBB, 0xBB, 0xCD, 0xDE, 0xEF, 0xFF, 0xFF, 0xFE, - 0xDD, 0xCD, 0xCC, 0xCC, 0xCC, 0xDE, 0xEF, 0xEF, 0xFF, 0xFF, 0xFE, 0xED, - 0xDD, 0xDD, 0xDD, 0xEE, 0xFF, 0xFE, 0xBF, 0xEE, 0xEE, 0xFE, 0xED, 0xDD, - 0xDD, 0xDD, 0xDE, 0xEE, 0xC0, 0x00, 0x00, 0x00, - ], - [ - 0x9C, 0xCB, 0xBB, 0xBA, 0xBA, 0xBB, 0xBB, 0xCC, 0xCD, 0xDE, 0xAC, 0xDD, - 0xCC, 0xBB, 0xBB, 0xBB, 0xBB, 0xBC, 0xCD, 0xEF, 0xFE, 0xCD, 0xCB, 0xBB, - 0xAA, 0xAA, 0xAA, 0xAA, 0xBB, 0xCD, 0xEF, 0xDB, 0xCB, 0xBA, 0xA9, 0x99, - 0x99, 0x99, 0x9A, 0xBB, 0xCD, 0xED, 0xBC, 0xBA, 0xA9, 0x88, 0x88, 0x88, - 0x89, 0x9A, 0xBB, 0xCD, 0xDB, 0xBA, 0xA9, 0x88, 0x77, 0x77, 0x77, 0x88, - 0x9A, 0xBC, 0xDC, 0xBB, 0xA9, 0x98, 0x77, 0x66, 0x66, 0x77, 0x89, 0x9A, - 0xBC, 0xCB, 0xBA, 0x98, 0x77, 0x66, 0x55, 0x66, 0x77, 0x89, 0xAB, 0xCC, - 0xBB, 0xA9, 0x87, 0x66, 0x55, 0x55, 0x66, 0x78, 0x9A, 0xBC, 0xBB, 0xBA, - 0x98, 0x76, 0x55, 0x54, 0x55, 0x67, 0x88, 0x9A, 0xBB, 0xBB, 0xA9, 0x87, - 0x65, 0x54, 0x45, 0x56, 0x78, 0x89, 0xAB, 0xBB, 0xBA, 0x98, 0x76, 0x65, - 0x55, 0x55, 0x67, 0x88, 0xAA, 0xBB, 0xBB, 0xA9, 0x87, 0x76, 0x65, 0x55, - 0x66, 0x78, 0x9A, 0xBC, 0xBB, 0xBA, 0xA9, 0x87, 0x76, 0x66, 0x66, 0x77, - 0x89, 0xAB, 0xCB, 0xCC, 0xBA, 0x98, 0x87, 0x77, 0x77, 0x78, 0x89, 0x9A, - 0xBC, 0xBC, 0xCB, 0xBA, 0x99, 0x88, 0x88, 0x88, 0x89, 0x9A, 0xBB, 0xCC, - 0xCD, 0xCB, 0xAA, 0x99, 0x98, 0x89, 0x99, 0x9A, 0xBB, 0xCD, 0xCC, 0xDD, - 0xCB, 0xBA, 0xAA, 0xA9, 0x9A, 0xAA, 0xBC, 0xCC, 0xDC, 0xDE, 0xED, 0xCC, - 0xBB, 0xBA, 0xAA, 0xAB, 0xBB, 0xCC, 0xCD, 0xCD, 0xFE, 0xED, 0xDC, 0xCC, - 0xBB, 0xCB, 0xCC, 0xCD, 0xDD, 0xEC, 0xAD, 0xDD, 0xCC, 0xCC, 0xBB, 0xBB, - 0xBB, 0xCB, 0xCC, 0xCC, 0xA0, 0x00, 0x00, 0x00, - ], - [ - 0x9B, 0xBA, 0xAA, 0xA9, 0xA9, 0x9A, 0xAA, 0xAB, 0xBB, 0xCC, 0xAB, 0xDC, - 0xBB, 0xAA, 0xAA, 0xAA, 0xAA, 0xAB, 0xBB, 0xCD, 0xED, 0xBB, 0xBB, 0xAA, - 0x99, 0x99, 0x99, 0x99, 0xAA, 0xBB, 0xCD, 0xCA, 0xBB, 0xA9, 0x99, 0x88, - 0x88, 0x88, 0x99, 0x9A, 0xBB, 0xDC, 0xAB, 0xAA, 0x98, 0x88, 0x77, 0x77, - 0x88, 0x89, 0x9A, 0xBB, 0xBA, 0xAA, 0x98, 0x88, 0x77, 0x77, 0x77, 0x78, - 0x89, 0xAB, 0xBB, 0xAA, 0x99, 0x87, 0x77, 0x66, 0x66, 0x67, 0x78, 0x89, - 0xAB, 0xBA, 0xA9, 0x88, 0x77, 0x66, 0x66, 0x66, 0x67, 0x78, 0x9A, 0xBB, - 0x9A, 0x98, 0x87, 0x66, 0x65, 0x56, 0x66, 0x77, 0x89, 0x9A, 0xA9, 0xA9, - 0x87, 0x76, 0x65, 0x55, 0x56, 0x67, 0x78, 0x99, 0xAA, 0xAA, 0x98, 0x77, - 0x66, 0x55, 0x55, 0x66, 0x77, 0x89, 0x9A, 0xAA, 0xA9, 0x87, 0x76, 0x66, - 0x55, 0x66, 0x67, 0x78, 0x99, 0xAA, 0xAA, 0x98, 0x87, 0x76, 0x66, 0x66, - 0x66, 0x78, 0x89, 0xAB, 0xAA, 0xA9, 0x98, 0x77, 0x66, 0x66, 0x66, 0x77, - 0x88, 0x9A, 0xBA, 0xAA, 0xA9, 0x88, 0x77, 0x77, 0x77, 0x77, 0x88, 0x99, - 0xAB, 0xBB, 0xBA, 0x99, 0x88, 0x77, 0x77, 0x77, 0x88, 0x99, 0xAB, 0xBB, - 0xBC, 0xBA, 0x99, 0x98, 0x88, 0x88, 0x88, 0x99, 0xAA, 0xBC, 0xBC, 0xCB, - 0xBA, 0xA9, 0x99, 0x99, 0x99, 0x99, 0xAA, 0xBB, 0xCB, 0xCD, 0xCB, 0xBB, - 0xAA, 0xA9, 0x99, 0xAA, 0xAA, 0xBB, 0xCC, 0xCD, 0xEC, 0xDC, 0xBB, 0xBB, - 0xAA, 0xAA, 0xBB, 0xBC, 0xCD, 0xDC, 0xAD, 0xCC, 0xCB, 0xBA, 0xAA, 0xAA, - 0xAA, 0xAB, 0xBB, 0xBC, 0xA0, 0x00, 0x00, 0x00, - ], - [ - 0xAB, 0xBA, 0xAA, 0x99, 0x99, 0x99, 0x99, 0xAA, 0xBB, 0xCC, 0xAB, 0xCB, - 0xBA, 0xAA, 0xA9, 0x99, 0x9A, 0xAA, 0xBB, 0xCC, 0xDC, 0xBC, 0xBA, 0xA9, - 0x99, 0x99, 0x89, 0x99, 0x9A, 0xAB, 0xCC, 0xCA, 0xBA, 0xA9, 0x98, 0x88, - 0x88, 0x88, 0x89, 0x9A, 0xAB, 0xCB, 0xAA, 0xA9, 0x98, 0x88, 0x77, 0x77, - 0x78, 0x89, 0x9A, 0xBB, 0xBA, 0xA9, 0x98, 0x87, 0x77, 0x77, 0x77, 0x78, - 0x89, 0x9A, 0xBA, 0x9A, 0x98, 0x87, 0x77, 0x66, 0x66, 0x67, 0x78, 0x89, - 0xAB, 0xA9, 0xA9, 0x88, 0x77, 0x66, 0x66, 0x66, 0x67, 0x78, 0x99, 0xAA, - 0x99, 0x98, 0x77, 0x66, 0x66, 0x66, 0x66, 0x77, 0x88, 0x9A, 0xA9, 0x99, - 0x87, 0x76, 0x66, 0x55, 0x56, 0x67, 0x78, 0x89, 0xAA, 0x99, 0x88, 0x77, - 0x66, 0x65, 0x56, 0x66, 0x77, 0x88, 0x9A, 0xA9, 0x99, 0x87, 0x76, 0x66, - 0x66, 0x66, 0x67, 0x78, 0x89, 0xAA, 0x9A, 0x98, 0x77, 0x66, 0x66, 0x66, - 0x66, 0x77, 0x89, 0x9A, 0xA9, 0xA9, 0x88, 0x77, 0x66, 0x66, 0x66, 0x77, - 0x88, 0x99, 0xAA, 0xAA, 0x99, 0x88, 0x77, 0x77, 0x77, 0x77, 0x88, 0x99, - 0xAB, 0xAA, 0xBA, 0x99, 0x88, 0x77, 0x77, 0x77, 0x88, 0x89, 0xAA, 0xBA, - 0xBB, 0xAA, 0x99, 0x88, 0x88, 0x88, 0x88, 0x99, 0x9A, 0xBB, 0xBB, 0xCB, - 0xAA, 0x99, 0x98, 0x88, 0x89, 0x99, 0xAA, 0xAB, 0xCB, 0xBC, 0xCB, 0xBA, - 0xA9, 0x99, 0x99, 0x99, 0xAA, 0xBB, 0xCD, 0xBC, 0xDC, 0xCB, 0xBA, 0xAA, - 0xAA, 0xAA, 0xAA, 0xBB, 0xCC, 0xDC, 0xAC, 0xCB, 0xBA, 0xAA, 0xAA, 0xAA, - 0xAA, 0xAA, 0xBB, 0xCC, 0xA0, 0x00, 0x00, 0x00, - ], - [ - 0x9B, 0xBA, 0xAA, 0xA9, 0x99, 0x99, 0x9A, 0xAA, 0xBB, 0xCC, 0xAB, 0xCC, - 0xBA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xBB, 0xCC, 0xDD, 0xAB, 0xBA, 0xAA, - 0x99, 0x99, 0x99, 0x99, 0xAA, 0xAB, 0xCD, 0xCA, 0xBA, 0xA9, 0x98, 0x88, - 0x88, 0x88, 0x99, 0x9A, 0xBB, 0xCB, 0xAB, 0xA9, 0x98, 0x88, 0x77, 0x77, - 0x88, 0x89, 0x9A, 0xBC, 0xBA, 0xBA, 0x98, 0x88, 0x77, 0x77, 0x77, 0x78, - 0x89, 0x9A, 0xBB, 0x9A, 0x99, 0x87, 0x77, 0x66, 0x66, 0x77, 0x78, 0x89, - 0xAB, 0xA9, 0xA9, 0x88, 0x77, 0x66, 0x66, 0x66, 0x67, 0x88, 0x9A, 0xAA, - 0x9A, 0x98, 0x77, 0x66, 0x66, 0x56, 0x66, 0x77, 0x89, 0xAA, 0xA9, 0xA9, - 0x87, 0x76, 0x65, 0x55, 0x56, 0x67, 0x78, 0x9A, 0xAA, 0x99, 0x98, 0x77, - 0x66, 0x55, 0x55, 0x66, 0x77, 0x89, 0x9A, 0xA9, 0xA9, 0x87, 0x76, 0x66, - 0x55, 0x66, 0x67, 0x78, 0x89, 0xAA, 0x9A, 0x98, 0x87, 0x76, 0x66, 0x66, - 0x67, 0x77, 0x89, 0xAA, 0xAA, 0xA9, 0x88, 0x77, 0x66, 0x66, 0x67, 0x77, - 0x88, 0x9A, 0xAA, 0xAA, 0xA9, 0x88, 0x77, 0x77, 0x77, 0x77, 0x88, 0x99, - 0xAB, 0xAB, 0xAA, 0x99, 0x88, 0x77, 0x77, 0x77, 0x88, 0x89, 0xAA, 0xBA, - 0xBB, 0xAA, 0x99, 0x88, 0x88, 0x88, 0x88, 0x99, 0xAA, 0xAC, 0xBB, 0xCB, - 0xAA, 0xA9, 0x99, 0x99, 0x99, 0x99, 0xAA, 0xBB, 0xCB, 0xBD, 0xCB, 0xBA, - 0xAA, 0x99, 0x99, 0x9A, 0xAA, 0xAB, 0xCD, 0xCD, 0xDC, 0xCB, 0xBB, 0xAA, - 0xAA, 0xAA, 0xBB, 0xBB, 0xCC, 0xDC, 0xAC, 0xCC, 0xBB, 0xAA, 0xAA, 0xAA, - 0xAA, 0xAA, 0xAB, 0xCC, 0xA0, 0x00, 0x00, 0x00, - ], - [ - 0x9B, 0xBB, 0xAA, 0xAA, 0xAA, 0xAA, 0xAB, 0xBB, 0xBC, 0xCC, 0x9B, 0xCC, - 0xCB, 0xBB, 0xAA, 0xAA, 0xAB, 0xBB, 0xCD, 0xDD, 0xED, 0xBC, 0xCB, 0xBA, - 0xAA, 0x99, 0x9A, 0xAA, 0xBB, 0xCC, 0xDD, 0xCB, 0xCB, 0xAA, 0x99, 0x99, - 0x89, 0x99, 0x9A, 0xAB, 0xCC, 0xDC, 0xBB, 0xBA, 0x99, 0x88, 0x88, 0x88, - 0x88, 0x9A, 0xAB, 0xCD, 0xCA, 0xBA, 0x99, 0x88, 0x77, 0x77, 0x77, 0x88, - 0x9A, 0xBB, 0xCC, 0xAB, 0xA9, 0x88, 0x77, 0x66, 0x66, 0x77, 0x88, 0x9A, - 0xBC, 0xBA, 0xAA, 0x98, 0x77, 0x66, 0x55, 0x66, 0x77, 0x89, 0xAB, 0xBB, - 0xAA, 0x99, 0x87, 0x66, 0x55, 0x55, 0x66, 0x78, 0x9A, 0xAB, 0xBA, 0xA9, - 0x98, 0x76, 0x55, 0x55, 0x55, 0x67, 0x88, 0x9A, 0xBB, 0xAA, 0x99, 0x87, - 0x65, 0x54, 0x45, 0x56, 0x78, 0x89, 0xAB, 0xBA, 0xBA, 0x98, 0x76, 0x65, - 0x55, 0x56, 0x67, 0x88, 0x9A, 0xBB, 0xAB, 0xA9, 0x87, 0x76, 0x65, 0x56, - 0x66, 0x78, 0x99, 0xAB, 0xBB, 0xBA, 0x99, 0x87, 0x76, 0x66, 0x66, 0x77, - 0x89, 0xAA, 0xBB, 0xBC, 0xBA, 0x98, 0x87, 0x77, 0x77, 0x77, 0x89, 0x9A, - 0xAB, 0xBB, 0xCB, 0xAA, 0x98, 0x88, 0x88, 0x88, 0x89, 0x9A, 0xAB, 0xCB, - 0xCC, 0xCB, 0xAA, 0x99, 0x98, 0x88, 0x99, 0x9A, 0xAB, 0xBC, 0xBC, 0xDC, - 0xCB, 0xAA, 0xA9, 0x99, 0x99, 0xAA, 0xAB, 0xBC, 0xDC, 0xCE, 0xDC, 0xCB, - 0xBB, 0xAA, 0xAA, 0xAA, 0xBB, 0xBC, 0xCD, 0xCD, 0xED, 0xDD, 0xCC, 0xCB, - 0xBB, 0xBB, 0xBB, 0xCC, 0xCD, 0xEC, 0xAD, 0xCC, 0xCC, 0xBB, 0xBB, 0xBB, - 0xBB, 0xBB, 0xBB, 0xCC, 0xA0, 0x00, 0x00, 0x00, - ], - [ - 0xCE, 0xFE, 0xED, 0xDD, 0xDD, 0xDD, 0xDD, 0xDE, 0xEE, 0xEE, 0xBF, 0xFF, - 0xFE, 0xFD, 0xDD, 0xDD, 0xDE, 0xEE, 0xFF, 0xFF, 0xFE, 0xFF, 0xFE, 0xED, - 0xCC, 0xCB, 0xCC, 0xCC, 0xDE, 0xEF, 0xFF, 0xEE, 0xFF, 0xEC, 0xCB, 0xBA, - 0xAA, 0xAB, 0xBC, 0xDD, 0xFF, 0xFE, 0xEF, 0xED, 0xCB, 0xAA, 0x99, 0x99, - 0xAA, 0xBC, 0xDE, 0xFF, 0xEE, 0xFD, 0xCB, 0xA9, 0x88, 0x88, 0x89, 0x9A, - 0xBC, 0xDE, 0xFF, 0xDE, 0xCB, 0xA9, 0x87, 0x76, 0x77, 0x78, 0x9A, 0xBD, - 0xEF, 0xED, 0xEC, 0xB9, 0x87, 0x66, 0x55, 0x66, 0x79, 0xAB, 0xCE, 0xFE, - 0xDD, 0xCA, 0x98, 0x76, 0x54, 0x45, 0x67, 0x89, 0xAC, 0xDE, 0xED, 0xDB, - 0xA9, 0x86, 0x54, 0x43, 0x45, 0x68, 0x9A, 0xCD, 0xEE, 0xDD, 0xBA, 0x98, - 0x75, 0x43, 0x34, 0x56, 0x79, 0xAB, 0xDE, 0xED, 0xDC, 0xB9, 0x87, 0x65, - 0x44, 0x55, 0x78, 0x9A, 0xCD, 0xEE, 0xDD, 0xCB, 0xA9, 0x76, 0x65, 0x55, - 0x67, 0x89, 0xBC, 0xDF, 0xED, 0xED, 0xBA, 0x98, 0x77, 0x66, 0x77, 0x89, - 0xAB, 0xCD, 0xFE, 0xDE, 0xEC, 0xBA, 0x99, 0x88, 0x78, 0x89, 0xAB, 0xBD, - 0xEF, 0xED, 0xFE, 0xDC, 0xBA, 0xA9, 0x99, 0x99, 0xAB, 0xBC, 0xDF, 0xFE, - 0xEF, 0xFE, 0xDC, 0xBB, 0xBA, 0xAA, 0xBB, 0xCD, 0xDE, 0xEF, 0xFD, 0xFE, - 0xEE, 0xDD, 0xCC, 0xCC, 0xCC, 0xDD, 0xDE, 0xFF, 0xFF, 0xEF, 0xFF, 0xEE, - 0xEE, 0xDD, 0xDD, 0xDD, 0xEE, 0xEF, 0xFF, 0xFE, 0xFF, 0xFF, 0xFF, 0xEE, - 0xFE, 0xEE, 0xEF, 0xFF, 0xFF, 0xFF, 0xAE, 0xEE, 0xEE, 0xEE, 0xDD, 0xDE, - 0xEF, 0xFE, 0xEE, 0xFF, 0xC0, 0x00, 0x00, 0x00, - ], - [ - 0xBE, 0xDC, 0xDC, 0xCC, 0xCB, 0xCB, 0xCC, 0xCC, 0xDD, 0xCD, 0xAD, 0xED, - 0xDD, 0xCC, 0xCC, 0xCC, 0xBC, 0xCD, 0xCE, 0xEF, 0xFE, 0xEE, 0xDC, 0xCB, - 0xBB, 0xBA, 0xAB, 0xBB, 0xCC, 0xDE, 0xDF, 0xDC, 0xDC, 0xCB, 0xAA, 0x99, - 0x99, 0x9A, 0xAB, 0xCD, 0xDE, 0xFD, 0xCD, 0xCB, 0xA9, 0x99, 0x88, 0x88, - 0x99, 0xAA, 0xBC, 0xEF, 0xDC, 0xDB, 0xAA, 0x98, 0x77, 0x77, 0x77, 0x89, - 0xAB, 0xCD, 0xDD, 0xCC, 0xBA, 0x98, 0x77, 0x66, 0x66, 0x77, 0x89, 0xAB, - 0xDE, 0xDC, 0xCB, 0x98, 0x77, 0x65, 0x55, 0x56, 0x77, 0x89, 0xBC, 0xDD, - 0xCC, 0xA9, 0x87, 0x65, 0x55, 0x55, 0x56, 0x78, 0x9B, 0xBC, 0xDB, 0xCA, - 0x98, 0x76, 0x55, 0x44, 0x55, 0x67, 0x89, 0xAC, 0xDD, 0xCB, 0xA9, 0x87, - 0x65, 0x54, 0x45, 0x56, 0x78, 0x9A, 0xBC, 0xDC, 0xBA, 0x98, 0x76, 0x65, - 0x55, 0x55, 0x67, 0x89, 0xAC, 0xDD, 0xCC, 0xBA, 0x88, 0x76, 0x55, 0x55, - 0x66, 0x78, 0x9A, 0xBD, 0xCC, 0xCB, 0xA9, 0x87, 0x76, 0x66, 0x66, 0x78, - 0x9A, 0xBC, 0xDC, 0xCD, 0xCB, 0xA9, 0x87, 0x77, 0x77, 0x78, 0x89, 0xAC, - 0xCE, 0xDC, 0xDD, 0xCA, 0xA9, 0x88, 0x88, 0x88, 0x99, 0xAB, 0xCD, 0xED, - 0xDD, 0xDC, 0xCB, 0xAA, 0x99, 0x99, 0x9A, 0xAC, 0xCD, 0xEE, 0xDD, 0xEF, - 0xDC, 0xCB, 0xBA, 0xAA, 0xAA, 0xBB, 0xCC, 0xED, 0xFD, 0xEE, 0xEE, 0xDD, - 0xDC, 0xCB, 0xBB, 0xBC, 0xCD, 0xDE, 0xEF, 0xED, 0xFF, 0xED, 0xED, 0xDD, - 0xDC, 0xCD, 0xDD, 0xEE, 0xEF, 0xFE, 0xAD, 0xED, 0xDD, 0xDD, 0xCD, 0xDC, - 0xDD, 0xDE, 0xED, 0xED, 0xB0, 0x00, 0x00, 0x00, - ], - [ - 0xCD, 0xDD, 0xCC, 0xCC, 0xBB, 0xBC, 0xCC, 0xCD, 0xDE, 0xEF, 0xCE, 0xFE, - 0xDD, 0xCC, 0xBB, 0xBB, 0xBB, 0xCC, 0xDE, 0xFF, 0xFF, 0xDE, 0xDC, 0xCB, - 0xBA, 0xAA, 0xAA, 0xAB, 0xBC, 0xCE, 0xFF, 0xED, 0xDC, 0xBB, 0xAA, 0x99, - 0x99, 0x99, 0xAA, 0xBC, 0xDE, 0xFE, 0xDD, 0xCB, 0xA9, 0x98, 0x88, 0x88, - 0x88, 0x9A, 0xBC, 0xDE, 0xEC, 0xCB, 0xA9, 0x88, 0x77, 0x77, 0x77, 0x88, - 0x9A, 0xBC, 0xDE, 0xCC, 0xB9, 0x98, 0x77, 0x66, 0x66, 0x67, 0x88, 0x9B, - 0xCD, 0xDC, 0xBA, 0x98, 0x76, 0x65, 0x55, 0x56, 0x67, 0x89, 0xAB, 0xDD, - 0xBB, 0xA9, 0x87, 0x65, 0x55, 0x55, 0x56, 0x78, 0x9A, 0xBC, 0xDB, 0xBA, - 0x98, 0x76, 0x55, 0x55, 0x55, 0x67, 0x78, 0xAB, 0xCC, 0xCB, 0xA9, 0x87, - 0x65, 0x55, 0x55, 0x56, 0x77, 0x8A, 0xBC, 0xCC, 0xBA, 0x98, 0x76, 0x55, - 0x55, 0x55, 0x67, 0x89, 0xAB, 0xCC, 0xCB, 0xA9, 0x87, 0x66, 0x55, 0x55, - 0x66, 0x78, 0x9A, 0xBC, 0xDC, 0xCB, 0xA9, 0x87, 0x66, 0x66, 0x66, 0x78, - 0x89, 0xAC, 0xDD, 0xDD, 0xBA, 0x98, 0x87, 0x77, 0x77, 0x78, 0x89, 0xAB, - 0xCD, 0xDD, 0xDC, 0xBA, 0x99, 0x88, 0x77, 0x88, 0x89, 0xAB, 0xBD, 0xDD, - 0xDE, 0xDC, 0xBA, 0x99, 0x98, 0x89, 0x99, 0xAB, 0xBC, 0xDE, 0xED, 0xFD, - 0xDC, 0xBB, 0xAA, 0xAA, 0xAA, 0xAB, 0xCC, 0xDE, 0xFE, 0xEF, 0xEE, 0xDC, - 0xCB, 0xBB, 0xBB, 0xBC, 0xCD, 0xDE, 0xFF, 0xFE, 0xFF, 0xEE, 0xDD, 0xDC, - 0xCC, 0xCC, 0xDD, 0xEE, 0xEF, 0xFF, 0xCF, 0xEE, 0xED, 0xDD, 0xDD, 0xCC, - 0xCD, 0xDD, 0xDF, 0xEE, 0xC0, 0x00, 0x00, 0x00, - ], - [ - 0xBD, 0xCC, 0xCC, 0xBB, 0xBB, 0xBC, 0xBC, 0xCC, 0xCC, 0xDD, 0xAC, 0xDD, - 0xDD, 0xCC, 0xCC, 0xBC, 0xBC, 0xCC, 0xDD, 0xDF, 0xFD, 0xDE, 0xEC, 0xCB, - 0xBB, 0xAA, 0xAA, 0xBB, 0xCC, 0xCD, 0xDE, 0xCC, 0xDD, 0xCB, 0xAA, 0xA9, - 0x99, 0x9A, 0xAB, 0xCC, 0xDD, 0xED, 0xCD, 0xBB, 0xAA, 0x99, 0x88, 0x88, - 0x99, 0xAA, 0xBC, 0xDD, 0xDB, 0xCB, 0xAA, 0x98, 0x87, 0x77, 0x78, 0x89, - 0xAB, 0xCC, 0xED, 0xBC, 0xBA, 0x98, 0x77, 0x66, 0x67, 0x77, 0x89, 0xAB, - 0xCD, 0xCB, 0xCB, 0xA9, 0x87, 0x66, 0x55, 0x66, 0x78, 0x9A, 0xBC, 0xDC, - 0xBC, 0xA9, 0x87, 0x66, 0x55, 0x55, 0x66, 0x78, 0x9A, 0xBC, 0xCB, 0xCA, - 0x98, 0x76, 0x55, 0x44, 0x45, 0x67, 0x89, 0xAB, 0xCC, 0xBB, 0xB9, 0x87, - 0x65, 0x44, 0x44, 0x56, 0x78, 0x9A, 0xBC, 0xCB, 0xCA, 0xA8, 0x76, 0x65, - 0x44, 0x56, 0x67, 0x89, 0xAB, 0xCC, 0xCC, 0xBA, 0x98, 0x76, 0x65, 0x56, - 0x67, 0x78, 0x9A, 0xBD, 0xCC, 0xCB, 0xA9, 0x87, 0x76, 0x66, 0x67, 0x78, - 0x9A, 0xBC, 0xDC, 0xCD, 0xBB, 0xA9, 0x88, 0x77, 0x77, 0x78, 0x9A, 0xAB, - 0xCD, 0xCC, 0xDC, 0xBB, 0xA9, 0x98, 0x88, 0x88, 0x99, 0xAB, 0xCD, 0xDC, - 0xCD, 0xDC, 0xBB, 0xAA, 0x99, 0x99, 0x9A, 0xAB, 0xBC, 0xCD, 0xCC, 0xED, - 0xDC, 0xCB, 0xBB, 0xAA, 0xAA, 0xBB, 0xCC, 0xDD, 0xDD, 0xDE, 0xDD, 0xDD, - 0xCC, 0xBB, 0xBB, 0xCC, 0xCC, 0xCD, 0xDF, 0xDD, 0xFF, 0xED, 0xDD, 0xDC, - 0xCC, 0xCD, 0xDD, 0xEE, 0xEE, 0xFD, 0xAD, 0xDC, 0xDC, 0xCC, 0xCC, 0xBC, - 0xCC, 0xCC, 0xDC, 0xDE, 0xB0, 0x00, 0x00, 0x00, - ], - [ - 0xAE, 0xED, 0xDD, 0xDD, 0xDD, 0xDC, 0xDD, 0xDD, 0xDD, 0xDD, 0x9E, 0xFF, - 0xFF, 0xED, 0xED, 0xDD, 0xEE, 0xEF, 0xFE, 0xFF, 0xFD, 0xDF, 0xEE, 0xDD, - 0xDD, 0xDD, 0xDD, 0xDD, 0xEF, 0xFE, 0xFF, 0xED, 0xFE, 0xDD, 0xCC, 0xCB, - 0xBC, 0xCC, 0xDE, 0xEE, 0xEE, 0xFE, 0xDF, 0xDD, 0xCB, 0xBA, 0xAA, 0xAB, - 0xBC, 0xDD, 0xDF, 0xEF, 0xED, 0xED, 0xDB, 0xBA, 0x99, 0x88, 0x99, 0xAB, - 0xCD, 0xEF, 0xFD, 0xDE, 0xDC, 0xBA, 0x98, 0x77, 0x77, 0x89, 0xAB, 0xDD, - 0xFF, 0xDD, 0xED, 0xBA, 0x98, 0x76, 0x55, 0x67, 0x89, 0xBC, 0xDD, 0xFE, - 0xDE, 0xCB, 0xA9, 0x76, 0x54, 0x45, 0x67, 0x9A, 0xCD, 0xEF, 0xED, 0xED, - 0xCA, 0x87, 0x54, 0x33, 0x45, 0x78, 0xAB, 0xCE, 0xED, 0xDE, 0xDB, 0xA8, - 0x75, 0x43, 0x24, 0x57, 0x8A, 0xBC, 0xDE, 0xED, 0xED, 0xCA, 0x97, 0x65, - 0x44, 0x46, 0x78, 0xAC, 0xCD, 0xED, 0xDE, 0xDD, 0xBA, 0x87, 0x65, 0x56, - 0x68, 0x9A, 0xBD, 0xEF, 0xDD, 0xFE, 0xDC, 0xA9, 0x87, 0x77, 0x78, 0x8A, - 0xBC, 0xDE, 0xEE, 0xEF, 0xFD, 0xDB, 0xAA, 0x98, 0x88, 0x9A, 0xAB, 0xCD, - 0xFF, 0xDD, 0xFE, 0xED, 0xCB, 0xBA, 0xAA, 0xAA, 0xBB, 0xCD, 0xDF, 0xFE, - 0xDF, 0xFE, 0xED, 0xDC, 0xCB, 0xBB, 0xBC, 0xCC, 0xDE, 0xFF, 0xEE, 0xFF, - 0xFF, 0xFE, 0xDD, 0xCD, 0xDD, 0xDD, 0xEF, 0xEF, 0xFE, 0xFF, 0xFF, 0xFE, - 0xFE, 0xEE, 0xED, 0xEE, 0xEE, 0xFF, 0xFF, 0xEF, 0xFF, 0xFF, 0xFF, 0xEF, - 0xFE, 0xEF, 0xFE, 0xFF, 0xFF, 0xFE, 0xAD, 0xDD, 0xDD, 0xDD, 0xED, 0xDE, - 0xDE, 0xEE, 0xDD, 0xEE, 0xB0, 0x00, 0x00, 0x00, - ], - [ - 0xBD, 0xDC, 0xCB, 0xBB, 0xAA, 0xAB, 0xBB, 0xBC, 0xCD, 0xCD, 0xAD, 0xED, - 0xCC, 0xBB, 0xAA, 0xBA, 0xAB, 0xBC, 0xCD, 0xDF, 0xFD, 0xDD, 0xCC, 0xBB, - 0xAA, 0xA9, 0x9A, 0xAA, 0xBB, 0xCD, 0xEE, 0xDC, 0xDB, 0xBA, 0xA9, 0x99, - 0x99, 0x99, 0x9A, 0xAB, 0xCD, 0xDD, 0xBC, 0xBA, 0xA9, 0x88, 0x88, 0x88, - 0x89, 0x9A, 0xBB, 0xCD, 0xCB, 0xBA, 0xA9, 0x88, 0x77, 0x77, 0x77, 0x88, - 0x9A, 0xBB, 0xCC, 0xBB, 0xA9, 0x88, 0x77, 0x66, 0x66, 0x77, 0x89, 0x9A, - 0xBC, 0xCB, 0xBA, 0x98, 0x77, 0x66, 0x55, 0x66, 0x77, 0x89, 0xAB, 0xCC, - 0xBB, 0xA9, 0x87, 0x66, 0x55, 0x55, 0x66, 0x78, 0x9A, 0xAC, 0xCA, 0xA9, - 0x98, 0x76, 0x55, 0x44, 0x55, 0x67, 0x88, 0x9A, 0xBB, 0xAB, 0xA9, 0x87, - 0x65, 0x54, 0x45, 0x56, 0x78, 0x99, 0xAB, 0xBB, 0xBA, 0x98, 0x76, 0x65, - 0x55, 0x56, 0x67, 0x89, 0x9A, 0xBB, 0xBB, 0xA9, 0x87, 0x76, 0x65, 0x55, - 0x67, 0x78, 0x9A, 0xAC, 0xBB, 0xBA, 0x98, 0x87, 0x76, 0x66, 0x67, 0x78, - 0x89, 0xAB, 0xCC, 0xBC, 0xBA, 0x98, 0x87, 0x77, 0x77, 0x78, 0x89, 0x9A, - 0xBC, 0xCC, 0xCB, 0xAA, 0x99, 0x88, 0x88, 0x88, 0x89, 0x9A, 0xBB, 0xCC, - 0xCD, 0xCB, 0xAA, 0x99, 0x98, 0x99, 0x99, 0xAA, 0xBC, 0xCD, 0xCC, 0xDD, - 0xCB, 0xBA, 0xAA, 0x99, 0x9A, 0xAA, 0xBB, 0xCD, 0xDD, 0xCE, 0xDD, 0xCC, - 0xBB, 0xBA, 0xAA, 0xBB, 0xBC, 0xCD, 0xEE, 0xDD, 0xFD, 0xED, 0xCC, 0xCC, - 0xBC, 0xBC, 0xCC, 0xDD, 0xEE, 0xFE, 0x9D, 0xDD, 0xCC, 0xCC, 0xBB, 0xBB, - 0xBC, 0xCC, 0xDD, 0xEE, 0xB0, 0x00, 0x00, 0x00, - ], - [ - 0x9B, 0xBA, 0xAA, 0xAA, 0x99, 0x99, 0xAA, 0xAA, 0xBB, 0xCC, 0x9B, 0xDC, - 0xBB, 0xAA, 0xAA, 0xAA, 0xAA, 0xAB, 0xBC, 0xCC, 0xDC, 0xBB, 0xBB, 0xAA, - 0x99, 0x99, 0x99, 0x9A, 0xAA, 0xBB, 0xCD, 0xCA, 0xBB, 0xA9, 0x99, 0x88, - 0x88, 0x88, 0x99, 0xAA, 0xBC, 0xDC, 0xAB, 0xA9, 0x98, 0x88, 0x77, 0x78, - 0x88, 0x89, 0xAA, 0xBC, 0xBA, 0xBA, 0x98, 0x87, 0x77, 0x77, 0x77, 0x78, - 0x99, 0xAB, 0xBB, 0x9A, 0x99, 0x87, 0x77, 0x66, 0x66, 0x77, 0x78, 0x9A, - 0xAB, 0xBA, 0xA9, 0x88, 0x77, 0x66, 0x66, 0x66, 0x77, 0x88, 0x9A, 0xBA, - 0x9A, 0x98, 0x77, 0x66, 0x65, 0x56, 0x66, 0x77, 0x89, 0xAB, 0xAA, 0xA9, - 0x87, 0x76, 0x65, 0x55, 0x56, 0x67, 0x78, 0x9A, 0xAA, 0x9A, 0x98, 0x77, - 0x66, 0x55, 0x45, 0x66, 0x77, 0x89, 0xAB, 0xA9, 0xA9, 0x87, 0x76, 0x66, - 0x55, 0x56, 0x67, 0x78, 0x9A, 0xAA, 0xAA, 0x98, 0x87, 0x76, 0x66, 0x66, - 0x66, 0x77, 0x89, 0xAB, 0xAA, 0xA9, 0x98, 0x77, 0x76, 0x66, 0x66, 0x77, - 0x89, 0x9A, 0xBA, 0xAB, 0xA9, 0x98, 0x77, 0x77, 0x77, 0x77, 0x88, 0x9A, - 0xAB, 0xBB, 0xBA, 0xA9, 0x88, 0x87, 0x77, 0x78, 0x88, 0x99, 0xAB, 0xBB, - 0xBB, 0xBA, 0xA9, 0x98, 0x88, 0x88, 0x88, 0x99, 0xAB, 0xBC, 0xBB, 0xCC, - 0xBA, 0xA9, 0x99, 0x99, 0x99, 0x99, 0xAA, 0xBC, 0xCC, 0xCC, 0xCC, 0xBB, - 0xAA, 0xAA, 0xAA, 0xAA, 0xAB, 0xBC, 0xCD, 0xCC, 0xDD, 0xDC, 0xCB, 0xBB, - 0xAA, 0xAB, 0xBB, 0xBC, 0xCC, 0xDD, 0x9C, 0xCB, 0xBB, 0xBA, 0xAA, 0xAA, - 0xAA, 0xBB, 0xBB, 0xCC, 0xA0, 0x00, 0x00, 0x00, - ], - [ - 0x9B, 0xAA, 0xA9, 0x99, 0x99, 0x99, 0x99, 0xAA, 0xAB, 0xBC, 0xAB, 0xCB, - 0xBA, 0xAA, 0x99, 0x99, 0x99, 0xAA, 0xAB, 0xCC, 0xCC, 0xAB, 0xBA, 0xA9, - 0x99, 0x88, 0x89, 0x99, 0x9A, 0xAB, 0xBC, 0xBA, 0xBA, 0xA9, 0x98, 0x88, - 0x88, 0x88, 0x89, 0x9A, 0xAB, 0xCB, 0xAA, 0xA9, 0x98, 0x87, 0x77, 0x77, - 0x78, 0x89, 0x9A, 0xAB, 0xB9, 0xA9, 0x98, 0x87, 0x77, 0x77, 0x77, 0x78, - 0x89, 0x9A, 0xBA, 0x9A, 0x98, 0x87, 0x77, 0x66, 0x66, 0x67, 0x78, 0x89, - 0xAA, 0xA9, 0x99, 0x87, 0x77, 0x66, 0x66, 0x66, 0x77, 0x78, 0x99, 0xAA, - 0x99, 0x98, 0x77, 0x66, 0x66, 0x66, 0x66, 0x77, 0x88, 0x9A, 0xA9, 0x98, - 0x87, 0x76, 0x66, 0x55, 0x66, 0x67, 0x78, 0x89, 0xAA, 0x99, 0x88, 0x77, - 0x66, 0x65, 0x56, 0x66, 0x77, 0x88, 0x9A, 0xA9, 0x99, 0x87, 0x76, 0x66, - 0x66, 0x66, 0x67, 0x78, 0x89, 0xAA, 0x99, 0x98, 0x77, 0x66, 0x66, 0x66, - 0x66, 0x77, 0x89, 0x9A, 0xA9, 0xA9, 0x88, 0x77, 0x66, 0x66, 0x66, 0x77, - 0x88, 0x9A, 0xAA, 0xAA, 0x99, 0x88, 0x77, 0x77, 0x77, 0x77, 0x88, 0x99, - 0xAB, 0xAA, 0xBA, 0x99, 0x88, 0x77, 0x77, 0x77, 0x88, 0x89, 0xAA, 0xBA, - 0xAB, 0xAA, 0x99, 0x88, 0x88, 0x88, 0x88, 0x99, 0xAA, 0xBB, 0xBB, 0xBB, - 0xAA, 0x99, 0x98, 0x88, 0x89, 0x99, 0xAA, 0xBB, 0xCB, 0xBC, 0xCB, 0xAA, - 0xA9, 0x99, 0x99, 0x9A, 0xAA, 0xBB, 0xCC, 0xBC, 0xDC, 0xCB, 0xBA, 0xAA, - 0xAA, 0xAA, 0xAB, 0xBB, 0xCC, 0xDC, 0xAC, 0xBB, 0xBA, 0xAA, 0xAA, 0x9A, - 0xAA, 0xAA, 0xBB, 0xBC, 0xA0, 0x00, 0x00, 0x00, - ], - [ - 0x9B, 0xBA, 0xA9, 0xA9, 0x99, 0x99, 0x99, 0xAA, 0xAB, 0xBB, 0x9B, 0xCC, - 0xBB, 0xAA, 0xA9, 0x99, 0xAA, 0xAA, 0xBB, 0xBC, 0xDC, 0xBC, 0xBA, 0xAA, - 0x99, 0x99, 0x99, 0x99, 0xAA, 0xAB, 0xCC, 0xBA, 0xBA, 0xA9, 0x99, 0x88, - 0x88, 0x88, 0x89, 0x9A, 0xAB, 0xCB, 0xAB, 0xA9, 0x98, 0x88, 0x77, 0x77, - 0x88, 0x89, 0x9A, 0xBB, 0xBA, 0xAA, 0x98, 0x87, 0x77, 0x77, 0x77, 0x78, - 0x89, 0x9A, 0xBA, 0x9A, 0x98, 0x87, 0x77, 0x66, 0x66, 0x77, 0x78, 0x89, - 0xAB, 0xA9, 0xA9, 0x88, 0x77, 0x66, 0x66, 0x66, 0x77, 0x88, 0x9A, 0xAA, - 0x9A, 0x98, 0x77, 0x66, 0x66, 0x56, 0x66, 0x77, 0x89, 0x9A, 0xA9, 0x99, - 0x87, 0x76, 0x65, 0x55, 0x56, 0x67, 0x78, 0x99, 0xAA, 0x99, 0x98, 0x77, - 0x66, 0x55, 0x55, 0x66, 0x77, 0x89, 0x9A, 0xA9, 0x99, 0x87, 0x76, 0x66, - 0x55, 0x66, 0x67, 0x78, 0x99, 0xAA, 0x9A, 0x98, 0x87, 0x76, 0x66, 0x66, - 0x67, 0x78, 0x89, 0xAA, 0xA9, 0xA9, 0x88, 0x77, 0x66, 0x66, 0x67, 0x77, - 0x88, 0x9A, 0xAA, 0xAA, 0xA9, 0x88, 0x77, 0x77, 0x77, 0x77, 0x88, 0x99, - 0xAB, 0xBA, 0xBA, 0x99, 0x88, 0x87, 0x77, 0x77, 0x88, 0x99, 0xAA, 0xBB, - 0xAB, 0xAA, 0x99, 0x88, 0x88, 0x88, 0x88, 0x99, 0xAA, 0xBB, 0xBB, 0xCB, - 0xBA, 0xA9, 0x99, 0x99, 0x99, 0x99, 0xAA, 0xBB, 0xCB, 0xBC, 0xCB, 0xAA, - 0xAA, 0x99, 0x99, 0xAA, 0xAA, 0xBB, 0xCC, 0xBB, 0xCC, 0xCB, 0xBB, 0xAA, - 0xAA, 0xAA, 0xAB, 0xBC, 0xCC, 0xDC, 0x9C, 0xBB, 0xBA, 0xAA, 0xAA, 0xAA, - 0xAA, 0xAA, 0xBB, 0xBC, 0xA0, 0x00, 0x00, 0x00, - ], - [ - 0xAD, 0xCC, 0xCC, 0xCC, 0xCB, 0xBB, 0xBC, 0xBC, 0xCC, 0xDC, 0x9D, 0xED, - 0xED, 0xCC, 0xCC, 0xCC, 0xCC, 0xCD, 0xDD, 0xEE, 0xED, 0xDF, 0xDD, 0xCC, - 0xBB, 0xBB, 0xBB, 0xBB, 0xCD, 0xDD, 0xEE, 0xDC, 0xDD, 0xCB, 0xBA, 0xAA, - 0xAA, 0xAA, 0xBB, 0xCC, 0xDE, 0xEC, 0xCC, 0xCB, 0xBA, 0x99, 0x99, 0x99, - 0x9A, 0xAB, 0xCC, 0xDE, 0xCC, 0xCC, 0xBA, 0x99, 0x88, 0x88, 0x88, 0x9A, - 0xAB, 0xCD, 0xDC, 0xCC, 0xBA, 0x99, 0x87, 0x77, 0x77, 0x88, 0x9A, 0xBB, - 0xCD, 0xCC, 0xCB, 0xA9, 0x87, 0x66, 0x56, 0x67, 0x88, 0xAA, 0xBC, 0xDC, - 0xBC, 0xBA, 0x98, 0x76, 0x54, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xCB, 0xCB, - 0xA9, 0x87, 0x54, 0x33, 0x45, 0x78, 0x9A, 0xBC, 0xDC, 0xBC, 0xBA, 0x98, - 0x76, 0x43, 0x34, 0x56, 0x89, 0xAB, 0xCD, 0xCC, 0xCB, 0xA9, 0x87, 0x65, - 0x44, 0x56, 0x78, 0x9A, 0xBC, 0xCC, 0xCD, 0xBA, 0x99, 0x87, 0x65, 0x56, - 0x67, 0x89, 0xAB, 0xCD, 0xCC, 0xCC, 0xBA, 0x98, 0x87, 0x76, 0x77, 0x88, - 0x9A, 0xBC, 0xDC, 0xCD, 0xCC, 0xAA, 0x98, 0x88, 0x88, 0x88, 0x9A, 0xBB, - 0xCD, 0xDC, 0xDC, 0xBB, 0xAA, 0x99, 0x99, 0x99, 0x9A, 0xAB, 0xCD, 0xDC, - 0xCE, 0xDD, 0xCB, 0xBA, 0xAA, 0xAA, 0xAA, 0xBB, 0xCD, 0xDE, 0xDD, 0xDD, - 0xDD, 0xCC, 0xBB, 0xBB, 0xBB, 0xBC, 0xCD, 0xDD, 0xED, 0xDF, 0xEE, 0xDD, - 0xDC, 0xCB, 0xCC, 0xCC, 0xCC, 0xEE, 0xEF, 0xDD, 0xEE, 0xEE, 0xED, 0xDD, - 0xCD, 0xCD, 0xDE, 0xEE, 0xEE, 0xFE, 0x9D, 0xCD, 0xCD, 0xCC, 0xCC, 0xCC, - 0xCC, 0xDD, 0xDD, 0xDE, 0xB0, 0x00, 0x00, 0x00, - ], - [ - 0xCF, 0xFF, 0xFE, 0xFF, 0xEE, 0xDE, 0xDE, 0xEF, 0xEE, 0xEE, 0xAF, 0xFF, - 0xFF, 0xFE, 0xEE, 0xED, 0xEF, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, - 0xDD, 0xCD, 0xCC, 0xDE, 0xEF, 0xFF, 0xFF, 0xEF, 0xFF, 0xEE, 0xDC, 0xBB, - 0xBB, 0xBB, 0xCD, 0xDE, 0xFF, 0xFF, 0xFF, 0xFD, 0xCB, 0xBA, 0x99, 0x9A, - 0xAB, 0xCD, 0xFE, 0xFF, 0xFF, 0xFE, 0xCB, 0xA9, 0x98, 0x88, 0x89, 0x9B, - 0xCD, 0xEF, 0xFE, 0xFF, 0xDC, 0xB9, 0x87, 0x76, 0x77, 0x78, 0xAB, 0xCD, - 0xEF, 0xFE, 0xED, 0xBA, 0x97, 0x66, 0x55, 0x67, 0x79, 0xAB, 0xDE, 0xFF, - 0xEF, 0xCB, 0x98, 0x76, 0x54, 0x45, 0x67, 0x89, 0xBC, 0xEF, 0xFE, 0xEC, - 0xB9, 0x86, 0x54, 0x33, 0x45, 0x68, 0x9B, 0xCE, 0xFF, 0xFE, 0xCB, 0x98, - 0x75, 0x43, 0x34, 0x56, 0x89, 0xBC, 0xEF, 0xFE, 0xED, 0xB9, 0x87, 0x65, - 0x44, 0x55, 0x78, 0x9B, 0xCE, 0xFF, 0xFF, 0xDB, 0xA9, 0x87, 0x65, 0x55, - 0x67, 0x8A, 0xBD, 0xFF, 0xFF, 0xED, 0xCB, 0x98, 0x87, 0x66, 0x77, 0x89, - 0xAC, 0xEF, 0xFF, 0xFF, 0xED, 0xCB, 0x99, 0x88, 0x88, 0x89, 0xAB, 0xCE, - 0xEF, 0xFE, 0xFF, 0xDD, 0xCB, 0xA9, 0x99, 0x9A, 0xAB, 0xCD, 0xFF, 0xFF, - 0xFF, 0xFF, 0xED, 0xCB, 0xBB, 0xBB, 0xBC, 0xDD, 0xEF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xEE, 0xDC, 0xCC, 0xCC, 0xDD, 0xFF, 0xFF, 0xFF, 0xEF, 0xFF, 0xFF, - 0xEE, 0xEE, 0xDE, 0xDE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x9F, 0xFF, 0xFF, 0xEE, 0xFE, 0xEF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0x00, 0x00, 0x00, - ], - [ - 0xCE, 0xDD, 0xDD, 0xCC, 0xCC, 0xCC, 0xCC, 0xCD, 0xDD, 0xDD, 0x9E, 0xEE, - 0xDD, 0xCC, 0xCC, 0xBB, 0xBC, 0xCD, 0xDE, 0xFF, 0xFE, 0xEF, 0xDD, 0xCC, - 0xBA, 0xAA, 0xAA, 0xBB, 0xCC, 0xDE, 0xFF, 0xDD, 0xEC, 0xCB, 0xAA, 0x99, - 0x99, 0x9A, 0xAB, 0xCC, 0xDE, 0xED, 0xDD, 0xCB, 0xAA, 0x98, 0x88, 0x88, - 0x89, 0xAB, 0xBC, 0xDF, 0xEC, 0xDB, 0xA9, 0x98, 0x77, 0x77, 0x77, 0x89, - 0xAB, 0xCD, 0xED, 0xCC, 0xBA, 0x98, 0x77, 0x66, 0x66, 0x77, 0x89, 0xAB, - 0xCE, 0xEC, 0xCA, 0x98, 0x77, 0x65, 0x55, 0x66, 0x77, 0x8A, 0xBC, 0xDD, - 0xCC, 0xA9, 0x87, 0x65, 0x55, 0x55, 0x56, 0x78, 0x9A, 0xCD, 0xDC, 0xBA, - 0x98, 0x76, 0x55, 0x44, 0x55, 0x67, 0x89, 0xAC, 0xDD, 0xBB, 0xA9, 0x87, - 0x65, 0x54, 0x45, 0x56, 0x78, 0x9A, 0xBD, 0xDC, 0xCA, 0x98, 0x76, 0x55, - 0x55, 0x55, 0x67, 0x89, 0xAC, 0xDD, 0xCC, 0xBA, 0x88, 0x76, 0x55, 0x55, - 0x66, 0x78, 0x9B, 0xCD, 0xDC, 0xDB, 0xA9, 0x87, 0x76, 0x66, 0x66, 0x78, - 0x9A, 0xBC, 0xDD, 0xDD, 0xCB, 0xA9, 0x87, 0x77, 0x77, 0x78, 0x89, 0xBC, - 0xDE, 0xED, 0xED, 0xCA, 0xA9, 0x88, 0x88, 0x88, 0x99, 0xAB, 0xCD, 0xDD, - 0xDE, 0xDC, 0xCB, 0xA9, 0x99, 0x99, 0x9A, 0xAB, 0xCC, 0xDE, 0xFD, 0xFE, - 0xDC, 0xBB, 0xBB, 0xAA, 0xAA, 0xBC, 0xCC, 0xDE, 0xFE, 0xDF, 0xEE, 0xDD, - 0xDC, 0xCC, 0xCC, 0xCC, 0xCD, 0xEE, 0xFF, 0xED, 0xFE, 0xFE, 0xED, 0xDD, - 0xCD, 0xDD, 0xDE, 0xFE, 0xFF, 0xFF, 0xAE, 0xEE, 0xED, 0xDD, 0xDD, 0xDD, - 0xDD, 0xEE, 0xFE, 0xEF, 0xD0, 0x00, 0x00, 0x00, - ], - [ - 0xDE, 0xDD, 0xDC, 0xCC, 0xBB, 0xBB, 0xCC, 0xCD, 0xDE, 0xEE, 0xBE, 0xEE, - 0xDD, 0xCC, 0xBB, 0xBB, 0xBB, 0xCD, 0xDE, 0xEF, 0xFE, 0xDE, 0xDC, 0xCB, - 0xBA, 0xAA, 0xAA, 0xAB, 0xBC, 0xDD, 0xEF, 0xED, 0xDC, 0xCB, 0xAA, 0x99, - 0x99, 0x99, 0xAA, 0xBC, 0xDE, 0xEE, 0xDC, 0xCB, 0xA9, 0x98, 0x88, 0x88, - 0x89, 0x9A, 0xBC, 0xDE, 0xEC, 0xCB, 0xA9, 0x88, 0x77, 0x77, 0x77, 0x89, - 0x9A, 0xBC, 0xDD, 0xCC, 0xBA, 0x98, 0x76, 0x66, 0x66, 0x67, 0x89, 0xAB, - 0xCD, 0xDC, 0xBA, 0x98, 0x76, 0x65, 0x55, 0x56, 0x67, 0x89, 0xAB, 0xDD, - 0xCB, 0xA9, 0x87, 0x65, 0x55, 0x55, 0x56, 0x78, 0x9A, 0xBC, 0xDB, 0xBA, - 0x98, 0x76, 0x55, 0x55, 0x55, 0x67, 0x89, 0xAB, 0xDC, 0xCB, 0xA9, 0x87, - 0x65, 0x55, 0x45, 0x56, 0x78, 0x9A, 0xBC, 0xCC, 0xBA, 0x98, 0x76, 0x55, - 0x55, 0x55, 0x67, 0x89, 0xAB, 0xCD, 0xCC, 0xA9, 0x87, 0x66, 0x55, 0x55, - 0x66, 0x78, 0x9A, 0xBD, 0xDC, 0xCB, 0xA9, 0x87, 0x66, 0x66, 0x66, 0x78, - 0x99, 0xAC, 0xDD, 0xDC, 0xBA, 0x99, 0x87, 0x77, 0x77, 0x78, 0x89, 0xAB, - 0xCD, 0xDD, 0xDC, 0xBA, 0x99, 0x88, 0x88, 0x88, 0x99, 0xAB, 0xCD, 0xEE, - 0xDE, 0xDC, 0xBA, 0xA9, 0x99, 0x99, 0x99, 0xAB, 0xBC, 0xDE, 0xEE, 0xED, - 0xDC, 0xBB, 0xAA, 0xAA, 0xAA, 0xAB, 0xBC, 0xDE, 0xFE, 0xDF, 0xEE, 0xDC, - 0xCB, 0xBB, 0xBB, 0xBC, 0xCC, 0xDE, 0xFF, 0xFE, 0xFF, 0xEE, 0xED, 0xDC, - 0xCC, 0xCC, 0xDD, 0xEE, 0xFF, 0xFF, 0xBF, 0xEE, 0xDD, 0xDD, 0xDC, 0xDD, - 0xDD, 0xDE, 0xEF, 0xFF, 0xE0, 0x00, 0x00, 0x00, - ], - [ - 0xDF, 0xEE, 0xDD, 0xDD, 0xCC, 0xDD, 0xCD, 0xDE, 0xEF, 0xFE, 0xAF, 0xFF, - 0xFD, 0xDC, 0xCC, 0xCC, 0xCC, 0xED, 0xEE, 0xFF, 0xFF, 0xFF, 0xDD, 0xCC, - 0xBB, 0xAA, 0xBB, 0xBB, 0xCD, 0xEE, 0xFF, 0xFE, 0xED, 0xCB, 0xAA, 0xA9, - 0x99, 0x9A, 0xAB, 0xCD, 0xEE, 0xFE, 0xDD, 0xCB, 0xA9, 0x98, 0x88, 0x88, - 0x99, 0xAB, 0xCD, 0xEF, 0xED, 0xDC, 0xAA, 0x98, 0x77, 0x77, 0x77, 0x89, - 0xAB, 0xCD, 0xFD, 0xDD, 0xBA, 0x98, 0x77, 0x66, 0x66, 0x77, 0x89, 0xAB, - 0xCF, 0xEC, 0xCB, 0xA8, 0x77, 0x65, 0x55, 0x56, 0x77, 0x8A, 0xBC, 0xDE, - 0xCC, 0xA9, 0x87, 0x65, 0x55, 0x55, 0x56, 0x78, 0x9A, 0xCE, 0xDC, 0xCA, - 0x98, 0x76, 0x55, 0x44, 0x55, 0x67, 0x89, 0xAC, 0xDD, 0xCC, 0xA9, 0x87, - 0x65, 0x54, 0x45, 0x56, 0x78, 0x9A, 0xCD, 0xDC, 0xCA, 0x98, 0x76, 0x55, - 0x55, 0x55, 0x67, 0x89, 0xAC, 0xDD, 0xDC, 0xBA, 0x87, 0x76, 0x55, 0x55, - 0x66, 0x78, 0x9B, 0xCD, 0xDD, 0xDC, 0xA9, 0x87, 0x76, 0x66, 0x66, 0x78, - 0x9A, 0xBC, 0xDE, 0xDE, 0xCB, 0xA9, 0x87, 0x77, 0x77, 0x78, 0x99, 0xBB, - 0xCD, 0xED, 0xED, 0xCB, 0xA9, 0x98, 0x88, 0x88, 0x99, 0xAB, 0xCD, 0xEE, - 0xEE, 0xED, 0xCB, 0xAA, 0x99, 0x99, 0x9A, 0xAB, 0xCD, 0xEF, 0xED, 0xFF, - 0xDD, 0xCB, 0xBB, 0xAA, 0xAA, 0xBC, 0xCD, 0xDE, 0xFF, 0xEF, 0xFF, 0xFD, - 0xDC, 0xCB, 0xBC, 0xCC, 0xDD, 0xEF, 0xFF, 0xFE, 0xFF, 0xFF, 0xEE, 0xDD, - 0xDD, 0xDD, 0xDE, 0xFF, 0xFF, 0xFF, 0xAE, 0xEE, 0xED, 0xED, 0xDD, 0xDD, - 0xDE, 0xEE, 0xEF, 0xFF, 0xD0, 0x00, 0x00, 0x00, - ], - [ - 0xDF, 0xFF, 0xFF, 0xEE, 0xFE, 0xDE, 0xEE, 0xFF, 0xDE, 0xFF, 0x9F, 0xFF, - 0xFF, 0xFF, 0xDD, 0xDE, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, - 0xDC, 0xCC, 0xCC, 0xDD, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0xEC, 0xCB, 0xBA, - 0xAA, 0xAB, 0xCD, 0xEF, 0xFF, 0xFF, 0xFF, 0xFD, 0xCB, 0xA9, 0x99, 0x99, - 0x9A, 0xBC, 0xDF, 0xFF, 0xFF, 0xFD, 0xCB, 0xA9, 0x87, 0x77, 0x88, 0x9A, - 0xBD, 0xFF, 0xFF, 0xEF, 0xDB, 0xA9, 0x87, 0x66, 0x66, 0x78, 0x9A, 0xCD, - 0xFF, 0xFF, 0xFC, 0xB9, 0x87, 0x65, 0x55, 0x66, 0x78, 0x9B, 0xCE, 0xFF, - 0xEE, 0xCA, 0x98, 0x65, 0x54, 0x45, 0x56, 0x89, 0xAC, 0xDF, 0xFE, 0xDC, - 0xA9, 0x76, 0x54, 0x44, 0x45, 0x67, 0x9A, 0xCD, 0xFF, 0xED, 0xCA, 0x97, - 0x65, 0x44, 0x44, 0x56, 0x79, 0xAC, 0xDF, 0xFE, 0xDC, 0xA9, 0x86, 0x65, - 0x44, 0x55, 0x67, 0x9A, 0xCD, 0xFF, 0xEE, 0xCB, 0x98, 0x76, 0x55, 0x55, - 0x67, 0x89, 0xAC, 0xFF, 0xFF, 0xFD, 0xCA, 0x98, 0x76, 0x66, 0x67, 0x88, - 0xAB, 0xCE, 0xFF, 0xFF, 0xFC, 0xBA, 0x98, 0x87, 0x77, 0x89, 0x9B, 0xCD, - 0xFF, 0xFE, 0xFF, 0xDC, 0xBA, 0x99, 0x98, 0x99, 0xAB, 0xCD, 0xFF, 0xFF, - 0xFF, 0xFF, 0xED, 0xCB, 0xBA, 0xAA, 0xAB, 0xCD, 0xEF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xDD, 0xCC, 0xCC, 0xCC, 0xCE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFE, 0xED, 0xDD, 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xAF, 0xFF, 0xFF, 0xEE, 0xDE, 0xFE, - 0xFF, 0xFF, 0xFF, 0xFF, 0xD0, 0x00, 0x00, 0x00, - ], - [ - 0xBE, 0xEE, 0xDD, 0xDD, 0xCC, 0xCC, 0xDD, 0xDD, 0xDD, 0xED, 0x9F, 0xFF, - 0xFE, 0xDD, 0xDD, 0xCD, 0xDD, 0xEF, 0xEE, 0xFF, 0xFE, 0xEF, 0xED, 0xDC, - 0xCC, 0xBB, 0xBC, 0xCC, 0xDD, 0xEE, 0xFF, 0xEE, 0xEE, 0xDC, 0xBB, 0xAA, - 0xAA, 0xAB, 0xBC, 0xDD, 0xEF, 0xFE, 0xDD, 0xCC, 0xCA, 0xA9, 0x99, 0x99, - 0x9A, 0xBC, 0xCD, 0xEF, 0xDE, 0xDC, 0xBA, 0x99, 0x88, 0x88, 0x88, 0x9A, - 0xBC, 0xDE, 0xFE, 0xDE, 0xCB, 0xA9, 0x87, 0x77, 0x77, 0x78, 0x9A, 0xBC, - 0xDE, 0xED, 0xDC, 0xA9, 0x87, 0x66, 0x55, 0x67, 0x89, 0xAB, 0xCD, 0xEE, - 0xDD, 0xBA, 0x98, 0x76, 0x54, 0x45, 0x67, 0x89, 0xAC, 0xDF, 0xED, 0xDB, - 0xA9, 0x87, 0x54, 0x33, 0x45, 0x78, 0x9A, 0xCC, 0xFD, 0xDC, 0xCA, 0x98, - 0x75, 0x43, 0x34, 0x56, 0x89, 0xAB, 0xCE, 0xDD, 0xDC, 0xA9, 0x87, 0x65, - 0x44, 0x56, 0x78, 0x9A, 0xBD, 0xEE, 0xDD, 0xCA, 0xA9, 0x77, 0x65, 0x56, - 0x67, 0x89, 0xAC, 0xDE, 0xED, 0xED, 0xCA, 0x98, 0x77, 0x76, 0x77, 0x89, - 0xAB, 0xCD, 0xFE, 0xEE, 0xDC, 0xBA, 0x98, 0x88, 0x78, 0x89, 0x9A, 0xBC, - 0xDE, 0xED, 0xFE, 0xCC, 0xBA, 0xA9, 0x99, 0x99, 0xAA, 0xBC, 0xDE, 0xEE, - 0xEF, 0xFD, 0xDC, 0xBB, 0xAA, 0xAA, 0xAB, 0xBC, 0xDE, 0xFF, 0xEE, 0xFF, - 0xED, 0xDC, 0xCC, 0xBB, 0xBB, 0xCD, 0xDD, 0xEF, 0xFF, 0xEF, 0xFF, 0xFE, - 0xED, 0xDD, 0xDC, 0xDD, 0xDE, 0xFF, 0xFF, 0xFE, 0xFF, 0xFF, 0xFE, 0xEE, - 0xEE, 0xEE, 0xFF, 0xFF, 0xFF, 0xFF, 0x9E, 0xDE, 0xDD, 0xDE, 0xDD, 0xCD, - 0xDD, 0xFE, 0xEF, 0xFF, 0xB0, 0x00, 0x00, 0x00, - ], - [ - 0xAB, 0xBA, 0xAA, 0xA9, 0x99, 0x99, 0x9A, 0xAA, 0xBB, 0xCC, 0x8B, 0xCB, - 0xBB, 0xAA, 0xAA, 0xAA, 0xAA, 0xAB, 0xBC, 0xCD, 0xDC, 0xBC, 0xBB, 0xAA, - 0x99, 0x99, 0x99, 0x99, 0xAA, 0xBC, 0xCD, 0xCA, 0xBB, 0xA9, 0x99, 0x88, - 0x88, 0x88, 0x99, 0xAA, 0xBB, 0xCC, 0xAB, 0xA9, 0x98, 0x88, 0x77, 0x77, - 0x88, 0x89, 0xAA, 0xBC, 0xBA, 0xAA, 0x98, 0x87, 0x77, 0x77, 0x77, 0x78, - 0x89, 0xAB, 0xCB, 0xAA, 0x99, 0x87, 0x77, 0x66, 0x66, 0x77, 0x78, 0x99, - 0xAB, 0xB9, 0xA9, 0x88, 0x77, 0x66, 0x66, 0x66, 0x77, 0x88, 0x9A, 0xBA, - 0x9A, 0x98, 0x77, 0x66, 0x65, 0x56, 0x66, 0x77, 0x89, 0xAB, 0xA9, 0xA9, - 0x87, 0x76, 0x65, 0x55, 0x56, 0x67, 0x78, 0x9A, 0xAA, 0x9A, 0x98, 0x77, - 0x66, 0x55, 0x55, 0x66, 0x77, 0x89, 0xAA, 0xA9, 0xA9, 0x87, 0x76, 0x65, - 0x55, 0x56, 0x67, 0x78, 0x9A, 0xBA, 0x9A, 0x98, 0x87, 0x76, 0x66, 0x66, - 0x66, 0x78, 0x89, 0xAB, 0xAA, 0xA9, 0x98, 0x77, 0x76, 0x66, 0x66, 0x77, - 0x88, 0x9A, 0xBA, 0xAB, 0xA9, 0x88, 0x77, 0x77, 0x77, 0x77, 0x88, 0x99, - 0xAB, 0xAA, 0xBA, 0xA9, 0x88, 0x87, 0x77, 0x78, 0x88, 0x99, 0xAA, 0xBB, - 0xBC, 0xBA, 0xA9, 0x98, 0x88, 0x88, 0x88, 0x99, 0xAA, 0xBC, 0xBB, 0xCB, - 0xBA, 0xA9, 0x99, 0x99, 0x99, 0x9A, 0xAA, 0xBC, 0xCB, 0xBD, 0xCB, 0xBB, - 0xAA, 0xAA, 0xAA, 0xAA, 0xAB, 0xBC, 0xCD, 0xCC, 0xDD, 0xCC, 0xBB, 0xBA, - 0xAA, 0xBB, 0xBB, 0xBB, 0xCC, 0xDC, 0x9C, 0xCC, 0xBB, 0xBA, 0xAA, 0xAA, - 0xAA, 0xBB, 0xBB, 0xCC, 0xB0, 0x00, 0x00, 0x00, - ], - [ - 0xAB, 0xAA, 0xA9, 0x99, 0x99, 0x99, 0x99, 0xAA, 0xAB, 0xBC, 0xAB, 0xCB, - 0xBA, 0xAA, 0xA9, 0x99, 0x99, 0xAA, 0xBB, 0xCC, 0xDC, 0xBB, 0xBA, 0xA9, - 0x99, 0x99, 0x99, 0x99, 0x9A, 0xAB, 0xCC, 0xCA, 0xBA, 0xA9, 0x98, 0x88, - 0x88, 0x88, 0x89, 0x9A, 0xAB, 0xCB, 0xAA, 0xA9, 0x98, 0x87, 0x77, 0x77, - 0x78, 0x89, 0x9A, 0xBB, 0xB9, 0xA9, 0x98, 0x87, 0x77, 0x77, 0x77, 0x78, - 0x89, 0x9A, 0xBB, 0x9A, 0x98, 0x87, 0x76, 0x66, 0x66, 0x67, 0x78, 0x89, - 0xAB, 0xA9, 0x99, 0x87, 0x77, 0x66, 0x66, 0x66, 0x67, 0x78, 0x9A, 0xAA, - 0x99, 0x98, 0x77, 0x66, 0x66, 0x66, 0x66, 0x77, 0x89, 0x9A, 0xA9, 0x99, - 0x87, 0x76, 0x66, 0x55, 0x56, 0x67, 0x78, 0x89, 0xAA, 0x99, 0x98, 0x77, - 0x66, 0x65, 0x56, 0x66, 0x77, 0x88, 0x9A, 0xA9, 0x99, 0x87, 0x76, 0x66, - 0x66, 0x66, 0x67, 0x78, 0x99, 0xAA, 0x9A, 0x98, 0x77, 0x66, 0x66, 0x66, - 0x66, 0x77, 0x89, 0xAA, 0xA9, 0xA9, 0x88, 0x77, 0x66, 0x66, 0x66, 0x77, - 0x88, 0x9A, 0xAA, 0xAA, 0x99, 0x88, 0x77, 0x77, 0x77, 0x77, 0x88, 0x99, - 0xAB, 0xAA, 0xBA, 0x99, 0x88, 0x77, 0x77, 0x77, 0x88, 0x99, 0xAA, 0xBA, - 0xAB, 0xAA, 0x99, 0x88, 0x88, 0x88, 0x88, 0x99, 0xAA, 0xBC, 0xBB, 0xCB, - 0xAA, 0x99, 0x99, 0x88, 0x99, 0x99, 0xAA, 0xBB, 0xCB, 0xBC, 0xCB, 0xBA, - 0xAA, 0x99, 0x99, 0xAA, 0xAA, 0xBB, 0xCC, 0xBC, 0xDC, 0xCB, 0xBB, 0xAA, - 0xAA, 0xAA, 0xAB, 0xBB, 0xCD, 0xDC, 0x9C, 0xCB, 0xBA, 0xAA, 0xAA, 0xAA, - 0xAA, 0xAA, 0xBB, 0xBC, 0xA0, 0x00, 0x00, 0x00, - ], - [ - 0xAC, 0xBB, 0xAA, 0xAA, 0x99, 0x99, 0xAA, 0xAA, 0xBC, 0xCC, 0x9C, 0xCC, - 0xBB, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xBB, 0xDD, 0xED, 0xBC, 0xBA, 0xAA, - 0x99, 0x99, 0x99, 0x99, 0xAA, 0xBB, 0xCD, 0xCB, 0xBB, 0xA9, 0x99, 0x88, - 0x88, 0x88, 0x99, 0xAA, 0xBC, 0xCB, 0xAB, 0xA9, 0x98, 0x88, 0x77, 0x77, - 0x88, 0x89, 0xAA, 0xBC, 0xBA, 0xBA, 0x98, 0x87, 0x77, 0x77, 0x77, 0x78, - 0x99, 0xAB, 0xBB, 0xAA, 0x99, 0x87, 0x76, 0x66, 0x66, 0x77, 0x78, 0x99, - 0xAB, 0xBA, 0xA9, 0x88, 0x76, 0x66, 0x66, 0x66, 0x77, 0x88, 0x9A, 0xBA, - 0x9A, 0x98, 0x77, 0x66, 0x55, 0x56, 0x66, 0x77, 0x89, 0xAA, 0xA9, 0x99, - 0x87, 0x76, 0x65, 0x55, 0x56, 0x67, 0x78, 0x9A, 0xAA, 0x99, 0x98, 0x77, - 0x66, 0x55, 0x55, 0x66, 0x77, 0x89, 0xAA, 0xAA, 0xA9, 0x87, 0x76, 0x66, - 0x55, 0x56, 0x67, 0x78, 0x9A, 0xAA, 0xAA, 0x98, 0x87, 0x76, 0x66, 0x66, - 0x66, 0x78, 0x89, 0xAB, 0xAA, 0xA9, 0x98, 0x77, 0x76, 0x66, 0x66, 0x77, - 0x88, 0x9A, 0xBB, 0xAB, 0xA9, 0x98, 0x77, 0x77, 0x77, 0x77, 0x88, 0x9A, - 0xAB, 0xBB, 0xBA, 0xA9, 0x88, 0x87, 0x77, 0x78, 0x88, 0x99, 0xAB, 0xCB, - 0xBC, 0xBA, 0xA9, 0x98, 0x88, 0x88, 0x89, 0x99, 0xAA, 0xBC, 0xBB, 0xCB, - 0xBA, 0xA9, 0x99, 0x99, 0x99, 0x99, 0xAB, 0xBC, 0xCC, 0xCD, 0xCB, 0xBA, - 0xAA, 0xAA, 0xAA, 0xAA, 0xAB, 0xBC, 0xCD, 0xCC, 0xED, 0xCC, 0xBB, 0xBB, - 0xBB, 0xAB, 0xBB, 0xBC, 0xDC, 0xDD, 0x9C, 0xCB, 0xBB, 0xBB, 0xAA, 0xAA, - 0xAA, 0xBB, 0xBC, 0xCD, 0xB0, 0x00, 0x00, 0x00, - ], - [ - 0xBC, 0xDC, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xCC, 0xCD, 0xDE, 0x9D, 0xED, - 0xCC, 0xBB, 0xBA, 0xAB, 0xBB, 0xBC, 0xDD, 0xEF, 0xFE, 0xDD, 0xCC, 0xBA, - 0xAA, 0xAA, 0x9A, 0xAA, 0xBC, 0xCD, 0xDF, 0xEC, 0xDC, 0xAA, 0x99, 0x99, - 0x89, 0x99, 0x9A, 0xBB, 0xCD, 0xDD, 0xCC, 0xBA, 0x99, 0x88, 0x88, 0x88, - 0x89, 0x9A, 0xBB, 0xCD, 0xDB, 0xBA, 0xA9, 0x88, 0x77, 0x77, 0x77, 0x89, - 0x9A, 0xBC, 0xDD, 0xBB, 0xA9, 0x88, 0x76, 0x66, 0x66, 0x77, 0x89, 0x9B, - 0xBC, 0xCB, 0xBA, 0x98, 0x76, 0x66, 0x55, 0x66, 0x77, 0x89, 0xAB, 0xCC, - 0xBB, 0x99, 0x87, 0x66, 0x55, 0x55, 0x66, 0x78, 0x9A, 0xBC, 0xDB, 0xA9, - 0x88, 0x76, 0x55, 0x44, 0x55, 0x67, 0x89, 0x9B, 0xCC, 0xBB, 0xA9, 0x87, - 0x66, 0x54, 0x45, 0x56, 0x77, 0x89, 0xAC, 0xCB, 0xBA, 0x98, 0x76, 0x65, - 0x55, 0x56, 0x67, 0x88, 0xAA, 0xCC, 0xBB, 0xA9, 0x87, 0x76, 0x65, 0x56, - 0x66, 0x78, 0x9A, 0xBC, 0xCB, 0xBB, 0x99, 0x87, 0x76, 0x66, 0x66, 0x77, - 0x89, 0xAB, 0xCC, 0xCC, 0xBA, 0x98, 0x87, 0x77, 0x77, 0x78, 0x89, 0xAA, - 0xBC, 0xDC, 0xDC, 0xAA, 0x99, 0x88, 0x88, 0x88, 0x89, 0x9A, 0xBB, 0xDD, - 0xCD, 0xCC, 0xBA, 0x99, 0x98, 0x89, 0x99, 0xAA, 0xBC, 0xCD, 0xCD, 0xED, - 0xCB, 0xBA, 0xAA, 0x99, 0x9A, 0xAA, 0xBC, 0xCD, 0xED, 0xDF, 0xED, 0xCC, - 0xBB, 0xBB, 0xAB, 0xBB, 0xBB, 0xCD, 0xDE, 0xED, 0xEE, 0xDD, 0xDC, 0xCC, - 0xBB, 0xCC, 0xCC, 0xDD, 0xEE, 0xEE, 0x9D, 0xCD, 0xCC, 0xCC, 0xCB, 0xBC, - 0xCC, 0xCC, 0xCD, 0xDD, 0xC0, 0x00, 0x00, 0x00, - ], - [ - 0xFF, 0xFF, 0xFE, 0xFF, 0xFD, 0xDD, 0xDC, 0xED, 0xDD, 0xDD, 0x9F, 0xFF, - 0xFF, 0xFF, 0xFE, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xFF, 0xFF, 0xFE, - 0xED, 0xDD, 0xCD, 0xDD, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xCD, 0xBB, - 0xBB, 0xBC, 0xDD, 0xEF, 0xFF, 0xFE, 0xFF, 0xFF, 0xDC, 0xBA, 0xAA, 0xAA, - 0xAB, 0xCD, 0xDE, 0xFF, 0xEF, 0xFD, 0xDC, 0xBA, 0x98, 0x88, 0x89, 0xAB, - 0xCD, 0xEF, 0xFF, 0xFF, 0xED, 0xBA, 0x88, 0x77, 0x77, 0x89, 0xAB, 0xCD, - 0xFF, 0xFF, 0xFD, 0xCA, 0x98, 0x66, 0x55, 0x67, 0x89, 0xAC, 0xDF, 0xFF, - 0xEF, 0xCB, 0xA8, 0x75, 0x44, 0x45, 0x67, 0x8A, 0xBD, 0xFF, 0xFF, 0xFC, - 0xBA, 0x87, 0x54, 0x33, 0x45, 0x68, 0xAB, 0xDF, 0xFF, 0xFF, 0xDB, 0xA8, - 0x75, 0x43, 0x34, 0x56, 0x8A, 0xBD, 0xEF, 0xFF, 0xFD, 0xBA, 0x87, 0x65, - 0x44, 0x45, 0x78, 0xAB, 0xDF, 0xFF, 0xFF, 0xEC, 0xA9, 0x87, 0x65, 0x55, - 0x68, 0x9A, 0xCD, 0xFF, 0xFF, 0xFF, 0xCC, 0xA9, 0x87, 0x76, 0x77, 0x8A, - 0xBC, 0xFF, 0xFF, 0xFF, 0xFE, 0xCB, 0xA9, 0x98, 0x88, 0x9A, 0xBC, 0xDF, - 0xFF, 0xFF, 0xFF, 0xDE, 0xCB, 0xBA, 0xA9, 0xAA, 0xBC, 0xCD, 0xFF, 0xFF, - 0xFF, 0xFF, 0xDD, 0xDC, 0xBB, 0xBB, 0xCC, 0xDE, 0xFF, 0xFF, 0xFE, 0xFF, - 0xFF, 0xFE, 0xDD, 0xCC, 0xDC, 0xDF, 0xFF, 0xFF, 0xFF, 0xEF, 0xFF, 0xFF, - 0xFF, 0xED, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x8D, 0xDD, 0xDD, 0xFE, 0xED, 0xDF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xD0, 0x00, 0x00, 0x00, - ], - [ - 0xCE, 0xDD, 0xDC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xDC, 0x9D, 0xEE, - 0xEE, 0xDC, 0xCC, 0xCC, 0xCC, 0xDD, 0xDE, 0xEE, 0xEE, 0xEE, 0xED, 0xDC, - 0xCB, 0xBB, 0xBB, 0xBC, 0xCD, 0xDE, 0xEF, 0xDD, 0xED, 0xCB, 0xBB, 0xAA, - 0xAA, 0xAA, 0xBB, 0xCC, 0xDE, 0xEE, 0xDD, 0xCB, 0xBA, 0x99, 0x99, 0x89, - 0x9A, 0xAB, 0xCD, 0xEE, 0xDC, 0xCC, 0xBA, 0x99, 0x88, 0x77, 0x88, 0x99, - 0xAB, 0xCD, 0xDD, 0xCD, 0xBA, 0x99, 0x87, 0x66, 0x66, 0x78, 0x9A, 0xBC, - 0xDD, 0xDC, 0xCB, 0xA9, 0x87, 0x66, 0x55, 0x66, 0x78, 0x9A, 0xBC, 0xDD, - 0xCC, 0xBA, 0x97, 0x66, 0x54, 0x45, 0x66, 0x79, 0xAB, 0xCD, 0xDC, 0xCB, - 0xA8, 0x76, 0x54, 0x44, 0x45, 0x67, 0x8A, 0xBC, 0xDD, 0xCC, 0xBA, 0x87, - 0x65, 0x44, 0x44, 0x56, 0x78, 0xAB, 0xCD, 0xDC, 0xCB, 0xA9, 0x87, 0x65, - 0x44, 0x55, 0x67, 0x8A, 0xBC, 0xDD, 0xCC, 0xBA, 0x98, 0x76, 0x65, 0x55, - 0x67, 0x89, 0xAB, 0xCD, 0xDC, 0xDC, 0xBA, 0x98, 0x76, 0x66, 0x67, 0x88, - 0x9A, 0xBD, 0xED, 0xCD, 0xCB, 0xA9, 0x98, 0x87, 0x77, 0x88, 0x9A, 0xBC, - 0xDE, 0xDC, 0xDD, 0xCB, 0xAA, 0x99, 0x98, 0x89, 0x9A, 0xBB, 0xCD, 0xEE, - 0xDE, 0xDD, 0xCB, 0xBA, 0xAA, 0xAA, 0xAA, 0xBC, 0xDD, 0xDF, 0xED, 0xED, - 0xDC, 0xCC, 0xBB, 0xBB, 0xBB, 0xBC, 0xCD, 0xFF, 0xFE, 0xCE, 0xFF, 0xDD, - 0xCC, 0xCC, 0xCC, 0xCD, 0xDD, 0xEF, 0xFF, 0xFD, 0xFE, 0xFF, 0xDE, 0xDD, - 0xDD, 0xDD, 0xDE, 0xEF, 0xFF, 0xFE, 0x9D, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, - 0xDD, 0xEE, 0xEF, 0xEF, 0xD0, 0x00, 0x00, 0x00, - ], - [ - 0xCE, 0xDD, 0xCC, 0xCC, 0xBB, 0xBC, 0xCC, 0xCC, 0xDD, 0xDD, 0xAE, 0xFE, - 0xDD, 0xCC, 0xCB, 0xBB, 0xBC, 0xCC, 0xDE, 0xEF, 0xFE, 0xDE, 0xDD, 0xCB, - 0xBA, 0xAA, 0xAA, 0xBB, 0xCC, 0xDE, 0xEE, 0xED, 0xDD, 0xCB, 0xAA, 0x99, - 0x99, 0x99, 0xAB, 0xBC, 0xDE, 0xED, 0xCD, 0xCB, 0xA9, 0x98, 0x88, 0x88, - 0x89, 0xAA, 0xBC, 0xDE, 0xDC, 0xCB, 0xA9, 0x98, 0x77, 0x77, 0x77, 0x89, - 0xAB, 0xCC, 0xDD, 0xCC, 0xBA, 0x98, 0x77, 0x66, 0x66, 0x77, 0x89, 0xAB, - 0xCD, 0xDC, 0xCA, 0x98, 0x77, 0x66, 0x55, 0x56, 0x77, 0x89, 0xBC, 0xDD, - 0xCB, 0xA9, 0x87, 0x65, 0x55, 0x55, 0x56, 0x78, 0x9A, 0xBD, 0xDB, 0xBA, - 0x98, 0x76, 0x55, 0x44, 0x55, 0x67, 0x89, 0xAB, 0xDC, 0xBB, 0xA9, 0x87, - 0x65, 0x54, 0x45, 0x56, 0x78, 0x9A, 0xBC, 0xCC, 0xBA, 0x98, 0x76, 0x55, - 0x55, 0x55, 0x67, 0x89, 0xAB, 0xCD, 0xCC, 0xB9, 0x87, 0x76, 0x55, 0x55, - 0x67, 0x78, 0x9A, 0xBD, 0xCC, 0xCB, 0xA9, 0x87, 0x76, 0x66, 0x67, 0x78, - 0x9A, 0xBC, 0xDD, 0xCD, 0xCB, 0xA9, 0x87, 0x77, 0x77, 0x78, 0x99, 0xAB, - 0xCD, 0xDD, 0xDC, 0xBA, 0xA9, 0x88, 0x88, 0x88, 0x99, 0xAB, 0xCD, 0xED, - 0xDE, 0xDC, 0xBB, 0xA9, 0x99, 0x99, 0x9A, 0xAB, 0xCD, 0xDE, 0xED, 0xED, - 0xDC, 0xBB, 0xBA, 0xAA, 0xAA, 0xBB, 0xCC, 0xDE, 0xFE, 0xDF, 0xEE, 0xDD, - 0xCC, 0xBB, 0xBB, 0xBC, 0xCD, 0xDE, 0xFF, 0xED, 0xFF, 0xEE, 0xDD, 0xDD, - 0xCC, 0xDD, 0xDD, 0xEE, 0xFF, 0xFF, 0xAE, 0xDD, 0xDD, 0xDD, 0xDD, 0xCC, - 0xDD, 0xDD, 0xEE, 0xEF, 0xD0, 0x00, 0x00, 0x00, - ], - [ - 0xCE, 0xED, 0xDD, 0xDC, 0xCC, 0xCC, 0xCC, 0xDD, 0xDD, 0xDD, 0x9F, 0xFE, - 0xED, 0xDD, 0xCD, 0xDC, 0xCC, 0xDD, 0xDE, 0xEF, 0xFD, 0xEF, 0xDE, 0xCC, - 0xCB, 0xBB, 0xBB, 0xCC, 0xCD, 0xDE, 0xEF, 0xDD, 0xED, 0xDC, 0xBB, 0xAA, - 0xAA, 0xAA, 0xAB, 0xCD, 0xEF, 0xFD, 0xDD, 0xDB, 0xBA, 0x99, 0x98, 0x89, - 0x9A, 0xAB, 0xCD, 0xEE, 0xDD, 0xDC, 0xBA, 0x98, 0x87, 0x77, 0x78, 0x99, - 0xAB, 0xCD, 0xFD, 0xDD, 0xCB, 0x98, 0x77, 0x66, 0x66, 0x78, 0x9A, 0xBC, - 0xDD, 0xDC, 0xCB, 0xA9, 0x87, 0x65, 0x55, 0x56, 0x78, 0x9A, 0xBD, 0xDD, - 0xCC, 0xBA, 0x97, 0x65, 0x54, 0x55, 0x56, 0x79, 0xAB, 0xCD, 0xDC, 0xCB, - 0xA8, 0x76, 0x55, 0x44, 0x55, 0x67, 0x8A, 0xBC, 0xED, 0xCC, 0xBA, 0x87, - 0x65, 0x54, 0x44, 0x56, 0x78, 0xAB, 0xCD, 0xDC, 0xCB, 0xA9, 0x76, 0x55, - 0x44, 0x55, 0x67, 0x8A, 0xBC, 0xDC, 0xCD, 0xCA, 0x98, 0x76, 0x55, 0x55, - 0x67, 0x89, 0xAB, 0xCD, 0xDC, 0xDC, 0xBA, 0x98, 0x76, 0x66, 0x67, 0x88, - 0x9A, 0xCC, 0xDD, 0xDD, 0xCC, 0xAA, 0x98, 0x77, 0x77, 0x88, 0x9A, 0xBC, - 0xDD, 0xDC, 0xED, 0xCB, 0xA9, 0x99, 0x88, 0x89, 0x9A, 0xBC, 0xCE, 0xED, - 0xDF, 0xDC, 0xCB, 0xBA, 0xA9, 0xAA, 0xAA, 0xBC, 0xDD, 0xEF, 0xED, 0xEE, - 0xDD, 0xCC, 0xCC, 0xBB, 0xBB, 0xBC, 0xDD, 0xEE, 0xEE, 0xEF, 0xFE, 0xED, - 0xDC, 0xDC, 0xCC, 0xCD, 0xDD, 0xEF, 0xFF, 0xFE, 0xFF, 0xEE, 0xFD, 0xDD, - 0xDD, 0xDD, 0xED, 0xDF, 0xFF, 0xFF, 0x9D, 0xDD, 0xCD, 0xDD, 0xDD, 0xDD, - 0xDD, 0xDE, 0xDE, 0xEF, 0xD0, 0x00, 0x00, 0x00, - ], - [ - 0xDF, 0xFF, 0xFE, 0xFE, 0xDE, 0xCD, 0xDD, 0xED, 0xDD, 0xDE, 0x8F, 0xFF, - 0xFF, 0xEF, 0xED, 0xEE, 0xEE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, - 0xDD, 0xDC, 0xDD, 0xDD, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xCC, 0xBB, - 0xBB, 0xBB, 0xCD, 0xDF, 0xFF, 0xFF, 0xFF, 0xFD, 0xCC, 0xBA, 0xA9, 0x9A, - 0xAB, 0xCD, 0xEF, 0xFF, 0xFF, 0xFE, 0xDC, 0xA9, 0x88, 0x88, 0x89, 0xAA, - 0xCD, 0xFF, 0xFF, 0xEF, 0xEC, 0xB9, 0x87, 0x76, 0x77, 0x88, 0xAB, 0xCE, - 0xFF, 0xFF, 0xFD, 0xBA, 0x97, 0x66, 0x55, 0x66, 0x89, 0xAC, 0xDF, 0xFF, - 0xEE, 0xDB, 0xA8, 0x76, 0x54, 0x45, 0x67, 0x8A, 0xBD, 0xFF, 0xFD, 0xDD, - 0xB9, 0x86, 0x54, 0x33, 0x45, 0x68, 0x9B, 0xCF, 0xFF, 0xEF, 0xCB, 0x98, - 0x65, 0x43, 0x34, 0x56, 0x89, 0xBC, 0xFF, 0xFD, 0xED, 0xBA, 0x87, 0x65, - 0x44, 0x55, 0x78, 0x9B, 0xDD, 0xFE, 0xEF, 0xDC, 0xA9, 0x87, 0x65, 0x55, - 0x67, 0x9A, 0xBD, 0xFF, 0xFF, 0xFD, 0xCB, 0xA8, 0x87, 0x66, 0x77, 0x89, - 0xBC, 0xDF, 0xFF, 0xFF, 0xDD, 0xBB, 0xA9, 0x88, 0x88, 0x89, 0xAB, 0xCF, - 0xFF, 0xFF, 0xFF, 0xEC, 0xCB, 0xAA, 0xA9, 0x9A, 0xBB, 0xDD, 0xFF, 0xFF, - 0xFF, 0xFD, 0xED, 0xCB, 0xBB, 0xBB, 0xCC, 0xCD, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xED, 0xDC, 0xCD, 0xCD, 0xDD, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xEF, 0xEE, 0xED, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x9D, 0xDE, 0xEF, 0xFE, 0xED, 0xEF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00, 0x00, - ], - [ - 0xBC, 0xCC, 0xCB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xCC, 0xDD, 0x9D, 0xED, - 0xDC, 0xBB, 0xBB, 0xBB, 0xBB, 0xBC, 0xCD, 0xDF, 0xED, 0xDD, 0xDC, 0xBB, - 0xAA, 0xAA, 0xAA, 0xAA, 0xBB, 0xCD, 0xDF, 0xDC, 0xCC, 0xBB, 0xA9, 0x99, - 0x99, 0x99, 0xAA, 0xBB, 0xCD, 0xDD, 0xCC, 0xBA, 0xA9, 0x98, 0x88, 0x88, - 0x89, 0x9A, 0xBC, 0xCD, 0xDB, 0xCB, 0xA9, 0x88, 0x77, 0x77, 0x77, 0x88, - 0x9A, 0xBC, 0xCC, 0xBB, 0xAA, 0x98, 0x77, 0x66, 0x66, 0x77, 0x89, 0xAA, - 0xBC, 0xCB, 0xBA, 0x98, 0x77, 0x65, 0x55, 0x66, 0x77, 0x89, 0xAB, 0xCB, - 0xBB, 0xA9, 0x87, 0x65, 0x55, 0x55, 0x66, 0x78, 0x9A, 0xBC, 0xCB, 0xBA, - 0x98, 0x76, 0x55, 0x44, 0x55, 0x67, 0x89, 0xAB, 0xCC, 0xAA, 0xA9, 0x87, - 0x65, 0x54, 0x45, 0x56, 0x78, 0x9A, 0xBC, 0xCB, 0xBA, 0x98, 0x76, 0x65, - 0x55, 0x56, 0x67, 0x89, 0xAB, 0xCC, 0xBB, 0xA9, 0x87, 0x76, 0x65, 0x55, - 0x67, 0x78, 0x9A, 0xBC, 0xBB, 0xBA, 0xA9, 0x87, 0x76, 0x66, 0x66, 0x78, - 0x89, 0xAB, 0xCC, 0xBC, 0xBA, 0x99, 0x87, 0x77, 0x77, 0x78, 0x89, 0xAB, - 0xBC, 0xDC, 0xCB, 0xBA, 0x99, 0x88, 0x88, 0x88, 0x99, 0xAA, 0xBC, 0xCC, - 0xCD, 0xCB, 0xBA, 0x99, 0x98, 0x99, 0x9A, 0xAB, 0xBB, 0xDD, 0xCC, 0xDC, - 0xCC, 0xBB, 0xAA, 0xAA, 0xAA, 0xAB, 0xBC, 0xCD, 0xDE, 0xCD, 0xDD, 0xCC, - 0xBB, 0xBB, 0xBB, 0xBB, 0xBD, 0xDD, 0xEF, 0xDD, 0xED, 0xDD, 0xCC, 0xCC, - 0xBC, 0xCC, 0xCD, 0xDD, 0xEE, 0xFD, 0x8D, 0xCC, 0xCC, 0xBB, 0xBB, 0xBB, - 0xCB, 0xCC, 0xDD, 0xDE, 0xB0, 0x00, 0x00, 0x00, - ], - [ - 0xAB, 0xBA, 0xAA, 0xAA, 0x99, 0x99, 0x9A, 0xAA, 0xAB, 0xBB, 0x8B, 0xCC, - 0xBB, 0xBA, 0xAA, 0xAA, 0xAA, 0xAB, 0xBC, 0xCC, 0xDC, 0xBC, 0xBB, 0xAA, - 0xA9, 0x99, 0x99, 0x9A, 0xAA, 0xBB, 0xCD, 0xCA, 0xBB, 0xAA, 0x99, 0x98, - 0x88, 0x89, 0x99, 0xAA, 0xBB, 0xCB, 0xAB, 0xAA, 0x99, 0x88, 0x77, 0x78, - 0x88, 0x99, 0xAA, 0xBC, 0xBA, 0xBA, 0x99, 0x88, 0x77, 0x77, 0x77, 0x78, - 0x99, 0xAB, 0xBB, 0xAA, 0x99, 0x87, 0x76, 0x66, 0x66, 0x77, 0x78, 0x9A, - 0xAB, 0xBA, 0xA9, 0x88, 0x77, 0x66, 0x66, 0x66, 0x77, 0x89, 0x9A, 0xBA, - 0x9A, 0x98, 0x87, 0x66, 0x55, 0x55, 0x66, 0x78, 0x89, 0xAB, 0xA9, 0xA9, - 0x87, 0x76, 0x65, 0x55, 0x56, 0x67, 0x78, 0x9A, 0xBA, 0x9A, 0x98, 0x77, - 0x66, 0x55, 0x55, 0x66, 0x77, 0x89, 0xAB, 0xA9, 0xA9, 0x88, 0x76, 0x65, - 0x55, 0x56, 0x67, 0x78, 0x9A, 0xBA, 0x9A, 0x98, 0x87, 0x76, 0x65, 0x56, - 0x66, 0x78, 0x89, 0xAB, 0xAA, 0xAA, 0x98, 0x87, 0x76, 0x66, 0x66, 0x77, - 0x89, 0xAA, 0xBA, 0xAB, 0xA9, 0x98, 0x77, 0x77, 0x77, 0x77, 0x88, 0x9A, - 0xBB, 0xBA, 0xBA, 0xA9, 0x98, 0x88, 0x77, 0x88, 0x88, 0x9A, 0xAB, 0xCB, - 0xBB, 0xBA, 0xA9, 0x99, 0x88, 0x88, 0x89, 0x9A, 0xAB, 0xBC, 0xBB, 0xCB, - 0xBA, 0xAA, 0x99, 0x99, 0x99, 0x9A, 0xAB, 0xBC, 0xCC, 0xBC, 0xCB, 0xBB, - 0xAA, 0xAA, 0xAA, 0xAA, 0xBB, 0xCC, 0xCD, 0xCB, 0xDC, 0xCC, 0xBB, 0xBB, - 0xBB, 0xBB, 0xBB, 0xCC, 0xCD, 0xDC, 0x8C, 0xBB, 0xBA, 0xAB, 0xAA, 0xAA, - 0xAB, 0xBB, 0xBB, 0xCC, 0xB0, 0x00, 0x00, 0x00, - ], - [ - 0x9B, 0xBA, 0xAA, 0x99, 0x99, 0x99, 0x99, 0xAA, 0xAB, 0xBB, 0x9B, 0xCB, - 0xBB, 0xAA, 0xAA, 0x9A, 0xAA, 0xAA, 0xBB, 0xCC, 0xDC, 0xBC, 0xBA, 0xA9, - 0x99, 0x99, 0x99, 0x99, 0xAA, 0xBB, 0xCC, 0xBA, 0xBA, 0xA9, 0x99, 0x88, - 0x88, 0x88, 0x99, 0x9A, 0xBB, 0xCB, 0xAA, 0xA9, 0x98, 0x88, 0x77, 0x77, - 0x88, 0x89, 0x9A, 0xBB, 0xBA, 0xA9, 0x98, 0x87, 0x77, 0x77, 0x77, 0x78, - 0x89, 0xAA, 0xBA, 0x9A, 0x99, 0x87, 0x77, 0x66, 0x66, 0x77, 0x78, 0x99, - 0xAB, 0xA9, 0xA9, 0x88, 0x77, 0x66, 0x66, 0x66, 0x77, 0x88, 0x9A, 0xAA, - 0x9A, 0x98, 0x77, 0x66, 0x65, 0x56, 0x66, 0x77, 0x89, 0xAA, 0xA9, 0x99, - 0x87, 0x76, 0x65, 0x55, 0x56, 0x67, 0x78, 0x99, 0xAA, 0x99, 0x98, 0x77, - 0x66, 0x55, 0x55, 0x66, 0x77, 0x89, 0x9A, 0xA9, 0xA9, 0x87, 0x76, 0x66, - 0x55, 0x66, 0x67, 0x78, 0x99, 0xAA, 0x9A, 0x98, 0x87, 0x76, 0x66, 0x66, - 0x66, 0x78, 0x89, 0xAA, 0xA9, 0xA9, 0x98, 0x77, 0x76, 0x66, 0x66, 0x77, - 0x89, 0x9A, 0xBA, 0xAA, 0xA9, 0x88, 0x77, 0x77, 0x77, 0x77, 0x88, 0x99, - 0xAB, 0xAA, 0xBA, 0x99, 0x88, 0x87, 0x77, 0x78, 0x88, 0x99, 0xAB, 0xBB, - 0xAB, 0xBA, 0x99, 0x98, 0x88, 0x88, 0x88, 0x99, 0xAA, 0xBC, 0xBB, 0xCB, - 0xBA, 0xA9, 0x99, 0x99, 0x99, 0x99, 0xAA, 0xBB, 0xCB, 0xBC, 0xCB, 0xBA, - 0xAA, 0xA9, 0x99, 0xAA, 0xAB, 0xBB, 0xCC, 0xCB, 0xDC, 0xCB, 0xBB, 0xAA, - 0xAA, 0xAA, 0xBB, 0xBC, 0xCD, 0xDC, 0x9B, 0xBB, 0xBA, 0xAA, 0xAA, 0xAA, - 0xAA, 0xAB, 0xBB, 0xBC, 0xA0, 0x00, 0x00, 0x00, - ], - [ - 0xAC, 0xBB, 0xBA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAB, 0xBB, 0xBC, 0x8C, 0xCC, - 0xBB, 0xBA, 0xAA, 0xAA, 0xAA, 0xAB, 0xBC, 0xCC, 0xDC, 0xBC, 0xBB, 0xAA, - 0xA9, 0x99, 0x99, 0xAA, 0xAB, 0xBC, 0xCD, 0xCB, 0xBB, 0xAA, 0x99, 0x88, - 0x88, 0x89, 0x99, 0xAA, 0xBC, 0xCB, 0xBB, 0xBA, 0x99, 0x88, 0x77, 0x78, - 0x88, 0x99, 0xAB, 0xBC, 0xBA, 0xBA, 0x99, 0x87, 0x77, 0x77, 0x77, 0x88, - 0x99, 0xAB, 0xCB, 0xAA, 0xA9, 0x87, 0x76, 0x66, 0x66, 0x67, 0x88, 0x9A, - 0xBC, 0xBA, 0xA9, 0x88, 0x76, 0x66, 0x56, 0x66, 0x77, 0x88, 0x9A, 0xBB, - 0xAA, 0x98, 0x87, 0x66, 0x55, 0x55, 0x66, 0x78, 0x89, 0xAB, 0xAA, 0xA9, - 0x87, 0x76, 0x55, 0x55, 0x56, 0x67, 0x78, 0x9A, 0xBA, 0xAA, 0x98, 0x77, - 0x65, 0x55, 0x55, 0x66, 0x77, 0x89, 0xAB, 0xAA, 0xA9, 0x88, 0x76, 0x65, - 0x55, 0x56, 0x67, 0x88, 0x9A, 0xBA, 0xAA, 0x99, 0x87, 0x76, 0x65, 0x66, - 0x67, 0x78, 0x99, 0xAB, 0xAA, 0xBA, 0x98, 0x87, 0x66, 0x66, 0x66, 0x77, - 0x89, 0xAA, 0xBB, 0xBB, 0xA9, 0x98, 0x87, 0x77, 0x77, 0x78, 0x88, 0x9A, - 0xBB, 0xBB, 0xBB, 0xA9, 0x98, 0x88, 0x77, 0x88, 0x89, 0x9A, 0xAB, 0xCB, - 0xBC, 0xBB, 0xA9, 0x99, 0x88, 0x88, 0x89, 0x9A, 0xAB, 0xCC, 0xBB, 0xCC, - 0xBB, 0xAA, 0xA9, 0x99, 0x99, 0xAA, 0xAB, 0xBC, 0xCC, 0xCD, 0xCC, 0xBB, - 0xAA, 0xAA, 0xAA, 0xAA, 0xBB, 0xCC, 0xDD, 0xCC, 0xDD, 0xCC, 0xCB, 0xBB, - 0xBB, 0xBB, 0xBB, 0xCC, 0xCE, 0xEC, 0x9C, 0xCB, 0xBB, 0xBA, 0xAA, 0xAA, - 0xAB, 0xBB, 0xBC, 0xCC, 0xB0, 0x00, 0x00, 0x00, - ], - [ - 0xBF, 0xDC, 0xCC, 0xCB, 0xBB, 0xBB, 0xBB, 0xCC, 0xCC, 0xCD, 0x7D, 0xFD, - 0xDD, 0xCC, 0xCB, 0xBB, 0xBC, 0xCC, 0xDD, 0xEF, 0xFD, 0xDE, 0xDC, 0xCB, - 0xBB, 0xAA, 0xAA, 0xBB, 0xCC, 0xCE, 0xEE, 0xDC, 0xDC, 0xCB, 0xAA, 0x99, - 0x99, 0x9A, 0xAB, 0xCC, 0xCD, 0xED, 0xCD, 0xCB, 0xA9, 0x99, 0x88, 0x88, - 0x99, 0xAB, 0xBC, 0xDE, 0xCC, 0xCB, 0xA9, 0x98, 0x77, 0x77, 0x78, 0x89, - 0xAA, 0xBD, 0xDD, 0xCC, 0xBA, 0x98, 0x77, 0x66, 0x66, 0x78, 0x89, 0xAB, - 0xCD, 0xCC, 0xCA, 0xA8, 0x77, 0x66, 0x55, 0x66, 0x78, 0x9A, 0xBC, 0xDC, - 0xBC, 0xA9, 0x87, 0x65, 0x54, 0x55, 0x66, 0x78, 0x9A, 0xBD, 0xCB, 0xBA, - 0x98, 0x76, 0x54, 0x44, 0x55, 0x67, 0x89, 0xAB, 0xCC, 0xBB, 0xA9, 0x87, - 0x65, 0x54, 0x44, 0x56, 0x78, 0x9A, 0xBC, 0xCC, 0xCA, 0x98, 0x76, 0x65, - 0x54, 0x56, 0x67, 0x89, 0xAC, 0xCC, 0xCC, 0xBA, 0x98, 0x76, 0x65, 0x56, - 0x67, 0x88, 0x9A, 0xBD, 0xDC, 0xCB, 0xA9, 0x88, 0x76, 0x66, 0x67, 0x78, - 0x9A, 0xBC, 0xDC, 0xCD, 0xBB, 0xA9, 0x88, 0x77, 0x77, 0x88, 0x99, 0xAB, - 0xCD, 0xDC, 0xDC, 0xBA, 0xA9, 0x98, 0x88, 0x88, 0x99, 0xAB, 0xCD, 0xFD, - 0xDD, 0xDC, 0xBB, 0xAA, 0x99, 0x99, 0x9A, 0xAB, 0xBC, 0xDD, 0xED, 0xED, - 0xDC, 0xCB, 0xBA, 0xAA, 0xAA, 0xBB, 0xCC, 0xDE, 0xEE, 0xDF, 0xEE, 0xDC, - 0xCC, 0xBB, 0xBB, 0xBC, 0xCD, 0xDE, 0xEF, 0xED, 0xEE, 0xFD, 0xDD, 0xCC, - 0xCC, 0xCC, 0xDD, 0xEE, 0xFF, 0xEE, 0x8D, 0xDC, 0xDC, 0xCC, 0xCC, 0xCC, - 0xCD, 0xDD, 0xDD, 0xEE, 0xC0, 0x00, 0x00, 0x00, - ], - [ - 0xCE, 0xEF, 0xFD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDC, 0xDD, 0x8F, 0xFF, - 0xFF, 0xFE, 0xFD, 0xDE, 0xFE, 0xFE, 0xEF, 0xFF, 0xFD, 0xFF, 0xFF, 0xEE, - 0xDC, 0xCD, 0xDC, 0xDD, 0xEE, 0xFF, 0xFF, 0xDF, 0xFF, 0xED, 0xDC, 0xCB, - 0xBB, 0xBC, 0xCD, 0xDE, 0xEF, 0xFE, 0xEF, 0xEE, 0xCC, 0xBA, 0xA9, 0x9A, - 0xAB, 0xCC, 0xDE, 0xFF, 0xEE, 0xFE, 0xDC, 0xBA, 0x98, 0x88, 0x89, 0x9B, - 0xCD, 0xDE, 0xFF, 0xDE, 0xDC, 0xBA, 0x97, 0x76, 0x77, 0x89, 0xAB, 0xCD, - 0xFF, 0xDD, 0xED, 0xBA, 0x97, 0x66, 0x55, 0x66, 0x89, 0xAC, 0xCD, 0xFE, - 0xDE, 0xDB, 0xA8, 0x76, 0x54, 0x45, 0x67, 0x8A, 0xBC, 0xEE, 0xED, 0xEC, - 0xB9, 0x86, 0x54, 0x33, 0x45, 0x68, 0x9B, 0xCE, 0xFE, 0xDD, 0xCB, 0xA8, - 0x75, 0x43, 0x34, 0x56, 0x8A, 0xBC, 0xEF, 0xEE, 0xEC, 0xBA, 0x87, 0x65, - 0x44, 0x46, 0x78, 0xAB, 0xCD, 0xFE, 0xED, 0xDB, 0xA9, 0x87, 0x65, 0x55, - 0x67, 0x9A, 0xBD, 0xDF, 0xFD, 0xED, 0xCB, 0xA9, 0x87, 0x66, 0x77, 0x8A, - 0xBC, 0xDE, 0xFF, 0xDE, 0xDD, 0xBA, 0xA9, 0x88, 0x88, 0x99, 0xAB, 0xDD, - 0xEF, 0xFD, 0xFE, 0xDC, 0xCB, 0xAA, 0x99, 0xAA, 0xBC, 0xCD, 0xFF, 0xFF, - 0xDF, 0xFE, 0xDD, 0xCC, 0xBB, 0xBB, 0xCC, 0xDD, 0xEF, 0xFF, 0xED, 0xFF, - 0xEE, 0xDD, 0xDC, 0xCC, 0xCD, 0xDD, 0xEF, 0xFF, 0xFF, 0xDF, 0xFE, 0xEE, - 0xEE, 0xED, 0xEE, 0xDF, 0xFE, 0xFF, 0xFF, 0xFC, 0xFF, 0xEF, 0xEF, 0xFE, - 0xEE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x8C, 0xCC, 0xDD, 0xDD, 0xDD, 0xDD, - 0xDE, 0xFF, 0xEF, 0xFF, 0xD0, 0x00, 0x00, 0x00, - ], - [ - 0xCE, 0xED, 0xDD, 0xCD, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xDD, 0x9E, 0xFE, - 0xED, 0xDD, 0xCC, 0xCC, 0xCC, 0xDD, 0xDE, 0xEF, 0xFD, 0xEF, 0xED, 0xDC, - 0xCB, 0xBB, 0xBB, 0xBB, 0xCC, 0xDD, 0xDF, 0xDD, 0xED, 0xCC, 0xBA, 0xAA, - 0xAA, 0xAA, 0xBB, 0xCC, 0xDE, 0xED, 0xDD, 0xDC, 0xBA, 0x99, 0x98, 0x89, - 0x9A, 0xAB, 0xCD, 0xDD, 0xDD, 0xDC, 0xBA, 0x98, 0x87, 0x77, 0x88, 0x99, - 0xAB, 0xCD, 0xED, 0xCC, 0xCA, 0x98, 0x87, 0x66, 0x67, 0x78, 0x9A, 0xAC, - 0xDD, 0xDC, 0xCB, 0xA9, 0x87, 0x66, 0x55, 0x66, 0x78, 0x9A, 0xBC, 0xDD, - 0xCC, 0xBA, 0x97, 0x65, 0x54, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xDC, 0xCB, - 0xA8, 0x76, 0x54, 0x44, 0x45, 0x67, 0x8A, 0xBC, 0xDD, 0xCC, 0xBA, 0x87, - 0x65, 0x44, 0x44, 0x56, 0x78, 0xAB, 0xCD, 0xDC, 0xCB, 0xA9, 0x87, 0x65, - 0x44, 0x55, 0x67, 0x9A, 0xBC, 0xDD, 0xCC, 0xBA, 0x98, 0x76, 0x65, 0x55, - 0x67, 0x89, 0xAB, 0xCD, 0xDC, 0xCC, 0xBA, 0x98, 0x77, 0x66, 0x67, 0x78, - 0x9B, 0xBC, 0xDD, 0xCC, 0xCB, 0xA9, 0x98, 0x87, 0x77, 0x88, 0x9A, 0xBC, - 0xDE, 0xDC, 0xEC, 0xCB, 0xAA, 0x99, 0x88, 0x99, 0x9A, 0xBC, 0xDD, 0xFE, - 0xCE, 0xDC, 0xCB, 0xBA, 0xAA, 0xAA, 0xAA, 0xBC, 0xCE, 0xEF, 0xFC, 0xED, - 0xDC, 0xCB, 0xBB, 0xBB, 0xBB, 0xCC, 0xDD, 0xEF, 0xFF, 0xDE, 0xED, 0xDD, - 0xCC, 0xCC, 0xCC, 0xCD, 0xDD, 0xEE, 0xFF, 0xFD, 0xFE, 0xEE, 0xED, 0xED, - 0xDD, 0xDD, 0xDF, 0xFF, 0xFF, 0xFF, 0x9D, 0xDD, 0xDC, 0xDC, 0xDD, 0xDD, - 0xDD, 0xEE, 0xEF, 0xEF, 0xD0, 0x00, 0x00, 0x00, - ], - [ - 0xCE, 0xDD, 0xDC, 0xCC, 0xBB, 0xBB, 0xBB, 0xCC, 0xCC, 0xDD, 0xAE, 0xEE, - 0xDD, 0xCC, 0xCB, 0xBB, 0xBB, 0xCC, 0xDD, 0xEE, 0xED, 0xDE, 0xDC, 0xCB, - 0xBA, 0xAA, 0xAA, 0xBB, 0xBC, 0xCD, 0xDE, 0xDD, 0xDC, 0xCB, 0xAA, 0x99, - 0x99, 0x99, 0xAA, 0xBC, 0xDD, 0xED, 0xCD, 0xCB, 0xA9, 0x98, 0x88, 0x88, - 0x99, 0xAA, 0xBC, 0xDD, 0xDC, 0xCB, 0xA9, 0x98, 0x77, 0x77, 0x78, 0x89, - 0xAB, 0xBC, 0xDD, 0xCC, 0xBA, 0x98, 0x77, 0x66, 0x66, 0x77, 0x89, 0xAB, - 0xCD, 0xCB, 0xCA, 0x98, 0x77, 0x65, 0x55, 0x66, 0x78, 0x9A, 0xAC, 0xDC, - 0xBB, 0xA9, 0x87, 0x65, 0x54, 0x55, 0x66, 0x78, 0x9A, 0xBC, 0xCB, 0xBA, - 0x98, 0x76, 0x55, 0x44, 0x55, 0x67, 0x89, 0xAB, 0xCC, 0xBB, 0xA9, 0x87, - 0x65, 0x54, 0x44, 0x56, 0x78, 0x9A, 0xBC, 0xCB, 0xBA, 0x98, 0x76, 0x65, - 0x55, 0x55, 0x67, 0x89, 0xAB, 0xCC, 0xBB, 0xBA, 0x98, 0x76, 0x65, 0x55, - 0x67, 0x78, 0x9A, 0xBD, 0xCC, 0xCB, 0xA9, 0x87, 0x76, 0x66, 0x67, 0x78, - 0x9A, 0xBC, 0xDD, 0xCC, 0xBA, 0xA9, 0x88, 0x77, 0x77, 0x78, 0x99, 0xAB, - 0xCD, 0xDC, 0xDC, 0xBA, 0xA9, 0x98, 0x88, 0x88, 0x99, 0xAB, 0xCD, 0xED, - 0xCD, 0xCC, 0xBA, 0xAA, 0x99, 0x99, 0x9A, 0xAB, 0xCC, 0xDE, 0xDC, 0xED, - 0xCC, 0xBB, 0xAA, 0xAA, 0xAA, 0xBB, 0xCC, 0xDE, 0xEE, 0xDE, 0xDD, 0xDC, - 0xCB, 0xBB, 0xBB, 0xBC, 0xCD, 0xDE, 0xFF, 0xFD, 0xEE, 0xED, 0xDD, 0xCC, - 0xCC, 0xCC, 0xDD, 0xEE, 0xFF, 0xFF, 0x9D, 0xDD, 0xDD, 0xCC, 0xCC, 0xCC, - 0xCD, 0xDE, 0xEE, 0xEF, 0xE0, 0x00, 0x00, 0x00, - ], - [ - 0xDE, 0xEE, 0xDD, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xDC, 0x9E, 0xFE, - 0xED, 0xDD, 0xCC, 0xCC, 0xCC, 0xDD, 0xDD, 0xEF, 0xFD, 0xDF, 0xED, 0xDC, - 0xCB, 0xBB, 0xBB, 0xBC, 0xCC, 0xDD, 0xDE, 0xDE, 0xED, 0xCC, 0xBB, 0xAA, - 0xAA, 0xAA, 0xBB, 0xCC, 0xCD, 0xED, 0xDE, 0xDC, 0xBA, 0x99, 0x99, 0x99, - 0x9A, 0xAB, 0xCC, 0xDE, 0xDC, 0xDC, 0xBA, 0x98, 0x87, 0x77, 0x88, 0x99, - 0xAB, 0xCD, 0xDD, 0xCD, 0xBA, 0xA8, 0x77, 0x66, 0x67, 0x78, 0x9A, 0xBB, - 0xDD, 0xCC, 0xCB, 0xA9, 0x87, 0x65, 0x55, 0x66, 0x78, 0x9A, 0xBC, 0xDC, - 0xCD, 0xBA, 0x97, 0x65, 0x54, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xCC, 0xCB, - 0xA8, 0x76, 0x54, 0x44, 0x45, 0x67, 0x9A, 0xBC, 0xDC, 0xCC, 0xBA, 0x97, - 0x65, 0x44, 0x44, 0x56, 0x78, 0xAB, 0xCD, 0xDC, 0xCB, 0xA9, 0x87, 0x65, - 0x44, 0x55, 0x67, 0x9A, 0xBC, 0xDD, 0xCC, 0xBA, 0x98, 0x76, 0x65, 0x55, - 0x67, 0x89, 0xAB, 0xCD, 0xDC, 0xCC, 0xBA, 0x98, 0x77, 0x66, 0x67, 0x88, - 0x9B, 0xCC, 0xED, 0xCD, 0xCB, 0xAA, 0x98, 0x87, 0x78, 0x89, 0x9A, 0xBC, - 0xDE, 0xDD, 0xDC, 0xCB, 0xAA, 0x99, 0x88, 0x99, 0xAA, 0xBC, 0xCD, 0xED, - 0xDE, 0xDC, 0xCB, 0xBA, 0xAA, 0xAA, 0xAA, 0xBC, 0xDD, 0xDE, 0xEC, 0xDD, - 0xDC, 0xCB, 0xBB, 0xBB, 0xBB, 0xCC, 0xDD, 0xEF, 0xFE, 0xDE, 0xEE, 0xDD, - 0xCC, 0xCC, 0xCC, 0xCC, 0xDD, 0xEE, 0xFF, 0xFD, 0xEE, 0xEE, 0xDD, 0xDC, - 0xDD, 0xDD, 0xDD, 0xEF, 0xFF, 0xFF, 0x9D, 0xDC, 0xDC, 0xCC, 0xCC, 0xCD, - 0xDD, 0xED, 0xEE, 0xEE, 0xD0, 0x00, 0x00, 0x00, - ], - [ - 0xDF, 0xFF, 0xEF, 0xED, 0xDD, 0xCD, 0xDC, 0xCC, 0xCD, 0xDD, 0x8F, 0xFF, - 0xFF, 0xFF, 0xEE, 0xDD, 0xDE, 0xEF, 0xEF, 0xFF, 0xFE, 0xFF, 0xFF, 0xEE, - 0xDD, 0xCC, 0xCC, 0xDD, 0xEE, 0xEF, 0xFF, 0xDF, 0xFF, 0xED, 0xCC, 0xBB, - 0xBB, 0xBB, 0xCD, 0xDE, 0xFF, 0xFE, 0xEF, 0xFD, 0xCB, 0xAA, 0x99, 0x9A, - 0xAB, 0xBC, 0xDE, 0xFF, 0xEE, 0xFD, 0xCB, 0xA9, 0x98, 0x88, 0x89, 0x9B, - 0xCC, 0xEE, 0xFD, 0xEF, 0xDB, 0xA9, 0x87, 0x76, 0x67, 0x88, 0x9B, 0xCD, - 0xFF, 0xFD, 0xDD, 0xBA, 0x97, 0x66, 0x55, 0x66, 0x89, 0xAB, 0xDE, 0xFF, - 0xDD, 0xCB, 0x98, 0x76, 0x54, 0x45, 0x67, 0x8A, 0xBC, 0xDF, 0xFE, 0xEC, - 0xA9, 0x86, 0x54, 0x33, 0x45, 0x68, 0x9B, 0xCD, 0xFE, 0xDD, 0xCB, 0x98, - 0x65, 0x43, 0x34, 0x56, 0x89, 0xBC, 0xDF, 0xED, 0xDC, 0xBA, 0x87, 0x65, - 0x44, 0x56, 0x78, 0xAB, 0xCD, 0xEE, 0xDE, 0xCB, 0xA9, 0x76, 0x65, 0x56, - 0x67, 0x8A, 0xBD, 0xDF, 0xFD, 0xFD, 0xCB, 0x98, 0x87, 0x66, 0x77, 0x89, - 0xAC, 0xEF, 0xFF, 0xDF, 0xDD, 0xBB, 0xA9, 0x88, 0x88, 0x99, 0xAB, 0xCE, - 0xFF, 0xFD, 0xEF, 0xDD, 0xCB, 0xAA, 0x99, 0x9A, 0xBB, 0xCD, 0xEF, 0xFF, - 0xEF, 0xFE, 0xDD, 0xCC, 0xBB, 0xBB, 0xBC, 0xCD, 0xEF, 0xFF, 0xFE, 0xFF, - 0xDE, 0xDD, 0xCC, 0xCC, 0xCC, 0xDE, 0xEF, 0xFF, 0xFF, 0xDF, 0xFF, 0xFF, - 0xEE, 0xED, 0xEE, 0xEF, 0xFF, 0xFF, 0xFF, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFE, 0xEF, 0xFF, 0xFF, 0xFF, 0x9D, 0xDD, 0xDD, 0xEE, 0xDD, 0xDF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xE0, 0x00, 0x00, 0x00, - ], - [ - 0xBD, 0xCC, 0xCB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xCC, 0xCC, 0x8D, 0xEE, - 0xCC, 0xCC, 0xBB, 0xBB, 0xBB, 0xCC, 0xCD, 0xEF, 0xED, 0xCD, 0xDC, 0xCB, - 0xAA, 0xAA, 0xAA, 0xAB, 0xBC, 0xCD, 0xDD, 0xCC, 0xDC, 0xBB, 0xAA, 0x99, - 0x99, 0x99, 0xAA, 0xBC, 0xCC, 0xED, 0xCD, 0xCB, 0xA9, 0x98, 0x88, 0x88, - 0x89, 0x9A, 0xBC, 0xCD, 0xCC, 0xCB, 0xA9, 0x88, 0x77, 0x77, 0x78, 0x89, - 0x9A, 0xBC, 0xDC, 0xBB, 0xBA, 0x98, 0x77, 0x66, 0x66, 0x77, 0x89, 0xAB, - 0xBC, 0xCB, 0xBA, 0x98, 0x77, 0x65, 0x55, 0x66, 0x78, 0x89, 0xAB, 0xDC, - 0xBB, 0xA9, 0x87, 0x66, 0x55, 0x55, 0x66, 0x78, 0x9A, 0xBC, 0xCB, 0xBA, - 0x98, 0x76, 0x55, 0x44, 0x55, 0x67, 0x89, 0xAB, 0xCC, 0xBB, 0xA9, 0x87, - 0x65, 0x54, 0x44, 0x56, 0x78, 0x9A, 0xBC, 0xBB, 0xBA, 0x98, 0x76, 0x65, - 0x55, 0x55, 0x67, 0x89, 0xAB, 0xCC, 0xBB, 0xA9, 0x88, 0x76, 0x65, 0x55, - 0x66, 0x78, 0x9A, 0xBC, 0xCB, 0xCB, 0xA9, 0x87, 0x76, 0x66, 0x67, 0x78, - 0x9A, 0xAB, 0xCC, 0xBC, 0xBA, 0xA9, 0x88, 0x77, 0x77, 0x78, 0x99, 0xAB, - 0xCD, 0xCC, 0xCC, 0xBA, 0x99, 0x98, 0x88, 0x88, 0x99, 0xAB, 0xBC, 0xDC, - 0xCD, 0xCC, 0xBA, 0xA9, 0x99, 0x99, 0x99, 0xAA, 0xCC, 0xDD, 0xDC, 0xED, - 0xCC, 0xBB, 0xAA, 0xAA, 0xAA, 0xAB, 0xBC, 0xDD, 0xED, 0xCE, 0xED, 0xCC, - 0xBB, 0xBB, 0xBB, 0xBB, 0xCC, 0xCD, 0xEE, 0xDC, 0xEE, 0xED, 0xDC, 0xCC, - 0xCC, 0xCC, 0xCC, 0xDD, 0xEE, 0xFE, 0x7C, 0xCC, 0xCC, 0xCB, 0xCB, 0xBB, - 0xCC, 0xCC, 0xDE, 0xDE, 0xC0, 0x00, 0x00, 0x00, - ], - [ - 0xAC, 0xBB, 0xBA, 0xAA, 0xAA, 0x9A, 0xAA, 0xAA, 0xAB, 0xBB, 0x8C, 0xDC, - 0xCB, 0xBB, 0xAA, 0xAA, 0xAA, 0xBB, 0xBB, 0xCC, 0xDC, 0xBC, 0xCB, 0xBA, - 0xA9, 0x99, 0x99, 0xAA, 0xAB, 0xBC, 0xCD, 0xBB, 0xBB, 0xAA, 0x99, 0x99, - 0x88, 0x99, 0x9A, 0xAB, 0xBC, 0xCB, 0xAB, 0xAA, 0x99, 0x88, 0x88, 0x88, - 0x88, 0x9A, 0xAB, 0xBC, 0xBA, 0xBA, 0x99, 0x88, 0x77, 0x77, 0x77, 0x88, - 0x9A, 0xAB, 0xCB, 0xAA, 0xA9, 0x88, 0x76, 0x66, 0x66, 0x77, 0x89, 0x9A, - 0xBB, 0xBA, 0xAA, 0x98, 0x76, 0x66, 0x56, 0x66, 0x77, 0x89, 0xAA, 0xBB, - 0xAA, 0x98, 0x87, 0x66, 0x55, 0x55, 0x66, 0x78, 0x99, 0xAB, 0xAA, 0xA9, - 0x98, 0x76, 0x55, 0x45, 0x56, 0x67, 0x88, 0x9A, 0xBA, 0xAA, 0x98, 0x87, - 0x66, 0x54, 0x45, 0x56, 0x78, 0x89, 0xAB, 0xAA, 0xA9, 0x98, 0x76, 0x65, - 0x55, 0x56, 0x67, 0x88, 0x9A, 0xBA, 0xAA, 0xA9, 0x87, 0x76, 0x66, 0x56, - 0x66, 0x78, 0x99, 0xAB, 0xAA, 0xBA, 0x99, 0x87, 0x76, 0x66, 0x67, 0x78, - 0x89, 0xAA, 0xBB, 0xAB, 0xAA, 0x98, 0x87, 0x77, 0x77, 0x78, 0x89, 0x9A, - 0xBC, 0xBA, 0xBB, 0xA9, 0x98, 0x88, 0x88, 0x88, 0x89, 0x9A, 0xBB, 0xCB, - 0xBC, 0xBA, 0xAA, 0x99, 0x98, 0x89, 0x99, 0x9A, 0xAB, 0xCC, 0xBB, 0xCB, - 0xBB, 0xAA, 0xA9, 0x99, 0x99, 0xAA, 0xAB, 0xCC, 0xDC, 0xBD, 0xCC, 0xBB, - 0xAA, 0xAA, 0xAA, 0xAB, 0xBB, 0xCC, 0xDD, 0xCB, 0xDD, 0xCC, 0xCB, 0xBB, - 0xBB, 0xBB, 0xBC, 0xCC, 0xDE, 0xED, 0x8B, 0xBB, 0xBB, 0xBA, 0xAA, 0xAA, - 0xBB, 0xBB, 0xBC, 0xCC, 0xA0, 0x00, 0x00, 0x00, - ], - [ - 0x9B, 0xBA, 0xAA, 0x99, 0x99, 0x99, 0x99, 0xAA, 0xAA, 0xBB, 0x9B, 0xCB, - 0xBB, 0xAA, 0xAA, 0x9A, 0xAA, 0xAA, 0xBB, 0xBC, 0xDB, 0xBB, 0xBA, 0xA9, - 0x99, 0x99, 0x99, 0x99, 0xAA, 0xBB, 0xCC, 0xBA, 0xBA, 0xA9, 0x98, 0x88, - 0x88, 0x88, 0x99, 0xAA, 0xBB, 0xCB, 0xAB, 0xA9, 0x98, 0x88, 0x77, 0x78, - 0x88, 0x99, 0xAA, 0xBB, 0xAA, 0xAA, 0x98, 0x87, 0x77, 0x77, 0x77, 0x88, - 0x99, 0xAA, 0xBA, 0x9A, 0x98, 0x87, 0x76, 0x66, 0x66, 0x77, 0x88, 0x99, - 0xAB, 0xA9, 0xA9, 0x88, 0x77, 0x66, 0x66, 0x66, 0x77, 0x88, 0x9A, 0xBA, - 0x9A, 0x98, 0x77, 0x66, 0x55, 0x56, 0x66, 0x78, 0x89, 0xAA, 0xA9, 0xA9, - 0x87, 0x76, 0x65, 0x55, 0x56, 0x67, 0x78, 0x9A, 0xAA, 0x99, 0x98, 0x77, - 0x66, 0x55, 0x55, 0x66, 0x77, 0x89, 0x9A, 0xA9, 0xA9, 0x88, 0x76, 0x66, - 0x55, 0x56, 0x67, 0x78, 0x9A, 0xAA, 0x9A, 0x98, 0x87, 0x76, 0x66, 0x66, - 0x66, 0x78, 0x89, 0xAA, 0xA9, 0xA9, 0x98, 0x87, 0x76, 0x66, 0x66, 0x77, - 0x88, 0x9A, 0xBA, 0xAA, 0xA9, 0x98, 0x87, 0x77, 0x77, 0x77, 0x88, 0x99, - 0xAB, 0xAA, 0xBA, 0xA9, 0x98, 0x88, 0x77, 0x78, 0x88, 0x99, 0xAA, 0xBA, - 0xAB, 0xBA, 0xA9, 0x98, 0x88, 0x88, 0x88, 0x99, 0xAA, 0xBC, 0xBA, 0xCB, - 0xAA, 0xA9, 0x99, 0x99, 0x99, 0x9A, 0xAA, 0xBB, 0xCB, 0xBC, 0xCB, 0xBA, - 0xAA, 0xAA, 0x99, 0xAA, 0xAA, 0xBB, 0xCC, 0xCB, 0xCC, 0xCB, 0xBB, 0xBA, - 0xAA, 0xAA, 0xBB, 0xBC, 0xCC, 0xDC, 0x9B, 0xBB, 0xAA, 0xAA, 0xAA, 0xAA, - 0xAA, 0xAA, 0xBB, 0xBC, 0xA0, 0x00, 0x00, 0x00, - ], - [ - 0xAB, 0xBB, 0xAA, 0xAA, 0x99, 0x99, 0xAA, 0xAA, 0xBB, 0xBB, 0x8B, 0xCC, - 0xBB, 0xBA, 0xAA, 0xAA, 0xAA, 0xAB, 0xBB, 0xCC, 0xDB, 0xBC, 0xBB, 0xAA, - 0xA9, 0x99, 0x99, 0x9A, 0xAA, 0xBB, 0xCC, 0xBB, 0xBB, 0xAA, 0x99, 0x88, - 0x88, 0x89, 0x99, 0xAA, 0xBC, 0xCB, 0xAB, 0xAA, 0x98, 0x88, 0x87, 0x88, - 0x88, 0x99, 0xAB, 0xBC, 0xBA, 0xBA, 0x98, 0x87, 0x77, 0x77, 0x77, 0x88, - 0x99, 0xAB, 0xBA, 0xAA, 0xA9, 0x87, 0x76, 0x66, 0x66, 0x77, 0x88, 0x9A, - 0xAB, 0xAA, 0xA9, 0x98, 0x76, 0x66, 0x56, 0x66, 0x77, 0x89, 0x9A, 0xBA, - 0x9A, 0x98, 0x87, 0x66, 0x55, 0x55, 0x66, 0x78, 0x99, 0xAB, 0xA9, 0xA9, - 0x87, 0x76, 0x55, 0x55, 0x56, 0x67, 0x88, 0x9A, 0xBA, 0x9A, 0x98, 0x87, - 0x66, 0x55, 0x55, 0x56, 0x77, 0x89, 0xAB, 0xA9, 0xA9, 0x88, 0x76, 0x65, - 0x55, 0x56, 0x67, 0x88, 0x9A, 0xBA, 0xAA, 0x99, 0x87, 0x76, 0x66, 0x56, - 0x66, 0x78, 0x89, 0xAB, 0xAA, 0xBA, 0x98, 0x87, 0x76, 0x66, 0x66, 0x77, - 0x89, 0xAA, 0xBA, 0xAB, 0xA9, 0x98, 0x87, 0x77, 0x77, 0x77, 0x88, 0x9A, - 0xBB, 0xBA, 0xBA, 0xA9, 0x98, 0x88, 0x88, 0x88, 0x88, 0x9A, 0xAB, 0xCB, - 0xAC, 0xBA, 0xA9, 0x99, 0x88, 0x88, 0x99, 0x9A, 0xAB, 0xBC, 0xBB, 0xCB, - 0xBA, 0xAA, 0x99, 0x99, 0x99, 0xAA, 0xAB, 0xBC, 0xCB, 0xBC, 0xCB, 0xBB, - 0xAA, 0xAA, 0xAA, 0xAA, 0xBB, 0xBC, 0xCD, 0xCB, 0xDD, 0xCC, 0xBB, 0xBB, - 0xBB, 0xBB, 0xBB, 0xCC, 0xDC, 0xDC, 0x8B, 0xBB, 0xAA, 0xAA, 0xAA, 0xAA, - 0xAA, 0xBB, 0xBB, 0xCC, 0xA0, 0x00, 0x00, 0x00, - ], - [ - 0xBD, 0xCC, 0xCC, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xCC, 0x7D, 0xFE, - 0xDC, 0xCB, 0xBB, 0xBB, 0xBB, 0xBC, 0xCD, 0xEE, 0xED, 0xDD, 0xDC, 0xBB, - 0xBA, 0xAA, 0xAA, 0xAB, 0xBC, 0xCD, 0xDE, 0xDC, 0xDC, 0xCB, 0xA9, 0x99, - 0x99, 0x99, 0xAA, 0xBB, 0xCD, 0xED, 0xCD, 0xBA, 0xA9, 0x98, 0x88, 0x88, - 0x89, 0x9A, 0xAC, 0xCD, 0xCC, 0xBB, 0xA9, 0x88, 0x77, 0x77, 0x77, 0x89, - 0x9A, 0xBC, 0xDD, 0xBC, 0xA9, 0x98, 0x77, 0x66, 0x66, 0x77, 0x89, 0xAB, - 0xCC, 0xCB, 0xBA, 0x98, 0x77, 0x65, 0x55, 0x66, 0x78, 0x89, 0xAB, 0xCC, - 0xBB, 0xA9, 0x87, 0x65, 0x54, 0x55, 0x66, 0x78, 0x9A, 0xBC, 0xCB, 0xBA, - 0x98, 0x76, 0x55, 0x44, 0x55, 0x67, 0x89, 0xAB, 0xCC, 0xBB, 0xA9, 0x87, - 0x65, 0x54, 0x45, 0x56, 0x78, 0x9A, 0xBC, 0xCB, 0xBA, 0x98, 0x76, 0x65, - 0x55, 0x56, 0x67, 0x89, 0xAB, 0xCC, 0xBB, 0xA9, 0x88, 0x76, 0x65, 0x55, - 0x67, 0x78, 0x9A, 0xBC, 0xCB, 0xCB, 0xA9, 0x87, 0x76, 0x66, 0x67, 0x78, - 0x99, 0xBB, 0xCC, 0xCC, 0xBA, 0x99, 0x88, 0x77, 0x77, 0x78, 0x89, 0xAB, - 0xCC, 0xCC, 0xDC, 0xBA, 0x99, 0x88, 0x88, 0x88, 0x99, 0xAB, 0xBC, 0xDD, - 0xCC, 0xCC, 0xBA, 0xA9, 0x99, 0x99, 0x9A, 0xAB, 0xBC, 0xDE, 0xDC, 0xDD, - 0xCC, 0xBB, 0xBA, 0xAA, 0xAA, 0xAB, 0xCC, 0xDE, 0xED, 0xDE, 0xDD, 0xCC, - 0xCB, 0xBB, 0xBB, 0xBB, 0xCC, 0xDD, 0xEF, 0xED, 0xED, 0xEE, 0xEC, 0xCC, - 0xCC, 0xCC, 0xDD, 0xDE, 0xFF, 0xFE, 0x8D, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, - 0xCC, 0xCC, 0xDD, 0xEF, 0xD0, 0x00, 0x00, 0x00, - ], - [ - 0xDF, 0xFF, 0xFF, 0xED, 0xDC, 0xDD, 0xDD, 0xCD, 0xCC, 0xCC, 0x8F, 0xFF, - 0xFF, 0xEE, 0xEE, 0xED, 0xEE, 0xEF, 0xFF, 0xFF, 0xFD, 0xFF, 0xFF, 0xFE, - 0xDD, 0xDD, 0xCD, 0xCD, 0xEE, 0xEF, 0xEF, 0xEE, 0xFF, 0xED, 0xDD, 0xCB, - 0xBB, 0xBC, 0xCD, 0xDD, 0xEF, 0xFD, 0xEF, 0xDE, 0xDC, 0xBA, 0xAA, 0xAA, - 0xAB, 0xCD, 0xDE, 0xFF, 0xDE, 0xFE, 0xDC, 0xA9, 0x98, 0x88, 0x99, 0xAB, - 0xCC, 0xEF, 0xFD, 0xEF, 0xDC, 0xB9, 0x87, 0x77, 0x77, 0x89, 0xAB, 0xCD, - 0xEF, 0xEE, 0xDD, 0xCA, 0x98, 0x66, 0x55, 0x67, 0x89, 0xAC, 0xDE, 0xFE, - 0xED, 0xDB, 0xA8, 0x76, 0x44, 0x45, 0x67, 0x8A, 0xBD, 0xEF, 0xDD, 0xED, - 0xBA, 0x87, 0x54, 0x33, 0x45, 0x78, 0xAB, 0xCE, 0xFE, 0xDE, 0xCB, 0xA8, - 0x75, 0x43, 0x34, 0x56, 0x89, 0xBC, 0xEF, 0xED, 0xED, 0xCA, 0x87, 0x65, - 0x44, 0x45, 0x78, 0xAB, 0xCE, 0xEE, 0xDD, 0xDC, 0xA9, 0x87, 0x65, 0x55, - 0x68, 0x9A, 0xCD, 0xDF, 0xFD, 0xFD, 0xCB, 0xA9, 0x87, 0x76, 0x77, 0x89, - 0xBC, 0xDE, 0xEF, 0xCE, 0xDC, 0xCB, 0xA9, 0x98, 0x88, 0x99, 0xBB, 0xDD, - 0xFF, 0xED, 0xEF, 0xEC, 0xCB, 0xAA, 0xA9, 0xAA, 0xBB, 0xDD, 0xEF, 0xFF, - 0xCD, 0xED, 0xDC, 0xCC, 0xBB, 0xBB, 0xBC, 0xDD, 0xFF, 0xFF, 0xFC, 0xFE, - 0xDD, 0xDD, 0xDC, 0xCD, 0xCD, 0xDD, 0xFF, 0xFF, 0xFF, 0xCE, 0xDE, 0xED, - 0xDD, 0xEE, 0xDE, 0xEE, 0xEF, 0xFF, 0xFF, 0xFC, 0xFE, 0xFE, 0xDE, 0xEE, - 0xDE, 0xFF, 0xEF, 0xFF, 0xFF, 0xFF, 0x7C, 0xCC, 0xCC, 0xCD, 0xDD, 0xDE, - 0xEE, 0xDE, 0xFF, 0xFF, 0xC0, 0x00, 0x00, 0x00, - ], - [ - 0xCE, 0xDD, 0xDD, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0x9E, 0xFE, - 0xED, 0xDC, 0xCC, 0xCC, 0xCC, 0xCD, 0xDE, 0xEE, 0xFD, 0xDF, 0xED, 0xCC, - 0xCB, 0xBB, 0xBB, 0xBC, 0xCC, 0xDD, 0xEE, 0xDD, 0xED, 0xDC, 0xBA, 0xAA, - 0xAA, 0xAA, 0xBB, 0xCC, 0xDE, 0xED, 0xDD, 0xDC, 0xBA, 0x99, 0x98, 0x99, - 0x9A, 0xAB, 0xCD, 0xDE, 0xDC, 0xDC, 0xBA, 0x98, 0x87, 0x77, 0x88, 0x99, - 0xAB, 0xCD, 0xED, 0xCC, 0xCB, 0x99, 0x87, 0x66, 0x67, 0x78, 0x9A, 0xBC, - 0xCD, 0xDC, 0xCB, 0xA9, 0x87, 0x65, 0x55, 0x66, 0x78, 0x9A, 0xBC, 0xDD, - 0xCC, 0xBA, 0x97, 0x65, 0x54, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xDC, 0xCB, - 0xA9, 0x76, 0x54, 0x44, 0x45, 0x67, 0x9A, 0xBC, 0xDD, 0xCC, 0xBA, 0x97, - 0x65, 0x44, 0x44, 0x56, 0x79, 0xAB, 0xCD, 0xCC, 0xCB, 0xA9, 0x87, 0x65, - 0x44, 0x55, 0x67, 0x9A, 0xBC, 0xDC, 0xCC, 0xBA, 0x98, 0x76, 0x65, 0x55, - 0x67, 0x89, 0xAB, 0xCD, 0xDC, 0xCC, 0xBA, 0x98, 0x77, 0x66, 0x67, 0x88, - 0x9A, 0xCD, 0xED, 0xCD, 0xCB, 0xA9, 0x98, 0x87, 0x77, 0x88, 0x9A, 0xBC, - 0xDE, 0xDC, 0xDC, 0xCB, 0xAA, 0x99, 0x98, 0x99, 0x9A, 0xBC, 0xDE, 0xED, - 0xCD, 0xDC, 0xCB, 0xBA, 0xAA, 0xAA, 0xAB, 0xBC, 0xCD, 0xEF, 0xDC, 0xED, - 0xDC, 0xCC, 0xBB, 0xBB, 0xBB, 0xCC, 0xCD, 0xDE, 0xFE, 0xCE, 0xED, 0xDD, - 0xDC, 0xCC, 0xCC, 0xCD, 0xDD, 0xEE, 0xFF, 0xEC, 0xFE, 0xEE, 0xED, 0xDD, - 0xDD, 0xDD, 0xEE, 0xEE, 0xFF, 0xFF, 0x8D, 0xDD, 0xDC, 0xDD, 0xDD, 0xDD, - 0xDD, 0xDD, 0xEE, 0xEE, 0xD0, 0x00, 0x00, 0x00, - ], - [ - 0xCD, 0xDD, 0xCC, 0xCB, 0xBB, 0xBB, 0xBB, 0xBC, 0xCC, 0xCC, 0xAE, 0xEE, - 0xDD, 0xCC, 0xBB, 0xBB, 0xBB, 0xCC, 0xCD, 0xDE, 0xED, 0xDE, 0xDC, 0xCB, - 0xBA, 0xAA, 0xAA, 0xAB, 0xBC, 0xCD, 0xDE, 0xDD, 0xDC, 0xCB, 0xAA, 0x99, - 0x99, 0x99, 0xAA, 0xBC, 0xCD, 0xDD, 0xCD, 0xCB, 0xA9, 0x98, 0x88, 0x88, - 0x89, 0x9A, 0xBC, 0xCD, 0xCC, 0xCB, 0xA9, 0x88, 0x77, 0x77, 0x77, 0x89, - 0x9A, 0xBC, 0xDC, 0xCC, 0xBA, 0x98, 0x76, 0x66, 0x66, 0x77, 0x89, 0xAB, - 0xCD, 0xCB, 0xBA, 0x98, 0x76, 0x65, 0x55, 0x66, 0x78, 0x89, 0xAB, 0xCC, - 0xBB, 0xA9, 0x87, 0x65, 0x55, 0x55, 0x66, 0x78, 0x9A, 0xBC, 0xCB, 0xBA, - 0x98, 0x76, 0x55, 0x44, 0x55, 0x67, 0x89, 0xAB, 0xCC, 0xBB, 0xA9, 0x87, - 0x65, 0x54, 0x45, 0x56, 0x78, 0x9A, 0xBC, 0xCB, 0xBA, 0x98, 0x76, 0x65, - 0x55, 0x55, 0x67, 0x89, 0xAB, 0xCC, 0xBB, 0xA9, 0x88, 0x76, 0x65, 0x55, - 0x66, 0x78, 0x9A, 0xBC, 0xCB, 0xCB, 0xA9, 0x87, 0x76, 0x66, 0x66, 0x78, - 0x9A, 0xBC, 0xDD, 0xCC, 0xBA, 0x99, 0x87, 0x77, 0x77, 0x78, 0x89, 0xAB, - 0xCD, 0xDC, 0xCC, 0xBA, 0x99, 0x88, 0x88, 0x88, 0x99, 0xAB, 0xCD, 0xED, - 0xCD, 0xCB, 0xBA, 0xA9, 0x99, 0x99, 0x9A, 0xAB, 0xCC, 0xDE, 0xDC, 0xDD, - 0xCC, 0xBB, 0xAA, 0xAA, 0xAA, 0xBB, 0xCC, 0xDE, 0xFE, 0xCE, 0xDD, 0xCC, - 0xCB, 0xBB, 0xBB, 0xBC, 0xCD, 0xDE, 0xFF, 0xED, 0xEE, 0xDD, 0xDC, 0xCC, - 0xCC, 0xCC, 0xDD, 0xEE, 0xEF, 0xFE, 0xAD, 0xDC, 0xCC, 0xCC, 0xCC, 0xCC, - 0xCC, 0xDD, 0xEE, 0xEF, 0xD0, 0x00, 0x00, 0x00, - ], - [ - 0xCE, 0xDD, 0xDD, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCD, 0x9E, 0xFF, - 0xED, 0xDD, 0xCC, 0xCC, 0xCC, 0xDD, 0xDD, 0xDE, 0xFD, 0xEE, 0xED, 0xCC, - 0xCB, 0xBB, 0xBB, 0xBB, 0xCD, 0xDD, 0xEE, 0xDD, 0xED, 0xCC, 0xBA, 0xAA, - 0xAA, 0xAA, 0xBB, 0xBC, 0xDD, 0xED, 0xDD, 0xCC, 0xBA, 0x99, 0x98, 0x99, - 0x9A, 0xAB, 0xCD, 0xDE, 0xDD, 0xDC, 0xBA, 0x98, 0x87, 0x77, 0x88, 0x9A, - 0xAB, 0xCD, 0xDD, 0xCD, 0xCB, 0x98, 0x87, 0x66, 0x67, 0x78, 0x9A, 0xBB, - 0xCD, 0xDC, 0xCB, 0xA9, 0x87, 0x65, 0x55, 0x66, 0x78, 0x9A, 0xBC, 0xDC, - 0xCC, 0xBA, 0x98, 0x65, 0x54, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xCC, 0xCB, - 0xA8, 0x76, 0x54, 0x44, 0x45, 0x67, 0x9A, 0xBC, 0xDC, 0xCC, 0xBA, 0x97, - 0x65, 0x44, 0x44, 0x56, 0x78, 0xAB, 0xCD, 0xCC, 0xCB, 0xA9, 0x87, 0x65, - 0x44, 0x55, 0x67, 0x9A, 0xBC, 0xDD, 0xCC, 0xBA, 0x98, 0x76, 0x65, 0x55, - 0x67, 0x89, 0xAB, 0xCD, 0xDC, 0xDB, 0xBA, 0x98, 0x77, 0x66, 0x67, 0x88, - 0x9A, 0xCD, 0xED, 0xCD, 0xCB, 0xA9, 0x98, 0x87, 0x77, 0x88, 0x9A, 0xBC, - 0xDE, 0xDC, 0xDC, 0xCB, 0xAA, 0x99, 0x99, 0x99, 0x9A, 0xBC, 0xCD, 0xED, - 0xCE, 0xDC, 0xBB, 0xBA, 0xAA, 0xAA, 0xAA, 0xBC, 0xCD, 0xEF, 0xEC, 0xED, - 0xDC, 0xCB, 0xBB, 0xBB, 0xBB, 0xBC, 0xCD, 0xEE, 0xFE, 0xCE, 0xED, 0xDD, - 0xCC, 0xCC, 0xCC, 0xCC, 0xDD, 0xEF, 0xFF, 0xFD, 0xEE, 0xEE, 0xDD, 0xDD, - 0xDD, 0xDD, 0xDE, 0xEF, 0xEF, 0xFF, 0x9C, 0xCD, 0xDC, 0xDC, 0xCC, 0xCD, - 0xDD, 0xDD, 0xEE, 0xFE, 0xD0, 0x00, 0x00, 0x00, - ], - [ - 0xCF, 0xFE, 0xED, 0xED, 0xDC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0x7E, 0xFF, - 0xFF, 0xFE, 0xEE, 0xDD, 0xDD, 0xDE, 0xEE, 0xEF, 0xFD, 0xDF, 0xFE, 0xFE, - 0xDC, 0xCC, 0xCC, 0xCC, 0xDD, 0xEE, 0xEF, 0xDE, 0xFE, 0xEE, 0xCC, 0xBB, - 0xBB, 0xBB, 0xCC, 0xCD, 0xEF, 0xFD, 0xEF, 0xED, 0xCB, 0xBA, 0xA9, 0x9A, - 0xAB, 0xBC, 0xDD, 0xEE, 0xDE, 0xED, 0xCB, 0xA9, 0x98, 0x88, 0x89, 0xAA, - 0xCC, 0xDE, 0xED, 0xDE, 0xDB, 0xB9, 0x87, 0x76, 0x77, 0x89, 0xAB, 0xCD, - 0xEF, 0xDE, 0xDC, 0xBA, 0x97, 0x66, 0x55, 0x67, 0x89, 0xAC, 0xCE, 0xFD, - 0xDD, 0xCB, 0xA8, 0x75, 0x54, 0x45, 0x67, 0x8A, 0xBD, 0xDF, 0xED, 0xEC, - 0xB9, 0x87, 0x54, 0x33, 0x45, 0x78, 0xAB, 0xCD, 0xED, 0xDD, 0xCB, 0xA8, - 0x75, 0x43, 0x34, 0x56, 0x89, 0xBC, 0xEF, 0xED, 0xDC, 0xBA, 0x87, 0x65, - 0x44, 0x46, 0x78, 0xAB, 0xCD, 0xED, 0xDD, 0xDB, 0xA9, 0x87, 0x65, 0x55, - 0x67, 0x9A, 0xBC, 0xEF, 0xDD, 0xED, 0xCB, 0xA9, 0x87, 0x76, 0x77, 0x89, - 0xBC, 0xDE, 0xFE, 0xDF, 0xDC, 0xCB, 0xA9, 0x88, 0x88, 0x99, 0xAB, 0xCD, - 0xFF, 0xED, 0xEE, 0xDD, 0xBB, 0xAA, 0x99, 0xAA, 0xAB, 0xCD, 0xEF, 0xFF, - 0xDE, 0xED, 0xCC, 0xCB, 0xBB, 0xBB, 0xBC, 0xDD, 0xEF, 0xFF, 0xFE, 0xFF, - 0xED, 0xDD, 0xCC, 0xCC, 0xCD, 0xDE, 0xFE, 0xFF, 0xFF, 0xDF, 0xFE, 0xEE, - 0xDE, 0xDE, 0xDE, 0xEE, 0xFF, 0xFF, 0xFF, 0xFD, 0xFF, 0xEF, 0xEE, 0xFE, - 0xEE, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0x8C, 0xDD, 0xDC, 0xDE, 0xDE, 0xED, - 0xED, 0xFF, 0xEE, 0xFF, 0xD0, 0x00, 0x00, 0x00, - ], - [ - 0xCF, 0xEE, 0xDD, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xDD, 0x8E, 0xFF, - 0xED, 0xDC, 0xCC, 0xCC, 0xCC, 0xDD, 0xDE, 0xEF, 0xFE, 0xEF, 0xED, 0xCC, - 0xBB, 0xBB, 0xBB, 0xBC, 0xCD, 0xEE, 0xEE, 0xDE, 0xED, 0xCB, 0xBA, 0xAA, - 0xA9, 0xAA, 0xAB, 0xCD, 0xDE, 0xFD, 0xED, 0xDC, 0xBA, 0x99, 0x98, 0x99, - 0x9A, 0xAB, 0xCC, 0xDF, 0xDC, 0xCC, 0xBA, 0x98, 0x87, 0x77, 0x88, 0x9A, - 0xAB, 0xCD, 0xED, 0xDC, 0xBA, 0x98, 0x87, 0x66, 0x67, 0x78, 0x9A, 0xBC, - 0xCE, 0xDC, 0xDB, 0xA9, 0x87, 0x66, 0x55, 0x66, 0x78, 0x9A, 0xBC, 0xDC, - 0xCC, 0xBA, 0x98, 0x66, 0x54, 0x55, 0x67, 0x89, 0xAB, 0xCD, 0xDC, 0xCB, - 0xA8, 0x76, 0x54, 0x34, 0x55, 0x67, 0x9A, 0xBC, 0xDC, 0xCC, 0xBA, 0x98, - 0x65, 0x53, 0x34, 0x56, 0x78, 0x9A, 0xCD, 0xDC, 0xCB, 0xA9, 0x87, 0x65, - 0x54, 0x56, 0x67, 0x99, 0xBC, 0xDD, 0xCC, 0xCA, 0x98, 0x77, 0x65, 0x56, - 0x67, 0x89, 0xAB, 0xCD, 0xDC, 0xDC, 0xBA, 0x98, 0x77, 0x66, 0x67, 0x88, - 0x9A, 0xBD, 0xED, 0xCD, 0xCB, 0xA9, 0x98, 0x87, 0x77, 0x88, 0x9A, 0xBC, - 0xDE, 0xEC, 0xDD, 0xCB, 0xAA, 0x99, 0x99, 0x99, 0x9A, 0xBB, 0xCD, 0xEE, - 0xDE, 0xDC, 0xCB, 0xAA, 0xAA, 0x9A, 0xAA, 0xBB, 0xCE, 0xEF, 0xFD, 0xEE, - 0xDD, 0xCC, 0xBB, 0xBB, 0xBB, 0xBC, 0xCD, 0xDE, 0xFF, 0xDE, 0xED, 0xDD, - 0xDC, 0xCC, 0xCC, 0xCC, 0xDD, 0xEF, 0xFF, 0xFD, 0xFF, 0xFD, 0xED, 0xDD, - 0xDD, 0xDD, 0xDE, 0xEF, 0xFF, 0xFE, 0x7C, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, - 0xDD, 0xDD, 0xEE, 0xFE, 0xD0, 0x00, 0x00, 0x00, - ], - [ - 0xAB, 0xBB, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAB, 0xBB, 0x8B, 0xDC, - 0xCB, 0xBA, 0xAA, 0xAA, 0xAA, 0xBB, 0xCC, 0xCD, 0xEB, 0xBC, 0xBB, 0xAA, - 0xA9, 0x99, 0x99, 0xAA, 0xAB, 0xBC, 0xCD, 0xBB, 0xCB, 0xAA, 0x99, 0x98, - 0x88, 0x99, 0x9A, 0xAB, 0xBC, 0xCB, 0xAB, 0xAA, 0x98, 0x88, 0x88, 0x88, - 0x89, 0x9A, 0xAB, 0xBC, 0xBA, 0xBA, 0x99, 0x87, 0x77, 0x77, 0x77, 0x88, - 0x9A, 0xAB, 0xCB, 0xAA, 0xA9, 0x87, 0x76, 0x66, 0x66, 0x77, 0x89, 0x9A, - 0xBB, 0xBA, 0xA9, 0x98, 0x76, 0x66, 0x56, 0x66, 0x77, 0x89, 0xAA, 0xBB, - 0xAA, 0x98, 0x87, 0x66, 0x55, 0x55, 0x66, 0x78, 0x9A, 0xAB, 0xAA, 0xA9, - 0x88, 0x76, 0x55, 0x45, 0x56, 0x67, 0x88, 0x9A, 0xBA, 0xAA, 0x98, 0x87, - 0x66, 0x55, 0x45, 0x56, 0x78, 0x89, 0xAB, 0xAA, 0xA9, 0x98, 0x76, 0x65, - 0x55, 0x56, 0x67, 0x88, 0x9A, 0xBA, 0xAA, 0xA9, 0x87, 0x76, 0x66, 0x56, - 0x66, 0x78, 0x99, 0xAB, 0xBA, 0xBA, 0x99, 0x87, 0x76, 0x66, 0x66, 0x77, - 0x89, 0xAA, 0xBB, 0xAB, 0xAA, 0x98, 0x87, 0x77, 0x77, 0x77, 0x88, 0x9A, - 0xBC, 0xBA, 0xBB, 0xAA, 0x99, 0x88, 0x88, 0x88, 0x88, 0x9A, 0xAB, 0xCB, - 0xBC, 0xBB, 0xAA, 0x99, 0x98, 0x88, 0x99, 0x9A, 0xAB, 0xCC, 0xBB, 0xCC, - 0xBB, 0xAA, 0xA9, 0x99, 0x99, 0xAA, 0xAB, 0xBC, 0xDC, 0xBD, 0xCC, 0xBB, - 0xBB, 0xAA, 0xAA, 0xAA, 0xBB, 0xBC, 0xDD, 0xCB, 0xDC, 0xCC, 0xCB, 0xBB, - 0xBB, 0xBB, 0xBB, 0xCC, 0xCD, 0xEC, 0x8B, 0xBB, 0xBB, 0xBA, 0xAA, 0xAA, - 0xAB, 0xBB, 0xBC, 0xCC, 0xA0, 0x00, 0x00, 0x00, - ], - [ - 0xAB, 0xBA, 0xAA, 0x99, 0x99, 0x99, 0x99, 0xAA, 0xAA, 0xBB, 0x8B, 0xCB, - 0xBB, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xBB, 0xBC, 0xCB, 0xBB, 0xBA, 0xAA, - 0x99, 0x99, 0x99, 0x99, 0xAA, 0xBB, 0xCC, 0xBA, 0xBA, 0xA9, 0x98, 0x88, - 0x88, 0x89, 0x99, 0xAA, 0xBB, 0xCB, 0xAB, 0xA9, 0x98, 0x88, 0x77, 0x78, - 0x88, 0x99, 0xAA, 0xBB, 0xAA, 0xA9, 0x98, 0x87, 0x77, 0x77, 0x77, 0x88, - 0x99, 0xAA, 0xBA, 0x9A, 0x98, 0x87, 0x76, 0x66, 0x66, 0x77, 0x88, 0x99, - 0xAB, 0xA9, 0xA9, 0x88, 0x76, 0x66, 0x66, 0x66, 0x77, 0x88, 0x9A, 0xBA, - 0x9A, 0x98, 0x77, 0x66, 0x55, 0x56, 0x66, 0x78, 0x89, 0xAA, 0xA9, 0xA9, - 0x87, 0x76, 0x65, 0x55, 0x56, 0x67, 0x78, 0x9A, 0xAA, 0x9A, 0x98, 0x77, - 0x66, 0x55, 0x55, 0x66, 0x77, 0x89, 0xAA, 0xA9, 0xA9, 0x88, 0x76, 0x66, - 0x55, 0x56, 0x67, 0x78, 0x9A, 0xAA, 0x9A, 0x98, 0x87, 0x76, 0x66, 0x66, - 0x66, 0x78, 0x89, 0xAB, 0xA9, 0xA9, 0x98, 0x87, 0x76, 0x66, 0x66, 0x77, - 0x88, 0x9A, 0xBA, 0xAA, 0xA9, 0x98, 0x87, 0x77, 0x77, 0x77, 0x88, 0x99, - 0xAB, 0xAA, 0xBA, 0xA9, 0x98, 0x88, 0x77, 0x78, 0x88, 0x99, 0xAB, 0xBB, - 0xAB, 0xBA, 0xA9, 0x98, 0x88, 0x88, 0x88, 0x99, 0xAA, 0xBC, 0xBA, 0xCB, - 0xBA, 0xA9, 0x99, 0x99, 0x99, 0x9A, 0xAA, 0xBC, 0xCB, 0xBC, 0xCB, 0xBA, - 0xAA, 0xAA, 0xAA, 0xAA, 0xAB, 0xBB, 0xCD, 0xCB, 0xCC, 0xCB, 0xBB, 0xBA, - 0xAA, 0xAB, 0xBB, 0xBC, 0xCC, 0xDC, 0x8B, 0xBB, 0xAA, 0xAA, 0xAA, 0xAA, - 0xAA, 0xAB, 0xBB, 0xCC, 0xA0, 0x00, 0x00, 0x00, - ], - [ - 0xAC, 0xCB, 0xBA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xBB, 0xBB, 0x8C, 0xDC, - 0xCB, 0xBB, 0xAA, 0xAA, 0xAB, 0xBB, 0xBC, 0xCD, 0xDC, 0xBC, 0xCB, 0xBA, - 0xA9, 0x99, 0x9A, 0xAA, 0xAB, 0xBC, 0xCD, 0xCB, 0xCB, 0xAA, 0x99, 0x98, - 0x89, 0x99, 0x9A, 0xAB, 0xBC, 0xCB, 0xBB, 0xBA, 0x99, 0x88, 0x88, 0x88, - 0x89, 0x9A, 0xAB, 0xBC, 0xBB, 0xBA, 0x99, 0x87, 0x77, 0x77, 0x78, 0x88, - 0x9A, 0xAB, 0xCB, 0xAA, 0xA9, 0x87, 0x76, 0x66, 0x66, 0x77, 0x89, 0x9A, - 0xBC, 0xBA, 0xA9, 0x98, 0x76, 0x66, 0x56, 0x66, 0x77, 0x89, 0xAA, 0xBB, - 0xAA, 0x98, 0x87, 0x66, 0x55, 0x55, 0x66, 0x78, 0x99, 0xAB, 0xBA, 0xA9, - 0x88, 0x76, 0x55, 0x45, 0x56, 0x67, 0x88, 0x9A, 0xBB, 0xAA, 0x98, 0x87, - 0x66, 0x54, 0x45, 0x56, 0x78, 0x89, 0xAB, 0xBA, 0xA9, 0x98, 0x76, 0x65, - 0x55, 0x56, 0x67, 0x88, 0x9A, 0xBB, 0xAA, 0xA9, 0x87, 0x76, 0x66, 0x56, - 0x66, 0x78, 0x99, 0xAB, 0xBA, 0xBA, 0x99, 0x87, 0x76, 0x66, 0x66, 0x77, - 0x89, 0xAA, 0xCB, 0xAB, 0xAA, 0x99, 0x88, 0x77, 0x77, 0x77, 0x89, 0x9A, - 0xBC, 0xBB, 0xBB, 0xAA, 0x99, 0x88, 0x88, 0x88, 0x89, 0x9A, 0xAB, 0xCB, - 0xBC, 0xBB, 0xAA, 0x99, 0x98, 0x88, 0x99, 0x9A, 0xAB, 0xCC, 0xCB, 0xCC, - 0xBB, 0xAA, 0xA9, 0x99, 0x99, 0xAA, 0xAB, 0xCC, 0xDC, 0xBD, 0xCC, 0xBB, - 0xBA, 0xAA, 0xAA, 0xAB, 0xBB, 0xCD, 0xDD, 0xDC, 0xDD, 0xCC, 0xCB, 0xBB, - 0xBB, 0xBB, 0xBC, 0xCC, 0xDE, 0xED, 0x8C, 0xBB, 0xBB, 0xBB, 0xBB, 0xAB, - 0xBB, 0xBC, 0xCC, 0xCD, 0xB0, 0x00, 0x00, 0x00, - ], - [ - 0xCE, 0xDC, 0xCC, 0xCB, 0xBB, 0xBB, 0xBB, 0xCC, 0xBC, 0xCC, 0x7D, 0xFE, - 0xDD, 0xCC, 0xCB, 0xBB, 0xBC, 0xCC, 0xDD, 0xEE, 0xFD, 0xDE, 0xDC, 0xCB, - 0xBB, 0xAA, 0xAA, 0xBB, 0xCC, 0xCD, 0xDE, 0xDD, 0xDD, 0xCB, 0xAA, 0x99, - 0x99, 0x9A, 0xAB, 0xCC, 0xDD, 0xFD, 0xCD, 0xCB, 0xA9, 0x98, 0x88, 0x88, - 0x99, 0xAB, 0xBC, 0xDD, 0xCC, 0xCB, 0xA9, 0x98, 0x87, 0x77, 0x78, 0x89, - 0xAB, 0xBD, 0xDC, 0xCC, 0xBA, 0x98, 0x77, 0x66, 0x67, 0x78, 0x89, 0xAB, - 0xCD, 0xDB, 0xCB, 0xA9, 0x87, 0x65, 0x55, 0x66, 0x78, 0x9A, 0xBC, 0xDC, - 0xCB, 0xA9, 0x87, 0x65, 0x54, 0x55, 0x67, 0x78, 0x9B, 0xBC, 0xCB, 0xBA, - 0x98, 0x76, 0x54, 0x44, 0x55, 0x67, 0x89, 0xAB, 0xCC, 0xBB, 0xA9, 0x87, - 0x65, 0x54, 0x44, 0x56, 0x78, 0x9A, 0xBC, 0xCB, 0xCB, 0x98, 0x77, 0x65, - 0x54, 0x55, 0x67, 0x89, 0xAC, 0xCC, 0xBC, 0xBA, 0x98, 0x76, 0x65, 0x55, - 0x67, 0x89, 0x9A, 0xBD, 0xCC, 0xCB, 0xA9, 0x88, 0x77, 0x66, 0x67, 0x78, - 0x9A, 0xBC, 0xDD, 0xCC, 0xBB, 0xA9, 0x88, 0x77, 0x77, 0x88, 0x99, 0xBB, - 0xCD, 0xDC, 0xDC, 0xBA, 0xA9, 0x98, 0x88, 0x89, 0x99, 0xAB, 0xCD, 0xDD, - 0xDE, 0xDC, 0xBB, 0xAA, 0x99, 0x99, 0xAA, 0xAB, 0xCC, 0xDE, 0xFC, 0xDD, - 0xDC, 0xBB, 0xBA, 0xAA, 0xAB, 0xBC, 0xCD, 0xDF, 0xEE, 0xDE, 0xDE, 0xDC, - 0xCC, 0xCB, 0xBC, 0xBC, 0xCD, 0xDE, 0xFF, 0xED, 0xFE, 0xED, 0xDD, 0xCC, - 0xCD, 0xCC, 0xDE, 0xDE, 0xFF, 0xFF, 0x8C, 0xCC, 0xDC, 0xCC, 0xCC, 0xCC, - 0xDD, 0xCD, 0xDE, 0xFF, 0xD0, 0x00, 0x00, 0x00, - ], - [ - 0xEF, 0xFF, 0xEE, 0xED, 0xED, 0xDD, 0xDC, 0xCC, 0xCC, 0xCC, 0x8F, 0xFF, - 0xFF, 0xFF, 0xFE, 0xED, 0xED, 0xDD, 0xFF, 0xFF, 0xFD, 0xFF, 0xFF, 0xEE, - 0xDD, 0xDC, 0xCD, 0xDD, 0xDD, 0xFF, 0xFF, 0xDE, 0xFF, 0xED, 0xDC, 0xCB, - 0xBB, 0xCC, 0xCC, 0xDD, 0xFF, 0xFD, 0xEF, 0xEE, 0xDC, 0xBB, 0xAA, 0xAA, - 0xBB, 0xCD, 0xDE, 0xFF, 0xEF, 0xFE, 0xDB, 0xBA, 0x98, 0x88, 0x99, 0xAB, - 0xCC, 0xDE, 0xFF, 0xEF, 0xDD, 0xB9, 0x87, 0x77, 0x77, 0x89, 0xAB, 0xCE, - 0xEF, 0xED, 0xED, 0xCA, 0x97, 0x66, 0x55, 0x67, 0x89, 0xAC, 0xDD, 0xFF, - 0xDD, 0xDB, 0xA8, 0x75, 0x44, 0x45, 0x67, 0x8A, 0xBD, 0xFF, 0xED, 0xEC, - 0xBA, 0x87, 0x54, 0x33, 0x45, 0x78, 0xAB, 0xDE, 0xFE, 0xDD, 0xCB, 0xA8, - 0x75, 0x43, 0x34, 0x57, 0x8A, 0xBD, 0xFE, 0xFD, 0xEC, 0xCA, 0x87, 0x65, - 0x44, 0x45, 0x78, 0xAC, 0xDF, 0xFF, 0xDE, 0xDC, 0xA9, 0x87, 0x65, 0x55, - 0x67, 0x9A, 0xCD, 0xFF, 0xFD, 0xFD, 0xCB, 0xA9, 0x87, 0x77, 0x77, 0x8A, - 0xBD, 0xEF, 0xFF, 0xCF, 0xDD, 0xCB, 0xA9, 0x88, 0x88, 0x9A, 0xBC, 0xDE, - 0xFF, 0xED, 0xFD, 0xED, 0xCB, 0xAA, 0xAA, 0xAA, 0xBC, 0xDE, 0xEE, 0xFF, - 0xDE, 0xFD, 0xDD, 0xCB, 0xBB, 0xBB, 0xCC, 0xEE, 0xFF, 0xFF, 0xFD, 0xFE, - 0xEE, 0xDD, 0xDD, 0xCD, 0xDD, 0xEE, 0xFE, 0xFF, 0xFF, 0xDF, 0xEE, 0xEE, - 0xDD, 0xED, 0xDD, 0xEF, 0xEF, 0xFF, 0xFF, 0xFD, 0xEE, 0xEE, 0xEF, 0xEF, - 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7C, 0xCC, 0xCC, 0xDD, 0xDD, 0xDE, - 0xFE, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00, 0x00, - ], - [ - 0xEF, 0xEF, 0xED, 0xDD, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0x8F, 0xFF, - 0xEF, 0xDD, 0xDC, 0xCC, 0xCC, 0xDD, 0xDE, 0xEE, 0xED, 0xEF, 0xED, 0xDC, - 0xCB, 0xBB, 0xBB, 0xBC, 0xCC, 0xDD, 0xEE, 0xDE, 0xFE, 0xDC, 0xBB, 0xAA, - 0xAA, 0xAA, 0xBB, 0xCC, 0xDD, 0xFD, 0xEE, 0xDC, 0xBA, 0x99, 0x99, 0x99, - 0x9A, 0xAB, 0xCD, 0xDE, 0xDD, 0xDD, 0xBA, 0x98, 0x87, 0x77, 0x88, 0x9A, - 0xAB, 0xCD, 0xED, 0xDD, 0xCA, 0x98, 0x87, 0x66, 0x67, 0x78, 0x9A, 0xBC, - 0xDE, 0xDC, 0xCB, 0xA9, 0x87, 0x65, 0x55, 0x66, 0x78, 0x9A, 0xBC, 0xEE, - 0xCC, 0xBA, 0x97, 0x65, 0x54, 0x45, 0x67, 0x89, 0xAB, 0xCE, 0xDC, 0xCB, - 0xA9, 0x76, 0x54, 0x44, 0x45, 0x67, 0x9A, 0xBC, 0xED, 0xCC, 0xBA, 0x97, - 0x65, 0x44, 0x44, 0x56, 0x78, 0xAB, 0xCD, 0xDC, 0xCB, 0xA9, 0x87, 0x65, - 0x44, 0x55, 0x67, 0x9A, 0xBC, 0xEE, 0xCC, 0xBA, 0x98, 0x76, 0x65, 0x55, - 0x67, 0x89, 0xAC, 0xDE, 0xEC, 0xCC, 0xBA, 0x98, 0x77, 0x66, 0x67, 0x78, - 0x9B, 0xCD, 0xEE, 0xCD, 0xCB, 0xA9, 0x98, 0x87, 0x77, 0x88, 0x9A, 0xBD, - 0xEF, 0xFC, 0xDC, 0xCB, 0xAA, 0x99, 0x98, 0x99, 0x9A, 0xBC, 0xDF, 0xFF, - 0xCE, 0xDC, 0xCB, 0xBA, 0xAA, 0xAA, 0xAB, 0xBC, 0xDE, 0xFF, 0xFC, 0xED, - 0xDD, 0xCC, 0xBB, 0xBB, 0xBB, 0xCD, 0xDE, 0xEF, 0xFF, 0xCE, 0xED, 0xDD, - 0xDC, 0xCC, 0xCD, 0xDD, 0xDF, 0xFF, 0xFF, 0xFC, 0xFE, 0xEE, 0xEE, 0xEE, - 0xDD, 0xEE, 0xFF, 0xFF, 0xFF, 0xFF, 0x8D, 0xDD, 0xDD, 0xDD, 0xDD, 0xDE, - 0xEF, 0xEF, 0xFF, 0xFF, 0xF0, 0x00, 0x00, 0x00, - ], - [ - 0xDF, 0xEE, 0xDD, 0xCC, 0xCB, 0xBB, 0xBB, 0xCC, 0xCC, 0xCC, 0xAF, 0xFE, - 0xED, 0xCC, 0xBB, 0xBB, 0xBB, 0xCC, 0xCD, 0xDE, 0xED, 0xEF, 0xDD, 0xCB, - 0xBA, 0xAA, 0xAA, 0xAB, 0xBC, 0xCD, 0xDE, 0xDD, 0xED, 0xCB, 0xAA, 0x99, - 0x99, 0x99, 0xAA, 0xBB, 0xCD, 0xED, 0xDD, 0xCB, 0xA9, 0x98, 0x88, 0x88, - 0x89, 0x9A, 0xBC, 0xCD, 0xDC, 0xCB, 0xA9, 0x88, 0x77, 0x77, 0x78, 0x89, - 0x9A, 0xBC, 0xDC, 0xCC, 0xBA, 0x98, 0x76, 0x66, 0x66, 0x77, 0x89, 0xAB, - 0xCC, 0xCC, 0xBA, 0x98, 0x76, 0x65, 0x55, 0x66, 0x77, 0x89, 0xAB, 0xCC, - 0xBB, 0xA9, 0x87, 0x65, 0x55, 0x55, 0x66, 0x78, 0x9A, 0xBC, 0xCB, 0xBA, - 0x98, 0x76, 0x55, 0x44, 0x55, 0x67, 0x89, 0xAB, 0xCC, 0xBB, 0xA9, 0x87, - 0x65, 0x54, 0x45, 0x56, 0x78, 0x9A, 0xBC, 0xCB, 0xBA, 0x98, 0x76, 0x65, - 0x55, 0x55, 0x67, 0x89, 0xAB, 0xDD, 0xBB, 0xA9, 0x87, 0x76, 0x65, 0x55, - 0x66, 0x78, 0x9A, 0xBD, 0xDB, 0xCB, 0xA9, 0x87, 0x76, 0x66, 0x66, 0x78, - 0x9A, 0xBC, 0xDD, 0xCC, 0xBA, 0x99, 0x87, 0x77, 0x77, 0x78, 0x89, 0xAB, - 0xCD, 0xEC, 0xCC, 0xBA, 0x99, 0x88, 0x88, 0x88, 0x99, 0xAB, 0xCD, 0xEE, - 0xCD, 0xCB, 0xBA, 0xA9, 0x99, 0x99, 0x9A, 0xAB, 0xCD, 0xEF, 0xEC, 0xDD, - 0xCB, 0xBB, 0xAA, 0xAA, 0xAA, 0xBB, 0xCD, 0xDF, 0xFF, 0xCE, 0xDD, 0xCC, - 0xCB, 0xBB, 0xBB, 0xBC, 0xCD, 0xEF, 0xFF, 0xFC, 0xEE, 0xDD, 0xDD, 0xCC, - 0xCC, 0xCD, 0xDD, 0xEF, 0xFF, 0xFF, 0xAD, 0xDD, 0xCC, 0xCC, 0xCC, 0xCD, - 0xDD, 0xEE, 0xEF, 0xFF, 0xE0, 0x00, 0x00, 0x00, - ], - [ - 0xDF, 0xFE, 0xED, 0xDD, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0x8F, 0xFF, - 0xFE, 0xDD, 0xDC, 0xCC, 0xDD, 0xDD, 0xDD, 0xEE, 0xEC, 0xEF, 0xEE, 0xDC, - 0xCB, 0xBB, 0xBB, 0xBC, 0xCC, 0xDD, 0xEF, 0xDE, 0xEE, 0xDC, 0xBB, 0xAA, - 0xAA, 0xAA, 0xBB, 0xCC, 0xDD, 0xED, 0xEE, 0xDC, 0xBA, 0x99, 0x99, 0x99, - 0x9A, 0xAB, 0xCC, 0xDE, 0xDD, 0xEC, 0xBA, 0x98, 0x87, 0x77, 0x88, 0x9A, - 0xAB, 0xCD, 0xDD, 0xDD, 0xCB, 0xA8, 0x77, 0x66, 0x67, 0x78, 0x9A, 0xBC, - 0xCD, 0xDD, 0xDC, 0xA9, 0x87, 0x65, 0x55, 0x66, 0x78, 0x9A, 0xCC, 0xDD, - 0xCC, 0xBA, 0x97, 0x65, 0x54, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xDC, 0xCB, - 0xA9, 0x76, 0x54, 0x44, 0x45, 0x67, 0x9A, 0xBC, 0xDD, 0xCC, 0xBA, 0x97, - 0x65, 0x44, 0x44, 0x56, 0x78, 0xAB, 0xCD, 0xDC, 0xCB, 0xA9, 0x87, 0x65, - 0x44, 0x55, 0x67, 0x9A, 0xBC, 0xEE, 0xCC, 0xCA, 0x98, 0x76, 0x65, 0x55, - 0x67, 0x89, 0xAB, 0xDE, 0xDD, 0xDC, 0xBA, 0x98, 0x77, 0x66, 0x67, 0x78, - 0x9B, 0xCD, 0xEE, 0xCD, 0xCB, 0xAA, 0x98, 0x87, 0x77, 0x88, 0x9A, 0xBC, - 0xEF, 0xEC, 0xDD, 0xCB, 0xAA, 0x99, 0x99, 0x99, 0xAA, 0xBC, 0xDE, 0xFE, - 0xCE, 0xDC, 0xCB, 0xBA, 0xAA, 0xAA, 0xAB, 0xBC, 0xDE, 0xEF, 0xFC, 0xED, - 0xDC, 0xCC, 0xBB, 0xBB, 0xBB, 0xCC, 0xDE, 0xEF, 0xFF, 0xCE, 0xED, 0xDD, - 0xDC, 0xCC, 0xCC, 0xDD, 0xDE, 0xFF, 0xFF, 0xFD, 0xFE, 0xEE, 0xDD, 0xDD, - 0xDD, 0xDD, 0xEF, 0xFF, 0xFF, 0xFF, 0x8C, 0xCC, 0xCC, 0xDC, 0xDD, 0xDD, - 0xDE, 0xEE, 0xFF, 0xFF, 0xE0, 0x00, 0x00, 0x00, - ], - [ - 0xEF, 0xFF, 0xFF, 0xFD, 0xED, 0xDD, 0xDC, 0xCC, 0xCC, 0xCC, 0x7F, 0xFF, - 0xFF, 0xFF, 0xFE, 0xDE, 0xDF, 0xDE, 0xEF, 0xFF, 0xFD, 0xFF, 0xFF, 0xFF, - 0xED, 0xDD, 0xCC, 0xCD, 0xEE, 0xEE, 0xFF, 0xDF, 0xFF, 0xFF, 0xED, 0xCC, - 0xBC, 0xBB, 0xCD, 0xDD, 0xEF, 0xFD, 0xFF, 0xFE, 0xEC, 0xBA, 0xAA, 0xAA, - 0xBB, 0xCC, 0xDF, 0xEF, 0xDF, 0xFF, 0xDC, 0xBA, 0x98, 0x88, 0x99, 0xAB, - 0xCC, 0xEF, 0xFF, 0xFF, 0xED, 0xBA, 0x87, 0x77, 0x77, 0x89, 0xAB, 0xDD, - 0xEF, 0xDF, 0xFF, 0xCA, 0x97, 0x65, 0x55, 0x67, 0x89, 0xBC, 0xDF, 0xFE, - 0xEF, 0xDC, 0xA8, 0x75, 0x44, 0x45, 0x67, 0x9A, 0xBD, 0xEF, 0xFE, 0xFD, - 0xCA, 0x87, 0x54, 0x33, 0x45, 0x78, 0xAB, 0xCF, 0xFF, 0xDF, 0xDC, 0xA8, - 0x75, 0x43, 0x34, 0x57, 0x8A, 0xCD, 0xEF, 0xED, 0xFD, 0xCA, 0x97, 0x65, - 0x44, 0x45, 0x78, 0xAB, 0xDF, 0xFF, 0xEF, 0xDC, 0xB9, 0x87, 0x65, 0x55, - 0x68, 0x9B, 0xCF, 0xFF, 0xFD, 0xEE, 0xCB, 0xA9, 0x87, 0x76, 0x78, 0x9A, - 0xCD, 0xFF, 0xFF, 0xDF, 0xED, 0xCB, 0xA9, 0x98, 0x88, 0x9A, 0xBC, 0xDF, - 0xFF, 0xFD, 0xFD, 0xDC, 0xCB, 0xAA, 0xAA, 0xAA, 0xCD, 0xDF, 0xFF, 0xFF, - 0xDF, 0xFD, 0xDD, 0xCC, 0xCB, 0xCC, 0xCD, 0xDE, 0xFF, 0xFF, 0xFD, 0xFE, - 0xFE, 0xDD, 0xDC, 0xDD, 0xDD, 0xEF, 0xFF, 0xFF, 0xFF, 0xDF, 0xFE, 0xEE, - 0xEE, 0xDE, 0xEE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xEF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x8D, 0xCC, 0xCD, 0xDE, 0xEF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00, 0x00, - ], - [ - 0xEF, 0xFF, 0xDF, 0xDE, 0xDD, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0x7F, 0xFF, - 0xEF, 0xFF, 0xFD, 0xEE, 0xFE, 0xDD, 0xEF, 0xFF, 0xFD, 0xFF, 0xFF, 0xEE, - 0xDD, 0xDD, 0xDD, 0xCD, 0xDF, 0xFF, 0xFF, 0xDF, 0xFE, 0xED, 0xDC, 0xCB, - 0xBB, 0xBC, 0xCC, 0xDD, 0xFF, 0xFD, 0xFF, 0xFD, 0xDB, 0xBA, 0xAA, 0xAA, - 0xBB, 0xCC, 0xDD, 0xFF, 0xFF, 0xFE, 0xDB, 0xAA, 0x98, 0x89, 0x99, 0xAB, - 0xCC, 0xFF, 0xFF, 0xFE, 0xDC, 0xBA, 0x98, 0x77, 0x78, 0x89, 0xAC, 0xCC, - 0xFF, 0xFD, 0xFD, 0xCA, 0x98, 0x76, 0x66, 0x67, 0x89, 0xAC, 0xCD, 0xFE, - 0xDD, 0xCB, 0xA9, 0x76, 0x54, 0x45, 0x67, 0x9A, 0xCC, 0xDF, 0xDD, 0xED, - 0xBA, 0x97, 0x64, 0x23, 0x46, 0x78, 0xAB, 0xDD, 0xFF, 0xDD, 0xCB, 0xA9, - 0x76, 0x43, 0x24, 0x57, 0x9A, 0xCD, 0xFF, 0xFE, 0xDC, 0xCA, 0x98, 0x65, - 0x44, 0x56, 0x78, 0xAC, 0xDE, 0xFD, 0xDD, 0xDC, 0xAA, 0x87, 0x66, 0x56, - 0x78, 0x9A, 0xBD, 0xFF, 0xFE, 0xDD, 0xCB, 0xA9, 0x87, 0x77, 0x78, 0x99, - 0xBC, 0xEF, 0xFF, 0xDF, 0xED, 0xCB, 0xA9, 0x98, 0x89, 0x9A, 0xBC, 0xDD, - 0xFF, 0xFD, 0xFF, 0xEC, 0xCB, 0xBA, 0xAA, 0xAA, 0xAC, 0xDE, 0xEF, 0xFF, - 0xDF, 0xFE, 0xCC, 0xDC, 0xBB, 0xBB, 0xBC, 0xDD, 0xEF, 0xFF, 0xFE, 0xFF, - 0xDE, 0xED, 0xDD, 0xCC, 0xDD, 0xDF, 0xFF, 0xFF, 0xFF, 0xDF, 0xFE, 0xFF, - 0xFF, 0xEC, 0xED, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xFF, 0xFF, 0xED, 0xFE, - 0xED, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x6C, 0xCB, 0xBC, 0xCD, 0xDC, 0xCF, - 0xDF, 0xEF, 0xFF, 0xFF, 0xE0, 0x00, 0x00, 0x00, - ], - [ - 0xBD, 0xCC, 0xBB, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAB, 0xBB, 0x8D, 0xDC, - 0xCB, 0xBB, 0xAA, 0xAA, 0xAA, 0xBB, 0xBC, 0xCD, 0xDC, 0xCD, 0xCB, 0xAA, - 0xA9, 0x99, 0x99, 0xAA, 0xAB, 0xBC, 0xCD, 0xCB, 0xCB, 0xBA, 0x99, 0x99, - 0x89, 0x99, 0x9A, 0xAB, 0xBC, 0xDB, 0xBC, 0xAA, 0x99, 0x88, 0x88, 0x88, - 0x89, 0x9A, 0xAB, 0xCD, 0xBB, 0xBA, 0x99, 0x88, 0x77, 0x77, 0x78, 0x89, - 0x9A, 0xAB, 0xCB, 0xAB, 0xA9, 0x88, 0x76, 0x66, 0x66, 0x77, 0x89, 0x9A, - 0xBC, 0xBA, 0xBA, 0x98, 0x76, 0x66, 0x56, 0x66, 0x78, 0x89, 0xAB, 0xBB, - 0xAA, 0x99, 0x87, 0x66, 0x55, 0x55, 0x66, 0x78, 0x9A, 0xBB, 0xBA, 0xA9, - 0x98, 0x76, 0x55, 0x44, 0x56, 0x67, 0x88, 0x9A, 0xBB, 0xAA, 0x99, 0x87, - 0x66, 0x54, 0x45, 0x56, 0x78, 0x89, 0xAB, 0xBA, 0xA9, 0x98, 0x76, 0x65, - 0x55, 0x56, 0x67, 0x89, 0x9A, 0xBB, 0xAA, 0xA9, 0x87, 0x76, 0x66, 0x56, - 0x66, 0x78, 0x9A, 0xAB, 0xBA, 0xBA, 0x99, 0x87, 0x76, 0x66, 0x66, 0x77, - 0x89, 0xAB, 0xCC, 0xAB, 0xAA, 0x98, 0x87, 0x77, 0x77, 0x77, 0x89, 0x9A, - 0xBC, 0xCA, 0xCB, 0xAA, 0x99, 0x88, 0x88, 0x88, 0x89, 0x9A, 0xBC, 0xCC, - 0xBC, 0xBB, 0xAA, 0x99, 0x99, 0x88, 0x99, 0x9A, 0xBB, 0xCD, 0xDB, 0xDC, - 0xCB, 0xAA, 0xAA, 0x99, 0x9A, 0xAA, 0xBB, 0xCD, 0xDD, 0xBD, 0xCC, 0xBB, - 0xBA, 0xAA, 0xAA, 0xAB, 0xBB, 0xCC, 0xDE, 0xDB, 0xDD, 0xCC, 0xCB, 0xBB, - 0xBB, 0xBB, 0xCC, 0xCD, 0xDE, 0xED, 0x8C, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, - 0xBB, 0xBC, 0xDD, 0xDE, 0xC0, 0x00, 0x00, 0x00, - ], - [ - 0xBC, 0xBB, 0xAA, 0x99, 0x99, 0x99, 0x99, 0x9A, 0xAA, 0xBB, 0x9B, 0xCB, - 0xBA, 0xAA, 0xA9, 0x99, 0x9A, 0xAA, 0xBB, 0xBC, 0xDB, 0xBC, 0xBA, 0xA9, - 0x99, 0x99, 0x99, 0x99, 0xAA, 0xAB, 0xBC, 0xBA, 0xBA, 0xA9, 0x98, 0x88, - 0x88, 0x88, 0x99, 0x9A, 0xAB, 0xCB, 0xAB, 0xA9, 0x98, 0x87, 0x77, 0x77, - 0x88, 0x89, 0x9A, 0xBB, 0xBA, 0xA9, 0x98, 0x87, 0x77, 0x77, 0x77, 0x78, - 0x89, 0xAA, 0xBA, 0x9A, 0x98, 0x87, 0x76, 0x66, 0x66, 0x77, 0x78, 0x99, - 0xAB, 0xA9, 0xA9, 0x87, 0x76, 0x66, 0x66, 0x66, 0x77, 0x88, 0x9A, 0xAA, - 0x99, 0x98, 0x77, 0x66, 0x65, 0x56, 0x66, 0x77, 0x89, 0x9A, 0xA9, 0x99, - 0x87, 0x76, 0x65, 0x55, 0x66, 0x67, 0x78, 0x99, 0xAA, 0x99, 0x98, 0x77, - 0x66, 0x65, 0x55, 0x66, 0x77, 0x89, 0x9A, 0xA9, 0x99, 0x87, 0x76, 0x66, - 0x65, 0x66, 0x67, 0x78, 0x99, 0xAA, 0x9A, 0x98, 0x87, 0x76, 0x66, 0x66, - 0x66, 0x77, 0x89, 0xAA, 0xA9, 0xA9, 0x98, 0x77, 0x76, 0x66, 0x66, 0x77, - 0x88, 0x9A, 0xBA, 0x9A, 0xA9, 0x88, 0x77, 0x77, 0x77, 0x77, 0x88, 0x99, - 0xAB, 0xBA, 0xBA, 0x99, 0x88, 0x87, 0x77, 0x77, 0x88, 0x99, 0xAA, 0xBB, - 0xAB, 0xAA, 0x99, 0x98, 0x88, 0x88, 0x88, 0x99, 0xAA, 0xBC, 0xBA, 0xBB, - 0xAA, 0xA9, 0x99, 0x99, 0x99, 0x99, 0xAA, 0xBC, 0xCC, 0xBC, 0xBB, 0xAA, - 0xAA, 0x99, 0x99, 0xAA, 0xAA, 0xBB, 0xCD, 0xCB, 0xCC, 0xCB, 0xBB, 0xAA, - 0xAA, 0xAA, 0xBB, 0xBC, 0xCD, 0xDD, 0x9B, 0xBB, 0xAA, 0xAA, 0xAA, 0xAA, - 0xAA, 0xBB, 0xBC, 0xCD, 0xC0, 0x00, 0x00, 0x00, - ], - [ - 0xBD, 0xCB, 0xBB, 0xAA, 0xAA, 0xAA, 0xAA, 0xAB, 0xBB, 0xBB, 0x8D, 0xDC, - 0xCB, 0xBB, 0xBA, 0xAA, 0xAB, 0xBB, 0xCC, 0xCD, 0xDB, 0xCC, 0xCB, 0xAA, - 0xAA, 0x99, 0x9A, 0xAA, 0xAB, 0xBB, 0xCD, 0xBC, 0xCB, 0xAA, 0x99, 0x98, - 0x99, 0x99, 0x9A, 0xAB, 0xBC, 0xDB, 0xBB, 0xBA, 0x98, 0x88, 0x88, 0x88, - 0x89, 0x9A, 0xAB, 0xBC, 0xBB, 0xBA, 0x98, 0x87, 0x77, 0x77, 0x78, 0x88, - 0x9A, 0xBB, 0xCB, 0xAB, 0xA9, 0x87, 0x76, 0x66, 0x67, 0x77, 0x89, 0x9A, - 0xBB, 0xBA, 0xB9, 0x98, 0x76, 0x66, 0x56, 0x66, 0x78, 0x89, 0xAB, 0xBB, - 0xAA, 0x99, 0x87, 0x65, 0x55, 0x55, 0x67, 0x78, 0x9A, 0xAB, 0xBA, 0xA9, - 0x88, 0x76, 0x55, 0x44, 0x56, 0x67, 0x89, 0x9A, 0xBB, 0xAA, 0x99, 0x87, - 0x66, 0x54, 0x45, 0x56, 0x78, 0x89, 0xAB, 0xBA, 0xAA, 0x98, 0x77, 0x65, - 0x55, 0x56, 0x67, 0x88, 0x9A, 0xBB, 0xAA, 0xA9, 0x88, 0x76, 0x66, 0x56, - 0x66, 0x78, 0x99, 0xBB, 0xBA, 0xBA, 0x99, 0x87, 0x76, 0x66, 0x66, 0x77, - 0x89, 0xAB, 0xCB, 0xAB, 0xAA, 0x98, 0x88, 0x77, 0x77, 0x77, 0x89, 0x9A, - 0xBC, 0xCB, 0xBB, 0xAA, 0x99, 0x88, 0x88, 0x88, 0x89, 0x9A, 0xBC, 0xCC, - 0xBC, 0xBB, 0xAA, 0x99, 0x99, 0x88, 0x99, 0x9A, 0xAB, 0xCD, 0xCB, 0xCB, - 0xBB, 0xAA, 0xA9, 0x99, 0x9A, 0xAA, 0xBB, 0xCC, 0xDD, 0xBD, 0xDC, 0xBB, - 0xBB, 0xAA, 0xAA, 0xAB, 0xBB, 0xCC, 0xDE, 0xDB, 0xDD, 0xCC, 0xCB, 0xBB, - 0xBB, 0xBC, 0xCC, 0xCD, 0xDD, 0xED, 0x8B, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, - 0xBB, 0xBC, 0xCD, 0xDD, 0xC0, 0x00, 0x00, 0x00, - ], - [ - 0xEE, 0xFF, 0xDF, 0xDD, 0xCC, 0xCC, 0xDD, 0xCC, 0xCC, 0xCC, 0x7F, 0xFF, - 0xFF, 0xFD, 0xDE, 0xDD, 0xDE, 0xDE, 0xEF, 0xFF, 0xFE, 0xFF, 0xFF, 0xED, - 0xCD, 0xCC, 0xCC, 0xDC, 0xDD, 0xEE, 0xFF, 0xDF, 0xFF, 0xDE, 0xCC, 0xBB, - 0xBB, 0xBB, 0xBC, 0xDD, 0xFE, 0xFE, 0xFF, 0xED, 0xCB, 0xAA, 0x99, 0xAA, - 0xAA, 0xBC, 0xCE, 0xEF, 0xEE, 0xED, 0xCB, 0xA9, 0x88, 0x88, 0x89, 0xAB, - 0xCC, 0xDE, 0xFF, 0xDF, 0xDB, 0xA9, 0x87, 0x77, 0x77, 0x89, 0xAB, 0xCD, - 0xDE, 0xED, 0xFC, 0xBA, 0x97, 0x66, 0x55, 0x67, 0x89, 0xAB, 0xCE, 0xED, - 0xDE, 0xCB, 0xA8, 0x75, 0x44, 0x45, 0x67, 0x8A, 0xBC, 0xDE, 0xED, 0xEC, - 0xB9, 0x87, 0x54, 0x33, 0x45, 0x78, 0xAB, 0xCE, 0xFF, 0xDE, 0xCB, 0x98, - 0x75, 0x43, 0x34, 0x57, 0x89, 0xBC, 0xDE, 0xFD, 0xDC, 0xBA, 0x97, 0x65, - 0x44, 0x46, 0x78, 0xAB, 0xCD, 0xFE, 0xDE, 0xCB, 0xA9, 0x87, 0x65, 0x56, - 0x67, 0x9A, 0xBC, 0xDF, 0xDD, 0xED, 0xCB, 0xA9, 0x87, 0x77, 0x77, 0x89, - 0xAC, 0xDF, 0xFF, 0xEF, 0xDC, 0xBB, 0xA9, 0x88, 0x88, 0x99, 0xAB, 0xCD, - 0xFF, 0xFF, 0xFD, 0xDC, 0xBB, 0xAA, 0x99, 0x9A, 0xAB, 0xCE, 0xDF, 0xFF, - 0xDF, 0xFD, 0xDC, 0xBB, 0xBB, 0xBB, 0xBC, 0xCD, 0xEF, 0xFF, 0xFD, 0xFF, - 0xDE, 0xCC, 0xCC, 0xCC, 0xCD, 0xDD, 0xEE, 0xFF, 0xFF, 0xDF, 0xEF, 0xEE, - 0xED, 0xDD, 0xDD, 0xDD, 0xFF, 0xFF, 0xFF, 0xFD, 0xFE, 0xEF, 0xFE, 0xEE, - 0xEF, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7C, 0xCC, 0xDD, 0xDD, 0xED, 0xDE, - 0xEE, 0xEF, 0xFF, 0xFF, 0xF0, 0x00, 0x00, 0x00, - ], - [ - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xDC, 0xCC, 0xCB, 0xBB, 0x7F, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xDD, 0xFF, 0xFF, 0xFC, 0xFF, 0xFF, 0xFF, - 0xFF, 0xDD, 0xFD, 0xDF, 0xFF, 0xDF, 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0xCC, - 0xCC, 0xCD, 0xFF, 0xFD, 0xFF, 0xFD, 0xFF, 0xFF, 0xFC, 0xDB, 0xBA, 0xBB, - 0xCB, 0xDD, 0xFD, 0xFF, 0xFF, 0xFF, 0xFD, 0xCB, 0xA9, 0x99, 0x9A, 0xBC, - 0xDD, 0xFF, 0xFF, 0xFF, 0xFF, 0xCB, 0x98, 0x77, 0x78, 0x9A, 0xBC, 0xDD, - 0xFD, 0xFF, 0xFF, 0xDD, 0xA8, 0x76, 0x55, 0x68, 0x9A, 0xBC, 0xFF, 0xFF, - 0xFF, 0xFC, 0xC9, 0x76, 0x54, 0x45, 0x68, 0xAB, 0xCC, 0xFF, 0xFF, 0xFD, - 0xCA, 0x97, 0x54, 0x23, 0x45, 0x79, 0xBC, 0xFF, 0xFF, 0xFF, 0xDC, 0xB9, - 0x76, 0x43, 0x24, 0x57, 0x9A, 0xCF, 0xFF, 0xFF, 0xFD, 0xDB, 0xA8, 0x65, - 0x44, 0x56, 0x79, 0xBD, 0xFF, 0xFF, 0xFF, 0xDC, 0xBA, 0x87, 0x65, 0x56, - 0x78, 0xAC, 0xDF, 0xFF, 0xFD, 0xFC, 0xFD, 0xBA, 0x88, 0x77, 0x78, 0x9A, - 0xCD, 0xFF, 0xFF, 0xDF, 0xFF, 0xDC, 0xBA, 0x99, 0x99, 0xAB, 0xCD, 0xFF, - 0xFF, 0xFD, 0xFF, 0xFD, 0xDC, 0xBB, 0xBA, 0xBB, 0xDD, 0xFF, 0xFF, 0xFF, - 0xDF, 0xFD, 0xFF, 0xDD, 0xDC, 0xCB, 0xDC, 0xFF, 0xFF, 0xFF, 0xFC, 0xFF, - 0xDF, 0xDD, 0xFD, 0xFD, 0xDD, 0xFF, 0xFF, 0xFF, 0xFF, 0xCF, 0xFF, 0xFD, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFD, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7C, 0xCB, 0xDD, 0xCF, 0xFF, 0xDF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00, 0x00, - ], - [ - 0xEF, 0xEF, 0xFD, 0xDC, 0xDC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0x9F, 0xFF, - 0xFE, 0xDD, 0xDC, 0xCC, 0xCC, 0xCC, 0xDD, 0xDF, 0xFD, 0xFF, 0xFF, 0xCC, - 0xCB, 0xBB, 0xBB, 0xBB, 0xBC, 0xDC, 0xEF, 0xEF, 0xFD, 0xDC, 0xBA, 0xAA, - 0x99, 0xAA, 0xAB, 0xCC, 0xDE, 0xFD, 0xFE, 0xDC, 0xBA, 0x99, 0x88, 0x89, - 0x9A, 0xAA, 0xCC, 0xDD, 0xED, 0xDC, 0xBA, 0x98, 0x87, 0x77, 0x78, 0x89, - 0xAB, 0xCD, 0xEE, 0xDD, 0xBA, 0x98, 0x77, 0x66, 0x66, 0x78, 0x89, 0xAC, - 0xCD, 0xDD, 0xCB, 0xA9, 0x87, 0x65, 0x55, 0x66, 0x78, 0x9A, 0xBC, 0xED, - 0xDC, 0xBA, 0x87, 0x65, 0x54, 0x45, 0x66, 0x79, 0xAB, 0xCD, 0xEC, 0xCB, - 0xA8, 0x76, 0x54, 0x44, 0x55, 0x67, 0x89, 0xBD, 0xEE, 0xCC, 0xBA, 0x87, - 0x65, 0x54, 0x44, 0x56, 0x78, 0xAB, 0xDE, 0xEC, 0xCB, 0x98, 0x76, 0x65, - 0x54, 0x55, 0x67, 0x8A, 0xBC, 0xFE, 0xCC, 0xBA, 0x98, 0x76, 0x65, 0x55, - 0x67, 0x89, 0xAB, 0xDF, 0xFC, 0xCB, 0xA9, 0x88, 0x76, 0x66, 0x67, 0x78, - 0x9A, 0xBE, 0xFF, 0xCC, 0xCB, 0xA9, 0x88, 0x77, 0x77, 0x78, 0x9A, 0xBC, - 0xFF, 0xFC, 0xDD, 0xBB, 0xAA, 0x99, 0x88, 0x89, 0x9A, 0xBC, 0xDF, 0xFF, - 0xDD, 0xDC, 0xBB, 0xBA, 0xA9, 0x9A, 0xAA, 0xBC, 0xDE, 0xFF, 0xFC, 0xED, - 0xCC, 0xCC, 0xBB, 0xBB, 0xBC, 0xCC, 0xDE, 0xFF, 0xFF, 0xDD, 0xDD, 0xED, - 0xDC, 0xDC, 0xDD, 0xDD, 0xFF, 0xFF, 0xFF, 0xFC, 0xFF, 0xFE, 0xDE, 0xDD, - 0xDD, 0xDE, 0xFF, 0xFF, 0xFF, 0xFF, 0x9C, 0xDD, 0xDD, 0xDF, 0xDE, 0xEE, - 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00, 0x00, - ], - [ - 0xFF, 0xFF, 0xFE, 0xDC, 0xCC, 0xCC, 0xCC, 0xCD, 0xDD, 0xDE, 0xBF, 0xFF, - 0xFE, 0xDC, 0xCC, 0xBB, 0xBC, 0xCC, 0xDD, 0xEF, 0xFF, 0xFF, 0xFD, 0xCC, - 0xBB, 0xAA, 0xAA, 0xAB, 0xBC, 0xCD, 0xEF, 0xEF, 0xFD, 0xCB, 0xAA, 0x99, - 0x99, 0x99, 0xAA, 0xBC, 0xDD, 0xFE, 0xFE, 0xCB, 0xA9, 0x98, 0x88, 0x88, - 0x89, 0x9A, 0xBC, 0xDF, 0xDD, 0xDC, 0xA9, 0x88, 0x77, 0x77, 0x77, 0x89, - 0x9A, 0xBC, 0xDD, 0xDC, 0xBA, 0x98, 0x76, 0x66, 0x66, 0x77, 0x89, 0xAB, - 0xCD, 0xDC, 0xCB, 0x98, 0x76, 0x65, 0x55, 0x56, 0x77, 0x89, 0xAC, 0xDD, - 0xCC, 0xA9, 0x87, 0x65, 0x55, 0x55, 0x66, 0x78, 0x9A, 0xBD, 0xDC, 0xBA, - 0x98, 0x76, 0x55, 0x44, 0x55, 0x67, 0x89, 0xAB, 0xDD, 0xCB, 0xA9, 0x87, - 0x65, 0x54, 0x45, 0x56, 0x78, 0x9A, 0xBD, 0xDC, 0xBA, 0x98, 0x76, 0x65, - 0x55, 0x55, 0x67, 0x89, 0xAC, 0xDE, 0xCC, 0xA9, 0x87, 0x76, 0x65, 0x55, - 0x66, 0x78, 0x9B, 0xCD, 0xEC, 0xCB, 0xA9, 0x87, 0x76, 0x66, 0x66, 0x78, - 0x9A, 0xBC, 0xEF, 0xCC, 0xBA, 0x99, 0x87, 0x77, 0x77, 0x78, 0x89, 0xAC, - 0xDF, 0xFD, 0xDC, 0xBA, 0x99, 0x88, 0x88, 0x88, 0x99, 0xAB, 0xCE, 0xFF, - 0xDD, 0xDC, 0xBA, 0xA9, 0x99, 0x99, 0x9A, 0xBB, 0xCD, 0xFF, 0xFD, 0xED, - 0xCC, 0xBB, 0xAA, 0xAA, 0xAB, 0xBC, 0xDD, 0xFF, 0xFF, 0xDF, 0xED, 0xDC, - 0xCC, 0xBB, 0xBC, 0xCC, 0xDE, 0xFF, 0xFF, 0xFE, 0xFF, 0xEE, 0xDD, 0xDC, - 0xDD, 0xDD, 0xEF, 0xFF, 0xFF, 0xFF, 0xBE, 0xED, 0xDD, 0xDD, 0xDD, 0xDD, - 0xEF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00, 0x00, - ], - [ - 0xFF, 0xFF, 0xFF, 0xFE, 0xDD, 0xFD, 0xEC, 0xDC, 0xCD, 0xCE, 0x9F, 0xFF, - 0xFF, 0xFD, 0xDD, 0xCC, 0xDC, 0xDD, 0xDE, 0xEF, 0xFD, 0xFF, 0xFF, 0xED, - 0xDC, 0xCB, 0xBB, 0xCC, 0xCC, 0xDD, 0xEF, 0xDF, 0xFE, 0xDD, 0xCB, 0xAA, - 0xAA, 0xAA, 0xBC, 0xCD, 0xDD, 0xFD, 0xFF, 0xDC, 0xBA, 0x99, 0x98, 0x99, - 0x9A, 0xAB, 0xCC, 0xDD, 0xDF, 0xED, 0xBA, 0x98, 0x87, 0x77, 0x88, 0x9A, - 0xAB, 0xCD, 0xFD, 0xED, 0xCB, 0x98, 0x77, 0x66, 0x67, 0x78, 0x9A, 0xAC, - 0xDD, 0xDD, 0xEB, 0xA9, 0x87, 0x65, 0x55, 0x66, 0x78, 0x9A, 0xBC, 0xDD, - 0xDD, 0xBA, 0x97, 0x65, 0x54, 0x45, 0x67, 0x89, 0xAB, 0xDE, 0xDD, 0xCB, - 0xA9, 0x76, 0x54, 0x44, 0x45, 0x67, 0x8A, 0xBC, 0xFD, 0xDD, 0xBA, 0x97, - 0x65, 0x44, 0x44, 0x56, 0x78, 0xAB, 0xCD, 0xDD, 0xDC, 0xA9, 0x87, 0x65, - 0x44, 0x55, 0x67, 0x9A, 0xBD, 0xEE, 0xDD, 0xBA, 0x98, 0x76, 0x65, 0x55, - 0x67, 0x89, 0xAC, 0xDD, 0xED, 0xDC, 0xBA, 0x98, 0x77, 0x66, 0x67, 0x78, - 0x9B, 0xCF, 0xFE, 0xDD, 0xDB, 0xAA, 0x98, 0x87, 0x77, 0x88, 0x9A, 0xBD, - 0xDF, 0xFD, 0xDD, 0xBB, 0xA9, 0x99, 0x89, 0x89, 0xAA, 0xBD, 0xEE, 0xFF, - 0xDE, 0xDC, 0xBB, 0xAA, 0xAA, 0xAA, 0xAB, 0xBD, 0xDF, 0xFF, 0xFD, 0xDD, - 0xDC, 0xCB, 0xBB, 0xBB, 0xBC, 0xCD, 0xDF, 0xFF, 0xFF, 0xDE, 0xDD, 0xDC, - 0xCC, 0xCC, 0xCC, 0xDD, 0xFE, 0xFF, 0xFF, 0xFC, 0xFF, 0xDF, 0xFE, 0xDE, - 0xDD, 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0x9C, 0xCC, 0xDC, 0xDC, 0xDD, 0xDD, - 0xDD, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00, 0x00, - ], - [ - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xBB, 0xBB, 0xCB, 0x7F, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFD, 0xFF, 0xCF, 0xFF, 0xFF, 0xFF, 0xDF, 0xFF, 0xFF, 0xFD, 0xFF, - 0xCD, 0xDC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xBB, 0xCC, - 0xCC, 0xCD, 0xFF, 0xFF, 0xDF, 0xFF, 0xFF, 0xCB, 0xAA, 0xA9, 0xAB, 0xBD, - 0xCF, 0xFF, 0xFF, 0xFF, 0xFF, 0xCC, 0xA9, 0x88, 0x88, 0x9A, 0xBC, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFC, 0xB9, 0x76, 0x66, 0x78, 0x9B, 0xCD, 0xFF, 0xFF, - 0xFF, 0xFF, 0xCA, 0x86, 0x54, 0x45, 0x79, 0xAB, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFB, 0xA8, 0x64, 0x22, 0x46, 0x8A, 0xCF, 0xFF, 0xFF, 0xFF, 0xFD, 0xBA, - 0x86, 0x42, 0x24, 0x68, 0xAB, 0xDF, 0xFF, 0xFF, 0xFF, 0xDC, 0xB8, 0x75, - 0x44, 0x56, 0x8A, 0xCF, 0xFF, 0xFF, 0xDF, 0xFD, 0xCB, 0x98, 0x76, 0x67, - 0x89, 0xBC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, 0xBA, 0xA9, 0x88, 0x89, 0xBB, - 0xCF, 0xFF, 0xFF, 0xDF, 0xFF, 0xCC, 0xBB, 0xAA, 0xAA, 0xBC, 0xDF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFD, 0xCC, 0xCC, 0xBC, 0xCC, 0xCF, 0xFF, 0xFF, 0xFF, - 0xCF, 0xFD, 0xFF, 0xCC, 0xDD, 0xFD, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xDD, 0xDF, 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0xDF, 0xFF, 0xFF, - 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7B, 0xCD, 0xDC, 0xCD, 0xDF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00, 0x00, - ], - [ - 0xFF, 0xDF, 0xFD, 0xCB, 0xBF, 0xBC, 0xDC, 0xBA, 0xCB, 0xCB, 0x7F, 0xDF, - 0xDD, 0xDF, 0xCC, 0xBC, 0xFC, 0xFC, 0xFF, 0xFF, 0xFC, 0xDD, 0xFF, 0xDD, - 0xDC, 0xFB, 0xDB, 0xCB, 0xCF, 0xDC, 0xFF, 0xBC, 0xFF, 0xFA, 0xFB, 0xFB, - 0xAB, 0xCC, 0xCC, 0xFF, 0xFF, 0xFF, 0xFD, 0xFC, 0xBB, 0xAA, 0xA9, 0x9A, - 0xBB, 0xCC, 0xCC, 0xFF, 0xCC, 0xFD, 0xCB, 0x9B, 0x89, 0x88, 0x99, 0xAB, - 0xAD, 0xCD, 0xFF, 0xFC, 0xBA, 0xAA, 0x97, 0x77, 0x78, 0x89, 0xAA, 0xBF, - 0xFF, 0xCB, 0xFC, 0xB9, 0x97, 0x76, 0x66, 0x77, 0x89, 0xAA, 0xFC, 0xFB, - 0xBC, 0xBB, 0xA9, 0x76, 0x54, 0x55, 0x67, 0x8A, 0xAC, 0xDC, 0xDD, 0xCC, - 0xB9, 0x97, 0x64, 0x23, 0x46, 0x78, 0x9C, 0xCB, 0xFC, 0xCF, 0xBB, 0xA8, - 0x76, 0x43, 0x24, 0x67, 0x99, 0xAC, 0xCF, 0xCF, 0xBC, 0xC9, 0x97, 0x65, - 0x44, 0x56, 0x78, 0x9A, 0xCD, 0xFF, 0xDC, 0xCA, 0xA9, 0x87, 0x66, 0x66, - 0x78, 0x9A, 0xBB, 0xFF, 0xFF, 0xFF, 0xCB, 0xA9, 0x87, 0x77, 0x77, 0x8A, - 0xBC, 0xBC, 0xFC, 0xFC, 0xCF, 0xCC, 0x99, 0x98, 0x88, 0x99, 0x9A, 0xCF, - 0xCF, 0xFF, 0xFF, 0xFC, 0xCB, 0xAA, 0x9A, 0xA9, 0xAA, 0xCF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFE, 0xEC, 0xAA, 0xAB, 0xAC, 0xCC, 0xDF, 0xFF, 0xFC, 0xDF, - 0xCD, 0xCD, 0xBC, 0xCB, 0xCF, 0xFB, 0xDC, 0xFD, 0xFF, 0xDF, 0xFF, 0xDC, - 0xFD, 0xDC, 0xFC, 0xDF, 0xDD, 0xCF, 0xFF, 0xFA, 0xDC, 0xDF, 0xFD, 0xFD, - 0xCD, 0xDF, 0xDF, 0xDD, 0xDF, 0xFF, 0x6C, 0xBB, 0xCC, 0xCC, 0xDB, 0xFD, - 0xCF, 0xFF, 0xDD, 0xFF, 0xD0, 0x00, 0x00, 0x00, - ], - [ - 0xBC, 0xCB, 0xAA, 0xAA, 0x99, 0x99, 0xA9, 0xAA, 0xAA, 0xAB, 0x8C, 0xCC, - 0xBB, 0xBA, 0xAA, 0xAA, 0xAA, 0xAB, 0xCB, 0xCD, 0xDB, 0xBC, 0xCA, 0xBA, - 0x9A, 0x99, 0x99, 0x9A, 0xAA, 0xBB, 0xCE, 0xCB, 0xBB, 0xAA, 0x99, 0x98, - 0x88, 0x89, 0x9A, 0xAB, 0xBC, 0xCB, 0xBB, 0xA9, 0x98, 0x88, 0x88, 0x88, - 0x89, 0x99, 0xAB, 0xBC, 0xBA, 0xBA, 0x98, 0x87, 0x77, 0x77, 0x78, 0x89, - 0x9A, 0xAB, 0xCB, 0xAB, 0xA9, 0x87, 0x77, 0x66, 0x67, 0x77, 0x89, 0x9A, - 0xBC, 0xBA, 0xA9, 0x98, 0x76, 0x66, 0x66, 0x66, 0x77, 0x89, 0x9A, 0xBB, - 0xAA, 0x98, 0x87, 0x66, 0x55, 0x56, 0x67, 0x78, 0x89, 0xAB, 0xBA, 0xA9, - 0x88, 0x76, 0x65, 0x44, 0x56, 0x67, 0x88, 0x9A, 0xBB, 0x9A, 0x98, 0x87, - 0x66, 0x54, 0x45, 0x56, 0x78, 0x89, 0xAA, 0xB9, 0xA9, 0x88, 0x77, 0x65, - 0x55, 0x56, 0x67, 0x88, 0x9A, 0xBB, 0x9A, 0xA9, 0x87, 0x76, 0x66, 0x56, - 0x66, 0x78, 0x99, 0xAB, 0xBA, 0xBA, 0x99, 0x87, 0x76, 0x66, 0x66, 0x77, - 0x89, 0xAB, 0xCB, 0xAB, 0xA9, 0x98, 0x88, 0x77, 0x77, 0x77, 0x88, 0x9A, - 0xBC, 0xDA, 0xBB, 0xA9, 0x98, 0x88, 0x87, 0x88, 0x88, 0x9A, 0xAB, 0xCB, - 0xAC, 0xBA, 0xAA, 0x99, 0x98, 0x88, 0x89, 0x99, 0xAB, 0xCD, 0xCA, 0xCB, - 0xBA, 0xBA, 0xA9, 0x99, 0x99, 0xAA, 0xAB, 0xCC, 0xDC, 0xBD, 0xCC, 0xBB, - 0xBA, 0xAA, 0xBA, 0xAA, 0xBB, 0xBE, 0xED, 0xCB, 0xCC, 0xDD, 0xCB, 0xBB, - 0xBB, 0xBB, 0xBB, 0xCD, 0xFE, 0xFE, 0x8C, 0xBB, 0xBB, 0xAA, 0xAB, 0xBB, - 0xBB, 0xCC, 0xCD, 0xDD, 0xC0, 0x00, 0x00, 0x00, - ], - [ - 0xBC, 0xBB, 0xAA, 0xA9, 0x99, 0x99, 0x99, 0xAA, 0xAB, 0xBC, 0xAC, 0xCC, - 0xBA, 0xAA, 0x99, 0x99, 0x9A, 0xAA, 0xBB, 0xBC, 0xDC, 0xBC, 0xBA, 0xA9, - 0x99, 0x98, 0x99, 0x99, 0x9A, 0xAB, 0xBC, 0xBB, 0xBA, 0xA9, 0x98, 0x88, - 0x88, 0x88, 0x89, 0x9A, 0xAB, 0xCB, 0xAB, 0xA9, 0x98, 0x87, 0x77, 0x77, - 0x88, 0x89, 0x9A, 0xBB, 0xBA, 0xA9, 0x98, 0x77, 0x77, 0x77, 0x77, 0x78, - 0x89, 0x9A, 0xBA, 0xAA, 0x98, 0x87, 0x76, 0x66, 0x66, 0x77, 0x78, 0x89, - 0xAB, 0xA9, 0xA9, 0x87, 0x76, 0x66, 0x66, 0x66, 0x77, 0x88, 0x9A, 0xAA, - 0x99, 0x98, 0x77, 0x66, 0x65, 0x66, 0x66, 0x77, 0x89, 0x9A, 0xA9, 0x99, - 0x87, 0x76, 0x65, 0x55, 0x66, 0x67, 0x78, 0x99, 0xAA, 0x99, 0x88, 0x77, - 0x66, 0x65, 0x55, 0x66, 0x77, 0x88, 0x9A, 0xA9, 0x99, 0x87, 0x76, 0x66, - 0x65, 0x66, 0x67, 0x78, 0x99, 0xAA, 0x99, 0x98, 0x87, 0x76, 0x66, 0x66, - 0x66, 0x77, 0x89, 0xAA, 0xA9, 0xA9, 0x88, 0x77, 0x76, 0x66, 0x66, 0x77, - 0x88, 0x9A, 0xBA, 0xAA, 0x99, 0x88, 0x77, 0x77, 0x77, 0x77, 0x88, 0x99, - 0xAB, 0xBA, 0xAA, 0x99, 0x88, 0x87, 0x77, 0x77, 0x88, 0x99, 0xAB, 0xBB, - 0xAB, 0xAA, 0x99, 0x88, 0x88, 0x88, 0x88, 0x99, 0xAA, 0xBC, 0xCB, 0xBB, - 0xAA, 0x99, 0x99, 0x98, 0x99, 0x99, 0xAA, 0xBC, 0xDC, 0xBC, 0xBB, 0xBA, - 0xAA, 0x99, 0x99, 0x9A, 0xAB, 0xBC, 0xCD, 0xDC, 0xDC, 0xCB, 0xBA, 0xAA, - 0xAA, 0xAA, 0xAB, 0xBC, 0xCD, 0xED, 0xAC, 0xBB, 0xBA, 0xAA, 0xAA, 0xAA, - 0xAA, 0xBB, 0xCC, 0xDE, 0xD0, 0x00, 0x00, 0x00, - ], - [ - 0xBC, 0xBA, 0xBA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xBB, 0x8C, 0xCC, - 0xBB, 0xBA, 0xAA, 0xAA, 0xBB, 0xBB, 0xCD, 0xDC, 0xDB, 0xBC, 0xBC, 0xA9, - 0x99, 0x99, 0x99, 0x9A, 0xAA, 0xBB, 0xCC, 0xAB, 0xCA, 0xAA, 0x98, 0x88, - 0x88, 0x89, 0x99, 0xAA, 0xCC, 0xBA, 0xBB, 0xA9, 0x98, 0x88, 0x78, 0x88, - 0x88, 0x99, 0xAA, 0xBB, 0xAA, 0xAA, 0x98, 0x87, 0x77, 0x77, 0x77, 0x88, - 0x99, 0xAA, 0xBA, 0xBA, 0x98, 0x87, 0x76, 0x66, 0x67, 0x77, 0x88, 0x9A, - 0xBA, 0xAA, 0xA9, 0x88, 0x76, 0x66, 0x66, 0x66, 0x77, 0x88, 0xAA, 0xAA, - 0xAA, 0x98, 0x87, 0x66, 0x55, 0x56, 0x67, 0x78, 0x99, 0xAA, 0xAA, 0xA9, - 0x88, 0x76, 0x65, 0x44, 0x56, 0x67, 0x88, 0x9A, 0xAA, 0x9A, 0x98, 0x87, - 0x66, 0x54, 0x45, 0x66, 0x78, 0x89, 0xAB, 0xAA, 0xB9, 0x98, 0x76, 0x66, - 0x55, 0x56, 0x67, 0x88, 0x9A, 0xBA, 0xAA, 0x99, 0x88, 0x77, 0x66, 0x66, - 0x66, 0x78, 0x99, 0xAB, 0xBA, 0xAA, 0x98, 0x87, 0x77, 0x66, 0x66, 0x77, - 0x89, 0x9A, 0xBB, 0xAB, 0xA9, 0x98, 0x87, 0x77, 0x77, 0x77, 0x89, 0x9A, - 0xBB, 0xAB, 0xDA, 0xA9, 0x98, 0x88, 0x77, 0x88, 0x88, 0x9A, 0xAC, 0xBB, - 0xBC, 0xAB, 0xA9, 0x99, 0x98, 0x88, 0x89, 0x9A, 0xAA, 0xBD, 0xCB, 0xBB, - 0xBB, 0xA9, 0xA9, 0x99, 0x99, 0xAA, 0xAC, 0xBC, 0xCC, 0xBC, 0xCC, 0xBA, - 0xAA, 0xAA, 0xAA, 0xAA, 0xAB, 0xBC, 0xCD, 0xCB, 0xCD, 0xBB, 0xCB, 0xBA, - 0xBB, 0xBB, 0xAC, 0xBB, 0xDD, 0xDD, 0x7A, 0xAA, 0xAA, 0xBA, 0xAA, 0xAA, - 0xAB, 0xBB, 0xBB, 0xCD, 0xB0, 0x00, 0x00, 0x00, - ], - [ - 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xBF, 0xDF, 0xBB, 0xAB, 0xBF, 0x6F, 0xFF, - 0xFF, 0xFF, 0xFF, 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, 0xFF, 0xFF, 0xFF, - 0xFF, 0xCC, 0xFD, 0xFF, 0xDF, 0xFF, 0xFF, 0xDF, 0xFF, 0xFF, 0xFF, 0xFC, - 0xBB, 0xDF, 0xFC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xBC, 0xBF, - 0xCF, 0xBF, 0xFF, 0xFF, 0xFD, 0xFF, 0xFD, 0xFF, 0xBB, 0xBA, 0xAB, 0xFC, - 0xFC, 0xFF, 0xFF, 0xFF, 0xFF, 0xDC, 0xCA, 0x99, 0x99, 0xAC, 0xDF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xCD, 0xBA, 0x87, 0x77, 0x89, 0x9B, 0xBF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xCB, 0x97, 0x54, 0x46, 0x8A, 0xDB, 0xFF, 0xFF, 0xFF, 0xFF, - 0xCD, 0xA9, 0x64, 0x12, 0x57, 0x9B, 0xBF, 0xDF, 0xFF, 0xFF, 0xFF, 0xBA, - 0x97, 0x52, 0x24, 0x79, 0xAB, 0xCF, 0xFF, 0xFF, 0xFF, 0xFC, 0xA9, 0x86, - 0x54, 0x57, 0x9B, 0xFD, 0xFF, 0xFD, 0xFF, 0xFC, 0xCC, 0xA9, 0x87, 0x77, - 0x8A, 0xAC, 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0xBB, 0x99, 0x99, 0x9A, 0xAF, - 0xCF, 0xFF, 0xFF, 0xDF, 0xFF, 0xBF, 0xAC, 0xBA, 0xAA, 0xCC, 0xBF, 0xFF, - 0xFF, 0xFD, 0xFF, 0xFF, 0xCB, 0xBC, 0xBB, 0xDF, 0xDD, 0xFF, 0xFF, 0xFF, - 0xDF, 0xFF, 0xDF, 0xFC, 0xCD, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFD, 0xFD, 0xDF, 0xFC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xCF, 0xFF, 0xFD, - 0xDF, 0xFC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x6B, 0xCF, 0xDF, 0xDF, 0xFF, 0xCF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00, 0x00, - ], - [ - 0xFF, 0xFF, 0xAF, 0xFF, 0xBF, 0xAB, 0xFB, 0x9F, 0xBB, 0xAB, 0x6B, 0xFF, - 0xFB, 0xFF, 0xAF, 0xAA, 0xFB, 0xFA, 0xBB, 0xFF, 0xFF, 0xFF, 0xFB, 0xBF, - 0xB9, 0xFB, 0xBA, 0xBB, 0xBF, 0xFF, 0xFF, 0xFA, 0xFF, 0xFA, 0xFB, 0xBB, - 0xAA, 0xFF, 0xFA, 0xBF, 0xBF, 0xFF, 0xBF, 0xFA, 0xAF, 0xBB, 0x99, 0x9A, - 0xA9, 0xBF, 0xFB, 0xFB, 0xAB, 0xFB, 0xBA, 0xA9, 0x98, 0x9A, 0x99, 0xAA, - 0xFB, 0xBB, 0xFF, 0xAF, 0xFA, 0xAA, 0x98, 0x78, 0x78, 0x89, 0xAF, 0xBF, - 0xAF, 0xFB, 0xBF, 0xBA, 0x99, 0x76, 0x66, 0x88, 0x99, 0xBF, 0xFF, 0xBF, - 0xFF, 0xFA, 0x98, 0x77, 0x54, 0x56, 0x79, 0x9B, 0xBF, 0xBB, 0xBB, 0xAF, - 0xAB, 0xA8, 0x64, 0x22, 0x57, 0x88, 0x9A, 0xFF, 0xAB, 0xAF, 0x99, 0xB8, - 0x77, 0x52, 0x25, 0x79, 0xA9, 0xAA, 0xFF, 0xFA, 0xBB, 0xBA, 0x98, 0x76, - 0x54, 0x66, 0x78, 0x99, 0xBF, 0xFB, 0x9F, 0xFA, 0x9A, 0x98, 0x76, 0x66, - 0x78, 0x8A, 0xFA, 0xAB, 0xAF, 0xFB, 0xBA, 0xB8, 0x98, 0x88, 0x78, 0x9A, - 0xAB, 0xFF, 0xFB, 0xAF, 0xBF, 0xBA, 0xAA, 0x99, 0xA9, 0x9F, 0x8A, 0xFA, - 0xFF, 0xAA, 0xFF, 0xBB, 0xAF, 0xA9, 0xA8, 0x89, 0xAB, 0xFA, 0xBB, 0xFF, - 0xFB, 0xFF, 0xFF, 0xFB, 0xA9, 0xAB, 0xAF, 0xBF, 0xBB, 0xBB, 0xBB, 0xFF, - 0xBF, 0xFB, 0xFF, 0xFA, 0xBF, 0xAF, 0xAF, 0xFB, 0xFF, 0xAF, 0xBF, 0xFF, - 0xFF, 0xBB, 0xFF, 0xFF, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFB, 0xFF, 0xFB, 0xFF, 0xFF, 0xFB, 0x6F, 0xAA, 0xAB, 0xAB, 0xBA, 0xFA, - 0xFA, 0xBB, 0xFF, 0xFB, 0xF0, 0x00, 0x00, 0x00, - ], - [ - 0xFF, 0xDE, 0xFF, 0xFF, 0xFF, 0xDC, 0xCC, 0xCF, 0xCD, 0xCF, 0x6F, 0xFF, - 0xFF, 0xFF, 0xFF, 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xDC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFD, 0xCD, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xCF, 0xDC, - 0xFC, 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xDD, 0xCC, 0xDC, 0xDD, - 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0xCF, 0xEB, 0xBA, 0xBB, 0xBC, 0xDD, 0xFD, - 0xDF, 0xFC, 0xFF, 0xDD, 0xCB, 0x98, 0x78, 0x9A, 0xCC, 0xFF, 0xFF, 0xFF, - 0xDF, 0xFF, 0xFD, 0xB8, 0x54, 0x46, 0x9B, 0xCD, 0xDF, 0xFF, 0xFF, 0xFF, - 0xCD, 0xDA, 0x74, 0x22, 0x48, 0xAC, 0xFC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, - 0xA7, 0x42, 0x14, 0x7A, 0xDF, 0xFF, 0xFF, 0xDD, 0xFF, 0xFD, 0xDA, 0x96, - 0x44, 0x58, 0xBC, 0xFD, 0xFF, 0xFF, 0xFF, 0xDF, 0xFC, 0xDA, 0x97, 0x78, - 0xAC, 0xDD, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xFC, 0xCA, 0xAA, 0xAB, 0xCF, - 0xFF, 0xFD, 0xFF, 0xDF, 0xFF, 0xFD, 0xFC, 0xDC, 0xBC, 0xCD, 0xDF, 0xDF, - 0xFF, 0xFC, 0xFF, 0xFD, 0xFF, 0xDF, 0xCC, 0xFD, 0xFD, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xDF, 0xFF, 0xFD, 0xFF, 0xFF, 0xFF, 0xFF, - 0xDD, 0xFF, 0xFF, 0xCF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xDF, 0xFF, 0xFF, 0xDF, 0xFF, 0xFF, 0xFF, 0xFC, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x6B, 0xDD, 0xCD, 0xDD, 0xFF, 0xDF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00, 0x00, - ], - [ - 0xFF, 0xFF, 0xFF, 0xDD, 0xDD, 0xCD, 0xDD, 0xDE, 0xDF, 0xFF, 0xCF, 0xFF, - 0xFF, 0xDC, 0xCC, 0xCB, 0xCC, 0xBD, 0xEE, 0xEF, 0xFF, 0xFF, 0xFF, 0xDC, - 0xBB, 0xBA, 0xAA, 0xBB, 0xCC, 0xDF, 0xEF, 0xFF, 0xFD, 0xCC, 0xBA, 0x99, - 0x99, 0x99, 0xAA, 0xBC, 0xDF, 0xFF, 0xFE, 0xDC, 0xAA, 0x98, 0x88, 0x88, - 0x89, 0xAB, 0xBC, 0xDE, 0xFF, 0xDC, 0xB9, 0x98, 0x77, 0x77, 0x77, 0x89, - 0xAA, 0xCC, 0xFF, 0xFC, 0xCA, 0x98, 0x76, 0x66, 0x66, 0x77, 0x89, 0xAB, - 0xCD, 0xFE, 0xCB, 0xA8, 0x76, 0x65, 0x55, 0x56, 0x77, 0x99, 0xBC, 0xDE, - 0xDC, 0xB9, 0x87, 0x65, 0x55, 0x55, 0x66, 0x78, 0x9A, 0xCD, 0xDC, 0xCA, - 0x98, 0x76, 0x55, 0x44, 0x55, 0x67, 0x89, 0xAB, 0xDD, 0xCC, 0xA9, 0x87, - 0x65, 0x54, 0x45, 0x56, 0x78, 0x9A, 0xCD, 0xEC, 0xCA, 0x98, 0x76, 0x55, - 0x55, 0x55, 0x67, 0x89, 0xAB, 0xDF, 0xCC, 0xB9, 0x87, 0x76, 0x55, 0x55, - 0x66, 0x78, 0xAB, 0xCF, 0xFD, 0xCB, 0xA9, 0x87, 0x76, 0x66, 0x66, 0x78, - 0x9A, 0xBC, 0xFF, 0xDD, 0xCA, 0xA9, 0x87, 0x77, 0x77, 0x78, 0x9A, 0xBC, - 0xDF, 0xFD, 0xDC, 0xBA, 0xA9, 0x88, 0x88, 0x88, 0x9A, 0xAC, 0xDF, 0xFF, - 0xFF, 0xDC, 0xBA, 0xA9, 0x99, 0x99, 0xAA, 0xBB, 0xDF, 0xFF, 0xFF, 0xFF, - 0xDD, 0xCB, 0xBA, 0xAA, 0xAB, 0xBC, 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0xDC, - 0xDC, 0xCC, 0xCC, 0xCD, 0xDE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xEE, 0xDD, - 0xDD, 0xDE, 0xEF, 0xFF, 0xFF, 0xFF, 0xDF, 0xFF, 0xFE, 0xFE, 0xDD, 0xEF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00, 0x00, - ], - [ - 0xCF, 0xFE, 0xFD, 0xDC, 0xCF, 0xFD, 0xED, 0xCC, 0xBC, 0xEC, 0x7F, 0xEF, - 0xFF, 0xEF, 0xEF, 0xEE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, 0xDF, 0xDD, 0xFF, - 0xDD, 0xFD, 0xEF, 0xEF, 0xEE, 0xEF, 0xFF, 0xCF, 0xEF, 0xFF, 0xDF, 0xEF, - 0xDF, 0xDE, 0xEF, 0xEF, 0xFF, 0xFD, 0xEE, 0xFD, 0xFD, 0xDD, 0xDD, 0xCC, - 0xDD, 0xEE, 0xFE, 0xFD, 0xED, 0xFF, 0xEE, 0xDC, 0xCC, 0xBC, 0xBC, 0xCE, - 0xED, 0xFF, 0xFE, 0xEF, 0xCD, 0xFF, 0xBB, 0xAA, 0xAA, 0xBC, 0xDD, 0xEE, - 0xFF, 0xFF, 0xFF, 0xFC, 0xCB, 0x98, 0x77, 0x89, 0xBC, 0xDE, 0xFF, 0xFD, - 0xDE, 0xDF, 0xDC, 0xA8, 0x54, 0x46, 0x8A, 0xCF, 0xEF, 0xEF, 0xDC, 0xFF, - 0xDC, 0xCA, 0x74, 0x12, 0x47, 0xAC, 0xED, 0xEE, 0xFE, 0xEE, 0xEF, 0xFB, - 0xA7, 0x42, 0x24, 0x7A, 0xBD, 0xEE, 0xEF, 0xDE, 0xED, 0xDE, 0xCA, 0x86, - 0x44, 0x68, 0xAD, 0xDD, 0xEE, 0xFD, 0xDE, 0xEE, 0xFC, 0xB9, 0x87, 0x78, - 0xAB, 0xCF, 0xDD, 0xFF, 0xFD, 0xFF, 0xFC, 0xCC, 0xBA, 0x9A, 0xAB, 0xBE, - 0xEF, 0xEF, 0xFD, 0xDF, 0xFF, 0xFD, 0xCC, 0xCC, 0xCC, 0xDC, 0xCD, 0xFF, - 0xFF, 0xEF, 0xFF, 0xFE, 0xDE, 0xDD, 0xCC, 0xFD, 0xEF, 0xDF, 0xFF, 0xFE, - 0xFF, 0xFF, 0xED, 0xDD, 0xDD, 0xEF, 0xEF, 0xFF, 0xFF, 0xFF, 0xDE, 0xFF, - 0xFE, 0xFF, 0xED, 0xFE, 0xFE, 0xFF, 0xEF, 0xFF, 0xFF, 0xCE, 0xEF, 0xFF, - 0xFF, 0xFD, 0xDE, 0xFF, 0xEF, 0xFF, 0xFF, 0xFD, 0xFF, 0xEF, 0xFE, 0xEE, - 0xFF, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0x7E, 0xDD, 0xCC, 0xCC, 0xCE, 0xCE, - 0xCE, 0xED, 0xFF, 0xFF, 0xC0, 0x00, 0x00, 0x00, - ], - [ - 0xFF, 0xFF, 0xFF, 0xF8, 0xFF, 0x8F, 0xF8, 0xF8, 0xF9, 0xF8, 0x5F, 0xFF, - 0xF9, 0xF8, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x8F, 0xFF, 0xFF, - 0xF8, 0x99, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF9, 0xFF, - 0x88, 0x9F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0xFE, 0x8F, 0x8F, - 0x8F, 0xF8, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x88, 0x78, 0xFF, 0xFF, - 0xF8, 0x8F, 0xFF, 0xFF, 0xFF, 0xF9, 0x8F, 0xF8, 0xF9, 0xF9, 0x8F, 0xFF, - 0x8F, 0x8F, 0xF8, 0x89, 0x8F, 0x68, 0x68, 0x88, 0x88, 0xF8, 0xFF, 0xFF, - 0xFF, 0xF8, 0x88, 0x78, 0x64, 0x56, 0xFF, 0x8F, 0xF8, 0xFF, 0xFF, 0xF8, - 0xFF, 0x88, 0x64, 0x22, 0x48, 0x88, 0x8F, 0xFF, 0xFF, 0xE9, 0x8F, 0xFF, - 0xF7, 0x52, 0x25, 0x78, 0x8F, 0xF8, 0xFF, 0xFF, 0x9F, 0xFF, 0xF8, 0x87, - 0x44, 0x58, 0x8F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF9, 0x8F, 0xF7, 0x76, - 0x88, 0xF9, 0xFF, 0xFF, 0x9F, 0xFF, 0xFF, 0xFF, 0x79, 0x88, 0xF9, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0xFF, 0xF8, 0xFF, 0xFF, 0xFF, 0xFF, - 0xF8, 0xFF, 0xFF, 0x98, 0xFF, 0xFF, 0x8F, 0xF9, 0xFF, 0x8F, 0xFF, 0xFF, - 0x8F, 0xFF, 0xFF, 0xF8, 0xFF, 0x98, 0xF8, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0x8F, 0xFF, 0xFF, 0xFF, 0x9F, 0xFF, 0x8F, 0xFF, 0xFF, - 0xFF, 0x8F, 0xFF, 0x8F, 0xFF, 0xF8, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0x8F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x6F, 0x99, 0xFF, 0xCF, 0xF8, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00, 0x00, - ], - [ - 0x7F, 0x87, 0x87, 0x66, 0x68, 0x87, 0x77, 0x77, 0x68, 0xFF, 0x57, 0xFF, - 0x88, 0xFF, 0x88, 0x88, 0x8F, 0x88, 0xFF, 0xFF, 0xF8, 0x6F, 0xF7, 0x78, - 0xF8, 0x8F, 0x87, 0x78, 0x87, 0xFF, 0xF7, 0x87, 0xF7, 0xF8, 0x7F, 0xF8, - 0x88, 0x88, 0x87, 0x88, 0x8F, 0x87, 0xF8, 0x88, 0xF7, 0xF7, 0xFF, 0x8F, - 0x88, 0x7F, 0x8F, 0xF8, 0xF7, 0x8F, 0x8F, 0xF7, 0x77, 0xF7, 0x68, 0x8F, - 0x8F, 0xFF, 0xF7, 0x69, 0x8F, 0x88, 0x76, 0x78, 0x6F, 0x77, 0x6F, 0xFF, - 0x7F, 0x88, 0xF8, 0x8F, 0xF7, 0x87, 0x88, 0xF7, 0x7F, 0xF8, 0x8F, 0x77, - 0x68, 0x87, 0xF7, 0x86, 0x87, 0x67, 0x67, 0x7F, 0x78, 0xF8, 0x77, 0x77, - 0x88, 0x67, 0xF7, 0x76, 0x88, 0x78, 0x77, 0xFF, 0x8F, 0x7F, 0x88, 0x87, - 0x67, 0x67, 0x77, 0x77, 0x78, 0x8F, 0x7F, 0x77, 0x7F, 0x87, 0x76, 0x68, - 0x87, 0x77, 0x67, 0x7F, 0x7E, 0xE8, 0xCB, 0x88, 0x7F, 0xF7, 0x77, 0x87, - 0x6F, 0x8F, 0x87, 0x7F, 0x68, 0x88, 0xF7, 0x88, 0xF7, 0xF6, 0x87, 0xF8, - 0x87, 0xFF, 0xF7, 0x88, 0xF8, 0x8F, 0x8F, 0xF7, 0x88, 0x7F, 0xFF, 0x8F, - 0xFF, 0x77, 0xF8, 0x88, 0x78, 0x8F, 0xF7, 0x78, 0x77, 0x88, 0x8F, 0xF7, - 0x8F, 0xF8, 0xFF, 0xF8, 0x8F, 0x88, 0x78, 0x77, 0x7F, 0xF8, 0x78, 0xF8, - 0x88, 0x88, 0x7F, 0x8F, 0x7F, 0x8F, 0xA7, 0x78, 0x7F, 0xFF, 0xFF, 0x87, - 0x8F, 0x78, 0x87, 0x8F, 0x8F, 0x87, 0x8F, 0x77, 0xF8, 0xF7, 0x88, 0x8F, - 0x8F, 0xFF, 0xF8, 0x87, 0x7F, 0xF8, 0x8F, 0x87, 0x8F, 0x87, 0x78, 0x7F, - 0xF7, 0x77, 0x78, 0xF8, 0x70, 0x00, 0x00, 0x00, - ], - [ - 0x57, 0x78, 0x66, 0x77, 0x66, 0x76, 0x77, 0x76, 0x87, 0x79, 0x68, 0xAD, - 0x98, 0x89, 0x98, 0xDA, 0xB9, 0x99, 0x99, 0x9D, 0x98, 0x79, 0xAA, 0x89, - 0x98, 0x88, 0x88, 0x98, 0xAA, 0x88, 0x9A, 0x87, 0x89, 0xA9, 0x99, 0x89, - 0x98, 0x98, 0x99, 0x89, 0xA9, 0x99, 0x7A, 0x88, 0x79, 0x98, 0x88, 0x87, - 0x87, 0x98, 0x88, 0x9A, 0x76, 0x98, 0x77, 0x88, 0x87, 0x97, 0x88, 0x98, - 0x98, 0x99, 0x88, 0x79, 0x89, 0x99, 0x78, 0x87, 0x88, 0x88, 0x89, 0xA9, - 0x98, 0x87, 0x99, 0x87, 0x78, 0x78, 0x87, 0x87, 0x87, 0x97, 0x99, 0x97, - 0x79, 0x98, 0x98, 0x78, 0x87, 0x98, 0x87, 0x78, 0x88, 0x9A, 0x76, 0x99, - 0x77, 0x78, 0x78, 0x77, 0x87, 0x78, 0x88, 0x99, 0xA7, 0x79, 0x88, 0x89, - 0x87, 0x77, 0x87, 0x88, 0x78, 0x88, 0x89, 0x77, 0x88, 0x97, 0x88, 0x87, - 0x87, 0x67, 0x88, 0x89, 0x89, 0x88, 0x79, 0x89, 0x88, 0x78, 0x87, 0x77, - 0x77, 0x78, 0x89, 0x8A, 0x76, 0x89, 0x97, 0x77, 0x97, 0x87, 0x77, 0x99, - 0x89, 0x99, 0x96, 0x6A, 0xA8, 0x88, 0x88, 0x88, 0x89, 0x87, 0x88, 0x88, - 0x99, 0x87, 0x9A, 0xA8, 0x88, 0x98, 0x78, 0x88, 0x88, 0x88, 0x99, 0x98, - 0x79, 0x99, 0x88, 0x88, 0x98, 0x88, 0x87, 0x88, 0x88, 0xA9, 0x78, 0xAA, - 0x98, 0x98, 0xA8, 0x88, 0x88, 0x88, 0x88, 0x88, 0xA7, 0x8A, 0x98, 0x89, - 0x8A, 0x88, 0x88, 0x9A, 0x89, 0x89, 0x99, 0x78, 0xA9, 0x99, 0xD8, 0x89, - 0x98, 0x8A, 0x89, 0x98, 0xAA, 0x87, 0x69, 0x88, 0x87, 0x87, 0x78, 0x77, - 0x67, 0x87, 0x77, 0x79, 0x50, 0x00, 0x00, 0x00, - ], - [ - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x6F, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xAB, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0x85, 0x68, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xF5, 0x12, 0x6F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0x61, 0x15, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, - 0x65, 0x9F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xBB, 0xAF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xBF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x6F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00, 0x00, - ], - [ - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFB, 0xBB, 0xFF, 0x6F, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xEF, 0xFF, 0xFB, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xA9, 0x99, 0xBF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x97, 0x66, 0x88, 0xBF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFB, 0xB7, 0x53, 0x45, 0x7A, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xF9, 0x63, 0x22, 0x46, 0xAF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0x96, 0x42, 0x24, 0x79, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xBA, 0x85, - 0x44, 0x57, 0xAF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFA, 0x86, 0x67, - 0x9F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xF9, 0x99, 0xBF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFB, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFB, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x6F, 0xBB, 0xBF, 0xFD, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00, 0x00, - ], - [ - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x8F, 0xFF, 0x5F, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFE, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0x88, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xF6, 0x12, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xF3, 0x07, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, - 0xBC, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0x8F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xF9, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x6F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00, 0x00, - ], - [ - 0xFF, 0xFF, 0xFF, 0xEF, 0xFF, 0xFF, 0xE5, 0xEF, 0xFF, 0xFF, 0x3F, 0xFF, - 0xEE, 0xEE, 0xE5, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, - 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x5F, 0x5E, - 0x5E, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, - 0xEE, 0xEE, 0xEE, 0xEF, 0xFF, 0xFF, 0xFF, 0xF4, 0x5F, 0x5F, 0xFF, 0xF5, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x54, 0x55, 0x5F, 0x5F, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0x5F, 0x4F, 0xFF, 0x54, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, - 0xEE, 0xEE, 0x4E, 0xE5, 0xE6, 0xEE, 0x5E, 0xEE, 0xEE, 0xEE, 0xEE, 0xE5, - 0xE5, 0xE5, 0xEE, 0x5E, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0x5E, - 0xEE, 0x44, 0xEE, 0xEE, 0xEE, 0xEE, 0x5E, 0xEF, 0xFF, 0xF5, 0x45, 0x3F, - 0x3F, 0xFF, 0xFF, 0xFF, 0xFF, 0xF5, 0xFF, 0xFF, 0xFF, 0x4F, 0x4F, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x5F, 0x5F, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF5, 0xFF, 0x5F, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x5F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFE, 0xFF, 0xFF, 0xFE, 0xFF, 0xFF, 0xFE, 0xFF, 0xFE, 0xFF, 0xFF, - 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, - 0xFF, 0xFE, 0xFF, 0xFE, 0xF0, 0x00, 0x00, 0x00, - ], - [ - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x9F, 0xAF, 0x5F, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFB, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFA, 0xFF, 0xAF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x9F, 0xFF, 0xFF, - 0xFB, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xAF, 0x99, 0x9B, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xA7, 0x67, 0x7F, 0xAB, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xA7, 0x54, 0x45, 0x79, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0x64, 0x22, 0x47, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xA6, 0x42, 0x23, 0x69, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFA, 0x75, - 0x43, 0x57, 0x9F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF9, 0x77, 0x67, - 0x9A, 0xBE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFA, 0xF9, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFB, 0xFF, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0xFF, 0xDF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00, 0x00, - ], - [ - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xBF, 0xBA, 0xAA, 0xAF, 0x5F, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFA, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFA, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xAF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFA, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFA, 0x99, 0xAA, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFC, 0x65, 0x56, 0xFF, 0xFF, 0xFF, 0xFF, 0xEF, 0xFF, - 0xFF, 0xFF, 0x94, 0x12, 0x59, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xF9, 0x52, 0x14, 0x9D, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x97, - 0x54, 0x6F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xAA, 0xAA, - 0xAF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFA, 0xFA, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0x9F, 0xFF, 0xBF, 0xFB, 0xAF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x9F, 0xFF, 0xFE, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF9, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x6F, 0xF9, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00, 0x00, - ], - [ - 0xFF, 0xFF, 0xFF, 0xFF, 0xAA, 0xAF, 0xFF, 0xA9, 0xAA, 0xFF, 0x5F, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xAF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xAF, 0xFF, 0xFB, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x9F, - 0xAF, 0xFF, 0xFF, 0xFF, 0xAF, 0xFA, 0xFF, 0xAF, 0xFF, 0xAF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x9F, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xA8, 0xA7, 0x67, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xD7, 0x53, 0x45, 0x7A, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFA, 0x64, 0x22, 0x47, 0xAF, 0xFF, 0xFF, 0xFF, 0xFF, 0xAF, 0xF9, - 0x97, 0x42, 0x24, 0x68, 0xAF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFA, 0x76, - 0x44, 0x58, 0x9F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x76, 0x67, - 0xFF, 0xFA, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF9, 0xA9, 0xAF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xAF, 0xFF, 0xFF, 0xAF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xAF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xCA, 0xAF, 0xFF, 0xFA, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFA, 0xFA, 0xAF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x4F, 0xA9, 0xAF, 0xFF, 0xFA, 0x9F, - 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00, 0x00, - ], - [ - 0x5F, 0xEF, 0x56, 0x6F, 0xF6, 0x66, 0xEE, 0xEF, 0x6F, 0xFF, 0x56, 0xE6, - 0xE6, 0xEE, 0xEE, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xEE, 0xE6, 0xEE, - 0xEE, 0xEE, 0xE6, 0xEE, 0xEE, 0xEE, 0xEE, 0xEF, 0xFF, 0xFF, 0x6F, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xEE, 0xEE, 0xE6, 0xEE, 0xEE, 0x6E, - 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0x6E, 0x4E, 0x6E, 0xEE, 0xEE, 0xEE, - 0xE6, 0xEE, 0xEE, 0xEF, 0xF6, 0xF5, 0x6F, 0x56, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xF5, 0xFF, 0xFF, 0xFF, 0xF4, 0x6F, 0x6F, 0xFF, 0xFF, 0xFF, 0xFE, - 0xEE, 0xE5, 0xE6, 0x66, 0x65, 0x6E, 0xE5, 0xEE, 0xE6, 0xEE, 0xEE, 0xEE, - 0xEE, 0xE5, 0x56, 0x45, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, - 0xE6, 0xE6, 0x65, 0x65, 0xEE, 0xEE, 0xEE, 0xE6, 0xEE, 0xEE, 0xE6, 0x66, - 0x6E, 0x6E, 0xEE, 0xEE, 0xE6, 0xEE, 0x6E, 0xEF, 0xF6, 0xF6, 0xFF, 0x56, - 0xFF, 0x6F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x55, 0x6F, - 0x66, 0xF5, 0xF6, 0xFF, 0xF6, 0xFF, 0xFF, 0xFF, 0xFF, 0x6F, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF6, 0xF5, 0xF6, 0xFF, 0x6F, 0xFE, - 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xE6, 0xEE, 0xEE, 0xFE, 0x6E, 0xFE, - 0xFF, 0xFE, 0xFF, 0x6E, 0xF6, 0xFE, 0xFF, 0x66, 0xFF, 0xFE, 0xFF, 0xFE, - 0xEF, 0xFF, 0xFF, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0x5F, 0xFF, 0xFE, 0xFF, 0xFF, 0x5F, 0xFF, 0x65, 0x6F, 0xF6, 0xFE, - 0x66, 0xFE, 0x66, 0x5E, 0x50, 0x00, 0x00, 0x00, - ], - [ - 0x88, 0x88, 0x88, 0x78, 0x88, 0x88, 0x87, 0x78, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x87, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x77, 0x77, 0x77, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x77, 0x77, 0x77, 0x77, 0x77, - 0x77, 0x77, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, - 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x80, 0x00, 0x00, 0x00, - ], - [ - 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0xA8, 0xFF, 0xFF, 0xF7, 0xFF, 0x3F, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, - 0x8F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFE, 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x76, 0x77, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0x86, 0x54, 0x45, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xF9, 0x64, 0x22, 0x48, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xF6, 0x42, 0x24, 0x5F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0xF5, - 0x44, 0x5B, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF7, 0xF6, - 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x87, 0x7F, 0x8F, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0x8F, - 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00, 0x00, - ], - [ - 0xEE, 0xEE, 0xEE, 0xDE, 0xEE, 0xEE, 0xED, 0xD5, 0xEE, 0xEE, 0x3E, 0xEE, - 0xEE, 0xDD, 0xDD, 0xDE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, - 0xEE, 0xEE, 0xED, 0xDD, 0xDD, 0xDD, 0xDD, 0xDE, 0xEE, 0xEE, 0xEE, 0xEE, - 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, - 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xED, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, - 0xDD, 0xDD, 0xDD, 0xDE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, - 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, - 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, - 0xEE, 0xEE, 0xE4, 0x21, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xDD, - 0xDD, 0xD1, 0x1D, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, - 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDE, 0xEE, 0xEE, 0xEE, 0xEE, - 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, - 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, - 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, - 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, - 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, - 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, - 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, - 0xEE, 0xEE, 0xEE, 0xED, 0xE0, 0x00, 0x00, 0x00, - ], - [ - 0x88, 0x88, 0x88, 0x78, 0x88, 0x88, 0x87, 0x78, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x87, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x77, 0x77, 0x77, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x77, 0x77, 0x77, 0x77, 0x77, - 0x77, 0x77, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, - 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x80, 0x00, 0x00, 0x00, - ], - [ - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFE, 0xCF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0x75, 0x4F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xF4, 0x12, 0x47, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0x42, 0x14, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0x54, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF9, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x5F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00, 0x00, - ], - [ - 0x88, 0x88, 0x88, 0x78, 0x88, 0x88, 0x87, 0x78, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x87, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x77, 0x77, 0x77, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x77, 0x77, 0x77, 0x77, 0x77, - 0x77, 0x77, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, - 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x80, 0x00, 0x00, 0x00, - ], - [ - 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x4F, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFC, 0xCF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x77, 0x67, 0xAF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xF6, 0x44, 0x45, 0xF7, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xF6, 0x54, 0x22, 0x46, 0x9F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xF5, 0x42, 0x34, 0x5F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x75, - 0x43, 0x4F, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF7, 0x56, - 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x6F, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, - 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00, 0x00, - ], - [ - 0xEE, 0xEE, 0xEE, 0xDE, 0xEE, 0xEE, 0xED, 0xDE, 0xEE, 0xEE, 0xEE, 0xEE, - 0xEE, 0xDD, 0xDD, 0xDE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, - 0xEE, 0xEE, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDE, 0xEE, 0xEE, 0xEE, 0xEE, - 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, - 0xEE, 0xEE, 0xEE, 0xEE, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, - 0xDD, 0xDD, 0xDD, 0xDE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, - 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, - 0xEE, 0xEE, 0xEE, 0xEE, 0x53, 0x4E, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, - 0xEE, 0xEE, 0xE5, 0x12, 0xEE, 0xEE, 0xEE, 0xEE, 0xED, 0xDD, 0xDD, 0xDD, - 0xDD, 0xD2, 0x24, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, - 0xD3, 0x3D, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDE, 0xEE, 0xEE, 0xEE, 0xEE, - 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, - 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, - 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, - 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, - 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, - 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, - 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0x3E, 0xE5, 0xEE, 0xEE, 0xEE, 0xEE, - 0xEE, 0xEE, 0xEE, 0xED, 0xE0, 0x00, 0x00, 0x00, - ], - [ - 0x88, 0x88, 0x88, 0x78, 0x88, 0x88, 0x87, 0x78, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x87, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x77, 0x77, 0x77, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x77, 0x77, 0x77, 0x77, 0x77, - 0x77, 0x77, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, - 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x80, 0x00, 0x00, 0x00, - ], - [ - 0x88, 0x88, 0x88, 0x78, 0x88, 0x88, 0x87, 0x78, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x87, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x77, 0x77, 0x77, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x77, 0x77, 0x77, 0x77, 0x77, - 0x77, 0x77, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, - 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x80, 0x00, 0x00, 0x00, - ], - ], -]; diff --git a/src/codecs/real/rv30.rs b/src/codecs/real/rv30.rs deleted file mode 100644 index cf7e313..0000000 --- a/src/codecs/real/rv30.rs +++ /dev/null @@ -1,307 +0,0 @@ -use crate::formats; -use crate::io::bitreader::*; -use crate::io::intcode::*; -use crate::codecs::*; -use super::rv3040::*; -use super::rv30dsp::*; - -struct RealVideo30BR { - rpr_bits: u8, - width: usize, - height: usize, - widths: Vec<usize>, - heights: Vec<usize>, -} - -impl RealVideo30BR { - fn new() -> Self { - RealVideo30BR { - rpr_bits: 0, - width: 0, - height: 0, - widths: Vec::new(), - heights: Vec::new(), - } - } -} - -impl RV34BitstreamDecoder for RealVideo30BR { - fn decode_slice_header(&mut self, br: &mut BitReader, _old_w: usize, _old_h: usize) -> DecoderResult<RV34SliceHeader> { - if br.read(3)? != 0 { return Err(DecoderError::InvalidData); } - let ft_idx = br.read(2)?; - let ftype = match ft_idx { - 0|1 => FrameType::I, - 2 => FrameType::P, - _ => FrameType::B, - }; - if br.read(1)? != 0 { return Err(DecoderError::InvalidData); } - let q = br.read(5)? as u8; - let deblock = !br.read_bool()?; - let pts = br.read(13)? as u16; - let rpr = br.read(self.rpr_bits)? as usize; - let (w, h) = if rpr != 0 { - validate!(rpr < self.widths.len()); - (self.widths[rpr], self.heights[rpr]) - } else { - (self.width, self.height) - }; - let start = br.read(get_slice_start_offset_bits(w, h))? as usize; - br.skip(1)?; - - Ok(RV34SliceHeader{ ftype: ftype, quant: q, deblock: deblock, pts: pts, width: w, height: h, start: start, end: 0, set_idx: 0 }) - } - fn decode_intra_pred(&mut self, br: &mut BitReader, types: &mut [i8], mut pos: usize, tstride: usize, _has_top: bool) -> DecoderResult<()> { - for _ in 0..4 { - for x in 0..2 { - let code = br.read_code(UintCodeType::Gamma)? as usize; - validate!(code < 81); - for k in 0..2 { - let new = RV30_ITYPE_MAP[code * 2 + k] as usize; - let top = (types[pos + x * 2 + k - tstride] + 1) as usize; - let left = (types[pos + x * 2 + k - 1] + 1) as usize; - types[pos + x * 2 + k] = RV30_ITYPE[top * 90 + left * 9 + new]; - validate!(types[pos + x * 2 + k] != 9); - } - } - pos += tstride; - } - Ok(()) - } - fn decode_inter_mb_hdr(&mut self, br: &mut BitReader, ftype: FrameType, _mbtype: MBType) -> DecoderResult<MBInfo> { - let mut code = br.read_code(UintCodeType::Gamma)? as usize; - let mut dq = false; - validate!(code < 11); - if code > 5 { - code -= 6; - dq = true; - } - let idx = if ftype == FrameType::P { 0 } else { 1 }; - Ok(MBInfo { mbtype: RV30_MB_TYPES[idx][code], skip_run: 0, dquant: dq }) - } - fn predict_b_mv(&self, sstate: &SState, mvi: &MVInfo, mbtype: MBType, mvs: &[MV], _mbinfo: &Vec<RV34MBInfo>) -> (MV, MV) { - let mb_x = sstate.mb_x; - let mb_y = sstate.mb_y; - let mv_f; - let mv_b; - match mbtype { - MBType::MBForward | MBType::MBBackward => { - let mv_pred = mvi.pred_mb_mv(mb_x, mb_y, true, sstate.has_top, sstate.has_left, sstate.has_tr, sstate.has_tl); - mv_f = mv_pred + mvs[0]; - mv_b = mv_f; - }, - _ => { - mv_f = ZERO_MV; - mv_b = ZERO_MV; - }, - }; - (mv_f, mv_b) - } - fn quant_dc(&self, _is_intra: bool, q: u8) -> u8 { RV30_QUANT_DC[q as usize] } -} - -struct RealVideo30Decoder { - bd: RealVideo30BR, - info: Rc<NACodecInfo>, - dec: RV34Decoder, -} - -impl RealVideo30Decoder { - fn new() -> Self { - RealVideo30Decoder{ - bd: RealVideo30BR::new(), - info: Rc::new(DUMMY_CODEC_INFO), - dec: RV34Decoder::new(true, Box::new(RV30DSP::new())), - } - } -} - -impl NADecoder for RealVideo30Decoder { - fn init(&mut self, info: Rc<NACodecInfo>) -> DecoderResult<()> { - if let NACodecTypeInfo::Video(vinfo) = info.get_properties() { - let fmt = formats::YUV420_FORMAT; - let myinfo = NACodecTypeInfo::Video(NAVideoInfo::new(0, 0, false, fmt)); - self.info = Rc::new(NACodecInfo::new_ref(info.get_name(), myinfo, info.get_extradata())); - - let edata = info.get_extradata().unwrap(); - let src: &[u8] = &edata; - - if src.len() < 2 { return Err(DecoderError::InvalidData); } - let num_rpr = (src[1] & 7) as usize; - if src.len() < num_rpr * 2 + 8 { return Err(DecoderError::ShortData); } - self.bd.rpr_bits = ((num_rpr >> 1) + 1) as u8; - if self.bd.rpr_bits > 3 { self.bd.rpr_bits = 3; } - for i in 0..num_rpr+1 { - self.bd.widths.push ((src[6 + i * 2] as usize) << 2); - self.bd.heights.push((src[7 + i * 2] as usize) << 2); - } - - self.bd.width = vinfo.get_width(); - self.bd.height = vinfo.get_height(); - Ok(()) - } else { -println!("???"); - Err(DecoderError::InvalidData) - } - } - fn decode(&mut self, pkt: &NAPacket) -> DecoderResult<NAFrameRef> { - let src = pkt.get_buffer(); - - let (bufinfo, ftype, pts) = self.dec.parse_frame(src.as_slice(), &mut self.bd)?; - - let mut frm = NAFrame::new_from_pkt(pkt, self.info.clone(), bufinfo); - frm.set_keyframe(ftype == FrameType::I); - frm.set_pts(Some(pts)); - frm.set_frame_type(ftype);//if ftype == FrameType::B { FrameType::Skip } else { ftype } ); - Ok(Rc::new(RefCell::new(frm))) - } -} - -pub fn get_decoder() -> Box<NADecoder> { - Box::new(RealVideo30Decoder::new()) -} - -#[cfg(test)] -mod test { - use crate::test::dec_video::test_file_decoding; - #[test] - fn test_rv30() { -// test_file_decoding("realmedia", "assets/RV/rv30_chroma_drift.rm", Some(1000), true, false, /*None*/Some("rv30")); - test_file_decoding("realmedia", "assets/RV/rv30_weighted_mc.rm", Some(400), true, false, None/*Some("rv30")*/); -// test_file_decoding("realmedia", "assets/RV/simpsons-clip.rm", Some(1337)/*Some(6666)*/, true, false, /*None*/Some("rv30")); -//panic!("end"); - } -} - -const RV30_QUANT_DC: [u8; 32] = [ - 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, - 16, 17, 18, 19, 20, 21, 22, 22, 22, 23, 23, 23, 24, 24, 25, 25 -]; - -const RV30_MB_TYPES: [[MBType; 6]; 2] = [ - [ MBType::MBSkip, MBType::MBP16x16, MBType::MBP8x8, MBType::Invalid, MBType::MBIntra, MBType::MBIntra16 ], - [ MBType::MBSkip, MBType::MBDirect, MBType::MBForward, MBType::MBBackward, MBType::MBIntra, MBType::MBIntra16 ], -]; - -const RV30_ITYPE_MAP: [i8; 9*9*2] = [ - 0, 0, 0, 1, 1, 0, 1, 1, 0, 2, 2, 0, 0, 3, 3, 0, 1, 2, - 2, 1, 0, 4, 4, 0, 3, 1, 1, 3, 0, 5, 5, 0, 2, 2, 1, 4, - 4, 1, 0, 6, 3, 2, 1, 5, 2, 3, 5, 1, 6, 0, 0, 7, 4, 2, - 2, 4, 3, 3, 6, 1, 1, 6, 7, 0, 0, 8, 5, 2, 4, 3, 2, 5, - 3, 4, 1, 7, 4, 4, 7, 1, 8, 0, 6, 2, 3, 5, 5, 3, 2, 6, - 1, 8, 2, 7, 7, 2, 8, 1, 5, 4, 4, 5, 3, 6, 6, 3, 8, 2, - 4, 6, 5, 5, 6, 4, 2, 8, 7, 3, 3, 7, 6, 5, 5, 6, 7, 4, - 4, 7, 8, 3, 3, 8, 7, 5, 8, 4, 5, 7, 4, 8, 6, 6, 7, 6, - 5, 8, 8, 5, 6, 7, 8, 6, 7, 7, 6, 8, 8, 7, 7, 8, 8, 8, -]; - -const RV30_ITYPE: [i8; 10*10*9] = [ - 0, 9, 9, 9, 9, 9, 9, 9, 9, - 0, 2, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, - 2, 0, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, - - 0, 1, 9, 9, 9, 9, 9, 9, 9, - 0, 2, 1, 6, 4, 8, 5, 7, 3, - 1, 0, 2, 6, 5, 4, 3, 8, 7, - 2, 8, 0, 1, 7, 4, 3, 6, 5, - 2, 0, 1, 3, 8, 5, 4, 7, 6, - 2, 0, 1, 4, 6, 7, 8, 3, 5, - 0, 1, 5, 2, 6, 3, 8, 4, 7, - 0, 1, 6, 2, 4, 7, 5, 8, 3, - 2, 7, 0, 1, 4, 8, 6, 3, 5, - 2, 8, 0, 1, 7, 3, 4, 5, 6, - - 1, 0, 9, 9, 9, 9, 9, 9, 9, - 1, 2, 5, 6, 3, 0, 4, 8, 7, - 1, 6, 2, 5, 3, 0, 4, 8, 7, - 2, 1, 7, 6, 8, 3, 5, 0, 4, - 1, 2, 5, 3, 6, 8, 4, 7, 0, - 1, 6, 2, 0, 4, 5, 8, 7, 3, - 1, 5, 2, 6, 3, 8, 4, 0, 7, - 1, 6, 0, 2, 4, 5, 7, 3, 8, - 2, 1, 7, 6, 0, 8, 5, 4, 3, - 1, 2, 7, 8, 3, 4, 5, 6, 0, - - 9, 9, 9, 9, 9, 9, 9, 9, 9, - 0, 2, 1, 8, 7, 6, 5, 4, 3, - 1, 2, 0, 6, 5, 7, 4, 8, 3, - 2, 8, 7, 1, 0, 6, 4, 3, 5, - 2, 0, 8, 1, 3, 7, 5, 4, 6, - 2, 0, 4, 1, 7, 8, 6, 3, 5, - 2, 0, 1, 5, 8, 4, 6, 7, 3, - 2, 0, 6, 1, 4, 7, 8, 5, 3, - 2, 7, 8, 1, 0, 5, 4, 6, 3, - 2, 8, 7, 1, 0, 4, 3, 6, 5, - - 9, 9, 9, 9, 9, 9, 9, 9, 9, - 0, 2, 1, 3, 5, 8, 6, 4, 7, - 1, 0, 2, 5, 3, 6, 4, 8, 7, - 2, 8, 1, 0, 3, 5, 7, 6, 4, - 3, 2, 5, 8, 1, 4, 6, 7, 0, - 4, 2, 0, 6, 1, 5, 8, 3, 7, - 5, 3, 1, 2, 8, 6, 4, 0, 7, - 1, 6, 0, 2, 4, 5, 8, 3, 7, - 2, 7, 0, 1, 5, 4, 8, 6, 3, - 2, 8, 3, 5, 1, 0, 7, 6, 4, - - 9, 9, 9, 9, 9, 9, 9, 9, 9, - 2, 0, 6, 1, 4, 7, 5, 8, 3, - 1, 6, 2, 0, 4, 5, 3, 7, 8, - 2, 8, 7, 6, 4, 0, 1, 5, 3, - 4, 2, 1, 0, 6, 8, 3, 5, 7, - 4, 2, 6, 0, 1, 5, 7, 8, 3, - 1, 2, 5, 0, 6, 3, 4, 7, 8, - 6, 4, 0, 1, 2, 7, 5, 3, 8, - 2, 7, 4, 6, 0, 1, 8, 5, 3, - 2, 8, 7, 4, 6, 1, 3, 5, 0, - - 9, 9, 9, 9, 9, 9, 9, 9, 9, - 5, 1, 2, 3, 6, 8, 0, 4, 7, - 1, 5, 6, 3, 2, 0, 4, 8, 7, - 2, 1, 5, 3, 6, 8, 7, 4, 0, - 5, 3, 1, 2, 6, 8, 4, 7, 0, - 1, 6, 2, 4, 5, 8, 0, 3, 7, - 5, 1, 3, 6, 2, 0, 8, 4, 7, - 1, 6, 5, 2, 0, 4, 3, 7, 8, - 2, 7, 1, 6, 5, 0, 8, 3, 4, - 2, 5, 1, 3, 6, 8, 4, 0, 7, - - 9, 9, 9, 9, 9, 9, 9, 9, 9, - 1, 6, 2, 0, 5, 4, 3, 7, 8, - 1, 6, 5, 4, 2, 3, 0, 7, 8, - 2, 1, 6, 7, 4, 8, 5, 3, 0, - 2, 1, 6, 5, 8, 4, 3, 0, 7, - 6, 4, 1, 2, 0, 5, 7, 8, 3, - 1, 6, 5, 2, 3, 0, 4, 8, 7, - 6, 1, 4, 0, 2, 7, 5, 3, 8, - 2, 7, 4, 6, 1, 5, 0, 8, 3, - 2, 1, 6, 8, 4, 7, 3, 5, 0, - - 9, 9, 9, 9, 9, 9, 9, 9, 9, - 2, 0, 4, 7, 6, 1, 8, 5, 3, - 6, 1, 2, 0, 4, 7, 5, 8, 3, - 2, 7, 8, 0, 1, 6, 4, 3, 5, - 2, 4, 0, 8, 3, 1, 7, 6, 5, - 4, 2, 7, 0, 6, 1, 8, 5, 3, - 2, 1, 0, 8, 5, 6, 7, 4, 3, - 2, 6, 4, 1, 7, 0, 5, 8, 3, - 2, 7, 4, 0, 8, 6, 1, 5, 3, - 2, 8, 7, 4, 1, 0, 3, 6, 5, - - 9, 9, 9, 9, 9, 9, 9, 9, 9, - 2, 0, 8, 1, 3, 4, 6, 5, 7, - 1, 2, 0, 6, 8, 5, 7, 3, 4, - 2, 8, 7, 1, 0, 3, 6, 5, 4, - 8, 3, 2, 5, 1, 0, 4, 7, 6, - 2, 0, 4, 8, 5, 1, 7, 6, 3, - 2, 1, 0, 8, 5, 3, 6, 4, 7, - 2, 1, 6, 0, 8, 4, 5, 7, 3, - 2, 7, 8, 4, 0, 6, 1, 5, 3, - 2, 8, 3, 0, 7, 4, 1, 6, 5, -]; diff --git a/src/codecs/real/rv3040.rs b/src/codecs/real/rv3040.rs deleted file mode 100644 index d1107ba..0000000 --- a/src/codecs/real/rv3040.rs +++ /dev/null @@ -1,1279 +0,0 @@ -use crate::formats::YUV420_FORMAT; -use crate::frame::{NABufferType, NAVideoInfo, NAVideoBuffer, FrameType, alloc_video_buffer}; -use crate::codecs::{MV, ZERO_MV, DecoderError, DecoderResult, IPBShuffler}; -use crate::io::bitreader::{BitReader,BitReaderMode}; -use crate::io::intcode::*; -use std::mem; - -use super::rv34codes::*; -use super::rv34dsp::*; - -pub struct GenericCache<T: Copy> { - pub height: usize, - pub stride: usize, - pub xpos: usize, - pub data: Vec<T>, - pub default: T, -} - -impl<T:Copy> GenericCache<T> { - pub fn new(height: usize, stride: usize, default: T) -> Self { - let mut ret = Self { - stride: stride, - height: height, - xpos: 0, - data: Vec::with_capacity((height + 1) * stride), - default: default, - }; - ret.reset(); - ret - } - fn full_size(&self) -> usize { self.stride * (self.height + 1) } - pub fn reset(&mut self) { - self.data.truncate(0); - let size = self.full_size(); - self.data.resize(size, self.default); - self.xpos = self.stride + 1; - } - pub fn update_row(&mut self) { - for i in 0..self.stride { - self.data[i] = self.data[self.height * self.stride + i]; - } - self.data.truncate(self.stride); - let size = self.full_size(); - self.data.resize(size, self.default); - self.xpos = self.stride + 1; - } -} - -trait RV34MVScale { - fn scale(&self, trd: u16, trb: u16) -> (MV, MV); -} - -const TR_SHIFT: u8 = 14; -const TR_BIAS: i32 = 1 << (TR_SHIFT - 1); - -impl RV34MVScale for MV { - fn scale(&self, trd: u16, trb: u16) -> (MV, MV) { - let ratio = ((trb as i32) << TR_SHIFT) / (trd as i32); - let mv_f = MV { - x: (((self.x as i32) * ratio + TR_BIAS) >> TR_SHIFT) as i16, - y: (((self.y as i32) * ratio + TR_BIAS) >> TR_SHIFT) as i16 - }; - let mv_b = mv_f - *self; - (mv_f, mv_b) - } -} - -#[derive(Clone,Copy)] -pub struct RV34SliceHeader { - pub ftype: FrameType, - pub quant: u8, - pub pts: u16, - pub width: usize, - pub height: usize, - pub start: usize, - pub end: usize, - pub set_idx: usize, - pub deblock: bool, -} - -impl RV34SliceHeader { - pub fn fits(&self, cmp: &RV34SliceHeader) -> bool { - (self.ftype == cmp.ftype) && - (self.pts == cmp.pts) && - (self.width == cmp.width) && - (self.height == cmp.height) - } -} - -#[allow(dead_code)] -#[derive(Debug,Clone,Copy,PartialEq)] -pub enum MBType { - MBIntra, - MBIntra16, - MBSkip, - MBP16x16, - MBP16x16Mix, - MBP16x8, - MBP8x16, - MBP8x8, - MBDirect, - MBBidir, - MBForward, - MBBackward, - Invalid, -} - -impl MBType { - pub fn is_intra(&self) -> bool { - (*self == MBType::MBIntra) || (*self == MBType::MBIntra16) - } - pub fn is_16(&self) -> bool { - (*self == MBType::MBIntra16) || (*self == MBType::MBP16x16Mix) - } - pub fn is_intra_or_16(&self) -> bool { - self.is_intra() || self.is_16() - } - pub fn get_num_mvs(&self) -> usize { - match *self { - MBType::MBIntra | MBType::MBIntra16 | - MBType::MBSkip | MBType::MBDirect => 0, - MBType::MBP16x16 | MBType::MBP16x16Mix | - MBType::MBForward | MBType::MBBackward => 1, - MBType::MBP16x8 | MBType::MBP8x16 | MBType::MBBidir => 2, - MBType::MBP8x8 => 4, - MBType::Invalid => unreachable!(), - } - } - pub fn is_fwd(&self) -> bool { - match *self { - MBType::MBP16x16 | MBType::MBP16x16Mix | - MBType::MBP16x8 | MBType::MBP8x16 | MBType::MBP8x8 | - MBType::MBForward => true, - _ => false, - } - } - pub fn is_bwd(&self) -> bool { - match *self { - MBType::MBBidir | MBType::MBBackward => true, - _ => false, - } - } - pub fn has_mv_dir(&self, fwd: bool) -> bool { - match *self { - MBType::MBBidir => true, - MBType::MBForward if fwd => true, - MBType::MBBackward if !fwd => true, - _ => false, - } - } - pub fn is_nomv(&self) -> bool { - match *self { - MBType::MBIntra | MBType::MBIntra16 | MBType::MBSkip | MBType::MBDirect => true, - _ => false, - } - } - /*pub fn is_16x16(&self) -> bool { - match *self { - MBType::MBP16x8 | MBType::MBP8x16 | MBType::MBP8x8 => false, - _ => true, - } - }*/ - fn get_weight(&self) -> usize { - match *self { - MBType::MBIntra => 0, - MBType::MBIntra16 => 1, - MBType::MBSkip => unreachable!(), - MBType::MBP16x16 => 2, - MBType::MBP16x16Mix => 10, - MBType::MBP16x8 => 7, - MBType::MBP8x16 => 8, - MBType::MBP8x8 => 3, - MBType::MBDirect => 6, - MBType::MBBidir => 9, - MBType::MBForward => 4, - MBType::MBBackward => 5, - MBType::Invalid => unreachable!(), - } - } -} - -const MBTYPE_FROM_WEIGHT: [MBType; 11] = [ - MBType::MBIntra, MBType::MBIntra16, MBType::MBP16x16, MBType::MBP8x8, - MBType::MBForward, MBType::MBBackward, MBType::MBDirect, MBType::MBP16x8, - MBType::MBP8x16, MBType::MBBidir, MBType::MBP16x16Mix, -]; - -#[derive(Clone,Copy)] -pub struct MBInfo { - pub mbtype: MBType, - pub skip_run: usize, - pub dquant: bool, -} - -#[derive(Clone,Copy)] -pub struct RV34MBInfo { - pub mbtype: MBType, - pub cbp: u32, - pub deblock:u16, - pub cbp_c: u8, // for deblocking purposes - pub q: u8, -} - -struct IntraModeState { - cache: GenericCache<i8>, -} - -const RV34_INTRA_PRED4: [PredType4x4; 9] = [ - PredType4x4::DC, PredType4x4::Ver, PredType4x4::Hor, - PredType4x4::DiagDownRight, PredType4x4::DiagDownLeft, - PredType4x4::VerRight, PredType4x4::VerLeft, - PredType4x4::HorUp, PredType4x4::HorDown -]; - -const RV34_INTRA_PRED16: [PredType8x8; 4] = [ - PredType8x8::DC, PredType8x8::Ver, PredType8x8::Hor, PredType8x8::Plane -]; - -impl IntraModeState { - fn new(mb_w: usize) -> Self { - let stride = 1 + mb_w * 4 + 1; - IntraModeState { cache: GenericCache::new(4, stride, -1) } - } - fn reset(&mut self) { self.cache.reset(); } - fn update(&mut self) { self.cache.update_row(); } - fn get_pos(&self, xpos: usize) -> usize { - self.cache.stride + 1 + xpos * 4 - } - fn set_mb_x(&mut self, mb_x: usize) { - self.cache.xpos = self.get_pos(mb_x); - } - fn fill_block(&mut self, val: i8) { - let mut pos = self.cache.xpos; - for _ in 0..4 { - for j in 0..4 { - self.cache.data[pos + j] = val; - } - pos += self.cache.stride; - } - } - fn get_pred16_type(&self, has_top: bool, has_left: bool) -> PredType8x8 { - if !has_top && !has_left { return PredType8x8::DC128; } - let mut im = RV34_INTRA_PRED16[self.cache.data[self.cache.xpos] as usize]; - if !has_top { - im = match im { - PredType8x8::Plane | PredType8x8::Ver => PredType8x8::Hor, - PredType8x8::DC => PredType8x8::LeftDC, - _ => im, - }; - } else if !has_left { - im = match im { - PredType8x8::Plane | PredType8x8::Hor => PredType8x8::Ver, - PredType8x8::DC => PredType8x8::TopDC, - _ => im, - }; - } - im - } - fn get_pred8_type(&self, has_top: bool, has_left: bool) -> PredType8x8 { - if !has_top && !has_left { return PredType8x8::DC128; } - let mut im = RV34_INTRA_PRED16[self.cache.data[self.cache.xpos] as usize]; - im = match im { PredType8x8::Plane => PredType8x8::DC, _ => im }; - if !has_top { - im = match im { - PredType8x8::Plane | PredType8x8::Ver => PredType8x8::Hor, - PredType8x8::DC => PredType8x8::LeftDC, - _ => im, - }; - } else if !has_left { - im = match im { - PredType8x8::Plane | PredType8x8::Hor => PredType8x8::Ver, - PredType8x8::DC => PredType8x8::TopDC, - _ => im, - }; - } - im - } - fn get_pred4_type(&self, x: usize, y: usize, has_top: bool, has_left: bool) -> PredType4x4 { - let no_up = !has_top && (y == 0); - let no_left = !has_left && (x == 0); - if no_up && no_left { return PredType4x4::DC128; } - let no_down = !has_left || (x != 0) || (y == 3); - - let mut im = RV34_INTRA_PRED4[self.cache.data[self.cache.xpos + x + y * self.cache.stride] as usize]; - - if no_up { - im = match im { - PredType4x4::Ver => PredType4x4::Hor, - PredType4x4::DC => PredType4x4::LeftDC, - _ => im, - }; - } else if no_left { - im = match im { - PredType4x4::Hor => PredType4x4::Ver, - PredType4x4::DC => PredType4x4::TopDC, - PredType4x4::DiagDownLeft => PredType4x4::DiagDownLeftNoDown, - _ => im, - }; - } - if no_down { - im = match im { - PredType4x4::DiagDownLeft => PredType4x4::DiagDownLeftNoDown, - PredType4x4::HorUp => PredType4x4::HorUpNoDown, - PredType4x4::VerLeft => PredType4x4::VerLeftNoDown, - _ => im, - }; - } - im - } - //todo merge - fn get_pred4_type_chroma(&self, x: usize, y: usize, has_top: bool, has_left: bool) -> PredType4x4 { - let no_up = !has_top && (y == 0); - let no_left = !has_left && (x == 0); - if no_up && no_left { return PredType4x4::DC128; } - let no_down = !has_left || (x != 0) || (y == 1); - - let mut im = RV34_INTRA_PRED4[self.cache.data[self.cache.xpos + x * 2 + y * 2 * self.cache.stride] as usize]; - - if no_up { - im = match im { - PredType4x4::Ver => PredType4x4::Hor, - PredType4x4::DC => PredType4x4::LeftDC, - _ => im, - }; - } else if no_left { - im = match im { - PredType4x4::Hor => PredType4x4::Ver, - PredType4x4::DC => PredType4x4::TopDC, - PredType4x4::DiagDownLeft => PredType4x4::DiagDownLeftNoDown, - _ => im, - }; - } - if no_down { - im = match im { - PredType4x4::DiagDownLeft => PredType4x4::DiagDownLeftNoDown, - PredType4x4::HorUp => PredType4x4::HorUpNoDown, - PredType4x4::VerLeft => PredType4x4::VerLeftNoDown, - _ => im, - }; - } - im - } -} - -pub struct MVInfo { - pub mv_b: Vec<MV>, - pub mv_f: Vec<MV>, - pub w: usize, - pub h: usize, - pub has_b: Vec<bool>, - pub has_f: Vec<bool>, -} - -impl MVInfo { - fn new() -> Self { - Self { mv_b: Vec::new(), mv_f: Vec::new(), w: 0, h: 0, has_b: Vec::new(), has_f: Vec::new() } - } - fn resize(&mut self, mb_w: usize, mb_h: usize) { - self.w = mb_w * 2; - self.h = mb_h * 2; - self.reset(); - } - fn reset(&mut self) { - let size = self.w * self.h; - self.mv_f.truncate(0); - self.mv_f.resize(size, ZERO_MV); - self.mv_b.truncate(0); - self.mv_b.resize(size, ZERO_MV); - self.has_f.truncate(0); - self.has_f.resize(size >> 2, false); - self.has_b.truncate(0); - self.has_b.resize(size >> 2, false); - } - fn fill(&mut self, mb_x: usize, mb_y: usize, fwd: bool, mv: MV) { - let idx = mb_x * 2 + mb_y * 2 * self.w; - if fwd { - self.mv_f[idx + 0] = mv; - self.mv_f[idx + 1] = mv; - self.mv_f[idx + self.w + 0] = mv; - self.mv_f[idx + self.w + 1] = mv; - } else { - self.mv_b[idx + 0] = mv; - self.mv_b[idx + 1] = mv; - self.mv_b[idx + self.w + 0] = mv; - self.mv_b[idx + self.w + 1] = mv; - } - } - fn get_mv_by_idx(&self, idx: usize, fwd: bool) -> MV { - if fwd { self.mv_f[idx] } else { self.mv_b[idx] } - } - fn pred_mv(&self, idx: usize, fwd: bool, has_top: bool, has_left: bool, has_tr: bool, has_tl: bool, is16: bool) -> MV { - if !has_top && !has_left { return ZERO_MV; } - let left_mv = if has_left { self.get_mv_by_idx(idx - 1, fwd) } else { ZERO_MV }; - let top_mv = if has_top { self.get_mv_by_idx(idx - self.w, fwd) } else { left_mv }; - let tr_add = if is16 { 2 } else { 1 }; - let tr_mv; - if has_tr { - tr_mv = self.get_mv_by_idx(idx - self.w + tr_add, fwd); - } else if has_tl { - tr_mv = self.get_mv_by_idx(idx - self.w - 1, fwd); - } else { - tr_mv = left_mv; - } - MV::pred(left_mv, top_mv, tr_mv) - } - pub fn pred_mb_mv(&self, mb_x: usize, mb_y: usize, fwd: bool, has_top: bool, has_left: bool, has_tr: bool, has_tl: bool) -> MV { - self.pred_mv(mb_x * 2 + mb_y * 2 * self.w, fwd, has_top, has_left, has_tr, has_tl, true) - } - fn set_mb(&mut self, mb_x: usize, mb_y: usize, mbtype: MBType, ref_mvi: &Self, mvs: &[MV], sstate: &SState) { - let mb_idx = mb_x + mb_y * (self.w >> 1); - self.has_f[mb_idx] = mbtype.is_fwd(); - self.has_b[mb_idx] = mbtype.is_bwd(); - if mbtype.is_nomv() { - self.fill(mb_x, mb_y, true, ZERO_MV); - self.fill(mb_x, mb_y, false, ZERO_MV); - return; - } - if mbtype.is_fwd() { - self.fill(mb_x, mb_y, false, ZERO_MV); - } else if mbtype.is_bwd() { - self.fill(mb_x, mb_y, true, ZERO_MV); - } - let idx = mb_x * 2 + mb_y * 2 * self.w; - - match mbtype { - MBType::MBSkip => { - self.fill(mb_x, mb_y, true, ZERO_MV/*pred_mv*/); - }, - MBType::MBP16x16 | - MBType::MBP16x16Mix => { - let pred_mv = self.pred_mv(idx, mbtype.is_fwd(), sstate.has_top, sstate.has_left, sstate.has_tr, sstate.has_tl, true); - let new_mv = mvs[0] + pred_mv; - self.fill(mb_x, mb_y, true, new_mv); - }, - MBType::MBP16x8 => { - let pred_mv = self.pred_mv(idx, mbtype.is_fwd(), sstate.has_top, sstate.has_left, sstate.has_tr, sstate.has_tl, true); - let new_mv = mvs[0] + pred_mv; - self.mv_f[idx + 0] = new_mv; - self.mv_f[idx + 1] = new_mv; - - let idx2 = idx + self.w; - let pred_mv = self.pred_mv(idx2, true, true, sstate.has_left, false, sstate.has_left, true); - let new_mv = mvs[1] + pred_mv; - self.mv_f[idx2 + 0] = new_mv; - self.mv_f[idx2 + 1] = new_mv; - }, - MBType::MBP8x16 => { - let pred_mv = self.pred_mv(idx, true, sstate.has_top, sstate.has_left, sstate.has_top, sstate.has_tl, false); - let new_mv = mvs[0] + pred_mv; - self.mv_f[idx] = new_mv; - self.mv_f[idx + self.w] = new_mv; - - let pred_mv = self.pred_mv(idx + 1, true, sstate.has_top, true, sstate.has_tr, sstate.has_top, false); - let new_mv = mvs[1] + pred_mv; - self.mv_f[idx + 1] = new_mv; - self.mv_f[idx + self.w + 1] = new_mv; - }, - MBType::MBP8x8 => { - let mut idx8 = idx; - let mut has_top = sstate.has_top; - for y in 0..2 { - for x in 0..2 { - let has_left = (x > 0) || sstate.has_left; - let has_tr = if y > 0 { x == 0 } else if x == 0 { sstate.has_top } else { sstate.has_tr }; - let has_tl; - if y == 0 { - has_tl = if x == 0 { sstate.has_tl } else { sstate.has_top }; - } else { - has_tl = if x == 0 { sstate.has_left } else { true }; - } - let pred_mv = self.pred_mv(idx8 + x, true, has_top, has_left, has_tr, has_tl, false); - let new_mv = mvs[x + y * 2] + pred_mv; - self.mv_f[idx8 + x] = new_mv; - } - has_top = true; - idx8 += self.w; - } - }, - MBType::MBDirect => { - let mut cum_mv_f = ZERO_MV; - let mut cum_mv_b = ZERO_MV; - let mut idx8 = idx; - for _ in 0..2 { - for x in 0..2 { - let (mv_f, mv_b) = ref_mvi.mv_f[idx8 + x].scale(sstate.trd, sstate.trb); - cum_mv_f += mv_f; - cum_mv_b += mv_b; - } - idx8 += self.w; - } - cum_mv_f.x >>= 2; - cum_mv_f.y >>= 2; - cum_mv_b.x >>= 2; - cum_mv_b.y >>= 2; - self.fill(mb_x, mb_y, true, cum_mv_f); - self.fill(mb_x, mb_y, false, cum_mv_b); - }, - MBType::MBBidir => { - let pred_mv_f = ZERO_MV; - let new_mv = pred_mv_f + mvs[0]; - self.fill(mb_x, mb_y, true, new_mv); - let pred_mv_b = ZERO_MV; - let new_mv = pred_mv_b + mvs[1]; - self.fill(mb_x, mb_y, false, new_mv); - }, - MBType::MBForward => { - let pred_mv = self.pred_mv(idx, mbtype.is_fwd(), sstate.has_top, sstate.has_left, sstate.has_tr, sstate.has_tl, true); - let new_mv = mvs[0] + pred_mv; - self.fill(mb_x, mb_y, true, new_mv); - }, - MBType::MBBackward => { - let pred_mv = self.pred_mv(idx, mbtype.is_fwd(), sstate.has_top, sstate.has_left, sstate.has_tr, sstate.has_tl, true); - let new_mv = mvs[0] + pred_mv; - self.fill(mb_x, mb_y, false, new_mv); - }, - _ => {}, - } - } - pub fn get_mv(&self, mb_x: usize, mb_y: usize, x: usize, y: usize, fwd: bool) -> MV { - let idx = mb_x * 2 + x + (mb_y * 2 + y) * self.w; - if fwd { self.mv_f[idx] } - else { self.mv_b[idx] } - } - fn mv_gt_3(&self, mb_x: usize, mb_y: usize, x: usize, y: usize, vert: bool) -> bool { - let idx = mb_x * 2 + x + (mb_y * 2 + y) * self.w; - let off = if vert { self.w } else { 1 }; - let diffx = self.mv_f[idx].x - self.mv_f[idx - off].x; - let diffy = self.mv_f[idx].y - self.mv_f[idx - off].y; - (diffx < -3) || (diffx > 3) || (diffy < -3) || (diffy > 3) - } -} - -pub trait RV34BitstreamDecoder { - fn decode_slice_header(&mut self, br: &mut BitReader, old_w: usize, old_h: usize) -> DecoderResult<RV34SliceHeader>; - fn decode_intra_pred(&mut self, br: &mut BitReader, types: &mut [i8], pos: usize, tstride: usize, has_top: bool) -> DecoderResult<()>; - fn quant_dc(&self, is_intra: bool, q: u8) -> u8; - fn decode_inter_mb_hdr(&mut self, br: &mut BitReader, ftype: FrameType, mbtype: MBType) -> DecoderResult<MBInfo>; - fn predict_b_mv(&self, sstate: &SState, mvi: &MVInfo, mbtype: MBType, mvs: &[MV], mbinfo: &Vec<RV34MBInfo>) -> (MV, MV); -} - -pub trait RV34DSP { - fn loop_filter(&self, frame: &mut NAVideoBuffer<u8>, ftype: FrameType, mbinfo: &[RV34MBInfo], mb_w: usize, row: usize); - fn do_luma_mc(&self, frame: &mut NAVideoBuffer<u8>, prev_frame: &NAVideoBuffer<u8>, x: usize, y: usize, mv: MV, use16: bool, avg: bool); - fn do_chroma_mc(&self, frame: &mut NAVideoBuffer<u8>, prev_frame: &NAVideoBuffer<u8>, x: usize, y: usize, comp: usize, mv: MV, use8: bool, avg: bool); -} - -fn parse_slice_offsets(src: &[u8], offsets: &mut Vec<usize>) -> DecoderResult<()> { - let num_slices = (src[0] as usize) + 1; - let ini_off = num_slices * 8 + 1; - offsets.truncate(0); - - if ini_off >= src.len() { return Err(DecoderError::ShortData); } - - let mut br = BitReader::new(&src[1..], ini_off - 1, BitReaderMode::BE); - - for i in 0..num_slices { - br.skip(32)?; - let off = br.read(32)? as usize; - if (i == 0) && (off != 0) { - return Err(DecoderError::InvalidData); - } - if (i > 0) && (off <= offsets[i - 1]) { - return Err(DecoderError::InvalidData); - } - offsets.push(off); - } - - Ok(()) -} - -fn decode_slice_header(br: &mut BitReader, bd: &mut RV34BitstreamDecoder, slice_no: usize, slice_offs: &Vec<usize>, old_width: usize, old_height: usize) -> DecoderResult<RV34SliceHeader> { - validate!(slice_no < slice_offs.len()); - br.seek((slice_offs[slice_no] * 8) as u32)?; - let mut shdr = bd.decode_slice_header(br, old_width, old_height)?; - if slice_no < slice_offs.len() - 1 { - let cur_pos = br.tell() as u32; - br.seek((slice_offs[slice_no + 1] * 8) as u32)?; - let nhdr = bd.decode_slice_header(br, shdr.width, shdr.height)?; - br.seek(cur_pos)?; - validate!(nhdr.start > shdr.start); - shdr.end = nhdr.start; - } else { - shdr.end = ((shdr.width + 15) >> 4) * ((shdr.height + 15) >> 4); - } - Ok(shdr) -} - -const RV34_MB_MAX_SIZES: [usize; 6] = [ 0x2F, 0x62, 0x18B, 0x62F, 0x18BF, 0x23FF ]; -const RV34_SLICE_START_BITS: [u8; 6] = [ 6, 7, 9, 11, 13, 14 ]; - -pub fn get_slice_start_offset_bits(w: usize, h: usize) -> u8 { - let mb_size = ((w + 15) >> 4) * ((h + 15) >> 4) - 1; - let mut idx: usize = 0; - while (idx < 5) && (RV34_MB_MAX_SIZES[idx] < mb_size) { idx += 1; } - RV34_SLICE_START_BITS[idx] -} - -const RV34_DQUANT_TAB: [[i8; 2]; 32] = [ - [ 0, 0 ], [ 2, 1 ], [ -1, 1 ], [ -1, 1 ], [ -1, 1 ], [ -1, 1 ], [ -1, 1 ], [ -1, 1 ], - [ -1, 1 ], [ -1, 1 ], [ -1, 1 ], [ -2, 2 ], [ -2, 2 ], [ -2, 2 ], [ -2, 2 ], [ -2, 2 ], - [ -2, 2 ], [ -2, 2 ], [ -2, 2 ], [ -2, 2 ], [ -2, 2 ], [ -3, 3 ], [ -3, 3 ], [ -3, 3 ], - [ -3, 3 ], [ -3, 3 ], [ -3, 3 ], [ -3, 3 ], [ -3, 3 ], [ -3, 2 ], [ -3, 1 ], [ -3,-5 ] -]; - -const RV34_QUANT_TAB: [u16; 32] = [ - 60, 67, 76, 85, 96, 108, 121, 136, - 152, 171, 192, 216, 242, 272, 305, 341, - 383, 432, 481, 544, 606, 683, 767, 854, - 963, 1074, 1212, 1392, 1566, 1708, 1978, 2211 -]; - -const RV34_CHROMA_QUANT_DC: [u8; 32] = [ - 0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, - 14, 15, 15, 16, 17, 18, 18, 19, 20, 20, 21, 21, 22, 22, 23, 23 -]; -const RV34_CHROMA_QUANT_AC: [u8; 32] = [ - 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, - 16, 17, 17, 18, 19, 20, 20, 21, 22, 22, 23, 23, 24, 24, 25, 25 -]; - -fn decode_dquant(br: &mut BitReader, q: u8) -> DecoderResult<u8> { - if br.read_bool()? { - let diff = RV34_DQUANT_TAB[q as usize][br.read(1)? as usize]; - let qp = (q as i8) + diff; - validate!((qp > 0) && (qp < 32)); - Ok(qp as u8) - } else { - let qp = br.read(5)? as u8; - Ok(qp) - } -} - -pub struct SState { - pub mb_x: usize, - pub mb_y: usize, - pub mb_w: usize, - pub mb_h: usize, - pub cbp: u32, - pub q: u8, - pub q_dc: u8, - pub set_idx: usize, - pub has_left: bool, - pub has_top: bool, - pub has_tl: bool, - pub has_tr: bool, - pub trd: u16, - pub trb: u16, -} - -impl SState { - fn new() -> Self { - Self { - mb_x: 0, - mb_y: 0, - mb_w: 0, - mb_h: 0, - cbp: 0, - q: 0, - q_dc: 0, - set_idx: 0, - has_left: false, - has_top: false, - has_tl: false, - has_tr: false, - trd: 0, - trb: 0, - } - } -} - -struct MBHist { - is_p: bool, - hist: [MBType; 4], - count: usize, -} - -impl MBHist { - fn new(ftype: FrameType) -> Self { Self { is_p: ftype == FrameType::P, hist: [MBType::Invalid; 4], count: 0 } } - fn add(&mut self, mbt: MBType) { - let mbt2 = match mbt { - MBType::MBSkip if self.is_p => MBType::MBP16x16, - MBType::MBSkip if !self.is_p => MBType::MBDirect, - _ => mbt, - }; - self.hist[self.count] = mbt2; - self.count += 1; - } - fn get_mbtype(&self) -> MBType { - if self.count == 0 { - MBType::MBIntra - } else if self.count == 1 { - self.hist[0] - } else if self.count == 2 { - if self.hist[0].get_weight() <= self.hist[1].get_weight() { - self.hist[0] - } else { - self.hist[1] - } - } else { - let mut w: [usize; 12] = [0; 12]; - for i in 0..self.count { w[self.hist[i].get_weight()] += 1; } - let mut nz_idx = 0; - for i in 0..12 { - if w[i] == self.count { return MBTYPE_FROM_WEIGHT[i]; } - if (w[i] > w[nz_idx]) || (w[nz_idx] == 0) { nz_idx = i; } - } - - MBTYPE_FROM_WEIGHT[nz_idx] - } - } -} - -fn decode_mv(br: &mut BitReader) -> DecoderResult<MV> { - let x = br.read_code_signed(IntCodeType::Gamma)? as i16; - let y = br.read_code_signed(IntCodeType::Gamma)? as i16; - Ok(MV{ x: x, y: y }) -} - -fn do_mc_16x16(dsp: &Box<RV34DSP>, buf: &mut NAVideoBuffer<u8>, prevbuf: &NAVideoBuffer<u8>, mb_x: usize, mb_y: usize, mv: MV, avg: bool) { - dsp.do_luma_mc (buf, prevbuf, mb_x * 16, mb_y * 16, mv, true, avg); - dsp.do_chroma_mc(buf, prevbuf, mb_x * 8, mb_y * 8, 1, mv, true, avg); - dsp.do_chroma_mc(buf, prevbuf, mb_x * 8, mb_y * 8, 2, mv, true, avg); -} - -fn do_mc_8x8(dsp: &Box<RV34DSP>, buf: &mut NAVideoBuffer<u8>, prevbuf: &NAVideoBuffer<u8>, mb_x: usize, xoff: usize, mb_y: usize, yoff: usize, mv: MV, avg: bool) { - dsp.do_luma_mc (buf, prevbuf, mb_x * 16 + xoff * 8, mb_y * 16 + yoff * 8, mv, false, avg); - dsp.do_chroma_mc(buf, prevbuf, mb_x * 8 + xoff * 4, mb_y * 8 + yoff * 4, 1, mv, false, avg); - dsp.do_chroma_mc(buf, prevbuf, mb_x * 8 + xoff * 4, mb_y * 8 + yoff * 4, 2, mv, false, avg); -} - -fn do_avg(cdsp: &RV34CommonDSP, buf: &mut NAVideoBuffer<u8>, avg_buf: &NAVideoBuffer<u8>, mb_x: usize, xb: usize, mb_y: usize, yb: usize, size: usize, ratio1: u32, ratio2: u32) { - for comp in 0..3 { - let xoff = if comp == 0 { mb_x * 16 + xb * 8 } else { mb_x * 8 + xb * 4 }; - let yoff = if comp == 0 { mb_y * 16 + yb * 8 } else { mb_y * 8 + yb * 4 }; - let csize = if comp == 0 { size } else { size >> 1 }; - let dstride = buf.get_stride(comp); - let doffset = buf.get_offset(comp) + xoff + yoff * dstride; - let mut data = buf.get_data_mut(); - let dst: &mut [u8] = data.as_mut_slice(); - - let sstride = avg_buf.get_stride(comp); - let soffset = avg_buf.get_offset(comp); - let data = avg_buf.get_data(); - let src: &[u8] = data.as_slice(); - - if ratio1 == ratio2 { - cdsp.avg(dst, doffset, dstride, src, soffset, sstride, csize); - } else { - cdsp.weight(dst, doffset, dstride, src, soffset, sstride, ratio2, ratio1, csize); - } - } -} - -pub struct RV34Decoder { - is_rv30: bool, - coderead: RV34Codes, - dsp: Box<RV34DSP>, - cdsp: RV34CommonDSP, - width: usize, - height: usize, - ipbs: IPBShuffler, - mvi: MVInfo, - ref_mvi: MVInfo, - last_ts: u16, - next_ts: u16, - ratio1: u32, - ratio2: u32, - is_b: bool, - mbinfo: Vec<RV34MBInfo>, - avg_buf: NAVideoBuffer<u8>, - base_ts: u64, -} - -impl RV34Decoder { - pub fn new(is_rv30: bool, dsp: Box<RV34DSP>) -> Self { - let tmp_vinfo = NAVideoInfo::new(16, 16, false, YUV420_FORMAT); - let mut vt = alloc_video_buffer(tmp_vinfo, 4).unwrap(); - let vb = vt.get_vbuf(); - let avg_buf = vb.unwrap(); - RV34Decoder { - is_rv30: is_rv30, - coderead: RV34Codes::new(), - dsp: dsp, - cdsp: RV34CommonDSP::new(), - ipbs: IPBShuffler::new(), - mvi: MVInfo::new(), - ref_mvi: MVInfo::new(), - mbinfo: Vec::new(), - width: 0, height: 0, - last_ts: 0, next_ts: 0, - ratio1: 0, ratio2: 0, - is_b: false, - avg_buf: avg_buf, - base_ts: 0, - } - } - fn decode_mb_header_intra(&mut self, bd: &mut RV34BitstreamDecoder, br: &mut BitReader, is_i16: bool, im: &mut IntraModeState, q: u8, has_top: bool, has_dq: bool) -> DecoderResult<MBInfo> { - if is_i16 { - let imode = br.read(2)? as i8; - im.fill_block(imode); - return Ok(MBInfo { mbtype: MBType::MBIntra16, skip_run: 0, dquant: false }); - } else { - let dq = if !has_dq { - if !self.is_rv30 { !br.read_bool()? } else { false } - } else { false }; - if dq { - decode_dquant(br, q)?; - } - bd.decode_intra_pred(br, im.cache.data.as_mut_slice(), im.cache.xpos, im.cache.stride, has_top)?; - return Ok(MBInfo { mbtype: MBType::MBIntra, skip_run: 0, dquant: dq }); - } - } - fn decode_mb_header_inter(&mut self, bd: &mut RV34BitstreamDecoder, br: &mut BitReader, ftype: FrameType, mbtype: MBType, im: &mut IntraModeState, q: u8, has_top: bool) -> DecoderResult<MBInfo> { - let hdr = bd.decode_inter_mb_hdr(br, ftype, mbtype)?; - validate!(hdr.mbtype != MBType::Invalid); - if hdr.dquant { - decode_dquant(br, q)?; - } - if hdr.mbtype.is_intra() { - return self.decode_mb_header_intra(bd, br, hdr.mbtype.is_16(), im, q, has_top, true); - } - return Ok(hdr); - } - - fn decode_mb_intra(&mut self, sstate: &SState, imode: &IntraModeState, buf: &mut NAVideoBuffer<u8>, br: &mut BitReader, is_16: bool) -> DecoderResult<()> { - let mut cur_cbp = sstate.cbp; - { - let q_dc = RV34_QUANT_TAB[sstate.q_dc as usize]; - let q_ac = RV34_QUANT_TAB[sstate.q as usize]; - let luma_set = if is_16 { 2 } else { 1 }; - let mut coeffs16: [i16; 16] = [0; 16]; - if is_16 { - let has_ac = self.coderead.decode_block(br, &mut coeffs16, 3, 0, q_dc, q_dc, q_ac)?; - if has_ac { - self.cdsp.transform16(&mut coeffs16); - } else { - self.cdsp.transform16_dc(&mut coeffs16); - } - } - let stride = buf.get_stride(0); - let mut offset = buf.get_offset(0) + sstate.mb_x * 16 + sstate.mb_y * 16 * stride; - let mut data = buf.get_data_mut(); - let framebuf: &mut [u8] = data.as_mut_slice(); - - if is_16 { - let im16 = imode.get_pred16_type(sstate.has_top, sstate.has_left); - self.cdsp.ipred16x16[im16 as usize](framebuf, offset, stride); - } - - for y in 0..4 { - for x in 0..4 { - let mut coeffs: [i16; 16] = [0; 16]; - let has_ac; - if (cur_cbp & 1) != 0 { - has_ac = self.coderead.decode_block(br, &mut coeffs, luma_set, 0, q_ac, q_ac, q_ac)?; - } else { - has_ac = false; - } - if is_16 { - coeffs[0] = coeffs16[x + y * 4]; - } else { - let noright = (sstate.mb_x == sstate.mb_w - 1) && (x == 3); - let has_top = sstate.has_top || (y > 0); - let im = imode.get_pred4_type(x, y, sstate.has_top, sstate.has_left); - let topright: [u8; 4] = if (noright && sstate.has_top && y == 0) || (x == 3 && y > 0) { - let i = offset + x * 4 - stride; - [framebuf[i + 3], framebuf[i + 3], framebuf[i + 3], framebuf[i + 3]] - } else if has_top { - let i = offset + x * 4 - stride; - [framebuf[i + 4], framebuf[i + 5], framebuf[i + 6], framebuf[i + 7]] - } else { - [0; 4] - }; - self.cdsp.ipred4x4[im as usize](framebuf, offset + x*4, stride, &topright); - } - if has_ac { - self.cdsp.transform(&mut coeffs); - } else { - self.cdsp.transform_dc(&mut coeffs); - } - self.cdsp.add_coeffs(framebuf, offset + x * 4, stride, &coeffs); - cur_cbp >>= 1; - } - offset += stride * 4; - } - } - let q_dc = RV34_QUANT_TAB[RV34_CHROMA_QUANT_DC[sstate.q as usize] as usize]; - let q_ac = RV34_QUANT_TAB[RV34_CHROMA_QUANT_AC[sstate.q as usize] as usize]; - let chroma_set = 0; - for comp in 1..3 { - let stride = buf.get_stride(comp); - let mut offset = buf.get_offset(comp) + sstate.mb_x * 8 + sstate.mb_y * 8 * stride; - let mut data = buf.get_data_mut(); - let framebuf: &mut [u8] = data.as_mut_slice(); - if is_16 { - let im8 = imode.get_pred8_type(sstate.has_top, sstate.has_left); - self.cdsp.ipred8x8[im8 as usize](framebuf, offset, stride); - } - for y in 0..2 { - for x in 0..2 { - let mut coeffs: [i16; 16] = [0; 16]; - let has_ac; - if (cur_cbp & 1) != 0 { - has_ac = self.coderead.decode_block(br, &mut coeffs, chroma_set, 1, q_dc, q_ac, q_ac)?; - } else { - has_ac = false; - } - if !is_16 { - let noright = (sstate.mb_x == sstate.mb_w - 1) && (x == 1); - let has_top = sstate.has_top || (y > 0); - let im = imode.get_pred4_type_chroma(x, y, sstate.has_top, sstate.has_left); - let topright: [u8; 4] = if (noright && sstate.has_top && y == 0) || (x == 1 && y > 0) { - let i = offset + x * 4 - stride; - [framebuf[i + 3], framebuf[i + 3], framebuf[i + 3], framebuf[i + 3]] - } else if has_top { - let i = offset + x * 4 - stride; - [framebuf[i + 4], framebuf[i + 5], framebuf[i + 6], framebuf[i + 7]] - } else { - [0; 4] - }; - self.cdsp.ipred4x4[im as usize](framebuf, offset + x*4, stride, &topright); - } - if has_ac { - self.cdsp.transform(&mut coeffs); - } else { - self.cdsp.transform_dc(&mut coeffs); - } - self.cdsp.add_coeffs(framebuf, offset + x * 4, stride, &coeffs); - cur_cbp >>= 1; - } - offset += stride * 4; - } - } - Ok(()) - } - - fn do_mc(&mut self, buf: &mut NAVideoBuffer<u8>, mbh: &MBInfo, sstate: &SState) { - let mb_x = sstate.mb_x; - let mb_y = sstate.mb_y; - match mbh.mbtype { - MBType::MBP16x16 | MBType::MBP16x16Mix => { - if let Some(ref prevbuf) = self.ipbs.get_lastref() { - let mv = self.mvi.get_mv(mb_x, mb_y, 0, 0, true); - do_mc_16x16(&self.dsp, buf, prevbuf, mb_x, mb_y, mv, false); - } - }, - MBType::MBForward => { - if let Some(ref fwdbuf) = self.ipbs.get_b_fwdref() { - let mv = self.mvi.get_mv(mb_x, mb_y, 0, 0, true); - do_mc_16x16(&self.dsp, buf, fwdbuf, mb_x, mb_y, mv, false); - } - }, - MBType::MBBackward => { - if let Some(ref bwdbuf) = self.ipbs.get_b_bwdref() { - let mv = self.mvi.get_mv(mb_x, mb_y, 0, 0, false); - do_mc_16x16(&self.dsp, buf, bwdbuf, mb_x, mb_y, mv, false); - } - }, - MBType::MBP8x8 | MBType::MBP8x16 | MBType::MBP16x8 => { - if let Some(ref prevbuf) = self.ipbs.get_lastref() { - for y in 0..2 { - for x in 0..2 { - let mv = self.mvi.get_mv(mb_x, mb_y, x, y, true); - do_mc_8x8(&self.dsp, buf, prevbuf, mb_x, x, mb_y, y, mv, false); - } - } - } - }, - MBType::MBSkip if !self.is_b => { - if let Some(ref prevbuf) = self.ipbs.get_lastref() { - do_mc_16x16(&self.dsp, buf, prevbuf, mb_x, mb_y, ZERO_MV, false); - } - }, - MBType::MBSkip | MBType::MBDirect => { - if let (Some(ref fwdbuf), Some(ref bwdbuf)) = (self.ipbs.get_b_fwdref(), self.ipbs.get_b_bwdref()) { - for y in 0..2 { - for x in 0..2 { - let (mv_f, mv_b) = self.ref_mvi.get_mv(mb_x, mb_y, x, y, true).scale(sstate.trd, sstate.trb); - do_mc_8x8(&self.dsp, buf, fwdbuf, mb_x, x, mb_y, y, mv_f, false); - do_mc_8x8(&self.dsp, &mut self.avg_buf, bwdbuf, mb_x, x, mb_y, y, mv_b, true); - do_avg(&self.cdsp, buf, &self.avg_buf, mb_x, x, mb_y, y, 8, self.ratio1, self.ratio2); - } - } - } - }, - MBType::MBBidir => { - if let (Some(ref fwdbuf), Some(ref bwdbuf)) = (self.ipbs.get_b_fwdref(), self.ipbs.get_b_bwdref()) { - let mv_f = self.mvi.get_mv(mb_x, mb_y, 0, 0, true); - let mv_b = self.mvi.get_mv(mb_x, mb_y, 0, 0, false); - do_mc_16x16(&self.dsp, buf, fwdbuf, mb_x, mb_y, mv_f, false); - do_mc_16x16(&self.dsp, &mut self.avg_buf, bwdbuf, mb_x, mb_y, mv_b, true); - do_avg(&self.cdsp, buf, &self.avg_buf, mb_x, 0, mb_y, 0, 16, self.ratio1, self.ratio2); - } - }, - _ => {}, - }; - } - fn decode_mb_inter(&mut self, sstate: &SState, mbh: &MBInfo, buf: &mut NAVideoBuffer<u8>, br: &mut BitReader, is_16: bool) -> DecoderResult<()> { - self.do_mc(buf, mbh, sstate); - - let mut cur_cbp = sstate.cbp; - - { - let q_dc = RV34_QUANT_TAB[sstate.q_dc as usize]; - let q_ac = RV34_QUANT_TAB[sstate.q as usize]; - let luma_set = if is_16 { 2 } else { 0 }; - let mut coeffs16: [i16; 16] = [0; 16]; - if is_16 { - let has_ac = self.coderead.decode_block(br, &mut coeffs16, 3, 0, q_dc, q_dc, q_ac)?; - if has_ac { - self.cdsp.transform16(&mut coeffs16); - } else { - self.cdsp.transform16_dc(&mut coeffs16); - } - } - let stride = buf.get_stride(0); - let mut offset = buf.get_offset(0) + sstate.mb_x * 16 + sstate.mb_y * 16 * stride; - let mut data = buf.get_data_mut(); - let framebuf: &mut [u8] = data.as_mut_slice(); - - for y in 0..4 { - for x in 0..4 { - let mut coeffs: [i16; 16] = [0; 16]; - let has_ac; - if (cur_cbp & 1) != 0 { - has_ac = self.coderead.decode_block(br, &mut coeffs, luma_set, 0, q_ac, q_ac, q_ac)?; - } else { - has_ac = false; - } - if is_16 { - coeffs[0] = coeffs16[x + y * 4]; - } - if has_ac { - self.cdsp.transform(&mut coeffs); - } else { - self.cdsp.transform_dc(&mut coeffs); - } - self.cdsp.add_coeffs(framebuf, offset + x * 4, stride, &coeffs); - cur_cbp >>= 1; - } - offset += stride * 4; - } - } - if is_16 { - self.coderead.select_codes(false, sstate.q, sstate.set_idx, false); - } - let q_dc = RV34_QUANT_TAB[RV34_CHROMA_QUANT_DC[sstate.q as usize] as usize]; - let q_ac = RV34_QUANT_TAB[RV34_CHROMA_QUANT_AC[sstate.q as usize] as usize]; - let chroma_set = 1; - for comp in 1..3 { - let stride = buf.get_stride(comp); - let mut offset = buf.get_offset(comp) + sstate.mb_x * 8 + sstate.mb_y * 8 * stride; - let mut data = buf.get_data_mut(); - let framebuf: &mut [u8] = data.as_mut_slice(); - for _ in 0..2 { - for x in 0..2 { - let mut coeffs: [i16; 16] = [0; 16]; - let has_ac; - if (cur_cbp & 1) != 0 { - has_ac = self.coderead.decode_block(br, &mut coeffs, chroma_set, 1, q_dc, q_ac, q_ac)?; - } else { - has_ac = false; - } - if has_ac { - self.cdsp.transform(&mut coeffs); - } else { - self.cdsp.transform_dc(&mut coeffs); - } - self.cdsp.add_coeffs(framebuf, offset + x * 4, stride, &coeffs); - cur_cbp >>= 1; - } - offset += stride * 4; - } - } - Ok(()) - } - fn fill_deblock_flags(&self, sstate: &SState, mb_pos: usize, mbinfo: &mut Vec<RV34MBInfo>) { - let mbt = mbinfo[mb_pos].mbtype; - let mut hmvmask = 0; - let mut vmvmask = 0; - - for y in 0..2 { - for x in 0..2 { - let shift = x * 2 + y * 8; - if ((x > 0) || (sstate.mb_x > 0)) && self.mvi.mv_gt_3(sstate.mb_x, sstate.mb_y, x, y, false) { - vmvmask |= 0x11 << shift; - } - if ((y > 0) || sstate.has_top) && self.mvi.mv_gt_3(sstate.mb_x, sstate.mb_y, x, y, true) { - hmvmask |= 0x03 << shift; - } - } - } - if !sstate.has_top { hmvmask &= !0x000F; } - if sstate.mb_x == 0 { vmvmask &= !0x1111; } - if self.is_rv30 { - vmvmask |= (vmvmask & 0x4444) >> 1; - hmvmask |= (hmvmask & 0x0F00) >> 4; - if sstate.mb_x > 0 { - mbinfo[mb_pos - 1].deblock |= (vmvmask & 0x1111) << 3; - } - if sstate.has_top { - - mbinfo[mb_pos - sstate.mb_w].deblock |= (hmvmask & 0xF) << 12; - } - } - if mbt.is_intra_or_16() { - mbinfo[mb_pos].deblock = 0xFFFF; - mbinfo[mb_pos].cbp_c = 0xFF; - } else { - mbinfo[mb_pos].deblock = (mbinfo[mb_pos].cbp as u16) | hmvmask | vmvmask; - mbinfo[mb_pos].cbp_c = (mbinfo[mb_pos].cbp >> 16) as u8; - } - } - - pub fn parse_frame(&mut self, src: &[u8], bd: &mut RV34BitstreamDecoder) -> DecoderResult<(NABufferType, FrameType, u64)> { - let mut slice_offs: Vec<usize> = Vec::new(); - parse_slice_offsets(src, &mut slice_offs)?; - let ini_off = slice_offs.len() * 8 + 1; - - let mut br = BitReader::new(&src[ini_off..], src.len() - ini_off, BitReaderMode::BE); - let hdr0 = decode_slice_header(&mut br, bd, 0, &slice_offs, self.width, self.height)?; - validate!((hdr0.width != 0) && (hdr0.height != 0)); - self.width = hdr0.width; - self.height = hdr0.height; - let mb_w = (hdr0.width + 15) >> 4; - let mb_h = (hdr0.height + 15) >> 4; - let mut mb_pos: usize = 0; - let mut slice = hdr0; - let mut slice_no: usize = 1; - let is_intra = hdr0.ftype == FrameType::I; - let mut skip_run: usize = 0; - let mut imode = IntraModeState::new(mb_w); - let mut q = hdr0.quant; - - let mut sstate = SState::new(); - let mut mbinfo: Vec<RV34MBInfo> = Vec::with_capacity(mb_w * mb_h); - - self.is_b = hdr0.ftype == FrameType::B; - if hdr0.ftype != FrameType::B { - self.last_ts = self.next_ts; - self.next_ts = hdr0.pts; - if self.last_ts > self.next_ts { - self.base_ts += 1 << 13; - } - } - let ts_diff = (self.next_ts << 3).wrapping_sub(hdr0.pts << 3) >> 3; - let ts = self.base_ts + (self.next_ts as u64) - (ts_diff as u64); - sstate.trd = (self.next_ts << 3).wrapping_sub(self.last_ts << 3) >> 3; - sstate.trb = (hdr0.pts << 3).wrapping_sub(self.last_ts << 3) >> 3; - if sstate.trb != 0 { - self.ratio1 = ((sstate.trb as u32) << 14) / (sstate.trd as u32); - self.ratio2 = (((sstate.trd as u32) - (sstate.trb as u32)) << 14) / (sstate.trd as u32); - } else { - self.ratio1 = 1 << 14 >> 1; - self.ratio2 = 1 << 14 >> 1; - } - //todo validate against ref frame - - let vinfo = NAVideoInfo::new(hdr0.width, hdr0.height, false, YUV420_FORMAT); - let bufret = alloc_video_buffer(vinfo, 4); - if let Err(_) = bufret { return Err(DecoderError::InvalidData); } - let mut bufinfo = bufret.unwrap(); - let mut buf = bufinfo.get_vbuf().unwrap(); - - sstate.q = q; - sstate.has_top = false; - sstate.mb_w = mb_w; - sstate.mb_h = mb_h; - sstate.set_idx = hdr0.set_idx; - - self.mvi.resize(mb_w, mb_h); - for mb_y in 0..mb_h { - sstate.mb_y = mb_y; - sstate.has_left = false; - for mb_x in 0..mb_w { - sstate.mb_x = mb_x; - if mb_pos == slice.end { - slice = decode_slice_header(&mut br, bd, slice_no, &slice_offs, self.width, self.height)?; - validate!(slice.fits(&hdr0)); - q = slice.quant; - slice_no += 1; - imode.reset(); - sstate.q = q; - sstate.has_top = false; - sstate.has_left = false; - sstate.set_idx = slice.set_idx; - } - sstate.has_top = (mb_pos - slice.start) >= mb_w; - sstate.has_tl = sstate.has_top && (mb_x > 0) && (mb_pos > slice.start + mb_w); - sstate.has_tr = (mb_x < mb_w - 1) && (mb_pos - slice.start >= mb_w - 1); - imode.set_mb_x(mb_x); - let mbh = if is_intra { - let is_i16 = br.read_bool()?; - self.decode_mb_header_intra(bd, &mut br, is_i16, &mut imode, q, sstate.has_top, false)? - } else { - if skip_run == 0 { - let mbtype; - if self.is_rv30 { - mbtype = MBType::Invalid; - } else { - let mut hist = MBHist::new(hdr0.ftype); - if sstate.has_top { - hist.add(mbinfo[mb_pos - mb_w].mbtype); - if sstate.has_tr { hist.add(mbinfo[mb_pos - mb_w + 1].mbtype); } - } - if sstate.has_left { hist.add(mbinfo[mb_pos - 1].mbtype); } - if sstate.has_tl { hist.add(mbinfo[mb_pos - mb_w - 1].mbtype); } - mbtype = hist.get_mbtype(); - } - self.decode_mb_header_inter(bd, &mut br, hdr0.ftype, mbtype, &mut imode, q, sstate.has_top)? - } else { - skip_run -= 1; - MBInfo { mbtype: MBType::MBSkip, skip_run: 0, dquant: false } - } - }; - if !mbh.mbtype.is_intra() { - let mut mvs: [MV; 4] = [ZERO_MV; 4]; - for i in 0..mbh.mbtype.get_num_mvs() { - mvs[i] = decode_mv(&mut br)?; - } - if !self.is_b { - self.mvi.set_mb(mb_x, mb_y, mbh.mbtype, &self.ref_mvi, &mvs, &sstate); - } else { - let (mv_f, mv_b) = bd.predict_b_mv(&sstate, &self.mvi, mbh.mbtype, &mvs, &mbinfo); - self.mvi.fill(mb_x, mb_y, true, mv_f); - self.mvi.fill(mb_x, mb_y, false, mv_b); - } - } - let cbp; - let is_16 = (mbh.mbtype == MBType::MBIntra16) || (mbh.mbtype == MBType::MBP16x16Mix); - if mbh.mbtype == MBType::MBSkip { - cbp = 0; - if mbh.skip_run > 0 { - skip_run = mbh.skip_run; - } - } else { - self.coderead.select_codes(mbh.mbtype.is_intra(), q, slice.set_idx, is_16); - if mbh.mbtype == MBType::MBP16x16Mix { - self.coderead.select_codes(true, q, slice.set_idx, true); - } - cbp = self.coderead.decode_cbp(&mut br)?; - } - sstate.cbp = cbp; - if is_intra || mbh.mbtype.is_intra() { - sstate.q_dc = bd.quant_dc(true, q); - self.decode_mb_intra(&sstate, &imode, &mut buf, &mut br, is_16)?; - } else { - imode.fill_block(0); - self.decode_mb_inter(&sstate, &mbh, &mut buf, &mut br, is_16)?; - } - - let mi = RV34MBInfo { cbp: cbp, q: q, mbtype: mbh.mbtype, deblock: 0, cbp_c: 0 }; - mbinfo.push(mi); - if is_intra { - mbinfo[mb_pos].deblock = 0xFFFF; - mbinfo[mb_pos].cbp_c = 0xFF; - } else { - self.fill_deblock_flags(&sstate, mb_pos, &mut mbinfo); - } - sstate.has_left = true; - mb_pos += 1; - } - if hdr0.deblock && (mb_y >= 1) { - self.dsp.loop_filter(&mut buf, hdr0.ftype, &mbinfo, mb_w, mb_y - 1); - } - imode.update(); - } - if hdr0.deblock { - self.dsp.loop_filter(&mut buf, hdr0.ftype, &mbinfo, mb_w, mb_h - 1); - } - if !self.is_b { - self.ipbs.add_frame(buf); - mem::swap(&mut self.mvi, &mut self.ref_mvi); - mem::swap(&mut self.mbinfo, &mut mbinfo); - } - - Ok((bufinfo, hdr0.ftype, ts)) - } -} diff --git a/src/codecs/real/rv30dsp.rs b/src/codecs/real/rv30dsp.rs deleted file mode 100644 index b1365db..0000000 --- a/src/codecs/real/rv30dsp.rs +++ /dev/null @@ -1,435 +0,0 @@ -use crate::frame::{FrameType, NAVideoBuffer}; -use crate::codecs::MV; -use crate::codecs::blockdsp::edge_emu; -use super::rv3040::{RV34DSP, RV34MBInfo}; - -fn clip8(a: i16) -> u8 { - if a < 0 { 0 } - else if a > 255 { 255 } - else { a as u8 } -} - -fn rv3_filter_h(dst: &mut [u8], mut didx: usize, dstride: usize, src: &[u8], mut sidx: usize, sstride: usize, bsize: usize, c1: i16, c2: i16) { - for _ in 0..bsize { - for x in 0..bsize { - dst[didx + x] = clip8((-((src[sidx + x - 1] as i16) + (src[sidx + x + 2] as i16)) + (src[sidx + x + 0] as i16) * c1 + (src[sidx + x + 1] as i16) * c2 + 8) >> 4); - } - sidx += sstride; - didx += dstride; - } -} - -fn rv3_filter_v(dst: &mut [u8], mut didx: usize, dstride: usize, src: &[u8], mut sidx: usize, sstride: usize, bsize: usize, c1: i16, c2: i16) { - for _ in 0..bsize { - for x in 0..bsize { - dst[didx + x] = clip8((-((src[sidx + x - 1 * sstride] as i16) + (src[sidx + x + 2 * sstride] as i16)) + (src[sidx + x + 0 * sstride] as i16) * c1 + (src[sidx + x + 1 * sstride] as i16) * c2 + 8) >> 4); - } - sidx += sstride; - didx += dstride; - } -} - -macro_rules! mc_matrix { - ($s: ident, $o: expr, $c1: expr) => ( - ($c1 * 6) * ($s[$o] as i32) + ($c1 * 9) * ($s[$o + 1] as i32) + ($c1) * ($s[$o + 2] as i32) - ); - ($s: ident, $o: expr, $c1: expr, $d1: expr, $d2: expr) => ( - (-$c1) * ($s[$o - 1] as i32) + ($c1 * $d1) * ($s[$o] as i32) + ($c1 * $d2) * ($s[$o + 1] as i32) + (-$c1) * ($s[$o + 2] as i32) - ); - ($s: ident, $o: expr, $ss: expr, $c1: expr, $c2: expr, $d1: expr, $d2: expr) => ( - ((mc_matrix!($s, $o - $ss, -1, $d1, $d2) + - mc_matrix!($s, $o , $c1, $d1, $d2) + - mc_matrix!($s, $o + $ss, $c2, $d1, $d2) + - mc_matrix!($s, $o + 2 * $ss, -1, $d1, $d2) + 128) >> 8) as i16 - ); - (m22; $s: ident, $o: expr, $ss: expr) => ( - ((mc_matrix!($s, $o + 0 * $ss, 6) + - mc_matrix!($s, $o + 1 * $ss, 9) + - mc_matrix!($s, $o + 2 * $ss, 1) + 128) >> 8) as i16 - ); -} - -macro_rules! mc_func { - (copy; $name: ident, $size: expr) => ( - fn $name (dst: &mut [u8], mut didx: usize, dstride: usize, src: &[u8], mut sidx: usize, sstride: usize) { - for _ in 0..$size { - let d = &mut dst[didx..][..$size]; - let s = &src[sidx..][..$size]; - for x in 0..$size { d[x] = s[x]; } - didx += dstride; - sidx += sstride; - } - } - ); - (hor; $name: ident, $c1: expr, $c2: expr, $size: expr) => ( - fn $name (dst: &mut [u8], didx: usize, dstride: usize, src: &[u8], sidx: usize, sstride: usize) { - rv3_filter_h(dst, didx, dstride, src, sidx, sstride, $size, $c1, $c2); - } - ); - (ver; $name: ident, $c1: expr, $c2: expr, $size: expr) => ( - fn $name (dst: &mut [u8], didx: usize, dstride: usize, src: &[u8], sidx: usize, sstride: usize) { - rv3_filter_v(dst, didx, dstride, src, sidx, sstride, $size, $c1, $c2); - } - ); - (m11; $name: ident, $size: expr) => ( - fn $name (dst: &mut [u8], mut didx: usize, dstride: usize, src: &[u8], mut sidx: usize, sstride: usize) { - for _ in 0..$size { - for x in 0..$size { - dst[didx + x] = clip8(mc_matrix!(src, sidx + x, sstride, 12, 6, 12, 6)); - } - didx += dstride; - sidx += sstride; - } - } - ); - (m12; $name: ident, $size: expr) => ( - fn $name (dst: &mut [u8], mut didx: usize, dstride: usize, src: &[u8], mut sidx: usize, sstride: usize) { - for _ in 0..$size { - for x in 0..$size { - dst[didx + x] = clip8(mc_matrix!(src, sidx + x, sstride, 6, 12, 12, 6)); - } - didx += dstride; - sidx += sstride; - } - } - ); - (m21; $name: ident, $size: expr) => ( - fn $name (dst: &mut [u8], mut didx: usize, dstride: usize, src: &[u8], mut sidx: usize, sstride: usize) { - for _ in 0..$size { - for x in 0..$size { - dst[didx + x] = clip8(mc_matrix!(src, sidx + x, sstride, 12, 6, 6, 12)); - } - didx += dstride; - sidx += sstride; - } - } - ); - (m22; $name: ident, $size: expr) => ( - fn $name (dst: &mut [u8], mut didx: usize, dstride: usize, src: &[u8], mut sidx: usize, sstride: usize) { - for _ in 0..$size { - for x in 0..$size { - dst[didx + x] = clip8(mc_matrix!(m22; src, sidx + x, sstride)); - } - didx += dstride; - sidx += sstride; - } - } - ); -} -mc_func!(copy; copy_16, 16); -mc_func!(copy; copy_8, 8); -mc_func!(hor; luma_mc_10_16, 12, 6, 16); -mc_func!(hor; luma_mc_20_16, 6, 12, 16); -mc_func!(hor; luma_mc_10_8, 12, 6, 8); -mc_func!(hor; luma_mc_20_8, 6, 12, 8); -mc_func!(ver; luma_mc_01_16, 12, 6, 16); -mc_func!(ver; luma_mc_02_16, 6, 12, 16); -mc_func!(ver; luma_mc_01_8, 12, 6, 8); -mc_func!(ver; luma_mc_02_8, 6, 12, 8); -mc_func!(m11; luma_mc_11_16, 16); -mc_func!(m11; luma_mc_11_8, 8); -mc_func!(m21; luma_mc_21_16, 16); -mc_func!(m21; luma_mc_21_8, 8); -mc_func!(m12; luma_mc_12_16, 16); -mc_func!(m12; luma_mc_12_8, 8); -mc_func!(m22; luma_mc_22_16, 16); -mc_func!(m22; luma_mc_22_8, 8); - -const RV30_CHROMA_FRAC1: [u16; 3] = [ 8, 5, 3 ]; -const RV30_CHROMA_FRAC2: [u16; 3] = [ 0, 3, 5 ]; -fn rv30_chroma_mc(dst: &mut [u8], mut didx: usize, dstride: usize, src: &[u8], mut sidx: usize, sstride: usize, size: usize, x: usize, y: usize) { - if (x == 0) && (y == 0) { - for _ in 0..size { - for x in 0..size { dst[didx + x] = src[sidx + x]; } - didx += dstride; - sidx += sstride; - } - return; - } - let a = RV30_CHROMA_FRAC1[x] * RV30_CHROMA_FRAC1[y]; - let b = RV30_CHROMA_FRAC2[x] * RV30_CHROMA_FRAC1[y]; - let c = RV30_CHROMA_FRAC1[x] * RV30_CHROMA_FRAC2[y]; - let d = RV30_CHROMA_FRAC2[x] * RV30_CHROMA_FRAC2[y]; - for _ in 0..size { - for x in 0..size { - dst[didx + x] = ((a * (src[sidx + x] as u16) - + b * (src[sidx + x + 1] as u16) - + c * (src[sidx + x + sstride] as u16) - + d * (src[sidx + x + 1 + sstride] as u16) + 32) >> 6) as u8; - } - didx += dstride; - sidx += sstride; - } -} - -pub struct RV30DSP { - luma_mc: [[fn (&mut [u8], usize, usize, &[u8], usize, usize); 9]; 2], -} - -impl RV30DSP { - pub fn new() -> Self { - RV30DSP { - luma_mc: [ - [ copy_16, luma_mc_10_16, luma_mc_20_16, - luma_mc_01_16, luma_mc_11_16, luma_mc_21_16, - luma_mc_02_16, luma_mc_12_16, luma_mc_22_16 ], - [ copy_8, luma_mc_10_8, luma_mc_20_8, - luma_mc_01_8, luma_mc_11_8, luma_mc_21_8, - luma_mc_02_8, luma_mc_12_8, luma_mc_22_8 ] ], - } - } -} - -macro_rules! el { - ($src: ident, $o: expr) => ($src[$o] as i16); -} - -fn clip_symm(a: i16, lim: i16) -> i16 { - if a < -lim { - -lim - } else if a > lim { - lim - } else { - a - } -} - -const RV30_LOOP_FILTER_STRENGTH: [i16; 32] = [ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, - 2, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5 -]; - -macro_rules! test_bit { - ($pat: expr, $x: expr) => ( (($pat >> $x) & 1) != 0 ) -} - -fn rv30_loop_filter4(pix: &mut [u8], mut off: usize, step: usize, stride: usize, lim: i16) { - for _ in 0..4 { - let a = el!(pix, off - 2*step); - let b = el!(pix, off - step); - let c = el!(pix, off); - let d = el!(pix, off + step); - let diff0 = ((a - d) - (b - c) * 4) >> 3; - let diff = clip_symm(diff0, lim); - pix[off - step] = clip8(b + diff); - pix[off ] = clip8(c - diff); - off += stride; - } -} - -fn rv30_div_mv(mv: i16) -> (i16, usize) { - let i = mv / 3; - let f = mv - i * 3; - if f < 0 { - (i - 1, (f + 3) as usize) - } else { - (i, f as usize) - } -} - -fn check_pos(x: usize, y: usize, size: usize, w: usize, h: usize, dx: i16, dy: i16, e0: isize, e1: isize, e2: isize, e3: isize) -> bool { - let xn = (x as isize) + (dx as isize); - let yn = (y as isize) + (dy as isize); - - (xn - e0 >= 0) && (xn + (size as isize) + e1 <= (w as isize)) && (yn - e2 >= 0) && (yn + (size as isize) + e3 <= (h as isize)) -} - -const RV30_EDGE1: [isize; 3] = [ 0, 1, 1 ]; -const RV30_EDGE2: [isize; 3] = [ 0, 2, 2 ]; - -impl RV34DSP for RV30DSP { - fn loop_filter(&self, frame: &mut NAVideoBuffer<u8>, _ftype: FrameType, mbinfo: &[RV34MBInfo], mb_w: usize, row: usize) { - let mut offs: [usize; 3] = [0; 3]; - let mut stride: [usize; 3] = [0; 3]; - - for comp in 0..3 { - stride[comp] = frame.get_stride(comp); - let start = if comp == 0 { row * 16 } else { row * 8 }; - offs[comp] = frame.get_offset(comp) + start * stride[comp]; - } - - let mut data = frame.get_data_mut(); - let dst: &mut [u8] = data.as_mut_slice(); - - // vertical filter - let mut left_cbp = 0; - let mut left_lim = 0; - let mut left_dbk = 0; - let mut mb_pos: usize = row * mb_w; - for mb_x in 0..mb_w { - let cur_lim = RV30_LOOP_FILTER_STRENGTH[mbinfo[mb_pos].q as usize]; - let cur_dbk = mbinfo[mb_pos].deblock; - let cur_cbp = mbinfo[mb_pos].cbp_c; - let xstart = if mb_x == 0 { 1 } else { 0 }; - for y in 0..4 { - let yoff = offs[0] + mb_x * 16 + y * 4 * stride[0]; - for x in xstart..4 { - let cs = x + y*4; - let loc_lim; - - if test_bit!(cur_dbk, cs) { - loc_lim = cur_lim; - } else if (x == 0) && test_bit!(left_dbk, cs + 3) { - loc_lim = left_lim; - } else if (x != 0) && test_bit!(cur_dbk, cs - 1) { - loc_lim = cur_lim; - } else { - loc_lim = 0; - } - if loc_lim != 0 { - rv30_loop_filter4(dst, yoff + x * 4, 1, stride[0], loc_lim); - } - } - } - - for comp in 1..3 { - for y in 0..2 { - let coff = offs[comp] + mb_x * 8 + y * 4 * stride[comp]; - for x in xstart..2 { - let cs = x + y * 2 + (comp - 1) * 4; - let loc_lim; - - if test_bit!(cur_cbp, cs) { - loc_lim = cur_lim; - } else if (x == 0) && test_bit!(left_cbp, cs + 1) { - loc_lim = left_lim; - } else if (x != 0) && test_bit!(cur_cbp, cs - 1) { - loc_lim = cur_lim; - } else { - loc_lim = 0; - } - if loc_lim != 0 { - rv30_loop_filter4(dst, coff + x * 4, 1, stride[comp], loc_lim); - } - } - } - } - - left_lim = cur_lim; - left_dbk = cur_dbk; - left_cbp = cur_cbp; - mb_pos += 1; - } - - // horizontal filter - let mut mb_pos: usize = row * mb_w; - for mb_x in 0..mb_w { - let cur_lim = RV30_LOOP_FILTER_STRENGTH[mbinfo[mb_pos].q as usize]; - let cur_dbk = mbinfo[mb_pos].deblock; - let cur_cbp = mbinfo[mb_pos].cbp_c; - let ystart = if row == 0 { 1 } else { 0 }; - let top_lim; - let top_dbk; - let top_cbp; - if row > 0 { - top_lim = RV30_LOOP_FILTER_STRENGTH[mbinfo[mb_pos - mb_w].q as usize]; - top_dbk = mbinfo[mb_pos - mb_w].deblock; - top_cbp = mbinfo[mb_pos - mb_w].cbp_c; - } else { - top_lim = 0; - top_dbk = 0; - top_cbp = 0; - } - for y in ystart..4 { - let yoff = offs[0] + mb_x * 16 + y * 4 * stride[0]; - for x in 0..4 { - let cs = x + y*4; - let loc_lim; - - if test_bit!(cur_dbk, cs) { - loc_lim = cur_lim; - } else if (y == 0) && test_bit!(top_dbk, cs + 12) { - loc_lim = top_lim; - } else if (y != 0) && test_bit!(cur_dbk, cs - 4) { - loc_lim = cur_lim; - } else { - loc_lim = 0; - } - if loc_lim != 0 { - rv30_loop_filter4(dst, yoff + x * 4, stride[0], 1, loc_lim); - } - } - } - - for comp in 1..3 { - for y in ystart..2 { - let coff = offs[comp] + mb_x * 8 + y * 4 * stride[comp]; - for x in 0..2 { - let cs = x + y * 2 + (comp - 1) * 4; - let loc_lim; - - if test_bit!(cur_cbp, cs) { - loc_lim = cur_lim; - } else if (y == 0) && test_bit!(top_cbp, cs + 2) { - loc_lim = top_lim; - } else if (y != 0) && test_bit!(cur_cbp, cs - 2) { - loc_lim = cur_lim; - } else { - loc_lim = 0; - } - if loc_lim != 0 { - rv30_loop_filter4(dst, coff + x * 4, stride[comp], 1, loc_lim); - } - } - } - } - - mb_pos += 1; - } - } - fn do_luma_mc(&self, frame: &mut NAVideoBuffer<u8>, prev_frame: &NAVideoBuffer<u8>, x: usize, y: usize, mv: MV, use16: bool, avg: bool) { - let size: usize = if use16 { 16 } else { 8 }; - let dstride = frame.get_stride(0); - let doffset = frame.get_offset(0) + (if !avg { x + y * dstride } else { 0 }); - let mut data = frame.get_data_mut(); - let dst: &mut [u8] = data.as_mut_slice(); - - let (w_, h_) = prev_frame.get_dimensions(0); - let w = (w_ + 15) & !15; - let h = (h_ + 15) & !15; - - let (dx, cx) = rv30_div_mv(mv.x); - let (dy, cy) = rv30_div_mv(mv.y); - let mode = cx + cy * 3; - - if check_pos(x, y, size, w, h, dx, dy, RV30_EDGE1[cx], RV30_EDGE2[cx], RV30_EDGE1[cy], RV30_EDGE2[cy]) { - let sstride = prev_frame.get_stride(0); - let mut soffset = prev_frame.get_offset(0) + x + y * sstride; - let data = prev_frame.get_data(); - let src: &[u8] = data.as_slice(); - soffset = ((soffset as isize) + (dx as isize) + (dy as isize) * (sstride as isize)) as usize; - self.luma_mc[if use16 { 0 } else { 1 }][mode](dst, doffset, dstride, src, soffset, sstride); - } else { - let mut ebuf: [u8; 32*20] = [0; 32*20]; - edge_emu(prev_frame, (x as isize) + (dx as isize) - 1, (y as isize) + (dy as isize) - 1, 16+3, 16+3, &mut ebuf, 32, 0); - self.luma_mc[if use16 { 0 } else { 1 }][mode](dst, doffset, dstride, &ebuf, 32 + 1, 32); - } - } - fn do_chroma_mc(&self, frame: &mut NAVideoBuffer<u8>, prev_frame: &NAVideoBuffer<u8>, x: usize, y: usize, comp: usize, mv: MV, use8: bool, avg: bool) { - let size: usize = if use8 { 8 } else { 4 }; - let dstride = frame.get_stride(comp); - let doffset = frame.get_offset(comp) + (if !avg { x + y * dstride } else { 0 }); - let mut data = frame.get_data_mut(); - let dst: &mut [u8] = data.as_mut_slice(); - - let (w_, h_) = prev_frame.get_dimensions(comp); - let w = (w_ + 7) & !7; - let h = (h_ + 7) & !7; - - let (dx, cx) = rv30_div_mv(mv.x / 2); - let (dy, cy) = rv30_div_mv(mv.y / 2); - - if check_pos(x, y, size, w, h, dx, dy, 0, 1, 0, 1) { - let sstride = prev_frame.get_stride(comp); - let mut soffset = prev_frame.get_offset(comp) + x + y * sstride; - let data = prev_frame.get_data(); - let src: &[u8] = data.as_slice(); - soffset = ((soffset as isize) + (dx as isize) + (dy as isize) * (sstride as isize)) as usize; - rv30_chroma_mc(dst, doffset, dstride, src, soffset, sstride, size, cx, cy); - } else { - let mut ebuf: [u8; 16*10] = [0; 16*10]; - edge_emu(prev_frame, (x as isize) + (dx as isize), (y as isize) + (dy as isize), 8+1, 8+1, &mut ebuf, 16, comp); - rv30_chroma_mc(dst, doffset, dstride, &ebuf, 0, 16, size, cx, cy); - } - } -} diff --git a/src/codecs/real/rv34codes.rs b/src/codecs/real/rv34codes.rs deleted file mode 100644 index 370f288..0000000 --- a/src/codecs/real/rv34codes.rs +++ /dev/null @@ -1,4284 +0,0 @@ -use crate::codecs::DecoderResult; -use crate::io::bitreader::BitReader; -use crate::io::codebook::*; - -struct CBPSet { - cbp_pattern: Codebook<u16>, - cbp: [Codebook<u8>; 4], -} - -struct CoefSet { - blk_pattern0: Vec<Codebook<u16>>, - blk_pattern1: Vec<Codebook<u16>>, - blk_pattern2: Vec<Codebook<u16>>, -} - -struct FullSet { - cbp: Vec<CBPSet>, - cset: CoefSet, - coeffs: Codebook<u16>, -} - -struct RV34CodeReader { - lengths: Vec<u8>, - codes: Vec<u32>, - syms: Vec<u16>, -} - -impl RV34CodeReader { - fn new(data: &'static [u8]) -> Self { - let len = data.len(); - let mut lengths: Vec<u8> = Vec::with_capacity(len); - let mut codes: Vec<u32> = Vec::with_capacity(len); - let mut syms: Vec<u16> = Vec::with_capacity(len); - let mut counts: [u32; 17] = [0; 17]; - let mut prefix: [u32; 17] = [0; 17]; - for i in 0..len { - if data[i] > 0 { - counts[data[i] as usize] += 1; - } - } - for i in 0..16 { - prefix[i + 1] = (prefix[i] + counts[i]) << 1; - } - for i in 0..len { - if data[i] == 0 { continue; } - lengths.push(data[i]); - let bits = data[i] as usize; - codes.push(prefix[bits]); - prefix[bits] += 1; - syms.push(i as u16); - } - - RV34CodeReader { codes: codes, lengths: lengths, syms: syms } - } -} - -impl CodebookDescReader<u16> for RV34CodeReader { - fn bits(&mut self, idx: usize) -> u8 { self.lengths[idx] } - fn code(&mut self, idx: usize) -> u32 { self.codes[idx] } - fn sym (&mut self, idx: usize) -> u16 { self.syms[idx] } - fn len (&mut self) -> usize { self.lengths.len() } -} - -struct RV34CBPCodeReader { - lengths: Vec<u8>, - codes: Vec<u32>, - syms: Vec<u8>, -} - -const RV34_CBP_SYMS: [u8; 16] = [ - 0x00, 0x20, 0x10, 0x30, 0x02, 0x22, 0x12, 0x32, - 0x01, 0x21, 0x11, 0x31, 0x03, 0x23, 0x13, 0x33 -]; - -impl RV34CBPCodeReader { - fn new(data: &'static [u8]) -> Self { - let len = data.len(); - let mut lengths: Vec<u8> = Vec::with_capacity(len); - let mut codes: Vec<u32> = Vec::with_capacity(len); - let mut syms: Vec<u8> = Vec::with_capacity(len); - let mut counts: [u32; 17] = [0; 17]; - let mut prefix: [u32; 17] = [0; 17]; - for i in 0..len { - if data[i] > 0 { - counts[data[i] as usize] += 1; - } - } - for i in 0..16 { - prefix[i + 1] = (prefix[i] + counts[i]) << 1; - } - for i in 0..len { - if data[i] == 0 { continue; } - lengths.push(data[i]); - let bits = data[i] as usize; - codes.push(prefix[bits]); - prefix[bits] += 1; - syms.push(RV34_CBP_SYMS[i]); - } - - RV34CBPCodeReader { codes: codes, lengths: lengths, syms: syms } - } -} - -impl CodebookDescReader<u8> for RV34CBPCodeReader { - fn bits(&mut self, idx: usize) -> u8 { self.lengths[idx] } - fn code(&mut self, idx: usize) -> u32 { self.codes[idx] } - fn sym (&mut self, idx: usize) -> u8 { self.syms[idx] } - fn len (&mut self) -> usize { self.lengths.len() } -} - -impl CBPSet { - fn new(intra: bool, set: usize, subset: usize) -> Self { - if intra { - let mut coderead = RV34CodeReader::new(&RV34_INTRA_CBPPAT[set][subset]); - let cbp_pat = Codebook::new(&mut coderead, CodebookMode::MSB).unwrap(); - let mut coderead = RV34CBPCodeReader::new(&RV34_INTRA_CBP[set][subset + 0*2]); - let cbp0 = Codebook::new(&mut coderead, CodebookMode::MSB).unwrap(); - let mut coderead = RV34CBPCodeReader::new(&RV34_INTRA_CBP[set][subset + 1*2]); - let cbp1 = Codebook::new(&mut coderead, CodebookMode::MSB).unwrap(); - let mut coderead = RV34CBPCodeReader::new(&RV34_INTRA_CBP[set][subset + 2*2]); - let cbp2 = Codebook::new(&mut coderead, CodebookMode::MSB).unwrap(); - let mut coderead = RV34CBPCodeReader::new(&RV34_INTRA_CBP[set][subset + 3*2]); - let cbp3 = Codebook::new(&mut coderead, CodebookMode::MSB).unwrap(); - CBPSet { cbp_pattern: cbp_pat, cbp: [cbp0, cbp1, cbp2, cbp3] } - } else { - let mut coderead = RV34CodeReader::new(&RV34_INTER_CBPPAT[set]); - let cbp_pat = Codebook::new(&mut coderead, CodebookMode::MSB).unwrap(); - let mut coderead = RV34CBPCodeReader::new(&RV34_INTER_CBP[set][0]); - let cbp0 = Codebook::new(&mut coderead, CodebookMode::MSB).unwrap(); - let mut coderead = RV34CBPCodeReader::new(&RV34_INTER_CBP[set][1]); - let cbp1 = Codebook::new(&mut coderead, CodebookMode::MSB).unwrap(); - let mut coderead = RV34CBPCodeReader::new(&RV34_INTER_CBP[set][2]); - let cbp2 = Codebook::new(&mut coderead, CodebookMode::MSB).unwrap(); - let mut coderead = RV34CBPCodeReader::new(&RV34_INTER_CBP[set][3]); - let cbp3 = Codebook::new(&mut coderead, CodebookMode::MSB).unwrap(); - CBPSet { cbp_pattern: cbp_pat, cbp: [cbp0, cbp1, cbp2, cbp3] } - } - } -} - -impl CoefSet { - fn new(intra: bool, set: usize) -> Self { - if intra { - let mut coderead = RV34CodeReader::new(&RV34_INTRA_FIRSTPAT[set][0]); - let first0 = Codebook::new(&mut coderead, CodebookMode::MSB).unwrap(); - let mut coderead = RV34CodeReader::new(&RV34_INTRA_FIRSTPAT[set][1]); - let first1 = Codebook::new(&mut coderead, CodebookMode::MSB).unwrap(); - let mut coderead = RV34CodeReader::new(&RV34_INTRA_FIRSTPAT[set][2]); - let first2 = Codebook::new(&mut coderead, CodebookMode::MSB).unwrap(); - let mut coderead = RV34CodeReader::new(&RV34_INTRA_FIRSTPAT[set][3]); - let first3 = Codebook::new(&mut coderead, CodebookMode::MSB).unwrap(); - let firsts: Vec<Codebook<u16>> = vec![first0, first1, first2, first3]; - - let mut coderead = RV34CodeReader::new(&RV34_INTRA_SECONDPAT[set][0]); - let second0 = Codebook::new(&mut coderead, CodebookMode::MSB).unwrap(); - let mut coderead = RV34CodeReader::new(&RV34_INTRA_SECONDPAT[set][1]); - let second1 = Codebook::new(&mut coderead, CodebookMode::MSB).unwrap(); - let seconds: Vec<Codebook<u16>> = vec![second0, second1]; - - let mut coderead = RV34CodeReader::new(&RV34_INTRA_THIRDPAT[set][0]); - let third0 = Codebook::new(&mut coderead, CodebookMode::MSB).unwrap(); - let mut coderead = RV34CodeReader::new(&RV34_INTRA_THIRDPAT[set][1]); - let third1 = Codebook::new(&mut coderead, CodebookMode::MSB).unwrap(); - let thirds: Vec<Codebook<u16>> = vec![third0, third1]; - - CoefSet { blk_pattern0: firsts, blk_pattern1: seconds, blk_pattern2: thirds } - } else { - let mut coderead = RV34CodeReader::new(&RV34_INTER_FIRSTPAT[set][0]); - let first0 = Codebook::new(&mut coderead, CodebookMode::MSB).unwrap(); - let mut coderead = RV34CodeReader::new(&RV34_INTER_FIRSTPAT[set][1]); - let first1 = Codebook::new(&mut coderead, CodebookMode::MSB).unwrap(); - let firsts: Vec<Codebook<u16>> = vec![first0, first1]; - - let mut coderead = RV34CodeReader::new(&RV34_INTER_SECONDPAT[set][0]); - let second0 = Codebook::new(&mut coderead, CodebookMode::MSB).unwrap(); - let mut coderead = RV34CodeReader::new(&RV34_INTER_SECONDPAT[set][1]); - let second1 = Codebook::new(&mut coderead, CodebookMode::MSB).unwrap(); - let seconds: Vec<Codebook<u16>> = vec![second0, second1]; - - let mut coderead = RV34CodeReader::new(&RV34_INTER_THIRDPAT[set][0]); - let third0 = Codebook::new(&mut coderead, CodebookMode::MSB).unwrap(); - let mut coderead = RV34CodeReader::new(&RV34_INTER_THIRDPAT[set][1]); - let third1 = Codebook::new(&mut coderead, CodebookMode::MSB).unwrap(); - let thirds: Vec<Codebook<u16>> = vec![third0, third1]; - - CoefSet { blk_pattern0: firsts, blk_pattern1: seconds, blk_pattern2: thirds } - } - } -} - -impl FullSet { - fn new(intra: bool, set: usize) -> Self { - if intra { - let cbp0 = CBPSet::new(intra, set, 0); - let cbp1 = CBPSet::new(intra, set, 1); - let cbp: Vec<CBPSet> = vec![cbp0, cbp1]; - let cset = CoefSet::new(intra, set); - let mut coderead = RV34CodeReader::new(&RV34_INTRA_COEFFS[set]); - let coeffs = Codebook::new(&mut coderead, CodebookMode::MSB).unwrap(); - FullSet { cbp: cbp, cset: cset, coeffs: coeffs } - } else { - let cbp0 = CBPSet::new(intra, set, 0); - let cbp: Vec<CBPSet> = vec![cbp0]; - let cset = CoefSet::new(intra, set); - let mut coderead = RV34CodeReader::new(&RV34_INTER_COEFFS[set]); - let coeffs = Codebook::new(&mut coderead, CodebookMode::MSB).unwrap(); - FullSet { cbp: cbp, cset: cset, coeffs: coeffs } - } - } -} - -fn decode_coeff(br: &mut BitReader, ccodes: &Codebook<u16>, val: u8, esc: u8, quant: u16) -> DecoderResult<i16> { - if val == 0 { return Ok(0); } - let mut nval = if val == esc { - let mut c = br.read_cb(ccodes)? as i16; - if c > 23 { - c -= 23; - c = (1 << c) + (br.read(c as u8)? as i16) + 22; - } - c += esc as i16; - c - } else { - val as i16 - }; - if br.read_bool()? { nval = -nval; } - nval = (((nval as i32) * (quant as i32) + 8) >> 4) as i16; - Ok(nval) -} - -fn decode_subblock3(br: &mut BitReader, ccodes: &Codebook<u16>, idx: usize, q2: u16, q3: u16, q4: u16, coeffs: &mut [i16]) -> DecoderResult<()> { - let flags = RV34_MODULO_THREE_TABLE[idx]; - coeffs[0*4 + 0] = decode_coeff(br, ccodes, (flags >> 6) & 3, 3, q2)?; - coeffs[0*4 + 1] = decode_coeff(br, ccodes, (flags >> 4) & 3, 2, q3)?; - coeffs[1*4 + 0] = decode_coeff(br, ccodes, (flags >> 2) & 3, 2, q3)?; - coeffs[1*4 + 1] = decode_coeff(br, ccodes, (flags >> 0) & 3, 2, q4)?; - Ok(()) -} -fn decode_subblock1(br: &mut BitReader, ccodes: &Codebook<u16>, idx: usize, q2: u16, coeffs: &mut [i16]) -> DecoderResult<()> { - let val = RV34_MODULO_THREE_TABLE[idx] >> 6; - coeffs[0] = decode_coeff(br, ccodes, val, 3, q2)?; - Ok(()) -} -fn decode_subblock(br: &mut BitReader, ccodes: &Codebook<u16>, idx: usize, invert: bool, q4: u16, coeffs: &mut [i16]) -> DecoderResult<()> { - let flags = RV34_MODULO_THREE_TABLE[idx]; - coeffs[0*4 + 0] = decode_coeff(br, ccodes, (flags >> 6) & 3, 3, q4)?; - if !invert { - coeffs[0*4 + 1] = decode_coeff(br, ccodes, (flags >> 4) & 3, 2, q4)?; - coeffs[1*4 + 0] = decode_coeff(br, ccodes, (flags >> 2) & 3, 2, q4)?; - } else { - coeffs[1*4 + 0] = decode_coeff(br, ccodes, (flags >> 4) & 3, 2, q4)?; - coeffs[0*4 + 1] = decode_coeff(br, ccodes, (flags >> 2) & 3, 2, q4)?; - } - coeffs[1*4 + 1] = decode_coeff(br, ccodes, (flags >> 0) & 3, 2, q4)?; - Ok(()) -} - -#[allow(dead_code)] -pub struct RV34Codes { - intra_set: Vec<FullSet>, - inter_set: Vec<FullSet>, - is_intra: bool, - is_16: bool, - set_idx: usize, - subset_idx: usize, -} - -impl RV34Codes { - pub fn new() -> Self { - let mut iset: Vec<FullSet> = Vec::with_capacity(5); - for set in 0..5 { iset.push(FullSet::new(true, set)); } - let mut pset: Vec<FullSet> = Vec::with_capacity(7); - for set in 0..7 { pset.push(FullSet::new(false, set)); } - RV34Codes { - is_intra: false, is_16: false, set_idx: 0, subset_idx: 0, - intra_set: iset, inter_set: pset, - } - } - pub fn select_codes(&mut self, is_intra: bool, quant: u8, subset: usize, is_16: bool) { - let mut idx = quant as usize; - if (subset == 2) && (idx < 19) { idx += 10; } - else if (subset != 0) && (idx < 26) { idx += 5; } - if idx > 30 { idx = 30; } - - if is_intra { - self.set_idx = RV34_SET_IDX_INTRA[idx]; - } else { - self.set_idx = RV34_SET_IDX_INTER[idx]; - } - self.is_intra = is_intra || is_16; - self.is_16 = is_16; - self.subset_idx = subset; - } - pub fn decode_cbp(&mut self, br: &mut BitReader) -> DecoderResult<u32> { - let codeset = if self.is_intra { - &self.intra_set[self.set_idx].cbp[self.is_16 as usize] - } else { - &self.inter_set[self.set_idx].cbp[0] - }; - let code = br.read_cb(&codeset.cbp_pattern)?; - let pattern = code & 0xF; - let mmode = (code >> 4) as usize; - let mut cbp: u32 = 0; - - let ones = RV34_ONES_COUNT[pattern as usize]; - - for i in 0..4 { - if ((pattern >> (3 - i)) & 1) != 0 { - let code = br.read_cb(&codeset.cbp[ones])? as u32; - cbp |= code << RV34_CBP_SHIFTS[i]; - } - } - - for i in 0..4 { - let t = (RV34_MODULO_THREE_TABLE[mmode] >> (6 - 2*i)) & 3; - if t == 1 { cbp |= RV34_CBP_MASKS[br.read(1)? as usize] << i; } - if t == 2 { cbp |= RV34_CBP_MASKS[2] << i; } - } - - Ok(cbp) - } - pub fn decode_block(&mut self, br: &mut BitReader, coeffs: &mut [i16], idx0: usize, idx1: usize, q2: u16, q3: u16, q4: u16) -> DecoderResult<bool> { - let codeset = if self.is_intra { - &self.intra_set[self.set_idx].cset - } else { - &self.inter_set[self.set_idx].cset - }; - let ccodes = if self.is_intra { - &self.intra_set[self.set_idx].coeffs - } else { - &self.inter_set[self.set_idx].coeffs - }; - let blkcp = br.read_cb(&codeset.blk_pattern0[idx0])?; - let coded = blkcp & 0x7; - let idx = (blkcp >> 3) as usize; - let mut has_ac = true; - - if (RV34_MODULO_THREE_TABLE[idx] & 0x3F) != 0 { - decode_subblock3(br, ccodes, idx, q2, q3, q4, coeffs)?; - } else { - decode_subblock1(br, ccodes, idx, q2, coeffs)?; - if coded == 0 { - return Ok(false); - } - has_ac = false; - } - - if (coded & 4) != 0 { - let idx = br.read_cb(&codeset.blk_pattern1[idx1])? as usize; - decode_subblock(br, ccodes, idx, false, q4, &mut coeffs[2..])?; - } - if (coded & 2) != 0 { - let idx = br.read_cb(&codeset.blk_pattern1[idx1])? as usize; - decode_subblock(br, ccodes, idx, true, q4, &mut coeffs[8..])?; - } - if (coded & 1) != 0 { - let idx = br.read_cb(&codeset.blk_pattern2[idx1])? as usize; - decode_subblock(br, ccodes, idx, false, q4, &mut coeffs[10..])?; - } - - Ok(has_ac || (coded != 0)) - } -} - -const RV34_SET_IDX_INTRA: [usize; 31] = [ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, - 2, 2, 2, 2, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 0 -]; -const RV34_SET_IDX_INTER: [usize; 31] = [ - 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, - 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 6, 6, 6, 6 -]; - -const RV34_ONES_COUNT: [usize; 16] = [ 0, 0, 0, 1, 0, 1, 1, 2, 0, 1, 1, 2, 1, 2, 2, 3 ]; -const RV34_CBP_SHIFTS: [u32; 4] = [ 0, 2, 8, 10 ]; -const RV34_CBP_MASKS: [u32; 3] = [ 0x100000, 0x010000, 0x110000 ]; - -const RV34_MODULO_THREE_TABLE: [u8; 108] = [ - 0x00, 0x01, 0x02, 0x04, 0x05, 0x06, 0x08, 0x09, 0x0A, - 0x10, 0x11, 0x12, 0x14, 0x15, 0x16, 0x18, 0x19, 0x1A, - 0x20, 0x21, 0x22, 0x24, 0x25, 0x26, 0x28, 0x29, 0x2A, - - 0x40, 0x41, 0x42, 0x44, 0x45, 0x46, 0x48, 0x49, 0x4A, - 0x50, 0x51, 0x52, 0x54, 0x55, 0x56, 0x58, 0x59, 0x5A, - 0x60, 0x61, 0x62, 0x64, 0x65, 0x66, 0x68, 0x69, 0x6A, - - 0x80, 0x81, 0x82, 0x84, 0x85, 0x86, 0x88, 0x89, 0x8A, - 0x90, 0x91, 0x92, 0x94, 0x95, 0x96, 0x98, 0x99, 0x9A, - 0xA0, 0xA1, 0xA2, 0xA4, 0xA5, 0xA6, 0xA8, 0xA9, 0xAA, - - 0xC0, 0xC1, 0xC2, 0xC4, 0xC5, 0xC6, 0xC8, 0xC9, 0xCA, - 0xD0, 0xD1, 0xD2, 0xD4, 0xD5, 0xD6, 0xD8, 0xD9, 0xDA, - 0xE0, 0xE1, 0xE2, 0xE4, 0xE5, 0xE6, 0xE8, 0xE9, 0xEA, -]; - -const RV34_INTRA_CBPPAT: &'static [[[u8; 1296]; 2]; 5] = &[ - [ - [ - 8, 10, 10, 10, 10, 10, 11, 10, 10, 11, 10, 10, 10, 10, 10, 6, - 12, 12, 13, 12, 13, 12, 13, 11, 13, 13, 13, 12, 13, 12, 12, 8, - 14, 13, 16, 13, 15, 13, 16, 12, 16, 16, 16, 14, 16, 13, 14, 10, - 12, 13, 12, 12, 13, 13, 13, 12, 13, 13, 12, 12, 13, 12, 12, 8, - 13, 14, 14, 12, 14, 14, 14, 12, 14, 15, 14, 12, 14, 13, 13, 8, - 16, 16, 16, 12, 16, 16, 16, 13, 16, 16, 16, 13, 16, 14, 14, 9, - 14, 16, 13, 13, 16, 16, 16, 14, 15, 16, 14, 13, 15, 15, 14, 10, - 16, 16, 14, 13, 16, 16, 16, 13, 16, 16, 16, 13, 16, 15, 14, 10, - 16, 16, 16, 11, 16, 16, 16, 12, 16, 16, 16, 12, 16, 16, 15, 9, - 12, 13, 13, 13, 12, 12, 14, 12, 12, 14, 13, 12, 12, 12, 12, 8, - 14, 14, 16, 14, 13, 12, 14, 12, 14, 15, 14, 13, 13, 12, 13, 8, - 16, 16, 16, 15, 16, 13, 16, 13, 16, 16, 16, 15, 16, 13, 15, 10, - 14, 16, 14, 14, 14, 14, 15, 13, 14, 16, 14, 13, 13, 13, 13, 9, - 16, 16, 16, 14, 16, 14, 16, 12, 16, 16, 14, 13, 14, 13, 13, 8, - 16, 16, 16, 14, 16, 14, 16, 13, 16, 16, 16, 14, 16, 14, 14, 9, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 14, 16, 16, 14, 10, - 16, 16, 16, 14, 16, 16, 16, 13, 16, 16, 16, 14, 16, 15, 14, 9, - 16, 16, 16, 13, 16, 16, 16, 12, 16, 16, 16, 13, 16, 15, 15, 8, - 14, 16, 16, 16, 14, 14, 16, 14, 16, 16, 16, 15, 13, 13, 14, 10, - 16, 16, 16, 16, 15, 13, 16, 13, 16, 16, 16, 16, 16, 13, 14, 10, - 16, 16, 16, 16, 16, 11, 16, 12, 16, 16, 16, 16, 16, 12, 16, 9, - 16, 16, 16, 16, 16, 16, 16, 15, 16, 16, 16, 16, 16, 14, 14, 10, - 16, 16, 16, 16, 16, 15, 16, 13, 16, 16, 16, 15, 16, 13, 14, 9, - 16, 16, 16, 16, 16, 13, 16, 12, 16, 16, 16, 16, 16, 13, 14, 8, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 15, 11, - 16, 16, 16, 16, 16, 16, 16, 14, 16, 16, 16, 16, 16, 16, 14, 9, - 16, 16, 16, 14, 16, 15, 16, 11, 16, 16, 16, 14, 16, 14, 14, 8, - 12, 13, 13, 13, 13, 13, 14, 12, 12, 13, 12, 12, 12, 12, 12, 8, - 14, 14, 16, 14, 15, 14, 16, 13, 14, 15, 14, 13, 14, 13, 13, 9, - 16, 16, 16, 15, 16, 16, 16, 14, 16, 16, 16, 14, 16, 14, 16, 10, - 14, 15, 14, 14, 15, 14, 15, 13, 14, 14, 13, 12, 13, 13, 13, 9, - 15, 16, 15, 14, 16, 16, 16, 13, 15, 16, 14, 12, 14, 13, 13, 8, - 16, 16, 16, 14, 16, 16, 16, 13, 16, 16, 16, 13, 16, 14, 14, 9, - 16, 16, 16, 16, 16, 16, 16, 15, 16, 16, 13, 13, 16, 16, 14, 10, - 16, 16, 16, 14, 16, 16, 16, 14, 16, 16, 15, 13, 16, 14, 14, 9, - 16, 16, 16, 12, 16, 16, 16, 13, 16, 16, 16, 12, 16, 16, 15, 8, - 13, 14, 14, 14, 14, 14, 16, 13, 13, 14, 14, 13, 12, 12, 12, 8, - 16, 16, 16, 14, 15, 14, 16, 13, 15, 16, 14, 13, 13, 12, 13, 8, - 16, 16, 16, 16, 16, 14, 16, 14, 16, 16, 16, 14, 16, 13, 14, 9, - 15, 16, 16, 15, 16, 15, 16, 13, 14, 16, 14, 13, 13, 13, 12, 8, - 16, 16, 16, 14, 16, 14, 15, 12, 15, 15, 14, 12, 13, 12, 12, 7, - 16, 16, 16, 14, 16, 14, 16, 12, 16, 16, 16, 13, 16, 13, 13, 7, - 16, 16, 16, 16, 16, 16, 16, 14, 16, 16, 14, 14, 16, 14, 13, 9, - 16, 16, 16, 14, 16, 16, 16, 13, 16, 16, 14, 12, 16, 13, 12, 7, - 16, 16, 16, 12, 16, 16, 16, 11, 16, 16, 15, 12, 16, 13, 13, 6, - 16, 16, 16, 16, 16, 16, 16, 15, 16, 16, 16, 15, 13, 13, 14, 10, - 16, 16, 16, 16, 16, 14, 16, 14, 16, 16, 16, 16, 14, 13, 14, 9, - 16, 16, 16, 16, 16, 13, 16, 13, 16, 16, 16, 16, 16, 12, 14, 8, - 16, 16, 16, 16, 16, 16, 16, 14, 16, 16, 16, 14, 14, 13, 13, 9, - 16, 16, 16, 16, 16, 14, 16, 13, 16, 16, 16, 13, 14, 12, 12, 7, - 16, 16, 16, 16, 16, 13, 16, 12, 16, 16, 16, 13, 14, 12, 13, 6, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 15, 14, 9, - 16, 16, 16, 16, 16, 16, 16, 13, 16, 16, 16, 13, 15, 13, 12, 7, - 16, 16, 16, 13, 16, 14, 16, 11, 16, 16, 16, 12, 16, 12, 12, 5, - 14, 16, 15, 16, 16, 16, 16, 15, 14, 15, 14, 14, 13, 14, 13, 10, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 14, 16, 14, 16, 10, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 11, - 16, 16, 16, 16, 16, 16, 16, 16, 14, 16, 14, 14, 15, 14, 13, 10, - 16, 16, 16, 16, 16, 16, 16, 15, 16, 16, 14, 13, 16, 14, 14, 9, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 14, 16, 16, 15, 9, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 12, 13, 16, 16, 13, 10, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 13, 13, 16, 16, 13, 9, - 16, 16, 16, 14, 16, 16, 16, 14, 16, 16, 15, 12, 16, 16, 14, 8, - 16, 16, 16, 16, 16, 16, 16, 16, 14, 16, 15, 14, 13, 13, 13, 9, - 16, 16, 16, 16, 16, 16, 16, 14, 16, 16, 16, 14, 14, 13, 13, 9, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 14, 15, 9, - 16, 16, 16, 16, 16, 16, 16, 15, 15, 16, 14, 14, 14, 13, 13, 9, - 16, 16, 16, 16, 16, 16, 16, 13, 16, 16, 14, 12, 13, 12, 12, 7, - 16, 16, 16, 16, 16, 16, 16, 13, 16, 16, 16, 13, 16, 13, 13, 7, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 13, 13, 16, 14, 13, 9, - 16, 16, 16, 15, 16, 16, 16, 13, 16, 16, 13, 12, 14, 13, 12, 6, - 16, 16, 16, 13, 16, 16, 16, 12, 16, 16, 14, 10, 15, 12, 12, 5, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 12, 13, 13, 9, - 16, 16, 16, 16, 16, 16, 16, 14, 16, 16, 16, 15, 13, 12, 13, 8, - 16, 16, 16, 16, 16, 14, 16, 14, 16, 16, 16, 16, 15, 12, 14, 8, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 14, 13, 13, 13, 8, - 16, 16, 16, 16, 16, 16, 16, 13, 16, 16, 15, 13, 12, 11, 12, 6, - 16, 16, 16, 15, 16, 14, 16, 12, 16, 16, 16, 12, 13, 10, 12, 5, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 14, 14, 13, 14, 12, 8, - 16, 16, 16, 16, 16, 16, 16, 13, 16, 16, 13, 12, 13, 12, 10, 5, - 16, 16, 16, 13, 16, 13, 16, 10, 16, 16, 13, 10, 13, 10, 10, 1, - ], [ - 2, 7, 7, 8, 7, 8, 9, 8, 7, 9, 8, 8, 8, 8, 9, 7, - 6, 9, 10, 10, 10, 10, 11, 10, 10, 11, 11, 11, 10, 11, 11, 9, - 9, 11, 12, 12, 12, 13, 14, 13, 13, 14, 14, 13, 13, 13, 14, 11, - 6, 10, 9, 10, 10, 11, 11, 11, 10, 11, 10, 11, 11, 11, 11, 9, - 6, 9, 10, 10, 10, 11, 12, 11, 10, 12, 11, 11, 11, 11, 11, 8, - 9, 11, 12, 12, 12, 13, 13, 13, 12, 14, 14, 13, 13, 13, 13, 10, - 9, 13, 11, 13, 13, 14, 14, 13, 13, 14, 13, 13, 14, 14, 14, 12, - 9, 12, 12, 12, 12, 14, 14, 13, 13, 14, 13, 13, 13, 14, 13, 11, - 8, 12, 12, 11, 12, 14, 14, 12, 13, 14, 14, 13, 13, 13, 14, 11, - 6, 10, 10, 11, 9, 10, 12, 11, 10, 12, 11, 11, 10, 11, 11, 9, - 7, 10, 10, 11, 10, 11, 12, 11, 11, 12, 11, 11, 11, 11, 11, 9, - 9, 12, 13, 13, 12, 12, 14, 13, 13, 14, 14, 13, 14, 13, 14, 11, - 8, 11, 11, 12, 11, 12, 12, 12, 11, 13, 12, 12, 12, 12, 12, 10, - 7, 10, 10, 11, 10, 11, 12, 11, 10, 12, 11, 11, 11, 11, 11, 8, - 9, 11, 12, 12, 12, 12, 13, 12, 12, 13, 13, 12, 13, 12, 13, 10, - 10, 13, 13, 14, 14, 14, 15, 14, 14, 15, 14, 15, 14, 14, 14, 12, - 9, 12, 12, 13, 12, 13, 14, 13, 12, 13, 13, 12, 13, 13, 13, 10, - 9, 12, 12, 12, 12, 13, 14, 12, 12, 14, 13, 12, 13, 13, 13, 10, - 9, 12, 13, 13, 11, 13, 14, 13, 13, 14, 14, 14, 12, 13, 13, 11, - 10, 12, 13, 13, 12, 12, 14, 13, 13, 14, 14, 14, 13, 13, 14, 11, - 10, 13, 14, 14, 13, 12, 15, 13, 14, 14, 14, 14, 15, 13, 14, 11, - 11, 14, 14, 14, 13, 14, 15, 14, 14, 15, 15, 14, 13, 14, 14, 12, - 10, 13, 12, 13, 12, 12, 14, 13, 13, 14, 13, 13, 13, 13, 13, 10, - 10, 12, 13, 13, 13, 12, 14, 12, 13, 14, 14, 13, 13, 13, 13, 10, - 13, 15, 16, 16, 15, 15, 16, 16, 15, 16, 15, 16, 16, 16, 16, 14, - 11, 14, 14, 14, 14, 14, 15, 14, 14, 15, 15, 14, 14, 14, 15, 11, - 10, 13, 13, 13, 13, 13, 14, 12, 13, 14, 14, 13, 13, 13, 13, 10, - 6, 10, 10, 11, 10, 11, 12, 11, 10, 12, 10, 11, 10, 11, 11, 9, - 8, 11, 11, 12, 11, 12, 13, 12, 11, 12, 12, 12, 12, 12, 12, 10, - 11, 13, 14, 14, 13, 14, 15, 14, 13, 15, 15, 14, 14, 14, 15, 12, - 7, 11, 10, 12, 11, 12, 12, 12, 11, 12, 11, 12, 11, 12, 12, 10, - 7, 10, 10, 11, 10, 11, 12, 11, 11, 12, 11, 11, 11, 11, 11, 9, - 10, 12, 13, 13, 12, 13, 14, 13, 13, 14, 13, 13, 13, 13, 13, 10, - 10, 13, 12, 14, 13, 14, 14, 14, 13, 14, 12, 14, 15, 14, 14, 11, - 10, 12, 12, 12, 12, 13, 14, 13, 13, 14, 13, 12, 13, 13, 13, 10, - 9, 12, 13, 13, 13, 14, 14, 13, 13, 14, 14, 13, 13, 13, 13, 10, - 7, 10, 10, 11, 10, 11, 12, 11, 10, 12, 12, 11, 9, 11, 11, 9, - 7, 10, 11, 11, 10, 11, 12, 11, 10, 12, 12, 11, 11, 11, 11, 9, - 10, 12, 13, 13, 13, 13, 15, 13, 13, 14, 13, 13, 13, 13, 13, 10, - 8, 11, 11, 11, 11, 11, 12, 11, 11, 12, 12, 11, 11, 12, 11, 9, - 6, 9, 9, 10, 9, 10, 10, 10, 9, 11, 10, 10, 9, 10, 10, 7, - 8, 10, 11, 11, 11, 11, 12, 11, 11, 12, 12, 11, 11, 11, 11, 8, - 10, 13, 13, 13, 13, 14, 14, 13, 13, 14, 13, 13, 13, 13, 13, 11, - 8, 11, 11, 11, 11, 12, 12, 11, 11, 12, 11, 11, 11, 11, 11, 8, - 8, 11, 11, 11, 11, 12, 12, 10, 11, 12, 12, 11, 11, 11, 11, 8, - 10, 13, 13, 13, 12, 13, 14, 13, 12, 14, 14, 14, 10, 13, 13, 11, - 10, 12, 12, 13, 12, 13, 14, 12, 12, 13, 13, 13, 12, 12, 13, 10, - 11, 13, 14, 14, 13, 13, 14, 13, 13, 15, 14, 13, 13, 13, 13, 10, - 10, 12, 13, 13, 12, 13, 14, 13, 13, 14, 14, 13, 12, 13, 13, 11, - 8, 11, 11, 11, 11, 11, 12, 11, 11, 12, 12, 11, 11, 11, 11, 8, - 9, 11, 12, 12, 11, 11, 12, 11, 12, 12, 12, 11, 12, 11, 11, 8, - 12, 15, 14, 14, 14, 15, 15, 14, 14, 15, 15, 14, 14, 14, 15, 12, - 10, 12, 12, 12, 12, 12, 13, 12, 12, 13, 13, 12, 12, 12, 12, 9, - 9, 11, 11, 11, 11, 11, 12, 10, 11, 12, 12, 11, 11, 11, 11, 7, - 10, 13, 13, 13, 13, 14, 15, 14, 13, 14, 14, 14, 12, 14, 15, 12, - 11, 14, 14, 14, 14, 15, 15, 14, 14, 15, 15, 15, 14, 15, 15, 12, - 13, 16, 16, 16, 15, 16, 16, 16, 15, 16, 16, 16, 16, 16, 16, 14, - 10, 13, 13, 14, 13, 15, 14, 14, 13, 15, 13, 14, 14, 14, 14, 12, - 10, 13, 13, 13, 13, 13, 14, 13, 13, 14, 13, 13, 13, 13, 14, 11, - 12, 14, 14, 14, 14, 15, 15, 14, 14, 15, 15, 14, 15, 14, 14, 12, - 11, 14, 14, 15, 14, 15, 15, 14, 14, 15, 12, 14, 15, 16, 15, 12, - 11, 13, 13, 14, 13, 14, 14, 14, 14, 14, 13, 13, 14, 14, 14, 11, - 11, 14, 14, 14, 14, 15, 15, 14, 14, 16, 14, 13, 14, 14, 14, 11, - 10, 13, 13, 13, 12, 14, 14, 14, 12, 15, 14, 14, 11, 13, 13, 12, - 10, 12, 13, 14, 12, 13, 14, 13, 13, 14, 14, 13, 12, 13, 13, 11, - 12, 14, 14, 15, 14, 15, 16, 15, 15, 15, 15, 15, 14, 14, 15, 12, - 10, 13, 13, 13, 12, 13, 14, 13, 13, 14, 13, 13, 12, 13, 13, 11, - 9, 11, 11, 12, 11, 12, 12, 11, 11, 12, 12, 11, 11, 11, 11, 9, - 10, 12, 12, 12, 12, 12, 13, 12, 12, 13, 13, 12, 13, 12, 12, 9, - 11, 13, 13, 15, 14, 14, 15, 14, 14, 15, 14, 14, 14, 14, 14, 11, - 10, 12, 12, 12, 12, 12, 13, 12, 12, 13, 11, 11, 12, 12, 12, 8, - 9, 12, 12, 11, 12, 12, 13, 11, 12, 12, 12, 11, 12, 11, 11, 8, - 10, 13, 13, 14, 12, 14, 15, 14, 13, 15, 15, 14, 10, 13, 13, 11, - 11, 13, 14, 13, 13, 14, 14, 13, 13, 14, 14, 14, 11, 13, 13, 11, - 12, 14, 14, 14, 14, 14, 15, 14, 15, 16, 15, 14, 13, 13, 14, 11, - 11, 14, 13, 14, 13, 14, 15, 14, 13, 15, 14, 14, 11, 13, 13, 11, - 9, 12, 12, 12, 11, 12, 13, 11, 12, 13, 12, 11, 10, 11, 11, 8, - 10, 12, 12, 12, 12, 12, 13, 11, 12, 12, 12, 11, 11, 11, 11, 8, - 12, 15, 14, 15, 14, 15, 16, 15, 15, 15, 15, 14, 14, 14, 14, 12, - 10, 12, 12, 12, 12, 12, 13, 11, 12, 13, 12, 11, 11, 11, 11, 8, - 8, 10, 10, 10, 10, 10, 11, 9, 10, 11, 10, 9, 10, 9, 9, 5, - ], - ], [ - [ - 12, 12, 11, 9, 11, 10, 11, 9, 11, 11, 10, 9, 9, 8, 9, 5, - 14, 13, 14, 11, 14, 11, 13, 10, 14, 13, 12, 10, 12, 10, 11, 6, - 16, 13, 16, 12, 16, 12, 16, 11, 16, 14, 16, 12, 15, 12, 13, 8, - 14, 14, 12, 11, 14, 12, 13, 10, 13, 13, 11, 10, 12, 11, 10, 6, - 16, 15, 14, 11, 16, 13, 14, 10, 15, 14, 13, 10, 13, 11, 11, 7, - 16, 16, 16, 11, 16, 14, 16, 11, 16, 16, 15, 12, 15, 13, 13, 8, - 16, 16, 13, 12, 16, 16, 15, 12, 16, 16, 12, 11, 15, 13, 12, 8, - 16, 16, 14, 11, 16, 16, 16, 11, 16, 16, 14, 11, 15, 14, 13, 8, - 16, 16, 15, 10, 16, 16, 16, 10, 16, 16, 15, 11, 16, 14, 14, 8, - 14, 14, 14, 12, 13, 11, 13, 10, 13, 13, 12, 11, 11, 10, 10, 6, - 16, 15, 16, 13, 13, 11, 14, 11, 15, 14, 13, 11, 12, 10, 11, 7, - 16, 15, 16, 14, 16, 11, 16, 11, 16, 16, 16, 13, 16, 12, 13, 8, - 16, 16, 14, 13, 15, 13, 14, 11, 14, 15, 13, 11, 13, 11, 11, 7, - 16, 16, 15, 13, 15, 13, 14, 11, 16, 15, 14, 11, 13, 11, 11, 7, - 16, 16, 16, 13, 16, 13, 16, 11, 16, 16, 16, 12, 16, 12, 13, 8, - 16, 16, 16, 14, 16, 16, 16, 13, 16, 16, 14, 13, 15, 14, 13, 9, - 16, 16, 16, 13, 16, 16, 16, 12, 16, 16, 14, 12, 15, 13, 13, 8, - 16, 16, 16, 12, 16, 16, 16, 11, 16, 16, 15, 12, 16, 13, 13, 7, - 16, 16, 16, 16, 13, 12, 16, 12, 16, 16, 14, 13, 12, 11, 12, 8, - 16, 16, 16, 15, 14, 11, 16, 11, 16, 16, 16, 13, 14, 11, 13, 8, - 16, 16, 16, 16, 15, 10, 16, 11, 16, 16, 16, 14, 15, 11, 13, 8, - 16, 16, 16, 16, 16, 14, 16, 13, 16, 16, 14, 14, 14, 12, 13, 9, - 16, 16, 16, 15, 16, 13, 16, 12, 16, 16, 16, 13, 14, 12, 13, 8, - 16, 16, 16, 14, 16, 12, 16, 11, 16, 16, 16, 13, 15, 12, 13, 7, - 16, 16, 16, 16, 16, 16, 16, 14, 16, 16, 16, 15, 16, 14, 13, 9, - 16, 16, 16, 16, 16, 16, 16, 12, 16, 16, 16, 14, 16, 13, 13, 8, - 16, 16, 16, 14, 16, 14, 16, 10, 16, 16, 16, 13, 16, 13, 13, 7, - 14, 14, 13, 12, 13, 12, 13, 11, 12, 13, 11, 10, 11, 10, 10, 6, - 16, 16, 15, 13, 16, 13, 15, 11, 14, 14, 13, 11, 13, 11, 11, 7, - 16, 16, 16, 14, 16, 14, 16, 12, 16, 16, 16, 13, 16, 13, 14, 9, - 16, 16, 13, 13, 15, 14, 14, 11, 13, 14, 11, 11, 12, 11, 11, 7, - 16, 16, 15, 12, 16, 14, 15, 11, 14, 14, 12, 11, 13, 11, 11, 7, - 16, 16, 16, 13, 16, 14, 16, 12, 16, 16, 14, 12, 16, 13, 13, 8, - 16, 16, 14, 14, 16, 16, 16, 13, 16, 16, 12, 11, 15, 13, 12, 8, - 16, 16, 15, 13, 16, 16, 16, 12, 16, 16, 13, 11, 16, 13, 12, 8, - 16, 16, 16, 11, 16, 16, 16, 11, 16, 16, 14, 11, 16, 14, 13, 7, - 16, 16, 15, 13, 14, 13, 14, 11, 14, 14, 12, 11, 11, 10, 11, 7, - 16, 16, 16, 13, 14, 12, 15, 11, 15, 14, 13, 11, 12, 11, 11, 7, - 16, 16, 16, 14, 16, 13, 16, 12, 16, 16, 16, 13, 14, 12, 13, 8, - 16, 16, 15, 13, 15, 14, 14, 12, 14, 14, 12, 11, 12, 11, 11, 7, - 16, 16, 14, 12, 15, 13, 14, 11, 15, 14, 13, 11, 12, 11, 11, 6, - 16, 16, 16, 13, 16, 13, 16, 11, 16, 15, 14, 11, 14, 11, 12, 6, - 16, 16, 16, 14, 16, 16, 16, 13, 16, 16, 13, 12, 14, 13, 12, 8, - 16, 16, 15, 13, 16, 14, 15, 11, 16, 16, 13, 11, 14, 12, 11, 6, - 16, 16, 16, 12, 16, 14, 15, 11, 16, 16, 13, 10, 14, 12, 12, 6, - 16, 16, 16, 16, 16, 14, 16, 13, 16, 16, 14, 13, 12, 11, 12, 8, - 16, 16, 16, 16, 16, 13, 16, 12, 16, 16, 15, 13, 13, 11, 12, 8, - 16, 16, 16, 15, 16, 12, 16, 12, 16, 16, 16, 14, 14, 11, 13, 7, - 16, 16, 16, 16, 16, 15, 16, 13, 16, 16, 14, 13, 13, 12, 12, 8, - 16, 16, 16, 14, 15, 13, 15, 11, 16, 15, 14, 12, 13, 11, 11, 6, - 16, 16, 16, 14, 16, 12, 15, 11, 16, 16, 15, 12, 14, 11, 12, 6, - 16, 16, 16, 16, 16, 16, 16, 13, 16, 16, 15, 13, 14, 13, 12, 8, - 16, 16, 16, 14, 16, 14, 16, 12, 16, 16, 14, 12, 13, 12, 11, 6, - 16, 16, 16, 13, 16, 13, 15, 10, 16, 16, 14, 11, 14, 11, 11, 5, - 16, 16, 15, 14, 16, 16, 16, 13, 14, 14, 12, 12, 12, 12, 12, 8, - 16, 16, 16, 15, 16, 16, 16, 14, 16, 16, 14, 13, 14, 13, 13, 9, - 16, 16, 16, 16, 16, 16, 16, 14, 16, 16, 16, 14, 16, 13, 15, 9, - 16, 16, 14, 15, 16, 16, 16, 14, 14, 16, 12, 12, 13, 13, 12, 8, - 16, 16, 16, 14, 16, 16, 16, 13, 16, 15, 13, 12, 14, 12, 12, 8, - 16, 16, 16, 16, 16, 16, 16, 13, 16, 16, 14, 12, 16, 13, 13, 8, - 16, 16, 16, 15, 16, 16, 16, 14, 16, 16, 11, 11, 15, 14, 12, 8, - 16, 16, 16, 14, 16, 16, 16, 13, 16, 16, 12, 11, 15, 13, 12, 8, - 16, 16, 16, 13, 16, 16, 16, 12, 16, 16, 13, 10, 16, 13, 12, 7, - 16, 16, 16, 16, 16, 15, 16, 13, 14, 16, 13, 13, 12, 12, 12, 8, - 16, 16, 16, 15, 16, 14, 16, 13, 16, 16, 14, 13, 13, 12, 12, 8, - 16, 16, 16, 16, 16, 15, 16, 13, 16, 16, 16, 13, 15, 12, 14, 8, - 16, 16, 16, 15, 16, 16, 16, 13, 14, 16, 13, 12, 12, 12, 11, 8, - 16, 16, 16, 14, 16, 14, 16, 12, 14, 14, 13, 11, 13, 11, 11, 6, - 16, 16, 16, 14, 16, 14, 16, 12, 16, 15, 14, 11, 14, 11, 12, 6, - 16, 16, 16, 15, 16, 16, 16, 14, 16, 16, 12, 12, 14, 13, 11, 8, - 16, 16, 15, 14, 16, 16, 16, 12, 16, 15, 12, 11, 13, 12, 11, 6, - 16, 16, 16, 13, 16, 14, 16, 11, 16, 14, 13, 10, 14, 11, 11, 5, - 16, 16, 16, 16, 16, 16, 16, 14, 14, 16, 15, 13, 11, 11, 11, 8, - 16, 16, 16, 16, 16, 15, 16, 13, 16, 16, 16, 13, 12, 11, 12, 7, - 16, 16, 16, 16, 16, 13, 16, 12, 16, 16, 16, 13, 13, 11, 13, 7, - 16, 16, 16, 16, 16, 16, 16, 13, 16, 16, 14, 13, 12, 12, 11, 7, - 16, 16, 16, 15, 16, 14, 15, 12, 16, 14, 13, 12, 12, 11, 11, 6, - 16, 16, 16, 14, 16, 13, 15, 11, 16, 14, 14, 11, 13, 10, 11, 5, - 16, 16, 16, 16, 16, 16, 16, 13, 16, 16, 13, 12, 12, 12, 11, 7, - 16, 16, 16, 14, 16, 14, 15, 12, 16, 15, 12, 11, 12, 11, 10, 5, - 16, 16, 16, 13, 16, 13, 14, 10, 16, 14, 12, 9, 12, 10, 9, 3, - ], [ - 2, 6, 6, 7, 6, 7, 8, 7, 7, 8, 7, 8, 7, 8, 8, 5, - 5, 8, 9, 9, 9, 9, 12, 10, 10, 11, 10, 10, 10, 11, 11, 8, - 9, 10, 13, 12, 13, 12, 15, 13, 13, 14, 13, 14, 13, 13, 14, 11, - 5, 10, 9, 10, 10, 10, 12, 10, 10, 12, 10, 11, 11, 11, 11, 8, - 6, 9, 10, 9, 10, 11, 12, 10, 10, 12, 11, 11, 10, 11, 11, 8, - 9, 11, 12, 11, 12, 13, 14, 12, 13, 14, 14, 12, 13, 13, 13, 11, - 10, 13, 11, 12, 14, 14, 15, 13, 13, 15, 12, 13, 14, 14, 14, 12, - 9, 12, 12, 12, 13, 13, 15, 13, 13, 14, 13, 13, 14, 13, 15, 11, - 8, 11, 12, 10, 12, 13, 14, 12, 13, 14, 14, 13, 13, 13, 14, 11, - 5, 9, 10, 10, 9, 10, 12, 11, 10, 12, 11, 11, 9, 11, 11, 9, - 6, 10, 10, 11, 10, 10, 12, 11, 11, 12, 11, 11, 11, 11, 11, 9, - 9, 11, 13, 13, 12, 11, 14, 12, 13, 15, 13, 13, 14, 13, 14, 11, - 8, 11, 11, 12, 11, 12, 13, 12, 12, 13, 12, 13, 12, 12, 12, 10, - 7, 10, 10, 11, 10, 11, 12, 11, 11, 12, 11, 11, 11, 11, 12, 9, - 9, 12, 12, 12, 12, 12, 14, 12, 13, 14, 13, 13, 13, 13, 13, 11, - 11, 14, 13, 15, 15, 16, 16, 15, 15, 16, 15, 15, 16, 16, 15, 13, - 10, 12, 13, 13, 13, 14, 15, 13, 13, 14, 13, 13, 14, 14, 14, 11, - 9, 12, 12, 12, 13, 13, 14, 12, 13, 14, 14, 13, 13, 13, 14, 11, - 9, 13, 13, 13, 11, 12, 15, 13, 13, 15, 14, 14, 11, 13, 14, 11, - 10, 13, 13, 13, 12, 12, 15, 13, 13, 15, 14, 14, 13, 13, 14, 11, - 10, 12, 13, 13, 12, 11, 14, 12, 13, 15, 13, 13, 13, 13, 14, 11, - 11, 14, 15, 15, 13, 14, 16, 14, 14, 16, 16, 14, 14, 15, 15, 13, - 10, 13, 13, 13, 12, 13, 14, 13, 13, 14, 14, 14, 13, 13, 14, 11, - 10, 12, 13, 13, 13, 12, 14, 13, 13, 14, 14, 13, 13, 13, 13, 11, - 13, 15, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 15, - 12, 15, 15, 15, 14, 15, 16, 14, 15, 16, 16, 15, 16, 15, 15, 13, - 10, 12, 12, 12, 13, 13, 14, 12, 13, 14, 13, 13, 13, 13, 13, 11, - 6, 10, 10, 11, 10, 11, 12, 11, 10, 12, 11, 11, 10, 11, 11, 9, - 8, 11, 12, 12, 12, 12, 13, 12, 12, 13, 12, 13, 12, 13, 13, 10, - 11, 13, 15, 14, 15, 14, 16, 14, 15, 16, 16, 14, 15, 15, 15, 13, - 7, 11, 10, 12, 11, 11, 13, 11, 11, 13, 10, 11, 12, 12, 12, 10, - 7, 11, 11, 11, 11, 11, 13, 11, 11, 13, 11, 12, 12, 12, 12, 9, - 10, 12, 13, 13, 13, 13, 15, 13, 14, 15, 14, 14, 14, 14, 15, 11, - 10, 13, 12, 14, 14, 14, 15, 13, 13, 15, 12, 13, 15, 15, 14, 12, - 10, 13, 12, 12, 13, 13, 15, 14, 13, 15, 13, 13, 14, 14, 14, 11, - 10, 13, 13, 12, 13, 14, 15, 13, 13, 15, 13, 13, 14, 14, 14, 11, - 7, 10, 11, 11, 10, 11, 12, 11, 10, 12, 12, 12, 9, 11, 12, 9, - 7, 11, 11, 11, 11, 11, 13, 11, 11, 13, 12, 12, 11, 12, 12, 9, - 10, 12, 14, 13, 13, 13, 16, 13, 14, 16, 14, 14, 13, 13, 14, 11, - 8, 11, 11, 12, 11, 12, 13, 12, 12, 13, 12, 12, 12, 12, 12, 10, - 6, 9, 9, 10, 9, 10, 11, 10, 10, 11, 10, 10, 10, 10, 10, 8, - 8, 11, 11, 11, 12, 11, 13, 11, 12, 13, 12, 12, 12, 12, 12, 10, - 11, 14, 13, 14, 14, 14, 16, 14, 14, 16, 14, 14, 15, 15, 14, 12, - 9, 12, 11, 12, 12, 12, 13, 12, 12, 13, 12, 12, 12, 12, 12, 10, - 8, 11, 11, 11, 11, 11, 13, 11, 12, 12, 12, 12, 12, 12, 12, 9, - 10, 13, 14, 13, 11, 13, 14, 14, 13, 15, 15, 14, 10, 13, 14, 11, - 10, 13, 13, 13, 12, 13, 14, 13, 13, 14, 14, 14, 13, 13, 13, 11, - 10, 13, 14, 13, 13, 12, 15, 13, 14, 15, 14, 14, 14, 13, 14, 12, - 11, 14, 14, 14, 13, 13, 15, 14, 14, 15, 14, 15, 13, 14, 14, 12, - 9, 11, 12, 12, 11, 11, 13, 12, 12, 13, 12, 12, 12, 12, 12, 10, - 9, 11, 12, 12, 12, 11, 13, 11, 12, 13, 12, 12, 12, 12, 12, 10, - 13, 15, 15, 16, 15, 16, 16, 15, 16, 16, 16, 15, 15, 15, 16, 14, - 10, 13, 13, 13, 13, 13, 14, 13, 13, 14, 13, 13, 13, 13, 13, 11, - 8, 11, 11, 11, 11, 11, 12, 11, 11, 12, 12, 11, 12, 11, 12, 9, - 11, 14, 14, 15, 14, 15, 15, 14, 13, 15, 14, 15, 12, 14, 15, 13, - 12, 15, 15, 15, 15, 15, 16, 15, 15, 16, 16, 16, 15, 16, 15, 13, - 14, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 15, - 11, 14, 13, 15, 14, 14, 16, 14, 14, 16, 13, 14, 15, 14, 15, 12, - 11, 14, 13, 14, 14, 14, 16, 15, 14, 16, 14, 14, 15, 15, 15, 12, - 13, 15, 15, 15, 15, 16, 16, 15, 16, 16, 16, 15, 16, 16, 16, 13, - 11, 14, 13, 14, 14, 14, 15, 14, 14, 16, 12, 14, 16, 16, 14, 12, - 11, 14, 14, 14, 14, 15, 16, 15, 14, 16, 13, 14, 16, 15, 14, 12, - 12, 14, 14, 14, 14, 14, 16, 14, 15, 16, 14, 14, 14, 15, 15, 12, - 11, 14, 14, 14, 13, 14, 16, 15, 13, 16, 15, 15, 11, 14, 14, 12, - 11, 14, 14, 15, 14, 14, 16, 14, 14, 15, 14, 14, 13, 15, 15, 12, - 13, 15, 16, 15, 15, 15, 16, 15, 16, 16, 16, 16, 15, 15, 16, 13, - 11, 14, 14, 14, 14, 14, 15, 14, 14, 16, 14, 14, 14, 15, 14, 12, - 9, 12, 12, 12, 12, 12, 13, 12, 12, 13, 12, 13, 12, 12, 12, 10, - 11, 13, 13, 13, 13, 13, 14, 13, 13, 14, 13, 14, 13, 13, 14, 11, - 12, 15, 14, 15, 15, 15, 16, 15, 14, 16, 14, 14, 16, 16, 14, 13, - 10, 12, 12, 12, 12, 12, 14, 12, 13, 13, 12, 12, 13, 13, 13, 10, - 10, 12, 12, 12, 12, 12, 14, 12, 12, 13, 12, 12, 12, 12, 12, 10, - 10, 14, 14, 14, 12, 14, 16, 14, 13, 16, 16, 16, 10, 13, 14, 12, - 11, 14, 14, 14, 13, 14, 16, 14, 14, 16, 15, 14, 12, 13, 14, 12, - 12, 14, 14, 14, 14, 14, 16, 14, 14, 16, 15, 15, 14, 14, 15, 12, - 12, 14, 15, 15, 14, 15, 16, 14, 15, 15, 15, 15, 13, 15, 14, 12, - 9, 12, 12, 12, 12, 13, 13, 12, 12, 13, 13, 12, 11, 12, 12, 10, - 10, 12, 12, 12, 12, 12, 13, 12, 12, 13, 12, 12, 12, 12, 12, 10, - 13, 15, 15, 15, 15, 16, 16, 16, 16, 16, 16, 16, 15, 16, 15, 13, - 10, 12, 12, 13, 12, 13, 13, 12, 13, 14, 13, 13, 12, 13, 13, 10, - 7, 10, 10, 10, 10, 10, 11, 10, 10, 11, 10, 10, 10, 10, 10, 7, - ], - ], [ - [ - 10, 10, 9, 8, 9, 8, 9, 7, 9, 9, 8, 7, 8, 7, 7, 4, - 13, 11, 12, 9, 12, 9, 12, 9, 12, 11, 11, 9, 10, 9, 9, 6, - 15, 12, 15, 11, 14, 10, 14, 10, 14, 13, 13, 11, 13, 11, 12, 7, - 13, 12, 11, 9, 12, 11, 12, 9, 12, 12, 10, 9, 10, 10, 9, 6, - 14, 13, 12, 10, 13, 12, 13, 9, 13, 12, 11, 10, 12, 11, 10, 6, - 16, 14, 14, 10, 15, 13, 14, 10, 15, 15, 14, 11, 14, 12, 12, 8, - 15, 14, 12, 11, 15, 14, 13, 11, 14, 14, 11, 10, 13, 12, 11, 8, - 15, 16, 13, 11, 16, 14, 14, 11, 15, 15, 12, 10, 14, 13, 12, 8, - 16, 15, 14, 10, 16, 14, 14, 10, 16, 15, 14, 10, 14, 13, 12, 7, - 13, 12, 12, 11, 11, 9, 12, 9, 12, 12, 11, 10, 10, 9, 9, 6, - 13, 13, 14, 12, 12, 10, 12, 10, 14, 13, 12, 11, 11, 10, 10, 7, - 16, 14, 16, 13, 14, 11, 15, 10, 16, 15, 14, 12, 14, 11, 12, 8, - 14, 14, 13, 12, 13, 12, 13, 10, 13, 13, 12, 11, 11, 10, 10, 7, - 15, 14, 14, 12, 14, 12, 13, 10, 14, 13, 12, 11, 12, 11, 11, 7, - 16, 15, 16, 13, 15, 13, 15, 10, 16, 15, 14, 12, 14, 12, 12, 7, - 15, 16, 14, 13, 16, 14, 14, 12, 15, 15, 12, 12, 13, 12, 12, 8, - 16, 16, 14, 13, 16, 14, 14, 11, 15, 15, 14, 11, 14, 12, 12, 8, - 16, 16, 15, 12, 16, 14, 15, 10, 16, 16, 13, 12, 14, 13, 12, 7, - 14, 14, 14, 13, 13, 11, 13, 11, 14, 14, 13, 12, 11, 10, 11, 8, - 16, 15, 16, 13, 13, 11, 14, 11, 15, 14, 14, 13, 12, 11, 12, 8, - 15, 15, 16, 14, 14, 10, 14, 10, 16, 15, 15, 13, 14, 10, 12, 8, - 16, 16, 16, 14, 15, 13, 14, 12, 15, 15, 13, 13, 13, 12, 12, 8, - 16, 16, 16, 14, 15, 13, 14, 11, 16, 16, 14, 13, 13, 12, 12, 8, - 16, 16, 16, 14, 16, 12, 15, 11, 16, 15, 15, 13, 14, 12, 12, 8, - 16, 16, 16, 16, 16, 15, 15, 13, 16, 16, 14, 13, 14, 13, 12, 9, - 16, 16, 16, 14, 16, 15, 15, 11, 16, 16, 14, 13, 15, 13, 12, 8, - 16, 16, 16, 14, 16, 14, 14, 10, 16, 16, 15, 13, 14, 12, 12, 7, - 12, 12, 12, 11, 12, 11, 12, 10, 11, 11, 10, 9, 9, 9, 9, 6, - 14, 13, 14, 12, 13, 12, 13, 10, 13, 13, 12, 10, 12, 10, 11, 7, - 16, 14, 16, 13, 15, 13, 16, 12, 15, 14, 14, 12, 14, 12, 13, 8, - 14, 14, 13, 11, 14, 12, 13, 11, 12, 12, 10, 10, 11, 10, 10, 7, - 14, 14, 13, 12, 14, 12, 13, 11, 13, 13, 12, 10, 12, 11, 10, 7, - 16, 15, 15, 12, 16, 14, 15, 11, 16, 14, 13, 11, 14, 12, 12, 8, - 16, 16, 13, 13, 16, 15, 14, 12, 14, 14, 11, 11, 13, 12, 11, 8, - 16, 16, 14, 12, 16, 14, 14, 12, 15, 14, 12, 11, 14, 12, 12, 8, - 16, 15, 14, 11, 16, 15, 15, 11, 16, 15, 13, 11, 14, 13, 12, 8, - 14, 13, 13, 12, 13, 11, 13, 10, 12, 13, 11, 10, 10, 10, 10, 7, - 15, 14, 14, 13, 13, 12, 13, 11, 14, 13, 12, 11, 12, 10, 11, 7, - 16, 15, 16, 14, 15, 12, 15, 11, 16, 14, 14, 12, 14, 11, 12, 8, - 14, 15, 13, 12, 14, 13, 13, 11, 13, 13, 11, 11, 11, 10, 10, 7, - 14, 14, 14, 12, 14, 13, 13, 10, 14, 13, 12, 10, 12, 10, 10, 6, - 16, 15, 15, 13, 16, 13, 15, 11, 15, 14, 13, 11, 13, 11, 11, 7, - 16, 16, 14, 13, 16, 15, 14, 12, 15, 15, 12, 11, 13, 12, 11, 8, - 16, 16, 14, 13, 16, 14, 14, 11, 15, 14, 12, 11, 13, 12, 11, 7, - 16, 16, 15, 12, 16, 14, 14, 11, 15, 15, 13, 11, 14, 12, 11, 6, - 16, 15, 15, 14, 14, 12, 14, 12, 13, 14, 13, 12, 11, 11, 11, 8, - 16, 16, 16, 14, 14, 12, 15, 12, 15, 14, 14, 12, 12, 11, 12, 8, - 16, 16, 16, 15, 14, 12, 15, 12, 16, 15, 14, 13, 13, 11, 12, 8, - 16, 16, 16, 15, 15, 14, 15, 12, 14, 14, 13, 12, 12, 11, 11, 8, - 16, 16, 15, 14, 14, 12, 14, 11, 14, 14, 13, 12, 12, 11, 11, 7, - 16, 16, 16, 14, 15, 12, 14, 11, 15, 15, 14, 12, 13, 11, 12, 7, - 16, 16, 16, 16, 16, 15, 16, 13, 15, 15, 14, 12, 13, 12, 11, 8, - 16, 16, 16, 14, 15, 14, 14, 12, 16, 15, 13, 12, 13, 12, 11, 7, - 16, 16, 16, 13, 16, 13, 14, 10, 16, 15, 14, 11, 13, 11, 11, 6, - 14, 15, 13, 13, 14, 13, 14, 12, 12, 13, 11, 11, 11, 11, 10, 8, - 16, 16, 15, 13, 16, 14, 16, 13, 14, 14, 13, 12, 13, 12, 12, 8, - 16, 16, 16, 14, 16, 14, 16, 13, 16, 14, 15, 13, 15, 13, 13, 9, - 15, 15, 14, 14, 15, 14, 14, 12, 13, 14, 11, 11, 12, 12, 11, 8, - 15, 16, 15, 13, 15, 14, 14, 12, 14, 14, 12, 11, 13, 12, 12, 8, - 16, 16, 16, 13, 16, 15, 15, 13, 16, 15, 14, 11, 15, 12, 13, 8, - 16, 16, 14, 13, 16, 15, 15, 13, 14, 14, 10, 11, 14, 12, 11, 8, - 16, 16, 15, 13, 16, 16, 15, 13, 15, 14, 12, 11, 14, 13, 12, 8, - 16, 16, 15, 13, 16, 15, 16, 12, 16, 14, 13, 10, 15, 13, 12, 7, - 15, 15, 15, 14, 14, 14, 15, 12, 13, 14, 12, 12, 11, 11, 11, 8, - 16, 15, 16, 14, 15, 13, 15, 12, 14, 14, 13, 12, 12, 11, 12, 8, - 16, 16, 16, 15, 16, 14, 16, 13, 16, 15, 14, 12, 14, 11, 13, 8, - 16, 16, 15, 14, 16, 14, 15, 13, 14, 14, 12, 11, 12, 11, 11, 8, - 15, 16, 15, 14, 15, 14, 14, 12, 14, 13, 12, 11, 12, 11, 11, 7, - 16, 16, 16, 14, 16, 13, 16, 12, 15, 14, 13, 11, 13, 11, 12, 7, - 16, 16, 15, 14, 16, 15, 15, 13, 14, 15, 11, 11, 13, 12, 11, 8, - 16, 16, 15, 13, 16, 14, 15, 12, 15, 14, 12, 11, 13, 11, 11, 7, - 16, 16, 15, 13, 16, 14, 16, 12, 15, 14, 13, 10, 13, 11, 11, 6, - 16, 16, 16, 14, 14, 14, 15, 13, 14, 14, 14, 12, 11, 11, 11, 8, - 16, 16, 16, 14, 15, 14, 16, 13, 15, 14, 14, 13, 12, 11, 11, 7, - 16, 16, 16, 16, 15, 13, 16, 12, 15, 15, 14, 12, 13, 10, 12, 7, - 16, 16, 16, 14, 15, 15, 14, 13, 14, 14, 13, 12, 12, 11, 11, 8, - 16, 15, 16, 14, 16, 13, 15, 12, 14, 14, 13, 12, 12, 10, 10, 6, - 16, 15, 16, 14, 16, 13, 16, 11, 16, 14, 13, 11, 13, 10, 11, 6, - 16, 16, 16, 15, 16, 16, 15, 13, 14, 16, 12, 12, 12, 12, 10, 7, - 16, 16, 16, 14, 16, 14, 14, 12, 15, 15, 12, 11, 12, 11, 10, 6, - 16, 16, 16, 13, 16, 13, 15, 10, 15, 14, 13, 10, 13, 10, 10, 4, - ], [ - 1, 6, 6, 7, 6, 7, 9, 8, 7, 9, 7, 8, 7, 8, 8, 6, - 6, 9, 10, 10, 10, 10, 12, 11, 10, 12, 11, 11, 11, 11, 12, 9, - 9, 10, 13, 11, 13, 12, 14, 13, 14, 14, 14, 14, 14, 14, 14, 12, - 6, 10, 9, 10, 10, 11, 13, 11, 11, 13, 10, 12, 11, 12, 12, 9, - 6, 10, 10, 10, 10, 11, 13, 11, 11, 13, 12, 12, 11, 12, 12, 9, - 9, 11, 13, 12, 13, 14, 15, 13, 14, 16, 14, 14, 14, 14, 15, 12, - 10, 13, 11, 13, 14, 14, 16, 14, 14, 15, 13, 14, 15, 15, 16, 12, - 9, 13, 12, 12, 14, 14, 16, 14, 14, 15, 14, 14, 15, 15, 15, 12, - 8, 11, 12, 11, 13, 14, 15, 13, 13, 15, 14, 14, 13, 15, 15, 11, - 6, 10, 10, 11, 9, 10, 13, 11, 10, 13, 11, 12, 10, 12, 12, 9, - 6, 10, 10, 11, 11, 10, 13, 11, 11, 13, 11, 12, 12, 12, 13, 10, - 9, 12, 13, 13, 13, 12, 16, 13, 14, 15, 14, 14, 15, 14, 15, 12, - 8, 12, 12, 13, 12, 13, 15, 14, 13, 15, 13, 14, 13, 13, 14, 11, - 7, 11, 11, 12, 11, 12, 13, 12, 12, 13, 12, 13, 12, 13, 13, 10, - 9, 12, 13, 13, 13, 13, 16, 13, 13, 15, 14, 14, 14, 15, 15, 12, - 11, 15, 14, 15, 15, 16, 16, 16, 15, 16, 15, 16, 16, 16, 16, 14, - 10, 13, 13, 14, 14, 14, 16, 15, 14, 16, 15, 15, 15, 15, 16, 13, - 9, 12, 13, 13, 13, 14, 16, 14, 13, 15, 14, 14, 14, 16, 15, 12, - 10, 13, 14, 14, 11, 13, 16, 14, 14, 16, 15, 15, 12, 14, 15, 12, - 10, 13, 14, 14, 12, 12, 16, 15, 14, 16, 15, 15, 14, 14, 16, 12, - 9, 12, 13, 14, 13, 11, 16, 13, 14, 15, 13, 14, 14, 14, 15, 12, - 11, 15, 16, 16, 14, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 14, - 10, 13, 14, 14, 13, 14, 16, 15, 14, 16, 16, 16, 14, 15, 16, 13, - 10, 13, 13, 14, 13, 13, 16, 13, 13, 14, 14, 15, 15, 14, 15, 13, - 13, 15, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 15, - 12, 16, 16, 16, 15, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 14, - 10, 12, 13, 14, 13, 13, 14, 13, 13, 14, 13, 14, 14, 14, 15, 12, - 6, 10, 11, 11, 10, 11, 13, 12, 11, 13, 11, 12, 11, 12, 12, 10, - 8, 12, 13, 13, 12, 13, 14, 14, 13, 15, 14, 14, 14, 14, 15, 12, - 12, 14, 16, 15, 15, 15, 16, 15, 16, 16, 16, 16, 16, 16, 16, 14, - 7, 11, 11, 12, 12, 12, 14, 13, 12, 14, 11, 12, 13, 13, 13, 11, - 8, 11, 12, 12, 12, 12, 14, 13, 12, 14, 12, 13, 13, 14, 14, 11, - 11, 13, 14, 14, 14, 14, 16, 15, 15, 16, 15, 15, 16, 16, 16, 13, - 10, 14, 12, 14, 14, 15, 16, 15, 13, 16, 12, 14, 16, 16, 15, 13, - 10, 13, 13, 14, 14, 15, 16, 15, 14, 16, 14, 15, 15, 16, 16, 12, - 10, 13, 14, 13, 14, 14, 16, 15, 14, 16, 15, 15, 14, 16, 16, 13, - 7, 11, 11, 11, 10, 12, 14, 13, 11, 14, 13, 13, 10, 12, 13, 10, - 8, 11, 12, 12, 11, 12, 14, 13, 12, 15, 13, 13, 12, 13, 14, 11, - 11, 13, 14, 14, 14, 14, 16, 15, 14, 16, 15, 16, 16, 16, 16, 14, - 8, 12, 12, 13, 12, 13, 15, 14, 12, 15, 13, 13, 13, 14, 14, 11, - 6, 10, 10, 11, 10, 11, 13, 12, 11, 13, 11, 12, 11, 12, 12, 9, - 9, 12, 13, 13, 13, 13, 14, 13, 13, 15, 14, 14, 14, 14, 14, 12, - 11, 15, 14, 15, 14, 15, 16, 16, 16, 16, 15, 16, 16, 16, 16, 14, - 9, 13, 12, 13, 13, 13, 15, 14, 13, 14, 13, 14, 14, 15, 14, 12, - 9, 12, 12, 12, 12, 13, 14, 13, 13, 14, 13, 13, 13, 13, 14, 11, - 10, 13, 15, 14, 12, 14, 16, 14, 14, 16, 15, 15, 12, 14, 16, 12, - 10, 14, 14, 14, 13, 14, 16, 15, 14, 16, 16, 16, 13, 14, 16, 13, - 11, 13, 14, 14, 14, 13, 16, 14, 14, 16, 15, 15, 15, 15, 16, 13, - 11, 15, 15, 15, 14, 15, 16, 16, 15, 16, 16, 16, 14, 16, 16, 13, - 9, 13, 13, 13, 12, 13, 15, 14, 13, 15, 14, 14, 13, 14, 15, 11, - 9, 12, 12, 13, 12, 12, 14, 13, 13, 14, 13, 14, 14, 14, 14, 11, - 13, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 15, - 11, 14, 14, 15, 15, 14, 16, 16, 14, 16, 14, 15, 15, 16, 16, 12, - 9, 12, 12, 13, 12, 12, 14, 12, 12, 14, 13, 13, 13, 13, 14, 11, - 11, 14, 14, 16, 14, 16, 16, 16, 13, 16, 14, 16, 14, 16, 16, 13, - 12, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 14, - 14, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 11, 15, 14, 16, 14, 15, 16, 16, 15, 16, 14, 15, 16, 16, 16, 13, - 11, 15, 14, 16, 15, 16, 16, 16, 15, 16, 15, 16, 16, 16, 16, 14, - 13, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 14, - 11, 14, 13, 14, 15, 14, 16, 15, 14, 16, 12, 14, 16, 16, 15, 13, - 11, 14, 14, 16, 14, 15, 16, 16, 15, 16, 14, 15, 16, 16, 16, 14, - 12, 14, 14, 15, 14, 16, 16, 15, 14, 16, 15, 15, 15, 16, 16, 13, - 11, 14, 15, 15, 13, 15, 16, 16, 14, 16, 16, 16, 12, 15, 15, 13, - 11, 15, 16, 16, 15, 16, 16, 16, 15, 16, 16, 16, 14, 16, 16, 14, - 13, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 15, - 11, 15, 14, 16, 15, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 13, - 10, 13, 13, 14, 14, 14, 16, 15, 14, 16, 14, 15, 14, 14, 15, 12, - 12, 15, 14, 16, 14, 15, 16, 15, 15, 16, 15, 15, 16, 15, 16, 13, - 12, 16, 14, 16, 15, 16, 16, 16, 16, 16, 14, 15, 16, 16, 16, 14, - 10, 13, 13, 14, 14, 13, 16, 14, 13, 16, 13, 14, 15, 15, 15, 12, - 10, 13, 13, 14, 13, 13, 16, 14, 14, 15, 14, 14, 14, 14, 15, 12, - 10, 14, 15, 14, 13, 15, 16, 15, 14, 16, 16, 16, 11, 14, 16, 12, - 11, 14, 14, 16, 14, 15, 16, 15, 15, 16, 16, 16, 13, 15, 16, 13, - 12, 15, 15, 15, 15, 15, 16, 16, 16, 16, 16, 16, 16, 15, 16, 13, - 12, 16, 16, 16, 15, 16, 16, 16, 16, 16, 16, 16, 14, 16, 16, 13, - 10, 13, 14, 14, 13, 14, 16, 14, 13, 16, 15, 14, 12, 14, 16, 11, - 10, 13, 13, 14, 13, 14, 16, 14, 14, 15, 14, 14, 13, 14, 14, 11, - 13, 16, 15, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 14, - 11, 13, 14, 15, 14, 14, 16, 15, 14, 16, 14, 15, 14, 15, 16, 12, - 8, 11, 11, 11, 11, 12, 13, 12, 11, 13, 11, 12, 11, 12, 12, 9, - ], - ], [ - [ - 8, 8, 8, 7, 8, 7, 8, 6, 8, 8, 7, 6, 7, 6, 6, 4, - 11, 10, 11, 9, 11, 9, 11, 8, 11, 10, 10, 9, 10, 8, 9, 6, - 13, 11, 13, 10, 12, 10, 13, 9, 13, 12, 13, 10, 12, 10, 11, 7, - 11, 11, 10, 9, 11, 10, 11, 9, 10, 11, 9, 8, 10, 9, 9, 6, - 12, 12, 11, 9, 12, 11, 12, 9, 12, 12, 11, 9, 11, 10, 10, 7, - 14, 13, 13, 10, 15, 12, 13, 10, 15, 13, 13, 10, 13, 12, 12, 8, - 13, 13, 11, 10, 14, 13, 12, 10, 13, 13, 10, 10, 12, 11, 10, 8, - 15, 14, 13, 10, 14, 13, 13, 10, 14, 13, 12, 10, 13, 12, 11, 8, - 14, 14, 13, 10, 16, 13, 13, 10, 15, 14, 13, 10, 13, 12, 12, 8, - 11, 11, 11, 10, 10, 9, 10, 9, 10, 10, 10, 9, 9, 8, 9, 6, - 12, 12, 12, 11, 11, 9, 12, 9, 12, 12, 11, 10, 11, 9, 10, 7, - 14, 13, 14, 12, 13, 10, 13, 10, 15, 13, 14, 12, 12, 10, 12, 8, - 13, 13, 12, 11, 12, 11, 12, 10, 12, 12, 11, 10, 11, 10, 10, 7, - 14, 13, 13, 11, 13, 12, 12, 10, 13, 13, 12, 11, 12, 10, 10, 7, - 16, 15, 15, 12, 14, 12, 13, 10, 15, 14, 13, 12, 13, 12, 12, 8, - 15, 15, 13, 13, 14, 14, 14, 12, 14, 14, 12, 11, 13, 12, 11, 8, - 15, 16, 14, 12, 15, 14, 13, 11, 15, 15, 13, 12, 13, 12, 11, 8, - 16, 15, 15, 12, 16, 14, 14, 10, 15, 15, 14, 12, 14, 12, 12, 8, - 13, 13, 13, 13, 11, 10, 12, 10, 12, 13, 12, 11, 10, 10, 10, 8, - 14, 13, 14, 13, 12, 10, 13, 10, 14, 14, 13, 12, 12, 10, 11, 8, - 15, 14, 16, 14, 13, 10, 14, 10, 16, 14, 14, 13, 13, 10, 12, 8, - 15, 15, 14, 14, 14, 13, 13, 12, 14, 14, 13, 12, 12, 11, 11, 9, - 15, 15, 15, 14, 14, 12, 14, 11, 15, 14, 13, 13, 13, 11, 11, 8, - 16, 15, 16, 14, 15, 12, 14, 11, 16, 16, 15, 13, 14, 12, 12, 8, - 16, 16, 16, 14, 15, 14, 14, 12, 15, 15, 14, 13, 13, 12, 11, 9, - 16, 16, 15, 15, 16, 14, 14, 11, 16, 16, 14, 13, 14, 12, 12, 8, - 16, 16, 16, 13, 15, 13, 14, 10, 16, 16, 15, 13, 14, 12, 12, 8, - 11, 11, 11, 10, 11, 10, 11, 9, 10, 10, 9, 8, 9, 9, 9, 6, - 12, 12, 13, 11, 12, 11, 12, 10, 12, 12, 11, 10, 11, 10, 10, 7, - 15, 13, 15, 12, 14, 13, 14, 11, 14, 13, 13, 11, 13, 11, 12, 8, - 12, 13, 12, 11, 13, 11, 12, 10, 11, 12, 10, 9, 11, 10, 10, 7, - 14, 13, 13, 11, 14, 12, 13, 11, 12, 12, 11, 10, 12, 11, 10, 7, - 15, 14, 15, 12, 15, 13, 15, 11, 15, 14, 13, 11, 13, 12, 12, 8, - 14, 14, 13, 12, 15, 14, 13, 12, 13, 13, 11, 10, 13, 12, 11, 8, - 16, 15, 13, 12, 15, 14, 14, 12, 14, 14, 12, 11, 14, 12, 11, 8, - 16, 15, 14, 12, 16, 15, 15, 11, 15, 14, 13, 11, 14, 13, 12, 8, - 12, 12, 12, 11, 12, 11, 12, 10, 11, 11, 11, 10, 10, 9, 9, 7, - 13, 13, 14, 12, 13, 11, 13, 11, 13, 12, 12, 11, 11, 10, 10, 7, - 15, 14, 16, 13, 14, 12, 14, 11, 14, 14, 14, 12, 13, 11, 12, 8, - 13, 13, 13, 12, 13, 12, 13, 11, 12, 12, 11, 10, 11, 10, 10, 7, - 14, 14, 13, 12, 13, 12, 13, 10, 13, 13, 11, 10, 12, 10, 10, 7, - 16, 15, 15, 13, 15, 12, 14, 11, 15, 14, 13, 11, 13, 11, 11, 7, - 15, 16, 14, 13, 15, 14, 14, 12, 14, 14, 12, 11, 13, 12, 11, 8, - 16, 15, 14, 13, 15, 14, 14, 11, 14, 14, 12, 11, 13, 12, 11, 7, - 16, 15, 15, 12, 16, 14, 14, 11, 15, 14, 13, 11, 14, 12, 11, 7, - 14, 15, 14, 14, 13, 12, 13, 12, 13, 13, 12, 12, 11, 10, 11, 8, - 15, 15, 15, 14, 13, 12, 14, 12, 14, 14, 13, 12, 12, 11, 11, 8, - 16, 15, 16, 14, 14, 12, 15, 12, 16, 14, 14, 13, 13, 11, 12, 8, - 15, 15, 15, 14, 14, 13, 14, 12, 14, 14, 13, 12, 12, 11, 11, 8, - 15, 15, 15, 14, 14, 13, 14, 12, 14, 14, 13, 12, 12, 11, 11, 7, - 16, 15, 16, 14, 15, 12, 15, 11, 15, 14, 14, 12, 13, 11, 12, 7, - 16, 16, 16, 15, 16, 15, 14, 13, 15, 15, 13, 12, 13, 12, 11, 9, - 16, 16, 16, 14, 15, 14, 14, 12, 15, 15, 13, 12, 14, 12, 11, 8, - 16, 16, 16, 14, 16, 14, 14, 11, 15, 15, 14, 12, 14, 12, 11, 7, - 13, 13, 13, 12, 13, 12, 13, 11, 11, 12, 11, 10, 10, 10, 10, 8, - 15, 14, 14, 13, 14, 13, 14, 12, 13, 13, 12, 11, 13, 11, 11, 8, - 16, 15, 16, 14, 16, 14, 16, 13, 15, 14, 14, 12, 14, 12, 13, 9, - 14, 15, 13, 13, 14, 13, 14, 12, 12, 13, 11, 11, 12, 11, 11, 8, - 15, 15, 14, 13, 15, 14, 14, 12, 13, 13, 12, 11, 13, 12, 11, 8, - 16, 16, 16, 13, 16, 15, 16, 13, 15, 14, 14, 12, 14, 13, 13, 9, - 14, 15, 13, 13, 16, 15, 15, 13, 13, 14, 11, 11, 13, 12, 11, 9, - 16, 16, 14, 13, 16, 15, 16, 13, 14, 14, 12, 11, 14, 13, 12, 8, - 16, 16, 15, 12, 16, 15, 15, 12, 15, 14, 13, 11, 14, 13, 12, 8, - 14, 14, 14, 13, 14, 13, 14, 12, 12, 13, 12, 11, 11, 11, 11, 8, - 15, 15, 15, 14, 14, 13, 15, 12, 14, 13, 13, 12, 12, 11, 11, 8, - 16, 16, 16, 15, 15, 14, 16, 13, 15, 14, 14, 12, 14, 12, 12, 9, - 15, 15, 14, 14, 14, 14, 14, 13, 13, 14, 12, 11, 12, 11, 11, 8, - 15, 15, 15, 13, 15, 14, 14, 12, 13, 13, 12, 11, 12, 11, 11, 7, - 16, 15, 16, 14, 16, 14, 15, 12, 15, 14, 14, 12, 13, 12, 12, 8, - 16, 16, 15, 14, 16, 15, 15, 13, 14, 14, 12, 11, 13, 12, 11, 8, - 16, 16, 15, 13, 16, 14, 14, 12, 14, 15, 12, 11, 13, 12, 11, 7, - 16, 16, 16, 13, 16, 15, 15, 12, 15, 14, 13, 11, 14, 12, 11, 7, - 15, 15, 15, 14, 13, 13, 14, 13, 13, 14, 13, 12, 11, 11, 11, 8, - 16, 16, 16, 14, 15, 13, 15, 12, 14, 14, 14, 13, 12, 11, 12, 8, - 16, 16, 16, 14, 15, 13, 15, 12, 15, 14, 14, 12, 13, 11, 12, 8, - 15, 16, 16, 14, 15, 14, 15, 13, 14, 14, 12, 12, 11, 11, 11, 8, - 16, 15, 15, 14, 15, 14, 14, 12, 14, 14, 13, 12, 12, 11, 11, 7, - 16, 16, 16, 13, 15, 13, 15, 12, 15, 14, 14, 12, 13, 11, 11, 7, - 16, 16, 16, 15, 15, 16, 15, 13, 14, 14, 12, 12, 12, 12, 11, 8, - 16, 16, 16, 14, 16, 14, 14, 12, 15, 15, 13, 11, 12, 11, 10, 7, - 16, 16, 15, 13, 16, 14, 14, 11, 15, 14, 13, 10, 13, 11, 10, 5, - ], [ - 1, 6, 6, 7, 6, 7, 9, 7, 6, 9, 7, 8, 7, 8, 8, 5, - 5, 8, 10, 10, 10, 10, 12, 11, 11, 12, 11, 11, 11, 12, 12, 9, - 9, 10, 12, 11, 13, 12, 15, 13, 14, 15, 15, 14, 14, 15, 15, 12, - 6, 10, 9, 10, 10, 11, 13, 12, 11, 13, 11, 12, 12, 12, 12, 10, - 6, 10, 10, 10, 11, 11, 13, 11, 11, 13, 12, 12, 11, 12, 12, 10, - 9, 12, 13, 12, 13, 13, 16, 13, 14, 16, 15, 14, 14, 15, 16, 12, - 9, 13, 11, 13, 14, 14, 16, 15, 14, 16, 13, 15, 15, 15, 15, 12, - 9, 13, 12, 13, 14, 15, 16, 15, 14, 16, 15, 15, 15, 15, 16, 12, - 8, 12, 12, 11, 13, 14, 15, 13, 13, 15, 14, 14, 14, 14, 14, 12, - 6, 10, 10, 11, 9, 10, 13, 11, 11, 13, 12, 12, 10, 12, 12, 9, - 6, 10, 11, 11, 11, 10, 13, 12, 11, 13, 12, 12, 12, 12, 13, 10, - 9, 12, 13, 13, 13, 12, 16, 13, 14, 16, 14, 15, 16, 14, 15, 12, - 8, 12, 13, 13, 13, 13, 16, 14, 13, 16, 13, 14, 14, 14, 14, 12, - 7, 11, 11, 12, 11, 12, 14, 13, 12, 14, 13, 13, 12, 13, 13, 11, - 9, 12, 13, 13, 13, 13, 15, 14, 14, 16, 16, 15, 15, 15, 16, 12, - 11, 16, 14, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 14, - 10, 14, 14, 15, 15, 16, 16, 16, 14, 16, 14, 16, 16, 16, 16, 13, - 9, 13, 13, 13, 14, 14, 16, 14, 14, 16, 15, 14, 14, 16, 16, 13, - 9, 13, 14, 14, 11, 13, 16, 14, 13, 16, 15, 16, 13, 14, 15, 12, - 10, 13, 14, 15, 13, 12, 16, 14, 14, 16, 15, 15, 14, 14, 16, 13, - 9, 12, 13, 14, 12, 11, 15, 13, 13, 15, 13, 14, 15, 14, 16, 12, - 11, 15, 16, 16, 14, 16, 16, 16, 15, 16, 16, 16, 16, 16, 16, 13, - 11, 14, 14, 15, 13, 14, 16, 15, 15, 16, 16, 16, 16, 16, 16, 13, - 10, 12, 13, 14, 13, 13, 16, 14, 14, 14, 14, 16, 15, 14, 16, 13, - 13, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 15, - 12, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 14, - 9, 12, 13, 14, 13, 13, 16, 13, 13, 15, 15, 16, 15, 15, 16, 12, - 6, 11, 11, 12, 10, 12, 13, 12, 11, 13, 11, 12, 11, 12, 13, 10, - 9, 12, 13, 13, 13, 13, 16, 14, 14, 15, 14, 14, 14, 14, 14, 12, - 12, 14, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 14, - 7, 11, 11, 12, 12, 12, 14, 13, 12, 14, 11, 13, 13, 13, 13, 11, - 8, 12, 12, 13, 12, 13, 14, 13, 13, 14, 13, 13, 13, 14, 14, 11, - 11, 14, 14, 15, 16, 15, 16, 16, 15, 16, 16, 16, 16, 16, 16, 13, - 10, 14, 12, 14, 15, 15, 16, 16, 14, 16, 12, 15, 16, 16, 16, 13, - 11, 14, 13, 15, 15, 15, 16, 16, 14, 16, 14, 14, 16, 16, 16, 13, - 11, 14, 14, 14, 15, 16, 16, 16, 16, 16, 16, 15, 16, 16, 16, 13, - 7, 11, 12, 11, 10, 12, 14, 13, 12, 14, 13, 13, 10, 12, 13, 10, - 8, 12, 12, 13, 12, 12, 15, 13, 13, 14, 13, 13, 13, 13, 14, 11, - 11, 13, 15, 16, 14, 15, 16, 16, 16, 16, 16, 16, 16, 16, 16, 13, - 9, 12, 13, 13, 13, 13, 15, 14, 13, 15, 13, 14, 13, 14, 14, 12, - 7, 11, 11, 11, 11, 11, 13, 12, 11, 13, 11, 12, 11, 12, 12, 10, - 9, 12, 13, 13, 13, 13, 16, 13, 14, 16, 15, 14, 14, 14, 16, 12, - 12, 14, 14, 16, 16, 16, 16, 16, 16, 16, 15, 16, 16, 16, 16, 14, - 10, 13, 13, 14, 14, 14, 16, 15, 14, 16, 14, 14, 16, 15, 15, 12, - 9, 12, 13, 13, 13, 15, 16, 14, 13, 16, 14, 13, 13, 14, 14, 11, - 10, 14, 15, 14, 12, 14, 16, 15, 13, 16, 16, 16, 12, 14, 16, 12, - 11, 14, 14, 14, 14, 14, 16, 15, 15, 16, 16, 16, 14, 15, 16, 13, - 11, 14, 14, 16, 14, 13, 16, 15, 14, 16, 15, 16, 15, 15, 16, 13, - 12, 16, 16, 16, 14, 16, 16, 16, 16, 16, 16, 16, 15, 16, 16, 14, - 10, 13, 14, 14, 13, 14, 16, 14, 13, 16, 15, 15, 13, 14, 14, 12, - 9, 12, 13, 14, 13, 12, 16, 14, 13, 16, 14, 14, 14, 14, 15, 12, - 14, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 12, 15, 15, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 13, - 9, 12, 13, 13, 13, 13, 14, 13, 12, 15, 14, 14, 14, 14, 14, 11, - 11, 14, 14, 16, 14, 16, 16, 16, 13, 16, 14, 16, 14, 16, 16, 13, - 13, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 14, - 14, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 11, 14, 14, 16, 16, 15, 16, 16, 15, 16, 14, 16, 16, 16, 16, 14, - 12, 15, 15, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 14, - 14, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 14, - 10, 14, 12, 15, 15, 15, 16, 16, 14, 16, 12, 14, 16, 16, 15, 14, - 12, 15, 14, 16, 16, 16, 16, 16, 15, 16, 14, 16, 16, 16, 16, 14, - 12, 15, 15, 15, 15, 16, 16, 16, 16, 16, 16, 15, 16, 16, 16, 14, - 11, 15, 15, 16, 14, 16, 16, 16, 14, 16, 16, 16, 13, 16, 16, 13, - 12, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 14, - 14, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 12, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 14, - 11, 15, 14, 16, 14, 14, 16, 15, 14, 16, 15, 16, 15, 16, 16, 12, - 12, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 13, - 12, 16, 15, 16, 16, 16, 16, 16, 16, 16, 15, 16, 16, 16, 16, 14, - 10, 14, 13, 14, 15, 14, 16, 15, 14, 16, 13, 16, 16, 16, 15, 13, - 10, 14, 14, 14, 13, 14, 16, 15, 15, 16, 14, 14, 14, 16, 16, 12, - 10, 14, 15, 14, 13, 16, 16, 15, 13, 16, 16, 16, 12, 14, 16, 12, - 11, 16, 16, 16, 14, 15, 16, 16, 16, 16, 16, 16, 14, 16, 16, 13, - 12, 15, 14, 16, 15, 16, 16, 16, 16, 16, 16, 16, 16, 14, 16, 14, - 13, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 15, 16, 16, 14, - 11, 14, 14, 14, 14, 15, 16, 14, 14, 16, 16, 16, 13, 15, 15, 12, - 10, 14, 13, 14, 14, 14, 16, 15, 14, 16, 15, 15, 14, 14, 16, 12, - 13, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 14, - 12, 14, 14, 16, 16, 16, 16, 16, 16, 16, 15, 16, 16, 16, 16, 13, - 8, 11, 11, 12, 12, 12, 13, 12, 11, 13, 12, 12, 12, 13, 12, 10, - ], - ], [ - [ - 5, 6, 6, 6, 6, 6, 7, 6, 6, 7, 6, 6, 6, 6, 6, 4, - 9, 9, 9, 8, 9, 8, 10, 8, 10, 10, 9, 9, 9, 8, 9, 6, - 11, 10, 12, 10, 11, 10, 12, 9, 12, 11, 11, 10, 11, 10, 11, 8, - 9, 10, 9, 8, 10, 10, 10, 9, 9, 10, 8, 8, 9, 9, 8, 7, - 10, 11, 10, 9, 11, 11, 11, 9, 11, 11, 10, 9, 10, 10, 10, 7, - 13, 12, 12, 10, 13, 12, 13, 10, 13, 12, 12, 11, 13, 12, 11, 9, - 11, 12, 10, 10, 12, 12, 11, 10, 11, 12, 10, 10, 11, 11, 10, 8, - 12, 12, 11, 10, 13, 13, 13, 10, 13, 13, 12, 11, 13, 12, 11, 9, - 12, 12, 12, 10, 13, 13, 13, 10, 13, 13, 12, 10, 13, 12, 12, 9, - 9, 9, 10, 10, 9, 8, 10, 9, 9, 10, 9, 9, 8, 8, 9, 6, - 10, 11, 11, 11, 10, 9, 11, 9, 11, 11, 11, 10, 10, 9, 10, 7, - 12, 12, 13, 12, 12, 10, 13, 10, 13, 13, 13, 12, 12, 11, 11, 9, - 11, 12, 11, 11, 11, 11, 11, 10, 11, 12, 10, 10, 10, 10, 10, 8, - 12, 12, 12, 11, 12, 11, 11, 10, 12, 12, 11, 11, 11, 11, 10, 8, - 14, 13, 13, 12, 13, 12, 13, 10, 14, 14, 13, 12, 13, 12, 12, 9, - 13, 14, 13, 12, 13, 13, 13, 12, 13, 13, 12, 12, 12, 12, 11, 9, - 14, 14, 13, 12, 13, 13, 13, 11, 14, 14, 13, 12, 13, 12, 12, 9, - 14, 15, 14, 12, 15, 13, 13, 11, 15, 14, 14, 12, 14, 13, 12, 9, - 11, 11, 12, 12, 10, 10, 12, 11, 11, 12, 11, 11, 10, 10, 10, 8, - 12, 12, 14, 13, 11, 10, 12, 11, 13, 13, 13, 12, 12, 10, 11, 9, - 13, 13, 14, 14, 12, 10, 13, 11, 14, 14, 14, 13, 12, 11, 12, 9, - 13, 13, 13, 13, 12, 13, 13, 12, 13, 14, 12, 12, 12, 12, 11, 9, - 13, 14, 14, 13, 13, 12, 13, 11, 14, 14, 13, 12, 13, 12, 12, 9, - 14, 14, 14, 14, 14, 12, 13, 11, 15, 15, 15, 13, 14, 12, 12, 9, - 14, 15, 15, 13, 14, 14, 13, 12, 13, 14, 13, 13, 12, 12, 11, 10, - 16, 16, 15, 14, 15, 14, 13, 11, 15, 15, 14, 13, 13, 13, 12, 9, - 15, 15, 15, 13, 14, 13, 13, 11, 15, 15, 15, 13, 14, 13, 12, 9, - 8, 9, 9, 9, 9, 9, 10, 9, 8, 10, 9, 9, 8, 8, 9, 7, - 11, 11, 11, 11, 11, 11, 12, 10, 11, 11, 11, 10, 10, 10, 10, 8, - 13, 13, 14, 12, 13, 12, 14, 11, 13, 13, 13, 12, 13, 11, 12, 9, - 10, 11, 10, 11, 11, 11, 12, 10, 10, 11, 10, 10, 10, 10, 10, 8, - 12, 12, 12, 11, 12, 12, 12, 11, 11, 12, 11, 10, 11, 11, 10, 8, - 14, 13, 14, 12, 14, 13, 14, 12, 14, 13, 13, 11, 13, 12, 12, 9, - 12, 13, 12, 12, 13, 13, 13, 12, 12, 13, 11, 11, 12, 12, 11, 9, - 13, 14, 13, 12, 14, 14, 14, 12, 14, 13, 12, 11, 13, 12, 12, 9, - 14, 14, 13, 12, 15, 14, 15, 12, 14, 14, 13, 11, 13, 13, 12, 9, - 10, 11, 11, 11, 10, 10, 12, 10, 10, 11, 10, 10, 9, 9, 10, 7, - 12, 12, 13, 12, 12, 11, 12, 11, 12, 12, 12, 11, 11, 10, 10, 8, - 14, 13, 14, 13, 14, 12, 13, 12, 14, 13, 14, 12, 13, 11, 12, 9, - 12, 13, 12, 12, 12, 12, 12, 11, 11, 12, 11, 10, 10, 10, 10, 8, - 12, 12, 12, 12, 12, 12, 12, 11, 12, 12, 11, 10, 11, 10, 10, 7, - 14, 14, 14, 12, 14, 12, 14, 11, 14, 13, 13, 11, 13, 11, 11, 8, - 13, 15, 13, 13, 14, 14, 14, 12, 13, 14, 12, 12, 12, 12, 11, 9, - 14, 15, 13, 12, 14, 13, 13, 11, 13, 13, 12, 11, 13, 12, 11, 8, - 15, 15, 15, 12, 15, 14, 14, 11, 14, 14, 13, 11, 13, 12, 12, 8, - 12, 13, 13, 13, 12, 12, 13, 12, 12, 13, 12, 12, 11, 11, 11, 9, - 13, 14, 15, 14, 13, 12, 14, 12, 13, 13, 14, 12, 12, 11, 12, 9, - 14, 14, 15, 14, 14, 12, 14, 12, 14, 14, 14, 13, 13, 11, 12, 9, - 13, 14, 14, 14, 13, 13, 14, 13, 13, 13, 12, 12, 12, 12, 11, 9, - 14, 14, 14, 13, 13, 13, 13, 12, 13, 14, 13, 12, 12, 11, 11, 8, - 15, 14, 15, 14, 14, 13, 14, 11, 15, 14, 14, 12, 13, 11, 12, 8, - 14, 15, 14, 14, 15, 14, 14, 13, 14, 15, 13, 13, 12, 12, 11, 10, - 16, 15, 14, 14, 14, 14, 13, 12, 14, 14, 13, 12, 13, 12, 11, 9, - 15, 15, 15, 14, 16, 14, 14, 11, 15, 15, 14, 12, 13, 12, 11, 8, - 11, 12, 11, 12, 12, 12, 12, 11, 10, 11, 10, 10, 10, 10, 10, 8, - 13, 13, 13, 13, 13, 13, 14, 12, 12, 12, 12, 12, 12, 11, 12, 9, - 14, 14, 14, 13, 15, 13, 15, 13, 14, 14, 14, 12, 14, 12, 13, 10, - 12, 13, 12, 13, 13, 13, 13, 12, 11, 12, 11, 11, 12, 11, 11, 9, - 14, 14, 13, 13, 14, 14, 14, 12, 12, 13, 12, 11, 13, 12, 12, 9, - 14, 14, 15, 13, 15, 15, 15, 13, 15, 13, 13, 12, 14, 12, 13, 10, - 13, 15, 12, 13, 14, 14, 14, 13, 12, 13, 11, 11, 13, 12, 11, 10, - 14, 15, 14, 13, 15, 14, 15, 13, 14, 14, 12, 11, 13, 13, 12, 9, - 14, 15, 14, 13, 15, 14, 15, 13, 14, 14, 13, 11, 14, 13, 12, 9, - 12, 13, 13, 13, 12, 13, 13, 12, 11, 12, 12, 11, 11, 11, 11, 9, - 13, 14, 14, 13, 14, 13, 14, 12, 13, 13, 13, 12, 12, 11, 11, 9, - 15, 15, 16, 14, 15, 14, 14, 13, 15, 14, 14, 13, 13, 12, 13, 10, - 13, 14, 14, 13, 13, 14, 14, 13, 12, 13, 12, 12, 11, 11, 11, 9, - 14, 14, 14, 13, 14, 13, 14, 12, 13, 13, 12, 11, 12, 11, 11, 8, - 15, 15, 15, 13, 15, 14, 14, 12, 14, 13, 13, 12, 13, 12, 12, 9, - 14, 15, 14, 14, 15, 15, 14, 13, 13, 14, 12, 12, 13, 12, 12, 9, - 15, 15, 14, 13, 15, 14, 14, 13, 14, 14, 12, 11, 13, 12, 11, 8, - 15, 16, 14, 13, 15, 15, 15, 12, 14, 14, 13, 11, 14, 12, 12, 8, - 12, 14, 13, 13, 13, 13, 14, 12, 12, 13, 12, 12, 10, 11, 11, 9, - 14, 15, 15, 14, 13, 13, 15, 13, 13, 14, 14, 12, 12, 11, 12, 9, - 15, 15, 16, 14, 14, 13, 15, 13, 14, 14, 14, 13, 13, 11, 12, 9, - 14, 15, 14, 14, 14, 14, 14, 13, 13, 14, 13, 12, 12, 12, 11, 9, - 14, 15, 15, 14, 14, 14, 14, 12, 13, 14, 13, 12, 12, 11, 11, 8, - 15, 15, 15, 14, 14, 13, 15, 12, 15, 14, 14, 12, 13, 11, 11, 8, - 14, 16, 14, 14, 14, 15, 14, 13, 13, 14, 12, 12, 12, 12, 11, 9, - 15, 15, 15, 14, 15, 14, 14, 12, 14, 14, 13, 12, 12, 11, 11, 8, - 15, 15, 14, 13, 15, 13, 14, 12, 14, 14, 13, 11, 13, 11, 11, 7, - ], [ - 1, 5, 6, 7, 6, 7, 9, 8, 6, 9, 8, 8, 7, 8, 8, 6, - 5, 8, 10, 10, 10, 11, 13, 12, 11, 13, 12, 12, 12, 12, 13, 10, - 8, 10, 13, 12, 13, 13, 16, 14, 14, 16, 16, 14, 16, 16, 16, 12, - 5, 10, 9, 11, 11, 12, 13, 12, 11, 13, 11, 12, 12, 12, 13, 10, - 6, 10, 11, 11, 11, 12, 14, 12, 11, 13, 13, 13, 12, 13, 13, 11, - 8, 12, 13, 12, 14, 14, 16, 14, 14, 16, 16, 16, 16, 16, 16, 13, - 9, 13, 11, 14, 14, 16, 16, 16, 14, 16, 14, 16, 16, 16, 16, 13, - 9, 13, 13, 13, 14, 16, 16, 16, 16, 14, 16, 16, 16, 16, 16, 14, - 8, 12, 13, 12, 13, 14, 16, 14, 14, 16, 16, 16, 14, 16, 16, 13, - 5, 10, 11, 12, 9, 11, 13, 12, 11, 13, 13, 13, 11, 12, 13, 10, - 6, 10, 11, 12, 11, 11, 14, 13, 12, 14, 12, 13, 13, 13, 13, 11, - 9, 12, 14, 15, 13, 13, 16, 16, 14, 16, 16, 16, 16, 16, 16, 13, - 8, 13, 13, 14, 13, 14, 16, 16, 14, 16, 14, 16, 14, 16, 14, 13, - 7, 11, 12, 13, 12, 12, 14, 13, 12, 14, 13, 14, 13, 14, 14, 12, - 9, 13, 14, 14, 14, 14, 16, 16, 16, 16, 16, 16, 16, 16, 16, 13, - 11, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 10, 15, 14, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 14, - 9, 13, 14, 14, 14, 16, 16, 16, 14, 16, 16, 16, 16, 16, 16, 14, - 9, 13, 14, 15, 11, 13, 16, 14, 14, 16, 16, 16, 13, 14, 16, 13, - 9, 13, 14, 16, 13, 13, 16, 16, 14, 16, 16, 16, 16, 15, 16, 14, - 8, 12, 13, 16, 13, 12, 16, 14, 13, 16, 14, 16, 16, 16, 16, 13, - 11, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 10, 14, 16, 16, 14, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 14, - 9, 13, 16, 16, 14, 14, 16, 16, 14, 16, 16, 16, 16, 16, 16, 14, - 12, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 12, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 9, 13, 14, 15, 14, 14, 16, 14, 13, 16, 16, 16, 14, 16, 16, 14, - 6, 11, 11, 12, 11, 12, 14, 13, 11, 14, 12, 13, 12, 13, 13, 11, - 9, 13, 13, 14, 13, 14, 16, 16, 14, 16, 16, 16, 15, 16, 16, 13, - 11, 14, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 7, 11, 11, 13, 12, 13, 16, 14, 12, 16, 12, 14, 14, 14, 14, 12, - 8, 12, 12, 13, 12, 14, 16, 14, 13, 16, 14, 14, 14, 14, 14, 12, - 11, 15, 15, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 14, - 10, 14, 13, 16, 16, 16, 16, 16, 14, 16, 14, 16, 16, 16, 16, 16, - 10, 16, 14, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 14, - 10, 16, 14, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 14, - 7, 11, 12, 12, 11, 13, 16, 14, 12, 15, 14, 14, 11, 13, 13, 12, - 8, 12, 12, 13, 13, 13, 16, 14, 13, 16, 13, 15, 13, 14, 14, 12, - 11, 14, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 14, - 8, 12, 13, 14, 13, 14, 16, 16, 14, 16, 14, 16, 14, 16, 15, 13, - 6, 11, 11, 12, 11, 12, 13, 13, 11, 13, 12, 13, 12, 13, 13, 11, - 9, 13, 14, 14, 14, 14, 16, 14, 14, 16, 16, 16, 16, 16, 14, 13, - 11, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 10, 14, 13, 14, 14, 16, 16, 16, 14, 16, 14, 16, 16, 16, 16, 13, - 9, 13, 14, 13, 13, 16, 16, 14, 13, 16, 16, 16, 13, 16, 14, 13, - 10, 14, 14, 16, 13, 16, 16, 16, 16, 16, 16, 16, 13, 14, 16, 14, - 11, 16, 16, 16, 14, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 14, - 10, 14, 16, 16, 14, 14, 16, 16, 16, 16, 16, 16, 16, 16, 16, 14, - 12, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 10, 14, 14, 14, 14, 16, 16, 16, 14, 16, 16, 16, 14, 16, 16, 13, - 9, 13, 13, 16, 14, 14, 16, 16, 14, 16, 14, 16, 16, 16, 16, 13, - 13, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 12, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 9, 13, 14, 14, 13, 16, 16, 14, 13, 16, 14, 16, 14, 14, 16, 12, - 10, 14, 14, 16, 16, 16, 16, 16, 13, 16, 16, 16, 14, 16, 16, 14, - 12, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 14, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 11, 16, 14, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 14, - 12, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 13, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 10, 14, 13, 16, 16, 16, 16, 16, 14, 16, 12, 16, 16, 16, 16, 14, - 11, 16, 16, 16, 16, 16, 16, 16, 16, 16, 15, 16, 16, 16, 16, 16, - 11, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 11, 16, 16, 16, 16, 16, 16, 16, 14, 16, 16, 16, 14, 16, 16, 14, - 12, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 14, - 13, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 12, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 15, - 11, 16, 16, 16, 16, 16, 16, 16, 14, 16, 16, 16, 16, 16, 16, 13, - 13, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 12, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 10, 15, 14, 16, 16, 16, 16, 16, 16, 16, 14, 16, 16, 16, 16, 14, - 10, 14, 14, 14, 14, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 13, - 10, 14, 16, 16, 13, 16, 16, 16, 14, 16, 16, 16, 12, 16, 16, 14, - 11, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 15, 16, 16, 16, - 11, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 12, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 10, 15, 14, 16, 14, 16, 16, 16, 16, 16, 16, 16, 14, 16, 16, 13, - 10, 15, 14, 16, 15, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 13, - 13, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 11, 14, 14, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 14, - 8, 12, 12, 13, 12, 14, 14, 14, 12, 16, 13, 14, 12, 14, 14, 11, - ], - ], -]; - -const RV34_INTRA_CBP: &'static [[[u8; 16]; 8]; 5] = &[ - [ - [ 0, 3, 3, 4, 3, 5, 5, 5, 2, 5, 4, 6, 4, 6, 6, 6, ], - [ 0, 2, 3, 4, 2, 5, 6, 7, 3, 6, 5, 7, 4, 7, 8, 8, ], - [ 0, 3, 4, 4, 3, 4, 5, 5, 3, 5, 4, 5, 4, 5, 5, 3, ], - [ 0, 3, 3, 4, 3, 4, 5, 5, 3, 5, 4, 6, 3, 5, 6, 5, ], - [ 0, 4, 4, 4, 4, 5, 5, 4, 4, 5, 4, 5, 4, 4, 4, 2, ], - [ 0, 3, 3, 4, 3, 4, 5, 5, 3, 5, 4, 5, 4, 5, 5, 4, ], - [ 0, 6, 6, 5, 6, 5, 6, 4, 6, 6, 5, 4, 4, 4, 4, 1, ], - [ 0, 4, 4, 4, 4, 5, 5, 4, 4, 5, 5, 4, 4, 4, 4, 2, ], - ], [ - [ 0, 4, 3, 4, 3, 4, 5, 4, 3, 5, 4, 5, 3, 5, 5, 5, ], - [ 0, 2, 3, 4, 2, 5, 6, 7, 3, 6, 5, 7, 4, 7, 8, 8, ], - [ 0, 4, 4, 4, 4, 4, 5, 4, 4, 5, 4, 4, 3, 4, 4, 3, ], - [ 0, 3, 3, 4, 3, 4, 5, 5, 3, 5, 4, 6, 3, 5, 6, 5, ], - [ 0, 4, 4, 4, 4, 4, 5, 4, 4, 5, 5, 5, 4, 4, 4, 2, ], - [ 0, 3, 3, 4, 3, 4, 5, 5, 3, 5, 4, 5, 4, 5, 5, 4, ], - [ 0, 5, 6, 5, 5, 5, 6, 4, 6, 6, 5, 4, 5, 4, 4, 1, ], - [ 0, 4, 4, 4, 4, 4, 5, 4, 4, 5, 5, 4, 4, 4, 5, 2, ], - ], [ - [ 0, 3, 3, 4, 3, 4, 4, 5, 3, 5, 4, 5, 4, 5, 5, 5, ], - [ 0, 2, 3, 4, 2, 4, 6, 7, 3, 6, 5, 7, 5, 7, 8, 8, ], - [ 0, 4, 4, 4, 4, 4, 5, 4, 3, 5, 4, 4, 4, 4, 4, 3, ], - [ 0, 3, 3, 4, 3, 3, 6, 6, 3, 6, 4, 6, 3, 6, 6, 5, ], - [ 0, 4, 4, 4, 3, 4, 5, 4, 4, 5, 4, 4, 4, 4, 4, 3, ], - [ 0, 3, 3, 4, 3, 4, 5, 5, 3, 5, 4, 5, 4, 5, 5, 4, ], - [ 0, 5, 5, 5, 5, 5, 6, 4, 5, 6, 5, 5, 5, 4, 4, 1, ], - [ 0, 4, 4, 4, 4, 4, 6, 4, 4, 6, 5, 4, 4, 4, 4, 2, ], - ], [ - [ 0, 3, 3, 4, 3, 4, 4, 5, 3, 5, 4, 5, 4, 5, 5, 5, ], - [ 0, 2, 3, 4, 2, 4, 7, 6, 3, 7, 5, 7, 5, 7, 7, 7, ], - [ 0, 3, 3, 4, 3, 4, 5, 5, 3, 5, 4, 5, 4, 5, 5, 4, ], - [ 0, 3, 3, 3, 3, 4, 6, 6, 3, 6, 4, 6, 3, 6, 6, 5, ], - [ 0, 3, 4, 4, 3, 4, 5, 4, 4, 5, 4, 5, 4, 5, 4, 3, ], - [ 0, 3, 3, 4, 3, 4, 5, 5, 3, 5, 4, 5, 4, 5, 5, 4, ], - [ 0, 4, 5, 4, 4, 4, 5, 4, 4, 5, 5, 4, 4, 4, 4, 2, ], - [ 0, 4, 4, 4, 4, 5, 5, 4, 4, 5, 5, 4, 4, 4, 4, 2, ], - ], [ - [ 0, 3, 3, 4, 3, 4, 5, 6, 2, 5, 4, 7, 4, 6, 6, 7, ], - [ 0, 2, 3, 4, 2, 4, 6, 7, 3, 7, 5, 7, 5, 7, 7, 7, ], - [ 0, 3, 3, 4, 3, 4, 5, 5, 3, 5, 4, 5, 4, 5, 5, 4, ], - [ 0, 2, 3, 4, 3, 4, 6, 5, 3, 6, 4, 6, 4, 6, 6, 6, ], - [ 0, 3, 3, 4, 3, 4, 5, 5, 3, 5, 4, 5, 4, 5, 5, 4, ], - [ 0, 3, 3, 4, 3, 4, 5, 5, 3, 5, 4, 5, 4, 5, 5, 4, ], - [ 0, 4, 4, 4, 4, 5, 5, 4, 4, 5, 5, 4, 4, 4, 4, 2, ], - [ 0, 3, 4, 4, 4, 4, 5, 4, 4, 5, 4, 4, 4, 4, 4, 3, ], - ], -]; - -const RV34_INTRA_FIRSTPAT: &'static [[[u8; 864]; 4]; 5] = &[ - [ - [ - 0, 10, 5, 10, 7, 12, 9, 11, 8, 13, 9, 12, 10, 13, 11, 12, - 16, 16, 14, 15, 15, 16, 13, 14, 5, 12, 6, 11, 9, 13, 10, 11, - 9, 14, 9, 12, 11, 14, 11, 12, 16, 16, 14, 15, 15, 16, 13, 13, - 10, 15, 9, 12, 12, 16, 11, 12, 12, 16, 10, 13, 13, 16, 11, 12, - 16, 16, 13, 14, 15, 16, 13, 12, 6, 12, 8, 11, 8, 12, 10, 11, - 9, 14, 10, 12, 10, 13, 11, 12, 15, 16, 14, 15, 14, 16, 13, 13, - 8, 13, 9, 12, 10, 13, 10, 12, 10, 14, 9, 12, 11, 14, 10, 12, - 15, 16, 13, 15, 14, 16, 13, 13, 11, 16, 10, 13, 13, 16, 11, 12, - 12, 16, 11, 13, 13, 16, 11, 12, 16, 16, 13, 14, 15, 16, 12, 12, - 10, 16, 12, 14, 10, 14, 11, 12, 12, 16, 13, 14, 11, 14, 12, 12, - 16, 16, 15, 16, 14, 15, 13, 13, 11, 16, 12, 14, 11, 14, 11, 12, - 12, 16, 12, 14, 11, 14, 11, 12, 16, 16, 14, 15, 13, 15, 13, 12, - 14, 16, 13, 14, 13, 16, 12, 12, 14, 16, 13, 14, 13, 16, 12, 12, - 16, 16, 14, 14, 14, 15, 12, 11, 2, 10, 6, 10, 7, 12, 9, 11, - 8, 12, 9, 11, 10, 13, 10, 11, 15, 16, 14, 15, 14, 16, 13, 13, - 5, 12, 6, 11, 9, 13, 10, 11, 9, 13, 9, 11, 10, 13, 10, 11, - 15, 16, 13, 14, 14, 16, 13, 13, 9, 15, 8, 12, 12, 15, 11, 11, - 11, 16, 10, 12, 13, 15, 11, 11, 15, 16, 13, 14, 15, 16, 12, 12, - 6, 12, 8, 11, 8, 12, 9, 11, 9, 14, 9, 12, 10, 13, 10, 11, - 15, 16, 14, 15, 14, 16, 13, 13, 7, 13, 8, 11, 9, 13, 10, 11, - 9, 14, 9, 12, 10, 13, 10, 11, 14, 16, 13, 14, 13, 16, 12, 12, - 11, 16, 10, 12, 12, 15, 11, 11, 11, 16, 10, 12, 12, 15, 11, 11, - 15, 16, 12, 13, 14, 16, 12, 11, 9, 15, 11, 13, 9, 13, 11, 12, - 11, 16, 12, 14, 10, 14, 11, 12, 16, 16, 14, 15, 13, 15, 12, 12, - 11, 16, 11, 14, 10, 14, 11, 12, 11, 16, 12, 13, 11, 14, 11, 11, - 15, 16, 14, 15, 13, 14, 12, 12, 13, 16, 12, 14, 13, 15, 11, 11, - 13, 16, 12, 14, 13, 15, 11, 11, 16, 16, 13, 14, 13, 15, 11, 10, - 5, 12, 7, 11, 8, 13, 10, 11, 9, 13, 9, 12, 10, 14, 11, 12, - 16, 16, 14, 15, 14, 16, 13, 13, 7, 13, 7, 11, 9, 13, 10, 11, - 9, 14, 9, 12, 11, 14, 11, 12, 16, 16, 14, 14, 14, 16, 13, 13, - 9, 15, 8, 12, 12, 15, 11, 12, 11, 16, 10, 12, 13, 16, 11, 12, - 16, 16, 13, 14, 15, 16, 12, 12, 7, 13, 8, 12, 9, 13, 10, 11, - 10, 14, 10, 12, 10, 14, 11, 12, 16, 16, 14, 15, 14, 16, 13, 13, - 8, 14, 9, 12, 10, 13, 10, 11, 9, 14, 9, 12, 10, 14, 10, 11, - 15, 16, 13, 14, 14, 16, 12, 12, 11, 16, 10, 12, 12, 15, 11, 12, - 11, 16, 10, 12, 12, 15, 11, 11, 15, 16, 12, 14, 14, 16, 12, 11, - 10, 16, 11, 13, 9, 14, 11, 12, 12, 16, 12, 14, 11, 14, 11, 12, - 16, 16, 14, 16, 14, 15, 13, 12, 11, 16, 11, 14, 10, 14, 11, 12, - 11, 16, 12, 14, 11, 14, 11, 11, 15, 16, 14, 15, 13, 15, 12, 12, - 13, 16, 12, 14, 13, 15, 11, 11, 13, 16, 12, 14, 12, 14, 11, 11, - 15, 16, 12, 13, 13, 14, 11, 10, 6, 13, 8, 11, 9, 13, 10, 11, - 10, 14, 10, 12, 10, 13, 10, 11, 15, 16, 13, 13, 13, 14, 12, 11, - 7, 13, 8, 11, 9, 13, 9, 11, 10, 14, 9, 11, 10, 13, 10, 11, - 15, 16, 13, 13, 13, 14, 11, 11, 9, 14, 8, 11, 10, 13, 9, 10, - 11, 15, 9, 11, 11, 13, 9, 10, 15, 16, 12, 13, 13, 14, 10, 9, - 7, 13, 8, 11, 9, 13, 9, 11, 10, 14, 10, 12, 10, 13, 10, 11, - 15, 16, 13, 13, 13, 14, 11, 11, 8, 13, 8, 11, 9, 13, 9, 10, - 9, 14, 9, 11, 10, 13, 9, 10, 14, 16, 12, 13, 13, 14, 11, 10, - 9, 14, 8, 11, 10, 13, 9, 9, 10, 14, 8, 11, 10, 13, 9, 9, - 14, 16, 11, 12, 12, 14, 10, 9, 9, 14, 9, 12, 8, 12, 9, 10, - 11, 15, 10, 12, 10, 13, 9, 10, 15, 16, 13, 13, 12, 13, 11, 10, - 9, 14, 9, 12, 9, 12, 9, 10, 10, 14, 10, 12, 9, 12, 9, 9, - 14, 16, 12, 13, 11, 13, 10, 9, 10, 14, 9, 11, 10, 12, 8, 8, - 10, 14, 9, 11, 10, 12, 8, 8, 12, 14, 9, 10, 10, 11, 8, 7, - ], [ - 0, 9, 6, 9, 6, 10, 8, 9, 7, 11, 8, 11, 9, 11, 9, 10, - 14, 16, 13, 14, 13, 14, 12, 11, 5, 11, 7, 10, 8, 10, 8, 9, - 8, 12, 8, 11, 9, 12, 9, 10, 14, 16, 12, 13, 13, 14, 11, 11, - 10, 14, 9, 11, 11, 13, 10, 10, 11, 15, 9, 11, 12, 13, 10, 10, - 15, 16, 12, 12, 13, 14, 11, 9, 6, 11, 7, 10, 7, 10, 8, 9, - 8, 12, 9, 11, 9, 11, 9, 10, 14, 16, 13, 13, 13, 14, 11, 11, - 7, 12, 8, 11, 8, 11, 9, 9, 9, 13, 9, 11, 9, 12, 9, 10, - 14, 16, 12, 13, 12, 14, 11, 10, 11, 14, 10, 12, 11, 13, 10, 10, - 12, 15, 10, 12, 12, 13, 10, 10, 15, 16, 12, 12, 13, 14, 10, 9, - 10, 14, 11, 13, 9, 12, 10, 10, 11, 15, 12, 13, 10, 12, 10, 10, - 14, 16, 13, 14, 12, 13, 11, 10, 11, 14, 11, 13, 10, 12, 10, 10, - 12, 15, 11, 13, 10, 12, 10, 10, 15, 16, 13, 13, 12, 13, 11, 9, - 13, 16, 12, 13, 12, 13, 10, 9, 14, 16, 12, 13, 12, 13, 10, 9, - 16, 16, 12, 12, 13, 13, 10, 7, 4, 10, 6, 9, 7, 10, 8, 9, - 8, 12, 9, 11, 9, 11, 9, 9, 14, 16, 13, 13, 13, 14, 11, 11, - 6, 11, 7, 10, 8, 11, 8, 9, 9, 12, 9, 11, 9, 12, 9, 9, - 14, 16, 12, 13, 13, 14, 11, 10, 10, 14, 9, 11, 11, 13, 9, 9, - 11, 14, 9, 11, 11, 13, 10, 9, 14, 16, 11, 12, 13, 14, 10, 9, - 6, 11, 8, 10, 7, 10, 8, 9, 9, 12, 9, 11, 9, 11, 9, 9, - 14, 16, 13, 13, 12, 13, 11, 10, 8, 12, 8, 10, 8, 11, 9, 9, - 9, 12, 9, 11, 9, 11, 9, 9, 14, 16, 12, 13, 12, 13, 11, 10, - 11, 14, 10, 11, 11, 13, 9, 9, 11, 14, 10, 11, 11, 13, 9, 9, - 14, 16, 11, 12, 13, 14, 10, 8, 10, 14, 11, 12, 9, 12, 10, 10, - 11, 14, 11, 13, 10, 12, 10, 10, 14, 16, 13, 14, 12, 13, 11, 9, - 11, 14, 11, 12, 10, 12, 10, 10, 11, 14, 11, 12, 10, 12, 10, 9, - 14, 16, 13, 13, 11, 12, 10, 9, 13, 16, 12, 13, 12, 13, 10, 9, - 13, 16, 11, 12, 11, 13, 10, 8, 15, 16, 12, 12, 12, 12, 9, 7, - 8, 12, 8, 11, 9, 12, 9, 10, 10, 14, 10, 12, 11, 13, 10, 10, - 16, 16, 14, 14, 14, 14, 12, 11, 8, 13, 8, 11, 9, 12, 10, 10, - 11, 14, 10, 12, 11, 13, 10, 10, 16, 16, 13, 14, 14, 14, 12, 11, - 11, 14, 9, 12, 11, 13, 10, 10, 12, 15, 10, 12, 12, 14, 10, 10, - 15, 16, 12, 12, 14, 14, 11, 9, 9, 13, 9, 11, 9, 12, 10, 10, - 11, 14, 10, 12, 10, 12, 10, 10, 15, 16, 14, 14, 13, 14, 12, 11, - 9, 13, 9, 11, 10, 12, 10, 10, 10, 14, 10, 12, 10, 12, 10, 10, - 15, 16, 13, 13, 13, 14, 11, 10, 11, 15, 10, 12, 11, 13, 10, 10, - 11, 15, 10, 12, 12, 13, 10, 9, 15, 16, 11, 12, 13, 14, 10, 9, - 11, 15, 11, 13, 10, 12, 10, 10, 12, 16, 12, 13, 11, 13, 10, 10, - 16, 16, 14, 14, 12, 13, 11, 9, 11, 15, 11, 13, 10, 13, 10, 10, - 12, 15, 12, 13, 10, 12, 10, 10, 14, 16, 13, 13, 12, 13, 10, 9, - 13, 16, 12, 13, 12, 13, 10, 9, 13, 16, 11, 12, 11, 13, 10, 9, - 14, 16, 11, 12, 12, 12, 9, 7, 10, 15, 10, 12, 11, 13, 10, 10, - 12, 16, 12, 13, 12, 13, 11, 10, 16, 16, 14, 14, 14, 15, 12, 10, - 10, 14, 10, 12, 10, 13, 10, 10, 12, 15, 11, 12, 11, 13, 10, 10, - 16, 16, 14, 13, 14, 14, 11, 9, 11, 14, 10, 11, 11, 12, 9, 9, - 12, 15, 10, 11, 11, 13, 9, 8, 16, 16, 12, 12, 13, 13, 10, 7, - 10, 15, 10, 12, 10, 13, 10, 10, 12, 15, 11, 12, 11, 13, 10, 10, - 16, 16, 14, 13, 14, 14, 11, 9, 10, 14, 10, 12, 10, 12, 10, 10, - 12, 15, 11, 12, 11, 13, 10, 10, 16, 16, 13, 13, 13, 14, 11, 9, - 11, 14, 10, 11, 10, 12, 9, 8, 11, 14, 9, 11, 11, 12, 9, 8, - 14, 16, 10, 11, 12, 13, 9, 7, 11, 15, 11, 12, 10, 12, 10, 9, - 13, 16, 11, 12, 11, 12, 10, 9, 16, 16, 13, 13, 12, 13, 10, 7, - 11, 15, 10, 12, 10, 12, 9, 8, 12, 15, 11, 12, 10, 12, 9, 8, - 14, 16, 12, 12, 11, 12, 9, 7, 11, 14, 10, 11, 10, 12, 8, 7, - 11, 14, 9, 10, 10, 11, 8, 6, 12, 15, 9, 9, 9, 10, 7, 4, - ], [ - 0, 6, 3, 7, 3, 7, 6, 7, 5, 9, 6, 9, 7, 9, 8, 8, - 16, 16, 16, 16, 16, 16, 16, 11, 3, 8, 5, 8, 6, 8, 7, 7, - 7, 11, 7, 10, 8, 10, 8, 9, 16, 16, 16, 16, 16, 16, 14, 10, - 8, 16, 7, 11, 10, 16, 9, 9, 11, 16, 9, 14, 16, 16, 10, 9, - 16, 16, 16, 16, 16, 16, 16, 10, 3, 8, 5, 8, 5, 8, 7, 7, - 7, 11, 8, 10, 8, 10, 8, 9, 16, 16, 16, 16, 16, 16, 16, 11, - 6, 10, 7, 9, 7, 10, 8, 8, 8, 11, 8, 10, 8, 11, 8, 8, - 16, 16, 16, 16, 16, 16, 11, 10, 10, 16, 9, 13, 11, 16, 10, 9, - 11, 16, 9, 11, 16, 16, 10, 9, 16, 16, 11, 16, 16, 16, 11, 9, - 9, 16, 10, 11, 8, 11, 9, 9, 11, 16, 12, 16, 10, 16, 10, 10, - 16, 16, 16, 16, 16, 16, 16, 10, 10, 16, 11, 16, 10, 16, 10, 10, - 11, 16, 11, 16, 10, 16, 10, 9, 16, 16, 16, 16, 16, 16, 11, 9, - 16, 16, 16, 16, 16, 16, 11, 9, 16, 16, 16, 16, 16, 16, 11, 9, - 16, 16, 11, 16, 16, 16, 9, 7, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - ], [ - 2, 8, 5, 9, 6, 9, 8, 8, 8, 12, 9, 11, 9, 11, 10, 10, - 16, 16, 14, 16, 14, 16, 14, 12, 5, 10, 6, 9, 8, 10, 8, 9, - 9, 12, 9, 11, 10, 12, 10, 10, 16, 16, 14, 15, 15, 16, 13, 12, - 10, 13, 9, 12, 11, 12, 10, 10, 12, 15, 11, 12, 12, 13, 11, 10, - 16, 16, 15, 14, 15, 16, 13, 12, 6, 10, 8, 10, 7, 10, 8, 9, - 9, 13, 10, 11, 10, 12, 10, 10, 16, 16, 14, 16, 14, 16, 13, 12, - 7, 11, 8, 11, 9, 11, 9, 9, 10, 13, 10, 11, 10, 12, 10, 9, - 16, 16, 14, 14, 14, 15, 12, 11, 11, 14, 11, 12, 11, 13, 10, 10, - 12, 15, 11, 13, 12, 13, 11, 10, 16, 16, 14, 16, 15, 15, 13, 11, - 10, 13, 11, 12, 10, 12, 10, 10, 12, 15, 12, 13, 11, 13, 11, 11, - 16, 16, 15, 16, 14, 15, 13, 11, 11, 14, 11, 13, 11, 12, 11, 10, - 12, 16, 12, 13, 12, 13, 11, 10, 16, 16, 15, 16, 13, 15, 12, 11, - 13, 15, 12, 13, 13, 14, 11, 11, 14, 16, 13, 13, 13, 14, 11, 11, - 16, 16, 15, 14, 15, 15, 12, 10, 3, 8, 6, 9, 7, 9, 8, 8, - 8, 12, 9, 11, 9, 11, 9, 9, 16, 16, 15, 15, 15, 16, 13, 12, - 6, 10, 7, 9, 8, 10, 8, 8, 9, 12, 9, 11, 10, 12, 10, 9, - 16, 16, 14, 14, 14, 15, 13, 11, 10, 13, 9, 11, 11, 12, 10, 10, - 12, 14, 11, 12, 12, 13, 11, 10, 16, 16, 14, 14, 15, 15, 13, 11, - 6, 10, 8, 10, 7, 10, 8, 9, 10, 12, 10, 11, 10, 11, 10, 9, - 16, 16, 14, 15, 14, 15, 13, 11, 8, 11, 8, 10, 9, 11, 9, 9, - 9, 13, 9, 11, 10, 11, 9, 9, 16, 16, 13, 14, 14, 14, 12, 10, - 11, 14, 10, 12, 11, 12, 10, 10, 12, 14, 11, 12, 12, 13, 10, 10, - 16, 16, 13, 14, 15, 15, 12, 10, 10, 13, 11, 12, 10, 12, 10, 10, - 12, 14, 12, 13, 11, 13, 11, 10, 16, 16, 15, 14, 14, 14, 12, 11, - 11, 14, 11, 12, 10, 12, 10, 10, 12, 15, 12, 12, 11, 13, 10, 10, - 16, 16, 14, 15, 13, 14, 12, 10, 13, 15, 12, 13, 12, 13, 11, 10, - 13, 16, 12, 13, 12, 13, 11, 10, 16, 16, 13, 14, 13, 15, 11, 9, - 6, 10, 8, 10, 8, 11, 9, 10, 11, 13, 11, 12, 11, 13, 11, 10, - 16, 16, 16, 16, 16, 16, 13, 12, 8, 11, 9, 11, 9, 11, 10, 10, - 11, 14, 11, 12, 11, 12, 11, 10, 16, 16, 15, 15, 16, 16, 13, 12, - 11, 14, 10, 12, 12, 13, 11, 10, 13, 16, 12, 13, 13, 14, 11, 11, - 16, 16, 15, 16, 16, 16, 13, 12, 8, 12, 9, 11, 9, 11, 10, 10, - 11, 14, 11, 12, 11, 12, 11, 10, 16, 16, 16, 16, 16, 16, 13, 12, - 9, 12, 10, 11, 10, 12, 10, 10, 11, 14, 11, 12, 11, 13, 10, 10, - 16, 16, 15, 14, 15, 15, 13, 11, 12, 14, 11, 13, 12, 13, 11, 10, - 12, 15, 11, 12, 13, 13, 11, 10, 16, 16, 14, 15, 16, 15, 13, 11, - 11, 15, 12, 13, 11, 13, 11, 10, 13, 16, 13, 14, 12, 14, 11, 11, - 16, 16, 16, 16, 15, 15, 13, 12, 12, 14, 12, 13, 11, 13, 11, 10, - 13, 15, 12, 13, 11, 13, 11, 10, 16, 16, 15, 15, 13, 15, 13, 11, - 13, 16, 13, 13, 13, 13, 12, 11, 13, 16, 13, 13, 13, 13, 11, 10, - 16, 16, 13, 15, 14, 14, 12, 9, 9, 13, 10, 12, 11, 13, 11, 11, - 13, 16, 13, 14, 13, 14, 12, 11, 16, 16, 16, 16, 16, 16, 14, 12, - 10, 14, 11, 13, 11, 13, 11, 10, 13, 16, 13, 13, 13, 14, 12, 11, - 16, 16, 16, 16, 16, 16, 14, 12, 11, 15, 11, 13, 12, 13, 11, 10, - 14, 16, 12, 13, 13, 14, 12, 10, 16, 16, 15, 16, 16, 16, 13, 11, - 10, 14, 11, 12, 11, 13, 11, 10, 13, 16, 12, 13, 12, 14, 12, 11, - 16, 16, 16, 16, 16, 16, 14, 12, 11, 14, 11, 12, 11, 13, 11, 10, - 13, 15, 12, 13, 12, 13, 11, 10, 16, 16, 15, 15, 16, 16, 13, 11, - 12, 15, 12, 13, 12, 13, 11, 10, 13, 16, 12, 13, 13, 13, 11, 10, - 16, 16, 14, 14, 16, 15, 13, 10, 12, 15, 12, 13, 12, 13, 11, 10, - 14, 16, 13, 14, 13, 14, 12, 11, 16, 16, 16, 16, 15, 16, 13, 11, - 12, 16, 12, 13, 12, 13, 11, 10, 13, 16, 13, 13, 12, 14, 11, 10, - 16, 16, 15, 16, 14, 15, 13, 10, 12, 15, 12, 14, 12, 13, 11, 10, - 13, 16, 12, 13, 12, 13, 11, 10, 16, 16, 13, 14, 13, 14, 11, 8, - ], - ], [ - [ - 0, 11, 5, 11, 7, 13, 10, 12, 7, 13, 9, 13, 10, 14, 12, 13, - 16, 16, 15, 16, 16, 16, 15, 15, 4, 13, 6, 12, 10, 14, 11, 12, - 8, 14, 9, 13, 11, 15, 12, 13, 16, 16, 15, 16, 15, 16, 15, 14, - 9, 16, 9, 13, 13, 16, 12, 13, 12, 16, 10, 14, 14, 16, 13, 13, - 16, 16, 14, 16, 16, 16, 14, 14, 5, 13, 8, 13, 8, 13, 11, 12, - 9, 14, 10, 13, 10, 14, 12, 13, 16, 16, 15, 16, 15, 16, 14, 15, - 7, 14, 9, 13, 10, 14, 11, 13, 9, 15, 10, 13, 11, 14, 12, 13, - 16, 16, 14, 16, 15, 16, 14, 14, 11, 16, 11, 14, 13, 16, 12, 13, - 12, 16, 11, 14, 14, 16, 12, 13, 16, 16, 14, 15, 16, 16, 14, 13, - 10, 16, 12, 15, 10, 15, 12, 14, 12, 16, 13, 16, 11, 15, 13, 14, - 16, 16, 16, 16, 14, 16, 14, 14, 11, 16, 12, 15, 11, 16, 12, 13, - 12, 16, 13, 15, 12, 16, 12, 13, 16, 16, 16, 16, 14, 16, 14, 14, - 14, 16, 13, 15, 14, 16, 13, 13, 14, 16, 14, 15, 14, 16, 13, 13, - 16, 16, 15, 16, 15, 16, 13, 13, 2, 12, 6, 11, 7, 13, 10, 12, - 7, 13, 9, 12, 10, 14, 11, 12, 16, 16, 15, 16, 15, 16, 14, 15, - 5, 13, 6, 12, 9, 13, 10, 12, 8, 14, 9, 13, 11, 14, 11, 13, - 16, 16, 14, 16, 15, 16, 14, 14, 9, 16, 8, 13, 12, 16, 11, 13, - 11, 16, 10, 13, 13, 16, 12, 13, 16, 16, 13, 15, 16, 16, 13, 13, - 5, 13, 8, 12, 7, 13, 10, 12, 8, 14, 10, 13, 10, 14, 11, 13, - 16, 16, 14, 16, 15, 16, 14, 14, 7, 14, 8, 12, 9, 14, 11, 12, - 8, 14, 9, 13, 10, 14, 11, 12, 15, 16, 14, 15, 14, 16, 13, 14, - 11, 16, 10, 13, 13, 16, 12, 13, 11, 16, 10, 13, 13, 16, 12, 13, - 16, 16, 13, 15, 15, 16, 13, 13, 9, 16, 12, 15, 9, 14, 11, 13, - 11, 16, 13, 15, 11, 14, 12, 13, 16, 16, 15, 16, 14, 16, 14, 14, - 11, 16, 12, 14, 11, 15, 12, 13, 11, 16, 12, 14, 11, 15, 12, 13, - 16, 16, 15, 16, 14, 16, 13, 13, 13, 16, 13, 15, 13, 16, 12, 13, - 14, 16, 13, 15, 13, 16, 12, 12, 16, 16, 14, 15, 14, 16, 12, 12, - 4, 13, 7, 12, 8, 14, 11, 12, 9, 14, 10, 13, 11, 14, 12, 13, - 16, 16, 15, 16, 16, 16, 15, 15, 6, 14, 7, 12, 10, 14, 11, 12, - 9, 15, 10, 13, 11, 15, 12, 13, 16, 16, 15, 16, 16, 16, 14, 14, - 9, 16, 8, 13, 12, 16, 11, 13, 12, 16, 10, 14, 13, 16, 12, 13, - 16, 16, 14, 16, 16, 16, 14, 14, 6, 14, 8, 13, 8, 14, 11, 13, - 9, 15, 10, 13, 11, 14, 12, 13, 16, 16, 15, 16, 16, 16, 14, 14, - 7, 15, 9, 13, 10, 14, 11, 13, 9, 15, 10, 13, 11, 14, 11, 13, - 16, 16, 14, 16, 15, 16, 14, 14, 10, 16, 10, 13, 12, 16, 12, 13, - 11, 16, 10, 13, 13, 16, 12, 13, 16, 16, 13, 14, 15, 16, 13, 13, - 9, 16, 12, 14, 9, 14, 11, 13, 12, 16, 12, 15, 11, 15, 12, 13, - 16, 16, 16, 16, 15, 16, 14, 14, 10, 16, 12, 15, 11, 15, 12, 13, - 11, 16, 12, 14, 11, 15, 12, 13, 16, 16, 14, 16, 13, 16, 13, 13, - 13, 16, 13, 15, 13, 16, 12, 13, 13, 16, 12, 14, 13, 16, 12, 12, - 15, 16, 13, 14, 13, 16, 12, 12, 6, 14, 8, 13, 9, 14, 10, 12, - 10, 15, 10, 12, 11, 14, 11, 12, 16, 16, 14, 14, 14, 16, 13, 13, - 7, 15, 8, 13, 9, 14, 10, 12, 10, 15, 10, 13, 11, 14, 11, 12, - 16, 16, 14, 14, 14, 16, 13, 12, 9, 16, 8, 12, 11, 14, 10, 11, - 11, 16, 10, 13, 11, 14, 10, 11, 16, 16, 13, 14, 14, 16, 12, 11, - 7, 14, 9, 13, 9, 14, 10, 12, 10, 16, 10, 13, 11, 14, 11, 12, - 16, 16, 14, 14, 14, 15, 13, 12, 7, 14, 9, 13, 9, 14, 10, 12, - 9, 14, 10, 12, 10, 14, 11, 12, 15, 16, 13, 14, 14, 15, 12, 12, - 9, 15, 9, 12, 11, 14, 10, 11, 10, 15, 9, 12, 11, 14, 10, 11, - 14, 16, 11, 13, 13, 15, 11, 11, 9, 16, 10, 13, 9, 14, 10, 11, - 11, 16, 11, 13, 10, 14, 10, 11, 16, 16, 14, 15, 13, 15, 12, 12, - 9, 16, 10, 13, 9, 13, 10, 11, 10, 15, 10, 13, 10, 13, 10, 11, - 14, 16, 13, 14, 12, 14, 11, 11, 11, 16, 10, 13, 11, 13, 9, 10, - 11, 14, 10, 12, 10, 13, 9, 9, 13, 15, 10, 11, 11, 12, 9, 8, - ], [ - 0, 10, 5, 10, 6, 11, 8, 10, 7, 12, 8, 11, 9, 12, 9, 10, - 14, 16, 13, 13, 13, 14, 12, 11, 5, 12, 6, 10, 8, 12, 9, 10, - 8, 13, 8, 11, 9, 12, 9, 10, 14, 16, 12, 13, 13, 14, 11, 11, - 9, 15, 8, 12, 11, 14, 10, 10, 11, 16, 9, 12, 12, 14, 10, 10, - 14, 16, 11, 12, 13, 14, 11, 10, 5, 12, 8, 11, 7, 11, 9, 10, - 8, 13, 9, 11, 9, 12, 9, 10, 14, 16, 12, 13, 13, 14, 11, 11, - 7, 13, 8, 11, 9, 12, 9, 10, 9, 13, 9, 11, 9, 12, 9, 10, - 14, 16, 12, 13, 12, 13, 11, 10, 11, 15, 10, 12, 12, 14, 10, 10, - 12, 16, 10, 12, 12, 14, 10, 10, 14, 16, 11, 12, 13, 14, 10, 9, - 10, 15, 11, 13, 9, 13, 10, 10, 11, 15, 12, 13, 10, 12, 10, 10, - 14, 16, 13, 14, 12, 13, 11, 10, 11, 16, 11, 13, 10, 13, 10, 10, - 11, 16, 11, 13, 10, 13, 10, 10, 14, 16, 13, 14, 12, 13, 11, 9, - 13, 16, 12, 13, 12, 14, 11, 10, 14, 16, 12, 13, 12, 14, 10, 9, - 16, 16, 12, 13, 13, 13, 10, 8, 3, 11, 6, 10, 7, 11, 9, 10, - 8, 12, 8, 11, 9, 12, 9, 10, 14, 16, 13, 13, 13, 14, 11, 11, - 5, 12, 6, 10, 8, 12, 9, 10, 8, 13, 8, 11, 9, 12, 9, 10, - 14, 16, 12, 13, 13, 14, 11, 10, 9, 14, 8, 11, 11, 14, 10, 10, - 11, 15, 9, 11, 12, 14, 10, 10, 14, 16, 11, 12, 13, 14, 11, 9, - 6, 12, 8, 11, 7, 11, 9, 10, 8, 13, 9, 11, 9, 12, 9, 10, - 14, 16, 12, 13, 13, 13, 11, 10, 7, 13, 8, 11, 8, 12, 9, 10, - 9, 13, 9, 11, 9, 12, 9, 9, 14, 16, 12, 13, 12, 13, 11, 10, - 10, 15, 9, 12, 11, 14, 10, 10, 11, 15, 9, 11, 11, 13, 10, 9, - 14, 16, 11, 12, 13, 14, 10, 9, 9, 15, 11, 13, 9, 12, 10, 10, - 11, 15, 11, 13, 9, 12, 10, 10, 14, 16, 13, 14, 12, 13, 11, 10, - 10, 15, 11, 13, 10, 13, 10, 10, 11, 15, 11, 13, 10, 12, 10, 10, - 14, 16, 12, 13, 11, 12, 10, 9, 13, 16, 12, 13, 12, 14, 10, 9, - 13, 16, 11, 12, 12, 13, 10, 9, 14, 16, 11, 12, 12, 13, 9, 8, - 7, 13, 8, 12, 9, 13, 10, 11, 10, 14, 10, 12, 11, 13, 11, 11, - 16, 16, 13, 14, 14, 14, 12, 11, 8, 14, 8, 12, 9, 13, 10, 10, - 10, 14, 10, 12, 11, 13, 10, 10, 16, 16, 13, 13, 14, 14, 12, 11, - 10, 15, 9, 12, 11, 14, 10, 10, 12, 16, 10, 12, 12, 14, 10, 10, - 16, 16, 12, 13, 14, 15, 11, 10, 8, 14, 9, 12, 9, 13, 10, 11, - 10, 15, 10, 12, 10, 13, 10, 11, 16, 16, 13, 14, 14, 14, 12, 11, - 8, 14, 9, 12, 9, 13, 10, 10, 10, 14, 10, 12, 10, 13, 10, 10, - 15, 16, 13, 13, 13, 14, 11, 10, 10, 15, 10, 12, 12, 14, 10, 10, - 11, 16, 9, 12, 12, 14, 10, 10, 14, 16, 11, 12, 13, 14, 10, 9, - 11, 16, 11, 13, 10, 13, 10, 10, 12, 16, 12, 13, 10, 13, 11, 10, - 15, 16, 14, 14, 12, 13, 11, 10, 11, 16, 11, 13, 10, 13, 10, 10, - 11, 16, 12, 13, 10, 12, 10, 10, 14, 16, 13, 14, 11, 13, 11, 9, - 13, 16, 12, 13, 12, 14, 10, 10, 12, 16, 11, 12, 12, 13, 10, 9, - 14, 16, 11, 12, 11, 12, 9, 8, 10, 16, 10, 13, 11, 14, 11, 11, - 12, 16, 11, 13, 12, 14, 11, 11, 16, 16, 14, 13, 14, 14, 12, 10, - 10, 15, 10, 13, 10, 13, 10, 11, 12, 16, 11, 13, 11, 13, 11, 10, - 16, 16, 14, 13, 14, 14, 12, 10, 11, 15, 9, 12, 11, 13, 10, 9, - 12, 16, 10, 12, 12, 13, 10, 9, 16, 16, 12, 12, 13, 14, 10, 8, - 10, 16, 10, 13, 10, 14, 11, 11, 12, 16, 11, 13, 12, 14, 11, 10, - 16, 16, 14, 13, 14, 14, 12, 10, 9, 15, 9, 12, 10, 13, 10, 10, - 11, 16, 10, 12, 11, 13, 10, 10, 16, 16, 13, 13, 13, 14, 11, 9, - 10, 15, 9, 11, 11, 13, 9, 9, 11, 15, 9, 11, 11, 13, 9, 8, - 14, 16, 10, 11, 13, 13, 10, 8, 11, 16, 11, 13, 10, 13, 10, 9, - 13, 16, 11, 13, 11, 13, 10, 9, 16, 16, 13, 13, 13, 13, 10, 8, - 11, 16, 10, 12, 10, 13, 10, 9, 11, 16, 11, 12, 10, 12, 9, 9, - 15, 16, 12, 13, 11, 12, 10, 8, 11, 16, 10, 12, 11, 12, 9, 8, - 11, 15, 9, 11, 10, 12, 9, 7, 13, 15, 9, 9, 10, 10, 7, 5, - ], [ - 0, 7, 3, 8, 4, 9, 7, 8, 5, 10, 7, 10, 8, 11, 8, 9, - 16, 16, 16, 16, 16, 16, 11, 10, 2, 10, 4, 9, 7, 10, 7, 8, - 7, 16, 7, 10, 9, 16, 8, 9, 16, 16, 16, 16, 16, 16, 11, 10, - 8, 16, 7, 10, 10, 16, 9, 8, 10, 16, 9, 11, 16, 16, 9, 9, - 16, 16, 16, 16, 16, 16, 11, 9, 3, 10, 6, 9, 6, 11, 8, 8, - 7, 16, 8, 10, 9, 16, 9, 9, 16, 16, 16, 16, 16, 16, 11, 10, - 5, 16, 7, 10, 8, 11, 8, 8, 8, 16, 8, 10, 9, 16, 8, 8, - 16, 16, 11, 16, 16, 16, 10, 9, 9, 16, 9, 11, 11, 16, 9, 9, - 11, 16, 9, 11, 11, 16, 9, 8, 16, 16, 10, 16, 16, 16, 10, 9, - 8, 16, 10, 16, 8, 16, 10, 9, 12, 16, 11, 16, 10, 16, 10, 9, - 16, 16, 16, 16, 16, 16, 12, 10, 10, 16, 11, 16, 10, 16, 10, 9, - 11, 16, 11, 16, 10, 16, 10, 9, 16, 16, 16, 16, 16, 16, 11, 9, - 16, 16, 16, 16, 16, 16, 10, 9, 16, 16, 11, 16, 16, 16, 10, 9, - 16, 16, 10, 11, 11, 16, 9, 7, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - ], [ - 2, 9, 6, 9, 6, 10, 8, 9, 8, 12, 9, 11, 9, 12, 10, 10, - 16, 16, 14, 14, 15, 15, 13, 12, 5, 11, 7, 10, 8, 11, 9, 9, - 9, 13, 9, 11, 10, 12, 10, 10, 15, 16, 14, 14, 14, 16, 12, 11, - 10, 14, 9, 11, 11, 13, 10, 10, 12, 15, 10, 12, 12, 13, 11, 10, - 16, 16, 14, 15, 14, 15, 12, 11, 5, 11, 8, 10, 7, 11, 9, 9, - 9, 13, 9, 12, 9, 12, 10, 10, 15, 16, 13, 14, 13, 16, 12, 11, - 7, 12, 8, 11, 9, 11, 9, 10, 9, 13, 9, 11, 10, 12, 9, 9, - 16, 16, 13, 14, 13, 14, 11, 11, 10, 14, 10, 12, 11, 13, 10, 10, - 11, 16, 11, 12, 12, 13, 10, 10, 16, 16, 13, 14, 13, 14, 12, 11, - 10, 14, 11, 13, 10, 13, 10, 11, 12, 16, 12, 13, 10, 12, 11, 11, - 16, 16, 14, 15, 13, 14, 12, 11, 11, 15, 11, 13, 11, 13, 10, 10, - 12, 15, 12, 13, 11, 13, 11, 10, 15, 16, 14, 15, 13, 15, 12, 11, - 12, 16, 12, 13, 12, 14, 11, 11, 13, 16, 12, 13, 12, 14, 11, 10, - 16, 16, 13, 14, 13, 14, 11, 10, 3, 10, 6, 9, 7, 10, 8, 9, - 9, 12, 9, 11, 10, 12, 9, 10, 15, 16, 14, 14, 14, 14, 12, 11, - 6, 11, 7, 10, 8, 10, 9, 9, 9, 13, 9, 11, 10, 12, 9, 9, - 15, 16, 13, 14, 14, 15, 12, 11, 10, 14, 9, 11, 11, 12, 10, 10, - 12, 14, 10, 12, 11, 13, 10, 10, 15, 16, 13, 14, 14, 16, 12, 11, - 6, 11, 8, 10, 7, 11, 9, 9, 9, 13, 9, 11, 9, 12, 9, 9, - 15, 16, 14, 14, 13, 14, 12, 11, 7, 11, 8, 11, 8, 11, 9, 9, - 9, 12, 9, 11, 9, 12, 9, 9, 15, 16, 13, 13, 13, 14, 11, 10, - 10, 13, 10, 12, 11, 13, 10, 10, 11, 15, 10, 12, 11, 13, 10, 10, - 14, 16, 12, 13, 13, 14, 11, 10, 10, 14, 11, 12, 9, 12, 10, 10, - 11, 15, 11, 13, 10, 13, 10, 10, 15, 16, 14, 14, 13, 14, 12, 11, - 10, 14, 10, 12, 10, 12, 10, 10, 11, 15, 11, 12, 10, 12, 10, 10, - 15, 16, 13, 14, 12, 14, 11, 10, 12, 16, 11, 13, 12, 14, 11, 10, - 12, 16, 12, 13, 11, 13, 10, 10, 15, 16, 12, 14, 12, 14, 11, 9, - 7, 12, 9, 11, 9, 12, 10, 10, 11, 14, 11, 12, 11, 13, 11, 11, - 16, 16, 15, 16, 15, 16, 13, 12, 8, 12, 9, 11, 9, 12, 10, 10, - 11, 14, 11, 12, 11, 13, 10, 10, 16, 16, 14, 15, 15, 16, 13, 12, - 11, 14, 10, 12, 11, 13, 10, 10, 12, 16, 11, 13, 12, 14, 11, 10, - 16, 16, 14, 15, 14, 16, 12, 11, 8, 13, 9, 11, 9, 12, 10, 10, - 11, 14, 11, 12, 11, 13, 10, 10, 16, 16, 15, 15, 14, 15, 13, 12, - 9, 13, 9, 12, 9, 12, 10, 10, 11, 14, 10, 12, 10, 12, 10, 10, - 16, 16, 14, 15, 14, 14, 12, 11, 11, 15, 11, 12, 11, 13, 11, 10, - 12, 16, 11, 12, 12, 13, 11, 10, 16, 16, 13, 15, 14, 15, 11, 11, - 11, 16, 11, 13, 10, 13, 11, 11, 12, 16, 12, 14, 11, 13, 11, 11, - 16, 16, 14, 15, 14, 15, 13, 11, 11, 16, 11, 13, 11, 13, 11, 10, - 12, 16, 12, 13, 10, 13, 11, 10, 16, 16, 14, 14, 12, 14, 12, 10, - 12, 16, 12, 14, 12, 14, 11, 11, 13, 16, 12, 14, 12, 14, 11, 10, - 15, 16, 12, 14, 12, 14, 11, 9, 9, 14, 11, 13, 11, 13, 11, 11, - 13, 16, 12, 14, 13, 14, 12, 11, 16, 16, 16, 16, 16, 16, 14, 12, - 9, 14, 10, 12, 10, 13, 11, 11, 12, 16, 12, 13, 13, 14, 11, 11, - 16, 16, 16, 16, 16, 14, 13, 12, 10, 15, 11, 13, 11, 14, 11, 10, - 13, 16, 12, 13, 12, 15, 11, 10, 16, 16, 14, 16, 15, 16, 13, 11, - 10, 14, 10, 13, 11, 14, 11, 11, 13, 16, 12, 13, 12, 14, 11, 11, - 16, 16, 16, 16, 15, 16, 13, 12, 10, 14, 10, 12, 10, 13, 10, 11, - 12, 15, 12, 13, 12, 13, 11, 10, 16, 16, 14, 14, 15, 15, 13, 11, - 11, 16, 11, 13, 11, 14, 11, 10, 12, 16, 11, 13, 12, 14, 11, 10, - 16, 16, 13, 14, 14, 15, 12, 10, 11, 16, 12, 13, 11, 14, 11, 10, - 13, 16, 13, 14, 12, 14, 11, 11, 16, 16, 15, 16, 15, 15, 12, 11, - 11, 16, 12, 13, 11, 14, 11, 10, 13, 16, 12, 13, 11, 14, 11, 10, - 16, 16, 14, 15, 13, 14, 12, 10, 12, 16, 12, 14, 12, 14, 10, 10, - 12, 16, 11, 13, 11, 14, 10, 10, 14, 16, 11, 13, 12, 13, 10, 8, - ], - ], [ - [ - 0, 12, 6, 13, 7, 14, 11, 14, 8, 14, 10, 14, 11, 15, 13, 15, - 16, 16, 16, 16, 16, 16, 16, 16, 5, 14, 7, 13, 10, 16, 12, 14, - 9, 16, 10, 14, 12, 16, 13, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 10, 16, 9, 14, 14, 16, 13, 16, 12, 16, 11, 16, 16, 16, 14, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 5, 14, 9, 14, 8, 14, 12, 14, - 9, 16, 11, 14, 11, 16, 13, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 8, 16, 10, 14, 11, 16, 12, 14, 10, 16, 11, 15, 12, 16, 13, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 12, 16, 12, 16, 14, 16, 14, 16, - 13, 16, 12, 16, 15, 16, 14, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 10, 16, 13, 16, 11, 16, 14, 16, 13, 16, 14, 16, 13, 16, 14, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 12, 16, 14, 16, 13, 16, 14, 16, - 13, 16, 14, 16, 13, 16, 14, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 14, 16, 16, 16, 15, 16, 16, 16, 14, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 1, 12, 6, 12, 8, 14, 11, 13, - 8, 14, 10, 13, 11, 14, 13, 14, 16, 16, 16, 16, 16, 16, 16, 16, - 5, 14, 7, 13, 10, 14, 11, 14, 9, 16, 10, 14, 12, 16, 13, 15, - 16, 16, 16, 16, 16, 16, 16, 16, 9, 16, 9, 14, 13, 16, 13, 14, - 12, 16, 11, 15, 14, 16, 13, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 5, 14, 9, 13, 8, 14, 12, 14, 9, 16, 11, 14, 11, 16, 13, 14, - 16, 16, 16, 16, 16, 16, 16, 16, 7, 15, 9, 14, 10, 16, 12, 14, - 9, 16, 10, 14, 11, 16, 12, 14, 16, 16, 16, 16, 16, 16, 15, 16, - 11, 16, 11, 15, 14, 16, 13, 15, 12, 16, 11, 15, 14, 16, 13, 14, - 16, 16, 14, 16, 16, 16, 14, 16, 10, 16, 13, 16, 10, 16, 13, 16, - 12, 16, 14, 16, 12, 16, 13, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 11, 16, 13, 16, 12, 16, 13, 16, 12, 16, 13, 16, 12, 16, 13, 16, - 16, 16, 16, 16, 16, 16, 15, 16, 14, 16, 14, 16, 16, 16, 14, 16, - 15, 16, 14, 16, 14, 16, 14, 16, 16, 16, 16, 16, 16, 16, 14, 14, - 4, 14, 8, 13, 9, 16, 12, 14, 9, 16, 11, 14, 11, 16, 13, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 6, 15, 8, 13, 10, 16, 12, 14, - 10, 16, 11, 14, 12, 16, 13, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 9, 16, 9, 14, 13, 16, 13, 15, 12, 16, 11, 16, 14, 16, 13, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 6, 16, 9, 14, 9, 16, 12, 14, - 10, 16, 11, 15, 12, 16, 13, 15, 16, 16, 16, 16, 16, 16, 16, 16, - 8, 16, 10, 14, 11, 16, 12, 14, 10, 16, 11, 14, 12, 16, 13, 15, - 16, 16, 16, 16, 16, 16, 16, 16, 11, 16, 11, 15, 14, 16, 13, 15, - 12, 16, 11, 15, 14, 16, 13, 14, 16, 16, 14, 16, 16, 16, 14, 16, - 10, 16, 13, 16, 10, 16, 13, 15, 13, 16, 14, 16, 12, 16, 14, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 11, 16, 13, 16, 12, 16, 13, 16, - 12, 16, 13, 16, 11, 16, 13, 16, 16, 16, 16, 16, 15, 16, 15, 16, - 14, 16, 14, 16, 15, 16, 14, 16, 14, 16, 14, 16, 14, 16, 14, 14, - 16, 16, 14, 16, 15, 16, 14, 14, 6, 16, 9, 14, 10, 16, 12, 14, - 10, 16, 11, 13, 12, 16, 13, 14, 16, 16, 16, 16, 16, 16, 14, 14, - 7, 16, 9, 14, 10, 16, 12, 13, 11, 16, 11, 14, 12, 16, 12, 14, - 16, 16, 16, 16, 16, 16, 14, 14, 9, 16, 9, 14, 12, 16, 11, 13, - 12, 16, 11, 14, 12, 16, 12, 13, 16, 16, 14, 16, 16, 16, 13, 14, - 7, 16, 10, 14, 10, 16, 12, 14, 11, 16, 11, 14, 11, 16, 12, 14, - 16, 16, 16, 16, 16, 16, 14, 14, 8, 16, 10, 14, 10, 16, 11, 13, - 10, 16, 11, 13, 11, 16, 12, 13, 16, 16, 14, 16, 16, 16, 14, 14, - 10, 16, 9, 13, 12, 16, 11, 13, 11, 16, 10, 13, 12, 16, 11, 12, - 16, 16, 13, 15, 15, 16, 13, 13, 9, 16, 11, 14, 9, 16, 11, 13, - 12, 16, 12, 16, 12, 16, 12, 13, 16, 16, 16, 16, 15, 16, 14, 14, - 10, 16, 11, 14, 10, 16, 11, 13, 11, 16, 12, 14, 10, 15, 11, 13, - 16, 16, 15, 16, 13, 16, 13, 13, 12, 16, 11, 13, 12, 16, 11, 12, - 12, 16, 11, 13, 11, 14, 11, 11, 13, 16, 12, 13, 12, 14, 11, 11, - ], [ - 0, 10, 5, 10, 6, 11, 8, 10, 7, 12, 8, 11, 8, 12, 9, 10, - 14, 16, 13, 13, 13, 14, 12, 11, 4, 12, 6, 10, 8, 12, 9, 10, - 8, 13, 8, 11, 9, 12, 9, 10, 14, 16, 12, 13, 13, 14, 11, 11, - 9, 15, 8, 12, 12, 14, 10, 11, 11, 16, 9, 12, 12, 14, 10, 10, - 14, 16, 11, 13, 13, 15, 11, 11, 4, 12, 8, 11, 6, 11, 9, 10, - 8, 13, 9, 11, 8, 12, 9, 10, 14, 16, 12, 13, 13, 14, 11, 11, - 7, 13, 8, 11, 9, 12, 9, 10, 8, 13, 9, 11, 9, 12, 9, 10, - 14, 16, 12, 13, 12, 13, 11, 10, 11, 16, 10, 12, 12, 14, 10, 11, - 11, 16, 10, 12, 12, 14, 10, 10, 15, 16, 11, 13, 13, 14, 11, 10, - 10, 16, 11, 13, 9, 13, 10, 11, 11, 15, 12, 13, 10, 12, 10, 11, - 15, 16, 13, 14, 12, 13, 11, 11, 11, 16, 11, 13, 10, 13, 10, 11, - 12, 16, 11, 13, 10, 13, 10, 10, 15, 16, 13, 14, 12, 13, 11, 10, - 13, 16, 12, 13, 13, 14, 11, 11, 14, 16, 12, 13, 12, 14, 11, 10, - 16, 16, 13, 13, 13, 14, 11, 9, 3, 11, 6, 10, 6, 11, 9, 10, - 8, 12, 8, 11, 9, 12, 9, 10, 14, 16, 13, 13, 13, 13, 12, 11, - 5, 12, 6, 10, 8, 12, 9, 10, 8, 13, 8, 11, 9, 12, 9, 10, - 14, 16, 12, 13, 13, 14, 11, 11, 9, 15, 8, 11, 11, 14, 10, 10, - 11, 15, 9, 11, 12, 14, 10, 10, 14, 16, 11, 12, 13, 14, 11, 10, - 5, 12, 8, 11, 7, 11, 9, 10, 8, 13, 9, 11, 9, 12, 9, 10, - 14, 16, 12, 13, 13, 13, 11, 11, 7, 13, 8, 11, 8, 12, 9, 10, - 8, 13, 8, 11, 9, 12, 9, 9, 13, 16, 11, 13, 12, 13, 11, 10, - 10, 15, 9, 12, 11, 14, 10, 10, 11, 15, 9, 11, 11, 13, 10, 10, - 14, 16, 11, 12, 13, 14, 10, 10, 9, 16, 11, 13, 9, 12, 10, 10, - 11, 16, 11, 13, 9, 12, 10, 10, 15, 16, 13, 14, 12, 13, 11, 10, - 11, 16, 11, 13, 10, 13, 10, 10, 11, 15, 11, 13, 9, 12, 10, 10, - 14, 16, 12, 13, 11, 13, 10, 10, 13, 16, 12, 13, 12, 14, 11, 10, - 13, 16, 11, 13, 12, 13, 10, 10, 14, 16, 11, 12, 12, 13, 10, 9, - 7, 14, 8, 12, 9, 13, 10, 11, 10, 14, 10, 12, 11, 13, 11, 11, - 16, 16, 14, 14, 14, 14, 12, 12, 7, 14, 8, 12, 9, 13, 10, 11, - 10, 14, 10, 12, 11, 13, 10, 11, 16, 16, 13, 13, 14, 14, 12, 11, - 10, 15, 9, 12, 12, 14, 10, 10, 12, 16, 9, 12, 12, 14, 10, 10, - 16, 16, 12, 13, 14, 15, 12, 11, 8, 14, 9, 12, 9, 13, 10, 11, - 10, 15, 10, 12, 10, 13, 10, 11, 16, 16, 14, 14, 14, 14, 12, 11, - 8, 14, 9, 12, 9, 13, 10, 11, 10, 14, 10, 12, 10, 13, 10, 10, - 15, 16, 13, 13, 13, 14, 12, 11, 10, 15, 10, 12, 12, 14, 10, 10, - 11, 16, 9, 12, 12, 14, 10, 10, 14, 16, 11, 12, 13, 14, 11, 10, - 11, 16, 11, 14, 9, 13, 10, 11, 12, 16, 12, 14, 10, 13, 11, 11, - 16, 16, 14, 15, 13, 14, 12, 11, 11, 16, 12, 14, 10, 13, 11, 11, - 11, 16, 11, 13, 10, 13, 10, 10, 15, 16, 13, 14, 12, 13, 11, 10, - 13, 16, 12, 14, 13, 14, 11, 10, 12, 16, 11, 13, 12, 13, 10, 10, - 14, 16, 11, 12, 11, 13, 10, 9, 10, 16, 10, 13, 11, 14, 11, 11, - 12, 16, 11, 13, 12, 14, 11, 11, 16, 16, 14, 13, 14, 15, 12, 11, - 10, 16, 10, 13, 10, 14, 11, 11, 12, 16, 11, 13, 11, 14, 11, 11, - 16, 16, 14, 13, 14, 14, 12, 11, 11, 15, 9, 12, 11, 14, 10, 10, - 13, 16, 10, 12, 12, 14, 10, 10, 16, 16, 13, 13, 14, 14, 11, 10, - 10, 16, 10, 13, 11, 14, 11, 11, 12, 16, 11, 13, 12, 14, 11, 11, - 16, 16, 14, 14, 14, 14, 12, 11, 9, 16, 10, 13, 10, 14, 11, 11, - 11, 15, 11, 12, 11, 13, 11, 11, 16, 16, 13, 13, 14, 14, 12, 10, - 10, 15, 9, 12, 11, 14, 10, 10, 11, 16, 9, 11, 11, 13, 10, 9, - 15, 16, 11, 12, 13, 14, 10, 9, 11, 16, 11, 13, 10, 13, 10, 10, - 13, 16, 12, 13, 11, 13, 10, 10, 16, 16, 14, 14, 13, 13, 11, 10, - 11, 16, 11, 13, 10, 13, 10, 10, 12, 16, 11, 13, 10, 13, 10, 10, - 15, 16, 13, 13, 12, 13, 11, 9, 11, 16, 11, 12, 11, 13, 10, 9, - 11, 15, 10, 11, 11, 12, 9, 8, 13, 15, 10, 10, 10, 11, 8, 7, - ], [ - 0, 9, 3, 8, 5, 9, 7, 8, 5, 11, 6, 9, 8, 11, 8, 9, - 16, 16, 16, 16, 16, 16, 11, 10, 2, 10, 4, 9, 7, 10, 7, 8, - 7, 16, 7, 10, 9, 11, 8, 9, 16, 16, 11, 16, 16, 16, 11, 10, - 7, 16, 7, 10, 10, 16, 8, 9, 10, 16, 8, 10, 11, 16, 9, 9, - 16, 16, 16, 16, 16, 16, 11, 10, 3, 11, 6, 9, 6, 11, 8, 8, - 7, 16, 8, 10, 8, 11, 8, 9, 16, 16, 15, 16, 16, 16, 11, 10, - 5, 11, 7, 9, 8, 11, 8, 8, 7, 16, 7, 10, 8, 11, 8, 8, - 16, 16, 11, 16, 16, 16, 10, 9, 9, 16, 8, 11, 11, 16, 9, 9, - 10, 16, 8, 11, 11, 16, 9, 9, 16, 16, 10, 16, 16, 16, 10, 9, - 8, 16, 10, 11, 8, 16, 9, 9, 11, 16, 11, 16, 10, 16, 10, 9, - 16, 16, 16, 16, 16, 16, 11, 10, 9, 16, 10, 16, 10, 16, 9, 9, - 10, 16, 10, 16, 9, 16, 9, 9, 16, 16, 16, 16, 15, 16, 10, 9, - 16, 16, 11, 16, 16, 16, 10, 10, 13, 16, 11, 16, 11, 16, 10, 9, - 16, 16, 10, 11, 11, 16, 9, 8, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - ], [ - 1, 10, 6, 10, 7, 11, 9, 10, 8, 12, 9, 12, 9, 12, 10, 10, - 16, 16, 14, 16, 14, 15, 13, 12, 5, 12, 7, 10, 9, 11, 9, 10, - 9, 13, 9, 12, 10, 13, 10, 10, 16, 16, 14, 15, 14, 14, 13, 12, - 10, 15, 10, 12, 12, 14, 11, 11, 12, 16, 11, 13, 12, 14, 11, 11, - 16, 16, 14, 16, 15, 16, 13, 12, 6, 12, 8, 11, 8, 11, 10, 10, - 9, 13, 10, 12, 10, 12, 10, 10, 15, 16, 13, 15, 13, 14, 12, 12, - 7, 13, 9, 11, 9, 12, 10, 10, 9, 14, 10, 12, 10, 13, 10, 10, - 15, 16, 13, 15, 13, 14, 12, 11, 11, 15, 11, 13, 12, 14, 11, 11, - 12, 16, 11, 13, 12, 14, 11, 11, 16, 16, 13, 15, 14, 16, 12, 11, - 10, 16, 12, 14, 10, 13, 11, 11, 12, 16, 12, 14, 11, 13, 11, 11, - 16, 16, 15, 16, 14, 16, 13, 12, 11, 16, 12, 14, 11, 14, 11, 11, - 12, 16, 12, 14, 11, 14, 11, 11, 16, 16, 14, 15, 13, 15, 12, 12, - 13, 16, 13, 15, 13, 15, 12, 12, 13, 16, 12, 15, 12, 15, 11, 11, - 16, 16, 13, 16, 13, 15, 12, 11, 4, 11, 7, 10, 7, 11, 9, 10, - 9, 13, 9, 12, 10, 12, 10, 10, 15, 16, 14, 15, 14, 15, 13, 12, - 6, 12, 7, 11, 9, 11, 9, 10, 9, 13, 9, 12, 10, 12, 10, 10, - 15, 16, 14, 15, 14, 15, 12, 12, 10, 15, 9, 12, 12, 13, 11, 11, - 12, 15, 11, 13, 12, 14, 11, 11, 16, 16, 13, 15, 14, 16, 12, 12, - 6, 12, 8, 11, 8, 11, 9, 10, 9, 14, 10, 12, 10, 12, 10, 10, - 14, 16, 13, 14, 13, 14, 12, 12, 8, 13, 9, 11, 9, 12, 10, 10, - 9, 13, 9, 12, 9, 12, 9, 10, 14, 16, 13, 14, 13, 14, 12, 11, - 11, 15, 11, 13, 11, 14, 11, 11, 12, 16, 10, 13, 12, 13, 11, 10, - 15, 16, 12, 15, 13, 16, 12, 11, 10, 15, 11, 13, 10, 13, 11, 11, - 12, 16, 12, 14, 11, 13, 11, 11, 16, 16, 14, 15, 13, 16, 13, 12, - 11, 16, 11, 14, 11, 13, 11, 11, 12, 16, 12, 14, 10, 13, 11, 11, - 15, 16, 13, 16, 12, 14, 12, 11, 12, 16, 12, 14, 12, 15, 11, 11, - 13, 16, 12, 14, 12, 14, 11, 11, 15, 16, 13, 15, 13, 15, 11, 10, - 7, 13, 9, 12, 10, 13, 11, 11, 11, 15, 12, 13, 12, 13, 11, 11, - 16, 16, 15, 16, 16, 16, 14, 13, 8, 13, 9, 12, 10, 13, 11, 11, - 12, 15, 11, 13, 12, 13, 11, 11, 16, 16, 14, 15, 15, 16, 13, 12, - 11, 16, 11, 13, 12, 14, 11, 11, 13, 16, 12, 14, 13, 15, 12, 11, - 16, 16, 14, 16, 15, 16, 13, 12, 9, 15, 10, 13, 10, 13, 11, 11, - 12, 15, 11, 13, 11, 13, 11, 11, 16, 16, 14, 16, 16, 16, 13, 12, - 9, 14, 10, 13, 10, 13, 11, 11, 11, 14, 11, 13, 11, 13, 11, 11, - 16, 16, 14, 16, 14, 16, 12, 12, 11, 16, 11, 14, 12, 14, 12, 11, - 12, 16, 11, 13, 13, 14, 11, 11, 16, 16, 13, 15, 14, 16, 12, 11, - 12, 16, 12, 14, 11, 14, 11, 11, 13, 16, 13, 14, 12, 15, 12, 11, - 16, 16, 16, 16, 14, 16, 13, 12, 12, 16, 12, 14, 11, 14, 12, 11, - 12, 16, 12, 15, 11, 14, 11, 11, 16, 16, 14, 16, 13, 15, 12, 12, - 13, 16, 13, 16, 13, 16, 12, 12, 13, 16, 12, 15, 12, 16, 11, 11, - 14, 16, 12, 15, 12, 15, 11, 10, 9, 16, 11, 14, 12, 14, 12, 12, - 13, 16, 13, 15, 14, 16, 12, 12, 16, 16, 16, 16, 16, 16, 14, 13, - 10, 16, 11, 14, 12, 14, 12, 12, 13, 16, 13, 14, 13, 16, 12, 12, - 16, 16, 15, 16, 16, 16, 13, 12, 11, 16, 11, 14, 12, 15, 12, 11, - 13, 16, 12, 14, 13, 16, 12, 11, 16, 16, 14, 16, 16, 16, 13, 12, - 11, 16, 11, 14, 12, 14, 12, 12, 13, 16, 12, 15, 13, 16, 12, 12, - 16, 16, 16, 16, 16, 16, 14, 13, 10, 16, 11, 14, 11, 15, 11, 11, - 13, 16, 12, 14, 12, 14, 12, 11, 16, 16, 14, 16, 16, 16, 13, 12, - 11, 16, 11, 15, 12, 15, 12, 11, 13, 16, 11, 14, 13, 15, 12, 11, - 16, 16, 13, 16, 14, 16, 12, 11, 12, 16, 12, 15, 11, 15, 12, 11, - 14, 16, 13, 15, 12, 16, 12, 11, 16, 16, 15, 16, 14, 16, 13, 12, - 11, 16, 12, 15, 11, 15, 11, 11, 13, 16, 13, 16, 11, 15, 11, 11, - 16, 16, 14, 16, 13, 15, 12, 11, 12, 16, 12, 15, 12, 16, 11, 11, - 12, 16, 11, 15, 12, 14, 11, 11, 13, 16, 12, 13, 11, 13, 10, 9, - ], - ], [ - [ - 0, 13, 6, 13, 8, 14, 12, 16, 8, 16, 11, 16, 12, 16, 14, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 4, 16, 7, 14, 11, 16, 13, 16, - 9, 16, 11, 16, 12, 16, 14, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 10, 16, 10, 16, 16, 16, 16, 16, 13, 16, 12, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 5, 16, 10, 16, 8, 16, 13, 16, - 10, 16, 12, 16, 12, 16, 14, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 8, 16, 10, 16, 11, 16, 13, 16, 10, 16, 12, 16, 12, 16, 14, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 12, 16, 12, 16, 16, 16, 16, 16, - 14, 16, 13, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 11, 16, 16, 16, 11, 16, 16, 16, 13, 16, 16, 16, 13, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 13, 16, 16, 16, 13, 16, 16, 16, - 14, 16, 16, 16, 13, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 1, 13, 7, 13, 8, 16, 12, 16, - 8, 16, 10, 16, 11, 16, 13, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 4, 16, 7, 14, 10, 16, 12, 16, 9, 16, 10, 16, 12, 16, 14, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 10, 16, 9, 16, 14, 16, 14, 16, - 13, 16, 11, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 5, 16, 9, 16, 8, 16, 12, 16, 9, 16, 11, 16, 11, 16, 13, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 7, 16, 10, 16, 11, 16, 13, 16, - 9, 16, 11, 16, 11, 16, 13, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 12, 16, 12, 16, 16, 16, 14, 16, 13, 16, 12, 16, 16, 16, 14, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 10, 16, 13, 16, 11, 16, 14, 16, - 13, 16, 16, 16, 13, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 12, 16, 14, 16, 13, 16, 14, 16, 13, 16, 14, 16, 13, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 4, 16, 8, 16, 9, 16, 13, 16, 10, 16, 11, 16, 12, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 6, 16, 8, 16, 11, 16, 13, 16, - 10, 16, 11, 16, 13, 16, 14, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 9, 16, 9, 16, 13, 16, 13, 16, 13, 16, 12, 16, 16, 16, 14, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 6, 16, 10, 16, 10, 16, 13, 16, - 10, 16, 12, 16, 12, 16, 14, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 8, 16, 10, 16, 11, 16, 13, 16, 10, 16, 11, 16, 12, 16, 14, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 11, 16, 11, 16, 16, 16, 14, 16, - 12, 16, 11, 16, 16, 16, 14, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 10, 16, 13, 16, 10, 16, 13, 16, 13, 16, 16, 16, 13, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 12, 16, 13, 16, 12, 16, 14, 16, - 12, 16, 15, 16, 12, 16, 14, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 14, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 6, 16, 10, 16, 10, 16, 13, 16, - 11, 16, 11, 16, 12, 16, 13, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 8, 16, 9, 16, 11, 16, 12, 16, 11, 16, 11, 16, 12, 16, 13, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 9, 16, 9, 16, 12, 16, 12, 16, - 13, 16, 11, 16, 13, 16, 13, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 8, 16, 10, 16, 10, 16, 12, 16, 11, 16, 12, 16, 12, 16, 13, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 8, 16, 10, 16, 11, 16, 12, 16, - 10, 16, 11, 16, 12, 16, 13, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 10, 16, 10, 14, 12, 16, 12, 16, 11, 16, 10, 14, 13, 16, 12, 14, - 16, 16, 14, 16, 16, 16, 14, 16, 9, 16, 12, 16, 10, 16, 12, 16, - 13, 16, 13, 16, 12, 16, 13, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 10, 16, 12, 16, 11, 16, 12, 16, 11, 16, 12, 16, 11, 16, 12, 15, - 16, 16, 16, 16, 16, 16, 16, 16, 13, 16, 12, 16, 13, 16, 12, 13, - 12, 16, 12, 16, 12, 16, 12, 13, 16, 16, 13, 14, 13, 16, 13, 13, - ], [ - 0, 10, 5, 10, 5, 10, 8, 10, 6, 11, 8, 11, 8, 11, 9, 10, - 14, 16, 13, 14, 13, 14, 12, 12, 4, 12, 5, 10, 8, 12, 9, 10, - 7, 12, 8, 11, 9, 12, 9, 10, 14, 16, 12, 13, 13, 14, 12, 12, - 9, 16, 8, 12, 12, 14, 10, 11, 11, 16, 9, 12, 12, 14, 11, 11, - 14, 16, 12, 13, 14, 15, 12, 12, 4, 12, 7, 11, 6, 11, 9, 10, - 8, 12, 9, 11, 8, 11, 9, 10, 14, 16, 12, 14, 13, 14, 12, 12, - 7, 13, 8, 11, 8, 12, 9, 10, 8, 13, 8, 11, 9, 12, 9, 10, - 14, 16, 12, 13, 12, 13, 11, 11, 11, 16, 10, 12, 12, 14, 11, 11, - 12, 16, 10, 12, 12, 14, 11, 11, 16, 16, 12, 13, 14, 15, 12, 11, - 10, 16, 11, 14, 9, 13, 10, 11, 11, 16, 12, 14, 10, 13, 11, 11, - 15, 16, 13, 14, 13, 14, 12, 12, 11, 16, 12, 14, 10, 13, 11, 11, - 12, 16, 12, 14, 11, 13, 11, 11, 15, 16, 13, 14, 13, 14, 12, 11, - 14, 16, 13, 14, 13, 15, 12, 12, 14, 16, 12, 14, 13, 15, 11, 11, - 16, 16, 13, 14, 14, 15, 12, 11, 3, 11, 5, 10, 6, 11, 9, 10, - 7, 12, 8, 11, 9, 11, 9, 10, 14, 16, 13, 13, 13, 14, 12, 12, - 5, 12, 6, 10, 8, 12, 9, 10, 8, 13, 8, 11, 9, 12, 9, 10, - 14, 16, 12, 13, 13, 14, 12, 12, 9, 16, 8, 11, 11, 14, 10, 11, - 11, 16, 9, 12, 12, 14, 10, 11, 15, 16, 12, 13, 14, 15, 12, 11, - 5, 12, 7, 11, 6, 11, 9, 10, 8, 13, 9, 11, 8, 11, 9, 10, - 14, 16, 12, 14, 13, 13, 12, 12, 7, 13, 8, 11, 8, 12, 9, 10, - 8, 12, 8, 11, 9, 12, 9, 10, 13, 16, 12, 13, 12, 13, 11, 11, - 10, 16, 9, 12, 12, 14, 10, 11, 11, 15, 9, 12, 12, 14, 10, 11, - 14, 16, 11, 13, 13, 14, 11, 11, 9, 16, 11, 14, 8, 13, 10, 11, - 11, 16, 12, 13, 10, 13, 10, 11, 16, 16, 13, 15, 13, 14, 12, 12, - 11, 16, 11, 14, 10, 13, 10, 11, 11, 16, 11, 13, 10, 13, 10, 11, - 14, 16, 13, 14, 12, 13, 11, 11, 14, 16, 12, 14, 13, 15, 11, 11, - 13, 16, 12, 13, 12, 14, 11, 11, 14, 16, 12, 13, 12, 13, 11, 10, - 6, 14, 8, 12, 9, 13, 10, 11, 10, 14, 10, 12, 11, 13, 11, 12, - 16, 16, 14, 14, 14, 14, 13, 12, 7, 14, 8, 12, 9, 13, 10, 11, - 10, 14, 10, 12, 11, 13, 11, 11, 16, 16, 13, 14, 14, 15, 13, 12, - 10, 16, 8, 12, 12, 14, 10, 11, 12, 16, 10, 12, 13, 15, 11, 11, - 16, 16, 13, 14, 15, 16, 12, 12, 8, 15, 9, 13, 9, 13, 10, 11, - 10, 15, 10, 13, 10, 13, 11, 11, 16, 16, 14, 14, 14, 14, 13, 12, - 8, 15, 9, 12, 10, 13, 10, 11, 10, 14, 10, 12, 10, 13, 10, 11, - 16, 16, 13, 14, 13, 14, 12, 12, 10, 16, 10, 13, 12, 15, 11, 11, - 11, 16, 9, 12, 12, 14, 11, 11, 14, 16, 11, 13, 14, 16, 12, 11, - 10, 16, 12, 14, 9, 13, 11, 11, 12, 16, 12, 14, 11, 13, 11, 11, - 16, 16, 15, 16, 14, 14, 13, 12, 11, 16, 12, 14, 11, 14, 11, 11, - 11, 16, 12, 14, 10, 13, 11, 11, 15, 16, 13, 15, 12, 14, 12, 11, - 14, 16, 13, 14, 13, 16, 12, 12, 12, 16, 12, 13, 12, 14, 11, 11, - 14, 16, 11, 12, 12, 13, 10, 10, 9, 16, 10, 14, 11, 15, 12, 12, - 12, 16, 11, 13, 12, 15, 12, 12, 16, 16, 14, 13, 15, 15, 13, 12, - 10, 16, 10, 14, 11, 15, 11, 12, 12, 16, 11, 13, 12, 14, 12, 12, - 16, 16, 14, 13, 15, 14, 13, 12, 11, 16, 9, 12, 12, 14, 11, 11, - 13, 16, 11, 13, 13, 15, 11, 11, 16, 16, 14, 14, 16, 16, 12, 12, - 10, 16, 10, 14, 11, 14, 11, 12, 12, 16, 11, 13, 12, 14, 12, 12, - 16, 16, 14, 14, 15, 15, 13, 12, 10, 16, 10, 13, 11, 14, 11, 12, - 11, 16, 11, 13, 11, 14, 11, 12, 16, 16, 14, 14, 14, 14, 13, 12, - 11, 16, 10, 12, 12, 15, 11, 11, 12, 16, 9, 12, 12, 14, 10, 11, - 16, 16, 12, 13, 14, 15, 11, 11, 11, 16, 12, 14, 10, 14, 11, 11, - 13, 16, 12, 14, 12, 14, 11, 11, 16, 16, 15, 15, 14, 15, 12, 12, - 11, 16, 12, 14, 11, 14, 11, 11, 12, 16, 12, 14, 11, 13, 11, 11, - 16, 16, 14, 14, 13, 14, 12, 11, 12, 16, 11, 13, 12, 14, 10, 10, - 12, 15, 11, 12, 12, 13, 10, 10, 14, 15, 11, 11, 12, 12, 10, 9, - ], [ - 0, 8, 3, 8, 5, 9, 7, 8, 5, 10, 6, 10, 8, 11, 8, 9, - 16, 16, 15, 16, 16, 16, 11, 11, 2, 10, 4, 9, 7, 10, 7, 8, - 7, 16, 7, 10, 9, 11, 8, 9, 16, 16, 15, 16, 16, 16, 11, 11, - 7, 16, 6, 11, 10, 16, 9, 10, 10, 16, 9, 11, 11, 16, 9, 10, - 16, 16, 16, 16, 16, 16, 16, 11, 3, 10, 6, 9, 5, 10, 7, 9, - 7, 16, 8, 10, 8, 11, 8, 9, 16, 16, 16, 16, 16, 16, 11, 11, - 5, 11, 7, 10, 8, 11, 8, 9, 7, 14, 7, 10, 8, 11, 8, 9, - 16, 16, 11, 16, 16, 16, 10, 11, 9, 16, 9, 11, 11, 16, 9, 10, - 10, 16, 8, 11, 11, 16, 9, 10, 16, 16, 11, 16, 16, 16, 11, 10, - 8, 16, 9, 16, 7, 16, 9, 10, 11, 16, 11, 16, 10, 16, 10, 10, - 16, 16, 16, 16, 16, 16, 16, 11, 9, 16, 10, 16, 9, 16, 9, 10, - 10, 16, 10, 16, 9, 16, 9, 10, 16, 16, 16, 16, 11, 16, 11, 11, - 16, 16, 16, 16, 16, 16, 10, 10, 11, 16, 11, 16, 11, 16, 10, 10, - 16, 16, 11, 16, 11, 16, 10, 9, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - ], [ - 1, 10, 6, 10, 7, 11, 9, 10, 8, 12, 9, 12, 9, 12, 10, 10, - 15, 16, 14, 15, 14, 16, 13, 12, 5, 12, 7, 11, 8, 11, 9, 10, - 9, 13, 9, 12, 10, 12, 10, 10, 16, 16, 14, 15, 13, 16, 13, 12, - 10, 15, 10, 13, 12, 14, 11, 11, 12, 16, 11, 13, 12, 14, 11, 11, - 16, 16, 14, 16, 14, 16, 13, 12, 5, 12, 8, 11, 7, 11, 9, 10, - 9, 13, 10, 12, 9, 12, 10, 10, 14, 16, 14, 15, 13, 14, 13, 12, - 7, 13, 9, 12, 9, 12, 10, 10, 9, 13, 9, 12, 9, 12, 10, 10, - 14, 16, 13, 14, 13, 15, 12, 12, 11, 16, 11, 13, 12, 14, 11, 11, - 12, 16, 11, 14, 12, 14, 11, 11, 16, 16, 14, 16, 14, 16, 13, 12, - 10, 16, 11, 14, 10, 13, 11, 11, 12, 16, 12, 14, 11, 13, 11, 11, - 15, 16, 15, 16, 14, 16, 13, 12, 11, 16, 12, 14, 11, 14, 11, 12, - 12, 16, 12, 14, 11, 14, 11, 11, 15, 16, 14, 16, 13, 16, 13, 12, - 13, 16, 13, 16, 13, 16, 12, 12, 13, 16, 13, 16, 13, 16, 12, 12, - 16, 16, 14, 15, 14, 16, 13, 12, 4, 11, 7, 10, 7, 11, 9, 10, - 9, 13, 9, 11, 9, 12, 10, 10, 15, 16, 14, 15, 14, 15, 13, 12, - 6, 12, 7, 11, 8, 11, 9, 10, 9, 13, 9, 12, 10, 12, 10, 10, - 15, 16, 13, 14, 14, 15, 12, 12, 10, 14, 10, 12, 12, 13, 11, 11, - 12, 16, 11, 13, 12, 14, 11, 11, 16, 16, 14, 15, 15, 16, 13, 12, - 6, 12, 8, 11, 8, 11, 9, 10, 9, 13, 10, 12, 9, 12, 10, 10, - 16, 16, 14, 15, 13, 14, 12, 12, 8, 13, 9, 11, 9, 12, 9, 10, - 9, 13, 9, 12, 9, 12, 9, 10, 14, 16, 13, 14, 13, 14, 12, 11, - 11, 15, 11, 13, 12, 14, 11, 11, 11, 16, 10, 13, 12, 14, 11, 11, - 15, 16, 13, 15, 14, 16, 12, 11, 10, 16, 12, 13, 10, 13, 11, 11, - 11, 16, 12, 14, 10, 13, 11, 11, 16, 16, 14, 16, 13, 16, 13, 12, - 11, 16, 12, 14, 10, 14, 11, 11, 11, 16, 12, 14, 10, 13, 11, 11, - 16, 16, 14, 16, 12, 15, 12, 11, 13, 16, 13, 15, 13, 15, 12, 12, - 13, 16, 12, 15, 12, 15, 12, 11, 15, 16, 13, 16, 13, 16, 12, 11, - 8, 14, 9, 12, 10, 13, 11, 11, 11, 16, 11, 13, 11, 13, 11, 11, - 16, 16, 16, 16, 16, 16, 14, 13, 9, 14, 10, 12, 10, 13, 11, 11, - 11, 16, 11, 13, 12, 13, 11, 11, 16, 16, 15, 16, 15, 16, 14, 12, - 11, 16, 11, 13, 12, 14, 12, 11, 13, 16, 12, 14, 13, 14, 12, 11, - 16, 16, 15, 16, 16, 16, 14, 13, 9, 14, 10, 13, 10, 13, 11, 11, - 11, 16, 11, 13, 11, 13, 11, 11, 16, 16, 15, 16, 14, 15, 14, 13, - 9, 14, 10, 13, 10, 13, 11, 11, 11, 15, 11, 13, 11, 13, 11, 11, - 16, 16, 14, 16, 14, 16, 13, 12, 12, 16, 12, 14, 13, 14, 12, 11, - 12, 16, 11, 14, 12, 15, 12, 11, 16, 16, 13, 16, 15, 16, 13, 11, - 11, 16, 12, 14, 11, 14, 12, 11, 13, 16, 13, 15, 12, 14, 12, 12, - 16, 16, 16, 16, 14, 16, 14, 13, 12, 16, 13, 15, 11, 14, 12, 12, - 12, 16, 13, 14, 11, 15, 12, 11, 16, 16, 15, 16, 13, 15, 13, 12, - 13, 16, 13, 15, 13, 16, 12, 12, 13, 16, 13, 15, 13, 15, 12, 12, - 15, 16, 13, 16, 13, 15, 11, 10, 10, 16, 12, 14, 12, 15, 12, 12, - 14, 16, 13, 15, 13, 16, 13, 12, 16, 16, 16, 16, 16, 16, 15, 13, - 10, 16, 12, 14, 12, 15, 12, 12, 13, 16, 13, 15, 13, 15, 13, 12, - 16, 16, 16, 16, 16, 16, 14, 13, 11, 16, 12, 15, 13, 16, 12, 12, - 14, 16, 13, 16, 13, 16, 12, 12, 16, 16, 15, 16, 15, 16, 14, 12, - 11, 16, 12, 14, 12, 16, 12, 12, 14, 16, 13, 15, 13, 15, 13, 12, - 16, 16, 16, 16, 16, 16, 15, 13, 11, 16, 12, 14, 12, 15, 12, 12, - 13, 16, 12, 14, 12, 15, 12, 12, 16, 16, 16, 16, 16, 16, 14, 12, - 12, 16, 12, 15, 13, 16, 12, 12, 13, 16, 12, 15, 13, 15, 12, 11, - 16, 16, 14, 16, 15, 16, 13, 12, 12, 16, 13, 16, 12, 16, 12, 12, - 15, 16, 14, 16, 13, 16, 12, 12, 16, 16, 16, 16, 16, 16, 14, 13, - 12, 16, 13, 15, 12, 16, 12, 12, 13, 16, 13, 15, 12, 15, 12, 12, - 16, 16, 15, 16, 14, 16, 13, 12, 13, 16, 13, 16, 12, 16, 12, 12, - 13, 16, 12, 16, 12, 15, 12, 12, 14, 16, 12, 14, 12, 14, 11, 10, - ], - ], [ - [ - 0, 16, 6, 16, 8, 16, 16, 16, 9, 16, 11, 16, 12, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 4, 16, 7, 16, 11, 16, 16, 16, - 10, 16, 11, 16, 13, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 10, 16, 10, 16, 16, 16, 16, 16, 16, 16, 13, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 5, 16, 10, 16, 9, 16, 16, 16, - 10, 16, 13, 16, 12, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 8, 16, 11, 16, 12, 16, 16, 16, 10, 16, 12, 16, 13, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 13, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 11, 16, 16, 16, 12, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 13, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 1, 16, 7, 16, 8, 16, 13, 16, - 9, 16, 11, 16, 12, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 4, 16, 7, 16, 11, 16, 13, 16, 9, 16, 11, 16, 13, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 9, 16, 9, 16, 16, 16, 16, 16, - 13, 16, 12, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 4, 16, 10, 16, 8, 16, 16, 16, 10, 16, 12, 16, 12, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 7, 16, 10, 16, 11, 16, 16, 16, - 9, 16, 11, 16, 12, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 12, 16, 12, 16, 16, 16, 16, 16, 13, 16, 12, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 10, 16, 16, 16, 11, 16, 16, 16, - 16, 16, 16, 16, 15, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 12, 16, 16, 16, 13, 16, 16, 16, 13, 16, 16, 16, 13, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 4, 16, 8, 16, 10, 16, 16, 16, 10, 16, 11, 16, 12, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 6, 16, 8, 16, 11, 16, 16, 16, - 10, 16, 12, 16, 15, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 9, 16, 9, 16, 16, 16, 16, 16, 16, 16, 13, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 6, 16, 10, 16, 10, 16, 16, 16, - 11, 16, 12, 16, 12, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 8, 16, 11, 16, 11, 16, 16, 16, 10, 16, 12, 16, 12, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 11, 16, 12, 16, 16, 16, 16, 16, - 12, 16, 12, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 10, 16, 16, 16, 10, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 11, 16, 16, 16, 12, 16, 16, 16, - 12, 16, 16, 16, 13, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 6, 16, 10, 16, 11, 16, 16, 16, - 11, 16, 12, 16, 13, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 8, 16, 9, 16, 11, 16, 13, 16, 11, 16, 12, 16, 13, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 9, 16, 9, 16, 13, 16, 12, 16, - 13, 16, 12, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 8, 16, 10, 16, 10, 16, 14, 16, 12, 16, 12, 16, 12, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 9, 16, 11, 16, 11, 16, 13, 16, - 10, 16, 12, 16, 12, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 11, 16, 10, 16, 13, 16, 12, 16, 12, 16, 11, 16, 16, 16, 13, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 9, 16, 12, 16, 10, 16, 13, 16, - 16, 16, 16, 16, 13, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 10, 16, 13, 16, 11, 16, 13, 16, 12, 16, 13, 16, 12, 16, 13, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 13, 16, 13, 16, 16, 16, 12, 16, - 13, 16, 12, 16, 16, 16, 13, 16, 16, 16, 16, 16, 16, 16, 16, 16, - ], [ - 0, 10, 4, 10, 5, 11, 9, 11, 6, 11, 8, 11, 8, 12, 10, 12, - 15, 16, 13, 15, 14, 15, 13, 14, 4, 12, 5, 11, 8, 12, 9, 11, - 7, 13, 8, 12, 9, 13, 10, 12, 15, 16, 13, 15, 14, 16, 13, 14, - 10, 16, 9, 13, 12, 16, 11, 13, 11, 16, 10, 14, 13, 16, 12, 13, - 16, 16, 14, 16, 15, 16, 14, 15, 4, 12, 7, 12, 6, 12, 9, 11, - 8, 13, 9, 12, 9, 12, 10, 12, 15, 16, 13, 15, 14, 15, 13, 14, - 7, 13, 8, 12, 9, 13, 10, 12, 8, 13, 9, 12, 9, 13, 10, 12, - 14, 16, 13, 15, 13, 15, 13, 14, 12, 16, 11, 14, 13, 16, 12, 13, - 12, 16, 11, 14, 13, 16, 12, 13, 16, 16, 14, 16, 15, 16, 14, 15, - 10, 16, 12, 16, 10, 14, 12, 13, 12, 16, 13, 16, 11, 14, 12, 13, - 16, 16, 16, 16, 15, 16, 14, 15, 12, 16, 13, 16, 11, 15, 12, 13, - 13, 16, 13, 16, 12, 15, 12, 14, 16, 16, 16, 16, 14, 16, 13, 14, - 16, 16, 14, 16, 14, 16, 13, 15, 16, 16, 14, 16, 14, 16, 13, 15, - 16, 16, 16, 16, 16, 16, 14, 16, 2, 11, 5, 11, 6, 11, 9, 11, - 7, 12, 8, 11, 9, 12, 10, 12, 15, 16, 14, 14, 14, 14, 13, 14, - 4, 13, 6, 11, 8, 12, 9, 11, 8, 13, 8, 12, 10, 13, 10, 12, - 15, 16, 13, 15, 14, 15, 13, 14, 9, 16, 8, 13, 12, 15, 11, 12, - 11, 16, 10, 14, 13, 16, 12, 13, 16, 16, 14, 16, 16, 16, 14, 15, - 5, 13, 8, 12, 7, 12, 9, 11, 8, 13, 9, 12, 9, 12, 10, 12, - 16, 16, 14, 15, 14, 15, 13, 13, 7, 13, 8, 12, 9, 13, 10, 12, - 8, 13, 8, 12, 9, 13, 10, 12, 14, 16, 13, 14, 13, 15, 12, 13, - 11, 16, 10, 14, 13, 16, 12, 13, 11, 16, 10, 13, 12, 15, 11, 13, - 14, 16, 12, 14, 14, 16, 13, 14, 10, 16, 12, 15, 9, 14, 11, 13, - 12, 16, 12, 16, 11, 14, 12, 13, 16, 16, 15, 16, 16, 16, 14, 15, - 11, 16, 12, 15, 11, 15, 12, 13, 12, 16, 12, 15, 11, 14, 12, 13, - 16, 16, 14, 16, 13, 15, 13, 14, 15, 16, 14, 16, 14, 16, 13, 14, - 14, 16, 13, 16, 14, 16, 13, 14, 16, 16, 14, 16, 14, 16, 13, 14, - 7, 15, 8, 13, 9, 14, 11, 13, 10, 14, 10, 13, 11, 14, 12, 13, - 16, 16, 15, 16, 15, 16, 15, 14, 7, 16, 8, 13, 10, 14, 11, 13, - 11, 15, 10, 13, 12, 14, 12, 13, 16, 16, 16, 16, 16, 16, 15, 15, - 10, 16, 9, 13, 13, 16, 12, 13, 13, 16, 11, 14, 14, 16, 13, 14, - 16, 16, 16, 16, 16, 16, 15, 16, 8, 16, 10, 14, 9, 14, 11, 13, - 11, 16, 11, 14, 11, 14, 12, 13, 16, 16, 16, 16, 16, 16, 14, 15, - 8, 16, 10, 14, 10, 14, 11, 13, 10, 15, 10, 14, 11, 14, 12, 13, - 16, 16, 14, 16, 15, 16, 14, 14, 11, 16, 10, 14, 13, 16, 12, 13, - 11, 16, 10, 13, 13, 16, 12, 13, 16, 16, 13, 16, 16, 16, 14, 14, - 11, 16, 12, 16, 10, 15, 12, 13, 14, 16, 14, 16, 12, 16, 13, 14, - 16, 16, 16, 16, 16, 16, 16, 16, 12, 16, 13, 16, 11, 16, 12, 14, - 12, 16, 13, 16, 11, 14, 12, 13, 16, 16, 16, 16, 14, 16, 14, 14, - 15, 16, 14, 16, 16, 16, 13, 14, 13, 16, 13, 15, 14, 16, 13, 14, - 14, 16, 13, 14, 14, 15, 13, 14, 9, 16, 11, 16, 12, 16, 13, 14, - 12, 16, 12, 15, 13, 16, 13, 14, 16, 16, 16, 15, 16, 16, 15, 15, - 10, 16, 10, 16, 12, 16, 12, 14, 12, 16, 12, 14, 13, 16, 13, 14, - 16, 16, 16, 16, 16, 16, 15, 15, 11, 16, 10, 14, 14, 16, 12, 13, - 14, 16, 12, 16, 14, 16, 13, 14, 16, 16, 16, 16, 16, 16, 16, 15, - 10, 16, 12, 16, 11, 16, 12, 14, 13, 16, 12, 15, 13, 16, 13, 14, - 16, 16, 16, 16, 16, 16, 16, 15, 10, 16, 11, 16, 12, 16, 12, 14, - 12, 16, 12, 15, 13, 16, 13, 14, 16, 16, 16, 16, 16, 16, 14, 14, - 11, 16, 10, 14, 14, 16, 12, 13, 13, 16, 11, 14, 14, 16, 12, 13, - 16, 16, 15, 16, 16, 16, 14, 14, 12, 16, 13, 16, 11, 16, 12, 14, - 15, 16, 14, 16, 13, 16, 13, 14, 16, 16, 16, 16, 16, 16, 14, 16, - 12, 16, 13, 16, 12, 16, 12, 14, 13, 16, 13, 16, 12, 16, 12, 13, - 16, 16, 16, 16, 16, 16, 14, 15, 13, 16, 13, 16, 14, 16, 12, 13, - 13, 16, 13, 14, 14, 16, 12, 13, 16, 16, 14, 14, 14, 15, 13, 13, - ], [ - 0, 9, 3, 9, 5, 9, 7, 9, 5, 10, 7, 11, 8, 11, 9, 10, - 16, 16, 16, 16, 16, 16, 16, 16, 2, 11, 4, 10, 7, 11, 8, 10, - 7, 16, 7, 11, 9, 16, 9, 11, 16, 16, 16, 16, 16, 16, 16, 16, - 8, 16, 7, 16, 11, 16, 10, 11, 11, 16, 10, 16, 16, 16, 11, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 2, 11, 6, 10, 6, 10, 8, 10, - 7, 16, 8, 16, 8, 11, 9, 11, 16, 16, 16, 16, 16, 16, 16, 16, - 5, 13, 7, 11, 8, 11, 9, 11, 6, 12, 8, 12, 8, 12, 9, 11, - 16, 16, 16, 16, 16, 16, 16, 16, 10, 16, 10, 16, 12, 16, 10, 13, - 10, 16, 9, 16, 11, 16, 11, 12, 16, 16, 16, 16, 16, 16, 16, 16, - 8, 16, 10, 16, 8, 16, 10, 12, 11, 16, 12, 16, 10, 16, 11, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 10, 16, 11, 16, 10, 16, 11, 16, - 11, 16, 12, 16, 10, 16, 11, 12, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - ], [ - 1, 10, 5, 10, 6, 10, 9, 10, 7, 12, 9, 12, 9, 12, 10, 10, - 16, 16, 15, 16, 14, 16, 13, 13, 5, 12, 7, 11, 8, 11, 9, 10, - 8, 13, 9, 12, 10, 12, 10, 11, 16, 16, 16, 16, 14, 16, 13, 12, - 10, 16, 10, 13, 12, 14, 12, 12, 12, 16, 11, 14, 13, 15, 12, 12, - 16, 16, 16, 15, 16, 16, 14, 13, 5, 12, 8, 11, 7, 11, 9, 10, - 8, 13, 10, 12, 9, 12, 10, 10, 15, 16, 14, 15, 14, 14, 13, 13, - 7, 13, 9, 12, 9, 12, 10, 10, 9, 13, 10, 13, 10, 13, 10, 10, - 14, 16, 14, 15, 14, 16, 13, 12, 11, 16, 12, 14, 12, 15, 12, 12, - 12, 16, 12, 15, 13, 16, 12, 12, 16, 16, 15, 16, 16, 16, 14, 13, - 10, 16, 12, 14, 10, 14, 12, 12, 12, 16, 13, 14, 11, 14, 12, 12, - 16, 16, 16, 16, 14, 16, 14, 13, 11, 16, 12, 14, 11, 14, 12, 12, - 12, 16, 13, 16, 11, 15, 12, 12, 16, 16, 16, 16, 14, 16, 14, 13, - 13, 16, 14, 16, 14, 16, 13, 13, 13, 16, 13, 16, 13, 16, 13, 12, - 16, 16, 16, 16, 16, 16, 13, 13, 4, 11, 7, 10, 7, 11, 9, 10, - 8, 12, 9, 12, 9, 12, 10, 11, 15, 16, 14, 15, 14, 16, 13, 13, - 6, 12, 7, 11, 8, 11, 9, 10, 9, 13, 9, 12, 10, 12, 10, 10, - 16, 16, 15, 16, 15, 16, 13, 12, 10, 16, 10, 13, 12, 14, 12, 11, - 12, 16, 11, 14, 13, 14, 12, 12, 16, 16, 16, 14, 16, 16, 14, 13, - 6, 12, 8, 11, 7, 11, 9, 10, 9, 14, 10, 12, 9, 12, 10, 10, - 15, 16, 14, 16, 14, 16, 14, 13, 7, 13, 9, 12, 9, 12, 10, 10, - 9, 13, 9, 12, 9, 12, 10, 10, 14, 16, 13, 14, 14, 16, 12, 11, - 11, 16, 11, 14, 12, 14, 12, 12, 12, 16, 11, 14, 12, 14, 12, 11, - 16, 16, 13, 16, 14, 16, 13, 12, 10, 16, 12, 14, 10, 14, 11, 11, - 12, 16, 13, 14, 11, 14, 12, 12, 16, 16, 16, 16, 14, 16, 13, 13, - 11, 16, 12, 16, 11, 14, 12, 12, 12, 16, 12, 14, 11, 14, 12, 11, - 16, 16, 15, 16, 13, 15, 13, 12, 13, 16, 14, 16, 13, 16, 13, 12, - 13, 16, 13, 16, 13, 16, 13, 12, 16, 16, 14, 16, 14, 16, 12, 11, - 8, 13, 10, 12, 10, 13, 11, 11, 11, 14, 12, 14, 12, 14, 12, 12, - 16, 16, 16, 16, 16, 16, 14, 13, 9, 14, 10, 13, 10, 13, 11, 11, - 12, 16, 12, 13, 12, 13, 12, 11, 16, 16, 16, 16, 16, 16, 15, 14, - 12, 16, 11, 14, 13, 15, 12, 12, 13, 16, 12, 15, 14, 15, 13, 12, - 16, 16, 16, 16, 16, 16, 15, 13, 9, 14, 11, 13, 10, 13, 11, 11, - 11, 16, 12, 14, 12, 14, 12, 12, 16, 16, 16, 16, 16, 16, 16, 13, - 10, 15, 11, 13, 11, 14, 12, 11, 11, 16, 12, 14, 11, 14, 12, 11, - 16, 16, 16, 16, 16, 16, 14, 12, 12, 16, 12, 14, 13, 15, 13, 12, - 12, 16, 12, 14, 13, 15, 12, 12, 16, 16, 14, 16, 16, 16, 14, 12, - 12, 16, 13, 16, 11, 14, 12, 12, 14, 16, 14, 16, 12, 16, 13, 12, - 16, 16, 16, 16, 16, 16, 16, 13, 12, 16, 13, 16, 12, 16, 13, 12, - 12, 16, 13, 16, 12, 16, 12, 12, 16, 16, 16, 16, 14, 16, 14, 12, - 14, 16, 14, 16, 14, 16, 14, 13, 13, 16, 13, 16, 13, 16, 13, 12, - 16, 16, 13, 16, 13, 16, 12, 11, 9, 16, 12, 15, 13, 16, 13, 12, - 13, 16, 14, 16, 14, 16, 14, 13, 16, 16, 16, 16, 16, 16, 16, 14, - 10, 16, 12, 15, 12, 15, 13, 12, 13, 16, 14, 16, 13, 16, 13, 12, - 16, 16, 16, 16, 16, 16, 16, 13, 12, 16, 12, 16, 13, 16, 13, 12, - 14, 16, 13, 16, 14, 16, 13, 12, 16, 16, 16, 16, 16, 16, 16, 13, - 11, 16, 12, 15, 12, 16, 13, 12, 14, 16, 14, 16, 13, 16, 13, 13, - 16, 16, 16, 16, 16, 16, 15, 13, 11, 16, 12, 16, 12, 16, 13, 12, - 13, 16, 13, 15, 13, 16, 13, 12, 16, 16, 16, 16, 16, 16, 15, 13, - 12, 16, 12, 16, 13, 16, 13, 12, 13, 16, 12, 16, 13, 16, 13, 12, - 16, 16, 14, 16, 16, 16, 14, 12, 12, 16, 14, 16, 11, 16, 13, 12, - 14, 16, 14, 16, 13, 16, 13, 12, 16, 16, 16, 16, 16, 16, 16, 13, - 12, 16, 13, 16, 12, 16, 13, 12, 13, 16, 13, 16, 12, 16, 13, 12, - 16, 16, 16, 16, 14, 16, 14, 12, 13, 16, 13, 16, 13, 16, 13, 13, - 13, 16, 12, 16, 12, 16, 12, 12, 14, 16, 13, 15, 13, 16, 12, 11, - ], - ], -]; - -const RV34_INTRA_SECONDPAT: &'static [[[u8; 108]; 2]; 5] = &[ - [ - [ - 0, 5, 10, 3, 6, 10, 7, 8, 9, 4, 6, 10, 6, 7, 9, 8, - 8, 9, 8, 8, 9, 8, 9, 9, 9, 9, 8, 3, 6, 10, 4, 6, - 10, 7, 7, 9, 5, 7, 10, 6, 7, 9, 7, 7, 8, 7, 8, 9, - 8, 8, 9, 8, 8, 7, 6, 8, 10, 6, 8, 10, 7, 8, 9, 7, - 8, 10, 7, 8, 10, 8, 8, 8, 8, 9, 9, 8, 8, 9, 9, 8, - 7, 7, 8, 9, 7, 8, 9, 7, 7, 7, 8, 8, 9, 7, 8, 9, - 7, 7, 7, 8, 8, 8, 7, 7, 7, 7, 6, 5, - ], [ - 0, 5, 11, 3, 6, 11, 8, 9, 11, 3, 6, 10, 6, 7, 11, 9, - 9, 11, 7, 9, 11, 9, 9, 11, 10, 10, 11, 2, 6, 10, 4, 7, - 10, 7, 9, 11, 4, 7, 11, 6, 7, 10, 9, 9, 11, 7, 9, 11, - 8, 9, 10, 10, 10, 10, 5, 8, 11, 6, 8, 11, 8, 9, 11, 6, - 8, 11, 7, 8, 11, 9, 9, 11, 8, 10, 11, 9, 9, 11, 10, 10, - 10, 8, 9, 11, 8, 9, 11, 9, 9, 10, 8, 9, 11, 8, 9, 11, - 9, 9, 10, 8, 9, 10, 9, 9, 10, 9, 9, 8, - ], - ], [ - [ - 0, 5, 10, 4, 6, 10, 7, 8, 10, 4, 6, 10, 6, 7, 9, 8, - 8, 9, 8, 8, 9, 8, 9, 9, 9, 9, 9, 2, 6, 10, 4, 6, - 10, 7, 7, 9, 5, 7, 10, 6, 7, 9, 7, 7, 9, 7, 8, 9, - 8, 8, 9, 9, 8, 8, 6, 8, 10, 6, 8, 10, 7, 8, 9, 6, - 8, 10, 7, 8, 10, 8, 8, 9, 8, 9, 10, 8, 8, 9, 9, 9, - 8, 8, 8, 10, 7, 8, 9, 7, 8, 8, 7, 8, 10, 7, 8, 9, - 7, 7, 8, 8, 8, 9, 8, 8, 8, 7, 7, 6, - ], [ - 0, 5, 12, 4, 7, 12, 8, 10, 13, 4, 7, 12, 6, 8, 12, 10, - 10, 12, 8, 9, 12, 10, 10, 12, 12, 12, 12, 1, 6, 12, 4, 7, - 12, 8, 9, 12, 4, 7, 12, 6, 8, 11, 9, 10, 12, 8, 9, 12, - 9, 10, 11, 11, 11, 12, 6, 8, 12, 7, 9, 12, 9, 10, 13, 6, - 9, 12, 8, 9, 12, 10, 10, 12, 9, 10, 12, 10, 10, 12, 12, 12, - 12, 8, 10, 12, 9, 10, 12, 10, 10, 12, 8, 10, 12, 9, 10, 12, - 10, 10, 11, 9, 10, 12, 10, 10, 11, 11, 10, 10, - ], - ], [ - [ - 0, 5, 10, 3, 6, 10, 7, 8, 11, 4, 6, 10, 6, 7, 10, 8, - 9, 10, 8, 8, 10, 9, 9, 10, 10, 10, 10, 2, 6, 10, 4, 6, - 10, 7, 8, 10, 4, 7, 10, 6, 7, 10, 8, 8, 10, 7, 8, 10, - 8, 8, 9, 10, 9, 9, 5, 8, 11, 6, 8, 10, 7, 9, 10, 6, - 8, 11, 7, 8, 10, 8, 8, 10, 8, 9, 11, 9, 9, 10, 10, 9, - 9, 8, 9, 10, 8, 9, 10, 8, 9, 10, 8, 9, 10, 8, 8, 10, - 8, 8, 9, 8, 9, 10, 8, 8, 9, 9, 8, 8, - ], [ - 0, 6, 13, 4, 7, 14, 9, 11, 14, 3, 7, 13, 7, 8, 13, 11, - 11, 14, 8, 10, 13, 10, 11, 13, 13, 13, 14, 1, 6, 12, 4, 8, - 13, 9, 10, 15, 4, 8, 13, 7, 8, 12, 11, 11, 14, 8, 10, 13, - 10, 10, 13, 13, 13, 14, 5, 9, 13, 7, 9, 13, 10, 11, 14, 6, - 10, 14, 8, 10, 14, 11, 11, 14, 9, 11, 14, 11, 11, 13, 13, 13, - 14, 9, 10, 14, 9, 11, 13, 11, 12, 14, 9, 11, 13, 9, 11, 14, - 11, 12, 13, 10, 12, 15, 11, 11, 13, 13, 12, 13, - ], - ], [ - [ - 0, 5, 11, 3, 6, 11, 7, 9, 12, 3, 6, 11, 6, 7, 11, 9, - 9, 11, 8, 9, 11, 9, 9, 11, 11, 11, 12, 2, 6, 11, 4, 6, - 11, 7, 9, 11, 4, 7, 11, 5, 7, 10, 9, 9, 11, 7, 8, 11, - 9, 9, 10, 11, 11, 11, 5, 8, 11, 6, 8, 11, 8, 9, 12, 6, - 8, 11, 7, 8, 11, 9, 9, 11, 8, 9, 12, 9, 9, 11, 11, 11, - 11, 8, 10, 12, 8, 10, 11, 9, 10, 12, 8, 10, 12, 8, 9, 12, - 10, 10, 12, 9, 10, 12, 9, 9, 11, 11, 10, 11, - ], [ - 0, 6, 13, 3, 8, 14, 10, 12, 16, 3, 8, 15, 7, 9, 15, 12, - 13, 15, 9, 11, 15, 11, 12, 16, 14, 16, 16, 1, 7, 13, 4, 8, - 14, 9, 11, 15, 4, 8, 14, 7, 9, 14, 12, 13, 15, 8, 10, 14, - 11, 11, 14, 16, 14, 16, 6, 9, 14, 7, 10, 14, 11, 13, 15, 7, - 10, 14, 9, 10, 13, 12, 12, 15, 10, 11, 14, 11, 11, 14, 14, 14, - 16, 9, 11, 14, 10, 11, 14, 13, 14, 15, 9, 12, 14, 10, 12, 16, - 13, 14, 16, 10, 13, 16, 12, 12, 14, 15, 14, 15, - ], - ], [ - [ - 0, 6, 12, 3, 7, 12, 9, 11, 13, 4, 7, 12, 6, 8, 12, 10, - 11, 13, 8, 10, 13, 10, 11, 13, 13, 13, 14, 1, 6, 12, 4, 7, - 12, 9, 10, 14, 4, 7, 12, 6, 7, 12, 10, 11, 13, 8, 9, 13, - 10, 10, 12, 13, 13, 14, 6, 9, 13, 7, 9, 13, 10, 12, 14, 7, - 9, 13, 8, 10, 13, 11, 11, 14, 9, 11, 13, 11, 11, 14, 13, 13, - 14, 10, 12, 14, 10, 12, 14, 12, 13, 15, 10, 12, 14, 10, 12, 14, - 12, 13, 15, 11, 13, 15, 12, 12, 15, 14, 14, 14, - ], [ - 0, 6, 16, 3, 8, 16, 10, 13, 16, 3, 8, 16, 7, 9, 16, 13, - 16, 16, 8, 10, 16, 11, 13, 16, 16, 16, 16, 1, 7, 14, 4, 8, - 16, 10, 12, 16, 4, 8, 13, 7, 9, 16, 13, 14, 16, 8, 10, 16, - 11, 11, 14, 16, 16, 16, 6, 9, 14, 8, 10, 14, 12, 16, 16, 6, - 10, 13, 9, 11, 16, 13, 14, 16, 9, 12, 16, 12, 11, 16, 16, 16, - 16, 10, 12, 16, 11, 12, 16, 16, 14, 16, 9, 12, 16, 11, 12, 16, - 16, 15, 16, 10, 13, 16, 12, 13, 16, 16, 16, 16, - ], - ], -]; - -const RV34_INTRA_THIRDPAT: &'static [[[u8; 108]; 2]; 5] = &[ - [ - [ - 0, 5, 10, 3, 6, 10, 7, 8, 10, 4, 7, 10, 6, 7, 10, 8, - 8, 10, 8, 9, 10, 9, 9, 10, 9, 9, 9, 2, 6, 10, 4, 7, - 10, 7, 8, 9, 5, 7, 10, 6, 7, 10, 8, 8, 9, 8, 9, 10, - 8, 8, 9, 9, 9, 8, 6, 8, 11, 6, 8, 10, 7, 8, 10, 6, - 8, 11, 7, 8, 10, 8, 8, 9, 8, 9, 10, 9, 9, 10, 9, 9, - 9, 7, 8, 10, 7, 8, 10, 7, 8, 8, 7, 8, 10, 7, 8, 9, - 7, 8, 8, 8, 8, 9, 8, 8, 8, 7, 7, 7, - ], [ - 0, 4, 10, 3, 6, 10, 7, 8, 11, 3, 6, 10, 5, 7, 10, 9, - 9, 11, 9, 10, 11, 9, 10, 11, 11, 11, 11, 2, 6, 10, 4, 6, - 10, 7, 8, 10, 4, 7, 10, 6, 7, 10, 8, 9, 10, 8, 9, 11, - 9, 9, 11, 10, 10, 11, 6, 8, 11, 6, 8, 11, 8, 9, 11, 7, - 9, 11, 7, 8, 11, 9, 9, 11, 9, 10, 12, 10, 10, 12, 11, 11, - 11, 8, 9, 11, 8, 9, 11, 9, 9, 11, 9, 10, 11, 9, 10, 11, - 9, 10, 11, 10, 11, 12, 10, 10, 12, 10, 10, 10, - ], - ], [ - [ - 0, 5, 10, 3, 6, 10, 7, 8, 10, 4, 7, 10, 6, 7, 10, 8, - 9, 10, 8, 9, 11, 8, 9, 10, 10, 10, 10, 2, 6, 10, 4, 6, - 10, 7, 8, 10, 4, 7, 10, 5, 7, 10, 8, 8, 10, 8, 9, 10, - 8, 9, 10, 9, 9, 9, 5, 7, 11, 6, 8, 11, 7, 8, 11, 6, - 8, 11, 7, 8, 10, 8, 9, 10, 8, 9, 11, 9, 9, 10, 10, 9, - 10, 7, 8, 10, 7, 8, 10, 8, 9, 10, 8, 9, 10, 8, 9, 10, - 8, 8, 10, 9, 9, 10, 9, 9, 10, 9, 9, 9, - ], [ - 0, 5, 11, 3, 6, 11, 8, 9, 12, 4, 7, 12, 6, 7, 12, 9, - 10, 13, 10, 11, 13, 10, 11, 14, 12, 13, 14, 1, 6, 11, 4, 7, - 11, 8, 9, 12, 5, 7, 11, 6, 8, 12, 9, 10, 13, 10, 11, 14, - 10, 11, 13, 12, 12, 14, 6, 8, 12, 7, 9, 13, 9, 10, 14, 7, - 10, 13, 8, 10, 12, 11, 11, 13, 11, 13, 14, 11, 12, 14, 13, 13, - 15, 9, 10, 12, 9, 11, 14, 10, 11, 14, 11, 11, 13, 10, 11, 13, - 11, 12, 14, 12, 14, 15, 13, 13, 14, 13, 13, 14, - ], - ], [ - [ - 0, 5, 11, 3, 6, 11, 7, 9, 11, 4, 6, 11, 5, 7, 10, 9, - 9, 11, 8, 9, 11, 9, 10, 11, 11, 11, 11, 2, 6, 10, 3, 6, - 10, 7, 9, 11, 4, 7, 10, 5, 7, 10, 8, 9, 11, 8, 9, 11, - 9, 9, 11, 11, 11, 11, 5, 8, 11, 6, 8, 11, 8, 10, 12, 6, - 8, 11, 7, 8, 11, 9, 10, 11, 9, 10, 12, 9, 10, 11, 11, 11, - 11, 8, 9, 11, 8, 10, 12, 9, 11, 12, 8, 10, 12, 9, 10, 12, - 10, 11, 12, 10, 11, 12, 10, 10, 11, 11, 11, 11, - ], [ - 0, 5, 13, 2, 7, 16, 9, 11, 16, 4, 8, 16, 7, 9, 16, 12, - 12, 16, 12, 16, 16, 12, 16, 16, 16, 16, 16, 1, 6, 13, 4, 8, - 16, 9, 11, 16, 6, 9, 16, 7, 10, 16, 13, 13, 16, 13, 15, 16, - 12, 16, 16, 16, 16, 16, 7, 9, 16, 8, 11, 15, 11, 13, 16, 10, - 12, 16, 10, 12, 16, 16, 13, 16, 16, 16, 16, 14, 16, 16, 16, 16, - 16, 12, 12, 16, 12, 16, 16, 16, 16, 16, 13, 14, 16, 12, 13, 16, - 16, 16, 16, 16, 16, 16, 14, 16, 16, 16, 16, 16, - ], - ], [ - [ - 0, 6, 11, 3, 7, 11, 8, 10, 12, 4, 7, 11, 6, 8, 11, 10, - 11, 12, 9, 10, 12, 10, 10, 12, 12, 12, 13, 1, 6, 11, 4, 7, - 11, 8, 10, 12, 4, 7, 11, 6, 8, 11, 10, 10, 12, 9, 10, 12, - 10, 10, 12, 13, 13, 13, 6, 8, 12, 7, 10, 12, 10, 12, 13, 7, - 9, 12, 8, 10, 12, 11, 11, 13, 11, 12, 14, 11, 11, 13, 13, 13, - 13, 9, 11, 13, 10, 12, 14, 12, 13, 15, 10, 12, 14, 11, 12, 14, - 13, 13, 14, 12, 13, 15, 13, 13, 14, 14, 14, 14, - ], [ - 0, 5, 16, 2, 6, 16, 10, 14, 16, 4, 8, 16, 7, 9, 16, 11, - 16, 16, 11, 16, 16, 16, 16, 16, 16, 16, 16, 1, 6, 12, 4, 8, - 12, 12, 12, 16, 6, 8, 16, 8, 10, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 12, 16, 16, 7, 10, 16, 8, 11, 14, 16, 16, 16, 10, - 12, 16, 10, 16, 16, 16, 12, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 12, 16, 16, 16, 16, 16, 16, 16, 16, 12, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - ], - ], [ - [ - 0, 5, 11, 3, 6, 11, 10, 10, 12, 3, 7, 11, 6, 8, 11, 11, - 11, 12, 10, 10, 12, 11, 11, 13, 14, 13, 14, 1, 6, 11, 4, 7, - 11, 10, 11, 13, 5, 7, 11, 7, 8, 11, 11, 11, 13, 10, 11, 13, - 11, 11, 12, 13, 13, 14, 7, 10, 12, 9, 11, 13, 12, 13, 14, 9, - 10, 13, 9, 10, 13, 12, 11, 13, 12, 13, 16, 12, 13, 13, 14, 14, - 14, 11, 14, 16, 12, 14, 15, 14, 13, 16, 13, 13, 15, 13, 14, 16, - 14, 13, 16, 13, 13, 16, 13, 14, 15, 15, 14, 15, - ], [ - 0, 4, 16, 2, 7, 16, 10, 16, 16, 4, 10, 16, 7, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 1, 6, 13, 4, 11, - 16, 16, 16, 16, 6, 10, 16, 8, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 8, 16, 16, 10, 16, 16, 16, 16, 16, 10, - 16, 16, 10, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - ], - ], -]; - -const RV34_INTRA_COEFFS: &'static [[u8; 32]; 5] = &[ - [ - 1, 3, 3, 4, 4, 5, 6, 6, 6, 7, 7, 7, 8, 8, 9, 9, - 9, 9, 10, 10, 10, 11, 11, 11, 10, 10, 10, 12, 13, 14, 15, 15, - ], [ - 1, 2, 3, 5, 5, 6, 6, 7, 7, 8, 8, 9, 10, 10, 10, 11, - 11, 11, 12, 12, 13, 13, 13, 13, 13, 13, 13, 14, 16, 16, 16, 16, - ], [ - 1, 2, 3, 4, 5, 6, 8, 8, 9, 9, 10, 10, 11, 12, 12, 12, - 13, 13, 14, 14, 14, 14, 16, 16, 14, 16, 16, 16, 14, 16, 16, 16, - ], [ - 1, 2, 3, 4, 5, 6, 8, 8, 9, 9, 10, 10, 11, 12, 12, 12, - 13, 13, 16, 16, 16, 16, 16, 16, 16, 16, 14, 12, 16, 16, 16, 16, - ], [ - 1, 2, 3, 4, 5, 7, 7, 8, 8, 9, 10, 10, 12, 11, 13, 12, - 15, 13, 14, 13, 12, 15, 14, 13, 12, 12, 10, 11, 16, 16, 16, 16, - ] -]; - -const RV34_INTER_CBPPAT: &'static [[u8; 1296]; 7] = &[ -[ - 7, 9, 9, 8, 9, 8, 9, 8, 9, 9, 8, 8, 8, 8, 8, 4, - 7, 10, 11, 10, 11, 10, 12, 10, 12, 11, 11, 10, 11, 10, 10, 7, - 10, 11, 15, 12, 15, 12, 15, 12, 15, 14, 14, 12, 14, 12, 14, 9, - 7, 11, 10, 10, 12, 11, 11, 10, 11, 12, 10, 10, 11, 10, 10, 7, - 8, 12, 12, 11, 13, 12, 12, 10, 13, 13, 12, 10, 12, 11, 11, 7, - 11, 13, 15, 11, 15, 13, 15, 12, 16, 14, 14, 12, 15, 13, 13, 9, - 10, 15, 11, 12, 15, 14, 14, 12, 15, 15, 12, 12, 14, 14, 12, 9, - 11, 15, 13, 12, 16, 15, 14, 12, 15, 15, 13, 12, 15, 14, 13, 9, - 13, 15, 14, 10, 16, 15, 16, 11, 16, 16, 15, 12, 16, 15, 15, 9, - 7, 11, 11, 11, 11, 10, 11, 10, 11, 12, 11, 10, 10, 10, 10, 7, - 9, 12, 13, 12, 12, 11, 13, 10, 13, 13, 12, 11, 12, 10, 11, 7, - 12, 13, 16, 14, 15, 12, 16, 12, 16, 15, 15, 13, 15, 12, 14, 9, - 9, 13, 13, 12, 13, 12, 13, 11, 13, 13, 12, 11, 12, 11, 11, 7, - 9, 13, 13, 12, 13, 12, 13, 11, 13, 13, 13, 11, 12, 11, 11, 7, - 12, 14, 15, 13, 16, 13, 15, 11, 16, 14, 15, 12, 15, 12, 13, 8, - 12, 16, 14, 14, 16, 15, 15, 13, 16, 15, 14, 13, 15, 14, 13, 9, - 12, 15, 14, 13, 15, 14, 15, 12, 16, 15, 14, 12, 14, 13, 13, 8, - 13, 16, 16, 12, 16, 14, 16, 11, 16, 16, 15, 12, 16, 14, 14, 8, - 10, 15, 15, 15, 12, 12, 14, 12, 14, 15, 15, 14, 12, 12, 13, 9, - 11, 15, 16, 14, 13, 12, 15, 12, 16, 15, 15, 14, 14, 12, 13, 9, - 14, 15, 16, 16, 15, 11, 16, 12, 16, 16, 16, 15, 16, 12, 15, 9, - 12, 16, 16, 15, 14, 14, 14, 13, 16, 16, 15, 14, 14, 13, 13, 9, - 12, 15, 15, 14, 14, 13, 15, 12, 16, 15, 14, 13, 14, 13, 13, 8, - 13, 16, 16, 15, 16, 12, 16, 11, 16, 16, 16, 14, 16, 13, 14, 8, - 14, 16, 16, 16, 16, 16, 15, 14, 16, 16, 16, 15, 16, 15, 14, 11, - 13, 16, 16, 15, 16, 15, 15, 12, 16, 16, 16, 14, 15, 14, 14, 9, - 14, 16, 16, 13, 16, 14, 16, 10, 16, 16, 16, 13, 16, 14, 14, 8, - 7, 12, 11, 11, 11, 11, 12, 10, 11, 11, 10, 10, 10, 10, 10, 7, - 9, 13, 13, 12, 13, 12, 13, 11, 13, 13, 12, 11, 12, 11, 11, 8, - 12, 14, 16, 14, 16, 14, 16, 13, 16, 14, 15, 13, 15, 13, 14, 9, - 9, 13, 12, 12, 13, 12, 13, 11, 12, 13, 11, 10, 12, 11, 11, 7, - 9, 13, 13, 12, 13, 12, 13, 11, 13, 13, 12, 11, 12, 11, 11, 7, - 12, 14, 16, 13, 16, 14, 15, 12, 15, 15, 14, 12, 15, 13, 13, 8, - 11, 15, 13, 14, 15, 15, 14, 13, 15, 15, 12, 12, 14, 14, 12, 9, - 11, 15, 14, 13, 15, 14, 14, 12, 15, 14, 13, 11, 14, 13, 12, 8, - 13, 16, 15, 12, 16, 15, 16, 12, 16, 16, 14, 11, 15, 14, 14, 8, - 8, 13, 13, 12, 12, 12, 13, 11, 12, 13, 12, 11, 11, 10, 10, 7, - 9, 13, 14, 12, 13, 12, 13, 11, 13, 13, 13, 11, 12, 11, 11, 7, - 12, 14, 16, 14, 15, 13, 15, 12, 15, 15, 15, 13, 14, 12, 13, 8, - 9, 13, 13, 12, 13, 12, 13, 11, 13, 13, 12, 11, 12, 11, 11, 7, - 9, 13, 12, 12, 13, 12, 12, 10, 13, 13, 12, 10, 12, 10, 10, 6, - 11, 14, 14, 12, 14, 12, 14, 11, 14, 14, 13, 11, 13, 11, 12, 7, - 12, 16, 14, 14, 15, 15, 14, 13, 15, 15, 13, 12, 14, 13, 12, 8, - 11, 14, 13, 12, 14, 13, 13, 11, 14, 14, 13, 11, 13, 12, 11, 7, - 11, 14, 14, 12, 15, 13, 14, 11, 15, 14, 13, 11, 14, 12, 12, 6, - 11, 16, 15, 15, 13, 14, 15, 13, 14, 15, 15, 13, 12, 12, 12, 9, - 12, 15, 15, 14, 14, 13, 15, 12, 15, 15, 14, 13, 13, 11, 12, 8, - 13, 16, 16, 15, 16, 13, 16, 13, 16, 16, 15, 14, 14, 12, 14, 8, - 11, 16, 15, 14, 14, 14, 14, 13, 15, 15, 14, 13, 13, 12, 12, 8, - 11, 14, 14, 13, 13, 12, 14, 11, 14, 14, 13, 12, 12, 11, 11, 7, - 12, 14, 15, 13, 14, 12, 14, 11, 15, 14, 14, 12, 13, 11, 12, 7, - 13, 16, 16, 16, 16, 15, 16, 14, 16, 16, 15, 14, 15, 14, 13, 9, - 12, 15, 14, 13, 15, 13, 14, 12, 15, 15, 13, 12, 13, 12, 12, 7, - 11, 15, 14, 12, 14, 13, 14, 10, 15, 14, 13, 11, 13, 11, 11, 5, - 10, 15, 15, 15, 15, 14, 15, 13, 12, 14, 12, 12, 12, 13, 12, 9, - 12, 16, 16, 15, 16, 15, 16, 14, 14, 15, 14, 13, 14, 13, 13, 9, - 14, 16, 16, 16, 16, 16, 16, 15, 16, 16, 16, 14, 16, 14, 15, 11, - 11, 15, 15, 14, 15, 15, 15, 14, 14, 15, 12, 12, 13, 13, 12, 9, - 12, 15, 15, 14, 16, 14, 15, 13, 14, 14, 13, 12, 14, 13, 12, 8, - 13, 16, 16, 15, 16, 16, 16, 14, 16, 16, 15, 12, 16, 14, 14, 9, - 13, 16, 14, 16, 16, 16, 16, 15, 15, 16, 11, 12, 16, 15, 12, 9, - 13, 16, 15, 14, 16, 15, 16, 14, 15, 16, 12, 11, 15, 14, 13, 8, - 13, 16, 16, 13, 16, 16, 16, 13, 16, 16, 13, 11, 16, 14, 14, 8, - 11, 15, 15, 15, 14, 14, 15, 13, 13, 15, 14, 13, 12, 12, 12, 9, - 11, 15, 16, 14, 15, 14, 15, 13, 14, 14, 14, 13, 13, 12, 13, 8, - 13, 16, 16, 16, 16, 15, 16, 14, 16, 16, 16, 13, 15, 12, 14, 9, - 11, 16, 15, 14, 14, 14, 15, 13, 14, 14, 13, 12, 13, 12, 11, 8, - 11, 14, 14, 13, 14, 13, 14, 12, 13, 13, 12, 11, 12, 11, 11, 7, - 12, 15, 15, 13, 15, 14, 15, 12, 15, 14, 14, 11, 13, 12, 12, 7, - 13, 16, 15, 15, 16, 16, 16, 14, 15, 16, 12, 12, 14, 14, 12, 8, - 11, 15, 14, 13, 15, 13, 14, 12, 14, 14, 12, 11, 13, 12, 11, 6, - 11, 14, 14, 12, 15, 13, 14, 11, 15, 14, 12, 10, 13, 11, 11, 5, - 12, 16, 16, 16, 15, 15, 16, 15, 14, 16, 15, 15, 10, 12, 12, 9, - 13, 16, 16, 16, 15, 14, 16, 13, 15, 15, 15, 14, 12, 11, 13, 8, - 14, 16, 16, 16, 16, 14, 16, 13, 16, 16, 16, 14, 14, 11, 14, 8, - 13, 16, 16, 15, 15, 15, 15, 14, 15, 16, 14, 13, 12, 12, 11, 8, - 11, 15, 15, 13, 14, 13, 14, 12, 14, 14, 13, 12, 12, 11, 11, 6, - 11, 15, 15, 13, 15, 12, 14, 11, 14, 14, 13, 11, 12, 10, 11, 5, - 13, 16, 16, 15, 16, 16, 16, 14, 16, 16, 14, 14, 14, 13, 11, 8, - 11, 14, 14, 13, 14, 13, 14, 11, 14, 14, 12, 11, 12, 11, 10, 5, - 10, 13, 13, 11, 13, 12, 13, 9, 13, 13, 12, 9, 12, 10, 10, 3, -], [ - 5, 7, 7, 7, 7, 7, 8, 7, 7, 8, 7, 7, 7, 7, 7, 4, - 7, 9, 11, 9, 11, 9, 11, 9, 11, 10, 10, 9, 10, 9, 10, 6, - 11, 11, 14, 11, 14, 11, 14, 11, 15, 13, 14, 12, 14, 12, 13, 9, - 6, 11, 10, 9, 11, 10, 11, 9, 11, 11, 9, 9, 10, 10, 9, 6, - 8, 11, 11, 10, 12, 11, 12, 10, 12, 12, 11, 10, 12, 11, 11, 7, - 11, 13, 14, 11, 15, 13, 15, 11, 15, 14, 14, 12, 14, 13, 13, 9, - 10, 14, 11, 11, 15, 14, 13, 12, 14, 14, 11, 11, 14, 13, 12, 9, - 11, 14, 13, 11, 15, 14, 14, 11, 15, 15, 13, 11, 14, 14, 13, 9, - 12, 14, 14, 10, 16, 15, 16, 11, 16, 16, 15, 11, 16, 15, 14, 9, - 6, 10, 11, 10, 10, 9, 11, 9, 10, 11, 10, 10, 9, 9, 9, 6, - 9, 12, 12, 11, 12, 10, 12, 10, 12, 12, 12, 11, 11, 10, 11, 7, - 12, 13, 15, 13, 14, 11, 15, 11, 15, 15, 14, 13, 14, 12, 14, 9, - 9, 12, 12, 11, 12, 11, 12, 11, 12, 13, 11, 11, 12, 11, 11, 7, - 9, 12, 12, 11, 13, 11, 12, 10, 13, 13, 12, 11, 12, 11, 11, 7, - 12, 14, 15, 12, 15, 12, 14, 11, 15, 15, 14, 12, 14, 13, 13, 8, - 12, 15, 14, 13, 15, 14, 14, 13, 16, 16, 14, 13, 15, 14, 13, 9, - 12, 15, 14, 13, 15, 14, 14, 12, 15, 15, 13, 12, 14, 13, 13, 9, - 13, 15, 15, 12, 16, 14, 15, 11, 16, 16, 15, 12, 15, 14, 14, 9, - 10, 14, 14, 14, 12, 11, 13, 12, 14, 15, 14, 13, 12, 11, 12, 9, - 12, 14, 15, 14, 13, 11, 14, 12, 15, 15, 15, 14, 13, 11, 13, 9, - 13, 15, 16, 15, 14, 11, 16, 11, 16, 16, 16, 14, 15, 12, 15, 9, - 12, 15, 15, 14, 14, 14, 14, 13, 15, 15, 14, 14, 14, 13, 13, 9, - 12, 15, 15, 14, 14, 13, 14, 12, 15, 15, 14, 13, 14, 13, 13, 9, - 13, 15, 16, 14, 15, 13, 16, 11, 16, 16, 15, 14, 15, 13, 14, 9, - 14, 16, 16, 16, 16, 16, 15, 14, 16, 16, 16, 16, 16, 16, 14, 11, - 14, 16, 16, 14, 16, 15, 15, 12, 16, 16, 16, 14, 15, 14, 14, 9, - 14, 16, 16, 14, 16, 14, 16, 11, 16, 16, 16, 14, 16, 14, 14, 9, - 6, 11, 10, 10, 10, 10, 11, 10, 10, 11, 9, 9, 9, 9, 9, 6, - 9, 12, 12, 11, 13, 11, 13, 11, 12, 12, 11, 11, 12, 11, 11, 7, - 12, 14, 16, 13, 16, 14, 16, 13, 15, 14, 15, 12, 15, 13, 14, 9, - 8, 12, 11, 11, 12, 12, 12, 11, 11, 12, 10, 10, 11, 11, 10, 7, - 9, 12, 12, 11, 13, 12, 13, 11, 13, 12, 11, 10, 12, 11, 11, 7, - 12, 14, 15, 12, 15, 14, 15, 12, 15, 14, 14, 12, 14, 13, 13, 9, - 11, 15, 13, 13, 15, 14, 14, 13, 14, 15, 11, 11, 14, 14, 12, 9, - 11, 14, 13, 12, 15, 14, 14, 12, 14, 14, 12, 11, 14, 13, 12, 8, - 13, 15, 15, 12, 16, 15, 15, 12, 15, 15, 14, 11, 15, 14, 14, 8, - 8, 12, 12, 11, 11, 11, 12, 11, 11, 12, 11, 11, 10, 10, 10, 7, - 9, 13, 13, 12, 13, 11, 13, 11, 12, 13, 12, 11, 11, 10, 11, 7, - 12, 14, 15, 14, 15, 13, 15, 12, 15, 14, 14, 13, 14, 12, 13, 9, - 9, 13, 12, 12, 12, 12, 12, 11, 12, 13, 11, 11, 11, 11, 10, 7, - 9, 12, 12, 11, 12, 11, 12, 10, 12, 12, 11, 10, 11, 10, 10, 7, - 11, 13, 14, 12, 14, 12, 14, 11, 14, 13, 13, 11, 13, 11, 12, 7, - 12, 15, 14, 13, 15, 14, 14, 13, 15, 15, 13, 12, 13, 13, 12, 9, - 11, 14, 13, 12, 14, 13, 13, 11, 14, 14, 12, 11, 13, 12, 11, 7, - 11, 14, 14, 12, 14, 13, 14, 11, 14, 14, 13, 11, 13, 12, 12, 7, - 11, 15, 15, 14, 13, 13, 14, 13, 14, 15, 14, 13, 11, 11, 12, 9, - 12, 15, 15, 14, 14, 12, 14, 12, 14, 14, 14, 13, 12, 11, 12, 8, - 13, 16, 16, 15, 15, 12, 16, 13, 16, 15, 15, 14, 14, 12, 14, 9, - 12, 15, 15, 14, 14, 14, 14, 13, 15, 15, 14, 13, 12, 12, 12, 9, - 11, 14, 14, 13, 13, 12, 13, 11, 14, 13, 13, 12, 12, 11, 11, 7, - 12, 14, 15, 13, 14, 12, 14, 11, 15, 14, 13, 12, 13, 11, 12, 7, - 13, 16, 16, 15, 16, 15, 15, 14, 16, 16, 15, 14, 14, 14, 12, 9, - 12, 15, 14, 13, 14, 13, 14, 12, 15, 14, 13, 12, 13, 12, 12, 8, - 12, 14, 14, 13, 15, 13, 14, 11, 14, 14, 13, 12, 13, 12, 12, 6, - 10, 14, 14, 13, 14, 14, 14, 13, 12, 13, 12, 12, 12, 12, 11, 9, - 12, 15, 15, 14, 15, 14, 16, 14, 14, 14, 13, 12, 14, 13, 13, 9, - 14, 16, 16, 16, 16, 16, 16, 15, 16, 16, 16, 14, 16, 14, 16, 11, - 11, 15, 14, 14, 15, 14, 14, 14, 13, 14, 11, 12, 13, 13, 12, 9, - 12, 15, 14, 14, 15, 14, 15, 13, 14, 14, 13, 12, 14, 13, 13, 9, - 13, 16, 16, 14, 16, 15, 16, 14, 16, 15, 15, 12, 16, 14, 14, 9, - 13, 16, 14, 15, 16, 16, 16, 14, 14, 16, 11, 12, 15, 14, 12, 9, - 13, 16, 15, 14, 16, 15, 16, 14, 15, 15, 12, 11, 15, 14, 13, 9, - 14, 16, 16, 13, 16, 16, 16, 14, 16, 15, 13, 11, 16, 14, 14, 9, - 11, 15, 15, 14, 14, 14, 14, 13, 13, 14, 13, 13, 11, 11, 11, 9, - 12, 15, 15, 14, 15, 14, 15, 13, 14, 14, 13, 13, 13, 12, 12, 9, - 13, 16, 16, 16, 16, 14, 16, 14, 16, 15, 16, 14, 15, 12, 14, 9, - 11, 15, 14, 14, 15, 14, 14, 13, 14, 14, 12, 12, 12, 12, 11, 8, - 11, 14, 14, 13, 14, 13, 13, 12, 13, 13, 12, 11, 12, 11, 11, 7, - 12, 14, 15, 13, 15, 13, 14, 13, 14, 14, 13, 12, 13, 12, 12, 8, - 13, 16, 15, 15, 16, 15, 15, 14, 15, 16, 12, 12, 14, 14, 11, 9, - 12, 15, 14, 13, 15, 13, 14, 12, 14, 14, 12, 11, 13, 12, 11, 7, - 12, 14, 14, 13, 15, 13, 14, 12, 15, 14, 13, 10, 13, 12, 12, 6, - 12, 16, 16, 15, 14, 14, 15, 14, 13, 15, 14, 14, 10, 11, 11, 9, - 13, 16, 16, 15, 15, 14, 15, 14, 15, 15, 15, 14, 12, 11, 12, 8, - 14, 16, 16, 16, 16, 14, 16, 14, 16, 15, 15, 14, 14, 11, 14, 8, - 12, 16, 16, 15, 15, 14, 15, 14, 14, 16, 14, 14, 12, 12, 11, 8, - 11, 14, 14, 13, 14, 13, 14, 12, 14, 14, 13, 12, 12, 11, 11, 7, - 12, 14, 15, 13, 14, 13, 14, 12, 14, 14, 13, 12, 13, 11, 12, 6, - 14, 16, 16, 16, 16, 16, 15, 14, 16, 16, 14, 13, 13, 13, 11, 8, - 12, 15, 15, 13, 15, 13, 14, 12, 14, 14, 13, 12, 13, 12, 10, 6, - 11, 14, 13, 12, 14, 12, 13, 10, 14, 13, 12, 10, 12, 10, 10, 4, -], [ - 4, 6, 6, 6, 6, 6, 7, 6, 6, 7, 6, 6, 6, 6, 6, 3, - 6, 9, 10, 9, 10, 9, 11, 9, 10, 10, 10, 9, 10, 9, 10, 6, - 10, 11, 14, 11, 14, 11, 14, 11, 14, 13, 14, 11, 14, 11, 13, 9, - 6, 10, 9, 9, 10, 10, 10, 9, 10, 11, 9, 9, 10, 10, 9, 6, - 8, 11, 11, 9, 12, 11, 12, 10, 12, 12, 11, 10, 12, 11, 11, 7, - 11, 13, 14, 11, 15, 13, 15, 11, 15, 14, 14, 11, 15, 13, 14, 9, - 10, 13, 11, 11, 14, 14, 13, 11, 14, 14, 11, 11, 13, 13, 11, 9, - 11, 14, 12, 11, 15, 14, 14, 11, 15, 15, 13, 11, 14, 14, 13, 9, - 12, 14, 13, 10, 16, 15, 16, 11, 16, 16, 14, 11, 16, 14, 14, 9, - 6, 10, 10, 10, 9, 9, 10, 9, 10, 11, 10, 10, 9, 9, 9, 6, - 8, 11, 12, 11, 11, 10, 12, 10, 12, 12, 12, 11, 11, 10, 11, 7, - 11, 13, 15, 13, 14, 11, 15, 11, 15, 14, 14, 13, 14, 12, 14, 9, - 8, 12, 12, 12, 12, 12, 12, 11, 12, 13, 11, 11, 11, 11, 11, 8, - 9, 12, 12, 11, 12, 12, 13, 11, 13, 13, 12, 11, 12, 11, 11, 8, - 11, 14, 15, 13, 14, 13, 15, 11, 15, 15, 14, 13, 15, 13, 14, 9, - 12, 16, 14, 14, 15, 15, 14, 12, 15, 16, 14, 13, 14, 14, 13, 10, - 11, 15, 14, 13, 15, 14, 15, 12, 15, 16, 14, 13, 15, 14, 13, 9, - 13, 15, 15, 12, 16, 15, 16, 12, 16, 16, 15, 13, 15, 14, 14, 9, - 10, 14, 14, 14, 11, 11, 13, 11, 14, 14, 14, 13, 11, 11, 11, 9, - 11, 14, 15, 14, 13, 11, 14, 12, 15, 15, 15, 14, 13, 11, 13, 9, - 13, 14, 16, 15, 14, 11, 16, 12, 16, 16, 16, 14, 15, 12, 15, 10, - 12, 16, 15, 15, 14, 14, 14, 12, 16, 16, 14, 14, 14, 13, 13, 10, - 12, 15, 15, 14, 14, 13, 14, 12, 15, 16, 14, 14, 14, 13, 13, 9, - 13, 16, 16, 14, 16, 13, 16, 12, 16, 16, 16, 14, 16, 13, 15, 10, - 14, 16, 16, 16, 16, 16, 15, 14, 16, 16, 16, 16, 16, 16, 14, 11, - 13, 16, 16, 15, 16, 16, 16, 13, 16, 16, 16, 15, 16, 15, 14, 10, - 14, 16, 16, 14, 16, 14, 16, 12, 16, 16, 16, 15, 16, 15, 15, 10, - 6, 10, 10, 10, 10, 10, 11, 10, 9, 10, 9, 9, 9, 9, 9, 6, - 9, 12, 12, 11, 12, 11, 13, 11, 12, 12, 11, 10, 12, 11, 11, 8, - 12, 14, 15, 14, 15, 14, 16, 13, 15, 14, 14, 12, 15, 13, 14, 10, - 8, 12, 11, 11, 12, 12, 12, 11, 11, 12, 10, 10, 11, 11, 10, 7, - 9, 12, 12, 11, 13, 12, 13, 11, 12, 13, 11, 10, 12, 12, 11, 8, - 11, 14, 14, 13, 15, 14, 15, 13, 15, 14, 14, 12, 15, 13, 14, 9, - 11, 15, 12, 13, 15, 15, 14, 13, 14, 15, 11, 11, 14, 14, 12, 9, - 11, 14, 13, 13, 15, 14, 15, 13, 15, 15, 13, 11, 15, 14, 13, 9, - 13, 15, 15, 12, 16, 15, 16, 13, 16, 15, 14, 11, 16, 15, 14, 9, - 8, 12, 12, 11, 11, 11, 12, 11, 11, 12, 11, 11, 9, 10, 10, 7, - 9, 12, 13, 12, 12, 11, 13, 11, 12, 13, 12, 12, 11, 11, 11, 8, - 12, 14, 15, 14, 15, 13, 16, 13, 15, 14, 15, 13, 14, 12, 14, 9, - 9, 13, 12, 12, 12, 12, 13, 12, 12, 13, 11, 11, 11, 11, 10, 8, - 9, 12, 12, 12, 12, 12, 13, 11, 12, 13, 11, 11, 12, 11, 11, 7, - 11, 13, 14, 13, 14, 13, 15, 12, 14, 14, 14, 12, 14, 12, 13, 8, - 12, 15, 14, 14, 15, 15, 14, 13, 15, 16, 13, 13, 14, 14, 12, 9, - 11, 14, 13, 13, 14, 14, 14, 12, 14, 15, 13, 12, 14, 13, 12, 8, - 11, 14, 14, 13, 15, 14, 15, 12, 15, 15, 14, 12, 14, 13, 13, 8, - 11, 14, 14, 14, 13, 13, 14, 13, 13, 14, 14, 13, 11, 11, 11, 9, - 11, 15, 15, 14, 14, 13, 15, 13, 14, 15, 14, 14, 13, 11, 13, 9, - 13, 16, 16, 16, 15, 13, 16, 13, 16, 16, 16, 15, 15, 12, 15, 10, - 11, 15, 15, 15, 14, 14, 14, 13, 15, 15, 14, 14, 13, 13, 12, 9, - 11, 14, 14, 13, 13, 13, 14, 12, 14, 14, 13, 13, 13, 12, 12, 8, - 12, 15, 15, 14, 15, 13, 15, 12, 15, 15, 14, 13, 14, 12, 13, 8, - 13, 16, 16, 16, 16, 16, 16, 14, 16, 16, 15, 15, 15, 15, 13, 10, - 12, 15, 15, 14, 15, 14, 15, 13, 15, 16, 14, 13, 14, 14, 13, 9, - 12, 15, 15, 14, 15, 14, 15, 12, 15, 15, 14, 13, 14, 13, 13, 8, - 10, 14, 13, 13, 14, 13, 14, 13, 11, 13, 11, 11, 11, 11, 11, 9, - 12, 15, 16, 14, 15, 14, 16, 14, 14, 14, 14, 13, 14, 13, 13, 10, - 14, 16, 16, 16, 16, 16, 16, 16, 16, 15, 16, 13, 16, 14, 16, 11, - 11, 15, 14, 14, 15, 14, 15, 14, 13, 14, 11, 12, 13, 13, 11, 9, - 12, 15, 15, 14, 15, 15, 16, 14, 14, 14, 13, 12, 14, 13, 13, 9, - 13, 16, 16, 15, 16, 16, 16, 15, 16, 15, 15, 12, 16, 14, 15, 10, - 12, 16, 14, 15, 16, 16, 16, 14, 14, 16, 11, 12, 14, 15, 12, 9, - 13, 16, 15, 14, 16, 16, 16, 14, 15, 16, 13, 12, 15, 15, 13, 9, - 14, 16, 16, 14, 16, 16, 16, 15, 16, 16, 14, 12, 16, 15, 15, 10, - 11, 14, 14, 14, 14, 14, 14, 13, 12, 14, 13, 13, 11, 11, 11, 9, - 11, 15, 15, 14, 14, 14, 16, 14, 14, 14, 14, 13, 13, 12, 13, 9, - 13, 16, 16, 16, 16, 15, 16, 15, 16, 15, 16, 14, 15, 13, 15, 10, - 11, 15, 15, 14, 14, 14, 15, 14, 14, 15, 13, 13, 12, 13, 11, 9, - 11, 14, 14, 13, 14, 14, 14, 13, 13, 14, 13, 12, 13, 12, 12, 8, - 12, 15, 15, 14, 16, 14, 16, 14, 15, 15, 15, 13, 14, 13, 14, 9, - 13, 16, 15, 16, 16, 16, 16, 15, 15, 16, 13, 13, 14, 14, 12, 9, - 12, 15, 14, 14, 15, 15, 15, 13, 14, 15, 13, 12, 14, 13, 12, 8, - 12, 15, 14, 14, 15, 15, 15, 13, 15, 15, 14, 12, 14, 13, 13, 8, - 12, 16, 15, 15, 13, 14, 15, 14, 13, 15, 14, 14, 10, 11, 11, 9, - 12, 16, 16, 15, 15, 14, 16, 14, 15, 15, 15, 14, 13, 12, 13, 9, - 14, 16, 16, 16, 16, 14, 16, 15, 16, 15, 16, 15, 14, 12, 15, 10, - 12, 16, 15, 15, 15, 15, 15, 14, 15, 16, 14, 14, 12, 13, 11, 9, - 11, 15, 15, 14, 14, 14, 15, 13, 14, 15, 14, 13, 13, 12, 12, 8, - 12, 15, 15, 14, 15, 14, 15, 13, 15, 15, 14, 13, 14, 12, 13, 8, - 14, 16, 16, 16, 16, 16, 16, 15, 16, 16, 14, 14, 14, 14, 11, 9, - 12, 15, 15, 14, 15, 15, 15, 13, 15, 15, 14, 13, 14, 13, 12, 8, - 11, 14, 14, 13, 14, 13, 14, 12, 13, 14, 13, 12, 13, 12, 12, 7, -], [ - 2, 6, 6, 5, 6, 6, 7, 6, 6, 7, 6, 6, 6, 6, 6, 3, - 6, 9, 10, 9, 10, 9, 11, 9, 10, 10, 10, 9, 10, 9, 10, 7, - 10, 11, 14, 11, 14, 11, 14, 11, 14, 13, 14, 12, 14, 12, 13, 9, - 6, 10, 9, 9, 10, 10, 10, 9, 10, 11, 9, 9, 10, 10, 9, 7, - 8, 11, 11, 9, 12, 11, 12, 10, 12, 12, 11, 10, 12, 11, 11, 8, - 11, 13, 14, 11, 16, 13, 15, 12, 16, 14, 14, 12, 15, 13, 14, 10, - 10, 13, 11, 11, 14, 14, 13, 11, 13, 14, 11, 11, 13, 13, 11, 9, - 11, 13, 13, 11, 15, 14, 14, 12, 15, 15, 13, 12, 15, 14, 13, 10, - 12, 14, 14, 11, 16, 15, 16, 12, 16, 16, 15, 12, 16, 15, 15, 10, - 6, 10, 10, 10, 9, 9, 10, 9, 10, 11, 10, 10, 9, 9, 9, 7, - 8, 11, 12, 11, 11, 10, 12, 10, 12, 12, 12, 11, 11, 10, 11, 8, - 12, 13, 16, 13, 14, 11, 16, 12, 16, 15, 15, 13, 14, 12, 14, 10, - 9, 13, 12, 12, 12, 12, 12, 11, 13, 13, 12, 12, 12, 12, 11, 8, - 10, 13, 13, 12, 13, 12, 13, 11, 14, 14, 13, 12, 13, 12, 12, 9, - 12, 14, 16, 13, 15, 13, 15, 12, 16, 16, 16, 13, 16, 14, 14, 10, - 12, 16, 14, 14, 16, 15, 14, 13, 16, 16, 14, 14, 15, 15, 13, 11, - 12, 16, 15, 14, 16, 15, 15, 12, 16, 16, 15, 14, 16, 15, 14, 10, - 14, 16, 16, 14, 16, 15, 16, 13, 16, 16, 16, 14, 16, 16, 15, 11, - 10, 14, 14, 13, 11, 11, 13, 12, 14, 14, 13, 13, 11, 11, 12, 9, - 12, 14, 16, 14, 13, 11, 14, 12, 16, 15, 15, 14, 14, 12, 13, 10, - 13, 14, 16, 15, 14, 11, 16, 12, 16, 16, 16, 15, 16, 13, 15, 11, - 12, 16, 15, 15, 14, 14, 14, 13, 16, 16, 15, 15, 14, 14, 13, 11, - 13, 16, 16, 15, 14, 14, 15, 13, 16, 16, 16, 15, 15, 14, 14, 11, - 14, 16, 16, 15, 16, 14, 16, 13, 16, 16, 16, 15, 16, 14, 15, 11, - 15, 16, 16, 16, 16, 16, 16, 14, 16, 16, 16, 16, 16, 16, 14, 12, - 15, 16, 16, 16, 16, 16, 16, 13, 16, 16, 16, 16, 16, 16, 15, 12, - 15, 16, 16, 15, 16, 15, 16, 13, 16, 16, 16, 16, 16, 16, 16, 11, - 6, 10, 10, 10, 10, 10, 11, 10, 9, 10, 9, 9, 9, 9, 9, 7, - 9, 12, 13, 12, 13, 12, 14, 12, 12, 12, 12, 11, 12, 11, 11, 8, - 12, 14, 16, 14, 16, 14, 16, 14, 15, 14, 15, 13, 16, 13, 14, 11, - 8, 12, 11, 11, 12, 12, 12, 11, 11, 12, 10, 10, 11, 11, 10, 8, - 10, 13, 13, 12, 14, 13, 14, 12, 13, 13, 12, 11, 13, 12, 12, 9, - 12, 15, 15, 13, 16, 15, 16, 14, 16, 15, 15, 12, 16, 14, 15, 10, - 11, 15, 13, 13, 16, 15, 14, 13, 14, 15, 11, 12, 14, 14, 12, 10, - 12, 16, 14, 13, 16, 16, 16, 14, 16, 15, 13, 12, 15, 15, 14, 10, - 14, 16, 16, 14, 16, 16, 16, 14, 16, 16, 15, 13, 16, 16, 15, 11, - 8, 12, 12, 12, 11, 11, 12, 11, 11, 12, 11, 11, 9, 10, 10, 8, - 10, 13, 14, 13, 13, 12, 14, 12, 13, 13, 13, 12, 12, 11, 12, 9, - 13, 15, 16, 15, 16, 14, 16, 14, 16, 15, 16, 14, 15, 13, 15, 11, - 10, 13, 13, 13, 13, 13, 13, 12, 13, 14, 12, 12, 12, 12, 11, 9, - 10, 13, 13, 13, 13, 13, 14, 12, 13, 14, 13, 12, 12, 12, 12, 9, - 12, 15, 15, 14, 16, 14, 16, 13, 16, 15, 15, 13, 15, 13, 14, 10, - 13, 16, 15, 15, 16, 16, 15, 14, 16, 16, 13, 14, 15, 15, 12, 10, - 12, 16, 14, 14, 16, 16, 15, 13, 16, 16, 14, 13, 15, 14, 13, 10, - 13, 16, 16, 14, 16, 15, 16, 13, 16, 16, 16, 13, 16, 15, 15, 10, - 11, 15, 15, 14, 13, 13, 14, 13, 13, 15, 14, 14, 11, 12, 12, 10, - 12, 15, 16, 15, 14, 13, 16, 14, 16, 15, 16, 14, 13, 12, 13, 10, - 14, 16, 16, 16, 16, 14, 16, 14, 16, 16, 16, 16, 16, 13, 16, 11, - 12, 16, 16, 16, 15, 15, 15, 14, 15, 16, 14, 14, 13, 14, 12, 10, - 12, 16, 16, 15, 15, 14, 16, 13, 16, 16, 15, 14, 14, 13, 13, 10, - 13, 16, 16, 15, 16, 14, 16, 13, 16, 16, 16, 15, 16, 14, 15, 10, - 15, 16, 16, 16, 16, 16, 16, 15, 16, 16, 16, 16, 16, 16, 13, 12, - 14, 16, 16, 16, 16, 16, 16, 14, 16, 16, 16, 15, 16, 15, 14, 11, - 14, 16, 16, 15, 16, 16, 16, 13, 16, 16, 16, 15, 16, 15, 14, 10, - 10, 14, 13, 13, 13, 13, 14, 13, 11, 13, 11, 11, 11, 11, 11, 9, - 12, 15, 16, 15, 16, 15, 16, 14, 14, 14, 14, 13, 14, 13, 14, 11, - 15, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 14, 16, 14, 16, 12, - 11, 15, 14, 14, 15, 15, 15, 14, 13, 14, 11, 12, 13, 13, 12, 10, - 13, 16, 15, 15, 16, 16, 16, 15, 15, 15, 13, 12, 15, 14, 13, 10, - 14, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 13, 16, 16, 16, 12, - 13, 16, 14, 15, 16, 16, 16, 15, 14, 16, 11, 12, 15, 15, 12, 10, - 14, 16, 16, 16, 16, 16, 16, 16, 16, 16, 13, 13, 16, 16, 14, 11, - 15, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 13, 16, 16, 16, 11, - 11, 15, 15, 14, 13, 14, 14, 14, 13, 14, 13, 13, 11, 12, 11, 10, - 12, 16, 16, 16, 16, 15, 16, 15, 15, 15, 15, 14, 13, 12, 14, 10, - 15, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 15, 16, 14, 16, 12, - 12, 16, 15, 15, 16, 16, 16, 14, 14, 15, 13, 13, 13, 13, 12, 10, - 12, 16, 16, 15, 15, 15, 16, 14, 14, 15, 14, 13, 14, 13, 13, 10, - 14, 16, 16, 16, 16, 16, 16, 15, 16, 16, 16, 14, 16, 14, 15, 11, - 14, 16, 16, 16, 16, 16, 16, 16, 16, 16, 14, 14, 15, 15, 12, 11, - 13, 16, 16, 15, 16, 16, 16, 14, 16, 16, 14, 13, 16, 14, 13, 10, - 14, 16, 16, 16, 16, 16, 16, 15, 16, 16, 16, 14, 16, 14, 15, 10, - 12, 16, 16, 15, 14, 15, 16, 14, 13, 15, 14, 14, 11, 12, 12, 10, - 13, 16, 16, 16, 16, 15, 16, 16, 16, 16, 16, 15, 13, 12, 14, 11, - 15, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 13, 16, 11, - 14, 16, 16, 16, 16, 16, 16, 15, 16, 16, 15, 15, 13, 14, 12, 11, - 13, 16, 16, 16, 16, 16, 16, 15, 16, 16, 16, 14, 14, 13, 13, 10, - 14, 16, 16, 16, 16, 16, 16, 15, 16, 16, 16, 15, 15, 14, 14, 10, - 15, 16, 16, 16, 16, 16, 16, 16, 16, 16, 15, 16, 15, 16, 13, 11, - 14, 16, 16, 16, 16, 16, 16, 14, 16, 16, 15, 14, 15, 14, 13, 10, - 12, 15, 15, 14, 15, 14, 16, 14, 14, 16, 15, 13, 14, 13, 13, 9, -], [ - 2, 5, 5, 5, 5, 5, 6, 6, 5, 6, 5, 6, 5, 6, 6, 4, - 6, 8, 10, 8, 10, 9, 11, 9, 10, 10, 10, 9, 10, 9, 10, 8, - 10, 11, 13, 11, 13, 11, 14, 11, 14, 13, 13, 12, 13, 12, 13, 10, - 6, 10, 8, 9, 10, 10, 10, 9, 10, 11, 9, 9, 10, 10, 9, 7, - 8, 11, 11, 10, 12, 11, 12, 10, 12, 12, 11, 10, 12, 12, 11, 9, - 11, 13, 14, 11, 15, 14, 15, 12, 16, 14, 14, 12, 15, 14, 14, 11, - 10, 13, 11, 11, 14, 13, 13, 12, 13, 14, 11, 11, 13, 13, 12, 10, - 11, 14, 13, 11, 16, 14, 14, 12, 15, 15, 14, 12, 15, 14, 14, 11, - 12, 14, 14, 11, 16, 16, 16, 13, 16, 16, 16, 13, 16, 16, 15, 12, - 6, 10, 10, 10, 8, 9, 10, 9, 10, 11, 10, 10, 9, 9, 9, 8, - 8, 11, 12, 12, 11, 10, 12, 11, 12, 12, 12, 12, 12, 11, 12, 9, - 11, 13, 16, 14, 14, 12, 15, 12, 16, 15, 16, 14, 14, 13, 14, 11, - 9, 13, 12, 12, 12, 12, 12, 11, 13, 13, 12, 12, 12, 12, 11, 10, - 10, 13, 13, 12, 13, 12, 13, 11, 14, 14, 13, 13, 13, 13, 12, 10, - 13, 14, 16, 14, 15, 14, 16, 13, 16, 16, 16, 14, 16, 14, 15, 12, - 12, 16, 14, 14, 16, 15, 14, 13, 16, 16, 14, 14, 15, 15, 13, 12, - 13, 16, 15, 14, 16, 16, 15, 13, 16, 16, 15, 14, 16, 16, 14, 12, - 14, 16, 16, 14, 16, 16, 16, 14, 16, 16, 16, 16, 16, 16, 16, 12, - 10, 13, 14, 13, 11, 11, 13, 12, 13, 14, 13, 13, 11, 12, 12, 10, - 11, 14, 15, 15, 13, 12, 14, 13, 16, 16, 16, 15, 14, 13, 14, 11, - 12, 14, 16, 16, 14, 12, 16, 13, 16, 16, 16, 16, 15, 13, 16, 12, - 12, 16, 15, 16, 14, 15, 14, 14, 16, 16, 15, 16, 14, 14, 13, 12, - 13, 16, 16, 16, 16, 14, 16, 13, 16, 16, 16, 16, 16, 14, 15, 12, - 14, 16, 16, 16, 16, 14, 16, 14, 16, 16, 16, 16, 16, 15, 16, 13, - 15, 16, 16, 16, 16, 16, 16, 15, 16, 16, 16, 16, 16, 16, 15, 13, - 16, 16, 16, 16, 16, 16, 16, 15, 16, 16, 16, 16, 16, 16, 16, 13, - 15, 16, 16, 16, 16, 16, 16, 14, 16, 16, 16, 16, 16, 16, 16, 13, - 6, 10, 10, 10, 10, 10, 10, 10, 8, 10, 9, 9, 8, 9, 9, 7, - 9, 12, 13, 12, 13, 12, 13, 12, 12, 12, 12, 11, 12, 11, 12, 10, - 12, 14, 16, 14, 16, 14, 16, 14, 16, 15, 15, 14, 16, 14, 15, 12, - 8, 12, 11, 11, 12, 12, 12, 11, 11, 12, 10, 10, 11, 12, 10, 9, - 10, 13, 13, 12, 14, 13, 14, 12, 13, 13, 12, 11, 13, 13, 12, 10, - 13, 15, 16, 14, 16, 16, 16, 14, 16, 15, 15, 13, 16, 15, 15, 12, - 11, 15, 13, 13, 15, 15, 15, 14, 14, 14, 11, 12, 14, 14, 12, 11, - 13, 16, 14, 14, 16, 16, 16, 14, 16, 15, 13, 13, 16, 14, 14, 11, - 14, 16, 16, 14, 16, 16, 16, 15, 16, 16, 16, 14, 16, 16, 16, 12, - 8, 12, 12, 12, 11, 11, 12, 12, 11, 12, 11, 11, 9, 10, 10, 9, - 10, 13, 14, 13, 13, 12, 14, 13, 13, 13, 13, 13, 12, 11, 12, 10, - 13, 15, 16, 15, 16, 14, 16, 14, 16, 16, 16, 15, 16, 13, 15, 12, - 10, 14, 13, 13, 13, 13, 13, 13, 13, 14, 12, 12, 12, 12, 11, 10, - 10, 13, 13, 13, 13, 13, 14, 12, 13, 14, 13, 12, 13, 12, 12, 10, - 13, 16, 16, 14, 16, 15, 16, 14, 16, 16, 15, 14, 16, 14, 15, 11, - 13, 16, 15, 16, 16, 16, 15, 14, 16, 16, 14, 14, 15, 15, 13, 12, - 13, 16, 15, 14, 16, 16, 16, 14, 16, 16, 14, 14, 15, 15, 14, 11, - 14, 16, 16, 15, 16, 16, 16, 14, 16, 16, 16, 15, 16, 16, 15, 12, - 11, 14, 15, 14, 13, 13, 14, 14, 13, 15, 14, 14, 11, 12, 12, 11, - 13, 16, 16, 16, 14, 14, 16, 14, 16, 16, 16, 15, 14, 13, 14, 12, - 14, 16, 16, 16, 16, 14, 16, 16, 16, 16, 16, 16, 16, 14, 16, 13, - 13, 16, 16, 16, 15, 16, 15, 15, 16, 16, 15, 16, 14, 14, 13, 12, - 13, 16, 16, 15, 15, 14, 16, 14, 16, 16, 16, 15, 14, 14, 14, 11, - 14, 16, 16, 16, 16, 16, 16, 15, 16, 16, 16, 16, 16, 15, 16, 12, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 14, 13, - 15, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 15, 12, - 14, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 12, - 9, 13, 13, 13, 13, 13, 14, 13, 10, 12, 11, 12, 11, 12, 11, 10, - 12, 15, 16, 15, 16, 16, 16, 16, 14, 14, 14, 13, 14, 13, 14, 12, - 14, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 15, 16, 16, 16, 14, - 11, 15, 14, 14, 15, 14, 15, 14, 13, 14, 11, 12, 13, 13, 12, 11, - 13, 16, 16, 15, 16, 16, 16, 15, 15, 15, 14, 13, 16, 15, 14, 12, - 15, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 14, 16, 16, 16, 13, - 12, 16, 14, 15, 16, 16, 16, 16, 14, 16, 11, 13, 15, 16, 13, 12, - 14, 16, 16, 16, 16, 16, 16, 16, 16, 16, 14, 14, 16, 16, 15, 12, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 14, 16, 16, 16, 13, - 11, 15, 14, 14, 13, 14, 15, 14, 12, 14, 13, 13, 11, 12, 12, 11, - 13, 16, 16, 16, 16, 15, 16, 16, 15, 15, 15, 15, 14, 13, 14, 12, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 15, 16, 13, - 13, 16, 16, 16, 16, 16, 16, 15, 14, 16, 13, 14, 13, 14, 13, 11, - 13, 16, 16, 16, 16, 16, 16, 15, 15, 16, 15, 14, 14, 14, 14, 11, - 15, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 12, - 14, 16, 16, 16, 16, 16, 16, 16, 16, 16, 14, 15, 16, 16, 13, 12, - 14, 16, 16, 16, 16, 16, 16, 16, 16, 16, 14, 14, 16, 16, 15, 12, - 14, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 12, - 11, 16, 16, 15, 13, 15, 16, 15, 13, 15, 15, 15, 11, 12, 12, 11, - 14, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 14, 14, 15, 12, - 15, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 14, 16, 13, - 14, 16, 16, 16, 16, 16, 16, 16, 16, 16, 15, 16, 14, 14, 13, 12, - 14, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 14, 14, 14, 12, - 14, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 15, 16, 12, - 15, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 15, 16, 14, 13, - 14, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 15, 12, - 12, 14, 14, 14, 14, 15, 16, 14, 14, 16, 15, 14, 14, 15, 14, 11, -], [ - 1, 5, 5, 6, 5, 6, 7, 7, 5, 7, 6, 7, 5, 6, 6, 6, - 6, 9, 10, 9, 10, 9, 11, 10, 11, 11, 11, 10, 11, 10, 11, 9, - 10, 11, 14, 12, 14, 12, 16, 12, 16, 13, 16, 13, 14, 13, 16, 12, - 6, 10, 9, 9, 10, 11, 11, 10, 10, 11, 9, 10, 10, 11, 10, 9, - 8, 11, 11, 10, 13, 12, 13, 12, 13, 13, 12, 12, 13, 13, 13, 11, - 11, 13, 16, 12, 16, 16, 16, 13, 16, 16, 16, 14, 16, 16, 16, 13, - 10, 14, 11, 12, 14, 14, 13, 13, 13, 16, 12, 13, 14, 16, 13, 12, - 11, 14, 13, 12, 16, 16, 16, 14, 16, 16, 14, 14, 16, 16, 16, 13, - 12, 14, 16, 12, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 14, - 6, 10, 10, 11, 9, 9, 11, 10, 10, 11, 11, 11, 9, 10, 10, 9, - 9, 12, 13, 12, 12, 11, 13, 12, 13, 13, 13, 13, 12, 12, 13, 11, - 12, 13, 16, 16, 16, 13, 16, 14, 16, 16, 16, 16, 16, 14, 16, 13, - 9, 13, 13, 13, 13, 13, 13, 13, 13, 14, 13, 13, 13, 13, 12, 11, - 10, 14, 14, 13, 14, 13, 14, 13, 16, 16, 14, 15, 14, 14, 14, 12, - 13, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 13, - 13, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 14, - 13, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 14, - 14, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 10, 14, 14, 16, 11, 12, 14, 13, 14, 16, 16, 16, 12, 13, 13, 12, - 12, 16, 16, 16, 13, 13, 16, 14, 16, 16, 16, 16, 16, 14, 16, 13, - 13, 16, 16, 16, 16, 13, 16, 16, 16, 16, 16, 16, 16, 16, 16, 14, - 13, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 14, - 14, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 14, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 6, 10, 10, 10, 10, 11, 11, 11, 9, 11, 9, 10, 9, 10, 10, 9, - 9, 13, 13, 13, 13, 13, 14, 13, 12, 13, 13, 12, 13, 12, 13, 11, - 13, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 14, - 8, 13, 12, 12, 13, 13, 13, 13, 11, 13, 10, 12, 12, 13, 12, 11, - 10, 14, 13, 13, 16, 16, 16, 14, 14, 14, 13, 13, 14, 14, 14, 12, - 13, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 14, - 11, 16, 13, 16, 16, 16, 16, 16, 14, 16, 12, 13, 16, 16, 14, 13, - 13, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 14, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 8, 13, 13, 13, 11, 12, 13, 13, 11, 13, 12, 13, 10, 12, 12, 11, - 10, 14, 16, 16, 14, 13, 16, 14, 14, 16, 16, 14, 13, 13, 14, 12, - 14, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 14, - 10, 16, 14, 16, 14, 14, 14, 14, 13, 16, 13, 14, 13, 14, 12, 12, - 10, 14, 14, 14, 14, 16, 16, 14, 14, 16, 14, 14, 14, 14, 14, 12, - 13, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 14, - 13, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 14, - 13, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 14, - 14, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 11, 16, 16, 16, 13, 16, 16, 16, 14, 16, 16, 16, 12, 14, 14, 13, - 13, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 14, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 13, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 14, - 14, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 14, - 14, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 15, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 9, 14, 13, 14, 13, 14, 16, 16, 11, 13, 12, 13, 11, 13, 12, 12, - 13, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 14, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 11, 16, 14, 16, 16, 16, 16, 16, 13, 16, 12, 13, 14, 16, 13, 13, - 13, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 14, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 12, 16, 16, 16, 16, 16, 16, 16, 14, 16, 12, 16, 16, 16, 14, 14, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 11, 16, 16, 16, 14, 16, 16, 16, 13, 16, 14, 16, 12, 13, 13, 13, - 13, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 14, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 13, 16, 16, 16, 16, 16, 16, 16, 16, 16, 14, 16, 16, 16, 14, 14, - 13, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 14, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 14, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 14, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 11, 16, 16, 16, 14, 16, 16, 16, 14, 16, 16, 16, 12, 16, 14, 14, - 14, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 14, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 14, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 14, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 12, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 13, -], [ - 1, 5, 5, 6, 5, 6, 7, 8, 5, 7, 6, 8, 6, 7, 7, 7, - 5, 9, 10, 10, 10, 10, 12, 11, 10, 11, 11, 11, 10, 11, 12, 10, - 9, 11, 13, 12, 13, 12, 16, 14, 16, 14, 16, 16, 16, 13, 16, 13, - 5, 10, 9, 10, 10, 11, 11, 11, 10, 11, 9, 11, 10, 11, 11, 10, - 8, 11, 11, 11, 12, 13, 13, 13, 12, 13, 12, 12, 13, 13, 13, 12, - 11, 13, 16, 13, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 9, 14, 11, 12, 14, 16, 13, 14, 13, 16, 12, 14, 16, 16, 13, 13, - 11, 16, 13, 13, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 11, 14, 14, 13, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 5, 10, 11, 11, 9, 10, 11, 11, 10, 12, 11, 12, 9, 11, 11, 11, - 8, 12, 13, 13, 11, 11, 14, 13, 13, 14, 13, 16, 12, 12, 13, 12, - 11, 13, 16, 16, 16, 13, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 9, 13, 12, 13, 12, 13, 13, 14, 13, 16, 13, 16, 13, 16, 13, 13, - 10, 14, 13, 14, 13, 13, 16, 14, 16, 16, 16, 16, 16, 16, 16, 13, - 13, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 12, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 13, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 13, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 9, 14, 16, 16, 11, 12, 14, 16, 13, 16, 16, 16, 12, 14, 13, 13, - 11, 16, 16, 16, 13, 13, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 12, 16, 16, 16, 14, 13, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 12, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 13, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 13, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 5, 10, 10, 11, 10, 11, 12, 12, 8, 11, 10, 11, 9, 11, 11, 11, - 9, 12, 13, 13, 13, 13, 16, 16, 12, 13, 13, 13, 13, 13, 16, 13, - 12, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 8, 13, 11, 13, 12, 13, 13, 14, 11, 13, 10, 13, 12, 14, 12, 12, - 10, 14, 13, 14, 16, 16, 16, 16, 13, 16, 13, 14, 16, 16, 16, 14, - 13, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 11, 16, 13, 16, 16, 16, 16, 16, 13, 16, 12, 16, 16, 16, 16, 16, - 12, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 14, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 8, 13, 13, 13, 11, 13, 14, 16, 11, 13, 13, 14, 10, 12, 12, 12, - 10, 14, 16, 16, 13, 16, 16, 16, 13, 16, 16, 16, 13, 13, 16, 14, - 13, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 10, 16, 14, 16, 13, 16, 16, 16, 13, 16, 13, 16, 13, 16, 13, 14, - 10, 16, 16, 16, 14, 16, 16, 16, 14, 16, 16, 16, 13, 16, 16, 13, - 13, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 13, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 13, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 13, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 10, 16, 16, 16, 13, 16, 16, 16, 14, 16, 16, 16, 12, 16, 16, 16, - 13, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 13, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 13, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 13, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 13, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 9, 14, 13, 16, 13, 16, 16, 16, 10, 14, 12, 14, 11, 13, 13, 13, - 12, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 11, 16, 16, 16, 16, 16, 16, 16, 12, 16, 12, 16, 16, 16, 16, 16, - 13, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 11, 16, 16, 16, 16, 16, 16, 16, 13, 16, 13, 16, 16, 16, 16, 16, - 14, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 10, 16, 16, 16, 14, 16, 16, 16, 12, 16, 16, 16, 12, 16, 16, 16, - 13, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 12, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 13, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 14, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 13, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 14, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 11, 16, 16, 16, 14, 16, 16, 16, 14, 16, 16, 16, 12, 16, 16, 16, - 13, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 13, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 13, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 13, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 14, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 13, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 10, 16, 16, 16, 16, 16, 16, 16, 14, 16, 16, 16, 16, 16, 16, 14, -]]; - -const RV34_INTER_CBP: &[[[u8; 16]; 4]; 7] = &[ -[ - [ 0, 6, 6, 3, 6, 4, 5, 3, 6, 5, 4, 3, 3, 4, 4, 3 ], - [ 0, 6, 6, 4, 6, 4, 5, 3, 6, 5, 4, 3, 4, 4, 4, 2 ], - [ 0, 7, 7, 4, 7, 5, 5, 4, 7, 5, 5, 4, 5, 4, 4, 1 ], - [ 0, 7, 7, 5, 7, 5, 6, 4, 7, 6, 5, 3, 5, 4, 4, 1 ] -], [ - [ 0, 6, 6, 3, 6, 3, 5, 4, 6, 5, 3, 4, 3, 4, 4, 3 ], - [ 0, 6, 6, 4, 6, 4, 4, 4, 6, 4, 4, 3, 4, 4, 4, 2 ], - [ 0, 6, 6, 4, 6, 4, 5, 4, 6, 5, 4, 3, 4, 4, 3, 2 ], - [ 0, 7, 7, 5, 7, 5, 6, 4, 7, 6, 5, 3, 5, 4, 4, 1 ] -], [ - [ 0, 6, 6, 3, 6, 3, 5, 4, 6, 5, 3, 4, 3, 4, 4, 3 ], - [ 0, 5, 5, 3, 5, 4, 5, 4, 5, 5, 4, 4, 4, 4, 4, 2 ], - [ 0, 6, 6, 4, 6, 4, 5, 3, 6, 5, 4, 3, 4, 4, 4, 2 ], - [ 0, 7, 7, 5, 7, 5, 6, 4, 7, 6, 5, 3, 5, 4, 4, 1 ] -], [ - [ 0, 6, 6, 3, 6, 3, 5, 4, 6, 5, 3, 4, 3, 4, 4, 3 ], - [ 0, 5, 5, 3, 5, 4, 5, 4, 5, 5, 4, 4, 4, 4, 4, 2 ], - [ 0, 6, 6, 4, 6, 4, 5, 3, 6, 5, 4, 3, 4, 4, 4, 2 ], - [ 0, 7, 7, 4, 7, 5, 6, 4, 7, 6, 5, 4, 4, 4, 4, 1 ] -], [ - [ 0, 5, 5, 3, 5, 3, 5, 4, 5, 5, 3, 4, 3, 4, 4, 4 ], - [ 0, 5, 5, 3, 5, 4, 5, 4, 5, 5, 3, 4, 3, 4, 4, 3 ], - [ 0, 6, 6, 4, 6, 4, 5, 4, 6, 5, 4, 3, 4, 4, 3, 2 ], - [ 0, 7, 7, 4, 7, 5, 6, 4, 7, 6, 5, 4, 4, 4, 4, 1 ] -], [ - [ 0, 5, 5, 3, 5, 3, 5, 4, 5, 5, 3, 4, 3, 4, 4, 4 ], - [ 0, 5, 5, 3, 5, 4, 5, 4, 5, 5, 3, 4, 3, 4, 4, 3 ], - [ 0, 5, 5, 3, 5, 4, 4, 4, 5, 4, 4, 4, 3, 4, 4, 3 ], - [ 0, 6, 6, 4, 6, 4, 5, 4, 6, 5, 4, 3, 4, 4, 3, 2 ] -], [ - [ 0, 4, 4, 3, 4, 3, 5, 5, 4, 5, 3, 5, 3, 5, 4, 5 ], - [ 0, 4, 4, 3, 4, 4, 5, 4, 4, 5, 3, 5, 3, 5, 4, 4 ], - [ 0, 4, 4, 3, 4, 4, 5, 4, 4, 5, 4, 4, 3, 4, 4, 4 ], - [ 0, 4, 4, 3, 5, 4, 5, 4, 5, 5, 4, 4, 3, 4, 4, 3 ] -]]; - -const RV34_INTER_FIRSTPAT: &'static [[[u8; 864]; 2]; 7] = &[ - [ - [ - 0, 7, 5, 7, 5, 7, 6, 6, 7, 10, 7, 9, 8, 9, 8, 7, - 12, 14, 11, 12, 12, 12, 11, 9, 6, 9, 6, 8, 7, 9, 7, 7, - 8, 11, 8, 9, 9, 10, 9, 8, 13, 15, 12, 12, 12, 13, 11, 9, - 10, 13, 9, 10, 11, 12, 9, 8, 12, 14, 10, 11, 12, 13, 10, 9, - 16, 16, 12, 12, 14, 13, 11, 9, 6, 9, 7, 9, 7, 9, 8, 7, - 9, 11, 9, 10, 9, 10, 9, 8, 14, 16, 12, 12, 13, 13, 11, 9, - 8, 11, 8, 10, 9, 10, 9, 8, 10, 13, 10, 11, 10, 11, 9, 8, - 14, 16, 12, 12, 13, 13, 11, 9, 12, 14, 10, 11, 12, 13, 10, 9, - 13, 16, 11, 12, 13, 13, 10, 9, 16, 16, 13, 12, 14, 14, 11, 9, - 11, 13, 11, 12, 10, 11, 10, 9, 13, 14, 12, 12, 11, 12, 10, 9, - 16, 16, 13, 13, 13, 13, 11, 9, 12, 15, 12, 12, 11, 12, 10, 9, - 13, 16, 13, 13, 12, 12, 11, 9, 16, 16, 14, 13, 13, 13, 11, 9, - 14, 16, 13, 13, 13, 14, 11, 9, 16, 16, 13, 13, 14, 14, 11, 9, - 16, 16, 13, 13, 14, 13, 11, 8, 4, 9, 6, 8, 6, 9, 7, 7, - 8, 11, 8, 9, 9, 10, 8, 8, 13, 15, 12, 12, 13, 13, 11, 9, - 7, 10, 7, 9, 8, 10, 8, 8, 9, 12, 9, 10, 10, 11, 9, 8, - 14, 16, 12, 12, 13, 13, 11, 9, 11, 13, 9, 10, 11, 12, 9, 8, - 12, 14, 10, 11, 12, 13, 10, 9, 16, 16, 13, 12, 14, 14, 11, 9, - 7, 10, 8, 9, 8, 10, 8, 8, 10, 12, 10, 11, 10, 11, 9, 8, - 14, 16, 13, 13, 13, 13, 11, 9, 9, 12, 9, 10, 9, 11, 9, 8, - 11, 13, 10, 11, 10, 11, 10, 9, 15, 16, 13, 13, 13, 13, 11, 9, - 12, 14, 11, 11, 12, 13, 10, 9, 13, 16, 11, 12, 13, 13, 10, 9, - 16, 16, 12, 12, 14, 13, 11, 8, 11, 14, 11, 12, 10, 11, 10, 9, - 13, 15, 12, 13, 11, 12, 10, 9, 16, 16, 14, 13, 13, 13, 11, 9, - 12, 15, 12, 13, 11, 12, 10, 9, 13, 16, 13, 13, 12, 12, 11, 9, - 16, 16, 14, 13, 13, 13, 11, 9, 15, 16, 13, 13, 13, 13, 11, 9, - 16, 16, 13, 13, 13, 13, 11, 9, 16, 16, 13, 12, 13, 13, 10, 7, - 8, 11, 8, 10, 9, 11, 9, 9, 10, 13, 10, 11, 11, 12, 10, 9, - 15, 16, 13, 13, 14, 14, 12, 10, 9, 12, 9, 11, 10, 11, 9, 9, - 12, 14, 11, 11, 11, 12, 10, 9, 16, 16, 13, 13, 14, 14, 12, 10, - 12, 14, 10, 11, 12, 13, 10, 9, 14, 16, 11, 12, 13, 14, 10, 9, - 16, 16, 13, 13, 15, 14, 11, 9, 9, 12, 10, 11, 9, 11, 10, 9, - 12, 14, 11, 12, 11, 12, 10, 9, 16, 16, 14, 13, 14, 14, 12, 10, - 11, 14, 10, 12, 11, 12, 10, 9, 12, 15, 11, 12, 12, 13, 11, 10, - 16, 16, 14, 13, 14, 14, 12, 10, 13, 16, 11, 12, 13, 14, 11, 9, - 14, 16, 12, 12, 13, 14, 11, 9, 16, 16, 13, 13, 14, 14, 11, 9, - 12, 15, 12, 13, 10, 12, 10, 9, 14, 16, 13, 13, 11, 12, 11, 10, - 16, 16, 14, 14, 14, 13, 12, 9, 13, 16, 13, 13, 12, 13, 11, 10, - 14, 16, 13, 13, 12, 13, 11, 10, 16, 16, 14, 14, 13, 13, 12, 9, - 15, 16, 13, 13, 13, 14, 11, 9, 16, 16, 13, 13, 13, 14, 11, 9, - 16, 16, 13, 12, 13, 13, 10, 8, 10, 13, 10, 11, 10, 12, 10, 9, - 12, 14, 11, 12, 12, 13, 11, 10, 16, 16, 13, 13, 14, 14, 12, 9, - 11, 14, 10, 11, 11, 12, 10, 9, 13, 16, 11, 12, 12, 13, 11, 10, - 16, 16, 14, 13, 14, 14, 12, 9, 12, 15, 10, 11, 12, 13, 9, 8, - 14, 16, 11, 11, 13, 14, 10, 8, 16, 16, 12, 12, 14, 14, 10, 8, - 11, 14, 11, 12, 11, 12, 10, 9, 13, 16, 12, 13, 12, 13, 11, 10, - 16, 16, 14, 13, 14, 14, 12, 9, 12, 15, 11, 12, 11, 13, 10, 10, - 13, 16, 12, 13, 12, 13, 11, 10, 16, 16, 14, 13, 14, 14, 12, 9, - 13, 16, 11, 11, 13, 13, 10, 8, 14, 16, 11, 12, 13, 14, 10, 8, - 16, 16, 12, 12, 14, 14, 10, 8, 12, 15, 12, 13, 10, 11, 10, 9, - 14, 16, 13, 13, 11, 12, 10, 9, 16, 16, 14, 13, 13, 13, 11, 8, - 13, 16, 12, 13, 11, 12, 10, 9, 14, 16, 13, 13, 12, 12, 10, 9, - 16, 16, 14, 13, 13, 12, 10, 8, 14, 16, 12, 12, 12, 13, 10, 8, - 14, 16, 12, 12, 12, 13, 10, 7, 16, 16, 11, 11, 12, 11, 8, 5, - ], [ - 0, 7, 4, 8, 5, 8, 7, 8, 6, 10, 7, 10, 8, 10, 9, 9, - 13, 16, 12, 13, 13, 14, 12, 12, 4, 10, 6, 9, 8, 11, 8, 9, - 8, 12, 8, 11, 10, 12, 10, 10, 14, 16, 12, 13, 14, 15, 12, 12, - 9, 14, 9, 11, 12, 14, 11, 11, 11, 15, 10, 12, 13, 14, 11, 11, - 15, 16, 13, 14, 15, 16, 13, 12, 5, 10, 7, 10, 7, 10, 9, 9, - 8, 12, 9, 11, 10, 11, 10, 10, 14, 16, 13, 14, 14, 14, 12, 12, - 8, 12, 8, 11, 10, 12, 10, 10, 10, 14, 10, 12, 11, 13, 10, 11, - 15, 16, 13, 14, 14, 15, 13, 12, 11, 16, 10, 12, 13, 15, 11, 11, - 13, 16, 11, 13, 14, 15, 12, 12, 16, 16, 14, 14, 16, 16, 13, 12, - 11, 15, 11, 13, 11, 13, 11, 11, 13, 16, 12, 14, 12, 13, 12, 12, - 16, 16, 14, 15, 15, 15, 13, 12, 12, 16, 12, 14, 12, 14, 12, 12, - 14, 16, 13, 14, 13, 14, 12, 12, 16, 16, 14, 16, 16, 16, 13, 12, - 14, 16, 13, 14, 15, 16, 13, 12, 16, 16, 14, 15, 16, 16, 13, 12, - 16, 16, 15, 16, 16, 16, 13, 12, 2, 9, 5, 8, 6, 9, 8, 9, - 7, 11, 8, 10, 9, 11, 9, 10, 13, 16, 12, 13, 14, 14, 12, 12, - 5, 11, 6, 10, 9, 11, 9, 9, 9, 13, 9, 11, 10, 12, 10, 10, - 14, 16, 12, 14, 14, 15, 12, 12, 9, 14, 9, 11, 12, 14, 10, 11, - 11, 16, 10, 12, 13, 14, 11, 11, 16, 16, 13, 14, 15, 16, 13, 12, - 6, 11, 7, 10, 8, 11, 9, 9, 9, 13, 9, 11, 10, 12, 10, 10, - 14, 16, 13, 14, 14, 14, 12, 12, 8, 13, 8, 11, 10, 12, 10, 10, - 10, 13, 10, 12, 11, 13, 10, 11, 14, 16, 13, 14, 14, 15, 12, 12, - 11, 15, 10, 12, 13, 15, 11, 11, 12, 16, 11, 13, 13, 15, 12, 11, - 16, 16, 13, 14, 15, 16, 13, 12, 11, 15, 11, 13, 10, 13, 11, 11, - 13, 16, 12, 14, 12, 13, 12, 11, 16, 16, 14, 15, 15, 15, 13, 12, - 12, 16, 12, 13, 12, 14, 12, 12, 13, 16, 12, 14, 13, 14, 12, 12, - 16, 16, 14, 15, 15, 15, 13, 12, 14, 16, 13, 14, 15, 16, 12, 12, - 16, 16, 13, 14, 15, 16, 12, 12, 16, 16, 14, 15, 16, 16, 13, 12, - 6, 12, 7, 10, 9, 12, 9, 10, 9, 13, 9, 12, 11, 13, 11, 11, - 14, 16, 13, 14, 15, 15, 13, 12, 8, 13, 8, 11, 10, 13, 10, 10, - 10, 14, 10, 12, 12, 14, 11, 11, 15, 16, 13, 14, 16, 16, 13, 12, - 10, 15, 9, 12, 12, 15, 11, 11, 12, 16, 11, 13, 14, 16, 12, 12, - 16, 16, 14, 14, 16, 16, 13, 12, 8, 13, 9, 11, 10, 12, 10, 11, - 11, 14, 11, 12, 11, 13, 11, 11, 16, 16, 14, 15, 15, 16, 13, 12, - 10, 14, 10, 12, 11, 13, 11, 11, 11, 15, 11, 13, 12, 14, 11, 11, - 15, 16, 13, 14, 15, 16, 13, 12, 12, 16, 11, 13, 13, 16, 12, 12, - 13, 16, 11, 13, 14, 16, 12, 12, 16, 16, 13, 14, 16, 16, 13, 12, - 12, 16, 12, 14, 11, 13, 11, 11, 13, 16, 13, 14, 12, 14, 12, 12, - 16, 16, 15, 16, 16, 16, 14, 13, 13, 16, 12, 14, 12, 14, 12, 12, - 14, 16, 13, 14, 13, 14, 12, 12, 16, 16, 14, 16, 14, 16, 13, 12, - 15, 16, 13, 15, 15, 16, 13, 12, 15, 16, 13, 15, 14, 16, 13, 12, - 16, 16, 14, 15, 15, 16, 13, 11, 8, 13, 8, 11, 10, 13, 10, 11, - 11, 15, 10, 12, 12, 14, 11, 11, 15, 16, 13, 14, 15, 15, 13, 12, - 9, 14, 9, 12, 11, 14, 10, 11, 11, 16, 10, 12, 13, 14, 11, 11, - 16, 16, 13, 14, 15, 16, 13, 12, 11, 15, 9, 12, 12, 14, 10, 10, - 12, 16, 11, 12, 14, 15, 11, 11, 16, 16, 13, 14, 16, 16, 12, 11, - 9, 14, 10, 12, 11, 13, 11, 11, 12, 16, 11, 13, 12, 14, 11, 11, - 16, 16, 14, 14, 15, 15, 13, 12, 10, 15, 10, 12, 12, 14, 11, 11, - 12, 16, 11, 13, 13, 14, 11, 11, 16, 16, 14, 14, 15, 16, 13, 12, - 12, 16, 10, 12, 13, 15, 11, 11, 13, 16, 11, 13, 14, 15, 11, 11, - 16, 16, 13, 13, 15, 16, 12, 11, 12, 16, 11, 13, 10, 13, 11, 11, - 14, 16, 13, 14, 12, 14, 11, 11, 16, 16, 15, 16, 14, 15, 13, 11, - 13, 16, 12, 14, 12, 14, 11, 11, 13, 16, 12, 14, 12, 14, 11, 11, - 16, 16, 14, 15, 14, 14, 12, 11, 14, 16, 12, 13, 13, 15, 11, 11, - 14, 16, 12, 13, 13, 14, 11, 11, 15, 16, 12, 13, 13, 13, 10, 9, - ], - ], [ - [ - 0, 7, 4, 7, 5, 7, 6, 6, 6, 10, 7, 8, 8, 9, 8, 7, - 13, 14, 11, 12, 12, 12, 11, 9, 5, 9, 6, 8, 7, 9, 7, 7, - 8, 11, 8, 9, 9, 10, 9, 8, 13, 16, 12, 12, 12, 13, 11, 9, - 10, 13, 8, 10, 11, 12, 9, 9, 12, 14, 10, 11, 12, 13, 10, 9, - 15, 16, 12, 12, 14, 14, 11, 9, 6, 10, 7, 9, 7, 9, 8, 7, - 8, 11, 9, 10, 9, 10, 9, 8, 14, 16, 12, 12, 13, 12, 11, 9, - 8, 11, 8, 10, 9, 10, 9, 8, 10, 13, 10, 11, 10, 11, 9, 9, - 14, 16, 12, 12, 13, 13, 11, 9, 12, 15, 10, 11, 12, 13, 10, 9, - 13, 16, 11, 12, 13, 13, 10, 9, 16, 16, 12, 13, 14, 14, 11, 9, - 10, 14, 11, 12, 9, 11, 10, 9, 12, 15, 12, 13, 11, 12, 11, 9, - 16, 16, 13, 13, 13, 13, 11, 9, 12, 15, 12, 13, 11, 12, 11, 9, - 13, 16, 12, 13, 12, 13, 11, 10, 16, 16, 13, 13, 13, 13, 11, 9, - 14, 16, 13, 13, 13, 14, 11, 10, 16, 16, 13, 13, 13, 14, 11, 10, - 16, 16, 13, 13, 14, 14, 11, 9, 4, 9, 6, 8, 6, 9, 7, 7, - 8, 11, 8, 9, 9, 10, 9, 8, 13, 15, 12, 12, 13, 13, 11, 9, - 6, 10, 7, 9, 8, 10, 8, 8, 9, 12, 9, 10, 10, 11, 9, 8, - 14, 16, 12, 12, 13, 13, 11, 10, 10, 13, 8, 10, 11, 12, 9, 9, - 12, 15, 10, 11, 12, 13, 10, 9, 16, 16, 12, 12, 14, 14, 11, 9, - 7, 11, 8, 9, 7, 10, 8, 8, 9, 12, 10, 11, 9, 11, 9, 9, - 14, 16, 12, 13, 13, 13, 11, 10, 9, 12, 9, 10, 9, 11, 9, 9, - 10, 13, 10, 11, 10, 11, 10, 9, 14, 16, 12, 13, 13, 13, 11, 9, - 12, 15, 10, 11, 12, 13, 10, 9, 13, 16, 11, 12, 13, 13, 10, 9, - 16, 16, 12, 12, 14, 14, 11, 9, 10, 14, 11, 12, 9, 11, 10, 9, - 12, 16, 12, 13, 11, 12, 11, 9, 16, 16, 14, 14, 13, 13, 11, 9, - 12, 16, 12, 13, 11, 12, 10, 10, 13, 16, 12, 13, 11, 12, 11, 10, - 16, 16, 13, 13, 13, 13, 11, 9, 14, 16, 13, 13, 13, 14, 11, 9, - 15, 16, 13, 13, 13, 14, 11, 9, 16, 16, 13, 13, 13, 13, 10, 8, - 7, 11, 8, 10, 9, 11, 9, 9, 10, 13, 10, 11, 11, 12, 10, 10, - 15, 16, 13, 13, 14, 14, 12, 10, 9, 13, 9, 11, 10, 12, 10, 9, - 11, 14, 10, 12, 12, 13, 10, 10, 16, 16, 13, 13, 14, 14, 12, 10, - 11, 15, 9, 11, 12, 13, 10, 9, 13, 16, 11, 12, 13, 14, 11, 10, - 16, 16, 13, 13, 15, 15, 11, 10, 9, 13, 10, 11, 9, 11, 10, 9, - 11, 14, 11, 12, 11, 12, 11, 10, 16, 16, 14, 14, 14, 14, 12, 10, - 10, 14, 10, 12, 11, 12, 10, 10, 12, 15, 11, 12, 12, 13, 11, 10, - 16, 16, 13, 13, 14, 14, 12, 10, 13, 16, 11, 12, 13, 14, 11, 10, - 13, 16, 11, 12, 13, 14, 11, 10, 16, 16, 12, 13, 14, 14, 11, 9, - 11, 15, 12, 13, 10, 12, 10, 10, 13, 16, 13, 14, 11, 13, 11, 10, - 16, 16, 14, 14, 14, 14, 12, 10, 13, 16, 13, 13, 11, 13, 11, 10, - 14, 16, 13, 14, 12, 13, 11, 10, 16, 16, 14, 14, 13, 13, 12, 10, - 15, 16, 13, 14, 14, 14, 11, 10, 15, 16, 13, 13, 13, 14, 11, 10, - 16, 16, 12, 13, 13, 13, 10, 8, 9, 13, 10, 11, 10, 12, 10, 10, - 12, 15, 11, 12, 12, 13, 11, 10, 16, 16, 14, 13, 14, 14, 12, 10, - 10, 14, 10, 12, 11, 13, 10, 10, 13, 16, 11, 12, 12, 14, 11, 10, - 16, 16, 13, 13, 14, 14, 12, 10, 12, 16, 9, 11, 12, 14, 10, 9, - 13, 16, 10, 12, 13, 14, 10, 9, 16, 16, 12, 12, 14, 14, 11, 9, - 10, 14, 11, 12, 10, 12, 10, 10, 13, 16, 12, 13, 12, 13, 11, 10, - 16, 16, 14, 14, 14, 14, 12, 10, 11, 16, 11, 12, 11, 13, 11, 10, - 13, 16, 12, 13, 12, 14, 11, 10, 16, 16, 14, 14, 14, 14, 12, 10, - 13, 16, 11, 12, 13, 14, 10, 9, 14, 16, 11, 12, 13, 14, 10, 9, - 16, 16, 12, 12, 14, 14, 10, 8, 12, 16, 12, 13, 10, 12, 10, 9, - 14, 16, 13, 13, 11, 12, 11, 9, 16, 16, 14, 14, 13, 13, 11, 9, - 13, 16, 12, 13, 11, 12, 10, 9, 14, 16, 13, 13, 11, 13, 11, 9, - 16, 16, 14, 14, 13, 13, 11, 9, 14, 16, 12, 13, 12, 13, 10, 8, - 14, 16, 12, 12, 12, 13, 10, 8, 15, 16, 11, 11, 11, 12, 9, 6, - ], [ - 0, 7, 4, 7, 5, 8, 7, 8, 5, 10, 7, 10, 8, 10, 9, 10, - 13, 16, 12, 14, 14, 14, 13, 12, 4, 10, 6, 9, 8, 11, 9, 9, - 8, 12, 8, 11, 10, 12, 10, 10, 14, 16, 13, 14, 14, 15, 13, 12, - 9, 14, 9, 12, 12, 14, 11, 11, 12, 16, 11, 13, 13, 15, 12, 12, - 15, 16, 14, 15, 15, 16, 13, 13, 5, 10, 7, 10, 7, 10, 9, 9, - 8, 12, 9, 11, 9, 11, 10, 10, 14, 16, 13, 14, 14, 15, 13, 12, - 7, 12, 8, 11, 10, 12, 10, 10, 10, 13, 10, 12, 11, 13, 11, 11, - 15, 16, 13, 15, 14, 16, 13, 13, 11, 16, 11, 13, 13, 16, 12, 12, - 13, 16, 12, 14, 14, 16, 12, 12, 16, 16, 14, 16, 16, 16, 14, 13, - 11, 15, 12, 14, 11, 13, 11, 12, 13, 16, 12, 14, 12, 14, 12, 12, - 16, 16, 14, 16, 14, 16, 13, 13, 13, 16, 12, 14, 12, 14, 12, 12, - 14, 16, 13, 15, 13, 15, 13, 13, 16, 16, 15, 16, 16, 16, 14, 13, - 15, 16, 13, 16, 15, 16, 13, 13, 16, 16, 14, 16, 16, 16, 14, 13, - 16, 16, 16, 16, 16, 16, 14, 13, 2, 9, 5, 8, 6, 9, 8, 9, - 7, 11, 8, 10, 9, 11, 9, 10, 14, 16, 13, 14, 14, 15, 13, 12, - 5, 11, 6, 10, 9, 11, 9, 10, 8, 13, 9, 11, 11, 12, 10, 11, - 14, 16, 13, 14, 14, 16, 13, 13, 9, 15, 9, 12, 12, 14, 11, 11, - 12, 16, 11, 13, 13, 15, 12, 12, 16, 16, 14, 15, 16, 16, 14, 13, - 6, 11, 7, 10, 8, 11, 9, 10, 9, 13, 9, 12, 10, 12, 10, 11, - 14, 16, 13, 14, 14, 15, 13, 13, 8, 12, 8, 11, 10, 12, 10, 11, - 9, 13, 10, 12, 11, 13, 11, 11, 14, 16, 13, 14, 14, 16, 13, 13, - 12, 16, 11, 13, 13, 15, 12, 12, 13, 16, 11, 13, 14, 16, 12, 12, - 16, 16, 14, 15, 16, 16, 13, 13, 11, 15, 11, 14, 10, 13, 11, 12, - 13, 16, 13, 15, 12, 14, 12, 12, 16, 16, 15, 16, 15, 16, 14, 13, - 12, 16, 12, 14, 12, 14, 12, 12, 13, 16, 13, 15, 13, 14, 12, 13, - 16, 16, 15, 16, 15, 16, 13, 13, 15, 16, 13, 16, 15, 16, 13, 13, - 16, 16, 14, 16, 16, 16, 13, 13, 16, 16, 15, 16, 16, 16, 14, 13, - 5, 12, 7, 10, 9, 12, 10, 10, 9, 13, 9, 12, 11, 13, 11, 11, - 15, 16, 13, 14, 15, 15, 13, 13, 7, 13, 8, 11, 10, 13, 10, 11, - 10, 14, 10, 12, 12, 14, 11, 12, 16, 16, 14, 15, 16, 16, 14, 13, - 10, 16, 9, 12, 13, 15, 11, 12, 13, 16, 11, 13, 14, 16, 12, 12, - 16, 16, 14, 16, 16, 16, 14, 13, 8, 13, 9, 12, 9, 12, 10, 11, - 11, 15, 11, 13, 11, 13, 11, 12, 16, 16, 14, 16, 16, 16, 14, 13, - 9, 14, 10, 12, 11, 13, 11, 12, 11, 15, 11, 13, 12, 14, 12, 12, - 16, 16, 14, 16, 15, 16, 14, 13, 12, 16, 11, 14, 14, 16, 12, 12, - 13, 16, 12, 14, 14, 16, 13, 13, 16, 16, 13, 15, 16, 16, 14, 13, - 11, 16, 12, 14, 10, 13, 12, 12, 13, 16, 13, 15, 12, 14, 12, 13, - 16, 16, 16, 16, 16, 16, 14, 14, 13, 16, 13, 15, 12, 15, 12, 13, - 13, 16, 13, 15, 12, 15, 13, 13, 16, 16, 15, 16, 14, 16, 14, 13, - 16, 16, 14, 16, 16, 16, 14, 13, 15, 16, 14, 16, 15, 16, 14, 13, - 16, 16, 14, 16, 15, 16, 13, 12, 8, 14, 9, 12, 10, 14, 11, 12, - 11, 16, 10, 13, 12, 14, 12, 12, 16, 16, 14, 15, 15, 16, 14, 13, - 9, 15, 9, 12, 12, 14, 11, 12, 12, 16, 11, 13, 13, 15, 12, 12, - 16, 16, 14, 15, 16, 16, 14, 13, 11, 16, 9, 12, 13, 15, 11, 11, - 13, 16, 11, 13, 14, 16, 12, 12, 16, 16, 14, 14, 16, 16, 13, 12, - 9, 15, 10, 13, 11, 14, 11, 12, 12, 16, 11, 14, 12, 14, 12, 12, - 16, 16, 14, 16, 16, 16, 14, 13, 10, 16, 10, 13, 12, 15, 12, 12, - 12, 16, 12, 14, 13, 15, 12, 12, 16, 16, 14, 16, 16, 16, 14, 13, - 12, 16, 11, 13, 13, 16, 12, 12, 13, 16, 11, 13, 14, 16, 12, 12, - 16, 16, 13, 14, 16, 16, 13, 12, 11, 16, 12, 14, 10, 13, 11, 12, - 13, 16, 13, 15, 12, 14, 12, 12, 16, 16, 16, 16, 15, 16, 13, 12, - 12, 16, 12, 15, 12, 14, 12, 12, 13, 16, 13, 15, 12, 14, 12, 12, - 16, 16, 15, 16, 14, 15, 13, 12, 14, 16, 13, 14, 13, 16, 12, 12, - 13, 16, 12, 14, 13, 15, 12, 12, 14, 16, 12, 13, 13, 14, 11, 10, - ], - ], [ - [ - 0, 7, 4, 7, 5, 7, 6, 6, 6, 10, 7, 8, 8, 9, 8, 8, - 13, 14, 11, 12, 12, 12, 11, 10, 5, 9, 6, 8, 7, 9, 7, 7, - 8, 11, 8, 9, 9, 10, 9, 8, 13, 16, 12, 12, 13, 13, 11, 10, - 10, 14, 8, 10, 11, 13, 9, 9, 12, 15, 10, 11, 12, 13, 10, 10, - 16, 16, 12, 13, 14, 14, 11, 10, 5, 10, 7, 9, 6, 9, 8, 8, - 8, 11, 9, 10, 9, 10, 9, 8, 14, 16, 12, 12, 13, 13, 11, 10, - 8, 12, 8, 10, 9, 10, 9, 9, 10, 13, 9, 11, 10, 11, 9, 9, - 14, 16, 12, 13, 13, 13, 11, 10, 12, 16, 10, 12, 12, 13, 10, 10, - 13, 16, 11, 12, 13, 14, 11, 10, 16, 16, 12, 13, 14, 14, 11, 10, - 10, 14, 11, 13, 9, 11, 10, 10, 12, 16, 12, 13, 11, 12, 11, 10, - 16, 16, 13, 14, 13, 13, 12, 10, 12, 16, 12, 13, 11, 13, 11, 10, - 13, 16, 12, 13, 12, 13, 11, 10, 16, 16, 13, 14, 13, 14, 12, 10, - 14, 16, 13, 14, 13, 14, 12, 11, 16, 16, 13, 14, 14, 15, 12, 11, - 16, 16, 13, 14, 14, 14, 11, 10, 3, 9, 5, 8, 6, 9, 7, 7, - 8, 11, 8, 10, 9, 10, 9, 8, 14, 15, 12, 12, 13, 13, 11, 10, - 6, 11, 6, 9, 8, 10, 8, 8, 9, 12, 9, 10, 10, 11, 9, 9, - 14, 16, 12, 13, 13, 13, 11, 10, 10, 14, 8, 11, 12, 13, 9, 9, - 12, 16, 10, 11, 12, 13, 10, 10, 16, 16, 12, 13, 14, 14, 11, 10, - 6, 11, 8, 10, 7, 10, 8, 8, 9, 12, 10, 11, 9, 11, 9, 9, - 14, 16, 12, 13, 13, 13, 12, 10, 9, 12, 9, 11, 9, 11, 9, 9, - 10, 13, 10, 11, 10, 12, 10, 9, 14, 16, 12, 13, 13, 13, 11, 10, - 12, 16, 10, 12, 12, 14, 10, 10, 13, 16, 10, 12, 13, 14, 11, 10, - 16, 16, 12, 13, 14, 14, 11, 10, 10, 15, 11, 13, 9, 11, 10, 10, - 12, 16, 12, 13, 11, 12, 11, 10, 16, 16, 14, 14, 13, 14, 12, 10, - 12, 16, 12, 13, 11, 13, 11, 10, 13, 16, 12, 13, 11, 13, 11, 10, - 16, 16, 13, 14, 13, 13, 12, 10, 14, 16, 13, 14, 14, 14, 11, 11, - 15, 16, 13, 14, 13, 14, 11, 10, 16, 16, 13, 13, 13, 14, 11, 9, - 7, 12, 8, 11, 9, 11, 9, 10, 10, 14, 10, 12, 11, 12, 11, 10, - 16, 16, 13, 13, 14, 14, 12, 11, 9, 13, 9, 11, 10, 12, 10, 10, - 11, 15, 10, 12, 12, 13, 11, 10, 16, 16, 13, 14, 14, 14, 12, 11, - 11, 16, 9, 11, 12, 14, 10, 10, 13, 16, 10, 12, 13, 14, 11, 10, - 16, 16, 13, 14, 16, 16, 12, 11, 9, 13, 10, 12, 9, 12, 10, 10, - 11, 15, 11, 13, 11, 13, 11, 11, 16, 16, 14, 14, 14, 14, 13, 11, - 10, 14, 10, 12, 11, 13, 11, 10, 12, 16, 11, 13, 12, 13, 11, 11, - 16, 16, 13, 14, 14, 14, 12, 11, 13, 16, 11, 13, 13, 14, 11, 11, - 13, 16, 11, 13, 13, 14, 11, 11, 16, 16, 12, 13, 14, 15, 12, 10, - 11, 16, 12, 14, 10, 12, 11, 10, 13, 16, 13, 14, 11, 13, 11, 11, - 16, 16, 15, 16, 14, 14, 13, 11, 13, 16, 13, 14, 12, 13, 11, 11, - 13, 16, 13, 14, 12, 13, 11, 11, 16, 16, 14, 14, 13, 14, 12, 11, - 15, 16, 13, 14, 14, 16, 12, 11, 14, 16, 13, 14, 13, 14, 12, 11, - 16, 16, 12, 13, 13, 14, 11, 9, 9, 14, 10, 12, 10, 13, 11, 11, - 12, 16, 12, 13, 12, 14, 12, 11, 16, 16, 14, 14, 14, 14, 13, 11, - 10, 16, 10, 13, 12, 14, 11, 11, 13, 16, 12, 13, 13, 14, 12, 11, - 16, 16, 14, 14, 15, 15, 13, 11, 12, 16, 9, 12, 13, 14, 10, 10, - 14, 16, 11, 12, 13, 15, 11, 10, 16, 16, 13, 13, 15, 16, 11, 10, - 10, 16, 11, 13, 11, 13, 11, 11, 13, 16, 12, 14, 12, 14, 12, 11, - 16, 16, 14, 14, 14, 14, 13, 11, 11, 16, 11, 13, 12, 14, 11, 11, - 13, 16, 12, 14, 13, 14, 12, 11, 16, 16, 14, 14, 14, 15, 13, 11, - 13, 16, 11, 13, 13, 14, 11, 10, 14, 16, 11, 13, 13, 14, 11, 10, - 16, 16, 12, 13, 14, 15, 11, 9, 12, 16, 12, 14, 10, 13, 11, 10, - 14, 16, 13, 14, 11, 13, 11, 10, 16, 16, 14, 15, 13, 14, 12, 10, - 13, 16, 13, 14, 11, 13, 11, 10, 14, 16, 13, 14, 12, 13, 11, 10, - 16, 16, 14, 14, 13, 13, 11, 10, 14, 16, 12, 13, 13, 14, 11, 9, - 14, 16, 12, 13, 12, 13, 10, 9, 14, 16, 11, 11, 12, 12, 9, 7, - ], [ - 0, 7, 3, 8, 5, 8, 7, 9, 5, 10, 7, 10, 8, 11, 10, 10, - 14, 16, 14, 15, 14, 16, 14, 14, 4, 10, 6, 10, 8, 11, 9, 10, - 8, 12, 9, 11, 10, 12, 11, 11, 15, 16, 14, 16, 15, 16, 14, 14, - 10, 16, 10, 13, 13, 16, 12, 13, 13, 16, 12, 14, 14, 16, 13, 13, - 16, 16, 16, 16, 16, 16, 14, 15, 4, 10, 7, 10, 7, 10, 9, 10, - 8, 12, 9, 12, 10, 12, 11, 12, 14, 16, 14, 16, 15, 16, 14, 14, - 8, 12, 9, 12, 10, 13, 11, 12, 10, 14, 11, 13, 11, 14, 12, 13, - 16, 16, 14, 16, 16, 16, 14, 15, 12, 16, 12, 14, 14, 16, 13, 14, - 14, 16, 13, 16, 16, 16, 14, 14, 16, 16, 16, 16, 16, 16, 16, 16, - 11, 16, 12, 16, 11, 14, 13, 13, 13, 16, 13, 16, 13, 15, 13, 14, - 16, 16, 16, 16, 16, 16, 15, 16, 13, 16, 13, 16, 13, 16, 13, 14, - 14, 16, 14, 16, 14, 16, 14, 15, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 15, 16, 16, 16, 15, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 2, 9, 5, 9, 6, 10, 8, 10, - 7, 11, 8, 11, 9, 12, 10, 11, 14, 16, 14, 16, 15, 16, 14, 14, - 5, 11, 6, 10, 9, 12, 10, 11, 9, 13, 9, 12, 11, 13, 11, 12, - 16, 16, 14, 16, 16, 16, 14, 14, 10, 16, 9, 13, 13, 16, 12, 13, - 13, 16, 12, 14, 14, 16, 13, 13, 16, 16, 16, 16, 16, 16, 16, 14, - 5, 11, 8, 11, 7, 11, 10, 11, 9, 13, 10, 13, 10, 13, 11, 12, - 16, 16, 14, 16, 16, 16, 14, 14, 8, 13, 9, 12, 10, 13, 11, 12, - 10, 14, 10, 13, 11, 14, 12, 12, 16, 16, 14, 16, 15, 16, 14, 14, - 12, 16, 12, 14, 14, 16, 13, 14, 14, 16, 12, 16, 15, 16, 13, 14, - 16, 16, 15, 16, 16, 16, 15, 15, 11, 16, 12, 16, 10, 14, 12, 13, - 13, 16, 14, 16, 13, 16, 13, 14, 16, 16, 16, 16, 16, 16, 15, 16, - 13, 16, 13, 16, 13, 16, 13, 14, 14, 16, 14, 16, 13, 16, 13, 14, - 16, 16, 16, 16, 16, 16, 15, 16, 16, 16, 15, 16, 16, 16, 15, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 15, 16, - 5, 13, 7, 12, 9, 13, 11, 12, 10, 14, 10, 13, 11, 13, 12, 13, - 16, 16, 16, 16, 16, 16, 16, 15, 7, 14, 8, 12, 11, 14, 11, 12, - 11, 16, 11, 13, 13, 16, 13, 13, 16, 16, 16, 16, 16, 16, 16, 16, - 11, 16, 10, 14, 14, 16, 12, 13, 13, 16, 12, 15, 16, 16, 14, 14, - 16, 16, 16, 16, 16, 16, 16, 16, 8, 14, 10, 13, 9, 13, 11, 12, - 11, 16, 12, 14, 12, 14, 13, 13, 16, 16, 16, 16, 16, 16, 16, 16, - 10, 16, 11, 14, 12, 14, 12, 13, 11, 16, 12, 14, 12, 15, 13, 13, - 16, 16, 15, 16, 16, 16, 15, 16, 13, 16, 12, 16, 15, 16, 14, 14, - 13, 16, 12, 16, 16, 16, 14, 14, 16, 16, 14, 16, 16, 16, 14, 16, - 11, 16, 13, 16, 10, 14, 12, 13, 14, 16, 14, 16, 13, 16, 14, 14, - 16, 16, 16, 16, 16, 16, 16, 16, 13, 16, 14, 16, 13, 16, 14, 15, - 13, 16, 14, 16, 13, 16, 14, 15, 16, 16, 16, 16, 15, 16, 15, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 15, 16, 16, 16, 15, 16, - 16, 16, 15, 16, 16, 16, 14, 14, 8, 16, 10, 14, 11, 16, 12, 13, - 12, 16, 12, 14, 13, 16, 13, 14, 16, 16, 16, 16, 16, 16, 16, 14, - 10, 16, 10, 14, 12, 16, 12, 13, 13, 16, 12, 15, 14, 16, 13, 14, - 16, 16, 16, 16, 16, 16, 16, 15, 11, 16, 10, 13, 13, 16, 12, 13, - 14, 16, 12, 14, 15, 16, 13, 13, 16, 16, 16, 16, 16, 16, 15, 14, - 10, 16, 11, 14, 11, 16, 12, 13, 13, 16, 13, 16, 13, 16, 13, 14, - 16, 16, 16, 16, 16, 16, 16, 15, 11, 16, 12, 14, 13, 16, 13, 14, - 13, 16, 13, 16, 14, 16, 13, 14, 16, 16, 16, 16, 16, 16, 16, 15, - 13, 16, 12, 14, 14, 16, 13, 13, 13, 16, 12, 15, 14, 16, 13, 13, - 16, 16, 14, 16, 16, 16, 14, 13, 11, 16, 12, 16, 11, 15, 12, 13, - 14, 16, 14, 16, 13, 16, 13, 14, 16, 16, 16, 16, 16, 16, 14, 14, - 12, 16, 13, 16, 12, 16, 13, 14, 13, 16, 14, 16, 13, 16, 13, 14, - 16, 16, 16, 16, 14, 16, 14, 14, 14, 16, 13, 16, 14, 16, 13, 13, - 13, 16, 13, 16, 14, 16, 13, 13, 15, 16, 13, 14, 13, 15, 12, 12, - ], - ], [ - [ - 0, 7, 4, 6, 4, 7, 6, 7, 6, 9, 7, 8, 7, 9, 8, 8, - 13, 14, 12, 12, 12, 13, 11, 11, 5, 9, 5, 8, 7, 9, 7, 8, - 8, 11, 8, 10, 9, 10, 9, 9, 13, 15, 12, 13, 12, 13, 11, 11, - 9, 14, 8, 11, 11, 13, 10, 10, 11, 15, 10, 12, 12, 13, 10, 11, - 14, 16, 12, 13, 14, 14, 12, 11, 5, 9, 7, 9, 6, 9, 8, 8, - 8, 11, 8, 10, 8, 10, 9, 9, 13, 16, 12, 13, 13, 13, 11, 11, - 7, 11, 8, 10, 9, 11, 9, 9, 9, 13, 9, 11, 10, 11, 10, 10, - 14, 16, 12, 13, 13, 13, 12, 11, 11, 16, 10, 12, 12, 14, 11, 11, - 13, 16, 11, 13, 13, 14, 11, 11, 16, 16, 13, 14, 14, 15, 12, 11, - 10, 15, 11, 13, 9, 12, 10, 10, 12, 16, 12, 13, 11, 12, 11, 11, - 15, 16, 13, 14, 13, 14, 12, 11, 12, 16, 12, 14, 11, 13, 11, 11, - 13, 16, 12, 14, 12, 13, 12, 11, 16, 16, 13, 14, 14, 14, 12, 11, - 14, 16, 13, 14, 14, 15, 12, 12, 16, 16, 13, 14, 14, 16, 12, 12, - 16, 16, 14, 14, 14, 15, 12, 11, 3, 9, 5, 8, 6, 9, 7, 8, - 7, 11, 8, 10, 9, 10, 9, 9, 13, 14, 12, 13, 13, 13, 12, 11, - 6, 11, 6, 9, 8, 10, 8, 9, 9, 12, 8, 10, 10, 11, 9, 10, - 14, 16, 12, 13, 13, 14, 12, 11, 9, 14, 8, 11, 11, 13, 10, 10, - 12, 16, 10, 12, 12, 14, 11, 11, 16, 16, 12, 13, 14, 15, 12, 11, - 6, 11, 8, 10, 7, 10, 8, 9, 9, 12, 9, 11, 9, 11, 10, 10, - 14, 16, 13, 13, 13, 14, 12, 11, 8, 12, 9, 11, 9, 11, 9, 10, - 10, 13, 9, 11, 10, 12, 10, 10, 14, 16, 12, 13, 13, 14, 12, 11, - 12, 16, 10, 12, 12, 14, 11, 11, 12, 16, 10, 12, 13, 14, 11, 11, - 15, 16, 12, 13, 14, 14, 11, 11, 10, 15, 11, 13, 9, 12, 10, 10, - 12, 16, 12, 14, 11, 13, 11, 11, 16, 16, 14, 14, 14, 14, 12, 11, - 12, 16, 12, 14, 11, 13, 11, 11, 13, 16, 12, 14, 11, 13, 11, 11, - 16, 16, 13, 14, 13, 14, 12, 11, 14, 16, 13, 14, 14, 15, 12, 11, - 14, 16, 13, 14, 13, 15, 12, 11, 16, 16, 13, 14, 13, 14, 11, 10, - 6, 13, 8, 11, 9, 12, 10, 10, 10, 14, 10, 12, 11, 13, 11, 11, - 16, 16, 13, 14, 14, 14, 13, 12, 8, 14, 8, 12, 10, 13, 10, 11, - 11, 15, 10, 12, 12, 13, 11, 11, 16, 16, 14, 14, 15, 16, 13, 12, - 11, 16, 9, 12, 12, 14, 11, 11, 13, 16, 11, 13, 13, 16, 11, 11, - 16, 16, 13, 14, 16, 16, 13, 12, 8, 14, 10, 12, 9, 12, 10, 11, - 11, 15, 11, 13, 11, 13, 11, 11, 16, 16, 14, 15, 14, 15, 13, 12, - 10, 15, 10, 13, 11, 13, 11, 11, 11, 15, 11, 13, 12, 13, 11, 11, - 16, 16, 13, 15, 14, 15, 13, 12, 12, 16, 11, 13, 13, 15, 11, 11, - 13, 16, 11, 13, 13, 15, 11, 11, 16, 16, 12, 14, 14, 16, 12, 11, - 11, 16, 12, 14, 10, 13, 11, 11, 13, 16, 13, 15, 12, 14, 12, 12, - 16, 16, 15, 16, 14, 15, 13, 12, 12, 16, 13, 14, 12, 14, 12, 12, - 13, 16, 13, 14, 12, 14, 12, 12, 16, 16, 14, 15, 13, 14, 12, 12, - 15, 16, 13, 15, 14, 16, 12, 12, 14, 16, 13, 14, 13, 15, 12, 12, - 15, 16, 12, 13, 13, 14, 11, 10, 9, 15, 10, 13, 11, 14, 11, 12, - 12, 16, 12, 14, 12, 14, 12, 12, 16, 16, 14, 14, 14, 15, 13, 12, - 10, 16, 10, 13, 12, 14, 12, 12, 13, 16, 12, 14, 13, 15, 12, 12, - 16, 16, 14, 14, 15, 16, 13, 12, 11, 16, 9, 12, 13, 15, 11, 11, - 14, 16, 11, 13, 14, 16, 11, 11, 16, 16, 13, 14, 16, 16, 12, 11, - 10, 16, 11, 14, 11, 14, 12, 12, 13, 16, 13, 14, 12, 14, 12, 12, - 16, 16, 14, 15, 15, 15, 13, 12, 11, 16, 12, 14, 12, 15, 12, 12, - 13, 16, 12, 14, 13, 15, 12, 12, 16, 16, 14, 15, 15, 16, 13, 12, - 12, 16, 11, 13, 13, 15, 11, 11, 13, 16, 11, 13, 13, 15, 11, 11, - 16, 16, 12, 13, 14, 16, 12, 10, 11, 16, 12, 14, 10, 13, 11, 11, - 14, 16, 13, 14, 12, 14, 11, 11, 16, 16, 15, 16, 14, 14, 12, 11, - 12, 16, 13, 14, 11, 14, 11, 11, 13, 16, 13, 14, 12, 14, 11, 11, - 16, 16, 14, 15, 13, 14, 12, 11, 14, 16, 12, 14, 13, 14, 11, 10, - 13, 16, 12, 13, 12, 14, 11, 10, 14, 16, 11, 12, 12, 12, 10, 8, - ], [ - 0, 8, 4, 9, 5, 9, 8, 10, 6, 11, 8, 11, 9, 12, 11, 12, - 16, 16, 16, 16, 16, 16, 16, 16, 4, 11, 6, 11, 9, 12, 10, 12, - 9, 13, 10, 13, 11, 16, 12, 13, 16, 16, 16, 16, 16, 16, 16, 16, - 11, 16, 11, 16, 16, 16, 14, 16, 14, 16, 13, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 4, 11, 8, 12, 7, 12, 10, 12, - 8, 13, 10, 13, 10, 13, 12, 14, 16, 16, 16, 16, 16, 16, 16, 16, - 8, 13, 10, 14, 11, 16, 12, 14, 11, 16, 12, 16, 12, 16, 13, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 14, 16, 13, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 12, 16, 14, 16, 12, 16, 16, 16, 13, 16, 16, 16, 14, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 14, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 1, 10, 5, 10, 7, 11, 9, 11, - 8, 12, 9, 12, 10, 13, 12, 13, 16, 16, 16, 16, 16, 16, 16, 16, - 5, 12, 7, 12, 10, 13, 11, 12, 9, 16, 10, 13, 12, 16, 13, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 11, 16, 10, 16, 16, 16, 14, 16, - 14, 16, 13, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 6, 12, 9, 13, 8, 12, 11, 13, 10, 16, 11, 16, 11, 16, 13, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 9, 16, 10, 14, 11, 16, 12, 16, - 10, 16, 11, 16, 12, 16, 13, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 14, 16, 13, 16, 16, 16, 16, 16, 16, 16, 13, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 12, 16, 14, 16, 11, 16, 14, 16, - 16, 16, 16, 16, 14, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 15, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 6, 16, 9, 13, 10, 16, 12, 14, 11, 16, 12, 16, 12, 16, 13, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 8, 16, 9, 14, 12, 16, 13, 16, - 12, 16, 12, 16, 14, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 12, 16, 10, 16, 16, 16, 14, 16, 16, 16, 13, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 8, 16, 11, 16, 10, 16, 12, 16, - 12, 16, 13, 16, 13, 16, 14, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 10, 16, 12, 16, 13, 16, 14, 16, 11, 16, 13, 16, 13, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 14, 16, 13, 16, 16, 16, 16, 16, - 14, 16, 13, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 12, 16, 16, 16, 11, 16, 14, 16, 16, 16, 16, 16, 14, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 14, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 13, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 8, 16, 11, 16, 12, 16, 13, 16, - 13, 16, 13, 16, 14, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 10, 16, 11, 16, 13, 16, 14, 16, 14, 16, 13, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 11, 16, 10, 16, 16, 16, 13, 16, - 16, 16, 13, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 10, 16, 12, 16, 12, 16, 13, 16, 13, 16, 16, 16, 14, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 11, 16, 13, 16, 14, 16, 16, 16, - 13, 16, 14, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 13, 16, 12, 16, 16, 16, 14, 16, 14, 16, 13, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 11, 16, 13, 16, 11, 16, 13, 16, - 16, 16, 16, 16, 13, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 13, 16, 16, 16, 13, 16, 16, 16, 13, 16, 16, 16, 13, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 14, 16, 16, 16, 16, 16, 16, 16, 16, 16, 14, 16, 16, 16, 14, 15, - ], - ], [ - [ - 0, 7, 3, 7, 4, 7, 6, 7, 6, 9, 7, 9, 7, 9, 8, 9, - 13, 14, 12, 13, 13, 13, 12, 12, 4, 9, 5, 9, 7, 9, 8, 9, - 7, 11, 8, 10, 9, 11, 9, 10, 13, 16, 12, 14, 13, 14, 12, 12, - 9, 14, 8, 12, 12, 14, 10, 11, 11, 16, 10, 13, 13, 14, 11, 12, - 15, 16, 13, 14, 14, 16, 12, 12, 5, 10, 7, 9, 6, 9, 8, 9, - 8, 11, 8, 11, 8, 10, 9, 10, 14, 16, 12, 14, 13, 14, 12, 12, - 7, 12, 8, 11, 9, 11, 9, 10, 9, 13, 9, 12, 10, 12, 10, 11, - 14, 16, 12, 14, 13, 14, 12, 12, 12, 16, 11, 13, 13, 15, 11, 12, - 13, 16, 11, 14, 13, 15, 12, 12, 15, 16, 13, 15, 14, 16, 13, 13, - 10, 15, 12, 14, 9, 13, 11, 12, 12, 16, 12, 14, 11, 13, 12, 12, - 15, 16, 13, 15, 14, 15, 13, 13, 12, 16, 12, 14, 12, 14, 12, 12, - 13, 16, 13, 14, 12, 14, 12, 12, 16, 16, 14, 15, 14, 16, 13, 13, - 15, 16, 13, 15, 14, 16, 12, 13, 16, 16, 14, 16, 14, 16, 13, 13, - 16, 16, 14, 16, 15, 16, 13, 13, 3, 9, 5, 9, 6, 9, 8, 9, - 7, 11, 8, 10, 9, 11, 9, 10, 14, 15, 13, 14, 13, 14, 12, 12, - 5, 11, 6, 10, 8, 11, 9, 10, 9, 12, 9, 11, 10, 12, 10, 11, - 14, 16, 13, 14, 14, 15, 13, 13, 9, 15, 8, 12, 12, 14, 10, 11, - 12, 16, 10, 13, 13, 15, 11, 12, 15, 16, 13, 14, 14, 16, 13, 13, - 6, 11, 8, 11, 7, 10, 9, 10, 9, 13, 10, 12, 9, 12, 10, 11, - 14, 16, 13, 14, 14, 14, 13, 13, 8, 13, 9, 12, 9, 12, 10, 11, - 9, 13, 9, 12, 10, 12, 10, 11, 14, 16, 12, 14, 13, 14, 12, 12, - 12, 16, 11, 13, 13, 15, 11, 12, 12, 16, 11, 13, 13, 15, 11, 12, - 14, 16, 12, 14, 14, 15, 12, 12, 10, 15, 11, 14, 9, 13, 11, 12, - 12, 16, 12, 14, 11, 14, 12, 12, 16, 16, 14, 16, 14, 15, 13, 13, - 12, 16, 12, 14, 11, 14, 12, 12, 12, 16, 13, 14, 11, 14, 12, 12, - 15, 16, 14, 15, 13, 15, 12, 13, 14, 16, 13, 15, 14, 16, 13, 13, - 14, 16, 13, 15, 14, 16, 12, 13, 15, 16, 13, 15, 13, 15, 12, 12, - 6, 13, 8, 12, 9, 12, 10, 11, 10, 14, 11, 13, 11, 13, 12, 12, - 15, 16, 14, 15, 15, 15, 14, 13, 8, 14, 9, 12, 11, 13, 11, 12, - 11, 15, 11, 13, 12, 14, 12, 12, 16, 16, 14, 15, 15, 16, 14, 14, - 10, 16, 9, 13, 12, 15, 11, 12, 13, 16, 11, 14, 13, 16, 12, 12, - 16, 16, 14, 15, 16, 16, 13, 13, 8, 14, 10, 13, 9, 13, 11, 12, - 11, 15, 12, 14, 11, 14, 12, 12, 16, 16, 15, 16, 15, 16, 14, 14, - 10, 15, 10, 13, 11, 14, 11, 12, 11, 15, 11, 14, 12, 14, 12, 12, - 15, 16, 14, 15, 14, 16, 13, 13, 12, 16, 11, 14, 13, 16, 12, 12, - 12, 16, 11, 14, 13, 15, 12, 12, 15, 16, 12, 14, 15, 16, 13, 13, - 11, 16, 12, 14, 10, 14, 11, 12, 13, 16, 13, 16, 12, 14, 12, 13, - 16, 16, 16, 16, 15, 16, 14, 13, 12, 16, 13, 15, 12, 14, 12, 13, - 13, 16, 13, 15, 12, 14, 12, 13, 16, 16, 14, 16, 13, 15, 13, 13, - 15, 16, 14, 16, 14, 16, 13, 13, 14, 16, 13, 15, 13, 16, 13, 13, - 14, 16, 12, 14, 13, 14, 12, 12, 9, 16, 11, 14, 11, 15, 12, 13, - 13, 16, 12, 14, 12, 15, 13, 13, 16, 16, 14, 15, 15, 15, 14, 13, - 11, 16, 11, 14, 12, 16, 12, 13, 13, 16, 12, 14, 13, 16, 13, 13, - 16, 16, 14, 15, 16, 16, 14, 13, 11, 16, 10, 13, 13, 16, 11, 12, - 14, 16, 11, 14, 14, 16, 12, 12, 16, 16, 14, 14, 16, 16, 13, 12, - 11, 16, 12, 14, 11, 15, 12, 13, 13, 16, 13, 15, 13, 16, 13, 13, - 16, 16, 15, 16, 15, 16, 14, 13, 11, 16, 12, 15, 12, 16, 12, 13, - 13, 16, 13, 15, 13, 16, 13, 13, 16, 16, 15, 16, 15, 16, 14, 13, - 12, 16, 11, 14, 13, 16, 12, 12, 13, 16, 11, 14, 13, 16, 12, 12, - 16, 16, 13, 14, 15, 16, 12, 12, 11, 16, 12, 14, 10, 14, 11, 12, - 14, 16, 13, 15, 12, 15, 12, 12, 16, 16, 16, 16, 14, 15, 13, 12, - 12, 16, 13, 15, 12, 14, 12, 12, 13, 16, 13, 15, 12, 14, 12, 12, - 16, 16, 14, 16, 14, 15, 12, 12, 14, 16, 13, 15, 13, 16, 11, 12, - 13, 16, 12, 14, 13, 15, 11, 11, 14, 16, 12, 13, 12, 13, 11, 10, - ], [ - 0, 8, 4, 9, 5, 10, 9, 11, 5, 11, 9, 12, 9, 13, 12, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 4, 11, 6, 12, 9, 13, 11, 13, - 9, 16, 10, 16, 12, 16, 13, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 12, 16, 11, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 4, 12, 8, 13, 7, 12, 11, 16, - 8, 16, 11, 16, 11, 16, 15, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 8, 16, 10, 16, 11, 16, 13, 16, 11, 16, 12, 16, 13, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 12, 16, 16, 16, 13, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 1, 10, 6, 11, 7, 12, 10, 13, - 7, 12, 10, 13, 10, 16, 12, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 5, 13, 7, 12, 10, 16, 12, 16, 10, 16, 11, 16, 12, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 11, 16, 11, 16, 16, 16, 16, 16, - 16, 16, 13, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 5, 13, 9, 16, 8, 16, 12, 16, 9, 16, 12, 16, 11, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 9, 16, 11, 16, 12, 16, 13, 16, - 10, 16, 12, 16, 12, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 12, 16, 16, 16, 12, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 6, 16, 9, 16, 10, 16, 13, 16, 11, 16, 12, 16, 13, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 8, 16, 9, 16, 12, 16, 13, 16, - 12, 16, 12, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 11, 16, 10, 16, 16, 16, 16, 16, 16, 16, 13, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 8, 16, 11, 16, 11, 16, 13, 16, - 12, 16, 13, 16, 13, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 10, 16, 12, 16, 13, 16, 16, 16, 11, 16, 13, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 15, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 13, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 12, 16, 16, 16, 11, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 13, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 7, 16, 11, 16, 12, 16, 16, 16, - 13, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 10, 16, 11, 16, 13, 16, 16, 16, 16, 16, 13, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 11, 16, 10, 16, 16, 16, 16, 16, - 16, 16, 12, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 10, 16, 12, 16, 12, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 11, 16, 13, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 13, 16, 12, 16, 16, 16, 16, 16, 16, 16, 12, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 11, 16, 16, 16, 11, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 13, 16, 16, 16, 13, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - ], - ], [ - [ - 0, 7, 4, 8, 4, 8, 7, 8, 6, 10, 7, 10, 8, 10, 9, 10, - 13, 16, 13, 15, 13, 15, 13, 14, 4, 10, 5, 10, 7, 10, 9, 10, - 7, 12, 8, 11, 9, 12, 10, 11, 13, 16, 13, 15, 13, 16, 13, 14, - 9, 16, 9, 13, 12, 16, 11, 13, 11, 16, 11, 14, 13, 16, 12, 14, - 15, 16, 14, 16, 15, 16, 14, 14, 4, 10, 7, 10, 6, 10, 9, 10, - 8, 12, 9, 12, 9, 11, 10, 12, 13, 16, 13, 16, 14, 16, 13, 14, - 7, 12, 8, 12, 9, 12, 10, 12, 9, 13, 10, 13, 10, 13, 11, 12, - 14, 16, 13, 16, 14, 16, 13, 14, 12, 16, 11, 14, 13, 16, 12, 14, - 13, 16, 12, 16, 14, 16, 13, 14, 16, 16, 14, 16, 15, 16, 14, 14, - 10, 16, 12, 15, 10, 14, 12, 13, 12, 16, 13, 16, 12, 14, 13, 14, - 15, 16, 14, 16, 14, 16, 14, 14, 12, 16, 13, 16, 12, 16, 13, 14, - 13, 16, 13, 16, 13, 16, 13, 14, 16, 16, 14, 16, 15, 16, 14, 15, - 15, 16, 14, 16, 15, 16, 13, 15, 16, 16, 14, 16, 15, 16, 14, 15, - 16, 16, 16, 16, 16, 16, 15, 15, 2, 9, 5, 10, 6, 10, 8, 10, - 7, 11, 8, 11, 9, 11, 10, 11, 14, 16, 13, 15, 14, 15, 14, 14, - 5, 11, 6, 11, 8, 12, 9, 11, 8, 13, 9, 12, 10, 13, 11, 12, - 14, 16, 13, 15, 14, 16, 14, 14, 9, 16, 8, 13, 12, 16, 11, 13, - 12, 16, 11, 14, 13, 16, 12, 13, 16, 16, 14, 16, 15, 16, 14, 15, - 5, 12, 8, 11, 7, 11, 9, 11, 9, 13, 10, 13, 10, 13, 11, 12, - 14, 16, 14, 16, 14, 16, 14, 15, 8, 13, 9, 13, 10, 13, 11, 12, - 9, 13, 10, 13, 10, 13, 11, 13, 13, 16, 13, 15, 13, 16, 13, 14, - 12, 16, 11, 14, 13, 16, 12, 14, 12, 16, 11, 14, 13, 16, 12, 14, - 14, 16, 13, 16, 14, 16, 13, 14, 10, 16, 12, 15, 9, 14, 11, 13, - 12, 16, 13, 16, 12, 15, 12, 14, 16, 16, 15, 16, 15, 16, 14, 14, - 12, 16, 13, 16, 12, 16, 12, 14, 12, 16, 13, 16, 12, 15, 13, 14, - 15, 16, 14, 16, 14, 16, 14, 14, 15, 16, 14, 16, 14, 16, 14, 15, - 14, 16, 13, 16, 14, 16, 13, 14, 16, 16, 14, 16, 14, 16, 13, 14, - 6, 14, 9, 13, 9, 14, 11, 12, 10, 14, 11, 13, 11, 14, 12, 13, - 16, 16, 15, 16, 15, 16, 14, 15, 8, 15, 9, 13, 11, 14, 11, 13, - 11, 16, 11, 14, 12, 15, 12, 14, 16, 16, 15, 16, 16, 16, 15, 16, - 10, 16, 9, 14, 12, 16, 12, 13, 13, 16, 11, 15, 14, 16, 13, 14, - 16, 16, 15, 16, 16, 16, 15, 16, 8, 15, 10, 13, 10, 14, 11, 13, - 11, 16, 12, 14, 12, 14, 12, 14, 16, 16, 16, 16, 16, 16, 15, 16, - 10, 16, 11, 14, 11, 15, 12, 13, 11, 16, 11, 14, 12, 15, 12, 14, - 16, 16, 14, 16, 15, 16, 14, 15, 12, 16, 11, 15, 13, 16, 13, 14, - 12, 16, 11, 14, 13, 16, 13, 14, 15, 16, 13, 16, 16, 16, 14, 15, - 10, 16, 12, 15, 10, 15, 12, 13, 13, 16, 13, 16, 12, 16, 13, 14, - 16, 16, 16, 16, 16, 16, 15, 15, 12, 16, 13, 16, 12, 16, 13, 14, - 12, 16, 13, 16, 12, 16, 13, 14, 16, 16, 15, 16, 14, 16, 14, 15, - 15, 16, 14, 16, 15, 16, 14, 15, 14, 16, 13, 16, 14, 16, 13, 14, - 14, 16, 13, 15, 14, 16, 13, 14, 9, 16, 11, 16, 11, 16, 12, 14, - 13, 16, 12, 16, 13, 16, 13, 14, 16, 16, 15, 16, 16, 16, 15, 15, - 11, 16, 11, 16, 12, 16, 13, 14, 13, 16, 12, 16, 13, 16, 13, 14, - 16, 16, 15, 16, 16, 16, 15, 15, 11, 16, 10, 15, 13, 16, 12, 13, - 14, 16, 12, 16, 14, 16, 13, 14, 16, 16, 15, 16, 16, 16, 14, 14, - 11, 16, 12, 16, 11, 16, 13, 14, 13, 16, 13, 16, 13, 16, 13, 14, - 16, 16, 16, 16, 16, 16, 15, 15, 11, 16, 12, 16, 12, 16, 13, 14, - 13, 16, 13, 16, 13, 16, 13, 14, 16, 16, 15, 16, 16, 16, 15, 14, - 12, 16, 12, 15, 13, 16, 12, 14, 13, 16, 12, 16, 14, 16, 13, 14, - 16, 16, 14, 16, 16, 16, 14, 14, 11, 16, 12, 16, 11, 16, 12, 14, - 14, 16, 14, 16, 12, 16, 13, 14, 16, 16, 16, 16, 16, 16, 15, 14, - 12, 16, 13, 16, 12, 16, 12, 14, 13, 16, 13, 16, 12, 16, 13, 14, - 16, 16, 16, 16, 15, 16, 14, 14, 14, 16, 13, 16, 14, 16, 12, 14, - 13, 16, 13, 16, 13, 16, 12, 13, 15, 16, 13, 14, 14, 15, 13, 13, - ], [ - 0, 8, 4, 10, 5, 11, 10, 16, 5, 12, 9, 16, 10, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 4, 12, 7, 12, 9, 16, 12, 16, - 9, 16, 11, 16, 12, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 12, 16, 12, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 4, 12, 9, 16, 8, 16, 12, 16, - 8, 16, 11, 16, 11, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 8, 16, 11, 16, 12, 16, 16, 16, 11, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 12, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 1, 11, 6, 12, 7, 16, 11, 16, - 7, 16, 10, 16, 11, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 5, 16, 7, 16, 10, 16, 12, 16, 9, 16, 11, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 11, 16, 11, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 5, 16, 10, 16, 8, 16, 12, 16, 9, 16, 12, 16, 12, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 9, 16, 11, 16, 12, 16, 16, 16, - 10, 16, 12, 16, 12, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 12, 16, 16, 16, 12, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 5, 16, 9, 16, 10, 16, 16, 16, 11, 16, 12, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 8, 16, 9, 16, 12, 16, 16, 16, - 12, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 11, 16, 10, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 8, 16, 11, 16, 11, 16, 16, 16, - 12, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 10, 16, 12, 16, 16, 16, 16, 16, 11, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 11, 16, 16, 16, 11, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 6, 16, 10, 16, 12, 16, 16, 16, - 12, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 9, 16, 10, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 11, 16, 9, 16, 16, 16, 16, 16, - 16, 16, 12, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 9, 16, 16, 16, 12, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 11, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 13, 16, 12, 16, 16, 16, 16, 16, 16, 16, 12, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 11, 16, 16, 16, 11, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - ], - ], [ - [ - 0, 8, 4, 10, 5, 9, 8, 10, 6, 11, 8, 12, 8, 11, 10, 13, - 14, 16, 14, 16, 14, 16, 16, 16, 3, 11, 5, 11, 8, 12, 10, 12, - 7, 12, 9, 13, 10, 13, 11, 13, 14, 16, 14, 16, 16, 16, 16, 16, - 9, 16, 9, 16, 12, 16, 12, 16, 11, 16, 11, 16, 14, 16, 13, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 4, 11, 7, 12, 6, 11, 10, 12, - 8, 13, 9, 13, 9, 13, 11, 14, 13, 16, 14, 16, 14, 16, 16, 16, - 7, 13, 9, 13, 9, 13, 11, 13, 9, 14, 10, 16, 11, 16, 12, 16, - 15, 16, 14, 16, 16, 16, 16, 16, 12, 16, 12, 16, 14, 16, 13, 16, - 13, 16, 13, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 10, 16, 12, 16, 10, 16, 13, 16, 12, 16, 13, 16, 12, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 12, 16, 13, 16, 13, 16, 14, 16, - 13, 16, 14, 16, 14, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 2, 10, 5, 11, 6, 11, 9, 11, - 7, 12, 9, 13, 9, 13, 11, 13, 14, 16, 16, 16, 16, 16, 16, 16, - 4, 12, 6, 12, 8, 13, 10, 13, 8, 13, 9, 13, 11, 16, 12, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 9, 16, 8, 16, 12, 16, 12, 16, - 12, 16, 11, 16, 13, 16, 13, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 5, 12, 8, 13, 7, 13, 10, 13, 8, 14, 10, 14, 10, 14, 12, 14, - 16, 16, 16, 16, 16, 16, 16, 16, 7, 14, 9, 16, 10, 16, 11, 14, - 8, 14, 10, 16, 11, 16, 12, 16, 13, 16, 14, 16, 16, 16, 16, 16, - 11, 16, 11, 16, 13, 16, 13, 16, 12, 16, 12, 16, 14, 16, 14, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 9, 16, 12, 16, 10, 16, 12, 16, - 12, 16, 13, 16, 12, 16, 14, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 12, 16, 13, 16, 12, 16, 14, 16, 12, 16, 13, 16, 12, 16, 14, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 6, 16, 8, 16, 9, 16, 11, 13, 10, 16, 11, 16, 11, 16, 13, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 7, 16, 9, 16, 10, 16, 12, 16, - 11, 16, 11, 16, 12, 16, 13, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 10, 16, 9, 16, 12, 16, 13, 16, 13, 16, 12, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 7, 16, 10, 16, 9, 16, 12, 16, - 11, 16, 12, 16, 12, 16, 13, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 9, 16, 11, 16, 11, 16, 12, 16, 11, 16, 12, 16, 13, 16, 13, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 12, 16, 12, 16, 14, 16, 14, 16, - 12, 16, 12, 16, 14, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 10, 16, 12, 16, 10, 16, 13, 16, 13, 16, 14, 16, 13, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 12, 16, 13, 16, 12, 16, 14, 16, - 12, 16, 14, 16, 13, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 14, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 9, 16, 11, 16, 11, 16, 13, 16, - 12, 16, 13, 16, 13, 16, 15, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 10, 16, 11, 16, 13, 16, 13, 16, 13, 16, 13, 16, 14, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 11, 16, 11, 16, 14, 16, 13, 16, - 14, 16, 13, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 10, 16, 12, 16, 12, 16, 13, 16, 13, 16, 13, 16, 13, 16, 14, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 11, 16, 12, 16, 13, 16, 14, 16, - 13, 16, 13, 16, 14, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 12, 16, 12, 16, 14, 16, 14, 16, 14, 16, 14, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 11, 16, 13, 16, 11, 16, 14, 16, - 16, 16, 16, 16, 14, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 12, 16, 14, 16, 13, 16, 14, 16, 16, 16, 16, 16, 14, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - ], [ - 0, 10, 4, 12, 5, 16, 11, 16, 6, 16, 10, 16, 11, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 3, 16, 7, 16, 10, 16, 16, 16, - 9, 16, 12, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 4, 16, 10, 16, 9, 16, 16, 16, - 9, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 9, 16, 12, 16, 16, 16, 16, 16, 11, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 1, 16, 6, 16, 8, 16, 16, 16, - 8, 16, 11, 16, 12, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 5, 16, 8, 16, 11, 16, 16, 16, 10, 16, 12, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 12, 16, 11, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 5, 16, 11, 16, 9, 16, 16, 16, 10, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 9, 16, 12, 16, 16, 16, 16, 16, - 10, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 5, 16, 9, 16, 11, 16, 16, 16, 11, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 8, 16, 10, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 12, 16, 11, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 8, 16, 16, 16, 11, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 10, 16, 16, 16, 16, 16, 16, 16, 12, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 12, 16, 16, 16, 12, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 6, 16, 11, 16, 15, 16, 16, 16, - 15, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 9, 16, 10, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 11, 16, 9, 16, 16, 16, 16, 16, - 16, 16, 12, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 10, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 11, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 12, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 12, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - ], - ], -]; - -const RV34_INTER_SECONDPAT: &'static [[[u8; 108]; 2]; 7] = &[ - [ - [ - 0, 4, 8, 3, 6, 8, 6, 7, 8, 4, 6, 8, 6, 7, 8, 7, - 8, 8, 7, 8, 8, 8, 8, 8, 8, 8, 8, 3, 6, 8, 4, 6, - 9, 7, 7, 8, 5, 7, 9, 6, 7, 9, 8, 8, 8, 7, 8, 8, - 8, 8, 8, 8, 8, 7, 6, 8, 9, 7, 8, 9, 7, 8, 9, 7, - 8, 9, 7, 8, 9, 8, 8, 9, 8, 8, 9, 8, 9, 9, 8, 8, - 8, 8, 9, 9, 8, 9, 9, 7, 8, 8, 8, 9, 9, 8, 9, 9, - 8, 8, 8, 7, 8, 8, 8, 8, 8, 7, 7, 6, - ], [ - 0, 4, 9, 3, 6, 9, 7, 8, 10, 3, 6, 9, 5, 7, 10, 9, - 9, 10, 7, 8, 10, 8, 9, 10, 10, 10, 10, 2, 6, 9, 4, 7, - 10, 8, 9, 10, 4, 7, 10, 6, 7, 10, 9, 9, 10, 7, 8, 10, - 8, 9, 10, 10, 10, 10, 6, 8, 10, 7, 9, 11, 9, 10, 11, 7, - 9, 11, 8, 9, 11, 10, 10, 11, 8, 9, 11, 9, 10, 11, 11, 11, - 10, 8, 10, 11, 9, 10, 11, 9, 10, 11, 8, 10, 11, 9, 10, 11, - 10, 10, 11, 8, 10, 11, 9, 10, 10, 10, 10, 9, - ], - ], [ - [ - 0, 4, 8, 3, 6, 8, 6, 7, 9, 4, 6, 8, 5, 7, 8, 8, - 8, 9, 7, 7, 8, 8, 8, 8, 8, 9, 8, 3, 6, 8, 4, 6, - 9, 7, 7, 9, 5, 6, 9, 6, 7, 9, 8, 8, 9, 7, 8, 8, - 8, 8, 8, 8, 8, 8, 6, 8, 9, 7, 8, 10, 7, 8, 9, 7, - 8, 10, 7, 8, 10, 8, 8, 9, 7, 8, 9, 8, 9, 9, 9, 9, - 8, 7, 9, 10, 8, 9, 10, 8, 8, 8, 8, 9, 10, 8, 9, 9, - 8, 8, 8, 7, 8, 8, 8, 8, 8, 8, 7, 6, - ], [ - 0, 4, 9, 3, 6, 10, 8, 9, 11, 3, 5, 9, 5, 7, 10, 9, - 10, 11, 7, 8, 10, 9, 9, 11, 11, 11, 12, 2, 5, 10, 4, 7, - 10, 8, 9, 11, 4, 6, 10, 6, 7, 10, 9, 10, 11, 7, 9, 10, - 9, 9, 11, 11, 11, 11, 6, 8, 11, 7, 9, 11, 9, 10, 12, 7, - 9, 11, 8, 9, 12, 10, 10, 12, 8, 10, 11, 10, 10, 11, 12, 11, - 11, 8, 10, 12, 9, 11, 12, 10, 11, 12, 9, 10, 12, 10, 11, 12, - 11, 11, 12, 9, 10, 12, 10, 10, 11, 11, 11, 10, - ], - ], [ - [ - 0, 4, 8, 3, 6, 9, 7, 8, 9, 4, 6, 8, 5, 7, 9, 8, - 9, 9, 7, 8, 9, 8, 8, 9, 9, 9, 9, 2, 6, 9, 4, 6, - 9, 7, 8, 10, 5, 7, 9, 6, 7, 9, 8, 8, 9, 7, 8, 9, - 8, 8, 9, 9, 9, 9, 6, 8, 10, 7, 8, 10, 8, 9, 10, 6, - 8, 10, 8, 8, 10, 9, 9, 10, 8, 9, 10, 9, 9, 10, 10, 10, - 9, 8, 9, 10, 8, 9, 10, 8, 9, 10, 8, 9, 10, 9, 9, 10, - 9, 9, 9, 8, 9, 9, 8, 9, 9, 9, 9, 8, - ], [ - 0, 4, 10, 3, 6, 10, 8, 10, 12, 2, 6, 10, 6, 8, 11, 10, - 11, 12, 7, 9, 11, 9, 10, 12, 12, 13, 13, 2, 6, 10, 4, 7, - 11, 9, 10, 13, 4, 7, 11, 7, 8, 11, 10, 11, 12, 8, 9, 12, - 10, 10, 12, 12, 12, 13, 6, 9, 12, 8, 10, 13, 10, 12, 14, 7, - 10, 13, 9, 10, 13, 11, 11, 13, 9, 11, 13, 11, 11, 13, 13, 13, - 13, 9, 11, 13, 10, 12, 14, 11, 12, 14, 9, 11, 14, 11, 12, 14, - 12, 12, 14, 9, 12, 13, 11, 12, 13, 13, 12, 12, - ], - ], [ - [ - 0, 4, 9, 3, 6, 9, 7, 8, 10, 3, 6, 9, 6, 7, 9, 9, - 9, 10, 7, 8, 9, 8, 9, 10, 10, 10, 11, 2, 6, 9, 4, 7, - 10, 7, 9, 10, 4, 7, 10, 6, 7, 10, 9, 9, 10, 7, 8, 10, - 8, 9, 10, 10, 10, 10, 6, 8, 11, 7, 9, 11, 8, 10, 11, 6, - 9, 11, 8, 9, 11, 9, 9, 11, 8, 9, 11, 9, 10, 11, 11, 10, - 10, 8, 10, 11, 9, 10, 11, 9, 10, 11, 8, 10, 11, 9, 10, 11, - 10, 10, 11, 8, 10, 11, 9, 10, 11, 10, 10, 10, - ], [ - 0, 4, 12, 3, 7, 12, 10, 11, 14, 3, 6, 12, 7, 9, 13, 12, - 13, 14, 8, 11, 13, 11, 12, 14, 14, 14, 14, 1, 7, 12, 5, 8, - 13, 10, 12, 14, 4, 8, 13, 8, 9, 13, 12, 13, 14, 9, 11, 14, - 11, 12, 14, 14, 14, 14, 7, 10, 14, 9, 11, 14, 11, 13, 16, 8, - 11, 14, 10, 12, 14, 13, 13, 16, 10, 12, 15, 12, 13, 15, 15, 15, - 15, 10, 13, 15, 12, 13, 14, 13, 15, 15, 10, 13, 15, 12, 13, 15, - 13, 14, 15, 10, 13, 14, 12, 13, 14, 14, 14, 14, - ], - ], [ - [ - 0, 4, 9, 3, 6, 10, 7, 9, 11, 3, 5, 9, 5, 7, 10, 9, - 10, 12, 7, 8, 10, 9, 10, 11, 11, 12, 12, 2, 6, 10, 4, 7, - 10, 7, 9, 12, 4, 7, 10, 6, 7, 11, 9, 10, 12, 7, 9, 11, - 9, 9, 11, 11, 11, 12, 5, 8, 11, 7, 9, 12, 9, 10, 13, 6, - 9, 12, 8, 9, 12, 10, 10, 12, 8, 10, 12, 10, 10, 12, 12, 12, - 12, 8, 10, 12, 9, 11, 13, 10, 11, 13, 9, 11, 13, 10, 11, 13, - 11, 11, 13, 9, 11, 12, 10, 11, 12, 11, 11, 12, - ], [ - 0, 4, 12, 3, 7, 13, 10, 12, 15, 3, 7, 13, 7, 9, 14, 12, - 12, 13, 8, 11, 14, 11, 13, 15, 15, 14, 14, 1, 6, 13, 5, 8, - 13, 10, 13, 15, 4, 8, 13, 8, 9, 14, 13, 13, 15, 8, 11, 14, - 12, 12, 15, 15, 14, 14, 7, 10, 13, 9, 11, 13, 12, 14, 16, 8, - 11, 14, 10, 12, 15, 13, 13, 16, 10, 12, 15, 12, 13, 15, 15, 14, - 15, 11, 12, 14, 12, 14, 14, 13, 15, 15, 10, 12, 14, 12, 13, 15, - 14, 15, 15, 10, 13, 13, 12, 13, 15, 14, 14, 15, - ], - ], [ - [ - 0, 5, 10, 3, 7, 11, 9, 11, 14, 3, 7, 11, 7, 8, 12, 11, - 12, 14, 7, 9, 12, 10, 11, 14, 13, 14, 16, 1, 7, 11, 5, 8, - 12, 9, 11, 15, 4, 8, 12, 7, 9, 13, 11, 12, 15, 8, 10, 13, - 10, 11, 14, 14, 14, 16, 6, 9, 13, 8, 11, 14, 10, 13, 16, 7, - 10, 14, 9, 11, 15, 12, 13, 16, 9, 11, 15, 12, 12, 15, 14, 14, - 16, 10, 12, 14, 11, 13, 15, 12, 14, 16, 10, 12, 15, 11, 13, 16, - 13, 14, 16, 10, 13, 16, 12, 13, 15, 14, 15, 16, - ], [ - 0, 5, 16, 3, 8, 14, 11, 13, 14, 2, 8, 14, 8, 10, 16, 13, - 13, 14, 9, 13, 16, 12, 13, 16, 16, 14, 16, 1, 7, 14, 6, 10, - 14, 12, 16, 16, 5, 9, 14, 9, 11, 16, 15, 16, 16, 10, 12, 16, - 13, 13, 16, 16, 14, 16, 8, 11, 14, 11, 13, 14, 14, 14, 16, 8, - 12, 14, 11, 13, 16, 16, 16, 16, 10, 12, 15, 13, 14, 16, 16, 16, - 16, 11, 14, 14, 14, 15, 16, 16, 15, 16, 10, 13, 16, 13, 14, 14, - 16, 16, 16, 10, 13, 16, 13, 14, 16, 16, 16, 16, - ], - ], [ - [ - 0, 5, 11, 3, 7, 13, 9, 12, 16, 3, 7, 12, 6, 9, 14, 11, - 13, 16, 7, 10, 16, 11, 12, 16, 16, 16, 16, 1, 6, 12, 5, 9, - 16, 9, 13, 16, 4, 8, 16, 7, 10, 16, 12, 15, 16, 7, 11, 16, - 11, 12, 16, 16, 16, 16, 6, 10, 15, 8, 11, 16, 11, 14, 16, 7, - 11, 16, 10, 12, 16, 13, 16, 16, 9, 13, 16, 13, 14, 16, 16, 16, - 16, 10, 12, 16, 12, 16, 16, 16, 16, 16, 11, 13, 16, 13, 16, 16, - 16, 16, 16, 12, 16, 16, 16, 16, 16, 16, 16, 16, - ], [ - 0, 5, 16, 3, 8, 16, 12, 12, 16, 2, 8, 16, 8, 10, 16, 13, - 13, 16, 9, 13, 16, 12, 13, 16, 16, 16, 16, 1, 8, 16, 6, 10, - 16, 12, 16, 16, 5, 9, 16, 9, 11, 16, 13, 16, 16, 9, 12, 14, - 12, 12, 16, 16, 16, 16, 8, 11, 13, 11, 12, 16, 14, 16, 16, 8, - 12, 16, 11, 13, 16, 16, 15, 16, 9, 13, 14, 12, 13, 16, 16, 16, - 16, 10, 12, 13, 14, 13, 16, 16, 16, 16, 9, 13, 16, 13, 12, 16, - 16, 16, 16, 10, 12, 16, 14, 15, 16, 16, 16, 16, - ], - ], -]; - -const RV34_INTER_THIRDPAT: &'static [[[u8; 108]; 2]; 7] = &[ - [ - [ - 0, 5, 8, 3, 6, 9, 6, 7, 9, 4, 6, 9, 6, 7, 9, 8, - 8, 9, 7, 8, 9, 8, 9, 9, 9, 9, 9, 2, 6, 9, 4, 7, - 9, 7, 8, 9, 5, 7, 9, 6, 7, 9, 8, 8, 9, 7, 8, 9, - 8, 9, 9, 9, 9, 8, 5, 8, 10, 6, 8, 10, 8, 9, 9, 7, - 8, 10, 7, 9, 10, 8, 9, 9, 8, 9, 10, 9, 9, 10, 9, 9, - 9, 7, 9, 10, 8, 9, 10, 8, 8, 9, 8, 9, 10, 8, 9, 10, - 8, 8, 9, 8, 9, 9, 8, 9, 9, 8, 8, 7, - ], [ - 0, 4, 9, 2, 6, 10, 7, 8, 10, 3, 6, 10, 6, 7, 10, 9, - 9, 10, 8, 9, 11, 9, 10, 11, 10, 11, 11, 2, 6, 10, 4, 7, - 10, 8, 9, 10, 5, 7, 10, 7, 8, 10, 9, 9, 10, 9, 10, 11, - 10, 10, 11, 11, 11, 11, 6, 9, 11, 7, 9, 11, 9, 10, 12, 8, - 9, 11, 8, 10, 11, 10, 10, 11, 10, 11, 12, 11, 11, 12, 11, 11, - 11, 9, 11, 12, 10, 11, 12, 10, 11, 12, 10, 11, 12, 10, 11, 12, - 11, 11, 12, 11, 12, 12, 11, 12, 12, 12, 11, 11, - ], - ], [ - [ - 0, 4, 9, 3, 6, 9, 6, 8, 9, 4, 6, 9, 5, 7, 9, 8, - 8, 9, 7, 8, 10, 8, 9, 10, 9, 9, 9, 2, 6, 9, 4, 7, - 9, 7, 8, 9, 5, 7, 9, 6, 7, 10, 8, 9, 9, 7, 9, 10, - 8, 9, 10, 9, 9, 9, 5, 8, 10, 6, 8, 10, 8, 9, 10, 7, - 8, 10, 7, 9, 11, 9, 9, 10, 8, 9, 10, 9, 10, 10, 10, 10, - 9, 7, 9, 10, 8, 9, 11, 8, 9, 10, 8, 9, 11, 8, 9, 11, - 9, 9, 10, 9, 9, 10, 9, 9, 10, 9, 9, 8, - ], [ - 0, 4, 9, 2, 5, 10, 7, 8, 11, 3, 6, 10, 6, 7, 10, 9, - 10, 11, 8, 9, 11, 9, 10, 11, 11, 11, 12, 2, 6, 10, 4, 7, - 10, 8, 9, 11, 5, 7, 10, 6, 8, 10, 9, 10, 11, 9, 10, 12, - 10, 10, 12, 11, 12, 12, 6, 9, 11, 8, 9, 12, 9, 11, 13, 8, - 10, 12, 9, 10, 12, 11, 11, 12, 10, 12, 13, 11, 12, 13, 13, 12, - 13, 10, 11, 13, 10, 12, 13, 11, 12, 13, 11, 12, 13, 11, 12, 13, - 12, 12, 13, 12, 13, 14, 13, 13, 14, 13, 13, 13, - ], - ], [ - [ - 0, 4, 9, 3, 6, 9, 7, 8, 10, 3, 6, 9, 5, 7, 10, 8, - 9, 10, 7, 9, 10, 8, 9, 10, 10, 10, 10, 2, 6, 9, 4, 7, - 10, 7, 9, 10, 4, 7, 10, 6, 8, 10, 8, 9, 10, 8, 9, 10, - 9, 9, 10, 10, 10, 10, 5, 8, 11, 7, 9, 11, 8, 10, 11, 7, - 9, 11, 8, 9, 11, 9, 10, 11, 9, 10, 11, 10, 10, 11, 11, 11, - 11, 8, 10, 11, 9, 10, 11, 9, 10, 11, 9, 10, 12, 9, 10, 12, - 10, 11, 11, 9, 10, 11, 10, 11, 11, 10, 10, 10, - ], [ - 0, 4, 10, 3, 6, 11, 8, 10, 12, 3, 6, 11, 6, 8, 11, 10, - 11, 13, 9, 10, 13, 11, 12, 14, 13, 13, 14, 1, 6, 10, 5, 8, - 12, 9, 10, 13, 5, 8, 11, 7, 9, 12, 11, 11, 13, 10, 12, 13, - 11, 12, 14, 14, 13, 15, 7, 10, 12, 9, 11, 14, 11, 12, 15, 9, - 11, 13, 10, 11, 14, 12, 12, 14, 12, 14, 16, 13, 13, 16, 14, 14, - 16, 12, 13, 15, 12, 14, 15, 13, 14, 16, 13, 14, 16, 14, 14, 16, - 14, 15, 16, 14, 16, 16, 15, 16, 16, 15, 15, 16, - ], - ], [ - [ - 0, 4, 9, 2, 6, 9, 7, 9, 11, 3, 6, 10, 6, 7, 10, 9, - 10, 11, 7, 9, 10, 9, 10, 11, 11, 11, 12, 2, 6, 10, 4, 7, - 10, 8, 9, 11, 5, 7, 10, 7, 8, 10, 9, 10, 11, 8, 9, 11, - 9, 10, 11, 11, 12, 11, 6, 9, 11, 7, 10, 12, 9, 11, 12, 7, - 10, 12, 9, 10, 12, 11, 11, 12, 9, 11, 12, 10, 11, 12, 12, 12, - 12, 9, 11, 12, 9, 11, 13, 11, 12, 13, 9, 11, 13, 10, 12, 13, - 11, 12, 13, 11, 12, 13, 11, 12, 13, 12, 13, 12, - ], [ - 0, 4, 11, 2, 6, 12, 9, 11, 16, 4, 7, 12, 7, 9, 15, 11, - 12, 16, 10, 11, 16, 11, 13, 16, 16, 16, 16, 1, 6, 11, 5, 8, - 16, 9, 12, 16, 6, 9, 15, 8, 10, 16, 12, 13, 16, 12, 14, 16, - 12, 16, 16, 16, 16, 16, 8, 11, 14, 10, 12, 16, 12, 16, 16, 10, - 13, 16, 12, 16, 16, 13, 14, 16, 14, 16, 16, 16, 16, 16, 16, 16, - 16, 13, 13, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 14, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - ], - ], [ - [ - 0, 5, 9, 3, 6, 10, 8, 10, 12, 3, 6, 10, 6, 8, 10, 10, - 11, 12, 8, 9, 11, 10, 10, 12, 13, 13, 13, 1, 6, 10, 5, 8, - 11, 9, 11, 13, 5, 8, 11, 7, 9, 11, 11, 11, 13, 8, 9, 11, - 10, 10, 12, 13, 13, 14, 6, 9, 12, 8, 11, 13, 11, 13, 15, 8, - 10, 13, 10, 11, 13, 12, 13, 15, 10, 12, 13, 12, 12, 13, 14, 14, - 14, 9, 12, 14, 11, 13, 15, 13, 15, 16, 11, 13, 15, 12, 14, 15, - 14, 15, 16, 13, 14, 15, 14, 14, 15, 15, 16, 16, - ], [ - 0, 4, 16, 2, 7, 16, 10, 13, 16, 3, 8, 16, 7, 10, 16, 16, - 16, 16, 12, 16, 16, 15, 16, 16, 16, 16, 16, 1, 7, 16, 6, 9, - 16, 10, 16, 16, 7, 12, 16, 9, 13, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 9, 16, 16, 11, 13, 16, 16, 16, 16, 12, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 14, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - ], - ], [ - [ - 0, 4, 9, 3, 6, 11, 9, 12, 16, 3, 6, 10, 6, 8, 11, 12, - 13, 16, 8, 9, 12, 10, 11, 13, 16, 16, 16, 1, 6, 10, 5, 8, - 12, 10, 13, 16, 5, 8, 11, 8, 9, 13, 13, 14, 16, 9, 10, 14, - 11, 12, 15, 16, 16, 16, 6, 10, 13, 9, 12, 16, 14, 16, 16, 9, - 12, 14, 11, 13, 16, 16, 16, 16, 12, 14, 16, 14, 16, 16, 16, 16, - 16, 11, 16, 16, 13, 16, 16, 16, 16, 16, 12, 16, 16, 13, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - ], [ - 0, 4, 16, 2, 8, 16, 10, 16, 16, 3, 9, 16, 8, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 1, 7, 16, 5, 10, - 16, 16, 16, 16, 7, 16, 16, 11, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 10, 15, 16, 10, 16, 16, 16, 16, 16, 14, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - ], - ], [ - [ - 0, 3, 9, 3, 7, 11, 11, 15, 16, 3, 6, 11, 7, 9, 12, 16, - 16, 16, 8, 10, 16, 11, 16, 16, 16, 16, 16, 1, 6, 11, 6, 9, - 15, 16, 16, 16, 5, 8, 16, 9, 11, 16, 16, 16, 16, 10, 16, 16, - 16, 16, 16, 16, 16, 16, 7, 11, 16, 11, 16, 16, 16, 16, 16, 11, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - ], [ - 0, 4, 16, 2, 8, 16, 16, 16, 16, 3, 12, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 1, 7, 16, 5, 12, - 16, 16, 16, 16, 6, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 9, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - ], - ], -]; - -const RV34_INTER_COEFFS: &[[u8; 32]; 7] = &[ -[ - 1, 2, 4, 4, 5, 5, 6, 7, 7, 7, 8, 8, 8, 9, 9, 10, - 10, 10, 10, 11, 11, 11, 11, 12, 11, 11, 11, 13, 14, 15, 16, 16, -], [ - 1, 2, 3, 5, 5, 6, 6, 7, 7, 8, 9, 9, 9, 10, 10, 10, - 11, 11, 12, 12, 12, 12, 13, 13, 12, 12, 13, 14, 16, 16, 16, 16, -], [ - 1, 2, 3, 4, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 12, - 12, 12, 13, 13, 13, 14, 14, 15, 14, 14, 16, 16, 16, 16, 16, 16, -], [ - 1, 2, 3, 4, 5, 6, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, - 13, 13, 15, 15, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, -], [ - 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 14, 15, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, -], [ - 1, 2, 3, 4, 5, 6, 7, 8, 10, 10, 11, 11, 13, 12, 12, 13, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, -], [ - 1, 2, 3, 4, 5, 6, 7, 8, 10, 10, 10, 11, 14, 13, 15, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 15, 16, 16, 16, -]]; diff --git a/src/codecs/real/rv34dsp.rs b/src/codecs/real/rv34dsp.rs deleted file mode 100644 index c8c87fb..0000000 --- a/src/codecs/real/rv34dsp.rs +++ /dev/null @@ -1,564 +0,0 @@ -#[allow(dead_code)] -#[derive(Debug,Clone,Copy)] -pub enum PredType4x4 { - Ver, - Hor, - DC, - DiagDownLeft, - DiagDownRight, - VerRight, - HorDown, - VerLeft, - HorUp, - LeftDC, - TopDC, - DC128, - DiagDownLeftNoDown, - HorUpNoDown, - VerLeftNoDown -} - -#[allow(dead_code)] -#[derive(Debug,Clone,Copy)] -pub enum PredType8x8 { - DC, - Hor, - Ver, - Plane, - LeftDC, - TopDC, - DC128 -} - -pub struct RV34CommonDSP { - pub ipred4x4: [fn(buf: &mut [u8], idx: usize, stride: usize, tr: &[u8]); 15], - pub ipred8x8: [fn(buf: &mut [u8], idx: usize, stride: usize); 7], - pub ipred16x16: [fn(buf: &mut [u8], idx: usize, stride: usize); 7], -} - -fn row_transform(src: &[i16], dst: &mut [i32]) { - for i in 0..4 { - let z0 = 13 * ((src[i + 4*0] as i32) + (src[i + 4*2] as i32)); - let z1 = 13 * ((src[i + 4*0] as i32) - (src[i + 4*2] as i32)); - let z2 = 7 * (src[i + 4*1] as i32) - 17 * (src[i + 4*3] as i32); - let z3 = 17 * (src[i + 4*1] as i32) + 7 * (src[i + 4*3] as i32); - dst[4 * i + 0] = z0 + z3; - dst[4 * i + 1] = z1 + z2; - dst[4 * i + 2] = z1 - z2; - dst[4 * i + 3] = z0 - z3; - } -} - -fn clip8(a: i16) -> u8 { - if a < 0 { 0 } - else if a > 255 { 255 } - else { a as u8 } -} - -#[inline(always)] -fn mclip8(a: i32) -> u8 { - if (a as u32) > 255 { !(a >> 16) as u8 } - else { a as u8 } -} - -impl RV34CommonDSP { - pub fn new() -> Self { - Self { - ipred4x4: IPRED_FUNCS4X4, - ipred8x8: IPRED_FUNCS8X8, - ipred16x16: IPRED_FUNCS16X16, - } - } - pub fn add_coeffs(&self, dst: &mut [u8], idx: usize, stride: usize, coeffs: &[i16]) { - let out = &mut dst[idx..][..stride * 3 + 4]; - let mut sidx: usize = 0; - for el in out.chunks_mut(stride).take(4) { - assert!(el.len() >= 4); - el[0] = mclip8((el[0] as i32) + (coeffs[0 + sidx] as i32)); - el[1] = mclip8((el[1] as i32) + (coeffs[1 + sidx] as i32)); - el[2] = mclip8((el[2] as i32) + (coeffs[2 + sidx] as i32)); - el[3] = mclip8((el[3] as i32) + (coeffs[3 + sidx] as i32)); - sidx += 4; - } - } - pub fn transform(&self, coeffs: &mut [i16]) { - let mut tmp: [i32; 16] = [0; 16]; - row_transform(coeffs, &mut tmp); - for i in 0..4 { - let z0 = 13*(tmp[4*0+i] + tmp[4*2+i]) + 0x200; - let z1 = 13*(tmp[4*0+i] - tmp[4*2+i]) + 0x200; - let z2 = 7* tmp[4*1+i] - 17*tmp[4*3+i]; - let z3 = 17* tmp[4*1+i] + 7*tmp[4*3+i]; - coeffs[i * 4 + 0] = ((z0 + z3) >> 10) as i16; - coeffs[i * 4 + 1] = ((z1 + z2) >> 10) as i16; - coeffs[i * 4 + 2] = ((z1 - z2) >> 10) as i16; - coeffs[i * 4 + 3] = ((z0 - z3) >> 10) as i16; - } - } - pub fn transform_dc(&self, coeffs: &mut [i16]) { - let val = (((coeffs[0] as i32) * 13 * 13 + 0x200) >> 10) as i16; - for i in 0..16 { coeffs[i] = val; } - } - pub fn transform16(&self, coeffs: &mut [i16]) { - let mut tmp: [i32; 16] = [0; 16]; - row_transform(coeffs, &mut tmp); - for i in 0..4 { - let z0 = 39*(tmp[4*0+i] + tmp[4*2+i]); - let z1 = 39*(tmp[4*0+i] - tmp[4*2+i]); - let z2 = 21* tmp[4*1+i] - 51*tmp[4*3+i]; - let z3 = 51* tmp[4*1+i] + 21*tmp[4*3+i]; - - coeffs[i * 4 + 0] = ((z0 + z3) >> 11) as i16; - coeffs[i * 4 + 1] = ((z1 + z2) >> 11) as i16; - coeffs[i * 4 + 2] = ((z1 - z2) >> 11) as i16; - coeffs[i * 4 + 3] = ((z0 - z3) >> 11) as i16; - } - } - pub fn transform16_dc(&self, coeffs: &mut [i16]) { - let val = (((coeffs[0] as i32) * 13 * 13 * 3) >> 11) as i16; - for i in 0..16 { coeffs[i] = val; } - } - pub fn weight(&self, dst: &mut [u8], mut didx: usize, dstride: usize, - src: &[u8], mut sidx: usize, sstride: usize, ratio1: u32, ratio2: u32, - size: usize) { - for _ in 0..size { - for x in 0..size { - dst[didx + x] = (((((dst[didx + x] as u32) * ratio1) >> 9) - + (((src[sidx + x] as u32) * ratio2) >> 9) + 0x10) >> 5) as u8; - } - didx += dstride; - sidx += sstride; - } - } - pub fn avg(&self, dst: &mut [u8], mut didx: usize, dstride: usize, - src: &[u8], mut sidx: usize, sstride: usize, - size: usize) { - for _ in 0..size { - for x in 0..size { - dst[didx + x] = (((dst[didx + x] as u16) + (src[sidx + x] as u16) + 1) >> 1) as u8; - } - didx += dstride; - sidx += sstride; - } - } -} - -fn ipred_dc128(buf: &mut [u8], mut idx: usize, stride: usize, bsize: usize) { - for _ in 0..bsize { - for x in 0..bsize { buf[idx + x] = 128; } - idx += stride; - } -} -fn ipred_ver(buf: &mut [u8], mut idx: usize, stride: usize, bsize: usize) { - let oidx = idx - stride; - for _ in 0..bsize { - for x in 0..bsize { buf[idx + x] = buf[oidx + x]; } - idx += stride; - } -} -fn ipred_hor(buf: &mut [u8], mut idx: usize, stride: usize, bsize: usize) { - for _ in 0..bsize { - for x in 0..bsize { buf[idx + x] = buf[idx - 1]; } - idx += stride; - } -} -fn ipred_dc(buf: &mut [u8], mut idx: usize, stride: usize, bsize: usize, shift: u8) { - let mut adc: u16 = 0; - for i in 0..bsize { adc += buf[idx - stride + i] as u16; } - for i in 0..bsize { adc += buf[idx - 1 + i * stride] as u16; } - let dc = ((adc + (1 << (shift - 1))) >> shift) as u8; - - for _ in 0..bsize { - for x in 0..bsize { buf[idx + x] = dc; } - idx += stride; - } -} -fn ipred_left_dc(buf: &mut [u8], mut idx: usize, stride: usize, bsize: usize, shift: u8) { - let mut adc: u16 = 0; - for i in 0..bsize { adc += buf[idx - 1 + i * stride] as u16; } - let dc = ((adc + (1 << (shift - 1))) >> shift) as u8; - - for _ in 0..bsize { - for x in 0..bsize { buf[idx + x] = dc; } - idx += stride; - } -} -fn ipred_top_dc(buf: &mut [u8], mut idx: usize, stride: usize, bsize: usize, shift: u8) { - let mut adc: u16 = 0; - for i in 0..bsize { adc += buf[idx - stride + i] as u16; } - let dc = ((adc + (1 << (shift - 1))) >> shift) as u8; - - for _ in 0..bsize { - for x in 0..bsize { buf[idx + x] = dc; } - idx += stride; - } -} - -fn load_top(dst: &mut [u16], buf: &mut [u8], idx: usize, stride: usize, len: usize) { - for i in 0..len { dst[i] = buf[idx - stride + i] as u16; } -} -fn load_left(dst: &mut [u16], buf: &mut [u8], idx: usize, stride: usize, len: usize) { - for i in 0..len { dst[i] = buf[idx - 1 + i * stride] as u16; } -} - -fn ipred_4x4_ver(buf: &mut [u8], idx: usize, stride: usize, _tr: &[u8]) { - ipred_ver(buf, idx, stride, 4); -} -fn ipred_4x4_hor(buf: &mut [u8], idx: usize, stride: usize, _tr: &[u8]) { - ipred_hor(buf, idx, stride, 4); -} -fn ipred_4x4_diag_down_left(buf: &mut [u8], idx: usize, stride: usize, tr: &[u8]) { - let mut t: [u16; 8] = [0; 8]; - let mut l: [u16; 8] = [0; 8]; - load_top(&mut t, buf, idx, stride, 4); - for i in 0..4 { t[i + 4] = tr[i] as u16; } - load_left(&mut l, buf, idx, stride, 8); - let dst = &mut buf[idx..]; - - dst[0 + 0 * stride] = ((t[0] + t[2] + 2*t[1] + 2 + l[0] + l[2] + 2*l[1] + 2) >> 3) as u8; - let pix = ((t[1] + t[3] + 2*t[2] + 2 + l[1] + l[3] + 2*l[2] + 2) >> 3) as u8; - dst[1 + 0 * stride] = pix; - dst[0 + 1 * stride] = pix; - let pix = ((t[2] + t[4] + 2*t[3] + 2 + l[2] + l[4] + 2*l[3] + 2) >> 3) as u8; - dst[2 + 0 * stride] = pix; - dst[1 + 1 * stride] = pix; - dst[0 + 2 * stride] = pix; - let pix = ((t[3] + t[5] + 2*t[4] + 2 + l[3] + l[5] + 2*l[4] + 2) >> 3) as u8; - dst[3 + 0 * stride] = pix; - dst[2 + 1 * stride] = pix; - dst[1 + 2 * stride] = pix; - dst[0 + 3 * stride] = pix; - let pix = ((t[4] + t[6] + 2*t[5] + 2 + l[4] + l[6] + 2*l[5] + 2) >> 3) as u8; - dst[3 + 1 * stride] = pix; - dst[2 + 2 * stride] = pix; - dst[1 + 3 * stride] = pix; - let pix = ((t[5] + t[7] + 2*t[6] + 2 + l[5] + l[7] + 2*l[6] + 2) >> 3) as u8; - dst[3 + 2 * stride] = pix; - dst[2 + 3 * stride] = pix; - dst[3 + 3 * stride] = ((t[6] + t[7] + 1 + l[6] + l[7] + 1) >> 2) as u8; -} -fn ipred_4x4_diag_down_left_nodown(buf: &mut [u8], idx: usize, stride: usize, tr: &[u8]) { - let mut t: [u16; 8] = [0; 8]; - let mut l: [u16; 4] = [0; 4]; - load_top(&mut t, buf, idx, stride, 4); - for i in 0..4 { t[i + 4] = tr[i] as u16; } - load_left(&mut l, buf, idx, stride, 4); - let dst = &mut buf[idx..]; - - dst[0 + 0 * stride] = ((t[0] + t[2] + 2*t[1] + 2 + l[0] + l[2] + 2*l[1] + 2) >> 3) as u8; - let pix = ((t[1] + t[3] + 2*t[2] + 2 + l[1] + l[3] + 2*l[2] + 2) >> 3) as u8; - dst[1 + 0 * stride] = pix; - dst[0 + 1 * stride] = pix; - let pix = ((t[2] + t[4] + 2*t[3] + 2 + l[2] + 3*l[3] + 2) >> 3) as u8; - dst[2 + 0 * stride] = pix; - dst[1 + 1 * stride] = pix; - dst[0 + 2 * stride] = pix; - let pix = ((t[3] + t[5] + 2*t[4] + 2 + l[3]*4 + 2) >> 3) as u8; - dst[3 + 0 * stride] = pix; - dst[2 + 1 * stride] = pix; - dst[1 + 2 * stride] = pix; - dst[0 + 3 * stride] = pix; - let pix = ((t[4] + t[6] + 2*t[5] + 2 + l[3]*4 + 2) >> 3) as u8; - dst[3 + 1 * stride] = pix; - dst[2 + 2 * stride] = pix; - dst[1 + 3 * stride] = pix; - let pix = ((t[5] + t[7] + 2*t[6] + 2 + l[3]*4 + 2) >> 3) as u8; - dst[3 + 2 * stride] = pix; - dst[2 + 3 * stride] = pix; - dst[3 + 3 * stride] = ((t[6] + t[7] + 1 + 2*l[3] + 1) >> 2) as u8; -} -fn ipred_4x4_diag_down_right(buf: &mut [u8], idx: usize, stride: usize, _tr: &[u8]) { - let mut t: [u16; 5] = [0; 5]; - let mut l: [u16; 5] = [0; 5]; - load_top(&mut t, buf, idx - 1, stride, 5); - load_left(&mut l, buf, idx - stride, stride, 5); - let dst = &mut buf[idx..]; - - for j in 0..4 { - for i in 0..j { - dst[i + j * stride] = ((l[j - i - 1] + 2 * l[j - i] + l[j - i + 1] + 2) >> 2) as u8; - } - dst[j + j * stride] = ((l[1] + 2 * l[0] + t[1] + 2) >> 2) as u8; - for i in (j+1)..4 { - dst[i + j * stride] = ((t[i - j - 1] + 2 * t[i - j] + t[i - j + 1] + 2) >> 2) as u8; - } - } -} -fn ipred_4x4_ver_right(buf: &mut [u8], idx: usize, stride: usize, _tr: &[u8]) { - let mut t: [u16; 5] = [0; 5]; - let mut l: [u16; 5] = [0; 5]; - load_top(&mut t, buf, idx - 1, stride, 5); - load_left(&mut l, buf, idx - stride, stride, 5); - let dst = &mut buf[idx..]; - - for j in 0..4 { - for i in 0..4 { - let zvr = ((2 * i) as i8) - (j as i8); - let pix; - if zvr >= 0 { - if (zvr & 1) == 0 { - pix = (t[i - (j >> 1)] + t[i - (j >> 1) + 1] + 1) >> 1; - } else { - pix = (t[i - (j >> 1) - 1] + 2 * t[i - (j >> 1)] + t[i - (j >> 1) + 1] + 2) >> 2; - } - } else { - if zvr == -1 { - pix = (l[1] + 2 * l[0] + t[1] + 2) >> 2; - } else { - pix = (l[j] + 2 * l[j - 1] + l[j - 2] + 2) >> 2; - } - } - dst[i + j * stride] = pix as u8; - } - } -} -fn ipred_4x4_ver_left_common(buf: &mut [u8], idx: usize, stride: usize, tr: &[u8], no_down: bool) { - let mut t: [u16; 8] = [0; 8]; - let mut l: [u16; 5] = [0; 5]; - load_top(&mut t, buf, idx, stride, 4); - for i in 0..4 { t[i + 4] = tr[i] as u16; } - load_left(&mut l, buf, idx, stride, 4); - l[4] = if no_down { l[3] } else { buf[idx - 1 + 4 * stride] as u16 }; - let dst = &mut buf[idx..]; - - dst[0 + 0 * stride] = ((2*t[0] + 2*t[1] + l[1] + 2*l[2] + l[3] + 4) >> 3) as u8; - let pix = ((t[1] + t[2] + 1) >> 1) as u8; - dst[1 + 0 * stride] = pix; - dst[0 + 2 * stride] = pix; - let pix = ((t[2] + t[3] + 1) >> 1) as u8; - dst[2 + 0 * stride] = pix; - dst[1 + 2 * stride] = pix; - let pix = ((t[3] + t[4] + 1) >> 1) as u8; - dst[3 + 0 * stride] = pix; - dst[2 + 2 * stride] = pix; - dst[3 + 2 * stride] = ((t[4] + t[5] + 1) >> 1) as u8; - dst[0 + 1 * stride] = ((t[0] + 2*t[1] + t[2] + l[2] + 2*l[3] + l[4] + 4) >> 3) as u8; - let pix = ((t[1] + 2*t[2] + t[3] + 2) >> 2) as u8; - dst[1 + 1 * stride] = pix; - dst[0 + 3 * stride] = pix; - let pix = ((t[2] + 2*t[3] + t[4] + 2) >> 2) as u8; - dst[2 + 1 * stride] = pix; - dst[1 + 3 * stride] = pix; - let pix = ((t[3] + 2*t[4] + t[5] + 2) >> 2) as u8; - dst[3 + 1 * stride] = pix; - dst[2 + 3 * stride] = pix; - dst[3 + 3 * stride] = ((t[4] + 2*t[5] + t[6] + 2) >> 2) as u8; -} - -fn ipred_4x4_ver_left(buf: &mut [u8], idx: usize, stride: usize, tr: &[u8]) { - ipred_4x4_ver_left_common(buf, idx, stride, tr, false); -} -fn ipred_4x4_ver_left_nodown(buf: &mut [u8], idx: usize, stride: usize, tr: &[u8]) { - ipred_4x4_ver_left_common(buf, idx, stride, tr, true); -} -fn ipred_4x4_hor_down(buf: &mut [u8], idx: usize, stride: usize, _tr: &[u8]) { - let mut t: [u16; 5] = [0; 5]; - let mut l: [u16; 5] = [0; 5]; - load_top(&mut t, buf, idx - 1, stride, 5); - load_left(&mut l, buf, idx - stride, stride, 5); - let dst = &mut buf[idx..]; - - for j in 0..4 { - for i in 0..4 { - let zhd = ((2 * j) as i8) - (i as i8); - let pix; - if zhd >= 0 { - if (zhd & 1) == 0 { - pix = (l[j - (i >> 1)] + l[j - (i >> 1) + 1] + 1) >> 1; - } else { - pix = (l[j - (i >> 1) - 1] + 2 * l[j - (i >> 1)] + l[j - (i >> 1) + 1] + 2) >> 2; - } - } else { - if zhd == -1 { - pix = (l[1] + 2 * l[0] + t[1] + 2) >> 2; - } else { - pix = (t[i - 2] + 2 * t[i - 1] + t[i] + 2) >> 2; - } - } - dst[i + j * stride] = pix as u8; - } - } -} -fn ipred_4x4_hor_up(buf: &mut [u8], idx: usize, stride: usize, tr: &[u8]) { - let mut t: [u16; 8] = [0; 8]; - let mut l: [u16; 8] = [0; 8]; - load_top(&mut t, buf, idx, stride, 4); - for i in 0..4 { t[i + 4] = tr[i] as u16; } - load_left(&mut l, buf, idx, stride, 8); - let dst = &mut buf[idx..]; - - dst[0 + 0 * stride] = ((t[1] + 2*t[2] + t[3] + 2*l[0] + 2*l[1] + 4) >> 3) as u8; - dst[1 + 0 * stride] = ((t[2] + 2*t[3] + t[4] + l[0] + 2*l[1] + l[2] + 4) >> 3) as u8; - let pix = ((t[3] + 2*t[4] + t[5] + 2*l[1] + 2*l[2] + 4) >> 3) as u8; - dst[2 + 0 * stride] = pix; - dst[0 + 1 * stride] = pix; - let pix = ((t[4] + 2*t[5] + t[6] + l[1] + 2*l[2] + l[3] + 4) >> 3) as u8; - dst[3 + 0 * stride] = pix; - dst[1 + 1 * stride] = pix; - let pix = ((t[5] + 2*t[6] + t[7] + 2*l[2] + 2*l[3] + 4) >> 3) as u8; - dst[2 + 1 * stride] = pix; - dst[0 + 2 * stride] = pix; - let pix = ((t[6] + 3*t[7] + l[2] + 3*l[3] + 4) >> 3) as u8; - dst[3 + 1 * stride] = pix; - dst[1 + 2 * stride] = pix; - let pix = ((l[3] + 2*l[4] + l[5] + 2) >> 2) as u8; - dst[3 + 2 * stride] = pix; - dst[1 + 3 * stride] = pix; - let pix = ((t[6] + t[7] + l[3] + l[4] + 2) >> 2) as u8; - dst[0 + 3 * stride] = pix; - dst[2 + 2 * stride] = pix; - dst[2 + 3 * stride] = ((l[4] + l[5] + 1) >> 1) as u8; - dst[3 + 3 * stride] = ((l[4] + 2*l[5] + l[6] + 2) >> 2) as u8; -} -fn ipred_4x4_hor_up_nodown(buf: &mut [u8], idx: usize, stride: usize, tr: &[u8]) { - let mut t: [u16; 8] = [0; 8]; - let mut l: [u16; 4] = [0; 4]; - load_top(&mut t, buf, idx, stride, 4); - for i in 0..4 { t[i + 4] = tr[i] as u16; } - load_left(&mut l, buf, idx, stride, 4); - let dst = &mut buf[idx..]; - - dst[0 + 0 * stride] = ((t[1] + 2*t[2] + t[3] + 2*l[0] + 2*l[1] + 4) >> 3) as u8; - dst[1 + 0 * stride] = ((t[2] + 2*t[3] + t[4] + l[0] + 2*l[1] + l[2] + 4) >> 3) as u8; - let pix = ((t[3] + 2*t[4] + t[5] + 2*l[1] + 2*l[2] + 4) >> 3) as u8; - dst[2 + 0 * stride] = pix; - dst[0 + 1 * stride] = pix; - let pix = ((t[4] + 2*t[5] + t[6] + l[1] + 2*l[2] + l[3] + 4) >> 3) as u8; - dst[3 + 0 * stride] = pix; - dst[1 + 1 * stride] = pix; - let pix = ((t[5] + 2*t[6] + t[7] + 2*l[2] + 2*l[3] + 4) >> 3) as u8; - dst[2 + 1 * stride] = pix; - dst[0 + 2 * stride] = pix; - let pix = ((t[6] + 3*t[7] + l[2] + 3*l[3] + 4) >> 3) as u8; - dst[3 + 1 * stride] = pix; - dst[1 + 2 * stride] = pix; - dst[3 + 2 * stride] = l[3] as u8; - dst[1 + 3 * stride] = l[3] as u8; - let pix = ((t[6] + t[7] + 2*l[3] + 2) >> 2) as u8; - dst[0 + 3 * stride] = pix; - dst[2 + 2 * stride] = pix; - dst[2 + 3 * stride] = l[3] as u8; - dst[3 + 3 * stride] = l[3] as u8; -} -fn ipred_4x4_dc(buf: &mut [u8], idx: usize, stride: usize, _tr: &[u8]) { - ipred_dc(buf, idx, stride, 4, 3); -} -fn ipred_4x4_left_dc(buf: &mut [u8], idx: usize, stride: usize, _tr: &[u8]) { - ipred_left_dc(buf, idx, stride, 4, 2); -} -fn ipred_4x4_top_dc(buf: &mut [u8], idx: usize, stride: usize, _tr: &[u8]) { - ipred_top_dc(buf, idx, stride, 4, 2); -} -fn ipred_4x4_dc128(buf: &mut [u8], idx: usize, stride: usize, _tr: &[u8]) { - ipred_dc128(buf, idx, stride, 4); -} - -fn ipred_8x8_ver(buf: &mut [u8], idx: usize, stride: usize) { - ipred_ver(buf, idx, stride, 8); -} -fn ipred_8x8_hor(buf: &mut [u8], idx: usize, stride: usize) { - ipred_hor(buf, idx, stride, 8); -} -fn ipred_8x8_dc(buf: &mut [u8], idx: usize, stride: usize) { - ipred_dc(buf, idx, stride, 8, 4); -} -fn ipred_8x8_left_dc(buf: &mut [u8], idx: usize, stride: usize) { - ipred_left_dc(buf, idx, stride, 8, 3); -} -fn ipred_8x8_top_dc(buf: &mut [u8], idx: usize, stride: usize) { - ipred_top_dc(buf, idx, stride, 8, 3); -} -fn ipred_8x8_dc128(buf: &mut [u8], idx: usize, stride: usize) { - ipred_dc128(buf, idx, stride, 8); -} -fn ipred_8x8_plane(_buf: &mut [u8], _idx: usize, _stride: usize) { - unreachable!(); -/* let mut h: i16 = 0; - let mut v: i16 = 0; - for i in 0..4 { - let i1 = (i + 1) as i16; - h += i1 * ((buf[idx + (4 + i) - stride] as i16) - (buf[idx + (2 - i) - stride] as i16)); - v += i1 * ((buf[idx + (4 + i) * stride - 1] as i16) - (buf[idx + (2 - i) * stride - 1] as i16)); - } - let a = 16 * ((buf[idx - 1 + 7 * stride] as i16) + (buf[idx + 7 - stride] as i16)); - let b = (17 * h + 16) >> 5; - let c = (17 * v + 16) >> 5; - for y in 0..8 { - let j3 = (y as i16) - 3; - for x in 0..8 { - let i3 = (x as i16) - 3; - buf[idx + x] = clip8((a + b * i3 + c * j3 + 16) >> 5); - } - idx += stride; - }*/ -} - -fn ipred_16x16_ver(buf: &mut [u8], idx: usize, stride: usize) { - ipred_ver(buf, idx, stride, 16); -} -fn ipred_16x16_hor(buf: &mut [u8], idx: usize, stride: usize) { - ipred_hor(buf, idx, stride, 16); -} -fn ipred_16x16_dc(buf: &mut [u8], idx: usize, stride: usize) { - ipred_dc(buf, idx, stride, 16, 5); -} -fn ipred_16x16_left_dc(buf: &mut [u8], idx: usize, stride: usize) { - ipred_left_dc(buf, idx, stride, 16, 4); -} -fn ipred_16x16_top_dc(buf: &mut [u8], idx: usize, stride: usize) { - ipred_top_dc(buf, idx, stride, 16, 4); -} -fn ipred_16x16_dc128(buf: &mut [u8], idx: usize, stride: usize) { - ipred_dc128(buf, idx, stride, 16); -} -fn ipred_16x16_plane(buf: &mut [u8], mut idx: usize, stride: usize) { - let idx0 = idx + 7 - stride; - let mut idx1 = idx + 8*stride - 1; - let mut idx2 = idx1 - 2*stride; - - let mut h = (buf[idx0 + 1] as i16) - (buf[idx0 - 1] as i16); - let mut v = (buf[idx1 + 0] as i16) - (buf[idx2 + 0] as i16); - - for k in 2..9 { - idx1 += stride; - idx2 -= stride; - h += (k as i16) * ((buf[idx0 + k] as i16) - (buf[idx0 - k] as i16)); - v += (k as i16) * ((buf[idx1 + 0] as i16) - (buf[idx2 + 0] as i16)); - } - h = (h + (h >> 2)) >> 4; - v = (v + (v >> 2)) >> 4; - - let mut a = 16 * ((buf[idx1 + 0] as i16) + (buf[idx2 + 16] as i16) + 1) - 7 * (v + h); - - for _ in 0..16 { - let mut b = a; - a += v; - - for x in 0..4 { - buf[idx + x * 4 + 0] = clip8((b ) >> 5); - buf[idx + x * 4 + 1] = clip8((b + h) >> 5); - buf[idx + x * 4 + 2] = clip8((b + 2*h) >> 5); - buf[idx + x * 4 + 3] = clip8((b + 3*h) >> 5); - b += h * 4; - } - idx += stride; - } -} - -const IPRED_FUNCS4X4: [fn(buf: &mut [u8], idx: usize, stride: usize, tr: &[u8]); 15] = [ - ipred_4x4_ver, ipred_4x4_hor, ipred_4x4_dc, - ipred_4x4_diag_down_left, ipred_4x4_diag_down_right, - ipred_4x4_ver_right, ipred_4x4_hor_down, ipred_4x4_ver_left, ipred_4x4_hor_up, - ipred_4x4_left_dc, ipred_4x4_top_dc, ipred_4x4_dc128, - ipred_4x4_diag_down_left_nodown, ipred_4x4_hor_up_nodown, ipred_4x4_ver_left_nodown -]; - -const IPRED_FUNCS8X8: [fn(buf: &mut [u8], idx: usize, stride: usize); 7] = [ - ipred_8x8_dc, ipred_8x8_hor, ipred_8x8_ver, ipred_8x8_plane, - ipred_8x8_left_dc, ipred_8x8_top_dc, ipred_8x8_dc128 -]; - -const IPRED_FUNCS16X16: [fn(buf: &mut [u8], idx: usize, stride: usize); 7] = [ - ipred_16x16_dc, ipred_16x16_hor, ipred_16x16_ver, ipred_16x16_plane, - ipred_16x16_left_dc, ipred_16x16_top_dc, ipred_16x16_dc128 -]; diff --git a/src/codecs/real/rv40.rs b/src/codecs/real/rv40.rs deleted file mode 100644 index c664598..0000000 --- a/src/codecs/real/rv40.rs +++ /dev/null @@ -1,1062 +0,0 @@ -use crate::formats; -use crate::io::bitreader::*; -use crate::io::codebook::*; -use crate::io::intcode::*; -use crate::codecs::*; -use super::rv3040::*; -use super::rv40dsp::*; - -struct AICCodeReader8 { - lengths: &'static [u8], - codes: &'static [u8], -} - -impl CodebookDescReader<i8> for AICCodeReader8 { - fn bits(&mut self, idx: usize) -> u8 { self.lengths[idx] } - fn code(&mut self, idx: usize) -> u32 { self.codes[idx] as u32 } - fn sym (&mut self, idx: usize) -> i8 { idx as i8 } - fn len (&mut self) -> usize { self.lengths.len() } -} - -struct AICCodeReader16 { - lengths: &'static [u8], - codes: &'static [u16], -} - -impl CodebookDescReader<i8> for AICCodeReader16 { - fn bits(&mut self, idx: usize) -> u8 { self.lengths[idx] } - fn code(&mut self, idx: usize) -> u32 { self.codes[idx] as u32 } - fn sym (&mut self, idx: usize) -> i8 { idx as i8 } - fn len (&mut self) -> usize { self.lengths.len() } -} - -struct TypeCodeReader { - lengths: &'static [u8], - codes: &'static [u8], - syms: &'static [MBType], -} - -impl CodebookDescReader<MBType> for TypeCodeReader { - fn bits(&mut self, idx: usize) -> u8 { self.lengths[idx] } - fn code(&mut self, idx: usize) -> u32 { self.codes[idx] as u32 } - fn sym (&mut self, idx: usize) -> MBType{ self.syms[idx] } - fn len (&mut self) -> usize { self.lengths.len() } -} - -struct RealVideo40BR { - width: usize, - height: usize, - aic_top_cb: Codebook<i8>, - aic_mode1_cb: Vec<Codebook<i8>>, - aic_mode2_cb: Vec<Codebook<i8>>, - ptype_cb: Vec<Codebook<MBType>>, - btype_cb: Vec<Codebook<MBType>>, - had_skip_run: bool, -} - -impl RealVideo40BR { - fn new() -> Self { - let mut coderead = AICCodeReader8{ lengths: &RV40_AIC_TOP_BITS, codes: &RV40_AIC_TOP_CODES }; - let aic_top_cb = Codebook::new(&mut coderead, CodebookMode::MSB).unwrap(); - - let mut aic_mode1_cb: Vec<Codebook<i8>> = Vec::with_capacity(RV40_AIC_MODE1_BITS.len()); - for i in 0..RV40_AIC_MODE1_BITS.len() { - if (i % 10) != 9 { - let mut coderead = AICCodeReader8{ lengths: &RV40_AIC_MODE1_BITS[i], codes: &RV40_AIC_MODE1_CODES[i] }; - let cb = Codebook::new(&mut coderead, CodebookMode::MSB).unwrap(); - aic_mode1_cb.push(cb); - } else { - let mut coderead = AICCodeReader8{ lengths: &RV40_AIC_MODE1_BITS_DUMMY, codes: &RV40_AIC_MODE1_CODES_DUMMY }; - let cb = Codebook::new(&mut coderead, CodebookMode::MSB).unwrap(); - aic_mode1_cb.push(cb); - } - } - - let mut aic_mode2_cb: Vec<Codebook<i8>> = Vec::with_capacity(RV40_AIC_MODE2_BITS.len()); - for i in 0..RV40_AIC_MODE2_BITS.len() { - let mut coderead = AICCodeReader16{ lengths: &RV40_AIC_MODE2_BITS[i], codes: &RV40_AIC_MODE2_CODES[i] }; - let cb = Codebook::new(&mut coderead, CodebookMode::MSB).unwrap(); - aic_mode2_cb.push(cb); - } - - let mut ptype_cb: Vec<Codebook<MBType>> = Vec::with_capacity(RV40_PTYPE_BITS.len()); - for i in 0..RV40_PTYPE_BITS.len() { - let mut coderead = TypeCodeReader{ lengths: &RV40_PTYPE_BITS[i], codes: &RV40_PTYPE_CODES[i], syms: RV40_PTYPE_SYMS }; - let cb = Codebook::new(&mut coderead, CodebookMode::MSB).unwrap(); - ptype_cb.push(cb); - } - - let mut btype_cb: Vec<Codebook<MBType>> = Vec::with_capacity(RV40_BTYPE_BITS.len()); - for i in 0..RV40_BTYPE_BITS.len() { - let mut coderead = TypeCodeReader{ lengths: &RV40_BTYPE_BITS[i], codes: &RV40_BTYPE_CODES[i], syms: RV40_BTYPE_SYMS }; - let cb = Codebook::new(&mut coderead, CodebookMode::MSB).unwrap(); - btype_cb.push(cb); - } - - RealVideo40BR { - width: 0, - height: 0, - aic_top_cb: aic_top_cb, - aic_mode1_cb: aic_mode1_cb, - aic_mode2_cb: aic_mode2_cb, - ptype_cb: ptype_cb, - btype_cb: btype_cb, - had_skip_run: false, - } - } - fn predict_b_mv_component(&self, sstate: &SState, mvi: &MVInfo, mbinfo: &Vec<RV34MBInfo>, mbtype: MBType, fwd: bool) -> MV { - let mut pred_mvs: [MV; 3] = [ZERO_MV; 3]; - let mut mv_count: usize = 0; - let mb_x = sstate.mb_x; - let mb_y = sstate.mb_y; - let mb_stride = sstate.mb_w; - let mb_idx = mb_x + mb_y * mb_stride; - - if !mbtype.has_mv_dir(fwd) { - return ZERO_MV; - } - - if sstate.has_left && mbinfo[mb_idx - 1].mbtype.has_mv_dir(fwd) { - pred_mvs[mv_count] = mvi.get_mv(mb_x - 1, mb_y, 0, 0, fwd); - mv_count += 1; - } - if !sstate.has_top { - return pred_mvs[0]; - } - if mbinfo[mb_idx - mb_stride].mbtype.has_mv_dir(fwd) { - pred_mvs[mv_count] = mvi.get_mv(mb_x, mb_y - 1, 0, 0, fwd); - mv_count += 1; - } - if sstate.has_tr { - if mbinfo[mb_idx - mb_stride + 1].mbtype.has_mv_dir(fwd) { - pred_mvs[mv_count] = mvi.get_mv(mb_x + 1, mb_y - 1, 0, 0, fwd); - mv_count += 1; - } - } else { - if sstate.has_tl && mbinfo[mb_idx - mb_stride - 1].mbtype.has_mv_dir(fwd) { - pred_mvs[mv_count] = mvi.get_mv(mb_x - 1, mb_y - 1, 0, 0, fwd); - mv_count += 1; - } - } - - match mv_count { - 3 => MV::pred(pred_mvs[0], pred_mvs[1], pred_mvs[2]), - 2 => { let sum_mv = pred_mvs[0] + pred_mvs[1]; MV { x: sum_mv.x / 2, y: sum_mv.y / 2 } }, - 1 => pred_mvs[0], - _ => ZERO_MV, - } - } -} - -fn get_dimension(br: &mut BitReader, tab: &'static [i16]) -> DecoderResult<usize> { - let t = br.read(3)? as usize; - if tab[t] > 0 { return Ok(tab[t] as usize); } - if tab[t] < 0 { - let idx = (-tab[t] as usize) + (br.read(1)? as usize); - if tab[idx] != 0 { return Ok(tab[idx] as usize); } - } - let mut size: usize = 0; - loop { - let t = br.read(8)? as usize; - size += t << 2; - if t != 255 { break; } - } - Ok(size) -} - -impl RV34BitstreamDecoder for RealVideo40BR { - fn decode_slice_header(&mut self, br: &mut BitReader, old_w: usize, old_h: usize) -> DecoderResult<RV34SliceHeader> { - if br.read(1)? != 0 { return Err(DecoderError::InvalidData); } - let ft_idx = br.read(2)?; - let ftype = match ft_idx { - 0|1 => FrameType::I, - 2 => FrameType::P, - _ => FrameType::B, - }; - let q = br.read(5)? as u8; - if br.read(2)? != 0 { return Err(DecoderError::InvalidData); } - let set_idx = br.read(2)? as usize; - let deblock = !br.read_bool()?; - let pts = br.read(13)? as u16; - let w; - let h; - if (ftype == FrameType::I) || !br.read_bool()? { - w = get_dimension(br, &RV40_STANDARD_WIDTHS)?; - h = get_dimension(br, &RV40_STANDARD_HEIGHTS)?; - } else { - w = old_w; - h = old_h; - } - let start = br.read(get_slice_start_offset_bits(w, h))? as usize; - - self.had_skip_run = false; - - Ok(RV34SliceHeader{ ftype: ftype, quant: q, deblock: deblock, pts: pts, width: w, height: h, start: start, end: 0, set_idx: set_idx }) - } - fn decode_intra_pred(&mut self, br: &mut BitReader, types: &mut [i8], mut pos: usize, tstride: usize, has_top: bool) -> DecoderResult<()> { - let start; - if has_top { - start = 0; - } else { - let code = br.read_cb(&self.aic_top_cb)?; - types[pos + 0] = (code >> 2) & 2; - types[pos + 1] = (code >> 1) & 2; - types[pos + 2] = (code >> 0) & 2; - types[pos + 3] = (code << 1) & 2; - pos += tstride; - start = 1; - } - for _ in start..4 { - let mut x: usize = 0; - while x < 4 { - let tr = types[pos + x - tstride + 1]; - let t = types[pos + x - tstride]; - let l = types[pos + x - 1]; - let ctx = if x < 3 { ((tr & 0xF) as u16) + (((t as u16) & 0xF) << 4) + (((l as u16) & 0xF) << 8) } else { 0xFFF }; - let res = RV40_AIC_PATTERNS.iter().position(|&x| x == ctx); - if let Some(idx) = res { - let code = br.read_cb(&self.aic_mode2_cb[idx])?; - types[pos + x + 0] = code / 9; - types[pos + x + 1] = code % 9; - x += 2; - } else { - if (t != -1) && (l != -1) { - let idx = (t as usize) + (l as usize) * 10; - types[pos + x] = br.read_cb(&self.aic_mode1_cb[idx])?; - } else { - match l { - -1 if t < 2 => { types[pos + x] = (br.read(1)? as i8) ^ 1; }, - 0 | 2 => { types[pos + x] = ((br.read(1)? as i8) ^ 1) << 1; }, - _ => { types[pos + x] = 0; }, - }; - } - x += 1; - } - } - pos += tstride; - } - Ok(()) - } - fn decode_inter_mb_hdr(&mut self, br: &mut BitReader, ftype: FrameType, mbtype_ref: MBType) -> DecoderResult<MBInfo> { - let skip_run = if self.had_skip_run { 0 } else { br.read_code(UintCodeType::Gamma)? as usize }; - if skip_run > 0 { - self.had_skip_run = true; - return Ok(MBInfo { mbtype: MBType::MBSkip, skip_run: skip_run - 1, dquant: false }) - } - self.had_skip_run = false; - let mut mbtype; - let idx; - if ftype == FrameType::P { - idx = match mbtype_ref { - MBType::MBIntra => 0, - MBType::MBIntra16 => 1, - MBType::MBP16x16 => 2, - MBType::MBP8x8 => 3, - MBType::MBP16x8 => 4, - MBType::MBP8x16 => 5, - MBType::MBP16x16Mix => 6, - _ => unreachable!(), - }; - mbtype = br.read_cb(&self.ptype_cb[idx])?; - } else { - idx = match mbtype_ref { - MBType::MBIntra => 0, - MBType::MBIntra16 => 1, - MBType::MBForward => 2, - MBType::MBBackward => 3, - MBType::MBBidir => 4, - MBType::MBDirect => 5, - _ => 0, - }; - mbtype = br.read_cb(&self.btype_cb[idx])?; - } - let dquant = mbtype == MBType::Invalid; - if dquant { - mbtype = if ftype == FrameType::P { br.read_cb(&self.ptype_cb[idx])? } - else { br.read_cb(&self.btype_cb[idx])? }; - } - Ok(MBInfo { mbtype: mbtype, skip_run: 0, dquant: dquant }) - } - fn predict_b_mv(&self, sstate: &SState, mvi: &MVInfo, mbtype: MBType, mvs: &[MV], mbinfo: &Vec<RV34MBInfo>) -> (MV, MV) { - let mut mv_f = self.predict_b_mv_component(sstate, mvi, mbinfo, mbtype, true); - let mut mv_b = self.predict_b_mv_component(sstate, mvi, mbinfo, mbtype, false); - - match mbtype { - MBType::MBForward => { mv_f += mvs[0]; }, - MBType::MBBackward => { mv_b += mvs[0]; }, - MBType::MBBidir => { - mv_f += mvs[0]; - mv_b += mvs[1]; - }, - _ => {}, - }; - - (mv_f, mv_b) - } - fn quant_dc(&self, is_intra: bool, q: u8) -> u8 { RV40_QUANT_DC[if is_intra { 0 } else { 1 }][q as usize] } -} - -struct RealVideo40Decoder { - bd: RealVideo40BR, - info: Rc<NACodecInfo>, - dec: RV34Decoder, -} - -impl RealVideo40Decoder { - fn new() -> Self { - RealVideo40Decoder{ - bd: RealVideo40BR::new(), - info: Rc::new(DUMMY_CODEC_INFO), - dec: RV34Decoder::new(false, Box::new(RV40DSP::new())), - } - } -} - -impl NADecoder for RealVideo40Decoder { - fn init(&mut self, info: Rc<NACodecInfo>) -> DecoderResult<()> { - if let NACodecTypeInfo::Video(vinfo) = info.get_properties() { - let fmt = formats::YUV420_FORMAT; - let myinfo = NACodecTypeInfo::Video(NAVideoInfo::new(0, 0, false, fmt)); - self.info = Rc::new(NACodecInfo::new_ref(info.get_name(), myinfo, info.get_extradata())); - - let edata = info.get_extradata().unwrap(); - let src: &[u8] = &edata; - -{ -println!("edata:"); -for i in 0..src.len() { print!(" {:02X}", src[i]); } println!(""); -} - if src.len() < 2 { return Err(DecoderError::InvalidData); } - - self.bd.width = vinfo.get_width(); - self.bd.height = vinfo.get_height(); - Ok(()) - } else { -println!("???"); - Err(DecoderError::InvalidData) - } - } - fn decode(&mut self, pkt: &NAPacket) -> DecoderResult<NAFrameRef> { - let src = pkt.get_buffer(); - - let (bufinfo, ftype, ts) = self.dec.parse_frame(src.as_slice(), &mut self.bd)?; - - let mut frm = NAFrame::new_from_pkt(pkt, self.info.clone(), bufinfo); - frm.set_keyframe(ftype == FrameType::I); - frm.set_frame_type(ftype); - frm.set_pts(Some(ts)); - Ok(Rc::new(RefCell::new(frm))) - } -} - -pub fn get_decoder() -> Box<NADecoder> { - Box::new(RealVideo40Decoder::new()) -} - -#[cfg(test)] -mod test { - use crate::test::dec_video::test_file_decoding; - #[test] - fn test_rv40() { -// test_file_decoding("realmedia", "assets/RV/rv40_ralf.rmvb", Some(1000), true, false, /*None*/Some("rv40")); - test_file_decoding("realmedia", "assets/RV/rv40_weighted_mc.rmvb", Some(400), true, false, None/*Some("rv40")*/); -// test_file_decoding("realmedia", "assets/RV/rv40_weighted_mc_2.rmvb", Some(1000), true, false, /*None*/Some("rv40")); -//panic!("end"); - } -} - -const RV40_STANDARD_WIDTHS: [i16; 8] = [ 160, 172, 240, 320, 352, 640, 704, 0 ]; -const RV40_STANDARD_HEIGHTS: [i16; 12] = [ 120, 132, 144, 240, 288, 480, -8, -10, 180, 360, 576, 0 ]; - -const RV40_QUANT_DC: [[u8; 32]; 2] = [ - [ - 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, - 16, 17, 17, 18, 18, 18, 19, 19, 19, 20, 20, 20, 22, 22, 22, 22 - ], [ - 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, - 16, 17, 18, 19, 20, 20, 21, 21, 22, 23, 23, 23, 24, 24, 24, 24 - ] -]; - -const RV40_AIC_PATTERNS: [u16; 20] = [ - 0x000, 0x100, 0x200, - 0x011, 0x111, 0x211, 0x511, 0x611, - 0x022, 0x122, 0x222, 0x722, - 0x272, 0x227, - 0x822, 0x282, 0x228, - 0x112, 0x116, 0x221 -]; - -const RV40_AIC_TOP_CODES: [u8; 16] = [ - 0x01, 0x05, 0x01, 0x00, 0x03, 0x3D, 0x1D, 0x02, - 0x04, 0x3C, 0x3F, 0x1C, 0x0D, 0x3E, 0x0C, 0x01 -]; -const RV40_AIC_TOP_BITS: [u8; 16] = [ - 1, 4, 5, 5, 5, 7, 6, 5, 4, 7, 7, 6, 5, 7, 5, 3 -]; - -const RV40_AIC_MODE1_CODES_DUMMY: [u8; 1] = [ 0 ]; -const RV40_AIC_MODE1_BITS_DUMMY: [u8; 1] = [ 1 ]; - -const RV40_AIC_MODE1_CODES: [[u8; 9]; 90] = [ - [ 0x01, 0x01, 0x01, 0x11, 0x00, 0x09, 0x03, 0x10, 0x05 ], - [ 0x09, 0x01, 0x01, 0x05, 0x11, 0x00, 0x03, 0x21, 0x20 ], - [ 0x01, 0x01, 0x01, 0x11, 0x09, 0x10, 0x05, 0x00, 0x03 ], - [ 0x01, 0x01, 0x00, 0x03, 0x21, 0x05, 0x09, 0x20, 0x11 ], - [ 0x01, 0x09, 0x00, 0x29, 0x08, 0x15, 0x03, 0x0B, 0x28 ], - [ 0x01, 0x01, 0x01, 0x01, 0x00, 0x01, 0x01, 0x03, 0x02 ], - [ 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x01, 0x09, 0x08 ], - [ 0x01, 0x01, 0x01, 0x09, 0x01, 0x08, 0x00, 0x03, 0x05 ], - [ 0x01, 0x01, 0x01, 0x00, 0x05, 0x11, 0x09, 0x10, 0x03 ], - [ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ], - - [ 0x01, 0x01, 0x01, 0x05, 0x01, 0x00, 0x03, 0x09, 0x08 ], - [ 0x09, 0x01, 0x01, 0x05, 0x11, 0x00, 0x03, 0x21, 0x20 ], - [ 0x01, 0x01, 0x01, 0x0D, 0x05, 0x04, 0x00, 0x07, 0x0C ], - [ 0x01, 0x01, 0x00, 0x05, 0x11, 0x03, 0x09, 0x21, 0x20 ], - [ 0x05, 0x01, 0x01, 0x11, 0x00, 0x09, 0x03, 0x21, 0x20 ], - [ 0x09, 0x01, 0x01, 0x00, 0x05, 0x01, 0x03, 0x11, 0x10 ], - [ 0x01, 0x01, 0x01, 0x00, 0x01, 0x01, 0x01, 0x03, 0x02 ], - [ 0x01, 0x01, 0x01, 0x09, 0x00, 0x05, 0x01, 0x03, 0x08 ], - [ 0x01, 0x01, 0x01, 0x09, 0x11, 0x05, 0x00, 0x10, 0x03 ], - [ 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ], - - [ 0x01, 0x00, 0x01, 0x09, 0x08, 0x15, 0x14, 0x0B, 0x03 ], - [ 0x0D, 0x01, 0x01, 0x05, 0x0C, 0x04, 0x01, 0x00, 0x07 ], - [ 0x01, 0x01, 0x01, 0x05, 0x00, 0x04, 0x03, 0x01, 0x01 ], - [ 0x05, 0x01, 0x01, 0x04, 0x19, 0x07, 0x18, 0x0D, 0x00 ], - [ 0x11, 0x09, 0x01, 0x21, 0x05, 0x20, 0x01, 0x00, 0x03 ], - [ 0x41, 0x01, 0x00, 0x05, 0x40, 0x03, 0x09, 0x21, 0x11 ], - [ 0x29, 0x01, 0x00, 0x28, 0x09, 0x15, 0x03, 0x08, 0x0B ], - [ 0x01, 0x00, 0x01, 0x11, 0x09, 0x10, 0x05, 0x01, 0x03 ], - [ 0x05, 0x01, 0x01, 0x04, 0x0D, 0x0C, 0x07, 0x00, 0x01 ], - [ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ], - - [ 0x01, 0x00, 0x03, 0x05, 0x11, 0x10, 0x25, 0x24, 0x13 ], - [ 0x21, 0x01, 0x01, 0x00, 0x11, 0x03, 0x05, 0x20, 0x09 ], - [ 0x01, 0x01, 0x01, 0x00, 0x09, 0x11, 0x10, 0x05, 0x03 ], - [ 0x21, 0x05, 0x01, 0x01, 0x09, 0x00, 0x11, 0x20, 0x03 ], - [ 0x05, 0x01, 0x00, 0x04, 0x01, 0x19, 0x07, 0x18, 0x0D ], - [ 0x11, 0x01, 0x00, 0x01, 0x09, 0x01, 0x03, 0x10, 0x05 ], - [ 0x1D, 0x01, 0x05, 0x0D, 0x0C, 0x04, 0x00, 0x1C, 0x0F ], - [ 0x05, 0x19, 0x01, 0x04, 0x00, 0x18, 0x1B, 0x1A, 0x07 ], - [ 0x09, 0x01, 0x00, 0x01, 0x05, 0x03, 0x11, 0x10, 0x01 ], - [ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ], - - [ 0x01, 0x00, 0x03, 0x41, 0x05, 0x40, 0x09, 0x11, 0x21 ], - [ 0x05, 0x01, 0x01, 0x19, 0x04, 0x07, 0x00, 0x18, 0x0D ], - [ 0x01, 0x01, 0x01, 0x05, 0x01, 0x04, 0x01, 0x00, 0x03 ], - [ 0x01, 0x05, 0x00, 0x0D, 0x01, 0x04, 0x07, 0x19, 0x18 ], - [ 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x01, 0x03, 0x02 ], - [ 0x31, 0x01, 0x05, 0x19, 0x04, 0x07, 0x00, 0x30, 0x0D ], - [ 0x01, 0x00, 0x03, 0x11, 0x01, 0x05, 0x01, 0x09, 0x10 ], - [ 0x01, 0x05, 0x01, 0x11, 0x01, 0x10, 0x00, 0x03, 0x09 ], - [ 0x01, 0x09, 0x00, 0x29, 0x03, 0x08, 0x28, 0x15, 0x0B ], - [ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ], - - [ 0x01, 0x01, 0x00, 0x09, 0x15, 0x03, 0x08, 0x14, 0x0B ], - [ 0x11, 0x01, 0x01, 0x00, 0x09, 0x01, 0x03, 0x10, 0x05 ], - [ 0x01, 0x00, 0x03, 0x25, 0x11, 0x05, 0x10, 0x24, 0x13 ], - [ 0x11, 0x01, 0x00, 0x01, 0x09, 0x01, 0x05, 0x10, 0x03 ], - [ 0x05, 0x01, 0x00, 0x0D, 0x0C, 0x04, 0x0F, 0x1D, 0x1C ], - [ 0x01, 0x01, 0x01, 0x01, 0x00, 0x01, 0x01, 0x03, 0x02 ], - [ 0x21, 0x01, 0x05, 0x09, 0x11, 0x00, 0x03, 0x41, 0x40 ], - [ 0x05, 0x01, 0x00, 0x1D, 0x1C, 0x0D, 0x0C, 0x0F, 0x04 ], - [ 0x05, 0x01, 0x00, 0x0D, 0x31, 0x04, 0x19, 0x30, 0x07 ], - [ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ], - - [ 0x01, 0x01, 0x00, 0x21, 0x05, 0x11, 0x03, 0x09, 0x20 ], - [ 0x01, 0x01, 0x00, 0x11, 0x03, 0x05, 0x01, 0x09, 0x10 ], - [ 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x01, 0x03, 0x02 ], - [ 0x05, 0x01, 0x04, 0x19, 0x07, 0x0D, 0x00, 0x31, 0x30 ], - [ 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x01, 0x03, 0x02 ], - [ 0x05, 0x01, 0x01, 0x11, 0x09, 0x00, 0x03, 0x21, 0x20 ], - [ 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x01, 0x03, 0x02 ], - [ 0x01, 0x01, 0x01, 0x00, 0x01, 0x03, 0x01, 0x01, 0x02 ], - [ 0x09, 0x01, 0x00, 0x29, 0x08, 0x15, 0x03, 0x28, 0x0B ], - [ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ], - - [ 0x01, 0x01, 0x01, 0x05, 0x01, 0x04, 0x00, 0x01, 0x03 ], - [ 0x09, 0x01, 0x00, 0x29, 0x28, 0x15, 0x08, 0x03, 0x0B ], - [ 0x01, 0x00, 0x01, 0x11, 0x05, 0x10, 0x09, 0x01, 0x03 ], - [ 0x05, 0x04, 0x01, 0x1D, 0x0D, 0x0C, 0x1C, 0x00, 0x0F ], - [ 0x09, 0x11, 0x01, 0x41, 0x00, 0x40, 0x05, 0x03, 0x21 ], - [ 0x0D, 0x05, 0x01, 0x1D, 0x1C, 0x0C, 0x04, 0x00, 0x0F ], - [ 0x41, 0x09, 0x01, 0x40, 0x00, 0x11, 0x05, 0x03, 0x21 ], - [ 0x01, 0x01, 0x01, 0x05, 0x01, 0x04, 0x00, 0x01, 0x03 ], - [ 0x05, 0x04, 0x01, 0x0D, 0x01, 0x0C, 0x07, 0x01, 0x00 ], - [ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ], - - [ 0x05, 0x04, 0x01, 0x07, 0x19, 0x31, 0x30, 0x0D, 0x00 ], - [ 0x21, 0x01, 0x01, 0x00, 0x11, 0x09, 0x20, 0x05, 0x03 ], - [ 0x05, 0x01, 0x01, 0x04, 0x07, 0x0D, 0x0C, 0x00, 0x01 ], - [ 0x21, 0x09, 0x01, 0x00, 0x20, 0x05, 0x23, 0x22, 0x03 ], - [ 0x31, 0x0D, 0x01, 0x19, 0x05, 0x30, 0x04, 0x07, 0x00 ], - [ 0x31, 0x05, 0x01, 0x04, 0x19, 0x00, 0x0D, 0x30, 0x07 ], - [ 0x31, 0x01, 0x00, 0x0D, 0x05, 0x19, 0x04, 0x30, 0x07 ], - [ 0x01, 0x01, 0x01, 0x00, 0x01, 0x03, 0x02, 0x01, 0x01 ], - [ 0x01, 0x00, 0x01, 0x01, 0x05, 0x09, 0x08, 0x03, 0x01 ], - [ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ], -]; -static RV40_AIC_MODE1_BITS: [[u8; 9]; 90] = [ - [ 1, 4, 2, 7, 4, 6, 4, 7, 5 ], - [ 5, 1, 3, 4, 6, 3, 3, 7, 7 ], - [ 1, 4, 2, 7, 6, 7, 5, 4, 4 ], - [ 1, 3, 3, 3, 7, 4, 5, 7, 6 ], - [ 2, 4, 2, 6, 4, 5, 2, 4, 6 ], - [ 7, 2, 3, 4, 7, 1, 5, 7, 7 ], - [ 5, 1, 3, 6, 5, 5, 2, 7, 7 ], - [ 2, 5, 1, 7, 3, 7, 5, 5, 6 ], - [ 2, 4, 1, 4, 5, 7, 6, 7, 4 ], - [ 0, 0, 0, 0, 0, 0, 0, 0, 0 ], - - [ 2, 1, 3, 6, 5, 5, 5, 7, 7 ], - [ 5, 1, 3, 4, 6, 3, 3, 7, 7 ], - [ 4, 1, 2, 6, 5, 5, 4, 5, 6 ], - [ 3, 1, 3, 4, 6, 3, 5, 7, 7 ], - [ 4, 1, 3, 6, 3, 5, 3, 7, 7 ], - [ 6, 1, 4, 4, 5, 2, 4, 7, 7 ], - [ 7, 1, 5, 7, 4, 3, 2, 7, 7 ], - [ 5, 3, 2, 7, 5, 6, 1, 5, 7 ], - [ 4, 1, 2, 6, 7, 5, 4, 7, 4 ], - [ 1, 0, 1, 0, 0, 0, 0, 0, 0 ], - - [ 3, 3, 1, 5, 5, 6, 6, 5, 3 ], - [ 6, 2, 1, 5, 6, 5, 4, 4, 5 ], - [ 6, 4, 1, 7, 6, 7, 6, 3, 2 ], - [ 4, 3, 1, 4, 6, 4, 6, 5, 3 ], - [ 6, 5, 1, 7, 4, 7, 3, 3, 3 ], - [ 7, 2, 2, 3, 7, 2, 4, 6, 5 ], - [ 6, 2, 2, 6, 4, 5, 2, 4, 4 ], - [ 4, 4, 1, 7, 6, 7, 5, 2, 4 ], - [ 5, 4, 1, 5, 6, 6, 5, 4, 2 ], - [ 0, 0, 0, 0, 0, 0, 0, 0, 0 ], - - [ 2, 2, 2, 3, 5, 5, 6, 6, 5 ], - [ 7, 1, 3, 3, 6, 3, 4, 7, 5 ], - [ 2, 4, 1, 4, 6, 7, 7, 5, 4 ], - [ 7, 4, 3, 1, 5, 3, 6, 7, 3 ], - [ 4, 3, 3, 4, 1, 6, 4, 6, 5 ], - [ 7, 4, 4, 2, 6, 1, 4, 7, 5 ], - [ 5, 2, 3, 4, 4, 3, 2, 5, 4 ], - [ 3, 5, 2, 3, 2, 5, 5, 5, 3 ], - [ 6, 4, 4, 2, 5, 4, 7, 7, 1 ], - [ 0, 0, 0, 0, 0, 0, 0, 0, 0 ], - - [ 2, 2, 2, 7, 3, 7, 4, 5, 6 ], - [ 4, 1, 3, 6, 4, 4, 3, 6, 5 ], - [ 2, 4, 1, 7, 3, 7, 6, 6, 6 ], - [ 3, 4, 3, 5, 1, 4, 4, 6, 6 ], - [ 4, 5, 2, 7, 1, 7, 3, 7, 7 ], - [ 6, 2, 3, 5, 3, 3, 2, 6, 4 ], - [ 4, 4, 4, 7, 2, 5, 1, 6, 7 ], - [ 4, 5, 2, 7, 1, 7, 4, 4, 6 ], - [ 2, 4, 2, 6, 2, 4, 6, 5, 4 ], - [ 0, 0, 0, 0, 0, 0, 0, 0, 0 ], - - [ 1, 3, 3, 5, 6, 3, 5, 6, 5 ], - [ 7, 1, 4, 4, 6, 2, 4, 7, 5 ], - [ 2, 2, 2, 6, 5, 3, 5, 6, 5 ], - [ 7, 4, 4, 2, 6, 1, 5, 7, 4 ], - [ 3, 2, 2, 4, 4, 3, 4, 5, 5 ], - [ 7, 2, 5, 3, 7, 1, 4, 7, 7 ], - [ 6, 2, 3, 4, 5, 2, 2, 7, 7 ], - [ 3, 2, 2, 5, 5, 4, 4, 4, 3 ], - [ 3, 2, 2, 4, 6, 3, 5, 6, 3 ], - [ 0, 0, 0, 0, 0, 0, 0, 0, 0 ], - - [ 1, 3, 3, 7, 4, 6, 3, 5, 7 ], - [ 4, 1, 4, 7, 4, 5, 2, 6, 7 ], - [ 2, 4, 1, 7, 5, 7, 3, 7, 7 ], - [ 3, 2, 3, 5, 3, 4, 2, 6, 6 ], - [ 3, 5, 4, 7, 2, 7, 1, 7, 7 ], - [ 4, 1, 3, 6, 5, 3, 3, 7, 7 ], - [ 4, 2, 5, 7, 3, 7, 1, 7, 7 ], - [ 7, 4, 1, 7, 3, 7, 2, 5, 7 ], - [ 4, 2, 2, 6, 4, 5, 2, 6, 4 ], - [ 0, 0, 0, 0, 0, 0, 0, 0, 0 ], - - [ 3, 4, 1, 7, 6, 7, 6, 2, 6 ], - [ 4, 2, 2, 6, 6, 5, 4, 2, 4 ], - [ 4, 4, 1, 7, 5, 7, 6, 2, 4 ], - [ 3, 3, 2, 5, 4, 4, 5, 2, 4 ], - [ 4, 5, 2, 7, 2, 7, 3, 2, 6 ], - [ 4, 3, 2, 5, 5, 4, 3, 2, 4 ], - [ 7, 4, 2, 7, 2, 5, 3, 2, 6 ], - [ 4, 6, 2, 7, 3, 7, 6, 1, 6 ], - [ 5, 5, 1, 6, 4, 6, 5, 2, 4 ], - [ 0, 0, 0, 0, 0, 0, 0, 0, 0 ], - - [ 3, 3, 2, 3, 5, 6, 6, 4, 2 ], - [ 7, 1, 3, 3, 6, 5, 7, 4, 3 ], - [ 5, 4, 1, 5, 5, 6, 6, 4, 2 ], - [ 6, 4, 2, 2, 6, 3, 6, 6, 2 ], - [ 6, 4, 2, 5, 3, 6, 3, 3, 2 ], - [ 6, 3, 2, 3, 5, 2, 4, 6, 3 ], - [ 6, 2, 2, 4, 3, 5, 3, 6, 3 ], - [ 7, 5, 1, 7, 4, 7, 7, 3, 2 ], - [ 5, 5, 2, 3, 6, 7, 7, 5, 1 ], - [ 0, 0, 0, 0, 0, 0, 0, 0, 0 ], -]; - -const RV40_AIC_MODE2_CODES: [[u16; 81]; 20] = [ - [ - 0x0001, 0x0001, 0x0005, 0x01F5, 0x0011, 0x0049, 0x0000, 0x0048, 0x004B, - 0x0035, 0x0003, 0x0034, 0x03C9, 0x01F4, 0x00C9, 0x004A, 0x0FD9, 0x03C8, - 0x0010, 0x0037, 0x0001, 0x00C8, 0x0075, 0x01F7, 0x00CB, 0x0074, 0x0002, - 0x01F6, 0x00CA, 0x01F1, 0x01F0, 0x1F81, 0x07F9, 0x1F80, 0x1F83, 0x07F8, - 0x0077, 0x00F5, 0x0036, 0x07FB, 0x0076, 0x1F82, 0x00F4, 0x00F7, 0x07FA, - 0x0071, 0x00F6, 0x03CB, 0x03CA, 0x0FD8, 0x00F1, 0x03F5, 0x1F8D, 0x07E5, - 0x0013, 0x0031, 0x00F0, 0x0FDB, 0x00F3, 0x07E4, 0x0030, 0x01F3, 0x07E7, - 0x03F4, 0x07E6, 0x0070, 0x3F19, 0x01F2, 0x3F18, 0x0FDA, 0x0033, 0x07E1, - 0x01FD, 0x01FC, 0x0073, 0x01FF, 0x0FC5, 0x0FC4, 0x0FC7, 0x03F7, 0x0072, - ], [ - 0x0005, 0x0005, 0x0005, 0x0079, 0x0005, 0x000D, 0x001D, 0x0078, 0x0069, - 0x0004, 0x0001, 0x0007, 0x0068, 0x001C, 0x001F, 0x0004, 0x006B, 0x000C, - 0x0004, 0x001E, 0x0006, 0x006A, 0x0015, 0x000F, 0x0014, 0x0017, 0x0007, - 0x0016, 0x000E, 0x0011, 0x0009, 0x00D1, 0x00D0, 0x0181, 0x00D3, 0x007B, - 0x0010, 0x0013, 0x0004, 0x00D2, 0x0007, 0x0319, 0x0008, 0x007A, 0x00DD, - 0x0019, 0x0006, 0x000B, 0x0065, 0x00DC, 0x0012, 0x0064, 0x0180, 0x00DF, - 0x0006, 0x0018, 0x0001, 0x00DE, 0x001D, 0x00D9, 0x001B, 0x0067, 0x000A, - 0x00D8, 0x00DB, 0x001C, 0x0318, 0x00DA, 0x0635, 0x0183, 0x0000, 0x00C5, - 0x0066, 0x0061, 0x0035, 0x00C4, 0x0182, 0x0634, 0x031B, 0x00C7, 0x001F, - ], [ - 0x0005, 0x0001, 0x001D, 0x01C1, 0x0035, 0x00F1, 0x006D, 0x00F0, 0x0049, - 0x0000, 0x0004, 0x0003, 0x00F3, 0x0048, 0x0034, 0x006C, 0x01C0, 0x01C3, - 0x0007, 0x0006, 0x0001, 0x006F, 0x0002, 0x004B, 0x006E, 0x001C, 0x0005, - 0x0069, 0x0068, 0x006B, 0x0037, 0x01C2, 0x00F2, 0x0395, 0x01CD, 0x00FD, - 0x006A, 0x0036, 0x0015, 0x01CC, 0x0014, 0x0394, 0x004A, 0x00FC, 0x00FF, - 0x0017, 0x0031, 0x00FE, 0x01CF, 0x0397, 0x00F9, 0x01CE, 0x0725, 0x0396, - 0x0016, 0x0030, 0x0075, 0x0724, 0x00F8, 0x0727, 0x0033, 0x0391, 0x0390, - 0x0011, 0x0032, 0x001F, 0x00FB, 0x0074, 0x0726, 0x00FA, 0x001E, 0x0077, - 0x0019, 0x0018, 0x0004, 0x0010, 0x003D, 0x0076, 0x0071, 0x0013, 0x0001, - ], [ - 0x000D, 0x0019, 0x0011, 0x0015, 0x0061, 0x0019, 0x0014, 0x01AD, 0x0060, - 0x0018, 0x0001, 0x0005, 0x001B, 0x0010, 0x0019, 0x0005, 0x0017, 0x0018, - 0x0016, 0x0004, 0x0004, 0x0013, 0x000C, 0x0012, 0x001A, 0x0018, 0x0005, - 0x000F, 0x001B, 0x0004, 0x001D, 0x0011, 0x001C, 0x0010, 0x000E, 0x001B, - 0x0013, 0x001F, 0x001A, 0x0029, 0x0005, 0x0063, 0x001E, 0x0009, 0x0062, - 0x0008, 0x0007, 0x0007, 0x0019, 0x0004, 0x001A, 0x0018, 0x006D, 0x0007, - 0x001B, 0x0007, 0x001A, 0x006C, 0x0006, 0x0012, 0x0005, 0x006F, 0x000B, - 0x006E, 0x0069, 0x001D, 0x0359, 0x0028, 0x002B, 0x002A, 0x001C, 0x00D5, - 0x0358, 0x001F, 0x0001, 0x001E, 0x0068, 0x00D4, 0x00D7, 0x0019, 0x0000, - ], [ - 0x00B9, 0x0061, 0x0060, 0x00B8, 0x02B5, 0x01AD, 0x00BB, 0x0AF5, 0x0151, - 0x0001, 0x0001, 0x0005, 0x0000, 0x0003, 0x0005, 0x0004, 0x0063, 0x0025, - 0x00BA, 0x0004, 0x0007, 0x0062, 0x00A5, 0x0024, 0x006D, 0x0002, 0x006C, - 0x02B4, 0x000D, 0x006F, 0x0027, 0x00A4, 0x0026, 0x01AC, 0x0150, 0x01AF, - 0x01AE, 0x0021, 0x006E, 0x02B7, 0x0020, 0x0153, 0x0023, 0x00A7, 0x0152, - 0x00A6, 0x0006, 0x000C, 0x0022, 0x01A9, 0x0019, 0x002D, 0x02B6, 0x01A8, - 0x000F, 0x0007, 0x000E, 0x00A1, 0x0069, 0x002C, 0x0001, 0x01AB, 0x00A0, - 0x02B1, 0x00A3, 0x002F, 0x0AF4, 0x02B0, 0x0AF7, 0x02B3, 0x0068, 0x015D, - 0x0AF6, 0x01AA, 0x0055, 0x015C, 0x02B2, 0x0579, 0x0578, 0x015F, 0x00A2, - ], [ - 0x0905, 0x013D, 0x013C, 0x0904, 0x121D, 0x049D, 0x049C, 0x243D, 0x0907, - 0x00ED, 0x0001, 0x0015, 0x0041, 0x013F, 0x0031, 0x0014, 0x025D, 0x025C, - 0x013E, 0x000D, 0x0000, 0x0040, 0x0139, 0x0043, 0x0030, 0x0017, 0x0033, - 0x0906, 0x0032, 0x0042, 0x00EC, 0x025F, 0x00EF, 0x025E, 0x049F, 0x0138, - 0x0901, 0x013B, 0x0259, 0x121C, 0x049E, 0x0900, 0x0258, 0x243C, 0x121F, - 0x0903, 0x003D, 0x00EE, 0x025B, 0x025A, 0x004D, 0x013A, 0x0902, 0x0245, - 0x00E9, 0x0016, 0x00E8, 0x0499, 0x0125, 0x0244, 0x004C, 0x0498, 0x090D, - 0x00EB, 0x003C, 0x0011, 0x049B, 0x049A, 0x0485, 0x00EA, 0x003F, 0x0124, - 0x090C, 0x003E, 0x0039, 0x0095, 0x0247, 0x0246, 0x0484, 0x0094, 0x0038, - ], [ - 0x0F09, 0x00CD, 0x01FD, 0x0791, 0x1E6D, 0x0790, 0x03D9, 0x3CD1, 0x3CD0, - 0x0075, 0x0001, 0x0001, 0x0035, 0x00CC, 0x0011, 0x0000, 0x03D8, 0x01FC, - 0x03DB, 0x0010, 0x0003, 0x00CF, 0x03DA, 0x00CE, 0x0074, 0x0034, 0x0077, - 0x0793, 0x0013, 0x0076, 0x0071, 0x03C5, 0x0070, 0x01FF, 0x0792, 0x01FE, - 0x01F9, 0x0037, 0x00C9, 0x0F08, 0x01F8, 0x03C4, 0x00C8, 0x0F0B, 0x079D, - 0x03C7, 0x0001, 0x0012, 0x0073, 0x00CB, 0x0005, 0x0036, 0x03C6, 0x0072, - 0x007D, 0x0002, 0x00CA, 0x079C, 0x01FB, 0x00F5, 0x0031, 0x079F, 0x0F0A, - 0x0F35, 0x079E, 0x01FA, 0x1E6C, 0x1E6F, 0x3CD3, 0x0799, 0x03C1, 0x1E6E, - 0x3CD2, 0x0030, 0x00F4, 0x007C, 0x03C0, 0x03C3, 0x0798, 0x01E5, 0x00F7, - ], [ - 0x01A5, 0x0001, 0x001D, 0x0021, 0x00A1, 0x000D, 0x0061, 0x06B9, 0x00A0, - 0x0060, 0x0001, 0x0005, 0x000C, 0x0020, 0x001C, 0x0004, 0x01A4, 0x01A7, - 0x00A3, 0x001F, 0x001E, 0x0023, 0x0022, 0x002D, 0x002C, 0x0063, 0x0062, - 0x1A81, 0x01A6, 0x01A1, 0x06B8, 0x06BB, 0x00A2, 0x06BA, 0x0D59, 0x06A5, - 0x01A0, 0x000F, 0x006D, 0x06A4, 0x002F, 0x00AD, 0x006C, 0x06A7, 0x00AC, - 0x0D58, 0x000E, 0x01A3, 0x00AF, 0x00AE, 0x006F, 0x01A2, 0x0D5B, 0x00A9, - 0x0019, 0x0001, 0x0009, 0x00A8, 0x006E, 0x002E, 0x0000, 0x01AD, 0x00AB, - 0x00AA, 0x0355, 0x0029, 0x1A80, 0x1A83, 0x1A82, 0x0354, 0x01AC, 0x0D5A, - 0x1A8D, 0x01AF, 0x0357, 0x0D45, 0x0D44, 0x0D47, 0x1A8C, 0x06A6, 0x06A1, - ], [ - 0x0001, 0x0011, 0x0005, 0x0775, 0x00F9, 0x00F8, 0x0031, 0x0030, 0x0049, - 0x00FB, 0x0010, 0x0033, 0x0EC9, 0x038D, 0x038C, 0x00FA, 0x038F, 0x0774, - 0x0048, 0x0032, 0x0000, 0x01D5, 0x00E5, 0x038E, 0x00E4, 0x0013, 0x000D, - 0x0389, 0x0777, 0x0388, 0x038B, 0x1DF9, 0x0EC8, 0x3BC9, 0x1DF8, 0x038A, - 0x03B5, 0x0776, 0x00E7, 0x3BC8, 0x01D4, 0x3BCB, 0x0ECB, 0x0771, 0x0ECA, - 0x01D7, 0x03B4, 0x01D6, 0x1DFB, 0x0EF5, 0x0770, 0x0EF4, 0x3BCA, 0x0773, - 0x00E6, 0x03B7, 0x004B, 0x1DFA, 0x03B6, 0x0EF7, 0x00E1, 0x0EF6, 0x0EF1, - 0x03B1, 0x01D1, 0x003D, 0x0EF0, 0x0772, 0x077D, 0x077C, 0x003C, 0x01D0, - 0x03B0, 0x01D3, 0x003F, 0x03B3, 0x01D2, 0x0EF3, 0x077F, 0x00E0, 0x004A, - ], [ - 0x0015, 0x0049, 0x0014, 0x07D1, 0x03FD, 0x03FC, 0x01C1, 0x01C0, 0x00F1, - 0x0017, 0x0001, 0x0001, 0x01C3, 0x0048, 0x004B, 0x0016, 0x0031, 0x01C2, - 0x004A, 0x0011, 0x0000, 0x01CD, 0x00F0, 0x01CC, 0x0075, 0x0010, 0x000D, - 0x03FF, 0x01CF, 0x01CE, 0x07D0, 0x0F81, 0x07D3, 0x1F1D, 0x0F80, 0x07D2, - 0x01C9, 0x03FE, 0x0074, 0x07DD, 0x00F3, 0x1F1C, 0x07DC, 0x03F9, 0x07DF, - 0x00F2, 0x00FD, 0x0077, 0x07DE, 0x07D9, 0x01C8, 0x07D8, 0x0F83, 0x03F8, - 0x0030, 0x0076, 0x0013, 0x0F82, 0x00FC, 0x03FB, 0x0033, 0x03FA, 0x03E5, - 0x03E4, 0x01CB, 0x0032, 0x1F1F, 0x03E7, 0x07DB, 0x07DA, 0x003D, 0x01CA, - 0x07C5, 0x03E6, 0x0071, 0x0F8D, 0x07C4, 0x1F1E, 0x0F8C, 0x03E1, 0x01F5, - ], [ - 0x0019, 0x0065, 0x0018, 0x0351, 0x0350, 0x0353, 0x0021, 0x0020, 0x0064, - 0x001D, 0x0005, 0x0005, 0x01A5, 0x0023, 0x0067, 0x0005, 0x0066, 0x0022, - 0x001B, 0x0004, 0x0001, 0x0004, 0x001C, 0x0061, 0x001A, 0x0005, 0x0004, - 0x0007, 0x002D, 0x0006, 0x002C, 0x01A4, 0x002F, 0x0352, 0x035D, 0x0060, - 0x0001, 0x002E, 0x001F, 0x035C, 0x0000, 0x06B1, 0x01A7, 0x0029, 0x01A6, - 0x0028, 0x0063, 0x0062, 0x035F, 0x01A1, 0x002B, 0x06B0, 0x06B3, 0x01A0, - 0x0003, 0x006D, 0x001E, 0x035E, 0x006C, 0x06B2, 0x0002, 0x01A3, 0x01A2, - 0x000D, 0x0005, 0x0007, 0x01AD, 0x006F, 0x002A, 0x006E, 0x0004, 0x0004, - 0x000C, 0x0007, 0x0006, 0x000F, 0x000E, 0x00D5, 0x0009, 0x0006, 0x0007, - ], [ - 0x0065, 0x0181, 0x0064, 0x36C9, 0x06D5, 0x0DB5, 0x0379, 0x0180, 0x0183, - 0x00D5, 0x001D, 0x001C, 0x0DB4, 0x0182, 0x0378, 0x00D4, 0x00D7, 0x06D4, - 0x0067, 0x001F, 0x0001, 0x00D6, 0x00D1, 0x018D, 0x0066, 0x0001, 0x0000, - 0x037B, 0x06D7, 0x037A, 0x0DB7, 0x36C8, 0x06D6, 0x0DB6, 0x1B79, 0x0DB1, - 0x018C, 0x0365, 0x00D0, 0x1B78, 0x00D3, 0x1B7B, 0x0364, 0x06D1, 0x06D0, - 0x018F, 0x018E, 0x00D2, 0x36CB, 0x0367, 0x0366, 0x06D3, 0x0DB0, 0x06D2, - 0x0361, 0x06DD, 0x0189, 0x36CA, 0x0360, 0x36F5, 0x0188, 0x0DB3, 0x36F4, - 0x0009, 0x0008, 0x0005, 0x06DC, 0x00DD, 0x018B, 0x00DC, 0x0004, 0x000B, - 0x018A, 0x0061, 0x0003, 0x0363, 0x00DF, 0x06DF, 0x0362, 0x000A, 0x001E, - ], [ - 0x001D, 0x0061, 0x000D, 0x0D55, 0x06B9, 0x06B8, 0x01A5, 0x0021, 0x0020, - 0x0023, 0x000C, 0x0060, 0x0D54, 0x00AD, 0x00AC, 0x0022, 0x00AF, 0x06BB, - 0x000F, 0x001C, 0x0001, 0x002D, 0x0063, 0x01A4, 0x000E, 0x0001, 0x0005, - 0x01A7, 0x06BA, 0x01A6, 0x06A5, 0x0D57, 0x0D56, 0x1ABD, 0x0D51, 0x00AE, - 0x002C, 0x00A9, 0x002F, 0x0D50, 0x01A1, 0x1ABC, 0x06A4, 0x06A7, 0x06A6, - 0x00A8, 0x06A1, 0x01A0, 0x1ABF, 0x0D53, 0x06A0, 0x0D52, 0x1ABE, 0x06A3, - 0x0062, 0x002E, 0x0009, 0x0D5D, 0x01A3, 0x0D5C, 0x006D, 0x00AB, 0x06A2, - 0x006C, 0x001F, 0x0001, 0x06AD, 0x0029, 0x01A2, 0x0028, 0x0004, 0x001E, - 0x01AD, 0x006F, 0x0000, 0x01AC, 0x01AF, 0x06AC, 0x00AA, 0x006E, 0x0019, - ], [ - 0x0019, 0x007D, 0x0018, 0x01B5, 0x000D, 0x01B4, 0x007C, 0x007F, 0x01B7, - 0x000C, 0x001B, 0x001A, 0x01B6, 0x000F, 0x00D5, 0x0019, 0x007E, 0x00D4, - 0x0018, 0x001B, 0x0001, 0x000E, 0x0011, 0x0009, 0x0005, 0x0005, 0x0005, - 0x00D7, 0x01B1, 0x0008, 0x01B0, 0x0079, 0x06FD, 0x0371, 0x0370, 0x00D6, - 0x0078, 0x01B3, 0x0010, 0x0373, 0x0013, 0x06FC, 0x007B, 0x007A, 0x00D1, - 0x00D0, 0x00D3, 0x0065, 0x0372, 0x06FF, 0x0064, 0x06FE, 0x037D, 0x00D2, - 0x00DD, 0x0067, 0x0004, 0x037C, 0x0012, 0x01B2, 0x0007, 0x0066, 0x01BD, - 0x0006, 0x0061, 0x0004, 0x01BC, 0x001A, 0x0060, 0x001D, 0x0004, 0x001C, - 0x0063, 0x0001, 0x0007, 0x000B, 0x0000, 0x0062, 0x000A, 0x0005, 0x0007, - ], [ - 0x0069, 0x0045, 0x0068, 0x04BD, 0x0255, 0x04BC, 0x00E5, 0x00E4, 0x0031, - 0x0030, 0x0019, 0x0001, 0x0121, 0x00E7, 0x00E6, 0x0033, 0x00E1, 0x00E0, - 0x006B, 0x0018, 0x0001, 0x0044, 0x0032, 0x0047, 0x006A, 0x001B, 0x0005, - 0x003D, 0x0046, 0x0015, 0x0041, 0x0120, 0x0123, 0x04BF, 0x0122, 0x0040, - 0x003C, 0x00E3, 0x0014, 0x0254, 0x0043, 0x0975, 0x012D, 0x00E2, 0x00ED, - 0x0042, 0x00EC, 0x004D, 0x0257, 0x0256, 0x0251, 0x04BE, 0x0974, 0x0250, - 0x00EF, 0x00EE, 0x004C, 0x04B9, 0x012C, 0x04B8, 0x004F, 0x04BB, 0x0253, - 0x003F, 0x0017, 0x0001, 0x0252, 0x00E9, 0x00E8, 0x00EB, 0x0000, 0x0003, - 0x0016, 0x0002, 0x0004, 0x004E, 0x003E, 0x00EA, 0x0049, 0x000D, 0x0007, - ], [ - 0x000D, 0x01BD, 0x000C, 0x0D31, 0x0D30, 0x0D33, 0x0359, 0x0358, 0x002D, - 0x0065, 0x001D, 0x001C, 0x0D32, 0x035B, 0x035A, 0x002C, 0x01BC, 0x0345, - 0x000F, 0x001F, 0x0001, 0x002F, 0x0064, 0x01BF, 0x0067, 0x0001, 0x0005, - 0x0066, 0x002E, 0x0061, 0x0029, 0x0695, 0x0694, 0x0697, 0x0696, 0x0060, - 0x01BE, 0x0D3D, 0x0028, 0x1A49, 0x0344, 0x1A48, 0x1A4B, 0x0D3C, 0x0691, - 0x002B, 0x01B9, 0x002A, 0x0D3F, 0x0690, 0x0347, 0x0D3E, 0x1A4A, 0x0346, - 0x00D5, 0x0341, 0x0063, 0x0D39, 0x0340, 0x0D38, 0x01B8, 0x0D3B, 0x0D3A, - 0x00D4, 0x0062, 0x0000, 0x0693, 0x01BB, 0x0343, 0x0342, 0x001E, 0x000E, - 0x006D, 0x0009, 0x0001, 0x006C, 0x00D7, 0x034D, 0x01BA, 0x0008, 0x0004, - ], [ - 0x0075, 0x00CD, 0x0035, 0x03C1, 0x03C0, 0x07F9, 0x03C3, 0x1F8D, 0x00CC, - 0x0074, 0x0011, 0x0010, 0x03C2, 0x0FD9, 0x01F1, 0x00CF, 0x03CD, 0x00CE, - 0x0034, 0x0001, 0x0001, 0x0037, 0x00C9, 0x00C8, 0x0036, 0x0000, 0x0001, - 0x0FD8, 0x03CC, 0x00CB, 0x01F0, 0x07F8, 0x03CF, 0x07FB, 0x07FA, 0x00CA, - 0x01F3, 0x03CE, 0x00F5, 0x0FDB, 0x00F4, 0x07E5, 0x07E4, 0x07E7, 0x01F2, - 0x07E6, 0x03C9, 0x01FD, 0x0FDA, 0x1F8C, 0x07E1, 0x1F8F, 0x1F8E, 0x03C8, - 0x03CB, 0x0077, 0x0076, 0x0FC5, 0x03CA, 0x07E0, 0x00F7, 0x0FC4, 0x03F5, - 0x00F6, 0x01FC, 0x0003, 0x03F4, 0x0071, 0x03F7, 0x00F1, 0x0013, 0x0031, - 0x0030, 0x0070, 0x0005, 0x0012, 0x0073, 0x01FF, 0x0072, 0x007D, 0x0002, - ], [ - 0x0061, 0x0055, 0x0060, 0x02C9, 0x02C8, 0x02CB, 0x0171, 0x00B5, 0x0054, - 0x0001, 0x0001, 0x0001, 0x0057, 0x0001, 0x0063, 0x001D, 0x0062, 0x0039, - 0x006D, 0x0000, 0x0005, 0x0038, 0x0056, 0x00B4, 0x006C, 0x0003, 0x001C, - 0x006F, 0x003B, 0x0002, 0x003A, 0x0170, 0x00B7, 0x0173, 0x0051, 0x006E, - 0x0025, 0x0050, 0x0069, 0x02CA, 0x0024, 0x0027, 0x0172, 0x00B6, 0x00B1, - 0x000D, 0x000C, 0x001F, 0x017D, 0x0026, 0x0068, 0x0053, 0x017C, 0x006B, - 0x001E, 0x000F, 0x0004, 0x017F, 0x006A, 0x02F5, 0x0019, 0x0021, 0x0052, - 0x02F4, 0x02F7, 0x0020, 0x0BCD, 0x05E5, 0x05E4, 0x0BCC, 0x0023, 0x00B0, - 0x02F6, 0x00B3, 0x0022, 0x02F1, 0x02F0, 0x0BCF, 0x0BCE, 0x017E, 0x005D, - ], [ - 0x00BD, 0x0025, 0x01A1, 0x0159, 0x0299, 0x00BC, 0x0024, 0x0505, 0x0504, - 0x01A0, 0x0001, 0x001D, 0x006D, 0x001C, 0x0001, 0x0005, 0x0027, 0x01A3, - 0x0158, 0x001F, 0x001E, 0x01A2, 0x0026, 0x0021, 0x000D, 0x0020, 0x0023, - 0x0298, 0x006C, 0x0022, 0x00BF, 0x00BE, 0x01AD, 0x002D, 0x029B, 0x00B9, - 0x01AC, 0x00B8, 0x01AF, 0x029A, 0x006F, 0x015B, 0x006E, 0x0285, 0x0284, - 0x01AE, 0x0019, 0x002C, 0x01A9, 0x01A8, 0x000C, 0x000F, 0x015A, 0x00BB, - 0x000E, 0x0000, 0x0069, 0x01AB, 0x0018, 0x01AA, 0x0004, 0x0055, 0x00BA, - 0x0507, 0x0145, 0x0054, 0x0506, 0x00A5, 0x0501, 0x00A4, 0x0057, 0x0500, - 0x0A05, 0x0144, 0x00A7, 0x0287, 0x0286, 0x0503, 0x0147, 0x0A04, 0x0146, - ], [ - 0x0759, 0x0041, 0x00E5, 0x03BD, 0x0E9D, 0x012D, 0x012C, 0x3A1D, 0x03BC, - 0x012F, 0x000D, 0x0040, 0x00E4, 0x03BF, 0x0043, 0x0042, 0x0758, 0x03BE, - 0x00E7, 0x0001, 0x0000, 0x003D, 0x00E6, 0x0015, 0x0014, 0x0017, 0x003C, - 0x743D, 0x012E, 0x03B9, 0x03B8, 0x0E9C, 0x03BB, 0x075B, 0x3A1C, 0x0E9F, - 0x0129, 0x00E1, 0x0128, 0x0E9E, 0x012B, 0x075A, 0x00E0, 0x0E99, 0x0745, - 0x3A1F, 0x03BA, 0x0744, 0x0E98, 0x1D0D, 0x03A5, 0x0E9B, 0x743C, 0x0E9A, - 0x012A, 0x004D, 0x00E3, 0x0E85, 0x01D5, 0x0E84, 0x004C, 0x0747, 0x1D0C, - 0x01D4, 0x003F, 0x0016, 0x0746, 0x03A4, 0x0741, 0x004F, 0x003E, 0x01D7, - 0x0740, 0x000C, 0x0011, 0x004E, 0x00E2, 0x00ED, 0x00EC, 0x0049, 0x0048, - ] -]; -const RV40_AIC_MODE2_BITS: [[u8; 81]; 20] = [ - [ -1, 5, 4, 10, 6, 8, 5, 8, 8, - 7, 5, 7, 11, 10, 9, 8, 13, 11, - 6, 7, 3, 9, 8, 10, 9, 8, 5, - 10, 9, 10, 10, 14, 12, 14, 14, 12, - 8, 9, 7, 12, 8, 14, 9, 9, 12, - 8, 9, 11, 11, 13, 9, 11, 14, 12, - 6, 7, 9, 13, 9, 12, 7, 10, 12, - 11, 12, 8, 15, 10, 15, 13, 7, 12, - 10, 10, 8, 10, 13, 13, 13, 11, 8, - ], [ - 4, 6, 5, 11, 8, 10, 7, 11, 9, - 4, 1, 4, 9, 7, 7, 5, 9, 10, - 6, 7, 4, 9, 9, 10, 9, 9, 6, - 9, 10, 9, 10, 12, 12, 13, 12, 11, - 9, 9, 8, 12, 8, 14, 10, 11, 12, - 7, 8, 10, 11, 12, 9, 11, 13, 12, - 6, 7, 8, 12, 9, 12, 7, 11, 10, - 12, 12, 9, 14, 12, 15, 13, 8, 12, - 11, 11, 10, 12, 13, 15, 14, 12, 9, - ], [ - 5, 7, 6, 12, 9, 11, 8, 11, 10, - 7, 5, 7, 11, 10, 9, 8, 12, 12, - 5, 5, 1, 8, 7, 10, 8, 6, 4, - 8, 8, 8, 9, 12, 11, 13, 12, 11, - 8, 9, 8, 12, 8, 13, 10, 11, 11, - 8, 9, 11, 12, 13, 11, 12, 14, 13, - 8, 9, 10, 14, 11, 14, 9, 13, 13, - 8, 9, 6, 11, 10, 14, 11, 6, 10, - 6, 6, 4, 8, 9, 10, 10, 8, 5, - ], [ - 11, 7, 8, 10, 12, 9, 10, 14, 12, - 7, 1, 5, 7, 8, 6, 4, 10, 9, - 10, 5, 4, 8, 11, 8, 7, 6, 7, - 11, 6, 7, 8, 10, 8, 10, 11, 9, - 10, 8, 9, 13, 9, 12, 8, 11, 12, - 11, 4, 7, 8, 9, 6, 8, 12, 9, - 8, 5, 8, 12, 9, 10, 6, 12, 11, - 12, 12, 10, 15, 13, 13, 13, 10, 13, - 15, 10, 9, 10, 12, 13, 13, 10, 9, - ], [ - 11, 8, 8, 11, 13, 10, 11, 15, 12, - 7, 1, 4, 7, 7, 5, 4, 8, 9, - 11, 5, 5, 8, 11, 9, 8, 7, 8, - 13, 7, 8, 9, 11, 9, 10, 12, 10, - 10, 9, 8, 13, 9, 12, 9, 11, 12, - 11, 5, 7, 9, 10, 6, 9, 13, 10, - 7, 4, 7, 11, 8, 9, 5, 10, 11, - 13, 11, 9, 15, 13, 15, 13, 8, 12, - 15, 10, 10, 12, 13, 14, 14, 12, 11, - ], [ - 12, 9, 9, 12, 13, 11, 11, 14, 12, - 8, 2, 5, 7, 9, 6, 5, 10, 10, - 9, 4, 2, 7, 9, 7, 6, 5, 6, - 12, 6, 7, 8, 10, 8, 10, 11, 9, - 12, 9, 10, 13, 11, 12, 10, 14, 13, - 12, 6, 8, 10, 10, 7, 9, 12, 10, - 8, 5, 8, 11, 9, 10, 7, 11, 12, - 8, 6, 5, 11, 11, 11, 8, 6, 9, - 12, 6, 6, 8, 10, 10, 11, 8, 6, - ], [ - 13, 9, 10, 12, 14, 12, 11, 15, 15, - 8, 1, 5, 7, 9, 6, 5, 11, 10, - 11, 6, 5, 9, 11, 9, 8, 7, 8, - 12, 6, 8, 8, 11, 8, 10, 12, 10, - 10, 7, 9, 13, 10, 11, 9, 13, 12, - 11, 3, 6, 8, 9, 4, 7, 11, 8, - 8, 5, 9, 12, 10, 9, 7, 12, 13, - 13, 12, 10, 14, 14, 15, 12, 11, 14, - 15, 7, 9, 8, 11, 11, 12, 10, 9, - ], [ - 10, 5, 6, 9, 11, 7, 8, 12, 11, - 8, 1, 4, 7, 9, 6, 4, 10, 10, - 11, 6, 6, 9, 9, 9, 9, 8, 8, - 14, 10, 10, 12, 12, 11, 12, 13, 12, - 10, 7, 8, 12, 9, 11, 8, 12, 11, - 13, 7, 10, 11, 11, 8, 10, 13, 11, - 6, 3, 7, 11, 8, 9, 5, 10, 11, - 11, 11, 9, 14, 14, 14, 11, 10, 13, - 14, 10, 11, 13, 13, 13, 14, 12, 12, - ], [ - 2, 5, 3, 11, 8, 8, 6, 6, 7, - 8, 5, 6, 12, 10, 10, 8, 10, 11, - 7, 6, 2, 9, 8, 10, 8, 5, 4, - 10, 11, 10, 10, 13, 12, 14, 13, 10, - 10, 11, 8, 14, 9, 14, 12, 11, 12, - 9, 10, 9, 13, 12, 11, 12, 14, 11, - 8, 10, 7, 13, 10, 12, 8, 12, 12, - 10, 9, 6, 12, 11, 11, 11, 6, 9, - 10, 9, 6, 10, 9, 12, 11, 8, 7, - ], [ - 6, 8, 6, 12, 11, 11, 10, 10, 9, - 6, 1, 3, 10, 8, 8, 6, 7, 10, - 8, 6, 3, 10, 9, 10, 8, 6, 5, - 11, 10, 10, 12, 13, 12, 14, 13, 12, - 10, 11, 8, 12, 9, 14, 12, 11, 12, - 9, 9, 8, 12, 12, 10, 12, 13, 11, - 7, 8, 6, 13, 9, 11, 7, 11, 11, - 11, 10, 7, 14, 11, 12, 12, 7, 10, - 12, 11, 8, 13, 12, 14, 13, 11, 10, - ], [ - 7, 10, 7, 13, 13, 13, 11, 11, 10, - 8, 5, 6, 12, 11, 10, 9, 10, 11, - 7, 5, 1, 9, 8, 10, 7, 4, 4, - 9, 11, 9, 11, 12, 11, 13, 13, 10, - 9, 11, 8, 13, 9, 14, 12, 11, 12, - 11, 10, 10, 13, 12, 11, 14, 14, 12, - 9, 10, 8, 13, 10, 14, 9, 12, 12, - 9, 7, 4, 12, 10, 11, 10, 6, 7, - 9, 7, 4, 9, 9, 11, 9, 7, 5, - ], [ - 7, 9, 7, 14, 11, 12, 10, 9, 9, - 8, 5, 5, 12, 9, 10, 8, 8, 11, - 7, 5, 2, 8, 8, 9, 7, 4, 4, - 10, 11, 10, 12, 14, 11, 12, 13, 12, - 9, 10, 8, 13, 8, 13, 10, 11, 11, - 9, 9, 8, 14, 10, 10, 11, 12, 11, - 10, 11, 9, 14, 10, 14, 9, 12, 14, - 6, 6, 3, 11, 8, 9, 8, 3, 6, - 9, 7, 4, 10, 8, 11, 10, 6, 5, - ], [ - 6, 8, 7, 13, 12, 12, 10, 9, 9, - 9, 7, 8, 13, 11, 11, 9, 11, 12, - 7, 6, 1, 9, 8, 10, 7, 5, 4, - 10, 12, 10, 12, 13, 13, 14, 13, 11, - 9, 11, 9, 13, 10, 14, 12, 12, 12, - 11, 12, 10, 14, 13, 12, 13, 14, 12, - 8, 9, 7, 13, 10, 13, 8, 11, 12, - 8, 6, 3, 12, 9, 10, 9, 4, 6, - 10, 8, 5, 10, 10, 12, 11, 8, 6, - ], [ - 7, 10, 7, 12, 9, 12, 10, 10, 12, - 9, 7, 7, 12, 9, 11, 6, 10, 11, - 6, 6, 1, 9, 8, 9, 7, 4, 5, - 11, 12, 9, 12, 10, 14, 13, 13, 11, - 10, 12, 8, 13, 8, 14, 10, 10, 11, - 11, 11, 10, 13, 14, 10, 14, 13, 11, - 11, 10, 7, 13, 8, 12, 7, 10, 12, - 7, 10, 4, 12, 6, 10, 8, 5, 8, - 10, 7, 4, 9, 7, 10, 9, 6, 5, - ], [ - 7, 9, 7, 13, 12, 13, 10, 10, 8, - 8, 5, 6, 11, 10, 10, 8, 10, 10, - 7, 5, 2, 9, 8, 9, 7, 5, 3, - 8, 9, 7, 9, 11, 11, 13, 11, 9, - 8, 10, 7, 12, 9, 14, 11, 10, 10, - 9, 10, 9, 12, 12, 12, 13, 14, 12, - 10, 10, 9, 13, 11, 13, 9, 13, 12, - 8, 7, 4, 12, 10, 10, 10, 6, 6, - 7, 6, 3, 9, 8, 10, 9, 6, 3, - ], [ - 7, 10, 7, 13, 13, 13, 11, 11, 9, - 8, 6, 6, 13, 11, 11, 9, 10, 11, - 7, 6, 1, 9, 8, 10, 8, 5, 4, - 8, 9, 8, 9, 12, 12, 12, 12, 8, - 10, 13, 9, 14, 11, 14, 14, 13, 12, - 9, 10, 9, 13, 12, 11, 13, 14, 11, - 9, 11, 8, 13, 11, 13, 10, 13, 13, - 9, 8, 5, 12, 10, 11, 11, 6, 7, - 8, 7, 3, 8, 9, 11, 10, 7, 4, - ], [ - 8, 9, 7, 11, 11, 12, 11, 14, 9, - 8, 6, 6, 11, 13, 10, 9, 11, 9, - 7, 5, 1, 7, 9, 9, 7, 5, 3, - 13, 11, 9, 10, 12, 11, 12, 12, 9, - 10, 11, 9, 13, 9, 12, 12, 12, 10, - 12, 11, 10, 13, 14, 12, 14, 14, 11, - 11, 8, 8, 13, 11, 12, 9, 13, 11, - 9, 10, 5, 11, 8, 11, 9, 6, 7, - 7, 8, 4, 6, 8, 10, 8, 8, 5, - ], [ - 8, 10, 8, 13, 13, 13, 12, 11, 10, - 5, 1, 3, 10, 7, 8, 6, 8, 9, - 8, 7, 4, 9, 10, 11, 8, 7, 6, - 8, 9, 7, 9, 12, 11, 12, 10, 8, - 9, 10, 8, 13, 9, 9, 12, 11, 11, - 7, 7, 6, 12, 9, 8, 10, 12, 8, - 6, 7, 4, 12, 8, 13, 6, 9, 10, - 13, 13, 9, 15, 14, 14, 15, 9, 11, - 13, 11, 9, 13, 13, 15, 15, 12, 10, - ], [ - 10, 8, 9, 11, 12, 10, 8, 13, 13, - 9, 2, 5, 7, 5, 4, 3, 8, 9, - 11, 5, 5, 9, 8, 8, 6, 8, 8, - 12, 7, 8, 10, 10, 9, 8, 12, 10, - 9, 10, 9, 12, 7, 11, 7, 12, 12, - 9, 5, 8, 9, 9, 6, 6, 11, 10, - 6, 4, 7, 9, 5, 9, 3, 9, 10, - 13, 11, 9, 13, 10, 13, 10, 9, 13, - 14, 11, 10, 12, 12, 13, 11, 14, 11, - ], [ - 11, 7, 8, 10, 12, 9, 9, 14, 10, - 9, 4, 7, 8, 10, 7, 7, 11, 10, - 8, 2, 2, 6, 8, 5, 5, 5, 6, - 15, 9, 10, 10, 12, 10, 11, 14, 12, - 9, 8, 9, 12, 9, 11, 8, 12, 11, - 14, 10, 11, 12, 13, 10, 12, 15, 12, - 9, 7, 8, 12, 9, 12, 7, 11, 13, - 9, 6, 5, 11, 10, 11, 7, 6, 9, - 11, 4, 5, 7, 8, 8, 8, 7, 7, - ] -]; - -const RV40_PTYPE_CODES: &[[u8; 8]; 7] = &[ - [ 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00 ], - [ 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00 ], - [ 0x0D, 0x05, 0x01, 0x04, 0x01, 0x00, 0x07, 0x0C ], - [ 0x09, 0x11, 0x01, 0x00, 0x05, 0x03, 0x21, 0x20 ], - [ 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00 ], - [ 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00 ], - [ 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00 ] -]; -const RV40_PTYPE_BITS: &[[u8; 8]; 7] = &[ - [ 1, 2, 3, 6, 5, 4, 7, 7 ], - [ 3, 1, 2, 7, 6, 5, 4, 7 ], - [ 5, 4, 1, 4, 3, 3, 4, 5 ], - [ 4, 5, 2, 2, 3, 2, 6, 6 ], - [ 5, 6, 1, 4, 2, 3, 7, 7 ], - [ 5, 6, 1, 4, 3, 2, 7, 7 ], - [ 6, 3, 2, 7, 5, 4, 1, 7 ] -]; -const RV40_PTYPE_SYMS: &[MBType; 8] = &[ - MBType::MBIntra, - MBType::MBIntra16, - MBType::MBP16x16, - MBType::MBP8x8, - MBType::MBP16x8, - MBType::MBP8x16, - MBType::MBP16x16Mix, - MBType::Invalid, -]; - -const RV40_BTYPE_CODES: &[[u8; 7]; 6] = &[ - [ 0x01, 0x05, 0x00, 0x03, 0x11, 0x09, 0x10 ], - [ 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00 ], - [ 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00 ], - [ 0x09, 0x01, 0x00, 0x01, 0x05, 0x03, 0x08 ], - [ 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00 ], - [ 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00 ] -]; -const RV40_BTYPE_BITS: &[[u8; 7]; 6] = &[ - [ 2, 3, 2, 2, 5, 4, 5 ], - [ 4, 1, 3, 2, 6, 5, 6 ], - [ 6, 4, 1, 2, 5, 3, 6 ], - [ 5, 3, 3, 1, 4, 3, 5 ], - [ 6, 5, 3, 2, 4, 1, 6 ], - [ 6, 5, 3, 1, 4, 2, 6 ] -]; -const RV40_BTYPE_SYMS: &[MBType; 7] = &[ - MBType::MBIntra, - MBType::MBIntra16, - MBType::MBForward, - MBType::MBBackward, - MBType::MBBidir, - MBType::MBDirect, - MBType::Invalid, -]; diff --git a/src/codecs/real/rv40dsp.rs b/src/codecs/real/rv40dsp.rs deleted file mode 100644 index a6ee607..0000000 --- a/src/codecs/real/rv40dsp.rs +++ /dev/null @@ -1,875 +0,0 @@ -use crate::frame::{FrameType, NAVideoBuffer}; -use crate::codecs::MV; -use crate::codecs::blockdsp::edge_emu; -use super::rv3040::{RV34DSP, RV34MBInfo}; - -fn clip8(a: i16) -> u8 { - if a < 0 { 0 } - else if a > 255 { 255 } - else { a as u8 } -} - -macro_rules! el { - ($s: ident, $o: expr) => ( $s[$o] as i16 ) -} - -macro_rules! filter { - (01; $s: ident, $o: expr, $step: expr) => ( - clip8((( el!($s, $o - 2 * $step) - -5 * el!($s, $o - 1 * $step) - +52 * el!($s, $o - 0 * $step) - +20 * el!($s, $o + 1 * $step) - -5 * el!($s, $o + 2 * $step) - + el!($s, $o + 3 * $step) + 32) >> 6) as i16) - ); - (02; $s: ident, $o: expr, $step: expr) => ( - clip8((( el!($s, $o - 2 * $step) - -5 * el!($s, $o - 1 * $step) - +20 * el!($s, $o - 0 * $step) - +20 * el!($s, $o + 1 * $step) - -5 * el!($s, $o + 2 * $step) - + el!($s, $o + 3 * $step) + 16) >> 5) as i16) - ); - (03; $s: ident, $o: expr, $step: expr) => ( - clip8((( el!($s, $o - 2 * $step) - -5 * el!($s, $o - 1 * $step) - +20 * el!($s, $o - 0 * $step) - +52 * el!($s, $o + 1 * $step) - -5 * el!($s, $o + 2 * $step) - + el!($s, $o + 3 * $step) + 32) >> 6) as i16) - ); -} - -macro_rules! mc_func { - (copy; $name: ident, $size: expr) => ( - fn $name (dst: &mut [u8], mut didx: usize, dstride: usize, src: &[u8], mut sidx: usize, sstride: usize) { - for _ in 0..$size { - let d = &mut dst[didx..][..$size]; - let s = &src[sidx..][..$size]; - for x in 0..$size { d[x] = s[x]; } - didx += dstride; - sidx += sstride; - } - } - ); - (mc01; $name: ident, $size: expr, $ver: expr) => ( - fn $name (dst: &mut [u8], mut didx: usize, dstride: usize, src: &[u8], mut sidx: usize, sstride: usize) { - let step = if $ver { sstride } else { 1 }; - for _ in 0..$size { - for x in 0..$size { - dst[didx + x] = filter!(01; src, sidx + x, step); - } - sidx += sstride; - didx += dstride; - } - } - ); - (mc02; $name: ident, $size: expr, $ver: expr) => ( - fn $name (dst: &mut [u8], mut didx: usize, dstride: usize, src: &[u8], mut sidx: usize, sstride: usize) { - let step = if $ver { sstride } else { 1 }; - for _ in 0..$size { - for x in 0..$size { - dst[didx + x] = filter!(02; src, sidx + x, step); - } - sidx += sstride; - didx += dstride; - } - } - ); - (mc03; $name: ident, $size: expr, $ver: expr) => ( - fn $name (dst: &mut [u8], mut didx: usize, dstride: usize, src: &[u8], mut sidx: usize, sstride: usize) { - let step = if $ver { sstride } else { 1 }; - for _ in 0..$size { - for x in 0..$size { - dst[didx + x] = filter!(03; src, sidx + x, step); - } - sidx += sstride; - didx += dstride; - } - } - ); - (cm01; $name: ident, $size: expr, $ofilt: ident) => ( - fn $name (dst: &mut [u8], didx: usize, dstride: usize, src: &[u8], mut sidx: usize, sstride: usize) { - let mut buf: [u8; ($size + 5) * $size] = [0; ($size + 5) * $size]; - let mut bidx = 0; - let bstride = $size; - sidx -= sstride * 2; - for _ in 0..$size+5 { - for x in 0..$size { buf[bidx + x] = filter!(01; src, sidx + x, 1); } - bidx += bstride; - sidx += sstride; - } - $ofilt(dst, didx, dstride, &buf, 2*bstride, $size); - } - ); - (cm02; $name: ident, $size: expr, $ofilt: ident) => ( - fn $name (dst: &mut [u8], didx: usize, dstride: usize, src: &[u8], mut sidx: usize, sstride: usize) { - let mut buf: [u8; ($size + 5) * $size] = [0; ($size + 5) * $size]; - let mut bidx = 0; - let bstride = $size; - sidx -= sstride * 2; - for _ in 0..$size+5 { - for x in 0..$size { buf[bidx + x] = filter!(02; src, sidx + x, 1); } - bidx += bstride; - sidx += sstride; - } - $ofilt(dst, didx, dstride, &buf, 2*bstride, $size); - } - ); - (cm03; $name: ident, $size: expr, $ofilt: ident) => ( - fn $name (dst: &mut [u8], didx: usize, dstride: usize, src: &[u8], mut sidx: usize, sstride: usize) { - let mut buf: [u8; ($size + 5) * $size] = [0; ($size + 5) * $size]; - let mut bidx = 0; - let bstride = $size; - sidx -= sstride * 2; - for _ in 0..$size+5 { - for x in 0..$size { buf[bidx + x] = filter!(03; src, sidx + x, 1); } - bidx += bstride; - sidx += sstride; - } - $ofilt(dst, didx, dstride, &buf, 2*bstride, $size); - } - ); -} -mc_func!(copy; copy_16, 16); -mc_func!(copy; copy_8, 8); -mc_func!(mc01; luma_mc_10_16, 16, false); -mc_func!(mc01; luma_mc_10_8, 8, false); -mc_func!(mc02; luma_mc_20_16, 16, false); -mc_func!(mc02; luma_mc_20_8, 8, false); -mc_func!(mc03; luma_mc_30_16, 16, false); -mc_func!(mc03; luma_mc_30_8, 8, false); -mc_func!(mc01; luma_mc_01_16, 16, true); -mc_func!(mc01; luma_mc_01_8, 8, true); -mc_func!(mc02; luma_mc_02_16, 16, true); -mc_func!(mc02; luma_mc_02_8, 8, true); -mc_func!(mc03; luma_mc_03_16, 16, true); -mc_func!(mc03; luma_mc_03_8, 8, true); -mc_func!(cm01; luma_mc_11_16, 16, luma_mc_01_16); -mc_func!(cm01; luma_mc_11_8, 8, luma_mc_01_8); -mc_func!(cm01; luma_mc_12_16, 16, luma_mc_02_16); -mc_func!(cm01; luma_mc_12_8, 8, luma_mc_02_8); -mc_func!(cm01; luma_mc_13_16, 16, luma_mc_03_16); -mc_func!(cm01; luma_mc_13_8, 8, luma_mc_03_8); -mc_func!(cm02; luma_mc_21_16, 16, luma_mc_01_16); -mc_func!(cm02; luma_mc_21_8, 8, luma_mc_01_8); -mc_func!(cm02; luma_mc_22_16, 16, luma_mc_02_16); -mc_func!(cm02; luma_mc_22_8, 8, luma_mc_02_8); -mc_func!(cm02; luma_mc_23_16, 16, luma_mc_03_16); -mc_func!(cm02; luma_mc_23_8, 8, luma_mc_03_8); -mc_func!(cm03; luma_mc_31_16, 16, luma_mc_01_16); -mc_func!(cm03; luma_mc_31_8, 8, luma_mc_01_8); -mc_func!(cm03; luma_mc_32_16, 16, luma_mc_02_16); -mc_func!(cm03; luma_mc_32_8, 8, luma_mc_02_8); -mc_func!(cm03; luma_mc_33_16, 16, luma_mc_03_16); -mc_func!(cm03; luma_mc_33_8, 8, luma_mc_03_8); - -const RV40_CHROMA_BIAS: [[u16; 4]; 4] = [ - [ 0, 4, 8, 4 ], - [ 8, 7, 8, 7 ], - [ 0, 8, 4, 8 ], - [ 8, 7, 8, 7 ] -]; - -fn rv40_chroma_mc(dst: &mut [u8], mut didx: usize, dstride: usize, src: &[u8], mut sidx: usize, sstride: usize, size: usize, x: usize, y: usize) { - if (x == 0) && (y == 0) { - for _ in 0..size { - for x in 0..size { dst[didx + x] = src[sidx + x]; } - didx += dstride; - sidx += sstride; - } - return; - } - let bias = RV40_CHROMA_BIAS[y >> 1][x >> 1]; - if (x > 0) && (y > 0) { - let a = ((4 - x) * (4 - y)) as u16; - let b = (( x) * (4 - y)) as u16; - let c = ((4 - x) * ( y)) as u16; - let d = (( x) * ( y)) as u16; - for _ in 0..size { - for x in 0..size { - dst[didx + x] = ((a * (src[sidx + x] as u16) - + b * (src[sidx + x + 1] as u16) - + c * (src[sidx + x + sstride] as u16) - + d * (src[sidx + x + 1 + sstride] as u16) + bias) >> 4) as u8; - } - didx += dstride; - sidx += sstride; - } - } else { - let a = ((4 - x) * (4 - y)) as u16; - let e = (( x) * (4 - y) + (4 - x) * ( y)) as u16; - let step = if y > 0 { sstride } else { 1 }; - for _ in 0..size { - for x in 0..size { - dst[didx + x] = ((a * (src[sidx + x] as u16) - + e * (src[sidx + x + step] as u16) + bias) >> 4) as u8; - } - didx += dstride; - sidx += sstride; - } - } -} - -pub struct RV40DSP { - luma_mc: [[fn (&mut [u8], usize, usize, &[u8], usize, usize); 16]; 2], -} - -impl RV40DSP { - pub fn new() -> Self { - RV40DSP { - luma_mc: [ - [ copy_16, luma_mc_10_16, luma_mc_20_16, luma_mc_30_16, - luma_mc_01_16, luma_mc_11_16, luma_mc_21_16, luma_mc_31_16, - luma_mc_02_16, luma_mc_12_16, luma_mc_22_16, luma_mc_32_16, - luma_mc_03_16, luma_mc_13_16, luma_mc_23_16, luma_mc_33_16 ], - [ copy_8, luma_mc_10_8, luma_mc_20_8, luma_mc_30_8, - luma_mc_01_8, luma_mc_11_8, luma_mc_21_8, luma_mc_31_8, - luma_mc_02_8, luma_mc_12_8, luma_mc_22_8, luma_mc_32_8, - luma_mc_03_8, luma_mc_13_8, luma_mc_23_8, luma_mc_33_8 ] ], - } - } -} - -macro_rules! el { - ($src: ident, $o: expr) => ($src[$o] as i16); -} - -fn clip_symm(a: i16, lim: i16) -> i16 { - if a < -lim { - -lim - } else if a > lim { - lim - } else { - a - } -} - -fn rv40_weak_loop_filter4(pix: &mut [u8], mut off: usize, step: usize, stride: usize, - filter_p1: bool, filter_q1: bool, alpha: i16, beta: i16, - lim_p0q0: i16, lim_p1: i16, lim_q1: i16) { - for _ in 0..4 { - let p0 = el!(pix, off - step); - let q0 = el!(pix, off); - - let t = q0 - p0; - if t == 0 { - off += stride; - continue; - } - - let u = (alpha * t.wrapping_abs()) >> 7; - if u > (if filter_p1 && filter_q1 { 2 } else { 3 }) { - off += stride; - continue; - } - - let p2 = el!(pix, off - 3*step); - let p1 = el!(pix, off - 2*step); - let q1 = el!(pix, off + step); - let q2 = el!(pix, off + 2*step); - - let str; - if filter_p1 && filter_q1 { - str = (t << 2) + (p1 - q1); - } else { - str = t << 2; - } - - let diff = clip_symm((str + 4) >> 3, lim_p0q0); - pix[off - step] = clip8(p0 + diff); - pix[off ] = clip8(q0 - diff); - - if filter_p1 && ((p1 - p0).wrapping_abs() <= beta) { - let p1_diff = ((p1 - p0) + (p1 - p2) - diff) >> 1; - pix[off - 2*step] = clip8(p1 - clip_symm(p1_diff, lim_p1)); - } - - if filter_q1 && ((q1 - q0).wrapping_abs() <= beta) { - let q1_diff = ((q1 - q0) + (q1 - q2) + diff) >> 1; - pix[off + step] = clip8(q1 - clip_symm(q1_diff, lim_q1)); - } - - off += stride; - } -} - -fn rv40_weak_loop_filter4_h(pix: &mut [u8], off: usize, stride: usize, - filter_p1: bool, filter_q1: bool, alpha: i16, beta: i16, - lim_p0q0: i16, lim_p1: i16, lim_q1: i16) { - rv40_weak_loop_filter4(pix, off, stride, 1, filter_p1, filter_q1, alpha, beta, lim_p0q0, lim_p1, lim_q1); -} -fn rv40_weak_loop_filter4_v(pix: &mut [u8], off: usize, stride: usize, - filter_p1: bool, filter_q1: bool, alpha: i16, beta: i16, - lim_p0q0: i16, lim_p1: i16, lim_q1: i16) { - let src = &mut pix[off - 3..][..stride * 3 + 3 + 3]; - for ch in src.chunks_mut(stride).take(4) { - assert!(ch.len() >= 3 + 3); - let p0 = el!(ch, 3 - 1); - let q0 = el!(ch, 3); - - let t = q0 - p0; - if t == 0 { - continue; - } - - let u = (alpha * t.wrapping_abs()) >> 7; - if u > (if filter_p1 && filter_q1 { 2 } else { 3 }) { - continue; - } - - let p2 = el!(ch, 3 - 3); - let p1 = el!(ch, 3 - 2); - let q1 = el!(ch, 3 + 1); - let q2 = el!(ch, 3 + 2); - - let str; - if filter_p1 && filter_q1 { - str = (t << 2) + (p1 - q1); - } else { - str = t << 2; - } - - let diff = clip_symm((str + 4) >> 3, lim_p0q0); - ch[3 - 1] = clip8(p0 + diff); - ch[3 ] = clip8(q0 - diff); - - if filter_p1 && ((p1 - p0).wrapping_abs() <= beta) { - let p1_diff = ((p1 - p0) + (p1 - p2) - diff) >> 1; - ch[3 - 2] = clip8(p1 - clip_symm(p1_diff, lim_p1)); - } - - if filter_q1 && ((q1 - q0).wrapping_abs() <= beta) { - let q1_diff = ((q1 - q0) + (q1 - q2) + diff) >> 1; - ch[3 + 1] = clip8(q1 - clip_symm(q1_diff, lim_q1)); - } - } -} - - -const RV40_DITHER_L: [i16; 16] = [ - 0x40, 0x50, 0x20, 0x60, 0x30, 0x50, 0x40, 0x30, - 0x50, 0x40, 0x50, 0x30, 0x60, 0x20, 0x50, 0x40 -]; -const RV40_DITHER_R: [i16; 16] = [ - 0x40, 0x30, 0x60, 0x20, 0x50, 0x30, 0x30, 0x40, - 0x40, 0x40, 0x50, 0x30, 0x20, 0x60, 0x30, 0x40 -]; - -fn sfilter(a: i16, b: i16, c: i16, d: i16, e: i16, dither: i16, clip: bool, lims: i16) -> i16 { - let val = (25 * (a + e) + 26 * (b + c + d) + dither) >> 7; - if clip { - if val < c - lims { - c - lims - } else if val > c + lims { - c + lims - } else { - c - } - } else { - val - } -} - -fn rv40_strong_loop_filter4(pix: &mut [u8], mut off: usize, step: usize, stride: usize, - alpha: i16, lims: i16, dmode: usize, chroma: bool) { - for i in 0..4 { - let p0 = el!(pix, off - step); - let q0 = el!(pix, off); - - let t = q0 - p0; - if t == 0 { - off += stride; - continue; - } - - let fmode = (alpha * t.wrapping_abs()) >> 7; - if fmode > 1 { - off += stride; - continue; - } - - let p3 = el!(pix, off - 4*step); - let p2 = el!(pix, off - 3*step); - let p1 = el!(pix, off - 2*step); - let q1 = el!(pix, off + step); - let q2 = el!(pix, off + 2*step); - let q3 = el!(pix, off + 3*step); - - let np0 = sfilter(p2, p1, p0, q0, q1, RV40_DITHER_L[dmode + i], fmode != 0, lims); - let nq0 = sfilter( p1, p0, q0, q1, q0, RV40_DITHER_R[dmode + i], fmode != 0, lims); - - let np1 = sfilter(p3, p2, p1, np0, q0, RV40_DITHER_L[dmode + i], fmode != 0, lims); - let nq1 = sfilter( p0, nq0, q1, q2, q3, RV40_DITHER_R[dmode + i], fmode != 0, lims); - - pix[off - 2*step] = np1 as u8; - pix[off - step] = np0 as u8; - pix[off] = nq0 as u8; - pix[off + step] = nq1 as u8; - - if !chroma { - let np2 = sfilter(np0, np1, p2, p3, np1, 64, false, 0); - let nq2 = sfilter(nq0, nq1, q2, q3, q2, 64, false, 0); - pix[off - 3*step] = np2 as u8; - pix[off + 2*step] = nq2 as u8; - } - - off += stride; - } -} - -fn rv40_loop_strength(pix: &[u8], off: usize, step: usize, stride: usize, - beta: i16, beta2: i16, edge: bool) -> (bool, bool, bool) { - let mut sum_p1p0 = 0; - let mut sum_q1q0 = 0; - - let mut off1 = off; - for _ in 0..4 { - sum_p1p0 += el!(pix, off1 - 2 * step) - el!(pix, off1 - step); - sum_q1q0 += el!(pix, off1 + step) - el!(pix, off1); - off1 += stride; - } - - let filter_p1 = sum_p1p0.wrapping_abs() < beta * 4; - let filter_q1 = sum_q1q0.wrapping_abs() < beta * 4; - - if (!filter_p1 || !filter_q1) || !edge { - return (false, filter_p1, filter_q1); - } - - let mut sum_p1p2 = 0; - let mut sum_q1q2 = 0; - - let mut off1 = off; - for _ in 0..4 { - sum_p1p2 += el!(pix, off1 - 2 * step) - el!(pix, off1 - 3 * step); - sum_q1q2 += el!(pix, off1 + step) - el!(pix, off1 + 2 * step); - off1 += stride; - } - - let strong = (sum_p1p2.wrapping_abs() < beta2) && (sum_q1q2.wrapping_abs() < beta2); - - (strong, filter_p1, filter_q1) -} - -fn rv40_loop_strength_h(pix: &[u8], off: usize, stride: usize, - beta: i16, beta2: i16, edge: bool) -> (bool, bool, bool) { - rv40_loop_strength(pix, off, stride, 1, beta, beta2, edge) -} - -fn rv40_loop_strength_v(pix: &[u8], off: usize, stride: usize, - beta: i16, beta2: i16, edge: bool) -> (bool, bool, bool) { - let src = &pix[off - 3..][..stride * 3 + 3 + 3]; - let mut sum_p1p0 = 0; - let mut sum_q1q0 = 0; - - for ch in src.chunks(stride).take(4) { - assert!(ch.len() >= 3 + 3); - sum_p1p0 += el!(ch, 3 - 2) - el!(ch, 3 - 1); - sum_q1q0 += el!(ch, 3 + 1) - el!(ch, 3); - } - - let filter_p1 = sum_p1p0.wrapping_abs() < beta * 4; - let filter_q1 = sum_q1q0.wrapping_abs() < beta * 4; - - if (!filter_p1 || !filter_q1) || !edge { - return (false, filter_p1, filter_q1); - } - - let mut sum_p1p2 = 0; - let mut sum_q1q2 = 0; - - for ch in src.chunks(stride).take(4) { - assert!(ch.len() >= 3 + 3); - sum_p1p2 += el!(ch, 3 - 2) - el!(ch, 3 - 3); - sum_q1q2 += el!(ch, 3 + 1) - el!(ch, 3 + 2); - } - - let strong = (sum_p1p2.wrapping_abs() < beta2) && (sum_q1q2.wrapping_abs() < beta2); - - (strong, filter_p1, filter_q1) -} - -fn rv40_loop_filter4_h(pix: &mut [u8], off: usize, stride: usize, - dmode: usize, lim_p1: i16, lim_q1: i16, alpha: i16, beta: i16, beta2: i16, - chroma: bool, edge: bool) { - let (strong, filter_p1, filter_q1) = rv40_loop_strength_h(pix, off, stride, beta, beta2, edge); - let lims = (filter_p1 as i16) + (filter_q1 as i16) + ((lim_p1 + lim_q1) >> 1) + 1; - - if strong { - rv40_strong_loop_filter4(pix, off, stride, 1, alpha, lims, dmode, chroma); - } else if filter_p1 && filter_q1 { - rv40_weak_loop_filter4_h(pix, off, stride, true, true, alpha, beta, - lims, lim_p1, lim_q1); - } else if filter_p1 || filter_q1 { - rv40_weak_loop_filter4_h(pix, off, stride, filter_p1, filter_q1, alpha, beta, - lims >> 1, lim_p1 >> 1, lim_q1 >> 1); - } -} - -fn rv40_loop_filter4_v(pix: &mut [u8], off: usize, stride: usize, - dmode: usize, lim_p1: i16, lim_q1: i16, alpha: i16, beta: i16, beta2: i16, - chroma: bool, edge: bool) { - let (strong, filter_p1, filter_q1) = rv40_loop_strength_v(pix, off, stride, beta, beta2, edge); - let lims = (filter_p1 as i16) + (filter_q1 as i16) + ((lim_p1 + lim_q1) >> 1) + 1; - - if strong { - rv40_strong_loop_filter4(pix, off, 1, stride, alpha, lims, dmode, chroma); - } else if filter_p1 && filter_q1 { - rv40_weak_loop_filter4_v(pix, off, stride, true, true, alpha, beta, - lims, lim_p1, lim_q1); - } else if filter_p1 || filter_q1 { - rv40_weak_loop_filter4_v(pix, off, stride, filter_p1, filter_q1, alpha, beta, - lims >> 1, lim_p1 >> 1, lim_q1 >> 1); - } -} - -const RV40_ALPHA_TAB: [i16; 32] = [ - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 122, 96, 75, 59, 47, 37, - 29, 23, 18, 15, 13, 11, 10, 9, - 8, 7, 6, 5, 4, 3, 2, 1 -]; - -const RV40_BETA_TAB: [i16; 32] = [ - 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 4, 4, 4, 6, 6, - 6, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 13, 14, 15, 16, 17 -]; - -const RV40_FILTER_CLIP_TBL: [[i16; 32]; 3] = [ - [ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 - ], [ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 5, 5 - ], [ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, - 1, 2, 2, 2, 2, 3, 3, 3, 4, 4, 5, 5, 5, 7, 8, 9 - ] -]; - -macro_rules! test_bit { - ($pat: expr, $x: expr) => ( (($pat >> $x) & 1) != 0 ) -} - -fn check_pos(x: usize, y: usize, size: usize, w: usize, h: usize, dx: i16, dy: i16, e0: isize, e1: isize, e2: isize, e3: isize) -> bool { - let xn = (x as isize) + (dx as isize); - let yn = (y as isize) + (dy as isize); - - (xn - e0 >= 0) && (xn + (size as isize) + e1 <= (w as isize)) && (yn - e2 >= 0) && (yn + (size as isize) + e3 <= (h as isize)) -} - -const RV40_EDGE1: [isize; 4] = [ 0, 2, 2, 2 ]; -const RV40_EDGE2: [isize; 4] = [ 0, 3, 3, 3 ]; - -impl RV34DSP for RV40DSP { - fn loop_filter(&self, frame: &mut NAVideoBuffer<u8>, _ftype: FrameType, mbinfo: &[RV34MBInfo], mb_w: usize, row: usize) { - // todo proper B-frame filtering? - let mut offs: [usize; 3] = [0; 3]; - let mut stride: [usize; 3] = [0; 3]; - let (w, h) = frame.get_dimensions(0); - let small_frame = w * h <= 176*144; - - for comp in 0..3 { - stride[comp] = frame.get_stride(comp); - let start = if comp == 0 { row * 16 } else { row * 8 }; - offs[comp] = frame.get_offset(comp) + start * stride[comp]; - } - - let mut data = frame.get_data_mut(); - let dst: &mut [u8] = data.as_mut_slice(); - - let mut mb_pos: usize = row * mb_w; - let mut left_q: usize = 0; - for mb_x in 0..mb_w { - let q = mbinfo[mb_pos].q as usize; - let alpha = RV40_ALPHA_TAB[q]; - let beta = RV40_BETA_TAB[q]; - let beta_y = if small_frame { beta * 4 } else { beta * 3 }; - let beta_c = beta * 3; - - let cur_dbk = mbinfo[mb_pos].deblock; - let cur_cbp = mbinfo[mb_pos].cbp_c; - - let is_strong = mbinfo[mb_pos].mbtype.is_intra_or_16(); - let top_is_strong = is_strong || (row > 0 && mbinfo[mb_pos - mb_w].mbtype.is_intra_or_16()); - let left_is_strong = is_strong || (mb_x > 0 && mbinfo[mb_pos - 1].mbtype.is_intra_or_16()); - - for y in 0..4 { - let yoff = offs[0] + mb_x * 16 + y * 4 * stride[0]; - for x in 0..4 { - let bpos = x + y * 4; - let filter_hor_down = (y != 3) && !is_strong; - let filter_ver = (x > 0) || (mb_x > 0); - let filter_hor_up = (row > 0) && (x == 0) && top_is_strong; - let ver_strong = (x == 0) && (mb_x > 0) && left_is_strong; - - let cur_strength: usize; - if is_strong { - cur_strength = 2; - } else if test_bit!(cur_dbk, bpos) { - cur_strength = 1; - } else { - cur_strength = 0; - } - - let left_strength: usize; - if x > 0 { - if is_strong { - left_strength = 2; - } else if test_bit!(cur_dbk, bpos - 1) { - left_strength = 1; - } else { - left_strength = 0; - } - } else if mb_x > 0 { - if left_is_strong { - left_strength = 2; - } else if test_bit!(mbinfo[mb_pos - 1].deblock, bpos + 3) { - left_strength = 1; - } else { - left_strength = 0; - } - } else { - left_strength = 0; - } - - let bot_strength: usize; - if y < 3 { - if is_strong { - bot_strength = 2; - } else if test_bit!(cur_dbk, bpos + 4) { - bot_strength = 1; - } else { - bot_strength = 0; - } - } else { - bot_strength = 0; - } - - let top_strength: usize; - if y > 0 { - if is_strong { - top_strength = 2; - } else if test_bit!(cur_dbk, bpos - 4) { - top_strength = 1; - } else { - top_strength = 0; - } - } else if row > 0 { - if top_is_strong { - top_strength = 2; - } else if test_bit!(mbinfo[mb_pos - mb_w].deblock, bpos + 12) { - top_strength = 1; - } else { - top_strength = 0; - } - } else { - top_strength = 0; - } - - let l_q = if x > 0 { q } else { left_q }; - let top_q = if row > 0 { mbinfo[mb_pos - mb_w].q as usize } else { 0 }; - - let lim_cur = RV40_FILTER_CLIP_TBL [cur_strength][q]; - let lim_top = RV40_FILTER_CLIP_TBL [top_strength][top_q]; - let lim_left = RV40_FILTER_CLIP_TBL[left_strength][l_q]; - let lim_bottom = RV40_FILTER_CLIP_TBL [bot_strength][q]; - - let dmode = if y > 0 { x + y * 4 } else { x * 4 }; - - if filter_hor_down { - rv40_loop_filter4_h(dst, yoff + 4 * stride[0] + x * 4, stride[0], - dmode, lim_cur, lim_bottom, alpha, beta, beta_y, false, false); - } - if filter_ver && !ver_strong { - rv40_loop_filter4_v(dst, yoff + x * 4, stride[0], - dmode, lim_left, lim_cur, alpha, beta, beta_y, false, false); - } - if filter_hor_up { - rv40_loop_filter4_h(dst, yoff + x * 4, stride[0], - dmode, lim_top, lim_cur, alpha, beta, beta_y, false, true); - } - if filter_ver && ver_strong { - rv40_loop_filter4_v(dst, yoff + x * 4, stride[0], - dmode, lim_left, lim_cur, alpha, beta, beta_y, false, true); - } - } - } - - for comp in 1..3 { - for y in 0..2 { - let coff = offs[comp] + mb_x * 8 + y * 4 * stride[comp]; - for x in 0..2 { - let bpos = x + y * 2 + (comp - 1) * 4; - - let filter_hor_down = (y != 1) && !is_strong; - let filter_ver = (x > 0) || (mb_x > 0); - let filter_hor_up = (row > 0) && (x == 0) && top_is_strong; - let ver_strong = (x == 0) && (mb_x > 0) && left_is_strong; - - let cur_strength: usize; - if is_strong { - cur_strength = 2; - } else if test_bit!(cur_cbp, bpos) { - cur_strength = 1; - } else { - cur_strength = 0; - } - - let left_strength: usize; - if x > 0 { - if is_strong { - left_strength = 2; - } else if test_bit!(cur_cbp, bpos - 1) { - left_strength = 1; - } else { - left_strength = 0; - } - } else if mb_x > 0 { - if left_is_strong { - left_strength = 2; - } else if test_bit!(mbinfo[mb_pos - 1].cbp_c, bpos + 1) { - left_strength = 1; - } else { - left_strength = 0; - } - } else { - left_strength = 0; - } - - let bot_strength: usize; - if y == 0 { - if is_strong { - bot_strength = 2; - } else if test_bit!(cur_cbp, bpos + 2) { - bot_strength = 1; - } else { - bot_strength = 0; - } - } else { - bot_strength = 0; - } - - let top_strength: usize; - if y > 0 { - if is_strong { - top_strength = 2; - } else if test_bit!(cur_cbp, bpos - 2) { - top_strength = 1; - } else { - top_strength = 0; - } - } else if row > 0 { - if top_is_strong { - top_strength = 2; - } else if test_bit!(mbinfo[mb_pos - mb_w].cbp_c, bpos + 2) { - top_strength = 1; - } else { - top_strength = 0; - } - } else { - top_strength = 0; - } - - let l_q = if x > 0 { q } else { left_q }; - let top_q = if row > 0 { mbinfo[mb_pos - mb_w].q as usize } else { 0 }; - - let lim_cur = RV40_FILTER_CLIP_TBL [cur_strength][q]; - let lim_top = RV40_FILTER_CLIP_TBL [top_strength][top_q]; - let lim_left = RV40_FILTER_CLIP_TBL[left_strength][l_q]; - let lim_bottom = RV40_FILTER_CLIP_TBL [bot_strength][q]; - - if filter_hor_down { - rv40_loop_filter4_h(dst, coff + 4 * stride[comp] + x * 4, stride[comp], - x * 8, lim_cur, lim_bottom, alpha, beta, beta_c, true, false); - } - if filter_ver && !ver_strong { - rv40_loop_filter4_v(dst, coff + x * 4, stride[comp], - y * 8, lim_left, lim_cur, alpha, beta, beta_c, true, false); - } - if filter_hor_up { - rv40_loop_filter4_h(dst, coff + x * 4, stride[comp], - x * 8, lim_top, lim_cur, alpha, beta, beta_c, true, true); - } - if filter_ver && ver_strong { - rv40_loop_filter4_v(dst, coff + x * 4, stride[comp], - y * 8, lim_left, lim_cur, alpha, beta, beta_c, true, true); - } - } - } - } - - left_q = q; - - mb_pos += 1; - } - } - fn do_luma_mc(&self, frame: &mut NAVideoBuffer<u8>, prev_frame: &NAVideoBuffer<u8>, x: usize, y: usize, mv: MV, use16: bool, avg: bool) { - let size: usize = if use16 { 16 } else { 8 }; - let dstride = frame.get_stride(0); - let doffset = frame.get_offset(0) + (if !avg { x + y * dstride } else { 0 }); - let mut data = frame.get_data_mut(); - let dst: &mut [u8] = data.as_mut_slice(); - - let (w_, h_) = prev_frame.get_dimensions(0); - let w = (w_ + 15) & !15; - let h = (h_ + 15) & !15; - - let dx = mv.x >> 2; - let cx = (mv.x & 3) as usize; - let dy = mv.y >> 2; - let cy = (mv.y & 3) as usize; - let mode = cx + cy * 4; - - if check_pos(x, y, size, w, h, dx, dy, RV40_EDGE1[cx], RV40_EDGE2[cx], RV40_EDGE1[cy], RV40_EDGE2[cy]) { - let sstride = prev_frame.get_stride(0); - let mut soffset = prev_frame.get_offset(0) + x + y * sstride; - let data = prev_frame.get_data(); - let src: &[u8] = data.as_slice(); - soffset = ((soffset as isize) + (dx as isize) + (dy as isize) * (sstride as isize)) as usize; - self.luma_mc[if use16 { 0 } else { 1 }][mode](dst, doffset, dstride, src, soffset, sstride); - } else { - let mut ebuf: [u8; 32*22] = [0; 32*22]; - edge_emu(prev_frame, (x as isize) + (dx as isize) - 2, (y as isize) + (dy as isize) - 2, 16+5, 16+5, &mut ebuf, 32, 0); - self.luma_mc[if use16 { 0 } else { 1 }][mode](dst, doffset, dstride, &ebuf, 32*2 + 2, 32); - } - } - fn do_chroma_mc(&self, frame: &mut NAVideoBuffer<u8>, prev_frame: &NAVideoBuffer<u8>, x: usize, y: usize, comp: usize, mv: MV, use8: bool, avg: bool) { - let size: usize = if use8 { 8 } else { 4 }; - let dstride = frame.get_stride(comp); - let doffset = frame.get_offset(comp) + (if !avg { x + y * dstride } else { 0 }); - let mut data = frame.get_data_mut(); - let dst: &mut [u8] = data.as_mut_slice(); - - let (w_, h_) = prev_frame.get_dimensions(comp); - let w = (w_ + 7) & !7; - let h = (h_ + 7) & !7; - - let mvx = mv.x / 2; - let mvy = mv.y / 2; - let dx = mvx >> 2; - let mut cx = (mvx & 3) as usize; - let dy = mvy >> 2; - let mut cy = (mvy & 3) as usize; - - if (cx == 3) && (cy == 3) { - cx = 2; - cy = 2; - } - - if check_pos(x, y, size, w, h, dx, dy, 0, 1, 0, 1) { - let sstride = prev_frame.get_stride(comp); - let mut soffset = prev_frame.get_offset(comp) + x + y * sstride; - let data = prev_frame.get_data(); - let src: &[u8] = data.as_slice(); - soffset = ((soffset as isize) + (dx as isize) + (dy as isize) * (sstride as isize)) as usize; - rv40_chroma_mc(dst, doffset, dstride, src, soffset, sstride, size, cx, cy); - } else { - let mut ebuf: [u8; 16*10] = [0; 16*10]; - edge_emu(prev_frame, (x as isize) + (dx as isize), (y as isize) + (dy as isize), 8+1, 8+1, &mut ebuf, 16, comp); - rv40_chroma_mc(dst, doffset, dstride, &ebuf, 0, 16, size, cx, cy); - } - } -} diff --git a/src/codecs/real/rv60.rs b/src/codecs/real/rv60.rs deleted file mode 100644 index 2d1262b..0000000 --- a/src/codecs/real/rv60.rs +++ /dev/null @@ -1,1490 +0,0 @@ -use std::rc::Rc; -use std::cell::RefCell; -use crate::formats::YUV420_FORMAT; -use crate::frame::*; -use crate::codecs::{NADecoder, MV, ZERO_MV, DecoderError, DecoderResult, IPBShuffler}; -use crate::io::byteio::{MemoryReader,ByteReader}; -use crate::io::bitreader::{BitReader,BitReaderMode}; -use crate::io::intcode::*; - -use super::rv60codes::*; -use super::rv60dsp::*; - -struct UniqueList<A> { - list: [A; 4], - fill: usize, - max_size: usize, -} - -impl<A:Copy+Default+PartialEq> UniqueList<A> { - fn new(max_size: usize) -> Self { - Self { list: [A::default(); 4], fill: 0, max_size } - } - fn add(&mut self, cand: A) { - if self.fill == self.max_size { return; } - let mut unique = true; - for el in self.list.into_iter().take(self.fill) { - if *el == cand { - unique = false; - break; - } - } - if unique { - self.list[self.fill] = cand; - self.fill += 1; - } - } -} - -const RV60_FRAME_TYPES: [FrameType; 4] = [ FrameType::I, FrameType::P, FrameType::B, FrameType::Other ]; -const MAX_IMODE: u8 = 34; - -#[derive(Clone,Copy,Debug)] -struct FrameHeader { - profile: u8, - ftype: FrameType, - qp: u8, - osvquant: u8, - ts: u32, - width: usize, - height: usize, - two_f_refs: bool, - qp_off_type: u8, - deblock: bool, - deblock_chroma: bool, -} - -const RV60_CUSTOM_MSG_LENS: [u32; 4] = [ 2, 4, 16, 32 ]; -impl FrameHeader { - fn read(br: &mut BitReader) -> DecoderResult<Self> { - let marker = br.read(2)?; - validate!(marker == 3); - let profile = br.read(2)? as u8; - validate!(profile == 0); - let _someval = br.read(4)?; - let ftypeid = br.read(2)? as usize; - let ftype = RV60_FRAME_TYPES[ftypeid]; - let qp = br.read(6)? as u8; - let marker = br.read(1)?; - validate!(marker == 0); - let toolset = br.read(2)?; - validate!(toolset == 0); - let osvquant = br.read(2)? as u8; - let _some_flag = br.read_bool()?; - let _some_val = br.read(2)?; - let ts = br.read(24)?; - let width = ((br.read(11)? as usize) + 1) * 4; - let height = ((br.read(11)? as usize) + 0) * 4; - validate!(height > 0); - let _some_flag = br.read_bool()?; - let two_f_refs; - if ftype == FrameType::I { -//byte17 = 0 - two_f_refs = false; - } else { - let flag = br.read_bool()?; - if flag { // untested - br.skip(1)?; - br.skip(1)?; - br.skip(1)?; - } -//byte17 = flag? - two_f_refs = br.read_bool()?; - } -// if byte17 { dw40 = 2; dw3C = 2; } else { dw40 = 1; dw3C = 1; } - let _some_val = br.read_code(UintCodeType::Unary012)?; // luma_qp_diff? - let chroma_qp_diff = br.read(1)?; - validate!(chroma_qp_diff == 0); - let qp_off_type = br.read_code(UintCodeType::Unary012)? as u8; - let deblock = br.read_bool()?; - let deblock_chroma = deblock && !br.read_bool()?; - if br.read_bool()? { - let custom_msg_hdr_len = br.read(2)? as usize; - if custom_msg_hdr_len != 0 { - for i in 0..custom_msg_hdr_len { - br.skip(RV60_CUSTOM_MSG_LENS[i] * 8)?; - } - } - } - - Ok(FrameHeader { - profile, ftype, qp, osvquant, ts, width, height, two_f_refs, qp_off_type, - deblock, deblock_chroma, - }) - } - fn parse_slice_sizes(&self, br: &mut BitReader, sizes: &mut Vec<usize>) -> DecoderResult<()> { - let nslices = self.get_height_cu(); - let nbits = (br.read(5)? as u8) + 1; - validate!(nbits < 32); - let mut signs: Vec<bool> = Vec::with_capacity(nslices); - for _ in 0..nslices { - let sign = br.read_bool()?; - signs.push(sign); - } - validate!(signs[0]); - sizes.truncate(0); - let mut sum = 0; - let first_size = br.read(nbits)? as usize; - validate!(first_size > 0); - sum += first_size; - let mut lastsize = first_size; - sizes.push(first_size); - for i in 1..nslices { - let diff = br.read(nbits)? as isize; - let size; - if signs[i] { - let sum = (lastsize as isize).checked_add(diff); - validate!(sum.is_some()); - size = sum.unwrap() as usize; - } else { - let sum = (lastsize as isize).checked_sub(diff); - validate!(sum.is_some()); - size = sum.unwrap() as usize; - } - sizes.push(size); - sum += size; - lastsize = size; - } - br.align(); -if ((br.left() >> 3) as usize) != sum { -println!(" left {} / {}", br.left() >> 3, sum); -} - validate!((br.left() >> 3) >= (sum as isize)); - Ok(()) - } - fn read_line_qp_offset(&self, br: &mut BitReader) -> DecoderResult<i8> { - match self.qp_off_type { - 0 => Ok(0), - 1 => { - let val = br.read_code(UintCodeType::Unary012)?; - if val != 2 { - Ok(val as i8) - } else { - Ok(-1) - } - }, - _ => { - if br.read(1)? == 0 { - Ok(0) - } else { - let val = br.read(2)? as i8; - if (val & 2) == 0 { - Ok(val + 1) - } else { - Ok(-((val & 1) + 1)) - } - } - }, - } - } - fn get_width_cu(&self) -> usize { - (self.width + 63) >> 6 - } - fn get_height_cu(&self) -> usize { - (self.height + 63) >> 6 - } - fn has_top_block(&self, xpos: usize, ypos: usize, dx: usize, dy: usize, size: usize) -> bool { - if (ypos + dy) == 0 { return false; } - let xpos2 = xpos + dx; - if (xpos2 + size) > self.width { return false; } - true - } - fn has_top_right_block(&self, xpos: usize, ypos: usize, dx: usize, dy: usize, size: usize) -> bool { - if (ypos + dy) == 0 { return false; } - let xpos2 = xpos + dx; - if (xpos2 + size * 2) > self.width { return false; } - let cxpos = ((xpos + dx) & 63) >> RV60_BLOCK_LOG2[size]; - let cypos = ((ypos + dy) & 63) >> RV60_BLOCK_LOG2[size]; - ((cypos as u8) & RV60_AVAIL_MASK[cxpos]) == 0 - } - fn has_left_block(&self, xpos: usize, ypos: usize, dx: usize, dy: usize, size: usize) -> bool { - if (xpos + dx) == 0 { return false; } - let ypos2 = ypos + dy; - if (ypos2 + size) > self.height { return false; } - true - } - fn has_left_down_block(&self, xpos: usize, ypos: usize, dx: usize, dy: usize, size: usize) -> bool { - if (xpos + dx) == 0 { return false; } - let ypos2 = ypos + dy; - if (ypos2 + size * 2) > self.height { return false; } - let cxpos = (!(xpos + dx) & 63) >> RV60_BLOCK_LOG2[size]; - let cypos = (!(ypos + dy) & 63) >> RV60_BLOCK_LOG2[size]; - ((cypos as u8) & RV60_AVAIL_MASK[cxpos]) >= 1 - } -} - -const RV60_BLOCK_LOG2: [u8; 65] = [ - 0, - 0, 1, 0, 2, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 4, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6 -]; -const RV60_AVAIL_MASK: [u8; 64] = [ - 0, 1, 0, 3, 0, 1, 0, 7, 0, 1, 0, 3, 0, 1, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 -]; - -#[derive(Clone,Copy,PartialEq,Debug)] -enum CUType { - Intra, - InterMV, - Skip, - InterNoMV, -} - -impl Default for CUType { - fn default() -> Self { CUType::Intra } -} - -const RV60_CU_TYPES: [CUType; 4] = [ CUType::Intra, CUType::InterMV, CUType::Skip, CUType::InterNoMV ]; - -#[derive(Clone,Copy,PartialEq,Debug)] -enum PUType { - Full, - N2Hor, - N2Ver, - Quarters, - N4Hor, - N34Hor, - N4Ver, - N34Ver, -} - -const RV60_PU_TYPES: [PUType; 8] = [ - PUType::Full, PUType::N2Hor, PUType::N2Ver, PUType::Quarters, - PUType::N4Hor, PUType::N34Hor, PUType::N4Ver, PUType::N34Ver, -]; - -impl PUType { - fn get_num_mvs(&self) -> usize { - match *self { - PUType::Full => 1, - PUType::Quarters => 4, - _ => 2, - } - } - fn get_mv_size(&self, part_no: usize, size: usize) -> (usize, usize) { - let mv_size = size >> 2; - match *self { - PUType::Full => (mv_size, mv_size), - PUType::N2Hor => (mv_size, mv_size >> 1), - PUType::N2Ver => (mv_size >> 1, mv_size), - PUType::Quarters => (mv_size >> 1, mv_size >> 1), - PUType::N4Hor => { - if part_no == 0 { - (mv_size, mv_size >> 2) - } else { - (mv_size, 3 * mv_size >> 2) - } - }, - PUType::N34Hor => { - if part_no == 0 { - (mv_size, 3 * mv_size >> 2) - } else { - (mv_size, mv_size >> 2) - } - }, - PUType::N4Ver => { - if part_no == 0 { - ( mv_size >> 2, mv_size) - } else { - (3 * mv_size >> 2, mv_size) - } - }, - PUType::N34Ver => { - if part_no == 0 { - (3 * mv_size >> 2, mv_size) - } else { - ( mv_size >> 2, mv_size) - } - }, - } - } - fn has_hor_split(&self) -> bool { - match *self { - PUType::N2Hor | PUType::N4Hor | PUType::N34Hor | PUType::Quarters => true, - _ => false, - } - } - fn has_ver_split(&self) -> bool { - match *self { - PUType::N2Ver | PUType::N4Ver | PUType::N34Ver | PUType::Quarters => true, - _ => false, - } - } -} - -impl Default for PUType { - fn default() -> Self { PUType::Full } -} - -#[derive(Clone,Copy,Debug)] -enum IntraMode { - Index(u8), - Mode(u8), - DC64, - Plane64, -} - -#[derive(Clone,Copy,PartialEq,Debug)] -enum TransformType { - None, - T4X4, - T8X8, - T16X16, -} - -impl Default for TransformType { - fn default() -> Self { TransformType::None } -} - -#[derive(Clone,Copy,PartialEq,Debug)] -enum MVRef { - None, - Ref0, - Ref1, - BRef, - Ref0AndBRef, - Skip0, - Skip1, - Skip2, - Skip3, -} - -const SKIP_MV_REF: [MVRef; 4] = [ MVRef::Skip0, MVRef::Skip1, MVRef::Skip2, MVRef::Skip3 ]; - -impl MVRef { - fn get_skip_mv_num(&self) -> usize { - match *self { - MVRef::Skip1 => 1, - MVRef::Skip2 => 2, - MVRef::Skip3 => 3, - _ => 0, - } - } - fn is_ref0(&self) -> bool { - match *self { - MVRef::Ref0 | MVRef::Ref0AndBRef => true, - _ => false, - } - } - fn is_fwd(&self) -> bool { - match *self { - MVRef::Ref0 | MVRef::Ref1 | MVRef::Ref0AndBRef => true, - _ => false, - } - } - fn is_bwd(&self) -> bool { - match *self { - MVRef::BRef | MVRef::Ref0AndBRef => true, - _ => false, - } - } -} - -#[derive(Clone,Copy,PartialEq,Debug)] -struct MVInfo { - f_mv: MV, - b_mv: MV, - mvref: MVRef, -} - -impl MVInfo { - fn is_some(&self) -> bool { self.mvref != MVRef::None } - fn matches_fwd(&self, mvref: MVRef) -> bool { - (self.mvref == mvref) || (self.mvref.is_ref0() && mvref.is_ref0()) - } - fn matches_bwd(&self, mvref: MVRef) -> bool { - self.mvref.is_bwd() && mvref.is_bwd() - } - fn is_deblock_cand(&self, other: &MVInfo) -> bool { - if self.mvref != other.mvref { return true; } - let mut mvdiff = 0; - if self.mvref.is_fwd() { - let diff = self.f_mv - other.f_mv; - mvdiff += diff.x.abs() + diff.y.abs(); - } - if self.mvref.is_bwd() { - let diff = self.b_mv - other.b_mv; - mvdiff += diff.x.abs() + diff.y.abs(); - } - mvdiff > 4 - } -} - -impl Default for MVInfo { - fn default() -> Self { Self { f_mv: ZERO_MV, b_mv: ZERO_MV, mvref: MVRef::None } } -} - -#[derive(Clone,Copy,Debug)] -struct CBHeader { - cu_type: CUType, - pu_type: PUType, - ttype: TransformType, - imode: [IntraMode; 4], - mv: [MVInfo; 4], -} - -impl CBHeader { - fn read(br: &mut BitReader, ftype: FrameType, two_f_refs: bool, size: usize) -> DecoderResult<Self> { - let cu_type; - let pu_type; - let mut imode: [IntraMode; 4] = [IntraMode::Index(0); 4]; - let mut mv: [MVInfo; 4] = [MVInfo::default(); 4]; - if ftype == FrameType::I { - cu_type = CUType::Intra; - } else { - cu_type = RV60_CU_TYPES[br.read(2)? as usize]; - } - match cu_type { - CUType::Intra => { - if (size == 8) && br.read_bool()? { - pu_type = PUType::Quarters; - } else { - pu_type = PUType::Full; - } - if pu_type == PUType::Quarters { - for i in 0..4 { - imode[i] = CBHeader::read_intra_mode(br)?; - } - } else if size <= 32 { - imode[0] = CBHeader::read_intra_mode(br)?; - } else { - if !br.read_bool()? { - imode[0] = IntraMode::DC64; - } else { - imode[0] = IntraMode::Plane64; - } - } - }, - CUType::InterMV => { - let bits = if size == 8 { 2 } else { 3 }; - pu_type = RV60_PU_TYPES[br.read(bits)? as usize]; - CBHeader::read_mv_data(br, ftype, two_f_refs, size, pu_type, &mut mv)?; - }, - _ => { - pu_type = PUType::Full; - let skip_mv_no = br.read_code(UintCodeType::LimitedUnary(3, 0))?; - mv[0].mvref = SKIP_MV_REF[skip_mv_no as usize]; - }, - }; - let ttype; - if cu_type == CUType::Skip { - ttype = TransformType::None; - } else if size >= 32 { - ttype = TransformType::T16X16; - } else if size == 16 { - if (cu_type == CUType::Intra) || (pu_type == PUType::Full) { - ttype = TransformType::T16X16; - } else { - ttype = TransformType::T4X4; - } - } else { - if pu_type == PUType::Full { - ttype = TransformType::T8X8; - } else { - ttype = TransformType::T4X4; - } - } - Ok(Self { - cu_type, pu_type, ttype, imode, mv, - }) - } - fn read_intra_mode(br: &mut BitReader) -> DecoderResult<IntraMode> { - if br.read_bool()? { - let idx = br.read_code(UintCodeType::Unary012)? as u8; - Ok(IntraMode::Index(idx)) - } else { - let mode = br.read(5)? as u8; - Ok(IntraMode::Mode(mode)) - } - } - fn read_mv_data(br: &mut BitReader, ftype: FrameType, two_f_refs: bool, size: usize, pu_type: PUType, mv: &mut [MVInfo; 4]) -> DecoderResult<()> { - let mv_count = pu_type.get_num_mvs(); - for i in 0..mv_count { - mv[i] = CBHeader::read_mv_info(br, ftype, two_f_refs, size, pu_type)?; - } - Ok(()) - } - fn read_mv_info(br: &mut BitReader, ftype: FrameType, two_f_refs: bool, size: usize, pu_type: PUType) -> DecoderResult<MVInfo> { - let mut f_mv = ZERO_MV; - let mut b_mv = ZERO_MV; - let mvref; - if ftype != FrameType::B { - if two_f_refs && br.read_bool()? { - mvref = MVRef::Ref1; - } else { - mvref = MVRef::Ref0; - } - f_mv = CBHeader::read_mv(br)?; - Ok(MVInfo { f_mv, b_mv: ZERO_MV, mvref }) - } else { - if ((size <= 8) && ((size != 8) || (pu_type != PUType::Full))) || br.read_bool()? { - if !br.read_bool()? { - mvref = MVRef::Ref0; - f_mv = CBHeader::read_mv(br)?; - } else { - mvref = MVRef::BRef; - b_mv = CBHeader::read_mv(br)?; - } - } else { - mvref = MVRef::Ref0AndBRef; - f_mv = CBHeader::read_mv(br)?; - b_mv = CBHeader::read_mv(br)?; - } - Ok(MVInfo { f_mv, b_mv, mvref }) - } - } - fn read_mv(br: &mut BitReader) -> DecoderResult<MV> { - let x = br.read_code_signed(IntCodeType::Gamma)? as i16; - let y = br.read_code_signed(IntCodeType::Gamma)? as i16; - Ok(MV { x, y }) - } -} - -#[derive(Clone,Copy,Default)] -struct PUInfo { - cu_type: CUType, - ttype: TransformType, -} - -impl PUInfo { - fn is_intra(&self) -> bool { self.cu_type == CUType::Intra } -} - -const RV60_CANDIDATE_INTRA_ANGLES: [u8; 6] = [ 0, 1, 10, 26, 18, 2 ]; - -#[derive(Clone,Copy,Default)] -struct BlockInfo { - mv: MVInfo, - imode: u8, -} - -struct DeblockInfo { - left_str: Vec<u8>, - top_str: Vec<u8>, - stride: usize, -} - -impl DeblockInfo { - fn new() -> Self { - Self { left_str: Vec::new(), top_str: Vec::new(), stride: 0 } - } - fn reinit(&mut self, w: usize, h: usize) { - self.left_str.clear(); - self.top_str.clear(); - self.stride = w >> 2; - let size = self.stride * (h >> 2); - self.left_str.resize(size, 0); - self.top_str.resize(size, 0); - } - fn set_strength(&mut self, xpos: usize, ypos: usize, size: usize, q: u8, strength: u8) { - let pos = self.get_pos(xpos, ypos); - let dsize = size >> 2; - let dval = (q << 2) | strength; - for x in 0..dsize { - self.top_str[pos + x] = dval; - } - for y in 0..dsize { - self.left_str[pos + y * self.stride] = dval; - } - } - fn get_pos(&self, xpos: usize, ypos: usize) -> usize { - (xpos >> 2) + (ypos >> 2) * self.stride - } - fn get_top_strength(&self, pos: usize) -> u8 { - self.top_str[pos] & 3 - } - fn get_left_strength(&self, pos: usize) -> u8 { - self.left_str[pos] & 3 - } - fn set_top_strength(&mut self, pos: usize, str: u8) { - self.top_str[pos] |= str; - } - fn set_left_strength(&mut self, pos: usize, str: u8) { - self.left_str[pos] |= str; - } -} - -struct RealVideo60Decoder { - info: Rc<NACodecInfo>, - cbs: RV60Codebooks, - ipbs: IPBShuffler, - dsp: RV60DSP, - ipred: IntraPredContext, - - avg_buf: NAVideoBuffer<u8>, - - y_coeffs: [i16; 16 * 16], - u_coeffs: [i16; 8 * 8], - v_coeffs: [i16; 8 * 8], - qp: u8, - sel_qp: u8, - - cu_splits: Vec<bool>, - coded_blk: [bool; 64], - dblk: DeblockInfo, - - pu_info: Vec<PUInfo>, - pu_stride: usize, - pu_pos: usize, - - blk_info: Vec<BlockInfo>, - blk_stride: usize, - blk_pos: usize, - - xpos: usize, - ypos: usize, -} - -impl RealVideo60Decoder { - fn new() -> Self { - let tmp_vinfo = NAVideoInfo::new(64, 64, false, YUV420_FORMAT); - let mut vt = alloc_video_buffer(tmp_vinfo, 4).unwrap(); - let vb = vt.get_vbuf(); - let avg_buf = vb.unwrap(); - RealVideo60Decoder{ - info: Rc::new(DUMMY_CODEC_INFO), - cbs: RV60Codebooks::init(), - ipbs: IPBShuffler::new(), - ipred: IntraPredContext::new(), - dsp: RV60DSP::new(), - avg_buf: avg_buf, - y_coeffs: [0; 16 * 16], - u_coeffs: [0; 8 * 8], - v_coeffs: [0; 8 * 8], - qp: 0, - sel_qp: 0, - cu_splits: Vec::with_capacity(24), - coded_blk: [false; 64], - dblk: DeblockInfo::new(), - pu_info: Vec::new(), - pu_stride: 0, - pu_pos: 0, - blk_info: Vec::new(), - blk_stride: 0, - blk_pos: 0, - xpos: 0, - ypos: 0, - } - } - fn decode_cu_line(&mut self, buf: &mut NAVideoBuffer<u8>, hdr: &FrameHeader, src: &[u8], cu_y: usize) -> DecoderResult<()> { - let mut br = BitReader::new(src, src.len(), BitReaderMode::BE); - let cu_w = hdr.get_width_cu(); - let dqp = hdr.read_line_qp_offset(&mut br)?; - let qps = (hdr.qp as i8) + dqp; - validate!((qps >= 0) && (qps < 32)); - let qp = qps as u8; - self.qp = qp; - self.sel_qp = match hdr.osvquant { - 0 => qp, - 1 => { - if qp <= 25 { - qp + 5 - } else { - qp - } - }, - _ => { - if qp <= 18 { - qp + 10 - } else if qp <= 25 { - qp + 5 - } else { - qp - } - }, - }; - - for cu_x in 0..cu_w { - self.cu_splits.clear(); - self.coded_blk = [false; 64]; - self.decode_cb_tree(buf, hdr, &mut br, cu_x << 6, cu_y << 6, 6)?; - if hdr.deblock { - self.cu_splits.reverse(); - self.deblock_cb_tree(buf, hdr, cu_x << 6, cu_y << 6, 6); - } - } -if br.left() >= 8 { -println!(" left {} bits", br.left()); -} - Ok(()) - } - fn decode_cb_tree(&mut self, buf: &mut NAVideoBuffer<u8>, hdr: &FrameHeader, br: &mut BitReader, xpos: usize, ypos: usize, log_size: u8) -> DecoderResult<()> { - if (xpos >= hdr.width) || (ypos >= hdr.height) { return Ok(()); } - - let size = 1 << log_size; - let split = (xpos + size > hdr.width) || (ypos + size > hdr.height) || (size > 8 && br.read_bool()?); - self.cu_splits.push(split); - if split { - let hsize = size >> 1; - self.decode_cb_tree(buf, hdr, br, xpos, ypos, log_size - 1)?; - self.decode_cb_tree(buf, hdr, br, xpos + hsize, ypos, log_size - 1)?; - self.decode_cb_tree(buf, hdr, br, xpos, ypos + hsize, log_size - 1)?; - self.decode_cb_tree(buf, hdr, br, xpos + hsize, ypos + hsize, log_size - 1)?; - } else { - let cbh = CBHeader::read(br, hdr.ftype, hdr.two_f_refs, size)?; - self.pu_pos = (xpos >> 3) + (ypos >> 3) * self.pu_stride; - self.blk_pos = (xpos >> 2) + (ypos >> 2) * self.blk_stride; - self.xpos = xpos; - self.ypos = ypos; - self.reconstruct_info(hdr, &cbh, size)?; - - let split_i4x4 = (cbh.cu_type == CUType::Intra) && (size == 8) && (cbh.pu_type == PUType::Quarters); - match cbh.cu_type { - CUType::Intra => { - let itype = self.blk_info[self.blk_pos].imode; - if !split_i4x4 { - let dstride = buf.get_stride(0); - let off = xpos + ypos * dstride; - let mut data = buf.get_data_mut(); - let dst = &mut data; - self.populate_ipred(hdr, dst, 0, dstride, 0, 0, size, true); - self.ipred.pred_angle(dst, off, dstride, size, itype as usize, true); - } - for comp in 1..3 { - let dstride = buf.get_stride(comp); - let soff = buf.get_offset(comp); - let off = soff + (xpos >> 1) + (ypos >> 1) * dstride; - let mut data = buf.get_data_mut(); - let mut dst = &mut data; - self.populate_ipred(hdr, dst, soff, dstride, 0, 0, size >> 1, false); - self.ipred.pred_angle(&mut dst, off, dstride, size >> 1, itype as usize, false); - } - }, - _ => { - let mut mv_x = xpos >> 2; - let mut mv_y = ypos >> 2; - let mut mv_pos = mv_x + mv_y * self.blk_stride; - for part_no in 0..cbh.pu_type.get_num_mvs() { - let (mv_w, mv_h) = cbh.pu_type.get_mv_size(part_no, size); - let mv = self.blk_info[mv_pos].mv; - let bw = mv_w << 2; - let bh = mv_h << 2; - let bx = mv_x << 2; - let by = mv_y << 2; - match mv.mvref { - MVRef::Ref0 => { - if hdr.ftype != FrameType::B { - if let Some(ref prevbuf) = self.ipbs.get_lastref() { - self.dsp.do_mc(buf, prevbuf, bx, by, bw, bh, mv.f_mv, false); - } - } else { - if let Some(ref prevbuf) = self.ipbs.get_b_fwdref() { - self.dsp.do_mc(buf, prevbuf, bx, by, bw, bh, mv.f_mv, false); - } - } - }, - MVRef::Ref1 => { - if let Some(ref prevbuf) = self.ipbs.get_nextref() { - self.dsp.do_mc(buf, prevbuf, bx, by, bw, bh, mv.f_mv, false); - } - }, - MVRef::BRef => { - validate!(hdr.ftype == FrameType::B); - if let Some(ref prevbuf) = self.ipbs.get_b_bwdref() { - self.dsp.do_mc(buf, prevbuf, bx, by, bw, bh, mv.b_mv, false); - } - }, - MVRef::Ref0AndBRef => { - validate!(hdr.ftype == FrameType::B); - if let (Some(ref prevbuf), Some(ref nextbuf)) = (self.ipbs.get_b_fwdref(), self.ipbs.get_b_bwdref()) { - self.dsp.do_mc(buf, prevbuf, bx, by, bw, bh, mv.f_mv, false); - self.dsp.do_mc(&mut self.avg_buf, nextbuf, bx, by, bw, bh, mv.b_mv, true); - self.dsp.do_avg(buf, &self.avg_buf, bx, by, bw, bh); - } - }, - _ => unreachable!(), - }; - if cbh.pu_type == PUType::Quarters { - if part_no != 1 { - mv_pos += mv_w; - mv_x += mv_w; - } else { - mv_pos += mv_h * self.blk_stride - mv_w; - mv_x -= mv_w; - mv_y += mv_h; - } - } else if cbh.pu_type.has_hor_split() { - mv_pos += mv_h * self.blk_stride; - mv_y += mv_h; - } else if cbh.pu_type.has_ver_split() { - mv_pos += mv_w; - mv_x += mv_w; - } - } - }, - }; - if cbh.ttype != TransformType::None { - self.y_coeffs = [0; 16 * 16]; - self.u_coeffs = [0; 8 * 8]; - self.v_coeffs = [0; 8 * 8]; - } - let is_intra = cbh.cu_type == CUType::Intra; - let cb_pos = ((xpos & 63) >> 3) + ((ypos & 63) >> 3) * 8; - match cbh.ttype { - TransformType::T4X4 => { - let subset = if is_intra { 0 } else { 2 }; - if size == 16 { - let cbp16; - if br.read_bool()? { - cbp16 = rv6_decode_cbp16(br, &self.cbs, subset, self.sel_qp)?; - } else { - cbp16 = 0; - } - if cbp16 != 0 { - self.coded_blk[cb_pos + 0] = true; - self.coded_blk[cb_pos + 1] = true; - self.coded_blk[cb_pos + 8] = true; - self.coded_blk[cb_pos + 9] = true; - rv6_decode_cu_4x4in16x16(br, &self.cbs, is_intra, self.qp, self.sel_qp, &mut self.y_coeffs, &mut self.u_coeffs, &mut self.v_coeffs, cbp16)?; - for y in 0..4 { - for x in 0..4 { - let i = x + y * 4; - if ((cbp16 >> i) & 1) != 0 { - self.dsp.transform4x4(&mut self.y_coeffs[i * 16..][..16]); - let dstride = buf.get_stride(0); - let off = xpos + x * 4 + (ypos + y * 4) * dstride; - let mut data = buf.get_data_mut(); - let mut dst = &mut data; - self.dsp.add_block(&mut dst, off, dstride, &self.y_coeffs[i*16..][..16], 4); - } - } - } - for y in 0..2 { - for x in 0..2 { - let i = x + y * 2; - let xoff = (xpos >> 1) + x * 4; - let yoff = (ypos >> 1) + y * 4; - if ((cbp16 >> (16 + i)) & 1) != 0 { - self.dsp.transform4x4(&mut self.u_coeffs[i * 16..][..16]); - let dstride = buf.get_stride(1); - let off = buf.get_offset(1) + xoff + yoff * dstride; - let mut data = buf.get_data_mut(); - let mut dst = &mut data; - self.dsp.add_block(&mut dst, off, dstride, &self.u_coeffs[i * 16..][..16], 4); - } - if ((cbp16 >> (20 + i)) & 1) != 0 { - self.dsp.transform4x4(&mut self.v_coeffs[i * 16..][..16]); - let dstride = buf.get_stride(2); - let off = buf.get_offset(2) + xoff + yoff * dstride; - let mut data = buf.get_data_mut(); - let mut dst = &mut data; - self.dsp.add_block(&mut dst, off, dstride, &self.v_coeffs[i * 16..][..16], 4); - } - } - } - } - } else { - let cbp8 = rv6_decode_cbp8(br, &self.cbs, subset, self.sel_qp)?; - if cbp8 != 0 { - self.coded_blk[cb_pos] = true; - rv6_decode_cu_8x8(br, &self.cbs, is_intra, self.qp, self.sel_qp, &mut self.y_coeffs, &mut self.u_coeffs, &mut self.v_coeffs, cbp8, true)?; - } - for i in 0..4 { - let xoff = (i & 1) * 4; - let yoff = (i & 2) * 2; - if split_i4x4 { - let dstride = buf.get_stride(0); - let off = xpos + xoff + (ypos + yoff) * dstride; - let mut data = buf.get_data_mut(); - let mut dst = &mut data; - self.populate_ipred(hdr, dst, 0, dstride, xoff, yoff, 4, true); - let itype = self.blk_info[self.blk_pos + (i & 1) + (i >> 1) * self.blk_stride].imode; - self.ipred.pred_angle(&mut dst, off, dstride, 4, itype as usize, false); - } - if ((cbp8 >> i) & 1) != 0 { - let blk = &mut self.y_coeffs[i * 16..][..16]; - self.dsp.transform4x4(blk); - let dstride = buf.get_stride(0); - let soff = buf.get_offset(0); - let off = soff + xpos + xoff + (ypos + yoff) * dstride; - let mut data = buf.get_data_mut(); - let mut dst = &mut data; - self.dsp.add_block(&mut dst, off, dstride, blk, 4); - } - } - if ((cbp8 >> 4) & 1) != 0 { - self.dsp.transform4x4(&mut self.u_coeffs); - let dstride = buf.get_stride(1); - let soff = buf.get_offset(1); - let off = soff + (xpos >> 1) + (ypos >> 1) * dstride; - let mut data = buf.get_data_mut(); - let mut dst = &mut data; - self.dsp.add_block(&mut dst, off, dstride, &self.u_coeffs, 4); - } - if ((cbp8 >> 5) & 1) != 0 { - self.dsp.transform4x4(&mut self.v_coeffs); - let dstride = buf.get_stride(2); - let soff = buf.get_offset(2); - let off = soff + (xpos >> 1) + (ypos >> 1) * dstride; - let mut data = buf.get_data_mut(); - let mut dst = &mut data; - self.dsp.add_block(&mut dst, off, dstride, &self.v_coeffs, 4); - } - } - }, - TransformType::T8X8 => { - let subset = if is_intra { 1 } else { 3 }; - let cbp8 = rv6_decode_cbp8(br, &self.cbs, subset, self.sel_qp)?; - if cbp8 != 0 { - self.coded_blk[cb_pos] = true; - rv6_decode_cu_8x8(br, &self.cbs, is_intra, self.qp, self.sel_qp, &mut self.y_coeffs, &mut self.u_coeffs, &mut self.v_coeffs, cbp8, false)?; - if (cbp8 & 0xF) != 0 { - self.dsp.transform8x8(&mut self.y_coeffs); - let dstride = buf.get_stride(0); - let off = xpos + ypos * dstride; - let mut data = buf.get_data_mut(); - let mut dst = &mut data; - self.dsp.add_block(&mut dst, off, dstride, &self.y_coeffs, 8); - } - if ((cbp8 >> 4) & 1) != 0 { - self.dsp.transform4x4(&mut self.u_coeffs); - let dstride = buf.get_stride(1); - let soff = buf.get_offset(1); - let off = soff + (xpos >> 1) + (ypos >> 1) * dstride; - let mut data = buf.get_data_mut(); - let mut dst = &mut data; - self.dsp.add_block(&mut dst, off, dstride, &self.u_coeffs, 4); - } - if ((cbp8 >> 5) & 1) != 0 { - self.dsp.transform4x4(&mut self.v_coeffs); - let dstride = buf.get_stride(2); - let soff = buf.get_offset(2); - let off = soff + (xpos >> 1) + (ypos >> 1) * dstride; - let mut data = buf.get_data_mut(); - let mut dst = &mut data; - self.dsp.add_block(&mut dst, off, dstride, &self.v_coeffs, 4); - } - } - }, - TransformType::T16X16 => { - let subset = if is_intra { 1 } else { 3 }; - let num_clusters = size >> 4; - let cl_cbp = br.read((num_clusters * num_clusters) as u8)?; - for y in 0..num_clusters { - for x in 0..num_clusters { - if ((cl_cbp >> (x + y * num_clusters)) & 1) == 0 { continue; } - self.coded_blk[cb_pos + x * 2 + y * 2 * 8 + 0] = true; - self.coded_blk[cb_pos + x * 2 + y * 2 * 8 + 1] = true; - self.coded_blk[cb_pos + x * 2 + y * 2 * 8 + 8] = true; - self.coded_blk[cb_pos + x * 2 + y * 2 * 8 + 9] = true; - let super_cbp = rv6_decode_cbp16(br, &self.cbs, subset, self.sel_qp)?; - if super_cbp != 0 { - self.y_coeffs = [0; 16 * 16]; - self.u_coeffs = [0; 8 * 8]; - self.v_coeffs = [0; 8 * 8]; - rv6_decode_cu_16x16(br, &self.cbs, is_intra, self.qp, self.sel_qp, &mut self.y_coeffs, &mut self.u_coeffs, &mut self.v_coeffs, super_cbp)?; - if (super_cbp & 0xFFFF) != 0 { - self.dsp.transform16x16(&mut self.y_coeffs); - let dstride = buf.get_stride(0); - let off = xpos + x * 16 + (ypos + y * 16) * dstride; - let mut data = buf.get_data_mut(); - let mut dst = &mut data; - self.dsp.add_block(&mut dst, off, dstride, &self.y_coeffs, 16); - } - if ((super_cbp >> 16) & 0xF) != 0 { - self.dsp.transform8x8(&mut self.u_coeffs); - let dstride = buf.get_stride(1); - let soff = buf.get_offset(1); - let off = soff + (xpos >> 1) + x * 8 + ((ypos >> 1) + y * 8) * dstride; - let mut data = buf.get_data_mut(); - let mut dst = &mut data; - self.dsp.add_block(&mut dst, off, dstride, &self.u_coeffs, 8); - } - if ((super_cbp >> 20) & 0xF) != 0 { - self.dsp.transform8x8(&mut self.v_coeffs); - let dstride = buf.get_stride(2); - let soff = buf.get_offset(2); - let off = soff + (xpos >> 1) + x * 8 + ((ypos >> 1) + y * 8) * dstride; - let mut data = buf.get_data_mut(); - let mut dst = &mut data; - self.dsp.add_block(&mut dst, off, dstride, &self.v_coeffs, 8); - } - } - } - } - }, - _ => {}, - }; - } - Ok(()) - } - fn reconstruct_info(&mut self, hdr: &FrameHeader, cbh: &CBHeader, size: usize) -> DecoderResult<()>{ - let mut pui = PUInfo::default(); - let pu_size = size >> 3; - pui.cu_type = cbh.cu_type; - pui.ttype = cbh.ttype; - if (cbh.cu_type == CUType::Intra) && (cbh.pu_type == PUType::Quarters) { // very special case - self.pu_info[self.pu_pos] = pui; - for y in 0..2 { - for x in 0..2 { - let imode = self.reconstruct_intra(hdr, cbh, 4, x + y * 2); - validate!(imode <= MAX_IMODE); - self.blk_info[self.blk_pos + x + y * self.blk_stride].imode = imode; - self.blk_info[self.blk_pos + x + y * self.blk_stride].mv = MVInfo::default(); - } - } - return Ok(()); - } - match cbh.cu_type { - CUType::Intra => { - self.pu_info[self.pu_pos] = pui; - let imode = self.reconstruct_intra(hdr, cbh, size, 0); - validate!(imode <= MAX_IMODE); - for y in 0..(size >> 2) { - for x in 0..(size >> 2) { - self.blk_info[self.blk_pos + x + y * self.blk_stride].imode = imode; - } - } - }, - CUType::InterMV => { - let mut mv_x = self.xpos >> 2; - let mut mv_y = self.ypos >> 2; - let mut mv_pos = self.blk_pos; - let pu_type = cbh.pu_type; - for part_no in 0..pu_type.get_num_mvs() { - let (mv_w, mv_h) = pu_type.get_mv_size(part_no, size); - let mv = self.predict_mv(hdr, mv_x, mv_y, mv_w, &cbh.mv[part_no]); - for y in 0..mv_h { - for x in 0..mv_w { - self.blk_info[mv_pos + x + y * self.blk_stride].mv = mv; - } - } - if pu_type == PUType::Quarters { - if part_no != 1 { - mv_pos += mv_w; - mv_x += mv_w; - } else { - mv_pos += mv_h * self.blk_stride - mv_w; - mv_x -= mv_w; - mv_y += mv_h; - } - } else if pu_type.has_hor_split() { - mv_pos += mv_h * self.blk_stride; - mv_y += mv_h; - } else if pu_type.has_ver_split() { - mv_pos += mv_w; - mv_x += mv_w; - } - } - }, - _ => { - let skip_idx = cbh.mv[0].mvref.get_skip_mv_num(); - let mut skip_cand: UniqueList<MVInfo> = UniqueList::new(4); - self.fill_skip_cand(hdr, &mut skip_cand, size); - let mv = skip_cand.list[skip_idx]; - - let mv_size = size >> 2; - for y in 0..mv_size { - for x in 0..mv_size { - self.blk_info[self.blk_pos + x + y * self.blk_stride].mv = mv; - } - } - }, - }; - for y in 0..pu_size { - for x in 0..pu_size { - self.pu_info[self.pu_pos + x + y * self.pu_stride] = pui; - } - } - Ok(()) - } - fn reconstruct_intra(&self, hdr: &FrameHeader, cbh: &CBHeader, size: usize, sub: usize) -> u8 { - match cbh.imode[0] { - IntraMode::DC64 => { return 1; }, - IntraMode::Plane64 => { return 0; }, - _ => {}, - }; - // form list of predictors - let blk_pos = self.blk_pos + (sub & 1) + (sub >> 1) * self.blk_stride; - let mut ipm_cand: UniqueList<u8> = UniqueList::new(3); - if hdr.has_top_block(self.xpos, self.ypos, (sub & 1) * 4, 0, size) { - let pu = &self.pu_info[self.pu_pos - self.pu_stride]; - if pu.is_intra() { - ipm_cand.add(self.blk_info[self.blk_pos + (sub & 1) - self.blk_stride].imode); - } - } - if hdr.has_left_block(self.xpos, self.ypos, 0, (sub & 2) * 2, size) { - let pu = &self.pu_info[self.pu_pos - 1]; - if pu.is_intra() { - ipm_cand.add(self.blk_info[blk_pos - 1 - (sub & 1)].imode); - } - } - let tl_x = if (sub & 2) == 0 { self.xpos + (sub & 1) * 4 } else { self.xpos }; - let tl_y = self.ypos + (sub & 2) * 4; - if (tl_x > 0) && (tl_y > 0) { - let pu = match sub { - 0 => &self.pu_info[self.pu_pos - self.pu_stride - 1], - 1 => &self.pu_info[self.pu_pos - self.pu_stride], - 2 => &self.pu_info[self.pu_pos - 1], - _ => &self.pu_info[self.pu_pos - 1], - }; - if pu.is_intra() { - if sub != 3 { - ipm_cand.add(self.blk_info[blk_pos - self.blk_stride - 1].imode); - } else { - ipm_cand.add(self.blk_info[blk_pos - self.blk_stride - 2].imode); - } - } - } - for el in RV60_CANDIDATE_INTRA_ANGLES.into_iter() { - ipm_cand.add(*el); - } - // actually decode prediction mode - match cbh.imode[sub] { - IntraMode::Index(idx) => { - ipm_cand.list[idx as usize] - }, - IntraMode::Mode(mode) => { - let mut imode = mode; - let mut ipm_cs: [u8; 3] = [ipm_cand.list[0], ipm_cand.list[1], ipm_cand.list[2]]; - ipm_cs.sort(); - for ic in ipm_cs.into_iter() { - if imode >= *ic { - imode += 1; - } - } - imode - }, - _ => unreachable!(), - } - } - fn populate_ipred(&mut self, hdr: &FrameHeader, src: &[u8], soff: usize, stride: usize, xoff: usize, yoff: usize, size: usize, is_luma: bool) { - let src_off = if is_luma { - soff + self.xpos + xoff + (self.ypos + yoff) * stride - } else { - soff + (self.xpos >> 1) + (self.ypos >> 1) * stride - }; - self.ipred = IntraPredContext::new(); - if (self.ypos + yoff) > 0 { - self.ipred.has_t = true; - for x in 0..size { - self.ipred.t[x + 1] = src[src_off - stride + x]; - } - if (is_luma && hdr.has_top_right_block(self.xpos, self.ypos, xoff, yoff, size)) || - (!is_luma && hdr.has_top_right_block(self.xpos, self.ypos, 0, 0, size << 1)) { - self.ipred.has_tr = true; - for x in size..size*2 { - self.ipred.t[x + 1] = src[src_off - stride + x]; - } - } else { - for i in 0..size { - self.ipred.t[size + i + 1] = self.ipred.t[size]; - } - } - if (self.xpos + xoff) > 0 { - self.ipred.t[0] = src[src_off - stride - 1]; - } - } - if (self.xpos + xoff) > 0 { - self.ipred.has_l = true; - for y in 0..size { - self.ipred.l[y + 1] = src[src_off - 1 + y * stride]; - } - if (is_luma && hdr.has_left_down_block(self.xpos, self.ypos, xoff, yoff, size)) || - (!is_luma && hdr.has_left_down_block(self.xpos, self.ypos, 0, 0, size << 1)) { - self.ipred.has_ld = true; - for y in size..size*2 { - self.ipred.l[y + 1] = src[src_off - 1 + y * stride]; - } - } else { - for i in 0..size { - self.ipred.l[size + i + 1] = self.ipred.l[size]; - } - } - if (self.ypos + yoff) > 0 { - self.ipred.l[0] = src[src_off - stride - 1]; - } - } - } - fn predict_mv(&self, hdr: &FrameHeader, mv_x: usize, mv_y: usize, mv_w: usize, mvi: &MVInfo) -> MVInfo { - let mv_pos = mv_x + mv_y * self.blk_stride; - let f_mv: MV; - let b_mv: MV; - if mvi.mvref.is_fwd() { - let mut mv_cand: [MV; 3] = [ZERO_MV; 3]; - let mut mv_cand_size: usize = 0; - if mv_x > 0 { - let ref_mv = &self.blk_info[mv_pos - 1].mv; - if ref_mv.matches_fwd(mvi.mvref) { - mv_cand[mv_cand_size] = ref_mv.f_mv; - mv_cand_size += 1; - } - } - if mv_y > 0 { - let ref_mv = &self.blk_info[mv_pos - self.blk_stride].mv; - if ref_mv.matches_fwd(mvi.mvref) { - mv_cand[mv_cand_size] = ref_mv.f_mv; - mv_cand_size += 1; - } - } - if hdr.has_top_block(mv_x << 2, mv_y << 2, mv_w << 2, 0, 4) { - let ref_mv = &self.blk_info[mv_pos - self.blk_stride + mv_w].mv; - if ref_mv.matches_fwd(mvi.mvref) { - mv_cand[mv_cand_size] = ref_mv.f_mv; - mv_cand_size += 1; - } - } - f_mv = match mv_cand_size { - 1 | 2 => { - let x = mv_cand[0].x + mv_cand[1].x + mv_cand[2].x; - let y = mv_cand[0].y + mv_cand[1].y + mv_cand[2].y; - if mv_cand_size == 1 { - MV { x, y } - } else { - MV { x: x >> 1, y: y >> 1 } - } - }, - 3 => MV::pred(mv_cand[0], mv_cand[1], mv_cand[2]), - _ => ZERO_MV, - }; - } else { - f_mv = ZERO_MV; - } - if mvi.mvref.is_bwd() { - let mut mv_cand: [MV; 3] = [ZERO_MV; 3]; - let mut mv_cand_size: usize = 0; - if mv_x > 0 { - let ref_mv = &self.blk_info[mv_pos - 1].mv; - if ref_mv.matches_bwd(mvi.mvref) { - mv_cand[mv_cand_size] = ref_mv.b_mv; - mv_cand_size += 1; - } - } - if mv_y > 0 { - let ref_mv = &self.blk_info[mv_pos - self.blk_stride].mv; - if ref_mv.matches_bwd(mvi.mvref) { - mv_cand[mv_cand_size] = ref_mv.b_mv; - mv_cand_size += 1; - } - } - if hdr.has_top_block(mv_x << 2, mv_y << 2, mv_w << 2, 0, 4) { - let ref_mv = &self.blk_info[mv_pos - self.blk_stride + mv_w].mv; - if ref_mv.matches_bwd(mvi.mvref) { - mv_cand[mv_cand_size] = ref_mv.b_mv; - mv_cand_size += 1; - } - } - b_mv = match mv_cand_size { - 1 | 2 => { - let x = mv_cand[0].x + mv_cand[1].x + mv_cand[2].x; - let y = mv_cand[0].y + mv_cand[1].y + mv_cand[2].y; - if mv_cand_size == 1 { - MV { x, y } - } else { - MV { x: x >> 1, y: y >> 1 } - } - }, - 3 => MV::pred(mv_cand[0], mv_cand[1], mv_cand[2]), - _ => ZERO_MV, - }; - } else { - b_mv = ZERO_MV; - } - - MVInfo { f_mv: mvi.f_mv + f_mv, b_mv: mvi.b_mv + b_mv, mvref: mvi.mvref } - } - fn fill_skip_cand(&mut self, hdr: &FrameHeader, skip_cand: &mut UniqueList<MVInfo>, size: usize) { - let mv_size = size >> 2; - - if self.xpos > 0 { - let mv = &self.blk_info[self.blk_pos - 1].mv; - if mv.is_some() { - skip_cand.add(*mv); - } - } - if self.ypos > 0 { - let mv = &self.blk_info[self.blk_pos - self.blk_stride].mv; - if mv.is_some() { - skip_cand.add(*mv); - } - } - if hdr.has_top_right_block(self.xpos, self.ypos, 0, 0, size) { - let mv = &self.blk_info[self.blk_pos - self.blk_stride + mv_size].mv; - if mv.is_some() { - skip_cand.add(*mv); - } - } - if hdr.has_left_down_block(self.xpos, self.ypos, 0, 0, size) { - let mv = &self.blk_info[self.blk_pos + self.blk_stride * mv_size - 1].mv; - if mv.is_some() { - skip_cand.add(*mv); - } - } - if hdr.has_left_block(self.xpos, self.ypos, 0, 0, size) { - let mv = &self.blk_info[self.blk_pos + self.blk_stride * (mv_size - 1) - 1].mv; - if mv.is_some() { - skip_cand.add(*mv); - } - } - if hdr.has_top_block(self.xpos, self.ypos, 0, 0, size) { - let mv = &self.blk_info[self.blk_pos - self.blk_stride + mv_size - 1].mv; - if mv.is_some() { - skip_cand.add(*mv); - } - } - if (self.xpos > 0) && (self.ypos > 0) { - let mv = &self.blk_info[self.blk_pos - self.blk_stride - 1].mv; - if mv.is_some() { - skip_cand.add(*mv); - } - } - for i in skip_cand.fill..4 { - skip_cand.list[i] = MVInfo { f_mv: ZERO_MV, b_mv: ZERO_MV, mvref: MVRef::Ref0 }; - } - } - fn deblock_cb_tree(&mut self, buf: &mut NAVideoBuffer<u8>, hdr: &FrameHeader, xpos: usize, ypos: usize, log_size: u8) { - if (xpos >= hdr.width) || (ypos >= hdr.height) { return; } - let split = (log_size > 3) && self.cu_splits.pop().unwrap(); - if split { - let hsize = 1 << (log_size - 1); - self.deblock_cb_tree(buf, hdr, xpos, ypos, log_size - 1); - self.deblock_cb_tree(buf, hdr, xpos + hsize, ypos, log_size - 1); - self.deblock_cb_tree(buf, hdr, xpos, ypos + hsize, log_size - 1); - self.deblock_cb_tree(buf, hdr, xpos + hsize, ypos + hsize, log_size - 1); - } else { - let pu_pos = (xpos >> 3) + (ypos >> 3) * self.pu_stride; - let cu_type = self.pu_info[pu_pos].cu_type; - let tsize = if self.pu_info[pu_pos].ttype == TransformType::T16X16 { 4 } else { 3 }; - let ntiles = 1 << (log_size - tsize); - let dparams = RV60DeblockParams { - deblock_chroma: hdr.deblock_chroma, - width: hdr.width, - height: hdr.height, - dblkstride: self.dblk.stride, - }; - for ty in 0..ntiles { - for tx in 0..ntiles { - let x = xpos + (tx << tsize); - let y = ypos + (ty << tsize); - let cb_pos = ((x & 63) >> 3) + ((y & 63) >> 3) * 8; - if cu_type == CUType::Intra { - self.dblk.set_strength(x, y, 1 << tsize, self.qp, 2); - } else if (cu_type != CUType::Skip) && self.coded_blk[cb_pos] { - self.dblk.set_strength(x, y, 1 << tsize, self.qp, 1); - } else { - self.dblk.set_strength(x, y, 1 << tsize, self.qp, 0); - self.derive_deblock_strength(x, y, 1 << (tsize - 2)); - } - self.dsp.do_deblock(&dparams, buf, x, y, 1 << tsize, - self.dblk.top_str.as_slice(), - self.dblk.left_str.as_slice(), - self.dblk.get_pos(x, y)); - } - } - } - } - fn derive_deblock_strength(&mut self, xpos: usize, ypos: usize, size4: usize) { - let blk_pos = (xpos >> 2) + (ypos >> 2) * self.blk_stride; - let mut dblk_pos = self.dblk.get_pos(xpos, ypos); - if ypos > 0 { - let top_blk_pos = blk_pos - self.blk_stride; - for i in 0..size4 { - if self.dblk.get_top_strength(dblk_pos + i) == 0 { - if self.blk_info[blk_pos + i].mv.is_deblock_cand(&self.blk_info[top_blk_pos + i].mv) { - self.dblk.set_top_strength(dblk_pos + i, 1); - } - } - } - } - if xpos > 0 { - for i in 0..size4 { - if self.dblk.get_left_strength(dblk_pos) == 0 { - if self.blk_info[blk_pos + i].mv.is_deblock_cand(&self.blk_info[blk_pos + i - 1].mv) { - self.dblk.set_left_strength(dblk_pos, 1); - } - } - dblk_pos += self.dblk.stride; - } - } - } -} - -impl NADecoder for RealVideo60Decoder { - fn init(&mut self, info: Rc<NACodecInfo>) -> DecoderResult<()> { - if let NACodecTypeInfo::Video(_vinfo) = info.get_properties() { - let fmt = YUV420_FORMAT; - let myinfo = NACodecTypeInfo::Video(NAVideoInfo::new(0, 0, false, fmt)); - self.info = Rc::new(NACodecInfo::new_ref(info.get_name(), myinfo, info.get_extradata())); - - let edata = info.get_extradata().unwrap(); - let src: &[u8] = &edata; - - if src.len() < 8 { return Err(DecoderError::InvalidData); } - let mut mr = MemoryReader::new_read(src); - let mut br = ByteReader::new(&mut mr); - let _flags = br.read_u32be()?; - let version = br.read_u32be()?; - let _unk = br.read_u16be()?; - validate!((version >> 28) == 4); - // then width and height again as 16be - - //self.bd.width = vinfo.get_width(); - //self.bd.height = vinfo.get_height(); - //self.frmmgr.clear(); - Ok(()) - } else { -println!("???"); - Err(DecoderError::InvalidData) - } - } - fn decode(&mut self, pkt: &NAPacket) -> DecoderResult<NAFrameRef> { - let src = pkt.get_buffer(); - - validate!(src.len() > 9); - let hsize = (src[0] as usize) * 8 + 9; - let mut br = BitReader::new(&src[hsize..], src.len() - hsize, BitReaderMode::BE); - let hdr = FrameHeader::read(&mut br)?; - let mut slices: Vec<usize> = Vec::new(); - hdr.parse_slice_sizes(&mut br, &mut slices)?; - - let tmp_vinfo = NAVideoInfo::new(hdr.width, hdr.height, false, YUV420_FORMAT); - let res = alloc_video_buffer(tmp_vinfo, 6); - if !res.is_ok() { return Err(DecoderError::InvalidData); } - let mut bufinfo = res.unwrap(); - let mut buf = bufinfo.get_vbuf().unwrap(); - - let cu_w = hdr.get_width_cu(); - let cu_h = hdr.get_height_cu(); - self.pu_stride = cu_w << 3; - self.pu_info.resize(self.pu_stride * (cu_h << 3), PUInfo::default()); - self.blk_stride = cu_w << 4; - self.blk_info.truncate(0); - self.blk_info.resize(self.blk_stride * (cu_h << 4), BlockInfo::default()); - if hdr.deblock { - self.dblk.reinit(hdr.width, hdr.height); - } - let mut off = hsize + ((br.tell() >> 3) as usize); - for (cu_y, size) in slices.into_iter().enumerate() { - self.decode_cu_line(&mut buf, &hdr, &src[off..][..size], cu_y)?; - off += size; - } - if (hdr.ftype == FrameType::I) || (hdr.ftype == FrameType::P) { - self.ipbs.add_frame(buf); - } - - let mut frm = NAFrame::new_from_pkt(pkt, self.info.clone(), bufinfo); - frm.set_keyframe(hdr.ftype == FrameType::I); - frm.set_pts(Some(hdr.ts as u64)); - frm.set_frame_type(hdr.ftype); - Ok(Rc::new(RefCell::new(frm))) - } -} - -pub fn get_decoder() -> Box<NADecoder> { - Box::new(RealVideo60Decoder::new()) -} - -#[cfg(test)] -mod test { - use crate::test::dec_video::test_file_decoding; - #[test] - fn test_rv60() { - test_file_decoding("realmedia", "assets/RV/RV60.rmhd", Some(4000), true, false, None/*Some("rv60")*/); -//panic!("end"); - } -} diff --git a/src/codecs/real/rv60codes.rs b/src/codecs/real/rv60codes.rs deleted file mode 100644 index 3b85a80..0000000 --- a/src/codecs/real/rv60codes.rs +++ /dev/null @@ -1,1437 +0,0 @@ -use crate::codecs::*; -use crate::io::bitreader::BitReader; -use crate::io::codebook::*; -use std::mem; -use std::ptr; - -const NUM_INTRA_SETS: usize = 5; -const NUM_INTER_SETS: usize = 7; - -const NUM_COEFF_ENTRIES: usize = 3 * 3 * 3 * 4; -const NUM_ESC_ENTRIES: usize = 32; -const NUM_CBP_ENTRIES: usize = 64; -struct CoeffCodebooks { - l0_cb: [Codebook<u16>; 2], - l12_cb: [Codebook<u16>; 2], - l3_cb: [Codebook<u16>; 2], - esc_cb: Codebook<u16>, -} - -const MAX_ELEMS: usize = NUM_COEFF_ENTRIES * 8; -struct RV60CodebookDescReader { - len: usize, - codes: [u32; MAX_ELEMS], - bits: [u8; MAX_ELEMS], -} - -impl RV60CodebookDescReader { - fn new(table: &'static [u32], len: usize, ignfirst: bool) -> Self { - let mut prefixes: [u32; 18] = [0; 18]; - let mut counts: [usize; 17] = [0; 17]; - - let mut codes: [u32; MAX_ELEMS] = [0; MAX_ELEMS]; - let mut bits: [u8; MAX_ELEMS] = [0; MAX_ELEMS]; - for i in 0..(len + 7) >> 3 { - let code = table[i]; - for j in 0..8 { - if (i * 8 + j) == len { break; } - let b = if !ignfirst || (i != 0) || (j != 0) { - (((code >> ((7 - j) * 4)) & 0xF) as u8) + 1 - } else { - 0 - }; - bits[i * 8 + j] = b; - counts[b as usize] += 1; - } - } - for i in 1..17 { - prefixes[i + 1] = (prefixes[i] + (counts[i] as u32)) << 1; - } - for i in 0..len { - codes[i] = prefixes[bits[i] as usize]; - prefixes[bits[i] as usize] += 1; - } - - Self { len, codes, bits } - } -} - -impl CodebookDescReader<u16> for RV60CodebookDescReader { - fn bits(&mut self, idx: usize) -> u8 { self.bits[idx] } - fn code(&mut self, idx: usize) -> u32 { self.codes[idx] } - fn sym (&mut self, idx: usize) -> u16 { idx as u16 } - fn len(&mut self) -> usize { self.len } -} - -impl CoeffCodebooks { - fn init(set_no: usize, intra: bool) -> Self { - let coeff_tabs = if intra { &RV60_INTRA_COEFFS_CB_DESC[set_no] } else { &RV60_INTER_COEFFS_CB_DESC[set_no] }; - let mut cbr = RV60CodebookDescReader::new(&coeff_tabs.l0_tab[0], NUM_COEFF_ENTRIES * 8, true); - let l0c0 = Codebook::new(&mut cbr, CodebookMode::MSB).unwrap(); - let mut cbr = RV60CodebookDescReader::new(&coeff_tabs.l0_tab[1], NUM_COEFF_ENTRIES * 8, true); - let l0c1 = Codebook::new(&mut cbr, CodebookMode::MSB).unwrap(); - let mut cbr = RV60CodebookDescReader::new(&coeff_tabs.l12_tab[0], NUM_COEFF_ENTRIES, true); - let l12c0 = Codebook::new(&mut cbr, CodebookMode::MSB).unwrap(); - let mut cbr = RV60CodebookDescReader::new(&coeff_tabs.l12_tab[1], NUM_COEFF_ENTRIES, true); - let l12c1 = Codebook::new(&mut cbr, CodebookMode::MSB).unwrap(); - let mut cbr = RV60CodebookDescReader::new(&coeff_tabs.l3_tab[0], NUM_COEFF_ENTRIES, true); - let l3c0 = Codebook::new(&mut cbr, CodebookMode::MSB).unwrap(); - let mut cbr = RV60CodebookDescReader::new(&coeff_tabs.l3_tab[1], NUM_COEFF_ENTRIES, true); - let l3c1 = Codebook::new(&mut cbr, CodebookMode::MSB).unwrap(); - let mut cbr = RV60CodebookDescReader::new(&coeff_tabs.esc_tab, NUM_ESC_ENTRIES, false); - let esc_cb = Codebook::new(&mut cbr, CodebookMode::MSB).unwrap(); - Self { - l0_cb: [ l0c0, l0c1 ], - l12_cb: [ l12c0, l12c1 ], - l3_cb: [ l3c0, l3c1 ], - esc_cb, - } - } -} - -pub struct RV60Codebooks { - cbp8_cb: [[Codebook<u16>; 4]; NUM_INTER_SETS], - cbp16_cb: [[Codebook<u16>; 12]; NUM_INTER_SETS], - intra_coeff_cb: [CoeffCodebooks; NUM_INTRA_SETS], - inter_coeff_cb: [CoeffCodebooks; NUM_INTER_SETS], -} - -impl RV60Codebooks { - pub fn init() -> Self { - let mut cbp8_cb: [[Codebook<u16>; 4]; NUM_INTER_SETS]; - let mut cbp16_cb: [[Codebook<u16>; 12]; NUM_INTER_SETS]; - unsafe { - cbp8_cb = mem::uninitialized(); - cbp16_cb = mem::uninitialized(); - for set_no in 0..NUM_INTER_SETS { - for i in 0..4 { - let mut cbr = RV60CodebookDescReader::new(&RV60_CBP8_TABS[set_no][i], NUM_CBP_ENTRIES, false); - ptr::write(&mut cbp8_cb[set_no][i], Codebook::new(&mut cbr, CodebookMode::MSB).unwrap()); - } - for i in 0..12 { - let mut cbr = RV60CodebookDescReader::new(&RV60_CBP16_TABS[set_no][i], NUM_CBP_ENTRIES, false); - ptr::write(&mut cbp16_cb[set_no][i], Codebook::new(&mut cbr, CodebookMode::MSB).unwrap()); - } - } - } - let mut intra_coeff_cb: [CoeffCodebooks; NUM_INTRA_SETS]; - let mut inter_coeff_cb: [CoeffCodebooks; NUM_INTER_SETS]; - unsafe { - intra_coeff_cb = mem::uninitialized(); - for set_no in 0..NUM_INTRA_SETS { - ptr::write(&mut intra_coeff_cb[set_no], CoeffCodebooks::init(set_no, true)); - } - inter_coeff_cb = mem::uninitialized(); - for set_no in 0..NUM_INTER_SETS { - ptr::write(&mut inter_coeff_cb[set_no], CoeffCodebooks::init(set_no, false)); - } - } - Self { cbp8_cb, cbp16_cb, intra_coeff_cb, inter_coeff_cb } - } - fn get_c4x4_set(qp: u8, is_intra: bool) -> usize { - if is_intra { - RV60_QP_TO_IDX[(qp as usize) + 32] - } else { - RV60_QP_TO_IDX[qp as usize] - } - } -} - -fn decode_coeff(br: &mut BitReader, cb: &Codebook<u16>, inval: i16, esc_val: i16) -> DecoderResult<i16> { - if inval != esc_val { - if inval != 0 && br.read_bool()? { - Ok(-inval) - } else { - Ok(inval) - } - } else { - let esc_sym = br.read_cb(cb)?; - let val = (if esc_sym > 23 { - let esc_bits = (esc_sym - 23) as u8; - let extrabits = br.read(esc_bits)? as i16; - (1 << esc_bits) + extrabits + 22 - } else { - esc_sym as i16 - }) + esc_val; - if br.read_bool()? { - Ok(-val) - } else { - Ok(val) - } - } -} - -fn quant(val: i16, q: i16) -> i16 { (val * q + 8) >> 4 } - -fn decode_2x2_dc(br: &mut BitReader, cb: &Codebook<u16>, coeffs: &mut [i16], stride: usize, block2: bool, dsc: usize, q_dc: i16, q_ac: i16) -> DecoderResult<()> { - if dsc == 0 { return Ok(()); } - let lx = RV60_DSC_TO_LX[dsc as usize]; - let l0 = ((lx >> 0) & 0xFF) as i16; - let l1 = ((lx >> 8) & 0xFF) as i16; - let l2 = ((lx >> 16) & 0xFF) as i16; - let l3 = ((lx >> 24) & 0xFF) as i16; - coeffs[0] = quant(decode_coeff(br, cb, l0, 3)?, q_dc); - if !block2 { - coeffs[1] = quant(decode_coeff(br, cb, l1, 2)?, q_ac); - coeffs[stride] = quant(decode_coeff(br, cb, l2, 2)?, q_ac); - } else { - coeffs[stride] = quant(decode_coeff(br, cb, l1, 2)?, q_ac); - coeffs[1] = quant(decode_coeff(br, cb, l2, 2)?, q_ac); - } - coeffs[stride + 1] = quant(decode_coeff(br, cb, l3, 2)?, q_ac); - Ok(()) -} -fn decode_2x2(br: &mut BitReader, cb: &Codebook<u16>, coeffs: &mut [i16], stride: usize, block2: bool, dsc: usize, q_ac: i16) -> DecoderResult<()> { - if dsc == 0 { return Ok(()); } - let lx = RV60_DSC_TO_LX[dsc as usize]; - let l0 = ((lx >> 0) & 0xFF) as i16; - let l1 = ((lx >> 8) & 0xFF) as i16; - let l2 = ((lx >> 16) & 0xFF) as i16; - let l3 = ((lx >> 24) & 0xFF) as i16; - coeffs[0] = quant(decode_coeff(br, cb, l0, 3)?, q_ac); - if !block2 { - coeffs[1] = quant(decode_coeff(br, cb, l1, 2)?, q_ac); - coeffs[stride] = quant(decode_coeff(br, cb, l2, 2)?, q_ac); - } else { - coeffs[stride] = quant(decode_coeff(br, cb, l1, 2)?, q_ac); - coeffs[1] = quant(decode_coeff(br, cb, l2, 2)?, q_ac); - } - coeffs[stride + 1] = quant(decode_coeff(br, cb, l3, 2)?, q_ac); - Ok(()) -} - -fn decode_4x4_block_dc(br: &mut BitReader, cbs: &CoeffCodebooks, is_luma: bool, coeffs: &mut [i16], stride: usize, q_dc: i16, q_ac: i16) -> DecoderResult<()> { - let tab_idx = if is_luma { 0 } else { 1 }; - let sym0 = br.read_cb(&cbs.l0_cb[tab_idx])?; - let grp0 = (sym0 >> 3) as usize; - let esc_cb = &cbs.esc_cb; - if grp0 != 0 { - decode_2x2_dc(br, esc_cb, &mut coeffs[0..], stride, false, grp0, q_dc, q_ac)?; - } - if (sym0 & 4) != 0 { - let grp = br.read_cb(&cbs.l12_cb[tab_idx])? as usize; - decode_2x2(br, esc_cb, &mut coeffs[2..], stride, false, grp, q_ac)?; - } - if (sym0 & 2) != 0 { - let grp = br.read_cb(&cbs.l12_cb[tab_idx])? as usize; - decode_2x2(br, esc_cb, &mut coeffs[2*stride..], stride, true, grp, q_ac)?; - } - if (sym0 & 1) != 0 { - let grp = br.read_cb(&cbs.l3_cb[tab_idx])? as usize; - decode_2x2(br, esc_cb, &mut coeffs[2*stride+2..], stride, false, grp, q_ac)?; - } - Ok(()) -} - -fn decode_4x4_block(br: &mut BitReader, cbs: &CoeffCodebooks, is_luma: bool, coeffs: &mut [i16], stride: usize, q_ac: i16) -> DecoderResult<()> { - let tab_idx = if is_luma { 0 } else { 1 }; - let sym0 = br.read_cb(&cbs.l0_cb[tab_idx])?; - let grp0 = (sym0 >> 3) as usize; - let esc_cb = &cbs.esc_cb; - if grp0 != 0 { - decode_2x2(br, esc_cb, &mut coeffs[0..], stride, false, grp0, q_ac)?; - } - if (sym0 & 4) != 0 { - let grp = br.read_cb(&cbs.l12_cb[tab_idx])? as usize; - decode_2x2(br, esc_cb, &mut coeffs[2..], stride, false, grp, q_ac)?; - } - if (sym0 & 2) != 0 { - let grp = br.read_cb(&cbs.l12_cb[tab_idx])? as usize; - decode_2x2(br, esc_cb, &mut coeffs[2*stride..], stride, true, grp, q_ac)?; - } - if (sym0 & 1) != 0 { - let grp = br.read_cb(&cbs.l3_cb[tab_idx])? as usize; - decode_2x2(br, esc_cb, &mut coeffs[2*stride+2..], stride, false, grp, q_ac)?; - } - Ok(()) -} - -fn decode_cbp8(br: &mut BitReader, cbs: &[[Codebook<u16>; 4]; NUM_INTER_SETS], qp: u8, subset: usize) -> DecoderResult<u16> { - let cb_set = RV60_QP_TO_IDX[qp as usize]; - let cbp = br.read_cb(&cbs[cb_set][subset])?; - Ok(cbp) -} - -fn decode_super_cbp(br: &mut BitReader, cbs: &[Codebook<u16>]) -> DecoderResult<u32> { - let sym0 = br.read_cb(&cbs[0])? as u32; - let sym1 = br.read_cb(&cbs[1])? as u32; - let sym2 = br.read_cb(&cbs[2])? as u32; - let sym3 = br.read_cb(&cbs[3])? as u32; - - // luma/chroma interleaved CBPs - Ok(0 - + ((sym0 & 0x03) << 0) - + ((sym0 & 0x0C) << 2) - + ((sym0 & 0x10) << 12) - + ((sym0 & 0x20) << 15) - + ((sym1 & 0x03) << 2) - + ((sym1 & 0x0C) << 4) - + ((sym1 & 0x10) << 13) - + ((sym1 & 0x20) << 16) - + ((sym2 & 0x03) << 8) - + ((sym2 & 0x0C) << 10) - + ((sym2 & 0x10) << 14) - + ((sym2 & 0x20) << 17) - + ((sym3 & 0x03) << 10) - + ((sym3 & 0x0C) << 12) - + ((sym3 & 0x10) << 15) - + ((sym3 & 0x20) << 18) - ) -} - -pub fn rv6_decode_cbp8(br: &mut BitReader, cbs: &RV60Codebooks, subset: usize, qp: u8) -> DecoderResult<u32> { - let cbp8 = decode_cbp8(br, &cbs.cbp8_cb, qp, subset)?; - Ok(cbp8 as u32) -} - -pub fn rv6_decode_cbp16(br: &mut BitReader, cbs: &RV60Codebooks, subset: usize, qp: u8) -> DecoderResult<u32> { - let cb_set = RV60_QP_TO_IDX[qp as usize]; - let cbp16; - if subset == 0 { - cbp16 = decode_super_cbp(br, &cbs.cbp8_cb[cb_set])?; - } else { - cbp16 = decode_super_cbp(br, &cbs.cbp16_cb[cb_set][(subset - 1) * 4..][..4])?; - } - Ok(cbp16) -} - -pub fn rv6_decode_cu_8x8(br: &mut BitReader, cbs: &RV60Codebooks, is_intra: bool, qp: u8, sel_qp: u8, y_coeffs: &mut [i16; 16 * 16], u_coeffs: &mut [i16; 8 * 8], v_coeffs: &mut [i16; 8 * 8], ccbp: u32, mode4x4: bool) -> DecoderResult<()> { - let cb_set = RV60Codebooks::get_c4x4_set(sel_qp, is_intra); - let cb = if is_intra { &cbs.intra_coeff_cb[cb_set] } else { &cbs.inter_coeff_cb[cb_set] }; - let q_y = RV60_QUANTS_B[qp as usize]; - let q_c_dc = RV60_QUANTS_B[RV60_CHROMA_QUANT_DC[qp as usize] as usize]; - let q_c_ac = RV60_QUANTS_B[RV60_CHROMA_QUANT[qp as usize] as usize]; - for i in 0..4 { - if ((ccbp >> i) & 1) != 0 { - let (off, stride) = if mode4x4 { - (i * 16, 4) - } else { - ((i & 1) * 4 + (i & 2) * 2 * 8, 8) - }; - decode_4x4_block(br, cb, true, &mut y_coeffs[off..], stride, q_y)?; - } - } - if ((ccbp >> 4) & 1) != 0 { - decode_4x4_block_dc(br, cb, false, u_coeffs, 4, q_c_dc, q_c_ac)?; - } - if ((ccbp >> 5) & 1) != 0 { - decode_4x4_block_dc(br, cb, false, v_coeffs, 4, q_c_dc, q_c_ac)?; - } - Ok(()) -} - -pub fn rv6_decode_cu_16x16(br: &mut BitReader, cbs: &RV60Codebooks, is_intra: bool, qp: u8, sel_qp: u8, y_coeffs: &mut [i16; 16 * 16], u_coeffs: &mut [i16; 8 * 8], v_coeffs: &mut [i16; 8 * 8], ccbp: u32) -> DecoderResult<()> { - let cb_set = RV60Codebooks::get_c4x4_set(sel_qp, is_intra); - let cb = if is_intra { &cbs.intra_coeff_cb[cb_set] } else { &cbs.inter_coeff_cb[cb_set] }; - let q_y = RV60_QUANTS_B[qp as usize]; - let q_c_dc = RV60_QUANTS_B[RV60_CHROMA_QUANT_DC[qp as usize] as usize]; - let q_c_ac = RV60_QUANTS_B[RV60_CHROMA_QUANT[qp as usize] as usize]; - for i in 0..16 { - if ((ccbp >> i) & 1) != 0 { - let off = (i & 3) * 4 + (i >> 2) * 4 * 16; - decode_4x4_block(br, cb, true, &mut y_coeffs[off..], 16, q_y)?; - } - } - for i in 16..20 { - if ((ccbp >> i) & 1) != 0 { - let off = (i & 1) * 4 + (i & 2) * 2 * 8; - if i == 16 { - decode_4x4_block_dc(br, cb, false, &mut u_coeffs[off..], 8, q_c_dc, q_c_ac)?; - } else { - decode_4x4_block(br, cb, false, &mut u_coeffs[off..], 8, q_c_ac)?; - } - } - } - for i in 20..24 { - if ((ccbp >> i) & 1) != 0 { - let off = (i & 1) * 4 + (i & 2) * 2 * 8; - if i == 20 { - decode_4x4_block_dc(br, cb, false, &mut v_coeffs[off..], 8, q_c_dc, q_c_ac)?; - } else { - decode_4x4_block(br, cb, false, &mut v_coeffs[off..], 8, q_c_ac)?; - } - } - } - Ok(()) -} - -pub fn rv6_decode_cu_4x4in16x16(br: &mut BitReader, cbs: &RV60Codebooks, is_intra: bool, qp: u8, sel_qp: u8, y_coeffs: &mut [i16; 16 * 16], u_coeffs: &mut [i16; 8 * 8], v_coeffs: &mut [i16; 8 * 8], ccbp: u32) -> DecoderResult<()> { - let cb_set = RV60Codebooks::get_c4x4_set(sel_qp, is_intra); - let cb = if is_intra { &cbs.intra_coeff_cb[cb_set] } else { &cbs.inter_coeff_cb[cb_set] }; - let q_y = RV60_QUANTS_B[qp as usize]; - let q_c_dc = RV60_QUANTS_B[RV60_CHROMA_QUANT_DC[qp as usize] as usize]; - let q_c_ac = RV60_QUANTS_B[RV60_CHROMA_QUANT[qp as usize] as usize]; - for i in 0..16 { - if ((ccbp >> i) & 1) != 0 { - let off = i * 16; - decode_4x4_block(br, cb, true, &mut y_coeffs[off..], 4, q_y)?; - } - } - for i in 16..20 { - if ((ccbp >> i) & 1) != 0 { - let off = (i - 16) * 16; - decode_4x4_block_dc(br, cb, false, &mut u_coeffs[off..], 4, q_c_dc, q_c_ac)?; - } - } - for i in 20..24 { - if ((ccbp >> i) & 1) != 0 { - let off = (i - 20) * 16; - decode_4x4_block_dc(br, cb, false, &mut v_coeffs[off..], 4, q_c_dc, q_c_ac)?; - } - } - Ok(()) -} - -const RV60_QP_TO_IDX: [usize; 64] = [ - 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 6, 6, 6, 6, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 0, 0 -]; -const RV60_QUANTS_B: [i16; 32] = [ - 60, 67, 76, 85, 96, 108, 121, 136, - 152, 171, 192, 216, 242, 272, 305, 341, - 383, 432, 481, 544, 606, 683, 767, 854, - 963, 1074, 1212, 1392, 1566, 1708, 1978, 2211 -]; -const RV60_CHROMA_QUANT_DC: [u8; 32] = [ - 0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, - 14, 15, 15, 16, 17, 18, 18, 19, 20, 20, 21, 21, 22, 22, 23, 23 -]; -const RV60_CHROMA_QUANT: [u8; 32] = [ - 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, - 16, 17, 17, 18, 19, 20, 20, 21, 22, 22, 23, 23, 24, 24, 25, 25 -]; - -const RV60_DSC_TO_LX: [u32; NUM_COEFF_ENTRIES] = [ - 0x00000000, 0x01000000, 0x02000000, 0x00010000, 0x01010000, 0x02010000, 0x00020000, 0x01020000, 0x02020000, - 0x00000100, 0x01000100, 0x02000100, 0x00010100, 0x01010100, 0x02010100, 0x00020100, 0x01020100, 0x02020100, - 0x00000200, 0x01000200, 0x02000200, 0x00010200, 0x01010200, 0x02010200, 0x00020200, 0x01020200, 0x02020200, - - 0x00000001, 0x01000001, 0x02000001, 0x00010001, 0x01010001, 0x02010001, 0x00020001, 0x01020001, 0x02020001, - 0x00000101, 0x01000101, 0x02000101, 0x00010101, 0x01010101, 0x02010101, 0x00020101, 0x01020101, 0x02020101, - 0x00000201, 0x01000201, 0x02000201, 0x00010201, 0x01010201, 0x02010201, 0x00020201, 0x01020201, 0x02020201, - - 0x00000002, 0x01000002, 0x02000002, 0x00010002, 0x01010002, 0x02010002, 0x00020002, 0x01020002, 0x02020002, - 0x00000102, 0x01000102, 0x02000102, 0x00010102, 0x01010102, 0x02010102, 0x00020102, 0x01020102, 0x02020102, - 0x00000202, 0x01000202, 0x02000202, 0x00010202, 0x01010202, 0x02010202, 0x00020202, 0x01020202, 0x02020202, - - 0x00000003, 0x01000003, 0x02000003, 0x00010003, 0x01010003, 0x02010003, 0x00020003, 0x01020003, 0x02020003, - 0x00000103, 0x01000103, 0x02000103, 0x00010103, 0x01010103, 0x02010103, 0x00020103, 0x01020103, 0x02020103, - 0x00000203, 0x01000203, 0x02000203, 0x00010203, 0x01010203, 0x02010203, 0x00020203, 0x01020203, 0x02020203 -]; - -const RV60_CBP8_TABS: [[[u32; 8]; 4]; NUM_INTER_SETS] = [ - [ - [ 0x66666675, 0x66656553, 0x77767675, 0x77656552, 0x88878786, 0x88767663, 0x88868674, 0x87646441 ], - [ 0x6383B594, 0xD8B7B6A2, 0x84A5B5A3, 0xD8C7B6A2, 0x94B5D5C5, 0xEAE9E8C4, 0xA4D4C4B3, 0xE9D7D6B2 ], - [ 0x45555565, 0x56555552, 0x66666675, 0x67656552, 0x88888897, 0x88878774, 0x88978786, 0x88867661 ], - [ 0x73639483, 0xB796A683, 0x849495A4, 0xD8C7B692, 0xA5B5C6C5, 0xEAD8D9C4, 0xA5B5B5C4, 0xE9D8D7B1 ], - ], [ - [ 0x66666675, 0x66656553, 0x77767675, 0x77656552, 0x88878786, 0x88767663, 0x88868674, 0x87646441 ], - [ 0x6383B594, 0xD8B7B6A2, 0x84A5B5A3, 0xD8C7B6A2, 0x94B5D5C5, 0xEAE9E8C4, 0xA4D4C4B3, 0xE9D7D6B2 ], - [ 0x45555565, 0x56555552, 0x66666675, 0x67656552, 0x88888897, 0x88878774, 0x88978786, 0x88867661 ], - [ 0x73639483, 0xB796A683, 0x849495A4, 0xD8C7B692, 0xA5B5C6C5, 0xEAD8D9C4, 0xA5B5B5C4, 0xE9D8D7B1 ], - ], [ - [ 0x45555565, 0x56545543, 0x66666675, 0x67656553, 0x77777786, 0x78767664, 0x77867675, 0x87656551 ], - [ 0x41848493, 0x86959582, 0x73A584A4, 0xA7B7A7A4, 0x84C6C6D6, 0xD9D8D8C5, 0x94D5B4D4, 0xD9D8D7D4 ], - [ 0x34544554, 0x45444442, 0x66766675, 0x67656552, 0x88988897, 0x89877774, 0x99989896, 0x99868663 ], - [ 0x52637373, 0x86857562, 0x84958494, 0xB8A79582, 0x94B6B6B6, 0xDAC8C8A4, 0x95B6A6C5, 0xDAC8C7A3 ], - ], [ - [ 0x34445565, 0x45445443, 0x66667675, 0x77656553, 0x77777786, 0x78667664, 0x77867685, 0x88656552 ], - [ 0x218383A4, 0x8696A694, 0x63B594C5, 0xC8D8C8D5, 0x63C5B5D6, 0xD9D9D9E7, 0x83C5B5E5, 0xD9E8E8D5 ], - [ 0x24444454, 0x45443442, 0x66766675, 0x67666653, 0x78878787, 0x88777775, 0x99988797, 0x99877774 ], - [ 0x41636373, 0x85757462, 0x73958595, 0xB8A79684, 0x84A6A6B6, 0xD9B8C8A5, 0x95B6A6B6, 0xDAC8C8B5 ], - ], [ - [ 0x34444455, 0x45444443, 0x66666675, 0x67656653, 0x67777786, 0x78667664, 0x77767685, 0x87656553 ], - [ 0x208494C5, 0xA8B7E9D7, 0x63C5B5E6, 0xEAEAEAE7, 0x63C6C6E7, 0xEBEAEBE8, 0x84D5C6E6, 0xEBEAEAE6 ], - [ 0x23333454, 0x35443443, 0x67766676, 0x67666665, 0x77777787, 0x78777775, 0x99988898, 0x99888886 ], - [ 0x40636374, 0x96757563, 0x749596A6, 0xB9A8A896, 0x84A6A6A7, 0xCAB8B9A7, 0x86A7B7C7, 0xDBC9DAB7 ], - ], [ - [ 0x24444455, 0x35444443, 0x56666676, 0x67666664, 0x67777787, 0x78667665, 0x77767685, 0x78667663 ], - [ 0x109495E7, 0xDAD9EAE8, 0x63C6C6E7, 0xECEBEBE9, 0x64C7C7E9, 0xEDEBECE9, 0x84D6D7E7, 0xECEBEBE8 ], - [ 0x13343454, 0x35443444, 0x67776787, 0x68777776, 0x67777787, 0x79787886, 0x899988A8, 0x9A998997 ], - [ 0x30535374, 0x87767665, 0x738586A7, 0xB9A9A9A7, 0x749697A8, 0xCAA9B9A8, 0x85A7B8C8, 0xDCCADAC8 ], - ], [ - [ 0x13343455, 0x35454544, 0x56666777, 0x67676776, 0x67777787, 0x78777776, 0x77777787, 0x78777776 ], - [ 0x018485D7, 0xDADADAD9, 0x53B6C7D9, 0xDDDCDCDB, 0x54C7C8DA, 0xDDDCDDDB, 0x64D7D8DA, 0xDDDDDDDB ], - [ 0x03353456, 0x35464666, 0x67887899, 0x798A8999, 0x68898899, 0x8A9A9999, 0x8AAA9ABB, 0xABABABBA ], - [ 0x10536487, 0x98879887, 0x74A7A8CA, 0xDCCBDBDA, 0x74A7B8CA, 0xDCDBCCCB, 0x85B8C9DB, 0xDDDCDDDB ] - ] -]; - -const RV60_CBP16_TABS: [[[u32; 8]; 12]; NUM_INTER_SETS] = [ - [ - [ 0x8563A594, 0xA795B7A4, 0x9584B5A4, 0xB8A6C7A3, 0x9674B6A4, 0xB8A6D8B2, 0xA594C4C3, 0xD8C6C6B1 ], - [ 0x02525474, 0x87978695, 0x56858797, 0xAAA9A796, 0x56A6A9DA, 0xEEEDECFB, 0x98B7B9D8, 0xFDDAEAC8 ], - [ 0x02545475, 0x67867674, 0x55978696, 0xA9B8A784, 0x459897B9, 0xBBDBCAD9, 0x87B8A6C7, 0xCBDAD8C5 ], - [ 0x03553364, 0x66876474, 0x67988585, 0xA8978474, 0x6BCCCACB, 0xCCCCCCCA, 0xBBCBCAB9, 0xCBB9B997 ], - [ 0x35555565, 0x55555553, 0x56666665, 0x66656552, 0x78888887, 0x88878774, 0x78878786, 0x88767661 ], - [ 0x35555565, 0x46555553, 0x56666675, 0x67656552, 0x78888887, 0x88878774, 0x78878786, 0x88767661 ], - [ 0x35555565, 0x55555553, 0x56666665, 0x66656552, 0x78888887, 0x88878774, 0x78878786, 0x88767661 ], - [ 0x35555565, 0x55555553, 0x56666665, 0x66656552, 0x78888887, 0x88878774, 0x78878786, 0x88767661 ], - [ 0x85639684, 0x9685A672, 0x96859594, 0xB795A582, 0xA786C7B6, 0xC9B7C8A3, 0xA796B5A3, 0xC7B6B591 ], - [ 0x12534363, 0x66867473, 0x45766575, 0x98A89694, 0x65A786A7, 0xCBDBC9C6, 0x87A897B6, 0xCBD9B8C4 ], - [ 0x12435464, 0x66757673, 0x44657585, 0x87979783, 0x558697A7, 0xA9A8B9A6, 0x879796A6, 0xB9B8B8A4 ], - [ 0x02454464, 0x66867484, 0x579986A5, 0xA9B8A5A4, 0x79BAA9C9, 0xDCDBDAD7, 0xABDCCAD8, 0xDDDBD9C5 ], - ], [ - [ 0x8563A594, 0xA795B7A4, 0x9584B5A4, 0xB8A6C7A3, 0x9674B6A4, 0xB8A6D8B2, 0xA594C4C3, 0xD8C6C6B1 ], - [ 0x02525474, 0x87978695, 0x56858797, 0xAAA9A796, 0x56A6A9DA, 0xEEEDECFB, 0x98B7B9D8, 0xFDDAEAC8 ], - [ 0x02545475, 0x67867674, 0x55978696, 0xA9B8A784, 0x459897B9, 0xBBDBCAD9, 0x87B8A6C7, 0xCBDAD8C5 ], - [ 0x03553364, 0x66876474, 0x67988585, 0xA8978474, 0x6BCCCACB, 0xCCCCCCCA, 0xBBCBCAB9, 0xCBB9B997 ], - [ 0x35555565, 0x55555553, 0x56666665, 0x66656552, 0x78888887, 0x88878774, 0x78878786, 0x88767661 ], - [ 0x35555565, 0x46555553, 0x56666675, 0x67656552, 0x78888887, 0x88878774, 0x78878786, 0x88767661 ], - [ 0x35555565, 0x55555553, 0x56666665, 0x66656552, 0x78888887, 0x88878774, 0x78878786, 0x88767661 ], - [ 0x35555565, 0x55555553, 0x56666665, 0x66656552, 0x78888887, 0x88878774, 0x78878786, 0x88767661 ], - [ 0x85639684, 0x9685A672, 0x96859594, 0xB795A582, 0xA786C7B6, 0xC9B7C8A3, 0xA796B5A3, 0xC7B6B591 ], - [ 0x12534363, 0x66867473, 0x45766575, 0x98A89694, 0x65A786A7, 0xCBDBC9C6, 0x87A897B6, 0xCBD9B8C4 ], - [ 0x12435464, 0x66757673, 0x44657585, 0x87979783, 0x558697A7, 0xA9A8B9A6, 0x879796A6, 0xB9B8B8A4 ], - [ 0x02454464, 0x66867484, 0x579986A5, 0xA9B8A5A4, 0x79BAA9C9, 0xDCDBDAD7, 0xABDCCAD8, 0xDDDBD9C5 ], - ], [ - [ 0x63638493, 0x8696A6B4, 0x63847493, 0x87A696A4, 0x749595B4, 0xB8D7B7C4, 0x84A494A2, 0xA7B6A6D3 ], - [ 0x02333455, 0x57677776, 0x56767797, 0x899A99A9, 0x78B8BADA, 0xDDDDDCDC, 0x98C8D9D9, 0xDDDCDCD9 ], - [ 0x02444466, 0x56666666, 0x55776575, 0x77877575, 0x67AAA9DB, 0xCDDBDCDA, 0x98CAA7C8, 0xDCDBC9D8 ], - [ 0x02452366, 0x56896698, 0x46786689, 0x789A88B9, 0xACCCCCCC, 0xCCCCCCCC, 0xCCCCCCCC, 0xCCCCCDDC ], - [ 0x23443454, 0x45444443, 0x56666675, 0x67666663, 0x78878897, 0x89878775, 0x89979796, 0x99878773 ], - [ 0x24344454, 0x35444443, 0x56666676, 0x67656663, 0x78888897, 0x89878775, 0x89979896, 0x99868773 ], - [ 0x23443454, 0x45444443, 0x56666676, 0x67666663, 0x68888897, 0x89877775, 0x88988896, 0x99877673 ], - [ 0x24344455, 0x35444443, 0x56666676, 0x67666653, 0x68888897, 0x89878774, 0x89989897, 0x99877763 ], - [ 0x63537473, 0x85748562, 0x73848484, 0x96959683, 0x8596A5A4, 0xC8A7B794, 0x85A595A4, 0xC7B6B6A3 ], - [ 0x02443374, 0x77867684, 0x568776A7, 0xA9BAA8B6, 0x78C9A8C9, 0xDDECDAD7, 0x99B8B9C8, 0xEDEAEAD6 ], - [ 0x02445565, 0x56656664, 0x55878686, 0x98978674, 0x67A9A8C9, 0xABAACAB7, 0x87B9A7B8, 0xDBDAC9B6 ], - [ 0x02553264, 0x66877585, 0x67997697, 0x98B997A6, 0x9ACBA9DA, 0xDDDCDBC8, 0xCCDCDADA, 0xDCDCDAD8 ], - ], [ - [ 0x626383A3, 0x97A6C6C4, 0x538484B4, 0xA8C7C7E5, 0x74A4B5D5, 0xD9E8E8E5, 0x73B3B3E3, 0xC8E7E7E4 ], - [ 0x02324464, 0x78778786, 0x569697C8, 0xBCCCCCCA, 0x88B8BACB, 0xCCCCCCCB, 0xA8B8CAC9, 0xCCCCCCCA ], - [ 0x02444466, 0x46666767, 0x35775588, 0x78A988A8, 0x68CBB8CB, 0xCDCBDDDB, 0x98CAB8CA, 0xCCCCCBCA ], - [ 0x02452366, 0x56987697, 0x38AA79AB, 0x9ABBBBBA, 0xBBBBBBBB, 0xBBBBBBBB, 0xBBBBBBBB, 0xBBBBBBBB ], - [ 0x13343454, 0x45444553, 0x56666676, 0x67766675, 0x68878897, 0x89888885, 0x89989897, 0x99888885 ], - [ 0x13344454, 0x35444543, 0x56667786, 0x78766765, 0x68888898, 0x89878875, 0x89989898, 0x99878885 ], - [ 0x13343454, 0x35454453, 0x56766786, 0x78776675, 0x68888898, 0x89888786, 0x899898A8, 0x9A988785 ], - [ 0x14343455, 0x35444543, 0x56676777, 0x67776764, 0x68888898, 0x89878875, 0x89989898, 0x99888875 ], - [ 0x51536373, 0x85758573, 0x63848495, 0xA796A694, 0x749595A5, 0xB8B7B8A5, 0x85A695A5, 0xB9B7B8A5 ], - [ 0x02433454, 0x67867674, 0x569787A7, 0xBBC9C9B7, 0x78B8A9C8, 0xDDDADBC8, 0x99A8BAC8, 0xDDDADBC7 ], - [ 0x02444465, 0x56556664, 0x55876686, 0x88988786, 0x68AAA8BA, 0xABBACAB8, 0x87BA98C9, 0xCCCBCAB8 ], - [ 0x02452364, 0x66877585, 0x57AA88B9, 0xA9CABAB8, 0x8ABAA9CA, 0xCCBBBBB9, 0xBBBBBBBB, 0xBBBBBBB9 ], - ], [ - [ 0x716383B3, 0xB8D7D7E4, 0x6394A4D4, 0xC9E8E8E5, 0x73B5B5E5, 0xEAE9E9E6, 0x83C4C4E4, 0xE9E8E7E4 ], - [ 0x01334575, 0x99A8A9B7, 0x66A7B8C8, 0xCCCCCCC8, 0x77B8CAC9, 0xCCCCCCCB, 0x98C8C9C9, 0xCCCCCBCA ], - [ 0x01444486, 0x57777897, 0x55A876B8, 0xCACAB9C8, 0x67CAC8CA, 0xCCCACBCA, 0x98CAC8C9, 0xCCCCCBCA ], - [ 0x01562486, 0x799998A8, 0x6AAA9999, 0x99999999, 0x99999999, 0x99999999, 0x9999999A, 0xAAAAAAA9 ], - [ 0x13343454, 0x35444443, 0x56767787, 0x78777776, 0x67877797, 0x79888886, 0x899898A8, 0x9A999997 ], - [ 0x13333454, 0x35444543, 0x57777787, 0x78777776, 0x67778898, 0x89888886, 0x899999A9, 0x9A989997 ], - [ 0x13343454, 0x35453443, 0x57777787, 0x78777776, 0x67887798, 0x89888886, 0x899998A9, 0x9A999997 ], - [ 0x13343454, 0x35443543, 0x57777787, 0x78777776, 0x68887898, 0x79888876, 0x899999A9, 0x9A999987 ], - [ 0x60636384, 0x86859684, 0x63858596, 0xA8A7A8A6, 0x749696A6, 0xB9A8B9A6, 0x85A6A7B7, 0xC9B8C9B7 ], - [ 0x02333454, 0x77768775, 0x678798A7, 0xCBB9CAB7, 0x6897A9B8, 0xDDC9DBB8, 0x89A8BAD8, 0xDDDADBC8 ], - [ 0x02344465, 0x56556664, 0x558777A8, 0x99A9A9A8, 0x679A98CA, 0xABBBBAB9, 0x78BA98CB, 0xCCCCCBCA ], - [ 0x01453366, 0x67777676, 0x79BBBABB, 0xBBBBBBB9, 0x8ABBABBB, 0xBBBBBBBA, 0xBBBBBBBB, 0xBBBBBBBB ], - ], [ - [ 0x816383C4, 0xB9D8D8E5, 0x62A4B4E5, 0xEAE9E9E6, 0x63B5B5E6, 0xEAEAEAE7, 0x82C4C4E5, 0xEAE9E9E5 ], - [ 0x01335485, 0x9AB9A8B7, 0x7697B8B8, 0xBBBBBBB9, 0x67B8BABB, 0xBBBBBBBB, 0x98B7BABA, 0xBBBBBBBB ], - [ 0x01445396, 0x78879AA6, 0x559897A9, 0xAAA9AAA9, 0x67A9A9AA, 0xAA9AAAAA, 0x97A9A8AA, 0xAAAAAAAA ], - [ 0x02643476, 0x76777776, 0x67777777, 0x77777777, 0x77777777, 0x77777777, 0x77777777, 0x77777777 ], - [ 0x03343455, 0x46564665, 0x57777898, 0x79898888, 0x688888A8, 0x89999998, 0x899999B9, 0xABAAAAA9 ], - [ 0x03344555, 0x36454655, 0x67788898, 0x79888998, 0x68888999, 0x8A899998, 0x899AAABA, 0xABAAAAA9 ], - [ 0x03443465, 0x36564555, 0x57887898, 0x79898898, 0x688988A9, 0x8A998998, 0x89AA99BA, 0xABAAAAA9 ], - [ 0x03344556, 0x36454655, 0x57787899, 0x79898988, 0x68898999, 0x8A898998, 0x8AAAAABA, 0x9BABABA9 ], - [ 0x50536374, 0x86859685, 0x53858596, 0xA8A8B8A6, 0x648696A7, 0xB9A8B9B7, 0x759797B7, 0xB9B9CAC8 ], - [ 0x02324465, 0x78768886, 0x668698A8, 0xBBB9CBB9, 0x6797A9B9, 0xCCB9CCB9, 0x7897BBC9, 0xCCCACCCA ], - [ 0x02354366, 0x46666665, 0x458987BA, 0x9AAABAA9, 0x58AB99CA, 0xACBBBABA, 0x78BCA9CB, 0xCCCCCBCB ], - [ 0x01453466, 0x66766675, 0x79AAA9AA, 0xAAAAAAAA, 0x7AAAAAAA, 0xAAAAAAAA, 0xAAAAAAAA, 0xAAAAAAAA ], - ], [ - [ 0x807473D6, 0xC9C9E9E7, 0x52B6A5E7, 0xDBEAEAE8, 0x53B6B6E8, 0xEBEAEBE9, 0x63C5B5E7, 0xEBEAEAE7 ], - [ 0x01435495, 0x99999999, 0x66989999, 0x99999999, 0x57989999, 0x99999999, 0x97979999, 0x999999AA ], - [ 0x01445487, 0x77778787, 0x55888888, 0x88999999, 0x57999999, 0x99999999, 0x77999999, 0x99999999 ], - [ 0x03675677, 0x76666666, 0x66666666, 0x66666666, 0x66666666, 0x66666666, 0x66777777, 0x77666677 ], - [ 0x02343566, 0x36575777, 0x588988AA, 0x8A9A9AAA, 0x588989BA, 0x8A9BAABA, 0x7AA9AABB, 0xACBCBCCB ], - [ 0x03343556, 0x36464666, 0x577888A9, 0x8A8A9AAA, 0x588989AA, 0x8A9A9BBA, 0x7A9AAACB, 0xABABBCBA ], - [ 0x03343466, 0x36564666, 0x578978A9, 0x7A9A8AA9, 0x578979AA, 0x8A9B99AA, 0x79AA9ABB, 0x9BABAABA ], - [ 0x03343556, 0x36464666, 0x588979AA, 0x7B8A8A9A, 0x588989AA, 0x8A9A9AAA, 0x7AAB9ABB, 0x9BABABBA ], - [ 0x50535385, 0x879797A7, 0x438686A8, 0xA9B9BAD9, 0x438686B8, 0xB9CACBDA, 0x649797C9, 0xBACADBDA ], - [ 0x01334677, 0x78778887, 0x5797AAAB, 0xBBBBBBBB, 0x6898BBBB, 0xBBBAAAAA, 0x8AA9AAAA, 0xAAAAAAAA ], - [ 0x01464488, 0x46566677, 0x57AAAAAA, 0xAAAAAAAA, 0x5AAAAAAA, 0xAAAAAAAA, 0x8AAAAAAA, 0xAAAAAAAA ], - [ 0x02453466, 0x67777777, 0x77777777, 0x77777777, 0x77777777, 0x77777777, 0x77777777, 0x77777788 ], - ] -]; - -struct CoeffsCBDesc { - l0_tab: [[u32; 108]; 2], - l12_tab: [[u32; 14]; 2], - l3_tab: [[u32; 14]; 2], - esc_tab: [u32; 4], -} -const RV60_INTRA_COEFFS_CB_DESC: [CoeffsCBDesc; NUM_INTRA_SETS] = [ - CoeffsCBDesc { - l0_tab: [ - [ - 0xF6464655, 0x68677866, 0x9C9BAB99, 0x58576766, 0x8A788977, 0xBDBCCCA9, 0x8B8A9A88, 0xBD9ABB98, - 0xBEBCCDA9, 0x58676766, 0x7A888877, 0xBDBCBCA9, 0x79788876, 0x9B999987, 0xDECCCCA9, 0xACAABB98, - 0xCEABCCA9, 0xEECCDEB9, 0x8B9A8A88, 0xBDBBAB98, 0xBEBDBCA9, 0xADABAB98, 0xCEBCBBA9, 0xEEDDCDB9, - 0xBEBCBCA9, 0xDECCCDA9, 0xDECDDDA8, 0x47566766, 0x79788877, 0xBDABBCA9, 0x59677876, 0x8A899987, - 0xCEBCCCA9, 0x9C9AAB98, 0xBDAABC98, 0xDEBCDDB9, 0x69787876, 0x8A898987, 0xCECCCCA9, 0x7A898977, - 0x9B9A9A87, 0xDECCCDBA, 0xADAABB98, 0xBEABBC98, 0xEECCDEB9, 0x9CAB9A98, 0xBDBCAB99, 0xDECDCCB9, - 0xADBBAB98, 0xBEBCBBA9, 0xEEDDCCA9, 0xCEBCCCA9, 0xDECCCCA9, 0xEECCCD98, 0x69798987, 0x9B9AAA98, - 0xBEBDCDBA, 0x8B899A88, 0xACAAAB98, 0xEEDDDDCA, 0xAD9BAB98, 0xCEBBCCA9, 0xDECDDEB9, 0x8B899A88, - 0xACAAAB98, 0xEEDDDDCA, 0x9B9A9A98, 0xADABABA9, 0xEEDDDEBA, 0xBEABBCA9, 0xCEBCCCA9, 0xEECDEEB9, - 0xADABAB99, 0xCECCBCA9, 0xDEDECDBA, 0xBEBCACA9, 0xCECCBCA9, 0xEEDECDB9, 0xCEBCCCA9, 0xDECCCDA9, - 0xEECCCD98, 0x9C9AAA98, 0xBDBBBB98, 0xEEDDDDB9, 0x9C9A9A98, 0xBDBBBB98, 0xEEDDDDB9, 0xADAAAB97, - 0xCEABBB98, 0xEECCCD97, 0x9C9AAB98, 0xBDABBB98, 0xEEDDDDB9, 0x9C9AAB98, 0xBEABBB98, 0xEEDDDDB9, - 0xADAAAB97, 0xBEABBB97, 0xEEBBCC97, 0xADABAB98, 0xCEBBBB98, 0xEECDCC98, 0xADABAB98, 0xBEBBAB98, - 0xEECCBC97, 0xBDAAAB87, 0xAD9AAB86, 0xCE9A9A75 - ], [ - 0xF6374878, 0x59798B9A, 0xDEDDEEDC, 0x49597A89, 0x8B8AACAA, 0xEEDEEEDD, 0x9D9BBDAB, 0xBEACDEBC, - 0xEEDEEEDD, 0x49796A89, 0x8B9A9CAA, 0xEEDEEEDD, 0x7B8A9B9A, 0x9DABADAB, 0xEEDEEEDD, 0xBEACCEBC, - 0xCEBDDECC, 0xEEEEEEDD, 0x9DBC9CAB, 0xBECDBDBC, 0xEEEEEEDD, 0xBEBDBDBC, 0xCECDBECC, 0xEEEEEEDD, - 0xDEDEDECC, 0xEEDEDECD, 0xEEEEEEDC, 0x17485979, 0x6A798B9A, 0xEEDDDECC, 0x49697A89, 0x8B8AACAA, - 0xEEDDEEDD, 0x9D8BBDAB, 0xBEACCEBC, 0xEEDEEEDD, 0x49797A89, 0x8C9B9CAA, 0xEEDEEEDD, 0x6B8A9B9A, - 0x9D9BACAB, 0xEEDEEEDD, 0xAEACCEBB, 0xCEBDDEBC, 0xEEDEEEDD, 0x9DBC9CAB, 0xBECDBDBC, 0xEEEEDEDD, - 0xAEBCBDBB, 0xCECDBDBC, 0xEEEEDEDD, 0xDEDEDECC, 0xDEDEDECC, 0xEEEEEECC, 0x39697A89, 0x8B9B9CAA, - 0xEEDEEEDD, 0x6B7A9B9A, 0x9C9BBDAB, 0xEEEEEEDD, 0x9E9CBEBB, 0xBEBCDECC, 0xEEEEEEDD, 0x6B8A8B9A, - 0x9DABACAB, 0xEEEEEEDD, 0x7C9B9CAB, 0x9DACBDBB, 0xEEEEEEDD, 0xAEACCEBC, 0xBEBDDECC, 0xEEDEEEDD, - 0x9EBC9DBB, 0xBECDBDBC, 0xEEEEEEDD, 0xAEBDBDBC, 0xBECEBECC, 0xEEEEDEDD, 0xDEDEDECC, 0xDEDEDECC, - 0xEEDEDECC, 0x6A7A8B99, 0x9C9BACAA, 0xEEDDDECC, 0x7B8A9B9A, 0x9DABACAB, 0xEEDDDECC, 0x9D9BAC9A, - 0xBEACBDAB, 0xEEDDDEBB, 0x7B8A8B9A, 0x9DABACAB, 0xEEDDDECC, 0x7C9B9C9A, 0x9DABADAB, 0xEEDEDECC, - 0x9D9BADAA, 0xAEACBDAA, 0xEECDDEBB, 0x8D9B9C9A, 0xBEBCACAA, 0xEEDECDBB, 0x9DAC9C9A, 0xAEBCACAA, - 0xDEDECDBB, 0xAEACAC99, 0xAEACAC99, 0xCEABAB98 - ]], - l12_tab: [ - [ - 0xF3624857, 0x82484587, 0x89578689, 0x89924735, 0x86794585, 0x69789679, 0x78989957, 0x867A7896, - 0x7A78A89A, 0x79989A99, 0x97897897, 0x8878A789, 0x78888988, 0x87760000 - ], [ - 0xF3915968, 0xB25957A8, 0x9B78B89C, 0xBBC15936, 0xA79B46A5, 0x7A89C79B, 0x9ACBBC57, 0xB68B8AC6, - 0x8B79C9AC, 0x9ACAACBB, 0xC79B89C9, 0xAB8AC8AC, 0x9AB9ACAA, 0xCAAB0000 - ]], - l3_tab: [ - [ - 0xF3524747, 0x83574687, 0x8A588789, 0x89914735, 0x86894685, 0x6988A789, 0x89A9AA47, 0x868A79A6, - 0x8A78A9AB, 0x7AA9AB9A, 0xA79A89A9, 0x9A89A99A, 0x99A9AA9A, 0xA9980000 - ], [ - 0xF4B16C7A, 0xE37C68CA, 0xBE9BEABE, 0xCCE06B37, 0xC8BE58C7, 0x9CABEABE, 0xACECDD68, 0xC79DACE8, - 0xAD9ADBCE, 0xBCEBCEDD, 0xEAACABDC, 0xDEBBDBCD, 0xCDECDECD, 0xEDDD0000 - ]], - esc_tab: [ 0x01334555, 0x66777788, 0x88999AAA, 0x999BCEED ], - }, - CoeffsCBDesc { - l0_tab: [ - [ - 0xF5364655, 0x58687877, 0xBECDCDBA, 0x48576766, 0x7A798988, 0xDECDDDBB, 0x9C8AAB99, 0xBE9BBCA9, - 0xEECCDEBA, 0x48676766, 0x7A898978, 0xDECDCDBA, 0x6A797977, 0x8B9A9A88, 0xEECDCDBA, 0xADABBCA9, - 0xBEACCDAA, 0xEECDDEBA, 0x9CAB8A99, 0xBDBC9BA9, 0xDEDECCBA, 0xBDBCAB99, 0xBEBDACAA, 0xEEDECDB9, - 0xCECDCDA9, 0xDECDCDA9, 0xEECDCDA8, 0x37575766, 0x79798977, 0xDECDCDBA, 0x59687877, 0x8B8A9A88, - 0xEECDDDBA, 0x9C9AAC99, 0xBEABBCA9, 0xEECDDEBA, 0x59786877, 0x8B8A8A88, 0xEEDDCDBA, 0x7A898988, - 0x9B9A9A99, 0xEECDCDBA, 0xADABBC99, 0xBEABBDA9, 0xEEBDDEA9, 0x9DAB9A99, 0xBEBCABA9, 0xEEDECCBA, - 0xADBCABA9, 0xBEBCACA9, 0xEEDEBCA9, 0xCECDCDA9, 0xDEBDBDA9, 0xEECDCD98, 0x6A798A88, 0x9C9BAB99, - 0xEEDEDECB, 0x7B8A8A99, 0xACABABA9, 0xEEDEEECB, 0xAD9BBCA9, 0xBEACCDAA, 0xEECDEEBA, 0x8B9A8A99, - 0xADABABA9, 0xEEEEDECB, 0x8C9B9B99, 0xADACACAA, 0xEEDEDECB, 0xBEACBCAA, 0xBEACCDAA, 0xEECDDEBA, - 0xAEBCABA9, 0xBECDACAA, 0xEEEECDBA, 0xBEBDACAA, 0xBECDACAA, 0xEEDECDBA, 0xCECDCDA9, 0xCEBDBDA9, - 0xEEBCCD98, 0x9C9A9B99, 0xBEBCBCA9, 0xEEDDDEBA, 0x9C9B9B99, 0xBEABACA9, 0xEEDDDDBA, 0xAD9BAB98, - 0xBEABAC98, 0xEECCCD98, 0x9D9B9B99, 0xBEACBCA9, 0xEEDDDDBA, 0x9D9B9B99, 0xAEACACA9, 0xEEDDDDB9, - 0xAD9BAB98, 0xAE9BAC98, 0xDEACCD98, 0xADAB9B98, 0xBEACAB98, 0xEECDCC98, 0xAEAB9B98, 0xBEACAB98, - 0xDECCBC98, 0xAE9B9B87, 0xAE9B9B87, 0xBE8A9A75 - ], [ - 0xF7484979, 0x6A7A8BAB, 0xDEDEEEEE, 0x39598B9A, 0x8C8BADBC, 0xEEEEEEEE, 0x9E9CBEBD, 0xBEBEDECD, - 0xEEEEEEEE, 0x3A7A6A9A, 0x8C9C9CAC, 0xEEEEEEEE, 0x6B8B9CAC, 0x9DADADBC, 0xEEEEEEDE, 0xAEBECECD, - 0xCEBEDECD, 0xEEEEEEDE, 0x9EBD9DBD, 0xBECEADCD, 0xEEEEDEEE, 0xAECEBECD, 0xBEDEBECD, 0xEEEEDEDE, - 0xDEDEDECD, 0xEEDEDECD, 0xEEEEEEDD, 0x18585A8A, 0x6A8A9BAB, 0xEEEEEEDE, 0x4A6A8B9B, 0x8C9BADBC, - 0xEEEEEEEE, 0x8E8DBEBC, 0xBEADDECD, 0xEEDEEEEE, 0x4A7A6B9B, 0x8C9C9CAC, 0xEEEEEEEE, 0x6C8B9CAC, - 0x8D9DADBC, 0xEEDEEEDE, 0xAEADCECD, 0xBEBEDECD, 0xEEDEEEDE, 0x8EBD8DBC, 0xBECEADCD, 0xEEEEDEDE, - 0xAECEAEBD, 0xBECEAECD, 0xEEEEDEDD, 0xDEDEDECD, 0xDEDEDECD, 0xEEDEDECC, 0x3A6A7B9B, 0x8C9B9CBC, - 0xEEEEEEEE, 0x5B7B8CAB, 0x9DACADBC, 0xEEEEEEEE, 0x8E9DBEBC, 0xBEBEDECD, 0xEEEEEEEE, 0x5B8B7CAB, - 0x9DADADBD, 0xEEEEEEEE, 0x7C9C9DAC, 0x9DADADBD, 0xEEEEEEEE, 0xAEAECECD, 0xBEBEDECD, 0xEEDEEEDD, - 0x9EBE9DBC, 0xBECEAECD, 0xEEEEDEEE, 0xAECEAECD, 0xBECEAECD, 0xEEEEDEDD, 0xCECEDECD, 0xCEDECECD, - 0xEEDEDECC, 0x5B7B8B9B, 0x9D9CACAC, 0xEEDEDECC, 0x6C8C8C9B, 0x9DACADAC, 0xEEDEDECC, 0x8E8C9CAB, - 0xAEADBDAB, 0xEEDEDECB, 0x6C8B8C9B, 0x9DADADAC, 0xEEDEDECC, 0x7C9C9CAB, 0x9DADADAC, 0xEEDEDECC, - 0x8E9CADAB, 0x9E9CADAB, 0xDECDDEBB, 0x8D9C8C9B, 0xAEBDADAB, 0xEEDECECB, 0x8EAD9CAB, 0x9EAD9CAB, - 0xDEDEBDBB, 0x9EACAC9A, 0x9DAC9C9A, 0xBDABAB99 - ]], - l12_tab: [ - [ - 0xF3824968, 0x92494597, 0x89679789, 0x99924935, 0x96793595, 0x69789689, 0x78989857, 0xA67A78A6, - 0x7A78A889, 0x89A89999, 0x87897897, 0x78789789, 0x77878878, 0x87760000 - ], [ - 0xF4B26C7A, 0xD26C58DA, 0xBD8AEABE, 0xCDE05C37, 0xC8AD47C6, 0x8CAAD9BD, 0xABECCE58, 0xC79D9BD7, - 0xAD8ADABE, 0xACEBCECC, 0xE8AC9ACA, 0xBD9AD9BD, 0xABDACEBC, 0xDBCD0000 - ]], - l3_tab: [ - [ - 0xF3824968, 0xA24946A8, 0x9B78A89A, 0x9AA14936, 0xA78A36A5, 0x7A89A89A, 0x89A99957, 0xA68B89B6, - 0x8B78B99B, 0x89B9ABAA, 0xA79A89A8, 0x9989A89A, 0x89999999, 0x98880000 - ], [ - 0xF4B16C9B, 0xE36D58DA, 0xBE9BEABE, 0xCCE05B47, 0xD9BE47C7, 0x8CABEABE, 0xABECCE68, 0xB8ADBCE8, - 0x9D9ACCCE, 0xBCEBDEDE, 0xEAABBBCD, 0xEEBCDBCD, 0xDDECDEDD, 0xEDDE0000 - ]], - esc_tab: [ 0x02233455, 0x56667788, 0x88999AAA, 0x999BDDDD ], - }, - CoeffsCBDesc { - l0_tab: [ - [ - 0xF8484878, 0x6A7A7A89, 0xDECDCDBA, 0x4A597A89, - 0x7B8A8B99, 0xDECDCDBA, 0x8E8BAD99, 0xAE8BBD9A, - 0xDEBCCDAA, 0x4A7A5989, 0x7B8B8A99, 0xDECDCDBA, - 0x6C7B8B89, 0x8C8B8B99, 0xDECDBDBA, 0xAE9CBD9A, - 0xAE9CBD9A, 0xDEBCCDA9, 0x8EAC7B99, 0x9EBD8B9A, - 0xDECEBCAA, 0xAEAD9C99, 0xAEBD9C9A, 0xDECDBCA9, - 0xCEBDBDA9, 0xCEBDBD99, 0xEEBCBC98, 0x29595989, - 0x7B8A8A99, 0xDECDCDBA, 0x4B6A7A89, 0x7C8B8B99, - 0xDECDCDBA, 0x8E8BAC99, 0xAE8BBD9A, 0xDEBCCEA9, - 0x5B7A6A89, 0x7C9B8A99, 0xDECDCCBA, 0x6C8B8B99, - 0x8C8B8B99, 0xDECDCDBA, 0x9E9CAD99, 0xAE9BBD99, - 0xDEACCDA9, 0x8EAC7B99, 0xAEBD8B99, 0xDECEBCA9, - 0x9EAD9C99, 0xAEAD9C9A, 0xDECDACA9, 0xCEBDBD99, - 0xCEACBC99, 0xDEACBC98, 0x5C7B7B99, 0x9D9B9BAA, - 0xEEDDDDBB, 0x6C7B8B9A, 0x9D9BACAA, 0xEEDDDDBB, - 0x9E8CAC99, 0xAE9CBDAA, 0xEEBDDEAA, 0x6C8B8B9A, - 0x9D9C9CAA, 0xEEDDDDBB, 0x7D8B8C9A, 0x9D9C9CAA, - 0xEECDCDBA, 0x9E9CAD9A, 0x9E8CBDAA, 0xDEACCEA9, - 0x9EAC8B99, 0xAEBD9CAA, 0xDEDEBCAA, 0x9EAD9C9A, - 0x9EBD9CAA, 0xDECEACA9, 0xBEBDBD99, 0xAEACAC99, - 0xCEABAC88, 0x8D9C9C99, 0xAEACAC9A, 0xEEDDCDB9, - 0x8D9C8C99, 0xAEACAC99, 0xEEDDCDB9, 0x9D8B9B88, - 0xAE9CAC88, 0xDEBCCC98, 0x8E8C9C99, 0xAEACACAA, - 0xEEDDCDB9, 0x7E8C8C99, 0x9EAC9C9A, 0xEECDCDA9, - 0x8E8B9B88, 0x9E8B9C88, 0xCEABBC98, 0x9E9B8B88, - 0xAE9C9C88, 0xDECCBC98, 0x9E9B8B88, 0x9E9B8B88, - 0xDEBCAB98, 0x9E8B9B77, 0x8D8A8A77, 0x9D798965, - ], [ - 0xFA5C5BAD, 0x7CAD9DCE, 0xEEEEEEEE, 0x4D7D9EBD, - 0x8EAEBEDE, 0xEEEEEEEE, 0x9EAEDEDE, 0xCECEEEEE, - 0xEEEEEEEE, 0x3D9E7DBE, 0x8EBEAEDE, 0xEEEEEEEE, - 0x7EAEAECE, 0x9EBEBEDE, 0xEEEEEEEE, 0xBECEDEDE, - 0xCECEEEEE, 0xEEEEEEEE, 0x9EDEAEDE, 0xBEEEBEEE, - 0xEEEEEEEE, 0xBEDEBEDE, 0xCEEECEEE, 0xEEEEEEEE, - 0xEEEEEEEE, 0xEEEEEEEE, 0xEEEEEEEE, 0x0B6C6CBC, - 0x7CAD9DCE, 0xEEEEEEEE, 0x4D7D9EBD, 0x8EAEBEDE, - 0xEEEEEEEE, 0x9E9ECECE, 0xCEBEEEEE, 0xEEEEEEEE, - 0x4D9E7DBD, 0x8EBEAEDE, 0xEEEEEEEE, 0x6EAE9ECE, - 0x8EBEAECE, 0xEEEEEEEE, 0xBEBEDEDE, 0xCECEDEDE, - 0xEEEEEEEE, 0x9ECE9EDE, 0xBEEEBEEE, 0xEEEEEEEE, - 0xAEDEBEDE, 0xBEEEBEEE, 0xEEEEEEEE, 0xEEEEEEEE, - 0xEEEEEEEE, 0xEEEEEEEE, 0x3D8D7DBD, 0x8DAEAEDE, - 0xEEEEEEEE, 0x5E8E9ECD, 0x9EBEBEDE, 0xEEEEEEEE, - 0x9E9ECECE, 0xCECEEEEE, 0xEEEEEEEE, 0x5E9E8ECE, - 0x9ECEBEDE, 0xEEEEEEEE, 0x7EAEAECE, 0x9EBEBEDE, - 0xEEEEEEEE, 0xAEBEDEDE, 0xBEBEDEDE, 0xEEEEEEEE, - 0x8ECE9ECE, 0xBEEEBEDE, 0xEEEEEEEE, 0xAEDEBEDE, - 0xBEDEBEDE, 0xEEEEEEEE, 0xDEEEEEEE, 0xDEEEEEEE, - 0xEEEEEEEE, 0x5D9E8EBD, 0x9EBEAECD, 0xEEEEEEEE, - 0x6E9E9EBD, 0xAEBEBECE, 0xEEEEEEEE, 0x8E9EAEBD, - 0xBEBECECD, 0xEEEEEEDE, 0x6E9E9EBD, 0xAEBEAECE, - 0xEEEEEEEE, 0x7EAE9EBD, 0x9EBEAECD, 0xEEEEEEEE, - 0x8E9EBEBD, 0xAEAEBEBD, 0xEEDEEEDE, 0x8EAE9EBD, - 0xBECEBECD, 0xEEEEEEDE, 0x8EBE9EBD, 0xAEBEAEBD, - 0xEEEEDEDE, 0xAEBEBEAC, 0xAEBDBDBC, 0xCECDBDBC, - ]], - l12_tab: [ - [ - 0xF4925967, 0x93595697, 0x79789889, 0x88915935, 0x96794695, 0x69779789, 0x88988846, 0x95796795, - 0x7A67A779, 0x78988988, 0x86796796, 0x78689679, 0x77878878, 0x87760000 - ], [ - 0xF5D26E7A, 0xE27D68E9, 0xBE8BEACE, 0xCDD05C37, 0xD7AE48E6, 0x8D9BE9BE, 0xABEEEE48, 0xD69D9BE6, - 0x9E7AEACE, 0xACEBCEED, 0xE7AD8AEA, 0xCE8BE9BE, 0xBCEBCEBC, 0xEDCE0000 - ]], - l3_tab: [ - [ - 0xF4926968, 0xA26946A7, 0x8A78A78A, 0x89915936, 0x968A3695, 0x7978A78A, 0x78A89946, 0x957A78A5, - 0x7A68A89A, 0x89A89A99, 0x96797898, 0x99789789, 0x89989989, 0x98880000 - ], [ - 0xF3B27C9D, 0xD26D57C9, 0xBC8BD9CD, 0xBCD04B48, 0xCACD47B6, 0x8DBBD9DD, 0xABCDBD57, 0x989CDCC7, - 0xAC9BCCDD, 0xBBDBDDDD, 0xD99BDDDD, 0xDDBBCBAD, 0xDDDDDDCD, 0xDDDD0000 - ]], - esc_tab: [ 0x01244556, 0x6778999A, 0xAABBCCCC, 0xCCCEEEFF ], - }, - CoeffsCBDesc { - l0_tab: [ - [ - 0xF8494978, 0x6A7A7A89, 0xDECDCDBB, 0x4B597A89, - 0x7C7A8B99, 0xDECDCDBB, 0x8E8BAD9A, 0xAE8BBDAA, - 0xDEBCCEAA, 0x3A7A5989, 0x7B8B7A99, 0xDECDCDBB, - 0x6C8A8B89, 0x7C8B8B99, 0xDECDBDBA, 0xAE9CBD9A, - 0xAE9CBDAA, 0xEEBCCEAA, 0x8EAD8B99, 0x9EBD8B9A, - 0xDECEBCAA, 0xAEBD9C9A, 0xAEBD9CAA, 0xDECDBCAA, - 0xCEBDBDAA, 0xCEBDBDA9, 0xEEBDBDA9, 0x2A595989, - 0x7B8A8A99, 0xEECDCCBB, 0x4B6A7A89, 0x7C8B8B99, - 0xEECDCDBB, 0x8E8BAD99, 0xAE8BBD9A, 0xDEBCCEAA, - 0x4B7A6A89, 0x7C9B8B99, 0xEECDCCBB, 0x6C8B7B89, - 0x7C8B8B99, 0xDEBDCDBA, 0x9E9CAD9A, 0xAE8BBD9A, - 0xDEACCDAA, 0x8EAC7B99, 0xAEBD8B9A, 0xDECEBCAA, - 0xAEAD9C9A, 0xAEAD8C9A, 0xDECDACAA, 0xCEBDBDA9, - 0xBEBDBD99, 0xDEACBC98, 0x5C7B7B99, 0x9D9B9BAA, - 0xEEDDDDBB, 0x6C7B8B9A, 0x9D9B9CAA, 0xEEDDDEBB, - 0x9E8CAC9A, 0xAE9CBDAA, 0xEECDDEBA, 0x6D8B8B9A, - 0x9D9C9CAA, 0xEEDDDDCB, 0x7D8B8C9A, 0x8D9C9CAA, - 0xEECECEBB, 0x9E9CAD9A, 0x9E8CBDAA, 0xDEACCEAA, - 0x9EAD8C9A, 0xAEBD9CAA, 0xEEDECDBA, 0x9EBD9CAA, - 0x9EBD9C9A, 0xDECEBCAA, 0xBEBDBDA9, 0xAEACAD99, - 0xCEACAC98, 0x7E9C9C9A, 0xAEACACAA, 0xEEDDCDBA, - 0x8E9C8C9A, 0xAEACACAA, 0xEEDDDDBA, 0x9E8B9C89, - 0xBE9CAC99, 0xEECCCD99, 0x8E9C9C9A, 0xAEACACAA, - 0xEEDDDDBA, 0x7E9C8C9A, 0x9EAC9C9A, 0xEECDDDBA, - 0x8E8B9C89, 0x9E8B9C89, 0xDEABBC98, 0x9E9C8C89, - 0xAEAC9C99, 0xDECDBC98, 0x9E9C8C89, 0x9EAC8C99, - 0xDECCAC98, 0x9E9B9B77, 0x8D8A8B77, 0x9D898A76, - ], [ - 0xFA6C6CBD, 0x7CAEAEDE, 0xEEEEEEEE, 0x3D7E9ECE, - 0x8EAEBEDE, 0xEEEEEEEE, 0x9EAEDEEE, 0xCECEEEEE, - 0xEEEEEEEE, 0x3D9E7DCE, 0x8DCEAEDE, 0xEEEEEEEE, - 0x7EAEAECE, 0x9EBEBEEE, 0xEEEEEEEE, 0xBECEEEEE, - 0xDEDEEEEE, 0xEEEEEEEE, 0x9EDEAEDE, 0xCEEECEEE, - 0xEEEEEEEE, 0xBEEECEEE, 0xDEEECEEE, 0xEEEEEEEE, - 0xEEEEEEEE, 0xEEEEEEEE, 0xEEEEEEEE, 0x0B6C6CBD, - 0x7CAEADDE, 0xEEEEEEEE, 0x4E7E9ECE, 0x8EAEBEDE, - 0xEEEEEEEE, 0x9EAEDEEE, 0xCECEEEEE, 0xEEEEEEEE, - 0x4E9E7DCE, 0x8ECEAEDE, 0xEEEEEEEE, 0x6EAEAECE, - 0x8EBEBEDE, 0xEEEEEEEE, 0xBECEDEDE, 0xCECEEEEE, - 0xEEEEEEEE, 0x9EDE9EDE, 0xCEEECEEE, 0xEEEEEEEE, - 0xBEDEBEEE, 0xCEEECEEE, 0xEEEEEEEE, 0xEEEEEEEE, - 0xEEEEEEEE, 0xEEEEEEEE, 0x3D8E8ECE, 0x8DBEAEDE, - 0xEEEEEEEE, 0x5E8E9ECE, 0x9EBECEDE, 0xEEEEEEEE, - 0x9EAECEDE, 0xCECEEEEE, 0xEEEEEEEE, 0x5E9E8ECE, - 0x9ECEBEDE, 0xEEEEEEEE, 0x7EAEAECE, 0x9ECEBEDE, - 0xEEEEEEEE, 0xAEBEDEDE, 0xBEBEEEEE, 0xEEEEEEEE, - 0x8ECE9EDE, 0xCEEECEEE, 0xEEEEEEEE, 0xAEDEBEEE, - 0xBEEEBEEE, 0xEEEEEEEE, 0xEEEEEEEE, 0xDEEEEEEE, - 0xEEEEEEEE, 0x5E9E8EBE, 0x9EBEAECE, 0xEEEEEEEE, - 0x6E9E9EBE, 0xAEBEBECE, 0xEEEEEEEE, 0x8E9EBEBE, - 0xBEBECECE, 0xEEEEEEEE, 0x6E9E9EBE, 0xAEBEBECE, - 0xEEEEEEEE, 0x7EAE9EBE, 0x9EBEBECE, 0xEEEEEEEE, - 0x9EAEBEBE, 0xAEAECECE, 0xEEEEEEEE, 0x8EBE9EBE, - 0xBEDEBECE, 0xEEEEEEEE, 0x9EBEAECE, 0xAECEAECE, - 0xEEEEDEEE, 0xAEBEBEBD, 0xAEBEBEBD, 0xDECECECD, - ]], - l12_tab: [ - [ - 0xF4925967, 0xA3595697, 0x89789889, 0x99915935, 0x96793695, 0x69779789, 0x78998946, 0x957A68A5, - 0x7A67A78A, 0x78A88A98, 0x96796897, 0x89689779, 0x77878978, 0x97770000 - ], [ - 0xF5D26D7A, 0xD27D68D9, 0xBD8BDACD, 0xDDD05C37, 0xD8AD47D6, 0x8DABD8BD, 0xBCDDDD47, 0xD69D9CD6, - 0x9D8ADBBD, 0xACDBDDDD, 0xD7AD8BDA, 0xDD8BD9BD, 0xCCDBDDCD, 0xDDCD0000 - ]], - l3_tab: [ - [ - 0xF4925A68, 0xB25A46A7, 0x8A78A78A, 0x99A14936, 0x978B36A5, 0x6A78A78A, 0x88A99A46, 0x957A89B5, - 0x7A68A89B, 0x89B89B9A, 0xA78978A9, 0x9A78A89A, 0x99A99A99, 0xA9990000 - ], [ - 0xF3D26DAE, 0xE26E58BA, 0xBEADDBDD, 0xDDD04848, 0xDADD47D6, 0x8DBDDDBD, 0xDDDBDD56, 0x979DBBD8, - 0xADABDDDD, 0xBDDADDDD, 0xDB9BBBDD, 0xDDDBDDDD, 0xDDDDDDDD, 0xDDDD0000 - ]], - esc_tab: [ 0x01234577, 0x8899ABBB, 0xCCDDDEEE, 0xEEEEEFFE ], - }, - CoeffsCBDesc { - l0_tab: [ - [ - 0xF8494989, 0x6A7A7A9A, 0xEEDEDDCC, 0x3B5A7A89, - 0x7C8B8B9A, 0xEECDDECC, 0x9E8CBDAB, 0xAE9CBEAB, - 0xEECDDECC, 0x3A7A5A89, 0x7B8B8A9A, 0xEEDEDDCC, - 0x6C8B8B9A, 0x7C8B8B9A, 0xDECECDBC, 0xAEADBEAB, - 0xBE9DBEAB, 0xEECDDECC, 0x8EBD8CAA, 0xAECE9CAB, - 0xEEEECDCC, 0xAEBD9DAB, 0xBECEADAB, 0xEEEECDBB, - 0xDECECEBB, 0xDECECEBB, 0xEEDEDEBB, 0x1A5A5989, - 0x7B8B8A9A, 0xEEDDDDCC, 0x4B6A7A89, 0x7C8B9B9A, - 0xEECDDECC, 0x8E8CAD9A, 0xAE9CBDAB, 0xEECDEECB, - 0x4B7B6A89, 0x7C9B8B9A, 0xEEDECDCC, 0x6C8B8B9A, - 0x7C8B8B9A, 0xEECDCEBC, 0xAE9DBDAB, 0xAE9CBDAB, - 0xEEBDDEBB, 0x8EBD7C9A, 0xAEBE9CAB, 0xEEEECDCB, - 0xAEBD9DAB, 0xAEBE9CAB, 0xEEDEBDBB, 0xCECECEBB, - 0xCEBDCEBB, 0xEECDCDBA, 0x5C7B7B9A, 0x9D9C9CAB, - 0xEEEEDECC, 0x6D7C8C9A, 0x9E9CACAB, 0xEEDEEEDC, - 0x9E8CADAB, 0xBEADCEBB, 0xEEDEEECC, 0x6D8C8C9A, - 0x9DAD9CAB, 0xEEEEDECC, 0x7D9C8CAB, 0x8E9C9CAB, - 0xEEDEDECC, 0x9E9DBDAB, 0x9E8DBDAB, 0xEEBDEECB, - 0x9EAD8CAA, 0xBECEADAB, 0xEEEEDECC, 0xAEBE9DAB, - 0xAEBE9CAB, 0xEEEECDCB, 0xCECECEBB, 0xBEBDBDBB, - 0xCEBCBDAA, 0x7E9D9DAB, 0xAEBDADAB, 0xEEEEDECB, - 0x8E9D9CAB, 0xAEADADAB, 0xEEEEEECB, 0x9E9CAC9A, - 0xBEADADAA, 0xEEDDDEBA, 0x8E9D9DAB, 0xBEADADAB, - 0xEEEEEECB, 0x8E9D9DAB, 0xAEADADAB, 0xEEDEDECB, - 0x8E8CAC9A, 0xAE8CAD9A, 0xEEBDCDBA, 0x9EAC9D9A, - 0xBEBDADAA, 0xEEDEDDBA, 0x9EAD9D9A, 0xAEAD9D9A, - 0xEEDDCDBA, 0x9E9CAC89, 0x9E9B9C99, 0xBEAAAB98, - ], [ - 0xFB6D6DCD, 0x7CADAEDE, 0xEEDDDDDD, 0x4D7DADDD, - 0x9DBDDDDD, 0xDDDDDDDD, 0xADADDDDD, 0xCDDDDDDD, - 0xDDDDDEEE, 0x3EAE7EDE, 0x9ECEBEEE, 0xEEEEEEEE, - 0x7EBEBECE, 0x9ECECEEE, 0xEEEEEEEE, 0xCEDEEEEE, - 0xDEDEEEEE, 0xEEEEEEEE, 0x9EEEAEEE, 0xDEEECEEE, - 0xEEEEEEEE, 0xCEEECEEE, 0xDEEEDEEE, 0xEEEEEEEE, - 0xEEEEEEEE, 0xEEEEEEEE, 0xEEEEEEEE, 0x0C7D6ECE, - 0x7CBEAEEE, 0xEEEEEEEE, 0x4E8E9ECE, 0x9EBECEEE, - 0xEEEEEEEE, 0x9EAEEEEE, 0xDEDEEEEE, 0xEEEEEEEE, - 0x4EAE7EDE, 0x9ECEBEEE, 0xEEEEEEEE, 0x7EBEAEDE, - 0x8ECEBEEE, 0xEEEEEEEE, 0xBECEEEEE, 0xCECEEEEE, - 0xEEEEEEEE, 0x9EEEAEEE, 0xCEEECEEE, 0xEEEEEEEE, - 0xBEEECEEE, 0xCEEECEEE, 0xEEEEEEEE, 0xEEEEEEEE, - 0xEEEEEEEE, 0xEEEEEEEE, 0x2E8E8ECE, 0x8DBEBEDE, - 0xEEEEEEEE, 0x5E9E9EDE, 0xAECEDEEE, 0xEEEEEEEE, - 0x9EAEDEEE, 0xCEDEEEEE, 0xEEEEEEEE, 0x5EAE8ECE, - 0xAEDEBEEE, 0xEEEEEEEE, 0x7EBEAEDE, 0x9ECECEEE, - 0xEEEEEEEE, 0xBECEEEEE, 0xCECEEEEE, 0xEEEEEEEE, - 0x9EEE9EEE, 0xCEEECEEE, 0xEEEEEEEE, 0xBEEEBEEE, - 0xBEEECEEE, 0xEEEEEEEE, 0xDEEEEEEE, 0xDEEEEEEE, - 0xEEEEEEEE, 0x5E9E9ECE, 0x9EBEBEDE, 0xEEEEEEEE, - 0x6E9E9ECE, 0xAECEBEDE, 0xEEEEEEEE, 0x9EAEBECE, - 0xDECECEDE, 0xEEEEEEEE, 0x6EAE9ECE, 0xAECEBEDD, - 0xDDDDDDDD, 0x7DAD9DCD, 0xADCDBDDD, 0xDDDDDDDD, - 0x9DADCDCD, 0xBDBDCDDD, 0xDDDDDDDD, 0x8DBD9DCD, - 0xCDDDBDDD, 0xDDDDDDDD, 0x9DCDADCD, 0xBDCDADDD, - 0xDDDDDDDD, 0xADCDCDCD, 0xBDDDBDCD, 0xDDDDDDDD, - ]], - l12_tab: [ - [ - 0xF5B26B79, 0xC36B57B8, 0x9B89B99B, 0xABC05A36, 0xB78C47B5, 0x7B89B79B, 0x99BAAB57, 0xB68B89C6, - 0x8B68B99C, 0x8AB99CAA, 0xB79B89B8, 0x9B89B89B, 0x99B9AB99, 0xB9AA0000 - ], [ - 0xF5D27E8B, 0xE27E68EA, 0xBE9CDBDE, 0xEEE06B37, 0xC9BC38E7, 0x8EBCE9CE, 0xBDEDED48, 0xC69EABC6, - 0xAE8BEBEE, 0x9CDCCDCE, 0xE8AD9CEA, 0xCD8CEABE, 0xCEECCEBC, 0xDDDD0000 - ]], - l3_tab: [ - [ - 0xF4B26B8A, 0xC26B57B8, 0xAC89C99D, 0xABC05A46, 0xB8AC47A5, 0x7B9AC8AC, 0x9ACBBC57, 0xB78B9BC7, - 0x8B79BABD, 0x9BCABCBC, 0xD89B9ABC, 0xCC9ABABC, 0xBCCBBCBB, 0xDBCC0000 - ], [ - 0xF4D29DDD, 0xD27D57D8, 0xDD8DDDDD, 0xDDD04D48, 0xD7DD38D6, 0xDDDDDDDD, 0xDDDDDD46, 0xD88DDDDD, - 0xDD9DDDDD, 0xDDDDDDDD, 0xDDDDDDDD, 0xDD9DDDDD, 0xEEEEEEEE, 0xDDDD0000 - ]], - esc_tab: [ 0x01234577, 0x8899ABBD, 0xDDDDDDDD, 0xDDDDDEED ], - }, -]; -const RV60_INTER_COEFFS_CB_DESC: [CoeffsCBDesc; NUM_INTER_SETS] = [ - CoeffsCBDesc { - l0_tab: [ - [ - 0xF5354544, 0x57676765, 0xACAABA97, 0x57566765, - 0x79788876, 0xCDBBCBA8, 0x9B89AA87, 0xBDAABB98, - 0xDECCDDB9, 0x57676765, 0x79888876, 0xCDBBCBA8, - 0x79788876, 0x9B999987, 0xDECBCCA8, 0xBDAABB98, - 0xDEBBCCA8, 0xEEDDDDB9, 0x9B9A9A87, 0xBDBBBB98, - 0xDECCDCA8, 0xBDABBB98, 0xDECBCBA8, 0xEEDDDDB9, - 0xCEBCCCA8, 0xEEDDDDB9, 0xEEDDEDB8, 0x47565765, - 0x79788876, 0xBDBBBBA8, 0x69787876, 0x9B999987, - 0xDEBBCCA8, 0xAC9ABB98, 0xCEBBCCA8, 0xEECCDDB9, - 0x69787876, 0x9B999987, 0xDECCCCA8, 0x8A899987, - 0xACAAAA97, 0xEECCDCB9, 0xCDABCCA8, 0xDEBCCCA8, - 0xEEDDEDB9, 0xACAAAA97, 0xCEBBBBA8, 0xEEDDDCB9, - 0xCEBBBBA8, 0xDECCCCA8, 0xEEDDDDB9, 0xDECCDDB9, - 0xEEDDDDB9, 0xEEDDEDB8, 0x7A898987, 0xACAAAB98, - 0xDECCDDB9, 0x9B9AAA98, 0xCDBBBBA8, 0xEEDDEDB9, - 0xBEABCCA9, 0xDECCDDB9, 0xEEDDEECA, 0x9CAA9A98, - 0xCDBBBBA8, 0xEEDDEDB9, 0xBDABBBA8, 0xCECCCCA9, - 0xEEEDEDCA, 0xDEBCDDB9, 0xEECCDDB9, 0xEEEEEEC9, - 0xBEBCBBA9, 0xDEDDCCB9, 0xEEEEEDC9, 0xDECCCCB9, - 0xEEDDDDB9, 0xEEEEEEC9, 0xEEDDDDB9, 0xEEDDEEB9, - 0xEEEDEEB9, 0xACABABA9, 0xCECCCCB9, 0xEEDDEECA, - 0xBDBBBCA9, 0xDECCDDB9, 0xEEEEEECA, 0xCEBCCDA9, - 0xEECCDDB9, 0xEEDDEEB9, 0xBDBCBCA9, 0xDECDCCB9, - 0xEEEEEECA, 0xCECCCCB9, 0xEEDDDDBA, 0xEEEEEECA, - 0xDECCDDB9, 0xEECDEDB9, 0xEEDDEEB9, 0xCECDBCA9, - 0xEEDDCCB9, 0xEEEEEDB9, 0xDEDDCCB9, 0xEEDDDDB9, - 0xEEEEEDB9, 0xEECDDDA8, 0xEEDDDDA8, 0xEECCDCA7, - ], [ - 0xF5263656, 0x48687978, 0xCECCDDBB, 0x38576978, - 0x7A899A99, 0xEEDDDECB, 0xADABCDAA, 0xCEBCDEBB, - 0xEEEEEEED, 0x48686878, 0x7A899A99, 0xEEDDDECB, - 0x7A899A99, 0xACAAABAA, 0xEEDDEECC, 0xCEBCDEBB, - 0xEEDDEECC, 0xEEEEEEED, 0xBDBCACBA, 0xDECDCDCB, - 0xEEEEEEED, 0xCECDCDBB, 0xEEDDDECC, 0xEEEEEEED, - 0xEEEEEEDD, 0xEEEEEEED, 0xEEEEEEEE, 0x17475867, - 0x69798988, 0xDECCDDCB, 0x59687988, 0x8B9AAB99, - 0xEEDDEECB, 0xBDABCDBA, 0xDECCDECB, 0xEEEEEEED, - 0x59797988, 0x8B9A9B99, 0xEEDDEECC, 0x8B8A9B99, - 0xACABBCAA, 0xEEDDEEDC, 0xDECCDECB, 0xEECDEECC, - 0xEEEEEEED, 0xBEBCACBB, 0xDEDDCDCB, 0xEEEEEEED, - 0xDECDCDCB, 0xEEDEDECC, 0xEEEEEEED, 0xEEEEEEDD, - 0xEEEEEEED, 0xEEEEEEED, 0x6A898A99, 0xACABBCAA, - 0xEEEEEEDC, 0x8C9AACAA, 0xBDBCCDBB, 0xEEEEEEDD, - 0xCEBDDECB, 0xEEDDEEDC, 0xEEEEEEEE, 0x9C9B9BAA, - 0xBDBCBCBB, 0xEEEEEEDD, 0xADBBBCBA, 0xCECCCDBB, - 0xEEEEEEED, 0xEEDDEEDC, 0xEEDEEEDC, 0xEEEEEEED, - 0xCEDDBDCB, 0xEEEEDEDC, 0xEEEEEEEE, 0xEEEEDECC, - 0xEEEEDEDC, 0xEEEEEEED, 0xEEEEEEED, 0xEEEEEEED, - 0xEEEEEEED, 0x9DACBDBB, 0xCECDDECB, 0xEEEEEEED, - 0xBEBCCDBB, 0xDEDDDECC, 0xEEEEEEED, 0xDECDEECC, - 0xEEDEEEDC, 0xEEEEEEED, 0xBECCBDBB, 0xDEDDDECC, - 0xEEEEEEED, 0xCECDCECC, 0xEEDEEECC, 0xEEEEEEED, - 0xDEDEEEDC, 0xEEDEEEDC, 0xEEEEEEED, 0xCEDEBECC, - 0xEEEEDEDC, 0xEEEEEEED, 0xDEEEDECC, 0xEEEEDEDC, - 0xEEEEEEED, 0xEEEEEEDC, 0xEEEEEEDC, 0xEEEEEECB, - ]], - l12_tab: [ - [ - 0xF3624757, 0x82474577, 0x78568678, 0x78824735, 0x86784575, 0x68788678, 0x78888857, 0x86797896, - 0x79789899, 0x78989999, 0x979989A8, 0x9989989A, 0x99989989, 0x98880000 - ], [ - 0xF3815978, 0xB2594698, 0x9B78A89B, 0xABC14936, 0x979B4695, 0x7A99B79B, 0x89BBBC68, 0xA78B9AC7, - 0x8B89BABC, 0x9ACABCCC, 0xC9ACABDB, 0xCD9BCABD, 0xBCDABDBC, 0xDCCC0000 - ]], - l3_tab: [ - [ - 0xF3624757, 0x82474586, 0x78578778, 0x78824735, 0x76784575, 0x68789678, 0x78989847, 0x86797896, - 0x79789899, 0x79989999, 0x979A89A8, 0x9989A99A, 0x9999AA9A, 0xA9980000 - ], [ - 0xF2915A69, 0xC25A47B8, 0xAD89C9AD, 0xCCE15A36, 0xB79D47B6, 0x8B9AD9AD, 0xABDCDE68, 0xB79CACE8, - 0x9C9ADBCE, 0xBCEBCEDD, 0xEABDBCED, 0xDEBCECDE, 0xDEEDDEDD, 0xEEEE0000 - ]], - esc_tab: [ 0x01235566, 0x788899AA, 0xABBBBBCC, 0xBBBCEEEE ], - }, - CoeffsCBDesc { - l0_tab: [ - [ - 0xF5354544, 0x57676765, 0xACAABA97, 0x57566765, - 0x79788876, 0xCDBBCBA8, 0x9B89AA87, 0xBDAABB98, - 0xDECCDDB9, 0x57676765, 0x79888876, 0xCDBBCBA8, - 0x79788876, 0x9B999987, 0xDECBCCA8, 0xBDAABB98, - 0xDEBBCCA8, 0xEEDDDDB9, 0x9B9A9A87, 0xBDBBBB98, - 0xDECCDCA8, 0xBDABBB98, 0xDECBCBA8, 0xEEDDDDB9, - 0xCEBCCCA8, 0xEEDDDDB9, 0xEEDDEDB8, 0x47565765, - 0x79788876, 0xBDBBBBA8, 0x69787876, 0x9B999987, - 0xDEBBCCA8, 0xAC9ABB98, 0xCEBBCCA8, 0xEECCDDB9, - 0x69787876, 0x9B999987, 0xDECCCCA8, 0x8A899987, - 0xACAAAA97, 0xEECCDCB9, 0xCDABCCA8, 0xDEBCCCA8, - 0xEEDDEDB9, 0xACAAAA97, 0xCEBBBBA8, 0xEEDDDCB9, - 0xCEBBBBA8, 0xDECCCCA8, 0xEEDDDDB9, 0xDECCDDB9, - 0xEEDDDDB9, 0xEEDDEDB8, 0x7A898987, 0xACAAAB98, - 0xDECCDDB9, 0x9B9AAA98, 0xCDBBBBA8, 0xEEDDEDB9, - 0xBEABCCA9, 0xDECCDDB9, 0xEEDDEECA, 0x9CAA9A98, - 0xCDBBBBA8, 0xEEDDEDB9, 0xBDABBBA8, 0xCECCCCA9, - 0xEEEDEDCA, 0xDEBCDDB9, 0xEECCDDB9, 0xEEEEEEC9, - 0xBEBCBBA9, 0xDEDDCCB9, 0xEEEEEDC9, 0xDECCCCB9, - 0xEEDDDDB9, 0xEEEEEEC9, 0xEEDDDDB9, 0xEEDDEEB9, - 0xEEEDEEB9, 0xACABABA9, 0xCECCCCB9, 0xEEDDEECA, - 0xBDBBBCA9, 0xDECCDDB9, 0xEEEEEECA, 0xCEBCCDA9, - 0xEECCDDB9, 0xEEDDEEB9, 0xBDBCBCA9, 0xDECDCCB9, - 0xEEEEEECA, 0xCECCCCB9, 0xEEDDDDBA, 0xEEEEEECA, - 0xDECCDDB9, 0xEECDEDB9, 0xEEDDEEB9, 0xCECDBCA9, - 0xEEDDCCB9, 0xEEEEEDB9, 0xDEDDCCB9, 0xEEDDDDB9, - 0xEEEEEDB9, 0xEECDDDA8, 0xEEDDDDA8, 0xEECCDCA7, - ], [ - 0xF5263656, 0x48687978, 0xCECCDDBB, 0x38576978, - 0x7A899A99, 0xEEDDDECB, 0xADABCDAA, 0xCEBCDEBB, - 0xEEEEEEED, 0x48686878, 0x7A899A99, 0xEEDDDECB, - 0x7A899A99, 0xACAAABAA, 0xEEDDEECC, 0xCEBCDEBB, - 0xEEDDEECC, 0xEEEEEEED, 0xBDBCACBA, 0xDECDCDCB, - 0xEEEEEEED, 0xCECDCDBB, 0xEEDDDECC, 0xEEEEEEED, - 0xEEEEEEDD, 0xEEEEEEED, 0xEEEEEEEE, 0x17475867, - 0x69798988, 0xDECCDDCB, 0x59687988, 0x8B9AAB99, - 0xEEDDEECB, 0xBDABCDBA, 0xDECCDECB, 0xEEEEEEED, - 0x59797988, 0x8B9A9B99, 0xEEDDEECC, 0x8B8A9B99, - 0xACABBCAA, 0xEEDDEEDC, 0xDECCDECB, 0xEECDEECC, - 0xEEEEEEED, 0xBEBCACBB, 0xDEDDCDCB, 0xEEEEEEED, - 0xDECDCDCB, 0xEEDEDECC, 0xEEEEEEED, 0xEEEEEEDD, - 0xEEEEEEED, 0xEEEEEEED, 0x6A898A99, 0xACABBCAA, - 0xEEEEEEDC, 0x8C9AACAA, 0xBDBCCDBB, 0xEEEEEEDD, - 0xCEBDDECB, 0xEEDDEEDC, 0xEEEEEEEE, 0x9C9B9BAA, - 0xBDBCBCBB, 0xEEEEEEDD, 0xADBBBCBA, 0xCECCCDBB, - 0xEEEEEEED, 0xEEDDEEDC, 0xEEDEEEDC, 0xEEEEEEED, - 0xCEDDBDCB, 0xEEEEDEDC, 0xEEEEEEEE, 0xEEEEDECC, - 0xEEEEDEDC, 0xEEEEEEED, 0xEEEEEEED, 0xEEEEEEED, - 0xEEEEEEED, 0x9DACBDBB, 0xCECDDECB, 0xEEEEEEED, - 0xBEBCCDBB, 0xDEDDDECC, 0xEEEEEEED, 0xDECDEECC, - 0xEEDEEEDC, 0xEEEEEEED, 0xBECCBDBB, 0xDEDDDECC, - 0xEEEEEEED, 0xCECDCECC, 0xEEDEEECC, 0xEEEEEEED, - 0xDEDEEEDC, 0xEEDEEEDC, 0xEEEEEEED, 0xCEDEBECC, - 0xEEEEDEDC, 0xEEEEEEED, 0xDEEEDECC, 0xEEEEDEDC, - 0xEEEEEEED, 0xEEEEEEDC, 0xEEEEEEDC, 0xEEEEEECB, - ]], - l12_tab: [ - [ - 0xF3624757, 0x82474577, 0x78568678, 0x78824735, 0x86784575, 0x68788678, 0x78888857, 0x86797896, - 0x79789899, 0x78989999, 0x979989A8, 0x9989989A, 0x99989989, 0x98880000 - ], [ - 0xF3815978, 0xB2594698, 0x9B78A89B, 0xABC14936, 0x979B4695, 0x7A99B79B, 0x89BBBC68, 0xA78B9AC7, - 0x8B89BABC, 0x9ACABCCC, 0xC9ACABDB, 0xCD9BCABD, 0xBCDABDBC, 0xDCCC0000 - ]], - l3_tab: [ - [ - 0xF3624757, 0x82474586, 0x78578778, 0x78824735, 0x76784575, 0x68789678, 0x78989847, 0x86797896, - 0x79789899, 0x79989999, 0x979A89A8, 0x9989A99A, 0x9999AA9A, 0xA9980000 - ], [ - 0xF2915A69, 0xC25A47B8, 0xAD89C9AD, 0xCCE15A36, 0xB79D47B6, 0x8B9AD9AD, 0xABDCDE68, 0xB79CACE8, - 0x9C9ADBCE, 0xBCEBCEDD, 0xEABDBCED, 0xDEBCECDE, 0xDEEDDEDD, 0xEEEE0000 - ]], - esc_tab: [ 0x01235566, 0x788899AA, 0xABBBBBCC, 0xBBBCEEEE ], - }, - CoeffsCBDesc { - l0_tab: [ - [ - 0xF4343444, 0x57676765, 0xBDBBBBA9, 0x47566765, - 0x79788877, 0xCECCCCB9, 0xAC9AAB98, 0xCEBBCCA9, - 0xEEDDEECA, 0x47575665, 0x79888877, 0xCECCCCB9, - 0x79788877, 0x9B9A9A98, 0xEEDDDDBA, 0xBEBBCCA9, - 0xDECCDDBA, 0xEEEEEECA, 0xACAB9A98, 0xCDBCBBA9, - 0xEEDDDDCA, 0xBEBCBBA9, 0xDECCCCBA, 0xEEEEEECA, - 0xEEDDDECA, 0xEEEEEECA, 0xEEEEEECA, 0x37565665, - 0x79788877, 0xCECCCCB9, 0x69787877, 0x9B999A88, - 0xDEDDDDBA, 0xAD9BBCA9, 0xCEBCCDB9, 0xEEEEEECA, - 0x69787877, 0x9B9A9988, 0xDEDDDDBA, 0x8B999988, - 0xACABAB98, 0xEEDDDDCA, 0xCEBCCCB9, 0xDECCDDBA, - 0xEEEEEECA, 0xBDBBABA9, 0xCECCBCB9, 0xEEEEEDCA, - 0xCECCBCA9, 0xDEDDCCBA, 0xEEEEEECA, 0xEEDEEECA, - 0xEEEEEECA, 0xEEEEEECA, 0x7A8A9A98, 0xADABBBA9, - 0xEEEEEEDB, 0x9C9BABA9, 0xCEBCCCBA, 0xEEEEEEDB, - 0xCEBCDDBA, 0xEECDEECB, 0xEEEEEEDB, 0x9CABABA9, - 0xCECCBCBA, 0xEEEEEEDB, 0xBDBCBCAA, 0xCECDCDBA, - 0xEEEEEEDB, 0xDECDDECB, 0xEEDDEECB, 0xEEEEEEDB, - 0xCECDBCBA, 0xEEDECDCA, 0xEEEEEEDB, 0xDEDECDCA, - 0xEEEEDDCB, 0xEEEEEEDB, 0xEEEEEECB, 0xEEEEEECB, - 0xEEEEEECA, 0xACACBCAA, 0xCECDCDBB, 0xEEEEEEDB, - 0xBEBCCDBA, 0xDEDDDDCB, 0xEEEEEEDB, 0xCEBCDDBA, - 0xEECDEECA, 0xEEEEEECA, 0xBECDBCBA, 0xDEDEDDCB, - 0xEEEEEEDB, 0xCECDCDBB, 0xEEDEDECB, 0xEEEEEEDB, - 0xDECDDEBA, 0xEEDDEECA, 0xEEEEEECA, 0xCEDDBCBA, - 0xEEEECDBA, 0xEEEEEECA, 0xDEDECDBA, 0xEEEECDCA, - 0xEEEEEECA, 0xEEDDDDB9, 0xEEDDDDB9, 0xEECDDDA8, - ], [ - 0xF4263657, 0x48687989, 0xCECDDEDD, 0x38586978, - 0x7A8A9B9A, 0xEEDEEEEE, 0xADACCECC, 0xDECEEEDD, - 0xEEEEEEEE, 0x38686878, 0x7A8A8A9A, 0xEEDEEEDE, - 0x7A8A9B9A, 0x9CACACBB, 0xEEEEEEEE, 0xDECEDEDD, - 0xEEDEEEEE, 0xEEEEEEEE, 0xBEBDADBC, 0xDEDECEDD, - 0xEEEEEEEE, 0xDEDECEDD, 0xEEEEDEDE, 0xEEEEEEEE, - 0xEEEEEEEE, 0xEEEEEEEE, 0xEEEEEEEE, 0x17475868, - 0x69798A9A, 0xDEDEEEDD, 0x59698A89, 0x8B9BACAB, - 0xEEEEEEEE, 0xBEADDECC, 0xDECEEEDD, 0xEEEEEEEE, - 0x59797A89, 0x8B9B9BAB, 0xEEEEEEEE, 0x8B9B9BAB, - 0xADACBDBC, 0xEEEEEEEE, 0xDECEEEDE, 0xEEDEEEEE, - 0xEEEEEEEE, 0xBECEADCC, 0xDEEECEDD, 0xEEEEEEEE, - 0xDEDECEDD, 0xEEEEDEDE, 0xEEEEEEEE, 0xEEEEEEEE, - 0xEEEEEEEE, 0xEEEEEEEE, 0x6A8A8B9A, 0x9CACBCBC, - 0xEEEEEEEE, 0x8C9BACAB, 0xBEBDCECD, 0xEEEEEEEE, - 0xCEBEDEDD, 0xEEDEEEEE, 0xEEEEEEEE, 0x8C9C9CAB, - 0xBECDBDCD, 0xEEEEEEEE, 0xAEBDBDCC, 0xBECECECD, - 0xEEEEEEEE, 0xEEDEEEEE, 0xEEDEEEEE, 0xEEEEEEEE, - 0xCEDEBECD, 0xEEEEDEDE, 0xEEEEEEEE, 0xDEEEDEDE, - 0xEEEEDEEE, 0xEEEEEEEE, 0xEEEEEEEE, 0xEEEEEEEE, - 0xEEEEEEEE, 0x9DBDBDCC, 0xCECEDEDD, 0xEEEEEEEE, - 0xAEBECECD, 0xDEDEDEDD, 0xEEEEEEEE, 0xCECEDEDD, - 0xEEDEEEEE, 0xEEEEEEEE, 0xAECEBECD, 0xDEDEDEDD, - 0xEEEEEEEE, 0xBECECEDD, 0xDEDEDEDE, 0xEEEEEEEE, - 0xDEDEEEDD, 0xEEDEEEDE, 0xEEEEEEEE, 0xBEDEBECD, - 0xEEEEDEDD, 0xEEEEEEEE, 0xCEEECEDD, 0xDEEECEDD, - 0xEEEEEEEE, 0xEEEEEEED, 0xDEEEDEDD, 0xEEEEDEDC, - ]], - l12_tab: [ - [ - 0xF2724868, 0x92484688, 0x8A679789, 0x9AA14846, 0x978A4585, 0x6989A789, 0x88A9AA67, 0xA78A89B7, - 0x8A89A9AB, 0x89A9AAAA, 0xA8AB9AB9, 0xAA9AB9AB, 0xAAA9AA9A, 0xAA990000 - ], [ - 0xF2915A89, 0xD25A57B9, 0xBD79C9AD, 0xCDE14A46, 0xB8AD36B6, 0x7BABD8AC, 0xAADCDE68, 0xC8ADACE7, - 0x9D9ADBCE, 0x9BDBCDDD, 0xDABDBCDC, 0xDDACDBCD, 0xCDEBDECD, 0xDDDD0000 - ]], - l3_tab: [ - [ - 0xF2724868, 0x92484698, 0x9A68989A, 0x9AA14836, 0x978A4695, 0x7989A78A, 0x89AAAA58, 0xA78A9AB7, - 0x9A89BAAB, 0x9ABAABBB, 0xB9ABAABA, 0xBBABCABC, 0xBBBBBBBB, 0xBBBA0000 - ], [ - 0xF4B16C9B, 0xF27C69DB, 0xCFABFBDF, 0xEFF06C48, 0xDACF58D7, 0xAECDFBCF, 0xCDFEEF8A, 0xDABFDEFA, - 0xCFBCFEFF, 0xDEFEEFFF, 0xFDEFEEFF, 0xFFEFFEFF, 0xFFFFFFFF, 0xFFFE0000 - ]], - esc_tab: [ 0x01235566, 0x788899AA, 0xABBBBCCC, 0xBBBCDDDD ], - }, - CoeffsCBDesc { - l0_tab: [ - [ - 0xF4243444, 0x47576766, 0xCDBCCCBA, 0x47566766, - 0x79798988, 0xDECDDDBA, 0xAD9BBCA9, 0xCEBCCDBA, - 0xEEDEEECB, 0x47575666, 0x79898888, 0xDECCCCBA, - 0x79798988, 0x9B9A9A99, 0xEEDDDDCB, 0xBEBCCDBA, - 0xDECDDEBB, 0xEEEEEECB, 0xACAB9A99, 0xBECCBBAA, - 0xEEDEDDCB, 0xBECCBCBA, 0xDECDCDBA, 0xEEEEEECB, - 0xEEDEDECB, 0xEEEEEECB, 0xEEEEEECB, 0x36565766, - 0x79798988, 0xDECDDDCA, 0x69687977, 0x9B9A9A99, - 0xEEDDDDCB, 0xAD9BBCAA, 0xCEBCDDBA, 0xEEEEEECB, - 0x69797877, 0x9B9A9A99, 0xEEDDDDCB, 0x8B9A9A99, - 0xACABABA9, 0xEEDEDECB, 0xCEBCCDBA, 0xDECDDECB, - 0xEEEEEECB, 0xADBC9BAA, 0xCECDBCBA, 0xEEEEEECB, - 0xCECDBCBA, 0xDEDECDBB, 0xEEEEEECB, 0xEEDEDECB, - 0xEEEEEECB, 0xEEEEEECA, 0x7B8A9A99, 0xADBCBCBA, - 0xEEEEEEDC, 0x9C9BABAA, 0xBEBCCDBB, 0xEEEEEEDC, - 0xBEACCEBB, 0xDECDEECB, 0xEEEEEEDC, 0x9CAB9BAA, - 0xBECDBCBB, 0xEEEEEEDC, 0xADBCBCBA, 0xCECDCDCB, - 0xEEEEEEDC, 0xDECDDECB, 0xDECEEECB, 0xEEEEEEDC, - 0xBECDACBA, 0xDEDECDCB, 0xEEEEEEDC, 0xDEDECDCB, - 0xDEEECDCB, 0xEEEEEEDB, 0xEEEEEEDB, 0xEEEEEECB, - 0xEEDEEECA, 0x9CACACBB, 0xCECDCDCB, 0xEEEEEEDC, - 0xAEBDBDBB, 0xDECEDECB, 0xEEEEEEDC, 0xBEBDCEBA, - 0xEECDDECB, 0xEEEEEECB, 0xAEBDBCBB, 0xDEDECDCB, - 0xEEEEEEDC, 0xBECDCDCB, 0xDEDEDECC, 0xEEEEEEDC, - 0xCECDDEBB, 0xDECDDECB, 0xEEDEEECA, 0xBECEACBA, - 0xDEDECDBB, 0xEEEEEECA, 0xCEDEBDBA, 0xDEDECDBB, - 0xEEEEDECA, 0xDECDCDBA, 0xDECDCDBA, 0xEECDCCA8, - ], [ - 0xF5262668, 0x4869799A, 0xEEEEEEEE, 0x38597A8A, - 0x7B9B9CAC, 0xEEEEEEEE, 0xBEBEDEDE, 0xDEDEEEEE, - 0xEEEEEEEE, 0x3869598A, 0x7B9C9BAC, 0xEEEEEEEE, - 0x7B9C9CAC, 0x9DBDBDCD, 0xEEEEEEEE, 0xDEDEEEEE, - 0xEEEEEEEE, 0xEEEEEEEE, 0xBEDEAECE, 0xDEEECEEE, - 0xEEEEEEEE, 0xDEEEDEEE, 0xEEEEEEEE, 0xEEEEEEEE, - 0xEEEEEEEE, 0xEEEEEEEE, 0xEEEEEEEE, 0x17485879, - 0x6A8B8BAB, 0xEEEEEEEE, 0x5A6A8B9B, 0x8CACADBD, - 0xEEEEEEEE, 0xBEBEDEDE, 0xDEDEEEEE, 0xEEEEEEEE, - 0x5A7B7A9B, 0x8CAD9CBC, 0xEEEEEEEE, 0x8CAC9CBC, - 0x9EBEBDCD, 0xEEEEEEEE, 0xDEDEEEEE, 0xEEEEEEEE, - 0xEEEEEEEE, 0xBEDEAECE, 0xDEEECEEE, 0xEEEEEEEE, - 0xDEEEDEEE, 0xEEEEDEEE, 0xEEEEEEEE, 0xEEEEEEEE, - 0xEEEEEEEE, 0xEEEEEEEE, 0x5B8C8CAC, 0xADBDBDCD, - 0xEEEEEEEE, 0x8D9DADBD, 0xBECECEDE, 0xEEEEEEEE, - 0xCEBEEEDE, 0xEEDEEEEE, 0xEEEEEEEE, 0x8DAD9DBC, - 0xBECEBEDE, 0xEEEEEEEE, 0x9EBEBECD, 0xBECECEDE, - 0xEEEEEEEE, 0xDEEEEEEE, 0xDEDEEEEE, 0xEEEEEEEE, - 0xBEDEAEDE, 0xEEEEDEEE, 0xEEEEEEEE, 0xDEEEDEEE, - 0xDEEECEEE, 0xEEEEEEEE, 0xEEEEEEEE, 0xEEEEEEEE, - 0xEEEEEEEE, 0x8EBEBECD, 0xCEDECEEE, 0xEEEEEEEE, - 0xAEBECECD, 0xDEDEDEEE, 0xEEEEEEEE, 0xBEBEDEDE, - 0xEEDEEEEE, 0xEEEEEEEE, 0x9ECEBECD, 0xCEEEDEEE, - 0xEEEEEEEE, 0xAECECEDE, 0xDEDEDEEE, 0xEEEEEEEE, - 0xCEDEEEEE, 0xDEDEEEEE, 0xEEEEEEEE, 0xAEDEAECD, - 0xEEEEDEEE, 0xEEEEEEEE, 0xBEEECEDE, 0xDEEECEDE, - 0xEEEEEEEE, 0xDEEEEEEE, 0xDEEEDEEE, 0xEEDEDEDD, - ]], - l12_tab: [ - [ - 0xF2724878, 0xA2484698, 0x9A67989A, 0xAAA14846, 0x978A3695, 0x7A89A78A, 0x89AAAA68, 0xA78B9AB7, - 0x8B89B9AB, 0x89B9ABAA, 0xA8AB9AB9, 0xAB9AB9AB, 0xAAA9AB9A, 0xBAA90000 - ], [ - 0xF3B26C9B, 0xE25C58DB, 0xCE8ADABE, 0xEEE05B47, 0xD9BE37D7, 0x9DBCE8BE, 0xBCEEEE79, 0xD8BEBCE8, - 0xAEABECCE, 0xACECDEEE, 0xEACECDED, 0xEEBDECDE, 0xDEECEEDE, 0xEEEE0000 - ]], - l3_tab: [ - [ - 0xF2815979, 0xB24946A8, 0x9B79B99B, 0xABC15946, 0xA89B46A6, 0x8A9AB89B, 0x9ABBBC68, 0xB89BABC8, - 0x9B9ACABC, 0xABCBBCCC, 0xCABCABCB, 0xCCABCBCC, 0xBCCBCCBC, 0xCCCC0000 - ], [ - 0xF3D17EBD, 0xF27E6AFC, 0xEFBDFCEF, 0xFFF06D5A, 0xECEF59E9, 0xBEDFFCEF, 0xDFFFFF9B, 0xEBDFEFFB, - 0xDFCEFFFF, 0xEFFFFFFF, 0xFEEFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFF0000 - ]], - esc_tab: [ 0x01235566, 0x788899AA, 0xAABBBCCC, 0xCBBCEEEE ], - }, - CoeffsCBDesc { - l0_tab:[ - [ - 0xF4252545, 0x47676777, 0xCECCCCBB, 0x47576877, - 0x7A898A99, 0xDEDDCDCB, 0xAD9BBDAA, 0xBEBCCDBB, - 0xEEDEDECB, 0x47675777, 0x7A898989, 0xDECDCDCB, - 0x7A898A89, 0x9C9BABAA, 0xEEDEDECB, 0xBEBDCDBB, - 0xDECDDECB, 0xEEEEEECC, 0x9DBC9BAA, 0xBECDACBB, - 0xEEDEDECB, 0xBECDBCBB, 0xCECECDBB, 0xEEEEDECB, - 0xDEDEDECB, 0xEEDEDECC, 0xEEEEEECB, 0x27575767, - 0x7A898999, 0xDEDDDDCB, 0x59697988, 0x9C9BABAA, - 0xEEDEDECC, 0xAE9CBDAA, 0xCEBDCEBB, 0xEEEEEEDC, - 0x59797988, 0x9B9B9AAA, 0xEEDEDECB, 0x8B9B9B9A, - 0x9DACACAA, 0xEEDEDECC, 0xCEBDCEBB, 0xCEBDDECB, - 0xEEDEEECC, 0xADBD9BAA, 0xCECDBCBB, 0xEEEEDECB, - 0xCECDBDBB, 0xCEDEBDBB, 0xEEEEDECB, 0xEEDEDECB, - 0xEEDEDECB, 0xEEEEDECB, 0x6B8B8B9A, 0xADBCACBB, - 0xEEEEEEDC, 0x8C9CACAA, 0xBEBDCDBB, 0xEEEEEEDC, - 0xBEADCEBB, 0xDECEDECC, 0xEEEEEEDC, 0x8CAC9BAA, - 0xBEBDBDBB, 0xEEEEEEDC, 0xAEBDBDBB, 0xBECDCDCB, - 0xEEEEEEDC, 0xCECEDECC, 0xDECEDECC, 0xEEDEEEDC, - 0xBECEACBB, 0xDEDECDCB, 0xEEEEEEDC, 0xCEDECDCB, - 0xDEDECDCC, 0xEEEEDEDC, 0xEEEEEECC, 0xDEDEDECC, - 0xEEDEDECB, 0x8DADACBB, 0xCECECDCB, 0xEEEEEEDC, - 0xAEBDBDBB, 0xCECECECC, 0xEEEEEEDC, 0xBEADCEBB, - 0xDECDDEBB, 0xEEEEEECB, 0xAEBDADBB, 0xCEDECDCC, - 0xEEEEEEDC, 0xAECEBDCB, 0xCEDECECC, 0xEEEEEEDC, - 0xBEBDCEBB, 0xCEBEDEBB, 0xEEDEEECB, 0xBECEACBA, - 0xDEDEBDBB, 0xEEEEDECB, 0xBECEBDBB, 0xCEDEBDBB, - 0xEEEEDECB, 0xCECDCDBA, 0xCEBDBDBA, 0xDEBCBCA9, - ], [ - 0xF5383879, 0x498B7BAC, 0xEEEEEEEE, 0x3A6A7BAC, - 0x8CADAECE, 0xEEEEEEEE, 0xCECEEEEE, 0xEEEEEEEE, - 0xEEEEEEEE, 0x3A7B6A9C, 0x8CAD9DCE, 0xEEEEEEEE, - 0x7DAEADCD, 0xAECECEDE, 0xEEEEEEEE, 0xEEEEEEEE, - 0xEEEEEEEE, 0xEEEEEEEE, 0xBEEEBEEE, 0xEEEEEEEE, - 0xEEEEEEEE, 0xEEEEEEEE, 0xEEEEEEEE, 0xEEEEEEEE, - 0xEEEEEEEE, 0xEEEEEEEE, 0xEEEEEEEE, 0x085A5A9B, - 0x6A9C9CBD, 0xEEEEEEEE, 0x5B7C9CBC, 0x9EBEBECE, - 0xEEEEEEEE, 0xCECEEEEE, 0xEEEEEEEE, 0xEEEEEEEE, - 0x5B9C7CAC, 0x9EBEAEDE, 0xEEEEEEEE, 0x8EBEAECE, - 0xAECEBEDE, 0xEEEEEEEE, 0xEEEEEEEE, 0xEEEEEEEE, - 0xEEEEEEEE, 0xBEEEBEEE, 0xEEEEDEEE, 0xEEEEEEEE, - 0xEEEEDEEE, 0xEEEEEEEE, 0xEEEEEEEE, 0xEEEEEEEE, - 0xEEEEEEEE, 0xEEEEEEEE, 0x6D9D9DCD, 0xAECECEEE, - 0xEEEEEEEE, 0x8EAEBECE, 0xBEDEDEEE, 0xEEEEEEEE, - 0xCECEEEEE, 0xEEEEEEEE, 0xEEEEEEEE, 0x8EBEAECE, - 0xBEDECEEE, 0xEEEEEEEE, 0xAECECEDE, 0xBEDECEEE, - 0xEEEEEEEE, 0xDEEEEEEE, 0xDEDEEEEE, 0xEEEEEEEE, - 0xBEEEBEDE, 0xEEEEDEEE, 0xEEEEEEEE, 0xDEEEDEEE, - 0xDEEEDEEE, 0xEEEEEEEE, 0xEEEEEEEE, 0xEEEEEEEE, - 0xEEEEEEEE, 0x8ECEBEDE, 0xCEDEDEEE, 0xEEEEEEEE, - 0xAECECEDE, 0xDEEEEEEE, 0xEEEEEEEE, 0xBECEEEEE, - 0xEEEEEEEE, 0xEEEEEEEE, 0x9ECEBEDE, 0xDEEEDEEE, - 0xEEEEEEEE, 0xAEDEDEEE, 0xDEEEEEEE, 0xEEEEEEEE, - 0xCEDEEEEE, 0xDEDEEEEE, 0xEEEEEEEE, 0xAEDEBEDE, - 0xEEEEDEEE, 0xEEEEEEEE, 0xBEEECEEE, 0xDEEEDEEE, - 0xEEEEEEEE, 0xDEEEEEEE, 0xDEEEEEEE, 0xEEEEEEEE, - ]], - l12_tab: [ - [ - 0xF2825978, 0xB15956A9, 0x9B68A89B, 0xABB15946, 0xA79B46A6, 0x7A99B79B, 0x99BABB68, 0xB79B9AC7, - 0x9B89CAAC, 0x8ACAACBB, 0xB8AB9AC9, 0xAB9ACAAC, 0xAAB9ABAA, 0xBAAA0000 - ], [ - 0xF4D27EAC, 0xE16E69EC, 0xDE9BECDE, 0xEEE06D59, 0xEBDE49E8, 0xAECDE9CE, 0xCDEEEE7A, 0xE9CECEE9, - 0xCEACEDEE, 0xBDEDEEEE, 0xEBEECEEE, 0xEECEEDEE, 0xEEEDEEEE, 0xEEEE0000 - ]], - l3_tab: [ - [ - 0xF2815979, 0xB25946A8, 0x9B79B9AB, 0xBBC14946, 0xA89B46A6, 0x8A9AC89B, 0x9ACBBC68, 0xB79BABD8, - 0x9B9ACBBD, 0xABCBBCCC, 0xDABCABCB, 0xCDABCBCD, 0xCCDBCDCC, 0xDCCC0000 - ], [ - 0xF3D17FCF, 0xF27F6AFD, 0xFFBDFCEF, 0xFFF06D59, 0xFCFF59E9, 0xBFEFFDFF, 0xDFFFFF9B, 0xEBDFFFFB, - 0xDFCEFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFF0000 - ]], - esc_tab: [ 0x01235566, 0x788899AA, 0xABBBBCCC, 0xBBBCDDDD ], - }, - CoeffsCBDesc { - l0_tab: [ - [ - 0xF4352556, 0x47686878, 0xCECDCDBB, 0x38586878, - 0x7A8A8A99, 0xDEDDCDCB, 0x9E9CBDAB, 0xBEBCCDBB, - 0xEEDEDECC, 0x37685777, 0x7A8A7999, 0xDECDCDCB, - 0x6A8A8A99, 0x8C9B9BAA, 0xDEDEDDCC, 0xBEBDCDBB, - 0xCEBDCECB, 0xEEDEDECC, 0x9DAC8BAA, 0xBEBDACBB, - 0xEEDECECB, 0xBECDACBB, 0xCECEBDBB, 0xEEDEDECC, - 0xDEDEDECC, 0xEEDEDECC, 0xEEEEEECB, 0x27575777, - 0x6A8A8999, 0xDEDDCDCB, 0x5A697989, 0x8B9B9B9A, - 0xEEDEDECC, 0x9E9CBDAB, 0xCEBDCEBB, 0xEEDEEECC, - 0x59796989, 0x8B9B9A9A, 0xEEDEDDCC, 0x7B9B8B9A, - 0x9C9C9BAA, 0xEEDEDECC, 0xBEBDCDBB, 0xCEBDCEBB, - 0xEEDEEECC, 0x9EBD8BAA, 0xBECDACBB, 0xEEEEDECB, - 0xBECEACBB, 0xBECEBDBB, 0xEEEEDECB, 0xDEDEDECC, - 0xDEDEDECB, 0xEEDEDECB, 0x6B8B8B9A, 0x9DACACBB, - 0xEEEEEEDC, 0x7C9C9CAA, 0xAEBDBDBB, 0xEEEEEEDC, - 0xAEADBEBB, 0xCEBEDECC, 0xEEEEEEDC, 0x7C9C9BAA, - 0xAEBDACBB, 0xEEEEEEDC, 0x9DACACBB, 0xAEBDBDBB, - 0xEEEEEEDC, 0xBEBDCEBC, 0xCEBEDECC, 0xEEDEEEDC, - 0xAEBD9CAB, 0xCEDEBDBB, 0xEEEEEEDC, 0xBECEBDBB, - 0xCEDEBDCB, 0xEEEEDECC, 0xDEDEDECC, 0xDEDEDECC, - 0xEECECEBB, 0x8DAC9CAB, 0xBEBDBDBB, 0xEEEEEEDC, - 0x9DADADBB, 0xCECECDCB, 0xEEEEEEDC, 0xAEADBDAB, - 0xCEBDCEBB, 0xEEDEEECB, 0x9DBDACBB, 0xCECEBDCB, - 0xEEEEEEDC, 0xAEBDBDBB, 0xCECECECC, 0xEEEEEEDC, - 0xAEBDBEBB, 0xCEBDCEBB, 0xEEDEEECB, 0xAEBD9CAA, - 0xCECEBDBB, 0xEEEEDECB, 0xAECDADBB, 0xCECEBDBB, - 0xEEEEDDCB, 0xBEBEBDAA, 0xBEBDBDAA, 0xCEBCBCA9, - ], [ - 0xF638388A, 0x498B8BBD, 0xEEEEEEEE, 0x3A6B8CAC, - 0x8DADBEDE, 0xEEEEEEEE, 0xCECEEEEE, 0xEEEEEEEE, - 0xEEEEEEEE, 0x3A8C6BAC, 0x8DBEADDE, 0xEEEEEEEE, - 0x8DAEAECE, 0xAECECEEE, 0xEEEEEEEE, 0xEEEEEEEE, - 0xEEEEEEEE, 0xEEEEEEEE, 0xBEEECEEE, 0xEEEEEEEE, - 0xEEEEEEEE, 0xEEEEEEEE, 0xEEEEEEEE, 0xEEEEEEEE, - 0xEEEEEEEE, 0xEEEEEEEE, 0xEEEEEEEE, 0x095A5A9B, - 0x7B9D9DCE, 0xEEEEEEEE, 0x5C7D9DBD, 0x9EBECEDE, - 0xEEEEEEEE, 0xCECEEEEE, 0xEEEEEEEE, 0xEEEEEEEE, - 0x4C9D7CBD, 0x9ECEBEDE, 0xEEEEEEEE, 0x8EBEBEDE, - 0x9ECEBEEE, 0xEEEEEEEE, 0xEEEEEEEE, 0xEEEEEEEE, - 0xEEEEEEEE, 0xBEEEBEEE, 0xEEEEEEEE, 0xEEEEEEEE, - 0xEEEEEEEE, 0xEEEEEEEE, 0xEEEEEEEE, 0xEEEEEEEE, - 0xEEEEEEEE, 0xEEEEEEEE, 0x5D9E9DCD, 0xAECECEEE, - 0xEEEEEEEE, 0x8EAEBEDE, 0xBEDEDEEE, 0xEEEEEEEE, - 0xCECEEEEE, 0xEEEEEEEE, 0xEEEEEEEE, 0x7EBEAEDE, - 0xBEEECEEE, 0xEEEEEEEE, 0x9ECECEEE, 0xBEDEDEEE, - 0xEEEEEEEE, 0xEEEEEEEE, 0xEEEEEEEE, 0xEEEEEEEE, - 0xBEEEBEEE, 0xEEEEEEEE, 0xEEEEEEEE, 0xDEEEEEEE, - 0xDEEEDEEE, 0xEEEEEEEE, 0xEEEEEEEE, 0xEEEEEEEE, - 0xEEEEEEEE, 0x7EBEBEDE, 0xCEEEDEEE, 0xEEEEEEEE, - 0x9ECECEEE, 0xDEEEEEEE, 0xEEEEEEEE, 0xBECEEEEE, - 0xEEEEEEEE, 0xEEEEEEEE, 0x9ECEBEEE, 0xDEEEDEEE, - 0xEEEEEEEE, 0xAEDECEEE, 0xDEEEEEEE, 0xEEEEEEEE, - 0xCEDEEEEE, 0xEEDEEEEE, 0xEEEEEEEE, 0xAEDEBEEE, - 0xEEEEDEEE, 0xEEEEEEEE, 0xCEEEDEEE, 0xDEEEDEEE, - 0xEEEEEEEE, 0xDEEEEEEE, 0xDEEEEEEE, 0xEEEEEEEE, - ]], - l12_tab: [ - [ - 0xF2825978, 0xB24956A8, 0x9B68A89B, 0xABB14936, 0xA79B36A5, 0x7A99B78B, 0x99BAAB58, 0xB68B8AC6, - 0x8B89B9AC, 0x8AC9ACBB, 0xB8AB9AC9, 0xAB8AB9AC, 0xAAB9ABAA, 0xBAAA0000 - ], [ - 0xF4D27EAD, 0xE16E69EC, 0xEE9CECEE, 0xEEE06E59, 0xEBEE49E8, 0xAEDDE9DE, 0xDEEEEE7A, 0xE9CECEE8, - 0xCEBCEEEE, 0xBEEEEEEE, 0xEBEEDEEE, 0xEECEEEEE, 0xEEEEEEEE, 0xEEEE0000 - ]], - l3_tab: [ - [ - 0xF2815979, 0xB25A46A9, 0xAC79B9AC, 0xBBC14946, 0xA8AC46A6, 0x8B9AC89C, 0x9ACBCC68, 0xB79CABD7, - 0x9C8ACBBD, 0xABDBBDCC, 0xD9ACABCB, 0xCDABCBCD, 0xCCDBCDCC, 0xDCCC0000 - ], [ - 0xF3D17FCF, 0xF27F6AFE, 0xEFBEFCEF, 0xEFF05F69, 0xFEFF59F9, 0xCFFFFDFF, 0xDFFFFF9A, 0xEBEFFFFB, - 0xCFCEFFFF, 0xFFFEFFFF, 0xFFEFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFE0000 - ]], - esc_tab: [ 0x01235566, 0x7888999A, 0xABBBCCCC, 0xCBCDDEED ], - }, - CoeffsCBDesc { - l0_tab: [ - [ - 0xF5373667, 0x58796989, 0xDEDECECD, 0x39596989, - 0x6B8B8B9A, 0xDEDEDEDD, 0x9E9DBDBC, 0xBEBDCECD, - 0xEEEEEEDD, 0x38695889, 0x6A8B8A9A, 0xDEDEDEDD, - 0x6B8B8B9A, 0x8C9C9CAB, 0xEEDEDEDD, 0xBEBECEBC, - 0xCECEDECD, 0xEEEEEEDE, 0x9EBD9CAB, 0xAECEADCC, - 0xEEEEDEDD, 0xAECEBDBC, 0xCEDEBDCC, 0xEEEEEEDD, - 0xDEDEDEDD, 0xEEEEEEDD, 0xEEEEEEDD, 0x18585878, - 0x6A8A8A9A, 0xDEDEDEDD, 0x4A6A7A8A, 0x8C9B9CAB, - 0xEEEEDEDD, 0x9E9DBEBC, 0xBEBECECD, 0xEEEEEEED, - 0x4A7A6A8A, 0x7C9C8BAB, 0xEEEEDEDD, 0x6B8C8BAB, - 0x8C9C9CAB, 0xDEDEDEDD, 0xBEBECECD, 0xBEAECECD, - 0xEEDEEEDD, 0x9EBD8CAB, 0xBECEADBC, 0xEEEEDEDD, - 0xAECEADBC, 0xBECEADCC, 0xEEEEDEDD, 0xDEDEDEDD, - 0xDEDEDECD, 0xEEEEDEDD, 0x5B8B7B9A, 0x9DACACBC, - 0xEEEEEEEE, 0x7D8C9CAB, 0xAEBDBDBC, 0xEEEEEEEE, - 0x9E9DBEBC, 0xCEBEDECD, 0xEEEEEEEE, 0x7C9C8CAB, - 0xAEBDADBC, 0xEEEEEEEE, 0x8DADADBC, 0xAEBDBDBC, - 0xEEEEEEEE, 0xBEBECECD, 0xBEAECECD, 0xEECEEEDE, - 0x9EBE9DBC, 0xCECEBDCD, 0xEEEEEEEE, 0xAECEBECC, - 0xBECEADCD, 0xEEEEDEDD, 0xDEEEDEDD, 0xCEDEDECD, - 0xDECEDECD, 0x7DAD9DBC, 0xBEBEBDCC, 0xEEEEEEED, - 0x8EADADBC, 0xCECECECC, 0xEEEEEEDD, 0x9E9DBEBC, - 0xCEBEDECC, 0xEEEEEEDD, 0x8EBDADBC, 0xBECEBECC, - 0xEEEEEEDD, 0x9EBEAEBC, 0xBECECECC, 0xEEEEEEED, - 0xAEAEBEBC, 0xBEAECECC, 0xEEDEEEDC, 0x9EBE9DAB, - 0xCEDEBDBC, 0xEEEEEEDD, 0xAEBEADBC, 0xBECEBEBC, - 0xEEEEDEDC, 0xBEBECEBC, 0xBEBEBEBB, 0xCEBCCDBB, - ], [ - 0xF649398B, 0x5A9C9CDD, 0xDDDDDDDD, 0x3B6C9DBD, - 0x8DBDCDDD, 0xDDDDDDDD, 0xCDDDDDDD, 0xDDDDDDDD, - 0xDDDDDDDD, 0x3B9D6CBD, 0x8DCDBDDD, 0xDDDDDDDD, - 0x8DBDBDDD, 0xADDDDDDD, 0xDDDDDDDD, 0xDDDDDDDD, - 0xDDDDDDDD, 0xDDDDDDDD, 0xBDDDCDDD, 0xDDDDDDDD, - 0xDDDDDDDD, 0xDDDDDDDD, 0xDDDDDDDD, 0xDDDDDDDD, - 0xDDDDDDDD, 0xDDDDDDDD, 0xDDDDDDDD, 0x0A6B5BAC, - 0x6BADADDD, 0xDDDDDDDD, 0x4C8D9DCD, 0x9DBDCDDD, - 0xDDDDDDDD, 0xCDCDDDDD, 0xDDDDDDDD, 0xDDDDDDDD, - 0x4DAD7DCD, 0x9DDDCDDD, 0xDDDDDDDD, 0x8DBDCDDD, - 0x9DDDCDDD, 0xDDDDDDDD, 0xDDDDDDDD, 0xDDDDDDDD, - 0xDDDDDDDD, 0xBDDDBDDD, 0xDDDDDDDD, 0xDDDDDDDD, - 0xDDDDDDDD, 0xDDDDDDDD, 0xDDDDDDDD, 0xDDDDDDDD, - 0xDDDDDDDD, 0xDDDDDDDD, 0x4D9D8DCD, 0x9DCDBDDD, - 0xDDDDDDDD, 0x7DADBDDD, 0xBDDDDDDD, 0xDDDDDDDD, - 0xBDBDDDDD, 0xDDDDDDDD, 0xDDDDDDDD, 0x6DBD9DDD, - 0xBDDDDDDD, 0xDDDDDDDD, 0x9DDDCDDD, 0xADDDDDDD, - 0xDDDDDDDD, 0xDDDDDDDD, 0xDDDDDDDD, 0xDDDDDDDD, - 0xADDDADDD, 0xDDDDDDDD, 0xDDDDDDDD, 0xDDDDDDDD, - 0xDDDDDDDD, 0xDDDDDDDD, 0xDDDDDDDD, 0xDDDDDDDD, - 0xDDDDDDDD, 0x6DBDADDD, 0xBDDDCDDD, 0xDDDDDDDD, - 0x9DBDCDDD, 0xCDDDDDDD, 0xDDDDDDDD, 0xBDBDDDDD, - 0xDDDDDDDD, 0xDDDDDDDD, 0x8DDDBDDD, 0xDDDDDDDD, - 0xDDDDDDDD, 0xADDDCDDD, 0xDDDDDDDD, 0xDDDDDDDD, - 0xCDDDDDDD, 0xDDDDDDDD, 0xDDDDDDDD, 0xADDDBDDD, - 0xDDDDDDDD, 0xDDDDDDDD, 0xBDDDDDDD, 0xDDDDDDDD, - 0xDDDDDDDD, 0xDDDDDDDD, 0xDDDDDDDD, 0xDDDDDEED, - ]], - l12_tab: [ - [ - 0xF3A26B8A, 0xD26B57CA, 0xBD89CABD, 0xCDE05B47, 0xC8AD47C6, 0x8DABD8AD, 0xABDCDE58, 0xC79D9BE7, - 0x9D8AEABE, 0x9BEBBEDC, 0xE9ADABDA, 0xCE9BDABE, 0xBCEACEBC, 0xDCCD0000 - ], [ - 0xF4D26EAC, 0xE17E69EE, 0xEEACEDEE, 0xEEE06C58, 0xEBDE49E8, 0xAEDDEADE, 0xEEEEEE79, 0xEACEEEE8, - 0xAECCEDDE, 0xBEEEEEEE, 0xEDDEDEEE, 0xEEDEEEEE, 0xEEEEEEEE, 0xEEEE0000 - ]], - l3_tab: [ - [ - 0xF3B25B9B, 0xE25B57CA, 0xCE8AD9BE, 0xDDE04A47, 0xCACE47C7, 0x8DBCE9BD, 0xABEDDE68, 0xB8ADCDE8, - 0xADABECDE, 0xBDECDEEE, 0xEBCDCDEE, 0xEEBCECDE, 0xEEEDDEEE, 0xEEEE0000 - ], [ - 0xF3D27DEE, 0xE18E69EE, 0xEEAEEEBE, 0xEEE05E6A, 0xEEEE59E8, 0xBEEEEBEE, 0xEEEEEEAA, 0xEEEEEEEB, - 0xEEEEEEEE, 0xEBEEEEEE, 0xEEEEEEEE, 0xEEEEEEEE, 0xEEEEEEEE, 0xEEED0000 - ]], - esc_tab: [ 0x01234577, 0x8899AABD, 0xDEEEEEEE, 0xEDDDDEED ], - }, -]; diff --git a/src/codecs/real/rv60dsp.rs b/src/codecs/real/rv60dsp.rs deleted file mode 100644 index 3850acc..0000000 --- a/src/codecs/real/rv60dsp.rs +++ /dev/null @@ -1,928 +0,0 @@ -use crate::frame::NAVideoBuffer; -use crate::codecs::MV; -use crate::codecs::blockdsp::edge_emu; - -fn clip8(val: i16) -> u8 { val.min(255).max(0) as u8 } - -macro_rules! el { - ($s: ident, $o: expr) => ( $s[$o] as i16 ) -} - -macro_rules! filter { - (01; $s: ident, $o: expr, $step: expr) => ( - clip8((( el!($s, $o - 2 * $step) - -5 * el!($s, $o - 1 * $step) - +52 * el!($s, $o - 0 * $step) - +20 * el!($s, $o + 1 * $step) - -5 * el!($s, $o + 2 * $step) - + el!($s, $o + 3 * $step) + 32) >> 6) as i16) - ); - (02; $s: ident, $o: expr, $step: expr) => ( - clip8((( el!($s, $o - 2 * $step) - -5 * el!($s, $o - 1 * $step) - +20 * el!($s, $o - 0 * $step) - +20 * el!($s, $o + 1 * $step) - -5 * el!($s, $o + 2 * $step) - + el!($s, $o + 3 * $step) + 16) >> 5) as i16) - ); - (03; $s: ident, $o: expr, $step: expr) => ( - clip8((( el!($s, $o - 2 * $step) - -5 * el!($s, $o - 1 * $step) - +20 * el!($s, $o - 0 * $step) - +52 * el!($s, $o + 1 * $step) - -5 * el!($s, $o + 2 * $step) - + el!($s, $o + 3 * $step) + 32) >> 6) as i16) - ); -} - -macro_rules! filter_row { - ($d: ident, $do: expr, $s: ident, $so: expr, $step: expr, $size: expr, $mode: expr) => ({ - match $mode { - 1 => { - for x in 0..$size { - $d[$do + x] = filter!(01; $s, $so + x, $step); - } - }, - 2 => { - for x in 0..$size { - $d[$do + x] = filter!(02; $s, $so + x, $step); - } - }, - 3 => { - for x in 0..$size { - $d[$do + x] = filter!(03; $s, $so + x, $step); - } - }, - _ => {}, - }; - }); -} - -fn luma_mc(dst: &mut [u8], mut didx: usize, dstride: usize, src: &[u8], mut sidx: usize, sstride: usize, w: usize, h: usize, cx: usize, cy: usize) { - if (cx == 0) && (cy == 0) { - for _ in 0..h { - for x in 0..w { dst[didx + x] = src[sidx + x]; } - didx += dstride; - sidx += sstride; - } - } else if cy == 0 { - for _ in 0..h { - filter_row!(dst, didx, src, sidx, 1, w, cx); - didx += dstride; - sidx += sstride; - } - } else if cx == 0 { - for _ in 0..h { - filter_row!(dst, didx, src, sidx, sstride, w, cy); - didx += dstride; - sidx += sstride; - } - } else if (cx != 3) || (cy != 3) { - let mut tmp: [u8; 70 * 64] = [0; 70 * 64]; - for y in 0..h+5 { - filter_row!(tmp, y * 64, src, sidx - sstride * 2, 1, w, cx); - sidx += sstride; - } - for y in 0..h { - filter_row!(dst, didx, tmp, (y + 2) * 64, 64, w, cy); - didx += dstride; - } - } else { - for _ in 0..h { - for x in 0..w { - dst[didx + x] = ((el!(src, sidx + x) + el!(src, sidx + x + 1) + - el!(src, sidx + x + sstride) + el!(src, sidx + x + 1 + sstride) + 2) >> 2) as u8; - } - didx += dstride; - sidx += sstride; - } - } -} - -fn chroma_mc(dst: &mut [u8], mut didx: usize, dstride: usize, src: &[u8], mut sidx: usize, sstride: usize, w: usize, h: usize, x: usize, y: usize) { - if (x == 0) && (y == 0) { - for _ in 0..h { - for x in 0..w { dst[didx + x] = src[sidx + x]; } - didx += dstride; - sidx += sstride; - } - return; - } - if (x > 0) && (y > 0) { - let a = ((4 - x) * (4 - y)) as u16; - let b = (( x) * (4 - y)) as u16; - let c = ((4 - x) * ( y)) as u16; - let d = (( x) * ( y)) as u16; - for _ in 0..h { - for x in 0..w { - dst[didx + x] = ((a * (src[sidx + x] as u16) - + b * (src[sidx + x + 1] as u16) - + c * (src[sidx + x + sstride] as u16) - + d * (src[sidx + x + 1 + sstride] as u16) + 8) >> 4) as u8; - } - didx += dstride; - sidx += sstride; - } - } else { - let a = ((4 - x) * (4 - y)) as u16; - let e = (( x) * (4 - y) + (4 - x) * ( y)) as u16; - let step = if y > 0 { sstride } else { 1 }; - for _ in 0..h { - for x in 0..w { - dst[didx + x] = ((a * (src[sidx + x] as u16) - + e * (src[sidx + x + step] as u16) + 8) >> 4) as u8; - } - didx += dstride; - sidx += sstride; - } - } -} - -fn check_pos(x: usize, y: usize, cw: usize, ch: usize, w: usize, h: usize, dx: i16, dy: i16, e0: isize, e1: isize, e2: isize, e3: isize) -> bool { - let xn = (x as isize) + (dx as isize); - let yn = (y as isize) + (dy as isize); - - (xn - e0 >= 0) && (xn + (cw as isize) + e1 <= (w as isize)) && (yn - e2 >= 0) && (yn + (ch as isize) + e3 <= (h as isize)) -} - -macro_rules! diff{ - ($src: ident, $e1: expr, $e2: expr) => ( - ($src[$e1] as i16) - ($src[$e2] as i16) - ) -} -macro_rules! strength{ - ($el: expr, $lim: expr) => (if $el < $lim { 3 } else { 1 }) -} -fn clip_symm(val: i16, lim: i16) -> i16 { val.max(-lim).min(lim) } - -fn filter_luma_edge(dst: &mut [u8], mut offset: usize, step: usize, stride: usize, mode1: u8, mode2: u8, lim1: i16, lim2: i16) { - let mut diff_q1q0: [i16; 4] = [0; 4]; - let mut diff_p1p0: [i16; 4] = [0; 4]; - for i in 0..4 { - let off = offset + i * stride; - diff_q1q0[i] = diff!(dst, off - 2 * step, off - step); - diff_p1p0[i] = diff!(dst, off + step, off); - } - let str_p = strength!(diff_q1q0[0] + diff_q1q0[1] + diff_q1q0[2] + diff_q1q0[3], lim2); - let str_q = strength!(diff_p1p0[0] + diff_p1p0[1] + diff_p1p0[2] + diff_p1p0[3], lim2); - if str_p + str_q > 2 { - let msum = ((mode1 + mode2 + str_q + str_p) >> 1) as i16; - let (maxprod, weak) = if (str_q == 1) || (str_p == 1) { (512, true) } else { (384, false) }; - for y in 0..4 { - let diff_p0q0 = diff!(dst, offset, offset - step); - if (diff_p0q0 != 0) && (lim1 * diff_p0q0.abs() < maxprod) { - let diff_q1q2 = diff!(dst, offset - 2 * step, offset - 3 * step); - let diff_p1p2 = diff!(dst, offset + step, offset + 2 * step); - let delta = if weak { - clip_symm((diff_p0q0 + 1) >> 1, msum >> 1) - } else { - let diff_strg = (diff!(dst, offset - 2 * step, offset + step) + 4 * diff_p0q0 + 4) >> 3; - clip_symm(diff_strg, msum) - }; - dst[offset - step] = clip8((dst[offset - step] as i16) + delta); - dst[offset] = clip8((dst[offset] as i16) - delta); - if (str_q != 1) && (diff_q1q2.abs() <= (lim1 >> 2)) { - let diff = (diff_q1q0[y] + diff_q1q2 - delta) >> 1; - let delta_q1 = if weak { - clip_symm(diff, (mode1 >> 1) as i16) - } else { - clip_symm(diff, mode1 as i16) - }; - dst[offset - 2 * step] = clip8((dst[offset - 2 * step] as i16) - delta_q1); - } - if (str_p != 1) && (diff_p1p2.abs() <= (lim1 >> 2)) { - let diff = (diff_p1p0[y] + diff_p1p2 + delta) >> 1; - let delta_p1 = if weak { - clip_symm(diff, (mode2 >> 1) as i16) - } else { - clip_symm(diff, mode2 as i16) - }; - dst[offset + step] = clip8((dst[offset + step] as i16) - delta_p1); - } - } - offset += stride; - } - } -} -fn filter_chroma_edge(dst: &mut [u8], mut offset: usize, step: usize, stride: usize, mode1: u8, mode2: u8, lim1: i16, lim2: i16) { - let diff_q = 4 * diff!(dst, offset - 2 * step, offset - step).abs(); - let diff_p = 4 * diff!(dst, offset + step, offset ).abs(); - let str_q = strength!(diff_q, lim2); - let str_p = strength!(diff_p, lim2); - if str_p + str_q > 2 { - let msum = ((mode1 + mode2 + str_q + str_p) >> 1) as i16; - let (maxprod, weak) = if (str_q == 1) || (str_p == 1) { (512, true) } else { (384, false) }; - for _ in 0..2 { - let diff_pq = diff!(dst, offset, offset - step); - if (diff_pq != 0) && (lim1 * diff_pq.abs() < maxprod) { - let delta = if weak { - clip_symm((diff_pq + 1) >> 1, msum >> 1) - } else { - let diff_strg = (diff!(dst, offset - 2 * step, offset + step) + 4 * diff_pq + 4) >> 3; - clip_symm(diff_strg, msum) - }; - dst[offset - step] = clip8((dst[offset - step] as i16) + delta); - dst[offset] = clip8((dst[offset] as i16) - delta); - } - offset += stride; - } - } -} - -pub struct RV60DeblockParams { - pub deblock_chroma: bool, - pub width: usize, - pub height: usize, - pub dblkstride: usize, -} - -pub struct RV60DSP {} -/*pub fn rv6_transform4x4_dc(coeffs: &mut [i16]) { - let dc = (((coeffs[0] * 13 + 0x10) >> 5) * 13 + 0x10) >> 5; - for el in coeffs.iter_mut().take(16) { - *el = dc; - } -}*/ - -impl RV60DSP { - pub fn new() -> Self { Self{} } - pub fn transform4x4(&self, blk: &mut [i16]) { - let mut tmp: [i32; 4 * 4] = [0; 4 * 4]; - - for i in 0..4 { - let a = blk[i + 0 * 4] as i32; - let b = blk[i + 1 * 4] as i32; - let c = blk[i + 2 * 4] as i32; - let d = blk[i + 3 * 4] as i32; - - let t0 = 13 * (a + c); - let t1 = 13 * (a - c); - let t2 = 7 * b - 17 * d; - let t3 = 7 * d + 17 * b; - tmp[i + 0 * 4] = (t0 + t3 + 0x10) >> 5; - tmp[i + 1 * 4] = (t1 + t2 + 0x10) >> 5; - tmp[i + 2 * 4] = (t1 - t2 + 0x10) >> 5; - tmp[i + 3 * 4] = (t0 - t3 + 0x10) >> 5; - } - for (dst, src) in blk.chunks_mut(4).zip(tmp.chunks(4)) { - let a = src[0]; - let b = src[1]; - let c = src[2]; - let d = src[3]; - - let t0 = 13 * (a + c); - let t1 = 13 * (a - c); - let t2 = 7 * b - 17 * d; - let t3 = 7 * d + 17 * b; - dst[0] = ((t0 + t3 + 0x10) >> 5) as i16; - dst[1] = ((t1 + t2 + 0x10) >> 5) as i16; - dst[2] = ((t1 - t2 + 0x10) >> 5) as i16; - dst[3] = ((t0 - t3 + 0x10) >> 5) as i16; - } - } - /*pub fn transform8x8_dc(&self, blk: &mut [i16]) { - assert!(blk.len() >= 8 * 8); - let dc = (((coeffs[0] * 37 + 0x40) >> 7) * 37 + 0x40) >> 7; - for el in coeffs.iter_mut().take(8 * 8) { - *el = dc; - } - }*/ - pub fn transform8x8(&self, blk: &mut [i16]) { - assert!(blk.len() >= 8 * 8); - let mut tmp: [i32; 8 * 8] = [0; 8 * 8]; - for i in 0..8 { - let s0 = blk[i + 0 * 8] as i32; - let s1 = blk[i + 1 * 8] as i32; - let s2 = blk[i + 2 * 8] as i32; - let s3 = blk[i + 3 * 8] as i32; - let s4 = blk[i + 4 * 8] as i32; - let s5 = blk[i + 5 * 8] as i32; - let s6 = blk[i + 6 * 8] as i32; - let s7 = blk[i + 7 * 8] as i32; - - let t0 = 37 * (s0 + s4); - let t1 = 37 * (s0 - s4); - let t2 = 48 * s2 + 20 * s6; - let t3 = 20 * s2 - 48 * s6; - let t4 = t0 + t2; - let t5 = t0 - t2; - let t6 = t1 + t3; - let t7 = t1 - t3; - let t8 = 51 * s1 + 43 * s3 + 29 * s5 + 10 * s7; - let t9 = 43 * s1 - 10 * s3 - 51 * s5 - 29 * s7; - let ta = 29 * s1 - 51 * s3 + 10 * s5 + 43 * s7; - let tb = 10 * s1 - 29 * s3 + 43 * s5 - 51 * s7; - tmp[i + 0 * 8] = (t4 + t8 + 0x40) >> 7; - tmp[i + 1 * 8] = (t6 + t9 + 0x40) >> 7; - tmp[i + 2 * 8] = (t7 + ta + 0x40) >> 7; - tmp[i + 3 * 8] = (t5 + tb + 0x40) >> 7; - tmp[i + 4 * 8] = (t5 - tb + 0x40) >> 7; - tmp[i + 5 * 8] = (t7 - ta + 0x40) >> 7; - tmp[i + 6 * 8] = (t6 - t9 + 0x40) >> 7; - tmp[i + 7 * 8] = (t4 - t8 + 0x40) >> 7; - } - for (dst, src) in blk.chunks_mut(8).zip(tmp.chunks(8)) { - let s0 = src[0]; - let s1 = src[1]; - let s2 = src[2]; - let s3 = src[3]; - let s4 = src[4]; - let s5 = src[5]; - let s6 = src[6]; - let s7 = src[7]; - - let t0 = 37 * (s0 + s4); - let t1 = 37 * (s0 - s4); - let t2 = 48 * s2 + 20 * s6; - let t3 = 20 * s2 - 48 * s6; - let t4 = t0 + t2; - let t5 = t0 - t2; - let t6 = t1 + t3; - let t7 = t1 - t3; - let t8 = 51 * s1 + 43 * s3 + 29 * s5 + 10 * s7; - let t9 = 43 * s1 - 10 * s3 - 51 * s5 - 29 * s7; - let ta = 29 * s1 - 51 * s3 + 10 * s5 + 43 * s7; - let tb = 10 * s1 - 29 * s3 + 43 * s5 - 51 * s7; - dst[0] = ((t4 + t8 + 0x40) >> 7) as i16; - dst[1] = ((t6 + t9 + 0x40) >> 7) as i16; - dst[2] = ((t7 + ta + 0x40) >> 7) as i16; - dst[3] = ((t5 + tb + 0x40) >> 7) as i16; - dst[4] = ((t5 - tb + 0x40) >> 7) as i16; - dst[5] = ((t7 - ta + 0x40) >> 7) as i16; - dst[6] = ((t6 - t9 + 0x40) >> 7) as i16; - dst[7] = ((t4 - t8 + 0x40) >> 7) as i16; - } - } - /*pub fn transform16x16_dc(&self, blk: &mut [i16; 16 * 16]) { - let dc = (((coeffs[0] * 26 + 0x40) >> 7) * 26 + 0x40) >> 7; - for el in coeffs.iter_mut() { - *el = dc; - } - }*/ - #[allow(non_snake_case)] - fn transform16(blk: &mut [i16; 16 * 16], off: usize, step: usize) { - let src0 = blk[off + 0 * step] as i32; - let src1 = blk[off + 1 * step] as i32; - let src2 = blk[off + 2 * step] as i32; - let src3 = blk[off + 3 * step] as i32; - let src4 = blk[off + 4 * step] as i32; - let src5 = blk[off + 5 * step] as i32; - let src6 = blk[off + 6 * step] as i32; - let src7 = blk[off + 7 * step] as i32; - let src8 = blk[off + 8 * step] as i32; - let src9 = blk[off + 9 * step] as i32; - let srcA = blk[off + 10 * step] as i32; - let srcB = blk[off + 11 * step] as i32; - let srcC = blk[off + 12 * step] as i32; - let srcD = blk[off + 13 * step] as i32; - let srcE = blk[off + 14 * step] as i32; - let srcF = blk[off + 15 * step] as i32; - let t0 = 26 * (src0 + src8); - let t1 = 26 * (src0 - src8); - let t2 = 14 * src4 - 34 * srcC; - let t3 = 34 * src4 + 14 * srcC; - let t4 = t0 + t3; - let t5 = t0 - t3; - let t6 = t1 + t2; - let t7 = t1 - t2; - let tmp00 = 31 * src2 + -7 * src6 + -36 * srcA + -20 * srcE; - let tmp01 = 36 * src2 + 31 * src6 + 20 * srcA + 7 * srcE; - let tmp02 = 20 * src2 + -36 * src6 + 7 * srcA + 31 * srcE; - let tmp03 = 7 * src2 + -20 * src6 + 31 * srcA + -36 * srcE; - let tm0 = t4 + tmp01; - let tm1 = t4 - tmp01; - let tm2 = t5 + tmp03; - let tm3 = t5 - tmp03; - let tm4 = t6 + tmp00; - let tm5 = t6 - tmp00; - let tm6 = t7 + tmp02; - let tm7 = t7 - tmp02; - let tt0 = 37 * src1 + 35 * src3 + 32 * src5 + 28 * src7 + 23 * src9 + 17 * srcB + 11 * srcD + 4 * srcF; - let tt1 = 35 * src1 + 23 * src3 + 4 * src5 + -17 * src7 + -32 * src9 + -37 * srcB + -28 * srcD + -11 * srcF; - let tt2 = 32 * src1 + 4 * src3 + -28 * src5 + -35 * src7 + -11 * src9 + 23 * srcB + 37 * srcD + 17 * srcF; - let tt3 = 28 * src1 + -17 * src3 + -35 * src5 + 4 * src7 + 37 * src9 + 11 * srcB + -32 * srcD + -23 * srcF; - let tt4 = 23 * src1 + -32 * src3 + -11 * src5 + 37 * src7 + -4 * src9 + -35 * srcB + 17 * srcD + 28 * srcF; - let tt5 = 17 * src1 + -37 * src3 + 23 * src5 + 11 * src7 + -35 * src9 + 28 * srcB + 4 * srcD + -32 * srcF; - let tt6 = 11 * src1 + -28 * src3 + 37 * src5 + -32 * src7 + 17 * src9 + 4 * srcB + -23 * srcD + 35 * srcF; - let tt7 = 4 * src1 + -11 * src3 + 17 * src5 + -23 * src7 + 28 * src9 + -32 * srcB + 35 * srcD + -37 * srcF; - blk[off + 0 * step] = ((tm0 + tt0 + 64) >> 7) as i16; - blk[off + 1 * step] = ((tm4 + tt1 + 64) >> 7) as i16; - blk[off + 2 * step] = ((tm6 + tt2 + 64) >> 7) as i16; - blk[off + 3 * step] = ((tm4 + tt3 + 64) >> 7) as i16; - blk[off + 4 * step] = ((tm3 + tt4 + 64) >> 7) as i16; - blk[off + 5 * step] = ((tm7 + tt5 + 64) >> 7) as i16; - blk[off + 6 * step] = ((tm5 + tt6 + 64) >> 7) as i16; - blk[off + 7 * step] = ((tm1 + tt7 + 64) >> 7) as i16; - blk[off + 8 * step] = ((tm1 - tt7 + 64) >> 7) as i16; - blk[off + 9 * step] = ((tm5 - tt6 + 64) >> 7) as i16; - blk[off + 10 * step] = ((tm7 - tt5 + 64) >> 7) as i16; - blk[off + 11 * step] = ((tm3 - tt4 + 64) >> 7) as i16; - blk[off + 12 * step] = ((tm2 - tt3 + 64) >> 7) as i16; - blk[off + 13 * step] = ((tm6 - tt2 + 64) >> 7) as i16; - blk[off + 14 * step] = ((tm4 - tt1 + 64) >> 7) as i16; - blk[off + 15 * step] = ((tm0 - tt0 + 64) >> 7) as i16; - } - pub fn transform16x16(&self, blk: &mut [i16; 16 * 16]) { - for i in 0..16 { - Self::transform16(blk, i, 16); - } - for i in 0..16 { - Self::transform16(blk, i * 16, 1); - } - } - - pub fn add_block(&self, dst: &mut [u8], mut doff: usize, dstride: usize, blk: &[i16], size: usize) { - for y in 0..size { - for x in 0..size { - dst[doff + x] = clip8((dst[doff + x] as i16) + blk[x + y * size]); - } - doff += dstride; - } - } - fn avg(&self, dst: &mut [u8], mut didx: usize, dstride: usize, - src: &[u8], mut sidx: usize, sstride: usize, - w: usize, h: usize) { - for _ in 0..h { - for x in 0..w { - dst[didx + x] = (((dst[didx + x] as u16) + (src[sidx + x] as u16)) >> 1) as u8; - } - didx += dstride; - sidx += sstride; - } - } - pub fn do_avg(&self, frame: &mut NAVideoBuffer<u8>, prev_frame: &NAVideoBuffer<u8>, x: usize, y: usize, w: usize, h: usize) { - for comp in 0..3 { - let dstride = frame.get_stride(comp); - let sstride = prev_frame.get_stride(comp); - let doff = if comp == 0 { x + y * dstride } else { frame.get_offset(comp) + (x >> 1) + (y >> 1) * dstride }; - let soff = prev_frame.get_offset(comp); - let mut ddata = frame.get_data_mut(); - let dst: &mut [u8] = ddata.as_mut_slice(); - let sdata = prev_frame.get_data(); - let src: &[u8] = sdata.as_slice(); - - if comp == 0 { - self.avg(dst, doff, dstride, src, soff, sstride, w, h); - } else { - self.avg(dst, doff, dstride, src, soff, sstride, w >> 1, h >> 1); - } - } - } - pub fn do_mc(&self, frame: &mut NAVideoBuffer<u8>, prev_frame: &NAVideoBuffer<u8>, x: usize, y: usize, w: usize, h: usize, mv: MV, avg: bool) { - { // luma - let dstride = frame.get_stride(0); - let doffset = frame.get_offset(0) + (if !avg { x + y * dstride } else { 0 }); - let mut data = frame.get_data_mut(); - let dst: &mut [u8] = data.as_mut_slice(); - - let (w_, h_) = prev_frame.get_dimensions(0); - let fw = (w_ + 15) & !15; - let fh = (h_ + 15) & !15; - - let dx = mv.x >> 2; - let cx = (mv.x & 3) as usize; - let dy = mv.y >> 2; - let cy = (mv.y & 3) as usize; - - if check_pos(x, y, w, h, fw, fh, dx, dy, RV60_EDGE1[cx], RV60_EDGE2[cx], RV60_EDGE1[cy], RV60_EDGE2[cy]) { - let sstride = prev_frame.get_stride(0); - let mut soffset = prev_frame.get_offset(0) + x + y * sstride; - let data = prev_frame.get_data(); - let src: &[u8] = data.as_slice(); - soffset = ((soffset as isize) + (dx as isize) + (dy as isize) * (sstride as isize)) as usize; - luma_mc(dst, doffset, dstride, src, soffset, sstride, w, h, cx, cy); - } else { - let mut ebuf: [u8; 70*70] = [0; 70*70]; - edge_emu(prev_frame, (x as isize) + (dx as isize) - 2, (y as isize) + (dy as isize) - 2, w+5, h+5, &mut ebuf, 70, 0); - luma_mc(dst, doffset, dstride, &ebuf, 70*2 + 2, 70, w, h, cx, cy); - } - } - let (w_, h_) = prev_frame.get_dimensions(1); - let fw = (w_ + 7) & !7; - let fh = (h_ + 7) & !7; - let mvx = mv.x / 2; - let mvy = mv.y / 2; - let dx = mvx >> 2; - let cx = (mvx & 3) as usize; - let dy = mvy >> 2; - let cy = (mvy & 3) as usize; - let cw = w >> 1; - let ch = h >> 1; - - for comp in 1..3 { // chroma - let dstride = frame.get_stride(comp); - let doffset = frame.get_offset(comp) + (if !avg { (x >> 1) + (y >> 1) * dstride } else { 0 }); - let mut data = frame.get_data_mut(); - let dst: &mut [u8] = data.as_mut_slice(); - if check_pos(x >> 1, y >> 1, cw, ch, fw, fh, dx, dy, 0, 1, 0, 1) { - let sstride = prev_frame.get_stride(comp); - let mut soffset = prev_frame.get_offset(comp) + (x >> 1) + (y >> 1) * sstride; - let data = prev_frame.get_data(); - let src: &[u8] = data.as_slice(); - soffset = ((soffset as isize) + (dx as isize) + (dy as isize) * (sstride as isize)) as usize; - chroma_mc(dst, doffset, dstride, src, soffset, sstride, cw, ch, cx, cy); - } else { - let mut ebuf: [u8; 40*40] = [0; 40*40]; - edge_emu(prev_frame, ((x >> 1) as isize) + (dx as isize), ((y >> 1) as isize) + (dy as isize), cw+1, ch+1, &mut ebuf, 40, comp); - chroma_mc(dst, doffset, dstride, &ebuf, 0, 40, cw, ch, cx, cy); - } - } - } - fn deblock_edge4_ver(&self, frame: &mut NAVideoBuffer<u8>, xpos: usize, ypos: usize, - dblk_l: u8, dblk_r: u8, deblock_chroma: bool) { - let qp_l = dblk_l >> 2; - let str_l = dblk_l & 3; - let qp_r = dblk_r >> 2; - let str_r = dblk_r & 3; - let dl_l = &RV60_DEB_LIMITS[qp_l as usize]; - let dl_r = &RV60_DEB_LIMITS[qp_r as usize]; - let mode_l = if str_l != 0 { dl_l[(str_l - 1) as usize] } else { 0 }; - let mode_r = if str_r != 0 { dl_r[(str_r - 1) as usize] } else { 0 }; - let lim1 = dl_r[2] as i16; - let lim2 = (dl_r[3] * 4) as i16; - { - let stride = frame.get_stride(0); - let offset = frame.get_offset(0) + xpos + ypos * stride; - let mut data = frame.get_data_mut(); - let dst: &mut [u8] = data.as_mut_slice(); - filter_luma_edge(dst, offset, 1, stride, mode_l, mode_r, lim1, lim2); - } - if ((str_l | str_r) >= 2) && deblock_chroma { - for comp in 1..2 { - let stride = frame.get_stride(comp); - let offset = frame.get_offset(comp) + (xpos >> 1) + (ypos >> 1) * stride; - let mut data = frame.get_data_mut(); - let dst: &mut [u8] = data.as_mut_slice(); - filter_chroma_edge(dst, offset, 1, stride, mode_l, mode_r, lim1, lim2); - } - } - } - fn deblock_edge4_hor(&self, frame: &mut NAVideoBuffer<u8>, xpos: usize, ypos: usize, - dblk_t: u8, dblk_d: u8, deblock_chroma: bool) { - let qp_t = dblk_t >> 2; - let str_t = dblk_t & 3; - let qp_d = dblk_d >> 2; - let str_d = dblk_d & 3; - let dl_t = &RV60_DEB_LIMITS[qp_t as usize]; - let dl_d = &RV60_DEB_LIMITS[qp_d as usize]; - let mode_t = if str_t != 0 { dl_t[(str_t - 1) as usize] } else { 0 }; - let mode_d = if str_d != 0 { dl_d[(str_d - 1) as usize] } else { 0 }; - let lim1 = dl_d[2] as i16; - let lim2 = (dl_d[3] * 4) as i16; - { - let stride = frame.get_stride(0); - let offset = frame.get_offset(0) + xpos + ypos * stride; - let mut data = frame.get_data_mut(); - let dst: &mut [u8] = data.as_mut_slice(); - filter_luma_edge(dst, offset, stride, 1, mode_t, mode_d, lim1, lim2); - } - if ((str_t | str_d) >= 2) && deblock_chroma { - for comp in 1..2 { - let stride = frame.get_stride(comp); - let offset = frame.get_offset(comp) + (xpos >> 1) + (ypos >> 1) * stride; - let mut data = frame.get_data_mut(); - let dst: &mut [u8] = data.as_mut_slice(); - filter_chroma_edge(dst, offset, stride, 1, mode_t, mode_d, lim1, lim2); - } - } - } - fn deblock8x8(&self, dparams: &RV60DeblockParams, frame: &mut NAVideoBuffer<u8>, - xpos: usize, ypos: usize, top_str: &[u8], left_str: &[u8], dblkpos: usize) { - if xpos > 0 { - if ypos > 0 { - let str_l = left_str[dblkpos - dparams.dblkstride]; - let str_r = left_str[dblkpos]; - if (str_l | str_r) != 0 { - self.deblock_edge4_ver(frame, xpos, ypos - 4, str_l, str_r, dparams.deblock_chroma); - } - } - { - let str_l = left_str[dblkpos]; - let str_r = left_str[dblkpos + dparams.dblkstride]; - if (str_l | str_r) != 0 { - self.deblock_edge4_ver(frame, xpos, ypos + 0, str_l, str_r, dparams.deblock_chroma); - } - } - if ypos + 4 >= dparams.height { - let str_l = left_str[dblkpos + dparams.dblkstride]; - let str_r = left_str[dblkpos + dparams.dblkstride * 2]; - if (str_l | str_r) != 0 { - self.deblock_edge4_ver(frame, xpos, ypos + 4, str_l, str_r, dparams.deblock_chroma); - } - } - } - if ypos > 0 { - if xpos > 0 { - let str_t = top_str[dblkpos - 1]; - let str_d = top_str[dblkpos]; - if (str_t | str_d) != 0 { - self.deblock_edge4_hor(frame, xpos - 4, ypos, str_t, str_d, dparams.deblock_chroma); - } - } - { - let str_t = top_str[dblkpos]; - let str_d = top_str[dblkpos + 1]; - if (str_t | str_d) != 0 { - self.deblock_edge4_hor(frame, xpos + 0, ypos, str_t, str_d, dparams.deblock_chroma); - } - } - if xpos + 4 >= dparams.width { - let str_t = top_str[dblkpos + 1]; - let str_d = top_str[dblkpos + 2]; - if (str_t | str_d) != 0 { - self.deblock_edge4_hor(frame, xpos + 4, ypos, str_t, str_d, dparams.deblock_chroma); - } - } - } - } - pub fn do_deblock(&self, dparams: &RV60DeblockParams, frame: &mut NAVideoBuffer<u8>, - xpos: usize, ypos: usize, size: usize, top_str: &[u8], left_str: &[u8], dpos: usize) { - for x in 0..(size >> 3) { - self.deblock8x8(dparams, frame, xpos + x * 8, ypos, - top_str, left_str, dpos + x * 2); - } - for y in 1..(size >> 3) { - self.deblock8x8(dparams, frame, xpos, ypos + y * 8, - top_str, left_str, dpos + y * 2 * dparams.dblkstride); - } - } -} - -const RV60_DEB_LIMITS: [[u8; 4]; 32] = [ - [ 0, 0, 128, 0 ], [ 0, 0, 128, 0 ], [ 0, 0, 128, 0 ], [ 0, 0, 128, 0 ], - [ 0, 0, 128, 0 ], [ 0, 0, 128, 0 ], [ 0, 0, 128, 0 ], [ 0, 0, 128, 0 ], - [ 0, 0, 128, 3 ], [ 0, 1, 128, 3 ], [ 0, 1, 122, 3 ], [ 1, 1, 96, 4 ], - [ 1, 1, 75, 4 ], [ 1, 1, 59, 4 ], [ 1, 1, 47, 6 ], [ 1, 1, 37, 6 ], - [ 1, 1, 29, 6 ], [ 1, 2, 23, 7 ], [ 1, 2, 18, 8 ], [ 1, 2, 15, 8 ], - [ 1, 2, 13, 9 ], [ 2, 3, 11, 9 ], [ 2, 3, 10, 10 ], [ 2, 3, 9, 10 ], - [ 2, 4, 8, 11 ], [ 3, 4, 7, 11 ], [ 3, 5, 6, 12 ], [ 3, 5, 5, 13 ], - [ 3, 5, 4, 14 ], [ 4, 7, 3, 15 ], [ 5, 8, 2, 16 ], [ 5, 9, 1, 17 ] -]; - -#[derive(Clone)] -pub struct IntraPredContext { - pub t: [u8; 129], // 0 - TL or 0x80, two block sizes or replicated last val from block0 - pub l: [u8; 129], - pub has_t: bool, - pub has_tr: bool, - pub has_l: bool, - pub has_ld: bool, -} - -impl IntraPredContext { - pub fn new() -> Self { - Self { - t: [0x80; 129], l: [0x80; 129], has_t: false, has_tr: false, has_l: false, has_ld: false, - } - } - pub fn pred_dc(&self, dst: &mut [u8], mut doff: usize, dstride: usize, size: usize, filter: bool) { - let dc; - if !self.has_t && !self.has_l { - dc = 0x80; - } else { - let mut sum = 0; - if self.has_t { - for x in 0..size { sum += self.t[x + 1] as u16; } - } - if self.has_l { - for y in 0..size { sum += self.l[y + 1] as u16; } - } - if self.has_t && self.has_l { - dc = ((sum + (size as u16)) / ((size as u16) * 2)) as u8; - } else { - dc = ((sum + ((size >> 1) as u16)) / (size as u16)) as u8; - } - } - for _ in 0..size { - for x in 0..size { dst[doff + x] = dc; } - doff += dstride; - } - if filter && self.has_t && self.has_l { - doff -= dstride * size; - dst[doff] = (((self.t[1] as u16) + (self.l[1] as u16) + 2 * (dst[doff] as u16) + 2) >> 2) as u8; - for x in 1..size { - dst[doff + x] = (((self.t[x + 1] as u16) + 3 * (dst[doff + x] as u16) + 2) >> 2) as u8; - } - for y in 1..size { - doff += dstride; - dst[doff] = (((self.l[y + 1] as u16) + 3 * (dst[doff] as u16) + 2) >> 2) as u8; - } - } - } - pub fn pred_plane(&self, dst: &mut [u8], mut doff: usize, dstride: usize, size: usize) { - let lastl = self.l[size + 1] as i32; - let lastt = self.t[size + 1] as i32; - let mut tmp1: [i32; 64] = [0; 64]; - let mut tmp2: [i32; 64] = [0; 64]; - for i in 0..size { - tmp1[i] = lastl - (self.t[i + 1] as i32); - tmp2[i] = lastt - (self.l[i + 1] as i32); - } - let shift = match size { - 4 => 3, - 8 => 4, - 16 => 5, - 32 => 6, - _ => 7, - }; - let mut top_ref: [i32; 64] = [0; 64]; - let mut left_ref:[i32; 64] = [0; 64]; - for i in 0..size { - top_ref [i] = (self.t[i + 1] as i32) << (shift - 1); - left_ref[i] = (self.l[i + 1] as i32) << (shift - 1); - } - for y in 0..size { - let add = tmp2[y]; - let mut sum = left_ref[y] + (size as i32); - for x in 0..size { - let v = tmp1[x] + top_ref[x]; - sum += add; - top_ref[x] = v; - dst[doff + x] = ((sum + v) >> shift) as u8; - } - doff += dstride; - } - } - fn pred_hor_angle(dst: &mut [u8], doff: usize, dstride: usize, size: usize, weight: i16, src: &[u8]) { - let mut sum = 0; - for x in 0..size { - sum += weight; - let off = ((sum >> 5) + 32) as usize; - let frac = (sum & 0x1F) as u16; - if frac == 0 { - for y in 0..size { - dst[doff + x + y * dstride] = src[off + y]; - } - } else { - for y in 0..size { - let a = src[off + y + 0] as u16; - let b = src[off + y + 1] as u16; - dst[doff + x + y * dstride] = (((32 - frac) * a + frac * b + 0x10) >> 5) as u8; - } - } - } - } - fn pred_ver_angle(dst: &mut [u8], mut doff: usize, dstride: usize, size: usize, weight: i16, src: &[u8]) { - let mut sum = 0; - for _ in 0..size { - sum += weight; - let off = ((sum >> 5) + 32) as usize; - let frac = (sum & 0x1F) as u16; - if frac == 0 { - for x in 0..size { - dst[doff + x] = src[off + x]; - } - } else { - for x in 0..size { - let a = src[off + x + 0] as u16; - let b = src[off + x + 1] as u16; - dst[doff + x] = (((32 - frac) * a + frac * b + 0x10) >> 5) as u8; - } - } - doff += dstride; - } - } - fn filter_weak(dst: &mut [u8], src: &[u8], size: usize) { - dst[0] = src[0]; - for i in 1..size-1 { - dst[i] = (((src[i - 1] as u16) + 2 * (src[i] as u16) + (src[i + 1] as u16) + 2) >> 2) as u8; - } - dst[size - 1] = src[size - 1]; - } - fn filter_bilin32(dst: &mut [u8], v0: u8, v1: u8, size: usize) { - let diff = (v1 as i16) - (v0 as i16); - let mut sum = ((v0 as i16) << 5) + (1 << (5 - 1)); - for i in 0..size { - dst[i] = (sum >> 5) as u8; - sum += diff; - } - } - pub fn pred_angle(&self, dst: &mut [u8], mut doff: usize, dstride: usize, size: usize, angle: usize, filter: bool) { - let mut filtered1: [u8; 96] = [0; 96]; - let mut filtered2: [u8; 96] = [0; 96]; - if angle == 0 { - self.pred_plane(dst, doff, dstride, size); - } else if angle == 1 { - self.pred_dc(dst, doff, dstride, size, filter); - } else if angle <= 9 { - let ang_weight = RV60_IPRED_ANGLE[10 - angle]; - let add_size = (size * (ang_weight as usize) + 31) >> 5; - if size <= 16 { - Self::filter_weak(&mut filtered1[32..], &self.l[1..], size + add_size); - } else { - Self::filter_bilin32(&mut filtered1[32..], self.l[1], self.l[33], 32); - Self::filter_bilin32(&mut filtered1[64..], self.l[32], self.l[64], add_size); - } - Self::pred_hor_angle(dst, doff, dstride, size, ang_weight as i16, &filtered1); - } else if angle == 10 { - if size <= 16 { - Self::filter_weak(&mut filtered1[32..], &self.l[1..], size); - } else { - Self::filter_bilin32(&mut filtered1[32..], self.l[1], self.l[33], 32); - } - for y in 0..size { - for x in 0..size { - dst[doff + x] = filtered1[32 + y]; - } - doff += dstride; - } - if filter { - doff -= dstride * size; - let tl = self.t[0] as i16; - for x in 0..size { - dst[doff + x] = clip8((dst[doff + x] as i16) + (((self.t[x + 1] as i16) - tl) >> 1)); - } - } - } else if angle <= 17 { - let ang_weight = RV60_IPRED_ANGLE [angle - 10]; - let inv_angle = RV60_IPRED_INV_ANGLE[angle - 10]; - let add_size = (size * (ang_weight as usize) + 31) >> 5; - if size <= 16 { - for i in 0..size+1 { - filtered1[32-1 + i] = self.l[i]; - } - for i in 0..size+1 { - filtered2[32-1 + i] = self.t[i]; - } - } else { - filtered1[32-1] = self.l[0]; - Self::filter_bilin32(&mut filtered1[32..], self.l[0], self.l[32], 32); - filtered2[32-1] = self.t[0]; - Self::filter_bilin32(&mut filtered2[32..], self.t[0], self.t[32], 32); - } - if add_size > 1 { - let mut sum = 0x80; - for i in 1..add_size { - sum += inv_angle; - let pos = ((sum >> 8) + 32 - 1) as usize; - filtered1[32 - 1 - i] = filtered2[pos]; - } - } - Self::pred_hor_angle(dst, doff, dstride, size, -(ang_weight as i16), &filtered1); - } else if angle <= 25 { - let ang_weight = RV60_IPRED_ANGLE[26 - angle]; - let inv_angle = RV60_IPRED_INV_ANGLE[26 - angle]; - let add_size = (size * (ang_weight as usize) + 31) >> 5; - if size <= 16 { - for i in 0..size+1 { - filtered1[32-1 + i] = self.t[i]; - } - for i in 0..size+1 { - filtered2[32-1 + i] = self.l[i]; - } - } else { - filtered1[32-1] = self.t[0]; - Self::filter_bilin32(&mut filtered1[32..], self.t[0], self.t[32], 32); - filtered2[32-1] = self.l[0]; - Self::filter_bilin32(&mut filtered2[32..], self.l[0], self.l[32], 32); - } - if add_size > 1 { - let mut sum = 0x80; - for i in 1..add_size { - sum += inv_angle; - let pos = ((sum >> 8) + 32 - 1) as usize; - filtered1[32 - 1 - i] = filtered2[pos]; - } - } - Self::pred_ver_angle(dst, doff, dstride, size, -(ang_weight as i16), &filtered1); - } else if angle == 26 { - if size <= 16 { - Self::filter_weak(&mut filtered1[32..], &self.t[1..], size); - } else { - Self::filter_bilin32(&mut filtered1[32..], self.t[1], self.t[33], 32); - } - for _ in 0..size { - for x in 0..size { - dst[doff + x] = filtered1[32 + x]; - } - doff += dstride; - } - if filter { - doff -= dstride * size; - let tl = self.l[0] as i16; - for y in 0..size { - dst[doff] = clip8((dst[doff] as i16) + (((self.l[y + 1] as i16) - tl) >> 1)); - doff += dstride; - } - } - } else if angle <= 34 { - let ang_weight = RV60_IPRED_ANGLE[angle - 26]; - let add_size = (size * (ang_weight as usize) + 31) >> 5; - if size <= 16 { - Self::filter_weak(&mut filtered1[32..], &self.t[1..], size + add_size); - } else { - Self::filter_bilin32(&mut filtered1[32..], self.t[1], self.t[33], 32); - Self::filter_bilin32(&mut filtered1[64..], self.t[32], self.t[64], add_size); - } - Self::pred_ver_angle(dst, doff, dstride, size, ang_weight as i16, &filtered1); - } else { - unreachable!(); - } - } -} - -const RV60_IPRED_ANGLE: [u8; 9] = [ 0, 2, 5, 9, 13, 17, 21, 26, 32 ]; -const RV60_IPRED_INV_ANGLE: [i16; 9] = [ 0, 4096, 1638, 910, 630, 482, 390, 315, 256 ]; -const RV60_EDGE1: [isize; 4] = [ 0, 2, 2, 2 ]; -const RV60_EDGE2: [isize; 4] = [ 0, 3, 3, 3 ]; - diff --git a/src/codecs/sipro.rs b/src/codecs/sipro.rs deleted file mode 100644 index 882d90c..0000000 --- a/src/codecs/sipro.rs +++ /dev/null @@ -1,1584 +0,0 @@ -use crate::formats::*; -use crate::frame::*; -use super::*; -use crate::io::bitreader::*; - -use std::f32::consts::PI; - -#[derive(Clone,Copy,PartialEq)] -enum SiproMode { - Mode16k, - Mode8_5k, - Mode6_5k, - Mode5k, -} - -impl SiproMode { - fn is16k(&self) -> bool { *self == SiproMode::Mode16k } -} - -const SIPRO_MODE_FROM_IDX: [SiproMode; 4] = [ - SiproMode::Mode16k, SiproMode::Mode8_5k, SiproMode::Mode6_5k, SiproMode::Mode5k -]; - -const EXCITATION_OFFSET: usize = 281 + 10 + 1; - -struct SiproDecoder { - chmap: NAChannelMap, - ainfo: NAAudioInfo, - info: Rc<NACodecInfo>, - mode: &'static SiproModeInfo, - mode_type: SiproMode, - - pred_switch: bool, - vq_idx: [usize; 5], - pitch_delay: [usize; 5], - gp_index: [usize; 5], - fc_index: [[i16; 10]; 5], - gc_index: [usize; 5], - npulses: usize, - pulse_data: [i16; 20], - - pitch_lag_prev: usize, - prev_pitch_gain: f32, - avg_energy: f32, - gain_mem: f32, - - lsf_hist: [f32; 16], - lsp_hist: [f32; 16], - energy_hist: [f32; 4], - sf_filter: [[f32; 16]; 5], - excitation: [f32; 512+64], - synth: [f32; 256], - synth_hist: [f32; 16], - ir: [f32; 80], - fix_vec: [f32; 80], - - postfilt_5k: [f32; 256], - postfilt_5k_mem1: [f32; 10], - postfilt_5k_mem2: [f32; 10], - postfilt_5k_tilt: f32, - postfilt_5k_gain: f32, - - postfilt_16k_preemph: [f32; 16], - postfilt_16k_filt: [f32; 16], - postfilt_16k_filt_prev: [f32; 16], - postfilt_16k_buf: [f32; 256], - - iir_state: [f32; 2], - - pitch_int: usize, - prev_pitch: usize, -} - -impl SiproDecoder { - fn new() -> Self { - SiproDecoder { - chmap: NAChannelMap::new(), - ainfo: NAAudioInfo::new(0, 1, SND_F32P_FORMAT, 0), - info: NACodecInfo::new_dummy(), - mode: &SIPRO_MODES[0], - mode_type: SiproMode::Mode5k, - - pred_switch: false, - vq_idx: [0; 5], - pitch_delay: [0; 5], - gp_index: [0; 5], - fc_index: [[0; 10]; 5], - gc_index: [0; 5], - npulses: 0, - pulse_data: [0; 20], - - pitch_lag_prev: 0, - prev_pitch_gain: 0.0, - avg_energy: 0.0, - gain_mem: 0.0, - pitch_int: 0, - prev_pitch: 0, - - lsf_hist: [0.0; 16], - lsp_hist: [0.0; 16], - energy_hist: [0.0; 4], - sf_filter: [[0.0; 16]; 5], - excitation: [0.0; 512+64], - synth: [0.0; 256], - synth_hist: [0.0; 16], - ir: [0.0; 80], - fix_vec: [0.0; 80], - - postfilt_5k: [0.0; 256], - postfilt_5k_mem1: [0.0; 10], - postfilt_5k_mem2: [0.0; 10], - postfilt_5k_tilt: 0.0, - postfilt_5k_gain: 0.0, - - postfilt_16k_preemph: [0.0; 16], - postfilt_16k_filt: [0.0; 16], - postfilt_16k_filt_prev: [0.0; 16], - postfilt_16k_buf: [0.0; 256], - - iir_state: [0.0; 2], - } - } - - fn unpack_frame(&mut self, br: &mut BitReader) -> DecoderResult<()> { - if self.mode.pred { - self.pred_switch = br.read_bool()?; - } else { - self.pred_switch = false; - } - for i in 0..5 { - self.vq_idx[i] = br.read(self.mode.vq_idx_bits[i])? as usize; - } - for sf in 0..self.mode.subframes { - self.pitch_delay[sf] = br.read(self.mode.pitch_delay_bits[sf])? as usize; - self.gp_index[sf] = br.read(self.mode.gp_idx_bits)? as usize; - for i in 0..self.mode.fc_indices { - self.fc_index[sf][i] = br.read(self.mode.fc_idx_bits[i])? as i16; - } - self.gc_index[sf] = br.read(self.mode.gc_idx_bits)? as usize; - } - Ok(()) - } - fn decode_lsf_16k(&mut self) { - let mut filter: [f32; 16] = [0.0; 16]; - let mut newfilt: [f32; 16] = [0.0; 16]; - let mut lsp: [f32; 16] = [0.0; 16]; - - for cb in 0..4 { - for i in 0..3 { - filter[cb * 3 + i] = SIPRO_LSF_CODEBOOK_16K[cb][self.vq_idx[cb]][i]; - } - } - for i in 0..4 { - filter[4 * 3 + i] = SIPRO_LSF_CB4_16K[self.vq_idx[4]][i]; - } - - if self.pred_switch { - for i in 0..newfilt.len() { - newfilt[i] = (filter[i] + self.lsf_hist[i]) * 0.5 + SIPRO_MEAN_LSF_16K[i]; - } - } else { - for i in 0..newfilt.len() { - newfilt[i] = 0.88 * filter[i] + 0.12 * self.lsf_hist[i] + SIPRO_MEAN_LSF_16K[i]; - } - } - for i in 0..filter.len() { - self.lsf_hist[i] = filter[i]; - } - - let mut prev: f32 = 0.0; - for i in 0..newfilt.len() { - newfilt[i] = newfilt[i].max(prev + SIPRO_LSF_MIN_DIST/2.0); - prev = newfilt[i]; - filter[i] = newfilt[i].cos(); - } - - for i in 0..lsp.len() { - lsp[i] = (filter[i] + self.lsp_hist[i]) * 0.5; - } - - lsp2lpc_16k(&mut self.sf_filter[0], &lsp); - lsp2lpc_16k(&mut self.sf_filter[1], &filter); - for i in 0..filter.len() { - self.lsp_hist[i] = filter[i]; - } - - for i in 0..16 { - self.synth[i] = self.synth_hist[i]; - } - } - fn decode_lsf_lbr(&mut self) { - let mut filter: [f32; 10] = [0.0; 10]; - let mut newfilt: [f32; 10] = [0.0; 10]; - - for cb in 0..5 { - for i in 0..2 { - filter[cb * 2 + i] = SIPRO_LSF_CODEBOOK_LBR[cb][self.vq_idx[cb]][i]; - } - } - for i in 0..newfilt.len() { - newfilt[i] = filter[i] + 0.33 * self.lsf_hist[i] + SIPRO_MEAN_LSF_LBR[i]; - } - for i in 0..8 { // maybe it's just bubble sort? - for j in (0..i+1).rev() { - if newfilt[j] <= newfilt[j + 1] { break; } - let tmp = newfilt[j]; - newfilt[j] = newfilt[j + 1]; - newfilt[j + 1] = tmp; - } - } - - let mut prev: f32 = 0.0; - for i in 0..9 { - newfilt[i] = newfilt[i].max(prev + SIPRO_LSF_MIN_DIST); - prev = newfilt[i]; - } - newfilt[9] = newfilt[9].min(prev + SIPRO_LSF_MIN_DIST_LAST); - for i in 0..filter.len() { - self.lsf_hist[i] = filter[i]; - } - - for i in 0..9 { - newfilt[i] = newfilt[i].cos(); - } - newfilt[9] *= 6.153848 / PI; - - let mut interp: f32 = 0.5 / (self.mode.subframes as f32); - for sf in 0..self.mode.subframes { - for i in 0..newfilt.len() { - filter[i] = newfilt[i] * interp + self.lsp_hist[i] * (1.0 - interp); - } - lsp2lpc_lbr(&mut self.sf_filter[sf], &filter); - interp += 1.0 / (self.mode.subframes as f32); - } - for i in 0..newfilt.len() { - self.lsp_hist[i] = newfilt[i]; - } - - for i in 0..10 { - self.synth[i] = self.synth_hist[i]; - } - } - fn calc_pitch_16k(&mut self, sf: usize) { - let idx = self.pitch_delay[sf]; - let pitch_idx = if sf == 0 { - if idx < 390 { - idx + 88 - } else { - idx * 3 - 690 - } - } else { - if idx < 62 { - (self.prev_pitch - 10).max(30).min(281 - 19) * 3 + idx - 2 - } else { - self.prev_pitch * 3 - } - }; - self.pitch_int = ((pitch_idx + 2) * 10923) >> 15; - self.prev_pitch = ((pitch_idx + 1) * 10923) >> 15; - let pitch_frac = pitch_idx + 2 - 3 * self.pitch_int; - - for i in 0..80 { - let mut sum: f32 = 0.0; - let estart = EXCITATION_OFFSET + sf * 80 - self.pitch_int + i + 1; - for j in 0..10 { - sum += self.excitation[estart + j] * SIPRO_SINC_16K[j * 3 + pitch_frac + 1]; - sum += self.excitation[estart - j - 1] * SIPRO_SINC_16K[j * 3 + 3 - pitch_frac - 1]; - } - self.excitation[EXCITATION_OFFSET + sf * 80 + i] = sum; - } - } - fn calc_pitch_lbr(&mut self, sf: usize) { - let new_sf = (sf == 0) || (self.mode_type == SiproMode::Mode5k && sf == 2); - let idx = self.pitch_delay[sf]; - let pitch_idx = if new_sf { - if idx < 197 { - idx + 59 - } else { - idx * 3 - 335 - } - } else { - idx + (self.prev_pitch - 5).max(20).min(134) * 3 - 1 - }; - self.pitch_int = (pitch_idx * 10923) >> 15; - let pitch_frac = (pitch_idx as i32) - (self.pitch_int as i32) * 3 - 1; - if new_sf { - self.prev_pitch = self.pitch_int; - } - let ffrac = 2 * ((pitch_frac + 2) % 3) + 2; - let off = EXCITATION_OFFSET + sf * 48 + (if pitch_frac <= 0 { 1 } else { 0 }); - for i in 0..48 { - let mut sum: f32 = 0.0; - let estart = off + i - self.pitch_int; - for j in 0..10 { - let idx0 = ((j * 6) as i32) + ffrac; - let idx1 = ((j * 6) as i32) + 6 - ffrac; - sum += self.excitation[estart + j] * SIPRO_SINC_LBR[idx0 as usize]; - sum += self.excitation[estart - j - 1] * SIPRO_SINC_LBR[idx1 as usize]; - } - self.excitation[EXCITATION_OFFSET + sf * 48 + i] = sum; - } - } - fn unpack_pulses_16k(&mut self, sf: usize) { - self.npulses = 10; - for i in 0..5 { - let off1 = (self.fc_index[sf][i * 2 + 0] & 0xF) * 5 + (i as i16); - let off2 = (self.fc_index[sf][i * 2 + 1] & 0xF) * 5 + (i as i16); - let sign = if (self.fc_index[sf][i * 2 + 1] & 0x10) != 0 { -1 } else { 1 }; - self.pulse_data[i * 4 + 0] = off1; - self.pulse_data[i * 4 + 1] = if off1 < off2 { -sign } else { sign }; - self.pulse_data[i * 4 + 2] = off2; - self.pulse_data[i * 4 + 3] = sign; - } - self.fix_vec = [0.0; 80]; - let pitch_frac = SIPRO_GAIN_PITCH_CB_16K[self.gp_index[sf]].min(1.0); - for i in 0..10 { - let mut scale = self.pulse_data[i * 2 + 1] as f32; - let off = self.pulse_data[i * 2 + 0] as usize; - for j in (off..80).step_by(self.prev_pitch) { - self.fix_vec[j] += scale; - scale *= pitch_frac; - } - } - } - fn unpack_pulses_8_5k(&mut self, sf: usize) { - self.npulses = 6; - for i in 0..3 { - self.pulse_data[i * 4 + 0] = 3 * ((self.fc_index[sf][i] >> 4) & 0xF) + (i as i16); - self.pulse_data[i * 4 + 2] = 3 * ((self.fc_index[sf][i] >> 0) & 0xF) + (i as i16); - self.pulse_data[i * 4 + 1] = if (self.fc_index[sf][i] & 0x100) != 0 { -1 } else { 1 }; - self.pulse_data[i * 4 + 3] = if (self.fc_index[sf][i] & 0x100) != 0 { -1 } else { 1 }; - if self.pulse_data[i * 4 + 2] < self.pulse_data[i * 4 + 0] { - self.pulse_data[i * 4 + 3] = -self.pulse_data[i * 4 + 3]; - } - } - self.unpack_pulses_common(); - } - fn unpack_pulses_6_5k(&mut self, sf: usize) { - self.npulses = 3; - for i in 0..3 { - self.pulse_data[i * 2 + 0] = 3 * (self.fc_index[sf][i] & 0xF) + (i as i16); - self.pulse_data[i * 2 + 1] = if (self.fc_index[sf][i] & 0x10) != 0 { -1 } else { 1 }; - } - self.unpack_pulses_common(); - } - fn unpack_pulses_5k(&mut self, sf: usize) { - if self.prev_pitch_gain < 0.8 { - self.npulses = 3; - let mut cw = self.fc_index[sf][0]; - let off = if (cw & 0x200) != 0 { 2 } else { 0 }; - for i in 0..3 { - self.pulse_data[i * 2 + 0] = (cw & 7) * 6 + 4 - (i as i16) * 2; - self.pulse_data[i * 2 + 1] = if ((self.pulse_data[i * 2 + 0] + off) & 3) != 0 { -1 } else { 1 }; - cw >>= 3; - } - } else { - self.npulses = 2; - let off = (self.fc_index[sf][0] >> 8) & 1; - self.pulse_data[0] = 3 * ((self.fc_index[sf][0] >> 4) & 0xF) + off; - self.pulse_data[1] = if (self.fc_index[sf][0] & 0x200) != 0 { -1 } else { 1 }; - self.pulse_data[2] = 3 * ((self.fc_index[sf][0] >> 0) & 0xF) + off + 1; - self.pulse_data[3] = -self.pulse_data[1]; - } - self.unpack_pulses_common(); - } - fn unpack_pulses_common(&mut self) { - for i in 0..48 { - self.fix_vec[i] = 0.0; - } - for i in 0..self.npulses { - let off = self.pulse_data[i * 2] as usize; - let scale = self.pulse_data[i * 2 + 1] as f32; - for j in off..48 { - self.fix_vec[j] += scale * self.ir[10 + j - off]; - } - } - } - fn eval_ir(&mut self, sf: usize) { - let mut tmp: [f32; 48 + 1] = [0.0; 48 + 1]; - let mut filt: [f32; 16] = [0.0; 16]; - tmp[0] = 1.0; - for i in 0..10 { - tmp[i + 1] = self.sf_filter[sf][i] * SIPRO_POW_0_55[i]; - filt[i] = self.sf_filter[sf][i] * SIPRO_POW_0_7[i]; - } - synth_filter(&mut self.ir, 10, &filt, &tmp, 48, 10); - for i in self.pitch_int..48 { - self.ir[10 + i] += self.mode.pitch_sharp_factor * self.ir[10 + i - self.pitch_int]; - } - } - fn update_gain_16k(&mut self, sf: usize) { - let mut energy: f64 = 0.0; - for i in 0..80 { - energy += (self.fix_vec[i] as f64) * (self.fix_vec[i] as f64); - } - let ehist = ((0.8 * self.energy_hist[0] + 0.6 * self.energy_hist[1]) as f64) - 71.30899869919435856603; - let rms = 8.94427190999915878559 * (10.0f64.ln() / 20.0 * ehist).exp() / (0.01 + energy).sqrt(); - let gain = SIPRO_GAIN_CB_16K[self.gc_index[sf]] * (rms as f32); - - self.energy_hist[1] = self.energy_hist[0]; - self.energy_hist[0] = SIPRO_GAIN_DB_CB_16K[self.gc_index[sf]]; - - let exc = &mut self.excitation[EXCITATION_OFFSET + sf * 80..][..80]; - for i in 0..80 { - exc[i] = exc[i] * SIPRO_GAIN_PITCH_CB_16K[self.gp_index[sf]] + self.fix_vec[i] * gain; - } - } - fn update_gain_lbr(&mut self, sf: usize) { - let gain0 = SIPRO_GAIN_CB_LBR[self.gc_index[sf]][0]; - let gain1 = SIPRO_GAIN_CB_LBR[self.gc_index[sf]][1]; - self.prev_pitch_gain = gain0; - - self.avg_energy = 0.01; - for el in self.fix_vec.iter().take(48) { - self.avg_energy += *el * *el; - } - self.avg_energy /= 48.0; - - let mut sum: f32 = -56.30899869919435856603; - for i in 0..4 { - sum += self.energy_hist[i] * SIPRO_GAIN_PRED[i]; - } - for i in 0..3 { - self.energy_hist[i] = self.energy_hist[i + 1]; - } - self.energy_hist[3] = 20.0 * gain1.log10(); - - let gain = ((gain1 as f64) * ((sum as f64) * (10.0f64).ln() * 0.05).exp() / (self.avg_energy as f64).sqrt()) as f32; - let exc = &mut self.excitation[EXCITATION_OFFSET + sf * 48..][..48]; - for i in 0..48 { - exc[i] = exc[i] * gain0 + self.fix_vec[i] * gain; - } - - let pitch_gain = (0.5 * gain0 * gain0).min(0.4); - self.gain_mem = (0.7 * self.gain_mem + 0.3 * pitch_gain).min(pitch_gain); - - let gain = gain * self.gain_mem; - - for i in 0..48 { - self.fix_vec[i] = exc[i] - gain * self.fix_vec[i]; - } - } - fn synth_subframe_16k(&mut self, sf: usize) { - synth_filter(&mut self.synth, 16 + sf * 80, &self.sf_filter[sf], &self.excitation[EXCITATION_OFFSET + sf * 80..], 80, 16); - } - fn synth_subframe_lbr(&mut self, sf: usize) { - if self.mode_type == SiproMode::Mode5k { - self.postfilter_5k_sf(sf); - } - synth_filter(&mut self.synth, 10 + sf * 48, &self.sf_filter[sf], &self.fix_vec, 48, 10); - } - fn postfilter_16k(&mut self) { - let mut filt: [f32; 16] = [0.0; 16]; - - for i in 0..filt.len() { - filt[i] = self.postfilt_16k_filt_prev[i] * SIPRO_POW_0_5[i]; - } - - let mut tmp: [f32; 64] = [0.0; 64]; - for i in 0..16 { - tmp[i] = self.postfilt_16k_preemph[i]; - } - synth_filter(&mut tmp, 16, &self.postfilt_16k_filt, &self.synth[16..], 30, 16); - for i in 0..16 { - self.synth[i] = self.postfilt_16k_preemph[i]; - } - let mut tsrc: [f32; 30] = [0.0; 30]; - tsrc.copy_from_slice(&self.synth[16..][..30]); - synth_filter(&mut self.synth, 16, &filt, &tsrc, 30, 16); - for i in 0..16 { - self.postfilt_16k_buf[30 - 16 + i] = self.synth[30 + i]; - } - synth_filter(&mut self.postfilt_16k_buf, 30, &filt, &self.synth[30 + 16..], 2 * 80 - 30, 16); - self.postfilt_16k_filt = filt; - for i in 0..16 { - self.postfilt_16k_preemph[i] = self.postfilt_16k_buf[2 * 80 - 16 + i]; - self.postfilt_16k_filt_prev[i] = self.sf_filter[1][i]; - } - - for i in 0..30 { - self.postfilt_16k_buf[i] = tmp[i + 16] + (i as f32) * (self.synth[i + 16] - tmp[i + 16]) / 30.0; - } - } - fn postfilter_5k_sf(&mut self, sf: usize) { - let mut d: [f32; 10] = [0.0; 10]; - let mut n: [f32; 10] = [0.0; 10]; - - for i in 0..10 { - d[i] = self.sf_filter[sf][i] * SIPRO_POW_0_75[i]; - n[i] = self.sf_filter[sf][i] * SIPRO_POW_0_5[i]; - } - - let mut tmp: [f32; 48 + 10] = [0.0; 48 + 10]; - for i in 0..10 { - tmp[i] = self.postfilt_5k_mem1[i]; - } - synth_filter(&mut tmp, 10, &d, &self.fix_vec, 48, 10); - for i in 0..10 { - self.postfilt_5k_mem1[i] = tmp[i + 48]; - } - - let tilt = tmp[48 + 10 - 1]; - for i in (10+1..48+10).rev() { - tmp[i] -= 0.4 * tmp[i - 1]; - } - tmp[10] -= 0.4 * self.postfilt_5k_tilt; - self.postfilt_5k_tilt = tilt; - - for i in 0..10 { - tmp[i] = self.postfilt_5k_mem2[i]; - } - for i in 0..10 { - self.postfilt_5k_mem2[i] = tmp[i + 48]; - } - - for i in 0..48 { // almost but not exactly like synth_filter(fix_vec, 0, -n, tmp, 48, 10) - self.fix_vec[i] = tmp[i + 10]; - for j in 0..10 { - self.fix_vec[i] += n[j] * tmp[i + 10 - j - 1]; - } - } - - synth_filter(&mut self.postfilt_5k, 10 + sf * 48, &self.sf_filter[sf], - &self.excitation[EXCITATION_OFFSET + sf * 48..], 48, 10); - } - fn postfilter_5k(&mut self) { - for sf in 0..self.mode.subframes { - let src = &self.postfilt_5k[10 + sf * 48..][..48]; - let mut fenergy: f32 = 0.0; - for el in src.iter() { - fenergy += *el * *el; - } - let mut senergy: f32 = 0.0; - { - let src = &self.synth[10 + sf * 48..][..48]; - for el in src.iter() { - senergy += *el * *el; - } - } - - let gain = if senergy != 0.0 { 0.1 * (fenergy / senergy).sqrt() } else { 0.1 }; - - let dst = &mut self.synth[10 + sf * 48..][..48]; - for el in dst.iter_mut() { - self.postfilt_5k_gain *= 0.9; - self.postfilt_5k_gain += gain; - *el *= self.postfilt_5k_gain; - } - } - for i in 0..10 { - self.postfilt_5k[i] = self.postfilt_5k[i + self.mode.subframes * 48]; - } - } - fn output_16k(&mut self, dst: &mut [f32]) { - for i in 0..16 { - self.synth_hist[i] = self.synth[80 * 2 + i]; - } - for i in 0..EXCITATION_OFFSET { - self.excitation[i] = self.excitation[80 * 2 + i]; - } - self.postfilter_16k(); - for i in 0..80 * 2 { - dst[i] = self.postfilt_16k_buf[i]; - } - } - fn output_lbr(&mut self, dst: &mut [f32]) { - let out_size = self.mode.subframe_len * self.mode.subframes; - for i in 0..10 { - self.synth_hist[i] = self.synth[i + out_size]; - } - if self.mode_type == SiproMode::Mode5k { - self.postfilter_5k(); - } - for i in 0..EXCITATION_OFFSET { - self.excitation[i] = self.excitation[i + out_size]; - } - for i in 0..out_size { - let x = 0.939805806 * self.synth[i + 10] + 1.93307352 * self.iir_state[0] - 0.935891986 * self.iir_state[1]; - let y = x - 1.99997 * self.iir_state[0] + self.iir_state[1]; - self.iir_state[1] = self.iir_state[0]; - self.iir_state[0] = x; - dst[i] = y; - } - } -} - -fn lsp2poly(lsp: &[f32], poly: &mut [f64], order: usize) { - poly[0] = 1.0; - poly[1] = -2.0 * (lsp[0] as f64); - for i in 1..order { - poly[i + 1] = -2.0 * (lsp[2 * i] as f64) * poly[i] + 2.0 * poly[i - 1]; - for j in (2..i+1).rev() { - poly[j] += -2.0 * (lsp[2 * i] as f64) * poly[j - 1] + poly[j - 2]; - } - poly[1] += -2.0 * (lsp[2 * i] as f64); - } -} - -fn lsp2lpc_16k(lpc: &mut [f32], lsp: &[f32]) { - let mut a: [f64; 10] = [0.0; 10]; - let mut b: [f64; 10] = [0.0; 10]; - lsp2poly(&lsp[0..], &mut a, 8); - lsp2poly(&lsp[1..], &mut b, 8); - for i in 0..8 { - let ta = a[8 - i] + a[7 - i]; - let tb = b[8 - i] - b[7 - i]; - lpc[7 - i] = ((ta + tb) * 0.5) as f32; - lpc[8 + i] = ((ta - tb) * 0.5) as f32; - } -} -fn lsp2lpc_lbr(lpc: &mut [f32], lsp: &[f32]) { - let mut a: [f64; 6] = [0.0; 6]; - let mut b: [f64; 6] = [0.0; 6]; - lsp2poly(&lsp[0..], &mut a[0..], 5); - lsp2poly(&lsp[1..], &mut b[1..], 4); - - let ascale = (1.0 + lsp[9]) as f64; - let bscale = (1.0 - lsp[9]) as f64; - for i in 1..5 { - let ta = ascale * a[i]; - let tb = bscale * (b[i + 1] - b[i - 1]); - lpc[i - 1] = ((ta + tb) * 0.5) as f32; - lpc[9 - i] = ((ta - tb) * 0.5) as f32; - } - lpc[4] = (ascale * a[5] * 0.5) as f32; - lpc[9] = lsp[9]; -} - -fn synth_filter(dst: &mut [f32], doff: usize, filt: &[f32], src: &[f32], len: usize, order: usize) { - for i in 0..len { - dst[doff + i] = src[i]; - for j in 0..order { - dst[doff + i] -= filt[j] * dst[doff + i - j - 1]; - } - } -} - -const CHMAP_MONO: [NAChannelType; 1] = [NAChannelType::C]; - -impl NADecoder for SiproDecoder { - fn init(&mut self, info: Rc<NACodecInfo>) -> DecoderResult<()> { - if let NACodecTypeInfo::Audio(ainfo) = info.get_properties() { - let mut found = false; - for i in 0..SIPRO_MODES.len() { - if SIPRO_MODES[i].block_align == ainfo.get_block_len() { - self.mode = &SIPRO_MODES[i]; - self.mode_type = SIPRO_MODE_FROM_IDX[i]; - found = true; - break; - } - } - validate!(found); - - let order = if self.mode_type.is16k() { 16 } else { 10 }; - for i in 0..order { - self.lsp_hist[i] = (((i + 1) as f32) * PI / ((order + 1) as f32)).cos(); - } - self.energy_hist = [-14.0; 4]; - self.pitch_lag_prev = 180; - - self.chmap.add_channels(&CHMAP_MONO); - self.ainfo = NAAudioInfo::new(ainfo.get_sample_rate(), - 1, - SND_F32P_FORMAT, 0); - self.info = info.replace_info(NACodecTypeInfo::Audio(self.ainfo.clone())); - Ok(()) - } else { - Err(DecoderError::InvalidData) - } - } - fn decode(&mut self, pkt: &NAPacket) -> DecoderResult<NAFrameRef> { - let info = pkt.get_stream().get_info(); - validate!(info.get_properties().is_audio()); - let pktbuf = pkt.get_buffer(); - let frm_size = self.mode.block_align; - let out_frm_size = self.mode.frames * self.mode.subframes * self.mode.subframe_len; - let nframes = pktbuf.len() / frm_size; - - let duration = out_frm_size * nframes; - - let mut abuf = alloc_audio_buffer(self.ainfo, duration, self.chmap.clone())?; - let mut adata = abuf.get_abuf_f32().unwrap(); - let mut dst = adata.get_data_mut(); - - let frame_len = self.mode.subframe_len * self.mode.subframes; - for (input, output) in pktbuf.chunks(frm_size).zip(dst.chunks_mut(out_frm_size)) { - let mut br = BitReader::new(input, input.len(), BitReaderMode::LE); - for dst in output.chunks_mut(frame_len) { - self.unpack_frame(&mut br)?; - if self.mode_type.is16k() { - self.decode_lsf_16k(); - } else { - self.decode_lsf_lbr(); - } - for i in 0..64 { - self.ir[i] = 0.0; - } - for sf in 0..self.mode.subframes { - if self.mode_type.is16k() { - self.calc_pitch_16k(sf); - } else { - self.calc_pitch_lbr(sf); - self.eval_ir(sf); - } - match self.mode_type { - SiproMode::Mode16k => { self.unpack_pulses_16k(sf); }, - SiproMode::Mode8_5k => { self.unpack_pulses_8_5k(sf); }, - SiproMode::Mode6_5k => { self.unpack_pulses_6_5k(sf); }, - SiproMode::Mode5k => { self.unpack_pulses_5k(sf); }, - } - if self.mode_type.is16k() { - self.update_gain_16k(sf); - } else { - self.update_gain_lbr(sf); - } - if self.mode_type.is16k() { - self.synth_subframe_16k(sf); - } else { - self.synth_subframe_lbr(sf); - } - } - if self.mode_type.is16k() { - self.output_16k(dst); - } else { - self.output_lbr(dst); - } - } - } - - let mut frm = NAFrame::new_from_pkt(pkt, self.info.clone(), abuf); - frm.set_keyframe(true); - Ok(Rc::new(RefCell::new(frm))) - } -} - -pub fn get_decoder() -> Box<NADecoder> { - Box::new(SiproDecoder::new()) -} - -#[cfg(test)] -mod test { - use crate::test::dec_video::*; - #[test] - fn test_sipro() { - let file = "assets/RV/autahi-vox.rm"; - test_decode_audio("realmedia", file, Some(5000), "sipro"); - } -} - -struct SiproModeInfo { - block_align: usize, - frames: usize, - subframes: usize, - subframe_len: usize, - - pred: bool, - vq_idx_bits: [u8; 5], - pitch_delay_bits: [u8; 5], - gp_idx_bits: u8, - fc_indices: usize, - fc_idx_bits: [u8; 10], - gc_idx_bits: u8, - - pitch_sharp_factor: f32, -} - -static SIPRO_MODES: [SiproModeInfo; 4] = [ - SiproModeInfo { - block_align: 160/8, frames: 1, subframes: 2, subframe_len: 80, - pred: true, vq_idx_bits: [ 7, 8, 7, 7, 7 ], - pitch_delay_bits: [ 9, 6, 0, 0, 0 ], gp_idx_bits: 4, - fc_indices: 10, fc_idx_bits: [ 4, 5, 4, 5, 4, 5, 4, 5, 4, 5 ], - gc_idx_bits: 5, pitch_sharp_factor: 0.0 - }, - SiproModeInfo { - block_align: 152/8, frames: 1, subframes: 3, subframe_len: 48, - pred: false, vq_idx_bits: [ 6, 7, 7, 7, 5 ], - pitch_delay_bits: [ 8, 5, 5, 0, 0 ], gp_idx_bits: 0, - fc_indices: 3, fc_idx_bits: [ 9, 9, 9, 0, 0, 0, 0, 0, 0, 0 ], - gc_idx_bits: 7, pitch_sharp_factor: 0.8 - }, - SiproModeInfo { - block_align: 232/8, frames: 2, subframes: 3, subframe_len: 48, - pred: false, vq_idx_bits: [ 6, 7, 7, 7, 5 ], - pitch_delay_bits: [ 8, 5, 5, 0, 0 ], gp_idx_bits: 0, - fc_indices: 3, fc_idx_bits: [ 5, 5, 5, 0, 0, 0, 0, 0, 0, 0 ], - gc_idx_bits: 7, pitch_sharp_factor: 0.8 - }, - SiproModeInfo { - block_align: 296/8, frames: 2, subframes: 5, subframe_len: 48, - pred: false, vq_idx_bits: [ 6, 7, 7, 7, 5 ], - pitch_delay_bits: [ 8, 5, 8, 5, 5 ], gp_idx_bits: 0, - fc_indices: 1, fc_idx_bits: [ 10, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], - gc_idx_bits: 7, pitch_sharp_factor: 0.85 - }, -]; - -const SIPRO_LSF_MIN_DIST: f32 = 0.0125 * PI; -const SIPRO_LSF_MIN_DIST_LAST: f32 = 1.3 * PI; - -const SIPRO_LSF_CODEBOOK_LBR: [&[[f32; 2]]; 5] = [ - SIPRO_LSF_CB0_LBR, SIPRO_LSF_CB1_LBR, SIPRO_LSF_CB2_LBR, SIPRO_LSF_CB3_LBR, SIPRO_LSF_CB4_LBR -]; - -const SIPRO_LSF_CB0_LBR: &[[f32; 2]] = &[ - [ 0.007587, -0.005843 ], [ 0.042163, -0.028048 ], [ -0.017147, -0.060705 ], - [ 0.013773, -0.038108 ], [ -0.041563, -0.078571 ], [ -0.076928, -0.119343 ], - [ 0.012654, 0.176005 ], [ 0.059737, 0.156869 ], [ 0.171767, 0.231837 ], - [ 0.114030, 0.242047 ], [ 0.168977, 0.283101 ], [ 0.146210, 0.397961 ], - [ 0.249446, 0.268421 ], [ 0.137074, 0.186724 ], [ -0.057736, -0.135638 ], - [ -0.109664, -0.124611 ], [ -0.021234, -0.031174 ], [ -0.013990, -0.091819 ], - [ -0.040046, -0.111426 ], [ -0.016830, 0.055361 ], [ 0.057815, 0.071606 ], - [ 0.060670, 0.114436 ], [ 0.106695, 0.140838 ], [ 0.093601, 0.092793 ], - [ 0.039593, 0.006142 ], [ -0.066589, -0.092463 ], [ -0.102589, -0.171380 ], - [ -0.059621, -0.050671 ], [ 0.166131, 0.139773 ], [ 0.213069, 0.190761 ], - [ 0.061820, 0.037661 ], [ 0.136471, 0.090823 ], [ -0.019789, 0.013515 ], - [ 0.022280, 0.079473 ], [ 0.215281, 0.461959 ], [ 0.206497, 0.340077 ], - [ 0.012249, -0.065596 ], [ 0.091345, 0.190871 ], [ 0.019506, 0.037266 ], - [ -0.050702, -0.013223 ], [ -0.057334, 0.028943 ], [ 0.291512, 0.371415 ], - [ -0.053467, 0.084160 ], [ 0.025372, 0.375310 ], [ 0.269995, 0.566520 ], - [ -0.095259, -0.012353 ], [ 0.050479, 0.212893 ], [ 0.101219, 0.049320 ], - [ 0.072426, 0.283362 ], [ -0.084116, -0.150542 ], [ -0.031485, 0.144922 ], - [ 0.012714, 0.256910 ], [ -0.009528, 0.102768 ], [ -0.039572, 0.204967 ], - [ -0.098800, 0.055038 ], [ 0.020719, 0.128387 ], [ -0.045559, -0.178373 ], - [ -0.082338, 0.136933 ], [ -0.058270, 0.292806 ], [ 0.084242, 0.505112 ], - [ 0.121825, 0.326386 ], [ -0.102658, -0.069341 ], [ 0.071675, 0.004744 ], - [ -0.117763, -0.202608 ] -]; - -const SIPRO_LSF_CB1_LBR: &[[f32; 2]] = &[ - [ 0.025412, 0.006095 ], [ -0.069803, 0.010650 ], [ -0.175957, -0.185800 ], - [ -0.139298, -0.048013 ], [ -0.156150, -0.129688 ], [ -0.160523, 0.068022 ], - [ 0.199683, 0.259982 ], [ 0.258038, 0.236147 ], [ 0.367089, 0.304716 ], - [ 0.251764, 0.305853 ], [ 0.394314, 0.382153 ], [ 0.448579, 0.337438 ], - [ 0.323286, 0.425563 ], [ 0.015369, 0.123820 ], [ -0.026770, 0.083881 ], - [ -0.112161, -0.097993 ], [ -0.221847, -0.161311 ], [ -0.050014, -0.092862 ], - [ -0.214960, -0.398498 ], [ -0.114062, -0.241381 ], [ 0.137950, 0.138852 ], - [ 0.031529, 0.065719 ], [ 0.208734, 0.084760 ], [ 0.157862, 0.057535 ], - [ 0.124750, 0.011922 ], [ -0.035227, -0.154397 ], [ -0.105523, -0.291427 ], - [ -0.073488, -0.201948 ], [ -0.224184, -0.273290 ], [ -0.168019, -0.240297 ], - [ -0.271591, -0.384682 ], [ -0.124784, 0.014253 ], [ 0.004210, -0.110418 ], - [ 0.074270, -0.014272 ], [ 0.053058, -0.068672 ], [ -0.090098, -0.145019 ], - [ 0.303214, 0.210323 ], [ 0.413443, 0.272002 ], [ 0.356904, 0.230646 ], - [ -0.035186, -0.028579 ], [ -0.117558, 0.115105 ], [ -0.159225, 0.218385 ], - [ -0.230178, 0.172901 ], [ -0.216148, -0.110195 ], [ 0.309444, 0.101508 ], - [ 0.250489, 0.118338 ], [ 0.293324, 0.151205 ], [ -0.023634, 0.033084 ], - [ 0.076708, 0.114024 ], [ 0.123119, 0.087704 ], [ -0.060265, 0.126543 ], - [ -0.223766, -0.021903 ], [ -0.241987, -0.328089 ], [ 0.205598, 0.147925 ], - [ -0.087010, 0.064601 ], [ -0.287892, -0.286099 ], [ -0.179451, -0.350781 ], - [ -0.219572, 0.043816 ], [ -0.217263, 0.245550 ], [ -0.286743, -0.180981 ], - [ 0.172659, 0.112620 ], [ -0.105422, 0.176856 ], [ 0.006176, -0.051491 ], - [ 0.099802, 0.176322 ], [ -0.186620, -0.068980 ], [ 0.164689, 0.185018 ], - [ 0.519877, 0.376111 ], [ 0.521941, 0.533731 ], [ 0.473375, 0.439534 ], - [ 0.214235, 0.202476 ], [ 0.579215, 0.466969 ], [ 0.310414, 0.271057 ], - [ 0.257450, 0.058939 ], [ 0.023936, -0.169464 ], [ -0.268817, -0.064531 ], - [ -0.174182, -0.000198 ], [ -0.268405, -0.234529 ], [ -0.296522, 0.247140 ], - [ 0.115950, -0.072194 ], [ -0.303666, 0.149084 ], [ -0.347762, -0.011002 ], - [ -0.223829, -0.214137 ], [ -0.278958, -0.457975 ], [ 0.135500, 0.238466 ], - [ 0.312730, 0.342760 ], [ 0.071754, -0.125912 ], [ 0.485938, 0.260429 ], - [ 0.037536, 0.179771 ], [ 0.391493, 0.156938 ], [ 0.397320, 0.484446 ], - [ -0.308630, -0.342418 ], [ -0.269599, -0.128453 ], [ -0.086683, -0.043863 ], - [ 0.421115, 0.213521 ], [ 0.082417, 0.049006 ], [ -0.087873, 0.238126 ], - [ 0.338899, 0.166131 ], [ -0.166988, 0.147105 ], [ -0.167214, -0.294075 ], - [ 0.588706, 0.328303 ], [ 0.207270, 0.017671 ], [ -0.141658, 0.291147 ], - [ -0.140850, 0.374321 ], [ 0.028180, 0.322510 ], [ -0.229858, 0.328036 ], - [ -0.060743, -0.260916 ], [ -0.011131, 0.246442 ], [ -0.058151, 0.310760 ], - [ -0.127536, -0.186432 ], [ -0.128523, -0.334884 ], [ -0.283899, 0.077729 ], - [ -0.031595, 0.181015 ], [ -0.329330, -0.108630 ], [ -0.215739, 0.107458 ], - [ 0.175734, 0.327134 ], [ 0.255801, 0.176077 ], [ 0.228265, 0.396859 ], - [ -0.370909, -0.185081 ], [ -0.355138, -0.300405 ], [ 0.061669, 0.242616 ], - [ 0.104489, 0.307995 ], [ -0.320021, -0.234002 ], [ 0.077349, 0.416286 ], - [ -0.339471, -0.407609 ], [ -0.019384, -0.215111 ], [ 0.168229, -0.032453 ], - [ -0.040140, 0.399658 ], [ -0.275141, 0.008218 ] -]; - -const SIPRO_LSF_CB2_LBR: &[[f32; 2]] = &[ - [ 0.024608, 0.006198 ], [ -0.216616, -0.398169 ], [ -0.089601, -0.201370 ], - [ -0.121878, -0.305281 ], [ 0.037913, 0.059320 ], [ 0.245126, 0.244089 ], - [ 0.266853, 0.182476 ], [ 0.319362, 0.203481 ], [ 0.349945, 0.252644 ], - [ 0.393849, 0.279272 ], [ 0.445707, 0.258063 ], [ 0.387321, 0.200855 ], - [ -0.038818, 0.129603 ], [ -0.009510, 0.076441 ], [ -0.023892, -0.028199 ], - [ -0.117134, -0.145990 ], [ -0.186585, -0.052886 ], [ -0.034250, -0.084547 ], - [ -0.087443, -0.095426 ], [ -0.453322, -0.174493 ], [ -0.363975, -0.148186 ], - [ -0.334413, -0.202479 ], [ -0.221313, -0.181320 ], [ -0.131146, -0.050611 ], - [ -0.104706, 0.115139 ], [ 0.192765, 0.275417 ], [ 0.014184, 0.194251 ], - [ 0.154215, 0.226949 ], [ 0.084031, 0.221759 ], [ 0.189438, 0.164566 ], - [ 0.130737, 0.170962 ], [ -0.066815, 0.062954 ], [ -0.177176, -0.145167 ], - [ -0.247608, -0.129767 ], [ -0.187886, -0.293720 ], [ -0.244036, -0.344655 ], - [ -0.203063, -0.234947 ], [ -0.292715, -0.158421 ], [ 0.064990, -0.028164 ], - [ 0.147664, 0.085995 ], [ 0.107977, 0.002253 ], [ 0.071286, 0.027533 ], - [ 0.021017, -0.049807 ], [ -0.272056, -0.217857 ], [ -0.065596, 0.008375 ], - [ -0.150818, -0.195514 ], [ -0.012767, -0.150787 ], [ 0.238541, 0.136606 ], - [ 0.291741, 0.114024 ], [ 0.202677, 0.103701 ], [ 0.140985, 0.037759 ], - [ -0.257347, -0.442383 ], [ -0.320666, -0.319742 ], [ -0.488725, -0.603660 ], - [ -0.319170, -0.469806 ], [ 0.014970, -0.101074 ], [ 0.102209, 0.066790 ], - [ -0.076202, -0.044884 ], [ 0.073868, 0.152565 ], [ 0.070755, -0.091358 ], - [ -0.016751, 0.027216 ], [ 0.071201, 0.096981 ], [ -0.060975, -0.145638 ], - [ 0.114156, 0.117587 ], [ -0.284757, -0.029101 ], [ -0.253005, -0.073645 ], - [ -0.204028, -0.098492 ], [ -0.114508, 0.001219 ], [ -0.225284, -0.011998 ], - [ -0.235670, 0.084330 ], [ 0.161921, 0.128334 ], [ 0.025717, 0.119456 ], - [ -0.255292, -0.281471 ], [ -0.392803, -0.095809 ], [ 0.039229, -0.152110 ], - [ -0.310905, -0.099233 ], [ -0.268773, 0.032308 ], [ -0.340150, 0.013129 ], - [ -0.344890, -0.045157 ], [ -0.188423, 0.265603 ], [ -0.168235, -0.000936 ], - [ 0.000462, 0.297000 ], [ 0.263674, 0.371214 ], [ -0.146797, -0.098225 ], - [ -0.386557, -0.282426 ], [ -0.070940, -0.255550 ], [ 0.293258, 0.252785 ], - [ 0.408332, 0.387751 ], [ -0.381914, -0.358918 ], [ -0.463621, -0.315560 ], - [ -0.323681, -0.258465 ], [ 0.250055, 0.071195 ], [ -0.405256, -0.429754 ], - [ -0.135748, -0.251274 ], [ 0.186827, 0.060177 ], [ 0.116742, -0.053526 ], - [ -0.403321, -0.220339 ], [ -0.414144, -0.021108 ], [ -0.416877, 0.050184 ], - [ -0.470083, -0.079564 ], [ -0.315554, 0.219217 ], [ -0.273183, 0.138437 ], - [ 0.253231, 0.306374 ], [ 0.177802, 0.346298 ], [ 0.210358, 0.207697 ], - [ -0.323480, 0.077519 ], [ -0.193136, 0.048170 ], [ 0.114492, 0.292778 ], - [ -0.130766, 0.056677 ], [ -0.171572, -0.349267 ], [ -0.370076, -0.536392 ], - [ -0.311109, -0.389953 ], [ 0.334928, 0.367664 ], [ 0.351246, 0.438664 ], - [ 0.518803, 0.331253 ], [ 0.437061, 0.327257 ], [ 0.318906, 0.307389 ], - [ -0.025972, -0.206758 ], [ 0.373278, 0.325438 ], [ 0.473488, 0.389441 ], - [ 0.478553, 0.477990 ], [ 0.332783, 0.153825 ], [ 0.212098, 0.452336 ], - [ 0.161522, -0.011212 ], [ 0.209368, 0.020687 ], [ -0.086262, 0.204493 ], - [ -0.388643, 0.133640 ], [ -0.177016, 0.134404 ] -]; - -const SIPRO_LSF_CB3_LBR: &[[f32; 2]] = &[ - [ -0.003594, -0.022447 ], [ 0.070651, 0.028334 ], [ -0.290374, -0.018347 ], - [ -0.224495, -0.370312 ], [ -0.269555, -0.131227 ], [ -0.122714, -0.267733 ], - [ 0.173325, 0.138698 ], [ 0.161946, 0.020687 ], [ 0.111706, 0.022510 ], - [ 0.097638, 0.056049 ], [ 0.139754, 0.059920 ], [ 0.056549, -0.050586 ], - [ 0.036301, 0.021501 ], [ -0.066347, 0.012324 ], [ -0.066972, 0.096136 ], - [ -0.120062, -0.084201 ], [ 0.011225, 0.047425 ], [ -0.012846, -0.067390 ], - [ -0.116201, 0.122874 ], [ -0.027819, 0.035453 ], [ -0.024743, 0.072835 ], - [ -0.034061, -0.001310 ], [ 0.077469, 0.081609 ], [ 0.128347, 0.139584 ], - [ 0.183416, 0.086563 ], [ -0.155839, -0.053775 ], [ -0.190403, -0.018639 ], - [ -0.202548, -0.062841 ], [ -0.373733, -0.275094 ], [ -0.394260, -0.186513 ], - [ -0.465700, -0.220031 ], [ 0.064400, -0.095825 ], [ -0.262053, -0.199837 ], - [ -0.167233, -0.094402 ], [ 0.048600, 0.057567 ], [ -0.007122, 0.168506 ], - [ 0.050938, 0.156451 ], [ -0.060828, 0.147083 ], [ -0.171889, 0.195822 ], - [ -0.218934, 0.138431 ], [ -0.270532, 0.195775 ], [ -0.405818, 0.075643 ], - [ -0.440187, 0.193387 ], [ -0.484968, 0.157607 ], [ -0.480560, 0.067230 ], - [ -0.436757, -0.111847 ], [ -0.040731, -0.040363 ], [ -0.202319, -0.170457 ], - [ -0.158515, -0.134551 ], [ -0.356709, -0.378549 ], [ -0.268820, -0.289831 ], - [ -0.188486, -0.289306 ], [ -0.148139, -0.177616 ], [ -0.071591, -0.191128 ], - [ -0.052270, -0.150589 ], [ -0.020543, -0.116220 ], [ 0.039584, -0.012592 ], - [ -0.268226, 0.042704 ], [ -0.209755, 0.069423 ], [ -0.168964, 0.124504 ], - [ -0.363240, 0.188266 ], [ -0.524935, -0.025010 ], [ -0.105894, -0.002699 ], - [ -0.251830, -0.062018 ], [ -0.310480, -0.082325 ], [ 0.014652, 0.083127 ], - [ -0.136512, 0.033116 ], [ -0.073755, -0.025236 ], [ 0.110766, 0.095954 ], - [ 0.002878, 0.011838 ], [ -0.074977, -0.244586 ], [ -0.047023, -0.081339 ], - [ -0.183249, 0.029525 ], [ 0.263435, 0.206934 ], [ -0.156721, -0.229993 ], - [ -0.112224, -0.208941 ], [ -0.116534, -0.123191 ], [ -0.073988, -0.111668 ], - [ 0.029484, -0.137573 ], [ -0.009802, -0.161685 ], [ -0.023273, 0.114043 ], - [ -0.332651, 0.049072 ], [ -0.394009, 0.018608 ], [ -0.433543, -0.035318 ], - [ -0.368459, -0.108024 ], [ -0.350215, -0.037617 ], [ -0.321140, -0.178537 ], - [ 0.020307, -0.048487 ], [ -0.210512, -0.232274 ], [ -0.082140, -0.065443 ], - [ 0.081961, -0.009340 ], [ 0.146794, 0.101973 ], [ 0.213999, 0.124687 ], - [ 0.100217, -0.054095 ], [ -0.114411, -0.041403 ], [ -0.097631, 0.037061 ], - [ -0.099651, -0.157978 ], [ -0.215790, -0.116550 ], [ -0.107100, 0.076300 ], - [ 0.084653, 0.126088 ], [ 0.246439, 0.091442 ], [ 0.160077, 0.188536 ], - [ 0.273900, 0.279190 ], [ 0.320417, 0.232550 ], [ 0.132710, -0.018988 ], - [ 0.018950, -0.091681 ], [ -0.032073, -0.202906 ], [ 0.212789, 0.178188 ], - [ 0.208580, 0.239726 ], [ 0.049420, 0.099840 ], [ -0.145695, -0.010619 ], - [ -0.132525, -0.322660 ], [ 0.019666, 0.126603 ], [ 0.260809, 0.147727 ], - [ -0.232795, -0.001090 ], [ -0.049826, 0.225987 ], [ -0.154774, 0.076614 ], - [ 0.045032, 0.221397 ], [ 0.321014, 0.161632 ], [ -0.062379, 0.053586 ], - [ 0.132252, 0.246675 ], [ 0.392627, 0.271905 ], [ -0.264585, 0.102344 ], - [ -0.327200, 0.121624 ], [ -0.399642, 0.124445 ], [ -0.108335, 0.179171 ], - [ 0.100374, 0.182731 ], [ 0.203852, 0.049505 ] -]; - -const SIPRO_LSF_CB4_LBR: &[[f32; 2]] = &[ - [ -0.047705, 0.008002 ], [ 0.011332, 0.065028 ], [ -0.021796, -0.034777 ], - [ -0.147394, -0.001241 ], [ -0.001577, 0.020599 ], [ -0.083827, -0.028975 ], - [ -0.177707, 0.066046 ], [ -0.043241, -0.165144 ], [ 0.053322, 0.096519 ], - [ -0.097688, 0.106484 ], [ -0.023392, 0.111234 ], [ -0.146747, -0.159360 ], - [ 0.027241, -0.011806 ], [ -0.043156, 0.057667 ], [ 0.019516, -0.062116 ], - [ 0.025990, 0.162533 ], [ 0.091888, 0.009720 ], [ -0.098511, 0.036414 ], - [ 0.013722, -0.116512 ], [ 0.054833, -0.180975 ], [ 0.119497, 0.128774 ], - [ 0.118378, -0.125997 ], [ 0.065882, -0.030932 ], [ 0.120581, -0.039964 ], - [ -0.050561, -0.088577 ], [ 0.050134, 0.033194 ], [ -0.129654, -0.075112 ], - [ -0.225334, -0.040234 ], [ 0.070629, -0.084455 ], [ 0.095508, 0.063548 ], - [ 0.150514, 0.034366 ], [ 0.186092, -0.069272 ] -]; - -const SIPRO_MEAN_LSF_LBR: [f32; 10] = [ - 0.297151, 0.452308, 0.765443, 1.134803, 1.421125, - 1.773822, 2.049173, 2.375914, 2.585097, 0.075756 -]; - -const SIPRO_LSF_CODEBOOK_16K: [&[[f32; 3]]; 4] = [ - SIPRO_LSF_CB0_16K, SIPRO_LSF_CB1_16K, SIPRO_LSF_CB2_16K, SIPRO_LSF_CB3_16K -]; - -const SIPRO_LSF_CB0_16K: &[[f32; 3]] = &[ - [ -0.089990, -0.172485, -0.203391 ], [ -0.094710, -0.178687, -0.134483 ], - [ -0.056398, -0.131952, -0.154500 ], [ -0.051362, -0.128138, -0.198549 ], - [ -0.061700, -0.142830, -0.251623 ], [ -0.041512, -0.115637, -0.229420 ], - [ -0.036544, -0.107512, -0.173125 ], [ -0.024158, -0.088450, -0.204144 ], - [ -0.038690, -0.103368, -0.132674 ], [ -0.056954, -0.128472, -0.104669 ], - [ -0.020963, -0.076785, -0.163199 ], [ -0.012952, -0.077249, -0.128385 ], - [ -0.032787, -0.097044, -0.093967 ], [ -0.035214, -0.053838, -0.111940 ], - [ -0.013850, -0.036926, -0.139328 ], [ -0.004956, -0.065092, -0.087709 ], - [ -0.065354, -0.065595, -0.079064 ], [ -0.023627, -0.081457, -0.054195 ], - [ -0.027335, -0.035244, -0.068034 ], [ 0.016555, -0.047075, -0.128286 ], - [ 0.021066, -0.037252, -0.092041 ], [ 0.014681, -0.043044, -0.057739 ], - [ -0.008493, -0.008143, -0.102486 ], [ -0.002303, -0.061540, -0.022952 ], - [ -0.006061, -0.014278, -0.033652 ], [ -0.005276, 0.011246, -0.062762 ], - [ 0.043411, -0.006303, -0.063730 ], [ 0.035885, -0.010052, -0.115290 ], - [ 0.030628, -0.031538, -0.017807 ], [ 0.022345, 0.028210, -0.032335 ], - [ 0.026535, 0.027536, -0.091150 ], [ -0.003365, -0.008077, 0.015687 ], - [ -0.026013, 0.017493, -0.010355 ], [ 0.059069, 0.010634, -0.007530 ], - [ 0.044038, -0.019424, 0.030453 ], [ -0.036065, -0.034215, -0.007758 ], - [ 0.022486, 0.042543, 0.027870 ], [ -0.049985, -0.016085, 0.021768 ], - [ -0.021715, 0.021168, 0.052076 ], [ -0.004243, -0.061228, 0.027640 ], - [ -0.033950, -0.017287, 0.064656 ], [ 0.016151, 0.000727, 0.062757 ], - [ -0.063456, -0.043152, 0.056707 ], [ -0.067715, 0.006126, 0.058178 ], - [ -0.038931, 0.051673, 0.030636 ], [ -0.073017, -0.074716, 0.026387 ], - [ -0.039893, -0.104629, 0.039616 ], [ -0.073179, -0.074601, 0.082069 ], - [ -0.066154, -0.027180, 0.099439 ], [ -0.075167, -0.121149, 0.071938 ], - [ -0.030382, -0.092582, 0.091067 ], [ -0.084519, -0.137542, 0.023626 ], - [ -0.060956, -0.121259, -0.015264 ], [ -0.030069, -0.093823, -0.008692 ], - [ -0.063564, -0.065225, -0.025820 ], [ -0.052074, -0.117595, -0.059689 ], - [ -0.091652, -0.165173, -0.045573 ], [ -0.070167, -0.121342, 0.131707 ], - [ -0.061024, -0.005833, -0.051035 ], [ 0.007837, -0.051816, 0.074575 ], - [ -0.070643, -0.053927, 0.149498 ], [ -0.014358, -0.066681, 0.139708 ], - [ -0.058186, 0.029576, 0.092923 ], [ -0.023371, 0.007058, 0.112484 ], - [ -0.057969, 0.022786, 0.148420 ], [ 0.029439, -0.017673, 0.121423 ], - [ -0.015811, 0.056785, 0.091594 ], [ 0.004347, 0.056680, 0.137848 ], - [ -0.004464, 0.002342, 0.184013 ], [ 0.029660, 0.046870, 0.082654 ], - [ 0.059408, 0.001016, 0.086063 ], [ 0.055263, 0.027574, 0.155037 ], - [ 0.062166, 0.064323, 0.117371 ], [ 0.022967, 0.100050, 0.077227 ], - [ 0.041795, 0.096343, 0.170421 ], [ 0.053189, 0.122931, 0.118549 ], - [ 0.094247, 0.094448, 0.078395 ], [ 0.082407, 0.033408, 0.041085 ], - [ 0.096820, 0.115960, 0.149433 ], [ 0.067804, 0.121849, 0.025336 ], - [ -0.008421, 0.104316, 0.032314 ], [ 0.031013, 0.073218, -0.004899 ], - [ 0.085079, 0.060323, -0.009687 ], [ 0.028174, 0.092766, -0.055590 ], - [ 0.070133, 0.039160, -0.061035 ], [ -0.039211, 0.072517, -0.028756 ], - [ 0.129686, 0.100233, -0.046998 ], [ 0.154189, 0.107616, 0.022791 ], - [ -0.049331, 0.094184, 0.087984 ], [ -0.013179, 0.126552, 0.125099 ], - [ -0.058716, 0.098524, 0.150886 ], [ -0.022753, 0.080011, 0.191127 ], - [ 0.013451, 0.164593, 0.153768 ], [ 0.074818, 0.181214, 0.108211 ], - [ 0.091323, 0.169249, 0.168460 ], [ 0.033885, 0.155516, 0.213745 ], - [ -0.032128, 0.227238, 0.135815 ], [ -0.059176, 0.168980, 0.229110 ], - [ 0.033917, 0.229753, 0.222264 ], [ 0.082702, 0.116370, 0.224697 ], - [ 0.127737, 0.186658, 0.212783 ], [ 0.047528, 0.063920, 0.216856 ], - [ -0.002446, 0.114174, 0.263289 ], [ -0.077783, 0.082523, 0.249697 ], - [ 0.010023, 0.024267, 0.256874 ], [ 0.053190, 0.111422, 0.310407 ], - [ -0.078804, 0.004444, 0.224078 ], [ -0.055253, -0.059180, 0.217892 ], - [ -0.065371, 0.008124, 0.333405 ], [ -0.076188, -0.098767, 0.286983 ], - [ -0.071911, -0.115804, 0.198031 ], [ -0.062473, 0.183639, 0.370162 ], - [ -0.042666, 0.255210, 0.262720 ], [ 0.011999, 0.217530, 0.318291 ], - [ -0.042144, 0.322087, 0.326387 ], [ 0.090663, 0.205835, 0.294784 ], - [ 0.058218, 0.293649, 0.277927 ], [ 0.157506, 0.282870, 0.294610 ], - [ 0.118248, 0.261007, 0.148614 ], [ 0.065261, 0.332362, 0.411912 ], - [ 0.141269, 0.451850, 0.315726 ], [ 0.001706, 0.456301, 0.357590 ], - [ -0.052947, 0.356559, 0.456944 ], [ 0.247707, 0.263837, 0.152591 ], - [ 0.306847, 0.417373, 0.258553 ], [ 0.166347, 0.149222, 0.118973 ], - [ 0.379709, 0.292172, 0.139875 ], [ 0.010171, -0.055170, -0.174523 ] -]; - -const SIPRO_LSF_CB1_16K: &[[f32; 3]] = &[ - [ -0.213011, -0.293385, -0.330597 ], [ -0.212582, -0.240992, -0.338239 ], - [ -0.223373, -0.306214, -0.277192 ], [ -0.231138, -0.287729, -0.229412 ], - [ -0.238466, -0.228571, -0.260954 ], [ -0.140931, -0.247018, -0.258566 ], - [ -0.136239, -0.249669, -0.350143 ], [ -0.149738, -0.192970, -0.281475 ], - [ -0.167058, -0.261052, -0.196301 ], [ -0.177049, -0.201324, -0.207897 ], - [ -0.116915, -0.200629, -0.212526 ], [ -0.162247, -0.143805, -0.245093 ], - [ -0.082042, -0.191842, -0.266338 ], [ -0.098846, -0.208511, -0.320481 ], - [ -0.113510, -0.152470, -0.222474 ], [ -0.066197, -0.179112, -0.207813 ], - [ -0.129490, -0.169320, -0.155238 ], [ -0.078843, -0.190292, -0.155172 ], - [ -0.087790, -0.147729, -0.169351 ], [ -0.141037, -0.127207, -0.177910 ], - [ -0.126525, -0.223961, -0.153639 ], [ -0.101464, -0.189953, -0.114559 ], - [ -0.102450, -0.106303, -0.151171 ], [ -0.103208, -0.144457, -0.105378 ], - [ -0.170794, -0.140525, -0.136428 ], [ -0.168641, -0.203064, -0.135368 ], - [ -0.138193, -0.116042, -0.111905 ], [ -0.145085, -0.168581, -0.092613 ], - [ -0.126379, -0.220431, -0.091327 ], [ -0.212934, -0.184797, -0.101632 ], - [ -0.193711, -0.140556, -0.078304 ], [ -0.173674, -0.197276, -0.060140 ], - [ -0.197897, -0.241907, -0.091997 ], [ -0.156037, -0.258519, -0.111628 ], - [ -0.241964, -0.191124, -0.063140 ], [ -0.261340, -0.240847, -0.103132 ], - [ -0.221621, -0.242972, -0.041255 ], [ -0.224166, -0.232742, -0.161568 ], - [ -0.203591, -0.294470, -0.126035 ], [ -0.209540, -0.303149, -0.053170 ], - [ -0.253859, -0.295066, -0.156050 ], [ -0.278143, -0.331105, -0.085237 ], - [ -0.300273, -0.198750, -0.094834 ], [ -0.260477, -0.169713, -0.132476 ], - [ -0.211889, -0.172454, -0.164281 ], [ -0.228370, -0.122149, -0.124178 ], - [ -0.254629, -0.135668, -0.081692 ], [ -0.263813, -0.154928, -0.213596 ], - [ -0.308224, -0.106877, -0.084404 ], [ -0.242644, -0.082862, -0.085835 ], - [ -0.252084, -0.064888, -0.146498 ], [ -0.198162, -0.105721, -0.188887 ], - [ -0.189238, -0.088028, -0.109736 ], [ -0.197598, -0.099831, -0.044030 ], - [ -0.269017, -0.105991, -0.021513 ], [ -0.231349, -0.058825, -0.041407 ], - [ -0.225589, -0.027501, -0.087160 ], [ -0.160347, -0.058341, -0.079789 ], - [ -0.158729, -0.108951, -0.067262 ], [ -0.170483, -0.053023, -0.017561 ], - [ -0.175207, -0.013649, -0.049513 ], [ -0.156004, -0.108378, -0.004052 ], - [ -0.219958, -0.082362, 0.014950 ], [ -0.217785, -0.012981, -0.009410 ], - [ -0.123290, -0.040849, -0.040910 ], [ -0.119861, -0.095078, -0.060246 ], - [ -0.117537, -0.065479, 0.002968 ], [ -0.103231, -0.113298, -0.023282 ], - [ -0.136365, -0.149524, -0.051387 ], [ -0.119332, -0.164400, -0.009103 ], - [ -0.104522, -0.060948, -0.083056 ], [ -0.071461, -0.070787, -0.037347 ], - [ -0.081116, -0.149015, -0.056740 ], [ -0.069561, -0.108099, -0.069167 ], - [ -0.055624, -0.117369, -0.025091 ], [ -0.091941, -0.190091, -0.060020 ], - [ -0.072003, -0.168433, -0.006540 ], [ -0.033305, -0.154427, -0.054608 ], - [ -0.062988, -0.127093, -0.108307 ], [ -0.056690, -0.170813, -0.102834 ], - [ -0.018273, -0.127863, -0.094998 ], [ -0.056239, -0.123678, -0.146262 ], - [ -0.023442, -0.154617, -0.137417 ], [ -0.051903, -0.078379, -0.093395 ], - [ -0.014599, -0.104412, -0.135959 ], [ -0.051582, -0.081280, -0.140643 ], - [ -0.092727, -0.091930, -0.107816 ], [ -0.024814, -0.140993, -0.183243 ], - [ -0.064307, -0.113024, -0.194788 ], [ -0.000118, -0.098858, -0.195336 ], - [ -0.028090, -0.048258, -0.164101 ], [ -0.093414, -0.055969, -0.172743 ], - [ -0.114445, -0.104336, -0.215204 ], [ -0.048518, -0.132063, -0.242991 ], - [ -0.159620, -0.060240, -0.178592 ], [ -0.135728, -0.067473, -0.131876 ], - [ -0.078464, -0.038040, -0.125105 ], [ -0.011061, -0.064011, -0.102496 ], - [ -0.033887, -0.026485, -0.109493 ], [ -0.129128, -0.014216, -0.111329 ], - [ -0.190687, -0.030660, -0.135825 ], [ -0.082037, 0.010997, -0.100167 ], - [ -0.183403, 0.001651, -0.098962 ], [ -0.074775, -0.030335, -0.062217 ], - [ -0.031759, -0.050551, -0.059420 ], [ -0.051439, 0.010827, -0.052148 ], - [ -0.126744, 0.008689, -0.047785 ], [ -0.145916, 0.042019, -0.077431 ], - [ -0.093552, 0.054143, -0.060473 ], [ -0.090660, 0.012868, -0.018195 ], - [ -0.079783, -0.033071, 0.001482 ], [ -0.033010, -0.022331, -0.014506 ], - [ -0.004798, -0.017339, -0.060120 ], [ -0.025021, 0.026390, -0.003263 ], - [ -0.001437, 0.025994, -0.040892 ], [ -0.074821, 0.019005, 0.027549 ], - [ -0.030811, -0.012114, 0.034284 ], [ 0.006785, 0.004618, 0.018717 ], - [ 0.013392, -0.032597, -0.023731 ], [ 0.035994, 0.005963, -0.011757 ], - [ 0.008071, -0.045750, 0.024889 ], [ 0.013055, 0.017040, 0.054121 ], - [ -0.012989, 0.044864, 0.036327 ], [ 0.025054, 0.047137, 0.009974 ], - [ 0.053801, 0.024178, 0.031774 ], [ 0.056442, -0.030647, 0.021291 ], - [ 0.032247, 0.052680, 0.049886 ], [ 0.035369, 0.090207, 0.031394 ], - [ 0.064720, 0.070390, 0.040938 ], [ 0.022112, 0.054834, 0.091059 ], - [ 0.041765, 0.086248, 0.070196 ], [ 0.070645, 0.060852, 0.078825 ], - [ 0.058506, 0.016920, 0.081612 ], [ 0.000009, 0.086500, 0.059849 ], - [ 0.071253, 0.107392, 0.059046 ], [ 0.094702, 0.096160, 0.090982 ], - [ 0.047639, 0.110877, 0.111227 ], [ 0.122444, 0.090909, 0.057396 ], - [ 0.101916, 0.052299, 0.029909 ], [ 0.076560, 0.086094, -0.007252 ], - [ 0.123411, 0.030769, 0.082749 ], [ 0.135579, 0.103022, 0.009540 ], - [ 0.120576, 0.065284, -0.024095 ], [ 0.077483, 0.028526, -0.012369 ], - [ 0.128747, 0.017901, -0.003874 ], [ 0.158254, 0.046962, 0.029577 ], - [ 0.102287, -0.002211, 0.037329 ], [ 0.089654, -0.021372, -0.006857 ], - [ 0.137917, 0.027228, -0.053223 ], [ 0.098728, -0.012192, -0.048518 ], - [ 0.083974, 0.036153, -0.062266 ], [ 0.048230, -0.010241, -0.052293 ], - [ 0.110135, 0.007715, -0.095233 ], [ 0.068294, -0.014317, -0.104029 ], - [ 0.063909, -0.056416, -0.063023 ], [ 0.059133, -0.044675, -0.023780 ], - [ 0.030748, 0.021845, -0.086332 ], [ 0.023994, -0.045574, -0.076232 ], - [ 0.052147, -0.059825, -0.109667 ], [ 0.013087, -0.020420, -0.121945 ], - [ 0.018163, -0.096765, -0.088758 ], [ 0.020196, -0.076470, -0.048112 ], - [ 0.020282, -0.084204, -0.135535 ], [ 0.040076, -0.053464, -0.161949 ], - [ -0.017796, -0.103070, -0.059559 ], [ -0.016484, -0.070138, -0.016866 ], - [ 0.004849, -0.112481, -0.017731 ], [ 0.040160, -0.073873, -0.005327 ], - [ 0.002202, -0.094723, 0.045366 ], [ -0.056918, -0.081578, 0.017875 ], - [ -0.031099, -0.141708, 0.009186 ], [ -0.102802, -0.122675, 0.030060 ], - [ -0.061717, -0.145116, 0.076680 ], [ -0.073607, -0.050464, 0.072853 ], - [ -0.117403, -0.194921, 0.040101 ], [ -0.185236, -0.133620, 0.045939 ], - [ -0.160174, -0.057226, 0.056641 ], [ -0.178489, -0.173435, -0.007806 ], - [ -0.199916, -0.204866, 0.047342 ], [ -0.152337, -0.249651, 0.034656 ], - [ -0.185637, -0.230942, -0.002072 ], [ -0.122548, -0.215209, -0.024552 ], - [ -0.249578, -0.209714, 0.009470 ], [ -0.160108, -0.257702, -0.040992 ], - [ -0.216694, -0.289353, 0.027182 ], [ -0.226390, -0.147844, -0.022742 ], - [ -0.288737, -0.272150, -0.013948 ], [ -0.262554, -0.237035, 0.072473 ], - [ -0.306267, -0.188335, -0.032894 ], [ -0.259666, -0.345816, 0.024138 ], - [ -0.271093, -0.137143, 0.040404 ], [ -0.201317, -0.286782, 0.107615 ], - [ -0.235725, -0.163396, 0.113844 ], [ -0.159988, -0.209788, 0.112140 ], - [ -0.262985, -0.056741, 0.093506 ], [ -0.277226, -0.037306, 0.016008 ], - [ -0.293486, -0.040422, -0.062018 ], [ -0.214921, 0.022900, 0.055295 ], - [ -0.253889, 0.058575, -0.000151 ], [ -0.246689, 0.024242, -0.058488 ], - [ -0.143790, 0.006767, 0.014061 ], [ -0.187077, 0.048882, -0.035625 ], - [ -0.196369, 0.112085, 0.031546 ], [ -0.124264, 0.086197, -0.020800 ], - [ -0.126249, 0.016960, 0.095741 ], [ -0.079816, 0.080398, 0.051038 ], - [ -0.056269, 0.075380, -0.028262 ], [ -0.120493, 0.148495, 0.028430 ], - [ -0.161750, 0.101290, 0.117806 ], [ -0.003247, 0.083393, -0.017061 ], - [ -0.034007, 0.142542, 0.007402 ], [ -0.037618, 0.025871, 0.089496 ], - [ -0.082819, 0.184435, 0.073224 ], [ 0.006448, 0.167015, 0.080548 ], - [ 0.035315, 0.144022, 0.003218 ], [ -0.023459, 0.088147, 0.152604 ], - [ 0.006247, -0.024099, 0.077792 ], [ 0.039894, 0.057586, -0.042455 ], - [ -0.020417, 0.035400, -0.093971 ], [ 0.075465, 0.052063, 0.145582 ], - [ 0.078027, 0.184720, 0.092096 ], [ 0.107295, 0.148380, 0.022264 ], - [ 0.066928, -0.052831, 0.065108 ], [ 0.093295, 0.118157, 0.149815 ], - [ 0.119373, 0.137114, 0.099536 ], [ 0.138653, 0.075509, 0.121545 ], - [ 0.174025, 0.077531, 0.077169 ], [ 0.165839, 0.150080, 0.133423 ], - [ 0.173276, 0.155887, 0.048150 ], [ 0.162910, 0.095898, 0.171896 ], - [ 0.214577, 0.112888, 0.115579 ], [ 0.204755, 0.106392, 0.032337 ], - [ 0.178853, 0.205034, 0.114760 ], [ 0.177401, 0.070504, -0.013778 ], - [ 0.241624, 0.166921, 0.066087 ], [ 0.219595, 0.183553, 0.172332 ], - [ 0.123671, 0.170842, 0.167216 ], [ 0.177104, 0.240197, 0.186359 ], - [ 0.272003, 0.220214, 0.126073 ], [ 0.093748, 0.235843, 0.160998 ], - [ 0.141510, 0.190012, 0.240416 ], [ 0.046878, 0.168984, 0.190412 ], - [ 0.094898, 0.107038, 0.235003 ], [ 0.108592, 0.269536, 0.262528 ], - [ -0.027754, 0.234355, 0.134544 ], [ 0.265127, 0.267540, 0.199041 ], - [ 0.199523, 0.291507, 0.265171 ], [ 0.266177, 0.209339, 0.350369 ], - [ 0.322159, 0.344794, 0.270823 ], [ 0.399957, 0.264065, 0.110387 ], - [ 0.277817, 0.127407, -0.035625 ], [ -0.177038, 0.208155, 0.119077 ], - [ 0.049075, -0.076294, 0.145711 ], [ 0.187246, 0.042865, -0.127097 ], - [ 0.117885, -0.023489, -0.138658 ], [ -0.284256, 0.068153, 0.124259 ] -]; - -const SIPRO_LSF_CB2_16K: &[[f32; 3]] = &[ - [ -0.223412, -0.236300, -0.188067 ], [ -0.202286, -0.218711, -0.102947 ], - [ -0.251652, -0.161020, -0.125280 ], [ -0.169223, -0.138155, -0.140430 ], - [ -0.176427, -0.146628, -0.222632 ], [ -0.120584, -0.187276, -0.180164 ], - [ -0.195559, -0.074225, -0.169109 ], [ -0.144551, -0.142774, -0.073340 ], - [ -0.111001, -0.111310, -0.130696 ], [ -0.095221, -0.174684, -0.111841 ], - [ -0.112158, -0.103049, -0.195130 ], [ -0.059989, -0.142170, -0.157850 ], - [ -0.127598, -0.051759, -0.153109 ], [ -0.063753, -0.067898, -0.164117 ], - [ -0.141753, -0.068274, -0.091999 ], [ -0.060482, -0.101054, -0.099475 ], - [ -0.104699, -0.104456, -0.066496 ], [ -0.073649, -0.052614, -0.091612 ], - [ -0.088268, -0.019072, -0.129956 ], [ -0.018837, -0.104115, -0.127837 ], - [ -0.021630, -0.033055, -0.129868 ], [ -0.083768, -0.047549, -0.041407 ], - [ -0.055892, -0.108526, -0.043200 ], [ -0.027816, -0.062499, -0.048190 ], - [ -0.002248, -0.110428, -0.062868 ], [ 0.001270, -0.033245, -0.072404 ], - [ -0.042747, -0.013835, -0.033829 ], [ -0.037615, -0.147833, -0.083912 ], - [ -0.045023, 0.006011, -0.092182 ], [ -0.050411, -0.081832, 0.005787 ], - [ 0.000357, -0.104282, -0.009428 ], [ -0.003893, -0.047892, -0.001506 ], - [ -0.040077, -0.147110, -0.009065 ], [ -0.060858, -0.030972, 0.012999 ], - [ -0.014674, 0.001370, 0.005554 ], [ -0.101362, -0.126061, -0.001898 ], - [ -0.102519, -0.000390, -0.015721 ], [ -0.132687, -0.069608, -0.019928 ], - [ -0.102227, -0.076131, 0.043306 ], [ -0.055193, 0.027001, 0.011857 ], - [ -0.156427, -0.016629, 0.017480 ], [ -0.078736, 0.002809, 0.057979 ], - [ -0.157789, -0.016693, -0.055073 ], [ -0.179397, -0.095520, 0.022065 ], - [ -0.110219, 0.010408, -0.081927 ], [ -0.125392, 0.049111, 0.044595 ], - [ -0.112528, 0.063173, -0.024954 ], [ -0.185525, 0.053093, -0.032102 ], - [ -0.176887, -0.019379, -0.115125 ], [ -0.249706, -0.017664, -0.059188 ], - [ -0.200243, -0.103311, -0.066846 ], [ -0.055404, 0.045106, -0.046991 ], - [ -0.000544, 0.022690, -0.044831 ], [ 0.022298, -0.016367, -0.022509 ], - [ 0.028278, 0.017585, -0.100612 ], [ 0.061781, -0.020826, -0.068190 ], - [ 0.029157, -0.074477, -0.098898 ], [ 0.043073, -0.067234, -0.032293 ], - [ 0.060157, 0.034636, -0.034885 ], [ 0.071153, -0.013881, -0.009036 ], - [ 0.054196, -0.029989, -0.131139 ], [ 0.030193, 0.024976, 0.009861 ], - [ 0.055943, -0.045304, 0.031927 ], [ 0.033217, -0.002418, 0.038165 ], - [ 0.063814, 0.045625, 0.025309 ], [ 0.033689, 0.038819, 0.049700 ], - [ 0.073582, 0.028527, 0.060200 ], [ -0.007957, 0.022531, 0.043687 ], - [ -0.000984, 0.054518, 0.018742 ], [ 0.057004, 0.060916, 0.060573 ], - [ 0.009883, 0.015238, 0.080211 ], [ 0.022742, 0.070832, 0.068855 ], - [ 0.053001, 0.029790, 0.091446 ], [ -0.042447, 0.060379, 0.061462 ], - [ 0.076826, 0.062468, 0.089653 ], [ 0.039065, 0.069768, 0.119128 ], - [ 0.064145, 0.095353, 0.071621 ], [ 0.094411, 0.069527, 0.054197 ], - [ 0.042812, 0.093060, 0.027980 ], [ 0.094791, 0.099189, 0.101112 ], - [ 0.117611, 0.048601, 0.093111 ], [ 0.119951, 0.122758, 0.051546 ], - [ 0.103558, 0.085245, -0.010700 ], [ 0.150126, 0.059766, 0.020280 ], - [ 0.108066, 0.017170, 0.008606 ], [ 0.108422, 0.023253, -0.063942 ], - [ 0.019652, 0.072284, -0.030331 ], [ 0.192719, 0.075624, 0.071156 ], - [ 0.221140, 0.069191, -0.035085 ], [ 0.188367, 0.126200, 0.035225 ], - [ 0.185760, 0.043537, -0.101714 ], [ -0.042518, 0.099646, 0.003244 ], - [ -0.015308, -0.027521, 0.046006 ], [ 0.034086, -0.045777, 0.095989 ], - [ 0.007174, -0.093358, 0.046459 ], [ -0.051248, -0.062095, 0.083161 ], - [ -0.045626, -0.133301, 0.052997 ], [ -0.037840, 0.024042, 0.131097 ], - [ -0.020217, -0.115942, 0.126170 ], [ -0.134550, -0.036291, 0.111322 ], - [ -0.110576, -0.160024, 0.091841 ], [ -0.093308, -0.184958, 0.013939 ], - [ -0.082735, -0.167417, -0.051725 ], [ -0.169934, -0.173003, -0.007155 ], - [ -0.128244, -0.213123, -0.053337 ], [ -0.079852, -0.154116, -0.246546 ], - [ -0.032242, -0.108756, -0.204133 ], [ -0.140117, -0.199495, -0.284505 ], - [ 0.010842, -0.074979, -0.166333 ], [ -0.093313, 0.145006, 0.034110 ], - [ -0.039236, 0.113213, 0.111053 ], [ 0.040613, -0.031783, 0.174058 ], - [ -0.164232, 0.131421, 0.149842 ], [ 0.026893, 0.107281, 0.179297 ], - [ 0.047086, 0.158606, 0.103267 ], [ -0.070567, 0.210459, 0.134734 ], - [ 0.094392, 0.137050, 0.166892 ], [ 0.086039, 0.063657, 0.168825 ], - [ 0.159371, 0.120897, 0.154357 ], [ 0.147101, 0.160684, 0.114882 ], - [ 0.120158, 0.199650, 0.180948 ], [ 0.191417, 0.174500, 0.170734 ], - [ 0.159153, 0.142165, 0.233347 ], [ 0.232002, 0.150181, 0.102736 ], - [ 0.188299, 0.221738, 0.228748 ], [ 0.256786, 0.209685, 0.161534 ], - [ 0.257861, 0.247793, 0.250516 ], [ -0.164461, -0.000143, 0.232461 ] -]; - -const SIPRO_LSF_CB3_16K: &[[f32; 3]] = &[ - [ -0.193369, -0.304643, -0.253777 ], [ -0.164125, -0.277786, -0.153116 ], - [ -0.135681, -0.209120, -0.211724 ], [ -0.121822, -0.215734, -0.292207 ], - [ -0.198781, -0.161674, -0.242538 ], [ -0.164147, -0.180570, -0.138070 ], - [ -0.095915, -0.198695, -0.154309 ], [ -0.248386, -0.234462, -0.136984 ], - [ -0.164968, -0.108318, -0.175635 ], [ -0.124171, -0.111809, -0.224402 ], - [ -0.067398, -0.157017, -0.195759 ], [ -0.090132, -0.119174, -0.165253 ], - [ -0.099460, -0.146895, -0.106799 ], [ -0.141493, -0.108103, -0.108880 ], - [ -0.085088, -0.098340, -0.109953 ], [ -0.105526, -0.054463, -0.154315 ], - [ -0.040480, -0.144285, -0.124042 ], [ -0.040969, -0.084039, -0.142880 ], - [ -0.049082, -0.118553, -0.066686 ], [ -0.096336, -0.087515, -0.055741 ], - [ -0.058605, -0.059327, -0.089275 ], [ -0.121842, -0.058681, -0.086949 ], - [ -0.053792, -0.022025, -0.124451 ], [ -0.036744, -0.068891, -0.045865 ], - [ 0.003900, -0.098237, -0.091158 ], [ -0.001664, -0.045089, -0.081353 ], - [ -0.072829, -0.034087, -0.038416 ], [ -0.100822, -0.007330, -0.088715 ], - [ -0.035911, -0.005864, -0.062577 ], [ -0.020205, -0.026547, -0.019634 ], - [ 0.004291, -0.041290, -0.138181 ], [ 0.023404, -0.010932, -0.044904 ], - [ 0.013557, 0.014823, -0.092943 ], [ 0.059673, -0.031024, -0.095739 ], - [ 0.021130, -0.080607, -0.034594 ], [ 0.024655, -0.035564, 0.003243 ], - [ 0.017106, 0.006952, -0.000308 ], [ 0.075208, -0.030910, -0.031181 ], - [ 0.024965, 0.048632, -0.039448 ], [ 0.057028, 0.021547, -0.009418 ], - [ -0.018577, 0.023697, -0.009759 ], [ 0.024077, 0.033053, 0.024324 ], - [ 0.037052, -0.003436, 0.044530 ], [ -0.012871, -0.007179, 0.031795 ], - [ 0.077877, 0.021547, 0.023131 ], [ 0.053365, 0.052078, 0.029433 ], - [ 0.011429, 0.070426, 0.028734 ], [ -0.001827, 0.033115, 0.061505 ], - [ -0.044870, 0.038568, 0.026239 ], [ 0.061633, 0.034799, 0.059784 ], - [ 0.034261, 0.060342, 0.065185 ], [ 0.058981, 0.082481, 0.047252 ], - [ 0.090008, 0.065942, 0.044470 ], [ 0.066961, 0.073728, -0.000428 ], - [ 0.074763, 0.060293, 0.085632 ], [ 0.066366, 0.103375, 0.079642 ], - [ 0.122297, 0.036558, 0.058745 ], [ 0.111042, 0.092093, 0.085412 ], - [ 0.099243, 0.115476, 0.039254 ], [ 0.019973, 0.122844, 0.050255 ], - [ 0.159571, 0.098965, 0.051740 ], [ 0.137624, 0.072405, -0.006922 ], - [ 0.130240, 0.146091, 0.089698 ], [ 0.138335, 0.092968, 0.136193 ], - [ 0.066031, 0.149304, 0.125476 ], [ 0.202749, 0.145751, 0.077122 ], - [ 0.002224, 0.082811, 0.131200 ], [ 0.124476, 0.178073, 0.162336 ], - [ 0.174722, 0.190298, 0.127106 ], [ 0.202193, 0.153569, 0.163840 ], - [ 0.242604, 0.197796, 0.136929 ], [ 0.185809, 0.229348, 0.193353 ], - [ -0.058814, 0.195178, 0.141821 ], [ 0.253646, 0.247175, 0.205766 ], - [ 0.061433, -0.025542, 0.119311 ], [ -0.057816, 0.082445, 0.073243 ], - [ -0.069239, 0.148678, 0.031146 ], [ -0.030217, -0.008503, 0.106194 ], - [ -0.026708, 0.087469, -0.009589 ], [ -0.090418, 0.000265, 0.056807 ], - [ -0.050607, -0.019383, 0.010494 ], [ -0.079397, 0.008233, -0.011469 ], - [ -0.072634, -0.061165, 0.046917 ], [ -0.075741, -0.072343, -0.007557 ], - [ -0.025162, -0.073363, 0.005173 ], [ -0.123371, -0.041257, -0.008375 ], - [ -0.139904, 0.018285, 0.009920 ], [ -0.143421, -0.104238, 0.033457 ], - [ -0.100923, -0.134400, -0.023257 ], [ -0.157791, -0.095042, -0.036959 ], - [ -0.219890, -0.078637, 0.001815 ], [ -0.183607, -0.023053, -0.043678 ], - [ -0.145303, -0.158923, -0.059045 ], [ -0.197615, -0.165199, 0.028099 ], - [ -0.225131, -0.167756, -0.056401 ], [ -0.216572, -0.104751, -0.102964 ], - [ -0.171336, -0.241967, -0.063404 ], [ -0.134035, -0.205614, 0.011831 ], - [ -0.297116, -0.211173, -0.015352 ], [ -0.086464, -0.200592, -0.070454 ], - [ -0.217777, -0.278403, 0.030398 ], [ -0.236248, -0.323694, -0.087588 ], - [ -0.222074, -0.210785, 0.106210 ], [ -0.283400, -0.097077, 0.041303 ], - [ -0.078417, -0.154464, 0.062956 ], [ -0.214417, -0.100695, 0.121909 ], - [ -0.178576, -0.028847, 0.061042 ], [ -0.037999, -0.144233, -0.010546 ], - [ -0.086695, -0.070996, 0.125282 ], [ 0.010788, -0.085006, 0.058527 ], - [ -0.154015, 0.066560, 0.071038 ], [ -0.143503, 0.033260, 0.154393 ], - [ -0.134069, 0.032420, -0.056293 ], [ -0.110851, 0.086908, 0.003920 ], - [ -0.057254, 0.047674, -0.055571 ], [ -0.214206, 0.068784, -0.004735 ], - [ -0.257264, 0.050468, 0.081702 ], [ -0.291834, 0.004120, -0.022366 ], - [ -0.173309, -0.029081, -0.115901 ], [ -0.207622, 0.168664, 0.136030 ], - [ 0.090541, 0.032754, -0.057330 ], [ 0.140219, -0.000735, -0.015633 ], - [ 0.136697, -0.017163, -0.100909 ], [ 0.029838, -0.089515, -0.147130 ], - [ -0.055367, -0.072683, -0.214015 ], [ 0.048680, -0.057633, -0.212429 ], - [ -0.013134, -0.113898, -0.196403 ], [ -0.071702, -0.159408, -0.254895 ] -]; - -const SIPRO_LSF_CB4_16K: [[f32; 4]; 128] = [ - [ -0.201277, -0.278679, -0.173262, -0.198580 ], - [ -0.214667, -0.151922, -0.117551, -0.192713 ], - [ -0.160962, -0.207728, -0.124750, -0.129749 ], - [ -0.131043, -0.137818, -0.155281, -0.166308 ], - [ -0.179134, -0.169602, -0.165223, -0.066293 ], - [ -0.136474, -0.177035, -0.250127, -0.134370 ], - [ -0.066970, -0.146274, -0.170638, -0.134436 ], - [ -0.083288, -0.165860, -0.103437, -0.140361 ], - [ -0.130474, -0.119317, -0.124393, -0.086408 ], - [ -0.127609, -0.134415, -0.073592, -0.116103 ], - [ -0.113027, -0.091756, -0.107786, -0.131935 ], - [ -0.125530, -0.182152, -0.093796, -0.045088 ], - [ -0.077122, -0.138052, -0.166271, -0.038886 ], - [ -0.073027, -0.106845, -0.067073, -0.113910 ], - [ -0.049146, -0.107019, -0.112531, -0.063388 ], - [ -0.101539, -0.119586, -0.050297, -0.040670 ], - [ -0.107784, -0.066913, -0.080993, -0.052352 ], - [ -0.152155, -0.103010, -0.090461, -0.015526 ], - [ -0.153087, -0.087656, -0.029889, -0.037367 ], - [ -0.215281, -0.138062, -0.089162, -0.050839 ], - [ -0.053350, -0.060169, -0.063459, -0.024499 ], - [ -0.051674, -0.076355, -0.033733, -0.077211 ], - [ -0.045047, -0.107006, -0.020880, -0.024525 ], - [ -0.083003, -0.063672, -0.013243, -0.028324 ], - [ -0.104104, -0.075450, -0.032746, 0.024480 ], - [ -0.085695, -0.019502, -0.045121, -0.025016 ], - [ -0.123120, -0.030844, -0.003533, -0.016224 ], - [ -0.025568, -0.049172, -0.003911, -0.027522 ], - [ -0.039029, -0.019857, -0.043211, -0.058087 ], - [ -0.040122, -0.023067, -0.001356, 0.008607 ], - [ -0.063351, -0.001776, 0.016015, -0.027088 ], - [ -0.068110, -0.038838, 0.042525, 0.001076 ], - [ -0.043623, -0.020736, -0.047862, 0.037710 ], - [ -0.041052, 0.021954, -0.025660, 0.000758 ], - [ -0.013035, 0.002583, -0.008233, -0.037300 ], - [ -0.005523, -0.014670, 0.019651, -0.012667 ], - [ -0.004409, -0.014437, -0.059412, -0.019701 ], - [ 0.024946, -0.011663, -0.014351, -0.028762 ], - [ 0.012660, 0.018489, -0.010205, 0.012695 ], - [ -0.004423, 0.017827, 0.040544, 0.003629 ], - [ 0.020684, 0.026743, 0.007752, -0.025595 ], - [ 0.032071, 0.000043, 0.026188, -0.006444 ], - [ 0.058793, 0.015820, -0.001119, -0.017415 ], - [ 0.020156, -0.047590, 0.004227, 0.008670 ], - [ 0.054770, 0.032135, 0.029770, -0.009767 ], - [ 0.030884, 0.047757, 0.033068, 0.006866 ], - [ 0.062039, 0.011646, 0.056037, 0.016859 ], - [ 0.013798, -0.028196, 0.060710, 0.014299 ], - [ 0.100043, 0.041445, 0.023379, -0.014889 ], - [ 0.062728, -0.042821, 0.002180, -0.055380 ], - [ 0.061663, 0.018767, -0.015571, -0.074095 ], - [ 0.062980, 0.080497, 0.011808, -0.031787 ], - [ 0.084964, 0.043100, -0.025877, 0.020309 ], - [ 0.014707, 0.035421, -0.041440, -0.053373 ], - [ 0.081268, 0.005791, -0.066290, -0.039825 ], - [ 0.017691, -0.020401, -0.040513, -0.083960 ], - [ 0.120874, 0.055753, -0.025988, -0.059552 ], - [ 0.079912, 0.007894, -0.085380, -0.114587 ], - [ 0.036856, -0.039331, -0.104237, -0.069116 ], - [ 0.008526, -0.064273, -0.048312, -0.038595 ], - [ 0.033461, -0.028956, -0.066505, 0.038722 ], - [ -0.042064, -0.043989, -0.100653, -0.071550 ], - [ -0.015342, -0.064850, -0.065675, -0.122769 ], - [ -0.006581, -0.004919, -0.113564, -0.145753 ], - [ 0.008273, -0.070702, -0.164998, -0.095541 ], - [ -0.001698, -0.063744, -0.129971, -0.011162 ], - [ -0.048471, -0.087500, -0.111006, -0.161823 ], - [ -0.032193, -0.091955, -0.080642, 0.012288 ], - [ -0.095873, -0.015986, -0.072722, -0.101745 ], - [ -0.079477, -0.082060, -0.203008, -0.100297 ], - [ -0.023883, -0.064022, -0.168341, -0.211739 ], - [ -0.070530, -0.103547, -0.123858, 0.055049 ], - [ -0.033503, -0.076812, -0.016287, 0.044159 ], - [ -0.088427, -0.161682, -0.058579, 0.013873 ], - [ -0.083068, -0.168222, -0.016773, -0.080209 ], - [ -0.080548, -0.139090, 0.030544, 0.007171 ], - [ -0.117482, -0.083718, 0.027074, -0.003674 ], - [ -0.163085, -0.156856, -0.012618, -0.022329 ], - [ -0.176540, -0.113042, -0.020148, 0.051770 ], - [ -0.153891, -0.199293, -0.043244, 0.028331 ], - [ -0.107822, -0.150615, 0.016430, 0.092919 ], - [ -0.137676, -0.183224, 0.066026, 0.029343 ], - [ -0.191106, -0.099250, 0.045370, 0.004084 ], - [ -0.237042, -0.130815, -0.022543, -0.029428 ], - [ -0.201014, -0.053591, -0.007305, -0.033547 ], - [ -0.249286, -0.228408, 0.005002, 0.007146 ], - [ -0.206509, -0.211998, -0.061352, -0.047233 ], - [ -0.255702, -0.135114, 0.076375, 0.036630 ], - [ -0.296271, -0.073946, -0.007273, -0.019601 ], - [ -0.302917, -0.175111, -0.070024, -0.043905 ], - [ -0.239275, -0.043962, -0.084982, -0.067446 ], - [ -0.254583, -0.294720, -0.088762, -0.070451 ], - [ -0.205583, -0.238996, -0.124753, 0.033076 ], - [ -0.205583, -0.215882, -0.028472, 0.118679 ], - [ -0.153640, -0.204464, -0.039654, -0.134441 ], - [ -0.145929, -0.191970, -0.175308, 0.021366 ], - [ -0.149348, -0.212569, -0.118324, 0.103812 ], - [ -0.166397, -0.220581, -0.265260, -0.029113 ], - [ -0.164171, -0.231262, -0.258828, 0.061427 ], - [ -0.200198, -0.263453, -0.212016, 0.115359 ], - [ -0.130088, -0.212168, -0.202368, 0.118563 ], - [ -0.206387, -0.078075, -0.227856, -0.111165 ], - [ -0.129605, -0.176848, -0.241584, -0.259900 ], - [ -0.176826, -0.045901, -0.141712, -0.209345 ], - [ -0.351173, -0.031097, -0.133935, -0.182412 ], - [ -0.164232, 0.027006, -0.014039, -0.053567 ], - [ -0.171037, -0.025924, 0.030972, 0.017329 ], - [ -0.080862, -0.021577, 0.007652, 0.063968 ], - [ -0.061788, 0.042024, -0.018783, -0.057979 ], - [ -0.110311, 0.054760, 0.031446, -0.006710 ], - [ -0.136637, 0.022171, 0.084991, 0.028039 ], - [ -0.254471, -0.004376, 0.078034, 0.033649 ], - [ -0.234464, 0.088157, 0.040999, 0.002639 ], - [ -0.037095, 0.059443, 0.072180, 0.015027 ], - [ -0.046841, -0.004813, 0.088266, 0.038786 ], - [ -0.086782, 0.120100, 0.082655, 0.020271 ], - [ -0.118361, -0.069242, 0.094867, 0.039200 ], - [ -0.023342, -0.084303, 0.052684, 0.017093 ], - [ -0.014194, 0.001012, 0.011946, 0.074125 ], - [ -0.015342, 0.076396, 0.022365, -0.028001 ], - [ 0.027706, 0.037047, 0.107573, 0.060815 ], - [ 0.030615, 0.040664, 0.010467, 0.074289 ], - [ 0.038646, 0.115584, 0.069627, 0.007642 ], - [ 0.096463, 0.069818, 0.062494, 0.015413 ], - [ 0.054834, 0.065232, 0.054286, 0.110088 ], - [ 0.152312, 0.092371, 0.026420, -0.013184 ], - [ 0.144264, 0.123438, 0.080131, 0.023233 ], - [ 0.124405, 0.009943, -0.148477, -0.205184 ] -]; - -const SIPRO_MEAN_LSF_16K: [f32; 16] = [ - 0.131554, 0.246615, 0.435896, 0.644419, - 0.827810, 1.017876, 1.198910, 1.379159, - 1.562157, 1.736908, 1.940719, 2.131963, - 2.347162, 2.521521, 2.717870, 2.847068 -]; - -const SIPRO_POW_0_5: [f32; 16] = [ - 0.5, - 0.25, - 0.125, - 0.0625, - 0.03125, - 0.015625, - 0.0078125, - 0.00390625, - 0.001953125, - 0.0009765625, - 0.00048828125, - 0.000244140625, - 0.0001220703125, - 0.00006103515625, - 0.000030517578125, - 0.0000152587890625 -]; -const SIPRO_POW_0_55: [f32; 10] = [ - 0.550000, 0.302500, 0.166375, 0.091506, 0.050328, - 0.027681, 0.015224, 0.008373, 0.004605, 0.002533 -]; -const SIPRO_POW_0_7: [f32; 10] = [ - 0.700000, 0.490000, 0.343000, 0.240100, 0.168070, - 0.117649, 0.082354, 0.057648, 0.040354, 0.028248 -]; -const SIPRO_POW_0_75: [f32; 10] = [ - 0.750000, 0.562500, 0.421875, 0.316406, 0.237305, - 0.177979, 0.133484, 0.100113, 0.075085, 0.056314 -]; - -const SIPRO_GAIN_CB_16K: [f32; 32] = [ - 0.07499, 0.10593, 0.14125, 0.18836, - 0.23714, 0.28184, 0.32734, 0.37584, - 0.42170, 0.47315, 0.53088, 0.59566, - 0.66834, 0.74989, 0.84140, 0.94406, - 1.05925, 1.18850, 1.33352, 1.49624, - 1.67880, 1.88365, 2.11349, 2.37137, - 2.66073, 3.05492, 3.54813, 4.21697, - 5.30884, 7.07946, 9.44061, 13.33521, -]; -const SIPRO_GAIN_CB_LBR: [[f32; 2]; 128] = [ - [ 0.035230, 0.161540 ], [ 0.049223, 0.448359 ], [ 0.057443, 0.809043 ], - [ 0.072434, 1.760306 ], [ 0.111491, 0.566418 ], [ 0.112820, 1.098524 ], - [ 0.143493, 0.726856 ], [ 0.144840, 0.347800 ], [ 0.180341, 1.050010 ], - [ 0.188171, 2.197256 ], [ 0.189771, 0.256947 ], [ 0.198260, 0.484678 ], - [ 0.210622, 0.755825 ], [ 0.220694, 0.590788 ], [ 0.237062, 1.322214 ], - [ 0.255175, 0.338710 ], [ 0.298980, 0.919051 ], [ 0.314627, 0.520961 ], - [ 0.337106, 1.469863 ], [ 0.341422, 2.804546 ], [ 0.363257, 0.736222 ], - [ 0.363881, 0.367640 ], [ 0.369850, 1.937934 ], [ 0.370136, 1.075201 ], - [ 0.397152, 0.549410 ], [ 0.426557, 0.876015 ], [ 0.450686, 0.215588 ], - [ 0.468116, 0.671848 ], [ 0.470495, 1.242034 ], [ 0.474180, 1.739845 ], - [ 0.484875, 0.490564 ], [ 0.498917, 0.971238 ], [ 0.530996, 0.785765 ], - [ 0.539768, 2.130689 ], [ 0.546021, 0.589544 ], [ 0.546632, 3.050846 ], - [ 0.552336, 0.389775 ], [ 0.556302, 1.400103 ], [ 0.559688, 1.105421 ], - [ 0.574140, 0.667513 ], [ 0.595547, 0.828943 ], [ 0.597771, 0.496929 ], - [ 0.617079, 1.863075 ], [ 0.619657, 1.221713 ], [ 0.621172, 0.950275 ], - [ 0.628426, 0.630766 ], [ 0.628689, 4.242164 ], [ 0.640899, 1.529846 ], - [ 0.645813, 0.331127 ], [ 0.653056, 0.748168 ], [ 0.662909, 1.077438 ], - [ 0.669505, 2.631114 ], [ 0.681570, 1.839298 ], [ 0.687844, 0.903400 ], - [ 0.688660, 1.270830 ], [ 0.695070, 0.578227 ], [ 0.697926, 0.428440 ], - [ 0.715454, 0.812355 ], [ 0.729981, 1.539357 ], [ 0.737434, 1.106765 ], - [ 0.740241, 2.033374 ], [ 0.740871, 0.568460 ], [ 0.752689, 0.698461 ], - [ 0.756587, 0.893078 ], [ 0.767797, 0.499246 ], [ 0.768516, 3.712434 ], - [ 0.773153, 1.332360 ], [ 0.786125, 1.042996 ], [ 0.788792, 0.238388 ], - [ 0.790861, 2.273229 ], [ 0.795338, 1.582767 ], [ 0.809621, 0.595501 ], - [ 0.821032, 0.756460 ], [ 0.824590, 0.922925 ], [ 0.826019, 1.186793 ], - [ 0.827426, 1.885076 ], [ 0.830080, 6.088666 ], [ 0.837028, 2.819993 ], - [ 0.845561, 1.490623 ], [ 0.848323, 0.410436 ], [ 0.856522, 0.729725 ], - [ 0.862636, 0.966880 ], [ 0.874561, 1.681660 ], [ 0.874751, 1.177630 ], - [ 0.879289, 2.301300 ], [ 0.886671, 0.613068 ], [ 0.896729, 0.781097 ], - [ 0.904777, 3.484111 ], [ 0.906098, 1.330892 ], [ 0.919182, 1.877203 ], - [ 0.919901, 0.569511 ], [ 0.921772, 1.034126 ], [ 0.922439, 0.376000 ], - [ 0.934221, 1.485214 ], [ 0.938842, 0.869135 ], [ 0.939166, 2.378294 ], - [ 0.958933, 1.122722 ], [ 0.959042, 0.694098 ], [ 0.960995, 1.743430 ], - [ 0.970763, 2.884897 ], [ 0.982881, 0.814506 ], [ 0.990141, 1.330022 ], - [ 0.996447, 1.823381 ], [ 1.000013, 0.967498 ], [ 1.000743, 0.480597 ], - [ 1.008020, 5.095226 ], [ 1.013883, 2.105435 ], [ 1.026438, 0.691312 ], - [ 1.027361, 1.558169 ], [ 1.030123, 3.586526 ], [ 1.033916, 1.118036 ], - [ 1.039315, 2.543360 ], [ 1.068596, 0.836380 ], [ 1.081023, 1.318768 ], - [ 1.093150, 2.267843 ], [ 1.095607, 1.712383 ], [ 1.102816, 1.037334 ], - [ 1.103231, 3.536292 ], [ 1.107320, 0.508615 ], [ 1.150000, 7.999000 ], - [ 1.156731, 1.236772 ], [ 1.168428, 2.268084 ], [ 1.184130, 0.775839 ], - [ 1.210609, 1.511840 ], [ 1.220663, 4.365683 ], [ 1.224016, 0.983179 ], - [ 1.252236, 2.778535 ], [ 1.301176, 1.923126 ] -]; -const SIPRO_GAIN_PRED: [f32; 4] = [ 0.200, 0.334, 0.504, 0.691 ]; - -const SIPRO_GAIN_PITCH_CB_16K: [f32; 16] = [ - 0.00, 0.2, 0.40, 0.5, 0.60, 0.7, 0.75, 0.8, - 0.85, 0.9, 0.95, 1.0, 1.05, 1.1, 1.15, 1.2, -]; -const SIPRO_GAIN_DB_CB_16K: [f32; 32] = [ - -22.5, -19.5, -17.0, -14.5, - -12.5, -11.0, -9.7, -8.5, - -7.5, -6.5, -5.5, -4.5, - -3.5, -2.5, -1.5, -0.5, - 0.5, 1.5, 2.5, 3.5, - 4.5, 5.5, 6.5, 7.5, - 8.5, 9.7, 11.0, 12.5, - 14.5, 17.0, 19.5, 22.5, -]; - -const SIPRO_SINC_16K: [f32; 31] = [ - 0.874475, 0.755101, 0.455962, 0.118807, -0.114223, -0.176778, - -0.101923, 0.015553, 0.086555, 0.078193, 0.018660, -0.037513, - -0.052733, -0.027459, 0.009967, 0.030278, 0.024050, 0.003055, - -0.013862, -0.016162, -0.006725, 0.004212, 0.008634, 0.005721, - -0.000000, -0.003710, -0.003690, -0.001228, 0.001409, 0.002610, - 0.0 -]; -const SIPRO_SINC_LBR: [f32; 61] = [ - 0.89852900, 0.86505100, 0.76925700, 0.62405400, 0.44863900, 0.265289000, - 0.09591670, -0.04125980, -0.13433800, -0.17898600, -0.17852800, -0.142609000, - -0.08493040, -0.02050780, 0.03695680, 0.07739260, 0.09552000, 0.091278100, - 0.06893920, 0.03570560, 0.0 , -0.03054810, -0.05041500, -0.057006800, - -0.05084230, -0.03500370, -0.01416020, 0.00665283, 0.02307130, 0.032348600, - 0.03353880, 0.02758790, 0.01678470, 0.00411987, -0.00747681, -0.015686000, - -0.01934810, -0.01837160, -0.01376340, -0.00704956, 0.0 , 0.005828860, - 0.00939941, 0.01037600, 0.00903320, 0.00604248, 0.00238037, -0.001098630, - -0.00366211, -0.00497437, -0.00503540, -0.00402832, -0.00241089, -0.000579834, - 0.00103760, 0.00222778, 0.00277710, 0.00271606, 0.00213623, 0.001159670, - 0.0 -]; diff --git a/src/codecs/ts102366.rs b/src/codecs/ts102366.rs deleted file mode 100644 index fb452c5..0000000 --- a/src/codecs/ts102366.rs +++ /dev/null @@ -1,1534 +0,0 @@ -use crate::formats::*; -use crate::frame::*; -use super::*; -use crate::io::bitreader::*; -use crate::dsp::fft::*; -use std::str::FromStr; -use std::f32::consts; - -const BLOCK_LEN: usize = 256; -const NBLOCKS: usize = 6; -const MAX_CHANNELS: usize = 5; -const MAX_CPLBANDS: usize = 18; -const MAX_BANDS: usize = 50; - -const MAGIC_BYTE0: u8 = 0x0B; -const MAGIC_BYTE1: u8 = 0x77; - -const STRATEGY_REUSE: u8 = 0; - -const LFE_CHANNEL: usize = MAX_CHANNELS; -const CPL_CHANNEL: usize = MAX_CHANNELS + 1; - -struct IMDCTContext { - xsincos: [FFTComplex; BLOCK_LEN/2], - fft: FFT, - size: usize, -} - -struct IMDCTWorkspace { - z: [FFTComplex; BLOCK_LEN / 2], - y: [FFTComplex; BLOCK_LEN / 2], - out: [f32; BLOCK_LEN * 2], -} - -impl IMDCTContext { - fn new(bits: usize) -> Self { - let size = 1 << bits; - let size4 = 1 << (bits - 2); - let mut xsincos: [FFTComplex; 512/4] = [FFTC_ZERO; 512/4]; - for k in 0..size4 { - let factor = 2.0 * consts::PI * ((8 * k + 1) as f32) / ((8 * size) as f32); - xsincos[k].re = -factor.cos(); - xsincos[k].im = -factor.sin(); - } - let fft = FFTBuilder::new_fft(FFTMode::SplitRadix, size/4); - IMDCTContext { xsincos: xsincos, size: size, fft: fft } - } - #[allow(non_snake_case)] - fn do_imdct(&mut self, coeffs: &[i32; BLOCK_LEN], tmp: &mut IMDCTWorkspace) { - do_imdct_core(&mut self.fft, &self.xsincos, self.size, false, coeffs, &mut tmp.z, &mut tmp.y); - let w = &TS102366_WINDOW; - let N2 = self.size / 2; - let N4 = self.size / 4; - let N8 = self.size / 8; - for n in 0..N8 { - tmp.out[ 2 * n] = -tmp.y[N8 + n] .im * w[ 2 * n]; - tmp.out[ 2 * n + 1] = tmp.y[N8 - n - 1].re * w[ 2 * n + 1]; - tmp.out[ N4 + 2 * n] = -tmp.y[ n] .re * w[N4 + 2 * n]; - tmp.out[ N4 + 2 * n + 1] = tmp.y[N4 - n - 1].im * w[N4 + 2 * n + 1]; - tmp.out[ N2 + 2 * n] = -tmp.y[N8 + n] .re * w[N2 - 2 * n - 1]; - tmp.out[ N2 + 2 * n + 1] = tmp.y[N8 - n - 1].im * w[N2 - 2 * n - 2]; - tmp.out[3 * N4 + 2 * n] = tmp.y[ n] .im * w[N4 - 2 * n - 1]; - tmp.out[3 * N4 + 2 * n + 1] = -tmp.y[N4 - n - 1].re * w[N4 - 2 * n - 2]; - } - } - #[allow(non_snake_case)] - fn do_imdct_ileave(&mut self, coeffs: &[i32; BLOCK_LEN], tmp: &mut IMDCTWorkspace) { - let mut ziter = tmp.z.chunks_mut(self.size / 4); - let z1 = ziter.next().unwrap(); - let z2 = ziter.next().unwrap(); - let mut yiter = tmp.y.chunks_mut(self.size / 4); - let y1 = yiter.next().unwrap(); - let y2 = yiter.next().unwrap(); - do_imdct_core(&mut self.fft, &self.xsincos, self.size, true, coeffs, z1, y1); - do_imdct_core(&mut self.fft, &self.xsincos, self.size, true, &coeffs[1..], z2, y2); - let w = &TS102366_WINDOW; - let N2 = self.size / 2; - let N4 = self.size / 4; - let N8 = self.size / 8; - for n in 0..N8 { - tmp.out[ 2 * n] = -y1[ n] .im * w[ 2 * n]; - tmp.out[ 2 * n + 1] = y1[N8 - n - 1].re * w[ 2 * n + 1]; - tmp.out[ N4 + 2 * n] = -y1[ n] .re * w[N4 + 2 * n]; - tmp.out[ N4 + 2 * n + 1] = y1[N8 - n - 1].im * w[N4 + 2 * n + 1]; - tmp.out[ N2 + 2 * n] = -y2[ n] .re * w[N2 - 2 * n - 1]; - tmp.out[ N2 + 2 * n + 1] = y2[N8 - n - 1].im * w[N2 - 2 * n - 2]; - tmp.out[3 * N4 + 2 * n] = y2[ n] .im * w[N4 - 2 * n - 1]; - tmp.out[3 * N4 + 2 * n + 1] = -y2[N8 - n - 1].re * w[N4 - 2 * n - 2]; - } - } -} - -#[allow(non_snake_case)] -fn do_imdct_core(fft: &mut FFT, xsc: &[FFTComplex; BLOCK_LEN/2], size: usize, ilace: bool, coeffs: &[i32], z: &mut [FFTComplex], y: &mut [FFTComplex]) { - let N = size; - let N2 = size / 2; - let N4 = size / 4; - let scale = 1.0 / ((1 << 24) as f32); - for k in 0..N4 { - let (c0, c1) = if !ilace { - ((coeffs[N2 - 2 * k - 1] as f32) * scale, - (coeffs[ 2 * k] as f32) * scale) - } else { - ((coeffs[N - 4 * k - 2] as f32) * scale, - (coeffs[ 4 * k] as f32) * scale) - }; - let c = FFTComplex { re: c0, im: c1 }; - z[k] = c * xsc[k]; - } - fft.do_fft_inplace(z, false); - for k in 0..N4 { - y[k] = z[k] * xsc[k]; - } -} - -struct AudioDecoder { - info: Rc<NACodecInfo>, - ablk: AudioBlock, - imdct512: IMDCTContext, - imdct256: IMDCTContext, - tmp: IMDCTWorkspace, - delay: [[f32; BLOCK_LEN]; MAX_CHANNELS + 1], -} - -impl AudioDecoder { - fn new() -> Self { - AudioDecoder { - info: NACodecInfo::new_dummy(), - ablk: AudioBlock::new(), - imdct512: IMDCTContext::new(9), - imdct256: IMDCTContext::new(8), - tmp: IMDCTWorkspace { - z: [FFTC_ZERO; BLOCK_LEN / 2], - y: [FFTC_ZERO; BLOCK_LEN / 2], - out: [0.0; BLOCK_LEN * 2], - }, - delay: [[0.0; BLOCK_LEN]; MAX_CHANNELS + 1], - } - } -} - -const SAMPLE_RATES: [u32; 4] = [ 48000, 44100, 32000, 0 ]; - -const FRAME_SIZES: [[usize; 64]; 4] = [ - [ - 64, 64, 80, 80, 96, 96, 112, 112, - 128, 128, 160, 160, 192, 192, 224, 224, - 256, 256, 320, 320, 384, 384, 448, 448, - 512, 512, 640, 640, 768, 768, 896, 896, - 1024, 1024, 1152, 1152, 1280, 1280, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - ], [ - 69, 70, 87, 88, 104, 105, 121, 122, - 139, 140, 174, 175, 208, 209, 243, 244, - 278, 279, 348, 349, 417, 418, 487, 488, - 557, 558, 696, 697, 835, 836, 975, 976, - 1114, 1115, 1253, 1254, 1393, 1394, - 0, 0, 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, 96, 120, 120, 144, 144, 168, 168, - 192, 192, 240, 240, 288, 288, 336, 336, - 384, 384, 480, 480, 576, 576, 672, 672, - 768, 768, 960, 960, 1152, 1152, 1344, 1344, - 1536, 1536, 1728, 1728, 1920, 1920, - 0, 0, 0, 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 ], -]; - -#[derive(Debug,Clone,Copy)] -struct Syncinfo { - crc1: u16, - fscod: u8, - frmsizecod: u8, - samplerate: u32, - frame_size: usize, -} - -impl Syncinfo { - fn read(br: &mut BitReader) -> DecoderResult<Self> { - let syncword = br.read(16)?; - validate!(syncword == ((MAGIC_BYTE0 as u32) * 256) + (MAGIC_BYTE1 as u32)); - let crc1 = br.read(16)? as u16; - let fscod = br.read(2)? as usize; - let frmsizecod = br.read(6)? as usize; - Ok(Syncinfo { crc1: crc1, fscod: fscod as u8, frmsizecod: frmsizecod as u8, - samplerate: SAMPLE_RATES[fscod], frame_size: FRAME_SIZES[fscod][frmsizecod] * 2 }) - } - fn is_valid(&self) -> bool { - (self.samplerate != 0) && (self.frame_size != 0) - } -} - -trait ReadOptional { - fn read_optional8(&mut self) -> BitReaderResult<Option<u8>>; - fn read_optional16(&mut self, bits: u8) -> BitReaderResult<Option<u16>>; -} - -impl<'a> ReadOptional for BitReader<'a> { - fn read_optional8(&mut self) -> BitReaderResult<Option<u8>> { - if self.read_bool()? { - Ok(Some(self.read(8)? as u8)) - } else { - Ok(None) - } - } - fn read_optional16(&mut self, bits: u8) -> BitReaderResult<Option<u16>> { - if self.read_bool()? { - Ok(Some(self.read(bits)? as u16)) - } else { - Ok(None) - } - } -} - -#[derive(Debug,Clone,Copy,PartialEq)] -enum ACMode { - DualMono, - Mono, - Stereo, - Mode3_0, - Mode2_1, - Mode3_1, - Mode2_2, - Mode3_2, -} - -impl ACMode { - fn get_num_channels(&self) -> usize { - match *self { - ACMode::DualMono => 2, - ACMode::Mono => 1, - ACMode::Stereo => 2, - ACMode::Mode3_0 => 3, - ACMode::Mode2_1 => 3, - ACMode::Mode3_1 => 4, - ACMode::Mode2_2 => 4, - ACMode::Mode3_2 => 5, - } - } - fn get_channel_map_str(&self) -> &'static str { - match *self { - ACMode::DualMono => "C,C", - ACMode::Mono => "C", - ACMode::Stereo => "L,R", - ACMode::Mode3_0 => "L,C,R", - ACMode::Mode2_1 => "L,R,Cs", - ACMode::Mode3_1 => "L,C,R,Cs", - ACMode::Mode2_2 => "L,R,Ls,Rs", - ACMode::Mode3_2 => "L,C,R,Ls,Rs", - } - } - fn get_channel_map(&self, has_lfe: bool) -> NAChannelMap { - let mut chmap = NAChannelMap::from_str(self.get_channel_map_str()).unwrap(); - if has_lfe { - chmap.add_channel(NAChannelType::LFE); - } - chmap - } - fn is_3_x(&self) -> bool { - match *self { - ACMode::Mode3_0 | - ACMode::Mode3_1 | - ACMode::Mode3_2 => true, - _ => false, - } - } - fn is_surround(&self) -> bool { - match *self { - ACMode::Mode2_1 | - ACMode::Mode3_1 | - ACMode::Mode2_2 | - ACMode::Mode3_2 => true, - _ => false, - } - } -} - -const AC_MODES: [ACMode; 8] = [ - ACMode::DualMono, ACMode::Mono, ACMode::Stereo, - ACMode::Mode3_0, ACMode::Mode2_1, - ACMode::Mode3_1, ACMode::Mode2_2, - ACMode::Mode3_2 -]; - -#[derive(Debug,Clone,Copy)] -struct Mixinfo { - dialnorm: u8, - compr: Option<u8>, - langcod: Option<u8>, - mixlevel: Option<u8>, - roomtyp: Option<u8>, -} - -impl Mixinfo { - fn read(br: &mut BitReader) -> DecoderResult<Self> { - let dialnorm = br.read(5)? as u8; - let compr = br.read_optional8()?; - let langcod = br.read_optional8()?; - let (mixlevel, roomtyp) = if br.read_bool()? { - let mlev = br.read(5)? as u8; - let rt = br.read(2)? as u8; - validate!(rt < 3); - (Some(mlev), Some(rt)) - } else { - (None, None) - }; - Ok(Mixinfo { dialnorm, compr, langcod, mixlevel, roomtyp }) - } -} - -#[derive(Debug,Clone,Copy)] -struct BSI { - bsid: u8, - shift: u8, - bsmod: u8, - acmod: ACMode, - cmixlev: Option<u8>, - surmixlev: Option<u8>, - dsurmod: Option<u8>, - lfeon: bool, - mixinfo: Mixinfo, - mixinfo2: Option<Mixinfo>, - copysmth: bool, - origbs: bool, - timecod1: Option<u16>, - timecod2: Option<u16>, - has_addb: bool, -} - -impl BSI { - fn read(br: &mut BitReader) -> DecoderResult<BSI> { - let bsid = br.read(5)? as u8; - validate!(bsid <= 10); - let shift = if bsid < 9 { 0 } else { bsid - 9 + 1 }; - let bsmod = br.read(3)? as u8; - let acmod_id = br.read(3)? as usize; - validate!(acmod_id < AC_MODES.len()); - let acmod = AC_MODES[acmod_id]; - let cmixlev = if acmod.is_3_x() { - let cl = br.read(2)? as u8; - validate!(cl < 3); - Some(cl) - } else { None }; - let surmixlev = if acmod.is_surround() { - let sml = br.read(2)? as u8; - validate!(sml < 3); - Some(sml) - } else { None }; - let dsurmod = if acmod == ACMode::Stereo { - let dsm = br.read(2)? as u8; - validate!(dsm < 3); - Some(dsm) - } else { None }; - let lfeon = br.read_bool()?; - let mixinfo = Mixinfo::read(br)?; - let mixinfo2 = if acmod == ACMode::DualMono { - Some(Mixinfo::read(br)?) - } else { - None - }; - let copysmth = br.read_bool()?; - let origbs = br.read_bool()?; - let timecod1 = br.read_optional16(14)?; - let timecod2 = br.read_optional16(14)?; - let has_addb = br.read_bool()?; - Ok(BSI{ - bsid, shift, bsmod, acmod, lfeon, - cmixlev, surmixlev, dsurmod, - mixinfo: mixinfo, mixinfo2: mixinfo2, - copysmth, origbs, timecod1, timecod2, has_addb, - }) - } -} - -#[derive(Clone, Copy)] -struct ChannelData { - blksw: bool, - dithflag: bool, - - chincpl: bool, - cplcoe: bool, - cplcoexp: [u8; MAX_CPLBANDS], - cplcomant: [u8; MAX_CPLBANDS], - mstrcplco: u8, - - chbwcod: u8, - - expstr: u8, - gainrng: u8, - startmant: usize, - endmant: usize, - groups: usize, - - fsnroffst: u8, - fgaincod: usize, - snroffset: i32, - - deltbae: u8, - deltnseg: usize, - deltoffst: [u8; 8], - deltlen: [usize; 8], - deltba: [u8; 8], - - bap: [u8; 256], - exps: [u8; 256], - mant: [i32; 256], - - psd: [i16; 256], - bndpsd: [i32; 64], -} - -const GROUPS: [usize; 4] = [ 0, 3, 6, 12 ]; -const GROUP_BIAS: [usize; 4] = [ 0, 0, 3, 9 ]; - -fn decode_exps(br: &mut BitReader, dst: &mut [u8], mut prev: u8, grplen: usize) -> DecoderResult<()> { - let repeat = grplen / 3; - - for out in dst.chunks_mut(grplen) { - let val = br.read(7)? as u8; - validate!(val < 125); - let diff: [u8; 3] = [ val / 25, (val / 5) % 5, val % 5 ]; - for (i, exps) in out.chunks_mut(repeat).enumerate() { - exps[0] = (prev + diff[i]).wrapping_sub(2); - validate!(exps[0] <= 24); - for j in 1..repeat { - exps[j] = exps[0]; - } - prev = exps[0]; - } - } - - Ok(()) -} - -macro_rules! read_bap { - ($br: expr, $tab:ident, $nbits:expr) => ({ - let val = $br.read($nbits)? as usize; - validate!(val < $tab.len()); - $tab[val] - }); - ($br:expr, $tab:ident, $nbits:expr, $bufidx:expr, $bap_buf:expr, $bap_buf_fill:expr) => ( - if $bap_buf_fill[$bufidx] > 0 { - $bap_buf_fill[$bufidx] -= 1; - $bap_buf[$bufidx][$bap_buf_fill[$bufidx]] - } else { - let val = $br.read($nbits)? as usize; - validate!(val < $tab.len()); - for i in 1..$tab[0].len() { - $bap_buf[$bufidx][i - 1] = $tab[val][i]; - } - $bap_buf_fill[$bufidx] = $tab[0].len() - 1; - $tab[val][0] - } - ); -} - -impl ChannelData { - fn new() -> Self { - ChannelData { - blksw: false, - dithflag: false, - - chincpl: false, - cplcoe: false, - cplcoexp: [0; MAX_CPLBANDS], - cplcomant: [0; MAX_CPLBANDS], - mstrcplco: 0, - - chbwcod: 0, - - expstr: 0, - gainrng: 0, - startmant: 0, - endmant: 0, - groups: 0, - - fsnroffst: 0, - fgaincod: 0, - snroffset: 0, - - deltbae: 0, - deltnseg: 0, - deltoffst: [0; 8], - deltlen: [0; 8], - deltba: [0; 8], - - bap: [0; 256], - exps: [0; 256], - mant: [0; 256], - - psd: [0; 256], - bndpsd: [0; 64], - } - } - fn read_strategy(&mut self, br: &mut BitReader, blk_no: usize) -> DecoderResult<()> { - self.expstr = br.read(2)? as u8; - validate!(blk_no != 0 || self.expstr != STRATEGY_REUSE); - if self.expstr != STRATEGY_REUSE { - if self.startmant > 0 { - self.groups = (self.endmant - self.startmant) / GROUPS[self.expstr as usize]; - } else if self.endmant != 0{ - let idx = self.expstr as usize; - self.groups = (self.endmant + GROUP_BIAS[idx] - 1) / GROUPS[idx]; - } else { - self.groups = 0; - } - } - Ok(()) - } - fn read_exps(&mut self, br: &mut BitReader, is_cpl: bool, is_lfe: bool) -> DecoderResult<()> { - if self.expstr == STRATEGY_REUSE { return Ok(()); } - let grpsize = GROUPS[self.expstr as usize]; - self.exps = [0; 256]; - if is_cpl { - let first = (br.read(4)? as u8) << 1; - let out = &mut self.exps[self.startmant..self.endmant]; - decode_exps(br, out, first, grpsize)?; - } else if !is_lfe { - self.exps[0] = br.read(4)? as u8; - let first = self.exps[0]; - let out = &mut self.exps[1..self.endmant]; - decode_exps(br, out, first, grpsize)?; - self.gainrng = br.read(2)? as u8; - } else { - self.exps[0] = br.read(4)? as u8; - let first = self.exps[0]; - let out = &mut self.exps[1..7]; - decode_exps(br, out, first, grpsize)?; - } - Ok(()) - } - fn read_snr(&mut self, br: &mut BitReader) -> DecoderResult<()> { - self.fsnroffst = br.read(4)? as u8; - self.fgaincod = br.read(3)? as usize; - Ok(()) - } - fn read_deltbai(&mut self, br: &mut BitReader) -> DecoderResult<()> { - if self.deltbae == 1 { - self.deltnseg = (br.read(3)? as usize) + 1; - for seg in 0..self.deltnseg { - self.deltoffst[seg] = br.read(5)? as u8; - self.deltlen[seg] = br.read(4)? as usize; - self.deltba[seg] = br.read(3)? as u8; - } - } - Ok(()) - } - - fn compute_bndpsd(&mut self) { - let start = self.startmant; - let end = self.endmant; - let exps = &mut self.exps; - let psd = &mut self.psd; - let bndpsd = &mut self.bndpsd; - - for bin in start..end { - psd[bin] = 3072 - ((exps[bin] as i16) << 7); - } - - let mut bin = start; - let mut band = TS102366_BIN_TO_BAND[bin] as usize; - let mut lastbin; - loop { - lastbin = ((TS102366_BAND_START[band] as usize) + (TS102366_BAND_SIZE[band] as usize)).min(end); - bndpsd[band] = psd[bin] as i32; - bin += 1; - while bin < lastbin { - bndpsd[band] = logadd(bndpsd[band], psd[bin] as i32); - bin += 1; - } - band += 1; - if lastbin >= end { break; } - } - } - fn compute_mask(&mut self, mask: &mut [i32; MAX_BANDS], fscod: usize, sgain: u16, fdecay: u8, sdecay: u8, - dbknee: u16, cplfleak: u16, cplsleak: u16, shift: u8) { - let fgain = TS102366_FAST_GAIN[self.fgaincod] as i32; - - let bndstart = TS102366_BIN_TO_BAND[self.startmant] as usize; - let bndend = (TS102366_BIN_TO_BAND[self.endmant - 1] as usize) + 1; - - let mut excite: [i32; MAX_BANDS] = [0; MAX_BANDS]; - - let begin; - let mut fast_leak; - let mut slow_leak; - if bndstart == 0 { - let lowcomp0 = calc_lowcomp(0, self.bndpsd[0], self.bndpsd[1], 0); - excite[0] = self.bndpsd[0] - fgain - lowcomp0; - let lowcomp1 = calc_lowcomp(lowcomp0, self.bndpsd[1], self.bndpsd[2], 1); - excite[1] = self.bndpsd[1] - fgain - lowcomp1; - let mut sband = 7; - let mut lowcomp = lowcomp1; - fast_leak = 0; - slow_leak = 0; - for band in 2..7 { - let not_lfe_case = (bndend != 7) || (band != 6); - if not_lfe_case { - lowcomp = calc_lowcomp(lowcomp, self.bndpsd[band], self.bndpsd[band + 1], band); - } - fast_leak = self.bndpsd[band] - fgain; - slow_leak = self.bndpsd[band] - (sgain as i32); - excite[band] = fast_leak - lowcomp; - if not_lfe_case { - if self.bndpsd[band] <= self.bndpsd[band + 1] { - sband = band + 1; - break; - } - } - } - for band in sband..bndend.min(22) { - if (bndend != 7) || (band != 6) { - lowcomp = calc_lowcomp(lowcomp, self.bndpsd[band], self.bndpsd[band + 1], band); - } - fast_leak = (fast_leak - (fdecay as i32)).max(self.bndpsd[band] - (fgain as i32)); - slow_leak = (slow_leak - (sdecay as i32)).max(self.bndpsd[band] - (sgain as i32)); - excite[band] = slow_leak.max(fast_leak - lowcomp); - } - begin = 22; - } else { - begin = bndstart; - fast_leak = cplfleak as i32; - slow_leak = cplsleak as i32; - } - for band in begin..bndend { - fast_leak = (fast_leak - (fdecay as i32)).max(self.bndpsd[band] - (fgain as i32)); - slow_leak = (slow_leak - (sdecay as i32)).max(self.bndpsd[band] - (sgain as i32)); - excite[band] = fast_leak.max(slow_leak); - } - for band in bndstart..bndend { - if self.bndpsd[band] < (dbknee as i32) { - excite[band] += ((dbknee as i32) - self.bndpsd[band]) >> 2; - } - mask[band] = excite[band].max(TS102366_HTH[fscod][band >> shift] as i32); - } - } - fn apply_delta_info(&mut self, mask: &mut [i32; MAX_BANDS]) { - if self.deltbae == 0 || self.deltbae == 1 { - let mut band = TS102366_BIN_TO_BAND[self.startmant] as usize; - for seg in 0..self.deltnseg { - band += self.deltoffst[seg] as usize; - let delta = if self.deltba[seg] >= 4 { - ((self.deltba[seg] as i32) - 3) << 7 - } else { - ((self.deltba[seg] as i32) - 4) << 7 - }; - if band + self.deltlen[seg] > MAX_BANDS { break; } - for _ in 0..self.deltlen[seg] { - mask[band] += delta; - band += 1; - } - } - } - } - fn calc_snr_offset(&mut self, csnroffst: u8) { - self.snroffset = ((((csnroffst as i32) - 15) << 4) + (self.fsnroffst as i32)) << 2; - } - fn compute_bap(&mut self, mask: &mut [i32; MAX_BANDS], floor: u16) { - let end = self.endmant; - let mut band = TS102366_BIN_TO_BAND[self.startmant] as usize; - let mut bin = self.startmant; - let mut lastbin; - loop { - lastbin = ((TS102366_BAND_START[band] as usize) + (TS102366_BAND_SIZE[band] as usize)).min(end); - mask[band] = (mask[band] - self.snroffset - (floor as i32)).max(0) & 0x1FE0; - mask[band] += floor as i32; - while bin < lastbin { - let addr = (((self.psd[bin] as i32) - mask[band]) >> 5).min(63).max(0) as usize; - self.bap[bin] = TS102366_BAPTAB[addr]; - bin += 1; - } - if lastbin == end { break; } - band += 1; - } - } - fn read_mant(&mut self, br: &mut BitReader, bap_buf: &mut [[i32; 2]; 3], bap_buf_fill: &mut [usize; 3]) -> DecoderResult<()> { - self.mant = [0; BLOCK_LEN]; - for bin in self.startmant..self.endmant { - self.mant[bin] = match self.bap[bin] { - 0 => { - if self.dithflag { - 42 // todo dither - } else { - 0 - } - }, - 1 => { read_bap!(br, TS102366_QUANT3_MAP, 5, 0, bap_buf, bap_buf_fill) }, - 2 => { read_bap!(br, TS102366_QUANT5_MAP, 7, 1, bap_buf, bap_buf_fill) }, - 3 => { read_bap!(br, TS102366_QUANT7_MAP, 3) }, - 4 => { read_bap!(br, TS102366_QUANT11_MAP, 7, 2, bap_buf, bap_buf_fill) }, - 5 => { read_bap!(br, TS102366_QUANT15_MAP, 4) }, - _ => { - validate!(self.bap[bin] < 15); - let nbits = TS102366_BAP_BITS[(self.bap[bin] as usize) - 6]; - let val = br.read(nbits)? as i16; - ((val << (16 - nbits)) as i32) << 9 - }, - }; - self.mant[bin] >>= self.exps[bin]; - } - Ok(()) - } - - fn synth(&mut self, imdct512: &mut IMDCTContext, imdct256: &mut IMDCTContext, tmp: &mut IMDCTWorkspace, delay: &mut [f32; BLOCK_LEN], dst: &mut [f32]) { - if !self.blksw { - imdct512.do_imdct(&self.mant, tmp); - } else { - imdct256.do_imdct_ileave(&self.mant, tmp); - } - overlap(delay, &tmp.out, dst); - } -} - -fn logadd(acc: i32, add: i32) -> i32 { - let c = acc - add; - let addr = (c.abs() >> 1).min(255); - if c >= 0 { - acc + (TS102366_LATAB[addr as usize] as i32) - } else { - add + (TS102366_LATAB[addr as usize] as i32) - } -} - -fn calc_lowcomp(a: i32, b0: i32, b1: i32, band: usize) -> i32 { - if band < 7 { - if (b0 + 256) == b1 { - 384 - } else if b0 > b1 { - 0.max(a - 64) - } else { - a - } - } else if band < 20 { - if (b0 + 256) == b1 { - 320 - } else if b0 > b1 { - 0.max(a - 64) - } else { - a - } - } else { - 0.max(a - 128) - } -} - -fn overlap(delay: &mut [f32; BLOCK_LEN], src: &[f32; BLOCK_LEN * 2], out: &mut [f32]) { - { - let dly = &delay; - for ((d, s), o) in dly.into_iter().zip(src.into_iter()).zip(out.iter_mut()) { - *o = (*d + *s) * 2.0; - } - } - delay.copy_from_slice(&src[BLOCK_LEN..]); -} - -#[derive(Clone)] -struct AudioBlock { - dynrng: Option<u8>, - dynrng2: Option<u8>, - - cplstre: bool, - cplinu: bool, - phsflginu: bool, - cplbegf: usize, - cplendf: usize, - ncplsubnd: usize, - ncplbnd: usize, - cplbndstrc: [bool; MAX_CPLBANDS], - - phsflg: [bool; MAX_CPLBANDS], - rematstr: bool, - rematflg: [bool; 4], - - chdata: [ChannelData; MAX_CHANNELS + 2], - - baie: bool, - fdcycod: usize, - sdcycod: usize, - sgaincod: usize, - dbpbcod: usize, - floorcod: usize, - snroffste: bool, - csnroffst: u8, - cplleake: bool, - cplfleak: u8, - cplsleak: u8, - - deltbaie: bool, - - bap_buf: [[i32; 2]; 3], - bap_buf_fill: [usize; 3], -} - -impl AudioBlock { - fn new() -> Self { - AudioBlock { - chdata: [ChannelData::new(); MAX_CHANNELS + 2], - - dynrng: None, - dynrng2: None, - - cplstre: false, - cplinu: false, - phsflginu: false, - cplbegf: 0, - cplendf: 0, - ncplsubnd: 0, - ncplbnd: 0, - cplbndstrc: [false; MAX_CPLBANDS], - - phsflg: [false; MAX_CPLBANDS], - rematstr: false, - rematflg: [false; 4], - - baie: false, - sdcycod: 0, - fdcycod: 0, - sgaincod: 0, - dbpbcod: 0, - floorcod: 0, - snroffste: false, - csnroffst: 0, - cplleake: false, - cplfleak: 0, - cplsleak: 0, - - deltbaie: false, - - bap_buf: [[0; 2]; 3], - bap_buf_fill: [0; 3], - } - } - fn read(&mut self, br: &mut BitReader, bsi: &BSI, fscod: usize, blk_no: usize) -> DecoderResult<bool> { - let channels = bsi.acmod.get_num_channels(); - let is_stereo = bsi.acmod == ACMode::Stereo; - - for ch in 0..channels { - self.chdata[ch].blksw = br.read_bool()?; - } - // dynamic range information - for ch in 0..channels { - self.chdata[ch].dithflag = br.read_bool()?; - } - self.dynrng = br.read_optional8()?; - if bsi.acmod == ACMode::DualMono { - self.dynrng2 = br.read_optional8()?; - } - // coupling strategy information - self.cplstre = br.read_bool()?; - validate!((blk_no != 0) || self.cplstre); - if self.cplstre { - self.cplinu = br.read_bool()?; - if self.cplinu { - for ch in 0..channels { - self.chdata[ch].chincpl = br.read_bool()?; - } - if is_stereo { - self.phsflginu = br.read_bool()?; - } - self.cplbegf = br.read(4)? as usize; - self.cplendf = (br.read(4)? as usize) + 3; - validate!(self.cplendf >= self.cplbegf); - self.ncplsubnd = self.cplendf - self.cplbegf; - self.ncplbnd = self.ncplsubnd; - self.chdata[CPL_CHANNEL].startmant = self.cplbegf * 12 + 37; - self.chdata[CPL_CHANNEL].endmant = self.cplendf * 12 + 37; - for bnd in 1..self.ncplsubnd { - self.cplbndstrc[bnd] = br.read_bool()?; - if self.cplbndstrc[bnd] { - self.ncplbnd -= 1; - } - } - } - } - // coupling coordinates - if self.cplinu { - for c in 0..channels { - let ch = &mut self.chdata[c]; - if ch.chincpl { - ch.cplcoe = br.read_bool()?; - if ch.cplcoe { - ch.mstrcplco = br.read(2)? as u8; - for bnd in 0..self.ncplbnd { - ch.cplcoexp [bnd] = br.read(4)? as u8; - ch.cplcomant[bnd] = br.read(4)? as u8; - } - } - } - } - if is_stereo && self.phsflginu && (self.chdata[0].cplcoe || self.chdata[1].cplcoe) { - for bnd in 0..self.ncplbnd { - self.phsflg[bnd] = br.read_bool()?; - } - } - } else { - for ch in 0..channels { - self.chdata[ch].chincpl = false; - } - } - // stereo rematrixing - if is_stereo { - self.rematstr = br.read_bool()?; - if self.rematstr { - if self.cplbegf > 2 || !self.cplinu { - for rbnd in 0..4 { - self.rematflg[rbnd] = br.read_bool()?; - } - } - if self.cplbegf > 0 && self.cplbegf <= 2 && self.cplinu { - for rbnd in 0..3 { - self.rematflg[rbnd] = br.read_bool()?; - } - } - if self.cplbegf == 0 && self.cplinu { - for rbnd in 0..2 { - self.rematflg[rbnd] = br.read_bool()?; - } - } - } - } - // exponent strategy - if self.cplinu { - self.chdata[CPL_CHANNEL].read_strategy(br, blk_no)?; - } - for ch in 0..channels { - self.chdata[ch].read_strategy(br, blk_no)?; - } - if bsi.lfeon { - self.chdata[LFE_CHANNEL].expstr = br.read(1)? as u8; - validate!(blk_no != 0 || self.chdata[LFE_CHANNEL].expstr != STRATEGY_REUSE); - self.chdata[LFE_CHANNEL].groups = 2; - self.chdata[LFE_CHANNEL].startmant = 0; - self.chdata[LFE_CHANNEL].endmant = 7; - } - let cpl_startmant = self.chdata[CPL_CHANNEL].startmant; - for c in 0..channels { - let ch = &mut self.chdata[c]; - if ch.expstr != STRATEGY_REUSE && !ch.chincpl { - ch.chbwcod = br.read(6)? as u8; - } - if !ch.chincpl { - ch.startmant = 0; - ch.endmant = ((ch.chbwcod as usize) + 12) * 3 + 37; - } else { - ch.startmant = 0; - ch.endmant = cpl_startmant; - } - } - // set number of mantissas - if self.cplinu { - self.chdata[CPL_CHANNEL].read_exps(br, true, false)?; - } - for ch in 0..channels { - self.chdata[ch].read_exps(br, false, false)?; - } - if bsi.lfeon { - self.chdata[LFE_CHANNEL].read_exps(br, false, true)?; - } - // bit allocation parameters - self.baie = br.read_bool()?; - if self.baie { - self.sdcycod = br.read(2)? as usize; - self.fdcycod = br.read(2)? as usize; - self.sgaincod = br.read(2)? as usize; - self.dbpbcod = br.read(2)? as usize; - self.floorcod = br.read(3)? as usize; - } - self.snroffste = br.read_bool()?; - if self.snroffste { - self.csnroffst = br.read(6)? as u8; - if self.cplinu { - self.chdata[CPL_CHANNEL].read_snr(br)?; - } - for ch in 0..channels { - self.chdata[ch].read_snr(br)?; - } - if bsi.lfeon { - self.chdata[LFE_CHANNEL].read_snr(br)?; - } - } - if self.cplinu { - self.cplleake = br.read_bool()?; - if self.cplleake { - self.cplfleak = br.read(3)? as u8; - self.cplsleak = br.read(3)? as u8; - } - } - // delta bit allocation information - self.deltbaie = br.read_bool()?; - if self.deltbaie { - if self.cplinu { - self.chdata[CPL_CHANNEL].deltbae = br.read(2)? as u8; - validate!(blk_no != 0 || self.chdata[CPL_CHANNEL].deltbae != 0); - validate!(self.chdata[CPL_CHANNEL].deltbae != 3); - } - for ch in 0..channels { - self.chdata[ch].deltbae = br.read(2)? as u8; - validate!(blk_no != 0 || self.chdata[ch].deltbae != 0); - validate!(self.chdata[ch].deltbae != 3); - } - if self.cplinu { - self.chdata[CPL_CHANNEL].read_deltbai(br)?; - } - for ch in 0..channels { - self.chdata[ch].read_deltbai(br)?; - } - } - // dummy data - if br.read_bool()? { - let skipl = br.read(9)?; - br.skip(skipl * 8)?; - } - - let all_zero = self.calc_bitalloc(bsi, channels, fscod); - if all_zero { return Ok(true); } - - // quantised mantissa values - let mut got_cplchan = false; - for i in 0..self.bap_buf_fill.len() { self.bap_buf_fill[i] = 0; } - for c in 0..channels { - { - let ch = &mut self.chdata[c]; - ch.read_mant(br, &mut self.bap_buf, &mut self.bap_buf_fill)?; - } - if self.cplinu && self.chdata[c].chincpl && !got_cplchan { - let cplch = &mut self.chdata[CPL_CHANNEL]; - cplch.read_mant(br, &mut self.bap_buf, &mut self.bap_buf_fill)?; - got_cplchan = true; - } - } - if bsi.lfeon { - let lfech = &mut self.chdata[LFE_CHANNEL]; - lfech.read_mant(br, &mut self.bap_buf, &mut self.bap_buf_fill)?; - } - Ok(false) - } - fn calc_bitalloc(&mut self, bsi: &BSI, channels: usize, fscod: usize) -> bool { - let sdecay1 = TS102366_SLOW_DECAY[self.sdcycod]; - let fdecay1 = TS102366_FAST_DECAY[self.fdcycod]; - - let sdecay = sdecay1 >> bsi.shift; - let fdecay = fdecay1 >> bsi.shift; - let sgain = TS102366_SLOW_GAIN[self.sgaincod]; - let dbknee = TS102366_DBP_TAB[self.dbpbcod]; - let floor = TS102366_FLOOR_TAB[self.floorcod]; - - let mut all_zero = self.csnroffst == 0; - if !all_zero && self.chdata[LFE_CHANNEL].fsnroffst == 0 { - for ch in 0..channels { - if self.chdata[ch].fsnroffst != 0 { - all_zero = false; - break; - } - } - } - if all_zero { return true; } - - let mut mask: [i32; MAX_BANDS] = [0; MAX_BANDS]; - - if self.cplinu { - self.chdata[CPL_CHANNEL].compute_bndpsd(); - self.chdata[CPL_CHANNEL].compute_mask(&mut mask, fscod, sgain, fdecay, sdecay, dbknee, - ((self.cplfleak as u16) << 8) + 768, ((self.cplsleak as u16) << 8) + 768, bsi.shift); - self.chdata[CPL_CHANNEL].apply_delta_info(&mut mask); - self.chdata[CPL_CHANNEL].calc_snr_offset(self.csnroffst); - self.chdata[CPL_CHANNEL].compute_bap(&mut mask, floor); - } - for ch in 0..channels { - self.chdata[ch].compute_bndpsd(); - self.chdata[ch].compute_mask(&mut mask, fscod, sgain, fdecay, sdecay, dbknee, 0, 0, bsi.shift); - self.chdata[ch].apply_delta_info(&mut mask); - self.chdata[ch].calc_snr_offset(self.csnroffst); - self.chdata[ch].compute_bap(&mut mask, floor); - } - if bsi.lfeon { - self.chdata[LFE_CHANNEL].compute_bndpsd(); - self.chdata[LFE_CHANNEL].compute_mask(&mut mask, fscod, sgain, fdecay, sdecay, dbknee, - 0, 0, bsi.shift); - self.chdata[LFE_CHANNEL].calc_snr_offset(self.csnroffst); - self.chdata[LFE_CHANNEL].compute_bap(&mut mask, floor); - } - - false - } - fn couple_channels(&mut self, acmod: ACMode) { - if !self.cplinu { return; } - for ch in 0..acmod.get_num_channels() { - if !self.chdata[ch].chincpl { continue; } - let mut pband = 0; - for band in self.cplbegf..self.cplendf { - let cband = band - self.cplbegf; - let comant = self.chdata[ch].cplcomant[cband]; - let mut cotemp = (if self.chdata[ch].cplcoexp[cband] == 15 { comant << 1 } else { comant + 16 }) as i32; - if (acmod == ACMode::Stereo) && (ch == 1) && self.phsflginu && self.phsflg[pband] { - cotemp = -cotemp; - } - if !self.cplbndstrc[cband] { - pband += 1; - } - let exp = self.chdata[ch].cplcoexp[cband] + 3 * self.chdata[ch].mstrcplco + 5 - 3; - let start = band * 12 + 37; - for bin in 0..12 { - self.chdata[ch].mant[start + bin] = self.chdata[CPL_CHANNEL].mant[start + bin] * cotemp >> exp; - } -//todo dither - } - } - } - fn rematrix(&mut self) { - let maxbin = self.chdata[0].endmant.min(self.chdata[1].endmant); - if self.rematflg[0] { - let end = maxbin.min(25); - for bin in 13..end { - let s = self.chdata[0].mant[bin] + self.chdata[1].mant[bin]; - let d = self.chdata[0].mant[bin] - self.chdata[1].mant[bin]; - self.chdata[0].mant[bin] = d; - self.chdata[1].mant[bin] = s; - } - if maxbin <= 25 { return; } - } - if self.rematflg[1] { - let end = maxbin.min(37); - for bin in 25..end { - let s = self.chdata[0].mant[bin] + self.chdata[1].mant[bin]; - let d = self.chdata[0].mant[bin] - self.chdata[1].mant[bin]; - self.chdata[0].mant[bin] = d; - self.chdata[1].mant[bin] = s; - } - if maxbin <= 37 { return; } - } - if self.rematflg[2] { - let end = maxbin.min(61); - for bin in 37..end { - let s = self.chdata[0].mant[bin] + self.chdata[1].mant[bin]; - let d = self.chdata[0].mant[bin] - self.chdata[1].mant[bin]; - self.chdata[0].mant[bin] = d; - self.chdata[1].mant[bin] = s; - } - if maxbin <= 61 { return; } - } - if self.rematflg[3] { - let end = maxbin; - for bin in 61..end { - let s = self.chdata[0].mant[bin] + self.chdata[1].mant[bin]; - let d = self.chdata[0].mant[bin] - self.chdata[1].mant[bin]; - self.chdata[0].mant[bin] = d; - self.chdata[1].mant[bin] = s; - } - } - } - fn synth_audio_block(&mut self, imdct512: &mut IMDCTContext, imdct256: &mut IMDCTContext, tmp: &mut IMDCTWorkspace, channel: usize, delay: &mut [f32; BLOCK_LEN], dst: &mut [f32]) { - self.chdata[channel].synth(imdct512, imdct256, tmp, delay, dst); - } -} - -impl NADecoder for AudioDecoder { - fn init(&mut self, info: Rc<NACodecInfo>) -> DecoderResult<()> { - if let NACodecTypeInfo::Audio(_) = info.get_properties() { - self.info = info.clone(); - Ok(()) - } else { - Err(DecoderError::InvalidData) - } - } - fn decode(&mut self, pkt: &NAPacket) -> DecoderResult<NAFrameRef> { - let info = pkt.get_stream().get_info(); - validate!(info.get_properties().is_audio()); - let pktbuf = pkt.get_buffer(); - validate!(pktbuf.len() > 5); - - let mut br; - if (pktbuf[0] == MAGIC_BYTE0) && (pktbuf[1] == MAGIC_BYTE1) { - br = BitReader::new(pktbuf.as_slice(), pktbuf.len(), BitReaderMode::BE); - } else if (pktbuf[0] == MAGIC_BYTE1) && (pktbuf[1] == MAGIC_BYTE0) { - br = BitReader::new(pktbuf.as_slice(), pktbuf.len(), BitReaderMode::LE16MSB); - } else { - return Err(DecoderError::InvalidData); - } - - let sinfo = Syncinfo::read(&mut br)?; - validate!(sinfo.is_valid()); - - let bsi = BSI::read(&mut br)?; - if bsi.has_addb { - let len = br.read(6)? as u32; - br.skip((len + 1) * 8)?; - } - - let duration = BLOCK_LEN * NBLOCKS; - - let core_channels = bsi.acmod.get_num_channels(); - let channels = core_channels + if bsi.lfeon { 1 } else { 0 }; - - let ainfo = NAAudioInfo::new(sinfo.samplerate >> bsi.shift, channels as u8, - SND_F32P_FORMAT, BLOCK_LEN); - - let mut abuf = alloc_audio_buffer(ainfo, duration, bsi.acmod.get_channel_map(bsi.lfeon))?; - let mut adata = abuf.get_abuf_f32().unwrap(); - let mut output = adata.get_data_mut(); - - self.ablk = AudioBlock::new(); - for blk in 0..NBLOCKS { - let all_zero = self.ablk.read(&mut br, &bsi, sinfo.fscod as usize, blk)?; - let off = blk * BLOCK_LEN; - self.ablk.couple_channels(bsi.acmod); - if bsi.acmod == ACMode::Stereo { - self.ablk.rematrix(); - } - for ch in 0..core_channels { - let dpos = abuf.get_offset(ch) + off; - let dst = &mut output[dpos..][..BLOCK_LEN]; - if !all_zero { - self.ablk.synth_audio_block(&mut self.imdct512, &mut self.imdct256, &mut self.tmp, ch, &mut self.delay[ch], dst); - } else { - self.delay[ch] = [0.0; BLOCK_LEN]; - for i in 0..BLOCK_LEN { dst[i] = 0.0; } - } - } - if bsi.lfeon { - let dpos = abuf.get_offset(core_channels) + off; - let dst = &mut output[dpos..][..BLOCK_LEN]; - if !all_zero { - self.ablk.synth_audio_block(&mut self.imdct512, &mut self.imdct256, &mut self.tmp, LFE_CHANNEL, &mut self.delay[LFE_CHANNEL], dst); - } else { - self.delay[LFE_CHANNEL] = [0.0; BLOCK_LEN]; - for i in 0..BLOCK_LEN { dst[i] = 0.0; } - } - } - } -//todo skip auxdata -//todo do errorcheck - - let mut frm = NAFrame::new_from_pkt(pkt, self.info.replace_info(NACodecTypeInfo::Audio(ainfo)), abuf); - frm.set_keyframe(true); - Ok(Rc::new(RefCell::new(frm))) - } -} - -pub fn get_decoder() -> Box<NADecoder> { - Box::new(AudioDecoder::new()) -} - -#[cfg(test)] -mod test { - use crate::test::dec_video::*; - #[test] - fn test_ts102366() { - let file = "assets/RV/sp_sample1.rm"; - test_decode_audio("realmedia", file, Some(12000), "ac3"); - } -} - -const TS102366_SLOW_DECAY: [u8; 4] = [ 0x0F, 0x11, 0x13, 0x15 ]; -const TS102366_FAST_DECAY: [u8; 4] = [ 0x3F, 0x53, 0x67, 0x7B ]; -const TS102366_SLOW_GAIN: [u16; 4] = [ 0x540, 0x4D8, 0x478, 0x410 ]; -const TS102366_FAST_GAIN: [u16; 8] = [ 0x080, 0x100, 0x180, 0x200, 0x280, 0x300, 0x380, 0x400 ]; -const TS102366_DBP_TAB: [u16; 4] = [ 0x000, 0x700, 0x900, 0xB00 ]; -const TS102366_FLOOR_TAB: [u16; 8] = [ 0x02F0, 0x02B0, 0x0270, 0x0230, 0x01F0, 0x0170, 0x00F0, 0xF800 ]; - -const TS102366_BIN_TO_BAND: [u8; 256] = [ - 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, - 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, - 20, 21, 22, 23, 24, 25, 26, 27, 28, 28, - 28, 29, 29, 29, 30, 30, 30, 31, 31, 31, - 32, 32, 32, 33, 33, 33, 34, 34, 34, 35, - 35, 35, 35, 35, 35, 36, 36, 36, 36, 36, - 36, 37, 37, 37, 37, 37, 37, 38, 38, 38, - 38, 38, 38, 39, 39, 39, 39, 39, 39, 40, - 40, 40, 40, 40, 40, 41, 41, 41, 41, 41, - 41, 41, 41, 41, 41, 41, 41, 42, 42, 42, - 42, 42, 42, 42, 42, 42, 42, 42, 42, 43, - 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, - 43, 44, 44, 44, 44, 44, 44, 44, 44, 44, - 44, 44, 44, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 45, 45, 46, 46, 46, - 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, - 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, - 46, 47, 47, 47, 47, 47, 47, 47, 47, 47, - 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, - 47, 47, 47, 47, 47, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 49, - 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, - 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, - 49, 49, 49, 0, 0, 0 -]; -const TS102366_BAND_SIZE: [u8; MAX_BANDS] = [ - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 3, 3, - 3, 3, 3, 3, 3, 6, 6, 6, 6, 6, - 6, 12, 12, 12, 12, 24, 24, 24, 24, 24 -]; -const TS102366_BAND_START: [u8; MAX_BANDS] = [ - 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, - 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, - 20, 21, 22, 23, 24, 25, 26, 27, 28, 31, - 34, 37, 40, 43, 46, 49, 55, 61, 67, 73, - 79, 85, 97, 109, 121, 133, 157, 181, 205, 229 -]; - -const TS102366_LATAB: [u16; 256] = [ - 0x0040, 0x003f, 0x003e, 0x003d, 0x003c, 0x003b, 0x003a, 0x0039, - 0x0038, 0x0037, 0x0036, 0x0035, 0x0034, 0x0034, 0x0033, 0x0032, - 0x0031, 0x0030, 0x002f, 0x002f, 0x002e, 0x002d, 0x002c, 0x002c, - 0x002b, 0x002a, 0x0029, 0x0029, 0x0028, 0x0027, 0x0026, 0x0026, - 0x0025, 0x0024, 0x0024, 0x0023, 0x0023, 0x0022, 0x0021, 0x0021, - 0x0020, 0x0020, 0x001f, 0x001e, 0x001e, 0x001d, 0x001d, 0x001c, - 0x001c, 0x001b, 0x001b, 0x001a, 0x001a, 0x0019, 0x0019, 0x0018, - 0x0018, 0x0017, 0x0017, 0x0016, 0x0016, 0x0015, 0x0015, 0x0015, - 0x0014, 0x0014, 0x0013, 0x0013, 0x0013, 0x0012, 0x0012, 0x0012, - 0x0011, 0x0011, 0x0011, 0x0010, 0x0010, 0x0010, 0x000f, 0x000f, - 0x000f, 0x000e, 0x000e, 0x000e, 0x000d, 0x000d, 0x000d, 0x000d, - 0x000c, 0x000c, 0x000c, 0x000c, 0x000b, 0x000b, 0x000b, 0x000b, - 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x0009, 0x0009, 0x0009, - 0x0009, 0x0009, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, - 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0006, 0x0006, - 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0005, 0x0005, - 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0004, 0x0004, - 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, - 0x0004, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, - 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0002, - 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, - 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, - 0x0002, 0x0002, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, - 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, - 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, - 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, - 0x0001, 0x0001, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 -]; -const TS102366_HTH: [[u16; MAX_BANDS]; 3] = [ - [ - 0x04D0, 0x04D0, 0x0440, 0x0400, 0x03E0, 0x03C0, 0x03B0, 0x03B0, 0x03A0, 0x03A0, - 0x03A0, 0x03A0, 0x03A0, 0x0390, 0x0390, 0x0390, 0x0380, 0x0380, 0x0370, 0x0370, - 0x0360, 0x0360, 0x0350, 0x0350, 0x0340, 0x0340, 0x0330, 0x0320, 0x0310, 0x0300, - 0x02F0, 0x02F0, 0x02F0, 0x02F0, 0x0300, 0x0310, 0x0340, 0x0390, 0x03E0, 0x0420, - 0x0460, 0x0490, 0x04A0, 0x0460, 0x0440, 0x0440, 0x0520, 0x0800, 0x0840, 0x0840, - ], [ - 0x04F0, 0x04F0, 0x0460, 0x0410, 0x03E0, 0x03D0, 0x03C0, 0x03B0, 0x03B0, 0x03A0, - 0x03A0, 0x03A0, 0x03A0, 0x03A0, 0x0390, 0x0390, 0x0390, 0x0380, 0x0380, 0x0380, - 0x0370, 0x0370, 0x0360, 0x0360, 0x0350, 0x0350, 0x0340, 0x0340, 0x0320, 0x0310, - 0x0300, 0x02F0, 0x02F0, 0x02F0, 0x02F0, 0x0300, 0x0320, 0x0350, 0x0390, 0x03E0, - 0x0420, 0x0450, 0x04A0, 0x0490, 0x0460, 0x0440, 0x0480, 0x0630, 0x0840, 0x0840, - ], [ - 0x0580, 0x0580, 0x04B0, 0x0450, 0x0420, 0x03F0, 0x03E0, 0x03D0, 0x03C0, 0x03B0, - 0x03B0, 0x03B0, 0x03A0, 0x03A0, 0x03A0, 0x03A0, 0x03A0, 0x03A0, 0x03A0, 0x03A0, - 0x0390, 0x0390, 0x0390, 0x0390, 0x0380, 0x0380, 0x0380, 0x0370, 0x0360, 0x0350, - 0x0340, 0x0330, 0x0320, 0x0310, 0x0300, 0x02F0, 0x02F0, 0x02F0, 0x0300, 0x0310, - 0x0330, 0x0350, 0x03C0, 0x0410, 0x0470, 0x04A0, 0x0460, 0x0440, 0x0450, 0x04E0, - ] -]; -const TS102366_BAPTAB: [u8; 64] = [ - 0, 1, 1, 1, 1, 1, 2, 2, 3, 3, 3, 4, 4, 5, 5, 6, - 6, 6, 6, 7, 7, 7, 7, 8, 8, 8, 8, 9, 9, 9, 9, 10, - 10, 10, 10, 11, 11, 11, 11, 12, 12, 12, 12, 13, 13, 13, 13, 14, - 14, 14, 14, 14, 14, 14, 14, 15, 15, 15, 15, 15, 15, 15, 15, 15 -]; - -const TS102366_QUANT3_MAP: [[i32; 3]; 27] = [ - [ -0x0AAAAAA, -0x0AAAAAA, -0x0AAAAAA ], - [ -0x0AAAAAA, -0x0AAAAAA, 0x00000000 ], - [ -0x0AAAAAA, -0x0AAAAAA, 0x00AAAAAA ], - [ -0x0AAAAAA, 0x00000000, -0x0AAAAAA ], - [ -0x0AAAAAA, 0x00000000, 0x00000000 ], - [ -0x0AAAAAA, 0x00000000, 0x00AAAAAA ], - [ -0x0AAAAAA, 0x00AAAAAA, -0x0AAAAAA ], - [ -0x0AAAAAA, 0x00AAAAAA, 0x00000000 ], - [ -0x0AAAAAA, 0x00AAAAAA, 0x00AAAAAA ], - [ 0x00000000, -0x0AAAAAA, -0x0AAAAAA ], - [ 0x00000000, -0x0AAAAAA, 0x00000000 ], - [ 0x00000000, -0x0AAAAAA, 0x00AAAAAA ], - [ 0x00000000, 0x00000000, -0x0AAAAAA ], - [ 0x00000000, 0x00000000, 0x00000000 ], - [ 0x00000000, 0x00000000, 0x00AAAAAA ], - [ 0x00000000, 0x00AAAAAA, -0x0AAAAAA ], - [ 0x00000000, 0x00AAAAAA, 0x00000000 ], - [ 0x00000000, 0x00AAAAAA, 0x00AAAAAA ], - [ 0x00AAAAAA, -0x0AAAAAA, -0x0AAAAAA ], - [ 0x00AAAAAA, -0x0AAAAAA, 0x00000000 ], - [ 0x00AAAAAA, -0x0AAAAAA, 0x00AAAAAA ], - [ 0x00AAAAAA, 0x00000000, -0x0AAAAAA ], - [ 0x00AAAAAA, 0x00000000, 0x00000000 ], - [ 0x00AAAAAA, 0x00000000, 0x00AAAAAA ], - [ 0x00AAAAAA, 0x00AAAAAA, -0x0AAAAAA ], - [ 0x00AAAAAA, 0x00AAAAAA, 0x00000000 ], - [ 0x00AAAAAA, 0x00AAAAAA, 0x00AAAAAA ] -]; -const TS102366_QUANT5_MAP: [[i32; 3]; 125] = [ - [ -0x0CCCCCC, -0x0CCCCCC, -0x0CCCCCC ], [ -0x0CCCCCC, -0x0CCCCCC, -0x0666666 ], [ -0x0CCCCCC, -0x0CCCCCC, 0x00000000 ], - [ -0x0CCCCCC, -0x0CCCCCC, 0x00666666 ], [ -0x0CCCCCC, -0x0CCCCCC, 0x00CCCCCC ], - [ -0x0CCCCCC, -0x0666666, -0x0CCCCCC ], [ -0x0CCCCCC, -0x0666666, -0x0666666 ], [ -0x0CCCCCC, -0x0666666, 0x00000000 ], - [ -0x0CCCCCC, -0x0666666, 0x00666666 ], [ -0x0CCCCCC, -0x0666666, 0x00CCCCCC ], - [ -0x0CCCCCC, 0x00000000, -0x0CCCCCC ], [ -0x0CCCCCC, 0x00000000, -0x0666666 ], [ -0x0CCCCCC, 0x00000000, 0x00000000 ], - [ -0x0CCCCCC, 0x00000000, 0x00666666 ], [ -0x0CCCCCC, 0x00000000, 0x00CCCCCC ], - [ -0x0CCCCCC, 0x00666666, -0x0CCCCCC ], [ -0x0CCCCCC, 0x00666666, -0x0666666 ], [ -0x0CCCCCC, 0x00666666, 0x00000000 ], - [ -0x0CCCCCC, 0x00666666, 0x00666666 ], [ -0x0CCCCCC, 0x00666666, 0x00CCCCCC ], - [ -0x0CCCCCC, 0x00CCCCCC, -0x0CCCCCC ], [ -0x0CCCCCC, 0x00CCCCCC, -0x0666666 ], [ -0x0CCCCCC, 0x00CCCCCC, 0x00000000 ], - [ -0x0CCCCCC, 0x00CCCCCC, 0x00666666 ], [ -0x0CCCCCC, 0x00CCCCCC, 0x00CCCCCC ], - [ -0x0666666, -0x0CCCCCC, -0x0CCCCCC ], [ -0x0666666, -0x0CCCCCC, -0x0666666 ], [ -0x0666666, -0x0CCCCCC, 0x00000000 ], - [ -0x0666666, -0x0CCCCCC, 0x00666666 ], [ -0x0666666, -0x0CCCCCC, 0x00CCCCCC ], - [ -0x0666666, -0x0666666, -0x0CCCCCC ], [ -0x0666666, -0x0666666, -0x0666666 ], [ -0x0666666, -0x0666666, 0x00000000 ], - [ -0x0666666, -0x0666666, 0x00666666 ], [ -0x0666666, -0x0666666, 0x00CCCCCC ], - [ -0x0666666, 0x00000000, -0x0CCCCCC ], [ -0x0666666, 0x00000000, -0x0666666 ], [ -0x0666666, 0x00000000, 0x00000000 ], - [ -0x0666666, 0x00000000, 0x00666666 ], [ -0x0666666, 0x00000000, 0x00CCCCCC ], - [ -0x0666666, 0x00666666, -0x0CCCCCC ], [ -0x0666666, 0x00666666, -0x0666666 ], [ -0x0666666, 0x00666666, 0x00000000 ], - [ -0x0666666, 0x00666666, 0x00666666 ], [ -0x0666666, 0x00666666, 0x00CCCCCC ], - [ -0x0666666, 0x00CCCCCC, -0x0CCCCCC ], [ -0x0666666, 0x00CCCCCC, -0x0666666 ], [ -0x0666666, 0x00CCCCCC, 0x00000000 ], - [ -0x0666666, 0x00CCCCCC, 0x00666666 ], [ -0x0666666, 0x00CCCCCC, 0x00CCCCCC ], - [ 0x00000000, -0x0CCCCCC, -0x0CCCCCC ], [ 0x00000000, -0x0CCCCCC, -0x0666666 ], [ 0x00000000, -0x0CCCCCC, 0x00000000 ], - [ 0x00000000, -0x0CCCCCC, 0x00666666 ], [ 0x00000000, -0x0CCCCCC, 0x00CCCCCC ], - [ 0x00000000, -0x0666666, -0x0CCCCCC ], [ 0x00000000, -0x0666666, -0x0666666 ], [ 0x00000000, -0x0666666, 0x00000000 ], - [ 0x00000000, -0x0666666, 0x00666666 ], [ 0x00000000, -0x0666666, 0x00CCCCCC ], - [ 0x00000000, 0x00000000, -0x0CCCCCC ], [ 0x00000000, 0x00000000, -0x0666666 ], [ 0x00000000, 0x00000000, 0x00000000 ], - [ 0x00000000, 0x00000000, 0x00666666 ], [ 0x00000000, 0x00000000, 0x00CCCCCC ], - [ 0x00000000, 0x00666666, -0x0CCCCCC ], [ 0x00000000, 0x00666666, -0x0666666 ], [ 0x00000000, 0x00666666, 0x00000000 ], - [ 0x00000000, 0x00666666, 0x00666666 ], [ 0x00000000, 0x00666666, 0x00CCCCCC ], - [ 0x00000000, 0x00CCCCCC, -0x0CCCCCC ], [ 0x00000000, 0x00CCCCCC, -0x0666666 ], [ 0x00000000, 0x00CCCCCC, 0x00000000 ], - [ 0x00000000, 0x00CCCCCC, 0x00666666 ], [ 0x00000000, 0x00CCCCCC, 0x00CCCCCC ], - [ 0x00666666, -0x0CCCCCC, -0x0CCCCCC ], [ 0x00666666, -0x0CCCCCC, -0x0666666 ], [ 0x00666666, -0x0CCCCCC, 0x00000000 ], - [ 0x00666666, -0x0CCCCCC, 0x00666666 ], [ 0x00666666, -0x0CCCCCC, 0x00CCCCCC ], - [ 0x00666666, -0x0666666, -0x0CCCCCC ], [ 0x00666666, -0x0666666, -0x0666666 ], [ 0x00666666, -0x0666666, 0x00000000 ], - [ 0x00666666, -0x0666666, 0x00666666 ], [ 0x00666666, -0x0666666, 0x00CCCCCC ], - [ 0x00666666, 0x00000000, -0x0CCCCCC ], [ 0x00666666, 0x00000000, -0x0666666 ], [ 0x00666666, 0x00000000, 0x00000000 ], - [ 0x00666666, 0x00000000, 0x00666666 ], [ 0x00666666, 0x00000000, 0x00CCCCCC ], - [ 0x00666666, 0x00666666, -0x0CCCCCC ], [ 0x00666666, 0x00666666, -0x0666666 ], [ 0x00666666, 0x00666666, 0x00000000 ], - [ 0x00666666, 0x00666666, 0x00666666 ], [ 0x00666666, 0x00666666, 0x00CCCCCC ], - [ 0x00666666, 0x00CCCCCC, -0x0CCCCCC ], [ 0x00666666, 0x00CCCCCC, -0x0666666 ], [ 0x00666666, 0x00CCCCCC, 0x00000000 ], - [ 0x00666666, 0x00CCCCCC, 0x00666666 ], [ 0x00666666, 0x00CCCCCC, 0x00CCCCCC ], - [ 0x00CCCCCC, -0x0CCCCCC, -0x0CCCCCC ], [ 0x00CCCCCC, -0x0CCCCCC, -0x0666666 ], [ 0x00CCCCCC, -0x0CCCCCC, 0x00000000 ], - [ 0x00CCCCCC, -0x0CCCCCC, 0x00666666 ], [ 0x00CCCCCC, -0x0CCCCCC, 0x00CCCCCC ], - [ 0x00CCCCCC, -0x0666666, -0x0CCCCCC ], [ 0x00CCCCCC, -0x0666666, -0x0666666 ], [ 0x00CCCCCC, -0x0666666, 0x00000000 ], - [ 0x00CCCCCC, -0x0666666, 0x00666666 ], [ 0x00CCCCCC, -0x0666666, 0x00CCCCCC ], - [ 0x00CCCCCC, 0x00000000, -0x0CCCCCC ], [ 0x00CCCCCC, 0x00000000, -0x0666666 ], [ 0x00CCCCCC, 0x00000000, 0x00000000 ], - [ 0x00CCCCCC, 0x00000000, 0x00666666 ], [ 0x00CCCCCC, 0x00000000, 0x00CCCCCC ], - [ 0x00CCCCCC, 0x00666666, -0x0CCCCCC ], [ 0x00CCCCCC, 0x00666666, -0x0666666 ], [ 0x00CCCCCC, 0x00666666, 0x00000000 ], - [ 0x00CCCCCC, 0x00666666, 0x00666666 ], [ 0x00CCCCCC, 0x00666666, 0x00CCCCCC ], - [ 0x00CCCCCC, 0x00CCCCCC, -0x0CCCCCC ], [ 0x00CCCCCC, 0x00CCCCCC, -0x0666666 ], [ 0x00CCCCCC, 0x00CCCCCC, 0x00000000 ], - [ 0x00CCCCCC, 0x00CCCCCC, 0x00666666 ], [ 0x00CCCCCC, 0x00CCCCCC, 0x00CCCCCC ], -]; -const TS102366_QUANT7_MAP: [i32; 7] = [ - -0xDB6DB6, -0x924924, -0x492492, 0x000000, 0x492492, 0x924924, 0xDB6DB6 -]; -const TS102366_QUANT11_MAP: [[i32; 2]; 121] = [ - [ -0x0E8BA2E, -0x0E8BA2E ], [ -0x0E8BA2E, -0x0BA2E8B ], [ -0x0E8BA2E, -0x08BA2E8 ], - [ -0x0E8BA2E, -0x05D1745 ], [ -0x0E8BA2E, -0x02E8BA2 ], [ -0x0E8BA2E, 0x00000000 ], - [ -0x0E8BA2E, 0x002E8BA2 ], [ -0x0E8BA2E, 0x005D1745 ], [ -0x0E8BA2E, 0x008BA2E8 ], - [ -0x0E8BA2E, 0x00BA2E8B ], [ -0x0E8BA2E, 0x00E8BA2E ], [ -0x0BA2E8B, -0x0E8BA2E ], - [ -0x0BA2E8B, -0x0BA2E8B ], [ -0x0BA2E8B, -0x08BA2E8 ], [ -0x0BA2E8B, -0x05D1745 ], - [ -0x0BA2E8B, -0x02E8BA2 ], [ -0x0BA2E8B, 0x00000000 ], [ -0x0BA2E8B, 0x002E8BA2 ], - [ -0x0BA2E8B, 0x005D1745 ], [ -0x0BA2E8B, 0x008BA2E8 ], [ -0x0BA2E8B, 0x00BA2E8B ], - [ -0x0BA2E8B, 0x00E8BA2E ], [ -0x08BA2E8, -0x0E8BA2E ], [ -0x08BA2E8, -0x0BA2E8B ], - [ -0x08BA2E8, -0x08BA2E8 ], [ -0x08BA2E8, -0x05D1745 ], [ -0x08BA2E8, -0x02E8BA2 ], - [ -0x08BA2E8, 0x00000000 ], [ -0x08BA2E8, 0x002E8BA2 ], [ -0x08BA2E8, 0x005D1745 ], - [ -0x08BA2E8, 0x008BA2E8 ], [ -0x08BA2E8, 0x00BA2E8B ], [ -0x08BA2E8, 0x00E8BA2E ], - [ -0x05D1745, -0x0E8BA2E ], [ -0x05D1745, -0x0BA2E8B ], [ -0x05D1745, -0x08BA2E8 ], - [ -0x05D1745, -0x05D1745 ], [ -0x05D1745, -0x02E8BA2 ], [ -0x05D1745, 0x00000000 ], - [ -0x05D1745, 0x002E8BA2 ], [ -0x05D1745, 0x005D1745 ], [ -0x05D1745, 0x008BA2E8 ], - [ -0x05D1745, 0x00BA2E8B ], [ -0x05D1745, 0x00E8BA2E ], [ -0x02E8BA2, -0x0E8BA2E ], - [ -0x02E8BA2, -0x0BA2E8B ], [ -0x02E8BA2, -0x08BA2E8 ], [ -0x02E8BA2, -0x05D1745 ], - [ -0x02E8BA2, -0x02E8BA2 ], [ -0x02E8BA2, 0x00000000 ], [ -0x02E8BA2, 0x002E8BA2 ], - [ -0x02E8BA2, 0x005D1745 ], [ -0x02E8BA2, 0x008BA2E8 ], [ -0x02E8BA2, 0x00BA2E8B ], - [ -0x02E8BA2, 0x00E8BA2E ], [ 0x00000000, -0x0E8BA2E ], [ 0x00000000, -0x0BA2E8B ], - [ 0x00000000, -0x08BA2E8 ], [ 0x00000000, -0x05D1745 ], [ 0x00000000, -0x02E8BA2 ], - [ 0x00000000, 0x00000000 ], [ 0x00000000, 0x002E8BA2 ], [ 0x00000000, 0x005D1745 ], - [ 0x00000000, 0x008BA2E8 ], [ 0x00000000, 0x00BA2E8B ], [ 0x00000000, 0x00E8BA2E ], - [ 0x002E8BA2, -0x0E8BA2E ], [ 0x002E8BA2, -0x0BA2E8B ], [ 0x002E8BA2, -0x08BA2E8 ], - [ 0x002E8BA2, -0x05D1745 ], [ 0x002E8BA2, -0x02E8BA2 ], [ 0x002E8BA2, 0x00000000 ], - [ 0x002E8BA2, 0x002E8BA2 ], [ 0x002E8BA2, 0x005D1745 ], [ 0x002E8BA2, 0x008BA2E8 ], - [ 0x002E8BA2, 0x00BA2E8B ], [ 0x002E8BA2, 0x00E8BA2E ], [ 0x005D1745, -0x0E8BA2E ], - [ 0x005D1745, -0x0BA2E8B ], [ 0x005D1745, -0x08BA2E8 ], [ 0x005D1745, -0x05D1745 ], - [ 0x005D1745, -0x02E8BA2 ], [ 0x005D1745, 0x00000000 ], [ 0x005D1745, 0x002E8BA2 ], - [ 0x005D1745, 0x005D1745 ], [ 0x005D1745, 0x008BA2E8 ], [ 0x005D1745, 0x00BA2E8B ], - [ 0x005D1745, 0x00E8BA2E ], [ 0x008BA2E8, -0x0E8BA2E ], [ 0x008BA2E8, -0x0BA2E8B ], - [ 0x008BA2E8, -0x08BA2E8 ], [ 0x008BA2E8, -0x05D1745 ], [ 0x008BA2E8, -0x02E8BA2 ], - [ 0x008BA2E8, 0x00000000 ], [ 0x008BA2E8, 0x002E8BA2 ], [ 0x008BA2E8, 0x005D1745 ], - [ 0x008BA2E8, 0x008BA2E8 ], [ 0x008BA2E8, 0x00BA2E8B ], [ 0x008BA2E8, 0x00E8BA2E ], - [ 0x00BA2E8B, -0x0E8BA2E ], [ 0x00BA2E8B, -0x0BA2E8B ], [ 0x00BA2E8B, -0x08BA2E8 ], - [ 0x00BA2E8B, -0x05D1745 ], [ 0x00BA2E8B, -0x02E8BA2 ], [ 0x00BA2E8B, 0x00000000 ], - [ 0x00BA2E8B, 0x002E8BA2 ], [ 0x00BA2E8B, 0x005D1745 ], [ 0x00BA2E8B, 0x008BA2E8 ], - [ 0x00BA2E8B, 0x00BA2E8B ], [ 0x00BA2E8B, 0x00E8BA2E ], [ 0x00E8BA2E, -0x0E8BA2E ], - [ 0x00E8BA2E, -0x0BA2E8B ], [ 0x00E8BA2E, -0x08BA2E8 ], [ 0x00E8BA2E, -0x05D1745 ], - [ 0x00E8BA2E, -0x02E8BA2 ], [ 0x00E8BA2E, 0x00000000 ], [ 0x00E8BA2E, 0x002E8BA2 ], - [ 0x00E8BA2E, 0x005D1745 ], [ 0x00E8BA2E, 0x008BA2E8 ], [ 0x00E8BA2E, 0x00BA2E8B ], - [ 0x00E8BA2E, 0x00E8BA2E ], -]; -const TS102366_QUANT15_MAP: [i32; 15] = [ - -0x0EEEEEE, -0x0CCCCCC, -0x0AAAAAA, -0x0888888, -0x0666666, -0x0444444, -0x0222222, 0x00000000, - 0x00222222, 0x00444444, 0x00666666, 0x00888888, 0x00AAAAAA, 0x00CCCCCC, 0x00EEEEEE, -]; -const TS102366_BAP_BITS: [u8; 10] = [ 5, 6, 7, 8, 9, 10, 11, 12, 14, 16 ]; - -const TS102366_WINDOW: [f32; 256] = [ - 0.00014, 0.00024, 0.00037, 0.00051, 0.00067, 0.00086, 0.00107, 0.00130, - 0.00157, 0.00187, 0.00220, 0.00256, 0.00297, 0.00341, 0.00390, 0.00443, - 0.00501, 0.00564, 0.00632, 0.00706, 0.00785, 0.00871, 0.00962, 0.01061, - 0.01166, 0.01279, 0.01399, 0.01526, 0.01662, 0.01806, 0.01959, 0.02121, - 0.02292, 0.02472, 0.02662, 0.02863, 0.03073, 0.03294, 0.03527, 0.03770, - 0.04025, 0.04292, 0.04571, 0.04862, 0.05165, 0.05481, 0.05810, 0.06153, - 0.06508, 0.06878, 0.07261, 0.07658, 0.08069, 0.08495, 0.08935, 0.09389, - 0.09859, 0.10343, 0.10842, 0.11356, 0.11885, 0.12429, 0.12988, 0.13563, - 0.14152, 0.14757, 0.15376, 0.16011, 0.16661, 0.17325, 0.18005, 0.18699, - 0.19407, 0.20130, 0.20867, 0.21618, 0.22382, 0.23161, 0.23952, 0.24757, - 0.25574, 0.26404, 0.27246, 0.28100, 0.28965, 0.29841, 0.30729, 0.31626, - 0.32533, 0.33450, 0.34376, 0.35311, 0.36253, 0.37204, 0.38161, 0.39126, - 0.40096, 0.41072, 0.42054, 0.43040, 0.44030, 0.45023, 0.46020, 0.47019, - 0.48020, 0.49022, 0.50025, 0.51028, 0.52031, 0.53033, 0.54033, 0.55031, - 0.56026, 0.57019, 0.58007, 0.58991, 0.59970, 0.60944, 0.61912, 0.62873, - 0.63827, 0.64774, 0.65713, 0.66643, 0.67564, 0.68476, 0.69377, 0.70269, - 0.71150, 0.72019, 0.72877, 0.73723, 0.74557, 0.75378, 0.76186, 0.76981, - 0.77762, 0.78530, 0.79283, 0.80022, 0.80747, 0.81457, 0.82151, 0.82831, - 0.83496, 0.84145, 0.84779, 0.85398, 0.86001, 0.86588, 0.87160, 0.87716, - 0.88257, 0.88782, 0.89291, 0.89785, 0.90264, 0.90728, 0.91176, 0.91610, - 0.92028, 0.92432, 0.92822, 0.93197, 0.93558, 0.93906, 0.94240, 0.94560, - 0.94867, 0.95162, 0.95444, 0.95713, 0.95971, 0.96217, 0.96451, 0.96674, - 0.96887, 0.97089, 0.97281, 0.97463, 0.97635, 0.97799, 0.97953, 0.98099, - 0.98236, 0.98366, 0.98488, 0.98602, 0.98710, 0.98811, 0.98905, 0.98994, - 0.99076, 0.99153, 0.99225, 0.99291, 0.99353, 0.99411, 0.99464, 0.99513, - 0.99558, 0.99600, 0.99639, 0.99674, 0.99706, 0.99736, 0.99763, 0.99788, - 0.99811, 0.99831, 0.99850, 0.99867, 0.99882, 0.99895, 0.99908, 0.99919, - 0.99929, 0.99938, 0.99946, 0.99953, 0.99959, 0.99965, 0.99969, 0.99974, - 0.99978, 0.99981, 0.99984, 0.99986, 0.99988, 0.99990, 0.99992, 0.99993, - 0.99994, 0.99995, 0.99996, 0.99997, 0.99998, 0.99998, 0.99998, 0.99999, - 0.99999, 0.99999, 0.99999, 1.00000, 1.00000, 1.00000, 1.00000, 1.00000, - 1.00000, 1.00000, 1.00000, 1.00000, 1.00000, 1.00000, 1.00000, 1.00000, -]; diff --git a/src/demuxers/avi.rs b/src/demuxers/avi.rs deleted file mode 100644 index a326561..0000000 --- a/src/demuxers/avi.rs +++ /dev/null @@ -1,421 +0,0 @@ -use super::*; -use crate::register; -use super::DemuxerError::*; -//use io::byteio::*; -//use frame::*; -use crate::formats::*; - -macro_rules! mktag { - ($a:expr, $b:expr, $c:expr, $d:expr) => ({ - (($a as u32) << 24) | (($b as u32) << 16) | (($c as u32) << 8) | ($d as u32) - }); - ($arr:expr) => ({ - (($arr[0] as u32) << 24) | (($arr[1] as u32) << 16) | (($arr[2] as u32) << 8) | ($arr[3] as u32) - }); -} - -struct StreamState { - strm_no: u8, - got_strf: bool, - strm_type: Option<StreamType>, -} - -impl StreamState { - fn new() -> Self { - StreamState { strm_no: 0, got_strf: true, strm_type: None } - } - fn reset(&mut self) { - self.strm_type = None; - self.got_strf = true; - self.strm_no += 1; - } - fn valid_state(&self) -> bool { - match self.strm_type { - None => self.got_strf, - _ => false, - } - } -} - -#[allow(dead_code)] -struct AVIDemuxer<'a> { - src: &'a mut ByteReader<'a>, - cur_frame: Vec<u64>, - num_streams: u8, - size: usize, - movi_size: usize, - sstate: StreamState, - tb_num: u32, - tb_den: u32, -} - -#[derive(Debug,Clone,Copy,PartialEq)] -enum RIFFTag { - Chunk(u32), - List(u32,u32), -} - -struct RIFFParser { - tag: RIFFTag, - parse: fn(&mut AVIDemuxer, strmgr: &mut StreamManager, size: usize) -> DemuxerResult<usize>, -} - -impl<'a> DemuxCore<'a> for AVIDemuxer<'a> { - #[allow(unused_variables)] - fn open(&mut self, strmgr: &mut StreamManager) -> DemuxerResult<()> { - self.read_header(strmgr)?; - Ok(()) - } - - fn get_frame(&mut self, strmgr: &mut StreamManager) -> DemuxerResult<NAPacket> { - if self.movi_size == 0 { return Err(EOF); } - let mut tag: [u8; 4] = [0; 4]; - loop { - if (self.src.tell() & 1) == 1 { - self.src.read_skip(1)?; - self.movi_size -= 1; - if self.movi_size == 0 { return Err(EOF); } - } - self.src.read_buf(&mut tag)?; - let size = self.src.read_u32le()? as usize; - if mktag!(tag) == mktag!(b"JUNK") { - self.movi_size -= size + 8; - self.src.read_skip(size)?; - if self.movi_size == 0 { return Err(EOF); } - continue; - } - if mktag!(tag) == mktag!(b"LIST") { - self.movi_size -= 12; - self.src.read_skip(4)?; - if self.movi_size == 0 { return Err(EOF); } - continue; - } - if tag[0] < b'0' || tag[0] > b'9' || tag[1] < b'0' || tag[1] > b'9' { - return Err(InvalidData); - } - let stream_no = (tag[0] - b'0') * 10 + (tag[1] - b'0'); - let str = strmgr.get_stream(stream_no as usize); - if let None = str { return Err(InvalidData); } - let stream = str.unwrap(); - if size == 0 { - self.movi_size -= 8; - if self.movi_size == 0 { return Err(EOF); } - continue; - } - let (tb_num, tb_den) = stream.get_timebase(); - let ts = NATimeInfo::new(Some(self.cur_frame[stream_no as usize]), None, None, tb_num, tb_den); - let pkt = self.src.read_packet(stream, ts, false, size)?; - self.cur_frame[stream_no as usize] += 1; - self.movi_size -= size + 8; - - return Ok(pkt); - } - } - - #[allow(unused_variables)] - fn seek(&mut self, time: u64) -> DemuxerResult<()> { - Err(NotImplemented) - } -} - -impl<'a> AVIDemuxer<'a> { - fn new(io: &'a mut ByteReader<'a>) -> Self { - AVIDemuxer { - cur_frame: Vec::new(), - num_streams: 0, - src: io, - size: 0, - movi_size: 0, - sstate: StreamState::new(), - tb_num: 0, - tb_den: 0, - } - } - - fn parse_chunk(&mut self, strmgr: &mut StreamManager, end_tag: RIFFTag, csize: usize, depth: u16) -> DemuxerResult<(usize, bool)> { - if csize < 8 { return Err(InvalidData); } - if depth > 42 { return Err(InvalidData); } - - let tag = self.src.read_u32be()?; - let size = self.src.read_u32le()? as usize; - if size > csize { return Err(InvalidData); } - if RIFFTag::Chunk(tag) == end_tag { - return Ok((size, true)); - } - let is_list = is_list_tag(tag); - let ltag = if is_list { self.src.read_u32be()? } else { 0 }; - if RIFFTag::List(tag, ltag) == end_tag { - return Ok((size, true)); - } - - for i in 0..CHUNKS.len() { - if RIFFTag::Chunk(tag) == CHUNKS[i].tag { - let psize = (CHUNKS[i].parse)(self, strmgr, size)?; - if psize != size { return Err(InvalidData); } - if (psize & 1) == 1 { self.src.read_skip(1)?; } - return Ok((size + 8, false)); - } - if RIFFTag::List(tag, ltag) == CHUNKS[i].tag { - let mut rest_size = size - 4; - let psize = (CHUNKS[i].parse)(self, strmgr, rest_size)?; - if psize > rest_size { return Err(InvalidData); } - rest_size -= psize; - while rest_size > 0 { - let (psize, _) = self.parse_chunk(strmgr, end_tag, rest_size, depth+1)?; - if psize > rest_size { return Err(InvalidData); } - rest_size -= psize; - if (psize & 1) == 1 { - if rest_size > 0 { - rest_size -= 1; - } - } - } - - return Ok((size + 8, false)); - } - } - if !is_list { - self.src.read_skip(size)?; - } else { - if size < 4 { return Err(InvalidData); } - self.src.read_skip(size - 4)?; - } - if (size & 1) == 1 { self.src.read_skip(1)?; } - return Ok((size + 8, false)); - } - - fn read_header(&mut self, strmgr: &mut StreamManager) -> DemuxerResult<()> { - let riff_tag = self.src.read_u32be()?; - let size = self.src.read_u32le()? as usize; - let avi_tag = self.src.read_u32be()?; - if riff_tag != mktag!(b"RIFF") || avi_tag != mktag!(b"AVI ") { - return Err(InvalidData); - } - self.size = size; - let mut rest_size = size; - loop { - let (csz, end) = self.parse_chunk(strmgr, RIFFTag::List(mktag!(b"LIST"), mktag!(b"movi")), rest_size,0)?; - if end { self.movi_size = csz - 4; break; } - rest_size -= csz; - } - if !self.sstate.valid_state() || self.sstate.strm_no != self.num_streams { - return Err(InvalidData); - } - Ok(()) - } - - fn read_extradata(&mut self, size: usize) -> DemuxerResult<Option<Vec<u8>>> { - if size == 0 { return Ok(None); } - let mut edvec: Vec<u8> = Vec::with_capacity(size); - edvec.resize(size, 0); - self.src.read_buf(&mut edvec)?; - Ok(Some(edvec)) - } -} - -const CHUNKS: [RIFFParser; 6] = [ - RIFFParser { tag: RIFFTag::List(mktag!(b"LIST"), mktag!(b"hdrl")), parse: parse_hdrl }, - RIFFParser { tag: RIFFTag::List(mktag!(b"LIST"), mktag!(b"strl")), parse: parse_strl }, - RIFFParser { tag: RIFFTag::Chunk(mktag!(b"avih")), parse: parse_avih }, - RIFFParser { tag: RIFFTag::Chunk(mktag!(b"strf")), parse: parse_strf }, - RIFFParser { tag: RIFFTag::Chunk(mktag!(b"strh")), parse: parse_strh }, - RIFFParser { tag: RIFFTag::Chunk(mktag!(b"JUNK")), parse: parse_junk }, -]; - -fn is_list_tag(tag: u32) -> bool { - for i in 0..CHUNKS.len() { - if let RIFFTag::List(ltag, _) = CHUNKS[i].tag { - if tag == ltag { - return true; - } - } - } - false -} - -#[allow(unused_variables)] -fn parse_hdrl(dmx: &mut AVIDemuxer, strmgr: &mut StreamManager, size: usize) -> DemuxerResult<usize> { - Ok(0) -} - -#[allow(unused_variables)] -fn parse_strl(dmx: &mut AVIDemuxer, strmgr: &mut StreamManager, size: usize) -> DemuxerResult<usize> { - Ok(0) -} - -#[allow(unused_variables)] -fn parse_strh(dmx: &mut AVIDemuxer, strmgr: &mut StreamManager, size: usize) -> DemuxerResult<usize> { - if size < 0x38 { return Err(InvalidData); } - let tag = dmx.src.read_u32be()?; //stream type - let fcc = dmx.src.read_u32be()?; //handler(fourcc) - dmx.src.read_u32le()?; //flags - dmx.src.read_skip(2)?; //priority - dmx.src.read_skip(2)?; //language - dmx.src.read_skip(4)?; //initial frames - dmx.tb_num = dmx.src.read_u32le()?; //scale - dmx.tb_den = dmx.src.read_u32le()?; //rate - dmx.src.read_skip(4)?; //start - dmx.src.read_skip(4)?; //length - dmx.src.read_skip(4)?; //buf size - dmx.src.read_skip(4)?; //quality - dmx.src.read_skip(4)?; //sample size - let a = dmx.src.read_u16le()?; - let b = dmx.src.read_u16le()?; - let c = dmx.src.read_u16le()?; - let d = dmx.src.read_u16le()?; - - dmx.src.read_skip(size - 0x38)?; - - if !dmx.sstate.valid_state() || dmx.sstate.strm_no >= dmx.num_streams { - return Err(InvalidData); - } - if tag == mktag!(b"vids") { - dmx.sstate.strm_type = Some(StreamType::Video); - } else if tag == mktag!(b"auds") { - dmx.sstate.strm_type = Some(StreamType::Audio); - } else { - dmx.sstate.strm_type = Some(StreamType::Data); - } - dmx.sstate.got_strf = false; - - Ok(size) -} - -fn parse_strf(dmx: &mut AVIDemuxer, strmgr: &mut StreamManager, size: usize) -> DemuxerResult<usize> { - if let None = dmx.sstate.strm_type { return Err(InvalidData); } - match dmx.sstate.strm_type.unwrap() { - StreamType::Video => parse_strf_vids(dmx, strmgr, size), - StreamType::Audio => parse_strf_auds(dmx, strmgr, size), - _ => parse_strf_xxxx(dmx, strmgr, size), - } -} - -#[allow(unused_variables)] -fn parse_strf_vids(dmx: &mut AVIDemuxer, strmgr: &mut StreamManager, size: usize) -> DemuxerResult<usize> { - if size < 40 { return Err(InvalidData); } - let bi_size = dmx.src.read_u32le()?; - if (bi_size as usize) > size { return Err(InvalidData); } - let width = dmx.src.read_u32le()?; - let height = dmx.src.read_u32le()? as i32; - let planes = dmx.src.read_u16le()?; - let bitcount = dmx.src.read_u16le()?; - let mut compression: [u8; 4] = [0; 4]; - dmx.src.read_buf(&mut compression)?; - let img_size = dmx.src.read_u32le()?; - let xdpi = dmx.src.read_u32le()?; - let ydpi = dmx.src.read_u32le()?; - let colors = dmx.src.read_u32le()?; - let imp_colors = dmx.src.read_u32le()?; - - let flip = height < 0; - let format = if bitcount > 8 { RGB24_FORMAT } else { PAL8_FORMAT }; - let vhdr = NAVideoInfo::new(width as usize, if flip { -height as usize } else { height as usize}, flip, PAL8_FORMAT); - let vci = NACodecTypeInfo::Video(vhdr); - let edata = dmx.read_extradata(size - 40)?; - let cname = match register::find_codec_from_avi_fourcc(&compression) { - None => "unknown", - Some(name) => name, - }; - let vinfo = NACodecInfo::new(cname, vci, edata); - let res = strmgr.add_stream(NAStream::new(StreamType::Video, dmx.sstate.strm_no as u32, vinfo, dmx.tb_num, dmx.tb_den)); - if let None = res { return Err(MemoryError); } - dmx.sstate.reset(); - Ok(size) -} - -#[allow(unused_variables)] -fn parse_strf_auds(dmx: &mut AVIDemuxer, strmgr: &mut StreamManager, size: usize) -> DemuxerResult<usize> { - if size < 16 { return Err(InvalidData); } - let w_format_tag = dmx.src.read_u16le()?; - let channels = dmx.src.read_u16le()?; - let samplespersec = dmx.src.read_u32le()?; - let avgbytespersec = dmx.src.read_u32le()?; - let block_align = dmx.src.read_u16le()?; - let bits_per_sample = dmx.src.read_u16le()? * 8; - - let soniton = NASoniton::new(bits_per_sample as u8, SONITON_FLAG_SIGNED); - let ahdr = NAAudioInfo::new(samplespersec, channels as u8, soniton, block_align as usize); - let edata = dmx.read_extradata(size - 16)?; - let cname = match register::find_codec_from_wav_twocc(w_format_tag) { - None => "unknown", - Some(name) => name, - }; - let ainfo = NACodecInfo::new(cname, NACodecTypeInfo::Audio(ahdr), edata); - let res = strmgr.add_stream(NAStream::new(StreamType::Audio, dmx.sstate.strm_no as u32, ainfo, dmx.tb_num, dmx.tb_den)); - if let None = res { return Err(MemoryError); } - dmx.sstate.reset(); - Ok(size) -} - -fn parse_strf_xxxx(dmx: &mut AVIDemuxer, strmgr: &mut StreamManager, size: usize) -> DemuxerResult<usize> { - let edata = dmx.read_extradata(size)?; - let info = NACodecInfo::new("unknown", NACodecTypeInfo::None, edata); - let res = strmgr.add_stream(NAStream::new(StreamType::Data, dmx.sstate.strm_no as u32, info, dmx.tb_num, dmx.tb_den)); - if let None = res { return Err(MemoryError); } - dmx.sstate.reset(); - Ok(size) -} - -#[allow(unused_variables)] -fn parse_avih(dmx: &mut AVIDemuxer, strmgr: &mut StreamManager, size: usize) -> DemuxerResult<usize> { - if size < 0x38 { return Err(InvalidData); } - let timebase = dmx.src.read_u32le()?; //microsec per frame - dmx.src.read_skip(4)?; //max frame size - dmx.src.read_skip(4)?; //padding - dmx.src.read_u32le()?; //flags - let frames = dmx.src.read_u32le()?; //frames - dmx.src.read_skip(4)?; //initial frames - let streams = dmx.src.read_u32le()?; //streams - if streams > 100 { return Err(InvalidData); } - dmx.num_streams = streams as u8; - - dmx.src.read_skip(4)?; //buf size - let width = dmx.src.read_u32le()?; //width - let height = dmx.src.read_u32le()? as i32; //height - dmx.src.read_skip(16)?; //reserved - - dmx.cur_frame.resize(streams as usize, 0); - dmx.src.read_skip(size - 0x38)?; - Ok(size) -} - -#[allow(unused_variables)] -fn parse_junk(dmx: &mut AVIDemuxer, strmgr: &mut StreamManager, size: usize) -> DemuxerResult<usize> { - dmx.src.read_skip(size)?; - Ok(size) -} - -pub struct AVIDemuxerCreator { } - -impl DemuxerCreator for AVIDemuxerCreator { - fn new_demuxer<'a>(&self, br: &'a mut ByteReader<'a>) -> Box<DemuxCore<'a> + 'a> { - Box::new(AVIDemuxer::new(br)) - } - fn get_name(&self) -> &'static str { "avi" } -} - -#[cfg(test)] -mod test { - use super::*; - use std::fs::File; - - #[test] - fn test_avi_demux() { - let mut file = File::open("assets/laser05.avi").unwrap(); - let mut fr = FileReader::new_read(&mut file); - let mut br = ByteReader::new(&mut fr); - let mut dmx = AVIDemuxer::new(&mut br); - let mut sm = StreamManager::new(); - dmx.open(&mut sm).unwrap(); - - loop { - let pktres = dmx.get_frame(&mut sm); - if let Err(e) = pktres { - if e == DemuxerError::EOF { break; } - panic!("error"); - } - let pkt = pktres.unwrap(); - println!("Got {}", pkt); - } - } -} diff --git a/src/demuxers/gdv.rs b/src/demuxers/gdv.rs deleted file mode 100644 index 63b7364..0000000 --- a/src/demuxers/gdv.rs +++ /dev/null @@ -1,196 +0,0 @@ -use super::*; -//use io::byteio::*; -//use frame::*; -use crate::formats::*; -//use std::collections::HashMap; - -enum GDVState { - NewFrame, - AudioRead, -} - -#[allow(dead_code)] -struct GremlinVideoDemuxer<'a> { - src: &'a mut ByteReader<'a>, - frames: u16, - cur_frame: u16, - asize: usize, - apacked: bool, - state: GDVState, - pktdta: Vec<u8>, - a_id: Option<usize>, - v_id: Option<usize>, -} - -struct GDVFixedSizes { - id: u16, - width: u16, - height: u16, -} -const GDV_SIZE_TABLE: &[GDVFixedSizes] = &[ - GDVFixedSizes { id: 0, width: 320, height: 200 }, - GDVFixedSizes { id: 1, width: 640, height: 200 }, - GDVFixedSizes { id: 2, width: 320, height: 167 }, - GDVFixedSizes { id: 3, width: 320, height: 180 }, - GDVFixedSizes { id: 4, width: 320, height: 400 }, - GDVFixedSizes { id: 5, width: 320, height: 170 }, - GDVFixedSizes { id: 6, width: 160, height: 85 }, - GDVFixedSizes { id: 7, width: 160, height: 83 }, - GDVFixedSizes { id: 8, width: 160, height: 90 }, - GDVFixedSizes { id: 9, width: 280, height: 128 }, - GDVFixedSizes { id: 10, width: 320, height: 240 }, - GDVFixedSizes { id: 11, width: 320, height: 201 }, - GDVFixedSizes { id: 16, width: 640, height: 400 }, - GDVFixedSizes { id: 17, width: 640, height: 200 }, - GDVFixedSizes { id: 18, width: 640, height: 180 }, - GDVFixedSizes { id: 19, width: 640, height: 167 }, - GDVFixedSizes { id: 20, width: 640, height: 170 }, - GDVFixedSizes { id: 21, width: 320, height: 240 }, -]; - -impl<'a> DemuxCore<'a> for GremlinVideoDemuxer<'a> { - #[allow(unused_variables)] - fn open(&mut self, strmgr: &mut StreamManager) -> DemuxerResult<()> { - let src = &mut self.src; - let magic = src.read_u32le()?; - if magic != 0x29111994 { return Err(DemuxerError::InvalidData); } - let id = src.read_u16le()?; - let frames = src.read_u16le()?; - let fps = src.read_u16le()?; - let aflags = src.read_u16le()?; - let rate = src.read_u16le()?; - let depth = src.read_u16le()?; - let max_fs = src.read_u16le()?; - src.read_skip(2)?; - let mut width = src.read_u16le()?; - let mut height = src.read_u16le()?; - if (width == 0) && (height == 0) { - for el in GDV_SIZE_TABLE { - if el.id == id { - width = el.width; - height = el.height; - break; - } - } - if (width == 0) && (height == 0) { return Err(DemuxerError::InvalidData); } - } - if max_fs > 0 { - let mut edata: Vec<u8> = Vec::with_capacity(768); - if depth == 1 { - edata.resize(768, 0); - src.read_buf(edata.as_mut_slice())?; - } - let vhdr = NAVideoInfo::new(width as usize, height as usize, false, PAL8_FORMAT); - let vci = NACodecTypeInfo::Video(vhdr); - let vinfo = NACodecInfo::new("gdv-video", vci, if edata.len() == 0 { None } else { Some(edata) }); - self.v_id = strmgr.add_stream(NAStream::new(StreamType::Video, 0, vinfo, 1, fps as u32)); - } - if (aflags & 1) != 0 { - let channels = if (aflags & 2) != 0 { 2 } else { 1 }; - let packed = if (aflags & 8) != 0 { 1 } else { 0 }; - let depth = if (aflags & 4) != 0 { 16 } else { 8 }; - - let ahdr = NAAudioInfo::new(rate as u32, channels as u8, if depth == 16 { SND_S16_FORMAT } else { SND_U8_FORMAT }, 2); - let ainfo = NACodecInfo::new(if packed != 0 { "gdv-audio" } else { "pcm" }, - NACodecTypeInfo::Audio(ahdr), None); - self.a_id = strmgr.add_stream(NAStream::new(StreamType::Audio, 1, ainfo, 1, rate as u32)); - - self.asize = (((rate / fps) * channels * (depth / 8)) >> packed) as usize; - self.apacked = (aflags & 8) != 0; - } - self.frames = frames; - self.state = GDVState::NewFrame; - Ok(()) - } - - #[allow(unused_variables)] - fn get_frame(&mut self, strmgr: &mut StreamManager) -> DemuxerResult<NAPacket> { - if self.cur_frame >= self.frames { return Err(DemuxerError::EOF); } - match self.state { - GDVState::NewFrame if self.asize > 0 => { self.read_achunk(strmgr) } - _ => { self.read_vchunk(strmgr) } - } - } - - #[allow(unused_variables)] - fn seek(&mut self, time: u64) -> DemuxerResult<()> { - Err(DemuxerError::NotImplemented) - } -} -/*impl<'a> Drop for GremlinVideoDemuxer<'a> { - #[allow(unused_variables)] - fn drop(&mut self) { - } -}*/ -impl<'a> GremlinVideoDemuxer<'a> { - fn new(io: &'a mut ByteReader<'a>) -> Self { - GremlinVideoDemuxer { - cur_frame: 0, - frames: 0, - asize: 0, - apacked: false, - state: GDVState::NewFrame, -pktdta: Vec::new(), - src: io, - a_id: None, - v_id: None, - } - } - - fn read_achunk(&mut self, strmgr: &mut StreamManager) -> DemuxerResult<NAPacket> { - self.state = GDVState::AudioRead; - let str = strmgr.get_stream(self.a_id.unwrap()).unwrap(); - let (tb_num, tb_den) = str.get_timebase(); - let ts = NATimeInfo::new(Some(self.cur_frame as u64), None, None, tb_num, tb_den); - self.src.read_packet(str, ts, true, self.asize) - } - - fn read_vchunk(&mut self, strmgr: &mut StreamManager) -> DemuxerResult<NAPacket> { - let str = strmgr.get_stream(self.v_id.unwrap()).unwrap(); - let src = &mut self.src; - let magic = src.read_u16be()?; - if magic != 0x0513 { return Err(DemuxerError::InvalidData); } - let size = (src.read_u16le()? as usize) + 4; - let tmp = src.peek_u32le()?; - let flags = (tmp & 0xFF) as usize; - self.state = GDVState::NewFrame; - self.cur_frame = self.cur_frame + 1; - let (tb_num, tb_den) = str.get_timebase(); - let ts = NATimeInfo::new(Some((self.cur_frame - 1) as u64), None, None, tb_num, tb_den); - src.read_packet(str, ts, if (flags & 64) != 0 { true } else { false }, size) - } -} - -pub struct GDVDemuxerCreator { } - -impl DemuxerCreator for GDVDemuxerCreator { - fn new_demuxer<'a>(&self, br: &'a mut ByteReader<'a>) -> Box<DemuxCore<'a> + 'a> { - Box::new(GremlinVideoDemuxer::new(br)) - } - fn get_name(&self) -> &'static str { "gdv" } -} - -#[cfg(test)] -mod test { - use super::*; - use std::fs::File; - - #[test] - fn test_gdv_demux() { - let mut file = File::open("assets/intro1.gdv").unwrap(); - let mut fr = FileReader::new_read(&mut file); - let mut br = ByteReader::new(&mut fr); - let mut dmx = GremlinVideoDemuxer::new(&mut br); - let mut sm = StreamManager::new(); - dmx.open(&mut sm).unwrap(); - loop { - let pktres = dmx.get_frame(&mut sm); - if let Err(e) = pktres { - if (e as i32) == (DemuxerError::EOF as i32) { break; } - panic!("error"); - } - let pkt = pktres.unwrap(); - println!("Got {}", pkt); - } - } -} diff --git a/src/demuxers/mod.rs b/src/demuxers/mod.rs deleted file mode 100644 index adf954a..0000000 --- a/src/demuxers/mod.rs +++ /dev/null @@ -1,242 +0,0 @@ -use std::rc::Rc; -use crate::frame::*; -use crate::io::byteio::*; - -#[derive(Debug,Clone,Copy,PartialEq)] -#[allow(dead_code)] -pub enum DemuxerError { - EOF, - NoSuchInput, - InvalidData, - IOError, - NotImplemented, - MemoryError, - TryAgain, -} - -type DemuxerResult<T> = Result<T, DemuxerError>; - -pub trait DemuxCore<'a> { - fn open(&mut self, strmgr: &mut StreamManager) -> DemuxerResult<()>; - fn get_frame(&mut self, strmgr: &mut StreamManager) -> DemuxerResult<NAPacket>; - fn seek(&mut self, time: u64) -> DemuxerResult<()>; -} - -pub trait NAPacketReader { - fn read_packet(&mut self, str: Rc<NAStream>, ts: NATimeInfo, keyframe: bool, size: usize) -> DemuxerResult<NAPacket>; - fn fill_packet(&mut self, pkt: &mut NAPacket) -> DemuxerResult<()>; -} - -impl<'a> NAPacketReader for ByteReader<'a> { - fn read_packet(&mut self, str: Rc<NAStream>, ts: NATimeInfo, kf: bool, size: usize) -> DemuxerResult<NAPacket> { - let mut buf: Vec<u8> = Vec::with_capacity(size); - if buf.capacity() < size { return Err(DemuxerError::MemoryError); } - buf.resize(size, 0); - let res = self.read_buf(buf.as_mut_slice()); - if let Err(_) = res { return Err(DemuxerError::IOError); } - let pkt = NAPacket::new(str, ts, kf, buf); - Ok(pkt) - } - fn fill_packet(&mut self, pkt: &mut NAPacket) -> DemuxerResult<()> { - let mut refbuf = pkt.get_buffer(); - let buf = Rc::make_mut(&mut refbuf); - let res = self.read_buf(buf.as_mut_slice()); - if let Err(_) = res { return Err(DemuxerError::IOError); } - Ok(()) - } -} - -pub struct StreamManager { - streams: Vec<Rc<NAStream>>, - ignored: Vec<bool>, - no_ign: bool, -} - -impl StreamManager { - pub fn new() -> Self { - StreamManager { - streams: Vec::new(), - ignored: Vec::new(), - no_ign: true, - } - } - pub fn iter(&self) -> StreamIter { StreamIter::new(&self.streams) } - - pub fn add_stream(&mut self, stream: NAStream) -> Option<usize> { - let stream_num = self.streams.len(); - let mut str = stream.clone(); - str.set_num(stream_num); - self.streams.push(Rc::new(str)); - self.ignored.push(false); - Some(stream_num) - } - pub fn get_stream(&self, idx: usize) -> Option<Rc<NAStream>> { - if idx < self.streams.len() { - Some(self.streams[idx].clone()) - } else { - None - } - } - pub fn get_stream_by_id(&self, id: u32) -> Option<Rc<NAStream>> { - for i in 0..self.streams.len() { - if self.streams[i].get_id() == id { - return Some(self.streams[i].clone()); - } - } - None - } - pub fn get_num_streams(&self) -> usize { self.streams.len() } - pub fn is_ignored(&self, idx: usize) -> bool { - if self.no_ign { - true - } else if idx < self.ignored.len() { - self.ignored[idx] - } else { - false - } - } - pub fn is_ignored_id(&self, id: u32) -> bool { - for i in 0..self.streams.len() { - if self.streams[i].get_id() == id { - return self.ignored[i]; - } - } - false - } - pub fn set_ignored(&mut self, idx: usize) { - if idx < self.ignored.len() { - self.ignored[idx] = true; - self.no_ign = false; - } - } - pub fn set_unignored(&mut self, idx: usize) { - if idx < self.ignored.len() { - self.ignored[idx] = false; - } - } -} - -pub struct StreamIter<'a> { - streams: &'a Vec<Rc<NAStream>>, - pos: usize, -} - -impl<'a> StreamIter<'a> { - pub fn new(streams: &'a Vec<Rc<NAStream>>) -> Self { - StreamIter { streams: streams, pos: 0 } - } -} - -impl<'a> Iterator for StreamIter<'a> { - type Item = Rc<NAStream>; - - fn next(&mut self) -> Option<Self::Item> { - if self.pos >= self.streams.len() { return None; } - let ret = self.streams[self.pos].clone(); - self.pos += 1; - Some(ret) - } -} - -pub struct Demuxer<'a> { - dmx: Box<DemuxCore<'a> + 'a>, - streams: StreamManager, -} - -impl<'a> Demuxer<'a> { - fn new(dmx: Box<DemuxCore<'a> + 'a>, str: StreamManager) -> Self { - Demuxer { - dmx: dmx, - streams: str, - } - } - pub fn get_stream(&self, idx: usize) -> Option<Rc<NAStream>> { - self.streams.get_stream(idx) - } - pub fn get_stream_by_id(&self, id: u32) -> Option<Rc<NAStream>> { - self.streams.get_stream_by_id(id) - } - pub fn get_num_streams(&self) -> usize { - self.streams.get_num_streams() - } - pub fn get_streams(&self) -> StreamIter { - self.streams.iter() - } - pub fn is_ignored_stream(&self, idx: usize) -> bool { - self.streams.is_ignored(idx) - } - pub fn set_ignored_stream(&mut self, idx: usize) { - self.streams.set_ignored(idx) - } - pub fn set_unignored_stream(&mut self, idx: usize) { - self.streams.set_unignored(idx) - } - - pub fn get_frame(&mut self) -> DemuxerResult<NAPacket> { - loop { - let res = self.dmx.get_frame(&mut self.streams); - if self.streams.no_ign || res.is_err() { return res; } - let res = res.unwrap(); - let idx = res.get_stream().get_num(); - if !self.is_ignored_stream(idx) { - return Ok(res); - } - } - } - pub fn seek(&mut self, time: u64) -> DemuxerResult<()> { - self.dmx.seek(time) - } -} - -impl From<ByteIOError> for DemuxerError { - fn from(_: ByteIOError) -> Self { DemuxerError::IOError } -} - -///The structure used to create demuxers. -pub trait DemuxerCreator { - /// Create new demuxer instance that will use `ByteReader` source as an input. - fn new_demuxer<'a>(&self, br: &'a mut ByteReader<'a>) -> Box<DemuxCore<'a> + 'a>; - /// Get the name of current demuxer creator. - fn get_name(&self) -> &'static str; -} - -macro_rules! validate { - ($a:expr) => { if !$a { println!("check failed at {}:{}", file!(), line!()); return Err(DemuxerError::InvalidData); } }; -} - -#[cfg(feature="demuxer_gdv")] -mod gdv; -#[cfg(feature="demuxer_avi")] -mod avi; -#[cfg(feature="demuxer_real")] -mod realmedia; - - -const DEMUXERS: &[&'static DemuxerCreator] = &[ -#[cfg(feature="demuxer_avi")] - &avi::AVIDemuxerCreator {}, -#[cfg(feature="demuxer_gdv")] - &gdv::GDVDemuxerCreator {}, -#[cfg(feature="demuxer_real")] - &realmedia::RealMediaDemuxerCreator {}, -#[cfg(feature="demuxer_real")] - &realmedia::RealAudioDemuxerCreator {}, -#[cfg(feature="demuxer_real")] - &realmedia::RealIVRDemuxerCreator {}, -]; - -pub fn find_demuxer(name: &str) -> Option<&DemuxerCreator> { - for &dmx in DEMUXERS { - if dmx.get_name() == name { - return Some(dmx); - } - } - None -} - -pub fn create_demuxer<'a>(dmxcr: &DemuxerCreator, br: &'a mut ByteReader<'a>) -> DemuxerResult<Demuxer<'a>> { - let mut dmx = dmxcr.new_demuxer(br); - let mut str = StreamManager::new(); - dmx.open(&mut str)?; - Ok(Demuxer::new(dmx, str)) -} diff --git a/src/demuxers/realmedia.rs b/src/demuxers/realmedia.rs deleted file mode 100644 index 9026384..0000000 --- a/src/demuxers/realmedia.rs +++ /dev/null @@ -1,1675 +0,0 @@ -use super::*; -use super::DemuxerError::*; -//use io::byteio::*; -//use frame::*; -use crate::formats::*; -use std::io::SeekFrom; -use std::mem; -use std::fmt; - -macro_rules! mktag { - ($a:expr, $b:expr, $c:expr, $d:expr) => ({ - (($a as u32) << 24) | (($b as u32) << 16) | (($c as u32) << 8) | ($d as u32) - }); - ($arr:expr) => ({ - (($arr[0] as u32) << 24) | (($arr[1] as u32) << 16) | (($arr[2] as u32) << 8) | ($arr[3] as u32) - }); -} - -const RM_SIPRO_BLOCK_SIZES: [usize; 4] = [ 29, 19, 37, 20 ]; -const RM_SIPRO_SWAPS: [[u8; 2]; 38] = [ - [ 0, 63 ], [ 1, 22 ], [ 2, 44 ], [ 3, 90 ], - [ 5, 81 ], [ 7, 31 ], [ 8, 86 ], [ 9, 58 ], - [ 10, 36 ], [ 12, 68 ], [ 13, 39 ], [ 14, 73 ], - [ 15, 53 ], [ 16, 69 ], [ 17, 57 ], [ 19, 88 ], - [ 20, 34 ], [ 21, 71 ], [ 24, 46 ], [ 25, 94 ], - [ 26, 54 ], [ 28, 75 ], [ 29, 50 ], [ 32, 70 ], - [ 33, 92 ], [ 35, 74 ], [ 38, 85 ], [ 40, 56 ], - [ 42, 87 ], [ 43, 65 ], [ 45, 59 ], [ 48, 79 ], - [ 49, 93 ], [ 51, 89 ], [ 55, 95 ], [ 61, 76 ], - [ 67, 83 ], [ 77, 80 ] -]; - -struct RMVideoStream { - frame: Vec<u8>, - hdr_size: usize, - frame_size: usize, - frame_pos: usize, -} - -impl RMVideoStream { - fn new() -> Self { - RMVideoStream { - frame: Vec::new(), - hdr_size: 0, - frame_size: 0, - frame_pos: 0, - } - } - fn flush(&mut self) { - self.frame.truncate(0); - self.frame_size = 0; - self.frame_pos = 0; - } - fn start_slice(&mut self, num_slices: usize, frame_size: usize, data: &[u8]) { - self.hdr_size = num_slices * 8 + 1; - self.frame.resize(frame_size + self.hdr_size, 0); - self.frame[0] = (num_slices - 1) as u8; - self.frame_pos = 0; - self.add_slice(1, data); - } - fn add_slice(&mut self, slice_no: usize, data: &[u8]) { - self.write_slice_info(slice_no); - let dslice = &mut self.frame[self.hdr_size + self.frame_pos..][..data.len()]; - dslice.copy_from_slice(data); - self.frame_pos += data.len(); - } - fn write_slice_info(&mut self, slice_no: usize) { - let off = 1 + (slice_no - 1) * 8; - self.frame[off + 0] = 0; - self.frame[off + 1] = 0; - self.frame[off + 2] = 0; - self.frame[off + 3] = 1; - self.frame[off + 4] = (self.frame_pos >> 24) as u8; - self.frame[off + 5] = (self.frame_pos >> 16) as u8; - self.frame[off + 6] = (self.frame_pos >> 8) as u8; - self.frame[off + 7] = (self.frame_pos >> 0) as u8; - } - fn get_frame_data(&mut self) -> Vec<u8> { - let mut v: Vec<u8> = Vec::new(); - mem::swap(&mut v, &mut self.frame); - self.flush(); - v - } -} - -#[derive(Clone,Copy,PartialEq)] -enum Deinterleaver { - None, - RA28_8, - Generic, - Sipro, - VBR, -} - -struct RMAudioStream { - deint: Deinterleaver, - iinfo: Option<InterleaveInfo>, - buf: Vec<u8>, - sub_packet: usize, -} - -const RM_ILEAVE_INT0: u32 = mktag!(b"Int0"); -const RM_ILEAVE_INT4: u32 = mktag!(b"Int4"); -const RM_ILEAVE_GENR: u32 = mktag!(b"genr"); -const RM_ILEAVE_SIPR: u32 = mktag!(b"sipr"); -const RM_ILEAVE_VBRF: u32 = mktag!(b"vbrf"); -const RM_ILEAVE_VBRS: u32 = mktag!(b"vbrs"); - -impl RMAudioStream { - fn new(iinfo: Option<InterleaveInfo>) -> Self { - let deint; - let mut buf: Vec<u8>; - if let Some(info) = iinfo { - deint = match info.id { - RM_ILEAVE_INT0 => Deinterleaver::None, - RM_ILEAVE_INT4 => Deinterleaver::RA28_8, - RM_ILEAVE_GENR => Deinterleaver::Generic, - RM_ILEAVE_SIPR => Deinterleaver::Sipro, - RM_ILEAVE_VBRF => Deinterleaver::VBR, - RM_ILEAVE_VBRS => Deinterleaver::VBR, - _ => {println!("unknown deint {:X}", info.id); Deinterleaver::None }, - }; - match deint { - Deinterleaver::None => { buf = Vec::new(); }, - Deinterleaver::RA28_8 | - Deinterleaver::Generic | - Deinterleaver::Sipro => { - let bsize = (info.frame_size as usize) * (info.factor as usize); - buf = Vec::with_capacity(bsize); - buf.resize(bsize, 0u8); - }, - Deinterleaver::VBR => { - buf = Vec::new(); - }, - }; - } else { - deint = Deinterleaver::None; - buf = Vec::new(); - } - RMAudioStream { deint: deint, iinfo: iinfo, buf: buf, sub_packet: 0 } - } - fn read_apackets(&mut self, queued_packets: &mut Vec<NAPacket>, src: &mut ByteReader, stream: Rc<NAStream>, ts: u32, keyframe: bool, payload_size: usize) -> DemuxerResult<NAPacket> { - let (tb_num, tb_den) = stream.get_timebase(); - let ts = NATimeInfo::new(Some(ts as u64), None, None, tb_num, tb_den); - - if keyframe { - self.sub_packet = 0; - } - match self.deint { - Deinterleaver::None => { return src.read_packet(stream, ts, keyframe, payload_size); }, - Deinterleaver::RA28_8 => { - let iinfo = self.iinfo.unwrap(); - let factor = iinfo.factor as usize; - let halffact = factor >> 1; - let fsize = iinfo.frame_size as usize; - let bsize = iinfo.block_size as usize; - let ppos = self.sub_packet; - for sb in 0..halffact { - let mut dst = &mut self.buf[sb * 2 * fsize + ppos * bsize..][..bsize]; - src.read_buf(&mut dst)?; - } - self.sub_packet += 1; - if self.sub_packet == factor { - self.sub_packet = 0; - return Ok(NAPacket::new(stream, ts, true, self.buf.clone())); - } else { - return Err(DemuxerError::TryAgain); - } - }, - Deinterleaver::Generic => { - let iinfo = self.iinfo.unwrap(); - let factor = iinfo.factor as usize; - let fsize = iinfo.frame_size as usize; - let bsize = iinfo.block_size as usize; - let factor2 = fsize / bsize; - let ppos = self.sub_packet; - - for sb in 0..factor2 { - let sb_pos = factor * sb + ((factor + 1) >> 1) * (ppos & 1) + (ppos >> 1); - let mut dst = &mut self.buf[bsize * sb_pos..][..bsize]; - src.read_buf(&mut dst)?; - } - }, - Deinterleaver::Sipro => { - let iinfo = self.iinfo.unwrap(); - let fsize = iinfo.frame_size as usize; - let ppos = self.sub_packet; - - let mut dst = &mut self.buf[fsize * ppos..][..fsize]; - src.read_buf(&mut dst)?; - }, - Deinterleaver::VBR => { - validate!(payload_size >= 5); - let hdrsizesize = src.read_u16be()?; - let num_entries = (hdrsizesize / 16) as usize; - validate!(payload_size >= num_entries * 3 + 2); - let mut sizes: Vec<usize> = Vec::with_capacity(num_entries); - let mut tot_size = 0; - for _ in 0..num_entries { - let sz = src.read_u16be()? as usize; - tot_size += sz; - sizes.push(sz); - } - validate!(tot_size + num_entries * 2 + 2 == payload_size); - let pkt_ts = NATimeInfo::new(None, None, None, tb_num, tb_den); - let mut first = true; - for size in sizes.iter() { - let cur_ts = if first { ts } else { pkt_ts }; - first = false; - let pkt = src.read_packet(stream.clone(), cur_ts, true, *size)?; - queued_packets.push(pkt); - } - queued_packets.reverse(); - let pkt0 = queued_packets.pop().unwrap(); - return Ok(pkt0); - }, - }; - - let iinfo = self.iinfo.unwrap(); - let factor = iinfo.factor as usize; - let fsize = if iinfo.block_size != 0 { iinfo.block_size } else { iinfo.frame_size } as usize; - - self.sub_packet += 1; - if self.sub_packet < factor { - return Err(DemuxerError::TryAgain); - } - - self.sub_packet = 0; - - if self.deint == Deinterleaver::Sipro { - sipro_restore(&mut self.buf, factor, fsize); - } - - let mut frames_iter = self.buf.chunks(fsize); - let pkt0 = frames_iter.next().unwrap(); - - let pkt_ts = NATimeInfo::new(None, None, None, tb_num, tb_den); - for pkts in frames_iter { - let pkt = NAPacket::new(stream.clone(), pkt_ts, true, pkts.to_vec()); - queued_packets.push(pkt); - } - queued_packets.reverse(); - Ok(NAPacket::new(stream, ts, true, pkt0.to_vec())) - } -} - -fn sipro_restore(buf: &mut [u8], factor: usize, fsize: usize) { - let stride = factor * fsize * 2 / 96; - for i in 0..38 { - let mut sidx = (RM_SIPRO_SWAPS[i][0] as usize) * stride; - let mut didx = (RM_SIPRO_SWAPS[i][1] as usize) * stride; - for _ in 0..stride { - let in0 = buf[sidx >> 1]; - let in1 = buf[didx >> 1]; - let nib0 = (in0 >> ((sidx & 1) * 4)) & 0xF; - let nib1 = (in1 >> ((didx & 1) * 4)) & 0xF; - - buf[didx >> 1] = (nib0 << (4 * (didx & 1))) | (in1 & (0xF << (4 * (!didx & 1)))); - buf[sidx >> 1] = (nib1 << (4 * (sidx & 1))) | (in0 & (0xF << (4 * (!sidx & 1)))); - - sidx += 1; - didx += 1; - } - } -} - -struct SubstreamInfo { - id: u32, - map: Vec<u16>, - str_ids: Vec<u32>, -} - -struct MLTIMapper { - sub_info: Vec<SubstreamInfo>, - sstr_id: u32, -} - -impl MLTIMapper { - fn new() -> Self { - MLTIMapper { - sub_info: Vec::new(), - sstr_id: 0x10000, - } - } - fn add_stream(&mut self, stream_no: u32) { - let ssinfo = SubstreamInfo { id: stream_no, map: Vec::new(), str_ids: Vec::new() }; - self.sub_info.push(ssinfo); - } - fn get_substream_no(&self) -> u32 { - self.sstr_id - 1 - } - fn find_idx(&self, stream_no: u32) -> Option<usize> { - self.sub_info.iter().position(|x| x.id == stream_no) - } - fn add_map_rule(&mut self, map_ss: u16) { - let idx = self.sub_info.len() - 1; - self.sub_info[idx].map.push(map_ss); - } - fn add_substream(&mut self) { - let idx = self.sub_info.len() - 1; - self.sub_info[idx].str_ids.push(self.sstr_id); - self.sstr_id += 1; - } - fn is_mlti_stream(&self, stream_no: u32) -> bool { - self.find_idx(stream_no).is_some() - } - fn find_substream(&self, stream_no: u32, grp: u16) -> Option<u32> { - if let Some(idx) = self.find_idx(stream_no) { - if (grp as usize) < self.sub_info[idx].map.len() { - let sub_id = self.sub_info[idx].map[grp as usize] as usize; - if sub_id < self.sub_info[idx].str_ids.len() { - return Some(self.sub_info[idx].str_ids[sub_id]); - } - } - } - None - } -} - -enum RMStreamType { - Audio(RMAudioStream), - Video(RMVideoStream), - Logical, - Unknown, -} - -struct CommonStreamData { - streams: Vec<RMStreamType>, - str_ids: Vec<u32>, - mlti_mapper: MLTIMapper, -} - -impl CommonStreamData { - fn new() -> Self { - CommonStreamData { - streams: Vec::new(), - str_ids: Vec::new(), - mlti_mapper: MLTIMapper::new(), - } - } - fn get_stream_id(&self, str_no: u32, pkt_grp: u16) -> u32 { - if !self.mlti_mapper.is_mlti_stream(str_no) { - str_no - } else { - self.mlti_mapper.find_substream(str_no, pkt_grp).unwrap() - } - } - fn find_stream(&self, stream_id: u32) -> Option<usize> { - self.str_ids.iter().position(|x| *x == stream_id) - } -} - -struct RealMediaDemuxer<'a> { - src: &'a mut ByteReader<'a>, - data_pos: u64, - next_data: u64, - data_ver: u16, - num_packets: u32, - cur_packet: u32, - - str_data: CommonStreamData, - - queued_pkts: Vec<NAPacket>, - slice_buf: Vec<u8>, -} - -fn find_codec_name(registry: &[(&[u8;4], &'static str)], fcc: u32) -> &'static str { - for &(fourcc, name) in registry { - if mktag!(fourcc) == fcc { return name; } - } - "unknown" -} - -fn read_14or30(src: &mut ByteReader) -> DemuxerResult<(bool, u32)> { - let tmp = src.read_u16be()?; - let flag = (tmp & 0x8000) != 0; - if (tmp & 0x4000) == 0x4000 { - Ok((flag, ((tmp & 0x3FFF) as u32))) - } else { - let val = ((tmp as u32) << 16) | (src.read_u16be()? as u32); - Ok((flag, val & 0x3FFFFFFF)) - } -} - -fn read_video_buf(src: &mut ByteReader, stream: Rc<NAStream>, ts: u32, keyframe: bool, frame_size: usize) -> DemuxerResult<NAPacket> { - let size = (frame_size as usize) + 9; - let mut vec: Vec<u8> = Vec::with_capacity(size); - vec.resize(size, 0); - //v[0] = 0; // 1 slice - vec[4] = 1; - src.read_buf(&mut vec[9..])?; - - let (tb_num, tb_den) = stream.get_timebase(); - let ts = NATimeInfo::new(Some(ts as u64), None, None, tb_num, tb_den); - Ok(NAPacket::new(stream, ts, keyframe, vec)) -} - -fn read_multiple_frame(src: &mut ByteReader, stream: Rc<NAStream>, keyframe: bool, skip_mtype: bool) -> DemuxerResult<NAPacket> { - if !skip_mtype { - let mtype = src.read_byte()?; - validate!(mtype == 0xC0); - } - let (_, frame_size) = read_14or30(src)?; - let (_, timestamp) = read_14or30(src)?; - let _seq_no = src.read_byte()?; -//println!(" multiple frame size {} ts {} seq {}", frame_size, timestamp, seq_no); - - read_video_buf(src, stream, timestamp, keyframe, frame_size as usize) -} - -struct RMDemuxCommon {} - -impl RMDemuxCommon { - fn parse_stream_info(str_data: &mut CommonStreamData, strmgr: &mut StreamManager, stream_no: u32, edata: &Vec<u8>) -> DemuxerResult<bool> { - let mut is_mlti = false; - let mut mr = MemoryReader::new_read(edata.as_slice()); - let mut src = ByteReader::new(&mut mr); - let tag = src.read_u32be()?; - let tag2 = src.peek_u32be()?; -//println!("tag1 {:X} tag2 {:X}", tag, tag2); - if tag == mktag!('.', 'r', 'a', 0xFD) { - Self::parse_audio_stream(strmgr, &mut str_data.streams, stream_no, &mut src, edata.as_slice())?; - } else if ((tag2 == mktag!('V', 'I', 'D', 'O')) || (tag2 == mktag!('I', 'M', 'A', 'G'))) && ((tag as usize) <= edata.len()) { - Self::parse_video_stream(strmgr, &mut str_data.streams, stream_no, &mut src, edata.as_slice(), tag2)?; - } else if tag == mktag!(b"LSD:") { - let extradata = Some(edata.clone()); - - src.read_skip(4)?; //version - let channels = src.read_u16be()?; - let samp_size = src.read_u16be()?; - let sample_rate = src.read_u32be()?; - - println!("LSD sr {}, {} ch", sample_rate, channels); - let soniton = NASoniton::new(samp_size as u8, SONITON_FLAG_SIGNED); - let ahdr = NAAudioInfo::new(sample_rate, channels as u8, soniton, 1); - let nainfo = NACodecInfo::new("ralf", NACodecTypeInfo::Audio(ahdr), extradata); - let res = strmgr.add_stream(NAStream::new(StreamType::Audio, stream_no as u32, nainfo, 1, sample_rate)); - if res.is_none() { return Err(MemoryError); } - let astr = RMAudioStream::new(None); - str_data.streams.push(RMStreamType::Audio(astr)); - } else if tag == mktag!(b"MLTI") { - is_mlti = true; - let num_rules = src.read_u16be()? as usize; - let mut max_sub = 0; - str_data.mlti_mapper.add_stream(stream_no); - for _ in 0..num_rules { - let substr = src.read_u16be()?; - max_sub = max_sub.max(substr); - str_data.mlti_mapper.add_map_rule(substr); - } - let num_substreams = src.read_u16be()? as usize; - validate!(num_substreams > (max_sub as usize)); - for _ in 0..num_substreams { - let hdr_size = src.read_u32be()? as usize; - validate!(hdr_size > 8); - let pos = src.tell() as usize; - src.read_skip(hdr_size)?; - str_data.mlti_mapper.add_substream(); - { - let hdrsrc = &edata[pos..][..hdr_size]; - let mut mr = MemoryReader::new_read(hdrsrc); - let mut hsrc = ByteReader::new(&mut mr); - - let tag = hsrc.read_u32be()?; - let tag2 = hsrc.peek_u32be()?; - let stream_no = str_data.mlti_mapper.get_substream_no(); -//todo check that all substreams are of the same type"); - if tag == mktag!('.', 'r', 'a', 0xFD) { - Self::parse_audio_stream(strmgr, &mut str_data.streams, stream_no, &mut hsrc, hdrsrc)?; - } else if (tag2 == mktag!('V', 'I', 'D', 'O')) && ((tag as usize) <= hdr_size) { - Self::parse_video_stream(strmgr, &mut str_data.streams, stream_no, &mut hsrc, hdrsrc, tag2)?; - } else { -println!("unknown MLTI substream {:08X} / {:08X}", tag, tag2); - return Err(DemuxerError::InvalidData); - } - str_data.str_ids.push(stream_no); - } - } - } else { - str_data.streams.push(RMStreamType::Logical); - } - Ok(is_mlti) - } - fn parse_audio_stream(strmgr: &mut StreamManager, streams: &mut Vec<RMStreamType>, stream_no: u32, src: &mut ByteReader, edata_: &[u8]) -> DemuxerResult<()> { - let ver = src.read_u16be()?; - let ainfo = match ver { - 3 => { - parse_aformat3(src)? - }, - 4 => { - parse_aformat4(src)? - }, - 5 => { - parse_aformat5(src)? - }, - _ => { - println!("unknown version {}", ver); - return Err(DemuxerError::InvalidData); - }, - }; -println!(" got ainfo {:?}", ainfo); - let cname = find_codec_name(RM_AUDIO_CODEC_REGISTER, ainfo.fcc); - let blk_size = if ainfo.fcc != mktag!(b"sipr") { - ainfo.granularity as usize - } else { - validate!(ainfo.flavor <= 3); - RM_SIPRO_BLOCK_SIZES[ainfo.flavor as usize] - }; - let srate = ainfo.sample_rate; - let soniton = NASoniton::new(ainfo.sample_size as u8, SONITON_FLAG_SIGNED); - let ahdr = NAAudioInfo::new(srate, ainfo.channels as u8, soniton, blk_size); - let extradata = if ainfo.edata_size == 0 { - None - } else { - let eslice = &edata_[(src.tell() as usize)..]; - Some(eslice.to_vec()) - }; - let nainfo = NACodecInfo::new(cname, NACodecTypeInfo::Audio(ahdr), extradata); - let res = strmgr.add_stream(NAStream::new(StreamType::Audio, stream_no as u32, nainfo, 1, srate)); - if res.is_none() { return Err(MemoryError); } - - let astr = RMAudioStream::new(ainfo.ileave_info); - streams.push(RMStreamType::Audio(astr)); - Ok(()) - } -#[allow(unused_variables)] - fn parse_video_stream(strmgr: &mut StreamManager, streams: &mut Vec<RMStreamType>, stream_no: u32, src: &mut ByteReader, edata_: &[u8], tag2: u32) -> DemuxerResult<()> { - src.read_skip(4)?; - let fcc = src.read_u32be()?; - let width = src.read_u16be()? as usize; - let height = src.read_u16be()? as usize; - let bpp = src.read_u16be()?; - let pad_w = src.read_u16be()?; - let pad_h = src.read_u16be()?; - let fps; - if tag2 == mktag!('V', 'I', 'D', 'O') { - fps = src.read_u32be()?; - } else { - fps = 0x10000; - } - let extradata: Option<Vec<u8>>; - if src.left() > 0 { - let eslice = &edata_[(src.tell() as usize)..]; - extradata = Some(eslice.to_vec()); - } else { - extradata = None; - } - let cname = find_codec_name(RM_VIDEO_CODEC_REGISTER, fcc); - - let vhdr = NAVideoInfo::new(width, height, false, RGB24_FORMAT); - let vinfo = NACodecInfo::new(cname, NACodecTypeInfo::Video(vhdr), extradata); - let res = strmgr.add_stream(NAStream::new(StreamType::Video, stream_no as u32, vinfo, 0x10000, fps)); - if res.is_none() { return Err(DemuxerError::MemoryError); } - - let vstr = RMVideoStream::new(); - streams.push(RMStreamType::Video(vstr)); - Ok(()) - } -#[allow(unused_variables)] - fn parse_packet_payload(src: &mut ByteReader, rmstream: &mut RMStreamType, stream: Rc<NAStream>, slice_buf: &mut Vec<u8>, queued_pkts: &mut Vec<NAPacket>, keyframe: bool, ts: u32, payload_size: usize) -> DemuxerResult<NAPacket> { - match rmstream { - RMStreamType::Video(ref mut vstr) => { - - let pos = src.tell(); - let b0 = src.read_byte()?; - match b0 >> 6 { - 0 => { // partial frame - let b1 = src.read_byte()?; - let hdr1 = ((b0 as u16) << 8) | (b1 as u16); - let num_pkts = ((hdr1 >> 7) & 0x7F) as usize; - let packet_num = hdr1 & 0x7F; - let (_, frame_size) = read_14or30(src)?; - let (_, off) = read_14or30(src)?; - let seq_no = src.read_byte()?; -//println!(" mode 0 pkt {}/{} off {}/{} seq {}", packet_num, num_pkts, off, frame_size, seq_no); - let hdr_skip = (src.tell() - pos) as usize; - - let slice_size = (payload_size - hdr_skip) as usize; - slice_buf.resize(slice_size, 0); - src.read_buf(slice_buf.as_mut_slice())?; - if packet_num == 1 { - vstr.start_slice(num_pkts, frame_size as usize, slice_buf.as_slice()); - } else { - vstr.add_slice(packet_num as usize, slice_buf.as_slice()); - } - if (packet_num as usize) < num_pkts { - return Err(DemuxerError::TryAgain); - } - //todo: check if full frame is received - let (tb_num, tb_den) = stream.get_timebase(); - let ts = NATimeInfo::new(Some(ts as u64), None, None, tb_num, tb_den); - let pkt = NAPacket::new(stream, ts, keyframe, vstr.get_frame_data()); - Ok(pkt) - }, - 1 => { // whole frame - let seq_no = src.read_byte()?; -//println!(" mode 1 seq {}", seq_no); - read_video_buf(src, stream, ts, keyframe, payload_size - 2) - }, - 2 => { // last partial frame - let b1 = src.read_byte()?; - let hdr1 = ((b0 as u16) << 8) | (b1 as u16); - let num_pkts = ((hdr1 >> 7) & 0x7F) as usize; - let packet_num = hdr1 & 0x7F; - let (_, frame_size) = read_14or30(src)?; - let (_, tail_size) = read_14or30(src)?; - let seq_no = src.read_byte()?; -//println!(" mode 2 pkt {}/{} tail {}/{} seq {}", packet_num, num_pkts, tail_size, frame_size, seq_no); - slice_buf.resize(tail_size as usize, 0); - src.read_buf(slice_buf.as_mut_slice())?; - if packet_num == 1 && frame_size == tail_size { - vstr.start_slice(num_pkts, frame_size as usize, slice_buf.as_slice()); - } else { - vstr.add_slice(packet_num as usize, slice_buf.as_slice()); - } - - while src.tell() < pos + (payload_size as u64) { - let res = read_multiple_frame(src, stream.clone(), false, false); - if res.is_err() { break; } - queued_pkts.push(res.unwrap()); - } - queued_pkts.reverse(); - let (tb_num, tb_den) = stream.get_timebase(); - let ts = NATimeInfo::new(Some(ts as u64), None, None, tb_num, tb_den); - let pkt = NAPacket::new(stream, ts, keyframe, vstr.get_frame_data()); - Ok(pkt) - }, - _ => { // multiple frames -//println!(" mode 3"); - let res = read_multiple_frame(src, stream.clone(), keyframe, true); - if res.is_err() { return res; } - while src.tell() < pos + (payload_size as u64) { - let res = read_multiple_frame(src, stream.clone(), false, false); - if res.is_err() { break; } - queued_pkts.push(res.unwrap()); - } - queued_pkts.reverse(); - res - }, - } - }, - RMStreamType::Audio(ref mut astr) => { - astr.read_apackets(queued_pkts, src, stream, ts, keyframe, payload_size) - }, - _ => { - src.read_skip(payload_size)?; - Err(DemuxerError::InvalidData) - }, - } - } -} - -impl<'a> DemuxCore<'a> for RealMediaDemuxer<'a> { - #[allow(unused_variables)] - fn open(&mut self, strmgr: &mut StreamManager) -> DemuxerResult<()> { - self.read_header(strmgr)?; - Ok(()) - } - -#[allow(unused_variables)] - fn get_frame(&mut self, strmgr: &mut StreamManager) -> DemuxerResult<NAPacket> { - if !self.queued_pkts.is_empty() { - let pkt = self.queued_pkts.pop().unwrap(); - return Ok(pkt); - } - loop { - if self.cur_packet >= self.num_packets { - if (self.next_data != 0) && (self.next_data == self.src.tell()) { - let res = read_chunk(self.src); - if let Ok((id, size, ver)) = res { - self.data_pos = self.src.tell(); - self.data_ver = ver; - if self.parse_data_start().is_ok() { - continue; - } - } - } - return Err(DemuxerError::EOF); - } - - let pkt_start = self.src.tell(); - let ver = self.src.read_u16be()?; - validate!(ver <= 1); - let len = self.src.read_u16be()? as usize; - let str_no = self.src.read_u16be()? as u32; - let ts = self.src.read_u32be()?; - let pkt_grp; - let flags; - if ver == 0 { - pkt_grp = self.src.read_byte()? as u16; - flags = self.src.read_byte()?; - } else { - //asm_rule = self.src.read_u16be()?; - //asm_flags = self.src.read_byte()?; - self.src.read_skip(2)?; - pkt_grp = 0; - self.src.read_skip(1)?; - flags = 0; - } - let hdr_size = self.src.tell() - pkt_start; -//println!("packet @{:X} size {} for {} ts {} grp {} flags {:X}", pkt_start, len, str_no, ts, pkt_grp, flags); - self.cur_packet += 1; - - let payload_size = len - (hdr_size as usize); - - let stream_id = self.str_data.get_stream_id(str_no as u32, pkt_grp); - let sr = self.str_data.find_stream(stream_id); - if sr.is_none() { -//println!("stream {} not found", str_no); - self.src.read_skip(payload_size)?; - return Err(DemuxerError::InvalidData); - } - let str_id = sr.unwrap(); - - let streamres = strmgr.get_stream_by_id(stream_id); - if streamres.is_none() { - self.src.read_skip(payload_size)?; - continue; - } - let stream = streamres.unwrap(); -//println!(" stream {}", str_id); - if strmgr.is_ignored_id(stream_id) { - self.src.read_skip(payload_size)?; - continue; - } - //todo skip unwanted packet - let keyframe = (flags & KEYFRAME_FLAG) != 0; - - let ret = RMDemuxCommon::parse_packet_payload(&mut self.src, &mut self.str_data.streams[str_id], stream, &mut self.slice_buf, &mut self.queued_pkts, keyframe, ts, payload_size); - if let Err(DemuxerError::TryAgain) = ret { - continue; - } else { - return ret; - } - } - } - - #[allow(unused_variables)] - fn seek(&mut self, time: u64) -> DemuxerResult<()> { - Err(NotImplemented) - } -} - -fn read_chunk(src: &mut ByteReader) -> DemuxerResult<(u32, u32, u16)> { - let id = src.read_u32be()?; -if id == 0 { return Ok((0, 0, 0)); } - let size = src.read_u32be()?; -if size == 0 { - let ver = src.read_u16be()?; - validate!(ver <= 2); - return Ok((id, 0x0FFFFFFF, ver)); -} - validate!(size >= 10); - let ver = src.read_u16be()?; - validate!(ver <= 2); - Ok((id, size, ver)) -} - -#[derive(Clone,Copy,Debug)] -struct InterleaveInfo { - id: u32, - factor: u16, - block_size: u16, - frame_size: u16, -} - -#[derive(Clone,Copy,Debug)] -struct RealAudioInfo { - fcc: u32, - sample_rate: u32, - sample_size: u16, - flavor: u16, - channels: u16, - channel_mask: u32, - granularity: u32, - bytes_per_minute: u32, - total_bytes: u32, - edata_size: u32, - ileave_info: Option<InterleaveInfo> -} - -fn skip_ra_metadata(src: &mut ByteReader) -> DemuxerResult<()> { - let title_len = src.read_byte()? as usize; - src.read_skip(title_len)?; - let author_len = src.read_byte()? as usize; - src.read_skip(author_len)?; - let copywrong_len = src.read_byte()? as usize; - src.read_skip(copywrong_len)?; - let comment_len = src.read_byte()? as usize; - src.read_skip(comment_len)?; - Ok(()) -} - -#[allow(unused_variables)] -fn parse_aformat3(src: &mut ByteReader) -> DemuxerResult<RealAudioInfo> { - let start = src.tell(); - let header_len = src.read_u16be()?; - validate!(header_len >= 24); - let flavor = src.read_u16be()?; - let granularity = src.read_u32be()?; - let bytes_per_minute = src.read_u32be()?; - let total_bytes = src.read_u32be()?; - - skip_ra_metadata(src)?; - - let _can_copy = src.read_byte()?; - let fcc_len = src.read_byte()?; - validate!(fcc_len == 4); - let fcc = src.read_u32be()?; - - let end = src.tell(); - validate!(end - start <= (header_len as u64) + 2); - - Ok(RealAudioInfo { - fcc: fcc, flavor: flavor, - sample_rate: 8000, sample_size: 16, channels: 1, channel_mask: 0, - granularity: granularity, bytes_per_minute: bytes_per_minute, - total_bytes: total_bytes, edata_size: 0, - ileave_info: None, - }) -} - -#[allow(unused_variables)] -fn parse_aformat4(src: &mut ByteReader) -> DemuxerResult<RealAudioInfo> { - let start = src.tell(); - src.read_skip(2)?; // zeroes - let id = src.read_u32be()?; - validate!(id == mktag!(b".ra4")); - let data_size = src.read_u32be()?; - let _ver4 = src.read_u16be()?; // should be 4 - let header_size = src.read_u32be()?; - let flavor = src.read_u16be()?; - let granularity = src.read_u32be()?; - let total_bytes = src.read_u32be()?; - let bytes_per_minute = src.read_u32be()?; - let _bytes_per_minute2 = src.read_u32be()?; - let ileave_factor = src.read_u16be()?; - let ileave_block_size = src.read_u16be()?; - let _user_data = src.read_u16be()?; - let sample_rate = src.read_u32be()?; - let sample_size = src.read_u32be()?; - let channels = src.read_u16be()?; - let interleaver_id_len = src.read_byte()?; - validate!(interleaver_id_len == 4); - let interleaver_id = src.read_u32be()?; - let fcc_len = src.read_byte()?; - validate!(fcc_len == 4); - let fcc = src.read_u32be()?; - let is_interleaved = src.read_byte()?; - let _can_copy = src.read_byte()?; - let _stream_type = src.read_byte()?; - - skip_ra_metadata(src)?; - - let end = src.tell(); - validate!(end - start <= (header_size as u64) + 10); - - let ileave_info = if is_interleaved != 0 { - Some(InterleaveInfo { - id: interleaver_id, factor: ileave_factor, block_size: granularity as u16, - frame_size: ileave_block_size, - }) - } else { - None - }; - - Ok(RealAudioInfo { - fcc: fcc, flavor: flavor, - sample_rate: sample_rate, sample_size: sample_size as u16, channels: channels, channel_mask: 0, - granularity: granularity, bytes_per_minute: bytes_per_minute, - total_bytes: total_bytes & 0xFFFFFF, edata_size: 0, - ileave_info: ileave_info, - }) -} - -#[allow(unused_variables)] -fn parse_aformat5(src: &mut ByteReader) -> DemuxerResult<RealAudioInfo> { - let start = src.tell(); - src.read_skip(2)?; // zeroes - let id = src.read_u32be()?; - validate!((id == mktag!(b".ra5")) || (id == mktag!(b".ra4"))); - let data_size = src.read_u32be()?; - let _ver5 = src.read_u16be()?; // should be 5 - let header_size = src.read_u32be()?; - let flavor = src.read_u16be()?; - let granularity = src.read_u32be()?; - let total_bytes = src.read_u32be()?; - let bytes_per_minute = src.read_u32be()?; - let _bytes_per_minute2 = src.read_u32be()?; - let ileave_factor = src.read_u16be()?; - let frame_size = src.read_u16be()?; - let ileave_block_size = src.read_u16be()?; - let user_data = src.read_u32be()?; - let _sample_rate1 = src.read_u16be()?; - let sample_rate = src.read_u32be()?; - let sample_size = src.read_u32be()?; - let channels = src.read_u16be()?; - let interleaver_id = src.read_u32be()?; - let fcc = src.read_u32be()?; - let is_interleaved = src.read_byte()?; - let _can_copy = src.read_byte()?; - let _stream_type = src.read_byte()?; - let has_ileave_pattern = src.read_byte()?; - if has_ileave_pattern != 0 { -unimplemented!("ra5 interleave pattern"); - } - let mut edata_size = src.read_u32be()?; - let end = src.tell(); - if id == mktag!(b".ra5") { - validate!(end - start <= (header_size as u64) + 10); -// src.read_skip(((end - start) as usize) - (header_size as usize) - 10)?; - } else { - validate!(end - start <= (header_size as u64) + 15); - } - - let ileave_info = if is_interleaved != 0 { - Some(InterleaveInfo { - id: interleaver_id, factor: ileave_factor, block_size: ileave_block_size, frame_size: frame_size, - }) - } else { - None - }; - if (fcc == mktag!(b"raac")) || (fcc == mktag!(b"racp")) { - validate!(edata_size > 1); - edata_size -= 1; - src.read_skip(1)?; - } - - Ok(RealAudioInfo { - fcc: fcc, flavor: flavor, - sample_rate: sample_rate, sample_size: sample_size as u16, channels: channels, channel_mask: 0, - granularity: granularity, bytes_per_minute: bytes_per_minute, - total_bytes: total_bytes & 0xFFFFFF, edata_size: edata_size, - ileave_info: ileave_info, - }) -} - -const RMVB_HDR_SIZE: u32 = 18; -const RMVB_PROP_SIZE: u32 = 50; -const KEYFRAME_FLAG: u8 = 0x02; - -impl<'a> RealMediaDemuxer<'a> { - fn new(io: &'a mut ByteReader<'a>) -> Self { - RealMediaDemuxer { - src: io, - data_pos: 0, - next_data: 0, - data_ver: 0, - num_packets: 0, - cur_packet: 0, - str_data: CommonStreamData::new(), - queued_pkts: Vec::new(), - slice_buf: Vec::new(), - } - } -#[allow(unused_variables)] - fn read_header(&mut self, strmgr: &mut StreamManager) -> DemuxerResult<()> { - let (id, size, ver) = read_chunk(self.src)?; - validate!((id == mktag!(b".RMF")) || (id == mktag!(b".RMP"))); - validate!(size >= RMVB_HDR_SIZE); - let fver = self.src.read_u32be()?; - validate!(fver <= 1); - let num_hdr = self.src.read_u32be()? as usize; - validate!(num_hdr >= 1); - if size > RMVB_HDR_SIZE { - self.src.read_skip((size - RMVB_HDR_SIZE) as usize)?; - } - - let (id, size, ver) = read_chunk(self.src)?; - let prop_size = if ver == 0 { RMVB_PROP_SIZE } else { RMVB_PROP_SIZE + 4 }; - validate!(size >= prop_size); - validate!((ver == 0) || (ver == 2)); - let maxbr = self.src.read_u32be()?; - let avgbr = self.src.read_u32be()?; - let maxps = self.src.read_u32be()?; - let avgps = self.src.read_u32be()?; - let num_pkt = self.src.read_u32be()? as usize; - let duration = self.src.read_u32be()?; - let preroll = self.src.read_u32be()?; - if ver == 2 { - self.src.read_skip(4)?; - } - let idx_off = self.src.read_u32be()?; - let data_off = self.src.read_u32be()?; - let num_streams = self.src.read_u16be()? as usize; - let flags = self.src.read_u16be()?; - if size > prop_size { - self.src.read_skip((size - prop_size) as usize)?; - } - - for _ in 0..num_hdr { - if self.src.is_eof() { - //warn maybe? - break; - } - let res = self.parse_chunk(strmgr); - match res { - Ok(last) => { if last { break; } }, - Err(DemuxerError::IOError) => { break; }, - Err(etype) => { - if self.data_pos == 0 { // data is not found, report error - return Err(etype); - } - }, - }; - } -//println!("now @ {:X} / {}", self.src.tell(), self.data_pos); - validate!(self.data_pos > 0); - self.src.seek(SeekFrom::Start(self.data_pos))?; - self.parse_data_start()?; - Ok(()) - } - fn parse_data_start(&mut self) -> DemuxerResult<()> { - let num_packets = self.src.read_u32be()?; - if self.data_ver == 2 { - self.src.read_skip(12)?; // zeroes? - } - let next_data_hdr = self.src.read_u32be()?; - self.num_packets = if num_packets > 0 { num_packets } else { 0xFFFFFF }; - self.cur_packet = 0; - self.next_data = next_data_hdr as u64; - Ok(()) - } - fn parse_chunk(&mut self, strmgr: &mut StreamManager) -> DemuxerResult<bool> { - let (id, size, ver) = read_chunk(self.src)?; - let end_pos = self.src.tell() - 10 + (size as u64); - - validate!((ver == 0) || (ver == 2)); - if id == mktag!(b"CONT") { self.parse_content_desc()?; } - else if id == mktag!(b"MDPR") { self.parse_mdpr(strmgr)?; } - else if id == mktag!(b"DATA") { if self.data_pos == 0 { self.data_ver = ver; self.data_pos = self.src.tell(); } } - else if id == mktag!(b"INDX") { /* do nothing for now */ } - else if id == 0 { return Ok(true); } - else { println!("unknown chunk type {:08X}", id); } - - let cpos = self.src.tell(); - if cpos < end_pos { - self.src.read_skip((end_pos - cpos) as usize)?; - } - Ok(false) - } -#[allow(unused_variables)] - fn parse_content_desc(&mut self) -> DemuxerResult<()> { - let title_len = self.src.read_u16be()? as usize; - self.src.read_skip(title_len)?; - let author_len = self.src.read_u16be()? as usize; - self.src.read_skip(author_len)?; - let copywrong_len = self.src.read_u16be()? as usize; - self.src.read_skip(copywrong_len)?; - let comment_len = self.src.read_u16be()? as usize; - self.src.read_skip(comment_len)?; - Ok(()) - } -#[allow(unused_variables)] - fn parse_mdpr(&mut self, strmgr: &mut StreamManager) -> DemuxerResult<()> { - let stream_no = self.src.read_u16be()? as u32; -//todo check stream_no for duplicates - let maxbr = self.src.read_u32be()?; - let avgbr = self.src.read_u32be()?; - let maxps = self.src.read_u32be()?; - let avgps = self.src.read_u32be()?; - let start = self.src.read_u32be()?; - let preroll = self.src.read_u32be()?; - let duration = self.src.read_u32be()?; - let sname_size = self.src.read_byte()? as usize; - let sname = read_string_size(self.src, sname_size)?; -//println!("str #{} sname = {} pkts {}/{} start {} preroll {}", stream_no, sname, maxps, avgps, start, preroll); - let mime_size = self.src.read_byte()? as usize; - let mime = read_string_size(self.src, mime_size)?; -//println!("mime = {}", mime); - let edata_size = self.src.read_u32be()? as usize; - let edata: Option<Vec<u8>> = if edata_size == 0 { None } else { - let mut edvec: Vec<u8> = Vec::with_capacity(edata_size); - edvec.resize(edata_size, 0); - self.src.read_buf(&mut edvec)?; - Some(edvec) - }; - let mut is_mlti = false; - if edata_size > 8 { - if let Some(edata_) = edata { - is_mlti = RMDemuxCommon::parse_stream_info(&mut self.str_data, strmgr, stream_no, &edata_)?; - } - } else { - self.str_data.streams.push(RMStreamType::Unknown); - } - if !is_mlti { - self.str_data.str_ids.push(stream_no); - } - - Ok(()) - } -} - -fn read_string_size(src: &mut ByteReader, size: usize) -> DemuxerResult<String> { - let mut vec: Vec<u8> = Vec::new(); - for _ in 0..size { - let c = src.read_byte()?; - vec.push(c); - } - let str = String::from_utf8(vec); - if str.is_ok() { - Ok(str.unwrap()) - } else { - Ok(String::new()) - } -} - -struct RealAudioDemuxer<'a> { - src: &'a mut ByteReader<'a>, - stream: Option<RMAudioStream>, - data_start: u64, - data_end: u64, - blk_size: usize, - queued_pkts: Vec<NAPacket>, -} - -impl<'a> DemuxCore<'a> for RealAudioDemuxer<'a> { - #[allow(unused_variables)] - fn open(&mut self, strmgr: &mut StreamManager) -> DemuxerResult<()> { - let magic = self.src.read_u32be()?; - validate!(magic == mktag!(b".ra\xFD")); - let ver = self.src.read_u16be()?; - let ainfo = match ver { - 3 => { - parse_aformat3(&mut self.src)? - }, - 4 => { - parse_aformat4(&mut self.src)? - }, - 5 => { - parse_aformat5(&mut self.src)? - }, - _ => { - println!("unknown version {}", ver); - return Err(DemuxerError::InvalidData); - }, - }; -println!(" got ainfo {:?}", ainfo); - let cname = find_codec_name(RM_AUDIO_CODEC_REGISTER, ainfo.fcc); - let blk_size = if ainfo.fcc != mktag!(b"sipr") { - ainfo.granularity as usize - } else { - validate!(ainfo.flavor <= 3); - RM_SIPRO_BLOCK_SIZES[ainfo.flavor as usize] - }; - let srate = ainfo.sample_rate; - let soniton = NASoniton::new(ainfo.sample_size as u8, SONITON_FLAG_SIGNED); - let ahdr = NAAudioInfo::new(srate, ainfo.channels as u8, soniton, blk_size); - let extradata = if ainfo.edata_size == 0 { - None - } else { - let mut dta: Vec<u8> = Vec::with_capacity(ainfo.edata_size as usize); - dta.resize(ainfo.edata_size as usize, 0); - self.src.read_buf(dta.as_mut_slice())?; - Some(dta) - }; - let nainfo = NACodecInfo::new(cname, NACodecTypeInfo::Audio(ahdr), extradata); - let res = strmgr.add_stream(NAStream::new(StreamType::Audio, 0, nainfo, 1, srate)); - if res.is_none() { return Err(MemoryError); } - - let astr = RMAudioStream::new(ainfo.ileave_info); - self.data_start = self.src.tell(); - self.data_end = if ainfo.total_bytes > 0 { self.src.tell() + (ainfo.total_bytes as u64) } else { 0 }; - self.blk_size = blk_size; - self.stream = Some(astr); - - Ok(()) - } - - fn get_frame(&mut self, strmgr: &mut StreamManager) -> DemuxerResult<NAPacket> { - if !self.queued_pkts.is_empty() { - let pkt = self.queued_pkts.pop().unwrap(); - return Ok(pkt); - } - if (self.data_end != 0) && (self.src.tell() >= self.data_end) { - return Err(DemuxerError::EOF); - } - let streamres = strmgr.get_stream_by_id(0); - let stream = streamres.unwrap(); - if let Some(ref mut astr) = self.stream { - loop { - let ret = astr.read_apackets(&mut self.queued_pkts, &mut self.src, stream.clone(), 0, false, self.blk_size); - if let Err(DemuxerError::TryAgain) = ret { - continue; - } - return ret; - } - } - Err(DemuxerError::NoSuchInput) - } - - #[allow(unused_variables)] - fn seek(&mut self, time: u64) -> DemuxerResult<()> { - Err(NotImplemented) - } -} - -impl<'a> RealAudioDemuxer<'a> { - fn new(io: &'a mut ByteReader<'a>) -> Self { - RealAudioDemuxer { - src: io, - data_start: 0, - data_end: 0, - blk_size: 0, - stream: None, - queued_pkts: Vec::new(), - } - } -} - -enum IVRRecord { - Invalid(u8), - StreamProperties(usize), - Packet { ts: u32, str: u32, flags: u32, len: usize, checksum: u32 }, - IntValue(Vec<u8>, u32), - BinaryData(Vec<u8>, Vec<u8>), - StringData(Vec<u8>, Vec<u8>), - HeaderEnd, - DataStart, - DataEnd, -} - -impl IVRRecord { - fn read_string(src: &mut ByteReader) -> DemuxerResult<Vec<u8>> { - let len = src.read_u32be()? as usize; - let mut val = Vec::with_capacity(len); - val.resize(len, 0); - src.read_buf(val.as_mut_slice())?; - Ok(val) - } - - fn read(src: &mut ByteReader) -> DemuxerResult<Self> { - let code = src.read_byte()?; - match code { - 1 => { - let val = src.read_u32be()? as usize; - Ok(IVRRecord::StreamProperties(val)) - }, - 2 => { - let ts = src.read_u32be()?; - let str = src.read_u16be()? as u32; - let flags = src.read_u32be()?; - let len = src.read_u32be()? as usize; - let chk = src.read_u32be()?; - Ok(IVRRecord::Packet { ts, str, flags, len, checksum: chk }) - }, - 3 => { - let name = Self::read_string(src)?; - let len = src.read_u32be()?; - validate!(len == 4); - let val = src.read_u32be()?; - Ok(IVRRecord::IntValue(name, val)) - }, - 4 => { - let name = Self::read_string(src)?; - let len = src.read_u32be()? as usize; - let mut val = Vec::with_capacity(len); - val.resize(len, 0); - src.read_buf(val.as_mut_slice())?; - Ok(IVRRecord::BinaryData(name, val)) - }, - 5 => { - let name = Self::read_string(src)?; - let val = Self::read_string(src)?; - Ok(IVRRecord::StringData(name, val)) - }, - 6 => Ok(IVRRecord::HeaderEnd), - 7 => { - src.read_skip(8)?; // always zero? - Ok(IVRRecord::DataEnd) - }, - 8 => { - src.read_skip(8)?; // always zero? - Ok(IVRRecord::DataStart) - }, - _ => Ok(IVRRecord::Invalid(code)), - } - } - fn is_data_start(&self) -> bool { - match *self { - IVRRecord::DataStart => true, - _ => false, - } - } -} - -impl fmt::Display for IVRRecord { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - match *self { - IVRRecord::Invalid(typ) => write!(f, "Invalid({:02X})", typ), - IVRRecord::StreamProperties(num) => - write!(f, "({} stream properties)", num), - IVRRecord::Packet { ts, str, flags, len, checksum } => - write!(f, "paket({}, {}, {:X}, {}, {})", ts, str, flags, len, checksum), - IVRRecord::IntValue(ref name, val) => - write!(f, "({} = {})", String::from_utf8_lossy(name), val), - IVRRecord::BinaryData(ref name, ref val) => - write!(f, "({} = {} bytes)", String::from_utf8_lossy(name), val.len()), - IVRRecord::StringData(ref name, ref val) => - write!(f, "({} = {})", String::from_utf8_lossy(name), String::from_utf8_lossy(val)), - IVRRecord::HeaderEnd => write!(f, "header end"), - IVRRecord::DataEnd => write!(f, "data end"), - IVRRecord::DataStart => write!(f, "data start"), - } - } -} - -struct RecordDemuxer { - start_pos: u64, - cur_pos: u64, - start_str: u32, - remap_ids: Vec<u32>, -} - -impl RecordDemuxer { - fn new(pos: u64, start_str: u32) -> Self { - RecordDemuxer { - start_pos: pos, - cur_pos: pos, - start_str: start_str, - remap_ids: Vec::new(), - } - } - fn parse_header(&mut self, src: &mut ByteReader, strmgr: &mut StreamManager, str_data: &mut CommonStreamData) -> DemuxerResult<()> { - src.seek(SeekFrom::Start(self.cur_pos))?; - let magic = src.read_u32be()?; - validate!(magic == mktag!(b".REC")); - let _smth = src.read_byte()?; - let num_entries = src.read_u32be()? as usize; - for _ in 0..num_entries { - let _rec = IVRRecord::read(src)?; -//println!(" header rec {}", _rec); - } - let mut has_seek_table = false; - let mut cur_str_no = 0; - loop { - let rec = IVRRecord::read(src)?; - match rec { - IVRRecord::HeaderEnd => { break; }, - IVRRecord::StreamProperties(num) => { - let stream_no = cur_str_no + self.start_str; - cur_str_no += 1; - let mut parsed = false; - let mut real_stream_no = 0; - for _ in 0..num { - let rec = IVRRecord::read(src)?; -//println!(" strm property {}", rec); - match rec { - IVRRecord::IntValue(ref name, val) => { - if name == b"StreamNumber\0" { - real_stream_no = val; - } - }, - IVRRecord::BinaryData(ref name, ref val) => { - if name == b"OpaqueData\0" { - validate!(!parsed); - let is_mlti = RMDemuxCommon::parse_stream_info(str_data, strmgr, stream_no, val)?; - if !is_mlti { - str_data.str_ids.push(stream_no); - } - parsed = true; - } - }, - IVRRecord::StringData(ref name, ref val) => { - if (name == b"SeekType\0") && (val != b"None\0") { - has_seek_table = true; - } - }, - _ => { return Err(DemuxerError::InvalidData); } - }; - } - if !parsed { - str_data.streams.push(RMStreamType::Unknown); - str_data.str_ids.push(stream_no); - } - self.remap_ids.push(real_stream_no); - }, - _ => {println!(" unexpected {}", rec); return Err(DemuxerError::InvalidData); } - }; - } - println!(" now @ {:X}", src.tell()); - let off0 = src.read_u32be()? as u64; - let _off1 = src.read_u32be()?; - let _off2 = src.read_u32be()?; - validate!(off0 + self.start_pos == src.tell()); - println!(" has seek tab: {}", has_seek_table); - if has_seek_table { - src.read_skip(4)?; - let data_off = src.read_u32be()? as u64; - println!(" new off {:X}", data_off); - let pos = src.tell(); - validate!(data_off + self.start_pos > pos); - src.read_skip((data_off + self.start_pos - pos) as usize)?; - let rec = IVRRecord::read(src)?; - validate!(rec.is_data_start()); - } else { - let ntype = src.peek_byte()?; - validate!((ntype == 2) || (ntype == 7)); // packet or data end, no start - } - - self.cur_pos = src.tell(); - - Ok(()) - } - fn get_packet(&mut self, src: &mut ByteReader, str_data: &mut CommonStreamData, strmgr: &StreamManager, queued_pkts: &mut Vec<NAPacket>, slice_buf: &mut Vec<u8>) -> DemuxerResult<NAPacket> { - src.seek(SeekFrom::Start(self.cur_pos))?; - loop { - let rec = IVRRecord::read(src)?; - match rec { - IVRRecord::Packet { ts, str, flags: _, len, checksum: _ } => { - let payload_size = len; - let sr = self.remap_ids.iter().position(|x| *x == str); - validate!(sr.is_some()); - let str_no = self.start_str + (sr.unwrap() as u32); - let stream_id = str_data.get_stream_id(str_no as u32, 0/*pkt_grp*/); - let sr = str_data.find_stream(stream_id); - if sr.is_none() { - src.read_skip(payload_size)?; - return Err(DemuxerError::InvalidData); - } - let str_id = sr.unwrap(); - - let streamres = strmgr.get_stream_by_id(stream_id); - if streamres.is_none() { - src.read_skip(payload_size)?; - continue; - } - let stream = streamres.unwrap(); - if strmgr.is_ignored_id(stream_id) { - src.read_skip(payload_size)?; - continue; - } - let keyframe = false; - let ret = RMDemuxCommon::parse_packet_payload(src, &mut str_data.streams[str_id], stream, slice_buf, queued_pkts, keyframe, ts, payload_size); - if let Err(DemuxerError::TryAgain) = ret { - continue; - } else { - self.cur_pos = src.tell(); - return ret; - } - }, - IVRRecord::DataEnd => return Err(DemuxerError::EOF), - _ => return Err(DemuxerError::InvalidData), - } - } - } -} - -struct RealIVRDemuxer<'a> { - src: &'a mut ByteReader<'a>, - recs: Vec<RecordDemuxer>, - cur_rec: usize, - queued_pkts: Vec<NAPacket>, - slice_buf: Vec<u8>, - str_data: CommonStreamData, -} - -impl<'a> DemuxCore<'a> for RealIVRDemuxer<'a> { - #[allow(unused_variables)] - fn open(&mut self, strmgr: &mut StreamManager) -> DemuxerResult<()> { - let magic = self.src.peek_u32be()?; - if magic == mktag!(b".REC") { - let mut rec = RecordDemuxer::new(0, 0); - rec.parse_header(&mut self.src, strmgr, &mut self.str_data)?; - self.recs.push(rec); - } else if magic == mktag!(b".R1M") { -println!("R1M kind"); - self.src.read_skip(4)?; // magic - self.src.read_skip(3)?; // always 0, 1, 1 ? - let _name = IVRRecord::read_string(&mut self.src)?; - self.src.read_skip(1)?; // always 0? - let len1 = self.src.read_u32be()? as u64; - let off1 = self.src.read_u64be()?; - let cpos = self.src.tell(); - validate!(off1 == len1 + cpos - 8); - self.src.read_skip((off1 - cpos) as usize)?; - loop { - let typ = self.src.read_byte()?; - println!(" at {:X} type {:02X}", self.src.tell(), typ); - match typ { - 1 => { - let len = self.src.read_u32be()?; - self.src.read_skip(len as usize)?; - }, - 2 => { - let len = self.src.read_u32be()? as u64; - let pos = self.src.tell(); - let num_streams = self.str_data.streams.len() as u32; - let mut rec = RecordDemuxer::new(pos + 12, num_streams); - rec.parse_header(&mut self.src, strmgr, &mut self.str_data)?; - self.recs.push(rec); - self.src.seek(SeekFrom::Start(pos + len))?; - }, - b'R' => { - let mut buf: [u8; 2] = [0; 2]; - self.src.peek_buf(&mut buf)?; - if (buf[0] == b'J') && (buf[1] == b'M') { // RJMx markers at the end of file - break; - } else { - return Err(DemuxerError::InvalidData); - } - }, - _ => { return Err(DemuxerError::InvalidData); }, - }; - } - } else { - return Err(DemuxerError::InvalidData); - } - - Ok(()) - } - - fn get_frame(&mut self, strmgr: &mut StreamManager) -> DemuxerResult<NAPacket> { - if !self.queued_pkts.is_empty() { - let pkt = self.queued_pkts.pop().unwrap(); - return Ok(pkt); - } - loop { - if self.cur_rec >= self.recs.len() { return Err(DemuxerError::EOF); } - let res = self.recs[self.cur_rec].get_packet(&mut self.src, &mut self.str_data, strmgr, &mut self.queued_pkts, &mut self.slice_buf); - if let Err(DemuxerError::EOF) = res { - self.cur_rec += 1; - } else { - return res; - } - } - } - - #[allow(unused_variables)] - fn seek(&mut self, time: u64) -> DemuxerResult<()> { - Err(NotImplemented) - } -} - -impl<'a> RealIVRDemuxer<'a> { - fn new(io: &'a mut ByteReader<'a>) -> Self { - RealIVRDemuxer { - src: io, - recs: Vec::new(), - cur_rec: 0, - queued_pkts: Vec::new(), - slice_buf: Vec::new(), - str_data: CommonStreamData::new(), - } - } -} - -static RM_VIDEO_CODEC_REGISTER: &'static [(&[u8;4], &str)] = &[ - (b"RV10", "realvideo1"), - (b"RV20", "realvideo2"), - (b"RVTR", "realvideo2"), - (b"RV30", "realvideo3"), - (b"RV40", "realvideo4"), - (b"RV60", "realvideo6"), - (b"CLV1", "clearvideo_rm"), -]; - -static RM_AUDIO_CODEC_REGISTER: &'static [(&[u8;4], &str)] = &[ - (b"lpcJ", "ra14.4"), - (b"28_8", "ra28.8"), - (b"cook", "cook"), - (b"dnet", "ac3"), - (b"sipr", "sipro"), - (b"atrc", "atrac3"), - (b"LSD:", "ralf"), - (b"raac", "aac"), - (b"racp", "aac"), -]; - -pub struct RealMediaDemuxerCreator { } - -impl DemuxerCreator for RealMediaDemuxerCreator { - fn new_demuxer<'a>(&self, br: &'a mut ByteReader<'a>) -> Box<DemuxCore<'a> + 'a> { - Box::new(RealMediaDemuxer::new(br)) - } - fn get_name(&self) -> &'static str { "realmedia" } -} - -pub struct RealAudioDemuxerCreator { } - -impl DemuxerCreator for RealAudioDemuxerCreator { - fn new_demuxer<'a>(&self, br: &'a mut ByteReader<'a>) -> Box<DemuxCore<'a> + 'a> { - Box::new(RealAudioDemuxer::new(br)) - } - fn get_name(&self) -> &'static str { "realaudio" } -} - -pub struct RealIVRDemuxerCreator { } - -impl DemuxerCreator for RealIVRDemuxerCreator { - fn new_demuxer<'a>(&self, br: &'a mut ByteReader<'a>) -> Box<DemuxCore<'a> + 'a> { - Box::new(RealIVRDemuxer::new(br)) - } - fn get_name(&self) -> &'static str { "real_ivr" } -} - -#[cfg(test)] -mod test { - use super::*; - use std::fs::File; - - #[test] - fn test_rm_demux() { - let mut file = - File::open("assets/RV/rv10_dnet_640x352_realvideo_encoder_4.0.rm").unwrap(); -// File::open("assets/RV/rv20_cook_640x352_realproducer_plus_8.51.rm").unwrap(); -// File::open("assets/RV/rv20_svt_atrc_640x352_realproducer_plus_8.51.rm").unwrap(); -// File::open("assets/RV/rv30_atrc_384x208_realproducer_plus_8.51.rm").unwrap(); -// File::open("assets/RV/rv30_chroma_drift.rm").unwrap(); -// File::open("assets/RV/rv30_weighted_mc.rm").unwrap(); -// File::open("assets/RV/rv40_weighted_mc.rmvb").unwrap(); -// File::open("assets/RV/rv40_weighted_mc_2.rmvb").unwrap(); -// File::open("assets/RV/clv1_sipr_384x208_realvideo_encoder_4.0.rm").unwrap(); -// File::open("assets/RV/luckynight.rmvb").unwrap(); -// File::open("assets/RV/rv40_ralf.rmvb").unwrap(); - let mut fr = FileReader::new_read(&mut file); - let mut br = ByteReader::new(&mut fr); - let mut dmx = RealMediaDemuxer::new(&mut br); - let mut sm = StreamManager::new(); - dmx.open(&mut sm).unwrap(); - - loop { - let pktres = dmx.get_frame(&mut sm); - if let Err(e) = pktres { - if e == DemuxerError::EOF { break; } - panic!("error"); - } - let pkt = pktres.unwrap(); - println!("Got {}", pkt); - } -//panic!("the end"); - } - #[test] - fn test_ra_demux() { - let mut file = -// File::open("assets/RV/welcome288.ra").unwrap(); - File::open("assets/RV/diemusik.ra").unwrap(); - let mut fr = FileReader::new_read(&mut file); - let mut br = ByteReader::new(&mut fr); - let mut dmx = RealAudioDemuxer::new(&mut br); - let mut sm = StreamManager::new(); - dmx.open(&mut sm).unwrap(); - - loop { - let pktres = dmx.get_frame(&mut sm); - if let Err(e) = pktres { - if e == DemuxerError::EOF { break; } - panic!("error"); - } - let pkt = pktres.unwrap(); - println!("Got {}", pkt); - } - } - #[test] - fn test_ivr_demux() { - let mut file = - File::open("assets/RV/Opener_rm_hi.ivr").unwrap(); -// File::open("assets/RV/SherwinWilliamsCommercial.ivr").unwrap(); - let mut fr = FileReader::new_read(&mut file); - let mut br = ByteReader::new(&mut fr); - let mut dmx = RealIVRDemuxer::new(&mut br); - let mut sm = StreamManager::new(); - dmx.open(&mut sm).unwrap(); - - loop { - let pktres = dmx.get_frame(&mut sm); - if let Err(e) = pktres { - if e == DemuxerError::EOF { break; } - panic!("error"); - } - let pkt = pktres.unwrap(); - println!("Got {}", pkt); - } - } -} diff --git a/src/detect.rs b/src/detect.rs deleted file mode 100644 index 0b60641..0000000 --- a/src/detect.rs +++ /dev/null @@ -1,268 +0,0 @@ -use std::io::SeekFrom; -use crate::io::byteio::ByteReader; - -#[derive(Debug,Clone,Copy,PartialEq)] -pub enum DetectionScore { - No, - ExtensionMatches, - MagicMatches, -} - -impl DetectionScore { - pub fn less(&self, other: DetectionScore) -> bool { - (*self as i32) < (other as i32) - } -} - -#[allow(dead_code)] -enum Arg { - Byte(u8), - U16BE(u16), - U16LE(u16), - U24BE(u32), - U24LE(u32), - U32BE(u32), - U32LE(u32), - U64BE(u64), - U64LE(u64), -} - -impl Arg { - fn val(&self) -> u64 { - match *self { - Arg::Byte(b) => { b as u64 } - Arg::U16BE(v) => { v as u64 } - Arg::U16LE(v) => { v as u64 } - Arg::U24BE(v) => { v as u64 } - Arg::U24LE(v) => { v as u64 } - Arg::U32BE(v) => { v as u64 } - Arg::U32LE(v) => { v as u64 } - Arg::U64BE(v) => { v } - Arg::U64LE(v) => { v } - } - } - fn read_val(&self, src: &mut ByteReader) -> Option<u64> { - match *self { - Arg::Byte(_) => { - let res = src.peek_byte(); - if let Err(_) = res { return None; } - Some(res.unwrap() as u64) - } - Arg::U16BE(_) => { - let res = src.peek_u16be(); - if let Err(_) = res { return None; } - Some(res.unwrap() as u64) - } - Arg::U16LE(_) => { - let res = src.peek_u16le(); - if let Err(_) = res { return None; } - Some(res.unwrap() as u64) - } - Arg::U24BE(_) => { - let res = src.peek_u24be(); - if let Err(_) = res { return None; } - Some(res.unwrap() as u64) - } - Arg::U24LE(_) => { - let res = src.peek_u24le(); - if let Err(_) = res { return None; } - Some(res.unwrap() as u64) - } - Arg::U32BE(_) => { - let res = src.peek_u32be(); - if let Err(_) = res { return None; } - Some(res.unwrap() as u64) - } - Arg::U32LE(_) => { - let res = src.peek_u32le(); - if let Err(_) = res { return None; } - Some(res.unwrap() as u64) - } - Arg::U64BE(_) => { - let res = src.peek_u64be(); - if let Err(_) = res { return None; } - Some(res.unwrap()) - } - Arg::U64LE(_) => { - let res = src.peek_u64le(); - if let Err(_) = res { return None; } - Some(res.unwrap()) - } - } - } - fn eq(&self, src: &mut ByteReader) -> bool { - let val = self.read_val(src); - if let None = val { false } - else { val.unwrap() == self.val() } - } - fn ge(&self, src: &mut ByteReader) -> bool { - let val = self.read_val(src); - if let None = val { false } - else { val.unwrap() >= self.val() } - } - fn gt(&self, src: &mut ByteReader) -> bool { - let val = self.read_val(src); - if let None = val { false } - else { val.unwrap() > self.val() } - } - fn le(&self, src: &mut ByteReader) -> bool { - let val = self.read_val(src); - if let None = val { false } - else { val.unwrap() <= self.val() } - } - fn lt(&self, src: &mut ByteReader) -> bool { - let val = self.read_val(src); - if let None = val { false } - else { val.unwrap() < self.val() } - } -} - -#[allow(dead_code)] -enum CC<'a> { - Or(&'a CC<'a>, &'a CC<'a>), - Eq(Arg), - Str(&'static [u8]), - In(Arg, Arg), - Lt(Arg), - Le(Arg), - Gt(Arg), - Ge(Arg), -} - -impl<'a> CC<'a> { - fn eval(&self, src: &mut ByteReader) -> bool { - match *self { - CC::Or (ref a, ref b) => { a.eval(src) || b.eval(src) }, - CC::Eq(ref arg) => { arg.eq(src) }, - CC::In(ref a, ref b) => { a.le(src) && b.ge(src) }, - CC::Lt(ref arg) => { arg.lt(src) }, - CC::Le(ref arg) => { arg.le(src) }, - CC::Gt(ref arg) => { arg.gt(src) }, - CC::Ge(ref arg) => { arg.ge(src) }, - CC::Str(str) => { - let mut val: Vec<u8> = Vec::with_capacity(str.len()); - val.resize(str.len(), 0); - let res = src.peek_buf(val.as_mut_slice()); - if let Err(_) = res { return false; } - val == str - } - } - } -} - -struct CheckItem<'a> { - offs: u32, - cond: &'a CC<'a>, -} - -#[allow(dead_code)] -struct DetectConditions<'a> { - demux_name: &'static str, - extensions: &'static str, - conditions: &'a [CheckItem<'a>], -} - -const DETECTORS: &[DetectConditions] = &[ - DetectConditions { - demux_name: "avi", - extensions: ".avi", - conditions: &[CheckItem{offs: 0, cond: &CC::Or(&CC::Str(b"RIFF"), &CC::Str(b"ON2 ")) }, - CheckItem{offs: 8, cond: &CC::Or(&CC::Or(&CC::Str(b"AVI LIST"), - &CC::Str(b"AVIXLIST")), - &CC::Str(b"ON2fLIST")) }, - ] - }, - DetectConditions { - demux_name: "gdv", - extensions: ".gdv", - conditions: &[CheckItem{offs: 0, cond: &CC::Eq(Arg::U32LE(0x29111994))}], - }, - DetectConditions { - demux_name: "realaudio", - extensions: ".ra,.ram", - conditions: &[CheckItem{offs: 0, cond: &CC::Str(b".ra\xFD")}], - }, - DetectConditions { - demux_name: "realmedia", - extensions: ".rm,.rmvb,.rma,.ra,.ram", - conditions: &[CheckItem{offs: 0, cond: &CC::Or(&CC::Str(b".RMF"), &CC::Str(b".RMP")) }, - CheckItem{offs: 4, cond: &CC::Ge(Arg::U32BE(10))}], - }, - DetectConditions { - demux_name: "real_ivr", - extensions: ".ivr", - conditions: &[CheckItem{offs: 0, cond: &CC::Or(&CC::Str(b".R1M"), &CC::Str(b".REC"))}], - }, -]; - -pub fn detect_format(name: &str, src: &mut ByteReader) -> Option<(&'static str, DetectionScore)> { - let mut result = None; - let lname = name.to_lowercase(); - for detector in DETECTORS { - let mut score = DetectionScore::No; - if name.len() > 0 { - for ext in detector.extensions.split(',') { - if lname.ends_with(ext) { - score = DetectionScore::ExtensionMatches; - break; - } - } - } - let mut passed = detector.conditions.len() > 0; - for ck in detector.conditions { - let ret = src.seek(SeekFrom::Start(ck.offs as u64)); - if let Err(_) = ret { - passed = false; - break; - } - if !ck.cond.eval(src) { - passed = false; - break; - } - } - if passed { - score = DetectionScore::MagicMatches; - } - if score == DetectionScore::MagicMatches { - return Some((detector.demux_name, score)); - } - if let None = result { - result = Some((detector.demux_name, score)); - } else { - let (_, oldsc) = result.unwrap(); - if oldsc.less(score) { - result = Some((detector.demux_name, score)); - } - } - } - result -} - -#[cfg(test)] -mod test { - use super::*; - use std::fs::File; - use crate::io::byteio::*; - - #[test] - fn test_avi_detect() { - let name = "assets/laser05.avi"; - let mut file = File::open(name).unwrap(); - let mut fr = FileReader::new_read(&mut file); - let mut br = ByteReader::new(&mut fr); - let (name, score) = detect_format(name, &mut br).unwrap(); - assert_eq!(name, "avi"); - assert_eq!(score, DetectionScore::MagicMatches); - } - - #[test] - fn test_gdv_detect() { - let name = "assets/intro1.gdv"; - let mut file = File::open(name).unwrap(); - let mut fr = FileReader::new_read(&mut file); - let mut br = ByteReader::new(&mut fr); - let (name, score) = detect_format(name, &mut br).unwrap(); - assert_eq!(name, "gdv"); - assert_eq!(score, DetectionScore::MagicMatches); - } -} diff --git a/src/dsp/fft.rs b/src/dsp/fft.rs deleted file mode 100644 index 98f8904..0000000 --- a/src/dsp/fft.rs +++ /dev/null @@ -1,475 +0,0 @@ -use std::f32::{self, consts}; -use std::ops::{Not, Neg, Add, AddAssign, Sub, SubAssign, Mul, MulAssign}; -use std::fmt; - -#[derive(Debug,Clone,Copy,PartialEq)] -pub struct FFTComplex { - pub re: f32, - pub im: f32, -} - -impl FFTComplex { - pub fn exp(val: f32) -> Self { - FFTComplex { re: val.cos(), im: val.sin() } - } - pub fn rotate(self) -> Self { - FFTComplex { re: -self.im, im: self.re } - } - pub fn scale(self, scale: f32) -> Self { - FFTComplex { re: self.re * scale, im: self.im * scale } - } -} - -impl Neg for FFTComplex { - type Output = FFTComplex; - fn neg(self) -> Self::Output { - FFTComplex { re: -self.re, im: -self.im } - } -} - -impl Not for FFTComplex { - type Output = FFTComplex; - fn not(self) -> Self::Output { - FFTComplex { re: self.re, im: -self.im } - } -} - -impl Add for FFTComplex { - type Output = FFTComplex; - fn add(self, other: Self) -> Self::Output { - FFTComplex { re: self.re + other.re, im: self.im + other.im } - } -} - -impl AddAssign for FFTComplex { - fn add_assign(&mut self, other: Self) { - self.re += other.re; - self.im += other.im; - } -} - -impl Sub for FFTComplex { - type Output = FFTComplex; - fn sub(self, other: Self) -> Self::Output { - FFTComplex { re: self.re - other.re, im: self.im - other.im } - } -} - -impl SubAssign for FFTComplex { - fn sub_assign(&mut self, other: Self) { - self.re -= other.re; - self.im -= other.im; - } -} - -impl Mul for FFTComplex { - type Output = FFTComplex; - fn mul(self, other: Self) -> Self::Output { - FFTComplex { re: self.re * other.re - self.im * other.im, - im: self.im * other.re + self.re * other.im } - } -} - -impl MulAssign for FFTComplex { - fn mul_assign(&mut self, other: Self) { - let re = self.re * other.re - self.im * other.im; - let im = self.im * other.re + self.re * other.im; - self.re = re; - self.im = im; - } -} - -impl fmt::Display for FFTComplex { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - write!(f, "({}, {})", self.re, self.im) - } -} - -pub const FFTC_ZERO: FFTComplex = FFTComplex { re: 0.0, im: 0.0 }; - -#[derive(Debug,Clone,Copy,PartialEq)] -pub enum FFTMode { - Matrix, - CooleyTukey, - SplitRadix, -} - -pub struct FFT { - table: Vec<FFTComplex>, - perms: Vec<usize>, - swaps: Vec<usize>, - bits: u32, - mode: FFTMode, -} - -impl FFT { - fn do_fft_inplace_ct(&mut self, data: &mut [FFTComplex], bits: u32, forward: bool) { - if bits == 0 { return; } - if bits == 1 { - let sum01 = data[0] + data[1]; - let dif01 = data[0] - data[1]; - data[0] = sum01; - data[1] = dif01; - return; - } - if bits == 2 { - let sum01 = data[0] + data[1]; - let dif01 = data[0] - data[1]; - let sum23 = data[2] + data[3]; - let dif23 = data[2] - data[3]; - if forward { - data[0] = sum01 + sum23; - data[1] = dif01 - dif23.rotate(); - data[2] = sum01 - sum23; - data[3] = dif01 + dif23.rotate(); - } else { - data[0] = sum01 + sum23; - data[1] = dif01 + dif23.rotate(); - data[2] = sum01 - sum23; - data[3] = dif01 - dif23.rotate(); - } - return; - } - - let hsize = (1 << (bits - 1)) as usize; - self.do_fft_inplace_ct(&mut data[0..hsize], bits - 1, forward); - self.do_fft_inplace_ct(&mut data[hsize..], bits - 1, forward); - let offs = hsize; - { - let e = data[0]; - let o = data[hsize]; - data[0] = e + o; - data[hsize] = e - o; - } - if forward { - for k in 1..hsize { - let e = data[k]; - let o = data[k + hsize] * self.table[offs + k]; - data[k] = e + o; - data[k + hsize] = e - o; - } - } else { - for k in 1..hsize { - let e = data[k]; - let o = data[k + hsize] * !self.table[offs + k]; - data[k] = e + o; - data[k + hsize] = e - o; - } - } - } - - fn do_fft_inplace_splitradix(&mut self, data: &mut [FFTComplex], bits: u32, forward: bool) { - if bits == 0 { return; } - if bits == 1 { - let sum01 = data[0] + data[1]; - let dif01 = data[0] - data[1]; - data[0] = sum01; - data[1] = dif01; - return; - } - if bits == 2 { - let sum01 = data[0] + data[2]; - let dif01 = data[0] - data[2]; - let sum23 = data[1] + data[3]; - let dif23 = data[1] - data[3]; - if forward { - data[0] = sum01 + sum23; - data[1] = dif01 - dif23.rotate(); - data[2] = sum01 - sum23; - data[3] = dif01 + dif23.rotate(); - } else { - data[0] = sum01 + sum23; - data[1] = dif01 + dif23.rotate(); - data[2] = sum01 - sum23; - data[3] = dif01 - dif23.rotate(); - } - return; - } - let qsize = (1 << (bits - 2)) as usize; - let hsize = (1 << (bits - 1)) as usize; - let q3size = qsize + hsize; - - self.do_fft_inplace_splitradix(&mut data[0 ..hsize], bits - 1, forward); - self.do_fft_inplace_splitradix(&mut data[hsize ..q3size], bits - 2, forward); - self.do_fft_inplace_splitradix(&mut data[q3size..], bits - 2, forward); - let off = hsize; - if forward { - { - let t3 = data[0 + hsize] + data[0 + q3size]; - let t4 = (data[0 + hsize] - data[0 + q3size]).rotate(); - let e1 = data[0]; - let e2 = data[0 + qsize]; - data[0] = e1 + t3; - data[0 + qsize] = e2 - t4; - data[0 + hsize] = e1 - t3; - data[0 + q3size] = e2 + t4; - } - for k in 1..qsize { - let t1 = self.table[off + k * 2 + 0] * data[k + hsize]; - let t2 = self.table[off + k * 2 + 1] * data[k + q3size]; - let t3 = t1 + t2; - let t4 = (t1 - t2).rotate(); - let e1 = data[k]; - let e2 = data[k + qsize]; - data[k] = e1 + t3; - data[k + qsize] = e2 - t4; - data[k + hsize] = e1 - t3; - data[k + qsize * 3] = e2 + t4; - } - } else { - { - let t3 = data[0 + hsize] + data[0 + q3size]; - let t4 = (data[0 + hsize] - data[0 + q3size]).rotate(); - let e1 = data[0]; - let e2 = data[0 + qsize]; - data[0] = e1 + t3; - data[0 + qsize] = e2 + t4; - data[0 + hsize] = e1 - t3; - data[0 + q3size] = e2 - t4; - } - for k in 1..qsize { - let t1 = !self.table[off + k * 2 + 0] * data[k + hsize]; - let t2 = !self.table[off + k * 2 + 1] * data[k + q3size]; - let t3 = t1 + t2; - let t4 = (t1 - t2).rotate(); - let e1 = data[k]; - let e2 = data[k + qsize]; - data[k] = e1 + t3; - data[k + qsize] = e2 + t4; - data[k + hsize] = e1 - t3; - data[k + qsize * 3] = e2 - t4; - } - } - } - - pub fn do_fft(&mut self, src: &[FFTComplex], dst: &mut [FFTComplex], forward: bool) { - match self.mode { - FFTMode::Matrix => { - let base = if forward { -consts::PI * 2.0 / (src.len() as f32) } - else { consts::PI * 2.0 / (src.len() as f32) }; - for k in 0..src.len() { - let mut sum = FFTC_ZERO; - for n in 0..src.len() { - let w = FFTComplex::exp(base * ((n * k) as f32)); - sum += src[n] * w; - } - dst[k] = sum; - } - }, - FFTMode::CooleyTukey => { - let bits = self.bits; - for k in 0..src.len() { dst[k] = src[self.perms[k]]; } - self.do_fft_inplace_ct(dst, bits, forward); - }, - FFTMode::SplitRadix => { - let bits = self.bits; - for k in 0..src.len() { dst[k] = src[self.perms[k]]; } - self.do_fft_inplace_splitradix(dst, bits, forward); - }, - }; - } - - pub fn do_fft_inplace(&mut self, data: &mut [FFTComplex], forward: bool) { - for idx in 0..self.swaps.len() { - let nidx = self.swaps[idx]; - if idx != nidx { - let t = data[nidx]; - data[nidx] = data[idx]; - data[idx] = t; - } - } - match self.mode { - FFTMode::Matrix => { - let size = (1 << self.bits) as usize; - let base = if forward { -consts::PI * 2.0 / (size as f32) } - else { consts::PI * 2.0 / (size as f32) }; - let mut res: Vec<FFTComplex> = Vec::with_capacity(size); - for k in 0..size { - let mut sum = FFTC_ZERO; - for n in 0..size { - let w = FFTComplex::exp(base * ((n * k) as f32)); - sum += data[n] * w; - } - res.push(sum); - } - for k in 0..size { - data[k] = res[k]; - } - }, - FFTMode::CooleyTukey => { - let bits = self.bits; - self.do_fft_inplace_ct(data, bits, forward); - }, - FFTMode::SplitRadix => { - let bits = self.bits; - self.do_fft_inplace_splitradix(data, bits, forward); - }, - }; - } -} - -pub struct FFTBuilder { -} - -fn reverse_bits(inval: u32) -> u32 { - const REV_TAB: [u8; 16] = [ - 0b0000, 0b1000, 0b0100, 0b1100, 0b0010, 0b1010, 0b0110, 0b1110, - 0b0001, 0b1001, 0b0101, 0b1101, 0b0011, 0b1011, 0b0111, 0b1111, - ]; - - let mut ret = 0; - let mut val = inval; - for _ in 0..8 { - ret = (ret << 4) | (REV_TAB[(val & 0xF) as usize] as u32); - val = val >> 4; - } - ret -} - -fn swp_idx(idx: usize, bits: u32) -> usize { - let s = reverse_bits(idx as u32) as usize; - s >> (32 - bits) -} - -fn gen_sr_perms(swaps: &mut [usize], size: usize) { - if size <= 4 { return; } - let mut evec: Vec<usize> = Vec::with_capacity(size / 2); - let mut ovec1: Vec<usize> = Vec::with_capacity(size / 4); - let mut ovec2: Vec<usize> = Vec::with_capacity(size / 4); - for k in 0..size/4 { - evec.push (swaps[k * 4 + 0]); - ovec1.push(swaps[k * 4 + 1]); - evec.push (swaps[k * 4 + 2]); - ovec2.push(swaps[k * 4 + 3]); - } - for k in 0..size/2 { swaps[k] = evec[k]; } - for k in 0..size/4 { swaps[k + size/2] = ovec1[k]; } - for k in 0..size/4 { swaps[k + 3*size/4] = ovec2[k]; } - gen_sr_perms(&mut swaps[0..size/2], size/2); - gen_sr_perms(&mut swaps[size/2..3*size/4], size/4); - gen_sr_perms(&mut swaps[3*size/4..], size/4); -} - -fn gen_swaps_for_perm(swaps: &mut Vec<usize>, perms: &Vec<usize>) { - let mut idx_arr: Vec<usize> = Vec::with_capacity(perms.len()); - for i in 0..perms.len() { idx_arr.push(i); } - let mut run_size = 0; - let mut run_pos = 0; - for idx in 0..perms.len() { - if perms[idx] == idx_arr[idx] { - if run_size == 0 { run_pos = idx; } - run_size += 1; - } else { - for i in 0..run_size { - swaps.push(run_pos + i); - } - run_size = 0; - let mut spos = idx + 1; - while idx_arr[spos] != perms[idx] { spos += 1; } - idx_arr[spos] = idx_arr[idx]; - idx_arr[idx] = perms[idx]; - swaps.push(spos); - } - } -} - -impl FFTBuilder { - pub fn new_fft(mode: FFTMode, size: usize) -> FFT { - let mut swaps: Vec<usize>; - let mut perms: Vec<usize>; - let mut table: Vec<FFTComplex>; - let bits = 31 - (size as u32).leading_zeros(); - match mode { - FFTMode::Matrix => { - swaps = Vec::new(); - perms = Vec::new(); - table = Vec::new(); - }, - FFTMode::CooleyTukey => { - perms = Vec::with_capacity(size); - for i in 0..size { - perms.push(swp_idx(i, bits)); - } - swaps = Vec::with_capacity(size); - table = Vec::with_capacity(size); - for _ in 0..4 { table.push(FFTC_ZERO); } - for b in 3..(bits+1) { - let hsize = (1 << (b - 1)) as usize; - let base = -consts::PI / (hsize as f32); - for k in 0..hsize { - table.push(FFTComplex::exp(base * (k as f32))); - } - } - }, - FFTMode::SplitRadix => { - perms = Vec::with_capacity(size); - for i in 0..size { - perms.push(i); - } - gen_sr_perms(perms.as_mut_slice(), 1 << bits); - swaps = Vec::with_capacity(size); - table = Vec::with_capacity(size); - for _ in 0..4 { table.push(FFTC_ZERO); } - for b in 3..(bits+1) { - let qsize = (1 << (b - 2)) as usize; - let base = -consts::PI / ((qsize * 2) as f32); - for k in 0..qsize { - table.push(FFTComplex::exp(base * ((k * 1) as f32))); - table.push(FFTComplex::exp(base * ((k * 3) as f32))); - } - } - }, - }; - gen_swaps_for_perm(&mut swaps, &perms); - FFT { mode: mode, swaps: swaps, perms: perms, bits: bits, table: table } - } -} - - -#[cfg(test)] -mod test { - use super::*; - - #[test] - fn test_fft() { - let mut fin: [FFTComplex; 128] = [FFTC_ZERO; 128]; - let mut fout1: [FFTComplex; 128] = [FFTC_ZERO; 128]; - let mut fout2: [FFTComplex; 128] = [FFTC_ZERO; 128]; - let mut fout3: [FFTComplex; 128] = [FFTC_ZERO; 128]; - let mut fft1 = FFTBuilder::new_fft(FFTMode::Matrix, fin.len()); - let mut fft2 = FFTBuilder::new_fft(FFTMode::CooleyTukey, fin.len()); - let mut fft3 = FFTBuilder::new_fft(FFTMode::SplitRadix, fin.len()); - let mut seed: u32 = 42; - for i in 0..fin.len() { - seed = seed.wrapping_mul(1664525).wrapping_add(1013904223); - let val = (seed >> 16) as i16; - fin[i].re = (val as f32) / 256.0; - seed = seed.wrapping_mul(1664525).wrapping_add(1013904223); - let val = (seed >> 16) as i16; - fin[i].im = (val as f32) / 256.0; - } - fft1.do_fft(&fin, &mut fout1, true); - fft2.do_fft(&fin, &mut fout2, true); - fft3.do_fft(&fin, &mut fout3, true); - - for i in 0..fin.len() { - assert!((fout1[i].re - fout2[i].re).abs() < 1.0); - assert!((fout1[i].im - fout2[i].im).abs() < 1.0); - assert!((fout1[i].re - fout3[i].re).abs() < 1.0); - assert!((fout1[i].im - fout3[i].im).abs() < 1.0); - } - fft1.do_fft_inplace(&mut fout1, false); - fft2.do_fft_inplace(&mut fout2, false); - fft3.do_fft_inplace(&mut fout3, false); - - let sc = 1.0 / (fin.len() as f32); - for i in 0..fin.len() { - assert!((fin[i].re - fout1[i].re * sc).abs() < 1.0); - assert!((fin[i].im - fout1[i].im * sc).abs() < 1.0); - assert!((fout1[i].re - fout2[i].re).abs() < 1.0); - assert!((fout1[i].im - fout2[i].im).abs() < 1.0); - assert!((fout1[i].re - fout3[i].re).abs() < 1.0); - assert!((fout1[i].im - fout3[i].im).abs() < 1.0); - } - } -} diff --git a/src/dsp/mdct.rs b/src/dsp/mdct.rs deleted file mode 100644 index 540ae45..0000000 --- a/src/dsp/mdct.rs +++ /dev/null @@ -1,57 +0,0 @@ -use std::f32::consts; -use super::fft::*; - -pub struct IMDCT { - twiddle: Vec<FFTComplex>, - fft: FFT, - size: usize, - z: Vec<FFTComplex>, -} - -/* -fn imdct(src: &[f32], dst: &mut [f32], length: usize) { - for n in 0..length*2 { - dst[n] = 0.0; - for k in 0..length { - dst[n] += src[k] * (consts::PI / (length as f32) * ((n as f32) + 0.5 + ((length/2) as f32)) * ((k as f32) + 0.5)).cos(); - } - } -}*/ - -impl IMDCT { - pub fn new(mode: FFTMode, size: usize, scaledown: bool) -> Self { - let mut twiddle: Vec<FFTComplex> = Vec::with_capacity(size / 4); - let factor = 2.0 * consts::PI / ((8 * size) as f32); - let scale = if scaledown { (1.0 / (size as f32)).sqrt() } else { 1.0 }; - for k in 0..size/4 { - twiddle.push(FFTComplex::exp(factor * ((8 * k + 1) as f32)).scale(scale)); - } - let fft = FFTBuilder::new_fft(mode, size/4); - let mut z: Vec<FFTComplex> = Vec::with_capacity(size / 2); - z.resize(size / 2, FFTC_ZERO); - IMDCT { twiddle, fft, size, z } - } - pub fn imdct(&mut self, src: &[f32], dst: &mut [f32]) { - let size2 = self.size / 2; - let size4 = self.size / 4; - let size8 = self.size / 8; - for k in 0..size4 { - let c = FFTComplex { re: src[size2 - 2 * k - 1], im: src[ 2 * k] }; - self.z[k] = c * self.twiddle[k]; - } - self.fft.do_fft_inplace(&mut self.z, false); - for k in 0..size4 { - self.z[k] *= self.twiddle[k]; - } - for n in 0..size8 { - dst[ 2 * n] = -self.z[size8 + n] .im; - dst[ 2 * n + 1] = self.z[size8 - n - 1].re; - dst[ size4 + 2 * n] = -self.z[ n] .re; - dst[ size4 + 2 * n + 1] = self.z[size4 - n - 1].im; - dst[ size2 + 2 * n] = -self.z[size8 + n] .re; - dst[ size2 + 2 * n + 1] = self.z[size8 - n - 1].im; - dst[3 * size4 + 2 * n] = self.z[ n] .im; - dst[3 * size4 + 2 * n + 1] = -self.z[size4 - n - 1].re; - } - } -} diff --git a/src/dsp/mod.rs b/src/dsp/mod.rs deleted file mode 100644 index 439ad98..0000000 --- a/src/dsp/mod.rs +++ /dev/null @@ -1,6 +0,0 @@ -#[cfg(feature="fft")] -pub mod fft; -#[cfg(feature="mdct")] -pub mod mdct; -#[cfg(feature="dsp_window")] -pub mod window; diff --git a/src/dsp/window.rs b/src/dsp/window.rs deleted file mode 100644 index 42b6b6d..0000000 --- a/src/dsp/window.rs +++ /dev/null @@ -1,52 +0,0 @@ -use std::f32::consts; - -#[derive(Debug,Clone,Copy,PartialEq)] -pub enum WindowType { - Square, - Sine, - KaiserBessel(f32), -} - -pub fn generate_window(mode: WindowType, scale: f32, size: usize, half: bool, dst: &mut [f32]) { - match mode { - WindowType::Square => { - for n in 0..size { dst[n] = scale; } - }, - WindowType::Sine => { - let param; - if half { - param = consts::PI / ((2 * size) as f32); - } else { - param = consts::PI / (size as f32); - } - for n in 0..size { - dst[n] = (((n as f32) + 0.5) * param).sin() * scale; - } - }, - WindowType::KaiserBessel(alpha) => { - let dlen = if half { size as f32 } else { (size as f32) * 0.5 }; - let alpha2 = ((alpha * consts::PI / dlen) * (alpha * consts::PI / dlen)) as f64; - - let mut kb: Vec<f64> = Vec::with_capacity(size); - let mut sum = 0.0; - for n in 0..size { - let b = bessel_i0(((n * (size - n)) as f64) * alpha2); - sum += b; - kb.push(sum); - } - sum += 1.0; - for n in 0..size { - dst[n] = (kb[n] / sum).sqrt() as f32; - } - }, - }; -} - -fn bessel_i0(inval: f64) -> f64 { - let mut val: f64 = 1.0; - for n in (1..64).rev() { - val *= inval / ((n * n) as f64); - val += 1.0; - } - val -} diff --git a/src/formats.rs b/src/formats.rs deleted file mode 100644 index 53b28dc..0000000 --- a/src/formats.rs +++ /dev/null @@ -1,511 +0,0 @@ -use std::str::FromStr; -use std::string::*; -use std::fmt; - -#[derive(Debug,Copy,Clone,PartialEq)] -pub struct NASoniton { - bits: u8, - be: bool, - packed: bool, - planar: bool, - float: bool, - signed: bool, -} - -pub const SONITON_FLAG_BE :u32 = 0x01; -pub const SONITON_FLAG_PACKED :u32 = 0x02; -pub const SONITON_FLAG_PLANAR :u32 = 0x04; -pub const SONITON_FLAG_FLOAT :u32 = 0x08; -pub const SONITON_FLAG_SIGNED :u32 = 0x10; - -pub const SND_U8_FORMAT: NASoniton = NASoniton { bits: 8, be: false, packed: false, planar: false, float: false, signed: false }; -pub const SND_S16_FORMAT: NASoniton = NASoniton { bits: 16, be: false, packed: false, planar: false, float: false, signed: true }; -pub const SND_S16P_FORMAT: NASoniton = NASoniton { bits: 16, be: false, packed: false, planar: true, float: false, signed: true }; -pub const SND_F32P_FORMAT: NASoniton = NASoniton { bits: 32, be: false, packed: false, planar: true, float: true, signed: true }; - -impl NASoniton { - pub fn new(bits: u8, flags: u32) -> Self { - let is_be = (flags & SONITON_FLAG_BE) != 0; - let is_pk = (flags & SONITON_FLAG_PACKED) != 0; - let is_pl = (flags & SONITON_FLAG_PLANAR) != 0; - let is_fl = (flags & SONITON_FLAG_FLOAT) != 0; - let is_sg = (flags & SONITON_FLAG_SIGNED) != 0; - NASoniton { bits: bits, be: is_be, packed: is_pk, planar: is_pl, float: is_fl, signed: is_sg } - } - - pub fn get_bits(&self) -> u8 { self.bits } - pub fn is_be(&self) -> bool { self.be } - pub fn is_packed(&self) -> bool { self.packed } - pub fn is_planar(&self) -> bool { self.planar } - pub fn is_float(&self) -> bool { self.float } - pub fn is_signed(&self) -> bool { self.signed } - - pub fn get_audio_size(&self, length: u64) -> usize { - if self.packed { - ((length * (self.bits as u64) + 7) >> 3) as usize - } else { - (length * (((self.bits + 7) >> 3) as u64)) as usize - } - } -} - -impl fmt::Display for NASoniton { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - let fmt = if self.float { "float" } else if self.signed { "int" } else { "uint" }; - let end = if self.be { "BE" } else { "LE" }; - write!(f, "({} bps, {} planar: {} packed: {} {})", self.bits, end, self.packed, self.planar, fmt) - } -} - -#[derive(Debug,Clone,Copy,PartialEq)] -pub enum NAChannelType { - C, L, R, Cs, Ls, Rs, Lss, Rss, LFE, Lc, Rc, Lh, Rh, Ch, LFE2, Lw, Rw, Ov, Lhs, Rhs, Chs, Ll, Rl, Cl, Lt, Rt, Lo, Ro -} - -impl NAChannelType { - pub fn is_center(&self) -> bool { - match *self { - NAChannelType::C => true, NAChannelType::Ch => true, - NAChannelType::Cl => true, NAChannelType::Ov => true, - NAChannelType::LFE => true, NAChannelType::LFE2 => true, - NAChannelType::Cs => true, NAChannelType::Chs => true, - _ => false, - } - } - pub fn is_left(&self) -> bool { - match *self { - NAChannelType::L => true, NAChannelType::Ls => true, - NAChannelType::Lss => true, NAChannelType::Lc => true, - NAChannelType::Lh => true, NAChannelType::Lw => true, - NAChannelType::Lhs => true, NAChannelType::Ll => true, - NAChannelType::Lt => true, NAChannelType::Lo => true, - _ => false, - } - } - pub fn is_right(&self) -> bool { - match *self { - NAChannelType::R => true, NAChannelType::Rs => true, - NAChannelType::Rss => true, NAChannelType::Rc => true, - NAChannelType::Rh => true, NAChannelType::Rw => true, - NAChannelType::Rhs => true, NAChannelType::Rl => true, - NAChannelType::Rt => true, NAChannelType::Ro => true, - _ => false, - } - } -} - -#[derive(Clone,Copy,Debug,PartialEq)] -pub struct ChannelParseError {} - -impl FromStr for NAChannelType { - type Err = ChannelParseError; - - fn from_str(s: &str) -> Result<Self, Self::Err> { - match s { - "C" => Ok(NAChannelType::C), - "L" => Ok(NAChannelType::L), - "R" => Ok(NAChannelType::R), - "Cs" => Ok(NAChannelType::Cs), - "Ls" => Ok(NAChannelType::Ls), - "Rs" => Ok(NAChannelType::Rs), - "Lss" => Ok(NAChannelType::Lss), - "Rss" => Ok(NAChannelType::Rss), - "LFE" => Ok(NAChannelType::LFE), - "Lc" => Ok(NAChannelType::Lc), - "Rc" => Ok(NAChannelType::Rc), - "Lh" => Ok(NAChannelType::Lh), - "Rh" => Ok(NAChannelType::Rh), - "Ch" => Ok(NAChannelType::Ch), - "LFE2" => Ok(NAChannelType::LFE2), - "Lw" => Ok(NAChannelType::Lw), - "Rw" => Ok(NAChannelType::Rw), - "Ov" => Ok(NAChannelType::Ov), - "Lhs" => Ok(NAChannelType::Lhs), - "Rhs" => Ok(NAChannelType::Rhs), - "Chs" => Ok(NAChannelType::Chs), - "Ll" => Ok(NAChannelType::Ll), - "Rl" => Ok(NAChannelType::Rl), - "Cl" => Ok(NAChannelType::Cl), - "Lt" => Ok(NAChannelType::Lt), - "Rt" => Ok(NAChannelType::Rt), - "Lo" => Ok(NAChannelType::Lo), - "Ro" => Ok(NAChannelType::Ro), - _ => Err(ChannelParseError{}), - } - } -} - -impl fmt::Display for NAChannelType { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - let name = match *self { - NAChannelType::C => "C".to_string(), - NAChannelType::L => "L".to_string(), - NAChannelType::R => "R".to_string(), - NAChannelType::Cs => "Cs".to_string(), - NAChannelType::Ls => "Ls".to_string(), - NAChannelType::Rs => "Rs".to_string(), - NAChannelType::Lss => "Lss".to_string(), - NAChannelType::Rss => "Rss".to_string(), - NAChannelType::LFE => "LFE".to_string(), - NAChannelType::Lc => "Lc".to_string(), - NAChannelType::Rc => "Rc".to_string(), - NAChannelType::Lh => "Lh".to_string(), - NAChannelType::Rh => "Rh".to_string(), - NAChannelType::Ch => "Ch".to_string(), - NAChannelType::LFE2 => "LFE2".to_string(), - NAChannelType::Lw => "Lw".to_string(), - NAChannelType::Rw => "Rw".to_string(), - NAChannelType::Ov => "Ov".to_string(), - NAChannelType::Lhs => "Lhs".to_string(), - NAChannelType::Rhs => "Rhs".to_string(), - NAChannelType::Chs => "Chs".to_string(), - NAChannelType::Ll => "Ll".to_string(), - NAChannelType::Rl => "Rl".to_string(), - NAChannelType::Cl => "Cl".to_string(), - NAChannelType::Lt => "Lt".to_string(), - NAChannelType::Rt => "Rt".to_string(), - NAChannelType::Lo => "Lo".to_string(), - NAChannelType::Ro => "Ro".to_string(), - }; - write!(f, "{}", name) - } -} - -#[derive(Clone)] -pub struct NAChannelMap { - ids: Vec<NAChannelType>, -} - -const MS_CHANNEL_MAP: [NAChannelType; 11] = [ - NAChannelType::L, - NAChannelType::R, - NAChannelType::C, - NAChannelType::LFE, - NAChannelType::Ls, - NAChannelType::Rs, - NAChannelType::Lss, - NAChannelType::Rss, - NAChannelType::Cs, - NAChannelType::Lc, - NAChannelType::Rc, -]; - -impl NAChannelMap { - pub fn new() -> Self { NAChannelMap { ids: Vec::new() } } - pub fn add_channel(&mut self, ch: NAChannelType) { - self.ids.push(ch); - } - pub fn add_channels(&mut self, chs: &[NAChannelType]) { - for i in 0..chs.len() { - self.ids.push(chs[i]); - } - } - pub fn num_channels(&self) -> usize { - self.ids.len() - } - pub fn get_channel(&self, idx: usize) -> NAChannelType { - self.ids[idx] - } - pub fn find_channel_id(&self, t: NAChannelType) -> Option<u8> { - for i in 0..self.ids.len() { - if self.ids[i] as i32 == t as i32 { return Some(i as u8); } - } - None - } - pub fn from_ms_mapping(chmap: u32) -> Self { - let mut cm = NAChannelMap::new(); - for i in 0..MS_CHANNEL_MAP.len() { - if ((chmap >> i) & 1) != 0 { - cm.add_channel(MS_CHANNEL_MAP[i]); - } - } - cm - } -} - -impl fmt::Display for NAChannelMap { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - let mut map = String::new(); - for el in self.ids.iter() { - if map.len() > 0 { map.push(','); } - map.push_str(&*el.to_string()); - } - write!(f, "{}", map) - } -} - -impl FromStr for NAChannelMap { - type Err = ChannelParseError; - - fn from_str(s: &str) -> Result<Self, Self::Err> { - let mut chm = NAChannelMap::new(); - for tok in s.split(',') { - chm.add_channel(NAChannelType::from_str(tok)?); - } - Ok(chm) - } -} - -#[derive(Debug,Clone,Copy,PartialEq)] -pub enum RGBSubmodel { - RGB, - SRGB, -} - -impl fmt::Display for RGBSubmodel { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - let name = match *self { - RGBSubmodel::RGB => "RGB".to_string(), - RGBSubmodel::SRGB => "sRGB".to_string(), - }; - write!(f, "{}", name) - } -} - -#[derive(Debug,Clone,Copy,PartialEq)] -pub enum YUVSubmodel { - YCbCr, - YIQ, - YUVJ, -} - -impl fmt::Display for YUVSubmodel { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - let name = match *self { - YUVSubmodel::YCbCr => "YCbCr".to_string(), - YUVSubmodel::YIQ => "YIQ".to_string(), - YUVSubmodel::YUVJ => "YUVJ".to_string(), - }; - write!(f, "{}", name) - } -} - -#[derive(Debug, Clone,Copy,PartialEq)] -pub enum ColorModel { - RGB(RGBSubmodel), - YUV(YUVSubmodel), - CMYK, - HSV, - LAB, - XYZ, -} - -impl ColorModel { - pub fn get_default_components(&self) -> usize { - match *self { - ColorModel::CMYK => 4, - _ => 3, - } - } -} - -impl fmt::Display for ColorModel { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - let name = match *self { - ColorModel::RGB(fmt) => format!("RGB({})", fmt).to_string(), - ColorModel::YUV(fmt) => format!("YUV({})", fmt).to_string(), - ColorModel::CMYK => "CMYK".to_string(), - ColorModel::HSV => "HSV".to_string(), - ColorModel::LAB => "LAB".to_string(), - ColorModel::XYZ => "XYZ".to_string(), - }; - write!(f, "{}", name) - } -} - -#[derive(Clone,Copy,PartialEq)] -pub struct NAPixelChromaton { - h_ss: u8, - v_ss: u8, - packed: bool, - depth: u8, - shift: u8, - comp_offs: u8, - next_elem: u8, -} - -pub const FORMATON_FLAG_BE :u32 = 0x01; -pub const FORMATON_FLAG_ALPHA :u32 = 0x02; -pub const FORMATON_FLAG_PALETTE :u32 = 0x04; - - -#[derive(Clone,Copy,PartialEq)] -pub struct NAPixelFormaton { - model: ColorModel, - components: u8, - comp_info: [Option<NAPixelChromaton>; 5], - elem_size: u8, - be: bool, - alpha: bool, - palette: bool, -} - -macro_rules! chromaton { - ($hs: expr, $vs: expr, $pck: expr, $d: expr, $sh: expr, $co: expr, $ne: expr) => ({ - Some(NAPixelChromaton{ h_ss: $hs, v_ss: $vs, packed: $pck, depth: $d, shift: $sh, comp_offs: $co, next_elem: $ne }) - }); - (yuv8; $hs: expr, $vs: expr, $co: expr) => ({ - Some(NAPixelChromaton{ h_ss: $hs, v_ss: $vs, packed: false, depth: 8, shift: 0, comp_offs: $co, next_elem: 1 }) - }); - (packrgb; $d: expr, $s: expr, $co: expr, $ne: expr) => ({ - Some(NAPixelChromaton{ h_ss: 0, v_ss: 0, packed: true, depth: $d, shift: $s, comp_offs: $co, next_elem: $ne }) - }); - (pal8; $co: expr) => ({ - Some(NAPixelChromaton{ h_ss: 0, v_ss: 0, packed: true, depth: 8, shift: 0, comp_offs: $co, next_elem: 3 }) - }); -} - -pub const YUV420_FORMAT: NAPixelFormaton = NAPixelFormaton { model: ColorModel::YUV(YUVSubmodel::YUVJ), components: 3, - comp_info: [ - chromaton!(0, 0, false, 8, 0, 0, 1), - chromaton!(yuv8; 1, 1, 1), - chromaton!(yuv8; 1, 1, 2), - None, None], - elem_size: 0, be: false, alpha: false, palette: false }; - -pub const YUV410_FORMAT: NAPixelFormaton = NAPixelFormaton { model: ColorModel::YUV(YUVSubmodel::YUVJ), components: 3, - comp_info: [ - chromaton!(0, 0, false, 8, 0, 0, 1), - chromaton!(yuv8; 2, 2, 1), - chromaton!(yuv8; 2, 2, 2), - None, None], - elem_size: 0, be: false, alpha: false, palette: false }; -pub const YUVA410_FORMAT: NAPixelFormaton = NAPixelFormaton { model: ColorModel::YUV(YUVSubmodel::YUVJ), components: 4, - comp_info: [ - chromaton!(0, 0, false, 8, 0, 0, 1), - chromaton!(yuv8; 2, 2, 1), - chromaton!(yuv8; 2, 2, 2), - chromaton!(0, 0, false, 8, 0, 3, 1), - None], - elem_size: 0, be: false, alpha: true, palette: false }; - -pub const PAL8_FORMAT: NAPixelFormaton = NAPixelFormaton { model: ColorModel::RGB(RGBSubmodel::RGB), components: 3, - comp_info: [ - chromaton!(pal8; 0), - chromaton!(pal8; 1), - chromaton!(pal8; 2), - None, None], - elem_size: 3, be: false, alpha: false, palette: true }; - -pub const RGB565_FORMAT: NAPixelFormaton = NAPixelFormaton { model: ColorModel::RGB(RGBSubmodel::RGB), components: 3, - comp_info: [ - chromaton!(packrgb; 5, 11, 0, 2), - chromaton!(packrgb; 6, 5, 0, 2), - chromaton!(packrgb; 5, 0, 0, 2), - None, None], - elem_size: 2, be: false, alpha: false, palette: false }; - -pub const RGB24_FORMAT: NAPixelFormaton = NAPixelFormaton { model: ColorModel::RGB(RGBSubmodel::RGB), components: 3, - comp_info: [ - chromaton!(packrgb; 8, 0, 2, 3), - chromaton!(packrgb; 8, 0, 1, 3), - chromaton!(packrgb; 8, 0, 0, 3), - None, None], - elem_size: 3, be: false, alpha: false, palette: false }; - -impl NAPixelChromaton { - pub fn get_subsampling(&self) -> (u8, u8) { (self.h_ss, self.v_ss) } - pub fn is_packed(&self) -> bool { self.packed } - pub fn get_depth(&self) -> u8 { self.depth } - pub fn get_shift(&self) -> u8 { self.shift } - pub fn get_offset(&self) -> u8 { self.comp_offs } - pub fn get_step(&self) -> u8 { self.next_elem } - - pub fn get_width(&self, width: usize) -> usize { - (width + ((1 << self.h_ss) - 1)) >> self.h_ss - } - pub fn get_height(&self, height: usize) -> usize { - (height + ((1 << self.v_ss) - 1)) >> self.v_ss - } - pub fn get_linesize(&self, width: usize) -> usize { - let d = self.depth as usize; - if self.packed { - (self.get_width(width) * d + d - 1) >> 3 - } else { - self.get_width(width) - } - } - pub fn get_data_size(&self, width: usize, height: usize) -> usize { - let nh = (height + ((1 << self.v_ss) - 1)) >> self.v_ss; - self.get_linesize(width) * nh - } -} - -impl fmt::Display for NAPixelChromaton { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - let pfmt = if self.packed { - let mask = ((1 << self.depth) - 1) << self.shift; - format!("packed(+{},{:X}, step {})", self.comp_offs, mask, self.next_elem) - } else { - format!("planar({},{})", self.comp_offs, self.next_elem) - }; - write!(f, "({}x{}, {})", self.h_ss, self.v_ss, pfmt) - } -} - -impl NAPixelFormaton { - pub fn new(model: ColorModel, - comp1: Option<NAPixelChromaton>, - comp2: Option<NAPixelChromaton>, - comp3: Option<NAPixelChromaton>, - comp4: Option<NAPixelChromaton>, - comp5: Option<NAPixelChromaton>, - flags: u32, elem_size: u8) -> Self { - let mut chromatons: [Option<NAPixelChromaton>; 5] = [None; 5]; - let mut ncomp = 0; - let be = (flags & FORMATON_FLAG_BE) != 0; - let alpha = (flags & FORMATON_FLAG_ALPHA) != 0; - let palette = (flags & FORMATON_FLAG_PALETTE) != 0; - if let Some(c) = comp1 { chromatons[0] = Some(c); ncomp += 1; } - if let Some(c) = comp2 { chromatons[1] = Some(c); ncomp += 1; } - if let Some(c) = comp3 { chromatons[2] = Some(c); ncomp += 1; } - if let Some(c) = comp4 { chromatons[3] = Some(c); ncomp += 1; } - if let Some(c) = comp5 { chromatons[4] = Some(c); ncomp += 1; } - NAPixelFormaton { model: model, - components: ncomp, - comp_info: chromatons, - elem_size: elem_size, - be: be, alpha: alpha, palette: palette } - } - - pub fn get_model(&self) -> ColorModel { self.model } - pub fn get_num_comp(&self) -> usize { self.components as usize } - pub fn get_chromaton(&self, idx: usize) -> Option<NAPixelChromaton> { - if idx < self.comp_info.len() { return self.comp_info[idx]; } - None - } - pub fn is_be(&self) -> bool { self.be } - pub fn has_alpha(&self) -> bool { self.alpha } - pub fn is_paletted(&self) -> bool { self.palette } - pub fn get_elem_size(&self) -> u8 { self.elem_size } -} - -impl fmt::Display for NAPixelFormaton { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - let end = if self.be { "BE" } else { "LE" }; - let palstr = if self.palette { "palette " } else { "" }; - let astr = if self.alpha { "alpha " } else { "" }; - let mut str = format!("Formaton for {} ({}{}elem {} size {}): ", self.model, palstr, astr,end, self.elem_size); - for i in 0..self.comp_info.len() { - if let Some(chr) = self.comp_info[i] { - str = format!("{} {}", str, chr); - } - } - write!(f, "[{}]", str) - } -} - -#[cfg(test)] -mod test { - use super::*; - - #[test] - fn test_fmt() { - println!("{}", SND_S16_FORMAT); - println!("{}", SND_U8_FORMAT); - println!("{}", SND_F32P_FORMAT); - println!("formaton yuv- {}", YUV420_FORMAT); - println!("formaton pal- {}", PAL8_FORMAT); - println!("formaton rgb565- {}", RGB565_FORMAT); - } -} diff --git a/src/frame.rs b/src/frame.rs deleted file mode 100644 index 2bfbe61..0000000 --- a/src/frame.rs +++ /dev/null @@ -1,688 +0,0 @@ -use std::cmp::max; -use std::collections::HashMap; -use std::fmt; -use std::rc::Rc; -use std::cell::*; -use crate::formats::*; - -#[allow(dead_code)] -#[derive(Clone,Copy,PartialEq)] -pub struct NAAudioInfo { - sample_rate: u32, - channels: u8, - format: NASoniton, - block_len: usize, -} - -impl NAAudioInfo { - pub fn new(sr: u32, ch: u8, fmt: NASoniton, bl: usize) -> Self { - NAAudioInfo { sample_rate: sr, channels: ch, format: fmt, block_len: bl } - } - pub fn get_sample_rate(&self) -> u32 { self.sample_rate } - pub fn get_channels(&self) -> u8 { self.channels } - pub fn get_format(&self) -> NASoniton { self.format } - pub fn get_block_len(&self) -> usize { self.block_len } -} - -impl fmt::Display for NAAudioInfo { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - write!(f, "{} Hz, {} ch", self.sample_rate, self.channels) - } -} - -#[allow(dead_code)] -#[derive(Clone,Copy,PartialEq)] -pub struct NAVideoInfo { - width: usize, - height: usize, - flipped: bool, - format: NAPixelFormaton, -} - -impl NAVideoInfo { - pub fn new(w: usize, h: usize, flip: bool, fmt: NAPixelFormaton) -> Self { - NAVideoInfo { width: w, height: h, flipped: flip, format: fmt } - } - pub fn get_width(&self) -> usize { self.width as usize } - pub fn get_height(&self) -> usize { self.height as usize } - pub fn is_flipped(&self) -> bool { self.flipped } - pub fn get_format(&self) -> NAPixelFormaton { self.format } - pub fn set_width(&mut self, w: usize) { self.width = w; } - pub fn set_height(&mut self, h: usize) { self.height = h; } -} - -impl fmt::Display for NAVideoInfo { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - write!(f, "{}x{}", self.width, self.height) - } -} - -#[derive(Clone,Copy,PartialEq)] -pub enum NACodecTypeInfo { - None, - Audio(NAAudioInfo), - Video(NAVideoInfo), -} - -impl NACodecTypeInfo { - pub fn get_video_info(&self) -> Option<NAVideoInfo> { - match *self { - NACodecTypeInfo::Video(vinfo) => Some(vinfo), - _ => None, - } - } - pub fn get_audio_info(&self) -> Option<NAAudioInfo> { - match *self { - NACodecTypeInfo::Audio(ainfo) => Some(ainfo), - _ => None, - } - } - pub fn is_video(&self) -> bool { - match *self { - NACodecTypeInfo::Video(_) => true, - _ => false, - } - } - pub fn is_audio(&self) -> bool { - match *self { - NACodecTypeInfo::Audio(_) => true, - _ => false, - } - } -} - -impl fmt::Display for NACodecTypeInfo { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - let ret = match *self { - NACodecTypeInfo::None => format!(""), - NACodecTypeInfo::Audio(fmt) => format!("{}", fmt), - NACodecTypeInfo::Video(fmt) => format!("{}", fmt), - }; - write!(f, "{}", ret) - } -} - -pub type NABufferRefT<T> = Rc<RefCell<Vec<T>>>; - -#[derive(Clone)] -pub struct NAVideoBuffer<T> { - info: NAVideoInfo, - data: NABufferRefT<T>, - offs: Vec<usize>, - strides: Vec<usize>, -} - -impl<T: Clone> NAVideoBuffer<T> { - pub fn get_offset(&self, idx: usize) -> usize { - if idx >= self.offs.len() { 0 } - else { self.offs[idx] } - } - pub fn get_info(&self) -> NAVideoInfo { self.info } - pub fn get_data(&self) -> Ref<Vec<T>> { self.data.borrow() } - pub fn get_data_mut(&mut self) -> RefMut<Vec<T>> { self.data.borrow_mut() } - pub fn copy_buffer(&mut self) -> Self { - let mut data: Vec<T> = Vec::with_capacity(self.data.borrow().len()); - data.clone_from(self.data.borrow().as_ref()); - let mut offs: Vec<usize> = Vec::with_capacity(self.offs.len()); - offs.clone_from(&self.offs); - let mut strides: Vec<usize> = Vec::with_capacity(self.strides.len()); - strides.clone_from(&self.strides); - NAVideoBuffer { info: self.info, data: Rc::new(RefCell::new(data)), offs: offs, strides: strides } - } - pub fn get_stride(&self, idx: usize) -> usize { - if idx >= self.strides.len() { return 0; } - self.strides[idx] - } - pub fn get_dimensions(&self, idx: usize) -> (usize, usize) { - get_plane_size(&self.info, idx) - } -} - -#[derive(Clone)] -pub struct NAAudioBuffer<T> { - info: NAAudioInfo, - data: NABufferRefT<T>, - offs: Vec<usize>, - chmap: NAChannelMap, - len: usize, -} - -impl<T: Clone> NAAudioBuffer<T> { - pub fn get_offset(&self, idx: usize) -> usize { - if idx >= self.offs.len() { 0 } - else { self.offs[idx] } - } - pub fn get_info(&self) -> NAAudioInfo { self.info } - pub fn get_chmap(&self) -> NAChannelMap { self.chmap.clone() } - pub fn get_data(&self) -> Ref<Vec<T>> { self.data.borrow() } - pub fn get_data_mut(&mut self) -> RefMut<Vec<T>> { self.data.borrow_mut() } - pub fn copy_buffer(&mut self) -> Self { - let mut data: Vec<T> = Vec::with_capacity(self.data.borrow().len()); - data.clone_from(self.data.borrow().as_ref()); - let mut offs: Vec<usize> = Vec::with_capacity(self.offs.len()); - offs.clone_from(&self.offs); - NAAudioBuffer { info: self.info, data: Rc::new(RefCell::new(data)), offs: offs, chmap: self.get_chmap(), len: self.len } - } - pub fn get_length(&self) -> usize { self.len } -} - -impl NAAudioBuffer<u8> { - pub fn new_from_buf(info: NAAudioInfo, data: NABufferRefT<u8>, chmap: NAChannelMap) -> Self { - let len = data.borrow().len(); - NAAudioBuffer { info: info, data: data, chmap: chmap, offs: Vec::new(), len: len } - } -} - -#[derive(Clone)] -pub enum NABufferType { - Video (NAVideoBuffer<u8>), - Video16 (NAVideoBuffer<u16>), - VideoPacked(NAVideoBuffer<u8>), - AudioU8 (NAAudioBuffer<u8>), - AudioI16 (NAAudioBuffer<i16>), - AudioI32 (NAAudioBuffer<i32>), - AudioF32 (NAAudioBuffer<f32>), - AudioPacked(NAAudioBuffer<u8>), - Data (NABufferRefT<u8>), - None, -} - -impl NABufferType { - pub fn get_offset(&self, idx: usize) -> usize { - match *self { - NABufferType::Video(ref vb) => vb.get_offset(idx), - NABufferType::Video16(ref vb) => vb.get_offset(idx), - NABufferType::VideoPacked(ref vb) => vb.get_offset(idx), - NABufferType::AudioU8(ref ab) => ab.get_offset(idx), - NABufferType::AudioI16(ref ab) => ab.get_offset(idx), - NABufferType::AudioF32(ref ab) => ab.get_offset(idx), - NABufferType::AudioPacked(ref ab) => ab.get_offset(idx), - _ => 0, - } - } - pub fn get_vbuf(&mut self) -> Option<NAVideoBuffer<u8>> { - match *self { - NABufferType::Video(ref vb) => Some(vb.clone()), - NABufferType::VideoPacked(ref vb) => Some(vb.clone()), - _ => None, - } - } - pub fn get_vbuf16(&mut self) -> Option<NAVideoBuffer<u16>> { - match *self { - NABufferType::Video16(ref vb) => Some(vb.clone()), - _ => None, - } - } - pub fn get_abuf_u8(&mut self) -> Option<NAAudioBuffer<u8>> { - match *self { - NABufferType::AudioU8(ref ab) => Some(ab.clone()), - NABufferType::AudioPacked(ref ab) => Some(ab.clone()), - _ => None, - } - } - pub fn get_abuf_i16(&mut self) -> Option<NAAudioBuffer<i16>> { - match *self { - NABufferType::AudioI16(ref ab) => Some(ab.clone()), - _ => None, - } - } - pub fn get_abuf_i32(&mut self) -> Option<NAAudioBuffer<i32>> { - match *self { - NABufferType::AudioI32(ref ab) => Some(ab.clone()), - _ => None, - } - } - pub fn get_abuf_f32(&mut self) -> Option<NAAudioBuffer<f32>> { - match *self { - NABufferType::AudioF32(ref ab) => Some(ab.clone()), - _ => None, - } - } -} - -#[derive(Debug,Clone,Copy,PartialEq)] -pub enum AllocatorError { - TooLargeDimensions, - FormatError, -} - -pub fn alloc_video_buffer(vinfo: NAVideoInfo, align: u8) -> Result<NABufferType, AllocatorError> { - let fmt = &vinfo.format; - let mut new_size: usize = 0; - let mut offs: Vec<usize> = Vec::new(); - let mut strides: Vec<usize> = Vec::new(); - - for i in 0..fmt.get_num_comp() { - if fmt.get_chromaton(i) == None { return Err(AllocatorError::FormatError); } - } - - let align_mod = ((1 << align) as usize) - 1; - let width = ((vinfo.width as usize) + align_mod) & !align_mod; - let height = ((vinfo.height as usize) + align_mod) & !align_mod; - let mut max_depth = 0; - let mut all_packed = true; - for i in 0..fmt.get_num_comp() { - let ochr = fmt.get_chromaton(i); - if let None = ochr { continue; } - let chr = ochr.unwrap(); - if !chr.is_packed() { - all_packed = false; - break; - } - max_depth = max(max_depth, chr.get_depth()); - } - -//todo semi-packed like NV12 - if fmt.is_paletted() { -//todo various-sized palettes? - let stride = vinfo.get_format().get_chromaton(0).unwrap().get_linesize(width); - let pic_sz = stride.checked_mul(height); - if pic_sz == None { return Err(AllocatorError::TooLargeDimensions); } - let pal_size = 256 * (fmt.get_elem_size() as usize); - let new_size = pic_sz.unwrap().checked_add(pal_size); - if new_size == None { return Err(AllocatorError::TooLargeDimensions); } - offs.push(0); - offs.push(stride * height); - strides.push(stride); - let mut data: Vec<u8> = Vec::with_capacity(new_size.unwrap()); - data.resize(new_size.unwrap(), 0); - let buf: NAVideoBuffer<u8> = NAVideoBuffer { data: Rc::new(RefCell::new(data)), info: vinfo, offs: offs, strides: strides }; - Ok(NABufferType::Video(buf)) - } else if !all_packed { - for i in 0..fmt.get_num_comp() { - let ochr = fmt.get_chromaton(i); - if let None = ochr { continue; } - let chr = ochr.unwrap(); - if !vinfo.is_flipped() { - offs.push(new_size as usize); - } - let stride = chr.get_linesize(width); - let cur_h = chr.get_height(height); - let cur_sz = stride.checked_mul(cur_h); - if cur_sz == None { return Err(AllocatorError::TooLargeDimensions); } - let new_sz = new_size.checked_add(cur_sz.unwrap()); - if new_sz == None { return Err(AllocatorError::TooLargeDimensions); } - new_size = new_sz.unwrap(); - if vinfo.is_flipped() { - offs.push(new_size as usize); - } - strides.push(stride); - } - if max_depth <= 8 { - let mut data: Vec<u8> = Vec::with_capacity(new_size); - data.resize(new_size, 0); - let buf: NAVideoBuffer<u8> = NAVideoBuffer { data: Rc::new(RefCell::new(data)), info: vinfo, offs: offs, strides: strides }; - Ok(NABufferType::Video(buf)) - } else { - let mut data: Vec<u16> = Vec::with_capacity(new_size); - data.resize(new_size, 0); - let buf: NAVideoBuffer<u16> = NAVideoBuffer { data: Rc::new(RefCell::new(data)), info: vinfo, offs: offs, strides: strides }; - Ok(NABufferType::Video16(buf)) - } - } else { - let elem_sz = fmt.get_elem_size(); - let line_sz = width.checked_mul(elem_sz as usize); - if line_sz == None { return Err(AllocatorError::TooLargeDimensions); } - let new_sz = line_sz.unwrap().checked_mul(height); - if new_sz == None { return Err(AllocatorError::TooLargeDimensions); } - new_size = new_sz.unwrap(); - let mut data: Vec<u8> = Vec::with_capacity(new_size); - data.resize(new_size, 0); - strides.push(line_sz.unwrap()); - let buf: NAVideoBuffer<u8> = NAVideoBuffer { data: Rc::new(RefCell::new(data)), info: vinfo, offs: offs, strides: strides }; - Ok(NABufferType::VideoPacked(buf)) - } -} - -pub fn alloc_audio_buffer(ainfo: NAAudioInfo, nsamples: usize, chmap: NAChannelMap) -> Result<NABufferType, AllocatorError> { - let mut offs: Vec<usize> = Vec::new(); - if ainfo.format.is_planar() || (ainfo.channels == 1 && (ainfo.format.get_bits() % 8) == 0) { - let len = nsamples.checked_mul(ainfo.channels as usize); - if len == None { return Err(AllocatorError::TooLargeDimensions); } - let length = len.unwrap(); - for i in 0..ainfo.channels { - offs.push((i as usize) * nsamples); - } - if ainfo.format.is_float() { - if ainfo.format.get_bits() == 32 { - let mut data: Vec<f32> = Vec::with_capacity(length); - data.resize(length, 0.0); - let buf: NAAudioBuffer<f32> = NAAudioBuffer { data: Rc::new(RefCell::new(data)), info: ainfo, offs: offs, chmap: chmap, len: nsamples }; - Ok(NABufferType::AudioF32(buf)) - } else { - Err(AllocatorError::TooLargeDimensions) - } - } else { - if ainfo.format.get_bits() == 8 && !ainfo.format.is_signed() { - let mut data: Vec<u8> = Vec::with_capacity(length); - data.resize(length, 0); - let buf: NAAudioBuffer<u8> = NAAudioBuffer { data: Rc::new(RefCell::new(data)), info: ainfo, offs: offs, chmap: chmap, len: nsamples }; - Ok(NABufferType::AudioU8(buf)) - } else if ainfo.format.get_bits() == 16 && ainfo.format.is_signed() { - let mut data: Vec<i16> = Vec::with_capacity(length); - data.resize(length, 0); - let buf: NAAudioBuffer<i16> = NAAudioBuffer { data: Rc::new(RefCell::new(data)), info: ainfo, offs: offs, chmap: chmap, len: nsamples }; - Ok(NABufferType::AudioI16(buf)) - } else { - Err(AllocatorError::TooLargeDimensions) - } - } - } else { - let len = nsamples.checked_mul(ainfo.channels as usize); - if len == None { return Err(AllocatorError::TooLargeDimensions); } - let length = ainfo.format.get_audio_size(len.unwrap() as u64); - let mut data: Vec<u8> = Vec::with_capacity(length); - data.resize(length, 0); - let buf: NAAudioBuffer<u8> = NAAudioBuffer { data: Rc::new(RefCell::new(data)), info: ainfo, offs: offs, chmap: chmap, len: nsamples }; - Ok(NABufferType::AudioPacked(buf)) - } -} - -pub fn alloc_data_buffer(size: usize) -> Result<NABufferType, AllocatorError> { - let mut data: Vec<u8> = Vec::with_capacity(size); - data.resize(size, 0); - let buf: NABufferRefT<u8> = Rc::new(RefCell::new(data)); - Ok(NABufferType::Data(buf)) -} - -pub fn copy_buffer(buf: NABufferType) -> NABufferType { - buf.clone() -} - -#[allow(dead_code)] -#[derive(Clone)] -pub struct NACodecInfo { - name: &'static str, - properties: NACodecTypeInfo, - extradata: Option<Rc<Vec<u8>>>, -} - -impl NACodecInfo { - pub fn new(name: &'static str, p: NACodecTypeInfo, edata: Option<Vec<u8>>) -> Self { - let extradata = match edata { - None => None, - Some(vec) => Some(Rc::new(vec)), - }; - NACodecInfo { name: name, properties: p, extradata: extradata } - } - pub fn new_ref(name: &'static str, p: NACodecTypeInfo, edata: Option<Rc<Vec<u8>>>) -> Self { - NACodecInfo { name: name, properties: p, extradata: edata } - } - pub fn get_properties(&self) -> NACodecTypeInfo { self.properties } - pub fn get_extradata(&self) -> Option<Rc<Vec<u8>>> { - if let Some(ref vec) = self.extradata { return Some(vec.clone()); } - None - } - pub fn get_name(&self) -> &'static str { self.name } - pub fn is_video(&self) -> bool { - if let NACodecTypeInfo::Video(_) = self.properties { return true; } - false - } - pub fn is_audio(&self) -> bool { - if let NACodecTypeInfo::Audio(_) = self.properties { return true; } - false - } - pub fn new_dummy() -> Rc<Self> { - Rc::new(DUMMY_CODEC_INFO) - } - pub fn replace_info(&self, p: NACodecTypeInfo) -> Rc<Self> { - Rc::new(NACodecInfo { name: self.name, properties: p, extradata: self.extradata.clone() }) - } -} - -impl fmt::Display for NACodecInfo { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - let edata = match self.extradata.clone() { - None => format!("no extradata"), - Some(v) => format!("{} byte(s) of extradata", v.len()), - }; - write!(f, "{}: {} {}", self.name, self.properties, edata) - } -} - -pub const DUMMY_CODEC_INFO: NACodecInfo = NACodecInfo { - name: "none", - properties: NACodecTypeInfo::None, - extradata: None }; - -#[derive(Debug,Clone)] -pub enum NAValue { - None, - Int(i32), - Long(i64), - String(String), - Data(Rc<Vec<u8>>), -} - -#[derive(Debug,Clone,Copy,PartialEq)] -#[allow(dead_code)] -pub enum FrameType { - I, - P, - B, - Skip, - Other, -} - -impl fmt::Display for FrameType { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - match *self { - FrameType::I => write!(f, "I"), - FrameType::P => write!(f, "P"), - FrameType::B => write!(f, "B"), - FrameType::Skip => write!(f, "skip"), - FrameType::Other => write!(f, "x"), - } - } -} - -#[derive(Debug,Clone,Copy)] -pub struct NATimeInfo { - pts: Option<u64>, - dts: Option<u64>, - duration: Option<u64>, - tb_num: u32, - tb_den: u32, -} - -impl NATimeInfo { - pub fn new(pts: Option<u64>, dts: Option<u64>, duration: Option<u64>, tb_num: u32, tb_den: u32) -> Self { - NATimeInfo { pts: pts, dts: dts, duration: duration, tb_num: tb_num, tb_den: tb_den } - } - pub fn get_pts(&self) -> Option<u64> { self.pts } - pub fn get_dts(&self) -> Option<u64> { self.dts } - pub fn get_duration(&self) -> Option<u64> { self.duration } - pub fn set_pts(&mut self, pts: Option<u64>) { self.pts = pts; } - pub fn set_dts(&mut self, dts: Option<u64>) { self.dts = dts; } - pub fn set_duration(&mut self, dur: Option<u64>) { self.duration = dur; } -} - -#[allow(dead_code)] -#[derive(Clone)] -pub struct NAFrame { - ts: NATimeInfo, - buffer: NABufferType, - info: Rc<NACodecInfo>, - ftype: FrameType, - key: bool, - options: HashMap<String, NAValue>, -} - -pub type NAFrameRef = Rc<RefCell<NAFrame>>; - -fn get_plane_size(info: &NAVideoInfo, idx: usize) -> (usize, usize) { - let chromaton = info.get_format().get_chromaton(idx); - if let None = chromaton { return (0, 0); } - let (hs, vs) = chromaton.unwrap().get_subsampling(); - let w = (info.get_width() + ((1 << hs) - 1)) >> hs; - let h = (info.get_height() + ((1 << vs) - 1)) >> vs; - (w, h) -} - -impl NAFrame { - pub fn new(ts: NATimeInfo, - ftype: FrameType, - keyframe: bool, - info: Rc<NACodecInfo>, - options: HashMap<String, NAValue>, - buffer: NABufferType) -> Self { - NAFrame { ts: ts, buffer: buffer, info: info, ftype: ftype, key: keyframe, options: options } - } - pub fn get_info(&self) -> Rc<NACodecInfo> { self.info.clone() } - pub fn get_frame_type(&self) -> FrameType { self.ftype } - pub fn is_keyframe(&self) -> bool { self.key } - pub fn set_frame_type(&mut self, ftype: FrameType) { self.ftype = ftype; } - pub fn set_keyframe(&mut self, key: bool) { self.key = key; } - pub fn get_time_information(&self) -> NATimeInfo { self.ts } - pub fn get_pts(&self) -> Option<u64> { self.ts.get_pts() } - pub fn get_dts(&self) -> Option<u64> { self.ts.get_dts() } - pub fn get_duration(&self) -> Option<u64> { self.ts.get_duration() } - pub fn set_pts(&mut self, pts: Option<u64>) { self.ts.set_pts(pts); } - pub fn set_dts(&mut self, dts: Option<u64>) { self.ts.set_dts(dts); } - pub fn set_duration(&mut self, dur: Option<u64>) { self.ts.set_duration(dur); } - - pub fn get_buffer(&self) -> NABufferType { self.buffer.clone() } -} - -impl fmt::Display for NAFrame { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - let mut foo = format!("frame type {}", self.ftype); - if let Some(pts) = self.ts.pts { foo = format!("{} pts {}", foo, pts); } - if let Some(dts) = self.ts.dts { foo = format!("{} dts {}", foo, dts); } - if let Some(dur) = self.ts.duration { foo = format!("{} duration {}", foo, dur); } - if self.key { foo = format!("{} kf", foo); } - write!(f, "[{}]", foo) - } -} - -/// Possible stream types. -#[derive(Debug,Clone,Copy)] -#[allow(dead_code)] -pub enum StreamType { - /// video stream - Video, - /// audio stream - Audio, - /// subtitles - Subtitles, - /// any data stream (or might be an unrecognized audio/video stream) - Data, - /// nonexistent stream - None, -} - -impl fmt::Display for StreamType { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - match *self { - StreamType::Video => write!(f, "Video"), - StreamType::Audio => write!(f, "Audio"), - StreamType::Subtitles => write!(f, "Subtitles"), - StreamType::Data => write!(f, "Data"), - StreamType::None => write!(f, "-"), - } - } -} - -#[allow(dead_code)] -#[derive(Clone)] -pub struct NAStream { - media_type: StreamType, - id: u32, - num: usize, - info: Rc<NACodecInfo>, - tb_num: u32, - tb_den: u32, -} - -pub fn reduce_timebase(tb_num: u32, tb_den: u32) -> (u32, u32) { - if tb_num == 0 { return (tb_num, tb_den); } - if (tb_den % tb_num) == 0 { return (1, tb_den / tb_num); } - - let mut a = tb_num; - let mut b = tb_den; - - while a != b { - if a > b { a -= b; } - else if b > a { b -= a; } - } - - (tb_num / a, tb_den / a) -} - -impl NAStream { - pub fn new(mt: StreamType, id: u32, info: NACodecInfo, tb_num: u32, tb_den: u32) -> Self { - let (n, d) = reduce_timebase(tb_num, tb_den); - NAStream { media_type: mt, id: id, num: 0, info: Rc::new(info), tb_num: n, tb_den: d } - } - pub fn get_id(&self) -> u32 { self.id } - pub fn get_num(&self) -> usize { self.num } - pub fn set_num(&mut self, num: usize) { self.num = num; } - pub fn get_info(&self) -> Rc<NACodecInfo> { self.info.clone() } - pub fn get_timebase(&self) -> (u32, u32) { (self.tb_num, self.tb_den) } - pub fn set_timebase(&mut self, tb_num: u32, tb_den: u32) { - let (n, d) = reduce_timebase(tb_num, tb_den); - self.tb_num = n; - self.tb_den = d; - } -} - -impl fmt::Display for NAStream { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - write!(f, "({}#{} @ {}/{} - {})", self.media_type, self.id, self.tb_num, self.tb_den, self.info.get_properties()) - } -} - -#[allow(dead_code)] -pub struct NAPacket { - stream: Rc<NAStream>, - ts: NATimeInfo, - buffer: Rc<Vec<u8>>, - keyframe: bool, -// options: HashMap<String, NAValue<'a>>, -} - -impl NAPacket { - pub fn new(str: Rc<NAStream>, ts: NATimeInfo, kf: bool, vec: Vec<u8>) -> Self { -// let mut vec: Vec<u8> = Vec::new(); -// vec.resize(size, 0); - NAPacket { stream: str, ts: ts, keyframe: kf, buffer: Rc::new(vec) } - } - pub fn get_stream(&self) -> Rc<NAStream> { self.stream.clone() } - pub fn get_time_information(&self) -> NATimeInfo { self.ts } - pub fn get_pts(&self) -> Option<u64> { self.ts.get_pts() } - pub fn get_dts(&self) -> Option<u64> { self.ts.get_dts() } - pub fn get_duration(&self) -> Option<u64> { self.ts.get_duration() } - pub fn is_keyframe(&self) -> bool { self.keyframe } - pub fn get_buffer(&self) -> Rc<Vec<u8>> { self.buffer.clone() } -} - -impl Drop for NAPacket { - fn drop(&mut self) {} -} - -impl fmt::Display for NAPacket { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - let mut foo = format!("[pkt for {} size {}", self.stream, self.buffer.len()); - if let Some(pts) = self.ts.pts { foo = format!("{} pts {}", foo, pts); } - if let Some(dts) = self.ts.dts { foo = format!("{} dts {}", foo, dts); } - if let Some(dur) = self.ts.duration { foo = format!("{} duration {}", foo, dur); } - if self.keyframe { foo = format!("{} kf", foo); } - foo = foo + "]"; - write!(f, "{}", foo) - } -} - -pub trait FrameFromPacket { - fn new_from_pkt(pkt: &NAPacket, info: Rc<NACodecInfo>, buf: NABufferType) -> NAFrame; - fn fill_timestamps(&mut self, pkt: &NAPacket); -} - -impl FrameFromPacket for NAFrame { - fn new_from_pkt(pkt: &NAPacket, info: Rc<NACodecInfo>, buf: NABufferType) -> NAFrame { - NAFrame::new(pkt.ts, FrameType::Other, pkt.keyframe, info, HashMap::new(), buf) - } - fn fill_timestamps(&mut self, pkt: &NAPacket) { - self.ts = pkt.get_time_information(); - } -} - diff --git a/src/io/bitreader.rs b/src/io/bitreader.rs deleted file mode 100644 index ea5f27c..0000000 --- a/src/io/bitreader.rs +++ /dev/null @@ -1,250 +0,0 @@ -#[derive(Debug)] -pub enum BitReaderMode { - BE, - LE, - LE16MSB, - LE32MSB, -} - -#[derive(Debug)] -pub enum BitReaderError { - BitstreamEnd, - TooManyBitsRequested, - InvalidValue, -} - -use self::BitReaderError::*; - -pub type BitReaderResult<T> = Result<T, BitReaderError>; - -#[derive(Debug)] -pub struct BitReader<'a> { - cache: u64, - bits: u8, - pos: usize, - end: usize, - src: &'a [u8], - mode: BitReaderMode, -} - -impl<'a> BitReader<'a> { - - pub fn new(src: &'a [u8], size: usize, mode: BitReaderMode) -> Self { - if src.len() < size { panic!("size is less than needed"); } - BitReader{ cache: 0, pos: 0, bits: 0, end: size, src: src, mode: mode } - } - - pub fn tell(&self) -> usize { - self.pos * 8 - (self.bits as usize) - } - - pub fn left(&self) -> isize { - ((self.end as isize) - (self.pos as isize)) * 8 + (self.bits as isize) - } - - fn fill32be(&mut self, src: &[u8]) { - let nw = (((src[0] as u32) << 24) | - ((src[1] as u32) << 16) | - ((src[2] as u32) << 8) | - ((src[3] as u32) << 0)) as u64; - self.cache |= nw << (32 - self.bits); - } - - fn fill32le16(&mut self, src: &[u8]) { - let nw = (((src[1] as u32) << 24) | - ((src[0] as u32) << 16) | - ((src[3] as u32) << 8) | - ((src[2] as u32) << 0)) as u64; - self.cache |= nw << (32 - self.bits); - } - - fn fill32le32(&mut self, src: &[u8], lsb: bool) { - let nw = (((src[3] as u32) << 24) | - ((src[2] as u32) << 16) | - ((src[1] as u32) << 8) | - ((src[0] as u32) << 0)) as u64; - if lsb { - self.cache |= nw << self.bits; - } else { - self.cache |= nw << (32 - self.bits); - } - } - - #[inline(always)] - fn refill(&mut self) -> BitReaderResult<()> { - if self.pos >= self.end { return Err(BitstreamEnd) } - while self.bits <= 32 { - if self.pos + 4 <= self.end { - let buf = &self.src[self.pos..]; - match self.mode { - BitReaderMode::BE => self.fill32be (buf), - BitReaderMode::LE16MSB => self.fill32le16(buf), - BitReaderMode::LE => self.fill32le32(buf, true), - BitReaderMode::LE32MSB => self.fill32le32(buf, false), - } - self.pos += 4; - self.bits += 32; - } else { - let mut buf: [u8; 4] = [0, 0, 0, 0]; - let mut newbits: u8 = 0; - for i in 0..3 { - if self.pos < self.end { - buf[i] = self.src[self.pos]; - self.pos = self.pos + 1; - newbits += 8; - } - } - if newbits == 0 { break; } - match self.mode { - BitReaderMode::BE => self.fill32be (&buf), - BitReaderMode::LE16MSB => self.fill32le16(&buf), - BitReaderMode::LE => self.fill32le32(&buf, true), - BitReaderMode::LE32MSB => self.fill32le32(&buf, false), - } - self.bits += newbits; - } - } - Ok(()) - } - - #[inline(always)] - fn read_cache(&mut self, nbits: u8) -> u32 { - let res = match self.mode { - BitReaderMode::LE => ((1u64 << nbits) - 1) & self.cache, - _ => (self.cache as u64) >> (64 - nbits), - }; - res as u32 - } - - fn read_cache_s(&mut self, nbits: u8) -> i32 { - let res = match self.mode { - BitReaderMode::LE => ((self.cache as i64) << (64 - nbits)) >> (64 - nbits), - _ => (self.cache as i64) >> (64 - nbits), - }; - res as i32 - } - - #[inline(always)] - fn skip_cache(&mut self, nbits: u8) { - match self.mode { - BitReaderMode::LE => self.cache >>= nbits, - _ => self.cache <<= nbits, - }; - self.bits -= nbits; - } - - #[inline(always)] - fn reset_cache(&mut self) { - self.bits = 0; - self.cache = 0; - } - - #[inline(always)] - pub fn read(&mut self, nbits: u8) -> BitReaderResult<u32> { - if nbits == 0 { return Ok(0) } - if nbits > 32 { return Err(TooManyBitsRequested) } - if self.bits < nbits { - if let Err(err) = self.refill() { return Err(err) } - if self.bits < nbits { return Err(BitstreamEnd) } - } - let res = self.read_cache(nbits); - self.skip_cache(nbits); - Ok(res) - } - - pub fn read_s(&mut self, nbits: u8) -> BitReaderResult<i32> { - if nbits == 0 || nbits > 32 { return Err(TooManyBitsRequested) } - if self.bits < nbits { - if let Err(err) = self.refill() { return Err(err) } - if self.bits < nbits { return Err(BitstreamEnd) } - } - let res = self.read_cache_s(nbits); - self.skip_cache(nbits); - Ok(res) - } - - #[inline(always)] - pub fn read_bool(&mut self) -> BitReaderResult<bool> { - if self.bits < 1 { - if let Err(err) = self.refill() { return Err(err) } - if self.bits < 1 { return Err(BitstreamEnd) } - } - let res = self.read_cache(1); - self.skip_cache(1); - Ok(res == 1) - } - - #[inline(always)] - pub fn peek(&mut self, nbits: u8) -> u32 { - if nbits > 32 { return 0 } - if self.bits < nbits { let _ = self.refill(); } - self.read_cache(nbits) - } - - #[inline(always)] - pub fn skip(&mut self, nbits: u32) -> BitReaderResult<()> { - if self.bits as u32 >= nbits { - self.skip_cache(nbits as u8); - return Ok(()); - } - let mut skip_bits = nbits - (self.bits as u32); - self.reset_cache(); - self.pos += ((skip_bits / 32) * 4) as usize; - skip_bits = skip_bits & 0x1F; - self.refill()?; - if skip_bits > 0 { - self.skip_cache(skip_bits as u8); - } - Ok(()) - } - - pub fn seek(&mut self, nbits: u32) -> BitReaderResult<()> { - if ((nbits + 7) >> 3) as usize > self.end { return Err(TooManyBitsRequested); } - self.reset_cache(); - self.pos = ((nbits / 32) * 4) as usize; - self.skip(nbits & 0x1F) - } - - pub fn align(&mut self) { - let pos = self.bits & 7; - if pos != 0 { - self.skip_cache(pos); - } - } -} - -pub fn reverse_bits(inval: u32, len: u8) -> u32 { - if len == 0 { return 0; } - const REV_TAB: [u8; 16] = [ - 0b0000, 0b1000, 0b0100, 0b1100, 0b0010, 0b1010, 0b0110, 0b1110, - 0b0001, 0b1001, 0b0101, 0b1101, 0b0011, 0b1011, 0b0111, 0b1111, - ]; - - let mut ret = 0; - let mut val = inval; - for _ in 0..8 { - ret = (ret << 4) | (REV_TAB[(val & 0xF) as usize] as u32); - val = val >> 4; - } - ret >> (32 - len) -} - -#[cfg(test)] -mod test { - use super::*; - - #[test] - fn br_works() { - const DATA: [u8; 18] = [0b00011011; 18]; - let src = &DATA; - let mut br = BitReader::new(src, src.len(), BitReaderMode::LE16MSB); - - for _ in 0..8 { - assert_eq!(br.read(16).unwrap(), 0x1B1B); - } - const DATA2: [u8; 1] = [ 0b00011011 ]; - let src = &DATA2; - let mut br = BitReader::new(src, src.len(), BitReaderMode::LE); - assert_eq!(br.read_s(5).unwrap(), -5); - } -} diff --git a/src/io/byteio.rs b/src/io/byteio.rs deleted file mode 100644 index 966169c..0000000 --- a/src/io/byteio.rs +++ /dev/null @@ -1,634 +0,0 @@ -use std::io::SeekFrom; -use std::fs::File; -use std::io::prelude::*; - -#[derive(Debug)] -pub enum ByteIOError { - EOF, - WrongRange, - WrongIOMode, - NotImplemented, - ReadError, - WriteError, - SeekError, -} - -pub type ByteIOResult<T> = Result<T, ByteIOError>; - -pub trait ByteIO { - fn read_buf(&mut self, buf: &mut [u8]) -> ByteIOResult<usize>; - fn read_buf_some(&mut self, buf: &mut [u8]) -> ByteIOResult<usize>; - fn peek_buf(&mut self, buf: &mut [u8]) -> ByteIOResult<usize>; - fn read_byte(&mut self) -> ByteIOResult<u8>; - fn peek_byte(&mut self) -> ByteIOResult<u8>; - fn write_buf(&mut self, buf: &[u8]) -> ByteIOResult<()>; - fn tell(&mut self) -> u64; - fn seek(&mut self, pos: SeekFrom) -> ByteIOResult<u64>; - fn is_eof(&mut self) -> bool; - fn is_seekable(&mut self) -> bool; - fn size(&mut self) -> i64; -} - -#[allow(dead_code)] -pub struct ByteReader<'a> { - io: &'a mut ByteIO, -} - -pub struct MemoryReader<'a> { - buf: &'a [u8], - size: usize, - pos: usize, -} - -pub struct FileReader<'a> { - file: &'a File, - eof: bool, -} - -macro_rules! read_int { - ($s: ident, $inttype: ty, $size: expr, $which: ident) => ({ - let mut buf = [0; $size]; - $s.read_buf(&mut buf)?; - unsafe { - Ok((*(buf.as_ptr() as *const $inttype)).$which()) - } - }) -} - -macro_rules! peek_int { - ($s: ident, $inttype: ty, $size: expr, $which: ident) => ({ - let mut buf = [0; $size]; - $s.peek_buf(&mut buf)?; - unsafe { - Ok((*(buf.as_ptr() as *const $inttype)).$which()) - } - }) -} - -impl<'a> ByteReader<'a> { - pub fn new(io: &'a mut ByteIO) -> Self { ByteReader { io: io } } - - pub fn read_buf(&mut self, buf: &mut [u8]) -> ByteIOResult<usize> { - self.io.read_buf(buf) - } - - pub fn read_buf_some(&mut self, buf: &mut [u8]) -> ByteIOResult<usize> { - self.io.read_buf_some(buf) - } - - pub fn peek_buf(&mut self, buf: &mut [u8]) -> ByteIOResult<usize> { - self.io.peek_buf(buf) - } - - pub fn read_byte(&mut self) -> ByteIOResult<u8> { - self.io.read_byte() - } - - pub fn peek_byte(&mut self) -> ByteIOResult<u8> { - self.io.peek_byte() - } - - pub fn read_u16be(&mut self) -> ByteIOResult<u16> { - read_int!(self, u16, 2, to_be) - } - - pub fn peek_u16be(&mut self) -> ByteIOResult<u16> { - peek_int!(self, u16, 2, to_be) - } - - pub fn read_u24be(&mut self) -> ByteIOResult<u32> { - let p16 = self.read_u16be()?; - let p8 = self.read_byte()?; - Ok(((p16 as u32) << 8) | (p8 as u32)) - } - - pub fn peek_u24be(&mut self) -> ByteIOResult<u32> { - let mut src: [u8; 3] = [0; 3]; - self.peek_buf(&mut src)?; - Ok(((src[0] as u32) << 16) | ((src[1] as u32) << 8) | (src[2] as u32)) - } - - pub fn read_u32be(&mut self) -> ByteIOResult<u32> { - read_int!(self, u32, 4, to_be) - } - - pub fn peek_u32be(&mut self) -> ByteIOResult<u32> { - peek_int!(self, u32, 4, to_be) - } - - pub fn read_u64be(&mut self) -> ByteIOResult<u64> { - read_int!(self, u64, 8, to_be) - } - - pub fn peek_u64be(&mut self) -> ByteIOResult<u64> { - peek_int!(self, u64, 8, to_be) - } - - pub fn read_u16le(&mut self) -> ByteIOResult<u16> { - read_int!(self, u16, 2, to_le) - } - - pub fn peek_u16le(&mut self) -> ByteIOResult<u16> { - peek_int!(self, u16, 2, to_le) - } - - pub fn read_u24le(&mut self) -> ByteIOResult<u32> { - let p8 = self.read_byte()?; - let p16 = self.read_u16le()?; - Ok(((p16 as u32) << 8) | (p8 as u32)) - } - - pub fn peek_u24le(&mut self) -> ByteIOResult<u32> { - let mut src: [u8; 3] = [0; 3]; - self.peek_buf(&mut src)?; - Ok((src[0] as u32) | ((src[1] as u32) << 8) | ((src[2] as u32) << 16)) - } - - pub fn read_u32le(&mut self) -> ByteIOResult<u32> { - read_int!(self, u32, 4, to_le) - } - - pub fn peek_u32le(&mut self) -> ByteIOResult<u32> { - peek_int!(self, u32, 4, to_le) - } - - pub fn read_u64le(&mut self) -> ByteIOResult<u64> { - read_int!(self, u64, 8, to_le) - } - - pub fn peek_u64le(&mut self) -> ByteIOResult<u64> { - peek_int!(self, u64, 8, to_le) - } - - pub fn read_skip(&mut self, len: usize) -> ByteIOResult<()> { - if self.io.is_seekable() { - self.io.seek(SeekFrom::Current(len as i64))?; - } else { - let mut ssize = len; - let mut buf : [u8; 16] = [0; 16]; - let bref = &mut buf; - while ssize > bref.len() { - self.io.read_buf(bref)?; - ssize -= bref.len(); - } - while ssize > 0 { - self.io.read_byte()?; - ssize = ssize - 1; - } - } - Ok(()) - } - - pub fn tell(&mut self) -> u64 { - self.io.tell() - } - - pub fn seek(&mut self, pos: SeekFrom) -> ByteIOResult<u64> { - self.io.seek(pos) - } - - pub fn is_eof(&mut self) -> bool { - self.io.is_eof() - } - - pub fn size(&mut self) -> i64 { - self.io.size() - } - - pub fn left(&mut self) -> i64 { - let size = self.io.size(); - if size == -1 { return -1; } - return size - (self.io.tell() as i64) - } -} - -impl<'a> MemoryReader<'a> { - - pub fn new_read(buf: &'a [u8]) -> Self { - MemoryReader { buf: buf, size: buf.len(), pos: 0 } - } - - fn real_seek(&mut self, pos: i64) -> ByteIOResult<u64> { - if pos < 0 || (pos as usize) > self.size { - return Err(ByteIOError::WrongRange) - } - self.pos = pos as usize; - Ok(pos as u64) - } -} - -impl<'a> ByteIO for MemoryReader<'a> { - fn read_byte(&mut self) -> ByteIOResult<u8> { - if self.is_eof() { return Err(ByteIOError::EOF); } - let res = self.buf[self.pos]; - self.pos = self.pos + 1; - Ok(res) - } - - fn peek_byte(&mut self) -> ByteIOResult<u8> { - if self.is_eof() { return Err(ByteIOError::EOF); } - Ok(self.buf[self.pos]) - } - - fn peek_buf(&mut self, buf: &mut [u8]) -> ByteIOResult<usize> { - let copy_size = if self.size - self.pos < buf.len() { self.size } else { buf.len() }; - if copy_size == 0 { return Err(ByteIOError::EOF); } - for i in 0..copy_size { - buf[i] = self.buf[self.pos + i]; - } - Ok(copy_size) - } - - fn read_buf(&mut self, buf: &mut [u8]) -> ByteIOResult<usize> { - let read_size = self.peek_buf(buf)?; - if read_size < buf.len() { return Err(ByteIOError::EOF); } - self.pos += read_size; - Ok(read_size) - } - - fn read_buf_some(&mut self, buf: &mut [u8]) -> ByteIOResult<usize> { - let read_size = self.peek_buf(buf)?; - self.pos += read_size; - Ok(read_size) - } - - #[allow(unused_variables)] - fn write_buf(&mut self, buf: &[u8]) -> ByteIOResult<()> { - Err(ByteIOError::NotImplemented) - } - - fn tell(&mut self) -> u64 { - self.pos as u64 - } - - fn seek(&mut self, pos: SeekFrom) -> ByteIOResult<u64> { - let cur_pos = self.pos as i64; - let cur_size = self.size as i64; - match pos { - SeekFrom::Start(x) => self.real_seek(x as i64), - SeekFrom::Current(x) => self.real_seek(cur_pos + x), - SeekFrom::End(x) => self.real_seek(cur_size + x), - } - } - - fn is_eof(&mut self) -> bool { - self.pos >= self.size - } - - fn is_seekable(&mut self) -> bool { - true - } - - fn size(&mut self) -> i64 { - self.buf.len() as i64 - } -} - -impl<'a> FileReader<'a> { - - pub fn new_read(file: &'a mut File) -> Self { - FileReader { file: file, eof : false } - } -} - -impl<'a> ByteIO for FileReader<'a> { - fn read_byte(&mut self) -> ByteIOResult<u8> { - let mut byte : [u8; 1] = [0]; - let err = self.file.read(&mut byte); - if let Err(_) = err { return Err(ByteIOError::ReadError); } - let sz = err.unwrap(); - if sz == 0 { self.eof = true; return Err(ByteIOError::EOF); } - Ok (byte[0]) - } - - fn peek_byte(&mut self) -> ByteIOResult<u8> { - let b = self.read_byte()?; - self.seek(SeekFrom::Current(-1))?; - Ok(b) - } - - fn read_buf(&mut self, buf: &mut [u8]) -> ByteIOResult<usize> { - let res = self.file.read(buf); - if let Err(_) = res { return Err(ByteIOError::ReadError); } - let sz = res.unwrap(); - if sz < buf.len() { self.eof = true; return Err(ByteIOError::EOF); } - Ok(sz) - } - - fn read_buf_some(&mut self, buf: &mut [u8]) -> ByteIOResult<usize> { - let res = self.file.read(buf); - if let Err(_) = res { return Err(ByteIOError::ReadError); } - let sz = res.unwrap(); - if sz < buf.len() { self.eof = true; } - Ok(sz) - } - - fn peek_buf(&mut self, buf: &mut [u8]) -> ByteIOResult<usize> { - let size = self.read_buf(buf)?; - self.seek(SeekFrom::Current(-(size as i64)))?; - Ok(size) - } - - #[allow(unused_variables)] - fn write_buf(&mut self, buf: &[u8]) -> ByteIOResult<()> { - Err(ByteIOError::NotImplemented) - } - - fn tell(&mut self) -> u64 { - self.file.seek(SeekFrom::Current(0)).unwrap() - } - - fn seek(&mut self, pos: SeekFrom) -> ByteIOResult<u64> { - let res = self.file.seek(pos); - match res { - Ok(r) => Ok(r), - Err(_) => Err(ByteIOError::SeekError), - } - } - - fn is_eof(&mut self) -> bool { - self.eof - } - - fn is_seekable(&mut self) -> bool { - true - } - - fn size(&mut self) -> i64 { - -1 - } -} - -#[allow(dead_code)] -pub struct ByteWriter<'a> { - io: &'a mut ByteIO, -} - -pub struct MemoryWriter<'a> { - buf: &'a mut [u8], - size: usize, - pos: usize, -} - -pub struct FileWriter { - file: File, -} - -impl<'a> ByteWriter<'a> { - pub fn new(io: &'a mut ByteIO) -> Self { ByteWriter { io: io } } - - pub fn write_buf(&mut self, buf: &[u8]) -> ByteIOResult<()> { - self.io.write_buf(buf) - } - - pub fn write_byte(&mut self, val: u8) -> ByteIOResult<()> { - let buf: [u8; 1] = [val]; - self.io.write_buf(&buf) - } - - pub fn write_u16be(&mut self, val: u16) -> ByteIOResult<()> { - let buf: [u8; 2] = [((val >> 8) & 0xFF) as u8, (val & 0xFF) as u8]; - self.io.write_buf(&buf) - } - - pub fn write_u16le(&mut self, val: u16) -> ByteIOResult<()> { - let buf: [u8; 2] = [(val & 0xFF) as u8, ((val >> 8) & 0xFF) as u8]; - self.io.write_buf(&buf) - } - - pub fn write_u24be(&mut self, val: u32) -> ByteIOResult<()> { - let buf: [u8; 3] = [((val >> 16) & 0xFF) as u8, ((val >> 8) & 0xFF) as u8, (val & 0xFF) as u8]; - self.write_buf(&buf) - } - - pub fn write_u24le(&mut self, val: u32) -> ByteIOResult<()> { - let buf: [u8; 3] = [(val & 0xFF) as u8, ((val >> 8) & 0xFF) as u8, ((val >> 16) & 0xFF) as u8]; - self.write_buf(&buf) - } - - pub fn write_u32be(&mut self, val: u32) -> ByteIOResult<()> { - self.write_u16be(((val >> 16) & 0xFFFF) as u16)?; - self.write_u16be((val & 0xFFFF) as u16) - } - - pub fn write_u32le(&mut self, val: u32) -> ByteIOResult<()> { - self.write_u16le((val & 0xFFFF) as u16)?; - self.write_u16le(((val >> 16) & 0xFFFF) as u16) - } - - pub fn write_u64be(&mut self, val: u64) -> ByteIOResult<()> { - self.write_u32be(((val >> 32) & 0xFFFFFFFF) as u32)?; - self.write_u32be((val & 0xFFFFFFFF) as u32) - } - - pub fn write_u64le(&mut self, val: u64) -> ByteIOResult<()> { - self.write_u32le((val & 0xFFFFFFFF) as u32)?; - self.write_u32le(((val >> 32) & 0xFFFFFFFF) as u32) - } - - pub fn tell(&mut self) -> u64 { - self.io.tell() - } - - pub fn seek(&mut self, pos: SeekFrom) -> ByteIOResult<u64> { - self.io.seek(pos) - } - - pub fn size_left(&mut self) -> i64 { - let sz = self.io.size(); - if sz == -1 { return -1; } - sz - (self.tell() as i64) - } -} - -impl<'a> MemoryWriter<'a> { - - pub fn new_write(buf: &'a mut [u8]) -> Self { - let len = buf.len(); - MemoryWriter { buf: buf, size: len, pos: 0 } - } - - fn real_seek(&mut self, pos: i64) -> ByteIOResult<u64> { - if pos < 0 || (pos as usize) > self.size { - return Err(ByteIOError::WrongRange) - } - self.pos = pos as usize; - Ok(pos as u64) - } -} - -impl<'a> ByteIO for MemoryWriter<'a> { - #[allow(unused_variables)] - fn read_byte(&mut self) -> ByteIOResult<u8> { - Err(ByteIOError::NotImplemented) - } - - #[allow(unused_variables)] - fn peek_byte(&mut self) -> ByteIOResult<u8> { - Err(ByteIOError::NotImplemented) - } - - #[allow(unused_variables)] - fn read_buf(&mut self, buf: &mut [u8]) -> ByteIOResult<usize> { - Err(ByteIOError::NotImplemented) - } - - #[allow(unused_variables)] - fn read_buf_some(&mut self, buf: &mut [u8]) -> ByteIOResult<usize> { - Err(ByteIOError::NotImplemented) - } - - #[allow(unused_variables)] - fn peek_buf(&mut self, buf: &mut [u8]) -> ByteIOResult<usize> { - Err(ByteIOError::NotImplemented) - } - - fn write_buf(&mut self, buf: &[u8]) -> ByteIOResult<()> { - if self.pos + buf.len() > self.size { return Err(ByteIOError::WriteError); } - for i in 0..buf.len() { - self.buf[self.pos + i] = buf[i]; - } - self.pos += buf.len(); - Ok(()) - } - - fn tell(&mut self) -> u64 { - self.pos as u64 - } - - fn seek(&mut self, pos: SeekFrom) -> ByteIOResult<u64> { - let cur_pos = self.pos as i64; - let cur_size = self.size as i64; - match pos { - SeekFrom::Start(x) => self.real_seek(x as i64), - SeekFrom::Current(x) => self.real_seek(cur_pos + x), - SeekFrom::End(x) => self.real_seek(cur_size + x), - } - } - - fn is_eof(&mut self) -> bool { - self.pos >= self.size - } - - fn is_seekable(&mut self) -> bool { - true - } - - fn size(&mut self) -> i64 { - self.buf.len() as i64 - } -} - -impl FileWriter { - pub fn new_write(file: File) -> Self { - FileWriter { file: file } - } -} - -impl ByteIO for FileWriter { - #[allow(unused_variables)] - fn read_byte(&mut self) -> ByteIOResult<u8> { - Err(ByteIOError::NotImplemented) - } - - #[allow(unused_variables)] - fn peek_byte(&mut self) -> ByteIOResult<u8> { - Err(ByteIOError::NotImplemented) - } - - #[allow(unused_variables)] - fn read_buf(&mut self, buf: &mut [u8]) -> ByteIOResult<usize> { - Err(ByteIOError::NotImplemented) - } - - #[allow(unused_variables)] - fn read_buf_some(&mut self, buf: &mut [u8]) -> ByteIOResult<usize> { - Err(ByteIOError::NotImplemented) - } - - #[allow(unused_variables)] - fn peek_buf(&mut self, buf: &mut [u8]) -> ByteIOResult<usize> { - Err(ByteIOError::NotImplemented) - } - - fn write_buf(&mut self, buf: &[u8]) -> ByteIOResult<()> { - match self.file.write_all(buf) { - Ok(()) => Ok(()), - Err(_) => Err(ByteIOError::WriteError), - } - } - - fn tell(&mut self) -> u64 { - self.file.seek(SeekFrom::Current(0)).unwrap() - } - - fn seek(&mut self, pos: SeekFrom) -> ByteIOResult<u64> { - let res = self.file.seek(pos); - match res { - Ok(r) => Ok(r), - Err(_) => Err(ByteIOError::SeekError), - } - } - - fn is_eof(&mut self) -> bool { - false - } - - fn is_seekable(&mut self) -> bool { - true - } - - fn size(&mut self) -> i64 { - -1 - } -} - -#[cfg(test)] -mod test { - use super::*; - use std::fs::File; - - #[test] - fn test_read() { - //const DATA : &'static [u8] = include_bytes!("../../assets/file"); - let buf: [u8; 64] = [1; 64]; - let mut mr = MemoryReader::new_read(&buf); - let mut reader = ByteReader::new(&mut mr); - assert_eq!(reader.read_byte().unwrap(), 0x01u8); - assert_eq!(reader.read_u16le().unwrap(), 0x0101u16); - assert_eq!(reader.read_u24le().unwrap(), 0x010101u32); - assert_eq!(reader.read_u32le().unwrap(), 0x01010101u32); - assert_eq!(reader.read_u64le().unwrap(), 0x0101010101010101u64); - let mut file = File::open("assets/MaoMacha.asx").unwrap(); - let mut fr = FileReader::new_read(&mut file); - let mut br2 = ByteReader::new(&mut fr); - assert_eq!(br2.read_byte().unwrap(), 0x30); - assert_eq!(br2.read_u24be().unwrap(), 0x26B275); - assert_eq!(br2.read_u24le().unwrap(), 0xCF668E); - assert_eq!(br2.read_u32be().unwrap(), 0x11A6D900); - assert_eq!(br2.read_u32le().unwrap(), 0xCE6200AA); - } - #[test] - fn test_write() { - let mut buf: [u8; 64] = [0; 64]; - { - let mut mw = MemoryWriter::new_write(&mut buf); - let mut bw = ByteWriter::new(&mut mw); - bw.write_byte(0x00).unwrap(); - bw.write_u16be(0x0102).unwrap(); - bw.write_u24be(0x030405).unwrap(); - bw.write_u32be(0x06070809).unwrap(); - bw.write_u64be(0x0A0B0C0D0E0F1011).unwrap(); - bw.write_byte(0x00).unwrap(); - bw.write_u16le(0x0201).unwrap(); - bw.write_u24le(0x050403).unwrap(); - bw.write_u32le(0x09080706).unwrap(); - bw.write_u64le(0x11100F0E0D0C0B0A).unwrap(); - assert_eq!(bw.size_left(), 28); - } - for i in 0..0x12 { - assert_eq!(buf[(i + 0x00) as usize], i); - assert_eq!(buf[(i + 0x12) as usize], i); - } - } -} diff --git a/src/io/codebook.rs b/src/io/codebook.rs deleted file mode 100644 index 78ef5ae..0000000 --- a/src/io/codebook.rs +++ /dev/null @@ -1,415 +0,0 @@ -use std::collections::HashMap; -use std::cmp::{max, min}; -use super::bitreader::BitReader; - -#[derive(Debug)] -pub enum CodebookError { - InvalidCodebook, - MemoryError, - InvalidCode, -} - -#[derive(Debug, Copy, Clone)] -pub enum CodebookMode { - MSB, - LSB, -} - -type CodebookResult<T> = Result<T, CodebookError>; - -pub struct FullCodebookDesc<S> { - code: u32, - bits: u8, - sym: S, -} - -pub struct ShortCodebookDesc { - code: u32, - bits: u8, -} - -pub trait CodebookDescReader<S> { - fn bits(&mut self, idx: usize) -> u8; - fn code(&mut self, idx: usize) -> u32; - fn sym (&mut self, idx: usize) -> S; - fn len (&mut self) -> usize; -} - -#[allow(dead_code)] -pub struct Codebook<S> { - table: Vec<u32>, - syms: Vec<S>, - lut_bits: u8, -} - -pub trait CodebookReader<S> { - fn read_cb(&mut self, cb: &Codebook<S>) -> CodebookResult<S>; -} - -const TABLE_FILL_VALUE: u32 = 0x7F; -const MAX_LUT_BITS: u8 = 10; - -fn fill_lut_msb(table: &mut Vec<u32>, off: usize, - code: u32, bits: u8, lut_bits: u8, symidx: u32, esc: bool) { - if !esc { - let fill_len = lut_bits - bits; - let fill_size = 1 << fill_len; - let fill_code = code << (lut_bits - bits); - let lut_value = (symidx << 8) | (bits as u32); - for j in 0..fill_size { - let idx = (fill_code + j) as usize; - table[idx + off] = lut_value; - } - } else { - let idx = (code as usize) + off; - table[idx] = (symidx << 8) | 0x80 | (bits as u32); - } -} - -fn fill_lut_lsb(table: &mut Vec<u32>, off: usize, - code: u32, bits: u8, lut_bits: u8, symidx: u32, esc: bool) { - if !esc { - let fill_len = lut_bits - bits; - let fill_size = 1 << fill_len; - let fill_code = code; - let step = lut_bits - fill_len; - for j in 0..fill_size { - let idx = (fill_code + (j << step)) as usize; - table[idx + off] = (symidx << 8) | (bits as u32); - } - } else { - let idx = (code as usize) + off; - table[idx] = (symidx << 8) | 0x80 | (bits as u32); - } -} - -fn fill_lut(table: &mut Vec<u32>, mode: CodebookMode, - off: usize, code: u32, bits: u8, lut_bits: u8, symidx: u32, esc: bool) -> bool { - match mode { - CodebookMode::MSB => fill_lut_msb(table, off, code, bits, lut_bits, symidx, esc), - CodebookMode::LSB => fill_lut_lsb(table, off, code, bits, lut_bits, symidx, esc), - }; - bits > lut_bits -} - -fn resize_table(table: &mut Vec<u32>, bits: u8) -> CodebookResult<u32> { - let add_size = (1 << bits) as usize; - table.reserve(add_size); - let cur_off = table.len() as u32; - let new_size = table.len() + add_size; - if table.capacity() < new_size { return Err(CodebookError::MemoryError); } - table.resize(new_size, TABLE_FILL_VALUE); - Ok(cur_off) -} - - -fn extract_lut_part(code: u32, bits: u8, lut_bits: u8, mode: CodebookMode) -> u32 { - match mode { - CodebookMode::MSB => code >> (bits - lut_bits), - CodebookMode::LSB => code & ((1 << lut_bits) - 1), - } -} - -fn extract_esc_part(code: u32, bits: u8, lut_bits: u8, mode: CodebookMode) -> u32 { - match mode { - CodebookMode::MSB => code & ((1 << (bits - lut_bits)) - 1), - CodebookMode::LSB => code >> lut_bits, - } -} - -#[derive(Clone,Copy)] -struct Code { - code: u32, - bits: u8, - idx: usize, -} - -struct CodeBucket { - maxlen: u8, - offset: usize, - codes: Vec<Code>, -} - -impl CodeBucket { - fn new() -> Self { - CodeBucket { maxlen: 0, offset: 0, codes: Vec::new() } - } - fn add_code(&mut self, c: Code) { - if c.bits > self.maxlen { self.maxlen = c.bits; } - self.codes.push(c); - } -} - -type EscapeCodes = HashMap<u32, CodeBucket>; - -fn add_esc_code(cc: &mut EscapeCodes, key: u32, code: u32, bits: u8, idx: usize) { - if !cc.contains_key(&key) { cc.insert(key, CodeBucket::new()); } - let b = cc.get_mut(&key); - if let Some(bucket) = b { - bucket.add_code(Code {code: code, bits: bits, idx: idx }); - } else { panic!("no bucket when expected!"); } -} - -fn build_esc_lut(table: &mut Vec<u32>, - mode: CodebookMode, - bucket: &CodeBucket) -> CodebookResult<()> { - let mut escape_list: EscapeCodes = HashMap::new(); - let maxlen = if bucket.maxlen > MAX_LUT_BITS { MAX_LUT_BITS } else { bucket.maxlen }; - - for code in &bucket.codes { - let bits = code.bits; - if code.bits <= MAX_LUT_BITS { - fill_lut(table, mode, bucket.offset, code.code, bits, - maxlen, code.idx as u32, false); - } else { - let ckey = extract_lut_part(code.code, bits, MAX_LUT_BITS, mode); - let cval = extract_esc_part(code.code, bits, MAX_LUT_BITS, mode); - add_esc_code(&mut escape_list, ckey, cval, bits - MAX_LUT_BITS, code.idx); - } - } - - let cur_offset = bucket.offset; - for (ckey, sec_bucket) in &mut escape_list { - let key = *ckey as u32; - let maxlen = min(sec_bucket.maxlen, MAX_LUT_BITS); - let new_off = resize_table(table, maxlen)?; - fill_lut(table, mode, cur_offset, key, maxlen, - MAX_LUT_BITS, new_off, true); - sec_bucket.offset = new_off as usize; - } - - for (_, sec_bucket) in &escape_list { - build_esc_lut(table, mode, sec_bucket)?; - } - - Ok(()) -} - -impl<S: Copy> Codebook<S> { - - pub fn new(cb: &mut CodebookDescReader<S>, mode: CodebookMode) -> CodebookResult<Self> { - let mut maxbits = 0; - let mut nnz = 0; - let mut escape_list: EscapeCodes = HashMap::new(); - - let mut symidx: usize = 0; - for i in 0..cb.len() { - let bits = cb.bits(i); - if bits > 0 { - nnz = nnz + 1; - if cb.code(i) >= (1 << bits) { - return Err(CodebookError::InvalidCodebook); - } - } - maxbits = max(bits, maxbits); - if bits > MAX_LUT_BITS { - let code = cb.code(i); - let ckey = extract_lut_part(code, bits, MAX_LUT_BITS, mode); - let cval = extract_esc_part(code, bits, MAX_LUT_BITS, mode); - add_esc_code(&mut escape_list, ckey, cval, bits - MAX_LUT_BITS, symidx); - } - if bits > 0 { symidx = symidx + 1; } - } - if maxbits == 0 { return Err(CodebookError::InvalidCodebook); } - - if maxbits > MAX_LUT_BITS { maxbits = MAX_LUT_BITS; } - - let tab_len = 1 << maxbits; - let mut table: Vec<u32> = Vec::with_capacity(tab_len); - let mut syms: Vec<S> = Vec::with_capacity(nnz); - if table.capacity() < tab_len { return Err(CodebookError::MemoryError); } - if syms.capacity() < nnz { return Err(CodebookError::MemoryError); } - table.resize(tab_len, TABLE_FILL_VALUE); - - let mut symidx: u32 = 0; - for i in 0..cb.len() { - let bits = cb.bits(i); - let code = cb.code(i); - if bits == 0 { continue; } - if bits <= MAX_LUT_BITS { - fill_lut(&mut table, mode, 0, code, bits, maxbits, symidx, false); - } else { - let ckey = extract_lut_part(code, bits, MAX_LUT_BITS, mode) as usize; - if table[ckey] == TABLE_FILL_VALUE { - let key = ckey as u32; - if let Some(bucket) = escape_list.get_mut(&key) { - let maxlen = min(bucket.maxlen, MAX_LUT_BITS); - let new_off = resize_table(&mut table, maxlen)?; - fill_lut(&mut table, mode, 0, key, maxlen, MAX_LUT_BITS, new_off, true); - bucket.offset = new_off as usize; - } - } - } - symidx = symidx + 1; - } - - for (_, bucket) in &escape_list { - build_esc_lut(&mut table, mode, &bucket)?; - } - - for i in 0..cb.len() { - if cb.bits(i) > 0 { - syms.push(cb.sym(i)); - } - } - - Ok(Codebook { table: table, syms: syms, lut_bits: maxbits }) - } -} - -impl<'a, S: Copy> CodebookReader<S> for BitReader<'a> { - #[allow(unused_variables)] - fn read_cb(&mut self, cb: &Codebook<S>) -> CodebookResult<S> { - let mut esc = true; - let mut idx = 0; - let mut lut_bits = cb.lut_bits; - while esc { - let lut_idx = (self.peek(lut_bits) as usize) + (idx as usize); - if cb.table[lut_idx] == TABLE_FILL_VALUE { return Err(CodebookError::InvalidCode); } - let bits = cb.table[lut_idx] & 0x7F; - esc = (cb.table[lut_idx] & 0x80) != 0; - idx = (cb.table[lut_idx] >> 8) as usize; - if (bits as isize) > self.left() { - return Err(CodebookError::InvalidCode); - } - let skip_bits = if esc { lut_bits as u32 } else { bits }; - if let Err(_) = self.skip(skip_bits as u32) {} - lut_bits = bits as u8; - } - Ok(cb.syms[idx]) - } -} - -pub struct FullCodebookDescReader<S> { - data: Vec<FullCodebookDesc<S>>, -} - -impl<S> FullCodebookDescReader<S> { - pub fn new(data: Vec<FullCodebookDesc<S>>) -> Self { - FullCodebookDescReader { data: data } - } -} - -impl<S: Copy> CodebookDescReader<S> for FullCodebookDescReader<S> { - fn bits(&mut self, idx: usize) -> u8 { self.data[idx].bits } - fn code(&mut self, idx: usize) -> u32 { self.data[idx].code } - fn sym (&mut self, idx: usize) -> S { self.data[idx].sym } - fn len(&mut self) -> usize { self.data.len() } -} - -pub struct ShortCodebookDescReader { - data: Vec<ShortCodebookDesc>, -} - -impl ShortCodebookDescReader { - pub fn new(data: Vec<ShortCodebookDesc<>>) -> Self { - ShortCodebookDescReader { data: data } - } -} - -impl CodebookDescReader<u32> for ShortCodebookDescReader { - fn bits(&mut self, idx: usize) -> u8 { self.data[idx].bits } - fn code(&mut self, idx: usize) -> u32 { self.data[idx].code } - fn sym (&mut self, idx: usize) -> u32 { idx as u32 } - fn len(&mut self) -> usize { self.data.len() } -} - -pub struct TableCodebookDescReader<CodeType:'static, IndexType:'static> { - bits: &'static [u8], - codes: &'static [CodeType], - idx_map: fn(usize) -> IndexType, -} - -impl<'a, CodeType, IndexType> TableCodebookDescReader<CodeType, IndexType> { - pub fn new(codes: &'static [CodeType], bits: &'static [u8], idx_map: fn(usize) -> IndexType) -> Self { - Self { bits, codes, idx_map } - } -} -impl<CodeType: Copy+Into<u32>, IndexType> CodebookDescReader<IndexType> for TableCodebookDescReader<CodeType, IndexType> -{ - fn bits(&mut self, idx: usize) -> u8 { self.bits[idx] } - fn code(&mut self, idx: usize) -> u32 { self.codes[idx].into() } - fn sym (&mut self, idx: usize) -> IndexType { (self.idx_map)(idx) } - fn len(&mut self) -> usize { self.bits.len() } -} - -#[cfg(test)] -mod test { - use super::*; - use crate::io::bitreader::*; - - #[test] - fn test_cb() { - const BITS: [u8; 2] = [0b01011011, 0b10111100]; - let cb_desc: Vec<FullCodebookDesc<i8>> = vec!( - FullCodebookDesc { code: 0b0, bits: 1, sym: 16 }, - FullCodebookDesc { code: 0b10, bits: 2, sym: -3 }, - FullCodebookDesc { code: 0b110, bits: 3, sym: 42 }, - FullCodebookDesc { code: 0b1110, bits: 4, sym: -42 } - ); - let buf = &BITS; - let mut br = BitReader::new(buf, buf.len(), BitReaderMode::BE); - let mut cfr = FullCodebookDescReader::new(cb_desc); - let cb = Codebook::new(&mut cfr, CodebookMode::MSB).unwrap(); - assert_eq!(br.read_cb(&cb).unwrap(), 16); - assert_eq!(br.read_cb(&cb).unwrap(), -3); - assert_eq!(br.read_cb(&cb).unwrap(), 42); - assert_eq!(br.read_cb(&cb).unwrap(), -42); - let ret = br.read_cb(&cb); - if let Err(e) = ret { - assert_eq!(e as i32, CodebookError::InvalidCode as i32); - } else { - assert_eq!(0, 1); - } - - let scb_desc: Vec<ShortCodebookDesc> = vec!( - ShortCodebookDesc { code: 0b0, bits: 1 }, - ShortCodebookDesc { code: 0, bits: 0 }, - ShortCodebookDesc { code: 0b10, bits: 2 }, - ShortCodebookDesc { code: 0, bits: 0 }, - ShortCodebookDesc { code: 0, bits: 0 }, - ShortCodebookDesc { code: 0b110, bits: 3 }, - ShortCodebookDesc { code: 0, bits: 0 }, - ShortCodebookDesc { code: 0b11100, bits: 5 }, - ShortCodebookDesc { code: 0b11101, bits: 5 }, - ShortCodebookDesc { code: 0b1111010, bits: 7 }, - ShortCodebookDesc { code: 0b1111011, bits: 7 }, - ShortCodebookDesc { code: 0b1111110, bits: 7 }, - ShortCodebookDesc { code: 0b11111111, bits: 8 } - ); - let mut br2 = BitReader::new(buf, buf.len(), BitReaderMode::BE); - let mut cfr = ShortCodebookDescReader::new(scb_desc); - let cb = Codebook::new(&mut cfr, CodebookMode::MSB).unwrap(); - assert_eq!(br2.read_cb(&cb).unwrap(), 0); - assert_eq!(br2.read_cb(&cb).unwrap(), 2); - assert_eq!(br2.read_cb(&cb).unwrap(), 5); - assert_eq!(br2.read_cb(&cb).unwrap(), 8); - - assert_eq!(reverse_bits(0b0000_0101_1011_1011_1101_1111_0111_1111, 32), - 0b1111_1110_1111_1011_1101_1101_1010_0000); - - const BITS_LE: [u8; 3] = [0b11101111, 0b01110010, 0b01]; - let buf = &BITS_LE; - let scble_desc: Vec<ShortCodebookDesc> = vec!( - ShortCodebookDesc { code: 0b00, bits: 2 }, - ShortCodebookDesc { code: 0, bits: 0 }, - ShortCodebookDesc { code: 0b01, bits: 2 }, - ShortCodebookDesc { code: 0, bits: 0 }, - ShortCodebookDesc { code: 0, bits: 0 }, - ShortCodebookDesc { code: 0b011, bits: 3 }, - ShortCodebookDesc { code: 0, bits: 0 }, - ShortCodebookDesc { code: 0b10111, bits: 5 }, - ShortCodebookDesc { code: 0b00111, bits: 5 }, - ShortCodebookDesc { code: 0b0101111, bits: 7 }, - ShortCodebookDesc { code: 0b0111111, bits: 7 }, - ShortCodebookDesc { code: 0b1011101111, bits: 10 } - ); - let mut brl = BitReader::new(buf, buf.len(), BitReaderMode::LE); - let mut cfr = ShortCodebookDescReader::new(scble_desc); - let cb = Codebook::new(&mut cfr, CodebookMode::LSB).unwrap(); - assert_eq!(brl.read_cb(&cb).unwrap(), 11); - assert_eq!(brl.read_cb(&cb).unwrap(), 0); - assert_eq!(brl.read_cb(&cb).unwrap(), 7); - assert_eq!(brl.read_cb(&cb).unwrap(), 0); - } -} diff --git a/src/io/intcode.rs b/src/io/intcode.rs deleted file mode 100644 index 8d87920..0000000 --- a/src/io/intcode.rs +++ /dev/null @@ -1,145 +0,0 @@ -use crate::io::bitreader::{BitReader, BitReaderError, BitReaderResult}; - -#[derive(Debug)] -pub enum UintCodeType { - UnaryOnes, - UnaryZeroes, - Unary012, - Unary210, - LimitedUnary(u32, u32), - Golomb(u8), - Rice(u8), - Gamma, - GammaP, -} - -pub enum IntCodeType { - Golomb(u8), - Rice(u8), - Gamma, - GammaP, -} - -pub trait IntCodeReader { - fn read_code(&mut self, t: UintCodeType) -> BitReaderResult<u32>; - fn read_code_signed(&mut self, t: IntCodeType) -> BitReaderResult<i32>; -} - -fn read_unary(br: &mut BitReader, terminator: u32) -> BitReaderResult<u32> { - let mut res: u32 = 0; - loop { - if br.read(1)? == terminator { return Ok(res); } - res = res + 1; - } -} - -fn read_unary_lim(br: &mut BitReader, len: u32, terminator: u32) -> BitReaderResult<u32> { - let mut res: u32 = 0; - loop { - if br.read(1)? == terminator { return Ok(res); } - res = res + 1; - if res == len { return Ok(res); } - } -} - -fn read_unary210(br: &mut BitReader) -> BitReaderResult<u32> { - let val = read_unary_lim(br, 2, 0)?; - Ok(2 - val) -} - -fn read_golomb(br: &mut BitReader, m: u8) -> BitReaderResult<u32> { - if m == 0 { return Err(BitReaderError::InvalidValue); } - let nbits = (8 - m.leading_zeros()) as u8; - if (m & (m - 1)) == 0 { return read_rice(br, nbits); } - let cutoff = ((1 << nbits) - m) as u32; - let pfx = read_unary(br, 0)?; - let tail = br.read(nbits - 1)?; - if tail < cutoff { - let res = pfx * (m as u32) + tail; - Ok (res) - } else { - let add = br.read(1)?; - let res = pfx * (m as u32) + (tail - cutoff) * 2 + add + cutoff; - Ok (res) - } -} - -fn read_rice(br: &mut BitReader, k: u8) -> BitReaderResult<u32> { - let pfx = read_unary(br, 1)?; - let ret = (pfx << k) + br.read(k)?; - Ok(ret) -} - -fn read_gamma(br: &mut BitReader) -> BitReaderResult<u32> { - let mut ret = 1; - while br.read(1)? != 1 { - ret = (ret << 1) | br.read(1)?; - } - Ok(ret - 1) -} - -fn read_gammap(br: &mut BitReader) -> BitReaderResult<u32> { - let pfx = read_unary(br, 1)?; - if pfx > 32 { return Err(BitReaderError::InvalidValue); } - let ret = (1 << pfx) + br.read(pfx as u8)?; - Ok(ret) -} - -fn uval_to_sval0mp(uval: u32) -> i32 { - if (uval & 1) != 0 { -((uval >> 1) as i32) } - else { (uval >> 1) as i32 } -} - -fn uval_to_sval0pm(uval: u32) -> i32 { - if (uval & 1) != 0 { ((uval + 1) >> 1) as i32 } - else { -((uval >> 1) as i32) } -} - -impl<'a> IntCodeReader for BitReader<'a> { - #[inline(always)] - fn read_code(&mut self, t: UintCodeType) -> BitReaderResult<u32> { - match t { - UintCodeType::UnaryOnes => read_unary(self, 0), - UintCodeType::UnaryZeroes => read_unary(self, 1), - UintCodeType::LimitedUnary(len, term) => read_unary_lim(self, len, term), - UintCodeType::Unary012 => read_unary_lim(self, 2, 0), - UintCodeType::Unary210 => read_unary210(self), - UintCodeType::Golomb(m) => read_golomb(self, m), - UintCodeType::Rice(k) => read_rice(self, k), - UintCodeType::Gamma => read_gamma(self), - UintCodeType::GammaP => read_gammap(self), - } - } - #[allow(unused_variables)] - fn read_code_signed(&mut self, t: IntCodeType) -> BitReaderResult<i32> { - let uval = - match t { - IntCodeType::Golomb(m) => read_golomb(self, m)?, - IntCodeType::Rice(k) => read_rice(self, k)?, - IntCodeType::Gamma => read_gamma(self)?, - IntCodeType::GammaP => read_gammap(self)?, - }; - match t { - IntCodeType::Golomb(m) => Ok(uval_to_sval0mp(uval)), - IntCodeType::Rice(k) => Ok(uval_to_sval0mp(uval)), - IntCodeType::Gamma => Ok(uval_to_sval0pm(uval)), - IntCodeType::GammaP => Ok(uval_to_sval0pm(uval)), - } - } -} - -#[cfg(test)] -mod test { - use super::*; - use crate::io::bitreader::*; - - #[test] - fn int_codes() { - const GDATA: [u8; 6] = [0b000_001_01, 0b0_0110_011, 0b1_1000_100, 0b1_1010_101, 0b10_10111_1, 0b1000_0000]; - let src = &GDATA; - let mut br = BitReader::new(src, src.len(), BitReaderMode::BE); - for i in 0..11 { - assert_eq!(br.read_code(UintCodeType::Golomb(5)).unwrap(), i); - } - } -} diff --git a/src/io/mod.rs b/src/io/mod.rs deleted file mode 100644 index bfe78f6..0000000 --- a/src/io/mod.rs +++ /dev/null @@ -1,5 +0,0 @@ -pub mod bitreader; -pub mod codebook; -pub mod intcode; -pub mod byteio; - diff --git a/src/lib.rs b/src/lib.rs deleted file mode 100644 index 07c451e..0000000 --- a/src/lib.rs +++ /dev/null @@ -1,17 +0,0 @@ -#[cfg(feature="decoders")] -pub mod codecs; - -#[cfg(feature="demuxers")] -pub mod demuxers; - -pub mod formats; -pub mod frame; -pub mod io; -pub mod register; -pub mod detect; - -#[cfg(feature="dsp")] -pub mod dsp; - -#[cfg(test)] -mod test; diff --git a/src/register.rs b/src/register.rs deleted file mode 100644 index b0bce3a..0000000 --- a/src/register.rs +++ /dev/null @@ -1,196 +0,0 @@ -use std::fmt; - -#[derive(Debug,Clone,Copy,PartialEq)] -#[allow(dead_code)] -pub enum CodecType { - Video, - Audio, - Subtitles, - Data, - None, -} - -impl fmt::Display for CodecType { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - match *self { - CodecType::Video => write!(f, "Video"), - CodecType::Audio => write!(f, "Audio"), - CodecType::Subtitles => write!(f, "Subtitles"), - CodecType::Data => write!(f, "Data"), - CodecType::None => write!(f, "-"), - } - } -} - -const CODEC_CAP_INTRAONLY:u32 = 0x000001; -const CODEC_CAP_LOSSLESS:u32 = 0x000002; -const CODEC_CAP_REORDER:u32 = 0x000004; -const CODEC_CAP_HYBRID:u32 = 0x000008; -const CODEC_CAP_SCALABLE:u32 = 0x000010; - -#[derive(Clone)] -pub struct CodecDescription { - name: &'static str, - fname: &'static str, - ctype: CodecType, - caps: u32, -} - -impl CodecDescription { - pub fn get_name(&self) -> &'static str { self.name } - pub fn get_full_name(&self) -> &'static str { self.fname } - pub fn get_codec_type(&self) -> CodecType { self.ctype } - pub fn is_intraonly(&self) -> bool { (self.caps & CODEC_CAP_INTRAONLY) != 0 } - pub fn is_lossless(&self) -> bool { (self.caps & CODEC_CAP_LOSSLESS) != 0 } - pub fn has_reorder(&self) -> bool { (self.caps & CODEC_CAP_REORDER) != 0 } - pub fn is_hybrid(&self) -> bool { (self.caps & CODEC_CAP_HYBRID) != 0 } - pub fn is_scalable(&self) -> bool { (self.caps & CODEC_CAP_SCALABLE) != 0 } -} - -impl fmt::Display for CodecDescription { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - let mut out = format!("{}", self.fname); - if self.caps != 0 { - let mut capfmt = "".to_string(); - if (self.caps & CODEC_CAP_INTRAONLY) != 0 { - capfmt = format!("{} Intra-only", capfmt); - } - if (self.caps & CODEC_CAP_LOSSLESS) != 0 { - capfmt = format!("{} Lossless", capfmt); - } - if (self.caps & CODEC_CAP_REORDER) != 0 { - capfmt = format!("{} Frame reorder", capfmt); - } - if (self.caps & CODEC_CAP_HYBRID) != 0 { - capfmt = format!("{} Can be lossy and lossless", capfmt); - } - if (self.caps & CODEC_CAP_SCALABLE) != 0 { - capfmt = format!("{} Scalable", capfmt); - } - out = format!("{} ({})", out, capfmt); - } - write!(f, "{}", out) - } -} - -macro_rules! desc { - (video; $n:expr, $fn:expr) => ({ - CodecDescription{ name: $n, fname: $fn, ctype: CodecType::Video, - caps: 0 } - }); - (video; $n:expr, $fn:expr, $c:expr) => ({ - CodecDescription{ name: $n, fname: $fn, ctype: CodecType::Video, - caps: $c } - }); - (video-ll; $n:expr, $fn:expr) => ({ - CodecDescription{ name: $n, fname: $fn, ctype: CodecType::Video, - caps: CODEC_CAP_LOSSLESS | CODEC_CAP_INTRAONLY } - }); - (video-llp; $n:expr, $fn:expr) => ({ - CodecDescription{ name: $n, fname: $fn, ctype: CodecType::Video, - caps: CODEC_CAP_LOSSLESS } - }); - (video-im; $n:expr, $fn:expr) => ({ - CodecDescription{ name: $n, fname: $fn, ctype: CodecType::Video, - caps: CODEC_CAP_INTRAONLY } - }); - (video-modern; $n:expr, $fn:expr) => ({ - CodecDescription{ name: $n, fname: $fn, ctype: CodecType::Video, - caps: CODEC_CAP_REORDER | CODEC_CAP_HYBRID } - }); - (audio; $n:expr, $fn:expr) => ({ - CodecDescription{ name: $n, fname: $fn, ctype: CodecType::Audio, - caps: 0 } - }); - (audio-ll; $n:expr, $fn:expr) => ({ - CodecDescription{ name: $n, fname: $fn, ctype: CodecType::Audio, - caps: CODEC_CAP_LOSSLESS | CODEC_CAP_INTRAONLY } - }); -} - -pub fn get_codec_description(name: &str) -> Option<&'static CodecDescription> { - for reg in CODEC_REGISTER { - if reg.name == name { - return Some(reg); - } - } - None -} - -static CODEC_REGISTER: &'static [CodecDescription] = &[ - desc!(video-im; "indeo1", "Intel Raw IF09"), - desc!(video-im; "indeo2", "Intel Indeo 2"), - desc!(video; "indeo3", "Intel Indeo 3"), - desc!(video; "indeo4", "Intel Indeo 4", CODEC_CAP_REORDER | CODEC_CAP_SCALABLE), - desc!(video; "indeo5", "Intel Indeo 5", CODEC_CAP_REORDER | CODEC_CAP_SCALABLE), - desc!(video; "intel263", "Intel I263", CODEC_CAP_REORDER), - desc!(audio; "iac", "Intel Indeo audio"), - desc!(audio; "imc", "Intel Music Coder"), - - desc!(video; "realvideo1", "Real Video 1"), - desc!(video; "realvideo2", "Real Video 2"), - desc!(video; "realvideo3", "Real Video 3", CODEC_CAP_REORDER), - desc!(video; "realvideo4", "Real Video 4", CODEC_CAP_REORDER), - desc!(video; "realvideo6", "Real Video 6", CODEC_CAP_REORDER), - desc!(video; "clearvideo", "ClearVideo"), - desc!(video; "clearvideo_rm", "ClearVideo"), - desc!(audio; "ra14.4", "RealAudio 14.4"), - desc!(audio; "ra28.8", "RealAudio 28.8"), - desc!(audio; "cook", "RealAudio Cooker"), - desc!(audio; "ralf", "RealAudio Lossless"), - desc!(audio; "aac", "AAC"), - desc!(audio; "ac3", "ETSI TS 102 366"), - desc!(audio; "atrac3", "Sony Atrac3"), - desc!(audio; "sipro", "Sipro Labs ADPCM"), -]; - -static AVI_VIDEO_CODEC_REGISTER: &'static [(&[u8;4], &str)] = &[ - (b"IF09", "indeo1"), - (b"RT21", "indeo2"), - (b"IV31", "indeo3"), - (b"IV32", "indeo3"), - (b"IV41", "indeo4"), - (b"IV50", "indeo5"), - (b"I263", "intel263"), - - (b"UCOD", "clearvideo"), -]; - -static WAV_CODEC_REGISTER: &'static [(u16, &str)] = &[ - (0x0000, "pcm"), - (0x0001, "pcm"), - (0x0003, "pcm"), - (0x0401, "imc"), - (0x0402, "iac"), -]; - -pub fn find_codec_from_avi_fourcc(fcc: &[u8;4]) -> Option<&'static str> { - for i in 0..AVI_VIDEO_CODEC_REGISTER.len() { - let (fourcc, name) = AVI_VIDEO_CODEC_REGISTER[i]; - if fourcc == fcc { return Some(name); } - } - None -} - -pub fn find_codec_from_wav_twocc(tcc: u16) -> Option<&'static str> { - for i in 0..WAV_CODEC_REGISTER.len() { - let (twocc, name) = WAV_CODEC_REGISTER[i]; - if twocc == tcc { return Some(name); } - } - None -} - -#[cfg(test)] -mod test { - use super::*; - - #[test] - fn test_register() { - let c1 = find_codec_from_avi_fourcc(b"IV41").unwrap(); - let c2 = find_codec_from_wav_twocc(0x401).unwrap(); - println!("found {} and {}", c1, c2); - let cd1 = get_codec_description(c1).unwrap(); - let cd2 = get_codec_description(c2).unwrap(); - println!("got {} and {}", cd1, cd2); - } -} diff --git a/src/test/dec_video.rs b/src/test/dec_video.rs deleted file mode 100644 index 4a18191..0000000 --- a/src/test/dec_video.rs +++ /dev/null @@ -1,212 +0,0 @@ -use std::fs::File; -use std::io::prelude::*; -use crate::frame::*; -use crate::codecs::*; -use crate::demuxers::*; -use crate::io::byteio::*; -use super::wavwriter::WavWriter; - -fn write_pgmyuv(pfx: &str, strno: usize, num: u64, frmref: NAFrameRef) { - let frm = frmref.borrow(); - if let NABufferType::None = frm.get_buffer() { return; } - let name = format!("assets/{}out{:02}_{:06}.pgm", pfx, strno, num); - let mut ofile = File::create(name).unwrap(); - let buf = frm.get_buffer().get_vbuf().unwrap(); - let (w, h) = buf.get_dimensions(0); - let (w2, h2) = buf.get_dimensions(1); - let has_alpha = buf.get_info().get_format().has_alpha(); - let tot_h; - if has_alpha { - tot_h = h * 2 + h2; - } else { - tot_h = h + h2; - } - let hdr = format!("P5\n{} {}\n255\n", w, tot_h); - ofile.write_all(hdr.as_bytes()).unwrap(); - let dta = buf.get_data(); - let ls = buf.get_stride(0); - let mut idx = 0; - let mut idx2 = w; - let mut pad: Vec<u8> = Vec::with_capacity((w - w2 * 2) / 2); - pad.resize((w - w2 * 2) / 2, 0xFF); - for _ in 0..h { - let line = &dta[idx..idx2]; - ofile.write_all(line).unwrap(); - idx += ls; - idx2 += ls; - } - let mut base1 = buf.get_offset(1); - let stride1 = buf.get_stride(1); - let mut base2 = buf.get_offset(2); - let stride2 = buf.get_stride(2); - for _ in 0..h2 { - let bend1 = base1 + w2; - let line = &dta[base1..bend1]; - ofile.write_all(line).unwrap(); - ofile.write_all(pad.as_slice()).unwrap(); - - let bend2 = base2 + w2; - let line = &dta[base2..bend2]; - ofile.write_all(line).unwrap(); - ofile.write_all(pad.as_slice()).unwrap(); - - base1 += stride1; - base2 += stride2; - } - if has_alpha { - let ls = buf.get_stride(3); - let mut idx = buf.get_offset(3); - let mut idx2 = idx + w; - for _ in 0..h { - let line = &dta[idx..idx2]; - ofile.write_all(line).unwrap(); - idx += ls; - idx2 += ls; - } - } -} - -fn write_palppm(pfx: &str, strno: usize, num: u64, frmref: NAFrameRef) { - let frm = frmref.borrow(); - let name = format!("assets/{}out{:02}_{:06}.ppm", pfx, strno, num); - let mut ofile = File::create(name).unwrap(); - let buf = frm.get_buffer().get_vbuf().unwrap(); - let (w, h) = buf.get_dimensions(0); - let paloff = buf.get_offset(1); - let hdr = format!("P6\n{} {}\n255\n", w, h); - ofile.write_all(hdr.as_bytes()).unwrap(); - let dta = buf.get_data(); - let ls = buf.get_stride(0); - let mut idx = 0; - let mut line: Vec<u8> = Vec::with_capacity(w * 3); - line.resize(w * 3, 0); - for _ in 0..h { - let src = &dta[idx..(idx+w)]; - for x in 0..w { - let pix = src[x] as usize; - line[x * 3 + 0] = dta[paloff + pix * 3 + 2]; - line[x * 3 + 1] = dta[paloff + pix * 3 + 1]; - line[x * 3 + 2] = dta[paloff + pix * 3 + 0]; - } - ofile.write_all(line.as_slice()).unwrap(); - idx += ls; - } -} - -/*fn open_wav_out(pfx: &str, strno: usize) -> WavWriter { - let name = format!("assets/{}out{:02}.wav", pfx, strno); - let mut file = File::create(name).unwrap(); - let mut fw = FileWriter::new_write(&mut file); - let mut wr = ByteWriter::new(&mut fw); - WavWriter::new(&mut wr) -}*/ - -pub fn test_file_decoding(demuxer: &str, name: &str, limit: Option<u64>, - decode_video: bool, decode_audio: bool, - video_pfx: Option<&str>) { - let dmx_f = find_demuxer(demuxer).unwrap(); - let mut file = File::open(name).unwrap(); - let mut fr = FileReader::new_read(&mut file); - let mut br = ByteReader::new(&mut fr); - let mut dmx = create_demuxer(dmx_f, &mut br).unwrap(); - - let mut decs: Vec<Option<Box<NADecoder>>> = Vec::new(); - for i in 0..dmx.get_num_streams() { - let s = dmx.get_stream(i).unwrap(); - let info = s.get_info(); - let decfunc = find_decoder(info.get_name()); - if let Some(df) = decfunc { - if (decode_video && info.is_video()) || (decode_audio && info.is_audio()) { - let mut dec = (df)(); - dec.init(info).unwrap(); - decs.push(Some(dec)); - } else { - decs.push(None); - } - } else { - decs.push(None); - } - } - - loop { - let pktres = dmx.get_frame(); - if let Err(e) = pktres { - if e == DemuxerError::EOF { break; } - panic!("error"); - } - let pkt = pktres.unwrap(); - if limit.is_some() && pkt.get_pts().is_some() { - if pkt.get_pts().unwrap() > limit.unwrap() { break; } - } - let streamno = pkt.get_stream().get_id() as usize; - if let Some(ref mut dec) = decs[streamno] { - let frm = dec.decode(&pkt).unwrap(); - if pkt.get_stream().get_info().is_video() && video_pfx.is_some() && frm.borrow().get_frame_type() != FrameType::Skip { - let pfx = video_pfx.unwrap(); - let pts = if let Some(fpts) = frm.borrow().get_pts() { fpts } else { pkt.get_pts().unwrap() }; - if frm.borrow().get_buffer().get_vbuf().unwrap().get_info().get_format().is_paletted() { - write_palppm(pfx, streamno, pts, frm); - } else { - write_pgmyuv(pfx, streamno, pts, frm); - } - } - } - } -} - -pub fn test_decode_audio(demuxer: &str, name: &str, limit: Option<u64>, audio_pfx: &str) { - let dmx_f = find_demuxer(demuxer).unwrap(); - let mut file = File::open(name).unwrap(); - let mut fr = FileReader::new_read(&mut file); - let mut br = ByteReader::new(&mut fr); - let mut dmx = create_demuxer(dmx_f, &mut br).unwrap(); - - let mut decs: Vec<Option<Box<NADecoder>>> = Vec::new(); - for i in 0..dmx.get_num_streams() { - let s = dmx.get_stream(i).unwrap(); - let info = s.get_info(); - let decfunc = find_decoder(info.get_name()); - if let Some(df) = decfunc { - if info.is_audio() { - let mut dec = (df)(); - dec.init(info).unwrap(); - decs.push(Some(dec)); - } else { - decs.push(None); - } - } else { - decs.push(None); - } - } - - let name = format!("assets/{}out.wav", audio_pfx); - let file = File::create(name).unwrap(); - let mut fw = FileWriter::new_write(file); - let mut wr = ByteWriter::new(&mut fw); - let mut wwr = WavWriter::new(&mut wr); - let mut wrote_header = false; - - loop { - let pktres = dmx.get_frame(); - if let Err(e) = pktres { - if e == DemuxerError::EOF { break; } - panic!("error"); - } - let pkt = pktres.unwrap(); - if limit.is_some() && pkt.get_pts().is_some() { - if pkt.get_pts().unwrap() > limit.unwrap() { break; } - } - let streamno = pkt.get_stream().get_id() as usize; - if let Some(ref mut dec) = decs[streamno] { - let frm_ = dec.decode(&pkt).unwrap(); - let frm = frm_.borrow(); - if frm.get_info().is_audio() { - if !wrote_header { - wwr.write_header(frm.get_info().as_ref().get_properties().get_audio_info().unwrap()).unwrap(); - wrote_header = true; - } - wwr.write_frame(frm.get_buffer()).unwrap(); - } - } - } -} diff --git a/src/test/mod.rs b/src/test/mod.rs deleted file mode 100644 index aaabd51..0000000 --- a/src/test/mod.rs +++ /dev/null @@ -1,2 +0,0 @@ -pub mod dec_video; -pub mod wavwriter; diff --git a/src/test/wavwriter.rs b/src/test/wavwriter.rs deleted file mode 100644 index 1cd9541..0000000 --- a/src/test/wavwriter.rs +++ /dev/null @@ -1,115 +0,0 @@ -use crate::io::byteio::*; -use crate::frame::*; -use std::io::SeekFrom; - -pub struct WavWriter<'a> { - io: &'a mut ByteWriter<'a>, - data_pos: u64, -} - -fn write_byte(wr: &mut ByteWriter, sample: u8) -> ByteIOResult<()> { - wr.write_byte(sample) -} - -fn write_s16(wr: &mut ByteWriter, sample: i16) -> ByteIOResult<()> { - wr.write_u16le(sample as u16) -} - -fn write_s32(wr: &mut ByteWriter, sample: i32) -> ByteIOResult<()> { - wr.write_u16le((sample >> 16) as u16) -} - -fn write_f32(wr: &mut ByteWriter, sample: f32) -> ByteIOResult<()> { - let mut out = (sample * 32768.0) as i32; - if out < -32768 { out = -32768; } - if out > 32767 { out = 32767; } - if out < 0 { out += 65536; } - wr.write_u16le(out as u16) -} - -macro_rules! write_data { - ($wr:expr, $buf:expr, $write:ident) => ({ - let len = $buf.get_length(); - let ainfo = $buf.get_info(); - let nch = ainfo.get_channels() as usize; - let mut offs: Vec<usize> = Vec::with_capacity(nch); - for ch in 0..nch { offs.push($buf.get_offset(ch)); } - let data = $buf.get_data(); - - for i in 0..len { - for ch in 0..nch { - let sample = data[offs[ch] + i]; - $write($wr, sample)?; - } - } - }) -} - -impl<'a> WavWriter<'a> { - pub fn new(io: &'a mut ByteWriter<'a>) -> Self { - WavWriter { io: io, data_pos: 0 } - } - pub fn write_header(&mut self, ainfo: NAAudioInfo) -> ByteIOResult<()> { - let bits = ainfo.get_format().get_bits() as usize; - - self.io.write_buf(b"RIFF")?; - self.io.write_u32le(0)?; - self.io.write_buf(b"WAVE")?; - - self.io.write_buf(b"fmt ")?; - self.io.write_u32le(16)?; - self.io.write_u16le(0x0001)?; // PCM - self.io.write_u16le(ainfo.get_channels() as u16)?; - self.io.write_u32le(ainfo.get_sample_rate() as u32)?; - - if bits < 16 { - self.io.write_u32le((ainfo.get_channels() as u32) * (ainfo.get_sample_rate() as u32))?; - self.io.write_u16le(ainfo.get_channels() as u16)?; // block align - self.io.write_u16le(8)?; - } else { - self.io.write_u32le(2 * (ainfo.get_channels() as u32) * (ainfo.get_sample_rate() as u32))?; - self.io.write_u16le((2 * ainfo.get_channels()) as u16)?; // block align - self.io.write_u16le(16)?; - } - - self.io.write_buf(b"data")?; - self.io.write_u32le(0)?; - - self.data_pos = self.io.tell(); - Ok(()) - } - pub fn write_frame(&mut self, abuf: NABufferType) -> ByteIOResult<()> { - match abuf { - NABufferType::AudioU8(ref buf) => { - write_data!(self.io, buf, write_byte); - } - NABufferType::AudioI16(ref buf) => { - write_data!(self.io, buf, write_s16); - } - NABufferType::AudioI32(ref buf) => { - write_data!(self.io, buf, write_s32); - } - NABufferType::AudioF32(ref buf) => { - write_data!(self.io, buf, write_f32); - } - NABufferType::AudioPacked(ref buf) => { - self.io.write_buf(buf.get_data().as_slice())?; - } - _ => {}, - }; - Ok(()) - } -} - -impl<'a> Drop for WavWriter<'a> { - #[allow(unused_variables)] - fn drop(&mut self) { - let size = self.io.tell(); - if (self.data_pos > 0) && (size >= self.data_pos) { - let res = self.io.seek(SeekFrom::Start(4)); - let res = self.io.write_u32le((size - 8) as u32); - let res = self.io.seek(SeekFrom::Start(self.data_pos - 4)); - let res = self.io.write_u32le(((size as u64) - self.data_pos) as u32); - } - } -} |