Skip to content

Commit

Permalink
Take libmali.so directly from rockchip repo
Browse files Browse the repository at this point in the history
This is lib/arm-linux-gnueabihf/libmali-midgard-t76x-r14p0-r0p0-x11.so
from https://github.com/rockchip-linux/libmali at revision b91d4b9.

Previously I had built that package and then extracted the libary from
libmali-midgard-t76x-r14p0-r0p0-x11-arm_1.9-1_armhf.deb. The two
binaries are not quite the same – the "compiled" one is 4096 bytes
larger. ldconfig doesn't like the "compiled" one, complaining:

    ldconfig: file /lib/arm-linux-gnueabihf/libmali.so.1 is truncated

In particular this seems to prevent GCompris – the second Flatpak app I
tried after LibreOffice – from starting.

Comparing the two with diffoscope (see below), we see that the
differences are:

- Some sections are reordered
- A .comment section is added
- 4096 bytes of 'X' have appeared

I believe from memory that the 'X's are added by Meson to leave space in
the ELF file to modify the rpath without relinking the file.

There are reports of glibc bugs that are triggered by rearranging
ELF files:

- https://sourceware.org/bugzilla/show_bug.cgi?id=23964
- https://github.com/NixOS/patchelf/issues/44

So, let's try just reusing the pristine object from Rockchip.

