[Sugar-devel] [PATCH sugar v2] Add Control Panel for proxy settings

Sascha Silbe silbe at activitycentral.com
Tue Jan 24 15:56:29 EST 2012


From: Aleksey Lim <alsroot at activitycentral.org>

Both individual users and deployments need to be able to set a proxy for
Sugar and activities to use. While we'd like the system to work that all
out automatically (e.g. using WPAD [1]), this often isn't possible. Common
reasons include legacy ("inherited") setups and network uplinks simply being
out of control of the user respectively deployment.

For consistency between Sugar and Gnome (and to the benefit of existing users
who currently switch to Gnome to change proxy settings), the layout of the
Gnome proxy settings dialog has been mirrored as much as possible.

[1] https://en.wikipedia.org/wiki/Web_Proxy_Autodiscovery_Protocol

Signed-off-by: Anish Mangal <anish at sugarlabs.org>
[replaced description; merged fix-up patches from Aleksey; style fixes;
 added WPAD hint; fixed needs_restart defaults bug]
Signed-off-by: Sascha Silbe <silbe at activitycentral.com>
---
v1->v2: several bug and style fixes, added WPAD hint and line breaking
        for labels, replaced description. No (other) changes to the
	layout.

 configure.ac                           |    1 +
 data/icons/Makefile.am                 |    1 +
 data/icons/module-proxy.svg            |  361 +++++++++++++++++++++++++++++
 extensions/cpsection/Makefile.am       |    2 +-
 extensions/cpsection/proxy/Makefile.am |    6 +
 extensions/cpsection/proxy/__init__.py |   21 ++
 extensions/cpsection/proxy/model.py    |    2 +
 extensions/cpsection/proxy/view.py     |  394 ++++++++++++++++++++++++++++++++
 8 files changed, 787 insertions(+), 1 deletions(-)

diff --git a/configure.ac b/configure.ac
index f380d3e..9d0db4f 100644
--- a/configure.ac
+++ b/configure.ac
@@ -59,6 +59,7 @@ extensions/cpsection/modemconfiguration/Makefile
 extensions/cpsection/Makefile
 extensions/cpsection/network/Makefile
 extensions/cpsection/power/Makefile
+extensions/cpsection/proxy/Makefile
 extensions/cpsection/updater/backends/Makefile
 extensions/cpsection/updater/Makefile
 extensions/deviceicon/Makefile
diff --git a/data/icons/Makefile.am b/data/icons/Makefile.am
index a35643a..5a39ca3 100644
--- a/data/icons/Makefile.am
+++ b/data/icons/Makefile.am
@@ -10,6 +10,7 @@ sugar_DATA =                        \
 	module-modemconfiguration.svg	\
 	module-network.svg              \
 	module-power.svg                \
+	module-proxy.svg                \
 	module-updater.svg

 EXTRA_DIST = $(sugar_DATA)
