[Yanel-commits] rev 34704 - in public/yanel/trunk/src/contributions/resources: . policymanager policymanager/src policymanager/src/build policymanager/src/java policymanager/src/java/org policymanager/src/java/org/wyona policymanager/src/java/org/wyona/yanel policymanager/src/java/org/wyona/yanel/impl policymanager/src/java/org/wyona/yanel/impl/resources policymanager/src/java/org/wyona/yanel/impl/resources/policymanager policymanager/yanel-htdocs policymanager/yanel-htdocs/doc policymanager/yanel-htdocs/icons policymanager/yanel-htdocs/icons/16x16 policymanager/yanel-htdocs/icons/22x22 policymanager/yanel-htdocs/icons/32x32 policymanager/yanel-htdocs/icons/scalable

simon at wyona.com simon at wyona.com
Thu Apr 3 09:03:38 CEST 2008


Author: simon
Date: 2008-04-03 09:03:37 +0200 (Thu, 03 Apr 2008)
New Revision: 34704

Added:
   public/yanel/trunk/src/contributions/resources/policymanager/
   public/yanel/trunk/src/contributions/resources/policymanager/build.xml
   public/yanel/trunk/src/contributions/resources/policymanager/resource.xml
   public/yanel/trunk/src/contributions/resources/policymanager/src/
   public/yanel/trunk/src/contributions/resources/policymanager/src/build/
   public/yanel/trunk/src/contributions/resources/policymanager/src/build/build.properties
   public/yanel/trunk/src/contributions/resources/policymanager/src/build/dependencies.xml
   public/yanel/trunk/src/contributions/resources/policymanager/src/java/
   public/yanel/trunk/src/contributions/resources/policymanager/src/java/org/
   public/yanel/trunk/src/contributions/resources/policymanager/src/java/org/wyona/
   public/yanel/trunk/src/contributions/resources/policymanager/src/java/org/wyona/yanel/
   public/yanel/trunk/src/contributions/resources/policymanager/src/java/org/wyona/yanel/impl/
   public/yanel/trunk/src/contributions/resources/policymanager/src/java/org/wyona/yanel/impl/resources/
   public/yanel/trunk/src/contributions/resources/policymanager/src/java/org/wyona/yanel/impl/resources/policymanager/
   public/yanel/trunk/src/contributions/resources/policymanager/src/java/org/wyona/yanel/impl/resources/policymanager/PolicyManagerResource.java
   public/yanel/trunk/src/contributions/resources/policymanager/src/java/org/wyona/yanel/impl/resources/policymanager/PolicyParser.java
   public/yanel/trunk/src/contributions/resources/policymanager/src/java/org/wyona/yanel/impl/resources/policymanager/PolicyViewer.java
   public/yanel/trunk/src/contributions/resources/policymanager/yanel-htdocs/
   public/yanel/trunk/src/contributions/resources/policymanager/yanel-htdocs/doc/
   public/yanel/trunk/src/contributions/resources/policymanager/yanel-htdocs/doc/index.html
   public/yanel/trunk/src/contributions/resources/policymanager/yanel-htdocs/icons/
   public/yanel/trunk/src/contributions/resources/policymanager/yanel-htdocs/icons/16x16/
   public/yanel/trunk/src/contributions/resources/policymanager/yanel-htdocs/icons/16x16/rt-icon.png
   public/yanel/trunk/src/contributions/resources/policymanager/yanel-htdocs/icons/22x22/
   public/yanel/trunk/src/contributions/resources/policymanager/yanel-htdocs/icons/22x22/rt-icon.png
   public/yanel/trunk/src/contributions/resources/policymanager/yanel-htdocs/icons/32x32/
   public/yanel/trunk/src/contributions/resources/policymanager/yanel-htdocs/icons/32x32/rt-icon.png
   public/yanel/trunk/src/contributions/resources/policymanager/yanel-htdocs/icons/scalable/
   public/yanel/trunk/src/contributions/resources/policymanager/yanel-htdocs/icons/scalable/rt-icon.svg
Log:
policymanager guiy as resource-type added

Added: public/yanel/trunk/src/contributions/resources/policymanager/build.xml
===================================================================
--- public/yanel/trunk/src/contributions/resources/policymanager/build.xml	                        (rev 0)
+++ public/yanel/trunk/src/contributions/resources/policymanager/build.xml	2008-04-03 07:03:37 UTC (rev 34704)
@@ -0,0 +1,65 @@
+<?xml version="1.0"?>
+
+<project name="yanel-resource" default="compile">
+
+  <import file="src/build/dependencies.xml"/>
+
+  <target name="init" description="Initialize build" depends="dependencies">
+    <echo>Initialize build</echo>
+
+    <dirname property="resource.home.dir" file="${ant.file}"/>
+    <echo>Resource Home Directory: ${resource.home.dir}</echo>
+
+    <property file="${resource.home.dir}/src/build/local.build.properties"/>
+    <property file="${resource.home.dir}/src/build/build.properties"/>
+
+    <path id="classpath">
+      <pathelement path="${maven2.cp}"/>
+    </path>
+    <property name="resource.build.dir" value="${resource.home.dir}/build"/>
+    <property name="resource.classes.dir" value="${resource.build.dir}/classes"/>
+    <property name="resource.lib.dir" value="${resource.build.dir}/lib"/>
+    <property name="resource.java.dir" value="${resource.home.dir}/src/java"/>
+    <property name="resource.resource.xml" value="${resource.home.dir}/resource.xml"/>
+    <xmlproperty prefix="resource.resource.xml" file="${resource.resource.xml}"/>    
+  </target>
+
+  <target name="compile" description="Compile Java classes" depends="init">
+
+    <mkdir dir="${resource.classes.dir}"/>
+    <javac srcdir="${resource.java.dir}" destdir="${resource.classes.dir}"
+      classpathref="classpath"
+      debug="true"
+    />
+    <propertyregex property="new.resource.java.classname.fs.path"
+             input="${resource.resource.xml.resource(class)}"
+             regexp="[.]"
+             replace="/"
+             global="true"
+             casesensitive="false" />
+    <propertyregex property="new.resource.java.class.fs.path"
+             input="${new.resource.java.classname.fs.path}"
+             regexp="\/[^/]*$"
+             replace=""
+             global="true"
+             casesensitive="false" />
+    <copy todir="${resource.classes.dir}/${new.resource.java.class.fs.path}">
+      <fileset dir="${resource.home.dir}" includes="resource**,htdocs/**,yanel-htdocs/**"/>
+    </copy>    
+    <mkdir dir="${resource.lib.dir}"/>
+    <jar destfile="${resource.lib.dir}/yanel-resource-${resource.name}-${resource.version}.jar"
+      basedir="${resource.classes.dir}"
+    />
+  </target>
+
+  <target name="clean" depends="init">
+    <delete dir="${resource.build.dir}"/>
+  </target>
+
+  <target name="copy-dependencies" depends="init">
+    <copy todir="${build.dir}/webapps/${servlet.context.prefix}/WEB-INF/lib">
+      <fileset refid="maven2.resource.fileset"/>
+      <mapper type="flatten"/>
+    </copy>
+  </target>
+</project>

Added: public/yanel/trunk/src/contributions/resources/policymanager/resource.xml
===================================================================
--- public/yanel/trunk/src/contributions/resources/policymanager/resource.xml	                        (rev 0)
+++ public/yanel/trunk/src/contributions/resources/policymanager/resource.xml	2008-04-03 07:03:37 UTC (rev 34704)
@@ -0,0 +1,17 @@
+<?xml version="1.0"?>
+
+<resource xmlns="http://www.wyona.org/yanel/1.0"
+  name="policymanager"
+  namespace="http://www.wyona.org/yanel/resource/1.0"
+  class="org.wyona.yanel.impl.resources.policymanager.PolicyManagerResource"
+  >
+<description>
+Policy Manager
+</description>
+
+<rtd>
+<!--
+  <property name="foo" default-value="bar"/>
+-->
+</rtd>
+</resource>

Added: public/yanel/trunk/src/contributions/resources/policymanager/src/build/build.properties
===================================================================
--- public/yanel/trunk/src/contributions/resources/policymanager/src/build/build.properties	                        (rev 0)
+++ public/yanel/trunk/src/contributions/resources/policymanager/src/build/build.properties	2008-04-03 07:03:37 UTC (rev 34704)
@@ -0,0 +1,2 @@
+resource.name=policymanager
+resource.version=0.0.1-dev-rXXX

