aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorVincent Breitmoser <valodim@mugenguild.com>2015-01-31 18:49:54 +0100
committerVincent Breitmoser <valodim@mugenguild.com>2015-01-31 18:49:54 +0100
commit0b6dc65c97b0fb5dae9bf1a06f9c7db0b65ea4ad (patch)
tree92954cab7f0aa299c2658a9f15586168ccf12e4f
parent5466d1e9802815726d713bca2aeabaff2861519c (diff)
parente651a392795caa395b060946b0cfaca5a5b41ded (diff)
downloadopen-keychain-0b6dc65c97b0fb5dae9bf1a06f9c7db0b65ea4ad.tar.gz
open-keychain-0b6dc65c97b0fb5dae9bf1a06f9c7db0b65ea4ad.tar.bz2
open-keychain-0b6dc65c97b0fb5dae9bf1a06f9c7db0b65ea4ad.zip
Merge remote-tracking branch 'origin/development' into development
-rw-r--r--.travis.yml2
-rw-r--r--Graphics/drawables/drawer_header.svg2032
-rwxr-xr-xGraphics/update-drawables.sh7
-rw-r--r--OpenKeychain/build.gradle2
-rw-r--r--OpenKeychain/src/main/AndroidManifest.xml46
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/Constants.java19
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/provider/KeychainContract.java22
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/provider/KeychainDatabase.java26
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/provider/KeychainProvider.java52
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/provider/ProviderHelper.java35
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/remote/OpenPgpService.java620
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/remote/ui/AccountSettingsActivity.java1
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/remote/ui/AppSettingsActivity.java36
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/remote/ui/AppSettingsAllowedKeysListFragment.java292
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/remote/ui/AppSettingsHeaderFragment.java (renamed from OpenKeychain/src/main/java/org/sufficientlysecure/keychain/remote/ui/AppSettingsFragment.java)2
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/remote/ui/RemoteServiceActivity.java8
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/DecryptActivity.java128
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/DecryptOverviewFragment.java130
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/DrawerActivity.java305
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/KeyListFragment.java133
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/NavDrawerActivity.java5
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/SelectPublicKeyActivity.java144
-rw-r--r--OpenKeychain/src/main/res/drawable/drawer_header.pngbin0 -> 47409 bytes
-rw-r--r--OpenKeychain/src/main/res/layout-large/decrypt_activity.xml18
-rw-r--r--OpenKeychain/src/main/res/layout-large/encrypt_files_activity.xml17
-rw-r--r--OpenKeychain/src/main/res/layout-large/encrypt_text_activity.xml17
-rw-r--r--OpenKeychain/src/main/res/layout-large/key_list_activity.xml18
-rw-r--r--OpenKeychain/src/main/res/layout/api_app_settings_activity.xml14
-rw-r--r--OpenKeychain/src/main/res/layout/api_apps_adapter_list_item.xml20
-rw-r--r--OpenKeychain/src/main/res/layout/api_remote_register_app.xml2
-rw-r--r--OpenKeychain/src/main/res/layout/decrypt_activity.xml11
-rw-r--r--OpenKeychain/src/main/res/layout/decrypt_content.xml117
-rw-r--r--OpenKeychain/src/main/res/layout/decrypt_overview_fragment.xml96
-rw-r--r--OpenKeychain/src/main/res/layout/drawer_custom_header.xml (renamed from OpenKeychain/src/main/res/layout/custom_drawer.xml)0
-rw-r--r--OpenKeychain/src/main/res/layout/drawer_list.xml18
-rw-r--r--OpenKeychain/src/main/res/layout/drawer_list_item.xml31
-rw-r--r--OpenKeychain/src/main/res/layout/encrypt_files_activity.xml34
-rw-r--r--OpenKeychain/src/main/res/layout/encrypt_files_content.xml33
-rw-r--r--OpenKeychain/src/main/res/layout/encrypt_text_activity.xml34
-rw-r--r--OpenKeychain/src/main/res/layout/encrypt_text_content.xml33
-rw-r--r--OpenKeychain/src/main/res/layout/key_list_activity.xml11
-rw-r--r--OpenKeychain/src/main/res/layout/key_list_content.xml1
-rw-r--r--OpenKeychain/src/main/res/values-large/dimens.xml1
-rw-r--r--OpenKeychain/src/main/res/values/colors.xml3
-rw-r--r--OpenKeychain/src/main/res/values/dimens.xml2
-rw-r--r--OpenKeychain/src/main/res/values/strings.xml1
-rw-r--r--OpenKeychain/src/main/res/values/themes.xml12
m---------extern/minidns0
m---------extern/openpgp-api-lib0
49 files changed, 3221 insertions, 1370 deletions
diff --git a/.travis.yml b/.travis.yml
index 3c477322f..af67b2333 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -11,7 +11,7 @@ before_install:
# Install required Android components.
#- echo "y" | android update sdk -a --filter build-tools-19.1.0,android-19,platform-tools,extra-android-support,extra-android-m2repository --no-ui --force
- - ( sleep 5 && while [ 1 ]; do sleep 1; echo y; done ) | android update sdk --no-ui --all --force --filter build-tools-21.1.1,build-tools-19.1.0,android-21,android-19,platform-tools,extra-android-support,extra-android-m2repository
+ - ( sleep 5 && while [ 1 ]; do sleep 1; echo y; done ) | android update sdk --no-ui --all --force --filter build-tools-21.1.2,build-tools-21.1.1,build-tools-19.1.0,android-21,android-19,platform-tools,extra-android-support,extra-android-m2repository
install: echo "Installation done"
script:
- ./gradlew assemble -S -q
diff --git a/Graphics/drawables/drawer_header.svg b/Graphics/drawables/drawer_header.svg
new file mode 100644
index 000000000..a65b611a8
--- /dev/null
+++ b/Graphics/drawables/drawer_header.svg
@@ -0,0 +1,2032 @@
+<?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"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="512"
+ height="288"
+ id="svg4270"
+ version="1.1"
+ inkscape:version="0.48.3.1 r9886"
+ sodipodi:docname="drawer_header.svg"
+ inkscape:export-filename="/home/schuerm/Projekte/OpenKeychain/Graphics/drawables/drawer_header.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90">
+ <defs
+ id="defs4272">
+ <inkscape:path-effect
+ effect="spiro"
+ id="path-effect6747-5"
+ is_visible="true" />
+ <inkscape:path-effect
+ effect="spiro"
+ id="path-effect6749-3"
+ is_visible="true" />
+ <inkscape:path-effect
+ is_visible="true"
+ id="path-effect4566-7-3"
+ effect="spiro" />
+ <inkscape:path-effect
+ is_visible="true"
+ id="path-effect6679-8"
+ effect="spiro" />
+ <inkscape:path-effect
+ effect="spiro"
+ id="path-effect4678-8"
+ is_visible="true" />
+ <inkscape:path-effect
+ is_visible="true"
+ id="path-effect4668-8"
+ effect="spiro" />
+ <inkscape:path-effect
+ effect="spiro"
+ id="path-effect4452-8"
+ is_visible="true" />
+ <inkscape:path-effect
+ is_visible="true"
+ id="path-effect4450-4"
+ effect="spiro" />
+ <inkscape:path-effect
+ is_visible="true"
+ id="path-effect4448-8"
+ effect="spiro" />
+ <inkscape:path-effect
+ effect="spiro"
+ id="path-effect4446-9"
+ is_visible="true" />
+ <inkscape:path-effect
+ is_visible="true"
+ id="path-effect4436-5"
+ effect="spiro" />
+ <inkscape:path-effect
+ effect="spiro"
+ id="path-effect4434-1"
+ is_visible="true" />
+ <inkscape:path-effect
+ effect="spiro"
+ id="path-effect4428-2"
+ is_visible="true" />
+ <inkscape:path-effect
+ is_visible="true"
+ id="path-effect4416-8"
+ effect="spiro" />
+ <inkscape:path-effect
+ is_visible="true"
+ id="path-effect4294-5"
+ effect="spiro" />
+ <inkscape:path-effect
+ is_visible="true"
+ id="path-effect4304-7"
+ effect="spiro" />
+ <inkscape:path-effect
+ is_visible="true"
+ id="path-effect4308-0"
+ effect="spiro" />
+ <inkscape:path-effect
+ is_visible="true"
+ id="path-effect4312-7"
+ effect="spiro" />
+ <inkscape:path-effect
+ is_visible="true"
+ id="path-effect4316-5"
+ effect="spiro" />
+ <inkscape:path-effect
+ is_visible="true"
+ id="path-effect4320-7"
+ effect="spiro" />
+ <inkscape:path-effect
+ is_visible="true"
+ id="path-effect4324-8"
+ effect="spiro" />
+ <inkscape:path-effect
+ is_visible="true"
+ id="path-effect4328-6"
+ effect="spiro" />
+ <inkscape:path-effect
+ is_visible="true"
+ id="path-effect4332-4"
+ effect="spiro" />
+ <inkscape:path-effect
+ effect="spiro"
+ id="path-effect4342-4"
+ is_visible="true" />
+ <inkscape:path-effect
+ is_visible="true"
+ id="path-effect4349"
+ effect="spiro" />
+ <inkscape:path-effect
+ is_visible="true"
+ id="path-effect4351"
+ effect="spiro" />
+ <inkscape:path-effect
+ is_visible="true"
+ id="path-effect4353"
+ effect="spiro" />
+ <inkscape:path-effect
+ is_visible="true"
+ id="path-effect4355"
+ effect="spiro" />
+ <inkscape:path-effect
+ is_visible="true"
+ id="path-effect4357"
+ effect="spiro" />
+ <inkscape:path-effect
+ is_visible="true"
+ id="path-effect4359"
+ effect="spiro" />
+ <inkscape:path-effect
+ effect="spiro"
+ id="path-effect4361"
+ is_visible="true" />
+ <inkscape:path-effect
+ is_visible="true"
+ id="path-effect4380-4"
+ effect="spiro" />
+ <inkscape:path-effect
+ is_visible="true"
+ id="path-effect6355-7"
+ effect="spiro" />
+ <inkscape:path-effect
+ is_visible="true"
+ id="path-effect4658-8"
+ effect="spiro" />
+ <inkscape:path-effect
+ is_visible="true"
+ id="path-effect4566-97"
+ effect="spiro" />
+ <inkscape:path-effect
+ is_visible="true"
+ id="path-effect4543-2"
+ effect="spiro" />
+ <filter
+ color-interpolation-filters="sRGB"
+ id="filter6878"
+ inkscape:collect="always">
+ <feGaussianBlur
+ id="feGaussianBlur6880"
+ stdDeviation="0.24"
+ inkscape:collect="always" />
+ </filter>
+ <inkscape:path-effect
+ effect="spiro"
+ id="path-effect6052"
+ is_visible="true" />
+ <inkscape:path-effect
+ is_visible="true"
+ id="path-effect6050"
+ effect="spiro" />
+ <inkscape:path-effect
+ effect="spiro"
+ id="path-effect6048"
+ is_visible="true" />
+ <inkscape:path-effect
+ is_visible="true"
+ id="path-effect6040"
+ effect="spiro" />
+ <inkscape:path-effect
+ effect="spiro"
+ id="path-effect6038"
+ is_visible="true" />
+ <inkscape:path-effect
+ is_visible="true"
+ id="path-effect6036"
+ effect="spiro" />
+ <inkscape:path-effect
+ effect="spiro"
+ id="path-effect6028"
+ is_visible="true" />
+ <inkscape:path-effect
+ is_visible="true"
+ id="path-effect6024"
+ effect="spiro" />
+ <inkscape:path-effect
+ effect="spiro"
+ id="path-effect6020"
+ is_visible="true" />
+ <clipPath
+ clipPathUnits="userSpaceOnUse"
+ id="clipPath6204">
+ <rect
+ style="color:#000000;fill:#ffffff;fill-opacity:0.28078841;fill-rule:nonzero;stroke:#213149;stroke-width:1.76498926;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ id="rect6206"
+ width="74.565163"
+ height="170.26346"
+ x="425.43484"
+ y="1201.8348" />
+ </clipPath>
+ <clipPath
+ clipPathUnits="userSpaceOnUse"
+ id="clipPath6278">
+ <rect
+ style="color:#000000;fill:#b22222;fill-opacity:1;fill-rule:nonzero;stroke:#213149;stroke-width:1.76498926;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ id="rect6280"
+ width="57.606529"
+ height="95.568382"
+ x="0.98397124"
+ y="1276.5299" />
+ </clipPath>
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="0.98994949"
+ inkscape:cx="283.55676"
+ inkscape:cy="146.50715"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="false"
+ inkscape:window-width="1364"
+ inkscape:window-height="747"
+ inkscape:window-x="0"
+ inkscape:window-y="19"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata4275">
+ <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(0,-764.36218)">
+ <rect
+ inkscape:export-ydpi="134.53"
+ inkscape:export-xdpi="134.53"
+ inkscape:export-filename="/home/rlafuente/Projects/GPG/infog/precolor.png"
+ style="color:#000000;fill:#00bcd4;fill-opacity:1;stroke:#213149;stroke-width:1.64012957000000004;stroke-opacity:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ id="rect14996"
+ width="544.41058"
+ height="328.04068"
+ x="-17.378559"
+ y="639.72333" />
+ <g
+ transform="matrix(1.1545885,0,0,1.1545885,-0.5005199,-616.20088)"
+ inkscape:groupmode="maskhelper"
+ id="g6275"
+ clip-path="url(#clipPath6278)">
+ <path
+ style="color:#000000;fill:#ffffff;fill-opacity:0.27586209;fill-rule:nonzero;stroke:none;stroke-width:1.76498926;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ d="m -58.945242,1270.4982 c -4.83684,1.861 -8.96854,5.1238 -11.94377,9.271 -20.50515,2.77 -36.314528,20.2975 -36.295388,41.5584 0.0209,23.1709 18.806838,41.9331 41.977698,41.9122 6.83376,-0.01 13.27608,-1.6477 18.96999,-4.5543 11.28951,10.374 28.17457,12.1091 41.3523302,4.1676 6.51563,1.8162 13.80376,0.6134 19.4842198,-3.9402 0.95682,-0.767 1.80576,-1.6194 2.5974,-2.504 3.82071,0.8873 7.99622,0.094 11.29411,-2.5493 5.70967,-4.577 6.63029,-12.9349 2.05324,-18.6446 -0.4153,-0.518 -0.88519,-0.9719 -1.35765,-1.4106 1.69733,-0.7746 3.32049,-1.7756 4.84269,-2.9958 1.44477,-1.1582 2.72288,-2.4571 3.81039,-3.8584 2.96096,-0.2503 5.8726,-1.3426 8.36537,-3.3409 6.67925,-5.3543 7.76073,-15.1043 2.40645,-21.7835 -3.32091,-4.1427 -8.32714,-6.1064 -13.25002,-5.7402 -0.35877,-0.3362 -0.72756,-0.6607 -1.10325,-0.9701 2.76256,-3.3974 2.88929,-8.3847 0.0394,-11.9399 -3.28167,-4.0937 -9.24366,-4.7507 -13.33738,-1.469 -0.51964,0.4165 -0.96353,0.8828 -1.37076,1.3767 -3.34471,-3.1097 -7.80689,-5.0317 -12.7341498,-5.0273 -3.85721,0 -7.42727999,1.1939 -10.40375,3.1968 -2.08311,-0.497 -4.2606,-0.7642 -6.4961802,-0.7621 -2.35539,0 -4.64199,0.2905 -6.82537,0.8444 0.11313,-0.7701 0.16942,-1.5435 0.16869,-2.3452 -0.008,-8.8349 -7.15434,-15.9815 -15.98927,-15.9736 -5.10302,0 -9.63378,2.3848 -12.55952,6.1085 -1.41391,-0.2342 -2.85443,-0.3643 -4.33497,-0.363 -3.29614,0 -6.45843,0.6198 -9.36053,1.7364 z"
+ id="path6269"
+ inkscape:connector-curvature="0" />
+ </g>
+ <g
+ transform="matrix(1.1545885,0,0,1.1545885,-64.827597,-617.0256)"
+ inkscape:groupmode="maskhelper"
+ id="g6201"
+ clip-path="url(#clipPath6204)">
+ <path
+ inkscape:connector-curvature="0"
+ id="path6158-9"
+ d="m 511.49596,1239.0283 c -4.83684,1.861 -8.96854,5.1239 -11.94377,9.2711 -20.50515,2.77 -36.31453,20.2975 -36.29539,41.5584 0.0209,23.1709 18.80684,41.9331 41.9777,41.9122 6.83376,-0.01 13.27608,-1.6477 18.96999,-4.5543 11.28951,10.374 28.17457,12.1091 41.35233,4.1676 6.51563,1.8162 13.80376,0.6134 19.48422,-3.9402 0.95682,-0.767 1.80576,-1.6194 2.5974,-2.504 3.82071,0.8873 7.99622,0.094 11.29411,-2.5493 5.70967,-4.577 6.63029,-12.9349 2.05324,-18.6446 -0.4153,-0.518 -0.88519,-0.9719 -1.35765,-1.4106 1.69733,-0.7746 3.32049,-1.7756 4.84269,-2.9958 1.44477,-1.1582 2.72288,-2.4571 3.81039,-3.8584 2.96096,-0.2503 5.8726,-1.3426 8.36537,-3.3409 6.67925,-5.3543 7.76073,-15.1043 2.40645,-21.7835 -3.32091,-4.1427 -8.32714,-6.1064 -13.25002,-5.7402 -0.35877,-0.3362 -0.72756,-0.6607 -1.10325,-0.9701 2.76256,-3.3974 2.88929,-8.3847 0.0394,-11.9399 -3.28167,-4.0937 -9.24366,-4.7507 -13.33738,-1.469 -0.51964,0.4165 -0.96353,0.8828 -1.37076,1.3767 -3.34471,-3.1097 -7.80689,-5.0317 -12.73415,-5.0273 -3.85721,0 -7.42728,1.1939 -10.40375,3.1968 -2.08311,-0.497 -4.2606,-0.7642 -6.49618,-0.7621 -2.35539,0 -4.64199,0.2905 -6.82537,0.8444 0.11313,-0.7701 0.16942,-1.5435 0.16869,-2.3452 -0.008,-8.835 -7.15434,-15.9816 -15.98927,-15.9737 -5.10302,0 -9.63378,2.3848 -12.55952,6.1085 -1.41391,-0.2342 -2.85443,-0.3643 -4.33497,-0.363 -3.29614,0 -6.45843,0.6198 -9.36053,1.7364 z"
+ style="color:#000000;fill:#ffffff;fill-opacity:0.27586209;fill-rule:nonzero;stroke:none;stroke-width:1.76498926;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+ </g>
+ <path
+ style="color:#000000;fill:#ffffff;fill-opacity:0.27586209;fill-rule:nonzero;stroke:none;stroke-width:1.76498926;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ d="m 233.27882,791.74927 c -5.58455,2.14869 -10.35496,5.91589 -13.79013,10.70419 -23.67501,3.19821 -41.92834,23.43527 -41.90623,47.98285 0.0242,26.75287 21.71415,48.41548 48.46696,48.39136 7.89019,-0.0115 15.32841,-1.90243 21.90253,-5.25834 13.03474,11.9777 32.53004,13.98102 47.74493,4.81186 7.52287,2.09696 15.93767,0.70822 22.49626,-4.54932 1.10473,-0.88557 2.08491,-1.86973 2.99892,-2.89109 4.41136,1.02448 9.23234,0.10854 13.04005,-2.94339 6.59233,-5.28455 7.65527,-14.93449 2.37065,-21.52684 -0.4795,-0.59808 -1.02203,-1.12214 -1.56753,-1.62867 1.95972,-0.89434 3.83381,-2.05008 5.59132,-3.45891 1.66812,-1.33725 3.14381,-2.83693 4.39943,-4.45486 3.41869,-0.289 6.78044,-1.55016 9.65856,-3.85737 7.71179,-6.18201 8.96045,-17.43925 2.77846,-25.15097 -3.83427,-4.78312 -9.61442,-7.05039 -15.29832,-6.6276 -0.41422,-0.38815 -0.84003,-0.76281 -1.27379,-1.12005 3.18962,-3.9226 3.33594,-9.68087 0.0454,-13.78567 -3.78898,-4.72653 -10.67263,-5.48509 -15.39919,-1.69608 -0.59996,0.48089 -1.11247,1.01927 -1.58267,1.58951 -3.86175,-3.59042 -9.01373,-5.80955 -14.70269,-5.80446 -4.45349,0 -8.57546,1.37847 -12.01206,3.69099 -2.40513,-0.57383 -4.91924,-0.88234 -7.50041,-0.87991 -2.71951,0 -5.35959,0.3354 -7.88049,0.97492 0.13062,-0.88914 0.19561,-1.78209 0.19477,-2.70773 -0.009,-10.20067 -8.26032,-18.45206 -18.46103,-18.44294 -5.8919,0 -11.12306,2.75346 -14.50109,7.05282 -1.63248,-0.27041 -3.29569,-0.42062 -5.0051,-0.41911 -3.80568,0 -7.45683,0.7156 -10.80756,2.00481 z"
+ id="path6158"
+ inkscape:connector-curvature="0" />
+ <rect
+ inkscape:export-ydpi="134.53"
+ inkscape:export-xdpi="134.53"
+ inkscape:export-filename="/home/rlafuente/Projects/GPG/infog/precolor.png"
+ style="color:#000000;fill:#a99381;fill-opacity:1;fill-rule:nonzero;stroke:#213149;stroke-width:1.48108912;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ id="rect14992"
+ width="156.08395"
+ height="110.6807"
+ x="186.78011"
+ y="858.11658" />
+ <path
+ style="fill:#fffacd;fill-opacity:1;stroke:none"
+ d="m 70.13413,1029.0296 0,10.0864 8.735063,5.0433 8.735058,-5.0433 0,-10.0864 -8.735058,-5.0431 -8.735063,5.0431"
+ id="path6018"
+ inkscape:path-effect="#path-effect6020"
+ inkscape:original-d="m 70.13413,1029.0296 0,10.0864 8.735063,5.0433 8.735058,-5.0433 0,-10.0864 -8.735058,-5.0431 z"
+ inkscape:connector-curvature="0" />
+ <path
+ inkscape:connector-curvature="0"
+ inkscape:original-d="m 96.692913,1029.0296 0,10.0864 8.735047,5.0433 8.73505,-5.0433 0,-10.0864 -8.73505,-5.0431 z"
+ inkscape:path-effect="#path-effect6024"
+ id="path6022"
+ d="m 96.692913,1029.0296 0,10.0864 8.735047,5.0433 8.73505,-5.0433 0,-10.0864 -8.73505,-5.0431 -8.735047,5.0431"
+ style="fill:#fffacd;fill-opacity:1;stroke:none" />
+ <path
+ style="fill:#fffacd;stroke:none"
+ d="m 123.25167,1029.0296 0,10.0864 8.73505,5.0433 8.73506,-5.0433 0,-10.0864 -8.73506,-5.0431 -8.73505,5.0431"
+ id="path6026"
+ inkscape:path-effect="#path-effect6028"
+ inkscape:original-d="m 123.25167,1029.0296 0,10.0864 8.73505,5.0433 8.73506,-5.0433 0,-10.0864 -8.73506,-5.0431 z"
+ inkscape:connector-curvature="0" />
+ <path
+ inkscape:connector-curvature="0"
+ inkscape:original-d="m 149.81041,1029.0296 0,10.0864 8.73505,5.0433 8.73507,-5.0433 -2e-5,-10.0864 -8.73505,-5.0431 z"
+ inkscape:path-effect="#path-effect6036"
+ id="path6030"
+ d="m 149.81041,1029.0296 0,10.0864 8.73505,5.0433 8.73507,-5.0433 -2e-5,-10.0864 -8.73505,-5.0431 -8.73505,5.0431"
+ style="fill:#fffacd;fill-opacity:1;stroke:none" />
+ <path
+ style="fill:#fffacd;fill-opacity:1;stroke:none"
+ d="m 176.36917,1029.0296 0,10.0864 8.73507,5.0433 8.73505,-5.0433 0,-10.0864 -8.73505,-5.0431 -8.73507,5.0431"
+ id="path6032"
+ inkscape:path-effect="#path-effect6038"
+ inkscape:original-d="m 176.36917,1029.0296 0,10.0864 8.73507,5.0433 8.73505,-5.0433 0,-10.0864 -8.73505,-5.0431 z"
+ inkscape:connector-curvature="0" />
+ <path
+ inkscape:connector-curvature="0"
+ inkscape:original-d="m 202.92792,1029.0296 0,10.0864 8.73508,5.0433 8.73504,-5.0433 0,-10.0864 -8.73504,-5.0431 z"
+ inkscape:path-effect="#path-effect6040"
+ id="path6034"
+ d="m 202.92792,1029.0296 0,10.0864 8.73508,5.0433 8.73504,-5.0433 0,-10.0864 -8.73504,-5.0431 -8.73508,5.0431"
+ style="fill:#fffacd;stroke:none" />
+ <path
+ style="fill:#fffacd;fill-opacity:1;stroke:none"
+ d="m 229.48662,1029.0296 0,10.0864 8.73506,5.0433 8.73507,-5.0433 -1e-5,-10.0864 -8.73506,-5.0431 -8.73506,5.0431"
+ id="path6042"
+ inkscape:path-effect="#path-effect6048"
+ inkscape:original-d="m 229.48662,1029.0296 0,10.0864 8.73506,5.0433 8.73507,-5.0433 -1e-5,-10.0864 -8.73506,-5.0431 z"
+ inkscape:connector-curvature="0" />
+ <path
+ inkscape:connector-curvature="0"
+ inkscape:original-d="m 256.04538,1029.0296 0,10.0864 8.73508,5.0433 8.73504,-5.0433 0,-10.0864 -8.73504,-5.0431 z"
+ inkscape:path-effect="#path-effect6050"
+ id="path6044"
+ d="m 256.04538,1029.0296 0,10.0864 8.73508,5.0433 8.73504,-5.0433 0,-10.0864 -8.73504,-5.0431 -8.73508,5.0431"
+ style="fill:#fffacd;fill-opacity:1;stroke:none" />
+ <path
+ style="fill:#fffacd;stroke:none"
+ d="m 282.60413,1029.0296 0,10.0864 8.73508,5.0433 8.73505,-5.0433 0,-10.0864 -8.73505,-5.0431 -8.73508,5.0431"
+ id="path6046"
+ inkscape:path-effect="#path-effect6052"
+ inkscape:original-d="m 282.60413,1029.0296 0,10.0864 8.73508,5.0433 8.73505,-5.0433 0,-10.0864 -8.73505,-5.0431 z"
+ inkscape:connector-curvature="0" />
+ <g
+ inkscape:export-ydpi="134.53"
+ inkscape:export-xdpi="134.53"
+ inkscape:export-filename="/home/rlafuente/Projects/GPG/infog/precolor.png"
+ style="color:#000000;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:#008000;stroke-width:2.18264699;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ transform="matrix(0.93365368,0,0,0.93365368,-90.840495,541.74176)"
+ id="g6335">
+ <path
+ transform="translate(451.84123,82.731493)"
+ d="m 129.11158,230.45037 -7.47529,-3.05812 -3.50894,7.27457 -6.1644,-5.21843 -5.58517,5.8342 -4.25011,-6.86793 -7.114679,3.82274 -1.919791,-7.84515 -7.947752,1.43709 0.598455,-8.05442 -8.002847,-1.08924 3.05812,-7.47528 -7.274567,-3.50894 5.218434,-6.16441 -5.834203,-5.58516 6.867933,-4.25012 -3.822746,-7.11467 7.84515,-1.9198 -1.437092,-7.94775 8.054428,0.59846 1.089235,-8.00285 7.475285,3.05812 3.508937,-7.27457 6.16441,5.21844 5.58516,-5.83421 4.25012,6.86794 7.11467,-3.82275 1.91979,7.84515 7.94776,-1.43709 -0.59846,8.05443 8.00285,1.08923 -3.05812,7.47529 7.27457,3.50894 -5.21844,6.1644 5.8342,5.58517 -6.86793,4.25011 3.82275,7.11468 -7.84515,1.91979 1.43709,7.94775 -8.05443,-0.59845 z"
+ inkscape:randomized="0"
+ inkscape:rounded="0"
+ inkscape:flatsided="false"
+ sodipodi:arg2="1.2042772"
+ sodipodi:arg1="1.0471976"
+ sodipodi:r2="31.608938"
+ sodipodi:r1="37.605831"
+ sodipodi:cy="197.88277"
+ sodipodi:cx="110.30866"
+ sodipodi:sides="20"
+ id="path6339"
+ style="color:#000000;fill:#f5deb4;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2.18264699;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ sodipodi:type="star" />
+ <path
+ transform="translate(451.84125,82.024401)"
+ d="m 137.17871,198.58986 c 0,14.83992 -12.03014,26.87006 -26.87006,26.87006 -14.839926,0 -26.870061,-12.03014 -26.870061,-26.87006 0,-14.83992 12.030135,-26.87006 26.870061,-26.87006 14.83992,0 26.87006,12.03014 26.87006,26.87006 z"
+ sodipodi:ry="26.870058"
+ sodipodi:rx="26.870058"
+ sodipodi:cy="198.58986"
+ sodipodi:cx="110.30865"
+ id="path6337"
+ style="color:#000000;fill:#fffacd;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2.18264699;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ sodipodi:type="arc" />
+ </g>
+ <path
+ inkscape:export-ydpi="134.53"
+ inkscape:export-xdpi="134.53"
+ inkscape:export-filename="/home/rlafuente/Projects/GPG/infog/precolor.png"
+ style="color:#000000;fill:#f4a460;fill-opacity:1;fill-rule:nonzero;stroke:#213149;stroke-width:2.03783631;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ d="m 67.147407,857.6659 -64.9095294,31.82333 15.0818124,0 0,78.51203 99.65544,0 0,-78.51203 15.0818,0 -64.909523,-31.82333 z"
+ id="path14990"
+ inkscape:connector-curvature="0" />
+ <path
+ inkscape:export-ydpi="134.53"
+ inkscape:export-xdpi="134.53"
+ inkscape:export-filename="/home/rlafuente/Projects/GPG/infog/precolor.png"
+ style="color:#000000;fill:none;stroke:#008000;stroke-width:1.76498926;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;filter:url(#filter6878);enable-background:accumulate"
+ d="m 156.56999,270.89136 0,0"
+ id="path15040"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cc"
+ transform="matrix(0,-1.1545885,1.1545885,0,-257.60699,1211.4701)" />
+ <path
+ inkscape:export-ydpi="134.53"
+ inkscape:export-xdpi="134.53"
+ inkscape:export-filename="/home/rlafuente/Projects/GPG/infog/precolor.png"
+ sodipodi:nodetypes="cc"
+ inkscape:connector-curvature="0"
+ id="path15042"
+ d="m 156.56999,272.89136 0,0"
+ style="color:#000000;fill:none;stroke:#008000;stroke-width:1.76498926;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;filter:url(#filter6878);enable-background:accumulate"
+ transform="matrix(0,-1.1545885,1.1545885,0,-257.60699,1211.4701)" />
+ <path
+ inkscape:export-ydpi="134.53"
+ inkscape:export-xdpi="134.53"
+ inkscape:export-filename="/home/rlafuente/Projects/GPG/infog/precolor.png"
+ style="color:#000000;fill:none;stroke:#008000;stroke-width:1.76498926;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;filter:url(#filter6878);enable-background:accumulate"
+ d="m 156.56999,274.89136 0,0"
+ id="path15044"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cc"
+ transform="matrix(0,-1.1545885,1.1545885,0,-257.60699,1211.4701)" />
+ <path
+ inkscape:export-ydpi="134.53"
+ inkscape:export-xdpi="134.53"
+ inkscape:export-filename="/home/rlafuente/Projects/GPG/infog/precolor.png"
+ sodipodi:nodetypes="cc"
+ inkscape:connector-curvature="0"
+ id="path15046"
+ d="m 156.56999,276.89136 0,0"
+ style="color:#000000;fill:none;stroke:#008000;stroke-width:1.76498926;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;filter:url(#filter6878);enable-background:accumulate"
+ transform="matrix(0,-1.1545885,1.1545885,0,-257.60699,1211.4701)" />
+ <path
+ inkscape:export-ydpi="134.53"
+ inkscape:export-xdpi="134.53"
+ inkscape:export-filename="/home/rlafuente/Projects/GPG/infog/precolor.png"
+ style="color:#000000;fill:none;stroke:#008000;stroke-width:1.76498926;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;filter:url(#filter6878);enable-background:accumulate"
+ d="m 156.56999,278.89136 0,0"
+ id="path15048"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cc"
+ transform="matrix(0,-1.1545885,1.1545885,0,-257.60699,1211.4701)" />
+ <rect
+ inkscape:export-ydpi="134.53"
+ inkscape:export-xdpi="134.53"
+ inkscape:export-filename="/home/rlafuente/Projects/GPG/infog/precolor.png"
+ y="865.54993"
+ x="201.54878"
+ height="103.28286"
+ width="133.98546"
+ id="rect15144"
+ style="color:#000000;fill:#d7d6c1;fill-opacity:1;fill-rule:nonzero;stroke:#213149;stroke-width:2.03783631;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+ <g
+ inkscape:export-ydpi="134.53"
+ inkscape:export-xdpi="134.53"
+ inkscape:export-filename="/home/rlafuente/Projects/GPG/infog/precolor.png"
+ id="g15146"
+ transform="matrix(1.1545885,0,0,1.1545885,-103.24248,487.88929)"
+ style="color:#000000;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:#213149;stroke-width:1.76498926;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate">
+ <path
+ sodipodi:nodetypes="ccccc"
+ inkscape:connector-curvature="0"
+ id="path15148"
+ d="m 269.2751,330.50947 c 0,0 -2.32031,0.0251 -2.32031,3.41406 1.71881,0 8.53041,0.0773 8.53041,0.0773 l -0.26645,-3.46957 z"
+ style="color:#000000;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:#213149;stroke-width:1.76498926;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+ <path
+ id="path15150"
+ d="m 269.28125,330.5 c 0,0 3.5,-0.005 3.5,3.5 l 0,43.65625 13.78125,0 0,-43.65625 c 0,-3.54345 -2.84375,-3.5 -2.84375,-3.5 l -14.4375,0 z"
+ style="color:#000000;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:#213149;stroke-width:1.76498926;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ inkscape:connector-curvature="0" />
+ </g>
+ <rect
+ inkscape:export-ydpi="134.53"
+ inkscape:export-xdpi="134.53"
+ inkscape:export-filename="/home/rlafuente/Projects/GPG/infog/precolor.png"
+ style="color:#000000;fill:#bcbcbc;fill-opacity:1;fill-rule:nonzero;stroke:#213149;stroke-width:2.03783631;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ id="rect15152"
+ width="22.514477"
+ height="13.566416"
+ x="208.78511"
+ y="922.01459" />
+ <path
+ inkscape:export-ydpi="134.53"
+ inkscape:export-xdpi="134.53"
+ inkscape:export-filename="/home/rlafuente/Projects/GPG/infog/precolor.png"
+ sodipodi:nodetypes="cc"
+ style="color:#000000;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:#213149;stroke-width:2.03783631;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ d="m 215.13575,873.52173 8.68759,7.71184"
+ id="path15154"
+ inkscape:connector-curvature="0" />
+ <path
+ inkscape:export-ydpi="134.53"
+ inkscape:export-xdpi="134.53"
+ inkscape:export-filename="/home/rlafuente/Projects/GPG/infog/precolor.png"
+ sodipodi:nodetypes="cc"
+ inkscape:connector-curvature="0"
+ id="path15156"
+ d="m 215.13575,876.65562 8.68759,14.95158"
+ style="color:#000000;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:#213149;stroke-width:2.03783631;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+ <path
+ inkscape:export-ydpi="134.53"
+ inkscape:export-xdpi="134.53"
+ inkscape:export-filename="/home/rlafuente/Projects/GPG/infog/precolor.png"
+ sodipodi:nodetypes="cc"
+ inkscape:connector-curvature="0"
+ id="path15158"
+ d="m 215.13575,911.42409 9.15975,-31.63445"
+ style="color:#000000;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:#213149;stroke-width:2.03783631;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+ <path
+ inkscape:export-ydpi="134.53"
+ inkscape:export-xdpi="134.53"
+ inkscape:export-filename="/home/rlafuente/Projects/GPG/infog/precolor.png"
+ sodipodi:nodetypes="cc"
+ style="color:#000000;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:#213149;stroke-width:2.03783631;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ d="m 214.82097,879.46105 9.47453,3.46249"
+ id="path15160"
+ inkscape:connector-curvature="0" />
+ <path
+ inkscape:export-ydpi="134.53"
+ inkscape:export-xdpi="134.53"
+ inkscape:export-filename="/home/rlafuente/Projects/GPG/infog/precolor.png"
+ sodipodi:nodetypes="cc"
+ inkscape:connector-curvature="0"
+ id="path15162"
+ d="m 215.13575,886.05756 8.84497,-9.60052"
+ style="color:#000000;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:#213149;stroke-width:2.03783631;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+ <path
+ inkscape:export-ydpi="134.53"
+ inkscape:export-xdpi="134.53"
+ inkscape:export-filename="/home/rlafuente/Projects/GPG/infog/precolor.png"
+ sodipodi:nodetypes="cc"
+ style="color:#000000;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:#213149;stroke-width:2.03783631;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ d="m 214.97837,882.42383 9.31713,6.76763"
+ id="path15164"
+ inkscape:connector-curvature="0" />
+ <path
+ inkscape:export-ydpi="134.53"
+ inkscape:export-xdpi="134.53"
+ inkscape:export-filename="/home/rlafuente/Projects/GPG/infog/precolor.png"
+ sodipodi:nodetypes="cc"
+ style="color:#000000;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:#213149;stroke-width:2.03783631;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ d="m 215.13575,897.99138 9.15975,-5.66591"
+ id="path15166"
+ inkscape:connector-curvature="0" />
+ <path
+ inkscape:export-ydpi="134.53"
+ inkscape:export-xdpi="134.53"
+ inkscape:export-filename="/home/rlafuente/Projects/GPG/infog/precolor.png"
+ sodipodi:nodetypes="cc"
+ inkscape:connector-curvature="0"
+ id="path15168"
+ d="m 215.13575,895.45937 8.68759,-21.71919"
+ style="color:#000000;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:#213149;stroke-width:2.03783631;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+ <path
+ inkscape:export-ydpi="134.53"
+ inkscape:export-xdpi="134.53"
+ inkscape:export-filename="/home/rlafuente/Projects/GPG/infog/precolor.png"
+ sodipodi:nodetypes="cc"
+ style="color:#000000;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:#213149;stroke-width:2.03783631;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ d="m 215.13575,901.26892 9.15975,-2.67554"
+ id="path15170"
+ inkscape:connector-curvature="0" />
+ <path
+ inkscape:export-ydpi="134.53"
+ inkscape:export-xdpi="134.53"
+ inkscape:export-filename="/home/rlafuente/Projects/GPG/infog/precolor.png"
+ sodipodi:nodetypes="cc"
+ style="color:#000000;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:#213149;stroke-width:2.03783631;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ d="m 215.13575,914.63293 9.15975,-12.90552"
+ id="path15172"
+ inkscape:connector-curvature="0" />
+ <path
+ inkscape:export-ydpi="134.53"
+ inkscape:export-xdpi="134.53"
+ inkscape:export-filename="/home/rlafuente/Projects/GPG/infog/precolor.png"
+ sodipodi:nodetypes="cc"
+ inkscape:connector-curvature="0"
+ id="path15174"
+ d="m 215.13575,904.8613 8.68759,-9.28578"
+ style="color:#000000;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:#213149;stroke-width:2.03783631;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+ <path
+ inkscape:export-ydpi="134.53"
+ inkscape:export-xdpi="134.53"
+ inkscape:export-filename="/home/rlafuente/Projects/GPG/infog/precolor.png"
+ style="color:#000000;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:#213149;stroke-width:2.03783631;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ d="m 215.13575,907.99531 9.15975,0"
+ id="path15176"
+ inkscape:connector-curvature="0" />
+ <path
+ inkscape:export-ydpi="134.53"
+ inkscape:export-xdpi="134.53"
+ inkscape:export-filename="/home/rlafuente/Projects/GPG/infog/precolor.png"
+ sodipodi:nodetypes="cc"
+ style="color:#000000;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:#213149;stroke-width:2.03783631;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ d="m 215.45053,886.41975 8.84497,24.70946"
+ id="path15178"
+ inkscape:connector-curvature="0" />
+ <path
+ inkscape:export-ydpi="134.53"
+ inkscape:export-xdpi="134.53"
+ inkscape:export-filename="/home/rlafuente/Projects/GPG/infog/precolor.png"
+ sodipodi:nodetypes="cc"
+ inkscape:connector-curvature="0"
+ id="path15180"
+ d="m 215.13575,917.72573 9.15975,-3.4625"
+ style="color:#000000;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:#213149;stroke-width:2.03783631;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+ <path
+ inkscape:export-ydpi="134.53"
+ inkscape:export-xdpi="134.53"
+ inkscape:export-filename="/home/rlafuente/Projects/GPG/infog/precolor.png"
+ sodipodi:nodetypes="cc"
+ inkscape:connector-curvature="0"
+ id="path15182"
+ d="m 215.13575,904.4916 9.15975,12.90554"
+ style="color:#000000;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:#213149;stroke-width:2.03783631;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+ <path
+ inkscape:export-ydpi="134.53"
+ inkscape:export-xdpi="134.53"
+ inkscape:export-filename="/home/rlafuente/Projects/GPG/infog/precolor.png"
+ inkscape:connector-curvature="0"
+ id="path15184"
+ d="m 229.06255,924.35918 0,0"
+ style="color:#000000;fill:#bcbcbc;fill-opacity:1;fill-rule:nonzero;stroke:#213149;stroke-width:2.03783631;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ sodipodi:nodetypes="cc" />
+ <path
+ inkscape:export-ydpi="134.53"
+ inkscape:export-xdpi="134.53"
+ inkscape:export-filename="/home/rlafuente/Projects/GPG/infog/precolor.png"
+ sodipodi:nodetypes="cc"
+ style="color:#000000;fill:#bcbcbc;fill-opacity:1;fill-rule:nonzero;stroke:#213149;stroke-width:2.03783631;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ d="m 229.06255,924.35918 0,0"
+ id="path15186"
+ inkscape:connector-curvature="0" />
+ <use
+ inkscape:export-ydpi="134.53"
+ inkscape:export-xdpi="134.53"
+ inkscape:export-filename="/home/rlafuente/Projects/GPG/infog/precolor.png"
+ x="0"
+ y="0"
+ xlink:href="#path3638"
+ id="use15188"
+ transform="translate(27.508011,546.95333)"
+ width="500"
+ height="2100"
+ style="color:#000000;fill:#bcbcbc;fill-opacity:1;fill-rule:nonzero;stroke:#213149;stroke-width:1.76498926;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+ <use
+ inkscape:export-ydpi="134.53"
+ inkscape:export-xdpi="134.53"
+ inkscape:export-filename="/home/rlafuente/Projects/GPG/infog/precolor.png"
+ x="0"
+ y="0"
+ xlink:href="#path3640"
+ id="use15190"
+ transform="translate(27.508011,546.95333)"
+ width="500"
+ height="2100"
+ style="color:#000000;fill:#bcbcbc;fill-opacity:1;fill-rule:nonzero;stroke:#213149;stroke-width:1.76498926;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+ <path
+ inkscape:export-ydpi="134.53"
+ inkscape:export-xdpi="134.53"
+ inkscape:export-filename="/home/rlafuente/Projects/GPG/infog/precolor.png"
+ style="color:#000000;fill:none;stroke:#213149;stroke-width:2.03783631;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ d="m 289.02899,857.79057 3.75242,-36.08089 8.08212,4.907 4.47403,31.46254 z"
+ id="path15202"
+ inkscape:connector-curvature="0" />
+ <path
+ inkscape:export-ydpi="134.53"
+ inkscape:export-xdpi="134.53"
+ inkscape:export-filename="/home/rlafuente/Projects/GPG/infog/precolor.png"
+ style="color:#000000;fill:none;stroke:#008000;stroke-width:2.03783631;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ d="m 289.02899,857.79057 15.67043,-4.19888 -14.82075,-3.97122 13.73278,-3.67967 -12.98814,-3.48016 12.0347,-3.22465 -11.38215,-3.04985 10.5466,-2.82596 -9.97474,-2.67276 9.2425,-2.47649"
+ id="path15204"
+ inkscape:connector-curvature="0" />
+ <path
+ inkscape:export-ydpi="134.53"
+ inkscape:export-xdpi="134.53"
+ inkscape:export-filename="/home/rlafuente/Projects/GPG/infog/precolor.png"
+ inkscape:connector-curvature="0"
+ id="path15206"
+ d="m 289.02899,857.79057 15.67043,-4.19888 -14.82075,-3.97122 13.73278,-3.67967 -12.98814,-3.48016 12.0347,-3.22465 -11.38215,-3.04985 10.5466,-2.82596 -9.97474,-2.67276 9.2425,-2.47649"
+ style="color:#000000;fill:none;stroke:#213149;stroke-width:2.03783631;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+ <g
+ inkscape:export-ydpi="134.53"
+ inkscape:export-xdpi="134.53"
+ inkscape:export-filename="/home/rlafuente/Projects/GPG/infog/precolor.png"
+ id="g15208"
+ transform="matrix(0.97062884,0.62526343,-0.62526343,0.97062884,132.373,332.53203)"
+ style="color:#000000;fill:#e1e1e1;fill-opacity:1;fill-rule:nonzero;stroke:#213149;stroke-width:1.76498926;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate">
+ <path
+ sodipodi:nodetypes="cscc"
+ inkscape:connector-curvature="0"
+ id="path15210"
+ d="m 324.5792,269.34446 c 8.05457,13.95092 25.89353,18.73085 39.84445,10.67628 4.03717,-2.33086 7.45686,-5.59543 9.97251,-9.52012 z"
+ style="color:#000000;fill:#e1e1e1;fill-opacity:1;fill-rule:nonzero;stroke:#213149;stroke-width:1.76498926;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+ <path
+ sodipodi:nodetypes="cc"
+ style="color:#000000;fill:#e1e1e1;fill-opacity:1;fill-rule:nonzero;stroke:#213149;stroke-width:1.76498926;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ d="m 348.92619,269.90951 0.25,-28.68768"
+ id="path15212"
+ inkscape:connector-curvature="0" />
+ <path
+ transform="translate(114.85156,-150.88227)"
+ d="m 236.12911,392.2916 c 0,0.99658 -0.80789,1.80448 -1.80448,1.80448 -0.99659,0 -1.80448,-0.8079 -1.80448,-1.80448 0,-0.99659 0.80789,-1.80448 1.80448,-1.80448 0.99659,0 1.80448,0.80789 1.80448,1.80448 z"
+ sodipodi:ry="1.8044801"
+ sodipodi:rx="1.8044801"
+ sodipodi:cy="392.2916"
+ sodipodi:cx="234.32463"
+ id="path15214"
+ style="color:#000000;fill:#e1e1e1;fill-opacity:1;fill-rule:nonzero;stroke:#213149;stroke-width:1.76498926;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ sodipodi:type="arc" />
+ </g>
+ <rect
+ inkscape:export-ydpi="134.53"
+ inkscape:export-xdpi="134.53"
+ inkscape:export-filename="/home/rlafuente/Projects/GPG/infog/precolor.png"
+ style="color:#000000;fill:#f5fffa;fill-opacity:1;fill-rule:nonzero;stroke:#213149;stroke-width:2.03783631;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ id="rect15216"
+ width="85.681778"
+ height="78.503403"
+ x="24.179277"
+ y="889.50464" />
+ <path
+ inkscape:export-ydpi="134.53"
+ inkscape:export-xdpi="134.53"
+ inkscape:export-filename="/home/rlafuente/Projects/GPG/infog/precolor.png"
+ style="color:#000000;fill:#f4a460;fill-opacity:1;fill-rule:nonzero;stroke:#213149;stroke-width:2.03783631;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ d="m 444.91952,856.84118 -64.87346,31.82334 15.08182,0 0,78.51202 99.61934,0 0,-78.51202 15.08181,0 -64.90951,-31.82334 z"
+ id="path15274"
+ inkscape:connector-curvature="0" />
+ <path
+ inkscape:export-ydpi="134.53"
+ inkscape:export-xdpi="134.53"
+ inkscape:export-filename="/home/rlafuente/Projects/GPG/infog/precolor.png"
+ sodipodi:nodetypes="ccccc"
+ inkscape:connector-curvature="0"
+ id="path15276"
+ d="m 442.38673,939.05285 c 0,0 2.14873,-1.55893 4.7015,0.84965 0.2746,1.36219 -0.30614,1.91374 -0.30614,1.91374 l -4.42438,0.0404 z"
+ style="color:#000000;fill:none;stroke:#008000;stroke-width:2.03783631;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+ <rect
+ inkscape:export-ydpi="134.53"
+ inkscape:export-xdpi="134.53"
+ inkscape:export-filename="/home/rlafuente/Projects/GPG/infog/precolor.png"
+ y="888.67987"
+ x="402.27277"
+ height="78.252388"
+ width="85.367004"
+ id="rect15278"
+ style="color:#000000;fill:#f5fffa;fill-opacity:1;fill-rule:nonzero;stroke:#213149;stroke-width:2.03783631;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+ <rect
+ inkscape:export-ydpi="134.53"
+ inkscape:export-xdpi="134.53"
+ inkscape:export-filename="/home/rlafuente/Projects/GPG/infog/precolor.png"
+ y="935.58582"
+ x="201.68094"
+ height="3.2656732"
+ width="32.615685"
+ id="rect15458"
+ style="color:#000000;fill:#e2cf96;fill-opacity:1;fill-rule:nonzero;stroke:#213149;stroke-width:2.03783631;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+ <path
+ sodipodi:nodetypes="csssccsscscccsssc"
+ inkscape:export-ydpi="134.53"
+ inkscape:export-xdpi="134.53"
+ inkscape:export-filename="/home/rlafuente/Projects/GPG/infog/precolor.png"
+ style="color:#000000;fill:none;stroke:#00000f;stroke-width:2.03784871000000001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:0.94117647;stroke-dasharray:16.30279034999999865, 4.07569758999999987, 2.03784879999999990, 4.07569758999999987;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ d="m 40.872871,969.64821 c 0,6.66693 0,13.33401 0,20.00094 0,2.86096 -0.07755,5.7211 -0.203457,8.57932 -0.125909,2.85813 -0.260085,5.74133 0.203457,8.56443 0.64232,3.9119 2.499193,7.6247 5.287895,10.4424 2.788704,2.8175 6.501793,4.7183 10.42714,5.2727 4.405136,0.6221 8.885113,0 13.333961,0 6.508243,0 13.016487,0 19.52474,0 59.093263,0 115.877333,-1.1195 174.970583,-1.1195 59.64254,0 121.59425,1.1195 181.23679,1.1195 2.38368,0 4.76684,0.06 7.14853,0.1576 2.38168,0.098 4.78139,0.2015 7.13786,-0.1576 3.84936,-0.5867 7.47791,-2.476 10.21502,-5.2454 2.73713,-2.7694 4.57734,-6.3984 5.2619,-10.2316 0.55201,-3.0909 0.39244,-6.2594 0.24242,-9.39568 -0.14999,-3.13621 -0.24242,-6.27506 -0.24242,-9.41486 l 0,-17.14368"
+ id="path15548"
+ inkscape:connector-curvature="0" />
+ <path
+ inkscape:export-ydpi="134.53"
+ inkscape:export-xdpi="134.53"
+ inkscape:export-filename="/home/rlafuente/Projects/GPG/infog/precolor.png"
+ inkscape:connector-curvature="0"
+ id="path15550"
+ d="m 252.36629,937.87537 -7.10795,4.11322 2.63392,24.21035 -5.55647,2.63384 10.0305,0 0,-1.76791 0,-1.87621 z"
+ style="color:#000000;fill:#ffe7d2;fill-opacity:1;fill-rule:nonzero;stroke:#213149;stroke-width:2.03783631;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ sodipodi:nodetypes="cccccccc" />
+ <path
+ inkscape:export-ydpi="134.53"
+ inkscape:export-xdpi="134.53"
+ inkscape:export-filename="/home/rlafuente/Projects/GPG/infog/precolor.png"
+ sodipodi:nodetypes="cccccccc"
+ style="color:#000000;fill:#ffe7d2;fill-opacity:1;fill-rule:nonzero;stroke:#213149;stroke-width:2.03783631;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ d="m 256.77307,937.87537 -7.10795,4.11322 2.63392,24.21035 -5.55646,2.63384 10.03049,0 0,-1.76791 0,-1.87621 z"
+ id="path15552"
+ inkscape:connector-curvature="0" />
+ <rect
+ inkscape:export-ydpi="134.53"
+ inkscape:export-xdpi="134.53"
+ inkscape:export-filename="/home/rlafuente/Projects/GPG/infog/precolor.png"
+ style="color:#000000;fill:#375163;fill-opacity:1;fill-rule:nonzero;stroke:#213149;stroke-width:2.03783631;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ id="rect15554"
+ width="15.87114"
+ height="29.212097"
+ x="243.84384"
+ y="923.09375" />
+ <path
+ inkscape:export-ydpi="134.53"
+ inkscape:export-xdpi="134.53"
+ inkscape:export-filename="/home/rlafuente/Projects/GPG/infog/precolor.png"
+ sodipodi:nodetypes="cssccccc"
+ inkscape:connector-curvature="0"
+ id="path15556"
+ d="m 225.85472,909.47503 c -0.75139,0 -1.86254,0.32375 -1.86254,1.63733 0,1.31346 1.19107,1.68824 1.86254,1.68824 0.90123,0 1.79035,0 1.79035,0 l 0,4.2774 3.98002,0 0,-7.60297 c -1.88062,0 -3.91511,0 -5.77037,0 z"
+ style="color:#000000;fill:#ffe7d2;fill-opacity:1;fill-rule:nonzero;stroke:#213149;stroke-width:2.03783631;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+ <path
+ inkscape:export-ydpi="134.53"
+ inkscape:export-xdpi="134.53"
+ inkscape:export-filename="/home/rlafuente/Projects/GPG/infog/precolor.png"
+ style="color:#000000;fill:#beadad;fill-opacity:1;fill-rule:nonzero;stroke:#213149;stroke-width:2.03783631;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ d="m 243.36662,901.25333 -4.76268,8.22644 -6.96361,0 0,7.82949 8.19036,0 3.17512,-3.35546 0,8.44293 -0.0361,0 -4.11322,10.35516 11.04076,0 1.98445,-2.30918 1.94836,2.30918 11.07684,0 -4.1493,-10.35516 -0.10819,0 0,-21.1434 -17.28274,0 z"
+ id="path15558"
+ inkscape:connector-curvature="0" />
+ <path
+ inkscape:export-ydpi="134.53"
+ inkscape:export-xdpi="134.53"
+ inkscape:export-filename="/home/rlafuente/Projects/GPG/infog/precolor.png"
+ style="color:#000000;fill:#beadad;fill-opacity:1;fill-rule:nonzero;stroke:#213149;stroke-width:2.03783631;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ d="m 251.77943,929.99426 0,-27.37193"
+ id="path15560"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cc" />
+ <path
+ inkscape:export-ydpi="134.53"
+ inkscape:export-xdpi="134.53"
+ inkscape:export-filename="/home/rlafuente/Projects/GPG/infog/precolor.png"
+ style="color:#000000;fill:#beadad;fill-opacity:1;fill-rule:nonzero;stroke:#213149;stroke-width:2.03783631;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ d="m 247.58163,901.10958 4.44815,12.68535 4.15255,-12.68535 z"
+ id="path15562"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cccc" />
+ <g
+ inkscape:export-ydpi="134.53"
+ inkscape:export-xdpi="134.53"
+ inkscape:export-filename="/home/rlafuente/Projects/GPG/infog/precolor.png"
+ id="g15564"
+ transform="matrix(1.1545885,0,0,1.1545885,-98.476951,579.19816)">
+ <path
+ style="color:#000000;fill:#d6a07e;fill-opacity:1;fill-rule:nonzero;stroke:#213149;stroke-width:1.76498926;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ d="m 298.42306,266.0069 0,0.90625 c 0,2.84739 2.30886,5.15625 5.15625,5.15625 2.66943,0 4.86091,-2.02516 5.125,-4.625 l 2.3125,9.3125 c 0,2.99605 -18.47503,3.75835 -15.0625,0 3.41253,-3.75835 2.1875,-10.75 2.1875,-10.75 z"
+ id="path15566"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="csscczcc" />
+ <path
+ style="color:#000000;fill:#ffe7d2;fill-opacity:1;fill-rule:nonzero;stroke:#213149;stroke-width:1.76498926;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ d="m 303.40965,261.88607 c 2.59977,0.26402 4.625,2.48682 4.625,5.15625 l 0,7.34375 c 0,2.84739 -2.30886,5.15625 -5.15625,5.15625 -2.84739,0 -5.15625,-2.30886 -5.15625,-5.15625 l 0,-0.90625 -2.71875,-0.0625 c -0.0244,-2.15098 1.65479,-3.48205 2.71875,-4.125 l 0,-2.25 c 0,-2.84739 2.30886,-5.15625 5.15625,-5.15625 0.17796,0 0.35793,-0.0176 0.53125,0 z"
+ id="path15568"
+ inkscape:connector-curvature="0" />
+ <path
+ style="color:#000000;fill:#ffe7d2;fill-opacity:1;fill-rule:nonzero;stroke:#213149;stroke-width:1.76498926;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ d="m 302.8925,266.84687 -4.77433,1.58618"
+ id="path15570"
+ inkscape:connector-curvature="0" />
+ <path
+ sodipodi:type="arc"
+ style="color:#000000;fill:#ffe7d2;fill-opacity:1;fill-rule:nonzero;stroke:#213149;stroke-width:1.76498926;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ id="path15572"
+ sodipodi:cx="275.71677"
+ sodipodi:cy="350.51285"
+ sodipodi:rx="1.4946961"
+ sodipodi:ry="1.4946961"
+ d="m 276.64803,351.68197 c -0.64569,0.51433 -1.58606,0.40784 -2.10039,-0.23785 -0.40452,-0.50784 -0.43493,-1.21875 -0.0753,-1.75928"
+ sodipodi:start="0.89816185"
+ sodipodi:end="3.7287121"
+ sodipodi:open="true"
+ transform="matrix(-1,0,0,1,576.01738,-81.440409)" />
+ <path
+ style="color:#000000;fill:#d6a07e;fill-opacity:1;fill-rule:nonzero;stroke:#213149;stroke-width:1.76498926;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ d="m 306.89208,259.95813 c 3.95907,1.06083 6.16631,4.22568 6.16631,8.6875 0,3.20529 1.08432,12.61557 4,15.53125 2.91568,2.91568 -17.66647,2.84493 -14.62876,-0.19278 2.41613,-2.41613 3.05971,-7.81538 3.41001,-11.55722 0.41605,-0.27379 0.75456,-0.73249 0.875,-1.34375 0.17531,-0.88976 -0.15466,-1.75124 -0.75,-2.125 -0.0892,-2.42425 0.87321,-5.41914 -2.28549,-4.57277 -3.1587,0.84637 -8.93326,1.47578 -8.93326,-1.83817 0,-3.31395 8.18712,-3.64989 12.14619,-2.58906 z"
+ id="path15574"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="zssscsczzz" />
+ </g>
+ <rect
+ inkscape:export-ydpi="134.53"
+ inkscape:export-xdpi="134.53"
+ inkscape:export-filename="/home/rlafuente/Projects/GPG/infog/precolor.png"
+ transform="matrix(0.96592583,0.25881905,-0.25881905,0.96592583,0,0)"
+ y="790.31787"
+ x="478.44461"
+ height="11.202963"
+ width="4.7517385"
+ id="rect15576"
+ style="color:#000000;fill:#696969;fill-opacity:1;fill-rule:nonzero;stroke:#213149;stroke-width:2.03783631;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+ <path
+ inkscape:export-ydpi="134.53"
+ inkscape:export-xdpi="134.53"
+ inkscape:export-filename="/home/rlafuente/Projects/GPG/infog/precolor.png"
+ style="color:#000000;fill:#beadad;fill-opacity:1;fill-rule:nonzero;stroke:#213149;stroke-width:2.03783631;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ d="m 255.42151,918.4702 c 0,0 4.5541,-5.52332 6.76728,-9.35666 2.21318,-3.83336 1.80224,-7.13109 -0.58329,-7.13109 -2.38552,0 -7.25996,-0.72912 -7.25996,-0.72912 z"
+ id="path15578"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="czzcc" />
+ <path
+ inkscape:export-ydpi="134.53"
+ inkscape:export-xdpi="134.53"
+ inkscape:export-filename="/home/rlafuente/Projects/GPG/infog/precolor.png"
+ style="color:#000000;fill:#ffe7d2;fill-opacity:1;fill-rule:nonzero;stroke:#213149;stroke-width:2.03783631;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ d="m 262.31753,897.52851 c 0.19354,-0.72601 0.16693,-1.88313 -1.10226,-2.22144 -1.26903,-0.33886 -1.93811,0.71597 -2.11106,1.36485 -0.23215,0.87079 -0.46115,1.72992 -0.46115,1.72992 l -4.13308,-1.10148 -1.02566,3.84559 7.34623,1.95888 c 0.48451,-1.8172 1.00884,-3.7829 1.48678,-5.57552 z"
+ id="path15580"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cssccccc" />
+ <path
+ inkscape:export-ydpi="134.53"
+ inkscape:export-xdpi="134.53"
+ inkscape:export-filename="/home/rlafuente/Projects/GPG/infog/precolor.png"
+ style="color:#000000;fill:#beadad;fill-opacity:1;fill-rule:nonzero;stroke:#213149;stroke-width:2.03783631;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ d="m 254.086,901.27862 6.15042,1.64805 c 0.33184,0.089 0.54884,0.43412 0.43848,0.75949 l -4.82212,14.21495 c -0.11037,0.32536 -0.42958,0.53446 -0.75944,0.43851 l -4.60022,-1.33794 c -0.32996,-0.0958 -0.51396,-0.42442 -0.43846,-0.75948 l 3.27187,-14.52508 c 0.0755,-0.33505 0.42763,-0.52742 0.75946,-0.43839 z"
+ id="path15582"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="sssssssss" />
+ <path
+ inkscape:export-ydpi="134.53"
+ inkscape:export-xdpi="134.53"
+ inkscape:export-filename="/home/rlafuente/Projects/GPG/infog/precolor.png"
+ style="color:#000000;fill:#beadad;fill-opacity:1;fill-rule:nonzero;stroke:#213149;stroke-width:2.03783631;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ d="m 245.22648,926.65278 2.76867,0"
+ id="path15584"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cc" />
+ <path
+ inkscape:export-ydpi="134.53"
+ inkscape:export-xdpi="134.53"
+ inkscape:export-filename="/home/rlafuente/Projects/GPG/infog/precolor.png"
+ sodipodi:nodetypes="cc"
+ inkscape:connector-curvature="0"
+ id="path15586"
+ d="m 255.90557,926.65278 2.76866,0"
+ style="color:#000000;fill:#beadad;fill-opacity:1;fill-rule:nonzero;stroke:#213149;stroke-width:2.03783631;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+ <g
+ inkscape:export-ydpi="134.53"
+ inkscape:export-xdpi="134.53"
+ inkscape:export-filename="/home/rlafuente/Projects/GPG/infog/precolor.png"
+ transform="matrix(1.1545885,0,0,1.1545885,2.7051383,-671.65371)"
+ id="g16010">
+ <path
+ sodipodi:type="star"
+ style="color:#000000;fill:none;stroke:#008000;stroke-width:8.01641655;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ id="path15975"
+ sodipodi:sides="6"
+ sodipodi:cx="614.74347"
+ sodipodi:cy="84.027534"
+ sodipodi:r1="39.67765"
+ sodipodi:r2="34.361855"
+ sodipodi:arg1="0.52359878"
+ sodipodi:arg2="1.0471976"
+ inkscape:flatsided="true"
+ inkscape:rounded="0"
+ inkscape:randomized="0"
+ d="m 649.10532,103.86636 -34.36185,19.83882 -34.36185,-19.83882 0,-39.677651 34.36185,-19.838825 34.36185,19.838825 z"
+ transform="matrix(0.22017186,0,0,0.22017186,-69.382813,1458.8451)" />
+ <path
+ style="color:#000000;fill:none;stroke:#008000;stroke-width:1.76498926;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ d="m 58.400885,1472.9776 7.454301,4.3124 7.676724,-4.3124"
+ id="path15977"
+ inkscape:connector-curvature="0" />
+ <path
+ style="color:#000000;fill:none;stroke:#008000;stroke-width:1.76498926;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ d="M 65.966395,1486.0815 65.855186,1477.29"
+ id="path15979"
+ inkscape:connector-curvature="0" />
+ <path
+ inkscape:connector-curvature="0"
+ id="path15981"
+ d="m 58.400885,1475.6517 7.454301,4.3124 7.676724,-4.3124"
+ style="color:#000000;fill:none;stroke:#008000;stroke-width:1.76498926;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+ <path
+ style="font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:none;stroke:#008000;stroke-width:1.76498926;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans"
+ d="m 69.889405,1479.9966 0,0.5922 0.275454,-0.217 0,-0.5922 z"
+ id="path15983"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccccc" />
+ </g>
+ <g
+ inkscape:export-ydpi="134.53"
+ inkscape:export-xdpi="134.53"
+ inkscape:export-filename="/home/rlafuente/Projects/GPG/infog/precolor.png"
+ id="g16017"
+ transform="matrix(1.1545885,0,0,1.1545885,188.61641,-671.65371)">
+ <path
+ transform="matrix(0.22017186,0,0,0.22017186,-69.382813,1458.8451)"
+ d="m 649.10532,103.86636 -34.36185,19.83882 -34.36185,-19.83882 0,-39.677651 34.36185,-19.838825 34.36185,19.838825 z"
+ inkscape:randomized="0"
+ inkscape:rounded="0"
+ inkscape:flatsided="true"
+ sodipodi:arg2="1.0471976"
+ sodipodi:arg1="0.52359878"
+ sodipodi:r2="34.361855"
+ sodipodi:r1="39.67765"
+ sodipodi:cy="84.027534"
+ sodipodi:cx="614.74347"
+ sodipodi:sides="6"
+ id="path16019"
+ style="color:#000000;fill:none;stroke:#008000;stroke-width:8.01641655;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ sodipodi:type="star" />
+ <path
+ inkscape:connector-curvature="0"
+ id="path16021"
+ d="m 58.400885,1472.9776 7.454301,4.3124 7.676724,-4.3124"
+ style="color:#000000;fill:none;stroke:#008000;stroke-width:1.76498926;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+ <path
+ inkscape:connector-curvature="0"
+ id="path16023"
+ d="M 65.966395,1486.0815 65.855186,1477.29"
+ style="color:#000000;fill:none;stroke:#008000;stroke-width:1.76498926;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+ <path
+ style="color:#000000;fill:none;stroke:#008000;stroke-width:1.76498926;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ d="m 58.400885,1475.6517 7.454301,4.3124 7.676724,-4.3124"
+ id="path16025"
+ inkscape:connector-curvature="0" />
+ <path
+ sodipodi:nodetypes="ccccc"
+ inkscape:connector-curvature="0"
+ id="path16027"
+ d="m 69.889405,1479.9966 0,0.5922 0.275454,-0.217 0,-0.5922 z"
+ style="font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:none;stroke:#008000;stroke-width:1.76498926;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans" />
+ </g>
+ <g
+ inkscape:export-ydpi="134.53"
+ inkscape:export-xdpi="134.53"
+ inkscape:export-filename="/home/rlafuente/Projects/GPG/infog/precolor.png"
+ transform="matrix(1.1545885,0,0,1.1545885,162.05766,-671.65371)"
+ id="g16029">
+ <path
+ sodipodi:type="star"
+ style="color:#000000;fill:none;stroke:#008000;stroke-width:8.01641655;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ id="path16031"
+ sodipodi:sides="6"
+ sodipodi:cx="614.74347"
+ sodipodi:cy="84.027534"
+ sodipodi:r1="39.67765"
+ sodipodi:r2="34.361855"
+ sodipodi:arg1="0.52359878"
+ sodipodi:arg2="1.0471976"
+ inkscape:flatsided="true"
+ inkscape:rounded="0"
+ inkscape:randomized="0"
+ d="m 649.10532,103.86636 -34.36185,19.83882 -34.36185,-19.83882 0,-39.677651 34.36185,-19.838825 34.36185,19.838825 z"
+ transform="matrix(0.22017186,0,0,0.22017186,-69.382813,1458.8451)" />
+ <path
+ style="color:#000000;fill:none;stroke:#008000;stroke-width:1.76498926;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ d="m 58.400885,1472.9776 7.454301,4.3124 7.676724,-4.3124"
+ id="path16033"
+ inkscape:connector-curvature="0" />
+ <path
+ style="color:#000000;fill:none;stroke:#008000;stroke-width:1.76498926;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ d="M 65.966395,1486.0815 65.855186,1477.29"
+ id="path16035"
+ inkscape:connector-curvature="0" />
+ <path
+ inkscape:connector-curvature="0"
+ id="path16037"
+ d="m 58.400885,1475.6517 7.454301,4.3124 7.676724,-4.3124"
+ style="color:#000000;fill:none;stroke:#008000;stroke-width:1.76498926;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+ <path
+ style="font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:none;stroke:#008000;stroke-width:1.76498926;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans"
+ d="m 69.889405,1479.9966 0,0.5922 0.275454,-0.217 0,-0.5922 z"
+ id="path16039"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccccc" />
+ </g>
+ <g
+ inkscape:export-ydpi="134.53"
+ inkscape:export-xdpi="134.53"
+ inkscape:export-filename="/home/rlafuente/Projects/GPG/infog/precolor.png"
+ id="g16041"
+ transform="matrix(1.1545885,0,0,1.1545885,135.49892,-671.65371)">
+ <path
+ transform="matrix(0.22017186,0,0,0.22017186,-69.382813,1458.8451)"
+ d="m 649.10532,103.86636 -34.36185,19.83882 -34.36185,-19.83882 0,-39.677651 34.36185,-19.838825 34.36185,19.838825 z"
+ inkscape:randomized="0"
+ inkscape:rounded="0"
+ inkscape:flatsided="true"
+ sodipodi:arg2="1.0471976"
+ sodipodi:arg1="0.52359878"
+ sodipodi:r2="34.361855"
+ sodipodi:r1="39.67765"
+ sodipodi:cy="84.027534"
+ sodipodi:cx="614.74347"
+ sodipodi:sides="6"
+ id="path16043"
+ style="color:#000000;fill:none;stroke:#008000;stroke-width:8.01641655;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ sodipodi:type="star" />
+ <path
+ inkscape:connector-curvature="0"
+ id="path16045"
+ d="m 58.400885,1472.9776 7.454301,4.3124 7.676724,-4.3124"
+ style="color:#000000;fill:none;stroke:#008000;stroke-width:1.76498926;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+ <path
+ inkscape:connector-curvature="0"
+ id="path16047"
+ d="M 65.966395,1486.0815 65.855186,1477.29"
+ style="color:#000000;fill:none;stroke:#008000;stroke-width:1.76498926;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+ <path
+ style="color:#000000;fill:none;stroke:#008000;stroke-width:1.76498926;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ d="m 58.400885,1475.6517 7.454301,4.3124 7.676724,-4.3124"
+ id="path16049"
+ inkscape:connector-curvature="0" />
+ <path
+ sodipodi:nodetypes="ccccc"
+ inkscape:connector-curvature="0"
+ id="path16051"
+ d="m 69.889405,1479.9966 0,0.5922 0.275454,-0.217 0,-0.5922 z"
+ style="font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:none;stroke:#008000;stroke-width:1.76498926;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans" />
+ </g>
+ <g
+ inkscape:export-ydpi="134.53"
+ inkscape:export-xdpi="134.53"
+ inkscape:export-filename="/home/rlafuente/Projects/GPG/infog/precolor.png"
+ transform="matrix(1.1545885,0,0,1.1545885,108.94017,-671.65371)"
+ id="g16053">
+ <path
+ sodipodi:type="star"
+ style="color:#000000;fill:none;stroke:#008000;stroke-width:8.01641655;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ id="path16055"
+ sodipodi:sides="6"
+ sodipodi:cx="614.74347"
+ sodipodi:cy="84.027534"
+ sodipodi:r1="39.67765"
+ sodipodi:r2="34.361855"
+ sodipodi:arg1="0.52359878"
+ sodipodi:arg2="1.0471976"
+ inkscape:flatsided="true"
+ inkscape:rounded="0"
+ inkscape:randomized="0"
+ d="m 649.10532,103.86636 -34.36185,19.83882 -34.36185,-19.83882 0,-39.677651 34.36185,-19.838825 34.36185,19.838825 z"
+ transform="matrix(0.22017186,0,0,0.22017186,-69.382813,1458.8451)" />
+ <path
+ style="color:#000000;fill:none;stroke:#008000;stroke-width:1.76498926;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ d="m 58.400885,1472.9776 7.454301,4.3124 7.676724,-4.3124"
+ id="path16057"
+ inkscape:connector-curvature="0" />
+ <path
+ style="color:#000000;fill:none;stroke:#008000;stroke-width:1.76498926;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ d="M 65.966395,1486.0815 65.855186,1477.29"
+ id="path16059"
+ inkscape:connector-curvature="0" />
+ <path
+ inkscape:connector-curvature="0"
+ id="path16061"
+ d="m 58.400885,1475.6517 7.454301,4.3124 7.676724,-4.3124"
+ style="color:#000000;fill:none;stroke:#008000;stroke-width:1.76498926;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+ <path
+ style="font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:none;stroke:#008000;stroke-width:1.76498926;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans"
+ d="m 69.889405,1479.9966 0,0.5922 0.275454,-0.217 0,-0.5922 z"
+ id="path16063"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccccc" />
+ </g>
+ <g
+ inkscape:export-ydpi="134.53"
+ inkscape:export-xdpi="134.53"
+ inkscape:export-filename="/home/rlafuente/Projects/GPG/infog/precolor.png"
+ id="g16065"
+ transform="matrix(1.1545885,0,0,1.1545885,82.381412,-671.65371)">
+ <path
+ transform="matrix(0.22017186,0,0,0.22017186,-69.382813,1458.8451)"
+ d="m 649.10532,103.86636 -34.36185,19.83882 -34.36185,-19.83882 0,-39.677651 34.36185,-19.838825 34.36185,19.838825 z"
+ inkscape:randomized="0"
+ inkscape:rounded="0"
+ inkscape:flatsided="true"
+ sodipodi:arg2="1.0471976"
+ sodipodi:arg1="0.52359878"
+ sodipodi:r2="34.361855"
+ sodipodi:r1="39.67765"
+ sodipodi:cy="84.027534"
+ sodipodi:cx="614.74347"
+ sodipodi:sides="6"
+ id="path16067"
+ style="color:#000000;fill:none;stroke:#008000;stroke-width:8.01641655;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ sodipodi:type="star" />
+ <path
+ inkscape:connector-curvature="0"
+ id="path16069"
+ d="m 58.400885,1472.9776 7.454301,4.3124 7.676724,-4.3124"
+ style="color:#000000;fill:none;stroke:#008000;stroke-width:1.76498926;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+ <path
+ inkscape:connector-curvature="0"
+ id="path16071"
+ d="M 65.966395,1486.0815 65.855186,1477.29"
+ style="color:#000000;fill:none;stroke:#008000;stroke-width:1.76498926;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+ <path
+ style="color:#000000;fill:none;stroke:#008000;stroke-width:1.76498926;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ d="m 58.400885,1475.6517 7.454301,4.3124 7.676724,-4.3124"
+ id="path16073"
+ inkscape:connector-curvature="0" />
+ <path
+ sodipodi:nodetypes="ccccc"
+ inkscape:connector-curvature="0"
+ id="path16075"
+ d="m 69.889405,1479.9966 0,0.5922 0.275454,-0.217 0,-0.5922 z"
+ style="font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:none;stroke:#008000;stroke-width:1.76498926;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans" />
+ </g>
+ <g
+ inkscape:export-ydpi="134.53"
+ inkscape:export-xdpi="134.53"
+ inkscape:export-filename="/home/rlafuente/Projects/GPG/infog/precolor.png"
+ transform="matrix(1.1545885,0,0,1.1545885,55.82266,-671.65371)"
+ id="g16077">
+ <path
+ sodipodi:type="star"
+ style="color:#000000;fill:none;stroke:#008000;stroke-width:8.01641655;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ id="path16079"
+ sodipodi:sides="6"
+ sodipodi:cx="614.74347"
+ sodipodi:cy="84.027534"
+ sodipodi:r1="39.67765"
+ sodipodi:r2="34.361855"
+ sodipodi:arg1="0.52359878"
+ sodipodi:arg2="1.0471976"
+ inkscape:flatsided="true"
+ inkscape:rounded="0"
+ inkscape:randomized="0"
+ d="m 649.10532,103.86636 -34.36185,19.83882 -34.36185,-19.83882 0,-39.677651 34.36185,-19.838825 34.36185,19.838825 z"
+ transform="matrix(0.22017186,0,0,0.22017186,-69.382813,1458.8451)" />
+ <path
+ style="color:#000000;fill:none;stroke:#008000;stroke-width:1.76498926;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ d="m 58.400885,1472.9776 7.454301,4.3124 7.676724,-4.3124"
+ id="path16081"
+ inkscape:connector-curvature="0" />
+ <path
+ style="color:#000000;fill:none;stroke:#008000;stroke-width:1.76498926;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ d="M 65.966395,1486.0815 65.855186,1477.29"
+ id="path16083"
+ inkscape:connector-curvature="0" />
+ <path
+ inkscape:connector-curvature="0"
+ id="path16085"
+ d="m 58.400885,1475.6517 7.454301,4.3124 7.676724,-4.3124"
+ style="color:#000000;fill:none;stroke:#008000;stroke-width:1.76498926;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+ <path
+ style="font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:none;stroke:#008000;stroke-width:1.76498926;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans"
+ d="m 69.889405,1479.9966 0,0.5922 0.275454,-0.217 0,-0.5922 z"
+ id="path16087"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccccc" />
+ </g>
+ <g
+ inkscape:export-ydpi="134.53"
+ inkscape:export-xdpi="134.53"
+ inkscape:export-filename="/home/rlafuente/Projects/GPG/infog/precolor.png"
+ id="g16089"
+ transform="matrix(1.1545885,0,0,1.1545885,29.263901,-671.65371)">
+ <path
+ transform="matrix(0.22017186,0,0,0.22017186,-69.382813,1458.8451)"
+ d="m 649.10532,103.86636 -34.36185,19.83882 -34.36185,-19.83882 0,-39.677651 34.36185,-19.838825 34.36185,19.838825 z"
+ inkscape:randomized="0"
+ inkscape:rounded="0"
+ inkscape:flatsided="true"
+ sodipodi:arg2="1.0471976"
+ sodipodi:arg1="0.52359878"
+ sodipodi:r2="34.361855"
+ sodipodi:r1="39.67765"
+ sodipodi:cy="84.027534"
+ sodipodi:cx="614.74347"
+ sodipodi:sides="6"
+ id="path16091"
+ style="color:#000000;fill:none;stroke:#008000;stroke-width:8.01641655;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ sodipodi:type="star" />
+ <path
+ inkscape:connector-curvature="0"
+ id="path16093"
+ d="m 58.400885,1472.9776 7.454301,4.3124 7.676724,-4.3124"
+ style="color:#000000;fill:none;stroke:#008000;stroke-width:1.76498926;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+ <path
+ inkscape:connector-curvature="0"
+ id="path16095"
+ d="M 65.966395,1486.0815 65.855186,1477.29"
+ style="color:#000000;fill:none;stroke:#008000;stroke-width:1.76498926;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+ <path
+ style="color:#000000;fill:none;stroke:#008000;stroke-width:1.76498926;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ d="m 58.400885,1475.6517 7.454301,4.3124 7.676724,-4.3124"
+ id="path16097"
+ inkscape:connector-curvature="0" />
+ <path
+ sodipodi:nodetypes="ccccc"
+ inkscape:connector-curvature="0"
+ id="path16099"
+ d="m 69.889405,1479.9966 0,0.5922 0.275454,-0.217 0,-0.5922 z"
+ style="font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:none;stroke:#008000;stroke-width:1.76498926;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans" />
+ </g>
+ <g
+ inkscape:export-ydpi="134.53"
+ inkscape:export-xdpi="134.53"
+ inkscape:export-filename="/home/rlafuente/Projects/GPG/infog/precolor.png"
+ transform="matrix(1.1545885,0,0,1.1545885,215.17514,-671.65371)"
+ id="g16101">
+ <path
+ sodipodi:type="star"
+ style="color:#000000;fill:none;stroke:#008000;stroke-width:8.01641655;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ id="path16103"
+ sodipodi:sides="6"
+ sodipodi:cx="614.74347"
+ sodipodi:cy="84.027534"
+ sodipodi:r1="39.67765"
+ sodipodi:r2="34.361855"
+ sodipodi:arg1="0.52359878"
+ sodipodi:arg2="1.0471976"
+ inkscape:flatsided="true"
+ inkscape:rounded="0"
+ inkscape:randomized="0"
+ d="m 649.10532,103.86636 -34.36185,19.83882 -34.36185,-19.83882 0,-39.677651 34.36185,-19.838825 34.36185,19.838825 z"
+ transform="matrix(0.22017186,0,0,0.22017186,-69.382813,1458.8451)" />
+ <path
+ style="color:#000000;fill:none;stroke:#008000;stroke-width:1.76498926;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ d="m 58.400885,1472.9776 7.454301,4.3124 7.676724,-4.3124"
+ id="path16105"
+ inkscape:connector-curvature="0" />
+ <path
+ style="color:#000000;fill:none;stroke:#008000;stroke-width:1.76498926;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ d="M 65.966395,1486.0815 65.855186,1477.29"
+ id="path16107"
+ inkscape:connector-curvature="0" />
+ <path
+ inkscape:connector-curvature="0"
+ id="path16109"
+ d="m 58.400885,1475.6517 7.454301,4.3124 7.676724,-4.3124"
+ style="color:#000000;fill:none;stroke:#008000;stroke-width:1.76498926;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+ <path
+ style="font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:none;stroke:#008000;stroke-width:1.76498926;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans"
+ d="m 69.889405,1479.9966 0,0.5922 0.275454,-0.217 0,-0.5922 z"
+ id="path16111"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccccc" />
+ </g>
+ <path
+ inkscape:export-ydpi="134.53"
+ inkscape:export-xdpi="134.53"
+ inkscape:export-filename="/home/rlafuente/Projects/GPG/infog/precolor.png"
+ inkscape:connector-curvature="0"
+ style="color:#000000;fill:#b22222;fill-opacity:1;fill-rule:nonzero;stroke:#b22222;stroke-width:2.12883234;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ d="m 235.32388,854.12614 0,14.15525 34.09674,0 c 0,0 3.04482,7.91817 -4.25612,12.19442 9.80412,-2.399 11.04678,-12.19442 11.04678,-12.19442 l 5.1169,0 0,-14.15525 -46.0043,0 z"
+ id="path16245" />
+ <text
+ inkscape:export-ydpi="134.53"
+ inkscape:export-xdpi="134.53"
+ inkscape:export-filename="/home/rlafuente/Projects/GPG/infog/precolor.png"
+ xml:space="preserve"
+ style="font-size:12.16765976px;font-style:normal;font-variant:normal;font-weight:800;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#ffffff;fill-opacity:1;stroke:none;font-family:Dosis;-inkscape-font-specification:Dosis Ultra-Bold"
+ x="235.54887"
+ y="865.06903"
+ id="text16247"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan16249"
+ x="235.54887"
+ y="865.06903">%#&amp;$!</tspan></text>
+ <g
+ inkscape:export-ydpi="134.53"
+ inkscape:export-xdpi="134.53"
+ inkscape:export-filename="/home/rlafuente/Projects/GPG/infog/precolor.png"
+ transform="matrix(1.1545885,0,0,1.1545885,-207.21422,411.06092)"
+ id="g16580">
+ <path
+ sodipodi:nodetypes="czzc"
+ inkscape:connector-curvature="0"
+ id="path5477"
+ d="m 582.02501,478.1979 c 0,0 0.1848,-3.72883 -1.78312,-4.033 -1.96792,-0.30417 -5.24362,1.4559 -5.22172,-1.6261 0.0219,-3.082 2.71637,-1.5138 2.71637,-1.5138"
+ style="color:#000000;fill:none;stroke:#213149;stroke-width:1.76498926;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+ <rect
+ style="color:#000000;fill:#f0e68c;fill-opacity:1;fill-rule:nonzero;stroke:#213149;stroke-width:1.76498926;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ id="rect5600"
+ width="16.721498"
+ height="15.198018"
+ x="580.9635"
+ y="465.04739"
+ ry="4.5931172"
+ rx="5.1732965" />
+ <path
+ style="color:#000000;fill:#f0e68c;fill-opacity:1;fill-rule:nonzero;stroke:#213149;stroke-width:1.76498926;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ d="m 586.53033,459.0876 c 0.0729,0.029 0.13302,0.098 0.18907,0.189 l 3.18717,5.1859 4.13253,0 3.21418,-5.1859 c 0.85531,0 1.53957,0.6843 1.53957,1.5396 l 0,18.1469 c 0,0.8553 -0.68426,1.5396 -1.53957,1.5396 l -10.5339,0 c -0.85532,0 -1.53957,-0.6843 -1.53957,-1.5396 l 0,-18.1469 c 0,-0.7484 0.8404,-1.9337 1.3505,-1.7286 z"
+ id="path5479"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cccccssccsscc" />
+ <path
+ style="color:#000000;fill:#213149;fill-opacity:1;stroke:#213149;stroke-width:0.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ inkscape:transform-center-y="0.24214388"
+ d="m 592.06728,473.4687 0.62745,-1.0101 -1.25489,0 z"
+ id="path5485"
+ inkscape:connector-curvature="0" />
+ <path
+ sodipodi:nodetypes="ccc"
+ style="color:#000000;fill:none;stroke:#213149;stroke-width:1.76498926;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ d="m 594.3761,474.908 c -2.05526,0.2491 -2.24652,-1.1211 -2.24652,-1.1211 0,0 -0.62721,1.3079 -1.6237,1.2456"
+ id="path5487"
+ inkscape:connector-curvature="0" />
+ <path
+ style="color:#000000;fill:none;stroke:#213149;stroke-width:1.76498926;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ d="m 596.59642,471.223 c 0,0.5383 -0.47097,0.9747 -1.2514,0.9747 -0.78043,0 -1.2514,-0.4364 -1.2514,-0.9747"
+ id="path5505"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="czc" />
+ <path
+ inkscape:connector-curvature="0"
+ id="path5567"
+ d="m 583.51179,477.5599 9.69477,2.5586 0,1.3269 -9.69477,0 z"
+ style="color:#000000;fill:#f0e68c;fill-opacity:1;fill-rule:nonzero;stroke:#213149;stroke-width:1.76498926;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ sodipodi:nodetypes="ccccc" />
+ <path
+ sodipodi:nodetypes="czc"
+ inkscape:connector-curvature="0"
+ id="path5571"
+ d="m 589.92436,471.223 c 0,0.5383 -0.47097,0.9747 -1.2514,0.9747 -0.78043,0 -1.2514,-0.4364 -1.2514,-0.9747"
+ style="color:#000000;fill:none;stroke:#213149;stroke-width:1.76498926;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+ <path
+ sodipodi:nodetypes="ccccc"
+ style="color:#000000;fill:#f0e68c;fill-opacity:1;fill-rule:nonzero;stroke:#213149;stroke-width:1.76498926;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ d="m 598.79285,477.5599 -9.69477,2.5586 0,1.3269 9.69477,0 z"
+ id="path5860"
+ inkscape:connector-curvature="0" />
+ </g>
+ <path
+ inkscape:connector-curvature="0"
+ id="path8448-07"
+ d="m 69.289514,938.00401 0,0.79378 -9.020223,0 -2.128773,0 c -0.590284,0 -1.182586,0.0323 -1.767963,0.10853 -0.290114,0.0381 -0.550392,0.0936 -0.82986,0.18046 -0.279457,0.0866 -0.557736,0.21937 -0.757699,0.43297 -0.190081,0.20298 -0.329012,0.45192 -0.39689,0.72162 -0.06789,0.26971 -0.06015,0.552 -0.07216,0.82981 -0.03152,0.72669 -0.01385,1.4737 0,2.20099 0.09618,5.02881 0.01248,10.05207 0,15.08181 -0.0023,0.88499 -0.0023,1.78499 0,2.66999 l 6.02551,0 -0.252566,-14.72101 12.051018,0 c 1.793479,0 3.597516,0.0866 5.376049,-0.14433 0.889261,-0.11557 1.796094,-0.31993 2.59782,-0.72161 0.801755,-0.40168 1.48842,-1.01385 1.912298,-1.80404 0.491815,-0.91698 0.554746,-1.99063 0.577294,-3.0308 0.01869,-0.86433 0.0052,-1.73339 0,-2.59782 l -13.313851,0 z"
+ style="color:#000000;fill:#497b7b;fill-opacity:1;stroke:#213149;stroke-width:2.03783631;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+ <path
+ inkscape:connector-curvature="0"
+ id="path4537-1"
+ d="m 69.289514,938.00401 13.313856,0 c -0.0032,-0.49231 0.0032,-0.98707 0,-1.47925 -0.01837,-2.44208 -0.0073,-4.8823 0,-7.32449 0.0084,-2.52832 0.01155,-5.04856 0,-7.57699 -0.0021,-0.56344 0.02362,-1.13553 -0.03601,-1.69573 -0.159515,-1.49682 -0.758066,-2.94399 -1.659726,-4.14937 -0.901636,-1.2054 -2.109026,-2.16635 -3.499845,-2.74215 -1.390818,-0.57579 -2.948161,-0.7566 -4.43795,-0.54116 -1.489789,0.21533 -2.906342,0.82184 -4.077141,1.76792 l 0.39689,23.74122 z"
+ style="color:#000000;fill:#fa8072;stroke:#213149;stroke-width:2.03783631;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+ <g
+ style="color:#000000;fill:#fffbb9;fill-opacity:1;fill-rule:nonzero;stroke:#213149;stroke-width:1.76498926;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ id="g4531-4"
+ transform="matrix(-1.0985315,0.35539148,0.35539148,1.0985315,621.52368,304.85496)">
+ <path
+ sodipodi:nodetypes="ssssscccsss"
+ id="path4533-6"
+ d="m 620.03942,344.29143 c -2.59977,0.26402 -4.625,2.48682 -4.625,5.15625 l 0,5.70857 c 0,2.84739 2.30886,5.15625 5.15625,5.15625 2.84739,0 5.15625,-2.30886 5.15625,-5.15625 l 0,-0.90625 2.71875,-0.0625 c 0.0244,-2.15098 -1.65479,-3.48205 -2.71875,-4.125 l 0,-0.61482 c 0,-2.84739 -2.30886,-5.15625 -5.15625,-5.15625 -0.17796,0 -0.35793,-0.0176 -0.53125,0 z"
+ style="color:#000000;fill:#fffbb9;fill-opacity:1;fill-rule:nonzero;stroke:#213149;stroke-width:1.76498926;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ inkscape:connector-curvature="0" />
+ <path
+ transform="translate(348.41125,0.21364798)"
+ sodipodi:open="true"
+ sodipodi:end="4.0130333"
+ sodipodi:start="2.1549128"
+ d="m 274.8925,351.75972 c -0.68863,-0.45523 -0.87784,-1.38251 -0.42261,-2.07114 0.0791,-0.11963 0.17496,-0.22725 0.2847,-0.31956"
+ sodipodi:ry="1.4946961"
+ sodipodi:rx="1.4946961"
+ sodipodi:cy="350.51285"
+ sodipodi:cx="275.71677"
+ id="path4535-7"
+ style="color:#000000;fill:#fffbb9;fill-opacity:1;fill-rule:nonzero;stroke:#213149;stroke-width:1.76498926;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ sodipodi:type="arc" />
+ </g>
+ <path
+ sodipodi:nodetypes="cccccc"
+ inkscape:connector-curvature="0"
+ inkscape:original-d="m 70.763336,922.79473 -5.599017,5.6031 -13.116484,4.99117 0,2.72205 19.725766,-1.44322 5.089976,-5.72884"
+ inkscape:path-effect="#path-effect4543-2"
+ id="path4541-4"
+ d="m 70.763336,922.79473 -5.599017,5.6031 -13.116484,4.99117 0,2.72205 19.725766,-1.44322 5.089976,-5.72884"
+ style="color:#000000;fill:#fa8072;fill-opacity:1;fill-rule:nonzero;stroke:#213149;stroke-width:2.03783631;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+ <path
+ style="color:#000000;fill:#fffbb9;fill-opacity:1;fill-rule:nonzero;stroke:#213149;stroke-width:2.03783631;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ d="m 51.588471,933.43588 c 0,0 -2.148712,-1.55893 -4.701484,0.84967 -0.274608,1.36229 0.306138,1.91372 0.306138,1.91372 l 4.424384,0.0404 z"
+ id="path4545-0"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccccc" />
+ <path
+ sodipodi:nodetypes="ccc"
+ inkscape:connector-curvature="0"
+ inkscape:original-d="m 51.025055,939.2572 -13.266778,0 -8.7315,-18.88883"
+ inkscape:path-effect="#path-effect4566-97"
+ id="path4564-5"
+ d="m 51.025055,939.2572 -13.266778,0 -8.7315,-18.88883"
+ style="color:#000000;fill:none;stroke:#213149;stroke-width:2.03783631;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+ <rect
+ y="946.31622"
+ x="62.539154"
+ height="3.2656732"
+ width="20.126583"
+ id="rect4620-0"
+ style="color:#000000;fill:#a26b3c;fill-opacity:1;fill-rule:nonzero;stroke:#213149;stroke-width:2.03783631;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+ <rect
+ y="949.58191"
+ x="64.622307"
+ height="18.419437"
+ width="15.960277"
+ id="rect4622-4"
+ style="color:#000000;fill:none;stroke:#213149;stroke-width:2.03783631;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+ <path
+ inkscape:connector-curvature="0"
+ id="rect4626-2"
+ d="m 24.179273,940.90121 26.641685,0 0,2.82563 -26.641685,0 z"
+ style="color:#000000;fill:#d4c8a4;fill-opacity:1;fill-rule:nonzero;stroke:#213149;stroke-width:2.03783631;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+ <g
+ style="color:#000000;fill:none;stroke:#213149;stroke-width:1.76498926;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ id="g4628-3"
+ transform="matrix(-1.06884,0.43664155,0.43664155,1.06884,194.06278,408.96802)">
+ <path
+ inkscape:connector-curvature="0"
+ id="path4630-9"
+ d="m 295.05828,363.05901 -3.40274,0"
+ style="color:#000000;fill:none;stroke:#213149;stroke-width:1.76498926;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+ <path
+ style="color:#000000;fill:none;stroke:#213149;stroke-width:1.76498926;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ d="m 295.00031,359.49936 -3.2868,-0.8807"
+ id="path4632-5"
+ inkscape:connector-curvature="0" />
+ <path
+ style="color:#000000;fill:none;stroke:#213149;stroke-width:1.76498926;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ d="m 295.00031,366.61866 -3.2868,0.8807"
+ id="path4634-8"
+ inkscape:connector-curvature="0" />
+ </g>
+ <path
+ sodipodi:nodetypes="cscccc"
+ inkscape:connector-curvature="0"
+ inkscape:original-d="m 56.978171,961.27451 c 0,0 -4.374101,-0.19686 -5.745175,1.46286 -1.371073,1.65972 -1.471003,1.7268 -1.471003,1.7268 l 10.450192,0 0,-3.18966 z"
+ inkscape:path-effect="#path-effect4658-8"
+ id="path4656-4"
+ d="m 56.978171,961.27451 c -1.004589,0.0264 -2.013545,0.0781 -2.997181,0.28393 -0.983635,0.20581 -1.946799,0.57231 -2.747994,1.17893 -0.607602,0.46004 -1.113401,1.05379 -1.471003,1.7268 l 10.450192,0 0,-3.18966 c -1.077756,-0.0284 -2.156258,-0.0284 -3.234014,0"
+ style="color:#000000;fill:#d0a480;fill-opacity:1;fill-rule:nonzero;stroke:#213149;stroke-width:2.03783631;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+ <rect
+ transform="matrix(0,-1,1,0,0,0)"
+ style="color:#000000;fill:#a26b3c;fill-opacity:1;fill-rule:nonzero;stroke:#213149;stroke-width:2.03783631;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ id="rect6351-8"
+ width="10.964646"
+ height="3.2656732"
+ x="-933.83411"
+ y="85.744301" />
+ <path
+ sodipodi:nodetypes="cssssc"
+ inkscape:connector-curvature="0"
+ inkscape:original-d="m 82.665745,947.77298 c 0,0 1.84033,0.33922 2.659281,0 0.915977,-0.37939 1.723748,-1.18715 2.103159,-2.10308 0.313815,-0.75763 0,-1.6401 0,-2.46021 0,-0.75348 0,-1.50707 0,-2.26067 0,-2.37164 0,-7.11492 0,-7.11492"
+ inkscape:path-effect="#path-effect6355-7"
+ id="path6353-4"
+ d="m 82.665745,947.77298 c 0.856933,0.27913 1.802348,0.27913 2.659281,0 0.493914,-0.16088 0.961802,-0.41502 1.338581,-0.77261 0.376779,-0.35759 0.659164,-0.82182 0.764578,-1.33047 0.08338,-0.40231 0.05935,-0.8182 0.03666,-1.22843 -0.02268,-0.41023 -0.03666,-0.82092 -0.03666,-1.23178 l 0,-2.26067 0,-7.11492"
+ style="color:#000000;fill:none;stroke:#213149;stroke-width:2.03783631;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+ <path
+ style="color:#000000;fill:#a37d20;fill-opacity:1;fill-rule:nonzero;stroke:#213149;stroke-width:2.03783631;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ d="m 70.582053,915.25249 c -0.09918,-5.36167 -1.600018,-4.34056 -3.813814,-6.55437 -2.213796,-2.21381 -0.797024,-4.78784 -7.286792,-3.04961 -2.089691,0.55998 -3.956683,1.03844 -4.510747,-1.02931 -0.554076,-2.06787 2.053401,-3.12639 2.053401,-3.12639 0,0 6.078296,-1.62867 9.260124,-2.48122 3.333873,-0.8933 5.450616,0.57636 6.936351,6.12116 1.485737,5.54481 2.106439,7.86137 2.106439,7.86137 -1.8027,3.67552 -0.974953,1.11672 -4.744962,2.25837 z"
+ id="path3376-4-6"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="czczcsscc" />
+ <path
+ transform="matrix(0.41343445,0,0,0.41343445,164.17432,754.00588)"
+ d="m 386.525,337.53635 -12.86732,31.06445 -31.06445,12.86731 -31.06445,-12.86731 -12.86732,-31.06445 12.86732,-31.06445 31.06445,-12.86732 31.06445,12.86732 z"
+ inkscape:randomized="0"
+ inkscape:rounded="0"
+ inkscape:flatsided="true"
+ sodipodi:arg2="0.39269908"
+ sodipodi:arg1="0"
+ sodipodi:r2="40.587658"
+ sodipodi:r1="43.931767"
+ sodipodi:cy="337.53635"
+ sodipodi:cx="342.59323"
+ sodipodi:sides="8"
+ id="path4276-1"
+ style="color:#000000;fill:#bcbcbc;fill-opacity:1;fill-rule:nonzero;stroke:#5b5b5b;stroke-width:4.92904329;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ sodipodi:type="star" />
+ <rect
+ y="922.18219"
+ x="265.73398"
+ height="4.4903092"
+ width="69.803703"
+ id="rect4284-3"
+ style="color:#000000;fill:#e2cf96;fill-opacity:1;fill-rule:nonzero;stroke:#213149;stroke-width:2.03783631;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+ <path
+ inkscape:connector-curvature="0"
+ id="rect4286-5"
+ d="m 270.22781,926.6903 0,42.14248 6.89146,0 0,-3.35557 52.82242,0 0,3.35557 5.59254,0 0,-42.14248 -65.30642,0 z"
+ style="color:#000000;fill:#e2cf96;fill-opacity:1;fill-rule:nonzero;stroke:#213149;stroke-width:2.03783631;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+ <g
+ style="color:#000000;fill:#bcbcbc;fill-opacity:1;fill-rule:nonzero;stroke:#757575;stroke-width:1.76498926;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ transform="matrix(1.1545885,0,0,1.1545885,-108.50906,489.37793)"
+ id="g4388-1">
+ <g
+ style="color:#000000;fill:#bcbcbc;fill-opacity:1;fill-rule:nonzero;stroke:#757575;stroke-width:1.76498926;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ id="g4374-0"
+ transform="matrix(0.92101549,0.38952595,-0.38952595,0.92101549,161.91311,-111.38853)">
+ <path
+ transform="translate(1.5,-2.375)"
+ d="m 358.625,345.125 c 0,0.62132 -0.50368,1.125 -1.125,1.125 -0.62132,0 -1.125,-0.50368 -1.125,-1.125 0,-0.62132 0.50368,-1.125 1.125,-1.125 0.62132,0 1.125,0.50368 1.125,1.125 z"
+ sodipodi:ry="1.125"
+ sodipodi:rx="1.125"
+ sodipodi:cy="345.125"
+ sodipodi:cx="357.5"
+ id="path4290-8"
+ style="color:#000000;fill:#bcbcbc;fill-opacity:1;fill-rule:nonzero;stroke:#757575;stroke-width:1.76498926;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ sodipodi:type="arc" />
+ <path
+ inkscape:connector-curvature="0"
+ inkscape:original-d="m 355.125,343 2.5,0"
+ inkscape:path-effect="#path-effect4294-5"
+ id="path4292-6"
+ d="m 355.125,343 2.5,0"
+ style="color:#000000;fill:#bcbcbc;fill-opacity:1;fill-rule:nonzero;stroke:#757575;stroke-width:1.76498926;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+ </g>
+ <path
+ style="color:#000000;fill:#bcbcbc;fill-opacity:1;fill-rule:nonzero;stroke:#757575;stroke-width:1.76498926;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ d="M 359,345.59375 359,347.5"
+ id="path4302-5"
+ inkscape:path-effect="#path-effect4304-7"
+ inkscape:original-d="M 359,345.59375 359,347.5"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cc" />
+ <path
+ style="color:#000000;fill:#bcbcbc;fill-opacity:1;fill-rule:nonzero;stroke:#757575;stroke-width:1.76498926;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ d="m 361.875,347.75 -5.75,0"
+ id="path4306-3"
+ inkscape:path-effect="#path-effect4308-0"
+ inkscape:original-d="m 361.875,347.75 -5.75,0"
+ inkscape:connector-curvature="0" />
+ <g
+ style="color:#000000;fill:#bcbcbc;fill-opacity:1;fill-rule:nonzero;stroke:#757575;stroke-width:1.76498926;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ id="g4346-3">
+ <path
+ inkscape:connector-curvature="0"
+ inkscape:original-d="M 356,347.875 348.75,343.5"
+ inkscape:path-effect="#path-effect4312-7"
+ id="path4310-3"
+ d="M 356,347.875 348.75,343.5"
+ style="color:#000000;fill:#bcbcbc;fill-opacity:1;fill-rule:nonzero;stroke:#757575;stroke-width:1.76498926;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+ <path
+ inkscape:connector-curvature="0"
+ inkscape:original-d="m 355.68435,348.5486 -6.1187,-1.9722"
+ inkscape:path-effect="#path-effect4316-5"
+ id="path4314-1"
+ d="m 355.68435,348.5486 -6.1187,-1.9722"
+ style="color:#000000;fill:#bcbcbc;fill-opacity:1;fill-rule:nonzero;stroke:#757575;stroke-width:1.76498926;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+ <path
+ sodipodi:nodetypes="cc"
+ inkscape:connector-curvature="0"
+ inkscape:original-d="M 355.21875,349.8125 350.5,349"
+ inkscape:path-effect="#path-effect4320-7"
+ id="path4318-3"
+ d="M 355.21875,349.8125 350.5,349"
+ style="color:#000000;fill:#bcbcbc;fill-opacity:1;fill-rule:nonzero;stroke:#757575;stroke-width:1.76498926;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+ <path
+ sodipodi:nodetypes="cc"
+ inkscape:connector-curvature="0"
+ inkscape:original-d="M 355.21875,351.0625 351.25,351.125"
+ inkscape:path-effect="#path-effect4324-8"
+ id="path4322-8"
+ d="M 355.21875,351.0625 351.25,351.125"
+ style="color:#000000;fill:#bcbcbc;fill-opacity:1;fill-rule:nonzero;stroke:#757575;stroke-width:1.76498926;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+ <path
+ sodipodi:nodetypes="cc"
+ inkscape:connector-curvature="0"
+ inkscape:original-d="m 355.84375,352.28125 -2.875,0.59375"
+ inkscape:path-effect="#path-effect4328-6"
+ id="path4326-2"
+ d="m 355.84375,352.28125 -2.875,0.59375"
+ style="color:#000000;fill:#bcbcbc;fill-opacity:1;fill-rule:nonzero;stroke:#757575;stroke-width:1.76498926;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+ <path
+ sodipodi:nodetypes="cc"
+ inkscape:connector-curvature="0"
+ inkscape:original-d="M 356.59375,353.5625 354.25,354.125"
+ inkscape:path-effect="#path-effect4332-4"
+ id="path4330-3"
+ d="M 356.59375,353.5625 354.25,354.125"
+ style="color:#000000;fill:#bcbcbc;fill-opacity:1;fill-rule:nonzero;stroke:#757575;stroke-width:1.76498926;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+ <path
+ style="color:#000000;fill:#bcbcbc;fill-opacity:1;fill-rule:nonzero;stroke:#757575;stroke-width:1.76498926;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ d="m 356.9797,354.35653 -0.92815,2.22444"
+ id="path4340-5"
+ inkscape:path-effect="#path-effect4342-4"
+ inkscape:original-d="m 356.9797,354.35653 -0.92815,2.22444"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cc" />
+ <path
+ sodipodi:open="true"
+ sodipodi:end="6.5992993"
+ sodipodi:start="3.664871"
+ sodipodi:type="arc"
+ style="color:#000000;fill:#bcbcbc;fill-opacity:1;fill-rule:nonzero;stroke:#757575;stroke-width:1.76498926;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ id="path4344-3"
+ sodipodi:cx="357.5"
+ sodipodi:cy="345.125"
+ sodipodi:rx="1.125"
+ sodipodi:ry="1.125"
+ d="m 356.52554,344.56281 c 0.31049,-0.53818 0.99847,-0.72276 1.53665,-0.41227 0.46093,0.26592 0.6725,0.81842 0.50707,1.32419"
+ transform="translate(-1.875,12.59375)" />
+ </g>
+ <g
+ style="color:#000000;fill:#bcbcbc;fill-opacity:1;fill-rule:nonzero;stroke:#757575;stroke-width:1.76498926;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ id="g4356-7"
+ transform="matrix(-1,0,0,1,717.69845,0)">
+ <path
+ style="color:#000000;fill:#bcbcbc;fill-opacity:1;fill-rule:nonzero;stroke:#757575;stroke-width:1.76498926;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ d="M 356,347.875 348.75,343.5"
+ id="path4358-4"
+ inkscape:path-effect="#path-effect4312-7"
+ inkscape:original-d="M 356,347.875 348.75,343.5"
+ inkscape:connector-curvature="0" />
+ <path
+ style="color:#000000;fill:#bcbcbc;fill-opacity:1;fill-rule:nonzero;stroke:#757575;stroke-width:1.76498926;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ d="m 355.68435,348.5486 -6.1187,-1.9722"
+ id="path4360-1"
+ inkscape:path-effect="#path-effect4316-5"
+ inkscape:original-d="m 355.68435,348.5486 -6.1187,-1.9722"
+ inkscape:connector-curvature="0" />
+ <path
+ style="color:#000000;fill:#bcbcbc;fill-opacity:1;fill-rule:nonzero;stroke:#757575;stroke-width:1.76498926;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ d="M 355.21875,349.8125 350.5,349"
+ id="path4362-6"
+ inkscape:path-effect="#path-effect4320-7"
+ inkscape:original-d="M 355.21875,349.8125 350.5,349"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cc" />
+ <path
+ style="color:#000000;fill:#bcbcbc;fill-opacity:1;fill-rule:nonzero;stroke:#757575;stroke-width:1.76498926;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ d="M 355.21875,351.0625 351.25,351.125"
+ id="path4364-6"
+ inkscape:path-effect="#path-effect4324-8"
+ inkscape:original-d="M 355.21875,351.0625 351.25,351.125"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cc" />
+ <path
+ style="color:#000000;fill:#bcbcbc;fill-opacity:1;fill-rule:nonzero;stroke:#757575;stroke-width:1.76498926;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ d="m 355.84375,352.28125 -2.875,0.59375"
+ id="path4366-8"
+ inkscape:path-effect="#path-effect4328-6"
+ inkscape:original-d="m 355.84375,352.28125 -2.875,0.59375"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cc" />
+ <path
+ style="color:#000000;fill:#bcbcbc;fill-opacity:1;fill-rule:nonzero;stroke:#757575;stroke-width:1.76498926;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ d="M 356.59375,353.5625 354.25,354.125"
+ id="path4368-2"
+ inkscape:path-effect="#path-effect4332-4"
+ inkscape:original-d="M 356.59375,353.5625 354.25,354.125"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cc" />
+ <path
+ sodipodi:nodetypes="cc"
+ inkscape:connector-curvature="0"
+ inkscape:original-d="m 356.9797,354.35653 -0.92815,2.22444"
+ inkscape:path-effect="#path-effect4342-4"
+ id="path4370-3"
+ d="m 356.9797,354.35653 -0.92815,2.22444"
+ style="color:#000000;fill:#bcbcbc;fill-opacity:1;fill-rule:nonzero;stroke:#757575;stroke-width:1.76498926;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+ <path
+ transform="translate(-1.875,12.59375)"
+ d="m 356.52554,344.56281 c 0.31049,-0.53818 0.99847,-0.72276 1.53665,-0.41227 0.46093,0.26592 0.6725,0.81842 0.50707,1.32419"
+ sodipodi:ry="1.125"
+ sodipodi:rx="1.125"
+ sodipodi:cy="345.125"
+ sodipodi:cx="357.5"
+ id="path4372-8"
+ style="color:#000000;fill:#bcbcbc;fill-opacity:1;fill-rule:nonzero;stroke:#757575;stroke-width:1.76498926;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ sodipodi:type="arc"
+ sodipodi:start="3.664871"
+ sodipodi:end="6.5992993"
+ sodipodi:open="true" />
+ </g>
+ <path
+ style="color:#000000;fill:#bcbcbc;fill-opacity:1;fill-rule:nonzero;stroke:#757575;stroke-width:1.76498926;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ d="m 355.7631,347.78939 6.0988,0.0442 1.28163,2.47487 -2.43068,4.28683 -3.66812,0 -2.38648,-4.15425 1.10485,-2.65165"
+ id="path4378-0"
+ inkscape:path-effect="#path-effect4380-4"
+ inkscape:original-d="m 355.7631,347.78939 6.0988,0.0442 1.28163,2.47487 -2.43068,4.28683 -3.66812,0 -2.38648,-4.15425 z"
+ inkscape:connector-curvature="0" />
+ </g>
+ <path
+ sodipodi:nodetypes="cc"
+ inkscape:connector-curvature="0"
+ inkscape:original-d="m 305.81418,877.89161 0,0"
+ inkscape:path-effect="#path-effect4416-8"
+ id="path4414-0"
+ d="m 305.81418,877.89161 0,0"
+ style="color:#000000;fill:#bcbcbc;fill-opacity:1;fill-rule:nonzero;stroke:#757575;stroke-width:2.03783631;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+ <path
+ style="color:#000000;fill:#bcbcbc;fill-opacity:1;fill-rule:nonzero;stroke:#757575;stroke-width:2.03783631;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ d="m 305.81418,909.39052 0,0"
+ id="path4426-3"
+ inkscape:path-effect="#path-effect4428-2"
+ inkscape:original-d="m 305.81418,909.39052 0,0"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cc" />
+ <path
+ style="color:#000000;fill:#bcbcbc;fill-opacity:1;fill-rule:nonzero;stroke:#757575;stroke-width:2.03783631;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ d="m 290.06471,893.64101 0,0"
+ id="path4430-4"
+ inkscape:path-effect="#path-effect4434-1"
+ inkscape:original-d="m 290.06471,893.64101 0,0"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cc" />
+ <path
+ sodipodi:nodetypes="cc"
+ inkscape:connector-curvature="0"
+ inkscape:original-d="m 321.56363,893.64101 0,0"
+ inkscape:path-effect="#path-effect4436-5"
+ id="path4432-1"
+ d="m 321.56363,893.64101 0,0"
+ style="color:#000000;fill:#bcbcbc;fill-opacity:1;fill-rule:nonzero;stroke:#757575;stroke-width:2.03783631;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+ <path
+ style="color:#000000;fill:#bcbcbc;fill-opacity:1;fill-rule:nonzero;stroke:#757575;stroke-width:2.03783631;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ d="m 294.67762,882.50454 0,0"
+ id="path4438-6"
+ inkscape:path-effect="#path-effect4446-9"
+ inkscape:original-d="m 294.67762,882.50454 0,0"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cc" />
+ <path
+ sodipodi:nodetypes="cc"
+ inkscape:connector-curvature="0"
+ inkscape:original-d="m 316.95073,904.7776 0,0"
+ inkscape:path-effect="#path-effect4448-8"
+ id="path4440-2"
+ d="m 316.95073,904.7776 0,0"
+ style="color:#000000;fill:#bcbcbc;fill-opacity:1;fill-rule:nonzero;stroke:#757575;stroke-width:2.03783631;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+ <path
+ sodipodi:nodetypes="cc"
+ inkscape:connector-curvature="0"
+ inkscape:original-d="m 294.67762,904.7776 0,0"
+ inkscape:path-effect="#path-effect4450-4"
+ id="path4442-2"
+ d="m 294.67762,904.7776 0,0"
+ style="color:#000000;fill:#bcbcbc;fill-opacity:1;fill-rule:nonzero;stroke:#757575;stroke-width:2.03783631;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+ <path
+ style="color:#000000;fill:#bcbcbc;fill-opacity:1;fill-rule:nonzero;stroke:#757575;stroke-width:2.03783631;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ d="m 316.95073,882.50443 0,0"
+ id="path4444-8"
+ inkscape:path-effect="#path-effect4452-8"
+ inkscape:original-d="m 316.95073,882.50443 0,0"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cc" />
+ <path
+ sodipodi:nodetypes="csssssc"
+ inkscape:connector-curvature="0"
+ inkscape:original-d="m 302.42033,891.1463 c 0,0 0.2552,-0.0219 -0.18434,0.34325 -0.30777,0.25609 -0.42584,1.25943 -0.5219,1.64806 -0.13324,0.5392 0.0316,1.11602 0.14432,1.65972 0.0926,0.44695 0.58087,1.22501 0.79016,1.63063 0.35523,0.68836 0.21753,0.51655 0.68221,1.13634 0.23667,0.31566 0.72163,0.93811 0.72163,0.93811"
+ inkscape:path-effect="#path-effect4668-8"
+ id="path4666-0"
+ d="m 302.42033,891.1463 c -0.0648,0.1126 -0.12624,0.22708 -0.18434,0.34325 -0.25903,0.5179 -0.45143,1.0733 -0.5219,1.64806 -0.0681,0.5553 -0.0206,1.12512 0.14432,1.65972 0.17843,0.57845 0.48871,1.10568 0.79016,1.63063 0.22005,0.3832 0.43703,0.76871 0.68221,1.13634 0.21906,0.32847 0.46034,0.64212 0.72163,0.93811"
+ style="color:#000000;fill:#bcbcbc;fill-opacity:1;fill-rule:nonzero;stroke:#757575;stroke-width:2.03783631;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+ <path
+ style="color:#000000;fill:#bcbcbc;fill-opacity:1;fill-rule:nonzero;stroke:#757575;stroke-width:2.03783631;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ d="m 309.20965,891.1463 c 0.0648,0.1126 0.12624,0.22708 0.18434,0.34325 0.25903,0.5179 0.45142,1.0733 0.52189,1.64806 0.0681,0.5553 0.0206,1.12512 -0.14432,1.65972 -0.17843,0.57845 -0.48871,1.10569 -0.79016,1.63063 -0.22005,0.3832 -0.43704,0.76871 -0.68222,1.13634 -0.21906,0.32847 -0.46033,0.64212 -0.72162,0.93811"
+ id="path4676-8"
+ inkscape:path-effect="#path-effect4678-8"
+ inkscape:original-d="m 309.20965,891.1463 c 0,0 -0.2552,-0.0219 0.18434,0.34325 0.30777,0.25609 0.42583,1.25943 0.52189,1.64806 0.13324,0.5392 -0.0316,1.11602 -0.14432,1.65972 -0.0926,0.44695 -0.58087,1.22501 -0.79016,1.63063 -0.35523,0.68836 -0.21753,0.51655 -0.68222,1.13634 -0.23667,0.31566 -0.72162,0.93811 -0.72162,0.93811"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="csssssc" />
+ <rect
+ y="931.1546"
+ x="277.25638"
+ height="25.103462"
+ width="24.405905"
+ id="rect4690-3"
+ style="color:#000000;fill:#e2cf96;fill-opacity:1;fill-rule:nonzero;stroke:#b19a58;stroke-width:2.03783631;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:0.37037036;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+ <rect
+ style="color:#000000;fill:#e2cf96;fill-opacity:1;fill-rule:nonzero;stroke:#b19a58;stroke-width:2.03783631;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:0.37037036;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ id="rect4692-3"
+ width="24.405905"
+ height="25.103462"
+ x="305.01456"
+ y="931.1546" />
+ <path
+ inkscape:connector-curvature="0"
+ id="path8776-8"
+ d="m 45.317184,774.38819 c -10.202593,0 -18.473418,8.27089 -18.473418,18.47341 0,0.0612 -5.89e-4,0.1195 0,0.18047 -0.709622,1.23413 -1.118508,2.6596 -1.118508,4.18539 0,3.77803 2.490031,6.98006 5.917267,8.04598 0.0058,0 0.0306,-0.0115 0.03603,0 3.378983,3.7128 8.222863,6.06158 13.638579,6.06158 2.280313,0 4.441933,-0.43505 6.45848,-1.19061 0.522648,0.11314 1.067278,0.18035 1.62364,0.18035 2.431853,0 4.587435,-1.11823 5.989428,-2.88647 1.083062,0.57406 2.333054,0.90208 3.64417,0.90208 1.128668,0 2.171517,-0.2524 3.139038,-0.6856 1.458281,0.45364 3.010821,0.6856 4.618354,0.6856 8.573494,0 15.514789,-6.94128 15.514789,-15.51479 0,-8.57351 -6.941295,-15.55092 -15.514789,-15.55092 -4.201883,0 -7.993228,1.6902 -10.788187,4.40188 -3.37507,-4.42393 -8.690899,-7.28835 -14.684923,-7.28835 z"
+ style="color:#000000;fill:#ffffff;fill-opacity:0.28078841;fill-rule:nonzero;stroke:none;stroke-width:1.76498926;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+ <path
+ style="color:#000000;fill:none;stroke:#008000;stroke-width:2.03783631;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ d="m 440.34201,939.36863 c 0,0 2.14873,-1.55882 4.7015,0.84978 0.2746,1.36218 -0.30614,1.91361 -0.30614,1.91361 l -4.42438,0.0404 z"
+ id="path4545-5-4"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccccc" />
+ <path
+ sodipodi:nodetypes="cscccc"
+ inkscape:connector-curvature="0"
+ inkscape:original-d="m 424.70363,929.93194 c 0,0 1.86439,7.83342 0.57234,15.96819 -1.29207,8.13467 -14.10225,-1.87367 -14.10225,-1.87367 l -0.73896,-15.84568 3.35245,-0.60697 z"
+ inkscape:path-effect="#path-effect6679-8"
+ id="path6677-3"
+ d="m 424.70363,929.93194 c 2.56178,1.74152 4.22044,4.74341 4.3314,7.8391 0.11095,3.0957 -1.32853,6.20863 -3.75906,8.12909 -2.07516,1.63967 -4.82592,2.39595 -7.44765,2.04761 -2.62173,-0.34833 -5.07958,-1.79664 -6.6546,-3.92128 l -0.73896,-15.84568 3.35245,-0.60697 10.91642,2.35813"
+ style="color:#000000;fill:#dcf2b0;fill-opacity:1;fill-rule:nonzero;stroke:#213149;stroke-width:2.03783631;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+ <g
+ transform="matrix(1.1413935,0.17405607,-0.17405607,1.1413935,-24.304967,499.01073)"
+ id="g6698-9">
+ <g
+ style="color:#000000;fill:#dcaf60;fill-opacity:1;fill-rule:nonzero;stroke:#213149;stroke-width:1.76498926;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ id="g4525-9"
+ transform="translate(-181.2137,-49.791143)"
+ inkscape:export-xdpi="134.28999"
+ inkscape:export-ydpi="134.28999">
+ <path
+ sodipodi:nodetypes="ssssscccsss"
+ id="path4527-1"
+ d="m 620.03942,344.29143 c -2.59977,0.26402 -4.625,2.48682 -4.625,5.15625 l 0,5.70857 c 0,2.84739 2.30886,5.15625 5.15625,5.15625 2.84739,0 5.15625,-2.30886 5.15625,-5.15625 l 0,-0.90625 2.71875,-0.0625 c 0.0244,-2.15098 -1.65479,-3.48205 -2.71875,-4.125 l 0,-0.61482 c 0,-2.84739 -2.30886,-5.15625 -5.15625,-5.15625 -0.17796,0 -0.35793,-0.0176 -0.53125,0 z"
+ style="color:#000000;fill:#dcaf60;fill-opacity:1;fill-rule:nonzero;stroke:#213149;stroke-width:1.76498926;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ inkscape:connector-curvature="0" />
+ <path
+ transform="translate(348.41125,0.21364798)"
+ sodipodi:open="true"
+ sodipodi:end="4.0130333"
+ sodipodi:start="2.1549128"
+ d="m 274.8925,351.75972 c -0.68863,-0.45523 -0.87784,-1.38251 -0.42261,-2.07114 0.0791,-0.11963 0.17496,-0.22725 0.2847,-0.31956"
+ sodipodi:ry="1.4946961"
+ sodipodi:rx="1.4946961"
+ sodipodi:cy="350.51285"
+ sodipodi:cx="275.71677"
+ id="path4529-0"
+ style="color:#000000;fill:#dcaf60;fill-opacity:1;fill-rule:nonzero;stroke:#213149;stroke-width:1.76498926;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ sodipodi:type="arc" />
+ </g>
+ <g
+ id="g6663-2"
+ transform="translate(-243.08979,-87.905588)">
+ <path
+ style="color:#000000;fill:#eee8aa;fill-opacity:1;fill-rule:nonzero;stroke:#213149;stroke-width:1.76498926;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ d="m 675.27359,381.69204 c 0,0 -3.61906,-2.93343 -6.81651,-1.08738 -3.19745,1.84604 -5.13494,7.68161 -2.09252,12.95124 -0.82084,0.48215 -2.91788,0.16781 -2.91788,0.16781 1.26397,2.78835 5.40232,3.69932 7.22024,1.43927 1.81792,-2.26005 4.60505,-13.47152 4.60667,-13.47094 z"
+ id="path6665-5"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="czcczc" />
+ <path
+ sodipodi:type="arc"
+ style="color:#000000;fill:#ff7f50;fill-opacity:1;fill-rule:nonzero;stroke:#213149;stroke-width:1.74692678;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ id="path6667-0"
+ sodipodi:cx="660.45526"
+ sodipodi:cy="377.89401"
+ sodipodi:rx="1.9102902"
+ sodipodi:ry="1.9115926"
+ d="m 662.36555,377.89401 c 0,1.05575 -0.85526,1.9116 -1.91029,1.9116 -1.05502,0 -1.91029,-0.85585 -1.91029,-1.9116 0,-1.05574 0.85527,-1.91159 1.91029,-1.91159 1.05503,0 1.91029,0.85585 1.91029,1.91159 z"
+ transform="matrix(0.92603044,0.01983755,-0.27468835,1.09644,165.84273,-46.640666)" />
+ <path
+ sodipodi:nodetypes="zczssscsssczz"
+ inkscape:connector-curvature="0"
+ id="path6669-8"
+ d="m 673.15276,387.85974 c 0,4.0455 2.90712,8.22999 4.82356,8.22999 0,0 2.70903,-0.58102 1.31422,-3.86008 -1.39481,-3.27905 1.55317,-2.73938 1.55317,-2.73938 0,-2.66943 0.59153,-5.9675 3.1913,-6.23152 0.17332,-0.0176 0.35329,0 0.53125,0 0.19972,0 0.40037,0.009 0.59375,0.0313 0.27718,1.03938 1.27138,1.8125 2.46875,1.8125 1.4113,0 2.5625,-1.08657 2.5625,-2.40625 0,-1.31968 -1.1512,-2.375 -2.5625,-2.375 -0.56029,0 -1.04756,0.18283 -1.46875,0.46875 -1.22824,-1.45445 -3.76164,-2.84864 -7.53366,-1.83793 -3.77202,1.01071 -5.47359,4.86212 -5.47359,8.90762 z"
+ style="color:#000000;fill:#eee8aa;fill-opacity:1;fill-rule:nonzero;stroke:#213149;stroke-width:1.76498926;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+ </g>
+ </g>
+ <path
+ sodipodi:nodetypes="ccc"
+ inkscape:connector-curvature="0"
+ inkscape:original-d="m 440.90542,944.9013 13.2668,0 8.73149,-18.88872"
+ inkscape:path-effect="#path-effect4566-7-3"
+ id="path4564-2-4"
+ d="m 440.90542,944.9013 13.2668,0 8.73149,-18.88872"
+ style="color:#000000;fill:none;stroke:#213149;stroke-width:2.03783631;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+ <g
+ style="color:#000000;fill:none;stroke:#213149;stroke-width:1.76498926;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ id="g4628-2-9"
+ transform="matrix(1.06884,0.43664155,-0.43664155,1.06884,297.86773,414.90082)">
+ <path
+ inkscape:connector-curvature="0"
+ id="path4630-4-2"
+ d="m 295.05828,363.05901 -3.40274,0"
+ style="color:#000000;fill:none;stroke:#213149;stroke-width:1.76498926;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+ <path
+ style="color:#000000;fill:none;stroke:#213149;stroke-width:1.76498926;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ d="m 295.00031,359.49936 -3.2868,-0.8807"
+ id="path4632-1-6"
+ inkscape:connector-curvature="0" />
+ <path
+ style="color:#000000;fill:none;stroke:#213149;stroke-width:1.76498926;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ d="m 295.00031,366.61866 -3.2868,0.8807"
+ id="path4634-4-9"
+ inkscape:connector-curvature="0" />
+ </g>
+ <rect
+ transform="matrix(0.98445818,-0.17561917,0.17561917,0.98445818,0,0)"
+ ry="3.5612204"
+ y="975.31317"
+ x="236.00909"
+ height="25.373697"
+ width="12.241695"
+ id="rect6671-0"
+ style="color:#000000;fill:#f2c1b0;fill-opacity:1;stroke:#213149;stroke-width:2.03783631;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+ <g
+ style="color:#000000;fill:#b0e1f2;fill-opacity:1;fill-rule:nonzero;stroke:#213149;stroke-width:1.76498926;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ transform="matrix(1.1545885,0,0,1.1545885,-96.739418,495.75257)"
+ id="g6751-6">
+ <path
+ sodipodi:nodetypes="ccccssssssscc"
+ inkscape:connector-curvature="0"
+ inkscape:original-d="m 458.9254,397.90026 10.42983,0 -0.18882,4.13356 5.21598,0 c 0,0 -0.1058,-0.91691 0,-2.29951 0.21669,-2.83164 0.92377,-1.61663 0,-4.4786 -0.2033,-0.62984 0.20329,-1.25968 0,-1.88951 -0.21289,-0.65957 0.1477,-0.94425 -0.41261,-1.35218 -0.24741,-0.18012 -0.91032,-0.41784 -1.3945,-0.52031 -0.63797,-0.13502 -1.12527,-0.10621 -1.52851,-0.10621 -0.61046,0 -1.22091,0 -1.83137,0 -2.60504,0 -7.81512,0 -7.81512,0 2.42596,-37.07148 -2.47488,6.51276 -2.47488,6.51276 z"
+ inkscape:path-effect="#path-effect6747-5"
+ id="path6743-1"
+ d="m 458.9254,397.90026 10.42983,0 -0.18882,4.13356 5.21598,0 c 0.003,-0.7665 0.003,-1.53301 0,-2.29951 -0.006,-1.49288 -0.0232,-2.98589 0,-4.4786 0.01,-0.62986 0.0268,-1.26014 0,-1.88951 -0.0102,-0.24067 -0.0271,-0.48263 -0.086,-0.71623 -0.0588,-0.23359 -0.16195,-0.46015 -0.32664,-0.63595 -0.17323,-0.18491 -0.4064,-0.3051 -0.64844,-0.38004 -0.24203,-0.075 -0.4948,-0.10762 -0.74606,-0.14027 -0.50699,-0.0659 -1.01725,-0.10621 -1.52851,-0.10621 l -1.83137,0 -7.81512,0 -2.47488,6.51276"
+ style="color:#000000;fill:#b0e1f2;fill-opacity:1;fill-rule:nonzero;stroke:#213149;stroke-width:1.76498926;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+ <path
+ sodipodi:nodetypes="cscccc"
+ inkscape:connector-curvature="0"
+ inkscape:original-d="m 472.3316,401.27857 c 0,0 3.7083,0.79373 4.49339,2.48495 0.78508,1.69121 0.85411,1.76928 0.85411,1.76928 l -8.75642,-2.2904 0.69908,-2.67264 z"
+ inkscape:path-effect="#path-effect6749-3"
+ id="path6745-5"
+ d="m 472.3316,401.27857 c 0.83597,0.24233 1.67007,0.50677 2.44917,0.89481 0.77911,0.38804 1.50583,0.90624 2.04422,1.59014 0.40829,0.51863 0.70197,1.12699 0.85411,1.76928 l -8.75642,-2.2904 0.69908,-2.67264 c 0.90929,0.21246 1.81298,0.44884 2.70984,0.70881"
+ style="color:#000000;fill:#f0a4eb;fill-opacity:1;fill-rule:nonzero;stroke:#213149;stroke-width:1.76498926;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+ </g>
+ <rect
+ transform="matrix(-0.00120505,-0.99999927,0.99999927,-0.00120505,0,0)"
+ ry="3.5612204"
+ y="404.93301"
+ x="-967.737"
+ height="35.632931"
+ width="24.972927"
+ id="rect6675-7"
+ style="color:#000000;fill:#f2c1b0;fill-opacity:1;fill-rule:nonzero;stroke:#213149;stroke-width:2.03783631;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+ <rect
+ style="color:#000000;fill:#f2c1b0;fill-opacity:1;fill-rule:nonzero;stroke:#213149;stroke-width:2.03783631;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ id="rect6673-2"
+ width="12.241695"
+ height="25.373695"
+ x="-950.55884"
+ y="415.19226"
+ ry="3.5612204"
+ transform="matrix(-0.00120505,-0.99999927,0.99999927,-0.00120505,0,0)" />
+ </g>
+</svg>
diff --git a/Graphics/update-drawables.sh b/Graphics/update-drawables.sh
index c96b6dd90..264f7eea6 100755
--- a/Graphics/update-drawables.sh
+++ b/Graphics/update-drawables.sh
@@ -1,6 +1,7 @@
#!/bin/bash
APP_DIR=../OpenKeychain/src/main
+DRAWABLE_DIR=$APP_DIR/res/drawable
MDPI_DIR=$APP_DIR/res/drawable-mdpi
HDPI_DIR=$APP_DIR/res/drawable-hdpi
XDPI_DIR=$APP_DIR/res/drawable-xhdpi
@@ -63,4 +64,10 @@ inkscape -w 48 -h 48 -e "$MDPI_DIR/$NAME.png" "$SRC_DIR/$NAME.svg"
inkscape -w 64 -h 64 -e "$HDPI_DIR/$NAME.png" "$SRC_DIR/$NAME.svg"
inkscape -w 96 -h 96 -e "$XDPI_DIR/$NAME.png" "$SRC_DIR/$NAME.svg"
inkscape -w 128 -h 128 -e "$XXDPI_DIR/$NAME.png" "$SRC_DIR/$NAME.svg"
+done
+
+for NAME in "drawer_header"
+do
+echo $NAME
+inkscape -w 512 -h 288 -e "$DRAWABLE_DIR/$NAME.png" "$SRC_DIR/$NAME.svg"
done \ No newline at end of file
diff --git a/OpenKeychain/build.gradle b/OpenKeychain/build.gradle
index 3bcfdda5e..eca62026a 100644
--- a/OpenKeychain/build.gradle
+++ b/OpenKeychain/build.gradle
@@ -32,7 +32,7 @@ dependencies {
android {
compileSdkVersion 21
- buildToolsVersion '21.1.1'
+ buildToolsVersion '21.1.2'
defaultConfig {
minSdkVersion 15
diff --git a/OpenKeychain/src/main/AndroidManifest.xml b/OpenKeychain/src/main/AndroidManifest.xml
index 865e0272d..d47729127 100644
--- a/OpenKeychain/src/main/AndroidManifest.xml
+++ b/OpenKeychain/src/main/AndroidManifest.xml
@@ -86,11 +86,6 @@
</intent-filter>
</activity>
<activity
- android:name=".ui.KeyListActivity"
- android:configChanges="orientation|screenSize|keyboardHidden|keyboard"
- android:label="@string/app_name"
- android:windowSoftInputMode="stateAlwaysHidden" />
- <activity
android:name=".ui.FirstTimeActivity"
android:configChanges="orientation|screenSize|keyboardHidden|keyboard"
android:label="@string/app_name"
@@ -100,10 +95,10 @@
android:configChanges="orientation|screenSize|keyboardHidden|keyboard"
android:windowSoftInputMode="stateHidden"
android:label="@string/title_create_key"
- android:parentActivityName=".ui.KeyListActivity">
+ android:parentActivityName=".ui.MainActivity">
<meta-data
android:name="android.support.PARENT_ACTIVITY"
- android:value=".ui.KeyListActivity" />
+ android:value=".ui.MainActivity" />
</activity>
<activity
android:name=".ui.EditKeyActivity"
@@ -117,10 +112,10 @@
android:name=".ui.ViewKeyActivity"
android:configChanges="orientation|screenSize|keyboardHidden|keyboard"
android:label="@string/title_key_details"
- android:parentActivityName=".ui.KeyListActivity">
+ android:parentActivityName=".ui.MainActivity">
<meta-data
android:name="android.support.PARENT_ACTIVITY"
- android:value=".ui.KeyListActivity" />
+ android:value=".ui.MainActivity" />
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
@@ -141,17 +136,12 @@
android:configChanges="orientation|screenSize|keyboardHidden|keyboard"
android:label="@string/title_exchange_keys"
android:windowSoftInputMode="stateHidden"
- android:parentActivityName=".ui.KeyListActivity">
+ android:parentActivityName=".ui.MainActivity">
<meta-data
android:name="android.support.PARENT_ACTIVITY"
- android:value=".ui.KeyListActivity" />
+ android:value=".ui.MainActivity" />
</activity>
<activity
- android:name=".ui.SelectPublicKeyActivity"
- android:configChanges="orientation|screenSize|keyboardHidden|keyboard"
- android:label="@string/title_select_recipients"
- android:launchMode="singleTop" />
- <activity
android:name=".ui.EncryptFilesActivity"
android:configChanges="orientation|screenSize|keyboardHidden|keyboard"
android:label="@string/title_encrypt_files"
@@ -204,19 +194,14 @@
</intent-filter>
</activity>
<activity
- android:name=".ui.DecryptActivity"
- android:configChanges="orientation|screenSize|keyboardHidden|keyboard"
- android:label="@string/title_decrypt"
- android:windowSoftInputMode="stateHidden" />
- <activity
android:name=".ui.DecryptTextActivity"
android:configChanges="orientation|screenSize|keyboardHidden|keyboard"
android:label="@string/title_decrypt"
android:windowSoftInputMode="stateHidden"
- android:parentActivityName=".ui.DecryptActivity">
+ android:parentActivityName=".ui.MainActivity">
<meta-data
android:name="android.support.PARENT_ACTIVITY"
- android:value=".ui.DecryptActivity" />
+ android:value=".ui.MainActivity" />
<!-- Keychain's own Actions -->
<!-- DECRYPT with text as extra -->
@@ -240,10 +225,10 @@
android:configChanges="orientation|screenSize|keyboardHidden|keyboard"
android:label="@string/title_decrypt"
android:windowSoftInputMode="stateHidden"
- android:parentActivityName=".ui.DecryptActivity">
+ android:parentActivityName=".ui.MainActivity">
<meta-data
android:name="android.support.PARENT_ACTIVITY"
- android:value=".ui.DecryptActivity" />
+ android:value=".ui.MainActivity" />
<!-- VIEW with mimeType application/octet-stream, application/pgp and text/pgp -->
<intent-filter android:label="@string/intent_send_decrypt">
@@ -446,7 +431,7 @@
android:label="@string/title_certify_key">
<meta-data
android:name="android.support.PARENT_ACTIVITY"
- android:value=".ui.KeyListActivity" />
+ android:value=".ui.MainActivity" />
</activity>
<activity
android:name=".ui.QrCodeScanActivity"
@@ -653,7 +638,7 @@
</intent-filter>
<meta-data
android:name="android.support.PARENT_ACTIVITY"
- android:value=".ui.KeyListActivity" />
+ android:value=".ui.MainActivity" />
</activity>
<activity
android:name=".ui.ConsolidateDialogActivity"
@@ -719,18 +704,13 @@
android:launchMode="singleTop"
android:process=":remote_api" />
<activity
- android:name=".remote.ui.AppsListActivity"
- android:configChanges="orientation|screenSize|keyboardHidden|keyboard"
- android:exported="false"
- android:label="@string/title_api_registered_apps" />
- <activity
android:name=".remote.ui.AppSettingsActivity"
android:configChanges="orientation|screenSize|keyboardHidden|keyboard"
android:exported="false">
<meta-data
android:name="android.support.PARENT_ACTIVITY"
- android:value=".remote.ui.AppsListActivity" />
+ android:value=".ui.MainActivity" />
</activity>
<activity
android:name=".remote.ui.AccountSettingsActivity"
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/Constants.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/Constants.java
index b3b433a63..67fa30a44 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/Constants.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/Constants.java
@@ -20,10 +20,6 @@ package org.sufficientlysecure.keychain;
import android.os.Environment;
import org.spongycastle.jce.provider.BouncyCastleProvider;
-import org.sufficientlysecure.keychain.ui.DecryptActivity;
-import org.sufficientlysecure.keychain.ui.EncryptFilesActivity;
-import org.sufficientlysecure.keychain.ui.EncryptTextActivity;
-import org.sufficientlysecure.keychain.ui.MainActivity;
import java.io.File;
@@ -90,21 +86,6 @@ public final class Constants {
public static final int PREF_VERSION = 4;
}
- public static final class DrawerItems {
- public static final Class KEY_LIST = MainActivity.class;
- public static final Class ENCRYPT_TEXT = EncryptTextActivity.class;
- public static final Class ENCRYPT_FILE = EncryptFilesActivity.class;
- public static final Class DECRYPT = DecryptActivity.class;
- public static final Class REGISTERED_APPS_LIST = MainActivity.class;
- public static final Class[] ARRAY = new Class[]{
- KEY_LIST,
- ENCRYPT_TEXT,
- ENCRYPT_FILE,
- DECRYPT,
- REGISTERED_APPS_LIST
- };
- }
-
public static final class key {
public static final int none = 0;
public static final int symmetric = -1;
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/provider/KeychainContract.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/provider/KeychainContract.java
index f4e00c36c..5856589c4 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/provider/KeychainContract.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/provider/KeychainContract.java
@@ -85,6 +85,11 @@ public class KeychainContract {
String PACKAGE_NAME = "package_name"; // foreign key to api_apps.package_name
}
+ interface ApiAppsAllowedKeysColumns {
+ String KEY_ID = "key_id"; // not a database id
+ String PACKAGE_NAME = "package_name"; // foreign key to api_apps.package_name
+ }
+
public static final String CONTENT_AUTHORITY = Constants.PACKAGE_NAME + ".provider";
private static final Uri BASE_CONTENT_URI_INTERNAL = Uri
@@ -106,6 +111,7 @@ public class KeychainContract {
public static final String BASE_API_APPS = "api_apps";
public static final String PATH_ACCOUNTS = "accounts";
+ public static final String PATH_ALLOWED_KEYS = "allowed_keys";
public static class KeyRings implements BaseColumns, KeysColumns, UserPacketsColumns {
public static final String MASTER_KEY_ID = KeysColumns.MASTER_KEY_ID;
@@ -305,6 +311,22 @@ public class KeychainContract {
}
}
+ public static class ApiAllowedKeys implements ApiAppsAllowedKeysColumns, BaseColumns {
+ public static final Uri CONTENT_URI = BASE_CONTENT_URI_INTERNAL.buildUpon()
+ .appendPath(BASE_API_APPS).build();
+
+ /**
+ * Use if multiple items get returned
+ */
+ public static final String CONTENT_TYPE
+ = "vnd.android.cursor.dir/vnd.org.sufficientlysecure.keychain.provider.api_apps.allowed_keys";
+
+ public static Uri buildBaseUri(String packageName) {
+ return CONTENT_URI.buildUpon().appendEncodedPath(packageName).appendPath(PATH_ALLOWED_KEYS)
+ .build();
+ }
+ }
+
public static class Certs implements CertsColumns, BaseColumns {
public static final String USER_ID = UserPacketsColumns.USER_ID;
public static final String SIGNER_UID = "signer_user_id";
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/provider/KeychainDatabase.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/provider/KeychainDatabase.java
index 5ce5eec17..d34cc74a3 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/provider/KeychainDatabase.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/provider/KeychainDatabase.java
@@ -28,6 +28,7 @@ import android.provider.BaseColumns;
import org.sufficientlysecure.keychain.Constants;
import org.sufficientlysecure.keychain.pgp.UncachedKeyRing;
import org.sufficientlysecure.keychain.pgp.exception.PgpGeneralException;
+import org.sufficientlysecure.keychain.provider.KeychainContract.ApiAppsAllowedKeysColumns;
import org.sufficientlysecure.keychain.provider.KeychainContract.ApiAppsAccountsColumns;
import org.sufficientlysecure.keychain.provider.KeychainContract.ApiAppsColumns;
import org.sufficientlysecure.keychain.provider.KeychainContract.CertsColumns;
@@ -52,7 +53,7 @@ import java.io.IOException;
*/
public class KeychainDatabase extends SQLiteOpenHelper {
private static final String DATABASE_NAME = "openkeychain.db";
- private static final int DATABASE_VERSION = 7;
+ private static final int DATABASE_VERSION = 8;
static Boolean apgHack = false;
private Context mContext;
@@ -64,6 +65,7 @@ public class KeychainDatabase extends SQLiteOpenHelper {
String CERTS = "certs";
String API_APPS = "api_apps";
String API_ACCOUNTS = "api_accounts";
+ String API_ALLOWED_KEYS = "api_allowed_keys";
}
private static final String CREATE_KEYRINGS_PUBLIC =
@@ -166,6 +168,18 @@ public class KeychainDatabase extends SQLiteOpenHelper {
+ Tables.API_APPS + "(" + ApiAppsColumns.PACKAGE_NAME + ") ON DELETE CASCADE"
+ ")";
+ private static final String CREATE_API_APPS_ALLOWED_KEYS =
+ "CREATE TABLE IF NOT EXISTS " + Tables.API_ALLOWED_KEYS + " ("
+ + BaseColumns._ID + " INTEGER PRIMARY KEY AUTOINCREMENT, "
+ + ApiAppsAllowedKeysColumns.KEY_ID + " INTEGER, "
+ + ApiAppsAllowedKeysColumns.PACKAGE_NAME + " TEXT NOT NULL, "
+
+ + "UNIQUE(" + ApiAppsAllowedKeysColumns.KEY_ID + ", "
+ + ApiAppsAllowedKeysColumns.PACKAGE_NAME + "), "
+ + "FOREIGN KEY(" + ApiAppsAllowedKeysColumns.PACKAGE_NAME + ") REFERENCES "
+ + Tables.API_APPS + "(" + ApiAppsAllowedKeysColumns.PACKAGE_NAME + ") ON DELETE CASCADE"
+ + ")";
+
KeychainDatabase(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
mContext = context;
@@ -195,6 +209,7 @@ public class KeychainDatabase extends SQLiteOpenHelper {
db.execSQL(CREATE_CERTS);
db.execSQL(CREATE_API_APPS);
db.execSQL(CREATE_API_APPS_ACCOUNTS);
+ db.execSQL(CREATE_API_APPS_ALLOWED_KEYS);
}
@Override
@@ -243,6 +258,15 @@ public class KeychainDatabase extends SQLiteOpenHelper {
case 6:
db.execSQL("ALTER TABLE user_ids ADD COLUMN type INTEGER");
db.execSQL("ALTER TABLE user_ids ADD COLUMN attribute_data BLOB");
+ case 7:
+ // consolidate
+ case 8:
+ // new table for allowed key ids in API
+ try {
+ db.execSQL(CREATE_API_APPS_ALLOWED_KEYS);
+ } catch (Exception e) {
+ // never mind, the column probably already existed
+ }
}
// always do consolidate after upgrade
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/provider/KeychainProvider.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/provider/KeychainProvider.java
index 72475472e..2ffc8c2ca 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/provider/KeychainProvider.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/provider/KeychainProvider.java
@@ -31,6 +31,7 @@ import android.net.Uri;
import android.text.TextUtils;
import org.sufficientlysecure.keychain.Constants;
+import org.sufficientlysecure.keychain.provider.KeychainContract.ApiAllowedKeys;
import org.sufficientlysecure.keychain.provider.KeychainContract.ApiAccounts;
import org.sufficientlysecure.keychain.provider.KeychainContract.ApiApps;
import org.sufficientlysecure.keychain.provider.KeychainContract.Certs;
@@ -63,9 +64,10 @@ public class KeychainProvider extends ContentProvider {
private static final int KEY_RING_CERTS_SPECIFIC = 206;
private static final int API_APPS = 301;
- private static final int API_APPS_BY_PACKAGE_NAME = 303;
- private static final int API_ACCOUNTS = 304;
- private static final int API_ACCOUNTS_BY_ACCOUNT_NAME = 306;
+ private static final int API_APPS_BY_PACKAGE_NAME = 302;
+ private static final int API_ACCOUNTS = 303;
+ private static final int API_ACCOUNTS_BY_ACCOUNT_NAME = 304;
+ private static final int API_ALLOWED_KEYS = 305;
private static final int KEY_RINGS_FIND_BY_EMAIL = 400;
private static final int KEY_RINGS_FIND_BY_SUBKEY = 401;
@@ -162,6 +164,8 @@ public class KeychainProvider extends ContentProvider {
*
* api_apps/_/accounts
* api_apps/_/accounts/_ (account name)
+ *
+ * api_apps/_/allowed_keys
* </pre>
*/
matcher.addURI(authority, KeychainContract.BASE_API_APPS, API_APPS);
@@ -172,6 +176,9 @@ public class KeychainProvider extends ContentProvider {
matcher.addURI(authority, KeychainContract.BASE_API_APPS + "/*/"
+ KeychainContract.PATH_ACCOUNTS + "/*", API_ACCOUNTS_BY_ACCOUNT_NAME);
+ matcher.addURI(authority, KeychainContract.BASE_API_APPS + "/*/"
+ + KeychainContract.PATH_ALLOWED_KEYS, API_ALLOWED_KEYS);
+
return matcher;
}
@@ -223,6 +230,9 @@ public class KeychainProvider extends ContentProvider {
case API_ACCOUNTS_BY_ACCOUNT_NAME:
return ApiAccounts.CONTENT_ITEM_TYPE;
+ case API_ALLOWED_KEYS:
+ return ApiAllowedKeys.CONTENT_TYPE;
+
default:
throw new UnsupportedOperationException("Unknown uri: " + uri);
}
@@ -614,6 +624,12 @@ public class KeychainProvider extends ContentProvider {
qb.appendWhereEscapeString(uri.getLastPathSegment());
break;
+ case API_ALLOWED_KEYS:
+ qb.setTables(Tables.API_ALLOWED_KEYS);
+ qb.appendWhere(Tables.API_ALLOWED_KEYS + "." + ApiAccounts.PACKAGE_NAME + " = ");
+ qb.appendWhereEscapeString(uri.getPathSegments().get(1));
+
+ break;
default:
throw new IllegalArgumentException("Unknown URI " + uri + " (" + match + ")");
@@ -683,7 +699,7 @@ public class KeychainProvider extends ContentProvider {
)) {
throw new AssertionError("Incorrect type for user packet! This is a bug!");
}
- if (values.get(UserPacketsColumns.RANK) == 0 && values.get(UserPacketsColumns.USER_ID) == null) {
+ if (((Number)values.get(UserPacketsColumns.RANK)).intValue() == 0 && values.get(UserPacketsColumns.USER_ID) == null) {
throw new AssertionError("Rank 0 user packet must be a user id!");
}
db.insertOrThrow(Tables.USER_PACKETS, null, values);
@@ -701,7 +717,7 @@ public class KeychainProvider extends ContentProvider {
db.insertOrThrow(Tables.API_APPS, null, values);
break;
- case API_ACCOUNTS:
+ case API_ACCOUNTS: {
// set foreign key automatically based on given uri
// e.g., api_apps/com.example.app/accounts/
String packageName = uri.getPathSegments().get(1);
@@ -709,12 +725,21 @@ public class KeychainProvider extends ContentProvider {
db.insertOrThrow(Tables.API_ACCOUNTS, null, values);
break;
+ }
+ case API_ALLOWED_KEYS: {
+ // set foreign key automatically based on given uri
+ // e.g., api_apps/com.example.app/allowed_keys/
+ String packageName = uri.getPathSegments().get(1);
+ values.put(ApiAllowedKeys.PACKAGE_NAME, packageName);
+ db.insertOrThrow(Tables.API_ALLOWED_KEYS, null, values);
+ break;
+ }
default:
throw new UnsupportedOperationException("Unknown uri: " + uri);
}
- if(keyId != null) {
+ if (keyId != null) {
uri = KeyRings.buildGenericKeyRingUri(keyId);
rowUri = uri;
}
@@ -777,6 +802,10 @@ public class KeychainProvider extends ContentProvider {
count = db.delete(Tables.API_ACCOUNTS, buildDefaultApiAccountsSelection(uri, additionalSelection),
selectionArgs);
break;
+ case API_ALLOWED_KEYS:
+ count = db.delete(Tables.API_ALLOWED_KEYS, buildDefaultApiAllowedKeysSelection(uri, additionalSelection),
+ selectionArgs);
+ break;
default:
throw new UnsupportedOperationException("Unknown uri: " + uri);
}
@@ -869,4 +898,15 @@ public class KeychainProvider extends ContentProvider {
+ andSelection;
}
+ private String buildDefaultApiAllowedKeysSelection(Uri uri, String selection) {
+ String packageName = DatabaseUtils.sqlEscapeString(uri.getPathSegments().get(1));
+
+ String andSelection = "";
+ if (!TextUtils.isEmpty(selection)) {
+ andSelection = " AND (" + selection + ")";
+ }
+
+ return ApiAllowedKeys.PACKAGE_NAME + "=" + packageName + andSelection;
+ }
+
}
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/provider/ProviderHelper.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/provider/ProviderHelper.java
index f23006a94..2ba7a19dc 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/provider/ProviderHelper.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/provider/ProviderHelper.java
@@ -50,6 +50,7 @@ import org.sufficientlysecure.keychain.pgp.UncachedKeyRing;
import org.sufficientlysecure.keychain.pgp.UncachedPublicKey;
import org.sufficientlysecure.keychain.pgp.WrappedSignature;
import org.sufficientlysecure.keychain.pgp.exception.PgpGeneralException;
+import org.sufficientlysecure.keychain.provider.KeychainContract.ApiAllowedKeys;
import org.sufficientlysecure.keychain.provider.KeychainContract.ApiApps;
import org.sufficientlysecure.keychain.provider.KeychainContract.Certs;
import org.sufficientlysecure.keychain.provider.KeychainContract.KeyRingData;
@@ -1312,7 +1313,6 @@ public class ProviderHelper {
progress.setProgress(100, 100);
log.add(LogType.MSG_CON_SUCCESS, indent);
- indent -= 1;
return new ConsolidateResult(ConsolidateResult.RESULT_OK, log);
@@ -1508,6 +1508,39 @@ public class ProviderHelper {
return keyIds;
}
+ public Set<Long> getAllowedKeyIdsForApp(Uri uri) {
+ Set<Long> keyIds = new HashSet<>();
+
+ Cursor cursor = mContentResolver.query(uri, null, null, null, null);
+ try {
+ if (cursor != null) {
+ int keyIdColumn = cursor.getColumnIndex(KeychainContract.ApiAllowedKeys.KEY_ID);
+ while (cursor.moveToNext()) {
+ keyIds.add(cursor.getLong(keyIdColumn));
+ }
+ }
+ } finally {
+ if (cursor != null) {
+ cursor.close();
+ }
+ }
+
+ return keyIds;
+ }
+
+ public void saveAllowedKeyIdsForApp(Uri uri, Set<Long> allowedKeyIds)
+ throws RemoteException, OperationApplicationException {
+ // wipe whole table of allowed keys for this account
+ mContentResolver.delete(uri, null, null);
+
+ // re-insert allowed key ids
+ for (Long keyId : allowedKeyIds) {
+ ContentValues values = new ContentValues();
+ values.put(ApiAllowedKeys.KEY_ID, keyId);
+ mContentResolver.insert(uri, values);
+ }
+ }
+
public Set<String> getAllFingerprints(Uri uri) {
Set<String> fingerprints = new HashSet<>();
String[] projection = new String[]{KeyRings.FINGERPRINT};
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/remote/OpenPgpService.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/remote/OpenPgpService.java
index d967931ce..d4f1e248c 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/remote/OpenPgpService.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/remote/OpenPgpService.java
@@ -55,6 +55,7 @@ import org.sufficientlysecure.keychain.ui.ViewKeyActivity;
import org.sufficientlysecure.keychain.util.InputData;
import org.sufficientlysecure.keychain.util.Log;
+import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.ArrayList;
@@ -224,6 +225,8 @@ public class OpenPgpService extends RemoteService {
private Intent signImpl(Intent data, ParcelFileDescriptor input,
ParcelFileDescriptor output, AccountSettings accSettings,
boolean cleartextSign) {
+ InputStream is = null;
+ OutputStream os = null;
try {
boolean asciiArmor = cleartextSign || data.getBooleanExtra(OpenPgpApi.EXTRA_REQUEST_ASCII_ARMOR, true);
@@ -243,96 +246,88 @@ public class OpenPgpService extends RemoteService {
}
// Get Input- and OutputStream from ParcelFileDescriptor
- InputStream is = new ParcelFileDescriptor.AutoCloseInputStream(input);
- OutputStream os = null;
+ is = new ParcelFileDescriptor.AutoCloseInputStream(input);
if (cleartextSign) {
// output stream only needed for cleartext signatures,
// detached signatures are returned as extra
os = new ParcelFileDescriptor.AutoCloseOutputStream(output);
}
+ long inputLength = is.available();
+ InputData inputData = new InputData(is, inputLength);
+
+ // Find the appropriate subkey to sign with
+ long sigSubKeyId;
try {
- long inputLength = is.available();
- InputData inputData = new InputData(is, inputLength);
+ CachedPublicKeyRing signingRing =
+ new ProviderHelper(this).getCachedPublicKeyRing(accSettings.getKeyId());
+ sigSubKeyId = signingRing.getSecretSignId();
+ } catch (PgpKeyNotFoundException e) {
+ // secret key that is set for this account is deleted?
+ // show account config again!
+ return getCreateAccountIntent(data, getAccountName(data));
+ }
- // Find the appropriate subkey to sign with
- long sigSubKeyId;
+ // get passphrase from cache, if key has "no" passphrase, this returns an empty String
+ String passphrase;
+ if (data.hasExtra(OpenPgpApi.EXTRA_PASSPHRASE)) {
+ passphrase = data.getStringExtra(OpenPgpApi.EXTRA_PASSPHRASE);
+ } else {
try {
- CachedPublicKeyRing signingRing =
- new ProviderHelper(this).getCachedPublicKeyRing(accSettings.getKeyId());
- sigSubKeyId = signingRing.getSecretSignId();
- } catch (PgpKeyNotFoundException e) {
- // secret key that is set for this account is deleted?
- // show account config again!
+ passphrase = PassphraseCacheService.getCachedPassphrase(getContext(),
+ accSettings.getKeyId(), sigSubKeyId);
+ } catch (PassphraseCacheService.KeyNotFoundException e) {
+ // should happen earlier, but return again here if it happens
return getCreateAccountIntent(data, getAccountName(data));
}
+ }
+ if (passphrase == null) {
+ // get PendingIntent for passphrase input, add it to given params and return to client
+ return getPassphraseIntent(data, sigSubKeyId);
+ }
- // get passphrase from cache, if key has "no" passphrase, this returns an empty String
- String passphrase;
- if (data.hasExtra(OpenPgpApi.EXTRA_PASSPHRASE)) {
- passphrase = data.getStringExtra(OpenPgpApi.EXTRA_PASSPHRASE);
- } else {
- try {
- passphrase = PassphraseCacheService.getCachedPassphrase(getContext(),
- accSettings.getKeyId(), sigSubKeyId);
- } catch (PassphraseCacheService.KeyNotFoundException e) {
- // should happen earlier, but return again here if it happens
- return getCreateAccountIntent(data, getAccountName(data));
- }
- }
- if (passphrase == null) {
- // get PendingIntent for passphrase input, add it to given params and return to client
- return getPassphraseIntent(data, sigSubKeyId);
- }
-
- // sign-only
- PgpSignEncrypt.Builder builder = new PgpSignEncrypt.Builder(
- this, new ProviderHelper(getContext()), null,
- inputData, os
- );
- builder.setEnableAsciiArmorOutput(asciiArmor)
- .setCleartextSignature(cleartextSign)
- .setDetachedSignature(!cleartextSign)
- .setVersionHeader(PgpHelper.getVersionForHeader(this))
- .setSignatureHashAlgorithm(accSettings.getHashAlgorithm())
- .setSignatureMasterKeyId(accSettings.getKeyId())
- .setSignatureSubKeyId(sigSubKeyId)
- .setSignaturePassphrase(passphrase)
- .setNfcState(nfcSignedHash, nfcCreationDate);
-
- // execute PGP operation!
- SignEncryptResult pgpResult = builder.build().execute();
-
- if (pgpResult.isPending()) {
- if ((pgpResult.getResult() & SignEncryptResult.RESULT_PENDING_PASSPHRASE) ==
- SignEncryptResult.RESULT_PENDING_PASSPHRASE) {
- return getPassphraseIntent(data, pgpResult.getKeyIdPassphraseNeeded());
- } else if ((pgpResult.getResult() & SignEncryptResult.RESULT_PENDING_NFC) ==
- SignEncryptResult.RESULT_PENDING_NFC) {
- // return PendingIntent to execute NFC activity
- // pass through the signature creation timestamp to be used again on second execution
- // of PgpSignEncrypt when we have the signed hash!
- data.putExtra(OpenPgpApi.EXTRA_NFC_SIG_CREATION_TIMESTAMP, pgpResult.getNfcTimestamp().getTime());
- return getNfcSignIntent(data, pgpResult.getNfcKeyId(), pgpResult.getNfcPassphrase(), pgpResult.getNfcHash(), pgpResult.getNfcAlgo());
- } else {
- throw new PgpGeneralException(
- "Encountered unhandled type of pending action not supported by API!");
- }
- } else if (pgpResult.success()) {
- Intent result = new Intent();
- if (!cleartextSign) {
- result.putExtra(OpenPgpApi.RESULT_DETACHED_SIGNATURE, pgpResult.getDetachedSignature());
- }
- result.putExtra(OpenPgpApi.RESULT_CODE, OpenPgpApi.RESULT_CODE_SUCCESS);
- return result;
+ // sign-only
+ PgpSignEncrypt.Builder builder = new PgpSignEncrypt.Builder(
+ this, new ProviderHelper(getContext()), null,
+ inputData, os
+ );
+ builder.setEnableAsciiArmorOutput(asciiArmor)
+ .setCleartextSignature(cleartextSign)
+ .setDetachedSignature(!cleartextSign)
+ .setVersionHeader(PgpHelper.getVersionForHeader(this))
+ .setSignatureHashAlgorithm(accSettings.getHashAlgorithm())
+ .setSignatureMasterKeyId(accSettings.getKeyId())
+ .setSignatureSubKeyId(sigSubKeyId)
+ .setSignaturePassphrase(passphrase)
+ .setNfcState(nfcSignedHash, nfcCreationDate);
+
+ // execute PGP operation!
+ SignEncryptResult pgpResult = builder.build().execute();
+
+ if (pgpResult.isPending()) {
+ if ((pgpResult.getResult() & SignEncryptResult.RESULT_PENDING_PASSPHRASE) ==
+ SignEncryptResult.RESULT_PENDING_PASSPHRASE) {
+ return getPassphraseIntent(data, pgpResult.getKeyIdPassphraseNeeded());
+ } else if ((pgpResult.getResult() & SignEncryptResult.RESULT_PENDING_NFC) ==
+ SignEncryptResult.RESULT_PENDING_NFC) {
+ // return PendingIntent to execute NFC activity
+ // pass through the signature creation timestamp to be used again on second execution
+ // of PgpSignEncrypt when we have the signed hash!
+ data.putExtra(OpenPgpApi.EXTRA_NFC_SIG_CREATION_TIMESTAMP, pgpResult.getNfcTimestamp().getTime());
+ return getNfcSignIntent(data, pgpResult.getNfcKeyId(), pgpResult.getNfcPassphrase(), pgpResult.getNfcHash(), pgpResult.getNfcAlgo());
} else {
- LogEntryParcel errorMsg = pgpResult.getLog().getLast();
- throw new Exception(getString(errorMsg.mType.getMsgId()));
+ throw new PgpGeneralException(
+ "Encountered unhandled type of pending action not supported by API!");
}
- } finally {
- is.close();
- if (os != null) {
- os.close();
+ } else if (pgpResult.success()) {
+ Intent result = new Intent();
+ if (!cleartextSign) {
+ result.putExtra(OpenPgpApi.RESULT_DETACHED_SIGNATURE, pgpResult.getDetachedSignature());
}
+ result.putExtra(OpenPgpApi.RESULT_CODE, OpenPgpApi.RESULT_CODE_SUCCESS);
+ return result;
+ } else {
+ LogEntryParcel errorMsg = pgpResult.getLog().getLast();
+ throw new Exception(getString(errorMsg.mType.getMsgId()));
}
} catch (Exception e) {
Log.d(Constants.TAG, "signImpl", e);
@@ -341,12 +336,29 @@ public class OpenPgpService extends RemoteService {
new OpenPgpError(OpenPgpError.GENERIC_ERROR, e.getMessage()));
result.putExtra(OpenPgpApi.RESULT_CODE, OpenPgpApi.RESULT_CODE_ERROR);
return result;
+ } finally {
+ if (is != null) {
+ try {
+ is.close();
+ } catch (IOException e) {
+ Log.e(Constants.TAG, "IOException when closing InputStream", e);
+ }
+ }
+ if (os != null) {
+ try {
+ os.close();
+ } catch (IOException e) {
+ Log.e(Constants.TAG, "IOException when closing OutputStream", e);
+ }
+ }
}
}
private Intent encryptAndSignImpl(Intent data, ParcelFileDescriptor input,
ParcelFileDescriptor output, AccountSettings accSettings,
boolean sign) {
+ InputStream is = null;
+ OutputStream os = null;
try {
boolean asciiArmor = data.getBooleanExtra(OpenPgpApi.EXTRA_REQUEST_ASCII_ARMOR, true);
String originalFilename = data.getStringExtra(OpenPgpApi.EXTRA_ORIGINAL_FILENAME);
@@ -372,96 +384,91 @@ public class OpenPgpService extends RemoteService {
// build InputData and write into OutputStream
// Get Input- and OutputStream from ParcelFileDescriptor
- InputStream is = new ParcelFileDescriptor.AutoCloseInputStream(input);
- OutputStream os = new ParcelFileDescriptor.AutoCloseOutputStream(output);
- try {
- long inputLength = is.available();
- InputData inputData = new InputData(is, inputLength);
-
- PgpSignEncrypt.Builder builder = new PgpSignEncrypt.Builder(
- this, new ProviderHelper(getContext()), null, inputData, os
- );
- builder.setEnableAsciiArmorOutput(asciiArmor)
- .setVersionHeader(PgpHelper.getVersionForHeader(this))
- .setCompressionId(accSettings.getCompression())
- .setSymmetricEncryptionAlgorithm(accSettings.getEncryptionAlgorithm())
- .setEncryptionMasterKeyIds(keyIds)
- .setFailOnMissingEncryptionKeyIds(true)
- .setOriginalFilename(originalFilename)
- .setAdditionalEncryptId(accSettings.getKeyId()); // add acc key for encryption
-
- if (sign) {
-
- // Find the appropriate subkey to sign with
- long sigSubKeyId;
- try {
- CachedPublicKeyRing signingRing =
- new ProviderHelper(this).getCachedPublicKeyRing(accSettings.getKeyId());
- sigSubKeyId = signingRing.getSecretSignId();
- } catch (PgpKeyNotFoundException e) {
- // secret key that is set for this account is deleted?
- // show account config again!
- return getCreateAccountIntent(data, getAccountName(data));
- }
+ is = new ParcelFileDescriptor.AutoCloseInputStream(input);
+ os = new ParcelFileDescriptor.AutoCloseOutputStream(output);
+
+ long inputLength = is.available();
+ InputData inputData = new InputData(is, inputLength);
+
+ PgpSignEncrypt.Builder builder = new PgpSignEncrypt.Builder(
+ this, new ProviderHelper(getContext()), null, inputData, os
+ );
+ builder.setEnableAsciiArmorOutput(asciiArmor)
+ .setVersionHeader(PgpHelper.getVersionForHeader(this))
+ .setCompressionId(accSettings.getCompression())
+ .setSymmetricEncryptionAlgorithm(accSettings.getEncryptionAlgorithm())
+ .setEncryptionMasterKeyIds(keyIds)
+ .setFailOnMissingEncryptionKeyIds(true)
+ .setOriginalFilename(originalFilename)
+ .setAdditionalEncryptId(accSettings.getKeyId()); // add acc key for encryption
+
+ if (sign) {
- String passphrase;
- if (data.hasExtra(OpenPgpApi.EXTRA_PASSPHRASE)) {
- passphrase = data.getStringExtra(OpenPgpApi.EXTRA_PASSPHRASE);
- } else {
- passphrase = PassphraseCacheService.getCachedPassphrase(getContext(),
- accSettings.getKeyId(), sigSubKeyId);
- }
- if (passphrase == null) {
- // get PendingIntent for passphrase input, add it to given params and return to client
- return getPassphraseIntent(data, sigSubKeyId);
- }
+ // Find the appropriate subkey to sign with
+ long sigSubKeyId;
+ try {
+ CachedPublicKeyRing signingRing =
+ new ProviderHelper(this).getCachedPublicKeyRing(accSettings.getKeyId());
+ sigSubKeyId = signingRing.getSecretSignId();
+ } catch (PgpKeyNotFoundException e) {
+ // secret key that is set for this account is deleted?
+ // show account config again!
+ return getCreateAccountIntent(data, getAccountName(data));
+ }
- byte[] nfcSignedHash = data.getByteArrayExtra(OpenPgpApi.EXTRA_NFC_SIGNED_HASH);
- // carefully: only set if timestamp exists
- Date nfcCreationDate = null;
- long nfcCreationTimestamp = data.getLongExtra(OpenPgpApi.EXTRA_NFC_SIG_CREATION_TIMESTAMP, -1);
- if (nfcCreationTimestamp != -1) {
- nfcCreationDate = new Date(nfcCreationTimestamp);
- }
+ String passphrase;
+ if (data.hasExtra(OpenPgpApi.EXTRA_PASSPHRASE)) {
+ passphrase = data.getStringExtra(OpenPgpApi.EXTRA_PASSPHRASE);
+ } else {
+ passphrase = PassphraseCacheService.getCachedPassphrase(getContext(),
+ accSettings.getKeyId(), sigSubKeyId);
+ }
+ if (passphrase == null) {
+ // get PendingIntent for passphrase input, add it to given params and return to client
+ return getPassphraseIntent(data, sigSubKeyId);
+ }
- // sign and encrypt
- builder.setSignatureHashAlgorithm(accSettings.getHashAlgorithm())
- .setSignatureMasterKeyId(accSettings.getKeyId())
- .setSignatureSubKeyId(sigSubKeyId)
- .setSignaturePassphrase(passphrase)
- .setNfcState(nfcSignedHash, nfcCreationDate);
+ byte[] nfcSignedHash = data.getByteArrayExtra(OpenPgpApi.EXTRA_NFC_SIGNED_HASH);
+ // carefully: only set if timestamp exists
+ Date nfcCreationDate = null;
+ long nfcCreationTimestamp = data.getLongExtra(OpenPgpApi.EXTRA_NFC_SIG_CREATION_TIMESTAMP, -1);
+ if (nfcCreationTimestamp != -1) {
+ nfcCreationDate = new Date(nfcCreationTimestamp);
}
- // execute PGP operation!
- SignEncryptResult pgpResult = builder.build().execute();
-
- if (pgpResult.isPending()) {
- if ((pgpResult.getResult() & SignEncryptResult.RESULT_PENDING_PASSPHRASE) ==
- SignEncryptResult.RESULT_PENDING_PASSPHRASE) {
- return getPassphraseIntent(data, pgpResult.getKeyIdPassphraseNeeded());
- } else if ((pgpResult.getResult() & SignEncryptResult.RESULT_PENDING_NFC) ==
- SignEncryptResult.RESULT_PENDING_NFC) {
- // return PendingIntent to execute NFC activity
- // pass through the signature creation timestamp to be used again on second execution
- // of PgpSignEncrypt when we have the signed hash!
- data.putExtra(OpenPgpApi.EXTRA_NFC_SIG_CREATION_TIMESTAMP, pgpResult.getNfcTimestamp().getTime());
- return getNfcSignIntent(data, pgpResult.getNfcKeyId(), pgpResult.getNfcPassphrase(), pgpResult.getNfcHash(), pgpResult.getNfcAlgo());
- } else {
- throw new PgpGeneralException(
- "Encountered unhandled type of pending action not supported by API!");
- }
- } else if (pgpResult.success()) {
- Intent result = new Intent();
- result.putExtra(OpenPgpApi.RESULT_CODE, OpenPgpApi.RESULT_CODE_SUCCESS);
- return result;
+ // sign and encrypt
+ builder.setSignatureHashAlgorithm(accSettings.getHashAlgorithm())
+ .setSignatureMasterKeyId(accSettings.getKeyId())
+ .setSignatureSubKeyId(sigSubKeyId)
+ .setSignaturePassphrase(passphrase)
+ .setNfcState(nfcSignedHash, nfcCreationDate);
+ }
+
+ // execute PGP operation!
+ SignEncryptResult pgpResult = builder.build().execute();
+
+ if (pgpResult.isPending()) {
+ if ((pgpResult.getResult() & SignEncryptResult.RESULT_PENDING_PASSPHRASE) ==
+ SignEncryptResult.RESULT_PENDING_PASSPHRASE) {
+ return getPassphraseIntent(data, pgpResult.getKeyIdPassphraseNeeded());
+ } else if ((pgpResult.getResult() & SignEncryptResult.RESULT_PENDING_NFC) ==
+ SignEncryptResult.RESULT_PENDING_NFC) {
+ // return PendingIntent to execute NFC activity
+ // pass through the signature creation timestamp to be used again on second execution
+ // of PgpSignEncrypt when we have the signed hash!
+ data.putExtra(OpenPgpApi.EXTRA_NFC_SIG_CREATION_TIMESTAMP, pgpResult.getNfcTimestamp().getTime());
+ return getNfcSignIntent(data, pgpResult.getNfcKeyId(), pgpResult.getNfcPassphrase(), pgpResult.getNfcHash(), pgpResult.getNfcAlgo());
} else {
- LogEntryParcel errorMsg = pgpResult.getLog().getLast();
- throw new Exception(getString(errorMsg.mType.getMsgId()));
+ throw new PgpGeneralException(
+ "Encountered unhandled type of pending action not supported by API!");
}
-
- } finally {
- is.close();
- os.close();
+ } else if (pgpResult.success()) {
+ Intent result = new Intent();
+ result.putExtra(OpenPgpApi.RESULT_CODE, OpenPgpApi.RESULT_CODE_SUCCESS);
+ return result;
+ } else {
+ LogEntryParcel errorMsg = pgpResult.getLog().getLast();
+ throw new Exception(getString(errorMsg.mType.getMsgId()));
}
} catch (Exception e) {
Log.d(Constants.TAG, "encryptAndSignImpl", e);
@@ -470,17 +477,33 @@ public class OpenPgpService extends RemoteService {
new OpenPgpError(OpenPgpError.GENERIC_ERROR, e.getMessage()));
result.putExtra(OpenPgpApi.RESULT_CODE, OpenPgpApi.RESULT_CODE_ERROR);
return result;
+ } finally {
+ if (is != null) {
+ try {
+ is.close();
+ } catch (IOException e) {
+ Log.e(Constants.TAG, "IOException when closing InputStream", e);
+ }
+ }
+ if (os != null) {
+ try {
+ os.close();
+ } catch (IOException e) {
+ Log.e(Constants.TAG, "IOException when closing OutputStream", e);
+ }
+ }
}
}
private Intent decryptAndVerifyImpl(Intent data, ParcelFileDescriptor input,
ParcelFileDescriptor output, Set<Long> allowedKeyIds,
boolean decryptMetadataOnly) {
+ InputStream is = null;
+ OutputStream os = null;
try {
// Get Input- and OutputStream from ParcelFileDescriptor
- InputStream is = new ParcelFileDescriptor.AutoCloseInputStream(input);
+ is = new ParcelFileDescriptor.AutoCloseInputStream(input);
- OutputStream os;
// output is optional, e.g., for verifying detached signatures
if (decryptMetadataOnly || output == null) {
os = null;
@@ -488,101 +511,95 @@ public class OpenPgpService extends RemoteService {
os = new ParcelFileDescriptor.AutoCloseOutputStream(output);
}
- try {
- String passphrase = data.getStringExtra(OpenPgpApi.EXTRA_PASSPHRASE);
- long inputLength = is.available();
- InputData inputData = new InputData(is, inputLength);
-
- PgpDecryptVerify.Builder builder = new PgpDecryptVerify.Builder(
- this, new ProviderHelper(getContext()), null, inputData, os
- );
-
- byte[] nfcDecryptedSessionKey = data.getByteArrayExtra(OpenPgpApi.EXTRA_NFC_DECRYPTED_SESSION_KEY);
-
- byte[] detachedSignature = data.getByteArrayExtra(OpenPgpApi.EXTRA_DETACHED_SIGNATURE);
-
- // allow only private keys associated with accounts of this app
- // no support for symmetric encryption
- builder.setPassphrase(passphrase)
- .setAllowSymmetricDecryption(false)
- .setAllowedKeyIds(allowedKeyIds)
- .setDecryptMetadataOnly(decryptMetadataOnly)
- .setNfcState(nfcDecryptedSessionKey)
- .setDetachedSignature(detachedSignature);
-
- DecryptVerifyResult pgpResult = builder.build().execute();
-
- if (pgpResult.isPending()) {
- if ((pgpResult.getResult() & DecryptVerifyResult.RESULT_PENDING_ASYM_PASSPHRASE) ==
- DecryptVerifyResult.RESULT_PENDING_ASYM_PASSPHRASE) {
- return getPassphraseIntent(data, pgpResult.getKeyIdPassphraseNeeded());
- } else if ((pgpResult.getResult() & DecryptVerifyResult.RESULT_PENDING_SYM_PASSPHRASE) ==
- DecryptVerifyResult.RESULT_PENDING_SYM_PASSPHRASE) {
- throw new PgpGeneralException(
- "Decryption of symmetric content not supported by API!");
- } else if ((pgpResult.getResult() & DecryptVerifyResult.RESULT_PENDING_NFC) ==
- DecryptVerifyResult.RESULT_PENDING_NFC) {
- return getNfcDecryptIntent(
- data, pgpResult.getNfcSubKeyId(), pgpResult.getNfcPassphrase(), pgpResult.getNfcEncryptedSessionKey());
- } else {
- throw new PgpGeneralException(
- "Encountered unhandled type of pending action not supported by API!");
- }
- } else if (pgpResult.success()) {
- Intent result = new Intent();
-
- OpenPgpSignatureResult signatureResult = pgpResult.getSignatureResult();
- if (signatureResult != null) {
- result.putExtra(OpenPgpApi.RESULT_SIGNATURE, signatureResult);
-
- if (data.getIntExtra(OpenPgpApi.EXTRA_API_VERSION, -1) < 5) {
- // SIGNATURE_KEY_REVOKED and SIGNATURE_KEY_EXPIRED have been added in version 5
- if (signatureResult.getStatus() == OpenPgpSignatureResult.SIGNATURE_KEY_REVOKED
- || signatureResult.getStatus() == OpenPgpSignatureResult.SIGNATURE_KEY_EXPIRED) {
- signatureResult.setStatus(OpenPgpSignatureResult.SIGNATURE_ERROR);
- }
- }
-
- if (signatureResult.getStatus() == OpenPgpSignatureResult.SIGNATURE_KEY_MISSING) {
- // If signature is unknown we return an _additional_ PendingIntent
- // to retrieve the missing key
- Intent intent = new Intent(getBaseContext(), ImportKeysActivity.class);
- intent.setAction(ImportKeysActivity.ACTION_IMPORT_KEY_FROM_KEYSERVER_AND_RETURN_TO_SERVICE);
- intent.putExtra(ImportKeysActivity.EXTRA_KEY_ID, signatureResult.getKeyId());
- intent.putExtra(ImportKeysActivity.EXTRA_PENDING_INTENT_DATA, data);
+ String passphrase = data.getStringExtra(OpenPgpApi.EXTRA_PASSPHRASE);
+ long inputLength = is.available();
+ InputData inputData = new InputData(is, inputLength);
+
+ PgpDecryptVerify.Builder builder = new PgpDecryptVerify.Builder(
+ this, new ProviderHelper(getContext()), null, inputData, os
+ );
+
+ byte[] nfcDecryptedSessionKey = data.getByteArrayExtra(OpenPgpApi.EXTRA_NFC_DECRYPTED_SESSION_KEY);
+
+ byte[] detachedSignature = data.getByteArrayExtra(OpenPgpApi.EXTRA_DETACHED_SIGNATURE);
+
+ // allow only private keys associated with accounts of this app
+ // no support for symmetric encryption
+ builder.setPassphrase(passphrase)
+ .setAllowSymmetricDecryption(false)
+ .setAllowedKeyIds(allowedKeyIds)
+ .setDecryptMetadataOnly(decryptMetadataOnly)
+ .setNfcState(nfcDecryptedSessionKey)
+ .setDetachedSignature(detachedSignature);
+
+ DecryptVerifyResult pgpResult = builder.build().execute();
+
+ if (pgpResult.isPending()) {
+ if ((pgpResult.getResult() & DecryptVerifyResult.RESULT_PENDING_ASYM_PASSPHRASE) ==
+ DecryptVerifyResult.RESULT_PENDING_ASYM_PASSPHRASE) {
+ return getPassphraseIntent(data, pgpResult.getKeyIdPassphraseNeeded());
+ } else if ((pgpResult.getResult() & DecryptVerifyResult.RESULT_PENDING_SYM_PASSPHRASE) ==
+ DecryptVerifyResult.RESULT_PENDING_SYM_PASSPHRASE) {
+ throw new PgpGeneralException(
+ "Decryption of symmetric content not supported by API!");
+ } else if ((pgpResult.getResult() & DecryptVerifyResult.RESULT_PENDING_NFC) ==
+ DecryptVerifyResult.RESULT_PENDING_NFC) {
+ return getNfcDecryptIntent(
+ data, pgpResult.getNfcSubKeyId(), pgpResult.getNfcPassphrase(), pgpResult.getNfcEncryptedSessionKey());
+ } else {
+ throw new PgpGeneralException(
+ "Encountered unhandled type of pending action not supported by API!");
+ }
+ } else if (pgpResult.success()) {
+ Intent result = new Intent();
- PendingIntent pi = PendingIntent.getActivity(getBaseContext(), 0,
- intent,
- PendingIntent.FLAG_CANCEL_CURRENT);
+ OpenPgpSignatureResult signatureResult = pgpResult.getSignatureResult();
+ if (signatureResult != null) {
+ result.putExtra(OpenPgpApi.RESULT_SIGNATURE, signatureResult);
- result.putExtra(OpenPgpApi.RESULT_INTENT, pi);
+ if (data.getIntExtra(OpenPgpApi.EXTRA_API_VERSION, -1) < 5) {
+ // SIGNATURE_KEY_REVOKED and SIGNATURE_KEY_EXPIRED have been added in version 5
+ if (signatureResult.getStatus() == OpenPgpSignatureResult.SIGNATURE_KEY_REVOKED
+ || signatureResult.getStatus() == OpenPgpSignatureResult.SIGNATURE_KEY_EXPIRED) {
+ signatureResult.setStatus(OpenPgpSignatureResult.SIGNATURE_ERROR);
}
}
- if (data.getIntExtra(OpenPgpApi.EXTRA_API_VERSION, -1) >= 4) {
- OpenPgpMetadata metadata = pgpResult.getDecryptMetadata();
- if (metadata != null) {
- result.putExtra(OpenPgpApi.RESULT_METADATA, metadata);
- }
- }
+ if (signatureResult.getStatus() == OpenPgpSignatureResult.SIGNATURE_KEY_MISSING) {
+ // If signature is unknown we return an _additional_ PendingIntent
+ // to retrieve the missing key
+ Intent intent = new Intent(getBaseContext(), ImportKeysActivity.class);
+ intent.setAction(ImportKeysActivity.ACTION_IMPORT_KEY_FROM_KEYSERVER_AND_RETURN_TO_SERVICE);
+ intent.putExtra(ImportKeysActivity.EXTRA_KEY_ID, signatureResult.getKeyId());
+ intent.putExtra(ImportKeysActivity.EXTRA_PENDING_INTENT_DATA, data);
- String charset = pgpResult.getCharset();
- if (charset != null) {
- result.putExtra(OpenPgpApi.RESULT_CHARSET, charset);
+ PendingIntent pi = PendingIntent.getActivity(getBaseContext(), 0,
+ intent,
+ PendingIntent.FLAG_CANCEL_CURRENT);
+
+ result.putExtra(OpenPgpApi.RESULT_INTENT, pi);
}
+ }
- result.putExtra(OpenPgpApi.RESULT_CODE, OpenPgpApi.RESULT_CODE_SUCCESS);
- return result;
- } else {
- LogEntryParcel errorMsg = pgpResult.getLog().getLast();
- throw new Exception(getString(errorMsg.mType.getMsgId()));
+ if (data.getIntExtra(OpenPgpApi.EXTRA_API_VERSION, -1) >= 4) {
+ OpenPgpMetadata metadata = pgpResult.getDecryptMetadata();
+ if (metadata != null) {
+ result.putExtra(OpenPgpApi.RESULT_METADATA, metadata);
+ }
}
- } finally {
- is.close();
- if (os != null) {
- os.close();
+
+ String charset = pgpResult.getCharset();
+ if (charset != null) {
+ result.putExtra(OpenPgpApi.RESULT_CHARSET, charset);
}
+
+ result.putExtra(OpenPgpApi.RESULT_CODE, OpenPgpApi.RESULT_CODE_SUCCESS);
+ return result;
+ } else {
+ LogEntryParcel errorMsg = pgpResult.getLog().getLast();
+ throw new Exception(getString(errorMsg.mType.getMsgId()));
}
+
} catch (Exception e) {
Log.d(Constants.TAG, "decryptAndVerifyImpl", e);
Intent result = new Intent();
@@ -590,6 +607,21 @@ public class OpenPgpService extends RemoteService {
new OpenPgpError(OpenPgpError.GENERIC_ERROR, e.getMessage()));
result.putExtra(OpenPgpApi.RESULT_CODE, OpenPgpApi.RESULT_CODE_ERROR);
return result;
+ } finally {
+ if (is != null) {
+ try {
+ is.close();
+ } catch (IOException e) {
+ Log.e(Constants.TAG, "IOException when closing InputStream", e);
+ }
+ }
+ if (os != null) {
+ try {
+ os.close();
+ } catch (IOException e) {
+ Log.e(Constants.TAG, "IOException when closing OutputStream", e);
+ }
+ }
}
}
@@ -720,48 +752,66 @@ public class OpenPgpService extends RemoteService {
@Override
public Intent execute(Intent data, ParcelFileDescriptor input, ParcelFileDescriptor output) {
- Intent errorResult = checkRequirements(data);
- if (errorResult != null) {
- return errorResult;
- }
+ try {
+ Intent errorResult = checkRequirements(data);
+ if (errorResult != null) {
+ return errorResult;
+ }
- String accName = getAccountName(data);
- final AccountSettings accSettings = getAccSettings(accName);
- if (accSettings == null) {
- return getCreateAccountIntent(data, accName);
- }
+ String accName = getAccountName(data);
+ final AccountSettings accSettings = getAccSettings(accName);
+ if (accSettings == null) {
+ return getCreateAccountIntent(data, accName);
+ }
- String action = data.getAction();
- if (OpenPgpApi.ACTION_CLEARTEXT_SIGN.equals(action)) {
- return signImpl(data, input, output, accSettings, true);
- } else if (OpenPgpApi.ACTION_SIGN.equals(action)) {
- // DEPRECATED: same as ACTION_CLEARTEXT_SIGN
- Log.w(Constants.TAG, "You are using a deprecated API call, please use ACTION_CLEARTEXT_SIGN instead of ACTION_SIGN!");
- return signImpl(data, input, output, accSettings, true);
- } else if (OpenPgpApi.ACTION_DETACHED_SIGN.equals(action)) {
- return signImpl(data, input, output, accSettings, false);
- } else if (OpenPgpApi.ACTION_ENCRYPT.equals(action)) {
- return encryptAndSignImpl(data, input, output, accSettings, false);
- } else if (OpenPgpApi.ACTION_SIGN_AND_ENCRYPT.equals(action)) {
- return encryptAndSignImpl(data, input, output, accSettings, true);
- } else if (OpenPgpApi.ACTION_DECRYPT_VERIFY.equals(action)) {
- String currentPkg = getCurrentCallingPackage();
- Set<Long> allowedKeyIds =
- mProviderHelper.getAllKeyIdsForApp(
- ApiAccounts.buildBaseUri(currentPkg));
- return decryptAndVerifyImpl(data, input, output, allowedKeyIds, false);
- } else if (OpenPgpApi.ACTION_DECRYPT_METADATA.equals(action)) {
- String currentPkg = getCurrentCallingPackage();
- Set<Long> allowedKeyIds =
- mProviderHelper.getAllKeyIdsForApp(
- ApiAccounts.buildBaseUri(currentPkg));
- return decryptAndVerifyImpl(data, input, output, allowedKeyIds, true);
- } else if (OpenPgpApi.ACTION_GET_KEY.equals(action)) {
- return getKeyImpl(data);
- } else if (OpenPgpApi.ACTION_GET_KEY_IDS.equals(action)) {
- return getKeyIdsImpl(data);
- } else {
- return null;
+ String action = data.getAction();
+ if (OpenPgpApi.ACTION_CLEARTEXT_SIGN.equals(action)) {
+ return signImpl(data, input, output, accSettings, true);
+ } else if (OpenPgpApi.ACTION_SIGN.equals(action)) {
+ // DEPRECATED: same as ACTION_CLEARTEXT_SIGN
+ Log.w(Constants.TAG, "You are using a deprecated API call, please use ACTION_CLEARTEXT_SIGN instead of ACTION_SIGN!");
+ return signImpl(data, input, output, accSettings, true);
+ } else if (OpenPgpApi.ACTION_DETACHED_SIGN.equals(action)) {
+ return signImpl(data, input, output, accSettings, false);
+ } else if (OpenPgpApi.ACTION_ENCRYPT.equals(action)) {
+ return encryptAndSignImpl(data, input, output, accSettings, false);
+ } else if (OpenPgpApi.ACTION_SIGN_AND_ENCRYPT.equals(action)) {
+ return encryptAndSignImpl(data, input, output, accSettings, true);
+ } else if (OpenPgpApi.ACTION_DECRYPT_VERIFY.equals(action)) {
+ String currentPkg = getCurrentCallingPackage();
+ Set<Long> allowedKeyIds =
+ mProviderHelper.getAllKeyIdsForApp(
+ ApiAccounts.buildBaseUri(currentPkg));
+ return decryptAndVerifyImpl(data, input, output, allowedKeyIds, false);
+ } else if (OpenPgpApi.ACTION_DECRYPT_METADATA.equals(action)) {
+ String currentPkg = getCurrentCallingPackage();
+ Set<Long> allowedKeyIds =
+ mProviderHelper.getAllKeyIdsForApp(
+ ApiAccounts.buildBaseUri(currentPkg));
+ return decryptAndVerifyImpl(data, input, output, allowedKeyIds, true);
+ } else if (OpenPgpApi.ACTION_GET_KEY.equals(action)) {
+ return getKeyImpl(data);
+ } else if (OpenPgpApi.ACTION_GET_KEY_IDS.equals(action)) {
+ return getKeyIdsImpl(data);
+ } else {
+ return null;
+ }
+ } finally {
+ // always close input and output file descriptors even in error cases
+ if (input != null) {
+ try {
+ input.close();
+ } catch (IOException e) {
+ Log.e(Constants.TAG, "IOException when closing input ParcelFileDescriptor", e);
+ }
+ }
+ if (output != null) {
+ try {
+ output.close();
+ } catch (IOException e) {
+ Log.e(Constants.TAG, "IOException when closing output ParcelFileDescriptor", e);
+ }
+ }
}
}
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/remote/ui/AccountSettingsActivity.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/remote/ui/AccountSettingsActivity.java
index f4cd553d0..02bf98b12 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/remote/ui/AccountSettingsActivity.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/remote/ui/AccountSettingsActivity.java
@@ -58,7 +58,6 @@ public class AccountSettingsActivity extends BaseActivity {
}
});
-
mAccountSettingsFragment = (AccountSettingsFragment) getSupportFragmentManager().findFragmentById(
R.id.api_account_settings_fragment);
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/remote/ui/AppSettingsActivity.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/remote/ui/AppSettingsActivity.java
index 36d6ad888..8f822a338 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/remote/ui/AppSettingsActivity.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/remote/ui/AppSettingsActivity.java
@@ -24,6 +24,7 @@ import android.net.Uri;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
+import android.view.View;
import org.sufficientlysecure.keychain.Constants;
import org.sufficientlysecure.keychain.R;
@@ -37,8 +38,9 @@ import org.sufficientlysecure.keychain.util.Log;
public class AppSettingsActivity extends BaseActivity {
private Uri mAppUri;
- private AppSettingsFragment mSettingsFragment;
+ private AppSettingsHeaderFragment mSettingsFragment;
private AccountsListFragment mAccountsListFragment;
+ private AppSettingsAllowedKeysListFragment mAllowedKeysFragment;
// model
AppSettings mAppSettings;
@@ -47,7 +49,21 @@ public class AppSettingsActivity extends BaseActivity {
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
- mSettingsFragment = (AppSettingsFragment) getSupportFragmentManager().findFragmentById(
+ setFullScreenDialogDoneClose(R.string.api_settings_save,
+ new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ save();
+ }
+ },
+ new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ finish();
+ }
+ });
+
+ mSettingsFragment = (AppSettingsHeaderFragment) getSupportFragmentManager().findFragmentById(
R.id.api_app_settings_fragment);
Intent intent = getIntent();
@@ -62,6 +78,10 @@ public class AppSettingsActivity extends BaseActivity {
}
}
+ private void save() {
+ mAllowedKeysFragment.saveAllowedKeys();
+ }
+
@Override
protected void initLayout() {
setContentView(R.layout.api_app_settings_activity);
@@ -120,10 +140,12 @@ public class AppSettingsActivity extends BaseActivity {
Uri accountsUri = appUri.buildUpon().appendPath(KeychainContract.PATH_ACCOUNTS).build();
Log.d(Constants.TAG, "accountsUri: " + accountsUri);
- startListFragment(savedInstanceState, accountsUri);
+ Uri allowedKeysUri = appUri.buildUpon().appendPath(KeychainContract.PATH_ALLOWED_KEYS).build();
+ Log.d(Constants.TAG, "allowedKeysUri: " + allowedKeysUri);
+ startListFragments(savedInstanceState, accountsUri, allowedKeysUri);
}
- private void startListFragment(Bundle savedInstanceState, Uri dataUri) {
+ private void startListFragments(Bundle savedInstanceState, Uri accountsUri, Uri allowedKeysUri) {
// However, if we're being restored from a previous state,
// then we don't need to do anything and should return or else
// we could end up with overlapping fragments.
@@ -132,13 +154,17 @@ public class AppSettingsActivity extends BaseActivity {
}
// Create an instance of the fragment
- mAccountsListFragment = AccountsListFragment.newInstance(dataUri);
+ mAccountsListFragment = AccountsListFragment.newInstance(accountsUri);
+ mAllowedKeysFragment = AppSettingsAllowedKeysListFragment.newInstance(allowedKeysUri);
// Add the fragment to the 'fragment_container' FrameLayout
// NOTE: We use commitAllowingStateLoss() to prevent weird crashes!
getSupportFragmentManager().beginTransaction()
.replace(R.id.api_accounts_list_fragment, mAccountsListFragment)
.commitAllowingStateLoss();
+ getSupportFragmentManager().beginTransaction()
+ .replace(R.id.api_allowed_keys_list_fragment, mAllowedKeysFragment)
+ .commitAllowingStateLoss();
// do it immediately!
getSupportFragmentManager().executePendingTransactions();
}
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/remote/ui/AppSettingsAllowedKeysListFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/remote/ui/AppSettingsAllowedKeysListFragment.java
new file mode 100644
index 000000000..13b242a5e
--- /dev/null
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/remote/ui/AppSettingsAllowedKeysListFragment.java
@@ -0,0 +1,292 @@
+/*
+ * Copyright (C) 2015 Dominik Schürmann <dominik@dominikschuermann.de>
+ *
+ * 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/>.
+ */
+
+package org.sufficientlysecure.keychain.remote.ui;
+
+import android.content.Context;
+import android.content.OperationApplicationException;
+import android.database.Cursor;
+import android.database.DatabaseUtils;
+import android.net.Uri;
+import android.os.Bundle;
+import android.os.RemoteException;
+import android.support.v4.app.LoaderManager;
+import android.support.v4.content.CursorLoader;
+import android.support.v4.content.Loader;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.ListView;
+
+import org.sufficientlysecure.keychain.Constants;
+import org.sufficientlysecure.keychain.R;
+import org.sufficientlysecure.keychain.compatibility.ListFragmentWorkaround;
+import org.sufficientlysecure.keychain.provider.KeychainContract.KeyRings;
+import org.sufficientlysecure.keychain.provider.KeychainDatabase.Tables;
+import org.sufficientlysecure.keychain.provider.ProviderHelper;
+import org.sufficientlysecure.keychain.ui.adapter.SelectKeyCursorAdapter;
+import org.sufficientlysecure.keychain.ui.widget.FixedListView;
+import org.sufficientlysecure.keychain.util.Log;
+
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.Set;
+import java.util.Vector;
+
+public class AppSettingsAllowedKeysListFragment extends ListFragmentWorkaround implements LoaderManager.LoaderCallbacks<Cursor> {
+ private static final String ARG_DATA_URI = "uri";
+
+ private SelectKeyCursorAdapter mAdapter;
+ private Set<Long> mSelectedMasterKeyIds;
+ private ProviderHelper mProviderHelper;
+
+ private Uri mDataUri;
+
+ /**
+ * Creates new instance of this fragment
+ */
+ public static AppSettingsAllowedKeysListFragment newInstance(Uri dataUri) {
+ AppSettingsAllowedKeysListFragment frag = new AppSettingsAllowedKeysListFragment();
+ Bundle args = new Bundle();
+
+ args.putParcelable(ARG_DATA_URI, dataUri);
+
+ frag.setArguments(args);
+
+ return frag;
+ }
+
+ @Override
+ public void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+
+ mProviderHelper = new ProviderHelper(getActivity());
+ }
+
+ @Override
+ public View onCreateView(LayoutInflater inflater, ViewGroup container,
+ Bundle savedInstanceState) {
+ View layout = super.onCreateView(inflater, container,
+ savedInstanceState);
+ ListView lv = (ListView) layout.findViewById(android.R.id.list);
+ ViewGroup parent = (ViewGroup) lv.getParent();
+
+ /*
+ * http://stackoverflow.com/a/15880684
+ * Remove ListView and add FixedListView in its place.
+ * This is done here programatically to be still able to use the progressBar of ListFragment.
+ *
+ * We want FixedListView to be able to put this ListFragment inside a ScrollView
+ */
+ int lvIndex = parent.indexOfChild(lv);
+ parent.removeViewAt(lvIndex);
+ FixedListView newLv = new FixedListView(getActivity());
+ newLv.setId(android.R.id.list);
+ parent.addView(newLv, lvIndex, lv.getLayoutParams());
+ return layout;
+ }
+
+ /**
+ * Define Adapter and Loader on create of Activity
+ */
+ @Override
+ public void onActivityCreated(Bundle savedInstanceState) {
+ super.onActivityCreated(savedInstanceState);
+
+ mDataUri = getArguments().getParcelable(ARG_DATA_URI);
+
+ getListView().setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);
+
+ // Give some text to display if there is no data. In a real
+ // application this would come from a resource.
+ setEmptyText(getString(R.string.list_empty));
+
+ mAdapter = new SecretKeyCursorAdapter(getActivity(), null, 0, getListView());
+
+ setListAdapter(mAdapter);
+
+ // Start out with a progress indicator.
+ setListShown(false);
+
+ mSelectedMasterKeyIds = mProviderHelper.getAllKeyIdsForApp(mDataUri);
+ Log.d(Constants.TAG, "allowed: " + mSelectedMasterKeyIds.toString());
+
+ // Prepare the loader. Either re-connect with an existing one,
+ // or start a new one.
+ getLoaderManager().initLoader(0, null, this);
+ }
+
+ /**
+ * Selects items based on master key ids in list view
+ *
+ * @param masterKeyIds
+ */
+ private void preselectMasterKeyIds(Set<Long> masterKeyIds) {
+ for (int i = 0; i < getListView().getCount(); ++i) {
+ long listKeyId = mAdapter.getMasterKeyId(i);
+ for (long keyId : masterKeyIds) {
+ if (listKeyId == keyId) {
+ getListView().setItemChecked(i, true);
+ break;
+ }
+ }
+ }
+ }
+
+ /**
+ * Returns all selected master key ids
+ *
+ * @return
+ */
+ public Set<Long> getSelectedMasterKeyIds() {
+ // mListView.getCheckedItemIds() would give the row ids of the KeyRings not the master key
+ // ids!
+ Set<Long> keyIds = new HashSet<>();
+ for (int i = 0; i < getListView().getCount(); ++i) {
+ if (getListView().isItemChecked(i)) {
+ keyIds.add(mAdapter.getMasterKeyId(i));
+ }
+ }
+
+ return keyIds;
+ }
+
+ /**
+ * Returns all selected user ids
+ *
+ * @return
+ */
+ public String[] getSelectedUserIds() {
+ Vector<String> userIds = new Vector<>();
+ for (int i = 0; i < getListView().getCount(); ++i) {
+ if (getListView().isItemChecked(i)) {
+ userIds.add(mAdapter.getUserId(i));
+ }
+ }
+
+ // make empty array to not return null
+ String userIdArray[] = new String[0];
+ return userIds.toArray(userIdArray);
+ }
+
+ public void saveAllowedKeys() {
+ try {
+ mProviderHelper.saveAllowedKeyIdsForApp(mDataUri, getSelectedMasterKeyIds());
+ } catch (RemoteException | OperationApplicationException e) {
+ Log.e(Constants.TAG, "Problem saving allowed key ids!", e);
+ }
+ }
+
+ @Override
+ public Loader<Cursor> onCreateLoader(int id, Bundle args) {
+ Uri baseUri = KeyRings.buildUnifiedKeyRingsUri();
+
+ // These are the rows that we will retrieve.
+ String[] projection = new String[]{
+ KeyRings._ID,
+ KeyRings.MASTER_KEY_ID,
+ KeyRings.USER_ID,
+ KeyRings.IS_EXPIRED,
+ KeyRings.IS_REVOKED,
+ KeyRings.HAS_ENCRYPT,
+ KeyRings.VERIFIED,
+ KeyRings.HAS_ANY_SECRET,
+ };
+
+ String inMasterKeyList = null;
+ if (mSelectedMasterKeyIds != null && mSelectedMasterKeyIds.size() > 0) {
+ inMasterKeyList = Tables.KEYS + "." + KeyRings.MASTER_KEY_ID + " IN (";
+ Iterator iter = mSelectedMasterKeyIds.iterator();
+ while (iter.hasNext()) {
+ inMasterKeyList += DatabaseUtils.sqlEscapeString("" + iter.next());
+ if (iter.hasNext()) {
+ inMasterKeyList += ", ";
+ }
+ }
+ inMasterKeyList += ")";
+ }
+
+ String selection = KeyRings.HAS_ANY_SECRET + " != 0";
+
+ String orderBy = KeyRings.USER_ID + " ASC";
+ if (inMasterKeyList != null) {
+ // sort by selected master keys
+ orderBy = inMasterKeyList + " DESC, " + orderBy;
+ }
+ // Now create and return a CursorLoader that will take care of
+ // creating a Cursor for the data being displayed.
+ return new CursorLoader(getActivity(), baseUri, projection, selection, null, orderBy);
+ }
+
+ @Override
+ public void onLoadFinished(Loader<Cursor> loader, Cursor data) {
+ // Swap the new cursor in. (The framework will take care of closing the
+ // old cursor once we return.)
+ mAdapter.swapCursor(data);
+
+ // The list should now be shown.
+ if (isResumed()) {
+ setListShown(true);
+ } else {
+ setListShownNoAnimation(true);
+ }
+
+ // preselect given master keys
+ preselectMasterKeyIds(mSelectedMasterKeyIds);
+ }
+
+ @Override
+ public void onLoaderReset(Loader<Cursor> loader) {
+ // This is called when the last Cursor provided to onLoadFinished()
+ // above is about to be closed. We need to make sure we are no
+ // longer using it.
+ mAdapter.swapCursor(null);
+ }
+
+ private class SecretKeyCursorAdapter extends SelectKeyCursorAdapter {
+
+ public SecretKeyCursorAdapter(Context context, Cursor c, int flags, ListView listView) {
+ super(context, c, flags, listView);
+ }
+
+ @Override
+ protected void initIndex(Cursor cursor) {
+ super.initIndex(cursor);
+ }
+
+ @Override
+ public void bindView(View view, Context context, Cursor cursor) {
+ super.bindView(view, context, cursor);
+ ViewHolderItem h = (ViewHolderItem) view.getTag();
+
+ // We care about the checkbox
+ h.selected.setVisibility(View.VISIBLE);
+ // the getListView works because this is not a static subclass!
+ h.selected.setChecked(getListView().isItemChecked(cursor.getPosition()));
+
+ boolean enabled = false;
+ if ((Boolean) h.statusIcon.getTag()) {
+ h.statusIcon.setVisibility(View.GONE);
+ enabled = true;
+ }
+
+ h.setEnabled(enabled);
+ }
+
+ }
+
+}
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/remote/ui/AppSettingsFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/remote/ui/AppSettingsHeaderFragment.java
index a6db02708..7beac8973 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/remote/ui/AppSettingsFragment.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/remote/ui/AppSettingsHeaderFragment.java
@@ -38,7 +38,7 @@ import org.sufficientlysecure.keychain.util.Log;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
-public class AppSettingsFragment extends Fragment {
+public class AppSettingsHeaderFragment extends Fragment {
// model
private AppSettings mAppSettings;
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/remote/ui/RemoteServiceActivity.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/remote/ui/RemoteServiceActivity.java
index cbc593b0a..2c5c78161 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/remote/ui/RemoteServiceActivity.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/remote/ui/RemoteServiceActivity.java
@@ -75,7 +75,7 @@ public class RemoteServiceActivity extends BaseActivity {
public static final String EXTRA_ERROR_MESSAGE = "error_message";
// register view
- private AppSettingsFragment mAppSettingsFragment;
+ private AppSettingsHeaderFragment mAppSettingsHeaderFragment;
// create acc view
private AccountSettingsFragment mAccSettingsFragment;
// select pub keys view
@@ -115,11 +115,11 @@ public class RemoteServiceActivity extends BaseActivity {
setContentView(R.layout.api_remote_register_app);
initToolbar();
- mAppSettingsFragment = (AppSettingsFragment) getSupportFragmentManager().findFragmentById(
+ mAppSettingsHeaderFragment = (AppSettingsHeaderFragment) getSupportFragmentManager().findFragmentById(
R.id.api_app_settings_fragment);
AppSettings settings = new AppSettings(packageName, packageSignature);
- mAppSettingsFragment.setAppSettings(settings);
+ mAppSettingsHeaderFragment.setAppSettings(settings);
// Inflate a "Done"/"Cancel" custom action bar view
setFullScreenDialogTwoButtons(
@@ -129,7 +129,7 @@ public class RemoteServiceActivity extends BaseActivity {
public void onClick(View v) {
// Allow
- mProviderHelper.insertApiApp(mAppSettingsFragment.getAppSettings());
+ mProviderHelper.insertApiApp(mAppSettingsHeaderFragment.getAppSettings());
// give data through for new service call
Intent resultData = extras.getParcelable(EXTRA_DATA);
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/DecryptActivity.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/DecryptActivity.java
deleted file mode 100644
index 21377bcd2..000000000
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/DecryptActivity.java
+++ /dev/null
@@ -1,128 +0,0 @@
-/*
- * Copyright (C) 2014 Dominik Schürmann <dominik@dominikschuermann.de>
- * Copyright (C) 2014 Vincent Breitmoser <v.breitmoser@mugenguild.com>
- *
- * 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/>.
- */
-
-package org.sufficientlysecure.keychain.ui;
-
-import android.annotation.TargetApi;
-import android.content.Intent;
-import android.os.AsyncTask;
-import android.os.Build;
-import android.os.Build.VERSION_CODES;
-import android.os.Bundle;
-import android.view.View;
-
-import org.sufficientlysecure.keychain.R;
-import org.sufficientlysecure.keychain.compatibility.ClipboardReflection;
-import org.sufficientlysecure.keychain.pgp.PgpHelper;
-import org.sufficientlysecure.keychain.operations.results.OperationResult;
-import org.sufficientlysecure.keychain.ui.util.SubtleAttentionSeeker;
-
-import java.util.regex.Matcher;
-
-public class DecryptActivity extends BaseActivity {
-
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
-
-// activateDrawerNavigation(savedInstanceState);
-
- View actionFile = findViewById(R.id.decrypt_files);
- View actionFromClipboard = findViewById(R.id.decrypt_from_clipboard);
-
- actionFile.setOnClickListener(new View.OnClickListener() {
- @Override
- public void onClick(View v) {
- Intent filesDecrypt = new Intent(DecryptActivity.this, DecryptFilesActivity.class);
- filesDecrypt.setAction(DecryptFilesActivity.ACTION_DECRYPT_DATA_OPEN);
- startActivity(filesDecrypt);
- }
- });
-
- actionFromClipboard.setOnClickListener(new View.OnClickListener() {
- @Override
- public void onClick(View v) {
- Intent clipboardDecrypt = new Intent(DecryptActivity.this, DecryptTextActivity.class);
- clipboardDecrypt.setAction(DecryptTextActivity.ACTION_DECRYPT_FROM_CLIPBOARD);
- startActivityForResult(clipboardDecrypt, 0);
- }
- });
- }
-
- @Override
- protected void initLayout() {
- setContentView(R.layout.decrypt_activity);
- }
-
- @TargetApi(VERSION_CODES.HONEYCOMB)
- @Override
- protected void onResume() {
- super.onResume();
-
- // This is an eye candy ice cream sandwich feature, nvm on versions below
- if (Build.VERSION.SDK_INT >= VERSION_CODES.ICE_CREAM_SANDWICH) {
-
- // get text from clipboard
- final CharSequence clipboardText =
- ClipboardReflection.getClipboardText(DecryptActivity.this);
-
- // if it's null, nothing to do here /o/
- if (clipboardText == null) {
- return;
- }
-
- new AsyncTask<String, Void, Boolean>() {
- @Override
- protected Boolean doInBackground(String... clipboardText) {
-
- // see if it looks like a pgp thing
- Matcher matcher = PgpHelper.PGP_MESSAGE.matcher(clipboardText[0]);
- boolean animate = matcher.matches();
-
- // see if it looks like another pgp thing
- if (!animate) {
- matcher = PgpHelper.PGP_CLEARTEXT_SIGNATURE.matcher(clipboardText[0]);
- animate = matcher.matches();
- }
- return animate;
- }
-
- @Override
- protected void onPostExecute(Boolean animate) {
- super.onPostExecute(animate);
-
- // if so, animate the clipboard icon just a bit~
- if (animate) {
- SubtleAttentionSeeker.tada(findViewById(R.id.clipboard_icon), 1.5f).start();
- }
- }
- }.execute(clipboardText.toString());
- }
- }
-
- @Override
- protected void onActivityResult(int requestCode, int resultCode, Intent data) {
- // if a result has been returned, display a notify
- if (data != null && data.hasExtra(OperationResult.EXTRA_RESULT)) {
- OperationResult result = data.getParcelableExtra(OperationResult.EXTRA_RESULT);
- result.createNotify(this).show();
- } else {
- super.onActivityResult(requestCode, resultCode, data);
- }
- }
-}
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/DecryptOverviewFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/DecryptOverviewFragment.java
new file mode 100644
index 000000000..8407a8ca7
--- /dev/null
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/DecryptOverviewFragment.java
@@ -0,0 +1,130 @@
+/*
+ * Copyright (C) 2014-2015 Dominik Schürmann <dominik@dominikschuermann.de>
+ * Copyright (C) 2014 Vincent Breitmoser <v.breitmoser@mugenguild.com>
+ *
+ * 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/>.
+ */
+
+package org.sufficientlysecure.keychain.ui;
+
+import android.content.Intent;
+import android.os.AsyncTask;
+import android.os.Bundle;
+import android.support.annotation.Nullable;
+import android.support.v4.app.Fragment;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+
+import org.sufficientlysecure.keychain.R;
+import org.sufficientlysecure.keychain.compatibility.ClipboardReflection;
+import org.sufficientlysecure.keychain.operations.results.OperationResult;
+import org.sufficientlysecure.keychain.pgp.PgpHelper;
+import org.sufficientlysecure.keychain.ui.util.SubtleAttentionSeeker;
+
+import java.util.regex.Matcher;
+
+public class DecryptOverviewFragment extends Fragment {
+
+ View mActionFile;
+ View mActionFromClipboard;
+ View mClipboardIcon;
+
+ @Override
+ public void onActivityCreated(Bundle savedInstanceState) {
+ super.onActivityCreated(savedInstanceState);
+
+ }
+
+ @Override
+ public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
+ View view = inflater.inflate(R.layout.decrypt_overview_fragment, container, false);
+
+ mActionFile = view.findViewById(R.id.decrypt_files);
+ mActionFromClipboard = view.findViewById(R.id.decrypt_from_clipboard);
+ mClipboardIcon = view.findViewById(R.id.clipboard_icon);
+
+ mActionFile.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ Intent filesDecrypt = new Intent(getActivity(), DecryptFilesActivity.class);
+ filesDecrypt.setAction(DecryptFilesActivity.ACTION_DECRYPT_DATA_OPEN);
+ startActivity(filesDecrypt);
+ }
+ });
+
+ mActionFromClipboard.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ Intent clipboardDecrypt = new Intent(getActivity(), DecryptTextActivity.class);
+ clipboardDecrypt.setAction(DecryptTextActivity.ACTION_DECRYPT_FROM_CLIPBOARD);
+ startActivityForResult(clipboardDecrypt, 0);
+ }
+ });
+
+ return view;
+ }
+
+ @Override
+ public void onResume() {
+ super.onResume();
+
+ // get text from clipboard
+ final CharSequence clipboardText =
+ ClipboardReflection.getClipboardText(getActivity());
+
+ // if it's null, nothing to do here /o/
+ if (clipboardText == null) {
+ return;
+ }
+
+ new AsyncTask<String, Void, Boolean>() {
+ @Override
+ protected Boolean doInBackground(String... clipboardText) {
+
+ // see if it looks like a pgp thing
+ Matcher matcher = PgpHelper.PGP_MESSAGE.matcher(clipboardText[0]);
+ boolean animate = matcher.matches();
+
+ // see if it looks like another pgp thing
+ if (!animate) {
+ matcher = PgpHelper.PGP_CLEARTEXT_SIGNATURE.matcher(clipboardText[0]);
+ animate = matcher.matches();
+ }
+ return animate;
+ }
+
+ @Override
+ protected void onPostExecute(Boolean animate) {
+ super.onPostExecute(animate);
+
+ // if so, animate the clipboard icon just a bit~
+ if (animate) {
+ SubtleAttentionSeeker.tada(mClipboardIcon, 1.5f).start();
+ }
+ }
+ }.execute(clipboardText.toString());
+ }
+
+ @Override
+ public void onActivityResult(int requestCode, int resultCode, Intent data) {
+ // if a result has been returned, display a notify
+ if (data != null && data.hasExtra(OperationResult.EXTRA_RESULT)) {
+ OperationResult result = data.getParcelableExtra(OperationResult.EXTRA_RESULT);
+ result.createNotify(getActivity()).show();
+ } else {
+ super.onActivityResult(requestCode, resultCode, data);
+ }
+ }
+}
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/DrawerActivity.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/DrawerActivity.java
deleted file mode 100644
index 712516b8d..000000000
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/DrawerActivity.java
+++ /dev/null
@@ -1,305 +0,0 @@
-/*
- * Copyright (C) 2014 Dominik Schürmann <dominik@dominikschuermann.de>
- *
- * 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/>.
- */
-
-package org.sufficientlysecure.keychain.ui;
-
-import android.app.Activity;
-import android.content.Context;
-import android.content.Intent;
-import android.content.res.Configuration;
-import android.graphics.Color;
-import android.os.Bundle;
-import android.support.v4.app.ActionBarDrawerToggle;
-import android.support.v4.view.GravityCompat;
-import android.support.v4.widget.DrawerLayout;
-import android.support.v4.widget.FixedDrawerLayout;
-import android.view.LayoutInflater;
-import android.view.Menu;
-import android.view.MenuItem;
-import android.view.View;
-import android.view.ViewGroup;
-import android.widget.AdapterView;
-import android.widget.ArrayAdapter;
-import android.widget.ImageView;
-import android.widget.ListView;
-import android.widget.TextView;
-
-import org.sufficientlysecure.keychain.Constants;
-import org.sufficientlysecure.keychain.R;
-
-public abstract class DrawerActivity extends BaseActivity {
- private FixedDrawerLayout mDrawerLayout;
- private ListView mDrawerList;
- private ActionBarDrawerToggle mDrawerToggle;
-
- private CharSequence mDrawerTitle;
- private CharSequence mTitle;
- private boolean mIsDrawerLocked = false;
-
- private Class mSelectedItem;
-
- private static final int MENU_ID_PREFERENCE = 222;
- private static final int MENU_ID_HELP = 223;
-
- protected void deactivateDrawerNavigation() {
- ((DrawerLayout) findViewById(R.id.drawer_layout)).setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED);
- }
-
- protected void activateDrawerNavigation(Bundle savedInstanceState) {
- mDrawerTitle = getString(R.string.app_name);
- mDrawerLayout = (FixedDrawerLayout) findViewById(R.id.drawer_layout);
- mDrawerList = (ListView) findViewById(R.id.left_drawer);
- ViewGroup viewGroup = (ViewGroup) findViewById(R.id.content_frame);
- int leftMarginLoaded = ((ViewGroup.MarginLayoutParams) viewGroup.getLayoutParams()).leftMargin;
- int leftMarginInTablets = (int) getResources().getDimension(R.dimen.drawer_size);
- int errorInMarginAllowed = 5;
-
- // if the left margin of the loaded layout is close to the
- // one used in tablets then set drawer as open and locked
- if (Math.abs(leftMarginLoaded - leftMarginInTablets) < errorInMarginAllowed) {
- mDrawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_OPEN, mDrawerList);
- mDrawerLayout.setScrimColor(Color.TRANSPARENT);
- mIsDrawerLocked = true;
- } else {
- // set a custom shadow that overlays the main content when the drawer opens
- mDrawerLayout.setDrawerShadow(R.drawable.drawer_shadow, GravityCompat.START);
- mIsDrawerLocked = false;
- }
-
- NavItem mItemIconTexts[] = new NavItem[]{
- new NavItem(R.drawable.ic_action_accounts, getString(R.string.nav_keys)),
- new NavItem(R.drawable.ic_action_secure, getString(R.string.nav_encrypt_text)),
- new NavItem(R.drawable.ic_action_secure, getString(R.string.nav_encrypt_files)),
- new NavItem(R.drawable.ic_action_not_secure, getString(R.string.nav_decrypt)),
- new NavItem(R.drawable.ic_action_view_as_list, getString(R.string.nav_apps))};
-
- mDrawerList.setAdapter(new NavigationDrawerAdapter(this, R.layout.drawer_list_item,
- mItemIconTexts));
-
- mDrawerList.setOnItemClickListener(new DrawerItemClickListener());
-
- // enable ActionBar app icon to behave as action to toggle nav drawer
- // if the drawer is not locked
- if (!mIsDrawerLocked) {
- getSupportActionBar().setDisplayHomeAsUpEnabled(true);
- getSupportActionBar().setHomeButtonEnabled(true);
- }
-
- // ActionBarDrawerToggle ties together the the proper interactions
- // between the sliding drawer and the action bar app icon
- mDrawerToggle = new ActionBarDrawerToggle(this, /* host Activity */
- mDrawerLayout, /* DrawerLayout object */
- R.drawable.ic_drawer, /* nav drawer image to replace 'Up' caret */
- R.string.drawer_open, /* "open drawer" description for accessibility */
- R.string.drawer_close /* "close drawer" description for accessibility */
- ) {
- public void onDrawerClosed(View view) {
- getSupportActionBar().setTitle(mTitle);
-
- callIntentForDrawerItem(mSelectedItem);
- }
-
- public void onDrawerOpened(View drawerView) {
- mTitle = getSupportActionBar().getTitle();
- getSupportActionBar().setTitle(mDrawerTitle);
- // creates call to onPrepareOptionsMenu()
- supportInvalidateOptionsMenu();
- }
- };
-
- if (!mIsDrawerLocked) {
- mDrawerLayout.setDrawerListener(mDrawerToggle);
- } else {
- // If the drawer is locked open make it un-focusable
- // so that it doesn't consume all the Back button presses
- mDrawerLayout.setFocusableInTouchMode(false);
- }
- }
-
- /**
- * Uses startActivity to call the Intent of the given class
- *
- * @param drawerItem the class of the drawer item you want to load. Based on Constants.DrawerItems.*
- */
- public void callIntentForDrawerItem(Class drawerItem) {
- // creates call to onPrepareOptionsMenu()
- supportInvalidateOptionsMenu();
-
- // call intent activity if selected
- if (drawerItem != null) {
- finish();
- overridePendingTransition(0, 0);
-
- Intent intent = new Intent(this, drawerItem);
- startActivity(intent);
-
- // disable animation of activity start
- overridePendingTransition(0, 0);
- }
- }
-
- @Override
- public boolean onCreateOptionsMenu(Menu menu) {
- if (mDrawerToggle == null) {
- return super.onCreateOptionsMenu(menu);
- }
-
- menu.add(42, MENU_ID_PREFERENCE, 100, R.string.menu_preferences);
- menu.add(42, MENU_ID_HELP, 101, R.string.menu_help);
-
- return super.onCreateOptionsMenu(menu);
- }
-
- @Override
- public boolean onOptionsItemSelected(MenuItem item) {
- if (mDrawerToggle == null) {
- return super.onOptionsItemSelected(item);
- }
-
- // The action bar home/up action should open or close the drawer.
- // ActionBarDrawerToggle will take care of this.
- if (mDrawerToggle.onOptionsItemSelected(item)) {
- return true;
- }
-
- switch (item.getItemId()) {
- case MENU_ID_PREFERENCE: {
- Intent intent = new Intent(this, SettingsActivity.class);
- startActivity(intent);
- return true;
- }
- case MENU_ID_HELP: {
- Intent intent = new Intent(this, HelpActivity.class);
- startActivity(intent);
- return true;
- }
- default:
- return super.onOptionsItemSelected(item);
- }
- }
-
- /**
- * The click listener for ListView in the navigation drawer
- */
- private class DrawerItemClickListener implements ListView.OnItemClickListener {
- @Override
- public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
- selectItem(position);
- }
- }
-
- private void selectItem(int position) {
- // update selected item and title, then close the drawer
- mDrawerList.setItemChecked(position, true);
- // set selected class
- mSelectedItem = Constants.DrawerItems.ARRAY[position];
-
- // setTitle(mDrawerTitles[position]);
- // If drawer isn't locked just close the drawer and
- // it will move to the selected item by itself (via drawer toggle listener)
- if (!mIsDrawerLocked) {
- mDrawerLayout.closeDrawer(mDrawerList);
- // else move to the selected item yourself
- } else {
- callIntentForDrawerItem(mSelectedItem);
- }
- }
-
- /**
- * When using the ActionBarDrawerToggle, you must call it during onPostCreate() and
- * onConfigurationChanged()...
- */
- @Override
- protected void onPostCreate(Bundle savedInstanceState) {
- super.onPostCreate(savedInstanceState);
- // Sync the toggle state after onRestoreInstanceState has occurred.
- if (mDrawerToggle != null) {
- mDrawerToggle.syncState();
- }
- }
-
- @Override
- public void onConfigurationChanged(Configuration newConfig) {
- super.onConfigurationChanged(newConfig);
- // Pass any configuration change to the drawer toggles
- if (mDrawerToggle != null) {
- mDrawerToggle.onConfigurationChanged(newConfig);
- }
- }
-
- private class NavItem {
- public int icon; // res-id
- public String title;
-
- /**
- * NavItem constructor
- *
- * @param icon The icons resource-id
- * @param title The title of the menu entry
- */
- public NavItem(int icon, String title) {
- super();
- this.icon = icon;
- this.title = title;
- }
- }
-
- private class NavigationDrawerAdapter extends ArrayAdapter<NavItem> {
- Context mContext;
- int mLayoutResourceId;
- NavItem mData[] = null;
-
- public NavigationDrawerAdapter(Context context, int layoutResourceId, NavItem[] data) {
- super(context, layoutResourceId, data);
- this.mLayoutResourceId = layoutResourceId;
- this.mContext = context;
- this.mData = data;
- }
-
- @Override
- public View getView(int position, View convertView, ViewGroup parent) {
- View row = convertView;
- NavItemHolder holder;
-
- if (row == null) {
- LayoutInflater inflater = ((Activity) mContext).getLayoutInflater();
- row = inflater.inflate(mLayoutResourceId, parent, false);
-
- holder = new NavItemHolder();
- holder.mImg = (ImageView) row.findViewById(R.id.drawer_item_icon);
- holder.mTxtTitle = (TextView) row.findViewById(R.id.drawer_item_text);
-
- row.setTag(holder);
- } else {
- holder = (NavItemHolder) row.getTag();
- }
-
- NavItem item = mData[position];
- holder.mTxtTitle.setText(item.title);
- holder.mImg.setImageResource(item.icon);
-
- return row;
- }
-
- }
-
- static class NavItemHolder {
- ImageView mImg;
- TextView mTxtTitle;
- }
-
-}
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/KeyListFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/KeyListFragment.java
index 4e5e8c631..8abb381f8 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/KeyListFragment.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/KeyListFragment.java
@@ -110,7 +110,6 @@ public class KeyListFragment extends LoaderFragment
super.onCreate(savedInstanceState);
mExportHelper = new ExportHelper(getActivity());
-
}
/**
@@ -205,84 +204,82 @@ public class KeyListFragment extends LoaderFragment
mStickyList.setFastScrollEnabled(true);
/*
- * Multi-selection is only available for Android >= 3.0
+ * Multi-selection
*/
- if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
- mStickyList.setFastScrollAlwaysVisible(true);
+ mStickyList.setFastScrollAlwaysVisible(true);
- mStickyList.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE_MODAL);
- mStickyList.getWrappedList().setMultiChoiceModeListener(new MultiChoiceModeListener() {
+ mStickyList.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE_MODAL);
+ mStickyList.getWrappedList().setMultiChoiceModeListener(new MultiChoiceModeListener() {
- @Override
- public boolean onCreateActionMode(ActionMode mode, Menu menu) {
- android.view.MenuInflater inflater = getActivity().getMenuInflater();
- inflater.inflate(R.menu.key_list_multi, menu);
- mActionMode = mode;
- return true;
- }
+ @Override
+ public boolean onCreateActionMode(ActionMode mode, Menu menu) {
+ android.view.MenuInflater inflater = getActivity().getMenuInflater();
+ inflater.inflate(R.menu.key_list_multi, menu);
+ mActionMode = mode;
+ return true;
+ }
- @Override
- public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
- return false;
- }
+ @Override
+ public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
+ return false;
+ }
- @Override
- public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
+ @Override
+ public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
- // get IDs for checked positions as long array
- long[] ids;
+ // get IDs for checked positions as long array
+ long[] ids;
- switch (item.getItemId()) {
- case R.id.menu_key_list_multi_encrypt: {
- ids = mAdapter.getCurrentSelectedMasterKeyIds();
- encrypt(mode, ids);
- break;
- }
- case R.id.menu_key_list_multi_delete: {
- ids = mAdapter.getCurrentSelectedMasterKeyIds();
- showDeleteKeyDialog(mode, ids, mAdapter.isAnySecretSelected());
- break;
- }
- case R.id.menu_key_list_multi_export: {
- ids = mAdapter.getCurrentSelectedMasterKeyIds();
- ExportHelper mExportHelper = new ExportHelper((ActionBarActivity) getActivity());
- mExportHelper.showExportKeysDialog(ids, Constants.Path.APP_DIR_FILE,
- mAdapter.isAnySecretSelected());
- break;
- }
- case R.id.menu_key_list_multi_select_all: {
- // select all
- for (int i = 0; i < mStickyList.getCount(); i++) {
- mStickyList.setItemChecked(i, true);
- }
- break;
+ switch (item.getItemId()) {
+ case R.id.menu_key_list_multi_encrypt: {
+ ids = mAdapter.getCurrentSelectedMasterKeyIds();
+ encrypt(mode, ids);
+ break;
+ }
+ case R.id.menu_key_list_multi_delete: {
+ ids = mAdapter.getCurrentSelectedMasterKeyIds();
+ showDeleteKeyDialog(mode, ids, mAdapter.isAnySecretSelected());
+ break;
+ }
+ case R.id.menu_key_list_multi_export: {
+ ids = mAdapter.getCurrentSelectedMasterKeyIds();
+ ExportHelper mExportHelper = new ExportHelper((ActionBarActivity) getActivity());
+ mExportHelper.showExportKeysDialog(ids, Constants.Path.APP_DIR_FILE,
+ mAdapter.isAnySecretSelected());
+ break;
+ }
+ case R.id.menu_key_list_multi_select_all: {
+ // select all
+ for (int i = 0; i < mStickyList.getCount(); i++) {
+ mStickyList.setItemChecked(i, true);
}
+ break;
}
- return true;
}
+ return true;
+ }
- @Override
- public void onDestroyActionMode(ActionMode mode) {
- mActionMode = null;
- mAdapter.clearSelection();
- }
+ @Override
+ public void onDestroyActionMode(ActionMode mode) {
+ mActionMode = null;
+ mAdapter.clearSelection();
+ }
- @Override
- public void onItemCheckedStateChanged(ActionMode mode, int position, long id,
- boolean checked) {
- if (checked) {
- mAdapter.setNewSelection(position, checked);
- } else {
- mAdapter.removeSelection(position);
- }
- int count = mStickyList.getCheckedItemCount();
- String keysSelected = getResources().getQuantityString(
- R.plurals.key_list_selected_keys, count, count);
- mode.setTitle(keysSelected);
+ @Override
+ public void onItemCheckedStateChanged(ActionMode mode, int position, long id,
+ boolean checked) {
+ if (checked) {
+ mAdapter.setNewSelection(position, checked);
+ } else {
+ mAdapter.removeSelection(position);
}
+ int count = mStickyList.getCheckedItemCount();
+ String keysSelected = getResources().getQuantityString(
+ R.plurals.key_list_selected_keys, count, count);
+ mode.setTitle(keysSelected);
+ }
- });
- }
+ });
// We have a menu item to show in action bar.
setHasOptionsMenu(true);
@@ -369,9 +366,7 @@ public class KeyListFragment extends LoaderFragment
// end action mode, if any
if (mActionMode != null) {
- if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
- mActionMode.finish();
- }
+ mActionMode.finish();
}
// The list should now be shown.
@@ -401,7 +396,6 @@ public class KeyListFragment extends LoaderFragment
startActivity(viewIntent);
}
- @TargetApi(Build.VERSION_CODES.HONEYCOMB)
protected void encrypt(ActionMode mode, long[] masterKeyIds) {
Intent intent = new Intent(getActivity(), EncryptFilesActivity.class);
intent.setAction(EncryptFilesActivity.ACTION_ENCRYPT_DATA);
@@ -418,7 +412,6 @@ public class KeyListFragment extends LoaderFragment
* @param masterKeyIds
* @param hasSecret must contain whether the list of masterKeyIds contains a secret key or not
*/
- @TargetApi(Build.VERSION_CODES.HONEYCOMB)
public void showDeleteKeyDialog(final ActionMode mode, long[] masterKeyIds, boolean hasSecret) {
// Can only work on singular secret keys
if (hasSecret && masterKeyIds.length > 1) {
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/NavDrawerActivity.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/NavDrawerActivity.java
index 57910af5e..bc9c36a2e 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/NavDrawerActivity.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/NavDrawerActivity.java
@@ -38,15 +38,14 @@ public abstract class NavDrawerActivity extends MaterialNavigationDrawer {
// set the header image
// create and set the header
- View view = LayoutInflater.from(this).inflate(R.layout.custom_drawer, null);
- setDrawerHeaderCustom(view);
+ setDrawerHeaderImage(R.drawable.drawer_header);
// create sections
addSection(newSection(getString(R.string.title_keys), R.drawable.ic_vpn_key_black_24dp, new KeyListFragment()));
addSection(newSection(getString(R.string.title_encrypt_text), R.drawable.ic_lock_outline_black_24dp, new Intent(this, EncryptTextActivity.class)));
addSection(newSection(getString(R.string.title_encrypt_files), R.drawable.ic_lock_outline_black_24dp, new Intent(this, EncryptFilesActivity.class)));
- addSection(newSection(getString(R.string.title_decrypt), R.drawable.ic_lock_open_black_24dp, new Intent(this, DecryptActivity.class)));
+ addSection(newSection(getString(R.string.title_decrypt), R.drawable.ic_lock_open_black_24dp, new DecryptOverviewFragment()));
addSection(newSection(getString(R.string.title_api_registered_apps), R.drawable.ic_apps_black_24dp, new AppsListFragment()));
// create bottom section
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/SelectPublicKeyActivity.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/SelectPublicKeyActivity.java
deleted file mode 100644
index 0e3374833..000000000
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/SelectPublicKeyActivity.java
+++ /dev/null
@@ -1,144 +0,0 @@
-/*
- * Copyright (C) 2012-2014 Dominik Schürmann <dominik@dominikschuermann.de>
- * Copyright (C) 2010-2014 Thialfihar <thi@thialfihar.org>
- *
- * 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/>.
- */
-
-package org.sufficientlysecure.keychain.ui;
-
-import android.content.Intent;
-import android.os.Bundle;
-import android.view.View;
-
-import org.sufficientlysecure.keychain.Constants;
-import org.sufficientlysecure.keychain.R;
-
-public class SelectPublicKeyActivity extends BaseActivity {
-
- // Actions for internal use only:
- public static final String ACTION_SELECT_PUBLIC_KEYS = Constants.INTENT_PREFIX
- + "SELECT_PUBLIC_KEYRINGS";
-
- public static final String EXTRA_SELECTED_MASTER_KEY_IDS = "master_key_ids";
-
- public static final String RESULT_EXTRA_MASTER_KEY_IDS = "master_key_ids";
- public static final String RESULT_EXTRA_USER_IDS = "user_ids";
-
- SelectPublicKeyFragment mSelectFragment;
-
- long mSelectedMasterKeyIds[];
-
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
-
- // Inflate a "Done"/"Cancel" custom action bar view
- setFullScreenDialogDoneClose(R.string.btn_okay,
- new View.OnClickListener() {
- @Override
- public void onClick(View v) {
- okClicked();
- }
- },
- new View.OnClickListener() {
- @Override
- public void onClick(View v) {
- cancelClicked();
- }
- });
-
- setDefaultKeyMode(DEFAULT_KEYS_SEARCH_LOCAL);
-
- handleIntent(getIntent());
-
- // Check that the activity is using the layout version with
- // the fragment_container FrameLayout
- if (findViewById(R.id.select_public_key_fragment_container) != null) {
-
- // However, if we're being restored from a previous state,
- // then we don't need to do anything and should return or else
- // we could end up with overlapping fragments.
- if (savedInstanceState != null) {
- return;
- }
-
- // Create an instance of the fragment
- mSelectFragment = SelectPublicKeyFragment.newInstance(mSelectedMasterKeyIds);
-
- // Add the fragment to the 'fragment_container' FrameLayout
- getSupportFragmentManager().beginTransaction()
- .add(R.id.select_public_key_fragment_container, mSelectFragment).commit();
- }
-
- // TODO: reimplement!
- // mFilterLayout = findViewById(R.id.layout_filter);
- // mFilterInfo = (TextView) mFilterLayout.findViewById(R.id.filterInfo);
- // mClearFilterButton = (Button) mFilterLayout.findViewById(R.id.btn_clear);
- //
- // mClearFilterButton.setOnClickListener(new OnClickListener() {
- // public void onClick(View v) {
- // handleIntent(new Intent());
- // }
- // });
-
- }
-
- @Override
- protected void initLayout() {
- setContentView(R.layout.select_public_key_activity);
- }
-
- @Override
- protected void onNewIntent(Intent intent) {
- super.onNewIntent(intent);
- handleIntent(intent);
- }
-
- private void handleIntent(Intent intent) {
- // TODO: reimplement search!
-
- // String searchString = null;
- // if (Intent.ACTION_SEARCH.equals(intent.getAction())) {
- // searchString = intent.getStringExtra(SearchManager.QUERY);
- // if (searchString != null && searchString.trim().length() == 0) {
- // searchString = null;
- // }
- // }
-
- // if (searchString == null) {
- // mFilterLayout.setVisibility(View.GONE);
- // } else {
- // mFilterLayout.setVisibility(View.VISIBLE);
- // mFilterInfo.setText(getString(R.string.filterInfo, searchString));
- // }
-
- // preselected master keys
- mSelectedMasterKeyIds = intent.getLongArrayExtra(EXTRA_SELECTED_MASTER_KEY_IDS);
- }
-
- private void cancelClicked() {
- setResult(RESULT_CANCELED, null);
- finish();
- }
-
- private void okClicked() {
- Intent data = new Intent();
- data.putExtra(RESULT_EXTRA_MASTER_KEY_IDS, mSelectFragment.getSelectedMasterKeyIds());
- data.putExtra(RESULT_EXTRA_USER_IDS, mSelectFragment.getSelectedUserIds());
- setResult(RESULT_OK, data);
- finish();
- }
-
-}
diff --git a/OpenKeychain/src/main/res/drawable/drawer_header.png b/OpenKeychain/src/main/res/drawable/drawer_header.png
new file mode 100644
index 000000000..614098bd7
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable/drawer_header.png
Binary files differ
diff --git a/OpenKeychain/src/main/res/layout-large/decrypt_activity.xml b/OpenKeychain/src/main/res/layout-large/decrypt_activity.xml
deleted file mode 100644
index 06487a982..000000000
--- a/OpenKeychain/src/main/res/layout-large/decrypt_activity.xml
+++ /dev/null
@@ -1,18 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:orientation="horizontal"
- android:layout_width="match_parent"
- android:layout_height="match_parent">
-
- <android.support.v4.widget.FixedDrawerLayout
- android:id="@+id/drawer_layout"
- android:layout_width="match_parent"
- android:layout_height="match_parent">
-
- <include layout="@layout/drawer_list" />
-
- </android.support.v4.widget.FixedDrawerLayout>
-
- <include layout="@layout/decrypt_content" />
-
-</FrameLayout> \ No newline at end of file
diff --git a/OpenKeychain/src/main/res/layout-large/encrypt_files_activity.xml b/OpenKeychain/src/main/res/layout-large/encrypt_files_activity.xml
deleted file mode 100644
index 4b277c331..000000000
--- a/OpenKeychain/src/main/res/layout-large/encrypt_files_activity.xml
+++ /dev/null
@@ -1,17 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:orientation="horizontal"
- android:layout_width="match_parent"
- android:layout_height="match_parent">
-
- <android.support.v4.widget.FixedDrawerLayout
- android:id="@+id/drawer_layout"
- android:layout_width="match_parent"
- android:layout_height="match_parent">
-
- <include layout="@layout/drawer_list" />
-
- </android.support.v4.widget.FixedDrawerLayout>
-
- <include layout="@layout/encrypt_files_content" />
-</FrameLayout> \ No newline at end of file
diff --git a/OpenKeychain/src/main/res/layout-large/encrypt_text_activity.xml b/OpenKeychain/src/main/res/layout-large/encrypt_text_activity.xml
deleted file mode 100644
index 5cf838c46..000000000
--- a/OpenKeychain/src/main/res/layout-large/encrypt_text_activity.xml
+++ /dev/null
@@ -1,17 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:orientation="horizontal"
- android:layout_width="match_parent"
- android:layout_height="match_parent">
-
- <android.support.v4.widget.FixedDrawerLayout
- android:id="@+id/drawer_layout"
- android:layout_width="match_parent"
- android:layout_height="match_parent">
-
- <include layout="@layout/drawer_list" />
-
- </android.support.v4.widget.FixedDrawerLayout>
-
- <include layout="@layout/encrypt_text_content" />
-</FrameLayout> \ No newline at end of file
diff --git a/OpenKeychain/src/main/res/layout-large/key_list_activity.xml b/OpenKeychain/src/main/res/layout-large/key_list_activity.xml
deleted file mode 100644
index 039081cd7..000000000
--- a/OpenKeychain/src/main/res/layout-large/key_list_activity.xml
+++ /dev/null
@@ -1,18 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:orientation="horizontal"
- android:layout_width="match_parent"
- android:layout_height="match_parent">
-
- <android.support.v4.widget.FixedDrawerLayout
- android:id="@+id/drawer_layout"
- android:layout_width="match_parent"
- android:layout_height="match_parent">
-
- <include layout="@layout/drawer_list" />
-
- </android.support.v4.widget.FixedDrawerLayout>
-
- <include layout="@layout/key_list_content" />
-
-</FrameLayout> \ No newline at end of file
diff --git a/OpenKeychain/src/main/res/layout/api_app_settings_activity.xml b/OpenKeychain/src/main/res/layout/api_app_settings_activity.xml
index 800e2eb87..3da0d4e7d 100644
--- a/OpenKeychain/src/main/res/layout/api_app_settings_activity.xml
+++ b/OpenKeychain/src/main/res/layout/api_app_settings_activity.xml
@@ -28,7 +28,7 @@
<fragment
android:id="@+id/api_app_settings_fragment"
- android:name="org.sufficientlysecure.keychain.remote.ui.AppSettingsFragment"
+ android:name="org.sufficientlysecure.keychain.remote.ui.AppSettingsHeaderFragment"
android:layout_width="match_parent"
android:layout_height="wrap_content"
tools:layout="@layout/api_app_settings_fragment" />
@@ -37,6 +37,18 @@
style="@style/SectionHeader"
android:layout_width="match_parent"
android:layout_height="wrap_content"
+ android:text="@string/api_settings_allowed_keys" />
+
+ <FrameLayout
+ android:id="@+id/api_allowed_keys_list_fragment"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:orientation="vertical" />
+
+ <TextView
+ style="@style/SectionHeader"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
android:text="@string/api_settings_accounts" />
<FrameLayout
diff --git a/OpenKeychain/src/main/res/layout/api_apps_adapter_list_item.xml b/OpenKeychain/src/main/res/layout/api_apps_adapter_list_item.xml
index b67da13a6..c4ea46d43 100644
--- a/OpenKeychain/src/main/res/layout/api_apps_adapter_list_item.xml
+++ b/OpenKeychain/src/main/res/layout/api_apps_adapter_list_item.xml
@@ -13,16 +13,6 @@
android:layout_centerVertical="true"
android:src="@drawable/ic_launcher" />
- <TextView
- android:id="@+id/api_apps_adapter_item_name"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_marginLeft="8dp"
- android:text="Application Name"
- android:textAppearance="?android:attr/textAppearanceMedium"
- android:layout_centerVertical="true"
- android:layout_toRightOf="@+id/api_apps_adapter_item_icon" />
-
<ImageView
android:id="@+id/api_apps_adapter_install_icon"
android:layout_width="wrap_content"
@@ -33,5 +23,15 @@
android:layout_alignParentEnd="true"
android:padding="8dp" />
+ <TextView
+ android:id="@+id/api_apps_adapter_item_name"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_marginLeft="8dp"
+ android:text="Application Name"
+ android:textAppearance="?android:attr/textAppearanceMedium"
+ android:layout_centerVertical="true"
+ android:layout_toLeftOf="@+id/api_apps_adapter_install_icon"
+ android:layout_toRightOf="@+id/api_apps_adapter_item_icon" />
</RelativeLayout> \ No newline at end of file
diff --git a/OpenKeychain/src/main/res/layout/api_remote_register_app.xml b/OpenKeychain/src/main/res/layout/api_remote_register_app.xml
index 19981f59e..300fde420 100644
--- a/OpenKeychain/src/main/res/layout/api_remote_register_app.xml
+++ b/OpenKeychain/src/main/res/layout/api_remote_register_app.xml
@@ -30,7 +30,7 @@
<fragment
android:id="@+id/api_app_settings_fragment"
- android:name="org.sufficientlysecure.keychain.remote.ui.AppSettingsFragment"
+ android:name="org.sufficientlysecure.keychain.remote.ui.AppSettingsHeaderFragment"
android:layout_width="match_parent"
android:layout_height="wrap_content"
tools:layout="@layout/api_app_settings_fragment" />
diff --git a/OpenKeychain/src/main/res/layout/decrypt_activity.xml b/OpenKeychain/src/main/res/layout/decrypt_activity.xml
deleted file mode 100644
index bb0e463b3..000000000
--- a/OpenKeychain/src/main/res/layout/decrypt_activity.xml
+++ /dev/null
@@ -1,11 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<android.support.v4.widget.FixedDrawerLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:id="@+id/drawer_layout"
- android:layout_width="match_parent"
- android:layout_height="match_parent">
-
- <include layout="@layout/decrypt_content"/>
-
- <include layout="@layout/drawer_list" />
-
-</android.support.v4.widget.FixedDrawerLayout>
diff --git a/OpenKeychain/src/main/res/layout/decrypt_content.xml b/OpenKeychain/src/main/res/layout/decrypt_content.xml
deleted file mode 100644
index 8944c821f..000000000
--- a/OpenKeychain/src/main/res/layout/decrypt_content.xml
+++ /dev/null
@@ -1,117 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="match_parent"
- android:layout_height="match_parent">
-
- <include
- android:id="@+id/toolbar"
- layout="@layout/toolbar" />
-
- <LinearLayout
- android:layout_below="@id/toolbar"
- android:id="@+id/content_frame"
- android:layout_marginLeft="@dimen/drawer_content_padding"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:orientation="vertical">
-
- <include layout="@layout/notify_area" />
-
- <LinearLayout
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:paddingTop="4dp"
- android:paddingLeft="16dp"
- android:paddingRight="16dp"
- android:orientation="vertical">
-
- <TextView
- style="@style/SectionHeader"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:layout_marginTop="16dp"
- android:text="@string/section_decrypt_files" />
-
-
- <TextView
- android:id="@+id/decrypt_files"
- android:paddingLeft="8dp"
- android:paddingRight="8dp"
- android:textAppearance="?android:attr/textAppearanceMedium"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:minHeight="?android:attr/listPreferredItemHeight"
- android:clickable="true"
- style="@style/SelectableItem"
- android:text="@string/btn_decrypt_files"
- android:drawableRight="@drawable/ic_action_collection"
- android:drawablePadding="8dp"
- android:gravity="center_vertical" />
-
- <View
- android:layout_width="match_parent"
- android:layout_height="1dip"
- android:background="?android:attr/listDivider"
- android:layout_marginBottom="8dp" />
-
- <TextView
- style="@style/SectionHeader"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:layout_marginTop="32dp"
- android:text="@string/section_decrypt_text" />
-
- <LinearLayout
- android:id="@+id/decrypt_from_clipboard"
- android:layout_width="match_parent"
- android:layout_height="?android:attr/listPreferredItemHeight"
- android:clickable="true"
- android:paddingRight="4dp"
- style="@style/SelectableItem"
- android:orientation="horizontal">
-
- <LinearLayout
- android:layout_width="0dp"
- android:layout_height="match_parent"
- android:layout_weight="1"
- android:paddingRight="4dp"
- android:gravity="center_vertical"
- android:orientation="vertical">
-
- <TextView
- android:paddingLeft="8dp"
- android:textAppearance="?android:attr/textAppearanceMedium"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:text="@string/btn_decrypt_clipboard" />
-
- <TextView
- android:paddingLeft="8dp"
- android:textAppearance="?android:attr/textAppearanceSmall"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:textColor="@color/tertiary_text_light"
- android:text="@string/btn_decrypt_and_verify"
- android:gravity="center_vertical" />
-
- </LinearLayout>
-
- <ImageView
- android:id="@+id/clipboard_icon"
- android:layout_width="wrap_content"
- android:layout_height="match_parent"
- android:padding="8dp"
- android:src="@drawable/ic_action_paste"
- android:layout_gravity="center_vertical" />
-
- </LinearLayout>
-
- <View
- android:layout_width="match_parent"
- android:layout_height="1dip"
- android:background="?android:attr/listDivider"
- android:layout_marginBottom="8dp" />
-
- </LinearLayout>
- </LinearLayout>
-</RelativeLayout> \ No newline at end of file
diff --git a/OpenKeychain/src/main/res/layout/decrypt_overview_fragment.xml b/OpenKeychain/src/main/res/layout/decrypt_overview_fragment.xml
new file mode 100644
index 000000000..c3e31bf11
--- /dev/null
+++ b/OpenKeychain/src/main/res/layout/decrypt_overview_fragment.xml
@@ -0,0 +1,96 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:paddingTop="4dp"
+ android:paddingLeft="16dp"
+ android:paddingRight="16dp"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:orientation="vertical">
+
+ <TextView
+ style="@style/SectionHeader"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_marginTop="16dp"
+ android:text="@string/section_decrypt_files" />
+
+ <TextView
+ android:id="@+id/decrypt_files"
+ android:paddingLeft="8dp"
+ android:paddingRight="8dp"
+ android:textAppearance="?android:attr/textAppearanceMedium"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:minHeight="?android:attr/listPreferredItemHeight"
+ android:clickable="true"
+ style="@style/SelectableItem"
+ android:text="@string/btn_decrypt_files"
+ android:drawableRight="@drawable/ic_action_collection"
+ android:drawablePadding="8dp"
+ android:gravity="center_vertical" />
+
+ <View
+ android:layout_width="match_parent"
+ android:layout_height="1dip"
+ android:background="?android:attr/listDivider"
+ android:layout_marginBottom="8dp" />
+
+ <TextView
+ style="@style/SectionHeader"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_marginTop="32dp"
+ android:text="@string/section_decrypt_text" />
+
+ <LinearLayout
+ android:id="@+id/decrypt_from_clipboard"
+ android:layout_width="match_parent"
+ android:layout_height="?android:attr/listPreferredItemHeight"
+ android:clickable="true"
+ android:paddingRight="4dp"
+ style="@style/SelectableItem"
+ android:orientation="horizontal">
+
+ <LinearLayout
+ android:layout_width="0dp"
+ android:layout_height="match_parent"
+ android:layout_weight="1"
+ android:paddingRight="4dp"
+ android:gravity="center_vertical"
+ android:orientation="vertical">
+
+ <TextView
+ android:paddingLeft="8dp"
+ android:textAppearance="?android:attr/textAppearanceMedium"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:text="@string/btn_decrypt_clipboard" />
+
+ <TextView
+ android:paddingLeft="8dp"
+ android:textAppearance="?android:attr/textAppearanceSmall"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:textColor="@color/tertiary_text_light"
+ android:text="@string/btn_decrypt_and_verify"
+ android:gravity="center_vertical" />
+
+ </LinearLayout>
+
+ <ImageView
+ android:id="@+id/clipboard_icon"
+ android:layout_width="wrap_content"
+ android:layout_height="match_parent"
+ android:padding="8dp"
+ android:src="@drawable/ic_action_paste"
+ android:layout_gravity="center_vertical" />
+
+ </LinearLayout>
+
+ <View
+ android:layout_width="match_parent"
+ android:layout_height="1dip"
+ android:background="?android:attr/listDivider"
+ android:layout_marginBottom="8dp" />
+
+</LinearLayout> \ No newline at end of file
diff --git a/OpenKeychain/src/main/res/layout/custom_drawer.xml b/OpenKeychain/src/main/res/layout/drawer_custom_header.xml
index 021226ba3..021226ba3 100644
--- a/OpenKeychain/src/main/res/layout/custom_drawer.xml
+++ b/OpenKeychain/src/main/res/layout/drawer_custom_header.xml
diff --git a/OpenKeychain/src/main/res/layout/drawer_list.xml b/OpenKeychain/src/main/res/layout/drawer_list.xml
deleted file mode 100644
index ab00c0073..000000000
--- a/OpenKeychain/src/main/res/layout/drawer_list.xml
+++ /dev/null
@@ -1,18 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
- android:layout_gravity="start" tells DrawerLayout to treat
- this as a sliding drawer on the left side for left-to-right
- languages and on the right side for right-to-left languages.
- The drawer is given a fixed width in dp and extends the full height of
- the container. A solid background is used for contrast
- with the content view.
--->
-<ListView xmlns:android="http://schemas.android.com/apk/res/android"
- android:id="@+id/left_drawer"
- android:layout_width="@dimen/drawer_size"
- android:layout_height="match_parent"
- android:layout_gravity="start"
- android:background="@color/white"
- android:choiceMode="singleChoice"
- android:divider="@color/bg_gray"
- android:dividerHeight="1dp" />
diff --git a/OpenKeychain/src/main/res/layout/drawer_list_item.xml b/OpenKeychain/src/main/res/layout/drawer_list_item.xml
deleted file mode 100644
index 4719483da..000000000
--- a/OpenKeychain/src/main/res/layout/drawer_list_item.xml
+++ /dev/null
@@ -1,31 +0,0 @@
-<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:fontawesometext="http://schemas.android.com/apk/res-auto"
- android:layout_width="match_parent"
- android:layout_height="wrap_content">
-
- <ImageView
- android:id="@+id/drawer_item_icon"
- android:gravity="center_vertical"
- android:layout_width="30dp"
- android:layout_height="wrap_content"
- android:layout_marginLeft="8dp"
- android:layout_alignParentStart="true"
- android:layout_alignParentLeft="true"
- android:layout_centerVertical="true" />
-
- <TextView
- android:id="@+id/drawer_item_text"
- android:text="Test"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:gravity="center_vertical"
- android:layout_marginLeft="8dp"
- android:paddingBottom="16dp"
- android:paddingRight="16dp"
- android:paddingTop="16dp"
- android:textAppearance="@android:style/TextAppearance.Medium"
- android:textColor="#111"
- android:layout_alignParentTop="true"
- android:layout_toRightOf="@id/drawer_item_icon"/>
-
-</RelativeLayout>
diff --git a/OpenKeychain/src/main/res/layout/encrypt_files_activity.xml b/OpenKeychain/src/main/res/layout/encrypt_files_activity.xml
index cdcf4fa43..401b1c36e 100644
--- a/OpenKeychain/src/main/res/layout/encrypt_files_activity.xml
+++ b/OpenKeychain/src/main/res/layout/encrypt_files_activity.xml
@@ -1,14 +1,32 @@
<?xml version="1.0" encoding="utf-8"?>
-<android.support.v4.widget.FixedDrawerLayout
- xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:tools="http://schemas.android.com/tools"
- android:id="@+id/drawer_layout"
+<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent">
+
+ <include
+ android:id="@+id/toolbar"
+ layout="@layout/toolbar" />
+
+ <LinearLayout
+ android:layout_below="@id/toolbar"
+ android:id="@+id/content_frame"
android:layout_width="match_parent"
android:layout_height="match_parent"
- tools:context=".ui.EncryptFileActivity">
+ android:orientation="vertical">
+
+ <include layout="@layout/notify_area" />
- <include layout="@layout/encrypt_files_content"/>
+ <FrameLayout
+ android:id="@+id/encrypt_pager_mode"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:orientation="vertical" />
- <include layout="@layout/drawer_list" />
+ <fragment
+ android:id="@+id/encrypt_file_fragment"
+ android:name="org.sufficientlysecure.keychain.ui.EncryptFilesFragment"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent" />
-</android.support.v4.widget.FixedDrawerLayout> \ No newline at end of file
+ </LinearLayout>
+</RelativeLayout> \ No newline at end of file
diff --git a/OpenKeychain/src/main/res/layout/encrypt_files_content.xml b/OpenKeychain/src/main/res/layout/encrypt_files_content.xml
deleted file mode 100644
index 61c7e69c9..000000000
--- a/OpenKeychain/src/main/res/layout/encrypt_files_content.xml
+++ /dev/null
@@ -1,33 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="match_parent"
- android:layout_height="match_parent">
-
- <include
- android:id="@+id/toolbar"
- layout="@layout/toolbar" />
-
- <LinearLayout
- android:layout_below="@id/toolbar"
- android:id="@+id/content_frame"
- android:layout_marginLeft="@dimen/drawer_content_padding"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:orientation="vertical">
-
- <include layout="@layout/notify_area" />
-
- <FrameLayout
- android:id="@+id/encrypt_pager_mode"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:orientation="vertical" />
-
- <fragment
- android:id="@+id/encrypt_file_fragment"
- android:name="org.sufficientlysecure.keychain.ui.EncryptFilesFragment"
- android:layout_width="match_parent"
- android:layout_height="match_parent" />
-
- </LinearLayout>
-</RelativeLayout> \ No newline at end of file
diff --git a/OpenKeychain/src/main/res/layout/encrypt_text_activity.xml b/OpenKeychain/src/main/res/layout/encrypt_text_activity.xml
index 5d5e16131..0459fa3d7 100644
--- a/OpenKeychain/src/main/res/layout/encrypt_text_activity.xml
+++ b/OpenKeychain/src/main/res/layout/encrypt_text_activity.xml
@@ -1,14 +1,32 @@
<?xml version="1.0" encoding="utf-8"?>
-<android.support.v4.widget.FixedDrawerLayout
- xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:tools="http://schemas.android.com/tools"
- android:id="@+id/drawer_layout"
+<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent">
+
+ <include
+ android:id="@+id/toolbar"
+ layout="@layout/toolbar" />
+
+ <LinearLayout
+ android:layout_below="@id/toolbar"
+ android:id="@+id/content_frame"
android:layout_width="match_parent"
android:layout_height="match_parent"
- tools:context=".ui.EncryptTextActivity">
+ android:orientation="vertical">
+
+ <include layout="@layout/notify_area" />
- <include layout="@layout/encrypt_text_content"/>
+ <FrameLayout
+ android:id="@+id/encrypt_pager_mode"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:orientation="vertical" />
- <include layout="@layout/drawer_list" />
+ <fragment
+ android:id="@+id/encrypt_text_fragment"
+ android:name="org.sufficientlysecure.keychain.ui.EncryptTextFragment"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent" />
-</android.support.v4.widget.FixedDrawerLayout> \ No newline at end of file
+ </LinearLayout>
+</RelativeLayout> \ No newline at end of file
diff --git a/OpenKeychain/src/main/res/layout/encrypt_text_content.xml b/OpenKeychain/src/main/res/layout/encrypt_text_content.xml
deleted file mode 100644
index 31ebef798..000000000
--- a/OpenKeychain/src/main/res/layout/encrypt_text_content.xml
+++ /dev/null
@@ -1,33 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="match_parent"
- android:layout_height="match_parent">
-
- <include
- android:id="@+id/toolbar"
- layout="@layout/toolbar" />
-
- <LinearLayout
- android:layout_below="@id/toolbar"
- android:id="@+id/content_frame"
- android:layout_marginLeft="@dimen/drawer_content_padding"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:orientation="vertical">
-
- <include layout="@layout/notify_area" />
-
- <FrameLayout
- android:id="@+id/encrypt_pager_mode"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:orientation="vertical" />
-
- <fragment
- android:id="@+id/encrypt_text_fragment"
- android:name="org.sufficientlysecure.keychain.ui.EncryptTextFragment"
- android:layout_width="match_parent"
- android:layout_height="match_parent" />
-
- </LinearLayout>
-</RelativeLayout> \ No newline at end of file
diff --git a/OpenKeychain/src/main/res/layout/key_list_activity.xml b/OpenKeychain/src/main/res/layout/key_list_activity.xml
deleted file mode 100644
index 03ef85381..000000000
--- a/OpenKeychain/src/main/res/layout/key_list_activity.xml
+++ /dev/null
@@ -1,11 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<android.support.v4.widget.FixedDrawerLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:id="@+id/drawer_layout"
- android:layout_width="match_parent"
- android:layout_height="match_parent">
-
- <include layout="@layout/key_list_content" />
-
- <include layout="@layout/drawer_list" />
-
-</android.support.v4.widget.FixedDrawerLayout> \ No newline at end of file
diff --git a/OpenKeychain/src/main/res/layout/key_list_content.xml b/OpenKeychain/src/main/res/layout/key_list_content.xml
index 7179793b5..293c45e1c 100644
--- a/OpenKeychain/src/main/res/layout/key_list_content.xml
+++ b/OpenKeychain/src/main/res/layout/key_list_content.xml
@@ -17,7 +17,6 @@
<LinearLayout
android:id="@+id/content_frame"
- android:layout_marginLeft="@dimen/drawer_content_padding"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
diff --git a/OpenKeychain/src/main/res/values-large/dimens.xml b/OpenKeychain/src/main/res/values-large/dimens.xml
index 192a4bb99..045e125f3 100644
--- a/OpenKeychain/src/main/res/values-large/dimens.xml
+++ b/OpenKeychain/src/main/res/values-large/dimens.xml
@@ -1,4 +1,3 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
- <dimen name="drawer_content_padding">240dp</dimen>
</resources>
diff --git a/OpenKeychain/src/main/res/values/colors.xml b/OpenKeychain/src/main/res/values/colors.xml
index 353e33058..fbbb89ed1 100644
--- a/OpenKeychain/src/main/res/values/colors.xml
+++ b/OpenKeychain/src/main/res/values/colors.xml
@@ -19,13 +19,12 @@
<color name="primary">#4CAF50</color>
<color name="primary_dark">#388E3C</color>
<color name="primary_light">#C8E6C9</color>
- <color name="accent">#536DFE</color>
+ <color name="accent">#00BCD4</color>
<color name="primary_text">#212121</color>
<color name="secondary_text">#727272</color>
<color name="icons">#FFFFFF</color>
<color name="divider">#B6B6B6</color>
-
<!-- set to text colors -->
<color name="emphasis">#212121</color>
<color name="emphasis_dark">#727272</color>
diff --git a/OpenKeychain/src/main/res/values/dimens.xml b/OpenKeychain/src/main/res/values/dimens.xml
index e1a7749f0..55344e519 100644
--- a/OpenKeychain/src/main/res/values/dimens.xml
+++ b/OpenKeychain/src/main/res/values/dimens.xml
@@ -1,5 +1,3 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
- <dimen name="drawer_size">240dp</dimen>
- <dimen name="drawer_content_padding">0dp</dimen>
</resources> \ No newline at end of file
diff --git a/OpenKeychain/src/main/res/values/strings.xml b/OpenKeychain/src/main/res/values/strings.xml
index 794de34f0..ea2e02e1c 100644
--- a/OpenKeychain/src/main/res/values/strings.xml
+++ b/OpenKeychain/src/main/res/values/strings.xml
@@ -489,6 +489,7 @@
<string name="api_settings_package_name">"Package Name"</string>
<string name="api_settings_package_signature">"SHA-256 of Package Signature"</string>
<string name="api_settings_accounts">"Accounts"</string>
+ <string name="api_settings_allowed_keys">"Allowed Keys"</string>
<string name="api_settings_settings">"Settings"</string>
<string name="api_settings_key">"Account key:"</string>
<string name="api_settings_accounts_empty">"No accounts attached to this app."</string>
diff --git a/OpenKeychain/src/main/res/values/themes.xml b/OpenKeychain/src/main/res/values/themes.xml
index 3b7d66963..075f538e6 100644
--- a/OpenKeychain/src/main/res/values/themes.xml
+++ b/OpenKeychain/src/main/res/values/themes.xml
@@ -3,18 +3,22 @@
<style name="KeychainTheme" parent="KeychainTheme.Base" />
- <style name="KeychainTheme.Base" parent="HoloKeychainTheme">
+ <!--<style name="KeychainTheme.Base" parent="HoloKeychainTheme">-->
+ <style name="KeychainTheme.Base" parent="Theme.AppCompat.Light.NoActionBar">
<item name="colorPrimary">@color/colorPrimary</item>
<item name="colorPrimaryDark">@color/colorPrimary</item>
+ <item name="colorAccent">@color/accent</item>
+
<item name="android:windowNoTitle">true</item>
<item name="windowActionBar">false</item>
<item name="searchViewStyle">@style/MySearchViewStyle</item>
- <item name="colorAccent">@color/accent</item>
<!-- Navigation Drawer library -->
- <item name="drawerType">@integer/DRAWERTYPE_CUSTOM</item>
+ <item name="drawerType">@integer/DRAWERTYPE_IMAGE</item>
+ <!-- dark action bar... -->
<item name="theme">@style/ThemeOverlay.AppCompat.Dark.ActionBar</item>
- <item name="popupTheme">@style/Base.V21.Theme.AppCompat.Light.Dialog</item>
+ <!-- ...but light popup menu (white background) -->
+ <item name="popupTheme">@style/ThemeOverlay.AppCompat.Light</item>
<item name="drawerColor">#fafafa</item>
<item name="singleAccount">false</item>
<item name="sectionStyle">@style/MaterialSectionTheme.Light</item>
diff --git a/extern/minidns b/extern/minidns
-Subproject f3a19080f15e220fbacab5045c1f15fd12513b3
+Subproject 969ffd2951fcaa07f46b441936a0c0fd4502daf
diff --git a/extern/openpgp-api-lib b/extern/openpgp-api-lib
-Subproject ee2eb274a42a05518f2bc26fa8af816dde271d6
+Subproject c866dc22bcfa004ec2c46bc86c08694e76d1058