2 use nihav_core::io::bitreader::*;
4 use nihav_core::codecs::*;
5 use nihav_core::frame::NABufferRef;
9 pub fn scale_mv(val: i32, scale: u8) -> i32 {
10 (val + (if val > 0 { 1 } else { 0 }) + i32::from(scale) - 1) >> scale
14 pub struct IVICodebook {
21 pub fn init(&self) -> Self {
23 let mut base: u32 = 0;
26 base += 1 << cb.bits[i];
32 pub const IVI_CB_ZERO: IVICodebook = IVICodebook { len: 0, bits: [0; 16], offs: [0; 16] };
34 const IVI_REV0: [u32; 1] = [0];
35 const IVI_REV1: [u32; 2] = [0, 1];
36 const IVI_REV2: [u32; 4] = [0, 2, 1, 3];
37 const IVI_REV3: [u32; 8] = [0, 4, 2, 6, 1, 5, 3, 7];
38 const IVI_REV4: [u32; 16] = [ 0, 8, 4, 12, 2, 10, 6, 14, 1, 9, 5, 13, 3, 11, 7, 15];
39 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];
40 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];
41 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];
42 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];
44 const IVI_REVS: [&[u32]; 9] = [ &IVI_REV0, &IVI_REV1, &IVI_REV2, &IVI_REV3, &IVI_REV4, &IVI_REV5, &IVI_REV6, &IVI_REV7, &IVI_REV8];
46 pub trait IVICodebookReader {
47 fn read_ivi_codebook_desc(&mut self, mb_cb: bool, try_default: bool) -> DecoderResult<IVICodebook>;
48 fn read_ivi_cb(&mut self, cb: &IVICodebook) -> BitReaderResult<u32>;
49 fn read_ivi_cb_s(&mut self, cb: &IVICodebook) -> BitReaderResult<i32>;
52 impl<'a> IVICodebookReader for BitReader<'a> {
53 fn read_ivi_codebook_desc(&mut self, mb_cb: bool, desc_coded: bool) -> DecoderResult<IVICodebook> {
56 Ok(IVI_MB_CB[7].init())
58 Ok(IVI_BLK_CB[7].init())
61 let idx = self.read(3)? as usize;
64 Ok(IVI_MB_CB[idx].init())
66 Ok(IVI_BLK_CB[idx].init())
69 let mut cb = IVI_CB_ZERO;
70 cb.len = self.read(4)? as usize;
71 if cb.len == 0 { return Err(DecoderError::InvalidData); }
73 cb.bits[i] = self.read(4)? as u8;
80 fn read_ivi_cb(&mut self, cb: &IVICodebook) -> BitReaderResult<u32> {
81 /* let pfx = if cb.len == 1 { 0 } else { self.read_code(UintCodeType::LimitedUnary((cb.len - 1) as u32, 0))? as usize };
82 let nbits = cb.bits[pfx];
83 let mut base: u32 = 0;
84 for i in 0..pfx { base += 1 << cb.bits[i]; }
85 let rval = self.read(nbits)?;
86 let add = reverse_bits(rval, nbits);
89 let len = (!self.peek(16)).trailing_zeros() as usize;
91 if len >= cb.len - 1 {
93 self.skip((cb.len - 1) as u32)?;
96 self.skip((len + 1) as u32)?;
98 let nbits = cb.bits[pfx];
99 let base = cb.offs[pfx];
100 let rval = self.read(nbits)?;
101 let add = IVI_REVS[nbits as usize][rval as usize];
104 let nbits = cb.bits[0];
105 Ok(IVI_REVS[nbits as usize][self.read(nbits)? as usize])
109 fn read_ivi_cb_s(&mut self, cb: &IVICodebook) -> BitReaderResult<i32> {
110 let v = self.read_ivi_cb(cb)?;
114 let sign = (v & 1) == 1;
115 let val = (v >> 1) as i32;
125 pub const IVI_MB_CB: &[IVICodebook; 8] = &[
126 IVICodebook { len: 8, bits: [ 0, 4, 5, 4, 4, 4, 6, 6, 0, 0, 0, 0, 0, 0, 0, 0 ], offs: [0; 16] },
127 IVICodebook { len: 12, bits: [ 0, 2, 2, 3, 3, 3, 3, 5, 3, 2, 2, 2, 0, 0, 0, 0 ], offs: [0; 16] },
128 IVICodebook { len: 12, bits: [ 0, 2, 3, 4, 3, 3, 3, 3, 4, 3, 2, 2, 0, 0, 0, 0 ], offs: [0; 16] },
129 IVICodebook { len: 12, bits: [ 0, 3, 4, 4, 3, 3, 3, 3, 3, 2, 2, 2, 0, 0, 0, 0 ], offs: [0; 16] },
130 IVICodebook { len: 13, bits: [ 0, 4, 4, 3, 3, 3, 3, 2, 3, 3, 2, 1, 1, 0, 0, 0 ], offs: [0; 16] },
131 IVICodebook { len: 9, bits: [ 0, 4, 4, 4, 4, 3, 3, 3, 2, 0, 0, 0, 0, 0, 0, 0 ], offs: [0; 16] },
132 IVICodebook { len: 10, bits: [ 0, 4, 4, 4, 4, 3, 3, 2, 2, 2, 0, 0, 0, 0, 0, 0 ], offs: [0; 16] },
133 IVICodebook { len: 12, bits: [ 0, 4, 4, 4, 3, 3, 2, 3, 2, 2, 2, 2, 0, 0, 0, 0 ], offs: [0; 16] }
136 pub const IVI_BLK_CB: &[IVICodebook; 8] = &[
137 IVICodebook { len: 10, bits: [ 1, 2, 3, 4, 4, 7, 5, 5, 4, 1, 0, 0, 0, 0, 0, 0 ], offs: [0; 16] },
138 IVICodebook { len: 11, bits: [ 2, 3, 4, 4, 4, 7, 5, 4, 3, 3, 2, 0, 0, 0, 0, 0 ], offs: [0; 16] },
139 IVICodebook { len: 12, bits: [ 2, 4, 5, 5, 5, 5, 6, 4, 4, 3, 1, 1, 0, 0, 0, 0 ], offs: [0; 16] },
140 IVICodebook { len: 13, bits: [ 3, 3, 4, 4, 5, 6, 6, 4, 4, 3, 2, 1, 1, 0, 0, 0 ], offs: [0; 16] },
141 IVICodebook { len: 11, bits: [ 3, 4, 4, 5, 5, 5, 6, 5, 4, 2, 2, 0, 0, 0, 0, 0 ], offs: [0; 16] },
142 IVICodebook { len: 13, bits: [ 3, 4, 5, 5, 5, 5, 6, 4, 3, 3, 2, 1, 1, 0, 0, 0 ], offs: [0; 16] },
143 IVICodebook { len: 13, bits: [ 3, 4, 5, 5, 5, 6, 5, 4, 3, 3, 2, 1, 1, 0, 0, 0 ], offs: [0; 16] },
144 IVICodebook { len: 9, bits: [ 3, 4, 4, 5, 5, 5, 6, 5, 5, 0, 0, 0, 0, 0, 0, 0 ], offs: [0; 16] }
147 #[allow(unused_variables)]
148 #[allow(clippy::many_single_char_names)]
149 fn read_trans_band_header(br: &mut BitReader, w: usize, h: usize, dst: &mut [i16], dstride: usize) -> DecoderResult<()> {
150 let color_plane = br.read(2)?;
151 let bit_depth = br.read(3)?;
152 let dirty_rects = br.read(8)? as usize;
153 for i in 0..dirty_rects {
154 let x = br.read(16)?;
155 let y = br.read(16)?;
156 let l = br.read(16)?;
157 let r = br.read(16)?;
159 let has_trans_color = br.read_bool()?;
168 let mut cb = IVI_CB_ZERO;
169 cb.len = br.read(4)? as usize;
170 if cb.len == 0 { return Err(DecoderError::InvalidData); }
172 cb.bits[i] = br.read(4)? as u8;
176 let tile_start = br.tell();
177 let empty = br.read_bool()?;
180 let mut len = br.read(8)? as usize;
182 len = br.read(24)? as usize;
185 let tile_end = tile_start + len * 8;
187 let first_val = br.read_bool()?;
189 let mut dec_size = 0;
192 let mut fill = if !first_val { 255-128 } else { 0-128 };
193 let tr_w = (w + 31) & !31;
194 while br.tell() < tile_end {
195 let code = br.read_ivi_cb(&cb)? as usize;
199 if (x < w) && (y < h) {
200 dst[x + y * dstride] = fill;
211 if (x < w) && (y < h) {
212 dst[x + y * dstride] = fill;
230 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<()> {
231 let mut idx: isize = -1;
232 let quant_mat = if is_intra { tables.quant_intra } else { tables.quant_inter };
234 let c = br.read_ivi_cb(blk_cb)?;
235 if c == rvmap.eob_sym { break; }
238 if c != rvmap.esc_sym {
240 run = rvmap.runtab[c as usize] as isize;
241 val = rvmap.valtab[c as usize] as i32;
243 run = (br.read_ivi_cb(blk_cb)? as isize) + 1;
244 let lo = br.read_ivi_cb(blk_cb)?;
245 let hi = br.read_ivi_cb(blk_cb)?;
246 let v = (hi << 6) + lo;
248 val = 0; // should not happen but still...
250 let vv = (v >> 1) as i32;
259 validate!((idx >= 0) && (idx < 64));
261 let spos = tables.scan[idx as usize];
262 let q = (u32::from(quant_mat[spos]) * u32::from(quant)) >> 9;
265 let bias = (((q ^ 1) - 1) >> 1) as i32;
266 coeffs[spos] = val * qq;
267 if val > 0 { coeffs[spos] += bias; }
268 else { coeffs[spos] -= bias; }
273 if is_intra && is_2d {
274 *prev_dc += coeffs[0];
275 coeffs[0] = *prev_dc;
280 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<()> {
281 let mut idx: isize = -1;
282 let quant_mat = if is_intra { tables.quant_intra } else { tables.quant_inter };
284 let c = br.read_ivi_cb(blk_cb)?;
285 if c == rvmap.eob_sym { break; }
288 if c != rvmap.esc_sym {
290 run = rvmap.runtab[c as usize] as isize;
291 val = rvmap.valtab[c as usize] as i32;
293 run = (br.read_ivi_cb(blk_cb)? as isize) + 1;
294 let lo = br.read_ivi_cb(blk_cb)?;
295 let hi = br.read_ivi_cb(blk_cb)?;
296 let v = (hi << 6) + lo;
298 val = 0; // should not happen but still...
301 val = ((v >> 1) as i32) + 1;
303 val = -((v >> 1) as i32);
308 validate!((idx >= 0) && (idx < 16));
310 let spos = tables.scan[idx as usize];
311 let q = (u32::from(quant_mat[spos]) * u32::from(quant)) >> 9;
314 let bias = (((q ^ 1) - 1) >> 1) as i32;
315 coeffs[spos] = val * qq;
316 if val > 0 { coeffs[spos] += bias; }
317 else { coeffs[spos] -= bias; }
322 if is_intra && is_2d {
323 *prev_dc += coeffs[0];
324 coeffs[0] = *prev_dc;
330 fn put_block(frame: &mut [i16], offs: usize, stride: usize, blk: &[i32], blk_size: usize) {
332 let mut dptr = frame.as_mut_ptr().add(offs);
333 for y in 0..blk_size {
334 for x in 0..blk_size {
335 *dptr.add(x) = blk[x + y * blk_size] as i16;
337 dptr = dptr.add(stride);
342 fn add_block(frame: &mut [i16], offs: usize, stride: usize, blk: &[i32], blk_size: usize) {
344 let mut dptr = frame.as_mut_ptr().add(offs);
345 for y in 0..blk_size {
346 for x in 0..blk_size {
347 *dptr.add(x) = (*dptr.add(x)).wrapping_add(blk[x + y * blk_size] as i16);
349 dptr = dptr.add(stride);
355 plane_buf: [Vec<i16>; 4],
356 plane_stride: [usize; 4],
357 pic_hdr: PictureHeader,
360 fn align(val: usize, bits: u8) -> usize {
361 let mask = (1 << bits) - 1;
366 fn new() -> NABufferRef<Self> {
367 NABufferRef::new(FrameData {
368 plane_buf: [Vec::new(), Vec::new(), Vec::new(), Vec::new()],
369 plane_stride: [0, 0, 0, 0],
370 pic_hdr: PictureHeader::new_null(IVIFrameType::Intra),
373 fn realloc(&mut self, pic_hdr: &PictureHeader) -> DecoderResult<()> {
374 let width = align(pic_hdr.width, 6);
375 let height = align(pic_hdr.height, 6);
378 self.plane_buf[0].resize(stride * height, 0);
379 self.plane_stride[0] = stride;
381 self.plane_buf[plane].resize((stride >> 1) * (height >> 1), 0);
382 self.plane_stride[plane] = stride >> 1;
384 if pic_hdr.transparent {
385 self.plane_buf[3].resize(stride * height, 0);
386 self.plane_stride[3] = stride;
388 self.pic_hdr = *pic_hdr;
391 fn fill_plane(&mut self, vb: &mut NAVideoBuffer<u8>, plane: usize) {
392 let dplane = if (plane == 1) || (plane == 2) { plane ^ 3 } else { plane };
393 let (w, h) = vb.get_dimensions(dplane);
394 let mut didx = vb.get_offset(dplane);
395 let dstride = vb.get_stride(dplane);
396 let dst = vb.get_data_mut().unwrap();
397 let src = &self.plane_buf[plane];
399 let sstride = self.plane_stride[plane];
402 dst[didx + x] = clip8(src[sidx + x] + 128);
410 #[allow(clippy::many_single_char_names)]
411 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) {
412 let (xoff, yoff, mv_mode) = if is_hpel {
413 (mv_x >> 1, mv_y >> 1, ((mv_x & 1) + (mv_y & 1) * 2) as u8)
417 let xpos = (x as isize) + (xoff as isize);
418 let ypos = (y as isize) + (yoff as isize);
419 if (xpos < (l as isize)) || ((xpos as usize) + blk_size + ((mv_mode & 1) as usize) > r) ||
420 (ypos < (t as isize)) || ((ypos as usize) + blk_size + ((mv_mode >> 1) as usize) > b) {
421 //println!(" copy from {},{} of {}-{},{}-{} {}x{}!", xpos, ypos, l,r,t,b,blk_size,blk_size);
424 let sidx = (xpos as usize) + (ypos as usize) * sstride;
426 ivi_mc_put(dst, dstride, &src[sidx..], sstride, mv_mode, 8, 8);
428 ivi_mc_put(dst, dstride, &src[sidx..], sstride, mv_mode, 4, 4);
432 #[allow(clippy::many_single_char_names)]
433 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) {
434 let (xoff1, yoff1, mv_mode1) = if is_hpel {
435 (mv_x >> 1, mv_y >> 1, ((mv_x & 1) + (mv_y & 1) * 2) as u8)
439 let xpos1 = (x as isize) + (xoff1 as isize);
440 let ypos1 = (y as isize) + (yoff1 as isize);
441 if (xpos1 < (l as isize)) || ((xpos1 as usize) + blk_size + ((mv_mode1 & 1) as usize) > r) ||
442 (ypos1 < (t as isize)) || ((ypos1 as usize) + blk_size + ((mv_mode1 >> 1) as usize) > b) {
445 let sidx1 = (xpos1 as usize) + (ypos1 as usize) * sstride1;
446 let (xoff2, yoff2, mv_mode2) = if is_hpel {
447 (mv2_x >> 1, mv2_y >> 1, ((mv2_x & 1) + (mv2_y & 1) * 2) as u8)
451 let xpos2 = (x as isize) + (xoff2 as isize);
452 let ypos2 = (y as isize) + (yoff2 as isize);
453 if (xpos2 < (l as isize)) || ((xpos2 as usize) + blk_size + ((mv_mode2 & 1) as usize) > r) ||
454 (ypos2 < (t as isize)) || ((ypos2 as usize) + blk_size + ((mv_mode2 >> 1) as usize) > b) {
457 let sidx2 = (xpos2 as usize) + (ypos2 as usize) * sstride2;
458 ivi_mc_avg(dst, dstride, &src1[sidx1..], sstride1, mv_mode1, &src2[sidx2..], sstride2, mv_mode2, blk_size, blk_size);
461 pub trait IndeoXParser {
462 fn decode_picture_header(&mut self, br: &mut BitReader) -> DecoderResult<PictureHeader>;
463 fn decode_band_header(&mut self, br: &mut BitReader, pic_hdr: &PictureHeader, plane: usize, band: usize) -> DecoderResult<BandHeader>;
464 fn decode_mb_info(&mut self, br: &mut BitReader, pic_hdr: &PictureHeader, band_hdr: &BandHeader, tile: &mut IVITile, ref_tile: Option<&IVITile>, mv_scale: u8) -> DecoderResult<()>;
465 fn recombine_plane(&mut self, src: &[i16], sstride: usize, dst: &mut [u8], dstride: usize, w: usize, h: usize);
468 const MISSING_REF: usize = 42;
470 pub struct IVIDecoder {
472 frames: [NABufferRef<FrameData>; 4],
481 bref: Option<NABufferType>,
483 bands: Vec<BandHeader>,
484 tiles: Vec<NABufferRef<IVITile>>,
485 num_tiles: [[usize; 4]; 4],
486 tile_start: [[usize; 4]; 4],
490 pub fn new() -> Self {
491 let mut bands: Vec<BandHeader> = Vec::with_capacity(12);
492 bands.resize(12, BandHeader::new_empty(42, 42));
494 ftype: IVIFrameType::NULL,
495 frames: [FrameData::new(), FrameData::new(), FrameData::new(), FrameData::new()],
496 cur_frame: 0, prev_frame: MISSING_REF, next_frame: MISSING_REF,
497 iref_0: MISSING_REF, iref_1: MISSING_REF, scal_ref: MISSING_REF,
498 vinfo: NAVideoInfo::new(0, 0, false, YUV410_FORMAT),
499 vinfoa: NAVideoInfo::new(0, 0, false, YUVA410_FORMAT),
503 tiles: Vec::new(), tile_start: [[0; 4]; 4], num_tiles: [[0; 4]; 4],
507 fn realloc(&mut self, pic_hdr: &PictureHeader) -> DecoderResult<()> {
508 let planes = if pic_hdr.transparent { 4 } else { 3 };
510 //self.bands.truncate(0);
511 self.tiles.truncate(0);
512 self.num_tiles = [[0; 4]; 4];
513 self.tile_start = [[0; 4]; 4];
514 let mut tstart: usize = 0;
515 for plane in 0..planes {
516 let is_luma = (plane != 1) && (plane != 2);
517 let bands = if is_luma { pic_hdr.luma_bands } else { pic_hdr.chroma_bands };
518 let mut band_w = if is_luma { pic_hdr.width } else { (pic_hdr.width + 3) >> 2 };
519 let mut band_h = if is_luma { pic_hdr.height } else { (pic_hdr.height + 3) >> 2 };
520 let mut tile_w = if is_luma { pic_hdr.slice_w } else { (pic_hdr.slice_w + 3) >> 2 };
521 let mut tile_h = if is_luma { pic_hdr.slice_h } else { (pic_hdr.slice_h + 3) >> 2 };
523 band_w = (band_w + 1) >> 1;
524 band_h = (band_h + 1) >> 1;
526 tile_w = (tile_w + 1) >> 1;
527 tile_h = (tile_h + 1) >> 1;
530 for band in 0..bands {
531 self.tile_start[plane][band] = tstart;
532 let band_xoff = if (band & 1) == 1 { band_w } else { 0 };
533 let band_yoff = if (band & 2) == 2 { band_h } else { 0 };
536 let cur_h = if y + tile_h <= band_h { tile_h } else { band_h - y };
539 let cur_w = if x + tile_w <= band_w { tile_w } else { band_w - x };
540 let tile = IVITile::new(band_xoff + x, band_yoff + y, cur_w, cur_h);
541 self.tiles.push(NABufferRef::new(tile));
542 self.num_tiles[plane][band] += 1;
552 fn decode_band(&mut self, pic_hdr: &PictureHeader, dec: &mut IndeoXParser, br: &mut BitReader, plane_no: usize, band_no: usize) -> DecoderResult<()> {
553 let bidx = match plane_no {
555 _ => { pic_hdr.luma_bands + plane_no - 1 },
557 let prev_band = if bidx >= self.bands.len() { BandHeader::new_empty(plane_no, band_no) } else { self.bands[bidx].clone() };
558 let mut band = dec.decode_band_header(br, pic_hdr, plane_no, band_no)?;
559 if let TxType::None = band.ttype {
560 validate!(band.plane_no == prev_band.plane_no);
561 validate!(band.band_no == prev_band.band_no);
562 validate!(band.blk_size == prev_band.blk_size);
563 band.tr = prev_band.tr;
564 band.ttype = prev_band.ttype;
567 let tstart = self.tile_start[band.plane_no][band.band_no];
568 let tend = tstart + self.num_tiles[band.plane_no][band.band_no];
569 let mb_size = band.mb_size;
570 let (tr, tr_dc) = match band.ttype {
571 TxType::Transform4(_) => { ivi_get_transform4x4_funcs(band.tr) },
572 TxType::Transform8(_) => { ivi_get_transform8x8_funcs(band.tr) },
573 _ => { ivi_get_transform4x4_funcs(band.tr) },
575 for tile_no in tstart..tend {
577 let mut tile = self.tiles[tile_no].clone();
578 let mb_w = (tile.w + mb_size - 1) / mb_size;
579 let mb_h = (tile.h + mb_size - 1) / mb_size;
583 tile.mb.resize(mb_w * mb_h, MB::new(0, 0));
586 let tile_start = br.tell();
587 if !br.read_bool()? {
588 let res = br.read_bool()?;
590 let mut len = br.read(8)? as usize;
592 len = br.read(24)? as usize;
596 let tile_end = tile_start + len * 8;
597 validate!(tile_end > br.tell());
598 validate!(tile_end <= br.tell() + (br.left() as usize));
600 let mut tile = self.tiles[tile_no].clone();
601 let ref_tile: Option<&IVITile>;
603 if (plane_no == 0) && (band_no == 0) {
606 mv_scale = (((self.bands[0].mb_size >> 3) as i8) - ((band.mb_size >> 3) as i8)) as u8;
608 if plane_no != 0 || band_no != 0 {
609 let rtile = &self.tiles[0];
610 if (tile.mb_w != rtile.mb_w) || (tile.mb_h != rtile.mb_h) {
613 ref_tile = Some(rtile);
618 dec.decode_mb_info(br, pic_hdr, &band, &mut tile, ref_tile, mv_scale)?;
621 self.decode_tile(br, &band, tile_no, &tr, &tr_dc)?;
622 let skip_part = tile_end - br.tell();
623 br.skip(skip_part as u32)?;
626 let mut tile = self.tiles[tile_no].clone();
627 let ref_tile: Option<&IVITile>;
629 if (plane_no == 0) && (band_no == 0) {
632 mv_scale = (((self.bands[0].mb_size >> 3) as i8) - ((band.mb_size >> 3) as i8)) as u8;
634 if plane_no != 0 || band_no != 0 {
635 let rtile = &self.tiles[0];
636 if (tile.mb_w != rtile.mb_w) || (tile.mb_h != rtile.mb_h) {
639 ref_tile = Some(rtile);
645 for mb_y in 0..tile.mb_h {
646 for mb_x in 0..tile.mb_w {
647 let mut mb = MB::new(tile.pos_x + mb_x * band.mb_size, tile.pos_y + mb_y * band.mb_size);
648 mb.mtype = MBType::Inter;
651 if let Some(ref tileref) = ref_tile {
652 let mx = tileref.mb[mb_idx].mv_x;
653 let my = tileref.mb[mb_idx].mv_y;
654 mb.mv_x = scale_mv(mx, mv_scale);
655 mb.mv_y = scale_mv(my, mv_scale);
658 tile.mb[mb_idx] = mb;
663 self.decode_tile(br, &band, tile_no, &tr, &tr_dc)?;
666 self.bands[bidx] = band;
670 fn decode_tile(&mut self, br: &mut BitReader, band: &BandHeader, tile_no: usize, tr: &TrFunc, transform_dc: &TrFuncDC) -> DecoderResult<()> {
672 let mut prev_dc: i32 = 0;
673 let mut tile = self.tiles[tile_no].clone();
674 let mut frame = self.frames[self.cur_frame].clone();
676 let stride = frame.plane_stride[band.plane_no];
677 let mut dstidx = tile.pos_x + tile.pos_y * stride;
678 let mut dst = &mut frame.plane_buf[band.plane_no];
679 let pos_x = tile.pos_x;
680 let pos_y = tile.pos_y;
681 let tile_w = (tile.w + 15) & !15;
682 let tile_h = (tile.h + 15) & !15;
683 for mb_y in 0..tile.mb_h {
684 for mb_x in 0..tile.mb_w {
685 let mb = &mut tile.mb[mb_idx];
687 let is_intra = mb.mtype == MBType::Intra;
689 if band.mb_size != band.blk_size {
690 let mut cbp = mb.cbp;
692 let mut blk: [i32; 64] = [0; 64];
693 let boff = (blk_no & 1) * band.blk_size + (blk_no >> 1) * band.blk_size * stride + mb_x * band.mb_size;
695 if mb.mtype != MBType::Bidir {
697 if mb.mtype != MBType::Backward {
698 idx = self.prev_frame;
700 idx = self.next_frame;
702 let pf = &self.frames[idx];
703 do_mc(&mut dst[dstidx + boff..], stride,
704 &pf.plane_buf[band.plane_no], pf.plane_stride[band.plane_no],
705 pos_x + mb_x * band.mb_size + (blk_no & 1) * band.blk_size,
706 pos_y + mb_y * band.mb_size + (blk_no >> 1) * band.blk_size,
707 pos_x, pos_x + tile_w, pos_y, pos_y + tile_h,
708 mb.mv_x, mb.mv_y, band.halfpel, band.blk_size);
710 let pf = &self.frames[self.prev_frame];
711 let nf = &self.frames[self.next_frame];
712 do_mc_b(&mut dst[dstidx + boff..], stride,
713 &pf.plane_buf[band.plane_no], pf.plane_stride[band.plane_no],
714 &nf.plane_buf[band.plane_no], nf.plane_stride[band.plane_no],
715 pos_x + mb_x * band.mb_size + (blk_no & 1) * band.blk_size,
716 pos_y + mb_y * band.mb_size + (blk_no >> 1) * band.blk_size,
717 pos_x, pos_x + tile_w, pos_y, pos_y + tile_h,
718 mb.mv_x, mb.mv_y, mb.mv2_x, mb.mv2_y, band.halfpel,
723 if let TxType::Transform8(ref params) = band.ttype {
724 decode_block8x8(br, &band.blk_cb, &band.rvmap, params, is_intra, band.tr.is_2d(), &mut prev_dc, mb.q, &mut blk, tr)?;
726 put_block(&mut dst, dstidx + boff, stride, &blk, 8);
728 add_block(&mut dst, dstidx + boff, stride, &blk, 8);
731 if let TxType::Transform4(ref params) = band.ttype {
732 decode_block4x4(br, &band.blk_cb, &band.rvmap, params, is_intra, band.tr.is_2d(), &mut prev_dc, mb.q, &mut blk, tr)?;
734 put_block(&mut dst, dstidx + boff, stride, &blk, 4);
736 add_block(&mut dst, dstidx + boff, stride, &blk, 4);
741 (transform_dc)(&mut blk, prev_dc);
742 put_block(&mut dst, dstidx + boff, stride, &blk, band.blk_size);
748 let mut blk: [i32; 64] = [0; 64];
750 if mb.mtype != MBType::Bidir {
752 if mb.mtype != MBType::Backward {
753 idx = self.prev_frame;
755 idx = self.next_frame;
757 let pf = &self.frames[idx];
758 do_mc(&mut dst[dstidx + mb_x * band.blk_size..], stride,
759 &pf.plane_buf[band.plane_no], pf.plane_stride[band.plane_no],
760 pos_x + mb_x * band.mb_size,
761 pos_y + mb_y * band.mb_size,
762 pos_x, pos_x + tile_w, pos_y, pos_y + tile_h,
763 mb.mv_x, mb.mv_y, band.halfpel, band.blk_size);
765 let pf = &self.frames[self.prev_frame];
766 let nf = &self.frames[self.next_frame];
767 do_mc_b(&mut dst[dstidx + mb_x * band.blk_size..], stride,
768 &pf.plane_buf[band.plane_no], pf.plane_stride[band.plane_no],
769 &nf.plane_buf[band.plane_no], nf.plane_stride[band.plane_no],
770 pos_x + mb_x * band.mb_size,
771 pos_y + mb_y * band.mb_size,
772 pos_x, pos_x + tile_w, pos_y, pos_y + tile_h,
773 mb.mv_x, mb.mv_y, mb.mv2_x, mb.mv2_y, band.halfpel,
778 if let TxType::Transform8(ref params) = band.ttype {
779 decode_block8x8(br, &band.blk_cb, &band.rvmap, params, is_intra, band.tr.is_2d(), &mut prev_dc, mb.q, &mut blk, tr)?;
781 if let TxType::Transform4(ref params) = band.ttype {
782 decode_block4x4(br, &band.blk_cb, &band.rvmap, params, is_intra, band.tr.is_2d(), &mut prev_dc, mb.q, &mut blk, tr)?;
785 if band.blk_size == 8 {
786 put_block(&mut dst, dstidx + mb_x * band.blk_size, stride, &blk, 8);
788 put_block(&mut dst, dstidx + mb_x * band.blk_size, stride, &blk, 4);
791 if band.blk_size == 8 {
792 add_block(&mut dst, dstidx + mb_x * band.blk_size, stride, &blk, 8);
794 add_block(&mut dst, dstidx + mb_x * band.blk_size, stride, &blk, 4);
799 (transform_dc)(&mut blk, prev_dc);
800 if band.blk_size == 8 {
801 put_block(&mut dst, dstidx + mb_x * band.blk_size, stride, &blk, 8);
803 put_block(&mut dst, dstidx + mb_x * band.blk_size, stride, &blk, 4);
810 dstidx += stride * band.mb_size;
816 fn find_unused_frame(&self) -> usize {
818 if (fno != self.iref_0) && (fno != self.iref_1) && (fno != self.scal_ref) {
825 fn decode_single_frame<'a>(&mut self, dec: &mut IndeoXParser, br: &mut BitReader<'a>) -> DecoderResult<NABufferType> {
826 let pic_hdr = dec.decode_picture_header(br)?;
827 self.ftype = pic_hdr.ftype;
828 if pic_hdr.ftype.is_null() {
829 return Ok(NABufferType::None);
832 self.cur_frame = self.find_unused_frame();
834 IVIFrameType::Inter => {
835 self.prev_frame = self.iref_0;
836 if self.prev_frame == MISSING_REF {
837 return Err(DecoderError::MissingReference);
840 IVIFrameType::InterDroppable => {
841 self.prev_frame = self.scal_ref;
842 if self.prev_frame == MISSING_REF {
843 return Err(DecoderError::MissingReference);
846 IVIFrameType::InterScal => {
847 self.prev_frame = self.scal_ref;
848 if self.prev_frame == MISSING_REF {
849 return Err(DecoderError::MissingReference);
852 IVIFrameType::Bidir => {
853 self.prev_frame = self.iref_1;
854 self.next_frame = self.iref_0;
855 if (self.prev_frame == MISSING_REF) || (self.next_frame == MISSING_REF) {
856 return Err(DecoderError::MissingReference);
862 let mut vinfo = if pic_hdr.transparent { self.vinfoa } else { self.vinfo };
863 vinfo.set_width(pic_hdr.width);
864 vinfo.set_height(pic_hdr.height);
865 let mut buftype = alloc_video_buffer(vinfo, 0)?;
866 self.realloc(&pic_hdr)?;
867 self.frames[self.cur_frame].realloc(&pic_hdr)?;
870 let num_bands = if plane == 0 { pic_hdr.luma_bands } else { pic_hdr.chroma_bands };
871 for band in 0..num_bands {
872 self.decode_band(&pic_hdr, dec, br, plane, band)?;
874 if let NABufferType::Video(ref mut vb) = buftype {
875 let mut frame = self.frames[self.cur_frame].clone();
877 frame.fill_plane(vb, plane);
879 let dplane = if (plane == 1) || (plane == 2) { plane ^ 3 } else { plane };
880 let (w, h) = vb.get_dimensions(dplane);
881 let dstride = vb.get_stride(dplane);
882 let off = vb.get_offset(dplane);
883 let dst = vb.get_data_mut().unwrap();
884 dec.recombine_plane(&frame.plane_buf[plane], frame.plane_stride[plane], &mut dst[off..], dstride, w, h);
888 if pic_hdr.transparent {
889 let mut frame = self.frames[self.cur_frame].clone();
890 let stride = frame.plane_stride[3];
891 read_trans_band_header(br, pic_hdr.width, pic_hdr.height, &mut frame.plane_buf[3], stride)?;
892 if let NABufferType::Video(ref mut vb) = buftype {
893 frame.fill_plane(vb, 3);
898 IVIFrameType::Intra | IVIFrameType::Inter => {
899 self.iref_1 = self.iref_0;
900 self.iref_0 = self.cur_frame;
901 self.scal_ref = self.cur_frame;
903 IVIFrameType::InterScal => {
904 self.scal_ref = self.cur_frame;
912 pub fn decode_frame<'a>(&mut self, dec: &mut IndeoXParser, br: &mut BitReader<'a>) -> DecoderResult<NABufferType> {
913 let res = self.decode_single_frame(dec, br);
914 if res.is_err() { return res; }
915 if (self.ftype == IVIFrameType::Intra) && (br.left() > 16) {
917 if br.left() < 8 { break; }
918 if br.read(8)? == 0 { break; }
921 if br.left() < 8 { break; }
922 if br.peek(8) != 0 { break; }
926 let seq = br.peek(21);
928 let res2 = self.decode_single_frame(dec, br);
930 self.bref = Some(res2.unwrap());
933 self.ftype = IVIFrameType::Intra;
936 if let Ok(NABufferType::None) = res {
937 if self.bref.is_some() {
938 let mut bref: Option<NABufferType> = None;
939 mem::swap(&mut bref, &mut self.bref);
940 self.ftype = IVIFrameType::Inter;
941 return Ok(bref.unwrap());
947 pub fn flush(&mut self) {
948 self.prev_frame = MISSING_REF;
949 self.next_frame = MISSING_REF;
950 self.iref_0 = MISSING_REF;
951 self.iref_1 = MISSING_REF;
952 self.scal_ref = MISSING_REF;
955 pub fn is_intra(&self) -> bool {
956 self.ftype.is_intra()
958 pub fn get_frame_type(&self) -> FrameType {
960 IVIFrameType::Intra => { FrameType::I },
961 IVIFrameType::Intra1 => { FrameType::I },
962 IVIFrameType::Inter => { FrameType::P },
963 IVIFrameType::InterDroppable => { FrameType::P },
964 IVIFrameType::InterScal => { FrameType::P },
965 IVIFrameType::Bidir => { FrameType::B },
966 _ => { FrameType::Skip },
974 pub runtab: [u8; 256],
975 pub valtab: [i8; 256],
978 impl Clone for RVMap {
979 fn clone(&self) -> RVMap {
980 let mut runtab: [u8; 256] = [0; 256];
981 let mut valtab: [i8; 256] = [0; 256];
982 runtab.copy_from_slice(&self.runtab);
983 valtab.copy_from_slice(&self.valtab);
984 RVMap { eob_sym: self.eob_sym, esc_sym: self.esc_sym, runtab, valtab }
988 pub const IVI_ZERO_RVMAP: RVMap = RVMap { eob_sym: 0, esc_sym: 0, runtab: [0; 256], valtab: [0; 256] };
990 pub static IVI_RVMAPS: [RVMap; 9] = [
991 RVMap { eob_sym: 5, esc_sym: 2, runtab: [
992 1, 1, 0, 1, 1, 0, 1, 1, 2, 2, 1, 1, 1, 1, 3, 3,
993 1, 1, 2, 2, 1, 1, 4, 4, 1, 1, 1, 1, 2, 2, 5, 5,
994 1, 1, 3, 3, 1, 1, 6, 6, 1, 2, 1, 2, 7, 7, 1, 1,
995 8, 8, 1, 1, 4, 2, 1, 4, 2, 1, 3, 3, 1, 1, 1, 9,
996 9, 1, 2, 1, 2, 1, 5, 5, 1, 1, 10, 10, 1, 1, 3, 3,
997 2, 2, 1, 1, 11, 11, 6, 4, 4, 1, 6, 1, 2, 1, 2, 12,
998 8, 1, 12, 7, 8, 7, 1, 16, 1, 16, 1, 3, 3, 13, 1, 13,
999 2, 2, 1, 15, 1, 5, 14, 15, 1, 5, 14, 1, 17, 8, 17, 8,
1000 1, 4, 4, 2, 2, 1, 25, 25, 24, 24, 1, 3, 1, 3, 1, 8,
1001 6, 7, 6, 1, 18, 8, 18, 1, 7, 23, 2, 2, 23, 1, 1, 21,
1002 22, 9, 9, 22, 19, 1, 21, 5, 19, 5, 1, 33, 20, 33, 20, 8,
1003 4, 4, 1, 32, 2, 2, 8, 3, 32, 26, 3, 1, 7, 7, 26, 6,
1004 1, 6, 1, 1, 16, 1, 10, 1, 10, 2, 16, 29, 28, 2, 29, 28,
1005 1, 27, 5, 8, 5, 27, 1, 8, 3, 7, 3, 31, 41, 31, 1, 41,
1006 6, 1, 6, 7, 4, 4, 1, 1, 2, 1, 2, 11, 34, 30, 11, 1,
1007 30, 15, 15, 34, 36, 40, 36, 40, 35, 35, 37, 37, 39, 39, 38, 38 ],
1009 1, -1, 0, 2, -2, 0, 3, -3, 1, -1, 4, -4, 5, -5, 1, -1,
1010 6, -6, 2, -2, 7, -7, 1, -1, 8, -8, 9, -9, 3, -3, 1, -1,
1011 10, -10, 2, -2, 11, -11, 1, -1, 12, 4, -12, -4, 1, -1, 13, -13,
1012 1, -1, 14, -14, 2, 5, 15, -2, -5, -15, -3, 3, 16, -16, 17, 1,
1013 -1, -17, 6, 18, -6, -18, 2, -2, 19, -19, 1, -1, 20, -20, 4, -4,
1014 7, -7, 21, -21, 1, -1, 2, 3, -3, 22, -2, -22, 8, 23, -8, 1,
1015 2, -23, -1, 2, -2, -2, 24, 1, -24, -1, 25, 5, -5, 1, -25, -1,
1016 9, -9, 26, 1, -26, 3, 1, -1, 27, -3, -1, -27, 1, 3, -1, -3,
1017 28, -4, 4, 10, -10, -28, 1, -1, 1, -1, 29, 6, -29, -6, 30, -4,
1018 3, 3, -3, -30, 1, 4, -1, 31, -3, 1, 11, -11, -1, -31, 32, -1,
1019 -1, 2, -2, 1, 1, -32, 1, 4, -1, -4, 33, -1, 1, 1, -1, 5,
1020 5, -5, -33, -1, -12, 12, -5, -7, 1, 1, 7, 34, 4, -4, -1, 4,
1021 -34, -4, 35, 36, -2, -35, -2, -36, 2, 13, 2, -1, 1, -13, 1, -1,
1022 37, 1, -5, 6, 5, -1, 38, -6, -8, 5, 8, -1, 1, 1, -37, -1,
1023 5, 39, -5, -5, 6, -6, -38, -39, -14, 40, 14, 2, 1, 1, -2, -40,
1024 -1, -2, 2, -1, -1, -1, 1, 1, 1, -1, 1, -1, 1, -1, 1, -1 ],
1026 RVMap { eob_sym: 0, esc_sym: 38, runtab: [
1027 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 8, 6, 8, 7,
1028 7, 9, 9, 10, 10, 11, 11, 1, 12, 1, 12, 13, 13, 16, 14, 16,
1029 14, 15, 15, 17, 17, 18, 0, 18, 19, 20, 21, 19, 22, 21, 20, 22,
1030 25, 24, 2, 25, 24, 23, 23, 2, 26, 28, 26, 28, 29, 27, 29, 27,
1031 33, 33, 1, 32, 1, 3, 32, 30, 36, 3, 36, 30, 31, 31, 35, 34,
1032 37, 41, 34, 35, 37, 4, 41, 4, 49, 8, 8, 49, 40, 38, 5, 38,
1033 40, 39, 5, 39, 42, 43, 42, 7, 57, 6, 43, 44, 6, 50, 7, 44,
1034 57, 48, 50, 48, 45, 45, 46, 47, 51, 46, 47, 58, 1, 51, 58, 1,
1035 52, 59, 53, 9, 52, 55, 55, 59, 53, 56, 54, 56, 54, 9, 64, 64,
1036 60, 63, 60, 63, 61, 62, 61, 62, 2, 10, 2, 10, 11, 1, 11, 13,
1037 12, 1, 12, 13, 16, 16, 8, 8, 14, 3, 3, 15, 14, 15, 4, 4,
1038 1, 17, 17, 5, 1, 7, 7, 5, 6, 1, 2, 2, 6, 22, 1, 25,
1039 21, 22, 8, 24, 1, 21, 25, 24, 8, 18, 18, 23, 9, 20, 23, 33,
1040 29, 33, 20, 1, 19, 1, 29, 36, 9, 36, 19, 41, 28, 57, 32, 3,
1041 28, 3, 1, 27, 49, 49, 1, 32, 26, 26, 2, 4, 4, 7, 57, 41,
1042 2, 7, 10, 5, 37, 16, 10, 27, 8, 8, 13, 16, 37, 13, 1, 5 ],
1044 0, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, 1, -1, -1, 1,
1045 -1, 1, -1, 1, -1, 1, -1, 2, 1, -2, -1, 1, -1, 1, 1, -1,
1046 -1, 1, -1, 1, -1, 1, 0, -1, 1, 1, 1, -1, 1, -1, -1, -1,
1047 1, 1, 2, -1, -1, 1, -1, -2, 1, 1, -1, -1, 1, 1, -1, -1,
1048 1, -1, 3, 1, -3, 2, -1, 1, 1, -2, -1, -1, -1, 1, 1, 1,
1049 1, 1, -1, -1, -1, 2, -1, -2, 1, 2, -2, -1, 1, 1, 2, -1,
1050 -1, 1, -2, -1, 1, 1, -1, 2, 1, 2, -1, 1, -2, -1, -2, -1,
1051 -1, 1, 1, -1, 1, -1, 1, 1, 1, -1, -1, 1, 4, -1, -1, -4,
1052 1, 1, 1, 2, -1, -1, 1, -1, -1, 1, -1, -1, 1, -2, 1, -1,
1053 1, 1, -1, -1, 1, 1, -1, -1, 3, 2, -3, -2, 2, 5, -2, 2,
1054 2, -5, -2, -2, -2, 2, -3, 3, 2, 3, -3, 2, -2, -2, 3, -3,
1055 6, 2, -2, 3, -6, 3, -3, -3, 3, 7, -4, 4, -3, 2, -7, 2,
1056 2, -2, -4, 2, 8, -2, -2, -2, 4, 2, -2, 2, 3, 2, -2, -2,
1057 2, 2, -2, -8, -2, 9, -2, 2, -3, -2, 2, -2, 2, 2, 2, 4,
1058 -2, -4, 10, 2, 2, -2, -9, -2, 2, -2, 5, 4, -4, 4, -2, 2,
1059 -5, -4, -3, 4, 2, -3, 3, -2, -5, 5, 3, 3, -2, -3, -10, -4 ],
1061 RVMap { eob_sym: 2, esc_sym: 11, runtab: [
1062 1, 1, 0, 2, 2, 1, 1, 3, 3, 4, 4, 0, 1, 1, 5, 5,
1063 2, 2, 6, 6, 7, 7, 1, 8, 1, 8, 3, 3, 9, 9, 1, 2,
1064 2, 1, 4, 10, 4, 10, 11, 11, 1, 5, 12, 12, 1, 5, 13, 13,
1065 3, 3, 6, 6, 2, 2, 14, 14, 16, 16, 15, 7, 15, 8, 8, 7,
1066 1, 1, 17, 17, 4, 4, 1, 1, 18, 18, 2, 2, 5, 5, 25, 3,
1067 9, 3, 25, 9, 19, 24, 19, 24, 1, 21, 20, 1, 21, 22, 20, 22,
1068 23, 23, 8, 6, 33, 6, 8, 33, 7, 7, 26, 26, 1, 32, 1, 32,
1069 28, 4, 28, 10, 29, 27, 27, 10, 41, 4, 29, 2, 2, 41, 36, 31,
1070 49, 31, 34, 30, 34, 36, 30, 35, 1, 49, 11, 5, 35, 11, 1, 3,
1071 3, 5, 37, 37, 8, 40, 8, 40, 12, 12, 42, 42, 1, 38, 16, 57,
1072 1, 6, 16, 39, 38, 6, 7, 7, 13, 13, 39, 43, 2, 43, 57, 2,
1073 50, 9, 44, 9, 50, 4, 15, 48, 44, 4, 1, 15, 48, 14, 14, 1,
1074 45, 45, 8, 3, 5, 8, 51, 47, 3, 46, 46, 47, 5, 51, 1, 17,
1075 17, 58, 1, 58, 2, 52, 52, 2, 53, 7, 59, 6, 6, 56, 53, 55,
1076 7, 55, 1, 54, 59, 56, 54, 10, 1, 10, 4, 60, 1, 60, 8, 4,
1077 8, 64, 64, 61, 1, 63, 3, 63, 62, 61, 5, 11, 5, 3, 11, 62 ],
1079 1, -1, 0, 1, -1, 2, -2, 1, -1, 1, -1, 0, 3, -3, 1, -1,
1080 2, -2, 1, -1, 1, -1, 4, 1, -4, -1, 2, -2, 1, -1, 5, 3,
1081 -3, -5, 2, 1, -2, -1, 1, -1, 6, 2, 1, -1, -6, -2, 1, -1,
1082 3, -3, 2, -2, 4, -4, 1, -1, 1, -1, 1, 2, -1, 2, -2, -2,
1083 7, -7, 1, -1, 3, -3, 8, -8, 1, -1, 5, -5, 3, -3, 1, 4,
1084 2, -4, -1, -2, 1, 1, -1, -1, 9, 1, 1, -9, -1, 1, -1, -1,
1085 1, -1, 3, -3, 1, 3, -3, -1, 3, -3, 1, -1, 10, 1, -10, -1,
1086 1, 4, -1, 2, 1, -1, 1, -2, 1, -4, -1, 6, -6, -1, 1, 1,
1087 1, -1, 1, 1, -1, -1, -1, 1, 11, -1, -2, 4, -1, 2, -11, 5,
1088 -5, -4, -1, 1, 4, 1, -4, -1, -2, 2, 1, -1, 12, 1, -2, 1,
1089 -12, 4, 2, 1, -1, -4, 4, -4, 2, -2, -1, 1, 7, -1, -1, -7,
1090 -1, -3, 1, 3, 1, 5, 2, 1, -1, -5, 13, -2, -1, 2, -2, -13,
1091 1, -1, 5, 6, 5, -5, 1, 1, -6, 1, -1, -1, -5, -1, 14, 2,
1092 -2, 1, -14, -1, 8, 1, -1, -8, 1, 5, 1, 5, -5, 1, -1, 1,
1093 -5, -1, 15, 1, -1, -1, -1, 3, -15, -3, 6, 1, 16, -1, 6, -6,
1094 -6, 1, -1, 1, -16, 1, 7, -1, 1, -1, -6, -3, 6, -7, 3, -1 ]
1096 RVMap { eob_sym: 0, esc_sym: 35, runtab: [
1097 0, 1, 1, 2, 2, 3, 3, 4, 4, 1, 1, 5, 5, 6, 6, 7,
1098 7, 8, 8, 9, 9, 2, 2, 10, 10, 1, 1, 11, 11, 12, 12, 3,
1099 3, 13, 13, 0, 14, 14, 16, 15, 16, 15, 4, 4, 17, 1, 17, 1,
1100 5, 5, 18, 18, 2, 2, 6, 6, 8, 19, 7, 8, 7, 19, 20, 20,
1101 21, 21, 22, 24, 22, 24, 23, 23, 1, 1, 25, 25, 3, 3, 26, 26,
1102 9, 9, 27, 27, 28, 28, 33, 29, 4, 33, 29, 1, 4, 1, 32, 32,
1103 2, 2, 31, 10, 30, 10, 30, 31, 34, 34, 5, 5, 36, 36, 35, 41,
1104 35, 11, 41, 11, 37, 1, 8, 8, 37, 6, 1, 6, 40, 7, 7, 40,
1105 12, 38, 12, 39, 39, 38, 49, 13, 49, 13, 3, 42, 3, 42, 16, 16,
1106 43, 43, 14, 14, 1, 1, 44, 15, 44, 15, 2, 2, 57, 48, 50, 48,
1107 57, 50, 4, 45, 45, 4, 46, 47, 47, 46, 1, 51, 1, 17, 17, 51,
1108 8, 9, 9, 5, 58, 8, 58, 5, 52, 52, 55, 56, 53, 56, 55, 59,
1109 59, 53, 54, 1, 6, 54, 7, 7, 6, 1, 2, 3, 2, 3, 64, 60,
1110 60, 10, 10, 64, 61, 62, 61, 63, 1, 63, 62, 1, 18, 24, 18, 4,
1111 25, 4, 8, 21, 21, 1, 24, 22, 25, 22, 8, 11, 19, 11, 23, 1,
1112 20, 23, 19, 20, 5, 12, 5, 1, 16, 2, 12, 13, 2, 13, 1, 16 ],
1114 0, 1, -1, 1, -1, 1, -1, 1, -1, 2, -2, 1, -1, 1, -1, 1,
1115 -1, 1, -1, 1, -1, 2, -2, 1, -1, 3, -3, 1, -1, 1, -1, 2,
1116 -2, 1, -1, 0, 1, -1, 1, 1, -1, -1, 2, -2, 1, 4, -1, -4,
1117 2, -2, 1, -1, -3, 3, 2, -2, 2, 1, 2, -2, -2, -1, 1, -1,
1118 1, -1, 1, 1, -1, -1, 1, -1, 5, -5, 1, -1, 3, -3, 1, -1,
1119 2, -2, 1, -1, 1, -1, 1, 1, 3, -1, -1, 6, -3, -6, -1, 1,
1120 4, -4, 1, 2, 1, -2, -1, -1, 1, -1, 3, -3, 1, -1, 1, 1,
1121 -1, 2, -1, -2, 1, 7, -3, 3, -1, 3, -7, -3, 1, -3, 3, -1,
1122 2, 1, -2, 1, -1, -1, 1, 2, -1, -2, -4, -1, 4, 1, 2, -2,
1123 1, -1, -2, 2, 8, -8, -1, 2, 1, -2, -5, 5, 1, -1, -1, 1,
1124 -1, 1, 4, -1, 1, -4, -1, -1, 1, 1, 9, 1, -9, 2, -2, -1,
1125 -4, 3, -3, -4, -1, 4, 1, 4, 1, -1, 1, -1, 1, 1, -1, 1,
1126 -1, -1, -1, 10, 4, 1, 4, -4, -4, -10, 6, 5, -6, -5, 1, -1,
1127 1, 3, -3, -1, 1, -1, -1, -1, 11, 1, 1, -11, -2, -2, 2, 5,
1128 -2, -5, -5, 2, -2, 12, 2, -2, 2, 2, 5, -3, -2, 3, -2, -12,
1129 -2, 2, 2, 2, -5, 3, 5, 13, -3, 7, -3, -3, -7, 3, -13, 3 ]
1131 RVMap { eob_sym: 0, esc_sym: 34, runtab: [
1132 0, 1, 1, 1, 2, 2, 1, 3, 3, 1, 1, 1, 4, 4, 1, 5,
1133 2, 1, 5, 2, 1, 1, 6, 6, 1, 1, 1, 1, 1, 7, 3, 1,
1134 2, 3, 0, 1, 2, 7, 1, 1, 1, 8, 1, 1, 8, 1, 1, 1,
1135 9, 1, 9, 1, 2, 1, 1, 2, 1, 1, 10, 4, 1, 10, 1, 4,
1136 1, 1, 1, 1, 1, 3, 1, 1, 1, 3, 2, 1, 5, 1, 1, 1,
1137 2, 5, 1, 11, 1, 11, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1138 2, 1, 6, 1, 6, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 12,
1139 3, 1, 12, 1, 1, 1, 2, 1, 1, 3, 1, 1, 1, 1, 1, 1,
1140 4, 1, 1, 1, 2, 1, 1, 4, 1, 1, 1, 1, 1, 1, 2, 1,
1141 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 1, 2, 1, 1, 5,
1142 1, 1, 1, 1, 1, 7, 1, 7, 1, 1, 2, 3, 1, 1, 1, 1,
1143 5, 1, 1, 1, 1, 1, 1, 2, 13, 1, 1, 1, 1, 1, 1, 1,
1144 1, 1, 1, 1, 1, 1, 1, 1, 13, 2, 1, 1, 4, 1, 1, 1,
1145 3, 1, 6, 1, 1, 1, 14, 1, 1, 1, 1, 1, 14, 6, 1, 1,
1146 1, 1, 15, 2, 4, 1, 2, 3, 15, 1, 1, 1, 8, 1, 1, 8,
1147 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1 ],
1149 0, 1, -1, 2, 1, -1, -2, 1, -1, 3, -3, 4, 1, -1, -4, 1,
1150 2, 5, -1, -2, -5, 6, 1, -1, -6, 7, -7, 8, -8, 1, 2, 9,
1151 3, -2, 0, -9, -3, -1, 10, -10, 11, 1, -11, 12, -1, -12, 13, -13,
1152 1, 14, -1, -14, 4, 15, -15, -4, 16, -16, 1, 2, 17, -1, -17, -2,
1153 18, -18, 19, -19, 20, 3, -20, 21, -21, -3, 5, 22, 2, -22, -23, 23,
1154 -5, -2, 24, 1, -24, -1, 25, -25, 26, -26, -27, 27, 28, 29, -28, -29,
1155 6, 30, 2, -31, -2, -30, 31, -6, -32, 32, 33, -33, 34, -35, -34, 1,
1156 4, -36, -1, 35, 37, 36, 7, -37, 38, -4, -38, 39, 41, 40, -40, -39,
1157 3, 42, -43, -41, -7, -42, 43, -3, 44, -44, 45, -45, 46, 47, 8, -47,
1158 -48, -46, 50, -50, 48, 49, 51, -49, 52, -52, 5, -51, -8, -53, 53, 3,
1159 -56, 56, 55, 54, -54, 2, 60, -2, -55, 58, 9, -5, 59, 57, -57, -63,
1160 -3, -58, -60, -61, 61, -59, -62, -9, 1, 64, 62, 69, -64, 63, 65, -67,
1161 -68, 66, -65, 68, -66, -69, 67, -70, -1, 10, 71, -71, 4, 73, 72, 70,
1162 6, -76, -3, 74, -78, -74, 1, 78, 80, -72, -75, 76, -1, 3, -73, 79,
1163 75, 77, 1, 11, -4, -79, -10, -6, -1, -77, -83, -80, 2, 81, -84, -2,
1164 83, -81, 82, -82, 84, -87, -86, 85, -11, -85, 86, -89, 87, -88, 88, 89 ]
1166 RVMap { eob_sym: 2, esc_sym: 33, runtab: [
1167 1, 1, 0, 2, 1, 2, 1, 3, 3, 1, 1, 4, 4, 2, 2, 1,
1168 1, 5, 5, 6, 1, 6, 1, 7, 7, 3, 3, 2, 8, 2, 8, 1,
1169 1, 0, 9, 9, 1, 1, 10, 4, 10, 4, 11, 11, 2, 1, 2, 1,
1170 12, 12, 3, 3, 1, 1, 13, 5, 5, 13, 14, 1, 1, 14, 2, 2,
1171 6, 6, 15, 1, 1, 15, 16, 4, 7, 16, 4, 7, 1, 1, 3, 3,
1172 8, 8, 2, 2, 1, 1, 17, 17, 1, 1, 18, 18, 5, 5, 2, 2,
1173 1, 1, 9, 19, 9, 19, 20, 3, 3, 20, 1, 10, 21, 1, 10, 4,
1174 4, 21, 22, 6, 6, 22, 1, 1, 23, 24, 2, 2, 23, 24, 11, 1,
1175 1, 11, 7, 25, 7, 1, 1, 25, 8, 8, 3, 26, 3, 1, 12, 2,
1176 2, 26, 1, 12, 5, 5, 27, 4, 1, 4, 1, 27, 28, 1, 28, 13,
1177 1, 13, 2, 29, 2, 1, 32, 6, 1, 30, 14, 29, 14, 6, 3, 31,
1178 3, 1, 30, 1, 32, 31, 33, 9, 33, 1, 1, 7, 9, 7, 2, 2,
1179 1, 1, 4, 36, 34, 4, 5, 10, 10, 5, 34, 1, 1, 35, 8, 8,
1180 36, 3, 35, 1, 15, 3, 2, 1, 16, 15, 16, 2, 37, 1, 37, 1,
1181 1, 1, 6, 6, 38, 1, 38, 11, 1, 39, 39, 40, 11, 2, 41, 4,
1182 40, 1, 2, 4, 1, 1, 1, 41, 3, 1, 3, 1, 5, 7, 5, 7 ],
1184 1, -1, 0, 1, 2, -1, -2, 1, -1, 3, -3, 1, -1, 2, -2, 4,
1185 -4, 1, -1, 1, 5, -1, -5, 1, -1, 2, -2, 3, 1, -3, -1, 6,
1186 -6, 0, 1, -1, 7, -7, 1, 2, -1, -2, 1, -1, 4, 8, -4, -8,
1187 1, -1, 3, -3, 9, -9, 1, 2, -2, -1, 1, 10, -10, -1, 5, -5,
1188 2, -2, 1, 11, -11, -1, 1, 3, 2, -1, -3, -2, 12, -12, 4, -4,
1189 2, -2, -6, 6, 13, -13, 1, -1, 14, -14, 1, -1, 3, -3, 7, -7,
1190 15, -15, 2, 1, -2, -1, 1, 5, -5, -1, -16, 2, 1, 16, -2, 4,
1191 -4, -1, 1, 3, -3, -1, 17, -17, 1, 1, -8, 8, -1, -1, 2, 18,
1192 -18, -2, 3, 1, -3, 19, -19, -1, 3, -3, 6, 1, -6, 20, 2, 9,
1193 -9, -1, -20, -2, 4, -4, 1, -5, 21, 5, -21, -1, 1, -22, -1, 2,
1194 22, -2, 10, 1, -10, 23, 1, 4, -23, 1, 2, -1, -2, -4, -7, 1,
1195 7, -24, -1, 24, -1, -1, 1, 3, -1, -25, 25, 4, -3, -4, 11, -11,
1196 26, -26, 6, 1, 1, -6, -5, -3, 3, 5, -1, -27, 27, 1, 4, -4,
1197 -1, -8, -1, 28, 2, 8, -12, -28, -2, -2, 2, 12, -1, 29, 1, -29,
1198 30, -30, 5, -5, 1, -31, -1, 3, 31, -1, 1, 1, -3, -13, 1, -7,
1199 -1, -32, 13, 7, 32, 33, -33, -1, -9, -34, 9, 34, -6, 5, 6, -5 ]
1201 RVMap { eob_sym: 2, esc_sym: 13, runtab: [
1202 1, 1, 0, 1, 1, 2, 2, 1, 1, 3, 3, 1, 1, 0, 2, 2,
1203 4, 1, 4, 1, 1, 1, 5, 5, 1, 1, 6, 6, 2, 2, 1, 1,
1204 3, 3, 7, 7, 1, 1, 8, 8, 1, 1, 2, 2, 1, 9, 1, 9,
1205 4, 4, 10, 1, 1, 10, 1, 1, 11, 11, 3, 3, 1, 2, 1, 2,
1206 1, 1, 12, 12, 5, 5, 1, 1, 13, 1, 1, 13, 2, 2, 1, 1,
1207 6, 6, 1, 1, 4, 14, 4, 14, 3, 1, 3, 1, 1, 1, 15, 7,
1208 15, 2, 2, 7, 1, 1, 1, 8, 1, 8, 16, 16, 1, 1, 1, 1,
1209 2, 1, 1, 2, 1, 1, 3, 5, 5, 3, 4, 1, 1, 4, 1, 1,
1210 17, 17, 9, 1, 1, 9, 2, 2, 1, 1, 10, 10, 1, 6, 1, 1,
1211 6, 18, 1, 1, 18, 1, 1, 1, 2, 2, 3, 1, 3, 1, 1, 1,
1212 4, 1, 19, 1, 19, 7, 1, 1, 20, 1, 4, 20, 1, 7, 11, 2,
1213 1, 11, 21, 2, 8, 5, 1, 8, 1, 5, 21, 1, 1, 1, 22, 1,
1214 1, 22, 1, 1, 3, 3, 1, 23, 2, 12, 24, 1, 1, 2, 1, 1,
1215 12, 23, 1, 1, 24, 1, 1, 1, 4, 1, 1, 1, 2, 1, 6, 6,
1216 4, 2, 1, 1, 1, 1, 1, 1, 1, 14, 13, 3, 1, 25, 9, 25,
1217 14, 1, 9, 3, 13, 1, 1, 1, 1, 1, 10, 1, 1, 2, 10, 2 ],
1219 -20, -1, 0, 2, -2, 1, -1, 3, -3, 1, -1, 4, -4, 0, 2, -2,
1220 1, 5, -1, -5, 6, -6, 1, -1, 7, -7, 1, -1, 3, -3, 8, -8,
1221 2, -2, 1, -1, 9, -9, 1, -1, 10, -10, 4, -4, 11, 1, -11, -1,
1222 2, -2, 1, 12, -12, -1, 13, -13, 1, -1, 3, -3, 14, 5, -14, -5,
1223 -15, 15, -1, 1, 2, -2, 16, -16, 1, 17, -17, -1, 6, -6, 18, -18,
1224 2, -2, -19, 19, -3, 1, 3, -1, 4, 20, -4, 1, -21, 21, 1, 2,
1225 -1, -7, 7, -2, 22, -22, 23, 2, -23, -2, 1, -1, -24, 24, -25, 25,
1226 -8, -26, 26, 8, -27, 27, 5, 3, -3, -5, -4, 28, -28, 4, 29, -29,
1227 1, -1, -2, -30, 30, 2, 9, -9, -31, 31, 2, -2, -32, 3, 32, -33,
1228 -3, 1, 33, -34, -1, 34, -35, 35, -10, 10, -6, 36, 6, -36, 37, -37,
1229 -5, 38, 1, -38, -1, 3, 39, -39, -1, 40, 5, 1, -40, -3, 2, -11,
1230 -41, -2, 1, 11, -3, -4, 41, 3, 42, 4, -1, -43, -42, 43, 1, -44,
1231 45, -1, 44, -45, -7, 7, -46, 1, -12, 2, 1, -47, 46, 12, 47, 48,
1232 -2, -1, -48, 49, -1, -50, -49, 50, -6, -51, 51, 52, -13, 53, -4, 4,
1233 6, 13, -53, -52, -54, 55, 54, -55, -56, -2, 2, -8, 56, 1, -3, -1,
1234 2, 58, 3, 8, -2, 57, -58, -60, -59, -57, -3, 60, 59, -14, 3, 14 ]
1236 RVMap { eob_sym: 2, esc_sym: 38, runtab: [
1237 1, 1, 0, 2, 2, 1, 1, 3, 3, 4, 4, 5, 5, 1, 1, 6,
1238 6, 2, 2, 7, 7, 8, 8, 1, 1, 3, 3, 9, 9, 10, 10, 1,
1239 1, 2, 2, 4, 4, 11, 0, 11, 12, 12, 13, 13, 1, 1, 5, 5,
1240 14, 14, 15, 16, 15, 16, 3, 3, 1, 6, 1, 6, 2, 2, 7, 7,
1241 8, 8, 17, 17, 1, 1, 4, 4, 18, 18, 2, 2, 1, 19, 1, 20,
1242 19, 20, 21, 21, 3, 3, 22, 22, 5, 5, 24, 1, 1, 23, 9, 23,
1243 24, 9, 2, 2, 10, 1, 1, 10, 6, 6, 25, 4, 4, 25, 7, 7,
1244 26, 8, 1, 8, 3, 1, 26, 3, 11, 11, 27, 27, 2, 28, 1, 2,
1245 28, 1, 12, 12, 5, 5, 29, 13, 13, 29, 32, 1, 1, 33, 31, 30,
1246 32, 4, 30, 33, 4, 31, 3, 14, 1, 1, 3, 34, 34, 2, 2, 14,
1247 6, 6, 35, 36, 35, 36, 1, 15, 1, 16, 16, 15, 7, 9, 7, 9,
1248 37, 8, 8, 37, 1, 1, 39, 2, 38, 39, 2, 40, 5, 38, 40, 5,
1249 3, 3, 4, 4, 10, 10, 1, 1, 1, 1, 41, 2, 41, 2, 6, 6,
1250 1, 1, 11, 42, 11, 43, 3, 42, 3, 17, 4, 43, 1, 17, 7, 1,
1251 8, 44, 4, 7, 44, 5, 8, 2, 5, 1, 2, 48, 45, 1, 12, 45,
1252 12, 48, 13, 13, 1, 9, 9, 46, 1, 46, 47, 47, 49, 18, 18, 49 ],
1254 1, -1, 0, 1, -1, 2, -2, 1, -1, 1, -1, 1, -1, 3, -3, 1,
1255 -1, -2, 2, 1, -1, 1, -1, 4, -4, -2, 2, 1, -1, 1, -1, 5,
1256 -5, -3, 3, 2, -2, 1, 0, -1, 1, -1, 1, -1, 6, -6, 2, -2,
1257 1, -1, 1, 1, -1, -1, -3, 3, 7, 2, -7, -2, -4, 4, 2, -2,
1258 2, -2, 1, -1, 8, -8, 3, -3, 1, -1, -5, 5, 9, 1, -9, 1,
1259 -1, -1, 1, -1, -4, 4, 1, -1, 3, -3, 1, -10, 10, 1, 2, -1,
1260 -1, -2, 6, -6, 2, 11, -11, -2, 3, -3, 1, -4, 4, -1, 3, -3,
1261 1, 3, 12, -3, -5, -12, -1, 5, 2, -2, 1, -1, -7, 1, 13, 7,
1262 -1, -13, 2, -2, 4, -4, 1, 2, -2, -1, 1, 14, -14, 1, 1, 1,
1263 -1, -5, -1, -1, 5, -1, -6, 2, -15, 15, 6, 1, -1, -8, 8, -2,
1264 -4, 4, 1, 1, -1, -1, 16, 2, -16, -2, 2, -2, 4, 3, -4, -3,
1265 -1, -4, 4, 1, -17, 17, -1, -9, 1, 1, 9, 1, -5, -1, -1, 5,
1266 -7, 7, 6, -6, 3, -3, 18, -18, 19, -19, 1, -10, -1, 10, -5, 5,
1267 20, -20, -3, 1, 3, 1, 8, -1, -8, 2, 7, -1, -21, -2, 5, 21,
1268 5, -1, -7, -5, 1, -6, -5, -11, 6, 22, 11, 1, 1, -22, -3, -1,
1269 3, -1, 3, -3, -23, 4, -4, 1, 23, -1, 1, -1, 1, -2, 2, -1 ]
1271 RVMap { eob_sym: 4, esc_sym: 11, runtab: [
1272 1, 1, 1, 1, 0, 2, 2, 1, 1, 3, 3, 0, 1, 1, 2, 2,
1273 4, 4, 1, 1, 5, 5, 1, 1, 2, 2, 3, 3, 6, 6, 1, 1,
1274 7, 7, 8, 1, 8, 2, 2, 1, 4, 4, 1, 3, 1, 3, 9, 9,
1275 2, 2, 1, 5, 1, 5, 10, 10, 1, 1, 11, 11, 3, 6, 3, 4,
1276 4, 6, 2, 2, 1, 12, 1, 12, 7, 13, 7, 13, 1, 1, 8, 8,
1277 2, 2, 14, 14, 16, 15, 16, 5, 5, 1, 3, 15, 1, 3, 4, 4,
1278 1, 1, 17, 17, 2, 2, 6, 6, 1, 18, 1, 18, 22, 21, 22, 21,
1279 25, 24, 25, 19, 9, 20, 9, 23, 19, 24, 20, 3, 23, 7, 3, 1,
1280 1, 7, 28, 26, 29, 5, 28, 26, 5, 8, 29, 4, 8, 27, 2, 2,
1281 4, 27, 1, 1, 10, 36, 10, 33, 33, 36, 30, 1, 32, 32, 1, 30,
1282 6, 31, 31, 35, 3, 6, 11, 11, 3, 2, 35, 2, 34, 1, 34, 1,
1283 37, 37, 12, 7, 12, 5, 41, 5, 4, 7, 1, 8, 13, 4, 1, 41,
1284 13, 38, 8, 38, 9, 1, 40, 40, 9, 1, 39, 2, 2, 49, 39, 42,
1285 3, 3, 14, 16, 49, 14, 16, 42, 43, 43, 6, 6, 15, 1, 1, 15,
1286 44, 44, 1, 1, 50, 48, 4, 5, 4, 7, 5, 2, 10, 10, 48, 7,
1287 50, 45, 2, 1, 45, 8, 8, 1, 46, 46, 3, 47, 47, 3, 1, 1 ],
1289 1, -1, 2, -2, 0, 1, -1, 3, -3, 1, -1, 0, 4, -4, 2, -2,
1290 1, -1, 5, -5, 1, -1, 6, -6, 3, -3, 2, -2, 1, -1, 7, -7,
1291 1, -1, 1, 8, -1, 4, -4, -8, 2, -2, 9, 3, -9, -3, 1, -1,
1292 5, -5, 10, 2, -10, -2, 1, -1, 11, -11, 1, -1, -4, 2, 4, 3,
1293 -3, -2, 6, -6, 12, 1, -12, -1, 2, 1, -2, -1, 13, -13, 2, -2,
1294 7, -7, 1, -1, 1, 1, -1, 3, -3, 14, 5, -1, -14, -5, 4, -4,
1295 15, -15, 1, -1, 8, -8, -3, 3, 16, 1, -16, -1, 1, 1, -1, -1,
1296 1, 1, -1, 1, 2, 1, -2, 1, -1, -1, -1, 6, -1, 3, -6, 17,
1297 -17, -3, 1, 1, 1, 4, -1, -1, -4, 3, -1, 5, -3, -1, -9, 9,
1298 -5, 1, 18, -18, 2, 1, -2, 1, -1, -1, 1, 19, -1, 1, -19, -1,
1299 4, 1, -1, 1, 7, -4, -2, 2, -7, 10, -1, -10, 1, 20, -1, -20,
1300 1, -1, 2, 4, -2, 5, 1, -5, 6, -4, 21, 4, 2, -6, -21, -1,
1301 -2, 1, -4, -1, -3, 22, -1, 1, 3, -22, -1, 11, -11, 1, 1, 1,
1302 8, -8, 2, 2, -1, -2, -2, -1, 1, -1, -5, 5, 2, 23, -23, -2,
1303 1, -1, 24, -24, -1, -1, 7, 6, -7, 5, -6, 12, -3, 3, 1, -5,
1304 1, 1, -12, 25, -1, -5, 5, -25, -1, 1, 9, 1, -1, -9, 26, -26 ]