Repository: geopandas/geopandas
Pull request #2470 (2022-06-21 14:48:43)

ENH: better detection of categorical columns in plot and explore
Addresses the issue of #2416  
This is my first contributing oss activity.  
So if you find something wrong, please point it out.

The main changes are as follows
- Using pandas API instead of numpy API
- Adding conditions in plotting as well as explore  

The reason for the above changes is that using pandas.api.types can be better way to catch more conditions, as stated in #2416.

keirayuki: Thanks for the comments!  
I've submit some test cases and additionally the way to deal with string case.  

In the following case, category detection wouldn't work.  

```python
import numpy as np
import pandas as pd
import geopandas as gpd

gdf = gpd.read_file(gpd.datasets.get_path("nybb"))
gdf["bool"] = [True, False, True, True, False]
gdf["bool_extention"] = pd.array([True, False, True, True, False])
gdf["string"] = pd.array(([True, False, True, True, False]), dtype="string")

gdf.plot("bool") # category detection work well (#2416)
gdf.explore("bool") # category detection work well (#2416)

gdf.explore("bool_extention") # category detection wouldn't work
gdf.plot("string") # category detection wouldn't work
gdf.explore("string") # category detection wouldn't work
```

So, I fixed by using pandas API insetad of numpy api in explore.py and plotting.py like the following.  
```python
    elif values.dtype is np.dtype("O") or categories:
    elif (
        pd.api.types.is_object_dtype(values.dtype)
        or pd.api.types.is_bool_dtype(values.dtype)
        or pd.api.types.is_string_dtype(values.dtype)
        or categories
    ):
```
Also, I've written the test cases to check them out.  

About `pd.api.types.is_obeject_dtype`, maybe, I thougt that `pd.api.types.is_obeject_dtype` was better than `np.dtype('O')`. 
(I'm not unconfident with this and I can't come up with the test cases.)

Patch:
diff --git a/CHANGELOG.md b/CHANGELOG.md
index c252afd0..2fd3f56a 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,6 +1,41 @@
 Changelog
 =========
 
