19cd9a79f57e79d81840b5e83050d434445f81c50wangkun/*
2f91c8768670386683a281cc39141e21bdda9c97fKun Wang * Copyright (c) 2011 Intel Corporation. All Rights Reserved.
33f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang * Copyright (c) Imagination Technologies Limited, UK
49cd9a79f57e79d81840b5e83050d434445f81c50wangkun *
5f91c8768670386683a281cc39141e21bdda9c97fKun Wang * Permission is hereby granted, free of charge, to any person obtaining a
6f91c8768670386683a281cc39141e21bdda9c97fKun Wang * copy of this software and associated documentation files (the
7f91c8768670386683a281cc39141e21bdda9c97fKun Wang * "Software"), to deal in the Software without restriction, including
8f91c8768670386683a281cc39141e21bdda9c97fKun Wang * without limitation the rights to use, copy, modify, merge, publish,
9f91c8768670386683a281cc39141e21bdda9c97fKun Wang * distribute, sub license, and/or sell copies of the Software, and to
10f91c8768670386683a281cc39141e21bdda9c97fKun Wang * permit persons to whom the Software is furnished to do so, subject to
11f91c8768670386683a281cc39141e21bdda9c97fKun Wang * the following conditions:
123f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang *
13f91c8768670386683a281cc39141e21bdda9c97fKun Wang * The above copyright notice and this permission notice (including the
14f91c8768670386683a281cc39141e21bdda9c97fKun Wang * next paragraph) shall be included in all copies or substantial portions
15f91c8768670386683a281cc39141e21bdda9c97fKun Wang * of the Software.
163f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang *
17f91c8768670386683a281cc39141e21bdda9c97fKun Wang * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
18f91c8768670386683a281cc39141e21bdda9c97fKun Wang * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
19f91c8768670386683a281cc39141e21bdda9c97fKun Wang * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
20f91c8768670386683a281cc39141e21bdda9c97fKun Wang * IN NO EVENT SHALL PRECISION INSIGHT AND/OR ITS SUPPLIERS BE LIABLE FOR
21f91c8768670386683a281cc39141e21bdda9c97fKun Wang * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
22f91c8768670386683a281cc39141e21bdda9c97fKun Wang * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
23f91c8768670386683a281cc39141e21bdda9c97fKun Wang * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
249cd9a79f57e79d81840b5e83050d434445f81c50wangkun */
259cd9a79f57e79d81840b5e83050d434445f81c50wangkun
26bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang
27bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang
28f91c8768670386683a281cc39141e21bdda9c97fKun Wang
29bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang/*
30bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang * Authors:
31bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang *    Shengquan Yuan  <shengquan.yuan@intel.com>
32bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang *    Fei Jiang  <fei.jiang@intel.com>
33bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang *
34bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang */
35bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang
369cd9a79f57e79d81840b5e83050d434445f81c50wangkun#include <stdio.h>
379cd9a79f57e79d81840b5e83050d434445f81c50wangkun#define TOPAZ_FW_FILE_NAME_ANDROID "/etc/firmware/topaz_fw.bin"
389cd9a79f57e79d81840b5e83050d434445f81c50wangkun#define MSVDX_FW_FILE_NAME_ANDROID "/etc/firmware/msvdx_fw.bin"
399cd9a79f57e79d81840b5e83050d434445f81c50wangkun
409cd9a79f57e79d81840b5e83050d434445f81c50wangkun#define TOPAZ_FW_FILE_NAME_MEEGO "/lib/firmware/topaz_fw.bin"
419cd9a79f57e79d81840b5e83050d434445f81c50wangkun#define MSVDX_FW_FILE_NAME_MEEGO "/lib/firmware/msvdx_fw.bin"
429cd9a79f57e79d81840b5e83050d434445f81c50wangkun
439cd9a79f57e79d81840b5e83050d434445f81c50wangkunstruct topaz_fw_info_item_s {
449cd9a79f57e79d81840b5e83050d434445f81c50wangkun    unsigned short ver;
459cd9a79f57e79d81840b5e83050d434445f81c50wangkun    unsigned short codec;
469cd9a79f57e79d81840b5e83050d434445f81c50wangkun
479cd9a79f57e79d81840b5e83050d434445f81c50wangkun    unsigned int  text_size;
489cd9a79f57e79d81840b5e83050d434445f81c50wangkun    unsigned int data_size;
499cd9a79f57e79d81840b5e83050d434445f81c50wangkun    unsigned int data_location;
509cd9a79f57e79d81840b5e83050d434445f81c50wangkun};
519cd9a79f57e79d81840b5e83050d434445f81c50wangkuntypedef struct topaz_fw_info_item_s topaz_fw_info_item_t;
529cd9a79f57e79d81840b5e83050d434445f81c50wangkun
539cd9a79f57e79d81840b5e83050d434445f81c50wangkunenum topaz_fw_codec_e {
549cd9a79f57e79d81840b5e83050d434445f81c50wangkun    FW_JPEG = 0,
559cd9a79f57e79d81840b5e83050d434445f81c50wangkun    FW_H264_NO_RC,
569cd9a79f57e79d81840b5e83050d434445f81c50wangkun    FW_H264_VBR,
579cd9a79f57e79d81840b5e83050d434445f81c50wangkun    FW_H264_CBR,
589cd9a79f57e79d81840b5e83050d434445f81c50wangkun    FW_H264_VCM,
599cd9a79f57e79d81840b5e83050d434445f81c50wangkun    FW_H263_NO_RC,
609cd9a79f57e79d81840b5e83050d434445f81c50wangkun    FW_H263_VBR,
619cd9a79f57e79d81840b5e83050d434445f81c50wangkun    FW_H263_CBR,
629cd9a79f57e79d81840b5e83050d434445f81c50wangkun    FW_MPEG4_NO_RC,
639cd9a79f57e79d81840b5e83050d434445f81c50wangkun    FW_MPEG4_VBR,
649cd9a79f57e79d81840b5e83050d434445f81c50wangkun    FW_MPEG4_CBR,
659cd9a79f57e79d81840b5e83050d434445f81c50wangkun    FW_NUM
669cd9a79f57e79d81840b5e83050d434445f81c50wangkun};
679cd9a79f57e79d81840b5e83050d434445f81c50wangkuntypedef enum topaz_fw_codec_e topaz_fw_codec_t;
689cd9a79f57e79d81840b5e83050d434445f81c50wangkun
699cd9a79f57e79d81840b5e83050d434445f81c50wangkunstruct fw_table_s {
709cd9a79f57e79d81840b5e83050d434445f81c50wangkun    topaz_fw_codec_t index;
719cd9a79f57e79d81840b5e83050d434445f81c50wangkun    topaz_fw_info_item_t header;
72e6da98f5ac1372fe4af4eef50115654b3ce6ef6fhding    //  unsigned int *fw_text;
73e6da98f5ac1372fe4af4eef50115654b3ce6ef6fhding    //  unsigned int *fw_data;
749cd9a79f57e79d81840b5e83050d434445f81c50wangkun};
759cd9a79f57e79d81840b5e83050d434445f81c50wangkuntypedef struct fw_table_s fw_table_t;
769cd9a79f57e79d81840b5e83050d434445f81c50wangkun
779cd9a79f57e79d81840b5e83050d434445f81c50wangkun
789cd9a79f57e79d81840b5e83050d434445f81c50wangkunstruct msvdx_fw {
799cd9a79f57e79d81840b5e83050d434445f81c50wangkun    unsigned int ver;
809cd9a79f57e79d81840b5e83050d434445f81c50wangkun    unsigned int  text_size;
819cd9a79f57e79d81840b5e83050d434445f81c50wangkun    unsigned int data_size;
829cd9a79f57e79d81840b5e83050d434445f81c50wangkun    unsigned int data_location;
839cd9a79f57e79d81840b5e83050d434445f81c50wangkun};
849cd9a79f57e79d81840b5e83050d434445f81c50wangkun
859cd9a79f57e79d81840b5e83050d434445f81c50wangkun
869cd9a79f57e79d81840b5e83050d434445f81c50wangkunstatic char *codec_to_string(int codec)
879cd9a79f57e79d81840b5e83050d434445f81c50wangkun{
889cd9a79f57e79d81840b5e83050d434445f81c50wangkun    switch (codec) {
899cd9a79f57e79d81840b5e83050d434445f81c50wangkun    case FW_H264_NO_RC:
909cd9a79f57e79d81840b5e83050d434445f81c50wangkun        return "H264_NO_RC";
919cd9a79f57e79d81840b5e83050d434445f81c50wangkun    case FW_H264_VBR:
929cd9a79f57e79d81840b5e83050d434445f81c50wangkun        return "H264_VBR";
939cd9a79f57e79d81840b5e83050d434445f81c50wangkun    case FW_H264_CBR:
949cd9a79f57e79d81840b5e83050d434445f81c50wangkun        return "H264_CBR";
959cd9a79f57e79d81840b5e83050d434445f81c50wangkun    case FW_H264_VCM:
969cd9a79f57e79d81840b5e83050d434445f81c50wangkun        return "H264_VCM";
979cd9a79f57e79d81840b5e83050d434445f81c50wangkun    case FW_H263_NO_RC:
989cd9a79f57e79d81840b5e83050d434445f81c50wangkun        return "H263_NO_RC";
999cd9a79f57e79d81840b5e83050d434445f81c50wangkun    case FW_H263_VBR:
1009cd9a79f57e79d81840b5e83050d434445f81c50wangkun        return "H263_VBR";
1019cd9a79f57e79d81840b5e83050d434445f81c50wangkun    case FW_H263_CBR:
1029cd9a79f57e79d81840b5e83050d434445f81c50wangkun        return "H263_CBR";
1039cd9a79f57e79d81840b5e83050d434445f81c50wangkun    case FW_MPEG4_NO_RC:
1049cd9a79f57e79d81840b5e83050d434445f81c50wangkun        return "MPEG4_NO_RC";
1059cd9a79f57e79d81840b5e83050d434445f81c50wangkun    case FW_MPEG4_VBR:
1069cd9a79f57e79d81840b5e83050d434445f81c50wangkun        return "MPEG4_VBR";
1079cd9a79f57e79d81840b5e83050d434445f81c50wangkun    case FW_MPEG4_CBR:
1089cd9a79f57e79d81840b5e83050d434445f81c50wangkun        return "MPEG4_CBR";
1099cd9a79f57e79d81840b5e83050d434445f81c50wangkun    default:
1109cd9a79f57e79d81840b5e83050d434445f81c50wangkun        return "Undefined codec";
1119cd9a79f57e79d81840b5e83050d434445f81c50wangkun    }
1129cd9a79f57e79d81840b5e83050d434445f81c50wangkun    return "";
1139cd9a79f57e79d81840b5e83050d434445f81c50wangkun}
1149cd9a79f57e79d81840b5e83050d434445f81c50wangkun
1159cd9a79f57e79d81840b5e83050d434445f81c50wangkunint main()
1169cd9a79f57e79d81840b5e83050d434445f81c50wangkun{
1179cd9a79f57e79d81840b5e83050d434445f81c50wangkun    FILE *fp = NULL;
1189cd9a79f57e79d81840b5e83050d434445f81c50wangkun    topaz_fw_codec_t iter = FW_H264_NO_RC;
1199cd9a79f57e79d81840b5e83050d434445f81c50wangkun    //  unsigned int read_data;
1209cd9a79f57e79d81840b5e83050d434445f81c50wangkun    unsigned int i, lseek;
1219cd9a79f57e79d81840b5e83050d434445f81c50wangkun    unsigned char system_id = 0;
1229cd9a79f57e79d81840b5e83050d434445f81c50wangkun    fw_table_t topaz_fw_table[FW_NUM + 1];
1239cd9a79f57e79d81840b5e83050d434445f81c50wangkun    struct msvdx_fw fw;
1249cd9a79f57e79d81840b5e83050d434445f81c50wangkun
1259cd9a79f57e79d81840b5e83050d434445f81c50wangkun
1269cd9a79f57e79d81840b5e83050d434445f81c50wangkun    /* open file
1279cd9a79f57e79d81840b5e83050d434445f81c50wangkun     * RRRdetermine Android or Meego
1289cd9a79f57e79d81840b5e83050d434445f81c50wangkun     * system_id = 0  Android
1299cd9a79f57e79d81840b5e83050d434445f81c50wangkun     * system_id = 1  Meego
1309cd9a79f57e79d81840b5e83050d434445f81c50wangkun     */
1319cd9a79f57e79d81840b5e83050d434445f81c50wangkun    fp = fopen(TOPAZ_FW_FILE_NAME_ANDROID, "r");
1329cd9a79f57e79d81840b5e83050d434445f81c50wangkun
1339cd9a79f57e79d81840b5e83050d434445f81c50wangkun    if (NULL == fp) {
1349cd9a79f57e79d81840b5e83050d434445f81c50wangkun        fp = fopen(TOPAZ_FW_FILE_NAME_MEEGO, "r");
1359cd9a79f57e79d81840b5e83050d434445f81c50wangkun        if (NULL == fp) {
1369cd9a79f57e79d81840b5e83050d434445f81c50wangkun            printf("\nSystem isn't Android or Meego\n\n");
1379cd9a79f57e79d81840b5e83050d434445f81c50wangkun            printf("\nCan't open topaz_fw.bin\n");
1389cd9a79f57e79d81840b5e83050d434445f81c50wangkun            return -1;
1399cd9a79f57e79d81840b5e83050d434445f81c50wangkun        }
1409cd9a79f57e79d81840b5e83050d434445f81c50wangkun        system_id = 1;
1419cd9a79f57e79d81840b5e83050d434445f81c50wangkun        printf("\nSystem is Meego\n\n");
1429cd9a79f57e79d81840b5e83050d434445f81c50wangkun    } else {
1439cd9a79f57e79d81840b5e83050d434445f81c50wangkun        printf("\nSystem is Android\n\n");
1449cd9a79f57e79d81840b5e83050d434445f81c50wangkun    }
1459cd9a79f57e79d81840b5e83050d434445f81c50wangkun
1469cd9a79f57e79d81840b5e83050d434445f81c50wangkun    //  fseek (fp, 0, SEEK_SET);
1479cd9a79f57e79d81840b5e83050d434445f81c50wangkun
1489cd9a79f57e79d81840b5e83050d434445f81c50wangkun    printf("topza:Try to read and print topaz_fw_table...\n\n\n\n");
1499cd9a79f57e79d81840b5e83050d434445f81c50wangkun
1509cd9a79f57e79d81840b5e83050d434445f81c50wangkun    /* read fw table into the topz_fw_table */
1519cd9a79f57e79d81840b5e83050d434445f81c50wangkun    while (iter < FW_NUM) {
1529cd9a79f57e79d81840b5e83050d434445f81c50wangkun
1539cd9a79f57e79d81840b5e83050d434445f81c50wangkun        /* read header */
1549cd9a79f57e79d81840b5e83050d434445f81c50wangkun        fread(&(topaz_fw_table[iter].header), sizeof(topaz_fw_table[iter].header), 1, fp);
1559cd9a79f57e79d81840b5e83050d434445f81c50wangkun
1569cd9a79f57e79d81840b5e83050d434445f81c50wangkun        /* print header */
1579cd9a79f57e79d81840b5e83050d434445f81c50wangkun        printf("topaz: index          : %s\n", codec_to_string(topaz_fw_table[iter].header.codec));
1589cd9a79f57e79d81840b5e83050d434445f81c50wangkun        printf("topaz: ver            : 0x%04x\n", topaz_fw_table[iter].header.ver);
1599cd9a79f57e79d81840b5e83050d434445f81c50wangkun        printf("topaz: Codec          : %s\n", codec_to_string(topaz_fw_table[iter].header.codec));
1609cd9a79f57e79d81840b5e83050d434445f81c50wangkun        printf("topaz: text_size      : %d\n", (topaz_fw_table[iter].header.text_size >> 2));
1619cd9a79f57e79d81840b5e83050d434445f81c50wangkun        printf("topaz: data_size      : %d\n", (topaz_fw_table[iter].header.data_size >> 2));
1629cd9a79f57e79d81840b5e83050d434445f81c50wangkun        printf("topaz: data_location  : 0x%08x\n\n", topaz_fw_table[iter].header.data_location);
1639cd9a79f57e79d81840b5e83050d434445f81c50wangkun
1649cd9a79f57e79d81840b5e83050d434445f81c50wangkun        fseek(fp, topaz_fw_table[iter].header.text_size + topaz_fw_table[iter].header.data_size, SEEK_CUR);
1659cd9a79f57e79d81840b5e83050d434445f81c50wangkun#if 0
1669cd9a79f57e79d81840b5e83050d434445f81c50wangkun        /* read and print fw_text */
1679cd9a79f57e79d81840b5e83050d434445f81c50wangkun        printf("fw_text = {\n");
1689cd9a79f57e79d81840b5e83050d434445f81c50wangkun        for (i = 0; i < (topaz_fw_table[iter].header.text_size >> 2); i++) {
1699cd9a79f57e79d81840b5e83050d434445f81c50wangkun            fread(&read_data, 1, 4, fp);
1709cd9a79f57e79d81840b5e83050d434445f81c50wangkun            printf("            0x%08x\n", read_data);
1719cd9a79f57e79d81840b5e83050d434445f81c50wangkun        }
1729cd9a79f57e79d81840b5e83050d434445f81c50wangkun        printf("          }\n\n\n\n");
1739cd9a79f57e79d81840b5e83050d434445f81c50wangkun
1749cd9a79f57e79d81840b5e83050d434445f81c50wangkun        /* read and print fw_data */
1759cd9a79f57e79d81840b5e83050d434445f81c50wangkun        printf("fw_data = {\n");
1769cd9a79f57e79d81840b5e83050d434445f81c50wangkun        for (i = 0; i < (topaz_fw_table[iter].header.data_size >> 2); i++) {
1779cd9a79f57e79d81840b5e83050d434445f81c50wangkun            fread(&read_data, 1, 4, fp);
1789cd9a79f57e79d81840b5e83050d434445f81c50wangkun            printf("            0x%08x\n", read_data);
1799cd9a79f57e79d81840b5e83050d434445f81c50wangkun        }
1809cd9a79f57e79d81840b5e83050d434445f81c50wangkun        printf("          }\n\n\n\n");
1819cd9a79f57e79d81840b5e83050d434445f81c50wangkun#endif
1829cd9a79f57e79d81840b5e83050d434445f81c50wangkun
1839cd9a79f57e79d81840b5e83050d434445f81c50wangkun        ++iter;
1849cd9a79f57e79d81840b5e83050d434445f81c50wangkun    }
1859cd9a79f57e79d81840b5e83050d434445f81c50wangkun
1869cd9a79f57e79d81840b5e83050d434445f81c50wangkun    /* close topaz_fw.bin file */
1879cd9a79f57e79d81840b5e83050d434445f81c50wangkun    fclose(fp);
1889cd9a79f57e79d81840b5e83050d434445f81c50wangkun
1899cd9a79f57e79d81840b5e83050d434445f81c50wangkun    printf("\n\n\n\nmsvdx:Try to read and print msvdx_fw...\n\n\n\n");
1909cd9a79f57e79d81840b5e83050d434445f81c50wangkun
1919cd9a79f57e79d81840b5e83050d434445f81c50wangkun    /* open msvdx_fw.bin */
1929cd9a79f57e79d81840b5e83050d434445f81c50wangkun    if (system_id == 0) {
1939cd9a79f57e79d81840b5e83050d434445f81c50wangkun        fp = fopen(MSVDX_FW_FILE_NAME_ANDROID, "r");
1949cd9a79f57e79d81840b5e83050d434445f81c50wangkun    } else {
1959cd9a79f57e79d81840b5e83050d434445f81c50wangkun        fp = fopen(MSVDX_FW_FILE_NAME_MEEGO, "r");
1969cd9a79f57e79d81840b5e83050d434445f81c50wangkun    }
1979cd9a79f57e79d81840b5e83050d434445f81c50wangkun    if (NULL == fp) {
1989cd9a79f57e79d81840b5e83050d434445f81c50wangkun        printf("Can't open msvdx_fw.bin\n");
1999cd9a79f57e79d81840b5e83050d434445f81c50wangkun        return -1;
2009cd9a79f57e79d81840b5e83050d434445f81c50wangkun    }
2019cd9a79f57e79d81840b5e83050d434445f81c50wangkun
2029cd9a79f57e79d81840b5e83050d434445f81c50wangkun    //  fseek (fp, 0, SEEK_SET);
2039cd9a79f57e79d81840b5e83050d434445f81c50wangkun
2049cd9a79f57e79d81840b5e83050d434445f81c50wangkun    /*read and print fw*/
2059cd9a79f57e79d81840b5e83050d434445f81c50wangkun    fread(&fw, sizeof(fw), 1, fp);
2069cd9a79f57e79d81840b5e83050d434445f81c50wangkun
2079cd9a79f57e79d81840b5e83050d434445f81c50wangkun    printf("msvdx slice switch firmware: ver            : 0x%04x\n", fw.ver);
2089cd9a79f57e79d81840b5e83050d434445f81c50wangkun    printf("msvdx slice switch firmware: text_size      : %d\n", fw.text_size);
2099cd9a79f57e79d81840b5e83050d434445f81c50wangkun    printf("msvdx slice switch firmware: data_size      : %d\n", fw.data_size);
2109cd9a79f57e79d81840b5e83050d434445f81c50wangkun    printf("msvdx slice switch firmware: data_location  : 0x%08x\n\n", fw.data_location);
2119cd9a79f57e79d81840b5e83050d434445f81c50wangkun
2129cd9a79f57e79d81840b5e83050d434445f81c50wangkun    lseek = ((sizeof(fw) + (fw.text_size + fw.data_size) * 4 + 0xfff) & ~0xfff);
2139cd9a79f57e79d81840b5e83050d434445f81c50wangkun    fseek(fp, lseek, SEEK_SET);
2149cd9a79f57e79d81840b5e83050d434445f81c50wangkun
2159cd9a79f57e79d81840b5e83050d434445f81c50wangkun    /*read and print fw*/
2169cd9a79f57e79d81840b5e83050d434445f81c50wangkun    fread(&fw, sizeof(fw), 1, fp);
2179cd9a79f57e79d81840b5e83050d434445f81c50wangkun
2189cd9a79f57e79d81840b5e83050d434445f81c50wangkun    printf("msvdx frame switch firmware: ver            : 0x%04x\n", fw.ver);
2199cd9a79f57e79d81840b5e83050d434445f81c50wangkun    printf("msvdx frame switch firmware: text_size      : %d\n", fw.text_size);
2209cd9a79f57e79d81840b5e83050d434445f81c50wangkun    printf("msvdx frame switch firmware: data_size      : %d\n", fw.data_size);
2219cd9a79f57e79d81840b5e83050d434445f81c50wangkun    printf("msvdx frame switch firmware: data_location  : 0x%08x\n\n", fw.data_location);
2229cd9a79f57e79d81840b5e83050d434445f81c50wangkun
2239cd9a79f57e79d81840b5e83050d434445f81c50wangkun    /* close msvdx_fw.bin file */
2249cd9a79f57e79d81840b5e83050d434445f81c50wangkun    fclose(fp);
2259cd9a79f57e79d81840b5e83050d434445f81c50wangkun
2269cd9a79f57e79d81840b5e83050d434445f81c50wangkun    return 0;
2279cd9a79f57e79d81840b5e83050d434445f81c50wangkun}
2289cd9a79f57e79d81840b5e83050d434445f81c50wangkun
2299cd9a79f57e79d81840b5e83050d434445f81c50wangkun
2309cd9a79f57e79d81840b5e83050d434445f81c50wangkun
231