Repository: PennyLaneAI/pennylane
Pull request #1552 (2021-08-18 13:06:32)

Decomposition of arbitrary two-qubit unitaries.
**Context:** Addition of compilation tools to PennyLane.

**Description of the Change:** Adds a decomposition method for arbitrary two-qubit unitary operations.

**Benefits:** Any two-qubit unitary in a circuit can now be decomposed into elementary operations, in all interfaces. 

**Possible Drawbacks:** This method was very very challenging to implement. I was not able to get full differentiability (there are some notes in the `two_qubit_unitary.py`file about this). It is possible to take gradients when the two-qubit unitaries that are decomposed are constant (i.e., do not depend on the QNode parameters), but not when they do depend on the QNode parameters.

**Related GitHub Issues:** None

github-actions[bot]: Hello. You may have forgotten to update the changelog!
Please edit [.github/CHANGELOG.md](/PennyLaneAI/pennylane/blob/master/.github/CHANGELOG.md) with:
* A one-to-two sentence description of the change. You may include a small working example for new features.
* A link back to this PR.
* Your name (or GitHub username) in the contributors section.
glassnotes: @josh146 this is ready for a first look. I am just having trouble getting the differentiability working.
codecov[bot]: # [Codecov](https://codecov.io/gh/PennyLaneAI/pennylane/pull/1552?src=pr&el=h1&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=PennyLaneAI) Report
> Merging [#1552](https://codecov.io/gh/PennyLaneAI/pennylane/pull/1552?src=pr&el=desc&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=PennyLaneAI) (272e2a3) into [master](https://codecov.io/gh/PennyLaneAI/pennylane/commit/02c264d0b0f80fcb46f0d931c1e23fe210d6ffb5?el=desc&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=PennyLaneAI) (02c264d) will **decrease** coverage by `55.80%`.
> The diff coverage is `16.41%`.

[![Impacted file tree graph](https://codecov.io/gh/PennyLaneAI/pennylane/pull/1552/graphs/tree.svg?width=650&height=150&src=pr&token=9S3YzlUgGk&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=PennyLaneAI)](https://codecov.io/gh/PennyLaneAI/pennylane/pull/1552?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=PennyLaneAI)

```diff
@@             Coverage Diff             @@
##           master    #1552       +/-   ##
===========================================
- Coverage   99.14%   43.33%   -55.81%     
===========================================
  Files         196      197        +1     
  Lines       14241    14370      +129     
===========================================
- Hits        14119     6227     -7892     
- Misses        122     8143     +8021     
```


| [Impacted Files](https://codecov.io/gh/PennyLaneAI/pennylane/pull/1552?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=PennyLaneAI) | Coverage Δ | |
|---|---|---|
| [pennylane/ops/qubit/matrix\_ops.py](https://codecov.io/gh/PennyLaneAI/pennylane/pull/1552/diff?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=PennyLaneAI#diff-cGVubnlsYW5lL29wcy9xdWJpdC9tYXRyaXhfb3BzLnB5) | `75.92% <0.00%> (-23.12%)` | :arrow_down: |
| [pennylane/transforms/unitary\_to\_rot.py](https://codecov.io/gh/PennyLaneAI/pennylane/pull/1552/diff?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=PennyLaneAI#diff-cGVubnlsYW5lL3RyYW5zZm9ybXMvdW5pdGFyeV90b19yb3QucHk=) | `31.57% <9.09%> (-60.09%)` | :arrow_down: |
| [...ane/transforms/decompositions/two\_qubit\_unitary.py](https://codecov.io/gh/PennyLaneAI/pennylane/pull/1552/diff?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=PennyLaneAI#diff-cGVubnlsYW5lL3RyYW5zZm9ybXMvZGVjb21wb3NpdGlvbnMvdHdvX3F1Yml0X3VuaXRhcnkucHk=) | `16.23% <16.23%> (ø)` | |
| [pennylane/transforms/\_\_init\_\_.py](https://codecov.io/gh/PennyLaneAI/pennylane/pull/1552/diff?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=PennyLaneAI#diff-cGVubnlsYW5lL3RyYW5zZm9ybXMvX19pbml0X18ucHk=) | `100.00% <100.00%> (ø)` | |
| [pennylane/transforms/decompositions/\_\_init\_\_.py](https://codecov.io/gh/PennyLaneAI/pennylane/pull/1552/diff?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=PennyLaneAI#diff-cGVubnlsYW5lL3RyYW5zZm9ybXMvZGVjb21wb3NpdGlvbnMvX19pbml0X18ucHk=) | `100.00% <100.00%> (ø)` | |
| [pennylane/qnn/keras.py](https://codecov.io/gh/PennyLaneAI/pennylane/pull/1552/diff?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=PennyLaneAI#diff-cGVubnlsYW5lL3Fubi9rZXJhcy5weQ==) | `0.00% <0.00%> (-100.00%)` | :arrow_down: |
| [pennylane/qnn/torch.py](https://codecov.io/gh/PennyLaneAI/pennylane/pull/1552/diff?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=PennyLaneAI#diff-cGVubnlsYW5lL3Fubi90b3JjaC5weQ==) | `0.00% <0.00%> (-100.00%)` | :arrow_down: |
| [pennylane/beta/\_\_init\_\_.py](https://codecov.io/gh/PennyLaneAI/pennylane/pull/1552/diff?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=PennyLaneAI#diff-cGVubnlsYW5lL2JldGEvX19pbml0X18ucHk=) | `0.00% <0.00%> (-100.00%)` | :arrow_down: |
| [pennylane/fourier/utils.py](https://codecov.io/gh/PennyLaneAI/pennylane/pull/1552/diff?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=PennyLaneAI#diff-cGVubnlsYW5lL2ZvdXJpZXIvdXRpbHMucHk=) | `0.00% <0.00%> (-100.00%)` | :arrow_down: |
| [pennylane/devices/tf\_ops.py](https://codecov.io/gh/PennyLaneAI/pennylane/pull/1552/diff?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=PennyLaneAI#diff-cGVubnlsYW5lL2RldmljZXMvdGZfb3BzLnB5) | `0.00% <0.00%> (-100.00%)` | :arrow_down: |
| ... and [158 more](https://codecov.io/gh/PennyLaneAI/pennylane/pull/1552/diff?src=pr&el=tree-more&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=PennyLaneAI) | |

------

[Continue to review full report at Codecov](https://codecov.io/gh/PennyLaneAI/pennylane/pull/1552?src=pr&el=continue&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=PennyLaneAI).
> **Legend** - [Click here to learn more](https://docs.codecov.io/docs/codecov-delta?utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=PennyLaneAI)
> `Δ = absolute <relative> (impact)`, `ø = not affected`, `? = missing data`
> Powered by [Codecov](https://codecov.io/gh/PennyLaneAI/pennylane/pull/1552?src=pr&el=footer&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=PennyLaneAI). Last update [02c264d...272e2a3](https://codecov.io/gh/PennyLaneAI/pennylane/pull/1552?src=pr&el=lastupdated&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=PennyLaneAI). Read the [comment docs](https://docs.codecov.io/docs/pull-request-comments?utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=PennyLaneAI).

glassnotes: @josh146 everything is now working, including that sneaky QMC unitary, for which I've added as a test case. I do still have to fix one of the QMC tests to take into account that one of the unitaries in the template is being decomposed; but at this point it is ready for a re-review. (Re. the +3000 lines, a big chunk of these are unitary matrices used in test cases). 
josh146: (oh, and don't forget to fill in the new changelog!)

Patch:
diff --git a/doc/_static/two_qubit_decomposition_2_cnots.svg b/doc/_static/two_qubit_decomposition_2_cnots.svg
new file mode 100644
index 000000000..bb2c2592c
--- /dev/null
+++ b/doc/_static/two_qubit_decomposition_2_cnots.svg
@@ -0,0 +1,743 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   sodipodi:docname="two_qubit_decomposition_2_cnots.svg"
+   inkscape:version="0.92.5 (2060ec1f9f, 2020-04-08)"
+   version="1.1"
+   id="svg4541"
+   height="53.265354"
+   width="198.27621">
+  <sodipodi:namedview
+     inkscape:snap-global="false"
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="3.1726447"
+     inkscape:cx="148.14138"
+     inkscape:cy="6.0587383"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     showgrid="false"
+     inkscape:window-width="1916"
+     inkscape:window-height="1036"
+     inkscape:window-x="0"
+     inkscape:window-y="20"
+     inkscape:window-maximized="0"
+     fit-margin-top="0"
+     fit-margin-left="0"
+     fit-margin-right="0"
+     fit-margin-bottom="0"
+     inkscape:document-rotation="0" />
+  <defs
+     id="defs4543">
+    <inkscape:path-effect
+       lpeversion="0"
+       is_visible="true"
+       id="path-effect8308"
+       effect="spiro" />
+    <inkscape:path-effect
+       is_visible="true"
+       id="path-effect7251"
+       effect="spiro"
+       lpeversion="0" />
+    <marker
+       inkscape:stockid="Arrow1Mend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow1Mend"
+       style="overflow:visible"
+       inkscape:isstock="true">
+      <path
+         id="path6650"
+         d="M 0,0 5,-5 -12.5,0 5,5 Z"
+         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
+         transform="matrix(-0.4,0,0,-0.4,-4,0)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow1Lend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow1Lend"
+       style="overflow:visible"
+       inkscape:isstock="true">
+      <path
+         id="path6644"
+         d="M 0,0 5,-5 -12.5,0 5,5 Z"
+         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
+         transform="matrix(-0.8,0,0,-0.8,-10,0)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <inkscape:path-effect
+       effect="spiro"
+       id="path-effect4189"
+       is_visible="true"
+       lpeversion="0" />
+    <inkscape:path-effect
+       effect="spiro"
+       id="path-effect4185"
+       is_visible="true"
+       lpeversion="0" />
+    <inkscape:path-effect
+       effect="spiro"
+       id="path-effect4185-9"
+       is_visible="true"
+       lpeversion="0" />
+    <inkscape:path-effect
+       effect="spiro"
+       id="path-effect4185-9-8"
+       is_visible="true"
+       lpeversion="0" />
+    <inkscape:path-effect
+       effect="spiro"
+       id="path-effect4185-1"
+       is_visible="true"
+       lpeversion="0" />
+    <inkscape:path-effect
+       effect="spiro"
+       id="path-effect4185-9-8-7"
+       is_visible="true"
+       lpeversion="0" />
+    <inkscape:path-effect
+       effect="spiro"
+       id="path-effect4185-9-9"
+       is_visible="true"
+       lpeversion="0" />
+    <inkscape:path-effect
+       effect="spiro"
+       id="path-effect4185-9-9-2"
+       is_visible="true"
+       lpeversion="0" />
+    <inkscape:path-effect
+       effect="spiro"
+       id="path-effect4185-9-9-2-3"
+       is_visible="true"
+       lpeversion="0" />
+    <marker
+       inkscape:stockid="Arrow1Mend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow1Mend-9"
+       style="overflow:visible"
+       inkscape:isstock="true">
+      <path
+         inkscape:connector-curvature="0"
+         id="path6650-2"
+         d="M 0,0 5,-5 -12.5,0 5,5 Z"
+         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
+         transform="matrix(-0.4,0,0,-0.4,-4,0)" />
+    </marker>
+    <inkscape:path-effect
+       effect="spiro"
+       id="path-effect4185-9-9-2-3-7"
+       is_visible="true"
+       lpeversion="0" />
+    <inkscape:path-effect
+       effect="spiro"
+       id="path-effect4185-9-9-2-3-7-9"
+       is_visible="true"
+       lpeversion="0" />
+    <g
+       id="g5447">
+      <symbol
+         overflow="visible"
+         id="symbol8357"
+         style="overflow:visible">
+        <path
+           style="stroke:none"
+           d=""
+           id="path1694"
+           inkscape:connector-curvature="0" />
+      </symbol>
+      <symbol
+         overflow="visible"
+         id="symbol1959"
+         style="overflow:visible">
+        <path
+           style="stroke:none"
+           d="m 1.578125,-7.125 c 0,-0.171875 0,-0.359375 -0.1875,-0.359375 -0.203125,0 -0.203125,0.1875 -0.203125,0.359375 v 9.265625 c 0,0.171875 0,0.359375 0.203125,0.359375 0.1875,0 0.1875,-0.1875 0.1875,-0.359375 z m 0,0"
+           id="path5509"
+           inkscape:connector-curvature="0" />
+      </symbol>
+      <symbol
+         overflow="visible"
+         id="symbol7045"
+         style="overflow:visible">
+        <path
+           style="stroke:none"
+           d="M 2.71875,-2.328125 C 2.765625,-2.4375 2.765625,-2.46875 2.765625,-2.5 c 0,-0.015625 0,-0.046875 -0.046875,-0.15625 L 0.984375,-7.25 c -0.0625,-0.171875 -0.125,-0.234375 -0.234375,-0.234375 -0.109375,0 -0.203125,0.09375 -0.203125,0.203125 0,0.03125 0,0.046875 0.046875,0.15625 L 2.359375,-2.5 0.59375,2.109375 C 0.546875,2.21875 0.546875,2.25 0.546875,2.296875 0.546875,2.40625 0.640625,2.5 0.75,2.5 0.875,2.5 0.921875,2.390625 0.953125,2.296875 Z m 0,0"
+           id="path3970"
+           inkscape:connector-curvature="0" />
+      </symbol>
+      <symbol
+         overflow="visible"
+         id="symbol5931"
+         style="overflow:visible">
+        <path
+           style="stroke:none"
+           d=""
+           id="path7974"
+           inkscape:connector-curvature="0" />
+      </symbol>
+      <symbol
+         overflow="visible"
+         id="symbol3047"
+         style="overflow:visible">
+        <path
+           style="stroke:none"
+           d="m 4.578125,-3.1875 c 0,-0.796875 -0.046875,-1.59375 -0.390625,-2.328125 -0.453125,-0.96875 -1.28125,-1.125 -1.6875,-1.125 -0.609375,0 -1.328125,0.265625 -1.75,1.1875 -0.3125,0.6875 -0.359375,1.46875 -0.359375,2.265625 0,0.75 0.03125,1.640625 0.453125,2.40625 0.421875,0.796875 1.15625,1 1.640625,1 0.53125,0 1.296875,-0.203125 1.734375,-1.15625 0.3125,-0.6875 0.359375,-1.46875 0.359375,-2.25 z M 2.484375,0 C 2.09375,0 1.5,-0.25 1.328125,-1.203125 1.21875,-1.796875 1.21875,-2.71875 1.21875,-3.3125 c 0,-0.640625 0,-1.296875 0.078125,-1.828125 0.1875,-1.1875 0.9375,-1.28125 1.1875,-1.28125 0.328125,0 0.984375,0.1875 1.171875,1.171875 0.109375,0.5625 0.109375,1.3125 0.109375,1.9375 0,0.75 0,1.421875 -0.109375,2.0625 C 3.5,-0.296875 2.9375,0 2.484375,0 Z m 0,0"
+           id="path9994"
+           inkscape:connector-curvature="0" />
+      </symbol>
+    </g>
+    <g
+       id="g6209">
+      <symbol
+         id="symbol7183"
+         overflow="visible"
+         style="overflow:visible">
+        <path
+           id="path463"
+           d=""
+           style="stroke:none"
+           inkscape:connector-curvature="0" />
+      </symbol>
+      <symbol
+         id="symbol1154"
+         overflow="visible"
+         style="overflow:visible">
+        <path
+           id="path3687"
+           d="m 3.734375,-6.125 c 0.0625,-0.234375 0.09375,-0.328125 0.28125,-0.359375 C 4.109375,-6.5 4.421875,-6.5 4.625,-6.5 c 0.703125,0 1.8125,0 1.8125,0.984375 0,0.34375 -0.15625,1.03125 -0.546875,1.421875 -0.265625,0.25 -0.78125,0.578125 -1.6875,0.578125 H 3.09375 Z m 1.4375,2.734375 c 1.015625,-0.21875 2.1875,-0.921875 2.1875,-1.921875 0,-0.859375 -0.890625,-1.5 -2.203125,-1.5 H 2.328125 c -0.203125,0 -0.296875,0 -0.296875,0.203125 C 2.03125,-6.5 2.125,-6.5 2.3125,-6.5 c 0.015625,0 0.203125,0 0.375,0.015625 0.1875,0.03125 0.265625,0.03125 0.265625,0.171875 0,0.03125 0,0.0625 -0.03125,0.1875 l -1.34375,5.34375 C 1.484375,-0.390625 1.46875,-0.3125 0.671875,-0.3125 0.5,-0.3125 0.40625,-0.3125 0.40625,-0.109375 0.40625,0 0.53125,0 0.546875,0 c 0.28125,0 0.984375,-0.03125 1.25,-0.03125 0.28125,0 1,0.03125 1.28125,0.03125 0.078125,0 0.1875,0 0.1875,-0.203125 0,-0.109375 -0.078125,-0.109375 -0.28125,-0.109375 -0.359375,0 -0.640625,0 -0.640625,-0.171875 0,-0.0625 0.015625,-0.109375 0.03125,-0.171875 l 0.65625,-2.640625 h 1.1875 c 0.90625,0 1.078125,0.5625 1.078125,0.90625 0,0.140625 -0.078125,0.453125 -0.140625,0.6875 C 5.09375,-1.421875 5,-1.0625 5,-0.859375 5,0.21875 6.203125,0.21875 6.328125,0.21875 c 0.84375,0 1.203125,-1 1.203125,-1.140625 0,-0.125 -0.109375,-0.125 -0.125,-0.125 -0.09375,0 -0.109375,0.0625 -0.125,0.140625 C 7.03125,-0.171875 6.59375,0 6.375,0 6.046875,0 5.96875,-0.21875 5.96875,-0.609375 c 0,-0.3125 0.0625,-0.8125 0.109375,-1.140625 0.015625,-0.140625 0.03125,-0.328125 0.03125,-0.46875 0,-0.765625 -0.671875,-1.078125 -0.9375,-1.171875 z m 0,0"
+           style="stroke:none"
+           inkscape:connector-curvature="0" />
+      </symbol>
+      <symbol
+         id="symbol9374"
+         overflow="visible"
+         style="overflow:visible">
+        <path
+           id="path9002"
+           d="m 4.53125,-4.984375 c 0,-0.65625 -0.171875,-2.046875 -1.1875,-2.046875 -1.390625,0 -2.921875,2.8125 -2.921875,5.09375 0,0.9375 0.28125,2.046875 1.1875,2.046875 1.40625,0 2.921875,-2.859375 2.921875,-5.09375 z M 1.46875,-3.625 C 1.640625,-4.25 1.84375,-5.046875 2.25,-5.765625 2.515625,-6.25 2.875,-6.8125 3.328125,-6.8125 c 0.484375,0 0.546875,0.640625 0.546875,1.203125 0,0.5 -0.078125,1 -0.3125,1.984375 z m 2,0.328125 C 3.359375,-2.84375 3.15625,-2 2.765625,-1.28125 c -0.34375,0.6875 -0.71875,1.171875 -1.15625,1.171875 -0.328125,0 -0.53125,-0.296875 -0.53125,-1.21875 0,-0.421875 0.0625,-1 0.3125,-1.96875 z m 0,0"
+           style="stroke:none"
+           inkscape:connector-curvature="0" />
+      </symbol>
+      <symbol
+         id="symbol3348"
+         overflow="visible"
+         style="overflow:visible">
+        <path
+           id="path8256"
+           d=""
+           style="stroke:none"
+           inkscape:connector-curvature="0" />
+      </symbol>
+      <symbol
+         id="symbol7060"
+         overflow="visible"
+         style="overflow:visible">
+        <path
+           id="path3411"
+           d="M 1.734375,-0.734375 C 1.671875,-0.5 1.4375,-0.125 1.078125,-0.125 c -0.015625,0 -0.234375,0 -0.375,-0.09375 0.28125,-0.09375 0.3125,-0.34375 0.3125,-0.390625 0,-0.15625 -0.125,-0.25 -0.28125,-0.25 -0.203125,0 -0.40625,0.15625 -0.40625,0.421875 0,0.34375 0.390625,0.5 0.734375,0.5 0.328125,0 0.609375,-0.1875 0.78125,-0.484375 C 2.015625,-0.0625 2.390625,0.0625 2.671875,0.0625 c 0.8125,0 1.234375,-0.859375 1.234375,-1.0625 0,-0.09375 -0.09375,-0.09375 -0.109375,-0.09375 -0.109375,0 -0.109375,0.046875 -0.140625,0.125 -0.140625,0.484375 -0.5625,0.84375 -0.953125,0.84375 -0.28125,0 -0.421875,-0.1875 -0.421875,-0.453125 0,-0.1875 0.171875,-0.8125 0.359375,-1.59375 C 2.78125,-2.703125 3.09375,-2.875 3.328125,-2.875 c 0.015625,0 0.21875,0 0.375,0.09375 -0.21875,0.0625 -0.3125,0.265625 -0.3125,0.390625 0,0.140625 0.125,0.25 0.28125,0.25 0.15625,0 0.390625,-0.125 0.390625,-0.421875 0,-0.390625 -0.453125,-0.515625 -0.71875,-0.515625 -0.359375,0 -0.640625,0.234375 -0.78125,0.5 -0.125,-0.28125 -0.453125,-0.5 -0.84375,-0.5 C 0.9375,-3.078125 0.5,-2.21875 0.5,-2 c 0,0.078125 0.09375,0.078125 0.109375,0.078125 0.09375,0 0.09375,-0.015625 0.140625,-0.109375 C 0.921875,-2.578125 1.359375,-2.875 1.703125,-2.875 1.9375,-2.875 2.125,-2.75 2.125,-2.421875 2.125,-2.28125 2.03125,-1.9375 1.96875,-1.6875 Z m 0,0"
+           style="stroke:none"
+           inkscape:connector-curvature="0" />
+      </symbol>
+      <symbol
+         id="symbol1294"
+         overflow="visible"
+         style="overflow:visible">
+        <path
+           id="path1940"
+           d=""
+           style="stroke:none"
+           inkscape:connector-curvature="0" />
+      </symbol>
+      <symbol
+         id="symbol7152"
+         overflow="visible"
+         style="overflow:visible">
+        <path
+           id="path3401"
+           d="m 3.296875,2.390625 c 0,-0.03125 0,-0.046875 -0.171875,-0.21875 C 1.890625,0.921875 1.5625,-0.96875 1.5625,-2.5 c 0,-1.734375 0.375,-3.46875 1.609375,-4.703125 0.125,-0.125 0.125,-0.140625 0.125,-0.171875 0,-0.078125 -0.03125,-0.109375 -0.09375,-0.109375 -0.109375,0 -1,0.6875 -1.59375,1.953125 -0.5,1.09375 -0.625,2.203125 -0.625,3.03125 0,0.78125 0.109375,1.984375 0.65625,3.125 C 2.25,1.84375 3.09375,2.5 3.203125,2.5 c 0.0625,0 0.09375,-0.03125 0.09375,-0.109375 z m 0,0"
+           style="stroke:none"
+           inkscape:connector-curvature="0" />
+      </symbol>
+      <symbol
+         id="symbol8261"
+         overflow="visible"
+         style="overflow:visible">
+        <path
+           id="path2832"
+           d="m 2.875,-2.5 c 0,-0.765625 -0.109375,-1.96875 -0.65625,-3.109375 -0.59375,-1.21875 -1.453125,-1.875 -1.546875,-1.875 -0.0625,0 -0.109375,0.046875 -0.109375,0.109375 0,0.03125 0,0.046875 0.1875,0.234375 0.984375,0.984375 1.546875,2.5625 1.546875,4.640625 0,1.71875 -0.359375,3.46875 -1.59375,4.71875 C 0.5625,2.34375 0.5625,2.359375 0.5625,2.390625 0.5625,2.453125 0.609375,2.5 0.671875,2.5 0.765625,2.5 1.671875,1.8125 2.25,0.546875 2.765625,-0.546875 2.875,-1.65625 2.875,-2.5 Z m 0,0"
+           style="stroke:none"
+           inkscape:connector-curvature="0" />
+      </symbol>
+    </g>
+    <marker
+       inkscape:isstock="true"
+       style="overflow:visible"
+       id="Arrow1Mend-9-5"
+       refX="0"
+       refY="0"
+       orient="auto"
+       inkscape:stockid="Arrow1Mend">
+      <path
+         transform="matrix(-0.4,0,0,-0.4,-4,0)"
+         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
+         d="M 0,0 5,-5 -12.5,0 5,5 Z"
+         id="path6650-2-6"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <g
+       id="g7363">
+      <symbol
+         id="symbol6780"
+         overflow="visible"
+         style="overflow:visible">
+        <path
+           id="path7757"
+           d=""
+           style="stroke:none"
+           inkscape:connector-curvature="0" />
+      </symbol>
+      <symbol
+         id="symbol3142"
+         overflow="visible"
+         style="overflow:visible">
+        <path
+           id="path1573"
+           d="m 3.734375,-6.125 c 0.0625,-0.234375 0.09375,-0.328125 0.28125,-0.359375 C 4.109375,-6.5 4.421875,-6.5 4.625,-6.5 c 0.703125,0 1.8125,0 1.8125,0.984375 0,0.34375 -0.15625,1.03125 -0.546875,1.421875 -0.265625,0.25 -0.78125,0.578125 -1.6875,0.578125 H 3.09375 Z m 1.4375,2.734375 c 1.015625,-0.21875 2.1875,-0.921875 2.1875,-1.921875 0,-0.859375 -0.890625,-1.5 -2.203125,-1.5 H 2.328125 c -0.203125,0 -0.296875,0 -0.296875,0.203125 C 2.03125,-6.5 2.125,-6.5 2.3125,-6.5 c 0.015625,0 0.203125,0 0.375,0.015625 0.1875,0.03125 0.265625,0.03125 0.265625,0.171875 0,0.03125 0,0.0625 -0.03125,0.1875 l -1.34375,5.34375 C 1.484375,-0.390625 1.46875,-0.3125 0.671875,-0.3125 0.5,-0.3125 0.40625,-0.3125 0.40625,-0.109375 0.40625,0 0.53125,0 0.546875,0 c 0.28125,0 0.984375,-0.03125 1.25,-0.03125 0.28125,0 1,0.03125 1.28125,0.03125 0.078125,0 0.1875,0 0.1875,-0.203125 0,-0.109375 -0.078125,-0.109375 -0.28125,-0.109375 -0.359375,0 -0.640625,0 -0.640625,-0.171875 0,-0.0625 0.015625,-0.109375 0.03125,-0.171875 l 0.65625,-2.640625 h 1.1875 c 0.90625,0 1.078125,0.5625 1.078125,0.90625 0,0.140625 -0.078125,0.453125 -0.140625,0.6875 C 5.09375,-1.421875 5,-1.0625 5,-0.859375 5,0.21875 6.203125,0.21875 6.328125,0.21875 c 0.84375,0 1.203125,-1 1.203125,-1.140625 0,-0.125 -0.109375,-0.125 -0.125,-0.125 -0.09375,0 -0.109375,0.0625 -0.125,0.140625 C 7.03125,-0.171875 6.59375,0 6.375,0 6.046875,0 5.96875,-0.21875 5.96875,-0.609375 c 0,-0.3125 0.0625,-0.8125 0.109375,-1.140625 0.015625,-0.140625 0.03125,-0.328125 0.03125,-0.46875 0,-0.765625 -0.671875,-1.078125 -0.9375,-1.171875 z m 0,0"
+           style="stroke:none"
+           inkscape:connector-curvature="0" />
+      </symbol>
+      <symbol
+         id="symbol1490"
+         overflow="visible"
+         style="overflow:visible">
+        <path
+           id="path2776"
+           d="M 1.6875,1.6875 C 1.65625,1.828125 1.640625,1.84375 1.640625,1.890625 c 0,0.21875 0.1875,0.28125 0.296875,0.28125 0.046875,0 0.265625,-0.03125 0.359375,-0.265625 C 2.328125,1.828125 2.375,1.5 2.65625,0.09375 c 0.078125,0 0.15625,0.015625 0.328125,0.015625 1.65625,0 3.1875,-1.5625 3.1875,-3.140625 0,-0.78125 -0.390625,-1.375 -1.140625,-1.375 -1.4375,0 -2.046875,1.9375 -2.640625,3.875 C 1.3125,-0.734375 0.75,-1.28125 0.75,-2 c 0,-0.28125 0.234375,-1.375 0.828125,-2.0625 0.09375,-0.09375 0.09375,-0.109375 0.09375,-0.140625 0,-0.03125 -0.03125,-0.09375 -0.125,-0.09375 -0.28125,0 -1.046875,1.453125 -1.046875,2.40625 0,0.9375 0.65625,1.65625 1.71875,1.90625 z m 1.390625,-2.15625 c -0.09375,0 -0.109375,0 -0.1875,-0.015625 -0.125,0 -0.125,0 -0.125,-0.03125 0,-0.015625 0.171875,-0.9375 0.1875,-1.078125 0.3125,-1.28125 1.09375,-2.234375 1.984375,-2.234375 0.6875,0 0.953125,0.53125 0.953125,1.015625 0,1.125 -1.28125,2.34375 -2.8125,2.34375 z m 0,0"
+           style="stroke:none"
+           inkscape:connector-curvature="0" />
+      </symbol>
+      <symbol
+         id="symbol9292"
+         overflow="visible"
+         style="overflow:visible">
+        <path
+           id="path5625"
+           d=""
+           style="stroke:none"
+           inkscape:connector-curvature="0" />
+      </symbol>
+      <symbol
+         id="symbol4231"
+         overflow="visible"
+         style="overflow:visible">
+        <path
+           id="path3453"
+           d="M 3.875,-2.625 C 3.90625,-2.71875 3.90625,-2.734375 3.90625,-2.78125 3.90625,-2.921875 3.796875,-3 3.671875,-3 3.59375,-3 3.46875,-2.96875 3.390625,-2.84375 3.359375,-2.796875 3.3125,-2.578125 3.28125,-2.4375 L 3.125,-1.859375 c -0.03125,0.171875 -0.25,1.046875 -0.28125,1.125 0,0 -0.3125,0.609375 -0.84375,0.609375 -0.484375,0 -0.484375,-0.453125 -0.484375,-0.578125 0,-0.375 0.15625,-0.8125 0.375,-1.359375 C 1.96875,-2.28125 2,-2.359375 2,-2.484375 2,-2.8125 1.71875,-3.078125 1.34375,-3.078125 0.640625,-3.078125 0.328125,-2.125 0.328125,-2 c 0,0.078125 0.09375,0.078125 0.125,0.078125 0.09375,0 0.09375,-0.03125 0.125,-0.109375 C 0.75,-2.609375 1.046875,-2.875 1.328125,-2.875 1.4375,-2.875 1.5,-2.796875 1.5,-2.640625 c 0,0.171875 -0.0625,0.3125 -0.09375,0.40625 C 1.0625,-1.375 1,-1.125 1,-0.8125 1,-0.703125 1,-0.375 1.265625,-0.140625 1.484375,0.03125 1.78125,0.0625 1.96875,0.0625 2.25,0.0625 2.5,-0.03125 2.71875,-0.25 2.640625,0.140625 2.5625,0.4375 2.265625,0.78125 2.078125,1 1.796875,1.21875 1.421875,1.21875 c -0.046875,0 -0.375,0 -0.515625,-0.21875 0.375,-0.046875 0.375,-0.375 0.375,-0.390625 0,-0.21875 -0.203125,-0.265625 -0.265625,-0.265625 -0.171875,0 -0.40625,0.140625 -0.40625,0.46875 0,0.34375 0.328125,0.609375 0.828125,0.609375 C 2.140625,1.421875 3,0.875 3.21875,0 Z m 0,0"
+           style="stroke:none"
+           inkscape:connector-curvature="0" />
+      </symbol>
+      <symbol
+         id="symbol9001"
+         overflow="visible"
+         style="overflow:visible">
+        <path
+           id="path5744"
+           d=""
+           style="stroke:none"
+           inkscape:connector-curvature="0" />
+      </symbol>
+      <symbol
+         id="symbol7466"
+         overflow="visible"
+         style="overflow:visible">
+        <path
+           id="path4536"
+           d="m 3.296875,2.390625 c 0,-0.03125 0,-0.046875 -0.171875,-0.21875 C 1.890625,0.921875 1.5625,-0.96875 1.5625,-2.5 c 0,-1.734375 0.375,-3.46875 1.609375,-4.703125 0.125,-0.125 0.125,-0.140625 0.125,-0.171875 0,-0.078125 -0.03125,-0.109375 -0.09375,-0.109375 -0.109375,0 -1,0.6875 -1.59375,1.953125 -0.5,1.09375 -0.625,2.203125 -0.625,3.03125 0,0.78125 0.109375,1.984375 0.65625,3.125 C 2.25,1.84375 3.09375,2.5 3.203125,2.5 c 0.0625,0 0.09375,-0.03125 0.09375,-0.109375 z m 0,0"
+           style="stroke:none"
+           inkscape:connector-curvature="0" />
+      </symbol>
+      <symbol
+         id="symbol3506"
+         overflow="visible"
+         style="overflow:visible">
+        <path
+           id="path2592"
+           d="m 2.875,-2.5 c 0,-0.765625 -0.109375,-1.96875 -0.65625,-3.109375 -0.59375,-1.21875 -1.453125,-1.875 -1.546875,-1.875 -0.0625,0 -0.109375,0.046875 -0.109375,0.109375 0,0.03125 0,0.046875 0.1875,0.234375 0.984375,0.984375 1.546875,2.5625 1.546875,4.640625 0,1.71875 -0.359375,3.46875 -1.59375,4.71875 C 0.5625,2.34375 0.5625,2.359375 0.5625,2.390625 0.5625,2.453125 0.609375,2.5 0.671875,2.5 0.765625,2.5 1.671875,1.8125 2.25,0.546875 2.765625,-0.546875 2.875,-1.65625 2.875,-2.5 Z m 0,0"
+           style="stroke:none"
+           inkscape:connector-curvature="0" />
+      </symbol>
+    </g>
+    <inkscape:path-effect
+       effect="spiro"
+       id="path-effect4185-9-9-2-3-3"
+       is_visible="true"
+       lpeversion="0" />
+    <inkscape:path-effect
+       effect="spiro"
+       id="path-effect4185-9-9-2-3-3-9"
+       is_visible="true"
+       lpeversion="0" />
+    <inkscape:path-effect
+       effect="spiro"
+       id="path-effect4185-9-9-2-3-3-9-4"
+       is_visible="true"
+       lpeversion="0" />
+  </defs>
+  <metadata
+     id="metadata4546">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title></dc:title>
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(-369.92574,154.75088)">
+    <text
+       id="text3072"
+       y="78.524437"
+       x="281.388"
+       style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:28px;line-height:125%;font-family:'Times New Roman';-inkscape-font-specification:'Times New Roman, Italic';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none"
+       xml:space="preserve" />
+    <text
+       id="text3076"
+       y="93.791618"
+       x="334.82312"
+       style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:28px;line-height:125%;font-family:'Times New Roman';-inkscape-font-specification:'Times New Roman, Italic';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none"
+       xml:space="preserve" />
+    <path
+       inkscape:connector-curvature="0"
+       id="path3806-5"
+       d="m 369.92574,-142.9307 h 198.0239"
+       style="fill:none;stroke:#000000;stroke-width:1.00157475;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+    <path
+       inkscape:connector-curvature="0"
+       id="path3806-6"
+       d="M 369.92574,-113.3057 H 568.20196"
+       style="fill:none;stroke:#000000;stroke-width:1.00157475;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+    <text
+       id="text7492"
+       y="-222.48793"
+       x="274.58649"
+       style="font-style:normal;font-weight:normal;font-size:35px;line-height:125%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       xml:space="preserve" />
+    <g
+       id="g1457"
+       transform="translate(-1.4166348)">
+      <g
+         transform="translate(2.3202056)"
+         id="g3070">
+        <g
+           id="g2982"
+           transform="translate(128.59952,-92.372374)">
+          <rect
+             style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+             id="rect3890-67-7-6-1-0-6-0"
+             width="38.809792"
+             height="22.539835"
+             x="-358.3595"
+             y="-61.828243"
+             transform="scale(-1,1)" />
+          <g
+             transform="matrix(2.0078309,0,0,2.0078309,253.41599,-248.06204)"
+             id="g1940">
+            <g
+               style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;letter-spacing:normal;word-spacing:normal;text-anchor:start;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10.43299961;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+               id="content"
+               transform="matrix(0.125,0,0,-0.125,-21.875,150.69858)"
+               xml:space="preserve"
+               stroke-miterlimit="10.433"
+               font-style="normal"
+               font-variant="normal"
+               font-weight="normal"
+               font-stretch="normal"
+               font-size-adjust="none"
+               letter-spacing="normal"
+               word-spacing="normal"><path
+                 style="fill:#000000;stroke-width:0"
+                 inkscape:connector-curvature="0"
+                 d="m 481.38,423.14 0.47,0.11 0.48,0.12 0.48,0.14 0.48,0.15 0.49,0.16 0.48,0.18 0.48,0.19 0.47,0.2 0.47,0.22 0.47,0.23 0.46,0.24 0.45,0.25 0.43,0.27 0.43,0.28 0.42,0.29 0.4,0.3 0.39,0.31 0.37,0.32 0.36,0.34 0.33,0.35 0.32,0.35 0.29,0.37 0.28,0.38 0.25,0.39 0.22,0.4 0.2,0.41 0.17,0.42 0.15,0.43 0.11,0.44 0.08,0.45 0.05,0.46 0.02,0.47 c 0,4.28 -4.48,7.47 -11,7.47 h -14.2 c -1,0 -1.45,0 -1.45,-1 0,-0.55 0.45,-0.55 1.4,-0.55 0.1,0 1.05,0 1.89,-0.09 0.89,-0.11 1.35,-0.16 1.35,-0.8 0,-0.2 -0.05,-0.36 -0.21,-0.95 l -6.67,-26.75 c -0.5,-1.95 -0.59,-2.34 -4.53,-2.34 -0.91,0 -1.34,0 -1.34,-1 0,-0.55 0.59,-0.55 0.68,-0.55 1.41,0 4.89,0.16 6.29,0.16 1.39,0 4.93,-0.16 6.32,-0.16 0.41,0 1,0 1,1 0,0.55 -0.45,0.55 -1.39,0.55 -1.84,0 -3.25,0 -3.25,0.89 0,0.29 0.11,0.54 0.16,0.84 l 3.28,13.2 h 5.94 l -0.05,1.11 h -5.59 l 3.25,13 c 0.29,1.19 0.43,1.69 1.39,1.85 0.45,0.04 2.04,0.04 3.03,0.04 3.55,0 9.08,0 9.08,-4.93 0,-1.69 -0.8,-5.13 -2.75,-7.07 -1.28,-1.29 -3.92,-2.89 -8.41,-2.89 l 0.05,-1.11 c 4.53,0 5.42,-2.78 5.42,-4.53 0,-0.75 -0.39,-2.28 -0.69,-3.44 -0.36,-1.39 -0.79,-3.23 -0.79,-4.23 0,-5.37 5.96,-5.37 6.62,-5.37 4.23,0 5.97,5.03 5.97,5.73 0,0.59 -0.55,0.59 -0.59,0.59 -0.46,0 -0.55,-0.36 -0.65,-0.7 -1.25,-3.69 -3.39,-4.53 -4.54,-4.53 -1.64,0 -1.99,1.09 -1.99,3.05 0,1.53 0.3,4.07 0.5,5.67 0.1,0.7 0.21,1.64 0.21,2.34 0,3.83 -3.35,5.38 -4.69,5.88 z"
+                 id="path1929" /><path
+                 style="fill:#000000;stroke-width:0"
+                 inkscape:connector-curvature="0"
+                 d="m 499.18,401.82 0.17,0.17 0.16,0.17 0.17,0.16 0.17,0.17 0.18,0.17 0.09,0.09 0.1,0.1 0.1,0.09 0.11,0.1 0.11,0.1 0.11,0.11 0.13,0.11 0.13,0.11 0.13,0.12 0.15,0.13 0.15,0.13 0.16,0.14 0.17,0.14 0.17,0.15 0.19,0.16 0.2,0.16 0.21,0.17 0.22,0.18 0.23,0.19 0.25,0.2 0.25,0.21 0.27,0.21 c 0.74,0.6 3.35,2.69 4.36,3.66 2.13,2.09 3.46,3.87 3.46,4.29 0,0.41 -0.46,0.41 -0.6,0.41 -0.31,0 -0.42,-0.06 -0.59,-0.34 -1.08,-1.6 -1.81,-2.13 -2.64,-2.13 -0.42,0 -0.95,0.03 -2,1.05 -1.17,1.19 -1.94,1.42 -2.75,1.42 -2.78,0 -4.67,-3.03 -4.67,-4.06 0,-0.33 0.36,-0.42 0.59,-0.42 0.42,0 0.5,0.09 0.63,0.48 0.53,1.22 2.48,1.3 3.04,1.3 0.8,0 1.71,-0.22 2.19,-0.33 1.92,-0.41 2.16,-0.41 3.03,-0.41 -0.91,-0.95 -1.53,-1.57 -4.84,-4.22 -2.72,-2.15 -3.66,-3.03 -4.32,-3.73 -2.09,-2.05 -3.1,-3.58 -3.1,-3.91 0,-0.4 0.45,-0.4 0.59,-0.4 0.34,0 0.42,0.06 0.59,0.34 0.94,1.33 2.02,2.13 3.21,2.13 0.42,0 0.93,-0.03 1.87,-0.91 1.09,-1.05 1.78,-1.56 2.91,-1.56 3.72,0 6.06,4.22 6.06,5.39 0,0.42 -0.39,0.45 -0.59,0.45 -0.43,0 -0.5,-0.17 -0.63,-0.55 -0.67,-1.75 -2.72,-2.57 -4.44,-2.57 -0.79,0 -1.67,0.17 -2.53,0.37 -1.61,0.35 -1.89,0.35 -2.51,0.35 -0.08,0 -0.6,0 -0.8,-0.04 z"
+                 id="path1931" /><path
+                 style="fill:#000000;stroke-width:0"
+                 inkscape:connector-curvature="0"
+                 d="m 532.84,394.25 v 0.02 0.03 0.01 0.02 0.01 l -0.01,0.02 v 0.01 l -0.01,0.02 -0.01,0.02 -0.01,0.02 -0.01,0.02 -0.02,0.03 -0.01,0.02 -0.02,0.03 -0.02,0.03 -0.03,0.03 -0.02,0.03 -0.03,0.04 -0.02,0.02 -0.01,0.02 -0.02,0.02 -0.02,0.02 -0.02,0.02 -0.02,0.03 -0.02,0.02 -0.02,0.02 -0.02,0.03 -0.03,0.02 -0.02,0.03 -0.03,0.03 -0.03,0.03 -0.02,0.03 -0.03,0.03 -0.03,0.03 -0.03,0.03 -0.03,0.03 -0.04,0.04 -0.03,0.03 -0.04,0.04 -0.03,0.03 -0.04,0.04 -0.04,0.04 c -6.22,6.28 -7.81,15.69 -7.81,23.31 0,8.67 1.89,17.35 8.01,23.56 0.64,0.61 0.64,0.71 0.64,0.86 0,0.35 -0.18,0.49 -0.48,0.49 -0.5,0 -4.98,-3.38 -7.92,-9.7 -2.55,-5.49 -3.14,-11.02 -3.14,-15.21 0,-3.89 0.54,-9.9 3.28,-15.54 2.98,-6.13 7.28,-9.36 7.78,-9.36 0.3,0 0.48,0.14 0.48,0.5 z"
+                 id="path1933" /><path
+                 style="fill:#000000;stroke-width:0"
+                 inkscape:connector-curvature="0"
+                 d="m 548.83,427.96 -0.58,-0.15 -0.57,-0.18 -0.56,-0.21 -0.55,-0.24 -0.54,-0.26 -0.53,-0.28 -0.52,-0.31 -0.51,-0.33 -0.49,-0.35 -0.48,-0.38 -0.46,-0.39 -0.45,-0.41 -0.43,-0.42 -0.42,-0.45 -0.4,-0.46 -0.38,-0.47 -0.36,-0.49 -0.34,-0.5 -0.33,-0.51 -0.3,-0.52 -0.29,-0.53 -0.26,-0.53 -0.24,-0.55 -0.22,-0.55 -0.19,-0.56 -0.17,-0.56 -0.15,-0.57 -0.12,-0.56 -0.1,-0.57 -0.06,-0.57 -0.05,-0.57 -0.01,-0.57 c 0,-4.78 3.19,-8.35 7.88,-8.35 v 1.09 c -2.75,0 -4.79,2.09 -4.79,5.87 0,3.14 1.85,12.5 8.57,14.3 v 0 c 1.25,-2.28 2.73,-4.98 2.73,-8.56 0,-3.3 -1.89,-11.61 -6.51,-11.61 v -1.09 c 5.82,0 9.95,7.81 9.95,14.68 0,4.55 -1.99,7.03 -3.69,9.27 -1.78,2.25 -4.72,5.98 -4.72,8.17 0,1.11 0.99,2.3 2.74,2.3 1.5,0 2.48,-0.64 3.53,-1.35 1,-0.59 2,-1.25 2.75,-1.25 1.23,0 1.98,1.21 1.98,2 0,1.1 -0.79,1.24 -2.59,1.64 -2.58,0.55 -3.28,0.55 -4.08,0.55 -3.89,0 -5.69,-2.14 -5.69,-5.12 0,-2.71 1.45,-5.49 3,-8.54 z"
+                 id="path1935" /><path
+                 style="fill:#000000;stroke-width:0"
+                 inkscape:connector-curvature="0"
+                 d="m 574.07,418.65 -0.01,0.37 v 0.39 l -0.01,0.39 -0.01,0.41 -0.04,0.84 -0.06,0.88 -0.08,0.92 -0.11,0.95 -0.14,0.97 -0.16,1.01 -0.19,1.02 -0.23,1.03 -0.27,1.05 -0.31,1.06 -0.35,1.07 -0.39,1.07 -0.21,0.53 -0.23,0.53 -0.23,0.53 -0.26,0.53 c -2.98,6.12 -7.26,9.36 -7.76,9.36 -0.3,0 -0.5,-0.19 -0.5,-0.49 0,-0.15 0,-0.25 0.94,-1.15 4.89,-4.92 7.73,-12.85 7.73,-23.27 0,-8.51 -1.84,-17.28 -8.03,-23.56 -0.64,-0.59 -0.64,-0.7 -0.64,-0.84 0,-0.3 0.2,-0.5 0.5,-0.5 0.5,0 4.97,3.39 7.92,9.71 2.53,5.47 3.13,11 3.13,15.19 z"
+                 id="path1937" /></g>          </g>
+        </g>
+        <g
+           id="g2993"
+           transform="translate(68.645848,-69.433657)">
+          <g
+             id="g2972">
+            <rect
+               transform="scale(-1,1)"
+               y="-55.14196"
+               x="-418.31317"
+               height="22.539835"
+               width="38.809792"
+               id="rect3890-67-7-6-1-0-6-6"
+               style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+            <g
+               id="g2089"
+               transform="matrix(2.0078309,0,0,2.0078309,312.39084,-241.63928)">
+              <g
+                 word-spacing="normal"
+                 letter-spacing="normal"
+                 font-size-adjust="none"
+                 font-stretch="normal"
+                 font-weight="normal"
+                 font-variant="normal"
+                 font-style="normal"
+                 stroke-miterlimit="10.433"
+                 xml:space="preserve"
+                 transform="matrix(0.125,0,0,-0.125,-21.875,150.69858)"
+                 id="g2087"
+                 style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;letter-spacing:normal;word-spacing:normal;text-anchor:start;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10.43299961;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"><path
+                   id="path2077"
+                   d="m 481.38,423.14 0.47,0.11 0.48,0.12 0.48,0.14 0.48,0.15 0.49,0.16 0.48,0.18 0.48,0.19 0.47,0.2 0.47,0.22 0.47,0.23 0.46,0.24 0.45,0.25 0.43,0.27 0.43,0.28 0.42,0.29 0.4,0.3 0.39,0.31 0.37,0.32 0.36,0.34 0.33,0.35 0.32,0.35 0.29,0.37 0.28,0.38 0.25,0.39 0.22,0.4 0.2,0.41 0.17,0.42 0.15,0.43 0.11,0.44 0.08,0.45 0.05,0.46 0.02,0.47 c 0,4.28 -4.48,7.47 -11,7.47 h -14.2 c -1,0 -1.45,0 -1.45,-1 0,-0.55 0.45,-0.55 1.4,-0.55 0.1,0 1.05,0 1.89,-0.09 0.89,-0.11 1.35,-0.16 1.35,-0.8 0,-0.2 -0.05,-0.36 -0.21,-0.95 l -6.67,-26.75 c -0.5,-1.95 -0.59,-2.34 -4.53,-2.34 -0.91,0 -1.34,0 -1.34,-1 0,-0.55 0.59,-0.55 0.68,-0.55 1.41,0 4.89,0.16 6.29,0.16 1.39,0 4.93,-0.16 6.32,-0.16 0.41,0 1,0 1,1 0,0.55 -0.45,0.55 -1.39,0.55 -1.84,0 -3.25,0 -3.25,0.89 0,0.29 0.11,0.54 0.16,0.84 l 3.28,13.2 h 5.94 l -0.05,1.11 h -5.59 l 3.25,13 c 0.29,1.19 0.43,1.69 1.39,1.85 0.45,0.04 2.04,0.04 3.03,0.04 3.55,0 9.08,0 9.08,-4.93 0,-1.69 -0.8,-5.13 -2.75,-7.07 -1.28,-1.29 -3.92,-2.89 -8.41,-2.89 l 0.05,-1.11 c 4.53,0 5.42,-2.78 5.42,-4.53 0,-0.75 -0.39,-2.28 -0.69,-3.44 -0.36,-1.39 -0.79,-3.23 -0.79,-4.23 0,-5.37 5.96,-5.37 6.62,-5.37 4.23,0 5.97,5.03 5.97,5.73 0,0.59 -0.55,0.59 -0.59,0.59 -0.46,0 -0.55,-0.36 -0.65,-0.7 -1.25,-3.69 -3.39,-4.53 -4.54,-4.53 -1.64,0 -1.99,1.09 -1.99,3.05 0,1.53 0.3,4.07 0.5,5.67 0.1,0.7 0.21,1.64 0.21,2.34 0,3.83 -3.35,5.38 -4.69,5.88 z"
+                   inkscape:connector-curvature="0"
+                   style="fill:#000000;stroke-width:0" /><path
+                   id="path2079"
+                   d="m 512.7,411.9 v 0.02 l 0.01,0.03 v 0.02 l 0.01,0.02 0.01,0.02 v 0.02 l 0.01,0.04 0.01,0.03 0.01,0.03 0.01,0.04 0.01,0.03 v 0.02 l 0.01,0.03 0.01,0.03 v 0.02 l 0.01,0.02 v 0.02 0.02 l 0.01,0.02 v 0.02 0.02 l 0.01,0.02 v 0.02 0.03 0.03 l 0.01,0.04 v 0.03 0.02 0.02 0.02 0.02 c 0,0.69 -0.57,1.11 -1.16,1.11 -0.38,0 -1.05,-0.17 -1.42,-0.83 -0.11,-0.22 -0.39,-1.33 -0.56,-2.03 l -0.74,-2.89 c -0.2,-0.83 -1.28,-5.22 -1.39,-5.61 -0.03,0 -1.56,-3.03 -4.28,-3.03 -2.38,0 -2.38,2.26 -2.38,2.89 0,1.89 0.8,4.08 1.85,6.76 0.42,1.11 0.59,1.53 0.59,2.13 0,1.67 -1.42,2.95 -3.31,2.95 -3.52,0 -5.08,-4.73 -5.08,-5.33 0,-0.45 0.49,-0.45 0.59,-0.45 0.49,0 0.52,0.17 0.63,0.56 0.87,2.89 2.37,4.25 3.77,4.25 0.59,0 0.85,-0.39 0.85,-1.22 0,-0.79 -0.31,-1.56 -0.48,-2.01 -1.67,-4.25 -2.02,-5.55 -2.02,-7.08 0,-0.59 0,-2.23 1.36,-3.34 1.08,-0.91 2.55,-1.08 3.49,-1.08 1.39,0 2.64,0.51 3.8,1.56 -0.46,-1.92 -0.85,-3.37 -2.3,-5.12 -0.94,-1.08 -2.35,-2.22 -4.19,-2.22 -0.23,0 -1.87,0 -2.61,1.14 1.88,0.2 1.88,1.89 1.88,1.92 0,1.11 -1,1.31 -1.36,1.31 -0.86,0 -2.02,-0.69 -2.02,-2.3 0,-1.76 1.67,-3.06 4.14,-3.06 3.53,0 7.81,2.72 8.89,7.08 z"
+                   inkscape:connector-curvature="0"
+                   style="fill:#000000;stroke-width:0" /><path
+                   id="path2081"
+                   d="m 533.8,394.25 v 0.02 0.03 0.01 0.02 0.01 l -0.01,0.02 v 0.01 l -0.01,0.02 -0.01,0.02 -0.01,0.02 -0.01,0.02 -0.02,0.03 -0.01,0.02 -0.02,0.03 -0.02,0.03 -0.03,0.03 -0.02,0.03 -0.03,0.04 -0.02,0.02 -0.01,0.02 -0.02,0.02 -0.02,0.02 -0.02,0.02 -0.02,0.03 -0.02,0.02 -0.02,0.02 -0.02,0.03 -0.03,0.02 -0.02,0.03 -0.03,0.03 -0.02,0.03 -0.03,0.03 -0.03,0.03 -0.03,0.03 -0.03,0.03 -0.03,0.03 -0.04,0.04 -0.03,0.03 -0.04,0.04 -0.03,0.03 -0.04,0.04 -0.04,0.04 c -6.22,6.28 -7.81,15.69 -7.81,23.31 0,8.67 1.89,17.35 8.01,23.56 0.64,0.61 0.64,0.71 0.64,0.86 0,0.35 -0.18,0.49 -0.48,0.49 -0.5,0 -4.98,-3.38 -7.92,-9.7 -2.55,-5.49 -3.14,-11.02 -3.14,-15.21 0,-3.89 0.54,-9.9 3.28,-15.54 2.98,-6.13 7.28,-9.36 7.78,-9.36 0.3,0 0.48,0.14 0.48,0.5 z"
+                   inkscape:connector-curvature="0"
+                   style="fill:#000000;stroke-width:0" /><path
+                   id="path2083"
+                   d="m 565.28,434.54 -0.01,0.35 -0.02,0.35 -0.04,0.33 -0.06,0.34 -0.07,0.33 -0.08,0.32 -0.1,0.32 -0.11,0.31 -0.13,0.3 -0.14,0.29 -0.15,0.29 -0.17,0.27 -0.18,0.27 -0.19,0.26 -0.21,0.25 -0.21,0.24 -0.23,0.22 -0.24,0.22 -0.25,0.2 -0.27,0.2 -0.27,0.17 -0.28,0.17 -0.3,0.15 -0.3,0.14 -0.31,0.12 -0.33,0.11 -0.33,0.09 -0.34,0.08 -0.35,0.06 -0.36,0.05 -0.36,0.02 -0.38,0.01 c -2.89,0 -4.28,-0.8 -6.03,-2.09 -2.73,-1.99 -5.48,-6.83 -6.42,-10.61 l -7.92,-31.64 c -0.07,-0.19 0.18,-0.5 0.59,-0.5 0.39,0 0.55,0.11 0.59,0.25 l 3.49,13.75 c 0.95,-2.99 3.14,-4.83 6.78,-4.83 l -0.16,1.09 c -3.78,0 -5.67,2.89 -5.67,6.44 0,0.48 0,1.23 0.25,2.19 l 3.19,12.61 c 1.09,4.28 4.69,12.2 10.65,12.2 2.9,0 4.65,-1.55 4.65,-4.53 v 0 c 0,-3.5 -1.9,-7.08 -4.49,-8.63 -1.34,0.5 -2.34,0.6 -3.84,0.6 -1.05,0 -3.83,0.04 -3.83,-1.6 -0.05,-1.39 2.53,-1.23 3.44,-1.23 l 0.14,1.09 c -0.69,0 -1.69,-0.06 -2.19,0.19 0.11,0.5 1.89,0.41 2.44,0.41 1.05,0 1.5,0 2.14,-0.25 v 0 c -0.64,-0.25 -1.19,-0.35 -2.39,-0.35 l -0.14,-1.09 c 1.84,0 2.59,0.05 4.07,0.64 1.9,-1.8 2.15,-3.34 2.21,-5.62 0.09,-2.9 -1.11,-6.63 -2.5,-8.58 -1.94,-2.69 -5.28,-4.49 -8.13,-4.49 l 0.16,-1.09 c 3.64,0 7.38,1.75 9.61,3.94 2.39,2.29 4,5.48 4,9.17 0,3.58 -1.85,6.17 -3.64,7.42 2.89,1.64 5.72,4.73 5.72,8.31 z"
+                   inkscape:connector-curvature="0"
+                   style="fill:#000000;stroke-width:0" /><path
+                   id="path2085"
+                   d="m 581.87,418.65 v 0.37 l -0.01,0.39 -0.01,0.39 -0.01,0.41 -0.04,0.84 -0.06,0.88 -0.08,0.92 -0.11,0.95 -0.13,0.97 -0.17,1.01 -0.19,1.02 -0.23,1.03 -0.27,1.05 -0.31,1.06 -0.35,1.07 -0.39,1.07 -0.21,0.53 -0.23,0.53 -0.23,0.53 -0.25,0.53 c -2.99,6.12 -7.27,9.36 -7.77,9.36 -0.3,0 -0.5,-0.19 -0.5,-0.49 0,-0.15 0,-0.25 0.94,-1.15 4.89,-4.92 7.73,-12.85 7.73,-23.27 0,-8.51 -1.84,-17.28 -8.03,-23.56 -0.64,-0.59 -0.64,-0.7 -0.64,-0.84 0,-0.3 0.2,-0.5 0.5,-0.5 0.5,0 4.97,3.39 7.92,9.71 2.53,5.47 3.13,11 3.13,15.19 z"
+                   inkscape:connector-curvature="0"
+                   style="fill:#000000;stroke-width:0" /></g>            </g>
+          </g>
+        </g>
+      </g>
+      <g
+         transform="translate(1.4339194)"
+         id="g3087">
+        <g
+           id="g2904"
+           transform="translate(0,-6.3735962e-6)">
+          <rect
+             style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:0.84808445;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+             id="rect3890-67-7-6-1"
+             width="22.792269"
+             height="22.792269"
+             x="-406.96127"
+             y="-154.32683"
+             transform="scale(-1,1)" />
+          <g
+             transform="matrix(2.4747944,0,0,2.4747944,302.5469,-384.95743)"
+             id="g2378">
+            <g
+               style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;letter-spacing:normal;word-spacing:normal;text-anchor:start;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10.43299961;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+               id="g2376"
+               transform="matrix(0.125,0,0,-0.125,-21.875,150.69858)"
+               xml:space="preserve"
+               stroke-miterlimit="10.433"
+               font-style="normal"
+               font-variant="normal"
+               font-weight="normal"
+               font-stretch="normal"
+               font-size-adjust="none"
+               letter-spacing="normal"
+               word-spacing="normal"><path
+                 style="fill:#000000;stroke-width:0"
+                 inkscape:connector-curvature="0"
+                 d="m 493.38,440.82 v 0.02 0.02 0.01 l -0.01,0.02 v 0.02 0.02 l -0.01,0.02 v 0.02 l -0.01,0.02 -0.01,0.02 -0.01,0.02 v 0.02 l -0.02,0.02 -0.01,0.02 -0.01,0.02 -0.01,0.02 -0.02,0.02 -0.02,0.02 -0.02,0.02 -0.02,0.02 -0.02,0.01 -0.02,0.02 -0.03,0.01 -0.02,0.02 -0.03,0.01 -0.01,0.01 h -0.02 l -0.01,0.01 h -0.02 l -0.02,0.01 h -0.01 -0.02 l -0.02,0.01 h -0.02 -0.02 -0.02 -0.02 -0.02 -0.02 c -0.14,0 -0.2,-0.04 -0.75,-0.59 l -3.48,-3.84 c -0.44,0.7 -2.74,4.43 -8.27,4.43 -11.11,0 -22.33,-11.01 -22.33,-22.56 0,-8.23 5.89,-13.65 13.52,-13.65 4.33,0 8.11,1.98 10.75,4.28 4.64,4.09 5.48,8.62 5.48,8.76 0,0.5 -0.5,0.5 -0.59,0.5 -0.3,0 -0.55,-0.09 -0.66,-0.5 -0.43,-1.44 -1.59,-4.98 -5.03,-7.87 -3.43,-2.78 -6.58,-3.63 -9.15,-3.63 -4.49,0 -9.77,2.6 -9.77,10.36 0,2.85 1.05,10.91 6.02,16.74 3.04,3.54 7.73,6.03 12.15,6.03 5.1,0 8.03,-3.83 8.03,-9.61 0,-2 -0.15,-2.05 -0.15,-2.55 0,-0.5 0.54,-0.5 0.75,-0.5 0.64,0 0.64,0.11 0.89,1 z"
+                 id="path2374" /></g>          </g>
+        </g>
+        <g
+           id="g2910"
+           transform="translate(0,8.8851929e-6)">
+          <rect
+             style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:0.84808445;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+             id="rect3890-67-7-6"
+             width="22.792269"
+             height="22.792269"
+             x="-406.96127"
+             y="-124.70184"
+             transform="scale(-1,1)" />
+          <g
+             transform="matrix(2.4747944,0,0,2.4747944,302.28086,-355.33245)"
+             id="g2510">
+            <g
+               style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;letter-spacing:normal;word-spacing:normal;text-anchor:start;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10.43299961;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+               id="g2508"
+               transform="matrix(0.125,0,0,-0.125,-21.875,150.69858)"
+               xml:space="preserve"
+               stroke-miterlimit="10.433"
+               font-style="normal"
+               font-variant="normal"
+               font-weight="normal"
+               font-stretch="normal"
+               font-size-adjust="none"
+               letter-spacing="normal"
+               word-spacing="normal"><path
+                 style="fill:#000000;stroke-width:0"
+                 inkscape:connector-curvature="0"
+                 d="m 463.44,410.09 -0.04,-0.18 -0.05,-0.17 -0.04,-0.16 -0.05,-0.15 -0.04,-0.15 -0.05,-0.13 -0.04,-0.13 -0.05,-0.12 -0.06,-0.11 -0.06,-0.11 -0.06,-0.1 -0.07,-0.09 -0.08,-0.09 -0.09,-0.07 -0.09,-0.08 -0.11,-0.06 -0.11,-0.07 -0.12,-0.05 -0.14,-0.05 -0.15,-0.05 -0.16,-0.04 -0.09,-0.02 -0.08,-0.01 -0.1,-0.02 -0.1,-0.02 -0.1,-0.01 -0.1,-0.01 -0.11,-0.01 -0.11,-0.02 -0.12,-0.01 -0.12,-0.01 h -0.13 l -0.13,-0.01 -0.13,-0.01 h -0.15 l -0.14,-0.01 h -0.15 l -0.16,-0.01 h -0.16 -0.16 -0.17 -0.18 -0.18 c -0.84,0 -1.39,0 -1.39,-0.96 0,-0.59 0.44,-0.59 1.39,-0.59 h 16.48 l -0.89,1.55 h -5.62 c -0.7,0 -0.8,0 -1.11,0.04 -0.48,0.05 -0.64,0.1 -0.64,0.5 0,0.14 0,0.25 0.25,1.14 l 6.83,27.36 c 0.43,1.74 0.54,1.89 2.68,1.89 h 5.33 c 4.89,0 9.02,-2.64 9.02,-9.22 0,-2.43 -1,-10.6 -5.24,-16.09 -1.43,-1.84 -5.37,-5.62 -11.5,-5.62 l 0.89,-1.55 c 10.36,0 20.19,10.51 20.19,21.42 0,7.03 -4.23,12.61 -11.72,12.61 h -16.73 c -0.95,0 -1.5,0 -1.5,-0.95 0,-0.6 0.45,-0.6 1.45,-0.6 0.64,0 1.55,-0.04 2.14,-0.09 0.8,-0.11 1.1,-0.25 1.1,-0.8 0,-0.2 -0.05,-0.36 -0.21,-0.95 z"
+                 id="path2506" /></g>          </g>
+        </g>
+      </g>
+      <g
+         transform="translate(-0.2708567)"
+         id="g3075">
+        <circle
+           id="path4181-6-7-6-6-6"
+           style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+           cx="429.66519"
+           cy="142.93069"
+           r="9.1789093"
+           transform="scale(1,-1)" />
+        <circle
+           id="path4179-9-2-0-0-5-2"
+           style="fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:0.54598999;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+           cx="429.66516"
+           cy="113.3057"
+           r="2.4853103"
+           transform="scale(1,-1)" />
+        <path
+           inkscape:connector-curvature="0"
+           inkscape:original-d="M 270.16665,257.87321 V 219.70728"
+           inkscape:path-effect="#path-effect4185-9-9-2-3-3-9"
+           id="path4183-9-1-9-6-3-1"
+           d="M 270.16665,257.87321 V 219.70728"
+           style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+           transform="matrix(1,0,0,-1,159.4985,106.00374)" />
+      </g>
+      <g
+         transform="translate(-78.566081)"
+         id="g3039">
+        <g
+           id="g2898"
+           transform="translate(95.959221,-54.203101)">
+          <rect
+             style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:0.84808445;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+             id="rect3890-67-7-6-2"
+             width="22.792269"
+             height="22.792269"
+             x="-537.71259"
+             y="-70.498734"
+             transform="scale(-1,1)" />
+          <g
+             transform="matrix(2.4747944,0,0,2.4747944,433.38793,-301.12934)"
+             id="g2783">
+            <g
+               style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;letter-spacing:normal;word-spacing:normal;text-anchor:start;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10.43299961;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+               id="g2781"
+               transform="matrix(0.125,0,0,-0.125,-21.875,150.69858)"
+               xml:space="preserve"
+               stroke-miterlimit="10.433"
+               font-style="normal"
+               font-variant="normal"
+               font-weight="normal"
+               font-stretch="normal"
+               font-size-adjust="none"
+               letter-spacing="normal"
+               word-spacing="normal"><path
+                 style="fill:#000000;stroke-width:0"
+                 inkscape:connector-curvature="0"
+                 d="m 463.49,410.09 -0.05,-0.18 -0.04,-0.17 -0.05,-0.16 -0.04,-0.15 -0.04,-0.15 -0.05,-0.13 -0.05,-0.13 -0.05,-0.12 -0.05,-0.11 -0.06,-0.11 -0.07,-0.1 -0.07,-0.09 -0.07,-0.09 -0.09,-0.07 -0.09,-0.08 -0.11,-0.06 -0.11,-0.07 -0.13,-0.05 -0.13,-0.05 -0.15,-0.05 -0.16,-0.04 -0.09,-0.02 -0.09,-0.01 -0.09,-0.02 -0.1,-0.02 -0.1,-0.01 -0.1,-0.01 -0.11,-0.01 -0.12,-0.02 -0.11,-0.01 -0.13,-0.01 h -0.12 l -0.13,-0.01 -0.14,-0.01 h -0.14 l -0.14,-0.01 h -0.15 l -0.16,-0.01 h -0.16 -0.16 -0.17 -0.18 -0.18 c -0.85,0 -1.35,0 -1.35,-1 0,-0.55 0.46,-0.55 1.35,-0.55 h 17.78 c 7.87,0 13.75,5.87 13.75,10.76 0,3.58 -2.89,6.47 -7.72,7.02 5.19,0.95 10.42,4.64 10.42,9.38 0,3.68 -3.3,6.87 -9.28,6.87 l -0.69,-1.55 c 4.38,0 5.42,-2.93 5.42,-5.12 0,-4.39 -4.28,-9.13 -10.35,-9.13 h -7.27 l -0.3,-1.09 h 9.41 c 4.78,0 5.73,-3.69 5.73,-5.83 0,-4.94 -4.43,-9.76 -10.31,-9.76 h -6.78 c -0.69,0 -0.8,0 -1.09,0.04 -0.5,0.05 -0.64,0.1 -0.64,0.5 0,0.14 0,0.25 0.25,1.14 l 3.43,13.91 0.3,1.09 3.08,12.36 c 0.45,1.74 0.54,1.89 2.7,1.89 h 6.42 l 0.69,1.55 h -16.73 c -0.94,0 -1.44,0 -1.44,-1 0,-0.55 0.44,-0.55 1.39,-0.55 0.09,0 1.05,0 1.89,-0.09 0.89,-0.11 1.34,-0.16 1.34,-0.8 0,-0.2 -0.04,-0.36 -0.2,-0.95 z"
+                 id="path2779" /></g>          </g>
+        </g>
+        <g
+           id="g2892"
+           transform="translate(95.390984,-53.040404)">
+          <rect
+             style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:0.84808445;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+             id="rect3890-67-7-6-1-0"
+             width="22.792269"
+             height="22.792269"
+             x="-538.28082"
+             y="-101.28643"
+             transform="scale(-1,1)" />
+          <g
+             transform="matrix(2.4747944,0,0,2.4747944,434.27943,-331.66337)"
+             id="g2645">
+            <g
+               style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;letter-spacing:normal;word-spacing:normal;text-anchor:start;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10.43299961;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+               id="g2643"
+               transform="matrix(0.125,0,0,-0.125,-21.875,150.69858)"
+               xml:space="preserve"
+               stroke-miterlimit="10.433"
+               font-style="normal"
+               font-variant="normal"
+               font-weight="normal"
+               font-stretch="normal"
+               font-size-adjust="none"
+               letter-spacing="normal"
+               word-spacing="normal"><path
+                 style="fill:#000000;stroke-width:0"
+                 inkscape:connector-curvature="0"
+                 d="m 464.44,411.93 -0.19,-0.3 -0.18,-0.29 -0.19,-0.28 -0.19,-0.26 -0.18,-0.25 -0.19,-0.23 -0.19,-0.22 -0.18,-0.21 -0.19,-0.2 -0.19,-0.18 -0.18,-0.17 -0.19,-0.16 -0.19,-0.15 -0.18,-0.14 -0.19,-0.13 -0.19,-0.12 -0.19,-0.11 -0.19,-0.1 -0.19,-0.09 -0.19,-0.09 -0.19,-0.07 -0.2,-0.07 -0.19,-0.07 -0.2,-0.05 -0.19,-0.05 -0.2,-0.04 -0.2,-0.04 -0.19,-0.03 -0.41,-0.05 -0.4,-0.03 c -0.61,-0.05 -1.05,-0.05 -1.05,-1 0,-0.3 0.25,-0.55 0.64,-0.55 1.34,0 2.89,0.16 4.28,0.16 1.64,0 3.39,-0.16 4.99,-0.16 0.29,0 0.95,0 0.95,0.95 0,0.55 -0.45,0.6 -0.8,0.6 -1.15,0.09 -2.34,0.5 -2.34,1.73 0,0.61 0.3,1.16 0.69,1.84 l 3.79,6.39 h 12.5 l -0.14,1.54 h -11.42 l 9.83,16.45 1.59,-16.45 0.14,-1.54 c 0.11,-1.04 0.8,-7.82 0.8,-8.32 0,-1.5 -2.59,-1.64 -3.58,-1.64 -0.7,0 -1.2,0 -1.2,-1 0,-0.55 0.59,-0.55 0.7,-0.55 2.03,0 4.19,0.16 6.22,0.16 1.25,0 4.39,-0.16 5.64,-0.16 0.3,0 0.89,0 0.89,1 0,0.55 -0.5,0.55 -1.14,0.55 -3.09,0 -3.09,0.34 -3.25,1.79 l -3.03,31.13 c -0.11,1 -0.11,1.2 -0.95,1.2 -0.8,0 -0.99,-0.34 -1.3,-0.84 z"
+                 id="path2641" /></g>          </g>
+        </g>
+      </g>
+      <g
+         transform="translate(-79.044576)"
+         id="g3044">
+        <circle
+           id="path4181-6-7-6-6-6-7"
+           style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+           cx="590.35889"
+           cy="142.93069"
+           r="9.1789093"
+           transform="scale(1,-1)" />
+        <circle
+           id="path4179-9-2-0-0-5-2-4"
+           style="fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:0.54598999;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+           cx="590.35883"
+           cy="113.3057"
+           r="2.4853103"
+           transform="scale(1,-1)" />
+        <path
+           inkscape:connector-curvature="0"
+           inkscape:original-d="M 270.16665,257.87321 V 219.70728"
+           inkscape:path-effect="#path-effect4185-9-9-2-3-3-9-4"
+           id="path4183-9-1-9-6-3-1-8"
+           d="M 270.16665,257.87321 V 219.70728"
+           style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+           transform="matrix(1,0,0,-1,320.19217,106.2266)" />
+      </g>
+    </g>
+  </g>
+</svg>
diff --git a/doc/_static/two_qubit_decomposition_3_cnots.svg b/doc/_static/two_qubit_decomposition_3_cnots.svg
new file mode 100644
index 000000000..0e77757c0
--- /dev/null
+++ b/doc/_static/two_qubit_decomposition_3_cnots.svg
@@ -0,0 +1,813 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   sodipodi:docname="two_qubit_decomposition_3_cnots.svg"
+   inkscape:version="0.92.5 (2060ec1f9f, 2020-04-08)"
+   version="1.1"
+   id="svg4541"
+   height="53.265354"
+   width="280.85718">
+  <sodipodi:namedview
+     inkscape:snap-global="false"
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="3.1726447"
+     inkscape:cx="70.159404"
+     inkscape:cy="6.0587359"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     showgrid="false"
+     inkscape:window-width="1916"
+     inkscape:window-height="1036"
+     inkscape:window-x="0"
+     inkscape:window-y="20"
+     inkscape:window-maximized="0"
+     fit-margin-top="0"
+     fit-margin-left="0"
+     fit-margin-right="0"
+     fit-margin-bottom="0"
+     inkscape:document-rotation="0" />
+  <defs
+     id="defs4543">
+    <inkscape:path-effect
+       lpeversion="0"
+       is_visible="true"
+       id="path-effect8308"
+       effect="spiro" />
+    <inkscape:path-effect
+       is_visible="true"
+       id="path-effect7251"
+       effect="spiro"
+       lpeversion="0" />
+    <marker
+       inkscape:stockid="Arrow1Mend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow1Mend"
+       style="overflow:visible"
+       inkscape:isstock="true">
+      <path
+         id="path6650"
+         d="M 0,0 5,-5 -12.5,0 5,5 Z"
+         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
+         transform="matrix(-0.4,0,0,-0.4,-4,0)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow1Lend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow1Lend"
+       style="overflow:visible"
+       inkscape:isstock="true">
+      <path
+         id="path6644"
+         d="M 0,0 5,-5 -12.5,0 5,5 Z"
+         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
+         transform="matrix(-0.8,0,0,-0.8,-10,0)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <inkscape:path-effect
+       effect="spiro"
+       id="path-effect4189"
+       is_visible="true"
+       lpeversion="0" />
+    <inkscape:path-effect
+       effect="spiro"
+       id="path-effect4185"
+       is_visible="true"
+       lpeversion="0" />
+    <inkscape:path-effect
+       effect="spiro"
+       id="path-effect4185-9"
+       is_visible="true"
+       lpeversion="0" />
+    <inkscape:path-effect
+       effect="spiro"
+       id="path-effect4185-9-8"
+       is_visible="true"
+       lpeversion="0" />
+    <inkscape:path-effect
+       effect="spiro"
+       id="path-effect4185-1"
+       is_visible="true"
+       lpeversion="0" />
+    <inkscape:path-effect
+       effect="spiro"
+       id="path-effect4185-9-8-7"
+       is_visible="true"
+       lpeversion="0" />
+    <inkscape:path-effect
+       effect="spiro"
+       id="path-effect4185-9-9"
+       is_visible="true"
+       lpeversion="0" />
+    <inkscape:path-effect
+       effect="spiro"
+       id="path-effect4185-9-9-2"
+       is_visible="true"
+       lpeversion="0" />
+    <inkscape:path-effect
+       effect="spiro"
+       id="path-effect4185-9-9-2-3"
+       is_visible="true"
+       lpeversion="0" />
+    <marker
+       inkscape:stockid="Arrow1Mend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow1Mend-9"
+       style="overflow:visible"
+       inkscape:isstock="true">
+      <path
+         inkscape:connector-curvature="0"
+         id="path6650-2"
+         d="M 0,0 5,-5 -12.5,0 5,5 Z"
+         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
+         transform="matrix(-0.4,0,0,-0.4,-4,0)" />
+    </marker>
+    <inkscape:path-effect
+       effect="spiro"
+       id="path-effect4185-9-9-2-3-7"
+       is_visible="true"
+       lpeversion="0" />
+    <inkscape:path-effect
+       effect="spiro"
+       id="path-effect4185-9-9-2-3-7-9"
+       is_visible="true"
+       lpeversion="0" />
+    <g
+       id="g5447">
+      <symbol
+         overflow="visible"
+         id="symbol8357"
+         style="overflow:visible">
+        <path
+           style="stroke:none"
+           d=""
+           id="path1694"
+           inkscape:connector-curvature="0" />
+      </symbol>
+      <symbol
+         overflow="visible"
+         id="symbol1959"
+         style="overflow:visible">
+        <path
+           style="stroke:none"
+           d="m 1.578125,-7.125 c 0,-0.171875 0,-0.359375 -0.1875,-0.359375 -0.203125,0 -0.203125,0.1875 -0.203125,0.359375 v 9.265625 c 0,0.171875 0,0.359375 0.203125,0.359375 0.1875,0 0.1875,-0.1875 0.1875,-0.359375 z m 0,0"
+           id="path5509"
+           inkscape:connector-curvature="0" />
+      </symbol>
+      <symbol
+         overflow="visible"
+         id="symbol7045"
+         style="overflow:visible">
+        <path
+           style="stroke:none"
+           d="M 2.71875,-2.328125 C 2.765625,-2.4375 2.765625,-2.46875 2.765625,-2.5 c 0,-0.015625 0,-0.046875 -0.046875,-0.15625 L 0.984375,-7.25 c -0.0625,-0.171875 -0.125,-0.234375 -0.234375,-0.234375 -0.109375,0 -0.203125,0.09375 -0.203125,0.203125 0,0.03125 0,0.046875 0.046875,0.15625 L 2.359375,-2.5 0.59375,2.109375 C 0.546875,2.21875 0.546875,2.25 0.546875,2.296875 0.546875,2.40625 0.640625,2.5 0.75,2.5 0.875,2.5 0.921875,2.390625 0.953125,2.296875 Z m 0,0"
+           id="path3970"
+           inkscape:connector-curvature="0" />
+      </symbol>
+      <symbol
+         overflow="visible"
+         id="symbol5931"
+         style="overflow:visible">
+        <path
+           style="stroke:none"
+           d=""
+           id="path7974"
+           inkscape:connector-curvature="0" />
+      </symbol>
+      <symbol
+         overflow="visible"
+         id="symbol3047"
+         style="overflow:visible">
+        <path
+           style="stroke:none"
+           d="m 4.578125,-3.1875 c 0,-0.796875 -0.046875,-1.59375 -0.390625,-2.328125 -0.453125,-0.96875 -1.28125,-1.125 -1.6875,-1.125 -0.609375,0 -1.328125,0.265625 -1.75,1.1875 -0.3125,0.6875 -0.359375,1.46875 -0.359375,2.265625 0,0.75 0.03125,1.640625 0.453125,2.40625 0.421875,0.796875 1.15625,1 1.640625,1 0.53125,0 1.296875,-0.203125 1.734375,-1.15625 0.3125,-0.6875 0.359375,-1.46875 0.359375,-2.25 z M 2.484375,0 C 2.09375,0 1.5,-0.25 1.328125,-1.203125 1.21875,-1.796875 1.21875,-2.71875 1.21875,-3.3125 c 0,-0.640625 0,-1.296875 0.078125,-1.828125 0.1875,-1.1875 0.9375,-1.28125 1.1875,-1.28125 0.328125,0 0.984375,0.1875 1.171875,1.171875 0.109375,0.5625 0.109375,1.3125 0.109375,1.9375 0,0.75 0,1.421875 -0.109375,2.0625 C 3.5,-0.296875 2.9375,0 2.484375,0 Z m 0,0"
+           id="path9994"
+           inkscape:connector-curvature="0" />
+      </symbol>
+    </g>
+    <g
+       id="g6209">
+      <symbol
+         id="symbol7183"
+         overflow="visible"
+         style="overflow:visible">
+        <path
+           id="path463"
+           d=""
+           style="stroke:none"
+           inkscape:connector-curvature="0" />
+      </symbol>
+      <symbol
+         id="symbol1154"
+         overflow="visible"
+         style="overflow:visible">
+        <path
+           id="path3687"
+           d="m 3.734375,-6.125 c 0.0625,-0.234375 0.09375,-0.328125 0.28125,-0.359375 C 4.109375,-6.5 4.421875,-6.5 4.625,-6.5 c 0.703125,0 1.8125,0 1.8125,0.984375 0,0.34375 -0.15625,1.03125 -0.546875,1.421875 -0.265625,0.25 -0.78125,0.578125 -1.6875,0.578125 H 3.09375 Z m 1.4375,2.734375 c 1.015625,-0.21875 2.1875,-0.921875 2.1875,-1.921875 0,-0.859375 -0.890625,-1.5 -2.203125,-1.5 H 2.328125 c -0.203125,0 -0.296875,0 -0.296875,0.203125 C 2.03125,-6.5 2.125,-6.5 2.3125,-6.5 c 0.015625,0 0.203125,0 0.375,0.015625 0.1875,0.03125 0.265625,0.03125 0.265625,0.171875 0,0.03125 0,0.0625 -0.03125,0.1875 l -1.34375,5.34375 C 1.484375,-0.390625 1.46875,-0.3125 0.671875,-0.3125 0.5,-0.3125 0.40625,-0.3125 0.40625,-0.109375 0.40625,0 0.53125,0 0.546875,0 c 0.28125,0 0.984375,-0.03125 1.25,-0.03125 0.28125,0 1,0.03125 1.28125,0.03125 0.078125,0 0.1875,0 0.1875,-0.203125 0,-0.109375 -0.078125,-0.109375 -0.28125,-0.109375 -0.359375,0 -0.640625,0 -0.640625,-0.171875 0,-0.0625 0.015625,-0.109375 0.03125,-0.171875 l 0.65625,-2.640625 h 1.1875 c 0.90625,0 1.078125,0.5625 1.078125,0.90625 0,0.140625 -0.078125,0.453125 -0.140625,0.6875 C 5.09375,-1.421875 5,-1.0625 5,-0.859375 5,0.21875 6.203125,0.21875 6.328125,0.21875 c 0.84375,0 1.203125,-1 1.203125,-1.140625 0,-0.125 -0.109375,-0.125 -0.125,-0.125 -0.09375,0 -0.109375,0.0625 -0.125,0.140625 C 7.03125,-0.171875 6.59375,0 6.375,0 6.046875,0 5.96875,-0.21875 5.96875,-0.609375 c 0,-0.3125 0.0625,-0.8125 0.109375,-1.140625 0.015625,-0.140625 0.03125,-0.328125 0.03125,-0.46875 0,-0.765625 -0.671875,-1.078125 -0.9375,-1.171875 z m 0,0"
+           style="stroke:none"
+           inkscape:connector-curvature="0" />
+      </symbol>
+      <symbol
+         id="symbol9374"
+         overflow="visible"
+         style="overflow:visible">
+        <path
+           id="path9002"
+           d="m 4.53125,-4.984375 c 0,-0.65625 -0.171875,-2.046875 -1.1875,-2.046875 -1.390625,0 -2.921875,2.8125 -2.921875,5.09375 0,0.9375 0.28125,2.046875 1.1875,2.046875 1.40625,0 2.921875,-2.859375 2.921875,-5.09375 z M 1.46875,-3.625 C 1.640625,-4.25 1.84375,-5.046875 2.25,-5.765625 2.515625,-6.25 2.875,-6.8125 3.328125,-6.8125 c 0.484375,0 0.546875,0.640625 0.546875,1.203125 0,0.5 -0.078125,1 -0.3125,1.984375 z m 2,0.328125 C 3.359375,-2.84375 3.15625,-2 2.765625,-1.28125 c -0.34375,0.6875 -0.71875,1.171875 -1.15625,1.171875 -0.328125,0 -0.53125,-0.296875 -0.53125,-1.21875 0,-0.421875 0.0625,-1 0.3125,-1.96875 z m 0,0"
+           style="stroke:none"
+           inkscape:connector-curvature="0" />
+      </symbol>
+      <symbol
+         id="symbol3348"
+         overflow="visible"
+         style="overflow:visible">
+        <path
+           id="path8256"
+           d=""
+           style="stroke:none"
+           inkscape:connector-curvature="0" />
+      </symbol>
+      <symbol
+         id="symbol7060"
+         overflow="visible"
+         style="overflow:visible">
+        <path
+           id="path3411"
+           d="M 1.734375,-0.734375 C 1.671875,-0.5 1.4375,-0.125 1.078125,-0.125 c -0.015625,0 -0.234375,0 -0.375,-0.09375 0.28125,-0.09375 0.3125,-0.34375 0.3125,-0.390625 0,-0.15625 -0.125,-0.25 -0.28125,-0.25 -0.203125,0 -0.40625,0.15625 -0.40625,0.421875 0,0.34375 0.390625,0.5 0.734375,0.5 0.328125,0 0.609375,-0.1875 0.78125,-0.484375 C 2.015625,-0.0625 2.390625,0.0625 2.671875,0.0625 c 0.8125,0 1.234375,-0.859375 1.234375,-1.0625 0,-0.09375 -0.09375,-0.09375 -0.109375,-0.09375 -0.109375,0 -0.109375,0.046875 -0.140625,0.125 -0.140625,0.484375 -0.5625,0.84375 -0.953125,0.84375 -0.28125,0 -0.421875,-0.1875 -0.421875,-0.453125 0,-0.1875 0.171875,-0.8125 0.359375,-1.59375 C 2.78125,-2.703125 3.09375,-2.875 3.328125,-2.875 c 0.015625,0 0.21875,0 0.375,0.09375 -0.21875,0.0625 -0.3125,0.265625 -0.3125,0.390625 0,0.140625 0.125,0.25 0.28125,0.25 0.15625,0 0.390625,-0.125 0.390625,-0.421875 0,-0.390625 -0.453125,-0.515625 -0.71875,-0.515625 -0.359375,0 -0.640625,0.234375 -0.78125,0.5 -0.125,-0.28125 -0.453125,-0.5 -0.84375,-0.5 C 0.9375,-3.078125 0.5,-2.21875 0.5,-2 c 0,0.078125 0.09375,0.078125 0.109375,0.078125 0.09375,0 0.09375,-0.015625 0.140625,-0.109375 C 0.921875,-2.578125 1.359375,-2.875 1.703125,-2.875 1.9375,-2.875 2.125,-2.75 2.125,-2.421875 2.125,-2.28125 2.03125,-1.9375 1.96875,-1.6875 Z m 0,0"
+           style="stroke:none"
+           inkscape:connector-curvature="0" />
+      </symbol>
+      <symbol
+         id="symbol1294"
+         overflow="visible"
+         style="overflow:visible">
+        <path
+           id="path1940"
+           d=""
+           style="stroke:none"
+           inkscape:connector-curvature="0" />
+      </symbol>
+      <symbol
+         id="symbol7152"
+         overflow="visible"
+         style="overflow:visible">
+        <path
+           id="path3401"
+           d="m 3.296875,2.390625 c 0,-0.03125 0,-0.046875 -0.171875,-0.21875 C 1.890625,0.921875 1.5625,-0.96875 1.5625,-2.5 c 0,-1.734375 0.375,-3.46875 1.609375,-4.703125 0.125,-0.125 0.125,-0.140625 0.125,-0.171875 0,-0.078125 -0.03125,-0.109375 -0.09375,-0.109375 -0.109375,0 -1,0.6875 -1.59375,1.953125 -0.5,1.09375 -0.625,2.203125 -0.625,3.03125 0,0.78125 0.109375,1.984375 0.65625,3.125 C 2.25,1.84375 3.09375,2.5 3.203125,2.5 c 0.0625,0 0.09375,-0.03125 0.09375,-0.109375 z m 0,0"
+           style="stroke:none"
+           inkscape:connector-curvature="0" />
+      </symbol>
+      <symbol
+         id="symbol8261"
+         overflow="visible"
+         style="overflow:visible">
+        <path
+           id="path2832"
+           d="m 2.875,-2.5 c 0,-0.765625 -0.109375,-1.96875 -0.65625,-3.109375 -0.59375,-1.21875 -1.453125,-1.875 -1.546875,-1.875 -0.0625,0 -0.109375,0.046875 -0.109375,0.109375 0,0.03125 0,0.046875 0.1875,0.234375 0.984375,0.984375 1.546875,2.5625 1.546875,4.640625 0,1.71875 -0.359375,3.46875 -1.59375,4.71875 C 0.5625,2.34375 0.5625,2.359375 0.5625,2.390625 0.5625,2.453125 0.609375,2.5 0.671875,2.5 0.765625,2.5 1.671875,1.8125 2.25,0.546875 2.765625,-0.546875 2.875,-1.65625 2.875,-2.5 Z m 0,0"
+           style="stroke:none"
+           inkscape:connector-curvature="0" />
+      </symbol>
+    </g>
+    <marker
+       inkscape:isstock="true"
+       style="overflow:visible"
+       id="Arrow1Mend-9-5"
+       refX="0"
+       refY="0"
+       orient="auto"
+       inkscape:stockid="Arrow1Mend">
+      <path
+         transform="matrix(-0.4,0,0,-0.4,-4,0)"
+         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
+         d="M 0,0 5,-5 -12.5,0 5,5 Z"
+         id="path6650-2-6"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <g
+       id="g7363">
+      <symbol
+         id="symbol6780"
+         overflow="visible"
+         style="overflow:visible">
+        <path
+           id="path7757"
+           d=""
+           style="stroke:none"
+           inkscape:connector-curvature="0" />
+      </symbol>
+      <symbol
+         id="symbol3142"
+         overflow="visible"
+         style="overflow:visible">
+        <path
+           id="path1573"
+           d="m 3.734375,-6.125 c 0.0625,-0.234375 0.09375,-0.328125 0.28125,-0.359375 C 4.109375,-6.5 4.421875,-6.5 4.625,-6.5 c 0.703125,0 1.8125,0 1.8125,0.984375 0,0.34375 -0.15625,1.03125 -0.546875,1.421875 -0.265625,0.25 -0.78125,0.578125 -1.6875,0.578125 H 3.09375 Z m 1.4375,2.734375 c 1.015625,-0.21875 2.1875,-0.921875 2.1875,-1.921875 0,-0.859375 -0.890625,-1.5 -2.203125,-1.5 H 2.328125 c -0.203125,0 -0.296875,0 -0.296875,0.203125 C 2.03125,-6.5 2.125,-6.5 2.3125,-6.5 c 0.015625,0 0.203125,0 0.375,0.015625 0.1875,0.03125 0.265625,0.03125 0.265625,0.171875 0,0.03125 0,0.0625 -0.03125,0.1875 l -1.34375,5.34375 C 1.484375,-0.390625 1.46875,-0.3125 0.671875,-0.3125 0.5,-0.3125 0.40625,-0.3125 0.40625,-0.109375 0.40625,0 0.53125,0 0.546875,0 c 0.28125,0 0.984375,-0.03125 1.25,-0.03125 0.28125,0 1,0.03125 1.28125,0.03125 0.078125,0 0.1875,0 0.1875,-0.203125 0,-0.109375 -0.078125,-0.109375 -0.28125,-0.109375 -0.359375,0 -0.640625,0 -0.640625,-0.171875 0,-0.0625 0.015625,-0.109375 0.03125,-0.171875 l 0.65625,-2.640625 h 1.1875 c 0.90625,0 1.078125,0.5625 1.078125,0.90625 0,0.140625 -0.078125,0.453125 -0.140625,0.6875 C 5.09375,-1.421875 5,-1.0625 5,-0.859375 5,0.21875 6.203125,0.21875 6.328125,0.21875 c 0.84375,0 1.203125,-1 1.203125,-1.140625 0,-0.125 -0.109375,-0.125 -0.125,-0.125 -0.09375,0 -0.109375,0.0625 -0.125,0.140625 C 7.03125,-0.171875 6.59375,0 6.375,0 6.046875,0 5.96875,-0.21875 5.96875,-0.609375 c 0,-0.3125 0.0625,-0.8125 0.109375,-1.140625 0.015625,-0.140625 0.03125,-0.328125 0.03125,-0.46875 0,-0.765625 -0.671875,-1.078125 -0.9375,-1.171875 z m 0,0"
+           style="stroke:none"
+           inkscape:connector-curvature="0" />
+      </symbol>
+      <symbol
+         id="symbol1490"
+         overflow="visible"
+         style="overflow:visible">
+        <path
+           id="path2776"
+           d="M 1.6875,1.6875 C 1.65625,1.828125 1.640625,1.84375 1.640625,1.890625 c 0,0.21875 0.1875,0.28125 0.296875,0.28125 0.046875,0 0.265625,-0.03125 0.359375,-0.265625 C 2.328125,1.828125 2.375,1.5 2.65625,0.09375 c 0.078125,0 0.15625,0.015625 0.328125,0.015625 1.65625,0 3.1875,-1.5625 3.1875,-3.140625 0,-0.78125 -0.390625,-1.375 -1.140625,-1.375 -1.4375,0 -2.046875,1.9375 -2.640625,3.875 C 1.3125,-0.734375 0.75,-1.28125 0.75,-2 c 0,-0.28125 0.234375,-1.375 0.828125,-2.0625 0.09375,-0.09375 0.09375,-0.109375 0.09375,-0.140625 0,-0.03125 -0.03125,-0.09375 -0.125,-0.09375 -0.28125,0 -1.046875,1.453125 -1.046875,2.40625 0,0.9375 0.65625,1.65625 1.71875,1.90625 z m 1.390625,-2.15625 c -0.09375,0 -0.109375,0 -0.1875,-0.015625 -0.125,0 -0.125,0 -0.125,-0.03125 0,-0.015625 0.171875,-0.9375 0.1875,-1.078125 0.3125,-1.28125 1.09375,-2.234375 1.984375,-2.234375 0.6875,0 0.953125,0.53125 0.953125,1.015625 0,1.125 -1.28125,2.34375 -2.8125,2.34375 z m 0,0"
+           style="stroke:none"
+           inkscape:connector-curvature="0" />
+      </symbol>
+      <symbol
+         id="symbol9292"
+         overflow="visible"
+         style="overflow:visible">
+        <path
+           id="path5625"
+           d=""
+           style="stroke:none"
+           inkscape:connector-curvature="0" />
+      </symbol>
+      <symbol
+         id="symbol4231"
+         overflow="visible"
+         style="overflow:visible">
+        <path
+           id="path3453"
+           d="M 3.875,-2.625 C 3.90625,-2.71875 3.90625,-2.734375 3.90625,-2.78125 3.90625,-2.921875 3.796875,-3 3.671875,-3 3.59375,-3 3.46875,-2.96875 3.390625,-2.84375 3.359375,-2.796875 3.3125,-2.578125 3.28125,-2.4375 L 3.125,-1.859375 c -0.03125,0.171875 -0.25,1.046875 -0.28125,1.125 0,0 -0.3125,0.609375 -0.84375,0.609375 -0.484375,0 -0.484375,-0.453125 -0.484375,-0.578125 0,-0.375 0.15625,-0.8125 0.375,-1.359375 C 1.96875,-2.28125 2,-2.359375 2,-2.484375 2,-2.8125 1.71875,-3.078125 1.34375,-3.078125 0.640625,-3.078125 0.328125,-2.125 0.328125,-2 c 0,0.078125 0.09375,0.078125 0.125,0.078125 0.09375,0 0.09375,-0.03125 0.125,-0.109375 C 0.75,-2.609375 1.046875,-2.875 1.328125,-2.875 1.4375,-2.875 1.5,-2.796875 1.5,-2.640625 c 0,0.171875 -0.0625,0.3125 -0.09375,0.40625 C 1.0625,-1.375 1,-1.125 1,-0.8125 1,-0.703125 1,-0.375 1.265625,-0.140625 1.484375,0.03125 1.78125,0.0625 1.96875,0.0625 2.25,0.0625 2.5,-0.03125 2.71875,-0.25 2.640625,0.140625 2.5625,0.4375 2.265625,0.78125 2.078125,1 1.796875,1.21875 1.421875,1.21875 c -0.046875,0 -0.375,0 -0.515625,-0.21875 0.375,-0.046875 0.375,-0.375 0.375,-0.390625 0,-0.21875 -0.203125,-0.265625 -0.265625,-0.265625 -0.171875,0 -0.40625,0.140625 -0.40625,0.46875 0,0.34375 0.328125,0.609375 0.828125,0.609375 C 2.140625,1.421875 3,0.875 3.21875,0 Z m 0,0"
+           style="stroke:none"
+           inkscape:connector-curvature="0" />
+      </symbol>
+      <symbol
+         id="symbol9001"
+         overflow="visible"
+         style="overflow:visible">
+        <path
+           id="path5744"
+           d=""
+           style="stroke:none"
+           inkscape:connector-curvature="0" />
+      </symbol>
+      <symbol
+         id="symbol7466"
+         overflow="visible"
+         style="overflow:visible">
+        <path
+           id="path4536"
+           d="m 3.296875,2.390625 c 0,-0.03125 0,-0.046875 -0.171875,-0.21875 C 1.890625,0.921875 1.5625,-0.96875 1.5625,-2.5 c 0,-1.734375 0.375,-3.46875 1.609375,-4.703125 0.125,-0.125 0.125,-0.140625 0.125,-0.171875 0,-0.078125 -0.03125,-0.109375 -0.09375,-0.109375 -0.109375,0 -1,0.6875 -1.59375,1.953125 -0.5,1.09375 -0.625,2.203125 -0.625,3.03125 0,0.78125 0.109375,1.984375 0.65625,3.125 C 2.25,1.84375 3.09375,2.5 3.203125,2.5 c 0.0625,0 0.09375,-0.03125 0.09375,-0.109375 z m 0,0"
+           style="stroke:none"
+           inkscape:connector-curvature="0" />
+      </symbol>
+      <symbol
+         id="symbol3506"
+         overflow="visible"
+         style="overflow:visible">
+        <path
+           id="path2592"
+           d="m 2.875,-2.5 c 0,-0.765625 -0.109375,-1.96875 -0.65625,-3.109375 -0.59375,-1.21875 -1.453125,-1.875 -1.546875,-1.875 -0.0625,0 -0.109375,0.046875 -0.109375,0.109375 0,0.03125 0,0.046875 0.1875,0.234375 0.984375,0.984375 1.546875,2.5625 1.546875,4.640625 0,1.71875 -0.359375,3.46875 -1.59375,4.71875 C 0.5625,2.34375 0.5625,2.359375 0.5625,2.390625 0.5625,2.453125 0.609375,2.5 0.671875,2.5 0.765625,2.5 1.671875,1.8125 2.25,0.546875 2.765625,-0.546875 2.875,-1.65625 2.875,-2.5 Z m 0,0"
+           style="stroke:none"
+           inkscape:connector-curvature="0" />
+      </symbol>
+    </g>
+    <inkscape:path-effect
+       effect="spiro"
+       id="path-effect4185-9-9-2-3-3"
+       is_visible="true"
+       lpeversion="0" />
+    <inkscape:path-effect
+       effect="spiro"
+       id="path-effect4185-9-9-2-3-3-9"
+       is_visible="true"
+       lpeversion="0" />
+    <inkscape:path-effect
+       effect="spiro"
+       id="path-effect4185-9-9-2-3-3-9-4"
+       is_visible="true"
+       lpeversion="0" />
+  </defs>
+  <metadata
+     id="metadata4546">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title></dc:title>
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(-369.92574,154.75088)">
+    <text
+       id="text3072"
+       y="78.524437"
+       x="281.388"
+       style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:28px;line-height:125%;font-family:'Times New Roman';-inkscape-font-specification:'Times New Roman, Italic';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none"
+       xml:space="preserve" />
+    <text
+       id="text3076"
+       y="93.791618"
+       x="334.82312"
+       style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:28px;line-height:125%;font-family:'Times New Roman';-inkscape-font-specification:'Times New Roman, Italic';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none"
+       xml:space="preserve" />
+    <path
+       inkscape:connector-curvature="0"
+       id="path3806-5"
+       d="M 369.92574,-142.9307 H 650.42549"
+       style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+    <path
+       inkscape:connector-curvature="0"
+       id="path3806-6"
+       d="M 369.92574,-113.3057 H 650.78291"
+       style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+    <text
+       id="text7492"
+       y="-222.48793"
+       x="274.58649"
+       style="font-style:normal;font-weight:normal;font-size:35px;line-height:125%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       xml:space="preserve" />
+    <g
+       id="g3152"
+       transform="translate(1.4339194)">
+      <g
+         transform="translate(7.2942703)"
+         id="g3049">
+        <circle
+           id="path4181-6-7-6-6"
+           style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+           cx="501.62613"
+           cy="-113.3057"
+           r="9.1789093" />
+        <circle
+           id="path4179-9-2-0-0-5"
+           style="fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:0.54598999;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+           cx="501.6261"
+           cy="-142.93069"
+           r="2.4853103" />
+        <path
+           inkscape:connector-curvature="0"
+           inkscape:original-d="M 270.16665,257.87321 V 219.70728"
+           inkscape:path-effect="#path-effect4185-9-9-2-3-3"
+           id="path4183-9-1-9-6-3"
+           d="M 270.16665,257.87321 V 219.70728"
+           style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+           transform="translate(231.45946,-362.14121)" />
+      </g>
+      <g
+         transform="translate(0.88628622)"
+         id="g3070">
+        <g
+           id="g2982"
+           transform="translate(128.59952,-92.372374)">
+          <rect
+             style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+             id="rect3890-67-7-6-1-0-6-0"
+             width="38.809792"
+             height="22.539835"
+             x="-358.3595"
+             y="-61.828243"
+             transform="scale(-1,1)" />
+          <g
+             transform="matrix(2.0078309,0,0,2.0078309,253.41599,-248.06204)"
+             id="g1940">
+            <g
+               style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;letter-spacing:normal;word-spacing:normal;text-anchor:start;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10.43299961;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+               id="content"
+               transform="matrix(0.125,0,0,-0.125,-21.875,150.69858)"
+               xml:space="preserve"
+               stroke-miterlimit="10.433"
+               font-style="normal"
+               font-variant="normal"
+               font-weight="normal"
+               font-stretch="normal"
+               font-size-adjust="none"
+               letter-spacing="normal"
+               word-spacing="normal"><path
+                 style="fill:#000000;stroke-width:0"
+                 inkscape:connector-curvature="0"
+                 d="m 481.38,423.14 0.47,0.11 0.48,0.12 0.48,0.14 0.48,0.15 0.49,0.16 0.48,0.18 0.48,0.19 0.47,0.2 0.47,0.22 0.47,0.23 0.46,0.24 0.45,0.25 0.43,0.27 0.43,0.28 0.42,0.29 0.4,0.3 0.39,0.31 0.37,0.32 0.36,0.34 0.33,0.35 0.32,0.35 0.29,0.37 0.28,0.38 0.25,0.39 0.22,0.4 0.2,0.41 0.17,0.42 0.15,0.43 0.11,0.44 0.08,0.45 0.05,0.46 0.02,0.47 c 0,4.28 -4.48,7.47 -11,7.47 h -14.2 c -1,0 -1.45,0 -1.45,-1 0,-0.55 0.45,-0.55 1.4,-0.55 0.1,0 1.05,0 1.89,-0.09 0.89,-0.11 1.35,-0.16 1.35,-0.8 0,-0.2 -0.05,-0.36 -0.21,-0.95 l -6.67,-26.75 c -0.5,-1.95 -0.59,-2.34 -4.53,-2.34 -0.91,0 -1.34,0 -1.34,-1 0,-0.55 0.59,-0.55 0.68,-0.55 1.41,0 4.89,0.16 6.29,0.16 1.39,0 4.93,-0.16 6.32,-0.16 0.41,0 1,0 1,1 0,0.55 -0.45,0.55 -1.39,0.55 -1.84,0 -3.25,0 -3.25,0.89 0,0.29 0.11,0.54 0.16,0.84 l 3.28,13.2 h 5.94 l -0.05,1.11 h -5.59 l 3.25,13 c 0.29,1.19 0.43,1.69 1.39,1.85 0.45,0.04 2.04,0.04 3.03,0.04 3.55,0 9.08,0 9.08,-4.93 0,-1.69 -0.8,-5.13 -2.75,-7.07 -1.28,-1.29 -3.92,-2.89 -8.41,-2.89 l 0.05,-1.11 c 4.53,0 5.42,-2.78 5.42,-4.53 0,-0.75 -0.39,-2.28 -0.69,-3.44 -0.36,-1.39 -0.79,-3.23 -0.79,-4.23 0,-5.37 5.96,-5.37 6.62,-5.37 4.23,0 5.97,5.03 5.97,5.73 0,0.59 -0.55,0.59 -0.59,0.59 -0.46,0 -0.55,-0.36 -0.65,-0.7 -1.25,-3.69 -3.39,-4.53 -4.54,-4.53 -1.64,0 -1.99,1.09 -1.99,3.05 0,1.53 0.3,4.07 0.5,5.67 0.1,0.7 0.21,1.64 0.21,2.34 0,3.83 -3.35,5.38 -4.69,5.88 z"
+                 id="path1929" /><path
+                 style="fill:#000000;stroke-width:0"
+                 inkscape:connector-curvature="0"
+                 d="m 499.18,401.82 0.17,0.17 0.16,0.17 0.17,0.16 0.17,0.17 0.18,0.17 0.09,0.09 0.1,0.1 0.1,0.09 0.11,0.1 0.11,0.1 0.11,0.11 0.13,0.11 0.13,0.11 0.13,0.12 0.15,0.13 0.15,0.13 0.16,0.14 0.17,0.14 0.17,0.15 0.19,0.16 0.2,0.16 0.21,0.17 0.22,0.18 0.23,0.19 0.25,0.2 0.25,0.21 0.27,0.21 c 0.74,0.6 3.35,2.69 4.36,3.66 2.13,2.09 3.46,3.87 3.46,4.29 0,0.41 -0.46,0.41 -0.6,0.41 -0.31,0 -0.42,-0.06 -0.59,-0.34 -1.08,-1.6 -1.81,-2.13 -2.64,-2.13 -0.42,0 -0.95,0.03 -2,1.05 -1.17,1.19 -1.94,1.42 -2.75,1.42 -2.78,0 -4.67,-3.03 -4.67,-4.06 0,-0.33 0.36,-0.42 0.59,-0.42 0.42,0 0.5,0.09 0.63,0.48 0.53,1.22 2.48,1.3 3.04,1.3 0.8,0 1.71,-0.22 2.19,-0.33 1.92,-0.41 2.16,-0.41 3.03,-0.41 -0.91,-0.95 -1.53,-1.57 -4.84,-4.22 -2.72,-2.15 -3.66,-3.03 -4.32,-3.73 -2.09,-2.05 -3.1,-3.58 -3.1,-3.91 0,-0.4 0.45,-0.4 0.59,-0.4 0.34,0 0.42,0.06 0.59,0.34 0.94,1.33 2.02,2.13 3.21,2.13 0.42,0 0.93,-0.03 1.87,-0.91 1.09,-1.05 1.78,-1.56 2.91,-1.56 3.72,0 6.06,4.22 6.06,5.39 0,0.42 -0.39,0.45 -0.59,0.45 -0.43,0 -0.5,-0.17 -0.63,-0.55 -0.67,-1.75 -2.72,-2.57 -4.44,-2.57 -0.79,0 -1.67,0.17 -2.53,0.37 -1.61,0.35 -1.89,0.35 -2.51,0.35 -0.08,0 -0.6,0 -0.8,-0.04 z"
+                 id="path1931" /><path
+                 style="fill:#000000;stroke-width:0"
+                 inkscape:connector-curvature="0"
+                 d="m 532.84,394.25 v 0.02 0.03 0.01 0.02 0.01 l -0.01,0.02 v 0.01 l -0.01,0.02 -0.01,0.02 -0.01,0.02 -0.01,0.02 -0.02,0.03 -0.01,0.02 -0.02,0.03 -0.02,0.03 -0.03,0.03 -0.02,0.03 -0.03,0.04 -0.02,0.02 -0.01,0.02 -0.02,0.02 -0.02,0.02 -0.02,0.02 -0.02,0.03 -0.02,0.02 -0.02,0.02 -0.02,0.03 -0.03,0.02 -0.02,0.03 -0.03,0.03 -0.03,0.03 -0.02,0.03 -0.03,0.03 -0.03,0.03 -0.03,0.03 -0.03,0.03 -0.04,0.04 -0.03,0.03 -0.04,0.04 -0.03,0.03 -0.04,0.04 -0.04,0.04 c -6.22,6.28 -7.81,15.69 -7.81,23.31 0,8.67 1.89,17.35 8.01,23.56 0.64,0.61 0.64,0.71 0.64,0.86 0,0.35 -0.18,0.49 -0.48,0.49 -0.5,0 -4.98,-3.38 -7.92,-9.7 -2.55,-5.49 -3.14,-11.02 -3.14,-15.21 0,-3.89 0.54,-9.9 3.28,-15.54 2.98,-6.13 7.28,-9.36 7.78,-9.36 0.3,0 0.48,0.14 0.48,0.5 z"
+                 id="path1933" /><path
+                 style="fill:#000000;stroke-width:0"
+                 inkscape:connector-curvature="0"
+                 d="m 548.83,427.96 -0.58,-0.15 -0.57,-0.18 -0.56,-0.21 -0.55,-0.24 -0.54,-0.26 -0.53,-0.28 -0.52,-0.31 -0.51,-0.33 -0.49,-0.35 -0.48,-0.38 -0.46,-0.39 -0.45,-0.41 -0.43,-0.42 -0.42,-0.45 -0.4,-0.46 -0.38,-0.47 -0.36,-0.49 -0.34,-0.5 -0.33,-0.51 -0.3,-0.52 -0.29,-0.53 -0.26,-0.53 -0.24,-0.55 -0.22,-0.55 -0.19,-0.56 -0.17,-0.56 -0.15,-0.57 -0.12,-0.56 -0.1,-0.57 -0.06,-0.57 -0.05,-0.57 -0.01,-0.57 c 0,-4.78 3.19,-8.35 7.88,-8.35 v 1.09 c -2.75,0 -4.79,2.09 -4.79,5.87 0,3.14 1.85,12.5 8.57,14.3 v 0 c 1.25,-2.28 2.73,-4.98 2.73,-8.56 0,-3.3 -1.89,-11.61 -6.51,-11.61 v -1.09 c 5.82,0 9.95,7.81 9.95,14.68 0,4.55 -1.99,7.03 -3.69,9.27 -1.78,2.25 -4.72,5.98 -4.72,8.17 0,1.11 0.99,2.3 2.74,2.3 1.5,0 2.48,-0.64 3.53,-1.35 1,-0.59 2,-1.25 2.75,-1.25 1.23,0 1.98,1.21 1.98,2 0,1.1 -0.79,1.24 -2.59,1.64 -2.58,0.55 -3.28,0.55 -4.08,0.55 -3.89,0 -5.69,-2.14 -5.69,-5.12 0,-2.71 1.45,-5.49 3,-8.54 z"
+                 id="path1935" /><path
+                 style="fill:#000000;stroke-width:0"
+                 inkscape:connector-curvature="0"
+                 d="m 574.07,418.65 -0.01,0.37 v 0.39 l -0.01,0.39 -0.01,0.41 -0.04,0.84 -0.06,0.88 -0.08,0.92 -0.11,0.95 -0.14,0.97 -0.16,1.01 -0.19,1.02 -0.23,1.03 -0.27,1.05 -0.31,1.06 -0.35,1.07 -0.39,1.07 -0.21,0.53 -0.23,0.53 -0.23,0.53 -0.26,0.53 c -2.98,6.12 -7.26,9.36 -7.76,9.36 -0.3,0 -0.5,-0.19 -0.5,-0.49 0,-0.15 0,-0.25 0.94,-1.15 4.89,-4.92 7.73,-12.85 7.73,-23.27 0,-8.51 -1.84,-17.28 -8.03,-23.56 -0.64,-0.59 -0.64,-0.7 -0.64,-0.84 0,-0.3 0.2,-0.5 0.5,-0.5 0.5,0 4.97,3.39 7.92,9.71 2.53,5.47 3.13,11 3.13,15.19 z"
+                 id="path1937" /></g>          </g>
+        </g>
+        <g
+           id="g2993"
+           transform="translate(68.645848,-69.433657)">
+          <g
+             id="g2972">
+            <rect
+               transform="scale(-1,1)"
+               y="-55.14196"
+               x="-418.31317"
+               height="22.539835"
+               width="38.809792"
+               id="rect3890-67-7-6-1-0-6-6"
+               style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+            <g
+               id="g2089"
+               transform="matrix(2.0078309,0,0,2.0078309,312.39084,-241.63928)">
+              <g
+                 word-spacing="normal"
+                 letter-spacing="normal"
+                 font-size-adjust="none"
+                 font-stretch="normal"
+                 font-weight="normal"
+                 font-variant="normal"
+                 font-style="normal"
+                 stroke-miterlimit="10.433"
+                 xml:space="preserve"
+                 transform="matrix(0.125,0,0,-0.125,-21.875,150.69858)"
+                 id="g2087"
+                 style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;letter-spacing:normal;word-spacing:normal;text-anchor:start;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10.43299961;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"><path
+                   id="path2077"
+                   d="m 481.38,423.14 0.47,0.11 0.48,0.12 0.48,0.14 0.48,0.15 0.49,0.16 0.48,0.18 0.48,0.19 0.47,0.2 0.47,0.22 0.47,0.23 0.46,0.24 0.45,0.25 0.43,0.27 0.43,0.28 0.42,0.29 0.4,0.3 0.39,0.31 0.37,0.32 0.36,0.34 0.33,0.35 0.32,0.35 0.29,0.37 0.28,0.38 0.25,0.39 0.22,0.4 0.2,0.41 0.17,0.42 0.15,0.43 0.11,0.44 0.08,0.45 0.05,0.46 0.02,0.47 c 0,4.28 -4.48,7.47 -11,7.47 h -14.2 c -1,0 -1.45,0 -1.45,-1 0,-0.55 0.45,-0.55 1.4,-0.55 0.1,0 1.05,0 1.89,-0.09 0.89,-0.11 1.35,-0.16 1.35,-0.8 0,-0.2 -0.05,-0.36 -0.21,-0.95 l -6.67,-26.75 c -0.5,-1.95 -0.59,-2.34 -4.53,-2.34 -0.91,0 -1.34,0 -1.34,-1 0,-0.55 0.59,-0.55 0.68,-0.55 1.41,0 4.89,0.16 6.29,0.16 1.39,0 4.93,-0.16 6.32,-0.16 0.41,0 1,0 1,1 0,0.55 -0.45,0.55 -1.39,0.55 -1.84,0 -3.25,0 -3.25,0.89 0,0.29 0.11,0.54 0.16,0.84 l 3.28,13.2 h 5.94 l -0.05,1.11 h -5.59 l 3.25,13 c 0.29,1.19 0.43,1.69 1.39,1.85 0.45,0.04 2.04,0.04 3.03,0.04 3.55,0 9.08,0 9.08,-4.93 0,-1.69 -0.8,-5.13 -2.75,-7.07 -1.28,-1.29 -3.92,-2.89 -8.41,-2.89 l 0.05,-1.11 c 4.53,0 5.42,-2.78 5.42,-4.53 0,-0.75 -0.39,-2.28 -0.69,-3.44 -0.36,-1.39 -0.79,-3.23 -0.79,-4.23 0,-5.37 5.96,-5.37 6.62,-5.37 4.23,0 5.97,5.03 5.97,5.73 0,0.59 -0.55,0.59 -0.59,0.59 -0.46,0 -0.55,-0.36 -0.65,-0.7 -1.25,-3.69 -3.39,-4.53 -4.54,-4.53 -1.64,0 -1.99,1.09 -1.99,3.05 0,1.53 0.3,4.07 0.5,5.67 0.1,0.7 0.21,1.64 0.21,2.34 0,3.83 -3.35,5.38 -4.69,5.88 z"
+                   inkscape:connector-curvature="0"
+                   style="fill:#000000;stroke-width:0" /><path
+                   id="path2079"
+                   d="m 512.7,411.9 v 0.02 l 0.01,0.03 v 0.02 l 0.01,0.02 0.01,0.02 v 0.02 l 0.01,0.04 0.01,0.03 0.01,0.03 0.01,0.04 0.01,0.03 v 0.02 l 0.01,0.03 0.01,0.03 v 0.02 l 0.01,0.02 v 0.02 0.02 l 0.01,0.02 v 0.02 0.02 l 0.01,0.02 v 0.02 0.03 0.03 l 0.01,0.04 v 0.03 0.02 0.02 0.02 0.02 c 0,0.69 -0.57,1.11 -1.16,1.11 -0.38,0 -1.05,-0.17 -1.42,-0.83 -0.11,-0.22 -0.39,-1.33 -0.56,-2.03 l -0.74,-2.89 c -0.2,-0.83 -1.28,-5.22 -1.39,-5.61 -0.03,0 -1.56,-3.03 -4.28,-3.03 -2.38,0 -2.38,2.26 -2.38,2.89 0,1.89 0.8,4.08 1.85,6.76 0.42,1.11 0.59,1.53 0.59,2.13 0,1.67 -1.42,2.95 -3.31,2.95 -3.52,0 -5.08,-4.73 -5.08,-5.33 0,-0.45 0.49,-0.45 0.59,-0.45 0.49,0 0.52,0.17 0.63,0.56 0.87,2.89 2.37,4.25 3.77,4.25 0.59,0 0.85,-0.39 0.85,-1.22 0,-0.79 -0.31,-1.56 -0.48,-2.01 -1.67,-4.25 -2.02,-5.55 -2.02,-7.08 0,-0.59 0,-2.23 1.36,-3.34 1.08,-0.91 2.55,-1.08 3.49,-1.08 1.39,0 2.64,0.51 3.8,1.56 -0.46,-1.92 -0.85,-3.37 -2.3,-5.12 -0.94,-1.08 -2.35,-2.22 -4.19,-2.22 -0.23,0 -1.87,0 -2.61,1.14 1.88,0.2 1.88,1.89 1.88,1.92 0,1.11 -1,1.31 -1.36,1.31 -0.86,0 -2.02,-0.69 -2.02,-2.3 0,-1.76 1.67,-3.06 4.14,-3.06 3.53,0 7.81,2.72 8.89,7.08 z"
+                   inkscape:connector-curvature="0"
+                   style="fill:#000000;stroke-width:0" /><path
+                   id="path2081"
+                   d="m 533.8,394.25 v 0.02 0.03 0.01 0.02 0.01 l -0.01,0.02 v 0.01 l -0.01,0.02 -0.01,0.02 -0.01,0.02 -0.01,0.02 -0.02,0.03 -0.01,0.02 -0.02,0.03 -0.02,0.03 -0.03,0.03 -0.02,0.03 -0.03,0.04 -0.02,0.02 -0.01,0.02 -0.02,0.02 -0.02,0.02 -0.02,0.02 -0.02,0.03 -0.02,0.02 -0.02,0.02 -0.02,0.03 -0.03,0.02 -0.02,0.03 -0.03,0.03 -0.02,0.03 -0.03,0.03 -0.03,0.03 -0.03,0.03 -0.03,0.03 -0.03,0.03 -0.04,0.04 -0.03,0.03 -0.04,0.04 -0.03,0.03 -0.04,0.04 -0.04,0.04 c -6.22,6.28 -7.81,15.69 -7.81,23.31 0,8.67 1.89,17.35 8.01,23.56 0.64,0.61 0.64,0.71 0.64,0.86 0,0.35 -0.18,0.49 -0.48,0.49 -0.5,0 -4.98,-3.38 -7.92,-9.7 -2.55,-5.49 -3.14,-11.02 -3.14,-15.21 0,-3.89 0.54,-9.9 3.28,-15.54 2.98,-6.13 7.28,-9.36 7.78,-9.36 0.3,0 0.48,0.14 0.48,0.5 z"
+                   inkscape:connector-curvature="0"
+                   style="fill:#000000;stroke-width:0" /><path
+                   id="path2083"
+                   d="m 565.28,434.54 -0.01,0.35 -0.02,0.35 -0.04,0.33 -0.06,0.34 -0.07,0.33 -0.08,0.32 -0.1,0.32 -0.11,0.31 -0.13,0.3 -0.14,0.29 -0.15,0.29 -0.17,0.27 -0.18,0.27 -0.19,0.26 -0.21,0.25 -0.21,0.24 -0.23,0.22 -0.24,0.22 -0.25,0.2 -0.27,0.2 -0.27,0.17 -0.28,0.17 -0.3,0.15 -0.3,0.14 -0.31,0.12 -0.33,0.11 -0.33,0.09 -0.34,0.08 -0.35,0.06 -0.36,0.05 -0.36,0.02 -0.38,0.01 c -2.89,0 -4.28,-0.8 -6.03,-2.09 -2.73,-1.99 -5.48,-6.83 -6.42,-10.61 l -7.92,-31.64 c -0.07,-0.19 0.18,-0.5 0.59,-0.5 0.39,0 0.55,0.11 0.59,0.25 l 3.49,13.75 c 0.95,-2.99 3.14,-4.83 6.78,-4.83 l -0.16,1.09 c -3.78,0 -5.67,2.89 -5.67,6.44 0,0.48 0,1.23 0.25,2.19 l 3.19,12.61 c 1.09,4.28 4.69,12.2 10.65,12.2 2.9,0 4.65,-1.55 4.65,-4.53 v 0 c 0,-3.5 -1.9,-7.08 -4.49,-8.63 -1.34,0.5 -2.34,0.6 -3.84,0.6 -1.05,0 -3.83,0.04 -3.83,-1.6 -0.05,-1.39 2.53,-1.23 3.44,-1.23 l 0.14,1.09 c -0.69,0 -1.69,-0.06 -2.19,0.19 0.11,0.5 1.89,0.41 2.44,0.41 1.05,0 1.5,0 2.14,-0.25 v 0 c -0.64,-0.25 -1.19,-0.35 -2.39,-0.35 l -0.14,-1.09 c 1.84,0 2.59,0.05 4.07,0.64 1.9,-1.8 2.15,-3.34 2.21,-5.62 0.09,-2.9 -1.11,-6.63 -2.5,-8.58 -1.94,-2.69 -5.28,-4.49 -8.13,-4.49 l 0.16,-1.09 c 3.64,0 7.38,1.75 9.61,3.94 2.39,2.29 4,5.48 4,9.17 0,3.58 -1.85,6.17 -3.64,7.42 2.89,1.64 5.72,4.73 5.72,8.31 z"
+                   inkscape:connector-curvature="0"
+                   style="fill:#000000;stroke-width:0" /><path
+                   id="path2085"
+                   d="m 581.87,418.65 v 0.37 l -0.01,0.39 -0.01,0.39 -0.01,0.41 -0.04,0.84 -0.06,0.88 -0.08,0.92 -0.11,0.95 -0.13,0.97 -0.17,1.01 -0.19,1.02 -0.23,1.03 -0.27,1.05 -0.31,1.06 -0.35,1.07 -0.39,1.07 -0.21,0.53 -0.23,0.53 -0.23,0.53 -0.25,0.53 c -2.99,6.12 -7.27,9.36 -7.77,9.36 -0.3,0 -0.5,-0.19 -0.5,-0.49 0,-0.15 0,-0.25 0.94,-1.15 4.89,-4.92 7.73,-12.85 7.73,-23.27 0,-8.51 -1.84,-17.28 -8.03,-23.56 -0.64,-0.59 -0.64,-0.7 -0.64,-0.84 0,-0.3 0.2,-0.5 0.5,-0.5 0.5,0 4.97,3.39 7.92,9.71 2.53,5.47 3.13,11 3.13,15.19 z"
+                   inkscape:connector-curvature="0"
+                   style="fill:#000000;stroke-width:0" /></g>            </g>
+          </g>
+        </g>
+      </g>
+      <g
+         transform="translate(99.251096,-26.478999)"
+         id="g3003">
+        <rect
+           transform="scale(-1,1)"
+           y="-98.096619"
+           x="-469.5542"
+           height="22.539835"
+           width="38.809792"
+           id="rect3890-67-7-6-1-0-6"
+           style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+        <g
+           id="g2245"
+           transform="matrix(2.0078309,0,0,2.0078309,363.46747,-284.59394)">
+          <g
+             word-spacing="normal"
+             letter-spacing="normal"
+             font-size-adjust="none"
+             font-stretch="normal"
+             font-weight="normal"
+             font-variant="normal"
+             font-style="normal"
+             stroke-miterlimit="10.433"
+             xml:space="preserve"
+             transform="matrix(0.125,0,0,-0.125,-21.875,150.69858)"
+             id="g2243"
+             style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;letter-spacing:normal;word-spacing:normal;text-anchor:start;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10.43299961;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"><path
+               id="path2233"
+               d="m 481.38,423.14 0.47,0.11 0.48,0.12 0.48,0.14 0.48,0.15 0.49,0.16 0.48,0.18 0.48,0.19 0.47,0.2 0.47,0.22 0.47,0.23 0.46,0.24 0.45,0.25 0.43,0.27 0.43,0.28 0.42,0.29 0.4,0.3 0.39,0.31 0.37,0.32 0.36,0.34 0.33,0.35 0.32,0.35 0.29,0.37 0.28,0.38 0.25,0.39 0.22,0.4 0.2,0.41 0.17,0.42 0.15,0.43 0.11,0.44 0.08,0.45 0.05,0.46 0.02,0.47 c 0,4.28 -4.48,7.47 -11,7.47 h -14.2 c -1,0 -1.45,0 -1.45,-1 0,-0.55 0.45,-0.55 1.4,-0.55 0.1,0 1.05,0 1.89,-0.09 0.89,-0.11 1.35,-0.16 1.35,-0.8 0,-0.2 -0.05,-0.36 -0.21,-0.95 l -6.67,-26.75 c -0.5,-1.95 -0.59,-2.34 -4.53,-2.34 -0.91,0 -1.34,0 -1.34,-1 0,-0.55 0.59,-0.55 0.68,-0.55 1.41,0 4.89,0.16 6.29,0.16 1.39,0 4.93,-0.16 6.32,-0.16 0.41,0 1,0 1,1 0,0.55 -0.45,0.55 -1.39,0.55 -1.84,0 -3.25,0 -3.25,0.89 0,0.29 0.11,0.54 0.16,0.84 l 3.28,13.2 h 5.94 l -0.05,1.11 h -5.59 l 3.25,13 c 0.29,1.19 0.43,1.69 1.39,1.85 0.45,0.04 2.04,0.04 3.03,0.04 3.55,0 9.08,0 9.08,-4.93 0,-1.69 -0.8,-5.13 -2.75,-7.07 -1.28,-1.29 -3.92,-2.89 -8.41,-2.89 l 0.05,-1.11 c 4.53,0 5.42,-2.78 5.42,-4.53 0,-0.75 -0.39,-2.28 -0.69,-3.44 -0.36,-1.39 -0.79,-3.23 -0.79,-4.23 0,-5.37 5.96,-5.37 6.62,-5.37 4.23,0 5.97,5.03 5.97,5.73 0,0.59 -0.55,0.59 -0.59,0.59 -0.46,0 -0.55,-0.36 -0.65,-0.7 -1.25,-3.69 -3.39,-4.53 -4.54,-4.53 -1.64,0 -1.99,1.09 -1.99,3.05 0,1.53 0.3,4.07 0.5,5.67 0.1,0.7 0.21,1.64 0.21,2.34 0,3.83 -3.35,5.38 -4.69,5.88 z"
+               inkscape:connector-curvature="0"
+               style="fill:#000000;stroke-width:0" /><path
+               id="path2235"
+               d="m 512.7,411.9 v 0.02 l 0.01,0.03 v 0.02 l 0.01,0.02 0.01,0.02 v 0.02 l 0.01,0.04 0.01,0.03 0.01,0.03 0.01,0.04 0.01,0.03 v 0.02 l 0.01,0.03 0.01,0.03 v 0.02 l 0.01,0.02 v 0.02 0.02 l 0.01,0.02 v 0.02 0.02 l 0.01,0.02 v 0.02 0.03 0.03 l 0.01,0.04 v 0.03 0.02 0.02 0.02 0.02 c 0,0.69 -0.57,1.11 -1.16,1.11 -0.38,0 -1.05,-0.17 -1.42,-0.83 -0.11,-0.22 -0.39,-1.33 -0.56,-2.03 l -0.74,-2.89 c -0.2,-0.83 -1.28,-5.22 -1.39,-5.61 -0.03,0 -1.56,-3.03 -4.28,-3.03 -2.38,0 -2.38,2.26 -2.38,2.89 0,1.89 0.8,4.08 1.85,6.76 0.42,1.11 0.59,1.53 0.59,2.13 0,1.67 -1.42,2.95 -3.31,2.95 -3.52,0 -5.08,-4.73 -5.08,-5.33 0,-0.45 0.49,-0.45 0.59,-0.45 0.49,0 0.52,0.17 0.63,0.56 0.87,2.89 2.37,4.25 3.77,4.25 0.59,0 0.85,-0.39 0.85,-1.22 0,-0.79 -0.31,-1.56 -0.48,-2.01 -1.67,-4.25 -2.02,-5.55 -2.02,-7.08 0,-0.59 0,-2.23 1.36,-3.34 1.08,-0.91 2.55,-1.08 3.49,-1.08 1.39,0 2.64,0.51 3.8,1.56 -0.46,-1.92 -0.85,-3.37 -2.3,-5.12 -0.94,-1.08 -2.35,-2.22 -4.19,-2.22 -0.23,0 -1.87,0 -2.61,1.14 1.88,0.2 1.88,1.89 1.88,1.92 0,1.11 -1,1.31 -1.36,1.31 -0.86,0 -2.02,-0.69 -2.02,-2.3 0,-1.76 1.67,-3.06 4.14,-3.06 3.53,0 7.81,2.72 8.89,7.08 z"
+               inkscape:connector-curvature="0"
+               style="fill:#000000;stroke-width:0" /><path
+               id="path2237"
+               d="m 533.8,394.25 v 0.02 0.03 0.01 0.02 0.01 l -0.01,0.02 v 0.01 l -0.01,0.02 -0.01,0.02 -0.01,0.02 -0.01,0.02 -0.02,0.03 -0.01,0.02 -0.02,0.03 -0.02,0.03 -0.03,0.03 -0.02,0.03 -0.03,0.04 -0.02,0.02 -0.01,0.02 -0.02,0.02 -0.02,0.02 -0.02,0.02 -0.02,0.03 -0.02,0.02 -0.02,0.02 -0.02,0.03 -0.03,0.02 -0.02,0.03 -0.03,0.03 -0.02,0.03 -0.03,0.03 -0.03,0.03 -0.03,0.03 -0.03,0.03 -0.03,0.03 -0.04,0.04 -0.03,0.03 -0.04,0.04 -0.03,0.03 -0.04,0.04 -0.04,0.04 c -6.22,6.28 -7.81,15.69 -7.81,23.31 0,8.67 1.89,17.35 8.01,23.56 0.64,0.61 0.64,0.71 0.64,0.86 0,0.35 -0.18,0.49 -0.48,0.49 -0.5,0 -4.98,-3.38 -7.92,-9.7 -2.55,-5.49 -3.14,-11.02 -3.14,-15.21 0,-3.89 0.54,-9.9 3.28,-15.54 2.98,-6.13 7.28,-9.36 7.78,-9.36 0.3,0 0.48,0.14 0.48,0.5 z"
+               inkscape:connector-curvature="0"
+               style="fill:#000000;stroke-width:0" /><path
+               id="path2239"
+               d="m 560.4,417.96 v 0.37 l -0.01,0.35 -0.02,0.35 -0.02,0.34 -0.07,0.65 -0.08,0.63 -0.12,0.59 -0.13,0.57 -0.16,0.54 -0.17,0.51 -0.19,0.49 -0.22,0.45 -0.23,0.44 -0.24,0.4 -0.26,0.38 -0.27,0.36 -0.29,0.33 -0.3,0.31 -0.31,0.29 -0.32,0.26 -0.32,0.24 -0.34,0.22 -0.34,0.2 -0.35,0.18 -0.35,0.16 -0.36,0.14 -0.36,0.12 -0.36,0.11 -0.36,0.09 -0.36,0.06 -0.36,0.06 -0.35,0.04 -0.36,0.02 h -0.35 l -0.04,-1.09 c 4.94,0 4.94,-6.53 4.94,-10.41 0,-1.84 0,-4.73 0.09,-5.57 v 0 c -4.38,-3.85 -8.22,-4.39 -10.21,-4.39 -3,0 -4.48,2.25 -4.48,5.43 0,2.44 1.3,7.82 2.89,10.36 2.33,3.64 5.03,4.58 6.77,4.58 l 0.04,1.09 c -6.81,0 -13.39,-7.12 -13.39,-14.14 0,-4.64 2.99,-8.42 8.07,-8.42 3.14,0 6.73,1.14 10.51,4.19 0.66,-2.64 2.3,-4.19 4.53,-4.19 2.64,0 4.19,2.74 4.19,3.53 0,0.36 -0.3,0.5 -0.59,0.5 -0.36,0 -0.5,-0.14 -0.66,-0.5 -0.89,-2.43 -2.69,-2.43 -2.78,-2.43 -1.55,0 -1.55,3.89 -1.55,5.07 0,1.05 0,1.16 0.5,1.75 4.69,5.88 5.74,11.66 5.74,11.71 0,0.11 -0.07,0.5 -0.61,0.5 -0.5,0 -0.5,-0.14 -0.75,-1.05 -0.89,-3.14 -2.53,-6.92 -4.88,-9.86 z"
+               inkscape:connector-curvature="0"
+               style="fill:#000000;stroke-width:0" /><path
+               id="path2241"
+               d="m 583.18,418.65 v 0.37 0.39 l -0.01,0.39 -0.01,0.41 -0.04,0.84 -0.06,0.88 -0.09,0.92 -0.1,0.95 -0.14,0.97 -0.16,1.01 -0.2,1.02 -0.23,1.03 -0.26,1.05 -0.31,1.06 -0.35,1.07 -0.39,1.07 -0.22,0.53 -0.22,0.53 -0.24,0.53 -0.25,0.53 c -2.98,6.12 -7.26,9.36 -7.76,9.36 -0.3,0 -0.5,-0.19 -0.5,-0.49 0,-0.15 0,-0.25 0.93,-1.15 4.9,-4.92 7.74,-12.85 7.74,-23.27 0,-8.51 -1.84,-17.28 -8.03,-23.56 -0.64,-0.59 -0.64,-0.7 -0.64,-0.84 0,-0.3 0.2,-0.5 0.5,-0.5 0.5,0 4.96,3.39 7.92,9.71 2.53,5.47 3.12,11 3.12,15.19 z"
+               inkscape:connector-curvature="0"
+               style="fill:#000000;stroke-width:0" /></g>        </g>
+      </g>
+      <g
+         id="g3087">
+        <g
+           id="g2904"
+           transform="translate(0,-6.3735962e-6)">
+          <rect
+             style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:0.84808445;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+             id="rect3890-67-7-6-1"
+             width="22.792269"
+             height="22.792269"
+             x="-406.96127"
+             y="-154.32683"
+             transform="scale(-1,1)" />
+          <g
+             transform="matrix(2.4747944,0,0,2.4747944,302.5469,-384.95743)"
+             id="g2378">
+            <g
+               style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;letter-spacing:normal;word-spacing:normal;text-anchor:start;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10.43299961;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+               id="g2376"
+               transform="matrix(0.125,0,0,-0.125,-21.875,150.69858)"
+               xml:space="preserve"
+               stroke-miterlimit="10.433"
+               font-style="normal"
+               font-variant="normal"
+               font-weight="normal"
+               font-stretch="normal"
+               font-size-adjust="none"
+               letter-spacing="normal"
+               word-spacing="normal"><path
+                 style="fill:#000000;stroke-width:0"
+                 inkscape:connector-curvature="0"
+                 d="m 493.38,440.82 v 0.02 0.02 0.01 l -0.01,0.02 v 0.02 0.02 l -0.01,0.02 v 0.02 l -0.01,0.02 -0.01,0.02 -0.01,0.02 v 0.02 l -0.02,0.02 -0.01,0.02 -0.01,0.02 -0.01,0.02 -0.02,0.02 -0.02,0.02 -0.02,0.02 -0.02,0.02 -0.02,0.01 -0.02,0.02 -0.03,0.01 -0.02,0.02 -0.03,0.01 -0.01,0.01 h -0.02 l -0.01,0.01 h -0.02 l -0.02,0.01 h -0.01 -0.02 l -0.02,0.01 h -0.02 -0.02 -0.02 -0.02 -0.02 -0.02 c -0.14,0 -0.2,-0.04 -0.75,-0.59 l -3.48,-3.84 c -0.44,0.7 -2.74,4.43 -8.27,4.43 -11.11,0 -22.33,-11.01 -22.33,-22.56 0,-8.23 5.89,-13.65 13.52,-13.65 4.33,0 8.11,1.98 10.75,4.28 4.64,4.09 5.48,8.62 5.48,8.76 0,0.5 -0.5,0.5 -0.59,0.5 -0.3,0 -0.55,-0.09 -0.66,-0.5 -0.43,-1.44 -1.59,-4.98 -5.03,-7.87 -3.43,-2.78 -6.58,-3.63 -9.15,-3.63 -4.49,0 -9.77,2.6 -9.77,10.36 0,2.85 1.05,10.91 6.02,16.74 3.04,3.54 7.73,6.03 12.15,6.03 5.1,0 8.03,-3.83 8.03,-9.61 0,-2 -0.15,-2.05 -0.15,-2.55 0,-0.5 0.54,-0.5 0.75,-0.5 0.64,0 0.64,0.11 0.89,1 z"
+                 id="path2374" /></g>          </g>
+        </g>
+        <g
+           id="g2910"
+           transform="translate(0,8.8851929e-6)">
+          <rect
+             style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:0.84808445;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+             id="rect3890-67-7-6"
+             width="22.792269"
+             height="22.792269"
+             x="-406.96127"
+             y="-124.70184"
+             transform="scale(-1,1)" />
+          <g
+             transform="matrix(2.4747944,0,0,2.4747944,302.28086,-355.33245)"
+             id="g2510">
+            <g
+               style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;letter-spacing:normal;word-spacing:normal;text-anchor:start;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10.43299961;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+               id="g2508"
+               transform="matrix(0.125,0,0,-0.125,-21.875,150.69858)"
+               xml:space="preserve"
+               stroke-miterlimit="10.433"
+               font-style="normal"
+               font-variant="normal"
+               font-weight="normal"
+               font-stretch="normal"
+               font-size-adjust="none"
+               letter-spacing="normal"
+               word-spacing="normal"><path
+                 style="fill:#000000;stroke-width:0"
+                 inkscape:connector-curvature="0"
+                 d="m 463.44,410.09 -0.04,-0.18 -0.05,-0.17 -0.04,-0.16 -0.05,-0.15 -0.04,-0.15 -0.05,-0.13 -0.04,-0.13 -0.05,-0.12 -0.06,-0.11 -0.06,-0.11 -0.06,-0.1 -0.07,-0.09 -0.08,-0.09 -0.09,-0.07 -0.09,-0.08 -0.11,-0.06 -0.11,-0.07 -0.12,-0.05 -0.14,-0.05 -0.15,-0.05 -0.16,-0.04 -0.09,-0.02 -0.08,-0.01 -0.1,-0.02 -0.1,-0.02 -0.1,-0.01 -0.1,-0.01 -0.11,-0.01 -0.11,-0.02 -0.12,-0.01 -0.12,-0.01 h -0.13 l -0.13,-0.01 -0.13,-0.01 h -0.15 l -0.14,-0.01 h -0.15 l -0.16,-0.01 h -0.16 -0.16 -0.17 -0.18 -0.18 c -0.84,0 -1.39,0 -1.39,-0.96 0,-0.59 0.44,-0.59 1.39,-0.59 h 16.48 l -0.89,1.55 h -5.62 c -0.7,0 -0.8,0 -1.11,0.04 -0.48,0.05 -0.64,0.1 -0.64,0.5 0,0.14 0,0.25 0.25,1.14 l 6.83,27.36 c 0.43,1.74 0.54,1.89 2.68,1.89 h 5.33 c 4.89,0 9.02,-2.64 9.02,-9.22 0,-2.43 -1,-10.6 -5.24,-16.09 -1.43,-1.84 -5.37,-5.62 -11.5,-5.62 l 0.89,-1.55 c 10.36,0 20.19,10.51 20.19,21.42 0,7.03 -4.23,12.61 -11.72,12.61 h -16.73 c -0.95,0 -1.5,0 -1.5,-0.95 0,-0.6 0.45,-0.6 1.45,-0.6 0.64,0 1.55,-0.04 2.14,-0.09 0.8,-0.11 1.1,-0.25 1.1,-0.8 0,-0.2 -0.05,-0.36 -0.21,-0.95 z"
+                 id="path2506" /></g>          </g>
+        </g>
+      </g>
+      <g
+         transform="translate(-1.7047761)"
+         id="g3075">
+        <circle
+           id="path4181-6-7-6-6-6"
+           style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+           cx="429.66519"
+           cy="142.93069"
+           r="9.1789093"
+           transform="scale(1,-1)" />
+        <circle
+           id="path4179-9-2-0-0-5-2"
+           style="fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:0.54598999;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+           cx="429.66516"
+           cy="113.3057"
+           r="2.4853103"
+           transform="scale(1,-1)" />
+        <path
+           inkscape:connector-curvature="0"
+           inkscape:original-d="M 270.16665,257.87321 V 219.70728"
+           inkscape:path-effect="#path-effect4185-9-9-2-3-3-9"
+           id="path4183-9-1-9-6-3-1"
+           d="M 270.16665,257.87321 V 219.70728"
+           style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+           transform="matrix(1,0,0,-1,159.4985,106.00374)" />
+      </g>
+      <g
+         id="g3039">
+        <g
+           id="g2898"
+           transform="translate(95.959221,-54.203101)">
+          <rect
+             style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:0.84808445;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+             id="rect3890-67-7-6-2"
+             width="22.792269"
+             height="22.792269"
+             x="-537.71259"
+             y="-70.498734"
+             transform="scale(-1,1)" />
+          <g
+             transform="matrix(2.4747944,0,0,2.4747944,433.38793,-301.12934)"
+             id="g2783">
+            <g
+               style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;letter-spacing:normal;word-spacing:normal;text-anchor:start;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10.43299961;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+               id="g2781"
+               transform="matrix(0.125,0,0,-0.125,-21.875,150.69858)"
+               xml:space="preserve"
+               stroke-miterlimit="10.433"
+               font-style="normal"
+               font-variant="normal"
+               font-weight="normal"
+               font-stretch="normal"
+               font-size-adjust="none"
+               letter-spacing="normal"
+               word-spacing="normal"><path
+                 style="fill:#000000;stroke-width:0"
+                 inkscape:connector-curvature="0"
+                 d="m 463.49,410.09 -0.05,-0.18 -0.04,-0.17 -0.05,-0.16 -0.04,-0.15 -0.04,-0.15 -0.05,-0.13 -0.05,-0.13 -0.05,-0.12 -0.05,-0.11 -0.06,-0.11 -0.07,-0.1 -0.07,-0.09 -0.07,-0.09 -0.09,-0.07 -0.09,-0.08 -0.11,-0.06 -0.11,-0.07 -0.13,-0.05 -0.13,-0.05 -0.15,-0.05 -0.16,-0.04 -0.09,-0.02 -0.09,-0.01 -0.09,-0.02 -0.1,-0.02 -0.1,-0.01 -0.1,-0.01 -0.11,-0.01 -0.12,-0.02 -0.11,-0.01 -0.13,-0.01 h -0.12 l -0.13,-0.01 -0.14,-0.01 h -0.14 l -0.14,-0.01 h -0.15 l -0.16,-0.01 h -0.16 -0.16 -0.17 -0.18 -0.18 c -0.85,0 -1.35,0 -1.35,-1 0,-0.55 0.46,-0.55 1.35,-0.55 h 17.78 c 7.87,0 13.75,5.87 13.75,10.76 0,3.58 -2.89,6.47 -7.72,7.02 5.19,0.95 10.42,4.64 10.42,9.38 0,3.68 -3.3,6.87 -9.28,6.87 l -0.69,-1.55 c 4.38,0 5.42,-2.93 5.42,-5.12 0,-4.39 -4.28,-9.13 -10.35,-9.13 h -7.27 l -0.3,-1.09 h 9.41 c 4.78,0 5.73,-3.69 5.73,-5.83 0,-4.94 -4.43,-9.76 -10.31,-9.76 h -6.78 c -0.69,0 -0.8,0 -1.09,0.04 -0.5,0.05 -0.64,0.1 -0.64,0.5 0,0.14 0,0.25 0.25,1.14 l 3.43,13.91 0.3,1.09 3.08,12.36 c 0.45,1.74 0.54,1.89 2.7,1.89 h 6.42 l 0.69,1.55 h -16.73 c -0.94,0 -1.44,0 -1.44,-1 0,-0.55 0.44,-0.55 1.39,-0.55 0.09,0 1.05,0 1.89,-0.09 0.89,-0.11 1.34,-0.16 1.34,-0.8 0,-0.2 -0.04,-0.36 -0.2,-0.95 z"
+                 id="path2779" /></g>          </g>
+        </g>
+        <g
+           id="g2892"
+           transform="translate(95.390984,-53.040404)">
+          <rect
+             style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:0.84808445;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+             id="rect3890-67-7-6-1-0"
+             width="22.792269"
+             height="22.792269"
+             x="-538.28082"
+             y="-101.28643"
+             transform="scale(-1,1)" />
+          <g
+             transform="matrix(2.4747944,0,0,2.4747944,434.27943,-331.66337)"
+             id="g2645">
+            <g
+               style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;letter-spacing:normal;word-spacing:normal;text-anchor:start;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10.43299961;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+               id="g2643"
+               transform="matrix(0.125,0,0,-0.125,-21.875,150.69858)"
+               xml:space="preserve"
+               stroke-miterlimit="10.433"
+               font-style="normal"
+               font-variant="normal"
+               font-weight="normal"
+               font-stretch="normal"
+               font-size-adjust="none"
+               letter-spacing="normal"
+               word-spacing="normal"><path
+                 style="fill:#000000;stroke-width:0"
+                 inkscape:connector-curvature="0"
+                 d="m 464.44,411.93 -0.19,-0.3 -0.18,-0.29 -0.19,-0.28 -0.19,-0.26 -0.18,-0.25 -0.19,-0.23 -0.19,-0.22 -0.18,-0.21 -0.19,-0.2 -0.19,-0.18 -0.18,-0.17 -0.19,-0.16 -0.19,-0.15 -0.18,-0.14 -0.19,-0.13 -0.19,-0.12 -0.19,-0.11 -0.19,-0.1 -0.19,-0.09 -0.19,-0.09 -0.19,-0.07 -0.2,-0.07 -0.19,-0.07 -0.2,-0.05 -0.19,-0.05 -0.2,-0.04 -0.2,-0.04 -0.19,-0.03 -0.41,-0.05 -0.4,-0.03 c -0.61,-0.05 -1.05,-0.05 -1.05,-1 0,-0.3 0.25,-0.55 0.64,-0.55 1.34,0 2.89,0.16 4.28,0.16 1.64,0 3.39,-0.16 4.99,-0.16 0.29,0 0.95,0 0.95,0.95 0,0.55 -0.45,0.6 -0.8,0.6 -1.15,0.09 -2.34,0.5 -2.34,1.73 0,0.61 0.3,1.16 0.69,1.84 l 3.79,6.39 h 12.5 l -0.14,1.54 h -11.42 l 9.83,16.45 1.59,-16.45 0.14,-1.54 c 0.11,-1.04 0.8,-7.82 0.8,-8.32 0,-1.5 -2.59,-1.64 -3.58,-1.64 -0.7,0 -1.2,0 -1.2,-1 0,-0.55 0.59,-0.55 0.7,-0.55 2.03,0 4.19,0.16 6.22,0.16 1.25,0 4.39,-0.16 5.64,-0.16 0.3,0 0.89,0 0.89,1 0,0.55 -0.5,0.55 -1.14,0.55 -3.09,0 -3.09,0.34 -3.25,1.79 l -3.03,31.13 c -0.11,1 -0.11,1.2 -0.95,1.2 -0.8,0 -0.99,-0.34 -1.3,-0.84 z"
+                 id="path2641" /></g>          </g>
+        </g>
+      </g>
+      <g
+         transform="translate(-0.47849584)"
+         id="g3044">
+        <circle
+           id="path4181-6-7-6-6-6-7"
+           style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+           cx="590.35889"
+           cy="142.93069"
+           r="9.1789093"
+           transform="scale(1,-1)" />
+        <circle
+           id="path4179-9-2-0-0-5-2-4"
+           style="fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:0.54598999;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+           cx="590.35883"
+           cy="113.3057"
+           r="2.4853103"
+           transform="scale(1,-1)" />
+        <path
+           inkscape:connector-curvature="0"
+           inkscape:original-d="M 270.16665,257.87321 V 219.70728"
+           inkscape:path-effect="#path-effect4185-9-9-2-3-3-9-4"
+           id="path4183-9-1-9-6-3-1-8"
+           d="M 270.16665,257.87321 V 219.70728"
+           style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+           transform="matrix(1,0,0,-1,320.19217,106.2266)" />
+      </g>
+    </g>
+  </g>
+</svg>
diff --git a/doc/releases/changelog-dev.md b/doc/releases/changelog-dev.md
index 0b819368a..f89b319c5 100644
--- a/doc/releases/changelog-dev.md
+++ b/doc/releases/changelog-dev.md
@@ -4,6 +4,42 @@
 
 <h3>New features since last release</h3>
 
+* Arbitrary two-qubit unitaries can now be decomposed into elementary gates. This
+  functionality has been incorporated into the `qml.transforms.unitary_to_rot` transform, and is
+  available separately as `qml.transforms.two_qubit_decomposition`.
+  [(#1552)](https://github.com/PennyLaneAI/pennylane/pull/1552)
+
+  As an example, consider the following randomly-generated matrix and circuit that uses it:
+
+  ```python
+  U = np.array([
+      [-0.03053706-0.03662692j,  0.01313778+0.38162226j, 0.4101526 -0.81893687j, -0.03864617+0.10743148j],
+      [-0.17171136-0.24851809j,  0.06046239+0.1929145j, -0.04813084-0.01748555j, -0.29544883-0.88202604j],
+      [ 0.39634931-0.78959795j, -0.25521689-0.17045233j, -0.1391033 -0.09670952j, -0.25043606+0.18393466j],
+      [ 0.29599198-0.19573188j,  0.55605806+0.64025769j, 0.06140516+0.35499559j,  0.02674726+0.1563311j ]
+  ])
+
+  dev = qml.device('default.qubit', wires=2)
+
+  @qml.qnode(dev)
+  @qml.transforms.unitary_to_rot
+  def circuit(x, y):
+      qml.RX(x, wires=0)
+      qml.QubitUnitary(U, wires=[0, 1])
+      qml.RY(y, wires=0)
+      return qml.expval(qml.PauliZ(wires=0))
+  ```
+
+  If we run the circuit, we can see the new decomposition:
+
+  ```pycon
+  >>> circuit(0.3, 0.4)
+  tensor(-0.70520073, requires_grad=True)
+  >>> print(qml.draw(circuit)(0.3, 0.4))
+  0: ──RX(0.3)─────────────────Rot(-3.5, 0.242, 0.86)──╭X──RZ(0.176)───╭C─────────────╭X──Rot(5.56, 0.321, -2.09)───RY(0.4)──┤ ⟨Z⟩ 
+  1: ──Rot(-1.64, 2.69, 1.58)──────────────────────────╰C──RY(-0.883)──╰X──RY(-1.47)──╰C──Rot(-1.46, 0.337, 0.587)───────────┤
+  ```
+
 * The transform for the Jacobian of the classical preprocessing within a QNode,
   `qml.transforms.classical_jacobian`, now takes a keyword argument `argnum` to specify
   the QNode argument indices with respect to which the Jacobian is computed.
@@ -107,4 +143,4 @@
 
 This release contains contributions from (in alphabetical order):
 
-Josh Izaac, Christina Lee, David Wierichs.
\ No newline at end of file
+Olivia Di Matteo, Josh Izaac, Christina Lee, David Wierichs.
\ No newline at end of file
diff --git a/pennylane/ops/qubit/matrix_ops.py b/pennylane/ops/qubit/matrix_ops.py
index da4b560d5..f4f143f98 100644
--- a/pennylane/ops/qubit/matrix_ops.py
+++ b/pennylane/ops/qubit/matrix_ops.py
@@ -86,7 +86,14 @@ class QubitUnitary(Operation):
             decomp_ops = qml.transforms.decompositions.zyz_decomposition(U, wire)
             return decomp_ops
 
-        raise NotImplementedError("Decompositions only supported for single-qubit unitaries")
+        if qml.math.shape(U) == (4, 4):
+            wires = Wires(wires)
+            decomp_ops = qml.transforms.two_qubit_decomposition(U, wires)
+            return decomp_ops
+
+        raise NotImplementedError(
+            "Decompositions only supported for single- and two-qubit unitaries."
+        )
 
     def adjoint(self):
         return QubitUnitary(qml.math.T(qml.math.conj(self.matrix)), wires=self.wires)
diff --git a/pennylane/transforms/__init__.py b/pennylane/transforms/__init__.py
index f267b1396..39138b52a 100644
--- a/pennylane/transforms/__init__.py
+++ b/pennylane/transforms/__init__.py
@@ -71,6 +71,7 @@ both transforms, and decompositions within the larger PennyLane codebase.
     :toctree: api
 
     ~transforms.zyz_decomposition
+    ~transforms.two_qubit_decomposition
 
 Transforms that act on tapes
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
@@ -105,7 +106,7 @@ from .adjoint import adjoint
 from .classical_jacobian import classical_jacobian
 from .compile import compile
 from .control import ControlledOperation, ctrl
-from .decompositions import zyz_decomposition
+from .decompositions import zyz_decomposition, two_qubit_decomposition
 from .draw import draw
 from .hamiltonian_expand import hamiltonian_expand
 from .invisible import invisible
diff --git a/pennylane/transforms/decompositions/__init__.py b/pennylane/transforms/decompositions/__init__.py
index 8e771a31d..d074fe115 100644
--- a/pennylane/transforms/decompositions/__init__.py
+++ b/pennylane/transforms/decompositions/__init__.py
@@ -16,3 +16,4 @@ unitary operations into sequences of elementary operations.
 """
 
 from .single_qubit_unitary import zyz_decomposition
+from .two_qubit_unitary import two_qubit_decomposition
diff --git a/pennylane/transforms/decompositions/two_qubit_unitary.py b/pennylane/transforms/decompositions/two_qubit_unitary.py
new file mode 100644
index 000000000..52a22b775
--- /dev/null
+++ b/pennylane/transforms/decompositions/two_qubit_unitary.py
@@ -0,0 +1,625 @@
+# Copyright 2018-2021 Xanadu Quantum Technologies Inc.
+
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+
+#     http://www.apache.org/licenses/LICENSE-2.0
+
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+"""Contains transforms and helpers functions for decomposing arbitrary two-qubit
+unitary operations into elementary gates.
+"""
+import pennylane as qml
+from pennylane import numpy as np
+from pennylane import math
+
+from .single_qubit_unitary import zyz_decomposition
+
+
+###################################################################################
+# Developer notes:
+#
+# I was not able to get this transform to be fully differentiable for unitary
+# matrices that were constructed within a QNode, based on the QNode's input
+# arguments. I would argue this is a fairly limited use case, but it would still
+# be nice to have this eventually. Each interface fails for different reasons.
+#
+# - In Autograd, we obtain the AttributeError
+#       'ArrayBox' object has no attribute 'conjugate'
+#   for the 0-CNOT case when the zyz_decomposition function is called. In the
+#   other cases, it cannot autodifferentiate through the linalg.eigvals function.
+# - In Torch, it is not currently possible to autodiff through linalg.det for
+#   complex values.
+# - In Tensorflow, it sometimes works in limited cases (0, sometimes 1 CNOT), but
+#   for others it fails without output making it hard to pinpoint the cause.
+# - In JAX, we receive the TypeError:
+#       Can't differentiate w.r.t. type <class 'jaxlib.xla_extension.DeviceArray'>
+#
+###################################################################################
+
+
+# This gate E is called the "magic basis". It can be used to convert between
+# SO(4) and SU(2) x SU(2). For A in SO(4), E A E^\dag is in SU(2) x SU(2).
+E = np.array([[1, 1j, 0, 0], [0, 0, 1j, 1], [0, 0, 1j, -1], [1, -1j, 0, 0]]) / np.sqrt(2)
+Edag = E.conj().T
+
+# Helpful to have static copies of these since they are needed in a few places.
+CNOT01 = qml.CNOT(wires=[0, 1]).matrix
+CNOT10 = np.array([[1, 0, 0, 0], [0, 0, 0, 1], [0, 0, 1, 0], [0, 1, 0, 0]])
+SWAP = qml.SWAP(wires=[0, 1]).matrix
+
+# S \otimes SX
+S_SX = np.array(
+    [
+        [0.5 + 0.5j, 0.5 - 0.5j, 0.0 + 0.0j, 0.0 + 0.0j],
+        [0.5 - 0.5j, 0.5 + 0.5j, 0.0 + 0.0j, 0.0 + 0.0j],
+        [0.0 + 0.0j, 0.0 + 0.0j, -0.5 + 0.5j, 0.5 + 0.5j],
+        [0.0 + 0.0j, 0.0 + 0.0j, 0.5 + 0.5j, -0.5 + 0.5j],
+    ]
+)
+
+# Any two-qubit operation can be decomposed into single-qubit operations and
+# at most 3 CNOTs. The number of CNOTs needed affects the form of the decomposition,
+# so we separate the code into four cases.
+
+
+# This constant matrix is used in the 1-CNOT decomposition
+v_one_cnot = np.array(
+    [
+        [0.5, 0.5j, 0.5j, -0.5],
+        [-0.5j, 0.5, -0.5, -0.5j],
+        [-0.5j, -0.5, 0.5, -0.5j],
+        [0.5, -0.5j, -0.5j, -0.5],
+    ]
+)
+
+# This q is properly in SO(4) and is used in the 1-CNOT decomposition
+q_one_cnot = (1 / np.sqrt(2)) * np.array(
+    [[-1, 0, -1, 0], [0, 1, 0, 1], [0, 1, 0, -1], [1, 0, -1, 0]]
+)
+
+
+def _convert_to_su4(U):
+    r"""Check unitarity of a 4x4 matrix and convert it to :math:`SU(4)` if the determinant is not 1.
+
+    Args:
+        U (array[complex]): A matrix, presumed to be :math:`4 \times 4` and unitary.
+
+    Returns:
+        array[complex]: A :math:`4 \times 4` matrix in :math:`SU(4)` that is
+        equivalent to U up to a global phase.
+    """
+    # Check unitarity
+    if not math.allclose(math.dot(U, math.T(math.conj(U))), math.eye(4), atol=1e-7):
+        raise ValueError("Operator must be unitary.")
+
+    # Compute the determinant
+    det = math.linalg.det(U)
+
+    # Convert to SU(4) if it's not close to 1
+    if not math.allclose(det, 1.0):
+        exp_angle = -1j * math.cast_like(math.angle(det), 1j) / 4
+        U = math.cast_like(U, det) * math.exp(exp_angle)
+
+    return U
+
+
+def _compute_num_cnots(U):
+    r"""Compute the number of CNOTs required to implement a U in SU(4). This is based on
+    the trace of
+
+    .. math::
+
+        \gamma(U) = (E^\dag U E) (E^\dag U E)^T,
+
+    and follows the arguments of this paper: https://arxiv.org/abs/quant-ph/0308045.
+    """
+    u = math.dot(Edag, math.dot(U, E))
+    gammaU = math.dot(u, math.T(u))
+    trace = math.trace(gammaU)
+
+    # Case: 0 CNOTs (tensor product), the trace is +/- 4
+    # We need a tolerance of around 1e-7 here in order to work with the case where U
+    # is specified with 8 decimal places.
+    if math.allclose(trace, 4, atol=1e-7) or math.allclose(trace, -4, atol=1e-7):
+        return 0
+
+    # To distinguish between 1/2 CNOT cases, we need to look at the eigenvalues
+    evs = math.linalg.eigvals(gammaU)
+
+    if math.get_interface(u) == "torch":
+        sorted_evs, _ = math.sort(math.imag(evs))
+    else:
+        sorted_evs = math.sort(math.imag(evs))
+
+    # Case: 1 CNOT, the trace is 0, and the eigenvalues of gammaU are [-1j, -1j, 1j, 1j]
+    # Checking the eigenvalues is needed because of some special 2-CNOT cases that yield
+    # a trace 0.
+    if math.allclose(trace, 0j, atol=1e-7) and math.allclose(sorted_evs, [-1, -1, 1, 1]):
+        return 1
+
+    # Case: 2 CNOTs, the trace has only a real part (or is 0)
+    if math.allclose(math.imag(trace), 0.0, atol=1e-7):
+        return 2
+
+    # For the case with 3 CNOTs, the trace is a non-zero complex number
+    # with both real and imaginary parts.
+    return 3
+
+
+def _su2su2_to_tensor_products(U):
+    r"""Given a matrix :math:`U = A \otimes B` in SU(2) x SU(2), extract the two SU(2)
+    operations A and B.
+
+    This process has been described in detail in the Appendix of Coffey & Deiotte
+    https://link.springer.com/article/10.1007/s11128-009-0156-3
+    """
+
+    # First, write A = [[a1, a2], [-a2*, a1*]], which we can do for any SU(2) element.
+    # Then, A \otimes B = [[a1 B, a2 B], [-a2*B, a1*B]] = [[C1, C2], [C3, C4]]
+    # where the Ci are 2x2 matrices.
+    C1 = U[0:2, 0:2]
+    C2 = U[0:2, 2:4]
+    C3 = U[2:4, 0:2]
+    C4 = U[2:4, 2:4]
+
+    # From the definition of A \otimes B, C1 C4^\dag = a1^2 I, so we can extract a1
+    C14 = math.dot(C1, math.conj(math.T(C4)))
+    a1 = math.sqrt(math.cast_like(C14[0, 0], 1j))
+
+    # Similarly, -C2 C3^\dag = a2^2 I, so we can extract a2
+    C23 = math.dot(C2, math.conj(math.T(C3)))
+    a2 = math.sqrt(-math.cast_like(C23[0, 0], 1j))
+
+    # This gets us a1, a2 up to a sign. To resolve the sign, ensure that
+    # C1 C2^dag = a1 a2* I
+    C12 = math.dot(C1, math.conj(math.T(C2)))
+
+    if not math.allclose(a1 * math.conj(a2), C12[0, 0]):
+        a2 *= -1
+
+    # Construct A
+    A = math.stack([[a1, a2], [-math.conj(a2), math.conj(a1)]])
+
+    # Next, extract B. Can do from any of the C, just need to be careful in
+    # case one of the elements of A is 0.
+    if not math.allclose(A[0, 0], 0.0, atol=1e-6):
+        B = C1 / math.cast_like(A[0, 0], 1j)
+    else:
+        B = C2 / math.cast_like(A[0, 1], 1j)
+
+    return math.convert_like(A, U), math.convert_like(B, U)
+
+
+def _extract_su2su2_prefactors(U, V):
+    r"""This function is used for the case of 2 CNOTs and 3 CNOTs. It does something
+    similar as the 1-CNOT case, but there is no special form for one of the
+    SO(4) operations.
+
+    Suppose U, V are SU(4) matrices for which there exists A, B, C, D such that
+    (A \otimes B) V (C \otimes D) = U. The problem is to find A, B, C, D in SU(2)
+    in an analytic and fully differentiable manner.
+
+    This decomposition is possible when U and V are in the same double coset of
+    SU(4), meaning there exists G, H in SO(4) s.t. G (Edag V E) H = (Edag U
+    E). This is guaranteed here by how V was constructed in both the
+    _decomposition_2_cnots and _decomposition_3_cnots methods.
+
+    Then, we can use the fact that E SO(4) Edag gives us something in SU(2) x
+    SU(2) to give A, B, C, D.
+    """
+
+    # A lot of the work here happens in the magic basis. Essentially, we
+    # don't look explicitly at some U = G V H, but rather at
+    #     E^\dagger U E = G E^\dagger V E H
+    # so that we can recover
+    #     U = (E G E^\dagger) V (E H E^\dagger) = (A \otimes B) V (C \otimes D).
+    # There is some math in the paper explaining how when we define U in this way,
+    # we can simultaneously diagonalize functions of U and V to ensure they are
+    # in the same coset and recover the decomposition.
+    u = math.dot(math.cast_like(Edag, V), math.dot(U, math.cast_like(E, V)))
+    v = math.dot(math.cast_like(Edag, V), math.dot(V, math.cast_like(E, V)))
+
+    uuT = math.dot(u, math.T(u))
+    vvT = math.dot(v, math.T(v))
+
+    # Get the p and q in SO(4) that diagonalize uuT and vvT respectively (and
+    # their eigenvalues). We are looking for a simultaneous diagonalization,
+    # which we know exists because of how U and V were constructed. Furthermore,
+    # The way we will do this is by noting that, since uuT/vvT are complex and
+    # symmetric, so both their real and imaginary parts share a set of
+    # real-valued eigenvectors, which are also eigenvectors of uuT/vvT
+    # themselves. So we can use eigh, which orders the eigenvectors, and so we
+    # are guaranteed that the p and q returned will be "in the same order".
+    _, p = math.linalg.eigh(math.real(uuT) + math.imag(uuT))
+    _, q = math.linalg.eigh(math.real(vvT) + math.imag(vvT))
+
+    # If determinant of p/q is not 1, it is in O(4) but not SO(4), and has determinant
+    # We can transform it to SO(4) by simply negating one of the columns.
+    p = math.dot(p, math.diag([1, 1, 1, math.sign(math.linalg.det(p))]))
+    q = math.dot(q, math.diag([1, 1, 1, math.sign(math.linalg.det(q))]))
+
+    # Now, we should have p, q in SO(4) such that p^T u u^T p = q^T v v^T q.
+    # Then (v^\dag q p^T u)(v^\dag q p^T u)^T = I.
+    # So we can set G = p q^T, H = v^\dag q p^T u to obtain G v H = u.
+    G = math.dot(math.cast_like(p, 1j), math.T(q))
+    H = math.dot(math.conj(math.T(v)), math.dot(math.T(G), u))
+
+    # These are still in SO(4) though - we want to convert things into SU(2) x SU(2)
+    # so use the entangler. Since u = E^\dagger U E and v = E^\dagger V E where U, V
+    # are the target matrices, we can reshuffle as in the docstring above,
+    #     U = (E G E^\dagger) V (E H E^\dagger) = (A \otimes B) V (C \otimes D)
+    # where A, B, C, D are in SU(2) x SU(2).
+    AB = math.dot(math.cast_like(E, G), math.dot(G, math.cast_like(Edag, G)))
+    CD = math.dot(math.cast_like(E, H), math.dot(H, math.cast_like(Edag, H)))
+
+    # Now, we just need to extract the constituent tensor products.
+    A, B = _su2su2_to_tensor_products(AB)
+    C, D = _su2su2_to_tensor_products(CD)
+
+    return A, B, C, D
+
+
+def _decomposition_0_cnots(U, wires):
+    r"""If there are no CNOTs, this is just a tensor product of two single-qubit gates.
+    We can perform that decomposition directly:
+     -╭U- = -A-
+     -╰U- = -B-
+    """
+    A, B = _su2su2_to_tensor_products(U)
+    A_ops = zyz_decomposition(A, wires[0])
+    B_ops = zyz_decomposition(B, wires[1])
+    return A_ops + B_ops
+
+
+def _decomposition_1_cnot(U, wires):
+    r"""If there is just one CNOT, we can write the circuit in the form
+     -╭U- = -C--╭C--A-
+     -╰U- = -D--╰X--B-
+
+    To do this decomposition, first we find G, H in SO(4) such that
+        G (Edag V E) H = (Edag U E)
+
+    where V depends on the central CNOT gate, and both U, V are in SU(4). This
+    is done following the methods in https://arxiv.org/pdf/quant-ph/0308045.pdf.
+
+    Once we find G and H, we can use the fact that E SO(4) Edag gives us
+    something in SU(2) x SU(2) to give A, B, C, D.
+    """
+    # We will actually find a decomposition for the following circuit instead
+    # of the original U
+    # -╭U-╭SWAP- = -C--╭C-╭SWAP--B-
+    # -╰U-╰SWAP- = -D--╰X-╰SWAP--A-
+    # This ensures that the internal part of the decomposition has determinant 1.
+    swap_U = np.exp(1j * np.pi / 4) * math.dot(math.cast_like(SWAP, U), U)
+
+    # First let's compute gamma(u). For the one-CNOT case, uuT is always real.
+    u = math.dot(math.cast_like(Edag, U), math.dot(swap_U, math.cast_like(E, U)))
+    uuT = math.dot(u, math.T(u))
+
+    # Since uuT is real, we can use eigh of its real part. eigh also orders the
+    # eigenvalues in ascending order.
+    _, p = math.linalg.eigh(qml.math.real(uuT))
+
+    # Fix the determinant if necessary so that p is in SO(4)
+    p = math.dot(p, math.diag([1, 1, 1, math.sign(math.linalg.det(p))]))
+
+    # Now, we must find q such that p uu^T p^T = q vv^T q^T.
+    # For this case, our V = SWAP CNOT01 is constant. Thus, we can compute v,
+    # vvT, and its eigenvalues and eigenvectors directly. These matrices are stored
+    # above as the constants v_one_cnot and q_one_cnot.
+
+    # Once we have p and q properly in SO(4), we compute G and H in SO(4) such
+    # that U = G V H
+    G = math.dot(p, q_one_cnot.T)
+    H = math.dot(math.conj(math.T(v_one_cnot)), math.dot(math.T(G), u))
+
+    # We now use the magic basis to convert G, H to SU(2) x SU(2)
+    AB = math.dot(E, math.dot(G, Edag))
+    CD = math.dot(E, math.dot(H, Edag))
+
+    # Extract the tensor prodcts to SU(2) x SU(2)
+    A, B = _su2su2_to_tensor_products(AB)
+    C, D = _su2su2_to_tensor_products(CD)
+
+    # Recover the operators in the decomposition; note that because of the
+    # initial SWAP, we exchange the order of A and B
+    A_ops = zyz_decomposition(A, wires[1])
+    B_ops = zyz_decomposition(B, wires[0])
+    C_ops = zyz_decomposition(C, wires[0])
+    D_ops = zyz_decomposition(D, wires[1])
+
+    return C_ops + D_ops + [qml.CNOT(wires=wires)] + A_ops + B_ops
+
+
+def _decomposition_2_cnots(U, wires):
+    r"""If 2 CNOTs are required, we can write the circuit as
+     -╭U- = -A--╭X--RZ(d)--╭X--C-
+     -╰U- = -B--╰C--RX(p)--╰C--D-
+    We need to find the angles for the Z and X rotations such that the inner
+    part has the same spectrum as U, and then we can recover A, B, C, D.
+    """
+    # Compute the rotation angles
+    u = math.dot(Edag, math.dot(U, E))
+    gammaU = math.dot(u, math.T(u))
+    evs, _ = math.linalg.eig(gammaU)
+
+    # These choices are based on Proposition III.3 of
+    # https://arxiv.org/abs/quant-ph/0308045
+    # There is, however, a special case where the circuit has the form
+    # -╭U- = -A--╭C--╭X--C-
+    # -╰U- = -B--╰X--╰C--D-
+    #
+    # or some variant of this, where the two CNOTs are adjacent.
+    #
+    # What happens here is that the set of evs is -1, -1, 1, 1 and we can write
+    # -╭U- = -A--╭X--SZ--╭X--C-
+    # -╰U- = -B--╰C--SX--╰C--D-
+    # where SZ and SX are square roots of Z and X respectively. (This
+    # decomposition comes from using Hadamards to flip the direction of the
+    # first CNOT, and then decomposing them and merging single-qubit gates.) For
+    # some reason this case is not handled properly with the full algorithm, so
+    # we treat it separately.
+
+    if math.get_interface(u) == "torch":
+        # Torch's sort function returns both the sorted values and the new order
+        sorted_evs, _ = math.sort(math.real(evs))
+    else:
+        sorted_evs = math.sort(math.real(evs))
+
+    if math.allclose(sorted_evs, [-1, -1, 1, 1]):
+        interior_decomp = [
+            qml.CNOT(wires=[wires[1], wires[0]]),
+            qml.S(wires=wires[0]),
+            qml.SX(wires=wires[1]),
+            qml.CNOT(wires=[wires[1], wires[0]]),
+        ]
+
+        # S \otimes SX
+        inner_matrix = S_SX
+    else:
+        # For the non-special case, the eigenvalues come in conjugate pairs.
+        # We need to find two non-conjugate eigenvalues to extract the angles.
+        x = math.angle(evs[0])
+        y = math.angle(evs[1])
+
+        # If it was the conjugate, grab a different eigenvalue.
+        if math.allclose(x, -y):
+            y = math.angle(evs[2])
+
+        delta = (x + y) / 2
+        phi = (x - y) / 2
+
+        interior_decomp = [
+            qml.CNOT(wires=[wires[1], wires[0]]),
+            qml.RZ(delta, wires=wires[0]),
+            qml.RX(phi, wires=wires[1]),
+            qml.CNOT(wires=[wires[1], wires[0]]),
+        ]
+
+        RZd = qml.RZ(math.cast_like(delta, 1j), wires=0).matrix
+        RXp = qml.RX(phi, wires=0).matrix
+        inner_matrix = math.kron(RZd, RXp)
+
+    # We need the matrix representation of this interior part, V, in order to
+    # decompose U = (A \otimes B) V (C \otimes D)
+    V = math.dot(math.cast_like(CNOT10, U), math.dot(inner_matrix, math.cast_like(CNOT10, U)))
+
+    # Now we find the A, B, C, D in SU(2), and return the decomposition
+    A, B, C, D = _extract_su2su2_prefactors(U, V)
+
+    A_ops = zyz_decomposition(A, wires[0])
+    B_ops = zyz_decomposition(B, wires[1])
+    C_ops = zyz_decomposition(C, wires[0])
+    D_ops = zyz_decomposition(D, wires[1])
+
+    return C_ops + D_ops + interior_decomp + A_ops + B_ops
+
+
+def _decomposition_3_cnots(U, wires):
+    r"""The most general form of this decomposition is U = (A \otimes B) V (C \otimes D),
+    where V is as depicted in the circuit below:
+     -╭U- = -C--╭X--RZ(d)--╭C---------╭X--A-
+     -╰U- = -D--╰C--RY(b)--╰X--RY(a)--╰C--B-
+    """
+
+    # First we add a SWAP as per v1 of arXiv:0308033, which helps with some
+    # rearranging of gates in the decomposition (it will cancel out the fact
+    # that we need to add a SWAP to fix the determinant in another part later).
+    swap_U = np.exp(1j * np.pi / 4) * math.dot(math.cast_like(SWAP, U), U)
+
+    # Choose the rotation angles of RZ, RY in the two-qubit decomposition.
+    # They are chosen as per Proposition V.1 in quant-ph/0308033 and are based
+    # on the phases of the eigenvalues of :math:`E^\dagger \gamma(U) E`, where
+    #    \gamma(U) = (E^\dag U E) (E^\dag U E)^T.
+    # The rotation angles can be computed as follows (any three eigenvalues can be used)
+    u = math.dot(Edag, math.dot(swap_U, E))
+    gammaU = math.dot(u, math.T(u))
+    evs, _ = math.linalg.eig(gammaU)
+
+    # We will sort the angles so that results are consistent across interfaces.
+    angles = math.sort([math.angle(ev) for ev in evs])
+
+    x, y, z = angles[0], angles[1], angles[2]
+
+    # Compute functions of the eigenvalues; there are different options in v1
+    # vs. v3 of the paper, I'm not entirely sure why. This is the version from v3.
+    alpha = (x + y) / 2
+    beta = (x + z) / 2
+    delta = (z + y) / 2
+
+    # This is the interior portion of the decomposition circuit
+    interior_decomp = [
+        qml.CNOT(wires=[wires[1], wires[0]]),
+        qml.RZ(delta, wires=wires[0]),
+        qml.RY(beta, wires=wires[1]),
+        qml.CNOT(wires=wires),
+        qml.RY(alpha, wires=wires[1]),
+        qml.CNOT(wires=[wires[1], wires[0]]),
+    ]
+
+    # We need the matrix representation of this interior part, V, in order to
+    # decompose U = (A \otimes B) V (C \otimes D)
+    #
+    # Looking at the decomposition above, V has determinant -1 (because there
+    # are 3 CNOTs, each with determinant -1). The relationship between U and V
+    # requires that both are in SU(4), so we add a SWAP after to V. We will see
+    # how this gets fixed later.
+    #
+    # -╭V- = -╭X--RZ(d)--╭C---------╭X--╭SWAP-
+    # -╰V- = -╰C--RY(b)--╰X--RY(a)--╰C--╰SWAP-
+
+    RZd = qml.RZ(math.cast_like(delta, 1j), wires=wires[0]).matrix
+    RYb = qml.RY(beta, wires=wires[0]).matrix
+    RYa = qml.RY(alpha, wires=wires[0]).matrix
+
+    V_mats = [CNOT10, math.kron(RZd, RYb), CNOT01, math.kron(math.eye(2), RYa), CNOT10, SWAP]
+
+    V = math.convert_like(math.eye(4), U)
+
+    for mat in V_mats:
+        V = math.dot(math.cast_like(mat, U), V)
+
+    # Now we need to find the four SU(2) operations A, B, C, D
+    A, B, C, D = _extract_su2su2_prefactors(swap_U, V)
+
+    # At this point, we have the following:
+    # -╭U-╭SWAP- = --C--╭X-RZ(d)-╭C-------╭X-╭SWAP--A
+    # -╰U-╰SWAP- = --D--╰C-RZ(b)-╰X-RY(a)-╰C-╰SWAP--B
+    #
+    # Using the relationship that SWAP(A \otimes B) SWAP = B \otimes A,
+    # -╭U-╭SWAP- = --C--╭X-RZ(d)-╭C-------╭X--B--╭SWAP-
+    # -╰U-╰SWAP- = --D--╰C-RZ(b)-╰X-RY(a)-╰C--A--╰SWAP-
+    #
+    # Now the SWAPs cancel, giving us the desired decomposition
+    # (up to a global phase).
+    # -╭U- = --C--╭X-RZ(d)-╭C-------╭X--B--
+    # -╰U- = --D--╰C-RZ(b)-╰X-RY(a)-╰C--A--
+
+    A_ops = zyz_decomposition(A, wires[1])
+    B_ops = zyz_decomposition(B, wires[0])
+    C_ops = zyz_decomposition(C, wires[0])
+    D_ops = zyz_decomposition(D, wires[1])
+
+    # Return the full decomposition
+    return C_ops + D_ops + interior_decomp + A_ops + B_ops
+
+
+def two_qubit_decomposition(U, wires):
+    r"""Decompose a two-qubit unitary :math:`U` in terms of elementary operations.
+
+    It is known that an arbitrary two-qubit operation can be implemented using a
+    maximum of 3 CNOTs. This transform first determines the required number of
+    CNOTs, then decomposes the operator into a circuit with a fixed form.  These
+    decompositions are based a number of works by Shende, Markov, and Bullock
+    `(1) <https://arxiv.org/abs/quant-ph/0308033>`__, `(2)
+    <https://arxiv.org/abs/quant-ph/0308045v3>`__, `(3)
+    <https://web.eecs.umich.edu/~imarkov/pubs/conf/spie04-2qubits.pdf>`__,
+    though we note that many alternative decompositions are possible.
+
+    For the 3-CNOT case, we recover the following circuit, which is Figure 2 in
+    reference (1) above:
+
+    .. figure:: ../../_static/two_qubit_decomposition_3_cnots.svg
+        :align: center
+        :width: 70%
+        :target: javascript:void(0);
+
+    where :math:`A, B, C, D` are :math:`SU(2)` operations, and the rotation angles are
+    computed based on features of the input unitary :math:`U`.
+
+    For the 2-CNOT case, the decomposition is
+
+    .. figure:: ../../_static/two_qubit_decomposition_2_cnots.svg
+        :align: center
+        :width: 50%
+        :target: javascript:void(0);
+
+    For 1 CNOT, we have a CNOT surrounded by one :math:`SU(2)` per wire on each
+    side.  The special case of no CNOTs simply returns a tensor product of two
+    :math:`SU(2)` operations.
+
+    This decomposition can be applied automatically to all two-qubit
+    :class:`~.QubitUnitary` operations using the
+    :func:`~pennylane.transforms.unitary_to_rot` transform.
+
+    .. warning::
+
+        This decomposition will not be differentiable in the ``unitary_to_rot``
+        transform if the matrix being decomposed depends on parameters with
+        respect to which we would like to take the gradient.  See the
+        documentation of :func:`~pennylane.transforms.unitary_to_rot` for
+        explicit examples of the differentiable and non-differentiable cases.
+
+    Args:
+        U (tensor): A :math:`4 \times 4` unitary matrix.
+        wires (Union[Wires, Sequence[int] or int]): The wires on which to apply the operation.
+
+    Returns:
+        list[Operation]: A list of operations that represent the decomposition
+        of the matrix U.
+
+    **Example**
+
+    Suppose we create a random element of :math:`U(4)`, and would like to decompose it
+    into elementary gates in our circuit.
+
+    >>> from scipy.stats import unitary_group
+    >>> U = unitary_group.rvs(4)
+    >>> U
+    array([[-0.29113625+0.56393527j,  0.39546712-0.14193837j,
+             0.04637428+0.01311566j, -0.62006741+0.18403743j],
+           [-0.45479211+0.25978444j, -0.52737418-0.5549423j ,
+            -0.23429057+0.10728103j,  0.16061807-0.21769762j],
+           [-0.4501231 +0.04065613j, -0.25558662+0.38209554j,
+            -0.04143479-0.56598134j,  0.12983673+0.49548507j],
+           [ 0.23899902+0.24800931j,  0.03374589-0.15784319j,
+             0.24898226-0.73975147j,  0.0269508 -0.49534518j]])
+
+    We can compute its decompositon like so:
+
+    >>> decomp = qml.transforms.two_qubit_decomposition(np.array(U), wires=[0, 1])
+    >>> decomp
+    [Rot(tensor(-1.69488788, requires_grad=True), tensor(1.06701916, requires_grad=True), tensor(0.41190893, requires_grad=True), wires=[0]),
+     Rot(tensor(1.57705621, requires_grad=True), tensor(2.42621204, requires_grad=True), tensor(2.57842249, requires_grad=True), wires=[1]),
+     CNOT(wires=[1, 0]),
+     RZ(0.4503059654281863, wires=[0]),
+     RY(-0.8872497960867665, wires=[1]),
+     CNOT(wires=[0, 1]),
+     RY(-1.6472464849278514, wires=[1]),
+     CNOT(wires=[1, 0]),
+     Rot(tensor(2.93239686, requires_grad=True), tensor(1.8725019, requires_grad=True), tensor(0.0418203, requires_grad=True), wires=[1]),
+     Rot(tensor(-3.78673588, requires_grad=True), tensor(2.03936812, requires_grad=True), tensor(-2.46956972, requires_grad=True), wires=[0])]
+
+    """
+    # First, we note that this method works only for SU(4) gates, meaning that
+    # we need to rescale the matrix by its determinant.
+    U = _convert_to_su4(U)
+
+    # The next thing we will do is compute the number of CNOTs needed, as this affects
+    # the form of the decomposition.
+    num_cnots = _compute_num_cnots(U)
+
+    if num_cnots == 0:
+        decomp = qml.transforms.invisible(_decomposition_0_cnots)(U, wires)
+    elif num_cnots == 1:
+        decomp = qml.transforms.invisible(_decomposition_1_cnot)(U, wires)
+    elif num_cnots == 2:
+        decomp = qml.transforms.invisible(_decomposition_2_cnots)(U, wires)
+    else:
+        decomp = qml.transforms.invisible(_decomposition_3_cnots)(U, wires)
+
+    # If there is an active tape, queue the decomposition so that expand works
+    current_tape = qml.tape.get_active_tape()
+
+    if current_tape:
+        with current_tape:
+            for op in decomp:
+                qml.apply(op)
+
+    return decomp
diff --git a/pennylane/transforms/unitary_to_rot.py b/pennylane/transforms/unitary_to_rot.py
index cd05fccbd..270ff5f1f 100644
--- a/pennylane/transforms/unitary_to_rot.py
+++ b/pennylane/transforms/unitary_to_rot.py
@@ -16,17 +16,25 @@ A transform for decomposing arbitrary single-qubit QubitUnitary gates into eleme
 """
 import pennylane as qml
 from pennylane.transforms import qfunc_transform
-from pennylane.transforms.decompositions import zyz_decomposition
+from pennylane.transforms.decompositions import zyz_decomposition, two_qubit_decomposition
 
 
 @qfunc_transform
 def unitary_to_rot(tape):
-    """Quantum function transform to decomposes all instances of single-qubit :class:`~.QubitUnitary`
-    operations to parametrized single-qubit operations.
+    r"""Quantum function transform to decomposes all instances of single-qubit and
+    select instances of two-qubit :class:`~.QubitUnitary` operations to
+    parametrized single-qubit operations.
 
-    Diagonal operations will be converted to a single :class:`.RZ` gate, while non-diagonal
-    operations will be converted to a :class:`.Rot` gate that implements the original operation
-    up to a global phase.
+    For single-qubit gates, diagonal operations will be converted to a single
+    :class:`.RZ` gate, while non-diagonal operations will be converted to a
+    :class:`.Rot` gate that implements the original operation up to a global
+    phase. Two-qubit gates will be decomposed according to the
+    :func:`pennylane.transforms.two_qubit_decomposition` function.
+
+    .. warning::
+
+        This transform is not fully differentiable for 2-qubit ``QubitUnitary``
+        operations. See usage details below.
 
     Args:
         qfunc (function): a quantum function
@@ -42,10 +50,8 @@ def unitary_to_rot(tape):
             [ 0.25053735+0.75164238j,  0.60700543-0.06171855j]
         ])
 
-    The ``unitary_to_rot`` transform enables us to decompose
-    such numerical operations (as well as unitaries that may be defined by parameters
-    within the QNode, and instantiated therein), while preserving differentiability.
-
+    The ``unitary_to_rot`` transform enables us to decompose such numerical
+    operations while preserving differentiability.
 
     .. code-block:: python3
 
@@ -70,13 +76,67 @@ def unitary_to_rot(tape):
     >>> print(qml.draw(transformed_qnode)())
      0: ──Rot(-1.35, 1.83, -0.606)──┤ ⟨Z⟩
 
+
+    .. UsageDetails::
+
+        This decomposition is not fully differentiable. We **can** differentiate
+        with respect to input QNode parameters when they are not used to
+        explicitly construct a :math:`4 \times 4` unitary matrix being
+        decomposed. So for example, the following will work:
+
+        .. code-block:: python3
+
+            U = scipy.stats.unitary_group.rvs(4)
+
+            def circuit(angles):
+                qml.QubitUnitary(U, wires=["a", "b"])
+                qml.RX(angles[0], wires="a")
+                qml.RY(angles[1], wires="b")
+                qml.CNOT(wires=["b", "a"])
+                return qml.expval(qml.PauliZ(wires="a"))
+
+            dev = qml.device('default.qubit', wires=["a", "b"])
+            transformed_qfunc = qml.transforms.unitary_to_rot(circuit)
+            transformed_qnode = qml.QNode(transformed_qfunc, dev)
+
+        >>> g = qml.grad(transformed_qnode)
+        >>> g([0.2, 0.3])
+        [array(-0.24454992), array(-0.23913254)]
+
+        However, the following example will **not** be differentiable:
+
+        .. code-block:: python3
+
+            def circuit(angles):
+                z = angles[0]
+                x = angles[1]
+
+                Z_mat = np.array([[np.exp(-1j * z / 2), 0.0], [0.0, np.exp(1j * z / 2)]])
+
+                c = np.cos(x / 2)
+                s = np.sin(x / 2) * 1j
+                X_mat = np.array([[c, -s], [-s, c]])
+
+                U = np.kron(Z_mat, X_mat)
+
+                qml.Hadamard(wires="a")
+
+                # U depends on the input parameters
+                qml.QubitUnitary(U, wires=["a", "b"])
+
+                qml.CNOT(wires=["b", "a"])
+                return qml.expval(qml.PauliX(wires="a"))
     """
+
     for op in tape.operations + tape.measurements:
         if isinstance(op, qml.QubitUnitary):
-            # Only act on single-qubit unitary operations
-            if qml.math.shape(op.parameters[0]) != (2, 2):
-                continue
-
-            zyz_decomposition(op.parameters[0], op.wires[0])
+            # Single-qubit unitary operations
+            if qml.math.shape(op.parameters[0]) == (2, 2):
+                zyz_decomposition(op.parameters[0], op.wires[0])
+            # Two-qubit unitary operations
+            elif qml.math.shape(op.parameters[0]) == (4, 4):
+                two_qubit_decomposition(op.parameters[0], op.wires)
+            else:
+                qml.apply(op)
         else:
             qml.apply(op)


Test patch:
diff --git a/tests/ops/test_qubit_ops.py b/tests/ops/test_qubit_ops.py
index 80ca573ab..f1489d651 100644
--- a/tests/ops/test_qubit_ops.py
+++ b/tests/ops/test_qubit_ops.py
@@ -2840,10 +2840,10 @@ class TestQubitUnitary:
         assert np.allclose(decomp[0].parameters, expected_params)
 
     def test_qubit_unitary_decomposition_multiqubit_invalid(self):
-        """Test that QubitUnitary is not decomposed for more than a single qubit."""
-        U = qml.CRZ(0.3, wires=[0, 1]).matrix
+        """Test that QubitUnitary is not decomposed for more than two qubits."""
+        U = qml.Toffoli(wires=[0, 1, 2]).matrix
 
-        with pytest.raises(NotImplementedError, match="only supported for single-qubit"):
+        with pytest.raises(NotImplementedError, match="only supported for single- and two-qubit"):
             qml.QubitUnitary.decomposition(U, wires=[0, 1])
 
 
diff --git a/tests/templates/test_subroutines/test_qmc.py b/tests/templates/test_subroutines/test_qmc.py
index 242060100..500430a30 100644
--- a/tests/templates/test_subroutines/test_qmc.py
+++ b/tests/templates/test_subroutines/test_qmc.py
@@ -246,10 +246,13 @@ class TestQuantumMonteCarlo:
         target_wires, estimation_wires = Wires(range(3)), Wires(range(3, 5))
 
         op = QuantumMonteCarlo(p, self.func, target_wires, estimation_wires)
-        tape = op.expand().expand()
+        tape = op.expand()
 
+        # Do expansion in two steps to avoid also decomposing the first QubitUnitary
         queue_before_qpe = tape.operations[:2]
-        queue_after_qpe = tape.operations[2:]
+
+        # 2-qubit decomposition has 10 operations, and after is a 3-qubit gate so start at 11
+        queue_after_qpe = tape.expand().operations[11:]
 
         A = probs_to_unitary(p)
         R = func_to_unitary(self.func, 4)
diff --git a/tests/transforms/test_decompositions.py b/tests/transforms/test_decompositions.py
index 2f839e87b..09b84371c 100644
--- a/tests/transforms/test_decompositions.py
+++ b/tests/transforms/test_decompositions.py
@@ -21,10 +21,17 @@ import pennylane as qml
 from pennylane import numpy as np
 
 from pennylane.wires import Wires
+
 from pennylane.transforms.decompositions import zyz_decomposition
+from pennylane.transforms.decompositions import two_qubit_decomposition
+from pennylane.transforms.decompositions.two_qubit_unitary import (
+    _convert_to_su4,
+    _su2su2_to_tensor_products,
+    _compute_num_cnots,
+)
 
-from test_optimization.utils import check_matrix_equivalence
-from gate_data import I, Z, S, T, H, X
+from test_optimization.utils import compute_matrix_from_ops_two_qubit, check_matrix_equivalence
+from gate_data import I, Z, S, T, H, X, CNOT, SWAP
 
 single_qubit_decomps = [
     # First set of gates are diagonal and converted to RZ
@@ -137,6 +144,7 @@ class TestQubitUnitaryZYZDecomposition:
         assert len(obtained_gates) == 1
         assert isinstance(obtained_gates[0], expected_gate)
         assert obtained_gates[0].wires == Wires("a")
+
         assert qml.math.allclose(qml.math.unwrap(obtained_gates[0].parameters), expected_params)
 
         if obtained_gates[0].num_params == 1:
@@ -145,3 +153,684 @@ class TestQubitUnitaryZYZDecomposition:
             obtained_mat = qml.Rot(*obtained_gates[0].parameters, wires=0).matrix
 
         assert check_matrix_equivalence(obtained_mat, U)
+
+
+# Randomly generated set (scipy.unitary_group) of five U(4) operations.
+# These require 3 CNOTs each
+samples_3_cnots = [
+    # Special case
+    SWAP,
+    # Unitary from the QMC subroutine
+    [
+        [0.5, 0.5, 0.5, 0.5],
+        [0.5, -0.83333333, 0.16666667, 0.16666667],
+        [0.5, 0.16666667, -0.83333333, 0.16666667],
+        [0.5, 0.16666667, 0.16666667, -0.83333333],
+    ],
+    [
+        [
+            -0.07016275 - 0.11813399j,
+            -0.46476569 - 0.36887134j,
+            -0.18641714 + 0.66322739j,
+            -0.36131479 - 0.15452521j,
+        ],
+        [
+            -0.21347395 - 0.47461873j,
+            0.45781338 - 0.21930172j,
+            0.16991759 - 0.12283128j,
+            -0.59626019 + 0.26831674j,
+        ],
+        [
+            -0.50100034 + 0.47448914j,
+            0.14346598 + 0.41837463j,
+            -0.39898589 + 0.01284601j,
+            -0.40027516 - 0.09308024j,
+        ],
+        [
+            0.47310527 + 0.10157557j,
+            -0.4411336 - 0.00466688j,
+            -0.2328747 - 0.51752603j,
+            -0.46274728 + 0.18717456j,
+        ],
+    ],
+    [
+        [
+            -0.41189319 + 0.06007113j,
+            0.15316396 + 0.1458654j,
+            -0.17064243 + 0.33405919j,
+            0.60457809 + 0.52513855j,
+        ],
+        [
+            0.08694733 + 0.64367692j,
+            -0.17413963 + 0.61038522j,
+            -0.27698195 - 0.31363701j,
+            -0.01169698 - 0.0012099j,
+        ],
+        [
+            -0.39488729 - 0.41241129j,
+            0.2202738 + 0.19315024j,
+            -0.45149927 - 0.30746997j,
+            0.15876369 - 0.51435213j,
+        ],
+        [
+            -0.27620095 - 0.05049386j,
+            0.47854591 + 0.48737626j,
+            0.6201202 - 0.03549654j,
+            -0.25966725 + 0.03722163j,
+        ],
+    ],
+    [
+        [
+            -0.34812515 + 0.37427723j,
+            -0.11092236 + 0.47565307j,
+            0.13724183 - 0.29504039j,
+            -0.56249794 - 0.27908375j,
+        ],
+        [
+            -0.14408107 + 0.1693212j,
+            -0.20483797 - 0.10707915j,
+            -0.85376825 + 0.3175112j,
+            -0.1054503 - 0.23726165j,
+        ],
+        [
+            0.03106625 - 0.04236712j,
+            0.78292822 + 0.03053768j,
+            0.01814738 + 0.16830002j,
+            0.03513342 - 0.59451003j,
+        ],
+        [
+            -0.00087219 - 0.82857442j,
+            0.04840206 + 0.30294214j,
+            -0.1884474 + 0.01468393j,
+            -0.41353861 + 0.11227088j,
+        ],
+    ],
+    [
+        [
+            -0.05780187 - 0.06284269j,
+            0.13559069 + 0.19399748j,
+            0.12381697 + 0.01612151j,
+            0.71416466 - 0.64114599j,
+        ],
+        [
+            -0.31103029 - 0.06658675j,
+            -0.50183231 + 0.49812898j,
+            -0.58061141 - 0.20451914j,
+            -0.07379796 - 0.12030957j,
+        ],
+        [
+            0.47241806 - 0.79298028j,
+            0.14041019 + 0.06342211j,
+            -0.27789855 + 0.19625469j,
+            -0.07716877 - 0.05067088j,
+        ],
+        [
+            0.11114093 - 0.16488557j,
+            -0.12688073 + 0.63574829j,
+            0.68327072 - 0.15122624j,
+            -0.21697355 + 0.05813823j,
+        ],
+    ],
+    [
+        [
+            0.32457875 - 0.36309659j,
+            -0.21084067 + 0.48248995j,
+            -0.21588245 - 0.42368088j,
+            -0.0474262 + 0.50714809j,
+        ],
+        [
+            -0.24688996 - 0.11890225j,
+            0.16113004 + 0.1518989j,
+            -0.40132738 - 0.28678782j,
+            -0.63810805 - 0.4747406j,
+        ],
+        [
+            -0.14474527 - 0.46561401j,
+            0.47151308 - 0.32560877j,
+            0.51600239 - 0.28298318j,
+            -0.18491473 + 0.23103107j,
+        ],
+        [
+            0.42624962 - 0.51795827j,
+            -0.17138618 - 0.56213399j,
+            -0.36133453 + 0.23168462j,
+            -0.0167845 - 0.14191731j,
+        ],
+    ],
+]
+
+samples_2_cnots = [
+    # Special case: CNOT01 CNOT10
+    [[1, 0, 0, 0], [0, 0, 0, 1], [0, 1, 0, 0], [0, 0, 1, 0]],
+    # CNOT01 HH CNOT01
+    [[0.5, 0.5, 0.5, 0.5], [0.5, -0.5, -0.5, 0.5], [0.5, -0.5, 0.5, -0.5], [0.5, 0.5, -0.5, -0.5]],
+    # (A \otimes B) CNOT10 CNOT01 (C \otimes D)
+    [
+        [
+            0.06593717 - 0.26170549j,
+            -0.70347203 - 0.07117793j,
+            0.23473954 - 0.2369032j,
+            0.5244829 - 0.20227516j,
+        ],
+        [
+            -0.20854782 + 0.32788173j,
+            -0.43987873 + 0.2876307j,
+            -0.14557311 + 0.70166825j,
+            0.10554244 + 0.21933444j,
+        ],
+        [
+            -0.10107 - 0.78553725j,
+            0.30719144 + 0.10962565j,
+            -0.08963713 + 0.42499178j,
+            0.27869654 - 0.00267013j,
+        ],
+        [
+            0.06589238 - 0.38018178j,
+            -0.33913438 + 0.04939232j,
+            0.4184943 + 0.10702358j,
+            -0.7203013 + 0.16805593j,
+        ],
+    ],
+    # CNOT01 (A \otimes B) CNOT01 (C \otimes D)
+    [
+        [
+            0.31547811 - 0.58699408j,
+            -0.34881989 - 0.41836625j,
+            0.30342551 - 0.04638021j,
+            -0.28264065 - 0.29172243j,
+        ],
+        [
+            -0.16129481 + 0.35079944j,
+            -0.03709334 - 0.15894938j,
+            0.0736614 + 0.55424822j,
+            -0.71185497 + 0.0702021j,
+        ],
+        [
+            -0.30829764 + 0.23330248j,
+            -0.34470925 - 0.74564132j,
+            -0.21494836 - 0.09732758j,
+            0.28996211 + 0.18964071j,
+        ],
+        [
+            -0.44032041 + 0.25194387j,
+            0.04287028 + 0.00320109j,
+            0.72290688 - 0.12204478j,
+            0.15915489 - 0.4218703j,
+        ],
+    ],
+    # (A \otimes B) CNOT10 (C \otimes D) CNOT01 (E \otimes F)
+    [
+        [
+            0.26680917 + 0.24320208j,
+            0.05925905 + 0.84940479j,
+            0.04305845 + 0.16580725j,
+            -0.03847889 + 0.33740004j,
+        ],
+        [
+            -0.05713611 - 0.69307062j,
+            -0.14217609 + 0.26062907j,
+            -0.12264675 - 0.59272591j,
+            -0.14185396 + 0.20434836j,
+        ],
+        [
+            0.18147763 + 0.27516979j,
+            -0.2868943 - 0.08518162j,
+            -0.09780205 - 0.39614393j,
+            0.76677616 + 0.21758277j,
+        ],
+        [
+            -0.52667927 - 0.00325491j,
+            -0.05056066 + 0.30779487j,
+            0.65170215 - 0.11435361j,
+            0.2628016 - 0.34416154j,
+        ],
+    ],
+]
+
+# These are randomly generated matrices that involve a single CNOT
+samples_1_cnot = [
+    # Special case
+    CNOT,
+    # CNOT10 (A \otimes B)
+    [
+        [
+            -0.40013501 + 0.6346169j,
+            0.36588428 + 0.27955713j,
+            -0.34061004 - 0.21797615j,
+            -0.15200951 + 0.19619931j,
+        ],
+        [
+            0.19619931 - 0.15200951j,
+            0.21797615 + 0.34061004j,
+            -0.27955713 - 0.36588428j,
+            0.6346169 - 0.40013501j,
+        ],
+        [
+            -0.04618249 + 0.40174118j,
+            0.24303208 + 0.05036332j,
+            0.74472919 + 0.09069221j,
+            0.09646726 - 0.45024168j,
+        ],
+        [
+            0.45024168 - 0.09646726j,
+            0.09069221 + 0.74472919j,
+            0.05036332 + 0.24303208j,
+            -0.40174118 + 0.04618249j,
+        ],
+    ],
+    # CNOT01 (A \otimes B)
+    [
+        [
+            -0.65867779 - 0.39965996j,
+            0.10480488 - 0.11993597j,
+            0.33775094 + 0.50135151j,
+            -0.11410732 + 0.0509635j,
+        ],
+        [
+            -0.15620406 + 0.03112864j,
+            0.0184181 + 0.77022418j,
+            0.12151068 + 0.02920466j,
+            0.24022431 - 0.55472634j,
+        ],
+        [
+            0.0509635 - 0.11410732j,
+            -0.50135151 - 0.33775094j,
+            0.11993597 - 0.10480488j,
+            -0.39965996 - 0.65867779j,
+        ],
+        [
+            0.55472634 - 0.24022431j,
+            0.02920466 + 0.12151068j,
+            0.77022418 + 0.0184181j,
+            -0.03112864 + 0.15620406j,
+        ],
+    ],
+    # (A \otimes B) CNOT01
+    [
+        [
+            0.61975417 + 0.05871326j,
+            0.18490393 - 0.03060346j,
+            0.11206333 - 0.18820514j,
+            0.51965346 - 0.50922726j,
+        ],
+        [
+            0.17568798 - 0.06526691j,
+            -0.50876306 + 0.35875148j,
+            -0.06315069 + 0.72482005j,
+            0.07415843 - 0.20610651j,
+        ],
+        [
+            0.72482005 - 0.06315069j,
+            0.20610651 - 0.07415843j,
+            -0.06526691 + 0.17568798j,
+            -0.35875148 + 0.50876306j,
+        ],
+        [
+            0.18820514 - 0.11206333j,
+            -0.50922726 + 0.51965346j,
+            -0.05871326 - 0.61975417j,
+            -0.03060346 + 0.18490393j,
+        ],
+    ],
+    # (A \otimes B) CNOT10
+    [
+        [
+            0.19339868 + 0.08633274j,
+            0.01466384 + 0.70171345j,
+            -0.63869976 + 0.02205134j,
+            0.09769795 - 0.21108831j,
+        ],
+        [
+            0.18782762 - 0.1372004j,
+            -0.56109965 - 0.30592619j,
+            -0.32755953 + 0.62074274j,
+            0.12258652 + 0.17271055j,
+        ],
+        [
+            0.30592619 + 0.56109965j,
+            0.1372004 - 0.18782762j,
+            0.17271055 + 0.12258652j,
+            0.62074274 - 0.32755953j,
+        ],
+        [
+            0.70171345 + 0.01466384j,
+            0.08633274 + 0.19339868j,
+            0.21108831 - 0.09769795j,
+            -0.02205134 + 0.63869976j,
+        ],
+    ],
+    # (A \otimes B) CNOT10 (C \otimes D)
+    [
+        [
+            0.78385585 + 0.24581188j,
+            -0.08367428 + 0.34003966j,
+            -0.16227836 - 0.08719991j,
+            -0.222293 + 0.34520414j,
+        ],
+        [
+            -0.40100084 - 0.10151918j,
+            0.07269317 + 0.76372534j,
+            -0.26873591 + 0.2188187j,
+            -0.34389609 - 0.04434368j,
+        ],
+        [
+            0.17914714 - 0.32406563j,
+            0.2474564 - 0.0645854j,
+            0.45026225 - 0.23004978j,
+            -0.66076185 - 0.32437111j,
+        ],
+        [
+            0.04747281 + 0.12113138j,
+            0.4725868 + 0.00816913j,
+            -0.53596566 - 0.55049352j,
+            0.1451332 - 0.38510071j,
+        ],
+    ],
+    # (A \otimes B) CNOT01 (C \otimes D)
+    [
+        [
+            0.38565489 - 0.50840093j,
+            -0.30818989 - 0.11768624j,
+            0.27524652 - 0.39173492j,
+            -0.5046883 - 0.00636884j,
+        ],
+        [
+            -0.05689053 - 0.29547371j,
+            0.51930406 - 0.09499063j,
+            -0.40250308 - 0.33321454j,
+            0.00587892 - 0.59806656j,
+        ],
+        [
+            0.56972698 - 0.14750915j,
+            -0.32434509 + 0.18005613j,
+            -0.62729996 + 0.30972331j,
+            0.15801266 - 0.04037939j,
+        ],
+        [
+            -0.37603427 + 0.12044912j,
+            -0.64676631 + 0.23778647j,
+            0.03588508 - 0.08379105j,
+            0.02300689 - 0.60033588j,
+        ],
+    ],
+]
+
+# Randomly-generated SU(2) x SU(2) matrices. These can be used to test
+# the 0-CNOT decomposition case
+samples_su2_su2 = [
+    # Real-valued case
+    (X, H),
+    (
+        [
+            [0.21993927 - 0.1111822j, -0.27174921 - 0.93027824j],
+            [0.27174921 - 0.93027824j, 0.21993927 + 0.1111822j],
+        ],
+        [
+            [0.86361715 + 0.11195238j, 0.35098794 - 0.34415046j],
+            [-0.35098794 - 0.34415046j, 0.86361715 - 0.11195238j],
+        ],
+    ),
+    (
+        [
+            [0.08652981 - 0.25976406j, 0.95775011 + 0.08803377j],
+            [-0.95775011 + 0.08803377j, 0.08652981 + 0.25976406j],
+        ],
+        [
+            [-0.1668335 + 0.92244968j, -0.34571207 + 0.04166941j],
+            [0.34571207 + 0.04166941j, -0.1668335 - 0.92244968j],
+        ],
+    ),
+    (
+        [
+            [-0.36170896 - 0.92179965j, -0.1390035 + 0.01140442j],
+            [0.1390035 + 0.01140442j, -0.36170896 + 0.92179965j],
+        ],
+        [
+            [-0.26587616 + 0.09917768j, 0.731434 + 0.62006287j],
+            [-0.731434 + 0.62006287j, -0.26587616 - 0.09917768j],
+        ],
+    ),
+    (
+        [
+            [0.90778489 + 0.27105877j, 0.17141891 - 0.27031333j],
+            [-0.17141891 - 0.27031333j, 0.90778489 - 0.27105877j],
+        ],
+        [
+            [0.72380105 - 0.58082557j, -0.18751423 + 0.32185728j],
+            [0.18751423 + 0.32185728j, 0.72380105 + 0.58082557j],
+        ],
+    ),
+    (
+        [
+            [-0.11704772 + 0.39598718j, -0.89480902 - 0.16973743j],
+            [0.89480902 - 0.16973743j, -0.11704772 - 0.39598718j],
+        ],
+        [[np.exp(-1j * np.pi / 3), 0], [0, np.exp(1j * np.pi / 3)]],
+    ),
+    (
+        [
+            [0, -1j],
+            [-1j, 0],
+        ],
+        [
+            [-0.05594177 - 0.02155518j, -0.83242096 - 0.55089131j],
+            [0.83242096 - 0.55089131j, -0.05594177 + 0.02155518j],
+        ],
+    ),
+    (
+        [
+            [0.90778489 + 0.27105877j, 0.17141891 - 0.27031333j],
+            [-0.17141891 - 0.27031333j, 0.90778489 - 0.27105877j],
+        ],
+        [
+            [0, -1j],
+            [-1j, 0],
+        ],
+    ),
+]
+
+
+class TestTwoQubitUnitaryDecomposition:
+    """Test that two-qubit unitary operations are correctly decomposed."""
+
+    @pytest.mark.parametrize("U", samples_3_cnots)
+    def test_convert_to_su4(self, U):
+        """Test a matrix in U(4) is correct converted to SU(4)."""
+        U_su4 = _convert_to_su4(np.array(U))
+
+        # Ensure the determinant is correct and the mats are equivalent up to a phase
+        assert qml.math.isclose(qml.math.linalg.det(U_su4), 1.0)
+        assert check_matrix_equivalence(np.array(U), U_su4)
+
+    def test_convert_to_su4_invalid(self):
+        """Test a matrix in U(4) is correct converted to SU(4)."""
+        U = np.ones((4, 4))
+
+        with pytest.raises(ValueError, match="Operator must be unitary"):
+            _convert_to_su4(U)
+
+    @pytest.mark.parametrize("U_pair", samples_su2_su2)
+    def test_su2su2_to_tensor_products(self, U_pair):
+        """Test SU(2) x SU(2) can be correctly factored into tensor products."""
+        true_matrix = qml.math.kron(np.array(U_pair[0]), np.array(U_pair[1]))
+
+        A, B = _su2su2_to_tensor_products(true_matrix)
+
+        assert check_matrix_equivalence(qml.math.kron(A, B), true_matrix)
+
+    @pytest.mark.parametrize("wires", [[0, 1], ["a", "b"], [3, 2], ["c", 0]])
+    @pytest.mark.parametrize("U", samples_3_cnots)
+    def test_two_qubit_decomposition_3_cnots(self, U, wires):
+        """Test that a two-qubit matrix in isolation is correctly decomposed."""
+        U = _convert_to_su4(np.array(U))
+
+        assert _compute_num_cnots(U) == 3
+
+        obtained_decomposition = two_qubit_decomposition(U, wires=wires)
+        assert len(obtained_decomposition) == 10
+
+        obtained_matrix = compute_matrix_from_ops_two_qubit(
+            obtained_decomposition, wire_order=wires
+        )
+
+        # We check with a slightly great tolerance threshold here simply because the
+        # test matrices were copied in here with reduced precision.
+        assert check_matrix_equivalence(U, obtained_matrix, atol=1e-7)
+
+    @pytest.mark.parametrize("wires", [[0, 1], ["a", "b"], [3, 2], ["c", 0]])
+    @pytest.mark.parametrize("U", samples_2_cnots)
+    def test_two_qubit_decomposition_1_cnot(self, U, wires):
+        """Test that a two-qubit matrix in isolation is correctly decomposed."""
+        U = _convert_to_su4(np.array(U))
+
+        assert _compute_num_cnots(U) == 2
+
+        obtained_decomposition = two_qubit_decomposition(U, wires=wires)
+        assert len(obtained_decomposition) == 8
+
+        obtained_matrix = compute_matrix_from_ops_two_qubit(
+            obtained_decomposition, wire_order=wires
+        )
+
+        assert check_matrix_equivalence(U, obtained_matrix, atol=1e-7)
+
+    @pytest.mark.parametrize("wires", [[0, 1], ["a", "b"], [3, 2], ["c", 0]])
+    @pytest.mark.parametrize("U", samples_1_cnot)
+    def test_two_qubit_decomposition_1_cnot(self, U, wires):
+        """Test that a two-qubit matrix in isolation is correctly decomposed."""
+        U = _convert_to_su4(np.array(U))
+
+        assert _compute_num_cnots(U) == 1
+
+        obtained_decomposition = two_qubit_decomposition(U, wires=wires)
+        assert len(obtained_decomposition) == 5
+
+        obtained_matrix = compute_matrix_from_ops_two_qubit(
+            obtained_decomposition, wire_order=wires
+        )
+
+        assert check_matrix_equivalence(U, obtained_matrix, atol=1e-7)
+
+    @pytest.mark.parametrize("wires", [[0, 1], ["a", "b"], [3, 2], ["c", 0]])
+    @pytest.mark.parametrize("U_pair", samples_su2_su2)
+    def test_two_qubit_decomposition_tensor_products(self, U_pair, wires):
+        """Test that a one-qubit matrix in isolation is correctly decomposed."""
+        U = _convert_to_su4(qml.math.kron(np.array(U_pair[0]), np.array(U_pair[1])))
+
+        assert _compute_num_cnots(U) == 0
+
+        obtained_decomposition = two_qubit_decomposition(U, wires=wires)
+        assert len(obtained_decomposition) == 2
+
+        obtained_matrix = compute_matrix_from_ops_two_qubit(obtained_decomposition, wires)
+
+        assert check_matrix_equivalence(U, obtained_matrix, atol=1e-7)
+
+
+class TestTwoQubitUnitaryDecompositionInterfaces:
+    """Test the decomposition in the non-autograd interfaces."""
+
+    @pytest.mark.parametrize("wires", [[0, 1], ["a", "b"], [3, 2], ["c", 0]])
+    @pytest.mark.parametrize("U", samples_3_cnots + samples_2_cnots + samples_1_cnot)
+    def test_two_qubit_decomposition_torch(self, U, wires):
+        """Test that a two-qubit operation in Torch is correctly decomposed."""
+        torch = pytest.importorskip("torch")
+
+        U = torch.tensor(U, dtype=torch.complex128)
+
+        obtained_decomposition = two_qubit_decomposition(U, wires=wires)
+        obtained_matrix = compute_matrix_from_ops_two_qubit(
+            obtained_decomposition, wire_order=wires
+        )
+
+        assert check_matrix_equivalence(U, obtained_matrix, atol=1e-7)
+
+    @pytest.mark.parametrize("wires", [[0, 1], ["a", "b"], [3, 2], ["c", 0]])
+    @pytest.mark.parametrize("U_pair", samples_su2_su2)
+    def test_two_qubit_decomposition_tensor_products_torch(self, U_pair, wires):
+        """Test that a two-qubit tensor product in Torch is correctly decomposed."""
+        torch = pytest.importorskip("torch")
+
+        U1 = torch.tensor(U_pair[0], dtype=torch.complex128)
+        U2 = torch.tensor(U_pair[1], dtype=torch.complex128)
+        U = qml.math.kron(U1, U2)
+
+        obtained_decomposition = two_qubit_decomposition(U, wires=wires)
+
+        obtained_matrix = compute_matrix_from_ops_two_qubit(obtained_decomposition, wires)
+
+        assert check_matrix_equivalence(U, obtained_matrix, atol=1e-7)
+
+    @pytest.mark.parametrize("wires", [[0, 1], ["a", "b"], [3, 2], ["c", 0]])
+    @pytest.mark.parametrize("U", samples_3_cnots + samples_2_cnots + samples_1_cnot)
+    def test_two_qubit_decomposition_tf(self, U, wires):
+        """Test that a two-qubit operation in Tensorflow is correctly decomposed."""
+        tf = pytest.importorskip("tensorflow")
+
+        U = tf.Variable(U, dtype=tf.complex128)
+
+        obtained_decomposition = two_qubit_decomposition(U, wires=wires)
+
+        obtained_matrix = compute_matrix_from_ops_two_qubit(
+            obtained_decomposition, wire_order=wires
+        )
+
+        assert check_matrix_equivalence(U, obtained_matrix, atol=1e-7)
+
+    @pytest.mark.parametrize("wires", [[0, 1], ["a", "b"], [3, 2], ["c", 0]])
+    @pytest.mark.parametrize("U_pair", samples_su2_su2)
+    def test_two_qubit_decomposition_tensor_products_tf(self, U_pair, wires):
+        """Test that a two-qubit tensor product in Tensorflow is correctly decomposed."""
+        tf = pytest.importorskip("tensorflow")
+
+        U1 = tf.Variable(U_pair[0], dtype=tf.complex128)
+        U2 = tf.Variable(U_pair[1], dtype=tf.complex128)
+        U = qml.math.kron(U1, U2)
+
+        obtained_decomposition = two_qubit_decomposition(U, wires=wires)
+
+        print(obtained_decomposition)
+        obtained_matrix = compute_matrix_from_ops_two_qubit(obtained_decomposition, wires)
+
+        assert check_matrix_equivalence(U, obtained_matrix, atol=1e-7)
+
+    @pytest.mark.parametrize("wires", [[0, 1], ["a", "b"], [3, 2], ["c", 0]])
+    @pytest.mark.parametrize("U", samples_3_cnots + samples_2_cnots + samples_1_cnot)
+    def test_two_qubit_decomposition_jax(self, U, wires):
+        """Test that a two-qubit operation in JAX is correctly decomposed."""
+        jax = pytest.importorskip("jax")
+
+        from jax.config import config
+
+        remember = config.read("jax_enable_x64")
+        config.update("jax_enable_x64", True)
+
+        U = jax.numpy.array(U, dtype=jax.numpy.complex128)
+
+        obtained_decomposition = two_qubit_decomposition(U, wires=wires)
+        obtained_matrix = compute_matrix_from_ops_two_qubit(
+            obtained_decomposition, wire_order=wires
+        )
+
+        assert check_matrix_equivalence(U, obtained_matrix, atol=1e-7)
+
+    @pytest.mark.parametrize("wires", [[0, 1], ["a", "b"], [3, 2], ["c", 0]])
+    @pytest.mark.parametrize("U_pair", samples_su2_su2)
+    def test_two_qubit_decomposition_tensor_products_jax(self, U_pair, wires):
+        """Test that a two-qubit tensor product in JAX is correctly decomposed."""
+        jax = pytest.importorskip("jax")
+
+        from jax.config import config
+
+        remember = config.read("jax_enable_x64")
+        config.update("jax_enable_x64", True)
+
+        U1 = jax.numpy.array(U_pair[0], dtype=jax.numpy.complex128)
+        U2 = jax.numpy.array(U_pair[1], dtype=jax.numpy.complex128)
+        U = qml.math.kron(U1, U2)
+
+        obtained_decomposition = two_qubit_decomposition(U, wires=wires)
+
+        obtained_matrix = compute_matrix_from_ops_two_qubit(obtained_decomposition, wires)
+
+        assert check_matrix_equivalence(U, obtained_matrix, atol=1e-7)
diff --git a/tests/transforms/test_optimization/utils.py b/tests/transforms/test_optimization/utils.py
index a49215c80..19e1c9f03 100644
--- a/tests/transforms/test_optimization/utils.py
+++ b/tests/transforms/test_optimization/utils.py
@@ -14,8 +14,8 @@
 """Convenient utility functions for testing optimization transforms."""
 
 import pennylane as qml
-
-from gate_data import I
+from pennylane import numpy as np
+from gate_data import I, SWAP
 
 
 def compute_matrix_from_ops_one_qubit(ops):
@@ -31,29 +31,46 @@ def compute_matrix_from_ops_one_qubit(ops):
 def compute_matrix_from_ops_two_qubit(ops, wire_order):
     """Given a list of two-qubit operations, construct its matrix representation."""
 
-    mat = qml.math.kron(I, I)
+    mat = np.eye(4)
+
+    wire_order = qml.wires.Wires(wire_order)
 
     for op in ops:
-        if len(op.wires) == 1:
-            if op.wires == qml.wires.Wires(wire_order[0]):
-                mat = qml.math.dot(qml.math.kron(op.matrix, I), mat)
+        op_wires = qml.wires.Wires(op.wires)
+
+        if len(op_wires) == 1:
+            # These first two cases are to cover tensorflow quirks
+            if op.name == "RZ":
+                op_mat = qml.RZ(*qml.math.unwrap(op.parameters), wires=0).matrix
+            elif op.name == "Rot":
+                op_mat = qml.Rot(*qml.math.unwrap(op.parameters), wires=0).matrix
+            else:
+                op_mat = qml.math.unwrap(op.matrix)
+
+            if op_wires[0] == wire_order[0]:
+                tensor_prod = np.kron(op_mat, I)
             else:
-                mat = qml.math.dot(qml.math.kron(I, op.matrix), mat)
+                tensor_prod = np.kron(I, op_mat)
+
+            mat = np.dot(tensor_prod, mat)
+
         else:
-            if op.wires == qml.wires.Wires(wire_order):
-                mat = qml.math.dot(op.matrix, mat)
+            if op_wires == wire_order:
+                mat = np.dot(op.matrix, mat)
             else:
-                mat = qml.math.dot(qml.SWAP(wires=[0, 1]).matrix, qml.math.dot(op.matrix, mat))
+                mat = np.linalg.multi_dot([SWAP, op.matrix, SWAP, mat])
+
     return mat
 
 
-def check_matrix_equivalence(matrix_expected, matrix_obtained):
+def check_matrix_equivalence(matrix_expected, matrix_obtained, atol=1e-8):
     """Takes two matrices and checks if multiplying one by the conjugate
     transpose of the other gives the identity."""
 
     mat_product = qml.math.dot(qml.math.conj(qml.math.T(matrix_obtained)), matrix_expected)
-    mat_product /= mat_product[0, 0]
-    return qml.math.allclose(mat_product, qml.math.eye(matrix_expected.shape[0]))
+    mat_product = mat_product / mat_product[0, 0]
+
+    return qml.math.allclose(mat_product, qml.math.eye(matrix_expected.shape[0]), atol=atol)
 
 
 def compare_operation_lists(ops_obtained, names_expected, wires_expected):
diff --git a/tests/transforms/test_unitary_to_rot.py b/tests/transforms/test_unitary_to_rot.py
index 72088004d..579349df0 100644
--- a/tests/transforms/test_unitary_to_rot.py
+++ b/tests/transforms/test_unitary_to_rot.py
@@ -25,7 +25,7 @@ from pennylane import numpy as np
 from pennylane.wires import Wires
 from pennylane.transforms import unitary_to_rot
 
-from gate_data import I, Z, S, T, H, X
+from gate_data import I, Z, S, T, H, X, CNOT
 
 single_qubit_decomps = [
     # First set of gates are diagonal and converted to RZ
@@ -76,6 +76,28 @@ class TestDecomposeSingleQubitUnitaryTransform:
         assert isinstance(ops[2], qml.CNOT)
         assert ops[2].wires == Wires(["b", "a"])
 
+    def test_unitary_to_rot_too_big_unitary(self):
+        """Test that the transform ignores QubitUnitary instances that are too big
+        to decompose."""
+
+        tof = qml.Toffoli(wires=[0, 1, 2]).matrix
+
+        def qfunc():
+            qml.QubitUnitary(H, wires="a")
+            qml.QubitUnitary(tof, wires=["a", "b", "c"])
+
+        transformed_qfunc = unitary_to_rot(qfunc)
+
+        ops = qml.transforms.make_tape(transformed_qfunc)().operations
+
+        assert len(ops) == 2
+
+        assert ops[0].name == "Rot"
+        assert ops[0].wires == Wires("a")
+
+        assert ops[1].name == "QubitUnitary"
+        assert ops[1].wires == Wires(["a", "b", "c"])
+
     @pytest.mark.parametrize("U,expected_gate,expected_params", single_qubit_decomps)
     def test_unitary_to_rot_torch(self, U, expected_gate, expected_params):
         """Test that the transform works in the torch interface."""
@@ -162,15 +184,14 @@ def original_qfunc_for_grad(angles):
     return qml.expval(qml.PauliX(wires="a"))
 
 
-dev = qml.device("default.qubit", wires=["a", "b"])
-
 angle_pairs = [[0.3, 0.3], [np.pi, -0.65], [0.0, np.pi / 2], [np.pi / 3, 0.0]]
 diff_methods = ["parameter-shift", "backprop"]
 angle_diff_pairs = list(product(angle_pairs, diff_methods))
 
 
 class TestQubitUnitaryDifferentiability:
-    """Tests to ensure the transform is fully differentiable in all interfaces."""
+    """Tests to ensure the transform is fully differentiable in all interfaces for
+    single-qubit unitary decompositions."""
 
     @pytest.mark.parametrize("rot_angles,diff_method", angle_diff_pairs)
     def test_gradient_unitary_to_rot(self, rot_angles, diff_method):
@@ -192,6 +213,8 @@ class TestQubitUnitaryDifferentiability:
             qml.CNOT(wires=["b", "a"])
             return qml.expval(qml.PauliX(wires="a"))
 
+        dev = qml.device("default.qubit", wires=["a", "b"])
+
         original_qnode = qml.QNode(original_qfunc_for_grad, dev, diff_method=diff_method)
 
         transformed_qfunc = unitary_to_rot(qfunc_with_qubit_unitary)
@@ -236,6 +259,8 @@ class TestQubitUnitaryDifferentiability:
             qml.CNOT(wires=["b", "a"])
             return qml.expval(qml.PauliX(wires="a"))
 
+        dev = qml.device("default.qubit", wires=["a", "b"])
+
         original_qnode = qml.QNode(
             original_qfunc_for_grad, dev, interface="torch", diff_method=diff_method
         )
@@ -277,6 +302,8 @@ class TestQubitUnitaryDifferentiability:
             qml.CNOT(wires=["b", "a"])
             return qml.expval(qml.PauliX(wires="a"))
 
+        dev = qml.device("default.qubit", wires=["a", "b"])
+
         original_qnode = qml.QNode(
             original_qfunc_for_grad, dev, interface="tf", diff_method=diff_method
         )
@@ -335,6 +362,8 @@ class TestQubitUnitaryDifferentiability:
         # Setting the dtype to complex64 causes the gradients to be complex...
         input = jnp.array(rot_angles, dtype=jnp.float64)
 
+        dev = qml.device("default.qubit", wires=["a", "b"])
+
         original_qnode = qml.QNode(
             original_qfunc_for_grad, dev, interface="jax", diff_method=diff_method
         )
@@ -350,3 +379,245 @@ class TestQubitUnitaryDifferentiability:
         original_grad = jax.grad(original_qnode)(input)
         transformed_grad = jax.grad(transformed_qnode)(input)
         assert qml.math.allclose(original_grad, transformed_grad, atol=1e-7)
+
+
+test_two_qubit_unitaries = [
+    # A tensor product of two operations
+    [
+        [
+            0.51742037 - 0.16042302j,
+            0.07680202 - 0.28311161j,
+            0.66362912 - 0.19848275j,
+            0.10182857 - 0.36100112j,
+        ],
+        [
+            -0.29215476 - 0.02638805j,
+            0.33026208 - 0.42940231j,
+            -0.37321002 - 0.03748534j,
+            0.42777752 - 0.5447985j,
+        ],
+        [
+            -0.44919555 + 0.52727826j,
+            0.11071838 + 0.35837454j,
+            0.35541834 - 0.40882416j,
+            -0.0837747 - 0.28112725j,
+        ],
+        [
+            0.33365392 - 0.1713649j,
+            -0.06300143 + 0.6898042j,
+            -0.26227059 + 0.13139584j,
+            0.05467804 - 0.53895241j,
+        ],
+    ],
+    # Random U(4) element
+    [
+        [
+            -0.3391864 - 0.43678034j,
+            -0.47208404 + 0.56615881j,
+            -0.00288397 + 0.24379941j,
+            0.16979202 - 0.25000116j,
+        ],
+        [
+            0.0637868 + 0.3811654j,
+            0.1506196 + 0.12326944j,
+            -0.59267381 + 0.03717299j,
+            0.60727811 - 0.30221148j,
+        ],
+        [
+            -0.6438983 - 0.34218612j,
+            0.21084496 - 0.55082361j,
+            -0.27556931 - 0.01759285j,
+            -0.02951992 - 0.20813943j,
+        ],
+        [
+            -0.06525306 + 0.09415611j,
+            -0.04020311 - 0.2631363j,
+            0.71028402 - 0.08460563j,
+            0.55558715 - 0.30932357j,
+        ],
+    ],
+]
+
+
+class TestTwoQubitUnitaryDifferentiability:
+    """Tests to ensure the transform is fully differentiable in all interfaces
+    when the circuit contains two-qubit QubitUnitary operations.
+
+    Note that we are not testing whether we can differentiate w.r.t. the two-qubit
+    unitary itself, but rather that the entire pipeline remains differentiable even
+    when we are decomposing two-qubit unitaries within.
+    """
+
+    @pytest.mark.parametrize("diff_method", ["parameter-shift", "backprop"])
+    def test_gradient_unitary_to_rot_two_qubit(self, diff_method):
+        """Tests differentiability in autograd interface."""
+        U0 = np.array(test_two_qubit_unitaries[0], requires_grad=False, dtype=np.complex128)
+        U1 = np.array(test_two_qubit_unitaries[1], requires_grad=False, dtype=np.complex128)
+
+        def two_qubit_decomp_qnode(x, y, z):
+            qml.RX(x, wires=0)
+            qml.RY(y, wires=1)
+            qml.QubitUnitary(U0, wires=[0, 1])
+            qml.RZ(z, wires=2)
+            qml.QubitUnitary(U1, wires=[1, 2])
+            return qml.expval(qml.PauliZ(0) @ qml.PauliZ(1) @ qml.PauliZ(2))
+
+        x = np.array(0.1, requires_grad=True)
+        y = np.array(0.2, requires_grad=True)
+        z = np.array(0.3, requires_grad=True)
+
+        dev = qml.device("default.qubit", wires=3)
+
+        original_qnode = qml.QNode(two_qubit_decomp_qnode, device=dev, diff_method=diff_method)
+
+        transformed_qfunc = unitary_to_rot(two_qubit_decomp_qnode)
+        transformed_qnode = qml.QNode(transformed_qfunc, dev, diff_method=diff_method)
+
+        assert qml.math.allclose(original_qnode(x, y, z), transformed_qnode(x, y, z))
+
+        # 3 normal operations + 10 for the first decomp and 2 for the second
+        assert len(transformed_qnode.qtape.operations) == 15
+
+        original_grad = qml.grad(original_qnode)(x, y, z)
+        transformed_grad = qml.grad(transformed_qnode)(x, y, z)
+
+        assert qml.math.allclose(original_grad, transformed_grad, atol=1e-6)
+
+    def test_gradient_unitary_to_rot_torch_two_qubit(self):
+        """Tests differentiability in torch interface."""
+        torch = pytest.importorskip("torch")
+
+        U0 = torch.tensor(test_two_qubit_unitaries[0], requires_grad=False, dtype=torch.complex128)
+        U1 = torch.tensor(test_two_qubit_unitaries[1], requires_grad=False, dtype=torch.complex128)
+
+        def two_qubit_decomp_qnode(x, y, z):
+            qml.RX(x, wires=0)
+            qml.RY(y, wires=1)
+            qml.QubitUnitary(U0, wires=[0, 1])
+            qml.RZ(z, wires=2)
+            qml.QubitUnitary(U1, wires=[1, 2])
+            return qml.expval(qml.PauliZ(0) @ qml.PauliZ(1) @ qml.PauliZ(2))
+
+        x = torch.tensor(0.1, requires_grad=True)
+        y = torch.tensor(0.2, requires_grad=True)
+        z = torch.tensor(0.3, requires_grad=True)
+
+        transformed_x = torch.tensor(0.1, requires_grad=True)
+        transformed_y = torch.tensor(0.2, requires_grad=True)
+        transformed_z = torch.tensor(0.3, requires_grad=True)
+
+        dev = qml.device("default.qubit", wires=3)
+
+        original_qnode = qml.QNode(
+            two_qubit_decomp_qnode, device=dev, interface="torch", diff_method="parameter-shift"
+        )
+
+        transformed_qfunc = unitary_to_rot(two_qubit_decomp_qnode)
+        transformed_qnode = qml.QNode(
+            transformed_qfunc, dev, interface="torch", diff_method="parameter-shift"
+        )
+
+        original_result = original_qnode(x, y, z)
+
+        transformed_result = transformed_qnode(transformed_x, transformed_y, transformed_z)
+
+        assert qml.math.allclose(original_result, transformed_result)
+
+        assert len(transformed_qnode.qtape.operations) == 15
+
+        original_result.backward()
+        transformed_result.backward()
+
+        assert qml.math.allclose(x.grad, transformed_x.grad)
+
+    @pytest.mark.parametrize("diff_method", ["parameter-shift", "backprop"])
+    def test_gradient_unitary_to_rot_tf_two_qubits(self, diff_method):
+        """Tests differentiability in tensorflow interface."""
+        tf = pytest.importorskip("tensorflow")
+
+        # We have to mark these as constant, otherwise it will try to
+        # differentiate with respect to them.
+        U0 = tf.constant(test_two_qubit_unitaries[0], dtype=tf.complex128)
+        U1 = tf.constant(test_two_qubit_unitaries[1], dtype=tf.complex128)
+
+        def two_qubit_decomp_qnode(x):
+            qml.RX(x, wires=0)
+            qml.QubitUnitary(U0, wires=[0, 1])
+            qml.QubitUnitary(U1, wires=[1, 2])
+            return qml.expval(qml.PauliZ(0) @ qml.PauliZ(1) @ qml.PauliZ(2))
+
+        x = tf.Variable(0.1, dtype=tf.float64)
+
+        transformed_x = tf.Variable(0.1, dtype=tf.float64)
+
+        dev = qml.device("default.qubit", wires=3)
+
+        original_qnode = qml.QNode(
+            two_qubit_decomp_qnode, dev, interface="tf", diff_method=diff_method
+        )
+
+        original_result = original_qnode(x)
+
+        transformed_qfunc = unitary_to_rot(two_qubit_decomp_qnode)
+        transformed_qnode = qml.QNode(
+            transformed_qfunc, dev, interface="tf", diff_method=diff_method
+        )
+
+        transformed_result = transformed_qnode(transformed_x)
+
+        assert qml.math.allclose(original_result, transformed_result)
+
+        assert len(transformed_qnode.qtape.operations) == 13
+
+        with tf.GradientTape() as tape:
+            loss = original_qnode(x)
+        original_grad = tape.gradient(loss, x)
+
+        with tf.GradientTape() as tape:
+            loss = transformed_qnode(transformed_x)
+        transformed_grad = tape.gradient(loss, transformed_x)
+
+        # For 64bit values, need to slightly increase the tolerance threshold
+        assert qml.math.allclose(original_grad, transformed_grad, atol=1e-7)
+
+    def test_gradient_unitary_to_rot_two_qubit_jax(self):
+        """Tests differentiability in jax interface."""
+        jax = pytest.importorskip("jax")
+        from jax import numpy as jnp
+
+        from jax.config import config
+
+        remember = config.read("jax_enable_x64")
+        config.update("jax_enable_x64", True)
+
+        U0 = jnp.array(test_two_qubit_unitaries[0], dtype=jnp.complex128)
+        U1 = jnp.array(test_two_qubit_unitaries[1], dtype=jnp.complex128)
+
+        def two_qubit_decomp_qnode(x):
+            qml.RX(x, wires=0)
+            qml.QubitUnitary(U0, wires=[0, 1])
+            qml.QubitUnitary(U1, wires=[1, 2])
+            return qml.expval(qml.PauliZ(0) @ qml.PauliZ(1) @ qml.PauliZ(2))
+
+        x = jnp.array(0.1, dtype=jnp.float64)
+
+        dev = qml.device("default.qubit", wires=3)
+
+        original_qnode = qml.QNode(
+            two_qubit_decomp_qnode, device=dev, interface="jax", diff_method="backprop"
+        )
+
+        transformed_qfunc = unitary_to_rot(two_qubit_decomp_qnode)
+        transformed_qnode = qml.QNode(
+            transformed_qfunc, dev, interface="jax", diff_method="backprop"
+        )
+
+        assert qml.math.allclose(original_qnode(x), transformed_qnode(x))
+
+        # 3 normal operations + 10 for the first decomp and 2 for the second
+        assert len(transformed_qnode.qtape.operations) == 13
+
+        original_grad = jax.grad(original_qnode, argnums=(0))(x)
+        transformed_grad = jax.grad(transformed_qnode, argnums=(0))(x)
+
+        assert qml.math.allclose(original_grad, transformed_grad, atol=1e-6)