+Development version
+-------------------
+
+New features and improvements:
+
+Deprecations and compatibility notes:
+
+Bug fixes:
+
+Notes on (optional) dependencies:
+
+Version 0.11.1 (July 24, 2022)
+------------------------------
+
+Small bug-fix release:
+
+- Fix regression (RecursionError) in reshape methods such as ``unstack()``
+  and ``pivot()`` involving MultiIndex, or GeoDataFrame construction with
+  MultiIndex (#2486).
+- Fix regression in ``GeoDataFrame.explode()`` with non-default
+  geometry column name.
+- Fix regression in ``apply()`` causing row-wise all nan float columns to be 
+  casted to GeometryDtype (#2482). 
+- Fix a crash in datetime column reading where the file contains mixed timezone
+  offsets (#2479). These will be read as UTC localized values.
+- Fix a crash in datetime column reading where the file contains datetimes
+  outside the range supported by [ns] precision (#2505).
+- Fix regression in passing the Parquet or Feather format ``version`` in
+  ``to_parquet`` and ``to_feather``. As a result, the ``version`` parameter
+  for the ``to_parquet`` and ``to_feather`` methods has been replaced with
+  ``schema_version``. ``version`` will be passed directly to underlying
+  feather or parquet writer. ``version`` will only be used to set
+  ``schema_version`` if ``version`` is one of 0.1.0 or 0.4.0 (#2496).
+
+
 Version 0.11 (June 20, 2022)
 ----------------------------
 
@@ -121,7 +156,6 @@ Notes on (optional) dependencies:
   dependencies have now changed to shapely 1.7, fiona 1.8.13.post1, pyproj 2.6.1.post1,
   matplotlib 3.2, mapclassify 2.4.0 (#2358, #2391)
 
-
 Version 0.10.2 (October 16, 2021)
 ---------------------------------
 
@@ -141,7 +175,6 @@ Small bug-fix release:
 - Fix ``unary_union`` to correctly handle a GeoSeries with missing values (#2181).
 - Avoid internal deprecation warning in ``clip()`` (#2179).
 
-
 Version 0.10.1 (October 8, 2021)
 --------------------------------
 
@@ -150,7 +183,6 @@ Small bug-fix release:
 - Fix regression in ``overlay()`` with non-overlapping geometries and a
   non-default ``how`` (i.e. not "intersection") (#2157).
 
-
 Version 0.10.0 (October 3, 2021)
 --------------------------------
 
@@ -187,7 +219,7 @@ New features and improvements:
 - Improved heuristic to decide how many decimals to show in the repr based on
   whether the CRS is projected or geographic (#1895).
 - Switched the default for ``geocode()`` from GeoCode.Farm to the Photon
-  geocoding API (https://photon.komoot.io) (#2007).
+  geocoding API (<https://photon.komoot.io>) (#2007).
 
 Deprecations and compatibility notes:
 
@@ -237,7 +269,6 @@ Notes on (optional) dependencies:
 - Compatibility fixes for the latest PyGEOS (#1872, #2014) and matplotlib
   (colorbar issue, #2066).
 
-
 Version 0.9.0 (February 28, 2021)
 ---------------------------------
 
@@ -354,13 +385,11 @@ Notes on (optional) dependencies:
   is still a default requirement) (#1775).
 - Compatibility with the upcoming Shapely 1.8 (#1659, #1662, #1819).
 
-
 Version 0.8.2 (January 25, 2021)
 --------------------------------
 
 Small bug-fix release for compatibility with PyGEOS 0.9.
 
-
 Version 0.8.1 (July 15, 2020)
 -----------------------------
 
@@ -372,7 +401,6 @@ Small bug-fix release:
 - Fix the un-pickling with ``pd.read_pickle`` of files written with older
   GeoPandas versions (#1511).
 
-
 Version 0.8.0 (June 24, 2020)
 -----------------------------
 
@@ -471,7 +499,6 @@ And we now have a [Code of Conduct](https://github.com/geopandas/geopandas/blob/
 GeoPandas 0.8.0 is the last release to support Python 3.5. The next release
 will require Python 3.6, pandas 0.24, numpy 1.15 and shapely 1.6 or higher.
 
-
 Version 0.7.0 (February 16, 2020)
 ---------------------------------
 
@@ -516,7 +543,6 @@ Bug fixes:
 - Fixed the ``geopandas.sjoin`` function to handle MultiIndex correctly (#1159).
 - Fixed the ``geopandas.sjoin`` function to preserve the index name of the left GeoDataFrame (#1150).
 
-
 Version 0.6.3 (February 6, 2020)
 ---------------------------------
 
@@ -527,7 +553,6 @@ Small bug-fix release:
   no missing values in the geometry column. This should make it easier to fill
   the numerical columns of the GeoDataFrame (#1279).
 
-
 Version 0.6.2 (November 18, 2019)
 ---------------------------------
 
@@ -540,7 +565,6 @@ Small bug-fix release fixing a few regressions:
 - Fix filtering of a GeoDataFrame to preserve the index type when ending up
   with an empty result (#1190).
 
-
 Version 0.6.1 (October 12, 2019)
 --------------------------------
 
@@ -549,7 +573,6 @@ Small bug-fix release fixing a few regressions:
 - Fix ``astype`` when converting to string with Multi geometries (#1145) or when converting a dataframe without geometries (#1144).
 - Fix ``GeoSeries.fillna`` to accept ``np.nan`` again (#1149).
 
-
 Version 0.6.0 (September 27, 2019)
 ----------------------------------
 
@@ -590,10 +613,8 @@ Bug fixes:
 - Fixed ``GeoDataFrame.to_file`` to preserve VFS file paths (e.g. when a "s3://" path is specified) (#1124).
 - Fixed failing case in ``geopandas.sjoin`` with empty geometries (#1138).
 
-
 In addition, the minimum required versions of some dependencies have been increased: GeoPandas now requirs pandas >=0.23.4 and matplotlib >=2.0.1 (#1002).
 
-
 Version 0.5.1 (July 11, 2019)
 -----------------------------
 
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index 76bbf2fb..9a2562a0 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -32,6 +32,9 @@ In particular, when submitting a pull request:
   line of a docstring should be a standalone summary. Parameters and
   return values should be documented explicitly.
 
+- Unless your PR implements minor changes or internal work only, make sure
+  it contains a note describing the changes in the `CHANGELOG.md` file.
+
 Improving the documentation and testing for code already in GeoPandas
 is a great way to get started if you'd like to make a contribution.
 
diff --git a/LICENSE.txt b/LICENSE.txt
index 7eb8134b..028603be 100644
--- a/LICENSE.txt
+++ b/LICENSE.txt
@@ -1,4 +1,4 @@
-Copyright (c) 2013-2016, GeoPandas developers.
+Copyright (c) 2013-2022, GeoPandas developers.
 All rights reserved.
 
 Redistribution and use in source and binary forms, with or without
@@ -9,7 +9,7 @@ modification, are permitted provided that the following conditions are met:
  * Redistributions in binary form must reproduce the above copyright notice,
    this list of conditions and the following disclaimer in the documentation
    and/or other materials provided with the distribution.
- * Neither the name of Enthought, Inc. nor the names of its contributors may
+ * Neither the name of GeoPandas nor the names of its contributors may
    be used to endorse or promote products derived from this software without
    specific prior written permission.
 
diff --git a/ci/envs/310-dev.yaml b/ci/envs/310-dev.yaml
index e1d5e7ed..0c250d6b 100644
--- a/ci/envs/310-dev.yaml
+++ b/ci/envs/310-dev.yaml
@@ -6,7 +6,6 @@ dependencies:
   - cython
   # required
   - shapely
-  - fiona
   - pyproj
   - geos
   - packaging
@@ -28,6 +27,7 @@ dependencies:
     # dev versions of packages
     - --pre --extra-index https://pypi.anaconda.org/scipy-wheels-nightly/simple
     - numpy
+    - fiona
     - git+https://github.com/pandas-dev/pandas.git@main
     - git+https://github.com/matplotlib/matplotlib.git@main
     # - git+https://github.com/Toblerity/Shapely.git@main
diff --git a/doc/environment.yml b/doc/environment.yml
index bd8b4aef..301d10a9 100644
--- a/doc/environment.yml
+++ b/doc/environment.yml
@@ -2,44 +2,44 @@ name: geopandas_docs
 channels:
   - conda-forge
 dependencies:
-  - python=3.9.7
-  - pandas=1.3.2
-  - shapely=1.7.1
-  - fiona=1.8.20
-  - pyproj=3.2.1
-  - rtree=0.9.7
-  - geopy=2.2.0
-  - matplotlib=3.4.3
-  - mapclassify=2.4.3
-  - sphinx=4.2.0
-  - pydata-sphinx-theme=0.6.3
-  - numpydoc=1.1.0
-  - ipython=7.27.0
-  - pillow=8.3.2
-  - mock=4.0.3
-  - cartopy=0.20.0
-  - pyepsg=0.4.0
-  - contextily=1.1.0
-  - rasterio=1.2.8
-  - geoplot=0.4.4
-  - sphinx-gallery=0.9.0
-  - jinja2=3.0.1
-  - doc2dash=2.3.0
-  - matplotlib-scalebar=0.7.2
+  - python
+  - pandas
+  - shapely
+  - fiona
+  - pyproj
+  - rtree
+  - geopy
+  - matplotlib
+  - mapclassify
+  - sphinx
+  - pydata-sphinx-theme
+  - numpydoc
+  - ipython
+  - pillow
+  - mock
+  - cartopy
+  - pyepsg
+  - contextily
+  - rasterio
+  - geoplot
+  - sphinx-gallery
+  - jinja2
+  - doc2dash
+  - matplotlib-scalebar
   # specify additional dependencies to reduce solving for conda
-  - gdal=3.3.2
-  - libgdal=3.3.2
-  - proj=8.0.1
-  - geos=3.9.1
-  - nbsphinx=0.8.7
-  - jupyter_client=7.0.3
-  - ipykernel=6.4.1
-  - myst-parser=0.15.2
-  - folium=0.12.0
-  - libpysal=4.5.1
-  - pygeos=0.10.2
-  - xyzservices=2021.9.1
-  - packaging=21.0
+  - gdal
+  - libgdal
+  - proj
+  - geos
+  - nbsphinx
+  - jupyter_client
+  - ipykernel
+  - myst-parser
+  - folium
+  - libpysal
+  - pygeos
+  - xyzservices
+  - packaging
   - pip
   - pip:
       - sphinx-toggleprompt
diff --git a/doc/source/_static/binary_geo-difference.svg b/doc/source/_static/binary_geo-difference.svg
index d430d257..bff9f67a 100644
--- a/doc/source/_static/binary_geo-difference.svg
+++ b/doc/source/_static/binary_geo-difference.svg
@@ -1,1 +1,1 @@
-<svg xmlns="http://www.w3.org/2000/svg" width="105.44mm" height="35.61mm" viewBox="0 0 298.88 100.95"><line x1="120.15" y1="48.9" x2="162.49" y2="48.9" style="fill:none;stroke:#1d1d1b;stroke-miterlimit:10"/><polygon points="161.03 53.89 169.67 48.9 161.03 43.91 161.03 53.89" style="fill:#1d1d1b"/><circle cx="45.9" cy="48.9" r="34.98" style="fill:#e21c84;stroke:#fff;stroke-miterlimit:10;opacity:0.4"/><circle cx="80.88" cy="48.9" r="34.98" style="fill:#0f9c5a;stroke:#fff;stroke-miterlimit:10;opacity:0.6"/><g style="opacity:0.8"><circle cx="214.68" cy="48.9" r="34.98" style="fill:none;stroke:#fec905;stroke-miterlimit:10;stroke-dasharray:1.9972946643829346,1.9972946643829346"/></g><g style="opacity:0.8"><circle cx="249.65" cy="48.9" r="34.98" style="fill:none;stroke:#fec905;stroke-miterlimit:10;stroke-dasharray:1.9972946643829346,1.9972946643829346"/></g><path d="M214.68,48.9a35,35,0,0,1,17.48-30.29,35,35,0,1,0,0,60.57A34.93,34.93,0,0,1,214.68,48.9Z" style="fill:#fec905;opacity:0.8"/></svg>
\ No newline at end of file
+<svg xmlns="http://www.w3.org/2000/svg" width="105.44mm" height="35.61mm" viewBox="0 0 298.88 100.95"><line x1="120.15" y1="48.9" x2="162.49" y2="48.9" style="fill:none;stroke:#139c5a;stroke-miterlimit:10"/><polygon points="161.03 53.89 169.67 48.9 161.03 43.91 161.03 53.89" style="fill:#139c5a"/><circle cx="45.9" cy="48.9" r="34.98" style="fill:#e21c84;stroke:#fff;stroke-miterlimit:10;opacity:0.4"/><circle cx="80.88" cy="48.9" r="34.98" style="fill:#0f9c5a;stroke:#fff;stroke-miterlimit:10;opacity:0.6"/><g style="opacity:0.8"><circle cx="214.68" cy="48.9" r="34.98" style="fill:none;stroke:#fec905;stroke-miterlimit:10;stroke-dasharray:1.9972946643829346,1.9972946643829346"/></g><g style="opacity:0.8"><circle cx="249.65" cy="48.9" r="34.98" style="fill:none;stroke:#fec905;stroke-miterlimit:10;stroke-dasharray:1.9972946643829346,1.9972946643829346"/></g><path d="M214.68,48.9a35,35,0,0,1,17.48-30.29,35,35,0,1,0,0,60.57A34.93,34.93,0,0,1,214.68,48.9Z" style="fill:#fec905;opacity:0.8"/></svg>
\ No newline at end of file
diff --git a/doc/source/_static/binary_geo-intersection.svg b/doc/source/_static/binary_geo-intersection.svg
index 2a06f5b6..97b10887 100644
--- a/doc/source/_static/binary_geo-intersection.svg
+++ b/doc/source/_static/binary_geo-intersection.svg
@@ -1,1 +1,1 @@
-<svg xmlns="http://www.w3.org/2000/svg" width="105.44mm" height="35.61mm" viewBox="0 0 298.88 100.95"><g style="opacity:0.8"><circle cx="214.68" cy="51.28" r="34.98" transform="matrix(0.94, -0.33, 0.33, 0.94, -4.87, 73.95)" style="fill:none;stroke:#fec905;stroke-miterlimit:10;stroke-dasharray:1.9972946643829346,1.9972946643829346"/></g><g style="opacity:0.8"><circle cx="249.65" cy="51.28" r="34.98" transform="translate(74.78 236.69) rotate(-58.28)" style="fill:none;stroke:#fec905;stroke-miterlimit:10;stroke-dasharray:1.9972946643829346,1.9972946643829346"/></g><line x1="120.15" y1="51.28" x2="162.49" y2="51.28" style="fill:none;stroke:#1d1d1b;stroke-miterlimit:10"/><polygon points="161.03 56.27 169.67 51.28 161.03 46.3 161.03 56.27" style="fill:#1d1d1b"/><circle cx="45.9" cy="51.28" r="34.98" style="fill:#e21c84;stroke:#fff;stroke-miterlimit:10;opacity:0.4"/><circle cx="80.88" cy="51.28" r="34.98" style="fill:#0f9c5a;stroke:#fff;stroke-miterlimit:10;opacity:0.6"/><ellipse cx="232.16" cy="51.28" rx="17.49" ry="30.29" style="fill:#fec905;opacity:0.8"/></svg>
\ No newline at end of file
+<svg xmlns="http://www.w3.org/2000/svg" width="105.44mm" height="35.61mm" viewBox="0 0 298.88 100.95"><g style="opacity:0.8"><circle cx="214.68" cy="51.28" r="34.98" transform="matrix(0.94, -0.33, 0.33, 0.94, -4.87, 73.95)" style="fill:none;stroke:#fec905;stroke-miterlimit:10;stroke-dasharray:1.9972946643829346,1.9972946643829346"/></g><g style="opacity:0.8"><circle cx="249.65" cy="51.28" r="34.98" transform="translate(74.78 236.69) rotate(-58.28)" style="fill:none;stroke:#fec905;stroke-miterlimit:10;stroke-dasharray:1.9972946643829346,1.9972946643829346"/></g><line x1="120.15" y1="51.28" x2="162.49" y2="51.28" style="fill:none;stroke:#139c5a;stroke-miterlimit:10"/><polygon points="161.03 56.27 169.67 51.28 161.03 46.3 161.03 56.27" style="fill:#139c5a"/><circle cx="45.9" cy="51.28" r="34.98" style="fill:#e21c84;stroke:#fff;stroke-miterlimit:10;opacity:0.4"/><circle cx="80.88" cy="51.28" r="34.98" style="fill:#0f9c5a;stroke:#fff;stroke-miterlimit:10;opacity:0.6"/><ellipse cx="232.16" cy="51.28" rx="17.49" ry="30.29" style="fill:#fec905;opacity:0.8"/></svg>
\ No newline at end of file
diff --git a/doc/source/_static/binary_geo-symm_diff.svg b/doc/source/_static/binary_geo-symm_diff.svg
index f33736b1..567e46c0 100644
--- a/doc/source/_static/binary_geo-symm_diff.svg
+++ b/doc/source/_static/binary_geo-symm_diff.svg
@@ -1,1 +1,1 @@
-<svg xmlns="http://www.w3.org/2000/svg" width="105.44mm" height="35.61mm" viewBox="0 0 298.88 100.95"><g style="opacity:0.8"><circle cx="214.68" cy="51.28" r="34.98" transform="matrix(0.94, -0.33, 0.33, 0.94, -4.87, 73.95)" style="fill:none;stroke:#fec905;stroke-miterlimit:10;stroke-dasharray:1.9972946643829346,1.9972946643829346"/></g><g style="opacity:0.8"><circle cx="249.65" cy="51.28" r="34.98" transform="translate(74.78 236.69) rotate(-58.28)" style="fill:none;stroke:#fec905;stroke-miterlimit:10;stroke-dasharray:1.9972946643829346,1.9972946643829346"/></g><line x1="120.15" y1="51.28" x2="162.49" y2="51.28" style="fill:none;stroke:#1d1d1b;stroke-miterlimit:10"/><polygon points="161.03 56.27 169.67 51.28 161.03 46.3 161.03 56.27" style="fill:#1d1d1b"/><circle cx="45.9" cy="51.28" r="34.98" style="fill:#e21c84;stroke:#fff;stroke-miterlimit:10;opacity:0.4"/><circle cx="80.88" cy="51.28" r="34.98" style="fill:#0f9c5a;stroke:#fff;stroke-miterlimit:10;opacity:0.6"/><g style="opacity:0.8"><path d="M214.68,51.28A35,35,0,0,1,232.16,21a35,35,0,1,0,0,60.57A35,35,0,0,1,214.68,51.28Z" style="fill:#fec905"/><path d="M249.65,16.31A34.81,34.81,0,0,0,232.16,21a35,35,0,0,1,0,60.57,35,35,0,1,0,17.49-65.26Z" style="fill:#fec905"/></g></svg>
\ No newline at end of file
+<svg xmlns="http://www.w3.org/2000/svg" width="105.44mm" height="35.61mm" viewBox="0 0 298.88 100.95"><g style="opacity:0.8"><circle cx="214.68" cy="51.28" r="34.98" transform="matrix(0.94, -0.33, 0.33, 0.94, -4.87, 73.95)" style="fill:none;stroke:#fec905;stroke-miterlimit:10;stroke-dasharray:1.9972946643829346,1.9972946643829346"/></g><g style="opacity:0.8"><circle cx="249.65" cy="51.28" r="34.98" transform="translate(74.78 236.69) rotate(-58.28)" style="fill:none;stroke:#fec905;stroke-miterlimit:10;stroke-dasharray:1.9972946643829346,1.9972946643829346"/></g><line x1="120.15" y1="51.28" x2="162.49" y2="51.28" style="fill:none;stroke:#139c5a;stroke-miterlimit:10"/><polygon points="161.03 56.27 169.67 51.28 161.03 46.3 161.03 56.27" style="fill:#139c5a"/><circle cx="45.9" cy="51.28" r="34.98" style="fill:#e21c84;stroke:#fff;stroke-miterlimit:10;opacity:0.4"/><circle cx="80.88" cy="51.28" r="34.98" style="fill:#0f9c5a;stroke:#fff;stroke-miterlimit:10;opacity:0.6"/><g style="opacity:0.8"><path d="M214.68,51.28A35,35,0,0,1,232.16,21a35,35,0,1,0,0,60.57A35,35,0,0,1,214.68,51.28Z" style="fill:#fec905"/><path d="M249.65,16.31A34.81,34.81,0,0,0,232.16,21a35,35,0,0,1,0,60.57,35,35,0,1,0,17.49-65.26Z" style="fill:#fec905"/></g></svg>
\ No newline at end of file
diff --git a/doc/source/_static/binary_geo-union.svg b/doc/source/_static/binary_geo-union.svg
index 1c6901ad..34aeda2f 100644
--- a/doc/source/_static/binary_geo-union.svg
+++ b/doc/source/_static/binary_geo-union.svg
@@ -1,1 +1,1 @@
-<svg xmlns="http://www.w3.org/2000/svg" width="105.44mm" height="35.61mm" viewBox="0 0 298.88 100.95"><g style="opacity:0.8"><circle cx="214.68" cy="50.49" r="34.98" transform="matrix(0.94, -0.33, 0.33, 0.94, -4.61, 73.91)" style="fill:none;stroke:#fec905;stroke-miterlimit:10;stroke-dasharray:1.9972946643829346,1.9972946643829346"/></g><g style="opacity:0.8"><circle cx="249.65" cy="50.49" r="34.98" transform="translate(75.45 236.31) rotate(-58.28)" style="fill:none;stroke:#fec905;stroke-miterlimit:10;stroke-dasharray:1.9972946643829346,1.9972946643829346"/></g><line x1="120.15" y1="50.49" x2="162.49" y2="50.49" style="fill:none;stroke:#1d1d1b;stroke-miterlimit:10"/><polygon points="161.03 55.48 169.67 50.49 161.03 45.5 161.03 55.48" style="fill:#1d1d1b"/><circle cx="45.9" cy="50.49" r="34.98" style="fill:#e21c84;stroke:#fff;stroke-miterlimit:10;opacity:0.4"/><circle cx="80.88" cy="50.49" r="34.98" style="fill:#0f9c5a;stroke:#fff;stroke-miterlimit:10;opacity:0.6"/><path d="M249.65,15.51a34.91,34.91,0,0,0-17.49,4.69,35,35,0,1,0,0,60.57,35,35,0,1,0,17.49-65.26Z" style="fill:#fec905;opacity:0.8"/></svg>
\ No newline at end of file
+<svg xmlns="http://www.w3.org/2000/svg" width="105.44mm" height="35.61mm" viewBox="0 0 298.88 100.95"><g style="opacity:0.8"><circle cx="214.68" cy="50.49" r="34.98" transform="matrix(0.94, -0.33, 0.33, 0.94, -4.61, 73.91)" style="fill:none;stroke:#fec905;stroke-miterlimit:10;stroke-dasharray:1.9972946643829346,1.9972946643829346"/></g><g style="opacity:0.8"><circle cx="249.65" cy="50.49" r="34.98" transform="translate(75.45 236.31) rotate(-58.28)" style="fill:none;stroke:#fec905;stroke-miterlimit:10;stroke-dasharray:1.9972946643829346,1.9972946643829346"/></g><line x1="120.15" y1="50.49" x2="162.49" y2="50.49" style="fill:none;stroke:#139c5a;stroke-miterlimit:10"/><polygon points="161.03 55.48 169.67 50.49 161.03 45.5 161.03 55.48" style="fill:#139c5a"/><circle cx="45.9" cy="50.49" r="34.98" style="fill:#e21c84;stroke:#fff;stroke-miterlimit:10;opacity:0.4"/><circle cx="80.88" cy="50.49" r="34.98" style="fill:#0f9c5a;stroke:#fff;stroke-miterlimit:10;opacity:0.6"/><path d="M249.65,15.51a34.91,34.91,0,0,0-17.49,4.69,35,35,0,1,0,0,60.57,35,35,0,1,0,17.49-65.26Z" style="fill:#fec905;opacity:0.8"/></svg>
\ No newline at end of file
diff --git a/doc/source/_static/binary_op-01.svg b/doc/source/_static/binary_op-01.svg
index 3bedcb66..52a6cb06 100644
--- a/doc/source/_static/binary_op-01.svg
+++ b/doc/source/_static/binary_op-01.svg
@@ -1,1 +1,1 @@
-<svg xmlns="http://www.w3.org/2000/svg" width="115.16mm" height="58.15mm" viewBox="0 0 326.44 164.84"><rect x="5.24" y="27.78" width="38.2" height="19.1" style="fill:#0f9c5a;stroke:#fff;stroke-miterlimit:10;opacity:0.2"/><rect x="5.24" y="46.88" width="38.2" height="19.1" style="fill:#0f9c5a;stroke:#fff;stroke-miterlimit:10;opacity:0.4"/><rect x="5.24" y="65.98" width="38.2" height="19.1" style="fill:#0f9c5a;stroke:#fff;stroke-miterlimit:10;opacity:0.6"/><rect x="5.24" y="85.08" width="38.2" height="19.1" style="fill:#0f9c5a;stroke:#fff;stroke-miterlimit:10;opacity:0.8"/><rect x="5.24" y="104.19" width="38.2" height="19.1" style="fill:#0f9c5a;stroke:#fff;stroke-miterlimit:10"/><rect x="48.04" y="27.78" width="83.41" height="19.1" style="fill:#e21c84;stroke:#fff;stroke-miterlimit:10;opacity:0.2"/><rect x="48.04" y="8.68" width="83.41" height="19.1" style="fill:#e21c84;stroke:#fff;stroke-miterlimit:10;opacity:0.4"/><rect x="48.04" y="46.88" width="83.41" height="19.1" style="fill:#e21c84;stroke:#fff;stroke-miterlimit:10;opacity:0.2"/><rect x="48.04" y="65.98" width="83.41" height="19.1" style="fill:#e21c84;stroke:#fff;stroke-miterlimit:10;opacity:0.2"/><rect x="48.04" y="85.08" width="83.41" height="19.1" style="fill:#e21c84;stroke:#fff;stroke-miterlimit:10;opacity:0.2"/><rect x="48.04" y="104.19" width="83.41" height="19.1" style="fill:#e21c84;stroke:#fff;stroke-miterlimit:10;opacity:0.2"/><rect x="194.49" y="27.78" width="38.2" height="19.1" style="fill:#0f9c5a;stroke:#fff;stroke-miterlimit:10;opacity:0.2"/><rect x="194.49" y="46.88" width="38.2" height="19.1" style="fill:#0f9c5a;stroke:#fff;stroke-miterlimit:10;opacity:0.4"/><rect x="194.49" y="65.98" width="38.2" height="19.1" style="fill:#0f9c5a;stroke:#fff;stroke-miterlimit:10;opacity:0.6"/><rect x="194.49" y="85.08" width="38.2" height="19.1" style="fill:#0f9c5a;stroke:#fff;stroke-miterlimit:10;opacity:0.8"/><rect x="194.49" y="104.19" width="38.2" height="19.1" style="fill:#0f9c5a;stroke:#fff;stroke-miterlimit:10"/><rect x="237.29" y="27.78" width="83.41" height="19.1" style="fill:#e21c84;stroke:#fff;stroke-miterlimit:10;opacity:0.2"/><rect x="237.29" y="8.68" width="83.41" height="19.1" style="fill:#e21c84;stroke:#fff;stroke-miterlimit:10;opacity:0.4"/><rect x="237.29" y="46.88" width="83.41" height="19.1" style="fill:#e21c84;stroke:#fff;stroke-miterlimit:10;opacity:0.2"/><rect x="237.29" y="65.98" width="83.41" height="19.1" style="fill:#e21c84;stroke:#fff;stroke-miterlimit:10;opacity:0.2"/><rect x="237.29" y="85.08" width="83.41" height="19.1" style="fill:#e21c84;stroke:#fff;stroke-miterlimit:10;opacity:0.2"/><rect x="237.29" y="104.19" width="83.41" height="19.1" style="fill:#e21c84;stroke:#fff;stroke-miterlimit:10;opacity:0.2"/><line x1="138.48" y1="37.33" x2="180.83" y2="37.33" style="fill:none;stroke:#1d1d1b;stroke-miterlimit:10"/><polygon points="179.37 42.32 188 37.33 179.37 32.35 179.37 42.32" style="fill:#1d1d1b"/><line x1="138.48" y1="56.43" x2="180.83" y2="56.43" style="fill:none;stroke:#1d1d1b;stroke-miterlimit:10"/><polygon points="179.37 61.42 188 56.43 179.37 51.45 179.37 61.42" style="fill:#1d1d1b"/><line x1="138.48" y1="75.53" x2="180.83" y2="75.53" style="fill:none;stroke:#1d1d1b;stroke-miterlimit:10"/><polygon points="179.37 80.52 188 75.53 179.37 70.55 179.37 80.52" style="fill:#1d1d1b"/><line x1="138.48" y1="94.64" x2="180.83" y2="94.64" style="fill:none;stroke:#1d1d1b;stroke-miterlimit:10"/><polygon points="179.37 99.62 188 94.64 179.37 89.65 179.37 99.62" style="fill:#1d1d1b"/><line x1="138.48" y1="113.74" x2="180.83" y2="113.74" style="fill:none;stroke:#1d1d1b;stroke-miterlimit:10"/><polygon points="179.37 118.72 188 113.74 179.37 108.75 179.37 118.72" style="fill:#1d1d1b"/><rect x="3.19" y="25.4" width="42.25" height="99.95" style="fill:none;stroke:#1d1d1b;stroke-miterlimit:10;stroke-width:0.5px"/><path d="M7.38,143.15H9.76v-4.21H7.68v-1.19H11v5.4H13v1.2H7.38Zm1.9-7.21a.73.73,0,0,1,.22-.56.84.84,0,0,1,.59-.21h.29a.84.84,0,0,1,.6.21.77.77,0,0,1,.22.56.75.75,0,0,1-.22.55.85.85,0,0,1-.61.2h-.28a.83.83,0,0,1-.59-.2A.71.71,0,0,1,9.28,135.94Z" style="fill:#1d1d1b"/><path d="M14.46,137.75h1.25v1.14h.11a1.48,1.48,0,0,1,.59-.94,2,2,0,0,1,1.17-.32,2.4,2.4,0,0,1,.92.17,1.89,1.89,0,0,1,.68.49,2.13,2.13,0,0,1,.43.75,3,3,0,0,1,.14,1v4.34H18.43v-4.16a1.5,1.5,0,0,0-.34-1.06,1.27,1.27,0,0,0-1-.37,1.28,1.28,0,0,0-1,.39,1.57,1.57,0,0,0-.36,1.08v4.12H14.46Z" style="fill:#1d1d1b"/><path d="M21.54,140.21a3.49,3.49,0,0,1,.16-1.07,2.29,2.29,0,0,1,.46-.81,1.85,1.85,0,0,1,.71-.52,2.34,2.34,0,0,1,.93-.18A2,2,0,0,1,25,138a1.47,1.47,0,0,1,.61.93h.11l0-.41c0-.12,0-.24,0-.38s0-.25,0-.35v-2H27v8.64H25.71v-1.14H25.6a1.47,1.47,0,0,1-.61.93,2,2,0,0,1-1.19.33,2.34,2.34,0,0,1-.93-.18,1.85,1.85,0,0,1-.71-.52,2.25,2.25,0,0,1-.46-.82,3.6,3.6,0,0,1-.16-1.08Zm1.32,0v1.62a1.49,1.49,0,0,0,.38,1.07,1.35,1.35,0,0,0,1,.4,1.28,1.28,0,0,0,1-.4,1.45,1.45,0,0,0,.37-1v-1.64a1.47,1.47,0,0,0-.37-1.06,1.3,1.3,0,0,0-1-.4,1.38,1.38,0,0,0-1,.39A1.49,1.49,0,0,0,22.86,140.23Z" style="fill:#1d1d1b"/><path d="M28.74,140.19a3,3,0,0,1,.19-1.07,2.27,2.27,0,0,1,.56-.8,2.5,2.5,0,0,1,.87-.51,3.51,3.51,0,0,1,1.15-.18,3.43,3.43,0,0,1,1.15.18,2.5,2.5,0,0,1,.87.51,2.24,2.24,0,0,1,.55.8,2.8,2.8,0,0,1,.19,1.07v1.21H30.05v.47a1.49,1.49,0,0,0,.39,1.1,1.46,1.46,0,0,0,1.07.4,2.34,2.34,0,0,0,.88-.16,1,1,0,0,0,.54-.47h1.3a2.29,2.29,0,0,1-.35.72,2.23,2.23,0,0,1-.6.54,2.77,2.77,0,0,1-.8.35,3.74,3.74,0,0,1-1,.12,3.41,3.41,0,0,1-1.14-.18,2.38,2.38,0,0,1-.87-.52,2.22,2.22,0,0,1-.56-.81,2.74,2.74,0,0,1-.2-1.06Zm1.31.25H33v-.25a1.35,1.35,0,0,0-1.47-1.46,1.34,1.34,0,0,0-1.46,1.46Z" style="fill:#1d1d1b"/><path d="M38,141l-2.23-3.2h1.53l1.23,1.86a1.05,1.05,0,0,1,.15.3.43.43,0,0,1,0,.13h.06a.43.43,0,0,1,0-.13,1,1,0,0,1,.15-.3l1.24-1.86H41.7l-2.22,3.19,2.37,3.41H40.31l-1.33-2a.59.59,0,0,1-.1-.17l-.07-.14-.06-.14h-.07s0,.1-.06.15l-.06.14a1.4,1.4,0,0,1-.1.16l-1.35,2H35.58Z" style="fill:#1d1d1b"/><rect x="46.28" y="6.23" width="86.81" height="119.12" style="fill:none;stroke:#1d1d1b;stroke-miterlimit:10;stroke-width:0.5px"/><path d="M135.05,144.47a3.23,3.23,0,0,1-1.15-.19,2.52,2.52,0,0,1-.87-.52,2.36,2.36,0,0,1-.55-.83,2.6,2.6,0,0,1-.2-1.06v-1.65a2.65,2.65,0,0,1,.2-1.07,2.32,2.32,0,0,1,.55-.82,2.54,2.54,0,0,1,.87-.53,3.76,3.76,0,0,1,2.3,0,2.38,2.38,0,0,1,.87.52,2.32,2.32,0,0,1,.55.82,2.59,2.59,0,0,1,.2,1.07v1.66a2.83,2.83,0,0,1-.19,1.07,2.24,2.24,0,0,1-.55.82,2.34,2.34,0,0,1-.88.52A3.23,3.23,0,0,1,135.05,144.47Zm-1.45-2.6a1.5,1.5,0,0,0,2.51,1,1.4,1.4,0,0,0,.39-1v-1.65a1.39,1.39,0,0,0-.39-1.05,1.64,1.64,0,0,0-2.12,0,1.39,1.39,0,0,0-.39,1.05Z" style="fill:#1d1d1b"/><path d="M139.61,137.75h1.26v1.14h.1a1.46,1.46,0,0,1,.6-.93,2.07,2.07,0,0,1,1.2-.33,2.32,2.32,0,0,1,.92.18,1.85,1.85,0,0,1,.71.52,2.29,2.29,0,0,1,.46.81,3.21,3.21,0,0,1,.16,1.07v1.66a3.31,3.31,0,0,1-.16,1.08,2.25,2.25,0,0,1-.46.82,1.85,1.85,0,0,1-.71.52,2.32,2.32,0,0,1-.92.18,2.07,2.07,0,0,1-1.2-.33,1.46,1.46,0,0,1-.6-.93h-.1a1,1,0,0,0,0,.13,2.33,2.33,0,0,1,0,.29c0,.11,0,.23,0,.36s0,.25,0,.36v2h-1.32Zm1.32,2.48v1.64a1.45,1.45,0,0,0,.37,1,1.25,1.25,0,0,0,1,.4,1.33,1.33,0,0,0,1-.4,1.45,1.45,0,0,0,.38-1.07v-1.62a1.45,1.45,0,0,0-.38-1.07,1.36,1.36,0,0,0-1-.39,1.28,1.28,0,0,0-1,.4A1.47,1.47,0,0,0,140.93,140.23Z" style="fill:#1d1d1b"/><path d="M146.68,140.19a2.8,2.8,0,0,1,.19-1.07,2.24,2.24,0,0,1,.55-.8,2.46,2.46,0,0,1,.88-.51,3.43,3.43,0,0,1,1.15-.18,3.47,3.47,0,0,1,1.15.18,2.6,2.6,0,0,1,.87.51,2.24,2.24,0,0,1,.55.8,3,3,0,0,1,.19,1.07v1.21H148v.47a1.46,1.46,0,0,0,.4,1.1,1.44,1.44,0,0,0,1.07.4,2.29,2.29,0,0,0,.87-.16,1,1,0,0,0,.54-.47h1.3a2.1,2.1,0,0,1-.35.72,2.35,2.35,0,0,1-.59.54,2.9,2.9,0,0,1-.8.35,3.85,3.85,0,0,1-1,.12,3.43,3.43,0,0,1-1.15-.18,2.38,2.38,0,0,1-.87-.52,2.2,2.2,0,0,1-.55-.81,2.57,2.57,0,0,1-.2-1.06Zm1.3.25h2.93v-.25a1.52,1.52,0,0,0-2.54-1.07,1.42,1.42,0,0,0-.39,1.07Z" style="fill:#1d1d1b"/><path d="M155.52,137.75v1.14h.11a1.45,1.45,0,0,1,.62-.93,2.11,2.11,0,0,1,1.22-.33,2.15,2.15,0,0,1,1.65.65,2.61,2.61,0,0,1,.6,1.82v.43h-1.35v-.3a1.5,1.5,0,0,0-.38-1.08,1.32,1.32,0,0,0-1-.39,1.3,1.3,0,0,0-1,.39,1.53,1.53,0,0,0-.38,1.08v4.12h-1.32v-6.6Z" style="fill:#1d1d1b"/><path d="M160.92,142.47a1.9,1.9,0,0,1,.67-1.53,2.71,2.71,0,0,1,1.8-.56h1.79v-.55a1,1,0,0,0-.36-.83,1.67,1.67,0,0,0-1-.29,1.82,1.82,0,0,0-.88.19.9.9,0,0,0-.48.52h-1.29a1.94,1.94,0,0,1,.87-1.31,3.17,3.17,0,0,1,1.79-.48,3.1,3.1,0,0,1,2,.58,1.91,1.91,0,0,1,.72,1.58v4.56h-1.22v-1.28h-.1a1.56,1.56,0,0,1-.7,1,2.51,2.51,0,0,1-1.41.38,2.18,2.18,0,0,1-1.57-.55A1.92,1.92,0,0,1,160.92,142.47Zm1.32-.11a1,1,0,0,0,.33.78,1.37,1.37,0,0,0,.91.27,2.43,2.43,0,0,0,.68-.09,2,2,0,0,0,.54-.27,1.4,1.4,0,0,0,.36-.41,1.13,1.13,0,0,0,.12-.51v-.83h-1.77a1.24,1.24,0,0,0-.86.28A1,1,0,0,0,162.24,142.36Z" style="fill:#1d1d1b"/><path d="M168.07,137.75h1.86v-2h1.32v2h2.53v1.19h-2.53v3.51a.69.69,0,0,0,.19.51.73.73,0,0,0,.54.19h1.68v1.2h-1.74a2,2,0,0,1-1.45-.52,1.81,1.81,0,0,1-.54-1.38v-3.51h-1.86Z" style="fill:#1d1d1b"/><path d="M175.72,143.15h2.37v-4.21H176v-1.19h3.36v5.4h1.93v1.2h-5.59Zm1.89-7.21a.77.77,0,0,1,.22-.56.84.84,0,0,1,.6-.21h.29a.84.84,0,0,1,.59.21.73.73,0,0,1,.22.56.71.71,0,0,1-.22.55.85.85,0,0,1-.61.2h-.27a.84.84,0,0,1-.6-.2A.75.75,0,0,1,177.61,135.94Z" style="fill:#1d1d1b"/><path d="M185.45,144.47a3.19,3.19,0,0,1-1.15-.19,2.52,2.52,0,0,1-.87-.52,2.36,2.36,0,0,1-.55-.83,2.6,2.6,0,0,1-.2-1.06v-1.65a2.65,2.65,0,0,1,.2-1.07,2.32,2.32,0,0,1,.55-.82,2.54,2.54,0,0,1,.87-.53,3.43,3.43,0,0,1,1.15-.18,3.47,3.47,0,0,1,1.15.18,2.46,2.46,0,0,1,.87.52,2.32,2.32,0,0,1,.55.82,2.76,2.76,0,0,1,.2,1.07v1.66a2.83,2.83,0,0,1-.19,1.07,2.24,2.24,0,0,1-.55.82,2.42,2.42,0,0,1-.88.52A3.23,3.23,0,0,1,185.45,144.47Zm-1.45-2.6a1.4,1.4,0,0,0,.38,1,1.65,1.65,0,0,0,2.13,0,1.4,1.4,0,0,0,.39-1v-1.65a1.39,1.39,0,0,0-.39-1.05,1.64,1.64,0,0,0-2.12,0,1.39,1.39,0,0,0-.39,1.05Z" style="fill:#1d1d1b"/><path d="M190,137.75h1.24v1.14h.11a1.52,1.52,0,0,1,.59-.94,2,2,0,0,1,1.18-.32,2.34,2.34,0,0,1,.91.17,2,2,0,0,1,.69.49,2,2,0,0,1,.42.75,3,3,0,0,1,.15,1v4.34H194v-4.16a1.5,1.5,0,0,0-.35-1.06,1.24,1.24,0,0,0-1-.37,1.26,1.26,0,0,0-1,.39,1.57,1.57,0,0,0-.36,1.08v4.12H190Z" style="fill:#1d1d1b"/><path d="M61.67,140.17a3.51,3.51,0,0,1,.15-1,2.33,2.33,0,0,1,.46-.8,2.05,2.05,0,0,1,.72-.51,2.34,2.34,0,0,1,.93-.18,2.1,2.1,0,0,1,1.23.35,1.56,1.56,0,0,1,.63,1h.09v-1.2h1.25V144a2.3,2.3,0,0,1-.72,1.79,2.83,2.83,0,0,1-2,.65h-1.7v-1.13h1.7a1.36,1.36,0,0,0,1-.35,1.27,1.27,0,0,0,.37-1v-.22l.05-1.2h-.08a1.61,1.61,0,0,1-.65,1,2,2,0,0,1-1.22.35,2.34,2.34,0,0,1-.93-.18,2.11,2.11,0,0,1-.71-.51,2.31,2.31,0,0,1-.45-.8,3.13,3.13,0,0,1-.16-1.05ZM63,141.29a1.31,1.31,0,0,0,1.4,1.42,1.31,1.31,0,0,0,1.42-1.42v-1.1a1.31,1.31,0,0,0-1.42-1.42,1.31,1.31,0,0,0-1.4,1.42Z" style="fill:#1d1d1b"/><path d="M68.91,140.19a3,3,0,0,1,.19-1.07,2.27,2.27,0,0,1,.56-.8,2.5,2.5,0,0,1,.87-.51,3.51,3.51,0,0,1,1.15-.18,3.43,3.43,0,0,1,1.15.18,2.5,2.5,0,0,1,.87.51,2.12,2.12,0,0,1,.55.8,2.79,2.79,0,0,1,.2,1.07v1.21H70.22v.47a1.49,1.49,0,0,0,.39,1.1,1.46,1.46,0,0,0,1.07.4,2.34,2.34,0,0,0,.88-.16,1,1,0,0,0,.54-.47h1.3a2.1,2.1,0,0,1-.35.72,2.35,2.35,0,0,1-.59.54,3,3,0,0,1-.81.35,3.74,3.74,0,0,1-1,.12,3.41,3.41,0,0,1-1.14-.18,2.38,2.38,0,0,1-.87-.52,2.22,2.22,0,0,1-.56-.81,2.74,2.74,0,0,1-.2-1.06Zm1.31.25h2.93v-.25a1.47,1.47,0,1,0-2.93,0Z" style="fill:#1d1d1b"/><path d="M78.88,144.47a3.17,3.17,0,0,1-1.14-.19,2.52,2.52,0,0,1-.87-.52,2.39,2.39,0,0,1-.56-.83,2.78,2.78,0,0,1-.2-1.06v-1.65a2.83,2.83,0,0,1,.2-1.07,2.35,2.35,0,0,1,.56-.82,2.54,2.54,0,0,1,.87-.53,3.73,3.73,0,0,1,2.29,0,2.38,2.38,0,0,1,.87.52,2.35,2.35,0,0,1,.56.82,2.76,2.76,0,0,1,.2,1.07v1.66a2.83,2.83,0,0,1-.2,1.07,2.12,2.12,0,0,1-.55.82,2.38,2.38,0,0,1-.87.52A3.28,3.28,0,0,1,78.88,144.47Zm-1.45-2.6a1.35,1.35,0,0,0,1.45,1.44,1.45,1.45,0,0,0,1.07-.39,1.4,1.4,0,0,0,.39-1v-1.65a1.39,1.39,0,0,0-.39-1.05,1.65,1.65,0,0,0-2.13,0,1.39,1.39,0,0,0-.39,1.05Z" style="fill:#1d1d1b"/><path d="M83.14,144.35v-6.6h1.1v1h.09a1.24,1.24,0,0,1,.32-.8,1,1,0,0,1,.76-.29.91.91,0,0,1,.72.28,1.62,1.62,0,0,1,.39.81h.08a1.15,1.15,0,0,1,.33-.8,1,1,0,0,1,.77-.29,1.19,1.19,0,0,1,1,.45,1.93,1.93,0,0,1,.37,1.24v5H87.82v-5a1,1,0,0,0-.15-.59.57.57,0,0,0-.46-.2q-.63,0-.63.84v4.92h-1v-5a.94.94,0,0,0-.16-.59.63.63,0,0,0-.48-.2q-.63,0-.63.84v4.92Z" style="fill:#1d1d1b"/><path d="M90.51,140.19a3,3,0,0,1,.19-1.07,2.27,2.27,0,0,1,.56-.8,2.5,2.5,0,0,1,.87-.51,3.51,3.51,0,0,1,1.15-.18,3.43,3.43,0,0,1,1.15.18,2.5,2.5,0,0,1,.87.51,2.12,2.12,0,0,1,.55.8,2.79,2.79,0,0,1,.2,1.07v1.21H91.82v.47a1.49,1.49,0,0,0,.39,1.1,1.46,1.46,0,0,0,1.07.4,2.34,2.34,0,0,0,.88-.16,1,1,0,0,0,.54-.47H96a2.1,2.1,0,0,1-.35.72,2.35,2.35,0,0,1-.59.54,3,3,0,0,1-.81.35,3.74,3.74,0,0,1-1,.12,3.41,3.41,0,0,1-1.14-.18,2.38,2.38,0,0,1-.87-.52,2.22,2.22,0,0,1-.56-.81,2.74,2.74,0,0,1-.2-1.06Zm1.31.25h2.93v-.25a1.35,1.35,0,0,0-1.47-1.46,1.34,1.34,0,0,0-1.46,1.46Z" style="fill:#1d1d1b"/><path d="M97.51,137.75h1.86v-2h1.32v2h2.53v1.19h-2.53v3.51a.66.66,0,0,0,.19.51.73.73,0,0,0,.54.19h1.68v1.2h-1.74a2,2,0,0,1-1.46-.52,1.84,1.84,0,0,1-.53-1.38v-3.51H97.51Z" style="fill:#1d1d1b"/><path d="M106.56,137.75v1.14h.1a1.48,1.48,0,0,1,.62-.93,2.14,2.14,0,0,1,1.22-.33,2.17,2.17,0,0,1,1.66.65,2.61,2.61,0,0,1,.6,1.82v.43H109.4v-.3a1.49,1.49,0,0,0-.37-1.08,1.35,1.35,0,0,0-1-.39,1.33,1.33,0,0,0-1,.39,1.52,1.52,0,0,0-.37,1.08v4.12h-1.32v-6.6Z" style="fill:#1d1d1b"/><path d="M111.79,137.75h1.44l1.39,3.64a4.26,4.26,0,0,1,.15.47,4.31,4.31,0,0,1,.09.44l.06.43h.1a3.28,3.28,0,0,1,0-.43c0-.13.06-.27.09-.43s.09-.32.14-.48l1.3-3.64H118l-3.17,8.64h-1.39l.91-2.46Z" style="fill:#1d1d1b"/></svg>
\ No newline at end of file
+<svg xmlns="http://www.w3.org/2000/svg" width="115.16mm" height="58.15mm" viewBox="0 0 326.44 164.84"><rect x="5.24" y="27.78" width="38.2" height="19.1" style="fill:#0f9c5a;stroke:#fff;stroke-miterlimit:10;opacity:0.2"/><rect x="5.24" y="46.88" width="38.2" height="19.1" style="fill:#0f9c5a;stroke:#fff;stroke-miterlimit:10;opacity:0.4"/><rect x="5.24" y="65.98" width="38.2" height="19.1" style="fill:#0f9c5a;stroke:#fff;stroke-miterlimit:10;opacity:0.6"/><rect x="5.24" y="85.08" width="38.2" height="19.1" style="fill:#0f9c5a;stroke:#fff;stroke-miterlimit:10;opacity:0.8"/><rect x="5.24" y="104.19" width="38.2" height="19.1" style="fill:#0f9c5a;stroke:#fff;stroke-miterlimit:10"/><rect x="48.04" y="27.78" width="83.41" height="19.1" style="fill:#e21c84;stroke:#fff;stroke-miterlimit:10;opacity:0.2"/><rect x="48.04" y="8.68" width="83.41" height="19.1" style="fill:#e21c84;stroke:#fff;stroke-miterlimit:10;opacity:0.4"/><rect x="48.04" y="46.88" width="83.41" height="19.1" style="fill:#e21c84;stroke:#fff;stroke-miterlimit:10;opacity:0.2"/><rect x="48.04" y="65.98" width="83.41" height="19.1" style="fill:#e21c84;stroke:#fff;stroke-miterlimit:10;opacity:0.2"/><rect x="48.04" y="85.08" width="83.41" height="19.1" style="fill:#e21c84;stroke:#fff;stroke-miterlimit:10;opacity:0.2"/><rect x="48.04" y="104.19" width="83.41" height="19.1" style="fill:#e21c84;stroke:#fff;stroke-miterlimit:10;opacity:0.2"/><rect x="194.49" y="27.78" width="38.2" height="19.1" style="fill:#0f9c5a;stroke:#fff;stroke-miterlimit:10;opacity:0.2"/><rect x="194.49" y="46.88" width="38.2" height="19.1" style="fill:#0f9c5a;stroke:#fff;stroke-miterlimit:10;opacity:0.4"/><rect x="194.49" y="65.98" width="38.2" height="19.1" style="fill:#0f9c5a;stroke:#fff;stroke-miterlimit:10;opacity:0.6"/><rect x="194.49" y="85.08" width="38.2" height="19.1" style="fill:#0f9c5a;stroke:#fff;stroke-miterlimit:10;opacity:0.8"/><rect x="194.49" y="104.19" width="38.2" height="19.1" style="fill:#0f9c5a;stroke:#fff;stroke-miterlimit:10"/><rect x="237.29" y="27.78" width="83.41" height="19.1" style="fill:#e21c84;stroke:#fff;stroke-miterlimit:10;opacity:0.2"/><rect x="237.29" y="8.68" width="83.41" height="19.1" style="fill:#e21c84;stroke:#fff;stroke-miterlimit:10;opacity:0.4"/><rect x="237.29" y="46.88" width="83.41" height="19.1" style="fill:#e21c84;stroke:#fff;stroke-miterlimit:10;opacity:0.2"/><rect x="237.29" y="65.98" width="83.41" height="19.1" style="fill:#e21c84;stroke:#fff;stroke-miterlimit:10;opacity:0.2"/><rect x="237.29" y="85.08" width="83.41" height="19.1" style="fill:#e21c84;stroke:#fff;stroke-miterlimit:10;opacity:0.2"/><rect x="237.29" y="104.19" width="83.41" height="19.1" style="fill:#e21c84;stroke:#fff;stroke-miterlimit:10;opacity:0.2"/><line x1="138.48" y1="37.33" x2="180.83" y2="37.33" style="fill:none;stroke:#139c5a;stroke-miterlimit:10"/><polygon points="179.37 42.32 188 37.33 179.37 32.35 179.37 42.32" style="fill:#139c5a"/><line x1="138.48" y1="56.43" x2="180.83" y2="56.43" style="fill:none;stroke:#139c5a;stroke-miterlimit:10"/><polygon points="179.37 61.42 188 56.43 179.37 51.45 179.37 61.42" style="fill:#139c5a"/><line x1="138.48" y1="75.53" x2="180.83" y2="75.53" style="fill:none;stroke:#139c5a;stroke-miterlimit:10"/><polygon points="179.37 80.52 188 75.53 179.37 70.55 179.37 80.52" style="fill:#139c5a"/><line x1="138.48" y1="94.64" x2="180.83" y2="94.64" style="fill:none;stroke:#139c5a;stroke-miterlimit:10"/><polygon points="179.37 99.62 188 94.64 179.37 89.65 179.37 99.62" style="fill:#139c5a"/><line x1="138.48" y1="113.74" x2="180.83" y2="113.74" style="fill:none;stroke:#139c5a;stroke-miterlimit:10"/><polygon points="179.37 118.72 188 113.74 179.37 108.75 179.37 118.72" style="fill:#139c5a"/><rect x="3.19" y="25.4" width="42.25" height="99.95" style="fill:none;stroke:#139c5a;stroke-miterlimit:10;stroke-width:0.5px"/><path d="M7.38,143.15H9.76v-4.21H7.68v-1.19H11v5.4H13v1.2H7.38Zm1.9-7.21a.73.73,0,0,1,.22-.56.84.84,0,0,1,.59-.21h.29a.84.84,0,0,1,.6.21.77.77,0,0,1,.22.56.75.75,0,0,1-.22.55.85.85,0,0,1-.61.2h-.28a.83.83,0,0,1-.59-.2A.71.71,0,0,1,9.28,135.94Z" style="fill:#139c5a"/><path d="M14.46,137.75h1.25v1.14h.11a1.48,1.48,0,0,1,.59-.94,2,2,0,0,1,1.17-.32,2.4,2.4,0,0,1,.92.17,1.89,1.89,0,0,1,.68.49,2.13,2.13,0,0,1,.43.75,3,3,0,0,1,.14,1v4.34H18.43v-4.16a1.5,1.5,0,0,0-.34-1.06,1.27,1.27,0,0,0-1-.37,1.28,1.28,0,0,0-1,.39,1.57,1.57,0,0,0-.36,1.08v4.12H14.46Z" style="fill:#139c5a"/><path d="M21.54,140.21a3.49,3.49,0,0,1,.16-1.07,2.29,2.29,0,0,1,.46-.81,1.85,1.85,0,0,1,.71-.52,2.34,2.34,0,0,1,.93-.18A2,2,0,0,1,25,138a1.47,1.47,0,0,1,.61.93h.11l0-.41c0-.12,0-.24,0-.38s0-.25,0-.35v-2H27v8.64H25.71v-1.14H25.6a1.47,1.47,0,0,1-.61.93,2,2,0,0,1-1.19.33,2.34,2.34,0,0,1-.93-.18,1.85,1.85,0,0,1-.71-.52,2.25,2.25,0,0,1-.46-.82,3.6,3.6,0,0,1-.16-1.08Zm1.32,0v1.62a1.49,1.49,0,0,0,.38,1.07,1.35,1.35,0,0,0,1,.4,1.28,1.28,0,0,0,1-.4,1.45,1.45,0,0,0,.37-1v-1.64a1.47,1.47,0,0,0-.37-1.06,1.3,1.3,0,0,0-1-.4,1.38,1.38,0,0,0-1,.39A1.49,1.49,0,0,0,22.86,140.23Z" style="fill:#139c5a"/><path d="M28.74,140.19a3,3,0,0,1,.19-1.07,2.27,2.27,0,0,1,.56-.8,2.5,2.5,0,0,1,.87-.51,3.51,3.51,0,0,1,1.15-.18,3.43,3.43,0,0,1,1.15.18,2.5,2.5,0,0,1,.87.51,2.24,2.24,0,0,1,.55.8,2.8,2.8,0,0,1,.19,1.07v1.21H30.05v.47a1.49,1.49,0,0,0,.39,1.1,1.46,1.46,0,0,0,1.07.4,2.34,2.34,0,0,0,.88-.16,1,1,0,0,0,.54-.47h1.3a2.29,2.29,0,0,1-.35.72,2.23,2.23,0,0,1-.6.54,2.77,2.77,0,0,1-.8.35,3.74,3.74,0,0,1-1,.12,3.41,3.41,0,0,1-1.14-.18,2.38,2.38,0,0,1-.87-.52,2.22,2.22,0,0,1-.56-.81,2.74,2.74,0,0,1-.2-1.06Zm1.31.25H33v-.25a1.35,1.35,0,0,0-1.47-1.46,1.34,1.34,0,0,0-1.46,1.46Z" style="fill:#139c5a"/><path d="M38,141l-2.23-3.2h1.53l1.23,1.86a1.05,1.05,0,0,1,.15.3.43.43,0,0,1,0,.13h.06a.43.43,0,0,1,0-.13,1,1,0,0,1,.15-.3l1.24-1.86H41.7l-2.22,3.19,2.37,3.41H40.31l-1.33-2a.59.59,0,0,1-.1-.17l-.07-.14-.06-.14h-.07s0,.1-.06.15l-.06.14a1.4,1.4,0,0,1-.1.16l-1.35,2H35.58Z" style="fill:#139c5a"/><rect x="46.28" y="6.23" width="86.81" height="119.12" style="fill:none;stroke:#139c5a;stroke-miterlimit:10;stroke-width:0.5px"/><path d="M135.05,144.47a3.23,3.23,0,0,1-1.15-.19,2.52,2.52,0,0,1-.87-.52,2.36,2.36,0,0,1-.55-.83,2.6,2.6,0,0,1-.2-1.06v-1.65a2.65,2.65,0,0,1,.2-1.07,2.32,2.32,0,0,1,.55-.82,2.54,2.54,0,0,1,.87-.53,3.76,3.76,0,0,1,2.3,0,2.38,2.38,0,0,1,.87.52,2.32,2.32,0,0,1,.55.82,2.59,2.59,0,0,1,.2,1.07v1.66a2.83,2.83,0,0,1-.19,1.07,2.24,2.24,0,0,1-.55.82,2.34,2.34,0,0,1-.88.52A3.23,3.23,0,0,1,135.05,144.47Zm-1.45-2.6a1.5,1.5,0,0,0,2.51,1,1.4,1.4,0,0,0,.39-1v-1.65a1.39,1.39,0,0,0-.39-1.05,1.64,1.64,0,0,0-2.12,0,1.39,1.39,0,0,0-.39,1.05Z" style="fill:#139c5a"/><path d="M139.61,137.75h1.26v1.14h.1a1.46,1.46,0,0,1,.6-.93,2.07,2.07,0,0,1,1.2-.33,2.32,2.32,0,0,1,.92.18,1.85,1.85,0,0,1,.71.52,2.29,2.29,0,0,1,.46.81,3.21,3.21,0,0,1,.16,1.07v1.66a3.31,3.31,0,0,1-.16,1.08,2.25,2.25,0,0,1-.46.82,1.85,1.85,0,0,1-.71.52,2.32,2.32,0,0,1-.92.18,2.07,2.07,0,0,1-1.2-.33,1.46,1.46,0,0,1-.6-.93h-.1a1,1,0,0,0,0,.13,2.33,2.33,0,0,1,0,.29c0,.11,0,.23,0,.36s0,.25,0,.36v2h-1.32Zm1.32,2.48v1.64a1.45,1.45,0,0,0,.37,1,1.25,1.25,0,0,0,1,.4,1.33,1.33,0,0,0,1-.4,1.45,1.45,0,0,0,.38-1.07v-1.62a1.45,1.45,0,0,0-.38-1.07,1.36,1.36,0,0,0-1-.39,1.28,1.28,0,0,0-1,.4A1.47,1.47,0,0,0,140.93,140.23Z" style="fill:#139c5a"/><path d="M146.68,140.19a2.8,2.8,0,0,1,.19-1.07,2.24,2.24,0,0,1,.55-.8,2.46,2.46,0,0,1,.88-.51,3.43,3.43,0,0,1,1.15-.18,3.47,3.47,0,0,1,1.15.18,2.6,2.6,0,0,1,.87.51,2.24,2.24,0,0,1,.55.8,3,3,0,0,1,.19,1.07v1.21H148v.47a1.46,1.46,0,0,0,.4,1.1,1.44,1.44,0,0,0,1.07.4,2.29,2.29,0,0,0,.87-.16,1,1,0,0,0,.54-.47h1.3a2.1,2.1,0,0,1-.35.72,2.35,2.35,0,0,1-.59.54,2.9,2.9,0,0,1-.8.35,3.85,3.85,0,0,1-1,.12,3.43,3.43,0,0,1-1.15-.18,2.38,2.38,0,0,1-.87-.52,2.2,2.2,0,0,1-.55-.81,2.57,2.57,0,0,1-.2-1.06Zm1.3.25h2.93v-.25a1.52,1.52,0,0,0-2.54-1.07,1.42,1.42,0,0,0-.39,1.07Z" style="fill:#139c5a"/><path d="M155.52,137.75v1.14h.11a1.45,1.45,0,0,1,.62-.93,2.11,2.11,0,0,1,1.22-.33,2.15,2.15,0,0,1,1.65.65,2.61,2.61,0,0,1,.6,1.82v.43h-1.35v-.3a1.5,1.5,0,0,0-.38-1.08,1.32,1.32,0,0,0-1-.39,1.3,1.3,0,0,0-1,.39,1.53,1.53,0,0,0-.38,1.08v4.12h-1.32v-6.6Z" style="fill:#139c5a"/><path d="M160.92,142.47a1.9,1.9,0,0,1,.67-1.53,2.71,2.71,0,0,1,1.8-.56h1.79v-.55a1,1,0,0,0-.36-.83,1.67,1.67,0,0,0-1-.29,1.82,1.82,0,0,0-.88.19.9.9,0,0,0-.48.52h-1.29a1.94,1.94,0,0,1,.87-1.31,3.17,3.17,0,0,1,1.79-.48,3.1,3.1,0,0,1,2,.58,1.91,1.91,0,0,1,.72,1.58v4.56h-1.22v-1.28h-.1a1.56,1.56,0,0,1-.7,1,2.51,2.51,0,0,1-1.41.38,2.18,2.18,0,0,1-1.57-.55A1.92,1.92,0,0,1,160.92,142.47Zm1.32-.11a1,1,0,0,0,.33.78,1.37,1.37,0,0,0,.91.27,2.43,2.43,0,0,0,.68-.09,2,2,0,0,0,.54-.27,1.4,1.4,0,0,0,.36-.41,1.13,1.13,0,0,0,.12-.51v-.83h-1.77a1.24,1.24,0,0,0-.86.28A1,1,0,0,0,162.24,142.36Z" style="fill:#139c5a"/><path d="M168.07,137.75h1.86v-2h1.32v2h2.53v1.19h-2.53v3.51a.69.69,0,0,0,.19.51.73.73,0,0,0,.54.19h1.68v1.2h-1.74a2,2,0,0,1-1.45-.52,1.81,1.81,0,0,1-.54-1.38v-3.51h-1.86Z" style="fill:#139c5a"/><path d="M175.72,143.15h2.37v-4.21H176v-1.19h3.36v5.4h1.93v1.2h-5.59Zm1.89-7.21a.77.77,0,0,1,.22-.56.84.84,0,0,1,.6-.21h.29a.84.84,0,0,1,.59.21.73.73,0,0,1,.22.56.71.71,0,0,1-.22.55.85.85,0,0,1-.61.2h-.27a.84.84,0,0,1-.6-.2A.75.75,0,0,1,177.61,135.94Z" style="fill:#139c5a"/><path d="M185.45,144.47a3.19,3.19,0,0,1-1.15-.19,2.52,2.52,0,0,1-.87-.52,2.36,2.36,0,0,1-.55-.83,2.6,2.6,0,0,1-.2-1.06v-1.65a2.65,2.65,0,0,1,.2-1.07,2.32,2.32,0,0,1,.55-.82,2.54,2.54,0,0,1,.87-.53,3.43,3.43,0,0,1,1.15-.18,3.47,3.47,0,0,1,1.15.18,2.46,2.46,0,0,1,.87.52,2.32,2.32,0,0,1,.55.82,2.76,2.76,0,0,1,.2,1.07v1.66a2.83,2.83,0,0,1-.19,1.07,2.24,2.24,0,0,1-.55.82,2.42,2.42,0,0,1-.88.52A3.23,3.23,0,0,1,185.45,144.47Zm-1.45-2.6a1.4,1.4,0,0,0,.38,1,1.65,1.65,0,0,0,2.13,0,1.4,1.4,0,0,0,.39-1v-1.65a1.39,1.39,0,0,0-.39-1.05,1.64,1.64,0,0,0-2.12,0,1.39,1.39,0,0,0-.39,1.05Z" style="fill:#139c5a"/><path d="M190,137.75h1.24v1.14h.11a1.52,1.52,0,0,1,.59-.94,2,2,0,0,1,1.18-.32,2.34,2.34,0,0,1,.91.17,2,2,0,0,1,.69.49,2,2,0,0,1,.42.75,3,3,0,0,1,.15,1v4.34H194v-4.16a1.5,1.5,0,0,0-.35-1.06,1.24,1.24,0,0,0-1-.37,1.26,1.26,0,0,0-1,.39,1.57,1.57,0,0,0-.36,1.08v4.12H190Z" style="fill:#139c5a"/><path d="M61.67,140.17a3.51,3.51,0,0,1,.15-1,2.33,2.33,0,0,1,.46-.8,2.05,2.05,0,0,1,.72-.51,2.34,2.34,0,0,1,.93-.18,2.1,2.1,0,0,1,1.23.35,1.56,1.56,0,0,1,.63,1h.09v-1.2h1.25V144a2.3,2.3,0,0,1-.72,1.79,2.83,2.83,0,0,1-2,.65h-1.7v-1.13h1.7a1.36,1.36,0,0,0,1-.35,1.27,1.27,0,0,0,.37-1v-.22l.05-1.2h-.08a1.61,1.61,0,0,1-.65,1,2,2,0,0,1-1.22.35,2.34,2.34,0,0,1-.93-.18,2.11,2.11,0,0,1-.71-.51,2.31,2.31,0,0,1-.45-.8,3.13,3.13,0,0,1-.16-1.05ZM63,141.29a1.31,1.31,0,0,0,1.4,1.42,1.31,1.31,0,0,0,1.42-1.42v-1.1a1.31,1.31,0,0,0-1.42-1.42,1.31,1.31,0,0,0-1.4,1.42Z" style="fill:#139c5a"/><path d="M68.91,140.19a3,3,0,0,1,.19-1.07,2.27,2.27,0,0,1,.56-.8,2.5,2.5,0,0,1,.87-.51,3.51,3.51,0,0,1,1.15-.18,3.43,3.43,0,0,1,1.15.18,2.5,2.5,0,0,1,.87.51,2.12,2.12,0,0,1,.55.8,2.79,2.79,0,0,1,.2,1.07v1.21H70.22v.47a1.49,1.49,0,0,0,.39,1.1,1.46,1.46,0,0,0,1.07.4,2.34,2.34,0,0,0,.88-.16,1,1,0,0,0,.54-.47h1.3a2.1,2.1,0,0,1-.35.72,2.35,2.35,0,0,1-.59.54,3,3,0,0,1-.81.35,3.74,3.74,0,0,1-1,.12,3.41,3.41,0,0,1-1.14-.18,2.38,2.38,0,0,1-.87-.52,2.22,2.22,0,0,1-.56-.81,2.74,2.74,0,0,1-.2-1.06Zm1.31.25h2.93v-.25a1.47,1.47,0,1,0-2.93,0Z" style="fill:#139c5a"/><path d="M78.88,144.47a3.17,3.17,0,0,1-1.14-.19,2.52,2.52,0,0,1-.87-.52,2.39,2.39,0,0,1-.56-.83,2.78,2.78,0,0,1-.2-1.06v-1.65a2.83,2.83,0,0,1,.2-1.07,2.35,2.35,0,0,1,.56-.82,2.54,2.54,0,0,1,.87-.53,3.73,3.73,0,0,1,2.29,0,2.38,2.38,0,0,1,.87.52,2.35,2.35,0,0,1,.56.82,2.76,2.76,0,0,1,.2,1.07v1.66a2.83,2.83,0,0,1-.2,1.07,2.12,2.12,0,0,1-.55.82,2.38,2.38,0,0,1-.87.52A3.28,3.28,0,0,1,78.88,144.47Zm-1.45-2.6a1.35,1.35,0,0,0,1.45,1.44,1.45,1.45,0,0,0,1.07-.39,1.4,1.4,0,0,0,.39-1v-1.65a1.39,1.39,0,0,0-.39-1.05,1.65,1.65,0,0,0-2.13,0,1.39,1.39,0,0,0-.39,1.05Z" style="fill:#139c5a"/><path d="M83.14,144.35v-6.6h1.1v1h.09a1.24,1.24,0,0,1,.32-.8,1,1,0,0,1,.76-.29.91.91,0,0,1,.72.28,1.62,1.62,0,0,1,.39.81h.08a1.15,1.15,0,0,1,.33-.8,1,1,0,0,1,.77-.29,1.19,1.19,0,0,1,1,.45,1.93,1.93,0,0,1,.37,1.24v5H87.82v-5a1,1,0,0,0-.15-.59.57.57,0,0,0-.46-.2q-.63,0-.63.84v4.92h-1v-5a.94.94,0,0,0-.16-.59.63.63,0,0,0-.48-.2q-.63,0-.63.84v4.92Z" style="fill:#139c5a"/><path d="M90.51,140.19a3,3,0,0,1,.19-1.07,2.27,2.27,0,0,1,.56-.8,2.5,2.5,0,0,1,.87-.51,3.51,3.51,0,0,1,1.15-.18,3.43,3.43,0,0,1,1.15.18,2.5,2.5,0,0,1,.87.51,2.12,2.12,0,0,1,.55.8,2.79,2.79,0,0,1,.2,1.07v1.21H91.82v.47a1.49,1.49,0,0,0,.39,1.1,1.46,1.46,0,0,0,1.07.4,2.34,2.34,0,0,0,.88-.16,1,1,0,0,0,.54-.47H96a2.1,2.1,0,0,1-.35.72,2.35,2.35,0,0,1-.59.54,3,3,0,0,1-.81.35,3.74,3.74,0,0,1-1,.12,3.41,3.41,0,0,1-1.14-.18,2.38,2.38,0,0,1-.87-.52,2.22,2.22,0,0,1-.56-.81,2.74,2.74,0,0,1-.2-1.06Zm1.31.25h2.93v-.25a1.35,1.35,0,0,0-1.47-1.46,1.34,1.34,0,0,0-1.46,1.46Z" style="fill:#139c5a"/><path d="M97.51,137.75h1.86v-2h1.32v2h2.53v1.19h-2.53v3.51a.66.66,0,0,0,.19.51.73.73,0,0,0,.54.19h1.68v1.2h-1.74a2,2,0,0,1-1.46-.52,1.84,1.84,0,0,1-.53-1.38v-3.51H97.51Z" style="fill:#139c5a"/><path d="M106.56,137.75v1.14h.1a1.48,1.48,0,0,1,.62-.93,2.14,2.14,0,0,1,1.22-.33,2.17,2.17,0,0,1,1.66.65,2.61,2.61,0,0,1,.6,1.82v.43H109.4v-.3a1.49,1.49,0,0,0-.37-1.08,1.35,1.35,0,0,0-1-.39,1.33,1.33,0,0,0-1,.39,1.52,1.52,0,0,0-.37,1.08v4.12h-1.32v-6.6Z" style="fill:#139c5a"/><path d="M111.79,137.75h1.44l1.39,3.64a4.26,4.26,0,0,1,.15.47,4.31,4.31,0,0,1,.09.44l.06.43h.1a3.28,3.28,0,0,1,0-.43c0-.13.06-.27.09-.43s.09-.32.14-.48l1.3-3.64H118l-3.17,8.64h-1.39l.91-2.46Z" style="fill:#139c5a"/></svg>
\ No newline at end of file
diff --git a/doc/source/_static/binary_op-02.svg b/doc/source/_static/binary_op-02.svg
index a8d4087c..61863c37 100644
--- a/doc/source/_static/binary_op-02.svg
+++ b/doc/source/_static/binary_op-02.svg
@@ -1,1 +1,1 @@
-<svg xmlns="http://www.w3.org/2000/svg" width="255.6mm" height="57.81mm" viewBox="0 0 724.53 163.88"><rect x="11" y="28.59" width="38.2" height="19.1" style="fill:#0f9c5a;stroke:#fff;stroke-miterlimit:10;opacity:0.2"/><rect x="11" y="47.7" width="38.2" height="19.1" style="fill:#0f9c5a;stroke:#fff;stroke-miterlimit:10;opacity:0.4"/><rect x="11" y="66.8" width="38.2" height="19.1" style="fill:#0f9c5a;stroke:#fff;stroke-miterlimit:10;opacity:0.6"/><rect x="11" y="85.9" width="38.2" height="19.1" style="fill:#0f9c5a;stroke:#fff;stroke-miterlimit:10;opacity:0.8"/><rect x="11" y="105" width="38.2" height="19.1" style="fill:#0f9c5a;stroke:#fff;stroke-miterlimit:10"/><rect x="53.8" y="28.59" width="83.41" height="19.1" style="fill:#e21c84;stroke:#fff;stroke-miterlimit:10;opacity:0.2"/><rect x="53.8" y="9.49" width="83.41" height="19.1" style="fill:#e21c84;stroke:#fff;stroke-miterlimit:10;opacity:0.4"/><rect x="53.8" y="47.7" width="83.41" height="19.1" style="fill:#e21c84;stroke:#fff;stroke-miterlimit:10;opacity:0.2"/><rect x="53.8" y="66.8" width="83.41" height="19.1" style="fill:#e21c84;stroke:#fff;stroke-miterlimit:10;opacity:0.2"/><rect x="53.8" y="85.9" width="83.41" height="19.1" style="fill:#e21c84;stroke:#fff;stroke-miterlimit:10;opacity:0.2"/><rect x="53.8" y="105" width="83.41" height="19.1" style="fill:#e21c84;stroke:#fff;stroke-miterlimit:10;opacity:0.2"/><rect x="200.25" y="28.59" width="38.2" height="19.1" style="fill:#0f9c5a;stroke:#fff;stroke-miterlimit:10;opacity:0.8"/><rect x="200.25" y="47.7" width="38.2" height="19.1" style="fill:#0f9c5a;stroke:#fff;stroke-miterlimit:10;opacity:0.2"/><rect x="200.25" y="66.8" width="38.2" height="19.1" style="fill:#0f9c5a;stroke:#fff;stroke-miterlimit:10"/><rect x="200.25" y="85.9" width="38.2" height="19.1" style="fill:#0f9c5a;stroke:#fff;stroke-miterlimit:10;opacity:0.4"/><rect x="200.25" y="105" width="38.2" height="19.1" style="fill:#0f9c5a;stroke:#fff;stroke-miterlimit:10;opacity:0.6"/><rect x="243.05" y="28.59" width="83.41" height="19.1" style="fill:#e21c84;stroke:#fff;stroke-miterlimit:10;opacity:0.2"/><rect x="243.05" y="9.49" width="83.41" height="19.1" style="fill:#e21c84;stroke:#fff;stroke-miterlimit:10;opacity:0.4"/><rect x="243.05" y="47.7" width="83.41" height="19.1" style="fill:#e21c84;stroke:#fff;stroke-miterlimit:10;opacity:0.2"/><rect x="243.05" y="66.8" width="83.41" height="19.1" style="fill:#e21c84;stroke:#fff;stroke-miterlimit:10;opacity:0.2"/><rect x="243.05" y="85.9" width="83.41" height="19.1" style="fill:#e21c84;stroke:#fff;stroke-miterlimit:10;opacity:0.2"/><rect x="243.05" y="105" width="83.41" height="19.1" style="fill:#e21c84;stroke:#fff;stroke-miterlimit:10;opacity:0.2"/><line x1="144.24" y1="38.14" x2="187.07" y2="54.66" style="fill:none;stroke:#1d1d1b;stroke-miterlimit:10"/><polygon points="183.91 58.79 193.76 57.25 187.5 49.49 183.91 58.79" style="fill:#1d1d1b"/><line x1="144.24" y1="57.25" x2="188.08" y2="91.07" style="fill:none;stroke:#1d1d1b;stroke-miterlimit:10"/><polygon points="183.88 94.12 193.76 95.45 189.97 86.23 183.88 94.12" style="fill:#1d1d1b"/><line x1="144.24" y1="76.35" x2="188.08" y2="110.17" style="fill:none;stroke:#1d1d1b;stroke-miterlimit:10"/><polygon points="183.88 113.22 193.76 114.55 189.97 105.33 183.88 113.22" style="fill:#1d1d1b"/><line x1="144.24" y1="95.45" x2="189.07" y2="43.57" style="fill:none;stroke:#1d1d1b;stroke-miterlimit:10"/><polygon points="191.89 47.94 193.76 38.15 184.34 41.42 191.89 47.94" style="fill:#1d1d1b"/><line x1="144.24" y1="114.55" x2="188.08" y2="80.73" style="fill:none;stroke:#1d1d1b;stroke-miterlimit:10"/><polygon points="189.97 85.57 193.76 76.35 183.88 77.67 189.97 85.57" style="fill:#1d1d1b"/><line x1="533.72" y1="38.14" x2="576.06" y2="38.14" style="fill:none;stroke:#1d1d1b;stroke-miterlimit:10"/><polygon points="574.6 43.13 583.23 38.15 574.6 33.16 574.6 43.13" style="fill:#1d1d1b"/><line x1="533.72" y1="57.25" x2="576.06" y2="57.25" style="fill:none;stroke:#1d1d1b;stroke-miterlimit:10"/><polygon points="574.6 62.23 583.23 57.25 574.6 52.26 574.6 62.23" style="fill:#1d1d1b"/><line x1="533.72" y1="76.35" x2="576.06" y2="76.35" style="fill:none;stroke:#1d1d1b;stroke-miterlimit:10"/><polygon points="574.6 81.33 583.23 76.35 574.6 71.36 574.6 81.33" style="fill:#1d1d1b"/><line x1="533.72" y1="95.45" x2="576.06" y2="95.45" style="fill:none;stroke:#1d1d1b;stroke-miterlimit:10"/><polygon points="574.6 100.44 583.23 95.45 574.6 90.46 574.6 100.44" style="fill:#1d1d1b"/><line x1="533.72" y1="114.55" x2="576.06" y2="114.55" style="fill:none;stroke:#1d1d1b;stroke-miterlimit:10"/><polygon points="574.6 119.54 583.23 114.55 574.6 109.56 574.6 119.54" style="fill:#1d1d1b"/><rect x="400.47" y="28.59" width="38.2" height="19.1" style="fill:#0f9c5a;stroke:#fff;stroke-miterlimit:10;opacity:0.2"/><rect x="400.47" y="47.7" width="38.2" height="19.1" style="fill:#0f9c5a;stroke:#fff;stroke-miterlimit:10;opacity:0.4"/><rect x="400.47" y="66.8" width="38.2" height="19.1" style="fill:#0f9c5a;stroke:#fff;stroke-miterlimit:10;opacity:0.6"/><rect x="400.47" y="85.9" width="38.2" height="19.1" style="fill:#0f9c5a;stroke:#fff;stroke-miterlimit:10;opacity:0.8"/><rect x="400.47" y="105" width="38.2" height="19.1" style="fill:#0f9c5a;stroke:#fff;stroke-miterlimit:10"/><rect x="443.27" y="28.59" width="83.41" height="19.1" style="fill:#e21c84;stroke:#fff;stroke-miterlimit:10;opacity:0.2"/><rect x="443.27" y="9.49" width="83.41" height="19.1" style="fill:#e21c84;stroke:#fff;stroke-miterlimit:10;opacity:0.4"/><rect x="443.27" y="47.7" width="83.41" height="19.1" style="fill:#e21c84;stroke:#fff;stroke-miterlimit:10;opacity:0.2"/><rect x="443.27" y="66.8" width="83.41" height="19.1" style="fill:#e21c84;stroke:#fff;stroke-miterlimit:10;opacity:0.2"/><rect x="443.27" y="85.9" width="83.41" height="19.1" style="fill:#e21c84;stroke:#fff;stroke-miterlimit:10;opacity:0.2"/><rect x="443.27" y="105" width="83.41" height="19.1" style="fill:#e21c84;stroke:#fff;stroke-miterlimit:10;opacity:0.2"/><rect x="589.72" y="28.59" width="38.2" height="19.1" style="fill:#0f9c5a;stroke:#fff;stroke-miterlimit:10;opacity:0.8"/><rect x="589.72" y="47.7" width="38.2" height="19.1" style="fill:#0f9c5a;stroke:#fff;stroke-miterlimit:10;opacity:0.2"/><rect x="589.72" y="66.8" width="38.2" height="19.1" style="fill:#0f9c5a;stroke:#fff;stroke-miterlimit:10"/><rect x="589.72" y="85.9" width="38.2" height="19.1" style="fill:#0f9c5a;stroke:#fff;stroke-miterlimit:10;opacity:0.4"/><rect x="589.72" y="105" width="38.2" height="19.1" style="fill:#0f9c5a;stroke:#fff;stroke-miterlimit:10;opacity:0.6"/><rect x="632.52" y="28.59" width="83.41" height="19.1" style="fill:#e21c84;stroke:#fff;stroke-miterlimit:10;opacity:0.2"/><rect x="632.52" y="9.49" width="83.41" height="19.1" style="fill:#e21c84;stroke:#fff;stroke-miterlimit:10;opacity:0.4"/><rect x="632.52" y="47.7" width="83.41" height="19.1" style="fill:#e21c84;stroke:#fff;stroke-miterlimit:10;opacity:0.2"/><rect x="632.52" y="66.8" width="83.41" height="19.1" style="fill:#e21c84;stroke:#fff;stroke-miterlimit:10;opacity:0.2"/><rect x="632.52" y="85.9" width="83.41" height="19.1" style="fill:#e21c84;stroke:#fff;stroke-miterlimit:10;opacity:0.2"/><rect x="632.52" y="105" width="83.41" height="19.1" style="fill:#e21c84;stroke:#fff;stroke-miterlimit:10;opacity:0.2"/><path d="M130.89,145.13a1.9,1.9,0,0,1,.66-1.52,2.71,2.71,0,0,1,1.81-.57h1.79v-.55a1,1,0,0,0-.37-.82,1.59,1.59,0,0,0-1-.29,1.93,1.93,0,0,0-.87.18,1,1,0,0,0-.48.53h-1.3a1.93,1.93,0,0,1,.88-1.31,3.65,3.65,0,0,1,3.77.09,2,2,0,0,1,.73,1.59V147h-1.23v-1.29h-.09a1.57,1.57,0,0,1-.71,1,2.51,2.51,0,0,1-1.41.38,2.17,2.17,0,0,1-1.56-.55A1.89,1.89,0,0,1,130.89,145.13Zm1.32-.11a.94.94,0,0,0,.32.78,1.34,1.34,0,0,0,.91.28,2.17,2.17,0,0,0,.69-.1,1.71,1.71,0,0,0,.54-.27,1.21,1.21,0,0,0,.35-.4,1.14,1.14,0,0,0,.13-.51V144h-1.78a1.21,1.21,0,0,0-.85.28A1,1,0,0,0,132.21,145Z" style="fill:#1d1d1b"/><path d="M137.83,139.49v-1.2h3.46V145a.8.8,0,0,0,.22.61.78.78,0,0,0,.6.23h2V147h-2a2.07,2.07,0,0,1-1.53-.55A2,2,0,0,1,140,145v-5.49Z" style="fill:#1d1d1b"/><path d="M145.68,145.82h2.38V141.6H146v-1.18h3.36v5.4h1.93V147h-5.59Zm1.9-7.22a.71.71,0,0,1,.22-.55.84.84,0,0,1,.59-.21h.29a.8.8,0,0,1,.59.21.78.78,0,0,1,0,1.11.87.87,0,0,1-.6.2h-.28a.88.88,0,0,1-.59-.2A.72.72,0,0,1,147.58,138.6Z" style="fill:#1d1d1b"/><path d="M152.59,142.84a3.5,3.5,0,0,1,.16-1.05,2.22,2.22,0,0,1,.45-.8,2.09,2.09,0,0,1,.73-.51,2.3,2.3,0,0,1,.93-.18,2.1,2.1,0,0,1,1.23.34,1.65,1.65,0,0,1,.63,1h.09v-1.2h1.24v6.2a2.3,2.3,0,0,1-.71,1.78,2.78,2.78,0,0,1-2,.66h-1.71v-1.13h1.71a1.4,1.4,0,0,0,1-.35,1.27,1.27,0,0,0,.36-1v-.23l0-1.2h-.07a1.64,1.64,0,0,1-.65,1,2.07,2.07,0,0,1-1.22.34,2.3,2.3,0,0,1-.93-.18,2,2,0,0,1-.71-.51,2.22,2.22,0,0,1-.45-.8,3.06,3.06,0,0,1-.17-1Zm1.34,1.12a1.41,1.41,0,1,0,2.81,0v-1.11a1.41,1.41,0,1,0-2.81,0Z" style="fill:#1d1d1b"/><path d="M160,140.42h1.25v1.14h.11a1.47,1.47,0,0,1,.58-.94,2.05,2.05,0,0,1,1.18-.32,2.22,2.22,0,0,1,.92.17,1.89,1.89,0,0,1,.68.49,2.13,2.13,0,0,1,.43.75,2.93,2.93,0,0,1,.14,1V147h-1.32v-4.17a1.48,1.48,0,0,0-.34-1,1.27,1.27,0,0,0-1-.38,1.29,1.29,0,0,0-1,.4,1.57,1.57,0,0,0-.36,1.08V147H160Z" style="fill:#1d1d1b"/><path d="M172.45,141v1.2h-5.28V141Zm-5.28,2.93h5.28v1.2h-5.28Z" style="fill:#1d1d1b"/><path d="M173.92,139.56v-1.18h6.19v1.18h-2.42V147h-1.35v-7.46Z" style="fill:#1d1d1b"/><path d="M183.08,140.42v1.14h.11a1.48,1.48,0,0,1,.62-.93,2.43,2.43,0,0,1,2.88.32,2.64,2.64,0,0,1,.59,1.82v.43h-1.35v-.3a1.58,1.58,0,0,0-.37-1.09,1.35,1.35,0,0,0-1-.39,1.33,1.33,0,0,0-1,.4,1.52,1.52,0,0,0-.37,1.08V147h-1.32v-6.6Z" style="fill:#1d1d1b"/><path d="M190.12,140.42v4.18c0,.93.42,1.38,1.28,1.38s1.31-.45,1.31-1.38v-4.18H194v4.18a2.48,2.48,0,0,1-.69,1.88,2.67,2.67,0,0,1-1.94.66,2.63,2.63,0,0,1-1.92-.67,2.46,2.46,0,0,1-.68-1.87v-4.18Z" style="fill:#1d1d1b"/><path d="M195.84,142.85a2.78,2.78,0,0,1,.19-1.06,2.16,2.16,0,0,1,.55-.8,2.55,2.55,0,0,1,.88-.51,3.47,3.47,0,0,1,1.15-.18,3.43,3.43,0,0,1,1.15.18,2.5,2.5,0,0,1,.87.51,2.16,2.16,0,0,1,.55.8,2.78,2.78,0,0,1,.19,1.06v1.21h-4.22v.47a1.53,1.53,0,0,0,.39,1.11,1.45,1.45,0,0,0,1.07.39,2.35,2.35,0,0,0,.88-.15,1.05,1.05,0,0,0,.54-.47h1.29a2,2,0,0,1-.34.71,2.11,2.11,0,0,1-.6.55,2.77,2.77,0,0,1-.8.35,3.74,3.74,0,0,1-1,.12,3.41,3.41,0,0,1-1.14-.18,2.38,2.38,0,0,1-.87-.52,2.22,2.22,0,0,1-.56-.81,2.78,2.78,0,0,1-.2-1.06Zm1.31.25h2.93v-.25a1.41,1.41,0,0,0-.39-1.06,1.43,1.43,0,0,0-1.08-.39,1.33,1.33,0,0,0-1.46,1.45Z" style="fill:#1d1d1b"/><path d="M519.27,145.13a1.88,1.88,0,0,1,.67-1.52,2.66,2.66,0,0,1,1.8-.57h1.79v-.55a1,1,0,0,0-.36-.82,1.61,1.61,0,0,0-1-.29,1.94,1.94,0,0,0-.88.18,1,1,0,0,0-.48.53h-1.29a1.92,1.92,0,0,1,.87-1.31,3.67,3.67,0,0,1,3.78.09,1.94,1.94,0,0,1,.72,1.59V147h-1.22v-1.29h-.1a1.56,1.56,0,0,1-.7,1,2.51,2.51,0,0,1-1.41.38,2.15,2.15,0,0,1-1.56-.55A1.9,1.9,0,0,1,519.27,145.13Zm1.32-.11a1,1,0,0,0,.33.78,1.32,1.32,0,0,0,.91.28,2.07,2.07,0,0,0,.68-.1,1.52,1.52,0,0,0,.54-.27,1.37,1.37,0,0,0,.36-.4,1.13,1.13,0,0,0,.12-.51V144h-1.77a1.24,1.24,0,0,0-.86.28A1,1,0,0,0,520.59,145Z" style="fill:#1d1d1b"/><path d="M526.22,139.49v-1.2h3.46V145a.84.84,0,0,0,.21.61.81.81,0,0,0,.6.23h2V147h-2a2.06,2.06,0,0,1-1.52-.55,2,2,0,0,1-.55-1.49v-5.49Z" style="fill:#1d1d1b"/><path d="M534.07,145.82h2.37V141.6h-2.07v-1.18h3.36v5.4h1.93V147h-5.59ZM536,138.6a.72.72,0,0,1,.23-.55.8.8,0,0,1,.59-.21h.29a.82.82,0,0,1,.59.21.71.71,0,0,1,.22.55.72.72,0,0,1-.22.56.89.89,0,0,1-.6.2h-.28a.84.84,0,0,1-.59-.2A.72.72,0,0,1,536,138.6Z" style="fill:#1d1d1b"/><path d="M541,142.84a3.21,3.21,0,0,1,.16-1.05,2.09,2.09,0,0,1,.45-.8,2.05,2.05,0,0,1,.72-.51,2.35,2.35,0,0,1,.94-.18,2,2,0,0,1,1.22.34,1.62,1.62,0,0,1,.64,1h.08v-1.2h1.25v6.2a2.3,2.3,0,0,1-.71,1.78,2.78,2.78,0,0,1-2,.66h-1.71v-1.13h1.71a1.42,1.42,0,0,0,1-.35,1.27,1.27,0,0,0,.36-1v-.23l0-1.2h-.07a1.68,1.68,0,0,1-.65,1,2.09,2.09,0,0,1-1.22.34,2.27,2.27,0,0,1-.93-.18,1.93,1.93,0,0,1-.71-.51,2.24,2.24,0,0,1-.46-.8,3.07,3.07,0,0,1-.16-1Zm1.33,1.12a1.43,1.43,0,0,0,.38,1,1.41,1.41,0,0,0,2.44-1v-1.11a1.47,1.47,0,0,0-2.44-1,1.43,1.43,0,0,0-.38,1Z" style="fill:#1d1d1b"/><path d="M548.35,140.42h1.25v1.14h.1a1.52,1.52,0,0,1,.59-.94,2.05,2.05,0,0,1,1.18-.32,2.25,2.25,0,0,1,.92.17,2.08,2.08,0,0,1,.68.49,2.13,2.13,0,0,1,.43.75,3.22,3.22,0,0,1,.14,1V147h-1.32v-4.17a1.48,1.48,0,0,0-.35-1,1.24,1.24,0,0,0-1-.38,1.28,1.28,0,0,0-1,.4,1.57,1.57,0,0,0-.36,1.08V147h-1.32Z" style="fill:#1d1d1b"/><path d="M560.84,141v1.2h-5.28V141Zm-5.28,2.93h5.28v1.2h-5.28Z" style="fill:#1d1d1b"/><path d="M562.84,138.37h5.32v1.19h-4V142h3.71v1.2h-3.69V147h-1.32Z" style="fill:#1d1d1b"/><path d="M569.67,145.13a1.88,1.88,0,0,1,.67-1.52,2.66,2.66,0,0,1,1.8-.57h1.79v-.55a1,1,0,0,0-.36-.82,1.61,1.61,0,0,0-1-.29,1.94,1.94,0,0,0-.88.18,1,1,0,0,0-.48.53h-1.29a1.92,1.92,0,0,1,.87-1.31,3.67,3.67,0,0,1,3.78.09,1.94,1.94,0,0,1,.72,1.59V147H574v-1.29h-.1a1.56,1.56,0,0,1-.7,1,2.51,2.51,0,0,1-1.41.38,2.18,2.18,0,0,1-1.57-.55A1.93,1.93,0,0,1,569.67,145.13ZM571,145a1,1,0,0,0,.33.78,1.32,1.32,0,0,0,.91.28,2.11,2.11,0,0,0,.68-.1,1.52,1.52,0,0,0,.54-.27,1.37,1.37,0,0,0,.36-.4,1.13,1.13,0,0,0,.12-.51V144h-1.77a1.24,1.24,0,0,0-.86.28A1,1,0,0,0,571,145Z" style="fill:#1d1d1b"/><path d="M576.62,139.49v-1.2h3.46V145a.84.84,0,0,0,.21.61.81.81,0,0,0,.6.23h2V147h-2a2,2,0,0,1-1.52-.55,2,2,0,0,1-.55-1.49v-5.49Z" style="fill:#1d1d1b"/><path d="M584.19,145.36h1.37a.79.79,0,0,0,.4.52,1.67,1.67,0,0,0,.81.19h.43a1.53,1.53,0,0,0,.92-.24.77.77,0,0,0,.33-.66q0-.72-1.05-.87l-1-.13a2.75,2.75,0,0,1-1.58-.62,1.72,1.72,0,0,1-.51-1.33,1.7,1.7,0,0,1,.64-1.42,2.89,2.89,0,0,1,1.83-.5h.42a2.87,2.87,0,0,1,1.7.46,1.82,1.82,0,0,1,.77,1.25h-1.35a.76.76,0,0,0-.38-.47,1.4,1.4,0,0,0-.74-.17h-.42a1.4,1.4,0,0,0-.86.21.7.7,0,0,0-.3.63.67.67,0,0,0,.22.54,1.39,1.39,0,0,0,.71.25l1,.13a3.08,3.08,0,0,1,1.65.63,2,2,0,0,1-.13,2.86,3,3,0,0,1-1.9.52h-.43a3.08,3.08,0,0,1-1.79-.48A1.77,1.77,0,0,1,584.19,145.36Z" style="fill:#1d1d1b"/><path d="M591.43,142.85a2.78,2.78,0,0,1,.19-1.06,2.16,2.16,0,0,1,.55-.8,2.46,2.46,0,0,1,.88-.51,3.76,3.76,0,0,1,2.3,0,2.5,2.5,0,0,1,.87.51,2.16,2.16,0,0,1,.55.8,2.78,2.78,0,0,1,.19,1.06v1.21h-4.22v.47a1.53,1.53,0,0,0,.39,1.11,1.44,1.44,0,0,0,1.07.39,2.35,2.35,0,0,0,.88-.15,1.14,1.14,0,0,0,.54-.47h1.29a2.22,2.22,0,0,1-.94,1.26,2.9,2.9,0,0,1-.8.35,3.79,3.79,0,0,1-1,.12,3.47,3.47,0,0,1-1.15-.18,2.38,2.38,0,0,1-.87-.52,2.2,2.2,0,0,1-.55-.81,2.6,2.6,0,0,1-.2-1.06Zm1.31.25h2.92v-.25a1.41,1.41,0,0,0-.38-1.06,1.69,1.69,0,0,0-2.16,0,1.41,1.41,0,0,0-.38,1.06Z" style="fill:#1d1d1b"/></svg>
\ No newline at end of file
+<svg xmlns="http://www.w3.org/2000/svg" width="255.6mm" height="57.81mm" viewBox="0 0 724.53 163.88"><rect x="11" y="28.59" width="38.2" height="19.1" style="fill:#0f9c5a;stroke:#fff;stroke-miterlimit:10;opacity:0.2"/><rect x="11" y="47.7" width="38.2" height="19.1" style="fill:#0f9c5a;stroke:#fff;stroke-miterlimit:10;opacity:0.4"/><rect x="11" y="66.8" width="38.2" height="19.1" style="fill:#0f9c5a;stroke:#fff;stroke-miterlimit:10;opacity:0.6"/><rect x="11" y="85.9" width="38.2" height="19.1" style="fill:#0f9c5a;stroke:#fff;stroke-miterlimit:10;opacity:0.8"/><rect x="11" y="105" width="38.2" height="19.1" style="fill:#0f9c5a;stroke:#fff;stroke-miterlimit:10"/><rect x="53.8" y="28.59" width="83.41" height="19.1" style="fill:#e21c84;stroke:#fff;stroke-miterlimit:10;opacity:0.2"/><rect x="53.8" y="9.49" width="83.41" height="19.1" style="fill:#e21c84;stroke:#fff;stroke-miterlimit:10;opacity:0.4"/><rect x="53.8" y="47.7" width="83.41" height="19.1" style="fill:#e21c84;stroke:#fff;stroke-miterlimit:10;opacity:0.2"/><rect x="53.8" y="66.8" width="83.41" height="19.1" style="fill:#e21c84;stroke:#fff;stroke-miterlimit:10;opacity:0.2"/><rect x="53.8" y="85.9" width="83.41" height="19.1" style="fill:#e21c84;stroke:#fff;stroke-miterlimit:10;opacity:0.2"/><rect x="53.8" y="105" width="83.41" height="19.1" style="fill:#e21c84;stroke:#fff;stroke-miterlimit:10;opacity:0.2"/><rect x="200.25" y="28.59" width="38.2" height="19.1" style="fill:#0f9c5a;stroke:#fff;stroke-miterlimit:10;opacity:0.8"/><rect x="200.25" y="47.7" width="38.2" height="19.1" style="fill:#0f9c5a;stroke:#fff;stroke-miterlimit:10;opacity:0.2"/><rect x="200.25" y="66.8" width="38.2" height="19.1" style="fill:#0f9c5a;stroke:#fff;stroke-miterlimit:10"/><rect x="200.25" y="85.9" width="38.2" height="19.1" style="fill:#0f9c5a;stroke:#fff;stroke-miterlimit:10;opacity:0.4"/><rect x="200.25" y="105" width="38.2" height="19.1" style="fill:#0f9c5a;stroke:#fff;stroke-miterlimit:10;opacity:0.6"/><rect x="243.05" y="28.59" width="83.41" height="19.1" style="fill:#e21c84;stroke:#fff;stroke-miterlimit:10;opacity:0.2"/><rect x="243.05" y="9.49" width="83.41" height="19.1" style="fill:#e21c84;stroke:#fff;stroke-miterlimit:10;opacity:0.4"/><rect x="243.05" y="47.7" width="83.41" height="19.1" style="fill:#e21c84;stroke:#fff;stroke-miterlimit:10;opacity:0.2"/><rect x="243.05" y="66.8" width="83.41" height="19.1" style="fill:#e21c84;stroke:#fff;stroke-miterlimit:10;opacity:0.2"/><rect x="243.05" y="85.9" width="83.41" height="19.1" style="fill:#e21c84;stroke:#fff;stroke-miterlimit:10;opacity:0.2"/><rect x="243.05" y="105" width="83.41" height="19.1" style="fill:#e21c84;stroke:#fff;stroke-miterlimit:10;opacity:0.2"/><line x1="144.24" y1="38.14" x2="187.07" y2="54.66" style="fill:none;stroke:#139c5a;stroke-miterlimit:10"/><polygon points="183.91 58.79 193.76 57.25 187.5 49.49 183.91 58.79" style="fill:#139c5a"/><line x1="144.24" y1="57.25" x2="188.08" y2="91.07" style="fill:none;stroke:#139c5a;stroke-miterlimit:10"/><polygon points="183.88 94.12 193.76 95.45 189.97 86.23 183.88 94.12" style="fill:#139c5a"/><line x1="144.24" y1="76.35" x2="188.08" y2="110.17" style="fill:none;stroke:#139c5a;stroke-miterlimit:10"/><polygon points="183.88 113.22 193.76 114.55 189.97 105.33 183.88 113.22" style="fill:#139c5a"/><line x1="144.24" y1="95.45" x2="189.07" y2="43.57" style="fill:none;stroke:#139c5a;stroke-miterlimit:10"/><polygon points="191.89 47.94 193.76 38.15 184.34 41.42 191.89 47.94" style="fill:#139c5a"/><line x1="144.24" y1="114.55" x2="188.08" y2="80.73" style="fill:none;stroke:#139c5a;stroke-miterlimit:10"/><polygon points="189.97 85.57 193.76 76.35 183.88 77.67 189.97 85.57" style="fill:#139c5a"/><line x1="533.72" y1="38.14" x2="576.06" y2="38.14" style="fill:none;stroke:#139c5a;stroke-miterlimit:10"/><polygon points="574.6 43.13 583.23 38.15 574.6 33.16 574.6 43.13" style="fill:#139c5a"/><line x1="533.72" y1="57.25" x2="576.06" y2="57.25" style="fill:none;stroke:#139c5a;stroke-miterlimit:10"/><polygon points="574.6 62.23 583.23 57.25 574.6 52.26 574.6 62.23" style="fill:#139c5a"/><line x1="533.72" y1="76.35" x2="576.06" y2="76.35" style="fill:none;stroke:#139c5a;stroke-miterlimit:10"/><polygon points="574.6 81.33 583.23 76.35 574.6 71.36 574.6 81.33" style="fill:#139c5a"/><line x1="533.72" y1="95.45" x2="576.06" y2="95.45" style="fill:none;stroke:#139c5a;stroke-miterlimit:10"/><polygon points="574.6 100.44 583.23 95.45 574.6 90.46 574.6 100.44" style="fill:#139c5a"/><line x1="533.72" y1="114.55" x2="576.06" y2="114.55" style="fill:none;stroke:#139c5a;stroke-miterlimit:10"/><polygon points="574.6 119.54 583.23 114.55 574.6 109.56 574.6 119.54" style="fill:#139c5a"/><rect x="400.47" y="28.59" width="38.2" height="19.1" style="fill:#0f9c5a;stroke:#fff;stroke-miterlimit:10;opacity:0.2"/><rect x="400.47" y="47.7" width="38.2" height="19.1" style="fill:#0f9c5a;stroke:#fff;stroke-miterlimit:10;opacity:0.4"/><rect x="400.47" y="66.8" width="38.2" height="19.1" style="fill:#0f9c5a;stroke:#fff;stroke-miterlimit:10;opacity:0.6"/><rect x="400.47" y="85.9" width="38.2" height="19.1" style="fill:#0f9c5a;stroke:#fff;stroke-miterlimit:10;opacity:0.8"/><rect x="400.47" y="105" width="38.2" height="19.1" style="fill:#0f9c5a;stroke:#fff;stroke-miterlimit:10"/><rect x="443.27" y="28.59" width="83.41" height="19.1" style="fill:#e21c84;stroke:#fff;stroke-miterlimit:10;opacity:0.2"/><rect x="443.27" y="9.49" width="83.41" height="19.1" style="fill:#e21c84;stroke:#fff;stroke-miterlimit:10;opacity:0.4"/><rect x="443.27" y="47.7" width="83.41" height="19.1" style="fill:#e21c84;stroke:#fff;stroke-miterlimit:10;opacity:0.2"/><rect x="443.27" y="66.8" width="83.41" height="19.1" style="fill:#e21c84;stroke:#fff;stroke-miterlimit:10;opacity:0.2"/><rect x="443.27" y="85.9" width="83.41" height="19.1" style="fill:#e21c84;stroke:#fff;stroke-miterlimit:10;opacity:0.2"/><rect x="443.27" y="105" width="83.41" height="19.1" style="fill:#e21c84;stroke:#fff;stroke-miterlimit:10;opacity:0.2"/><rect x="589.72" y="28.59" width="38.2" height="19.1" style="fill:#0f9c5a;stroke:#fff;stroke-miterlimit:10;opacity:0.8"/><rect x="589.72" y="47.7" width="38.2" height="19.1" style="fill:#0f9c5a;stroke:#fff;stroke-miterlimit:10;opacity:0.2"/><rect x="589.72" y="66.8" width="38.2" height="19.1" style="fill:#0f9c5a;stroke:#fff;stroke-miterlimit:10"/><rect x="589.72" y="85.9" width="38.2" height="19.1" style="fill:#0f9c5a;stroke:#fff;stroke-miterlimit:10;opacity:0.4"/><rect x="589.72" y="105" width="38.2" height="19.1" style="fill:#0f9c5a;stroke:#fff;stroke-miterlimit:10;opacity:0.6"/><rect x="632.52" y="28.59" width="83.41" height="19.1" style="fill:#e21c84;stroke:#fff;stroke-miterlimit:10;opacity:0.2"/><rect x="632.52" y="9.49" width="83.41" height="19.1" style="fill:#e21c84;stroke:#fff;stroke-miterlimit:10;opacity:0.4"/><rect x="632.52" y="47.7" width="83.41" height="19.1" style="fill:#e21c84;stroke:#fff;stroke-miterlimit:10;opacity:0.2"/><rect x="632.52" y="66.8" width="83.41" height="19.1" style="fill:#e21c84;stroke:#fff;stroke-miterlimit:10;opacity:0.2"/><rect x="632.52" y="85.9" width="83.41" height="19.1" style="fill:#e21c84;stroke:#fff;stroke-miterlimit:10;opacity:0.2"/><rect x="632.52" y="105" width="83.41" height="19.1" style="fill:#e21c84;stroke:#fff;stroke-miterlimit:10;opacity:0.2"/><path d="M130.89,145.13a1.9,1.9,0,0,1,.66-1.52,2.71,2.71,0,0,1,1.81-.57h1.79v-.55a1,1,0,0,0-.37-.82,1.59,1.59,0,0,0-1-.29,1.93,1.93,0,0,0-.87.18,1,1,0,0,0-.48.53h-1.3a1.93,1.93,0,0,1,.88-1.31,3.65,3.65,0,0,1,3.77.09,2,2,0,0,1,.73,1.59V147h-1.23v-1.29h-.09a1.57,1.57,0,0,1-.71,1,2.51,2.51,0,0,1-1.41.38,2.17,2.17,0,0,1-1.56-.55A1.89,1.89,0,0,1,130.89,145.13Zm1.32-.11a.94.94,0,0,0,.32.78,1.34,1.34,0,0,0,.91.28,2.17,2.17,0,0,0,.69-.1,1.71,1.71,0,0,0,.54-.27,1.21,1.21,0,0,0,.35-.4,1.14,1.14,0,0,0,.13-.51V144h-1.78a1.21,1.21,0,0,0-.85.28A1,1,0,0,0,132.21,145Z" style="fill:#139c5a"/><path d="M137.83,139.49v-1.2h3.46V145a.8.8,0,0,0,.22.61.78.78,0,0,0,.6.23h2V147h-2a2.07,2.07,0,0,1-1.53-.55A2,2,0,0,1,140,145v-5.49Z" style="fill:#139c5a"/><path d="M145.68,145.82h2.38V141.6H146v-1.18h3.36v5.4h1.93V147h-5.59Zm1.9-7.22a.71.71,0,0,1,.22-.55.84.84,0,0,1,.59-.21h.29a.8.8,0,0,1,.59.21.78.78,0,0,1,0,1.11.87.87,0,0,1-.6.2h-.28a.88.88,0,0,1-.59-.2A.72.72,0,0,1,147.58,138.6Z" style="fill:#139c5a"/><path d="M152.59,142.84a3.5,3.5,0,0,1,.16-1.05,2.22,2.22,0,0,1,.45-.8,2.09,2.09,0,0,1,.73-.51,2.3,2.3,0,0,1,.93-.18,2.1,2.1,0,0,1,1.23.34,1.65,1.65,0,0,1,.63,1h.09v-1.2h1.24v6.2a2.3,2.3,0,0,1-.71,1.78,2.78,2.78,0,0,1-2,.66h-1.71v-1.13h1.71a1.4,1.4,0,0,0,1-.35,1.27,1.27,0,0,0,.36-1v-.23l0-1.2h-.07a1.64,1.64,0,0,1-.65,1,2.07,2.07,0,0,1-1.22.34,2.3,2.3,0,0,1-.93-.18,2,2,0,0,1-.71-.51,2.22,2.22,0,0,1-.45-.8,3.06,3.06,0,0,1-.17-1Zm1.34,1.12a1.41,1.41,0,1,0,2.81,0v-1.11a1.41,1.41,0,1,0-2.81,0Z" style="fill:#139c5a"/><path d="M160,140.42h1.25v1.14h.11a1.47,1.47,0,0,1,.58-.94,2.05,2.05,0,0,1,1.18-.32,2.22,2.22,0,0,1,.92.17,1.89,1.89,0,0,1,.68.49,2.13,2.13,0,0,1,.43.75,2.93,2.93,0,0,1,.14,1V147h-1.32v-4.17a1.48,1.48,0,0,0-.34-1,1.27,1.27,0,0,0-1-.38,1.29,1.29,0,0,0-1,.4,1.57,1.57,0,0,0-.36,1.08V147H160Z" style="fill:#139c5a"/><path d="M172.45,141v1.2h-5.28V141Zm-5.28,2.93h5.28v1.2h-5.28Z" style="fill:#139c5a"/><path d="M173.92,139.56v-1.18h6.19v1.18h-2.42V147h-1.35v-7.46Z" style="fill:#139c5a"/><path d="M183.08,140.42v1.14h.11a1.48,1.48,0,0,1,.62-.93,2.43,2.43,0,0,1,2.88.32,2.64,2.64,0,0,1,.59,1.82v.43h-1.35v-.3a1.58,1.58,0,0,0-.37-1.09,1.35,1.35,0,0,0-1-.39,1.33,1.33,0,0,0-1,.4,1.52,1.52,0,0,0-.37,1.08V147h-1.32v-6.6Z" style="fill:#139c5a"/><path d="M190.12,140.42v4.18c0,.93.42,1.38,1.28,1.38s1.31-.45,1.31-1.38v-4.18H194v4.18a2.48,2.48,0,0,1-.69,1.88,2.67,2.67,0,0,1-1.94.66,2.63,2.63,0,0,1-1.92-.67,2.46,2.46,0,0,1-.68-1.87v-4.18Z" style="fill:#139c5a"/><path d="M195.84,142.85a2.78,2.78,0,0,1,.19-1.06,2.16,2.16,0,0,1,.55-.8,2.55,2.55,0,0,1,.88-.51,3.47,3.47,0,0,1,1.15-.18,3.43,3.43,0,0,1,1.15.18,2.5,2.5,0,0,1,.87.51,2.16,2.16,0,0,1,.55.8,2.78,2.78,0,0,1,.19,1.06v1.21h-4.22v.47a1.53,1.53,0,0,0,.39,1.11,1.45,1.45,0,0,0,1.07.39,2.35,2.35,0,0,0,.88-.15,1.05,1.05,0,0,0,.54-.47h1.29a2,2,0,0,1-.34.71,2.11,2.11,0,0,1-.6.55,2.77,2.77,0,0,1-.8.35,3.74,3.74,0,0,1-1,.12,3.41,3.41,0,0,1-1.14-.18,2.38,2.38,0,0,1-.87-.52,2.22,2.22,0,0,1-.56-.81,2.78,2.78,0,0,1-.2-1.06Zm1.31.25h2.93v-.25a1.41,1.41,0,0,0-.39-1.06,1.43,1.43,0,0,0-1.08-.39,1.33,1.33,0,0,0-1.46,1.45Z" style="fill:#139c5a"/><path d="M519.27,145.13a1.88,1.88,0,0,1,.67-1.52,2.66,2.66,0,0,1,1.8-.57h1.79v-.55a1,1,0,0,0-.36-.82,1.61,1.61,0,0,0-1-.29,1.94,1.94,0,0,0-.88.18,1,1,0,0,0-.48.53h-1.29a1.92,1.92,0,0,1,.87-1.31,3.67,3.67,0,0,1,3.78.09,1.94,1.94,0,0,1,.72,1.59V147h-1.22v-1.29h-.1a1.56,1.56,0,0,1-.7,1,2.51,2.51,0,0,1-1.41.38,2.15,2.15,0,0,1-1.56-.55A1.9,1.9,0,0,1,519.27,145.13Zm1.32-.11a1,1,0,0,0,.33.78,1.32,1.32,0,0,0,.91.28,2.07,2.07,0,0,0,.68-.1,1.52,1.52,0,0,0,.54-.27,1.37,1.37,0,0,0,.36-.4,1.13,1.13,0,0,0,.12-.51V144h-1.77a1.24,1.24,0,0,0-.86.28A1,1,0,0,0,520.59,145Z" style="fill:#139c5a"/><path d="M526.22,139.49v-1.2h3.46V145a.84.84,0,0,0,.21.61.81.81,0,0,0,.6.23h2V147h-2a2.06,2.06,0,0,1-1.52-.55,2,2,0,0,1-.55-1.49v-5.49Z" style="fill:#139c5a"/><path d="M534.07,145.82h2.37V141.6h-2.07v-1.18h3.36v5.4h1.93V147h-5.59ZM536,138.6a.72.72,0,0,1,.23-.55.8.8,0,0,1,.59-.21h.29a.82.82,0,0,1,.59.21.71.71,0,0,1,.22.55.72.72,0,0,1-.22.56.89.89,0,0,1-.6.2h-.28a.84.84,0,0,1-.59-.2A.72.72,0,0,1,536,138.6Z" style="fill:#139c5a"/><path d="M541,142.84a3.21,3.21,0,0,1,.16-1.05,2.09,2.09,0,0,1,.45-.8,2.05,2.05,0,0,1,.72-.51,2.35,2.35,0,0,1,.94-.18,2,2,0,0,1,1.22.34,1.62,1.62,0,0,1,.64,1h.08v-1.2h1.25v6.2a2.3,2.3,0,0,1-.71,1.78,2.78,2.78,0,0,1-2,.66h-1.71v-1.13h1.71a1.42,1.42,0,0,0,1-.35,1.27,1.27,0,0,0,.36-1v-.23l0-1.2h-.07a1.68,1.68,0,0,1-.65,1,2.09,2.09,0,0,1-1.22.34,2.27,2.27,0,0,1-.93-.18,1.93,1.93,0,0,1-.71-.51,2.24,2.24,0,0,1-.46-.8,3.07,3.07,0,0,1-.16-1Zm1.33,1.12a1.43,1.43,0,0,0,.38,1,1.41,1.41,0,0,0,2.44-1v-1.11a1.47,1.47,0,0,0-2.44-1,1.43,1.43,0,0,0-.38,1Z" style="fill:#139c5a"/><path d="M548.35,140.42h1.25v1.14h.1a1.52,1.52,0,0,1,.59-.94,2.05,2.05,0,0,1,1.18-.32,2.25,2.25,0,0,1,.92.17,2.08,2.08,0,0,1,.68.49,2.13,2.13,0,0,1,.43.75,3.22,3.22,0,0,1,.14,1V147h-1.32v-4.17a1.48,1.48,0,0,0-.35-1,1.24,1.24,0,0,0-1-.38,1.28,1.28,0,0,0-1,.4,1.57,1.57,0,0,0-.36,1.08V147h-1.32Z" style="fill:#139c5a"/><path d="M560.84,141v1.2h-5.28V141Zm-5.28,2.93h5.28v1.2h-5.28Z" style="fill:#139c5a"/><path d="M562.84,138.37h5.32v1.19h-4V142h3.71v1.2h-3.69V147h-1.32Z" style="fill:#139c5a"/><path d="M569.67,145.13a1.88,1.88,0,0,1,.67-1.52,2.66,2.66,0,0,1,1.8-.57h1.79v-.55a1,1,0,0,0-.36-.82,1.61,1.61,0,0,0-1-.29,1.94,1.94,0,0,0-.88.18,1,1,0,0,0-.48.53h-1.29a1.92,1.92,0,0,1,.87-1.31,3.67,3.67,0,0,1,3.78.09,1.94,1.94,0,0,1,.72,1.59V147H574v-1.29h-.1a1.56,1.56,0,0,1-.7,1,2.51,2.51,0,0,1-1.41.38,2.18,2.18,0,0,1-1.57-.55A1.93,1.93,0,0,1,569.67,145.13ZM571,145a1,1,0,0,0,.33.78,1.32,1.32,0,0,0,.91.28,2.11,2.11,0,0,0,.68-.1,1.52,1.52,0,0,0,.54-.27,1.37,1.37,0,0,0,.36-.4,1.13,1.13,0,0,0,.12-.51V144h-1.77a1.24,1.24,0,0,0-.86.28A1,1,0,0,0,571,145Z" style="fill:#139c5a"/><path d="M576.62,139.49v-1.2h3.46V145a.84.84,0,0,0,.21.61.81.81,0,0,0,.6.23h2V147h-2a2,2,0,0,1-1.52-.55,2,2,0,0,1-.55-1.49v-5.49Z" style="fill:#139c5a"/><path d="M584.19,145.36h1.37a.79.79,0,0,0,.4.52,1.67,1.67,0,0,0,.81.19h.43a1.53,1.53,0,0,0,.92-.24.77.77,0,0,0,.33-.66q0-.72-1.05-.87l-1-.13a2.75,2.75,0,0,1-1.58-.62,1.72,1.72,0,0,1-.51-1.33,1.7,1.7,0,0,1,.64-1.42,2.89,2.89,0,0,1,1.83-.5h.42a2.87,2.87,0,0,1,1.7.46,1.82,1.82,0,0,1,.77,1.25h-1.35a.76.76,0,0,0-.38-.47,1.4,1.4,0,0,0-.74-.17h-.42a1.4,1.4,0,0,0-.86.21.7.7,0,0,0-.3.63.67.67,0,0,0,.22.54,1.39,1.39,0,0,0,.71.25l1,.13a3.08,3.08,0,0,1,1.65.63,2,2,0,0,1-.13,2.86,3,3,0,0,1-1.9.52h-.43a3.08,3.08,0,0,1-1.79-.48A1.77,1.77,0,0,1,584.19,145.36Z" style="fill:#139c5a"/><path d="M591.43,142.85a2.78,2.78,0,0,1,.19-1.06,2.16,2.16,0,0,1,.55-.8,2.46,2.46,0,0,1,.88-.51,3.76,3.76,0,0,1,2.3,0,2.5,2.5,0,0,1,.87.51,2.16,2.16,0,0,1,.55.8,2.78,2.78,0,0,1,.19,1.06v1.21h-4.22v.47a1.53,1.53,0,0,0,.39,1.11,1.44,1.44,0,0,0,1.07.39,2.35,2.35,0,0,0,.88-.15,1.14,1.14,0,0,0,.54-.47h1.29a2.22,2.22,0,0,1-.94,1.26,2.9,2.9,0,0,1-.8.35,3.79,3.79,0,0,1-1,.12,3.47,3.47,0,0,1-1.15-.18,2.38,2.38,0,0,1-.87-.52,2.2,2.2,0,0,1-.55-.81,2.6,2.6,0,0,1-.2-1.06Zm1.31.25h2.92v-.25a1.41,1.41,0,0,0-.38-1.06,1.69,1.69,0,0,0-2.16,0,1.41,1.41,0,0,0-.38,1.06Z" style="fill:#139c5a"/></svg>
\ No newline at end of file
diff --git a/doc/source/_static/binary_op-03.svg b/doc/source/_static/binary_op-03.svg
index 37b1fa69..18447e7a 100644
--- a/doc/source/_static/binary_op-03.svg
+++ b/doc/source/_static/binary_op-03.svg
@@ -1,1 +1,1 @@
-<svg xmlns="http://www.w3.org/2000/svg" width="107.81mm" height="51.72mm" viewBox="0 0 305.59 146.59"><path d="M209,116.05h1.36a.81.81,0,0,0,.41.52,1.67,1.67,0,0,0,.81.19H212a1.55,1.55,0,0,0,.92-.24.77.77,0,0,0,.33-.66c0-.48-.36-.77-1.06-.87l-1-.13a2.78,2.78,0,0,1-1.58-.62,1.94,1.94,0,0,1,.13-2.75,2.89,2.89,0,0,1,1.83-.5h.42a2.85,2.85,0,0,1,1.7.46,1.79,1.79,0,0,1,.78,1.25h-1.36a.72.72,0,0,0-.37-.47,1.44,1.44,0,0,0-.75-.18h-.42a1.5,1.5,0,0,0-.86.21.72.72,0,0,0-.3.63.65.65,0,0,0,.22.54,1.34,1.34,0,0,0,.72.26l1,.13a3.08,3.08,0,0,1,1.66.63,2,2,0,0,1-.14,2.85,3,3,0,0,1-1.89.53h-.43a3.09,3.09,0,0,1-1.8-.48A1.73,1.73,0,0,1,209,116.05Z" style="fill:#1d1d1b"/><path d="M216.36,117.71v-8.64h1.32v2c0,.11,0,.23,0,.36s0,.26,0,.37,0,.25,0,.41h.11a1.49,1.49,0,0,1,.59-.93,2,2,0,0,1,1.17-.33,2.36,2.36,0,0,1,.9.16,2.2,2.2,0,0,1,.68.48,2.32,2.32,0,0,1,.44.75,3.05,3.05,0,0,1,.15,1v4.35h-1.3v-4.17a1.45,1.45,0,0,0-.36-1.05,1.26,1.26,0,0,0-1-.38,1.29,1.29,0,0,0-1,.4,1.53,1.53,0,0,0-.36,1.08v4.12Z" style="fill:#1d1d1b"/><path d="M223.29,115.82a1.88,1.88,0,0,1,.66-1.52,2.71,2.71,0,0,1,1.81-.57h1.79v-.55a1,1,0,0,0-.37-.82,1.59,1.59,0,0,0-1-.29,1.93,1.93,0,0,0-.87.18,1,1,0,0,0-.48.52h-1.3a1.93,1.93,0,0,1,.88-1.3,3.65,3.65,0,0,1,3.77.09,1.93,1.93,0,0,1,.73,1.59v4.56h-1.23v-1.29h-.09a1.59,1.59,0,0,1-.71,1,2.51,2.51,0,0,1-1.41.38,2.21,2.21,0,0,1-1.56-.55A1.89,1.89,0,0,1,223.29,115.82Zm1.32-.11a.94.94,0,0,0,.32.78,1.34,1.34,0,0,0,.91.28,2.17,2.17,0,0,0,.69-.1,1.71,1.71,0,0,0,.54-.27,1.21,1.21,0,0,0,.35-.4,1.14,1.14,0,0,0,.13-.51v-.83h-1.78a1.26,1.26,0,0,0-.85.27A1,1,0,0,0,224.61,115.71Z" style="fill:#1d1d1b"/><path d="M230.77,111.11H232v1.14h.1a1.47,1.47,0,0,1,.61-.93,2,2,0,0,1,1.19-.33,2.29,2.29,0,0,1,.92.18,2.05,2.05,0,0,1,.72.51,2.46,2.46,0,0,1,.45.81,3.31,3.31,0,0,1,.17,1.08v1.65a3.41,3.41,0,0,1-.17,1.09,2.32,2.32,0,0,1-.45.82,2.08,2.08,0,0,1-.72.52,2.29,2.29,0,0,1-.92.18,2,2,0,0,1-1.19-.33,1.47,1.47,0,0,1-.61-.93H232s0,.05,0,.13,0,.17,0,.29,0,.23,0,.36,0,.24,0,.36v2h-1.32Zm1.32,2.48v1.63a1.54,1.54,0,0,0,.37,1.06,1.28,1.28,0,0,0,1,.39,1.38,1.38,0,0,0,1-.39,1.5,1.5,0,0,0,.38-1.07v-1.62a1.47,1.47,0,0,0-.38-1.07,1.38,1.38,0,0,0-1-.39,1.27,1.27,0,0,0-1,.39A1.5,1.5,0,0,0,232.09,113.59Z" style="fill:#1d1d1b"/><path d="M237.84,113.54a3,3,0,0,1,.19-1.06,2.18,2.18,0,0,1,.56-.8,2.5,2.5,0,0,1,.87-.51,3.51,3.51,0,0,1,1.15-.18,3.43,3.43,0,0,1,1.15.18,2.5,2.5,0,0,1,.87.51,2.16,2.16,0,0,1,.55.8,2.78,2.78,0,0,1,.19,1.06v1.21h-4.22v.47a1.53,1.53,0,0,0,.39,1.11,1.45,1.45,0,0,0,1.07.39,2.35,2.35,0,0,0,.88-.15,1.05,1.05,0,0,0,.54-.47h1.3a2.18,2.18,0,0,1-1,1.26,2.77,2.77,0,0,1-.8.35,3.74,3.74,0,0,1-1,.12,3.41,3.41,0,0,1-1.14-.18,2.52,2.52,0,0,1-.87-.52,2.22,2.22,0,0,1-.56-.81,2.78,2.78,0,0,1-.2-1.06Zm1.31.25h2.93v-.25a1.34,1.34,0,0,0-1.47-1.45,1.32,1.32,0,0,0-1.46,1.45Z" style="fill:#1d1d1b"/><path d="M244.63,110.18V109h3.46v6.69a.8.8,0,0,0,.22.61.78.78,0,0,0,.6.23h2v1.2h-2a2.11,2.11,0,0,1-1.53-.55,2,2,0,0,1-.55-1.49v-5.49Z" style="fill:#1d1d1b"/><path d="M251.92,111.11h1.44l1.39,3.63a4.42,4.42,0,0,1,.15.48,4.15,4.15,0,0,1,.09.43c0,.16,0,.3.06.44h.1a3.59,3.59,0,0,1,0-.44c0-.12.06-.27.09-.43s.09-.32.14-.48l1.3-3.63h1.39l-3.17,8.64h-1.39l.91-2.46Z" style="fill:#1d1d1b"/><path d="M205.39,127.93a3.5,3.5,0,0,1,.16-1.05,2.1,2.1,0,0,1,.46-.8,2.05,2.05,0,0,1,.72-.51,2.34,2.34,0,0,1,.93-.18,2.1,2.1,0,0,1,1.23.34,1.61,1.61,0,0,1,.63,1h.09v-1.2h1.24v6.2a2.27,2.27,0,0,1-.71,1.78,2.78,2.78,0,0,1-2,.66h-1.71V133h1.71a1.4,1.4,0,0,0,1-.35,1.27,1.27,0,0,0,.37-1v-.23l0-1.2h-.07a1.59,1.59,0,0,1-.65,1,2,2,0,0,1-1.22.35,2.34,2.34,0,0,1-.93-.18,2,2,0,0,1-.71-.51,2.22,2.22,0,0,1-.45-.8,3.11,3.11,0,0,1-.17-1Zm1.34,1.12a1.41,1.41,0,1,0,2.82,0v-1.11a1.43,1.43,0,0,0-.38-1,1.63,1.63,0,0,0-2.07,0,1.42,1.42,0,0,0-.37,1Z" style="fill:#1d1d1b"/><path d="M212.64,127.94a3,3,0,0,1,.19-1.06,2.18,2.18,0,0,1,.56-.8,2.5,2.5,0,0,1,.87-.51,3.51,3.51,0,0,1,1.15-.18,3.43,3.43,0,0,1,1.15.18,2.5,2.5,0,0,1,.87.51,2.16,2.16,0,0,1,.55.8,2.78,2.78,0,0,1,.19,1.06v1.21H214v.47a1.53,1.53,0,0,0,.39,1.11,1.45,1.45,0,0,0,1.07.39,2.35,2.35,0,0,0,.88-.15,1.05,1.05,0,0,0,.54-.47h1.3a2.18,2.18,0,0,1-.95,1.26,2.77,2.77,0,0,1-.8.35,3.74,3.74,0,0,1-1,.12,3.41,3.41,0,0,1-1.14-.18,2.52,2.52,0,0,1-.87-.52,2.22,2.22,0,0,1-.56-.81,2.78,2.78,0,0,1-.2-1.06Zm1.31.25h2.93v-.25a1.34,1.34,0,0,0-1.47-1.45,1.32,1.32,0,0,0-1.46,1.45Z" style="fill:#1d1d1b"/><path d="M222.61,132.23a3.41,3.41,0,0,1-1.14-.19,2.4,2.4,0,0,1-.87-.53,2.35,2.35,0,0,1-.56-.82,2.83,2.83,0,0,1-.2-1.07V128a2.83,2.83,0,0,1,.2-1.07,2.35,2.35,0,0,1,.56-.82,2.4,2.4,0,0,1,.87-.53,3.64,3.64,0,0,1,2.29,0,2.4,2.4,0,0,1,.87.53,2.31,2.31,0,0,1,.56.81,2.85,2.85,0,0,1,.2,1.08v1.65a2.92,2.92,0,0,1-.2,1.08,2.32,2.32,0,0,1-.55.82,2.52,2.52,0,0,1-.87.52A3.53,3.53,0,0,1,222.61,132.23Zm-1.45-2.61a1.43,1.43,0,0,0,.39,1.06,1.45,1.45,0,0,0,1.06.38,1.49,1.49,0,0,0,1.07-.38,1.42,1.42,0,0,0,.38-1.06V128a1.42,1.42,0,0,0-.38-1.06,1.68,1.68,0,0,0-2.13,0,1.43,1.43,0,0,0-.39,1.06Z" style="fill:#1d1d1b"/><path d="M226.87,132.11v-6.6H228v1h.09a1.27,1.27,0,0,1,.32-.81,1,1,0,0,1,.76-.28.94.94,0,0,1,.72.27,1.7,1.7,0,0,1,.39.82h.08a1.22,1.22,0,0,1,.32-.81,1.08,1.08,0,0,1,.78-.28,1.2,1.2,0,0,1,1,.45,1.93,1.93,0,0,1,.37,1.24v5h-1.22v-5a1,1,0,0,0-.15-.59.54.54,0,0,0-.46-.2q-.63,0-.63.84v4.92h-1v-5a.92.92,0,0,0-.16-.59.59.59,0,0,0-.48-.2q-.63,0-.63.84v4.92Z" style="fill:#1d1d1b"/><path d="M234.24,127.94a3,3,0,0,1,.19-1.06,2.18,2.18,0,0,1,.56-.8,2.5,2.5,0,0,1,.87-.51,3.51,3.51,0,0,1,1.15-.18,3.43,3.43,0,0,1,1.15.18,2.5,2.5,0,0,1,.87.51,2.16,2.16,0,0,1,.55.8,2.78,2.78,0,0,1,.19,1.06v1.21h-4.22v.47a1.53,1.53,0,0,0,.39,1.11,1.45,1.45,0,0,0,1.07.39,2.35,2.35,0,0,0,.88-.15,1.05,1.05,0,0,0,.54-.47h1.3a2.18,2.18,0,0,1-.95,1.26,2.77,2.77,0,0,1-.8.35,3.74,3.74,0,0,1-1,.12,3.41,3.41,0,0,1-1.14-.18,2.52,2.52,0,0,1-.87-.52,2.22,2.22,0,0,1-.56-.81,2.78,2.78,0,0,1-.2-1.06Zm1.31.25h2.93v-.25a1.34,1.34,0,0,0-1.47-1.45,1.32,1.32,0,0,0-1.46,1.45Z" style="fill:#1d1d1b"/><path d="M241.24,125.51h1.86v-2h1.32v2H247v1.18h-2.53v3.52a.66.66,0,0,0,.19.51.77.77,0,0,0,.54.19h1.68v1.2h-1.74a2,2,0,0,1-1.46-.52,1.8,1.8,0,0,1-.53-1.38v-3.52h-1.86Z" style="fill:#1d1d1b"/><path d="M250.28,125.51v1.14h.11a1.48,1.48,0,0,1,.62-.93,2.43,2.43,0,0,1,2.88.32,2.64,2.64,0,0,1,.59,1.82v.43h-1.35V128a1.56,1.56,0,0,0-.37-1.09,1.35,1.35,0,0,0-1-.39,1.33,1.33,0,0,0-1,.4,1.49,1.49,0,0,0-.37,1.08v4.12H249v-6.6Z" style="fill:#1d1d1b"/><path d="M255.52,125.51H257l1.39,3.63a4.42,4.42,0,0,1,.15.48c0,.15.06.3.09.43s0,.3.06.44h.1a3.59,3.59,0,0,1,0-.44c0-.12.06-.27.09-.43s.09-.32.14-.48l1.3-3.63h1.39l-3.17,8.64h-1.39l.91-2.46Z" style="fill:#1d1d1b"/><rect x="11" y="31.75" width="38.2" height="19.1" style="fill:#0f9c5a;stroke:#fff;stroke-miterlimit:10;opacity:0.2"/><rect x="11" y="50.85" width="38.2" height="19.1" style="fill:#0f9c5a;stroke:#fff;stroke-miterlimit:10;opacity:0.4"/><rect x="11" y="69.95" width="38.2" height="19.1" style="fill:#0f9c5a;stroke:#fff;stroke-miterlimit:10;opacity:0.6"/><rect x="11" y="89.05" width="38.2" height="19.1" style="fill:#0f9c5a;stroke:#fff;stroke-miterlimit:10;opacity:0.8"/><rect x="11" y="108.16" width="38.2" height="19.1" style="fill:#0f9c5a;stroke:#fff;stroke-miterlimit:10"/><rect x="53.8" y="31.75" width="83.41" height="19.1" style="fill:#e21c84;stroke:#fff;stroke-miterlimit:10;opacity:0.2"/><rect x="53.8" y="12.65" width="83.41" height="19.1" style="fill:#e21c84;stroke:#fff;stroke-miterlimit:10;opacity:0.4"/><rect x="53.8" y="50.85" width="83.41" height="19.1" style="fill:#e21c84;stroke:#fff;stroke-miterlimit:10;opacity:0.2"/><rect x="53.8" y="69.95" width="83.41" height="19.1" style="fill:#e21c84;stroke:#fff;stroke-miterlimit:10;opacity:0.2"/><rect x="53.8" y="89.05" width="83.41" height="19.1" style="fill:#e21c84;stroke:#fff;stroke-miterlimit:10;opacity:0.2"/><rect x="53.8" y="108.16" width="83.41" height="19.1" style="fill:#e21c84;stroke:#fff;stroke-miterlimit:10;opacity:0.2"/><line x1="144.24" y1="41.3" x2="193.76" y2="79.5" style="fill:none;stroke:#1d1d1b;stroke-miterlimit:10"/><line x1="144.24" y1="60.4" x2="193.76" y2="79.5" style="fill:none;stroke:#1d1d1b;stroke-miterlimit:10"/><line x1="144.24" y1="79.5" x2="193.76" y2="79.5" style="fill:none;stroke:#1d1d1b;stroke-miterlimit:10"/><polygon points="192.3 84.49 200.94 79.5 192.3 74.52 192.3 84.49" style="fill:#1d1d1b"/><line x1="144.24" y1="98.6" x2="193.76" y2="79.5" style="fill:none;stroke:#1d1d1b;stroke-miterlimit:10"/><line x1="144.24" y1="117.71" x2="193.76" y2="79.5" style="fill:none;stroke:#1d1d1b;stroke-miterlimit:10"/><polygon points="254.5 75.67 247.28 95.85 226.19 99.69 212.32 83.34 219.55 63.16 240.64 59.32 254.5 75.67" style="fill:#e21c84;stroke:#fff;stroke-miterlimit:10;opacity:0.2"/></svg>
\ No newline at end of file
+<svg xmlns="http://www.w3.org/2000/svg" width="107.81mm" height="51.72mm" viewBox="0 0 305.59 146.59"><path d="M209,116.05h1.36a.81.81,0,0,0,.41.52,1.67,1.67,0,0,0,.81.19H212a1.55,1.55,0,0,0,.92-.24.77.77,0,0,0,.33-.66c0-.48-.36-.77-1.06-.87l-1-.13a2.78,2.78,0,0,1-1.58-.62,1.94,1.94,0,0,1,.13-2.75,2.89,2.89,0,0,1,1.83-.5h.42a2.85,2.85,0,0,1,1.7.46,1.79,1.79,0,0,1,.78,1.25h-1.36a.72.72,0,0,0-.37-.47,1.44,1.44,0,0,0-.75-.18h-.42a1.5,1.5,0,0,0-.86.21.72.72,0,0,0-.3.63.65.65,0,0,0,.22.54,1.34,1.34,0,0,0,.72.26l1,.13a3.08,3.08,0,0,1,1.66.63,2,2,0,0,1-.14,2.85,3,3,0,0,1-1.89.53h-.43a3.09,3.09,0,0,1-1.8-.48A1.73,1.73,0,0,1,209,116.05Z" style="fill:#139c5a"/><path d="M216.36,117.71v-8.64h1.32v2c0,.11,0,.23,0,.36s0,.26,0,.37,0,.25,0,.41h.11a1.49,1.49,0,0,1,.59-.93,2,2,0,0,1,1.17-.33,2.36,2.36,0,0,1,.9.16,2.2,2.2,0,0,1,.68.48,2.32,2.32,0,0,1,.44.75,3.05,3.05,0,0,1,.15,1v4.35h-1.3v-4.17a1.45,1.45,0,0,0-.36-1.05,1.26,1.26,0,0,0-1-.38,1.29,1.29,0,0,0-1,.4,1.53,1.53,0,0,0-.36,1.08v4.12Z" style="fill:#139c5a"/><path d="M223.29,115.82a1.88,1.88,0,0,1,.66-1.52,2.71,2.71,0,0,1,1.81-.57h1.79v-.55a1,1,0,0,0-.37-.82,1.59,1.59,0,0,0-1-.29,1.93,1.93,0,0,0-.87.18,1,1,0,0,0-.48.52h-1.3a1.93,1.93,0,0,1,.88-1.3,3.65,3.65,0,0,1,3.77.09,1.93,1.93,0,0,1,.73,1.59v4.56h-1.23v-1.29h-.09a1.59,1.59,0,0,1-.71,1,2.51,2.51,0,0,1-1.41.38,2.21,2.21,0,0,1-1.56-.55A1.89,1.89,0,0,1,223.29,115.82Zm1.32-.11a.94.94,0,0,0,.32.78,1.34,1.34,0,0,0,.91.28,2.17,2.17,0,0,0,.69-.1,1.71,1.71,0,0,0,.54-.27,1.21,1.21,0,0,0,.35-.4,1.14,1.14,0,0,0,.13-.51v-.83h-1.78a1.26,1.26,0,0,0-.85.27A1,1,0,0,0,224.61,115.71Z" style="fill:#139c5a"/><path d="M230.77,111.11H232v1.14h.1a1.47,1.47,0,0,1,.61-.93,2,2,0,0,1,1.19-.33,2.29,2.29,0,0,1,.92.18,2.05,2.05,0,0,1,.72.51,2.46,2.46,0,0,1,.45.81,3.31,3.31,0,0,1,.17,1.08v1.65a3.41,3.41,0,0,1-.17,1.09,2.32,2.32,0,0,1-.45.82,2.08,2.08,0,0,1-.72.52,2.29,2.29,0,0,1-.92.18,2,2,0,0,1-1.19-.33,1.47,1.47,0,0,1-.61-.93H232s0,.05,0,.13,0,.17,0,.29,0,.23,0,.36,0,.24,0,.36v2h-1.32Zm1.32,2.48v1.63a1.54,1.54,0,0,0,.37,1.06,1.28,1.28,0,0,0,1,.39,1.38,1.38,0,0,0,1-.39,1.5,1.5,0,0,0,.38-1.07v-1.62a1.47,1.47,0,0,0-.38-1.07,1.38,1.38,0,0,0-1-.39,1.27,1.27,0,0,0-1,.39A1.5,1.5,0,0,0,232.09,113.59Z" style="fill:#139c5a"/><path d="M237.84,113.54a3,3,0,0,1,.19-1.06,2.18,2.18,0,0,1,.56-.8,2.5,2.5,0,0,1,.87-.51,3.51,3.51,0,0,1,1.15-.18,3.43,3.43,0,0,1,1.15.18,2.5,2.5,0,0,1,.87.51,2.16,2.16,0,0,1,.55.8,2.78,2.78,0,0,1,.19,1.06v1.21h-4.22v.47a1.53,1.53,0,0,0,.39,1.11,1.45,1.45,0,0,0,1.07.39,2.35,2.35,0,0,0,.88-.15,1.05,1.05,0,0,0,.54-.47h1.3a2.18,2.18,0,0,1-1,1.26,2.77,2.77,0,0,1-.8.35,3.74,3.74,0,0,1-1,.12,3.41,3.41,0,0,1-1.14-.18,2.52,2.52,0,0,1-.87-.52,2.22,2.22,0,0,1-.56-.81,2.78,2.78,0,0,1-.2-1.06Zm1.31.25h2.93v-.25a1.34,1.34,0,0,0-1.47-1.45,1.32,1.32,0,0,0-1.46,1.45Z" style="fill:#139c5a"/><path d="M244.63,110.18V109h3.46v6.69a.8.8,0,0,0,.22.61.78.78,0,0,0,.6.23h2v1.2h-2a2.11,2.11,0,0,1-1.53-.55,2,2,0,0,1-.55-1.49v-5.49Z" style="fill:#139c5a"/><path d="M251.92,111.11h1.44l1.39,3.63a4.42,4.42,0,0,1,.15.48,4.15,4.15,0,0,1,.09.43c0,.16,0,.3.06.44h.1a3.59,3.59,0,0,1,0-.44c0-.12.06-.27.09-.43s.09-.32.14-.48l1.3-3.63h1.39l-3.17,8.64h-1.39l.91-2.46Z" style="fill:#139c5a"/><path d="M205.39,127.93a3.5,3.5,0,0,1,.16-1.05,2.1,2.1,0,0,1,.46-.8,2.05,2.05,0,0,1,.72-.51,2.34,2.34,0,0,1,.93-.18,2.1,2.1,0,0,1,1.23.34,1.61,1.61,0,0,1,.63,1h.09v-1.2h1.24v6.2a2.27,2.27,0,0,1-.71,1.78,2.78,2.78,0,0,1-2,.66h-1.71V133h1.71a1.4,1.4,0,0,0,1-.35,1.27,1.27,0,0,0,.37-1v-.23l0-1.2h-.07a1.59,1.59,0,0,1-.65,1,2,2,0,0,1-1.22.35,2.34,2.34,0,0,1-.93-.18,2,2,0,0,1-.71-.51,2.22,2.22,0,0,1-.45-.8,3.11,3.11,0,0,1-.17-1Zm1.34,1.12a1.41,1.41,0,1,0,2.82,0v-1.11a1.43,1.43,0,0,0-.38-1,1.63,1.63,0,0,0-2.07,0,1.42,1.42,0,0,0-.37,1Z" style="fill:#139c5a"/><path d="M212.64,127.94a3,3,0,0,1,.19-1.06,2.18,2.18,0,0,1,.56-.8,2.5,2.5,0,0,1,.87-.51,3.51,3.51,0,0,1,1.15-.18,3.43,3.43,0,0,1,1.15.18,2.5,2.5,0,0,1,.87.51,2.16,2.16,0,0,1,.55.8,2.78,2.78,0,0,1,.19,1.06v1.21H214v.47a1.53,1.53,0,0,0,.39,1.11,1.45,1.45,0,0,0,1.07.39,2.35,2.35,0,0,0,.88-.15,1.05,1.05,0,0,0,.54-.47h1.3a2.18,2.18,0,0,1-.95,1.26,2.77,2.77,0,0,1-.8.35,3.74,3.74,0,0,1-1,.12,3.41,3.41,0,0,1-1.14-.18,2.52,2.52,0,0,1-.87-.52,2.22,2.22,0,0,1-.56-.81,2.78,2.78,0,0,1-.2-1.06Zm1.31.25h2.93v-.25a1.34,1.34,0,0,0-1.47-1.45,1.32,1.32,0,0,0-1.46,1.45Z" style="fill:#139c5a"/><path d="M222.61,132.23a3.41,3.41,0,0,1-1.14-.19,2.4,2.4,0,0,1-.87-.53,2.35,2.35,0,0,1-.56-.82,2.83,2.83,0,0,1-.2-1.07V128a2.83,2.83,0,0,1,.2-1.07,2.35,2.35,0,0,1,.56-.82,2.4,2.4,0,0,1,.87-.53,3.64,3.64,0,0,1,2.29,0,2.4,2.4,0,0,1,.87.53,2.31,2.31,0,0,1,.56.81,2.85,2.85,0,0,1,.2,1.08v1.65a2.92,2.92,0,0,1-.2,1.08,2.32,2.32,0,0,1-.55.82,2.52,2.52,0,0,1-.87.52A3.53,3.53,0,0,1,222.61,132.23Zm-1.45-2.61a1.43,1.43,0,0,0,.39,1.06,1.45,1.45,0,0,0,1.06.38,1.49,1.49,0,0,0,1.07-.38,1.42,1.42,0,0,0,.38-1.06V128a1.42,1.42,0,0,0-.38-1.06,1.68,1.68,0,0,0-2.13,0,1.43,1.43,0,0,0-.39,1.06Z" style="fill:#139c5a"/><path d="M226.87,132.11v-6.6H228v1h.09a1.27,1.27,0,0,1,.32-.81,1,1,0,0,1,.76-.28.94.94,0,0,1,.72.27,1.7,1.7,0,0,1,.39.82h.08a1.22,1.22,0,0,1,.32-.81,1.08,1.08,0,0,1,.78-.28,1.2,1.2,0,0,1,1,.45,1.93,1.93,0,0,1,.37,1.24v5h-1.22v-5a1,1,0,0,0-.15-.59.54.54,0,0,0-.46-.2q-.63,0-.63.84v4.92h-1v-5a.92.92,0,0,0-.16-.59.59.59,0,0,0-.48-.2q-.63,0-.63.84v4.92Z" style="fill:#139c5a"/><path d="M234.24,127.94a3,3,0,0,1,.19-1.06,2.18,2.18,0,0,1,.56-.8,2.5,2.5,0,0,1,.87-.51,3.51,3.51,0,0,1,1.15-.18,3.43,3.43,0,0,1,1.15.18,2.5,2.5,0,0,1,.87.51,2.16,2.16,0,0,1,.55.8,2.78,2.78,0,0,1,.19,1.06v1.21h-4.22v.47a1.53,1.53,0,0,0,.39,1.11,1.45,1.45,0,0,0,1.07.39,2.35,2.35,0,0,0,.88-.15,1.05,1.05,0,0,0,.54-.47h1.3a2.18,2.18,0,0,1-.95,1.26,2.77,2.77,0,0,1-.8.35,3.74,3.74,0,0,1-1,.12,3.41,3.41,0,0,1-1.14-.18,2.52,2.52,0,0,1-.87-.52,2.22,2.22,0,0,1-.56-.81,2.78,2.78,0,0,1-.2-1.06Zm1.31.25h2.93v-.25a1.34,1.34,0,0,0-1.47-1.45,1.32,1.32,0,0,0-1.46,1.45Z" style="fill:#139c5a"/><path d="M241.24,125.51h1.86v-2h1.32v2H247v1.18h-2.53v3.52a.66.66,0,0,0,.19.51.77.77,0,0,0,.54.19h1.68v1.2h-1.74a2,2,0,0,1-1.46-.52,1.8,1.8,0,0,1-.53-1.38v-3.52h-1.86Z" style="fill:#139c5a"/><path d="M250.28,125.51v1.14h.11a1.48,1.48,0,0,1,.62-.93,2.43,2.43,0,0,1,2.88.32,2.64,2.64,0,0,1,.59,1.82v.43h-1.35V128a1.56,1.56,0,0,0-.37-1.09,1.35,1.35,0,0,0-1-.39,1.33,1.33,0,0,0-1,.4,1.49,1.49,0,0,0-.37,1.08v4.12H249v-6.6Z" style="fill:#139c5a"/><path d="M255.52,125.51H257l1.39,3.63a4.42,4.42,0,0,1,.15.48c0,.15.06.3.09.43s0,.3.06.44h.1a3.59,3.59,0,0,1,0-.44c0-.12.06-.27.09-.43s.09-.32.14-.48l1.3-3.63h1.39l-3.17,8.64h-1.39l.91-2.46Z" style="fill:#139c5a"/><rect x="11" y="31.75" width="38.2" height="19.1" style="fill:#0f9c5a;stroke:#fff;stroke-miterlimit:10;opacity:0.2"/><rect x="11" y="50.85" width="38.2" height="19.1" style="fill:#0f9c5a;stroke:#fff;stroke-miterlimit:10;opacity:0.4"/><rect x="11" y="69.95" width="38.2" height="19.1" style="fill:#0f9c5a;stroke:#fff;stroke-miterlimit:10;opacity:0.6"/><rect x="11" y="89.05" width="38.2" height="19.1" style="fill:#0f9c5a;stroke:#fff;stroke-miterlimit:10;opacity:0.8"/><rect x="11" y="108.16" width="38.2" height="19.1" style="fill:#0f9c5a;stroke:#fff;stroke-miterlimit:10"/><rect x="53.8" y="31.75" width="83.41" height="19.1" style="fill:#e21c84;stroke:#fff;stroke-miterlimit:10;opacity:0.2"/><rect x="53.8" y="12.65" width="83.41" height="19.1" style="fill:#e21c84;stroke:#fff;stroke-miterlimit:10;opacity:0.4"/><rect x="53.8" y="50.85" width="83.41" height="19.1" style="fill:#e21c84;stroke:#fff;stroke-miterlimit:10;opacity:0.2"/><rect x="53.8" y="69.95" width="83.41" height="19.1" style="fill:#e21c84;stroke:#fff;stroke-miterlimit:10;opacity:0.2"/><rect x="53.8" y="89.05" width="83.41" height="19.1" style="fill:#e21c84;stroke:#fff;stroke-miterlimit:10;opacity:0.2"/><rect x="53.8" y="108.16" width="83.41" height="19.1" style="fill:#e21c84;stroke:#fff;stroke-miterlimit:10;opacity:0.2"/><line x1="144.24" y1="41.3" x2="193.76" y2="79.5" style="fill:none;stroke:#139c5a;stroke-miterlimit:10"/><line x1="144.24" y1="60.4" x2="193.76" y2="79.5" style="fill:none;stroke:#139c5a;stroke-miterlimit:10"/><line x1="144.24" y1="79.5" x2="193.76" y2="79.5" style="fill:none;stroke:#139c5a;stroke-miterlimit:10"/><polygon points="192.3 84.49 200.94 79.5 192.3 74.52 192.3 84.49" style="fill:#139c5a"/><line x1="144.24" y1="98.6" x2="193.76" y2="79.5" style="fill:none;stroke:#139c5a;stroke-miterlimit:10"/><line x1="144.24" y1="117.71" x2="193.76" y2="79.5" style="fill:none;stroke:#139c5a;stroke-miterlimit:10"/><polygon points="254.5 75.67 247.28 95.85 226.19 99.69 212.32 83.34 219.55 63.16 240.64 59.32 254.5 75.67" style="fill:#e21c84;stroke:#fff;stroke-miterlimit:10;opacity:0.2"/></svg>
\ No newline at end of file
diff --git a/doc/source/_static/custom.css b/doc/source/_static/custom.css
index 505f2b5e..f9f9be4c 100644
--- a/doc/source/_static/custom.css
+++ b/doc/source/_static/custom.css
@@ -1,16 +1,21 @@
 /* colors */
 
-:root {
-    --pst-color-primary: 19, 156, 90;
-    --pst-color-active-navigation: 19, 156, 90;
-    --pst-color-h2: var(--color-text-base);
+html[data-theme="light"] {
+    --pst-color-primary: rgb(19, 156, 90);
+    --pst-color-secondary: rgb(231, 4, 136);
 }
 
+html[data-theme="dark"] {
+    --pst-color-primary: rgb(19, 156, 90);
+    --pst-color-secondary: rgb(231, 4, 136);
+}
+
+
 /* buttons */
 
 .button>p>a {
     box-shadow: 0px 4px 14px -7px #999999;
-    background-color: white;
+    /* background-color: white; */
     border: 1px solid #bbbbbb;
     display: inline-block;
     cursor: pointer;
@@ -24,11 +29,11 @@
 }
 
 .button>p>a:hover {
-    border-color: #139C5A;
-    color: #e32e00;
+    border-color: rgb(19, 156, 90);
+    color: rgb(231, 4, 136);
 }
 
 .button>p>a:active {
     position: relative;
     top: 1px;
-}
+}
\ No newline at end of file
diff --git a/doc/source/about/logo.md b/doc/source/about/logo.md
index 9910f699..ed674e87 100644
--- a/doc/source/about/logo.md
+++ b/doc/source/about/logo.md
@@ -46,39 +46,42 @@ Although it is possible to use icon independently, we would prefer using the com
 
 You can download all version in SVG and PNG from [GitHub repository](https://github.com/geopandas/geopandas/tree/main/doc/source/_static/logo).
 
-
 ## Colors
 
 Pink and yellow accent colors are shared with `pandas`.
 
 ### Green
+
 ```{raw} html
 <svg xmlns="http://www.w3.org/2000/svg" width="75" height="75" style="float: left">
     <circle cx="33" cy="33" r="33" fill="#139C5A"></circle>
 </svg>
 ```
+
 **HEX:** #139C5A
 
 **RGB:** (19, 156, 90)
 
 ### Yellow
+
 ```{raw} html
 <svg xmlns="http://www.w3.org/2000/svg" width="75" height="75" style="float: left">
     <circle cx="33" cy="33" r="33" fill="#FFCA00"></circle>
 </svg>
 ```
+
 **HEX:** #FFCA00
 
 **RGB:** (255, 202, 0)
 
 ### Pink
+
 ```{raw} html
 <svg xmlns="http://www.w3.org/2000/svg" width="75" height="75" style="float: left">
     <circle cx="33" cy="33" r="33" fill="#E70488"></circle>
 </svg>
 ```
-**HEX:** #E70488
-
-**RGB:** ((31, 4, 136)
 
+**HEX:** #E70488
 
+**RGB:** (231, 4, 136)
diff --git a/doc/source/community/contributing.rst b/doc/source/community/contributing.rst
index 1eb9520e..5af97121 100644
--- a/doc/source/community/contributing.rst
+++ b/doc/source/community/contributing.rst
@@ -47,6 +47,9 @@ In particular, when submitting a pull request:
 - GeoPandas supports Python 3.8+ only. The last version of GeoPandas
   supporting Python 2 is 0.6.
 
+- Unless your PR implements minor changes or internal work only, make sure
+  it contains a note describing the changes in the `CHANGELOG.md` file.
+
 
 Seven Steps for Contributing
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
diff --git a/doc/source/conf.py b/doc/source/conf.py
index 3ce5df8c..4e332e17 100644
--- a/doc/source/conf.py
+++ b/doc/source/conf.py
@@ -14,6 +14,10 @@
 import sys, os
 import warnings
 
+sys.path.insert(0, os.path.abspath("../.."))
+
+import geopandas  # noqa
+
 # If extensions (or modules to document with autodoc) are in another directory,
 # add these directories to sys.path here. If the directory is relative to the
 # documentation root, use os.path.abspath to make it absolute, like shown here.
@@ -33,6 +37,7 @@ extensions = [
     "sphinx.ext.autosummary",
     "sphinx.ext.intersphinx",
     "sphinx.ext.autodoc",
+    "sphinx.ext.linkcode",
     "myst_parser",
     "nbsphinx",
     "numpydoc",
@@ -85,8 +90,8 @@ source_suffix = [".rst", ".md"]
 master_doc = "index"
 
 # General information about the project.
-project = u"GeoPandas"
-copyright = u"2013–2022, GeoPandas developers"
+project = "GeoPandas"
+copyright = "2013–2022, GeoPandas developers"
 
 # The version info for the project you're documenting, acts as replacement for
 # |version| and |release|, also used in various other places throughout the
@@ -260,7 +265,7 @@ latex_elements = {
 # Grouping the document tree into LaTeX files. List of tuples
 # (source start file, target name, title, author, documentclass [howto/manual]).
 latex_documents = [
-    ("index", "GeoPandas.tex", u"GeoPandas Documentation", u"Kelsey Jordahl", "manual")
+    ("index", "GeoPandas.tex", "GeoPandas Documentation", "Kelsey Jordahl", "manual")
 ]
 
 # The name of an image file (relative to this directory) to place at the top of
@@ -288,7 +293,7 @@ latex_documents = [
 
 # One entry per manual page. List of tuples
 # (source start file, name, description, authors, manual section).
-man_pages = [("index", "geopandas", u"GeoPandas Documentation", [u"Kelsey Jordahl"], 1)]
+man_pages = [("index", "geopandas", "GeoPandas Documentation", ["Kelsey Jordahl"], 1)]
 
 # If true, show URL addresses after external links.
 # man_show_urls = False
@@ -303,8 +308,8 @@ texinfo_documents = [
     (
         "index",
         "GeoPandas",
-        u"GeoPandas Documentation",
-        u"Kelsey Jordahl",
+        "GeoPandas Documentation",
+        "Kelsey Jordahl",
         "GeoPandas",
         "One line description of project.",
         "Miscellaneous",
@@ -417,4 +422,73 @@ intersphinx_mapping = {
         "https://xyzservices.readthedocs.io/en/stable/",
         "https://xyzservices.readthedocs.io/en/stable/objects.inv",
     ),
+    "pyogrio": (
+        "https://pyogrio.readthedocs.io/en/stable/",
+        "https://pyogrio.readthedocs.io/en/stable/objects.inv",
+    ),
 }
+
+
+# based on pandas implementation with added support of properties
+def linkcode_resolve(domain, info):
+    """
+    Determine the URL corresponding to Python object
+    """
+    import inspect
+
+    if domain != "py":
+        return None
+
+    modname = info["module"]
+    fullname = info["fullname"]
+
+    submod = sys.modules.get(modname)
+    if submod is None:
+        return None
+
+    obj = submod
+    for part in fullname.split("."):
+        try:
+            with warnings.catch_warnings():
+                # Accessing deprecated objects will generate noisy warnings
+                warnings.simplefilter("ignore", FutureWarning)
+                obj = getattr(obj, part)
+        except AttributeError:
+            return None
+
+    try:
+        fn = inspect.getsourcefile(inspect.unwrap(obj))
+    except TypeError:
+        try:  # property
+            fn = inspect.getsourcefile(inspect.unwrap(obj.fget))
+        except AttributeError:
+            fn = None
+    if not fn:
+        return None
+
+    try:
+        source, lineno = inspect.getsourcelines(obj)
+    except TypeError:
+        try:  # property
+            source, lineno = inspect.getsourcelines(obj.fget)
+        except AttributeError:
+            lineno = None
+    except OSError:
+        lineno = None
+
+    if lineno:
+        linespec = f"#L{lineno}-L{lineno + len(source) - 1}"
+    else:
+        linespec = ""
+
+    fn = os.path.relpath(fn, start=os.path.dirname(geopandas.__file__))
+
+    if "+" in geopandas.__version__:
+        return (
+            f"https://github.com/geopandas/geopandas/blob/main/geopandas/{fn}{linespec}"
+        )
+    else:
+        return (
+            f"https://github.com/geopandas/geopandas/blob/"
+            f"v{geopandas.__version__}/geopandas/{fn}{linespec}"
+        )
diff --git a/doc/source/docs/user_guide/aggregation_with_dissolve.rst b/doc/source/docs/user_guide/aggregation_with_dissolve.rst
index c8a10cd3..5c86aa2c 100644
--- a/doc/source/docs/user_guide/aggregation_with_dissolve.rst
+++ b/doc/source/docs/user_guide/aggregation_with_dissolve.rst
@@ -80,7 +80,7 @@ However it also accepts other summary statistic options as allowed by :meth:`pan
 * list of functions and/or function names, e.g. [np.sum, 'mean']
 * dict of axis labels -> functions, function names or list of such.
 
-For example, to get the number of contries on each continent, 
+For example, to get the number of countries on each continent, 
 as well as the populations of the largest and smallest country of each,
 we can aggregate the ``'name'`` column using ``'count'``,
 and the ``'pop_est'`` column using ``'min'`` and ``'max'``:
@@ -96,4 +96,4 @@ and the ``'pop_est'`` column using ``'min'`` and ``'max'``:
         },
     )
 
-   continents.head()
\ No newline at end of file
+   continents.head()
diff --git a/doc/source/gallery/plotting_with_folium.ipynb b/doc/source/gallery/plotting_with_folium.ipynb
index e01574f4..773d6b8a 100644
--- a/doc/source/gallery/plotting_with_folium.ipynb
+++ b/doc/source/gallery/plotting_with_folium.ipynb
@@ -40,7 +40,7 @@
    "metadata": {},
    "outputs": [],
    "source": [
-    "df1 = pd.read_csv('volcano_data_2010.csv')\n",
+    "df1 = pd.read_csv(\"volcano_data_2010.csv\")\n",
     "\n",
     "# Keep only relevant columns\n",
     "df = df1.loc[:, (\"Year\", \"Name\", \"Country\", \"Latitude\", \"Longitude\", \"Type\")]\n",
@@ -55,7 +55,9 @@
    "source": [
     "# Create point geometries\n",
     "geometry = geopandas.points_from_xy(df.Longitude, df.Latitude)\n",
-    "geo_df = geopandas.GeoDataFrame(df[['Year','Name','Country', 'Latitude', 'Longitude', 'Type']], geometry=geometry)\n",
+    "geo_df = geopandas.GeoDataFrame(\n",
+    "    df[[\"Year\", \"Name\", \"Country\", \"Latitude\", \"Longitude\", \"Type\"]], geometry=geometry\n",
+    ")\n",
     "\n",
     "geo_df.head()"
    ]
@@ -66,7 +68,7 @@
    "metadata": {},
    "outputs": [],
    "source": [
-    "world = geopandas.read_file(geopandas.datasets.get_path('naturalearth_lowres'))\n",
+    "world = geopandas.read_file(geopandas.datasets.get_path(\"naturalearth_lowres\"))\n",
     "df.Type.unique()"
    ]
   },
@@ -80,10 +82,10 @@
    },
    "outputs": [],
    "source": [
-    "fig, ax = plt.subplots(figsize=(24,18))\n",
-    "world.plot(ax=ax, alpha=0.4, color='grey')\n",
-    "geo_df.plot(column='Type', ax=ax, legend=True)\n",
-    "plt.title('Volcanoes')"
+    "fig, ax = plt.subplots(figsize=(24, 18))\n",
+    "world.plot(ax=ax, alpha=0.4, color=\"grey\")\n",
+    "geo_df.plot(column=\"Type\", ax=ax, legend=True)\n",
+    "plt.title(\"Volcanoes\")"
    ]
   },
   {
@@ -101,7 +103,7 @@
    "outputs": [],
    "source": [
     "# Stamen Terrain\n",
-    "map = folium.Map(location = [13.406,80.110], tiles = \"Stamen Terrain\", zoom_start = 9)\n",
+    "map = folium.Map(location=[13.406, 80.110], tiles=\"Stamen Terrain\", zoom_start=9)\n",
     "map"
    ]
   },
@@ -112,7 +114,7 @@
    "outputs": [],
    "source": [
     "# OpenStreetMap\n",
-    "map = folium.Map(location = [13.406,80.110], tiles='OpenStreetMap' , zoom_start = 9)\n",
+    "map = folium.Map(location=[13.406, 80.110], tiles=\"OpenStreetMap\", zoom_start=9)\n",
     "map"
    ]
   },
@@ -123,7 +125,7 @@
    "outputs": [],
    "source": [
     "# Stamen Toner\n",
-    "map = folium.Map(location = [13.406,80.110], tiles='Stamen Toner', zoom_start = 9)\n",
+    "map = folium.Map(location=[13.406, 80.110], tiles=\"Stamen Toner\", zoom_start=9)\n",
     "map"
    ]
   },
@@ -141,7 +143,7 @@
    "outputs": [],
    "source": [
     "# Use terrain map layer to see volcano terrain\n",
-    "map = folium.Map(location = [4,10], tiles = \"Stamen Terrain\", zoom_start = 3)"
+    "map = folium.Map(location=[4, 10], tiles=\"Stamen Terrain\", zoom_start=3)"
    ]
   },
   {
@@ -159,12 +161,12 @@
    "outputs": [],
    "source": [
     "# Create a geometry list from the GeoDataFrame\n",
-    "geo_df_list = [[point.xy[1][0], point.xy[0][0]] for point in geo_df.geometry ]\n",
+    "geo_df_list = [[point.xy[1][0], point.xy[0][0]] for point in geo_df.geometry]\n",
     "\n",
     "# Iterate through list and add a marker for each volcano, color-coded by its type.\n",
     "i = 0\n",
     "for coordinates in geo_df_list:\n",
-    "    #assign a color marker for the type of volcano, Strato being the most common\n",
+    "    # assign a color marker for the type of volcano, Strato being the most common\n",
     "    if geo_df.Type[i] == \"Stratovolcano\":\n",
     "        type_color = \"green\"\n",
     "    elif geo_df.Type[i] == \"Complex volcano\":\n",
@@ -176,16 +178,19 @@
     "    else:\n",
     "        type_color = \"purple\"\n",
     "\n",
-    "\n",
     "    # Place the markers with the popup labels and data\n",
-    "    map.add_child(folium.Marker(location = coordinates,\n",
-    "                            popup =\n",
-    "                            \"Year: \" + str(geo_df.Year[i]) + '<br>' +\n",
-    "                            \"Name: \" + str(geo_df.Name[i]) + '<br>' +\n",
-    "                            \"Country: \" + str(geo_df.Country[i]) + '<br>'\n",
-    "                            \"Type: \" + str(geo_df.Type[i]) + '<br>'\n",
-    "                            \"Coordinates: \" + str(geo_df_list[i]),\n",
-    "                            icon = folium.Icon(color = \"%s\" % type_color)))\n",
+    "    map.add_child(\n",
+    "        folium.Marker(\n",
+    "            location=coordinates,\n",
+    "            popup=\n",
+    "                \"Year: \" + str(geo_df.Year[i]) + \"<br>\"\n",
+    "                + \"Name: \" + str(geo_df.Name[i]) + \"<br>\"\n",
+    "                + \"Country: \" + str(geo_df.Country[i]) + \"<br>\"\n",
+    "                + \"Type: \" + str(geo_df.Type[i]) + \"<br>\"\n",
+    "                + \"Coordinates: \" + str(geo_df_list[i]),\n",
+    "            icon=folium.Icon(color=\"%s\" % type_color),\n",
+    "        )\n",
+    "    )\n",
     "    i = i + 1"
    ]
   },
@@ -218,9 +223,9 @@
     "\n",
     "from folium import plugins\n",
     "\n",
-    "map = folium.Map(location = [15,30], tiles='Cartodb dark_matter', zoom_start = 2)\n",
+    "map = folium.Map(location=[15, 30], tiles=\"Cartodb dark_matter\", zoom_start=2)\n",
     "\n",
-    "heat_data = [[point.xy[1][0], point.xy[0][0]] for point in geo_df.geometry ]\n",
+    "heat_data = [[point.xy[1][0], point.xy[0][0]] for point in geo_df.geometry]\n",
     "\n",
     "heat_data\n",
     "plugins.HeatMap(heat_data).add_to(map)\n",
diff --git a/geopandas/explore.py b/geopandas/explore.py
index 3c0f500c..5a252530 100644
--- a/geopandas/explore.py
+++ b/geopandas/explore.py
@@ -378,8 +378,9 @@ GON (((180.00000 -16.06713, 180.00000...
                 )
             categorical = True
         elif (
-            gdf[column].dtype is np.dtype("O")
-            or gdf[column].dtype is np.dtype(bool)
+            pd.api.types.is_object_dtype(gdf[column])
+            or pd.api.types.is_bool_dtype(gdf[column])
+            or pd.api.types.is_string_dtype(gdf[column])
             or categories
         ):
             categorical = True
diff --git a/geopandas/geodataframe.py b/geopandas/geodataframe.py
index 2b4bbe30..a563c905 100644
--- a/geopandas/geodataframe.py
+++ b/geopandas/geodataframe.py
@@ -148,7 +148,11 @@ class GeoDataFrame(GeoPandasBase, DataFrame):
             if crs is not None and data.crs != crs:
                 raise ValueError(crs_mismatch_error)
 
-        if geometry is None and "geometry" in self.columns:
+        if (
+            geometry is None
+            and self.columns.nlevels == 1
+            and "geometry" in self.columns
+        ):
             # Check for multiple columns with name "geometry". If there are,
             # self["geometry"] is a gdf and constructor gets recursively recalled
             # by pandas internals trying to access this
@@ -996,7 +1000,7 @@ individually so that features may have different properties
         return df
 
     def to_parquet(
-        self, path, index=None, compression="snappy", version=None, **kwargs
+        self, path, index=None, compression="snappy", schema_version=None, **kwargs
     ):
         """Write a GeoDataFrame to the Parquet format.
 
@@ -1026,7 +1030,7 @@ individually so that features may have different properties
             output except `RangeIndex` which is stored as metadata only.
         compression : {'snappy', 'gzip', 'brotli', None}, default 'snappy'
             Name of the compression to use. Use ``None`` for no compression.
-        version : {'0.1.0', '0.4.0', None}
+        schema_version : {'0.1.0', '0.4.0', None}
             GeoParquet specification version; if not provided will default to
             latest supported version.
         kwargs
@@ -1056,10 +1060,17 @@ individually so that features may have different properties
         from geopandas.io.arrow import _to_parquet
 
         _to_parquet(
-            self, path, compression=compression, index=index, version=version, **kwargs
+            self,
+            path,
+            compression=compression,
+            index=index,
+            schema_version=schema_version,
+            **kwargs,
         )
 
-    def to_feather(self, path, index=None, compression=None, version=None, **kwargs):
+    def to_feather(
+        self, path, index=None, compression=None, schema_version=None, **kwargs
+    ):
         """Write a GeoDataFrame to the Feather format.
 
         Any geometry columns present are serialized to WKB format in the file.
@@ -1089,7 +1100,7 @@ individually so that features may have different properties
         compression : {'zstd', 'lz4', 'uncompressed'}, optional
             Name of the compression to use. Use ``"uncompressed"`` for no
             compression. By default uses LZ4 if available, otherwise uncompressed.
-        version : {'0.1.0', '0.4.0', None}
+        schema_version : {'0.1.0', '0.4.0', None}
             GeoParquet specification version; if not provided will default to
             latest supported version.
         kwargs
@@ -1110,7 +1121,12 @@ individually so that features may have different properties
         from geopandas.io.arrow import _to_feather
 
         _to_feather(
-            self, path, index=index, compression=compression, version=version, **kwargs
+            self,
+            path,
+            index=index,
+            compression=compression,
+            schema_version=schema_version,
+            **kwargs,
         )
 
     def to_file(self, filename, driver=None, schema=None, index=None, **kwargs):
@@ -1508,14 +1524,17 @@ individually so that features may have different properties
             else:
                 if self.crs is not None and result.crs is None:
                     result.set_crs(self.crs, inplace=True)
-        elif isinstance(result, Series):
-            # Reconstruct series GeometryDtype if lost by apply
-            try:
-                # Note CRS cannot be preserved in this case as func could refer
-                # to any column
-                result = _ensure_geometry(result)
-            except TypeError:
-                pass
+        elif isinstance(result, Series) and result.dtype == "object":
+            # Try reconstruct series GeometryDtype if lost by apply
+            # If all none and object dtype assert list of nones is more likely
+            # intended than list of null geometry.
+            if not result.isna().all():
+                try:
+                    # not enough info about func to preserve CRS
+                    result = _ensure_geometry(result)
+
+                except TypeError:
+                    pass
 
         return result
 
@@ -1809,12 +1828,11 @@ individually so that features may have different properties
 
         exploded_geom = self.geometry.reset_index(drop=True).explode(index_parts=True)
 
-        df = GeoDataFrame(
-            self.drop(self._geometry_column_name, axis=1).take(
-                exploded_geom.index.droplevel(-1)
-            ),
-            geometry=exploded_geom.values,
-        ).__finalize__(self)
+        df = self.drop(self._geometry_column_name, axis=1).take(
+            exploded_geom.index.droplevel(-1)
+        )
+        df[exploded_geom.name] = exploded_geom.values
+        df = df.set_geometry(self._geometry_column_name).__finalize__(self)
 
         if ignore_index:
             df.reset_index(inplace=True, drop=True)
diff --git a/geopandas/io/arrow.py b/geopandas/io/arrow.py
index 3e443f2d..fea924cf 100644
--- a/geopandas/io/arrow.py
+++ b/geopandas/io/arrow.py
@@ -66,13 +66,13 @@ def _remove_id_from_member_of_ensembles(json_dict):
                 member.pop("id", None)
 
 
-def _create_metadata(df, version=None):
+def _create_metadata(df, schema_version=None):
     """Create and encode geo metadata dict.
 
     Parameters
     ----------
     df : GeoDataFrame
-    version : {'0.1.0', '0.4.0', None}
+    schema_version : {'0.1.0', '0.4.0', None}
         GeoParquet specification version; if not provided will default to
         latest supported version.
 
@@ -81,10 +81,12 @@ def _create_metadata(df, version=None):
     dict
     """
 
-    version = version or METADATA_VERSION
+    schema_version = schema_version or METADATA_VERSION
 
-    if version not in SUPPORTED_VERSIONS:
-        raise ValueError(f"version must be one of: {', '.join(SUPPORTED_VERSIONS)}")
+    if schema_version not in SUPPORTED_VERSIONS:
+        raise ValueError(
+            f"schema_version must be one of: {', '.join(SUPPORTED_VERSIONS)}"
+        )
 
     # Construct metadata for each geometry
     column_metadata = {}
@@ -94,7 +96,7 @@ def _create_metadata(df, version=None):
 
         crs = None
         if series.crs:
-            if version == "0.1.0":
+            if schema_version == "0.1.0":
                 crs = series.crs.to_wkt()
             else:  # version >= 0.4.0
                 crs = series.crs.to_json_dict()
@@ -112,7 +114,7 @@ def _create_metadata(df, version=None):
     return {
         "primary_column": df._geometry_column_name,
         "columns": column_metadata,
-        "version": METADATA_VERSION,
+        "version": schema_version or METADATA_VERSION,
         "creator": {"library": "geopandas", "version": geopandas.__version__},
     }
 
@@ -224,7 +226,7 @@ def _validate_metadata(metadata):
             raise ValueError("Only WKB geometry encoding is supported")
 
 
-def _geopandas_to_arrow(df, index=None, version=None):
+def _geopandas_to_arrow(df, index=None, schema_version=None):
     """
     Helper function with main, shared logic for to_parquet/to_feather.
     """
@@ -233,7 +235,7 @@ def _geopandas_to_arrow(df, index=None, version=None):
     _validate_dataframe(df)
 
     # create geo metadata before altering incoming data frame
-    geo_metadata = _create_metadata(df, version=version)
+    geo_metadata = _create_metadata(df, schema_version=schema_version)
 
     df = df.to_wkb()
 
@@ -243,10 +245,13 @@ def _geopandas_to_arrow(df, index=None, version=None):
     # This must be done AFTER creating the table or it is not persisted
     metadata = table.schema.metadata
     metadata.update({b"geo": _encode_metadata(geo_metadata)})
+
     return table.replace_schema_metadata(metadata)
 
 
-def _to_parquet(df, path, index=None, compression="snappy", version=None, **kwargs):
+def _to_parquet(
+    df, path, index=None, compression="snappy", schema_version=None, **kwargs
+):
     """
     Write a GeoDataFrame to the Parquet format.
 
@@ -270,7 +275,7 @@ def _to_parquet(df, path, index=None, compression="snappy", version=None, **kwar
         output except `RangeIndex` which is stored as metadata only.
     compression : {'snappy', 'gzip', 'brotli', None}, default 'snappy'
         Name of the compression to use. Use ``None`` for no compression.
-    version : {'0.1.0', '0.4.0', None}
+    schema_version : {'0.1.0', '0.4.0', None}
         GeoParquet specification version; if not provided will default to
         latest supported version.
     kwargs
@@ -280,12 +285,23 @@ def _to_parquet(df, path, index=None, compression="snappy", version=None, **kwar
         "pyarrow.parquet", extra="pyarrow is required for Parquet support."
     )
 
+    if kwargs and "version" in kwargs and kwargs["version"] is not None:
+        if schema_version is None and kwargs["version"] in SUPPORTED_VERSIONS:
+            warnings.warn(
+                "the `version` parameter has been replaced with `schema_version`. "
+                "`version` will instead be passed directly to the underlying "
+                "parquet writer unless `version` is 0.1.0 or 0.4.0.",
+                FutureWarning,
+                stacklevel=2,
+            )
+            schema_version = kwargs.pop("version")
+
     path = _expand_user(path)
-    table = _geopandas_to_arrow(df, index=index, version=version)
+    table = _geopandas_to_arrow(df, index=index, schema_version=schema_version)
     parquet.write_table(table, path, compression=compression, **kwargs)
 
 
-def _to_feather(df, path, index=None, compression=None, version=None, **kwargs):
+def _to_feather(df, path, index=None, compression=None, schema_version=None, **kwargs):
     """
     Write a GeoDataFrame to the Feather format.
 
@@ -310,7 +326,7 @@ def _to_feather(df, path, index=None, compression=None, version=None, **kwargs):
     compression : {'zstd', 'lz4', 'uncompressed'}, optional
         Name of the compression to use. Use ``"uncompressed"`` for no
         compression. By default uses LZ4 if available, otherwise uncompressed.
-    version : {'0.1.0', '0.4.0', None}
+    schema_version : {'0.1.0', '0.4.0', None}
         GeoParquet specification version; if not provided will default to
         latest supported version.
     kwargs
@@ -325,8 +341,19 @@ def _to_feather(df, path, index=None, compression=None, version=None, **kwargs):
     if Version(pyarrow.__version__) < Version("0.17.0"):
         raise ImportError("pyarrow >= 0.17 required for Feather support")
 
+    if kwargs and "version" in kwargs and kwargs["version"] is not None:
+        if schema_version is None and kwargs["version"] in SUPPORTED_VERSIONS:
+            warnings.warn(
+                "the `version` parameter has been replaced with `schema_version`. "
+                "`version` will instead be passed directly to the underlying "
+                "feather writer unless `version` is 0.1.0 or 0.4.0.",
+                FutureWarning,
+                stacklevel=2,
+            )
+            schema_version = kwargs.pop("version")
+
     path = _expand_user(path)
-    table = _geopandas_to_arrow(df, index=index, version=version)
+    table = _geopandas_to_arrow(df, index=index, schema_version=schema_version)
     feather.write_feather(table, path, compression=compression, **kwargs)
 
 
@@ -337,6 +364,7 @@ def _arrow_to_geopandas(table, metadata=None):
     df = table.to_pandas()
 
     metadata = metadata or table.schema.metadata
+
     if metadata is None or b"geo" not in metadata:
         raise ValueError(
             """Missing geo metadata in Parquet/Feather file.
diff --git a/geopandas/io/file.py b/geopandas/io/file.py
index 8c1783fc..1e20abf9 100644
--- a/geopandas/io/file.py
+++ b/geopandas/io/file.py
@@ -196,11 +196,12 @@ def _read_file(filename, bbox=None, mask=None, rows=None, engine=None, **kwargs)
         installed, otherwise tries "pyogrio".
     **kwargs :
         Keyword args to be passed to the engine. In case of the "fiona" engine,
-        the keyword arguments are passed to the `open` or `BytesCollection`
-        method in the fiona library when opening the file. For more information
-        on possible keywords, type: ``import fiona; help(fiona.open)``. In
-        case of the "pyogrio" engine, the keyword arguments are passed to
-        `pyogrio.read_dataframe`.
+        the keyword arguments are passed to :func:`fiona.open` or
+        :class:`fiona.collection.BytesCollection` when opening the file.
+        For more information on possible keywords, type:
+        ``import fiona; help(fiona.open)``. In case of the "pyogrio" engine,
+        the keyword arguments are passed to :func:`pyogrio.read_dataframe`.
+
 
     Examples
     --------
@@ -292,15 +293,19 @@ def _read_file_fiona(
 
     with fiona_env():
         with reader(path_or_bytes, **kwargs) as features:
-
-            # In a future Fiona release the crs attribute of features will
-            # no longer be a dict, but will behave like a dict. So this should
-            # be forwards compatible
-            crs = (
-                features.crs["init"]
-                if features.crs and "init" in features.crs
-                else features.crs_wkt
-            )
+            crs = features.crs_wkt
+            # attempt to get EPSG code
+            try:
+                # fiona 1.9+
+                epsg = features.crs.to_epsg(confidence_threshold=100)
+                if epsg is not None:
+                    crs = epsg
+            except AttributeError:
+                # fiona <= 1.8
+                try:
+                    crs = features.crs["init"]
+                except (TypeError, KeyError):
+                    pass
 
             # handle loading the bounding box
             if bbox is not None:
@@ -341,9 +346,16 @@ def _read_file_fiona(
                     f_filt, crs=crs, columns=columns + ["geometry"]
                 )
             for k in datetime_fields:
-                # fiona only supports up to ms precision, any microseconds are
-                # floating point rounding error
-                df[k] = pd.to_datetime(df[k]).dt.round(freq="ms")
+                as_dt = pd.to_datetime(df[k], errors="ignore")
+                # if to_datetime failed, try again for mixed timezone offsets
+                if as_dt.dtype == "object":
+                    # This can still fail if there are invalid datetimes
+                    as_dt = pd.to_datetime(df[k], errors="ignore", utc=True)
+                # if to_datetime succeeded, round datetimes as
+                # fiona only supports up to ms precision (any microseconds are
+                # floating point rounding error)
+                if not (as_dt.dtype == "object"):
+                    df[k] = as_dt.dt.round(freq="ms")
             return df
 
 
diff --git a/geopandas/plotting.py b/geopandas/plotting.py
index e1f09e03..7677d569 100644
--- a/geopandas/plotting.py
+++ b/geopandas/plotting.py
@@ -733,7 +733,12 @@ GON (((-122.84000 49.00000, -120.0000...
                 "Cannot specify 'categories' when column has categorical dtype"
             )
         categorical = True
-    elif values.dtype is np.dtype("O") or categories:
+    elif (
+        pd.api.types.is_object_dtype(values.dtype)
+        or pd.api.types.is_bool_dtype(values.dtype)
+        or pd.api.types.is_string_dtype(values.dtype)
+        or categories
+    ):
         categorical = True
 
     nan_idx = np.asarray(pd.isna(values), dtype="bool")
diff --git a/geopandas/sindex.py b/geopandas/sindex.py
index effa2082..85044ca4 100644
--- a/geopandas/sindex.py
+++ b/geopandas/sindex.py
@@ -55,8 +55,8 @@ class BaseSpatialIndex:
         ----------
         geometry : shapely geometry
             A single shapely geometry to query against the spatial index.
-        predicate : {None, 'intersects', 'within', 'contains', \
-'overlaps', 'crosses', 'touches'}, optional
+        predicate : {None, "contains", "contains_properly", "covered_by", "covers", \
+"crosses", "intersects", "overlaps", "touches", "within"}, optional
             If predicate is provided, the input geometry is
             tested using the predicate function against each item
             in the tree whose extent intersects the envelope of the
@@ -118,8 +118,8 @@ class BaseSpatialIndex:
         geometry : {GeoSeries, GeometryArray, numpy.array of PyGEOS geometries}
             Accepts GeoPandas geometry iterables (GeoSeries, GeometryArray)
             or a numpy array of PyGEOS geometries.
-        predicate : {None, 'intersects', 'within', 'contains', 'overlaps', \
-'crosses', 'touches'}, optional
+        predicate : {None, "contains", "contains_properly", "covered_by", "covers", \
+"crosses", "intersects", "overlaps", "touches", "within"}, optional
             If predicate is provided, the input geometries are tested using
             the predicate function against each item in the tree whose extent
             intersects the envelope of the each input geometry:
@@ -437,6 +437,7 @@ if compat.HAS_RTREE:
                 "overlaps",
                 "crosses",
                 "touches",
+                "covered_by",
                 "covers",
                 "contains_properly",
             }
@@ -502,6 +503,7 @@ if compat.HAS_RTREE:
                 if predicate in (
                     "contains",
                     "intersects",
+                    "covered_by",
                     "covers",
                     "contains_properly",
                 ):
@@ -669,8 +671,8 @@ if compat.HAS_PYGEOS:
             >>> from shapely.geometry import Point
             >>> s = geopandas.GeoSeries([Point(0, 0), Point(1, 1)])
             >>> s.sindex.valid_query_predicates  # doctest: +SKIP
-            {'contains', 'crosses', 'covered_by', None, 'intersects', 'within', \
-'touches', 'overlaps', 'contains_properly', 'covers'}
+            {None, "contains", "contains_properly", "covered_by", "covers", \
+"crosses", "intersects", "overlaps", "touches", "within"}
             """
             return _PYGEOS_PREDICATES
 
diff --git a/geopandas/tools/_show_versions.py b/geopandas/tools/_show_versions.py
index 4798515f..3d03ca46 100644
--- a/geopandas/tools/_show_versions.py
+++ b/geopandas/tools/_show_versions.py
@@ -86,19 +86,22 @@ def _get_deps_info():
     """
     deps = [
         "geopandas",
-        "pandas",
-        "fiona",
+        # required deps
         "numpy",
-        "shapely",
-        "rtree",
+        "pandas",
         "pyproj",
+        "shapely",
+        # optional deps
+        "fiona",
+        "geoalchemy2",
+        "geopy",
         "matplotlib",
         "mapclassify",
-        "geopy",
+        "pygeos",
+        "pyogrio",
         "psycopg2",
-        "geoalchemy2",
         "pyarrow",
-        "pygeos",
+        "rtree",
     ]
 
     def get_version(module):


Test patch:
diff --git a/ci/envs/38-latest-defaults.yaml b/ci/envs/38-latest-defaults.yaml
index a4c4ef7e..8dcf6f30 100644
--- a/ci/envs/38-latest-defaults.yaml
+++ b/ci/envs/38-latest-defaults.yaml
@@ -4,6 +4,7 @@ channels:
 dependencies:
   - python=3.8
   # required
+  - numpy=1.21  # pin to < 1.23 for compat with older shapely on defaults channel
   - pandas
   - shapely
   - fiona
diff --git a/geopandas/io/tests/test_arrow.py b/geopandas/io/tests/test_arrow.py
index 62657b99..ffe889aa 100644
--- a/geopandas/io/tests/test_arrow.py
+++ b/geopandas/io/tests/test_arrow.py
@@ -105,8 +105,8 @@ def test_crs_metadata_datum_ensemble():
 
 def test_write_metadata_invalid_spec_version():
     gdf = geopandas.GeoDataFrame(geometry=[box(0, 0, 10, 10)], crs="EPSG:4326")
-    with pytest.raises(ValueError, match="version must be one of"):
-        _create_metadata(gdf, version="invalid")
+    with pytest.raises(ValueError, match="schema_version must be one of"):
+        _create_metadata(gdf, schema_version="invalid")
 
 
 def test_encode_metadata():
@@ -259,7 +259,7 @@ def test_to_parquet_does_not_pass_engine_along(mock_to_parquet):
     # assert that engine keyword is not passed through to _to_parquet (and thus
     # parquet.write_table)
     mock_to_parquet.assert_called_with(
-        df, "", compression="snappy", index=None, version=None
+        df, "", compression="snappy", index=None, schema_version=None
     )
 
 
@@ -679,9 +679,10 @@ def test_write_read_default_crs(tmpdir, format):
 
 
 @pytest.mark.parametrize(
-    "format,version", product(["feather", "parquet"], [None] + SUPPORTED_VERSIONS)
+    "format,schema_version",
+    product(["feather", "parquet"], [None] + SUPPORTED_VERSIONS),
 )
-def test_write_spec_version(tmpdir, format, version):
+def test_write_spec_version(tmpdir, format, schema_version):
     if format == "feather":
         from pyarrow.feather import read_table
 
@@ -691,7 +692,7 @@ def test_write_spec_version(tmpdir, format, version):
     filename = os.path.join(str(tmpdir), f"test.{format}")
     gdf = geopandas.GeoDataFrame(geometry=[box(0, 0, 10, 10)], crs="EPSG:4326")
     write = getattr(gdf, f"to_{format}")
-    write(filename, version=version)
+    write(filename, schema_version=schema_version)
 
     # ensure that we can roundtrip data regardless of version
     read = getattr(geopandas, f"read_{format}")
@@ -700,10 +701,10 @@ def test_write_spec_version(tmpdir, format, version):
 
     table = read_table(filename)
     metadata = json.loads(table.schema.metadata[b"geo"])
-    assert metadata["version"] == version or METADATA_VERSION
+    assert metadata["version"] == schema_version or METADATA_VERSION
 
     # verify that CRS is correctly handled between versions
-    if version == "0.1.0":
+    if schema_version == "0.1.0":
         assert metadata["columns"]["geometry"]["crs"] == gdf.crs.to_wkt()
 
     else:
@@ -712,6 +713,46 @@ def test_write_spec_version(tmpdir, format, version):
         assert metadata["columns"]["geometry"]["crs"] == crs_expected
 
 
+@pytest.mark.parametrize(
+    "format,version", product(["feather", "parquet"], [None] + SUPPORTED_VERSIONS)
+)
+def test_write_deprecated_version_parameter(tmpdir, format, version):
+    if format == "feather":
+        from pyarrow.feather import read_table
+
+        version = version or 2
+
+    else:
+        from pyarrow.parquet import read_table
+
+        version = version or "2.6"
+
+    filename = os.path.join(str(tmpdir), f"test.{format}")
+    gdf = geopandas.GeoDataFrame(geometry=[box(0, 0, 10, 10)], crs="EPSG:4326")
+    write = getattr(gdf, f"to_{format}")
+
+    if version in SUPPORTED_VERSIONS:
+        with pytest.warns(
+            FutureWarning,
+            match="the `version` parameter has been replaced with `schema_version`",
+        ):
+            write(filename, version=version)
+
+    else:
+        # no warning raised if not one of the captured versions
+        write(filename, version=version)
+
+    table = read_table(filename)
+    metadata = json.loads(table.schema.metadata[b"geo"])
+
+    if version in SUPPORTED_VERSIONS:
+        # version is captured as a parameter
+        assert metadata["version"] == version
+    else:
+        # version is passed to underlying writer
+        assert metadata["version"] == METADATA_VERSION
+
+
 @pytest.mark.parametrize("version", ["0.1.0", "0.4.0"])
 def test_read_versioned_file(version):
     """
diff --git a/geopandas/io/tests/test_file.py b/geopandas/io/tests/test_file.py
index fcb9e54b..2ccbd949 100644
--- a/geopandas/io/tests/test_file.py
+++ b/geopandas/io/tests/test_file.py
@@ -10,6 +10,7 @@ import numpy as np
 import pandas as pd
 
 import pytz
+from pandas.api.types import is_datetime64_any_dtype
 from pandas.testing import assert_series_equal
 from shapely.geometry import Point, Polygon, box
 
@@ -32,12 +33,14 @@ except ImportError:
 try:
     import fiona
 
-    FIONA_GE_1814 = Version(fiona.__version__) >= Version(
-        "1.8.14"
-    )  # datetime roundtrip
+    # datetime roundtrip
+    FIONA_GE_1814 = Version(fiona.__version__) >= Version("1.8.14")
+    # invalid datetime handling
+    FIONA_GE_1821 = Version(fiona.__version__) >= Version("1.8.21")
 except ImportError:
     fiona = False
     FIONA_GE_1814 = False
+    FIONA_GE_1821 = False
 
 
 PYOGRIO_MARK = pytest.mark.skipif(not pyogrio, reason="pyogrio not installed")
@@ -231,6 +234,85 @@ def test_to_file_datetime(tmpdir, driver, ext, time, engine):
         assert_series_equal(df["b"], df_read["b"])
 
 
+dt_exts = ["gpkg", "geojson"]
+
+
+def write_invalid_date_file(date_str, tmpdir, ext, engine):
+    tempfilename = os.path.join(str(tmpdir), f"test_invalid_datetime.{ext}")
+    df = GeoDataFrame(
+        {
+            "date": ["2014-08-26T10:01:23", "2014-08-26T10:01:23", date_str],
+            "geometry": [Point(1, 1), Point(1, 1), Point(1, 1)],
+        }
+    )
+    # Schema not required for GeoJSON since not typed, but needed for GPKG
+    if ext == "geojson":
+        df.to_file(tempfilename)
+    else:
+        schema = {"geometry": "Point", "properties": {"date": "datetime"}}
+        if engine == "pyogrio" and not fiona:
+            # (use schema to write the invalid date without pandas datetimes
+            pytest.skip("test requires fiona kwarg schema")
+        df.to_file(tempfilename, schema=schema, engine="fiona")
+    return tempfilename
+
+
+@pytest.mark.parametrize("ext", dt_exts)
+def test_read_file_datetime_invalid(tmpdir, ext, engine):
+    # https://github.com/geopandas/geopandas/issues/2502
+    if not FIONA_GE_1821 and ext == "gpkg":
+        # https://github.com/Toblerity/Fiona/issues/1035
+        pytest.skip("Invalid datetime throws in Fiona<1.8.21")
+
+    date_str = "9999-99-99T00:00:00"  # invalid date handled by GDAL
+    tempfilename = write_invalid_date_file(date_str, tmpdir, ext, engine)
+    res = read_file(tempfilename)
+    if ext == "gpkg":
+        assert is_datetime64_any_dtype(res["date"])
+        assert pd.isna(res["date"].iloc[-1])
+    else:
+        assert res["date"].dtype == "object"
+        assert isinstance(res["date"].iloc[-1], str)
+
+
+@pytest.mark.parametrize("ext", dt_exts)
+def test_read_file_datetime_out_of_bounds_ns(tmpdir, ext, engine):
+    # https://github.com/geopandas/geopandas/issues/2502
+    if ext == "geojson":
+        skip_pyogrio_not_supported(engine)
+
+    date_str = "9999-12-31T00:00:00"  # valid to GDAL, not to [ns] format
+    tempfilename = write_invalid_date_file(date_str, tmpdir, ext, engine)
+    res = read_file(tempfilename)
+    # Pandas invalid datetimes are read in as object dtype (strings)
+    assert res["date"].dtype == "object"
+    assert isinstance(res["date"].iloc[0], str)
+
+
+def test_read_file_datetime_mixed_offsets(tmpdir):
+    # https://github.com/geopandas/geopandas/issues/2478
+    tempfilename = os.path.join(str(tmpdir), "test_mixed_datetime.geojson")
+    df = GeoDataFrame(
+        {
+            "date": [
+                "2014-08-26 10:01:23.040001+02:00",
+                "2019-03-07 17:31:43.118999+01:00",
+            ],
+            "geometry": [Point(1, 1), Point(1, 1)],
+        }
+    )
+    df.to_file(tempfilename)
+    # check mixed tz don't crash GH2478
+    res = read_file(tempfilename)
+    if FIONA_GE_1814:
+        # Convert mixed timezones to UTC equivalent
+        assert is_datetime64_any_dtype(res["date"])
+        assert res["date"].dt.tz == pytz.utc
+    else:
+        # old fiona and pyogrio ignore timezones and read as datetimes successfully
+        assert is_datetime64_any_dtype(res["date"])
+
+
 @pytest.mark.parametrize("driver,ext", driver_ext_pairs)
 def test_to_file_with_point_z(tmpdir, ext, driver, engine):
     """Test that 3D geometries are retained in writes (GH #612)."""
diff --git a/geopandas/tests/test_explore.py b/geopandas/tests/test_explore.py
index f6e12f43..a885a75d 100644
--- a/geopandas/tests/test_explore.py
+++ b/geopandas/tests/test_explore.py
@@ -256,10 +256,24 @@ class TestExplore:
     def test_bool(self):
         df = self.nybb.copy()
         df["bool"] = [True, False, True, False, True]
-        m = df.explore("bool")
+        df["bool_extension"] = pd.array([True, False, True, False, True])
+        m1 = df.explore("bool")
+        m2 = df.explore("bool_extension")
+
+        out1_str = self._fetch_map_string(m1)
+        assert '"__folium_color":"#9edae5","bool":true' in out1_str
+        assert '"__folium_color":"#1f77b4","bool":false' in out1_str
+
+        out2_str = self._fetch_map_string(m2)
+        assert '"__folium_color":"#9edae5","bool":true' in out2_str
+        assert '"__folium_color":"#1f77b4","bool":false' in out2_str
+
+    def test_string(self):
+        df = self.nybb.copy()
+        df["string"] = pd.array([1, 2, 3, 4, 5], dtype="string")
+        m = df.explore("string")
         out_str = self._fetch_map_string(m)
-        assert '"__folium_color":"#9edae5","bool":true' in out_str
-        assert '"__folium_color":"#1f77b4","bool":false' in out_str
+        assert '"__folium_color":"#9edae5","string":"5"' in out_str
 
     def test_column_values(self):
         """
diff --git a/geopandas/tests/test_geodataframe.py b/geopandas/tests/test_geodataframe.py
index a1a02ae2..3cff5104 100644
--- a/geopandas/tests/test_geodataframe.py
+++ b/geopandas/tests/test_geodataframe.py
@@ -1220,6 +1220,25 @@ class TestConstructor:
         with pytest.raises(ValueError):
             GeoDataFrame(df3, geometry="geom")
 
+    @pytest.mark.parametrize("dtype", ["geometry", "object"])
+    def test_multiindex_with_geometry_label(self, dtype):
+        # DataFrame with MultiIndex where "geometry" label corresponds to
+        # multiple columns
+        df = pd.DataFrame([[Point(0, 0), Point(1, 1)], [Point(2, 2), Point(3, 3)]])
+        df = df.astype(dtype)
+        df.columns = pd.MultiIndex.from_product([["geometry"], [0, 1]])
+        # don't error in constructor
+        gdf = GeoDataFrame(df)
+        # Getting the .geometry column gives GeoDataFrame for both columns
+        # (but with first MultiIndex level removed)
+        # TODO should this give an error instead?
+        result = gdf.geometry
+        assert result.shape == gdf.shape
+        assert result.columns.tolist() == [0, 1]
+        assert_frame_equal(result, gdf["geometry"])
+        result = gdf[["geometry"]]
+        assert_frame_equal(result, gdf if dtype == "geometry" else pd.DataFrame(gdf))
+
 
 def test_geodataframe_crs():
     gdf = GeoDataFrame(columns=["geometry"])
diff --git a/geopandas/tests/test_geom_methods.py b/geopandas/tests/test_geom_methods.py
index 013dc45e..fdd0e3e8 100644
--- a/geopandas/tests/test_geom_methods.py
+++ b/geopandas/tests/test_geom_methods.py
@@ -1220,6 +1220,24 @@ class TestGeomMethods:
         )
         assert_geodataframe_equal(test_df, expected_df)
 
+    @pytest.mark.parametrize("geom_col", ["geom", "geometry"])
+    def test_explode_geometry_name(self, geom_col):
+        s = GeoSeries([MultiPoint([Point(1, 2), Point(2, 3)]), Point(5, 5)])
+        df = GeoDataFrame({"col": [1, 2], geom_col: s}, geometry=geom_col)
+        test_df = df.explode(index_parts=True)
+
+        assert test_df.geometry.name == geom_col
+        assert test_df.geometry.name == test_df._geometry_column_name
+
+    def test_explode_geometry_name_two_geoms(self):
+        s = GeoSeries([MultiPoint([Point(1, 2), Point(2, 3)]), Point(5, 5)])
+        df = GeoDataFrame({"col": [1, 2], "geom": s, "geometry": s}, geometry="geom")
+        test_df = df.explode(index_parts=True)
+
+        assert test_df.geometry.name == "geom"
+        assert test_df.geometry.name == test_df._geometry_column_name
+        assert "geometry" in test_df.columns
+
     #
     # Test '&', '|', '^', and '-'
     #
diff --git a/geopandas/tests/test_op_output_types.py b/geopandas/tests/test_op_output_types.py
index 3a4155c7..5a447f39 100644
--- a/geopandas/tests/test_op_output_types.py
+++ b/geopandas/tests/test_op_output_types.py
@@ -289,6 +289,11 @@ def test_expanddim_in_unstack():
     else:  # pandas GH37369, unstack doesn't call finalize
         assert unstack._geometry_column_name == "geometry"
 
+    # https://github.com/geopandas/geopandas/issues/2486
+    s.name = "geometry"
+    unstack = s.unstack()
+    assert_object(unstack, GeoDataFrame, None, None)
+
 
 # indexing /  constructor_sliced tests
 
diff --git a/geopandas/tests/test_pandas_methods.py b/geopandas/tests/test_pandas_methods.py
index 252af1d1..90a4aa9b 100644
--- a/geopandas/tests/test_pandas_methods.py
+++ b/geopandas/tests/test_pandas_methods.py
@@ -655,6 +655,40 @@ def test_df_apply_returning_series(df):
 
     result = df.apply(lambda row: row.value1, axis=1)
     assert_series_equal(result, df["value1"].rename(None))
+    # https://github.com/geopandas/geopandas/issues/2480
+    result = df.apply(lambda x: float("NaN"), axis=1)
+    assert result.dtype == "float64"
+    # assert list of nones is not promoted to GeometryDtype
+    result = df.apply(lambda x: None, axis=1)
+    assert result.dtype == "object"
+
+
+def test_df_apply_geometry_dtypes(df):
+    # https://github.com/geopandas/geopandas/issues/1852
+    apply_types = []
+
+    def get_dtypes(srs):
+        apply_types.append((srs.name, type(srs)))
+
+    df["geom2"] = df.geometry
+    df.apply(get_dtypes)
+    expected = [
+        ("geometry", GeoSeries),
+        ("value1", pd.Series),
+        ("value2", pd.Series),
+        ("geom2", GeoSeries),
+    ]
+    assert apply_types == expected
+
+
+def test_pivot(df):
+    # https://github.com/geopandas/geopandas/issues/2057
+    # pivot failing due to creating a MultiIndex
+    result = df.pivot(columns="value1")
+    expected = GeoDataFrame(pd.DataFrame(df).pivot(columns="value1"))
+    # TODO assert_geodataframe_equal crashes
+    assert isinstance(result, GeoDataFrame)
+    assert_frame_equal(result, expected)
 
 
 def test_preserve_attrs(df):
diff --git a/geopandas/tests/test_plotting.py b/geopandas/tests/test_plotting.py
index bea0800f..3a3c9c38 100644
--- a/geopandas/tests/test_plotting.py
+++ b/geopandas/tests/test_plotting.py
@@ -374,6 +374,9 @@ class TestPointPlotting:
         self.df["cats_ordered"] = pd.Categorical(
             ["cat2", "cat1"] * 5, categories=["cat2", "cat1"]
         )
+        self.df["bool"] = [False, True] * 5
+        self.df["bool_extension"] = pd.array([False, True] * 5)
+        self.df["cats_string"] = pd.array(["cat1", "cat2"] * 5, dtype="string")
 
         ax1 = self.df.plot("cats_object", legend=True)
         ax2 = self.df.plot("cats", legend=True)
@@ -381,14 +384,17 @@ class TestPointPlotting:
         ax4 = self.df.plot("singlecat", legend=True)
         ax5 = self.df.plot("cats_ordered", legend=True)
         ax6 = self.df.plot("nums", categories=[1, 2], legend=True)
+        ax7 = self.df.plot("bool", legend=True)
+        ax8 = self.df.plot("bool_extension", legend=True)
+        ax9 = self.df.plot("cats_string", legend=True)
 
         point_colors1 = ax1.collections[0].get_facecolors()
-        for ax in [ax2, ax3, ax4, ax5, ax6]:
+        for ax in [ax2, ax3, ax4, ax5, ax6, ax7, ax8, ax9]:
             point_colors2 = ax.collections[0].get_facecolors()
             np.testing.assert_array_equal(point_colors1[1], point_colors2[1])
 
         legend1 = [x.get_markerfacecolor() for x in ax1.get_legend().get_lines()]
-        for ax in [ax2, ax3, ax4, ax5, ax6]:
+        for ax in [ax2, ax3, ax4, ax5, ax6, ax7, ax8, ax9]:
             legend2 = [x.get_markerfacecolor() for x in ax.get_legend().get_lines()]
             np.testing.assert_array_equal(legend1, legend2)
 
@@ -1740,6 +1746,7 @@ class TestGeoplotAccessor:
                         ModuleNotFoundError, match="No module named 'scipy'"
                     ):
                         self.gdf.plot(kind=kind)
+                    return
             elif kind in _y_kinds:
                 kwargs = {"y": "y"}
             elif kind in _xy_kinds:
diff --git a/geopandas/tools/tests/test_sjoin.py b/geopandas/tools/tests/test_sjoin.py
index 80a9972d..50bdfacf 100644
--- a/geopandas/tools/tests/test_sjoin.py
+++ b/geopandas/tools/tests/test_sjoin.py
@@ -269,7 +269,19 @@ class TestSpatialJoin:
         empty = sjoin(not_in, polygons, how="inner", predicate="intersects")
         assert empty.empty
 
-    @pytest.mark.parametrize("predicate", ["intersects", "contains", "within"])
+    @pytest.mark.parametrize(
+        "predicate",
+        [
+            "contains",
+            "contains_properly",
+            "covered_by",
+            "covers",
+            "crosses",
+            "intersects",
+            "touches",
+            "within",
+        ],
+    )
     @pytest.mark.parametrize(
         "empty",
         [