static int rle_unpack(const unsigned char *src, unsigned char *dest,

    int src_len, int dest_len)

{

    const unsigned char *ps;

    unsigned char *pd;

    int i, l;

    unsigned char *dest_end = dest + dest_len;



    ps = src;

    pd = dest;

    if (src_len & 1)

        *pd++ = *ps++;



    src_len >>= 1;

    i = 0;

    do {

        l = *ps++;

        if (l & 0x80) {

            l = (l & 0x7F) * 2;

            if (pd + l > dest_end)

                return ps - src;

            memcpy(pd, ps, l);

            ps += l;

            pd += l;

        } else {

            if (pd + i > dest_end)

                return ps - src;

            for (i = 0; i < l; i++) {

                *pd++ = ps[0];

                *pd++ = ps[1];

            }

            ps += 2;

        }

        i += l;

    } while (i < src_len);



    return ps - src;

}

static int rle_unpack(const unsigned char *src, unsigned char *dest,

    int src_len, int dest_len)

{

    const unsigned char *ps;

    unsigned char *pd;

    int i, l;

    unsigned char *dest_end = dest + dest_len;



    ps = src;

    pd = dest;

    if (src_len & 1)

        *pd++ = *ps++;



    src_len >>= 1;

    i = 0;

    do {

        l = *ps++;

        if (l & 0x80) {

            l = (l & 0x7F) * 2;

            if (pd + l > dest_end)

                return ps - src;

            memcpy(pd, ps, l);

            ps += l;

            pd += l;

        } else {

            if (pd + i > dest_end)

                return ps - src;

            for (i = 0; i < l; i++) {

                *pd++ = ps[0];

                *pd++ = ps[1];

            }

            ps += 2;

        }

        i += l;

    } while (i < src_len);



    return ps - src;

}

static int rle_unpack(const unsigned char *src, unsigned char *dest,     int src_len, int dest_len)     if (src_len & 1)     src_len >>= 1;             if (pd + l > dest_end)             if (pd + i > dest_end)     } while (i < src_len);
static int FUNC_0(const unsigned char *VAR_0, unsigned char *VAR_1,

    int VAR_2, int VAR_3)

{

    const unsigned char *VAR_4;

    unsigned char *VAR_5;

    int VAR_6, VAR_7;

    unsigned char *VAR_8 = VAR_1 + VAR_3;



    VAR_4 = VAR_0;

    VAR_5 = VAR_1;

    if (VAR_2 & 1)

        *VAR_5++ = *VAR_4++;



    VAR_2 >>= 1;

    VAR_6 = 0;

    do {

        VAR_7 = *VAR_4++;

        if (VAR_7 & 0x80) {

            VAR_7 = (VAR_7 & 0x7F) * 2;

            if (VAR_5 + VAR_7 > VAR_8)

                return VAR_4 - VAR_0;

            memcpy(VAR_5, VAR_4, VAR_7);

            VAR_4 += VAR_7;

            VAR_5 += VAR_7;

        } else {

            if (VAR_5 + VAR_6 > VAR_8)

                return VAR_4 - VAR_0;

            for (VAR_6 = 0; VAR_6 < VAR_7; VAR_6++) {

                *VAR_5++ = VAR_4[0];

                *VAR_5++ = VAR_4[1];

            }

            VAR_4 += 2;

        }

        VAR_6 += VAR_7;

    } while (VAR_6 < VAR_2);



    return VAR_4 - VAR_0;

}

static int FUNC_0(const unsigned char *VAR_0, unsigned char *VAR_1,
int VAR_2, int VAR_3)
{ const unsigned char *VAR_4; unsigned char *VAR_5; int VAR_6, VAR_7; unsigned char *VAR_8 = VAR_1 + VAR_3; VAR_4 = VAR_0; VAR_5 = VAR_1; if (VAR_2 & 1)
*VAR_5++ = *VAR_4++; VAR_2 >>= 1; VAR_6 = 0; do { VAR_7 = *VAR_4++; if (VAR_7 & 0x80) { VAR_7 = (VAR_7 & 0x7F) * 2; if (VAR_5 + VAR_7 > VAR_8)
return VAR_4 - VAR_0; memcpy(VAR_5, VAR_4, VAR_7); VAR_4 += VAR_7; VAR_5 += VAR_7; } else { if (VAR_5 + VAR_6 > VAR_8)
return VAR_4 - VAR_0; for (VAR_6 = 0; VAR_6 < VAR_7; VAR_6++) { *VAR_5++ = VAR_4[0]; *VAR_5++ = VAR_4[1]; } VAR_4 += 2; } VAR_6 += VAR_7; } while (VAR_6 < VAR_2); return VAR_4 - VAR_0; }