Added: public/yanel/trunk/src/contributions/resources/policymanager/src/build/dependencies.xml
===================================================================
--- public/yanel/trunk/src/contributions/resources/policymanager/src/build/dependencies.xml	                        (rev 0)
+++ public/yanel/trunk/src/contributions/resources/policymanager/src/build/dependencies.xml	2008-04-03 07:03:37 UTC (rev 34704)
@@ -0,0 +1,26 @@
+<?xml version="1.0"?>
+
+<project name="policymanager-dependencies" xmlns:artifact="antlib:org.apache.maven.artifact.ant">
+
+  <target name="dependencies" description="Dependencies">
+    <artifact:remoteRepository id="wyona.remote.repository" url="${maven.url}"/>
+
+    <artifact:dependencies pathId="maven2.classpath" filesetId="maven2.fileset">
+      <remoteRepository refid="wyona.remote.repository"/>
+      <dependency groupId="wyona-org-yanel" artifactId="yanel-core" version="${yanel.source.version}"/>
+      <dependency groupId="wyona-org-yanel" artifactId="yanel-impl" version="${yanel.source.version}"/>
+      <dependency groupId="javax.servlet" artifactId="servlet-api" version="2.3"/>
+      <dependency groupId="avalon-framework" artifactId="avalon-framework-api" version="4.3"/>
+      <dependency groupId="avalon-framework" artifactId="avalon-framework-impl" version="4.3"/>      
+    </artifact:dependencies>
+
+    <artifact:dependencies pathId="maven2.resource.classpath" filesetId="maven2.resource.fileset">
+      <remoteRepository refid="wyona.remote.repository"/>
+      <!-- No resource specific libs yet -->
+    </artifact:dependencies>
+
+    <property name="maven2.cp" refid="maven2.classpath"/>
+    <!--<echo>Maven2 classpath: ${maven2.cp}</echo>-->
+  </target>
+
+</project>

Added: public/yanel/trunk/src/contributions/resources/policymanager/src/java/org/wyona/yanel/impl/resources/policymanager/PolicyManagerResource.java
===================================================================
--- public/yanel/trunk/src/contributions/resources/policymanager/src/java/org/wyona/yanel/impl/resources/policymanager/PolicyManagerResource.java	                        (rev 0)
+++ public/yanel/trunk/src/contributions/resources/policymanager/src/java/org/wyona/yanel/impl/resources/policymanager/PolicyManagerResource.java	2008-04-03 07:03:37 UTC (rev 34704)
@@ -0,0 +1,265 @@
+/*
+ * Copyright 2007 Wyona
+ */
+
+package org.wyona.yanel.impl.resources.policymanager;
+
+import org.wyona.security.core.api.IdentityManager;
+import org.wyona.security.core.api.Policy;
+import org.wyona.security.core.api.PolicyManager;
+import org.wyona.security.core.api.User;
+import org.wyona.yanel.core.Resource;
+import org.wyona.yanel.impl.resources.BasicXMLResource;
+import org.wyona.yanel.impl.resources.policymanager.PolicyViewer;
+
+import java.io.ByteArrayInputStream;
+import java.io.InputStream;
+import java.util.Vector;
+
+import org.apache.log4j.Logger;
+
+
+/**
+ * 
+ */
+public class PolicyManagerResource extends BasicXMLResource {
+    
+    private static Logger log = Logger.getLogger(PolicyManager.class);
+    
+    private static String PARAMETER_EDIT_PATH = "policy-path";
+    private static String PARAMETER_USECASE = "yanel.policy";
+    
+    protected InputStream getContentXML(String viewId) throws Exception {
+        
+        String policyPath = request.getParameter(PARAMETER_EDIT_PATH);
+        String policyUsecase = request.getParameter(PARAMETER_USECASE);
+        
+        Resource resToEditPolicy = getYanel().getResourceManager().getResource(getEnvironment(), getRealm(), policyPath);
+        
+        String backToRealm = org.wyona.yanel.core.util.PathUtil.backToRealm(getPath());
+        StringBuffer sb = new StringBuffer("");
+        try {
+            if (policyUsecase.equals("read")) {
+
+                String orderedByParam = request.getParameter("orderedBy");
+                int orderedBy = 0;
+                if (orderedByParam != null) orderedBy = new java.lang.Integer(orderedByParam).intValue();
+                boolean showParents = false;
+                String showParentsParam = request.getParameter("showParents");
+                if (showParentsParam != null) showParents = new java.lang.Boolean(showParentsParam).booleanValue();
+
+                boolean showTabs = true;
+                String showTabsParam = request.getParameter("showTabs");
+                if (showTabsParam != null) showTabs = new java.lang.Boolean(showTabsParam).booleanValue();
+
+                sb.append(PolicyViewer.getXHTMLView(resToEditPolicy.getRealm().getPolicyManager(), resToEditPolicy.getPath(), null, orderedBy, showParents, showTabs));
+        } else if (policyUsecase.equals("update")) {
+                String getXML = request.getParameter("get");
+                String postXML = request.getParameter("post");
+                if (getXML != null && getXML.equals("identities")) {
+                    sb.append(getIdentitiesAndRightsAsXML(resToEditPolicy.getRealm().getIdentityManager(), resToEditPolicy.getRealm().getPolicyManager(), getRequestedLanguage()));
+                } else if (getXML != null && getXML.equals("policy")) {
+                    sb.append(getPolicyAsXML(resToEditPolicy.getRealm().getPolicyManager(), resToEditPolicy.getPath()));
+                } else if (postXML != null && postXML.equals("policy")) {
+                    try {
+                        writePolicy(request.getInputStream(), resToEditPolicy.getRealm().getPolicyManager(), resToEditPolicy.getPath());
+                        sb.append("<?xml version=\"1.0\"?><saved/>");
+                    } catch(Exception e) {
+                        log.error(e,e);
+                        sb.append("<?xml version=\"1.0\"?><not-saved>" + e.getMessage() + "</not-saved>");
+                    }
+                } else {
+                    String identitiesURL = "../.." + getPath() + "?policy-path=" + policyPath + "&amp;yanel.policy=update&amp;get=identities";
+                    //String saveURL = "../.." + resToEditPolicy.getPath() + "?yanel.policy=update&post=policy";
+                    String saveURL = "?policy-path=" + policyPath + "&amp;yanel.policy=update&amp;post=policy";
+                    String cancelURL = org.wyona.commons.io.PathUtil.getName(resToEditPolicy.getPath());
+                    if (resToEditPolicy.getPath().endsWith("/")) cancelURL = "./";
+
+                    sb.append("<?xml version=\"1.0\"?>");
+                    sb.append("<html xmlns=\"http://www.w3.org/1999/xhtml\">");
+                    sb.append("<head>");
+                    sb.append("<title>Update Access Policy</title>");
+                    sb.append("<link rel=\"stylesheet\" href=\"" + backToRealm + getYanel().getReservedPrefix() + "/org.wyona.security.gwt.accesspolicyeditor.AccessPolicyEditor/style.css\" type=\"text/css\"/>");
+                    sb.append("</head>");
+                    sb.append("<body><h1>Update Access Policy</h1><p><script language=\"javascript\">var getURLs = {\"identities-url\": \"" + identitiesURL + "\", \"policy-url\": \"../.." + getPath() + "?policy-path=" + policyPath + "&amp;yanel.policy=update&amp;get=policy\", \"cancel-url\": \"" + cancelURL + "\", \"save-url\": \"" + saveURL + "\"};</script><script language=\"javascript\" src=\"" + backToRealm + getYanel().getReservedPrefix() + "/org.wyona.security.gwt.accesspolicyeditor.AccessPolicyEditor/org.wyona.security.gwt.accesspolicyeditor.AccessPolicyEditor.nocache.js\"></script></p></body></html>");
+                }
+            } else {
+                sb.append("<html><body>Policy usecase not implemented yet: " + policyUsecase + "</body></html>");
+            }
+        } catch(Exception e) {
+            log.error(e, e);
+            throw new Exception(e.getMessage());
+        }
+        return new ByteArrayInputStream(sb.toString().getBytes());
+    }
+    
+    /**
+    *
+    */
+   private String getIdentitiesAndRightsAsXML(IdentityManager im, PolicyManager pm, String language) {
+       org.wyona.security.core.api.UserManager um = im.getUserManager();
+       org.wyona.security.core.api.GroupManager gm = im.getGroupManager();
+
+       StringBuffer sb = new StringBuffer("<?xml version=\"1.0\"?>");
+       sb.append("<access-control xmlns=\"http://www.wyona.org/security/1.0\">");
+
+       try {
+           User[] users = um.getUsers();
+           sb.append("<users>");
+           for (int i = 0; i < users.length; i++) {
+               sb.append("<user id=\"" + users[i].getID() + "\">" + users[i].getName() + "</user>");
+           }
+           sb.append("</users>");
+
+           org.wyona.security.core.api.Group[] groups = gm.getGroups();
+           sb.append("<groups>");
+           for (int i = 0; i < groups.length; i++) {
+               sb.append("<group id=\"" + groups[i].getID() + "\">" + groups[i].getName() + "</group>");
+           }
+           sb.append("</groups>");
+
+           sb.append("<rights>");
+           String[] rights = pm.getUsecases();
+           if (rights != null) {
+               for (int i = 0; i < rights.length; i++) {
+                   sb.append("<right id=\"" + rights[i] + "\">" + pm.getUsecaseLabel(rights[i], language) + "</right>");
+               }
+           }
+           sb.append("</rights>");
+       } catch (Exception e) {
+           log.error(e, e);
+           sb.append("<exception>" + e.getMessage() + "</exception>");
+       }
+       sb.append("</access-control>");
+       return sb.toString();
+   }
+   
+   /**
+   *
+   */
+  private String getPolicyAsXML(PolicyManager pm, String path) {
+
+      StringBuffer sb = new StringBuffer("<?xml version=\"1.0\"?>");
+
+      try {
+          Policy policy = pm.getPolicy(path, false);
+          if (policy == null) {
+              sb.append("<policy xmlns=\"http://www.wyona.org/security/1.0\" use-inherited-policies=\"false\">");
+              log.warn("No policy yet for path: " + path + " (Return empty policy)");
+          } else {
+              sb.append("<policy xmlns=\"http://www.wyona.org/security/1.0\" use-inherited-policies=\"" + policy.useInheritedPolicies() + "\">");
+              sb.append(getPolicyIdentities(policy));
+              sb.append(getPolicyGroups(policy));
+          }
+      } catch(Exception e) {
+          log.error(e, e);
+          sb.append("<policy xmlns=\"http://www.wyona.org/security/1.0\">");
+          sb.append("<exception>" + e.getMessage() + "</exception>");
+      }
+
+      sb.append("</policy>");
+      return sb.toString();
+  }
+  
+  /**
+   * Get users (TODO: Move this code into the security package)
+   */
+  static public StringBuffer getPolicyIdentities(Policy p) {
+      Vector world = new Vector();
+      java.util.HashMap users = new java.util.HashMap();
+      org.wyona.security.core.UsecasePolicy[] up = p.getUsecasePolicies();
+      if (up != null && up.length > 0) {
+          for (int i = 0; i < up.length; i++) {
+              org.wyona.security.core.IdentityPolicy[] idps = up[i].getIdentityPolicies();
+              for (int j = 0; j < idps.length; j++) {
+                  //log.debug("Usecase Identity Policy: " + up[i].getName() + ", " + idps[j].getIdentity().getUsername() + ", " + idps[j].getPermission());
+
+                  if (idps[j].getIdentity().isWorld()) {
+                      world.add(up[i].getName());
+                  } else {
+                      Vector userRights;
+                      if ((userRights = (Vector) users.get(idps[j].getIdentity().getUsername())) != null) {
+                          log.debug("User has already been added: " + idps[j].getIdentity().getUsername());
+                      } else {
+                          userRights = new Vector();
+                          users.put(idps[j].getIdentity().getUsername(), userRights);
+                      }
+                      if (idps[j].getPermission()) {
+                          userRights.add(up[i].getName());
+                      }
+                  }
+              }
+          }
+      } else {
+          log.warn("No policy usecases!");
+      }
+
+      StringBuffer sb = new StringBuffer();
+      //sb.append("<li>WORLD (" + getCommaSeparatedList(world) + ")</li>");
+
+      java.util.Iterator userIterator = users.keySet().iterator();
+      while (userIterator.hasNext()) {
+          String userName = (String) userIterator.next();
+          sb.append("<user id=\""+userName+"\">");
+          Vector rights = (Vector) users.get(userName);
+          for (int k = 0; k < rights.size(); k++) {
+              // TODO: Do not hardcode permission
+              sb.append("<right id=\"" + (String) rights.elementAt(k) + "\" permission=\"true\"/>");
+          }
+          sb.append("</user>");
+      }
+      return sb;
+  }
+
+  /**
+   * Get groups (TODO: Move this code into the security package)
+   */
+  static public StringBuffer getPolicyGroups(Policy p) {
+      Vector world = new Vector();
+      java.util.HashMap groups = new java.util.HashMap();
+      org.wyona.security.core.UsecasePolicy[] up = p.getUsecasePolicies();
+      if (up != null && up.length > 0) {
+          for (int i = 0; i < up.length; i++) {
+              org.wyona.security.core.GroupPolicy[] ids = up[i].getGroupPolicies();
+              for (int j = 0; j < ids.length; j++) {
+                  Vector groupRights;
+                  if ((groupRights = (Vector) groups.get(ids[j].getId())) != null) {
+                      log.debug("Group has already been added: " + ids[j].getId());
+                  } else {
+                      groupRights = new Vector();
+                      groups.put(ids[j].getId(), groupRights);
+                  }
+                  if (ids[j].getPermission()) {
+                      groupRights.add(up[i].getName());
+                  }
+              }
+          }
+      } else {
+          log.warn("No policy usecases!");
+      }
+
+      StringBuffer sb = new StringBuffer();
+
+      java.util.Iterator userIterator = groups.keySet().iterator();
+      while (userIterator.hasNext()) {
+          String userName = (String) userIterator.next();
+          sb.append("<group id=\""+userName+"\">");
+          Vector rights = (Vector) groups.get(userName);
+          for (int k = 0; k < rights.size(); k++) {
+              //TODO: Do not hardcode permission!
+              sb.append("<right id=\"" + (String) rights.elementAt(k) + "\" permission=\"true\"/>");
+          }
+          sb.append("</group>");
+      }
+      return sb;
+  }
+
+  /**
+   * Write/Save policy
+   */
+  private void writePolicy(InputStream policyAsInputStream, PolicyManager pm, String path) throws Exception {
+      Policy policy = new PolicyParser().parseXML(policyAsInputStream);
+      pm.setPolicy(path, policy);
+  }
+  
+}