diff --git a/data/icons/module-proxy.svg b/data/icons/module-proxy.svg
new file mode 100644
index 0000000..a22a7a8
--- /dev/null
+++ b/data/icons/module-proxy.svg
@@ -0,0 +1,361 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<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:xlink="http://www.w3.org/1999/xlink"
+   version="1.1"
+   width="55"
+   height="55"
+   id="svg3063">
+  <defs
+     id="defs3065">
+    <clipPath
+       id="SVGID_5_">
+      <use
+         id="use3018"
+         style="overflow:visible"
+         x="0"
+         y="0"
+         width="1"
+         height="1"
+         xlink:href="#SVGID_4_" />
+    </clipPath>
+    <clipPath
+       id="SVGID_5_-7">
+      <use
+         id="use3018-6"
+         style="overflow:visible"
+         x="0"
+         y="0"
+         width="1"
+         height="1"
+         xlink:href="#SVGID_4_" />
+    </clipPath>
+    <clipPath
+       id="SVGID_5_-1">
+      <use
+         id="use3018-4"
+         style="overflow:visible"
+         x="0"
+         y="0"
+         width="1"
+         height="1"
+         xlink:href="#SVGID_4_" />
+    </clipPath>
+    <clipPath
+       id="SVGID_5_-12">
+      <use
+         id="use3018-3"
+         style="overflow:visible"
+         x="0"
+         y="0"
+         width="1"
+         height="1"
+         xlink:href="#SVGID_4_" />
+    </clipPath>
+    <clipPath
+       id="SVGID_5_-3">
+      <use
+         id="use3018-41"
+         style="overflow:visible"
+         x="0"
+         y="0"
+         width="1"
+         height="1"
+         xlink:href="#SVGID_4_" />
+    </clipPath>
+    <clipPath
+       id="SVGID_5_-0">
+      <use
+         id="use3018-2"
+         style="overflow:visible"
+         x="0"
+         y="0"
+         width="1"
+         height="1"
+         xlink:href="#SVGID_4_" />
+    </clipPath>
+    <clipPath
+       id="SVGID_5_-8">
+      <use
+         id="use3018-65"
+         style="overflow:visible"
+         x="0"
+         y="0"
+         width="1"
+         height="1"
+         xlink:href="#SVGID_4_" />
+    </clipPath>
+    <clipPath
+       id="SVGID_5_-06">
+      <use
+         id="use3018-1"
+         style="overflow:visible"
+         x="0"
+         y="0"
+         width="1"
+         height="1"
+         xlink:href="#SVGID_4_" />
+    </clipPath>
+    <clipPath
+       id="SVGID_5_-82">
+      <use
+         id="use3018-9"
+         style="overflow:visible"
+         x="0"
+         y="0"
+         width="1"
+         height="1"
+         xlink:href="#SVGID_4_" />
+    </clipPath>
+    <defs
+       id="defs3508">
+      <path
+         d="m 23.589,42.098 c 10.277,0 18.616,-8.373 18.616,-18.645 0,-10.207 -8.338,-18.581 -18.616,-18.581 -10.206,0 -18.615,8.374 -18.615,18.581 0,10.272 8.41,18.645 18.615,18.645 z"
+         id="SVGID_3_" />
+    </defs>
+    <clipPath
+       id="SVGID_4_">
+      <use
+         id="use3512"
+         style="overflow:visible"
+         x="0"
+         y="0"
+         width="1"
+         height="1"
+         xlink:href="#SVGID_3_" />
+    </clipPath>
+    <radialGradient
+       cx="685.64899"
+       cy="995.40698"
+       r="96.022903"
+       id="SVGID_5_-4"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.315,0,0,0.315,-193.939,-303.123)">
+      <stop
+         id="stop3515"
+         style="stop-color:#ffffff;stop-opacity:1"
+         offset="0" />
+      <stop
+         id="stop3517"
+         style="stop-color:#57adff;stop-opacity:1"
+         offset="0.59549999" />
+      <stop
+         id="stop3519"
+         style="stop-color:#c9e6ff;stop-opacity:1"
+         offset="0.99440002" />
+    </radialGradient>
+    <linearGradient
+       x1="868.99597"
+       y1="-1149.41"
+       x2="868.99597"
+       y2="-1269.5601"
+       id="SVGID_6_"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.315,0,0,-0.315,-250.166,-358.406)">
+      <stop
+         id="stop3524"
+         style="stop-color:#006a00;stop-opacity:1"
+         offset="0" />
+      <stop
+         id="stop3526"
+         style="stop-color:#004000;stop-opacity:1"
+         offset="0.2" />
+      <stop
+         id="stop3528"
+         style="stop-color:#00bd00;stop-opacity:1"
+         offset="1" />
+    </linearGradient>
+    <radialGradient
+       cx="685.64899"
+       cy="995.40698"
+       r="96.022903"
+       id="radialGradient3603"
+       xlink:href="#SVGID_5_-4"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.315,0,0,0.315,-193.939,-303.123)" />
+  </defs>
+  <metadata
+     id="metadata3068">
+    <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
+     transform="matrix(0.09164839,0,0,0.09164839,-0.05430278,-41.447306)"
+     id="layer1">
+    <path
+       d="m 200.897,116.781 c -1.04,0 -2.184,0.428 -3.348,1.089 2.741,-0.802 4.03,-1.089 3.348,-1.089 m 67.869,13.235 0.677,-9.925 -10.473,0.655 1.382,9.27 h 8.414 M 150.528,301.594 c -2.113,-1.988 -0.699,-10.608 -0.699,-10.608 0,0 -31.488,-16.545 -65.767,-26.493 -4.227,-1.225 -2.091,-9.932 2.091,-13.23 l -1.387,-9.297 c -0.693,-4.622 7.005,-27.148 14.698,-29.12 7.699,-2 -0.705,13.235 -0.705,13.235 l -7.688,4.637 c 0,0 9.092,10.592 11.199,10.592 2.092,0 5.591,-5.31 5.591,-5.31 l -9.79,-6.604 9.091,-3.988 0.574,-3.489 1.528,-0.487 15.062,-22.809 c 10.407,-4.258 23.199,-9.535 24.824,-10.31 2.806,-1.316 22.387,-12.569 25.887,-15.213 3.51,-2.666 11.187,-1.988 13.982,-1.988 2.812,0 7,-1.333 7.698,-8.631 0.699,-7.281 3.5,-8.608 5.607,-6.615 2.102,1.967 -2.107,5.293 2.796,6.615 4.893,1.333 9.092,4.644 12.597,1.333 2.557,-2.422 -0.867,-5.186 -3.17,-7.271 h 38.846 l 4.205,-11.947 -9.097,-1.321 -33.596,-3.305 v -3.982 l -2.676,0.456 c 3.635,-19.987 25.236,-16.692
+8.972,-28.259 -0.986,-0.71 -15.213,22.418 -18.837,21.97 -6.562,-0.868 -15.029,-0.938 -16.833,1.197 -2.396,2.817 5.363,-9.688 12.038,-13.479 -7.964,2.346 -22.234,-4.903 -47.964,13.273 -8.701,6.15 -30.541,31.066 -39.528,40.645 -37.968,44.826 -41.029,83.175 -41.029,84.876 0,3.31 8.04,5.179 8.733,9.167 0.704,3.95 -13.29,17.218 -13.29,23.839 0,3.044 -7.005,36.114 8.381,77.496 13.647,39.257 40.054,73.879 43.445,76.046 l 9.725,-5.158 c 0,0 -16.091,-28.486 -16.784,-31.141 -0.693,-2.647 18.188,-41.068 27.295,-39.727 9.091,1.29 6.994,3.968 12.591,0.65 5.602,-3.292 9.096,-30.479 15.392,-33.113 6.301,-2.663 13.29,-5.969 12.596,-12.592 -0.729,-6.644 -24.513,-18.557 -26.604,-20.54 m 151.819,-194.755 -18.888,-6.626 3.5,10.608 15.388,-3.982 m -70.666,24.511 c 2.107,0 44.074,-27.81 39.881,-28.481 -4.188,-0.655 -4.887,0 -16.102,-1.327 -11.177,-1.322 -23.084,15.901 -25.875,18.562 -2.802,2.647 -1.859,11.246 2.096,11.246 m 192.63,199.731 5.42,-7.031 -5.42,-1.905
+ -4.062,5.104 -4.734,7.02 4.05,1.909 4.746,-5.097 m 23.687,22.995 -1.356,-10.228 h -8.785 l -0.682,7.659 -8.139,-1.269 -2.016,-8.3 -4.063,-2.559 -4.745,5.745 -4.735,-1.268 -1.366,4.452 5.428,1.301 v 41.479 l 19.159,4.615 c -0.445,0.759 -0.771,1.41 -0.879,1.756 -1.364,4.477 5.406,6.415 10.144,4.477 1.753,-0.705 12.797,-4.952 16.295,-13.283 4.879,-11.605 8.03,-28.314 8.877,-33.722 l -2.146,-4.693 -13.545,5.117 -7.466,-1.28 h 0.02 m -6.783,-169.88 c -30.978,-46.973 -105.41,-77.669 -105.41,-77.669 l -19.166,10.039 -2.722,-4.453 -6.761,-2.563 v 5.753 l 6.091,5.115 -4.053,1.912 -15.582,1.268 -35.211,19.158 3.381,15.322 -4.075,1.284 -2.015,3.186 11.512,17.223 0.671,5.759 -9.476,1.913 v 11.486 l -5.412,1.273 0.677,8.944 -46.058,31.938 1.355,17.852 c 3.38,4.475 29.798,31.293 29.798,31.293 0,0 30.464,1.263 37.237,-2.551 6.777,-3.831 2.025,3.831 4.068,5.748 2.016,1.923 2.709,15.322 4.724,16.601 2.038,1.271 0,8.923 2.709,11.502 2.71,2.534 2.71,33.19 2.71,33.19 0,0 16.252,27.445
+ 16.252,34.468 0,7.021 -0.683,6.382 12.189,5.742 12.863,-0.628 15.571,-5.742 18.281,-7.649 2.709,-1.908 2.709,-6.383 5.417,-10.229 2.731,-3.839 7.455,-18.499 13.556,-23.602 6.078,-5.126 22.343,-8.96 23.686,-17.879 1.356,-8.949 7.443,-15.972 7.443,-15.972 l 29.278,-30.968 -0.823,4.161 -0.671,15.95 8.81,-3.187 -0.672,-17.25 -3.154,-3.343 0.446,-0.487 c 0,0 -2.037,-3.831 -4.734,-3.831 -2.712,0 -18.974,3.831 -21.672,3.196 -2.711,-0.644 -14.228,-31.292 -16.253,-32.549 -2.039,-1.279 -14.889,-22.359 -14.889,-22.359 0,0 29.776,35.751 34.521,49.795 2.751,8.18 13.089,0.563 21.497,-7.97 l 2.222,5.429 5.407,-1.29 -0.671,-6.381 h 6.088 v 9.573 l -2.024,5.115 -0.694,8.29 5.429,5.119 2.71,-4.459 8.776,-8.311 10.162,-5.108 2.721,5.108 1.354,7.027 -2.709,7.655 -5.417,4.47 -2.708,11.491 v 5.743 l -6.091,-3.836 -0.671,-12.118 -8.8,0.648 -4.051,10.842 6.089,8.948 14.216,1.92 11.507,-10.868 1.354,-21.044 5.127,-6.766 c 3.337,8.576 5.722,17.548 5.722,25.914 0,9.167 7.259,-4.628 3.707,-32.583
+ 0.003,-0.001 -5.567,-66.402 -36.255,-97.088 z m -135.423,27.505 -36.561,-1.294 15.56,-12.759 h 8.127 l 12.874,8.928 v 5.125 m 44.706,-4.469 v 5.743 h -15.569 l 1.354,3.841 -9.493,1.289 -0.66,3.169 -6.772,-1.256 -12.2,-2.568 2.038,-3.181 2.037,-3.846 6.771,-7.022 2.72,5.115 10.142,-0.646 5.418,-5.754 20.999,3.836 -6.785,1.28 m 1.345,-8.305 -8.128,1.273 -1.343,-5.753 10.143,-1.268 1.366,-5.743 7.454,7.666 -9.492,3.814 v 0.011 m 39.289,198.535 -4.746,3.837 0.674,9.579 h 6.088 v -8.278 l 5.441,-7.043 v -14.672 l -3.404,-0.662 -4.053,17.239 0,0 m -45.369,-19.135 c 0,0 -4.746,1.234 0.662,3.185 5.418,1.93 27.09,-31.271 27.09,-31.271 l -18.291,11.487 -9.472,16.6 h 0.011 m -36.862,122.355 -4.052,-3.858 -8.127,-1.289 -1.343,3.869 -10.836,-1.278 -0.681,-5.135 h -8.123 l -8.798,5.135 h -15.56 l -1.355,-3.856 -25.041,-2.59 -4.063,3.867 -10.138,-2.556 -1.359,-9.016 -4.735,-0.661 -5.418,9.677 -18.273,-0.65 c 3.272,1.538 30.551,17.824 72.403,21.214 55.5,4.487 81.896,-8.991 81.896,-8.991
+l -2.025,-1.951
+-24.371,-1.918 v -0.013 l -10e-4,0 z"
+       transform="matrix(1.1261275,0,0,1.1261275,592.13313,769.48419)"
+       clip-path="url(#SVGID_5_-12)"
+       id="path3315"
+       style="fill:#000000" />
+    <path
+       d="m 200.897,116.781 c -1.04,0 -2.184,0.428 -3.348,1.089 2.741,-0.802 4.03,-1.089 3.348,-1.089 m 67.869,13.235 0.677,-9.925 -10.473,0.655 1.382,9.27 h 8.414 M 150.528,301.594 c -2.113,-1.988 -0.699,-10.608 -0.699,-10.608 0,0 -31.488,-16.545 -65.767,-26.493 -4.227,-1.225 -2.091,-9.932 2.091,-13.23 l -1.387,-9.297 c -0.693,-4.622 7.005,-27.148 14.698,-29.12 7.699,-2 -0.705,13.235 -0.705,13.235 l -7.688,4.637 c 0,0 9.092,10.592 11.199,10.592 2.092,0 5.591,-5.31 5.591,-5.31 l -9.79,-6.604 9.091,-3.988 0.574,-3.489 1.528,-0.487 15.062,-22.809 c 10.407,-4.258 23.199,-9.535 24.824,-10.31 2.806,-1.316 22.387,-12.569 25.887,-15.213 3.51,-2.666 11.187,-1.988 13.982,-1.988 2.812,0 7,-1.333 7.698,-8.631 0.699,-7.281 3.5,-8.608 5.607,-6.615 2.102,1.967 -2.107,5.293 2.796,6.615 4.893,1.333 9.092,4.644 12.597,1.333 2.557,-2.422 -0.867,-5.186 -3.17,-7.271 h 38.846 l 4.205,-11.947 -9.097,-1.321 -33.596,-3.305 v -3.982 l -2.676,0.456 c 3.635,-19.987 25.236,-16.692 8.972,-28.259 -0.986,-0.71
+-15.213,22.418 -18.837,21.97 -6.562,-0.868 -15.029,-0.938 -16.833,1.197 -2.396,2.817 5.363,-9.688 12.038,-13.479 -7.964,2.346 -22.234,-4.903 -47.964,13.273 -8.701,6.15 -30.541,31.066 -39.528,40.645 -37.968,44.826 -41.029,83.175 -41.029,84.876 0,3.31 8.04,5.179 8.733,9.167 0.704,3.95 -13.29,17.218 -13.29,23.839 0,3.044 -7.005,36.114 8.381,77.496 13.647,39.257 40.054,73.879 43.445,76.046 l 9.725,-5.158 c 0,0 -16.091,-28.486 -16.784,-31.141 -0.693,-2.647 18.188,-41.068 27.295,-39.727 9.091,1.29 6.994,3.968 12.591,0.65 5.602,-3.292 9.096,-30.479 15.392,-33.113 6.301,-2.663 13.29,-5.969 12.596,-12.592 -0.729,-6.644 -24.513,-18.557 -26.604,-20.54 m 151.819,-194.755 -18.888,-6.626 3.5,10.608 15.388,-3.982 m -70.666,24.511 c 2.107,0 44.074,-27.81 39.881,-28.481 -4.188,-0.655 -4.887,0 -16.102,-1.327 -11.177,-1.322 -23.084,15.901 -25.875,18.562 -2.802,2.647 -1.859,11.246 2.096,11.246 m 192.63,199.731 5.42,-7.031 -5.42,-1.905 -4.062,5.104 -4.734,7.02 4.05,1.909 4.746,-5.097
+ m 23.687,22.995 -1.356,-10.228 h -8.785 l -0.682,7.659 -8.139,-1.269 -2.016,-8.3 -4.063,-2.559 -4.745,5.745 -4.735,-1.268 -1.366,4.452 5.428,1.301 v 41.479 l 19.159,4.615 c -0.445,0.759 -0.771,1.41 -0.879,1.756 -1.364,4.477 5.406,6.415 10.144,4.477 1.753,-0.705 12.797,-4.952 16.295,-13.283 4.879,-11.605 8.03,-28.314 8.877,-33.722 l -2.146,-4.693 -13.545,5.117 -7.466,-1.28 h 0.02 m -6.783,-169.88 c -30.978,-46.973 -105.41,-77.669 -105.41,-77.669 l -19.166,10.039 -2.722,-4.453 -6.761,-2.563 v 5.753 l 6.091,5.115 -4.053,1.912 -15.582,1.268 -35.211,19.158 3.381,15.322 -4.075,1.284 -2.015,3.186 11.512,17.223 0.671,5.759 -9.476,1.913 v 11.486 l -5.412,1.273 0.677,8.944 -46.058,31.938 1.355,17.852 c 3.38,4.475 29.798,31.293 29.798,31.293 0,0 30.464,1.263 37.237,-2.551 6.777,-3.831 2.025,3.831 4.068,5.748 2.016,1.923 2.709,15.322 4.724,16.601 2.038,1.271 0,8.923 2.709,11.502 2.71,2.534 2.71,33.19 2.71,33.19 0,0 16.252,27.445 16.252,34.468 0,7.021 -0.683,6.382 12.189,5.742 12.863,-0.628
+15.571,-5.742 18.281,-7.649 2.709,-1.908 2.709,-6.383 5.417,-10.229 2.731,-3.839 7.455,-18.499 13.556,-23.602 6.078,-5.126 22.343,-8.96 23.686,-17.879 1.356,-8.949 7.443,-15.972 7.443,-15.972 l 29.278,-30.968 -0.823,4.161 -0.671,15.95 8.81,-3.187 -0.672,-17.25 -3.154,-3.343 0.446,-0.487 c 0,0 -2.037,-3.831 -4.734,-3.831 -2.712,0 -18.974,3.831 -21.672,3.196 -2.711,-0.644 -14.228,-31.292 -16.253,-32.549 -2.039,-1.279 -14.889,-22.359 -14.889,-22.359 0,0 29.776,35.751 34.521,49.795 2.751,8.18 13.089,0.563 21.497,-7.97 l 2.222,5.429 5.407,-1.29 -0.671,-6.381 h 6.088 v 9.573 l -2.024,5.115 -0.694,8.29 5.429,5.119 2.71,-4.459 8.776,-8.311 10.162,-5.108 2.721,5.108 1.354,7.027 -2.709,7.655 -5.417,4.47 -2.708,11.491 v 5.743 l -6.091,-3.836 -0.671,-12.118 -8.8,0.648 -4.051,10.842 6.089,8.948 14.216,1.92 11.507,-10.868 1.354,-21.044 5.127,-6.766 c 3.337,8.576 5.722,17.548 5.722,25.914 0,9.167 7.259,-4.628 3.707,-32.583 0.003,-0.001 -5.567,-66.402 -36.255,-97.088 z m -135.423,27.505
+ -36.561,-1.294 15.56,-12.759 h 8.127 l 12.874,8.928 v 5.125 m 44.706,-4.469 v 5.743 h -15.569 l 1.354,3.841 -9.493,1.289 -0.66,3.169 -6.772,-1.256 -12.2,-2.568 2.038,-3.181 2.037,-3.846 6.771,-7.022 2.72,5.115 10.142,-0.646 5.418,-5.754 20.999,3.836 -6.785,1.28 m 1.345,-8.305 -8.128,1.273 -1.343,-5.753 10.143,-1.268 1.366,-5.743 7.454,7.666 -9.492,3.814 v 0.011 m 39.289,198.535 -4.746,3.837 0.674,9.579 h 6.088 v -8.278 l 5.441,-7.043 v -14.672 l -3.404,-0.662 -4.053,17.239 0,0 m -45.369,-19.135 c 0,0 -4.746,1.234 0.662,3.185 5.418,1.93 27.09,-31.271 27.09,-31.271 l -18.291,11.487 -9.472,16.6 h 0.011 m -36.862,122.355 -4.052,-3.858 -8.127,-1.289 -1.343,3.869 -10.836,-1.278 -0.681,-5.135 h -8.123 l -8.798,5.135 h -15.56 l -1.355,-3.856 -25.041,-2.59 -4.063,3.867 -10.138,-2.556 -1.359,-9.016 -4.735,-0.661 -5.418,9.677 -18.273,-0.65 c 3.272,1.538 30.551,17.824 72.403,21.214 55.5,4.487 81.896,-8.991 81.896,-8.991 l -2.025,-1.951 -24.371,-1.918 v -0.013 l -10e-4,0 z"
+       transform="matrix(1.1261275,0,0,1.1261275,-123.16579,191.65755)"
+       clip-path="url(#SVGID_5_-3)"
+       id="path3315-1"
+       style="fill:#000000" />
+    <path
+       d="m 200.897,116.781 c -1.04,0 -2.184,0.428 -3.348,1.089 2.741,-0.802 4.03,-1.089 3.348,-1.089 m 67.869,13.235 0.677,-9.925 -10.473,0.655 1.382,9.27 h 8.414 M 150.528,301.594 c -2.113,-1.988 -0.699,-10.608 -0.699,-10.608 0,0 -31.488,-16.545 -65.767,-26.493 -4.227,-1.225 -2.091,-9.932 2.091,-13.23 l -1.387,-9.297 c -0.693,-4.622 7.005,-27.148 14.698,-29.12 7.699,-2 -0.705,13.235 -0.705,13.235 l -7.688,4.637 c 0,0 9.092,10.592 11.199,10.592 2.092,0 5.591,-5.31 5.591,-5.31 l -9.79,-6.604 9.091,-3.988 0.574,-3.489 1.528,-0.487 15.062,-22.809 c 10.407,-4.258 23.199,-9.535 24.824,-10.31 2.806,-1.316 22.387,-12.569 25.887,-15.213 3.51,-2.666 11.187,-1.988 13.982,-1.988 2.812,0 7,-1.333 7.698,-8.631 0.699,-7.281 3.5,-8.608 5.607,-6.615 2.102,1.967 -2.107,5.293 2.796,6.615 4.893,1.333 9.092,4.644 12.597,1.333 2.557,-2.422 -0.867,-5.186 -3.17,-7.271 h 38.846 l 4.205,-11.947 -9.097,-1.321 -33.596,-3.305 v -3.982 l -2.676,0.456 c 3.635,-19.987 25.236,-16.692 8.972,-28.259 -0.986,-0.71
+ -15.213,22.418 -18.837,21.97 -6.562,-0.868 -15.029,-0.938 -16.833,1.197 -2.396,2.817 5.363,-9.688 12.038,-13.479 -7.964,2.346 -22.234,-4.903 -47.964,13.273 -8.701,6.15 -30.541,31.066 -39.528,40.645 -37.968,44.826 -41.029,83.175 -41.029,84.876 0,3.31 8.04,5.179 8.733,9.167 0.704,3.95 -13.29,17.218 -13.29,23.839 0,3.044 -7.005,36.114 8.381,77.496 13.647,39.257 40.054,73.879 43.445,76.046 l 9.725,-5.158 c 0,0 -16.091,-28.486 -16.784,-31.141 -0.693,-2.647 18.188,-41.068 27.295,-39.727 9.091,1.29 6.994,3.968 12.591,0.65 5.602,-3.292 9.096,-30.479 15.392,-33.113 6.301,-2.663 13.29,-5.969 12.596,-12.592 -0.729,-6.644 -24.513,-18.557 -26.604,-20.54 m 151.819,-194.755 -18.888,-6.626 3.5,10.608 15.388,-3.982 m -70.666,24.511 c 2.107,0 44.074,-27.81 39.881,-28.481 -4.188,-0.655 -4.887,0 -16.102,-1.327 -11.177,-1.322 -23.084,15.901 -25.875,18.562 -2.802,2.647 -1.859,11.246 2.096,11.246 m 192.63,199.731 5.42,-7.031 -5.42,-1.905 -4.062,5.104 -4.734,7.02 4.05,1.909
+ 4.746,-5.097 m 23.687,22.995 -1.356,-10.228 h -8.785 l -0.682,7.659 -8.139,-1.269 -2.016,-8.3 -4.063,-2.559 -4.745,5.745 -4.735,-1.268 -1.366,4.452 5.428,1.301 v 41.479 l 19.159,4.615 c -0.445,0.759 -0.771,1.41 -0.879,1.756 -1.364,4.477 5.406,6.415 10.144,4.477 1.753,-0.705 12.797,-4.952 16.295,-13.283 4.879,-11.605 8.03,-28.314 8.877,-33.722 l -2.146,-4.693 -13.545,5.117 -7.466,-1.28 h 0.02 m -6.783,-169.88 c -30.978,-46.973 -105.41,-77.669 -105.41,-77.669 l -19.166,10.039 -2.722,-4.453 -6.761,-2.563 v 5.753 l 6.091,5.115 -4.053,1.912 -15.582,1.268 -35.211,19.158 3.381,15.322 -4.075,1.284 -2.015,3.186 11.512,17.223 0.671,5.759 -9.476,1.913 v 11.486 l -5.412,1.273 0.677,8.944 -46.058,31.938 1.355,17.852 c 3.38,4.475 29.798,31.293 29.798,31.293 0,0 30.464,1.263 37.237,-2.551 6.777,-3.831 2.025,3.831 4.068,5.748 2.016,1.923 2.709,15.322 4.724,16.601 2.038,1.271 0,8.923 2.709,11.502 2.71,2.534 2.71,33.19 2.71,33.19 0,0 16.252,27.445 16.252,34.468 0,7.021 -0.683,6.382
+ 12.189,5.742 12.863,-0.628 15.571,-5.742 18.281,-7.649 2.709,-1.908 2.709,-6.383 5.417,-10.229 2.731,-3.839 7.455,-18.499 13.556,-23.602 6.078,-5.126 22.343,-8.96 23.686,-17.879 1.356,-8.949 7.443,-15.972 7.443,-15.972 l 29.278,-30.968 -0.823,4.161 -0.671,15.95 8.81,-3.187 -0.672,-17.25 -3.154,-3.343 0.446,-0.487 c 0,0 -2.037,-3.831 -4.734,-3.831 -2.712,0 -18.974,3.831 -21.672,3.196 -2.711,-0.644 -14.228,-31.292 -16.253,-32.549 -2.039,-1.279 -14.889,-22.359 -14.889,-22.359 0,0 29.776,35.751 34.521,49.795 2.751,8.18 13.089,0.563 21.497,-7.97 l 2.222,5.429 5.407,-1.29 -0.671,-6.381 h 6.088 v 9.573 l -2.024,5.115 -0.694,8.29 5.429,5.119 2.71,-4.459 8.776,-8.311 10.162,-5.108 2.721,5.108 1.354,7.027 -2.709,7.655 -5.417,4.47 -2.708,11.491 v 5.743 l -6.091,-3.836 -0.671,-12.118 -8.8,0.648 -4.051,10.842 6.089,8.948 14.216,1.92 11.507,-10.868 1.354,-21.044 5.127,-6.766 c 3.337,8.576 5.722,17.548 5.722,25.914 0,9.167 7.259,-4.628 3.707,-32.583 0.003,-0.001 -5.567,-66.402 -36.255,-97.088
+z m -135.423,27.505 -36.561,-1.294 15.56,-12.759 h 8.127 l 12.874,8.928 v 5.125 m 44.706,-4.469 v 5.743 h -15.569 l 1.354,3.841 -9.493,1.289 -0.66,3.169 -6.772,-1.256 -12.2,-2.568 2.038,-3.181 2.037,-3.846 6.771,-7.022 2.72,5.115 10.142,-0.646 5.418,-5.754 20.999,3.836 -6.785,1.28 m 1.345,-8.305 -8.128,1.273 -1.343,-5.753 10.143,-1.268 1.366,-5.743 7.454,7.666 -9.492,3.814 v 0.011 m 39.289,198.535 -4.746,3.837 0.674,9.579 h 6.088 v -8.278 l 5.441,-7.043 v -14.672 l -3.404,-0.662 -4.053,17.239 0,0 m -45.369,-19.135 c 0,0 -4.746,1.234 0.662,3.185 5.418,1.93 27.09,-31.271 27.09,-31.271 l -18.291,11.487 -9.472,16.6 h 0.011 m -36.862,122.355 -4.052,-3.858 -8.127,-1.289 -1.343,3.869 -10.836,-1.278 -0.681,-5.135 h -8.123 l -8.798,5.135 h -15.56 l -1.355,-3.856 -25.041,-2.59 -4.063,3.867 -10.138,-2.556 -1.359,-9.016 -4.735,-0.661 -5.418,9.677 -18.273,-0.65 c 3.272,1.538 30.551,17.824 72.403,21.214 55.5,4.487 81.896,-8.991 81.896,-8.991 l -2.025,-1.951 -24.371,-1.918 v -0.013 l -10e-4,0 z"
+       transform="matrix(1.1261275,0,0,1.1261275,-123.16579,191.65755)"
+       clip-path="url(#SVGID_5_-0)"
+       id="path3315-4"
+       style="fill:#000000" />
+    <path
+       d="m 200.897,116.781 c -1.04,0 -2.184,0.428 -3.348,1.089 2.741,-0.802 4.03,-1.089 3.348,-1.089 m 67.869,13.235 0.677,-9.925 -10.473,0.655 1.382,9.27 h 8.414 M 150.528,301.594 c -2.113,-1.988 -0.699,-10.608 -0.699,-10.608 0,0 -31.488,-16.545 -65.767,-26.493 -4.227,-1.225 -2.091,-9.932 2.091,-13.23 l -1.387,-9.297 c -0.693,-4.622 7.005,-27.148 14.698,-29.12 7.699,-2 -0.705,13.235 -0.705,13.235 l -7.688,4.637 c 0,0 9.092,10.592 11.199,10.592 2.092,0 5.591,-5.31 5.591,-5.31 l -9.79,-6.604 9.091,-3.988 0.574,-3.489 1.528,-0.487 15.062,-22.809 c 10.407,-4.258 23.199,-9.535 24.824,-10.31 2.806,-1.316 22.387,-12.569 25.887,-15.213 3.51,-2.666 11.187,-1.988 13.982,-1.988 2.812,0 7,-1.333 7.698,-8.631 0.699,-7.281 3.5,-8.608 5.607,-6.615 2.102,1.967 -2.107,5.293 2.796,6.615 4.893,1.333 9.092,4.644 12.597,1.333 2.557,-2.422 -0.867,-5.186 -3.17,-7.271 h 38.846 l 4.205,-11.947 -9.097,-1.321 -33.596,-3.305 v -3.982 l -2.676,0.456 c 3.635,-19.987 25.236,-16.692 8.972,-28.259 -0.986,-0.71
+-15.213,22.418 -18.837,21.97 -6.562,-0.868 -15.029,-0.938 -16.833,1.197 -2.396,2.817 5.363,-9.688 12.038,-13.479 -7.964,2.346 -22.234,-4.903 -47.964,13.273 -8.701,6.15 -30.541,31.066 -39.528,40.645 -37.968,44.826 -41.029,83.175 -41.029,84.876 0,3.31 8.04,5.179 8.733,9.167 0.704,3.95 -13.29,17.218 -13.29,23.839 0,3.044 -7.005,36.114 8.381,77.496 13.647,39.257 40.054,73.879 43.445,76.046 l 9.725,-5.158 c 0,0 -16.091,-28.486 -16.784,-31.141 -0.693,-2.647 18.188,-41.068 27.295,-39.727 9.091,1.29 6.994,3.968 12.591,0.65 5.602,-3.292 9.096,-30.479 15.392,-33.113 6.301,-2.663 13.29,-5.969 12.596,-12.592 -0.729,-6.644 -24.513,-18.557 -26.604,-20.54 m 151.819,-194.755 -18.888,-6.626 3.5,10.608 15.388,-3.982 m -70.666,24.511 c 2.107,0 44.074,-27.81 39.881,-28.481 -4.188,-0.655 -4.887,0 -16.102,-1.327 -11.177,-1.322
+-23.084,15.901 -25.875,18.562 -2.802,2.647 -1.859,11.246 2.096,11.246 m 192.63,199.731 5.42,-7.031 -5.42,-1.905 -4.062,5.104 -4.734,7.02 4.05,1.909 4.746,-5.097 m 23.687,22.995 -1.356,-10.228 h -8.785 l -0.682,7.659 -8.139,-1.269 -2.016,-8.3 -4.063,-2.559 -4.745,5.745 -4.735,-1.268 -1.366,4.452 5.428,1.301 v 41.479 l 19.159,4.615 c -0.445,0.759 -0.771,1.41 -0.879,1.756 -1.364,4.477 5.406,6.415 10.144,4.477 1.753,-0.705 12.797,-4.952 16.295,-13.283 4.879,-11.605 8.03,-28.314 8.877,-33.722 l -2.146,-4.693 -13.545,5.117 -7.466,-1.28 h 0.02 m -6.783,-169.88 c -30.978,-46.973 -105.41,-77.669 -105.41,-77.669 l -19.166,10.039 -2.722,-4.453 -6.761,-2.563
+ v 5.753 l 6.091,5.115 -4.053,1.912 -15.582,1.268 -35.211,19.158 3.381,15.322 -4.075,1.284 -2.015,3.186 11.512,17.223 0.671,5.759 -9.476,1.913 v 11.486 l -5.412,1.273 0.677,8.944 -46.058,31.938 1.355,17.852 c 3.38,4.475 29.798,31.293 29.798,31.293 0,0 30.464,1.263 37.237,-2.551 6.777,-3.831 2.025,3.831 4.068,5.748 2.016,1.923 2.709,15.322 4.724,16.601 2.038,1.271 0,8.923 2.709,11.502 2.71,2.534 2.71,33.19 2.71,33.19 0,0 16.252,27.445 16.252,34.468 0,7.021 -0.683,6.382 12.189,5.742 12.863,-0.628 15.571,-5.742 18.281,-7.649 2.709,-1.908 2.709,-6.383 5.417,-10.229 2.731,-3.839 7.455,-18.499 13.556,-23.602 6.078,-5.126 22.343,-8.96 23.686,-17.879 1.356,-8.949 7.443,-15.972 7.443,-15.972 l 29.278,-30.968 -0.823,4.161 -0.671,15.95 8.81,-3.187 -0.672,-17.25 -3.154,-3.343 0.446,-0.487 c 0,0 -2.037,-3.831 -4.734,-3.831
+ -2.712,0 -18.974,3.831 -21.672,3.196 -2.711,-0.644 -14.228,-31.292 -16.253,-32.549 -2.039,-1.279 -14.889,-22.359 -14.889,-22.359 0,0 29.776,35.751 34.521,49.795 2.751,8.18 13.089,0.563 21.497,-7.97 l 2.222,5.429 5.407,-1.29 -0.671,-6.381 h 6.088 v 9.573 l -2.024,5.115 -0.694,8.29 5.429,5.119 2.71,-4.459 8.776,-8.311 10.162,-5.108 2.721,5.108 1.354,7.027 -2.709,7.655 -5.417,4.47 -2.708,11.491 v 5.743 l -6.091,-3.836 -0.671,-12.118 -8.8,0.648 -4.051,10.842 6.089,8.948 14.216,1.92 11.507,-10.868 1.354,-21.044 5.127,-6.766 c 3.337,8.576 5.722,17.548 5.722,25.914 0,9.167 7.259,-4.628 3.707,-32.583 0.003,-0.001 -5.567,-66.402 -36.255,-97.088
+ z m -135.423,27.505 -36.561,-1.294 15.56,-12.759 h 8.127 l 12.874,8.928 v 5.125 m 44.706,-4.469 v 5.743 h -15.569 l 1.354,3.841 -9.493,1.289 -0.66,3.169 -6.772,-1.256 -12.2,-2.568 2.038,-3.181 2.037,-3.846 6.771,-7.022 2.72,5.115 10.142,-0.646 5.418,-5.754 20.999,3.836 -6.785,1.28 m 1.345,-8.305 -8.128,1.273 -1.343,-5.753 10.143,-1.268 1.366,-5.743 7.454,7.666 -9.492,3.814 v 0.011 m 39.289,198.535 -4.746,3.837 0.674,9.579 h 6.088 v -8.278 l 5.441,-7.043 v -14.672 l -3.404,-0.662 -4.053,17.239 0,0 m -45.369,-19.135 c 0,0 -4.746,1.234 0.662,3.185 5.418,1.93 27.09,-31.271 27.09,-31.271 l -18.291,11.487 -9.472,16.6 h 0.011 m
+ -36.862,122.355 -4.052,-3.858 -8.127,-1.289 -1.343,3.869 -10.836,-1.278 -0.681,-5.135 h -8.123 l -8.798,5.135 h -15.56 l -1.355,-3.856 -25.041,-2.59 -4.063,3.867 -10.138,-2.556 -1.359,-9.016 -4.735,-0.661 -5.418,9.677 -18.273,-0.65 c 3.272,1.538 30.551,17.824 72.403,21.214 55.5,4.487 81.896,-8.991 81.896,-8.991 l -2.025,-1.951 -24.371,-1.918 v -0.013 l -10e-4,0 z"
+       transform="matrix(1.1261275,0,0,1.1261275,-123.16579,191.65755)"
+       clip-path="url(#SVGID_5_-8)"
+       id="path3315-0"
+       style="fill:#000000" />
+    <path
+       d="m 200.897,116.781 c -1.04,0 -2.184,0.428 -3.348,1.089 2.741,-0.802 4.03,-1.089 3.348,-1.089 m 67.869,13.235 0.677,-9.925 -10.473,0.655 1.382,9.27 h 8.414 M 150.528,301.594 c -2.113,-1.988 -0.699,-10.608 -0.699,-10.608 0,0 -31.488,-16.545 -65.767,-26.493 -4.227,-1.225 -2.091,-9.932 2.091,-13.23 l -1.387,-9.297 c -0.693,-4.622 7.005,-27.148 14.698,-29.12 7.699,-2 -0.705,13.235 -0.705,13.235 l -7.688,4.637 c 0,0 9.092,10.592 11.199,10.592 2.092,0 5.591,-5.31 5.591,-5.31 l -9.79,-6.604 9.091,-3.988 0.574,-3.489 1.528,-0.487 15.062,-22.809 c 10.407,-4.258 23.199,-9.535 24.824,-10.31 2.806,-1.316 22.387,-12.569 25.887,-15.213 3.51,-2.666 11.187,-1.988 13.982,-1.988 2.812,0 7,-1.333 7.698,-8.631 0.699,-7.281 3.5,-8.608 5.607,-6.615 2.102,1.967 -2.107,5.293 2.796,6.615 4.893,1.333 9.092,4.644 12.597,1.333 2.557,-2.422 -0.867,-5.186 -3.17,-7.271 h 38.846 l 4.205,-11.947 -9.097,-1.321 -33.596,-3.305 v -3.982 l -2.676,0.456 c 3.635,-19.987 25.236,-16.692 8.972,-28.259
+ -0.986,-0.71 -15.213,22.418 -18.837,21.97 -6.562,-0.868 -15.029,-0.938 -16.833,1.197 -2.396,2.817 5.363,-9.688 12.038,-13.479 -7.964,2.346 -22.234,-4.903 -47.964,13.273 -8.701,6.15 -30.541,31.066 -39.528,40.645 -37.968,44.826 -41.029,83.175 -41.029,84.876 0,3.31 8.04,5.179 8.733,9.167 0.704,3.95 -13.29,17.218 -13.29,23.839 0,3.044 -7.005,36.114 8.381,77.496 13.647,39.257 40.054,73.879 43.445,76.046 l 9.725,-5.158 c 0,0 -16.091,-28.486 -16.784,-31.141 -0.693,-2.647 18.188,-41.068 27.295,-39.727 9.091,1.29 6.994,3.968 12.591,0.65 5.602,-3.292 9.096,-30.479 15.392,-33.113 6.301,-2.663 13.29,-5.969 12.596,-12.592 -0.729,-6.644 -24.513,-18.557 -26.604,-20.54 m 151.819,-194.755 -18.888,-6.626 3.5,10.608 15.388,-3.982 m -70.666,24.511 c 2.107,0 44.074,-27.81 39.881,-28.481 -4.188,-0.655 -4.887,0 -16.102,-1.327 -11.177,-1.322 -23.084,15.901 -25.875,18.562 -2.802,2.647 -1.859,11.246 2.096,11.246 m 192.63,199.731 5.42,-7.031 -5.42,-1.905 -4.062,5.104 -4.734,7.02 4.05,1.909 4.746,-5.097
+ m 23.687,22.995 -1.356,-10.228 h -8.785 l -0.682,7.659 -8.139,-1.269 -2.016,-8.3 -4.063,-2.559 -4.745,5.745 -4.735,-1.268 -1.366,4.452 5.428,1.301 v 41.479 l 19.159,4.615 c -0.445,0.759 -0.771,1.41 -0.879,1.756 -1.364,4.477 5.406,6.415 10.144,4.477 1.753,-0.705 12.797,-4.952 16.295,-13.283 4.879,-11.605 8.03,-28.314 8.877,-33.722 l -2.146,-4.693 -13.545,5.117 -7.466,-1.28 h 0.02 m -6.783,-169.88 c -30.978,-46.973 -105.41,-77.669 -105.41,-77.669 l -19.166,10.039 -2.722,-4.453 -6.761,-2.563 v 5.753 l 6.091,5.115 -4.053,1.912 -15.582,1.268 -35.211,19.158 3.381,15.322 -4.075,1.284 -2.015,3.186 11.512,17.223 0.671,5.759 -9.476,1.913 v 11.486 l -5.412,1.273 0.677,8.944 -46.058,31.938 1.355,17.852 c 3.38,4.475 29.798,31.293 29.798,31.293 0,0 30.464,1.263 37.237,-2.551 6.777,-3.831 2.025,3.831 4.068,5.748
+ 2.016,1.923 2.709,15.322 4.724,16.601 2.038,1.271 0,8.923 2.709,11.502 2.71,2.534 2.71,33.19 2.71,33.19 0,0 16.252,27.445 16.252,34.468 0,7.021 -0.683,6.382 12.189,5.742 12.863,-0.628 15.571,-5.742 18.281,-7.649 2.709,-1.908 2.709,-6.383 5.417,-10.229 2.731,-3.839 7.455,-18.499 13.556,-23.602 6.078,-5.126 22.343,-8.96 23.686,-17.879 1.356,-8.949 7.443,-15.972 7.443,-15.972 l 29.278,-30.968 -0.823,4.161 -0.671,15.95 8.81,-3.187 -0.672,-17.25 -3.154,-3.343 0.446,-0.487 c 0,0 -2.037,-3.831 -4.734,-3.831 -2.712,0 -18.974,3.831 -21.672,3.196 -2.711,-0.644 -14.228,-31.292 -16.253,-32.549 -2.039,-1.279 -14.889,-22.359 -14.889,-22.359 0,0 29.776,35.751 34.521,49.795 2.751,8.18 13.089,0.563 21.497,-7.97 l 2.222,5.429 5.407,-1.29 -0.671,-6.381 h 6.088 v 9.573 l -2.024,5.115 -0.694,8.29 5.429,5.119 2.71,-4.459
+ 8.776,-8.311 10.162,-5.108 2.721,5.108 1.354,7.027 -2.709,7.655 -5.417,4.47 -2.708,11.491 v 5.743 l -6.091,-3.836 -0.671,-12.118 -8.8,0.648 -4.051,10.842 6.089,8.948 14.216,1.92 11.507,-10.868 1.354,-21.044 5.127,-6.766 c 3.337,8.576 5.722,17.548 5.722,25.914 0,9.167 7.259,-4.628 3.707,-32.583 0.003,-0.001 -5.567,-66.402 -36.255,-97.088 z m -135.423,27.505 -36.561,-1.294 15.56,-12.759 h 8.127 l 12.874,8.928 v 5.125 m 44.706,-4.469 v 5.743 h -15.569 l 1.354,3.841 -9.493,1.289 -0.66,3.169 -6.772,-1.256 -12.2,-2.568 2.038,-3.181 2.037,-3.846 6.771,-7.022 2.72,5.115 10.142,-0.646 5.418,-5.754 20.999,3.836 -6.785,1.28 m 1.345,-8.305 -8.128,1.273 -1.343,-5.753 10.143,-1.268 1.366,-5.743 7.454,7.666 -9.492,3.814 v 0.011 m 39.289,198.535 -4.746,3.837 0.674,9.579 h 6.088 v -8.278 l 5.441,-7.043 v -14.672
+ l -3.404,-0.662 -4.053,17.239 0,0 m -45.369,-19.135 c 0,0 -4.746,1.234 0.662,3.185 5.418,1.93 27.09,-31.271 27.09,-31.271 l -18.291,11.487 -9.472,16.6 h 0.011 m -36.862,122.355 -4.052,-3.858 -8.127,-1.289 -1.343,3.869 -10.836,-1.278 -0.681,-5.135 h -8.123 l -8.798,5.135 h -15.56 l -1.355,-3.856 -25.041,-2.59 -4.063,3.867 -10.138,-2.556 -1.359,-9.016 -4.735,-0.661 -5.418,9.677 -18.273,-0.65 c 3.272,1.538 30.551,17.824 72.403,21.214 55.5,4.487 81.896,-8.991 81.896,-8.991 l -2.025,-1.951 -24.371,-1.918 v -0.013 l -10e-4,0 z"
+       transform="matrix(1.1261275,0,0,1.1261275,-104.21727,237.13399)"
+       clip-path="url(#SVGID_5_-06)"
+       id="path3315-3"
+       style="fill:#ff00ff" />
+    <radialGradient
+       cx="24.223101"
+       cy="24.3286"
+       r="20.4727"
+       id="SVGID_1_"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(7.6562887,0,0,7.6562887,-72.160001,452.7993)">
+      <stop
+         id="stop3491"
+         style="stop-color:#000000;stop-opacity:0.40000001"
+         offset="0.94760001" />
+      <stop
+         id="stop3493"
+         style="stop-color:#000000;stop-opacity:0"
+         offset="1" />
+    </radialGradient>
+    <linearGradient
+       x1="625.57001"
+       y1="1036.85"
+       x2="755.56299"
+       y2="1036.85"
+       id="SVGID_2_"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(2.4117309,0,0,2.4117309,-1392.3581,-2431.4769)">
+      <stop
+         id="stop3498"
+         style="stop-color:#0053bd;stop-opacity:1"
+         offset="0" />
+      <stop
+         id="stop3500"
+         style="stop-color:#0032a4;stop-opacity:1"
+         offset="0.99440002" />
+    </linearGradient>
+    <g
+       transform="matrix(1.9140664,0,0,1.9140664,-1228.1565,-289.91756)"
+       id="g3606"
+       style="fill:#ffffff;fill-opacity:1;stroke:none">
+      <path
+         d="m 798.36657,387.8025 c -41.59662,0 -80.86439,16.33954 -110.59375,46 -29.75234,29.67577 -46.15625,68.91869 -46.15625,110.5 0,86.562 70.31816,156.96875 156.75,156.96875 86.4395,0 156.78125,-70.40675 156.78125,-156.96875 0,-86.28638 -70.34175,-156.5 -156.78125,-156.5 z m 0,6.46875 c 82.87167,0 150.3125,67.31271 150.3125,150.03125 0,83.00182 -67.44083,150.53125 -150.3125,150.53125 -82.86401,0 -150.28125,-67.53708 -150.28125,-150.53125 0,-39.84333 15.72267,-77.44782 44.25,-105.90625 28.51202,-28.44311 66.16496,-44.125 106.03125,-44.125 z"
+         id="path3502"
+         style="fill:#ffffff;fill-opacity:1;stroke:none" />
+      <path
+         d="m 17.279,6.581 c -0.094,0 -0.197,0.039 -0.302,0.098 0.247,-0.073 0.363,-0.098 0.302,-0.098 m 6.117,1.192 0.061,-0.895 -0.944,0.059 0.125,0.835 h 0.758 M 12.739,23.237 c -0.19,-0.179 -0.063,-0.956 -0.063,-0.956 0,0 -2.838,-1.491 -5.927,-2.388 -0.381,-0.11 -0.188,-0.895 0.188,-1.192 L 6.812,17.863 c -0.063,-0.417 0.631,-2.447 1.325,-2.625 0.694,-0.18 -0.063,1.193 -0.063,1.193 l -0.693,0.418 c 0,0 0.819,0.955 1.009,0.955 0.188,0 0.504,-0.479 0.504,-0.479 L 8.012,16.73 8.831,16.371 8.883,16.057 9.021,16.013 10.378,13.957 c 0.938,-0.384 2.091,-0.859 2.237,-0.929 0.253,-0.119 2.018,-1.133 2.333,-1.371 0.316,-0.24 1.008,-0.179 1.26,-0.179 0.253,0 0.631,-0.12 0.694,-0.778 0.063,-0.656 0.315,-0.776 0.505,-0.596 0.189,0.177 -0.19,0.477 0.252,0.596 0.441,0.12 0.819,0.418 1.135,0.12 0.23,-0.218 -0.078,-0.467 -0.286,-0.655 h 3.501 L 22.388,9.088 21.568,8.969 18.542,8.67 V 8.312 L 18.3,8.353 C 18.628,6.552 20.574,6.849 19.109,5.806 19.02,5.742
+17.738,7.827 17.411,7.786 16.82,7.708 16.057,7.702 15.894,7.894 15.678,8.148 16.377,7.021 16.979,6.679 16.261,6.89 14.975,6.237 12.656,7.875 c -0.784,0.554 -2.752,2.8 -3.563,3.663 -3.422,4.04 -3.698,7.496 -3.698,7.649 0,0.298 0.725,0.467 0.787,0.826 0.063,0.356 -1.198,1.552 -1.198,2.148 0,0.274 -0.631,3.255 0.755,6.984 1.23,3.538 3.61,6.658 3.916,6.854 l 0.876,-0.465 c 0,0 -1.45,-2.567 -1.513,-2.807 -0.063,-0.238 1.639,-3.701 2.46,-3.58 0.819,0.116 0.63,0.357 1.135,0.059 0.505,-0.297 0.82,-2.747 1.387,-2.984 0.568,-0.24 1.198,-0.538 1.135,-1.135 -0.064,-0.598 -2.207,-1.671 -2.396,-1.85 M 26.422,5.685 24.72,5.087 25.035,6.043 26.422,5.685 m -6.369,2.209 c 0.19,0 3.972,-2.506 3.594,-2.567 -0.377,-0.059 -0.44,0 -1.451,-0.12 -1.007,-0.119 -2.081,1.433 -2.332,1.673 -0.252,0.239 -0.167,1.014 0.189,1.014 m 17.361,18.001 0.488,-0.634 -0.488,-0.172 -0.366,0.46 -0.427,0.633 0.365,0.172 0.428,-0.459 m 2.135,2.072 -0.122,-0.922 h -0.792 l -0.062,0.69 -0.733,-0.114
+ -0.182,-0.748 -0.366,-0.23 -0.428,0.518 -0.427,-0.114 -0.123,0.401 0.489,0.117 v 3.738 l 1.727,0.416 c -0.04,0.068 -0.069,0.127 -0.079,0.158 -0.123,0.403 0.487,0.578 0.914,0.403 0.158,-0.063 1.153,-0.446 1.469,-1.197 0.439,-1.046 0.724,-2.552 0.8,-3.039 l -0.193,-0.423 -1.221,0.461 -0.673,-0.115 h 0.002 M 38.938,12.656 c -2.792,-4.233 -9.5,-7 -9.5,-7 L 27.71,6.561 27.465,6.16 26.856,5.929 v 0.519 l 0.549,0.461 -0.365,0.172 -1.404,0.114 -3.173,1.727 0.305,1.381 -0.367,0.116 -0.182,0.287 1.038,1.552 0.061,0.519 -0.854,0.172 v 1.035 l -0.488,0.115 0.061,0.806 -4.151,2.878 0.122,1.609 c 0.305,0.403 2.686,2.82 2.686,2.82 0,0 2.746,0.114 3.356,-0.23 0.611,-0.345 0.183,0.345 0.367,0.518 0.182,0.173 0.244,1.381 0.426,1.496 0.184,0.115 0,0.804 0.244,1.037 0.244,0.229 0.244,2.991 0.244,2.991 0,0 1.465,2.474
+ 1.465,3.106 0,0.632 -0.062,0.575 1.099,0.518 1.159,-0.057 1.403,-0.518 1.647,-0.689 0.244,-0.171 0.244,-0.575 0.488,-0.922 0.246,-0.346 0.672,-1.667 1.222,-2.127 0.548,-0.462 2.014,-0.808 2.135,-1.611 0.122,-0.807 0.671,-1.439 0.671,-1.439 l 2.639,-2.791 -0.074,0.375 -0.061,1.438 0.794,-0.287 -0.061,-1.555 -0.284,-0.301 0.04,-0.044 c 0,0 -0.184,-0.345 -0.427,-0.345 -0.244,0 -1.71,0.345 -1.953,0.288 -0.244,-0.058 -1.282,-2.82 -1.465,-2.934 -0.184,-0.115 -1.342,-2.015 -1.342,-2.015 0,0 2.684,3.222 3.111,4.488 0.248,0.737 1.18,0.051 1.938,-0.718 l 0.2,0.489 0.487,-0.116 -0.061,-0.575 h 0.549 v 0.863 l -0.183,0.461 -0.063,0.747 0.489,0.461 0.244,-0.402 0.791,-0.749 0.916,-0.46 0.245,0.46 0.122,0.633 -0.244,0.69 -0.488,0.403 -0.244,1.036 v 0.518 l -0.549,-0.346 -0.061,-1.092 -0.793,0.059
+ -0.365,0.977 0.549,0.807 1.281,0.173 1.037,-0.979 0.122,-1.896 0.462,-0.61 c 0.301,0.773 0.516,1.582 0.516,2.335 0,0.826 0.654,-0.417 0.334,-2.937 -0.001,-0.003 -0.503,-5.987 -3.268,-8.753 z m -12.206,2.479 -3.295,-0.117 1.402,-1.15 h 0.732 l 1.16,0.805 v 0.462 m 4.031,-0.403 v 0.518 h -1.403 l 0.122,0.346 -0.855,0.116 -0.06,0.286 -0.61,-0.113 -1.1,-0.231 0.184,-0.287 0.184,-0.347 0.61,-0.633 0.245,0.461 0.914,-0.058 0.488,-0.519 1.893,0.346 -0.612,0.115 m 0.121,-0.748 -0.732,0.115 -0.121,-0.519 0.914,-0.114 0.123,-0.518 0.672,0.691 -0.856,0.345 0,0 m 3.541,17.893 -0.428,0.346 0.061,0.863 h 0.549 V 32.34 l 0.49,-0.635 v -1.322 l -0.307,-0.06 -0.365,1.554 0,0 m -4.089,-1.725 c 0,0 -0.428,0.111 0.06,0.287 0.488,0.174 2.441,-2.818 2.441,-2.818 l -1.648,1.035 -0.853,1.496 0,0 M 27.013,41.18 26.648,40.832
+25.916,40.716 25.795,41.065 24.818,40.95 24.756,40.487 h -0.732 l -0.793,0.463 h -1.402 l -0.122,-0.348 -2.257,-0.233 -0.366,0.349 -0.914,-0.23 -0.123,-0.813 -0.427,-0.06 -0.488,0.872 -1.647,-0.059 c 0.295,0.139 2.753,1.606 6.525,1.912 5.002,0.404 7.381,-0.811 7.381,-0.811 l -0.183,-0.176 -2.195,-0.173 0,0 0,0 z"
+         transform="matrix(7.6562887,0,0,7.6562887,617.77417,363.90588)"
+         clip-path="url(#SVGID_4_)"
+         id="path3530"
+         style="fill:#ffffff;fill-opacity:1;stroke:none" />
+    </g>
+    <linearGradient
+       x1="690.94098"
+       y1="977.15698"
+       x2="690.94098"
+       y2="1069.14"
+       id="SVGID_7_"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(2.4117309,0,0,2.4117309,-1790.3582,-1817.4903)">
+      <stop
+         id="stop3533"
+         style="stop-color:#ffffff;stop-opacity:1"
+         offset="0" />
+      <stop
+         id="stop3535"
+         style="stop-color:#94caff;stop-opacity:1"
+         offset="1" />
+    </linearGradient>
+    <linearGradient
+       x1="25.3057"
+       y1="5.1606002"
+       x2="19.853399"
+       y2="32.2952"
+       id="SVGID_8_"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(7.6562887,0,0,7.6562887,-188.32754,493.2054)">
+      <stop
+         id="stop3540"
+         style="stop-color:#ffffff;stop-opacity:1"
+         offset="0" />
+      <stop
+         id="stop3542"
+         style="stop-color:#00a100;stop-opacity:1"
+         offset="0.49720001" />
+      <stop
+         id="stop3544"
+         style="stop-color:#000000;stop-opacity:1"
+         offset="0.99440002" />
+    </linearGradient>
+    <g
+       transform="translate(501.9182,0)"
+       id="g3844">
+      <rect
+         width="227.90614"
+         height="227.90614"
+         ry="0"
+         x="-320.85956"
+         y="656.74127"
+         id="rect3805"
+         style="fill:#000000;fill-opacity:1;stroke:#ffffff;stroke-width:24.57014275;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+      <path
+         d="m -214.39085,651.34781 135.802859,-0.90944 0,232.96394 -136.712299,-58.35238 z"
+         id="rect3805-9"
+         style="fill:#ffffff;fill-opacity:1;stroke:#ffffff;stroke-width:27.06029701;stroke-miterlimit:4;stroke-opacity:1" />
+    </g>
+  </g>
+</svg>
diff --git a/extensions/cpsection/Makefile.am b/extensions/cpsection/Makefile.am
index a92b5dd..e45ee48 100644
--- a/extensions/cpsection/Makefile.am
+++ b/extensions/cpsection/Makefile.am
@@ -1,5 +1,5 @@
 SUBDIRS = aboutme aboutcomputer datetime frame keyboard language \
