Skip to content

Commit 26226a5

Browse files
authored
Merge pull request #1424 from tpaviot/review/occt790
Review/occt790
2 parents b721b36 + 3da3b08 commit 26226a5

File tree

423 files changed

+38529
-110166
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

423 files changed

+38529
-110166
lines changed

CMakeLists.txt

Lines changed: 20 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,36 +1,36 @@
1-
##Copyright (c) 2011-2020 Thomas Paviot ([email protected])
1+
##Copyright (c) 2011-2025 Thomas Paviot ([email protected])
22
##
33
##This file is part of pythonOCC.
44
##
55
##pythonOCC is free software: you can redistribute it and/or modify
6-
##it under the terms of the GNU General Public License as published by
6+
##it under the terms of the GNU Lesser General Public License as published by
77
##the Free Software Foundation, either version 3 of the License, or
88
##(at your option) any later version.
99
##
1010
##pythonOCC is distributed in the hope that it will be useful,
1111
##but WITHOUT ANY WARRANTY; without even the implied warranty of
1212
##MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13-
##GNU General Public License for more details.
13+
##GNU Lesser General Public License for more details.
1414
##
15-
##You should have received a copy of the GNU General Public License
15+
##You should have received a copy of the GNU Lesser General Public License
1616
##along with pythonOCC. If not, see <http://www.gnu.org/licenses/>.
1717

18-
cmake_minimum_required(VERSION 3.12)
18+
cmake_minimum_required(VERSION 3.18)
1919

2020
project(PYTHONOCC)
2121

2222
# set pythonOCC version
2323
set(PYTHONOCC_VERSION_MAJOR 7)
24-
set(PYTHONOCC_VERSION_MINOR 8)
25-
set(PYTHONOCC_VERSION_PATCH 1)
24+
set(PYTHONOCC_VERSION_MINOR 9)
25+
set(PYTHONOCC_VERSION_PATCH 0)
2626

2727
# Empty for official releases, set to -dev, -rc1, etc for development releases
28-
set(PYTHONOCC_VERSION_DEVEL 1)
28+
set(PYTHONOCC_VERSION_DEVEL)
2929

3030
# set OCCT version
3131
set(OCCT_VERSION_MAJOR 7)
32-
set(OCCT_VERSION_MINOR 8)
33-
set(OCCT_VERSION_PATCH 1)
32+
set(OCCT_VERSION_MINOR 9)
33+
set(OCCT_VERSION_PATCH 0)
3434

3535
set(CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/cmake ${CMAKE_MODULE_PATH})
3636