Added: public/yanel/trunk/src/contributions/resources/policymanager/src/java/org/wyona/yanel/impl/resources/policymanager/PolicyParser.java
===================================================================
--- public/yanel/trunk/src/contributions/resources/policymanager/src/java/org/wyona/yanel/impl/resources/policymanager/PolicyParser.java	                        (rev 0)
+++ public/yanel/trunk/src/contributions/resources/policymanager/src/java/org/wyona/yanel/impl/resources/policymanager/PolicyParser.java	2008-04-03 07:03:37 UTC (rev 34704)
@@ -0,0 +1,199 @@
+package org.wyona.yanel.impl.resources.policymanager;
+
+import org.wyona.security.core.GroupPolicy;
+import org.wyona.security.core.IdentityPolicy;
+import org.wyona.security.core.UsecasePolicy;
+import org.wyona.security.core.api.AccessManagementException;
+import org.wyona.security.core.api.Group;
+import org.wyona.security.core.api.Identity;
+import org.wyona.security.core.api.Policy;
+
+import org.apache.log4j.Logger;
+
+import org.apache.avalon.framework.configuration.Configuration;
+import org.apache.avalon.framework.configuration.ConfigurationException;
+import org.apache.avalon.framework.configuration.DefaultConfigurationBuilder;
+
+import java.util.Vector;
+
+/**
+ * Allows to parse an XML such as for example
+ * <policy xmlns="http://www.wyona.org/security/1.0" use-inherited-policies="false">
+ *   <world>
+ *     <right id="view">Read</right>
+ *     <right id="write">Write</right>
+ *   </world>
+ *   <user id="http://michaelwechner.livejournal.com/">
+ *     <right id="open" permission="true"/>
+ *     <right id="write" permission="false"/>
+ *   </user>
+ *   <group id="admin">
+ *     <right id="open" permission="true"/>
+ *     <right id="write"/>
+ *   </group>
+ * </policy>
+ */
+public class PolicyParser implements Policy {
+
+    private static Logger log = Logger.getLogger(PolicyParser.class);
+    protected DefaultConfigurationBuilder builder = null;
+    protected Vector usecasePolicies = null;
+    protected boolean useInheritedPolicies = true;
+
+    /**
+     *
+     */
+    public PolicyParser() throws Exception {
+        usecasePolicies = new Vector();
+    }
+
+    /**
+     *
+     */
+    public Policy parseXML(java.io.InputStream in) throws Exception {
+        boolean enableNamespaces = true;
+        builder = new DefaultConfigurationBuilder(enableNamespaces);
+        Configuration config = builder.build(in);
+
+        String useInheritedPoliciesString = config.getAttribute("use-inherited-policies", "true");
+        if (useInheritedPoliciesString.equals("false")) useInheritedPolicies = false;
+
+        // TODO: Check for world
+
+        Configuration[] userConfigs = config.getChildren("user");
+        for (int i = 0; i < userConfigs.length; i++) {
+            Configuration[] rightConfigs = userConfigs[i].getChildren("right");
+            for (int k = 0; k < rightConfigs.length; k++) {
+                UsecasePolicy up = new UsecasePolicy(rightConfigs[k].getAttribute("id"));
+                String permission = rightConfigs[k].getAttribute("permission");
+                up.addIdentity(new Identity(userConfigs[i].getAttribute("id"), null), new Boolean(permission).booleanValue());
+                addUsecasePolicy(up);
+            }
+        }
+
+        Configuration[] groupConfigs = config.getChildren("group");
+        for (int i = 0; i < groupConfigs.length; i++) {
+            Configuration[] rightConfigs = groupConfigs[i].getChildren("right");
+            for (int k = 0; k < rightConfigs.length; k++) {
+                UsecasePolicy up = new UsecasePolicy(rightConfigs[k].getAttribute("id"));
+                String permission = rightConfigs[k].getAttribute("permission");
+                up.addGroupPolicy(new GroupPolicy(groupConfigs[i].getAttribute("id"), new Boolean(permission).booleanValue()));
+                addUsecasePolicy(up);
+            }
+        }
+
+        // TODO: Check for hosts
+
+        return this;
+    }
+
+    /**
+     * @see
+     */
+    public UsecasePolicy[] getUsecasePolicies() {
+        UsecasePolicy[] ups = new UsecasePolicy[usecasePolicies.size()];
+        for (int i = 0; i < ups.length; i++) {
+            ups[i] = (UsecasePolicy) usecasePolicies.elementAt(i);
+        }
+        return ups;
+    }
+
+    /**
+     * @see
+     */
+    public void addUsecasePolicy(UsecasePolicy up) throws AccessManagementException {
+        UsecasePolicy existingUsecasePolicy = null;
+
+        for (int i = 0; i < usecasePolicies.size(); i++) {
+            UsecasePolicy existingUP = (UsecasePolicy) usecasePolicies.elementAt(i);
+            if (existingUP.getName().equals(up.getName())) {
+                existingUsecasePolicy = existingUP;
+                break;
+            }
+        }
+
+        if (existingUsecasePolicy != null) {
+            // Merge identities and groups
+            IdentityPolicy[] identityPolicies = up.getIdentityPolicies();
+            for (int k = 0; k < identityPolicies.length; k++) {
+                boolean identityExists = false;
+                IdentityPolicy[] existingIdentityPolicies = existingUsecasePolicy.getIdentityPolicies();
+                for (int i = 0; i < existingIdentityPolicies.length; i++) {
+                    if (identityPolicies[k].getIdentity().getUsername().equals(existingIdentityPolicies[i].getIdentity().getUsername())) {
+                        identityExists = true;
+                        break;
+                    }
+                }
+                if (!identityExists) {
+                    existingUsecasePolicy.addIdentity(new Identity(identityPolicies[k].getIdentity().getUsername(), null), identityPolicies[k].getPermission());
+                }
+            }
+
+            GroupPolicy[] groups = up.getGroupPolicies();
+            for (int k = 0; k < groups.length; k++) {
+                boolean groupExists = false;
+                GroupPolicy[] existingGroups = existingUsecasePolicy.getGroupPolicies();
+                for (int i = 0; i < existingGroups.length; i++) {
+                    if (groups[k].getId().equals(existingGroups[i].getId())) {
+                        groupExists = true;
+                        break;
+                    }
+                }
+                if (!groupExists) {
+                    existingUsecasePolicy.addGroupPolicy(new GroupPolicy(groups[k].getId(), groups[k].getPermission()));
+                }
+            }
+        } else {
+            usecasePolicies.add(up);
+            log.info("New usecase policy has been added: " + up.getName());
+        }
+    }
+
+    /**
+     * @see
+     */
+    public String getPath() throws AccessManagementException {
+        log.warn("Not implemented yet!");
+        return null;
+    }
+
+    /**
+     * @see
+     */
+    public Policy getParentPolicy() throws AccessManagementException {
+        log.warn("Not implemented yet!");
+        return null;
+    }
+
+    /**
+     * @see
+     */
+    public boolean useInheritedPolicies() {
+        return useInheritedPolicies;
+    }
+
+    /**
+     *
+     */
+    public String toString() {
+        StringBuffer sb = new StringBuffer("Policy:\n");
+        UsecasePolicy[] ups = getUsecasePolicies();
+        for (int i = 0; i < ups.length; i++) {
+            sb.append("  Usecase: " + ups[i].getName() + "\n");
+            Identity[] ids = ups[i].getIdentities();
+            for (int j = 0; j < ids.length; j++) {
+                if (ids[j].isWorld()) {
+                    sb.append("    WORLD\n");
+                } else {
+                    sb.append("    User: " + ids[j].getUsername() + "\n");
+                }
+            }
+            GroupPolicy[] gps = ups[i].getGroupPolicies();
+            for (int j = 0; j < gps.length; j++) {
+                sb.append("    Group: " + gps[j].getId() + " (" + gps[j].getPermission() + ")\n");
+            }
+        }
+        return sb.toString();
+    }
+}
+