-    modemconfiguration network power updater
+    modemconfiguration network power proxy updater

 sugardir = $(pkgdatadir)/extensions/cpsection
 sugar_PYTHON = __init__.py
diff --git a/extensions/cpsection/proxy/Makefile.am b/extensions/cpsection/proxy/Makefile.am
new file mode 100644
index 0000000..95a7a7a
--- /dev/null
+++ b/extensions/cpsection/proxy/Makefile.am
@@ -0,0 +1,6 @@
+sugardir = $(pkgdatadir)/extensions/cpsection/proxy
+
+sugar_PYTHON = \
+	__init__.py \
+	model.py \
+	view.py
diff --git a/extensions/cpsection/proxy/__init__.py b/extensions/cpsection/proxy/__init__.py
new file mode 100644
index 0000000..399afa4
--- /dev/null
+++ b/extensions/cpsection/proxy/__init__.py
@@ -0,0 +1,21 @@
+# Copyright (C) 2011, Aleksey Lim
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+from gettext import gettext as _
+
+
+CLASS = 'Proxy'
+ICON = 'module-proxy'
+TITLE = _('Proxy')
diff --git a/extensions/cpsection/proxy/model.py b/extensions/cpsection/proxy/model.py
new file mode 100644
index 0000000..0ed0d85
--- /dev/null
+++ b/extensions/cpsection/proxy/model.py
@@ -0,0 +1,2 @@
+# ControlPanel.show_section_view() requires a model module, even if it's just
+# empty.
diff --git a/extensions/cpsection/proxy/view.py b/extensions/cpsection/proxy/view.py
new file mode 100644
index 0000000..56fcb0d
--- /dev/null
+++ b/extensions/cpsection/proxy/view.py
@@ -0,0 +1,394 @@
+# Copyright (C) 2011, Aleksey Lim
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+from gettext import gettext as _
+import re
+
+import gtk
+import gconf
+
+from sugar.graphics import style
+
+from jarabe.controlpanel.sectionview import SectionView
+
+
+ICON = 'module-proxy'
+
+_widget_sensitivies = {}
+_gconf_origin_values = {}
+
+
+class Proxy(SectionView):
+
+    def __init__(self, model, alerts):
+        SectionView.__init__(self)
+        self.set_border_width(style.DEFAULT_SPACING * 2)
+        self.set_spacing(style.DEFAULT_SPACING)
+        self.setup()
+
+    def setup(self):
+        for i in self.get_children():
+            self.remove(i)
+            # Destroy all widgets and connection to avoid any interfering
+            i.destroy()
+
+        _widget_sensitivies.clear()
+
+        workspace = gtk.VBox()
+        workspace.show()
+
+        scrolled = gtk.ScrolledWindow()
+        scrolled.set_policy(gtk.POLICY_NEVER, gtk.POLICY_AUTOMATIC)
+        scrolled.add_with_viewport(workspace)
+        scrolled.show()
+        self.add(scrolled)
+
+        def add_section(section, label_text):
+            separator = gtk.HSeparator()
+            separator.show()
+            workspace.pack_start(separator, expand=False)
+
+            label = gtk.Label(label_text)
+            label.set_alignment(0, 0)
+            label.show()
+            workspace.pack_start(label, expand=False)
+
+            section.set_border_width(style.DEFAULT_SPACING * 2)
+            section.show()
+            workspace.pack_start(section, expand=False)
+
+        add_section(_ProxySection(),
+                _('Configure proxies to access the internet'))
+        add_section(_IgnoreSection(), _('Ignore host list'))
+
+    def undo(self):
+        conf = gconf.client_get_default()
+        for key, value in _gconf_origin_values.items():
+            if value is None:
+                conf.unset(key)
+            else:
+                conf.set(key, value)
+
+    @property
+    def needs_restart(self):
+        conf = gconf.client_get_default()
+        for key, value in _gconf_origin_values.items():
+            if ((value is None and conf.get_without_default(key) is not None) or
+                (value is not None and value.to_string() != conf.get(key).to_string())):
+                return True
+
+        return False
+
+    @needs_restart.setter
+    def needs_restart(self, value):
+        # needs_restart is a property (i.e. gets calculated) in this Control
+        # Panel, but SectionView.__init__() wants to initialise it to False,
+        # so we need to provide a (fake) setter.
+        pass
+
+
+class _ProxySection(gtk.VBox):
+
+    def __init__(self):
+        gtk.VBox.__init__(self)
+        self._common_hosts = {}
+        self._common_ports = {}
+
+        group = gtk.RadioButton()
+        group.props.label = _('Direct internet connection')
+        group.show()
+        self.pack_start(group, expand=False)
+        _register_selector_key('/system/proxy/mode', group, 'none')
+        _register_bool_key('/system/http_proxy/use_http_proxy', group, True)
+
+        manual_proxy = gtk.RadioButton(group)
+        manual_proxy.props.label = _('Manual proxy configuration')
+        manual_proxy.show()
+        self.pack_start(manual_proxy, expand=False)
+        _register_selector_key('/system/proxy/mode', manual_proxy, 'manual')
+
+        widgets = self._add_protos()
+        manual_proxy.connect('toggled', _set_sensitive, False, widgets)
+        _set_sensitive(manual_proxy, False, widgets)
+
+        auto_proxy = gtk.RadioButton(group)
+        auto_proxy.props.label = _('Automatic proxy configuration')
+        auto_proxy.show()
+        self.pack_start(auto_proxy, expand=False)
+        _register_selector_key('/system/proxy/mode', auto_proxy, 'auto')
+
+        grid = self._sub_section_new()
+        grid.attach_label(_('Autoconfiguration URL (leave empty to use WPAD):'),
+                          0, 1, 0, 1)
+        entry = grid.attach_entry(1, 2, 0, 1)
+        _register_string_key('/system/proxy/autoconfig_url', entry)
+        auto_proxy.connect('toggled', _set_sensitive, False, [grid])
+        _set_sensitive(auto_proxy, False, [grid])
+
+    def _add_protos(self):
+        commons = gtk.CheckButton()
+        commons.props.label = _('Use the same proxy for all protocols')
+        commons.show()
+        self.pack_start(commons)
+        _register_bool_key('/system/http_proxy/use_same_proxy', commons)
+
+        grid = self._sub_section_new()
+
+        def add_proto(row, is_common, label_text, host_key, port_key):
+            host_label = grid.attach_label(label_text, 0, 1, row, row + 1)
+            host = grid.attach_entry(1, 2, row, row + 1)
+
+            port_label = grid.attach_label(_('Port:'), 2, 3, row, row + 1)
+            port_value = gtk.Adjustment(8080, 0, 65536, 1, 10)
+            port = gtk.SpinButton()
+            port.configure(port_value, .1, 0)
+            port.show()
+            grid.attach(port, 3, 4, row, row + 1,
+                    gtk.SHRINK | gtk.FILL, gtk.SHRINK)
+
+            if is_common:
+                _widget_sensitivies.update([
+                        (host_label, None), (host, None),
+                        (port_label, None), (port, None)])
+                self._common_hosts[host] = host.props.buffer
+                self._common_ports[port] = port.props.adjustment
+
+            _register_string_key(host_key, host)
+            _register_int_key(port_key, port)
+
+            return host, port
+
+        http_host, http_port = add_proto(1, False, _('HTTP proxy:'),
+                '/system/http_proxy/host', '/system/http_proxy/port')
+
+        auth_widget = _AuthWidget()
+        auth_widget.show()
+        grid.attach(auth_widget, 1, 2, 2, 3, gtk.SHRINK | gtk.FILL, gtk.SHRINK)
+
+        add_proto(3, True, _('Secure HTTP proxy:'),
+                '/system/proxy/secure_host', '/system/proxy/secure_port')
+        add_proto(4, True, _('FTP proxy:'),
+                '/system/proxy/ftp_host', '/system/proxy/ftp_port')
+        add_proto(5, True, _('Socks proxy:'),
+                '/system/proxy/socks_host', '/system/proxy/socks_port')
+
+        def commons_toggled_cb(sender):
+            for widget in _widget_sensitivies.keys():
+                _widget_sensitivies[widget] = not sender.props.active
+            _set_sensitive(sender, True, _widget_sensitivies.keys())
+
+            for widget, orig_buffer in self._common_hosts.items():
+                widget.props.buffer = http_host.props.buffer if \
+                        sender.props.active else orig_buffer
+
+            for widget, orig_adjustment in self._common_ports.items():
+                widget.props.adjustment = http_port.props.adjustment if \
+                        sender.props.active else orig_adjustment
+                widget.props.value = widget.props.adjustment.value
+
+        commons.connect('toggled', commons_toggled_cb)
+        commons_toggled_cb(commons)
+
+        return [commons, grid]
+
+    def _sub_section_new(self):
+        grid = _Grid(1, 1, False)
+        grid.props.column_spacing = style.DEFAULT_SPACING
+        grid.props.row_spacing = style.DEFAULT_SPACING
+        grid.show()
+
+        alignment = gtk.Alignment(0, 0, 1, 1)
+        alignment.props.left_padding = style.STANDARD_ICON_SIZE
+        alignment.props.right_padding = style.GRID_CELL_SIZE
+        alignment.add(grid)
+        alignment.show()
+        self.pack_start(alignment)
+
+        return grid
+
+
+class _IgnoreSection(gtk.VBox):
+
+    def __init__(self):
+        gtk.VBox.__init__(self)
+
+        entry = gtk.Entry()
+        entry.show()
+        self.pack_start(entry, expand=False)
+        _register_list_key('/system/http_proxy/ignore_hosts', entry)
+
+
+class _AuthWidget(gtk.VBox):
+
+    def __init__(self):
+        gtk.VBox.__init__(self)
+
+        enable = gtk.CheckButton()
+        enable.props.label = _('Use authentication')
+        enable.show()
+        self.pack_start(enable, expand=False)
+        _register_bool_key('/system/http_proxy/use_authentication', enable)
+
+        grid = _Grid(2, 2, False)
+        grid.props.column_spacing = style.DEFAULT_SPACING
+        grid.props.row_spacing = style.DEFAULT_SPACING
+        self.pack_start(grid)
+
+        grid.attach_label(_('Username:'), 0, 1, 0, 1)
+        entry = grid.attach_entry(1, 2, 0, 1)
+        _register_string_key('/system/http_proxy/authentication_user', entry)
+
+        grid.attach_label(_('Password:'), 0, 1, 1, 2)
+        entry = grid.attach_entry(1, 2, 1, 2)
+        entry.props.visibility = False
+        _register_string_key(
+                '/system/http_proxy/authentication_password', entry)
+
+        enable.connect('toggled', lambda sender:
+                grid.show() if sender.props.active else grid.hide())
+        if enable.props.active:
+            grid.show()
+
+
+class _Grid(gtk.Table):
+
+    def attach_label(self, label, left_attach, right_attach,
+            top_attach, bottom_attach):
+        widget = gtk.Label(label)
+        widget.set_alignment(0, 0)
+        widget.set_line_wrap(True)
+        self.attach(widget, left_attach, right_attach,
+                top_attach, bottom_attach, gtk.SHRINK | gtk.FILL, gtk.SHRINK)
+        widget.show()
+        return widget
+
+    def attach_entry(self, left_attach, right_attach,
+            top_attach, bottom_attach):
+        widget = gtk.Entry()
+        self.attach(widget, left_attach, right_attach,
+                top_attach, bottom_attach, gtk.EXPAND | gtk.FILL, gtk.SHRINK)
+        widget.show()
+        return widget
+
+
+def _set_sensitive(sender, reverse, widgets):
+    is_sensitive = sender.props.active
+    if reverse:
+        is_sensitive = not is_sensitive
+
+    for i in widgets:
+        if isinstance(i, gtk.Container):
+            _set_sensitive(sender, reverse, i.get_children())
+        i.props.sensitive = is_sensitive and _widget_sensitivies.get(i, True)
+
+
+def _register_bool_key(key, widget, reverse=False):
+
+    def set_cb(widget, x, reverse):
+        value = x.get_bool()
+        if reverse:
+            value = not value
+        widget.props.active = value
+
+    def get_cb(widget, reverse):
+        x = gconf.Value(gconf.VALUE_BOOL)
+        value = widget.props.active
+        if reverse:
+            value = not value
+        x.set_bool(value)
+        return x
+
+    _register_key(key, widget, 'toggled', set_cb, get_cb, reverse)
+
+
+def _register_string_key(key, widget):
+
+    def set_cb(widget, x):
+        widget.props.text = x.get_string()
+
+    def get_cb(widget):
+        x = gconf.Value(gconf.VALUE_STRING)
+        x.set_string(widget.props.text)
+        return x
+
+    _register_key(key, widget, 'changed', set_cb, get_cb)
+
+
+def _register_int_key(key, widget):
+
+    def set_cb(widget, x):
+        widget.props.value = x.get_int()
+
+    def get_cb(widget):
+        x = gconf.Value(gconf.VALUE_INT)
+        x.set_int(int(widget.props.value))
+        return x
+
+    _register_key(key, widget.props.adjustment, 'value_changed',
+            set_cb, get_cb)
+
+
+def _register_selector_key(key, widget, value):
+
+    def set_cb(widget, x, value):
+        widget.props.active = x.get_string() == value
+
+    def get_cb(widget, value):
+        if not widget.props.active:
+            return None
+        x = gconf.Value(gconf.VALUE_STRING)
+        x.set_string(value)
+        return x
+
+    _register_key(key, widget, 'toggled', set_cb, get_cb, value)
+
+
+def _register_list_key(key, widget):
+
+    def set_cb(widget, x):
+        hosts = [i.get_string() for i in x.get_list()]
+        widget.props.text = ', '.join(hosts)
+
+    def get_cb(widget):
+        hosts = []
+        for i in re.split('[\s,;:]+', widget.props.text or ''):
+            if not i.strip():
+                continue
+            value = gconf.Value(gconf.VALUE_STRING)
+            value.set_string(i.strip())
+            hosts.append(value)
+        x = gconf.Value(gconf.VALUE_LIST)
+        x.set_list_type(gconf.VALUE_STRING)
+        x.set_list(hosts)
+        return x
+
+    _register_key(key, widget, 'changed', set_cb, get_cb)
+
+
+def _register_key(key, widget, signal, set_cb, get_cb, *args):
+    conf = gconf.client_get_default()
+    value = conf.get(key)
+    if value is not None:
+        set_cb(widget, value, *args)
+
+    _gconf_origin_values[key] = value
+
+    def signal_cb(sender, key, widget, get_cb, *args):
+        value = get_cb(widget, *args)
+        if value is not None:
+            conf = gconf.client_get_default()
+            conf.set(key, value)
+
+    widget.connect(signal, signal_cb, key, widget, get_cb, *args)
--
1.7.8.3



More information about the Sugar-devel mailing list