@@ -96,7 +96,7 @@ option_with_default(PYTHONOCC_MESHDS_NUMPY "Enable using numpy to speed up mesh
9696
set(Python3_FIND_STRATEGY LOCATION)
9797
set(Python3_FIND_FRAMEWORK NEVER)
9898
if(PYTHONOCC_MESHDS_NUMPY)
99-
find_package(Python3 COMPONENTS Interpreter Development NumPy REQUIRED)
99+
find_package(Python3 3.9 COMPONENTS Interpreter Development NumPy REQUIRED)
100100
include_directories(${Python3_NumPy_INCLUDE_DIRS})
101101
message(STATUS "Numpy include directory: ${Python3_NumPy_INCLUDE_DIRS}")
102102
set(CMAKE_SWIG_FLAGS ${CMAKE_SWIG_FLAGS} -DBUILD_MESHDS_NUMPY)
@@ -110,7 +110,8 @@ message(STATUS "Python library release: ${Python3_LIBRARY_RELEASE}")
110110
########
111111
# SWIG #
112112
########
113-
find_package(SWIG 4.2.1 REQUIRED)
113+
find_package(SWIG 4.2.1...4.3.0 REQUIRED)
114+
message(STATUS "SWIG version found: ${SWIG_VERSION}")
114115
include(${SWIG_USE_FILE})
115116
set(SWIG_FILES_PATH src/SWIG_files/wrapper)
116117
set(CMAKE_SWIG_FLAGS ${CMAKE_SWIG_FLAGS} -fvirtual)
@@ -148,7 +149,7 @@ endif()
148149
# OCE include and lib location #
149150
################################
150151
if(OCCT_HIDE_DEPRECATED)
151-
message(STATUS "Disabled deprecation warnings for oce")
152+
message(STATUS "Disabled deprecation warnings for OpenCASCADE")
152153
add_definitions(-DOCCT_NO_DEPRECATED)
153154
endif(OCCT_HIDE_DEPRECATED)
154155

@@ -163,15 +164,15 @@ if(DEFINED OCCT_INCLUDE_DIR)
163164
# if OCCT_INCLUDE_DIR is not passed at command line,
164165
# find OCE automatically
165166
else(OCCT_INCLUDE_DIR)
166-
find_package(OpenCASCADE ${OCCT_VERSION_MAJOR}.${OCCT_VERSION_MINOR}.${OCCT_VERSION_PATCH} REQUIRED)
167+
find_package(OpenCASCADE ${OCCT_VERSION_MAJOR}.${OCCT_VERSION_MINOR}.${OCCT_VERSION_PATCH} EXACT REQUIRED)
167168
if(OpenCASCADE_FOUND)
168169
message(STATUS "OpenCASCADE version found: " ${OpenCASCADE_MAJOR_VERSION} "." ${OpenCASCADE_MINOR_VERSION} "." ${OpenCASCADE_MAINTENANCE_VERSION})
169170
message(STATUS "OpenCASCADE include directory: " ${OpenCASCADE_INCLUDE_DIR})
170171
message(STATUS "OpenCASCADE binary directory: " ${OpenCASCADE_BINARY_DIR})
171172
include_directories(${OpenCASCADE_INCLUDE_DIR})
172173
else(OpenCASCADE_FOUND) # set default paths
173-
set(OCCT_INCLUDE_DIR /usr/local/include/oce CACHE PATH "OCE include path")
174-
set(OCCT_LIBRARY_DIR /usr/local/lib CACHE PATH "OCE lib path")
174+
set(OCCT_INCLUDE_DIR /usr/local/include/opencascade CACHE PATH "OpenCASCADE include path")
175+
set(OCCT_LIBRARY_DIR /usr/local/lib CACHE PATH "OpenCASCADE lib path")
175176
include_directories(${OCCT_INCLUDE_DIR})
176177
link_directories(${OCCT_LIBRARY_DIR})
177178
endif(OpenCASCADE_FOUND)
@@ -312,6 +313,9 @@ swig_link_libraries(Tesselator ${OCCT_MODEL_LIBRARIES} Python3::Module)
312313
#################
313314
if(PYTHONOCC_WRAP_VISU)
314315
find_package(OpenGL REQUIRED)
316+
if(OPENGL_FOUND)
317+
message(STATUS "OpenGL found; Visualization support enabled")
318+
endif()
315319
include_directories(OPENGL_INCLUDE_DIR)
316320

317321
foreach(OCCT_MODULE ${OCCT_TOOLKIT_VISUALIZATION})

INSTALL.md

Lines changed: 30 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
# Building pythonOCC 7.8.1.1 - Complete Guide for Linux and Windows
1+
# Building pythonOCC 7.9.0 - Complete Guide for Linux and Windows
22

33
## Table of Contents
44
- [Linux Build Guide](#linux-build-guide)
@@ -35,14 +35,14 @@ Before starting the build process, ensure your system meets these requirements:
3535

3636
## System Requirements (Linux)
3737

38-
pythonOCC 7.8.1.1 requires the following components:
38+
pythonOCC 7.9.0 requires the following components:
3939

4040
| Component | Version | Purpose |
4141
|-----------|---------|---------|
4242
| Python | ≥ 3.9 | Runtime environment |
43-
| OpenCascade | 7.8.1.1 | Core CAD functionality |
43+
| OpenCascade | 7.9.0 | Core CAD functionality |
4444
| SWIG | 4.2.1 | Interface generation |
45-
| CMake | ≥ 3.1 | Build system |
45+
| CMake | ≥ 3.20 | Build system |
4646

4747
## Build Process (Linux)
4848

@@ -72,33 +72,33 @@ sudo apt-get install -y \
7272

7373
### 2. Building SWIG (Linux)
7474

75-
SWIG 4.2.1 is required but not available in Ubuntu's default repositories. Build it from source:
75+
SWIG 4.2.1 or higher is required but not available in Ubuntu's default repositories. Build it from source:
7676

7777
```bash
78-
wget http://prdownloads.sourceforge.net/swig/swig-4.2.1.tar.gz
79-
tar -zxvf swig-4.2.1.tar.gz
80-
cd swig-4.2.1
78+
wget http://prdownloads.sourceforge.net/swig/swig-4.3.0.tar.gz
79+
tar -zxvf swig-4.3.0.tar.gz
80+
cd swig-4.3.0
8181
./configure
8282
make -j$(nproc)
8383
sudo make install
8484
```
8585

8686
### 3. Building OpenCascade (Linux)
8787

88-
Download and extract OpenCascade 7.8.1.1:
88+
Download and extract OpenCascade 7.9.0:
8989

9090
```bash
91-
wget https://github.com/Open-Cascade-SAS/OCCT/archive/refs/tags/V7_8_1.tar.gz
92-
tar -xvzf V7_8_1.tar.gz
93-
cd OCCT-7.8.1.1
91+
wget https://github.com/Open-Cascade-SAS/OCCT/archive/refs/tags/V7_9_0.tar.gz
92+
tar -xvzf V7_9_0.tar.gz
93+
cd OCCT-7.9.0
9494
mkdir cmake-build
9595
cd cmake-build
9696
```
9797

9898
Configure and build OpenCascade:
9999

100100
```bash
101-
cmake -DINSTALL_DIR=/opt/occt781 \
101+
cmake -DINSTALL_DIR=/opt/occt790 \
102102
-DBUILD_RELEASE_DISABLE_EXCEPTIONS=OFF \
103103
..
104104

@@ -109,7 +109,7 @@ sudo make install
109109
Add OpenCascade libraries to the system:
110110

111111
```bash
112-
sudo bash -c 'echo "/opt/occt781/lib" >> /etc/ld.so.conf.d/occt.conf'
112+
sudo bash -c 'echo "/opt/occt790/lib" >> /etc/ld.so.conf.d/occt.conf'
113113
sudo ldconfig
114114
```
115115

@@ -126,8 +126,8 @@ mkdir cmake-build && cd cmake-build
126126
PYTHONOCC_INSTALL_DIRECTORY=${PYTHONOCC_INSTALL_DIRECTORY:-/usr/local}
127127

128128
cmake \
129-
-DOCCT_INCLUDE_DIR=/opt/occt781/include/opencascade \
130-
-DOCCT_LIBRARY_DIR=/opt/occt781/lib \
129+
-DOCCT_INCLUDE_DIR=/opt/occt790/include/opencascade \
130+
-DOCCT_LIBRARY_DIR=/opt/occt790/lib \
131131
-DCMAKE_BUILD_TYPE=Release \
132132
-DPYTHONOCC_INSTALL_DIRECTORY=$PYTHONOCC_INSTALL_DIRECTORY \
133133
..
@@ -138,7 +138,7 @@ make -j$(nproc) && sudo make install
138138
Add OpenCascade libraries to your environment:
139139

140140
```bash
141-
echo 'export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/opt/occt781/lib' >> ~/.bashrc
141+
echo 'export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/opt/occt790/lib' >> ~/.bashrc
142142
source ~/.bashrc
143143
```
144144

@@ -159,11 +159,11 @@ Before starting the build process, ensure your system meets these requirements:
159159
|-----------|---------|---------------|
160160
| Visual Studio | 2019 or 2022 Community | [Download](https://visualstudio.microsoft.com/downloads/) |
161161
| Python | ≥ 3.9 | [Download](https://www.python.org/downloads/) |
162-
| CMake | ≥ 3.1 | [Download](https://cmake.org/download/) |
162+
| CMake | ≥ 3.20 | [Download](https://cmake.org/download/) |
163163
| Git | Latest | [Download](https://git-scm.com/download/win) |
164164
| RapidJSON | Latest | [Download](https://github.com/Tencent/rapidjson.git) |
165-
| SWIG | 4.2.1 | [Download](http://www.swig.org/download.html) |
166-
| OpenCascade | 7.8.1.1 | [Download](https://dev.opencascade.org/download) |
165+
| SWIG | 4.2.1 | [Download](http://www.swig.org/download.html) |
166+
| OpenCascade | 7.9.0 | [Download](https://dev.opencascade.org/download) |
167167

168168
## Build Process (Windows)
169169

@@ -190,7 +190,7 @@ Before starting the build process, ensure your system meets these requirements:
190190
- Use OpenSSL library
191191

192192
5. Install SWIG:
193-
- Download SWIG 4.2.1 for Windows
193+
- Download SWIG 4.3.0 for Windows
194194
- Extract to C:\swigwin
195195
- Add C:\swigwin to the system PATH
196196

@@ -201,18 +201,18 @@ Binaries for dependencies can be downloaded at https://dev.opencascade.org/resou
201201

202202
### 2. Installing OpenCascade (Windows)
203203

204-
1. Download OpenCascade 7.8.1.1 for Windows
205-
2. Extract to, for example, occt-7.8.1.1
204+
1. Download OpenCascade 7.9.0 for Windows
205+
2. Extract to, for example, occt-7.9.0
206206

207207
If the binaries are not available, consider compiling by yourself OCCT on Windows. Refer to the official OpenCascade Technology documentation https://dev.opencascade.org/doc/overview/html/build_upgrade.html
208208

209209
When installing OpenCascade and third-party libraries, you should have a structure similar to the one described at https://dev.opencascade.org/doc/overview/html/index.html#intro_install_windows
210210

211-
C:\OpenCASCADE-7.8.1.1-vc10-64
211+
C:\OpenCASCADE-7.9.0-vc10-64
212212
├── ffmpeg-3.3.4-gpl-64
213213
├── freeimage-3.17.0-vc10-64
214214
├── freetype-2.6.3-vc10-64
215-
├── occt-7.8.1.1
215+
├── occt-7.9.0
216216
├── qt486-vc10-64
217217
├── tclkit-86-64
218218
├── vtk-6.1.0-vc10-64
@@ -236,16 +236,16 @@ cd cmake-build
236236
```batch
237237
cmake -G "Visual Studio 16 2019" -A x64 ^
238238
-DCMAKE_BUILD_TYPE=Release ^
239-
-DOCCT_INCLUDE_DIR=C:\OpenCASCADE-7.8.1.1-vc10-64\occt-7.8.1.1\inc ^
240-
-DOCCT_LIBRARY_DIR=C:\OpenCASCADE-7.8.1.1-vc10-64\occt-7.8.1.1\win64\vc14\lib ^
241-
-DOCCT_ESSENTIALS_ROOT=C:\OpenCASCADE-7.8.1.1-vc10-64
239+
-DOCCT_INCLUDE_DIR=C:\OpenCASCADE-7.9.0-vc10-64\occt-7.9.0\inc ^
240+
-DOCCT_LIBRARY_DIR=C:\OpenCASCADE-7.9.0-vc10-64\occt-7.9.0\win64\vc14\lib ^
241+
-DOCCT_ESSENTIALS_ROOT=C:\OpenCASCADE-7.9.0-vc10-64
242242
..
243243
```
244244

245245
If using CMake GUI, make sure to set these two variables before clicking the "Generate" button:
246246
```
247-
OCCT_INCLUDE_DIR=C:\OpenCASCADE-7.8.1.1-vc10-64\occt-7.8.1.1\inc
248-
OCCT_LIBRARY_DIR=C:\OpenCASCADE-7.8.1.1-vc10-64\occt-7.8.1.1\win64\vc14\lib
247+
OCCT_INCLUDE_DIR=C:\OpenCASCADE-7.9.0-vc10-64\occt-7.9.0\inc
248+
OCCT_LIBRARY_DIR=C:\OpenCASCADE-7.9.0-vc10-64\occt-7.9.0\win64\vc14\lib
249249
```
250250

251251
4. Build:

README.md

Lines changed: 17 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -2,61 +2,61 @@
22
[![Azure Build Status](https://dev.azure.com/tpaviot/pythonocc-core/_apis/build/status/tpaviot.pythonocc-core?branchName=master)](https://dev.azure.com/tpaviot/pythonocc-core/_build?definitionId=2)
33
[![Downloads Badge](https://anaconda.org/conda-forge/pythonocc-core/badges/downloads.svg)](https://anaconda.org/conda-forge/pythonocc-core)
44
[![Codacy Badge](https://api.codacy.com/project/badge/Grade/67c121324b8d4f37bc27029464c87020)](https://www.codacy.com/app/tpaviot/pythonocc-core?utm_source=github.com&amp;utm_medium=referral&amp;utm_content=tpaviot/pythonocc-core&amp;utm_campaign=Badge_Grade)
5-
[![Binder](http://mybinder.org/badge.svg)](https://mybinder.org/v2/gh/tpaviot/pythonocc-binderhub/7.8.1.1)
5+
[![Binder](http://mybinder.org/badge.svg)](https://mybinder.org/v2/gh/tpaviot/pythonocc-binderhub/7.9.0)
66
[![DOI](https://zenodo.org/badge/DOI/10.5281/zenodo.3605364.svg)](https://doi.org/10.5281/zenodo.3605364)
77

88
pythonocc-core
99
--------------
1010

1111
About
1212
-----
13-
pythonocc provides 3D modeling and dataexchange features. It is intended to CAD/PDM/PLM/BIM development. It is based on the OpenCascade Technology modeling kernel.
13+
pythonocc provides 3D modeling and dataexchange features. It is intended for CAD/PDM/PLM/BIM development. It is based on the OpenCascade Technology modeling kernel.
1414

15-
Latest release: [pythonocc-core 7.8.1.1 (December 2024)](https://github.com/tpaviot/pythonocc-core/releases/tag/7.8.1.1)
15+
Latest release: [pythonocc-core 7.9.0 (April 2025)](https://github.com/tpaviot/pythonocc-core/releases/tag/7.9.0)
1616

1717
Features
1818
--------
1919
pythonocc provides the following features:
2020

21-
* a full access from Python to almost all af the thousand OpenCascade C++ classes. Classes and methods/functions share the same names, and, as possible as it can be, the same signature
22-
* 3D visualization from the most famous Python Gui (tkinter, pyQt5 and 6, PySide2 and 6, wxPython)
23-
* 3D visualization in a web browser using threejs or x3dom frameworks
24-
* 3D visualization and work within a jupyter notebook
25-
* data exchange using most famous formats IGES/STEP/STL/PLY/OBJ/GLTF
26-
* various utility Python classes/methods for Topology operations, inertia computations etc.
21+
* Full access from Python to almost all of the thousand OpenCascade C++ classes. Classes and methods/functions share the same names, and, as possible as it can be, the same signature
22+
* 3D visualization from the most famous Python Gui (tkinter, pyQt5 and 6, PySide2 and 6, wxPython)
23+
* 3D visualization in a web browser using threejs or x3dom frameworks
24+
* 3D visualization and work within a jupyter notebook
25+
* Data exchange using most famous formats IGES/STEP/STL/PLY/OBJ/GLTF
26+
* Utility Python classes/methods for Topology operations, inertia computations, and more
2727

2828
Try online at mybinder
2929
----------------------
30-
Click [![Binder](http://mybinder.org/badge.svg)](https://mybinder.org/v2/gh/tpaviot/pythonocc-binderhub/7.8.1.1) to open a jupyter notebook running the latest pythonocc-core 7.8.1.1.
30+
Click [![Binder](http://mybinder.org/badge.svg)](https://mybinder.org/v2/gh/tpaviot/pythonocc-binderhub/7.9.0) to open a jupyter notebook running the latest pythonocc-core 7.9.0.
3131

3232
Install with conda
3333
------------------
34-
pythonocc provides precompiled [conda packages](https://anaconda.org/pythonocc/pythonocc-core) (they depend on third part libraries made available from the conda-forge channel) for python 3.9, 3.10 and 3.11. This will get you up and running in minutes whether you run win32/win64/linux64/osx64. Here is an example for python 3.10:
34+
pythonocc provides precompiled [conda packages](https://anaconda.org/pythonocc/pythonocc-core) (they depend on third part libraries made available from the conda-forge channel) for python 3.9, 3.10, 3.11 and 3.12. This will get you up and running in minutes whether you run win32/win64/linux64/osx64. Here is an example for python 3.10:
3535

3636
```bash
3737
# first create an environment
3838
conda create --name=pyoccenv python=3.10
39-
source activate pyoccenv
40-
conda install -c conda-forge pythonocc-core=7.8.1.1
39+
conda activate pyoccenv
40+
conda install -c conda-forge pythonocc-core=7.9.0
4141
```
4242

43-
Other conda channels may provide pythonocc-core packages, check https://anaconda.org/search?q=pythonocc-core.
43+
Other conda channels may provide pythonocc-core packages, check [search Anaconda](https://anaconda.org/search?q=pythonocc-core)
4444

4545
Build from source
4646
-----------------
4747
Read the [INSTALL.md](https://github.com/tpaviot/pythonocc-core/blob/master/INSTALL.md) instructions where you find compilation instructions for all platforms.
4848

4949
Cite as
5050
-------
51-
pythonocc is widely used in the industrial and academic communities. It is registered as a Zenodo open access software (https://zenodo.org/record/7471333) and should be cited as:
51+
pythonocc is widely used in the industrial and academic communities. It is registered as a [Zenodo open access softwar](https://zenodo.org/record/7471333) and should be cited as:
5252

5353
Paviot, T. (2022). "pythonocc". Zenodo. https://doi.org/10.5281/zenodo.3605364
5454

5555
Professional support
5656
--------------------
5757
pythonocc is backed by [meeDIA](https://meedia.ai/pythonocc-en), a company co-founded by pythonocc's creator and lead maintainer. For professional support inquiries, please contact us.
5858

59-
<a href="https://meedia.ai/pythonocc-en"><img src="https://www.meedia.ai/wp-content/uploads/go-x/u/d3a61d32-b812-4a39-89c8-57fa93df5780/image-320x95.png" width="150"></a>
59+
<a href="https://meedia.ai/pythonocc-en"><img src="https://www.meedia.ai/wp-content/uploads/go-x/u/d3a61d32-b812-4a39-89c8-57fa93df5780/image-320x95.png" width="150" alt="meeDIA logo"></a>
6060

6161
Other pythonocc related resources
6262
---------------------------------
@@ -67,4 +67,4 @@ Other pythonocc related resources
6767

6868
License
6969
-------
70-
You can redistribute it and/or modify it under the terms of the GNU Lesser General Public License version 3 as published by the Free Software Foundation.
70+
pythonocc-core is licensed under the GNU Lesser General Public License version 3 as published by the Free Software Foundation. You can redistribute and/or modify it under the terms of this license.

ci/conda/meta.yaml

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
{% set version = "7.8.1.1" %}
1+
{% set version = "7.9.0" %}
22

33
package:
44
name: pythonocc-core
@@ -22,15 +22,15 @@ requirements:
2222
- {{ cdt('libxi-devel') }} # [linux]
2323
- ninja
2424
- cmake
25-
- swig ==4.2.1
25+
- swig ==4.3.0
2626

2727
host:
2828
- python {{ python }}
29-
- occt ==7.8.1
29+
- occt ==7.9.0
3030
- numpy >=1.17
3131

3232
run:
33-
- occt ==7.8.1
33+
- occt ==7.9.0
3434
- numpy >=1.17
3535

3636
test:

src/Display/WebGl/flask_server.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
""" A flask webserver. """
1+
"""A flask webserver."""
22

33
import sys
44
import uuid

src/Display/WebGl/simple_server.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
##You should have received a copy of the GNU Lesser General Public License
1616
##along with pythonOCC. If not, see <http://www.gnu.org/licenses/>.
1717

18-
""" A very simple webserver. """
18+
"""A very simple webserver."""
1919

2020
import os
2121
import socket

0 commit comments

Comments
 (0)