Added: public/yanel/trunk/src/contributions/resources/policymanager/src/java/org/wyona/yanel/impl/resources/policymanager/PolicyViewer.java
===================================================================
--- public/yanel/trunk/src/contributions/resources/policymanager/src/java/org/wyona/yanel/impl/resources/policymanager/PolicyViewer.java	                        (rev 0)
+++ public/yanel/trunk/src/contributions/resources/policymanager/src/java/org/wyona/yanel/impl/resources/policymanager/PolicyViewer.java	2008-04-03 07:03:37 UTC (rev 34704)
@@ -0,0 +1,356 @@
+package org.wyona.yanel.impl.resources.policymanager;
+
+import org.wyona.security.core.AuthorizationException;
+import org.wyona.security.core.GroupPolicy;
+import org.wyona.security.core.IdentityPolicy;
+import org.wyona.security.core.UsecasePolicy;
+import org.wyona.security.core.api.Identity;
+import org.wyona.security.core.api.Policy;
+import org.wyona.security.core.api.PolicyManager;
+
+import org.apache.log4j.Logger;
+
+import java.util.Vector;
+
+/**
+ * Utility class to view policies
+ */
+public class PolicyViewer {
+
+    private static Logger log = Logger.getLogger(PolicyViewer.class);
+
+    public static int ORDERED_BY_USECASES = 0;
+    public static int ORDERED_BY_IDENTITIES = 1;
+
+    /**
+     * Get XHTML view of policies
+     * @param pm Policy Manager
+     * @param path Content path which is associated with an access policy
+     * @param contentItemId Content Item ID which allows a unique association with an access policy and an item within the content
+     * @param orderedBy Allows ordering by usecases or identities
+     * @param showParents Show the policies of the parent nodes, which allows to figure out how the policy has been aggregated
+     * @param showTabs Show the tabs which allow to switch between parent policies and node policy
+     */
+    static public String getXHTMLView (PolicyManager pm, String path, String contentItemId, int orderedBy, boolean showParents, boolean showTabs) {
+        try {
+            StringBuffer sb = new StringBuffer("<html>");
+            sb.append("<head>");
+            sb.append("<title>Access Policy: " + path + "</title>");
+            // TODO: Calculate back path ...
+            sb.append("<link type=\"text/css\" href=\"" + backToRootPath(path) + "yanel/yanel-css/view-access-policy.css\" rel=\"stylesheet\"/>");
+            sb.append("</head>");
+            sb.append("<body>");
+	    if(showParents) {
+                // Show also all parent policies
+                if (showTabs) {
+                    sb.append("<p><a href=\"?policy-path=" + path + "&amp;yanel.policy=read&amp;orderedBy=" + orderedBy + "&amp;showParents=false\">Tab: Node Policy</a> | Tab: Parent Policies</p>");
+                }
+
+                sb.append("<p>Access Policies for Path (and its parents) <i>" + path);
+                if (contentItemId != null) sb.append("#" + contentItemId);
+                sb.append("</i>:</p>");
+                sb.append("<p>(Policy Repository: "+pm.getPoliciesRepository().getName()+", "+pm.getPoliciesRepository().getConfigFile()+")</p>");
+
+                sb.append(getOrderByLink(orderedBy, showParents, path));
+                sb.append("<p><table border=\"1\">");
+                sb.append("<tr><td>Path</td>" + getSplittedPath(pm, path, contentItemId) + "</tr>");
+                sb.append("<tr valign=\"top\"><td>Policy</td>" + getPolicies(pm, path, contentItemId, false, orderedBy) + "</tr>");
+                sb.append("<tr valign=\"top\"><td>Aggregated Policy</td>" + getPolicies(pm, path, contentItemId, true, orderedBy) + "</tr>");
+                sb.append("</table></p>");
+            } else {
+                // Show policy of this node only
+                if (showTabs) {
+                    sb.append("<p>Tab: Node Policy | <a href=\"?policy-path=" + path + "&amp;yanel.policy=read&amp;orderedBy=" + orderedBy + "&amp;showParents=true\">Tab: Parent Policies</a></p>");
+                }
+
+                sb.append("<div id=\"path-sentence\"><p>Aggregated Access Policy for Path <i>" + path);
+                if (contentItemId != null) sb.append("#" + contentItemId);
+                sb.append("</i>:</p></div>");
+
+                sb.append(getOrderByLink(orderedBy, showParents, path));
+                boolean aggregate = true;
+                Policy p = pm.getPolicy(path, aggregate);
+                sb.append("<p><table border=\"1\"><tr>");
+		sb.append(getPolicy(p, aggregate, orderedBy, null, path));
+                if (contentItemId != null) {
+                    sb.append("<td>contentItemId (" + contentItemId + ") not implemented yet into API!</td>");
+                }
+                sb.append("</tr></table></p>");
+            }
+            sb.append("</body></html>");
+            return sb.toString();
+        } catch(Exception e) {
+            log.error(e, e);
+            return "<html><body>Exception: " + e.getMessage() + "</body></html>";
+        }
+    }
+
+    /**
+     * Get splitted path
+     */
+    static public StringBuffer getSplittedPath (PolicyManager pm, String path, String contentItemId) {
+        String[] names = path.split("/");
+        StringBuffer sb = new StringBuffer();
+        for (int i = 0; i < names.length -1; i++) {
+            sb.append("<td>" + names[i] + "/</td>");
+        }
+	if (log.isDebugEnabled()) log.debug("Length: " + names.length);
+        if (path.endsWith("/")) {
+            if (names.length > 0) {
+                sb.append("<td>" + names[names.length -1] + "/</td>");
+            } else {
+                sb.append("<td>/</td>");
+            }
+        } else {
+            sb.append("<td>" + names[names.length -1] + "</td>");
+        }
+        if (contentItemId != null) {
+            sb.append("<td>#" + contentItemId + "</td>");
+        }
+        return sb;
+    }
+
+    /**
+     * Get policies
+
+     * @param pm Policy manager
+     * @param path Path of node
+     * @param contentItemId Content item ID
+     * @param aggregate If aggregate true, then the policy will be aggregated/merged with existing parent policies, otherwise only the node specific policy will be returned
+     * @param orderedBy Ordered by identities or usecases
+     */
+    static public StringBuffer getPolicies(PolicyManager pm, String path, String contentItemId, boolean aggregate, int orderedBy) throws AuthorizationException {
+
+        String[] names = path.split("/");
+        StringBuffer sb = new StringBuffer();
+        StringBuffer currentPath = new StringBuffer();
+        // Show policies of the parents of the node
+        for (int i = 0; i < names.length - 1; i++) {
+            currentPath.append(names[i] + "/");
+            Policy p = pm.getPolicy(currentPath.toString(), aggregate);
+
+
+            String back = "";
+            if (path.endsWith("/")) {
+                for (int k = i; k < names.length - 1; k++) {
+                    back = back + "../";
+                } 
+            } else {
+                if (i == names.length -2) {
+                    back ="./";
+                } else {
+                    for (int k = i; k < names.length - 2; k++) {
+                        back = back + "../";
+                    } 
+                }
+            }
+            //log.debug("Back path: " + i + ", " + names[i] + ", " + back);
+
+
+            sb.append(getPolicy(p, aggregate, orderedBy, back, path));
+        }
+
+        // Show policy of the actual node
+        Policy p = pm.getPolicy(path, aggregate);
+        sb.append(getPolicy(p, aggregate, orderedBy, null, path));
+
+        // Show policy according to content id
+        if (contentItemId != null) {
+            sb.append("<td>Not implemented yet into API!</td>");
+        }
+
+        return sb;
+    }
+
+    /**
+     * Get policy as XHTML list ordered by usecases
+     */
+    static public StringBuffer getPolicyAsXHTMLListOrderedByUsecases(Policy p) {
+        StringBuffer sb = new StringBuffer();
+        UsecasePolicy[] up = p.getUsecasePolicies();
+        if (up != null && up.length > 0) {
+            sb.append("<ul>");
+            for (int i = 0; i < up.length; i++) {
+                sb.append("<li>Usecase: " + up[i].getName());
+                sb.append("<ol>");
+                Identity[] ids = up[i].getIdentities();
+                for (int j = 0; j < ids.length; j++) {
+                    if (ids[j].isWorld()) {
+                        sb.append("<li>WORLD</li>");
+                    } else {
+                        sb.append("<li>User: " + ids[j].getUsername() + "</li>");
+                    }
+                }
+                GroupPolicy[] gps = up[i].getGroupPolicies();
+                for (int j = 0; j < gps.length; j++) {
+                    sb.append("<li>Group: " + gps[j].getId() + "</li>");
+                }
+                sb.append("</ol>");
+                sb.append("</li>");
+            }
+            sb.append("</ul>");
+        } else {
+            sb.append("No policy usecases!");
+        }
+        return sb;
+    }
+
+    /**
+     * Get policy as XHTML list ordered by identities
+     */
+    static public StringBuffer getPolicyAsXHTMLListOrderedByIdentities(Policy p) {
+        Vector worldRights = new Vector();
+        java.util.HashMap users = new java.util.HashMap();
+        java.util.HashMap groups = new java.util.HashMap();
+
+        UsecasePolicy[] up = p.getUsecasePolicies();
+        if (up != null && up.length > 0) {
+            for (int i = 0; i < up.length; i++) {
+                IdentityPolicy[] idps = up[i].getIdentityPolicies();
+                for (int j = 0; j < idps.length; j++) {
+                    if (idps[j].getIdentity().isWorld()) {
+                        worldRights.add(up[i].getName());
+                    } else {
+                        Vector userRights;
+                        if ((userRights = (Vector) users.get(idps[j].getIdentity().getUsername())) != null) {
+                            log.debug("User has already been added: " + idps[j].getIdentity().getUsername());
+                        } else {
+                            userRights = new Vector();
+                            users.put(idps[j].getIdentity().getUsername(), userRights);
+                        }
+                        if (idps[j].getPermission()) {
+                            userRights.add(up[i].getName());
+                        }
+                    }
+                }
+
+                GroupPolicy[] gps = up[i].getGroupPolicies();
+                for (int j = 0; j < gps.length; j++) {
+                    Vector groupRights;
+                    if ((groupRights = (Vector) groups.get(gps[j].getId())) != null) {
+                        log.debug("Group has already been added: " + gps[j].getId());
+                    } else {
+                        groupRights = new Vector();
+                        groups.put(gps[j].getId(), groupRights);
+                    }
+                    if (gps[j].getPermission()) {
+                        groupRights.add(up[i].getName());
+                    }
+                }
+            }
+        } else {
+            log.warn("No policy usecases!");
+        }
+
+        StringBuffer sb = new StringBuffer();
+        sb.append("<ul>");
+        if (worldRights.size() > 0) {
+            sb.append("<li>WORLD (" + getCommaSeparatedList(worldRights) + ")</li>");
+        }
+
+        // Users
+        java.util.Iterator userIterator = users.keySet().iterator();
+        while (userIterator.hasNext()) {
+            String userName = (String) userIterator.next();
+            sb.append("<li>User: " + userName + " (" + getCommaSeparatedList((Vector) users.get(userName)) + ")</li>");
+        }
+
+        //Groups 
+        java.util.Iterator groupIterator = groups.keySet().iterator();
+        while (groupIterator.hasNext()) {
+            String groupName = (String) groupIterator.next();
+            sb.append("<li>Group: " + groupName + " (" + getCommaSeparatedList((Vector) groups.get(groupName)) + ")</li>");
+        }
+
+// TODO: Also add hosts
+/*
+        for (int i = 0; i < hosts.length; i++) {
+            sb.append("<li>Host: 192.168.1.34 (view, open, write)</li>");
+        }
+*/
+
+        sb.append("</ul>");
+        return sb;
+    }
+
+    /**
+     * @param rights
+     */
+    private static String getCommaSeparatedList(Vector rights) {
+        StringBuffer sb = new StringBuffer();
+        if (rights.size() > 0) {
+            sb.append((String) rights.elementAt(0));
+            for (int i = 1; i < rights.size(); i++) {
+                sb.append(", " + (String) rights.elementAt(i));
+            }
+        } else {
+            if(log.isDebugEnabled()) log.debug("No rights asigned!");
+            return null;
+        }
+        return sb.toString();
+    }
+
+    /**
+     *
+     */
+    private static String getOrderByLink(int orderedBy, boolean showParents, String path) {
+        if (orderedBy == ORDERED_BY_USECASES) {
+            return "<div id=\"order-by-sentence\"><p>Order by <a href=\"?policy-path=" + path + "&amp;yanel.policy=read&amp;orderedBy=" + ORDERED_BY_IDENTITIES + "&amp;showParents=" + showParents + "\">Identities</a></p></div>";
+        } else if (orderedBy == ORDERED_BY_IDENTITIES) {
+            return "<div id=\"order-by-sentence\"><p>Order by <a href=\"?policy-path=" + path + "&amp;yanel.policy=read&amp;orderedBy=" + ORDERED_BY_USECASES + "&amp;showParents=" + showParents + "\">Usecases</a></p></div>";
+        } else {
+            log.error("No such order by value implemented: " + orderedBy);
+            return "";
+        }
+    }
+
+    /**
+     * Get policy
+     * @param aggregate If aggregate true, then the policy will be aggregated/merged with existing parent policies, otherwise only the node specific policy will be returned
+     * @param back ../../../
+     */
+    static public StringBuffer getPolicy(Policy policy, boolean aggregate, int orderedBy, String back, String path) throws AuthorizationException {
+        StringBuffer sb = new StringBuffer("<td>");
+        if (policy != null) {
+            String showUseInheritedPolicies = "";
+            String editPolicy = "";
+            if (!aggregate) {
+                showUseInheritedPolicies = "<p>Use inherited policies: " + policy.useInheritedPolicies() + "</p>";
+                if (back != null) {
+                    editPolicy = "<p><a href=\"" + back + "?policy-path=" + path + "&amp;yanel.policy=update\">Edit policy.</a></p>";
+                } else {
+                    editPolicy = "<p><a href=\"?policy-path=" + path + "&amp;yanel.policy=update\">Edit policy.</a></p>";
+                }
+            }
+
+            if (orderedBy == ORDERED_BY_USECASES) {
+                sb.append(editPolicy + showUseInheritedPolicies + getPolicyAsXHTMLListOrderedByUsecases(policy));
+            } else if (orderedBy == ORDERED_BY_IDENTITIES) {
+                sb.append(editPolicy + showUseInheritedPolicies + getPolicyAsXHTMLListOrderedByIdentities(policy));
+            } else {
+                sb.append("No such orderedBy implemented: " + orderedBy);
+            }
+        } else {
+            sb.append("<p>No policy yet!</p>");
+            if (back != null) {
+	        sb.append("<p><a href=\"" + back + "?policy-path=" + path + "&amp;yanel.policy=update\">Create new policy.</a></p>");
+            } else {
+	        sb.append("<p><a href=\"?policy-path=" + path + "&amp;yanel.policy=update\">Create new policy.</a></p>");
+            }
+        }
+        sb.append("</td>");
+        return sb;
+    }
+
+    /**
+     *
+     */
+    private static String backToRootPath(String path) {
+        String[] names = path.split("/");
+        StringBuffer backPath = new StringBuffer();
+	for (int i = 0; i < names.length - 1; i++) {
+            backPath.append("../");
+        }
+        return backPath.toString();
+    }
+}

