3 pub use std::cell::{Ref,RefCell};
4 use nihav_core::io::bitreader::*;
6 use nihav_core::codecs::*;
10 pub fn scale_mv(val: i32, scale: u8) -> i32 {
11 (val + (if val > 0 { 1 } else { 0 }) + (scale as i32) - 1) >> scale
15 pub struct IVICodebook {
22 pub fn init(&self) -> Self {
24 let mut base: u32 = 0;
27 base += 1 << cb.bits[i];
33 pub const IVI_CB_ZERO: IVICodebook = IVICodebook { len: 0, bits: [0; 16], offs: [0; 16] };
35 const IVI_REV0: [u32; 1] = [0];
36 const IVI_REV1: [u32; 2] = [0, 1];
37 const IVI_REV2: [u32; 4] = [0, 2, 1, 3];
38 const IVI_REV3: [u32; 8] = [0, 4, 2, 6, 1, 5, 3, 7];
39 const IVI_REV4: [u32; 16] = [ 0, 8, 4, 12, 2, 10, 6, 14, 1, 9, 5, 13, 3, 11, 7, 15];
40 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];
41 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];
42 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];
43 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];
45 const IVI_REVS: [&[u32]; 9] = [ &IVI_REV0, &IVI_REV1, &IVI_REV2, &IVI_REV3, &IVI_REV4, &IVI_REV5, &IVI_REV6, &IVI_REV7, &IVI_REV8];
47 pub trait IVICodebookReader {
48 fn read_ivi_codebook_desc(&mut self, mb_cb: bool, try_default: bool) -> DecoderResult<IVICodebook>;
49 fn read_ivi_cb(&mut self, cb: &IVICodebook) -> BitReaderResult<u32>;
50 fn read_ivi_cb_s(&mut self, cb: &IVICodebook) -> BitReaderResult<i32>;
53 impl<'a> IVICodebookReader for BitReader<'a> {
54 fn read_ivi_codebook_desc(&mut self, mb_cb: bool, desc_coded: bool) -> DecoderResult<IVICodebook> {
57 Ok(IVI_MB_CB[7].init())
59 Ok(IVI_BLK_CB[7].init())
62 let idx = self.read(3)? as usize;
65 Ok(IVI_MB_CB[idx].init())
67 Ok(IVI_BLK_CB[idx].init())
70 let mut cb = IVI_CB_ZERO;
71 cb.len = self.read(4)? as usize;
72 if cb.len == 0 { return Err(DecoderError::InvalidData); }
74 cb.bits[i] = self.read(4)? as u8;
81 fn read_ivi_cb(&mut self, cb: &IVICodebook) -> BitReaderResult<u32> {
82 /* let pfx = if cb.len == 1 { 0 } else { self.read_code(UintCodeType::LimitedUnary((cb.len - 1) as u32, 0))? as usize };
83 let nbits = cb.bits[pfx];
84 let mut base: u32 = 0;
85 for i in 0..pfx { base += 1 << cb.bits[i]; }
86 let rval = self.read(nbits)?;
87 let add = reverse_bits(rval, nbits);
90 let len = (!self.peek(16)).trailing_zeros() as usize;
92 if len >= cb.len - 1 {
94 self.skip((cb.len - 1) as u32)?;
97 self.skip((len + 1) as u32)?;
99 let nbits = cb.bits[pfx];
100 let base = cb.offs[pfx];
101 let rval = self.read(nbits)?;
102 let add = IVI_REVS[nbits as usize][rval as usize];
105 let nbits = cb.bits[0];
106 return Ok(IVI_REVS[nbits as usize][self.read(nbits)? as usize]);
110 fn read_ivi_cb_s(&mut self, cb: &IVICodebook) -> BitReaderResult<i32> {
111 let v = self.read_ivi_cb(cb)?;
115 let sign = (v & 1) == 1;
116 let val = (v >> 1) as i32;
126 pub const IVI_MB_CB: &[IVICodebook; 8] = &[
127 IVICodebook { len: 8, bits: [ 0, 4, 5, 4, 4, 4, 6, 6, 0, 0, 0, 0, 0, 0, 0, 0 ], offs: [0; 16] },
128 IVICodebook { len: 12, bits: [ 0, 2, 2, 3, 3, 3, 3, 5, 3, 2, 2, 2, 0, 0, 0, 0 ], offs: [0; 16] },
129 IVICodebook { len: 12, bits: [ 0, 2, 3, 4, 3, 3, 3, 3, 4, 3, 2, 2, 0, 0, 0, 0 ], offs: [0; 16] },
130 IVICodebook { len: 12, bits: [ 0, 3, 4, 4, 3, 3, 3, 3, 3, 2, 2, 2, 0, 0, 0, 0 ], offs: [0; 16] },
131 IVICodebook { len: 13, bits: [ 0, 4, 4, 3, 3, 3, 3, 2, 3, 3, 2, 1, 1, 0, 0, 0 ], offs: [0; 16] },
132 IVICodebook { len: 9, bits: [ 0, 4, 4, 4, 4, 3, 3, 3, 2, 0, 0, 0, 0, 0, 0, 0 ], offs: [0; 16] },
133 IVICodebook { len: 10, bits: [ 0, 4, 4, 4, 4, 3, 3, 2, 2, 2, 0, 0, 0, 0, 0, 0 ], offs: [0; 16] },
134 IVICodebook { len: 12, bits: [ 0, 4, 4, 4, 3, 3, 2, 3, 2, 2, 2, 2, 0, 0, 0, 0 ], offs: [0; 16] }
137 pub const IVI_BLK_CB: &[IVICodebook; 8] = &[
138 IVICodebook { len: 10, bits: [ 1, 2, 3, 4, 4, 7, 5, 5, 4, 1, 0, 0, 0, 0, 0, 0 ], offs: [0; 16] },
139 IVICodebook { len: 11, bits: [ 2, 3, 4, 4, 4, 7, 5, 4, 3, 3, 2, 0, 0, 0, 0, 0 ], offs: [0; 16] },
140 IVICodebook { len: 12, bits: [ 2, 4, 5, 5, 5, 5, 6, 4, 4, 3, 1, 1, 0, 0, 0, 0 ], offs: [0; 16] },
141 IVICodebook { len: 13, bits: [ 3, 3, 4, 4, 5, 6, 6, 4, 4, 3, 2, 1, 1, 0, 0, 0 ], offs: [0; 16] },
142 IVICodebook { len: 11, bits: [ 3, 4, 4, 5, 5, 5, 6, 5, 4, 2, 2, 0, 0, 0, 0, 0 ], offs: [0; 16] },
143 IVICodebook { len: 13, bits: [ 3, 4, 5, 5, 5, 5, 6, 4, 3, 3, 2, 1, 1, 0, 0, 0 ], offs: [0; 16] },
144 IVICodebook { len: 13, bits: [ 3, 4, 5, 5, 5, 6, 5, 4, 3, 3, 2, 1, 1, 0, 0, 0 ], offs: [0; 16] },
145 IVICodebook { len: 9, bits: [ 3, 4, 4, 5, 5, 5, 6, 5, 5, 0, 0, 0, 0, 0, 0, 0 ], offs: [0; 16] }
148 #[allow(unused_variables)]
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 = ((quant_mat[spos] as u32) * (quant as u32)) >> 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 = ((quant_mat[spos] as u32) * (quant as u32)) >> 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().offset(offs as isize);
333 for y in 0..blk_size {
334 for x in 0..blk_size {
335 *dptr.offset(x as isize) = blk[x + y * blk_size] as i16;
337 dptr = dptr.offset(stride as isize);
342 fn add_block(frame: &mut [i16], offs: usize, stride: usize, blk: &[i32], blk_size: usize) {
344 let mut dptr = frame.as_mut_ptr().offset(offs as isize);
345 for y in 0..blk_size {
346 for x in 0..blk_size {
347 *dptr.offset(x as isize) = (*dptr.offset(x as isize)).wrapping_add(blk[x + y * blk_size] as i16);
349 dptr = dptr.offset(stride as isize);
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() -> Rc<RefCell<Self>> {
367 Rc::new(RefCell::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 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) {
411 let (xoff, yoff, mv_mode) = if is_hpel {
412 (mv_x >> 1, mv_y >> 1, ((mv_x & 1) + (mv_y & 1) * 2) as u8)
416 let xpos = (x as isize) + (xoff as isize);
417 let ypos = (y as isize) + (yoff as isize);
418 if (xpos < (l as isize)) || ((xpos as usize) + blk_size + ((mv_mode & 1) as usize) > r) ||
419 (ypos < (t as isize)) || ((ypos as usize) + blk_size + ((mv_mode >> 1) as usize) > b) {
420 //println!(" copy from {},{} of {}-{},{}-{} {}x{}!", xpos, ypos, l,r,t,b,blk_size,blk_size);
423 let sidx = (xpos as usize) + (ypos as usize) * sstride;
425 ivi_mc_put(dst, dstride, &src[sidx..], sstride, mv_mode, 8, 8);
427 ivi_mc_put(dst, dstride, &src[sidx..], sstride, mv_mode, 4, 4);
431 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) {
432 let (xoff1, yoff1, mv_mode1) = if is_hpel {
433 (mv_x >> 1, mv_y >> 1, ((mv_x & 1) + (mv_y & 1) * 2) as u8)
437 let xpos1 = (x as isize) + (xoff1 as isize);
438 let ypos1 = (y as isize) + (yoff1 as isize);
439 if (xpos1 < (l as isize)) || ((xpos1 as usize) + blk_size + ((mv_mode1 & 1) as usize) > r) ||
440 (ypos1 < (t as isize)) || ((ypos1 as usize) + blk_size + ((mv_mode1 >> 1) as usize) > b) {
443 let sidx1 = (xpos1 as usize) + (ypos1 as usize) * sstride1;
444 let (xoff2, yoff2, mv_mode2) = if is_hpel {
445 (mv2_x >> 1, mv2_y >> 1, ((mv2_x & 1) + (mv2_y & 1) * 2) as u8)
449 let xpos2 = (x as isize) + (xoff2 as isize);
450 let ypos2 = (y as isize) + (yoff2 as isize);
451 if (xpos2 < (l as isize)) || ((xpos2 as usize) + blk_size + ((mv_mode2 & 1) as usize) > r) ||
452 (ypos2 < (t as isize)) || ((ypos2 as usize) + blk_size + ((mv_mode2 >> 1) as usize) > b) {
455 let sidx2 = (xpos2 as usize) + (ypos2 as usize) * sstride2;
456 ivi_mc_avg(dst, dstride, &src1[sidx1..], sstride1, mv_mode1, &src2[sidx2..], sstride2, mv_mode2, blk_size, blk_size);
459 pub trait IndeoXParser {
460 fn decode_picture_header(&mut self, br: &mut BitReader) -> DecoderResult<PictureHeader>;
461 fn decode_band_header(&mut self, br: &mut BitReader, pic_hdr: &PictureHeader, plane: usize, band: usize) -> DecoderResult<BandHeader>;
462 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<()>;
463 fn recombine_plane(&mut self, src: &[i16], sstride: usize, dst: &mut [u8], dstride: usize, w: usize, h: usize);
466 const MISSING_REF: usize = 42;
468 pub struct IVIDecoder {
470 frames: [Rc<RefCell<FrameData>>; 4],
479 bref: Option<NABufferType>,
481 bands: Vec<BandHeader>,
482 tiles: Vec<Rc<RefCell<IVITile>>>,
483 num_tiles: [[usize; 4]; 4],
484 tile_start: [[usize; 4]; 4],
488 pub fn new() -> Self {
489 let mut bands: Vec<BandHeader> = Vec::with_capacity(12);
490 bands.resize(12, BandHeader::new_empty(42, 42));
492 ftype: IVIFrameType::NULL,
493 frames: [FrameData::new(), FrameData::new(), FrameData::new(), FrameData::new()],
494 cur_frame: 0, prev_frame: MISSING_REF, next_frame: MISSING_REF,
495 iref_0: MISSING_REF, iref_1: MISSING_REF, scal_ref: MISSING_REF,
496 vinfo: NAVideoInfo::new(0, 0, false, YUV410_FORMAT),
497 vinfoa: NAVideoInfo::new(0, 0, false, YUVA410_FORMAT),
501 tiles: Vec::new(), tile_start: [[0; 4]; 4], num_tiles: [[0; 4]; 4],
505 fn realloc(&mut self, pic_hdr: &PictureHeader) -> DecoderResult<()> {
506 let planes = if pic_hdr.transparent { 4 } else { 3 };
508 //self.bands.truncate(0);
509 self.tiles.truncate(0);
510 self.num_tiles = [[0; 4]; 4];
511 self.tile_start = [[0; 4]; 4];
512 let mut tstart: usize = 0;
513 for plane in 0..planes {
514 let is_luma = (plane != 1) && (plane != 2);
515 let bands = if is_luma { pic_hdr.luma_bands } else { pic_hdr.chroma_bands };
516 let mut band_w = if is_luma { pic_hdr.width } else { (pic_hdr.width + 3) >> 2 };
517 let mut band_h = if is_luma { pic_hdr.height } else { (pic_hdr.height + 3) >> 2 };
518 let mut tile_w = if is_luma { pic_hdr.slice_w } else { (pic_hdr.slice_w + 3) >> 2 };
519 let mut tile_h = if is_luma { pic_hdr.slice_h } else { (pic_hdr.slice_h + 3) >> 2 };
521 band_w = (band_w + 1) >> 1;
522 band_h = (band_h + 1) >> 1;
524 tile_w = (tile_w + 1) >> 1;
525 tile_h = (tile_h + 1) >> 1;
528 for band in 0..bands {
529 self.tile_start[plane][band] = tstart;
530 let band_xoff = if (band & 1) == 1 { band_w } else { 0 };
531 let band_yoff = if (band & 2) == 2 { band_h } else { 0 };
534 let cur_h = if y + tile_h <= band_h { tile_h } else { band_h - y };
537 let cur_w = if x + tile_w <= band_w { tile_w } else { band_w - x };
538 let tile = IVITile::new(band_xoff + x, band_yoff + y, cur_w, cur_h);
539 self.tiles.push(Rc::new(RefCell::new(tile)));
540 self.num_tiles[plane][band] += 1;
550 fn decode_band(&mut self, pic_hdr: &PictureHeader, dec: &mut IndeoXParser, br: &mut BitReader, plane_no: usize, band_no: usize) -> DecoderResult<()> {
551 let bidx = match plane_no {
553 _ => { pic_hdr.luma_bands + plane_no - 1 },
555 let prev_band = if bidx >= self.bands.len() { BandHeader::new_empty(plane_no, band_no) } else { self.bands[bidx].clone() };
556 let mut band = dec.decode_band_header(br, pic_hdr, plane_no, band_no)?;
557 if let TxType::None = band.ttype {
558 validate!(band.plane_no == prev_band.plane_no);
559 validate!(band.band_no == prev_band.band_no);
560 validate!(band.blk_size == prev_band.blk_size);
561 band.tr = prev_band.tr;
562 band.ttype = prev_band.ttype;
565 let tstart = self.tile_start[band.plane_no][band.band_no];
566 let tend = tstart + self.num_tiles[band.plane_no][band.band_no];
567 let mb_size = band.mb_size;
568 let (tr, tr_dc) = match band.ttype {
569 TxType::Transform4(_) => { ivi_get_transform4x4_funcs(band.tr) },
570 TxType::Transform8(_) => { ivi_get_transform8x8_funcs(band.tr) },
571 _ => { ivi_get_transform4x4_funcs(band.tr) },
573 for tile_no in tstart..tend {
575 let mut tile = self.tiles[tile_no].borrow_mut();
576 let mb_w = (tile.w + mb_size - 1) / mb_size;
577 let mb_h = (tile.h + mb_size - 1) / mb_size;
581 tile.mb.resize(mb_w * mb_h, MB::new(0, 0));
584 let tile_start = br.tell();
585 if !br.read_bool()? {
586 let res = br.read_bool()?;
588 let mut len = br.read(8)? as usize;
590 len = br.read(24)? as usize;
594 let tile_end = tile_start + len * 8;
595 validate!(tile_end > br.tell());
596 validate!(tile_end <= br.tell() + (br.left() as usize));
598 let mut tile = self.tiles[tile_no].borrow_mut();
599 let ref_tile: Option<Ref<IVITile>>;
601 if (plane_no == 0) && (band_no == 0) {
604 mv_scale = (((self.bands[0].mb_size >> 3) as i8) - ((band.mb_size >> 3) as i8)) as u8;
606 if plane_no != 0 || band_no != 0 {
607 let rtile = self.tiles[0].borrow();
608 if (tile.mb_w != rtile.mb_w) || (tile.mb_h != rtile.mb_h) {
611 ref_tile = Some(rtile);
616 dec.decode_mb_info(br, pic_hdr, &band, &mut tile, ref_tile, mv_scale)?;
619 self.decode_tile(br, &band, tile_no, &tr, &tr_dc)?;
620 let skip_part = tile_end - br.tell();
621 br.skip(skip_part as u32)?;
624 let mut tile = self.tiles[tile_no].borrow_mut();
625 let ref_tile: Option<Ref<IVITile>>;
627 if (plane_no == 0) && (band_no == 0) {
630 mv_scale = (((self.bands[0].mb_size >> 3) as i8) - ((band.mb_size >> 3) as i8)) as u8;
632 if plane_no != 0 || band_no != 0 {
633 let rtile = self.tiles[0].borrow();
634 if (tile.mb_w != rtile.mb_w) || (tile.mb_h != rtile.mb_h) {
637 ref_tile = Some(rtile);
643 for mb_y in 0..tile.mb_h {
644 for mb_x in 0..tile.mb_w {
645 let mut mb = MB::new(tile.pos_x + mb_x * band.mb_size, tile.pos_y + mb_y * band.mb_size);
646 mb.mtype = MBType::Inter;
649 if let Some(ref tileref) = ref_tile {
650 let mx = tileref.mb[mb_idx].mv_x;
651 let my = tileref.mb[mb_idx].mv_y;
652 mb.mv_x = scale_mv(mx, mv_scale);
653 mb.mv_y = scale_mv(my, mv_scale);
656 tile.mb[mb_idx] = mb;
661 self.decode_tile(br, &band, tile_no, &tr, &tr_dc)?;
664 self.bands[bidx] = band;
668 fn decode_tile(&mut self, br: &mut BitReader, band: &BandHeader, tile_no: usize, tr: &TrFunc, transform_dc: &TrFuncDC) -> DecoderResult<()> {
670 let mut prev_dc: i32 = 0;
671 let mut tile = self.tiles[tile_no].borrow_mut();
672 let mut frame = self.frames[self.cur_frame].borrow_mut();
674 let stride = frame.plane_stride[band.plane_no];
675 let mut dstidx = tile.pos_x + tile.pos_y * stride;
676 let mut dst = &mut frame.plane_buf[band.plane_no];
677 let pos_x = tile.pos_x;
678 let pos_y = tile.pos_y;
679 let tile_w = (tile.w + 15) & !15;
680 let tile_h = (tile.h + 15) & !15;
681 for mb_y in 0..tile.mb_h {
682 for mb_x in 0..tile.mb_w {
683 let mb = &mut tile.mb[mb_idx];
685 let is_intra = mb.mtype == MBType::Intra;
687 if band.mb_size != band.blk_size {
688 let mut cbp = mb.cbp;
690 let mut blk: [i32; 64] = [0; 64];
691 let boff = (blk_no & 1) * band.blk_size + (blk_no >> 1) * band.blk_size * stride + mb_x * band.mb_size;
693 if mb.mtype != MBType::Bidir {
695 if mb.mtype != MBType::Backward {
696 idx = self.prev_frame;
698 idx = self.next_frame;
700 let pf = self.frames[idx].borrow();
701 do_mc(&mut dst[dstidx + boff..], stride,
702 &pf.plane_buf[band.plane_no], pf.plane_stride[band.plane_no],
703 pos_x + mb_x * band.mb_size + (blk_no & 1) * band.blk_size,
704 pos_y + mb_y * band.mb_size + (blk_no >> 1) * band.blk_size,
705 pos_x, pos_x + tile_w, pos_y, pos_y + tile_h,
706 mb.mv_x, mb.mv_y, band.halfpel, band.blk_size);
708 let pf = self.frames[self.prev_frame].borrow();
709 let nf = self.frames[self.next_frame].borrow();
710 do_mc_b(&mut dst[dstidx + boff..], stride,
711 &pf.plane_buf[band.plane_no], pf.plane_stride[band.plane_no],
712 &nf.plane_buf[band.plane_no], nf.plane_stride[band.plane_no],
713 pos_x + mb_x * band.mb_size + (blk_no & 1) * band.blk_size,
714 pos_y + mb_y * band.mb_size + (blk_no >> 1) * band.blk_size,
715 pos_x, pos_x + tile_w, pos_y, pos_y + tile_h,
716 mb.mv_x, mb.mv_y, mb.mv2_x, mb.mv2_y, band.halfpel,
721 if let TxType::Transform8(ref params) = band.ttype {
722 decode_block8x8(br, &band.blk_cb, &band.rvmap, params, is_intra, band.tr.is_2d(), &mut prev_dc, mb.q, &mut blk, tr)?;
724 put_block(&mut dst, dstidx + boff, stride, &blk, 8);
726 add_block(&mut dst, dstidx + boff, stride, &blk, 8);
729 if let TxType::Transform4(ref params) = band.ttype {
730 decode_block4x4(br, &band.blk_cb, &band.rvmap, params, is_intra, band.tr.is_2d(), &mut prev_dc, mb.q, &mut blk, tr)?;
732 put_block(&mut dst, dstidx + boff, stride, &blk, 4);
734 add_block(&mut dst, dstidx + boff, stride, &blk, 4);
739 (transform_dc)(&mut blk, prev_dc);
740 put_block(&mut dst, dstidx + boff, stride, &blk, band.blk_size);
746 let mut blk: [i32; 64] = [0; 64];
748 if mb.mtype != MBType::Bidir {
750 if mb.mtype != MBType::Backward {
751 idx = self.prev_frame;
753 idx = self.next_frame;
755 let pf = self.frames[idx].borrow();
756 do_mc(&mut dst[dstidx + mb_x * band.blk_size..], stride,
757 &pf.plane_buf[band.plane_no], pf.plane_stride[band.plane_no],
758 pos_x + mb_x * band.mb_size,
759 pos_y + mb_y * band.mb_size,
760 pos_x, pos_x + tile_w, pos_y, pos_y + tile_h,
761 mb.mv_x, mb.mv_y, band.halfpel, band.blk_size);
763 let pf = self.frames[self.prev_frame].borrow();
764 let nf = self.frames[self.next_frame].borrow();
765 do_mc_b(&mut dst[dstidx + mb_x * band.blk_size..], stride,
766 &pf.plane_buf[band.plane_no], pf.plane_stride[band.plane_no],
767 &nf.plane_buf[band.plane_no], nf.plane_stride[band.plane_no],
768 pos_x + mb_x * band.mb_size,
769 pos_y + mb_y * band.mb_size,
770 pos_x, pos_x + tile_w, pos_y, pos_y + tile_h,
771 mb.mv_x, mb.mv_y, mb.mv2_x, mb.mv2_y, band.halfpel,
776 if let TxType::Transform8(ref params) = band.ttype {
777 decode_block8x8(br, &band.blk_cb, &band.rvmap, params, is_intra, band.tr.is_2d(), &mut prev_dc, mb.q, &mut blk, tr)?;
779 if let TxType::Transform4(ref params) = band.ttype {
780 decode_block4x4(br, &band.blk_cb, &band.rvmap, params, is_intra, band.tr.is_2d(), &mut prev_dc, mb.q, &mut blk, tr)?;
783 if band.blk_size == 8 {
784 put_block(&mut dst, dstidx + mb_x * band.blk_size, stride, &blk, 8);
786 put_block(&mut dst, dstidx + mb_x * band.blk_size, stride, &blk, 4);
789 if band.blk_size == 8 {
790 add_block(&mut dst, dstidx + mb_x * band.blk_size, stride, &blk, 8);
792 add_block(&mut dst, dstidx + mb_x * band.blk_size, stride, &blk, 4);
797 (transform_dc)(&mut blk, prev_dc);
798 if band.blk_size == 8 {
799 put_block(&mut dst, dstidx + mb_x * band.blk_size, stride, &blk, 8);
801 put_block(&mut dst, dstidx + mb_x * band.blk_size, stride, &blk, 4);
808 dstidx += stride * band.mb_size;
814 fn find_unused_frame(&self) -> usize {
816 if (fno != self.iref_0) && (fno != self.iref_1) && (fno != self.scal_ref) {
823 fn decode_single_frame<'a>(&mut self, dec: &mut IndeoXParser, br: &mut BitReader<'a>) -> DecoderResult<NABufferType> {
824 let pic_hdr = dec.decode_picture_header(br)?;
825 self.ftype = pic_hdr.ftype;
826 if pic_hdr.ftype.is_null() {
827 return Ok(NABufferType::None);
830 self.cur_frame = self.find_unused_frame();
832 IVIFrameType::Inter => {
833 self.prev_frame = self.iref_0;
834 if self.prev_frame == MISSING_REF {
835 return Err(DecoderError::MissingReference);
838 IVIFrameType::InterDroppable => {
839 self.prev_frame = self.scal_ref;
840 if self.prev_frame == MISSING_REF {
841 return Err(DecoderError::MissingReference);
844 IVIFrameType::InterScal => {
845 self.prev_frame = self.scal_ref;
846 if self.prev_frame == MISSING_REF {
847 return Err(DecoderError::MissingReference);
850 IVIFrameType::Bidir => {
851 self.prev_frame = self.iref_1;
852 self.next_frame = self.iref_0;
853 if (self.prev_frame == MISSING_REF) || (self.next_frame == MISSING_REF) {
854 return Err(DecoderError::MissingReference);
861 if pic_hdr.transparent {
862 vinfo = self.vinfoa.clone();
864 vinfo = self.vinfo.clone();
866 vinfo.set_width(pic_hdr.width);
867 vinfo.set_height(pic_hdr.height);
868 let mut buftype = alloc_video_buffer(vinfo, 0)?;
869 self.realloc(&pic_hdr)?;
870 self.frames[self.cur_frame].borrow_mut().realloc(&pic_hdr)?;
873 let num_bands = if plane == 0 { pic_hdr.luma_bands } else { pic_hdr.chroma_bands };
874 for band in 0..num_bands {
875 self.decode_band(&pic_hdr, dec, br, plane, band)?;
877 if let NABufferType::Video(ref mut vb) = buftype {
878 let mut frame = self.frames[self.cur_frame].borrow_mut();
880 frame.fill_plane(vb, plane);
882 let dplane = if (plane == 1) || (plane == 2) { plane ^ 3 } else { plane };
883 let (w, h) = vb.get_dimensions(dplane);
884 let dstride = vb.get_stride(dplane);
885 let off = vb.get_offset(dplane);
886 let dst = vb.get_data_mut().unwrap();
887 dec.recombine_plane(&frame.plane_buf[plane], frame.plane_stride[plane], &mut dst[off..], dstride, w, h);
891 if pic_hdr.transparent {
892 let mut frame = self.frames[self.cur_frame].borrow_mut();
893 let stride = frame.plane_stride[3];
894 read_trans_band_header(br, pic_hdr.width, pic_hdr.height, &mut frame.plane_buf[3], stride)?;
895 if let NABufferType::Video(ref mut vb) = buftype {
896 frame.fill_plane(vb, 3);
901 IVIFrameType::Intra | IVIFrameType::Inter => {
902 self.iref_1 = self.iref_0;
903 self.iref_0 = self.cur_frame;
904 self.scal_ref = self.cur_frame;
906 IVIFrameType::InterScal => {
907 self.scal_ref = self.cur_frame;
915 pub fn decode_frame<'a>(&mut self, dec: &mut IndeoXParser, br: &mut BitReader<'a>) -> DecoderResult<NABufferType> {
916 let res = self.decode_single_frame(dec, br);
917 if res.is_err() { return res; }
918 if (self.ftype == IVIFrameType::Intra) && (br.left() > 16) {
920 if br.left() < 8 { break; }
921 if br.read(8)? == 0 { break; }
924 if br.left() < 8 { break; }
925 if br.peek(8) != 0 { break; }
929 let seq = br.peek(21);
931 let res2 = self.decode_single_frame(dec, br);
933 self.bref = Some(res2.unwrap());
936 self.ftype = IVIFrameType::Intra;
939 if let Ok(NABufferType::None) = res {
940 if self.bref.is_some() {
941 let mut bref: Option<NABufferType> = None;
942 mem::swap(&mut bref, &mut self.bref);
943 self.ftype = IVIFrameType::Inter;
944 return Ok(bref.unwrap());
950 pub fn is_intra(&mut self) -> bool {
951 self.ftype.is_intra()
953 pub fn get_frame_type(&mut self) -> FrameType {
955 IVIFrameType::Intra => { FrameType::I },
956 IVIFrameType::Intra1 => { FrameType::I },
957 IVIFrameType::Inter => { FrameType::P },
958 IVIFrameType::InterDroppable => { FrameType::P },
959 IVIFrameType::InterScal => { FrameType::P },
960 IVIFrameType::Bidir => { FrameType::B },
961 _ => { FrameType::Skip },
969 pub runtab: [u8; 256],
970 pub valtab: [i8; 256],
973 impl Clone for RVMap {
974 fn clone(&self) -> RVMap {
975 let mut runtab: [u8; 256] = [0; 256];
976 let mut valtab: [i8; 256] = [0; 256];
977 runtab.copy_from_slice(&self.runtab);
978 valtab.copy_from_slice(&self.valtab);
979 RVMap { eob_sym: self.eob_sym, esc_sym: self.esc_sym, runtab: runtab, valtab: valtab }
983 pub const IVI_ZERO_RVMAP: RVMap = RVMap { eob_sym: 0, esc_sym: 0, runtab: [0; 256], valtab: [0; 256] };
985 pub static IVI_RVMAPS: [RVMap; 9] = [
986 RVMap { eob_sym: 5, esc_sym: 2, runtab: [
987 1, 1, 0, 1, 1, 0, 1, 1, 2, 2, 1, 1, 1, 1, 3, 3,
988 1, 1, 2, 2, 1, 1, 4, 4, 1, 1, 1, 1, 2, 2, 5, 5,
989 1, 1, 3, 3, 1, 1, 6, 6, 1, 2, 1, 2, 7, 7, 1, 1,
990 8, 8, 1, 1, 4, 2, 1, 4, 2, 1, 3, 3, 1, 1, 1, 9,
991 9, 1, 2, 1, 2, 1, 5, 5, 1, 1, 10, 10, 1, 1, 3, 3,
992 2, 2, 1, 1, 11, 11, 6, 4, 4, 1, 6, 1, 2, 1, 2, 12,
993 8, 1, 12, 7, 8, 7, 1, 16, 1, 16, 1, 3, 3, 13, 1, 13,
994 2, 2, 1, 15, 1, 5, 14, 15, 1, 5, 14, 1, 17, 8, 17, 8,
995 1, 4, 4, 2, 2, 1, 25, 25, 24, 24, 1, 3, 1, 3, 1, 8,
996 6, 7, 6, 1, 18, 8, 18, 1, 7, 23, 2, 2, 23, 1, 1, 21,
997 22, 9, 9, 22, 19, 1, 21, 5, 19, 5, 1, 33, 20, 33, 20, 8,
998 4, 4, 1, 32, 2, 2, 8, 3, 32, 26, 3, 1, 7, 7, 26, 6,
999 1, 6, 1, 1, 16, 1, 10, 1, 10, 2, 16, 29, 28, 2, 29, 28,
1000 1, 27, 5, 8, 5, 27, 1, 8, 3, 7, 3, 31, 41, 31, 1, 41,
1001 6, 1, 6, 7, 4, 4, 1, 1, 2, 1, 2, 11, 34, 30, 11, 1,
1002 30, 15, 15, 34, 36, 40, 36, 40, 35, 35, 37, 37, 39, 39, 38, 38 ],
1004 1, -1, 0, 2, -2, 0, 3, -3, 1, -1, 4, -4, 5, -5, 1, -1,
1005 6, -6, 2, -2, 7, -7, 1, -1, 8, -8, 9, -9, 3, -3, 1, -1,
1006 10, -10, 2, -2, 11, -11, 1, -1, 12, 4, -12, -4, 1, -1, 13, -13,
1007 1, -1, 14, -14, 2, 5, 15, -2, -5, -15, -3, 3, 16, -16, 17, 1,
1008 -1, -17, 6, 18, -6, -18, 2, -2, 19, -19, 1, -1, 20, -20, 4, -4,
1009 7, -7, 21, -21, 1, -1, 2, 3, -3, 22, -2, -22, 8, 23, -8, 1,
1010 2, -23, -1, 2, -2, -2, 24, 1, -24, -1, 25, 5, -5, 1, -25, -1,
1011 9, -9, 26, 1, -26, 3, 1, -1, 27, -3, -1, -27, 1, 3, -1, -3,
1012 28, -4, 4, 10, -10, -28, 1, -1, 1, -1, 29, 6, -29, -6, 30, -4,
1013 3, 3, -3, -30, 1, 4, -1, 31, -3, 1, 11, -11, -1, -31, 32, -1,
1014 -1, 2, -2, 1, 1, -32, 1, 4, -1, -4, 33, -1, 1, 1, -1, 5,
1015 5, -5, -33, -1, -12, 12, -5, -7, 1, 1, 7, 34, 4, -4, -1, 4,
1016 -34, -4, 35, 36, -2, -35, -2, -36, 2, 13, 2, -1, 1, -13, 1, -1,
1017 37, 1, -5, 6, 5, -1, 38, -6, -8, 5, 8, -1, 1, 1, -37, -1,
1018 5, 39, -5, -5, 6, -6, -38, -39, -14, 40, 14, 2, 1, 1, -2, -40,
1019 -1, -2, 2, -1, -1, -1, 1, 1, 1, -1, 1, -1, 1, -1, 1, -1 ],
1021 RVMap { eob_sym: 0, esc_sym: 38, runtab: [
1022 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 8, 6, 8, 7,
1023 7, 9, 9, 10, 10, 11, 11, 1, 12, 1, 12, 13, 13, 16, 14, 16,
1024 14, 15, 15, 17, 17, 18, 0, 18, 19, 20, 21, 19, 22, 21, 20, 22,
1025 25, 24, 2, 25, 24, 23, 23, 2, 26, 28, 26, 28, 29, 27, 29, 27,
1026 33, 33, 1, 32, 1, 3, 32, 30, 36, 3, 36, 30, 31, 31, 35, 34,
1027 37, 41, 34, 35, 37, 4, 41, 4, 49, 8, 8, 49, 40, 38, 5, 38,
1028 40, 39, 5, 39, 42, 43, 42, 7, 57, 6, 43, 44, 6, 50, 7, 44,
1029 57, 48, 50, 48, 45, 45, 46, 47, 51, 46, 47, 58, 1, 51, 58, 1,
1030 52, 59, 53, 9, 52, 55, 55, 59, 53, 56, 54, 56, 54, 9, 64, 64,
1031 60, 63, 60, 63, 61, 62, 61, 62, 2, 10, 2, 10, 11, 1, 11, 13,
1032 12, 1, 12, 13, 16, 16, 8, 8, 14, 3, 3, 15, 14, 15, 4, 4,
1033 1, 17, 17, 5, 1, 7, 7, 5, 6, 1, 2, 2, 6, 22, 1, 25,
1034 21, 22, 8, 24, 1, 21, 25, 24, 8, 18, 18, 23, 9, 20, 23, 33,
1035 29, 33, 20, 1, 19, 1, 29, 36, 9, 36, 19, 41, 28, 57, 32, 3,
1036 28, 3, 1, 27, 49, 49, 1, 32, 26, 26, 2, 4, 4, 7, 57, 41,
1037 2, 7, 10, 5, 37, 16, 10, 27, 8, 8, 13, 16, 37, 13, 1, 5 ],
1039 0, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, 1, -1, -1, 1,
1040 -1, 1, -1, 1, -1, 1, -1, 2, 1, -2, -1, 1, -1, 1, 1, -1,
1041 -1, 1, -1, 1, -1, 1, 0, -1, 1, 1, 1, -1, 1, -1, -1, -1,
1042 1, 1, 2, -1, -1, 1, -1, -2, 1, 1, -1, -1, 1, 1, -1, -1,
1043 1, -1, 3, 1, -3, 2, -1, 1, 1, -2, -1, -1, -1, 1, 1, 1,
1044 1, 1, -1, -1, -1, 2, -1, -2, 1, 2, -2, -1, 1, 1, 2, -1,
1045 -1, 1, -2, -1, 1, 1, -1, 2, 1, 2, -1, 1, -2, -1, -2, -1,
1046 -1, 1, 1, -1, 1, -1, 1, 1, 1, -1, -1, 1, 4, -1, -1, -4,
1047 1, 1, 1, 2, -1, -1, 1, -1, -1, 1, -1, -1, 1, -2, 1, -1,
1048 1, 1, -1, -1, 1, 1, -1, -1, 3, 2, -3, -2, 2, 5, -2, 2,
1049 2, -5, -2, -2, -2, 2, -3, 3, 2, 3, -3, 2, -2, -2, 3, -3,
1050 6, 2, -2, 3, -6, 3, -3, -3, 3, 7, -4, 4, -3, 2, -7, 2,
1051 2, -2, -4, 2, 8, -2, -2, -2, 4, 2, -2, 2, 3, 2, -2, -2,
1052 2, 2, -2, -8, -2, 9, -2, 2, -3, -2, 2, -2, 2, 2, 2, 4,
1053 -2, -4, 10, 2, 2, -2, -9, -2, 2, -2, 5, 4, -4, 4, -2, 2,
1054 -5, -4, -3, 4, 2, -3, 3, -2, -5, 5, 3, 3, -2, -3, -10, -4 ],
1056 RVMap { eob_sym: 2, esc_sym: 11, runtab: [
1057 1, 1, 0, 2, 2, 1, 1, 3, 3, 4, 4, 0, 1, 1, 5, 5,
1058 2, 2, 6, 6, 7, 7, 1, 8, 1, 8, 3, 3, 9, 9, 1, 2,
1059 2, 1, 4, 10, 4, 10, 11, 11, 1, 5, 12, 12, 1, 5, 13, 13,
1060 3, 3, 6, 6, 2, 2, 14, 14, 16, 16, 15, 7, 15, 8, 8, 7,
1061 1, 1, 17, 17, 4, 4, 1, 1, 18, 18, 2, 2, 5, 5, 25, 3,
1062 9, 3, 25, 9, 19, 24, 19, 24, 1, 21, 20, 1, 21, 22, 20, 22,
1063 23, 23, 8, 6, 33, 6, 8, 33, 7, 7, 26, 26, 1, 32, 1, 32,
1064 28, 4, 28, 10, 29, 27, 27, 10, 41, 4, 29, 2, 2, 41, 36, 31,
1065 49, 31, 34, 30, 34, 36, 30, 35, 1, 49, 11, 5, 35, 11, 1, 3,
1066 3, 5, 37, 37, 8, 40, 8, 40, 12, 12, 42, 42, 1, 38, 16, 57,
1067 1, 6, 16, 39, 38, 6, 7, 7, 13, 13, 39, 43, 2, 43, 57, 2,
1068 50, 9, 44, 9, 50, 4, 15, 48, 44, 4, 1, 15, 48, 14, 14, 1,
1069 45, 45, 8, 3, 5, 8, 51, 47, 3, 46, 46, 47, 5, 51, 1, 17,
1070 17, 58, 1, 58, 2, 52, 52, 2, 53, 7, 59, 6, 6, 56, 53, 55,
1071 7, 55, 1, 54, 59, 56, 54, 10, 1, 10, 4, 60, 1, 60, 8, 4,
1072 8, 64, 64, 61, 1, 63, 3, 63, 62, 61, 5, 11, 5, 3, 11, 62 ],
1074 1, -1, 0, 1, -1, 2, -2, 1, -1, 1, -1, 0, 3, -3, 1, -1,
1075 2, -2, 1, -1, 1, -1, 4, 1, -4, -1, 2, -2, 1, -1, 5, 3,
1076 -3, -5, 2, 1, -2, -1, 1, -1, 6, 2, 1, -1, -6, -2, 1, -1,
1077 3, -3, 2, -2, 4, -4, 1, -1, 1, -1, 1, 2, -1, 2, -2, -2,
1078 7, -7, 1, -1, 3, -3, 8, -8, 1, -1, 5, -5, 3, -3, 1, 4,
1079 2, -4, -1, -2, 1, 1, -1, -1, 9, 1, 1, -9, -1, 1, -1, -1,
1080 1, -1, 3, -3, 1, 3, -3, -1, 3, -3, 1, -1, 10, 1, -10, -1,
1081 1, 4, -1, 2, 1, -1, 1, -2, 1, -4, -1, 6, -6, -1, 1, 1,
1082 1, -1, 1, 1, -1, -1, -1, 1, 11, -1, -2, 4, -1, 2, -11, 5,
1083 -5, -4, -1, 1, 4, 1, -4, -1, -2, 2, 1, -1, 12, 1, -2, 1,
1084 -12, 4, 2, 1, -1, -4, 4, -4, 2, -2, -1, 1, 7, -1, -1, -7,
1085 -1, -3, 1, 3, 1, 5, 2, 1, -1, -5, 13, -2, -1, 2, -2, -13,
1086 1, -1, 5, 6, 5, -5, 1, 1, -6, 1, -1, -1, -5, -1, 14, 2,
1087 -2, 1, -14, -1, 8, 1, -1, -8, 1, 5, 1, 5, -5, 1, -1, 1,
1088 -5, -1, 15, 1, -1, -1, -1, 3, -15, -3, 6, 1, 16, -1, 6, -6,
1089 -6, 1, -1, 1, -16, 1, 7, -1, 1, -1, -6, -3, 6, -7, 3, -1 ]
1091 RVMap { eob_sym: 0, esc_sym: 35, runtab: [
1092 0, 1, 1, 2, 2, 3, 3, 4, 4, 1, 1, 5, 5, 6, 6, 7,
1093 7, 8, 8, 9, 9, 2, 2, 10, 10, 1, 1, 11, 11, 12, 12, 3,
1094 3, 13, 13, 0, 14, 14, 16, 15, 16, 15, 4, 4, 17, 1, 17, 1,
1095 5, 5, 18, 18, 2, 2, 6, 6, 8, 19, 7, 8, 7, 19, 20, 20,
1096 21, 21, 22, 24, 22, 24, 23, 23, 1, 1, 25, 25, 3, 3, 26, 26,
1097 9, 9, 27, 27, 28, 28, 33, 29, 4, 33, 29, 1, 4, 1, 32, 32,
1098 2, 2, 31, 10, 30, 10, 30, 31, 34, 34, 5, 5, 36, 36, 35, 41,
1099 35, 11, 41, 11, 37, 1, 8, 8, 37, 6, 1, 6, 40, 7, 7, 40,
1100 12, 38, 12, 39, 39, 38, 49, 13, 49, 13, 3, 42, 3, 42, 16, 16,
1101 43, 43, 14, 14, 1, 1, 44, 15, 44, 15, 2, 2, 57, 48, 50, 48,
1102 57, 50, 4, 45, 45, 4, 46, 47, 47, 46, 1, 51, 1, 17, 17, 51,
1103 8, 9, 9, 5, 58, 8, 58, 5, 52, 52, 55, 56, 53, 56, 55, 59,
1104 59, 53, 54, 1, 6, 54, 7, 7, 6, 1, 2, 3, 2, 3, 64, 60,
1105 60, 10, 10, 64, 61, 62, 61, 63, 1, 63, 62, 1, 18, 24, 18, 4,
1106 25, 4, 8, 21, 21, 1, 24, 22, 25, 22, 8, 11, 19, 11, 23, 1,
1107 20, 23, 19, 20, 5, 12, 5, 1, 16, 2, 12, 13, 2, 13, 1, 16 ],
1109 0, 1, -1, 1, -1, 1, -1, 1, -1, 2, -2, 1, -1, 1, -1, 1,
1110 -1, 1, -1, 1, -1, 2, -2, 1, -1, 3, -3, 1, -1, 1, -1, 2,
1111 -2, 1, -1, 0, 1, -1, 1, 1, -1, -1, 2, -2, 1, 4, -1, -4,
1112 2, -2, 1, -1, -3, 3, 2, -2, 2, 1, 2, -2, -2, -1, 1, -1,
1113 1, -1, 1, 1, -1, -1, 1, -1, 5, -5, 1, -1, 3, -3, 1, -1,
1114 2, -2, 1, -1, 1, -1, 1, 1, 3, -1, -1, 6, -3, -6, -1, 1,
1115 4, -4, 1, 2, 1, -2, -1, -1, 1, -1, 3, -3, 1, -1, 1, 1,
1116 -1, 2, -1, -2, 1, 7, -3, 3, -1, 3, -7, -3, 1, -3, 3, -1,
1117 2, 1, -2, 1, -1, -1, 1, 2, -1, -2, -4, -1, 4, 1, 2, -2,
1118 1, -1, -2, 2, 8, -8, -1, 2, 1, -2, -5, 5, 1, -1, -1, 1,
1119 -1, 1, 4, -1, 1, -4, -1, -1, 1, 1, 9, 1, -9, 2, -2, -1,
1120 -4, 3, -3, -4, -1, 4, 1, 4, 1, -1, 1, -1, 1, 1, -1, 1,
1121 -1, -1, -1, 10, 4, 1, 4, -4, -4, -10, 6, 5, -6, -5, 1, -1,
1122 1, 3, -3, -1, 1, -1, -1, -1, 11, 1, 1, -11, -2, -2, 2, 5,
1123 -2, -5, -5, 2, -2, 12, 2, -2, 2, 2, 5, -3, -2, 3, -2, -12,
1124 -2, 2, 2, 2, -5, 3, 5, 13, -3, 7, -3, -3, -7, 3, -13, 3 ]
1126 RVMap { eob_sym: 0, esc_sym: 34, runtab: [
1127 0, 1, 1, 1, 2, 2, 1, 3, 3, 1, 1, 1, 4, 4, 1, 5,
1128 2, 1, 5, 2, 1, 1, 6, 6, 1, 1, 1, 1, 1, 7, 3, 1,
1129 2, 3, 0, 1, 2, 7, 1, 1, 1, 8, 1, 1, 8, 1, 1, 1,
1130 9, 1, 9, 1, 2, 1, 1, 2, 1, 1, 10, 4, 1, 10, 1, 4,
1131 1, 1, 1, 1, 1, 3, 1, 1, 1, 3, 2, 1, 5, 1, 1, 1,
1132 2, 5, 1, 11, 1, 11, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1133 2, 1, 6, 1, 6, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 12,
1134 3, 1, 12, 1, 1, 1, 2, 1, 1, 3, 1, 1, 1, 1, 1, 1,
1135 4, 1, 1, 1, 2, 1, 1, 4, 1, 1, 1, 1, 1, 1, 2, 1,
1136 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 1, 2, 1, 1, 5,
1137 1, 1, 1, 1, 1, 7, 1, 7, 1, 1, 2, 3, 1, 1, 1, 1,
1138 5, 1, 1, 1, 1, 1, 1, 2, 13, 1, 1, 1, 1, 1, 1, 1,
1139 1, 1, 1, 1, 1, 1, 1, 1, 13, 2, 1, 1, 4, 1, 1, 1,
1140 3, 1, 6, 1, 1, 1, 14, 1, 1, 1, 1, 1, 14, 6, 1, 1,
1141 1, 1, 15, 2, 4, 1, 2, 3, 15, 1, 1, 1, 8, 1, 1, 8,
1142 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1 ],
1144 0, 1, -1, 2, 1, -1, -2, 1, -1, 3, -3, 4, 1, -1, -4, 1,
1145 2, 5, -1, -2, -5, 6, 1, -1, -6, 7, -7, 8, -8, 1, 2, 9,
1146 3, -2, 0, -9, -3, -1, 10, -10, 11, 1, -11, 12, -1, -12, 13, -13,
1147 1, 14, -1, -14, 4, 15, -15, -4, 16, -16, 1, 2, 17, -1, -17, -2,
1148 18, -18, 19, -19, 20, 3, -20, 21, -21, -3, 5, 22, 2, -22, -23, 23,
1149 -5, -2, 24, 1, -24, -1, 25, -25, 26, -26, -27, 27, 28, 29, -28, -29,
1150 6, 30, 2, -31, -2, -30, 31, -6, -32, 32, 33, -33, 34, -35, -34, 1,
1151 4, -36, -1, 35, 37, 36, 7, -37, 38, -4, -38, 39, 41, 40, -40, -39,
1152 3, 42, -43, -41, -7, -42, 43, -3, 44, -44, 45, -45, 46, 47, 8, -47,
1153 -48, -46, 50, -50, 48, 49, 51, -49, 52, -52, 5, -51, -8, -53, 53, 3,
1154 -56, 56, 55, 54, -54, 2, 60, -2, -55, 58, 9, -5, 59, 57, -57, -63,
1155 -3, -58, -60, -61, 61, -59, -62, -9, 1, 64, 62, 69, -64, 63, 65, -67,
1156 -68, 66, -65, 68, -66, -69, 67, -70, -1, 10, 71, -71, 4, 73, 72, 70,
1157 6, -76, -3, 74, -78, -74, 1, 78, 80, -72, -75, 76, -1, 3, -73, 79,
1158 75, 77, 1, 11, -4, -79, -10, -6, -1, -77, -83, -80, 2, 81, -84, -2,
1159 83, -81, 82, -82, 84, -87, -86, 85, -11, -85, 86, -89, 87, -88, 88, 89 ]
1161 RVMap { eob_sym: 2, esc_sym: 33, runtab: [
1162 1, 1, 0, 2, 1, 2, 1, 3, 3, 1, 1, 4, 4, 2, 2, 1,
1163 1, 5, 5, 6, 1, 6, 1, 7, 7, 3, 3, 2, 8, 2, 8, 1,
1164 1, 0, 9, 9, 1, 1, 10, 4, 10, 4, 11, 11, 2, 1, 2, 1,
1165 12, 12, 3, 3, 1, 1, 13, 5, 5, 13, 14, 1, 1, 14, 2, 2,
1166 6, 6, 15, 1, 1, 15, 16, 4, 7, 16, 4, 7, 1, 1, 3, 3,
1167 8, 8, 2, 2, 1, 1, 17, 17, 1, 1, 18, 18, 5, 5, 2, 2,
1168 1, 1, 9, 19, 9, 19, 20, 3, 3, 20, 1, 10, 21, 1, 10, 4,
1169 4, 21, 22, 6, 6, 22, 1, 1, 23, 24, 2, 2, 23, 24, 11, 1,
1170 1, 11, 7, 25, 7, 1, 1, 25, 8, 8, 3, 26, 3, 1, 12, 2,
1171 2, 26, 1, 12, 5, 5, 27, 4, 1, 4, 1, 27, 28, 1, 28, 13,
1172 1, 13, 2, 29, 2, 1, 32, 6, 1, 30, 14, 29, 14, 6, 3, 31,
1173 3, 1, 30, 1, 32, 31, 33, 9, 33, 1, 1, 7, 9, 7, 2, 2,
1174 1, 1, 4, 36, 34, 4, 5, 10, 10, 5, 34, 1, 1, 35, 8, 8,
1175 36, 3, 35, 1, 15, 3, 2, 1, 16, 15, 16, 2, 37, 1, 37, 1,
1176 1, 1, 6, 6, 38, 1, 38, 11, 1, 39, 39, 40, 11, 2, 41, 4,
1177 40, 1, 2, 4, 1, 1, 1, 41, 3, 1, 3, 1, 5, 7, 5, 7 ],
1179 1, -1, 0, 1, 2, -1, -2, 1, -1, 3, -3, 1, -1, 2, -2, 4,
1180 -4, 1, -1, 1, 5, -1, -5, 1, -1, 2, -2, 3, 1, -3, -1, 6,
1181 -6, 0, 1, -1, 7, -7, 1, 2, -1, -2, 1, -1, 4, 8, -4, -8,
1182 1, -1, 3, -3, 9, -9, 1, 2, -2, -1, 1, 10, -10, -1, 5, -5,
1183 2, -2, 1, 11, -11, -1, 1, 3, 2, -1, -3, -2, 12, -12, 4, -4,
1184 2, -2, -6, 6, 13, -13, 1, -1, 14, -14, 1, -1, 3, -3, 7, -7,
1185 15, -15, 2, 1, -2, -1, 1, 5, -5, -1, -16, 2, 1, 16, -2, 4,
1186 -4, -1, 1, 3, -3, -1, 17, -17, 1, 1, -8, 8, -1, -1, 2, 18,
1187 -18, -2, 3, 1, -3, 19, -19, -1, 3, -3, 6, 1, -6, 20, 2, 9,
1188 -9, -1, -20, -2, 4, -4, 1, -5, 21, 5, -21, -1, 1, -22, -1, 2,
1189 22, -2, 10, 1, -10, 23, 1, 4, -23, 1, 2, -1, -2, -4, -7, 1,
1190 7, -24, -1, 24, -1, -1, 1, 3, -1, -25, 25, 4, -3, -4, 11, -11,
1191 26, -26, 6, 1, 1, -6, -5, -3, 3, 5, -1, -27, 27, 1, 4, -4,
1192 -1, -8, -1, 28, 2, 8, -12, -28, -2, -2, 2, 12, -1, 29, 1, -29,
1193 30, -30, 5, -5, 1, -31, -1, 3, 31, -1, 1, 1, -3, -13, 1, -7,
1194 -1, -32, 13, 7, 32, 33, -33, -1, -9, -34, 9, 34, -6, 5, 6, -5 ]
1196 RVMap { eob_sym: 2, esc_sym: 13, runtab: [
1197 1, 1, 0, 1, 1, 2, 2, 1, 1, 3, 3, 1, 1, 0, 2, 2,
1198 4, 1, 4, 1, 1, 1, 5, 5, 1, 1, 6, 6, 2, 2, 1, 1,
1199 3, 3, 7, 7, 1, 1, 8, 8, 1, 1, 2, 2, 1, 9, 1, 9,
1200 4, 4, 10, 1, 1, 10, 1, 1, 11, 11, 3, 3, 1, 2, 1, 2,
1201 1, 1, 12, 12, 5, 5, 1, 1, 13, 1, 1, 13, 2, 2, 1, 1,
1202 6, 6, 1, 1, 4, 14, 4, 14, 3, 1, 3, 1, 1, 1, 15, 7,
1203 15, 2, 2, 7, 1, 1, 1, 8, 1, 8, 16, 16, 1, 1, 1, 1,
1204 2, 1, 1, 2, 1, 1, 3, 5, 5, 3, 4, 1, 1, 4, 1, 1,
1205 17, 17, 9, 1, 1, 9, 2, 2, 1, 1, 10, 10, 1, 6, 1, 1,
1206 6, 18, 1, 1, 18, 1, 1, 1, 2, 2, 3, 1, 3, 1, 1, 1,
1207 4, 1, 19, 1, 19, 7, 1, 1, 20, 1, 4, 20, 1, 7, 11, 2,
1208 1, 11, 21, 2, 8, 5, 1, 8, 1, 5, 21, 1, 1, 1, 22, 1,
1209 1, 22, 1, 1, 3, 3, 1, 23, 2, 12, 24, 1, 1, 2, 1, 1,
1210 12, 23, 1, 1, 24, 1, 1, 1, 4, 1, 1, 1, 2, 1, 6, 6,
1211 4, 2, 1, 1, 1, 1, 1, 1, 1, 14, 13, 3, 1, 25, 9, 25,
1212 14, 1, 9, 3, 13, 1, 1, 1, 1, 1, 10, 1, 1, 2, 10, 2 ],
1214 -20, -1, 0, 2, -2, 1, -1, 3, -3, 1, -1, 4, -4, 0, 2, -2,
1215 1, 5, -1, -5, 6, -6, 1, -1, 7, -7, 1, -1, 3, -3, 8, -8,
1216 2, -2, 1, -1, 9, -9, 1, -1, 10, -10, 4, -4, 11, 1, -11, -1,
1217 2, -2, 1, 12, -12, -1, 13, -13, 1, -1, 3, -3, 14, 5, -14, -5,
1218 -15, 15, -1, 1, 2, -2, 16, -16, 1, 17, -17, -1, 6, -6, 18, -18,
1219 2, -2, -19, 19, -3, 1, 3, -1, 4, 20, -4, 1, -21, 21, 1, 2,
1220 -1, -7, 7, -2, 22, -22, 23, 2, -23, -2, 1, -1, -24, 24, -25, 25,
1221 -8, -26, 26, 8, -27, 27, 5, 3, -3, -5, -4, 28, -28, 4, 29, -29,
1222 1, -1, -2, -30, 30, 2, 9, -9, -31, 31, 2, -2, -32, 3, 32, -33,
1223 -3, 1, 33, -34, -1, 34, -35, 35, -10, 10, -6, 36, 6, -36, 37, -37,
1224 -5, 38, 1, -38, -1, 3, 39, -39, -1, 40, 5, 1, -40, -3, 2, -11,
1225 -41, -2, 1, 11, -3, -4, 41, 3, 42, 4, -1, -43, -42, 43, 1, -44,
1226 45, -1, 44, -45, -7, 7, -46, 1, -12, 2, 1, -47, 46, 12, 47, 48,
1227 -2, -1, -48, 49, -1, -50, -49, 50, -6, -51, 51, 52, -13, 53, -4, 4,
1228 6, 13, -53, -52, -54, 55, 54, -55, -56, -2, 2, -8, 56, 1, -3, -1,
1229 2, 58, 3, 8, -2, 57, -58, -60, -59, -57, -3, 60, 59, -14, 3, 14 ]
1231 RVMap { eob_sym: 2, esc_sym: 38, runtab: [
1232 1, 1, 0, 2, 2, 1, 1, 3, 3, 4, 4, 5, 5, 1, 1, 6,
1233 6, 2, 2, 7, 7, 8, 8, 1, 1, 3, 3, 9, 9, 10, 10, 1,
1234 1, 2, 2, 4, 4, 11, 0, 11, 12, 12, 13, 13, 1, 1, 5, 5,
1235 14, 14, 15, 16, 15, 16, 3, 3, 1, 6, 1, 6, 2, 2, 7, 7,
1236 8, 8, 17, 17, 1, 1, 4, 4, 18, 18, 2, 2, 1, 19, 1, 20,
1237 19, 20, 21, 21, 3, 3, 22, 22, 5, 5, 24, 1, 1, 23, 9, 23,
1238 24, 9, 2, 2, 10, 1, 1, 10, 6, 6, 25, 4, 4, 25, 7, 7,
1239 26, 8, 1, 8, 3, 1, 26, 3, 11, 11, 27, 27, 2, 28, 1, 2,
1240 28, 1, 12, 12, 5, 5, 29, 13, 13, 29, 32, 1, 1, 33, 31, 30,
1241 32, 4, 30, 33, 4, 31, 3, 14, 1, 1, 3, 34, 34, 2, 2, 14,
1242 6, 6, 35, 36, 35, 36, 1, 15, 1, 16, 16, 15, 7, 9, 7, 9,
1243 37, 8, 8, 37, 1, 1, 39, 2, 38, 39, 2, 40, 5, 38, 40, 5,
1244 3, 3, 4, 4, 10, 10, 1, 1, 1, 1, 41, 2, 41, 2, 6, 6,
1245 1, 1, 11, 42, 11, 43, 3, 42, 3, 17, 4, 43, 1, 17, 7, 1,
1246 8, 44, 4, 7, 44, 5, 8, 2, 5, 1, 2, 48, 45, 1, 12, 45,
1247 12, 48, 13, 13, 1, 9, 9, 46, 1, 46, 47, 47, 49, 18, 18, 49 ],
1249 1, -1, 0, 1, -1, 2, -2, 1, -1, 1, -1, 1, -1, 3, -3, 1,
1250 -1, -2, 2, 1, -1, 1, -1, 4, -4, -2, 2, 1, -1, 1, -1, 5,
1251 -5, -3, 3, 2, -2, 1, 0, -1, 1, -1, 1, -1, 6, -6, 2, -2,
1252 1, -1, 1, 1, -1, -1, -3, 3, 7, 2, -7, -2, -4, 4, 2, -2,
1253 2, -2, 1, -1, 8, -8, 3, -3, 1, -1, -5, 5, 9, 1, -9, 1,
1254 -1, -1, 1, -1, -4, 4, 1, -1, 3, -3, 1, -10, 10, 1, 2, -1,
1255 -1, -2, 6, -6, 2, 11, -11, -2, 3, -3, 1, -4, 4, -1, 3, -3,
1256 1, 3, 12, -3, -5, -12, -1, 5, 2, -2, 1, -1, -7, 1, 13, 7,
1257 -1, -13, 2, -2, 4, -4, 1, 2, -2, -1, 1, 14, -14, 1, 1, 1,
1258 -1, -5, -1, -1, 5, -1, -6, 2, -15, 15, 6, 1, -1, -8, 8, -2,
1259 -4, 4, 1, 1, -1, -1, 16, 2, -16, -2, 2, -2, 4, 3, -4, -3,
1260 -1, -4, 4, 1, -17, 17, -1, -9, 1, 1, 9, 1, -5, -1, -1, 5,
1261 -7, 7, 6, -6, 3, -3, 18, -18, 19, -19, 1, -10, -1, 10, -5, 5,
1262 20, -20, -3, 1, 3, 1, 8, -1, -8, 2, 7, -1, -21, -2, 5, 21,
1263 5, -1, -7, -5, 1, -6, -5, -11, 6, 22, 11, 1, 1, -22, -3, -1,
1264 3, -1, 3, -3, -23, 4, -4, 1, 23, -1, 1, -1, 1, -2, 2, -1 ]
1266 RVMap { eob_sym: 4, esc_sym: 11, runtab: [
1267 1, 1, 1, 1, 0, 2, 2, 1, 1, 3, 3, 0, 1, 1, 2, 2,
1268 4, 4, 1, 1, 5, 5, 1, 1, 2, 2, 3, 3, 6, 6, 1, 1,
1269 7, 7, 8, 1, 8, 2, 2, 1, 4, 4, 1, 3, 1, 3, 9, 9,
1270 2, 2, 1, 5, 1, 5, 10, 10, 1, 1, 11, 11, 3, 6, 3, 4,
1271 4, 6, 2, 2, 1, 12, 1, 12, 7, 13, 7, 13, 1, 1, 8, 8,
1272 2, 2, 14, 14, 16, 15, 16, 5, 5, 1, 3, 15, 1, 3, 4, 4,
1273 1, 1, 17, 17, 2, 2, 6, 6, 1, 18, 1, 18, 22, 21, 22, 21,
1274 25, 24, 25, 19, 9, 20, 9, 23, 19, 24, 20, 3, 23, 7, 3, 1,
1275 1, 7, 28, 26, 29, 5, 28, 26, 5, 8, 29, 4, 8, 27, 2, 2,
1276 4, 27, 1, 1, 10, 36, 10, 33, 33, 36, 30, 1, 32, 32, 1, 30,
1277 6, 31, 31, 35, 3, 6, 11, 11, 3, 2, 35, 2, 34, 1, 34, 1,
1278 37, 37, 12, 7, 12, 5, 41, 5, 4, 7, 1, 8, 13, 4, 1, 41,
1279 13, 38, 8, 38, 9, 1, 40, 40, 9, 1, 39, 2, 2, 49, 39, 42,
1280 3, 3, 14, 16, 49, 14, 16, 42, 43, 43, 6, 6, 15, 1, 1, 15,
1281 44, 44, 1, 1, 50, 48, 4, 5, 4, 7, 5, 2, 10, 10, 48, 7,
1282 50, 45, 2, 1, 45, 8, 8, 1, 46, 46, 3, 47, 47, 3, 1, 1 ],
1284 1, -1, 2, -2, 0, 1, -1, 3, -3, 1, -1, 0, 4, -4, 2, -2,
1285 1, -1, 5, -5, 1, -1, 6, -6, 3, -3, 2, -2, 1, -1, 7, -7,
1286 1, -1, 1, 8, -1, 4, -4, -8, 2, -2, 9, 3, -9, -3, 1, -1,
1287 5, -5, 10, 2, -10, -2, 1, -1, 11, -11, 1, -1, -4, 2, 4, 3,
1288 -3, -2, 6, -6, 12, 1, -12, -1, 2, 1, -2, -1, 13, -13, 2, -2,
1289 7, -7, 1, -1, 1, 1, -1, 3, -3, 14, 5, -1, -14, -5, 4, -4,
1290 15, -15, 1, -1, 8, -8, -3, 3, 16, 1, -16, -1, 1, 1, -1, -1,
1291 1, 1, -1, 1, 2, 1, -2, 1, -1, -1, -1, 6, -1, 3, -6, 17,
1292 -17, -3, 1, 1, 1, 4, -1, -1, -4, 3, -1, 5, -3, -1, -9, 9,
1293 -5, 1, 18, -18, 2, 1, -2, 1, -1, -1, 1, 19, -1, 1, -19, -1,
1294 4, 1, -1, 1, 7, -4, -2, 2, -7, 10, -1, -10, 1, 20, -1, -20,
1295 1, -1, 2, 4, -2, 5, 1, -5, 6, -4, 21, 4, 2, -6, -21, -1,
1296 -2, 1, -4, -1, -3, 22, -1, 1, 3, -22, -1, 11, -11, 1, 1, 1,
1297 8, -8, 2, 2, -1, -2, -2, -1, 1, -1, -5, 5, 2, 23, -23, -2,
1298 1, -1, 24, -24, -1, -1, 7, 6, -7, 5, -6, 12, -3, 3, 1, -5,
1299 1, 1, -12, 25, -1, -5, 5, -25, -1, 1, 9, 1, -1, -9, 26, -26 ]