https://phabricator.endlessm.com/T29068

    --- tmp/usr/lib/mali/libmali.so.1.9.0
    +++ /sysroot/home/wjt/src/rockchip-linux/libmali/lib/arm-linux-gnueabihf/libmali-midgard-t76x-r14p0-r0p0-x11.so
    ├── readelf --wide --file-header {}
    │ @@ -6,15 +6,15 @@
    │    OS/ABI:                            UNIX - System V
    │    ABI Version:                       0
    │    Type:                              DYN (Shared object file)
    │    Machine:                           ARM
    │    Version:                           0x1
    │    Entry point address:               0xa0c10
    │    Start of program headers:          52 (bytes into file)
    │ -  Start of section headers:          18590608 (bytes into file)
    │ +  Start of section headers:          18560696 (bytes into file)
    │    Flags:                             0x5000402, Version5 EABI, hard-float ABI, <unknown>
    │    Size of this header:               52 (bytes)
    │    Size of program headers:           32 (bytes)
    │    Number of program headers:         8
    │    Size of section headers:           40 (bytes)
    │ -  Number of section headers:         29
    │ -  Section header string table index: 28
    │ +  Number of section headers:         30
    │ +  Section header string table index: 26
    ├── readelf --wide --program-header {}
    │ @@ -3,15 +3,15 @@
    │  Entry point 0xa0c10
    │  There are 8 program headers, starting at offset 52
    │
    │  Program Headers:
    │    Type           Offset   VirtAddr   PhysAddr   FileSiz MemSiz  Flg Align
    │    LOAD           0x000000 0x00000000 0x00000000 0x1133d64 0x1133d64 R E 0x10000
    │    GNU_STACK      0x000000 0x00000000 0x00000000 0x00000 0x00000 RW  0x10
    │ -  NOTE           0x000000 0x00000000 0x00000114 0x00000 0x00000 R   0x4
    │ +  NOTE           0x000114 0x00000114 0x00000114 0x00024 0x00024 R   0x4
    │    EXIDX          0x11313a0 0x011313a0 0x011313a0 0x029c0 0x029c0 R   0x4
    │    LOAD           0x1134000 0x01144000 0x01144000 0x7f550 0x8c574 RW  0x10000
    │    TLS            0x1134000 0x01144000 0x01144000 0x00000 0x00004 R   0x4
    │    DYNAMIC        0x11b4000 0x011d1000 0x011d1000 0x00160 0x00160 RW  0x4
    │    LOAD           0x11b4000 0x011d1000 0x011d1000 0x06a54 0x06a54 RW  0x1000
    │
    │   Section to Segment mapping:
    ├── readelf --wide --sections {}
    │ @@ -1,38 +1,39 @@
    │ -There are 29 section headers, starting at offset 0x11bab90:
    │ +There are 30 section headers, starting at offset 0x11b36b8:
    │
    │  Section Headers:
    │    [Nr] Name              Type            Addr     Off    Size   ES Flg Lk Inf Al
    │    [ 0]                   NULL            00000000 000000 000000 00      0   0  0
    │    [ 1] .hash             HASH            00000138 000138 0025c0 04   A  2   0  4
    │ -  [ 2] .dynsym           DYNSYM          000026f8 0026f8 005670 10   A 26   3  4
    │ +  [ 2] .dynsym           DYNSYM          000026f8 0026f8 005670 10   A 28   3  4
    │    [ 3] .gnu.version      VERSYM          0000e62c 00e62c 000ace 02   A  2   0  2
    │ -  [ 4] .gnu.version_d    VERDEF          0000f0fc 00f0fc 000038 00   A 26   2  4
    │ -  [ 5] .gnu.version_r    VERNEED         0000f134 00f134 0001b0 00   A 26   8  4
    │ +  [ 4] .gnu.version_d    VERDEF          0000f0fc 00f0fc 000038 00   A 28   2  4
    │ +  [ 5] .gnu.version_r    VERNEED         0000f134 00f134 0001b0 00   A 28   8  4
    │    [ 6] .rel.dyn          REL             0000f2e4 00f2e4 08fc78 08   A  2   0  4
    │ -  [ 7] .rel.plt          REL             0009ef5c 09ef5c 000b38 08  AI  2  21  4
    │ +  [ 7] .rel.plt          REL             0009ef5c 09ef5c 000b38 08   A  2   9  4
    │    [ 8] .init             PROGBITS        0009fa94 09fa94 00000c 00  AX  0   0  4
    │    [ 9] .plt              PROGBITS        0009faa0 09faa0 001170 04  AX  0   0  4
    │    [10] .text             PROGBITS        000a0c10 0a0c10 dfc268 00  AX  0   0 16
    │    [11] .fini             PROGBITS        00e9ce78 e9ce78 000008 00  AX  0   0  4
    │    [12] .rodata           PROGBITS        00e9ce80 e9ce80 28e10c 00   A  0   0  8
    │    [13] .ARM.extab        PROGBITS        0112af8c 112af8c 006414 00   A  0   0  4
    │    [14] .ARM.exidx        ARM_EXIDX       011313a0 11313a0 0029c0 00  AL 10   0  4
    │    [15] .eh_frame         PROGBITS        01133d60 1133d60 000004 00   A  0   0  4
    │    [16] .tbss             NOBITS          01144000 1134000 000004 00 WAT  0   0  4
    │ -  [17] .init_array       INIT_ARRAY      01144000 1134000 000108 04  WA  0   0  4
    │ -  [18] .fini_array       FINI_ARRAY      01144108 1134108 000008 04  WA  0   0  4
    │ +  [17] .init_array       INIT_ARRAY      01144000 1134000 000108 00  WA  0   0  4
    │ +  [18] .fini_array       FINI_ARRAY      01144108 1134108 000008 00  WA  0   0  4
    │    [19] .jcr              PROGBITS        01144110 1134110 000004 00  WA  0   0  4
    │    [20] .data.rel.ro      PROGBITS        01144118 1134118 05b248 00  WA  0   0  8
    │    [21] .got              PROGBITS        0119f4b8 118f4b8 0011d0 04  WA  0   0  4
    │    [22] .data             PROGBITS        011a0688 1190688 022ec8 00  WA  0   0  8
    │ -  [23] .bss              NOBITS          011c3550 11b3550 00d024 00  WA  0   0  8
    │ -  [24] .ARM.attributes   ARM_ATTRIBUTES  00000000 11baa54 000035 00      0   0  1
    │ -  [25] .dynamic          DYNAMIC         011d1000 11b4000 000160 08  WA 26   0  4
    │ -  [26] .dynstr           STRTAB          011d1160 11b4160 0068d0 00   A  0   0  4
    │ -  [27] .note.gnu.build-id NOTE            011d7a30 11baa30 000024 00   A  0   0  4
    │ -  [28] .shstrtab         STRTAB          00000000 11baa89 000104 00      0   0  1
    │ +  [23] .comment          PROGBITS        00000000 11b3550 000024 01  MS  0   0  1
    │ +  [24] .bss              NOBITS          011c3550 11b3550 00d024 00  WA  0   0  8
    │ +  [25] .ARM.attributes   ARM_ATTRIBUTES  00000000 11b3574 000035 00      0   0  1
    │ +  [26] .shstrtab         STRTAB          00000000 11b35a9 00010d 00      0   0  1
    │ +  [27] .dynamic          DYNAMIC         011d1000 11b4000 000160 08  WA 28   0  4
    │ +  [28] .dynstr           STRTAB          011d1160 11b4160 0068d0 00   A  0   0  4
    │ +  [29] .note.gnu.build-id NOTE            011d7a30 11baa30 000024 00   A  0   0  4
    │  Key to Flags:
    │    W (write), A (alloc), X (execute), M (merge), S (strings), I (info),
    │    L (link order), O (extra OS processing required), G (group), T (TLS),
    │    C (compressed), x (unknown), o (OS specific), E (exclude),
    │    y (purecode), p (processor specific)
    ├── readelf --wide --version-info {}
    │ @@ -345,20 +345,20 @@
    │    554:   0 (*local*)       3 (GLIBC_2.4)     1 (*global*)      1 (*global*)
    │    558:   1 (*global*)      1 (*global*)      1 (*global*)      1 (*global*)
    │    55c:   1 (*global*)      1 (*global*)      1 (*global*)      1 (*global*)
    │    560:   d (GLIBC_2.4)     b (GLIBCXX_3.4.9)   1 (*global*)      3 (GLIBC_2.4)
    │    564:   1 (*global*)      4 (GLIBCXX_3.4)   1 (*global*)
    │
    │  Version definition section '.gnu.version_d' contains 2 entries:
    │ - Addr: 0x000000000000f0fc  Offset: 0x00f0fc  Link: 26 (.dynstr)
    │ + Addr: 0x000000000000f0fc  Offset: 0x00f0fc  Link: 28 (.dynstr)
    │    000000: Rev: 1  Flags: BASE  Index: 1  Cnt: 1  Name: libmali.so
    │    0x001c: Rev: 1  Flags: none  Index: 2  Cnt: 1  Name: LIBMALI_1.0
    │
    │  Version needs section '.gnu.version_r' contains 8 entries:
    │ - Addr: 0x000000000000f134  Offset: 0x00f134  Link: 26 (.dynstr)
    │ + Addr: 0x000000000000f134  Offset: 0x00f134  Link: 28 (.dynstr)
    │    000000: Version: 1  File: ld-linux-armhf.so.3  Cnt: 1
    │    0x0010:   Name: GLIBC_2.4  Flags: none  Version: 20
    │    0x0020: Version: 1  File: librt.so.1  Cnt: 1
    │    0x0030:   Name: GLIBC_2.4  Flags: none  Version: 16
    │    0x0040: Version: 1  File: libdl.so.2  Cnt: 1
    │    0x0050:   Name: GLIBC_2.4  Flags: none  Version: 13
    │    0x0060: Version: 1  File: libpthread.so.0  Cnt: 1
    ├── strings --all {}
    │ @@ -1,7 +1,9 @@
    │ +XXXX
    │ +XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
    │  "3F2t(FO
    │  KpG-
    │  #9hc
    │  F8hL
    │  H{DyDxD
    │  E!F*F,D
    │  E F*F,D
    │ @@ -217401,21 +217403,52 @@
    │  d	,:
    │  e	,:
    │  f	,:
    │  g	,:
    │  h	,:
    │  i	,:
    │  j	,:
    │ +XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX`
    │  INFO
    │  WARN
    │  ERROR
    │  FAIL
    │  g++ (Ubuntu 4.9.3-13ubuntu2) 4.9.3
    │  profile=tx011-release gpu=t76x hwver=r0p0 kernel_modules=0 progs_install=bin libs_install=bin floatabi=hard winsys=fbdev os=linux toolchain_prefix_target=/home/lihuang/project/linux_mali/midgard/driver/product/gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf/bin/arm-linux-gnueabihf- winsys_dma_buf=1 simd=1 symbols=0 wayland_server=0 ump=0 cl=1 opencl_platform_config=config_t6xx winsys=gbm allocator=drm_dumb winsys=x11,gbm cl=1
    │  a79caef8f5df9db3a4dcede1f163d679bd864dff
    │ +GCC: (Linaro GCC 4.9-2017.01) 4.9.4
    │ +aeabi
    │ +.shstrtab
    │ +.note.gnu.build-id
    │ +.hash
    │ +.dynsym
    │ +.dynstr
    │ +.gnu.version
    │ +.gnu.version_d
    │ +.gnu.version_r
    │ +.rel.dyn
    │ +.rel.plt
    │ +.init
    │ +.text
    │ +.fini
    │ +.rodata
    │ +.ARM.extab
    │ +.ARM.exidx
    │ +.eh_frame
    │ +.tbss
    │ +.init_array
    │ +.fini_array
    │ +.jcr
    │ +.data.rel.ro
    │ +.dynamic
    │ +.got
    │ +.data
    │ +.bss
    │ +.comment
    │ +.ARM.attributes
    │  __gmon_start__
    │  _fini
    │  _ITM_deregisterTMCloneTable
    │  _ITM_registerTMCloneTable
    │  __cxa_finalize
    │  _Jv_RegisterClasses
    │  getpid
    │ @@ -218779,35 +218812,7 @@
    │  GLIBCXX_3.4.15
    │  CXXABI_1.3
    │  GLIBCXX_3.4.20
    │  GLIBCXX_3.4
    │  GLIBC_2.7
    │  GLIBC_2.15
    │  libmali.so.1
    │ -aeabi
    │ -.shstrtab
    │ -.hash
    │ -.dynsym
    │ -.gnu.version
    │ -.gnu.version_d
    │ -.gnu.version_r
    │ -.rel.dyn
    │ -.rel.plt
    │ -.init
    │ -.text
    │ -.fini
    │ -.rodata
    │ -.ARM.extab
    │ -.ARM.exidx
    │ -.eh_frame
    │ -.tbss
    │ -.init_array
    │ -.fini_array
    │ -.jcr
    │ -.data.rel.ro
    │ -.got
    │ -.data
    │ -.bss
    │ -.ARM.attributes
    │ -.dynamic
    │ -.dynstr
    │ -.note.gnu.build-id
    ├── readelf --wide --decompress --hex-dump=.plt {}
    │ @@ -1,9 +1,10 @@
    │
    │  Hex dump of section '.plt':
    │ + NOTE: This section has relocations against it, but these have NOT been applied to this dump.
    │    0x0009faa0 04e02de5 04e09fe5 0ee08fe0 08f0bee5 ..-.............
    │    0x0009fab0 08fa0f01 10c68fe2 ffca8ce2 08fabce5 ................
    │    0x0009fac0 10c68fe2 ffca8ce2 00fabce5 10c68fe2 ................
    │    0x0009fad0 ffca8ce2 f8f9bce5 10c68fe2 ffca8ce2 ................
    │    0x0009fae0 f0f9bce5 10c68fe2 ffca8ce2 e8f9bce5 ................
    │    0x0009faf0 10c68fe2 ffca8ce2 e0f9bce5 10c68fe2 ................
    │    0x0009fb00 ffca8ce2 d8f9bce5 10c68fe2 ffca8ce2 ................
    ├── readelf --wide --decompress --hex-dump=.got {}
    │ @@ -1,10 +1,9 @@
    │
    │  Hex dump of section '.got':
    │ - NOTE: This section has relocations against it, but these have NOT been applied to this dump.
    │    0x0119f4b8 60f31901 00000000 00000000 a0fa0900 `...............
    │    0x0119f4c8 a0fa0900 a0fa0900 a0fa0900 a0fa0900 ................
    │    0x0119f4d8 a0fa0900 a0fa0900 a0fa0900 a0fa0900 ................
    │    0x0119f4e8 a0fa0900 a0fa0900 a0fa0900 a0fa0900 ................
    │    0x0119f4f8 a0fa0900 a0fa0900 a0fa0900 a0fa0900 ................
    │    0x0119f508 a0fa0900 a0fa0900 a0fa0900 a0fa0900 ................
    │    0x0119f518 a0fa0900 a0fa0900 a0fa0900 a0fa0900 ................
    ├── readelf --wide --decompress --hex-dump=.shstrtab {}
    │ @@ -1,20 +1,20 @@
    │
    │  Hex dump of section '.shstrtab':
    │ -  0x00000000 002e7368 73747274 6162002e 68617368 ..shstrtab..hash
    │ -  0x00000010 002e6479 6e73796d 002e676e 752e7665 ..dynsym..gnu.ve
    │ -  0x00000020 7273696f 6e002e67 6e752e76 65727369 rsion..gnu.versi
    │ -  0x00000030 6f6e5f64 002e676e 752e7665 7273696f on_d..gnu.versio
    │ -  0x00000040 6e5f7200 2e72656c 2e64796e 002e7265 n_r..rel.dyn..re
    │ -  0x00000050 6c2e706c 74002e69 6e697400 2e746578 l.plt..init..tex
    │ -  0x00000060 74002e66 696e6900 2e726f64 61746100 t..fini..rodata.
    │ -  0x00000070 2e41524d 2e657874 6162002e 41524d2e .ARM.extab..ARM.
    │ -  0x00000080 65786964 78002e65 685f6672 616d6500 exidx..eh_frame.
    │ -  0x00000090 2e746273 73002e69 6e69745f 61727261 .tbss..init_arra
    │ -  0x000000a0 79002e66 696e695f 61727261 79002e6a y..fini_array..j
    │ -  0x000000b0 6372002e 64617461 2e72656c 2e726f00 cr..data.rel.ro.
    │ -  0x000000c0 2e676f74 002e6461 7461002e 62737300 .got..data..bss.
    │ -  0x000000d0 2e41524d 2e617474 72696275 74657300 .ARM.attributes.
    │ -  0x000000e0 2e64796e 616d6963 002e6479 6e737472 .dynamic..dynstr
    │ -  0x000000f0 002e6e6f 74652e67 6e752e62 75696c64 ..note.gnu.build
    │ -  0x00000100 2d696400                            -id.
    │ +  0x00000000 002e7368 73747274 6162002e 6e6f7465 ..shstrtab..note
    │ +  0x00000010 2e676e75 2e627569 6c642d69 64002e68 .gnu.build-id..h
    │ +  0x00000020 61736800 2e64796e 73796d00 2e64796e ash..dynsym..dyn
    │ +  0x00000030 73747200 2e676e75 2e766572 73696f6e str..gnu.version
    │ +  0x00000040 002e676e 752e7665 7273696f 6e5f6400 ..gnu.version_d.
    │ +  0x00000050 2e676e75 2e766572 73696f6e 5f72002e .gnu.version_r..
    │ +  0x00000060 72656c2e 64796e00 2e72656c 2e706c74 rel.dyn..rel.plt
    │ +  0x00000070 002e696e 6974002e 74657874 002e6669 ..init..text..fi
    │ +  0x00000080 6e69002e 726f6461 7461002e 41524d2e ni..rodata..ARM.
    │ +  0x00000090 65787461 62002e41 524d2e65 78696478 extab..ARM.exidx
    │ +  0x000000a0 002e6568 5f667261 6d65002e 74627373 ..eh_frame..tbss
    │ +  0x000000b0 002e696e 69745f61 72726179 002e6669 ..init_array..fi
    │ +  0x000000c0 6e695f61 72726179 002e6a63 72002e64 ni_array..jcr..d
    │ +  0x000000d0 6174612e 72656c2e 726f002e 64796e61 ata.rel.ro..dyna
    │ +  0x000000e0 6d696300 2e676f74 002e6461 7461002e mic..got..data..
    │ +  0x000000f0 62737300 2e636f6d 6d656e74 002e4152 bss..comment..AR
    │ +  0x00000100 4d2e6174 74726962 75746573 00       M.attributes.

Previously I had copied the libmali.so.1[.9.0] from the result of
building
commit 1fb6b47b287252f16bf06dc7bd87611c378de0cf
Author: Will Thompson <wjt@endlessm.com>
Date:   Wed Sep 2 10:08:30 2020 +0100

    Update to newer Mali

    I obtained these files as follows:

    - Built https://github.com/rockchip-linux/libmali @ b91d4b9
    - Unpacked libmali-midgard-t76x-r14p0-r0p0-x11-arm_1.9-1_armhf.deb
    - Copied the files into here

    In the previous version, all libraries were symlinks to libMali.so (capital M):

        wjt@jerry:~$ ls -l /usr/lib/mali-t76x/arm-linux-gnueabihf/
        total 18132
        drwxr-xr-x  2 root root     4096 Jan  1  1970 flatpak
        lrwxrwxrwx 25 root root       10 Sep 25  2019 libEGL.so.1 -> libMali.so
        lrwxrwxrwx 25 root root       10 Sep 25  2019 libEGL.so.1.0.0 -> libMali.so
        lrwxrwxrwx 25 root root       10 Sep 25  2019 libgbm.so.1 -> libMali.so
        lrwxrwxrwx 25 root root       10 Sep 25  2019 libgbm.so.1.0.0 -> libMali.so
        lrwxrwxrwx 25 root root       10 Sep 25  2019 libGLESv2.so.2 -> libMali.so
        lrwxrwxrwx 25 root root       10 Sep 25  2019 libGLESv2.so.2.0.0 -> libMali.so
        -rw-r--r--  5 root root 18561828 Jan  1  1970 libMali.so

    In this version, all these libraries actually exist, as very small
    libraries which in turn link to libmali.so (lowercase m):

        wjt@jerry:~$ ls -l tmp/usr/lib/mali/
        total 18220
        lrwxrwxrwx 1 wjt wjt       11 Jul 29 04:35 libEGL.so -> libEGL.so.1
        -rw-r--r-- 1 wjt wjt     5372 Jul 29 04:35 libEGL.so.1
        lrwxrwxrwx 1 wjt wjt       11 Jul 29 04:35 libgbm.so -> libgbm.so.1
        -rw-r--r-- 1 wjt wjt     5452 Jul 29 04:35 libgbm.so.1
        lrwxrwxrwx 1 wjt wjt       17 Jul 29 04:35 libGLESv1_CM.so -> libGLESv1_CM.so.1
        -rw-r--r-- 1 wjt wjt     5372 Jul 29 04:35 libGLESv1_CM.so.1
        lrwxrwxrwx 1 wjt wjt       14 Jul 29 04:35 libGLESv2.so -> libGLESv2.so.2
        -rw-r--r-- 1 wjt wjt     5372 Jul 29 04:35 libGLESv2.so.2
        lrwxrwxrwx 1 wjt wjt       10 Jul 29 04:35 libmali-midgard-t76x-r14p0-r0p0-x11.so -> libmali.so
        lrwxrwxrwx 1 wjt wjt       18 Jul 29 04:35 libMaliOpenCL.so -> libMaliOpenCL.so.1
        -rw-r--r-- 1 wjt wjt     5372 Jul 29 04:35 libMaliOpenCL.so.1
        lrwxrwxrwx 1 wjt wjt       12 Jul 29 04:35 libmali.so -> libmali.so.1
        lrwxrwxrwx 1 wjt wjt       12 Jul 29 04:35 libMali.so -> libMali.so.1
        lrwxrwxrwx 1 wjt wjt       16 Jul 29 04:35 libmali.so.1 -> libmali.so.1.9.0
        -rw-r--r-- 1 wjt wjt     5372 Jul 29 04:35 libMali.so.1
        -rw-r--r-- 1 wjt wjt 18591768 Jul 29 04:35 libmali.so.1.9.0
        lrwxrwxrwx 1 wjt wjt       14 Jul 29 04:35 libOpenCL.so -> libOpenCL.so.1
        -rw-r--r-- 1 wjt wjt     5372 Jul 29 04:35 libOpenCL.so.1
        drwxr-xr-x 2 wjt wjt     4096 Jul 29 04:35 pkgconfig

    For example:

        wjt@jerry:~$ ldd tmp/usr/lib/mali/libgbm.so
            linux-vdso.so.1 (0xbef7d000)
            libmali.so.1 => not found
            libdrm.so.2 => /lib/arm-linux-gnueabihf/libdrm.so.2 (0xb6f01000)
            libc.so.6 => /lib/arm-linux-gnueabihf/libc.so.6 (0xb6e07000)
            /lib/ld-linux-armhf.so.3 (0xb6f42000)
            libm.so.6 => /lib/arm-linux-gnueabihf/libm.so.6 (0xb6d8c000)

    Crucially this libgbm includes a (stub) implementation of
    gbm_surface_create_with_modifiers() which Mutter requires but the old
    libMali.so did not implement.

    We have to install a libmali.so.1 symlink into
    /usr/lib/arm-linux-gnueabihf because executables which link against
    libEGL now transitively link against this. I renamed libmali.so.1.9.0
    (as built by Rockchip's package) to libmali.so.1 to simplify this. I'm
    sure I have not done this the Correct Way.

    With this patch GDM and my user session come up. However, ldconfig
    complains:

        ldconfig: file /lib/arm-linux-gnueabihf/libmali.so.1 is truncated

    and a similar message when launching Flatpaks. gnome-session-binary,
    mutter, etc. seem to come up fine so I don't know what the deal is here.

    https://phabricator.endlessm.com/T29068

diff --git a/debian/changelog b/debian/changelog
index a00526d..76e20df 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,3 +1,10 @@
+mali-t76x-drivers-x11 (14.0.0.0-2) eos3.6; urgency=medium
+
+  * Update from
+    libmali-midgard-t76x-r14p0-r0p0-x11-arm_1.9-1_armhf.deb
+
+ -- Will Thompson <wjt@endlessm.com>  Wed, 02 Sep 2020 10:13:29 +0100
+
 mali-t76x-drivers-x11 (14.0.0.0-1) master; urgency=medium

   * Initial packaging from
diff --git a/debian/mali-t76x-corelibs.links b/debian/mali-t76x-corelibs.links
index e68a2f4..06c2cae 100644
--- a/debian/mali-t76x-corelibs.links
+++ b/debian/mali-t76x-corelibs.links
@@ -1,13 +1,9 @@
-usr/lib/mali-t76x/arm-linux-gnueabihf/libMali.so		usr/lib/mali-t76x/arm-linux-gnueabihf/libEGL.so.1
-usr/lib/mali-t76x/arm-linux-gnueabihf/libMali.so		usr/lib/mali-t76x/arm-linux-gnueabihf/libEGL.so.1.0.0
-usr/lib/mali-t76x/arm-linux-gnueabihf/libMali.so		usr/lib/mali-t76x/arm-linux-gnueabihf/libgbm.so.1
-usr/lib/mali-t76x/arm-linux-gnueabihf/libMali.so		usr/lib/mali-t76x/arm-linux-gnueabihf/libgbm.so.1.0.0
-usr/lib/mali-t76x/arm-linux-gnueabihf/libMali.so		usr/lib/mali-t76x/arm-linux-gnueabihf/libGLESv2.so.2
-usr/lib/mali-t76x/arm-linux-gnueabihf/libMali.so		usr/lib/mali-t76x/arm-linux-gnueabihf/libGLESv2.so.2.0.0
-usr/lib/mali-t76x/arm-linux-gnueabihf/flatpak/libMali.so	usr/lib/mali-t76x/arm-linux-gnueabihf/flatpak/libEGL.so.1
-usr/lib/mali-t76x/arm-linux-gnueabihf/flatpak/libMali.so	usr/lib/mali-t76x/arm-linux-gnueabihf/flatpak/libEGL.so.1.0.0
-usr/lib/mali-t76x/arm-linux-gnueabihf/flatpak/libMali.so	usr/lib/mali-t76x/arm-linux-gnueabihf/flatpak/libgbm.so.1
-usr/lib/mali-t76x/arm-linux-gnueabihf/flatpak/libMali.so	usr/lib/mali-t76x/arm-linux-gnueabihf/flatpak/libgbm.so.1.0.0
-usr/lib/mali-t76x/arm-linux-gnueabihf/flatpak/libMali.so	usr/lib/mali-t76x/arm-linux-gnueabihf/flatpak/libGLESv2.so.2
-usr/lib/mali-t76x/arm-linux-gnueabihf/flatpak/libMali.so	usr/lib/mali-t76x/arm-linux-gnueabihf/flatpak/libGLESv2.so.2.0.0
+usr/lib/mali-t76x/arm-linux-gnueabihf/libEGL.so.1		usr/lib/mali-t76x/arm-linux-gnueabihf/libEGL.so.1.0.0
+usr/lib/mali-t76x/arm-linux-gnueabihf/libgbm.so.1		usr/lib/mali-t76x/arm-linux-gnueabihf/libgbm.so.1.0.0
+usr/lib/mali-t76x/arm-linux-gnueabihf/libGLESv2.so.2		usr/lib/mali-t76x/arm-linux-gnueabihf/libGLESv2.so.2.0.0
+usr/lib/mali-t76x/arm-linux-gnueabihf/flatpak/libEGL.so.1	usr/lib/mali-t76x/arm-linux-gnueabihf/flatpak/libEGL.so.1.0.0
+usr/lib/mali-t76x/arm-linux-gnueabihf/flatpak/libgbm.so.1	usr/lib/mali-t76x/arm-linux-gnueabihf/flatpak/libgbm.so.1.0.0
+usr/lib/mali-t76x/arm-linux-gnueabihf/flatpak/libGLESv2.so.2	usr/lib/mali-t76x/arm-linux-gnueabihf/flatpak/libGLESv2.so.2.0.0
 usr/lib/mali-t76x/arm-linux-gnueabihf/flatpak			usr/lib/mali-t76x/arm-linux-gnueabihf/flatpak/lib
+usr/lib/mali-t76x/arm-linux-gnueabihf/libmali.so.1		usr/lib/arm-linux-gnueabihf/libmali.so.1
+
diff --git a/debian/mali-t76x-drivers-rk3288.install b/debian/mali-t76x-drivers-rk3288.install
index a7cdbe4..1bcb435 100644
--- a/debian/mali-t76x-drivers-rk3288.install
+++ b/debian/mali-t76x-drivers-rk3288.install
@@ -1,2 +1,10 @@
-drivers/rk3288/libMali.so		usr/lib/mali-t76x/arm-linux-gnueabihf/
-drivers/rk3288/libMali.so		usr/lib/mali-t76x/arm-linux-gnueabihf/flatpak/
+drivers/rk3288/libEGL.so.1	usr/lib/mali-t76x/arm-linux-gnueabihf/
+drivers/rk3288/libEGL.so.1	usr/lib/mali-t76x/arm-linux-gnueabihf/flatpak/
+drivers/rk3288/libgbm.so.1	usr/lib/mali-t76x/arm-linux-gnueabihf/
+drivers/rk3288/libgbm.so.1	usr/lib/mali-t76x/arm-linux-gnueabihf/flatpak/
+drivers/rk3288/libGLESv2.so.2	usr/lib/mali-t76x/arm-linux-gnueabihf/
+drivers/rk3288/libGLESv2.so.2	usr/lib/mali-t76x/arm-linux-gnueabihf/flatpak/
+drivers/rk3288/libMali.so.1	usr/lib/mali-t76x/arm-linux-gnueabihf/
+drivers/rk3288/libMali.so.1	usr/lib/mali-t76x/arm-linux-gnueabihf/flatpak/
+drivers/rk3288/libmali.so.1	usr/lib/mali-t76x/arm-linux-gnueabihf/
+drivers/rk3288/libmali.so.1	usr/lib/mali-t76x/arm-linux-gnueabihf/flatpak/
diff --git a/debian/rules b/debian/rules
index 2d33f6a..32496f3 100755
--- a/debian/rules
+++ b/debian/rules
@@ -2,3 +2,7 @@

 %:
 	dh $@
+
+# Libraries all link to each other, so need to tell dpkg-shlibdeps where they live
+override_dh_shlibdeps:
+	dh_shlibdeps -l/usr/lib/mali-t76x/arm-linux-gnueabihf
diff --git a/drivers/rk3288/libEGL.so.1 b/drivers/rk3288/libEGL.so.1
new file mode 100644
index 0000000..444c9b7
Binary files /dev/null and b/drivers/rk3288/libEGL.so.1 differ
diff --git a/drivers/rk3288/libGLESv2.so.2 b/drivers/rk3288/libGLESv2.so.2
new file mode 100644
index 0000000..af96aa5
Binary files /dev/null and b/drivers/rk3288/libGLESv2.so.2 differ
diff --git a/drivers/rk3288/libMali.so.1 b/drivers/rk3288/libMali.so.1
new file mode 100644
index 0000000..ed98243
Binary files /dev/null and b/drivers/rk3288/libMali.so.1 differ
diff --git a/drivers/rk3288/libgbm.so.1 b/drivers/rk3288/libgbm.so.1
new file mode 100644
index 0000000..0bfa4c2
Binary files /dev/null and b/drivers/rk3288/libgbm.so.1 differ
diff --git a/drivers/rk3288/libMali.so b/drivers/rk3288/libmali.so.1
similarity index 77%
rename from drivers/rk3288/libMali.so
rename to drivers/rk3288/libmali.so.1
index 83c1c75..c9344b6 100644
Binary files a/drivers/rk3288/libMali.so and b/drivers/rk3288/libmali.so.1 differ
  • Loading branch information
wjt committed Sep 3, 2020
1 parent 1fb6b47 commit 2255452
Showing 1 changed file with 0 additions and 0 deletions.
Binary file modified drivers/rk3288/libmali.so.1
Binary file not shown.

0 comments on commit 2255452

Please sign in to comment.