Added: public/yanel/trunk/src/contributions/resources/policymanager/yanel-htdocs/doc/index.html
===================================================================
--- public/yanel/trunk/src/contributions/resources/policymanager/yanel-htdocs/doc/index.html	                        (rev 0)
+++ public/yanel/trunk/src/contributions/resources/policymanager/yanel-htdocs/doc/index.html	2008-04-03 07:03:37 UTC (rev 34704)
@@ -0,0 +1,58 @@
+<?xml version="1.0"?>
+
+<html xmlns="http://www.w3.org/1999/xhtml">
+  <head>
+    <title>policymanager</title>
+
+<!-- TODO: Reference this style globally -->
+    <style>
+h2 {
+  font-size: 130%;
+  color:     #ffffff;
+  background-color: #525D76;
+}
+pre {
+  background-color: efefef;
+}
+td {
+  background-color: eeeeee;
+  color:            000000;
+}
+
+/* first row */
+table tr:first-child td {
+  background-color: cccccc;
+  color:            000000;
+}
+
+/* or th as first row */
+table th {
+  background-color: cccccc;
+  color:            000000;
+}
+    </style>
+  </head>
+  <body>
+    <h1>policymanager</h1>
+
+    <h2>Overview</h2>
+    <dl>
+      <dt>Name:</dt>
+      <dd>policymanager</dd>
+      <dt>Namespace:</dt>
+      <dd>http://www.wyona.org/yanel/resource/1.0</dd>
+      <dt>Universal Name:</dt>
+      <dd>&lt;{http://www.wyona.org/yanel/resource/1.0}policymanager/&gt;</dd>
+      <dt>Description:</dt>
+      <dd>Policy Manager</dd>
+      <dt>Java Class:</dt>
+      <dd>org.wyona.yanel.impl.resources.policymanager.PolicyManager</dd>
+    </dl>
+
+    <h2>Views</h2>
+    <p>TODO</p>
+
+    <h2>Examples</h2>
+    <p>TODO</p>
+  </body>
+</html>

Added: public/yanel/trunk/src/contributions/resources/policymanager/yanel-htdocs/icons/16x16/rt-icon.png
===================================================================
(Binary files differ)


Property changes on: public/yanel/trunk/src/contributions/resources/policymanager/yanel-htdocs/icons/16x16/rt-icon.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: public/yanel/trunk/src/contributions/resources/policymanager/yanel-htdocs/icons/22x22/rt-icon.png
===================================================================
(Binary files differ)


Property changes on: public/yanel/trunk/src/contributions/resources/policymanager/yanel-htdocs/icons/22x22/rt-icon.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: public/yanel/trunk/src/contributions/resources/policymanager/yanel-htdocs/icons/32x32/rt-icon.png
===================================================================
(Binary files differ)


Property changes on: public/yanel/trunk/src/contributions/resources/policymanager/yanel-htdocs/icons/32x32/rt-icon.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: public/yanel/trunk/src/contributions/resources/policymanager/yanel-htdocs/icons/scalable/rt-icon.svg
===================================================================
--- public/yanel/trunk/src/contributions/resources/policymanager/yanel-htdocs/icons/scalable/rt-icon.svg	                        (rev 0)
+++ public/yanel/trunk/src/contributions/resources/policymanager/yanel-htdocs/icons/scalable/rt-icon.svg	2008-04-03 07:03:37 UTC (rev 34704)
@@ -0,0 +1,526 @@
+<?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://web.resource.org/cc/"
+   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://inkscape.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   inkscape:export-ydpi="240.00000"
+   inkscape:export-xdpi="240.00000"
+   inkscape:export-filename="/home/jimmac/gfx/novell/pdes/trunk/docs/BIGmime-text.png"
+   sodipodi:docname="yanel-resource-type.svg"
+   sodipodi:docbase="/home/simon/office/wyona/yanel/img/icons/scalable"
+   inkscape:version="0.43"
+   sodipodi:version="0.32"
+   id="svg249"
+   height="48.000000px"
+   width="48.000000px">
+  <defs
+     id="defs3">
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient5060"
+       id="radialGradient6719"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-2.774389,0,0,1.969706,112.7623,-872.8854)"
+       cx="605.71429"
+       cy="486.64789"
+       fx="605.71429"
+       fy="486.64789"
+       r="117.14286" />
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient5060">
+      <stop
+         style="stop-color:black;stop-opacity:1;"
+         offset="0"
+         id="stop5062" />
+      <stop
+         style="stop-color:black;stop-opacity:0;"
+         offset="1"
+         id="stop5064" />
+    </linearGradient>
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient5060"
+       id="radialGradient6717"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(2.774389,0,0,1.969706,-1891.633,-872.8854)"
+       cx="605.71429"
+       cy="486.64789"
+       fx="605.71429"
+       fy="486.64789"
+       r="117.14286" />
+    <linearGradient
+       id="linearGradient5048">
+      <stop
+         style="stop-color:black;stop-opacity:0;"
+         offset="0"
+         id="stop5050" />
+      <stop
+         id="stop5056"
+         offset="0.5"
+         style="stop-color:black;stop-opacity:1;" />
+      <stop
+         style="stop-color:black;stop-opacity:0;"
+         offset="1"
+         id="stop5052" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient5048"
+       id="linearGradient6715"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(2.774389,0,0,1.969706,-1892.179,-872.8854)"
+       x1="302.85715"
+       y1="366.64789"
+       x2="302.85715"
+       y2="609.50507" />
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient3082">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop3084" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:0;"
+         offset="1"
+         id="stop3086" />
+    </linearGradient>
+    <linearGradient
+       id="aigrd1"
+       gradientUnits="userSpaceOnUse"
+       x1="99.7773"
+       y1="15.4238"
+       x2="153.0005"
+       y2="248.6311">
+      <stop
+         offset="0"
+         style="stop-color:#464646;stop-opacity:1"
+         id="stop53300" />
+      <stop
+         offset="1"
+         style="stop-color:#cdcdcd;stop-opacity:1"
+         id="stop53302" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient4542">
+      <stop
+         style="stop-color:#000000;stop-opacity:1;"
+         offset="0"
+         id="stop4544" />
+      <stop
+         style="stop-color:#000000;stop-opacity:0;"
+         offset="1"
+         id="stop4546" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient15662">
+      <stop
+         id="stop15664"
+         offset="0.0000000"
+         style="stop-color:#ffffff;stop-opacity:1.0000000;" />
+      <stop
+         id="stop15666"
+         offset="1.0000000"
+         style="stop-color:#f8f8f8;stop-opacity:1.0000000;" />
+    </linearGradient>
+    <radialGradient
+       id="aigrd3"
+       cx="20.8921"
+       cy="64.5679"
+       r="5.257"
+       fx="20.8921"
+       fy="64.5679"
+       gradientUnits="userSpaceOnUse">
+      <stop
+         offset="0"
+         style="stop-color:#F0F0F0"
+         id="stop15573" />
+      <stop
+         offset="1.0000000"
+         style="stop-color:#9a9a9a;stop-opacity:1.0000000;"
+         id="stop15575" />
+    </radialGradient>
+    <radialGradient
+       id="aigrd2"
+       cx="20.8921"
+       cy="114.5684"
+       r="5.256"
+       fx="20.8921"
+       fy="114.5684"
+       gradientUnits="userSpaceOnUse">
+      <stop
+         offset="0"
+         style="stop-color:#F0F0F0"
+         id="stop15566" />
+      <stop
+         offset="1.0000000"
+         style="stop-color:#9a9a9a;stop-opacity:1.0000000;"
+         id="stop15568" />
+    </radialGradient>
+    <linearGradient
+       id="linearGradient269">
+      <stop
+         id="stop270"
+         offset="0.0000000"
+         style="stop-color:#a3a3a3;stop-opacity:1.0000000;" />
+      <stop
+         id="stop271"
+         offset="1.0000000"
+         style="stop-color:#4c4c4c;stop-opacity:1.0000000;" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient259">
+      <stop
+         id="stop260"
+         offset="0.0000000"
+         style="stop-color:#fafafa;stop-opacity:1.0000000;" />
+      <stop
+         id="stop261"
+         offset="1.0000000"
+         style="stop-color:#bbbbbb;stop-opacity:1.0000000;" />
+    </linearGradient>
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient269"
+       id="radialGradient15656"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.968273,0.000000,0.000000,1.032767,3.353553,0.646447)"
+       cx="8.8244190"
+       cy="3.7561285"
+       fx="8.8244190"
+       fy="3.7561285"
+       r="37.751713" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient259"
+       id="radialGradient15658"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="scale(0.960493,1.041132)"
+       cx="33.966679"
+       cy="35.736916"
+       fx="33.966679"
+       fy="35.736916"
+       r="86.708450" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient15662"
+       id="radialGradient15668"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.968273,0.000000,0.000000,1.032767,3.353553,0.646447)"
+       cx="8.1435566"
+       cy="7.2678967"
+       fx="8.1435566"
+       fy="7.2678967"
+       r="38.158695" />
+    <radialGradient
+       r="5.256"
+       fy="114.5684"
+       fx="20.8921"
+       cy="114.5684"
+       cx="20.8921"
+       gradientTransform="matrix(0.229703,0.000000,0.000000,0.229703,4.613529,3.979808)"
+       gradientUnits="userSpaceOnUse"
+       id="radialGradient2283"
+       xlink:href="#aigrd2"
+       inkscape:collect="always" />
+    <radialGradient
+       r="5.257"
+       fy="64.5679"
+       fx="20.8921"
+       cy="64.5679"
+       cx="20.8921"
+       gradientTransform="matrix(0.229703,0.000000,0.000000,0.229703,4.613529,3.979808)"
+       gradientUnits="userSpaceOnUse"
+       id="radialGradient2285"
+       xlink:href="#aigrd3"
+       inkscape:collect="always" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4542"
+       id="radialGradient4548"
+       cx="24.306795"
+       cy="42.07798"
+       fx="24.306795"
+       fy="42.07798"
+       r="15.821514"
+       gradientTransform="matrix(1.000000,0.000000,0.000000,0.284916,0.000000,30.08928)"
+       gradientUnits="userSpaceOnUse" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3082"
+       id="linearGradient5876"
+       gradientUnits="userSpaceOnUse"
+       x1="44.592766"
+       y1="9.9124937"
+       x2="65.862885"
+       y2="43.31715"
+       gradientTransform="matrix(0.703833,0,0,0.703833,59.94701,5.314359)" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#aigrd1"
+       id="linearGradient5881"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.141249,0,0,0.141249,77.77723,7.536622)"
+       x1="99.7773"
+       y1="15.4238"
+       x2="153.0005"
+       y2="248.6311" />
+  </defs>
+  <sodipodi:namedview
+     inkscape:window-y="0"
+     inkscape:window-x="0"
+     inkscape:window-height="721"
+     inkscape:window-width="1024"
+     inkscape:document-units="px"
+     inkscape:grid-bbox="true"
+     showgrid="false"
+     inkscape:current-layer="layer5"
+     inkscape:cy="24.736793"
+     inkscape:cx="47.048879"
+     inkscape:zoom="38.759927"
+     inkscape:pageshadow="2"
+     inkscape:pageopacity="0.0"
+     borderopacity="0.25490196"
+     bordercolor="#666666"
+     pagecolor="#ffffff"
+     id="base"
+     inkscape:showpageshadow="false" />
+  <metadata
+     id="metadata4">
+    <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>Generic Script</dc:title>
+        <dc:subject>
+          <rdf:Bag>
+            <rdf:li>text</rdf:li>
+            <rdf:li>plaintext</rdf:li>
+            <rdf:li>regular</rdf:li>
+            <rdf:li>script</rdf:li>
+            <rdf:li>shell</rdf:li>
+            <rdf:li>bash</rdf:li>
+            <rdf:li>python</rdf:li>
+            <rdf:li>perl</rdf:li>
+            <rdf:li>php</rdf:li>
+            <rdf:li>ruby</rdf:li>
+          </rdf:Bag>
+        </dc:subject>
+        <cc:license
+           rdf:resource="http://creativecommons.org/licenses/by-sa/2.0/" />
+        <dc:creator>
+          <cc:Agent>
+            <dc:title>Jakub Steiner</dc:title>
+          </cc:Agent>
+        </dc:creator>
+        <dc:source>http://jimmac.musichall.cz</dc:source>
+      </cc:Work>
+      <cc:License
+         rdf:about="http://creativecommons.org/licenses/by/2.0/">
+        <cc:permits
+           rdf:resource="http://web.resource.org/cc/Reproduction" />
+        <cc:permits
+           rdf:resource="http://web.resource.org/cc/Distribution" />
+        <cc:requires
+           rdf:resource="http://web.resource.org/cc/Notice" />
+        <cc:requires
+           rdf:resource="http://web.resource.org/cc/Attribution" />
+        <cc:permits
+           rdf:resource="http://web.resource.org/cc/DerivativeWorks" />
+        <cc:requires
+           rdf:resource="http://web.resource.org/cc/ShareAlike" />
+      </cc:License>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:groupmode="layer"
+     id="layer6"
+     inkscape:label="Shadow">
+    <g
+       style="display:inline"
+       transform="matrix(2.105461e-2,0,0,2.086758e-2,42.85172,41.1536)"
+       id="g6707"
+       inkscape:export-filename="/home/simon/office/wyona/yanel/resource-type-icon-test.png"
+       inkscape:export-xdpi="1010.53"
+       inkscape:export-ydpi="1010.53">
+      <rect
+         style="opacity:0.40206185;color:black;fill:url(#linearGradient6715);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+         id="rect6709"
+         width="1339.6335"
+         height="478.35718"
+         x="-1559.2523"
+         y="-150.69685" />
+      <path
+         style="opacity:0.40206185;color:black;fill:url(#radialGradient6717);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+         d="M -219.61876,-150.68038 C -219.61876,-150.68038 -219.61876,327.65041 -219.61876,327.65041 C -76.744594,328.55086 125.78146,220.48075 125.78138,88.454235 C 125.78138,-43.572302 -33.655436,-150.68036 -219.61876,-150.68038 z "
+         id="path6711"
+         sodipodi:nodetypes="cccc" />
+      <path
+         sodipodi:nodetypes="cccc"
+         id="path6713"
+         d="M -1559.2523,-150.68038 C -1559.2523,-150.68038 -1559.2523,327.65041 -1559.2523,327.65041 C -1702.1265,328.55086 -1904.6525,220.48075 -1904.6525,88.454235 C -1904.6525,-43.572302 -1745.2157,-150.68036 -1559.2523,-150.68038 z "
+         style="opacity:0.40206185;color:black;fill:url(#radialGradient6719);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />
+    </g>
+  </g>
+  <g
+     style="display:inline"
+     inkscape:groupmode="layer"
+     inkscape:label="Base"
+     id="layer1">
+    <rect
+       style="color:#000000;fill:url(#radialGradient15658);fill-opacity:1.0000000;fill-rule:nonzero;stroke:url(#radialGradient15656);stroke-width:1.0000000;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4.0000000;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000;marker:none;marker-start:none;marker-mid:none;marker-end:none;visibility:visible;display:block;overflow:visible"
+       id="rect15391"
+       width="34.875000"
+       height="40.920494"
+       x="6.6035528"
+       y="3.6464462"
+       ry="1.1490486"
+       inkscape:export-filename="/home/simon/office/wyona/yanel/resource-type-icon-test.png"
+       inkscape:export-xdpi="1010.53"
+       inkscape:export-ydpi="1010.53" />
+    <rect
+       style="color:#000000;fill:none;fill-opacity:1.0000000;fill-rule:nonzero;stroke:url(#radialGradient15668);stroke-width:1.0000000;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4.0000000;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000;marker:none;marker-start:none;marker-mid:none;marker-end:none;visibility:visible;display:block;overflow:visible"
+       id="rect15660"
+       width="32.775887"
+       height="38.946384"
+       x="7.6660538"
+       y="4.5839462"
+       ry="0.14904857"
+       rx="0.14904857"
+       inkscape:export-filename="/home/simon/office/wyona/yanel/resource-type-icon-test.png"
+       inkscape:export-xdpi="1010.53"
+       inkscape:export-ydpi="1010.53" />
+    <g
+       transform="translate(0.646447,-3.798933e-2)"
+       id="g2270"
+       inkscape:export-filename="/home/simon/office/wyona/yanel/resource-type-icon-test.png"
+       inkscape:export-xdpi="1010.53"
+       inkscape:export-ydpi="1010.53">
+      <g
+         id="g1440"
+         style="fill:#ffffff;fill-opacity:1.0000000;fill-rule:nonzero;stroke:#000000;stroke-miterlimit:4.0000000"
+         transform="matrix(0.229703,0.000000,0.000000,0.229703,4.967081,4.244972)">
+        <radialGradient
+           id="radialGradient1442"
+           cx="20.892099"
+           cy="114.56840"
+           r="5.2560000"
+           fx="20.892099"
+           fy="114.56840"
+           gradientUnits="userSpaceOnUse">
+          <stop
+             offset="0"
+             style="stop-color:#F0F0F0"
+             id="stop1444" />
+          <stop
+             offset="1"
+             style="stop-color:#474747"
+             id="stop1446" />
+        </radialGradient>
+        <path
+           style="stroke:none"
+           d="M 23.428000,113.07000 C 23.428000,115.04300 21.828000,116.64200 19.855000,116.64200 C 17.881000,116.64200 16.282000,115.04200 16.282000,113.07000 C 16.282000,111.09600 17.882000,109.49700 19.855000,109.49700 C 21.828000,109.49700 23.428000,111.09700 23.428000,113.07000 z "
+           id="path1448" />
+        <radialGradient
+           id="radialGradient1450"
+           cx="20.892099"
+           cy="64.567902"
+           r="5.2570000"
+           fx="20.892099"
+           fy="64.567902"
+           gradientUnits="userSpaceOnUse">
+          <stop
+             offset="0"
+             style="stop-color:#F0F0F0"
+             id="stop1452" />
+          <stop
+             offset="1"
+             style="stop-color:#474747"
+             id="stop1454" />
+        </radialGradient>
+        <path
+           style="stroke:none"
+           d="M 23.428000,63.070000 C 23.428000,65.043000 21.828000,66.643000 19.855000,66.643000 C 17.881000,66.643000 16.282000,65.043000 16.282000,63.070000 C 16.282000,61.096000 17.882000,59.497000 19.855000,59.497000 C 21.828000,59.497000 23.428000,61.097000 23.428000,63.070000 z "
+           id="path1456" />
+      </g>
+      <path
+         style="fill:url(#radialGradient2283);fill-rule:nonzero;stroke:none;stroke-miterlimit:4.0000000"
+         d="M 9.9950109,29.952326 C 9.9950109,30.405530 9.6274861,30.772825 9.1742821,30.772825 C 8.7208483,30.772825 8.3535532,30.405301 8.3535532,29.952326 C 8.3535532,29.498892 8.7210780,29.131597 9.1742821,29.131597 C 9.6274861,29.131597 9.9950109,29.499122 9.9950109,29.952326 z "
+         id="path15570" />
+      <path
+         style="fill:url(#radialGradient2285);fill-rule:nonzero;stroke:none;stroke-miterlimit:4.0000000"
+         d="M 9.9950109,18.467176 C 9.9950109,18.920380 9.6274861,19.287905 9.1742821,19.287905 C 8.7208483,19.287905 8.3535532,18.920380 8.3535532,18.467176 C 8.3535532,18.013742 8.7210780,17.646447 9.1742821,17.646447 C 9.6274861,17.646447 9.9950109,18.013972 9.9950109,18.467176 z "
+         id="path15577" />
+    </g>
+    <path
+       style="fill:none;fill-opacity:0.75000000;fill-rule:evenodd;stroke:#000000;stroke-width:0.98855311;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4.0000000;stroke-opacity:0.017543854"
+       d="M 11.505723,5.4942766 L 11.505723,43.400869"
+       id="path15672"
+       sodipodi:nodetypes="cc"
+       inkscape:export-filename="/home/simon/office/wyona/yanel/resource-type-icon-test.png"
+       inkscape:export-xdpi="1010.53"
+       inkscape:export-ydpi="1010.53" />
+    <path
+       style="fill:none;fill-opacity:0.75000000;fill-rule:evenodd;stroke:#ffffff;stroke-width:1.0000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4.0000000;stroke-opacity:0.20467831"
+       d="M 12.500000,5.0205154 L 12.500000,43.038228"
+       id="path15674"
+       sodipodi:nodetypes="cc"
+       inkscape:export-filename="/home/simon/office/wyona/yanel/resource-type-icon-test.png"
+       inkscape:export-xdpi="1010.53"
+       inkscape:export-ydpi="1010.53" />
+  </g>
+  <g
+     inkscape:groupmode="layer"
+     id="layer5"
+     inkscape:label="Text"
+     style="display:inline">
+    <path
+       style="opacity:0.5;fill:#757575;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-miterlimit:4"
+       d="M 26.895946,38.363178 C 29.422384,31.930312 35.482086,27.935015 41.977118,27.725159 L 41.934871,24.080092 L 41.016584,21.974032 C 40.428479,22.013648 39.843745,22.075181 39.263207,22.160152 L 39.119403,24.7109 C 38.004047,24.902872 36.909719,25.188827 35.848036,25.563033 L 34.481543,23.404986 C 33.814696,23.659121 33.160544,23.944343 32.520821,24.259898 L 33.172061,26.729457 C 32.175292,27.25296 31.221266,27.860294 30.32146,28.546634 L 28.35437,26.916101 C 27.800352,27.361576 27.265748,27.833837 26.753454,28.332812 L 28.136346,30.48078 C 27.354598,31.281731 26.634932,32.154475 25.987988,33.093856 L 23.614092,32.150998 C 23.227799,32.743763 22.867518,33.359912 22.533981,33.996382 L 24.513063,35.612231 C 24.266219,36.113931 24.037005,36.629262 23.828996,37.158905 C 23.620903,37.688756 23.438165,38.222339 23.277622,38.757932 L 20.728118,38.594506 C 20.539223,39.288263 20.383997,39.984707 20.26387,40.682005 L 22.644649,41.606733 C 22.479426,42.735306 22.412837,43.8645!
 4 22.440592,44.983417 L 23.960937,45.101675 L 25.732051,44.329543 C 25.751284,42.341688 26.125779,40.323583 26.895657,38.363302 L 26.895946,38.363178 z "
