Author: j16sdiz
Date: 2008-07-25 17:41:12 +0000 (Fri, 25 Jul 2008)
New Revision: 21395

Added:
   
branches/saltedhashstore/freenet/src/freenet/node/fcp/SubscribedUSKMessage.java
   branches/saltedhashstore/freenet/test/freenet/clients/
   branches/saltedhashstore/freenet/test/freenet/clients/http/
   branches/saltedhashstore/freenet/test/freenet/clients/http/filter/
   
branches/saltedhashstore/freenet/test/freenet/clients/http/filter/ContentFilterTest.java
Modified:
   branches/saltedhashstore/freenet/build.xml
   branches/saltedhashstore/freenet/src/freenet/client/FECCodec.java
   
branches/saltedhashstore/freenet/src/freenet/clients/http/ConnectionsToadlet.java
   branches/saltedhashstore/freenet/src/freenet/clients/http/StartupToadlet.java
   
branches/saltedhashstore/freenet/src/freenet/clients/http/filter/GenericReadFilterCallback.java
   branches/saltedhashstore/freenet/src/freenet/config/FilePersistentConfig.java
   
branches/saltedhashstore/freenet/src/freenet/config/FreenetFilePersistentConfig.java
   branches/saltedhashstore/freenet/src/freenet/config/PersistentConfig.java
   branches/saltedhashstore/freenet/src/freenet/config/StringOption.java
   branches/saltedhashstore/freenet/src/freenet/io/comm/DMT.java
   branches/saltedhashstore/freenet/src/freenet/io/comm/UdpSocketHandler.java
   branches/saltedhashstore/freenet/src/freenet/io/xfer/PacketThrottle.java
   branches/saltedhashstore/freenet/src/freenet/l10n/L10n.java
   branches/saltedhashstore/freenet/src/freenet/l10n/freenet.l10n.en.properties
   branches/saltedhashstore/freenet/src/freenet/l10n/freenet.l10n.it.properties
   
branches/saltedhashstore/freenet/src/freenet/l10n/freenet.l10n.zh-cn.properties
   
branches/saltedhashstore/freenet/src/freenet/l10n/freenet.l10n.zh-tw.properties
   branches/saltedhashstore/freenet/src/freenet/node/FNPPacketMangler.java
   branches/saltedhashstore/freenet/src/freenet/node/KeyTracker.java
   branches/saltedhashstore/freenet/src/freenet/node/LocationManager.java
   branches/saltedhashstore/freenet/src/freenet/node/Node.java
   branches/saltedhashstore/freenet/src/freenet/node/NodeClientCore.java
   branches/saltedhashstore/freenet/src/freenet/node/NodeDispatcher.java
   branches/saltedhashstore/freenet/src/freenet/node/NodeIPDetector.java
   branches/saltedhashstore/freenet/src/freenet/node/NodeStarter.java
   branches/saltedhashstore/freenet/src/freenet/node/NodeStats.java
   branches/saltedhashstore/freenet/src/freenet/node/PeerManager.java
   branches/saltedhashstore/freenet/src/freenet/node/PeerNode.java
   branches/saltedhashstore/freenet/src/freenet/node/PeerNodeStatus.java
   branches/saltedhashstore/freenet/src/freenet/node/Persister.java
   branches/saltedhashstore/freenet/src/freenet/node/Version.java
   branches/saltedhashstore/freenet/src/freenet/node/fcp/ClientRequest.java
   
branches/saltedhashstore/freenet/src/freenet/node/fcp/FCPConnectionHandler.java
   
branches/saltedhashstore/freenet/src/freenet/node/fcp/SubscribeUSKMessage.java
   
branches/saltedhashstore/freenet/src/freenet/node/simulator/RealNodeBusyNetworkTest.java
   
branches/saltedhashstore/freenet/src/freenet/node/simulator/RealNodeNetworkColoringTest.java
   
branches/saltedhashstore/freenet/src/freenet/node/simulator/RealNodePingTest.java
   
branches/saltedhashstore/freenet/src/freenet/node/simulator/RealNodeRequestInsertTest.java
   
branches/saltedhashstore/freenet/src/freenet/node/simulator/RealNodeRoutingTest.java
   
branches/saltedhashstore/freenet/src/freenet/node/simulator/RealNodeSecretPingTest.java
   
branches/saltedhashstore/freenet/src/freenet/node/simulator/RealNodeULPRTest.java
   
branches/saltedhashstore/freenet/src/freenet/node/updater/NodeUpdateManager.java
   branches/saltedhashstore/freenet/src/freenet/node/updater/NodeUpdater.java
   
branches/saltedhashstore/freenet/src/freenet/node/updater/UpdateOverMandatoryManager.java
   branches/saltedhashstore/freenet/src/freenet/pluginmanager/PluginManager.java
   branches/saltedhashstore/freenet/src/freenet/support/SimpleFieldSet.java
   branches/saltedhashstore/freenet/src/freenet/support/URIPreEncoder.java
   
branches/saltedhashstore/freenet/src/freenet/support/io/PersistentTempBucketFactory.java
   branches/saltedhashstore/freenet/test/freenet/config/ConfigTest.java
   branches/saltedhashstore/freenet/test/freenet/support/SimpleFieldSetTest.java
Log:
Merge trunk (build 1154) into saltedhashstore

Modified: branches/saltedhashstore/freenet/build.xml
===================================================================
--- branches/saltedhashstore/freenet/build.xml  2008-07-25 14:15:06 UTC (rev 
21394)
+++ branches/saltedhashstore/freenet/build.xml  2008-07-25 17:41:12 UTC (rev 
21395)
@@ -127,7 +127,7 @@

        <!-- ================================================== -->

-       <target name="unit-build" depends="compile" if="junit.present">
+       <target name="unit-build" depends="compile" if="junit.present" 
unless="skip_tests">
                <javac srcdir="${test}" destdir="${build-test}" debug="on" 
optimize="on" source="1.5">
                        <classpath>
                                <pathelement path="${build}"/>
@@ -139,7 +139,7 @@
                </javac>
        </target>

-       <target name="unit" depends="unit-build" if="junit.present">
+       <target name="unit" depends="unit-build" if="junit.present" 
unless="skip_tests">
                <junit printsummary="yes" fork="yes" haltonfailure="yes">
                        <classpath>
                                <pathelement path="${build}"/>

Modified: branches/saltedhashstore/freenet/src/freenet/client/FECCodec.java
===================================================================
--- branches/saltedhashstore/freenet/src/freenet/client/FECCodec.java   
2008-07-25 14:15:06 UTC (rev 21394)
+++ branches/saltedhashstore/freenet/src/freenet/client/FECCodec.java   
2008-07-25 17:41:12 UTC (rev 21395)
@@ -457,7 +457,7 @@

        public void handleLowMemory() throws Exception {
                synchronized (_awaitingJobs) {
-                       maxRunningFECThreads = Math.min(1, maxRunningFECThreads 
- 1);
+                       maxRunningFECThreads = Math.max(1, maxRunningFECThreads 
- 1);
                        _awaitingJobs.notify(); // not notifyAll()
                }
        }

Modified: 
branches/saltedhashstore/freenet/src/freenet/clients/http/ConnectionsToadlet.java
===================================================================
--- 
branches/saltedhashstore/freenet/src/freenet/clients/http/ConnectionsToadlet.java
   2008-07-25 14:15:06 UTC (rev 21394)
+++ 
branches/saltedhashstore/freenet/src/freenet/clients/http/ConnectionsToadlet.java
   2008-07-25 17:41:12 UTC (rev 21395)
@@ -724,7 +724,14 @@

                // location column
                if (advancedModeEnabled) {
-                       peerRow.addChild("td", "class", "peer-location", 
String.valueOf(peerNodeStatus.getLocation()));
+                       HTMLNode locationNode = peerRow.addChild("td", "class", 
"peer-location");
+                       locationNode.addChild("b", 
String.valueOf(peerNodeStatus.getLocation()));
+                       locationNode.addChild("br");
+                       double[] peersLoc = peerNodeStatus.getPeersLocation();
+                       if(peersLoc != null) {
+                               for(double loc : peersLoc)
+                                       locationNode.addChild("i", 
String.valueOf(loc)).addChild("br");
+                       }
                }

                if (advancedModeEnabled) {

Modified: 
branches/saltedhashstore/freenet/src/freenet/clients/http/StartupToadlet.java
===================================================================
--- 
branches/saltedhashstore/freenet/src/freenet/clients/http/StartupToadlet.java   
    2008-07-25 14:15:06 UTC (rev 21394)
+++ 
branches/saltedhashstore/freenet/src/freenet/clients/http/StartupToadlet.java   
    2008-07-25 17:41:12 UTC (rev 21395)
@@ -20,6 +20,7 @@
                this.staticToadlet = staticToadlet;
        }

+       @Override
        public void handleGet(URI uri, HTTPRequest req, ToadletContext ctx) 
throws ToadletContextClosedException, IOException, RedirectException {
                // If we don't disconnect we will have pipelining issues
                ctx.forceDisconnect();
@@ -58,4 +59,4 @@
        public void setIsPRNGReady() {
                isPRNGReady = true;
        }
-}
\ No newline at end of file
+}

Modified: 
branches/saltedhashstore/freenet/src/freenet/clients/http/filter/GenericReadFilterCallback.java
===================================================================
--- 
branches/saltedhashstore/freenet/src/freenet/clients/http/filter/GenericReadFilterCallback.java
     2008-07-25 14:15:06 UTC (rev 21394)
+++ 
branches/saltedhashstore/freenet/src/freenet/clients/http/filter/GenericReadFilterCallback.java
     2008-07-25 17:41:12 UTC (rev 21395)
@@ -11,8 +11,10 @@
 import java.util.HashSet;

 import freenet.clients.http.HTTPRequestImpl;
+import freenet.clients.http.StaticToadlet;
 import freenet.keys.FreenetURI;
 import freenet.l10n.L10n;
+import freenet.node.StaticSwapRequestInterval;
 import freenet.support.HTMLEncoder;
 import freenet.support.Logger;
 import freenet.support.URIPreEncoder;
@@ -75,6 +77,11 @@
        }

        public String processURI(String u, String overrideType, boolean 
noRelative, boolean inline) throws CommentException {
+               if(u.matches("^#[a-zA-Z0-9-_]+$")) {
+                       // Hack for anchors, see #710
+                       return u;
+               }
+               
                URI uri;
                URI resolved;
                boolean logMINOR = Logger.shouldLog(Logger.MINOR, this);
@@ -110,9 +117,9 @@
                                        url = url+"&hasAnActivelink=true";
                                }
                                return url;
-                       }else if(path.equals("") && 
uri.toString().matches("^#[a-zA-Z0-9-_]+$")){
-                               // Hack for anchors, see #710
-                               return uri.toString();
+                       } else if(path.startsWith(StaticToadlet.ROOT_URL)) {
+                               // @see bug #2297
+                               return path;
                        }
                }


Modified: 
branches/saltedhashstore/freenet/src/freenet/config/FilePersistentConfig.java
===================================================================
--- 
branches/saltedhashstore/freenet/src/freenet/config/FilePersistentConfig.java   
    2008-07-25 14:15:06 UTC (rev 21394)
+++ 
branches/saltedhashstore/freenet/src/freenet/config/FilePersistentConfig.java   
    2008-07-25 17:41:12 UTC (rev 21395)
@@ -111,11 +111,9 @@
        }

        public void store() {
-               synchronized(this) {
-                       if(!finishedInit) {
-                               Logger.minor(this, "Initialization not 
finished, refusing to write config", new Exception("error"));
-                               return;
-                       }
+               if(!finishedInit) {
+                       Logger.minor(this, "Initialization not finished, 
refusing to write config", new Exception("error"));
+                       return;
                }
                try {
                        synchronized(storeSync) {
@@ -130,7 +128,10 @@
        }

        /** Don't call without taking storeSync first */
-       protected void innerStore() throws IOException {
+       protected final void innerStore() throws IOException {
+               if(!finishedInit)
+                       throw new IllegalStateException("SHOULD NOT HAPPEN!!");
+               
                SimpleFieldSet fs = exportFieldSet();
                if(Logger.shouldLog(Logger.MINOR, this))
                        Logger.minor(this, "fs = " + fs);

Modified: 
branches/saltedhashstore/freenet/src/freenet/config/FreenetFilePersistentConfig.java
===================================================================
--- 
branches/saltedhashstore/freenet/src/freenet/config/FreenetFilePersistentConfig.java
        2008-07-25 14:15:06 UTC (rev 21394)
+++ 
branches/saltedhashstore/freenet/src/freenet/config/FreenetFilePersistentConfig.java
        2008-07-25 17:41:12 UTC (rev 21395)
@@ -8,8 +8,8 @@
 import freenet.support.SimpleFieldSet;

 public class FreenetFilePersistentConfig extends FilePersistentConfig {
-       private boolean isWritingConfig = false;
-       private boolean hasNodeStarted = false;
+       private volatile boolean isWritingConfig = false;
+       private volatile boolean hasNodeStarted = false;
        private Ticker ticker;
        public final Runnable thread = new Runnable() {
                public void run() {

Modified: 
branches/saltedhashstore/freenet/src/freenet/config/PersistentConfig.java
===================================================================
--- branches/saltedhashstore/freenet/src/freenet/config/PersistentConfig.java   
2008-07-25 14:15:06 UTC (rev 21394)
+++ branches/saltedhashstore/freenet/src/freenet/config/PersistentConfig.java   
2008-07-25 17:41:12 UTC (rev 21395)
@@ -11,7 +11,7 @@
 public class PersistentConfig extends Config {

        protected SimpleFieldSet origConfigFileContents;
-       protected boolean finishedInit;
+       protected volatile boolean finishedInit;

        public PersistentConfig(SimpleFieldSet initialContents) {
                this.origConfigFileContents = initialContents;

Modified: branches/saltedhashstore/freenet/src/freenet/config/StringOption.java
===================================================================
--- branches/saltedhashstore/freenet/src/freenet/config/StringOption.java       
2008-07-25 14:15:06 UTC (rev 21394)
+++ branches/saltedhashstore/freenet/src/freenet/config/StringOption.java       
2008-07-25 17:41:12 UTC (rev 21395)
@@ -42,7 +42,7 @@

        public boolean isDefault() {
                getValue();
-               return currentValue.equals(defaultValue);
+               return (currentValue == null ? false : 
currentValue.equals(defaultValue));
        }

        public void setDefault() {

Modified: branches/saltedhashstore/freenet/src/freenet/io/comm/DMT.java
===================================================================
--- branches/saltedhashstore/freenet/src/freenet/io/comm/DMT.java       
2008-07-25 14:15:06 UTC (rev 21394)
+++ branches/saltedhashstore/freenet/src/freenet/io/comm/DMT.java       
2008-07-25 17:41:12 UTC (rev 21395)
@@ -29,6 +29,7 @@
 import freenet.support.Buffer;
 import freenet.support.Fields;
 import freenet.support.ShortBuffer;
+import java.nio.DoubleBuffer;


 /**
@@ -1228,15 +1229,31 @@
                return msg;
        }

+       @Deprecated
        public static final MessageType FNPLocChangeNotification = new 
MessageType("FNPLocationChangeNotification", PRIORITY_LOW) {{
                addField(LOCATION, Double.class);
        }};

+       @Deprecated
        public static final Message createFNPLocChangeNotification(double 
newLoc) {
                Message msg = new Message(FNPLocChangeNotification);
                msg.set(LOCATION, newLoc);
                return msg;
        }
+               
+       public static final MessageType FNPLocChangeNotificationNew = new 
MessageType("FNPLocationChangeNotification2", PRIORITY_LOW) {{
+               addField(LOCATION, Double.class);
+               addField(PEER_LOCATIONS, ShortBuffer.class);
+       }};
+       
+       public static final Message createFNPLocChangeNotificationNew(double 
myLocation, double[] locations) {
+               Message msg = new Message(FNPLocChangeNotificationNew);
+               ShortBuffer dst = new 
ShortBuffer(Fields.doublesToBytes(locations));
+               msg.set(LOCATION, myLocation);
+               msg.set(PEER_LOCATIONS, dst);
+               
+               return msg;
+       }

        public static final MessageType FNPRoutedPing = new 
MessageType("FNPRoutedPing", PRIORITY_LOW) {{
                addRoutedToNodeMessageFields();
@@ -1571,7 +1588,7 @@

                return msg;
        }
-
+       
        public static void init() { }

 }

Modified: 
branches/saltedhashstore/freenet/src/freenet/io/comm/UdpSocketHandler.java
===================================================================
--- branches/saltedhashstore/freenet/src/freenet/io/comm/UdpSocketHandler.java  
2008-07-25 14:15:06 UTC (rev 21394)
+++ branches/saltedhashstore/freenet/src/freenet/io/comm/UdpSocketHandler.java  
2008-07-25 17:41:12 UTC (rev 21395)
@@ -195,9 +195,7 @@
                } else if(logDEBUG) Logger.minor(this, "No packet received");
        }

-    // FIXME necessary to deal with bugs around build 1000; arguably necessary 
to deal with large node names in connection setup
-    // Revert to 1500?
-    private static final int MAX_RECEIVE_SIZE = 2048;
+    private static final int MAX_RECEIVE_SIZE = 1500;

     private boolean getPacket(DatagramPacket packet) {
                try {

Modified: 
branches/saltedhashstore/freenet/src/freenet/io/xfer/PacketThrottle.java
===================================================================
--- branches/saltedhashstore/freenet/src/freenet/io/xfer/PacketThrottle.java    
2008-07-25 14:15:06 UTC (rev 21394)
+++ branches/saltedhashstore/freenet/src/freenet/io/xfer/PacketThrottle.java    
2008-07-25 17:41:12 UTC (rev 21395)
@@ -35,7 +35,7 @@
        protected static final double PACKET_TRANSMIT_INCREMENT = (4 * (1 - 
(PACKET_DROP_DECREASE_MULTIPLE * PACKET_DROP_DECREASE_MULTIPLE))) / 3;
        protected static final double SLOW_START_DIVISOR = 3.0;
        protected static final long MAX_DELAY = 1000;
-       protected static final long MIN_DELAY = 25;
+       protected static final long MIN_DELAY = 1;
        public static final String VERSION = "$Id: PacketThrottle.java,v 1.3 
2005/08/25 17:28:19 amphibian Exp $";
        public static final long DEFAULT_DELAY = 200;
        private final Peer _peer;
@@ -139,7 +139,7 @@

        /**
         * returns the number of bytes-per-second in the transmition link (?).
-        * FIXME: Will not return more than 40K/s due to MIN_DELAY in 
getDelay().
+        * FIXME: Will not return more than 1M/s due to MIN_DELAY in getDelay().
         */
        public synchronized double getBandwidth() {
                //PACKET_SIZE=1024 [bytes?]

Modified: branches/saltedhashstore/freenet/src/freenet/l10n/L10n.java
===================================================================
--- branches/saltedhashstore/freenet/src/freenet/l10n/L10n.java 2008-07-25 
14:15:06 UTC (rev 21394)
+++ branches/saltedhashstore/freenet/src/freenet/l10n/L10n.java 2008-07-25 
17:41:12 UTC (rev 21395)
@@ -58,8 +58,8 @@
        private static final Object sync = new Object();

        L10n(String selected) {
-               selectedLanguage = selected;
-               File tmpFile = new File(L10n.PREFIX + 
mapLanguageNameToShortCode(selected) + L10n.OVERRIDE_SUFFIX);
+               selectedLanguage = mapLanguageNameToShortCode(selected);
+               File tmpFile = new File(L10n.PREFIX + selected + 
L10n.OVERRIDE_SUFFIX);

                try {
                        if(tmpFile.exists() && tmpFile.canRead() && 
tmpFile.length() > 0) {
@@ -94,6 +94,7 @@
        * @throws MissingResourceException
        */
        public static void setLanguage(String selectedLanguage) throws 
MissingResourceException {
+               selectedLanguage = mapLanguageNameToLongName(selectedLanguage);
                synchronized (sync) {
                        Logger.normal(CLASS_NAME, "Changing the current 
language to : " + selectedLanguage);
                        currentClass = new L10n(selectedLanguage);
@@ -312,8 +313,10 @@
        */
        public static String getSelectedLanguage() {
                synchronized (sync) {
-                       if(currentClass == null) return null;
-                       return currentClass.selectedLanguage;   
+                       if((currentClass == null) || 
(currentClass.selectedLanguage == null))
+                               return FALLBACK_DEFAULT;
+                       else
+                               return currentClass.selectedLanguage;   
                }
        }

@@ -369,6 +372,24 @@
                return null;
        }

+       /**
+        * Map a language identifier to its corresponding long name
+        * 
+        * @param The name to look for
+        * @return The full text language name OR null if not found
+        */
+       public static String mapLanguageNameToLongName(String name) {
+               for(int i=0; i<AVAILABLE_LANGUAGES.length; i++) {
+                       String currentShortCode = AVAILABLE_LANGUAGES[i][0];
+                       String currentLongName = AVAILABLE_LANGUAGES[i][1];
+                       String currentCountryCodeName = 
AVAILABLE_LANGUAGES[i][2];
+                       
+                       if(currentShortCode.equalsIgnoreCase(name) || 
currentLongName.equalsIgnoreCase(name) || 
currentCountryCodeName.equalsIgnoreCase(name))
+                               return currentLongName;
+               }
+               return null;
+       }
+
        public static boolean isOverridden(String key) {
                synchronized(sync) {
                        if(translationOverride == null) return false;

Modified: 
branches/saltedhashstore/freenet/src/freenet/l10n/freenet.l10n.en.properties
===================================================================
--- 
branches/saltedhashstore/freenet/src/freenet/l10n/freenet.l10n.en.properties    
    2008-07-25 14:15:06 UTC (rev 21394)
+++ 
branches/saltedhashstore/freenet/src/freenet/l10n/freenet.l10n.en.properties    
    2008-07-25 17:41:12 UTC (rev 21395)
@@ -694,6 +694,10 @@
 Node.passOpennetPeersThroughDarknetLong=If true, opennet noderefs (NEVER our 
own darknet noderef) will be relayed through our darknet peers. So a node (this 
node, or its peers) can get opennet peers from its darknet peers. This is 
useful because it allows us to bootstrap new opennet peers after having lost 
our peers due to downtime, for example. However, it may make traffic analysis 
slightly easier, so turn it off if you are paranoid.
 Node.port=FNP port number (UDP)
 Node.portLong=UDP port for node-to-node communications (Freenet Node Protocol)
+Node.publishOurPeersLocation=Shall we send our peer's location to our peers?
+Node.publishOurPeersLocationLong=Shall we send our peer's location to our 
peers? Doing so helps routing but gives some information away to a potential 
attacker.
+Node.routeAccordingToOurPeersLocation=Shall we use the locations of the peers 
of our peers into account for routing purposes?
+Node.routeAccordingToOurPeersLocationLong=Shall we use the locations of the 
peers of our peers into account for routing purposes? Doing so helps routing 
but might help a potential attacker.
 Node.storeDirectory=Store directory
 Node.storeDirectoryLong=Name of directory to put store files in
 Node.storeMaxMemTooHigh=Giving more than 80% of your ram to BDB is probably 
not what you want to do!

Modified: 
branches/saltedhashstore/freenet/src/freenet/l10n/freenet.l10n.it.properties
===================================================================
--- 
branches/saltedhashstore/freenet/src/freenet/l10n/freenet.l10n.it.properties    
    2008-07-25 14:15:06 UTC (rev 21394)
+++ 
branches/saltedhashstore/freenet/src/freenet/l10n/freenet.l10n.it.properties    
    2008-07-25 17:41:12 UTC (rev 21395)
@@ -1,13 +1,15 @@
-Announcer.announceAlertIntro=Il nodo sta cercando di connettersi con i 
seednode ed annunciare s?? stesso all' OpenNet (network di Sconosciuti). 
Possono essere necessari alcuni minuti per completare l'operazione.
-Announcer.announceAlertNoSeednodes=Non e' stato trovato il file seednodes.fref 
e quindi il nodo non pu?? connettersi automaticamente ad Opennet. Aggiungere 
alcuni nodi manualmente o scaricare il file seednodes da 
http://downloads.freenetproject.org/alpha/opennet/ .
-Announcer.announceAlertShort=Il nodo sta cercando di connettersi alla rete, 
nel frattempo sar?? pi?? lento.
+?BookmarkEditorToadlet.pasteOrCancel=Click su un'icona incolla o cancella.
+Announcer.announceAlertIntro=Il nodo sta cercando di connettersi con i 
seednode ed annunciare s??? stesso all' OpenNet (network di Sconosciuti). 
Possono essere necessari alcuni minuti per completare l'operazione.
+Announcer.announceAlertNoSeednodes=Non e' stato trovato il file seednodes.fref 
e quindi il nodo non pu??? connettersi automaticamente ad Opennet. Aggiungere 
alcuni nodi manualmente o scaricare il file seednodes da 
http://downloads.freenetproject.org/alpha/opennet/ .
+Announcer.announceAlertShort=Il nodo sta cercando di connettersi alla rete, 
nel frattempo sar??? pi??? lento.
 Announcer.announceAlertTitle=Annuncio Nodo in corso
-Announcer.announceDetails=Il nodo ha recentemente inoltrato 
${recentSentAnnouncements} annunci, ${runningAnnouncements} dei quali ancora in 
corso, ed aggiunto ${addedNodes} nodi (${refusedNodes} nodi hanno rifiutato la 
connessione). In questo momento il nodo ?? connesso a ${connectedSeednodes} 
seednode e sta cercando di connettersi ad altri ${disconnectedSeednodes}.
-Announcer.announceDisabledTooOld=Il software utilizzato dal nodo ?? obsoleto 
ed inadatto alla connessione con la version corrente della rete Freenet. 
L'annuncio ?? stato diabilitato in quanto comunque inutile. Si prega di 
aggiornare il nodo appena possibile (auto-aggiornamento potrebbe essere in 
attesa di input o disabilitato)
-Announcer.announceDisabledTooOldShort=Il nodo non riesce a connettersi alla 
rete perch?? la versione di Freenet utilizzata ?? obsoleta. Si prega di 
eseguire l'aggiornamento.
+Announcer.announceDetails=Il nodo ha recentemente inoltrato 
${recentSentAnnouncements} annunci, ${runningAnnouncements} dei quali ancora in 
corso, ed aggiunto ${addedNodes} nodi (${refusedNodes} nodi hanno rifiutato la 
connessione). In questo momento il nodo ??? connesso a ${connectedSeednodes} 
seednode e sta cercando di connettersi ad altri ${disconnectedSeednodes}.
+Announcer.announceDisabledTooOld=Il software utilizzato dal nodo ??? obsoleto 
ed inadatto alla connessione con la version corrente della rete Freenet. 
L'annuncio ??? stato diabilitato in quanto comunque inutile. Si prega di 
aggiornare il nodo appena possibile (auto-aggiornamento potrebbe essere in 
attesa di input o disabilitato)
+Announcer.announceDisabledTooOldShort=Il nodo non riesce a connettersi alla 
rete perch??? la versione di Freenet utilizzata ??? obsoleta. Si prega di 
eseguire l'aggiornamento.
 Announcer.announceDisabledTooOldTitle=Annuncio disabilitato (obsoleto)
 Announcer.announceLoading=Il nodo sta caricando il file seednodes per 
annunciarsi al resto della rete. Il completamento dell' operazione potrebbe 
richiedere diversi minuti.
-Announcer.coolingOff=per i prossimi ${time} secondi, il nodo aspetter?? che i 
nodi che ha annunciato si connettano; se non ci saranno abbastanza nodi 
prover?? con un altro nodo.
+Announcer.coolingOff=per i prossimi ${time} secondi, il nodo aspetter??? che i 
nodi che ha annunciato si connettano; se non ci saranno abbastanza nodi 
prover??? con un altro nodo.
+Bookmark.noName=nessun nome
 BookmarkEditorToadlet.addBookmark=Aggiungi Segnalibro
 BookmarkEditorToadlet.addCategory=Aggiungi Categoria
 BookmarkEditorToadlet.addDefaultBookmarks=Ri-aggiungi segnalibri originali
@@ -35,11 +37,11 @@
 BookmarkEditorToadlet.editCategoryTitle=Modifica Categoria
 BookmarkEditorToadlet.error=Errore
 BookmarkEditorToadlet.hasAnActivelinkLabel=Il freesite ha un activelink?
-BookmarkEditorToadlet.invalidKey=La chiave Freenet non ?? valida.
+BookmarkEditorToadlet.invalidKey=La chiave Freenet non ??? valida.
 BookmarkEditorToadlet.invalidKeyTitle=Chiave non valida
 BookmarkEditorToadlet.invalidKeyWithReason=Chiave Freenet non valida.
 BookmarkEditorToadlet.keyLabel=Chiave :
-BookmarkEditorToadlet.moveDown=Gi??
+BookmarkEditorToadlet.moveDown=Gi???
 BookmarkEditorToadlet.moveUp=Su
 BookmarkEditorToadlet.myBookmarksTitle=I Miei Segnalibri
 BookmarkEditorToadlet.nameLabel=Nome :
@@ -49,18 +51,18 @@
 BookmarkEditorToadlet.save=Salva
 BookmarkEditorToadlet.title=Modifica Preferiti
 BookmarkEditorToadlet.urlDecodeError=Errore nella decodifica della URL
-BookmarkItem.bookmarkUpdated=Il sito ${name} ?? stato aggiornato all'edizione 
${edition}.
+BookmarkItem.bookmarkUpdated=Il sito ${name} ??? stato aggiornato all'edizione 
${edition}.
 BookmarkItem.bookmarkUpdatedShort=Freesite aggiornato: ${name}
 BookmarkItem.bookmarkUpdatedTitle=${name}: link aggiornato
-BookmarkItem.bookmarkUpdatedWithLink=Il Sito ${link}${name}${/link} ?? stato 
aggiornato all'edizione ${edition}.
+BookmarkItem.bookmarkUpdatedWithLink=Il Sito ${link}${name}${/link} ??? stato 
aggiornato all'edizione ${edition}.
 BookmarkItem.deleteBookmarkUpdateNotification=Elimina notifica
 BookmarkItem.unnamedBookmark=Segnalibro Senza Nome
 BookmarkManager.list=Segnalibri
 BookmarkManager.listLong=Lista dei freesite preferiti
 BookmarkManager.malformedBookmark=Segnalibro malformato
 BooleanOption.parseError=Booleano non riconosciuto: ${val} - prova "vero o 
falso"
-BuildOldAgeUserAlert.tooOld=Il software di questo nodo ?? antecedente alla 
pi?? vecchia versione (Build #${lastgood}) utilizzabile dai peer aggiornati ai 
quali si cerca di connettersi.  E' necessario aggiornare il nodo al pi?? presto 
possibile; non sar?? possibile connettersi ai peer etichettati "TROPPO RECENTE" 
finch?? il nodo non sar?? stato aggiornato (il nodo va tenuto aggiornato o si 
rischia di essere esclusi dalla rete Freenet)
-BuildOldAgeUserAlert.tooOldShort=Il nodo sta utilizzando una versione  di 
Freenet obsoleta al punto da rendere impossibile il collegamento alla rete. Si 
prega di eseguire l'aggiornamento al pi?? presto possibile.
+BuildOldAgeUserAlert.tooOld=Il software di questo nodo ??? antecedente alla 
pi??? vecchia versione (Build #${lastgood}) utilizzabile dai peer aggiornati ai 
quali si cerca di connettersi.  E' necessario aggiornare il nodo al pi??? 
presto possibile; non sar??? possibile connettersi ai peer etichettati "TROPPO 
RECENTE" finch??? il nodo non sar??? stato aggiornato (il nodo va tenuto 
aggiornato o si rischia di essere esclusi dalla rete Freenet)
+BuildOldAgeUserAlert.tooOldShort=Il nodo sta utilizzando una versione  di 
Freenet obsoleta al punto da rendere impossibile il collegamento alla rete. Si 
prega di eseguire l'aggiornamento al pi??? presto possibile.
 BuildOldAgeUserAlert.tooOldTitle=Versione obsoleta
 CSSTokenizerFilter.deletedDisallowedString=Stringa non permessa eliminata
 CSSTokenizerFilter.deletedUnmatchedChar=Ignorato char non corrispondente:
@@ -69,9 +71,9 @@
 CSSTokenizerFilter.invalidURLContents=Contenuto della url() non valido
 CSSTokenizerFilter.supplementalCharsNotSupported=CARATTERI UCS-4 OLTRE 0xFFFF 
NON SUPPORTATI!
 CSSTokenizerFilter.unknownAtIdentifierLabel=@identifier sconosciuto:
-ClockProblemDetectedUserAlert.shortText=Freenet non pu?? connettersi perch?? 
l'orologio del computer non ?? sincronizzato.
-ClockProblemDetectedUserAlert.text=Freenet ha rilevato che l'orologio di 
sistema (ora e data) non ?? regolato correttamente. Il nodo non potr?? 
funzionare correttamente finch?? non sar?? stato riavviato dopo aver regolato 
l'orologio.
-ClockProblemDetectedUserAlert.title=L'orologio del computer non ?? regolato 
correttamente.
+ClockProblemDetectedUserAlert.shortText=Freenet non pu??? connettersi perch??? 
l'orologio del computer non ??? sincronizzato.
+ClockProblemDetectedUserAlert.text=Freenet ha rilevato che l'orologio di 
sistema (ora e data) non ??? regolato correttamente. Il nodo non potr??? 
funzionare correttamente finch??? non sar??? stato riavviato dopo aver regolato 
l'orologio.
+ClockProblemDetectedUserAlert.title=L'orologio del computer non ??? regolato 
correttamente.
 ConfigToadlet.appliedFailureExceptions=Le modifiche alla configurazione sono 
state applicate con le seguenti eccezioni:
 ConfigToadlet.appliedFailureTitle=Configurazione Non Applicata!
 ConfigToadlet.appliedSuccess=Le modifiche alla configurazione sono state 
applicate.
@@ -80,7 +82,7 @@
 ConfigToadlet.configNavTitle=Esplora Configurazione
 ConfigToadlet.console=console
 ConfigToadlet.contributeTranslation=Contribuisci alla traduzione
-ConfigToadlet.defaultIs=Il valore predefinito per l'opzione di configurazione 
??: '${default}'.
+ConfigToadlet.defaultIs=Il valore predefinito per l'opzione di configurazione 
???: '${default}'.
 ConfigToadlet.false=falso
 ConfigToadlet.fcp=fcp
 ConfigToadlet.fproxy=fproxy
@@ -95,7 +97,7 @@
 ConfigToadlet.returnToNodeConfig=Torna alla configurazione del nodo
 ConfigToadlet.returnToNodeHomepage=Torna alla homepage del nodo
 ConfigToadlet.shortTitle=Configurazione
-ConfigToadlet.ssl=SSL (il cambiamento non influisce sui server attivi, il 
riavviamento ?? necessario)
+ConfigToadlet.ssl=SSL (il cambiamento non influisce sui server attivi, il 
riavviamento ??? necessario)
 ConfigToadlet.title=Configurazione del Nodo Freenet
 ConfigToadlet.toadletsymlinker=toadletsymlinker
 ConfigToadlet.true=vero
@@ -107,8 +109,8 @@
 ConfigToadlet.node.scheduler=nodo.schedulatore
 ConfigToadlet.node.testnet=nodo.testnet
 ConfigToadlet.node.updater=nodo.aggiornamento
-ConfigurablePersister.doesNotExistCannotCreate=Il file non esiste e non pu?? 
essere creato
-ConfigurablePersister.existsCannotReadWrite=Il file esiste ma non pu?? essere 
letto/scritto
+ConfigurablePersister.doesNotExistCannotCreate=Il file non esiste e non pu??? 
essere creato
+ConfigurablePersister.existsCannotReadWrite=Il file esiste ma non pu??? essere 
letto/scritto
 ConnectionsToadlet.nodeStatus.BACKED OFF=RESPINTO
 ConnectionsToadlet.nodeStatus.BURSTING=BURST
 ConnectionsToadlet.nodeStatus.BUSY=OCCUPATO
@@ -128,8 +130,8 @@
 ConnectivityToadlet.addressTitle=Indirizzo
 ConnectivityToadlet.byIPTitle=Pachetti per ${ip} per indirizzo IP - ${status} 
(lunghezza minima tunnel ${tunnelLength})
 ConnectivityToadlet.byPortTitle=Pacchetti per ${port} per porta - ${status} 
(lunghezza minima tunnel ${tunnelLength})
-ConnectivityToadlet.connectivity=Connettivit?? Internet
-ConnectivityToadlet.connectivityTitle=Connettivit??
+ConnectivityToadlet.connectivity=Connettivit??? Internet
+ConnectivityToadlet.connectivityTitle=Connettivit???
 ConnectivityToadlet.firstReceiveLeadTime=Da online a prima ricezione
 ConnectivityToadlet.firstSendLeadTime=Da start a prima trasmissione
 ConnectivityToadlet.local=LOCALE
@@ -137,9 +139,9 @@
 ConnectivityToadlet.noreply=NESSUNA RISPOSTA
 ConnectivityToadlet.remote=REMOTO
 ConnectivityToadlet.sentReceivedTitle=Pacchetti ricevuti/trasmessi
-ConnectivityToadlet.summaryTitle=Connettivit??
-ConnectivityToadlet.title=Connettivit?? internet di ${nodeName}
-ContentDataFilter.unknownCharset=La pagina che sta per essere visualizzata 
utilizza un formato di caratteri (charset) di tipo sconosciuto. Ci?? rende 
impossibile filtrare la pagina, il che potrebbe a sua volta compromettere 
l'anonimato dell'utente.
+ConnectivityToadlet.summaryTitle=Connettivit???
+ConnectivityToadlet.title=Connettivit??? internet di ${nodeName}
+ContentDataFilter.unknownCharset=La pagina che sta per essere visualizzata 
utilizza un formato di caratteri (charset) di tipo sconosciuto. Ci??? rende 
impossibile filtrare la pagina, il che potrebbe a sua volta compromettere 
l'anonimato dell'utente.
 ContentDataFilter.unknownCharsetTitle=Charset sconosciuto!
 ContentDataFilter.warningUnknownCharsetTitle=Attenzione: charset sconosciuto 
(${charset})
 ContentFilter.applicationPdfReadAdvice=Documento Adobe(R) PDF - MOLTO 
PERICOLOSO!
@@ -149,90 +151,90 @@
 ContentFilter.imageIcoReadAdvice=File icona: probabilmente non pericoloso
 ContentFilter.imageIcoWriteAdvice=File icona - probabilmente non pericoloso 
(ma potrebbe contenere altri dati)
 ContentFilter.imageJpegReadAdvice=Immagine JPEG - probabilmente non pericoloso
-ContentFilter.imageJpegWriteAdvice=Immagine JPEG - probabilmente non 
pericoloso ma pu?? contenere dati EXIF
+ContentFilter.imageJpegWriteAdvice=Immagine JPEG - probabilmente non 
pericoloso ma pu??? contenere dati EXIF
 ContentFilter.imagePngReadAdvice=Immagine PNG - probabilmente non pericoloso
 ContentFilter.imagePngWriteAdvice=Immagine PNG -  probabilmente non pericoloso 
ma sarebbe opportuno eliminare eventuali commenti e porzioni di testo
-ContentFilter.textCssReadAdvice=CSS (cascading style sheet, di solito ?? usato 
in combinazione con HTML) - probabilmente non pericoloso se filtrato, ma il 
filtro non ?? del tipo "whitelist" quindi fare attenzione
-ContentFilter.textCssWriteAdvice=CSS (cascading style sheet, solitamente usato 
con HTML) - pu?? contenere metadati, controllare manualmente
+ContentFilter.textCssReadAdvice=CSS (cascading style sheet, di solito ??? 
usato in combinazione con HTML) - probabilmente non pericoloso se filtrato, ma 
il filtro non ??? del tipo "whitelist" quindi fare attenzione
+ContentFilter.textCssWriteAdvice=CSS (cascading style sheet, solitamente usato 
con HTML) - pu??? contenere metadati, controllare manualmente
 ContentFilter.textHtmlReadAdvice=HTML - Non pericoloso se filtrato
-ContentFilter.textHtmlWriteAdvice=HTML - pu?? contenere metadati di tipo 
pericoloso, ecc; si consiglia di controllare manualmente
-ContentFilter.textPlainReadAdvice=Formato testo semplice (plain text)- non ?? 
pericoloso a meno che il browser utilizzato non sia particolarmente "stupido" 
(per esempio Internet Explorer)
+ContentFilter.textHtmlWriteAdvice=HTML - pu??? contenere metadati di tipo 
pericoloso, ecc; si consiglia di controllare manualmente
+ContentFilter.textPlainReadAdvice=Formato testo semplice (plain text)- non ??? 
pericoloso a meno che il browser utilizzato non sia particolarmente "stupido" 
(per esempio Internet Explorer)
 ContentFilter.textPlainWriteAdvice=Testo semplice (plain text) - non 
pericoloso a meno che l'utente vi includa informazioni compromettenti
 DarknetConnectionsToadlet.activityInserts=Inserzioni: ${totalSenders} totale 
senders, ${CHKhandlers} CHK handlers, ${SSKhandlers} SSK handlers
 DarknetConnectionsToadlet.activityRequests=Richieste: ${totalSenders} totale 
senders, ${CHKhandlers} CHK handlers, ${SSKhandlers} SSK handlers
-DarknetConnectionsToadlet.activityTitle=Attivit?? Corrente
+DarknetConnectionsToadlet.activityTitle=Attivit??? Corrente
 DarknetConnectionsToadlet.add=Aggiungi
 DarknetConnectionsToadlet.addPeerTitle=Aggiungi un peer
-DarknetConnectionsToadlet.alreadyInReferences=La referenza data ?? gi?? 
presente in lista.
-DarknetConnectionsToadlet.backedOff=Connesso ma respinto: Il nodo ?? connesso 
a questi peer ma la la connessione viene rifiutata e quindi i peer in questione 
non vengono al momento utilizzati per l'instradamento delle richieste
+DarknetConnectionsToadlet.alreadyInReferences=La referenza data ??? gi??? 
presente in lista.
+DarknetConnectionsToadlet.backedOff=Connesso ma respinto: Il nodo ??? connesso 
a questi peer ma la la connessione viene rifiutata e quindi i peer in questione 
non vengono al momento utilizzati per l'instradamento delle richieste
 DarknetConnectionsToadlet.backedOffShort=Respinti
-DarknetConnectionsToadlet.bursting=Non connesso e bursting: per un breve 
periodo, il nodo sta tentando di connettersi a questi peer perch?? l'utenete ha 
impostato burstOnly su di essi
+DarknetConnectionsToadlet.bursting=Non connesso e bursting: per un breve 
periodo, il nodo sta tentando di connettersi a questi peer perch??? l'utenete 
ha impostato burstOnly su di essi
 DarknetConnectionsToadlet.burstingShort=Bursting
-DarknetConnectionsToadlet.busy=Occupati: Questi peer sono connessi ma ci 
comunicano di essere troppo occupati per poter aggiungere le nostre richieste a 
quelle gi?? presenti quindi non vengono temporaneamente utilizzati per 
l'instradamento.
+DarknetConnectionsToadlet.busy=Occupati: Questi peer sono connessi ma ci 
comunicano di essere troppo occupati per poter aggiungere le nostre richieste a 
quelle gi??? presenti quindi non vengono temporaneamente utilizzati per 
l'instradamento.
 DarknetConnectionsToadlet.busyShort=Occupati
 DarknetConnectionsToadlet.cancel=Cancella
-DarknetConnectionsToadlet.cantFetchNoderefURL=Non ?? stato possibile 
richiamare la referenza di un nodo da ${url}. Riprovare.
-DarknetConnectionsToadlet.cantParseTryAgain=Non ?? stato possibile 
interpretare it testo dato come refernza di un nodo: (${error}).
-DarknetConnectionsToadlet.cantParseWrongEnding=Non ?? stato possibile 
interpretare le referenza: L'ultimo rigo dovrebbe contenere solo la parola End, 
esso contiene invece: ${end}
-DarknetConnectionsToadlet.clockProblem=L'orologio di sitema e l'orologio del 
nodo differiscono di oltre 24 ore.  Ci?? potrebbe causare problemi con 
l'aggiornamento e con i client. La connessione ?? stata pertanto disabilitata,
+DarknetConnectionsToadlet.cantFetchNoderefURL=Non ??? stato possibile 
richiamare la referenza di un nodo da ${url}. Riprovare.
+DarknetConnectionsToadlet.cantParseTryAgain=Non ??? stato possibile 
interpretare it testo dato come refernza di un nodo: (${error}).
+DarknetConnectionsToadlet.cantParseWrongEnding=Non ??? stato possibile 
interpretare le referenza: L'ultimo rigo dovrebbe contenere solo la parola End, 
esso contiene invece: ${end}
+DarknetConnectionsToadlet.clockProblem=L'orologio di sitema e l'orologio del 
nodo differiscono di oltre 24 ore.  Ci??? potrebbe causare problemi con 
l'aggiornamento e con i client. La connessione ??? stata pertanto disabilitata,
 DarknetConnectionsToadlet.clockProblemShort=Problema di sincronizzazione 
orologio
-DarknetConnectionsToadlet.confirmRemoveNode=Conferma rimozione di "${name}" ? 
Rimuovere un nodo che ?? stato disconnesso per meno di una settimana non ?? 
consigliabile. L'azione pi?? appropriata sarebbe di attendere ancora un po', 
considerando che potrebbe trattarsi di un problema temporaneo, e che ci sono 
utenti che non hanno la possibilit?? lasciar girare il proprio nodo giorno e 
notte.
+DarknetConnectionsToadlet.confirmRemoveNode=Conferma rimozione di "${name}" ? 
Rimuovere un nodo che ??? stato disconnesso per meno di una settimana non ??? 
consigliabile. L'azione pi??? appropriata sarebbe di attendere ancora un po', 
considerando che potrebbe trattarsi di un problema temporaneo, e che ci sono 
utenti che non hanno la possibilit??? lasciar girare il proprio nodo giorno e 
notte.
 DarknetConnectionsToadlet.confirmRemoveNodeTitle=Conferma
 DarknetConnectionsToadlet.confirmRemoveNodeWarningTitle=Rimozione Nodo
 DarknetConnectionsToadlet.connError=Connessione fallita (il nodo ha un 'bug'?)
 DarknetConnectionsToadlet.connErrorShort=Errore di Connessione
-DarknetConnectionsToadlet.connected=Connesso: Il nodo ?? connesso a questi 
peer:
+DarknetConnectionsToadlet.connected=Connesso: Il nodo ??? connesso a questi 
peer:
 DarknetConnectionsToadlet.connectedShort=Connessi
 DarknetConnectionsToadlet.darknetFnpPort=Darknet FNP: ${port}/UDP (usata per 
connessioni a peer affidabili. Forwardare se possibile)
 DarknetConnectionsToadlet.disabled=Non connesso e disabilitato: L'utente ha 
configurato il nodo in maniera da non connettersi a questo peer.
 DarknetConnectionsToadlet.disabledShort=Disabilitato
-DarknetConnectionsToadlet.disconnecting=Disconnessione in corso (si sta 
procedendo alla rimozione del nodo; ?? necessario informare il nodo in 
questione e ci?? potrebbe richiedere un po' di tempo)
+DarknetConnectionsToadlet.disconnecting=Disconnessione in corso (si sta 
procedendo alla rimozione del nodo; ??? necessario informare il nodo in 
questione e ci??? potrebbe richiedere un po' di tempo)
 DarknetConnectionsToadlet.disconnectingShort=Disconnessione in corso
 DarknetConnectionsToadlet.enterDescription=Inserisci descrizione:
 DarknetConnectionsToadlet.failedToAddNodeInternalError=Impossibile 
interpretare il testo dato comereferenza di un nodo Freenet. Si prega di 
riportare agli sviluppatori quanto segue:
 DarknetConnectionsToadlet.failedToAddNodeInternalErrorTitle=Aggiunta nuovo 
nodo fallita: Errore interno.
 DarknetConnectionsToadlet.failedToAddNodeTitle=Aggiunta Nodo Fallita
-DarknetConnectionsToadlet.fcpDisabled=FCP non ?? abilitato (per applicazioni 
client di Freenet come Frost e Thaw)
+DarknetConnectionsToadlet.fcpDisabled=FCP non ??? abilitato (per applicazioni 
client di Freenet come Frost e Thaw)
 DarknetConnectionsToadlet.fcpPort=FCP: ${port}/tcp (per le applicazioni client 
di Freenet, per esempio Frost e Thaw)
 DarknetConnectionsToadlet.fileReference=Seleziona il file contenente la 
referenza:
-DarknetConnectionsToadlet.fnpPort=FNP: ${port}/udp (Comunicazione tra nodi. Di 
solito questa ?? l'unica porta che si potrebbe aver bisogno di forwardare)
+DarknetConnectionsToadlet.fnpPort=FNP: ${port}/udp (Comunicazione tra nodi. Di 
solito questa ??? l'unica porta che si potrebbe aver bisogno di forwardare)
 DarknetConnectionsToadlet.forceRemove=Rimozione Forzata
-DarknetConnectionsToadlet.fproxyDisabled=FProxy non ?? abilitato (questa 
interfaccia web)
+DarknetConnectionsToadlet.fproxyDisabled=FProxy non ??? abilitato (questa 
interfaccia web)
 DarknetConnectionsToadlet.fproxyPort=FProxy: ${port}/tcp (questa interfaccia 
web)
 DarknetConnectionsToadlet.fullTitle=${counts} Amici (peer affidabili) di 
${name}
 DarknetConnectionsToadlet.go=Vai
-DarknetConnectionsToadlet.idleTime=Tempo trascorso da quando il nodo ?? 
connesso o da quando lo ?? stato per l'ultima volta
+DarknetConnectionsToadlet.idleTime=Tempo trascorso da quando il nodo ??? 
connesso o da quando lo ??? stato per l'ultima volta
 DarknetConnectionsToadlet.idleTimeTitle=Connesso / Inattivo
-DarknetConnectionsToadlet.invalidSignature=Non ?? stato possibile verificare 
le firma elettronica della refernza (${error}).
+DarknetConnectionsToadlet.invalidSignature=Non ??? stato possibile verificare 
le firma elettronica della refernza (${error}).
 DarknetConnectionsToadlet.ipAddress=Indirizzo del nodo in formato IP:porta
 DarknetConnectionsToadlet.ipAddressTitle=Indirizzo
-DarknetConnectionsToadlet.listenOnly=Non connesso e solo ascolto: il nodo non 
cercher?? di connettersi a questo peer perch?? l'utente l'ha impostato su solo 
ascolto (listenOnly)
+DarknetConnectionsToadlet.listenOnly=Non connesso e solo ascolto: il nodo non 
cercher??? di connettersi a questo peer perch??? l'utente l'ha impostato su 
solo ascolto (listenOnly)
 DarknetConnectionsToadlet.listenOnlyShort=Solo ascolto
-DarknetConnectionsToadlet.listening=Non connesso ma in ascolto: il nodo non 
cercher?? spesso di connettersi con questo peer perch?? l'utente l'ha impostato 
su burstOnly
+DarknetConnectionsToadlet.listening=Non connesso ma in ascolto: il nodo non 
cercher??? spesso di connettersi con questo peer perch??? l'utente l'ha 
impostato su burstOnly
 DarknetConnectionsToadlet.listeningShort=Ascolto
 DarknetConnectionsToadlet.myFriends=I Miei Amici (peer affidabili aggiunti da 
me)
 DarknetConnectionsToadlet.myReferenceHeader=${linkref}Referenza del 
Nodo${/linkref} (${linktext}testo${/linktext})
 DarknetConnectionsToadlet.nameClickToMessage=Nome del nodo. Clicca sul nome 
per mandare un messaggio a questo peer:
 DarknetConnectionsToadlet.nameTitle=Nome
-DarknetConnectionsToadlet.neverConnected=Mai Connesso. Questo peer non ?? mai 
stato connesso al nostro nodo.
+DarknetConnectionsToadlet.neverConnected=Mai Connesso. Questo peer non ??? mai 
stato connesso al nostro nodo.
 DarknetConnectionsToadlet.neverConnectedShort=Mai connesso
-DarknetConnectionsToadlet.noPeersFirstHalf=Freenet non pu?? funzionare perch?? 
non sono stati ancora aggiunti dei peer ai quali connettersi.
+DarknetConnectionsToadlet.noPeersFirstHalf=Freenet non pu??? funzionare 
perch??? non sono stati ancora aggiunti dei peer ai quali connettersi.
 DarknetConnectionsToadlet.noPeersSecondHalf=Leggi l'infobox in alto per vedere 
come si fa.
-DarknetConnectionsToadlet.noPeersWithHomepageLink=Freenet non pu?? funzionare 
perch?? non sono ancora stati aggiunti dei peer ai quali collegarsi. Alla 
pagina ${link}node homepage${/link}, in alto, si pu?? leggere come fare.
-DarknetConnectionsToadlet.noRefOrURL=Non ?? stato possibile rilevare una 
referenza nodo o una URL. Si prega di riprovare.
+DarknetConnectionsToadlet.noPeersWithHomepageLink=Freenet non pu??? funzionare 
perch??? non sono ancora stati aggiunti dei peer ai quali collegarsi. Alla 
pagina ${link}node homepage${/link}, in alto, si pu??? leggere come fare.
+DarknetConnectionsToadlet.noRefOrURL=Non ??? stato possibile rilevare una 
referenza nodo o una URL. Si prega di riprovare.
 DarknetConnectionsToadlet.noRequests=Al momento, il nodo non sta elaborando 
alcuna richiesta.
 DarknetConnectionsToadlet.nodeHomepage=homepage del nodo
 DarknetConnectionsToadlet.nodePortsTitle=Porte utilizzate dal Nodo
 DarknetConnectionsToadlet.notConnected=Non connesso: Finora non ci sono state 
connessioni ma il nodo cerca continuamente di connettersi
 DarknetConnectionsToadlet.notConnectedShort=Disconnessi
-DarknetConnectionsToadlet.opennetFnpPort=Opennet FNP: ${port}/UDP (usata per 
connessioni a peer non affidabili, cio?? Sconosciuti. Forwardare se possibile)
-DarknetConnectionsToadlet.pasteReference=Incolla la referenza qui (il nodo 
elliminer?? automaticamente le parti aggiunte da chat clients, p.es. <toad_>) :
+DarknetConnectionsToadlet.opennetFnpPort=Opennet FNP: ${port}/UDP (usata per 
connessioni a peer non affidabili, cio??? Sconosciuti. Forwardare se possibile)
+DarknetConnectionsToadlet.pasteReference=Incolla la referenza qui (il nodo 
elliminer??? automaticamente le parti aggiunte da chat clients, p.es. <toad_>) :
 DarknetConnectionsToadlet.privateNote=Un commento privato relativo a questo 
nodo:
 DarknetConnectionsToadlet.privateNoteTitle=Nota Privata
-DarknetConnectionsToadlet.referenceCopyWarning=La referenza del nodo va 
copiata ${bold}SENZA VARIAZIONI${/bold}. Qualsiasi modificazione la render?? 
${bold}inutilizzabile${/bold}..
+DarknetConnectionsToadlet.referenceCopyWarning=La referenza del nodo va 
copiata ${bold}SENZA VARIAZIONI${/bold}. Qualsiasi modificazione la render??? 
${bold}inutilizzabile${/bold}..
 DarknetConnectionsToadlet.remove=Elimina
 DarknetConnectionsToadlet.removePeers=Elimina peer selezionati
-DarknetConnectionsToadlet.routingDisabled=Non sta instradando traffico: (la 
connessione tra nodo locale e remoto ?? attiva ma uno dei due rifiuta di 
instradare traffico)
+DarknetConnectionsToadlet.routingDisabled=Non sta instradando traffico: (la 
connessione tra nodo locale e remoto ??? attiva ma uno dei due rifiuta di 
instradare traffico)
 DarknetConnectionsToadlet.routingDisabledShort=Non instrada traffico
 DarknetConnectionsToadlet.seedClients=Nodi per i quali il nodo locale sta 
facendo da seednode.
 DarknetConnectionsToadlet.seedClientsShort=Seeding per
@@ -243,38 +245,38 @@
 DarknetConnectionsToadlet.sendMessageToPeers=Manda messaggio ai peer 
selezionati
 DarknetConnectionsToadlet.separator=-- -- --
 DarknetConnectionsToadlet.statusTitle=Status
-DarknetConnectionsToadlet.tmciDisabled=TMCI non ?? abilitato (semplice 
interfaccia a comandi testuali simile a telnet)
+DarknetConnectionsToadlet.tmciDisabled=TMCI non ??? abilitato (semplice 
interfaccia a comandi testuali simile a telnet)
 DarknetConnectionsToadlet.tmciPort=TMCI: ${port}/tcp (semplice interfaccia a 
comandi testuali simile a telnet)
 DarknetConnectionsToadlet.tooNew=Connesso ma troppo recente: La versione 
obbligatoria minima di questo peer e' maggiore della versione che stiamo 
utilizzando.
 DarknetConnectionsToadlet.tooNewShort=Troppo recente
-DarknetConnectionsToadlet.tooOld=Connesso ma obsoleto: Questo peer sta usando 
una versione obsoleta di Freenet. Esso non sar?? utilizzato per l'instradamento 
delle richieste.
+DarknetConnectionsToadlet.tooOld=Connesso ma obsoleto: Questo peer sta usando 
una versione obsoleta di Freenet. Esso non sar??? utilizzato per 
l'instradamento delle richieste.
 DarknetConnectionsToadlet.tooOldShort=Obsoleti
 DarknetConnectionsToadlet.transferringRequests=Richieste trasferimento: invio 
${senders}, ricezione ${receivers}
-DarknetConnectionsToadlet.triedToAddSelf=Non ?? possibile aggiungere il 
proprio stesso nodo ad una lista di peer remoti.
-DarknetConnectionsToadlet.unauthorized=L'accesso a questa pagina ?? 
interedetto.
+DarknetConnectionsToadlet.triedToAddSelf=Non ??? possibile aggiungere il 
proprio stesso nodo ad una lista di peer remoti.
+DarknetConnectionsToadlet.unauthorized=L'accesso a questa pagina ??? 
interedetto.
 DarknetConnectionsToadlet.unknownAddress=(indirizzo sconosciuto)
 DarknetConnectionsToadlet.updateChangedPrivnotes=Aggiorna commenti
 DarknetConnectionsToadlet.urlReference=Inserire qui la URL della referenza:
 DarknetConnectionsToadlet.versionTitle=Versione
 ExtOldAgeUserAlert.extTooOld=Il file freenet-ext.jar sembra essere corrotto od 
obsoleto: Per l'aggiornamento usare 
http://downloads.freenetproject.org/alpha/freenet-ext.jar
-ExtOldAgeUserAlert.extTooOldShort=Il file freenet-ext.jar ?? obsoleto. Si 
prega di aggiornarlo.
+ExtOldAgeUserAlert.extTooOldShort=Il file freenet-ext.jar ??? obsoleto. Si 
prega di aggiornarlo.
 ExtOldAgeUserAlert.extTooOldTitle=Freenet-ext obsoleto
 FProxyToadlet.abortToHomepage=Interrompi e ritorna alla homepage di FProxy
 FProxyToadlet.alerts=Messaggi dettagliati sullo stato del nodo
 FProxyToadlet.alertsTitle=Avvertenze
 FProxyToadlet.backToFProxy=${link}Clicca qui${/link} per andare alla homepage 
di FProxy
 FProxyToadlet.backToReferrer=${link}Clicca qui${/link} per tornare alla pagina 
referente.
-FProxyToadlet.cantBindPort=Non ?? possibile abbinare FProxy a quella porta!
+FProxyToadlet.cantBindPort=Non ??? possibile abbinare FProxy a quella porta!
 FProxyToadlet.config=configura il nodo
 FProxyToadlet.configTitle=Configurazione
 FProxyToadlet.dangerousContentTitle=Contenuto Potenzialmente Pericoloso
-FProxyToadlet.dangerousRSS=Il file richiesto potrebbe essere RSS. Questo tipo 
di file non pu?? essere filtrato  da Freenet nel modo giusto, ed inoltre 
potrebbe contenere dei difetti (web-bugs) come immagini in-line ecc, che 
potrebbero esporre l'indirizzo IP del computer in uso ad eventuali 
siti-trappola e pertanto mettere a serio rischio l'anonimato dell'utente. 
Firefox 2.0 e Internet Explorer 7.0 aprono il file come RSS anche se la 
tipologia del contentuto (content type) ?? "${type}".
+FProxyToadlet.dangerousRSS=Il file richiesto potrebbe essere RSS. Questo tipo 
di file non pu??? essere filtrato  da Freenet nel modo giusto, ed inoltre 
potrebbe contenere dei difetti (web-bugs) come immagini in-line ecc, che 
potrebbero esporre l'indirizzo IP del computer in uso ad eventuali 
siti-trappola e pertanto mettere a serio rischio l'anonimato dell'utente. 
Firefox 2.0 e Internet Explorer 7.0 aprono il file come RSS anche se la 
tipologia del contentuto (content type) ??? "${type}".
 FProxyToadlet.dangerousRSSSubtitle=I feed RSS possono costituire un pericolo
 FProxyToadlet.dangerousRSSTitle=Contentuto Potenzialmente Pericoloso (RSS)
 FProxyToadlet.downloadInBackgroundToDisk=Scarica in background e conserva 
nella directory dei download
-FProxyToadlet.errorIsFatal=Questo ?? un errore grave (fatal error). Riprovare 
probabilmente non risolver?? il problema.
+FProxyToadlet.errorIsFatal=Questo ??? un errore grave (fatal error). Riprovare 
probabilmente non risolver??? il problema.
 FProxyToadlet.errorWithReason=Errore: ${error}
-FProxyToadlet.expectedKeyButGot=Invece di una chiave Freenet, ?? stato 
ricevuto:
+FProxyToadlet.expectedKeyButGot=Invece di una chiave Freenet, ??? stato 
ricevuto:
 FProxyToadlet.expectedMimeType=MIME type che ci si aspettava: ${mime}
 FProxyToadlet.explanationTitle=Spiegazione
 FProxyToadlet.fetchLargeFileAnywayAndDisplay=Apri comunque e mostra il file 
nel browser
@@ -291,19 +293,19 @@
 FProxyToadlet.invalidKeyTitle=Chiave non valida
 FProxyToadlet.invalidKeyWithReason=Chiave non valida: ${reason}
 FProxyToadlet.largeFile=File di grosse dimensioni
-FProxyToadlet.largeFileExplanationAndOptions=La chiave Freenet richiesta fa 
riferimento a un file di grosse dimensioni.I file cos?? grandi di solito non 
possono essere mandati direttamente al browser perch?? il nodo avrebbe bisogno 
di troppo tempo per richiamarli. Le seguenti opzioni sono disponibili:
-FProxyToadlet.mayChange=(pu?? cambiare)
+FProxyToadlet.largeFileExplanationAndOptions=La chiave Freenet richiesta fa 
riferimento a un file di grosse dimensioni.I file cos??? grandi di solito non 
possono essere mandati direttamente al browser perch??? il nodo avrebbe bisogno 
di troppo tempo per richiamarli. Le seguenti opzioni sono disponibili:
+FProxyToadlet.mayChange=(pu??? cambiare)
 FProxyToadlet.mimeType=MIME type: ${mime}
 FProxyToadlet.notEnoughMetaStrings=Non ci sono abbastanza meta-strings
 FProxyToadlet.notFoundTitle=Non Trovato
-FProxyToadlet.openAsText=${link}Clicca qui${/link} per aprire il file come 
testo 'liscio' (plain text) . Questo non dovrebbe essere pericoloso ma la 
visualizzazione pu?? risultare disturbata.
+FProxyToadlet.openAsText=${link}Clicca qui${/link} per aprire il file come 
testo 'liscio' (plain text) . Questo non dovrebbe essere pericoloso ma la 
visualizzazione pu??? risultare disturbata.
 FProxyToadlet.openForce=${link}Clicca qui${/link} per aprire il file come 
${mime} (leggi l'avvertenza sopra!).
 FProxyToadlet.openForceDisk=${link}Clicca qui${/link} per forzare il browser a 
scaricare il file su disco.
 FProxyToadlet.openPossRSSAsForceDisk=${link}Clicka qui${/link} per scaricare 
il file su disco (${bold}possibile pericolo${/bold} se si sta usando Firefox 
2.0.0.0; il problema dovrebbe essere stato risolto in 2.0.0.1
-FProxyToadlet.openPossRSSAsPlainText=${link}Clicca qui${/link} per aprire il 
file come testo 'liscio' (plain text) (ci?? ${bold}pu?? rappresentare un 
pericolo${/bold} se si sta usando IE7 o FF2).
-FProxyToadlet.openPossRSSForceDisk=${link}Clicca qui${/link} per cercare di 
costringere il browser a scaricare il file su disco (${bold}Pu?? essere 
pericoloso se si sta usando Firefox 2.0.0${/bold} ; il problema dovrebbe essere 
risolto in 2.0.1).
-FProxyToadlet.openRSSAsRSS=${link}Clicca qui${/link} per aprire il file come 
RSS (ci?? ${bold}rappresenta un pericolo${/bold} se l'autore del sito ?? mal 
intenzionato, perch?? il filtraggio di RSS in Freenet non ?? ancora stato 
implementato).
-FProxyToadlet.openRSSForce=${link}Clicca qui${/link} per aprire il file come 
${mime} (ci?? ${bold}pu?? costituire un pericolo${/bold} se si usa IE7 o FF2).
+FProxyToadlet.openPossRSSAsPlainText=${link}Clicca qui${/link} per aprire il 
file come testo 'liscio' (plain text) (ci??? ${bold}pu??? rappresentare un 
pericolo${/bold} se si sta usando IE7 o FF2).
+FProxyToadlet.openPossRSSForceDisk=${link}Clicca qui${/link} per cercare di 
costringere il browser a scaricare il file su disco (${bold}Pu??? essere 
pericoloso se si sta usando Firefox 2.0.0${/bold} ; il problema dovrebbe essere 
risolto in 2.0.1).
+FProxyToadlet.openRSSAsRSS=${link}Clicca qui${/link} per aprire il file come 
RSS (ci??? ${bold}rappresenta un pericolo${/bold} se l'autore del sito ??? mal 
intenzionato, perch??? il filtraggio di RSS in Freenet non ??? ancora stato 
implementato).
+FProxyToadlet.openRSSForce=${link}Clicca qui${/link} per aprire il file come 
${mime} (ci??? ${bold}pu??? costituire un pericolo${/bold} se si usa IE7 o FF2).
 FProxyToadlet.opennet=gestisci connessioni non affidabili
 FProxyToadlet.opennetTitle=Sconosciuti
 FProxyToadlet.options=Opzioni disponibili:
@@ -320,36 +322,36 @@
 FProxyToadlet.statsTitle=Statistiche
 FProxyToadlet.translation=helper per tradurre l'interfaccia del nodo nella tua 
lingua
 FProxyToadlet.translationTitle=Traduzione
-FProxyToadlet.unableToRetrieve=Non ?? stato possibile richiamare questo file.
+FProxyToadlet.unableToRetrieve=Non ??? stato possibile richiamare questo file.
 FProxyToadlet.unknownMIMEType=MIME type: sconosciuto
 FProxyToadlet.welcome=homepage
 FProxyToadlet.welcomeTitle=Home
 FcpServer.allowedHosts=Host abilitati (Leggere l'avvertenza)
-FcpServer.allowedHostsFullAccess=Host ai quali ?? consentito accesso pieno
+FcpServer.allowedHostsFullAccess=Host ai quali ??? consentito accesso pieno
 FcpServer.allowedHostsFullAccessLong=Indirizzi IP ai quali e' consentito pieno 
accesso al nodo. I client su questi IP possono riavviare il nodo, 
riconfigurarlo ecc. Attenzione: a *tutti* I client e' consentito di fare I/O 
diretto sul disco
-FcpServer.allowedHostsLong=Indirizzi IP ai quali ?? consentito connettersi al 
server FCP. Pu?? essere una lista di di IP singoli separati da virgole e 
indirizzi IP in formato CIDR come 192.168.0.0/24. AVVERTENZA! Chiunque abbia 
accesso a FCP potr?? caricare su Freenet  qualsiasi file al quale il nodo abbia 
accesso e scaricare su disco qualsiasi file da Freenet (i file esistenti non 
verranno sovrascritti)
+FcpServer.allowedHostsLong=Indirizzi IP ai quali ??? consentito connettersi al 
server FCP. Pu??? essere una lista di di IP singoli separati da virgole e 
indirizzi IP in formato CIDR come 192.168.0.0/24. AVVERTENZA! Chiunque abbia 
accesso a FCP potr??? caricare su Freenet  qualsiasi file al quale il nodo 
abbia accesso e scaricare su disco qualsiasi file da Freenet (i file esistenti 
non verranno sovrascritti)
 FcpServer.assumeDownloadDDAIsAllowed=Presumere che il download DDA sia 
permesso?
-FcpServer.assumeDownloadDDAIsAllowedLong=Presumere che il download DDA sia 
permesso? Se impostato su 'false' bisogner?? fare una TestDDARequest prima di 
ogni accesso DDA
+FcpServer.assumeDownloadDDAIsAllowedLong=Presumere che il download DDA sia 
permesso? Se impostato su 'false' bisogner??? fare una TestDDARequest prima di 
ogni accesso DDA
 FcpServer.assumeUploadDDAIsAllowed=Presumere che l'upload di DDA sia permesso?
-FcpServer.assumeUploadDDAIsAllowedLong=Presumere che l'upload DDA Sia 
permesso? Se impostato su 'falso', bisogner?? fare una TestDDARequest prima di 
ogni accesso DDA.
+FcpServer.assumeUploadDDAIsAllowedLong=Presumere che l'upload DDA Sia 
permesso? Se impostato su 'falso', bisogner??? fare una TestDDARequest prima di 
ogni accesso DDA.
 FcpServer.bindTo=Indirizzo IP collegato
 FcpServer.bindToLong=Indirizzo IP collegato al server FCP.
-FcpServer.cannotStartOrStopOnTheFly=Non ?? possibile arrestare il server FCP 
"al volo"
-FcpServer.couldNotChangeBindTo=Non ?? stato possibile modificare l'indirizzo 
FCP collegato: ${error}.
-FcpServer.downloadsFileCanCreateCannotReadOrWrite=Il file ?? stato creato ma 
non ?? possibile leggerlo e scriverlo
-FcpServer.downloadsFileDoesNotExistCannotCreate=Il file non esiste e non ?? 
possibile crearlo
-FcpServer.downloadsFileExistsCannotReadOrWrite=Il file esiste ma non ?? 
possibile leggerlo e scriverlo
+FcpServer.cannotStartOrStopOnTheFly=Non ??? possibile arrestare il server FCP 
"al volo"
+FcpServer.couldNotChangeBindTo=Non ??? stato possibile modificare l'indirizzo 
FCP collegato: ${error}.
+FcpServer.downloadsFileCanCreateCannotReadOrWrite=Il file ??? stato creato ma 
non ??? possibile leggerlo e scriverlo
+FcpServer.downloadsFileDoesNotExistCannotCreate=Il file non esiste e non ??? 
possibile crearlo
+FcpServer.downloadsFileExistsCannotReadOrWrite=Il file esiste ma non ??? 
possibile leggerlo e scriverlo
 FcpServer.downloadsFileIsDirectory=Nome non valido per una lista di download: 
si tratta di una directory
 FcpServer.downloadsFileParentDoesNotExist=La directory superiore non esiste
-FcpServer.downloadsFileUnreadable=Il file esiste ma non ?? possibile leggerlo
+FcpServer.downloadsFileUnreadable=Il file esiste ma non ??? possibile leggerlo
 FcpServer.enablePersistentDownload=Abilitare download persistenti?
-FcpServer.enablePersistentDownloadLong=Abilita Persistence=forever 
(persistenza illimitata) per le richieste FCP. Abilitando questa opzione si 
permette alle richieste di persistere attraverso il riavvio del nodo: tali 
richieste devono essere scritte sul disco rigido e questo in alcuni casi 
particolari pu?? costituire un problema di sicurezza
+FcpServer.enablePersistentDownloadLong=Abilita Persistence=forever 
(persistenza illimitata) per le richieste FCP. Abilitando questa opzione si 
permette alle richieste di persistere attraverso il riavvio del nodo: tali 
richieste devono essere scritte sul disco rigido e questo in alcuni casi 
particolari pu??? costituire un problema di sicurezza
 FcpServer.filenameToStorePData=File contenente download persistenti
 FcpServer.filenameToStorePDataLong=File contenente download persistenti.
 FcpServer.intervalBetweenWrites=Intervallo di scrittura dei download 
persistenti su disco
 FcpServer.intervalBetweenWritesLong=Intervallo tra le scritture di download 
persistenti su disco. (millisecondi)
-FcpServer.isEnabled=FCP server ?? abilitato?
-FcpServer.isEnabledLong=FCP server ?? abilitato?
+FcpServer.isEnabled=FCP server ??? abilitato?
+FcpServer.isEnabledLong=FCP server ??? abilitato?
 FcpServer.portNumber=Numero della porta FCP
 FcpServer.portNumberLong=Numero della porta FCP.
 FcpServer.ssl=Abilitare ssl?
@@ -359,31 +361,31 @@
 FetchException.longError.11=Troppe componenti di percorso. Prova a eliminarne 
uno
 FetchException.longError.12=Errore interno relativo ai file temporanei: 
potrebbe trattarsi di esaurimento dello spazio libero su disco rigido o di un 
problema relativo a permessi ed autorizzazioni
 FetchException.longError.13=Dati non trovati
-FetchException.longError.14=Percorso non trovato: non ?? stato possobile 
trovare un numero di nodi sufficiente ad essere certi che i dati non esistono
-FetchException.longError.15=Un nodo ?? stato sovraccaricato o ?? uscito fuori 
tempo massimo
+FetchException.longError.14=Percorso non trovato: non ??? stato possobile 
trovare un numero di nodi sufficiente ad essere certi che i dati non esistono
+FetchException.longError.15=Un nodo ??? stato sovraccaricato o ??? uscito 
fuori tempo massimo
 FetchException.longError.16=Troppi redirects - loop?
 FetchException.longError.17=Errore interno, probabilmente un bug
-FetchException.longError.18=Il file ?? stato trovato ma ?? andato perso 
durante la ricezione
+FetchException.longError.18=Il file ??? stato trovato ma ??? andato perso 
durante la ricezione
 FetchException.longError.19=Errore splitfile
 FetchException.longError.2=Il nodo non sa cosa fare dello splitfile
 FetchException.longError.20=URI non valida
 FetchException.longError.21=Troppo grande
 FetchException.longError.22=Volume dei metadati troppo grande
 FetchException.longError.23=Troppi blocchi per segmento
-FetchException.longError.24=Sono necessarie pi?? metastringhe (componenti di 
percorso) nella URI
+FetchException.longError.24=Sono necessarie pi??? metastringhe (componenti di 
percorso) nella URI
 FetchException.longError.25=Annullato
 FetchException.longError.26=Archivio riavviato
 FetchException.longError.27=Redirezione permanente: usare la nuova URI
-FetchException.longError.28=Non ?? stato possibile raccogliere dati in 
quantit?? sufficiente; dati parziali sono stati richiamati ma il redirect 
potrebbe puntare su localit?? non valide
+FetchException.longError.28=Non ??? stato possibile raccogliere dati in 
quantit??? sufficiente; dati parziali sono stati richiamati ma il redirect 
potrebbe puntare su localit??? non valide
 FetchException.longError.29=MIME Type non valido: chiave non presente in lista 
di MIME type permessi fornita dal client.
 FetchException.longError.3=Metadati non utilizzabili
-FetchException.longError.30=La richiesta ?? stata terminata da un nodo perch?? 
esso aveva da poco ricevuto un'altra richiesta per la stessa chiave e quella 
richiesta non era andata a buon fine.
-FetchException.longError.4=Non ?? stato possibile interpretare i metadati.
+FetchException.longError.30=La richiesta ??? stata terminata da un nodo 
perch??? esso aveva da poco ricevuto un'altra richiesta per la stessa chiave e 
quella richiesta non era andata a buon fine.
+FetchException.longError.4=Non ??? stato possibile interpretare i metadati.
 FetchException.longError.5=Fallimento durante l'estrazione di file da un 
archivio
-FetchException.longError.6=Non ?? stato possibile decodificare un blocco
+FetchException.longError.6=Non ??? stato possibile decodificare un blocco
 FetchException.longError.7=Metadati divisi in troppi livelli
-FetchException.longError.8=La richiesta ?? stata riavviata troppe volte a 
causa di cambiamenti negli archivii
-FetchException.longError.9=Troppe redirezioni (troppa ricorsivit??)
+FetchException.longError.8=La richiesta ??? stata riavviata troppe volte a 
causa di cambiamenti negli archivii
+FetchException.longError.9=Troppe redirezioni (troppa ricorsivit???)
 FetchException.shortError.1=Recursione archivio troppo profonda
 FetchException.shortError.10=Non in archivio
 FetchException.shortError.11=Troppe componenti nel percorso
@@ -400,14 +402,14 @@
 FetchException.shortError.21=Troppo grande
 FetchException.shortError.22=Volume metadati eccessivo
 FetchException.shortError.23=Troppi blocchi per segmento
-FetchException.shortError.24=Quantit?? meta-strings insufficiente
+FetchException.shortError.24=Quantit??? meta-strings insufficiente
 FetchException.shortError.25=Annullato da caller
 FetchException.shortError.26=Archivio riavviato
 FetchException.shortError.27=Nuova URI
 FetchException.shortError.28=Non sono stati trovati tutti i dati
 FetchException.shortError.29=Errore: MIME type sbagliato
 FetchException.shortError.3=Metadati sconosciuti
-FetchException.shortError.30=Non ?? stato possibile trovare i dati richiesti 
(fallimento recente)
+FetchException.shortError.30=Non ??? stato possibile trovare i dati richiesti 
(fallimento recente)
 FetchException.shortError.4=Metadati non validi
 FetchException.shortError.5=Fallimento archivio
 FetchException.shortError.6=Errore decodifica block
@@ -417,7 +419,7 @@
 FileOffer.acceptTransferButton=Accetta Trasferimento
 FileOffer.askUserTitle=Trasferimento file diretto.
 FileOffer.commentLabel=Commenti:
-FileOffer.failedReceiveHeader=Non ?? stato possibile completare il 
trasferimento del file ${filename} da ${node}.
+FileOffer.failedReceiveHeader=Non ??? stato possibile completare il 
trasferimento del file ${filename} da ${node}.
 FileOffer.failedReceiveShort=Trasferimento di ${filename} da ${node} fallito.
 FileOffer.failedReceiveTitle=Trasferimento fallito
 FileOffer.fileLabel=File:
@@ -427,36 +429,36 @@
 FileOffer.rejectTransferButton=Rifiuta trasferimento
 FileOffer.senderLabel=Mittente:
 FileOffer.sizeLabel=Dimensioni:
-FileOffer.succeededReceiveHeader=Il trasferimento del file ${filename} da 
${node} ?? stato completato.
-FileOffer.succeededReceiveShort=${filename} ?? stato ricevuto da ${node}.
+FileOffer.succeededReceiveHeader=Il trasferimento del file ${filename} da 
${node} ??? stato completato.
+FileOffer.succeededReceiveShort=${filename} ??? stato ricevuto da ${node}.
 FileOffer.succeededReceiveTitle=Trasferimento file completato
 FirstTimeWizardToadlet.bandwidthLimit=Limitazione banda
-FirstTimeWizardToadlet.bandwidthLimitLong=Scegliere il tipo di connessione e 
la velocit?? dal drop-down menu.
-FirstTimeWizardToadlet.bwlimitHigherSpeed=Velocit?? maggiore
-FirstTimeWizardToadlet.bwlimitLowerSpeed=Velocit?? minore
-FirstTimeWizardToadlet.chooseNodeName=Il nome del nodo ?? obbligatorio!
-FirstTimeWizardToadlet.chooseNodeNameLong=Inserire un nome per il nodo. Il 
nome sar?? visibile ai peer darknet, quelli manualmente aggiunti dall'utente, e 
non sar?? visibile dai peer opeennet (aggiunti automaticamente) . Si consiglia 
di usare il proprio nickname IRC possibilmente con un'informazione per il 
conctatto in modo da essere reperibili in caso di problemi ("Mario Rossi marior 
at sitodimario.com").
+FirstTimeWizardToadlet.bandwidthLimitLong=Scegliere il tipo di connessione e 
la velocit??? dal drop-down menu.
+FirstTimeWizardToadlet.bwlimitHigherSpeed=Velocit??? maggiore
+FirstTimeWizardToadlet.bwlimitLowerSpeed=Velocit??? minore
+FirstTimeWizardToadlet.chooseNodeName=Il nome del nodo ??? obbligatorio!
+FirstTimeWizardToadlet.chooseNodeNameLong=Inserire un nome per il nodo. Il 
nome sar??? visibile ai peer darknet, quelli manualmente aggiunti dall'utente, 
e non sar??? visibile dai peer opeennet (aggiunti automaticamente) . Si 
consiglia di usare il proprio nickname IRC possibilmente con un'informazione 
per il conctatto in modo da essere reperibili in caso di problemi ("Mario Rossi 
marior at sitodimario.com").
 FirstTimeWizardToadlet.clickContinue=Clicca qui per continuare.
 FirstTimeWizardToadlet.congratz=Benvenuto a bordo!
-FirstTimeWizardToadlet.congratzLong=Congratulazioni, la configurazione di base 
del nodo Freenet ?? completa. E' possibile cambiare e modificare ognuno dei 
parametri appena impostati usando la pagina "configurazione" che ?? 
raggiungibile attraverso il menu sulla sinistra dell'interfaccia. Vi auguriamo 
una piacevole esperienza con Freenet.
+FirstTimeWizardToadlet.congratzLong=Congratulazioni, la configurazione di base 
del nodo Freenet ??? completa. E' possibile cambiare e modificare ognuno dei 
parametri appena impostati usando la pagina "configurazione" che ??? 
raggiungibile attraverso il menu sulla sinistra dell'interfaccia. Vi auguriamo 
una piacevole esperienza con Freenet.
 FirstTimeWizardToadlet.connectToStrangers=Connetti a sconosciuti?
-FirstTimeWizardToadlet.connectToStrangersLong=In un mondo ideale, ogni utente 
Freenet si connetterebbe esclusivamente con nodi gestiti da persone fid??te. 
Qesto ?? di gran lunga il sistema pi?? sicuro, che rende molto difficile per un 
osservatore esterno determinare se un nodo stia o meno girando sul computer 
osservato. D'altra parte, non avendo a disposizione almeno cinque amici, 
parenti o conoscenti fid??ti che gi?? usano Freenet, ai quali connettersi, come 
soluzione alternativa ?? possibile lasciare che il nodo si connetta 
automaticamente a nodi gestiti da sconosciuti. Questa opzione pu?? essere 
disattivata in qualsiasi momento.
+FirstTimeWizardToadlet.connectToStrangersLong=In un mondo ideale, ogni utente 
Freenet si connetterebbe esclusivamente con nodi gestiti da persone fid???te. 
Qesto ??? di gran lunga il sistema pi??? sicuro, che rende molto difficile per 
un osservatore esterno determinare se un nodo stia o meno girando sul computer 
osservato. D'altra parte, non avendo a disposizione almeno cinque amici, 
parenti o conoscenti fid???ti che gi??? usano Freenet, ai quali connettersi, 
come soluzione alternativa ??? possibile lasciare che il nodo si connetta 
automaticamente a nodi gestiti da sconosciuti. Questa opzione pu??? essere 
disattivata in qualsiasi momento.
 FirstTimeWizardToadlet.continue=Continua
 FirstTimeWizardToadlet.continueEnd=Clicca qui per cominciare ad usare Freenet!
 FirstTimeWizardToadlet.datastoreSize=Dimensioni magazzino dati (datastore)
-FirstTimeWizardToadlet.datastoreSizeLong=Selezionare le dimensione desiderata 
per il file di immagazzinaggio dati (datastore). Il datastore funziona come una 
cache. Immagazzinare dati per il network aumenta il volume di scambio quando i 
file sono molto richiesti. Pi?? spazio ci si pu?? permettere di dedicare a 
Freenet e meglio ?? per la comunit??. Un datastore di grosse dimensioni aumenta 
notevolmente la velocit?? del nodo.
+FirstTimeWizardToadlet.datastoreSizeLong=Selezionare le dimensione desiderata 
per il file di immagazzinaggio dati (datastore). Il datastore funziona come una 
cache. Immagazzinare dati per il network aumenta il volume di scambio quando i 
file sono molto richiesti. Pi??? spazio ci si pu??? permettere di dedicare a 
Freenet e meglio ??? per la comunit???. Un datastore di grosse dimensioni 
aumenta notevolmente la velocit??? del nodo.
 FirstTimeWizardToadlet.enableOpennet=Connettersi automaticamente a nodi non 
affidabili gestiti da sconosciuti?
 FirstTimeWizardToadlet.fivePercentDisk=(= 5% di spazio libero su disco)
 FirstTimeWizardToadlet.homepageTitle=Configurazione Automatica Freenet
 FirstTimeWizardToadlet.iDoTrust=Possiamo fidarci degli utenti connessi a 
${interface} (${ip}) ?
-FirstTimeWizardToadlet.isNetworkTrusted=La rete locale ?? affidabile?
-FirstTimeWizardToadlet.isNetworkTrustedLong=La rete locale ?? affidabile? 
Rispondendo di si a questa domanda, tutti i servizii forniti dal nodo Freenet 
saranno pienamente accessibili da chiunque sul network suddetto. E' possibile 
configurare un accesso pi?? selettivo attraverso la pagina "configurazione" 
dopo aver completato questo wizard.
+FirstTimeWizardToadlet.isNetworkTrusted=La rete locale ??? affidabile?
+FirstTimeWizardToadlet.isNetworkTrustedLong=La rete locale ??? affidabile? 
Rispondendo di si a questa domanda, tutti i servizii forniti dal nodo Freenet 
saranno pienamente accessibili da chiunque sul network suddetto. E' possibile 
configurare un accesso pi??? selettivo attraverso la pagina "configurazione" 
dopo aver completato questo wizard.
 FirstTimeWizardToadlet.memoryLimit=Utilizzo memoria
-FirstTimeWizardToadlet.memoryLimitLong=Specifica il valore massimo della 
memoria utilizzabile da Freenet. Il nodo ha bisogno di pi?? memoria se ci sono 
molti file in coda per il download/upload. Si raccomanda di non impostare 
questa opzione per un valore inferiore a 128MB tranne nel caso in cui la 
memoria totale a disposizione sia veramente poca. Se il computer ha 1GB di 
memoria RAM o pi??, si consiglia di usare almeno 256MB. Il cambiamento avr?? 
effetto dopo aver riavviato Freenet.
-FirstTimeWizardToadlet.noNetworkIF=Non ?? stata trovata nessuna interfaccia di 
rete addizionale
-FirstTimeWizardToadlet.noNetworkIFLong=Freenet non ha trovato altre interfacce 
di rete, quindi dar?? per scontato che l'utente si connetter?? dal computer 
locale e solo da quello.
-FirstTimeWizardToadlet.opennetNo=Si, ho almeno 5 amici che usano Freenet e 
aggiunger?? i loro dati alla pagina degli Amici.
-FirstTimeWizardToadlet.opennetWarning=In Paesi dove networking anonimo ?? 
illegale e/o se usa Freenet per accedere a materiale che potrebbe mettere nei 
guai chi ne fosse trovato in possesso, un serio pericolo pu?? risultare dal 
configurare il nodo in modo da connettersi automaticamente a nodi gestiti da 
sconosciuti, facilitando il il compito ad un avversario determinato. Freenet ?? 
ancora in fase sperimentale, gli autori non sono in grado di garatire sicurezza 
assoluta.
+FirstTimeWizardToadlet.memoryLimitLong=Specifica il valore massimo della 
memoria utilizzabile da Freenet. Il nodo ha bisogno di pi??? memoria se ci sono 
molti file in coda per il download/upload. Si raccomanda di non impostare 
questa opzione per un valore inferiore a 128MB tranne nel caso in cui la 
memoria totale a disposizione sia veramente poca. Se il computer ha 1GB di 
memoria RAM o pi???, si consiglia di usare almeno 256MB. Il cambiamento avr??? 
effetto dopo aver riavviato Freenet.
+FirstTimeWizardToadlet.noNetworkIF=Non ??? stata trovata nessuna interfaccia 
di rete addizionale
+FirstTimeWizardToadlet.noNetworkIFLong=Freenet non ha trovato altre interfacce 
di rete, quindi dar??? per scontato che l'utente si connetter??? dal computer 
locale e solo da quello.
+FirstTimeWizardToadlet.opennetNo=Si, ho almeno 5 amici che usano Freenet e 
aggiunger??? i loro dati alla pagina degli Amici.
+FirstTimeWizardToadlet.opennetWarning=In Paesi dove networking anonimo ??? 
illegale e/o se usa Freenet per accedere a materiale che potrebbe mettere nei 
guai chi ne fosse trovato in possesso, un serio pericolo pu??? risultare dal 
configurare il nodo in modo da connettersi automaticamente a nodi gestiti da 
sconosciuti, facilitando il il compito ad un avversario determinato. Freenet 
??? ancora in fase sperimentale, gli autori non sono in grado di garatire 
sicurezza assoluta.
 FirstTimeWizardToadlet.opennetYes=No, voglio che il nodo trovi automaticamente 
degli sconosciuti ai quali connettersi.
 FirstTimeWizardToadlet.selectLanguage=Lingua
 FirstTimeWizardToadlet.selectLanguageLong=Selezionare una lingua dalla lista 
qui sotto:
@@ -466,93 +468,93 @@
 FirstTimeWizardToadlet.step3Title=Configurazione automatica di Freenet - 
Limiti ampiezza di banda
 FirstTimeWizardToadlet.step4Title=Freenet first time wizard! - Dimensioni 
magazzino dati (datastore)
 FirstTimeWizardToadlet.step5Title=Configurazione Automatica Freenet - 
Configurazione rete
-FirstTimeWizardToadlet.step6Title=Configurazione Automatica Freenet - 
Congratulazioni, il nodo ?? ora configurato.
-FirstTimeWizardToadlet.step7Title=Configurazione Automatica Freenet - 
Congratulazioni, il nodo ?? ora configurato.
+FirstTimeWizardToadlet.step6Title=Configurazione Automatica Freenet - 
Congratulazioni, il nodo ??? ora configurato.
+FirstTimeWizardToadlet.step7Title=Configurazione Automatica Freenet - 
Congratulazioni, il nodo ??? ora configurato.
 FirstTimeWizardToadlet.tenPercentDisk=(= 10% di spazio libero su disco)
 FirstTimeWizardToadlet.warningTitle=Avvertenza!
-FirstTimeWizardToadlet.welcomeInfoboxContent1=Benvenuti nella Configurazione 
Automatica Freenet, che vi permetter?? di configurare Freenet e cominciare ad 
usarlo velocemente e facilmente.
+FirstTimeWizardToadlet.welcomeInfoboxContent1=Benvenuti nella Configurazione 
Automatica Freenet, che vi permetter??? di configurare Freenet e cominciare ad 
usarlo velocemente e facilmente.
 FirstTimeWizardToadlet.welcomeInfoboxTitle=Benevenuti in Configurazione 
Automatica Freenet
 FirstTimeWizardToadlet.memory.128M=128Mb - Il minimo indispensabile
 FirstTimeWizardToadlet.memory.192M=192Mb - Default ragionevole.
 FirstTimeWizardToadlet.memory.256M=256Mb - Per computer con almeno 1GB di RAM
 FirstTimeWizardToadlet.memory.512M=512Mb - per computer con molta memoria RAM
-FirstTimeWizardToadlet.memory.64M=64MB - Usare solo in caso di estrema 
necessit??
+FirstTimeWizardToadlet.memory.64M=64MB - Usare solo in caso di estrema 
necessit???
 FproxyToadlet.dangerousRSSTitle=Contenuto potenzialmente pericoloso (RSS)
 GIFFilter.invalidHeader=Il file non contiene un header GIF valido.
 GIFFilter.invalidHeaderTitle=Header non valido
-GIFFilter.notGif=Il file che si sta cercando di richiamare non ?? una GIF. 
Potrebbe trattarsi di un file in un altro formato, ed il browser potrebbe fare 
qualcosa di pericoloso a cause della confusione generata dalla mancata 
corrispondenza; il file ?? stato pertanto bloccato.
-GIFFilter.tooShort=Il file ?? troppo piccolo per essere una GIF.
+GIFFilter.notGif=Il file che si sta cercando di richiamare non ??? una GIF. 
Potrebbe trattarsi di un file in un altro formato, ed il browser potrebbe fare 
qualcosa di pericoloso a cause della confusione generata dalla mancata 
corrispondenza; il file ??? stato pertanto bloccato.
+GIFFilter.tooShort=Il file ??? troppo piccolo per essere una GIF.
 GIFFilter.tooShortTitle=Troppo corto
-GenericReadFilterCallback.couldNotParseAbsoluteFreenetURI=Non ?? stato 
possibile interpretare come URI Freenet assoluta.
-GenericReadFilterCallback.couldNotParseFormURIWithError=Il filtro non ?? 
riuscito ad interpretare ${error} dalla URI.
-GenericReadFilterCallback.couldNotParseRelativeFreenetURI=Non ?? stato 
possibile interpretare come Freenet URI relativa.
+GenericReadFilterCallback.couldNotParseAbsoluteFreenetURI=Non ??? stato 
possibile interpretare come URI Freenet assoluta.
+GenericReadFilterCallback.couldNotParseFormURIWithError=Il filtro non ??? 
riuscito ad interpretare ${error} dalla URI.
+GenericReadFilterCallback.couldNotParseRelativeFreenetURI=Non ??? stato 
possibile interpretare come Freenet URI relativa.
 GenericReadFilterCallback.couldNotParseURIWithError=Il filtro ha fallito 
nell'analisi della URI: ${error}
 GenericReadFilterCallback.invalidFormURI=URI form non valida: punta a risorsa 
esterna
 GenericReadFilterCallback.invalidFormURIAttemptToEscape=Tentativo di evasione 
dalla struttura delle directory
 GenericReadFilterCallback.malformedAbsoluteURL=URL malformata (assoluto): 
${error}
 GenericReadFilterCallback.malformedRelativeURL=URL malformata (relativo): 
${error}
 GenericReadFilterCallback.protocolNotEscaped=Non si tratta di un protocollo 
fuggitivo: ${protocol}
-HTMLFilter.couldNotParseStyle=Non ?? stato possibile abbinare lo stile 
dell'input
+HTMLFilter.couldNotParseStyle=Non ??? stato possibile abbinare lo stile 
dell'input
 HTMLFilter.deletedUnknownStyle=stile sconosciuto eliminato
-HTMLFilter.failedToParseLabel=Il filtro HTML non ?? riuscito a interpretare la 
pagina
+HTMLFilter.failedToParseLabel=Il filtro HTML non ??? riuscito a interpretare 
la pagina
 HTMLFilter.tooManyNestedStyleOrScriptTags=Troppi tag 'style' annidati e/o 
troppi tag di scripting: analisi ambigua o non valida
-HTMLFilter.tooManyNestedStyleOrScriptTagsLong=Troppi tag </style> annidati - 
analisi ambigua o non valida. Non ?? possibile filtrare in modo affidabile 
quindi i tag interni sono stai rimossi: questo pu?? causare al browser qualche 
inconveniente nella visuallizzazione
+HTMLFilter.tooManyNestedStyleOrScriptTagsLong=Troppi tag </style> annidati - 
analisi ambigua o non valida. Non ??? possibile filtrare in modo affidabile 
quindi i tag interni sono stai rimossi: questo pu??? causare al browser qualche 
inconveniente nella visuallizzazione
 HTMLFilter.unknownTag=tag sconosciuto ${tag}
 IPDetectorPluginManager.connectionProblems=Problemi di connessione:
 IPDetectorPluginManager.direct=Il computer sembra essere direttamente connesso 
a Internet, dovrebbe essere quindi possibile connettersi con qualunque nodo 
Freenet.
 IPDetectorPluginManager.directTitle=Rilevata connessione diretta a Internet
-IPDetectorPluginManager.forwardPort=Il tuo nodo sembra essere dietro qualche 
tipo di NAT (vedi la pagina connettivit?? per dettagli). Se possibile, dovresti 
forwardare le porte UDP (not TCP) ${port} per migliorare la connettivit??. E' 
possibile comunque che tu abbia gi?? provveduto; Serve del tempo a Freenet per 
rilevare il port forward. Leggi ${link}qui${/link} per ulteriori informazioni.
-IPDetectorPluginManager.forwardPortMaybeForwarded=Sembra che il nodo si trovi 
dietro una NAT di qualche tipo (vedi pagina connettivit?? per i dettaglil). Se 
possibile, bigognerebbe configurare il forward per la porta ${port} UDP (non 
TCP) allo scopo di migliorare la connettivit??. E' possibile comunque che ci?? 
sia gi?? stato fatto: occorre un po' di tempo perch?? Freenet rilevi il port 
forward. Clicca ${link}qui${/link} per maggiori informazioni.
-IPDetectorPluginManager.forwardPortNotForwarded=Sembra che il nodo si trovi 
dietro una NAT di qualche tipo (vedi pagina connettivit?? per i dettaglil). Se 
possibile, bigognerebbe configurare il forward per la porta ${port} UDP (non 
TCP) allo scopo di migliorare la connettivit??. Sembra che ci?? non sia stato 
fatto, anche occorre un po' di tempo perch?? Freenet rilevi il port forward. 
Clicca ${link}qui${/link} per maggiori informazioni
+IPDetectorPluginManager.forwardPort=Il tuo nodo sembra essere dietro qualche 
tipo di NAT (vedi la pagina connettivit??? per dettagli). Se possibile, 
dovresti forwardare le porte UDP (not TCP) ${port} per migliorare la 
connettivit???. E' possibile comunque che tu abbia gi??? provveduto; Serve del 
tempo a Freenet per rilevare il port forward. Leggi ${link}qui${/link} per 
ulteriori informazioni.
+IPDetectorPluginManager.forwardPortMaybeForwarded=Sembra che il nodo si trovi 
dietro una NAT di qualche tipo (vedi pagina connettivit??? per i dettaglil). Se 
possibile, bigognerebbe configurare il forward per la porta ${port} UDP (non 
TCP) allo scopo di migliorare la connettivit???. E' possibile comunque che 
ci??? sia gi??? stato fatto: occorre un po' di tempo perch??? Freenet rilevi il 
port forward. Clicca ${link}qui${/link} per maggiori informazioni.
+IPDetectorPluginManager.forwardPortNotForwarded=Sembra che il nodo si trovi 
dietro una NAT di qualche tipo (vedi pagina connettivit??? per i dettaglil). Se 
possibile, bigognerebbe configurare il forward per la porta ${port} UDP (non 
TCP) allo scopo di migliorare la connettivit???. Sembra che ci??? non sia stato 
fatto, anche occorre un po' di tempo perch??? Freenet rilevi il port forward. 
Clicca ${link}qui${/link} per maggiori informazioni
 IPDetectorPluginManager.forwardPortShort=Per favore, forwardare la porta UDP 
${port}.
-IPDetectorPluginManager.forwardPortShortMaybeForwarded=Si prega di configurare 
il forward della porta ${port} UDP (questo potrebbe essere gi?? stato fatto, ma 
non ancora rilevato)
+IPDetectorPluginManager.forwardPortShortMaybeForwarded=Si prega di configurare 
il forward della porta ${port} UDP (questo potrebbe essere gi??? stato fatto, 
ma non ancora rilevato)
 IPDetectorPluginManager.forwardPortShortNotForwarded=Si prega di configurare 
il forward per la porta ${port} UDP .
-IPDetectorPluginManager.forwardTwoPorts=Il tuo nodo sembra essere dietro 
quanlche tipo di NAT (vedi la pagina connettivit?? per dettagli). Se possibile, 
dovresti eseguire il forward UDP (non TCP) delle porte ${port1} e ${port2} per 
migliorare la connettivit??. E' possibile comunque che tu abbia gi?? 
provveduto; serve del tempo a Freenet per determinare l'avvenuto forward. Leggi 
${link}qui${/link} per ulteriori informazioni.
-IPDetectorPluginManager.forwardTwoPortsMaybeForwarded=Sembra che il nodo si 
trovi dietro una NAt di qualche tipo (vedi pagina connettivit?? per i 
dettaglil). Se possibile, bigognerebbe configurare il forward per la porta 
${port} UDP (non TCP) allo scopo di migliorare la connettivit??. E' possibile 
comunque che ci?? sia gi?? stato fatto: occorre un po' di tempo perch?? Freenet 
rilevi il port forward. Clicca ${link}qui${/link} per maggiori informazioni
-IPDetectorPluginManager.forwardTwoPortsNotForwarded=Pare che il nodo sia 
dietro una  NAT (controllare la pagina connettivit?? per i dettagli). PSe 
possibile si dovrebbe configurare il forward per le porte ${port1} e ${port2} 
UDP (non TCP), allo scopo di migliorare la connettivit??. Sembra che il forward 
delle porte non sia attivo, anche se Freenet non pu?? determinarlo per certo. 
Controllare ${link}qui${/link} per ulteriori informazioni.
+IPDetectorPluginManager.forwardTwoPorts=Il tuo nodo sembra essere dietro 
quanlche tipo di NAT (vedi la pagina connettivit??? per dettagli). Se 
possibile, dovresti eseguire il forward UDP (non TCP) delle porte ${port1} e 
${port2} per migliorare la connettivit???. E' possibile comunque che tu abbia 
gi??? provveduto; serve del tempo a Freenet per determinare l'avvenuto forward. 
Leggi ${link}qui${/link} per ulteriori informazioni.
+IPDetectorPluginManager.forwardTwoPortsMaybeForwarded=Sembra che il nodo si 
trovi dietro una NAt di qualche tipo (vedi pagina connettivit??? per i 
dettaglil). Se possibile, bigognerebbe configurare il forward per la porta 
${port} UDP (non TCP) allo scopo di migliorare la connettivit???. E' possibile 
comunque che ci??? sia gi??? stato fatto: occorre un po' di tempo perch??? 
Freenet rilevi il port forward. Clicca ${link}qui${/link} per maggiori 
informazioni
+IPDetectorPluginManager.forwardTwoPortsNotForwarded=Pare che il nodo sia 
dietro una  NAT (controllare la pagina connettivit??? per i dettagli). PSe 
possibile si dovrebbe configurare il forward per le porte ${port1} e ${port2} 
UDP (non TCP), allo scopo di migliorare la connettivit???. Sembra che il 
forward delle porte non sia attivo, anche se Freenet non pu??? determinarlo per 
certo. Controllare ${link}qui${/link} per ulteriori informazioni.
 IPDetectorPluginManager.forwardTwoPortsShort=Per favore, forwardare le porte 
UDP ${port1} e ${port2}.
-IPDetectorPluginManager.forwardTwoPortsShortMaybeForwarded=Configurare il 
forward  per porte ${port1} e ${port2} UDP (potrebbe essere gi?? stato fatto).
+IPDetectorPluginManager.forwardTwoPortsShortMaybeForwarded=Configurare il 
forward  per porte ${port1} e ${port2} UDP (potrebbe essere gi??? stato fatto).
 IPDetectorPluginManager.forwardTwoPortsShortNotForwarded=Si prega di 
configurare il forward per le porte ${port1} e ${port2} UDP.
 IPDetectorPluginManager.fullCone=La connessione a Internet sembra avvenire 
attraverso una "full cone" NAT. Il nodo dovrebbe riuscire connettersi con 
qualunque altro nodo Freenet.
 IPDetectorPluginManager.fullConeTitle=Rilevata full cone NAT
-IPDetectorPluginManager.maybeAlreadyForwarded=Potrebbe essere gi?? stato fatto 
(?? difficile per Freenet determinarlo).
-IPDetectorPluginManager.noConnectivity=La connessione a Internet non sembra 
essere provvista di supporto UDP. A meno che non si tratti di un rilevamento 
erroneo, non ?? probabile che Freenet possa funzionare al momento.
-IPDetectorPluginManager.noConnectivityTitle=Mancanza di connettivit?? UDP
-IPDetectorPluginManager.noConnectivityshort=Gravi problemi di connessione: 
Nessuna connettivit?? UDP, Freenet non pu?? funzionare!
+IPDetectorPluginManager.maybeAlreadyForwarded=Potrebbe essere gi??? stato 
fatto (??? difficile per Freenet determinarlo).
+IPDetectorPluginManager.noConnectivity=La connessione a Internet non sembra 
essere provvista di supporto UDP. A meno che non si tratti di un rilevamento 
erroneo, non ??? probabile che Freenet possa funzionare al momento.
+IPDetectorPluginManager.noConnectivityTitle=Mancanza di connettivit??? UDP
+IPDetectorPluginManager.noConnectivityshort=Gravi problemi di connessione: 
Nessuna connettivit??? UDP, Freenet non pu??? funzionare!
 
IPDetectorPluginManager.portForwardHelpURL=http://wiki.freenetproject.org/FirewallAndRouterIssues
-IPDetectorPluginManager.portRestricted=La connessione a Internet sembra 
avvenire attraverso una NAT a porte ristrette (router). Il nodo potr?? 
connettersi a quasi tutti gli altri nodi ma non a quelli dietro NAT simmetrica.
+IPDetectorPluginManager.portRestricted=La connessione a Internet sembra 
avvenire attraverso una NAT a porte ristrette (router). Il nodo potr??? 
connettersi a quasi tutti gli altri nodi ma non a quelli dietro NAT simmetrica.
 IPDetectorPluginManager.portRestrictedTitle=Port restricted cone NAT rilevata
 IPDetectorPluginManager.restricted=La connessione a Internet sembra avvenire 
attraverso una "restricted cone" NAT (router). Dovrebbe essere comunque 
possibile connettersi alla maggior parte dei nodi Freenet.
 IPDetectorPluginManager.restrictedTitle=E' stata rilevata una restricted cone 
NAT
 IPDetectorPluginManager.seriousConnectionProblems=Gravi problemi di 
connessione:
 IPDetectorPluginManager.suggestForwardPort=Potrebbe essere necessario 
configurare  manualmente il 'port forwarding'  per la porta UDP numero ${port}. 
Vedi: http://wiki.freenetproject.org/FirewallAndRouterIssues (disponibile solo 
in inglese, per ora).
-IPDetectorPluginManager.suggestForwardPortWithLink=Potrebbe essere necessario 
${link}configurare il port forwarding${/link} (porta UDP numero ${port}) 
manualmente (oppure ci?? ?? gi?? stato fatto: Freenet pu?? avere delle 
difficolt?? in questo tipo di rilevazione).
+IPDetectorPluginManager.suggestForwardPortWithLink=Potrebbe essere necessario 
${link}configurare il port forwarding${/link} (porta UDP numero ${port}) 
manualmente (oppure ci??? ??? gi??? stato fatto: Freenet pu??? avere delle 
difficolt??? in questo tipo di rilevazione).
 IPDetectorPluginManager.suggestForwardTwoPorts=Sarebbe opportuno configurare 
manualmente il port forward sul router per le porte ${port1} e ${port2} (UDP). 
vedi http://wiki.freenetproject.org/FirewallAndRouterIssues (disponibile solo 
in inglese, per ora).
-IPDetectorPluginManager.suggestForwardTwoPortsWithLink=Potrebbe essere 
necessario configurare manualmente ${link}il forward delle porte${/link} Per 
porte nummero ${port1} e ${port2}, UDP. (questo messaggio pu?? in alcuni casi 
continuare ad apparire per un po' di tempo dopo aver configurato il forward)
-IPDetectorPluginManager.symmetric=Dai rilevamenti appare che il nodo potrebbe 
trovarsi dietro una NAT simmetrica o un firewall. Probabilmente, sar?? 
possibile connettersi ad utenti connessi direttamente a internet o dietro 
restricted cone NAT
-IPDetectorPluginManager.symmetricPS=Il nodo si trova dietro una NAT 
simmetrica. Queta ?? una situazione particolarmente  particolarmente 
problematica: ?? necessario configurare il forward delle porte. In caso 
contrario potrebbe risultare impossibile connettersi alla maggioranza dei nodi.
+IPDetectorPluginManager.suggestForwardTwoPortsWithLink=Potrebbe essere 
necessario configurare manualmente ${link}il forward delle porte${/link} Per 
porte nummero ${port1} e ${port2}, UDP. (questo messaggio pu??? in alcuni casi 
continuare ad apparire per un po' di tempo dopo aver configurato il forward)
+IPDetectorPluginManager.symmetric=Dai rilevamenti appare che il nodo potrebbe 
trovarsi dietro una NAT simmetrica o un firewall. Probabilmente, sar??? 
possibile connettersi ad utenti connessi direttamente a internet o dietro 
restricted cone NAT
+IPDetectorPluginManager.symmetricPS=Il nodo si trova dietro una NAT 
simmetrica. Queta ??? una situazione particolarmente  particolarmente 
problematica: ??? necessario configurare il forward delle porte. In caso 
contrario potrebbe risultare impossibile connettersi alla maggioranza dei nodi.
 IPDetectorPluginManager.symmetricTitle=Rilevato firewall simmetrico
-IPUndetectedUserAlert.detecting=Freenet sta cercando in questo momento di 
rilevare l'indirizzo IP esterno. Il protrarsi della durata di questa operazione 
oltre il limite di pochi minuti ?? indicativo di problemi.
+IPUndetectedUserAlert.detecting=Freenet sta cercando in questo momento di 
rilevare l'indirizzo IP esterno. Il protrarsi della durata di questa operazione 
oltre il limite di pochi minuti ??? indicativo di problemi.
 IPUndetectedUserAlert.detectingShort=Indirizzo IP esterno in corso di 
rilevamento.
-IPUndetectedUserAlert.detectingWithConfigLink=Freenet sta rilevando 
l'indirizzo IP esterno. Se l'operazione dura pi?? di qualche minuto si pu?? 
presumere che qualcosa non stia andando come dovrebbe e si pu?? provare ad 
usare il Suggerimento Temporaneo per l'Indirizzo IP ${link}parametro di 
configurazione${/link}.
+IPUndetectedUserAlert.detectingWithConfigLink=Freenet sta rilevando 
l'indirizzo IP esterno. Se l'operazione dura pi??? di qualche minuto si pu??? 
presumere che qualcosa non stia andando come dovrebbe e si pu??? provare ad 
usare il Suggerimento Temporaneo per l'Indirizzo IP ${link}parametro di 
configurazione${/link}.
 IPUndetectedUserAlert.suggestForwardPort=Sarebbe opportuno configurare il port 
forward sul router per le porte ${port1} e ${port2} (UDP) in modo da facilitare 
le connessioni.
 IPUndetectedUserAlert.suggestForwardTwoPorts=Sarebbe opportuno configurare il 
port forward sul router per le porte ${port1} e ${port2} (UDP) in modo da 
facilitare le connessioni.
-IPUndetectedUserAlert.unknownAddress=Non ?? stato possibile rilevare 
l'indirizzo IP esterno (o l'indirizzo IP del NAT box o del firewall). Si pu?? 
comunque scambiare refs con altri utenti, ma sar?? possibile connettersi 
solamente a nodi che non si trovino a loro volta dietro NAT o firewall. Non 
appaena ci si sar?? connessi in questo modo ad almeno un altro utente, sar?? 
possibile determinare l'indirizzo IP esterno. Si pu?? suggerire al nodo 
l'indirizzo IP esterno usando 'Suggerimento Temporaneo per l'Indirizzo IP' 
${link}parametro di configurazione${/link}
-IPUndetectedUserAlert.unknownAddressShort=Non ?? stato possibile rilevare 
l'indirizzo IP. Potrebbero verificarsi problemi di connessione.
+IPUndetectedUserAlert.unknownAddress=Non ??? stato possibile rilevare 
l'indirizzo IP esterno (o l'indirizzo IP del NAT box o del firewall). Si pu??? 
comunque scambiare refs con altri utenti, ma sar??? possibile connettersi 
solamente a nodi che non si trovino a loro volta dietro NAT o firewall. Non 
appaena ci si sar??? connessi in questo modo ad almeno un altro utente, sar??? 
possibile determinare l'indirizzo IP esterno. Si pu??? suggerire al nodo 
l'indirizzo IP esterno usando 'Suggerimento Temporaneo per l'Indirizzo IP' 
${link}parametro di configurazione${/link}
+IPUndetectedUserAlert.unknownAddressShort=Non ??? stato possibile rilevare 
l'indirizzo IP. Potrebbero verificarsi problemi di connessione.
 IPUndetectedUserAlert.unknownAddressTitle=Indirizzo esterno sconosciuto
-IPUndetectedUserAlert.unknownAddressWithConfigLink=Freenet non ha potuto 
rilevare l'indirizzo IP esterno (o l'indirizzo IP del NAT box o firewall). E' 
comunque possibile scambiare referenze con altri utenti, ma la connessione 
avverr?? soltanto se l'altra parte non ?? a sua volta dietro NAT o firewall. 
Appena connesso ad almeno un utente in questo modo, Freenet riuscit?? a 
determinare l'indirizzo IP esterno.E' possibile suggerire al nodo l'IP esterno 
usando il campo 'suggerimento provvisorio per l'indirizzo IP'  ${link}parametro 
di configurazione${/link}. Sarebbe inlotre auspicabile configurare il forward 
UDP per la porta ${port} sul router, in modo da rendere pi?? facili le 
connessioni
-InsertException.longError.1=Caller ha fornito una URI che non ?? possibile 
utilizzare"
+IPUndetectedUserAlert.unknownAddressWithConfigLink=Freenet non ha potuto 
rilevare l'indirizzo IP esterno (o l'indirizzo IP del NAT box o firewall). E' 
comunque possibile scambiare referenze con altri utenti, ma la connessione 
avverr??? soltanto se l'altra parte non ??? a sua volta dietro NAT o firewall. 
Appena connesso ad almeno un utente in questo modo, Freenet riuscit??? a 
determinare l'indirizzo IP esterno.E' possibile suggerire al nodo l'IP esterno 
usando il campo 'suggerimento provvisorio per l'indirizzo IP'  ${link}parametro 
di configurazione${/link}. Sarebbe inlotre auspicabile configurare il forward 
UDP per la porta ${port} sul router, in modo da rendere pi??? facili le 
connessioni
+InsertException.longError.1=Caller ha fornito una URI che non ??? possibile 
utilizzare"
 InsertException.longError.10=Annullato dall'utente
 InsertException.longError.11=Meta string (probabilmente '/') usata nella URI
 InsertException.longError.12=Errore di formattazione nel blob binario
 InsertException.longError.2=Errore bucket interno: potrebbe trattarsi di 
mancanza di spazio sufficiente su disco rigido o di mancanza di autorizzazione.
 InsertException.longError.3=Errore interno
-InsertException.longError.4=Un nodo 'a valle' (downstream) ?? andato in time 
out o ?? stato gravemente sovraccaricato
-InsertException.longError.5=Non ?? stato possibile propagare questa inserzione 
su un numero sufficiente di nodi (questo e' normale su network di piccole 
dimensioni: si pu?? provare a richiamare il file comunque)
+InsertException.longError.4=Un nodo 'a valle' (downstream) ??? andato in time 
out o ??? stato gravemente sovraccaricato
+InsertException.longError.5=Non ??? stato possibile propagare questa 
inserzione su un numero sufficiente di nodi (questo e' normale su network di 
piccole dimensioni: si pu??? provare a richiamare il file comunque)
 InsertException.longError.6=Errori fatali in un'inserzione di splitfiles
-InsertException.longError.7=Non ?? stato possibile inserire splitfile: numero 
di tentativi esaurito (errori nonfatali)
-InsertException.longError.8=Non ?? stato possibile far partire l'inserzione 
dal nodo locale.
-InsertException.longError.9=L' inserzione ?? in conflitto con dati 
pre-esistenti e differenti alla stessa chiave
+InsertException.longError.7=Non ??? stato possibile inserire splitfile: numero 
di tentativi esaurito (errori nonfatali)
+InsertException.longError.8=Non ??? stato possibile far partire l'inserzione 
dal nodo locale.
+InsertException.longError.9=L' inserzione ??? in conflitto con dati 
pre-esistenti e differenti alla stessa chiave
 InsertException.shortError.1=URI non valida
 InsertException.shortError.10=Annullato
 InsertException.shortError.11=Meta string usata nella chiave
@@ -563,39 +565,39 @@
 InsertException.shortError.5=Percorso non trovato
 InsertException.shortError.6=Alcuni block sono falliti in modo fatale
 InsertException.shortError.7=Alcuni block hanno esaurito il numero di 
tentativi a disposizione
-InsertException.shortError.8=Non ?? stato possibile inoltrare la richiesta
+InsertException.shortError.8=Non ??? stato possibile inoltrare la richiesta
 InsertException.shortError.9=Conflitto con dati esistenti
-IntOption.parseError=Il valore specificato non pu?? essere interpretato come 
32-bit integer : ${val}
-InvalidAddressOverrideUserAlert.unknownAddress=Freenet ha rilevato che il 
valore attualmente in uso per ipAddessOverride non ?? valido in quanto non 
conforme alla sintassi appropriata per un hostname n?? per un indirizzo IPv4 o 
IPv6 (in accordo con l'implementazione corrente della funzione che controlla la 
sintassi per indirizzi IPv6)
+IntOption.parseError=Il valore specificato non pu??? essere interpretato come 
32-bit integer : ${val}
+InvalidAddressOverrideUserAlert.unknownAddress=Freenet ha rilevato che il 
valore attualmente in uso per ipAddessOverride non ??? valido in quanto non 
conforme alla sintassi appropriata per un hostname n??? per un indirizzo IPv4 o 
IPv6 (in accordo con l'implementazione corrente della funzione che controlla la 
sintassi per indirizzi IPv6)
 InvalidAddressOverrideUserAlert.unknownAddressShort=L' indirizzo IP impostato 
manualmente (ipAddressOverride) non funziona. si prega di correggerlo.
 InvalidAddressOverrideUserAlert.unknownAddressTitle=Valore Override Indirizzo 
non Valido
-InvalidAddressOverrideUserAlert.unknownAddressWithConfigLink=Freenet ha 
rilevato che il valore attualmente in uso per ipAddessOverride non ?? valido in 
quanto non conforme alla sintassi appropriata per un hostname n?? per un 
indirizzo IPv4 o IPv6 (in accordo con l'implementazione corrente della funzione 
che controlla la sintassi per indirizzi IPv6) E' possibile correggere l' 
Override indirizzo IP ${link}configuration parameter${/link}.
-JPEGFilter.notJpeg=Le dimensioni del file che si sta cercando di richiamare 
sono troppo ridotte perch?? possa trattarsi di un'immagine JPEG. Potrebbe 
essere un file in un altro formato e il browser potrebbe fare qualcosa di 
sbagliato a causa della mancata corrispondenza; il file ?? stato pertanto 
bloccato.
+InvalidAddressOverrideUserAlert.unknownAddressWithConfigLink=Freenet ha 
rilevato che il valore attualmente in uso per ipAddessOverride non ??? valido 
in quanto non conforme alla sintassi appropriata per un hostname n??? per un 
indirizzo IPv4 o IPv6 (in accordo con l'implementazione corrente della funzione 
che controlla la sintassi per indirizzi IPv6) E' possibile correggere l' 
Override indirizzo IP ${link}configuration parameter${/link}.
+JPEGFilter.notJpeg=Le dimensioni del file che si sta cercando di richiamare 
sono troppo ridotte perch??? possa trattarsi di un'immagine JPEG. Potrebbe 
essere un file in un altro formato e il browser potrebbe fare qualcosa di 
sbagliato a causa della mancata corrispondenza; il file ??? stato pertanto 
bloccato.
 JPEGFilter.tooShort=File troppo piccolo per un JPEG.
 JPEGFilter.tooShortTitle=Troppo corto
-KnownUnsafeContentTypeException.dangerousInlines=Contenuto di questo tipo pu?? 
includere immagini o video che vengono caricati direttamente da internet, 
esponendo l'indirizzo IP dell'utente e quindi compromettendone gravemente 
l'anonimato.
+KnownUnsafeContentTypeException.dangerousInlines=Contenuto di questo tipo 
pu??? includere immagini o video che vengono caricati direttamente da internet, 
esponendo l'indirizzo IP dell'utente e quindi compromettendone gravemente 
l'anonimato.
 KnownUnsafeContentTypeException.dangerousInlinesLabel=Collegamenti esterni 
pericolosi:
-KnownUnsafeContentTypeException.dangerousLinks=Contenuto di questo tipo pu?? 
includere dei link a pagine pubblicate al di fuori di Freenet. Cliccando su 
tali link (e possono essere camuffati) si espone il proprio indirizzo IP, 
compromettendo l'anonimato.
+KnownUnsafeContentTypeException.dangerousLinks=Contenuto di questo tipo pu??? 
includere dei link a pagine pubblicate al di fuori di Freenet. Cliccando su 
tali link (e possono essere camuffati) si espone il proprio indirizzo IP, 
compromettendo l'anonimato.
 KnownUnsafeContentTypeException.dangerousLinksLabel=Link pericolosi:
-KnownUnsafeContentTypeException.dangerousMetadata=Contenuto di questo tipo 
pu?? includere metadati, i quali possono essere visualizzati da alcuni browser 
o con l'aiuto di altri programmi: i metadati possono contenere link o immagini 
caricate direttamente da internet, che possono compromettere l'anonimato.
+KnownUnsafeContentTypeException.dangerousMetadata=Contenuto di questo tipo 
pu??? includere metadati, i quali possono essere visualizzati da alcuni browser 
o con l'aiuto di altri programmi: i metadati possono contenere link o immagini 
caricate direttamente da internet, che possono compromettere l'anonimato.
 KnownUnsafeContentTypeException.dangerousMetadataLabel=Metadati pericolosi:
-KnownUnsafeContentTypeException.dangerousScripts=Contenuto di questo tipo pu?? 
includere script pericolosi che quando eseguiti possono compromettere 
l'anonimato dell'utente connettendosi direttamente al web o compromettere la 
sicurezza in altro modo.
+KnownUnsafeContentTypeException.dangerousScripts=Contenuto di questo tipo 
pu??? includere script pericolosi che quando eseguiti possono compromettere 
l'anonimato dell'utente connettendosi direttamente al web o compromettere la 
sicurezza in altro modo.
 KnownUnsafeContentTypeException.dangerousScriptsLabel=Scripting pericoloso:
 KnownUnsafeContentTypeException.knownUnsafe=Questo e' un MIME type 
potenzialmente pericoloso. Se il nodo lo lascia passare, il browser potrebbe 
fare qualcosa capace di compromettere l'anonimato dell'utente, esponendone 
l'indirizzo IP in relazione a questa pagina. In particolare:
-KnownUnsafeContentTypeException.noFilter=Non ?? disponibile alcun filtro per 
questo tipo di dati; ?? necessario quindi prendere tutte le possibili 
precauzioni.
+KnownUnsafeContentTypeException.noFilter=Non ??? disponibile alcun filtro per 
questo tipo di dati; ??? necessario quindi prendere tutte le possibili 
precauzioni.
 KnownUnsafeContentTypeException.title=Conosciuto come pericoloso: Tipo ${type}
 LocalFileInsertToadlet.checkPathExist=Accerta l'esistenza del percorso 
specificato.
 LocalFileInsertToadlet.checkPathIsDir=Controlla che il percorso specificato 
sia una directory
 LocalFileInsertToadlet.checkPathReadable=Controlla che il percorso specificato 
sia leggibile dall'utente che sta utilizzando il nodo.
-LocalFileInsertToadlet.dirAccessDenied=L'accesso a questa directory ?? 
interdetto
-LocalFileInsertToadlet.dirCannotBeRead=Non ?? stato possibile leggere dalla 
directory "${path}".
+LocalFileInsertToadlet.dirAccessDenied=L'accesso a questa directory ??? 
interdetto
+LocalFileInsertToadlet.dirCannotBeRead=Non ??? stato possibile leggere dalla 
directory "${path}".
 LocalFileInsertToadlet.fileHeader=File
 LocalFileInsertToadlet.insert=Inserisci
 LocalFileInsertToadlet.listing=Elenco directory ${path}
 LocalFileInsertToadlet.listingTitle=Listing di ${path}
 LocalFileInsertToadlet.sizeHeader=Dimensioni
-LogConfigHandler.detaildPriorityThreshold=Soglie di priorit?? dettagliate
-LogConfigHandler.detaildPriorityThresholdLong=Soglie di priorit?? dettagliate. 
Esempio: freenet:normal,freenet.node:minor
+LogConfigHandler.detaildPriorityThreshold=Soglie di priorit??? dettagliate
+LogConfigHandler.detaildPriorityThresholdLong=Soglie di priorit??? 
dettagliate. Esempio: freenet:normal,freenet.node:minor
 LogConfigHandler.dirName=Directory dei log
 LogConfigHandler.dirNameLong=Directory contenente i log files
 LogConfigHandler.enabled=Abilita Log
@@ -606,28 +608,28 @@
 LogConfigHandler.maxCachedLinesLong=Numero massimo di righe nella RAM cache
 LogConfigHandler.maxZippedLogsSize=Spazio massimo utilizzabile da vecchi log 
file su disco rigido.
 LogConfigHandler.maxZippedLogsSizeLong=Spazio massimo utilizzabile da vecchi 
log
-LogConfigHandler.minLoggingPriority=Priorit?? minima dei messaggi da iscrivere 
nei log.
-LogConfigHandler.minLoggingPriorityLong=Minima priorit?? dei messaggi che 
vengono iscritti nel log file. Le opzioni sono: minor, normal, error, 
nell'ordine dalla meno alla pi?? verbosa.
+LogConfigHandler.minLoggingPriority=Priorit??? minima dei messaggi da 
iscrivere nei log.
+LogConfigHandler.minLoggingPriorityLong=Minima priorit??? dei messaggi che 
vengono iscritti nel log file. Le opzioni sono: minor, normal, error, 
nell'ordine dalla meno alla pi??? verbosa.
 LogConfigHandler.rotationInterval=Intervallo di rotazione dei log
 LogConfigHandler.rotationIntervalLong=Intervallo di rotazione dei log - 
Periodo di tempo allo scadere del quale i log vengono ruotati. Gli ultimi due 
log files vengono conservati (current.log e prev.log) insieme a diversi log 
file compressi fino al massimo impostato in maxZippedLogsSize
-LoggerHook.unrecognizedPriority=Nome di priorit?? non riconosciuto: ${name}.
-LongOption.parseError=Il valore specificato non pu?? essere interpretato come 
64-bit integer : ${val}
-MeaningfulNodeNameUserAlert.noNodeNick=Non ?? stato possibile trovare il 
nickname da utilizzare. Usare qui un indirizzo e-mail o un nickname IRC ?? 
generalmente una buona idea in quanto consente ai peer di identificare il nodo. 
(nota che soltanto i peer darknet elencati alla pagina Amici potranno vedere il 
nome del nodo, che resta invece invisibile ai peer Opennet)
+LoggerHook.unrecognizedPriority=Nome di priorit??? non riconosciuto: ${name}.
+LongOption.parseError=Il valore specificato non pu??? essere interpretato come 
64-bit integer : ${val}
+MeaningfulNodeNameUserAlert.noNodeNick=Non ??? stato possibile trovare il 
nickname da utilizzare. Usare qui un indirizzo e-mail o un nickname IRC ??? 
generalmente una buona idea in quanto consente ai peer di identificare il nodo. 
(nota che soltanto i peer darknet elencati alla pagina Amici potranno vedere il 
nome del nodo, che resta invece invisibile ai peer Opennet)
 MeaningfulNodeNameUserAlert.noNodeNickShort=Nome nodo non definito.
 MeaningfulNodeNameUserAlert.noNodeNickTitle=Nome nodo non definito.
 N2NTMToadlet.composingMessageLabel=Messaggio N2NTM  da inviare ai seguenti 
nodi:
 N2NTMToadlet.delayed=Il nodo interressato sta temporaneamente respingendo 
richieste; il messaggio potrebbe giungere in lieve ritardo.
 N2NTMToadlet.delayedTitle=Differito
-N2NTMToadlet.failed=Il peer interessato non ?? connesso in questo momento: non 
?? stato possibile inviare il messaggio
+N2NTMToadlet.failed=Il peer interessato non ??? connesso in questo momento: 
non ??? stato possibile inviare il messaggio
 N2NTMToadlet.failedTitle=Fallito
 N2NTMToadlet.friends=Amici
 N2NTMToadlet.homepage=Homepage
 N2NTMToadlet.noSuchFileOrCannotRead=Trasferimento fallito:File inesistente o 
illegibile.
 N2NTMToadlet.peerName=Nome del Peer
 N2NTMToadlet.peerNotFoundTitle=Peer non trovato
-N2NTMToadlet.peerNotFoundWithHash=Non ?? stato possibile trovare il peer con 
hash code \u201c${hash}\u201d
+N2NTMToadlet.peerNotFoundWithHash=Non ??? stato possibile trovare il peer con 
hash code \u201c${hash}\u201d
 N2NTMToadlet.processingSend=Invio messaggio in corso
-N2NTMToadlet.queued=In attesa: Il peer interessato non ?? connesso in questo 
momento. Il messaggio ?? stato posto in attesa e verr?? spedito al pi?? presto 
possibile
+N2NTMToadlet.queued=In attesa: Il peer interessato non ??? connesso in questo 
momento. Il messaggio ??? stato posto in attesa e verr??? spedito al pi??? 
presto possibile
 N2NTMToadlet.queuedTitle=Aggiunto alla Coda
 N2NTMToadlet.returnToFriends=Torna alla lista degli Amici
 N2NTMToadlet.returnToNodeHomepage=Torna alla homepage del nodo
@@ -638,30 +640,30 @@
 N2NTMToadlet.sentTitle=Inviato
 N2NTMToadlet.tooLong=I messaggi N2NTM possono contenere fino a un massimo di 
1024 caratteri
 N2NTMToadlet.tooLongTitle=Troppo Lungo
-N2NTMToadlet.unauthorized=L'accesso a questa pagina ?? interdetto
+N2NTMToadlet.unauthorized=L'accesso a questa pagina ??? interdetto
 N2NTMUserAlert.delete=Elimina
 N2NTMUserAlert.header=Da: ${from} (scritto ${composed} | inviato ${sent} | 
ricevuto ${received})
 N2NTMUserAlert.headerShort=Messaggio da ${from}
 N2NTMUserAlert.reply=Rispondi
 N2NTMUserAlert.title=Messaggio di testo da nodo a nodo (N2NTM) ${number} da: 
${peername} (${peer})
-Node.acceptSeedConnections=Selezionando "vero" il nodo accetter?? connessioni 
da nodi che intendono usare la modalit?? insicura (opennet) e li aiuter?? a 
connettersi alla rete Freenet. Ci?? rende possibile la connessione a qualsiasi 
nodo in possesso della referenza ma limitata dall'annuncio: le richieste di 
connessione sono indirizzate solo ai nodi aggiunti tramite annuncio. Il nodo 
locale potrebbe essere incluso a meno che non abbia gi?? molti peer opennet 
(visibili alla pagina "Sconosciuti")
+Node.acceptSeedConnections=Selezionando "vero" il nodo accetter??? connessioni 
da nodi che intendono usare la modalit??? insicura (opennet) e li aiuter??? a 
connettersi alla rete Freenet. Ci??? rende possibile la connessione a qualsiasi 
nodo in possesso della referenza ma limitata dall'annuncio: le richieste di 
connessione sono indirizzate solo ai nodi aggiunti tramite annuncio. Il nodo 
locale potrebbe essere incluso a meno che non abbia gi??? molti peer opennet 
(visibili alla pagina "Sconosciuti")
 Node.acceptSeedConnectionsShort=Abilita seednode
 Node.alwaysAllowLocalAddresses=Permettere sempre la connessione a nodi via 
indirizzi locali?
-Node.alwaysAllowLocalAddressesLong=Se impostato su "vero" il nodo cercher?? di 
connettersi ad altri nodi usando il loro indirizzo locale (localhost, LAN) 
oltre al loro indirizzo IP pubblico. Se questa opzione non e' impostata, si 
pu?? comunque abilitarla separatamente per singoli peer darknet (ma non per i 
peer opennet). Impostare questa opzione se ci si vuole connettere ad altri nodi 
sulla stessa rete locale (LAN) o che girano sullo stesso computer, e non far 
caso alle referenze "bogus" ("scr??use") che possono far mandare al nodo 
pacchetti UDP alle macchine sulla rete locale.
+Node.alwaysAllowLocalAddressesLong=Se impostato su "vero" il nodo cercher??? 
di connettersi ad altri nodi usando il loro indirizzo locale (localhost, LAN) 
oltre al loro indirizzo IP pubblico. Se questa opzione non e' impostata, si 
pu??? comunque abilitarla separatamente per singoli peer darknet (ma non per i 
peer opennet). Impostare questa opzione se ci si vuole connettere ad altri nodi 
sulla stessa rete locale (LAN) o che girano sullo stesso computer, e non far 
caso alle referenze "bogus" ("scr???use") che possono far mandare al nodo 
pacchetti UDP alle macchine sulla rete locale.
 Node.assumeNATed=Presumere che la porta non sia forwardata.
-Node.assumeNATedLong=Dare per scontato che la porta sia dietro NAT e non 
forwardata? In questo caso il nodo mander?? handshake ogni 10-30 secondi.
+Node.assumeNATedLong=Dare per scontato che la porta sia dietro NAT e non 
forwardata? In questo caso il nodo mander??? handshake ogni 10-30 secondi.
 Node.bandwidthLimitMustBePositiveOrMinusOne=Il valore dell'ampiezza di banda 
deve essere positivo o -1
 Node.bindTo=Indirizzo IP
 Node.bindToLong=Indirizzo IP
-Node.buggyJVM=La JVM attualmente in uso (${version}) ?? una versione 
notoriamente afflitta da 'bug' che pu?? produrre OutOfMemoryError anche con 
molta memoria ancora a disposizione. Si raccomanda di aggiornare Java. La 
versione consigliata ?? Sun Java 1.6, ma ?? possibile usare anche 1.4.2 o 1.5.
-Node.buggyJVMShort=Freenet sta attualmente utilizzando Java versione 
${version}, che ?? notoriamente afflitta da p'bug' pericolosi. Si prega di 
aggiornare Java al pi?? presto possibile.
+Node.buggyJVM=La JVM attualmente in uso (${version}) ??? una versione 
notoriamente afflitta da 'bug' che pu??? produrre OutOfMemoryError anche con 
molta memoria ancora a disposizione. Si raccomanda di aggiornare Java. La 
versione consigliata ??? Sun Java 1.6, ma ??? possibile usare anche 1.4.2 o 1.5.
+Node.buggyJVMShort=Freenet sta attualmente utilizzando Java versione 
${version}, che ??? notoriamente afflitta da p'bug' pericolosi. Si prega di 
aggiornare Java al pi??? presto possibile.
 Node.buggyJVMTitle=Avvertennza JVM soggetta a 'bug'
-Node.buggyJVMWithLink=La JVM in uso (${version}) ?? notoriamente 
${link}difettosa${/link}. Pu?? produrre errori tipo OutOfMemoryError anche con 
molta memoria ancora disponibile. Sarebbe auspicabile aggiornare almeno a Sun 
Java 1.4.2_13, 1.5.0_10 o 1.6 (quest'ultima ?? la versione consigliata).
+Node.buggyJVMWithLink=La JVM in uso (${version}) ??? notoriamente 
${link}difettosa${/link}. Pu??? produrre errori tipo OutOfMemoryError anche con 
molta memoria ancora disponibile. Sarebbe auspicabile aggiornare almeno a Sun 
Java 1.4.2_13, 1.5.0_10 o 1.6 (quest'ultima ??? la versione consigliata).
 Node.bwlimitMustBePositive=Il limite dell'ampiezza di banda deve essere 
positivo
 Node.databaseMemory=Memoria massima utilizzabile dal datastore
 Node.databaseMemoryLong=Uso massimo della memoria del database contenente 
indici del magazzino dati (datastore). 0 significa nessun limite (non supera 
comunque il 30% circa della memoria massima)
 Node.deadlockTitle=Deadlocking probabilmente dovuto ad una combinazione di JVM 
e kernel che da luogo a "bug".
-Node.deadlockWarning=ATTENZIONE: E' stato rilevato l'uso di Sun JVM con NPTL. 
Ci?? pu?? produrre il "congelamento" del nodo a causa della JVM che perde un 
lock. Per ovviare a tale inconveniente ?? necessatio disabilitare NPTL 
impostando la variabile ambientale LD_ASSUME_KERNEL=2.4.1. Le versioni pi?? 
recenti di Freenet installer dovrebbero gi?? esserne provviste; reinstallare, o 
modificare il file run.sh 
(https://emu.freenetproject.org/svn/trunk/apps/installer/installclasspath/run.sh).
 Su alcuni sistemi pu?? essere necessario installare le pthreads libraries 
perch?? questo funzioni. Nota che il nodo cercherebbe di riavviarsi 
automaticamente se un tale deadlock occorresse, ma questa funzione non ?? 
ancora pienamente affidabile, e richiede tempo.
+Node.deadlockWarning=ATTENZIONE: E' stato rilevato l'uso di Sun JVM con NPTL. 
Ci??? pu??? produrre il "congelamento" del nodo a causa della JVM che perde un 
lock. Per ovviare a tale inconveniente ??? necessatio disabilitare NPTL 
impostando la variabile ambientale LD_ASSUME_KERNEL=2.4.1. Le versioni pi??? 
recenti di Freenet installer dovrebbero gi??? esserne provviste; reinstallare, 
o modificare il file run.sh 
(https://emu.freenetproject.org/svn/trunk/apps/installer/installclasspath/run.sh).
 Su alcuni sistemi pu??? essere necessario installare le pthreads libraries 
perch??? questo funzioni. Nota che il nodo cercherebbe di riavviarsi 
automaticamente se un tale deadlock occorresse, ma questa funzione non ??? 
ancora pienamente affidabile, e richiede tempo.
 Node.disableHangCheckers=Disabilita tutti gli hang checker
 Node.disableHangCheckersLong=Disabilita tutte le funzioni hang 
checkers/watchdog. Impostare per fare il profiling di Fred.
 Node.disablePHTLS=Disabilita HTL probabilistico
@@ -680,17 +682,17 @@
 Node.enableSwappingLong=Abilita scambio di locazione? (NON DISABILITARE! Utile 
solo in alcune simulazioni).
 Node.enableULPRDataPropagation=Abilita propagazione dati ULPR?
 Node.enableULPRDataPropagationLong=Abilita propagazione rapida di chiavi 
richieste recentemente ai nodi che le hanno richieste quando i dati sono stati 
finalmente trovati? (Richieste Persistenti Ultra-Leggere)
-Node.errorApplyingConfig=Si ?? verificato un errore durante l'applicazione 
della nuova configurazione : ${error}
+Node.errorApplyingConfig=Si ??? verificato un errore durante l'applicazione 
della nuova configurazione : ${error}
 Node.extraPeerDir=Directory dei dati extra peer
 Node.extraPeerDirLong=Directory dove conservare dati extra
 Node.forceBigShrink=Esegui immediatamente grosse riduzioni di dimensione dello 
store
-Node.forceBigShrinkLong=Determina se eseguire immediatamente le riduzioni di 
dimensione in misura superiore al 10% del magazzino (store), piuttosto che 
aspettare il prossimo riavvio del nodo. Le riduzioni on-line non preservano i 
dati utilizzati per ultimi quindi l'uso di questa opzione non ?? raccomandato; 
da usarsi solo nel caso in cui sia desiderabile un risultato immediato.
+Node.forceBigShrinkLong=Determina se eseguire immediatamente le riduzioni di 
dimensione in misura superiore al 10% del magazzino (store), piuttosto che 
aspettare il prossimo riavvio del nodo. Le riduzioni on-line non preservano i 
dati utilizzati per ultimi quindi l'uso di questa opzione non ??? raccomandato; 
da usarsi solo nel caso in cui sia desiderabile un risultato immediato.
 Node.inBWLimit=Limite ampiezza di banda in entrata (bytes per secondo)
 Node.inBWLimitLong=Limite dell'ampiezza di banda in entrata (bytes/sec); il 
nodo cerca di non eccedere tale limite; -1 siglifica quattro volte il limite 
impostato per l'ampiezza di banda in uscita (outputBandwidthLimit)
 Node.invalidStoreSize=Il datastore (magazzino dati) deve essere di dimensioni 
uguali o superiori a 32MB
-Node.java14ShortText=Tra breve non sara pi?? possibile operare un nodo Freenet 
su Java 1.4. Si prega di aggiornare a 1.5 o 1.6
-Node.java14Text=Freenet sta girando su una versione 1.4 di Java. Si prega di 
aggiornare almeno a Java 1.5. Gli aggiornamenti automatici di Freenet sono 
stati temporaneamente disabilitati in quanto versioni future potrebbero non non 
girare del tutto.
-Node.java14Title=Freenet non ?? pi?? compatibile con Java 1.4
+Node.java14ShortText=Entro breve tempo non sar?? pi?? possibile far girare 
Freenet su Java 1.4. Si prega di aggiornare.
+Node.java14Text=Freenet sta girando su Java 1.4. Si prega di aggiornare a Java 
1.5 o superiore. Gli Aggiornamenti automatici sono stati temporaneamente 
disabilitati per evitare problemi con le prossime versioni di Freenet, che non 
potranno funzionare con Java 1.4.
+Node.java14Title=Java 1.4. non ?? pi?? supportata
 Node.l10nLanguage=Lingua dell' interfaccia grafica
 Node.l10nLanguageLong=Cambia la lingua in cui messaggi sono visualizzati. 
Alcune frasi e messaggi saranno visibili in versione tradotta solo dopo il 
prossimo riavvio del nodo.
 Node.maxHTL=HTL massimo
@@ -704,64 +706,64 @@
 Node.nodeName=Nome del nodo
 Node.nodeNameLong=Nome del nodo. E' visibile solo agli Amici (darknet peer), 
mentre gli Sconosciuti (opennet peer) non potranno vederlo.
 Node.notUsingSunVM=E' stata rilevata una JVM ${vendor} ${version} che potrebbe 
influire sul corretto funzionamento del nodo. Se possibile, installare Sun java 
disponibile presso http://www.java.com/getjava
-Node.notUsingSunVMShort=Freenet sta attualmente utilizzando JVM (Java Virtual 
Machine) diversa da Sun, che ?? quella raccomandata. Si prega di scaricare ed 
installare la versione corrente di Sun Java JRE (Java Runtime Environment)
+Node.notUsingSunVMShort=Freenet sta attualmente utilizzando JVM (Java Virtual 
Machine) diversa da Sun, che ??? quella raccomandata. Si prega di scaricare ed 
installare la versione corrente di Sun Java JRE (Java Runtime Environment)
 Node.notUsingSunVMTitle=Il nodo non sta usando una JVM della Sun
-Node.notUsingWrapper=Il nodo sta girando senza il wrapper. Ci?? ?? 
generalmente sconsigliabile. Il nodo non potr?? riavviare s?? stesso e quindi 
l'aggiornamento automatico non potr?? funzionare. Inoltre, se la JVM se ne 
dovesse andare nel "limbo" non sar?? possibile riavviare automaticamente 
nemmeno qiuella. Non verranno generati stack dump in alcuni posti e quindi 
debugging sar?? pi?? difficile.
-Node.notUsingWrapperShort=Freenet sta girando senza wrapper. Questo non ?? 
raccomandato.
+Node.notUsingWrapper=Il nodo sta girando senza il wrapper. Ci??? ??? 
generalmente sconsigliabile. Il nodo non potr??? riavviare s??? stesso e quindi 
l'aggiornamento automatico non potr??? funzionare. Inoltre, se la JVM se ne 
dovesse andare nel "limbo" non sar??? possibile riavviare automaticamente 
nemmeno qiuella. Non verranno generati stack dump in alcuni posti e quindi 
debugging sar??? pi??? difficile.
+Node.notUsingWrapperShort=Freenet sta girando senza wrapper. Questo non ??? 
raccomandato.
 Node.notUsingWrapperTitle=Il nodo non sta usando il wrapper!
 Node.oneConnectionPerIP=Limita ad una connessione per indirizzo?
-Node.oneConnectionPerIPLong=Non permettere pi?? di una connessione per 
indirizzo? Ci?? rende leggermente pi?? difficile un attacco eseguito 
connettendosi al nodo pi?? volte con diverse identit?? in modo da dominarne il 
routing (instradamento) e rendere pi?? facile raccogliere dati con lo 
"harvesting" (lett: "il raccolto", in agricoltura). Questa opzione impedisce 
che un peer sia connesso al nodo sia su darknet che su opennet.
-Node.opennetEnabled=Abilita Modalit?? Insicura (connette automaticamente a 
nodi gestiti da Sconosciuti)
-Node.opennetEnabledLong=Abilita Modalit?? Insicura? (detta anche Opennet) 
Abilitando questa opzione il nodo scambier?? automaticamente referenze on altri 
nodi. Ci?? rende facilmente osservabile dall'esterno il fatto che su questo 
computer sta girando un nodo Freenet, facilitando attacchi di diversi tipi. 
Avendone la possibilit??, l'opzione migiore ?? quella di connettersi soltanto 
ad utenti conosciuti ed addifabili (Darknet peer, vedi pagina Amici)
+Node.oneConnectionPerIPLong=Non permettere pi??? di una connessione per 
indirizzo? Ci??? rende leggermente pi??? difficile un attacco eseguito 
connettendosi al nodo pi??? volte con diverse identit??? in modo da dominarne 
il routing (instradamento) e rendere pi??? facile raccogliere dati con lo 
"harvesting" (lett: "il raccolto", in agricoltura). Questa opzione impedisce 
che un peer sia connesso al nodo sia su darknet che su opennet.
+Node.opennetEnabled=Abilita Modalit??? Insicura (connette automaticamente a 
nodi gestiti da Sconosciuti)
+Node.opennetEnabledLong=Abilita Modalit??? Insicura? (detta anche Opennet) 
Abilitando questa opzione il nodo scambier??? automaticamente referenze on 
altri nodi. Ci??? rende facilmente osservabile dall'esterno il fatto che su 
questo computer sta girando un nodo Freenet, facilitando attacchi di diversi 
tipi. Avendone la possibilit???, l'opzione migiore ??? quella di connettersi 
soltanto ad utenti conosciuti ed addifabili (Darknet peer, vedi pagina Amici)
 Node.outBWLimit=Limite dell'ampiezza di banda in uscita (bytes per secondo)
 Node.outBWLimitLong=Limite "duro" dell' ampiezza di banda in uscita 
(bytes/sec); di solito il nodo non eccede questo limite
 Node.passOpennetPeersThroughDarknet=Trasmetti referenze opennet attraverso 
darknet peer
-Node.passOpennetPeersThroughDarknetLong=Se impostata su "vero" referenze 
opennet verranno trasmesse attraverso peer darknet (ma MAI la referenza del 
nodo locale). In questo modo un nodo (nodo locale, o i suoi peer) pu?? ottenere 
peer opennet dai suoi peer darknet. Questo ?? utile perch?? permette di 
riconnettersi in caso di perdita dei peer, per esempio dopo una lunga 
disconnessione, ma rende l'analisi del traffico leggermente pi?? facile, quindi 
chi ?? paranoico dovrebbe disabilitare questa opzione.
+Node.passOpennetPeersThroughDarknetLong=Se impostata su "vero" referenze 
opennet verranno trasmesse attraverso peer darknet (ma MAI la referenza del 
nodo locale). In questo modo un nodo (nodo locale, o i suoi peer) pu??? 
ottenere peer opennet dai suoi peer darknet. Questo ??? utile perch??? permette 
di riconnettersi in caso di perdita dei peer, per esempio dopo una lunga 
disconnessione, ma rende l'analisi del traffico leggermente pi??? facile, 
quindi chi ??? paranoico dovrebbe disabilitare questa opzione.
 Node.port=Numero della porta FNP (UDP)
 Node.portLong=Porta UDP per le comunicazioni da nodo a nodo (Freenet Node 
Protocol)
 Node.storeDirectory=Directory magazzino dati (store)
 Node.storeDirectoryLong=Directory contenente gli store file
-Node.storeMaxMemTooHigh=Impostare un valore superiore ad 80% della memoria RAM 
da destinare a BDB ?? generalmente una pessima idea.
+Node.storeMaxMemTooHigh=Impostare un valore superiore ad 80% della memoria RAM 
da destinare a BDB ??? generalmente una pessima idea.
 Node.storeSize=Dimensioni in bytes del magazzino dati (store)
 Node.storeSizeLong=Dimensioni del magazzino (store) in bytes
 Node.storeType=Tipo di magazzino dati (store). NON TOCCARE!!
-Node.storeTypeLong=Tipo di datastore. Attualmente pu?? essere un indice bdb 
(usa un BerkeleyDBFreenetStore per l'indice, e mette i dati in dei file su 
disco), o ram (indice e dati in RAM). L'uso di ram ?? riservato a persone 
competenti, e solo se c'e' memoria sufficiente a disposizione per tutti i dati 
(NOTA: in questo caso i dati NON verranno salvati all'arresto del nodo)
+Node.storeTypeLong=Tipo di datastore. Attualmente pu??? essere un indice bdb 
(usa un BerkeleyDBFreenetStore per l'indice, e mette i dati in dei file su 
disco), o ram (indice e dati in RAM). L'uso di ram ??? riservato a persone 
competenti, e solo se c'e' memoria sufficiente a disposizione per tutti i dati 
(NOTA: in questo caso i dati NON verranno salvati all'arresto del nodo)
 Node.swapRInterval=Intervallo tra le richieste di scambio (swap) in 
millisecondi
 Node.swapRIntervalLong=Intervallo tra richieste di scambio (swap) in 
millisecondi. Non toccare!
 Node.throttleLocalTraffic=Limitazione di banda su traffico locale
-Node.throttleLocalTrafficLong=Abilita limitazione di banda su traffico locale? 
Abilitando questa opzione,  la limitazione di banda avr?? effetto anche sulla 
rete locale (LAN) e su localhost.
+Node.throttleLocalTrafficLong=Abilita limitazione di banda su traffico locale? 
Abilitando questa opzione,  la limitazione di banda avr??? effetto anche sulla 
rete locale (LAN) e su localhost.
 Node.tooSmallMTU=MTU insufficiente
-Node.tooSmallMTULong=L' MTU della connessione sembra essere ${mtu} bytes. 
Freenet non pu?? funzionare bene con un MTU minore di ${minMTU} bytes: le 
connessioni saranno inaffidabili e forse rallentate. Se possibile, si dovrebbe 
provvedere a risolvere il problema.
+Node.tooSmallMTULong=L' MTU della connessione sembra essere ${mtu} bytes. 
Freenet non pu??? funzionare bene con un MTU minore di ${minMTU} bytes: le 
connessioni saranno inaffidabili e forse rallentate. Se possibile, si dovrebbe 
provvedere a risolvere il problema.
 Node.tooSmallMTUShort=Problema di connessione: MTU di connessione troppo basso 
per consentire a Freenet di funzionare correttamente. Potranno verificarsi dei 
problemi.
-NodeClientCore.couldNotFindOrCreateDir=Non ?? stato possibile trovare o creare 
la directory
-NodeClientCore.downloadAllowedDirs=Directory dove il download ?? consentito
-NodeClientCore.downloadAllowedDirsLong=Si pu?? usare una lista di directory 
dove dove il download e' permesso, separate da 'punto e virgola' (;). 
"downloads" significa downloadsDir, vuoto (nessuna directory specificata) 
significa che il download su disco non e' permesso, "all" significa download 
permessi in tutte le directory AVVERTENZA; Se impostato su "all" ("tutte"), 
ogni utente potr?? scaricare files  in qualsiasi directory.
+NodeClientCore.couldNotFindOrCreateDir=Non ??? stato possibile trovare o 
creare la directory
+NodeClientCore.downloadAllowedDirs=Directory dove il download ??? consentito
+NodeClientCore.downloadAllowedDirsLong=Si pu??? usare una lista di directory 
dove dove il download e' permesso, separate da 'punto e virgola' (;). 
"downloads" significa downloadsDir, vuoto (nessuna directory specificata) 
significa che il download su disco non e' permesso, "all" significa download 
permessi in tutte le directory AVVERTENZA; Se impostato su "all" ("tutte"), 
ogni utente potr??? scaricare files  in qualsiasi directory.
 NodeClientCore.downloadDir=Directory predefinita per i download
 NodeClientCore.downloadDirLong=Directory predefinita dove salvare i file 
scaricati
 NodeClientCore.fileForClientStats=File contenente statistiche del client
 NodeClientCore.fileForClientStatsLong=File dove conservare le statistiche 
relative al client throttling (utilizzato per stabilire l'intervallo tra le 
richieste)
-NodeClientCore.lazyResume=Caricare completamente le richieste persistenti dopo 
aver completato l'avvio del nodo? (Fa maggiore uso di memoria ma avvia il nodo 
pi?? velocemente)
-NodeClientCore.lazyResumeLong=Le richieste persistenti possono essere caricate 
durante l'avvio del nodo, oppure si possono scrivere i dati in memoria e 
caricarli completamente solo dopo che il processo di avvio ?? terminato. Ci?? 
riduce tempo di avviamento ma fa maggior uso di memoria.
+NodeClientCore.lazyResume=Caricare completamente le richieste persistenti dopo 
aver completato l'avvio del nodo? (Fa maggiore uso di memoria ma avvia il nodo 
pi??? velocemente)
+NodeClientCore.lazyResumeLong=Le richieste persistenti possono essere caricate 
durante l'avvio del nodo, oppure si possono scrivere i dati in memoria e 
caricarli completamente solo dopo che il processo di avvio ??? terminato. Ci??? 
riduce tempo di avviamento ma fa maggior uso di memoria.
 NodeClientCore.maxUSKFetchers=Numero massimo di USK fetchers ammessi
 NodeClientCore.maxUSKFetchersLong=Numero massimo di USK fetchers ammessi
 NodeClientCore.maxUSKFetchersMustBeGreaterThanZero=Deve essere maggiore di zero
-NodeClientCore.movingTempDirOnTheFlyNotSupported=Non ?? possible cambiare la 
directory dei file temporanei mentre il nodo ?? in funzione
+NodeClientCore.movingTempDirOnTheFlyNotSupported=Non ??? possible cambiare la 
directory dei file temporanei mentre il nodo ??? in funzione
 NodeClientCore.persistentTempDir=Directory dei file temporanei persistenti
 NodeClientCore.persistentTempDirLong=Nome della directory dei file temporanei 
persistenti
-NodeClientCore.startingUp=Si prega di concedere a Freenet alcuni minuti per 
completare il processo di avviamento. Nel frattempo alcune funzioni non saranno 
disponibili e il nodo potr?? risultare pi?? lento del normale.
-NodeClientCore.startingUpShort=L'avviamento di Freenet ?? ancora in corso: 
alcune funzioni potrebbero non essere ancora disponibili e il nodo potrebbe 
operare ad una velocit?? inferiore al normale.
+NodeClientCore.startingUp=Si prega di concedere a Freenet alcuni minuti per 
completare il processo di avviamento. Nel frattempo alcune funzioni non saranno 
disponibili e il nodo potr??? risultare pi??? lento del normale.
+NodeClientCore.startingUpShort=L'avviamento di Freenet ??? ancora in corso: 
alcune funzioni potrebbero non essere ancora disponibili e il nodo potrebbe 
operare ad una velocit??? inferiore al normale.
 NodeClientCore.startingUpTitle=Avviamento di Freenet in corso
 NodeClientCore.tempDir=Directory file temporanei
 NodeClientCore.tempDirLong=Nome della directory dei file temporanei
 NodeClientCore.uploadAllowedDirs=Directory dalle quali l'upload e' consentito
-NodeClientCore.uploadAllowedDirsLong=Si pu?? usare una lista di directory dove 
l'upload e' consentito, separate da 'punto e virgola' (;). Vuoto (nessuna 
directory specificata) significa che l'upload non e' permesso, "all" significa 
upload permesso da tutte le directory AVVERTENZA; Se impostato su "all" 
("tutte"), ogni utente potr?? inserire qualunque file da qualsiasi directory.
+NodeClientCore.uploadAllowedDirsLong=Si pu??? usare una lista di directory 
dove l'upload e' consentito, separate da 'punto e virgola' (;). Vuoto (nessuna 
directory specificata) significa che l'upload non e' permesso, "all" significa 
upload permesso da tutte le directory AVVERTENZA; Se impostato su "all" 
("tutte"), ogni utente potr??? inserire qualunque file da qualsiasi directory.
 NodeIPDectector.inclLocalAddress=Noderef include indirizzi locali
-NodeIPDectector.inclLocalAddressLong=Specifica se includere l'indirizzo locale 
(LAN e localhost) nella referenza del nodo. Ci?? non ?? necessario a meno che 
entrambi i nodi che si vogliono collegare abbiano impostato 
allowLocalAddresses=true per le rispettive referenze (per impostare questa 
opzione, abilitare la modalit?? avanzata e usare le opzioni disponibili alla 
pagina Amici).
+NodeIPDectector.inclLocalAddressLong=Specifica se includere l'indirizzo locale 
(LAN e localhost) nella referenza del nodo. Ci??? non ??? necessario a meno che 
entrambi i nodi che si vogliono collegare abbiano impostato 
allowLocalAddresses=true per le rispettive referenze (per impostare questa 
opzione, abilitare la modalit??? avanzata e usare le opzioni disponibili alla 
pagina Amici).
 NodeIPDectector.ipOverride=Impostazione manuale indirizzo IP
-NodeIPDectector.ipOverrideLong=Impostazione manuale dell'indirizzo IP (di 
solito non ?? necessario) - Utilizzare questa opzione se si ha un indirizzo IP 
statico o un domain name  (es. dyndns), e ci si trova dietro un firewall.
+NodeIPDectector.ipOverrideLong=Impostazione manuale dell'indirizzo IP (di 
solito non ??? necessario) - Utilizzare questa opzione se si ha un indirizzo IP 
statico o un domain name  (es. dyndns), e ci si trova dietro un firewall.
 NodeIPDectector.tempAddressHint=Suggerimento temporaneo indirizzo IP
 NodeIPDectector.tempAddressHintLong=Suggerisce temporaneamente l'indirizzo IP; 
viene eliminato dopo l'uso
-NodeIPDetector.maybeSymmetric=Sembra che il nodo sia dietro una NAT 
simmetrica. Potrebbe trattarsi di problemi di connessione: se ci si trova 
dietro una NAT simmetrica ci si potr?? probabilmente connettere soltanto con i 
nodi che sono raggiungibili da interenet.
+NodeIPDetector.maybeSymmetric=Sembra che il nodo sia dietro una NAT 
simmetrica. Potrebbe trattarsi di problemi di connessione: se ci si trova 
dietro una NAT simmetrica ci si potr??? probabilmente connettere soltanto con i 
nodi che sono raggiungibili da interenet.
 NodeIPDetector.maybeSymmetricShort=Problema di connessione: il nodo potrebbe 
trovarsi dietro una NAT simmetrica.
 NodeIPDetector.maybeSymmetricTitle=Problemi di connessione
 NodeIPDetector.unknownHostErrorInIPOverride=Host sconosciuto: ${error}
@@ -771,8 +773,8 @@
 NodeStat.freeHeapBytesThresholdLong=Il nodo respinge richieste per mantenere 
la quota di free heap bytes impostata
 NodeStat.freeHeapPercentThreshold=Soglia percentuale free heap
 NodeStat.freeHeapPercentThresholdLong=Respingendo nuove richieste, il nodo 
mantiene la  percentuale di di free heap (in rapporto a max heap bytes ammessi) 
 al di sopra della soglia
-NodeStat.ignoreLocalVsRemoteBandwidthLiability=Gestisi richieste locali allo 
come quelle remote per limitazioni della disponibilit?? di banda
-NodeStat.ignoreLocalVsRemoteBandwidthLiabilityLong=Abilitando questa opzione 
si riduce notevolmente la banda utilizzata e si aumenta leggermente la 
sicurezza nei confronti di attacchi di timing. Generalmente non c'?? di che 
preoccuparsi per questo tipo di attacchi in quanto gli attacchi di correlazione 
sono pi?? facili da eseguire.
+NodeStat.ignoreLocalVsRemoteBandwidthLiability=Gestisi richieste locali allo 
come quelle remote per limitazioni della disponibilit??? di banda
+NodeStat.ignoreLocalVsRemoteBandwidthLiabilityLong=Abilitando questa opzione 
si riduce notevolmente la banda utilizzata e si aumenta leggermente la 
sicurezza nei confronti di attacchi di timing. Generalmente non c'??? di che 
preoccuparsi per questo tipo di attacchi in quanto gli attacchi di correlazione 
sono pi??? facili da eseguire.
 NodeStat.memCheck=Abilita Verifica di Memoria
 NodeStat.memCheckLong=Abilita verifica della memoria (scrive un messaggio nel 
log file. La verifica della memoria deve essere abilitata perche' 
aggressiveGCModificator abbia effetto)
 NodeStat.statsPersister=File contenente le statistiche del nodo
@@ -780,8 +782,8 @@
 NodeStat.threadLimit=Limite thread
 NodeStat.threadLimitLong=Il nodo respinge richieste per limitare l'uso di 
thread al valore specificato.
 NodeStats.mustBePercentValueNotFull=Questo valore deve essere espresso in 
precentuale, compresa tra 0 e 99.
-NodeStats.valueTooLow=Valore troppo basso per questa impostazione: ?? 
necessario aumentarlo.
-NodeUpdateManager.enabled=Verifica disponibilit?? e scarica nuove versioni
+NodeStats.valueTooLow=Valore troppo basso per questa impostazione: ??? 
necessario aumentarlo.
+NodeUpdateManager.enabled=Verifica disponibilit??? e scarica nuove versioni
 NodeUpdateManager.enabledLong=Verifica e scarica automaticamente nuove 
versioni di Freenet. Se impostatos su 'vero', le nuove versioni verranno 
scaricate ma non necessariamente installate. L'impostazione torna sempre su 
'falso' se il nodo non gira all'interno del wrapper.
 NodeUpdateManager.extURI=Dove cercare versioni aggiornate di freenet-ext.jar?
 NodeUpdateManager.extURILong=Dove cercare aggiornamenti per freenet-ext.jar?
@@ -790,7 +792,7 @@
 NodeUpdateManager.invalidExtURI=Ext URI non valida: ${error}
 NodeUpdateManager.invalidRevocationURI=URI di revoca non valida: ${error}
 NodeUpdateManager.invalidUpdateURI=URI di aggiornamento non valida: ${error}
-NodeUpdateManager.noUpdateWithoutWrapper=Non ?? stato possibile completare 
l'aggiornamento perch?? il nodo non sta girando nel wrapper
+NodeUpdateManager.noUpdateWithoutWrapper=Non ??? stato possibile completare 
l'aggiornamento perch??? il nodo non sta girando nel wrapper
 NodeUpdateManager.revocationURI=Dove cercare la chiave di revoca?
 NodeUpdateManager.revocationURILong=URI per la chiave di revoca. Se viene 
trovata il nodo ne mostra il contenuto e disabilita l'aggiornamento automatico.
 NodeUpdateManager.updateCatastropheTitle=Fallimento Catastrofico dell' 
Aggiornamento!
@@ -799,32 +801,32 @@
 NodeUpdateManager.updateFailedTitle=Aggiornamento Fallito!
 NodeUpdateManager.updateURI=Dove cercare aggiornamenti?
 NodeUpdateManager.updateURILong=Dove cercare aggiornamenti?
-NotEnoughNiceLevelsUserAlert.content=Il nodo ha rilevato di stare operando ad 
un Nice level alto. In mancanza di un numero sufficiente di livelli di nice, il 
nodo non potr?? operare a pieno regime. Si prega di ridurre il livello di nice. 
(cercare PRIORITY nel file run.sh e ridurne il valore). Attualmente il nodo ha 
${available} livelli a disposizione mentre avrebbe bisogno di ${required} 
livelli.
+NotEnoughNiceLevelsUserAlert.content=Il nodo ha rilevato di stare operando ad 
un Nice level alto. In mancanza di un numero sufficiente di livelli di nice, il 
nodo non potr??? operare a pieno regime. Si prega di ridurre il livello di 
nice. (cercare PRIORITY nel file run.sh e ridurne il valore). Attualmente il 
nodo ha ${available} livelli a disposizione mentre avrebbe bisogno di 
${required} livelli.
 NotEnoughNiceLevelsUserAlert.short=Non ci sono abbastanza Nice level 
disponibili. si prega di assegnare a Freenet un Nice level inferiore.
 NotEnoughNiceLevelsUserAlert.title=Numero di Nice level insufficiente!
-OpennetConnectionsToadlet.fullTitle=${counts} Sconosciuti (Peer non fid??ti) 
del nodo: ${name}
-OpennetConnectionsToadlet.peersListTitle=Peer Opennet (peer non fid??ti 
aggiunti automaticamente dal nodo)
-OpennetConnectionsToadlet.successTime=L'ultima volta che si ?? riusciti a 
richiamare una CHK dal nodo.
+OpennetConnectionsToadlet.fullTitle=${counts} Sconosciuti (Peer non fid???ti) 
del nodo: ${name}
+OpennetConnectionsToadlet.peersListTitle=Peer Opennet (peer non fid???ti 
aggiunti automaticamente dal nodo)
+OpennetConnectionsToadlet.successTime=L'ultima volta che si ??? riusciti a 
richiamare una CHK dal nodo.
 OpennetConnectionsToadlet.successTimeTitle=Ultimo successo
-OpennetUserAlert.warning=Il nodo sta funzionando in modo "promiscuo". Ci?? 
significa che il nodo si connetter?? con nodi operati da sconosiuti, e quindi 
chiunque potr?? facilmente determinare che l'utente Tal dei Tali sta usando 
Freenet. Molti attacchi vengono facilitati da questa modalit??, bloccare il 
nodo (per esempio con un firewall nazionale) diventa molto pi?? facile, ed 
intoltre l'utente non ha controllo su chi si connette al suo nodo. Si 
raccomanda vivamente di procurarsi qualche connessione ad Amici (nodi operati 
da persone conosciute); il modo promiscuo va considerato una misura temporanea 
da utilizzarsi temporaneamente, in attesa di connessioni ad amici. 
Connettendosi esclusivamente a nodi gestiti da persone conosciute, pur non 
essendo impossibli degli attacchi da parte loro, risulter?? comunque meno 
probabile l'esposizione ad agenzie governative (tipo servizi segreti o che so 
io) o altri "cattivi". Nota che aggiungere un peer alla sezione Amici non 
cambia molto la situazione, a meno che tale nodo non sia gestito da qualcuno di 
consciuto e di cui ci si fida (per ragioni sia di routing [instradamento] che 
di sicurezza)!
-OpennetUserAlert.warningShort=Modalit?? insicura abilitata.
-OpennetUserAlert.warningTitle=Avvertenza: Modo Promiscuo Attivato: Il nodo si 
connetter?? a degli sconosciuti
-PNGFilter.invalidHeader=Il file che si sta cercando di richiamare non e' un 
PNG: esso non include un header PNG valido. Potrebbe trattarsi di un file in 
altro formato e il browser potrebbe fare qualcosa di pericoloso a causa della 
confusione creata dalla mancata corrispondenza; il file ?? stato pertanto 
bloccato.
+OpennetUserAlert.warning=Il nodo sta funzionando in Modalit?? Insicura. Ci?? 
significa che il nodo si connetter?? con nodi operati da sconosiuti, e quindi 
chiunque potr?? facilmente determinare che l'utente Tal dei Tali sta usando 
Freenet. Molti attacchi vengono facilitati da questa modalit??, bloccare il 
nodo (per esempio con un firewall nazionale) diventa molto pi?? facile, ed 
intoltre l'utente non ha controllo su chi si connette al suo nodo. Si 
raccomanda vivamente di procurarsi qualche connessione ad Amici (nodi operati 
da persone conosciute); il modo promiscuo va considerato una misura temporanea 
da utilizzarsi temporaneamente, in attesa di connessioni ad amici. 
Connettendosi esclusivamente a nodi gestiti da persone conosciute, pur non 
essendo impossibli degli attacchi da parte loro, risulter?? comunque meno 
probabile l'esposizione ad agenzie governative (tipo servizi segreti o che so 
io) o altri "cattivi". Nota che aggiungere un peer alla sezione Amici non 
cambia molto la situazione, a meno che tale nodo non sia gestito da qualcuno di 
consciuto e di cui ci si fida (per ragioni sia di routing [instradamento] che 
di sicurezza)!
+OpennetUserAlert.warningShort=Modalit??? insicura abilitata.
+OpennetUserAlert.warningTitle=Avvertenza: Modalit?? Insicura Abilitata: Il 
nodo si connetter?? a degli sconosciuti
+PNGFilter.invalidHeader=Il file che si sta cercando di richiamare non e' un 
PNG: esso non include un header PNG valido. Potrebbe trattarsi di un file in 
altro formato e il browser potrebbe fare qualcosa di pericoloso a causa della 
confusione creata dalla mancata corrispondenza; il file ??? stato pertanto 
bloccato.
 PNGFilter.invalidHeaderTitle=Header PNG non valido
 PageMaker.modeAdvanced=Interfaccia avanzata
-PageMaker.modeAdvancedTooltip=Un'interfaccia pi?? complessa, utile soltanto 
agli utenti esperti
+PageMaker.modeAdvancedTooltip=Interfaccia pi?? complessa, utile soltanto ad 
utenti esperti
 PageMaker.modeSimple=Interfaccia semplice
-PageMaker.modeSimpleTooltip=Un'interfaccia semplice che pu?? essere usata da 
ogni utente
-PeerManagerUserAlert.clockProblem=${count} peer non riescono a connettersi 
perch?? il loro orologio di sistema differisce di oltre 24 ore da quello 
locale. Si prega di verificare che l'orologio di sistema del computer sia 
regolato sull'ora esatta. Regolazioni inaccurate dell'orologio causano molti 
problemi nel funzionamento dei meccanismi tra nodo e client.
+PageMaker.modeSimpleTooltip=Interfaccia semplice utilizzabile da ogni utente
+PeerManagerUserAlert.clockProblem=${count} peer non riescono a connettersi 
perch??? il loro orologio di sistema differisce di oltre 24 ore da quello 
locale. Si prega di verificare che l'orologio di sistema del computer sia 
regolato sull'ora esatta. Regolazioni inaccurate dell'orologio causano molti 
problemi nel funzionamento dei meccanismi tra nodo e client.
 PeerManagerUserAlert.clockProblemTitle=Problema di sincronizzazione.
 PeerManagerUserAlert.connError=${count} peer non riescono a connettersi per 
motivi sconosciuti, forse per causa di 'bug' nel nodo o di una referenza di un 
nodo che e' corrotta.
 PeerManagerUserAlert.connErrorTitle=Alcuni peer non riescono a connettersi
-PeerManagerUserAlert.noConns=Non ?? stato finora possibile connettersi ad 
alcun nodo. Forse qualcuno dei peer si connettera entro breve. in caso 
contrario sar?? necessario aggiungere altri peer; c'e' bisogno di almeno tre 
peer connessi in ogni momento, meglio 5-10.
+PeerManagerUserAlert.noConns=Non ??? stato finora possibile connettersi ad 
alcun nodo. Forse qualcuno dei peer si connettera entro breve. in caso 
contrario sar??? necessario aggiungere altri peer; c'e' bisogno di almeno tre 
peer connessi in ogni momento, meglio 5-10.
 PeerManagerUserAlert.noConnsTitle=Nessuna connessione aperta
-PeerManagerUserAlert.noPeersDarknet=Questo nodo non ha peers ai quale 
connettersi e non pu?? quindi funzionare normalmente. In teoria ci si dovrebbe 
connettere esclusivamente a persone che si conosce (per i paranoici: persone di 
cui ci si fida, per i non paranoici: persone con le quali si ha parlato). Per 
un corretto funzionamento c'e' bisogno di almeno tre peer connessi in ogni 
momento, idealmente 5-10. Ci si pu?? connettere a irc.freenode.net canale 
#freenet-refs e chiedere chi vuole connettersi, ma ?? bene tenere presente che 
si ?? vulnerabili ad attacchi da parte dei peer (Speciamente in queste prime 
versioni alfa di Freenet 0.7...) VERIFICARE CHE L'ATRA PARTE AGGIUNGA LA 
REFERENZA ALLA SUA LISTA: LE CONNESSIONI "A SENSO UNICO" NON FUNZIONANO!
-PeerManagerUserAlert.noPeersTestnet=Questo nodo non ha peer ai quale 
connettersi e non pu?? quindi funzionare normalmente. In teoria ci si dovrebbe 
connettere esclusivamente a persone che si conosce (per i paranoici: persone di 
cui ci si fida, per i non paranoici: persone con le quali si ha parlato). Per 
un corretto funzionamento c'e' bisogno di almeno tre peer connessi in ogni 
momento, idealmente 5-10. Trattandosi di un nodo testnet, ci si pu?? connettere 
a irc.freenode.net canale #freenet-refs e chiedere chi vuole connettersi.
+PeerManagerUserAlert.noPeersDarknet=Questo nodo non ha peers ai quale 
connettersi e non pu??? quindi funzionare normalmente. In teoria ci si dovrebbe 
connettere esclusivamente a persone che si conosce (per i paranoici: persone di 
cui ci si fida, per i non paranoici: persone con le quali si ha parlato). Per 
un corretto funzionamento c'e' bisogno di almeno tre peer connessi in ogni 
momento, idealmente 5-10. Ci si pu??? connettere a irc.freenode.net canale 
#freenet-refs e chiedere chi vuole connettersi, ma ??? bene tenere presente che 
si ??? vulnerabili ad attacchi da parte dei peer (Speciamente in queste prime 
versioni alfa di Freenet 0.7...) VERIFICARE CHE L'ATRA PARTE AGGIUNGA LA 
REFERENZA ALLA SUA LISTA: LE CONNESSIONI "A SENSO UNICO" NON FUNZIONANO!
+PeerManagerUserAlert.noPeersTestnet=Questo nodo non ha peer ai quale 
connettersi e non pu??? quindi funzionare normalmente. In teoria ci si dovrebbe 
connettere esclusivamente a persone che si conosce (per i paranoici: persone di 
cui ci si fida, per i non paranoici: persone con le quali si ha parlato). Per 
un corretto funzionamento c'e' bisogno di almeno tre peer connessi in ogni 
momento, idealmente 5-10. Trattandosi di un nodo testnet, ci si pu??? 
connettere a irc.freenode.net canale #freenet-refs e chiedere chi vuole 
connettersi.
 PeerManagerUserAlert.noPeersTitle=Nessun peer trovato
-PeerManagerUserAlert.oneConn=Questo nodo ha una sola connessione. Il 
rendimento ne risentir?? in modo notevole, e l'utente non disporr?? di 
anonimato e "negabilit?? plausibile" se quell' unico nodo al quale si ?? 
conessi dovesse essere operato da un avversario. Il nodo risulter?? attaccato 
al network come una "foglia all' albero" e non contribuir?? alla salute 
generale del network stesso. Per un corretto funzionamento del nodo ?? 
necessario che almeno tre peer e (idealmente 5-10) siano connessi in qualsiasi 
momento.
+PeerManagerUserAlert.oneConn=Questo nodo ha una sola connessione. Il 
rendimento ne risentir??? in modo notevole, e l'utente non disporr??? di 
anonimato e "negabilit??? plausibile" se quell' unico nodo al quale si ??? 
conessi dovesse essere operato da un avversario. Il nodo risulter??? attaccato 
al network come una "foglia all' albero" e non contribuir??? alla salute 
generale del network stesso. Per un corretto funzionamento del nodo ??? 
necessario che almeno tre peer e (idealmente 5-10) siano connessi in qualsiasi 
momento.
 PeerManagerUserAlert.onlyFewConnsTitle=Soltanto ${count} connessione/i aperta/e
 PeerManagerUserAlert.tooHighBwlimitDelayTime=Questo nodo deve aspettare troppo 
a lungo la banda disponibile (${delay}ms > ${max}ms). Aumentare l'ampiezza di 
banda in uscita e/o rimuovere alcuni peer migliorerebbe la situazione.
 PeerManagerUserAlert.tooHighBwlimitDelayTimeTitle=bwlimitDelayTime troppo alto
@@ -832,47 +834,47 @@
 PeerManagerUserAlert.tooHighPingTimeTitle=nodeAveragePingTime troppo alto
 PeerManagerUserAlert.tooManyConns=Questo nodo ha troppe connessioni (${count} 
> ${max}). Aggiungere troppi peer non produce un topologia mondo-piccolo, 
danneggia l'instradamento, e rischia di produrre punti di fallimento singoli.
 PeerManagerUserAlert.tooManyConnsTitle=Troppe connessioni aperte
-PeerManagerUserAlert.tooManyDisconnected=Questo nodo ha troppi peer 
disconnessi (${count} > ${max}). Questo pu?? avere un leggero impatto sul 
rendimento perch?? anche i peer disconnessi usano una piccola quantit?? di 
banda e CPU. Potrebbe essere necessario "ripulire" la lista dei peer. Nota che 
almeno in teoria, bisognerebbe connettersi esclusivamente ad utenti che si 
conosce. Anche in caso contrario, aggiungere troppi nodi automaticamente 
produce un risultato negativo in quanto la topologia risultante non ?? ottimale.
+PeerManagerUserAlert.tooManyDisconnected=Questo nodo ha troppi peer 
disconnessi (${count} > ${max}). Questo pu??? avere un leggero impatto sul 
rendimento perch??? anche i peer disconnessi usano una piccola quantit??? di 
banda e CPU. Potrebbe essere necessario "ripulire" la lista dei peer. Nota che 
almeno in teoria, bisognerebbe connettersi esclusivamente ad utenti che si 
conosce. Anche in caso contrario, aggiungere troppi nodi automaticamente 
produce un risultato negativo in quanto la topologia risultante non ??? 
ottimale.
 PeerManagerUserAlert.tooManyDisconnectedTitle=Troppi peer disconnessi
-PeerManagerUserAlert.tooManyNeverConnected=Ben ${count} tra i peer di questo 
nodo non sono mai stati connessi, nemmeno una volta sola: . Non bisognerebbe 
aggiungere peer a meno che la propria referenza venga aggiunta a sua volta. In 
caso contrario sar?? impossibile connettersi.
+PeerManagerUserAlert.tooManyNeverConnected=Ben ${count} tra i peer di questo 
nodo non sono mai stati connessi, nemmeno una volta sola: . Non bisognerebbe 
aggiungere peer a meno che la propria referenza venga aggiunta a sua volta. In 
caso contrario sar??? impossibile connettersi.
 PeerManagerUserAlert.tooManyNeverConnectedTitle=Molti peers non sono ancora 
stati connessi nemmeno una volta
-PeerManagerUserAlert.tooManyNeverConnectedWithLink=${count} peer di questo 
nodo non sono mai stati connessi, nemmeno una volta sola. Non bisognerebbe 
aggiungere nuovi peers a meno che essi non aggiungano a loro volta ${link}your 
reference${/link}. Se ci?? non avviene non sar?? possibile stabilire una 
connessione.
-PeerManagerUserAlert.tooManyPeers=Il nodo ha troppi peer (${count} > ${max}). 
Non si raccomanda di far girare "ubernodes" con l'aggiunta automatica di peer; 
questo non produce una topologia mondo-piccolo. Ci?? influisce negativamente 
sul rendimento perch?? anche i peer disconnessi usano un po' di banda e di CPU. 
Potrebbe essere necessario "ripulire" la lista dei peer.
+PeerManagerUserAlert.tooManyNeverConnectedWithLink=${count} peer di questo 
nodo non sono mai stati connessi, nemmeno una volta sola. Non bisognerebbe 
aggiungere nuovi peers a meno che essi non aggiungano a loro volta ${link}your 
reference${/link}. Se ci??? non avviene non sar??? possibile stabilire una 
connessione.
+PeerManagerUserAlert.tooManyPeers=Il nodo ha troppi peer (${count} > ${max}). 
Non si raccomanda di far girare "ubernodes" con l'aggiunta automatica di peer; 
questo non produce una topologia mondo-piccolo. Ci??? influisce negativamente 
sul rendimento perch??? anche i peer disconnessi usano un po' di banda e di 
CPU. Potrebbe essere necessario "ripulire" la lista dei peer.
 PeerManagerUserAlert.tooManyPeersTitle=Troppi peer
-PeerManagerUserAlert.tooOldNeverConnectedPeers=Uno o pi?? peer non si sono mai 
connessi nelle due settimane trascorse da quando sono stati aggiunti.  E' da 
prendere in considerazione l'idea di rimuoverli in quanto essi stanno 
marginalmente compromettendo il rendimento (pacchetti sprecati cencando di 
comunicare con nodi che non ci sono).
+PeerManagerUserAlert.tooOldNeverConnectedPeers=Uno o pi??? peer non si sono 
mai connessi nelle due settimane trascorse da quando sono stati aggiunti.  E' 
da prendere in considerazione l'idea di rimuoverli in quanto essi stanno 
marginalmente compromettendo il rendimento (pacchetti sprecati cencando di 
comunicare con nodi che non ci sono).
 PeerManagerUserAlert.tooOldNeverConnectedPeersTitle=Peer mai connesso/i 
obsoleto/i
-PeerManagerUserAlert.twoConns=Il nodo ha solo due connessioni. Rendimento e 
sicurezza risulteranno di qualit?? inferiore, e non sara possibile provvedere 
instradamento (routing) per altri nodi. Il nodo ?? collegato al network come un 
"anello di catena" e non contribuisce (molto) alla salute generale del network 
stesso. Per un corretto funzionamento del nodo, ?? necessario che almeno tre 
peers (e idealmente 5-10) siano connessi in ogni momento.
+PeerManagerUserAlert.twoConns=Il nodo ha solo due connessioni. Rendimento e 
sicurezza risulteranno di qualit??? inferiore, e non sara possibile provvedere 
instradamento (routing) per altri nodi. Il nodo ??? collegato al network come 
un "anello di catena" e non contribuisce (molto) alla salute generale del 
network stesso. Per un corretto funzionamento del nodo, ??? necessario che 
almeno tre peers (e idealmente 5-10) siano connessi in ogni momento.
 PeersSayKeyBlownAlert.connectedSayBlownLabel=I seguenti nodi hanno rilevato un 
problema con la chiave  (si cerca attualmente di ottenere il certificato di 
revoca da loro):
-PeersSayKeyBlownAlert.disconnectedSayBlownLabel=I seguenti nodi si sono 
disconnessi dopo aver comunicato che la chiave ?? saltata, quindi non ?? stato 
possibile richiamare il certificato di revoca:
-PeersSayKeyBlownAlert.failedFetch=Non ?? stato possibile scaricare il 
certificato di revoca. Le possibili cause di tale evento includono la 
possibilit?? di un attacco sul nodo locale volto a fargli scaricare ed 
installare un aggiornamento nonostante la chiave sia saltata, o la possibilit?? 
che dei nodi stiano "mentendo" circa la chiave di revoca. Si prega di 
contattare gli sviluppatori di Freenet per cercare di mettere ordine in questo 
casino.
-PeersSayKeyBlownAlert.failedTransferSayBlownLabel=Questi nodi hanno comunicato 
che la chiave di revoca ?? saltata ma poi non hanno completato il trasferimento 
del certificato di revoca:
-PeersSayKeyBlownAlert.fetching=Il nodo sta scaricando il certificato di revoca 
contentnte spiegazioni pi?? dettagliate.
-PeersSayKeyBlownAlert.intro=Uno o pi?? peers ci comunicano che la chiave di 
revoca per l'aggiornamento automatico ?? saltata. Questo significa che qualcuno 
potrebbe essere venuto a conoscenza della chiave privata del sistema di 
autoaggiornamento, cosa che potrebbe far eseguire al nodo il codice che 
l'attaccante volesse fargli eseguire (se l'aggiornamento venisse eseguito): per 
prevenire tale eventualit??, il sistema di autoaggiornamento ?? stato 
disabilitato. E' anche possibile che dei peers stiano deliberatamente mentendo 
a proposito della chiave di revoca.
-PeersSayKeyBlownAlert.short=Alcuni peer avvertono che la chiave di auto 
aggiornamento ?? saltata!
-PeersSayKeyBlownAlert.titleWithCount=La chiave di Auto-aggiornamento ?? 
saltata! L' evento ?? stato confermato da ${count} peer!
-PluginManager.cannotSetOnceLoaded=Una volta caricata, non ?? pi?? possibile 
impostare la lista dei plugin
+PeersSayKeyBlownAlert.disconnectedSayBlownLabel=I seguenti nodi si sono 
disconnessi dopo aver comunicato che la chiave ??? saltata, quindi non ??? 
stato possibile richiamare il certificato di revoca:
+PeersSayKeyBlownAlert.failedFetch=Non ??? stato possibile scaricare il 
certificato di revoca. Le possibili cause di tale evento includono la 
possibilit??? di un attacco sul nodo locale volto a fargli scaricare ed 
installare un aggiornamento nonostante la chiave sia saltata, o la 
possibilit??? che dei nodi stiano "mentendo" circa la chiave di revoca. Si 
prega di contattare gli sviluppatori di Freenet per cercare di mettere ordine 
in questo casino.
+PeersSayKeyBlownAlert.failedTransferSayBlownLabel=Questi nodi hanno comunicato 
che la chiave di revoca ??? saltata ma poi non hanno completato il 
trasferimento del certificato di revoca:
+PeersSayKeyBlownAlert.fetching=Il nodo sta scaricando il certificato di revoca 
contentnte spiegazioni pi??? dettagliate.
+PeersSayKeyBlownAlert.intro=Uno o pi??? peers ci comunicano che la chiave di 
revoca per l'aggiornamento automatico ??? saltata. Questo significa che 
qualcuno potrebbe essere venuto a conoscenza della chiave privata del sistema 
di autoaggiornamento, cosa che potrebbe far eseguire al nodo il codice che 
l'attaccante volesse fargli eseguire (se l'aggiornamento venisse eseguito): per 
prevenire tale eventualit???, il sistema di autoaggiornamento ??? stato 
disabilitato. E' anche possibile che dei peers stiano deliberatamente mentendo 
a proposito della chiave di revoca.
+PeersSayKeyBlownAlert.short=Alcuni peer avvertono che la chiave di auto 
aggiornamento ??? saltata!
+PeersSayKeyBlownAlert.titleWithCount=La chiave di Auto-aggiornamento ??? 
saltata! L' evento ??? stato confermato da ${count} peer!
+PluginManager.cannotSetOnceLoaded=Una volta caricata, non ??? pi??? possibile 
impostare la lista dei plugin
 PluginManager.loadedOnStartup=Plugin da caricare all'avvio
 PluginManager.loadedOnStartupLong=Classpath, nome e locazione dei plugin da 
caricare all'avvio
 PluginManager.loadedPlugins=Plugin da caricare all'avvio
 PluginManager.loadedPluginsLong=Lista dei plugin da caricare all'avvio del nodo
-PluginManager.pluginLoadingFailed=Non ?? stato possibile caricare il plugin 
specificato ${name}.
+PluginManager.pluginLoadingFailed=Non ??? stato possibile caricare il plugin 
specificato ${name}.
 PluginManager.pluginLoadingFailedShort=Impossibile caricare il plugin ${name}!
-PluginManager.pluginLoadingFailedTitle=Non ?? stato possibile caricare il 
plugin!
-PluginManager.pluginLoadingFailedWithMessage=Non ?? stato possibile caricare 
il plugin specificato ${name}: ${message}
-PluginManager.pluginReqNewerJVM=Per usare il plugin ${name} ?? necessario 
installare una JVM pi?? recente di quella attualmente in uso. Installare Sun 
Java 1.5 o superiore, o rimuovere il plugin.
-PluginManager.pluginReqNewerJVMTitle=Il plugin ${name} richiede l'uso di una 
JVM pi?? aggiornata
+PluginManager.pluginLoadingFailedTitle=Non ??? stato possibile caricare il 
plugin!
+PluginManager.pluginLoadingFailedWithMessage=Non ??? stato possibile caricare 
il plugin specificato ${name}: ${message}
+PluginManager.pluginReqNewerJVM=Per usare il plugin ${name} ??? necessario 
installare una JVM pi??? recente di quella attualmente in uso. Installare Sun 
Java 1.5 o superiore, o rimuovere il plugin.
+PluginManager.pluginReqNewerJVMTitle=Il plugin ${name} richiede l'uso di una 
JVM pi??? aggiornata
 PluginToadlet.addPluginTitle=Aggiungi plugin
 PluginToadlet.failedToLoadPlugin=Caricamento plugin fallito.
-PluginToadlet.failedToLoadPluginCheckClass=Non ?? stato possibile caricare il 
plugin richiesto. Verificare il nome del plugin, class, e URL se se ne ?? usata 
una.
+PluginToadlet.failedToLoadPluginCheckClass=Non ??? stato possibile caricare il 
plugin richiesto. Verificare il nome del plugin, class, e URL se se ne ??? 
usata una.
 PluginToadlet.failedToLoadPluginTitle=Caricamento plugin fallito
 PluginToadlet.internalNameTitle=Nome Interno
 PluginToadlet.loadPluginCommand=Carica Plugin
-PluginToadlet.noWebInterface=Questo plugin non ha interfaccia web e pertanto 
non c'?? nulla da mostrare
+PluginToadlet.noWebInterface=Questo plugin non ha interfaccia web e pertanto 
non c'??? nulla da mostrare
 PluginToadlet.noWebInterfaceTitle=Plugin non provvisto di interfaccia web
 PluginToadlet.pluginList=Lista plugin
 PluginToadlet.pluginListTitle=Lista Plugin
 PluginToadlet.pluginNameTitle=Nome Plugin
-PluginToadlet.pluginNotFound=Non ?? stato possibile trovare il plugin richiesto
+PluginToadlet.pluginNotFound=Non ??? stato possibile trovare il plugin 
richiesto
 PluginToadlet.pluginNotFoundTitle=Plugin non trovato
 PluginToadlet.returnToPluginsWithLinks=${link}return${/link} alla lista di 
plugins.
 PluginToadlet.unsupportedMethod=Metodo non supportato
@@ -883,33 +885,33 @@
 PproxyToadlet.cancel=Cancella
 PproxyToadlet.changeReloadOnStartup=Cambia
 PproxyToadlet.classNameTitle=Class Name
-PproxyToadlet.downloadNotAllowedFromRemoteServer=Donload dei plugins ?? 
ammesso solo dal server di Freenet.
+PproxyToadlet.downloadNotAllowedFromRemoteServer=Donload dei plugins ??? 
ammesso solo dal server di Freenet.
 PproxyToadlet.internalIDTitle=ID interna
 PproxyToadlet.loadOfficialPlugin=Aggiungi un Plugin Ufficiale
 PproxyToadlet.loadOfficialPluginLabel=Carica Plugin Ufficiale
-PproxyToadlet.loadOfficialPluginText=Questi plugin sono immagazinati nei 
server del Progetto Freenet. L'opinione degli sviluppatori ?? che i plugins 
ufficiali siano esenti da difetti che possano compromettere la privacy ma non 
?? possibile garantire al 100% che ci?? corrisponda a realt??.
-PproxyToadlet.loadOfficialPluginWarning=AVVERTENZA: Caricando un plugin 
ufficiale lo si scarica da internet (non da Freenet). Un avversario potrebbe 
vedere il download e forse interferire con esso. Se ci?? pu?? effettivamente 
rappresentare un un problema, si consiglia di non caricare plugins.
+PproxyToadlet.loadOfficialPluginText=Questi plugin sono immagazinati nei 
server del Progetto Freenet. L'opinione degli sviluppatori ??? che i plugins 
ufficiali siano esenti da difetti che possano compromettere la privacy ma non 
??? possibile garantire al 100% che ci??? corrisponda a realt???.
+PproxyToadlet.loadOfficialPluginWarning=AVVERTENZA: Caricando un plugin 
ufficiale lo si scarica da internet (non da Freenet). Un avversario potrebbe 
vedere il download e forse interferire con esso. Se ci??? pu??? effettivamente 
rappresentare un un problema, si consiglia di non caricare plugins.
 PproxyToadlet.loadOtherPlugin=Aggiungi Plugin Non Ufficiale
 PproxyToadlet.loadOtherPluginText=Inserire qui la URL del plugin che si vuole 
caricare. Plugin diversi da quelli ufficiali di Freenet NON RICEVONO ALCUNA 
ASSISTENZA O VERIFICA per difetti di privacy da parte sviluppatori di Freenet!
 PproxyToadlet.loadOtherURLLabel=URL del plugin
 PproxyToadlet.loadPluginLabel=Carica Plugin:
 PproxyToadlet.noPlugins=Nessun plugin caricato
 PproxyToadlet.noVersion=N/A
-PproxyToadlet.pluginDirectoryNotCreated=Non ?? stato possibile creare una 
directory per i plugin.
-PproxyToadlet.pluginNotDownloaded=Non ?? stato possibile scaricare il plugin
-PproxyToadlet.pluginNotFoundReload=Non ?? stato possibile localizzare il 
plugin specificato per poterlo ricaricare.
+PproxyToadlet.pluginDirectoryNotCreated=Non ??? stato possibile creare una 
directory per i plugin.
+PproxyToadlet.pluginNotDownloaded=Non ??? stato possibile scaricare il plugin
+PproxyToadlet.pluginNotFoundReload=Non ??? stato possibile localizzare il 
plugin specificato per poterlo ricaricare.
 PproxyToadlet.pluginNotFoundReloadTitle=Plugin non trovato (ricaricamento in 
corso)
 PproxyToadlet.pluginStopping=Disconnessione plugin in corso
 PproxyToadlet.pluginUnloaded=Plugin terminato
-PproxyToadlet.pluginUnloadedWithName=Il plugin ${name} ?? stato terminato.
+PproxyToadlet.pluginUnloadedWithName=Il plugin ${name} ??? stato terminato.
 PproxyToadlet.plugins=Plugin
 PproxyToadlet.pluginsWithNodeName=Plugin di ${name}
 PproxyToadlet.refreshOnStartup=Ricarica da server all'avvio
 PproxyToadlet.reload=Ricarica
-PproxyToadlet.reloadExplanation=Ricaricare un plugin ?? come scaricarlo e 
ricaricarlo.
+PproxyToadlet.reloadExplanation=Ricaricare un plugin ??? come scaricarlo e 
ricaricarlo.
 PproxyToadlet.reloadOnStartupShort=Ricarica all'avvio
 PproxyToadlet.reloadPluginTitle=Ricarica Plugin
-PproxyToadlet.reloadPurgeWarning=Rimuovi il plugin dalla cache prima di 
ricaricarlo. Se il plugin era stato scaricato da internet, sar?? scaricato 
nuovamente.
+PproxyToadlet.reloadPurgeWarning=Rimuovi il plugin dalla cache prima di 
ricaricarlo. Se il plugin era stato scaricato da internet, sar??? scaricato 
nuovamente.
 PproxyToadlet.reloadWarning=Attenzione: alcuni plugin non reagiscono in modo 
ottimale a un reload.
 PproxyToadlet.returnToPluginPage=Torna alla pagina dei plugin
 PproxyToadlet.startedAtTitle=Avviato:
@@ -917,7 +919,7 @@
 PproxyToadlet.startingPluginStatus=Stato attuale
 PproxyToadlet.startingPluginTime=tempo trascorso
 PproxyToadlet.startingPluginsTitle=Avvio plugins in corso
-PproxyToadlet.unauthorized=L'accesso a questa pagina non ?? autorizzato.
+PproxyToadlet.unauthorized=L'accesso a questa pagina non ??? autorizzato.
 PproxyToadlet.unauthorizedTitle=Accesso Non Autorizzato
 PproxyToadlet.unload=Termina
 PproxyToadlet.unloadPluginTitle=Termina plugin?
@@ -939,40 +941,41 @@
 QueueToadlet.completedUDirectory=Directory Upload Completati:(${size})
 QueueToadlet.delete=Elimina
 QueueToadlet.download=Scarica
-QueueToadlet.downloadFilesInstructions=E' possibile incollare una serie di 
chiavi da scaricare nello spazio sottostante (una per rigo)
-QueueToadlet.downloadSucceeded=Il file ${origlink}${filename}${/origlink} ?? 
stato scaricato. ${link}Click qui${/link} per aprile il file (${size}).
+QueueToadlet.downloadFiles=Download multipli
+QueueToadlet.downloadFilesInstructions=Incollare una lista di chiavi da 
scaricare (una per rigo)
+QueueToadlet.downloadSucceeded=Il file ${origlink}${filename}${/origlink} ??? 
stato scaricato. ${link}Click qui${/link} per aprile il file (${size}).
 QueueToadlet.downloadSucceededTitle=Download effettuato: ${filename}
 QueueToadlet.emergency=urgenza estrema
-QueueToadlet.enqueuedFailure=Non ?? stato possibile agguingere alla coda le 
${number} chiavi qui elencate:
-QueueToadlet.enqueuedSuccessfully=Le ${number} chiavi elencate di seguito sono 
state aggiunte alla coda con successo:
+QueueToadlet.enqueuedFailure=Non ?? stato possibile aggiungere alla coda le 
seguenti ${number} chiavi:
+QueueToadlet.enqueuedSuccessfully=Le ${number} chiavi riportate di seguito 
sono state aggiunte alla coda:
 QueueToadlet.errorAccessDenied=Errore: Accesso Negato
 QueueToadlet.errorAccessDeniedFile=L'attuale configurazione del nodo non 
consente l'upload del file "${file}".
-QueueToadlet.errorDToDisk=Non ?? stato possibile scaricare su disco
+QueueToadlet.errorDToDisk=Non ??? stato possibile scaricare su disco
 QueueToadlet.errorDToDiskConfig=L'attuale configurazione del nodo non consente 
di scaricare file nella directory dei download
 QueueToadlet.errorDownloadNotCompleted=Download Non Completato
-QueueToadlet.errorDownloadNotFound=Non ?? stato possibile localizzare il 
download richiesto
-QueueToadlet.errorDownloadNotFoundExplanation=Non ?? stato possibile trovare 
il download specificato. Potrebbe essere stato eliminato in precedenza.
+QueueToadlet.errorDownloadNotFound=Non ??? stato possibile localizzare il 
download richiesto
+QueueToadlet.errorDownloadNotFoundExplanation=Non ??? stato possibile trovare 
il download specificato. Potrebbe essere stato eliminato in precedenza.
 QueueToadlet.errorInvalidURI=URI non valida
-QueueToadlet.errorInvalidURIToD=La URI non ?? valida e pertanto non pu?? 
essere scaricata.
-QueueToadlet.errorInvalidURIToU=Non ?? stata specificata alcuna URI valida 
dove inserire il file
+QueueToadlet.errorInvalidURIToD=La URI non ??? valida e pertanto non pu??? 
essere scaricata.
+QueueToadlet.errorInvalidURIToU=Non ??? stata specificata alcuna URI valida 
dove inserire il file
 QueueToadlet.errorNoFileOrCannotRead=File inesistente o illegibile
 QueueToadlet.errorNoFileSelected=Nessun file selezionato
 QueueToadlet.errorNoFileSelectedU=Non e' stato selezionato alcun file per 
l'upload
-QueueToadlet.errorNoKey=Non ?? stata specificata alcuna chiave per il download
-QueueToadlet.errorNoKeyToD=Non ?? stata specificata una chiave per il download
+QueueToadlet.errorNoKey=Non ??? stata specificata alcuna chiave per il download
+QueueToadlet.errorNoKeyToD=Non ??? stata specificata una chiave per il download
 QueueToadlet.failedD=Download falliti
 QueueToadlet.failedDU=Upload di directory falliti
-QueueToadlet.failedToRemove=Non ?? stato possibile rimuovere ${id}: ${message}
-QueueToadlet.failedToRemoveId=Non ?? stato possibile eliminare: ${id}
-QueueToadlet.failedToRemoveRequest=Non ?? stato possibile eliminare la 
richiesta
-QueueToadlet.failedToRestart=Non ?? stato possibile riavviare: ${id}
+QueueToadlet.failedToRemove=Non ??? stato possibile rimuovere ${id}: ${message}
+QueueToadlet.failedToRemoveId=Non ??? stato possibile eliminare: ${id}
+QueueToadlet.failedToRemoveRequest=Non ??? stato possibile eliminare la 
richiesta
+QueueToadlet.failedToRestart=Non ??? stato possibile riavviare: ${id}
 QueueToadlet.failedToRestartRequest=Non e' stato possibile riavviare la 
richiesta
 QueueToadlet.failedU=Upload falliti
 QueueToadlet.fcpIsMissing=Server FCP non trovato
 QueueToadlet.fileName=File
 QueueToadlet.files=File
 QueueToadlet.follow=Segui Redirect
-QueueToadlet.globalQueueIsEmpty=La coda globale ?? vuota
+QueueToadlet.globalQueueIsEmpty=La coda globale ??? vuota
 QueueToadlet.high=alta
 QueueToadlet.identifier=Identificazione
 QueueToadlet.insertAs=Inserisci come:
@@ -990,15 +993,15 @@
 QueueToadlet.noTaskOnGlobalQueue=Nessuna operazione in attesa nella coda 
globale in questo momento.
 QueueToadlet.none=nessuna
 QueueToadlet.notLoadedYet=Il nodo sta ancora caricando la lista delle 
richieste persistenti. Si prega di pazientare.
-QueueToadlet.notLoadedYetTitle=La Coda non ?? stata ancora caricata.
+QueueToadlet.notLoadedYetTitle=La Coda non ??? stata ancora caricata.
 QueueToadlet.panicButton=Bottone Emergenza
 QueueToadlet.panicButtonConfirmation=Elimina tutte le richieste senza chiedere 
conferma
 QueueToadlet.persistence=Persistenza
 QueueToadlet.persistenceForever=illimitata
 QueueToadlet.persistenceNone=nessuna
 QueueToadlet.persistenceReboot=reboot
-QueueToadlet.pleaseEnableFCP=Per accedere a questa pagina ?? necessario 
abilitare il server FCP
-QueueToadlet.priority=Priorit??
+QueueToadlet.pleaseEnableFCP=Per accedere a questa pagina ??? necessario 
abilitare il server FCP
+QueueToadlet.priority=Priorit???
 QueueToadlet.priority0=emergenza
 QueueToadlet.priority1=molto alta
 QueueToadlet.priority2=alta
@@ -1008,7 +1011,7 @@
 QueueToadlet.priority6=campa cavallo
 QueueToadlet.progress=Completato
 QueueToadlet.progressbarAccurate=Questo valore e' accurato
-QueueToadlet.progressbarNotAccurate=I valori possono essere imprecisi perch?? 
il processo di download del file non e' stato finalizzato
+QueueToadlet.progressbarNotAccurate=I valori possono essere imprecisi perch??? 
il processo di download del file non e' stato finalizzato
 QueueToadlet.reason=Motivo
 QueueToadlet.remove=Elimina
 QueueToadlet.requestNavigation=Esplora Richieste
@@ -1020,25 +1023,25 @@
 QueueToadlet.title=Coda globale del nodo: ${nodeName}
 QueueToadlet.totalSize=Dimensioni Totali
 QueueToadlet.unknown=Non Disp.
-QueueToadlet.uploadProgressbarNotAccurate=Il valore di questo indicatore di 
progresso pu?? essere falsato quando l'upload codifica ulteriori blocchi.
-QueueToadlet.uploadSucceeded=Il file ${filename} (size ${size}) ?? stato 
correttamente caricato su Freenet. ${link}Click qui${/link} per aprire il file.
+QueueToadlet.uploadProgressbarNotAccurate=Il valore di questo indicatore di 
progresso pu??? essere falsato quando l'upload codifica ulteriori blocchi.
+QueueToadlet.uploadSucceeded=Il file ${filename} (size ${size}) ??? stato 
correttamente caricato su Freenet. ${link}Click qui${/link} per aprire il file.
 QueueToadlet.uploadSucceededTitle=Inserzione completata: ${filename}
 QueueToadlet.veryhigh=molto alta
 QueueToadlet.verylow=bassissima
 QueueToadlet.warningUnsafeContent=Contenuto Potenzialmente Pericoloso
-QueueToadlet.warningUnsafeContentExplanation=Il file richiesto ?? di un tipo 
non ancora supportato dal filtro contenuti di Freenet e pertanto non sar?? 
possibile filtrarlo. Ci?? significa che aprire tale file potrebbe compromettere 
l'anonimato dell'utente
+QueueToadlet.warningUnsafeContentExplanation=Il file richiesto ??? di un tipo 
non ancora supportato dal filtro contenuti di Freenet e pertanto non sar??? 
possibile filtrarlo. Ci??? significa che aprire tale file potrebbe 
compromettere l'anonimato dell'utente
 QueueToadlet.willneverfinish=campa cavallo
 QueueToadlet.wipD=Download in corso (${size})
 QueueToadlet.wipDU=Upload directory in corso (${size})
 QueueToadlet.wipU=Upload in corso: (${size})
-RequestStarterGroup.scheduler=Policy di priorit?? dello schedulatore
-RequestStarterGroup.schedulerCHKInserts=Policy di priorit?? dello scheduler 
(inserzioni CHK)
-RequestStarterGroup.schedulerCHKRequests=Policy di priorit?? dello scheduler 
(richieste CHK)
-RequestStarterGroup.schedulerLong=Imposta lo schema delle policy di priorit?? 
usate dallo schedulatore.
-RequestStarterGroup.schedulerSSKInserts=Policy di priorit?? dello scheduler 
(inserzioni SSK)
-RequestStarterGroup.schedulerSSKRequests=Policy di priorit?? dello scheduler 
(richieste SSK)
-RevocationKeyFoundUserAlert.text=E' stata rilevata la presenza sul network 
della chiave di revoca dell' aggiornamento automatico. Questo significa che il 
nostro sistema di aggiornamento automatico ?? stato probabilmente COMPROMESSO. 
L'aggiornamento automatico ?? stato conseguentemente disabilitato onde 
prevenire l'intallazione automatica di "robaccia". Si raccomanda di controllare 
la disponibilit?? di nuovi aggiornamenti al sito del progetto. Controllare che 
il sito non sia stato falsificato!. Il messaggio di revoca ?? il seguente: 
${message}.
-RevocationKeyFoundUserAlert.title=La chiave privata del progetto ?? stata 
compromessa!
+RequestStarterGroup.scheduler=Policy di priorit??? dello schedulatore
+RequestStarterGroup.schedulerCHKInserts=Policy di priorit??? dello scheduler 
(inserzioni CHK)
+RequestStarterGroup.schedulerCHKRequests=Policy di priorit??? dello scheduler 
(richieste CHK)
+RequestStarterGroup.schedulerLong=Imposta lo schema delle policy di priorit??? 
usate dallo schedulatore.
+RequestStarterGroup.schedulerSSKInserts=Policy di priorit??? dello scheduler 
(inserzioni SSK)
+RequestStarterGroup.schedulerSSKRequests=Policy di priorit??? dello scheduler 
(richieste SSK)
+RevocationKeyFoundUserAlert.text=E' stata rilevata la presenza sul network 
della chiave di revoca dell' aggiornamento automatico. Questo significa che il 
nostro sistema di aggiornamento automatico ??? stato probabilmente COMPROMESSO. 
L'aggiornamento automatico ??? stato conseguentemente disabilitato onde 
prevenire l'intallazione automatica di "robaccia". Si raccomanda di controllare 
la disponibilit??? di nuovi aggiornamenti al sito del progetto. Controllare che 
il sito non sia stato falsificato!. Il messaggio di revoca ??? il seguente: 
${message}.
+RevocationKeyFoundUserAlert.title=La chiave privata del progetto ??? stata 
compromessa!
 SSL.enable=Attiva supporto SSL?
 SSL.enableLong=Attiva supporto SSL?
 SSL.keyPass=Password di private key access
@@ -1049,40 +1052,44 @@
 SSL.keyStorePassLong=Password per l'accesso di key store file
 SSL.version=Versione di SSL
 SSL.versionLong=Versione di SSL, SSLv3 o TLSv1 (default SSLv3)
-ShortOption.parseError=Il valore specificato non pu?? essere interpretato come 
16-bit integer : ${val}
-SimpleToadletServer.advancedMode=Abilita modalit?? avanzata
+ShortOption.parseError=Il valore specificato non pu??? essere interpretato 
come 16-bit integer : ${val}
+SimpleToadletServer.advancedMode=Abilita modalit??? avanzata
 SimpleToadletServer.advancedModeLong=Mostra informazioni cho possono 
interessare solo utenti avanzati o sviluppatori. Nella maggioranza dei casi 
dovrebbe essere impostata su 'falso'
-SimpleToadletServer.allowedFullAccess=Host ai quali ?? consentito pieno 
accesso a FProxy (leggere l'avvertenza)
-SimpleToadletServer.allowedFullAccessLong=Host ai quali ?? consentito accesso 
pieno al nodo (cambiare impostazioni di configurazione, riavviare, ecc). 
AVVERTENZA: Usare cautela nel decidere a chi consentire accesso pieno!
+SimpleToadletServer.allowedFullAccess=Host ai quali ??? consentito pieno 
accesso a FProxy (leggere l'avvertenza)
+SimpleToadletServer.allowedFullAccessLong=Host ai quali ??? consentito accesso 
pieno al nodo (cambiare impostazioni di configurazione, riavviare, ecc). 
AVVERTENZA: Usare cautela nel decidere a chi consentire accesso pieno!
 SimpleToadletServer.allowedHosts=Nomi host o indirizzi IP ai quali e' 
consentito connettersi a FProxy
-SimpleToadletServer.allowedHostsLong=Pu?? essere una lista di IP separati da 
virgole e IP in formato CIDR come 192.168.0.0/24. Tutti possono accedere al 
disco rigido nei limiti definiti dalle altre opzioni di configurazione.
+SimpleToadletServer.allowedHostsLong=Pu??? essere una lista di IP separati da 
virgole e IP in formato CIDR come 192.168.0.0/24. Tutti possono accedere al 
disco rigido nei limiti definiti dalle altre opzioni di configurazione.
 SimpleToadletServer.bindTo=Indirizzo IP collegato
 SimpleToadletServer.bindToLong=Indirizzo IP collegato
-SimpleToadletServer.cannotChangePortOnTheFly=Non ?? possibile cambiare il 
numero della porta FProxy "al volo"
-SimpleToadletServer.couldNotChangeBindTo=Non ?? stato possibile cambiare 
l'indirizzo abbinato a FProxy: ${error}.
+SimpleToadletServer.cannotChangePortOnTheFly=Non ??? possibile cambiare il 
numero della porta FProxy "al volo"
+SimpleToadletServer.couldNotChangeBindTo=Non ??? stato possibile cambiare 
l'indirizzo abbinato a FProxy: ${error}.
 SimpleToadletServer.cssName=Nome del CSS
 SimpleToadletServer.cssNameLong=Nome del CSS utilizzato da FProxy
 SimpleToadletServer.cssOverride=Usa un CSS personalizzato al posto di quello 
regolare (ATTENZIONE!)
-SimpleToadletServer.cssOverrideCantRead=Non ?? stato possibile leggere il file 
di sovrascrittura CSS fornito: ${filename}
+SimpleToadletServer.cssOverrideCantRead=Non ??? stato possibile leggere il 
file di sovrascrittura CSS fornito: ${filename}
 SimpleToadletServer.cssOverrideLong=Questa impostazione permette di utilizzare 
un CSS personalizzato invece di quello normalmente usato. AVVERTENZA: i CSS 
possono essere pericolosi, e *non* vengono filtrati: utilizzare a proprio 
rischio. Per includerli nella distribuzione principale e-mail devl at 
freenetroject.org
-SimpleToadletServer.cssOverrideNotInUploads=Non ?? possibile usare questa 
impostazione: "${filename} non ?? una directory dalla quale sono permessi gli 
upload.
+SimpleToadletServer.cssOverrideNotInUploads=Non ??? possibile usare questa 
impostazione: "${filename} non ??? una directory dalla quale sono permessi gli 
upload.
 SimpleToadletServer.doRobots=Usare robots.txt per escludere i robot?
 SimpleToadletServer.doRobotsLong=Pubblica /robots.txt che dice a persone, 
Google, spiders, wget, ecc. di lasciarci in pace.
 SimpleToadletServer.enableInlinePrefetch=Abilita pre-ricezione (prefetching) 
di immagini inlinea (inline)?
 SimpleToadletServer.enableInlinePrefetchLong=Questo potrebbe essere utile se 
il browser utilizza un numero ridotto di connessioni per comunicare con il 
nodo. D'altra parte potrebbe non esserlo.
 SimpleToadletServer.enableJS=Permetti a FProxy di usare Javascript
-SimpleToadletServer.enableJSLong=Determina se FProxy pu?? o meno fare uso di 
Javascript. Questa impostazione di solito va tenuta su 'falso'. Nota che i 
freesite non fanno uso di javascript nemmeno se qui abilitata.
+SimpleToadletServer.enableJSLong=Determina se FProxy pu??? o meno fare uso di 
Javascript. Questa impostazione di solito va tenuta su 'falso'. Nota che i 
freesite non fanno uso di javascript nemmeno se qui abilitata.
 SimpleToadletServer.enablePersistentConnections=Abilita connessioni 
persistenti HTTP? (Leggere la descrizione)
 SimpleToadletServer.enablePersistentConnectionsLong=Non abilitare questa 
opzione tranne nel caso in cui il browser sia configurato per usare molte 
connessioni anche se sono persistenti.
 SimpleToadletServer.enabled=Abilita FProxy
 SimpleToadletServer.enabledLong=Abilita FProxy e relativi servizi HTTP
-SimpleToadletServer.illegalCSSName=Il nome CSS non pu?? contenere i catarreri 
"barra" (/ slash) e "due punti" ( : colon)
+SimpleToadletServer.illegalCSSName=Il nome CSS non pu??? contenere i catarreri 
"barra" (/ slash) e "due punti" ( : colon)
 SimpleToadletServer.panicButton=Mostra bottone Emergenza
 SimpleToadletServer.panicButtonLong=Mostra il bottone Emergenza nella pagina 
della Coda. Se usato, Il bottone Emergenza rimuove tutte le richieste che non 
hanno ricevuto conferma.
 SimpleToadletServer.port=Numero della porta FProxy
 SimpleToadletServer.portLong=Numero della porta FProxy
 SimpleToadletServer.ssl=Abilitare ssl?
 SimpleToadletServer.sslLong=Abilitare ssl?
+StartupToadlet.entropyErrorContent=Non c'e' abbastanza entropia disponibile 
nel sistema... Freenet non si avvier?? finch?? non potr?? metterne insieme 
abbastanza.
+StartupToadlet.entropyErrorTitle=Entropia disponibile insufficiente
+StartupToadlet.isStartingUp=Procedura di avviamento del nodo Freenet in corso, 
si prega di attendere.
+StartupToadlet.title=Avviamento di Freenet in corso
 StaticToadlet.pathInvalidChars=La URI specificata contiene caratteri non 
permessi.
 StaticToadlet.pathNotFound=Il percorso specificato non esiste.
 StaticToadlet.pathNotFoundTitle=Percorso non trovato
@@ -1116,17 +1123,17 @@
 StatisticsToadlet.outputRate=Output: ${rate} al secondo (di ${max} al secondo)
 StatisticsToadlet.payloadOutput=Output Carico Utile: ${total} (${rate}/second) 
(${percent}%)
 StatisticsToadlet.peerStatsTitle=Statistiche peer
-StatisticsToadlet.priority=Priorit??
+StatisticsToadlet.priority=Priorit???
 StatisticsToadlet.requestOutput=Output richiesta (escluso carico utile): CHK 
${chk} SSK ${ssk}.
 StatisticsToadlet.resendBytes=Bytes rispediti: ${total}
-StatisticsToadlet.routingDisabled=Indirizzamento traffico sospeso (il nodo ?? 
attualmente connesso ma una delle due parti non accetta indirizzamento di 
traffico)
+StatisticsToadlet.routingDisabled=Indirizzamento traffico sospeso (il nodo ??? 
attualmente connesso ma una delle due parti non accetta indirizzamento di 
traffico)
 StatisticsToadlet.routingDisabledShort=Indirizzamento Traffico Sospeso
 StatisticsToadlet.running=In funzione
 StatisticsToadlet.statisticGatheringTitle=Raccolta Statistiche
 StatisticsToadlet.swapOutput=Output Scambio: ${total}.
 StatisticsToadlet.threadDumpButton=Genera Thread Dump
 StatisticsToadlet.threads=Threads correnti: ${running}/${max}
-StatisticsToadlet.threadsByPriority=Thread in ordine di prorit??
+StatisticsToadlet.threadsByPriority=Thread in ordine di prorit???
 StatisticsToadlet.totalInput=Input Totale: ${total} (${rate}/second)
 StatisticsToadlet.totalOutput=Output Totale: ${total} (${rate}/second)
 StatisticsToadlet.totalOverhead=Totale overhead di non-richieste: ${rate}/sec 
(${percent}%).
@@ -1138,13 +1145,13 @@
 StatisticsToadlet.waiting=In attesa
 SymlinkerToadlet.symlinks=Link simbolici in ToadletServer
 SymlinkerToadlet.symlinksLong=Lista di "alias#target" che va a formare un 
gruppo di link simbolici
-TestnetHandler.cannotEnableDisableOnTheFly=Non ?? possibile abilitare o 
disabilitare la modalit?? testnet "al volo";  ?? necessario riavviare il nodo 
ed ottenere nuove connessioni.
-TestnetHandler.enable=Abilita modalit?? testnet (PERICOLO)
-TestnetHandler.enableLong=Abilita la modalit?? testnet (PERICOLO). La 
modalit?? testnet elimina l'anonimato per poter permettere agli sviluppatori di 
fare il debugging del nodo
+TestnetHandler.cannotEnableDisableOnTheFly=Non ??? possibile abilitare o 
disabilitare la modalit??? testnet "al volo";  ??? necessario riavviare il nodo 
ed ottenere nuove connessioni.
+TestnetHandler.enable=Abilita modalit??? testnet (PERICOLO)
+TestnetHandler.enableLong=Abilita la modalit??? testnet (PERICOLO). La 
modalit??? testnet elimina l'anonimato per poter permettere agli sviluppatori 
di fare il debugging del nodo
 TestnetHandler.port=Porta testnet
 TestnetHandler.portLong=Numero della porta testnet (-1 = listenPort+1000)
 TextModeClientInterfaceServer.allowedHosts=Host consentiti
-TextModeClientInterfaceServer.allowedHostsLong=Nomi host o indirizzi IP ai 
quali ?? consentito connettersi a TMCI. Pu?? essere una lista di nomi host e 
indirizzi IP separati da virgole, o anche IP in formato CIDR come 192.168.0.0/24
+TextModeClientInterfaceServer.allowedHostsLong=Nomi host o indirizzi IP ai 
quali ??? consentito connettersi a TMCI. Pu??? essere una lista di nomi host e 
indirizzi IP separati da virgole, o anche IP in formato CIDR come 192.168.0.0/24
 TextModeClientInterfaceServer.bindTo=Indirizzo IP collegato
 TextModeClientInterfaceServer.bindToLong=Indirizzo IP collegato
 TextModeClientInterfaceServer.enableInputOutput=Abilita stdout/stdin
@@ -1156,7 +1163,7 @@
 TextModeClientInterfaceServer.telnetPortNumber=Porta telnet
 TextModeClientInterfaceServer.telnetPortNumberLong=Porta TCP utlizzata dal 
server TMCI
 TimeSkewDetectedUserAlert.shortText=Il nodo ha rilevato una discrepanza 
temporale. Freenet potrebbe bloccarsi in strani modi!
-TimeSkewDetectedUserAlert.text=Una discrepanza temporale ?? stata rilevata dal 
nodo. Questo ?? un inconveniente grave; il nodo non potr?? funzionare 
correttamente finch?? non vi si sar?? ovviato. Tra le cause pi?? comuni, la 
modalit?? powersafe mal configurata, cattiva sincronizzazione tra i client in 
rete, problemi di hardware.
+TimeSkewDetectedUserAlert.text=Una discrepanza temporale ??? stata rilevata 
dal nodo. Questo ??? un inconveniente grave; il nodo non potr??? funzionare 
correttamente finch??? non vi si sar??? ovviato. Tra le cause pi??? comuni, la 
modalit??? powersafe mal configurata, cattiva sincronizzazione tra i client in 
rete, problemi di hardware.
 TimeSkewDetectedUserAlert.title=Discrepanza temporale rilevata!
 Toadlet.cancel=Cancella
 Toadlet.clickHere=Clicca qui
@@ -1174,9 +1181,9 @@
 Toadlet.returnToPrevPage=Torna alla pagina precedente
 Toadlet.returnToQueuepage=Torna alla pagina della coda
 Toadlet.tempRedirectWithReason=Redirect temporaneo: ${reason}
-Toadlet.unauthorized=L'accesso a questa pagina ?? interdetto.
+Toadlet.unauthorized=L'accesso a questa pagina ??? interdetto.
 Toadlet.unauthorizedTitle=Non Autorizzato
-Toadlet.yes=S??
+Toadlet.yes=S???
 ToadletContextImpl.cannotParseContentLength=errore nell' analisi 
contenuto-lunghezza: ${error}
 ToadletContextImpl.cannotParseContentLengthWithError=Impossibile interpretare 
contenuto-lunghezza: ${error}
 ToadletContextImpl.headersLineTooLong=Rigo troppo lungo dalla ricostruzione di 
headers
@@ -1198,23 +1205,23 @@
 TranslationToadlet.reEdit=Ri-modifica la traduzione
 TranslationToadlet.remove=Elimina
 TranslationToadlet.removeOverrideTitle=Elimina una chiave di traduzione
-TranslationToadlet.removeOverrideWarningTitle=Attenzione: la chiave di 
traduzione verr?? eliminata!
+TranslationToadlet.removeOverrideWarningTitle=Attenzione: la chiave di 
traduzione verr??? eliminata!
 TranslationToadlet.returnToTranslations=Torna alla pagina della traduzione
-TranslationToadlet.showEverything=Mostra tutto, incluse stringhe gi?? tradotte
+TranslationToadlet.showEverything=Mostra tutto, incluse stringhe gi??? tradotte
 TranslationToadlet.translationKeyLabel=Chiave di traduzione
 TranslationToadlet.translationUpdateTitle=Aggiornamento traduzione
 TranslationToadlet.translationUpdatedTitle=Traduzione aggiornata!
 TranslationToadlet.updateTranslationCommand=Aggiorna traduzione
-UnknownContentTypeException.explanation=Il nodo non ha informazioni su questo 
MIME type. Ci?? potrebbe comportare una reazione pericolosa da parte del 
browser in risposta al download di questo file. Per esempio, molti formati 
possono contenere immagini o video inclusi (embedded) che vengono scaricati dal 
web: ci?? espone l'utente al rischio di rivelare il proprio indirizzo IP ad un 
eventuale avversario (per esempio un avversario che gestisca il il sito web dal 
quale le immagini o video ecc. vengono scaricati, o uno che abbia in qualche 
modo ottenuto accesso ai log del sito stesso). Hyperlinks e scripting sono 
entrambi ugualmente pericolosi, per lo stesso motivo, ed anche per alcuni altri.
+UnknownContentTypeException.explanation=Il nodo non ha informazioni su questo 
MIME type. Ci??? potrebbe comportare una reazione pericolosa da parte del 
browser in risposta al download di questo file. Per esempio, molti formati 
possono contenere immagini o video inclusi (embedded) che vengono scaricati dal 
web: ci??? espone l'utente al rischio di rivelare il proprio indirizzo IP ad un 
eventuale avversario (per esempio un avversario che gestisca il il sito web dal 
quale le immagini o video ecc. vengono scaricati, o uno che abbia in qualche 
modo ottenuto accesso ai log del sito stesso). Hyperlinks e scripting sono 
entrambi ugualmente pericolosi, per lo stesso motivo, ed anche per alcuni altri.
 UnknownContentTypeException.title=Tipo di contenuto (content type) sconosciuto 
e pertanto potenzialmente pericoloso: ${type}
 UpdateDeployContext.cannotUpdateNoExtJar=Freenet-ext.jar non trovata in 
wrapper.conf: (freenet.jar trovata: ${mainFilename})
-UpdateDeployContext.cannotUpdateNoJars=Non ?? stato possibile trovare i file 
jar di Freenet in wrapper.conf
-UpdateDeployContext.cannotUpdateNoMainJar=Non ?? stato possibile trovare 
freenet.jar in wrapper.conf (freenet-ext.jar non trovata: ${extFilename})
+UpdateDeployContext.cannotUpdateNoJars=Non ??? stato possibile trovare i file 
jar di Freenet in wrapper.conf
+UpdateDeployContext.cannotUpdateNoMainJar=Non ??? stato possibile trovare 
freenet.jar in wrapper.conf (freenet-ext.jar non trovata: ${extFilename})
 UpdateDeployContext.updateCatastrophe=ERRORE CATASTROFICO: Eliminato ${old} ma 
impossibile rinominare ${new} in ${old} quindi IL NODO NON SI AVVIERA'! La 
soluzione consiste nel rinominare ${new}  in ${old} manualmente
-UpdateDeployContext.updateFailedCannotDeleteOldConfig=Non ?? stato possibile 
eliminare ${old} quindi non ?? possibile sovrascrivere. Aggiornamento fallito.
-UpdateDeployContext.updateFailedNonStandardConfig=Non ?? stato possibile 
completare l'aggiornamento a causa della configurazione non-standard: written 
main=${main} ext=${ext} - Questo non dovrebbe accadere! Si prega di riportare 
l'accaduto agli sviluppatori includendo il file wrapper.conf
+UpdateDeployContext.updateFailedCannotDeleteOldConfig=Non ??? stato possibile 
eliminare ${old} quindi non ??? possibile sovrascrivere. Aggiornamento fallito.
+UpdateDeployContext.updateFailedNonStandardConfig=Non ??? stato possibile 
completare l'aggiornamento a causa della configurazione non-standard: written 
main=${main} ext=${ext} - Questo non dovrebbe accadere! Si prega di riportare 
l'accaduto agli sviluppatori includendo il file wrapper.conf
 UpdatedVersionAvailableUserAlert.alsoDownloadedNewExtJar=Il nodo ha anche 
scaricato una nuova versione della extra jar di Freenet, versione ${version}
-UpdatedVersionAvailableUserAlert.armed=Il nodo verr?? riavviato 
automaticamente dopo aver completato il download e verificato la nuova versione 
di Freenet.
+UpdatedVersionAvailableUserAlert.armed=Il nodo verr??? riavviato 
automaticamente dopo aver completato il download e verificato la nuova versione 
di Freenet.
 UpdatedVersionAvailableUserAlert.clickToUpdateASAP=Clicca qui sotto per 
aggiornare il nodo dopo la verifica dell'aggiornamento.
 UpdatedVersionAvailableUserAlert.clickToUpdateNow=Clicca qui sotto per 
aggiornare il nodo immediatamente.
 UpdatedVersionAvailableUserAlert.downloadedNewExtJar=Il nodo ha scaricato una 
nuova versione della extra jar di Freenet, versione ${version}.
@@ -1224,12 +1231,12 @@
 UpdatedVersionAvailableUserAlert.fetchingNewNode=Il nodo sta scaricando una 
versione aggiornata di Freenet (versione nodo ${nodeVersion}).
 UpdatedVersionAvailableUserAlert.finalCheck=Il nodo sta eseguendo un controllo 
finale per verificare la sicurezza dell'aggiornamento (${count} of ${max}).
 UpdatedVersionAvailableUserAlert.notLatest=Sembra che il nodo non stia usando 
una versione aggiornata del software.
-UpdatedVersionAvailableUserAlert.shortArmed=In nodo sta scaricando una nuova 
versione di Freenet e si riavvier?? una volta terminato il download.
-UpdatedVersionAvailableUserAlert.shortNotReadyNotArmed=Il nodo sta scaricando 
una nuova versione di Freenet, ma per poterla utilizzare ?? necessaria la 
conferma da parte dell'utente.
-UpdatedVersionAvailableUserAlert.shortReadyNotArmed=Il nodo ha scaricato una 
nuova versione di Freenet ma potr?? usarla solo dopo la conferma da parte dell' 
utente.
+UpdatedVersionAvailableUserAlert.shortArmed=In nodo sta scaricando una nuova 
versione di Freenet e si riavvier??? una volta terminato il download.
+UpdatedVersionAvailableUserAlert.shortNotReadyNotArmed=Il nodo sta scaricando 
una nuova versione di Freenet, ma per poterla utilizzare ??? necessaria la 
conferma da parte dell'utente.
+UpdatedVersionAvailableUserAlert.shortReadyNotArmed=Il nodo ha scaricato una 
nuova versione di Freenet ma potr??? usarla solo dopo la conferma da parte 
dell' utente.
 UpdatedVersionAvailableUserAlert.title=E' disponibile una nuova versione 
stabile di Freenet
-UpdatedVersionAvailableUserAlert.updateASAPButton=Si prega di aggiornare al 
pi?? presto possibile
-UpdatedVersionAvailableUserAlert.updateASAPQuestion=Riavviare il nodo dopo che 
l'aggiornamento ?? stato completato?
+UpdatedVersionAvailableUserAlert.updateASAPButton=Si prega di aggiornare al 
pi??? presto possibile
+UpdatedVersionAvailableUserAlert.updateASAPQuestion=Riavviare il nodo dopo che 
l'aggiornamento ??? stato completato?
 UpdatedVersionAvailableUserAlert.updateNowButton=Aggiorna Adesso!
 UserAlert.apply=Conferma
 UserAlert.hide=Nascondi
@@ -1245,7 +1252,7 @@
 UserAlertManager.totalLabel=Totale:
 UserAlertManager.warningCountLabel=Avvertenze:
 UserAlertsToadlet.titleWithName=Avvertenze per ${name}
-WelcomeToadlet.activityTitle=Attivit?? in corso
+WelcomeToadlet.activityTitle=Attivit??? in corso
 WelcomeToadlet.alertsSummary=Sommario avvertenze
 WelcomeToadlet.arkFetchCount=ARK Fetchers: ${total}
 WelcomeToadlet.confirmAddBookmarkSubTitle=Conferma Aggiunta Sgnalibro
@@ -1262,20 +1269,20 @@
 WelcomeToadlet.extVersionWithRecommended=Freenet-ext Build #${build} (si 
raccomanda ${recbuild}) r${rev}
 WelcomeToadlet.fetch=Richiama
 WelcomeToadlet.fetchKeyLabel=Richiama una chiave
-WelcomeToadlet.finInsertSuccessWithKey=Il messaggio ?? stato inserito in 
${key}.
+WelcomeToadlet.finInsertSuccessWithKey=Il messaggio ??? stato inserito in 
${key}.
 WelcomeToadlet.finInsertedTitle=Inserzione
 WelcomeToadlet.finTitle=Inserzione Nota  Istantanea di Frost
 WelcomeToadlet.fromHeader=Da
 WelcomeToadlet.goToExternalLink=Vai al link specificato
 WelcomeToadlet.homepageFullTitleWithName=Homepage FProxy di ${name}
-WelcomeToadlet.ieWarning=E' stato rilevato l'uso di Microsoft Internet 
Explorer. Ci?? potrebbe costituire un pericolo perch?? alcuni siti interni a 
Freenet potrebbero compromettere l'anonimato dell'utente.
+WelcomeToadlet.ieWarning=E' stato rilevato l'uso di Microsoft Internet 
Explorer. Ci??? potrebbe costituire un pericolo perch??? alcuni siti interni a 
Freenet potrebbero compromettere l'anonimato dell'utente.
 WelcomeToadlet.ieWarningTitle=Rischio Sicurezza!
 WelcomeToadlet.insertCount=Inserzioni: ${total}
 WelcomeToadlet.insertFailedTitle=Inserzione fallita
-WelcomeToadlet.insertFailedWithMessage=L'inserzione ?? fallita con il 
messaggio: ${message}
+WelcomeToadlet.insertFailedWithMessage=L'inserzione ??? fallita con il 
messaggio: ${message}
 WelcomeToadlet.insertSucceededTitle=Inserzione Completata
 WelcomeToadlet.insertedTitle=Inserzione
-WelcomeToadlet.keyInsertedSuccessfullyWithKeyAndName=La chiave 
${link}${name}${/link} ?? stata inserita.
+WelcomeToadlet.keyInsertedSuccessfullyWithKeyAndName=La chiave 
${link}${name}${/link} ??? stata inserita.
 WelcomeToadlet.keyRequestLabel=Chiave:
 WelcomeToadlet.messageHeader=Messaggio
 WelcomeToadlet.nodeUpdateConfirm=Conferma: aggiornare il nodo Freenet?
@@ -1288,7 +1295,7 @@
 WelcomeToadlet.restartConfirm=Conferma: Riavvia nodo Freenet?
 WelcomeToadlet.restartConfirmTitle=Riavvia Nodo
 WelcomeToadlet.restartNode=Riavvia nodo
-WelcomeToadlet.restarting=Si prega di attendere durante il riavvio del nodo. 
Questa schermata  si aggiorner?? automaticamente, fino a mostrare la pagina 
iniziale fi Freenet. Grazie di aver scelto Freenet.
+WelcomeToadlet.restarting=Si prega di attendere durante il riavvio del nodo. 
Questa schermata  si aggiorner??? automaticamente, fino a mostrare la pagina 
iniziale fi Freenet. Grazie di aver scelto Freenet.
 WelcomeToadlet.restartingTitle=Riavvio del nodo Freenet in corso.
 WelcomeToadlet.shutdown=Arresta
 WelcomeToadlet.shutdownConfirm=Conferma: Arresta nodo Freenet?
@@ -1299,24 +1306,23 @@
 WelcomeToadlet.startIndexHeader=Indice dal quale iniziare
 WelcomeToadlet.subjectHeader=Oggetto
 WelcomeToadlet.targetBoardHeader=Target Board
-WelcomeToadlet.testnetWarning=gira in modalit?? testnet. DISTRUGGE l'anonimato!
-WelcomeToadlet.testnetWarningTitle=Modalit?? Testnet
+WelcomeToadlet.testnetWarning=gira in modalit??? testnet. DISTRUGGE 
l'anonimato!
+WelcomeToadlet.testnetWarningTitle=Modalit??? Testnet
 WelcomeToadlet.thanks=Grazie di aver scelto Freenet.
-WelcomeToadlet.threadDumpNotUsingWrapper=Non ?? possibile generare un thread 
dump se il nodo non sta girando nel wrapper
+WelcomeToadlet.threadDumpNotUsingWrapper=Non ??? possibile generare un thread 
dump se il nodo non sta girando nel wrapper
 WelcomeToadlet.threadDumpSubTitle=Generazione di Thread Dump
 WelcomeToadlet.threadDumpTitle=Genera Thread Dump
-WelcomeToadlet.threadDumpWithFilename=E' stato generato un thread dump, esso 
?? disponibile in ${filename}.
+WelcomeToadlet.threadDumpWithFilename=E' stato generato un thread dump, esso 
??? disponibile in ${filename}.
 WelcomeToadlet.transferringRequestCount=Richieste in corso di trasferimento: 
${total}
 WelcomeToadlet.update=Aggiorna
-WelcomeToadlet.updating=Il nodo Freenet ?? stato aggiornato e sar?? ora 
riavviato automaticamente. Il processo di riavvio pu?? durare fino a dieci 
minuti perch?? il nodo prima di aggiornare deve controllare se sia presente una 
chiave di revoca.
+WelcomeToadlet.updating=Il nodo Freenet ??? stato aggiornato e sar??? ora 
riavviato automaticamente. Il processo di riavvio pu??? durare fino a dieci 
minuti perch??? il nodo prima di aggiornare deve controllare se sia presente 
una chiave di revoca.
 WelcomeToadlet.updatingThanks=Grazie per usare Freenet
 WelcomeToadlet.updatingTitle=Aggiornamento del nodo in corso
 WelcomeToadlet.uriWouldHaveBeen=La URI sarebbe stata: ${uri}
 WelcomeToadlet.version=Freenet ${fullVersion} Build ${build} r${rev}
 WelcomeToadlet.versionHeader=Informazioni sulla Versione e Controllo del Nodo
 WelcomeToadlet.writtenDatabaseStats=Le statistiche di runtime del database 
sono state scritte nel file di log del wrapper
-WrapperConfig.wrapper.java.maxmemory.long=Limita la quantit?? massima di 
memoria utilizzabile da Freenet. Freenet ha bisogno di molta pi?? memoria se si 
hanno molti e/o grossi file in coda di dowload/upload,  ed in misura minore se 
il nodo ?? dotato di un datastore di dimensioni abbondanti.  I cambiamenti 
saranno effettivi dopo il riavvio del nodo.
+WrapperConfig.wrapper.java.maxmemory.long=Limita la quantit??? massima di 
memoria utilizzabile da Freenet. Freenet ha bisogno di molta pi??? memoria se 
si hanno molti e/o grossi file in coda di dowload/upload,  ed in misura minore 
se il nodo ??? dotato di un datastore di dimensioni abbondanti.  I cambiamenti 
saranno effettivi dopo il riavvio del nodo.
 WrapperConfig.wrapper.java.maxmemory.short=Memoria massima (in megabytes)
 testing.test=test${test1}test${test2}test
-???BookmarkEditorToadlet.pasteOrCancel=Click su un'icona incolla o cancella.
 End

Modified: 
branches/saltedhashstore/freenet/src/freenet/l10n/freenet.l10n.zh-cn.properties
===================================================================
--- 
branches/saltedhashstore/freenet/src/freenet/l10n/freenet.l10n.zh-cn.properties 
    2008-07-25 14:15:06 UTC (rev 21394)
+++ 
branches/saltedhashstore/freenet/src/freenet/l10n/freenet.l10n.zh-cn.properties 
    2008-07-25 17:41:12 UTC (rev 21395)
@@ -64,7 +64,13 @@
 
BuildOldAgeUserAlert.tooOld=????????????????????????????????????????????????????????????????????????????????????????????????(Build
 #${lastgood}). ???????????????????????????, 
??????????????????????????????"??????"?????????????????????. 
(????????????????????????, Freenet 
?????????????????????????????????????????????)
 BuildOldAgeUserAlert.tooOldShort=??????????????? Freenet 
????????????????????????, ?????????????????????????????????????????????! 
???????????????!
 BuildOldAgeUserAlert.tooOldTitle=????????????
+CSSTokenizerFilter.deletedDisallowedString=???????????????????????????
+CSSTokenizerFilter.deletedUnmatchedChar=????????????????????????:
+CSSTokenizerFilter.deletedUnofficialIdent=????????????????????????
+CSSTokenizerFilter.deletedUnofficialIdentWithURL=???????????????????????? url 
?????????
+CSSTokenizerFilter.invalidURLContents=url() ?????????????????????
 CSSTokenizerFilter.supplementalCharsNotSupported=????????????????????? 0xFFFF 
??? UCS-4 ??????!
+CSSTokenizerFilter.unknownAtIdentifierLabel=????????? @ ?????????:
 ClockProblemDetectedUserAlert.shortText=?????????????????????????????????, 
Freenet ??????????????????.
 ClockProblemDetectedUserAlert.text=Freenet 
??????????????????????????????(???????????????)????????????. 
??????????????????????????????????????????, Freenet ??????????????????.
 ClockProblemDetectedUserAlert.title=?????????????????????.
@@ -74,20 +80,34 @@
 ConfigToadlet.appliedTitle=?????????????????????
 ConfigToadlet.apply=??????
 ConfigToadlet.configNavTitle=????????????
+ConfigToadlet.console=????????????
 ConfigToadlet.contributeTranslation=????????????????????????
 ConfigToadlet.defaultIs=?????????: '${default}'.
 ConfigToadlet.false=???
+ConfigToadlet.fcp=????????????
+ConfigToadlet.fproxy=????????????
 ConfigToadlet.fullTitle=${name} ??? Freenet ????????????
+ConfigToadlet.logger=?????????
 ConfigToadlet.modeAdvanced=??????????????????
 ConfigToadlet.modeSimple=??????????????????
+ConfigToadlet.node=??????
+ConfigToadlet.pluginmanager=???????????????
+ConfigToadlet.pluginmanager2=???????????????2
 ConfigToadlet.possibilitiesTitle=??????
 ConfigToadlet.reset=??????
 ConfigToadlet.returnToNodeConfig=??????????????????
 ConfigToadlet.shortTitle=??????
+ConfigToadlet.ssl=SSL (????????????)
 ConfigToadlet.title=Freenet ????????????
+ConfigToadlet.toadletsymlinker=toadlet???????????????
 ConfigToadlet.true=???
 ConfigToadlet.wrapper=????????????
 ConfigToadlet.wrapperSettingsTitle=??????????????????
+ConfigToadlet.node.load=??????.??????
+ConfigToadlet.node.opennet=??????.????????????
+ConfigToadlet.node.scheduler=??????.?????????
+ConfigToadlet.node.testnet=??????.????????????
+ConfigToadlet.node.updater=??????.????????????
 
ConfigurablePersister.doesNotExistCannotCreate=???????????????????????????????????????.
 
ConfigurablePersister.existsCannotReadWrite=??????????????????????????????????????????
 ConnectionsToadlet.nodeStatus.BACKED OFF=?????????
@@ -123,13 +143,31 @@
 
ContentDataFilter.unknownCharset=???????????????????????????????????????????????????.
 ????????????????????????????????????????????????, 
????????????????????????????????????.
 ContentDataFilter.unknownCharsetTitle=???????????????!
 ContentDataFilter.warningUnknownCharsetTitle=??????: ?????????????????? 
(${charset})
+ContentFilter.applicationPdfReadAdvice=Adobe(R) PDF ?????? - ????????????!
+ContentFilter.applicationPdfWriteAdvice=Adobe(R) PDF ?????? - ????????????!
+ContentFilter.imageGifReadAdvice=GIF ?????? - ???????????????
+ContentFilter.imageGifWriteAdvice=GIF ?????? - ???????????????, 
????????????????????????????????????
+ContentFilter.imageIcoReadAdvice=???????????? - ???????????????
+ContentFilter.imageIcoWriteAdvice=???????????? - 
???????????????(?????????????????????????????????????????????????)
+ContentFilter.imageJpegReadAdvice=JPEG ?????? - ???????????????
+ContentFilter.imageJpegWriteAdvice=JPEG ?????? - ???????????????, 
?????????????????? EXIF ??????
+ContentFilter.imagePngReadAdvice=PNG ?????? - ???????????????
+ContentFilter.imagePngWriteAdvice=PNG ?????? - ???????????????, 
????????????????????????????????????????????????
+ContentFilter.textCssReadAdvice=CSS (cascading style sheet, 
??????????????????, ??????????????? HTML) - 
????????????????????????????????????, ??????????????????????????????, 
???????????????
+ContentFilter.textCssWriteAdvice=CSS (cascading style sheet, 
??????????????????, ??????????????? HTML) - ????????????????????????(metadata), 
???????????????
+ContentFilter.textHtmlReadAdvice=HTML - ??????????????????????????????
+ContentFilter.textHtmlWriteAdvice=HTML - 
????????????????????????????????????????????????(metadata); 
?????????????????????
+ContentFilter.textPlainReadAdvice=????????? - 
?????????????????????????????????(????????? IE, Internet 
Explorer)??????????????????
+ContentFilter.textPlainWriteAdvice=????????? - 
????????????????????????????????????, ???????????????
 DarknetConnectionsToadlet.activityInserts=??????: 
??????${totalSenders}????????????, ${CHKhandlers}???CHK?????????, 
${SSKhandlers}???SSK?????????
 DarknetConnectionsToadlet.activityRequests=??????: 
??????${totalSenders}????????????, ${CHKhandlers}???CHK?????????, 
${SSKhandlers}???SSK?????????
 DarknetConnectionsToadlet.activityTitle=????????????
 DarknetConnectionsToadlet.add=??????
 DarknetConnectionsToadlet.addPeerTitle=??????????????????
+DarknetConnectionsToadlet.alreadyInReferences=???????????????????????????.
 DarknetConnectionsToadlet.backedOff=?????????????????????: 
????????????????????????????????????, ?????????????????????????????????.
 DarknetConnectionsToadlet.backedOffShort=?????????
+DarknetConnectionsToadlet.bursting=?????????????????????: 
????????????????????????, ????????????????????????????????????, 
?????????????????????????????????????????????.
 DarknetConnectionsToadlet.burstingShort=?????????
 DarknetConnectionsToadlet.busy=??????: ????????????????????????, 
??????????????????????????????????????????????????????, 
???????????????????????????????????????.
 DarknetConnectionsToadlet.busyShort=??????
@@ -137,18 +175,25 @@
 DarknetConnectionsToadlet.cantFetchNoderefURL=????????? ${url} 
??????????????????.???????????????.
 
DarknetConnectionsToadlet.cantParseTryAgain=????????????????????????????????????:(${error}).???????????????.
 
DarknetConnectionsToadlet.cantParseWrongEnding=???????????????????????????:?????????????????????????????????End??????,?????????????????????????????????:${end}
+DarknetConnectionsToadlet.clockProblem=??????????????????????????????????????? 
24 ??????. ??????????????????????????????, 
????????????????????????????????????????????????????????????.
 DarknetConnectionsToadlet.clockProblemShort=????????????
+DarknetConnectionsToadlet.confirmRemoveNode=???????????????????????? "${name}" 
???? ?????????????????????????????????, ???????????????????????????, 
??????????????????????????????????????????????????????, 
???????????????????????????.
 DarknetConnectionsToadlet.confirmRemoveNodeTitle=?????????
 DarknetConnectionsToadlet.confirmRemoveNodeWarningTitle=????????????
+DarknetConnectionsToadlet.connError=????????????(????????????????)
+DarknetConnectionsToadlet.connErrorShort=????????????
 DarknetConnectionsToadlet.connected=?????????:??????????????????????????????
 DarknetConnectionsToadlet.connectedShort=?????????
 DarknetConnectionsToadlet.darknetFnpPort=????????????(Darknet) FNP: 
${port}/UDP (???????????????????????????, ?????????"??????", ????????????; 
?????????????????????????????????????????????)
 DarknetConnectionsToadlet.disabled=?????????????????????: 
?????????????????????????????????????????????????????????.
 DarknetConnectionsToadlet.disabledShort=?????????
+DarknetConnectionsToadlet.disconnecting=????????? (?????????????????????, 
?????????????????????????????????, ????????????????????????)
 DarknetConnectionsToadlet.disconnectingShort=?????????
 DarknetConnectionsToadlet.enterDescription=???????????????:
+DarknetConnectionsToadlet.failedToAddNodeInternalError=??????????????????????????????????????????.
 ????????????????????????????????????:
 
DarknetConnectionsToadlet.failedToAddNodeInternalErrorTitle=??????????????????:????????????
 DarknetConnectionsToadlet.failedToAddNodeTitle=??????????????????
+DarknetConnectionsToadlet.fcpDisabled=FCP ???????????? (??? Freenet 
???????????????, ?????? Frost ??? Thaw ??????)
 DarknetConnectionsToadlet.fcpPort=FCP: ${port}/TCP (??? Frost, Thaw ??? 
Freenet ?????????????????????)
 
DarknetConnectionsToadlet.fileReference=?????????????????????????????????????????????:
 DarknetConnectionsToadlet.fnpPort=FNP: ${port}/udp 
(?????????????????????;??????????????????????????????????????????)
@@ -160,8 +205,11 @@
 
DarknetConnectionsToadlet.idleTime=??????????????????????????????????????????????????????
 DarknetConnectionsToadlet.idleTimeTitle=?????????????????????
 
DarknetConnectionsToadlet.invalidSignature=??????????????????????????????????????????(${error}).
+DarknetConnectionsToadlet.ipAddress=??????????????????, ??? <??????>:<??????> 
??????
 DarknetConnectionsToadlet.ipAddressTitle=??????
-DarknetConnectionsToadlet.listenOnlyShort=?????????
+DarknetConnectionsToadlet.listenOnly=?????????????????????: 
???????????????????????????????????????, 
?????????????????????????????????????????????.
+DarknetConnectionsToadlet.listenOnlyShort=????????????
+DarknetConnectionsToadlet.listening=?????????????????????: 
???????????????????????????????????????, 
?????????????????????????????????????????????.
 DarknetConnectionsToadlet.listeningShort=?????????
 DarknetConnectionsToadlet.myFriends=????????????
 
DarknetConnectionsToadlet.myReferenceHeader=${linkref}??????????????????${/linkref}
 (${linktext}????????????${/linktext})
@@ -171,6 +219,7 @@
 DarknetConnectionsToadlet.neverConnectedShort=????????????
 
DarknetConnectionsToadlet.noPeersFirstHalf=Freenet???????????????????????????????????????,?????????????????????.??????
 
DarknetConnectionsToadlet.noPeersSecondHalf=??????,?????????????????????????????????????????????.
+DarknetConnectionsToadlet.noPeersWithHomepageLink=Freenet 
?????????????????????????????????????????????????????????. 
??????${link}????????????${/link}??????????????????????????????, 
???????????????????????????.
 
DarknetConnectionsToadlet.noRefOrURL=?????????????????????????????????????????????URL.
 ???????????????.
 DarknetConnectionsToadlet.nodePortsTitle=?????????????????????
 DarknetConnectionsToadlet.notConnected=?????????: ???????????????, 
??????????????????????????????????????????
@@ -182,13 +231,22 @@
 
DarknetConnectionsToadlet.referenceCopyWarning=?????????????????????${bold}????????????${/bold}??????.??????????????????${bold}????????????${/bold}.
 DarknetConnectionsToadlet.remove=?????????!
 DarknetConnectionsToadlet.removePeers=?????????????????????
+DarknetConnectionsToadlet.routingDisabled=?????????????????? 
(???????????????????????????????????????, 
??????????????????????????????????????????)
+DarknetConnectionsToadlet.routingDisabledShort=??????????????????
+DarknetConnectionsToadlet.seedClients=?????????????????????????????????????????????.
+DarknetConnectionsToadlet.seedClientsShort=????????????
+DarknetConnectionsToadlet.seedServers=????????????????????????????????????.
 DarknetConnectionsToadlet.seedServersShort=??????
 DarknetConnectionsToadlet.selectAction=-- ???????????? --
 DarknetConnectionsToadlet.sendMessageTitle=???????????????????????????
 
DarknetConnectionsToadlet.sendMessageToPeers=?????????????????????????????????????????????
+DarknetConnectionsToadlet.separator=??? ??? ???
 DarknetConnectionsToadlet.statusTitle=??????
+DarknetConnectionsToadlet.tmciDisabled=TMCI ???????????? (?????? telnet 
????????????????????????)
 DarknetConnectionsToadlet.tmciPort=TMCI: ${port}/TCP (?????? telnet 
????????????????????????)
+DarknetConnectionsToadlet.tooNew=?????????????????????: 
????????????????????????????????????????????????????????????.
 DarknetConnectionsToadlet.tooNewShort=??????
+DarknetConnectionsToadlet.tooOld=?????????????????????: 
????????????????????????????????????????????????????????????. 
???????????????????????????????????????.
 DarknetConnectionsToadlet.tooOldShort=??????
 DarknetConnectionsToadlet.transferringRequests=????????????: 
${senders}????????????, ${receivers}????????????
 
DarknetConnectionsToadlet.triedToAddSelf=????????????????????????????????????????????????.
@@ -264,8 +322,12 @@
 
FcpServer.assumeDownloadDDAIsAllowedLong=?????????????????????????????????????????????(DDA)?
 ?????????, ?????????????????? DDA ????????????????????? TestDDARequest ??????.
 FcpServer.assumeUploadDDAIsAllowed=????????????????????? DDA?
 
FcpServer.assumeUploadDDAIsAllowedLong=?????????????????????????????????????????????(DDA)?
 ?????????, ?????????????????? DDA ????????????????????? TestDDARequest ??????.
+FcpServer.cannotStartOrStopOnTheFly=????????????????????????????????? FCP 
?????????
 
FcpServer.downloadsFileCanCreateCannotReadOrWrite=?????????????????????????????????
+FcpServer.downloadsFileDoesNotExistCannotCreate=?????????????????????????????????
 
FcpServer.downloadsFileExistsCannotReadOrWrite=?????????????????????????????????
+FcpServer.downloadsFileParentDoesNotExist=?????????????????????
+FcpServer.downloadsFileUnreadable=?????????????????????????????????
 FcpServer.enablePersistentDownload=??????????????????????
 FcpServer.enablePersistentDownloadLong=??????????????? FCP ???????????? 
 FcpServer.filenameToStorePData=??????????????????????????????
@@ -277,11 +339,22 @@
 FcpServer.portNumber=FCP???
 FcpServer.ssl=?????? SSL?
 FcpServer.sslLong=????????? FCP ?????????????????? SSL
+FileOffer.acceptTransferButton=????????????
+FileOffer.askUserTitle=??????????????????
 FileOffer.commentLabel=??????:
+FileOffer.failedReceiveHeader=??? ${node} ???????????? ${filename} ??????.
+FileOffer.failedReceiveShort=??? ${node} ???????????? ${filename} ??????.
+FileOffer.failedReceiveTitle=??????????????????
 FileOffer.fileLabel=??????:
 FileOffer.mimeLabel=MIME ??????:
+FileOffer.offeredFileHeader=?????? ${name} ???????????????:
+FileOffer.offeredFileShort=???????????? ${node} ??????????????? ${filename}.
+FileOffer.rejectTransferButton=????????????
 FileOffer.senderLabel=?????????:
 FileOffer.sizeLabel=??????:
+FileOffer.succeededReceiveHeader=??? ${node} ???????????? ${filename} ??????.
+FileOffer.succeededReceiveShort=??? ${node} ?????? ${filename} ?????????.
+FileOffer.succeededReceiveTitle=??????????????????
 FirstTimeWizardToadlet.bandwidthLimit=????????????
 
FirstTimeWizardToadlet.bandwidthLimitLong=???????????????????????????????????????????????????????????????
 FirstTimeWizardToadlet.bwlimitHigherSpeed=?????????
@@ -344,7 +417,7 @@
 HTMLFilter.couldNotParseStyle=?????????????????????????????????
 HTMLFilter.deletedUnknownStyle=?????????????????????
 HTMLFilter.failedToParseLabel=HTML ?????????????????????????????????
-HTMLFilter.tooManyNestedStyleOrScriptTags=???????????????????????????????????????
 - ???????????????????????????????????????
+HTMLFilter.tooManyNestedStyleOrScriptTags=???????????????????????????????????????
 - ???????????????????????????????????????
 HTMLFilter.tooManyNestedStyleOrScriptTagsLong=?????? </style> ??????????????? 
- ???????????????????????????????????????, ???????????????????????????, 
???????????????????????????????????? - 
????????????????????????????????????????????????
 HTMLFilter.unknownTag=??????????????? ${tag}
 IPDetectorPluginManager.connectionProblems=????????????:
@@ -371,6 +444,16 @@
 JPEGFilter.notJpeg=??????????????????????????????????????? JPEG 
????????????????????????????????????????????????????????????????????????????????????????????????????????????
 JPEGFilter.tooShort=?????????????????????????????????JPEG?????????
 JPEGFilter.tooShortTitle=????????????
+KnownUnsafeContentTypeException.dangerousInlines=??????????????????????????????????????????????????????,
 ??????????????????????????????????????????????????????, 
???????????????????????????.
+KnownUnsafeContentTypeException.dangerousInlinesLabel=?????????????????????:
+KnownUnsafeContentTypeException.dangerousLinks=???????????????????????????????????????????????????????????????;
 ?????????????????????(???????????????), 
???????????????????????????????????????.
+KnownUnsafeContentTypeException.dangerousLinksLabel=???????????????:
+KnownUnsafeContentTypeException.dangerousMetadata=??????????????????????????????????????????(metadata),
 ?????????????????????????????????????????????????????????, 
??????????????????????????????????????????????????????.
+KnownUnsafeContentTypeException.dangerousMetadataLabel=?????????????????????:
+KnownUnsafeContentTypeException.dangerousScripts=???????????????????????????????????????????????????,
 ?????????????????????????????????????????????????????????????????????, 
??????????????????????????????, .
+KnownUnsafeContentTypeException.dangerousScriptsLabel=?????????????????????:
+KnownUnsafeContentTypeException.knownUnsafe=?????? MIME 
????????????????????????. ???????????????????????????, 
????????????????????????????????????, ????????????????????????, 
??????????????????????????????????????????????????????????????????????????????. 
?????????:
+KnownUnsafeContentTypeException.noFilter=????????????????????????????????????????????????,
 ????????????????????????????????????!
 KnownUnsafeContentTypeException.title=?????????????????????: ${type}
 LocalFileInsertToadlet.checkPathExist=?????????????????????????????????.
 
LocalFileInsertToadlet.checkPathIsDir=??????????????????????????????????????????.
@@ -382,8 +465,8 @@
 LocalFileInsertToadlet.listing=????????????: ${path}
 LocalFileInsertToadlet.listingTitle=${path} ?????????
 LocalFileInsertToadlet.sizeHeader=??????
-LogConfigHandler.detaildPriorityThreshold=?????????????????????????????????
-LogConfigHandler.detaildPriorityThresholdLong=?????????????????????????????????,
 ????????? freenet:normal, freenet.node:minor
+LogConfigHandler.detaildPriorityThreshold=?????????????????????????????????
+LogConfigHandler.detaildPriorityThresholdLong=?????????????????????????????????,
 ????????? freenet:normal, freenet.node:minor
 LogConfigHandler.dirName=????????????
 LogConfigHandler.dirNameLong=?????????????????????????????????
 LogConfigHandler.enabled=???????????????????
@@ -421,11 +504,11 @@
 N2NTMToadlet.sendMessageShort=????????????
 N2NTMToadlet.sendStatus=??????????????????
 N2NTMToadlet.sent=????????????????????????
-N2NTMToadlet.sentTitle=??????
+N2NTMToadlet.sentTitle=?????????
 N2NTMToadlet.tooLong=?????????????????????????????? 1024 ???????????????
-N2NTMToadlet.tooLongTitle=??????
+N2NTMToadlet.tooLongTitle=????????????
 N2NTMUserAlert.delete=??????
-N2NTMUserAlert.header=??????: ${from} (????????? ${composed} | ????????? 
${sent} | ????????? ${received})
+N2NTMUserAlert.header=??????: ${from} (${composed} ?????? | ${sent} ?????? | 
${received}) ??????
 N2NTMUserAlert.headerShort=?????? ${from} ?????????
 N2NTMUserAlert.reply=??????
 
N2NTMUserAlert.title=???${peername}(${peer})???????????????????????????${number}
@@ -433,12 +516,18 @@
 Node.acceptSeedConnectionsShort=???????????????????
 
Node.alwaysAllowLocalAddresses=???????????????????????????????????????????????????????
 Node.alwaysAllowLocalAddressesLong=?????????, 
?????????????????????????????????, 
?????????????????????????????????????????????, 
???????????????????????????(?????????????????????)????????????. ????????????, 
?????????????????????????????????????????????(??????????????????????????????)??????????????????.
 ?????????????????????????????????????????????, 
?????????????????????????????????????????????????????? UDP 
?????????????????????????????????, ???????????????.
+Node.bandwidthLimitMustBePositiveOrMinusOne=????????????????????????????????? 
-1
 Node.buggyJVM=??????????????? JVM ??????(${version})???????????????. 
????????????????????????, ?????????????????? OutOfMemoryError ??????. 
?????????????????? Sun ???????????? Java 1.4.2_13 ???, 1.5.0_10 ???, ?????? 1.6 
???(????????????). ???????????? 
http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4855795 .
 Node.buggyJVMShort=Freenet ???????????? Java ?????? ${version} 
??????????????????. ???????????????, ????????????????????? Java 
???????????????????????????.
 Node.buggyJVMTitle=JVM ????????????
 Node.buggyJVMWithLink=??????????????? JVM 
??????(${version})?????????${link}??????${/link}. ????????????????????????, 
?????????????????? OutOfMemoryError ??????. ?????????????????? Sun ???????????? 
Java 1.4.2_13 ???, 1.5.0_10 ???, ?????? 1.6 ???(????????????).
+Node.bwlimitMustBePositive=???????????????????????????
 Node.databaseMemory=????????????????????????????????????
 
Node.databaseMemoryLong=????????????????????????????????????????????????????????????.
 0 ??????????????????(??????????????? 30% ??????????????????)
+Node.deadlockTitle=???????????????????????? JVM 
?????????????????????????????????
+Node.deadlockWarning=??????: ???????????????????????? NPTL ??????????????? Sun 
JVM. ???????????????????????? JVM ???????????????????????????????????????. 
??????????????????????????????????????? LD_ASSUME_KERNEL ??? 2.4.1 ????????? 
NPTL. ??????????????? Freenet ????????????????????????????????????; 
?????????????????????, ?????????????????? run.sh 
(https://emu.freenetproject.org/svn/trunk/apps/installer/installclasspath/run.sh)
 ???????????????. ???????????????????????????????????? pthreads 
?????????????????? JVM ??????. ???????????????, ??????????????????????????????, 
??????????????????????????????, ??????????????????????????? 100% ??????, 
????????????????????????????????????.
+Node.disableHangCheckers=???????????????????????????
+Node.disableHangCheckersLong=??????????????????????????????????????????. 
??????????????? Fred ?????????????????????????????????????????????.
 Node.disablePHTLSLong=Disable probabilistic HTL (?????????????????????, 
?????????????????????????????????)
 Node.dropPacketEvery=????????????????????????
 Node.dropPacketEveryLong=?????????????????????. 
?????????????????????????????????, ????????????????????????. 0 
??????????????????????????????. ?????????????????????!
@@ -452,12 +541,14 @@
 Node.enableSwappingLong=????????????????????????? (??????????????????! 
????????????????????????????????????).
 Node.enableULPRDataPropagation=?????? ULRP ????????????????
 Node.enableULPRDataPropagationLong=????????????????????????????????????, 
??????????????????????????????????????????????????????? 
(????????????????????????????????????; ULPR)
+Node.errorApplyingConfig=????????????????????????????????? : ${error}
 Node.extraPeerDir=????????????????????????
 Node.extraPeerDirLong=??????????????????????????????????????????
 Node.forceBigShrink=????????????????????????
 Node.forceBigShrinkLong=???????????????????????????(?????? 
10%)?????????????????????(????????????????????????????????????). 
??????????????????????????????????????????????????????, 
???????????????????????????; 
???????????????????????????????????????????????????.
 Node.inBWLimit=????????????????????????????????????
 Node.inBWLimitLong=?????????????????????????????????????????????; 
??????????????????????????????????????????; ?????? -1 
???????????????????????????
+Node.invalidStoreSize=??????????????????????????? 32MB
 Node.java14ShortText=???????????????????????? Java 1.4 ???, ???????????? 1.5 
???.
 Node.java14Text=???????????? Java 1.4 ????????? Freenet ??????. 
?????????????????? 1.5 ???. ??????????????????????????????????????????, 
?????????????????????????????????????????????????????? Java ????????????.
 Node.java14Title=???????????? Java 1.4 ???
@@ -467,6 +558,7 @@
 Node.maxHTLLong=HTL ?????????(?????????????????????!)
 Node.maxOpennetPeers=????????????????????????????????????
 
Node.maxOpennetPeersLong=????????????(Opennet)????????????????????????(?????????
 0 ??? 20 ??????, 
???????????????????????????????????????(darknet)???????????????)
+Node.maxOpennetPeersMustBeTwentyOrLess=????????????????????? 20
 Node.mustBePositive=????????????????????????
 Node.nodeDir=????????????
 Node.nodeDirLong=????????????????????????(?????????????????????)???????????????
@@ -486,16 +578,28 @@
 Node.outBWLimitLong=???????????????????????????(?????????????????????); 
????????????????????????????????????????????????
 
Node.passOpennetPeersThroughDarknet=???????????????????????????????????????????????????????
 Node.passOpennetPeersThroughDarknetLong=????????????, 
??????????????????(opennet)??????????????????(??????????????????????????????)??????????????????????????????(darknet)????????????.
 
???????????????(??????????????????????????????)??????????????????????????????????????????????????????.
 ??????????????????, ?????????????????????????????????, 
?????????????????????????????????, 
???????????????????????????????????????????????????. 
????????????????????????????????????????????????, 
???????????????????????????????????????.
+Node.port=FNP ?????????????????? (UDP)
+Node.publishOurPeersLocation=???????????????????????????????????????????
+Node.publishOurPeersLocationLong=??????????????????????????????????????????? 
??????????????????????????????, 
???????????????????????????????????????????????????.
+Node.routeAccordingToOurPeersLocation=???????????????????????????????????????????????????????????????????????????????
+Node.routeAccordingToOurPeersLocationLong=???????????????????????????????????????????????????????????????????????????????
 ??????????????????????????????, ?????????????????????????????????.
 Node.storeDirectory=????????????
 Node.storeDirectoryLong=?????????????????????????????????
+Node.storeMaxMemTooHigh=??????????????????????????? 80% ???????????? BDB 
?????????!
 Node.storeSize=???????????????????????????
 Node.storeSizeLong=???????????????????????????
 Node.storeType=????????????(????????????)
 Node.storeTypeLong=??????????????????. ??????????????? bdb-index ?????? ram 
(bdb-index ??? BerkeleyDBFreenetStore ???????????????, 
??????????????????????????????????????????; ram 
??????????????????????????????????????????). 
???????????????????????????????????????, 
???????????????????????????????????????????????????, ????????? ram 
(??????????????????????????????????????????)!
+Node.swapRInterval=?????????????????????????????????(??????)
+Node.swapRIntervalLong=???????????????????????????????????????, 
???????????????. ????????????!
 Node.throttleLocalTraffic=???????????????????
 Node.throttleLocalTrafficLong=?????????????????????????????????? 
???????????????, 
?????????????????????(LAN)??????????????????????????????????????????????????????.
+Node.tooSmallMTU=MTU ??????
+Node.tooSmallMTULong=???????????????????????????????????????(MTU)????????? 
${mtu} ?????????. Freenet ????????? MTU ?????? ${minMTU} 
?????????????????????????????????: Freenet ??????????????????, 
????????????????????????. ???????????????????????????????????????.
+Node.tooSmallMTUShort=????????????: ??????????????? MTU ??????, Freenet 
??????????????????. ?????????????????????.
 NodeClientCore.couldNotFindOrCreateDir=???????????????????????????
-NodeClientCore.downloadAllowedDirs=???????????????????????????
+NodeClientCore.downloadAllowedDirs=???????????????????????????
+NodeClientCore.downloadAllowedDirsLong=???????????????????????????????????????,
 ??????????????????. ???????????? downloads ???????????????????????????, 
?????????????????????????????????????????????????????????, ????????? all 
??????????????????????????????????????????. ??????! ??????????????? all ??????, 
???????????????????????????????????????????????????, 
??????????????????????????????????????????!
 NodeClientCore.downloadDir=??????????????????
 NodeClientCore.downloadDirLong=??????????????????????????????????????????
 NodeClientCore.fileForClientStats=????????????????????????????????????
@@ -513,7 +617,8 @@
 NodeClientCore.startingUpTitle=Freenet ???????????????
 NodeClientCore.tempDir=??????????????????
 NodeClientCore.tempDirLong=??????????????????????????????
-NodeClientCore.uploadAllowedDirs=???????????????????????????
+NodeClientCore.uploadAllowedDirs=???????????????????????????
+NodeClientCore.uploadAllowedDirsLong=???????????????????????????????????????, 
??????????????????. 
??????????????????????????????????????????????????????????????????, ????????? 
all 
????????????????????????????????????????????????(????????????????????????!). 
??????! ??????????????? all ??????, 
??????????????????????????????????????????????????????????????????????????????!
 NodeIPDectector.inclLocalAddress=?????????????????????????????????????????????
 
NodeIPDectector.inclLocalAddressLong=?????????????????????????????????????????????????????????(????????????????????????????????????????????????).
 ???????????????????????????????????????????????????????????? 
allowLocalAddresses=true 
(?????????????????????????????????????????????????????????), 
???????????????????????????.
 NodeIPDectector.ipOverride=????????????????????????
@@ -526,6 +631,12 @@
 NodeIPDetector.unknownHostErrorInIPOverride=???????????????: ${error}
 NodeStat.aggressiveGC=AggressiveGC ?????????
 NodeStat.aggressiveGCLong=????????????????????????????????? (GC) 
???????????????????????????. ????????????????????????????????????, 
??????????????????! ?????? -1 ??????: ????????? System.gc() ??? 
System.runFinalization() ?????????????????????
+NodeStat.freeHeapBytesThreshold=???????????????????????????????????????
+NodeStat.freeHeapBytesThresholdLong=?????????????????????????????????????????????(??????????????????)??????????????????,
 ??????????????????????????????????????????
+NodeStat.freeHeapPercentThreshold=?????????????????????????????????
+NodeStat.freeHeapPercentThresholdLong=??????????????????????????????????????????????????????????????????????????????,
 ??????????????????????????????????????????
+NodeStat.ignoreLocalVsRemoteBandwidthLiability=??????????????????????????????, 
??????????????????????????????????
+NodeStat.ignoreLocalVsRemoteBandwidthLiabilityLong=???????????????????????????????????????????????????????????????,
 
?????????????????????????????????????????????????????????????????????(?????????????????????????????????,
 ????????????????????????????????????????????????)
 NodeStat.memCheck=?????????????????????
 NodeStat.memCheckLong=??????????????????????????? 
(?????????????????????????????????, aggressiveGC 
????????????????????????????????????!)
 NodeStat.statsPersister=?????????????????????????????????
@@ -699,12 +810,32 @@
 QueueToadlet.enqueuedFailure=?????? ${number} ???????????????????????????:
 QueueToadlet.enqueuedSuccessfully=?????? ${number} 
?????????????????????????????????:
 QueueToadlet.errorAccessDenied=????????????: ????????????!
+QueueToadlet.errorAccessDeniedFile=?????????????????????????????????????????????
 "${file}".
+QueueToadlet.errorDToDisk=????????????????????????
+QueueToadlet.errorDToDiskConfig=??????????????????????????????????????????????????????????????????.
+QueueToadlet.errorDownloadNotCompleted=??????????????????
+QueueToadlet.errorDownloadNotFound=?????????????????????
+QueueToadlet.errorDownloadNotFoundExplanation=?????????????????????. 
????????????????????????????
+QueueToadlet.errorInvalidURI=??????????????? URI
+QueueToadlet.errorInvalidURIToD=?????? URI ??????????????????????????????.
+QueueToadlet.errorInvalidURIToU=???????????????????????? URI ????????????.
+QueueToadlet.errorNoFileOrCannotRead=?????????????????????????????????
+QueueToadlet.errorNoFileSelected=??????????????????
+QueueToadlet.errorNoFileSelectedU=??????????????????????????????.
+QueueToadlet.errorNoKey=??????????????????????????????
 QueueToadlet.errorNoKeyToD=??????????????????????????????.
 QueueToadlet.failedD=??????????????? (${size})
 QueueToadlet.failedDU=??????????????????????????? (${size})
+QueueToadlet.failedToRemove=?????? ${id} ??????: ${message}
+QueueToadlet.failedToRemoveId=????????????: ${id}
+QueueToadlet.failedToRemoveRequest=??????????????????
+QueueToadlet.failedToRestart=????????????: ${id}
+QueueToadlet.failedToRestartRequest=????????????????????????
 QueueToadlet.failedU=????????????????????? (${size})
+QueueToadlet.fcpIsMissing=?????? FCP ?????????
 QueueToadlet.fileName=??????
 QueueToadlet.files=??????
+QueueToadlet.follow=????????????
 QueueToadlet.globalQueueIsEmpty=???????????????????????????
 QueueToadlet.identifier=?????????
 QueueToadlet.insertAs=?????????:
@@ -717,6 +848,7 @@
 QueueToadlet.key=??????
 QueueToadlet.legend=??????
 QueueToadlet.mimeType=MIME ??????
+QueueToadlet.noTaskOnGlobalQueue=????????????????????????????????????.
 QueueToadlet.none=???
 QueueToadlet.notLoadedYet=??????????????????????????????????????????. 
???????????????.
 QueueToadlet.notLoadedYetTitle=??????????????????
@@ -727,6 +859,7 @@
 QueueToadlet.persistenceNone=???
 QueueToadlet.persistenceReboot=??????
 QueueToadlet.persistenceRebootr=??????
+QueueToadlet.pleaseEnableFCP=???????????? FCP ????????????????????????
 QueueToadlet.priority=?????????
 QueueToadlet.priority0=??????
 QueueToadlet.priority1=?????????
@@ -736,26 +869,32 @@
 QueueToadlet.priority5=?????????
 QueueToadlet.priority6=????????????
 QueueToadlet.progress=??????
+QueueToadlet.progressbarAccurate=???????????????
+QueueToadlet.progressbarNotAccurate=???????????????????????????????????????????????????????????????
 QueueToadlet.reason=??????
 QueueToadlet.remove=??????
 QueueToadlet.requestNavigation=????????????
 QueueToadlet.restart=??????
+QueueToadlet.siteUploadSucceededTitle=Freesite ????????????: ${filename}
 QueueToadlet.size=??????
 QueueToadlet.starting=?????????
 QueueToadlet.title=${nodeName}???????????????
 QueueToadlet.totalSize=????????????
 QueueToadlet.unknown=??????
+QueueToadlet.uploadProgressbarNotAccurate=????????????????????????????????????????????????????????????????????????
 QueueToadlet.uploadSucceeded=?????? ${filename} (?????? ${size}) 
????????????????????? Freenet ???. ???${link}?????????${/link} ????????????.
 QueueToadlet.uploadSucceededTitle=????????????: ${filename}
 QueueToadlet.warningUnsafeContent=?????????????????????
+QueueToadlet.warningUnsafeContentExplanation=???????????????????????????????????????
 Freenet ????????????????????????! 
???????????????????????????????????????????????????????????????!
 QueueToadlet.wipD=?????????: ?????? (${size})
 QueueToadlet.wipDU=?????????: ???????????? (${size})
 QueueToadlet.wipU=?????????: ?????? (${size})
-RequestStarterGroup.schedulerCHKInserts=????????????????????????(CHK ??????)
-RequestStarterGroup.schedulerCHKRequests=????????????????????????(CHK ??????)
+RequestStarterGroup.scheduler=????????????????????????????????????: hard 
(???????????????????????????) ?????? soft (????????????????????????????????????)
+RequestStarterGroup.schedulerCHKInserts=??????????????????(CHK ??????)
+RequestStarterGroup.schedulerCHKRequests=??????????????????(CHK ??????)
 RequestStarterGroup.schedulerLong=???????????????????????????????????????.
-RequestStarterGroup.schedulerSSKInserts=????????????????????????(SSK ??????)
-RequestStarterGroup.schedulerSSKRequests=????????????????????????(SSK ??????)
+RequestStarterGroup.schedulerSSKInserts=??????????????????(SSK ??????)
+RequestStarterGroup.schedulerSSKRequests=??????????????????(SSK ??????)
 
RevocationKeyFoundUserAlert.text=??????????????????????????????????????????????????????????????????.
 ????????????????????????????????????????????????????????????! ??????, 
???????????????????????????????????????, 
?????????"?????????"???????????????????????????. 
???????????????????????????????????????????????????????????????. 
?????????????????????????????????????????????. ???????????????: ${message}.
 RevocationKeyFoundUserAlert.title=????????????????????????????????????!
 SSL.enable=????????? SSL ??????????
@@ -771,6 +910,7 @@
 ShortOption.parseError=????????????????????????????????????????????????: 
${error}
 SimpleToadletServer.advancedMode=?????????????????????????
 
SimpleToadletServer.advancedModeLong=????????????????????????????????????????????????????????????.
 ?????????????????????????????????.
+SimpleToadletServer.cannotChangePortOnTheFly=???????????????????????? FProxy 
?????????????????????
 SimpleToadletServer.cssName=??????????????????
 SimpleToadletServer.cssNameLong=?????? Freenet ?????????????????????
 SimpleToadletServer.cssOverride=???????????? CSS ???????????????(??????!)
@@ -830,7 +970,7 @@
 StatisticsToadlet.outputRate=????????????: ?????? ${rate} (???????????? ${max})
 StatisticsToadlet.payloadOutput=????????????: ${total} (?????? ${rate}) 
(${percent}%)
 StatisticsToadlet.peerStatsTitle=????????????
-StatisticsToadlet.priority=?????????
+StatisticsToadlet.priority=?????????
 StatisticsToadlet.requestOutput=????????????(???????????????): CHK ${chk} SSK 
${ssk}.
 StatisticsToadlet.resendBytes=????????????: ${total}
 
StatisticsToadlet.routingDisabled=??????????????????(??????????????????????????????,
 ????????????????????????????????????)
@@ -851,6 +991,7 @@
 StatisticsToadlet.versionTitle=??????????????????
 StatisticsToadlet.waiting=?????????
 SymlinkerToadlet.symlinks=ToadletServer??????????????????
+SymlinkerToadlet.symlinksLong=????????? "??????#??????" ??????????????????, 
???????????????????????????
 
TestnetHandler.cannotEnableDisableOnTheFly=???????????????????????????????????????(testnet)??????;
 ????????????????????????????????????
 TestnetHandler.enable=????????????????????????(testnet)???????(??????!)
 TestnetHandler.enableLong=???????????????????????????(testnet)??????(??????!). 
?????????????????????????????????????????????????????????????????????, 
??????????????????????????????????????????.
@@ -1024,4 +1165,5 @@
 
WelcomeToadlet.writtenDatabaseStats=????????????????????????????????????????????????????????????????????????
 WrapperConfig.wrapper.java.maxmemory.long=Freenet ?????????????????????. 
?????????????????????????????????, Freenet ???????????????????????????; 
??????????????????????????????????????????, ????????????????????????. 
?????????????????????????????? Freenet ??????????????????.
 WrapperConfig.wrapper.java.maxmemory.short=???????????????(?????????MiB)
+???QueueToadlet.siteUploadSucceeded=?????? freesite ${filename} (${files} 
?????????, ??????????????? ${size}) ????????????????????? Freenet ???. 
${link}?????????${/link}????????????????????????.
 End

Modified: 
branches/saltedhashstore/freenet/src/freenet/l10n/freenet.l10n.zh-tw.properties
===================================================================
--- 
branches/saltedhashstore/freenet/src/freenet/l10n/freenet.l10n.zh-tw.properties 
    2008-07-25 14:15:06 UTC (rev 21394)
+++ 
branches/saltedhashstore/freenet/src/freenet/l10n/freenet.l10n.zh-tw.properties 
    2008-07-25 17:41:12 UTC (rev 21395)
@@ -63,7 +63,13 @@
 
BuildOldAgeUserAlert.tooOld=????????????????????????????????????????????????????????????????????????????????????????????????(Build
 #${lastgood}). ???????????????????????????, 
??????????????????????????????"??????"?????????????????????. 
(????????????????????????, Freenet 
?????????????????????????????????????????????)
 BuildOldAgeUserAlert.tooOldShort=??????????????? Freenet 
????????????????????????, ?????????????????????????????????????????????! 
???????????????!
 BuildOldAgeUserAlert.tooOldTitle=????????????
+CSSTokenizerFilter.deletedDisallowedString=????????????????????????
+CSSTokenizerFilter.deletedUnmatchedChar=????????????????????????:
+CSSTokenizerFilter.deletedUnofficialIdent=????????????????????????
+CSSTokenizerFilter.deletedUnofficialIdentWithURL=???????????????????????? url 
?????????
+CSSTokenizerFilter.invalidURLContents=url() ?????????????????????
 CSSTokenizerFilter.supplementalCharsNotSupported=????????????????????? 0xFFFF 
??? UCS-4 ??????!
+CSSTokenizerFilter.unknownAtIdentifierLabel=????????? @ ?????????:
 ClockProblemDetectedUserAlert.shortText=??????????????????????????????, 
Freenet ??????????????????.
 ClockProblemDetectedUserAlert.text=Freenet 
???????????????????????????(???????????????)????????????. 
??????????????????????????????????????????, Freenet ??????????????????.
 ClockProblemDetectedUserAlert.title=??????????????????.
@@ -73,20 +79,34 @@
 ConfigToadlet.appliedTitle=?????????????????????
 ConfigToadlet.apply=??????
 ConfigToadlet.configNavTitle=????????????
+ConfigToadlet.console=????????????
 ConfigToadlet.contributeTranslation=????????????????????????
 ConfigToadlet.defaultIs=?????????: '${default}'.
 ConfigToadlet.false=???
+ConfigToadlet.fcp=????????????
+ConfigToadlet.fproxy=????????????
 ConfigToadlet.fullTitle=${name} ??? Freenet ????????????
+ConfigToadlet.logger=?????????
 ConfigToadlet.modeAdvanced=??????????????????
 ConfigToadlet.modeSimple=??????????????????
+ConfigToadlet.node=??????
+ConfigToadlet.pluginmanager=???????????????
+ConfigToadlet.pluginmanager2=???????????????2
 ConfigToadlet.possibilitiesTitle=??????
 ConfigToadlet.reset=??????
 ConfigToadlet.returnToNodeConfig=??????????????????
 ConfigToadlet.shortTitle=??????
+ConfigToadlet.ssl=SSL (????????????)
 ConfigToadlet.title=Freenet ????????????
+ConfigToadlet.toadletsymlinker=toadlet???????????????
 ConfigToadlet.true=???
 ConfigToadlet.wrapper=????????????
 ConfigToadlet.wrapperSettingsTitle=??????????????????
+ConfigToadlet.node.load=??????.??????
+ConfigToadlet.node.opennet=??????.????????????
+ConfigToadlet.node.scheduler=??????.?????????
+ConfigToadlet.node.testnet=??????.????????????
+ConfigToadlet.node.updater=??????.????????????
 
ConfigurablePersister.doesNotExistCannotCreate=???????????????????????????????????????.
 
ConfigurablePersister.existsCannotReadWrite=??????????????????????????????????????????
 ConnectionsToadlet.nodeStatus.BACKED OFF=?????????
@@ -122,13 +142,31 @@
 
ContentDataFilter.unknownCharset=???????????????????????????????????????????????????.
 ????????????????????????????????????????????????, 
????????????????????????????????????.
 ContentDataFilter.unknownCharsetTitle=???????????????!
 ContentDataFilter.warningUnknownCharsetTitle=??????: ?????????????????? 
(${charset})
+ContentFilter.applicationPdfReadAdvice=Adobe(R) PDF ?????? - ????????????!
+ContentFilter.applicationPdfWriteAdvice=Adobe(R) PDF ?????? - ????????????!
+ContentFilter.imageGifReadAdvice=GIF ?????? - ???????????????
+ContentFilter.imageGifWriteAdvice=GIF ?????? - ???????????????, 
????????????????????????????????????
+ContentFilter.imageIcoReadAdvice=????????? - ???????????????
+ContentFilter.imageIcoWriteAdvice=????????? - 
???????????????(?????????????????????????????????????????????????)
+ContentFilter.imageJpegReadAdvice=JPEG ?????? - ???????????????
+ContentFilter.imageJpegWriteAdvice=JPEG ?????? - ???????????????, 
?????????????????? EXIF ??????
+ContentFilter.imagePngReadAdvice=PNG ?????? - ???????????????
+ContentFilter.imagePngWriteAdvice=PNG ?????? - ???????????????, 
???????????????????????????????????????????????????
+ContentFilter.textCssReadAdvice=CSS (cascading style sheet, ???????????????, 
??????????????? HTML) - ????????????????????????????????????, 
??????????????????????????????, ???????????????
+ContentFilter.textCssWriteAdvice=CSS (cascading style sheet, ???????????????, 
??????????????? HTML) - ????????????????????????(metadata), ???????????????
+ContentFilter.textHtmlReadAdvice=HTML - ??????????????????????????????
+ContentFilter.textHtmlWriteAdvice=HTML - 
????????????????????????????????????????????????(metadata); 
?????????????????????
+ContentFilter.textPlainReadAdvice=????????? - 
?????????????????????????????????(????????? IE, Internet 
Explorer)??????????????????
+ContentFilter.textPlainWriteAdvice=????????? - 
????????????????????????????????????, ???????????????
 DarknetConnectionsToadlet.activityInserts=??????: 
??????${totalSenders}????????????, ${CHKhandlers}???CHK?????????, 
${SSKhandlers}???SSK?????????
 DarknetConnectionsToadlet.activityRequests=??????: 
??????${totalSenders}????????????, ${CHKhandlers}???CHK?????????, 
${SSKhandlers}???SSK?????????
 DarknetConnectionsToadlet.activityTitle=????????????
 DarknetConnectionsToadlet.add=??????
 DarknetConnectionsToadlet.addPeerTitle=??????????????????
+DarknetConnectionsToadlet.alreadyInReferences=???????????????????????????.
 DarknetConnectionsToadlet.backedOff=?????????????????????: 
????????????????????????????????????, ?????????????????????????????????.
 DarknetConnectionsToadlet.backedOffShort=?????????
+DarknetConnectionsToadlet.bursting=?????????????????????: 
????????????????????????, ????????????????????????????????????, 
?????????????????????????????????????????????.
 DarknetConnectionsToadlet.burstingShort=?????????
 DarknetConnectionsToadlet.busy=??????: ????????????????????????, 
??????????????????????????????????????????????????????, 
???????????????????????????????????????.
 DarknetConnectionsToadlet.busyShort=??????
@@ -136,18 +174,25 @@
 DarknetConnectionsToadlet.cantFetchNoderefURL=????????? ${url} 
??????????????????.???????????????.
 
DarknetConnectionsToadlet.cantParseTryAgain=????????????????????????????????????:(${error}).???????????????.
 
DarknetConnectionsToadlet.cantParseWrongEnding=???????????????????????????:?????????????????????????????????End??????,?????????????????????????????????:${end}
+DarknetConnectionsToadlet.clockProblem=??????????????????????????????????????? 
24 ??????. ??????????????????????????????, 
????????????????????????????????????????????????????????????.
 DarknetConnectionsToadlet.clockProblemShort=????????????
+DarknetConnectionsToadlet.confirmRemoveNode=???????????????????????? "${name}" 
???? ?????????????????????????????????, ???????????????????????????, 
??????????????????????????????????????????????????????, 
???????????????????????????.
 DarknetConnectionsToadlet.confirmRemoveNodeTitle=?????????
 DarknetConnectionsToadlet.confirmRemoveNodeWarningTitle=????????????
+DarknetConnectionsToadlet.connError=????????????(????????????????)
+DarknetConnectionsToadlet.connErrorShort=????????????
 DarknetConnectionsToadlet.connected=?????????:??????????????????????????????
 DarknetConnectionsToadlet.connectedShort=?????????
 DarknetConnectionsToadlet.darknetFnpPort=????????????(Darknet) FNP: 
${port}/UDP (???????????????????????????, ?????????"??????", ????????????; 
?????????????????????????????????????????????)
 DarknetConnectionsToadlet.disabled=?????????????????????: 
?????????????????????????????????????????????????????????.
 DarknetConnectionsToadlet.disabledShort=?????????
+DarknetConnectionsToadlet.disconnecting=????????? (?????????????????????, 
?????????????????????????????????, ????????????????????????)
 DarknetConnectionsToadlet.disconnectingShort=?????????
 DarknetConnectionsToadlet.enterDescription=???????????????:
+DarknetConnectionsToadlet.failedToAddNodeInternalError=??????????????????????????????????????????.
 ????????????????????????????????????:
 
DarknetConnectionsToadlet.failedToAddNodeInternalErrorTitle=??????????????????:????????????
 DarknetConnectionsToadlet.failedToAddNodeTitle=??????????????????
+DarknetConnectionsToadlet.fcpDisabled=FCP ???????????? (??? Freenet 
???????????????, ?????? Frost ??? Thaw ??????)
 DarknetConnectionsToadlet.fcpPort=FCP: ${port}/TCP (??? Frost, Thaw ??? 
Freenet ?????????????????????)
 
DarknetConnectionsToadlet.fileReference=?????????????????????????????????????????????:
 DarknetConnectionsToadlet.fnpPort=FNP: ${port}/udp 
(?????????????????????;??????????????????????????????????????????)
@@ -159,8 +204,11 @@
 
DarknetConnectionsToadlet.idleTime=??????????????????????????????????????????????????????
 DarknetConnectionsToadlet.idleTimeTitle=?????????????????????
 
DarknetConnectionsToadlet.invalidSignature=??????????????????????????????????????????(${error}).
+DarknetConnectionsToadlet.ipAddress=??????????????????, ??? <??????>:<??????> 
??????
 DarknetConnectionsToadlet.ipAddressTitle=??????
-DarknetConnectionsToadlet.listenOnlyShort=?????????
+DarknetConnectionsToadlet.listenOnly=?????????????????????: 
???????????????????????????????????????, 
?????????????????????????????????????????????.
+DarknetConnectionsToadlet.listenOnlyShort=????????????
+DarknetConnectionsToadlet.listening=?????????????????????: 
???????????????????????????????????????, 
?????????????????????????????????????????????.
 DarknetConnectionsToadlet.listeningShort=?????????
 DarknetConnectionsToadlet.myFriends=????????????
 
DarknetConnectionsToadlet.myReferenceHeader=${linkref}??????????????????${/linkref}
 (${linktext}????????????${/linktext})
@@ -170,6 +218,7 @@
 DarknetConnectionsToadlet.neverConnectedShort=????????????
 
DarknetConnectionsToadlet.noPeersFirstHalf=Freenet???????????????????????????????????????,?????????????????????.??????
 
DarknetConnectionsToadlet.noPeersSecondHalf=??????,?????????????????????????????????????????????.
+DarknetConnectionsToadlet.noPeersWithHomepageLink=Freenet 
?????????????????????????????????????????????????????????. 
??????${link}????????????${/link}??????????????????????????????, 
???????????????????????????.
 
DarknetConnectionsToadlet.noRefOrURL=?????????????????????????????????????????????URL.
 ???????????????.
 DarknetConnectionsToadlet.nodePortsTitle=?????????????????????
 DarknetConnectionsToadlet.notConnected=?????????: ???????????????, 
??????????????????????????????????????????
@@ -181,13 +230,22 @@
 
DarknetConnectionsToadlet.referenceCopyWarning=?????????????????????${bold}????????????${/bold}??????.??????????????????${bold}????????????${/bold}.
 DarknetConnectionsToadlet.remove=?????????!
 DarknetConnectionsToadlet.removePeers=?????????????????????
+DarknetConnectionsToadlet.routingDisabled=?????????????????? 
(???????????????????????????????????????, 
??????????????????????????????????????????)
+DarknetConnectionsToadlet.routingDisabledShort=??????????????????
+DarknetConnectionsToadlet.seedClients=?????????????????????????????????????????????.
+DarknetConnectionsToadlet.seedClientsShort=????????????
+DarknetConnectionsToadlet.seedServers=????????????????????????????????????.
 DarknetConnectionsToadlet.seedServersShort=??????
 DarknetConnectionsToadlet.selectAction=-- ???????????? --
 DarknetConnectionsToadlet.sendMessageTitle=???????????????????????????
 
DarknetConnectionsToadlet.sendMessageToPeers=?????????????????????????????????????????????
+DarknetConnectionsToadlet.separator=??? ??? ???
 DarknetConnectionsToadlet.statusTitle=??????
+DarknetConnectionsToadlet.tmciDisabled=TMCI ???????????? (?????? telnet 
????????????????????????)
 DarknetConnectionsToadlet.tmciPort=TMCI: ${port}/TCP (?????? telnet 
????????????????????????)
+DarknetConnectionsToadlet.tooNew=?????????????????????: 
????????????????????????????????????????????????????????????.
 DarknetConnectionsToadlet.tooNewShort=??????
+DarknetConnectionsToadlet.tooOld=?????????????????????: 
????????????????????????????????????????????????????????????. 
???????????????????????????????????????.
 DarknetConnectionsToadlet.tooOldShort=??????
 DarknetConnectionsToadlet.transferringRequests=????????????: 
${senders}????????????, ${receivers}????????????
 
DarknetConnectionsToadlet.triedToAddSelf=????????????????????????????????????????????????.
@@ -263,8 +321,12 @@
 
FcpServer.assumeDownloadDDAIsAllowedLong=?????????????????????????????????????????????(DDA)?
 ?????????, ?????????????????? DDA ????????????????????? TestDDARequest ??????.
 FcpServer.assumeUploadDDAIsAllowed=????????????????????? DDA?
 
FcpServer.assumeUploadDDAIsAllowedLong=?????????????????????????????????????????????(DDA)?
 ?????????, ?????????????????? DDA ????????????????????? TestDDARequest ??????.
+FcpServer.cannotStartOrStopOnTheFly=????????????????????????????????? FCP 
?????????
 
FcpServer.downloadsFileCanCreateCannotReadOrWrite=?????????????????????????????????
+FcpServer.downloadsFileDoesNotExistCannotCreate=?????????????????????????????????
 
FcpServer.downloadsFileExistsCannotReadOrWrite=?????????????????????????????????
+FcpServer.downloadsFileParentDoesNotExist=?????????????????????
+FcpServer.downloadsFileUnreadable=?????????????????????????????????
 FcpServer.enablePersistentDownload=??????????????????????
 FcpServer.enablePersistentDownloadLong=??????????????? FCP ???????????? 
Persistence=forever. 
??????????????????????????????????????????????????????????????????; 
?????????????????????????????????, 
?????????????????????????????????????????????.
 FcpServer.filenameToStorePData=??????????????????????????????
@@ -276,11 +338,22 @@
 FcpServer.portNumber=FCP???
 FcpServer.ssl=?????? SSL?
 FcpServer.sslLong=????????? FCP ?????????????????? SSL
+FileOffer.acceptTransferButton=????????????
+FileOffer.askUserTitle=??????????????????
 FileOffer.commentLabel=??????:
+FileOffer.failedReceiveHeader=??? ${node} ???????????? ${filename} ??????.
+FileOffer.failedReceiveShort=??? ${node} ???????????? ${filename} ??????.
+FileOffer.failedReceiveTitle=??????????????????
 FileOffer.fileLabel=??????:
 FileOffer.mimeLabel=MIME ??????:
+FileOffer.offeredFileHeader=?????? ${name} ???????????????:
+FileOffer.offeredFileShort=???????????? ${node} ??????????????? ${filename}.
+FileOffer.rejectTransferButton=????????????
 FileOffer.senderLabel=?????????:
 FileOffer.sizeLabel=??????:
+FileOffer.succeededReceiveHeader=??? ${node} ???????????? ${filename} ??????.
+FileOffer.succeededReceiveShort=??? ${node} ?????? ${filename} ?????????.
+FileOffer.succeededReceiveTitle=??????????????????
 FirstTimeWizardToadlet.bandwidthLimit=????????????
 
FirstTimeWizardToadlet.bandwidthLimitLong=?????????????????????????????????????????????????????????????????????
 FirstTimeWizardToadlet.bwlimitHigherSpeed=?????????
@@ -343,7 +416,7 @@
 HTMLFilter.couldNotParseStyle=?????????????????????????????????
 HTMLFilter.deletedUnknownStyle=?????????????????????
 HTMLFilter.failedToParseLabel=HTML ?????????????????????????????????
-HTMLFilter.tooManyNestedStyleOrScriptTags=???????????????????????????????????????
 - ???????????????????????????????????????
+HTMLFilter.tooManyNestedStyleOrScriptTags=???????????????????????????????????????
 - ???????????????????????????????????????
 HTMLFilter.tooManyNestedStyleOrScriptTagsLong=?????? </style> ??????????????? 
- ???????????????????????????????????????, ???????????????????????????, 
???????????????????????????????????? - 
????????????????????????????????????????????????
 HTMLFilter.unknownTag=??????????????? ${tag}
 IPDetectorPluginManager.connectionProblems=????????????:
@@ -370,6 +443,16 @@
 JPEGFilter.notJpeg=??????????????????????????????????????? JPEG 
????????????????????????????????????????????????????????????????????????????????????????????????????????????
 JPEGFilter.tooShort=?????????????????????????????????JPEG?????????
 JPEGFilter.tooShortTitle=????????????
+KnownUnsafeContentTypeException.dangerousInlines=??????????????????????????????????????????????????????,
 ??????????????????????????????????????????????????????, 
???????????????????????????.
+KnownUnsafeContentTypeException.dangerousInlinesLabel=?????????????????????:
+KnownUnsafeContentTypeException.dangerousLinks=???????????????????????????????????????????????????????????????;
 ?????????????????????(???????????????), 
???????????????????????????????????????.
+KnownUnsafeContentTypeException.dangerousLinksLabel=???????????????:
+KnownUnsafeContentTypeException.dangerousMetadata=??????????????????????????????????????????(metadata),
 ?????????????????????????????????????????????????????????, 
??????????????????????????????????????????????????????.
+KnownUnsafeContentTypeException.dangerousMetadataLabel=?????????????????????:
+KnownUnsafeContentTypeException.dangerousScripts=???????????????????????????????????????????????????,
 ?????????????????????????????????????????????????????????????????????, 
??????????????????????????????, .
+KnownUnsafeContentTypeException.dangerousScriptsLabel=?????????????????????:
+KnownUnsafeContentTypeException.knownUnsafe=?????? MIME 
????????????????????????. ???????????????????????????, 
????????????????????????????????????, ????????????????????????, 
??????????????????????????????????????????????????????????????????????????????. 
?????????:
+KnownUnsafeContentTypeException.noFilter=????????????????????????????????????????????????,
 ????????????????????????????????????!
 KnownUnsafeContentTypeException.title=?????????????????????: ${type}
 LocalFileInsertToadlet.checkPathExist=?????????????????????????????????.
 
LocalFileInsertToadlet.checkPathIsDir=??????????????????????????????????????????.
@@ -381,8 +464,8 @@
 LocalFileInsertToadlet.listing=????????????: ${path}
 LocalFileInsertToadlet.listingTitle=${path} ?????????
 LocalFileInsertToadlet.sizeHeader=??????
-LogConfigHandler.detaildPriorityThreshold=?????????????????????????????????
-LogConfigHandler.detaildPriorityThresholdLong=?????????????????????????????????,
 ????????? freenet:normal, freenet.node:minor
+LogConfigHandler.detaildPriorityThreshold=?????????????????????????????????
+LogConfigHandler.detaildPriorityThresholdLong=?????????????????????????????????,
 ????????? freenet:normal, freenet.node:minor
 LogConfigHandler.dirName=????????????
 LogConfigHandler.dirNameLong=??????????????????????????????
 LogConfigHandler.enabled=???????????????????
@@ -420,11 +503,11 @@
 N2NTMToadlet.sendMessageShort=????????????
 N2NTMToadlet.sendStatus=??????????????????
 N2NTMToadlet.sent=????????????????????????
-N2NTMToadlet.sentTitle=??????
+N2NTMToadlet.sentTitle=?????????
 N2NTMToadlet.tooLong=?????????????????????????????? 1024 ???????????????
-N2NTMToadlet.tooLongTitle=??????
+N2NTMToadlet.tooLongTitle=????????????
 N2NTMUserAlert.delete=??????
-N2NTMUserAlert.header=??????: ${from} (????????? ${composed} | ????????? 
${sent} | ????????? ${received})
+N2NTMUserAlert.header=??????: ${from} (${composed} ?????? | ${sent} ?????? | 
${received}) ??????
 N2NTMUserAlert.headerShort=?????? ${from} ?????????
 N2NTMUserAlert.reply=??????
 
N2NTMUserAlert.title=???${peername}(${peer})???????????????????????????${number}
@@ -432,12 +515,18 @@
 Node.acceptSeedConnectionsShort=???????????????????
 
Node.alwaysAllowLocalAddresses=???????????????????????????????????????????????????????
 Node.alwaysAllowLocalAddressesLong=?????????, 
?????????????????????????????????, 
?????????????????????????????????????????????, 
???????????????????????????(?????????????????????)????????????. ????????????, 
?????????????????????????????????????????????(??????????????????????????????)??????????????????.
 ?????????????????????????????????????????????, 
?????????????????????????????????????????????????????? UDP 
?????????????????????????????????, ???????????????.
+Node.bandwidthLimitMustBePositiveOrMinusOne=????????????????????????????????? 
-1
 Node.buggyJVM=??????????????? JVM ??????(${version})???????????????. 
???????????????????????????, ?????????????????? OutOfMemoryError ??????. 
?????????????????? Sun ???????????? Java 1.4.2_13 ???, 1.5.0_10 ???, ?????? 1.6 
???(????????????). ???????????? 
http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4855795 .
 Node.buggyJVMShort=Freenet ???????????? Java ?????? ${version} 
??????????????????. ???????????????, ????????????????????? Java 
???????????????????????????.
 Node.buggyJVMTitle=JVM ????????????
 Node.buggyJVMWithLink=??????????????? JVM 
??????(${version})?????????${link}??????${/link}. ???????????????????????????, 
?????????????????? OutOfMemoryError ??????. ?????????????????? Sun ???????????? 
Java 1.4.2_13 ???, 1.5.0_10 ???, ?????? 1.6 ???(????????????).
+Node.bwlimitMustBePositive=???????????????????????????
 Node.databaseMemory=???????????????????????????????????????
 
Node.databaseMemoryLong=???????????????????????????????????????????????????????????????.
 0 ??????????????????(??????????????? 30% ?????????????????????)
+Node.deadlockTitle=???????????????????????? JVM 
?????????????????????????????????
+Node.deadlockWarning=??????: ???????????????????????? NPTL ??????????????? Sun 
JVM. ???????????????????????? JVM ???????????????????????????????????????. 
??????????????????????????????????????? LD_ASSUME_KERNEL ??? 2.4.1 ????????? 
NPTL. ??????????????? Freenet ????????????????????????????????????; 
?????????????????????, ?????????????????? run.sh 
(https://emu.freenetproject.org/svn/trunk/apps/installer/installclasspath/run.sh)
 ???????????????. ???????????????????????????????????? pthreads 
?????????????????? JVM ??????. ???????????????, ??????????????????????????????, 
??????????????????????????????, ??????????????????????????? 100% ??????, 
????????????????????????????????????.
+Node.disableHangCheckers=???????????????????????????
+Node.disableHangCheckersLong=??????????????????????????????????????????. 
??????????????? Fred ?????????????????????????????????????????????.
 Node.disablePHTLSLong=Disable probabilistic HTL (?????????????????????, 
?????????????????????????????????)
 Node.dropPacketEvery=????????????????????????
 Node.dropPacketEveryLong=?????????????????????. 
?????????????????????????????????, ????????????????????????. 0 
??????????????????????????????. ?????????????????????!
@@ -451,12 +540,14 @@
 Node.enableSwappingLong=????????????????????????? (??????????????????! 
????????????????????????????????????).
 Node.enableULPRDataPropagation=?????? ULRP ????????????????
 Node.enableULPRDataPropagationLong=????????????????????????????????????, 
??????????????????????????????????????????????????????? 
(????????????????????????????????????; ULPR)
+Node.errorApplyingConfig=????????????????????????????????? : ${error}
 Node.extraPeerDir=????????????????????????
 Node.extraPeerDirLong=??????????????????????????????????????????
 Node.forceBigShrink=????????????????????????
 Node.forceBigShrinkLong=???????????????????????????(?????? 
10%)?????????????????????(????????????????????????????????????). 
??????????????????????????????????????????????????????, 
???????????????????????????; 
???????????????????????????????????????????????????.
 Node.inBWLimit=???????????????????????????????????????
 Node.inBWLimitLong=????????????????????????????????????????????????; 
??????????????????????????????????????????; ?????? -1 
???????????????????????????
+Node.invalidStoreSize=??????????????????????????? 32MB
 Node.java14ShortText=???????????????????????? Java 1.4 ???, ???????????? 1.5 
???.
 Node.java14Text=???????????? Java 1.4 ????????? Freenet ??????. 
?????????????????? 1.5 ???. ??????????????????????????????????????????, 
?????????????????????????????????????????????????????? Java ????????????.
 Node.java14Title=???????????? Java 1.4 ???
@@ -466,6 +557,7 @@
 Node.maxHTLLong=HTL ?????????(?????????????????????!)
 Node.maxOpennetPeers=????????????????????????????????????
 
Node.maxOpennetPeersLong=????????????(Opennet)????????????????????????(?????????
 0 ??? 20 ??????, 
???????????????????????????????????????(darknet)???????????????)
+Node.maxOpennetPeersMustBeTwentyOrLess=????????????????????? 20
 Node.mustBePositive=????????????????????????
 Node.nodeDir=????????????
 Node.nodeDirLong=????????????????????????(?????????????????????)???????????????
@@ -485,16 +577,28 @@
 Node.outBWLimitLong=???????????????????????????(????????????????????????); 
????????????????????????????????????????????????
 
Node.passOpennetPeersThroughDarknet=???????????????????????????????????????????????????????
 Node.passOpennetPeersThroughDarknetLong=????????????, 
??????????????????(opennet)??????????????????(??????????????????????????????)??????????????????????????????(darknet)????????????.
 
???????????????(??????????????????????????????)??????????????????????????????????????????????????????.
 ??????????????????, ?????????????????????????????????, 
?????????????????????????????????, 
???????????????????????????????????????????????????. 
????????????????????????????????????????????????, 
???????????????????????????????????????.
+Node.port=FNP ??????????????? (UDP)
+Node.publishOurPeersLocation=???????????????????????????????????????????
+Node.publishOurPeersLocationLong=??????????????????????????????????????????? 
??????????????????????????????, 
???????????????????????????????????????????????????.
+Node.routeAccordingToOurPeersLocation=???????????????????????????????????????????????????????????????????????????????
+Node.routeAccordingToOurPeersLocationLong=???????????????????????????????????????????????????????????????????????????????
 ??????????????????????????????, ?????????????????????????????????.
 Node.storeDirectory=????????????
 Node.storeDirectoryLong=?????????????????????????????????
+Node.storeMaxMemTooHigh=??????????????????????????? 80% ??????????????? BDB 
?????????!
 Node.storeSize=???????????????????????????
 Node.storeSizeLong=???????????????????????????
 Node.storeType=????????????(????????????)
 Node.storeTypeLong=??????????????????. ??????????????? bdb-index ?????? ram 
(bdb-index ??? BerkeleyDBFreenetStore ???????????????, 
??????????????????????????????????????????; ram 
?????????????????????????????????????????????). 
???????????????????????????????????????, 
??????????????????????????????????????????????????????, ????????? ram 
(??????????????????????????????????????????)!
+Node.swapRInterval=?????????????????????????????????(??????)
+Node.swapRIntervalLong=???????????????????????????????????????, 
???????????????. ????????????!
 Node.throttleLocalTraffic=???????????????????
 Node.throttleLocalTrafficLong=?????????????????????????????????? 
???????????????, 
?????????????????????(LAN)??????????????????????????????????????????????????????.
+Node.tooSmallMTU=MTU ??????
+Node.tooSmallMTULong=???????????????????????????????????????(MTU)????????? 
${mtu} ????????????. Freenet ????????? MTU ?????? ${minMTU} 
????????????????????????????????????: Freenet ??????????????????, 
????????????????????????. ???????????????????????????????????????.
+Node.tooSmallMTUShort=????????????: ??????????????? MTU ??????, Freenet 
??????????????????. ?????????????????????.
 NodeClientCore.couldNotFindOrCreateDir=???????????????????????????
-NodeClientCore.downloadAllowedDirs=???????????????????????????
+NodeClientCore.downloadAllowedDirs=???????????????????????????
+NodeClientCore.downloadAllowedDirsLong=???????????????????????????????????????,
 ??????????????????. ???????????? downloads ???????????????????????????, 
?????????????????????????????????????????????????????????, ????????? all 
??????????????????????????????????????????. ??????! ??????????????? all ??????, 
???????????????????????????????????????????????????, 
???????????????????????????????????????!
 NodeClientCore.downloadDir=??????????????????
 NodeClientCore.downloadDirLong=??????????????????????????????????????????
 NodeClientCore.fileForClientStats=????????????????????????????????????
@@ -512,7 +616,8 @@
 NodeClientCore.startingUpTitle=Freenet ???????????????
 NodeClientCore.tempDir=??????????????????
 NodeClientCore.tempDirLong=??????????????????????????????
-NodeClientCore.uploadAllowedDirs=???????????????????????????
+NodeClientCore.uploadAllowedDirs=???????????????????????????
+NodeClientCore.uploadAllowedDirsLong=???????????????????????????????????????, 
??????????????????. 
??????????????????????????????????????????????????????????????????, ????????? 
all ????????????????????????????????????????????????(?????????????????????!). 
??????! ??????????????? all ??????, 
???????????????????????????????????????????????????????????????????????????!
 NodeIPDectector.inclLocalAddress=?????????????????????????????????????????????
 
NodeIPDectector.inclLocalAddressLong=?????????????????????????????????????????????????????????(????????????????????????????????????????????????).
 ???????????????????????????????????????????????????????????? 
allowLocalAddresses=true 
(?????????????????????????????????????????????????????????), 
???????????????????????????.
 NodeIPDectector.ipOverride=???????????????????????????
@@ -525,6 +630,12 @@
 NodeIPDetector.unknownHostErrorInIPOverride=???????????????: ${error}
 NodeStat.aggressiveGC=AggressiveGC ?????????
 NodeStat.aggressiveGCLong=????????????????????????????????? (GC) 
???????????????????????????. ????????????????????????????????????, 
??????????????????! ?????? -1 ??????: ????????? System.gc() ??? 
System.runFinalization() ?????????????????????
+NodeStat.freeHeapBytesThreshold=??????????????????????????????????????????
+NodeStat.freeHeapBytesThresholdLong=?????????????????????????????????????????????(?????????????????????)??????????????????,
 ??????????????????????????????????????????
+NodeStat.freeHeapPercentThreshold=?????????????????????????????????
+NodeStat.freeHeapPercentThresholdLong=??????????????????????????????????????????????????????????????????????????????,
 ??????????????????????????????????????????
+NodeStat.ignoreLocalVsRemoteBandwidthLiability=??????????????????????????????, 
??????????????????????????????????
+NodeStat.ignoreLocalVsRemoteBandwidthLiabilityLong=???????????????????????????????????????????????????????????????,
 
?????????????????????????????????????????????????????????????????????(?????????????????????????????????,
 ????????????????????????????????????????????????)
 NodeStat.memCheck=?????????????????????
 NodeStat.memCheckLong=??????????????????????????? 
(??????????????????????????????, aggressiveGC 
????????????????????????????????????!)
 NodeStat.statsPersister=?????????????????????????????????
@@ -698,12 +809,32 @@
 QueueToadlet.enqueuedFailure=?????? ${number} ???????????????????????????:
 QueueToadlet.enqueuedSuccessfully=?????? ${number} 
?????????????????????????????????:
 QueueToadlet.errorAccessDenied=????????????: ????????????!
+QueueToadlet.errorAccessDeniedFile=?????????????????????????????????????????????
 "${file}".
+QueueToadlet.errorDToDisk=????????????????????????
+QueueToadlet.errorDToDiskConfig=??????????????????????????????????????????????????????????????????.
+QueueToadlet.errorDownloadNotCompleted=??????????????????
+QueueToadlet.errorDownloadNotFound=?????????????????????
+QueueToadlet.errorDownloadNotFoundExplanation=?????????????????????. 
????????????????????????????
+QueueToadlet.errorInvalidURI=??????????????? URI
+QueueToadlet.errorInvalidURIToD=?????? URI ??????????????????????????????.
+QueueToadlet.errorInvalidURIToU=???????????????????????? URI ????????????.
+QueueToadlet.errorNoFileOrCannotRead=?????????????????????????????????
+QueueToadlet.errorNoFileSelected=??????????????????
+QueueToadlet.errorNoFileSelectedU=??????????????????????????????.
+QueueToadlet.errorNoKey=??????????????????????????????
 QueueToadlet.errorNoKeyToD=??????????????????????????????.
 QueueToadlet.failedD=??????????????? (${size})
 QueueToadlet.failedDU=??????????????????????????? (${size})
+QueueToadlet.failedToRemove=?????? ${id} ??????: ${message}
+QueueToadlet.failedToRemoveId=????????????: ${id}
+QueueToadlet.failedToRemoveRequest=??????????????????
+QueueToadlet.failedToRestart=????????????: ${id}
+QueueToadlet.failedToRestartRequest=????????????????????????
 QueueToadlet.failedU=????????????????????? (${size})
+QueueToadlet.fcpIsMissing=?????? FCP ?????????
 QueueToadlet.fileName=??????
 QueueToadlet.files=??????
+QueueToadlet.follow=????????????
 QueueToadlet.globalQueueIsEmpty=???????????????????????????
 QueueToadlet.identifier=?????????
 QueueToadlet.insertAs=?????????:
@@ -716,6 +847,7 @@
 QueueToadlet.key=??????
 QueueToadlet.legend=??????
 QueueToadlet.mimeType=MIME ??????
+QueueToadlet.noTaskOnGlobalQueue=????????????????????????????????????.
 QueueToadlet.none=???
 QueueToadlet.notLoadedYet=??????????????????????????????????????????. 
???????????????.
 QueueToadlet.notLoadedYetTitle=??????????????????
@@ -726,6 +858,7 @@
 QueueToadlet.persistenceNone=???
 QueueToadlet.persistenceReboot=??????
 QueueToadlet.persistenceRebootr=??????
+QueueToadlet.pleaseEnableFCP=???????????? FCP ????????????????????????
 QueueToadlet.priority=?????????
 QueueToadlet.priority0=??????
 QueueToadlet.priority1=?????????
@@ -735,26 +868,33 @@
 QueueToadlet.priority5=?????????
 QueueToadlet.priority6=????????????
 QueueToadlet.progress=??????
+QueueToadlet.progressbarAccurate=???????????????
+QueueToadlet.progressbarNotAccurate=???????????????????????????????????????????????????????????????
 QueueToadlet.reason=??????
 QueueToadlet.remove=??????
 QueueToadlet.requestNavigation=????????????
 QueueToadlet.restart=??????
+QueueToadlet.siteUploadSucceeded=?????? freesite ${filename} (${files} 
?????????, ??????????????? ${size}) ????????????????????? Freenet ???. 
${link}?????????${/link}????????????????????????.
+QueueToadlet.siteUploadSucceededTitle=Freesite ????????????: ${filename}
 QueueToadlet.size=??????
 QueueToadlet.starting=?????????
 QueueToadlet.title=${nodeName}???????????????
 QueueToadlet.totalSize=????????????
 QueueToadlet.unknown=??????
+QueueToadlet.uploadProgressbarNotAccurate=????????????????????????????????????????????????????????????????????????
 QueueToadlet.uploadSucceeded=?????? ${filename} (?????? ${size}) 
????????????????????? Freenet ???. ???${link}?????????${/link} ????????????.
 QueueToadlet.uploadSucceededTitle=????????????: ${filename}
 QueueToadlet.warningUnsafeContent=?????????????????????
+QueueToadlet.warningUnsafeContentExplanation=???????????????????????????????????????
 Freenet ????????????????????????! 
???????????????????????????????????????????????????????????????!
 QueueToadlet.wipD=?????????: ?????? (${size})
 QueueToadlet.wipDU=?????????: ???????????? (${size})
 QueueToadlet.wipU=?????????: ?????? (${size})
-RequestStarterGroup.schedulerCHKInserts=????????????????????????(CHK ??????)
-RequestStarterGroup.schedulerCHKRequests=????????????????????????(CHK ??????)
+RequestStarterGroup.scheduler=????????????????????????????????????: hard 
(???????????????????????????) ?????? soft (????????????????????????????????????)
+RequestStarterGroup.schedulerCHKInserts=??????????????????(CHK ??????)
+RequestStarterGroup.schedulerCHKRequests=??????????????????(CHK ??????)
 RequestStarterGroup.schedulerLong=???????????????????????????????????????.
-RequestStarterGroup.schedulerSSKInserts=????????????????????????(SSK ??????)
-RequestStarterGroup.schedulerSSKRequests=????????????????????????(SSK ??????)
+RequestStarterGroup.schedulerSSKInserts=??????????????????(SSK ??????)
+RequestStarterGroup.schedulerSSKRequests=??????????????????(SSK ??????)
 
RevocationKeyFoundUserAlert.text=??????????????????????????????????????????????????????????????????.
 ????????????????????????????????????????????????????????????! ??????, 
???????????????????????????????????????, 
?????????"?????????"????????????????????????. 
???????????????????????????????????????????????????????????????. 
?????????????????????????????????????????????. ???????????????: ${message}.
 RevocationKeyFoundUserAlert.title=????????????????????????????????????!
 SSL.enable=????????? SSL ??????????
@@ -770,6 +910,7 @@
 ShortOption.parseError=?????????????????????????????????????????????: ${error}
 SimpleToadletServer.advancedMode=?????????????????????????
 
SimpleToadletServer.advancedModeLong=????????????????????????????????????????????????????????????.
 ?????????????????????????????????.
+SimpleToadletServer.cannotChangePortOnTheFly=???????????????????????? FProxy 
??????????????????
 SimpleToadletServer.cssName=??????????????????
 SimpleToadletServer.cssNameLong=?????? Freenet ???????????????????????????
 SimpleToadletServer.cssOverride=???????????? CSS ???????????????(??????!)
@@ -829,7 +970,7 @@
 StatisticsToadlet.outputRate=????????????: ?????? ${rate} (???????????? ${max})
 StatisticsToadlet.payloadOutput=????????????: ${total} (?????? ${rate}) 
(${percent}%)
 StatisticsToadlet.peerStatsTitle=????????????
-StatisticsToadlet.priority=?????????
+StatisticsToadlet.priority=?????????
 StatisticsToadlet.requestOutput=????????????(???????????????): CHK ${chk} SSK 
${ssk}.
 StatisticsToadlet.resendBytes=???????????????: ${total}
 
StatisticsToadlet.routingDisabled=??????????????????(??????????????????????????????,
 ????????????????????????????????????)
@@ -850,6 +991,7 @@
 StatisticsToadlet.versionTitle=??????????????????
 StatisticsToadlet.waiting=?????????
 SymlinkerToadlet.symlinks=ToadletServer??????????????????
+SymlinkerToadlet.symlinksLong=????????? "??????#??????" ??????????????????, 
???????????????????????????
 
TestnetHandler.cannotEnableDisableOnTheFly=???????????????????????????????????????(testnet)??????;
 ????????????????????????????????????
 TestnetHandler.enable=????????????????????????(testnet)???????(??????!)
 TestnetHandler.enableLong=???????????????????????????(testnet)??????(??????!). 
?????????????????????????????????????????????????????????????????????, 
??????????????????????????????????????????.

Modified: 
branches/saltedhashstore/freenet/src/freenet/node/FNPPacketMangler.java
===================================================================
--- branches/saltedhashstore/freenet/src/freenet/node/FNPPacketMangler.java     
2008-07-25 14:15:06 UTC (rev 21394)
+++ branches/saltedhashstore/freenet/src/freenet/node/FNPPacketMangler.java     
2008-07-25 17:41:12 UTC (rev 21395)
@@ -947,7 +947,7 @@
                // We don't except such a message;
                if(myNi == null) {
                        if(shouldLogErrorInHandshake(t1))
-                               Logger.normal(this, "We received an unexpected 
JFK(2) message from "+pn.getPeer());
+                               Logger.normal(this, "We received an unexpected 
JFK(2) message from "+pn.getPeer()+" (time since added: 
"+pn.timeSinceAddedOrRestarted()+" time last 
receive:"+pn.lastReceivedPacketTime()+')');
                        return;
                } else if(!Arrays.equals(myNi, nonceInitiator)){
                        if(logMINOR)
@@ -2811,20 +2811,24 @@
         * @return True if we reset the transient key and therefore the 
authenticator cache.
         */
        private boolean maybeResetTransientKey() {
+               long now = System.currentTimeMillis();
+               boolean isCacheTooBig = true;
                synchronized (authenticatorCache) {
-                       long now = System.currentTimeMillis();
                        if(authenticatorCache.size() < 
AUTHENTICATOR_CACHE_SIZE) {
+                               isCacheTooBig = false;
                                if(now - timeLastReset < 
TRANSIENT_KEY_REKEYING_MIN_INTERVAL)
                                        return false;
                        }
+                       timeLastReset = now;
+
                        node.random.nextBytes(transientKey);

                        // reset the authenticator cache
                        authenticatorCache.clear();
-                       
-                       timeLastReset = now;
                }
-               node.getTicker().queueTimedJob(transientKeyRekeyer, 
TRANSIENT_KEY_REKEYING_MIN_INTERVAL);
+               if(logMINOR)
+                       Logger.minor(this, "Reset the JFK transitent key 
because "+(isCacheTooBig ? ("the cache's capacity is exeeded 
("+authenticatorCache.size()+')') : "it's time to rekey") + this);
+               node.getTicker().queueTimedJob(transientKeyRekeyer, 
"JFKmaybeResetTransitentKey "+now, TRANSIENT_KEY_REKEYING_MIN_INTERVAL, false);
                Logger.normal(this, "JFK's TransientKey has been changed and 
the message cache flushed.");
                return true;
        }

Modified: branches/saltedhashstore/freenet/src/freenet/node/KeyTracker.java
===================================================================
--- branches/saltedhashstore/freenet/src/freenet/node/KeyTracker.java   
2008-07-25 14:15:06 UTC (rev 21394)
+++ branches/saltedhashstore/freenet/src/freenet/node/KeyTracker.java   
2008-07-25 17:41:12 UTC (rev 21395)
@@ -567,7 +567,7 @@
      * @throws UpdatableSortedLinkedListKilledException 
      */
     private void removeAckRequest(int seqNo) throws 
UpdatableSortedLinkedListKilledException {
-        QueuedAckRequest qr = 
(QueuedAckRequest)ackRequestQueue.removeByKey(new Integer(seqNo));
+        QueuedAckRequest qr = 
(QueuedAckRequest)ackRequestQueue.removeByKey(Integer.valueOf(seqNo));
        if(qr != null) qr.onAcked();
        else
                Logger.normal(this, "Removing ack request twice? Null on 
"+seqNo+" from "+pn.getPeer()+" ("+TimeUtil.formatTime((int) 
pn.averagePingTime(), 2, true)+" ping avg)");
@@ -584,7 +584,7 @@
                if(resendData.length > Node.PACKET_SIZE)
                        pn.getThrottle().notifyOfPacketLost();
             synchronized(packetsToResend) {
-                packetsToResend.add(new Integer(seqNumber));
+                packetsToResend.add(Integer.valueOf(seqNumber));
             }
             pn.node.ps.wakeUp();
         } else {

Modified: branches/saltedhashstore/freenet/src/freenet/node/LocationManager.java
===================================================================
--- branches/saltedhashstore/freenet/src/freenet/node/LocationManager.java      
2008-07-25 14:15:06 UTC (rev 21394)
+++ branches/saltedhashstore/freenet/src/freenet/node/LocationManager.java      
2008-07-25 17:41:12 UTC (rev 21395)
@@ -9,8 +9,6 @@
 import java.security.MessageDigest;
 import java.text.DateFormat;
 import java.util.Date;
-import java.util.Enumeration;
-import java.util.HashSet;
 import java.util.Hashtable;
 import java.util.Iterator;
 import java.util.LinkedList;
@@ -113,7 +111,7 @@
     public synchronized double getLocation() {
         return loc;
     }
-
+    
     /**
      * @param l
      */
@@ -202,7 +200,7 @@
                                 }
                                 if(myFlag) {
                                     setLocation(node.random.nextDouble());
-                                    announceLocChange(true, true);
+                                    announceLocChange(true, true, true);
                                     node.writeNodeFile();
                                 }
                             } finally {
@@ -384,7 +382,7 @@
                 setLocation(hisLoc);
                 if(logMINOR) Logger.minor(this, "Swapped: "+myLoc+" <-> 
"+hisLoc+" - "+uid);
                 swaps++;
-                announceLocChange(false, false);
+                announceLocChange(true, false, false);
                 node.writeNodeFile();
             } else {
                if(logMINOR) Logger.minor(this, "Didn't swap: "+myLoc+" <-> 
"+hisLoc+" - "+uid);
@@ -396,7 +394,7 @@
             // Randomise our location every 2*SWAP_RESET swap attempts, 
whichever way it went.
             if(node.random.nextInt(SWAP_RESET) == 0) {
                 setLocation(node.random.nextDouble());
-                announceLocChange(true, false);
+                announceLocChange(true, true, false);
                 node.writeNodeFile();
             }

@@ -578,7 +576,7 @@
                     setLocation(hisLoc);
                     if(logMINOR) Logger.minor(this, "Swapped: "+myLoc+" <-> 
"+hisLoc+" - "+uid);
                     swaps++;
-                    announceLocChange(false, false);
+                    announceLocChange(true, false, false);
                     node.writeNodeFile();
                 } else {
                        if(logMINOR) Logger.minor(this, "Didn't swap: "+myLoc+" 
<-> "+hisLoc+" - "+uid);
@@ -590,7 +588,7 @@
                 // Randomise our location every 2*SWAP_RESET swap attempts, 
whichever way it went.
                 if(node.random.nextInt(SWAP_RESET) == 0) {
                     setLocation(node.random.nextDouble());
-                    announceLocChange(true, false);
+                    announceLocChange(true, true, false);
                     node.writeNodeFile();
                 }

@@ -608,10 +606,15 @@
     /**
      * Tell all connected peers that our location has changed
      */
-    private void announceLocChange(boolean randomReset, boolean 
fromDupLocation) {
-        Message msg = DMT.createFNPLocChangeNotification(getLocation());
+    protected void announceLocChange() {
+           announceLocChange(false, false, false);
+    }
+    
+    private void announceLocChange(boolean log, boolean randomReset, boolean 
fromDupLocation) {
+        Message msg = DMT.createFNPLocChangeNotificationNew(getLocation(), 
node.peers.getPeerLocationDoubles(true));
         node.peers.localBroadcast(msg, false, true, this);
-        recordLocChange(randomReset, fromDupLocation);
+       if(log)
+               recordLocChange(randomReset, fromDupLocation);
     }

     private void recordLocChange(final boolean randomReset, final boolean 
fromDupLocation) {

Modified: branches/saltedhashstore/freenet/src/freenet/node/Node.java
===================================================================
--- branches/saltedhashstore/freenet/src/freenet/node/Node.java 2008-07-25 
14:15:06 UTC (rev 21394)
+++ branches/saltedhashstore/freenet/src/freenet/node/Node.java 2008-07-25 
17:41:12 UTC (rev 21395)
@@ -33,7 +33,6 @@

 import freenet.client.FetchContext;
 import freenet.clients.http.SimpleToadletServer;
-import freenet.clients.http.StartupToadlet;
 import freenet.config.EnumerableOptionCallback;
 import freenet.config.FreenetFilePersistentConfig;
 import freenet.config.InvalidConfigValueException;
@@ -107,7 +106,6 @@
 import freenet.support.LRUQueue;
 import freenet.support.Logger;
 import freenet.support.OOMHandler;
-import freenet.support.OOMHook;
 import freenet.support.PooledExecutor;
 import freenet.support.ShortBuffer;
 import freenet.support.SimpleFieldSet;
@@ -121,7 +119,7 @@
 import freenet.support.io.FileUtil;
 import freenet.support.io.NativeThread;
 import freenet.support.transport.ip.HostnameSyntaxException;
-import java.net.URI;
+import java.io.FileFilter;

 /**
  * @author amphibian
@@ -200,7 +198,7 @@
        private static class L10nCallback implements StringCallback, 
EnumerableOptionCallback {

                public String get() {
-                       return L10n.getSelectedLanguage();
+                       return 
L10n.mapLanguageNameToLongName(L10n.getSelectedLanguage());
                }

                public void set(String val) throws InvalidConfigValueException {
@@ -415,6 +413,8 @@
        final boolean enablePerNodeFailureTables;
        final boolean enableULPRDataPropagation;
        final boolean enableSwapping;
+       private volatile boolean publishOurPeersLocation;
+       private volatile boolean routeAccordingToOurPeersLocation;
        boolean enableSwapQueueing;
        boolean enablePacketCoalescing;
        public static final short DEFAULT_MAX_HTL = (short)10;
@@ -486,6 +486,8 @@
         */
        private static final int MIN_UPTIME_STORE_KEY = 40;

+       private volatile boolean isPRNGReady = false;
+       
        /**
         * Read all storable settings (identity etc) from the node file.
         * @param filename The name of the file to read from.
@@ -665,12 +667,42 @@
                }

                // Setup RNG if needed : DO NOT USE IT BEFORE THAT POINT!
-               this.random = (r == null ? new Yarrow() : r);
-               DiffieHellman.init(random);
+               if(r == null) {
+                       final NativeThread entropyGatheringThread = new 
NativeThread(new Runnable() {
+
+                               private void recurse(File f) {
+                                       if(isPRNGReady)
+                                               return;
+                                       File[] subDirs = f.listFiles(new 
FileFilter() {
+
+                                               public boolean accept(File 
pathname) {
+                                                       return 
pathname.exists() && pathname.canRead() && pathname.isDirectory();
+                                               }
+                                       });
+
+                                       for(File currentDir : subDirs)
+                                               recurse(currentDir);
+                               }
+
+                               public void run() {
+                                       for(File root : File.listRoots()) {
+                                               if(isPRNGReady)
+                                                       return;
+                                               recurse(root);
+                                       }
+                               }
+                       }, "Entropy Gathering Thread", 
NativeThread.MIN_PRIORITY, true);
+
+                       entropyGatheringThread.start();
+                       this.random = new Yarrow();
+                       DiffieHellman.init(random);
+               } else // if it's not null it's because we are running in the 
simulator
+                       this.random = r;
+               isPRNGReady = true;
+               toadlets.getStartupToadlet().setIsPRNGReady();
                byte buffer[] = new byte[16];
                random.nextBytes(buffer);
                this.fastWeakRandom = new MersenneTwister(buffer);
-               toadlets.getStartupToadlet().setIsPRNGReady();

                nodeNameUserAlert = new MeaningfulNodeNameUserAlert(this);
                recentlyCompletedIDs = new LRUQueue();
@@ -861,6 +893,30 @@
                });
                enableSwapping = nodeConfig.getBoolean("enableSwapping");

+               nodeConfig.register("publishOurPeersLocation", false, 
sortOrder++, true, false, "Node.publishOurPeersLocation", 
"Node.publishOurPeersLocationLong", new BooleanCallback() {
+
+                       public boolean get() {
+                               return publishOurPeersLocation;
+                       }
+
+                       public void set(boolean val) throws 
InvalidConfigValueException {
+                               publishOurPeersLocation = val;
+                       }
+               });
+               publishOurPeersLocation = 
nodeConfig.getBoolean("publishOurPeersLocation");
+               
+               nodeConfig.register("routeAccordingToOurPeersLocation", false, 
sortOrder++, true, false, "Node.routeAccordingToOurPeersLocation", 
"Node.routeAccordingToOurPeersLocationLong", new BooleanCallback() {
+
+                       public boolean get() {
+                               return routeAccordingToOurPeersLocation;
+                       }
+
+                       public void set(boolean val) throws 
InvalidConfigValueException {
+                               routeAccordingToOurPeersLocation = val;
+                       }
+               });
+               routeAccordingToOurPeersLocation = 
nodeConfig.getBoolean("routeAccordingToOurPeersLocation");
+               
                nodeConfig.register("enableSwapQueueing", true, sortOrder++, 
true, false, "Node.enableSwapQueueing", "Node.enableSwapQueueingLong", new 
BooleanCallback() {
                        public boolean get() {
                                return enableSwapQueueing;
@@ -1610,25 +1666,9 @@
                        this.storeEnvironment = null;
                }

-               // FIXME back compatibility
-               SimpleFieldSet oldThrottleFS = null;
-               File oldThrottle = new File("throttle.dat");
-               String oldThrottleName = 
nodeConfig.getRawOption("throttleFile");
-               if(oldThrottleName != null)
-                       oldThrottle = new File(oldThrottleName);
-               if(oldThrottle.exists() && (!new 
File("node-throttle.dat").exists()) && lastVersion < 1021) {
-                       // Migrate from old throttle file to new node- and 
client- throttle files
-                       try {
-                               oldThrottleFS = SimpleFieldSet.readFrom(new 
File("throttle.dat"), false, true);
-                       } catch (IOException e) {
-                               // Ignore
-                       }
-                       oldThrottle.delete();
-               }
+               nodeStats = new NodeStats(this, sortOrder, new 
SubConfig("node.load", config), obwLimit, ibwLimit, nodeDir);

-               nodeStats = new NodeStats(this, sortOrder, new 
SubConfig("node.load", config), oldThrottleFS, obwLimit, ibwLimit, nodeDir);
-               
-               clientCore = new NodeClientCore(this, config, nodeConfig, 
nodeDir, getDarknetPortNumber(), sortOrder, oldThrottleFS == null ? null : 
oldThrottleFS.subset("RequestStarters"), oldConfig, fproxyConfig, toadlets);
+               clientCore = new NodeClientCore(this, config, nodeConfig, 
nodeDir, getDarknetPortNumber(), sortOrder, oldConfig, fproxyConfig, toadlets);

                netid = new NetworkIDManager(this);

@@ -3388,4 +3428,12 @@
        public void setDispatcherHook(NodeDispatcherCallback cb) {
                this.dispatcher.setHook(cb);
        }
+       
+       public boolean shallWePublishOurPeersLocation() {
+               return publishOurPeersLocation;
+       }
+       
+       public boolean shallWeRouteAccordingToOurPeersLocation() {
+               return routeAccordingToOurPeersLocation;
+       }
 }

Modified: branches/saltedhashstore/freenet/src/freenet/node/NodeClientCore.java
===================================================================
--- branches/saltedhashstore/freenet/src/freenet/node/NodeClientCore.java       
2008-07-25 14:15:06 UTC (rev 21394)
+++ branches/saltedhashstore/freenet/src/freenet/node/NodeClientCore.java       
2008-07-25 17:41:12 UTC (rev 21395)
@@ -117,7 +117,7 @@

        private UserAlert startingUpAlert;

-       NodeClientCore(Node node, Config config, SubConfig nodeConfig, File 
nodeDir, int portNumber, int sortOrder, SimpleFieldSet oldThrottleFS, 
SimpleFieldSet oldConfig, SubConfig fproxyConfig, SimpleToadletServer toadlets) 
throws NodeInitException {
+       NodeClientCore(Node node, Config config, SubConfig nodeConfig, File 
nodeDir, int portNumber, int sortOrder, SimpleFieldSet oldConfig, SubConfig 
fproxyConfig, SimpleToadletServer toadlets) throws NodeInitException {
                this.node = node;
                this.nodeStats = node.nodeStats;
                this.random = node.random;
@@ -140,10 +140,6 @@
                                "NodeClientCore.fileForClientStats", 
"NodeClientCore.fileForClientStatsLong", node.ps, nodeDir);

                SimpleFieldSet throttleFS = persister.read();
-               
-               if(throttleFS == null)
-                       throttleFS = oldThrottleFS;
-
                if(logMINOR) Logger.minor(this, "Read 
throttleFS:\n"+throttleFS);

                if(logMINOR) Logger.minor(this, "Serializing 
RequestStarterGroup from:\n"+throttleFS);

Modified: branches/saltedhashstore/freenet/src/freenet/node/NodeDispatcher.java
===================================================================
--- branches/saltedhashstore/freenet/src/freenet/node/NodeDispatcher.java       
2008-07-25 14:15:06 UTC (rev 21394)
+++ branches/saltedhashstore/freenet/src/freenet/node/NodeDispatcher.java       
2008-07-25 17:41:12 UTC (rev 21395)
@@ -155,7 +155,17 @@
                } else if(source.isRealConnection() && spec == 
DMT.FNPLocChangeNotification) {
                        double newLoc = m.getDouble(DMT.LOCATION);
                        source.updateLocation(newLoc);
+                       // TODO: remove dead code when 
FNPLocChangeNotificationNew is mandatory
+                       if(source.getVersionNumber() > 1153)
+                               Logger.error(this, "We received a 
FNPLocChangeNotification from a recent build: that should *not* happen! 
("+source.toString()+')');
                        return true;
+               } else if(source.isRealConnection() && spec == 
DMT.FNPLocChangeNotificationNew) {
+                       double newLoc = m.getDouble(DMT.LOCATION);
+                       ShortBuffer buffer = ((ShortBuffer) 
m.getObject(DMT.PEER_LOCATIONS));
+                       double[] locs = Fields.bytesToDoubles(buffer.getData());
+                       source.updateLocation(newLoc, locs);
+                       
+                       return true;
                }

                if(!source.isRoutable()) return false;

Modified: branches/saltedhashstore/freenet/src/freenet/node/NodeIPDetector.java
===================================================================
--- branches/saltedhashstore/freenet/src/freenet/node/NodeIPDetector.java       
2008-07-25 14:15:06 UTC (rev 21394)
+++ branches/saltedhashstore/freenet/src/freenet/node/NodeIPDetector.java       
2008-07-25 17:41:12 UTC (rev 21395)
@@ -232,7 +232,7 @@
                                while(it.hasNext()) {
                                        FreenetInetAddress cur = 
(FreenetInetAddress) (it.next());
                                        int curPop = ((Integer) 
(countsByPeer.get(cur))).intValue();
-                                       Logger.normal(this, "Detected peer: 
"+cur+" popularity "+curPop);
+                                       Logger.minor(this, "Detected peer: 
"+cur+" popularity "+curPop);
                                        if(curPop >= bestPopularity) {
                                                secondBestPopularity = 
bestPopularity;
                                                bestPopularity = curPop;
@@ -243,14 +243,14 @@
                                if(best != null) {
                                        if((bestPopularity > 1) || 
(detectedAddrs.length == 0)) {
                                                if(!addresses.contains(best)) {
-                                                       Logger.normal(this, 
"Adding best peer "+best+" ("+bestPopularity+ ')');
+                                                       Logger.minor(this, 
"Adding best peer "+best+" ("+bestPopularity+ ')');
                                                        addresses.add(best);
                                                        
if(best.isRealInternetAddress(false, false, false))
                                                                addedValidIP = 
true;
                                                }
                                                if((secondBest != null) && 
(secondBestPopularity > 1)) {
                                                        
if(!addresses.contains(secondBest)) {
-                                                               
Logger.normal(this, "Adding second best peer "+secondBest+" ("+secondBest+ ')');
+                                                               
Logger.minor(this, "Adding second best peer "+secondBest+" ("+secondBest+ ')');
                                                                
addresses.add(secondBest);
                                                                
if(secondBest.isRealInternetAddress(false, false, false))
                                                                        
addedValidIP = true;

Modified: branches/saltedhashstore/freenet/src/freenet/node/NodeStarter.java
===================================================================
--- branches/saltedhashstore/freenet/src/freenet/node/NodeStarter.java  
2008-07-25 14:15:06 UTC (rev 21394)
+++ branches/saltedhashstore/freenet/src/freenet/node/NodeStarter.java  
2008-07-25 17:41:12 UTC (rev 21395)
@@ -337,7 +337,7 @@
                long storeSize, boolean ramStore, boolean enableSwapping, 
boolean enableARKs,
                boolean enableULPRs, boolean enablePerNodeFailureTables,
                boolean enableSwapQueueing, boolean enablePacketCoalescing,
-               int outputBandwidthLimit) throws NodeInitException {
+               int outputBandwidthLimit, boolean enableFOAF) throws 
NodeInitException {

                File baseDir = new File(testName);
                File portDir = new File(baseDir, Integer.toString(port));
@@ -385,6 +385,8 @@
                configFS.put("node.enableULPRDataPropagation", enableULPRs);
                configFS.put("node.enablePerNodeFailureTables", 
enablePerNodeFailureTables);
                configFS.put("node.enablePacketCoalescing", 
enablePacketCoalescing);
+               configFS.put("node.publishOurPeersLocation", enableFOAF);
+               configFS.put("node.routeAccordingToOurPeersLocation", 
enableFOAF);

                PersistentConfig config = new PersistentConfig(configFS);


Modified: branches/saltedhashstore/freenet/src/freenet/node/NodeStats.java
===================================================================
--- branches/saltedhashstore/freenet/src/freenet/node/NodeStats.java    
2008-07-25 14:15:06 UTC (rev 21394)
+++ branches/saltedhashstore/freenet/src/freenet/node/NodeStats.java    
2008-07-25 17:41:12 UTC (rev 21395)
@@ -178,7 +178,7 @@
        /** PeerManagerUserAlert stats update interval (milliseconds) */
        private static final long peerManagerUserAlertStatsUpdateInterval = 
1000;  // 1 second

-       NodeStats(Node node, int sortOrder, SubConfig statsConfig, 
SimpleFieldSet oldThrottleFS, int obwLimit, int ibwLimit, File nodeDir) throws 
NodeInitException {
+       NodeStats(Node node, int sortOrder, SubConfig statsConfig, int 
obwLimit, int ibwLimit, File nodeDir) throws NodeInitException {
                logMINOR = Logger.shouldLog(Logger.MINOR, this);
                this.node = node;
                this.peers = node.peers;
@@ -269,10 +269,6 @@
                                "NodeStat.statsPersister", 
"NodeStat.statsPersisterLong", node.ps, nodeDir);

                SimpleFieldSet throttleFS = persister.read();
-               
-               if(throttleFS == null)
-                       throttleFS = oldThrottleFS;
-
                if(logMINOR) Logger.minor(this, "Read 
throttleFS:\n"+throttleFS);

                // Guesstimates. Hopefully well over the reality.

Modified: branches/saltedhashstore/freenet/src/freenet/node/PeerManager.java
===================================================================
--- branches/saltedhashstore/freenet/src/freenet/node/PeerManager.java  
2008-07-25 14:15:06 UTC (rev 21394)
+++ branches/saltedhashstore/freenet/src/freenet/node/PeerManager.java  
2008-07-25 17:41:12 UTC (rev 21395)
@@ -48,24 +48,17 @@
  * - Each peer's Location.
  */
 public class PeerManager {
-    
+
        private static boolean logMINOR;
-       
-    /** Our Node */
-    final Node node;
-    
-    /** All the peers we want to connect to */
-    PeerNode[] myPeers;
-    
-    /** All the peers we are actually connected to */
-    PeerNode[] connectedPeers;
-    
-    private String darkFilename;
-    private String openFilename;
-
-    private PeerManagerUserAlert ua;
-    
-       // Peers stuff
+       /** Our Node */
+       final Node node;
+       /** All the peers we want to connect to */
+       PeerNode[] myPeers;
+       /** All the peers we are actually connected to */
+       PeerNode[] connectedPeers;
+       private String darkFilename;
+       private String openFilename;
+       private PeerManagerUserAlert ua;        // Peers stuff
        /** age of oldest never connected peer (milliseconds) */
        private long oldestNeverConnectedPeerAge;
        /** Next time to update oldestNeverConnectedPeerAge */
@@ -100,141 +93,135 @@
        public static final int PEER_NODE_STATUS_CONN_ERROR = 12;
        public static final int PEER_NODE_STATUS_DISCONNECTING = 13;
        public static final int PEER_NODE_STATUS_ROUTING_DISABLED = 14;
-       
-    /**
-     * Create a PeerManager by reading a list of peers from
-     * a file.
-     * @param node
-     * @param filename
-     */
-    public PeerManager(Node node) {
-        Logger.normal(this, "Creating PeerManager");
-        logMINOR = Logger.shouldLog(Logger.MINOR, this);
+
+       /**
+        * Create a PeerManager by reading a list of peers from
+        * a file.
+        * @param node
+        * @param filename
+        */
+       public PeerManager(Node node) {
+               Logger.normal(this, "Creating PeerManager");
+               logMINOR = Logger.shouldLog(Logger.MINOR, this);
                peerNodeStatuses = new HashMap();
                peerNodeStatusesDarknet = new HashMap();
                peerNodeRoutingBackoffReasons = new HashMap();
-        System.out.println("Creating PeerManager");
-        myPeers = new PeerNode[0];
-        connectedPeers = new PeerNode[0];
-        this.node = node;
-    }
+               System.out.println("Creating PeerManager");
+               myPeers = new PeerNode[0];
+               connectedPeers = new PeerNode[0];
+               this.node = node;
+       }

-    /**
-     * Attempt to read a file full of noderefs. Try the file as named first, 
then the .bak if it is empty or
-     * otherwise doesn't work.
-     * @param filename The filename to read from. If this doesn't work, we try 
the .bak file.
-     * @param crypto The cryptographic identity which these nodes are 
connected to.
-     * @param opennet The opennet manager for the nodes. Only needed (for 
constructing the nodes) if isOpennet.
-     * @param isOpennet Whether the file contains opennet peers.
-     * @param oldOpennetPeers If true, don't add the nodes to the routing 
table, pass them to the opennet
-     * manager as "old peers" i.e. inactive nodes which may try to reconnect.
-     */
-    void tryReadPeers(String filename, NodeCrypto crypto, OpennetManager 
opennet, boolean isOpennet, boolean oldOpennetPeers) {
-       synchronized(writePeersSync) {
-               if(!oldOpennetPeers) {
-                       if(isOpennet) {
-                               openFilename = filename;
-                       } else {
-                               darkFilename = filename;
-                       }
-               }
-       }
-       OutgoingPacketMangler mangler = crypto.packetMangler;
-        File peersFile = new File(filename);
-        File backupFile = new File(filename+".bak");
-        // Try to read the node list from disk
-       if(peersFile.exists()) {
-               if(readPeers(peersFile, mangler, crypto, opennet, 
oldOpennetPeers)) {
-                   String msg;
-                   if(oldOpennetPeers) {
-                       msg = "Read "+opennet.countOldOpennetPeers()+" 
old-opennet-peers from "+peersFile;
-                   } else if(isOpennet) {
-                           msg = "Read "+getOpennetPeers().length+" opennet 
peers from "+peersFile;
-                               } else {
-                           msg = "Read "+getDarknetPeers().length+" darknet 
peers from "+peersFile;
-                               }
-                       Logger.normal(this, msg);
-                       System.out.println(msg);
-                       return;
-               }
-               }
-       // Try the backup
-       if(backupFile.exists()) {
-               if(readPeers(backupFile, mangler, crypto, opennet, 
oldOpennetPeers)) {
-                   String msg;
-                   if(oldOpennetPeers) {
-                       msg = "Read "+opennet.countOldOpennetPeers()+" 
old-opennet-peers from "+peersFile;
-                   } else if(isOpennet) {
-                           msg = "Read "+getOpennetPeers().length+" opennet 
peers from "+peersFile;
-                               } else {
-                           msg = "Read "+getDarknetPeers().length+" darknet 
peers from "+peersFile;
-                               }
-                       Logger.normal(this, msg);
-                       System.out.println(msg);
-               } else {
-                       Logger.error(this, "No (readable) peers file with peers 
in it found");
-                       System.err.println("No (readable) peers file with peers 
in it found");
-               }
-       }               
+       /**
+        * Attempt to read a file full of noderefs. Try the file as named 
first, then the .bak if it is empty or
+        * otherwise doesn't work.
+        * @param filename The filename to read from. If this doesn't work, we 
try the .bak file.
+        * @param crypto The cryptographic identity which these nodes are 
connected to.
+        * @param opennet The opennet manager for the nodes. Only needed (for 
constructing the nodes) if isOpennet.
+        * @param isOpennet Whether the file contains opennet peers.
+        * @param oldOpennetPeers If true, don't add the nodes to the routing 
table, pass them to the opennet
+        * manager as "old peers" i.e. inactive nodes which may try to 
reconnect.
+        */
+       void tryReadPeers(String filename, NodeCrypto crypto, OpennetManager 
opennet, boolean isOpennet, boolean oldOpennetPeers) {
+               synchronized(writePeersSync) {
+                       if(!oldOpennetPeers)
+                               if(isOpennet)
+                                       openFilename = filename;
+                               else
+                                       darkFilename = filename;
+               }
+               OutgoingPacketMangler mangler = crypto.packetMangler;
+               File peersFile = new File(filename);
+               File backupFile = new File(filename + ".bak");
+               // Try to read the node list from disk
+               if(peersFile.exists())
+                       if(readPeers(peersFile, mangler, crypto, opennet, 
oldOpennetPeers)) {
+                               String msg;
+                               if(oldOpennetPeers)
+                                       msg = "Read " + 
opennet.countOldOpennetPeers() + " old-opennet-peers from " + peersFile;
+                               else if(isOpennet)
+                                       msg = "Read " + 
getOpennetPeers().length + " opennet peers from " + peersFile;
+                               else
+                                       msg = "Read " + 
getDarknetPeers().length + " darknet peers from " + peersFile;
+                               Logger.normal(this, msg);
+                               System.out.println(msg);
+                               return;
+                       }
+               // Try the backup
+               if(backupFile.exists())
+                       if(readPeers(backupFile, mangler, crypto, opennet, 
oldOpennetPeers)) {
+                               String msg;
+                               if(oldOpennetPeers)
+                                       msg = "Read " + 
opennet.countOldOpennetPeers() + " old-opennet-peers from " + peersFile;
+                               else if(isOpennet)
+                                       msg = "Read " + 
getOpennetPeers().length + " opennet peers from " + peersFile;
+                               else
+                                       msg = "Read " + 
getDarknetPeers().length + " darknet peers from " + peersFile;
+                               Logger.normal(this, msg);
+                               System.out.println(msg);
+                       } else {
+                               Logger.error(this, "No (readable) peers file 
with peers in it found");
+                               System.err.println("No (readable) peers file 
with peers in it found");
+                       }
        }

        private boolean readPeers(File peersFile, OutgoingPacketMangler 
mangler, NodeCrypto crypto, OpennetManager opennet, boolean oldOpennetPeers) {
-       boolean gotSome = false;
-       FileInputStream fis;
+               boolean gotSome = false;
+               FileInputStream fis;
                try {
                        fis = new FileInputStream(peersFile);
-               } catch (FileNotFoundException e4) {
-                       Logger.normal(this, "Peers file not found: "+peersFile);
+               } catch(FileNotFoundException e4) {
+                       Logger.normal(this, "Peers file not found: " + 
peersFile);
                        return false;
                }
-        InputStreamReader ris;
+               InputStreamReader ris;
                try {
                        ris = new InputStreamReader(fis, "UTF-8");
-               } catch (UnsupportedEncodingException e4) {
+               } catch(UnsupportedEncodingException e4) {
                        throw new Error("Impossible: JVM doesn't support UTF-8: 
" + e4, e4);
                }
-        BufferedReader br = new BufferedReader(ris);
-        try { // FIXME: no better way?
-            while(true) {
-                // Read a single NodePeer
-                SimpleFieldSet fs;
-                fs = new SimpleFieldSet(br, false, true);
-                PeerNode pn;
-                try {
-                    pn = PeerNode.create(fs, node, crypto, opennet, this, 
true, mangler);
-                } catch (FSParseException e2) {
-                    Logger.error(this, "Could not parse peer: "+e2+ '\n' 
+fs.toString(),e2);
-                    continue;
-                } catch (PeerParseException e2) {
-                    Logger.error(this, "Could not parse peer: "+e2+ '\n' 
+fs.toString(),e2);
-                    continue;
-                } catch (ReferenceSignatureVerificationException e2) {
-                       Logger.error(this, "Could not parse peer: "+e2+ '\n' 
+fs.toString(),e2);
-                    continue;
+               BufferedReader br = new BufferedReader(ris);
+               try { // FIXME: no better way?
+                       while(true) {
+                               // Read a single NodePeer
+                               SimpleFieldSet fs;
+                               fs = new SimpleFieldSet(br, false, true);
+                               PeerNode pn;
+                               try {
+                                       pn = PeerNode.create(fs, node, crypto, 
opennet, this, true, mangler);
+                               } catch(FSParseException e2) {
+                                       Logger.error(this, "Could not parse 
peer: " + e2 + '\n' + fs.toString(), e2);
+                                       continue;
+                               } catch(PeerParseException e2) {
+                                       Logger.error(this, "Could not parse 
peer: " + e2 + '\n' + fs.toString(), e2);
+                                       continue;
+                               } catch(ReferenceSignatureVerificationException 
e2) {
+                                       Logger.error(this, "Could not parse 
peer: " + e2 + '\n' + fs.toString(), e2);
+                                       continue;
                                }
-                if(oldOpennetPeers)
-                       opennet.addOldOpennetNode(pn);
-                else
-                       addPeer(pn, true, false);
-                gotSome = true;
-            }
-        } catch (EOFException e) {
-            // End of file, fine
-        } catch (IOException e1) {
-            Logger.error(this, "Could not read peers file: "+e1, e1);
-        }
-        try {
-               br.close();
-        } catch (IOException e3) {
-               Logger.error(this, "Ignoring "+e3+" caught reading "+peersFile, 
e3);
-        }
-        return gotSome;
+                               if(oldOpennetPeers)
+                                       opennet.addOldOpennetNode(pn);
+                               else
+                                       addPeer(pn, true, false);
+                               gotSome = true;
+                       }
+               } catch(EOFException e) {
+                       // End of file, fine
+               } catch(IOException e1) {
+                       Logger.error(this, "Could not read peers file: " + e1, 
e1);
+               }
+               try {
+                       br.close();
+               } catch(IOException e3) {
+                       Logger.error(this, "Ignoring " + e3 + " caught reading 
" + peersFile, e3);
+               }
+               return gotSome;
        }

        public boolean addPeer(PeerNode pn) {
                return addPeer(pn, false, false);
        }
-       
+
        /**
         * Add a peer.
         * @param pn The node to add to the routing table.
@@ -245,14 +232,14 @@
         * an opennet peer when opennet was disabled.
         */
        boolean addPeer(PeerNode pn, boolean ignoreOpennet, boolean reactivate) 
{
-               assert(pn != null);
+               assert (pn != null);
                if(reactivate)
                        pn.forceCancelDisconnecting();
-               synchronized (this) {
-                       for (int i = 0; i < myPeers.length; i++) {
-                               if (myPeers[i].equals(pn)) {
+               synchronized(this) {
+                       for(int i = 0; i < myPeers.length; i++) {
+                               if(myPeers[i].equals(pn)) {
                                        if(logMINOR)
-                                               Logger.minor(this, "Can't add 
peer "+pn+" because already have "+myPeers[i], new Exception("debug"));
+                                               Logger.minor(this, "Can't add 
peer " + pn + " because already have " + myPeers[i], new Exception("debug"));
                                        return false;
                                }
                        }
@@ -268,100 +255,103 @@
                updatePMUserAlert();
                if((!ignoreOpennet) && pn instanceof OpennetPeerNode) {
                        OpennetManager opennet = node.getOpennet();
-                       if(opennet != null) {
+                       if(opennet != null)
                                opennet.forceAddPeer(pn, true);
-                       } else {
-                               Logger.error(this, "Adding opennet peer when no 
opennet enabled!!!: "+pn+" - removing...");
+                       else {
+                               Logger.error(this, "Adding opennet peer when no 
opennet enabled!!!: " + pn + " - removing...");
                                removePeer(pn);
                                return false;
                        }
                }
-               
+
                return true;
        }
-    
+
        synchronized boolean havePeer(PeerNode pn) {
-               for(int i=0;i<myPeers.length;i++) {
-                       if(myPeers[i] == pn) return true;
+               for(int i = 0; i < myPeers.length; i++) {
+                       if(myPeers[i] == pn)
+                               return true;
                }
                return false;
        }
-       
-    private boolean removePeer(PeerNode pn) {
-       if(logMINOR)
-               Logger.minor(this, "Removing "+pn);
+
+       private boolean removePeer(PeerNode pn) {
+               if(logMINOR)
+                       Logger.minor(this, "Removing " + pn);
                boolean isInPeers = false;
-       synchronized(this) {
-               for(int i=0;i<myPeers.length;i++) {
-                       if(myPeers[i] == pn) isInPeers=true;
-               }
-               if(pn instanceof DarknetPeerNode)
-                       ((DarknetPeerNode)pn).removeExtraPeerDataDir();
-               if(isInPeers) {
-                
-                       int peerNodeStatus = pn.getPeerNodeStatus();
-                       if(pn.recordStatus())
-                               removePeerNodeStatus( peerNodeStatus, pn, 
!isInPeers );
-                       String peerNodePreviousRoutingBackoffReason = 
pn.getPreviousBackoffReason();
-                       if(peerNodePreviousRoutingBackoffReason != null) {
-                               
removePeerNodeRoutingBackoffReason(peerNodePreviousRoutingBackoffReason, pn);
-                       }
-                       
-                       // removing from connectedPeers
-                       ArrayList a = new ArrayList();
-                       for(int i=0;i<myPeers.length;i++) {
-                               if((myPeers[i]!=pn) && myPeers[i].isConnected() 
&& myPeers[i].isRealConnection())
-                                       a.add(myPeers[i]);
-                       }
-                       
-                       PeerNode[] newConnectedPeers = new PeerNode[a.size()];
-                       newConnectedPeers = (PeerNode[]) 
a.toArray(newConnectedPeers);
-                       connectedPeers = newConnectedPeers;
-                       
-                       // removing from myPeers
-                       PeerNode[] newMyPeers = new PeerNode[myPeers.length-1];
-                       int positionInNewArray = 0;
-                       for(int i=0;i<myPeers.length;i++) {
-                               if(myPeers[i]!=pn){
-                                       newMyPeers[positionInNewArray] = 
myPeers[i];
-                                       positionInNewArray++;
-                               }
-                       }
-                       myPeers = newMyPeers;
-                       
-                       Logger.normal(this, "Removed "+pn);
-               }
-       }
-       pn.onRemove();
-       if(isInPeers)
-               updatePMUserAlert();
-        return true;
-    }
-       
+               synchronized(this) {
+                       for(int i = 0; i < myPeers.length; i++) {
+                               if(myPeers[i] == pn)
+                                       isInPeers = true;
+                       }
+                       if(pn instanceof DarknetPeerNode)
+                               ((DarknetPeerNode) pn).removeExtraPeerDataDir();
+                       if(isInPeers) {
+
+                               int peerNodeStatus = pn.getPeerNodeStatus();
+                               if(pn.recordStatus())
+                                       removePeerNodeStatus(peerNodeStatus, 
pn, !isInPeers);
+                               String peerNodePreviousRoutingBackoffReason = 
pn.getPreviousBackoffReason();
+                               if(peerNodePreviousRoutingBackoffReason != null)
+                                       
removePeerNodeRoutingBackoffReason(peerNodePreviousRoutingBackoffReason, pn);
+
+                               // removing from connectedPeers
+                               ArrayList a = new ArrayList();
+                               for(int i = 0; i < myPeers.length; i++) {
+                                       if((myPeers[i] != pn) && 
myPeers[i].isConnected() && myPeers[i].isRealConnection())
+                                               a.add(myPeers[i]);
+                               }
+
+                               PeerNode[] newConnectedPeers = new 
PeerNode[a.size()];
+                               newConnectedPeers = (PeerNode[]) 
a.toArray(newConnectedPeers);
+                               connectedPeers = newConnectedPeers;
+
+                               // removing from myPeers
+                               PeerNode[] newMyPeers = new 
PeerNode[myPeers.length - 1];
+                               int positionInNewArray = 0;
+                               for(int i = 0; i < myPeers.length; i++) {
+                                       if(myPeers[i] != pn) {
+                                               newMyPeers[positionInNewArray] 
= myPeers[i];
+                                               positionInNewArray++;
+                                       }
+                               }
+                               myPeers = newMyPeers;
+
+                               Logger.normal(this, "Removed " + pn);
+                       }
+               }
+               pn.onRemove();
+               if(isInPeers)
+                       updatePMUserAlert();
+               return true;
+       }
+
        public boolean removeAllPeers() {
                Logger.normal(this, "removeAllPeers!");
                PeerNode[] oldPeers;
-               synchronized (this) {
+               synchronized(this) {
                        oldPeers = myPeers;
                        myPeers = new PeerNode[0];
                        connectedPeers = new PeerNode[0];
                }
-               for (int i=0; i<oldPeers.length; i++)
+               for(int i = 0; i < oldPeers.length; i++)
                        oldPeers[i].onRemove();
                return true;
-       }       
-       
+       }
+
        public boolean disconnected(PeerNode pn) {
                synchronized(this) {
                        boolean isInPeers = false;
-                       for(int i=0;i<connectedPeers.length;i++) {
-                               if(connectedPeers[i] == pn) isInPeers=true;
+                       for(int i = 0; i < connectedPeers.length; i++) {
+                               if(connectedPeers[i] == pn)
+                                       isInPeers = true;
                        }
-                       if(!isInPeers) return false;
+                       if(!isInPeers)
+                               return false;
                        // removing from connectedPeers
                        ArrayList a = new ArrayList();
-                       for(int i=0;i<myPeers.length;i++) {
-                               if((myPeers[i]!=pn) && myPeers[i].isRoutable())
+                       for(int i = 0; i < myPeers.length; i++) {
+                               if((myPeers[i] != pn) && 
myPeers[i].isRoutable())
                                        a.add(myPeers[i]);
                        }
                        PeerNode[] newConnectedPeers = new PeerNode[a.size()];
@@ -369,55 +359,61 @@
                        connectedPeers = newConnectedPeers;
                }
                updatePMUserAlert();
+               node.lm.announceLocChange();
                return true;
        }
-       
        long timeFirstAnyConnections = 0;
-       
+
        public long getTimeFirstAnyConnections() {
                return timeFirstAnyConnections;
        }
-       
-    public void addConnectedPeer(PeerNode pn) {
-       logMINOR = Logger.shouldLog(Logger.MINOR, this);
-       if(!pn.isRealConnection()) {
-               if(logMINOR) Logger.minor(this, "Not a real connection: "+pn);
-               return;
-       }
-       if(!pn.isConnected()) {
-               if(logMINOR) Logger.minor(this, "Not connected: "+pn);
-               return;
-       }
-       long now = System.currentTimeMillis();
-       synchronized(this) {
-       if(timeFirstAnyConnections == 0) timeFirstAnyConnections = now;
-        for(int i=0;i<connectedPeers.length;i++) {
-            if(connectedPeers[i] == pn) {
-               if(logMINOR) Logger.minor(this, "Already connected: "+pn);
-                return;
-            }
-        }
-        boolean inMyPeers = false;
-        for(int i=0;i<myPeers.length;i++) {
-            if(myPeers[i] == pn) {
-                inMyPeers = true;
-                break;
-            }
-        }
-        if(!inMyPeers) {
-            Logger.error(this, "Connecting to "+pn+" but not in peers!");
-            addPeer(pn);
-        }
-        if(logMINOR) Logger.minor(this, "Connecting: "+pn);
-        PeerNode[] newConnectedPeers = new PeerNode[connectedPeers.length+1];
-        System.arraycopy(connectedPeers, 0, newConnectedPeers, 0, 
connectedPeers.length);
-        newConnectedPeers[connectedPeers.length] = pn;
-        connectedPeers = newConnectedPeers;
-        if(logMINOR) Logger.minor(this, "Connected peers: 
"+connectedPeers.length);
-       }
-        updatePMUserAlert();
-    }
-    
+
+       public void addConnectedPeer(PeerNode pn) {
+               logMINOR = Logger.shouldLog(Logger.MINOR, this);
+               if(!pn.isRealConnection()) {
+                       if(logMINOR)
+                               Logger.minor(this, "Not a real connection: " + 
pn);
+                       return;
+               }
+               if(!pn.isConnected()) {
+                       if(logMINOR)
+                               Logger.minor(this, "Not connected: " + pn);
+                       return;
+               }
+               long now = System.currentTimeMillis();
+               synchronized(this) {
+                       if(timeFirstAnyConnections == 0)
+                               timeFirstAnyConnections = now;
+                       for(int i = 0; i < connectedPeers.length; i++) {
+                               if(connectedPeers[i] == pn) {
+                                       if(logMINOR)
+                                               Logger.minor(this, "Already 
connected: " + pn);
+                                       return;
+                               }
+                       }
+                       boolean inMyPeers = false;
+                       for(int i = 0; i < myPeers.length; i++) {
+                               if(myPeers[i] == pn) {
+                                       inMyPeers = true;
+                                       break;
+                               }
+                       }
+                       if(!inMyPeers) {
+                               Logger.error(this, "Connecting to " + pn + " 
but not in peers!");
+                               addPeer(pn);
+                       }
+                       if(logMINOR)
+                               Logger.minor(this, "Connecting: " + pn);
+                       PeerNode[] newConnectedPeers = new 
PeerNode[connectedPeers.length + 1];
+                       System.arraycopy(connectedPeers, 0, newConnectedPeers, 
0, connectedPeers.length);
+                       newConnectedPeers[connectedPeers.length] = pn;
+                       connectedPeers = newConnectedPeers;
+                       if(logMINOR)
+                               Logger.minor(this, "Connected peers: " + 
connectedPeers.length);
+               }
+               updatePMUserAlert();
+               node.lm.announceLocChange();
+       }
 //    NodePeer route(double targetLocation, RoutingContext ctx) {
 //        double minDist = 1.1;
 //        NodePeer best = null;
@@ -438,83 +434,93 @@
 //        return route(target.getValue(), ctx);
 //    }
 //
-    /**
-     * Find the node with the given Peer address.
-     */
-    public PeerNode getByPeer(Peer peer) {
-        for(int i=0;i<myPeers.length;i++) {
-               if(!myPeers[i].isRealConnection())
-                       continue;
-            if(peer.equals(myPeers[i].getPeer()))
-                return myPeers[i];
-        }
-        return null;
-    }
+       /**
+        * Find the node with the given Peer address.
+        */
+       public PeerNode getByPeer(Peer peer) {
+               for(int i = 0; i < myPeers.length; i++) {
+                       if(!myPeers[i].isRealConnection())
+                               continue;
+                       if(peer.equals(myPeers[i].getPeer()))
+                               return myPeers[i];
+               }
+               return null;
+       }

-    /**
-     * Connect to a node provided the fieldset representing it.
-     */
-    public void connect(SimpleFieldSet noderef, OutgoingPacketMangler mangler) 
throws FSParseException, PeerParseException, 
ReferenceSignatureVerificationException {
-        PeerNode pn = node.createNewDarknetNode(noderef);
-        for(int i=0;i<myPeers.length;i++) {
-            if(Arrays.equals(myPeers[i].identity, pn.identity)) return;
-        }
-        addPeer(pn);
-    }
-       
-    /**
-     * Disconnect from a specified node
-     */
-    public void disconnect(final PeerNode pn, boolean sendDisconnectMessage, 
final boolean waitForAck) {
-       if(logMINOR) Logger.minor(this, "Disconnecting "+pn.shortToString());
-       synchronized(this) {
-               if(!havePeer(pn)) return;
-       }
-       pn.notifyDisconnecting();
-       if(sendDisconnectMessage) {
-               Message msg = DMT.createFNPDisconnect(true, false, -1, new 
ShortBuffer(new byte[0]));
-                       try {
+       /**
+        * Connect to a node provided the fieldset representing it.
+        */
+       public void connect(SimpleFieldSet noderef, OutgoingPacketMangler 
mangler) throws FSParseException, PeerParseException, 
ReferenceSignatureVerificationException {
+               PeerNode pn = node.createNewDarknetNode(noderef);
+               for(int i = 0; i < myPeers.length; i++) {
+                       if(Arrays.equals(myPeers[i].identity, pn.identity))
+                               return;
+               }
+               addPeer(pn);
+       }
+
+       /**
+        * Disconnect from a specified node
+        */
+       public void disconnect(final PeerNode pn, boolean 
sendDisconnectMessage, final boolean waitForAck) {
+               if(logMINOR)
+                       Logger.minor(this, "Disconnecting " + 
pn.shortToString());
+               synchronized(this) {
+                       if(!havePeer(pn))
+                               return;
+               }
+               pn.notifyDisconnecting();
+               if(sendDisconnectMessage) {
+                       Message msg = DMT.createFNPDisconnect(true, false, -1, 
new ShortBuffer(new byte[0]));
+                       try {
                                pn.sendAsync(msg, new AsyncMessageCallback() {
+
                                        boolean done = false;
+
                                        public void acknowledged() {
                                                done();
                                        }
+
                                        public void disconnected() {
                                                done();
                                        }
+
                                        public void fatalError() {
                                                done();
                                        }
+
                                        public void sent() {
-                                               if(!waitForAck) done();
+                                               if(!waitForAck)
+                                                       done();
                                        }
+
                                        void done() {
                                                synchronized(this) {
-                                                       if(done) return;
+                                                       if(done)
+                                                               return;
                                                        done = true;
                                                }
-                                       if(removePeer(pn))
-                                               writePeers();
+                                               if(removePeer(pn))
+                                                       writePeers();
                                        }
                                }, 0, ctrDisconn);
-                       } catch (NotConnectedException e) {
-                       if(pn.isDisconnecting() && removePeer(pn))
-                               writePeers();
-                       return;
+                       } catch(NotConnectedException e) {
+                               if(pn.isDisconnecting() && removePeer(pn))
+                                       writePeers();
+                               return;
                        }
-                       node.getTicker().queueTimedJob(new Runnable() {
-                               public void run() {
-                               if(pn.isDisconnecting() && removePeer(pn))
-                                       writePeers();
-                               }
-                       }, Node.MAX_PEER_INACTIVITY);
-       } else {
-               if(removePeer(pn))
-                       writePeers();
-       }
-    }
+                       node.getTicker().queueTimedJob(new Runnable() {

-    final ByteCounter ctrDisconn = new ByteCounter() {
+                               public void run() {
+                                       if(pn.isDisconnecting() && 
removePeer(pn))
+                                               writePeers();
+                               }
+                       }, Node.MAX_PEER_INACTIVITY);
+               } else
+                       if(removePeer(pn))
+                               writePeers();
+       }
+       final ByteCounter ctrDisconn = new ByteCounter() {

                public void receivedBytes(int x) {
                        node.nodeStats.disconnBytesReceived(x);
@@ -527,248 +533,278 @@
                public void sentPayload(int x) {
                        // Ignore
                }
-       
-    };
-    
-    protected static class LocationUIDPair implements Comparable {
-       double location;
-       long uid;
-       
-       LocationUIDPair(PeerNode pn) {
-               location = pn.getLocation();
-               uid = pn.swapIdentifier;
-       }
+       };

+       protected static class LocationUIDPair implements Comparable {
+
+               double location;
+               long uid;
+
+               LocationUIDPair(PeerNode pn) {
+                       location = pn.getLocation();
+                       uid = pn.swapIdentifier;
+               }
+
                public int compareTo(Object arg0) {
                        // Compare purely on location, so result is the same as 
getPeerLocationDoubles()
                        LocationUIDPair p = (LocationUIDPair) arg0;
-                       if(p.location > location) return 1;
-                       if(p.location < location) return -1;
+                       if(p.location > location)
+                               return 1;
+                       if(p.location < location)
+                               return -1;
                        return 0;
                }
-    }
-    
-    /**
-     * @return An array of the current locations (as doubles) of all
-     * our connected peers.
-     */
-    public double[] getPeerLocationDoubles() {
-        double[] locs;
-        PeerNode[] conns;
-        synchronized (this) {
+       }
+
+       /**
+        * @return An array of the current locations (as doubles) of all
+        * our connected peers or double[0] if 
Node.shallWePublishOurPeersLocation() is false
+        */
+       public double[] getPeerLocationDoubles(boolean pruneBackedOffedPeers) {
+               double[] locs;
+               if(!node.shallWePublishOurPeersLocation())
+                       return new double[0];
+               PeerNode[] conns;
+               synchronized(this) {
                        conns = connectedPeers;
                }
-        locs = new double[conns.length];
-        int x = 0;
-        for(int i=0;i<conns.length;i++) {
-            if(conns[i].isRoutable())
-                locs[x++] = conns[i].getLocation();
-        }
-        // Wipe out any information contained in the order
-        java.util.Arrays.sort(locs, 0, x);
-        if(x != locs.length) {
-            double[] newLocs = new double[x];
-            System.arraycopy(locs, 0, newLocs, 0, x);
-            return newLocs;
-        } else return locs;
-    }
+               locs = new double[conns.length];
+               int x = 0;
+               for(int i = 0; i < conns.length; i++) {
+                       if(conns[i].isRoutable()) {
+                               if(!conns[i].shouldBeExcludedFromPeerList()) {
+                                       locs[x++] = conns[i].getLocation();
+                               }
+                       }
+               }
+               // Wipe out any information contained in the order
+               java.util.Arrays.sort(locs, 0, x);
+               if(x != locs.length) {
+                       double[] newLocs = new double[x];
+                       System.arraycopy(locs, 0, newLocs, 0, x);
+                       return newLocs;
+               } else
+                       return locs;
+       }

-    /** Just like getPeerLocationDoubles, except it also
-     * returns the UID for each node. */
-    public LocationUIDPair[] getPeerLocationsAndUIDs() {
-        PeerNode[] conns;
-        LocationUIDPair[] locPairs;
-        synchronized (this) {
+       /** Just like getPeerLocationDoubles, except it also
+        * returns the UID for each node. */
+       public LocationUIDPair[] getPeerLocationsAndUIDs() {
+               PeerNode[] conns;
+               LocationUIDPair[] locPairs;
+               synchronized(this) {
                        conns = myPeers;
                }
-        locPairs = new LocationUIDPair[conns.length];
-        int x = 0;
-        for(int i=0;i<conns.length;i++) {
-            if(conns[i].isRoutable())
-               locPairs[x++] = new LocationUIDPair(conns[i]);
-        }
-        // Sort it
-        Arrays.sort(locPairs, 0, x);
-        if(x != locPairs.length) {
-            LocationUIDPair[] newLocs = new LocationUIDPair[x];
-            System.arraycopy(locPairs, 0, newLocs, 0, x);
-            return newLocs;
-        } else return locPairs;
-    }
+               locPairs = new LocationUIDPair[conns.length];
+               int x = 0;
+               for(int i = 0; i < conns.length; i++) {
+                       if(conns[i].isRoutable())
+                               locPairs[x++] = new LocationUIDPair(conns[i]);
+               }
+               // Sort it
+               Arrays.sort(locPairs, 0, x);
+               if(x != locPairs.length) {
+                       LocationUIDPair[] newLocs = new LocationUIDPair[x];
+                       System.arraycopy(locPairs, 0, newLocs, 0, x);
+                       return newLocs;
+               } else
+                       return locPairs;
+       }

        public PeerNode getRandomPeerInSwappingNetworkOf(PeerNode exclude) {
-               if (exclude==null || exclude.networkGroup==null || 
NetworkIDManager.disableSwapSegregation)
+               if(exclude == null || exclude.networkGroup == null || 
NetworkIDManager.disableSwapSegregation)
                        return getRandomPeer(exclude);
-               synchronized (this) {
-                       if(connectedPeers.length == 0) return null;
-                       for(int i=0;i<5;i++) {
+               synchronized(this) {
+                       if(connectedPeers.length == 0)
+                               return null;
+                       for(int i = 0; i < 5; i++) {
                                PeerNode pn = 
connectedPeers[node.random.nextInt(connectedPeers.length)];
-                               if(pn == exclude) continue;
-                               if (node.netid.inSeparateNetworks(pn, exclude)) 
continue;
-                               if(pn.isRoutable()) return pn;
+                               if(pn == exclude)
+                                       continue;
+                               if(node.netid.inSeparateNetworks(pn, exclude))
+                                       continue;
+                               if(pn.isRoutable())
+                                       return pn;
                        }
                        //could not easily find a good random one... filter the 
ones which are acceptable
-                       ArrayList l=new ArrayList();
-                       for (int i=0; i<connectedPeers.length; i++) {
-                               PeerNode pn=connectedPeers[i];
-                               if(pn == exclude) continue;
-                               if (node.netid.inSeparateNetworks(pn, exclude)) 
continue;
-                               if(!pn.isRoutable()) continue;
+                       ArrayList l = new ArrayList();
+                       for(int i = 0; i < connectedPeers.length; i++) {
+                               PeerNode pn = connectedPeers[i];
+                               if(pn == exclude)
+                                       continue;
+                               if(node.netid.inSeparateNetworks(pn, exclude))
+                                       continue;
+                               if(!pn.isRoutable())
+                                       continue;
                                l.add(pn);
                        }
                        //Are there any acceptable peers?
-                       if (l.size() == 0)
+                       if(l.size() == 0)
                                return null;
-                       return (PeerNode)l.get(node.random.nextInt(l.size()));
+                       return (PeerNode) l.get(node.random.nextInt(l.size()));
                }
        }
-       
-    /**
-     * @return A random routable connected peer.
-     * FIXME: should this take performance into account?
-     * DO NOT remove the "synchronized". See below for why.
-     */
-    public synchronized PeerNode getRandomPeer(PeerNode exclude) {
-        if(connectedPeers.length == 0) return null;
-        for(int i=0;i<5;i++) {
-            PeerNode pn = 
connectedPeers[node.random.nextInt(connectedPeers.length)];
-            if(pn == exclude) continue;
-            if(pn.isRoutable()) return pn;
-        }
-        // None of them worked
-        // Move the un-connected ones out
-        // This is safe as they will add themselves when they
-        // reconnect, and they can't do it yet as we are synchronized.
-        Vector v = new Vector(connectedPeers.length);
-        logMINOR = Logger.shouldLog(Logger.MINOR, this);
-        for(int i=0;i<myPeers.length;i++) {
-            PeerNode pn = myPeers[i];
-            if(pn == exclude) continue;
-            if(pn.isRoutable()) {
-                v.add(pn);
-            } else {
-               if(logMINOR) Logger.minor(this, "Excluding "+pn+" because is 
disconnected");
-            }
-        }
-        int lengthWithoutExcluded = v.size();
-        if((exclude != null) && exclude.isRoutable())
-            v.add(exclude);
-        PeerNode[] newConnectedPeers = new PeerNode[v.size()];
-        newConnectedPeers = (PeerNode[]) v.toArray(newConnectedPeers);
-        if(logMINOR) Logger.minor(this, "Connected peers (in getRandomPeer): 
"+newConnectedPeers.length+" was "+connectedPeers.length);
-        connectedPeers = newConnectedPeers;
-        if(lengthWithoutExcluded == 0) return null;
-        return connectedPeers[node.random.nextInt(lengthWithoutExcluded)];
-    }

-    /**
-     * Asynchronously send this message to every connected peer.
-     */
-    public void localBroadcast(Message msg, boolean ignoreRoutability, boolean 
onlyRealConnections, ByteCounter ctr) {
-        PeerNode[] peers;
-        synchronized (this) {
-               // myPeers not connectedPeers as connectedPeers only contains
-               // ROUTABLE peers, and we may want to send to non-routable peers
+       /**
+        * @return A random routable connected peer.
+        * FIXME: should this take performance into account?
+        * DO NOT remove the "synchronized". See below for why.
+        */
+       public synchronized PeerNode getRandomPeer(PeerNode exclude) {
+               if(connectedPeers.length == 0)
+                       return null;
+               for(int i = 0; i < 5; i++) {
+                       PeerNode pn = 
connectedPeers[node.random.nextInt(connectedPeers.length)];
+                       if(pn == exclude)
+                               continue;
+                       if(pn.isRoutable())
+                               return pn;
+               }
+               // None of them worked
+               // Move the un-connected ones out
+               // This is safe as they will add themselves when they
+               // reconnect, and they can't do it yet as we are synchronized.
+               Vector v = new Vector(connectedPeers.length);
+               logMINOR = Logger.shouldLog(Logger.MINOR, this);
+               for(int i = 0; i < myPeers.length; i++) {
+                       PeerNode pn = myPeers[i];
+                       if(pn == exclude)
+                               continue;
+                       if(pn.isRoutable())
+                               v.add(pn);
+                       else
+                               if(logMINOR)
+                                       Logger.minor(this, "Excluding " + pn + 
" because is disconnected");
+               }
+               int lengthWithoutExcluded = v.size();
+               if((exclude != null) && exclude.isRoutable())
+                       v.add(exclude);
+               PeerNode[] newConnectedPeers = new PeerNode[v.size()];
+               newConnectedPeers = (PeerNode[]) v.toArray(newConnectedPeers);
+               if(logMINOR)
+                       Logger.minor(this, "Connected peers (in getRandomPeer): 
" + newConnectedPeers.length + " was " + connectedPeers.length);
+               connectedPeers = newConnectedPeers;
+               if(lengthWithoutExcluded == 0)
+                       return null;
+               return 
connectedPeers[node.random.nextInt(lengthWithoutExcluded)];
+       }
+
+       /**
+        * Asynchronously send this message to every connected peer.
+        */
+       public void localBroadcast(Message msg, boolean ignoreRoutability, 
boolean onlyRealConnections, ByteCounter ctr) {
+               PeerNode[] peers;
+               synchronized(this) {
+                       // myPeers not connectedPeers as connectedPeers only 
contains
+                       // ROUTABLE peers, and we may want to send to 
non-routable peers
                        peers = myPeers;
                }
-        for(int i=0;i<peers.length;i++) {
-               if(ignoreRoutability) {
-                       if(!peers[i].isConnected()) continue;
-               } else {
-                       if(!peers[i].isRoutable()) continue;
-               }
-               if(onlyRealConnections && !peers[i].isRealConnection()) 
continue;
-               try {
-                peers[i].sendAsync(msg, null, 0, ctr);
-            } catch (NotConnectedException e) {
-                // Ignore
-            }
-        }
-    }
+               for(int i = 0; i < peers.length; i++) {
+                       if(ignoreRoutability) {
+                               if(!peers[i].isConnected())
+                                       continue;
+                       } else
+                               if(!peers[i].isRoutable())
+                                       continue;
+                       if(onlyRealConnections && !peers[i].isRealConnection())
+                               continue;
+                       try {
+                               peers[i].sendAsync(msg, null, 0, ctr);
+                       } catch(NotConnectedException e) {
+                               // Ignore
+                       }
+               }
+       }

        /**
         * Asynchronously send a differential node reference to every 
isConnected() peer.
         */
        public void locallyBroadcastDiffNodeRef(SimpleFieldSet fs, boolean 
toDarknetOnly, boolean toOpennetOnly) {
                PeerNode[] peers;
-               synchronized (this) {
+               synchronized(this) {
                        // myPeers not connectedPeers as connectedPeers only 
contains
                        // ROUTABLE peers and we want to also send to 
non-routable peers
                        peers = myPeers;
                }
-               for(int i=0;i<peers.length;i++) {
-                       if(!peers[i].isConnected()) continue;
-                       if(toDarknetOnly && !peers[i].isDarknet()) continue;
-                       if(toOpennetOnly && !peers[i].isOpennet()) continue;
+               for(int i = 0; i < peers.length; i++) {
+                       if(!peers[i].isConnected())
+                               continue;
+                       if(toDarknetOnly && !peers[i].isDarknet())
+                               continue;
+                       if(toOpennetOnly && !peers[i].isOpennet())
+                               continue;
                        peers[i].sendNodeToNodeMessage(fs, 
Node.N2N_MESSAGE_TYPE_DIFFNODEREF, false, 0, false);
                }
        }

-    public PeerNode getRandomPeer() {
-        return getRandomPeer(null);
-    }
+       public PeerNode getRandomPeer() {
+               return getRandomPeer(null);
+       }

-    public double closestPeerLocation(double loc, double ignoreLoc, int 
minUptimePercent) {
-        PeerNode[] peers;
-        synchronized (this) {
-               peers = connectedPeers;
+       public double closestPeerLocation(double loc, double ignoreLoc, int 
minUptimePercent) {
+               PeerNode[] peers;
+               synchronized(this) {
+                       peers = connectedPeers;
                }
-        double bestDiff = 1.0;
-        double bestLoc = Double.MAX_VALUE;
-        boolean foundOne = false;
-        for(int i=0;i<peers.length;i++) {
-            PeerNode p = peers[i];
-            if(!p.isRoutable()) continue;
-            if(p.isRoutingBackedOff()) continue;
-            if(p.getUptime() < minUptimePercent) continue;
-            double peerloc = p.getLocation();
-            if(Math.abs(peerloc - ignoreLoc) < Double.MIN_VALUE*2)
-               continue;
-            double diff = Location.distance(peerloc, loc);
-            if(diff < bestDiff) {
-               foundOne = true;
-                bestDiff = diff;
-                bestLoc = peerloc;
-            }
-        }
-        if(!foundOne) {
-            for(int i=0;i<peers.length;i++) {
-                PeerNode p = peers[i];
-                if(!p.isRoutable()) continue;
-                if(p.getUptime() < minUptimePercent) continue;
-                // Ignore backoff state
-                double peerloc = p.getLocation();
-                if(Math.abs(peerloc - ignoreLoc) < Double.MIN_VALUE*2)
-                       continue;
-                double diff = Location.distance(peerloc, loc);
-                if(diff < bestDiff) {
-                       foundOne = true;
-                    bestDiff = diff;
-                    bestLoc = peerloc;
-                }
-            }
-        }
-        return bestLoc;
-    }
+               double bestDiff = 1.0;
+               double bestLoc = Double.MAX_VALUE;
+               boolean foundOne = false;
+               for(int i = 0; i < peers.length; i++) {
+                       PeerNode p = peers[i];
+                       if(!p.isRoutable())
+                               continue;
+                       if(p.isRoutingBackedOff())
+                               continue;
+                       if(p.getUptime() < minUptimePercent)
+                               continue;
+                       double peerloc = p.getLocation();
+                       if(Math.abs(peerloc - ignoreLoc) < Double.MIN_VALUE * 2)
+                               continue;
+                       double diff = Location.distance(peerloc, loc);
+                       if(diff < bestDiff) {
+                               foundOne = true;
+                               bestDiff = diff;
+                               bestLoc = peerloc;
+                       }
+               }
+               if(!foundOne)
+                       for(int i = 0; i < peers.length; i++) {
+                               PeerNode p = peers[i];
+                               if(!p.isRoutable())
+                                       continue;
+                               if(p.getUptime() < minUptimePercent)
+                                       continue;
+                               // Ignore backoff state
+                               double peerloc = p.getLocation();
+                               if(Math.abs(peerloc - ignoreLoc) < 
Double.MIN_VALUE * 2)
+                                       continue;
+                               double diff = Location.distance(peerloc, loc);
+                               if(diff < bestDiff) {
+                                       foundOne = true;
+                                       bestDiff = diff;
+                                       bestLoc = peerloc;
+                               }
+                       }
+               return bestLoc;
+       }

-    public boolean isCloserLocation(double loc, int minUptimePercent) {
-       double nodeLoc = node.lm.getLocation();
-       double nodeDist = Location.distance(nodeLoc, loc);
-       double closest = closestPeerLocation(loc, nodeLoc, minUptimePercent);
-       if(closest > 1.0) {
-               // No peers found
-               return false;
-       }
-       double closestDist = Location.distance(closest, loc);
-       return closestDist < nodeDist;
-    }
-    
-    public PeerNode closerPeer(PeerNode pn, Set routedTo, Set notIgnored, 
double loc, boolean ignoreSelf, boolean calculateMisrouting, int minVersion, 
Vector addUnpickedLocsTo, Key key) {
-       return closerPeer(pn, routedTo, notIgnored, loc, ignoreSelf, 
calculateMisrouting, minVersion, addUnpickedLocsTo, 2.0, key);
-    }
+       public boolean isCloserLocation(double loc, int minUptimePercent) {
+               double nodeLoc = node.lm.getLocation();
+               double nodeDist = Location.distance(nodeLoc, loc);
+               double closest = closestPeerLocation(loc, nodeLoc, 
minUptimePercent);
+               if(closest > 1.0)
+                       // No peers found
+                       return false;
+               double closestDist = Location.distance(closest, loc);
+               return closestDist < nodeDist;
+       }

+       public PeerNode closerPeer(PeerNode pn, Set routedTo, Set notIgnored, 
double loc, boolean ignoreSelf, boolean calculateMisrouting, int minVersion, 
Vector addUnpickedLocsTo, Key key) {
+               return closerPeer(pn, routedTo, notIgnored, loc, ignoreSelf, 
calculateMisrouting, minVersion, addUnpickedLocsTo, 2.0, key);
+       }
+
        /**
-     * Find the peer, if any, which is closer to the target location than we 
are, and is not included in the provided set.
+        * Find the peer, if any, which is closer to the target location than 
we are, and is not included in the provided set.
         * If ignoreSelf==false, and we are closer to the target than any 
peers, this function returns null.
         * This function returns two values, the closest such peer which is 
backed off, and the same which is not backed off.
         * It is possible for either to be null independant of the other, 
'closest' is the closer of the two in either case, and
@@ -778,315 +814,339 @@
         * @param maxDistance If a node is further away from the target than 
this distance, ignore it.
         * @param key The original key, if we have it, and if we want to 
consult with the FailureTable
         * to avoid routing to nodes which have recently failed for the same 
key.
-     */
-    public PeerNode closerPeer(PeerNode pn, Set routedTo, Set notIgnored, 
double target, boolean ignoreSelf, boolean calculateMisrouting, int minVersion, 
Vector addUnpickedLocsTo, double maxDistance, Key key) {
-        PeerNode[] peers;  
-        synchronized (this) {
+        */
+       public PeerNode closerPeer(PeerNode pn, Set routedTo, Set notIgnored, 
double target, boolean ignoreSelf, boolean calculateMisrouting, int minVersion, 
Vector addUnpickedLocsTo, double maxDistance, Key key) {
+               PeerNode[] peers;
+               synchronized(this) {
                        peers = connectedPeers;
                }
-        if(!node.enablePerNodeFailureTables) key = null;
-        if(logMINOR) Logger.minor(this, "Choosing closest peer: 
connectedPeers="+peers.length);
-        double maxDiff = Double.MAX_VALUE;
-        if(!ignoreSelf)
-            maxDiff = Location.distance(node.lm.getLocation(), target);
-        
-        /**
-         * Routing order:
-         * - Non-timed-out non-backed-off peers, in order of closeness to the 
target.
-         * - Timed-out, non-backed-off peers, least recently timed out first.
-         * - Non-timed-out backed-off peers, in order of closeness to the 
target.
-         * - Timed out, backed-off peers, least recently timed out first.
-         * - 
-         */
-        
+               if(!node.enablePerNodeFailureTables)
+                       key = null;
+               if(logMINOR)
+                       Logger.minor(this, "Choosing closest peer: 
connectedPeers=" + peers.length);
+               double maxDiff = Double.MAX_VALUE;
+               if(!ignoreSelf)
+                       maxDiff = Location.distance(node.lm.getLocation(), 
target);
+
+               /**
+                * Routing order:
+                * - Non-timed-out non-backed-off peers, in order of closeness 
to the target.
+                * - Timed-out, non-backed-off peers, least recently timed out 
first.
+                * - Non-timed-out backed-off peers, in order of closeness to 
the target.
+                * - Timed out, backed-off peers, least recently timed out 
first.
+                * - 
+                */
                PeerNode closest = null;
                double closestDistance = Double.MAX_VALUE;
-               
+
                PeerNode closestBackedOff = null;
                double closestBackedOffDistance = Double.MAX_VALUE;
-               
+
                PeerNode closestNotBackedOff = null;
                double closestNotBackedOffDistance = Double.MAX_VALUE;
-               
+
                PeerNode leastRecentlyTimedOut = null;
                long timeLeastRecentlyTimedOut = Long.MAX_VALUE;
-               
+
                PeerNode leastRecentlyTimedOutBackedOff = null;
                long timeLeastRecentlyTimedOutBackedOff = Long.MAX_VALUE;
-               
+
                TimedOutNodesList entry = null;
-               
-               if(key != null) {
+
+               if(key != null)
                        entry = node.failureTable.getTimedOutNodesList(key);
-               }
-               
+
                long now = System.currentTimeMillis();
                int count = 0;
-        for(int i=0;i<peers.length;i++) {
-            PeerNode p = peers[i];
-            if(routedTo.contains(p)) {
-               if(logMINOR) Logger.minor(this, "Skipping (already routed to): 
"+p.getPeer());
-               continue;
-            }
-            if(p == pn) {
-               if(logMINOR) Logger.minor(this, "Skipping (req came from): 
"+p.getPeer());
-               continue;
-            }
-            if(!p.isRoutable()) {
-               if(logMINOR) Logger.minor(this, "Skipping (not connected): 
"+p.getPeer());
-               continue;
-            }
-            if(minVersion > 0 && 
Version.getArbitraryBuildNumber(p.getVersion(), -1) < minVersion) {
-               if(logMINOR) Logger.minor(this, "Skipping old version: 
"+p.getPeer());
-               continue;
-            }
-            long timeout = -1;
-            if(entry != null)
-               timeout = entry.getTimeoutTime(p);
-            boolean timedOut = timeout > now;
+               for(int i = 0; i < peers.length; i++) {
+                       PeerNode p = peers[i];
+                       if(routedTo.contains(p)) {
+                               if(logMINOR)
+                                       Logger.minor(this, "Skipping (already 
routed to): " + p.getPeer());
+                               continue;
+                       }
+                       if(p == pn) {
+                               if(logMINOR)
+                                       Logger.minor(this, "Skipping (req came 
from): " + p.getPeer());
+                               continue;
+                       }
+                       if(!p.isRoutable()) {
+                               if(logMINOR)
+                                       Logger.minor(this, "Skipping (not 
connected): " + p.getPeer());
+                               continue;
+                       }
+                       if(minVersion > 0 && 
Version.getArbitraryBuildNumber(p.getVersion(), -1) < minVersion) {
+                               if(logMINOR)
+                                       Logger.minor(this, "Skipping old 
version: " + p.getPeer());
+                               continue;
+                       }
+                       long timeout = -1;
+                       if(entry != null)
+                               timeout = entry.getTimeoutTime(p);
+                       boolean timedOut = timeout > now;
                        //To help avoid odd race conditions, get the location 
only once and use it for all calculations.
                        double loc = p.getLocation();
-            double diff = Location.distance(loc, target);
-            if(diff > maxDistance) continue;
+                       double diff = Location.distance(loc, target);
+                       
+                       double[] peersLocation = p.getPeersLocation();
+                       if((node.shallWeRouteAccordingToOurPeersLocation()) && 
(peersLocation != null)) {
+                               for(double l : peersLocation) {
+                                       double newDiff = Location.distance(l, 
target);
+                                       if(newDiff < diff) {
+                                               loc = l;
+                                               diff = newDiff;
+                                       }
+                               }
+                               if(logMINOR)
+                                       Logger.minor(this, "The peer "+p+" has 
published his peer's locations and the closest we have found to the target is 
"+diff+" away.");
+                       }
+                       
+                       if(diff > maxDistance)
+                               continue;
                        if((!ignoreSelf) && (diff > maxDiff)) {
-               if(logMINOR) Logger.minor(this, "Ignoring, further than self 
>maxDiff="+maxDiff);
-               continue;
-            }
+                               if(logMINOR)
+                                       Logger.minor(this, "Ignoring, further 
than self >maxDiff=" + maxDiff);
+                               continue;
+                       }
                        count++;
-            if(logMINOR) Logger.minor(this, "p.loc="+loc+", target="+target+", 
d="+Location.distance(loc, target)+" usedD="+diff+" timedOut="+timedOut+" for 
"+p.getPeer());
-                       boolean chosen=false;
-            if(diff < closestDistance) {
-               closestDistance = diff;
-                closest = p;
-                               chosen=true;
-                if(logMINOR) Logger.minor(this, "New best: "+diff+" ("+loc+" 
for "+p.getPeer());
-            }
-                       boolean backedOff=p.isRoutingBackedOff();
+                       if(logMINOR)
+                               Logger.minor(this, "p.loc=" + loc + ", target=" 
+ target + ", d=" + Location.distance(loc, target) + " usedD=" + diff + " 
timedOut=" + timedOut + " for " + p.getPeer());
+                       boolean chosen = false;
+                       if(diff < closestDistance) {
+                               closestDistance = diff;
+                               closest = p;
+                               chosen = true;
+                               if(logMINOR)
+                                       Logger.minor(this, "New best: " + diff 
+ " (" + loc + " for " + p.getPeer());
+                       }
+                       boolean backedOff = p.isRoutingBackedOff();
                        if(backedOff && (diff < closestBackedOffDistance) && 
!timedOut) {
-               closestBackedOffDistance = diff;
-                closestBackedOff = p;
-                               chosen=true;
-                if(logMINOR) Logger.minor(this, "New best-backed-off: "+diff+" 
("+loc+" for "+p.getPeer());
-            }
+                               closestBackedOffDistance = diff;
+                               closestBackedOff = p;
+                               chosen = true;
+                               if(logMINOR)
+                                       Logger.minor(this, "New 
best-backed-off: " + diff + " (" + loc + " for " + p.getPeer());
+                       }
                        if(!backedOff && (diff < closestNotBackedOffDistance) 
&& !timedOut) {
-               closestNotBackedOffDistance = diff;
-                closestNotBackedOff = p;
-                               chosen=true;
-                if(logMINOR) Logger.minor(this, "New best-not-backed-off: 
"+diff+" ("+loc+" for "+p.getPeer());
-            }
-                       if(timedOut) {
+                               closestNotBackedOffDistance = diff;
+                               closestNotBackedOff = p;
+                               chosen = true;
+                               if(logMINOR)
+                                       Logger.minor(this, "New 
best-not-backed-off: " + diff + " (" + loc + " for " + p.getPeer());
+                       }
+                       if(timedOut)
                                if(!backedOff) {
                                        if(timeout < timeLeastRecentlyTimedOut) 
{
                                                timeLeastRecentlyTimedOut = 
timeout;
                                                leastRecentlyTimedOut = p;
                                        }
-                               } else {
+                               } else
                                        if(timeout < 
timeLeastRecentlyTimedOutBackedOff) {
                                                
timeLeastRecentlyTimedOutBackedOff = timeout;
                                                leastRecentlyTimedOutBackedOff 
= p;
                                        }
-                               }
+                       if(addUnpickedLocsTo != null && !chosen) {
+                               Double d = new Double(loc);
+                               // Here we can directly compare double's 
because they aren't processed in any way, and are finite and (probably) nonzero.
+                               if(!addUnpickedLocsTo.contains(d))
+                                       addUnpickedLocsTo.add(d);
                        }
-               if(addUnpickedLocsTo != null && !chosen) {
-                       Double d = new Double(loc);
-                       // Here we can directly compare double's because they 
aren't processed in any way, and are finite and (probably) nonzero.
-                       if(!addUnpickedLocsTo.contains(d))
-                               addUnpickedLocsTo.add(d);
-               }
-        }
-               
+               }
+
                PeerNode best = closestNotBackedOff;
-               
-               if (best==null) {
+
+               if(best == null)
                        if(leastRecentlyTimedOut != null) {
                                // FIXME downgrade to DEBUG
                                best = leastRecentlyTimedOut;
-                               if(logMINOR) Logger.minor(this, "Using least 
recently failed in-timeout-period peer for key: "+best.shortToString()+" for 
"+key);
+                               if(logMINOR)
+                                       Logger.minor(this, "Using least 
recently failed in-timeout-period peer for key: " + best.shortToString() + " 
for " + key);
                        } else if(closestBackedOff != null) {
                                best = closestBackedOff;
-                               if(logMINOR) Logger.minor(this, "Using best 
backed-off peer for key: "+best.shortToString());
+                               if(logMINOR)
+                                       Logger.minor(this, "Using best 
backed-off peer for key: " + best.shortToString());
                        } else if(leastRecentlyTimedOutBackedOff != null) {
                                best = leastRecentlyTimedOutBackedOff;
-                               if(logMINOR) Logger.minor(this, "Using least 
recently failed in-timeout-period backed-off peer for key: 
"+best.shortToString()+" for "+key);
+                               if(logMINOR)
+                                       Logger.minor(this, "Using least 
recently failed in-timeout-period backed-off peer for key: " + 
best.shortToString() + " for " + key);
                        }
-               }
-               
+
                //racy... getLocation() could have changed
-       if (calculateMisrouting) {
-               if (best != null) {
-                       
node.nodeStats.routingMissDistance.report(Location.distance(best, 
closest.getLocation()));
-                       int numberOfConnected = 
getPeerNodeStatusSize(PEER_NODE_STATUS_CONNECTED, false);
-                       int numberOfRoutingBackedOff = 
getPeerNodeStatusSize(PEER_NODE_STATUS_ROUTING_BACKED_OFF, false);
-                       if (numberOfRoutingBackedOff + numberOfConnected > 0 ) {
-                               node.nodeStats.backedOffPercent.report((double) 
numberOfRoutingBackedOff / (double) (numberOfRoutingBackedOff + 
numberOfConnected));
-                       }
+               if(calculateMisrouting)
+                       if(best != null) {
+                               
node.nodeStats.routingMissDistance.report(Location.distance(best, 
closest.getLocation()));
+                               int numberOfConnected = 
getPeerNodeStatusSize(PEER_NODE_STATUS_CONNECTED, false);
+                               int numberOfRoutingBackedOff = 
getPeerNodeStatusSize(PEER_NODE_STATUS_ROUTING_BACKED_OFF, false);
+                               if(numberOfRoutingBackedOff + numberOfConnected 
> 0)
+                                       
node.nodeStats.backedOffPercent.report((double) numberOfRoutingBackedOff / 
(double) (numberOfRoutingBackedOff + numberOfConnected));
                        }
-       }
-               
+
                //racy... getLocation() could have changed
-               if (best!=null && addUnpickedLocsTo!=null) {
+               if(best != null && addUnpickedLocsTo != null)
                        //Add the location which we did not pick, if it exists.
-                       if (closestNotBackedOff!=null && closestBackedOff!=null)
+                       if(closestNotBackedOff != null && closestBackedOff != 
null)
                                addUnpickedLocsTo.add(new 
Double(closestBackedOff.getLocation()));
-               }
-               
-        return best;
-    }

-    /**
-     * @return Some status information
-     */
-    public String getStatus() {
-        StringBuffer sb = new StringBuffer();
-        PeerNode[] peers;
-        synchronized (this) {
-            peers = myPeers;                   
+               return best;
+       }
+
+       /**
+        * @return Some status information
+        */
+       public String getStatus() {
+               StringBuffer sb = new StringBuffer();
+               PeerNode[] peers;
+               synchronized(this) {
+                       peers = myPeers;
                }
-        String[] status = new String[peers.length];
-        for(int i=0;i<peers.length;i++) {
-            PeerNode pn = peers[i];
-            status[i] = pn.getStatus(true).toString();
-           Version.seenVersion(pn.getVersion());
-        }
-        Arrays.sort(status);
-        for(int i=0;i<status.length;i++) {
-            sb.append(status[i]);
-            sb.append('\n');
-        }
-        return sb.toString();
-    }
+               String[] status = new String[peers.length];
+               for(int i = 0; i < peers.length; i++) {
+                       PeerNode pn = peers[i];
+                       status[i] = pn.getStatus(true).toString();
+                       Version.seenVersion(pn.getVersion());
+               }
+               Arrays.sort(status);
+               for(int i = 0; i < status.length; i++) {
+                       sb.append(status[i]);
+                       sb.append('\n');
+               }
+               return sb.toString();
+       }

-    /**
-     * @return TMCI peer list
-     */
-    public String getTMCIPeerList() {
-        StringBuffer sb = new StringBuffer();
-        PeerNode[] peers;
-        synchronized (this) {
+       /**
+        * @return TMCI peer list
+        */
+       public String getTMCIPeerList() {
+               StringBuffer sb = new StringBuffer();
+               PeerNode[] peers;
+               synchronized(this) {
                        peers = myPeers;
                }
-        String[] peerList = new String[peers.length];
-        for(int i=0;i<peers.length;i++) {
-            PeerNode pn = peers[i];
-            peerList[i] = pn.getTMCIPeerInfo();
-        }
-        Arrays.sort(peerList);
-        for(int i=0;i<peerList.length;i++) {
-            sb.append(peerList[i]);
-            sb.append('\n');
-        }
-        return sb.toString();
-    }
+               String[] peerList = new String[peers.length];
+               for(int i = 0; i < peers.length; i++) {
+                       PeerNode pn = peers[i];
+                       peerList[i] = pn.getTMCIPeerInfo();
+               }
+               Arrays.sort(peerList);
+               for(int i = 0; i < peerList.length; i++) {
+                       sb.append(peerList[i]);
+                       sb.append('\n');
+               }
+               return sb.toString();
+       }

-    public String getFreevizOutput() {
-        StringBuffer sb = new StringBuffer();
-        PeerNode[] peers;
-        synchronized (this) {
+       public String getFreevizOutput() {
+               StringBuffer sb = new StringBuffer();
+               PeerNode[] peers;
+               synchronized(this) {
                        peers = myPeers;
                }
-        String[] identity = new String[peers.length];
-        for(int i=0;i<peers.length;i++) {
-            PeerNode pn = peers[i];
-            identity[i] = pn.getFreevizOutput();
-        }
-        Arrays.sort(identity);
-        for(int i=0;i<identity.length;i++) {
-            sb.append(identity[i]);
-            sb.append('\n');
-        }
-        return sb.toString();
-    }
+               String[] identity = new String[peers.length];
+               for(int i = 0; i < peers.length; i++) {
+                       PeerNode pn = peers[i];
+                       identity[i] = pn.getFreevizOutput();
+               }
+               Arrays.sort(identity);
+               for(int i = 0; i < identity.length; i++) {
+                       sb.append(identity[i]);
+                       sb.append('\n');
+               }
+               return sb.toString();
+       }
+       private final Object writePeersSync = new Object();

-    private final Object writePeersSync = new Object();
-    
-    void writePeers() {
-       node.ps.queueTimedJob(new Runnable() {
+       void writePeers() {
+               node.ps.queueTimedJob(new Runnable() {
+
                        public void run() {
                                writePeersInner();
                        }
-       }, 0);
-    }
+               }, 0);
+       }

-    private void writePeersInner() {
-                   synchronized(writePeersSync) {
-                           if(darkFilename != null)
-                                   writePeersInner(darkFilename, 
getDarknetPeers());
-                           OpennetManager om = node.getOpennet();
-                           if(om != null) {
-                                   if(openFilename != null)
-                                           writePeersInner(openFilename, 
getOpennetPeers());
-                                   writePeersInner(om.getOldPeersFilename(), 
om.getOldPeers());
-                           }
-                   }
-    }
-    
-    /**
-     * Write the peers file to disk
-     */
-    private void writePeersInner(String filename, PeerNode[] peers) {
-        synchronized (writePeersSync) {
-            FileOutputStream fos = null;
-            String f = filename + ".bak";
-            try {
-                fos = new FileOutputStream(f);
-            } catch (FileNotFoundException e2) {
-                Logger.error(this, "Cannot write peers to disk: Cannot create "
-                        + f + " - " + e2, e2);
-               Closer.close(fos);
-                return;
-            }
-            OutputStreamWriter w = null;
+       private void writePeersInner() {
+               synchronized(writePeersSync) {
+                       if(darkFilename != null)
+                               writePeersInner(darkFilename, 
getDarknetPeers());
+                       OpennetManager om = node.getOpennet();
+                       if(om != null) {
+                               if(openFilename != null)
+                                       writePeersInner(openFilename, 
getOpennetPeers());
+                               writePeersInner(om.getOldPeersFilename(), 
om.getOldPeers());
+                       }
+               }
+       }
+
+       /**
+        * Write the peers file to disk
+        */
+       private void writePeersInner(String filename, PeerNode[] peers) {
+               synchronized(writePeersSync) {
+                       FileOutputStream fos = null;
+                       String f = filename + ".bak";
                        try {
+                               fos = new FileOutputStream(f);
+                       } catch(FileNotFoundException e2) {
+                               Logger.error(this, "Cannot write peers to disk: 
Cannot create " + f + " - " + e2, e2);
+                               Closer.close(fos);
+                               return;
+                       }
+                       OutputStreamWriter w = null;
+                       try {
                                w = new OutputStreamWriter(fos, "UTF-8");
-                       } catch (UnsupportedEncodingException e2) {
+                       } catch(UnsupportedEncodingException e2) {
                                Closer.close(w);
                                throw new Error("Impossible: JVM doesn't 
support UTF-8: " + e2, e2);
                        }
-            BufferedWriter bw = new BufferedWriter(w);
-            try {
-               boolean succeeded = writePeers(bw, peers);
-                bw.close(); bw = null;
-                if(!succeeded) return;
-               
-               File fnam = new File(filename);
-               FileUtil.renameTo(new File(f), fnam);
-            } catch (IOException e) {
-               try {
-                       fos.close();
-               } catch (IOException e1) {
-                       Logger.error(this, "Cannot close peers file: "+e, e);
-               }
-                Logger.error(this, "Cannot write file: " + e, e);
-                return; // don't overwrite old file!
-            } finally {
-                   Closer.close(bw);
-                   Closer.close(fos);
-           }
-        }
-    }
+                       BufferedWriter bw = new BufferedWriter(w);
+                       try {
+                               boolean succeeded = writePeers(bw, peers);
+                               bw.close();
+                               bw = null;
+                               if(!succeeded)
+                                       return;

-    public boolean writePeers(Writer bw) {
-       if(!writePeers(bw, getDarknetPeers())) return false;
-       if(!writePeers(bw, getOpennetPeers())) return false;
-       return true;
-    }
-    
+                               File fnam = new File(filename);
+                               FileUtil.renameTo(new File(f), fnam);
+                       } catch(IOException e) {
+                               try {
+                                       fos.close();
+                               } catch(IOException e1) {
+                                       Logger.error(this, "Cannot close peers 
file: " + e, e);
+                               }
+                               Logger.error(this, "Cannot write file: " + e, 
e);
+                               return; // don't overwrite old file!
+                       } finally {
+                               Closer.close(bw);
+                               Closer.close(fos);
+                       }
+               }
+       }
+
+       public boolean writePeers(Writer bw) {
+               if(!writePeers(bw, getDarknetPeers()))
+                       return false;
+               if(!writePeers(bw, getOpennetPeers()))
+                       return false;
+               return true;
+       }
+
        public boolean writePeers(Writer bw, PeerNode[] peers) {
-        for (int i = 0; i < peers.length; i++) {
-            try {
-                peers[i].write(bw);
-                bw.flush();
-            } catch (IOException e) {
-                try {
-                    bw.close();
-                } catch (IOException e1) {
-                    Logger.error(this, "Cannot close file!: " + e1, e1);
-                }
-                Logger.error(this, "Cannot write peers to disk: " + e, e);
-                return false;
-            }
-        }
-        return true;
+               for(int i = 0; i < peers.length; i++) {
+                       try {
+                               peers[i].write(bw);
+                               bw.flush();
+                       } catch(IOException e) {
+                               try {
+                                       bw.close();
+                               } catch(IOException e1) {
+                                       Logger.error(this, "Cannot close file!: 
" + e1, e1);
+                               }
+                               Logger.error(this, "Cannot write peers to disk: 
" + e, e);
+                               return false;
+                       }
+               }
+               return true;
        }

        /**
@@ -1094,7 +1154,8 @@
         * Also run the node's onConnectedPeers() method if applicable
         */
        public void updatePMUserAlert() {
-               if(ua == null) return;
+               if(ua == null)
+                       return;
                int peers, darknetPeers, opennetPeers;
                synchronized(this) {
                        darknetPeers = this.getDarknetPeers().length;
@@ -1102,7 +1163,7 @@
                        peers = darknetPeers + opennetPeers; // Seednodes don't 
count.
                }
                OpennetManager om = node.getOpennet();
-               
+
                boolean opennetDefinitelyPortForwarded;
                boolean opennetEnabled;
                boolean opennetAssumeNAT;
@@ -1140,11 +1201,12 @@

        public boolean anyConnectedPeers() {
                PeerNode[] conns;
-               synchronized (this) {
+               synchronized(this) {
                        conns = connectedPeers;
                }
-               for(int i=0;i<conns.length;i++) {
-                       if(conns[i].isRoutable()) return true;
+               for(int i = 0; i < conns.length; i++) {
+                       if(conns[i].isRoutable())
+                               return true;
                }
                return false;
        }
@@ -1154,10 +1216,10 @@
         */
        public void readExtraPeerData() {
                DarknetPeerNode[] peers = getDarknetPeers();
-               for (int i = 0; i < peers.length; i++) {
+               for(int i = 0; i < peers.length; i++) {
                        try {
                                peers[i].readExtraPeerData();
-                       } catch (Exception e) {
+                       } catch(Exception e) {
                                Logger.error(this, "Got exception while reading 
extra peer data", e);
                        }
                }
@@ -1167,136 +1229,133 @@
        }

        public void start() {
-        ua = new PeerManagerUserAlert(node.nodeStats);
-        updatePMUserAlert();
+               ua = new PeerManagerUserAlert(node.nodeStats);
+               updatePMUserAlert();
                node.clientCore.alerts.register(ua);
        }
-       
+
        public int countNonBackedOffPeers() {
                PeerNode[] peers;
                synchronized(this) {
                        peers = connectedPeers; // even if myPeers peers are 
connected they won't be routed to
                }
                int countNoBackoff = 0;
-               for(int i=0;i<peers.length;i++) {
-                       if(peers[i].isRoutable()) {
-                               if(!peers[i].isRoutingBackedOff()) 
countNoBackoff++;
-                       }
+               for(int i = 0; i < peers.length; i++) {
+                       if(peers[i].isRoutable())
+                               if(!peers[i].isRoutingBackedOff())
+                                       countNoBackoff++;
                }
                return countNoBackoff;
        }
-       
        // Stats stuff
-       
        /**
         * Update oldestNeverConnectedPeerAge if the timer has expired
         */
        public void maybeUpdateOldestNeverConnectedPeerAge(long now) {
                synchronized(this) {
-                       if(now <= nextOldestNeverConnectedPeerAgeUpdateTime) 
return;
+                       if(now <= nextOldestNeverConnectedPeerAgeUpdateTime)
+                               return;
                        nextOldestNeverConnectedPeerAgeUpdateTime = now + 
oldestNeverConnectedPeerAgeUpdateInterval;
                }
                oldestNeverConnectedPeerAge = 0;
                PeerNode[] peerList = myPeers;
-               for(int i=0;i<peerList.length;i++) {
+               for(int i = 0; i < peerList.length; i++) {
                        PeerNode pn = peerList[i];
-                       if(pn.getPeerNodeStatus() == 
PEER_NODE_STATUS_NEVER_CONNECTED) {
-                               if((now - pn.getPeerAddedTime()) > 
oldestNeverConnectedPeerAge) {
+                       if(pn.getPeerNodeStatus() == 
PEER_NODE_STATUS_NEVER_CONNECTED)
+                               if((now - pn.getPeerAddedTime()) > 
oldestNeverConnectedPeerAge)
                                        oldestNeverConnectedPeerAge = now - 
pn.getPeerAddedTime();
-                               }
-                       }
                }
                if(oldestNeverConnectedPeerAge > 0 && logMINOR)
-                       Logger.minor(this, "Oldest never connected peer is 
"+oldestNeverConnectedPeerAge+"ms old");
+                       Logger.minor(this, "Oldest never connected peer is " + 
oldestNeverConnectedPeerAge + "ms old");
                nextOldestNeverConnectedPeerAgeUpdateTime = now + 
oldestNeverConnectedPeerAgeUpdateInterval;
        }

        public long getOldestNeverConnectedPeerAge() {
-         return oldestNeverConnectedPeerAge;
+               return oldestNeverConnectedPeerAge;
        }

        /**
         * Log the current PeerNode status summary if the timer has expired
         */
        public void maybeLogPeerNodeStatusSummary(long now) {
-         if(now > nextPeerNodeStatusLogTime) {
-               if((now - nextPeerNodeStatusLogTime) > (10*1000) && 
nextPeerNodeStatusLogTime > 0)
-                 Logger.error(this,"maybeLogPeerNodeStatusSummary() not called 
for more than 10 seconds ("+(now - nextPeerNodeStatusLogTime)+").  PacketSender 
getting bogged down or something?");
-               
-               int numberOfConnected = 0;
-               int numberOfRoutingBackedOff = 0;
-               int numberOfTooNew = 0;
-               int numberOfTooOld = 0;
-               int numberOfDisconnected = 0;
-               int numberOfNeverConnected = 0;
-               int numberOfDisabled = 0;
-               int numberOfListenOnly = 0;
-               int numberOfListening = 0;
-               int numberOfBursting = 0;
-               int numberOfClockProblem = 0;
-               int numberOfConnError = 0;
-               int numberOfDisconnecting = 0;
-               int numberOfRoutingDisabled = 0;
-               
-               PeerNodeStatus[] pns = getPeerNodeStatuses(true);
-               
-               for(int i=0; i<pns.length; i++){
-                       if(pns[i] == null) {
-                               Logger.error(this, 
"getPeerNodeStatuses(true)["+i+"] == null!");
-                               continue;
+               if(now > nextPeerNodeStatusLogTime) {
+                       if((now - nextPeerNodeStatusLogTime) > (10 * 1000) && 
nextPeerNodeStatusLogTime > 0)
+                               Logger.error(this, 
"maybeLogPeerNodeStatusSummary() not called for more than 10 seconds (" + (now 
- nextPeerNodeStatusLogTime) + ").  PacketSender getting bogged down or 
something?");
+
+                       int numberOfConnected = 0;
+                       int numberOfRoutingBackedOff = 0;
+                       int numberOfTooNew = 0;
+                       int numberOfTooOld = 0;
+                       int numberOfDisconnected = 0;
+                       int numberOfNeverConnected = 0;
+                       int numberOfDisabled = 0;
+                       int numberOfListenOnly = 0;
+                       int numberOfListening = 0;
+                       int numberOfBursting = 0;
+                       int numberOfClockProblem = 0;
+                       int numberOfConnError = 0;
+                       int numberOfDisconnecting = 0;
+                       int numberOfRoutingDisabled = 0;
+
+                       PeerNodeStatus[] pns = getPeerNodeStatuses(true);
+
+                       for(int i = 0; i < pns.length; i++) {
+                               if(pns[i] == null) {
+                                       Logger.error(this, 
"getPeerNodeStatuses(true)[" + i + "] == null!");
+                                       continue;
+                               }
+                               switch(pns[i].getStatusValue()) {
+                                       case PEER_NODE_STATUS_CONNECTED:
+                                               numberOfConnected++;
+                                               break;
+                                       case 
PEER_NODE_STATUS_ROUTING_BACKED_OFF:
+                                               numberOfRoutingBackedOff++;
+                                               break;
+                                       case PEER_NODE_STATUS_TOO_NEW:
+                                               numberOfTooNew++;
+                                               break;
+                                       case PEER_NODE_STATUS_TOO_OLD:
+                                               numberOfTooOld++;
+                                               break;
+                                       case PEER_NODE_STATUS_DISCONNECTED:
+                                               numberOfDisconnected++;
+                                               break;
+                                       case PEER_NODE_STATUS_NEVER_CONNECTED:
+                                               numberOfNeverConnected++;
+                                               break;
+                                       case PEER_NODE_STATUS_DISABLED:
+                                               numberOfDisabled++;
+                                               break;
+                                       case PEER_NODE_STATUS_LISTEN_ONLY:
+                                               numberOfListenOnly++;
+                                               break;
+                                       case PEER_NODE_STATUS_LISTENING:
+                                               numberOfListening++;
+                                               break;
+                                       case PEER_NODE_STATUS_BURSTING:
+                                               numberOfBursting++;
+                                               break;
+                                       case PEER_NODE_STATUS_CLOCK_PROBLEM:
+                                               numberOfClockProblem++;
+                                               break;
+                                       case PEER_NODE_STATUS_CONN_ERROR:
+                                               numberOfConnError++;
+                                               break;
+                                       case PEER_NODE_STATUS_DISCONNECTING:
+                                               numberOfDisconnecting++;
+                                               break;
+                                       case PEER_NODE_STATUS_ROUTING_DISABLED:
+                                               numberOfRoutingDisabled++;
+                                               break;
+                                       default:
+                                               Logger.error(this, "Unknown 
peer status value : " + pns[i].getStatusValue());
+                                               break;
+                               }
                        }
-                       switch (pns[i].getStatusValue()) {
-                       case PEER_NODE_STATUS_CONNECTED:
-                               numberOfConnected++;
-                               break;
-                       case PEER_NODE_STATUS_ROUTING_BACKED_OFF:
-                               numberOfRoutingBackedOff++;
-                               break;
-                       case PEER_NODE_STATUS_TOO_NEW:
-                               numberOfTooNew++;
-                               break;
-                       case PEER_NODE_STATUS_TOO_OLD:
-                               numberOfTooOld++;
-                               break;
-                       case PEER_NODE_STATUS_DISCONNECTED:
-                               numberOfDisconnected++;
-                               break;
-                       case PEER_NODE_STATUS_NEVER_CONNECTED:
-                               numberOfNeverConnected++;
-                               break;
-                       case PEER_NODE_STATUS_DISABLED:
-                               numberOfDisabled++;
-                               break;
-                       case PEER_NODE_STATUS_LISTEN_ONLY:
-                               numberOfListenOnly++;
-                               break;
-                       case PEER_NODE_STATUS_LISTENING:
-                               numberOfListening++;
-                               break;
-                       case PEER_NODE_STATUS_BURSTING:
-                               numberOfBursting++;
-                               break;
-                       case PEER_NODE_STATUS_CLOCK_PROBLEM:
-                               numberOfClockProblem++;
-                               break;
-                       case PEER_NODE_STATUS_CONN_ERROR:
-                               numberOfConnError++;
-                               break;
-                       case PEER_NODE_STATUS_DISCONNECTING:
-                               numberOfDisconnecting++;
-                               break;
-                       case PEER_NODE_STATUS_ROUTING_DISABLED:
-                               numberOfRoutingDisabled++;
-                               break;
-                       default:
-                               Logger.error(this, "Unknown peer status value : 
"+pns[i].getStatusValue());
-                               break;
-                       }
+                       Logger.normal(this, "Connected: " + numberOfConnected + 
"  Routing Backed Off: " + numberOfRoutingBackedOff + "  Too New: " + 
numberOfTooNew + "  Too Old: " + numberOfTooOld + "  Disconnected: " + 
numberOfDisconnected + "  Never Connected: " + numberOfNeverConnected + "  
Disabled: " + numberOfDisabled + "  Bursting: " + numberOfBursting + "  
Listening: " + numberOfListening + "  Listen Only: " + numberOfListenOnly + "  
Clock Problem: " + numberOfClockProblem + "  Connection Problem: " + 
numberOfConnError + "  Disconnecting: " + numberOfDisconnecting);
+                       nextPeerNodeStatusLogTime = now + 
peerNodeStatusLogInterval;
+                       node.displayClockProblemUserAlert(numberOfClockProblem 
> 2);
                }
-               Logger.normal(this, "Connected: "+numberOfConnected+"  Routing 
Backed Off: "+numberOfRoutingBackedOff+"  Too New: "+numberOfTooNew+"  Too Old: 
"+numberOfTooOld+"  Disconnected: "+numberOfDisconnected+"  Never Connected: 
"+numberOfNeverConnected+"  Disabled: "+numberOfDisabled+"  Bursting: 
"+numberOfBursting+"  Listening: "+numberOfListening+"  Listen Only: 
"+numberOfListenOnly+"  Clock Problem: "+numberOfClockProblem+"  Connection 
Problem: "+numberOfConnError+"  Disconnecting: "+numberOfDisconnecting);
-               nextPeerNodeStatusLogTime = now + peerNodeStatusLogInterval;
-               node.displayClockProblemUserAlert(numberOfClockProblem > 2);
-               }
        }

        /**
@@ -1315,14 +1374,15 @@
                        if(statuses.containsKey(peerNodeStatus)) {
                                statusSet = (HashSet) 
statuses.get(peerNodeStatus);
                                if(statusSet.contains(peerNode)) {
-                                       if(!noLog) Logger.error(this, 
"addPeerNodeStatus(): node already in peerNodeStatuses: "+peerNode+" status 
"+PeerNode.getPeerNodeStatusString(peerNodeStatus.intValue()));
+                                       if(!noLog)
+                                               Logger.error(this, 
"addPeerNodeStatus(): node already in peerNodeStatuses: " + peerNode + " status 
" + PeerNode.getPeerNodeStatusString(peerNodeStatus.intValue()));
                                        return;
                                }
                                statuses.remove(peerNodeStatus);
-                       } else {
+                       } else
                                statusSet = new HashSet();
-                       }
-                       if(logMINOR) Logger.minor(this, "addPeerNodeStatus(): 
adding PeerNode for '"+peerNode.getIdentityString()+"' with status 
'"+PeerNode.getPeerNodeStatusString(peerNodeStatus.intValue())+"'");
+                       if(logMINOR)
+                               Logger.minor(this, "addPeerNodeStatus(): adding 
PeerNode for '" + peerNode.getIdentityString() + "' with status '" + 
PeerNode.getPeerNodeStatusString(peerNodeStatus.intValue()) + "'");
                        statusSet.add(peerNode);
                        statuses.put(peerNodeStatus, statusSet);
                }
@@ -1337,11 +1397,10 @@
                HashSet statusSet = null;
                HashMap statuses = darknet ? peerNodeStatusesDarknet : 
this.peerNodeStatuses;
                synchronized(statuses) {
-                       if(statuses.containsKey(peerNodeStatus)) {
+                       if(statuses.containsKey(peerNodeStatus))
                                statusSet = (HashSet) 
statuses.get(peerNodeStatus);
-                       } else {
+                       else
                                statusSet = new HashSet();
-                       }
                        return statusSet.size();
                }
        }
@@ -1364,18 +1423,17 @@
                                statusSet = (HashSet) 
statuses.get(peerNodeStatus);
                                if(!statusSet.contains(peerNode)) {
                                        if(!noLog)
-                                               Logger.error(this, 
"removePeerNodeStatus(): identity '"+peerNode.getIdentityString()+" for 
"+peerNode.shortToString()+"' not in peerNodeStatuses with status 
'"+PeerNode.getPeerNodeStatusString(peerNodeStatus.intValue())+"'", new 
Exception("debug"));
+                                               Logger.error(this, 
"removePeerNodeStatus(): identity '" + peerNode.getIdentityString() + " for " + 
peerNode.shortToString() + "' not in peerNodeStatuses with status '" + 
PeerNode.getPeerNodeStatusString(peerNodeStatus.intValue()) + "'", new 
Exception("debug"));
                                        return;
                                }
                                if(statuses.isEmpty())
                                        statuses.remove(peerNodeStatus);
-                       } else {
+                       } else
                                statusSet = new HashSet();
-                       }
-                       if(logMINOR) Logger.minor(this, 
"removePeerNodeStatus(): removing PeerNode for 
'"+peerNode.getIdentityString()+"' with status 
'"+PeerNode.getPeerNodeStatusString(peerNodeStatus.intValue())+"'");
-                       if(statusSet.contains(peerNode)) {
+                       if(logMINOR)
+                               Logger.minor(this, "removePeerNodeStatus(): 
removing PeerNode for '" + peerNode.getIdentityString() + "' with status '" + 
PeerNode.getPeerNodeStatusString(peerNodeStatus.intValue()) + "'");
+                       if(statusSet.contains(peerNode))
                                statusSet.remove(peerNode);
-                       }
                }
        }

@@ -1388,31 +1446,31 @@
                        
if(peerNodeRoutingBackoffReasons.containsKey(peerNodeRoutingBackoffReason)) {
                                reasonSet = (HashSet) 
peerNodeRoutingBackoffReasons.get(peerNodeRoutingBackoffReason);
                                if(reasonSet.contains(peerNode)) {
-                                       Logger.error(this, 
"addPeerNodeRoutingBackoffReason(): identity '"+peerNode.getIdentityString()+"' 
already in peerNodeRoutingBackoffReasons as "+peerNode.getPeer()+" with status 
code "+peerNodeRoutingBackoffReason);
+                                       Logger.error(this, 
"addPeerNodeRoutingBackoffReason(): identity '" + peerNode.getIdentityString() 
+ "' already in peerNodeRoutingBackoffReasons as " + peerNode.getPeer() + " 
with status code " + peerNodeRoutingBackoffReason);
                                        return;
                                }
                                
peerNodeRoutingBackoffReasons.remove(peerNodeRoutingBackoffReason);
-                       } else {
+                       } else
                                reasonSet = new HashSet();
-                       }
-                       if(logMINOR) Logger.minor(this, 
"addPeerNodeRoutingBackoffReason(): adding PeerNode for 
'"+peerNode.getIdentityString()+"' with status code 
"+peerNodeRoutingBackoffReason);
+                       if(logMINOR)
+                               Logger.minor(this, 
"addPeerNodeRoutingBackoffReason(): adding PeerNode for '" + 
peerNode.getIdentityString() + "' with status code " + 
peerNodeRoutingBackoffReason);
                        reasonSet.add(peerNode);
                        
peerNodeRoutingBackoffReasons.put(peerNodeRoutingBackoffReason, reasonSet);
                }
        }
-       
+
        /**
         * What are the currently tracked PeerNode routing backoff reasons?
         */
-       public String [] getPeerNodeRoutingBackoffReasons() {
-               String [] reasonStrings;
+       public String[] getPeerNodeRoutingBackoffReasons() {
+               String[] reasonStrings;
                synchronized(peerNodeRoutingBackoffReasons) {
-                       reasonStrings = (String []) 
peerNodeRoutingBackoffReasons.keySet().toArray(new 
String[peerNodeRoutingBackoffReasons.size()]);
+                       reasonStrings = (String[]) 
peerNodeRoutingBackoffReasons.keySet().toArray(new 
String[peerNodeRoutingBackoffReasons.size()]);
                }
                Arrays.sort(reasonStrings);
                return reasonStrings;
        }
-       
+
        /**
         * How many PeerNodes have a particular routing backoff reason?
         */
@@ -1422,9 +1480,8 @@
                        
if(peerNodeRoutingBackoffReasons.containsKey(peerNodeRoutingBackoffReason)) {
                                reasonSet = (HashSet) 
peerNodeRoutingBackoffReasons.get(peerNodeRoutingBackoffReason);
                                return reasonSet.size();
-                       } else {
+                       } else
                                return 0;
-                       }
                }
        }

@@ -1437,48 +1494,46 @@
                        
if(peerNodeRoutingBackoffReasons.containsKey(peerNodeRoutingBackoffReason)) {
                                reasonSet = (HashSet) 
peerNodeRoutingBackoffReasons.get(peerNodeRoutingBackoffReason);
                                if(!reasonSet.contains(peerNode)) {
-                                       Logger.error(this, 
"removePeerNodeRoutingBackoffReason(): identity 
'"+peerNode.getIdentityString()+"' not in peerNodeRoutingBackoffReasons with 
status code "+peerNodeRoutingBackoffReason, new Exception("debug"));
+                                       Logger.error(this, 
"removePeerNodeRoutingBackoffReason(): identity '" + 
peerNode.getIdentityString() + "' not in peerNodeRoutingBackoffReasons with 
status code " + peerNodeRoutingBackoffReason, new Exception("debug"));
                                        return;
                                }
                                
peerNodeRoutingBackoffReasons.remove(peerNodeRoutingBackoffReason);
-                       } else {
+                       } else
                                reasonSet = new HashSet();
-                       }
-                       if(logMINOR) Logger.minor(this, 
"removePeerNodeRoutingBackoffReason(): removing PeerNode for 
'"+peerNode.getIdentityString()+"' with status code 
"+peerNodeRoutingBackoffReason);
-                       if(reasonSet.contains(peerNode)) {
+                       if(logMINOR)
+                               Logger.minor(this, 
"removePeerNodeRoutingBackoffReason(): removing PeerNode for '" + 
peerNode.getIdentityString() + "' with status code " + 
peerNodeRoutingBackoffReason);
+                       if(reasonSet.contains(peerNode))
                                reasonSet.remove(peerNode);
-                       }
-                       if(reasonSet.size() > 0) {
+                       if(reasonSet.size() > 0)
                                
peerNodeRoutingBackoffReasons.put(peerNodeRoutingBackoffReason, reasonSet);
-                       }
                }
        }

        public PeerNodeStatus[] getPeerNodeStatuses(boolean noHeavy) {
-        PeerNode[] peers;
-        synchronized (this) {
+               PeerNode[] peers;
+               synchronized(this) {
                        peers = myPeers;
                }
                PeerNodeStatus[] _peerNodeStatuses = new 
PeerNodeStatus[peers.length];
-               for (int peerIndex = 0, peerCount = peers.length; peerIndex < 
peerCount; peerIndex++) {
+               for(int peerIndex = 0, peerCount = peers.length; peerIndex < 
peerCount; peerIndex++) {
                        _peerNodeStatuses[peerIndex] = 
peers[peerIndex].getStatus(noHeavy);
                }
                return _peerNodeStatuses;
        }

        public DarknetPeerNodeStatus[] getDarknetPeerNodeStatuses(boolean 
noHeavy) {
-        DarknetPeerNode[] peers = getDarknetPeers();
+               DarknetPeerNode[] peers = getDarknetPeers();
                DarknetPeerNodeStatus[] _peerNodeStatuses = new 
DarknetPeerNodeStatus[peers.length];
-               for (int peerIndex = 0, peerCount = peers.length; peerIndex < 
peerCount; peerIndex++) {
+               for(int peerIndex = 0, peerCount = peers.length; peerIndex < 
peerCount; peerIndex++) {
                        _peerNodeStatuses[peerIndex] = (DarknetPeerNodeStatus) 
peers[peerIndex].getStatus(noHeavy);
                }
                return _peerNodeStatuses;
        }

        public OpennetPeerNodeStatus[] getOpennetPeerNodeStatuses(boolean 
noHeavy) {
-        OpennetPeerNode[] peers = getOpennetPeers();
+               OpennetPeerNode[] peers = getOpennetPeers();
                OpennetPeerNodeStatus[] _peerNodeStatuses = new 
OpennetPeerNodeStatus[peers.length];
-               for (int peerIndex = 0, peerCount = peers.length; peerIndex < 
peerCount; peerIndex++) {
+               for(int peerIndex = 0, peerCount = peers.length; peerIndex < 
peerCount; peerIndex++) {
                        _peerNodeStatuses[peerIndex] = (OpennetPeerNodeStatus) 
peers[peerIndex].getStatus(noHeavy);
                }
                return _peerNodeStatuses;
@@ -1489,16 +1544,17 @@
         */
        public void maybeUpdatePeerNodeRoutableConnectionStats(long now) {
                synchronized(this) {
-                       if(now <= nextRoutableConnectionStatsUpdateTime) return;
+                       if(now <= nextRoutableConnectionStatsUpdateTime)
+                               return;
                        nextRoutableConnectionStatsUpdateTime = now + 
routableConnectionStatsUpdateInterval;
                }
-               if(-1 != nextRoutableConnectionStatsUpdateTime) {
+               if(-1 != nextRoutableConnectionStatsUpdateTime) {
                        PeerNode[] peerList = myPeers;
-                       for(int i=0;i<peerList.length;i++) {
+                       for(int i = 0; i < peerList.length; i++) {
                                PeerNode pn = peerList[i];
                                pn.checkRoutableConnectionStatus();
                        }
-               }
+               }
        }

        /**
@@ -1512,11 +1568,11 @@
                }
                // FIXME optimise! Maybe maintain as a separate list?
                Vector v = new Vector(myPeers.length);
-               for(int i=0;i<peers.length;i++) {
+               for(int i = 0; i < peers.length; i++) {
                        if(peers[i] instanceof DarknetPeerNode)
                                v.add(peers[i]);
                }
-               return (DarknetPeerNode[])v.toArray(new 
DarknetPeerNode[v.size()]);
+               return (DarknetPeerNode[]) v.toArray(new 
DarknetPeerNode[v.size()]);
        }

        public Vector getConnectedSeedServerPeersVector(HashSet exclude) {
@@ -1526,16 +1582,16 @@
                }
                // FIXME optimise! Maybe maintain as a separate list?
                Vector v = new Vector(myPeers.length);
-               for(int i=0;i<peers.length;i++) {
+               for(int i = 0; i < peers.length; i++) {
                        if(peers[i] instanceof SeedServerPeerNode) {
                                if(exclude != null && 
exclude.contains(peers[i].getIdentity())) {
                                        if(logMINOR)
-                                               Logger.minor(this, "Not 
including in getConnectedSeedServerPeersVector() as in exclude set: 
"+peers[i].userToString());
+                                               Logger.minor(this, "Not 
including in getConnectedSeedServerPeersVector() as in exclude set: " + 
peers[i].userToString());
                                        continue;
                                }
                                if(!peers[i].isConnected()) {
                                        if(logMINOR)
-                                               Logger.minor(this, "Not 
including in getConnectedSeedServerPeersVector() as disconnected: 
"+peers[i].userToString());
+                                               Logger.minor(this, "Not 
including in getConnectedSeedServerPeersVector() as disconnected: " + 
peers[i].userToString());
                                        continue;
                                }
                                v.add(peers[i]);
@@ -1543,7 +1599,7 @@
                }
                return v;
        }
-       
+
        public Vector getSeedServerPeersVector() {
                PeerNode[] peers;
                synchronized(this) {
@@ -1551,14 +1607,13 @@
                }
                // FIXME optimise! Maybe maintain as a separate list?
                Vector v = new Vector(myPeers.length);
-               for(int i=0;i<peers.length;i++) {
-                       if(peers[i] instanceof SeedServerPeerNode) {
+               for(int i = 0; i < peers.length; i++) {
+                       if(peers[i] instanceof SeedServerPeerNode)
                                v.add(peers[i]);
-                       }
                }
                return v;
        }
-       
+
        /**
         * Get the opennet peers list.
         */
@@ -1569,11 +1624,11 @@
                }
                // FIXME optimise! Maybe maintain as a separate list?
                Vector v = new Vector(myPeers.length);
-               for(int i=0;i<peers.length;i++) {
+               for(int i = 0; i < peers.length; i++) {
                        if(peers[i] instanceof OpennetPeerNode)
                                v.add(peers[i]);
                }
-               return (OpennetPeerNode[])v.toArray(new 
OpennetPeerNode[v.size()]);
+               return (OpennetPeerNode[]) v.toArray(new 
OpennetPeerNode[v.size()]);
        }

        public boolean anyConnectedPeerHasAddress(FreenetInetAddress addr, 
PeerNode pn) {
@@ -1581,12 +1636,16 @@
                synchronized(this) {
                        peers = myPeers;
                }
-               for(int i=0;i<peers.length;i++) {
-                       if(peers[i] == pn) continue;
-                       if(!peers[i].isConnected()) continue;
-                       if(!peers[i].isRealConnection()) continue; // Ignore 
non-searchable peers i.e. bootstrapping peers
+               for(int i = 0; i < peers.length; i++) {
+                       if(peers[i] == pn)
+                               continue;
+                       if(!peers[i].isConnected())
+                               continue;
+                       if(!peers[i].isRealConnection())
+                               continue; // Ignore non-searchable peers i.e. 
bootstrapping peers
                        // If getPeer() is null then presumably !isConnected().
-                       if(peers[i].getPeer().getFreenetAddress().equals(addr)) 
return true;
+                       if(peers[i].getPeer().getFreenetAddress().equals(addr))
+                               return true;
                }
                return false;
        }
@@ -1595,11 +1654,13 @@
                synchronized(this) {
                        Vector keep = new Vector();
                        Vector conn = new Vector();
-                       for(int i=0;i<myPeers.length;i++) {
+                       for(int i = 0; i < myPeers.length; i++) {
                                PeerNode pn = myPeers[i];
-                               if(pn instanceof OpennetPeerNode) continue;
+                               if(pn instanceof OpennetPeerNode)
+                                       continue;
                                keep.add(pn);
-                               if(pn.isConnected()) conn.add(pn);
+                               if(pn.isConnected())
+                                       conn.add(pn);
                        }
                        myPeers = (PeerNode[]) keep.toArray(new 
PeerNode[keep.size()]);
                        connectedPeers = (PeerNode[]) keep.toArray(new 
PeerNode[conn.size()]);
@@ -1608,78 +1669,98 @@
        }

        public PeerNode containsPeer(PeerNode pn) {
-               PeerNode[] peers = pn.isOpennet() ? 
((PeerNode[])getOpennetPeers()) : ((PeerNode[])getDarknetPeers());
-               
-               for(int i=0;i<peers.length;i++)
-                       if(Arrays.equals(pn.getIdentity(), 
peers[i].getIdentity())) return peers[i];
-               
+               PeerNode[] peers = pn.isOpennet() ? ((PeerNode[]) 
getOpennetPeers()) : ((PeerNode[]) getDarknetPeers());
+
+               for(int i = 0; i < peers.length; i++)
+                       if(Arrays.equals(pn.getIdentity(), 
peers[i].getIdentity()))
+                               return peers[i];
+
                return null;
        }

        public int quickCountConnectedPeers() {
                PeerNode[] conns = connectedPeers;
-               if(conns == null) return 0;
+               if(conns == null)
+                       return 0;
                return connectedPeers.length;
        }

        public int countConnectedDarknetPeers() {
                int count = 0;
                PeerNode[] peers = myPeers;
-               for(int i=0;i<peers.length;i++) {
-                       if(peers[i] == null) continue;
-                       if(!(peers[i] instanceof DarknetPeerNode)) continue;
-                       if(peers[i].isOpennet()) continue;
-                       if(!peers[i].isRoutable()) continue;
+               for(int i = 0; i < peers.length; i++) {
+                       if(peers[i] == null)
+                               continue;
+                       if(!(peers[i] instanceof DarknetPeerNode))
+                               continue;
+                       if(peers[i].isOpennet())
+                               continue;
+                       if(!peers[i].isRoutable())
+                               continue;
                        count++;
                }
                return count;
        }
-       
+
        public int countConnectedPeers() {
                int count = 0;
                PeerNode[] peers = myPeers;
-               for(int i=0;i<peers.length;i++) {
-                       if(peers[i] == null) continue;
-                       if(!peers[i].isRoutable()) continue;
+               for(int i = 0; i < peers.length; i++) {
+                       if(peers[i] == null)
+                               continue;
+                       if(!peers[i].isRoutable())
+                               continue;
                        count++;
                }
                return count;
        }
-       
+
        public int countAlmostConnectedDarknetPeers() {
                int count = 0;
                PeerNode[] peers = myPeers;
-               for(int i=0;i<peers.length;i++) {
-                       if(peers[i] == null) continue;
-                       if(!(peers[i] instanceof DarknetPeerNode)) continue;
-                       if(peers[i].isOpennet()) continue;
-                       if(!peers[i].isConnected()) continue;
+               for(int i = 0; i < peers.length; i++) {
+                       if(peers[i] == null)
+                               continue;
+                       if(!(peers[i] instanceof DarknetPeerNode))
+                               continue;
+                       if(peers[i].isOpennet())
+                               continue;
+                       if(!peers[i].isConnected())
+                               continue;
                        count++;
                }
                return count;
        }
-       
+
        public int countCompatibleDarknetPeers() {
                int count = 0;
                PeerNode[] peers = myPeers;
-               for(int i=0;i<peers.length;i++) {
-                       if(peers[i] == null) continue;
-                       if(!(peers[i] instanceof DarknetPeerNode)) continue;
-                       if(peers[i].isOpennet()) continue;
-                       if(!peers[i].isConnected()) continue;
-                       if(!peers[i].isRoutingCompatible()) continue;
+               for(int i = 0; i < peers.length; i++) {
+                       if(peers[i] == null)
+                               continue;
+                       if(!(peers[i] instanceof DarknetPeerNode))
+                               continue;
+                       if(peers[i].isOpennet())
+                               continue;
+                       if(!peers[i].isConnected())
+                               continue;
+                       if(!peers[i].isRoutingCompatible())
+                               continue;
                        count++;
                }
                return count;
        }
-       
+
        public int countConnectedOpennetPeers() {
                int count = 0;
                PeerNode[] peers = connectedPeers;
-               for(int i=0;i<peers.length;i++) {
-                       if(peers[i] == null) continue;
-                       if(!(peers[i] instanceof OpennetPeerNode)) continue;
-                       if(!peers[i].isRoutable()) continue;
+               for(int i = 0; i < peers.length; i++) {
+                       if(peers[i] == null)
+                               continue;
+                       if(!(peers[i] instanceof OpennetPeerNode))
+                               continue;
+                       if(!peers[i].isRoutable())
+                               continue;
                        count++;
                }
                return count;
@@ -1691,9 +1772,11 @@
        public int countValidPeers() {
                PeerNode[] peers = myPeers;
                int count = 0;
-               for(int i=0;i<peers.length;i++) {
-                       if(!peers[i].isRealConnection()) continue;
-                       if(peers[i].isDisabled()) continue;
+               for(int i = 0; i < peers.length; i++) {
+                       if(!peers[i].isRealConnection())
+                               continue;
+                       if(peers[i].isDisabled())
+                               continue;
                        count++;
                }
                return count;
@@ -1702,22 +1785,23 @@
        public int countBackedOffPeers() {
                PeerNode[] peers = myPeers;
                int count = 0;
-               for(int i=0;i<peers.length;i++) {
-                       if(!peers[i].isRealConnection()) continue;
-                       if(peers[i].isDisabled()) continue;
+               for(int i = 0; i < peers.length; i++) {
+                       if(!peers[i].isRealConnection())
+                               continue;
+                       if(peers[i].isDisabled())
+                               continue;
                        if(peers[i].isRoutingBackedOff())
                                count++;
                }
                return count;
        }
-       
+
        public PeerNode getByIdentity(byte[] identity) {
                PeerNode[] peers = myPeers;
-               for(int i=0;i<peers.length;i++) {
+               for(int i = 0; i < peers.length; i++) {
                        if(Arrays.equals(peers[i].getIdentity(), identity))
                                return peers[i];
                }
                return null;
        }
-
 }

Modified: branches/saltedhashstore/freenet/src/freenet/node/PeerNode.java
===================================================================
--- branches/saltedhashstore/freenet/src/freenet/node/PeerNode.java     
2008-07-25 14:15:06 UTC (rev 21394)
+++ branches/saltedhashstore/freenet/src/freenet/node/PeerNode.java     
2008-07-25 17:41:12 UTC (rev 21395)
@@ -74,6 +74,7 @@
 import freenet.support.math.TimeDecayingRunningAverage;
 import freenet.support.transport.ip.HostnameSyntaxException;
 import freenet.support.transport.ip.IPUtil;
+import java.util.Collection;

 /**
  * @author amphibian
@@ -169,6 +170,8 @@
        private static final int MAX_HANDSHAKE_COUNT = 2;
        /** Current location in the keyspace, or -1 if it is unknown */
        private double currentLocation;
+       /** Current locations of our peer's peers */
+       private double[] currentPeersLocation;
        /** Time the location was set */
        private long locSetTime;
        /** Node identity; for now a block of data, in future a
@@ -323,6 +326,12 @@
        protected NodeCrypto crypto;

        /**
+        * Some alchemy we use in PeerNode.shouldBeExcludedFromPeerList()
+        */
+       public static final int BLACK_MAGIC_BACKOFF_PRUNING_TIME = 5 * 60 * 
1000;
+       public static final double BLACK_MAGIC_BACKOFF_PRUNING_PERCENTAGE = 0.9;
+       
+       /**
         * For FNP link setup:
         *  The initiator has to ensure that nonces send back by the
         *  responder in message2 match what was chosen in message 1
@@ -373,8 +382,15 @@
                        throw new FSParseException("Invalid version "+version+" 
: "+e2);
                }
                String locationString = fs.get("location");
+               String[] peerLocationsString = fs.getAll("peersLocation");
                try {
                        currentLocation = Location.getLocation(locationString);
+                       if(peerLocationsString != null) {
+                               double[] peerLocations = new 
double[peerLocationsString.length];
+                               for(int i = 0; i < peerLocationsString.length; 
i++)
+                                       peerLocations[i] = 
Location.getLocation(peerLocationsString[i]);
+                               currentPeersLocation = peerLocations;
+                       }
                        locSetTime = System.currentTimeMillis();
                } catch(FSParseException e) {
                        // Wait for them to send us an FNPLocChangeNotification
@@ -901,6 +917,22 @@
        public synchronized double getLocation() {
                return currentLocation;
        }
+       
+       public boolean shouldBeExcludedFromPeerList() {
+               long now = System.currentTimeMillis();
+               synchronized(this) {
+                       if(BLACK_MAGIC_BACKOFF_PRUNING_PERCENTAGE < 
backedOffPercent.currentValue())
+                               return true;
+                       else if(BLACK_MAGIC_BACKOFF_PRUNING_TIME + now < 
getRoutingBackedOffUntil())
+                               return true;
+                       else
+                               return false;
+               }
+       }
+       
+       public synchronized  double[] getPeersLocation() {
+               return currentPeersLocation;
+       }

        public synchronized long getLocSetTime() {
                return locSetTime;
@@ -1569,11 +1601,12 @@

        /**
        * Update the Location to a new value.
+       * @deprecated
        */
        public void updateLocation(double newLoc) {
                logMINOR = Logger.shouldLog(Logger.MINOR, PeerNode.class);
                if(newLoc < 0.0 || newLoc > 1.0) {
-                       Logger.error(this, "Invalid location update for " + 
this, new Exception("error"));
+                       Logger.error(this, "Invalid location update for " + 
this+ " ("+newLoc+')', new Exception("error"));
                        // Ignore it
                        return;
                }
@@ -1583,7 +1616,34 @@
                }
                node.peers.writePeers();
        }
+       
+       public void updateLocation(double newLoc, double[] newLocs) {
+               logMINOR = Logger.shouldLog(Logger.MINOR, PeerNode.class);
+               
+               if(newLoc < 0.0 || newLoc > 1.0) {
+                       Logger.error(this, "Invalid location update for " + 
this+ " ("+newLoc+')', new Exception("error"));
+                       // Ignore it
+                       return;
+               }
+               
+               for(double currentLoc : newLocs) {
+                       if(currentLoc < 0.0 || currentLoc > 1.0) {
+                               Logger.error(this, "Invalid location update for 
" + this + " ("+currentLoc+')', new Exception("error"));
+                               // Ignore it
+                               return;
+                       }
+               }

+               Arrays.sort(newLocs);
+               
+               synchronized(this) {
+                       currentLocation = newLoc;
+                       currentPeersLocation = newLocs;
+                       locSetTime = System.currentTimeMillis();
+               }
+               node.peers.writePeers();
+       }
+
        /**
        * Should we reject a swap request?
        */
@@ -2036,7 +2096,9 @@
        * Send any high level messages that need to be sent on connect.
        */
        protected void sendInitialMessages() {
-               Message locMsg = 
DMT.createFNPLocChangeNotification(node.lm.getLocation());
+               Message locMsg = ((getVersionNumber() > 1153) ?
+                       
DMT.createFNPLocChangeNotificationNew(node.lm.getLocation(), 
node.peers.getPeerLocationDoubles(true)) :
+                       
DMT.createFNPLocChangeNotification(node.lm.getLocation()));
                Message ipMsg = DMT.createFNPDetectedIPAddress(detectedPeer);
                Message timeMsg = DMT.createFNPTime(System.currentTimeMillis());
                Message packetsMsg = createSentPacketsMessage();
@@ -2522,6 +2584,8 @@
                        fs.putSingle("hadRoutableConnectionCount", 
Long.toString(hadRoutableConnectionCount));
                if(routableConnectionCheckCount > 0)
                        fs.putSingle("routableConnectionCheckCount", 
Long.toString(routableConnectionCheckCount));
+               if(currentPeersLocation != null)
+                       fs.put("peersLocation", currentPeersLocation);
                return fs;
        }


Modified: branches/saltedhashstore/freenet/src/freenet/node/PeerNodeStatus.java
===================================================================
--- branches/saltedhashstore/freenet/src/freenet/node/PeerNodeStatus.java       
2008-07-25 14:15:06 UTC (rev 21394)
+++ branches/saltedhashstore/freenet/src/freenet/node/PeerNodeStatus.java       
2008-07-25 17:41:12 UTC (rev 21395)
@@ -30,6 +30,7 @@
        private final String statusCSSName;

        private final double location;
+       private final double[] peersLocation;

        private final String version;

@@ -109,6 +110,7 @@
                this.statusName = peerNode.getPeerNodeStatusString();
                this.statusCSSName = peerNode.getPeerNodeStatusCSSClassName();
                this.location = peerNode.getLocation();
+               this.peersLocation = peerNode.getPeersLocation();
                this.version = peerNode.getVersion();
                this.simpleVersion = peerNode.getSimpleVersion();
                this.routingBackoffLength = peerNode.getRoutingBackoffLength();
@@ -248,6 +250,10 @@
                return location;
        }

+       public double[] getPeersLocation() {
+               return peersLocation;
+       }
+       
        /**
         * @return the peerAddress
         */

Modified: branches/saltedhashstore/freenet/src/freenet/node/Persister.java
===================================================================
--- branches/saltedhashstore/freenet/src/freenet/node/Persister.java    
2008-07-25 14:15:06 UTC (rev 21394)
+++ branches/saltedhashstore/freenet/src/freenet/node/Persister.java    
2008-07-25 17:41:12 UTC (rev 21395)
@@ -85,7 +85,8 @@
                        } catch (FileNotFoundException e1) {
                                // Ignore
                        } catch (IOException e1) {
-                               Logger.error(this, "Could not read 
"+persistTarget+" ("+e+") and could not read "+persistTemp+" either ("+e1+ ')');
+                               if(persistTarget.length() > 0 || 
persistTemp.length() > 0)
+                                       Logger.error(this, "Could not read 
"+persistTarget+" ("+e+") and could not read "+persistTemp+" either ("+e1+ ')');
                        }
                }
                return throttleFS;

Modified: branches/saltedhashstore/freenet/src/freenet/node/Version.java
===================================================================
--- branches/saltedhashstore/freenet/src/freenet/node/Version.java      
2008-07-25 14:15:06 UTC (rev 21394)
+++ branches/saltedhashstore/freenet/src/freenet/node/Version.java      
2008-07-25 17:41:12 UTC (rev 21395)
@@ -24,7 +24,7 @@
        public static final String protocolVersion = "1.0";

        /** The build number of the current revision */
-       private static final int buildNumber = 1153;
+       private static final int buildNumber = 1154;

        /** Oldest build of Fred we will talk to */
        private static final int oldLastGoodBuild = 1145;

Modified: 
branches/saltedhashstore/freenet/src/freenet/node/fcp/ClientRequest.java
===================================================================
--- branches/saltedhashstore/freenet/src/freenet/node/fcp/ClientRequest.java    
2008-07-25 14:15:06 UTC (rev 21394)
+++ branches/saltedhashstore/freenet/src/freenet/node/fcp/ClientRequest.java    
2008-07-25 17:41:12 UTC (rev 21395)
@@ -1,13 +1,17 @@
 package freenet.node.fcp;

-import java.io.*;
-import java.net.*;
+import freenet.client.async.ClientRequester;
+import freenet.keys.FreenetURI;
+import freenet.support.Fields;
+import freenet.support.Logger;
+import freenet.support.SimpleFieldSet;
+import freenet.support.api.Bucket;
+import freenet.support.io.SerializableToFieldSetBucket;
+import java.io.BufferedReader;
+import java.io.BufferedWriter;
+import java.io.IOException;
+import java.net.MalformedURLException;

-import freenet.client.async.*;
-import freenet.keys.*;
-import freenet.support.*;
-import freenet.support.api.*;
-import freenet.support.io.*;

 /**
  * A request process carried out by the node for an FCP client.

Modified: 
branches/saltedhashstore/freenet/src/freenet/node/fcp/FCPConnectionHandler.java
===================================================================
--- 
branches/saltedhashstore/freenet/src/freenet/node/fcp/FCPConnectionHandler.java 
    2008-07-25 14:15:06 UTC (rev 21394)
+++ 
branches/saltedhashstore/freenet/src/freenet/node/fcp/FCPConnectionHandler.java 
    2008-07-25 17:41:12 UTC (rev 21395)
@@ -397,7 +397,7 @@
                if(read && (readFile != null) && readFile.canWrite()){ 
                        // We don't want to attempt to write before: in case an 
IOException is raised, we want to inform the
                        // client somehow that the node can't write there... 
And setting readFile to null means we won't inform
-                       // it on the status (as if it hasn't requested us to do 
the test).
+                       // it on the status (as if it hadn't requested us to do 
the test).
                        FileOutputStream fos = null;
                        BufferedOutputStream bos = null;
                        try {
@@ -405,7 +405,6 @@
                                bos = new BufferedOutputStream(fos);
                                bos.write(result.readContent.getBytes("UTF-8"));
                                bos.flush();
-                               bos.close();
                        } catch (IOException e) {
                                Logger.error(this, "Got a IOE while creating 
the file (" + readFile.toString() + " ! " + e.getMessage());
                        } finally {

Modified: 
branches/saltedhashstore/freenet/src/freenet/node/fcp/SubscribeUSKMessage.java
===================================================================
--- 
branches/saltedhashstore/freenet/src/freenet/node/fcp/SubscribeUSKMessage.java  
    2008-07-25 14:15:06 UTC (rev 21394)
+++ 
branches/saltedhashstore/freenet/src/freenet/node/fcp/SubscribeUSKMessage.java  
    2008-07-25 17:41:12 UTC (rev 21395)
@@ -12,8 +12,9 @@
 import freenet.support.SimpleFieldSet;

 /**
- * Sent by a client to subscribe to a USK. The client will then be notified 
whenever a new latest version of
- * the USK is available. There is a flag for whether the node should actively 
probe for the USK.
+ * Sent by a client to subscribe to a USK. The client will then be notified by 
a SubscribedUSKMessage that his
+ * request has been taken into account and whenever a new latest version of 
the USK is available.
+ * There is a flag for whether the node should actively probe for the USK.
  * 
  * SubscribeUSK
  * URI=USK at 
60I8H8HinpgZSOuTSD66AVlIFAy-xsppFr0YCzCar7c,NzdivUGCGOdlgngOGRbbKDNfSCnjI0FXjHLzJM4xkJ4,AQABAAE/index/4
@@ -60,6 +61,9 @@
        public void run(FCPConnectionHandler handler, Node node)
                        throws MessageInvalidException {
                new SubscribeUSK(this, node.clientCore, handler);
+               
+               SubscribedUSKMessage reply = new SubscribedUSKMessage(this);
+               handler.outputHandler.queue(reply);
        }

 }

Added: 
branches/saltedhashstore/freenet/src/freenet/node/fcp/SubscribedUSKMessage.java
===================================================================
--- 
branches/saltedhashstore/freenet/src/freenet/node/fcp/SubscribedUSKMessage.java 
                            (rev 0)
+++ 
branches/saltedhashstore/freenet/src/freenet/node/fcp/SubscribedUSKMessage.java 
    2008-07-25 17:41:12 UTC (rev 21395)
@@ -0,0 +1,45 @@
+/* This code is part of Freenet. It is distributed under the GNU General
+ * Public License, version 2 (or at your option any later version). See
+ * http://www.gnu.org/ for further details of the GPL. */
+package freenet.node.fcp;
+
+import freenet.node.Node;
+import freenet.support.SimpleFieldSet;
+
+/**
+ * Sent by the node back to the client after it receives a SubscribeUSK 
message.
+ * 
+ * SubscribedUSK
+ * URI=USK at 
60I8H8HinpgZSOuTSD66AVlIFAy-xsppFr0YCzCar7c,NzdivUGCGOdlgngOGRbbKDNfSCnjI0FXjHLzJM4xkJ4,AQABAAE/index/4
+ * DontPoll=true // meaning passively subscribe, don't cause the node to 
actively probe for it
+ * Identifier=identifier
+ * End
+ * 
+ * @author Florent Daigni&egrave;re &lt;nextgens at freenetproject.org&gt;
+ */
+public class SubscribedUSKMessage extends FCPMessage {
+       public static final String name = "SubscribedUSK";
+       
+       public final SubscribeUSKMessage message;
+       
+       SubscribedUSKMessage(SubscribeUSKMessage m) {
+               this.message = m;
+       }
+       
+       public SimpleFieldSet getFieldSet() {
+               SimpleFieldSet sfs = new SimpleFieldSet(true);
+               sfs.putSingle("Identifier", message.identifier);
+               sfs.putSingle("URI", message.key.getURI().toString());
+               sfs.put("DontPoll", message.dontPoll);
+               
+               return sfs;
+       }
+
+       public String getName() {
+               return name;
+       }
+
+       public void run(FCPConnectionHandler handler, Node node) throws 
MessageInvalidException {
+               throw new 
MessageInvalidException(ProtocolErrorMessage.INVALID_MESSAGE, name + " goes 
from server to client not the other way around", name, false);
+       }
+}
\ No newline at end of file

Modified: 
branches/saltedhashstore/freenet/src/freenet/node/simulator/RealNodeBusyNetworkTest.java
===================================================================
--- 
branches/saltedhashstore/freenet/src/freenet/node/simulator/RealNodeBusyNetworkTest.java
    2008-07-25 14:15:06 UTC (rev 21394)
+++ 
branches/saltedhashstore/freenet/src/freenet/node/simulator/RealNodeBusyNetworkTest.java
    2008-07-25 17:41:12 UTC (rev 21395)
@@ -47,6 +47,7 @@
     static final boolean ENABLE_PER_NODE_FAILURE_TABLES = false;
     static final boolean ENABLE_SWAP_QUEUEING = false;
     static final boolean ENABLE_PACKET_COALESCING = true;
+    static final boolean ENABLE_FOAF = true;

     static final int TARGET_SUCCESSES = 20;
     //static final int NUMBER_OF_NODES = 50;
@@ -74,7 +75,7 @@
         Executor executor = new PooledExecutor();
         for(int i=0;i<NUMBER_OF_NODES;i++) {
             nodes[i] = 
-               NodeStarter.createTestNode(5001+i, name, false, true, false, 
MAX_HTL, 20 /* 5% */, random, executor, 500*NUMBER_OF_NODES, 
(CHKBlock.DATA_LENGTH+CHKBlock.TOTAL_HEADERS_LENGTH)*100, true, 
ENABLE_SWAPPING, false, ENABLE_ULPRS, ENABLE_PER_NODE_FAILURE_TABLES, 
ENABLE_SWAP_QUEUEING, ENABLE_PACKET_COALESCING, 8000);
+               NodeStarter.createTestNode(5001+i, name, false, true, false, 
MAX_HTL, 20 /* 5% */, random, executor, 500*NUMBER_OF_NODES, 
(CHKBlock.DATA_LENGTH+CHKBlock.TOTAL_HEADERS_LENGTH)*100, true, 
ENABLE_SWAPPING, false, ENABLE_ULPRS, ENABLE_PER_NODE_FAILURE_TABLES, 
ENABLE_SWAP_QUEUEING, ENABLE_PACKET_COALESCING, 8000, ENABLE_FOAF);
             Logger.normal(RealNodeRoutingTest.class, "Created node "+i);
         }


Modified: 
branches/saltedhashstore/freenet/src/freenet/node/simulator/RealNodeNetworkColoringTest.java
===================================================================
--- 
branches/saltedhashstore/freenet/src/freenet/node/simulator/RealNodeNetworkColoringTest.java
        2008-07-25 14:15:06 UTC (rev 21394)
+++ 
branches/saltedhashstore/freenet/src/freenet/node/simulator/RealNodeNetworkColoringTest.java
        2008-07-25 17:41:12 UTC (rev 21395)
@@ -40,6 +40,7 @@

     static final short MAX_HTL = (short)6;
        static final int DEGREE = 5;
+       static final boolean ENABLE_FOAF = false;

        static final long storeSize = 1024*1024;

@@ -78,21 +79,21 @@
         for(int i=0;i<NUMBER_OF_NODES;i++) {
                        allNodes[totalNodes] =
             subnetA[i] = 
-               NodeStarter.createTestNode(5001+totalNodes, wd, false, true, 
true, MAX_HTL, 0 /* no dropped packets */, random, executor, 
500*NUMBER_OF_NODES, storeSize, true, true, false, false, false, false, true, 
0);
+               NodeStarter.createTestNode(5001+totalNodes, wd, false, true, 
true, MAX_HTL, 0 /* no dropped packets */, random, executor, 
500*NUMBER_OF_NODES, storeSize, true, true, false, false, false, false, true, 
0, ENABLE_FOAF);
                        totalNodes++;
             Logger.normal(RealNodeRoutingTest.class, "Created 'A' node 
"+totalNodes);
         }
         for(int i=0;i<NUMBER_OF_NODES;i++) {
                        allNodes[totalNodes] =
             subnetB[i] = 
-                       NodeStarter.createTestNode(5001+totalNodes, wd, false, 
true, true, MAX_HTL, 0 /* no dropped packets */, random, executor, 
500*NUMBER_OF_NODES, storeSize, true, true, false, false, false, false, true, 
0);
+                       NodeStarter.createTestNode(5001+totalNodes, wd, false, 
true, true, MAX_HTL, 0 /* no dropped packets */, random, executor, 
500*NUMBER_OF_NODES, storeSize, true, true, false, false, false, false, true, 
0, ENABLE_FOAF);
                        totalNodes++;
             Logger.normal(RealNodeRoutingTest.class, "Created 'B' node 
"+totalNodes);
         }
                for(int i=0;i<BRIDGES;i++) {
                        allNodes[totalNodes] =
             bridges[i] = 
-                       NodeStarter.createTestNode(5001+totalNodes, wd, false, 
true, true, MAX_HTL, 0 /* no dropped packets */, random, executor, 
500*NUMBER_OF_NODES, storeSize, true, true, false, false, false, false, true, 
0);
+                       NodeStarter.createTestNode(5001+totalNodes, wd, false, 
true, true, MAX_HTL, 0 /* no dropped packets */, random, executor, 
500*NUMBER_OF_NODES, storeSize, true, true, false, false, false, false, true, 
0,ENABLE_FOAF);
                        totalNodes++;
             Logger.normal(RealNodeRoutingTest.class, "Created bridge node 
"+totalNodes);
         }

Modified: 
branches/saltedhashstore/freenet/src/freenet/node/simulator/RealNodePingTest.java
===================================================================
--- 
branches/saltedhashstore/freenet/src/freenet/node/simulator/RealNodePingTest.java
   2008-07-25 14:15:06 UTC (rev 21394)
+++ 
branches/saltedhashstore/freenet/src/freenet/node/simulator/RealNodePingTest.java
   2008-07-25 17:41:12 UTC (rev 21395)
@@ -33,8 +33,8 @@
         RandomSource random = NodeStarter.globalTestInit("pingtest", false, 
Logger.ERROR, "");
         // Create 2 nodes
         Executor executor = new PooledExecutor();
-        Node node1 = NodeStarter.createTestNode(5001, "pingtest", false, 
false, true, Node.DEFAULT_MAX_HTL, 0, random, executor, 1000, 65536, true, 
false, false, false, false, false, true, 0);
-        Node node2 = NodeStarter.createTestNode(5002, "pingtest", false, 
false, true, Node.DEFAULT_MAX_HTL, 0, random, executor, 1000, 65536, true, 
false, false, false, false, false, true, 0);
+        Node node1 = NodeStarter.createTestNode(5001, "pingtest", false, 
false, true, Node.DEFAULT_MAX_HTL, 0, random, executor, 1000, 65536, true, 
false, false, false, false, false, true, 0, false);
+        Node node2 = NodeStarter.createTestNode(5002, "pingtest", false, 
false, true, Node.DEFAULT_MAX_HTL, 0, random, executor, 1000, 65536, true, 
false, false, false, false, false, true, 0, false);
         // Connect
         node1.connect(node2);
         node2.connect(node1);

Modified: 
branches/saltedhashstore/freenet/src/freenet/node/simulator/RealNodeRequestInsertTest.java
===================================================================
--- 
branches/saltedhashstore/freenet/src/freenet/node/simulator/RealNodeRequestInsertTest.java
  2008-07-25 14:15:06 UTC (rev 21394)
+++ 
branches/saltedhashstore/freenet/src/freenet/node/simulator/RealNodeRequestInsertTest.java
  2008-07-25 17:41:12 UTC (rev 21395)
@@ -46,6 +46,7 @@
     static final boolean ENABLE_PER_NODE_FAILURE_TABLES = false;
     static final boolean ENABLE_SWAP_QUEUEING = false;
     static final boolean ENABLE_PACKET_COALESCING = true;
+    static final boolean ENABLE_FOAF = true;

     static final int TARGET_SUCCESSES = 20;
     //static final int NUMBER_OF_NODES = 50;
@@ -74,7 +75,7 @@
         Executor executor = new PooledExecutor();
         for(int i=0;i<NUMBER_OF_NODES;i++) {
             nodes[i] = 
-               NodeStarter.createTestNode(5001+i, name, false, true, false, 
MAX_HTL, 20 /* 5% */, random, executor, 500*NUMBER_OF_NODES, 256*1024, true, 
ENABLE_SWAPPING, false, ENABLE_ULPRS, ENABLE_PER_NODE_FAILURE_TABLES, 
ENABLE_SWAP_QUEUEING, ENABLE_PACKET_COALESCING, 12000);
+               NodeStarter.createTestNode(5001+i, name, false, true, false, 
MAX_HTL, 20 /* 5% */, random, executor, 500*NUMBER_OF_NODES, 256*1024, true, 
ENABLE_SWAPPING, false, ENABLE_ULPRS, ENABLE_PER_NODE_FAILURE_TABLES, 
ENABLE_SWAP_QUEUEING, ENABLE_PACKET_COALESCING, 12000, ENABLE_FOAF);
             Logger.normal(RealNodeRoutingTest.class, "Created node "+i);
         }


Modified: 
branches/saltedhashstore/freenet/src/freenet/node/simulator/RealNodeRoutingTest.java
===================================================================
--- 
branches/saltedhashstore/freenet/src/freenet/node/simulator/RealNodeRoutingTest.java
        2008-07-25 14:15:06 UTC (rev 21394)
+++ 
branches/saltedhashstore/freenet/src/freenet/node/simulator/RealNodeRoutingTest.java
        2008-07-25 17:41:12 UTC (rev 21395)
@@ -27,152 +27,156 @@
  */
 public class RealNodeRoutingTest extends RealNodeTest {

-    static final int NUMBER_OF_NODES = 500;
-    static final int DEGREE = 10;
-    static final short MAX_HTL = (short)10;
-    static final boolean START_WITH_IDEAL_LOCATIONS = true;
-    static final boolean FORCE_NEIGHBOUR_CONNECTIONS = true;
-    static final int MAX_PINGS = 2000;
-    static final boolean ENABLE_SWAPPING = false;
-    static final boolean ENABLE_SWAP_QUEUEING = false;
-    
-    public static void main(String[] args) throws Exception {
-        System.out.println("Routing test using real nodes:");
-        System.out.println();
-        String dir = "realNodeRequestInsertTest";
-        File wd = new File(dir);
-        if(!FileUtil.removeAll(wd)) {
-               System.err.println("Mass delete failed, test may not be 
accurate.");
-               System.exit(EXIT_CANNOT_DELETE_OLD_DATA);
-        }
-        wd.mkdir();
-        //NOTE: globalTestInit returns in ignored random source
-        NodeStarter.globalTestInit(dir, false, Logger.ERROR, "");
-        DummyRandomSource random = new DummyRandomSource();
-        //DiffieHellman.init(random);
-        Node[] nodes = new Node[NUMBER_OF_NODES];
-        Logger.normal(RealNodeRoutingTest.class, "Creating nodes...");
-        Executor executor = new PooledExecutor();
-        for(int i=0;i<NUMBER_OF_NODES;i++) {
-               System.err.println("Creating node "+i);
-            nodes[i] = 
-               NodeStarter.createTestNode(5001+i, dir, false, true, true, 
MAX_HTL, 0 /* no dropped packets */, random, executor, 500*NUMBER_OF_NODES, 
65536, true, ENABLE_SWAPPING, false, false, false, ENABLE_SWAP_QUEUEING, true, 
0);
-            Logger.normal(RealNodeRoutingTest.class, "Created node "+i);
-        }
-        Logger.normal(RealNodeRoutingTest.class, "Created "+NUMBER_OF_NODES+" 
nodes");
-        // Now link them up
-        makeKleinbergNetwork(nodes, START_WITH_IDEAL_LOCATIONS, DEGREE, 
FORCE_NEIGHBOUR_CONNECTIONS);
+       static final int NUMBER_OF_NODES = 500;
+       static final int DEGREE = 10;
+       static final short MAX_HTL = (short) 10;
+       static final boolean START_WITH_IDEAL_LOCATIONS = true;
+       static final boolean FORCE_NEIGHBOUR_CONNECTIONS = true;
+       static final int MAX_PINGS = 2000;
+       static final boolean ENABLE_SWAPPING = false;
+       static final boolean ENABLE_SWAP_QUEUEING = false;
+       static final boolean ENABLE_FOAF = true;

-        Logger.normal(RealNodeRoutingTest.class, "Added random links");
-        
-        for(int i=0;i<NUMBER_OF_NODES;i++) {
-               System.err.println("Starting node "+i);
-            nodes[i].start(false);
-        }
-        
-        waitForAllConnected(nodes);
-        
-        waitForPingAverage(0.98, nodes, random, MAX_PINGS, 5000);
-        
-    }
+       public static void main(String[] args) throws Exception {
+               System.out.println("Routing test using real nodes:");
+               System.out.println();
+               String dir = "realNodeRequestInsertTest";
+               File wd = new File(dir);
+               if(!FileUtil.removeAll(wd)) {
+                       System.err.println("Mass delete failed, test may not be 
accurate.");
+                       System.exit(EXIT_CANNOT_DELETE_OLD_DATA);
+               }
+               wd.mkdir();
+               //NOTE: globalTestInit returns in ignored random source
+               NodeStarter.globalTestInit(dir, false, Logger.ERROR, "");
+               DummyRandomSource random = new DummyRandomSource();
+               //DiffieHellman.init(random);
+               Node[] nodes = new Node[NUMBER_OF_NODES];
+               Logger.normal(RealNodeRoutingTest.class, "Creating nodes...");
+               Executor executor = new PooledExecutor();
+               for(int i = 0; i < NUMBER_OF_NODES; i++) {
+                       System.err.println("Creating node " + i);
+                       nodes[i] = NodeStarter.createTestNode(5001 + i, dir, 
false, true, true, MAX_HTL, 0 /* no dropped packets */, random, executor, 500 * 
NUMBER_OF_NODES, 65536, true, ENABLE_SWAPPING, false, false, false, 
ENABLE_SWAP_QUEUEING, true, 0, ENABLE_FOAF);
+                       Logger.normal(RealNodeRoutingTest.class, "Created node 
" + i);
+               }
+               Logger.normal(RealNodeRoutingTest.class, "Created " + 
NUMBER_OF_NODES + " nodes");
+               // Now link them up
+               makeKleinbergNetwork(nodes, START_WITH_IDEAL_LOCATIONS, DEGREE, 
FORCE_NEIGHBOUR_CONNECTIONS);

+               Logger.normal(RealNodeRoutingTest.class, "Added random links");
+
+               for(int i = 0; i < NUMBER_OF_NODES; i++) {
+                       System.err.println("Starting node " + i);
+                       nodes[i].start(false);
+               }
+
+               waitForAllConnected(nodes);
+
+               waitForPingAverage(0.98, nodes, random, MAX_PINGS, 5000);
+
+       }
+
        static void waitForPingAverage(double accuracy, Node[] nodes, 
RandomSource random, int maxTests, int sleepTime) throws InterruptedException {
-               
-        int cycleNumber = 0;
-        int lastSwaps = 0;
-        int lastNoSwaps = 0;
-        int failures = 0;
-        int successes = 0;
-        RunningAverage avg = new SimpleRunningAverage(100, 0.0);
-        RunningAverage avg2 = new BootstrappingDecayingRunningAverage(0.0, 
0.0, 1.0, 100, null);
-        int pings = 0;
-        for(int total=0;total<maxTests;total++) {
-            cycleNumber++;
-            try {
-                Thread.sleep(sleepTime);
-            } catch (InterruptedException e) {
-                // Ignore
-            }
-            for(int i=0;i<nodes.length;i++) {
-               System.err.println("Cycle "+cycleNumber+" node "+i+": 
"+nodes[i].getLocation());
-            }
-            int newSwaps = LocationManager.swaps;
-            int totalStarted = LocationManager.startedSwaps;
-            int noSwaps = LocationManager.noSwaps;
-            System.err.println("Swaps: "+(newSwaps-lastSwaps));
-            System.err.println("\nTotal swaps: Started*2: "+totalStarted*2+", 
succeeded: "+newSwaps+", last minute failures: "+noSwaps+
-                    ", ratio "+(double)noSwaps/(double)newSwaps+", early 
failures: "+((totalStarted*2)-(noSwaps+newSwaps)));
-            System.err.println("This cycle ratio: 
"+((double)(noSwaps-lastNoSwaps)) / ((double)(newSwaps - lastSwaps)));
-            lastNoSwaps = noSwaps;
-            System.err.println("Swaps rejected (already locked): 
"+LocationManager.swapsRejectedAlreadyLocked);
-            System.err.println("Swaps rejected (nowhere to go): 
"+LocationManager.swapsRejectedNowhereToGo);
-            System.err.println("Swaps rejected (rate limit): 
"+LocationManager.swapsRejectedRateLimit);
-            System.err.println("Swaps rejected (loop): 
"+LocationManager.swapsRejectedLoop);
-            System.err.println("Swaps rejected (recognized ID):" 
+LocationManager.swapsRejectedRecognizedID);
-            System.err.println("Swaps failed:" +LocationManager.noSwaps);
-            System.err.println("Swaps succeeded:" +LocationManager.swaps);
+               int totalHopsTaken = 0;
+               int cycleNumber = 0;
+               int lastSwaps = 0;
+               int lastNoSwaps = 0;
+               int failures = 0;
+               int successes = 0;
+               RunningAverage avg = new SimpleRunningAverage(100, 0.0);
+               RunningAverage avg2 = new 
BootstrappingDecayingRunningAverage(0.0, 0.0, 1.0, 100, null);
+               int pings = 0;
+               for(int total = 0; total < maxTests; total++) {
+                       cycleNumber++;
+                       try {
+                               Thread.sleep(sleepTime);
+                       } catch(InterruptedException e) {
+                               // Ignore
+                       }
+                       for(int i = 0; i < nodes.length; i++) {
+                               System.err.println("Cycle " + cycleNumber + " 
node " + i + ": " + nodes[i].getLocation());
+                       }
+                       int newSwaps = LocationManager.swaps;
+                       int totalStarted = LocationManager.startedSwaps;
+                       int noSwaps = LocationManager.noSwaps;
+                       System.err.println("Swaps: " + (newSwaps - lastSwaps));
+                       System.err.println("\nTotal swaps: Started*2: " + 
totalStarted * 2 + ", succeeded: " + newSwaps + ", last minute failures: " + 
noSwaps +
+                               ", ratio " + (double) noSwaps / (double) 
newSwaps + ", early failures: " + ((totalStarted * 2) - (noSwaps + newSwaps)));
+                       System.err.println("This cycle ratio: " + ((double) 
(noSwaps - lastNoSwaps)) / ((double) (newSwaps - lastSwaps)));
+                       lastNoSwaps = noSwaps;
+                       System.err.println("Swaps rejected (already locked): " 
+ LocationManager.swapsRejectedAlreadyLocked);
+                       System.err.println("Swaps rejected (nowhere to go): " + 
LocationManager.swapsRejectedNowhereToGo);
+                       System.err.println("Swaps rejected (rate limit): " + 
LocationManager.swapsRejectedRateLimit);
+                       System.err.println("Swaps rejected (loop): " + 
LocationManager.swapsRejectedLoop);
+                       System.err.println("Swaps rejected (recognized ID):" + 
LocationManager.swapsRejectedRecognizedID);
+                       System.err.println("Swaps failed:" + 
LocationManager.noSwaps);
+                       System.err.println("Swaps succeeded:" + 
LocationManager.swaps);

-            double totalSwapInterval = 0.0;
-            double totalSwapTime = 0.0;
-            for(int i=0;i<nodes.length;i++) {
-               totalSwapInterval += nodes[i].lm.getSendSwapInterval();
-               totalSwapTime += nodes[i].lm.getAverageSwapTime();
-            }
-            System.err.println("Average swap time: "+(totalSwapTime / 
nodes.length));
-            System.err.println("Average swap sender interval: 
"+(totalSwapInterval / nodes.length));
-            
-            waitForAllConnected(nodes);
-            
-            lastSwaps = newSwaps;
-            // Do some (routed) test-pings
-            for(int i=0;i<10;i++) {
-                try {
-                    Thread.sleep(sleepTime);
-                } catch (InterruptedException e1) {
-                }
-                try {
-                Node randomNode = nodes[random.nextInt(nodes.length)];
-                Node randomNode2 = randomNode;
-                while(randomNode2 == randomNode)
-                    randomNode2 = nodes[random.nextInt(nodes.length)];
-                double loc2 = randomNode2.getLocation();
-               Logger.normal(RealNodeRoutingTest.class, "Pinging 
"+randomNode2.getDarknetPortNumber()+" @ "+loc2+" from 
"+randomNode.getDarknetPortNumber()+" @ "+randomNode.getLocation());
-                int hopsTaken = randomNode.routedPing(loc2, 
randomNode2.getDarknetIdentity());
-                pings++;
-                if(hopsTaken < 0) {
-                    failures++;
-                    avg.report(0.0);
-                    avg2.report(0.0);
-                    double ratio = (double)successes / 
((double)(failures+successes));
-                    System.err.println("Routed ping "+pings+" FAILED from 
"+randomNode.getDarknetPortNumber()+" to "+randomNode2.getDarknetPortNumber()+" 
(long:"+ratio+", short:"+avg.currentValue()+", vague:"+avg2.currentValue()+ 
')');
-                } else {
-                    successes++;
-                    avg.report(1.0);
-                    avg2.report(1.0);
-                    double ratio = (double)successes / 
((double)(failures+successes));
-                    System.err.println("Routed ping "+pings+" success: 
"+hopsTaken+ ' ' +randomNode.getDarknetPortNumber()+" to 
"+randomNode2.getDarknetPortNumber()+" (long:"+ratio+", 
short:"+avg.currentValue()+", vague:"+avg2.currentValue()+ ')');
-                }
-                } catch (Throwable t) {
-                    Logger.error(RealNodeRoutingTest.class, "Caught "+t, t);
-                }
-            }
-            if(pings > 10 && avg.currentValue() > accuracy && 
((double)successes / ((double)(failures+successes)) > accuracy)) {
-               System.err.println();
-               System.err.println("Reached "+(accuracy*100)+"% accuracy.");
-               System.err.println();
-               System.err.println("Network size: "+nodes.length);
-               System.err.println("Maximum HTL: "+MAX_HTL);
-               System.err.println("Total started swaps: 
"+LocationManager.startedSwaps);
-                System.err.println("Total rejected swaps (already locked): 
"+LocationManager.swapsRejectedAlreadyLocked);
-                System.err.println("Total swaps rejected (nowhere to go): 
"+LocationManager.swapsRejectedNowhereToGo);
-                System.err.println("Total swaps rejected (rate limit): 
"+LocationManager.swapsRejectedRateLimit);
-                System.err.println("Total swaps rejected (loop): 
"+LocationManager.swapsRejectedLoop);
-                System.err.println("Total swaps rejected (recognized ID):" 
+LocationManager.swapsRejectedRecognizedID);
-                System.err.println("Total swaps failed:" 
+LocationManager.noSwaps);
-                System.err.println("Total swaps succeeded:" 
+LocationManager.swaps);
-                return;
-            }
-        }
+                       double totalSwapInterval = 0.0;
+                       double totalSwapTime = 0.0;
+                       for(int i = 0; i < nodes.length; i++) {
+                               totalSwapInterval += 
nodes[i].lm.getSendSwapInterval();
+                               totalSwapTime += 
nodes[i].lm.getAverageSwapTime();
+                       }
+                       System.err.println("Average swap time: " + 
(totalSwapTime / nodes.length));
+                       System.err.println("Average swap sender interval: " + 
(totalSwapInterval / nodes.length));
+
+                       waitForAllConnected(nodes);
+
+                       lastSwaps = newSwaps;
+                       // Do some (routed) test-pings
+                       for(int i = 0; i < 10; i++) {
+                               try {
+                                       Thread.sleep(sleepTime);
+                               } catch(InterruptedException e1) {
+                               }
+                               try {
+                                       Node randomNode = 
nodes[random.nextInt(nodes.length)];
+                                       Node randomNode2 = randomNode;
+                                       while(randomNode2 == randomNode) {
+                                               randomNode2 = 
nodes[random.nextInt(nodes.length)];
+                                       }
+                                       double loc2 = randomNode2.getLocation();
+                                       
Logger.normal(RealNodeRoutingTest.class, "Pinging " + 
randomNode2.getDarknetPortNumber() + " @ " + loc2 + " from " + 
randomNode.getDarknetPortNumber() + " @ " + randomNode.getLocation());
+                                       
+                                       int hopsTaken = 
randomNode.routedPing(loc2, randomNode2.getDarknetIdentity());
+                                       pings++;
+                                       if(hopsTaken < 0) {
+                                               failures++;
+                                               avg.report(0.0);
+                                               avg2.report(0.0);
+                                               double ratio = (double) 
successes / ((double) (failures + successes));
+                                               System.err.println("Routed ping 
" + pings + " FAILED from " + randomNode.getDarknetPortNumber() + " to " + 
randomNode2.getDarknetPortNumber() + " (long:" + ratio + ", short:" + 
avg.currentValue() + ", vague:" + avg2.currentValue() + ')');
+                                       } else {
+                                               totalHopsTaken += hopsTaken;
+                                               successes++;
+                                               avg.report(1.0);
+                                               avg2.report(1.0);
+                                               double ratio = (double) 
successes / ((double) (failures + successes));
+                                               System.err.println("Routed ping 
" + pings + " success: " + hopsTaken + ' ' + randomNode.getDarknetPortNumber() 
+ " to " + randomNode2.getDarknetPortNumber() + " (long:" + ratio + ", short:" 
+ avg.currentValue() + ", vague:" + avg2.currentValue() + ')');
+                                       }
+                               } catch(Throwable t) {
+                                       Logger.error(RealNodeRoutingTest.class, 
"Caught " + t, t);
+                               }
+                       }
+                       if(pings > 10 && avg.currentValue() > accuracy && 
((double) successes / ((double) (failures + successes)) > accuracy)) {
+                               System.err.println();
+                               System.err.println("Reached " + (accuracy * 
100) + "% accuracy.");
+                               System.err.println();
+                               System.err.println("Network size: " + 
nodes.length);
+                               System.err.println("Maximum HTL: " + MAX_HTL);
+                               System.err.println("Average path length for 
successful requests: "+totalHopsTaken/successes);
+                               System.err.println("Total started swaps: " + 
LocationManager.startedSwaps);
+                               System.err.println("Total rejected swaps 
(already locked): " + LocationManager.swapsRejectedAlreadyLocked);
+                               System.err.println("Total swaps rejected 
(nowhere to go): " + LocationManager.swapsRejectedNowhereToGo);
+                               System.err.println("Total swaps rejected (rate 
limit): " + LocationManager.swapsRejectedRateLimit);
+                               System.err.println("Total swaps rejected 
(loop): " + LocationManager.swapsRejectedLoop);
+                               System.err.println("Total swaps rejected 
(recognized ID):" + LocationManager.swapsRejectedRecognizedID);
+                               System.err.println("Total swaps failed:" + 
LocationManager.noSwaps);
+                               System.err.println("Total swaps succeeded:" + 
LocationManager.swaps);
+                               return;
+                       }
+               }
                System.exit(EXIT_PING_TARGET_NOT_REACHED);
        }
 }

Modified: 
branches/saltedhashstore/freenet/src/freenet/node/simulator/RealNodeSecretPingTest.java
===================================================================
--- 
branches/saltedhashstore/freenet/src/freenet/node/simulator/RealNodeSecretPingTest.java
     2008-07-25 14:15:06 UTC (rev 21394)
+++ 
branches/saltedhashstore/freenet/src/freenet/node/simulator/RealNodeSecretPingTest.java
     2008-07-25 17:41:12 UTC (rev 21395)
@@ -66,7 +66,7 @@

         for(int i=0;i<NUMBER_OF_NODES;i++) {
             nodes[i] = 
-               NodeStarter.createTestNode(5001+i, wd, false, true, true, 
MAX_HTL, 0 /* no dropped packets */, random, executor, 500*NUMBER_OF_NODES, 
storeSize, true, true, false, false, false, true, true, 0);
+               NodeStarter.createTestNode(5001+i, wd, false, true, true, 
MAX_HTL, 0 /* no dropped packets */, random, executor, 500*NUMBER_OF_NODES, 
storeSize, true, true, false, false, false, true, true, 0, true);
             Logger.normal(RealNodeRoutingTest.class, "Created node "+i);
         }
         Logger.normal(RealNodeRoutingTest.class, "Created "+NUMBER_OF_NODES+" 
nodes");

Modified: 
branches/saltedhashstore/freenet/src/freenet/node/simulator/RealNodeULPRTest.java
===================================================================
--- 
branches/saltedhashstore/freenet/src/freenet/node/simulator/RealNodeULPRTest.java
   2008-07-25 14:15:06 UTC (rev 21394)
+++ 
branches/saltedhashstore/freenet/src/freenet/node/simulator/RealNodeULPRTest.java
   2008-07-25 17:41:12 UTC (rev 21395)
@@ -69,6 +69,7 @@
     static final boolean ENABLE_SWAPPING = true;
     static final boolean ENABLE_ULPRS = true; // This is the point of the 
test, but it's probably a good idea to be able to do a comparison if we want to
     static final boolean ENABLE_PER_NODE_FAILURE_TABLES = true;
+    static final boolean ENABLE_FOAF = true;

     public static void main(String[] args) throws FSParseException, 
PeerParseException, CHKEncodeException, InvalidThresholdException, 
NodeInitException, ReferenceSignatureVerificationException, 
KeyCollisionException, SSKEncodeException, IOException, InterruptedException, 
SSKVerifyException {
        freenet.node.RequestHandler.SEND_OLD_FORMAT_SSK = false;
@@ -92,7 +93,7 @@
         Executor executor = new PooledExecutor();
         for(int i=0;i<NUMBER_OF_NODES;i++) {
             nodes[i] = 
-               NodeStarter.createTestNode(5000+i, testName, false, true, true, 
MAX_HTL, 20 /* 5% */, random, executor, 500*NUMBER_OF_NODES, 1024*1024, true, 
ENABLE_SWAPPING, false, ENABLE_ULPRS, ENABLE_PER_NODE_FAILURE_TABLES, true, 
true, 0);
+               NodeStarter.createTestNode(5000+i, testName, false, true, true, 
MAX_HTL, 20 /* 5% */, random, executor, 500*NUMBER_OF_NODES, 1024*1024, true, 
ENABLE_SWAPPING, false, ENABLE_ULPRS, ENABLE_PER_NODE_FAILURE_TABLES, true, 
true, 0, ENABLE_FOAF);
             Logger.normal(RealNodeRoutingTest.class, "Created node "+i);
         }
         SimpleFieldSet refs[] = new SimpleFieldSet[NUMBER_OF_NODES];

Modified: 
branches/saltedhashstore/freenet/src/freenet/node/updater/NodeUpdateManager.java
===================================================================
--- 
branches/saltedhashstore/freenet/src/freenet/node/updater/NodeUpdateManager.java
    2008-07-25 14:15:06 UTC (rev 21394)
+++ 
branches/saltedhashstore/freenet/src/freenet/node/updater/NodeUpdateManager.java
    2008-07-25 17:41:12 UTC (rev 21395)
@@ -52,9 +52,9 @@

        boolean wasEnabledOnStartup;
        /** Is auto-update enabled? */
-       boolean isAutoUpdateAllowed;
+       volatile boolean isAutoUpdateAllowed;
        /** Has the user given the go-ahead? */
-       boolean armed;
+       volatile boolean armed;
        /** Should we check for freenet-ext.jar updates? 
         * Normally set only when our freenet-ext.jar is known to be out of 
date. */
        final boolean shouldUpdateExt;
@@ -67,13 +67,13 @@

        final RevocationChecker revocationChecker;
        private String revocationMessage;
-       private boolean hasBeenBlown;
-       private boolean peersSayBlown;
+       private volatile boolean hasBeenBlown;
+       private volatile boolean peersSayBlown;

        /** Is there a new main jar ready to deploy? */
-       private boolean hasNewMainJar;
+       private volatile boolean hasNewMainJar;
        /** Is there a new ext jar ready to deploy? */
-       private boolean hasNewExtJar;
+       private volatile boolean hasNewExtJar;
        /** If another main jar is being fetched, when did the fetch start? */
        private long startedFetchingNextMainJar;
        /** If another ext jar is being fetched, when did the fetch start? */
@@ -201,13 +201,8 @@
        /**
         * Is auto-update enabled?
         */
-       public boolean isEnabled() {
-               NodeUpdater updater;
-               synchronized(this) {
-                       updater = mainUpdater;
-                       if(updater == null) return false;
-               }
-               return updater.isRunning();
+       public synchronized boolean isEnabled() {
+               return (mainUpdater != null);
        }

        /**
@@ -223,7 +218,7 @@
                }
                NodeUpdater main = null, ext = null;
                synchronized(this) {
-                       boolean enabled = (mainUpdater != null && 
mainUpdater.isRunning());
+                       boolean enabled = (mainUpdater != null);
                        if(enabled == enable) return;
                        if(!enable) {
                                // Kill it
@@ -294,9 +289,8 @@
                                updateURI = uri;
                                updater = mainUpdater;
                        }
+                       if(updater == null) return;
                }
-               if(updater == null) return;
-               if(updater.isRunning()) return;
                updater.onChangeURI(uri);
        }

@@ -320,7 +314,7 @@
        /**
         * @return Is auto-update currently enabled?
         */
-       public synchronized boolean isAutoUpdateAllowed() {
+       public boolean isAutoUpdateAllowed() {
                return isAutoUpdateAllowed;
        }

@@ -707,9 +701,7 @@
        }

        public void arm() {
-               synchronized(this) {
-                       armed = true;
-               }
+               armed = true;
                deployOffThread(0);
        }

@@ -734,11 +726,11 @@
                return hasBeenBlown;
        }

-       public synchronized boolean hasNewMainJar() {
+       public boolean hasNewMainJar() {
                return hasNewMainJar;
        }

-       public synchronized boolean hasNewExtJar() {
+       public boolean hasNewExtJar() {
                return hasNewExtJar;
        }


Modified: 
branches/saltedhashstore/freenet/src/freenet/node/updater/NodeUpdater.java
===================================================================
--- branches/saltedhashstore/freenet/src/freenet/node/updater/NodeUpdater.java  
2008-07-25 14:15:06 UTC (rev 21394)
+++ branches/saltedhashstore/freenet/src/freenet/node/updater/NodeUpdater.java  
2008-07-25 17:41:12 UTC (rev 21395)
@@ -88,14 +88,15 @@
                if(!isRunning) return;
                int found = (int)key.suggestedEdition;

-               if(found > availableVersion){
-                       Logger.minor(this, "Updating availableVersion from 
"+availableVersion+" to "+found+" and queueing an update");
+               if(found > availableVersion) {
+                       Logger.minor(this, "Updating availableVersion from " + 
availableVersion + " to " + found + " and queueing an update");
                        this.availableVersion = found;
                        ticker.queueTimedJob(new Runnable() {
+
                                public void run() {
                                        maybeUpdate();
                                }
-                       }, 60*1000); // leave some time in case we get later 
editions
+                       }, 60 * 1000); // leave some time in case we get later 
editions
                        // LOCKING: Always take the NodeUpdater lock *BEFORE* 
the NodeUpdateManager lock
                        manager.onStartFetching(extUpdate);
                }
@@ -267,10 +268,6 @@
        public void onGeneratedURI(FreenetURI uri, BaseClientPutter state) {
                // Impossible
        }
-
-       public synchronized boolean isRunning(){
-               return isRunning;
-       }

        /** Called before kill(). Don't do anything that will involve taking 
locks. */
        public void preKill() {

Modified: 
branches/saltedhashstore/freenet/src/freenet/node/updater/UpdateOverMandatoryManager.java
===================================================================
--- 
branches/saltedhashstore/freenet/src/freenet/node/updater/UpdateOverMandatoryManager.java
   2008-07-25 14:15:06 UTC (rev 21394)
+++ 
branches/saltedhashstore/freenet/src/freenet/node/updater/UpdateOverMandatoryManager.java
   2008-07-25 17:41:12 UTC (rev 21395)
@@ -48,6 +48,7 @@
 import freenet.support.SizeUtil;
 import freenet.support.io.FileBucket;
 import freenet.support.io.RandomAccessFileWrapper;
+import java.io.FileFilter;

 /**
  * Co-ordinates update over mandatory. Update over mandatory = updating from 
your peers, even
@@ -79,6 +80,8 @@
        private boolean logMINOR;

        private UserAlert alert;
+       private static final Pattern extBuildNumberPattern = 
Pattern.compile("^ext(?:-jar)?-(\\d+)\\.fblob(\\.tmp)*$");
+       private static final Pattern mainBuildNumberPattern = 
Pattern.compile("^main(?:-jar)?-(\\d+)\\.fblob(\\.tmp)*$");

        public UpdateOverMandatoryManager(NodeUpdateManager manager) {
                this.updateManager = manager;
@@ -1174,66 +1177,52 @@
                        Logger.error(this, "Persistent temporary files location 
is not a directory: "+oldTempFilesPeerDir.getPath());
                        return false;
                }
-               File[] oldTempFiles = oldTempFilesPeerDir.listFiles();
-               if(oldTempFiles == null) {
-                       return false;
-               }
+               
                boolean gotError = false;
-               File oldTempFile;
-               String oldTempFileName;
-               String extBuildNumberRegexStr = "^ext(?:-jar)?-(\\d+)\\.fblob$";
-               String mainBuildNumberRegexStr = 
"^main(?:-jar)?-(\\d+)\\.fblob$";
-               Pattern extBuildNumberPattern = 
Pattern.compile(extBuildNumberRegexStr);
-               Pattern mainBuildNumberPattern = 
Pattern.compile(mainBuildNumberRegexStr);
-               Matcher extBuildNumberMatcher;
-               Matcher mainBuildNumberMatcher;
-               String buildNumberStr;
-               int buildNumber;
-               int lastGoodMainBuildNumber = Version.lastGoodBuild();
-               int recommendedExtBuildNumber = 
NodeStarter.RECOMMENDED_EXT_BUILD_NUMBER;
-               for (int i = 0; i < oldTempFiles.length; i++) {
-                       oldTempFile = oldTempFiles[i];
-                       oldTempFileName = oldTempFile.getName();
-                       if(oldTempFileName.endsWith(".fblob.tmp")) {
-                               if(oldTempFileName.startsWith("ext-jar-") || 
oldTempFileName.startsWith("main-jar-") || 
oldTempFileName.startsWith("revocation-") || 
oldTempFileName.startsWith("main-")) {
-                                       if(!oldTempFile.delete()) {
-                                               if(oldTempFile.exists()) {
-                                                       Logger.error(this, 
"Cannot delete temporary persistent file "+oldTempFileName+" even though it 
exists: must be TOO persistent :)");
-                                               } else {
-                                                       Logger.normal(this, 
"Temporary persistent file does not exist when deleting: "+oldTempFileName);
-                                               }
-                                       }
-                               }
-                       } else if(oldTempFileName.endsWith(".fblob")) {
-                               mainBuildNumberMatcher = 
mainBuildNumberPattern.matcher(oldTempFileName);
-                               extBuildNumberMatcher = 
extBuildNumberPattern.matcher(oldTempFileName);
+               File[] oldTempFiles = oldTempFilesPeerDir.listFiles(new 
FileFilter() {
+                       private final int lastGoodMainBuildNumber = 
Version.lastGoodBuild();
+                       private final int recommendedExtBuildNumber = 
NodeStarter.RECOMMENDED_EXT_BUILD_NUMBER;
+                       
+                       public boolean accept(File file) {
+                               String fileName = file.getName();
+                               
+                               if(fileName.startsWith("revocation-") && 
fileName.endsWith(".fblob.tmp"))
+                                       return true;
+                               
+                               String buildNumberStr;
+                               int buildNumber;
+                               Matcher extBuildNumberMatcher = 
extBuildNumberPattern.matcher(fileName);
+                               Matcher mainBuildNumberMatcher = 
mainBuildNumberPattern.matcher(fileName);
+                               
                                if(mainBuildNumberMatcher.matches()) {
                                        buildNumberStr = 
mainBuildNumberMatcher.group(1);
                                        buildNumber = 
Integer.parseInt(buildNumberStr);
                                        if(buildNumber < 
lastGoodMainBuildNumber) {
-                                               if(!oldTempFile.delete()) {
-                                                       
if(oldTempFile.exists()) {
-                                                               
Logger.error(this, "Cannot delete temporary persistent file "+oldTempFileName+" 
even though it exists: must be TOO persistent :)");
-                                                       } else {
-                                                               
Logger.normal(this, "Temporary persistent file does not exist when deleting: 
"+oldTempFileName);
-                                                       }
-                                               }
+                                               return true;
                                        }
                                } else if(extBuildNumberMatcher.matches()) {
                                        buildNumberStr = 
extBuildNumberMatcher.group(1);
                                        buildNumber = 
Integer.parseInt(buildNumberStr);
                                        if(buildNumber < 
recommendedExtBuildNumber) {
-                                               if(!oldTempFile.delete()) {
-                                                       
if(oldTempFile.exists()) {
-                                                               
Logger.error(this, "Cannot delete temporary persistent file "+oldTempFileName+" 
even though it exists: must be TOO persistent :)");
-                                                       } else {
-                                                               
Logger.normal(this, "Temporary persistent file does not exist when deleting: 
"+oldTempFileName);
-                                                       }
-                                               }
+                                               return true;
                                        }
                                }
+                               
+                               return false;
                        }
+               });
+
+               for(File fileToDelete : oldTempFiles) {
+                       String fileToDeleteName = fileToDelete.getName();
+                       if(!fileToDelete.delete()) {
+                               if(fileToDelete.exists())
+                                       Logger.error(this, "Cannot delete 
temporary persistent file " + fileToDeleteName + " even though it exists: must 
be TOO persistent :)");
+                               else
+                                       Logger.normal(this, "Temporary 
persistent file does not exist when deleting: " + fileToDeleteName);
+                               gotError =true;
+                       }
                }
+               
                return !gotError;
        }
 }

Modified: 
branches/saltedhashstore/freenet/src/freenet/pluginmanager/PluginManager.java
===================================================================
--- 
branches/saltedhashstore/freenet/src/freenet/pluginmanager/PluginManager.java   
    2008-07-25 14:15:06 UTC (rev 21394)
+++ 
branches/saltedhashstore/freenet/src/freenet/pluginmanager/PluginManager.java   
    2008-07-25 17:41:12 UTC (rev 21395)
@@ -84,16 +84,8 @@

                String fns[] = pmconfig.getStringArr("loadplugin");
                if (fns != null) {
-                       for (int i = 0; i < fns.length; i++) {
-                               String name = fns[i];
-                               /* FIXME - compatibility code, remove somewhen 
*/
-                               boolean refresh = name.endsWith("*");
-                               if (refresh) {
-                                       name = name.substring(0, name.length() 
- 1);
-                               }
-                               /* FIXME - end of compatibility code */
+                       for (String name : fns)
                                startPlugin(name, false);
-                       }
                }

                pmconfig.finishedInitialization();

Modified: 
branches/saltedhashstore/freenet/src/freenet/support/SimpleFieldSet.java
===================================================================
--- branches/saltedhashstore/freenet/src/freenet/support/SimpleFieldSet.java    
2008-07-25 14:15:06 UTC (rev 21394)
+++ branches/saltedhashstore/freenet/src/freenet/support/SimpleFieldSet.java    
2008-07-25 17:41:12 UTC (rev 21395)
@@ -840,11 +840,16 @@
        }

        public void put(String key, int[] value) {
-               // FIXME this could be more efficient...
                removeValue(key);
-               for(int i=0;i<value.length;i++)
-                       putAppend(key, Integer.toString(value[i]));
+               for(int v : value)
+                       putAppend(key, String.valueOf(v));
        }
+       
+       public void put(String key, double[] value) {
+               removeValue(key);
+               for(double v : value)
+                       putAppend(key, String.valueOf(v));
+       }

        public int[] getIntArray(String key) {
                String[] strings = getAll(key);
@@ -860,6 +865,22 @@
                }
                return ret;
        }
+       
+       public double[] getDoubleArray(String key) {
+               String[] strings = getAll(key);
+               if(strings == null) return null;
+               double[] ret = new double[strings.length];
+               for(int i=0;i<strings.length;i++) {
+                       try {
+                               ret[i] = Double.valueOf(strings[i]);
+                       } catch(NumberFormatException e) {
+                               Logger.error(this, "Cannot parse "+strings[i]+" 
: "+e,e);
+                               return null;
+                       }
+               }
+               
+               return ret;
+       }

        public void putOverwrite(String key, String[] strings) {
                putOverwrite(key, unsplit(strings));

Modified: 
branches/saltedhashstore/freenet/src/freenet/support/URIPreEncoder.java
===================================================================
--- branches/saltedhashstore/freenet/src/freenet/support/URIPreEncoder.java     
2008-07-25 14:15:06 UTC (rev 21394)
+++ branches/saltedhashstore/freenet/src/freenet/support/URIPreEncoder.java     
2008-07-25 17:41:12 UTC (rev 21395)
@@ -19,7 +19,7 @@
 public class URIPreEncoder {

        // We deliberately include '%' because we don't want to interfere with 
stuff which is already encoded.
-       public final static String allowedChars = 
"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789_-!.~'()*,;:$&+=?/@%#";
+       public final static String allowedChars = 
"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789_-!.~'()*,;:$&+=?/@%";

        public static String encode(String s) {
                StringBuffer output = new StringBuffer(s.length()*2);

Modified: 
branches/saltedhashstore/freenet/src/freenet/support/io/PersistentTempBucketFactory.java
===================================================================
--- 
branches/saltedhashstore/freenet/src/freenet/support/io/PersistentTempBucketFactory.java
    2008-07-25 14:15:06 UTC (rev 21394)
+++ 
branches/saltedhashstore/freenet/src/freenet/support/io/PersistentTempBucketFactory.java
    2008-07-25 17:41:12 UTC (rev 21395)
@@ -13,6 +13,7 @@
 import freenet.support.Logger;
 import freenet.support.api.Bucket;
 import freenet.support.api.BucketFactory;
+import java.io.FileFilter;
 import java.util.Random;

 /**
@@ -42,7 +43,7 @@
        /** Buckets to free */
        private LinkedList bucketsToFree;

-       public PersistentTempBucketFactory(File dir, String prefix, 
RandomSource strongPRNG, Random weakPRNG) throws IOException {
+       public PersistentTempBucketFactory(File dir, final String prefix, 
RandomSource strongPRNG, Random weakPRNG) throws IOException {
                boolean logMINOR = Logger.shouldLog(Logger.MINOR, this);
                this.dir = dir;
                this.strongPRNG = strongPRNG;
@@ -57,24 +58,24 @@
                if(!dir.isDirectory())
                        throw new IOException("Directory is not a directory: 
"+dir);
                originalFiles = new HashSet();
-               File[] files = dir.listFiles();
-               if((files != null) && (files.length > 0)) {
-                       for(int i=0;i<files.length;i++) {
-                               File f = files[i];
-                               String name = f.getName();
-                               if(f.isDirectory()) continue;
-                               if(!f.exists()) continue;
-                               if(!name.startsWith(prefix)) {
-                               if(Logger.shouldLog(Logger.MINOR, this))
-                                       Logger.minor(this, "Ignoring "+name);
-                                       continue;
-                               }
-                               f = FileUtil.getCanonicalFile(f);
-                               if(logMINOR)
-                                       Logger.minor(this, "Found "+f);
-                               originalFiles.add(f);
+               File[] files = dir.listFiles(new FileFilter() {
+
+                       public boolean accept(File pathname) {
+                               if(!pathname.exists() || pathname.isDirectory())
+                                       return false;
+                               String name = pathname.getName();
+                               if(name.startsWith(prefix))
+                                       return true;
+                               return false;
                        }
+               });
+               for(File f : files) {
+                       f = FileUtil.getCanonicalFile(f);
+                       if(logMINOR)
+                               Logger.minor(this, "Found " + f);
+                       originalFiles.add(f);
                }
+               
                bucketsToFree = new LinkedList();
        }


Added: 
branches/saltedhashstore/freenet/test/freenet/clients/http/filter/ContentFilterTest.java
===================================================================
--- 
branches/saltedhashstore/freenet/test/freenet/clients/http/filter/ContentFilterTest.java
                            (rev 0)
+++ 
branches/saltedhashstore/freenet/test/freenet/clients/http/filter/ContentFilterTest.java
    2008-07-25 17:41:12 UTC (rev 21395)
@@ -0,0 +1,68 @@
+/* This code is part of Freenet. It is distributed under the GNU General
+ * Public License, version 2 (or at your option any later version). See
+ * http://www.gnu.org/ for further details of the GPL. */
+package freenet.clients.http.filter;
+
+import freenet.support.api.BucketFactory;
+import freenet.support.io.ArrayBucket;
+import freenet.support.io.ArrayBucketFactory;
+import java.net.URI;
+import junit.framework.TestCase;
+
+/**
+ * A simple meta-test to track regressions of the content-filter
+ *
+ * @author Florent Daigni&egrave;re &lt;nextgens at freenetproject.org&gt;
+ */
+public class ContentFilterTest extends TestCase {
+       private static final String BASE_URI_PROTOCOL = "http";
+       private static final String BASE_URI_CONTENT = "localhost:8888";
+       private static final String BASE_URI = 
BASE_URI_PROTOCOL+"://"+BASE_URI_CONTENT+'/';
+       
+       private static final String EXTERNAL_LINK = "www.evilwebsite.gov";
+       private static final String EXTERNAL_LINK_OK = "<a />";
+       // check that external links are not allowed
+       private static final String EXTERNAL_LINK_CHECK1 = "<a 
href=\""+EXTERNAL_LINK+"\"/>";
+       private static final String EXTERNAL_LINK_CHECK2 = "<a 
href=\""+BASE_URI_PROTOCOL+"://"+EXTERNAL_LINK+"\"/>";
+       private static final String EXTERNAL_LINK_CHECK3 = "<a 
href=\""+BASE_URI_CONTENT+"@http://"+EXTERNAL_LINK+"\"/>";
+       
+       private static final String INTERNAL_RELATIVE_LINK = "<a href=\"/KSK at 
gpl.txt\" />";
+       private static final String INTERNAL_ABSOLUTE_LINK = "<a 
href=\""+BASE_URI+"KSK at gpl.txt\" />";
+       
+       // @see bug #710
+       private static final String ANCHOR_TEST = "<a href=\"#test\" />";
+       // @see bug #2451
+       private static final String POUNT_CHARACTER_ENCODING_TEST = "<a 
href=\"/CHK at 
nvrrZF-qG7gInnxb2PUFNcNfgmdg2QHFQUsJGUzvUdE,nzsrkOSwJDP5lMod~kNDChDh96f1vIqGejOcMZpmIq0,AAEC--8/Ward
 Churchill - [2001] In a Pig's Eye - CD 2 - 07 - #1 Security Threat.ogg\" />";
+       private static final String POUNT_CHARACTER_ENCODING_TEST_RESULT = "<a 
href=\"/CHK at 
nvrrZF-qG7gInnxb2PUFNcNfgmdg2QHFQUsJGUzvUdE,nzsrkOSwJDP5lMod~kNDChDh96f1vIqGejOcMZpmIq0,AAEC--8/Ward%20Churchill%20-%20%5b2001%5d%20In%20a%20Pig%27s%20Eye%20-%20CD%202%20-%2007%20-%20%231%20Security%20Threat.ogg\"
 />";
+       // @see bug #2297
+       private static final String PREVENT_FPROXY_ACCESS = "<a 
href=\""+BASE_URI+"\"/>";
+       private static final String WHITELIST_STATIC_CONTENT = "<a 
href=\"/static/themes/clean/theme.css\" />";
+
+       private final BucketFactory bf = new ArrayBucketFactory();
+
+       public void testHTMLFilter() throws Exception {
+               // General sanity checks
+               // is "relativization" working?
+               assertEquals(INTERNAL_RELATIVE_LINK, 
HTMLFilter(INTERNAL_RELATIVE_LINK));
+               assertEquals(INTERNAL_RELATIVE_LINK, 
HTMLFilter(INTERNAL_ABSOLUTE_LINK));
+               // are external links stripped out ?
+               
assertTrue(HTMLFilter(EXTERNAL_LINK_CHECK1).startsWith(EXTERNAL_LINK_OK));
+               
assertTrue(HTMLFilter(EXTERNAL_LINK_CHECK2).contains(GenericReadFilterCallback.magicHTTPEscapeString));
+               
assertTrue(HTMLFilter(EXTERNAL_LINK_CHECK3).startsWith(EXTERNAL_LINK_OK));
+               
+               // regression testing
+               assertEquals(ANCHOR_TEST, HTMLFilter(ANCHOR_TEST));
+               
+               assertEquals(POUNT_CHARACTER_ENCODING_TEST_RESULT, 
HTMLFilter(POUNT_CHARACTER_ENCODING_TEST));
+               
+               
assertTrue(HTMLFilter(PREVENT_FPROXY_ACCESS).contains(GenericReadFilterCallback.magicHTTPEscapeString));
+               assertEquals(WHITELIST_STATIC_CONTENT, 
HTMLFilter(WHITELIST_STATIC_CONTENT));
+       }
+               
+       private String HTMLFilter(String data) throws Exception {
+               String typeName = "text/html";
+               URI baseURI = new URI(BASE_URI);
+               
+               return ContentFilter.filter(new 
ArrayBucket(data.getBytes("UTF-8")), bf, typeName, baseURI, 
null).data.toString();
+       }
+}

Modified: branches/saltedhashstore/freenet/test/freenet/config/ConfigTest.java
===================================================================
--- branches/saltedhashstore/freenet/test/freenet/config/ConfigTest.java        
2008-07-25 14:15:06 UTC (rev 21394)
+++ branches/saltedhashstore/freenet/test/freenet/config/ConfigTest.java        
2008-07-25 17:41:12 UTC (rev 21395)
@@ -17,6 +17,7 @@

 import freenet.config.Config;
 import freenet.config.SubConfig;
+import freenet.utils.UTFUtil;
 import junit.framework.TestCase;

 /**
@@ -44,7 +45,12 @@

        public void testRegister() {
                /* test if we can register */
-               assertNotNull(new SubConfig("testing1%?~#{[|`^@??&?", conf));
+               StringBuffer sb = new StringBuffer();
+               for(int i=0; i< UTFUtil.PRINTABLE_ASCII.length; i++)
+                       sb.append(UTFUtil.PRINTABLE_ASCII[i]);
+               for(int i=0; i< UTFUtil.STRESSED_UTF.length; i++)
+                       sb.append(UTFUtil.STRESSED_UTF[i]);
+               assertNotNull(new SubConfig(sb.toString(), conf));

                /* test if it prevents multiple registrations */
                try{

Modified: 
branches/saltedhashstore/freenet/test/freenet/support/SimpleFieldSetTest.java
===================================================================
--- 
branches/saltedhashstore/freenet/test/freenet/support/SimpleFieldSetTest.java   
    2008-07-25 14:15:06 UTC (rev 21394)
+++ 
branches/saltedhashstore/freenet/test/freenet/support/SimpleFieldSetTest.java   
    2008-07-25 17:41:12 UTC (rev 21395)
@@ -620,6 +620,20 @@
        }

        /**
+        * Tests the getDoubleArray(String) method
+        */
+       public void testGetDoubleArray() {
+               SimpleFieldSet methodSFS = new SimpleFieldSet(true);
+               String keyPrefix = "foo";
+               for (int i = 0; i<15; i++)
+                       
methodSFS.putAppend(keyPrefix,String.valueOf((double)i));
+               double[] result = methodSFS.getDoubleArray(keyPrefix);
+               for (int i = 0; i<15; i++)
+                       assertTrue(result[i]== ((double)i));
+               
+       }
+       
+       /**
         * Tests removeValue(String) method
         */
        public void testRemoveValue() {


Reply via email to