00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00029 #define ALT_BITSTREAM_READER_LE
00030 #include "avcodec.h"
00031 #include "get_bits.h"
00032 #include "ivi_common.h"
00033 #include "libavutil/common.h"
00034 #include "ivi_dsp.h"
00035
00036 extern const IVIHuffDesc ff_ivi_mb_huff_desc[8];
00037 extern const IVIHuffDesc ff_ivi_blk_huff_desc[8];
00038
00039 VLC ff_ivi_mb_vlc_tabs [8];
00040 VLC ff_ivi_blk_vlc_tabs[8];
00041
00046 static uint16_t inv_bits(uint16_t val, int nbits)
00047 {
00048 uint16_t res;
00049
00050 if (nbits <= 8) {
00051 res = av_reverse[val] >> (8-nbits);
00052 } else
00053 res = ((av_reverse[val & 0xFF] << 8) + (av_reverse[val >> 8])) >> (16-nbits);
00054
00055 return res;
00056 }
00057
00058 int ff_ivi_create_huff_from_desc(const IVIHuffDesc *cb, VLC *vlc, int flag)
00059 {
00060 int pos, i, j, codes_per_row, prefix, not_last_row;
00061 uint16_t codewords[256];
00062 uint8_t bits[256];
00063
00064 pos = 0;
00065
00066 for (i = 0; i < cb->num_rows; i++) {
00067 codes_per_row = 1 << cb->xbits[i];
00068 not_last_row = (i != cb->num_rows - 1);
00069 prefix = ((1 << i) - 1) << (cb->xbits[i] + not_last_row);
00070
00071 for (j = 0; j < codes_per_row; j++) {
00072 if (pos >= 256)
00073 break;
00074
00075 bits[pos] = i + cb->xbits[i] + not_last_row;
00076 if (bits[pos] > IVI_VLC_BITS)
00077 return -1;
00078
00079 codewords[pos] = inv_bits((prefix | j), bits[pos]);
00080 if (!bits[pos])
00081 bits[pos] = 1;
00082
00083 pos++;
00084 }
00085 }
00086
00087
00088 return init_vlc(vlc, IVI_VLC_BITS, pos, bits, 1, 1, codewords, 2, 2,
00089 (flag ? INIT_VLC_USE_NEW_STATIC : 0) | INIT_VLC_LE);
00090 }
00091
00092 void ff_ivi_init_static_vlc(void)
00093 {
00094 int i;
00095 static VLC_TYPE table_data[8192 * 16][2];
00096 static int initialized_vlcs = 0;
00097
00098 if (initialized_vlcs)
00099 return;
00100 for (i = 0; i < 8; i++) {
00101 ff_ivi_mb_vlc_tabs[i].table = table_data + i * 2 * 8192;
00102 ff_ivi_mb_vlc_tabs[i].table_allocated = 8192;
00103 ff_ivi_create_huff_from_desc(&ff_ivi_mb_huff_desc[i], &ff_ivi_mb_vlc_tabs[i], 1);
00104 ff_ivi_blk_vlc_tabs[i].table = table_data + (i * 2 + 1) * 8192;
00105 ff_ivi_blk_vlc_tabs[i].table_allocated = 8192;
00106 ff_ivi_create_huff_from_desc(&ff_ivi_blk_huff_desc[i], &ff_ivi_blk_vlc_tabs[i], 1);
00107 }
00108 initialized_vlcs = 1;
00109 }
00110
00111 int ff_ivi_dec_huff_desc(GetBitContext *gb, int desc_coded, int which_tab,
00112 IVIHuffTab *huff_tab, AVCodecContext *avctx)
00113 {
00114 int i, result;
00115 IVIHuffDesc new_huff;
00116
00117 if (!desc_coded) {
00118
00119 huff_tab->tab = (which_tab) ? &ff_ivi_blk_vlc_tabs[7]
00120 : &ff_ivi_mb_vlc_tabs [7];
00121 } else {
00122 huff_tab->tab_sel = get_bits(gb, 3);
00123 if (huff_tab->tab_sel == 7) {
00124
00125 new_huff.num_rows = get_bits(gb, 4);
00126
00127 for (i = 0; i < new_huff.num_rows; i++)
00128 new_huff.xbits[i] = get_bits(gb, 4);
00129
00130
00131 if (ff_ivi_huff_desc_cmp(&new_huff, &huff_tab->cust_desc)) {
00132 ff_ivi_huff_desc_copy(&huff_tab->cust_desc, &new_huff);
00133
00134 if (huff_tab->cust_tab.table)
00135 free_vlc(&huff_tab->cust_tab);
00136 result = ff_ivi_create_huff_from_desc(&huff_tab->cust_desc,
00137 &huff_tab->cust_tab, 0);
00138 if (result) {
00139 av_log(avctx, AV_LOG_ERROR,
00140 "Error while initializing custom vlc table!\n");
00141 return -1;
00142 }
00143 }
00144 huff_tab->tab = &huff_tab->cust_tab;
00145 } else {
00146
00147 huff_tab->tab = (which_tab) ? &ff_ivi_blk_vlc_tabs[huff_tab->tab_sel]
00148 : &ff_ivi_mb_vlc_tabs [huff_tab->tab_sel];
00149 }
00150 }
00151
00152 return 0;
00153 }
00154
00155 int ff_ivi_huff_desc_cmp(const IVIHuffDesc *desc1, const IVIHuffDesc *desc2)
00156 {
00157 return desc1->num_rows != desc2->num_rows
00158 || memcmp(desc1->xbits, desc2->xbits, desc1->num_rows);
00159 }
00160
00161 void ff_ivi_huff_desc_copy(IVIHuffDesc *dst, const IVIHuffDesc *src)
00162 {
00163 dst->num_rows = src->num_rows;
00164 memcpy(dst->xbits, src->xbits, src->num_rows);
00165 }
00166
00167 int av_cold ff_ivi_init_planes(IVIPlaneDesc *planes, const IVIPicConfig *cfg)
00168 {
00169 int p, b;
00170 uint32_t b_width, b_height, align_fac, width_aligned, height_aligned, buf_size;
00171 IVIBandDesc *band;
00172
00173 ff_ivi_free_buffers(planes);
00174
00175
00176 planes[0].width = cfg->pic_width;
00177 planes[0].height = cfg->pic_height;
00178 planes[0].num_bands = cfg->luma_bands;
00179
00180
00181 planes[1].width = planes[2].width = (cfg->pic_width + 3) >> 2;
00182 planes[1].height = planes[2].height = (cfg->pic_height + 3) >> 2;
00183 planes[1].num_bands = planes[2].num_bands = cfg->chroma_bands;
00184
00185 for (p = 0; p < 3; p++) {
00186 planes[p].bands = av_mallocz(planes[p].num_bands * sizeof(IVIBandDesc));
00187 if (!planes[p].bands)
00188 return AVERROR(ENOMEM);
00189
00190
00191
00192
00193 b_width = planes[p].num_bands == 1 ? planes[p].width : (planes[p].width + 1) >> 1;
00194 b_height = planes[p].num_bands == 1 ? planes[p].height : (planes[p].height + 1) >> 1;
00195
00196
00197
00198 align_fac = p ? 8 : 16;
00199 width_aligned = FFALIGN(b_width , align_fac);
00200 height_aligned = FFALIGN(b_height, align_fac);
00201 buf_size = width_aligned * height_aligned * sizeof(int16_t);
00202
00203 for (b = 0; b < planes[p].num_bands; b++) {
00204 band = &planes[p].bands[b];
00205 band->plane = p;
00206 band->band_num = b;
00207 band->width = b_width;
00208 band->height = b_height;
00209 band->pitch = width_aligned;
00210 band->bufs[0] = av_malloc(buf_size);
00211 band->bufs[1] = av_malloc(buf_size);
00212 if (!band->bufs[0] || !band->bufs[1])
00213 return AVERROR(ENOMEM);
00214
00215
00216 if (cfg->luma_bands > 1) {
00217 band->bufs[2] = av_malloc(buf_size);
00218 if (!band->bufs[2])
00219 return AVERROR(ENOMEM);
00220 }
00221
00222 planes[p].bands[0].blk_vlc.cust_desc.num_rows = 0;
00223 }
00224 }
00225
00226 return 0;
00227 }
00228
00229 void av_cold ff_ivi_free_buffers(IVIPlaneDesc *planes)
00230 {
00231 int p, b, t;
00232
00233 for (p = 0; p < 3; p++) {
00234 for (b = 0; b < planes[p].num_bands; b++) {
00235 av_freep(&planes[p].bands[b].bufs[0]);
00236 av_freep(&planes[p].bands[b].bufs[1]);
00237 av_freep(&planes[p].bands[b].bufs[2]);
00238
00239 if (planes[p].bands[b].blk_vlc.cust_tab.table)
00240 free_vlc(&planes[p].bands[b].blk_vlc.cust_tab);
00241 for (t = 0; t < planes[p].bands[b].num_tiles; t++)
00242 av_freep(&planes[p].bands[b].tiles[t].mbs);
00243 av_freep(&planes[p].bands[b].tiles);
00244 }
00245 av_freep(&planes[p].bands);
00246 }
00247 }
00248
00249 int av_cold ff_ivi_init_tiles(IVIPlaneDesc *planes, int tile_width, int tile_height)
00250 {
00251 int p, b, x, y, x_tiles, y_tiles, t_width, t_height;
00252 IVIBandDesc *band;
00253 IVITile *tile, *ref_tile;
00254
00255 for (p = 0; p < 3; p++) {
00256 t_width = !p ? tile_width : (tile_width + 3) >> 2;
00257 t_height = !p ? tile_height : (tile_height + 3) >> 2;
00258
00259 if (!p && planes[0].num_bands == 4) {
00260 t_width >>= 1;
00261 t_height >>= 1;
00262 }
00263
00264 for (b = 0; b < planes[p].num_bands; b++) {
00265 band = &planes[p].bands[b];
00266 x_tiles = IVI_NUM_TILES(band->width, t_width);
00267 y_tiles = IVI_NUM_TILES(band->height, t_height);
00268 band->num_tiles = x_tiles * y_tiles;
00269
00270 av_freep(&band->tiles);
00271 band->tiles = av_mallocz(band->num_tiles * sizeof(IVITile));
00272 if (!band->tiles)
00273 return AVERROR(ENOMEM);
00274
00275 tile = band->tiles;
00276
00277
00278
00279 ref_tile = planes[0].bands[0].tiles;
00280
00281 for (y = 0; y < band->height; y += t_height) {
00282 for (x = 0; x < band->width; x += t_width) {
00283 tile->xpos = x;
00284 tile->ypos = y;
00285 tile->width = FFMIN(band->width - x, t_width);
00286 tile->height = FFMIN(band->height - y, t_height);
00287 tile->is_empty = tile->data_size = 0;
00288
00289 tile->num_MBs = IVI_MBs_PER_TILE(tile->width, tile->height,
00290 band->mb_size);
00291
00292 av_freep(&tile->mbs);
00293 tile->mbs = av_malloc(tile->num_MBs * sizeof(IVIMbInfo));
00294 if (!tile->mbs)
00295 return AVERROR(ENOMEM);
00296
00297 tile->ref_mbs = 0;
00298 if (p || b) {
00299 tile->ref_mbs = ref_tile->mbs;
00300 ref_tile++;
00301 }
00302
00303 tile++;
00304 }
00305 }
00306
00307 }
00308 }
00309
00310 return 0;
00311 }
00312
00313 int ff_ivi_dec_tile_data_size(GetBitContext *gb)
00314 {
00315 int len;
00316
00317 len = 0;
00318 if (get_bits1(gb)) {
00319 len = get_bits(gb, 8);
00320 if (len == 255)
00321 len = get_bits_long(gb, 24);
00322 }
00323
00324
00325 align_get_bits(gb);
00326
00327 return len;
00328 }
00329
00330 int ff_ivi_decode_blocks(GetBitContext *gb, IVIBandDesc *band, IVITile *tile)
00331 {
00332 int mbn, blk, num_blocks, num_coeffs, blk_size, scan_pos, run, val,
00333 pos, is_intra, mc_type, mv_x, mv_y, col_mask;
00334 uint8_t col_flags[8];
00335 int32_t prev_dc, trvec[64];
00336 uint32_t cbp, sym, lo, hi, quant, buf_offs, q;
00337 IVIMbInfo *mb;
00338 RVMapDesc *rvmap = band->rv_map;
00339 void (*mc_with_delta_func)(int16_t *buf, const int16_t *ref_buf, uint32_t pitch, int mc_type);
00340 void (*mc_no_delta_func) (int16_t *buf, const int16_t *ref_buf, uint32_t pitch, int mc_type);
00341 const uint8_t *base_tab, *scale_tab;
00342
00343 prev_dc = 0;
00344
00345 blk_size = band->blk_size;
00346 col_mask = blk_size - 1;
00347 num_blocks = (band->mb_size != blk_size) ? 4 : 1;
00348 num_coeffs = blk_size * blk_size;
00349 if (blk_size == 8) {
00350 mc_with_delta_func = ff_ivi_mc_8x8_delta;
00351 mc_no_delta_func = ff_ivi_mc_8x8_no_delta;
00352 } else {
00353 mc_with_delta_func = ff_ivi_mc_4x4_delta;
00354 mc_no_delta_func = ff_ivi_mc_4x4_no_delta;
00355 }
00356
00357 for (mbn = 0, mb = tile->mbs; mbn < tile->num_MBs; mb++, mbn++) {
00358 is_intra = !mb->type;
00359 cbp = mb->cbp;
00360 buf_offs = mb->buf_offs;
00361
00362 quant = av_clip(band->glob_quant + mb->q_delta, 0, 23);
00363
00364 base_tab = is_intra ? band->intra_base : band->inter_base;
00365 scale_tab = is_intra ? band->intra_scale : band->inter_scale;
00366
00367 if (!is_intra) {
00368 mv_x = mb->mv_x;
00369 mv_y = mb->mv_y;
00370 if (!band->is_halfpel) {
00371 mc_type = 0;
00372 } else {
00373 mc_type = ((mv_y & 1) << 1) | (mv_x & 1);
00374 mv_x >>= 1;
00375 mv_y >>= 1;
00376 }
00377 }
00378
00379 for (blk = 0; blk < num_blocks; blk++) {
00380
00381 if (blk & 1) {
00382 buf_offs += blk_size;
00383 } else if (blk == 2) {
00384 buf_offs -= blk_size;
00385 buf_offs += blk_size * band->pitch;
00386 }
00387
00388 if (cbp & 1) {
00389 scan_pos = -1;
00390 memset(trvec, 0, num_coeffs*sizeof(trvec[0]));
00391 memset(col_flags, 0, sizeof(col_flags));
00392
00393 while (scan_pos <= num_coeffs) {
00394 sym = get_vlc2(gb, band->blk_vlc.tab->table, IVI_VLC_BITS, 1);
00395 if (sym == rvmap->eob_sym)
00396 break;
00397
00398 if (sym == rvmap->esc_sym) {
00399 run = get_vlc2(gb, band->blk_vlc.tab->table, IVI_VLC_BITS, 1) + 1;
00400 lo = get_vlc2(gb, band->blk_vlc.tab->table, IVI_VLC_BITS, 1);
00401 hi = get_vlc2(gb, band->blk_vlc.tab->table, IVI_VLC_BITS, 1);
00402 val = IVI_TOSIGNED((hi << 6) | lo);
00403 } else {
00404 run = rvmap->runtab[sym];
00405 val = rvmap->valtab[sym];
00406 }
00407
00408
00409 scan_pos += run;
00410 if (scan_pos >= num_coeffs)
00411 break;
00412 pos = band->scan[scan_pos];
00413
00414 if (IVI_DEBUG && !val)
00415 av_log(NULL, AV_LOG_ERROR, "Val = 0 encountered!\n");
00416
00417 q = (base_tab[pos] * scale_tab[quant]) >> 8;
00418 if (q > 1)
00419 val = val * q + FFSIGN(val) * ((q >> 1) - (q & 1));
00420 trvec[pos] = val;
00421 col_flags[pos & col_mask] |= !!val;
00422 }
00423
00424 if (scan_pos >= num_coeffs && sym != rvmap->eob_sym)
00425 return -1;
00426
00427
00428 if (is_intra && band->is_2d_trans) {
00429 prev_dc += trvec[0];
00430 trvec[0] = prev_dc;
00431 col_flags[0] |= !!prev_dc;
00432 }
00433
00434
00435 band->inv_transform(trvec, band->buf + buf_offs,
00436 band->pitch, col_flags);
00437
00438
00439 if (!is_intra)
00440 mc_with_delta_func(band->buf + buf_offs,
00441 band->ref_buf + buf_offs + mv_y * band->pitch + mv_x,
00442 band->pitch, mc_type);
00443 } else {
00444
00445
00446
00447 if (is_intra && band->dc_transform) {
00448 band->dc_transform(&prev_dc, band->buf + buf_offs,
00449 band->pitch, blk_size);
00450 } else
00451 mc_no_delta_func(band->buf + buf_offs,
00452 band->ref_buf + buf_offs + mv_y * band->pitch + mv_x,
00453 band->pitch, mc_type);
00454 }
00455
00456 cbp >>= 1;
00457 }
00458 }
00459
00460 align_get_bits(gb);
00461
00462 return 0;
00463 }
00464
00465 void ff_ivi_process_empty_tile(AVCodecContext *avctx, IVIBandDesc *band,
00466 IVITile *tile, int32_t mv_scale)
00467 {
00468 int x, y, need_mc, mbn, blk, num_blocks, mv_x, mv_y, mc_type;
00469 int offs, mb_offset, row_offset;
00470 IVIMbInfo *mb, *ref_mb;
00471 const int16_t *src;
00472 int16_t *dst;
00473 void (*mc_no_delta_func)(int16_t *buf, const int16_t *ref_buf, uint32_t pitch,
00474 int mc_type);
00475
00476 offs = tile->ypos * band->pitch + tile->xpos;
00477 mb = tile->mbs;
00478 ref_mb = tile->ref_mbs;
00479 row_offset = band->mb_size * band->pitch;
00480 need_mc = 0;
00481
00482 for (y = tile->ypos; y < (tile->ypos + tile->height); y += band->mb_size) {
00483 mb_offset = offs;
00484
00485 for (x = tile->xpos; x < (tile->xpos + tile->width); x += band->mb_size) {
00486 mb->xpos = x;
00487 mb->ypos = y;
00488 mb->buf_offs = mb_offset;
00489
00490 mb->type = 1;
00491 mb->cbp = 0;
00492
00493 if (!band->qdelta_present && !band->plane && !band->band_num) {
00494 mb->q_delta = band->glob_quant;
00495 mb->mv_x = 0;
00496 mb->mv_y = 0;
00497 }
00498
00499 if (band->inherit_qdelta && ref_mb)
00500 mb->q_delta = ref_mb->q_delta;
00501
00502 if (band->inherit_mv) {
00503
00504 if (mv_scale) {
00505 mb->mv_x = ivi_scale_mv(ref_mb->mv_x, mv_scale);
00506 mb->mv_y = ivi_scale_mv(ref_mb->mv_y, mv_scale);
00507 } else {
00508 mb->mv_x = ref_mb->mv_x;
00509 mb->mv_y = ref_mb->mv_y;
00510 }
00511 need_mc |= mb->mv_x || mb->mv_y;
00512 }
00513
00514 mb++;
00515 if (ref_mb)
00516 ref_mb++;
00517 mb_offset += band->mb_size;
00518 }
00519 offs += row_offset;
00520 }
00521
00522 if (band->inherit_mv && need_mc) {
00523 num_blocks = (band->mb_size != band->blk_size) ? 4 : 1;
00524 mc_no_delta_func = (band->blk_size == 8) ? ff_ivi_mc_8x8_no_delta
00525 : ff_ivi_mc_4x4_no_delta;
00526
00527 for (mbn = 0, mb = tile->mbs; mbn < tile->num_MBs; mb++, mbn++) {
00528 mv_x = mb->mv_x;
00529 mv_y = mb->mv_y;
00530 if (!band->is_halfpel) {
00531 mc_type = 0;
00532 } else {
00533 mc_type = ((mv_y & 1) << 1) | (mv_x & 1);
00534 mv_x >>= 1;
00535 mv_y >>= 1;
00536 }
00537
00538 for (blk = 0; blk < num_blocks; blk++) {
00539
00540 offs = mb->buf_offs + band->blk_size * ((blk & 1) + !!(blk & 2) * band->pitch);
00541 mc_no_delta_func(band->buf + offs,
00542 band->ref_buf + offs + mv_y * band->pitch + mv_x,
00543 band->pitch, mc_type);
00544 }
00545 }
00546 } else {
00547
00548 src = band->ref_buf + tile->ypos * band->pitch + tile->xpos;
00549 dst = band->buf + tile->ypos * band->pitch + tile->xpos;
00550 for (y = 0; y < tile->height; y++) {
00551 memcpy(dst, src, tile->width*sizeof(band->buf[0]));
00552 src += band->pitch;
00553 dst += band->pitch;
00554 }
00555 }
00556 }
00557
00558
00559 #if IVI_DEBUG
00560 uint16_t ivi_calc_band_checksum (IVIBandDesc *band)
00561 {
00562 int x, y;
00563 int16_t *src, checksum;
00564
00565 src = band->buf;
00566 checksum = 0;
00567
00568 for (y = 0; y < band->height; src += band->pitch, y++)
00569 for (x = 0; x < band->width; x++)
00570 checksum += src[x];
00571
00572 return checksum;
00573 }
00574
00575 int ivi_check_band (IVIBandDesc *band, const uint8_t *ref, int pitch)
00576 {
00577 int x, y, result;
00578 uint8_t t1, t2;
00579 int16_t *src;
00580
00581 src = band->buf;
00582 result = 0;
00583
00584 for (y = 0; y < band->height; src += band->pitch, y++) {
00585 for (x = 0; x < band->width; x++) {
00586 t1 = av_clip(src[x] + 128, 0, 255);
00587 t2 = ref[x];
00588 if (t1 != t2) {
00589 av_log(NULL, AV_LOG_ERROR, "Data mismatch: row %d, column %d\n",
00590 y / band->blk_size, x / band->blk_size);
00591 result = -1;
00592 }
00593 }
00594 ref += pitch;
00595 }
00596
00597 return result;
00598 }
00599 #endif
00600
00601 void ff_ivi_output_plane(IVIPlaneDesc *plane, uint8_t *dst, int dst_pitch)
00602 {
00603 int x, y;
00604 const int16_t *src = plane->bands[0].buf;
00605 uint32_t pitch = plane->bands[0].pitch;
00606
00607 for (y = 0; y < plane->height; y++) {
00608 for (x = 0; x < plane->width; x++)
00609 dst[x] = av_clip_uint8(src[x] + 128);
00610 src += pitch;
00611 dst += dst_pitch;
00612 }
00613 }
00614
00615
00622 const IVIHuffDesc ff_ivi_mb_huff_desc[8] = {
00623 {8, {0, 4, 5, 4, 4, 4, 6, 6}},
00624 {12, {0, 2, 2, 3, 3, 3, 3, 5, 3, 2, 2, 2}},
00625 {12, {0, 2, 3, 4, 3, 3, 3, 3, 4, 3, 2, 2}},
00626 {12, {0, 3, 4, 4, 3, 3, 3, 3, 3, 2, 2, 2}},
00627 {13, {0, 4, 4, 3, 3, 3, 3, 2, 3, 3, 2, 1, 1}},
00628 {9, {0, 4, 4, 4, 4, 3, 3, 3, 2}},
00629 {10, {0, 4, 4, 4, 4, 3, 3, 2, 2, 2}},
00630 {12, {0, 4, 4, 4, 3, 3, 2, 3, 2, 2, 2, 2}}
00631 };
00632
00633 const IVIHuffDesc ff_ivi_blk_huff_desc[8] = {
00634 {10, {1, 2, 3, 4, 4, 7, 5, 5, 4, 1}},
00635 {11, {2, 3, 4, 4, 4, 7, 5, 4, 3, 3, 2}},
00636 {12, {2, 4, 5, 5, 5, 5, 6, 4, 4, 3, 1, 1}},
00637 {13, {3, 3, 4, 4, 5, 6, 6, 4, 4, 3, 2, 1, 1}},
00638 {11, {3, 4, 4, 5, 5, 5, 6, 5, 4, 2, 2}},
00639 {13, {3, 4, 5, 5, 5, 5, 6, 4, 3, 3, 2, 1, 1}},
00640 {13, {3, 4, 5, 5, 5, 6, 5, 4, 3, 3, 2, 1, 1}},
00641 {9, {3, 4, 4, 5, 5, 5, 6, 5, 5}}
00642 };
00643
00644
00648 const RVMapDesc ff_ivi_rvmap_tabs[9] = {
00649 {
00650 5,
00651 2,
00652
00653 {1, 1, 0, 1, 1, 0, 1, 1, 2, 2, 1, 1, 1, 1, 3, 3,
00654 1, 1, 2, 2, 1, 1, 4, 4, 1, 1, 1, 1, 2, 2, 5, 5,
00655 1, 1, 3, 3, 1, 1, 6, 6, 1, 2, 1, 2, 7, 7, 1, 1,
00656 8, 8, 1, 1, 4, 2, 1, 4, 2, 1, 3, 3, 1, 1, 1, 9,
00657 9, 1, 2, 1, 2, 1, 5, 5, 1, 1, 10, 10, 1, 1, 3, 3,
00658 2, 2, 1, 1, 11, 11, 6, 4, 4, 1, 6, 1, 2, 1, 2, 12,
00659 8, 1, 12, 7, 8, 7, 1, 16, 1, 16, 1, 3, 3, 13, 1, 13,
00660 2, 2, 1, 15, 1, 5, 14, 15, 1, 5, 14, 1, 17, 8, 17, 8,
00661 1, 4, 4, 2, 2, 1, 25, 25, 24, 24, 1, 3, 1, 3, 1, 8,
00662 6, 7, 6, 1, 18, 8, 18, 1, 7, 23, 2, 2, 23, 1, 1, 21,
00663 22, 9, 9, 22, 19, 1, 21, 5, 19, 5, 1, 33, 20, 33, 20, 8,
00664 4, 4, 1, 32, 2, 2, 8, 3, 32, 26, 3, 1, 7, 7, 26, 6,
00665 1, 6, 1, 1, 16, 1, 10, 1, 10, 2, 16, 29, 28, 2, 29, 28,
00666 1, 27, 5, 8, 5, 27, 1, 8, 3, 7, 3, 31, 41, 31, 1, 41,
00667 6, 1, 6, 7, 4, 4, 1, 1, 2, 1, 2, 11, 34, 30, 11, 1,
00668 30, 15, 15, 34, 36, 40, 36, 40, 35, 35, 37, 37, 39, 39, 38, 38},
00669
00670
00671 { 1, -1, 0, 2, -2, 0, 3, -3, 1, -1, 4, -4, 5, -5, 1, -1,
00672 6, -6, 2, -2, 7, -7, 1, -1, 8, -8, 9, -9, 3, -3, 1, -1,
00673 10, -10, 2, -2, 11, -11, 1, -1, 12, 4, -12, -4, 1, -1, 13, -13,
00674 1, -1, 14, -14, 2, 5, 15, -2, -5, -15, -3, 3, 16, -16, 17, 1,
00675 -1, -17, 6, 18, -6, -18, 2, -2, 19, -19, 1, -1, 20, -20, 4, -4,
00676 7, -7, 21, -21, 1, -1, 2, 3, -3, 22, -2, -22, 8, 23, -8, 1,
00677 2, -23, -1, 2, -2, -2, 24, 1, -24, -1, 25, 5, -5, 1, -25, -1,
00678 9, -9, 26, 1, -26, 3, 1, -1, 27, -3, -1, -27, 1, 3, -1, -3,
00679 28, -4, 4, 10, -10, -28, 1, -1, 1, -1, 29, 6, -29, -6, 30, -4,
00680 3, 3, -3, -30, 1, 4, -1, 31, -3, 1, 11, -11, -1, -31, 32, -1,
00681 -1, 2, -2, 1, 1, -32, 1, 4, -1, -4, 33, -1, 1, 1, -1, 5,
00682 5, -5, -33, -1, -12, 12, -5, -7, 1, 1, 7, 34, 4, -4, -1, 4,
00683 -34, -4, 35, 36, -2, -35, -2, -36, 2, 13, 2, -1, 1, -13, 1, -1,
00684 37, 1, -5, 6, 5, -1, 38, -6, -8, 5, 8, -1, 1, 1, -37, -1,
00685 5, 39, -5, -5, 6, -6, -38, -39, -14, 40, 14, 2, 1, 1, -2, -40,
00686 -1, -2, 2, -1, -1, -1, 1, 1, 1, -1, 1, -1, 1, -1, 1, -1}
00687 },{
00688
00689 0,
00690 38,
00691
00692 {0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 8, 6, 8, 7,
00693 7, 9, 9, 10, 10, 11, 11, 1, 12, 1, 12, 13, 13, 16, 14, 16,
00694 14, 15, 15, 17, 17, 18, 0, 18, 19, 20, 21, 19, 22, 21, 20, 22,
00695 25, 24, 2, 25, 24, 23, 23, 2, 26, 28, 26, 28, 29, 27, 29, 27,
00696 33, 33, 1, 32, 1, 3, 32, 30, 36, 3, 36, 30, 31, 31, 35, 34,
00697 37, 41, 34, 35, 37, 4, 41, 4, 49, 8, 8, 49, 40, 38, 5, 38,
00698 40, 39, 5, 39, 42, 43, 42, 7, 57, 6, 43, 44, 6, 50, 7, 44,
00699 57, 48, 50, 48, 45, 45, 46, 47, 51, 46, 47, 58, 1, 51, 58, 1,
00700 52, 59, 53, 9, 52, 55, 55, 59, 53, 56, 54, 56, 54, 9, 64, 64,
00701 60, 63, 60, 63, 61, 62, 61, 62, 2, 10, 2, 10, 11, 1, 11, 13,
00702 12, 1, 12, 13, 16, 16, 8, 8, 14, 3, 3, 15, 14, 15, 4, 4,
00703 1, 17, 17, 5, 1, 7, 7, 5, 6, 1, 2, 2, 6, 22, 1, 25,
00704 21, 22, 8, 24, 1, 21, 25, 24, 8, 18, 18, 23, 9, 20, 23, 33,
00705 29, 33, 20, 1, 19, 1, 29, 36, 9, 36, 19, 41, 28, 57, 32, 3,
00706 28, 3, 1, 27, 49, 49, 1, 32, 26, 26, 2, 4, 4, 7, 57, 41,
00707 2, 7, 10, 5, 37, 16, 10, 27, 8, 8, 13, 16, 37, 13, 1, 5},
00708
00709
00710 {0, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, 1, -1, -1, 1,
00711 -1, 1, -1, 1, -1, 1, -1, 2, 1, -2, -1, 1, -1, 1, 1, -1,
00712 -1, 1, -1, 1, -1, 1, 0, -1, 1, 1, 1, -1, 1, -1, -1, -1,
00713 1, 1, 2, -1, -1, 1, -1, -2, 1, 1, -1, -1, 1, 1, -1, -1,
00714 1, -1, 3, 1, -3, 2, -1, 1, 1, -2, -1, -1, -1, 1, 1, 1,
00715 1, 1, -1, -1, -1, 2, -1, -2, 1, 2, -2, -1, 1, 1, 2, -1,
00716 -1, 1, -2, -1, 1, 1, -1, 2, 1, 2, -1, 1, -2, -1, -2, -1,
00717 -1, 1, 1, -1, 1, -1, 1, 1, 1, -1, -1, 1, 4, -1, -1, -4,
00718 1, 1, 1, 2, -1, -1, 1, -1, -1, 1, -1, -1, 1, -2, 1, -1,
00719 1, 1, -1, -1, 1, 1, -1, -1, 3, 2, -3, -2, 2, 5, -2, 2,
00720 2, -5, -2, -2, -2, 2, -3, 3, 2, 3, -3, 2, -2, -2, 3, -3,
00721 6, 2, -2, 3, -6, 3, -3, -3, 3, 7, -4, 4, -3, 2, -7, 2,
00722 2, -2, -4, 2, 8, -2, -2, -2, 4, 2, -2, 2, 3, 2, -2, -2,
00723 2, 2, -2, -8, -2, 9, -2, 2, -3, -2, 2, -2, 2, 2, 2, 4,
00724 -2, -4, 10, 2, 2, -2, -9, -2, 2, -2, 5, 4, -4, 4, -2, 2,
00725 -5, -4, -3, 4, 2, -3, 3, -2, -5, 5, 3, 3, -2, -3, -10, -4}
00726 },{
00727
00728 2,
00729 11,
00730
00731 {1, 1, 0, 2, 2, 1, 1, 3, 3, 4, 4, 0, 1, 1, 5, 5,
00732 2, 2, 6, 6, 7, 7, 1, 8, 1, 8, 3, 3, 9, 9, 1, 2,
00733 2, 1, 4, 10, 4, 10, 11, 11, 1, 5, 12, 12, 1, 5, 13, 13,
00734 3, 3, 6, 6, 2, 2, 14, 14, 16, 16, 15, 7, 15, 8, 8, 7,
00735 1, 1, 17, 17, 4, 4, 1, 1, 18, 18, 2, 2, 5, 5, 25, 3,
00736 9, 3, 25, 9, 19, 24, 19, 24, 1, 21, 20, 1, 21, 22, 20, 22,
00737 23, 23, 8, 6, 33, 6, 8, 33, 7, 7, 26, 26, 1, 32, 1, 32,
00738 28, 4, 28, 10, 29, 27, 27, 10, 41, 4, 29, 2, 2, 41, 36, 31,
00739 49, 31, 34, 30, 34, 36, 30, 35, 1, 49, 11, 5, 35, 11, 1, 3,
00740 3, 5, 37, 37, 8, 40, 8, 40, 12, 12, 42, 42, 1, 38, 16, 57,
00741 1, 6, 16, 39, 38, 6, 7, 7, 13, 13, 39, 43, 2, 43, 57, 2,
00742 50, 9, 44, 9, 50, 4, 15, 48, 44, 4, 1, 15, 48, 14, 14, 1,
00743 45, 45, 8, 3, 5, 8, 51, 47, 3, 46, 46, 47, 5, 51, 1, 17,
00744 17, 58, 1, 58, 2, 52, 52, 2, 53, 7, 59, 6, 6, 56, 53, 55,
00745 7, 55, 1, 54, 59, 56, 54, 10, 1, 10, 4, 60, 1, 60, 8, 4,
00746 8, 64, 64, 61, 1, 63, 3, 63, 62, 61, 5, 11, 5, 3, 11, 62},
00747
00748
00749 { 1, -1, 0, 1, -1, 2, -2, 1, -1, 1, -1, 0, 3, -3, 1, -1,
00750 2, -2, 1, -1, 1, -1, 4, 1, -4, -1, 2, -2, 1, -1, 5, 3,
00751 -3, -5, 2, 1, -2, -1, 1, -1, 6, 2, 1, -1, -6, -2, 1, -1,
00752 3, -3, 2, -2, 4, -4, 1, -1, 1, -1, 1, 2, -1, 2, -2, -2,
00753 7, -7, 1, -1, 3, -3, 8, -8, 1, -1, 5, -5, 3, -3, 1, 4,
00754 2, -4, -1, -2, 1, 1, -1, -1, 9, 1, 1, -9, -1, 1, -1, -1,
00755 1, -1, 3, -3, 1, 3, -3, -1, 3, -3, 1, -1, 10, 1, -10, -1,
00756 1, 4, -1, 2, 1, -1, 1, -2, 1, -4, -1, 6, -6, -1, 1, 1,
00757 1, -1, 1, 1, -1, -1, -1, 1, 11, -1, -2, 4, -1, 2, -11, 5,
00758 -5, -4, -1, 1, 4, 1, -4, -1, -2, 2, 1, -1, 12, 1, -2, 1,
00759 -12, 4, 2, 1, -1, -4, 4, -4, 2, -2, -1, 1, 7, -1, -1, -7,
00760 -1, -3, 1, 3, 1, 5, 2, 1, -1, -5, 13, -2, -1, 2, -2, -13,
00761 1, -1, 5, 6, 5, -5, 1, 1, -6, 1, -1, -1, -5, -1, 14, 2,
00762 -2, 1, -14, -1, 8, 1, -1, -8, 1, 5, 1, 5, -5, 1, -1, 1,
00763 -5, -1, 15, 1, -1, -1, -1, 3, -15, -3, 6, 1, 16, -1, 6, -6,
00764 -6, 1, -1, 1, -16, 1, 7, -1, 1, -1, -6, -3, 6, -7, 3, -1}
00765 },{
00766
00767 0,
00768 35,
00769
00770 {0, 1, 1, 2, 2, 3, 3, 4, 4, 1, 1, 5, 5, 6, 6, 7,
00771 7, 8, 8, 9, 9, 2, 2, 10, 10, 1, 1, 11, 11, 12, 12, 3,
00772 3, 13, 13, 0, 14, 14, 16, 15, 16, 15, 4, 4, 17, 1, 17, 1,
00773 5, 5, 18, 18, 2, 2, 6, 6, 8, 19, 7, 8, 7, 19, 20, 20,
00774 21, 21, 22, 24, 22, 24, 23, 23, 1, 1, 25, 25, 3, 3, 26, 26,
00775 9, 9, 27, 27, 28, 28, 33, 29, 4, 33, 29, 1, 4, 1, 32, 32,
00776 2, 2, 31, 10, 30, 10, 30, 31, 34, 34, 5, 5, 36, 36, 35, 41,
00777 35, 11, 41, 11, 37, 1, 8, 8, 37, 6, 1, 6, 40, 7, 7, 40,
00778 12, 38, 12, 39, 39, 38, 49, 13, 49, 13, 3, 42, 3, 42, 16, 16,
00779 43, 43, 14, 14, 1, 1, 44, 15, 44, 15, 2, 2, 57, 48, 50, 48,
00780 57, 50, 4, 45, 45, 4, 46, 47, 47, 46, 1, 51, 1, 17, 17, 51,
00781 8, 9, 9, 5, 58, 8, 58, 5, 52, 52, 55, 56, 53, 56, 55, 59,
00782 59, 53, 54, 1, 6, 54, 7, 7, 6, 1, 2, 3, 2, 3, 64, 60,
00783 60, 10, 10, 64, 61, 62, 61, 63, 1, 63, 62, 1, 18, 24, 18, 4,
00784 25, 4, 8, 21, 21, 1, 24, 22, 25, 22, 8, 11, 19, 11, 23, 1,
00785 20, 23, 19, 20, 5, 12, 5, 1, 16, 2, 12, 13, 2, 13, 1, 16},
00786
00787
00788 { 0, 1, -1, 1, -1, 1, -1, 1, -1, 2, -2, 1, -1, 1, -1, 1,
00789 -1, 1, -1, 1, -1, 2, -2, 1, -1, 3, -3, 1, -1, 1, -1, 2,
00790 -2, 1, -1, 0, 1, -1, 1, 1, -1, -1, 2, -2, 1, 4, -1, -4,
00791 2, -2, 1, -1, -3, 3, 2, -2, 2, 1, 2, -2, -2, -1, 1, -1,
00792 1, -1, 1, 1, -1, -1, 1, -1, 5, -5, 1, -1, 3, -3, 1, -1,
00793 2, -2, 1, -1, 1, -1, 1, 1, 3, -1, -1, 6, -3, -6, -1, 1,
00794 4, -4, 1, 2, 1, -2, -1, -1, 1, -1, 3, -3, 1, -1, 1, 1,
00795 -1, 2, -1, -2, 1, 7, -3, 3, -1, 3, -7, -3, 1, -3, 3, -1,
00796 2, 1, -2, 1, -1, -1, 1, 2, -1, -2, -4, -1, 4, 1, 2, -2,
00797 1, -1, -2, 2, 8, -8, -1, 2, 1, -2, -5, 5, 1, -1, -1, 1,
00798 -1, 1, 4, -1, 1, -4, -1, -1, 1, 1, 9, 1, -9, 2, -2, -1,
00799 -4, 3, -3, -4, -1, 4, 1, 4, 1, -1, 1, -1, 1, 1, -1, 1,
00800 -1, -1, -1, 10, 4, 1, 4, -4, -4, -10, 6, 5, -6, -5, 1, -1,
00801 1, 3, -3, -1, 1, -1, -1, -1, 11, 1, 1, -11, -2, -2, 2, 5,
00802 -2, -5, -5, 2, -2, 12, 2, -2, 2, 2, 5, -3, -2, 3, -2, -12,
00803 -2, 2, 2, 2, -5, 3, 5, 13, -3, 7, -3, -3, -7, 3, -13, 3}
00804 },{
00805
00806 0,
00807 34,
00808
00809 {0, 1, 1, 1, 2, 2, 1, 3, 3, 1, 1, 1, 4, 4, 1, 5,
00810 2, 1, 5, 2, 1, 1, 6, 6, 1, 1, 1, 1, 1, 7, 3, 1,
00811 2, 3, 0, 1, 2, 7, 1, 1, 1, 8, 1, 1, 8, 1, 1, 1,
00812 9, 1, 9, 1, 2, 1, 1, 2, 1, 1, 10, 4, 1, 10, 1, 4,
00813 1, 1, 1, 1, 1, 3, 1, 1, 1, 3, 2, 1, 5, 1, 1, 1,
00814 2, 5, 1, 11, 1, 11, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
00815 2, 1, 6, 1, 6, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 12,
00816 3, 1, 12, 1, 1, 1, 2, 1, 1, 3, 1, 1, 1, 1, 1, 1,
00817 4, 1, 1, 1, 2, 1, 1, 4, 1, 1, 1, 1, 1, 1, 2, 1,
00818 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 1, 2, 1, 1, 5,
00819 1, 1, 1, 1, 1, 7, 1, 7, 1, 1, 2, 3, 1, 1, 1, 1,
00820 5, 1, 1, 1, 1, 1, 1, 2, 13, 1, 1, 1, 1, 1, 1, 1,
00821 1, 1, 1, 1, 1, 1, 1, 1, 13, 2, 1, 1, 4, 1, 1, 1,
00822 3, 1, 6, 1, 1, 1, 14, 1, 1, 1, 1, 1, 14, 6, 1, 1,
00823 1, 1, 15, 2, 4, 1, 2, 3, 15, 1, 1, 1, 8, 1, 1, 8,
00824 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1},
00825
00826
00827 { 0, 1, -1, 2, 1, -1, -2, 1, -1, 3, -3, 4, 1, -1, -4, 1,
00828 2, 5, -1, -2, -5, 6, 1, -1, -6, 7, -7, 8, -8, 1, 2, 9,
00829 3, -2, 0, -9, -3, -1, 10, -10, 11, 1, -11, 12, -1, -12, 13, -13,
00830 1, 14, -1, -14, 4, 15, -15, -4, 16, -16, 1, 2, 17, -1, -17, -2,
00831 18, -18, 19, -19, 20, 3, -20, 21, -21, -3, 5, 22, 2, -22, -23, 23,
00832 -5, -2, 24, 1, -24, -1, 25, -25, 26, -26, -27, 27, 28, 29, -28, -29,
00833 6, 30, 2, -31, -2, -30, 31, -6, -32, 32, 33, -33, 34, -35, -34, 1,
00834 4, -36, -1, 35, 37, 36, 7, -37, 38, -4, -38, 39, 41, 40, -40, -39,
00835 3, 42, -43, -41, -7, -42, 43, -3, 44, -44, 45, -45, 46, 47, 8, -47,
00836 -48, -46, 50, -50, 48, 49, 51, -49, 52, -52, 5, -51, -8, -53, 53, 3,
00837 -56, 56, 55, 54, -54, 2, 60, -2, -55, 58, 9, -5, 59, 57, -57, -63,
00838 -3, -58, -60, -61, 61, -59, -62, -9, 1, 64, 62, 69, -64, 63, 65, -67,
00839 -68, 66, -65, 68, -66, -69, 67, -70, -1, 10, 71, -71, 4, 73, 72, 70,
00840 6, -76, -3, 74, -78, -74, 1, 78, 80, -72, -75, 76, -1, 3, -73, 79,
00841 75, 77, 1, 11, -4, -79, -10, -6, -1, -77, -83, -80, 2, 81, -84, -2,
00842 83, -81, 82, -82, 84, -87, -86, 85, -11, -85, 86, -89, 87, -88, 88, 89}
00843 },{
00844
00845 2,
00846 33,
00847
00848 {1, 1, 0, 2, 1, 2, 1, 3, 3, 1, 1, 4, 4, 2, 2, 1,
00849 1, 5, 5, 6, 1, 6, 1, 7, 7, 3, 3, 2, 8, 2, 8, 1,
00850 1, 0, 9, 9, 1, 1, 10, 4, 10, 4, 11, 11, 2, 1, 2, 1,
00851 12, 12, 3, 3, 1, 1, 13, 5, 5, 13, 14, 1, 1, 14, 2, 2,
00852 6, 6, 15, 1, 1, 15, 16, 4, 7, 16, 4, 7, 1, 1, 3, 3,
00853 8, 8, 2, 2, 1, 1, 17, 17, 1, 1, 18, 18, 5, 5, 2, 2,
00854 1, 1, 9, 19, 9, 19, 20, 3, 3, 20, 1, 10, 21, 1, 10, 4,
00855 4, 21, 22, 6, 6, 22, 1, 1, 23, 24, 2, 2, 23, 24, 11, 1,
00856 1, 11, 7, 25, 7, 1, 1, 25, 8, 8, 3, 26, 3, 1, 12, 2,
00857 2, 26, 1, 12, 5, 5, 27, 4, 1, 4, 1, 27, 28, 1, 28, 13,
00858 1, 13, 2, 29, 2, 1, 32, 6, 1, 30, 14, 29, 14, 6, 3, 31,
00859 3, 1, 30, 1, 32, 31, 33, 9, 33, 1, 1, 7, 9, 7, 2, 2,
00860 1, 1, 4, 36, 34, 4, 5, 10, 10, 5, 34, 1, 1, 35, 8, 8,
00861 36, 3, 35, 1, 15, 3, 2, 1, 16, 15, 16, 2, 37, 1, 37, 1,
00862 1, 1, 6, 6, 38, 1, 38, 11, 1, 39, 39, 40, 11, 2, 41, 4,
00863 40, 1, 2, 4, 1, 1, 1, 41, 3, 1, 3, 1, 5, 7, 5, 7},
00864
00865
00866 { 1, -1, 0, 1, 2, -1, -2, 1, -1, 3, -3, 1, -1, 2, -2, 4,
00867 -4, 1, -1, 1, 5, -1, -5, 1, -1, 2, -2, 3, 1, -3, -1, 6,
00868 -6, 0, 1, -1, 7, -7, 1, 2, -1, -2, 1, -1, 4, 8, -4, -8,
00869 1, -1, 3, -3, 9, -9, 1, 2, -2, -1, 1, 10, -10, -1, 5, -5,
00870 2, -2, 1, 11, -11, -1, 1, 3, 2, -1, -3, -2, 12, -12, 4, -4,
00871 2, -2, -6, 6, 13, -13, 1, -1, 14, -14, 1, -1, 3, -3, 7, -7,
00872 15, -15, 2, 1, -2, -1, 1, 5, -5, -1, -16, 2, 1, 16, -2, 4,
00873 -4, -1, 1, 3, -3, -1, 17, -17, 1, 1, -8, 8, -1, -1, 2, 18,
00874 -18, -2, 3, 1, -3, 19, -19, -1, 3, -3, 6, 1, -6, 20, 2, 9,
00875 -9, -1, -20, -2, 4, -4, 1, -5, 21, 5, -21, -1, 1, -22, -1, 2,
00876 22, -2, 10, 1, -10, 23, 1, 4, -23, 1, 2, -1, -2, -4, -7, 1,
00877 7, -24, -1, 24, -1, -1, 1, 3, -1, -25, 25, 4, -3, -4, 11, -11,
00878 26, -26, 6, 1, 1, -6, -5, -3, 3, 5, -1, -27, 27, 1, 4, -4,
00879 -1, -8, -1, 28, 2, 8, -12, -28, -2, -2, 2, 12, -1, 29, 1, -29,
00880 30, -30, 5, -5, 1, -31, -1, 3, 31, -1, 1, 1, -3, -13, 1, -7,
00881 -1, -32, 13, 7, 32, 33, -33, -1, -9, -34, 9, 34, -6, 5, 6, -5}
00882 },{
00883
00884 2,
00885 13,
00886
00887 {1, 1, 0, 1, 1, 2, 2, 1, 1, 3, 3, 1, 1, 0, 2, 2,
00888 4, 1, 4, 1, 1, 1, 5, 5, 1, 1, 6, 6, 2, 2, 1, 1,
00889 3, 3, 7, 7, 1, 1, 8, 8, 1, 1, 2, 2, 1, 9, 1, 9,
00890 4, 4, 10, 1, 1, 10, 1, 1, 11, 11, 3, 3, 1, 2, 1, 2,
00891 1, 1, 12, 12, 5, 5, 1, 1, 13, 1, 1, 13, 2, 2, 1, 1,
00892 6, 6, 1, 1, 4, 14, 4, 14, 3, 1, 3, 1, 1, 1, 15, 7,
00893 15, 2, 2, 7, 1, 1, 1, 8, 1, 8, 16, 16, 1, 1, 1, 1,
00894 2, 1, 1, 2, 1, 1, 3, 5, 5, 3, 4, 1, 1, 4, 1, 1,
00895 17, 17, 9, 1, 1, 9, 2, 2, 1, 1, 10, 10, 1, 6, 1, 1,
00896 6, 18, 1, 1, 18, 1, 1, 1, 2, 2, 3, 1, 3, 1, 1, 1,
00897 4, 1, 19, 1, 19, 7, 1, 1, 20, 1, 4, 20, 1, 7, 11, 2,
00898 1, 11, 21, 2, 8, 5, 1, 8, 1, 5, 21, 1, 1, 1, 22, 1,
00899 1, 22, 1, 1, 3, 3, 1, 23, 2, 12, 24, 1, 1, 2, 1, 1,
00900 12, 23, 1, 1, 24, 1, 1, 1, 4, 1, 1, 1, 2, 1, 6, 6,
00901 4, 2, 1, 1, 1, 1, 1, 1, 1, 14, 13, 3, 1, 25, 9, 25,
00902 14, 1, 9, 3, 13, 1, 1, 1, 1, 1, 10, 1, 1, 2, 10, 2},
00903
00904
00905 {-20, -1, 0, 2, -2, 1, -1, 3, -3, 1, -1, 4, -4, 0, 2, -2,
00906 1, 5, -1, -5, 6, -6, 1, -1, 7, -7, 1, -1, 3, -3, 8, -8,
00907 2, -2, 1, -1, 9, -9, 1, -1, 10, -10, 4, -4, 11, 1, -11, -1,
00908 2, -2, 1, 12, -12, -1, 13, -13, 1, -1, 3, -3, 14, 5, -14, -5,
00909 -15, 15, -1, 1, 2, -2, 16, -16, 1, 17, -17, -1, 6, -6, 18, -18,
00910 2, -2, -19, 19, -3, 1, 3, -1, 4, 20, -4, 1, -21, 21, 1, 2,
00911 -1, -7, 7, -2, 22, -22, 23, 2, -23, -2, 1, -1, -24, 24, -25, 25,
00912 -8, -26, 26, 8, -27, 27, 5, 3, -3, -5, -4, 28, -28, 4, 29, -29,
00913 1, -1, -2, -30, 30, 2, 9, -9, -31, 31, 2, -2, -32, 3, 32, -33,
00914 -3, 1, 33, -34, -1, 34, -35, 35, -10, 10, -6, 36, 6, -36, 37, -37,
00915 -5, 38, 1, -38, -1, 3, 39, -39, -1, 40, 5, 1, -40, -3, 2, -11,
00916 -41, -2, 1, 11, -3, -4, 41, 3, 42, 4, -1, -43, -42, 43, 1, -44,
00917 45, -1, 44, -45, -7, 7, -46, 1, -12, 2, 1, -47, 46, 12, 47, 48,
00918 -2, -1, -48, 49, -1, -50, -49, 50, -6, -51, 51, 52, -13, 53, -4, 4,
00919 6, 13, -53, -52, -54, 55, 54, -55, -56, -2, 2, -8, 56, 1, -3, -1,
00920 2, 58, 3, 8, -2, 57, -58, -60, -59, -57, -3, 60, 59, -14, 3, 14}
00921 },{
00922
00923 2,
00924 38,
00925
00926 {1, 1, 0, 2, 2, 1, 1, 3, 3, 4, 4, 5, 5, 1, 1, 6,
00927 6, 2, 2, 7, 7, 8, 8, 1, 1, 3, 3, 9, 9, 10, 10, 1,
00928 1, 2, 2, 4, 4, 11, 0, 11, 12, 12, 13, 13, 1, 1, 5, 5,
00929 14, 14, 15, 16, 15, 16, 3, 3, 1, 6, 1, 6, 2, 2, 7, 7,
00930 8, 8, 17, 17, 1, 1, 4, 4, 18, 18, 2, 2, 1, 19, 1, 20,
00931 19, 20, 21, 21, 3, 3, 22, 22, 5, 5, 24, 1, 1, 23, 9, 23,
00932 24, 9, 2, 2, 10, 1, 1, 10, 6, 6, 25, 4, 4, 25, 7, 7,
00933 26, 8, 1, 8, 3, 1, 26, 3, 11, 11, 27, 27, 2, 28, 1, 2,
00934 28, 1, 12, 12, 5, 5, 29, 13, 13, 29, 32, 1, 1, 33, 31, 30,
00935 32, 4, 30, 33, 4, 31, 3, 14, 1, 1, 3, 34, 34, 2, 2, 14,
00936 6, 6, 35, 36, 35, 36, 1, 15, 1, 16, 16, 15, 7, 9, 7, 9,
00937 37, 8, 8, 37, 1, 1, 39, 2, 38, 39, 2, 40, 5, 38, 40, 5,
00938 3, 3, 4, 4, 10, 10, 1, 1, 1, 1, 41, 2, 41, 2, 6, 6,
00939 1, 1, 11, 42, 11, 43, 3, 42, 3, 17, 4, 43, 1, 17, 7, 1,
00940 8, 44, 4, 7, 44, 5, 8, 2, 5, 1, 2, 48, 45, 1, 12, 45,
00941 12, 48, 13, 13, 1, 9, 9, 46, 1, 46, 47, 47, 49, 18, 18, 49},
00942
00943
00944 { 1, -1, 0, 1, -1, 2, -2, 1, -1, 1, -1, 1, -1, 3, -3, 1,
00945 -1, -2, 2, 1, -1, 1, -1, 4, -4, -2, 2, 1, -1, 1, -1, 5,
00946 -5, -3, 3, 2, -2, 1, 0, -1, 1, -1, 1, -1, 6, -6, 2, -2,
00947 1, -1, 1, 1, -1, -1, -3, 3, 7, 2, -7, -2, -4, 4, 2, -2,
00948 2, -2, 1, -1, 8, -8, 3, -3, 1, -1, -5, 5, 9, 1, -9, 1,
00949 -1, -1, 1, -1, -4, 4, 1, -1, 3, -3, 1, -10, 10, 1, 2, -1,
00950 -1, -2, 6, -6, 2, 11, -11, -2, 3, -3, 1, -4, 4, -1, 3, -3,
00951 1, 3, 12, -3, -5, -12, -1, 5, 2, -2, 1, -1, -7, 1, 13, 7,
00952 -1, -13, 2, -2, 4, -4, 1, 2, -2, -1, 1, 14, -14, 1, 1, 1,
00953 -1, -5, -1, -1, 5, -1, -6, 2, -15, 15, 6, 1, -1, -8, 8, -2,
00954 -4, 4, 1, 1, -1, -1, 16, 2, -16, -2, 2, -2, 4, 3, -4, -3,
00955 -1, -4, 4, 1, -17, 17, -1, -9, 1, 1, 9, 1, -5, -1, -1, 5,
00956 -7, 7, 6, -6, 3, -3, 18, -18, 19, -19, 1, -10, -1, 10, -5, 5,
00957 20, -20, -3, 1, 3, 1, 8, -1, -8, 2, 7, -1, -21, -2, 5, 21,
00958 5, -1, -7, -5, 1, -6, -5, -11, 6, 22, 11, 1, 1, -22, -3, -1,
00959 3, -1, 3, -3, -23, 4, -4, 1, 23, -1, 1, -1, 1, -2, 2, -1}
00960 },{
00961
00962 4,
00963 11,
00964
00965 {1, 1, 1, 1, 0, 2, 2, 1, 1, 3, 3, 0, 1, 1, 2, 2,
00966 4, 4, 1, 1, 5, 5, 1, 1, 2, 2, 3, 3, 6, 6, 1, 1,
00967 7, 7, 8, 1, 8, 2, 2, 1, 4, 4, 1, 3, 1, 3, 9, 9,
00968 2, 2, 1, 5, 1, 5, 10, 10, 1, 1, 11, 11, 3, 6, 3, 4,
00969 4, 6, 2, 2, 1, 12, 1, 12, 7, 13, 7, 13, 1, 1, 8, 8,
00970 2, 2, 14, 14, 16, 15, 16, 5, 5, 1, 3, 15, 1, 3, 4, 4,
00971 1, 1, 17, 17, 2, 2, 6, 6, 1, 18, 1, 18, 22, 21, 22, 21,
00972 25, 24, 25, 19, 9, 20, 9, 23, 19, 24, 20, 3, 23, 7, 3, 1,
00973 1, 7, 28, 26, 29, 5, 28, 26, 5, 8, 29, 4, 8, 27, 2, 2,
00974 4, 27, 1, 1, 10, 36, 10, 33, 33, 36, 30, 1, 32, 32, 1, 30,
00975 6, 31, 31, 35, 3, 6, 11, 11, 3, 2, 35, 2, 34, 1, 34, 1,
00976 37, 37, 12, 7, 12, 5, 41, 5, 4, 7, 1, 8, 13, 4, 1, 41,
00977 13, 38, 8, 38, 9, 1, 40, 40, 9, 1, 39, 2, 2, 49, 39, 42,
00978 3, 3, 14, 16, 49, 14, 16, 42, 43, 43, 6, 6, 15, 1, 1, 15,
00979 44, 44, 1, 1, 50, 48, 4, 5, 4, 7, 5, 2, 10, 10, 48, 7,
00980 50, 45, 2, 1, 45, 8, 8, 1, 46, 46, 3, 47, 47, 3, 1, 1},
00981
00982
00983 { 1, -1, 2, -2, 0, 1, -1, 3, -3, 1, -1, 0, 4, -4, 2, -2,
00984 1, -1, 5, -5, 1, -1, 6, -6, 3, -3, 2, -2, 1, -1, 7, -7,
00985 1, -1, 1, 8, -1, 4, -4, -8, 2, -2, 9, 3, -9, -3, 1, -1,
00986 5, -5, 10, 2, -10, -2, 1, -1, 11, -11, 1, -1, -4, 2, 4, 3,
00987 -3, -2, 6, -6, 12, 1, -12, -1, 2, 1, -2, -1, 13, -13, 2, -2,
00988 7, -7, 1, -1, 1, 1, -1, 3, -3, 14, 5, -1, -14, -5, 4, -4,
00989 15, -15, 1, -1, 8, -8, -3, 3, 16, 1, -16, -1, 1, 1, -1, -1,
00990 1, 1, -1, 1, 2, 1, -2, 1, -1, -1, -1, 6, -1, 3, -6, 17,
00991 -17, -3, 1, 1, 1, 4, -1, -1, -4, 3, -1, 5, -3, -1, -9, 9,
00992 -5, 1, 18, -18, 2, 1, -2, 1, -1, -1, 1, 19, -1, 1, -19, -1,
00993 4, 1, -1, 1, 7, -4, -2, 2, -7, 10, -1, -10, 1, 20, -1, -20,
00994 1, -1, 2, 4, -2, 5, 1, -5, 6, -4, 21, 4, 2, -6, -21, -1,
00995 -2, 1, -4, -1, -3, 22, -1, 1, 3, -22, -1, 11, -11, 1, 1, 1,
00996 8, -8, 2, 2, -1, -2, -2, -1, 1, -1, -5, 5, 2, 23, -23, -2,
00997 1, -1, 24, -24, -1, -1, 7, 6, -7, 5, -6, 12, -3, 3, 1, -5,
00998 1, 1, -12, 25, -1, -5, 5, -25, -1, 1, 9, 1, -1, -9, 26, -26}
00999 }
01000 };