+       id="path53363"
+       inkscape:export-filename="/home/simon/office/wyona/yanel/resource-type-icon-test.png"
+       inkscape:export-xdpi="1010.53"
+       inkscape:export-ydpi="1010.53"
+       sodipodi:nodetypes="csccccccccccccccccsccccccccc" />
+  </g>
+  <g
+     inkscape:groupmode="layer"
+     id="layer7"
+     inkscape:label="2">
+    <g
+       transform="matrix(1.789975e-2,0,0,1.930874e-2,-46.951,-203.7979)"
+       style="fill:#4682b4;fill-opacity:1;visibility:visible"
+       id="g4046"
+       inkscape:export-filename="/home/simon/office/wyona/yanel/resource-type-icon-test.png"
+       inkscape:export-xdpi="1010.53"
+       inkscape:export-ydpi="1010.53">
+      <desc
+         id="desc4048">Drawing</desc>
+      <g
+         style="fill:#4682b4;fill-opacity:1"
+         id="g4050">
+        <g
+           style="fill:#4682b4;fill-opacity:1;stroke:none"
+           id="g4052">
+          <path
+             d="M 3803,11713 L 3805,11720 L 3808,11727 L 3811,11734 L 3814,11741 L 3816,11748 L 3818,11755 L 3818,11759 L 3819,11762 L 3819,11766 L 3819,11769 L 3819,11777 L 3818,11781 L 3817,11784 L 3817,11787 L 3816,11790 L 3814,11793 L 3813,11796 L 3811,11799 L 3809,11801 L 3807,11803 L 3805,11805 L 3803,11807 L 3800,11809 L 3797,11811 L 3794,11812 L 3788,11814 L 3781,11817 L 3774,11818 L 3767,11820 L 3760,11821 L 3753,11821 L 3745,11822 L 3738,11822 L 3553,11822 L 3553,12076 L 3764,12076 L 3852,12074 L 3870,12073 L 3887,12072 L 3904,12070 L 3919,12068 L 3926,12067 L 3933,12066 L 3947,12063 L 3960,12060 L 3973,12056 L 3985,12051 L 3998,12046 L 4012,12039 L 4025,12032 L 4043,12021 L 4060,12010 L 4075,11998 L 4090,11985 L 4103,11972 L 4116,11958 L 4127,11943 L 4137,11928 L 4156,11897 L 4175,11865 L 4193,11832 L 4210,11798 L 4635,10865 L 4196,10865 L 4094,11169 L 4070,11252 L 4065,11268 L 4061,11285 L 4053,11316 L 4046,11348 L 4042,11364 L 4039,11381 L 4025,11462 L 4007,113!
 64 L 3991,11286 L 3970,11207 L 3937,11104 L 3857,10865 L 3421,10865 L 3803,11713 z "
+             style="fill:#4682b4;fill-opacity:1"
+             id="path4054" />
+        </g>
+        <g
+           style="fill:#4682b4;fill-opacity:1"
+           id="g4056" />
+      </g>
+    </g>
+  </g>
+</svg>



More information about the Yanel-commits mailing list