From: Michael Niedermayer Date: Wed, 28 Mar 2012 23:41:04 +0000 (+0200) Subject: Merge remote-tracking branch 'qatar/master' X-Git-Tag: android-x86-4.4-r1~12693 X-Git-Url: http://git.osdn.net/view?a=commitdiff_plain;h=d40ff29cacf9b8ffa1061392a0e9b3056c4882ea;p=android-x86%2Fexternal-ffmpeg.git Merge remote-tracking branch 'qatar/master' * qatar/master: asf: only set index_read if the index contained entries. cabac: add overread protection to BRANCHLESS_GET_CABAC(). cabac: increment jump locations by one in callers of BRANCHLESS_GET_CABAC(). cabac: remove unused argument from BRANCHLESS_GET_CABAC_UPDATE(). cabac: use struct+offset instead of memory operand in BRANCHLESS_GET_CABAC(). h264: add overread protection to get_cabac_bypass_sign_x86(). h264: reindent get_cabac_bypass_sign_x86(). h264: use struct offsets in get_cabac_bypass_sign_x86(). h264: fix overreads in cabac reader. wmall: fix seeking. lagarith: fix buffer overreads. dvdec: drop unnecessary dv_tablegen.h #include build: fix doc generation errors in parallel builds Replace memset(0) by zero initializations. faandct: Remove FAAN_POSTSCALE define and related code. dvenc: print allowed profiles if the video doesn't conform to any of them. avcodec_encode_{audio,video}: only reallocate output packet when it has non-zero size. FATE: add a test for vp8 with changing frame size. fate: add kgv1 fate test. oggdec: calculate correct timestamps in Ogg/FLAC Conflicts: libavcodec/4xm.c libavcodec/cook.c libavcodec/dvdata.c libavcodec/dvdsubdec.c libavcodec/lagarith.c libavcodec/lagarithrac.c libavcodec/utils.c tests/fate/video.mak Merged-by: Michael Niedermayer --- d40ff29cacf9b8ffa1061392a0e9b3056c4882ea diff --cc libavcodec/4xm.c index 53ee855160,8cc5592c73..600cf81ccd --- a/libavcodec/4xm.c +++ b/libavcodec/4xm.c @@@ -576,19 -550,17 +576,18 @@@ static int decode_i_mb(FourXContext *f } static const uint8_t *read_huffman_tables(FourXContext *f, - const uint8_t * const buf) + const uint8_t * const buf, int buf_size) { - int frequency[512]; + int frequency[512] = { 0 }; uint8_t flag[512]; int up[512]; uint8_t len_tab[257]; int bits_tab[257]; int start, end; const uint8_t *ptr = buf; + const uint8_t *ptr_end = buf + buf_size; int j; - memset(frequency, 0, sizeof(frequency)); memset(up, -1, sizeof(up)); start = *ptr++; @@@ -691,10 -660,7 +690,9 @@@ static int decode_i2_frame(FourXContex for (y = 0; y < height; y += 16) { for (x = 0; x < width; x += 16) { - unsigned int color[4], bits; + unsigned int color[4] = { 0 }, bits; + if (buf_end - buf < 8) + return -1; - memset(color, 0, sizeof(color)); // warning following is purely guessed ... color[0] = bytestream2_get_le16u(&g3); color[1] = bytestream2_get_le16u(&g3); diff --cc libavcodec/cabac_functions.h index 226edfa0ef,4c74cf7b23..90af15c243 --- a/libavcodec/cabac_functions.h +++ b/libavcodec/cabac_functions.h @@@ -47,7 -47,8 +47,7 @@@ static void refill(CABACContext *c) c->low+= c->bytestream[0]<<1; #endif c->low -= CABAC_MASK; - c->bytestream+= CABAC_BITS/8; - if (c->bytestream < c->bytestream_end) - c->bytestream += CABAC_BITS / 8; ++ c->bytestream += CABAC_BITS / 8; } static inline void renorm_cabac_decoder_once(CABACContext *c){ @@@ -74,7 -75,8 +74,7 @@@ static void refill2(CABACContext *c) #endif c->low += x<bytestream+= CABAC_BITS/8; - if (c->bytestream < c->bytestream_end) - c->bytestream += CABAC_BITS/8; ++ c->bytestream += CABAC_BITS/8; } static av_always_inline int get_cabac_inline(CABACContext *c, uint8_t * const state){ diff --cc libavcodec/cook.c index 31b0f1f8b0,217abcf117..cde2752ea7 --- a/libavcodec/cook.c +++ b/libavcodec/cook.c @@@ -649,14 -645,11 +645,11 @@@ static void decode_vectors(COOKContext */ static int mono_decode(COOKContext *q, COOKSubpacket *p, float *mlt_buffer) { - int category_index[128]; + int category_index[128] = { 0 }; + int category[128] = { 0 }; int quant_index_table[102]; - int category[128]; - int res; + int res, i; - memset(&category, 0, sizeof(category)); - memset(&category_index, 0, sizeof(category_index)); - if ((res = decode_envelope(q, p, quant_index_table)) < 0) return res; q->num_vectors = get_bits(&q->gb, p->log2_numvector_size); diff --cc libavcodec/dvdata.c index 3dc3ae6785,6d123a9741..6a29a59e5e --- a/libavcodec/dvdata.c +++ b/libavcodec/dvdata.c @@@ -25,7 -25,7 +25,8 @@@ */ #include "libavutil/rational.h" +#include "libavutil/intreadwrite.h" + #include "libavutil/pixdesc.h" #include "avcodec.h" #include "dvdata.h" diff --cc libavcodec/dvdsubdec.c index f4b54396d9,83e71d1238..afc485bf6b --- a/libavcodec/dvdsubdec.c +++ b/libavcodec/dvdsubdec.c @@@ -124,27 -116,12 +124,27 @@@ static int decode_rle(uint8_t *bitmap, } static void guess_palette(uint32_t *rgba_palette, - uint8_t *colormap, - uint8_t *alpha, + DVDSubContext* ctx, uint32_t subtitle_color) { + static const uint8_t level_map[4][4] = { + // this configuration (full range, lowest to highest) in tests + // seemed most common, so assume this + {0xff}, + {0x00, 0xff}, + {0x00, 0x80, 0xff}, + {0x00, 0x55, 0xaa, 0xff}, + }; - uint8_t color_used[16]; + uint8_t color_used[16] = { 0 }; int nb_opaque_colors, i, level, j, r, g, b; + uint8_t *colormap = ctx->colormap, *alpha = ctx->alpha; + + if(ctx->has_palette) { + for(i = 0; i < 4; i++) + rgba_palette[i] = (ctx->palette[colormap[i]] & 0x00ffffff) + | ((alpha[i] * 17) << 24); + return; + } for(i = 0; i < 4; i++) rgba_palette[i] = 0; diff --cc libavcodec/lagarith.c index ce8af649ab,201f77dda3..eea5c81a8a --- a/libavcodec/lagarith.c +++ b/libavcodec/lagarith.c @@@ -334,8 -335,8 +335,8 @@@ output_zeros i = 0; while (!zero_run && dst + i < end) { i++; - if (i+2 >= srcend - src) - return src - start; - if (src + i >= src_end) ++ if (i+2 >= src_end - src) + return AVERROR_INVALIDDATA; zero_run = !(src[i] | (src[i + 1] & mask1) | (src[i + 2] & mask2)); } @@@ -351,9 -352,10 +352,10 @@@ } else { memcpy(dst, src, i); src += i; + dst += i; } } - return src - start; - return src_start - src; ++ return src - src_start; } @@@ -366,10 -368,10 +368,10 @@@ static int lag_decode_arith_plane(Lagar int read = 0; uint32_t length; uint32_t offset = 1; - int esc_count = src[0]; + int esc_count; GetBitContext gb; lag_rac rac; - const uint8_t *srcend = src + src_size; + const uint8_t *src_end = src + src_size; rac.avctx = l->avctx; l->zeros = 0; @@@ -518,10 -518,15 +524,14 @@@ static int lag_decode_frame(AVCodecCont } for (i = 0; i < planes; i++) srcs[i] = l->rgb_planes + (i + 1) * l->rgb_stride * avctx->height - l->rgb_stride; - for (i = 0; i < planes; i++) { - if (offset_ry >= buf_size || - offset_gu >= buf_size || - offset_bv >= buf_size || - (planes == 4 && offs[3] >= buf_size)) { - av_log(avctx, AV_LOG_ERROR, - "Invalid frame offsets\n"); - return AVERROR_INVALIDDATA; - } ++ for (i = 0; i < planes; i++) + if (buf_size <= offs[i]) { ++ av_log(avctx, AV_LOG_ERROR, ++ "Invalid frame offsets\n"); + return AVERROR_INVALIDDATA; + } ++ + for (i = 0; i < planes; i++) lag_decode_arith_plane(l, srcs[i], avctx->width, avctx->height, -l->rgb_stride, buf + offs[i], @@@ -559,10 -563,15 +568,18 @@@ av_log(avctx, AV_LOG_ERROR, "get_buffer() failed\n"); return -1; } + if (buf_size <= offset_ry || buf_size <= offset_gu || buf_size <= offset_bv) { + return AVERROR_INVALIDDATA; + } + if (offset_ry >= buf_size || + offset_gu >= buf_size || + offset_bv >= buf_size) { + av_log(avctx, AV_LOG_ERROR, + "Invalid frame offsets\n"); + return AVERROR_INVALIDDATA; + } + lag_decode_arith_plane(l, p->data[0], avctx->width, avctx->height, p->linesize[0], buf + offset_ry, buf_size - offset_ry); diff --cc libavcodec/lagarithrac.c index b3ad94189a,edfb18fb74..9f7bc41ef5 --- a/libavcodec/lagarithrac.c +++ b/libavcodec/lagarithrac.c @@@ -38,9 -38,11 +38,11 @@@ void ff_lag_rac_init(lag_rac *l, GetBit * however, it gets skipped by the call to align_get_bits() */ align_get_bits(gb); + left = get_bits_left(gb) >> 3; l->bytestream_start = l->bytestream = gb->buffer + get_bits_count(gb) / 8; - l->bytestream_end = l->bytestream_start + get_bits_left(gb) / 8; - l->bytestream_end = l->bytestream_start + FFMIN(length, left); ++ l->bytestream_end = l->bytestream_start + left; + l->range = 0x80; l->low = *l->bytestream >> 1; l->hash_shift = FFMAX(l->scale - 8, 0); diff --cc libavcodec/libxvidff.c index 3bca9456f1,0193bc8751..3ec75fe134 --- a/libavcodec/libxvidff.c +++ b/libavcodec/libxvidff.c @@@ -94,14 -131,14 +94,14 @@@ static av_cold int xvid_encode_init(AVC uint16_t *intra, *inter; int fd; - xvid_plugin_single_t single; - struct xvid_ff_pass1 rc2pass1; - xvid_plugin_2pass2_t rc2pass2; - xvid_gbl_init_t xvid_gbl_init; - xvid_enc_create_t xvid_enc_create; + xvid_plugin_single_t single = { 0 }; + struct xvid_ff_pass1 rc2pass1 = { 0 }; + xvid_plugin_2pass2_t rc2pass2 = { 0 }; + xvid_gbl_init_t xvid_gbl_init = { 0 }; + xvid_enc_create_t xvid_enc_create = { 0 }; xvid_enc_plugin_t plugins[7]; - /* Bring in VOP flags from avconv command-line */ + /* Bring in VOP flags from ffmpeg command-line */ x->vop_flags = XVID_VOP_HALFPEL; /* Bare minimum quality */ if( xvid_flags & CODEC_FLAG_4MV ) x->vop_flags |= XVID_VOP_INTER4V; /* Level 3 */ @@@ -382,16 -414,17 +377,14 @@@ static int xvid_encode_frame(AVCodecCon int mb_width = (avctx->width + 15) / 16; int mb_height = (avctx->height + 15) / 16; - xvid_enc_frame_t xvid_enc_frame; - xvid_enc_stats_t xvid_enc_stats; + xvid_enc_frame_t xvid_enc_frame = { 0 }; + xvid_enc_stats_t xvid_enc_stats = { 0 }; - if (!user_packet && - (ret = av_new_packet(pkt, mb_width*mb_height*MAX_MB_BYTES + FF_MIN_BUFFER_SIZE)) < 0) { - av_log(avctx, AV_LOG_ERROR, "Error getting output packet.\n"); + if ((ret = ff_alloc_packet2(avctx, pkt, mb_width*mb_height*MAX_MB_BYTES + FF_MIN_BUFFER_SIZE)) < 0) return ret; - } /* Start setting up the frame */ - memset(&xvid_enc_frame, 0, sizeof(xvid_enc_frame)); xvid_enc_frame.version = XVID_VERSION; - memset(&xvid_enc_stats, 0, sizeof(xvid_enc_stats)); xvid_enc_stats.version = XVID_VERSION; *p = *picture; diff --cc libavcodec/x86/cabac.h index 2bb0be6374,a6ec22831d..0c4419b4f3 --- a/libavcodec/x86/cabac.h +++ b/libavcodec/x86/cabac.h @@@ -64,9 -64,12 +64,9 @@@ "shl %%cl , "low" \n\t"\ "mov "tmpbyte" , "statep" \n\t"\ "test "lowword" , "lowword" \n\t"\ - " jnz 1f \n\t"\ + " jnz 2f \n\t"\ "mov "byte" , %%"REG_c" \n\t"\ - "cmp "end" , %%"REG_c" \n\t"\ - "jge 1f \n\t"\ "add"OPSIZE" $2 , "byte" \n\t"\ - "1: \n\t"\ "movzwl (%%"REG_c") , "tmp" \n\t"\ "lea -1("low") , %%ecx \n\t"\ "xor "low" , %%ecx \n\t"\ @@@ -79,11 -82,9 +79,11 @@@ "add $7 , %%ecx \n\t"\ "shl %%cl , "tmp" \n\t"\ "add "tmp" , "low" \n\t"\ - "1: \n\t" + "2: \n\t" -#if HAVE_7REGS && !defined(BROKEN_RELOCATIONS) + +#if HAVE_7REGS && !defined(BROKEN_RELOCATIONS) && !(defined(__i386) && defined(__clang__) && (__clang_major__<2 || (__clang_major__==2 && __clang_minor__<10)))\ + && !(defined(__i386) && !defined(__clang__) && defined(__llvm__) && __GNUC__==4 && __GNUC_MINOR__==2 && __GNUC_PATCHLEVEL__<=1) #define get_cabac_inline get_cabac_inline_x86 static av_always_inline int get_cabac_inline_x86(CABACContext *c, uint8_t *const state) @@@ -107,32 -110,37 +109,36 @@@ static av_always_inline int get_cabac_b { x86_reg tmp; __asm__ volatile( - "movl %4, %k1 \n\t" - "movl %2, %%eax \n\t" - "shl $17, %k1 \n\t" - "add %%eax, %%eax \n\t" - "sub %k1, %%eax \n\t" - "cltd \n\t" - "and %%edx, %k1 \n\t" - "add %k1, %%eax \n\t" - "xor %%edx, %%ecx \n\t" - "sub %%edx, %%ecx \n\t" - "test %%ax, %%ax \n\t" - " jnz 1f \n\t" - "mov %3, %1 \n\t" - "subl $0xFFFF, %%eax \n\t" - "movzwl (%1), %%edx \n\t" - "bswap %%edx \n\t" - "shrl $15, %%edx \n\t" - "add $2, %1 \n\t" - "addl %%edx, %%eax \n\t" - "mov %1, %3 \n\t" - "1: \n\t" - "movl %%eax, %2 \n\t" + "movl %a6(%2), %k1 \n\t" + "movl %a3(%2), %%eax \n\t" + "shl $17, %k1 \n\t" + "add %%eax, %%eax \n\t" + "sub %k1, %%eax \n\t" + "cltd \n\t" + "and %%edx, %k1 \n\t" + "add %k1, %%eax \n\t" + "xor %%edx, %%ecx \n\t" + "sub %%edx, %%ecx \n\t" + "test %%ax, %%ax \n\t" + "jnz 1f \n\t" + "mov %a4(%2), %1 \n\t" + "subl $0xFFFF, %%eax \n\t" + "movzwl (%1), %%edx \n\t" + "bswap %%edx \n\t" + "shrl $15, %%edx \n\t" ++ "add $2, %1 \n\t" + "addl %%edx, %%eax \n\t" - "cmp %a5(%2), %1 \n\t" - "jge 1f \n\t" - "add"OPSIZE" $2, %a4(%2) \n\t" ++ "mov %1, %a4(%2) \n\t" + "1: \n\t" + "movl %%eax, %a3(%2) \n\t" - :"+c"(val), "=&r"(tmp), "+m"(c->low), "+m"(c->bytestream) - :"m"(c->range) - : "%eax", "%edx" + : "+c"(val), "=&r"(tmp) + : "r"(c), + "i"(offsetof(CABACContext, low)), + "i"(offsetof(CABACContext, bytestream)), + "i"(offsetof(CABACContext, bytestream_end)), + "i"(offsetof(CABACContext, range)) + : "%eax", "%edx", "memory" ); return val; } diff --cc tests/fate/video.mak index 02aa39598c,a676cd10d1..c790fd4e7c --- a/tests/fate/video.mak +++ b/tests/fate/video.mak @@@ -124,52 -124,56 +124,55 @@@ fate-iff-fibonacci: CMD = md5 -i $(SAMP FATE_IFF += fate-iff-ilbm fate-iff-ilbm: CMD = framecrc -i $(SAMPLES)/iff/lms-matriks.ilbm -pix_fmt rgb24 -FATE_TESTS += $(FATE_IFF) +FATE_VIDEO += $(FATE_IFF) fate-iff: $(FATE_IFF) -FATE_TESTS += fate-kgv1 ++FATE_VIDEO += fate-kgv1 + fate-kgv1: CMD = framecrc -i $(SAMPLES)/kega/kgv1.avi -pix_fmt rgb555le -an + -FATE_TESTS += fate-kmvc +FATE_VIDEO += fate-kmvc fate-kmvc: CMD = framecrc -i $(SAMPLES)/KMVC/LOGO1.AVI -an -t 3 -pix_fmt rgb24 -FATE_TESTS += fate-mimic +FATE_VIDEO += fate-mimic fate-mimic: CMD = framecrc -idct simple -i $(SAMPLES)/mimic/mimic2-womanloveffmpeg.cam -FATE_TESTS += fate-mjpegb +FATE_VIDEO += fate-mjpegb fate-mjpegb: CMD = framecrc -idct simple -flags +bitexact -i $(SAMPLES)/mjpegb/mjpegb_part.mov -an -FATE_TESTS += fate-motionpixels +FATE_VIDEO += fate-motionpixels fate-motionpixels: CMD = framecrc -i $(SAMPLES)/motion-pixels/INTRO-partial.MVI -an -pix_fmt rgb24 -vframes 111 -FATE_TESTS += fate-mpeg2-field-enc +FATE_VIDEO += fate-mpeg2-field-enc fate-mpeg2-field-enc: CMD = framecrc -flags +bitexact -dct fastint -idct simple -i $(SAMPLES)/mpeg2/mpeg2_field_encoding.ts -an -# FIXME dropped frames in this test because of coarse timebase -FATE_TESTS += fate-nuv +FATE_VIDEO += fate-nuv fate-nuv: CMD = framecrc -idct simple -i $(SAMPLES)/nuv/Today.nuv -an -FATE_TESTS += fate-qpeg +FATE_VIDEO += fate-qpeg fate-qpeg: CMD = framecrc -i $(SAMPLES)/qpeg/Clock.avi -an -pix_fmt rgb24 -FATE_TESTS += fate-r210 +FATE_VIDEO += fate-r210 fate-r210: CMD = framecrc -i $(SAMPLES)/r210/r210.avi -pix_fmt rgb48le -FATE_TESTS += fate-rl2 +FATE_VIDEO += fate-rl2 fate-rl2: CMD = framecrc -i $(SAMPLES)/rl2/Z4915300.RL2 -pix_fmt rgb24 -an -FATE_TESTS += fate-smacker +FATE_VIDEO += fate-smacker fate-smacker: CMD = framecrc -i $(SAMPLES)/smacker/wetlogo.smk -pix_fmt rgb24 -FATE_TESTS += fate-smc +FATE_VIDEO += fate-smc fate-smc: CMD = framecrc -i $(SAMPLES)/smc/cass_schi.qt -pix_fmt rgb24 -FATE_TESTS += fate-sp5x +FATE_VIDEO += fate-sp5x fate-sp5x: CMD = framecrc -idct simple -i $(SAMPLES)/sp5x/sp5x_problem.avi -FATE_TESTS += fate-sub-srt +FATE_VIDEO += fate-sub-srt fate-sub-srt: CMD = md5 -i $(SAMPLES)/sub/SubRip_capability_tester.srt -f ass -FATE_TESTS += fate-tiertex-seq +FATE_VIDEO += fate-tiertex-seq fate-tiertex-seq: CMD = framecrc -i $(SAMPLES)/tiertex-seq/Gameover.seq -pix_fmt rgb24 -FATE_TESTS += fate-tmv +FATE_VIDEO += fate-tmv fate-tmv: CMD = framecrc -i $(SAMPLES)/tmv/pop-partial.tmv -pix_fmt rgb24 FATE_TXD += fate-txd-16bpp diff --cc tests/ref/fate/vp8-size-change index 0000000000,d87c563b7d..85e27411bc mode 000000,100644..100644 --- a/tests/ref/fate/vp8-size-change +++ b/tests/ref/fate/vp8-size-change @@@ -1,0 -1,31 +1,31 @@@ -#tb 0: 1/1000 -0, 0, 0, 0, 3110400, 649f0f2e3e09e6938161bb07bede5282 -0, 33, 33, 0, 3110400, f24f632d50eafef73fa89391ca98c375 -0, 67, 67, 0, 3110400, 57b6d2ed51bfaf6588f39eb73e7922b8 -0, 100, 100, 0, 3110400, 463e0988ce28eb1c30669c06113deb4c -0, 133, 133, 0, 3110400, 3c4ac119f998a0ccd7d3a6361f4d10a0 -0, 167, 167, 0, 3110400, 0f11c5cc9c1ac9055e21e417e1259c69 -0, 200, 200, 0, 3110400, 08c6e70f101c61013f2969b6a370d3f9 -0, 233, 233, 0, 3110400, ea8cb37017d8a9d20bf443b730fd8365 -0, 267, 267, 0, 3110400, 3f614203f054c89151680f4b1b0c6c4c -0, 300, 300, 0, 3110400, 90488ee40d06c0f05eee8348dde57325 -0, 333, 333, 0, 3110400, f48117b74ac7455e69fd14e9b68ce95d -0, 367, 367, 0, 3110400, 37ee06b6267b5ec25fd642525cf4469a -0, 400, 400, 0, 3110400, cd5e0988e7c084f29bda4a18cb38c1e8 -0, 433, 433, 0, 3110400, 1fe943b01f00b8bc0cb5722010cef03c -0, 467, 467, 0, 3110400, 40d8e8150326c7eb061d3f6cfd307d97 -0, 500, 500, 0, 3110400, 49812cbf928858cb56331c8c8aaaf556 -0, 533, 533, 0, 3110400, 3df607c752273ebcac21123e2c4c010c -0, 567, 567, 0, 3110400, 020a0ae162c8326f83f8f4d8bf1627d2 -0, 600, 600, 0, 3110400, 459ac9f9488a6a2f4e378703a6b2a45a -0, 633, 633, 0, 3110400, b1baf9a56f7667e4b8f4e3007b9ebe0f -0, 667, 667, 0, 3110400, eea61a72a05c380450a96b575ba25f65 -0, 700, 700, 0, 3110400, e013a9f233824631d8c6e3f93106eebe -0, 733, 733, 0, 3110400, 6c64147ebdee4b36728c6978b290ffb5 -0, 767, 767, 0, 3110400, c37956235667345d92fdfc7c62496e84 -0, 800, 800, 0, 3110400, 0ac58c28575b804d9e63395653c3aef2 -0, 833, 833, 0, 3110400, 641f2a78e338c733ef159bd36ec7966f -0, 867, 867, 0, 3110400, 9402d455fa5bd556b85f479c42c3a4d2 -0, 900, 900, 0, 3110400, ca86e16b05db0c79b028d709c19e1f13 -0, 933, 933, 0, 3110400, 9167d622809df07eef9bcb3cb09de0f0 -0, 967, 967, 0, 3110400, e1d52ae2a2eb6aabb9bdc7e7ed05253e ++#tb 0: 1/30 ++0, 0, 0, 1, 3110400, f9b685c9aaa7652faeded50ed1005414 ++0, 1, 1, 1, 3110400, d22c3d6a1e57ba4af2bd19e09ad7bdb1 ++0, 2, 2, 1, 3110400, 0d516dc90992321576a1f090b382beab ++0, 3, 3, 1, 3110400, a306b1c732dbaea18ad1efd9d3820094 ++0, 4, 4, 1, 3110400, faddd965d3e70e62cad07dc72225e8c2 ++0, 5, 5, 1, 3110400, 375795188ae0ce026179aea29cb8a1b4 ++0, 6, 6, 1, 3110400, aa372227e1630513116ff6678a2c4fcf ++0, 7, 7, 1, 3110400, e4937f5756a3bbbe2660c0874514479b ++0, 8, 8, 1, 3110400, ad7d1f6a28ac9f6490f1ee7595ef6b94 ++0, 9, 9, 1, 3110400, 305414d3ca8aca36242e08041b92ad69 ++0, 10, 10, 1, 3110400, b719401bd210e4fc02be258ca866e50e ++0, 11, 11, 1, 3110400, a25f312e44492715f334ab97f50e73ad ++0, 12, 12, 1, 3110400, 1da8d6815b3ce412690e86f18444c621 ++0, 13, 13, 1, 3110400, 0522ee62ed61c900b71f3fff2030026b ++0, 14, 14, 1, 3110400, 523d2a4f5571a952f68d5768eb3336dc ++0, 15, 15, 1, 3110400, 03a9b1f05d48c25d689f74db4d2cdbe1 ++0, 16, 16, 1, 3110400, 6ae91271da4f5c6e604df8e04a40ea45 ++0, 17, 17, 1, 3110400, 5b3e7bac9f61c4248999a2587a630d28 ++0, 18, 18, 1, 3110400, 60069876ccffeee06a535e471b8916e8 ++0, 19, 19, 1, 3110400, 9f5101c81bc7702d98baee78c4ffe65d ++0, 20, 20, 1, 3110400, c02641360b4d8af4640aa330d9eb8bb0 ++0, 21, 21, 1, 3110400, 63274292e7d3f2482c3c282722ae3f02 ++0, 22, 22, 1, 3110400, ae39b5a18260046e96b4b44520ef0f7d ++0, 23, 23, 1, 3110400, bb89af6f8f2b13d0cd668d445669f655 ++0, 24, 24, 1, 3110400, 0ac58c28575b804d9e63395653c3aef2 ++0, 25, 25, 1, 3110400, 641f2a78e338c733ef159bd36ec7966f ++0, 26, 26, 1, 3110400, 9402d455fa5bd556b85f479c42c3a4d2 ++0, 27, 27, 1, 3110400, fa2407483a8e169a161e45ac6cfa7831 ++0, 28, 28, 1, 3110400, 087744a0ac52ef96803fc9c4fb17635b ++0, 29, 29, 1, 3110400, b62328f2bd00b269cd3a359360b613b7