[Pkg-cli-apps-commits] [SCM] keepass2 branch, upstream, updated. upstream/2.16-1-g2329c06

Julian Taylor jtaylor.debian at googlemail.com
Wed Oct 19 20:14:56 UTC 2011


The following commit has been merged in the upstream branch:
commit 2329c0628c75b69f6061b75f44caa6b485bd50cd
Author: Julian Taylor <jtaylor.debian at googlemail.com>
Date:   Wed Oct 19 21:31:32 2011 +0200

    Imported Upstream version 2.17

diff --git a/Build/KeePassLibSD_Distrib/KeePassLibSD.dll b/Build/KeePassLibSD_Distrib/KeePassLibSD.dll
index 5e72276..f32e380 100644
Binary files a/Build/KeePassLibSD_Distrib/KeePassLibSD.dll and b/Build/KeePassLibSD_Distrib/KeePassLibSD.dll differ
diff --git a/Build/KeePassLib_Distrib/KeePassLib.dll b/Build/KeePassLib_Distrib/KeePassLib.dll
index ebaaddb..db41282 100644
Binary files a/Build/KeePassLib_Distrib/KeePassLib.dll and b/Build/KeePassLib_Distrib/KeePassLib.dll differ
diff --git a/Build/KeePassLib_Distrib/KeePassLib.xml b/Build/KeePassLib_Distrib/KeePassLib.xml
index 837e74b..62ea7d7 100644
--- a/Build/KeePassLib_Distrib/KeePassLib.xml
+++ b/Build/KeePassLib_Distrib/KeePassLib.xml
@@ -296,6 +296,13 @@
             property should return <c>false</c>.
             </summary>
         </member>
+        <member name="P:KeePassLib.Keys.KeyProvider.SecureDesktopCompatible">
+            <summary>
+            This property specifies whether the key provider is compatible
+            with the secure desktop mode. This almost never is the case,
+            so you usually won't override this property.
+            </summary>
+        </member>
         <member name="T:KeePassLib.Cryptography.SelfTest">
             <summary>
             Class containing self-test methods.
@@ -1276,11 +1283,19 @@
             <returns>Returns <c>true</c>, if the operation completed successfully,
             otherwise <c>false</c>.</returns>
         </member>
-        <member name="M:KeePassLib.PwGroup.SearchEntries(KeePassLib.SearchParameters,KeePassLib.Collections.PwObjectList{KeePassLib.PwEntry},System.Boolean)">
+        <member name="M:KeePassLib.PwGroup.SearchEntries(KeePassLib.SearchParameters,KeePassLib.Collections.PwObjectList{KeePassLib.PwEntry})">
+            <summary>
+            Search this group and all subgroups for entries.
+            </summary>
+            <param name="sp">Specifies the search method.</param>
+            <param name="listStorage">Entry list in which the search results will
+            be stored.</param>
+        </member>
+        <member name="M:KeePassLib.PwGroup.SearchEntries(KeePassLib.SearchParameters,KeePassLib.Collections.PwObjectList{KeePassLib.PwEntry},KeePassLib.Interfaces.IStatusLogger)">
             <summary>
-            Search this group and all groups in the current one for entries.
+            Search this group and all subgroups for entries.
             </summary>
-            <param name="searchParams">Specifies the search method.</param>
+            <param name="sp">Specifies the search method.</param>
             <param name="listStorage">Entry list in which the search results will
             be stored.</param>
         </member>
@@ -1731,6 +1746,28 @@
             Virtual identifier -- represents the number of icons.
             </summary>
         </member>
+        <member name="T:KeePassLib.MemProtCmpMode">
+            <summary>
+            Comparison modes for in-memory protected objects.
+            </summary>
+        </member>
+        <member name="F:KeePassLib.MemProtCmpMode.None">
+            <summary>
+            Ignore the in-memory protection states.
+            </summary>
+        </member>
+        <member name="F:KeePassLib.MemProtCmpMode.CustomOnly">
+            <summary>
+            Ignore the in-memory protection states of standard
+            objects; do compare in-memory protection states of
+            custom objects.
+            </summary>
+        </member>
+        <member name="F:KeePassLib.MemProtCmpMode.Full">
+            <summary>
+            Compare in-memory protection states.
+            </summary>
+        </member>
         <member name="T:KeePassLib.PwEntry">
             <summary>
             A class representing a password entry. A password entry consists of several
@@ -2455,6 +2492,22 @@
             matched case-sensitively or not.</param>
             <returns>Splitted string including separators.</returns>
         </member>
+        <member name="M:KeePassLib.Utility.StrUtil.DataToDataUri(System.Byte[],System.String)">
+            <summary>
+            Create a data URI (according to RFC 2397).
+            </summary>
+            <param name="pbData">Data to encode.</param>
+            <param name="strMimeType">Optional MIME type. If <c>null</c>,
+            an appropriate type is used.</param>
+            <returns>Data URI.</returns>
+        </member>
+        <member name="M:KeePassLib.Utility.StrUtil.DataUriToData(System.String)">
+            <summary>
+            Convert a data URI (according to RFC 2397) to binary data.
+            </summary>
+            <param name="strDataUri">Data URI to decode.</param>
+            <returns>Decoded binary data.</returns>
+        </member>
         <member name="T:KeePassLib.Serialization.Kdb4Format">
             <summary>
             The <c>Kdb4File</c> class supports saving the data to various
@@ -2963,6 +3016,11 @@
             text matches a group/entry string.
             </summary>
         </member>
+        <member name="P:KeePassLib.SearchParameters.DataTransformation">
+            <summary>
+            Only for serialization.
+            </summary>
+        </member>
         <member name="T:KeePassLib.MemoryProtectionConfig">
             <summary>
             Memory protection configuration structure (for default fields).
@@ -3053,66 +3111,25 @@
         </member>
         <member name="T:KeePassLib.Collections.AutoTypeConfig">
             <summary>
-            A dictionary of auto-type window/keystroke sequence pairs.
+            A list of auto-type associations.
             </summary>
         </member>
         <member name="M:KeePassLib.Collections.AutoTypeConfig.#ctor">
             <summary>
-            Construct a new auto-type dictionary.
+            Construct a new auto-type associations list.
             </summary>
         </member>
         <member name="M:KeePassLib.Collections.AutoTypeConfig.Clear">
             <summary>
-            Remove all window/keystroke sequence associations.
+            Remove all associations.
             </summary>
         </member>
         <member name="M:KeePassLib.Collections.AutoTypeConfig.CloneDeep">
             <summary>
-            Clone the auto-type dictionary.
+            Clone the auto-type associations list.
             </summary>
             <returns>New, cloned object.</returns>
         </member>
-        <member name="M:KeePassLib.Collections.AutoTypeConfig.Set(System.String,System.String)">
-            <summary>
-            Set a window/keystroke sequence pair.
-            </summary>
-            <param name="strWindow">Name of the window. Must not be <c>null</c>.</param>
-            <param name="strKeystrokeSequence">Keystroke sequence for the specified
-            window. Must not be <c>null</c>.</param>
-            <exception cref="T:System.ArgumentNullException">Thrown if one of the input
-            parameters is <c>null</c>.</exception>
-        </member>
-        <member name="M:KeePassLib.Collections.AutoTypeConfig.Get(System.String)">
-            <summary>
-            Get a keystroke sequence associated with the specified window.
-            Returns <c>null</c>, if no sequence can be found.
-            </summary>
-            <param name="strWindow">Window identifier.</param>
-            <returns>Keystroke sequence associated with the specified window.
-            The return value is <c>null</c>, if no keystroke sequence has been
-            defined for this window yet.</returns>
-            <exception cref="T:System.ArgumentNullException">Thrown if the input
-            parameter is <c>null</c>.</exception>
-        </member>
-        <member name="M:KeePassLib.Collections.AutoTypeConfig.GetSafe(System.String)">
-            <summary>
-            Get a keystroke sequence associated with the specified window.
-            Returns an empty string (<c>""</c>), if no sequence can be found.
-            </summary>
-            <param name="strWindow">Window identifier.</param>
-            <returns>Keystroke sequence associated with the specified window.
-            The return value is an empty string (<c>""</c>), if no keystroke
-            sequence has been defined for this window yet.</returns>
-            <exception cref="T:System.ArgumentNullException">Thrown if the input
-            parameter is <c>null</c>.</exception>
-        </member>
-        <member name="M:KeePassLib.Collections.AutoTypeConfig.Remove(System.String)">
-            <summary>
-            Remove an auto-type entry.
-            </summary>
-            <param name="strWindow">Window identifier. Must not be <c>null</c>.</param>
-            <returns>Returns <c>true</c> if the entry has been removed.</returns>
-        </member>
         <member name="P:KeePassLib.Collections.AutoTypeConfig.Enabled">
             <summary>
             Specify whether auto-type is enabled or not.
@@ -3126,11 +3143,11 @@
         <member name="P:KeePassLib.Collections.AutoTypeConfig.DefaultSequence">
             <summary>
             The default keystroke sequence that is auto-typed if
-            no matching window is found in the <c>Items</c>
+            no matching window is found in the <c>Associations</c>
             container.
             </summary>
         </member>
-        <member name="P:KeePassLib.Collections.AutoTypeConfig.WindowSequencePairs">
+        <member name="P:KeePassLib.Collections.AutoTypeConfig.Associations">
             <summary>
             Get all auto-type window/keystroke sequence pairs.
             </summary>
diff --git a/Docs/Chm/KeePass.hhp b/Docs/Chm/KeePass.hhp
index 355663b..ad03330 100644
--- a/Docs/Chm/KeePass.hhp
+++ b/Docs/Chm/KeePass.hhp
@@ -44,6 +44,7 @@ help\v2\license.html
 help\v2\plugins.html
 help\v2\policy.html
 help\v2\setup.html
+help\v2\sync.html
 help\v2\translation.html
 help\v2\triggers.html
 help\v2\version.html
diff --git a/Docs/Chm/KeePassContents.hhc b/Docs/Chm/KeePassContents.hhc
index 79b7c16..58d0c56 100644
--- a/Docs/Chm/KeePassContents.hhc
+++ b/Docs/Chm/KeePassContents.hhc
@@ -115,6 +115,10 @@
 			<param name="Local" value="help\base\secedits.html">
 			</OBJECT>
 		<LI> <OBJECT type="text/sitemap">
+			<param name="Name" value="Synchronization">
+			<param name="Local" value="help\v2\sync.html">
+			</OBJECT>
+		<LI> <OBJECT type="text/sitemap">
 			<param name="Name" value="TAN Support">
 			<param name="Local" value="help\base\tans.html">
 			</OBJECT>
diff --git a/Docs/Chm/help/base/autourl.html b/Docs/Chm/help/base/autourl.html
index 47bf6f2..e743bee 100644
--- a/Docs/Chm/help/base/autourl.html
+++ b/Docs/Chm/help/base/autourl.html
@@ -142,6 +142,7 @@ If you would like to start a new KeePass instance, you could set the URL to:</p>
 <code>cmd://{FIREFOX} "http://www.yoursite.com"</code><br />
 <code>cmd://{OPERA} "http://www.yoursite.com"</code><br />
 <code>cmd://{GOOGLECHROME} "http://www.yoursite.com"</code><br />
+<code>cmd://{SAFARI} "http://www.yoursite.com"</code><br />
 The browser placeholder will be replaced by the browser's executable path (if the
 browser is installed).</p>
 
diff --git a/Docs/Chm/help/base/credits.html b/Docs/Chm/help/base/credits.html
index c610cdf..bf783e8 100644
--- a/Docs/Chm/help/base/credits.html
+++ b/Docs/Chm/help/base/credits.html
@@ -131,7 +131,8 @@ target="_blank">XHyperLink</a>).</td></tr>
 target="_blank">CSendKeys</a>).</td></tr>
 
 <!-- <tr><td><b>Jarrod Nelson</b></td>
-<td>Class for computing SHA-256 hashes (<a href="http://islab.oregonstate.edu/koc/ece575/04Project1/Nelson/NetSHA.htm"
+<td>Class for computing SHA-256 hashes
+(<a href="http://islab.oregonstate.edu/koc/ece575/04Project1/Nelson/NetSHA.htm"
 target="_blank">NetSHA.SHA256</a>).</td></tr> -->
 
 <tr><td><b>Bouncy Castle Developers</b></td>
@@ -174,11 +175,11 @@ would be a lot less powerful and useful!</p>
 <img src="../images/b16x16_kdmconfig.png" class="singleimg" alt="Info" />  Tools
 Acknowledgements</h2>
 
-<p>Thanks to the <b>UPX Team</b> for the writing the Ultimate Packer for
+<!-- <p>Thanks to the <b>UPX Team</b> for the writing the Ultimate Packer for
 eXecutables (<a href="http://upx.sourceforge.net/"
 target="_blank">UPX</a>). This tool is used to compress the final KeePass executables,
 in order to create a smaller distribution and making KeePass start up
-faster.</p>
+faster.</p> -->
 
 <p>Thanks to <b>Jordan Russell</b> for creating <a href="http://www.jrsoftware.org/"
 target="_blank">Inno Setup</a>. This
diff --git a/Docs/Chm/help/base/faq_tech.html b/Docs/Chm/help/base/faq_tech.html
index ed80ab5..6f6803e 100644
--- a/Docs/Chm/help/base/faq_tech.html
+++ b/Docs/Chm/help/base/faq_tech.html
@@ -154,7 +154,7 @@ disk, and run the copy.</p>
 <p><b>Alternative, not recommended resolution:</b>
 Configure the security policy to allow running .NET applications from
 network drives/shares. Ask your administrator to do this (administrative
-rights are required). If you got administrative rights and want to do
+rights are required). If you have administrative rights and want to do
 it yourself, you can use the
 <a href="http://msdn.microsoft.com/en-us/library/cb6t8dtz.aspx"
 target="_blank">Code Access Security Policy Tool (Caspol.exe)</a>
diff --git a/Docs/Chm/help/base/keys.html b/Docs/Chm/help/base/keys.html
index a40f2a6..e953511 100644
--- a/Docs/Chm/help/base/keys.html
+++ b/Docs/Chm/help/base/keys.html
@@ -171,20 +171,18 @@ Also, when using this option at home and your computer breaks (hard disk
 damaged), it is not
 enough to just create a new Windows account on the new installation with the
 same name and password;
-you need to copy the complete account (i.e. SID, ...). This is not
+you need to copy the <i>complete</i> account (i.e. SID, ...). This is not
 a simple task, so if you don't know how to do this, it is highly recommended
-that you don't enable this option.<br />
+that you don't enable this option.
+Instructions on how to restore a backed up account can be found in a
+Microsoft TechNet article:
+<a href="http://technet.microsoft.com/en-us/library/ee681624%28WS.10%29.aspx"
+target="_blank">How to recover a Vault corrupted by lost DPAPI keys</a>.<br />
 <br />
 If you decide to use this option, it is highly recommended not to rely
 on it exclusively, but to additionally use one of the other two options (password
 or key file).<br />
 <br />
-Triggers allow you to automatically export the database when you save. Saving in
-XML format provides a useful backup, but the export is in plain text, <i>not</i>
-encrypted. See the
-<a href="http://keepass.info/help/v2/triggers.html#examples">Trigger Examples</a>
-for more details.<br />
-<br />
 <i>Protection using user accounts is unsupported on Windows 98 / ME.</i>
 
 
diff --git a/Docs/Chm/help/base/placeholders.html b/Docs/Chm/help/base/placeholders.html
index e02516a..613bac3 100644
--- a/Docs/Chm/help/base/placeholders.html
+++ b/Docs/Chm/help/base/placeholders.html
@@ -127,6 +127,7 @@ class="singleimg" alt="Placeholder" />  Paths and Date/Time Placeholde
 <tr><td width="50%">{FIREFOX}</td><td width="50%">Path of Mozilla Firefox, if installed.</td></tr>
 <tr><td width="50%">{OPERA}</td><td width="50%">Path of Opera, if installed.</td></tr>
 <tr><td width="50%">{GOOGLECHROME}</td><td width="50%">Path of Google Chrome, if installed.</td></tr>
+<tr><td width="50%">{SAFARI}</td><td width="50%">Path of Safari, if installed. (KeePass ≥ 1.21 and ≥ 2.17)</td></tr>
 </table>
 
 <br />
@@ -199,6 +200,7 @@ See <a href="#newpassword">below</a>.</td></tr>
 See <a href="#passwordenc">below</a>.</td></tr>
 <tr><td width="50%">{HMACOTP}</td><td width="50%">Generates a one-time password.
 See <a href="#hmacotp">below</a>.</td></tr>
+<tr><td width="50%">{C:<i>Comment</i>}</td><td width="50%">Comment; is removed.</td></tr>
 </table>
 
 
@@ -259,8 +261,8 @@ characters are auto-typed directly. The option supports the following values:
 <br />
 A fixed number of
 down arrow keypresses can be added by specifying them using the <b>Conv-Offset</b>
-option. For example, if you specify <code>Conv=D, Conv-Offset=1</code>, '2', 'c' and 'C'
-are converted to 3 down arrow keypresses.<br />
+option. For example, if you specify <code>Conv=D, Conv-Offset=1</code>,
+then '2', 'c' and 'C' are converted to 3 down arrow keypresses.<br />
 <br />
 By using the <b>Conv-Fmt</b> option, you can specify the layout of comboboxes.
 By default, KeePass assumes a combobox containing values from 0 to 9 <i>or</i> from A to Z.
@@ -354,7 +356,20 @@ generates a HMAC-based one-time password as specified in RFC 4226.
 The shared secret is the UTF-8 representation of the value of the
 '<code>HmacOtp-Secret</code>' custom entry string field
 (case-sensitive), and
-the counter is stored in decimal form in the '<code>HmacOtp-Counter</code>' field.
+the counter is stored in decimal form in the '<code>HmacOtp-Counter</code>' field.<br />
+<br />
+<i>Usage example.</i>
+Create a new entry, set its password to the <code>{HMACOTP}</code>
+placeholder, switch to the 'Advanced' tab, add a string named
+<code>HmacOtp-Secret</code> with value 12345678901234567890,
+and add a string named <code>HmacOtp-Counter</code> with value 0.
+When you now double-click onto the password cell of the entry in the
+entry list of the main window, an OTP is copied to the
+clipboard. When auto-typing, an OTP is sent as password.
+Each time you perform such an action, KeePass updates the counter value.
+With the secret key and counter values above, the following OTPs
+are generated: 755224, 287082, 359152, 969429, 338314, ...
+(more generated OTPs can be found in the example in RFC 4226).
 
 
 </body></html>
diff --git a/Docs/Chm/help/base/repair.html b/Docs/Chm/help/base/repair.html
index dd3b9bd..6eb09c8 100644
--- a/Docs/Chm/help/base/repair.html
+++ b/Docs/Chm/help/base/repair.html
@@ -62,7 +62,7 @@ without any integrity checks.</p>
 
 
 
-In order to use the repair functionality in KeePass ≥ 2.10, first
+In order to use the repair functionality in KeePass 2.x, first
 create a new database file. Then, go <i>'File'</i> -> <i>'Import'</i> and import
 the corrupted database file, using <i>'KeePass KDBX (2.x) (Repair Mode)'</i>
 as format.
diff --git a/Docs/Chm/help/v2/ioconnect.html b/Docs/Chm/help/v2/ioconnect.html
index e6f96a8..9f1d78f 100644
--- a/Docs/Chm/help/v2/ioconnect.html
+++ b/Docs/Chm/help/v2/ioconnect.html
@@ -45,7 +45,8 @@ KeePass can load/save databases from/to URLs.
 
 <p>In this dialog you can specify an URL, from/to which data is read/written.</p>
 
-<p>By default, KeePass supports <b>FTP</b> and <b>HTTP</b>, but additional protocols might
+<p>By default, KeePass supports <b>FTP</b>, <b>HTTP</b> and <b>WebDAV</b>,
+but additional protocols might
 be available on your system (if specific providers are installed).</p>
 
 <br />
diff --git a/Docs/Chm/help/v2/sync.html b/Docs/Chm/help/v2/sync.html
new file mode 100644
index 0000000..d4d5f58
--- /dev/null
+++ b/Docs/Chm/help/v2/sync.html
@@ -0,0 +1,163 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+	"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+<head>
+	<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
+	<meta name="author" content="Dominik Reichl" />
+
+	<meta name="description" content="KeePass is an open source password manager. Passwords can be stored in highly-encrypted databases, which can be unlocked with one master password or key file." />
+	<meta name="keywords" content="KeePass, Password, Safe, Security, Database, Encryption, Secure, Manager, Open, Source, Free, Code, Key, Master, Disk, Dominik, Reichl" />
+
+	<meta name="robots" content="index" />
+	<meta name="revisit-after" content="14 days" />
+
+	<meta http-equiv="expires" content="0" />
+	<meta http-equiv="cache-control" content="no-cache" />
+	<meta http-equiv="pragma" content="no-cache" />
+
+	<meta name="DC.Title" content="KeePass - The Open Source Password Manager" />
+	<meta name="DC.Creator" content="Dominik Reichl" />
+	<meta name="DC.Subject" content="Open-Source Password Safe" />
+	<meta name="DC.Description" content="KeePass is an open source password manager. Passwords can be stored in highly-encrypted databases, which can be unlocked with one master password or key file." />
+	<meta name="DC.Publisher" content="Dominik Reichl" />
+	<meta name="DC.Contributor" content="Dominik Reichl" />
+	<meta name="DC.Type" content="text" />
+	<meta name="DC.Format" content="text/html" />
+	<meta name="DC.Identifier" content="http://keepass.info/" />
+	<meta name="DC.Language" content="en" />
+	<meta name="DC.Rights" content="Copyright (c) 2003-2011 Dominik Reichl" />
+
+	<title>Synchronization - KeePass</title>
+	<base target="_self" />
+	<link rel="stylesheet" type="text/css" href="../../default.css" />
+	
+</head>
+<body>
+
+
+
+
+<table class="sectionsummary"><tr><td width="68px">
+<img src="../images/b64x64_dataexchange.png" width="64px" height="64px"
+class="singleimg" align="left" alt="Synchronization" />
+</td><td valign="middle"><h1>Synchronization</h1><br />
+Merge changes made in multiple copies of a database.
+</td></tr></table>
+
+<ul>
+<li><a href="#intro">Introduction and Requirements</a></li>
+<li><a href="#invoke">Invoking a Synchronization</a></li>
+<li><a href="#tech">Technical Details</a></li>
+</ul>
+
+<br />
+
+<a name="intro"></a>
+<h2 class="sectiontitle">
+<img src="../images/b16x16_help.png" class="singleimg" alt="Help" />  Introduction
+and Requirements</h2>
+
+<p>KeePass 2.x features a powerful, built-in synchronization mechanism.
+Changes made in multiple copies of a database file can be merged safely.</p>
+
+<p>After synchronizing two files A and B, both A and B are up-to-date
+(i.e. KeePass saves the merged data to both locations when performing
+a synchronization).</p>
+
+<p><b>Requirements.</b></p>
+<ul>
+<li>If the files to be synchronized are accessible via a protocol that
+KeePass supports by default (e.g. files on a local hard disk or a network
+share, FTP, HTTP/WebDAV, ..., see the page
+<a href="ioconnect.html">Loading/Saving From/To URL</a> for details),
+then no plugins/extensions are required.</li>
+<li>If one of the files to be synchronized should be accessed via
+SCP, SFTP or FTPS, you need the
+<a href="http://keepass.info/plugins.html#ioprotocolext"
+target="_blank">IOProtocolExt</a>
+plugin, which adds support for these protocols to KeePass.</li>
+<li>If one of the files to be synchronized is stored in an online
+storage (like e.g. Amazon's S3, DigitalBucket, ...), you need the
+<a href="http://keepass.info/plugins.html#keepasssync"
+target="_blank">KeePassSync</a>
+plugin. Note that you do <i>not</i> need KeePassSync in the other cases above
+(files on a local hard disk or network share, FTP, HTTP/WebDAV, SCP, SFTP,
+FTPS, ...).</li>
+</ul>
+
+<br />
+
+<a name="invoke"></a>
+<h2 class="sectiontitle">
+<img src="../images/b16x16_dataexchange.png" class="singleimg" alt="Synchronization" />  Invoking
+a Synchronization</h2>
+
+<p>There are multiple ways how a synchronization can be invoked:</p>
+
+<ul>
+<li><b>Manually.</b>
+A synchronization can be started manually by navigating to
+<i>'File'</i> -> <i>'Synchronize'</i> and clicking <i>'Synchronize with File'</i>
+or <i>'Synchronize with URL'</i> (depending on whether the file to be synchronized
+with is stored on a local drive / network share or on a server accessible via an URL).
+If you've previously opened or synchronized with the target file, you can
+also simply point on <i>'Recent Files'</i> (in the <i>'Synchronize'</i> menu)
+and select the file.
+Manual synchronization is only possible when the currently opened database
+is a local file
+(files on a network share are here considered to be local files);
+when you've opened a file from a server using an URL,
+the <i>'Synchronize'</i> menu is disabled.</li>
+
+<li><b>Command 'Save'.</b>
+When invoking the 'Save' command, KeePass checks whether the file on disk/server
+has been modified while you were editing it. If it has been modified,
+KeePass prompts whether you want to overwrite or synchronize with the file.
+Note this applies only to the 'Save' command, not the 'Save As' command.
+See the page
+<a href="../base/multiuser.html">Multi-User</a> for details
+(section 'KeePass 2.x: Synchronize or Overwrite').</li>
+
+<li><b>Triggers.</b>
+In more complex situations you can use the synchronization trigger action.
+See the page
+<a href="triggers.html">Triggers</a> for details.</li>
+
+<li><b>Scripting.</b>
+In order to perform a synchronization without opening KeePass,
+the synchronization command of KPScript can be used. See the KPScript
+help page
+<a href="../v2_dev/scr_sc_index.html">Single Command Operations</a>
+for details.</li>
+</ul>
+
+<br />
+
+<a name="tech"></a>
+<h2 class="sectiontitle">
+<img src="../images/b16x16_dataexchange.png" class="singleimg" alt="Synchronization" />  Technical
+Details</h2>
+
+<p>The synchronization algorithm is rather complex and it would take
+many pages to describe in detail how it's working.
+Developers interested in this can have a look into the KeePass source code.
+Here are the most important properties of the synchronization algorithm:</p>
+
+<ul>
+<li>In order to decide which copy of an object is the latest one,
+KeePass mainly uses the last modification time of the object
+(which KeePass updates automatically each time the object is changed).</li>
+<li>The synchronization is performed on entry level. This e.g. means that
+a combination of user name / password is always consistent
+(synchronization on field level will not be implemented, because
+combinations could become inconsistent with this).</li>
+<li>In case of parallel updates and collisions, KeePass tries to store
+all information in an appropriate place. For example, when you have an
+entry E in a database A, make a copy B of A, change E in B, change E in A,
+and synchronize A and B, then E in A is treated as current and the changes
+made to E in B are stored as a history version of E (see tab 'History' in
+the entry dialog), i.e. the changes made in B aren't lost.</li>
+</ul>
+
+</body></html>
+
diff --git a/Docs/History.txt b/Docs/History.txt
index 911741f..b2532d4 100644
--- a/Docs/History.txt
+++ b/Docs/History.txt
@@ -1,3 +1,128 @@
+2011-10-19: 2.17
+- Multiple auto-type sequences can now be defined for a window
+  in one entry
+- The auto-type entry selection dialog now displays the
+  sequence that will be typed
+- The auto-type entry selection dialog is now resizable;
+  KeePass remembers the dialog's position, size and the list
+  view column widths
+- Added auto-type option 'An entry matches if its URL is
+  contained in the target window title'
+- Added two options to show dereferenced data in the main entry
+  list (synchronously or asynchronously)
+- Dereferenced data fields are now shown in the entry view of
+  the main window and the auto-type entry selection dialog
+  (additionally to the references)
+- Field references in the entry view are now clickable; when
+  clicking one, KeePass jumps to the data source entry
+- Added option in the 'Find' dialog to search in dereferenced
+  data fields
+- Added option to search in dereferenced data fields when
+  performing a quick search (toolbar in main window)
+- The 'Find' dialog now shows a status dialog while searching
+  for entries
+- The main window now shows a status bar and the UI is disabled
+  while performing a quick search
+- Added context menu commands to open the URL of an entry in a
+  specific browser
+- Added {SAFARI} browser path placeholder
+- Added {C:...} comment placeholder
+- Added entry duplication options dialog (appending "- Copy" to
+  entry titles, and/or replacing user names and passwords by
+  field references to the original entries)
+- Added option to focus the quick search box when restoring
+  from taskbar (disabled by default)
+- Added tray context menu command to show the options dialog
+- Source fields are now compiled before using them in a
+  {PICKCHARS} dialog
+- Added 'Copy Link' rich text box context menu command
+- Before printing, the data/format dialog now shows a print
+  dialog, in which the printer can be selected
+- Added application policy to ask for the current master key
+  before printing
+- Added support for importing Passphrase Keeper 2.50 HTML files
+  (in addition to the already supported 2.70 format)
+- KeePass now removes zone identifiers from itself, ShInstUtil
+  and the CHM help file
+- Listing currently opened windows works under Unix-like
+  systems now, too
+- Alternating item background colors are now also supported in
+  list views with item groups
+- IOConnection now supports reading from data URIs (RFC 2397)
+- Group headers are now skipped when navigating in single
+  selection list views using the arrow keys
+- Added detection support for the following web browsers on
+  Unix-like systems: Firefox, Opera, Chromium, Epiphany, Arora,
+  Galeon and Konqueror
+- Added documentation of the synchronization feature
+- Key provider plugins can now declare that they're compatible
+  with the secure desktop mode, and a new property in the query
+  context specifies whether the user currently is on the secure
+  desktop
+- Added workaround for a list view sorting bug under Windows XP
+- Added workaround for a .NET bug where a cached window state
+  gets out of sync with the real window state
+- Added workaround for a Mono WebRequest bug affecting WebDAV
+  support
+
+- Items in the auto-type entry selection dialog can now be
+  selected using a single click
+- When performing global auto-type, the Spr engine now uses the
+  entry container database instead of the current database as
+  data source
+- The generated passwords list in the password generator dialog
+  now uses the password font (monospace by default)
+- The last modification time of an entry is now updated when a
+  new password is generated using the {NEWPASSWORD} placeholder
+- The overlay icon for the taskbar button (on Windows 7) is now
+  restored when Windows Explorer crashes and when starting in
+  minimized and locked mode
+- Improved opening of CHM help file
+- The buttons in file save dialogs now have accelerator keys
+- Separated URL scheme overrides into built-in and custom ones
+- Improved tray command state updating
+- The default tray command is now rendered using a bold font
+- The main window is now disabled while searching and removing
+  duplicate entries
+- Improved banner handling/updating in resizable dialogs
+- The 'Ctrl+U' shortcut hint is now moved either to the open or
+  to the copy command, depending on whether the option 'Copy
+  URLs to clipboard instead of opening them' is enabled or not
+- Improved command availability updating of rich text context
+  menus
+- Quick searches are now invoked asynchronously
+- Improved quick search performance
+- The option to minimize the main window after locking the
+  KeePass workspace is now enabled by default
+- When performing auto-type, newline characters are now
+  converted to Enter keypresses
+- Auto-type on Unix-like systems: improved sending of backslash
+  characters
+- On Unix-like systems, the default delay between auto-typed
+  keystrokes is now 3 ms
+- Spr engine performance improvements
+- Changing the in-memory protection state of a custom entry
+  string is now treated as a database change
+- Some options in the options dialog are now linked (e.g. the
+  option 'Automatically search key files also on removable
+  media' can only be enabled when 'Automatically search key
+  files' is enabled)
+- Most items with default values aren't written to the
+  configuration file anymore (resulting in a smaller file and
+  making it possible to change defaults in future versions)
+- Path separators in the configuration file are now updated for
+  the current operating system
+- Improved 'xdotool' version detection
+- Improved IO response handling when deleting/renaming files
+- Various UI text improvements
+- Various code optimizations
+- Minor other improvements
+
+- Status bar text is now correctly updated to 'Ready' after an
+  unsuccessful/cancelled database opening attempt
+- Password generation based on patterns: escaped curly brackets
+  are now parsed correctly
+
 2011-07-12: 2.16
 - When searching for a string containing a whitespace
   character, KeePass now splits the terms and reports all
diff --git a/Ext/DeprecatedSources/MainForm_110830.txt b/Ext/DeprecatedSources/MainForm_110830.txt
new file mode 100644
index 0000000..7221fdf
--- /dev/null
+++ b/Ext/DeprecatedSources/MainForm_110830.txt
@@ -0,0 +1,66 @@
+		/* public void RefreshEntriesList()
+		{
+			int nItemCount = m_lvEntries.Items.Count;
+			if(nItemCount <= 0) return;
+
+			PwEntry peTop = GetTopEntry();
+			PwEntry peFocused = GetSelectedEntry(false);
+			int iScrollY = NativeMethods.GetScrollPosY(m_lvEntries.Handle);
+
+			UpdateImageLists(); // Important
+
+			PwEntry[] vSelected = GetSelectedEntries();
+			if(vSelected == null) vSelected = new PwEntry[0];
+
+			PwEntry[] vList = new PwEntry[nItemCount];
+			for(int iEnum = 0; iEnum < nItemCount; ++iEnum)
+				vList[iEnum] = (PwEntry)m_lvEntries.Items[iEnum].Tag;
+
+			m_lvEntries.BeginUpdate();
+			m_lvEntries.Items.Clear();
+			m_lvEntries.Groups.Clear();
+			m_lvgLastEntryGroup = null;
+
+			int nTopIndex = -1;
+			ListViewItem lviFocused = null;
+
+			m_dtCachedNow = DateTime.Now;
+			ListViewStateEx lvseCachedState = new ListViewStateEx(m_lvEntries);
+
+			for(int iAdd = 0; iAdd < nItemCount; ++iAdd)
+			{
+				PwEntry pe = vList[iAdd];
+
+				ListViewItem lvi = SetListEntry(pe, null);
+
+				if(pe == peTop) nTopIndex = iAdd;
+				if(pe == peFocused) lviFocused = lvi;
+
+				if(Array.IndexOf(vSelected, pe) >= 0) lvi.Selected = true;
+			}
+
+			Debug.Assert(lvseCachedState.CompareTo(m_lvEntries));
+
+			UIUtil.SetAlternatingBgColors(m_lvEntries, m_clrAlternateItemBgColor,
+				Program.Config.MainWindow.EntryListAlternatingBgColors);
+
+			Debug.Assert(m_bEntryGrouping == m_lvEntries.ShowGroups);
+			if(m_lvEntries.ShowGroups)
+			{
+				// Test nTopIndex to ensure we're not scrolling an unrelated list
+				if((nTopIndex >= 0) && (iScrollY > 0))
+					NativeMethods.Scroll(m_lvEntries, 0, iScrollY);
+			}
+			else
+			{
+				if(nTopIndex >= 0)
+				{
+					m_lvEntries.EnsureVisible(m_lvEntries.Items.Count - 1);
+					m_lvEntries.EnsureVisible(nTopIndex);
+				}
+			}
+
+			if(lviFocused != null) m_lvEntries.FocusedItem = lviFocused;
+
+			m_lvEntries.EndUpdate();
+		} */
diff --git a/Ext/KeePass.exe.config b/Ext/KeePass.exe.config
index ecfec22..193ac9d 100644
--- a/Ext/KeePass.exe.config
+++ b/Ext/KeePass.exe.config
@@ -9,8 +9,8 @@
 				<assemblyIdentity name="KeePass"
 					publicKeyToken="fed2ed7716aecf5c"
 					culture="neutral" />
-				<bindingRedirect oldVersion="2.0.9.0-2.1.6.0"
-					newVersion="2.1.6.16253" />
+				<bindingRedirect oldVersion="2.0.9.0-2.1.7.0"
+					newVersion="2.1.7.16602" />
 			</dependentAssembly>
 		</assemblyBinding>
 		<enforceFIPSPolicy enabled="false" />
diff --git a/Ext/KeePass.iss b/Ext/KeePass.iss
index e3a1b42..096aa3f 100644
--- a/Ext/KeePass.iss
+++ b/Ext/KeePass.iss
@@ -8,10 +8,10 @@
 #define MyAppNameEx "KeePass Password Safe 2"
 #define MyAppPublisher "Dominik Reichl"
 
-#define KeeVersionStr "2.16"
-#define KeeVersionStrWithMinor "2.16"
-#define KeeVersionStrWithMinorPath "2.16"
-#define KeeVersionWin "2.1.6.0"
+#define KeeVersionStr "2.17"
+#define KeeVersionStrWithMinor "2.17"
+#define KeeVersionStrWithMinorPath "2.17"
+#define KeeVersionWin "2.1.7.0"
 
 #define MyAppURL "http://keepass.info/"
 #define MyAppExeName "KeePass.exe"
diff --git a/Ext/KeePassMsi/KeePassMsi.vdproj b/Ext/KeePassMsi/KeePassMsi.vdproj
index 4b714a9..2e8aa44 100644
--- a/Ext/KeePassMsi/KeePassMsi.vdproj
+++ b/Ext/KeePassMsi/KeePassMsi.vdproj
@@ -382,7 +382,7 @@
             {
             "AssemblyRegister" = "3:1"
             "AssemblyIsInGAC" = "11:FALSE"
-            "AssemblyAsmDisplayName" = "8:KeePass, Version=2.1.6.16253, Culture=neutral, PublicKeyToken=fed2ed7716aecf5c, processorArchitecture=MSIL"
+            "AssemblyAsmDisplayName" = "8:KeePass, Version=2.1.7.16602, Culture=neutral, PublicKeyToken=fed2ed7716aecf5c, processorArchitecture=MSIL"
                 "ScatterAssemblies"
                 {
                     "_838987B3C51D42C3C7B9BDA1339A5500"
@@ -413,7 +413,7 @@
             {
             "AssemblyRegister" = "3:1"
             "AssemblyIsInGAC" = "11:FALSE"
-            "AssemblyAsmDisplayName" = "8:KeePass.XmlSerializers, Version=2.1.6.16253, Culture=neutral, PublicKeyToken=fed2ed7716aecf5c, processorArchitecture=MSIL"
+            "AssemblyAsmDisplayName" = "8:KeePass.XmlSerializers, Version=2.1.7.16602, Culture=neutral, PublicKeyToken=fed2ed7716aecf5c, processorArchitecture=MSIL"
                 "ScatterAssemblies"
                 {
                     "_8C05ADB649434D7892E36709EBDED4CC"
@@ -564,7 +564,7 @@
             {
             "AssemblyRegister" = "3:1"
             "AssemblyIsInGAC" = "11:FALSE"
-            "AssemblyAsmDisplayName" = "8:KeePass, Version=2.1.6.16253, Culture=neutral, PublicKeyToken=fed2ed7716aecf5c, processorArchitecture=MSIL"
+            "AssemblyAsmDisplayName" = "8:KeePass, Version=2.1.7.16602, Culture=neutral, PublicKeyToken=fed2ed7716aecf5c, processorArchitecture=MSIL"
                 "ScatterAssemblies"
                 {
                     "_C4F8814F844C43EE8C9F5B662182B11A"
@@ -712,14 +712,14 @@
         {
         "Name" = "8:Microsoft Visual Studio"
         "ProductName" = "8:KeePass"
-        "ProductCode" = "8:{9C2F4D9C-D48F-4EA3-9F31-0AEF34859C8F}"
-        "PackageCode" = "8:{18865715-AF41-43D8-9087-2B6A8BFADCB5}"
+        "ProductCode" = "8:{B9112CDC-2DA7-44FA-B806-D3F4525F0E89}"
+        "PackageCode" = "8:{271FAC71-F54F-41AA-BC48-755858A2027C}"
         "UpgradeCode" = "8:{F2F19898-4F86-4940-9BFA-426574CE03E1}"
         "RestartWWWService" = "11:FALSE"
         "RemovePreviousVersions" = "11:TRUE"
         "DetectNewerInstalledVersion" = "11:TRUE"
         "InstallAllUsers" = "11:TRUE"
-        "ProductVersion" = "8:2.1.6"
+        "ProductVersion" = "8:2.1.7"
         "Manufacturer" = "8:Dominik Reichl"
         "ARPHELPTELEPHONE" = "8:"
         "ARPHELPLINK" = "8:http://keepass.info/"
diff --git a/KeePass/App/AppDefs.cs b/KeePass/App/AppDefs.cs
index af4fae3..ba9ed48 100644
--- a/KeePass/App/AppDefs.cs
+++ b/KeePass/App/AppDefs.cs
@@ -41,6 +41,8 @@ namespace KeePass.App
 		public const string XslFileHtmlFull = "KDB4_DetailsFull.xsl";
 		public const string XslFileHtmlTabular = "KDB4_Tabular.xsl";
 
+		public const string ShInstUtil = "ShInstUtil.exe";
+
 		public const string PluginProductName = "KeePass Plugin";
 
 		// public const string MruNameValueSplitter = @"/::/";
diff --git a/KeePass/App/AppHelp.cs b/KeePass/App/AppHelp.cs
index 3172a33..335eb71 100644
--- a/KeePass/App/AppHelp.cs
+++ b/KeePass/App/AppHelp.cs
@@ -22,6 +22,8 @@ using System.IO;
 using System.Diagnostics;
 using System.Threading;
 
+using KeePass.Util;
+
 using KeePassLib;
 using KeePassLib.Utility;
 
@@ -113,7 +115,10 @@ namespace KeePass.App
 		{
 			Debug.Assert(m_strLocalHelpFile != null);
 
-			string strCmd = @"ms-its:" + m_strLocalHelpFile;
+			// Unblock CHM file for proper display of help contents
+			WinUtil.RemoveZoneIdentifier(m_strLocalHelpFile);
+
+			string strCmd = "\"ms-its:" + m_strLocalHelpFile;
 
 			if(strTopic != null)
 				strCmd += @"::/help/" + strTopic + ".html";
@@ -124,6 +129,8 @@ namespace KeePass.App
 				strCmd += @"#" + strSection;
 			}
 
+			strCmd += "\"";
+
 			try { Process.Start("hh.exe", strCmd); }
 			catch(Exception exStart)
 			{
diff --git a/KeePass/App/AppPolicy.cs b/KeePass/App/AppPolicy.cs
index 45f74e0..0208f78 100644
--- a/KeePass/App/AppPolicy.cs
+++ b/KeePass/App/AppPolicy.cs
@@ -19,8 +19,9 @@
 
 using System;
 using System.Collections.Generic;
-using System.Diagnostics;
 using System.Windows.Forms;
+using System.ComponentModel;
+using System.Diagnostics;
 
 using KeePass.Resources;
 
@@ -39,6 +40,7 @@ namespace KeePass.App
 		ExportNoKey, // Don't require the current key to be repeated
 		Import,
 		Print,
+		PrintNoKey, // Don't require the current key to be repeated
 		NewFile,
 		SaveFile,
 		AutoType,
@@ -58,6 +60,7 @@ namespace KeePass.App
 	public sealed class AppPolicyFlags
 	{
 		private bool m_bPlugins = true;
+		[DefaultValue(true)]
 		public bool Plugins
 		{
 			get { return m_bPlugins; }
@@ -65,6 +68,7 @@ namespace KeePass.App
 		}
 
 		private bool m_bExport = true;
+		[DefaultValue(true)]
 		public bool Export
 		{
 			get { return m_bExport;}
@@ -72,6 +76,7 @@ namespace KeePass.App
 		}
 
 		private bool m_bExportNoKey = true;
+		[DefaultValue(true)]
 		public bool ExportNoKey
 		{
 			get { return m_bExportNoKey; }
@@ -79,6 +84,7 @@ namespace KeePass.App
 		}
 
 		private bool m_bImport = true;
+		[DefaultValue(true)]
 		public bool Import
 		{
 			get { return m_bImport; }
@@ -86,13 +92,23 @@ namespace KeePass.App
 		}
 
 		private bool m_bPrint = true;
+		[DefaultValue(true)]
 		public bool Print
 		{
 			get { return m_bPrint; }
 			set { m_bPrint = value; }
 		}
 
+		private bool m_bPrintNoKey = true;
+		[DefaultValue(true)]
+		public bool PrintNoKey
+		{
+			get { return m_bPrintNoKey; }
+			set { m_bPrintNoKey = value; }
+		}
+
 		private bool m_bNewFile = true;
+		[DefaultValue(true)]
 		public bool NewFile
 		{
 			get { return m_bNewFile; }
@@ -100,6 +116,7 @@ namespace KeePass.App
 		}
 
 		private bool m_bSave = true;
+		[DefaultValue(true)]
 		public bool SaveFile
 		{
 			get { return m_bSave; }
@@ -107,6 +124,7 @@ namespace KeePass.App
 		}
 
 		private bool m_bAutoType = true;
+		[DefaultValue(true)]
 		public bool AutoType
 		{
 			get { return m_bAutoType; }
@@ -114,6 +132,7 @@ namespace KeePass.App
 		}
 
 		private bool m_bAutoTypeWithoutContext = true;
+		[DefaultValue(true)]
 		public bool AutoTypeWithoutContext
 		{
 			get { return m_bAutoTypeWithoutContext; }
@@ -121,6 +140,7 @@ namespace KeePass.App
 		}
 
 		private bool m_bClipboard = true;
+		[DefaultValue(true)]
 		public bool CopyToClipboard
 		{
 			get { return m_bClipboard; }
@@ -128,6 +148,7 @@ namespace KeePass.App
 		}
 
 		private bool m_bCopyWholeEntries = true;
+		[DefaultValue(true)]
 		public bool CopyWholeEntries
 		{
 			get { return m_bCopyWholeEntries; }
@@ -135,6 +156,7 @@ namespace KeePass.App
 		}
 
 		private bool m_bDragDrop = true;
+		[DefaultValue(true)]
 		public bool DragDrop
 		{
 			get { return m_bDragDrop; }
@@ -142,6 +164,7 @@ namespace KeePass.App
 		}
 
 		private bool m_bUnhidePasswords = true;
+		[DefaultValue(true)]
 		public bool UnhidePasswords
 		{
 			get { return m_bUnhidePasswords; }
@@ -149,6 +172,7 @@ namespace KeePass.App
 		}
 
 		private bool m_bChangeMasterKey = true;
+		[DefaultValue(true)]
 		public bool ChangeMasterKey
 		{
 			get { return m_bChangeMasterKey; }
@@ -156,6 +180,7 @@ namespace KeePass.App
 		}
 
 		private bool m_bChangeMasterKeyNoKey = true;
+		[DefaultValue(true)]
 		public bool ChangeMasterKeyNoKey
 		{
 			get { return m_bChangeMasterKeyNoKey; }
@@ -163,6 +188,7 @@ namespace KeePass.App
 		}
 
 		private bool m_bTriggersEdit = true;
+		[DefaultValue(true)]
 		public bool EditTriggers
 		{
 			get { return m_bTriggersEdit; }
@@ -225,6 +251,9 @@ namespace KeePass.App
 				case AppPolicyId.Print:
 					str += KPRes.Print;
 					break;
+				case AppPolicyId.PrintNoKey:
+					str += KPRes.Print + " - " + KPRes.NoKeyRepeat;
+					break;
 				case AppPolicyId.NewFile:
 					str += KPRes.NewDatabase;
 					break;
@@ -285,6 +314,9 @@ namespace KeePass.App
 				case AppPolicyId.Print:
 					str += KPRes.PolicyPrintDesc;
 					break;
+				case AppPolicyId.PrintNoKey:
+					str += KPRes.PolicyPrintNoKeyDesc;
+					break;
 				case AppPolicyId.NewFile:
 					str += KPRes.PolicyNewDatabaseDesc;
 					break;
@@ -347,6 +379,7 @@ namespace KeePass.App
 				case AppPolicyId.ExportNoKey: bAllowed = m_apfCurrent.ExportNoKey; break;
 				case AppPolicyId.Import: bAllowed = m_apfCurrent.Import; break;
 				case AppPolicyId.Print: bAllowed = m_apfCurrent.Print; break;
+				case AppPolicyId.PrintNoKey: bAllowed = m_apfCurrent.PrintNoKey; break;
 				case AppPolicyId.NewFile: bAllowed = m_apfCurrent.NewFile; break;
 				case AppPolicyId.SaveFile: bAllowed = m_apfCurrent.SaveFile; break;
 				case AppPolicyId.AutoType: bAllowed = m_apfCurrent.AutoType; break;
diff --git a/KeePass/App/Configuration/AceApplication.cs b/KeePass/App/Configuration/AceApplication.cs
index 8f1124c..140a0b4 100644
--- a/KeePass/App/Configuration/AceApplication.cs
+++ b/KeePass/App/Configuration/AceApplication.cs
@@ -21,6 +21,7 @@ using System;
 using System.Collections.Generic;
 using System.Text;
 using System.Xml.Serialization;
+using System.ComponentModel;
 
 using KeePass.Ecas;
 
@@ -35,6 +36,7 @@ namespace KeePass.App.Configuration
 		}
 
 		private string m_strLanguageFile = string.Empty; // = English
+		[DefaultValue("")]
 		public string LanguageFile
 		{
 			get { return m_strLanguageFile; }
@@ -46,6 +48,7 @@ namespace KeePass.App.Configuration
 		}
 
 		private bool m_bHelpUseLocal = false;
+		[DefaultValue(false)]
 		public bool HelpUseLocal
 		{
 			get { return m_bHelpUseLocal; }
@@ -97,6 +100,7 @@ namespace KeePass.App.Configuration
 		}
 
 		private bool m_bVerifyFile = true;
+		[DefaultValue(true)]
 		public bool VerifyWrittenFileAfterSaving
 		{
 			get { return m_bVerifyFile; }
@@ -104,6 +108,7 @@ namespace KeePass.App.Configuration
 		}
 
 		private bool m_bTransactedWrites = true;
+		[DefaultValue(true)]
 		public bool UseTransactedFileWrites
 		{
 			get { return m_bTransactedWrites; }
@@ -133,6 +138,7 @@ namespace KeePass.App.Configuration
 		}
 
 		private string m_strPluginCachePath = string.Empty;
+		[DefaultValue("")]
 		public string PluginCachePath
 		{
 			get { return m_strPluginCachePath; }
@@ -151,6 +157,7 @@ namespace KeePass.App.Configuration
 		}
 
 		private bool m_bOpenLastDb = true;
+		[DefaultValue(true)]
 		public bool OpenLastFile
 		{
 			get { return m_bOpenLastDb; }
@@ -158,6 +165,7 @@ namespace KeePass.App.Configuration
 		}
 
 		private bool m_bCheckForUpdate = false;
+		[DefaultValue(false)]
 		public bool CheckForUpdate
 		{
 			get { return m_bCheckForUpdate; }
@@ -165,6 +173,7 @@ namespace KeePass.App.Configuration
 		}
 
 		private bool m_bMinimizedAndLocked = false;
+		[DefaultValue(false)]
 		public bool MinimizedAndLocked
 		{
 			get { return m_bMinimizedAndLocked; }
@@ -172,6 +181,7 @@ namespace KeePass.App.Configuration
 		}
 
 		private bool m_bPlgDeleteOld = true;
+		[DefaultValue(true)]
 		public bool PluginCacheDeleteOld
 		{
 			get { return m_bPlgDeleteOld; }
@@ -179,6 +189,7 @@ namespace KeePass.App.Configuration
 		}
 
 		private bool m_bClearPlgCache = false;
+		[DefaultValue(false)]
 		public bool PluginCacheClearOnce
 		{
 			get { return m_bClearPlgCache; }
@@ -193,6 +204,7 @@ namespace KeePass.App.Configuration
 		}
 
 		private bool m_bShowExpiredEntries = false;
+		[DefaultValue(false)]
 		public bool ShowExpiredEntries
 		{
 			get { return m_bShowExpiredEntries; }
@@ -200,6 +212,7 @@ namespace KeePass.App.Configuration
 		}
 
 		private bool m_bShowSoonToExpireEntries = false;
+		[DefaultValue(false)]
 		public bool ShowSoonToExpireEntries
 		{
 			get { return m_bShowSoonToExpireEntries; }
@@ -214,6 +227,7 @@ namespace KeePass.App.Configuration
 		}
 
 		private bool m_bAutoSave = false;
+		[DefaultValue(false)]
 		public bool AutoSave
 		{
 			get { return m_bAutoSave; }
diff --git a/KeePass/App/Configuration/AceDefaults.cs b/KeePass/App/Configuration/AceDefaults.cs
index d60a015..8d706c4 100644
--- a/KeePass/App/Configuration/AceDefaults.cs
+++ b/KeePass/App/Configuration/AceDefaults.cs
@@ -21,6 +21,7 @@ using System;
 using System.Collections.Generic;
 using System.Text;
 using System.Xml.Serialization;
+using System.ComponentModel;
 
 using KeePass.Util;
 
@@ -44,6 +45,7 @@ namespace KeePass.App.Configuration
 		}
 
 		private string m_strKey = string.Empty;
+		[DefaultValue("")]
 		public string KeyFilePath
 		{
 			get { return m_strKey; }
@@ -55,6 +57,7 @@ namespace KeePass.App.Configuration
 		}
 
 		private string m_strProv = string.Empty;
+		[DefaultValue("")]
 		public string KeyProvider
 		{
 			get { return m_strProv; }
@@ -75,6 +78,7 @@ namespace KeePass.App.Configuration
 		}
 
 		private int m_nNewEntryExpireDays = -1;
+		[DefaultValue(-1)]
 		public int NewEntryExpiresInDays
 		{
 			get { return m_nNewEntryExpireDays; }
@@ -88,7 +92,9 @@ namespace KeePass.App.Configuration
 			set { m_uDefaultOptionsTab = value; }
 		}
 
-		private string m_strTanChars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-";
+		private const string DefaultTanChars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-";
+		private string m_strTanChars = DefaultTanChars;
+		[DefaultValue(DefaultTanChars)]
 		public string TanCharacters
 		{
 			get { return m_strTanChars; }
@@ -100,6 +106,7 @@ namespace KeePass.App.Configuration
 		}
 
 		private bool m_bExpireTansOnUse = true;
+		[DefaultValue(true)]
 		public bool TanExpiresOnUse
 		{
 			get { return m_bExpireTansOnUse; }
@@ -118,6 +125,7 @@ namespace KeePass.App.Configuration
 		}
 
 		private string m_strDbSaveAsPath = string.Empty;
+		[DefaultValue("")]
 		public string FileSaveAsDirectory
 		{
 			get { return m_strDbSaveAsPath; }
@@ -129,6 +137,7 @@ namespace KeePass.App.Configuration
 		}
 
 		private bool m_bRememberKeySources = true;
+		[DefaultValue(true)]
 		public bool RememberKeySources
 		{
 			get { return m_bRememberKeySources; }
@@ -148,6 +157,7 @@ namespace KeePass.App.Configuration
 		}
 
 		private string m_strCustomColors = string.Empty;
+		[DefaultValue("")]
 		public string CustomColors
 		{
 			get { return m_strCustomColors; }
@@ -159,6 +169,7 @@ namespace KeePass.App.Configuration
 		}
 
 		private string m_strWinFavsBaseName = string.Empty;
+		[DefaultValue("")]
 		public string WinFavsBaseFolderName
 		{
 			get { return m_strWinFavsBaseName; }
@@ -170,6 +181,7 @@ namespace KeePass.App.Configuration
 		}
 
 		private string m_strWinFavsFilePrefix = string.Empty;
+		[DefaultValue("")]
 		public string WinFavsFileNamePrefix
 		{
 			get { return m_strWinFavsFilePrefix; }
@@ -181,6 +193,7 @@ namespace KeePass.App.Configuration
 		}
 
 		private string m_strWinFavsFileSuffix = string.Empty;
+		[DefaultValue("")]
 		public string WinFavsFileNameSuffix
 		{
 			get { return m_strWinFavsFileSuffix; }
@@ -192,6 +205,7 @@ namespace KeePass.App.Configuration
 		}
 
 		private bool m_bCollapseRecycleBin = false;
+		[DefaultValue(false)]
 		public bool RecycleBinCollapse
 		{
 			get { return m_bCollapseRecycleBin; }
@@ -209,9 +223,13 @@ namespace KeePass.App.Configuration
 				strDb = UrlUtil.MakeAbsolutePath(WinUtil.GetExecutable(), strDb);
 
 			string strKey = strKeySource;
-			if(bIsKeyFile && !string.IsNullOrEmpty(strKey) &&
-				!UrlUtil.IsAbsolutePath(strKey))
-				strKey = UrlUtil.MakeAbsolutePath(WinUtil.GetExecutable(), strKey);
+			if(bIsKeyFile && !string.IsNullOrEmpty(strKey))
+			{
+				if(StrUtil.IsDataUri(strKey))
+					strKey = null; // Don't remember data URIs
+				else if(!UrlUtil.IsAbsolutePath(strKey))
+					strKey = UrlUtil.MakeAbsolutePath(WinUtil.GetExecutable(), strKey);
+			}
 
 			if(!m_bRememberKeySources) strKey = null;
 
diff --git a/KeePass/App/Configuration/AceIntegration.cs b/KeePass/App/Configuration/AceIntegration.cs
index ed691f5..cb108c6 100644
--- a/KeePass/App/Configuration/AceIntegration.cs
+++ b/KeePass/App/Configuration/AceIntegration.cs
@@ -22,6 +22,8 @@ using System.Collections.Generic;
 using System.Text;
 using System.Windows.Forms;
 using System.Xml.Serialization;
+using System.ComponentModel;
+using System.Diagnostics;
 
 using KeePassLib;
 using KeePassLib.Interfaces;
@@ -60,6 +62,7 @@ namespace KeePass.App.Configuration
 		}
 
 		private string m_strUrlOverride = string.Empty;
+		[DefaultValue("")]
 		public string UrlOverride
 		{
 			get { return m_strUrlOverride; }
@@ -82,6 +85,7 @@ namespace KeePass.App.Configuration
 		}
 
 		private bool m_bSearchKeyFiles = true;
+		[DefaultValue(true)]
 		public bool SearchKeyFiles
 		{
 			get { return m_bSearchKeyFiles; }
@@ -89,6 +93,7 @@ namespace KeePass.App.Configuration
 		}
 
 		private bool m_bSearchKeyFilesOnRemovable = false;
+		[DefaultValue(false)]
 		public bool SearchKeyFilesOnRemovableMedia
 		{
 			get { return m_bSearchKeyFilesOnRemovable; }
@@ -96,6 +101,7 @@ namespace KeePass.App.Configuration
 		}
 
 		private bool m_bSingleInstance = true;
+		[DefaultValue(true)]
 		public bool LimitToSingleInstance
 		{
 			get { return m_bSingleInstance; }
@@ -103,13 +109,23 @@ namespace KeePass.App.Configuration
 		}
 
 		private bool m_bMatchByTitle = true;
+		[DefaultValue(true)]
 		public bool AutoTypeMatchByTitle
 		{
 			get { return m_bMatchByTitle; }
 			set { m_bMatchByTitle = value; }
 		}
 
+		private bool m_bMatchByUrlInTitle = false;
+		[DefaultValue(false)]
+		public bool AutoTypeMatchByUrlInTitle
+		{
+			get { return m_bMatchByUrlInTitle; }
+			set { m_bMatchByUrlInTitle = value; }
+		}
+
 		private bool m_bPrependInitSeqIE = true;
+		[DefaultValue(true)]
 		public bool AutoTypePrependInitSequenceForIE
 		{
 			get { return m_bPrependInitSeqIE; }
@@ -117,6 +133,7 @@ namespace KeePass.App.Configuration
 		}
 
 		private bool m_bSpecialReleaseAlt = true;
+		[DefaultValue(true)]
 		public bool AutoTypeReleaseAltWithKeyPress
 		{
 			get { return m_bSpecialReleaseAlt; }
@@ -124,6 +141,7 @@ namespace KeePass.App.Configuration
 		}
 
 		private bool m_bCancelOnWindowChange = false;
+		[DefaultValue(false)]
 		public bool AutoTypeCancelOnWindowChange
 		{
 			get { return m_bCancelOnWindowChange; }
@@ -138,6 +156,7 @@ namespace KeePass.App.Configuration
 		}
 
 		private string m_strProxyAddr = string.Empty;
+		[DefaultValue("")]
 		public string ProxyAddress
 		{
 			get { return m_strProxyAddr; }
@@ -149,6 +168,7 @@ namespace KeePass.App.Configuration
 		}
 
 		private string m_strProxyPort = string.Empty;
+		[DefaultValue("")]
 		public string ProxyPort
 		{
 			get { return m_strProxyPort; }
@@ -160,6 +180,7 @@ namespace KeePass.App.Configuration
 		}
 
 		private string m_strProxyUser = string.Empty;
+		[DefaultValue("")]
 		public string ProxyUserName
 		{
 			get { return m_strProxyUser; }
@@ -171,6 +192,7 @@ namespace KeePass.App.Configuration
 		}
 
 		private string m_strProxyPassword = string.Empty;
+		[DefaultValue("")]
 		public string ProxyPassword
 		{
 			get { return m_strProxyPassword; }
@@ -188,73 +210,103 @@ namespace KeePass.App.Configuration
 
 	public sealed class AceUrlSchemeOverrides : IDeepCloneable<AceUrlSchemeOverrides>
 	{
-		private bool m_bSetToDefaults = true;
-		public bool SetToDefaults
+		private List<AceUrlSchemeOverride> m_lBuiltInOverrides =
+			new List<AceUrlSchemeOverride>();
+		[XmlIgnore]
+		public List<AceUrlSchemeOverride> BuiltInOverrides
+		{
+			get { return m_lBuiltInOverrides; }
+			set
+			{
+				if(value == null) throw new ArgumentNullException("value");
+				m_lBuiltInOverrides = value;
+			}
+		}
+
+		public ulong BuiltInOverridesEnabled
 		{
-			get { return m_bSetToDefaults; }
-			set { m_bSetToDefaults = value; }
+			get { return GetEnabledBuiltInOverrides(); }
+			set { SetEnabledBuiltInOverrides(value); }
 		}
 
-		private List<AceUrlSchemeOverride> m_vOverrides =
+		private List<AceUrlSchemeOverride> m_lCustomOverrides =
 			new List<AceUrlSchemeOverride>();
 		[XmlArrayItem("Override")]
-		public List<AceUrlSchemeOverride> Overrides
+		public List<AceUrlSchemeOverride> CustomOverrides
 		{
-			get { return m_vOverrides; }
+			get { return m_lCustomOverrides; }
 			set
 			{
 				if(value == null) throw new ArgumentNullException("value");
-				m_vOverrides = value;
+				m_lCustomOverrides = value;
 			}
 		}
 
 		public AceUrlSchemeOverrides()
 		{
+			MakeBuiltInList();
 		}
 
-		public void SetDefaultsIfEmpty()
-		{
-			if(m_bSetToDefaults == false) return;
-
-			m_bSetToDefaults = false; // Set only once
-			m_vOverrides.Clear(); // Avoid duplication of defaults
-
-			m_vOverrides.Add(new AceUrlSchemeOverride(true, "ssh",
-				@"cmd://PuTTY.exe -ssh {USERNAME}@{URL:RMVSCM}"));
-			m_vOverrides.Add(new AceUrlSchemeOverride(false, "http",
-				"cmd://{INTERNETEXPLORER} \"{URL}\""));
-			m_vOverrides.Add(new AceUrlSchemeOverride(false, "https",
-				"cmd://{INTERNETEXPLORER} \"{URL}\""));
-			m_vOverrides.Add(new AceUrlSchemeOverride(false, "http",
-				"cmd://{FIREFOX} \"{URL}\""));
-			m_vOverrides.Add(new AceUrlSchemeOverride(false, "https",
-				"cmd://{FIREFOX} \"{URL}\""));
-			m_vOverrides.Add(new AceUrlSchemeOverride(false, "chrome",
-				"cmd://{FIREFOX} -chrome \"{URL}\""));
-			m_vOverrides.Add(new AceUrlSchemeOverride(false, "http",
-				"cmd://{OPERA} \"{URL}\""));
-			m_vOverrides.Add(new AceUrlSchemeOverride(false, "https",
-				"cmd://{OPERA} \"{URL}\""));
-			m_vOverrides.Add(new AceUrlSchemeOverride(false, "http",
-				"cmd://{GOOGLECHROME} \"{URL}\""));
-			m_vOverrides.Add(new AceUrlSchemeOverride(false, "https",
-				"cmd://{GOOGLECHROME} \"{URL}\""));
-			m_vOverrides.Add(new AceUrlSchemeOverride(false, "kdbx",
-				"cmd://\"{APPDIR}\\KeePass.exe\" \"{URL:RMVSCM}\" -pw-enc:\"{PASSWORD_ENC}\""));
-			m_vOverrides.Add(new AceUrlSchemeOverride(false, "kdbx",
-				"cmd://mono \"{APPDIR}/KeePass.exe\" \"{URL:RMVSCM}\" -pw-enc:\"{PASSWORD_ENC}\""));
+		private void MakeBuiltInList()
+		{
+			m_lBuiltInOverrides.Clear();
+
+			m_lBuiltInOverrides.Add(new AceUrlSchemeOverride(true, "ssh",
+				@"cmd://PuTTY.exe -ssh {USERNAME}@{URL:RMVSCM}", 0x1));
+			m_lBuiltInOverrides.Add(new AceUrlSchemeOverride(false, "http",
+				"cmd://{INTERNETEXPLORER} \"{URL}\"", 0x2));
+			m_lBuiltInOverrides.Add(new AceUrlSchemeOverride(false, "https",
+				"cmd://{INTERNETEXPLORER} \"{URL}\"", 0x4));
+			m_lBuiltInOverrides.Add(new AceUrlSchemeOverride(false, "http",
+				"cmd://{FIREFOX} \"{URL}\"", 0x8));
+			m_lBuiltInOverrides.Add(new AceUrlSchemeOverride(false, "https",
+				"cmd://{FIREFOX} \"{URL}\"", 0x10));
+			m_lBuiltInOverrides.Add(new AceUrlSchemeOverride(false, "chrome",
+				"cmd://{FIREFOX} -chrome \"{URL}\"", 0x20));
+			m_lBuiltInOverrides.Add(new AceUrlSchemeOverride(false, "http",
+				"cmd://{OPERA} \"{URL}\"", 0x40));
+			m_lBuiltInOverrides.Add(new AceUrlSchemeOverride(false, "https",
+				"cmd://{OPERA} \"{URL}\"", 0x80));
+			m_lBuiltInOverrides.Add(new AceUrlSchemeOverride(false, "http",
+				"cmd://{GOOGLECHROME} \"{URL}\"", 0x100));
+			m_lBuiltInOverrides.Add(new AceUrlSchemeOverride(false, "https",
+				"cmd://{GOOGLECHROME} \"{URL}\"", 0x200));
+			m_lBuiltInOverrides.Add(new AceUrlSchemeOverride(false, "http",
+				"cmd://{SAFARI} \"{URL}\"", 0x400));
+			m_lBuiltInOverrides.Add(new AceUrlSchemeOverride(false, "https",
+				"cmd://{SAFARI} \"{URL}\"", 0x800));
+			m_lBuiltInOverrides.Add(new AceUrlSchemeOverride(false, "kdbx",
+				"cmd://\"{APPDIR}\\KeePass.exe\" \"{URL:RMVSCM}\" -pw-enc:\"{PASSWORD_ENC}\"", 0x1000));
+			m_lBuiltInOverrides.Add(new AceUrlSchemeOverride(false, "kdbx",
+				"cmd://mono \"{APPDIR}/KeePass.exe\" \"{URL:RMVSCM}\" -pw-enc:\"{PASSWORD_ENC}\"", 0x2000));
+
+#if DEBUG
+			ulong u = 0;
+			for(int i = 0; i < m_lBuiltInOverrides.Count; ++i)
+			{
+				Debug.Assert(m_lBuiltInOverrides[i].IsBuiltIn);
+				u += m_lBuiltInOverrides[i].BuiltInFlagID;
+			}
+			Debug.Assert(u == ((1UL << m_lBuiltInOverrides.Count) - 1UL));
+#endif
 		}
 
 		public string GetOverrideForUrl(string strUrl)
 		{
 			if(string.IsNullOrEmpty(strUrl)) return null;
 
-			foreach(AceUrlSchemeOverride ovr in m_vOverrides)
+			for(int i = 0; i < 2; ++i)
 			{
-				if(!ovr.Enabled) continue;
+				List<AceUrlSchemeOverride> l = ((i == 0) ? m_lBuiltInOverrides :
+					m_lCustomOverrides);
 
-				if(strUrl.StartsWith(ovr.Scheme + ":", StrUtil.CaseIgnoreCmp))
-					return ovr.UrlOverride;
+				foreach(AceUrlSchemeOverride ovr in l)
+				{
+					if(!ovr.Enabled) continue;
+
+					if(strUrl.StartsWith(ovr.Scheme + ":", StrUtil.CaseIgnoreCmp))
+						return ovr.UrlOverride;
+				}
 			}
 
 			return null;
@@ -263,14 +315,42 @@ namespace KeePass.App.Configuration
 		public AceUrlSchemeOverrides CloneDeep()
 		{
 			AceUrlSchemeOverrides ovr = new AceUrlSchemeOverrides();
+			CopyTo(ovr);
+			return ovr;
+		}
 
-			ovr.m_bSetToDefaults = m_bSetToDefaults;
-			foreach(AceUrlSchemeOverride sh in m_vOverrides)
+		public void CopyTo(AceUrlSchemeOverrides ovrTarget)
+		{
+			ovrTarget.m_lBuiltInOverrides.Clear();
+			foreach(AceUrlSchemeOverride shB in m_lBuiltInOverrides)
 			{
-				ovr.m_vOverrides.Add(sh.CloneDeep());
+				ovrTarget.m_lBuiltInOverrides.Add(shB.CloneDeep());
 			}
 
-			return ovr;
+			ovrTarget.m_lCustomOverrides.Clear();
+			foreach(AceUrlSchemeOverride shC in m_lCustomOverrides)
+			{
+				ovrTarget.m_lCustomOverrides.Add(shC.CloneDeep());
+			}
+		}
+
+		public ulong GetEnabledBuiltInOverrides()
+		{
+			ulong u = 0;
+			for(int i = 0; i < m_lBuiltInOverrides.Count; ++i)
+			{
+				if(m_lBuiltInOverrides[i].Enabled)
+					u |= m_lBuiltInOverrides[i].BuiltInFlagID;
+			}
+
+			return u;
+		}
+
+		public void SetEnabledBuiltInOverrides(ulong uFlags)
+		{
+			for(int i = 0; i < m_lBuiltInOverrides.Count; ++i)
+				m_lBuiltInOverrides[i].Enabled = ((uFlags &
+					m_lBuiltInOverrides[i].BuiltInFlagID) != 0UL);
 		}
 	}
 
@@ -305,6 +385,19 @@ namespace KeePass.App.Configuration
 			}
 		}
 
+		private ulong m_uBuiltInFlagID = 0;
+		[XmlIgnore]
+		internal ulong BuiltInFlagID
+		{
+			get { return m_uBuiltInFlagID; }
+		}
+
+		[XmlIgnore]
+		public bool IsBuiltIn
+		{
+			get { return (m_uBuiltInFlagID != 0UL); }
+		}
+
 		public AceUrlSchemeOverride()
 		{
 		}
@@ -312,17 +405,31 @@ namespace KeePass.App.Configuration
 		public AceUrlSchemeOverride(bool bEnable, string strScheme,
 			string strUrlOverride)
 		{
+			Init(bEnable, strScheme, strUrlOverride, 0);
+		}
+
+		internal AceUrlSchemeOverride(bool bEnable, string strScheme,
+			string strUrlOverride, ulong uBuiltInFlagID)
+		{
+			Init(bEnable, strScheme, strUrlOverride, uBuiltInFlagID);
+		}
+
+		private void Init(bool bEnable, string strScheme, string strUrlOverride,
+			ulong uBuiltInFlagID)
+		{
 			if(strScheme == null) throw new ArgumentNullException("strScheme");
 			if(strUrlOverride == null) throw new ArgumentNullException("strUrlOverride");
 
 			m_bEnabled = bEnable;
 			m_strScheme = strScheme;
 			m_strOvr = strUrlOverride;
+			m_uBuiltInFlagID = uBuiltInFlagID;
 		}
 
 		public AceUrlSchemeOverride CloneDeep()
 		{
-			return new AceUrlSchemeOverride(m_bEnabled, m_strScheme, m_strOvr);
+			return new AceUrlSchemeOverride(m_bEnabled, m_strScheme,
+				m_strOvr, m_uBuiltInFlagID);
 		}
 	}
 }
diff --git a/KeePass/App/Configuration/AceLogging.cs b/KeePass/App/Configuration/AceLogging.cs
index 665e159..bcd8479 100644
--- a/KeePass/App/Configuration/AceLogging.cs
+++ b/KeePass/App/Configuration/AceLogging.cs
@@ -20,6 +20,7 @@
 using System;
 using System.Collections.Generic;
 using System.Text;
+using System.ComponentModel;
 
 namespace KeePass.App.Configuration
 {
@@ -30,6 +31,7 @@ namespace KeePass.App.Configuration
 		}
 
 		private bool m_bEnabled = false;
+		[DefaultValue(false)]
 		public bool Enabled
 		{
 			get { return m_bEnabled; }
diff --git a/KeePass/App/Configuration/AceMainWindow.cs b/KeePass/App/Configuration/AceMainWindow.cs
index 967c6d0..34e2b58 100644
--- a/KeePass/App/Configuration/AceMainWindow.cs
+++ b/KeePass/App/Configuration/AceMainWindow.cs
@@ -23,6 +23,7 @@ using System.Text;
 using System.Drawing;
 using System.Windows.Forms;
 using System.Xml.Serialization;
+using System.ComponentModel;
 using System.Diagnostics;
 
 using KeePassLib;
@@ -73,6 +74,7 @@ namespace KeePass.App.Configuration
 		}
 
 		private bool m_bMax = false;
+		[DefaultValue(false)]
 		public bool Maximized
 		{
 			get { return m_bMax; }
@@ -101,6 +103,7 @@ namespace KeePass.App.Configuration
 		}
 
 		private bool m_bTop = false;
+		[DefaultValue(false)]
 		public bool AlwaysOnTop
 		{
 			get { return m_bTop; }
@@ -108,6 +111,7 @@ namespace KeePass.App.Configuration
 		}
 
 		private bool m_bCloseMin = false;
+		[DefaultValue(false)]
 		public bool CloseButtonMinimizesWindow
 		{
 			get { return m_bCloseMin; }
@@ -115,6 +119,7 @@ namespace KeePass.App.Configuration
 		}
 
 		private bool m_bMinToTray = false;
+		[DefaultValue(false)]
 		public bool MinimizeToTray
 		{
 			get { return m_bMinToTray; }
@@ -122,6 +127,7 @@ namespace KeePass.App.Configuration
 		}
 
 		private bool m_bFullPath = false;
+		[DefaultValue(false)]
 		public bool ShowFullPathInTitle
 		{
 			get { return m_bFullPath; }
@@ -129,6 +135,7 @@ namespace KeePass.App.Configuration
 		}
 
 		private bool m_bDropToBackAfterCopy = false;
+		[DefaultValue(false)]
 		public bool DropToBackAfterClipboardCopy
 		{
 			get { return m_bDropToBackAfterCopy; }
@@ -136,13 +143,15 @@ namespace KeePass.App.Configuration
 		}
 
 		private bool m_bMinAfterCopy = false;
+		[DefaultValue(false)]
 		public bool MinimizeAfterClipboardCopy
 		{
 			get { return m_bMinAfterCopy; }
 			set { m_bMinAfterCopy = value; }
 		}
 
-		private bool m_bMinAfterLocking = false;
+		private bool m_bMinAfterLocking = true;
+		[DefaultValue(true)]
 		public bool MinimizeAfterLocking
 		{
 			get { return m_bMinAfterLocking; }
@@ -150,6 +159,7 @@ namespace KeePass.App.Configuration
 		}
 
 		private bool m_bMinAfterOpeningDb = false;
+		[DefaultValue(false)]
 		public bool MinimizeAfterOpeningDatabase
 		{
 			get { return m_bMinAfterOpeningDb; }
@@ -157,6 +167,7 @@ namespace KeePass.App.Configuration
 		}
 
 		private bool m_bQuickFindSearchInPasswords = false;
+		[DefaultValue(false)]
 		public bool QuickFindSearchInPasswords
 		{
 			get { return m_bQuickFindSearchInPasswords; }
@@ -164,20 +175,44 @@ namespace KeePass.App.Configuration
 		}
 
 		private bool m_bQuickFindExcludeExpired = false;
+		[DefaultValue(false)]
 		public bool QuickFindExcludeExpired
 		{
 			get { return m_bQuickFindExcludeExpired; }
 			set { m_bQuickFindExcludeExpired = value; }
 		}
 
+		private bool m_bQuickFindDerefData = false;
+		[DefaultValue(false)]
+		public bool QuickFindDerefData
+		{
+			get { return m_bQuickFindDerefData; }
+			set { m_bQuickFindDerefData = value; }
+		}
+
 		private bool m_bFocusResAfterQuickFind = false;
+		[DefaultValue(false)]
 		public bool FocusResultsAfterQuickFind
 		{
 			get { return m_bFocusResAfterQuickFind; }
 			set { m_bFocusResAfterQuickFind = value; }
 		}
 
+		private bool m_bFocusQuickFindOnRestore = false;
+		/// <summary>
+		/// Focus the quick search box when restoring the main
+		/// window. Here 'restoring' actually means unminimizing,
+		/// i.e. restoring or maximizing the window.
+		/// </summary>
+		[DefaultValue(false)]
+		public bool FocusQuickFindOnRestore
+		{
+			get { return m_bFocusQuickFindOnRestore; }
+			set { m_bFocusQuickFindOnRestore = value; }
+		}
+
 		private bool m_bFocusQuickFindOnUntray = false;
+		[DefaultValue(false)]
 		public bool FocusQuickFindOnUntray
 		{
 			get { return m_bFocusQuickFindOnUntray; }
@@ -185,6 +220,7 @@ namespace KeePass.App.Configuration
 		}
 
 		private bool m_bCopyUrls = false;
+		[DefaultValue(false)]
 		public bool CopyUrlsInsteadOfOpening
 		{
 			get { return m_bCopyUrls; }
@@ -196,6 +232,7 @@ namespace KeePass.App.Configuration
 		/// Disable 'Save' button (instead of graying it out) if the database
 		/// hasn't been modified.
 		/// </summary>
+		[DefaultValue(false)]
 		public bool DisableSaveIfNotModified
 		{
 			get { return m_bDisableSaveIfNotModified; }
@@ -248,6 +285,7 @@ namespace KeePass.App.Configuration
 		}
 
 		private string m_strDisplayIndices = string.Empty;
+		[DefaultValue("")]
 		public string EntryListColumnDisplayOrder
 		{
 			get { return m_strDisplayIndices; }
@@ -259,6 +297,7 @@ namespace KeePass.App.Configuration
 		}
 
 		private bool m_bAutoResizeColumns = false;
+		[DefaultValue(false)]
 		public bool EntryListAutoResizeColumns
 		{
 			get { return m_bAutoResizeColumns; }
@@ -266,12 +305,29 @@ namespace KeePass.App.Configuration
 		}
 
 		private bool m_bAlternatingBgColor = true;
+		[DefaultValue(true)]
 		public bool EntryListAlternatingBgColors
 		{
 			get { return m_bAlternatingBgColor; }
 			set { m_bAlternatingBgColor = value; }
 		}
 
+		private bool m_bResolveFieldRefs = false;
+		[DefaultValue(false)]
+		public bool EntryListShowDerefData
+		{
+			get { return m_bResolveFieldRefs; }
+			set { m_bResolveFieldRefs = value; }
+		}
+
+		private bool m_bResolveFieldRefsAsync = false;
+		[DefaultValue(false)]
+		public bool EntryListShowDerefDataAsync
+		{
+			get { return m_bResolveFieldRefsAsync; }
+			set { m_bResolveFieldRefsAsync = value; }
+		}
+
 		// private bool m_bGridLines = false;
 		// public bool ShowGridLines
 		// {
@@ -291,6 +347,7 @@ namespace KeePass.App.Configuration
 		}
 
 		private bool m_bShowEntriesOfSubGroups = false;
+		[DefaultValue(false)]
 		public bool ShowEntriesOfSubGroups
 		{
 			get { return m_bShowEntriesOfSubGroups; }
@@ -306,6 +363,16 @@ namespace KeePass.App.Configuration
 
 			return null;
 		}
+
+		public bool IsColumnHidden(AceColumnType t, bool bDefault)
+		{
+			foreach(AceColumn c in m_aceColumns)
+			{
+				if(c.Type == t) return c.HideWithAsterisks;
+			}
+
+			return bDefault;
+		}
 	}
 
 	public sealed class AceEntryView
@@ -315,6 +382,7 @@ namespace KeePass.App.Configuration
 		}
 
 		private bool m_bShow = true;
+		[DefaultValue(true)]
 		public bool Show
 		{
 			get { return m_bShow; }
@@ -322,6 +390,7 @@ namespace KeePass.App.Configuration
 		}
 
 		private bool m_bHideProtectedCustomStrings = true;
+		[DefaultValue(true)]
 		public bool HideProtectedCustomStrings
 		{
 			get { return m_bHideProtectedCustomStrings; }
@@ -336,6 +405,7 @@ namespace KeePass.App.Configuration
 		}
 
 		private bool m_bSimple = true;
+		[DefaultValue(true)]
 		public bool UseSimpleView
 		{
 			get { return m_bSimple; }
@@ -343,6 +413,7 @@ namespace KeePass.App.Configuration
 		}
 
 		private bool m_bIndices = true;
+		[DefaultValue(true)]
 		public bool ShowIndices
 		{
 			get { return m_bIndices; }
@@ -393,6 +464,7 @@ namespace KeePass.App.Configuration
 		}
 
 		private string m_strCustomName = string.Empty;
+		[DefaultValue("")]
 		public string CustomName
 		{
 			get { return m_strCustomName; }
@@ -411,6 +483,7 @@ namespace KeePass.App.Configuration
 		}
 
 		private bool m_bHide = false;
+		[DefaultValue(false)]
 		public bool HideWithAsterisks
 		{
 			get { return m_bHide; }
diff --git a/KeePass/App/Configuration/AceNative.cs b/KeePass/App/Configuration/AceNative.cs
index 4c6b278..cb31272 100644
--- a/KeePass/App/Configuration/AceNative.cs
+++ b/KeePass/App/Configuration/AceNative.cs
@@ -20,6 +20,7 @@
 using System;
 using System.Collections.Generic;
 using System.Text;
+using System.ComponentModel;
 
 namespace KeePass.App.Configuration
 {
@@ -30,6 +31,7 @@ namespace KeePass.App.Configuration
 		}
 
 		private bool m_bNativeKeyTrans = true;
+		[DefaultValue(true)]
 		public bool NativeKeyTransformations
 		{
 			get { return m_bNativeKeyTrans; }
diff --git a/KeePass/App/Configuration/AceSecurity.cs b/KeePass/App/Configuration/AceSecurity.cs
index eaf2903..1817531 100644
--- a/KeePass/App/Configuration/AceSecurity.cs
+++ b/KeePass/App/Configuration/AceSecurity.cs
@@ -20,6 +20,7 @@
 using System;
 using System.Collections.Generic;
 using System.Text;
+using System.ComponentModel;
 
 namespace KeePass.App.Configuration
 {
@@ -63,6 +64,7 @@ namespace KeePass.App.Configuration
 		}
 
 		private bool m_bSecureDesktop = false;
+		[DefaultValue(false)]
 		public bool MasterKeyOnSecureDesktop
 		{
 			get { return m_bSecureDesktop; }
@@ -70,6 +72,7 @@ namespace KeePass.App.Configuration
 		}
 
 		private bool m_bClipClearOnExit = true;
+		[DefaultValue(true)]
 		public bool ClipboardClearOnExit
 		{
 			get { return m_bClipClearOnExit; }
@@ -77,6 +80,7 @@ namespace KeePass.App.Configuration
 		}
 
 		private int m_nClipClearSeconds = 12;
+		[DefaultValue(12)]
 		public int ClipboardClearAfterSeconds
 		{
 			get { return m_nClipClearSeconds; }
@@ -87,6 +91,7 @@ namespace KeePass.App.Configuration
 		// crash with the Clipboard Viewer Ignore format
 		// (when it is set using OleSetClipboard)
 		private bool m_bUseClipboardViewerIgnoreFmt = false;
+		[DefaultValue(false)]
 		public bool UseClipboardViewerIgnoreFormat
 		{
 			get { return m_bUseClipboardViewerIgnoreFmt; }
@@ -94,6 +99,7 @@ namespace KeePass.App.Configuration
 		}
 
 		private bool m_bClearKeyCmdLineOpt = true;
+		[DefaultValue(true)]
 		public bool ClearKeyCommandLineParams
 		{
 			get { return m_bClearKeyCmdLineOpt; }
@@ -108,6 +114,7 @@ namespace KeePass.App.Configuration
 		}
 
 		private bool m_bOnMinimize = false;
+		[DefaultValue(false)]
 		public bool LockOnWindowMinimize
 		{
 			get { return m_bOnMinimize; }
@@ -115,6 +122,7 @@ namespace KeePass.App.Configuration
 		}
 
 		private bool m_bOnSessionSwitch = false;
+		[DefaultValue(false)]
 		public bool LockOnSessionSwitch
 		{
 			get { return m_bOnSessionSwitch; }
@@ -122,6 +130,7 @@ namespace KeePass.App.Configuration
 		}
 
 		private bool m_bOnSuspend = false;
+		[DefaultValue(false)]
 		public bool LockOnSuspend
 		{
 			get { return m_bOnSuspend; }
@@ -129,6 +138,7 @@ namespace KeePass.App.Configuration
 		}
 
 		private bool m_bOnRemoteControlChange = false;
+		[DefaultValue(false)]
 		public bool LockOnRemoteControlChange
 		{
 			get { return m_bOnRemoteControlChange; }
@@ -150,6 +160,7 @@ namespace KeePass.App.Configuration
 		}
 
 		private bool m_bExitInsteadOfLockingAfterTime = false;
+		[DefaultValue(false)]
 		public bool ExitInsteadOfLockingAfterTime
 		{
 			get { return m_bExitInsteadOfLockingAfterTime; }
@@ -157,6 +168,7 @@ namespace KeePass.App.Configuration
 		}
 
 		private bool m_bAlwaysExitInsteadOfLocking = false;
+		[DefaultValue(false)]
 		public bool AlwaysExitInsteadOfLocking
 		{
 			get { return m_bAlwaysExitInsteadOfLocking; }
diff --git a/KeePass/App/Configuration/AceToolBar.cs b/KeePass/App/Configuration/AceToolBar.cs
index 0d18b27..1c6d753 100644
--- a/KeePass/App/Configuration/AceToolBar.cs
+++ b/KeePass/App/Configuration/AceToolBar.cs
@@ -20,6 +20,7 @@
 using System;
 using System.Collections.Generic;
 using System.Text;
+using System.ComponentModel;
 
 namespace KeePass.App.Configuration
 {
@@ -30,6 +31,7 @@ namespace KeePass.App.Configuration
 		}
 
 		private bool m_bShow = true;
+		[DefaultValue(true)]
 		public bool Show
 		{
 			get { return m_bShow; }
diff --git a/KeePass/App/Configuration/AceTrayIcon.cs b/KeePass/App/Configuration/AceTrayIcon.cs
index bc65ef9..f0b7917 100644
--- a/KeePass/App/Configuration/AceTrayIcon.cs
+++ b/KeePass/App/Configuration/AceTrayIcon.cs
@@ -20,6 +20,7 @@
 using System;
 using System.Collections.Generic;
 using System.Text;
+using System.ComponentModel;
 
 namespace KeePass.App.Configuration
 {
@@ -30,6 +31,7 @@ namespace KeePass.App.Configuration
 		}
 
 		private bool m_bOnlyIfTrayed = false;
+		[DefaultValue(false)]
 		public bool ShowOnlyIfTrayed
 		{
 			get { return m_bOnlyIfTrayed; }
@@ -37,6 +39,7 @@ namespace KeePass.App.Configuration
 		}
 
 		private bool m_bSingleClickDefault = false;
+		[DefaultValue(false)]
 		public bool SingleClickDefault
 		{
 			get { return m_bSingleClickDefault; }
diff --git a/KeePass/App/Configuration/AceUI.cs b/KeePass/App/Configuration/AceUI.cs
index a9b1dfe..8eaef5c 100644
--- a/KeePass/App/Configuration/AceUI.cs
+++ b/KeePass/App/Configuration/AceUI.cs
@@ -21,6 +21,7 @@ using System;
 using System.Collections.Generic;
 using System.Text;
 using System.Drawing;
+using System.ComponentModel;
 using System.Diagnostics;
 
 using KeePass.UI;
@@ -109,6 +110,7 @@ namespace KeePass.App.Configuration
 		}
 
 		private bool m_bForceSysFont = true;
+		[DefaultValue(true)]
 		public bool ForceSystemFontUnix
 		{
 			get { return m_bForceSysFont; }
@@ -123,6 +125,7 @@ namespace KeePass.App.Configuration
 		}
 
 		private bool m_bShowImportStatusDlg = true;
+		[DefaultValue(true)]
 		public bool ShowImportStatusDialog
 		{
 			get { return m_bShowImportStatusDlg; }
@@ -130,6 +133,7 @@ namespace KeePass.App.Configuration
 		}
 
 		private bool m_bShowDbMntncResDlg = true;
+		[DefaultValue(true)]
 		public bool ShowDbMntncResultsDialog
 		{
 			get { return m_bShowDbMntncResDlg; }
@@ -137,6 +141,7 @@ namespace KeePass.App.Configuration
 		}
 
 		private bool m_bUseCustomTsRenderer = true;
+		[DefaultValue(true)]
 		public bool UseCustomToolStripRenderer
 		{
 			get { return m_bUseCustomTsRenderer; }
@@ -144,6 +149,7 @@ namespace KeePass.App.Configuration
 		}
 
 		private bool m_bOptScreenReader = false;
+		[DefaultValue(false)]
 		public bool OptimizeForScreenReader
 		{
 			get { return m_bOptScreenReader; }
@@ -151,6 +157,7 @@ namespace KeePass.App.Configuration
 		}
 
 		private string m_strDataEditorRect = string.Empty;
+		[DefaultValue("")]
 		public string DataEditorRect
 		{
 			get { return m_strDataEditorRect; }
@@ -173,6 +180,7 @@ namespace KeePass.App.Configuration
 		}
 
 		private bool m_bDeWordWrap = true;
+		[DefaultValue(true)]
 		public bool DataEditorWordWrap
 		{
 			get { return m_bDeWordWrap; }
@@ -180,6 +188,7 @@ namespace KeePass.App.Configuration
 		}
 
 		private string m_strCharPickerRect = string.Empty;
+		[DefaultValue("")]
 		public string CharPickerRect
 		{
 			get { return m_strCharPickerRect; }
@@ -190,6 +199,30 @@ namespace KeePass.App.Configuration
 			}
 		}
 
+		private string m_strAutoTypeCtxRect = string.Empty;
+		[DefaultValue("")]
+		public string AutoTypeCtxRect
+		{
+			get { return m_strAutoTypeCtxRect; }
+			set
+			{
+				if(value == null) throw new ArgumentNullException("value");
+				m_strAutoTypeCtxRect = value;
+			}
+		}
+
+		private string m_strAutoTypeCtxColWidths = string.Empty;
+		[DefaultValue("")]
+		public string AutoTypeCtxColumnWidths
+		{
+			get { return m_strAutoTypeCtxColWidths; }
+			set
+			{
+				if(value == null) throw new ArgumentNullException("value");
+				m_strAutoTypeCtxColWidths = value;
+			}
+		}
+
 		private ulong m_uUIFlags = (ulong)AceUIFlags.None;
 		public ulong UIFlags
 		{
@@ -219,6 +252,7 @@ namespace KeePass.App.Configuration
 		// }
 
 		private bool m_bSecDeskSound = true;
+		[DefaultValue(true)]
 		public bool SecureDesktopPlaySound
 		{
 			get { return m_bSecDeskSound; }
@@ -233,6 +267,7 @@ namespace KeePass.App.Configuration
 		}
 
 		private bool m_bSepHiding = false;
+		[DefaultValue(false)]
 		public bool SeparateHidingSettings
 		{
 			get { return m_bSepHiding; }
@@ -240,6 +275,7 @@ namespace KeePass.App.Configuration
 		}
 
 		private bool m_bHideInEntryDialog = true;
+		[DefaultValue(true)]
 		public bool HideInEntryWindow
 		{
 			get { return m_bHideInEntryDialog; }
@@ -247,6 +283,7 @@ namespace KeePass.App.Configuration
 		}
 
 		private bool m_bUnhideBtnAlsoUnhidesSec = false;
+		[DefaultValue(false)]
 		public bool UnhideButtonAlsoUnhidesSource
 		{
 			get { return m_bUnhideBtnAlsoUnhidesSec; }
diff --git a/KeePass/App/Configuration/AppConfigEx.cs b/KeePass/App/Configuration/AppConfigEx.cs
index 1d82f9c..778ab2d 100644
--- a/KeePass/App/Configuration/AppConfigEx.cs
+++ b/KeePass/App/Configuration/AppConfigEx.cs
@@ -178,6 +178,8 @@ namespace KeePass.App.Configuration
 		/// </summary>
 		private void PrepareSave()
 		{
+			m_meta.OmitItemsWithDefaultValues = true;
+
 			m_aceApp.LastUsedFile.ClearCredentials(true);
 
 			foreach(IOConnectionInfo iocMru in m_aceApp.MostRecentlyUsed.Items)
@@ -187,11 +189,13 @@ namespace KeePass.App.Configuration
 				m_def.KeySources.Clear();
 
 			m_aceApp.TriggerSystem = Program.TriggerSystem;
+
+			SearchUtil.PrepareForSerialize(m_def.SearchParameters);
 		}
 
 		internal void OnLoad()
 		{
-			m_int.UrlSchemeOverrides.SetDefaultsIfEmpty();
+			// m_int.UrlSchemeOverrides.SetDefaultsIfEmpty();
 
 			ObfuscateCred(false);
 			ChangePathsRelAbs(true);
@@ -206,6 +210,8 @@ namespace KeePass.App.Configuration
 					vColumns.RemoveAt(i);
 				else ++i;
 			}
+
+			SearchUtil.FinishDeserialize(m_def.SearchParameters);
 		}
 
 		internal void OnSavePre()
@@ -243,7 +249,11 @@ namespace KeePass.App.Configuration
 		{
 			if(ioc == null) { Debug.Assert(false); return; }
 
-			if(ioc.IsLocalFile() == false) return;
+			if(!ioc.IsLocalFile()) return;
+
+			// Update path separators for current system
+			if(!UrlUtil.IsUncPath(ioc.Path))
+				ioc.Path = UrlUtil.ConvertSeparators(ioc.Path);
 
 			string strBase = WinUtil.GetExecutable();
 			bool bIsAbs = UrlUtil.IsAbsolutePath(ioc.Path);
@@ -302,5 +312,16 @@ namespace KeePass.App.Configuration
 		//	get { return m_bIsEnforced; }
 		//	set { m_bIsEnforced = value; }
 		// }
+
+		private bool m_bOmitDefaultValues = true;
+		// Informational property only (like an XML comment);
+		// currently doesn't have any effect (the XmlSerializer
+		// always omits default values, independent of this
+		// property)
+		public bool OmitItemsWithDefaultValues
+		{
+			get { return m_bOmitDefaultValues; }
+			set { m_bOmitDefaultValues = value; }
+		}
 	}
 }
diff --git a/KeePass/DataExchange/Formats/PpKeeperHtml270.cs b/KeePass/DataExchange/Formats/PpKeeperHtml270.cs
index c6a0d0a..e7dc991 100644
--- a/KeePass/DataExchange/Formats/PpKeeperHtml270.cs
+++ b/KeePass/DataExchange/Formats/PpKeeperHtml270.cs
@@ -20,9 +20,10 @@
 using System;
 using System.Collections.Generic;
 using System.Text;
+using System.Text.RegularExpressions;
 using System.Drawing;
-using System.Diagnostics;
 using System.IO;
+using System.Diagnostics;
 
 using KeePass.Resources;
 
@@ -33,7 +34,7 @@ using KeePassLib.Utility;
 
 namespace KeePass.DataExchange.Formats
 {
-	// 2.70
+	// 2.50 and 2.70
 	internal sealed class PpKeeperHtml270 : FileFormatProvider
 	{
 		public override bool SupportsImport { get { return true; } }
@@ -47,15 +48,17 @@ namespace KeePass.DataExchange.Formats
 
 		public override Image SmallIcon
 		{
+			// Passphrase Keeper uses the same standard XP keys icon
+			// as Whisper 32
 			get { return KeePass.Properties.Resources.B16x16_Imp_Whisper32; }
 		}
 
 		private const string m_strStartTd = "<td class=\"c0\" nowrap>";
 		private const string m_strEndTd = @"</td>";
 
-		private const string m_strModifiedField = @"{0530D298-F983-454c-B5A3-BFB0775844D1}";
+		private const string m_strModifiedField = @"{0530D298-F983-454C-B5A3-BFB0775844D1}";
 
-		private const string m_strModifiedHeader = "Modified";
+		private const string m_strModifiedHdrStart = "Modified";
 
 		public override void Import(PwDatabase pwStorage, Stream sInput,
 			IStatusLogger slLogger)
@@ -64,18 +67,34 @@ namespace KeePass.DataExchange.Formats
 			string strData = sr.ReadToEnd();
 			sr.Close();
 
-			const string strNormalized = "<td class=\"c0\" nowrap>";
-			strData = strData.Replace("<td class=\"c1\" nowrap>", strNormalized);
-			strData = strData.Replace("<td class=\"c2\" nowrap>", strNormalized);
-			strData = strData.Replace("<td class=\"c3\" nowrap>", strNormalized);
-			strData = strData.Replace("<td class=\"c4\" nowrap>", strNormalized);
-			strData = strData.Replace("<td class=\"c5\" nowrap>", strNormalized);
-			strData = strData.Replace("<td class=\"c6\" nowrap>", strNormalized);
+			// Normalize 2.70 files
+			strData = strData.Replace("<td class=\"c1\" nowrap>", m_strStartTd);
+			strData = strData.Replace("<td class=\"c2\" nowrap>", m_strStartTd);
+			strData = strData.Replace("<td class=\"c3\" nowrap>", m_strStartTd);
+			strData = strData.Replace("<td class=\"c4\" nowrap>", m_strStartTd);
+			strData = strData.Replace("<td class=\"c5\" nowrap>", m_strStartTd);
+			strData = strData.Replace("<td class=\"c6\" nowrap>", m_strStartTd);
+
+			// Additionally support the old version 2.50
+			string[] vRepl = new string[4]{
+				@"<td nowrap align=""(center|right)"" bgcolor=""#[0-9a-fA-F]{6}""><font color=""#[0-9a-fA-F]{6}"">",
+				@"<td nowrap bgcolor=""#[0-9a-fA-F]{6}""><font color=""#[0-9a-fA-F]{6}"">",
+				@"<td nowrap align=""(center|right)"" bgcolor=""#[0-9a-fA-F]{6}""><b>",
+				@"<td nowrap bgcolor=""#[0-9a-fA-F]{6}""><b>"
+			};
+			MatchCollection mc = Regex.Matches(strData, vRepl[2]);
+			if((mc != null) && (mc.Count > 0))
+			{
+				foreach(string strRepl in vRepl)
+					strData = Regex.Replace(strData, strRepl, m_strStartTd);
+
+				strData = strData.Replace("</font></td>\r\n", m_strEndTd + "\r\n");
+			}
 
 			int nOffset = 0;
 
 			PwEntry peHeader;
-			if(ReadEntry(out peHeader, strData, ref nOffset, pwStorage) == false)
+			if(!ReadEntry(out peHeader, strData, ref nOffset, pwStorage))
 			{
 				Debug.Assert(false);
 				return;
@@ -84,7 +103,7 @@ namespace KeePass.DataExchange.Formats
 			while((nOffset >= 0) && (nOffset < strData.Length))
 			{
 				PwEntry pe;
-				if(ReadEntry(out pe, strData, ref nOffset, pwStorage) == false)
+				if(!ReadEntry(out pe, strData, ref nOffset, pwStorage))
 				{
 					Debug.Assert(false);
 					break;
@@ -95,8 +114,8 @@ namespace KeePass.DataExchange.Formats
 			}
 		}
 
-		private static bool ReadEntry(out PwEntry pe, string strData, ref int nOffset,
-			PwDatabase pd)
+		private static bool ReadEntry(out PwEntry pe, string strData,
+			ref int nOffset, PwDatabase pd)
 		{
 			pe = new PwEntry(true, true);
 
@@ -159,7 +178,7 @@ namespace KeePass.DataExchange.Formats
 		private static DateTime ReadModified(string strValue)
 		{
 			if(strValue == null) { Debug.Assert(false); return DateTime.Now; }
-			if(strValue == m_strModifiedHeader) return DateTime.Now;
+			if(strValue.StartsWith(m_strModifiedHdrStart)) return DateTime.Now;
 
 			string[] vParts = strValue.Split(new char[]{ ' ', ':', '/' },
 				StringSplitOptions.RemoveEmptyEntries);
diff --git a/KeePass/DataExchange/Kdb3File.cs b/KeePass/DataExchange/Kdb3File.cs
index adf1251..61873f1 100644
--- a/KeePass/DataExchange/Kdb3File.cs
+++ b/KeePass/DataExchange/Kdb3File.cs
@@ -27,6 +27,7 @@ using KeePass.Resources;
 
 using KeePassLib;
 using KeePassLib.Security;
+using KeePassLib.Collections;
 using KeePassLib.Delegates;
 using KeePassLib.Interfaces;
 using KeePassLib.Keys;
@@ -567,10 +568,12 @@ namespace KeePass.DataExchange
 						string strWindow = strLine.Substring(strWndPrefix.Length).Trim();
 						string strSeq = FindPrefixedLine(vLines, strSeqPrefix);
 						if((strSeq != null) && (strSeq.Length > strSeqPrefix.Length))
-							peStorage.AutoType.Set(strWindow, ConvertAutoTypeSequence(
-								strSeq.Substring(strSeqPrefix.Length), true));
+							peStorage.AutoType.Add(new AutoTypeAssociation(
+								strWindow, ConvertAutoTypeSequence(strSeq.Substring(
+								strSeqPrefix.Length), true)));
 						else // Window, but no sequence
-							peStorage.AutoType.Set(strWindow, string.Empty);
+							peStorage.AutoType.Add(new AutoTypeAssociation(
+								strWindow, string.Empty));
 
 						bProcessed = true;
 						break;
@@ -712,7 +715,7 @@ namespace KeePass.DataExchange
 				++uIndex;
 			}
 
-			foreach(KeyValuePair<string, string> kvp in peSource.AutoType.WindowSequencePairs)
+			foreach(AutoTypeAssociation a in peSource.AutoType.Associations)
 			{
 				if(bSeparator == false)
 				{
@@ -726,11 +729,11 @@ namespace KeePass.DataExchange
 
 				sbAppend.Append(AutoTypePrefix + strSuffix);
 				sbAppend.Append(@": ");
-				sbAppend.Append(ConvertAutoTypeSeqExp(kvp.Value, peSource));
+				sbAppend.Append(ConvertAutoTypeSeqExp(a.Sequence, peSource));
 				sbAppend.Append(MessageService.NewLine);
 				sbAppend.Append(AutoTypeWindowPrefix + strSuffix);
 				sbAppend.Append(@": ");
-				sbAppend.Append(kvp.Key);
+				sbAppend.Append(a.WindowName);
 				sbAppend.Append(MessageService.NewLine);
 
 				++uIndex;
diff --git a/KeePass/Ecas/EcasDefaultConditionProvider.cs b/KeePass/Ecas/EcasDefaultConditionProvider.cs
index 67d451e..e85c7f6 100644
--- a/KeePass/Ecas/EcasDefaultConditionProvider.cs
+++ b/KeePass/Ecas/EcasDefaultConditionProvider.cs
@@ -128,11 +128,12 @@ namespace KeePass.Ecas
 			int[] vTimeOuts = { 250, 1250 };
 			const string strBuffer = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa";
 			byte[] pbBuffer = Encoding.ASCII.GetBytes(strBuffer);
-			Ping ping = new Ping();
-			PingOptions options = new PingOptions(64, true);
 
 			try
 			{
+				Ping ping = new Ping(); // We have sufficient privileges?
+				PingOptions options = new PingOptions(64, true);
+
 				foreach(int nTimeOut in vTimeOuts)
 				{
 					PingReply reply = ping.Send(strHost, nTimeOut, pbBuffer, options);
diff --git a/KeePass/Ecas/EcasTrigger.cs b/KeePass/Ecas/EcasTrigger.cs
index 9f50355..bce0ac9 100644
--- a/KeePass/Ecas/EcasTrigger.cs
+++ b/KeePass/Ecas/EcasTrigger.cs
@@ -21,6 +21,7 @@ using System;
 using System.Collections.Generic;
 using System.Text;
 using System.Xml.Serialization;
+using System.ComponentModel;
 using System.Diagnostics;
 
 using KeePassLib;
@@ -57,6 +58,7 @@ namespace KeePass.Ecas
 		}
 
 		private string m_strName = string.Empty;
+		[DefaultValue("")]
 		public string Name
 		{
 			get { return m_strName; }
@@ -68,6 +70,7 @@ namespace KeePass.Ecas
 		}
 
 		private string m_strComments = string.Empty;
+		[DefaultValue("")]
 		public string Comments
 		{
 			get { return m_strComments; }
@@ -79,6 +82,7 @@ namespace KeePass.Ecas
 		}
 
 		private bool m_bEnabled = true;
+		[DefaultValue(true)]
 		public bool Enabled
 		{
 			get { return m_bEnabled; }
@@ -86,6 +90,7 @@ namespace KeePass.Ecas
 		}
 
 		private bool m_bInitiallyOn = true;
+		[DefaultValue(true)]
 		public bool InitiallyOn
 		{
 			get { return m_bInitiallyOn; }
@@ -101,6 +106,7 @@ namespace KeePass.Ecas
 		}
 
 		private bool m_bTurnOffAfterAction = false;
+		[DefaultValue(false)]
 		public bool TurnOffAfterAction
 		{
 			get { return m_bTurnOffAfterAction; }
diff --git a/KeePass/Ecas/EcasTriggerSystem.cs b/KeePass/Ecas/EcasTriggerSystem.cs
index 02ca9f3..1ed5e68 100644
--- a/KeePass/Ecas/EcasTriggerSystem.cs
+++ b/KeePass/Ecas/EcasTriggerSystem.cs
@@ -21,6 +21,7 @@ using System;
 using System.Collections.Generic;
 using System.Text;
 using System.Xml.Serialization;
+using System.ComponentModel;
 
 using KeePass.Resources;
 using KeePass.UI;
@@ -35,6 +36,7 @@ namespace KeePass.Ecas
 	public sealed class EcasTriggerSystem : IDeepCloneable<EcasTriggerSystem>
 	{
 		private bool m_bEnabled = true;
+		[DefaultValue(true)]
 		public bool Enabled
 		{
 			get { return m_bEnabled; }
diff --git a/KeePass/Ecas/EcasUtil.cs b/KeePass/Ecas/EcasUtil.cs
index b7e54b8..a875133 100644
--- a/KeePass/Ecas/EcasUtil.cs
+++ b/KeePass/Ecas/EcasUtil.cs
@@ -100,15 +100,14 @@ namespace KeePass.Ecas
 
 			if(bSprCompile && !string.IsNullOrEmpty(str))
 			{
-				PwDatabase pd = null;
-				try { pd = Program.MainForm.ActiveDatabase; }
-				catch(Exception) { Debug.Assert(false); }
-
 				PwEntry pe = null;
 				try { pe = Program.MainForm.GetSelectedEntry(false); }
 				catch(Exception) { Debug.Assert(false); }
 
-				str = SprEngine.Compile(str, false, pe, pd, false, bSprForCommandLine);
+				PwDatabase pd = Program.MainForm.DocumentManager.SafeFindContainerOf(pe);
+
+				str = SprEngine.Compile(str, new SprContext(pe, pd,
+					SprCompileFlags.All, false, bSprForCommandLine));
 			}
 
 			return str;
diff --git a/KeePass/Forms/AutoTypeCtxForm.Designer.cs b/KeePass/Forms/AutoTypeCtxForm.Designer.cs
new file mode 100644
index 0000000..d49407f
--- /dev/null
+++ b/KeePass/Forms/AutoTypeCtxForm.Designer.cs
@@ -0,0 +1,159 @@
+namespace KeePass.Forms
+{
+	partial class AutoTypeCtxForm
+	{
+		/// <summary>
+		/// Required designer variable.
+		/// </summary>
+		private System.ComponentModel.IContainer components = null;
+
+		/// <summary>
+		/// Clean up any resources being used.
+		/// </summary>
+		/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+		protected override void Dispose(bool disposing)
+		{
+			if(disposing && (components != null))
+			{
+				components.Dispose();
+			}
+			base.Dispose(disposing);
+		}
+
+		#region Windows Form Designer generated code
+
+		/// <summary>
+		/// Required method for Designer support - do not modify
+		/// the contents of this method with the code editor.
+		/// </summary>
+		private void InitializeComponent()
+		{
+			this.m_bannerImage = new System.Windows.Forms.PictureBox();
+			this.m_lblText = new System.Windows.Forms.Label();
+			this.m_btnCancel = new System.Windows.Forms.Button();
+			this.m_lvItems = new KeePass.UI.CustomListViewEx();
+			this.m_pnlTop = new System.Windows.Forms.Panel();
+			this.m_pnlBottom = new System.Windows.Forms.Panel();
+			this.m_pnlMiddle = new System.Windows.Forms.Panel();
+			((System.ComponentModel.ISupportInitialize)(this.m_bannerImage)).BeginInit();
+			this.m_pnlTop.SuspendLayout();
+			this.m_pnlBottom.SuspendLayout();
+			this.m_pnlMiddle.SuspendLayout();
+			this.SuspendLayout();
+			// 
+			// m_bannerImage
+			// 
+			this.m_bannerImage.Dock = System.Windows.Forms.DockStyle.Top;
+			this.m_bannerImage.Location = new System.Drawing.Point(0, 0);
+			this.m_bannerImage.Name = "m_bannerImage";
+			this.m_bannerImage.Size = new System.Drawing.Size(579, 60);
+			this.m_bannerImage.TabIndex = 0;
+			this.m_bannerImage.TabStop = false;
+			// 
+			// m_lblText
+			// 
+			this.m_lblText.Dock = System.Windows.Forms.DockStyle.Fill;
+			this.m_lblText.Location = new System.Drawing.Point(9, 11);
+			this.m_lblText.Name = "m_lblText";
+			this.m_lblText.Size = new System.Drawing.Size(561, 30);
+			this.m_lblText.TabIndex = 2;
+			this.m_lblText.Text = "<>";
+			// 
+			// m_btnCancel
+			// 
+			this.m_btnCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel;
+			this.m_btnCancel.Dock = System.Windows.Forms.DockStyle.Right;
+			this.m_btnCancel.Location = new System.Drawing.Point(492, 6);
+			this.m_btnCancel.Name = "m_btnCancel";
+			this.m_btnCancel.Size = new System.Drawing.Size(75, 23);
+			this.m_btnCancel.TabIndex = 1;
+			this.m_btnCancel.Text = "&Cancel";
+			this.m_btnCancel.UseVisualStyleBackColor = true;
+			// 
+			// m_lvItems
+			// 
+			this.m_lvItems.Activation = System.Windows.Forms.ItemActivation.OneClick;
+			this.m_lvItems.Dock = System.Windows.Forms.DockStyle.Fill;
+			this.m_lvItems.FullRowSelect = true;
+			this.m_lvItems.HeaderStyle = System.Windows.Forms.ColumnHeaderStyle.Nonclickable;
+			this.m_lvItems.HideSelection = false;
+			this.m_lvItems.HotTracking = true;
+			this.m_lvItems.HoverSelection = true;
+			this.m_lvItems.Location = new System.Drawing.Point(12, 0);
+			this.m_lvItems.MultiSelect = false;
+			this.m_lvItems.Name = "m_lvItems";
+			this.m_lvItems.ShowItemToolTips = true;
+			this.m_lvItems.Size = new System.Drawing.Size(555, 219);
+			this.m_lvItems.TabIndex = 0;
+			this.m_lvItems.UseCompatibleStateImageBehavior = false;
+			this.m_lvItems.View = System.Windows.Forms.View.Details;
+			this.m_lvItems.ItemActivate += new System.EventHandler(this.OnListItemActivate);
+			this.m_lvItems.Click += new System.EventHandler(this.OnListClick);
+			// 
+			// m_pnlTop
+			// 
+			this.m_pnlTop.Controls.Add(this.m_lblText);
+			this.m_pnlTop.Dock = System.Windows.Forms.DockStyle.Top;
+			this.m_pnlTop.Location = new System.Drawing.Point(0, 60);
+			this.m_pnlTop.Name = "m_pnlTop";
+			this.m_pnlTop.Padding = new System.Windows.Forms.Padding(9, 11, 9, 3);
+			this.m_pnlTop.Size = new System.Drawing.Size(579, 44);
+			this.m_pnlTop.TabIndex = 3;
+			// 
+			// m_pnlBottom
+			// 
+			this.m_pnlBottom.Controls.Add(this.m_btnCancel);
+			this.m_pnlBottom.Dock = System.Windows.Forms.DockStyle.Bottom;
+			this.m_pnlBottom.Location = new System.Drawing.Point(0, 323);
+			this.m_pnlBottom.Name = "m_pnlBottom";
+			this.m_pnlBottom.Padding = new System.Windows.Forms.Padding(12, 6, 12, 12);
+			this.m_pnlBottom.Size = new System.Drawing.Size(579, 41);
+			this.m_pnlBottom.TabIndex = 4;
+			// 
+			// m_pnlMiddle
+			// 
+			this.m_pnlMiddle.Controls.Add(this.m_lvItems);
+			this.m_pnlMiddle.Dock = System.Windows.Forms.DockStyle.Fill;
+			this.m_pnlMiddle.Location = new System.Drawing.Point(0, 104);
+			this.m_pnlMiddle.Name = "m_pnlMiddle";
+			this.m_pnlMiddle.Padding = new System.Windows.Forms.Padding(12, 0, 12, 0);
+			this.m_pnlMiddle.Size = new System.Drawing.Size(579, 219);
+			this.m_pnlMiddle.TabIndex = 5;
+			// 
+			// AutoTypeCtxForm
+			// 
+			this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+			this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+			this.CancelButton = this.m_btnCancel;
+			this.ClientSize = new System.Drawing.Size(579, 364);
+			this.Controls.Add(this.m_pnlMiddle);
+			this.Controls.Add(this.m_pnlBottom);
+			this.Controls.Add(this.m_pnlTop);
+			this.Controls.Add(this.m_bannerImage);
+			this.MaximizeBox = false;
+			this.MinimizeBox = false;
+			this.Name = "AutoTypeCtxForm";
+			this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;
+			this.Text = "<>";
+			this.Load += new System.EventHandler(this.OnFormLoad);
+			this.FormClosed += new System.Windows.Forms.FormClosedEventHandler(this.OnFormClosed);
+			this.Resize += new System.EventHandler(this.OnFormResize);
+			((System.ComponentModel.ISupportInitialize)(this.m_bannerImage)).EndInit();
+			this.m_pnlTop.ResumeLayout(false);
+			this.m_pnlBottom.ResumeLayout(false);
+			this.m_pnlMiddle.ResumeLayout(false);
+			this.ResumeLayout(false);
+
+		}
+
+		#endregion
+
+		private System.Windows.Forms.PictureBox m_bannerImage;
+		private System.Windows.Forms.Label m_lblText;
+		private KeePass.UI.CustomListViewEx m_lvItems;
+		private System.Windows.Forms.Button m_btnCancel;
+		private System.Windows.Forms.Panel m_pnlTop;
+		private System.Windows.Forms.Panel m_pnlBottom;
+		private System.Windows.Forms.Panel m_pnlMiddle;
+	}
+}
\ No newline at end of file
diff --git a/KeePass/Forms/AutoTypeCtxForm.cs b/KeePass/Forms/AutoTypeCtxForm.cs
new file mode 100644
index 0000000..02030de
--- /dev/null
+++ b/KeePass/Forms/AutoTypeCtxForm.cs
@@ -0,0 +1,166 @@
+/*
+  KeePass Password Safe - The Open-Source Password Manager
+  Copyright (C) 2003-2011 Dominik Reichl <dominik.reichl at t-online.de>
+
+  This program is free software; you can redistribute it and/or modify
+  it under the terms of the GNU General Public License as published by
+  the Free Software Foundation; either version 2 of the License, or
+  (at your option) any later version.
+
+  This program is distributed in the hope that it will be useful,
+  but WITHOUT ANY WARRANTY; without even the implied warranty of
+  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+  GNU General Public License for more details.
+
+  You should have received a copy of the GNU General Public License
+  along with this program; if not, write to the Free Software
+  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+*/
+
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Drawing;
+using System.Text;
+using System.Windows.Forms;
+using System.Diagnostics;
+
+using KeePass.Resources;
+using KeePass.UI;
+using KeePass.Util;
+
+using KeePassLib;
+
+namespace KeePass.Forms
+{
+	public partial class AutoTypeCtxForm : Form
+	{
+		private List<AutoTypeCtx> m_lCtxs = null;
+		private ImageList m_ilIcons = null;
+
+		private string m_strInitialFormRect = string.Empty;
+		private string m_strInitialColWidths = string.Empty;
+
+		private int m_nBannerWidth = -1;
+
+		private AutoTypeCtx m_atcSel = null;
+		public AutoTypeCtx SelectedCtx
+		{
+			get { return m_atcSel; }
+		}
+
+		public void InitEx(List<AutoTypeCtx> lCtxs, ImageList ilIcons)
+		{
+			m_lCtxs = lCtxs;
+			m_ilIcons = UIUtil.CloneImageList(ilIcons, true);
+		}
+
+		public AutoTypeCtxForm()
+		{
+			InitializeComponent();
+			Program.Translation.ApplyTo(this);
+		}
+
+		private void OnFormLoad(object sender, EventArgs e)
+		{
+			GlobalWindowManager.AddWindow(this);
+
+			m_lblText.Text = KPRes.AutoTypeEntrySelectionDescLong;
+			this.Text = KPRes.AutoTypeEntrySelection;
+			this.Icon = Properties.Resources.KeePass;
+
+			string strRect = Program.Config.UI.AutoTypeCtxRect;
+			if(strRect.Length > 0) UIUtil.SetWindowScreenRect(this, strRect);
+			m_strInitialFormRect = UIUtil.GetWindowScreenRect(this);
+
+			this.MinimumSize = new Size(550, 300);
+
+			UIUtil.SetExplorerTheme(m_lvItems.Handle);
+
+			if(UISystemFonts.ListFont != null)
+				m_lvItems.Font = UISystemFonts.ListFont;
+
+			if(m_ilIcons != null) m_lvItems.SmallImageList = m_ilIcons;
+			else { Debug.Assert(false); m_ilIcons = new ImageList(); }
+
+			UIUtil.CreateEntryList(m_lvItems, m_lCtxs, m_ilIcons);
+
+			int nWidth = m_lvItems.ClientRectangle.Width / m_lvItems.Columns.Count;
+			for(int i = 0; i < m_lvItems.Columns.Count; ++i)
+				m_lvItems.Columns[i].Width = nWidth;
+
+			string strColWidths = Program.Config.UI.AutoTypeCtxColumnWidths;
+			if(strColWidths.Length > 0) UIUtil.SetColumnWidths(m_lvItems, strColWidths);
+			m_strInitialColWidths = UIUtil.GetColumnWidths(m_lvItems);
+
+			ProcessResize();
+			this.BringToFront();
+			this.Activate();
+			UIUtil.SetFocus(m_lvItems, this);
+		}
+
+		private void OnFormClosed(object sender, FormClosedEventArgs e)
+		{
+			CleanUpEx();
+			GlobalWindowManager.RemoveWindow(this);
+		}
+
+		private void CleanUpEx()
+		{
+			string strColWidths = UIUtil.GetColumnWidths(m_lvItems);
+			if(strColWidths != m_strInitialColWidths)
+				Program.Config.UI.AutoTypeCtxColumnWidths = strColWidths;
+
+			string strRect = UIUtil.GetWindowScreenRect(this);
+			if(strRect != m_strInitialFormRect)
+				Program.Config.UI.AutoTypeCtxRect = strRect;
+
+			if(m_ilIcons != null)
+			{
+				m_ilIcons.Dispose();
+				m_ilIcons = null;
+			}
+		}
+
+		private void ProcessResize()
+		{
+			BannerFactory.UpdateBanner(this, m_bannerImage,
+				Properties.Resources.B48x48_KGPG_Key2, KPRes.AutoTypeEntrySelection,
+				KPRes.AutoTypeEntrySelectionDescShort, ref m_nBannerWidth);
+		}
+
+		private bool GetSelectedEntry()
+		{
+			ListView.SelectedListViewItemCollection slvic = m_lvItems.SelectedItems;
+			if(slvic.Count == 1)
+			{
+				m_atcSel = (slvic[0].Tag as AutoTypeCtx);
+				return (m_atcSel != null);
+			}
+
+			return false;
+		}
+
+		private void ProcessItemSelection()
+		{
+			if(this.DialogResult == DialogResult.OK) return; // Already closing
+
+			if(GetSelectedEntry()) this.DialogResult = DialogResult.OK;
+		}
+
+		private void OnListItemActivate(object sender, EventArgs e)
+		{
+			ProcessItemSelection();
+		}
+
+		private void OnListClick(object sender, EventArgs e)
+		{
+			ProcessItemSelection();
+		}
+
+		private void OnFormResize(object sender, EventArgs e)
+		{
+			ProcessResize();
+		}
+	}
+}
diff --git a/KeePass/Forms/AboutForm.resx b/KeePass/Forms/AutoTypeCtxForm.resx
similarity index 100%
copy from KeePass/Forms/AboutForm.resx
copy to KeePass/Forms/AutoTypeCtxForm.resx
diff --git a/KeePass/Forms/CharPickerForm.cs b/KeePass/Forms/CharPickerForm.cs
index 02386c1..fecd0df 100644
--- a/KeePass/Forms/CharPickerForm.cs
+++ b/KeePass/Forms/CharPickerForm.cs
@@ -50,6 +50,7 @@ namespace KeePass.Forms
 		private bool m_bSetForeground = false;
 		private uint m_uCharCount = 0;
 		private bool? m_bInitHide = null;
+		private int m_nBannerWidth = -1;
 
 		private Font m_fontChars = null;
 		private char m_chMaskChar = ((NativeLib.GetPlatformID() ==
@@ -192,8 +193,10 @@ namespace KeePass.Forms
 		{
 			string strTitle = KPRes.PickCharacters;
 			if(m_uCharCount > 0) strTitle += " (" + m_uCharCount.ToString() + ")";
-			BannerFactory.CreateBannerEx(this, m_bannerImage,
-				Properties.Resources.B48x48_KGPG_Key2, strTitle, KPRes.PickCharactersDesc);
+
+			BannerFactory.UpdateBanner(this, m_bannerImage,
+				Properties.Resources.B48x48_KGPG_Key2, strTitle,
+				KPRes.PickCharactersDesc, ref m_nBannerWidth);
 
 			RemoveAllCharButtons();
 
diff --git a/KeePass/Forms/DataEditorForm.cs b/KeePass/Forms/DataEditorForm.cs
index 7a4656c..9a43427 100644
--- a/KeePass/Forms/DataEditorForm.cs
+++ b/KeePass/Forms/DataEditorForm.cs
@@ -128,7 +128,7 @@ namespace KeePass.Forms
 			UIUtil.EnableAutoCompletion(m_tbFontSizeCombo, true);
 
 			m_rtbText.Dock = DockStyle.Fill;
-			m_ctxText.Attach(m_rtbText);
+			m_ctxText.Attach(m_rtbText, this);
 			m_tssStatusMain.Text = KPRes.Ready;
 			m_rtbText.WordWrap = Program.Config.UI.DataEditorWordWrap;
 
diff --git a/KeePass/Forms/DataViewerForm.cs b/KeePass/Forms/DataViewerForm.cs
index 35995c6..782a381 100644
--- a/KeePass/Forms/DataViewerForm.cs
+++ b/KeePass/Forms/DataViewerForm.cs
@@ -83,7 +83,7 @@ namespace KeePass.Forms
 
 			m_tssStatusMain.Text = KPRes.Ready;
 
-			m_ctxText.Attach(m_rtbText);
+			m_ctxText.Attach(m_rtbText, this);
 
 			m_bInitializing = true;
 
diff --git a/KeePass/Forms/DuplicationForm.Designer.cs b/KeePass/Forms/DuplicationForm.Designer.cs
new file mode 100644
index 0000000..02a1d8d
--- /dev/null
+++ b/KeePass/Forms/DuplicationForm.Designer.cs
@@ -0,0 +1,147 @@
+namespace KeePass.Forms
+{
+	partial class DuplicationForm
+	{
+		/// <summary>
+		/// Required designer variable.
+		/// </summary>
+		private System.ComponentModel.IContainer components = null;
+
+		/// <summary>
+		/// Clean up any resources being used.
+		/// </summary>
+		/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+		protected override void Dispose(bool disposing)
+		{
+			if(disposing && (components != null))
+			{
+				components.Dispose();
+			}
+			base.Dispose(disposing);
+		}
+
+		#region Windows Form Designer generated code
+
+		/// <summary>
+		/// Required method for Designer support - do not modify
+		/// the contents of this method with the code editor.
+		/// </summary>
+		private void InitializeComponent()
+		{
+			System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(DuplicationForm));
+			this.m_btnOK = new System.Windows.Forms.Button();
+			this.m_btnCancel = new System.Windows.Forms.Button();
+			this.m_cbAppendCopy = new System.Windows.Forms.CheckBox();
+			this.m_cbFieldRefs = new System.Windows.Forms.CheckBox();
+			this.m_lblFieldRefs = new System.Windows.Forms.Label();
+			this.m_lblSep = new System.Windows.Forms.Label();
+			this.m_lnkFieldRefs = new System.Windows.Forms.LinkLabel();
+			this.SuspendLayout();
+			// 
+			// m_btnOK
+			// 
+			this.m_btnOK.DialogResult = System.Windows.Forms.DialogResult.OK;
+			this.m_btnOK.Location = new System.Drawing.Point(205, 151);
+			this.m_btnOK.Name = "m_btnOK";
+			this.m_btnOK.Size = new System.Drawing.Size(75, 23);
+			this.m_btnOK.TabIndex = 0;
+			this.m_btnOK.Text = "&OK";
+			this.m_btnOK.UseVisualStyleBackColor = true;
+			this.m_btnOK.Click += new System.EventHandler(this.OnBtnOK);
+			// 
+			// m_btnCancel
+			// 
+			this.m_btnCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel;
+			this.m_btnCancel.Location = new System.Drawing.Point(286, 151);
+			this.m_btnCancel.Name = "m_btnCancel";
+			this.m_btnCancel.Size = new System.Drawing.Size(75, 23);
+			this.m_btnCancel.TabIndex = 1;
+			this.m_btnCancel.Text = "&Cancel";
+			this.m_btnCancel.UseVisualStyleBackColor = true;
+			// 
+			// m_cbAppendCopy
+			// 
+			this.m_cbAppendCopy.AutoSize = true;
+			this.m_cbAppendCopy.Location = new System.Drawing.Point(12, 12);
+			this.m_cbAppendCopy.Name = "m_cbAppendCopy";
+			this.m_cbAppendCopy.Size = new System.Drawing.Size(168, 17);
+			this.m_cbAppendCopy.TabIndex = 2;
+			this.m_cbAppendCopy.Text = "&Append \"- Copy\" to entry titles";
+			this.m_cbAppendCopy.UseVisualStyleBackColor = true;
+			// 
+			// m_cbFieldRefs
+			// 
+			this.m_cbFieldRefs.AutoSize = true;
+			this.m_cbFieldRefs.Location = new System.Drawing.Point(12, 35);
+			this.m_cbFieldRefs.Name = "m_cbFieldRefs";
+			this.m_cbFieldRefs.Size = new System.Drawing.Size(264, 17);
+			this.m_cbFieldRefs.TabIndex = 3;
+			this.m_cbFieldRefs.Text = "&Replace user names and passwords by references";
+			this.m_cbFieldRefs.UseVisualStyleBackColor = true;
+			// 
+			// m_lblFieldRefs
+			// 
+			this.m_lblFieldRefs.Location = new System.Drawing.Point(28, 55);
+			this.m_lblFieldRefs.Name = "m_lblFieldRefs";
+			this.m_lblFieldRefs.Size = new System.Drawing.Size(333, 57);
+			this.m_lblFieldRefs.TabIndex = 4;
+			this.m_lblFieldRefs.Text = resources.GetString("m_lblFieldRefs.Text");
+			// 
+			// m_lblSep
+			// 
+			this.m_lblSep.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D;
+			this.m_lblSep.Location = new System.Drawing.Point(1, 141);
+			this.m_lblSep.Name = "m_lblSep";
+			this.m_lblSep.Size = new System.Drawing.Size(372, 2);
+			this.m_lblSep.TabIndex = 6;
+			// 
+			// m_lnkFieldRefs
+			// 
+			this.m_lnkFieldRefs.AutoSize = true;
+			this.m_lnkFieldRefs.Location = new System.Drawing.Point(28, 112);
+			this.m_lnkFieldRefs.Name = "m_lnkFieldRefs";
+			this.m_lnkFieldRefs.Size = new System.Drawing.Size(115, 13);
+			this.m_lnkFieldRefs.TabIndex = 5;
+			this.m_lnkFieldRefs.TabStop = true;
+			this.m_lnkFieldRefs.Text = "Help: Field References";
+			this.m_lnkFieldRefs.LinkClicked += new System.Windows.Forms.LinkLabelLinkClickedEventHandler(this.OnFieldRefsLinkClicked);
+			// 
+			// DuplicationForm
+			// 
+			this.AcceptButton = this.m_btnOK;
+			this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+			this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+			this.CancelButton = this.m_btnCancel;
+			this.ClientSize = new System.Drawing.Size(373, 186);
+			this.Controls.Add(this.m_lnkFieldRefs);
+			this.Controls.Add(this.m_lblSep);
+			this.Controls.Add(this.m_lblFieldRefs);
+			this.Controls.Add(this.m_cbFieldRefs);
+			this.Controls.Add(this.m_cbAppendCopy);
+			this.Controls.Add(this.m_btnCancel);
+			this.Controls.Add(this.m_btnOK);
+			this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog;
+			this.MaximizeBox = false;
+			this.MinimizeBox = false;
+			this.Name = "DuplicationForm";
+			this.ShowInTaskbar = false;
+			this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent;
+			this.Text = "Duplication Options";
+			this.Load += new System.EventHandler(this.OnFormLoad);
+			this.FormClosed += new System.Windows.Forms.FormClosedEventHandler(this.OnFormClosed);
+			this.ResumeLayout(false);
+			this.PerformLayout();
+
+		}
+
+		#endregion
+
+		private System.Windows.Forms.Button m_btnOK;
+		private System.Windows.Forms.Button m_btnCancel;
+		private System.Windows.Forms.CheckBox m_cbAppendCopy;
+		private System.Windows.Forms.CheckBox m_cbFieldRefs;
+		private System.Windows.Forms.Label m_lblFieldRefs;
+		private System.Windows.Forms.Label m_lblSep;
+		private System.Windows.Forms.LinkLabel m_lnkFieldRefs;
+	}
+}
\ No newline at end of file
diff --git a/KeePass/Forms/UrlSchemeForm.cs b/KeePass/Forms/DuplicationForm.cs
similarity index 63%
copy from KeePass/Forms/UrlSchemeForm.cs
copy to KeePass/Forms/DuplicationForm.cs
index 4ff62a8..62f1f7f 100644
--- a/KeePass/Forms/UrlSchemeForm.cs
+++ b/KeePass/Forms/DuplicationForm.cs
@@ -23,23 +23,28 @@ using System.ComponentModel;
 using System.Drawing;
 using System.Text;
 using System.Windows.Forms;
+using System.Diagnostics;
 
-using KeePass.App.Configuration;
-using KeePass.Resources;
+using KeePass.App;
 using KeePass.UI;
 
 namespace KeePass.Forms
 {
-	public partial class UrlSchemeForm : Form
+	public partial class DuplicationForm : Form
 	{
-		private AceUrlSchemeOverride m_ovr = null;
+		private bool m_bAppendCopy = true;
+		public bool AppendCopyToTitles
+		{
+			get { return m_bAppendCopy; }
+		}
 
-		public void InitEx(AceUrlSchemeOverride ovr)
+		private bool m_bFieldRefs = false;
+		public bool ReplaceDataByFieldRefs
 		{
-			m_ovr = ovr;
+			get { return m_bFieldRefs; }
 		}
 
-		public UrlSchemeForm()
+		public DuplicationForm()
 		{
 			InitializeComponent();
 			Program.Translation.ApplyTo(this);
@@ -47,15 +52,15 @@ namespace KeePass.Forms
 
 		private void OnFormLoad(object sender, EventArgs e)
 		{
-			if(m_ovr == null) throw new InvalidOperationException();
-
 			GlobalWindowManager.AddWindow(this);
 
 			this.Icon = Properties.Resources.KeePass;
-			this.Text = KPRes.UrlSchemeOverride;
 
-			m_tbScheme.Text = m_ovr.Scheme;
-			m_tbOverride.Text = m_ovr.UrlOverride;
+			FontUtil.AssignDefaultBold(m_cbAppendCopy);
+			FontUtil.AssignDefaultBold(m_cbFieldRefs);
+
+			m_cbAppendCopy.Checked = m_bAppendCopy;
+			m_cbFieldRefs.Checked = m_bFieldRefs;
 		}
 
 		private void OnFormClosed(object sender, FormClosedEventArgs e)
@@ -63,10 +68,15 @@ namespace KeePass.Forms
 			GlobalWindowManager.RemoveWindow(this);
 		}
 
+		private void OnFieldRefsLinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
+		{
+			AppHelp.ShowHelp(AppDefs.HelpTopics.FieldRefs, null);
+		}
+
 		private void OnBtnOK(object sender, EventArgs e)
 		{
-			m_ovr.Scheme = m_tbScheme.Text;
-			m_ovr.UrlOverride = m_tbOverride.Text;
+			m_bAppendCopy = m_cbAppendCopy.Checked;
+			m_bFieldRefs = m_cbFieldRefs.Checked;
 		}
 	}
 }
diff --git a/KeePass/Forms/TanWizardForm.resx b/KeePass/Forms/DuplicationForm.resx
similarity index 93%
copy from KeePass/Forms/TanWizardForm.resx
copy to KeePass/Forms/DuplicationForm.resx
index cc19990..8e37fc8 100644
--- a/KeePass/Forms/TanWizardForm.resx
+++ b/KeePass/Forms/DuplicationForm.resx
@@ -117,7 +117,7 @@
   <resheader name="writer">
     <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
   </resheader>
-  <data name="m_lblIntro.Text" xml:space="preserve">
-    <value>Paste your TANs into the edit box below. All characters that are not explicitly specified as TAN characters are treated as separators, and only substrings consisting of TAN characters are added as TAN entries.</value>
+  <data name="m_lblFieldRefs.Text" xml:space="preserve">
+    <value>If this option is enabled, the copies will reference the user names and passwords of the original entries. When a user name or password is changed in an original entry, the copy will automatically use the new data, too.</value>
   </data>
 </root>
\ No newline at end of file
diff --git a/KeePass/Forms/EditAutoTypeItemForm.cs b/KeePass/Forms/EditAutoTypeItemForm.cs
index f6f65b0..4be77cb 100644
--- a/KeePass/Forms/EditAutoTypeItemForm.cs
+++ b/KeePass/Forms/EditAutoTypeItemForm.cs
@@ -36,17 +36,19 @@ using KeePassLib.Security;
 using KeePassLib.Collections;
 using KeePassLib.Utility;
 
+using NativeLib = KeePassLib.Native.NativeLib;
+
 namespace KeePass.Forms
 {
 	public partial class EditAutoTypeItemForm : Form
 	{
 		private AutoTypeConfig m_atConfig = null;
 		private ProtectedStringDictionary m_vStringDict = null;
-		private string m_strOriginalName = null;
+		private int m_iOrgIndex = -1;
 		private bool m_bEditSequenceOnly = false;
 
 		// private Color m_clrOriginalForeground = Color.Black;
-		private Color m_clrOriginalBackground = Color.White;
+		// private Color m_clrOriginalBackground = Color.White;
 		private List<Image> m_vWndImages = new List<Image>();
 
 		private RichTextBoxContextMenu m_ctxKeySeq = new RichTextBoxContextMenu();
@@ -84,14 +86,15 @@ namespace KeePass.Forms
 			Program.Translation.ApplyTo(this);
 		}
 
-		public void InitEx(AutoTypeConfig atConfig, ProtectedStringDictionary vStringDict, string strOriginalName, bool bEditSequenceOnly)
+		public void InitEx(AutoTypeConfig atConfig, ProtectedStringDictionary vStringDict,
+			int iOrgIndex, bool bEditSequenceOnly)
 		{
 			Debug.Assert(vStringDict != null); if(vStringDict == null) throw new ArgumentNullException("vStringDict");
 			Debug.Assert(atConfig != null); if(atConfig == null) throw new ArgumentNullException("atConfig");
 
 			m_atConfig = atConfig;
 			m_vStringDict = vStringDict;
-			m_strOriginalName = strOriginalName;
+			m_iOrgIndex = iOrgIndex;
 			m_bEditSequenceOnly = bEditSequenceOnly;
 		}
 
@@ -102,8 +105,8 @@ namespace KeePass.Forms
 
 			GlobalWindowManager.AddWindow(this);
 
-			m_ctxKeySeq.Attach(m_rbKeySeq);
-			m_ctxKeyCodes.Attach(m_rtbPlaceholders);
+			m_ctxKeySeq.Attach(m_rbKeySeq, this);
+			m_ctxKeyCodes.Attach(m_rtbPlaceholders, this);
 
 			if(!m_bEditSequenceOnly)
 			{
@@ -123,7 +126,7 @@ namespace KeePass.Forms
 			UIUtil.EnableAutoCompletion(m_cmbWindow, false);
 
 			// m_clrOriginalForeground = m_lblOpenHint.ForeColor;
-			m_clrOriginalBackground = m_cmbWindow.BackColor;
+			// m_clrOriginalBackground = m_cmbWindow.BackColor;
 			// m_strOriginalWindowHint = m_lblTargetWindowInfo.Text;
 
 			RichTextBuilder rb = new RichTextBuilder();
@@ -195,15 +198,18 @@ namespace KeePass.Forms
 
 			LinkifyRtf(m_rtbPlaceholders);
 
-			if(m_strOriginalName != null)
+			if(m_iOrgIndex >= 0)
 			{
-				m_cmbWindow.Text = m_strOriginalName;
+				AutoTypeAssociation asInit = m_atConfig.GetAt(m_iOrgIndex);
+				m_cmbWindow.Text = asInit.WindowName;
 
 				if(!m_bEditSequenceOnly)
-					m_rbKeySeq.Text = m_atConfig.GetSafe(m_strOriginalName);
+					m_rbKeySeq.Text = asInit.Sequence;
 				else
 					m_rbKeySeq.Text = m_atConfig.DefaultSequence;
 			}
+			else if(m_bEditSequenceOnly)
+				m_cmbWindow.Text = "(" + KPRes.Default + ")";
 
 			m_bBlockUpdates = true;
 			if(m_rbKeySeq.Text.Length > 0) m_rbSeqCustom.Checked = true;
@@ -212,27 +218,8 @@ namespace KeePass.Forms
 
 			try
 			{
-				NativeMethods.EnumWindowsProc procEnum = delegate(IntPtr hWnd,
-					IntPtr lParam)
-				{
-					string strName = NativeMethods.GetWindowText(hWnd, true);
-					if(!string.IsNullOrEmpty(strName))
-					{
-						if(((NativeMethods.GetWindowStyle(hWnd) &
-							NativeMethods.WS_VISIBLE) != 0) &&
-							AutoType.IsValidAutoTypeWindow(hWnd, false) &&
-							!NativeMethods.IsTaskBar(hWnd))
-						{
-							m_cmbWindow.Items.Add(strName);
-							m_vWndImages.Add(UIUtil.GetWindowImage(hWnd, true));
-						}
-					}
-
-					return true;
-				};
-
-				NativeMethods.EnumWindows(procEnum, IntPtr.Zero);
-				m_cmbWindow.OrderedImageList = m_vWndImages;
+				if(NativeLib.IsUnix()) PopulateWindowsListUnix();
+				else PopulateWindowsListWin();
 			}
 			catch(Exception) { Debug.Assert(false); }
 
@@ -266,10 +253,16 @@ namespace KeePass.Forms
 
 			if(!m_bEditSequenceOnly)
 			{
-				if(m_strOriginalName != null)
-					m_atConfig.Remove(m_strOriginalName);
+				AutoTypeAssociation atAssoc;
+				if(m_iOrgIndex >= 0) atAssoc = m_atConfig.GetAt(m_iOrgIndex);
+				else
+				{
+					atAssoc = new AutoTypeAssociation();
+					m_atConfig.Add(atAssoc);
+				}
 
-				m_atConfig.Set(m_cmbWindow.Text, strNewSeq);
+				atAssoc.WindowName = m_cmbWindow.Text;
+				atAssoc.Sequence = strNewSeq;
 			}
 			else m_atConfig.DefaultSequence = strNewSeq;
 		}
@@ -288,40 +281,40 @@ namespace KeePass.Forms
 			if(m_bBlockUpdates) return;
 			m_bBlockUpdates = true;
 
-			string strItemName = m_cmbWindow.Text;
+			// string strItemName = m_cmbWindow.Text;
 
-			bool bEnableOK = true;
-			// string strError = string.Empty;
+			// bool bEnableOK = true;
+			// // string strError = string.Empty;
 
-			if((m_atConfig.Get(strItemName) != null) && !m_bEditSequenceOnly)
-			{
-				if((m_strOriginalName == null) || !strItemName.Equals(m_strOriginalName))
-				{
-					bEnableOK = false;
-					// strError = KPRes.FieldNameExistsAlready;
-				}
-			}
-
-			// if((strItemName.IndexOf('{') >= 0) || (strItemName.IndexOf('}') >= 0))
+			// if((m_atConfig.Get(strItemName) != null) && !m_bEditSequenceOnly)
 			// {
-			//	bEnableOK = false;
-			//	// strError = KPRes.FieldNameInvalid;
+			//	if((m_strOriginalName == null) || !strItemName.Equals(m_strOriginalName))
+			//	{
+			//		bEnableOK = false;
+			//		// strError = KPRes.FieldNameExistsAlready;
+			//	}
 			// }
 
-			if(bEnableOK)
-			{
-				// m_lblTargetWindowInfo.Text = m_strOriginalWindowHint;
-				// m_lblTargetWindowInfo.ForeColor = m_clrOriginalForeground;
-				m_cmbWindow.BackColor = m_clrOriginalBackground;
-				m_btnOK.Enabled = true;
-			}
-			else
-			{
-				// m_lblTargetWindowInfo.Text = strError;
-				// m_lblTargetWindowInfo.ForeColor = Color.Red;
-				m_cmbWindow.BackColor = AppDefs.ColorEditError;
-				m_btnOK.Enabled = false;
-			}
+			// // if((strItemName.IndexOf('{') >= 0) || (strItemName.IndexOf('}') >= 0))
+			// // {
+			// //	bEnableOK = false;
+			// //	// strError = KPRes.FieldNameInvalid;
+			// // }
+
+			// if(bEnableOK)
+			// {
+			//	// m_lblTargetWindowInfo.Text = m_strOriginalWindowHint;
+			//	// m_lblTargetWindowInfo.ForeColor = m_clrOriginalForeground;
+			//	m_cmbWindow.BackColor = m_clrOriginalBackground;
+			//	m_btnOK.Enabled = true;
+			// }
+			// else
+			// {
+			//	// m_lblTargetWindowInfo.Text = strError;
+			//	// m_lblTargetWindowInfo.ForeColor = Color.Red;
+			//	m_cmbWindow.BackColor = AppDefs.ColorEditError;
+			//	m_btnOK.Enabled = false;
+			// }
 
 			if(m_bEditSequenceOnly)
 			{
@@ -439,5 +432,79 @@ namespace KeePass.Forms
 		{
 			CleanUpEx();
 		}
+
+		private void PopulateWindowsListWin()
+		{
+			NativeMethods.EnumWindowsProc procEnum = delegate(IntPtr hWnd,
+				IntPtr lParam)
+			{
+				// Wrapped in try-catch, because it's passed to native code
+				try
+				{
+					string strName = NativeMethods.GetWindowText(hWnd, true);
+					if(!string.IsNullOrEmpty(strName))
+					{
+						if(((NativeMethods.GetWindowStyle(hWnd) &
+							NativeMethods.WS_VISIBLE) != 0) &&
+							AutoType.IsValidAutoTypeWindow(hWnd, false) &&
+							!NativeMethods.IsTaskBar(hWnd))
+						{
+							m_cmbWindow.Items.Add(strName);
+							m_vWndImages.Add(UIUtil.GetWindowImage(hWnd, true));
+						}
+					}
+				}
+				catch(Exception) { Debug.Assert(false); }
+
+				return true;
+			};
+
+			NativeMethods.EnumWindows(procEnum, IntPtr.Zero);
+			m_cmbWindow.OrderedImageList = m_vWndImages;
+		}
+
+		private void PopulateWindowsListUnix()
+		{
+			string strWindows = NativeMethods.RunXDoTool(
+				@"search --onlyvisible --name '.+' getwindowname %@");
+			if(string.IsNullOrEmpty(strWindows)) return;
+
+			strWindows = strWindows.Replace("\r\n", "\n");
+			strWindows = strWindows.Replace("\r", string.Empty);
+			string[] vWindows = strWindows.Split(new char[]{ '\n' });
+
+			List<string> vListed = new List<string>();
+			for(int i = 0; i < vWindows.Length; ++i)
+			{
+				string str = vWindows[i].Trim();
+
+				bool bValid = true;
+				foreach(Form f in Application.OpenForms)
+				{
+					if(IsOwnWindow(f, str)) { bValid = false; break; }
+				}
+				if(!bValid) continue;
+
+				if((str.Length > 0) && (vListed.IndexOf(str) < 0))
+				{
+					m_cmbWindow.Items.Add(str);
+					vListed.Add(str);
+				}
+			}
+		}
+
+		private static bool IsOwnWindow(Control cRoot, string strText)
+		{
+			if(cRoot == null) { Debug.Assert(false); return false; }
+			if(cRoot.Text.Trim() == strText) return true;
+
+			foreach(Control cSub in cRoot.Controls)
+			{
+				if(cSub == cRoot) { Debug.Assert(false); continue; }
+				if(IsOwnWindow(cSub, strText)) return true;
+			}
+
+			return false;
+		}
 	}
 }
diff --git a/KeePass/Forms/EditStringForm.cs b/KeePass/Forms/EditStringForm.cs
index e8acc06..8d15620 100644
--- a/KeePass/Forms/EditStringForm.cs
+++ b/KeePass/Forms/EditStringForm.cs
@@ -78,7 +78,7 @@ namespace KeePass.Forms
 
 			GlobalWindowManager.AddWindow(this);
 
-			m_ctxValue.Attach(m_richStringValue);
+			m_ctxValue.Attach(m_richStringValue, this);
 
 			string strTitle, strDesc;
 			if(m_strStringName == null)
diff --git a/KeePass/Forms/EntryListForm.cs b/KeePass/Forms/EntryListForm.cs
index c260656..c9ae55c 100644
--- a/KeePass/Forms/EntryListForm.cs
+++ b/KeePass/Forms/EntryListForm.cs
@@ -130,7 +130,7 @@ namespace KeePass.Forms
 			ListView.SelectedListViewItemCollection slvic = m_lvEntries.SelectedItems;
 			if(slvic.Count == 1)
 			{
-				m_peSelected = slvic[0].Tag as PwEntry;
+				m_peSelected = (slvic[0].Tag as PwEntry);
 
 				if(bSetDialogResult) this.DialogResult = DialogResult.OK;
 				return true;
diff --git a/KeePass/Forms/FieldRefForm.cs b/KeePass/Forms/FieldRefForm.cs
index 2ce5e06..2bbbe2c 100644
--- a/KeePass/Forms/FieldRefForm.cs
+++ b/KeePass/Forms/FieldRefForm.cs
@@ -157,6 +157,7 @@ namespace KeePass.Forms
 
 			SearchParameters sp = SearchParameters.None;
 			sp.SearchString = strSearch;
+			sp.RespectEntrySearchingDisabled = false;
 
 			if(tchField == 'T') sp.SearchInTitles = true;
 			else if(tchField == 'U') sp.SearchInUserNames = true;
@@ -167,7 +168,7 @@ namespace KeePass.Forms
 			else { Debug.Assert(false); return true; }
 
 			PwObjectList<PwEntry> l = new PwObjectList<PwEntry>();
-			m_pgEntrySource.SearchEntries(sp, l, false);
+			m_pgEntrySource.SearchEntries(sp, l);
 
 			if(l.UCount == 0) { Debug.Assert(false); return false; }
 			else if(l.UCount == 1) return false;
@@ -177,7 +178,7 @@ namespace KeePass.Forms
 
 		private void OnBtnOK(object sender, EventArgs e)
 		{
-			if(!this.CreateResultRef()) this.DialogResult = DialogResult.None;
+			if(!CreateResultRef()) this.DialogResult = DialogResult.None;
 		}
 
 		private void OnBtnCancel(object sender, EventArgs e)
@@ -218,7 +219,7 @@ namespace KeePass.Forms
 				sp.SearchInPasswords = true;
 
 				PwObjectList<PwEntry> lResults = new PwObjectList<PwEntry>();
-				m_pgEntrySource.SearchEntries(sp, lResults, true);
+				m_pgEntrySource.SearchEntries(sp, lResults);
 
 				UIUtil.CreateEntryList(m_lvEntries, lResults, m_vColumns, m_ilIcons);
 			}
diff --git a/KeePass/Forms/GroupForm.cs b/KeePass/Forms/GroupForm.cs
index 969c788..b3234a5 100644
--- a/KeePass/Forms/GroupForm.cs
+++ b/KeePass/Forms/GroupForm.cs
@@ -111,6 +111,7 @@ namespace KeePass.Forms
 
 			CustomizeForScreenReader();
 			EnableControlsEx();
+			UIUtil.SetFocus(m_tbName, this);
 		}
 
 		private void CustomizeForScreenReader()
@@ -187,14 +188,13 @@ namespace KeePass.Forms
 
 		private void OnBtnAutoTypeEdit(object sender, EventArgs e)
 		{
-			string strName = @"(" + KPRes.AutoType + @")";
+			// string strName = @"(" + KPRes.AutoType + @")";
 
 			AutoTypeConfig atConfig = new AutoTypeConfig();
 			atConfig.DefaultSequence = m_tbDefaultAutoTypeSeq.Text;
 
 			EditAutoTypeItemForm dlg = new EditAutoTypeItemForm();
-			dlg.InitEx(atConfig, new ProtectedStringDictionary(),
-				strName, true);
+			dlg.InitEx(atConfig, new ProtectedStringDictionary(), -1, true);
 
 			if(dlg.ShowDialog() == DialogResult.OK)
 				m_tbDefaultAutoTypeSeq.Text = atConfig.DefaultSequence;
diff --git a/KeePass/Forms/KeyCreationForm.cs b/KeePass/Forms/KeyCreationForm.cs
index d963bf1..a272c58 100644
--- a/KeePass/Forms/KeyCreationForm.cs
+++ b/KeePass/Forms/KeyCreationForm.cs
@@ -207,7 +207,8 @@ namespace KeePass.Forms
 			else if(m_cbKeyFile.Checked && (!strKeyFile.Equals(KPRes.NoKeyFileSpecifiedMeta)) &&
 				(bIsKeyProv == true))
 			{
-				KeyProviderQueryContext ctxKP = new KeyProviderQueryContext(m_ioInfo, true);
+				KeyProviderQueryContext ctxKP = new KeyProviderQueryContext(
+					m_ioInfo, true, false);
 
 				bool bPerformHash;
 				byte[] pbCustomKey = Program.KeyProviderPool.GetKey(strKeyFile, ctxKP,
diff --git a/KeePass/Forms/KeyPromptForm.cs b/KeePass/Forms/KeyPromptForm.cs
index f261e5d..ff544e9 100644
--- a/KeePass/Forms/KeyPromptForm.cs
+++ b/KeePass/Forms/KeyPromptForm.cs
@@ -253,15 +253,21 @@ namespace KeePass.Forms
 				KeyProvider kp = Program.KeyProviderPool.Get(strKeyFile);
 				if((kp != null) && m_bSecureDesktop)
 				{
-					if(kp.GetKeyMightShowGui)
+					if(kp.GetKeyMightShowGui && !kp.SecureDesktopCompatible)
 					{
 						MessageService.ShowWarning(KPRes.KeyProvWithGuiOnSD,
 							KPRes.KeyProvWithGuiOnSDHint);
 						return false;
 					}
+					else if(!kp.SecureDesktopCompatible)
+					{
+						MessageService.ShowWarning(KPRes.KeyProvWithGuiOnSDHint);
+						return false;
+					}
 				}
 
-				KeyProviderQueryContext ctxKP = new KeyProviderQueryContext(m_ioInfo, false);
+				KeyProviderQueryContext ctxKP = new KeyProviderQueryContext(
+					m_ioInfo, false, m_bSecureDesktop);
 
 				bool bPerformHash;
 				byte[] pbProvKey = Program.KeyProviderPool.GetKey(strKeyFile, ctxKP,
diff --git a/KeePass/Forms/MainForm.Designer.cs b/KeePass/Forms/MainForm.Designer.cs
index 33011d1..f8b714d 100644
--- a/KeePass/Forms/MainForm.Designer.cs
+++ b/KeePass/Forms/MainForm.Designer.cs
@@ -217,6 +217,7 @@
 			this.m_tvGroups = new KeePass.UI.CustomTreeViewEx();
 			this.m_lvEntries = new KeePass.UI.CustomListViewEx();
 			this.m_richEntryView = new KeePass.UI.CustomRichTextBoxEx();
+			this.m_ctxTrayOptions = new System.Windows.Forms.ToolStripMenuItem();
 			this.m_ctxGroupList.SuspendLayout();
 			this.m_ctxPwList.SuspendLayout();
 			this.m_menuMain.SuspendLayout();
@@ -247,27 +248,27 @@
             this.m_ctxGroupSep3,
             this.m_ctxGroupRearrange});
 			this.m_ctxGroupList.Name = "m_ctxGroupList";
-			this.m_ctxGroupList.Size = new System.Drawing.Size(166, 226);
+			this.m_ctxGroupList.Size = new System.Drawing.Size(166, 204);
 			this.m_ctxGroupList.Opening += new System.ComponentModel.CancelEventHandler(this.OnCtxGroupListOpening);
 			// 
 			// m_ctxGroupAdd
 			// 
 			this.m_ctxGroupAdd.Image = global::KeePass.Properties.Resources.B16x16_Folder_Sent_Mail;
 			this.m_ctxGroupAdd.Name = "m_ctxGroupAdd";
-			this.m_ctxGroupAdd.Size = new System.Drawing.Size(226, 22);
+			this.m_ctxGroupAdd.Size = new System.Drawing.Size(165, 22);
 			this.m_ctxGroupAdd.Text = "Add &Group";
 			this.m_ctxGroupAdd.Click += new System.EventHandler(this.OnGroupsAdd);
 			// 
 			// m_ctxGroupSep0
 			// 
 			this.m_ctxGroupSep0.Name = "m_ctxGroupSep0";
-			this.m_ctxGroupSep0.Size = new System.Drawing.Size(223, 6);
+			this.m_ctxGroupSep0.Size = new System.Drawing.Size(162, 6);
 			// 
 			// m_ctxGroupEdit
 			// 
 			this.m_ctxGroupEdit.Image = global::KeePass.Properties.Resources.B16x16_Folder_Txt;
 			this.m_ctxGroupEdit.Name = "m_ctxGroupEdit";
-			this.m_ctxGroupEdit.Size = new System.Drawing.Size(226, 22);
+			this.m_ctxGroupEdit.Size = new System.Drawing.Size(165, 22);
 			this.m_ctxGroupEdit.Text = "Ed&it Group";
 			this.m_ctxGroupEdit.Click += new System.EventHandler(this.OnGroupsEdit);
 			// 
@@ -275,7 +276,7 @@
 			// 
 			this.m_ctxGroupDelete.Image = global::KeePass.Properties.Resources.B16x16_Folder_Locked;
 			this.m_ctxGroupDelete.Name = "m_ctxGroupDelete";
-			this.m_ctxGroupDelete.Size = new System.Drawing.Size(226, 22);
+			this.m_ctxGroupDelete.Size = new System.Drawing.Size(165, 22);
 			this.m_ctxGroupDelete.Text = "Dele&te Group";
 			this.m_ctxGroupDelete.Click += new System.EventHandler(this.OnGroupsDelete);
 			// 
@@ -283,14 +284,14 @@
 			// 
 			this.m_ctxGroupEmpty.Image = global::KeePass.Properties.Resources.B16x16_Trashcan_Full;
 			this.m_ctxGroupEmpty.Name = "m_ctxGroupEmpty";
-			this.m_ctxGroupEmpty.Size = new System.Drawing.Size(226, 22);
+			this.m_ctxGroupEmpty.Size = new System.Drawing.Size(165, 22);
 			this.m_ctxGroupEmpty.Text = "&Empty Recycle Bin";
 			this.m_ctxGroupEmpty.Click += new System.EventHandler(this.OnGroupsEmpty);
 			// 
 			// m_ctxGroupSep1
 			// 
 			this.m_ctxGroupSep1.Name = "m_ctxGroupSep1";
-			this.m_ctxGroupSep1.Size = new System.Drawing.Size(223, 6);
+			this.m_ctxGroupSep1.Size = new System.Drawing.Size(162, 6);
 			// 
 			// m_ctxGroupFind
 			// 
@@ -303,13 +304,13 @@
 			// m_ctxGroupSep2
 			// 
 			this.m_ctxGroupSep2.Name = "m_ctxGroupSep2";
-			this.m_ctxGroupSep2.Size = new System.Drawing.Size(223, 6);
+			this.m_ctxGroupSep2.Size = new System.Drawing.Size(162, 6);
 			// 
 			// m_ctxGroupPrint
 			// 
 			this.m_ctxGroupPrint.Image = global::KeePass.Properties.Resources.B16x16_FilePrint;
 			this.m_ctxGroupPrint.Name = "m_ctxGroupPrint";
-			this.m_ctxGroupPrint.Size = new System.Drawing.Size(226, 22);
+			this.m_ctxGroupPrint.Size = new System.Drawing.Size(165, 22);
 			this.m_ctxGroupPrint.Text = "&Print Group...";
 			this.m_ctxGroupPrint.Click += new System.EventHandler(this.OnGroupsPrint);
 			// 
@@ -317,14 +318,14 @@
 			// 
 			this.m_ctxGroupExport.Image = global::KeePass.Properties.Resources.B16x16_Folder_Outbox;
 			this.m_ctxGroupExport.Name = "m_ctxGroupExport";
-			this.m_ctxGroupExport.Size = new System.Drawing.Size(226, 22);
+			this.m_ctxGroupExport.Size = new System.Drawing.Size(165, 22);
 			this.m_ctxGroupExport.Text = "E&xport...";
 			this.m_ctxGroupExport.Click += new System.EventHandler(this.OnGroupsExport);
 			// 
 			// m_ctxGroupSep3
 			// 
 			this.m_ctxGroupSep3.Name = "m_ctxGroupSep3";
-			this.m_ctxGroupSep3.Size = new System.Drawing.Size(223, 6);
+			this.m_ctxGroupSep3.Size = new System.Drawing.Size(162, 6);
 			// 
 			// m_ctxGroupRearrange
 			// 
@@ -337,14 +338,14 @@
             this.m_ctxGroupSort,
             this.m_ctxGroupSortRec});
 			this.m_ctxGroupRearrange.Name = "m_ctxGroupRearrange";
-			this.m_ctxGroupRearrange.Size = new System.Drawing.Size(226, 22);
+			this.m_ctxGroupRearrange.Size = new System.Drawing.Size(165, 22);
 			this.m_ctxGroupRearrange.Text = "&Rearrange";
 			// 
 			// m_ctxGroupMoveToTop
 			// 
 			this.m_ctxGroupMoveToTop.Image = global::KeePass.Properties.Resources.B16x16_2UpArrow;
 			this.m_ctxGroupMoveToTop.Name = "m_ctxGroupMoveToTop";
-			this.m_ctxGroupMoveToTop.Size = new System.Drawing.Size(240, 22);
+			this.m_ctxGroupMoveToTop.Size = new System.Drawing.Size(187, 22);
 			this.m_ctxGroupMoveToTop.Text = "Move Group to &Top";
 			this.m_ctxGroupMoveToTop.Click += new System.EventHandler(this.OnGroupsMoveToTop);
 			// 
@@ -352,7 +353,7 @@
 			// 
 			this.m_ctxGroupMoveOneUp.Image = global::KeePass.Properties.Resources.B16x16_1UpArrow;
 			this.m_ctxGroupMoveOneUp.Name = "m_ctxGroupMoveOneUp";
-			this.m_ctxGroupMoveOneUp.Size = new System.Drawing.Size(240, 22);
+			this.m_ctxGroupMoveOneUp.Size = new System.Drawing.Size(187, 22);
 			this.m_ctxGroupMoveOneUp.Text = "Move Group &One Up";
 			this.m_ctxGroupMoveOneUp.Click += new System.EventHandler(this.OnGroupsMoveOneUp);
 			// 
@@ -360,7 +361,7 @@
 			// 
 			this.m_ctxGroupMoveOneDown.Image = global::KeePass.Properties.Resources.B16x16_1DownArrow;
 			this.m_ctxGroupMoveOneDown.Name = "m_ctxGroupMoveOneDown";
-			this.m_ctxGroupMoveOneDown.Size = new System.Drawing.Size(225, 22);
+			this.m_ctxGroupMoveOneDown.Size = new System.Drawing.Size(187, 22);
 			this.m_ctxGroupMoveOneDown.Text = "Mo&ve Group One Down";
 			this.m_ctxGroupMoveOneDown.Click += new System.EventHandler(this.OnGroupsMoveOneDown);
 			// 
@@ -375,13 +376,13 @@
 			// m_ctxGroupRearrSep0
 			// 
 			this.m_ctxGroupRearrSep0.Name = "m_ctxGroupRearrSep0";
-			this.m_ctxGroupRearrSep0.Size = new System.Drawing.Size(237, 6);
+			this.m_ctxGroupRearrSep0.Size = new System.Drawing.Size(184, 6);
 			// 
 			// m_ctxGroupSort
 			// 
 			this.m_ctxGroupSort.Image = global::KeePass.Properties.Resources.B16x16_KaboodleLoop;
 			this.m_ctxGroupSort.Name = "m_ctxGroupSort";
-			this.m_ctxGroupSort.Size = new System.Drawing.Size(240, 22);
+			this.m_ctxGroupSort.Size = new System.Drawing.Size(187, 22);
 			this.m_ctxGroupSort.Text = "&Sort Direct Subgroups";
 			this.m_ctxGroupSort.Click += new System.EventHandler(this.OnGroupsSort);
 			// 
@@ -389,7 +390,7 @@
 			// 
 			this.m_ctxGroupSortRec.Image = global::KeePass.Properties.Resources.B16x16_KaboodleLoop;
 			this.m_ctxGroupSortRec.Name = "m_ctxGroupSortRec";
-			this.m_ctxGroupSortRec.Size = new System.Drawing.Size(240, 22);
+			this.m_ctxGroupSortRec.Size = new System.Drawing.Size(187, 22);
 			this.m_ctxGroupSortRec.Text = "So&rt Subgroup Tree";
 			this.m_ctxGroupSortRec.Click += new System.EventHandler(this.OnGroupsSortRec);
 			// 
@@ -524,7 +525,7 @@
 			this.m_ctxEntryOpenUrl.Image = global::KeePass.Properties.Resources.B16x16_FTP;
 			this.m_ctxEntryOpenUrl.Name = "m_ctxEntryOpenUrl";
 			this.m_ctxEntryOpenUrl.Size = new System.Drawing.Size(190, 22);
-			this.m_ctxEntryOpenUrl.Text = "&Open in Browser";
+			this.m_ctxEntryOpenUrl.Text = "<>";
 			this.m_ctxEntryOpenUrl.Click += new System.EventHandler(this.OnEntryOpenUrl);
 			// 
 			// m_ctxEntryCopyUrl
@@ -813,7 +814,7 @@
 			// 
 			this.m_ctxEntryMoveToTop.Image = global::KeePass.Properties.Resources.B16x16_2UpArrow;
 			this.m_ctxEntryMoveToTop.Name = "m_ctxEntryMoveToTop";
-			this.m_ctxEntryMoveToTop.Size = new System.Drawing.Size(235, 22);
+			this.m_ctxEntryMoveToTop.Size = new System.Drawing.Size(182, 22);
 			this.m_ctxEntryMoveToTop.Text = "Move Entry to &Top";
 			this.m_ctxEntryMoveToTop.Click += new System.EventHandler(this.OnEntryMoveToTop);
 			// 
@@ -821,7 +822,7 @@
 			// 
 			this.m_ctxEntryMoveOneUp.Image = global::KeePass.Properties.Resources.B16x16_1UpArrow;
 			this.m_ctxEntryMoveOneUp.Name = "m_ctxEntryMoveOneUp";
-			this.m_ctxEntryMoveOneUp.Size = new System.Drawing.Size(235, 22);
+			this.m_ctxEntryMoveOneUp.Size = new System.Drawing.Size(182, 22);
 			this.m_ctxEntryMoveOneUp.Text = "Move Entry &One Up";
 			this.m_ctxEntryMoveOneUp.Click += new System.EventHandler(this.OnEntryMoveOneUp);
 			// 
@@ -829,7 +830,7 @@
 			// 
 			this.m_ctxEntryMoveOneDown.Image = global::KeePass.Properties.Resources.B16x16_1DownArrow;
 			this.m_ctxEntryMoveOneDown.Name = "m_ctxEntryMoveOneDown";
-			this.m_ctxEntryMoveOneDown.Size = new System.Drawing.Size(220, 22);
+			this.m_ctxEntryMoveOneDown.Size = new System.Drawing.Size(182, 22);
 			this.m_ctxEntryMoveOneDown.Text = "Mo&ve Entry One Down";
 			this.m_ctxEntryMoveOneDown.Click += new System.EventHandler(this.OnEntryMoveOneDown);
 			// 
@@ -1730,46 +1731,47 @@
 			this.m_ctxTray.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
             this.m_ctxTrayTray,
             this.m_ctxTraySep0,
-            this.m_ctxTrayLock,
+            this.m_ctxTrayOptions,
             this.m_ctxTraySep1,
+            this.m_ctxTrayLock,
             this.m_ctxTrayFileExit});
 			this.m_ctxTray.Name = "m_ctxTray";
-			this.m_ctxTray.Size = new System.Drawing.Size(138, 82);
+			this.m_ctxTray.Size = new System.Drawing.Size(153, 126);
 			this.m_ctxTray.Opening += new System.ComponentModel.CancelEventHandler(this.OnCtxTrayOpening);
 			// 
 			// m_ctxTrayTray
 			// 
 			this.m_ctxTrayTray.Image = global::KeePass.Properties.Resources.B16x16_View_Detailed;
 			this.m_ctxTrayTray.Name = "m_ctxTrayTray";
-			this.m_ctxTrayTray.Size = new System.Drawing.Size(137, 22);
+			this.m_ctxTrayTray.Size = new System.Drawing.Size(152, 22);
 			this.m_ctxTrayTray.Text = "&Tray / Untray";
 			this.m_ctxTrayTray.Click += new System.EventHandler(this.OnTrayTray);
 			// 
 			// m_ctxTraySep0
 			// 
 			this.m_ctxTraySep0.Name = "m_ctxTraySep0";
-			this.m_ctxTraySep0.Size = new System.Drawing.Size(134, 6);
+			this.m_ctxTraySep0.Size = new System.Drawing.Size(149, 6);
 			// 
 			// m_ctxTrayLock
 			// 
 			this.m_ctxTrayLock.Image = global::KeePass.Properties.Resources.B16x16_LockWorkspace;
 			this.m_ctxTrayLock.Name = "m_ctxTrayLock";
-			this.m_ctxTrayLock.Size = new System.Drawing.Size(137, 22);
+			this.m_ctxTrayLock.Size = new System.Drawing.Size(152, 22);
 			this.m_ctxTrayLock.Text = "<>";
 			this.m_ctxTrayLock.Click += new System.EventHandler(this.OnTrayLock);
 			// 
 			// m_ctxTraySep1
 			// 
 			this.m_ctxTraySep1.Name = "m_ctxTraySep1";
-			this.m_ctxTraySep1.Size = new System.Drawing.Size(134, 6);
+			this.m_ctxTraySep1.Size = new System.Drawing.Size(149, 6);
 			// 
 			// m_ctxTrayFileExit
 			// 
 			this.m_ctxTrayFileExit.Image = global::KeePass.Properties.Resources.B16x16_Exit;
 			this.m_ctxTrayFileExit.Name = "m_ctxTrayFileExit";
-			this.m_ctxTrayFileExit.Size = new System.Drawing.Size(137, 22);
+			this.m_ctxTrayFileExit.Size = new System.Drawing.Size(152, 22);
 			this.m_ctxTrayFileExit.Text = "E&xit";
-			this.m_ctxTrayFileExit.Click += new System.EventHandler(this.OnFileExit);
+			this.m_ctxTrayFileExit.Click += new System.EventHandler(this.OnTrayExit);
 			// 
 			// m_timerMain
 			// 
@@ -1888,6 +1890,14 @@
 			this.m_richEntryView.LinkClicked += new System.Windows.Forms.LinkClickedEventHandler(this.OnEntryViewLinkClicked);
 			this.m_richEntryView.KeyUp += new System.Windows.Forms.KeyEventHandler(this.OnEntryViewKeyUp);
 			// 
+			// m_ctxTrayOptions
+			// 
+			this.m_ctxTrayOptions.Image = global::KeePass.Properties.Resources.B16x16_Misc;
+			this.m_ctxTrayOptions.Name = "m_ctxTrayOptions";
+			this.m_ctxTrayOptions.Size = new System.Drawing.Size(152, 22);
+			this.m_ctxTrayOptions.Text = "&Options...";
+			this.m_ctxTrayOptions.Click += new System.EventHandler(this.OnTrayOptions);
+			// 
 			// MainForm
 			// 
 			this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
@@ -2116,6 +2126,7 @@
 		private System.Windows.Forms.ToolStripSeparator m_menuToolsDbSep0;
 		private System.Windows.Forms.ToolStripMenuItem m_menuToolsDbDelEmptyGroups;
 		private System.Windows.Forms.ToolStripMenuItem m_menuToolsDbDelUnusedIcons;
+		private System.Windows.Forms.ToolStripMenuItem m_ctxTrayOptions;
 	}
 }
 
diff --git a/KeePass/Forms/MainForm.cs b/KeePass/Forms/MainForm.cs
index c4cc042..aaeedba 100644
--- a/KeePass/Forms/MainForm.cs
+++ b/KeePass/Forms/MainForm.cs
@@ -67,7 +67,6 @@ namespace KeePass.Forms
 		private bool m_bRestart = false;
 		private ListSorter m_pListSorter = new ListSorter();
 		private ListViewSortMenu m_lvsmMenu = null;
-		private bool m_bBlockQuickFind = false;
 
 		private bool m_bDraggingEntries = false;
 
@@ -81,6 +80,18 @@ namespace KeePass.Forms
 		/// </summary>
 		public MainForm()
 		{
+			try
+			{
+				m_nTaskbarButtonMessage = NativeMethods.RegisterWindowMessage(
+					"TaskbarButtonCreated");
+				m_bTaskbarButtonMessage = (m_nTaskbarButtonMessage != 0);
+			}
+			catch(Exception)
+			{
+				m_nTaskbarButtonMessage = 0x1E8F46A7; // Unlikely to occur
+				m_bTaskbarButtonMessage = false;
+			}
+
 			string strIso6391 = Program.Translation.Properties.Iso6391Code;
 			if(strIso6391.Length > 0)
 			{
@@ -104,10 +115,13 @@ namespace KeePass.Forms
 			Program.Translation.ApplyTo("KeePass.Forms.MainForm.m_ctxGroupList", m_ctxGroupList.Items);
 			Program.Translation.ApplyTo("KeePass.Forms.MainForm.m_ctxTray", m_ctxTray.Items);
 
+			m_asyncListUpdate = new AsyncPwListUpdate(m_lvEntries);
+
 			m_splitHorizontal.InitEx(this.Controls, m_menuMain);
 			m_splitVertical.InitEx(this.Controls, m_menuMain);
 
 			AssignMenuShortcuts();
+			AssignMenuShortcutsOpt();
 
 			if(NativeLib.IsUnix())
 			{
@@ -133,18 +147,22 @@ namespace KeePass.Forms
 			// m_imgFileSaveAllDisabled = Properties.Resources.B16x16_File_SaveAll_Disabled;
 			m_ilCurrentIcons = m_ilClientIcons;
 
+			m_ctxEntryOpenUrl.Text = KPRes.OpenCmd;
+
 			m_ntfTray = new NotifyIconEx(this.components);
 			m_ntfTray.ContextMenuStrip = m_ctxTray;
 			m_ntfTray.Visible = true;
 			m_ntfTray.SetHandlers(OnSystemTrayClick, OnSystemTrayDoubleClick,
 				OnSystemTrayMouseDown);
 
+			m_ctxTrayTray.Font = FontUtil.CreateFont(m_ctxTrayTray.Font, FontStyle.Bold);
+
 			m_nLockTimerMax = (int)Program.Config.Security.WorkspaceLocking.LockAfterTime;
 			m_nClipClearMax = Program.Config.Security.ClipboardClearAfterSeconds;
 
 			NativeLib.AllowNative = Program.Config.Native.NativeKeyTransformations;
 
-			m_ctxEntryPreviewContextMenu.Attach(m_richEntryView);
+			m_ctxEntryPreviewContextMenu.Attach(m_richEntryView, this);
 
 			m_dynCustomStrings = new DynamicMenu(m_ctxEntryCopyCustomString.DropDownItems);
 			m_dynCustomStrings.MenuClick += this.OnCopyCustomString;
@@ -164,6 +182,8 @@ namespace KeePass.Forms
 			m_dynRemoveTag = new DynamicMenu(m_ctxEntrySelectedRemoveTag.DropDownItems);
 			m_dynRemoveTag.MenuClick += this.OnRemoveEntryTag;
 
+			m_dynOpenUrl = new OpenWithMenu(m_ctxEntryUrl);
+
 			EntryTemplates.Init(m_tbAddEntry);
 
 			m_menuEdit.DropDownItems.Insert(0, new ToolStripSeparator());
@@ -290,7 +310,7 @@ namespace KeePass.Forms
 			if(bMaximizedSetting)
 			{
 				if((this.WindowState == FormWindowState.Normal) && !IsTrayed())
-					this.WindowState = FormWindowState.Maximized;
+					UIUtil.SetWindowState(this, FormWindowState.Maximized);
 			}
 
 			try
@@ -331,6 +351,8 @@ namespace KeePass.Forms
 				m_pluginManager.LoadAllPlugins(UrlUtil.GetFileDirectory(
 					WinUtil.GetExecutable(), false, true));
 
+			// Delete old files *after* loading plugins (when timestamps
+			// of loaded plugins have been updated already)
 			if(Program.Config.Application.Start.PluginCacheDeleteOld)
 				PlgxCache.DeleteOldFilesAsync();
 
@@ -358,6 +380,8 @@ namespace KeePass.Forms
 			UpdateUIState(false);
 			ApplyUICustomizations();
 
+			ThreadPool.QueueUserWorkItem(new WaitCallback(OnFormLoadParallelAsync));
+
 			Program.TriggerSystem.RaiseEvent(EcasEventIDs.AppInitPost);
 
 			if(Program.CommandLineArgs.FileName != null)
@@ -472,7 +496,8 @@ namespace KeePass.Forms
 				KPRes.Password));
 			pe.Strings.Set(PwDefs.NotesField, new ProtectedString(pd.MemoryProtection.ProtectNotes,
 				KPRes.Notes));
-			pe.AutoType.Set(KPRes.TargetWindow, @"{USERNAME}{TAB}{PASSWORD}{TAB}{ENTER}");
+			pe.AutoType.Add(new AutoTypeAssociation(KPRes.TargetWindow,
+				@"{USERNAME}{TAB}{PASSWORD}{TAB}{ENTER}"));
 			pd.RootGroup.AddEntry(pe, true);
 
 			pe = new PwEntry(true, true);
@@ -484,7 +509,7 @@ namespace KeePass.Forms
 				@"http://keepass.info/help/kb/kb090406_testform.html"));
 			pe.Strings.Set(PwDefs.PasswordField, new ProtectedString(pd.MemoryProtection.ProtectPassword,
 				"12345"));
-			pe.AutoType.Set("Test Form - KeePass*", string.Empty);
+			pe.AutoType.Add(new AutoTypeAssociation("Test Form - KeePass*", string.Empty));
 			pd.RootGroup.AddEntry(pe, true);
 
 #if DEBUG
@@ -661,6 +686,7 @@ namespace KeePass.Forms
 		private void OnFileExit(object sender, EventArgs e)
 		{
 			NotifyUserActivity();
+			if(UIIsInteractionBlocked()) { Debug.Assert(false); return; }
 
 			if(GlobalWindowManager.CanCloseAllWindows)
 				GlobalWindowManager.CloseAllWindows();
@@ -701,7 +727,7 @@ namespace KeePass.Forms
 			Debug.Assert(pe != null); if(pe == null) return;
 
 			if(ClipboardUtil.CopyAndMinimize(pe.Strings.GetSafe(PwDefs.UserNameField),
-				true, this, pe, m_docMgr.ActiveDatabase))
+				true, this, pe, m_docMgr.SafeFindContainerOf(pe)))
 				StartClipboardCountdown();
 		}
 
@@ -717,7 +743,7 @@ namespace KeePass.Forms
 			}
 
 			if(ClipboardUtil.CopyAndMinimize(pe.Strings.GetSafe(PwDefs.PasswordField),
-				true, this, pe, m_docMgr.ActiveDatabase))
+				true, this, pe, m_docMgr.SafeFindContainerOf(pe)))
 				StartClipboardCountdown();
 		}
 
@@ -745,11 +771,12 @@ namespace KeePass.Forms
 			PwEntry pe = GetSelectedEntry(false);
 			if(pe != null)
 			{
-				try { AutoType.PerformIntoPreviousWindow(this, pe); }
-				catch(Exception ex)
+				try
 				{
-					MessageService.ShowWarning(ex);
+					AutoType.PerformIntoPreviousWindow(this, pe,
+						m_docMgr.SafeFindContainerOf(pe));
 				}
+				catch(Exception ex) { MessageService.ShowWarning(ex); }
 			}
 		}
 
@@ -806,9 +833,7 @@ namespace KeePass.Forms
 
 				PwObjectList<PwEntry> vSelect = new PwObjectList<PwEntry>();
 				vSelect.Add(pwe);
-				SelectEntries(vSelect, true);
-				ListViewItem lviFocus = GuiFindEntry(pwe.Uuid);
-				if(lviFocus != null) m_lvEntries.FocusedItem = lviFocus;
+				SelectEntries(vSelect, true, true);
 
 				EnsureVisibleEntry(pwe.Uuid);
 			}
@@ -823,27 +848,43 @@ namespace KeePass.Forms
 
 		private void OnEntryDuplicate(object sender, EventArgs e)
 		{
+			PwDatabase pd = m_docMgr.ActiveDatabase;
 			PwGroup pgSelected = GetSelectedGroup();
 
 			PwEntry[] vSelected = GetSelectedEntries();
 			if((vSelected == null) || (vSelected.Length == 0)) return;
 
+			DuplicationForm dlg = new DuplicationForm();
+			if(UIUtil.ShowDialogAndDestroy(dlg) != DialogResult.OK) return;
+
 			PwObjectList<PwEntry> vNewEntries = new PwObjectList<PwEntry>();
 			foreach(PwEntry pe in vSelected)
 			{
 				PwEntry peNew = pe.CloneDeep();
 				peNew.SetUuid(new PwUuid(true), true); // Create new UUID
 
-				ProtectedString psTitle = peNew.Strings.Get(PwDefs.TitleField);
-				if(psTitle != null)
+				if(dlg.AppendCopyToTitles && (pd != null))
+				{
+					string strTitle = peNew.Strings.ReadSafe(PwDefs.TitleField);
 					peNew.Strings.Set(PwDefs.TitleField, new ProtectedString(
-						psTitle.IsProtected, psTitle.ReadString() + " - " +
+						pd.MemoryProtection.ProtectTitle, strTitle + " - " +
 						KPRes.CopyOfItem));
+				}
+
+				if(dlg.ReplaceDataByFieldRefs && (pd != null))
+				{
+					string strUser = @"{REF:U at I:" + pe.Uuid.ToHexString() + @"}";
+					peNew.Strings.Set(PwDefs.UserNameField, new ProtectedString(
+						pd.MemoryProtection.ProtectUserName, strUser));
+
+					string strPw = @"{REF:P at I:" + pe.Uuid.ToHexString() + @"}";
+					peNew.Strings.Set(PwDefs.PasswordField, new ProtectedString(
+						pd.MemoryProtection.ProtectPassword, strPw));
+				}
 
 				Debug.Assert(pe.ParentGroup == peNew.ParentGroup);
 				PwGroup pg = (pe.ParentGroup ?? pgSelected);
-				if((pg == null) && (m_docMgr.ActiveDocument != null))
-					pg = m_docMgr.ActiveDatabase.RootGroup;
+				if((pg == null) && (pd != null)) pg = pd.RootGroup;
 				if(pg == null) continue;
 
 				pg.AddEntry(peNew, true, true);
@@ -851,9 +892,9 @@ namespace KeePass.Forms
 			}
 
 			AddEntriesToList(vNewEntries);
-			SelectEntries(vNewEntries, true);
+			SelectEntries(vNewEntries, true, false);
 
-			if((m_lvEntries.ShowGroups == false) && (m_lvEntries.Items.Count >= 1))
+			if(!m_lvEntries.ShowGroups && (m_lvEntries.Items.Count >= 1))
 				m_lvEntries.EnsureVisible(m_lvEntries.Items.Count - 1);
 			else EnsureVisibleSelected(true);
 
@@ -892,7 +933,7 @@ namespace KeePass.Forms
 						SaveWindowPositionAndSize();
 
 						e.Cancel = true;
-						this.WindowState = FormWindowState.Minimized;
+						UIUtil.SetWindowState(this, FormWindowState.Minimized);
 						return;
 					}
 				}
@@ -1019,14 +1060,21 @@ namespace KeePass.Forms
 				{
 					if(lvs == lvHit.SubItem)
 					{
-						PerformDefaultAction(sender, e, lvi.Tag as PwEntry, i);
+						PwListItem pli = (lvi.Tag as PwListItem);
+						if(pli != null) PerformDefaultAction(sender, e, pli.Entry, i);
+						else { Debug.Assert(false); }
 						break;
 					}
 
 					++i;
 				}
 			}
-			else PerformDefaultAction(sender, e, lvi.Tag as PwEntry, 0);
+			else
+			{
+				PwListItem pli = (lvi.Tag as PwListItem);
+				if(pli != null) PerformDefaultAction(sender, e, pli.Entry, 0);
+				else { Debug.Assert(false); }
+			}
 		}
 
 		private void OnQuickFindSelectedIndexChanged(object sender, EventArgs e)
@@ -1035,15 +1083,30 @@ namespace KeePass.Forms
 			m_bBlockQuickFind = true;
 
 			string strSearch = m_tbQuickFind.Text; // Text, not selected index!
+
+			lock(m_objQuickFindSync)
+			{
+				int iNow = Environment.TickCount;
+				if(((iNow - m_iLastQuickFindTicks) <= 1000) &&
+					(strSearch == m_strLastQuickSearch))
+				{
+					m_bBlockQuickFind = false;
+					return;
+				}
+
+				m_iLastQuickFindTicks = iNow;
+				m_strLastQuickSearch = strSearch;
+			}
+
 			string strGroupName = KPRes.SearchGroupName + " (\"" + strSearch + "\" ";
 			strGroupName += KPRes.SearchResultsInSeparator + " ";
 			strGroupName += m_docMgr.ActiveDatabase.RootGroup.Name + ")";
 
-			PerformQuickFind(strSearch, strGroupName, false);
+			// PerformQuickFind(strSearch, strGroupName, false);
 
 			// Lookup in combobox for the current search
 			int nExistsAlready = -1;
-			for(int i = 0; i < m_tbQuickFind.Items.Count; i++)
+			for(int i = 0; i < m_tbQuickFind.Items.Count; ++i)
 			{
 				string strItemText = (string)m_tbQuickFind.Items[i];
 				if(strItemText.Equals(strSearch, StringComparison.InvariantCultureIgnoreCase))
@@ -1065,6 +1128,11 @@ namespace KeePass.Forms
 			m_tbQuickFind.SelectedIndex = 0;
 			m_tbQuickFind.Select(0, strSearch.Length);
 
+			// Asynchronous invokation allows to cleanly process
+			// an Enter keypress before blocking the UI
+			BeginInvoke(new PerformQuickFindDelegate(PerformQuickFind),
+				strSearch, strGroupName, false);
+
 			m_bBlockQuickFind = false;
 		}
 
@@ -1118,6 +1186,8 @@ namespace KeePass.Forms
 				m_mruList.MaxItemCount = Program.Config.Application.MostRecentlyUsed.MaxItemCount;
 				SetListFont(Program.Config.UI.StandardFont);
 
+				AssignMenuShortcutsOpt();
+
 				if(ofDlg.RequiresUIReinitialize) UIUtil.Initialize(true);
 
 				AppConfigSerializer.Save(Program.Config);
@@ -1131,8 +1201,9 @@ namespace KeePass.Forms
 		private void OnPwListItemDrag(object sender, ItemDragEventArgs e)
 		{
 			if(e.Item == null) return;
-			PwEntry pe = (((ListViewItem)e.Item).Tag as PwEntry);
-			if(pe == null) { Debug.Assert(false); return; }
+			PwListItem pli = (((ListViewItem)e.Item).Tag as PwListItem);
+			if(pli == null) { Debug.Assert(false); return; }
+			PwEntry pe = pli.Entry;
 
 			ListViewHitTestInfo lvHit = m_lvEntries.HitTest(m_ptLastEntriesMouseClick);
 			ListViewItem lvi = lvHit.Item;
@@ -1149,7 +1220,8 @@ namespace KeePass.Forms
 				{
 					if(lvs == lvHit.SubItem)
 					{
-						strText = GetEntryFieldEx(pe, i, false);
+						bool bDummy;
+						strText = GetEntryFieldEx(pe, i, false, out bDummy);
 						break;
 					}
 
@@ -1159,8 +1231,9 @@ namespace KeePass.Forms
 
 			m_pgActiveAtDragStart = GetSelectedGroup();
 
-			PwDatabase pd = ((m_docMgr.ActiveDocument != null) ? m_docMgr.ActiveDatabase : null);
-			string strToTransfer = SprEngine.Compile(strText, false, pe, pd, false, false);
+			PwDatabase pd = m_docMgr.SafeFindContainerOf(pe);
+			string strToTransfer = SprEngine.Compile(strText, new SprContext(
+				pe, pd, SprCompileFlags.All));
 
 			m_bDraggingEntries = true;
 			this.DoDragDrop(strToTransfer, DragDropEffects.Copy | DragDropEffects.Move);
@@ -1315,7 +1388,7 @@ namespace KeePass.Forms
 			TreeNode tn = m_tvGroups.SelectedNode;
 			PwGroup pgParent;
 
-			if(tn != null) pgParent = tn.Tag as PwGroup;
+			if(tn != null) pgParent = (tn.Tag as PwGroup);
 			else pgParent = m_docMgr.ActiveDatabase.RootGroup;
 
 			if(pgParent == null) { Debug.Assert(false); return; }
@@ -1419,6 +1492,10 @@ namespace KeePass.Forms
 				if((m_fwsLast == FormWindowState.Minimized) && IsFileLocked(null) &&
 					!UIIsAutoUnlockBlocked())
 					OnFileLock(sender, e); // Unlock
+
+				if((m_fwsLast == FormWindowState.Minimized) && !IsFileLocked(null) &&
+					Program.Config.MainWindow.FocusQuickFindOnRestore)
+					ResetDefaultFocus(null);
 			}
 
 			m_fwsLast = ws;
@@ -1426,10 +1503,13 @@ namespace KeePass.Forms
 
 		private void OnTrayTray(object sender, EventArgs e)
 		{
+			if(!IsCommandTypeInvokable(null, AppCommandType.Window)) return;
+
 			if((this.WindowState == FormWindowState.Minimized) && !IsTrayed())
 			{
-				if(Program.Config.MainWindow.Maximized) this.WindowState = FormWindowState.Maximized;
-				else this.WindowState = FormWindowState.Normal;
+				if(Program.Config.MainWindow.Maximized)
+					UIUtil.SetWindowState(this, FormWindowState.Maximized);
+				else UIUtil.SetWindowState(this, FormWindowState.Normal);
 				return;
 			}
 
@@ -1514,7 +1594,8 @@ namespace KeePass.Forms
 			PwEntry[] v = GetSelectedEntries();
 			Debug.Assert(v != null); if(v == null) return;
 
-			if(ClipboardUtil.CopyAndMinimize(UrlsToString(v), true, this, null, null))
+			if(ClipboardUtil.CopyAndMinimize(UrlsToString(v, true), true,
+				this, null, null))
 				StartClipboardCountdown();
 		}
 
@@ -1757,21 +1838,52 @@ namespace KeePass.Forms
 
 		private void OnEntryViewLinkClicked(object sender, LinkClickedEventArgs e)
 		{
+			string strLink = e.LinkText;
+			if(string.IsNullOrEmpty(strLink)) { Debug.Assert(false); return; }
+
 			PwEntry pe = GetSelectedEntry(false);
-			ProtectedBinary pb = ((pe != null) ? pe.Binaries.Get(e.LinkText) : null);
+			ProtectedBinary pb = ((pe != null) ? pe.Binaries.Get(strLink) : null);
+
+			string strEntryUrl = string.Empty;
+			if(pe != null)
+				strEntryUrl = SprEngine.Compile(pe.Strings.ReadSafe(PwDefs.UrlField),
+					GetEntryListSprContext(pe, m_docMgr.SafeFindContainerOf(pe)));
 
 			if((pe != null) && (pe.ParentGroup != null) &&
-				(pe.ParentGroup.Name == e.LinkText))
+				(pe.ParentGroup.Name == strLink))
 			{
 				UpdateUI(false, null, true, pe.ParentGroup, true, null, false);
 				EnsureVisibleSelected(false);
 				ResetDefaultFocus(m_lvEntries);
 			}
-			else if((pe != null) && (pe.Strings.ReadSafe(PwDefs.UrlField) == e.LinkText))
+			else if(strEntryUrl == strLink)
 				PerformDefaultUrlAction(null, false);
 			else if(pb != null)
-				ExecuteBinaryEditView(e.LinkText, pb);
-			else WinUtil.OpenUrl(e.LinkText, pe);
+				ExecuteBinaryEditView(strLink, pb);
+			else if(strLink.StartsWith(SprEngine.StrRefStart, StrUtil.CaseIgnoreCmp) &&
+				strLink.EndsWith(SprEngine.StrRefEnd, StrUtil.CaseIgnoreCmp))
+			{
+				// If multiple references are amalgamated, only use first one
+				string strFirstRef = strLink;
+				int iEnd = strLink.IndexOf(SprEngine.StrRefEnd, StrUtil.CaseIgnoreCmp);
+				if(iEnd != (strLink.Length - SprEngine.StrRefEnd.Length))
+					strFirstRef = strLink.Substring(0, iEnd + 1);
+
+				char chScan, chWanted;
+				PwEntry peRef = SprEngine.FindRefTarget(strFirstRef, GetEntryListSprContext(
+					pe, m_docMgr.SafeFindContainerOf(pe)), out chScan, out chWanted);
+				if(peRef != null)
+				{
+					UpdateUI(false, null, true, peRef.ParentGroup, true, null,
+						false, m_lvEntries);
+					PwObjectList<PwEntry> lSel = new PwObjectList<PwEntry>();
+					lSel.Add(peRef);
+					SelectEntries(lSel, true, true);
+					EnsureVisibleSelected(false);
+					ShowEntryDetails(peRef);
+				}
+			}
+			else WinUtil.OpenUrl(strLink, pe);
 		}
 
 		private void OnEntryClipCopy(object sender, EventArgs e)
@@ -2158,11 +2270,12 @@ namespace KeePass.Forms
 
 		private void OnCtxTrayOpening(object sender, CancelEventArgs e)
 		{
-			UpdateUIState(false);
+			UpdateTrayState();
 		}
 
 		private void OnTrayLock(object sender, EventArgs e)
 		{
+			if(!IsCommandTypeInvokable(null, AppCommandType.Lock)) return;
 			OnFileLock(sender, e);
 		}
 
@@ -2316,16 +2429,17 @@ namespace KeePass.Forms
 			PwDatabase pd = m_docMgr.ActiveDatabase;
 			if((pd == null) || !pd.IsOpen) { Debug.Assert(false); return; }
 
-			StatusProgressForm dlg = new StatusProgressForm();
-			dlg.InitEx(null, true, false, this);
-			dlg.Show();
-			dlg.StartLogging(KPRes.Delete + "...", false);
+			Form fOptDialog;
+			IStatusLogger sl = StatusUtil.CreateStatusDialog(this, out fOptDialog,
+				null, KPRes.Delete + "...", true, false);
+			if(fOptDialog != null) RedirectActivationPush(fOptDialog);
+			UIBlockInteraction(true);
 
-			uint uDeleted = pd.DeleteDuplicateEntries(dlg);
+			uint uDeleted = pd.DeleteDuplicateEntries(sl);
 
-			dlg.EndLogging();
-			dlg.Close();
-			UIUtil.DestroyForm(dlg);
+			if(fOptDialog != null) RedirectActivationPop();
+			UIBlockInteraction(false);
+			sl.EndLogging();
 
 			UpdateUI(false, null, false, null, (uDeleted > 0), null, (uDeleted > 0));
 			SetObjectsDeletedStatus(uDeleted, true);
@@ -2350,5 +2464,18 @@ namespace KeePass.Forms
 			UpdateUIState(uDeleted > 0);
 			SetObjectsDeletedStatus(uDeleted, true);
 		}
+
+		private void OnTrayExit(object sender, EventArgs e)
+		{
+			if(!IsCommandTypeInvokable(null, AppCommandType.Window)) return;
+			OnFileExit(sender, e);
+		}
+
+		private void OnTrayOptions(object sender, EventArgs e)
+		{
+			if(!IsCommandTypeInvokable(null, AppCommandType.Window)) return;
+			EnsureVisibleForegroundWindow(false, false); // Parent is main window, not tray
+			OnToolsOptions(sender, e);
+		}
 	}
 }
diff --git a/KeePass/Forms/MainForm.resx b/KeePass/Forms/MainForm.resx
index 70cc1a3..2aa416d 100644
--- a/KeePass/Forms/MainForm.resx
+++ b/KeePass/Forms/MainForm.resx
@@ -127,1454 +127,1445 @@
     <value>
         AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj0yLjAuMC4w
         LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAACZTeXN0
-        ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAAAC
-        UwEAAk1TRnQBSQFMAgEBRQEAAUwBAAEEAQABEAEAARABAAT/ASEBAAj/AUIBTQE2BwABNgMAASgDAAFA
-        AwABIAEBAgABAQEAASAGAAEgAQEhAAGFAVkBTQH/AUwBGQEIAf8BTAEZAQgB/wFMARkBCAH/AUwBGQEI
-        Af8BTAEZAQgB/wGFAVkBTQH/4AABlgFxAWcB/wFmAUYBOwH/AWcBUgFMAf8BaQFYAVMB/wOHAf8BcgFk
-        AV8B/wFyAWEBWwH/AWgBRwE9Af8BnAF3AW0B/9wAAXIBTwFEAf8BSgEuASYB/wFIAScBHQH/AUgBJwEd
-        Af8BUwE2ASwB/wFTATYBLAH/AVMBNgEsAf8BUwE2ASwB/wFyAU8BRAH/3AABcgFPAUQB/wFjAUQBOgH/
-        AWkBSgFAAf8BaQFKAUAB/wFpAUwBQgH/AWkBTAFCAf8BaQFMAUIB/wFpAUsBQgH/AXIBTwFEAf/cAAFy
-        AU8BRAH/AWMBRAE7Af8BaQFKAUAB/wFtAU0BRAH/AY4BZQFbAf8BbQFPAUUB/wFpAUwBQgH/AWkBTAFC
-        Af8BcgFPAUQB/9wAAXIBTwFEAf8BTgFKAR0B/wFsAZEBSgH/AXUBVAFBAf8B6wH1AfgB/wGBAkwB/wFU
-        ATYBkAH/AUoBJAFPAf8BcgFPAUQB/9wAAXIBTwFEAf8CawFMAf8BmQGyAZQB/wHGAb0BugH/AcgBtgGx
-        Af8BxgG9AboB/wGZAZQBxgH/AWsBUwF1Af8BcgFPAUQB/9wAAXIBTwFEAf8BMwEZARQB/wErAhsB/wE8
-        ASEBOwH/AUICNgH/AU0CQQH/AS8CHwH/ATMBGQEUAf8BcgFPAUQB/9wAAXIBTwFEAf8BxwG8AbgB/wHw
-        AeEB3QH/AfgB+QH6Af8B8AHiAd8B/wP4Af8B8AHkAeEB/wG+AbMBrwH/AXIBTwFEAf/cAAFyAU8BRAH/
-        AccBuQG1Af8B2AG2Aa0B/wH1AvMB/wHZAbsBswH/AfIB7gHtAf8B4AHBAbgB/wG5Aa4BqgH/AXIBTwFE
-        Af/cAAFyAU8BRAH/AcABtAG5Af8BZAFVAdwB/wHsAfsC/wGBAd0C/wHjAfIB3wH/AYABuwFqAf8BuQGu
-        AaoB/wFyAU8BRAH/3AABcgFPAUQB/wG/AboBuwH/AW0BwAL/AfUC8wH/AdkBuwGzAf8B+AHvAe0B/wHg
-        AcEBuQH/AbkBrgGqAf8BcgFPAUQB/9wAAXIBTwFEAf8BxAG8AbsB/wG5AeIC/wHzAfgB+gH/AewB4QHf
-        Af8B9QH3AfgB/wHuAeMB4QH/Ab8BswGvAf8BcgFPAUQB/9wAAXIBTwFEAf8BMwEZARQB/wEqAhkB/wFC
-        AjUB/wFMAkAB/wFHAjoB/wEqAhkB/wEzARkBFAH/AXIBTwFEAf/cAAGEAVkBTgH/AU4BHQEMAf8BgAFX
-        AU0B/wG2Aa0BqgH/A8wB/wG2Aa0BqgH/AYABVwFNAf8BTgEdAQwB/wGKAWABVAH/3AAB0gHFAcEB/wFM
-        ARkBCAH/AUwBGQEIAf8BTAEZAQgB/wFMARkBCAH/AUwBGQEIAf8BQQEfAWIB/wFJARgBEAH/AdIBxQHB
-        Af/kAAPHAf8DTAH/A2UB/wOwAf8DcwH/A0YB/wOJAf9sAAGFAb4BhQH/ATQBlwE0Af9sAAOuAf8DUQH/
-        A1EB/wNQAf8DUAH/A1AB/wNQAf8DUAH/A1UB/2gAAYUBvgGFAf8BNAGXATQB/2wAA10B/wNfAf8DXQH/
-        A1oB/wNVAf8DUQH/A1AB/wNQAf8DUAH/A2IB/xwAA+8B/wPhAf8MAAPXAf8D/AH/HAABvwHdAb8B/wFs
-        AbUBbAH/ATQBlwE0Af8BHQGLAR0B/wEdAYsBHQH/AQABcAEAAf8BHQGLAR0B/wE0AZcBNAH/AbEB1QGx
-        Af9cAAN2Af8DagH/A2oB/wNpAf8DZQH/A2AB/wNaAf8DUwH/A1AB/wNQAf8DUAH/A8oB/xgAA1UB/wMK
-        Af8D8gH/BAADwQH/AwAB/wOvAf8cAAE0AZcBNAH/AQABcAEAAf8BhQG+AYUB/wHmAfEB5gH/AYUBvgGF
-        Af8BNAGXATQB/wG/Ad0BvwH/AR0BiwEdAf8BAAFwAQAB/wGUAcYBlAH/DAABxQHrAcUB/wG2AecBtgH/
+        ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAAD0
+        UAEAAk1TRnQBSQFMAgEBRQEAAUwBAAEEAQABEAEAARABAAT/ASEBAAj/AUIBTQE2BwABNgMAASgDAAFA
+        AwABIAEBAgABAQEAASAGAAEgAQEhAAGFAVYBSgH/AUkBFgEFAf8BSQEWAQUB/wFJARYBBQH/AUkBFgEF
+        Af8BSQEWAQUB/wGFAVYBSgH/4AABlgFuAWQB/wFjAUMBOAH/AWQBTwFJAf8BZgFVAVAB/wOHAf8BbwFh
+        AVwB/wFvAV4BWAH/AWUBRAE6Af8BnAF0AWoB/9wAAW8BTAFBAf8BRwErASMB/wFFASQBGgH/AUUBJAEa
+        Af8BUAEzASkB/wFQATMBKQH/AVABMwEpAf8BUAEzASkB/wFvAUwBQQH/3AABbwFMAUEB/wFgAUEBNwH/
+        AWYBRwE9Af8BZgFHAT0B/wFmAUkBPwH/AWYBSQE/Af8BZgFJAT8B/wFmAUgBPwH/AW8BTAFBAf/cAAFv
+        AUwBQQH/AWABQQE4Af8BZgFHAT0B/wFqAUoBQQH/AY4BYgFYAf8BagFMAUIB/wFmAUkBPwH/AWYBSQE/
+        Af8BbwFMAUEB/9wAAW8BTAFBAf8BSwFHARoB/wFpAZEBRwH/AXIBUQE+Af8B6wH1AfgB/wGBAkkB/wFR
+        ATMBkAH/AUcBIQFMAf8BbwFMAUEB/9wAAW8BTAFBAf8CaAFJAf8BmQGyAZQB/wHGAb0BugH/AcgBtgGx
+        Af8BxgG9AboB/wGZAZQBxgH/AWgBUAFyAf8BbwFMAUEB/9wAAW8BTAFBAf8BMAEWAREB/wEoAhgB/wE5
+        AR4BOAH/AT8CMwH/AUoCPgH/ASwCHAH/ATABFgERAf8BbwFMAUEB/9wAAW8BTAFBAf8BxwG8AbgB/wHw
+        AeEB3QH/AfgB+QH6Af8B8AHiAd8B/wP4Af8B8AHkAeEB/wG+AbMBrwH/AW8BTAFBAf/cAAFvAUwBQQH/
+        AccBuQG1Af8B2AG2Aa0B/wH1AvMB/wHZAbsBswH/AfIB7gHtAf8B4AHBAbgB/wG5Aa4BqgH/AW8BTAFB
+        Af/cAAFvAUwBQQH/AcABtAG5Af8BYQFSAdwB/wHsAfsC/wGBAd0C/wHjAfIB3wH/AYABuwFnAf8BuQGu
+        AaoB/wFvAUwBQQH/3AABbwFMAUEB/wG/AboBuwH/AWoBwAL/AfUC8wH/AdkBuwGzAf8B+AHvAe0B/wHg
+        AcEBuQH/AbkBrgGqAf8BbwFMAUEB/9wAAW8BTAFBAf8BxAG8AbsB/wG5AeIC/wHzAfgB+gH/AewB4QHf
+        Af8B9QH3AfgB/wHuAeMB4QH/Ab8BswGvAf8BbwFMAUEB/9wAAW8BTAFBAf8BMAEWAREB/wEnAhYB/wE/
+        AjIB/wFJAj0B/wFEAjcB/wEnAhYB/wEwARYBEQH/AW8BTAFBAf/cAAGEAVYBSwH/AUsBGgEJAf8BgAFU
+        AUoB/wG2Aa0BqgH/A8wB/wG2Aa0BqgH/AYABVAFKAf8BSwEaAQkB/wGKAV0BUQH/3AAB0gHFAcEB/wFJ
+        ARYBBQH/AUkBFgEFAf8BSQEWAQUB/wFJARYBBQH/AUkBFgEFAf8BPgEcAV8B/wFGARUBDQH/AdIBxQHB
+        Af/kAAPHAf8DSQH/A2IB/wOwAf8DcAH/A0MB/wOJAf9sAAGFAb4BhQH/ATEBlwExAf9sAAOuAf8DTgH/
+        A04B/wNNAf8DTQH/A00B/wNNAf8DTQH/A1IB/2gAAYUBvgGFAf8BMQGXATEB/2wAA1oB/wNcAf8DWgH/
+        A1cB/wNSAf8DTgH/A00B/wNNAf8DTQH/A18B/xwAA+8B/wPhAf8MAAPXAf8D/AH/HAABvwHdAb8B/wFp
+        AbUBaQH/ATEBlwExAf8BGgGLARoB/wEaAYsBGgH/AQABbQEAAf8BGgGLARoB/wExAZcBMQH/AbEB1QGx
+        Af9cAANzAf8DZwH/A2cB/wNmAf8DYgH/A10B/wNXAf8DUAH/A00B/wNNAf8DTQH/A8oB/xgAA1IB/wMH
+        Af8D8gH/BAADwQH/AwAB/wOvAf8cAAExAZcBMQH/AQABbQEAAf8BhQG+AYUB/wHmAfEB5gH/AYUBvgGF
+        Af8BMQGXATEB/wG/Ad0BvwH/ARoBiwEaAf8BAAFtAQAB/wGUAcYBlAH/DAABxQHrAcUB/wG2AecBtgH/
         AbQB5gG0Af8BtAHlAbQB/wG1AeYBswH/AbMB5QGyAf8BsQHlAbIB/wGxAeUBsgH/AbAB5AGvAf8BrwHj
-        Aa4B/wGxAeQBrgH/AawB4gGqAf8BqgHiAacB/wGpAeEBpgH/AacB4AGmAf8B2AHuAdcB/wwAA3QB/wOA
-        Af8DgAH/A3QB/wNxAf8DagH/A2QB/wNbAf8DUwH/A1AB/wNQAf8DUQH/FAAD3wH/AwAB/wMAAf8DiAH/
-        BAADPgH/AwAB/wNDAf8cAAE0AZcBNAH/AUkBogFJAf8IAAGFAb4BhQH/ATQBlwE0Af8EAAGFAb4BhQH/
-        AQABcAEAAf8BHQGLAR0B/wwAAZoB4QGbAf8BogHkAaYB/wG4AesBvAH/AboB6wG9Af8BuQHsAbwB/wG7
+        Aa4B/wGxAeQBrgH/AawB4gGqAf8BqgHiAacB/wGpAeEBpgH/AacB4AGmAf8B2AHuAdcB/wwAA3EB/wOA
+        Af8DgAH/A3EB/wNuAf8DZwH/A2EB/wNYAf8DUAH/A00B/wNNAf8DTgH/FAAD3wH/AwAB/wMAAf8DiAH/
+        BAADOwH/AwAB/wNAAf8cAAExAZcBMQH/AUYBogFGAf8IAAGFAb4BhQH/ATEBlwExAf8EAAGFAb4BhQH/
+        AQABbQEAAf8BGgGLARoB/wwAAZoB4QGbAf8BogHkAaYB/wG4AesBvAH/AboB6wG9Af8BuQHsAbwB/wG7
         AewBwAH/AboB6wG/Af8BugHrAb0B/wG7AesBvgH/AbkB6gG8Af8BuQHqAbwB/wG4AeoBvAH/AbcB6gG5
-        Af8BtAHpAbcB/wF0AdsBggH/AcUB5gHEAf8IAAO1Af8DiQH/A4sB/wOLAf8DiAH/A4MB/wN0Af8DbAH/
-        A2QB/wNaAf8DUQH/A1AB/wNQAf8UAANkAf8DAAH/AzwB/wMsAf8DvAH/AwAB/wMAAf8DLQH/A+EB/xgA
-        AZQBxgGUAf8BvwHdAb8B/wgAAYUBvgGFAf8BNAGXATQB/wQAAUkBogFJAf8BAAFwAQAB/wEAAXABAAH/
+        Af8BtAHpAbcB/wFxAdsBggH/AcUB5gHEAf8IAAO1Af8DiQH/A4sB/wOLAf8DiAH/A4MB/wNxAf8DaQH/
+        A2EB/wNXAf8DTgH/A00B/wNNAf8UAANhAf8DAAH/AzkB/wMpAf8DvAH/AwAB/wMAAf8DKgH/A+EB/xgA
+        AZQBxgGUAf8BvwHdAb8B/wgAAYUBvgGFAf8BMQGXATEB/wQAAUYBogFGAf8BAAFtAQAB/wEAAW0BAAH/
         AdkB6gHZAf8IAAGYAeABmwH/AcoB7wHRAf8B+gL+Af8B+gL+Af8B+gL+Af8B/QH/Af4F/wHLAc4B7gH/
-        AXEBhAHQAf8BvQHCAd4B/wF2AYoB1wH/AagBrAHXAf8B+AH+AfwB/wH1Af4B+gH/AY8B3wGVAf8BwwHl
-        AcMB/wgAA4YB/wOTAf8DmAH/A5gB/wOTAf8DjQH/A4UB/wNzAf8DaQH/A18B/wNVAf8DUAH/A1AB/wOn
-        Af8MAAPoAf8DAQH/AwAB/wPFAf8DkQH/AwkB/wMAAf8DVwH/A6wB/wN3Af8oAAFsAbUBbAH/AR0BiwEd
-        Af8BNAGXATQB/wEAAXABAAH/AQABcAEAAf8BHQGLAR0B/wwAAZwB4gGfAf8BxwHvAdAB/wHxAf4B/AH/
-        AfEB/gH8Af8B8QH+AfwB/wH6Af8B/gX/AeoB7QH8Af8BBAE8AfgB/wGbAasB3QH/ARQBSwH4Af8BawGL
+        AW4BhAHQAf8BvQHCAd4B/wFzAYoB1wH/AagBrAHXAf8B+AH+AfwB/wH1Af4B+gH/AY8B3wGVAf8BwwHl
+        AcMB/wgAA4YB/wOTAf8DmAH/A5gB/wOTAf8DjQH/A4UB/wNwAf8DZgH/A1wB/wNSAf8DTQH/A00B/wOn
+        Af8MAAPoAf8DAAH/AwAB/wPFAf8DkQH/AwYB/wMAAf8DVAH/A6wB/wN0Af8oAAFpAbUBaQH/ARoBiwEa
+        Af8BMQGXATEB/wEAAW0BAAH/AQABbQEAAf8BGgGLARoB/wwAAZwB4gGfAf8BxwHvAdAB/wHxAf4B/AH/
+        AfEB/gH8Af8B8QH+AfwB/wH6Af8B/gX/AeoB7QH8Af8BAQE5AfgB/wGbAasB3QH/AREBSAH4Af8BaAGL
         AeMB/wHrAf0B9wH/AecB/QH0Af8BjgHfAZcB/wHBAeYBwgH/CAADlQH/A58B/wOkAf8DpAH/A50B/wOV
-        Af8DiwH/A4EB/wNuAf8DZAH/A1gB/wNQAf8DUAH/A2kB/wwAA24B/wMAAf8DNQH/BAADywH/AwAB/wMA
-        Af8D2AH/BAADLQH/A/wB/xgAAeYB8QHmAf8BWwGsAVsB/wEdAYsBHQH/AQABcAEAAf8BAAFwAQAB/wEA
-        AXABAAH/AQABcAEAAf8BAAFwAQAB/wFJAaIBSQH/DAABnAHiAZ8B/wHFAe4BzgH/Ae0B+wH4Af8B7QH7
-        AfkB/wHsAfsB+QH/AfUB/gH9Af8B9wH+Af0B/wH8Av4B/wFaAXYB9AH/AREBMQHXAf8BBwEmAdEB/wHh
+        Af8DiwH/A4EB/wNrAf8DYQH/A1UB/wNNAf8DTQH/A2YB/wwAA2sB/wMAAf8DMgH/BAADywH/AwAB/wMA
+        Af8D2AH/BAADKgH/A/wB/xgAAeYB8QHmAf8BWAGsAVgB/wEaAYsBGgH/AQABbQEAAf8BAAFtAQAB/wEA
+        AW0BAAH/AQABbQEAAf8BAAFtAQAB/wFGAaIBRgH/DAABnAHiAZ8B/wHFAe4BzgH/Ae0B+wH4Af8B7QH7
+        AfkB/wHsAfsB+QH/AfUB/gH9Af8B9wH+Af0B/wH8Av4B/wFXAXMB9AH/AQ4BLgHXAf8BBAEjAdEB/wHh
         AeMB7QH/Af0C/gH/AfwB/gH9Af8BjwHgAZgB/wG/AeUBwAH/CAADmgH/A6YB/wOuAf8DrgH/A6QB/wOa
-        Af8DjgH/A4MB/wNvAf8DZQH/A1oB/wNQAf8DUAH/A1gB/wgAA/AB/wMIAf8DAAH/A7YB/wQAA1UB/wMA
-        Af8DTAH/CAADbQH/A7IB/xQAAdkB6gHZAf8BHQGLAR0B/wEAAXABAAH/AQABcAEAAf8BAAFwAQAB/wEA
-        AXABAAH/AQABcAEAAf8BAAFwAQAB/wFJAaIBSQH/EAABnAHiAaAB/wG1Ad8BvgH/AdAB2wHZAf8BzgHa
-        AdgB/wHKAdYB1AH/Ad4B6wHoAf8B8QH+AfwB/wH7Av4B/wErAVgB8wH/AQABHwHGAf8BAAEaAc0B/wG3
-        AbkB3QX/A/4B/wGTAeABnAH/AbwB4wG9Af8IAAOVAf8DpAH/A6wB/wOsAf8DogH/A40B/wN0Af8DgAH/
-        A28B/wNkAf8DWgH/A1AB/wNQAf8DhQH/CAADhQH/AwAB/wMqAf8EAAPiAf8DAAH/AwAB/wMlAf8D+wH/
-        BAAD1gH/A0gB/xQAAVsBrAFbAf8BAAFwAQAB/wEAAXABAAH/AQABcAEAAf8BHQGLAR0B/wEdAYsBHQH/
+        Af8DjgH/A4MB/wNsAf8DYgH/A1cB/wNNAf8DTQH/A1UB/wgAA/AB/wMFAf8DAAH/A7YB/wQAA1IB/wMA
+        Af8DSQH/CAADagH/A7IB/xQAAdkB6gHZAf8BGgGLARoB/wEAAW0BAAH/AQABbQEAAf8BAAFtAQAB/wEA
+        AW0BAAH/AQABbQEAAf8BAAFtAQAB/wFGAaIBRgH/EAABnAHiAaAB/wG1Ad8BvgH/AdAB2wHZAf8BzgHa
+        AdgB/wHKAdYB1AH/Ad4B6wHoAf8B8QH+AfwB/wH7Av4B/wEoAVUB8wH/AQABHAHGAf8BAAEXAc0B/wG3
+        AbkB3QX/A/4B/wGTAeABnAH/AbwB4wG9Af8IAAOVAf8DpAH/A6wB/wOsAf8DogH/A40B/wNxAf8DgAH/
+        A2wB/wNhAf8DVwH/A00B/wNNAf8DhQH/CAADhQH/AwAB/wMnAf8EAAPiAf8DAAH/AwAB/wMiAf8D+wH/
+        BAAD1gH/A0UB/xQAAVgBrAFYAf8BAAFtAQAB/wEAAW0BAAH/AQABbQEAAf8BGgGLARoB/wEaAYsBGgH/
         AYUBvgGFAf8B2QHqAdkB/xQAAZ8B4wGiAf8BswHeAb0B/wHNAdoB1wH/AcwB2QHXAf8ByQHUAdMB/wHS
-        Ad4B3QH/AfEB/gH8Af8B+QL+Af8BhAGsAfoB/wEYAUgB4AH/AToBVgHjAf8B+AH7AfoB/wH7Af4B/QH/
-        AfoB/gH8Af8BkwHhAZwB/wG7AeQBvAH/CAADsQH/A5wB/wOhAf8DkwH/A4gB/wOYAf8DWwH/A4gB/wNl
-        Af8DWwH/A1YB/wNQAf8DTgH/CAAD9AH/Aw0B/wMAAf8DqAH/BAADZwH/AwAB/wM9Af8DgQH/A5sB/wgA
-        AzkB/wPlAf8QAAE0AZcBNAH/AQABcAEAAf8BAAFwAQAB/wGUAcYBlAH/AWwBtQFsAf8BNAGXATQB/wgA
+        Ad4B3QH/AfEB/gH8Af8B+QL+Af8BhAGsAfoB/wEVAUUB4AH/ATcBUwHjAf8B+AH7AfoB/wH7Af4B/QH/
+        AfoB/gH8Af8BkwHhAZwB/wG7AeQBvAH/CAADsQH/A5wB/wOhAf8DkwH/A4gB/wOYAf8DWAH/A4gB/wNi
+        Af8DWAH/A1MB/wNNAf8DSwH/CAAD9AH/AwoB/wMAAf8DqAH/BAADZAH/AwAB/wM6Af8DgQH/A5sB/wgA
+        AzYB/wPlAf8QAAExAZcBMQH/AQABbQEAAf8BAAFtAQAB/wGUAcYBlAH/AWkBtQFpAf8BMQGXATEB/wgA
         AdkB6gHZAf8QAAGfAeMBowH/AcAB7gHKAf8B4wHyAe8B/wHSAeAB3QH/Ac8B3gHbAf8B0wHhAd0B/wHV
         AeEB3gH/AdQB4AHdAf8B0AHdAdoB/wHRAd4B2wH/Ac4B3AHYAf8BzQHcAdQB/wHLAd8B1QH/AdkB9AHn
-        Af8BjwHgAZgB/wG8AeQBvQH/DAADygH/A5gB/wOGAf8DjgH/A4EB/wNHAf8DcwH/A2kB/wNdAf8DUwH/
-        A1oB/wwAA5AB/wMAAf8DEQH/BAAD6AH/AwIB/wMAAf8DuAH/A+4B/wMkAf8D8wH/BAADiwH/A2wB/xAA
-        AUkBogFJAf8BAAFwAQAB/wE0AZcBNAH/BAABhQG+AYUB/wE0AZcBNAH/CAABNAGXATQB/wGFAb4BhQH/
+        Af8BjwHgAZgB/wG8AeQBvQH/DAADygH/A5gB/wOGAf8DjgH/A4EB/wNEAf8DcAH/A2YB/wNaAf8DUAH/
+        A1cB/wwAA5AB/wMAAf8DDgH/BAAD6AH/AwAB/wMAAf8DuAH/A+4B/wMhAf8D8wH/BAADiwH/A2kB/xAA
+        AUYBogFGAf8BAAFtAQAB/wExAZcBMQH/BAABhQG+AYUB/wExAZcBMQH/CAABMQGXATEB/wGFAb4BhQH/
         DAABnQHhAaEB/wG+Ae0ByAH/AeoB/AH4Af8B1wHnAeIB/wHJAdkB0wH/AcgB2AHTAf8ByQHYAdMB/wHT
         AeIB3QH/AckB2AHUAf8BwAHTAcwB/wHEAdQBzgH/AcIB1AHKAf8B3AH1AekB/wHgAfwB7wH/AYsB3gGX
-        Af8BugHiAbsB/xgAA5MB/wNiAf8DTgH/A9MB/wPJAf8D2QH/EAADZgH/AwMB/wMAAf8DBQH/A8UB/wMk
-        Af8DAAH/AwAB/wNBAf8DTAH/AwQB/wMmAf8DxAH/AxcB/wMAAf8DWwH/DAABvwHdAb8B/wEAAXABAAH/
-        AR0BiwEdAf8BzAHkAcwB/wGFAb4BhQH/ATQBlwE0Af8EAAGUAcYBlAH/AQABcAEAAf8BhQG+AYUB/wwA
+        Af8BugHiAbsB/xgAA5MB/wNfAf8DSwH/A9MB/wPJAf8D2QH/EAADYwH/AwAB/wMAAf8DAgH/A8UB/wMh
+        Af8DAAH/AwAB/wM+Af8DSQH/AwEB/wMjAf8DxAH/AxQB/wMAAf8DWAH/DAABvwHdAb8B/wEAAW0BAAH/
+        ARoBiwEaAf8BzAHkAcwB/wGFAb4BhQH/ATEBlwExAf8EAAGUAcYBlAH/AQABbQEAAf8BhQG+AYUB/wwA
         AaAB4wGjAf8BnQHkAaIB/wG0AesBuwH/AaUB3QGrAf8BnwHWAaQB/wGeAdUBogH/AaIB2wGnAf8BowHa
-        AagB/wGgAdoBpQH/AZsB1wGiAf8BnAHaAaEB/wGcAdoBoQH/AaIB5AGpAf8BnQHjAaQB/wFsAdcBdAH/
-        AbcB4QG4Af8IAAPAAf8DjgH/A6IB/wOQAf8DkAH/A9EB/wPZAf9sAAGxAdUBsQH/ATQBlwE0Af8BHQGL
-        AR0B/wEdAYsBHQH/AR0BiwEdAf8BHQGLAR0B/wEdAYsBHQH/AUkBogFJAf8BvwHdAb8B/wwAAcgB6wHI
+        AagB/wGgAdoBpQH/AZsB1wGiAf8BnAHaAaEB/wGcAdoBoQH/AaIB5AGpAf8BnQHjAaQB/wFpAdcBcQH/
+        AbcB4QG4Af8IAAPAAf8DjgH/A6IB/wOQAf8DkAH/A9EB/wPZAf9sAAGxAdUBsQH/ATEBlwExAf8BGgGL
+        ARoB/wEaAYsBGgH/ARoBiwEaAf8BGgGLARoB/wEaAYsBGgH/AUYBogFGAf8BvwHdAb8B/wwAAcgB6wHI
         Af8BtAHmAbMB/wG1AeYBtAH/AbYB5wG2Af8BtQHnAbYB/wG1AeYBtAH/AbcB5wG4Af8BtwHmAbUB/wG1
         AeUBtAH/AbYB5QG1Af8BtwHmAbYB/wG1AeMBtAH/AbIB4wGyAf8BtAHjAbQB/wGyAeEBsQH/AdkB7gHZ
-        Af8EAANlAf8DYgH/A3QB/wNxAf8DjgH/DAAD2QH/cAAB5gHxAeYB/wFsAbUBbAH/ATQBlwE0Af8B2QHq
-        AdkB/2AAA+UB/wPqAf8UAAPwAf90AAGFAb4BhQH/ATQBlwE0Af9wAAMgAS4DTgGZA1MBqgM8AWgDGAEh
-        IAADGAEhA1QBqwNFAX8YAAM5AV8DVgG2AykBPxQAAY8BygHkAf8BZwG5AdkB/wFhAbYB2AH/AWkBuQHZ
-        Af8BlgHNAeUB/wGYAdAB6AH/AWkBugHZAf8BYQG2AdgB/wFnAbkB2QH/AY0BxwHgAf8MAALsAfMB/0gA
-        AycBOgNVAbEBNQFIAWIB9gGWAa8B1QH/AZgBpQHMAf8BSQFQAYwB/QFIAUoBVAHuA1cBwgNEAXoDIQEx
-        AwEBAhAAA0ABcQErAW0B4wH/ARsBQAGWAf0DVAGuAxABFgwAA0wBkwEnAV8BmgH7ASIBTgGpAf8DPAFn
-        EAABxwHqAfoB/wE0AbUB6QH/ATIBtgHsAf8BMgG2AewB/wEyAbYB7AH/AS8BrQHhAf8BLgGrAd4B/wEy
-        AbYB7AH/ATIBtgHsAf8BMgG2AewB/wEzAbMB5wH/AcUB6QH4Af8IAALpAfMB/wKNAccB/zwAAxEBFwNV
-        AbQBKAFVAVwB+AEAAXUBLAH/AV0BrQFzAf8B8wf/AfwD/wHVAdsB8gH/AZoBqQHPAf8BVwFjAYQB/gE+
-        AUABVQH0AlcBWwHQAy8BSgwAAiEBIgExAVQBdgHEAfsBjQHvAv8BHQFbAb8B/wJXAVsB2gMnAToDFgEf
-        A1kBzAE7AZAB1gH/AZQB8AL/AUYBTAFwAfMDFgEfFAABEAEhASkB/wESAUkBYQH/ASsBbQGSAf8BMAFk
-        AYMB/wEeASoBMAH/AR4BKgEvAf8BMAFkAYMB/wEpAWsBkAH/ARIBSQFhAf8BDgEgAScB/xAAAtMB7AH/
-        AlcByAH/AtQB/gH/NAADPwFtAXwBkQHJAf4BRwHVAYkB/wEAAakBDAH/AVABmwFhAf8B1QH0Av8B8gH9
-        Af4B/wHdAfMB+QH/AesD/wHvA/8B0QH7Av8BogHiAfsB/wE+AWQBtwH/A0wBkxAAAVkBWgFfAdMBjwHp
-        Af4B/wGIAfEC/wEwAZEB3wH/ATcBQAFZAfIBPQFMAW4B8QFHAbUB8wH/AZcB/QL/AW0BvQHuAf8DWQHD
-        EAADcgH/A4IB/wMAAf8DhwH/A/4R/wP9Af8DcgH/AwAB/wNtAf8DggH/CAAC+AH+Af8CMgHXAf8CTgHY
-        Af8CmgL/AuUC/ywAA0ABcQF/AaUB0gH+AUcB0AGGAf8BAAGfASEB/wFHAY8BaAH/AcsB7wL/AdsB8QH4
-        Af8BoQGgAYwB/wHAAdIBxgH/AcgB9gL/AZgBzQH0Af8BiQHSAf4B/wFCAYIBygH/A0wBkxAAAksBTAGP
-        AVABswHxAf8BZQHiAv8BYwHiAv8BOgG0AfgB/wFFAcUB/AH/AWYB4QL/AWQB4wL/AUIBfwG0Af4DQQFz
-        EwAB/wMAAf8DCgH/A/wZ/wP3Af8DAQH/AwAB/wMAAf8MAAKPAfoB/wJXAeMB/wJPAdoB/wKCAv8CwQL/
-        KAADQAFwAXsBlwHNAf4BPgHLAYoB/wEAAbEBDQH/ATgBkQFLAf8BvwHkAv8B0wHuAfkB/wHMAbIBiwH/
-        AcwBywGpAf8BmgHdAv8BmwGqAa4B/wGuAboBtAH/ASIBZAHJAf8DTAGTEAADIwEzAUEBagGwAfkBOAHY
-        Av8BMgHKAv8BOQHVAv8BNwHRAv8BMAHLAv8BPgHRAf4B/wFHAU0BaQHyAxIBGRAAAxcB/wMAAf8DLiH/
-        Ax8B/wMAAf8DLwH/DAACzgH8Af8CVgH0Af8CXAHmAf8CSAHUAf8CgAL/AqcC/yQAA0ACcAGTAdEB/gFB
-        AbwBgAH/ARIBkAEYAf8BUwGZAZIB/wGvAeIC/wHWAfEB+gH/AcEBjgFIAf8BuwGwAYsB/wGAAdMC/wGl
-        AZ4BgwH/AcoBpQFOAf8BFgFeAccB/wNNAZYQAANAAXEBIwFfAakB+wESAdEC/wEIAcQC/wEKAcQC/wEK
-        AcQC/wEFAccC/wEcAccB/QH/ASIBPAFtAfoDSAGEAwEBAgwAA1UB/wMAAf8DLSH/Ax4B/wMAAf8DbgH/
-        EAAChQHzAf8CgAL/AmUB7gH/AkIB0AH/AncB/gH/ApYC/wLuAv8cAAM8AWcBYAGOAdUB/gFuAcYB6wH/
-        AW8BvAHmAf8BgwHIAfwB/wGUAdYC/wGLAdkB/AH/AVQBpgHQAf8BTQGmAeAB/wFOAbkC/wFQAY4BwAH/
-        AVwBiAGhAf8BEQFbAcUB/wNOAZQDAQECCAACUAFSAaQBJAFkAbkB/QEkAdAB+QH/ASUB1AL/AScB0QL/
-        ASgB0QL/ASgB0QL/AScB0QL/ASUB1wL/ASIBwAHuAf8BEwFLAX8B/gNWAbsDFAEbCAADtAH/AwAB/wMN
-        Hf8D+wH/AwIB/wMAAf8DzQH/FAACmQL/AoAC/wJsAfUB/wJCAdIB/wJ2Af0B/wKKAv8C4QL/FAADMgFQ
-        A1cBvwFOAZYB2gH/AWgBxAL/AWYBvQL/AXIByQL/AVwBnwH4Af8BHgE8AdwB/wEkAVMB5AH/ARkBUQHj
-        Af8BFwFWAeMB/wERAWEB8gH/AQYBZgH8Af8BCAFGAcgB/wI/AU4B7wNUAa8CIQEiATEBVgFXAV4B2QE0
-        AakB6gH/AV8B9gL/AWwB6wL/AW4B5gL/AWwB5QL/AWkB5AL/AWkB5AL/AW0B5QL/AW0B5wL/AWkB8AL/
-        AVYB7AL/ASQBgwG1Af8CUQFYAeMDNQFXCAADHgH/AwAB/wPNGf8DvwH/AwAB/wM1Af8cAAKUAv8CgAL/
-        AnEB+QH/AkQB1wH/AnQB/AH/AoQC/wLXAv8QAAJKAWcB6wIAAaEB/wE9AYYB6AH/AVcBuwL/AVoBtwL/
-        AV8BuwH+Af8BMgFLAe0B/wEXARkB1gH/ARwBIQHTAf8BGwEfAdIB/wEbAR8B0gH/ASEBJwHVAf8BJQEu
-        AdkB/wElATIB2QH/ASgBLQHOAf8CVgFbAdwBTwFVAXkB7AFhAdsC/wGKA/8BmQH1Av8BlgHzAf4B/wGT
-        AfUC/wGZAfIC/wGnAfAC/wGkAe8C/wGUAfIC/wGVAfQC/wGXAfIB/gH/AZcB+AL/AYMD/wFRAbIB3QH/
-        AVABUQFYAecIAAO6Af8DAAH/A0EB/wH7AvwB/wHPAe0B+gH/AaQB3QH2Af8BqAHfAfcB/wHbAfIB+wH/
-        A/kB/wM1Af8DBAH/A84B/yAAApUC/wKAAv8CdQH8Af8CSAHbAf8CcwH7Af8CggL/AtYC/wwAA04BlAEJ
-        AQMBvQH/ASYBXQHoAf8BSwG4Av8BTgG2Av8BPgGAAfYB/wEeAScB4gH/AR4BMQHdAf8BHQEvAd4B/wEd
-        ATAB3wH/ARsBLgHeAf8BGwEsAd4B/wEaASsB3gH/ARwBKgHnAf8BJQEmAYQB+QMrAUMBWAFZAVwBxwFY
-        AWEBeAHmAlsBcQHhAVoBWwFuAeECVwFpAd8BSwFZAY4B8gGTAdsB9AH/AdIB/QL/AckB/gL/AWsBsgHa
-        Af8BTQFUAXMB7gFaAV0BawHgAVoBWwFpAeEBWAFdAWgB4gFZAV4BcwHlA1EBogwAA3YB/wMAAf8BMgGL
-        Aa8B/wEoAaUB2AH/ASYBoQHTAf8BJgGiAdQB/wEqAagB2wH/ATABbgGRAf8DAAH/A7kB/ygAApoC/wKA
-        Av8CdwH+Af8CTQHhAf8CcgH7Af8ChwL/AuUC/wgAAwQBBgJWAWEB3AEOARsBuQH/ATUBmQH1Af8BPAGj
-        Av8BJgE5AeIB/wEfASwB2AH/AR8BLwHaAf8BHgEuAdsB/wEdASwB2gH/AR0BLAHbAf8BHAEsAdkB/wEe
-        AS4B5AH/ARUBHgG8Af8DTgGZGAACMAExAU0BcAGKAc0B/gHvA/8B2gH8Av8BRQFOAX4B+gMkATUgAAPO
-        Af8DAAH/ASYBcQGZAf8BKgGRAbsB/wEzAbQB6QH/ATEBrgHhAf8BMwGaAcMB/wEWAVABaQH/AwAB/wPz
-        Af8sAAKpAv8CgAL/AoAC/wJUAeUB/wKFAfoB/wKuAv8C+AL/CAADLQFGASEBGwGBAfsBEAE9Ab0B/wEr
-        AWIB8AH/ASQBKQHWAf8BIgEuAdMB/wEiAS4B1QH/ASABLgHZAf8BIAErAdQB/wEfASsB1AH/AR8BLAHY
-        Af8BHwEpAdwB/wFUAVYBXwHgAwcBChgAAwoBDgFVAVwBeQHqAfQD/wHOAeUB/AH/AlcBXAHcAwQBBicA
-        Af8DOQH/Ay8B/wNRAf8CWQFaAf8DUQH/Aw4B/wMoAf80AALGAv8ChQL/AoAC/wJcAesB/wKDAfoB/wK+
-        Av8MAAJSAVQBpgIUAaAB/wEvATwB5gH/AScBNwHkAf8BJAEzAeAB/wEkATYB6AH/ASEBNAHoAf8BIQEw
-        AeEB/wEfATAB4wH/ASEBMgHsAf8BHQEhAXwB/AMtAUUgAAJVAVYBtAHcAeoB/AH/AakBuwHiAf8DUAGd
-        KAADMgH/AwEB/wOkAf8DGgH/AzUB/wOSAf8DAAH/A5AB/zgAAu8C/wKsAv8CgQL/Am4B9wH/ApEC/wLk
-        Av8IAAMMARACVAFnAeUBKQEtAZ8B/gElASsBkAH8ASQBKwGMAfwBIQEjAZQB+wEhASMBlAH7ASIBKAGK
-        AfoCIQGUAfsBIQEjAYcB+gNOAZckAAM6AWIBrAGyAe4B/wF1AXsBoQH+Ay8BSigAA8sB/wMFAf8DAAH/
-        AwAB/wMAAf8DAAH/AzMB/wP5Af9AAALqAv8CsAL/AoQC/wKiAv9YAAMMARACWgFtAeECWgFeAc4DBAEG
-        LAAD2wH/A2AB/wMcAf8DKgH/A4IB/wP1Af9MAAL1Av8C1gL/DAADFAEbA1EBoQNMAZMDJAE1AwMBBGgA
-        AxABFgFXAVkBWwHQA1gBxgMJAQwEAAMZASMDKAE8Ay0BRgMtAUYDKQE+Ax8BLAMGAQg0AAMPARQDUQGi
-        A1YBvgMxAU8QAANZAckBRQGtAT8B/wFBAYQBOQH/ATUBSgE3AfUBWQFaAVkBzgNFAX0DHwEsGAABZQFY
-        AVQB3QGiAVwBIQH7AaIBTQEfAfoBowFNAR8B+gGjAU0BHgH6AaMBTQEdAfoBowFNAR0B+gGjAU0BHAH6
-        AaMBTQEaAfoBpAFNARgB+gGkAU0BGAH6AaQBTQEYAfoBpAFNARgB+gGkAUwBGAH6AaIBSAEQAfsBaQFb
-        AVIB4QQAAxIBGQFYAVkBXAHUAQIBpAHiAf8BDwFbAZgB/wNZAcMDVwHCAWcBSQFDAfEBewE+ATIB+AGB
-        AU0BJwH6AYABTQEoAfoBegE+ATIB+AFfAUEBOQHzAVgCVQHZAzwBZzAAA1YBuQERAUQBlgH/ARUBQgGS
-        Af8BQQFFAVEB8QM2AVkIAANKAYwBKgGQAUoB/wFfAbEBpwH/Ad8B8wHPAf8BtQHhAakB/wFkAasBWAH/
-        ATABdQEyAf4BQAFTAUMB8QNXAb8DLwFKEAABjgFfAUMB8wHuAaMBYwH/AewBsAGHAf8B7AGtAYEB/wHr
-        AaoBdgH/AeoBqQFzAf8B6gGnAXEB/wHqAaQBbgH/AekBogFrAf8B6QGgAWgB/wHpAZ4BZAH/AegBnAFh
-        Af8B5wGaAV8B/wHkAZsBYwH/Ae0BiwE/Af8BkQFMATIB8wQAAisBLAFDAQgBXAGuAf0BAAH3Av8BFwHB
-        AeoB/wFvATwBQgH/AfIBkQE7Av8BtQFcAv8BvgFkAf8B7QGtAWwB/wH0AbQBZQL/Ab0BYwL/AbMBWwH/
-        AegBiAFAAf8BaQEpASMB+QM5AV8oAAM/AW0BNgFSAaEB/QFGAZgB3wH/AQ0BZQHeAf8BDQFOAb4B/wNW
-        Ab4EAAMzAVIBLQF4AUIB+gGLAXEBuwH/Ae0BywH7Av8B+wHtAv8B+QH2Af8B+AH3AecB/wHaAeIBsgH/
-        AZ4BxgFtAf8BRwGcAT8B/wE/AUsBPwHvAykBPgwAAYYBWAFFAfEB7AHEAawN/wH2AfkC/wH3AfsC/wH9
-        A/8B+wH+Av8B9wH6Av8B9AH2Af0B/wHwAfIB+QH/Ae8B7QH1Af8B5gHuAf0B/wHmAbwBqAH/AYsBUwE8
-        AfEEAAMBAQIBSAFUAWgB6QEAAdsB/gH/ARgBxAHnAf8BngGFAXIC/wHMAXAC/wHNAYMB/wHbAbABlgH/
-        ASMBIAHWAf8BQwE1AasB/wHzAcIBhgL/AcgBhgL/AdIBhAH/Ad0BdgFBAf8DVgG7JAADDQESAVMBVwFl
-        AeUBVAGiAeMB/wG2Ad8B/QH/Ab4B3wL/AUsBcwGqAf4DRQF/Aw8BFAFWAWEBUgHmATAByQFhAf8BsQHp
-        AecC/wHvAeQB/wHxAeUB2AH/AfMB4wHUAf8B9gHhAc0C/wHjAcgB/wH7AdEBrQH/AdEBvAGBAf8BWQGT
-        AUIB/wNYAcsDBAEGCAABhgFYAUUB8QH1Ac0BsgH/AccByAHMAf8BhgGAAYEB/wG7ArcF/wHfAt0B/wGS
-        AowB/wGPAYcBiAH/AZEBiQGKAf8BjwKIAf8BjgGGAYcB/wGGAnYB/wKvAbYB/wHvAcIBpgH/AYYBUwE8
-        AfEEAAM2AVkBEAFfAZYB+wEAAeMC/wEXAb8B4gH/AZUBhAGGAv8B1AGXAv8B2QGiAf8B2AG8AbAB/wEk
-        ASgB6AH/ATsBNwHUAf8B8AHSAagB/wH4AckBigL/AcUBhgH/AfEBpwFqAf8BWwFaAVkByCQAA0YBgQEx
-        AW4BvQH/AZcB0AH9Af8B3QH8Av8BtAG+Ac8B/wNUAasEAANYAcYBVgGeAV8B/wHQAdoBqgH/Af0B8QHh
-        Af8B8QHkAdYB/wHwAeQB1QH/AfEB4AHMAf8B9AHXAbgB/wHyAc8BqQH/AdUBswGKAf8B9wHHAZwB/wHJ
-        AdUBmwH/ATYBagErAf4DSgGLCAABhgFYAUcB8QHyAcoBrwH/AeYB6QHsAf8ByQHIAckB/wHgAt8B/wP+
-        Af8B7wLtAf8BzgLMAf8BzALJAf8BzALHAf8BygLFAf8ByQLDAf8BxAK9Af8B0gHTAdoB/wHuAb8BowH/
-        AYYBUwE8AfEEAAM0AVQBCAFeAakB/QEAAeUC/wEWAb8B4QH/AZMBhAGPAv8B4QG1Av8B6gHHAf8B5gHW
-        AcwB/wJDAeAB/wFmAV4B1QH/AfwB7AHFAf8B3gHUAZ8B/wH9AdUBpQH/Ae8BqAGCAf8DVgG2IAADEgEZ
-        AU0BVgFkAewBcgG+AfcB/wHHAfMC/wGVAbkB2AH/A1YBuwgAAVYBZQFWAeUBTAGDAZwB/wHwAesB+wL/
-        Af4B+wH/AfsB7AHkAf8B8wHkAdQB/wHyAdsBwgH/AfcB2AG3Af8B3AHAAZ0B/wHkAb0BkQH/AfoBzgGh
-        Af8B/gHoAcwB/wGZAcwBiwH/ATkBRAExAfQDLQFFBAABhQFXAUcB8QHvAcgBrQ3/AfwC+h3/AfgB+QL/
-        AesBvgGiAf8BhgFTATwB8QQAAy0BRQEIAVsBkgH8AQAB4QL/ARYBwAHhAf8BmAGPAaIC/wHpAcwC/wH7
-        AewB/wLyAe0B/wFJAUcB2QH/AWwBaAHVA/8B8AL/AfcB7QL/AesB0wH/AcMBfwFtAf4DPAFoIAADVgG+
-        AUoBmAHbAf8BrQHnAv8BagGoAdcB/wNZAcMDAQECCAADEAEWATwBPQE8AWgBWQFfAVkBzwGBAZ8BggH7
-        AdEB6QHRAf8B9gH0AeYC/wHpAdIB/wHiAccBqwH/AdsBvQGZAf8B9wHRAaYB/wHzAdIBrQH/Af0B4AHJ
-        Af8B8wH6AecB/wFfAakBWgH/AVcBWQFXAdMDDwEUAYMBWAFJAfEB9AHOAbQB/wLTAdYB/wGgApwB/wHJ
-        AscB/wP+Af8B6ALlAf8BqgKlAf8BqAKhAf8BqAKiAf8BpwKgAf8BpQKfAf8BnwKWAf8BwQHDAckB/wH0
-        AcgBrAH/AYYBUwE9AfEEAANRAaABAAGTAdMB/wEAAesC/wEWAb0B4AH/AY0BYAFyAv8B3wHKAv8B8QHe
-        Af8B4QHNAbwB/wEpAS0BuwH/AUwBSQGwAf8B+gHYAa8C/wHqAdkC/wHVAckB/wFdAlkB0gMGAQgEAAMU
-        ARsDLgFIAwkBDAwAA04BmAEqAW8BqQH+AZsB4QL/AXQBtQHjAf8DWQHMAwYBCBgAAxgBIQNLAY4BXgFf
-        AVoB2AF+AZ4BcgH6AdgBygGoAf8B+AHUAbEB/wHyAdMBsQH/AfMB3AHCAf8B8QHeAcgC/wH0Ae8B/wHX
-        AfQB2AH/ATcBeAExAf4DTgGXAYMBVwFMAfEB8wHOAbQB/wHeAeEB5QH/AbgBtgG3Af8B2ALWBf8B7gLt
-        Af8BwAK+Af8BvgK7Af8BvwK8Af8BvgK5Af8BvQK5Af8BtwKyAf8BzwHTAdkB/wHzAckBrQH/AYUBUwE9
-        AfEDEgEZAUIBTgFlAe0BAAHJAf0B/wEAAeIB/QH/AR0ByQHqAf8BOwEnAUEB+QGmAU8BPAH8AbMCogH/
-        AVwBnQHAAf8BQwGWAcYB/wE1AYwBvgH/AVMBiAGfAf8BwwGOAXUB/wFuAV0BWAHlAxsBJgQAAyABLgNY
-        AeMCQAE/AfwDTwGcCAADTgGXASQBZgGgAf4BdgHNAv8BnwHbAf4B/wFIAU8BYgHvAx0BKigAASsBLAEr
-        AUMBagF8AWMB8AH+AfAB2AH/AfUB2wHEAf8B8gHhAdAB/wHzAeYB2AL/AfAB7QH/Aa0B2gGtAf8BLQGk
-        ATIB/wNRAacBggFWAU0B8QHwAcwBsw7/Av4h/wHwAccBrAH/AYMBUwE9AfEDUgGoAQABZAHCAf8BAAHi
-        Av8BAAHZAfUB/wEhAd0B9wH/ASEBlwHHAf8BNQFIAXcB/gFjAZ4BxwH/AYgB1wH9Af8BjQHUAfUB/wF2
-        AcsB7gH/AUsBsQHiAf8BLQFnAZ8B/wNSAagIAANZAdcB1gHPAc0B/wG4AbQBsgH/Az4B+AM6AWEDTgGX
-        AR8BZwGlAf4BYgHCAv8BqAHmAv8BTQF8AZ0B/gNCAXYwAAM6AWIBpAG9AZoB/AH/AfgB8AH/AfIB4wHU
-        Av8B7wHrAf8BywHiAccB/wE4AboBSAH/AVMBWAFTAeMDFQEdAYABVgFPAfEB9AHQAbgB/wLdAd4B/wG2
-        ArIB/wHWAtMF/wHuAu0B/wG+ArsB/wG9ArkB/wG/AroB/wG+ArkB/wG9ArgB/wG5ArIB/wHUAdYB2gH/
-        AfYBzAGwAf8BgwFTAT0B8QFMAVQBZAHkAQABvQL/AQAB5QL/AQAB6wH4Af8BNAH7Af0B/wGGA/8BUgGb
-        AcwB/wGEAbkB4gH/AaUB4wL/AZwB2gH+Af8BlgHXAfoB/wGOAdIB8wH/AVQBtwHpAf8BSgFVAWAB6wMU
-        ARsEAAFmAmQB7AHXAdIB0wH/AcsByQHKAf8BjgGPAY4B/wFEAUEBOAH7AW4BbwF1Af4BSwGVAckB/wGA
-        AdMC/wFuAbIB4AH/A1kBxDgAAVUBVgFVAbEB5AH0AeUC/wH0AfEB/wHpAegB2wH/AV4B1gFyAf8BOwF3
-        AT8B+QMwAU0EAAGAAVYBUQHxAfYB0wG8Af8B0wHXAdsB/wGgAZ8BoAH/A8kF/wPqAf8BqwKqAf8BqQGn
-        AagB/wGrAakBqgH/AaoCqQH/AasCqAH/AaMBoQGiAf8ByQHPAdUB/wH5AdEBtAH/AYMBUwFAAfEBMgFM
-        AYAB8wEAAcUC/wEAAeIC/wEAAf0C/wE0A/8BlAP/AW4BsAHQAf8BhQGmAc4B/wHCAe0C/wG3AeUC/wGm
-        Ad4C/wGYAdgB+gH/AYUB0wH9Af8BMwFaAXUB9gMdASoEAAMnAToDWAHLA4gB/QKsAasB/wGqAakBpwH/
-        Ab4BtwGxAf8BtgGwAaoB/wFqAZ0BvQH/AU0BVAFeAeoDGAEhOAADDwEUAWQBdAFkAecB8wH6AfUB/wGQ
-        AeUBnwH/ATgBtAFGAf8DSAGHCAABgAFVAVMB8QHtAccBrgH/AfgB8QHuAf8B+AHwAe0B/wH3AfEB7gH/
-        AfcB8gHvAf8B+AHxAe8B/wH4AfEB7gH/AfgB8QHuAf8B+AHxAe8B/wH4AfEB7wH/AfgB8QHvAf8B9wHx
-        Ae8B/wH3AfMB8QH/AfEBxgGqAf8BggFSAUAB8QEQAVEBlwH7AQABxwL/AQAB4gL/AQcB+wL/ATUD/wGP
-        A/8BbgGzAdQB/wGeAbEB0AH/AecB+wL/AdYB7wL/AboB5AL/AaIB4AL/AYwB2QL/AVYBWwFhAeEDBgEI
-        DAADUwGtAaQBowGgAf8BzAHKAccB/wHFAcEBvwH/Ac0BxgHDAf8BcgFqAWgB/wNQAaMIAAMDAQQDDwEU
-        AwkBDCwAAzUBVwFtAb0BiAH9AVsB5gGCAf8DWAHGDAABgAFhAVMB8QHsAZ0BWAH/AeQBjQFKAf8B5AGP
-        AU0B/wHkAY0BSwH/AeQBjAFKAf8B5AGMAUkB/wHkAYwBSAH/AeQBiwFHAf8B5AGKAUYB/wHkAYkBRAH/
-        AeQBiQFDAf8B5AGIAUMB/wHjAYgBRAH/AewBiwE5Af8BgwFTAUMB8QFCAVIBcgHtAQABygL/AQABxQHw
-        Af8BIgFLAWUB+wEwAYkBrwH+AXcD/wFFAYYBtwH/AaABsQHOBf8B8QP/AcwB9AL/Aa4B7gL/AVsBiQG0
-        Af4DQAFwEAADHQEqA2QB8QHRAc8BzQH/AeYB4wHhAf8BswGxAbAB/wFnAWYBZAH/AkUBRAH5A1QB5ANa
-        AdsDVwHoA1gB5QMuAUgwAAFSAVMBUgGoAVcBXQFXAd8DGAEhDAABhAFkAV8B8wH/AeEBoQL/AccBggL/
-        AcQBdgL/AcEBcAL/Ab4BagL/AboBZAL/AbYBXgL/AbIBWAL/Aa4BUQL/AaoBSgL/AaYBRQL/AaMBPwL/
-        AZ4BNwL/AakBPQH/AYQBWQFHAfICWQFcAckBAAHBAf0B/wEAAc8B9gH/AQgBPQFYAf0BDAGJAbUB/wFl
-        A/8BPQFHAWoB+QNWAcEBiAGQAagB+QG9AdUB4QH/AZ8ByQHdAf8BTgFwAYUB9gNLAY8YAAMtAUYDXAHn
-        AcIBwAG9Af8B1gHTAdEB/wGsAqkB/wGoAacBpgH/Aa8BrQGsAf8BuwG5AbgB/wKKAYkB/gNWAbgDCQEM
-        SAABXgJZAdcBkQFcAVMB+wGDAU4BTQH6AYMCTQH6AYMCTQH6AYMBTQFKAfoBgwFNAUcB+gGDAU0BQwH6
-        AYMBTQE/AfoBgwFNATwB+gGDAU0BMQH6AYMBTQEuAfoBgwFMASsB+gGDAUsBKQH6AZEBRAElAfsBYAFV
-        AVQB3gJGAUcBgQEZAU0BlQH6ARkBaAGeAfoBHQFlAZAB+QEkAV0BlQH4ATcBZAGLAfcDVAGvBAADKQE/
-        AkgBSQGHAkUBRgF/ASECIgExIAADEgEZA04BmANlAeUBigKJAfkBiAGEAYMB/AF3AnUB9gNeAdkDQAFx
-        EAADOgFhA1gBxwNZAcwDWgHKA1oBygNaAcoDWgHKA1oBygNaAcoDWgHKA1oBygNaAcoDWgHKA1oBzgNZ
-        AcMDNAFVRAADVwHCA0QBezgAA2MB4gOCAfEDeQHuA3kB7gN5Ae4DdwHuA3YB7gN2Ae4DdgHuA3YB7gN2
-        Ae4DdgHuA3kB8ANlAeUEAANlAe4D4gH/A90B/wPaAf8C2wHaAf8D2QH/A9gB/wPYAf8D1wH/A9YB/wPV
-        Af8D1AH/A9MB/wPgAf8DmQH/A1cBvQwAA0gBhgFQAVUBMgH6A0MBdywAAVgCWQHUAQ4BKgE/Af8DSQGJ
-        AxMBGjAAAaICowX/AfYC8AH/AfYC7wH/AfYC7wH/AfQC7wH/AfQC7QH/AfQC7QH/AfQC7QH/AfIC6wH/
-        AfMC6wH/AfIC6AL/AvsB/wGiAqEB/wQAA40B9wT/AvQB8wH/Af0B+AH1Av8B9gHzAf8B/QH0AfEB/wH8
-        AfMB8AH/AfsB8AHtAf8B+QHwAe0B/wH4Ae8B7AH/AfcB7QHqAf8B8gHtAeoB/wHnAeYB5wH/A/UB/wPG
-        Af8DWQHDCAADDgETAl8BWgHgATcBxAFSAf8BSAFqAUEB+QM4AV4oAAMpAT8BOwFSAWkB9wFoAZoBrgH/
-        AVkCWwHQA0IBdQMGAQgoAAOfAf0B+gLzAf8B6gLiAf8B6QLhAf8B6QLhAf8B6ALfAf8B5wLeAf8B5gLe
-        Af8B5gLdAf8B5ALbAf8B5ALaAf8B4gLXAf8B9QLrAf8BngKcAf0EAAOFAfYB/AL7Af8B7gHsAeoB/wG7
-        AcwB2gH/AZMBswHLAf8BmAG1AcsB/wGWAbUBywH/AZUBtAHKAf8BlQGzAckB/wGUAbMByQH/AY4BrgHH
-        Af8BqQG6AcgB/wHeAtwB/wHuAu0B/wO9Af8DVgHBCAADQAFxAUIBmgE9Af8BUAHpAZIB/wFEAdIBbAH/
-        AUwBagFEAfMDLgFHKAADUQGiAXUBxAHfAf8BmwHkAfIB/wEpAYoBrQH/A0wBkQMCAQMkAAGfAp4C/QL2
-        Af8B9QLtAf8B8wLsAf8B8wLsAf8B8gLqAf8B8QLpAf8B8QLpAf8B8ALoAf8B7wLmAf8B7wLlAf8B7QLj
-        Af8B+ALuAf8DnAH9BAADhQH2Av8B/gH/Ae0B5AHnAf8BUAGzAdgB/wEIAcsB6wH/ARYB0AHtAf8BGQHR
-        Ae4B/wEZAdQB8QH/ARoB0gHuAf8BHAHSAe4B/wETAc8B7gH/AT0BpAHMAf8B1QHPAdMB/wH2AfIB8AH/
-        A8AB/wNWAcEEAAMFAQcBVgFYAVYBvAFTAc8BcgH/AXQB6AGrAf8BZQHoAaMB/wFJAc4BbAH/AVgBZgFR
-        AesDJAE1JAADMQFOARUBdQGlAf8BlwHmAfkB/wGGAegB9QH/AT8BYwGPAf0DIgEyJAADoAH9AfsC9wH/
-        Ad4C2gH/Ad4C2QH/Ad8C2gH/Ad4C2QH/Ad0C2QH/Ad0C2QH/Ad0C2AH/AdwC1gH/AdsC1gH/AdoC1AH/
-        AfgC8QH/AZ4CnQH9BAABhwKIAfYE/wHqAeQB5gH/AVUBuwHhAf8BKAHcAv8BLQHdAv8BFQHTAf0B/wEQ
-        AdAB9wH/ARMB1AH8Af8BEwHdAv8BDAHdAv8BOwGuAdgB/wHVAc8B0wH/AfcB8wHxAf8DwQH/A1YBwQQA
-        Ay4BSAFDAYUBPAH+AYkB7gG1Af8BlgHzAcUB/wGKAesBuAH/AXEB7AGvAf8BSAHMAWoB/wFXAV4BVAHf
-        AxoBJCAAAwgBCwNTAa0BJgGhAcwB/wGdAdMB3QH/AaoB4gHwAf8DVAGrJAADqAH9AdIC0QH/ASYCJQH/
-        AhoBGQH/AR4BHQEcAf8BGgEZARoB/wEdAhwB/wEfAhwB/wMfAf8BHQIeAf8BFgEZARoB/wMiAf8BywLK
-        Af8DqAH9BAADiQH2BP8B6QHnAekB/wFkAbcB4QH/AWMB0AH+Af8BYwHVAv8BQgGpAdwB/wFHAWUBhwH/
-        ARoBnwHaAf8BAAHBAv8BAAG8Av8BOAGlAdcB/wHYAdQB1gH/AfgB9AHyAf8CwgHDAf8DVgHBAwIBAwNQ
-        AZoBZAHOAYIB/wGhAfoB0QH/AVQBzQFuAf8BcAHmAaUB/wGVAfMByAH/AXQB8gG4Af8BRwHIAWUB/wFb
-        AV4BWQHQAxQBHCAAAxIBGANWAbMBaAHGAeEB/wHwA/8BjgGaAaIB/wMzAVIDDwEUHAADqAH9AcYCyAH/
-        AQICBAH/AwAB/wMAAf8CBgEAAf8DAAH/AwAB/wMAAf8DAAH/AQUCAAH/AwAB/wG8Ar0B/wOoAf0EAAOJ
-        AfYE/wHpAegB6wH/AWcBuQHhAf8BcQHVAf4B/wFzAd0C/wFpAawBygH/AWMBUAFMAf8BOgGdAckB/wEA
-        AbgC/wEAAa8C/wE5AaIB1wH/AdoB1QHWAf8B+gH2AfQB/wHEAsUB/wNWAcEDHAEnAU4BhQE8AfcBmAH8
-        AckB/wFeAbgBcwH+AVQBYQFQAeQBQgF8AUIB9QFkAeMBmAH/AZEB+QHMAf8BdAH3AcEB/wFDAcMBXAH/
-        AVUBVwFVAbcDCgENIAADCgEOA08BpQGNAb4BzwH/AZgBxwHgAf8BNwFoAYMB9QFYAVwBXwHRAxoBJRgA
-        A6gB/QHKAc8B0AH/AQ4BFgEXAf8DAAH/ATsBPgE3Af8BvQG2AZYB/wEZASsBJwH/ASIBKAEfAf8BKQEl
-        ARoB/wIAAQEB/wFlATMBEgH/AQABAQECAf8BwgK/Af8DqAH9BAADiQH2BP8B5gHnAesB/wFtAbsB4gH/
-        AZcB5AL/AZYB6AL/AZABxwHdAf8BiwGSAZMB/wFkAbwB3gH/AR8BxQL/ARcBwAL/AT8BpgHYAf8B1wHU
-        AdcB/wH7AfcB9QH/A8YB/wNWAcEDRwGCAVIB0AFyAf8BVwHVAXcB/wFYAVoBWAHAAwABAQMtAUUBVgFk
-        AVMB4gFJAcsBZQH/AYEB+QHGAf8BcgH+AcoB/wE8AcABVQH/A1IBqQMEAQUgAAMKAQ4DVwHFAUoBlAG7
-        Af8BSAGYAbsB/wEpAS4BMwH/A1ABnwMAAQEUAAOoAf0B0QLMAf8BuAGYAWIB/wFoAWkBUwH/AbYCuAX/
-        AVECWwH/AWEBWgE/Af8BZwFmAU4B/wE6AS4BGQH/Ac4BagEpAf8BRgEeAQoB/wHJAb4BvQH/A6gB/QQA
-        A4sB9gT/AfEB8AHxAf8BgwG5AdoB/wFlAbcB3gH/AWkBuAHeAf8BaQG/AecB/wF3AcsB8wH/AVoBuwHo
-        Af8BRQGuAeAB/wE7AaoB3AH/AWIBqgHRAf8B4QHfAeAB/wH6AfcB9gH/A8gB/wNWAcEBUQFsAVEB6QE8
-        AdABWgH/AVkBWwFZAcQDDQESCAADHAEoAVQBVgFUAasBMgG0AT4B/wFmAfIBswH/AWoB/wHQAf8BNwG7
-        AUsB/wNLAY4kAAI+AT8BbAGAAXcBdAH/AZMBIAEWAf8BGwIAAf8BKgEIAQAB/wNAAXAUAAGmAqgB/QHR
-        AcwBygH/AdcBrwFwAf8B/AHhAa4B/wH2AvcB/wH7Af4C/wHkAdcBxQH/AcsBrwF0Af8BjwFyAVAB/wHM
-        AZIBRAL/AZEBNgH/AckBRAEMAf8BygG9AbsB/wGlAqgB/QQAA40B9gT/AfsB+gH5Af8B5gHqAe4B/wGf
-        AacBsQH/AaIBpwGuAf8BnwGnAa8B/wHAAcwB1wH/AbABtQG9Af8BrgGtAbMB/wGfAaEBqAH/Ad4B3wHj
-        Af8B7gLtAf8D9QH/A8kB/wNWAcEBNQF7ATIB9gFZAV8BWQHPAxQBGxAAAwQBBQE9AT4BPQFqATUBfQEz
-        AfYBUQHoAZYB/wFhAf8B0gH/ATABuAFBAf8BRQFGAUUBfiAAAwEBAgNHAYIBvgFeAUQB/wFwARcBEwH/
-        ARYCAAH/AUcBJAEcAfkBLAIrAUMQAAGnAqgB/QHQAcoByQH/Ac0BoQFiAv8B3AGdAf8B/QHlAcEB/wH2
-        AeMBzQH/Af4B4AGuAv8B2gGaAf8B+QHAAW4B/wH8AacBSwL/AYABKwH/AdABQQEHAf8ByQG8AboB/wGk
-        AqgB/QQAA40B9gT/A/cD/wH+Af8B2wHWAdQB/wG7AbUBsgH/AckBwgHAAf8BuwG1AbIB/wHMAccBxAH/
-        AbsBtQGyAf8B0AHLAcgB/wH3AfUB9AH/AuoB6QH/A/YB/wPLAf8DVgHBAxgBIQMRARccAAMkATYBWQFh
-        AVkB1QE6AdQBZgH/AV0B/AG+Af8BLAG3AT4B/wM8AWYgAAMCAQMDUwGqAcYBbQFTAf8BTAEMAQkB/wEd
-        AQEBAAH/AV0BWQFWAdcDGAEhDAABpwKoAf0BzwHKAcgB/wHNAZcBUAL/AcsBhQL/Ac4BjgL/Ac8BkAL/
-        Ac0BjQL/AcQBdgL/AbYBWwH/AfwBlgE+Af8B+gFnAR8B/wHIATIBAAH/AcgBugG5Af8BpQKoAf0EAAON
-        AfYE/wP5Af8D+gH/AfkC+gH/A8sB/wG4ArYB/wHBAr8B/wG4ArYB/wPEAf8B8ALxAf8B7gLvAf8D6wH/
-        A/kB/wPNAf8DVgHBKAADEAEVAU8BUAFPAZsBJwG+AT8B/wFTAfUBpAH/ATMBqwFAAf0DMQFOIAADEAEW
-        AVwCWQHMAbkBYAFCAf8BLQECAQAB/wExAQoBAAH/AVECUAGfDAABpwKoAf0BzQHFAcQB/wHQAYIBMQL/
-        AbkBVgL/Ab8BZwL/AcEBagL/AbwBYQL/AbABUAL/AZgBOgH/Af0BcAEjAv8BSwEHAf8BzQEdAQAB/wHG
-        AbYBtQH/AaUCqAH9BAADkAH2BP8D+wH/A/kB/wP6Af8B+gL7Af8D5QH/A9UB/wPhAf8D9AH/A/EB/wPt
-        Af8D6wH/A/cB/wPPAf8DVwHCMAABOQE6ATkBYAFTAWkBVgHjATwB3QFhAf8BSAF6AUoB7SQAAx0BKgFy
-        AVgBUgHpAZ8BSwEpAf8BGAIAAf8BTQELAQAB/wM3AVsIAAOoAf0B1ALLAf8BmAFVAS4B/wG0AXQBPQH/
-        AbMBgwFGAf8BtAGGAUcB/wGzAYIBRAH/AbMBcAE8Af8BswFiATQB/wGzAVABKAH/AbUBOwEYAf8BlwEn
-        ARYB/wHLAb8BvgH/AacCqAH9BAADmQH4IP8D/QH/A/wB/wP6Af8D+QX/A9MB/wNXAcI0AAMdASkBVwFa
-        AVcBxQE/AXoBPwHvKAADKgFAAZABTgFIAfYBgAE4ARsB/wEVAQIBAAH/AWEBSwFIAesIAAGjAqQF/wHb
-        AdwB4AH/AtgB3gH/AtkB3QH/AdgB2QHdAf8B2AHZAd4B/wHYAdkB3gH/AdgB2gHeAf8B2AHbAd8B/wHX
-        AdwB4AH/AdkB3AHfAv8C/AH/A6IB/wQAA1sBywOzAf4DuAH9A7gB/QO4Af0DuAH9A7gB/QO4Af0DuAH9
-        A7gB/QO4Af0DuAH9A7kB/QO7Af4DdAH1AzsBZWwAAzsBZAGJAUgBNQH2AVkBMAEtAfUBUgJRAacIAANh
-        Ad0DdgHvAXUCdwHtA3UB7QN1Ae0DdQHtA3UB7QF0AnUB7QN0Ae0DdAHtAXICdAHtAXMCcgHuA3IB7wNf
-        AeCTAAEBAwQBBQMQARYDKQE/Az4BbANGAYADRAF7AzgBXAMgAS4DCgENAwEBAgwAAVoBXQFfAdMBTAGG
-        AZoB8wFOAXsBiQHvAU4BegGJAe8BTgF6AYkB7wFOAXoBiQHvAU4BegGJAe8BTgF6AYkB7wFOAXoBiQHv
-        AU4BegGJAe8BTgF6AYkB7wFOAXoBiQHvAU0BhQGWAfIBWAFeAWMB2QsAAQEDBgEIAwoBDQMKAQ0DCgEN
-        AwoBDQMKAQ0DCgENAwoBDQMKAQ0DCgENAwoBDQMHAQoDAwEECwABAQMGAQgDCgENAwoBDQMKAQ0DCgEN
-        AwoBDQMKAQ0DCgENAwoBDQMHAQoDAwEEEwABAQMHAQkDFQEdAzkBXwNTAbACWAFmAeYBYAGTAZ8B+wFf
-        AagBuAH9AUwBXQFpAfADWQHSA1IBqQNGAYADJAE2AwQBBggAATYBoAHSAf8BLAH7Av8BIgHxAv8BJQHw
-        Av8BJgHwAv8BJgHxAv8BJgHxAv8BJgHxAv8BJgHxAv8BJgHwAv8BJgHwAv8BJAHwAv8BKgH7Av8BOgGs
-        AdgB/wQAAwQBBQMkATYDRAF5A0oBiwNKAYsDSgGLA0oBiwNKAYsDSgGLA0oBiwNKAYsDSgGLA0oBiwNH
-        AYIDMwFSAwsBDwMEAQUDJAE2A0QBeQNKAYsDSgGLA0oBiwNKAYsDSgGLA0oBiwNKAYsDSgGLA0UBfwMp
-        AT8DAwEECAADBAEFAyQBNgNEAXoBWgFcAWEB2gFgAX0BmAH8Aa8B1QHjAf8BxAHyAf0B/wG3AfAC/wGq
-        Af4C/wGfAf0B/gH/AYgB2gHlAf8BWgGNAakB/gE+AVIBZQH0A1YBuQM1AVcDCwEPBAABMwGDAbkB/AEc
-        AeIC/wETAdkC/wEVAdgC/wEUAdcC/wEWAd8C/wEXAeUC/wEXAeUC/wEXAeAC/wEVAdkC/wEWAdkC/wET
-        AdkC/wEaAeMC/wE1AYwBvQH8BAADHQEqAbUBPgEAAf8BtQE+AQAB/wG1AT4BAAH/AbUBPgEAAf8BtQE+
-        AQAB/wG1AT4BAAH/AbUBPgEAAf8BtQE+AQAB/wG1AT4BAAH/AbUBPgEAAf8BtQE+AQAB/wG1AT4BAAH/
-        AbUBPgEAAf8DUgGpAzUBWAMdASoBtQE+AQAB/wG1AT4BAAH/AbUBPgEAAf8BtQE+AQAB/wG1AT4BAAH/
-        AbUBPgEAAf8BtQE+AQAB/wG1AT4BAAH/AbUBPgEAAf8BtQE+AQAB/wG1AT4BAAH/A0sBjgMUARsDAAEB
-        BAADHQEqAbUBPgEAAf8B8wFWAQAB/wGVAb8B0wH/Ae8D/wHUAfsC/wGpAeYC/wGSAdkC/wGOAesC/wGN
-        AfMC/wGdAf0C/wGrA/8BbAHEAdcB/wFiASEBAAH/A1MBrQM1AVgEAAE1AYMBuQH8ATYB4AL/ASkB1QL/
-        AR0B0wL/ARIB0AL/AQQBngH2Af8BAwGJAeYB/wEEAYoB5QH/AQUBmgHzAf8BDAHJAv8BDQHMAv8BCgHJ
-        Av8BEAHUAv8BMwGJAb0B/AQAAbUBPgEAAv8BbAEKAf8BtQE+AQAC/wGoAVYC/wGnAVUC/wGmAVMC/wGk
-        AVAC/wGiAUwC/wGgAUgC/wGdAUMC/wGbAT8C/wGbAT8B/wHlAUUBGwL/AZsBPwH/AbUBPgEAAf8DSAGI
-        AbUBPgEAAf8BtQE+AQAC/wFyAQ8C/wGvAWIC/wGlAVEC/wGkAU8C/wGjAU0C/wGgAUkC/wGfAUcC/wGd
-        AUMC/wGbAT8B/wG1AT4BAAH/A1QBrwM2AVkDGwEmBAABtQE+AQAC/wFsAQoB/wH7AXABDwH/AZgBwwHY
-        Af8B2QP/AasB5gL/AYYB0wL/AWwBygL/AXEB3QL/AW4B4gL/AYEB6AL/AZEB9wL/AWQBwgHbAf8BbQE/
-        ARkB/wHpAVIBAAH/A0gBiAQAATUBgQG6AfwBSAHgAv8BOwHWAv8BLAHUAv8BHgHbAv8BAwGAAeMB/wIA
-        AXAB/wIAAWoB/wEAAWYB3AH/AQIBxwL/AQIBvgL/AQABuwL/AQUBxgL/ATABhwG9AfwEAAG1AT4BAAL/
-        AXYBGAH/AbUBPgEAAv8BsgFpAv8BsQFoAv8BsQFnAv8BrwFjAv8BqwFdAv8BqAFXAv8BpwFUAv8BpAFP
-        Av8BogFLAf8B5QFIASAC/wGiAUsB/wG1AT4BAAH/A0sBkAG1AT4BAAL/AW0BCAH/AbUBPgEAAf8BtQE+
-        AQAC/wGvAWIC/wGuAWAC/wGtAV4C/wGqAVkC/wGoAVUC/wGlAVEC/wGjAU0B/wHlAUkBIgH/AbUBPgEA
-        Af8DTAGRAxQBGwQAAbUBPgEAAv8BdgEYAf8B+wFwAQ8B/wGJAb8B2wH/AbkB8AL/AYwB1gL/AV4BxAL/
-        AU8BvAL/AVsBzwL/AVgB0wL/AWMB2gL/AXIB5wL/AVMBuAHdAf8BbQFCAR4B/wHpAVIBAAH/A0sBkAQA
-        ATUBfwG6AfwBUwHfAv8BSwHYAv8BOgHTAv8BLgHcAv8BDwGvAfMB/wEAAQoBWQH/AQABBQFOAf8BAAGV
-        AeoB/wEAAbsC/wEAAbAC/wEAAa4C/wEAAbkC/wEuAYQBvQH8BAABtQE+AQAC/wGIASoB/wG1AT4BAAL/
-        Ab4BhwL/Ab4BhgL/AbwBgwL/AboBdgL/AbcBcQL/AbMBagL/AbABZAL/Aa0BXwL/AaoBWgH/AeUBTAEn
-        Av8BqQFXAf8BtQE+AQAB/wNLAZABtQE+AQAC/wGSATIC/wF3ARUB/wG1AT4BAAL/AboBdgL/AbgBcQL/
-        AbYBbwL/AbQBawL/AbABZAL/Aa8BYgL/Aa0BXgH/AeUBTgErAf8BtQE+AQAB/wNUAa8DNQFYAwMBBAG1
-        AT4BAAL/AYgBKgH/AfsBcAEPAf8BbAG3Ad4B/wGXAd8C/wFhAcUC/wE2AbAC/wE3Aa8C/wFOAcQC/wE6
-        AcAC/wFKAcoC/wFaAdcC/wFDAbAB4AH/AW0BRgEkAf8B6QFSAQAB/wNLAZAEAAE3AYEBugH8AWcB4wL/
-        AV8B3AL/AU4B2QL/AT0B4AL/AQcBbgG3Af8CAAEXAf8CAAETAf8BAAFbAaoB/wEFAb0C/wEGAbMC/wED
-        AbAC/wEJAbsC/wEyAYUBvQH8BAABtQE+AQAC/wGVAT4B/wG1AT4BAAL/AcgBmgL/AcgBmAL/AcYBlgL/
-        AcQBkAL/AcABiwL/Ab0BhAL/AbkBdQL/AbYBbgL/AbIBaQH/AeUBUAEuAv8BsAFkAf8BtQE+AQAB/wNL
-        AZABtQE+AQAC/wGfAUcC/wGfAUcC/wFuAQkB/wG1AT4BAAL/AcMBjgL/AcABiQL/Ab4BhAL/AboBdgL/
-        AbgBcQL/AbUBbQH/AeUBUAEuAv8BsAFkAf8BtQE+AQAB/wNMAZEDEwEaAbUBPgEAAv8BlQE+Af8B/AFx
-        AQ8B/wFVAa4B4AH/AWwBzQL/AU8BvAL/AVABvgL/AV4ByAL/AXIB1QL/AV4BywL/AUcBwgL/AUIBxgL/
-        AS0BpgHiAf8BcwFNASwB/wHrAVMBAAH/A0sBkAQAATsBgwG7AfwBigHqAv8BgAHiAv8BZgHeAv8BWAHl
-        Av8BGgGZAc8B/wEAARIBJwH/AQABDQEhAf8BBAGJAcMB/wEeAcUC/wEfAbsC/wEbAbkC/wEiAcMC/wE4
-        AYkBvgH8BAABtQE+AQAC/wGhAVMB/wG1AT4BAAL/AdMBrAL/AdMBrQL/AdEBqQL/Ac4BpAL/AcsBngL/
-        AccBlQL/AcQBkAL/AcABigL/Ab0BhAH/AeUBVQE2Av8BugF2Af8BtQE+AQAB/wNLAY8BtQE+AQAC/wGr
-        AVsC/wGrAVsC/wGTATQB/wG1AT4BAAL/Ac4BoAL/AcwBnAL/AckBlwL/AcUBkgL/AcIBiwL/Ab8BhwH/
-        AeUBVwE7Av8BugF2Af8BtQE+AQAB/wNUAa8DNQFYAbUBPgEAAv8BoQFTAf8B/gFyAQ8B/wFQAaoB4QH/
-        AZQB3gL/AZkB4wL/AZAB4gH+Af8BZwHJAfsB/wFuAdAB+wH/AYsB3QH9Af8BmgHiAv8BjQHdAv8BQgGo
-        AeIB/wGmAXEBSgH/AfEBVQEAAf8DSwGPBAABRgGgAdIB/wGjAfgC/wGZAe4C/wGGAeoC/wFxAegC/wFe
-        AecC/wE3AcYB7gH/ASsBwgHsAf8BOAHdAv8BQQHQAv8BOgHIAv8BOgHJAv8BSgHYAv8BQwGnAdgB/wQA
-        AbUBPgEAAv8BrgFpAf8BtQE+AQAC/wHcAb4C/wHcAb4C/wHaAbkC/wHYAbUC/wHVAa8C/wHRAakC/wHO
-        AaIC/wHKAZoC/wHIAZcB/wHlAVoBQQL/AcMBjgH/AbUBPgEAAf8DRAF8AbUBPgEAAv8BuAFxAv8BuAFx
-        Av8BuAFxAv8BiAEiAf8BtQE+AQAC/wHVAa0C/wHSAagC/wHQAaMC/wHNAZ4C/wHKAZkB/wHlAV0BRAL/
-        AcUBkgL/AcUBkgH/AbUBPgEAAf8DQgF1AbUBPgEAAv8BrgFpAv8BcgEPAf8BcwGjAbwB/wFFAZ0BzgH/
-        AWMBvQHoAf8BlwHaAfgB/wGPAcoB7QH/AZYB0wH0Af8BkQHUAfUB/wFgAboB5wH/ATsBlgHKAf8BRQFg
-        AY0B/wHsAbQBgwH/AfUBVwEAAf8DRAF8BAABWQFcAV4BzAFbAZEBrAH4AU8BgAGVAfMBTAGAAZUB8wFM
-        AYABlQHzAU0BgAGVAfMBTwGCAZYB8wFNAYIBlgHzAVMBfgGQAfEBUQGHAaQB9wFZAaoB1AH/AVgBlgHD
-        Af4BUAGQAawB+AFZAV0BXwHSBAABtQE+AQAC/wG7AYgB/wG1AT4BAC3/AbUBPgEAAf8DJQE3AbUBPgEA
-        Av8BxAGQAv8BxAGQAv8BxAGQAv8BqgFZAf8BtQE+AQAC/wH2Aewd/wG1AT4BAAH/Ay4BRwG1AT4BAAL/
-        AbsBiAL/AXIBDwX/A/4B/wG+AdgB6wH/AVgBpwHVAf8BWgGwAdwB/wFdAbQB3gH/AUcBmAHHAf8BmQG5
-        AdAB/wHwAfEB8gH/A/wB/wP+Af8B9gFXAQAB/wMlATcEAAMQARUDHAEoAxoBJAMZASMDGgElAxsBJgMb
-        ASYDGwEmAxIBGANIAYUBuwGnAagB/wFqAmUB5QMuAUcDDQERBAABtQE+AQAC/wHJAZ8C/wGyAW4B/wG1
-        AT4BAAH/AbUBPgEAAf8BtQE+AQAB/wG1AT4BAAH/AbUBPgEAAf8BtQE+AQAB/wG1AT4BAAH/AbUBPgEA
-        Af8BtQE+AQAB/wG1AT4BAAH/AbUBPgEAAf8DKgFAAwQBBQG1AT4BAAL/AdIBqAL/Ac4BoAL/AdIBqAL/
-        AdIBqAL/AZkBPQH/AbUBPgEAAf8BtQE+AQAB/wG1AT4BAAH/AbUBPgEAAf8BtQE+AQAB/wG1AT4BAAH/
-        AbUBPgEAAf8BtQE+AQAB/wNAAXEDBwEKAbUBPgEAAv8ByQGfAv8BsgFuAv8BcgEPAv8BcgEPAv8BcgEP
-        Af8B/gFyAQ8B/wH+AXIBDwH/AfwBcQEPAf8B/QFxAQ8B/wH+AXIBDwL/AXIBDwL/AXIBDwL/AXIBDwH/
-        AyoBQAMEAQUoAANIAYQB0wHAAb0B/wFiAmEB2gMVAR0IAAG1AT4BAAL/AdUBtQL/AdUBtQL/AdUBtAL/
-        AdYBtQL/AdUBswL/AdUBsxX/AbUBPgEAAf8DKgFAAwQBBQQAAbUBPgEAAv8B3gG+Av8B3gG+Av8B3QG7
-        Av8B3gG+Av8B3QG7Av8B3QG7Ef8BtQE+AQAB/wMrAUIDBwEKAwABAQQAAbUBPgEAAv8B1QG1Av8B1QG1
-        Av8B1QG0Av8B1gG1Av8B1QGzAv8B1QGzFf8BtQE+AQAB/wMqAUADBAEFEAADQAFuA1gBvANOAZgDEwEa
-        CAADCAELA1oBxQHfAc8B0AH/A1gBvAwAAbUBPgEAAv8B4AHHAv8B4AHHAv8B4AHHAv8B4AHHAv8B4AHH
-        Bf8BtQE+AQAB/wG1AT4BAAH/AbUBPgEAAf8BtQE+AQAB/wG1AT4BAAH/Ax0BKgMEAQUDAgEDBAABtQE+
-        AQAC/wHmAc0C/wHmAc0C/wHmAc0C/wHmAc0C/wHmAc0F/wG1AT4BAAH/AbUBPgEAAf8BtQE+AQAB/wG1
-        AT4BAAH/Ax0BKgMEAQUMAAG1AT4BAAL/AeABxwL/AeABxwL/AeABxwL/AeABxwL/AeABxwX/AbUBPgEA
-        Af8BtQE+AQAB/wG1AT4BAAH/AbUBPgEAAf8BtQE+AQAB/wMdASoDBAEFAwIBAxAAAzYBWAGUAowB+wG4
-        AqQB/wNWAbYDIAEvAx0BKgNSAacBzgG+Ab8B/wGnApgB/AM3AVoMAAG1AT4BABX/AbUBPgEAAf8DKwFC
-        AwcBCgMDAQQDAwEEAwIBAwMAAQEMAAG1AT4BABX/AbUBPgEAAf8DKwFCAwcBCgMDAQQDAgEDAwABARAA
-        AbUBPgEAFf8BtQE+AQAB/wMrAUIDBwEKAwMBBAMDAQQDAgEDAwABARwAA0YBfwGyAqUB/wHHArYB/wGV
-        AoUB/gGkApYB/QHUAsQB/wHDArkB/wNMAY8QAAMBAQIBtQE+AQAB/wG1AT4BAAH/AbUBPgEAAf8BtQE+
-        AQAB/wG1AT4BAAH/Ax0BKgMEAQUDAgEDHAADAQECAbUBPgEAAf8BtQE+AQAB/wG1AT4BAAH/AbUBPgEA
-        Af8BtQE+AQAB/wMdASoDBAEFIAADAQECAbUBPgEAAf8BtQE+AQAB/wG1AT4BAAH/AbUBPgEAAf8BtQE+
-        AQAB/wMdASoDBAEFAwIBAy8AAQEDNwFaA1sBywGDAn4B8QGFAoAB8gNeAdADOwFlAwEBAhAAAwoBDgMf
-        ASwDJQE3Ay0BRgM5AV8DQgF0A0gBiANOAZcDUgGmA1YBswNXAb0DQQFzFAADHQEpAlkBXAHNAjcBpAH5
-        Az0BaRgAAzcBWwI+AZcB9QJaAWgB2gMlATcQAAMIAQsDNwFaAVwCWQHJAYEBQQE0AfQBnAFBASAB+gGb
-        AT4BIAH6AYMBPQEuAfUBXQJXAdMBPwI+AWwDDQESKAADCgEOAzYBWQNVAbEDVAGuAzQBVQMMARAMAAFY
-        AVkBXQHSATABYgGAAfYBMQFzAZMB+AEiAYABmwH7ASQBhAG3Af4BIgGdAdMB/wEnAaYB3gH/ASoBsQHn
-        Af8BKwG6Ae0B/wEpAcYB9QH/ASYBrAH0Af8BHAE5AYMB/ANUAa8DEQEXCAADHgErAlkBXgHMAiYB8QH/
-        AhIB+wH/AiUBrQH7Az4BaxAAAzcBWwI1AZcB9gJHAfcB/wJZAfUB/wJZAWMB1wMmATgIAAMZASMDVgGz
-        Ab0BRQEYAf8B0AFaARgB/wHLAUsBBAH/AcEBPQEAAf8BvgFCAQAB/wHCAUkBBQH/AcEBRQEGAf8BsgEw
-        AQQB/wFcAVoBWQHIAyABLxwAAx0BKgNIAYgDWAHdAY8BPAFVAfwB5AFxAY8B/wHMAXYBggH/AXMCTQH6
-        A1MBqgwAATwBoQHLAfkBoQP/AaUD/wGeA/8BmQP/AYwD/wFzA/8BYQP/AU4B/AL/ATgB+QL/AS4B3wH9
-        Af8BHwGrAv8BAAFLAc4B/wJWAVoB2AMqAUEEAAJbAWAB1AIuAfMB/wIAAfoB/wIAAewB/wIIAfEB/wIh
-        Aa8B+wM+AWsIAAM2AVkCMwGXAfYCMgHvAf8CMwHsAf8CRAH2Af8CaQH3Af8CVwFpAd8EAAMYASIBYAFY
-        AVcB1gHXAWQBJwH/AdgBXQESAf8BwAE/AQAB/wHIAVsBIQH/AdgBkAFcAf8BugFJARAB/wGnATABAAH/
-        AaoBNwEAAf8BuAFCAQEB/wHCAUMBBgH/AWoBVAFQAeUDIwEzDAADBgEIAzsBZANXAcIBawFKAUwB8wG4
-        AUkBYAH/AeQBbAGPAf8B7QGPAakB/wH3AYkBoQL/AaABpgH/AfcBpAGoAf8BWgJWAd4MAAFPAXkBjwHu
-        AcQD/wHEA/8BswP/AakD/wGcA/8BigH7Av8BbwH2Av8BXQHxAv8BSwHwAv8BOAHbAfcB/wEdAa4B+wH/
-        AQABqQL/AQUBdAHnAf8BVwFZAVoB0wMJAQwCSwGFAfICKAL/AgAB+AH/AgAB6wH/AgAB5wH/AgIB6wH/
-        AigBoQH4AjkBOgFgAzIBUQI1AZIB9AIhAekB/wInAeYB/wI0AeoB/wI+AfQB/wJvAv8CUQGhAfcDBwEK
-        AVUCUwGtAdwBawEtAf8B2gFdAQ4B/wHEAT4BAAH/AcQBPwEAAf8B6wHLAbMB/wH4Af8B/gH/AeMBrQGM
-        Af8BrgErAQAB/wGsATUBAAH/AaUBMQEAAf8BrwE6AQAB/wHBAUIBBgH/AVwCWAHNAw8BFAQAAwkBDANZ
-        AccBjwFGAVYB/gHNAVoBbgH/AeQBgwGYAf8B5wGnAbUB/wHgAccBywH/AdoByQHMAf8B6gGFAZoC/wGT
-        AZoB/wH3AZwBoAH/AVoCVwHZDAABVQFtAYAB5wHCA/8BxwP/AbcD/wGuA/8BpAP/AZkB/gL/AYgB+wL/
-        AW0B9gL/AVsB8QL/AUkB7QL/ATYB5AL/ASMB7AL/ASMB3AL/AUoBVAFlAewDFgEfAzEBTgJLAYgB8gId
-        AfoB/wIAAfEB/wIAAeUB/wIAAd8B/wIAAeMB/wISAbkB/QIbAaIB+wIOAeMB/wIZAd8B/wImAeQB/wI0
-        Ae4B/wJYAfkB/wJRAZQB9AM4AV4DLQFFAcQBVQEkAf8B6AFtAR4B/wHPAUcBAAH/AcsBRwEAAf8BxgFA
-        AQAB/wHfAZ8BcAH/Ae8B3wHQAf8B1QGFAU4B/wG0ATMBAAH/AbEBOQEAAf8BrAE2AQAB/wGlATEBAAH/
-        AbcBQQEAAf8BsgEwAQQB/wE+Aj0BagQAAx0BKgGIAVEBUgH3AeYBlQGkAf8B5QG/AcUB/wHlAdoB2wH/
-        AeQB4wHhAf8B5QHkAeEB/wHhAdIB1QH/AesBhQGZAv8BlQGbAf8B9QGXAZwB/wFZAlcB2QwAAVgBZAFt
-        Ad4ByAP/AdID/wHBA/8BuAP/Aa4D/wGlA/8BmQP/AYgB+wL/AW0B9gL/AVsB8QL/AUoB7gL/ATcB7wL/
-        ASoB4gL/AToBTAF3AfMDIQExBAADLwFKAk8BhgHxAhYB9QH/AgAB6gH/AgAB3wH/AgAB1wH/AgAB2wH/
-        AgAB3AH/AgsB1wH/AhoB3gH/AicB5wH/AkYB9AH/AkgBlwH2AzYBWQQAA1QBrwHmAXUBMgH/AeIBWAED
-        Af8B1QFMAQAB/wHSAU0BAAH/AcgBPAEAAf8BzgFeASEB/wHlAbABiQH/Ab4BOgEAAf8BuQE8AQAB/wG1
-        ATwBAAH/AbIBOQEAAf8BrAE1AQAB/wGqATYBAAH/AcABRAEHAf8BXQFZAVgB0gQAAxoBJQF8AUcBVgH1
+        Af8EAANiAf8DXwH/A3EB/wNuAf8DjgH/DAAD2QH/cAAB5gHxAeYB/wFpAbUBaQH/ATEBlwExAf8B2QHq
+        AdkB/2AAA+UB/wPqAf8UAAPwAf90AAGFAb4BhQH/ATEBlwExAf9wAAMgAS4DTgGZA1MBqgM8AWgDGAEh
+        IAADGAEhA1QBqwNFAX8YAAM5AV8DVgG2AykBPxQAAY8BygHkAf8BZAG5AdkB/wFeAbYB2AH/AWYBuQHZ
+        Af8BlgHNAeUB/wGYAdAB6AH/AWYBugHZAf8BXgG2AdgB/wFkAbkB2QH/AY0BxwHgAf8MAALsAfMB/0gA
+        AycBOgNVAbEBOAFIAWIB9gGWAa8B1QH/AZgBpQHMAf8BRgFNAYwB/QFPAVEBVAHuA1cBwgNEAXoDIQEx
+        AwEBAhAAA0ABcQEoAWoB4wH/AR4BQAGWAf0DVAGuAxABFgwAA0wBkwEnAV8BlQH7AR8BSwGpAf8DPAFn
+        EAABxwHqAfoB/wExAbUB6QH/AS8BtgHsAf8BLwG2AewB/wEvAbYB7AH/ASwBrQHhAf8BKwGrAd4B/wEv
+        AbYB7AH/AS8BtgHsAf8BLwG2AewB/wEwAbMB5wH/AcUB6QH4Af8IAALpAfMB/wKNAccB/zwAAxEBFwNV
+        AbQBMQFYAVwB+AEAAXIBKQH/AVoBrQFwAf8B8wf/AfwD/wHVAdsB8gH/AZoBqQHPAf8BVwFjAX8B/gFB
+        AUMBUgH0A1sB0AMvAUoMAAIhASIBMQFUAW0BugH7AY0B7wL/ARoBWAG/Af8CWwFeAdoDJwE6AxYBHwNZ
+        AcwBOAGQAdYB/wGUAfAC/wJMAW0B8wMWAR8UAAENAR4BJgH/AQ8BRgFeAf8BKAFqAZIB/wEtAWEBgwH/
+        ARsBJwEtAf8BGwEnASwB/wEtAWEBgwH/ASYBaAGQAf8BDwFGAV4B/wELAR0BJAH/EAAC0wHsAf8CVAHI
+        Af8C1AH+Af80AAM/AW0BfAGLAcMB/gFEAdUBiQH/AQABqQEJAf8BTQGbAV4B/wHVAfQC/wHyAf0B/gH/
+        Ad0B8wH5Af8B6wP/Ae8D/wHRAfsC/wGiAeIB+wH/ATsBYQG3Af8DTAGTEAACWgFdAdMBjwHpAf4B/wGI
+        AfEC/wEtAZEB3wH/AUEBSAFZAfIBRQFTAWkB8QFEAbUB8wH/AZcB/QL/AWoBvQHuAf8DWQHDEAADbwH/
+        A4IB/wMAAf8DhwH/A/4R/wP9Af8DbwH/AwAB/wNqAf8DggH/CAAC+AH+Af8CLwHXAf8CSwHYAf8CmgL/
+        AuUC/ywAA0ABcQF/AZ8BzAH+AUQB0AGGAf8BAAGfAR4B/wFEAY8BZQH/AcsB7wL/AdsB8QH4Af8BoQGg
+        AYwB/wHAAdIBxgH/AcgB9gL/AZgBzQH0Af8BiQHSAf4B/wE/AYIBygH/A0wBkxAAAksBTAGPAU0BswHx
+        Af8BYgHiAv8BYAHiAv8BNwG0AfgB/wFCAcUB/AH/AWMB4QL/AWEB4wL/AUIBfwGuAf4DQQFzEwAB/wMA
+        Af8DBwH/A/wZ/wP3Af8DAAH/AwAB/wMAAf8MAAKPAfoB/wJUAeMB/wJMAdoB/wKCAv8CwQL/KAADQAFw
+        AXsBkQHHAf4BOwHLAYoB/wEAAbEBCgH/ATUBkQFIAf8BvwHkAv8B0wHuAfkB/wHMAbIBiwH/AcwBywGp
+        Af8BmgHdAv8BmwGqAa4B/wGuAboBtAH/AR8BYQHJAf8DTAGTEAADIwEzAUEBagGmAfkBNQHYAv8BLwHK
+        Av8BNgHVAv8BNAHRAv8BLQHLAv8BOwHRAf4B/wFKAVEBZwHyAxIBGRAAAxQB/wMAAf8DKyH/AxwB/wMA
+        Af8DLAH/DAACzgH8Af8CUwH0Af8CWQHmAf8CRQHUAf8CgAL/AqcC/yQAA0ACcAGNAcsB/gE+AbwBgAH/
+        AQ8BkAEVAf8BUAGZAZIB/wGvAeIC/wHWAfEB+gH/AcEBjgFFAf8BuwGwAYsB/wGAAdMC/wGlAZ4BgwH/
+        AcoBpQFLAf8BEwFbAccB/wNNAZYQAANAAXEBIwFfAZ0B+wEPAdEC/wEFAcQC/wEHAcQC/wEHAcQC/wEC
+        AccC/wEZAccB/QH/ASUBPwFqAfoDSAGEAwEBAgwAA1IB/wMAAf8DKiH/AxsB/wMAAf8DawH/EAAChQHz
+        Af8CgAL/AmIB7gH/Aj8B0AH/AnQB/gH/ApYC/wLuAv8cAAM8AWcBYAGIAc8B/gFrAcYB6wH/AWwBvAHm
+        Af8BgwHIAfwB/wGUAdYC/wGLAdkB/AH/AVEBpgHQAf8BSgGmAeAB/wFLAbkC/wFNAY4BwAH/AVkBiAGh
+        Af8BDgFYAcUB/wNOAZQDAQECCAACUAFSAaQBJwFeAbYB/QEhAdAB+QH/ASIB1AL/ASQB0QL/ASUB0QL/
+        ASUB0QL/ASQB0QL/ASIB1wL/AR8BwAHuAf8BEwFLAX8B/gNWAbsDFAEbCAADtAH/AwAB/wMKHf8D+wH/
+        AwAB/wMAAf8DzQH/FAACmQL/AoAC/wJpAfUB/wI/AdIB/wJzAf0B/wKKAv8C4QL/FAADMgFQA1cBvwFL
+        AZYB2gH/AWUBxAL/AWMBvQL/AW8ByQL/AVkBnwH4Af8BGwE5AdwB/wEhAVAB5AH/ARYBTgHjAf8BFAFT
+        AeMB/wEOAV4B8gH/AQMBYwH8Af8BBQFDAcgB/wJJAVIB7wNUAa8CIQEiATEBWQFaAV4B2QExAakB6gH/
+        AVwB9gL/AWkB6wL/AWsB5gL/AWkB5QL/AWYB5AL/AWYB5AL/AWoB5QL/AWoB5wL/AWYB8AL/AVMB7AL/
+        ASEBgwG1Af8DWAHjAzUBVwgAAxsB/wMAAf8DzRn/A78B/wMAAf8DMgH/HAAClAL/AoAC/wJuAfkB/wJB
+        AdcB/wJxAfwB/wKEAv8C1wL/EAACUwFjAesCAAGhAf8BOgGGAegB/wFUAbsC/wFXAbcC/wFcAbsB/gH/
+        AS8BSAHtAf8BFAEWAdYB/wEZAR4B0wH/ARgBHAHSAf8BGAEcAdIB/wEeASQB1QH/ASIBKwHZAf8BIgEv
+        AdkB/wElASoBzgH/AloBXAHcAVUBWQFwAewBXgHbAv8BigP/AZkB9QL/AZYB8wH+Af8BkwH1Av8BmQHy
+        Av8BpwHwAv8BpAHvAv8BlAHyAv8BlQH0Av8BlwHyAf4B/wGXAfgC/wGDA/8BTgGyAd0B/wJVAVwB5wgA
+        A7oB/wMAAf8DPgH/AfsC/AH/Ac8B7QH6Af8BpAHdAfYB/wGoAd8B9wH/AdsB8gH7Af8D+QH/AzIB/wMB
+        Af8DzgH/IAAClQL/AoAC/wJyAfwB/wJFAdsB/wJwAfsB/wKCAv8C1gL/DAADTgGUAQYBAAG9Af8BIwFa
+        AegB/wFIAbgC/wFLAbYC/wE7AYAB9gH/ARsBJAHiAf8BGwEuAd0B/wEaASwB3gH/ARoBLQHfAf8BGAEr
+        Ad4B/wEYASkB3gH/ARcBKAHeAf8BGQEnAecB/wEoASkBgQH5AysBQwNZAccBWAFhAWwB5gJbAWcB4QJb
+        AWYB4QJXAWIB3wFOAVkBgwHyAZMB2wH0Af8B0gH9Av8ByQH+Av8BaAGyAdoB/wFTAVQBawHuAV0BXwFl
+        AeACWwFjAeEBXAFdAWMB4gJeAWoB5QNRAaIMAANzAf8DAAH/AS8BiwGvAf8BJQGlAdgB/wEjAaEB0wH/
+        ASMBogHUAf8BJwGoAdsB/wEtAWsBkQH/AwAB/wO5Af8oAAKaAv8CgAL/AnQB/gH/AkoB4QH/Am8B+wH/
+        AocC/wLlAv8IAAMEAQYCWgFhAdwBCwEYAbkB/wEyAZkB9QH/ATkBowL/ASMBNgHiAf8BHAEpAdgB/wEc
+        ASwB2gH/ARsBKwHbAf8BGgEpAdoB/wEaASkB2wH/ARkBKQHZAf8BGwErAeQB/wESARsBvAH/A04BmRgA
+        AjABMQFNAXABhAHHAf4B7wP/AdoB/AL/AUgBTQF7AfoDJAE1IAADzgH/AwAB/wEjAW4BmQH/AScBkQG7
+        Af8BMAG0AekB/wEuAa4B4QH/ATABmgHDAf8BEwFNAWYB/wMAAf8D8wH/LAACqQL/AoAC/wKAAv8CUQHl
+        Af8ChQH6Af8CrgL/AvgC/wgAAy0BRgIhAXwB+wENAToBvQH/ASgBXwHwAf8BIQEmAdYB/wEfASsB0wH/
+        AR8BKwHVAf8BHQErAdkB/wEdASgB1AH/ARwBKAHUAf8BHAEpAdgB/wEcASYB3AH/AVoBWwFfAeADBwEK
+        GAADCgEOAVUBXAFtAeoB9AP/Ac4B5QH8Af8CWwFcAdwDBAEGJwAB/wM2Af8DLAH/A04B/wJWAVcB/wNO
+        Af8DCwH/AyUB/zQAAsYC/wKFAv8CgAL/AlkB6wH/AoMB+gH/Ar4C/wwAAlIBVAGmAhEBoAH/ASwBOQHm
+        Af8BJAE0AeQB/wEhATAB4AH/ASEBMwHoAf8BHgExAegB/wEeAS0B4QH/ARwBLQHjAf8BHgEvAewB/wEg
+        ASQBeQH8Ay0BRSAAAlUBVgG0AdwB6gH8Af8BqQG7AeIB/wNQAZ0oAAMvAf8DAAH/A6QB/wMXAf8DMgH/
+        A5IB/wMAAf8DkAH/OAAC7wL/AqwC/wKBAv8CawH3Af8CkQL/AuQC/wgAAwwBEAJYAWUB5QEpAS0BmQH+
+        ASgBKwGHAfwBJwErAYMB/AEhASMBkQH7ASEBIwGRAfsBJQEpAYEB+gIhAZEB+wEkASYBfgH6A04BlyQA
+        AzoBYgGsAbIB7gH/AXUBewGbAf4DLwFKKAADywH/AwIB/wMAAf8DAAH/AwAB/wMAAf8DMAH/A/kB/0AA
+        AuoC/wKwAv8ChAL/AqIC/1gAAwwBEAJbAWUB4QJcAV4BzgMEAQYsAAPbAf8DXQH/AxkB/wMnAf8DggH/
+        A/UB/0wAAvUC/wLWAv8MAAMUARsDUQGhA0wBkwMkATUDAwEEaAADEAEWA1sB0ANYAcYDCQEMBAADGQEj
+        AygBPAMtAUYDLQFGAykBPgMfASwDBgEINAADDwEUA1EBogNWAb4DMQFPEAADWQHJAUIBrQE8Af8BPgGE
+        ATYB/wE+AUoBQAH1A1wBzgNFAX0DHwEsGAABYgJYAd0BmgFcASEB+wGcAU0BIgH6AZ0BTQEiAfoBnQFN
+        ASEB+gGdAU0BIAH6AZ0BTQEgAfoBnQFNAR8B+gGdAU0BHgH6AZ4BTQEdAfoBngFNAR0B+gGeAU0BHQH6
+        AZ4BTQEdAfoBngFNAR0B+gGaAUgBFgH7AWMBWwFYAeEEAAMSARkDXAHUAQABpAHiAf8BDAFYAZgB/wNZ
+        AcMDVwHCAWQBUQFJAfEBeAE+ATkB+AF8AU0BKQH6AXwBTQEpAfoBdwE+ATkB+AFfAUoBPwHzAVsCWAHZ
+        AzwBZzAAA1YBuQEOAUEBlgH/ARIBPwGSAf8BRwFMAVMB8QM2AVkIAANKAYwBJwGQAUcB/wFcAbEBpwH/
+        Ad8B8wHPAf8BtQHhAakB/wFhAasBVQH/ATABdQEyAf4BRwFTAUkB8QNXAb8DLwFKEAABgwFfAUsB8wHu
+        AaMBYAH/AewBsAGHAf8B7AGtAYEB/wHrAaoBcwH/AeoBqQFwAf8B6gGnAW4B/wHqAaQBawH/AekBogFo
+        Af8B6QGgAWUB/wHpAZ4BYQH/AegBnAFeAf8B5wGaAVwB/wHkAZsBYAH/Ae0BiwE8Af8BhAFMATsB8wQA
+        AisBLAFDAQsBVgGrAf0BAAH3Av8BFAHBAeoB/wFsATkBPwH/AfIBkQE4Av8BtQFZAv8BvgFhAf8B7QGt
+        AWkB/wH0AbQBYgL/Ab0BYAL/AbMBWAH/AegBiAE9Af8BaQEtASYB+QM5AV8oAAM/AW0BOQFPAaEB/QFD
+        AZgB3wH/AQoBYgHeAf8BCgFLAb4B/wNWAb4EAAMzAVIBLQF1AUUB+gGLAW4BuwH/Ae0BywH7Av8B+wHt
+        Av8B+QH2Af8B+AH3AecB/wHaAeIBsgH/AZ4BxgFqAf8BRAGcATwB/wFJAU4BSQHvAykBPgwAAX4BWAFM
+        AfEB7AHEAawN/wH2AfkC/wH3AfsC/wH9A/8B+wH+Av8B9wH6Av8B9AH2Af0B/wHwAfIB+QH/Ae8B7QH1
+        Af8B5gHuAf0B/wHmAbwBqAH/AYABUwFFAfEEAAMBAQIBUQFYAWIB6QEAAdsB/gH/ARUBxAHnAf8BngGF
+        AW8C/wHMAW0C/wHNAYMB/wHbAbABlgH/ASABHQHWAf8BQAEyAasB/wHzAcIBhgL/AcgBhgL/AdIBhAH/
+        Ad0BcwE+Af8DVgG7JAADDQESAVgBWwFlAeUBUQGiAeMB/wG2Ad8B/QH/Ab4B3wL/AUsBcwGkAf4DRQF/
+        Aw8BFAFYAWEBWAHmAS0ByQFeAf8BsQHpAecC/wHvAeQB/wHxAeUB2AH/AfMB4wHUAf8B9gHhAc0C/wHj
+        AcgB/wH7AdEBrQH/AdEBvAGBAf8BVgGTAT8B/wNYAcsDBAEGCAABfgFYAUwB8QH1Ac0BsgH/AccByAHM
+        Af8BhgGAAYEB/wG7ArcF/wHfAt0B/wGSAowB/wGPAYcBiAH/AZEBiQGKAf8BjwKIAf8BjgGGAYcB/wGG
+        AnMB/wKvAbYB/wHvAcIBpgH/AX4BUwFFAfEEAAM2AVkBFgFfAZMB+wEAAeMC/wEUAb8B4gH/AZUBhAGG
+        Av8B1AGXAv8B2QGiAf8B2AG8AbAB/wEhASUB6AH/ATgBNAHUAf8B8AHSAagB/wH4AckBigL/AcUBhgH/
+        AfEBpwFnAf8DWwHIJAADRgGBAS4BawG9Af8BlwHQAf0B/wHdAfwC/wG0Ab4BzwH/A1QBqwQAA1gBxgFT
+        AZ4BXAH/AdAB2gGqAf8B/QHxAeEB/wHxAeQB1gH/AfAB5AHVAf8B8QHgAcwB/wH0AdcBuAH/AfIBzwGp
+        Af8B1QGzAYoB/wH3AccBnAH/AckB1QGbAf8BNgFqASsB/gNKAYsIAAF+AVgBTwHxAfIBygGvAf8B5gHp
+        AewB/wHJAcgByQH/AeAC3wH/A/4B/wHvAu0B/wHOAswB/wHMAskB/wHMAscB/wHKAsUB/wHJAsMB/wHE
+        Ar0B/wHSAdMB2gH/Ae4BvwGjAf8BfgFTAUUB8QQAAzQBVAELAVgBqAH9AQAB5QL/ARMBvwHhAf8BkwGE
+        AY8C/wHhAbUC/wHqAccB/wHmAdYBzAH/AkAB4AH/AWMBWwHVAf8B/AHsAcUB/wHeAdQBnwH/Af0B1QGl
+        Af8B7wGoAYIB/wNWAbYgAAMSARkBUwFZAWQB7AFvAb4B9wH/AccB8wL/AZUBuQHYAf8DVgG7CAABWQFl
+        AVkB5QFJAYMBnAH/AfAB6wH7Av8B/gH7Af8B+wHsAeQB/wHzAeQB1AH/AfIB2wHCAf8B9wHYAbcB/wHc
+        AcABnQH/AeQBvQGRAf8B+gHOAaEB/wH+AegBzAH/AZkBzAGLAf8BPwFIAT0B9AMtAUUEAAF+AVcBTwHx
+        Ae8ByAGtDf8B/AL6Hf8B+AH5Av8B6wG+AaIB/wF+AVMBRQHxBAADLQFFAQsBWAGJAfwBAAHhAv8BEwHA
+        AeEB/wGYAY8BogL/AekBzAL/AfsB7AH/AvIB7QH/AUYBRAHZAf8BaQFlAdUD/wHwAv8B9wHtAv8B6wHT
+        Af8BvQF/AW0B/gM8AWggAANWAb4BRwGYAdsB/wGtAecC/wFnAagB1wH/A1kBwwMBAQIIAAMQARYBPAE9
+        ATwBaAFZAVwBWQHPAXwBmQF/AfsB0QHpAdEB/wH2AfQB5gL/AekB0gH/AeIBxwGrAf8B2wG9AZkB/wH3
+        AdEBpgH/AfMB0gGtAf8B/QHgAckB/wHzAfoB5wH/AVwBqQFXAf8DWgHTAw8BFAF7AVgBUQHxAfQBzgG0
+        Af8C0wHWAf8BoAKcAf8ByQLHAf8D/gH/AegC5QH/AaoCpQH/AagCoQH/AagCogH/AacCoAH/AaUCnwH/
+        AZ8ClgH/AcEBwwHJAf8B9AHIAawB/wF+AVMBRQHxBAADUQGgAQABkwHTAf8BAAHrAv8BEwG9AeAB/wGN
+        AV0BbwL/Ad8BygL/AfEB3gH/AeEBzQG8Af8BJgEqAbsB/wFJAUYBsAH/AfoB2AGvAv8B6gHZAv8B1QHJ
+        Af8BXQJZAdIDBgEIBAADFAEbAy4BSAMJAQwMAANOAZgBKgFvAaMB/gGbAeEC/wFxAbUB4wH/A1kBzAMG
+        AQgYAAMYASEDSwGOAl4BWgHYAXsBmAFvAfoB2AHKAagB/wH4AdQBsQH/AfIB0wGxAf8B8wHcAcIB/wHx
+        Ad4ByAL/AfQB7wH/AdcB9AHYAf8BNwF4ATEB/gNOAZcBewFXAVMB8QHzAc4BtAH/Ad4B4QHlAf8BuAG2
+        AbcB/wHYAtYF/wHuAu0B/wHAAr4B/wG+ArsB/wG/ArwB/wG+ArkB/wG9ArkB/wG3ArIB/wHPAdMB2QH/
+        AfMByQGtAf8BfgFTAUUB8QMSARkBSwFSAWIB7QEAAckB/QH/AQAB4gH9Af8BGgHJAeoB/wFBASoBQQH5
+        AZ0BSQE5AfwBswKiAf8BWQGdAcAB/wFAAZYBxgH/ATIBjAG+Af8BUAGIAZ8B/wHDAY4BcgH/AWcBXgFd
+        AeUDGwEmBAADIAEuA1gB4wI9ATwB/ANPAZwIAANOAZcBJAFmAZoB/gFzAc0C/wGfAdsB/gH/AUwBVAFi
+        Ae8DHQEqKAABKwEsASsBQwFnAXIBXQHwAf4B8AHYAf8B9QHbAcQB/wHyAeEB0AH/AfMB5gHYAv8B8AHt
+        Af8BrQHaAa0B/wEqAaQBLwH/A1EBpwF7AVYBUwHxAfABzAGzDv8C/iH/AfABxwGsAf8BewFTAUUB8QNS
+        AagBAAFhAcIB/wEAAeIC/wEAAdkB9QH/AR4B3QH3Af8BHgGXAccB/wE1AUgBdwH+AWABngHHAf8BiAHX
+        Af0B/wGNAdQB9QH/AXMBywHuAf8BSAGxAeIB/wEqAWQBnwH/A1IBqAgAA1kB1wHWAc8BzQH/AbgBtAGy
+        Af8DPgH4AzoBYQNOAZcBHwFnAZ8B/gFfAcIC/wGoAeYC/wFNAXwBlwH+A0IBdjAAAzoBYgGbAbcBkQH8
+        Af8B+AHwAf8B8gHjAdQC/wHvAesB/wHLAeIBxwH/ATUBugFFAf8DWAHjAxUBHQF3AVYBUwHxAfQB0AG4
+        Af8C3QHeAf8BtgKyAf8B1gLTBf8B7gLtAf8BvgK7Af8BvQK5Af8BvwK6Af8BvgK5Af8BvQK4Af8BuQKy
+        Af8B1AHWAdoB/wH2AcwBsAH/AXsBUwFFAfEBVAFYAWEB5AEAAb0C/wEAAeUC/wEAAesB+AH/ATEB+wH9
+        Af8BhgP/AU8BmwHMAf8BhAG5AeIB/wGlAeMC/wGcAdoB/gH/AZYB1wH6Af8BjgHSAfMB/wFRAbcB6QH/
+        AVMBWAFgAesDFAEbBAADZAHsAdcB0gHTAf8BywHJAcoB/wGOAY8BjgH/AUQBQQE1AfsBbgFvAXUB/gFI
+        AZUByQH/AYAB0wL/AWsBsgHgAf8DWQHEOAABVQFWAVUBsQHkAfQB5QL/AfQB8QH/AekB6AHbAf8BWwHW
+        AW8B/wFBAW4BQQH5AzABTQQAAXcBVgFTAfEB9gHTAbwB/wHTAdcB2wH/AaABnwGgAf8DyQX/A+oB/wGr
+        AqoB/wGpAacBqAH/AasBqQGqAf8BqgKpAf8BqwKoAf8BowGhAaIB/wHJAc8B1QH/AfkB0QG0Af8BewFT
+        AUcB8QE7AUwBdwHzAQABxQL/AQAB4gL/AQAB/QL/ATED/wGUA/8BawGwAdAB/wGFAaYBzgH/AcIB7QL/
+        AbcB5QL/AaYB3gL/AZgB2AH6Af8BhQHTAf0B/wE2AVoBbgH2Ax0BKgQAAycBOgNYAcsDiAH9AqwBqwH/
+        AaoBqQGnAf8BvgG3AbEB/wG2AbABqgH/AWcBnQG9Af8BUgFVAVwB6gMYASE4AAMPARQBZAFrAWQB5wHz
+        AfoB9QH/AZAB5QGfAf8BNQG0AUMB/wNIAYcIAAF3AVUBUwHxAe0BxwGuAf8B+AHxAe4B/wH4AfAB7QH/
+        AfcB8QHuAf8B9wHyAe8B/wH4AfEB7wH/AfgB8QHuAf8B+AHxAe4B/wH4AfEB7wH/AfgB8QHvAf8B+AHx
+        Ae8B/wH3AfEB7wH/AfcB8wHxAf8B8QHGAaoB/wF7AVMBRwHxARYBUQGUAfsBAAHHAv8BAAHiAv8BBAH7
+        Av8BMgP/AY8D/wFrAbMB1AH/AZ4BsQHQAf8B5wH7Av8B1gHvAv8BugHkAv8BogHgAv8BjAHZAv8CWwFh
+        AeEDBgEIDAADUwGtAaQBowGgAf8BzAHKAccB/wHFAcEBvwH/Ac0BxgHDAf8BbwFnAWUB/wNQAaMIAAMD
+        AQQDDwEUAwkBDCwAAzUBVwFnAboBiAH9AVgB5gGCAf8DWAHGDAABdwFhAVMB8QHsAZ0BVQH/AeQBjQFH
+        Af8B5AGPAUoB/wHkAY0BSAH/AeQBjAFHAf8B5AGMAUYB/wHkAYwBRQH/AeQBiwFEAf8B5AGKAUMB/wHk
+        AYkBQQH/AeQBiQFAAf8B5AGIAUAB/wHjAYgBQQH/AewBiwE2Af8BewFTAUkB8QFLAVUBagHtAQABygL/
+        AQABxQHwAf8BIgFLAV8B+wEwAYMBqQH+AXQD/wFCAYYBtwH/AaABsQHOBf8B8QP/AcwB9AL/Aa4B7gL/
+        AVsBgwGuAf4DQAFwEAADHQEqA2QB8QHRAc8BzQH/AeYB4wHhAf8BswGxAbAB/wFkAWMBYQH/AkUBRAH5
+        A1gB5ANaAdsDVwHoA10B5QMuAUgwAAFSAVMBUgGoAVcBXAFXAd8DGAEhDAABfgJfAfMB/wHhAaEC/wHH
+        AYIC/wHEAXMC/wHBAW0C/wG+AWcC/wG6AWEC/wG2AVsC/wGyAVUC/wGuAU4C/wGqAUcC/wGmAUIC/wGj
+        ATwC/wGeATQC/wGpAToB/wF7AVkBSgHyAlkBXAHJAQABwQH9Af8BAAHPAfYB/wELAUABUwH9AQkBiQG1
+        Af8BYgP/AUEBRwFqAfkDVgHBAYUBjAGcAfkBvQHVAeEB/wGfAckB3QH/AUsBZwF7AfYDSwGPGAADLQFG
+        A1wB5wHCAcABvQH/AdYB0wHRAf8BrAKpAf8BqAGnAaYB/wGvAa0BrAH/AbsBuQG4Af8ChAGDAf4DVgG4
+        AwkBDEgAAV0CWQHXAY4BXAFTAfsBfQJNAfoBfQJNAfoBfQJNAfoBfQJNAfoBfQFNAUoB+gF9AU0BRgH6
+        AX0BTQFCAfoBfQFNAT8B+gF9AU0BMQH6AX0BTQEuAfoBfQFNASsB+gF9AU0BKQH6AY4BRAElAfsBYAFa
+        AVgB3gJGAUcBgQEeAU0BjAH6AR4BZAGYAfoBIwFlAYwB+QEsAVwBjgH4AToBZAGHAfcDVAGvBAADKQE/
+        AkgBSQGHAkUBRgF/ASECIgExIAADEgEZA04BmANlAeUBhwKGAfkBfwJ9AfwBcQJuAfYDXgHZA0ABcRAA
+        AzoBYQNZAccDWQHMA1oBygNaAcoDWgHKA1oBygNaAcoDWgHKA1oBygNaAcoDWgHKA1oBygNcAc4DWQHD
+        AzQBVUQAA1cBwgNEAXs4AANhAeIDewHxA24B7gNuAe4DbgHuA20B7gNsAe4DbAHuA2wB7gNsAe4DbAHu
+        A2wB7gNuAfADZQHlBAADYQHuA+IB/wPdAf8D2gH/AtsB2gH/A9kB/wPYAf8D2AH/A9cB/wPWAf8D1QH/
+        A9QB/wPTAf8D4AH/A5kB/wNXAb0MAANIAYYBTQFRATIB+gNDAXcsAANcAdQBCwEnATwB/wNJAYkDEwEa
+        MAABogKjBf8B9gLwAf8B9gLvAf8B9gLvAf8B9ALvAf8B9ALtAf8B9ALtAf8B9ALtAf8B8gLrAf8B8wLr
+        Af8B8gLoAv8C+wH/AaICoQH/BAADiAH3BP8C9AHzAf8B/QH4AfUC/wH2AfMB/wH9AfQB8QH/AfwB8wHw
+        Af8B+wHwAe0B/wH5AfAB7QH/AfgB7wHsAf8B9wHtAeoB/wHyAe0B6gH/AecB5gHnAf8D9QH/A8YB/wNZ
+        AcMIAAMOARMCXwFdAeABNAHEAU8B/wFHAWoBQQH5AzgBXigAAykBPwE+AVIBaQH3AWUBmgGuAf8DWwHQ
+        A0IBdQMGAQgoAAOfAf0B+gLzAf8B6gLiAf8B6QLhAf8B6QLhAf8B6ALfAf8B5wLeAf8B5gLeAf8B5gLd
+        Af8B5ALbAf8B5ALaAf8B4gLXAf8B9QLrAf8BngKcAf0EAAN7AfYB/AL7Af8B7gHsAeoB/wG7AcwB2gH/
+        AZMBswHLAf8BmAG1AcsB/wGWAbUBywH/AZUBtAHKAf8BlQGzAckB/wGUAbMByQH/AY4BrgHHAf8BqQG6
+        AcgB/wHeAtwB/wHuAu0B/wO9Af8DVgHBCAADQAFxAT8BmgE6Af8BTQHpAZIB/wFBAdIBaQH/AUwBZAFM
+        AfMDLgFHKAADUQGiAXIBxAHfAf8BmwHkAfIB/wEmAYoBrQH/A0wBkQMCAQMkAAGfAp4C/QL2Af8B9QLt
+        Af8B8wLsAf8B8wLsAf8B8gLqAf8B8QLpAf8B8QLpAf8B8ALoAf8B7wLmAf8B7wLlAf8B7QLjAf8B+ALu
+        Af8DnAH9BAADewH2Av8B/gH/Ae0B5AHnAf8BTQGzAdgB/wEFAcsB6wH/ARMB0AHtAf8BFgHRAe4B/wEW
+        AdQB8QH/ARcB0gHuAf8BGQHSAe4B/wEQAc8B7gH/AToBpAHMAf8B1QHPAdMB/wH2AfIB8AH/A8AB/wNW
+        AcEEAAMFAQcBVgFYAVYBvAFQAc8BbwH/AXEB6AGrAf8BYgHoAaMB/wFGAc4BaQH/AVkBYgFWAesDJAE1
+        JAADMQFOARIBcgGlAf8BlwHmAfkB/wGGAegB9QH/AUABXQGPAf0DIgEyJAADoAH9AfsC9wH/Ad4C2gH/
+        Ad4C2QH/Ad8C2gH/Ad4C2QH/Ad0C2QH/Ad0C2QH/Ad0C2AH/AdwC1gH/AdsC1gH/AdoC1AH/AfgC8QH/
+        AZ4CnQH9BAADfQH2BP8B6gHkAeYB/wFSAbsB4QH/ASUB3AL/ASoB3QL/ARIB0wH9Af8BDQHQAfcB/wEQ
+        AdQB/AH/ARAB3QL/AQkB3QL/ATgBrgHYAf8B1QHPAdMB/wH3AfMB8QH/A8EB/wNWAcEEAAMuAUgBQwF/
+        ATwB/gGJAe4BtQH/AZYB8wHFAf8BigHrAbgB/wFuAewBrwH/AUUBzAFnAf8BVwFcAVcB3wMaASQgAAMI
+        AQsDUwGtASMBoQHMAf8BnQHTAd0B/wGqAeIB8AH/A1QBqyQAA6gB/QHSAtEB/wEjAiIB/wIXARYB/wEb
+        ARoBGQH/ARcBFgEXAf8BGgIZAf8BHAIZAf8DHAH/ARoCGwH/ARMBFgEXAf8DHwH/AcsCygH/A6gB/QQA
+        A30B9gT/AekB5wHpAf8BYQG3AeEB/wFgAdAB/gH/AWAB1QL/AT8BqQHcAf8BRAFiAYcB/wEXAZ8B2gH/
+        AQABwQL/AQABvAL/ATUBpQHXAf8B2AHUAdYB/wH4AfQB8gH/AsIBwwH/A1YBwQMCAQMDUAGaAWEBzgGC
+        Af8BoQH6AdEB/wFRAc0BawH/AW0B5gGlAf8BlQHzAcgB/wFxAfIBuAH/AUQByAFiAf8BWwFeAVsB0AMU
+        ARwgAAMSARgDVgGzAWUBxgHhAf8B8AP/AY4BmgGiAf8DMwFSAw8BFBwAA6gB/QHGAsgB/wEAAgEB/wMA
+        Af8DAAH/AgMBAAH/AwAB/wMAAf8DAAH/AwAB/wECAgAB/wMAAf8BvAK9Af8DqAH9BAADfQH2BP8B6QHo
+        AesB/wFkAbkB4QH/AW4B1QH+Af8BcAHdAv8BZgGsAcoB/wFgAU0BSQH/ATcBnQHJAf8BAAG4Av8BAAGv
+        Av8BNgGiAdcB/wHaAdUB1gH/AfoB9gH0Af8BxALFAf8DVgHBAxwBJwFRAYIBPwH3AZgB/AHJAf8BXgGy
+        AXMB/gFYAWEBVQHkAUIBcAFCAfUBYQHjAZgB/wGRAfkBzAH/AXEB9wHBAf8BQAHDAVkB/wFVAVcBVQG3
+        AwoBDSAAAwoBDgNPAaUBjQG+Ac8B/wGYAccB4AH/AUABZAF8AfUBWAJcAdEDGgElGAADqAH9AcoBzwHQ
+        Af8BCwETARQB/wMAAf8BOAE7ATQB/wG9AbYBlgH/ARYBKAEkAf8BHwElARwB/wEmASIBFwH/AwAB/wFi
+        ATABDwH/AwAB/wHCAr8B/wOoAf0EAAN9AfYE/wHmAecB6wH/AWoBuwHiAf8BlwHkAv8BlgHoAv8BkAHH
+        Ad0B/wGLAZIBkwH/AWEBvAHeAf8BHAHFAv8BFAHAAv8BPAGmAdgB/wHXAdQB1wH/AfsB9wH1Af8DxgH/
+        A1YBwQNHAYIBTwHQAW8B/wFUAdUBdAH/AVgBWgFYAcADAAEBAy0BRQFaAWEBWAHiAUYBywFiAf8BgQH5
+        AcYB/wFvAf4BygH/ATkBwAFSAf8DUgGpAwQBBSAAAwoBDgNXAcUBRwGUAbsB/wFFAZgBuwH/ASYBKwEw
+        Af8DUAGfAwABARQAA6gB/QHRAswB/wG4AZgBXwH/AWUBZgFQAf8BtgK4Bf8BTgJYAf8BXgFXATwB/wFk
+        AWMBSwH/ATcBKwEWAf8BzgFnASYB/wFDARsBBwH/AckBvgG9Af8DqAH9BAADfwH2BP8B8QHwAfEB/wGD
+        AbkB2gH/AWIBtwHeAf8BZgG4Ad4B/wFmAb8B5wH/AXQBywHzAf8BVwG7AegB/wFCAa4B4AH/ATgBqgHc
+        Af8BXwGqAdEB/wHhAd8B4AH/AfoB9wH2Af8DyAH/A1YBwQFWAWUBVgHpATkB0AFXAf8BWQFbAVkBxAMN
+        ARIIAAMcASgBVAFWAVQBqwEvAbQBOwH/AWMB8gGzAf8BZwH/AdAB/wE0AbsBSAH/A0sBjiQAAj4BPwFs
+        AYABdAFxAf8BkwEdARMB/wEYAgAB/wEnAQUBAAH/A0ABcBQAAaYCqAH9AdEBzAHKAf8B1wGvAW0B/wH8
+        AeEBrgH/AfYC9wH/AfsB/gL/AeQB1wHFAf8BywGvAXEB/wGPAW8BTQH/AcwBkgFBAv8BkQEzAf8ByQFB
+        AQkB/wHKAb0BuwH/AaUCqAH9BAADgQH2BP8B+wH6AfkB/wHmAeoB7gH/AZ8BpwGxAf8BogGnAa4B/wGf
+        AacBrwH/AcABzAHXAf8BsAG1Ab0B/wGuAa0BswH/AZ8BoQGoAf8B3gHfAeMB/wHuAu0B/wP1Af8DyQH/
+        A1YBwQE4AXUBNQH2AVkBXAFZAc8DFAEbEAADBAEFAT0BPgE9AWoBOAF3ATYB9gFOAegBlgH/AV4B/wHS
+        Af8BLQG4AT4B/wFFAUYBRQF+IAADAQECA0cBggG+AVsBQQH/AW0BFAEQAf8BEwIAAf8BRwEnASIB+QEs
+        AisBQxAAAacCqAH9AdABygHJAf8BzQGhAV8C/wHcAZ0B/wH9AeUBwQH/AfYB4wHNAf8B/gHgAa4C/wHa
+        AZoB/wH5AcABawH/AfwBpwFIAv8BgAEoAf8B0AE+AQQB/wHJAbwBugH/AaQCqAH9BAADgQH2BP8D9wP/
+        Af4B/wHbAdYB1AH/AbsBtQGyAf8ByQHCAcAB/wG7AbUBsgH/AcwBxwHEAf8BuwG1AbIB/wHQAcsByAH/
+        AfcB9QH0Af8C6gHpAf8D9gH/A8sB/wNWAcEDGAEhAxEBFxwAAyQBNgFaAV4BWgHVATcB1AFjAf8BWgH8
+        Ab4B/wEpAbcBOwH/AzwBZiAAAwIBAwNTAaoBxgFqAVAB/wFJAQkBBgH/ARoCAAH/AV0CWQHXAxgBIQwA
+        AacCqAH9Ac8BygHIAf8BzQGXAU0C/wHLAYUC/wHOAY4C/wHPAZAC/wHNAY0C/wHEAXMC/wG2AVgB/wH8
+        AZYBOwH/AfoBZAEcAf8ByAEvAQAB/wHIAboBuQH/AaUCqAH9BAADgQH2BP8D+QH/A/oB/wH5AvoB/wPL
+        Af8BuAK2Af8BwQK/Af8BuAK2Af8DxAH/AfAC8QH/Ae4C7wH/A+sB/wP5Af8DzQH/A1YBwSgAAxABFQFP
+        AVABTwGbASQBvgE8Af8BUAH1AaQB/wE2AagBQAH9AzEBTiAAAxABFgFcAlkBzAG5AV0BPwH/ASoCAAH/
+        AS4BBwEAAf8BUQJQAZ8MAAGnAqgB/QHNAcUBxAH/AdABggEuAv8BuQFTAv8BvwFkAv8BwQFnAv8BvAFe
+        Av8BsAFNAv8BmAE3Af8B/QFtASAC/wFIAQQB/wHNARoBAAH/AcYBtgG1Af8BpQKoAf0EAAOFAfYE/wP7
+        Af8D+QH/A/oB/wH6AvsB/wPlAf8D1QH/A+EB/wP0Af8D8QH/A+0B/wPrAf8D9wH/A88B/wNXAcIwAAE5
+        AToBOQFgAVgBZAFYAeMBOQHdAV4B/wFQAXABUQHtJAADHQEqAWoCWAHpAZ8BSAEmAf8BFQIAAf8BSgEI
+        AQAB/wM3AVsIAAOoAf0B1ALLAf8BmAFSASsB/wG0AXEBOgH/AbMBgwFDAf8BtAGGAUQB/wGzAYIBQQH/
+        AbMBbQE5Af8BswFfATEB/wGzAU0BJQH/AbUBOAEVAf8BlwEkARMB/wHLAb8BvgH/AacCqAH9BAADkwH4
+        IP8D/QH/A/wB/wP6Af8D+QX/A9MB/wNXAcI0AAMdASkBVwFaAVcBxQFJAXABSQHvKAADKgFAAYUBSwFI
+        AfYBgAE1ARgB/wESAgAB/wFgAVQBUQHrCAABowKkBf8B2wHcAeAB/wLYAd4B/wLZAd0B/wHYAdkB3QH/
+        AdgB2QHeAf8B2AHZAd4B/wHYAdoB3gH/AdgB2wHfAf8B1wHcAeAB/wHZAdwB3wL/AvwB/wOiAf8EAANb
+        AcsDrQH+A7UB/QO1Af0DtQH9A7UB/QO1Af0DtQH9A7UB/QO1Af0DtQH9A7UB/QO2Af0DtQH+A24B9QM7
+        AWVsAAM7AWQBfQFIATgB9gFZATcBMwH1AVICUQGnCAADXgHdA24B7wFtAm4B7QNtAe0DbQHtA20B7QNt
+        Ae0BawJtAe0DawHtA2sB7QFqAmsB7QFrAmoB7gNrAe8DXwHgkwABAQMEAQUDEAEWAykBPwM+AWwDRgGA
+        A0QBewM4AVwDIAEuAwoBDQMBAQIMAAFaAl0B0wFMAX8BjAHzAVIBcAF7Ae8BUgFwAXsB7wFSAXABewHv
+        AVIBcAF7Ae8BUgFwAXsB7wFSAXABewHvAVIBcAF7Ae8BUgFwAXsB7wFSAXABewHvAVIBcAF7Ae8BUQF7
+        AYkB8gFbAl4B2QsAAQEDBgEIAwoBDQMKAQ0DCgENAwoBDQMKAQ0DCgENAwoBDQMKAQ0DCgENAwoBDQMH
+        AQoDAwEECwABAQMGAQgDCgENAwoBDQMKAQ0DCgENAwoBDQMKAQ0DCgENAwoBDQMHAQoDAwEEEwABAQMH
+        AQkDFQEdAzkBXwNTAbACWAFhAeYBXwGQAZkB+wFZAagBtQH9AU4BXQFmAfADWQHSA1IBqQNGAYADJAE2
+        AwQBBggAATMBoAHSAf8BKQH7Av8BHwHxAv8BIgHwAv8BIwHwAv8BIwHxAv8BIwHxAv8BIwHxAv8BIwHx
+        Av8BIwHwAv8BIwHwAv8BIQHwAv8BJwH7Av8BNwGsAdgB/wQAAwQBBQMkATYDRAF5A0oBiwNKAYsDSgGL
+        A0oBiwNKAYsDSgGLA0oBiwNKAYsDSgGLA0oBiwNHAYIDMwFSAwsBDwMEAQUDJAE2A0QBeQNKAYsDSgGL
+        A0oBiwNKAYsDSgGLA0oBiwNKAYsDSgGLA0UBfwMpAT8DAwEECAADBAEFAyQBNgNEAXoBXQFeAWEB2gFd
+        AXoBjwH8Aa8B1QHjAf8BxAHyAf0B/wG3AfAC/wGqAf4C/wGfAf0B/gH/AYgB2gHlAf8BWgGHAaMB/gFB
+        AVIBZQH0A1YBuQM1AVcDCwEPBAABMAF9AbMB/AEZAeIC/wEQAdkC/wESAdgC/wERAdcC/wETAd8C/wEU
+        AeUC/wEUAeUC/wEUAeAC/wESAdkC/wETAdkC/wEQAdkC/wEXAeMC/wEyAYMBtwH8BAADHQEqAbUBOwEA
+        Af8BtQE7AQAB/wG1ATsBAAH/AbUBOwEAAf8BtQE7AQAB/wG1ATsBAAH/AbUBOwEAAf8BtQE7AQAB/wG1
+        ATsBAAH/AbUBOwEAAf8BtQE7AQAB/wG1ATsBAAH/AbUBOwEAAf8DUgGpAzUBWAMdASoBtQE7AQAB/wG1
+        ATsBAAH/AbUBOwEAAf8BtQE7AQAB/wG1ATsBAAH/AbUBOwEAAf8BtQE7AQAB/wG1ATsBAAH/AbUBOwEA
+        Af8BtQE7AQAB/wG1ATsBAAH/A0sBjgMUARsDAAEBBAADHQEqAbUBOwEAAf8B8wFTAQAB/wGVAb8B0wH/
+        Ae8D/wHUAfsC/wGpAeYC/wGSAdkC/wGOAesC/wGNAfMC/wGdAf0C/wGrA/8BaQHEAdcB/wFfAR4BAAH/
+        A1MBrQM1AVgEAAEyAX0BswH8ATMB4AL/ASYB1QL/ARoB0wL/AQ8B0AL/AQEBngH2Af8BAAGJAeYB/wEB
+        AYoB5QH/AQIBmgHzAf8BCQHJAv8BCgHMAv8BBwHJAv8BDQHUAv8BMAGAAbcB/AQAAbUBOwEAAv8BaQEH
+        Af8BtQE7AQAC/wGoAVMC/wGnAVIC/wGmAVAC/wGkAU0C/wGiAUkC/wGgAUUC/wGdAUAC/wGbATwC/wGb
+        ATwB/wHlAUIBGAL/AZsBPAH/AbUBOwEAAf8DSAGIAbUBOwEAAf8BtQE7AQAC/wFvAQwC/wGvAV8C/wGl
+        AU4C/wGkAUwC/wGjAUoC/wGgAUYC/wGfAUQC/wGdAUAC/wGbATwB/wG1ATsBAAH/A1QBrwM2AVkDGwEm
+        BAABtQE7AQAC/wFpAQcB/wH7AW0BDAH/AZgBwwHYAf8B2QP/AasB5gL/AYYB0wL/AWkBygL/AW4B3QL/
+        AWsB4gL/AYEB6AL/AZEB9wL/AWEBwgHbAf8BagE8ARYB/wHpAU8BAAH/A0gBiAQAATIBfAG0AfwBRQHg
+        Av8BOAHWAv8BKQHUAv8BGwHbAv8BAAGAAeMB/wIAAW0B/wIAAWcB/wEAAWMB3AH/AQABxwL/AQABvgL/
+        AQABuwL/AQIBxgL/AS0BfgG3AfwEAAG1ATsBAAL/AXMBFQH/AbUBOwEAAv8BsgFmAv8BsQFlAv8BsQFk
+        Av8BrwFgAv8BqwFaAv8BqAFUAv8BpwFRAv8BpAFMAv8BogFIAf8B5QFFAR0C/wGiAUgB/wG1ATsBAAH/
+        A0sBkAG1ATsBAAL/AWoBBQH/AbUBOwEAAf8BtQE7AQAC/wGvAV8C/wGuAV0C/wGtAVsC/wGqAVYC/wGo
+        AVIC/wGlAU4C/wGjAUoB/wHlAUYBHwH/AbUBOwEAAf8DTAGRAxQBGwQAAbUBOwEAAv8BcwEVAf8B+wFt
+        AQwB/wGJAb8B2wH/AbkB8AL/AYwB1gL/AVsBxAL/AUwBvAL/AVgBzwL/AVUB0wL/AWAB2gL/AW8B5wL/
+        AVABuAHdAf8BagE/ARsB/wHpAU8BAAH/A0sBkAQAATIBfAG0AfwBUAHfAv8BSAHYAv8BNwHTAv8BKwHc
+        Av8BDAGvAfMB/wEAAQcBVgH/AQABAgFLAf8BAAGVAeoB/wEAAbsC/wEAAbAC/wEAAa4C/wEAAbkC/wEr
+        AX0BtwH8BAABtQE7AQAC/wGIAScB/wG1ATsBAAL/Ab4BhwL/Ab4BhgL/AbwBgwL/AboBcwL/AbcBbgL/
+        AbMBZwL/AbABYQL/Aa0BXAL/AaoBVwH/AeUBSQEkAv8BqQFUAf8BtQE7AQAB/wNLAZABtQE7AQAC/wGS
+        AS8C/wF0ARIB/wG1ATsBAAL/AboBcwL/AbgBbgL/AbYBbAL/AbQBaAL/AbABYQL/Aa8BXwL/Aa0BWwH/
+        AeUBSwEoAf8BtQE7AQAB/wNUAa8DNQFYAwMBBAG1ATsBAAL/AYgBJwH/AfsBbQEMAf8BaQG3Ad4B/wGX
+        Ad8C/wFeAcUC/wEzAbAC/wE0Aa8C/wFLAcQC/wE3AcAC/wFHAcoC/wFXAdcC/wFAAbAB4AH/AWoBQwEh
+        Af8B6QFPAQAB/wNLAZAEAAE0AXwBtAH8AWQB4wL/AVwB3AL/AUsB2QL/AToB4AL/AQQBawG3Af8CAAEU
+        Af8CAAEQAf8BAAFYAaoB/wECAb0C/wEDAbMC/wEAAbAC/wEGAbsC/wEvAX4BtwH8BAABtQE7AQAC/wGV
+        ATsB/wG1ATsBAAL/AcgBmgL/AcgBmAL/AcYBlgL/AcQBkAL/AcABiwL/Ab0BhAL/AbkBcgL/AbYBawL/
+        AbIBZgH/AeUBTQErAv8BsAFhAf8BtQE7AQAB/wNLAZABtQE7AQAC/wGfAUQC/wGfAUQC/wFrAQYB/wG1
+        ATsBAAL/AcMBjgL/AcABiQL/Ab4BhAL/AboBcwL/AbgBbgL/AbUBagH/AeUBTQErAv8BsAFhAf8BtQE7
+        AQAB/wNMAZEDEwEaAbUBOwEAAv8BlQE7Af8B/AFuAQwB/wFSAa4B4AH/AWkBzQL/AUwBvAL/AU0BvgL/
+        AVsByAL/AW8B1QL/AVsBywL/AUQBwgL/AT8BxgL/ASoBpgHiAf8BcAFKASkB/wHrAVABAAH/A0sBkAQA
+        ATgBfQG1AfwBigHqAv8BgAHiAv8BYwHeAv8BVQHlAv8BFwGZAc8B/wEAAQ8BJAH/AQABCgEeAf8BAQGJ
+        AcMB/wEbAcUC/wEcAbsC/wEYAbkC/wEfAcMC/wE1AYABuAH8BAABtQE7AQAC/wGhAVAB/wG1ATsBAAL/
+        AdMBrAL/AdMBrQL/AdEBqQL/Ac4BpAL/AcsBngL/AccBlQL/AcQBkAL/AcABigL/Ab0BhAH/AeUBUgEz
+        Av8BugFzAf8BtQE7AQAB/wNLAY8BtQE7AQAC/wGrAVgC/wGrAVgC/wGTATEB/wG1ATsBAAL/Ac4BoAL/
+        AcwBnAL/AckBlwL/AcUBkgL/AcIBiwL/Ab8BhwH/AeUBVAE4Av8BugFzAf8BtQE7AQAB/wNUAa8DNQFY
+        AbUBOwEAAv8BoQFQAf8B/gFvAQwB/wFNAaoB4QH/AZQB3gL/AZkB4wL/AZAB4gH+Af8BZAHJAfsB/wFr
+        AdAB+wH/AYsB3QH9Af8BmgHiAv8BjQHdAv8BPwGoAeIB/wGmAW4BRwH/AfEBUgEAAf8DSwGPBAABQwGg
+        AdIB/wGjAfgC/wGZAe4C/wGGAeoC/wFuAegC/wFbAecC/wE0AcYB7gH/ASgBwgHsAf8BNQHdAv8BPgHQ
+        Av8BNwHIAv8BNwHJAv8BRwHYAv8BQAGnAdgB/wQAAbUBOwEAAv8BrgFmAf8BtQE7AQAC/wHcAb4C/wHc
+        Ab4C/wHaAbkC/wHYAbUC/wHVAa8C/wHRAakC/wHOAaIC/wHKAZoC/wHIAZcB/wHlAVcBPgL/AcMBjgH/
+        AbUBOwEAAf8DRAF8AbUBOwEAAv8BuAFuAv8BuAFuAv8BuAFuAv8BiAEfAf8BtQE7AQAC/wHVAa0C/wHS
+        AagC/wHQAaMC/wHNAZ4C/wHKAZkB/wHlAVoBQQL/AcUBkgL/AcUBkgH/AbUBOwEAAf8DQgF1AbUBOwEA
+        Av8BrgFmAv8BbwEMAf8BcAGjAbwB/wFCAZ0BzgH/AWABvQHoAf8BlwHaAfgB/wGPAcoB7QH/AZYB0wH0
+        Af8BkQHUAfUB/wFdAboB5wH/ATgBlgHKAf8BQgFdAY0B/wHsAbQBgwH/AfUBVAEAAf8DRAF8BAABWQJc
+        AcwBXAGIAZ8B+AFPAXcBhwHzAUwBdwGHAfMBTAF3AYcB8wFNAXcBhwHzAU8BewGIAfMBTQF7AYgB8wFT
+        AXQBgwHxAVEBhAGaAfcBVgGqAdQB/wFYAZABvQH+AVMBhwGfAfgBWQJdAdIEAAG1ATsBAAL/AbsBiAH/
+        AbUBOwEALf8BtQE7AQAB/wMlATcBtQE7AQAC/wHEAZAC/wHEAZAC/wHEAZAC/wGqAVYB/wG1ATsBAAL/
+        AfYB7B3/AbUBOwEAAf8DLgFHAbUBOwEAAv8BuwGIAv8BbwEMBf8D/gH/Ab4B2AHrAf8BVQGnAdUB/wFX
+        AbAB3AH/AVoBtAHeAf8BRAGYAccB/wGZAbkB0AH/AfAB8QHyAf8D/AH/A/4B/wH2AVQBAAH/AyUBNwQA
+        AxABFQMcASgDGgEkAxkBIwMaASUDGwEmAxsBJgMbASYDEgEYA0gBhQG7AacBqAH/A2UB5QMuAUcDDQER
+        BAABtQE7AQAC/wHJAZ8C/wGyAWsB/wG1ATsBAAH/AbUBOwEAAf8BtQE7AQAB/wG1ATsBAAH/AbUBOwEA
+        Af8BtQE7AQAB/wG1ATsBAAH/AbUBOwEAAf8BtQE7AQAB/wG1ATsBAAH/AbUBOwEAAf8DKgFAAwQBBQG1
+        ATsBAAL/AdIBqAL/Ac4BoAL/AdIBqAL/AdIBqAL/AZkBOgH/AbUBOwEAAf8BtQE7AQAB/wG1ATsBAAH/
+        AbUBOwEAAf8BtQE7AQAB/wG1ATsBAAH/AbUBOwEAAf8BtQE7AQAB/wNAAXEDBwEKAbUBOwEAAv8ByQGf
+        Av8BsgFrAv8BbwEMAv8BbwEMAv8BbwEMAf8B/gFvAQwB/wH+AW8BDAH/AfwBbgEMAf8B/QFuAQwB/wH+
+        AW8BDAL/AW8BDAL/AW8BDAL/AW8BDAH/AyoBQAMEAQUoAANIAYQB0wHAAb0B/wNhAdoDFQEdCAABtQE7
+        AQAC/wHVAbUC/wHVAbUC/wHVAbQC/wHWAbUC/wHVAbMC/wHVAbMV/wG1ATsBAAH/AyoBQAMEAQUEAAG1
+        ATsBAAL/Ad4BvgL/Ad4BvgL/Ad0BuwL/Ad4BvgL/Ad0BuwL/Ad0BuxH/AbUBOwEAAf8DKwFCAwcBCgMA
+        AQEEAAG1ATsBAAL/AdUBtQL/AdUBtQL/AdUBtAL/AdYBtQL/AdUBswL/AdUBsxX/AbUBOwEAAf8DKgFA
+        AwQBBRAAA0ABbgNYAbwDTgGYAxMBGggAAwgBCwNaAcUB3wHPAdAB/wNYAbwMAAG1ATsBAAL/AeABxwL/
+        AeABxwL/AeABxwL/AeABxwL/AeABxwX/AbUBOwEAAf8BtQE7AQAB/wG1ATsBAAH/AbUBOwEAAf8BtQE7
+        AQAB/wMdASoDBAEFAwIBAwQAAbUBOwEAAv8B5gHNAv8B5gHNAv8B5gHNAv8B5gHNAv8B5gHNBf8BtQE7
+        AQAB/wG1ATsBAAH/AbUBOwEAAf8BtQE7AQAB/wMdASoDBAEFDAABtQE7AQAC/wHgAccC/wHgAccC/wHg
+        AccC/wHgAccC/wHgAccF/wG1ATsBAAH/AbUBOwEAAf8BtQE7AQAB/wG1ATsBAAH/AbUBOwEAAf8DHQEq
+        AwQBBQMCAQMQAAM2AVgBkQKJAfsBuAKkAf8DVgG2AyABLwMdASoDUgGnAc4BvgG/Af8BngKPAfwDNwFa
+        DAABtQE7AQAV/wG1ATsBAAH/AysBQgMHAQoDAwEEAwMBBAMCAQMDAAEBDAABtQE7AQAV/wG1ATsBAAH/
+        AysBQgMHAQoDAwEEAwIBAwMAAQEQAAG1ATsBABX/AbUBOwEAAf8DKwFCAwcBCgMDAQQDAwEEAwIBAwMA
+        AQEcAANGAX8BsgKlAf8BxwK2Af8BjwJ/Af4BpAKWAf0B1ALEAf8BwwK5Af8DTAGPEAADAQECAbUBOwEA
+        Af8BtQE7AQAB/wG1ATsBAAH/AbUBOwEAAf8BtQE7AQAB/wMdASoDBAEFAwIBAxwAAwEBAgG1ATsBAAH/
+        AbUBOwEAAf8BtQE7AQAB/wG1ATsBAAH/AbUBOwEAAf8DHQEqAwQBBSAAAwEBAgG1ATsBAAH/AbUBOwEA
+        Af8BtQE7AQAB/wG1ATsBAAH/AbUBOwEAAf8DHQEqAwQBBQMCAQMvAAEBAzcBWgNbAcsBewJ0AfEBewJ5
+        AfIDXgHQAzsBZQMBAQIQAAMKAQ4DHwEsAyUBNwMtAUYDOQFfA0IBdANIAYgDTgGXA1IBpgNWAbMDVwG9
+        A0EBcxQAAx0BKQJaAVwBzQI9AZgB+QM9AWkYAAM3AVsCQgGJAfUCXQFiAdoDJQE3EAADCAELAzcBWgFc
+        AlkByQF5AUQBPQH0AZUBRAEjAfoBkwFBASMB+gF8AUIBNAH1AV0CWgHTAT8CPgFsAw0BEigAAwoBDgM2
+        AVkDVQGxA1QBrgM0AVUDDAEQDAACWQFdAdIBMwFiAXkB9gE5AXABiwH4ASIBeQGWAfsBJAF/AbEB/gEf
+        AZ0B0wH/ASQBpgHeAf8BJwGxAecB/wEoAboB7QH/ASYBxgH1Af8BIwGsAfQB/wEfATYBfQH8A1QBrwMR
+        ARcIAAMeASsCWQFcAcwCIwHxAf8CDwH7Af8CJQGhAfsDPgFrEAADNwFbAjgBjQH2AkQB9wH/AlYB9QH/
+        AlkBXwHXAyYBOAgAAxkBIwNWAbMBvQFCARUB/wHQAVcBFQH/AcsBSAEBAf8BwQE6AQAB/wG+AT8BAAH/
+        AcIBRgECAf8BwQFCAQMB/wGyAS0BAQH/A1sByAMgAS8cAAMdASoDSAGIA1gB3QGGATkBTwH8AeQBbgGP
+        Af8BzAFzAYIB/wFwAk0B+gNTAaoMAAFBAZUBuwH5AaED/wGlA/8BngP/AZkD/wGMA/8BcAP/AV4D/wFL
+        AfwC/wE1AfkC/wErAd8B/QH/ARwBqwL/AQABSAHOAf8DWgHYAyoBQQQAAlwBYAHUAisB8wH/AgAB+gH/
+        AgAB7AH/AgUB8QH/AiEBowH7Az4BawgAAzYBWQI2AY0B9gIvAe8B/wIwAewB/wJBAfYB/wJmAfcB/wJX
+        AWIB3wQAAxgBIgFgAlsB1gHXAWEBJAH/AdgBWgEPAf8BwAE8AQAB/wHIAVgBHgH/AdgBkAFZAf8BugFG
+        AQ0B/wGnAS0BAAH/AaoBNAEAAf8BuAE/AQAB/wHCAUABAwH/AWUBWAFXAeUDIwEzDAADBgEIAzsBZANX
+        AcIBZgJMAfMBuAFGAV0B/wHkAWkBjwH/Ae0BjwGpAf8B9wGJAaEC/wGgAaYB/wH3AaQBqAH/A1oB3gwA
+        AVQBbgF/Ae4BxAP/AcQD/wGzA/8BqQP/AZwD/wGKAfsC/wFsAfYC/wFaAfEC/wFIAfAC/wE1AdsB9wH/
+        ARoBrgH7Af8BAAGpAv8BAgFxAecB/wNaAdMDCQEMAk4BewHyAiUC/wIAAfgB/wIAAesB/wIAAecB/wIA
+        AesB/wIxAZkB+AI5AToBYAMyAVECPgGHAfQCHgHpAf8CJAHmAf8CMQHqAf8COwH0Af8CbAL/AlEBlgH3
+        AwcBCgFVAlMBrQHcAWgBKgH/AdoBWgELAf8BxAE7AQAB/wHEATwBAAH/AesBywGzAf8B+AH/Af4B/wHj
+        Aa0BjAH/Aa4BKAEAAf8BrAEyAQAB/wGlAS4BAAH/Aa8BNwEAAf8BwQE/AQMB/wFcAloBzQMPARQEAAMJ
+        AQwDWQHHAYkBRgFWAf4BzQFXAWsB/wHkAYMBmAH/AecBpwG1Af8B4AHHAcsB/wHaAckBzAH/AeoBhQGa
+        Av8BkwGaAf8B9wGcAaAB/wFbAloB2QwAAVoBZgF0AecBwgP/AccD/wG3A/8BrgP/AaQD/wGZAf4C/wGI
+        AfsC/wFqAfYC/wFYAfEC/wFGAe0C/wEzAeQC/wEgAewC/wEgAdwC/wFRAVkBZAHsAxYBHwMxA04BfQHy
+        AhoB+gH/AgAB8QH/AgAB5QH/AgAB3wH/AgAB4wH/AhUBtgH9AiEBmgH7AgsB4wH/AhYB3wH/AiMB5AH/
+        AjEB7gH/AlUB+QH/AlIBigH0AzgBXgMtAUUBxAFSASEB/wHoAWoBGwH/Ac8BRAEAAf8BywFEAQAB/wHG
+        AT0BAAH/Ad8BnwFtAf8B7wHfAdAB/wHVAYUBSwH/AbQBMAEAAf8BsQE2AQAB/wGsATMBAAH/AaUBLgEA
+        Af8BtwE+AQAB/wGyAS0BAQH/AT4CPQFqBAADHQEqAYUBUQFSAfcB5gGVAaQB/wHlAb8BxQH/AeUB2gHb
+        Af8B5AHjAeEB/wHlAeQB4QH/AeEB0gHVAf8B6wGFAZkC/wGVAZsB/wH1AZcBnAH/AVsCWgHZDAABWgFg
+        AWQB3gHIA/8B0gP/AcED/wG4A/8BrgP/AaUD/wGZA/8BiAH7Av8BagH2Av8BWAHxAv8BRwHuAv8BNAHv
+        Av8BJwHiAv8BQAFMAXAB8wMhATEEAAMvAUoCUwF+AfECEwH1Af8CAAHqAf8CAAHfAf8CAAHXAf8CAAHb
+        Af8CAAHcAf8CCAHXAf8CFwHeAf8CJAHnAf8CQwH0Af8CSAGNAfYDNgFZBAADVAGvAeYBcgEvAf8B4gFV
+        AQAB/wHVAUkBAAH/AdIBSgEAAf8ByAE5AQAB/wHOAVsBHgH/AeUBsAGJAf8BvgE3AQAB/wG5ATkBAAH/
+        AbUBOQEAAf8BsgE2AQAB/wGsATIBAAH/AaoBMwEAAf8BwAFBAQQB/wFdAlkB0gQAAxoBJQFwAUcBWQH1
         Ae0B0wHXAf8B9AH6AfcB/wH1AfQB8wH/AfgC9QH/AvoB+QH/AfMB5gHqAf8B6wGEAZgB/wH+AZQBmgH/
-        AfYBlgGbAf8BWQJXAdkMAAFZAV0BZAHSAcwD/wHaA/8ByQP/AcED/wG4A/8BrwP/AaQD/wGZA/8BiAH7
-        Av8BbQH2Av8BXAHxAv8BSQHwAv8BOgHuAv8BLgFcAZEB+AMuAUgIAAMwAUwCSAGIAfICEAHwAf8CAAHg
-        Af8CAAHVAf8CAAHMAf8CAAHMAf8CAwHUAf8CGAHfAf8CNQHuAf8COQGXAfYDNwFbCAABcQFXAU8B6AHz
-        AYMBLgH/AeABUAEAAf8B2QFPAQAB/wHVAUkBAAH/Ac8BPwEAAf8B2QGFAU8B/wH0Ae8B6QH/AckBWAEc
-        Af8BvgE5AQAB/wG7AT4BAAH/AbQBOwEAAf8BsQE5AQAB/wGqATQBAAH/AcABRwEGAf8BgQE1ASoB9gQA
-        AxoBJQF7AUcBVQL1AdwB4BH/AfkB6wHwAf8B6QGCAZYB/wH+AZMBmQH/AfYBlQGZAf8BWQJXAdkMAAFZ
-        AlsBxAHOAfwB/gH/AeED/wHRA/8BygP/AcED/wG3A/8BrgP/AaQD/wGYA/8BiAH7Av8BbgH1Av8BXAHz
-        Av8BSQH3Av8BJwFwAaMB/AM6AWEMAAMqAUACOAGWAfcCBgHnAf8CIgHoAf8COgHqAf8COgHqAf8CLwHn
-        Af8CIQHnAf8CKQGkAfoCMAExAU0MAAGOAVIBPwH0AfgBhAEpAf8B4gFOAQAB/wHfAVEBAAH/AeEBbQEr
-        Af8B4QF2ATsB/wHfAZkBZwH/AfcB+AH2Af8B9AHuAegB/wHfAaYBgwH/AcsBUAESAf8BxAFGAQUB/wG2
-        AT0BAAH/Aa0BNgEAAf8BvwFGAQQB/wGcAT0BHwH6BAADGgElAXsBRwFVAfUB9wHeAeIR/wH5AewB8AH/
-        AecBggGVAf8B/QGTAZkB/wH2AZUBmQH/AVkCVwHZDAACVgFXAbYB0QH4Av8B8gP/AdoD/wHRA/8BygP/
-        AcAD/wG4A/8BrgP/AaQD/wGYAf4C/wGIAfsC/wFuAfcC/wFbAf4C/wEnAYIBuAH+A0YBgAwAAzIBUAIm
-        AZoB+QI6AfQB/wKFAv8CjwL/Ao4C/wKHAf4B/wJPAfUB/wInAbMB/AM4AV0MAAGOAVUBPwH0AfsBggEl
-        Af8B6AFXAQAB/wHuAZcBWAH/Ae8BqQF2Af8B6wGbAWQB/wHeAY0BVQH/AeIBsAGTAf8B8AHjAdwB/wH8
-        A/8B3gGmAYUB/wHPAVEBFAH/AcoBTQERAf8BtQE6AQAB/wHBAUkBBAH/AZwBQAEgAfoEAAMaASUBeAFF
-        AUwB9QH2Ad4B4RH/AfcB4gHoAf8B6wGBAZMC/wGYAZ4B/wH3AZUBmQH/AVoCWAHYDAABUgJUAaYB2QH4
-        AfsB/wH2AfoB8gH/Ae0B/wH9Af8B3gP/AdAD/wHKA/8BwQP/AbcD/wGtA/8BpAP/AZgB/gL/AYgB+wL/
-        AW4D/wEoAagB2gH/A04BmAgAAzcBWwI3AZkB9wJDAfoB/wKTAv8CoAL/ApYB/QH/ApUB/QH/Ap8C/wKW
-        Af4B/wJiAfsB/wItAasB+wM+AWsIAAFxAVgBUgHmAfwBkgE8Af8B+AGmAWYB/wH2AbsBlwH/AfIBrQGB
-        Af8B6gGbAWMB/wHjAYkBTgH/AeABdQE9Af8B1gF3AUYB/wH1Ae0B5wH/AfIB5AHaAf8BzwFhASsB/wHT
-        AVgBHQH/AccBSwEOAf8BzQFUAQ4B/wGBAUEBMwH0BAADGgElAXgBRgFMAfUB9gHfAeMF/wH9AfoB+wH/
-        AfgB4AHjAf8B7wGuAbYB/wHgAXMBjwH/AeABaQGEAf8B/QGSAZYB/wH3AZMBmAH/A1oB1QwAAk8BUQGc
-        AT0BUgHbAf8BKAEqAcEB/wFeAWkBwQH/AdcC7QH/Ad4D/wHSA/8BygP/AcAD/wG3A/8BrgP/AaQD/wGa
-        A/8BjAP/ATcBvwHnAf8DVAGrBAADNgFZAjYBkwH2AlQB/AH/AqoC/wK0Av8CsAH9Af8CNQHsAf8CLgHq
-        Af8CqwH9Af8CswL/AqwC/wKBAf0B/wI0AbEB+wM+AWsEAAFTAlIBqAHvAakBbQL/AdUBswH/AfsBwAGY
-        Af8B8QGsAYAB/wHfAaQBggH/Ad0BqQGMAf8B5QGUAV0B/wHfAYQBRwH/AewB0QHCAf8B9gHwAewB/wHS
-        AW8BOwH/AdIBYAEmAf8B2AFdASEB/wHjAV0BGwH/AV4BWgFZAc4EAAMaASUBdwFHAVQB9QHtAcsBzwH/
-        Ae8BxgHIAf8B4AGLAZIB/wHNAV8BbgH/AaoBSwFnAf8BbQFCAWwB/wFFATYBZgH/AZMBRQFeAf8B6AFn
-        AXMB/wFnAUcBSQHyAzkBXwMGAQgEAAJTAWYB4wEYARcB8wH/AgEB4wH/AgABwgH/AWsBdgHEAf8B7AH9
-        AfsB/wHfA/8B1wP/AdED/wHJA/8BwgP/AbkD/wGuA/8BpQP/AUoB2QHyAf8DWAHAAzcBWgJCAYsB9AJf
-        Af0B/wK7Av8CyAL/AsQC/wJFAfQB/wIRAZsB+wIhAZYB+AJEAfEB/wLBAv8CxgL/Ar8C/wKUAf4B/wJE
-        AaIB+AI9AT4BagMpAT4BygFwAUIC/wHZAbQC/wHLAaYB/wHpAaUBcgH/AekBzwHBAf8B9gH1AfQB/wHW
-        AYgBVAH/AdsBiAFTAf8B9wHxAe0B/wHnAcoBuQH/AdMBaQEyAf8B1wFsATYB/wHuAXIBMAH/Ac8BSQEV
-        Af8DOwFjBAADGgElAXkCUQH0Ac0BYgFoAf8BrwFOAV4B/wGBAUYBaAH/AUUBRAGBAf8BGAE+AYUB/wEH
-        ATwBhgH/AQ8BTgGWAf8BNwGGAbYB/wGYAaoBvwH/AccBhwGeAf8BaQEvAUYB+wNAAXAEAAIrAb8B/AEq
-        ASsB8gH/AjwB6wH/AgAB3gH/AUEBRQHKAf8B9AH/AfQB/wHsA/8B0QP/AbgD/wGZAfUC/wFyAeoB/AH/
-        AVcB2gH2Af8BQgG6AdoB/QEzAZwBzAH7ATMBeQGpAfYDSgGLAkMBhQH2AmYC/wLUAv8C3wL/AtMC/wJV
-        AfcB/wIvAYsB9AMzAVMDLQFFAjkBiAHyAloB9AH/AtIC/wLZAv8C1gL/AqoC/wJDAaMB+wMGAQgBUgJQ
-        AaMB6AGoAXIC/wHcAbgB/wH1Ab4BlQH/Ad4BqwGOAf8B8AHmAeMB/wHlAcoBuwH/AewB2QHRAf8B6gHa
-        AdIB/wHUAYcBVgH/Ad0BgQFGAf8B7QGKAUgB/wHsAW4BLgH/AVsCWQHDAw0BEQQAAxoBJQFkAUQBWQH1
-        AUsBQwFrAf8BHAFHAXUB/wEAAVIBpAH/AQABVQGqAf8BFQFzAbwB/wE6AacB2gH/AVsB0wH1Af8BcQHy
-        Av8BgQH7Av8BjwHtAv8BXAFdAY4B+AMvAUoEAAIfAaAB+gIPAe4B/wEmASUB+AH/AREBDgHqAf8BPQFK
-        AboB/QFlAYsBogH0AVkBdwGKAewBWAFoAXMB4gFZAVwBXwHMA1YBswNQAZ0DRQF9AzkBXwMwAUsDIAEu
-        BAACWQFcAckCUwHtAf8CyQL/Au0C/wJhAfsB/wIuAZAB9gM2AVkIAAMvAUoCQQGGAfECbAH4Af8C6wL/
-        At4C/wKLAfMB/wJaAWIB1QQAAxYBHgFdAlgBywHpAagBcwL/Ad4BuAH/AfYBwQGaAf8B4AGlAYMB/wHm
-        AbsBpAH/AeIBrwGUAf8B2gGOAVwB/wHsAZkBXwH/AfkBoAFgAf8B7AGBAT4B/wFmAVYBVAHeAx8BLQgA
-        A0UBfQFWAaQB3gH+ASkBmgHXAf8BCAFtAcEB/wEYAZwB4AH/ATkBvgHuAf8BWAHgAf4B/wFrAfAC/wFw
-        AekC/wFsAbcB4AH+AVgBcwGMAe8BVgJYAbkDLwFKCAACTwFQAZsCFwGhAfwBJwElAccB/gJWAWEB3AEw
-        AjEBTQMYASEDEQEXAwkBDCAAAxYBHwJZAVsBwwJSAesB/wJgAv8CMwGNAfYDNwFbEAADMAFMAkUBhgHx
-        AocB/QH/AoQB8gH/AlkBXgHMAx4BKwgAAxYBHgFVAlMBrQHOAXUBRgH/AfQBvAGRAv8ByAGbAf8B/QG9
-        AY4B/wH9AbUBhQL/AbMBgAH/AfQBnQFgAf8B0AFhATAB/wFYAlYBvAMcASgMAAFXAWgBhAHrAZYD/wGD
-        AfoC/wEwAWwBsQH6AT4BewGzAfgBXQHpAv8BVQHFAfYB/wFGAXsBnwH1AlkBWwHEA0ABcQMRARdUAAMW
-        AR8CWQFbAcMCPgGDAfQCNQE2AVgYAAMwAUsCRwGEAfICWQFgAc8DHQEpEAADBwEJAy8BSgNWAbYBfwFY
-        AUoB7wGmAVwBQwH6AaUBVwFAAfoBhgFTAUcB8QFbAlkBxAM2AVkDCgEOEAADQwF3AVkBXAFiAc8BUgGI
-        Ab8B9wJIAUkBhwM7AWQBWQFdAWYB1wNLAY4DIQEwUAADOAFeAUoBWQGAAesCVQFXAboDOgFhA1gBxwNZ
-        AcwDWgHKA1oBygNaAcoDWgHKA1oBygNaAcoDWgHKA1oBygNaAcoDWgHKA1oBzgNZAcMDNAFVDAADHAEo
-        A1QBqwMzAVI0AAMRARcDOAFdA04BmQNWAbMDVgG8A1YBuwNVAbIDTgGUAzQBVAMMARA8AAM0AVQBPAFY
-        AYcB7wEyAdEC/wFPAXUBlAHxA2UB7gPiAf8D3QH/A9oB/wPaAf8D2AH/AtsB2gH/At8B2gH/At0B2gH/
-        AtgB1wH/A9UB/wPUAf8D0wH/A+AB/wOZAf8DVwG9CAADGAEhAVQBWwFSAeEBFAGAATkB/wFDAVABSAHt
-        AysBQygAAwEBAgNDAXcBZQFdAVcB5QGvAW8BTQH9AdEBawEhAf8B4AFyASIB/wHoAXYBJAH/AegBdAEl
-        Af8B2wFuASUB/wG6AVkBGwH/AXYBQgEeAfoBWAFWAVUB2QM4AV0UAAMjATMDRwGCAyABLgMBAQIDBgEI
-        AwwBEAMDAQQEAAMyAVEBPAFYAY0B7wEwAc0C/wFBAY0BtwH5AjwBPQFoA40B9wT/A/QB/wPzAf8C8QHz
-        Af8C+AHzAf8C8QHoAf8C3gHfAf8D3gH/AukB4QH/AvEB6AH/Au4B6gH/AuYB5wH/A/UB/wPGAf8DWQHD
-        BAADEgEZAVQBWwFSAeEBKAFSAQAB/wEoAYABWAH/AQABpgGoAf8BQwFPAUgB7QMtAUYkAAFQAk8BmwG9
-        AX8BUgL+AeMBwgL/AdIBpQH/AegBawEHAf8B5wF1ASIB/wHwAYYBLwH/AfYBkgFGAf8B9QGaAVUB/wHw
-        AZgBVgH/AfIBlQFJAf8B0wFjARMB/wFWATgBJAH3AzsBZAwAAwQBBgNXAboB6AG4AboB/wFrAmEB5ANU
-        Aa4DXAHJAWECYAHeA1kBvgM/AW8BWgJcAc0BcwHoAv8BPgGTAboB+AM9AWkEAAOFAfYD+wH/A+oB/wLq
-        AesB/wLxAewB/wLUAdwB/wJLAdQB/wIpAecB/wJHAeQB/wJsAdcB/wKkAc0B/wPQAf8C5QHfAf8D7QH/
-        A70B/wNWAcEDFAEbAVYBWAFVAdkBKgFXAQoB/wE/AVQBEwH/ATEBPwEAAf8BGgFyAVsB/wEAAZ4BpwH/
-        AUABTAFHAe4DLQFGIAABrwF9AVIB+gH4AcgBkQH/AfYB2gG5Af8B7wHDAZgB/wHVAWwBGgH/AdYBkwFV
-        Af8B3gGdAWMB/wHgAZoBYAH/AdIBjAFTAf8B4AGTAVYB/wHtAaABYgH/AfUBjwE2Af8BzgFXAQAB/wNW
-        AbsMAAMzAVIBvwKUAfsB9gL6Af8BwAG5AboB/wHIAb0BswH/AeoB4QHRAf8B8AHnAdYB/wHaAdIBwwH/
-        AZUBkAGHAf8BoQGeAZAB/wFfAWEBagHbAzsBYwgAA4cB9gP8Af8C7AHtAf8D7gH/AvgB6AH/AnUB2gH/
-        AgAB+QH/AgAC/wIAAv8CGQL/AkgB9gH/AnYB2AH/AsQBzgH/AvUB7wH/A8AB/wNWAcEBVAFYAVQB3QEX
-        AUUBAAH/AUABSwERAf8BQwFSARcB/wFBAVUBLwH/AVwBaAEvAf8BJwGFAWEB/wECAZsBrAH/AUIBTgFI
-        Ae0DLQFGHAAB0wGfAX8B/gHzAc4BqgH/AfQB2wG+Af8B7AHEAZ8B/wHOAXcBNAH/AdoBoQFnAf8B3AGp
-        AYEB/wHcAaYBdwH/AdkBlwFcAf8B3QGNAUkB/wHfAZMBUAH/Ad8BjQE+Af8B0QFgAQMB/wNYAcAIAAMB
-        AQIDVQGwAfUB3gHgAf8BxAHFAcYB/wHNAccBugL/AfYB3AL/AfMB2wL/AfIB2wL/AfgB4QH/AfkB7QHW
-        Af8BmQGUAYEB/wNEAXoMAAOIAfYD/QH/Au0B7gH/AvUB8QH/AusB4gH/AkYB4QH/AgAB/gH/AgAC/wIA
-        Av8CAAL/AgkC/wI8Af0B/wJ3AdYB/wPkAf8CxwHEAf8DVgHBAVgBWgFWAdsBKgFHAQUB/wE7AUABBwH/
-        AUEBRwEqAf8CTAFVAf8BXgJsAf8BWAFpASsB/wEaAXQBXAH/AQABlAGqAf8BPAFKAUYB7wMuAUgYAAHN
-        AZYBdQH+Af0B6wHZAf8B/QHuAd4B/wHyAdABrQH/AdsBlgFMAf8B2wGmAWwB/wHWAaUBcgH/AeIBrwGF
-        Af8B4gGlAWcB/wHcAZABRwH/Ad4BlQFLAf8B2wGLATEB/wHNAVwBAAH/A1YBvggAAzABTAGfAoIB9QHv
-        AeIB5QH/AcIBugG1Af8B+QHnAcoC/wHoAckC/wHhAb8C/wHgAb8C/wHkAcUC/wH0AdcB/wHQAccBrgH/
-        A1oB2AE2AjUBWAMQARUEAAOJAfYC/gH9Af8C8gHwAf8C+AHyAf8C6AHjAf8CRQHkAf8CAAL/AgAC/wIA
-        Av8CAAL/AgAC/wIDAv8CNwHpAf8CywHfAf8CzgHEAf8DVgHBAxABFgFYAVsBVwHWATMBVAEQAf8BbAFo
-        AVgB/wFWAVMBVgH/AlABVQH/AVsBaQFqAf8BUQFoASYB/wEpAYYBZwH/AQABjAGfAf8BQAFKAUIB7gMr
-        AUMUAAHIAacBZwH9Af8B7QHYAf8B/AHrAdsB/wH+AeQByQH/Ae8BuwGIAf8B7AG2AYAB/wHUAaMBagH/
-        AdYBrAGDAf8B5wG0AYEB/wHxAaoBXAH/AeYBoAFSAf8B2wGNATQB/wHNAV0BAAH/A1YBvgQAAwcBCgNV
-        Aa0B+QHWAdMB/wHnAdUB1gH/AdQBxgG7Av8B3wG2Av8B0wGkAv8B0AGeAv8BzgGdAv8BzwGhAv8B4QG4
-        Af8B5AHQAbEB/wGTAYQBdwH/AcwBkQGJAf8BXQJYAcsDKQE+A4kB9gP9Af8C7QHvAf8C9wHzAf8C8QHq
-        Af8CagHlAf8CBgH9Af8CAQL/AgAC/wIAAfsB/wIAAfgB/wIAAfUB/wJKAd8B/wPqAf8CygHGAf8DVgHB
-        BAADDwEUAloBWQHVATsBYQEcAf8BbgFvAVkB/wFmAWIBZgH/AWMBYQFrAf8BXgFpAWQB/wE6AWIBAgH/
-        AR0BgAEtAf8BAAGbAW0B/wFCAVABSgHtAy4BSBAAAcgBpwFmAf0B/wHrAdYB/wH9AewB2gH/Af0B5wHQ
-        Af8B4QG7AZMB/wHnAbwBjwH/Ad4BsQGDAf8B0gGyAZIB/wHYAa0BgAH/AeQBmwFLAf8B4AGXAUgB/wHf
-        AYYBIwH/Ac8BXgEAAf8DVgG+BAADLgFHAagBiAGHAfcB/wHqAd4B/wHnAc8BzAH/AdIBvwG2Av8BzwGe
-        Af8B/gHLAZgB/wH+Ac0BoAL/AdEBowL/Ac4BnAL/AdUBnwH/Ad0BtwGOAf8BjwGNAYoB/wH6A/8B6gGo
-        AaQB/wFAAj8BbwKNAYsB9gLnAfwB/wKbAd0B/wLYAekD/wHxAf8CnQHmAf8CNgH8Af8CGgL/AhMB8gH/
-        AnIB4QH/AqEB3wH/AqwB3gH/At8B4QH/AvkB9AH/A8YB/wNWAcEIAAMKAQ4BWAFbAVcB1gE3AWQBFQH/
-        AXMBdAFdAf8BcAFtAW8B/wE6AV0BHgH/ATwBaQEcAf8BWwGHASsB/wErAaQBaAH/AQABpwGrAf8BQgFQ
-        AUgB7QMtAUUMAAHKAagBZgH9Af8B6wHUAf8B/AHrAdsC/wHrAdMB/wHyAdYBtAH/AeIBwgGfAf8B5wHC
-        AZsB/wHYAbMBiwH/Ad0BqgFtAf8B4wGcAUwB/wHhAZoBSwH/AeABdQESAf8B0QFcAQAB/wNWAb4EAANX
-        AboB3AGwAagB/wHbAbIBqAH/AcsBoQGeAf8BtwGoAacB/wHzAcQBowL/AdIBqgH/AfwB2AG8Av8B3gHB
-        Av8B5AG/Av8B1wGkAf8BtAGPAWkB/wGgAaMBpQL/AfEB8AH/AWACXAHUAxgBIgKNAYsB9gL5Av8CxAHo
-        Af8CvgHaAf8C2AHqAf8ChwHwAf8CVQL/AiwB+wH/AoIB4gH/Av4B5wH/Av0B6wH/AvcB6gH/AusB6AH/
-        A/QB/wPIAf8DVgHBDAADDwEUAlkBVgHXATsBagEZAf8BRQFoAR8B/wE6AWUBHwH/AWICZAH/AWgBgAGB
-        Af8BVgGJASoB/wEXAZgBVwH/AQABngGpAf8BQgFPAUoB7QMrAUMIAAHEAZIBbQH8Af8B6gHQAf8B/QHr
-        AdgC/wHmAcsB/wH+AdUBqQH/AfEBwwGbAf8B6QG1AYkB/wHiAZwBVQH/AfQBpgFWAf8B+AGpAVUB/wHn
-        AZ8BTQH/Ad8BdwEVAf8B0AFdAQAB/wNWAb4EAAFqAmEB5AHHAZ4BmwH/AeQByAHHAf8B8wLmAf8B1AHV
-        AdcB/wHEAbQBrAH/AfIByQGtAv8B3wHIAv8B3gHLAf8B+wHaAbwB/wHMAaYBiwH/AY4BgwGBAf8B5AHj
-        AeUB/wHRAakBqAH9A0ABcAQAA40B9gb/AfkB/wLbAeUB/wKNAdIB/wKGAfYB/wJhAv8CMAH2Af8CqwHn
-        Af8C/AHtAf8C7AHtAf8C6gHrAf8D6AH/A/YB/wPJAf8DVgHBEAADCgEOAVgBWgFWAdgBJQFsAQAB/wFy
-        AYgBWwH/AXIBaQFzAf8BVwFVAVwB/wFZAWsBaAH/AU0BiAElAf8BGwGZAV4B/wEAAZUBqwH/AUIBUAFK
-        Ae0DNAFVBAABxAGVAXAB/AH/AeoBzwH/AfkBzgGnAf8B+AHKAaQB/wHrAbwBmAH/AeUBuwGeAf8B6wHE
-        AaoB/wHuAcEBoQH/AeoBsgGLAf8B7wGoAW4B/wHvAZIBRAH/Ae0BgAERAf8B0QFgAQAB/wNWAb4EAAMt
-        AUYDUwGqAawBhQGDAfkB7wHDAcAC/wHpAecB/wHVAdQB1QH/Ab8BtAGvAf8BzgGyAaUB/wHQAa0BoAH/
-        AbYBlgGLAf8BnQGRAZAB/wHVAckBywL/Ae0B6wH/AV8BWgFZAdIDEgEYBAADjQH2BP8D+AP/AfsB/wLG
-        AeIB/wKKAdsB/wKOAfYB/wKSAfAB/wLiAe4B/wL0Ae8B/wPtAf8D6wH/A+oB/wP3Af8DywH/A1YBwRQA
-        AwoBDgFYAVsBVwHWAT4BiAEgAf8BcwGHAV0B/wFcAVgBWwH/AUoBRwFSAf8BUgJeAf8BOQGFAQkB/wEf
-        AaABSgH/AREBlQE4Af8DUwGqBAABxQGXAW8B/AH/AcEBiQH/Ac8BiQFIAf8D3wH/Ac8B1QHbAf8BwQHG
-        AckB/wHgAeQB6AH/AdUB3AHiAf8BwQHMAdUB/wHRAdsB4AH/AdgBwAGyAf8B2QFrASoB/wHiAWkBDgH/
-        A1cBvwgAAwcBCQMmATkDUAGeAYMBZQFkAe8B6wG3AbQB/wHrAdYB1QH/AdsB1wHWAf8B0gLXAf8BygGw
-        AbMB/wHnAb8BugL/AfIB6wH/AeoBsAGrAf8DRAF6CAADjQH2BP8D+QH/AvkB+AH/Av0B+gH/AssB4AH/
-        AscB3AH/AvsB8gH/AvYB8wH/Au8B8AH/A+8B/wPtAf8D6wH/A/kB/wPNAf8DVgHBGAADEQEXAVkBXQFW
-        AdcBOwGMARwB/wFoAXQBUQH/AU8BRgFRAf8BSwFhAT4B/wFUAaUBLQH/ASgBnwEAAf8BVAFbAVQB4QMd
-        ASoEAAHIAYsBVgH8AewBlAE+Af8BrQFoATUB/wHFAbsBtAH/Ac8BywHIAf8B3gHmAeoB/wHcAeMB6AH/
-        AbsBwAHEAf8BngGCAWsB/wGoAYABZgH/AaIBdgFqAf8BmwE+ARoB/wHpAW4BIwH/A1YBvhQAAyMBNANM
-        AZMBaAJfAdsB5gGwAa0B/wH6AeYB5AL/Ae0B7gH/AfwBwwG9Av8B3QHPAf8BZQFeAVoB3QMTARoIAAOQ
-        AfYE/wP7Af8D+QH/AvoB+QH/AvwB+wH/AqwBzwH/AroB1AH/AvkB9gH/A/EB/wPvAf8D7QH/A+sB/wP3
-        Af8DzwH/A1cBwhwAAwcBCgFXAVsBVwHWATgBjQEbAf8BUQGAAS4B/wFlAa0BQwH/AUQBsAEtAf8BVAFb
-        AVQB4QMVAR0IAAFrAWMBWAHdAfUBsQFnAf8B3gGKATkB/wHSAWYBFAH/Ab8BZgEoAf8BygGxAaAB/wHI
-        AbUBqAH/AasBbgFKAf8BnwE0AQAB/wGbASQBAAH/AZcBJAEAAf8BzQFYAR8B/wG/AW4BLQH+A0EBcxwA
-        Ax0BKQFHAkYBgAFmAmEB2gHgAagBpwH/Af0BzgHMAf8B5wGdAZYB/wNAAXAMAAOZAfgU/wL4AfwB/wLz
-        AfoD/wH+Af8D/QH/A/wB/wP6Af8D+QX/A9MB/wNXAcIgAAMPARQBWQFeAVkB1QEqAZwBDAH/ASgBlgEZ
-        Af8BVgFaAVYB2QMWAR8MAAMlATcBcQFlAVoB4AHzAaoBWQH/AfMBnwFKAf8B6QGJATAB/wHVAXQBLQH/
-        AcsBaQEoAf8BywFcARUB/wHKAV8BHwH/AdEBZgEnAf8B2wFyAS8B/wGiAWUBPQH4A0wBkygAAxoBJAFA
-        Aj8BbwFlAl4B2QFeAlkBzAMTARoMAANbAcsDswH+A7gB/QO4Af0DuAH9A7gB/QO4Af0DuAH9A7gB/QO4
-        Af0DuAH9A7gB/QO5Af0DuwH+A3QB9QM7AWUkAAMNARIBVgFhAVYB3AFWAVwBVQHcAxABFhQAAw0BEgND
-        AXcCWwFZAcQBfAFpAVYB5wGeAXUBTAH0AbMBewFCAfgBowFzAUgB9gGJAWcBTwHuAWIBYAFYAdYBUQJP
+        AfYBlgGbAf8BWwJaAdkMAAFZAl0B0gHMA/8B2gP/AckD/wHBA/8BuAP/Aa8D/wGkA/8BmQP/AYgB+wL/
+        AWoB9gL/AVkB8QL/AUYB8AL/ATcB7gL/ATcBXAGIAfgDLgFICAADMAFMAksBfQHyAg0B8AH/AgAB4AH/
+        AgAB1QH/AgABzAH/AgABzAH/AgAB1AH/AhUB3wH/AjIB7gH/Aj8BjQH2AzcBWwgAAWgBVwFWAegB8wGD
+        ASsB/wHgAU0BAAH/AdkBTAEAAf8B1QFGAQAB/wHPATwBAAH/AdkBhQFMAf8B9AHvAekB/wHJAVUBGQH/
+        Ab4BNgEAAf8BuwE7AQAB/wG0ATgBAAH/AbEBNgEAAf8BqgExAQAB/wHAAUQBAwH/AXkBOAExAfYEAAMa
+        ASUBcAFHAVgC9QHcAeAR/wH5AesB8AH/AekBggGWAf8B/gGTAZkB/wH2AZUBmQH/AVsCWgHZDAABWQJb
+        AcQBzgH8Af4B/wHhA/8B0QP/AcoD/wHBA/8BtwP/Aa4D/wGkA/8BmAP/AYgB+wL/AWsB9QL/AVkB8wL/
+        AUYB9wL/ASoBbQGaAfwDOgFhDAADKgFAAjsBjAH3AgMB5wH/Ah8B6AH/AjcB6gH/AjcB6gH/AiwB5wH/
+        Ah4B5wH/AikBngH6AjABMQFNDAABgwFSAUIB9AH4AYQBJgH/AeIBSwEAAf8B3wFOAQAB/wHhAWoBKAH/
+        AeEBcwE4Af8B3wGZAWQB/wH3AfgB9gH/AfQB7gHoAf8B3wGmAYMB/wHLAU0BDwH/AcQBQwECAf8BtgE6
+        AQAB/wGtATMBAAH/Ab8BQwEBAf8BlQFAASIB+gQAAxoBJQFwAUcBWAH1AfcB3gHiEf8B+QHsAfAB/wHn
+        AYIBlQH/Af0BkwGZAf8B9gGVAZkB/wFbAloB2QwAA1YBtgHRAfgC/wHyA/8B2gP/AdED/wHKA/8BwAP/
+        AbgD/wGuA/8BpAP/AZgB/gL/AYgB+wL/AWsB9wL/AVgB/gL/AScBfwGyAf4DRgGADAADMgFQAikBkAH5
+        AjcB9AH/AoUC/wKPAv8CjgL/AocB/gH/AkwB9QH/AioBrQH8AzgBXQwAAYMBUgFCAfQB+wGCASIB/wHo
+        AVQBAAH/Ae4BlwFVAf8B7wGpAXMB/wHrAZsBYQH/Ad4BjQFSAf8B4gGwAZMB/wHwAeMB3AH/AfwD/wHe
+        AaYBhQH/Ac8BTgERAf8BygFKAQ4B/wG1ATcBAAH/AcEBRgEBAf8BlQFDASMB+gQAAxoBJQFvAUUBTAH1
+        AfYB3gHhEf8B9wHiAegB/wHrAYEBkwL/AZgBngH/AfcBlQGZAf8DWgHYDAABUgJUAaYB2QH4AfsB/wH2
+        AfoB8gH/Ae0B/wH9Af8B3gP/AdAD/wHKA/8BwQP/AbcD/wGtA/8BpAP/AZgB/gL/AYgB+wL/AWsD/wEl
+        AagB2gH/A04BmAgAAzcBWwI6AY0B9wJAAfoB/wKTAv8CoAL/ApYB/QH/ApUB/QH/Ap8C/wKWAf4B/wJf
+        AfsB/wItAZ8B+wM+AWsIAAFpAlgB5gH8AZIBOQH/AfgBpgFjAf8B9gG7AZcB/wHyAa0BgQH/AeoBmwFg
+        Af8B4wGJAUsB/wHgAXIBOgH/AdYBdAFDAf8B9QHtAecB/wHyAeQB2gH/Ac8BXgEoAf8B0wFVARoB/wHH
+        AUgBCwH/Ac0BUQELAf8BeQFEAT0B9AQAAxoBJQFvAUYBTAH1AfYB3wHjBf8B/QH6AfsB/wH4AeAB4wH/
+        Ae8BrgG2Af8B4AFwAY8B/wHgAWYBhAH/Af0BkgGWAf8B9wGTAZgB/wNaAdUMAAJPAVEBnAE6AU8B2wH/
+        ASUBJwHBAf8BWwFmAcEB/wHXAu0B/wHeA/8B0gP/AcoD/wHAA/8BtwP/Aa4D/wGkA/8BmgP/AYwD/wE0
+        Ab8B5wH/A1QBqwQAAzYBWQI5AYkB9gJRAfwB/wKqAv8CtAL/ArAB/QH/AjIB7AH/AisB6gH/AqsB/QH/
+        ArMC/wKsAv8CgQH9Af8CMgGlAfsDPgFrBAABUwJSAagB7wGpAWoC/wHVAbMB/wH7AcABmAH/AfEBrAGA
+        Af8B3wGkAYIB/wHdAakBjAH/AeUBlAFaAf8B3wGEAUQB/wHsAdEBwgH/AfYB8AHsAf8B0gFsATgB/wHS
+        AV0BIwH/AdgBWgEeAf8B4wFaARgB/wFeAlwBzgQAAxoBJQFvAUcBVwH1Ae0BywHPAf8B7wHGAcgB/wHg
+        AYsBkgH/Ac0BXAFrAf8BqgFIAWQB/wFqAT8BaQH/AUIBMwFjAf8BkwFCAVsB/wHoAWQBcAH/AWcBSgFM
+        AfIDOQFfAwYBCAQAAlgBYgHjARUBFAHzAf8CAAHjAf8CAAHCAf8BaAFzAcQB/wHsAf0B+wH/Ad8D/wHX
+        A/8B0QP/AckD/wHCA/8BuQP/Aa4D/wGlA/8BRwHZAfIB/wNYAcADNwFaAkUBfwH0AlwB/QH/ArsC/wLI
+        Av8CxAL/AkIB9AH/AhcBlgH7AigBkAH4AkEB8QH/AsEC/wLGAv8CvwL/ApQB/gH/AkQBmgH4Aj0BPgFq
+        AykBPgHKAW0BPwL/AdkBtAL/AcsBpgH/AekBpQFvAf8B6QHPAcEB/wH2AfUB9AH/AdYBiAFRAf8B2wGI
+        AVAB/wH3AfEB7QH/AecBygG5Af8B0wFmAS8B/wHXAWkBMwH/Ae4BbwEtAf8BzwFGARIB/wM7AWMEAAMa
+        ASUBcwJSAfQBzQFfAWUB/wGvAUsBWwH/AYEBQwFlAf8BQgFBAYEB/wEVATsBhQH/AQQBOQGGAf8BDAFL
+        AZYB/wE0AYYBtgH/AZgBqgG/Af8BxwGHAZ4B/wFiAS8BRgH7A0ABcAQAAisBuQH8AScBKAHyAf8COQHr
+        Af8CAAHeAf8BPgFCAcoB/wH0Af8B9AH/AewD/wHRA/8BuAP/AZkB9QL/AW8B6gH8Af8BVAHaAfYB/wFA
+        AbcB0QH9ATIBlgHCAfsBNgFzAZcB9gNKAYsCSAF7AfYCYwL/AtQC/wLfAv8C0wL/AlIB9wH/AjsBfwH0
+        AzMBUwMtAUUCRAF9AfICVwH0Af8C0gL/AtkC/wLWAv8CqgL/AkMBmwH7AwYBCAFSAlABowHoAagBbwL/
+        AdwBuAH/AfUBvgGVAf8B3gGrAY4B/wHwAeYB4wH/AeUBygG7Af8B7AHZAdEB/wHqAdoB0gH/AdQBhwFT
+        Af8B3QGBAUMB/wHtAYoBRQH/AewBawErAf8BWwJZAcMDDQERBAADGgElAV4BRAFZAfUBSAFAAWgB/wEZ
+        AUQBcgH/AQABTwGkAf8BAAFSAaoB/wESAXABvAH/ATcBpwHaAf8BWAHTAfUB/wFuAfIC/wGBAfsC/wGP
+        Ae0C/wJcAYUB+AMvAUoEAAIiAZoB+gIMAe4B/wEjASIB+AH/AQ4BCwHqAf8BQAFHAbcB/QFlAX8BkgH0
+        AVkBbgF8AewBXAFjAWgB4gFZAlwBzANWAbMDUAGdA0UBfQM5AV8DMAFLAyABLgQAAlkBXAHJAlAB7QH/
+        AskC/wLtAv8CXgH7Af8CMgGFAfYDNgFZCAADLwFKAkcBfgHxAmkB+AH/AusC/wLeAv8CiwHzAf8CWgFe
+        AdUEAAMWAR4BWwJYAcsB6QGoAXAC/wHeAbgB/wH2AcEBmgH/AeABpQGDAf8B5gG7AaQB/wHiAa8BlAH/
+        AdoBjgFZAf8B7AGZAVwB/wH5AaABXQH/AewBgQE7Af8BYAFaAVgB3gMfAS0IAANFAX0BVgGeAdgB/gEm
+        AZoB1wH/AQUBagHBAf8BFQGcAeAB/wE2Ab4B7gH/AVUB4AH+Af8BaAHwAv8BbQHpAv8BbAGxAdoB/gFY
+        AWsBfgHvAVYCWAG5Ay8BSggAAk8BUAGbAhoBmAH8AScBJQHBAf4CWgFhAdwBMAIxAU0DGAEhAxEBFwMJ
+        AQwgAAMWAR8CWQFbAcMCTwHrAf8CXQL/AjYBgQH2AzcBWxAAAzADTAF+AfEChwH9Af8ChAHyAf8CWQFc
+        AcwDHgErCAADFgEeAVUCUwGtAc4BcgFDAf8B9AG8AZEC/wHIAZsB/wH9Ab0BjgH/Af0BtQGFAv8BswGA
+        Af8B9AGdAV0B/wHQAV4BLQH/AVgCVgG8AxwBKAwAAVkBZAF4AesBlgP/AYMB+gL/ATABaQGoAfoBPgF4
+        AaQB+AFaAekC/wFSAcUB9gH/AUYBcAGSAfUCWQFbAcQDQAFxAxEBF1QAAxYBHwJZAVsBwwJBAXsB9AI1
+        ATYBWBgAAzABSwJKAXsB8gJZAVwBzwMdASkQAAMHAQkDLwFKA1YBtgFzAVgBTQHvAaABVgFGAfoBnwFS
+        AUMB+gF+AVMBTwHxAVsCWQHEAzYBWQMKAQ4QAANDAXcBWQFcAV8BzwFSAYUBrQH3AkgBSQGHAzsBZAFZ
+        AV0BYAHXA0sBjgMhATBQAAM4AV4BUwFZAXYB6wJVAVcBugM6AWEDWQHHA1kBzANaAcoDWgHKA1oBygNa
+        AcoDWgHKA1oBygNaAcoDWgHKA1oBygNaAcoDXAHOA1kBwwM0AVUMAAMcASgDVAGrAzMBUjQAAxEBFwM4
+        AV0DTgGZA1YBswNWAbwDVgG7A1UBsgNOAZQDNAFUAwwBEDwAAzQBVAFGAVgBewHvAS8B0QL/AVMBcAGG
+        AfEDYQHuA+IB/wPdAf8D2gH/A9oB/wPYAf8C2wHaAf8C3wHaAf8C3QHaAf8C2AHXAf8D1QH/A9QB/wPT
+        Af8D4AH/A5kB/wNXAb0IAAMYASEBWgFbAVgB4QERAYABNgH/AUwBUwFQAe0DKwFDKAADAQECA0MBdwFl
+        AV4BWwHlAawBaQFKAf0B0QFoAR4B/wHgAW8BHwH/AegBcwEhAf8B6AFxASIB/wHbAWsBIgH/AboBVgEY
+        Af8BcwFFASEB+gFbAVkBWAHZAzgBXRQAAyMBMwNHAYIDIAEuAwEBAgMGAQgDDAEQAwMBBAQAAzIBUQFG
+        AVgBfwHvAS0BzQL/AUEBigGtAfkCPAE9AWgDiAH3BP8D9AH/A/MB/wLxAfMB/wL4AfMB/wLxAegB/wLe
+        Ad8B/wPeAf8C6QHhAf8C8QHoAf8C7gHqAf8C5gHnAf8D9QH/A8YB/wNZAcMEAAMSARkBWgFbAVgB4QEl
+        AU8BAAH/ASUBgAFVAf8BAAGmAagB/wFMAVIBUAHtAy0BRiQAAVACTwGbAbcBfwFSAv4B4wHCAv8B0gGl
+        Af8B6AFoAQQB/wHnAXIBHwH/AfABhgEsAf8B9gGSAUMB/wH1AZoBUgH/AfABmAFTAf8B8gGVAUYB/wHT
+        AWABEAH/AVMBOwEwAfcDOwFkDAADBAEGA1cBugHoAbgBugH/AWQCYQHkA1QBrgNcAckDYAHeA1kBvgM/
+        AW8BWgJcAc0BcAHoAv8BPgGLAawB+AM9AWkEAAN7AfYD+wH/A+oB/wLqAesB/wLxAewB/wLUAdwB/wJI
+        AdQB/wImAecB/wJEAeQB/wJpAdcB/wKkAc0B/wPQAf8C5QHfAf8D7QH/A70B/wNWAcEDFAEbAVkBWwFY
+        AdkBJwFUAQcB/wE8AVEBEAH/AS4BPAEAAf8BFwFvAVgB/wEAAZ4BpwH/AUkBUwFNAe4DLQFGIAABpgF6
+        AU8B+gH4AcgBkQH/AfYB2gG5Af8B7wHDAZgB/wHVAWkBFwH/AdYBkwFSAf8B3gGdAWAB/wHgAZoBXQH/
+        AdIBjAFQAf8B4AGTAVMB/wHtAaABXwH/AfUBjwEzAf8BzgFUAQAB/wNWAbsMAAMzAVIBswKRAfsB9gL6
+        Af8BwAG5AboB/wHIAb0BswH/AeoB4QHRAf8B8AHnAdYB/wHaAdIBwwH/AZUBkAGHAf8BoQGeAZAB/wJf
+        AWMB2wM7AWMIAAN9AfYD/AH/AuwB7QH/A+4B/wL4AegB/wJyAdoB/wIAAfkB/wIAAv8CAAL/AhYC/wJF
+        AfYB/wJzAdgB/wLEAc4B/wL1Ae8B/wPAAf8DVgHBA1gB3QEUAUIBAAH/AT0BSAEOAf8BQAFPARQB/wE+
+        AVIBLAH/AVkBZQEsAf8BJAGFAV4B/wEAAZsBrAH/AUsBUgFQAe0DLQFGHAABzQGZAX8B/gHzAc4BqgH/
+        AfQB2wG+Af8B7AHEAZ8B/wHOAXQBMQH/AdoBoQFkAf8B3AGpAYEB/wHcAaYBdAH/AdkBlwFZAf8B3QGN
+        AUYB/wHfAZMBTQH/Ad8BjQE7Af8B0QFdAQAB/wNYAcAIAAMBAQIDVQGwAfUB3gHgAf8BxAHFAcYB/wHN
+        AccBugL/AfYB3AL/AfMB2wL/AfIB2wL/AfgB4QH/AfkB7QHWAf8BmQGUAYEB/wNEAXoMAAN9AfYD/QH/
+        Au0B7gH/AvUB8QH/AusB4gH/AkMB4QH/AgAB/gH/AgAC/wIAAv8CAAL/AgYC/wI5Af0B/wJ0AdYB/wPk
+        Af8CxwHEAf8DVgHBA1oB2wEnAUQBAgH/ATgBPQEEAf8BPgFEAScB/wJJAVIB/wFbAmkB/wFVAWYBKAH/
+        ARcBcQFZAf8BAAGUAaoB/wFGAU0BSwHvAy4BSBgAAccBkAF1Af4B/QHrAdkB/wH9Ae4B3gH/AfIB0AGt
+        Af8B2wGWAUkB/wHbAaYBaQH/AdYBpQFvAf8B4gGvAYUB/wHiAaUBZAH/AdwBkAFEAf8B3gGVAUgB/wHb
+        AYsBLgH/Ac0BWQEAAf8DVgG+CAADMAFMAZICewH1Ae8B4gHlAf8BwgG6AbUB/wH5AecBygL/AegByQL/
+        AeEBvwL/AeABvwL/AeQBxQL/AfQB1wH/AdABxwGuAf8DWgHYATYCNQFYAxABFQQAA30B9gL+Af0B/wLy
+        AfAB/wL4AfIB/wLoAeMB/wJCAeQB/wIAAv8CAAL/AgAC/wIAAv8CAAL/AgAC/wI0AekB/wLLAd8B/wLO
+        AcQB/wNWAcEDEAEWA1sB1gEwAVEBDQH/AWkBZQFVAf8BUwFQAVMB/wJNAVIB/wFYAWYBZwH/AU4BZQEj
+        Af8BJgGGAWQB/wEAAYwBnwH/AUkBUQFKAe4DKwFDFAABvwGnAWEB/QH/Ae0B2AH/AfwB6wHbAf8B/gHk
+        AckB/wHvAbsBiAH/AewBtgGAAf8B1AGjAWcB/wHWAawBgwH/AecBtAGBAf8B8QGqAVkB/wHmAaABTwH/
+        AdsBjQExAf8BzQFaAQAB/wNWAb4EAAMHAQoDVQGtAfkB1gHTAf8B5wHVAdYB/wHUAcYBuwL/Ad8BtgL/
+        AdMBpAL/AdABngL/Ac4BnQL/Ac8BoQL/AeEBuAH/AeQB0AGxAf8BkwGEAXQB/wHMAZEBiQH/AVsCWAHL
+        AykBPgN9AfYD/QH/Au0B7wH/AvcB8wH/AvEB6gH/AmcB5QH/AgMB/QH/AgAC/wIAAv8CAAH7Af8CAAH4
+        Af8CAAH1Af8CRwHfAf8D6gH/AsoBxgH/A1YBwQQAAw8BFANaAdUBOAFeARkB/wFrAWwBVgH/AWMBXwFj
+        Af8BYAFeAWgB/wFbAWYBYQH/ATcBXwEAAf8BGgGAASoB/wEAAZsBagH/AUsBUwFRAe0DLgFIEAABvwGn
+        AWAB/QH/AesB1gH/Af0B7AHaAf8B/QHnAdAB/wHhAbsBkwH/AecBvAGPAf8B3gGxAYMB/wHSAbIBkgH/
+        AdgBrQGAAf8B5AGbAUgB/wHgAZcBRQH/Ad8BhgEgAf8BzwFbAQAB/wNWAb4EAAMuAUcBngGFAYQB9wH/
+        AeoB3gH/AecBzwHMAf8B0gG/AbYC/wHPAZ4B/wH+AcsBmAH/Af4BzQGgAv8B0QGjAv8BzgGcAv8B1QGf
+        Af8B3QG3AY4B/wGPAY0BigH/AfoD/wHqAagBpAH/AUACPwFvAoEBfwH2AucB/AH/ApsB3QH/AtgB6QP/
+        AfEB/wKdAeYB/wIzAfwB/wIXAv8CEAHyAf8CbwHhAf8CoQHfAf8CrAHeAf8C3wHhAf8C+QH0Af8DxgH/
+        A1YBwQgAAwoBDgNbAdYBNAFhARIB/wFwAXEBWgH/AW0BagFsAf8BNwFaARsB/wE5AWYBGQH/AVgBhwEo
+        Af8BKAGkAWUB/wEAAacBqwH/AUsBUwFQAe0DLQFFDAABwQGoAWAB/QH/AesB1AH/AfwB6wHbAv8B6wHT
+        Af8B8gHWAbQB/wHiAcIBnwH/AecBwgGbAf8B2AGzAYsB/wHdAaoBagH/AeMBnAFJAf8B4QGaAUgB/wHg
+        AXIBDwH/AdEBWQEAAf8DVgG+BAADVwG6AdwBsAGoAf8B2wGyAagB/wHLAaEBngH/AbcBqAGnAf8B8wHE
+        AaMC/wHSAaoB/wH8AdgBvAL/Ad4BwQL/AeQBvwL/AdcBpAH/AbQBjwFmAf8BoAGjAaUC/wHxAfAB/wFg
+        AlwB1AMYASICgQF/AfYC+QL/AsQB6AH/Ar4B2gH/AtgB6gH/AocB8AH/AlIC/wIpAfsB/wKCAeIB/wL+
+        AecB/wL9AesB/wL3AeoB/wLrAegB/wP0Af8DyAH/A1YBwQwAAw8BFANZAdcBOAFnARYB/wFCAWUBHAH/
+        ATcBYgEcAf8BXwJhAf8BZQGAAYEB/wFTAYkBJwH/ARQBmAFUAf8BAAGeAakB/wFLAVIBUQHtAysBQwgA
+        AbwBiQFqAfwB/wHqAdAB/wH9AesB2AL/AeYBywH/Af4B1QGpAf8B8QHDAZsB/wHpAbUBiQH/AeIBnAFS
+        Af8B9AGmAVMB/wH4AakBUgH/AecBnwFKAf8B3wF0ARIB/wHQAVoBAAH/A1YBvgQAAWMCYQHkAccBngGb
+        Af8B5AHIAccB/wHzAuYB/wHUAdUB1wH/AcQBtAGsAf8B8gHJAa0C/wHfAcgC/wHeAcsB/wH7AdoBvAH/
+        AcwBpgGLAf8BjgGDAYEB/wHkAeMB5QH/AcgCqAH9A0ABcAQAA4EB9gb/AfkB/wLbAeUB/wKNAdIB/wKG
+        AfYB/wJeAv8CLQH2Af8CqwHnAf8C/AHtAf8C7AHtAf8C6gHrAf8D6AH/A/YB/wPJAf8DVgHBEAADCgEO
+        A1oB2AEiAWkBAAH/AW8BiAFYAf8BbwFmAXAB/wFUAVIBWQH/AVYBaAFlAf8BSgGIASIB/wEYAZkBWwH/
+        AQABlQGrAf8BSwFTAVEB7QM0AVUEAAG8AYwBbQH8Af8B6gHPAf8B+QHOAacB/wH4AcoBpAH/AesBvAGY
+        Af8B5QG7AZ4B/wHrAcQBqgH/Ae4BwQGhAf8B6gGyAYsB/wHvAagBawH/Ae8BkgFBAf8B7QGAAQ4B/wHR
+        AV0BAAH/A1YBvgQAAy0BRgNTAaoBoQGCAYAB+QHvAcMBwAL/AekB5wH/AdUB1AHVAf8BvwG0Aa8B/wHO
+        AbIBpQH/AdABrQGgAf8BtgGWAYsB/wGdAZEBkAH/AdUByQHLAv8B7QHrAf8BXQFaAVkB0gMSARgEAAOB
+        AfYE/wP4A/8B+wH/AsYB4gH/AooB2wH/Ao4B9gH/ApIB8AH/AuIB7gH/AvQB7wH/A+0B/wPrAf8D6gH/
+        A/cB/wPLAf8DVgHBFAADCgEOA1sB1gE7AYgBHQH/AXABhwFaAf8BWQFVAVgB/wFHAUQBTwH/AU8CWwH/
+        ATYBhQEGAf8BHAGgAUcB/wEOAZUBNQH/A1MBqgQAAb0BjgFsAfwB/wHBAYkB/wHPAYkBRQH/A98B/wHP
+        AdUB2wH/AcEBxgHJAf8B4AHkAegB/wHVAdwB4gH/AcEBzAHVAf8B0QHbAeAB/wHYAcABsgH/AdkBaAEn
+        Af8B4gFmAQsB/wNXAb8IAAMHAQkDJgE5A1ABngF2AmIB7wHrAbcBtAH/AesB1gHVAf8B2wHXAdYB/wHS
+        AtcB/wHKAbABswH/AecBvwG6Av8B8gHrAf8B6gGwAasB/wNEAXoIAAOBAfYE/wP5Af8C+QH4Af8C/QH6
+        Af8CywHgAf8CxwHcAf8C+wHyAf8C9gHzAf8C7wHwAf8D7wH/A+0B/wPrAf8D+QH/A80B/wNWAcEYAAMR
+        ARcBWQFdAVkB1wE4AYwBGQH/AWUBcQFOAf8BTAFDAU4B/wFIAV4BOwH/AVEBpQEqAf8BJQGfAQAB/wFa
+        AVsBWgHhAx0BKgQAAb8BggFRAfwB7AGUATsB/wGtAWUBMgH/AcUBuwG0Af8BzwHLAcgB/wHeAeYB6gH/
+        AdwB4wHoAf8BuwHAAcQB/wGeAYIBaAH/AagBgAFjAf8BogFzAWcB/wGbATsBFwH/AekBawEgAf8DVgG+
+        FAADIwE0A0wBkwFhAl8B2wHmAbABrQH/AfoB5gHkAv8B7QHuAf8B/AHDAb0C/wHdAc8B/wFiAV4BWgHd
+        AxMBGggAA4UB9gT/A/sB/wP5Af8C+gH5Af8C/AH7Af8CrAHPAf8CugHUAf8C+QH2Af8D8QH/A+8B/wPt
+        Af8D6wH/A/cB/wPPAf8DVwHCHAADBwEKA1sB1gE1AY0BGAH/AU4BgAErAf8BYgGtAUAB/wFBAbABKgH/
+        AVoBWwFaAeEDFQEdCAABZAFfAVgB3QH1AbEBZAH/Ad4BigE2Af8B0gFjAREB/wG/AWMBJQH/AcoBsQGg
+        Af8ByAG1AagB/wGrAWsBRwH/AZ8BMQEAAf8BmwEhAQAB/wGXASEBAAH/Ac0BVQEcAf8BuQFuAS0B/gNB
+        AXMcAAMdASkBRwJGAYADYQHaAeABqAGnAf8B/QHOAcwB/wHnAZ0BlgH/A0ABcAwAA5MB+BT/AvgB/AH/
+        AvMB+gP/Af4B/wP9Af8D/AH/A/oB/wP5Bf8D0wH/A1cBwiAAAw8BFAFaAV4BWgHVAScBnAEJAf8BJQGW
+        ARYB/wFZAVsBWQHZAxYBHwwAAyUBNwFmAWIBXQHgAfMBqgFWAf8B8wGfAUcB/wHpAYkBLQH/AdUBcQEq
+        Af8BywFmASUB/wHLAVkBEgH/AcoBXAEcAf8B0QFjASQB/wHbAW8BLAH/AZoBXwE+AfgDTAGTKAADGgEk
+        AUACPwFvAV8CXgHZAVwCWQHMAxMBGgwAA1sBywOtAf4DtQH9A7UB/QO1Af0DtQH9A7UB/QO1Af0DtQH9
+        A7UB/QO1Af0DtQH9A7YB/QO1Af4DbgH1AzsBZSQAAw0BEgFaAWEBWgHcAVoBXAFYAdwDEAEWFAADDQES
+        A0MBdwJbAVkBxAFvAWQBXAHnAY4BbQFRAfQBpAF4AUIB+AGTAWsBSAH2AXwBYQFUAe4CYAFbAdYBUQJP
         AZwDJwE6EAADIwEzA1YBuQNUAasDEQEXAxABFgMgAS4DAQECIwABAQMEBAUBBwMMARADHQEqAysBQwMv
-        AUkDJQE3AxYBHgMSARkDIAEuAy0BRQMyAVADMgFRAy4BSAMiATIMAAMGAQgDUAGkA1kBzwJaAVsBzgFP
-        AVcBaAHoAT0BWQF9AfIBVgFYAVsB4QNZAcwDWwHQA0gBhBgAAwQBBgM0AVQDVgGzAYEBZAFVAecBlQFl
-        AVgB7wGVAWYBWAHvAYEBXwFWAegBVwJWAbgDNgFZAwcBCRAAA10B0gG1ApoB/wF1AmAB/wNQAZ4DWgHb
-        A1YB5QMfASwgAAMDAQQDCgENAxEBFwFAAj8BbgFjAVwBVgHcAWkBWgFTAeQDWQHDA0IBdQM1AVYDRAF8
-        AWACWQHXAagBbQFMAfcBsAF1AUEB+AFsAV0BVAHlA1QBqwNAAXEMAAMYASEBmgKWAfoB3gHOAcgB/wGt
-        AbEBzgH/AVcBwgH5Af8BZgHgAv8BhwGpAeAB/wHkAc4BwwH/AckCwgH/A1UBshQAAxIBGAFTAlIBqAH2
-        AYoBWQH/AfABvwGrAf8B4wHGAcAB/wHVAcABvgH/AdMBvwG9Af8B5AHGAcAB/wHvAcABrQH/AfYBjwFe
-        Af8DVQGyAxgBIQwAAVsCWgHHAcgBswGyAf8BoAGHAYYB/QFfAVYBVAH7AW8CbAH/AV8CWQH+AVcCVgHf
-        A1kByQFaAlkBzQFaAlkBzQFaAlkBzQNbAdADWQHJA0UBfQMGAQgDIgExAzABTAMxAU0BXQFcAVoBzQH+
-        AcYBpgH/AewB0AHFAf8B3AF/AUsB/gNSAakDSgGMAYQBYQFMAe4B9gHCAaUB/wHXAsYB/wHVAcUBxgH/
-        Ae8ByAG0Af8BtwF2AUoB+gNOAZkIAAMEAQYDEAEWAz4BawNEAXkDQgF0AWgBgAGRAfMBdAGlAcoB/wNX
-        AcUDPwFtA0UBfQMhATADCQEMAwYBCAgAAxIBGAFbAlkBwwHzAakBhQH/Ac0BtgGuAf8BxgG8Ab8B/wHy
-        AeoB7QH/AcsBxgHIAf8BxgHCAcMB/wH0AewB7gH/AccBvgHCAf8ByAGyAa4B/wH0AbABjQH/AV4CWAHL
-        AxUBHQgAAw8BFANIAYQDVgG7AXoBfAF/Af4BdQGTAaAB/wF2AaMBrwH/AagBnwGtAf8BwQGOAZoB/wHO
-        AXMBgwH/AdYBaQFvAf8B4QF1AXcB/wHgAXIBdgH/AeABcgGBAf8BZQFCAUUB/QNEAXoDGgElAycBOwMn
-        ATsDSAGEAekBmwFjAf8ByAHFAdAB/wHqAbsBpAH/AV4BXAFaAc4BVgJVAbEB8QGvAYkB/wHGAcEBygH/
-        AdwBvAGuAf8B4QG7AakB/wHEAbwBxAH/AesBvwGqAf8BYAJYAdEEAAFJAkgBiANcAecBWwJYAekBXAJX
-        Ad8BYQJcAdwDWwHZAZYBkAGPAfsBuAGiAZ4B/wFdAVcBVgHtA1sB2QFeAlgB3QNaAeQDYAHrA1sB4QM6
-        AWIDCAELAVQCUgGmAfYBpQFsAf8B1gG9AcMB/wG0AbAB1gH/AtwB2QL/Af4B/AH/AfcC9QH/AvUB9AL/
-        Af0B/AH/A90B/wHaAdMB1wH/AeAByAHFAf8B8wGlAXMB/wNVAbIDCgENBAADUgGoAWABZAFsAewBjQGX
-        AZ0B+wG0AeIB6wH/AbQB8wL/AasB/gL/AZQB9wH6Af8BkQHbAeQB/wGOAbMBwAH/AYYBgQGTAf8BawE7
-        AT4B/AFoAk4B7wHQAlkB/wHeAXYBdwH/A1YBswcAAQEDBwEJAw8BFAFdAVoBWAHNAeIBwwG2Af8B0gHK
-        AdEB/wG3AXcBTQH6AX8BVAE+Ae4B4QHCAbUB/wHPAcYBzAH/AdIBfwFMAf4ByAFhATUB/QHXAcYBxQH/
-        AdoBxQHCAf8BkwFnAUgB8gQAAZwCkAL5AvgB/wHhAt8B/wHcAtoB/wHZAtcB/wHKAscB/wHfAt4B/wHt
-        AusB/wH3AvQB/wH1AvIB/wH2AfMB9AH/Ae4B8AHsAf8BzAHsAdAB/wHRAc8BywH/A1YBuwMwAUsBzgFg
-        AUAB/QHNAaEBigH/AdgB1AHVAf8C1gH7Af8C0AH6A/8B/Qn/Af4C/QL/Av4B/wH+AvwB/wHZAdYB2gH/
-        AcoBoQGOAf8B5wFvAT4B/wE2AjUBWAQAAXsBngGqAvoD/wHaA/8BrwHzAv8BjAHgAv8BiQHqAv8BhwH2
-        Av8BkwH9Av8BngP/AZMB8wH+Af8BVAJXAd8DKQE+AZkCWgH7Ad8BcAFvAf8DVQGyAwABAQMKAQ0DHAEo
-        AzIBUAFMAksBkAHQAX8BWgH+AdMBzgHWAf8B4AG6AaYB/wHhAWQBHAH/AdsBwQG3Af8B1wHLAc8B/wGd
-        AWIBSAH2AY4BWwFDAfEB4AHIAcMB/wHYAsgB/wGzAWoBQQH5BAABtQKvAfwB7ALvAf8B1QLWAf8D2QH/
-        AdcC2AH/AcsCzAH/AeEC4gH/AewC7QH/AuoB6wH/AeoC7AH/AewC7QH/AegB6gHpAf8B5gHvAegB/wHh
-        At4B/wNVAboDUgGpAesBkQFTAf8BywG2AbMB/wHaAd0B3gL/Av4B/wHFAcYB/AH/AtIB+hL/Av4B/wHd
-        Ad8B4QH/AcoBuAG3Af8B7QGVAVgB/wFYAlYBuQQAAYABlgGkAfcB3AP/AaIB6wL/AYAB3AL/AV0B0QL/
-        AWUB3QL/AWEB5AL/AWwB6AL/AYUB9QL/AYwB+QL/AVQCWwHhAyABLgGgAlIB+gHdAXABcQH/A1UBsQMG
-        AQgDNwFaAWMBXAFZAdQBkwFkAUoB8wGRAV8BSQHzAccBYQEZAf4B4AG5AaYB/wHUAc8B1QH/Ae8BmQFc
-        Af8B4AG7AaoB/wHWAc8B1QH/AdMBfwFLAf4BxAFaAS4B/QHdAcwBygH/Ad4BywHIAf8BlQFfAUYB8wQA
-        AaICmAH5Ae4C8AH/AuYB5QH/A+YB/wPmAf8B6ALpAf8B5gLlAf8B7AHpAeYB/wHvAewB5gH/AukB5gH/
-        A+MB/wHjAuIB/wLvAfAB/wHZAdQB1QH/A1QBrwFuAVoBVAHhAegBlgFcAf8B8wHsAe8B/wH+Af0E/wH+
-        Af8C9wL/ArkB+wH/AtwO/wP+Av8C/gH/AfQB7QHyAf8B5wGYAWIB/wF5AVcBTwHoBAABXwGEAZMB8wGw
-        AfYC/wFyAdoC/wFLAcwC/wEyAcEC/wFTAdMC/wFAAdQC/wFKAdgC/wFcAeMC/wFlAewC/wFTAVkBXgHl
-        AykBPgGgAlMB+gHdAnAB/wNVAbEDKgFAAZgBWQE+AfUB4wHEAbYB/wHeAdcB3AH/Ad4B1gHbAf8B4AG4
-        AaEB/wHjAZgBXwH/AdYBzwHTAf8B5wG/Aa0B/wHvAbUBlQH/AdMB0AHYAf8B5AHBAbEB/wHoAbwBpgH/
-        AdQB0AHWAf8B6gHDAa8B/wFfAVwBWQHOBAABcwJsAeUE/wH8A/8B+QH9Af4B/wH0AfsB/QH/AfMB/AH+
-        Af8B6wHpAesB/wHAAccB2gH/AawBtAHPAf8ByQHEAc8B/wLjAeAB/wHdAt4B/wHmAugB/wGzAq0B/wNI
-        AYcBhAFUAUcB7gHZAYUBSwH/AcUBwwHJAf8B8gHzAfQJ/wL0Av8BsAGqAcgB/wGxAacBowH/AeYB4gHf
-        Af8B+gL5Bf8B9gH1AfYB/wHHAcgBzgH/AdkBjAFXAf8BhgFWAUIB7wQAAVkBgAGSAfIBiQHrAv8BVAHQ
-        Av8BRwHLAv8BTQHOAv8BZwHZAv8BXQHbAv8BSgHWAv8BRwHYAv8BSwHlAv8BSwFZAWAB6wEsAisBQwGg
-        AVMBVAH6AdwBcAFxAf8DVQGxA1UBtQHfAbMBmQH/AdoB1wHgAf8B2wGxAZsB/wHcAbYBoQH/AdcB1gHf
-        Af8B6gG1AZgB/wHpAbsBpQH/AdcB0wHaAf8B8wGqAYAB/wHqAbwBpAH/Ad4B1wHbAf8B3gHYAd0B/wHp
-        Ac4BwgH/AcABZAFAAfsDOAFcBAADVwG6AesB4AHcAf8B4QHHAb4B/wHXAcoByAH/AdwBwgG6Af8B0QGj
-        AZkB/wFlAaMB3AH/AT8BtgHtAf8BIwHHAeoB/wEeAYMBzAH/AawBqAG8Af8B2QHSAc0B/wHaAtcB/wF6
-        AncB/AMvAUoBggFUAUcB7gHbAYUBSQH/AckByAHMAf8B9gL3Bf8B7wLsAf8BzQHCAb4B/wG7AbABqwH/
-        AZMBigGrAf8BtAGoAbYB/wHFAbkBtQH/AdICywH/A/EB/wHOAc8B1QH/AdwBjAFVAf8BgwFWAUUB7wQA
-        AVIBbAF7AeoBhgHdAf4B/wGJAeAC/wGFAdsB+wH/AW8BygHxAf8BWAG4AesB/wF2AdAB8gH/AYYB2wL/
-        AYUB4wL/AWAB4AL/AVcBWgFfAdsDJAE1AaABVQFWAfoB3AFwAXEB/wNVAbEBdwFYAUwB6QHeAckBwgH/
-        AeEB1gHXAf8BugFSASkB/QG+AWIBPwH9AeAB2gHdAf8B4wHGAboB/wH3AZ4BYQH/Ad0B1gHaAf8B5gHI
-        AbsB/wHUAW8BKwH+AY8BZwFLAfIBkwFnAU0B8gFhAlkBzwM1AVcDBwEJBAADSAGGAbwBoAGcAf8B4wF3
-        ATcB/wHfAaMBcQH/AesBnwFsAf8B0wE5AQ8B/wFOAYQBtgH/AV4B3QL/AVkD/wEjAcsB+wH/AWYBgAG3
-        Af8B4QHLAcQB/wHaAcgByQH/AWICVwHxAxUBHQFmAVcBVAHfAekBkAFOAf8B9AHrAe4B/wL5AfoB/wHS
-        AsoB/wG6AqwB/wHWAc8BzgH/AfsB+QH4Af8B6gHsAv8B7AHtAf0B/wHvAesB6AH/Ad8C2QH/AfkB+AH5
-        Af8B9QHuAfIB/wHnAZIBVQH/AXYBVwFPAegEAAM1AVcDVQG1AVwBdQGGAe0BhgGlAbMB/wFyAYsBmAH/
-        AWgBgwGUAf8BYwGTAakB/wFOAX8BogH+AUMBZQF9AfQCWgFdAcoDLwFKAx8BLAGYAVABUQH6AeIBcwF0
-        Af8DVQG0AZMBXwFEAfMB4wHTAc8B/wHnAdcB1QH/AYwBXQE9AfMBkgFiAUAB9AHmAtsB/wHjAdEBywH/
-        AeABaQEmAf8B5AG3AZ8B/wHgAeEB6gH/AdIBiQFtAf4DUwGqAzYBWQMVAR0DAwEECAADNAFUAZYBiQGP
-        Af4B7AGZAVcC/wHMAY4C/wHdAbcB/wHzAWABLgH/AY4BYAFqAf8BRgHEAf4B/wFOAfgB/QH/ASAB4QH6
-        Af8BNAF0AdcB/wHgAcoBzQH/AcwCuAH/A1gB3QMGAQgBUgJQAaMB6gGMAUgB/wHPAa8BpwH/AboBtAG4
-        Af8BzALCAf8B8wLxGf8B2wHfAeIB/wHIAa8BqAH/AesBjwFJAf8DVQG1DAADNgFZAX8BfgF3Af4BggF2
-        AXQB/wGcAY0BhgH/AcUBpgGhAf8BhQF2AXsB/gFrAlkB9QFkAVYBVQHnA1oB2ANZAdcBqwFqAWgB/gHh
-        AoEB/wNQAZ0BdwFhAVMB5gHnAdQBzgH/AeYB3gHgAf8BwwFwATcB/gHFAXkBQgH+AeYB4AHkAf8B6QHT
-        AcoB/wF9AVQBQwHuAZsBYgFIAfYB5gHgAeIB/wHpAdQBzAH/AXQBXAFRAecDOgFhAyMBMwMIAQsIAAMa
-        ASUBfAFzAXsB9QHVAaMBjAH/Af0BtgFiAv8B5QGsAf8B+QGDATsB/wHCAWEBSAH/AWEBrwHKAf8BXQG1
-        AZgB/wFaAbgBkAH/AUMBdwGLAf8BxQG3AbwB/wG4AqEB/wNWAbgEAAMtAUUBuQFiAUUB+wHTAZEBZAH/
-        AdQBygHQCf8B/gL9Cf8D/QL/Av0B/wH+AvwB/wHaAdYB3AH/AdABlQFrAf8B2QF2AUIB/wMzAVMMAAM1
-        AVUBdAFzAXIB/gFhAmMB/wFvAmsB/wG7AZ0BlwH/AfcBxQG8Af8B+wHEAb0B/wH5AcIBuwH/AfEBsQGr
-        Af8B6gGfAZkB/wHqAZMBkAH/AWcCWQHrAxwBKAFTAlIBqAHnAb8BpwH/AucB7gH/AecByQG6Af8B5wHK
-        Ab0B/wHnAegB7wH/AegBvAGgAf8BUQJQAZ8DTgGYAecBvQGlAf8B5wHrAfUB/wHiAakBhwH/AVICUAGk
-        AygBPAMMARAIAAMGAQgBYwJfAd0BuAGiAaMB/wFyAVoBnwH/AZYBdwGfAf8BlAFpAZsB/wFWATwBrwH/
-        AVsBgwFQAf8BSgHDAVsB/wGWAfYBswH/AV0ByQFgAf8BcwGIAV0B/wGMAn8B/gM/AW0EAAMHAQkDUAGe
-        AesBowFoAf8B5wG3AaMB/wHXAc4B0gH/AdYB2AHaAf8B/gL8Af8B9QL0Af8B9ALzAv8B/QH+Af8B2gHc
-        Ad0B/wHWAc8B0gH/AeUBtwGmAf8B7AGmAWsB/wNTAaoDCQEMDAADHwEsA2oB+QFyAnEB/wFYAVoBWwH/
-        A0oB9ANRAaIDVgG0A1wByQFmAmEB3gGAAXABbQHtAVsCWQHEAx0BKgQAAx0BKgF3AWEBWAHmAegBzgG8
-        Af8B6ALjAf8B6AHiAeMB/wHoAcoBuAH/AXcBXAFRAeoDJQE3AxgBIgGVAWsBTAHzAekB2AHPAf8B6gHO
-        AbsB/wFfAlkB0gMcAScDBwEKDAADKgFBAk8BTgGXAk8BegHoAW4BcQH5Af8BnQGmAf4B/wEvATAB9gH/
-        AR4BIwEyAfsBQQG9AVUB/wGiAf8BzgH/AYwB/wGwAf8BKAFnASAB/wNTAaoMAAMMARABVwJVAboB7AGw
-        AYAB/wHRAaUBkAH/AcgBsgGxAf8B8gHmAegB/wHKAcIBxAH/AcUBvQG/Af8B8wHoAeoB/wHKArYB/wHN
-        AaMBkQH/Ae4BtAGFAf8BWQJXAcIDEAEVFAADWwHLA9cB/wOTAf8DUAGjEAADBgEIEAADJAE2AVsCWQHE
-        AaoBagFHAfkBogFzAVEB+AFaAlcBxQMpAT4DBgEIAwABAQM9AWkBXgFaAVkBzAFeAlkBzAM7AWMDBwEK
-        AwEBAhQAA0MBdwFtAW8C/wHLAcwC/wFkAWIC/wEJAQ0BagH9ASkBeAEqAfoBYwGzAYYB+QFhAZMBcwHu
-        ATkBhwE8AfcDRwGDEAADDQESAlABTwGbAd8BnAFgAf8B7AG+AZwB/wHnAcIBrwH/AdkBtQGpAf8B1wGz
-        AagB/wHnAcIBrwH/AewBvgGdAf8B4QGgAWUB/wJSAVABowMTARoYAAMnAToDgwHxA14B2QMUARtwAAMQ
-        ARYCWAFwAd4CqQHmAf0CUwHQAfoCWQFiAdUDOwFkAyYBOAMSARkDKAE8AxYBHxgAAy0BRgNRAaIBaQFh
-        AVcB3wGJAXIBXgHuAYkBcgFfAe4BcQFjAVsB4QJTAVIBqAMwAUwDAgEDuAADIwEzA1kB7ANWAb4DEgEZ
-        CAADEQEXA1MBqgFpAVwBUgHqAXsBZgFNAfIBaQFdAVMB7QFZAlgBxwMqAUEEAAMJAQwcAANGAYEDVgG7
-        A1UBtQNVAbUDVQG1A1UBtQNVAbUDVQG1A1UBtQNVAbUDVQG1A1UBtQNWAbYDVgG7AzwBaAwAAjkBOgFg
-        Ai8BgAH1AlYBYAHXA0oBiwMuAUgDGAEhAwcBCkAAAyYBOQNYAekB8gLnAf8B2gLQAf8DVwHCAxIBGQMR
-        ARcBYAFeAVoB2QH3AdgBqwL/Ad4BrQL/Ad0BrgL/AewBwgH/AegBzgGqAf8BYgFYAU4B7wNZAdIDWwHh
-        A1kBwwNQAZ0DPwFuAyABLgwAAb4BawE+Af0B8AGKASwB/wHtAXYBIQH/Ae4BdQEgAf8B7gFyARwB/wHu
-        AW8BFwH/Ae0BagENAf8B7QFlAQYB/wHtAWYBBQH/Ae0BYgEBAf8B7QFfAQAB/wHtAVwBAAH/AfIBWgEA
-        Af8B4wFYAQAB/wNZAcQMAAJRAVIBpwItAd4B/wIiAdUB/wIRAboB/wIEAaMB/wI+AW0B7gJVAVYBtANA
-        AXEDMgFRAxQBHDAAAycBOwNcAecB6gLfAf8B7ALiAf8B5gLZAf8B3ALVAf8DWQHEA1QBrgH6AbwBgAL/
-        AdsBoQL/AcUBhgH/Af0BwgGEAf8B+AHCAYgC/wHdAakB/wHqAbUBhwH/Ab0BogGXAf8B4AHdAeAB/wHn
-        AeIB4wH/AdMBzAHNAf8BogGaAZsB/gFmAmUB9ANZAccDMQFPBAABzAF/AUYB/gH2AbcBigH/AfQBugGU
-        Af8B8gG3AY8B/wHyAbYBjwH/AfIBtQGNAf8B8wG0AYgB/wHzAbEBhQH/AfEBrgGAAf8B8AGqAXQB/wHw
-        AaoBcwH/Ae8BqQFyAf8B8wGsAXUB/wHvAXQBJQH/A1YBwQgAAwoBDQJaAV4BzgI7AfMB/wIsAewB/wIg
-        AeYB/wITAd4B/wICAc8B/wGXAZEBxQH/AbQBqwGwAf8BbQFnAZYB/wFaAVkBXgHZAlUBVgGxA0ABcSQA
-        AyQBNgNZAewB6QLcAf8B9QLtAf8B4QLYAf8B5ALZAf8B/AL3Af8BWgJYAe4BiAFfAUcB8wGuAV0BIQH/
-        AeYBnAFKAv8BvgFiAf8B7QGkAU4B/wGuAVgBGgH/AeUBoQFUAf8B3gGWAU0B/wHNAZ8BdgH/Ac0BwgHB
-        Af8B7AHcAdgB/wHvAdkB1wH/AfAB3gHcAv8B/QH8Af8B4ALUAf8DVgG4BAABwQF9AUsB/gH/AfEB8wH/
-        AZkB4AGwAf8BOwHHAVUB/wE6AcEBTwH/ASgBtQE3Af8BrAHdAbgB/wH9Ae8B9gH/AfkBtgGHAf8B+wGz
-        AYMB/wH6AasBcQH/AfUBrAGAAf8B6QHnAe4B/wHjAY8BWAH/A1gBwAgAAywBRAI3AZcB9gJDAfcB/wIy
-        AeoB/wImAeUB/wIVAeAB/wEgAR8B3QH/Ad0B1AHgAf8B9wHtAd4B/wHpAd4B2AH/Ad0B0gHMAf8BzAHC
-        AbwB/wJNAXYB+iAAAyQBNQFcAlkB7AHrAuQB/wH1Au0B/wHqAuIB/wH7AvgB/wH2AvQB/wFfAlsB7AMm
-        ATgBlAFfASsB/AGEATgBAQH/AdsBlgFIAf8B8gG5AWwB/wG3AXIBNAH/AWsBKAEAAf8BlQFHAQkB/wHJ
-        AYgBOwH/Ac8BnAFqAf8B5AHMAcQC/wHtAd8C/wHiAdEB/wH5AdUBxgH/AdgBwAG7Af8BagJnAegDKQE/
-        BAABwgF/AU8B/gH/Ae8B8AH/AYUB3QGaAf8BHgHPATwB/wEXAcEBLQH/AQABqQEDAf8BlwHTAZsC/wLn
-        Af8B/QGwAWsC/wGxAW8C/wGhAVYB/wH8AZwBVAH/Ae0B4AHeAf8B5AGQAVYB/wNYAcAIAAI8AT0BZwIy
-        AeEB/wJBAfkB/wI2Ae0B/wIuAegB/wIXAeIB/wFOAUsB3gH/AfMB7AHfAf8B6AHfAdsB/wHiAdgB2gH/
-        AegB3QHbAf8B7AHhAdwB/wJaAV0B0xwAAyQBNgFfAlcB6AHrAuYF/wH4AvYB/wH6AvYB/wHyAu8B/wFk
-        AmIB5wMnATsEAAGOAWUBQgH0AeABpwFfAv8B3wGzAf8BxwGmAYYB/wGfAXIBUgH/AZ4BcQFOAf8BhAFM
-        ASEB/wF1ATkBAwH/AagBbQFKAf8BaQJlAfQBcgJsAekBnQGTAZAB+AFyAWkBaAHtAVACTwGbAwoBDggA
-        AcABfwFTAf4B/wHvAe4B/wGHAeEBoQH/AScB3gFTAf8BIQHSAUQB/wEAAbgBGAH/AZcB1gGfAv8B6gHp
-        Af8B/gG2AXUC/wG8AYkB/wH+AawBZwH/AfwBogFdAf8B8AHkAeIB/wHkAZMBWQH/A1gBwAQAAwQBBgNR
-        AaICgwH0Af8BWQFYAfkB/wE1ATQB8gH/ASQBJQHsAf8BEQESAeYB/wGSAY8B4gH/AfoB8QHhAf8B5AHb
-        AdwB/wHjAdkB2gH/Ae8B5AHeAf8BwgG4AcYB/wNIAYUQAAMaASUDKgFBAzgBXANeAeUB7gLoDf8B8QLu
-        Af8BYgJgAekDJgE5CAADVgGzAe8BygGhAv8B+wH0Af8B+QH0Ae4B/wHsAdkBxgH/Ae0B2AHAAf8B5wHS
-        AboB/wHNAZEBVQH/AXIBUAE8Af4DRAF6AwMBBAMRARcUAAG9AX8BVwH+Af8B7wHrAf8BvAHuAccB/wGK
-        AeYBlAH/AYkB4wGPAf8BcAHZAXMB/wHGAekBxwL/AfEB8AL/Ac8BmQL/AdEBnAL/AcoBkwH/Af0BxwGU
-        Af8B9ALrAf8B4wGRAVoB/wNYAcAEAAMUARsBXQFcAW0B4QL5AfgB/wHoAeQB8QH/AcYBwAHvAf8BkAGN
-        AewB/wJHAegB/wHLAcUB5QL/AfcB4gH/AfMB6gHgAf8B7QHjAd0B/wH3AewB4wH/AZgBkAGwAf8DLAFE
-        CAADFgEfA1QBqwNkAecBbAJpAfABfwJqAfkB4ALWDf8B7wLrAf8BZAJjAewDIwEzDAADEQEXAWgBYQFc
-        AdwB+AHmAdMG/wH2AesB/wH7Ae0B3AH/AfcB2wG+Af8B4wG/AacB/wGrAacBrwH/AmsBbQH1AlwBXgHq
-        A1sB2QNZAcMDUgGmAzcBWgMDAQQEAAG8AX8BWgH+Af8B9gHmAf8ByAHHAfMB/wGUAYsB3gH/AZcBjgHe
-        Af8BlAGKAdkB/wHYAdMB7gH/AfUB9gH7Af8BmAGtAf4B/wGPAacB+wH/AYwBoQH6Af8BlgGmAfoB/wHv
-        AfAB9wH/AekBlQFVAf8DWAHABAADJgE5ApYBzwP/AfwB/wH5AfYB8gH/AfwB9wHvA/8B6wH/AdkB1AHo
-        Af8BPQE8AeYB/wFjAV8B4gH/AaABmgHgAf8ByQHCAdwB/wHvAekB4gH/AWIBXgFwAewDFgEfBAADFQEd
-        A1oB0wHHArgB/wHxAuUB/wH5AvEB/wH7AvQB/wHsAuUB/wHsAuUF/wHyAu0B/wFhAmAB6wMlATcUAAMJ
-        AQwDUAGeAXwBbwFlAeoB5AHNAb8B/wHiAb8BqQH/Ab4BXgEhAf8BxgGEAUQB/wHVAawBdAH/AcsBrAGL
-        Af8B0QG5AaIB/wHdAccBuAH/AdgByQHCAf8B0QHDAcUB/wFdAVsBWgHiAwwBEAQAAb0BfwFfAf4B/wH+
-        AeoB/wFlAWoB3gH/AgABwwH/AgABtwH/AgABnwH/AZkBmAHTAf8B7gHwAv8BHgFeAfwB/wEMAVsB/QH/
-        AQEBPwH8Af8BFAFAAfwB/wHpAesB+QH/Ae4BnQFYAf8DWAHABAADQwF4AsgB5gP/Af0B/wH2AvMB/wHz
-        Ae4B8QL/AfsB7QH/AawBpwHsAf8BHQEeAeoB/wIVAeQB/wEHAQgB3wH/AhAB3AH/ATQBMQHWAf8DVAGv
-        AwcBCQQAA1ABmgG8Aq8B/wHpAtoB/wHpAt0B/wH0AuoB/wHzAu4B/wH2AvQB/wHuAucB/wHmAt8B/wFh
-        AmAB4AMnATsgAAMuAUgBpgGgAaQB/AHUAbUBqAH/AbIBNAEAAf8BzAFVAQAB/wHPAWQBAAH/AdIBbwEH
-        Af8BzwFvAQoB/wHNAWcBCAH/Ab4BWwEYAf8B0AG4Aa8B/wNaAdUDAwEEBAABuwF/AWQB/gH/Af4B6AH/
-        AWkBbgHoAf8CAAHfAf8CAAHSAf8CAAG4Af8BnAGbAdoB/wHuAfAC/wEyAYUB/QH/ASYBjAH9Af8BGgFl
-        AfwB/wElAVkB/QH/AeoB7AH8Af8B7AGdAVsB/wNYAcAEAAJZAVsBxwL6Af0C/wH9AfsB/wH4AfQB9QH/
-        AfcB8wHyAv8B/AHvAf8BdwF1AfAB/wEuAS8B7gH/Ai8B6AH/Ah4B4QH/AgwB4QH/AgABxQH/Aj8BQAFu
-        CAADYQHuAdwCyQH/Ad0CzQH/Ab0CrwH/AZ8ClQH/Ad8C1AH/AfMC7wH/AfsC9gH/AXkCdAH0AzQBVCQA
-        AUcCRgGBAdcB2gHfAf8BvwGPAYQB/wGsASYBAAH/AcABSwEAAf8ByAFYAQAB/wHLAV0BAAH/AcoBWwEA
-        Af8BxwFPAQAB/wG9AUkBBQH/AcQBrAGmAf8DVQGyCAABugF/AWgB/gL/AewB/wGIAY0B6gH/ARYBGAHc
-        Af8BGgEcAdYB/wETARUBwwH/AawBrQHjAf8B8QH1Av8BSAGKAv8BPAGOAv8BMwFzAv8BQAFtAv8B7gHy
-        Av8B6wGdAV8B/wNYAcAEAAJZAYgB8gLtAfcB/wL5AfwD/wH+A/8B+QH/AfMB8AH1Af8BWgFZAfYB/wI2
-        AfEB/wIxAeoB/wImAeQB/wIcAegB/wIaAZoB/AIwATEBTQgAAXoCbQH3Ae8C3AH/AcACsgH/A1UBtQM/
-        AW8BogKZAf8B9ALrAf8B+ALxAf8BewJ3AfIDKgFBJAADVQGyAegB5wHoAf8BqQFVAUUB/wGyAS0BAAH/
-        AckBWAEAAf8B2gFoAQAB/wHeAW4BAAH/AdABXgEAAf8BuwE8AQAB/wG1AUwBIgH/AbwCrgH/A0gBiAgA
-        AbUBfwFpAf4B+AHlAdgB/wHsAecB6wH/Ad8B1wHiAf8B3wHZAeQB/wHfAdgB5AH/Ae8B6QHrAf8B9gHu
-        AewB/wHiAdoB7QH/AeAB2QHtAf8B4AHaAe4B/wHjAd8B8AH/AfoB9AHyAf8B4gGTAV0B/wNWAcEEAAM4
-        AVwCUAFSAaQCWgFdAcoBcgFzAZEB8wLDAd4B/wLOAfQB/wJyAv8CWAH+Af8CPwH3Af8CKQHrAf8CHQHq
-        Af8CWQFgAdQDEAEVCAADZAHsAcgCugH/A1UBsAMWAR4DVQGyAcACtAH/AegC3AH/AfAC5wH/AWsCaQHr
-        AxwBJyAAAwMBBANeAdkB3gHZAdwB/wGhATgBHQH/AcABQwEAAf8BzwFiAQAB/wHfAXIBAAH/AecBggEA
-        Af8B4AF1AQAB/wHJAVABAAH/AboBYAFCAf8BoQGZAZ4B/QM3AVoIAAHRAZ8BgwH/Af4BzgGYAf8B/QHI
-        AZIC/wHMAZEC/wHJAYwC/wHHAYkB/wH8Ab4BggH/AfkBtwF0Av8BvAFwAv8BuQFsAv8BtwFpAf8B/gGz
-        AWQC/wGxAWMB/wHvAZABPgH/A1kBxAwAAwcBCgMqAUEDOwFkAk8BUQGcAloBZgHeAlcBxQH/AmYB3wH/
-        AmMB9AH/AkgB7gH/A1QBrwwAA0IBdANRAZwDHwEtA1UBsgHAArAB/wHeAswB/wHoAtoB/wHOAsEB/wNT
-        AaokAAMRARcBewJzAfMB0AG6Ab0B/wGRAQoBAAH/Aa8BJQEAAf8BugE9AQAB/wHEAUwBAAH/AckBUQEA
-        Af8ByAFRAQAB/wG7ATYBAAH/Ab4BbwFcAf8BggF3AYIB9wMhATAIAAF+AWQBYAHxAbIBfQFtAfwBoAFt
-        AV8B+wGgAWcBXwH7AaABZAFZAfsBoAFiAVQB+wGhAWEBTgH7AaEBXwFJAfsBoAFfAUQB+wGgAV8BNwH7
-        AaABXwEyAfsBoAFfATIB+wGnAV8BMQH7AaQBUQErAfwDSAGGHAADFAEbAyIBMgNCAXUCVwFZAcICSgF7
-        AfIDPgFrFAADUQGcAcUCtwH/Ae8C3QH/Ad4CywH/AcQCtwH/A2AB1AMVAR0kAAMwAU0BqwKiAf4B3AHO
-        Ac8B/wGdAk4B/wGtAVcBSgH/Aa4BWgFFAf8BrgFaAUEB/wGuAVoBPQH/AawBVQE5Af8BoQFBATQB/wHC
-        AZoBmAH/A2IB6QMHAQqMAANCAXYDZAHnAYECcQH3AWYCZAHsA04BmAMUARwoAAMiATEDXgHZA3YB7gF3
-        AnkB7gKAAYIB8QOEAfMBiQGGAYkB9QGWAZIBlgH3AZoBkgGaAfkBnQGZAZsB+wG7AbYBtwH9A1YBuQgA
-        AzoBYQNYAccDWQHMA1oBygNaAcoDWgHKA1oBygNaAcoDWgHKA1oBygNaAcoDWgHKA1oBygNaAc4DWQHD
-        AzQBVUAAA04BmANZAcMDVgG+A1YBvgNWAb4DVgG+A1YBvgNWAb4DVgG+A1YBvgNWAb4DVgG+A1YBvgNW
-        Ab4DWQHEA0QBfAgAA0gBhAGXApUB8wGNAowB8AGNAowB8AGNAowB8AGNAosB8AGNAooB8AGMAooB8AGM
-        AooB8AGMAooB8AGaApcB8wNRAZwIAANlAe4D4gH/A90B/wPaAf8D2gH/A9gB/wHYAtcB/wPXAf8D1gH/
-        A9UB/wPVAf8D1AH/A9MB/wPgAf8DmQH/A1cBvQwAAy4BRwFZAV0BYwHaAyUBNygAAZkBnQGfAf0BygHN
-        Ac8B/wHLAc0B0AH/AcsBzgHQAf8BygHNAdAB/wHKAc0BzwH/AckBzQHPAf8ByAHMAc4B/wHIAcwBzgH/
-        AcgBywHNAf8ByAHLAc0B/wHIAcsBzQH/AcgBywHNAf8ByQHLAc4B/wGxAbUBtwH/A1sB0AMDAQQDLwFJ
-        A1IBpAHoAuMF/wH7AvkB/wH6AvcB/wH4AvQB/wH2AvAB/wHzAuwB/wHwAugB/wHyAusB/wHsAuUB/wNW
-        AbYDMQFNAwQBBgONAfcE/wP0Af8D8wH/AfMC8gH/AfEC8AH/AfAB8QHyAf8B7wHwAfEB/wHtAe4B7wH/
-        AesB7AHrAf8B6wLsAf8B6QHqAewB/wHlAuYB/wP1Af8DxgH/A1kBwwgAAxsBJgE8AWIBggHvAQcB5AL/
-        AVkBXAFgAdQoAAG1AbcBuQH9Ae0C8AH/AdkB2wHaAf8B2wHdAd4B/wHbAd0B3gH/AdsB3gHfAf8B2wHe
-        Ad8B/wHbAd4B4AH/AdsB3gHgAf8B2wHeAeAB/wHcAd4B4AH/AdsB3QHeAf8B2gHbAdwB/wHmAegB6QH/
-        AeEB5gHpAf8DWAHLAz4BawGXApIB9QHdAtUB/wHeAtUG/wL9Af8B/AL4Af8B+gL1Af8B+ALxAf8B9QLt
-        Af8B8QLpAf8B9gLvAf8B4QLWAf8B3QLWAf8DlwH2A0QBegOFAfYD+wH/A+oB/wHrAuoB/wHqAesB6gH/
-        AesB8AHxAf8B5gHpAeoB/wHhAeAB4gH/AeMB5QHnAf8B5wHsAe8B/wHhAeIB5QH/Ad4B3wHhAf8B3gLf
-        Af8C7AHrAf8DvQH/A1YBwQgAAw4BEwFJAWUBdgHoAQYB8QL/ATIBfgGkAfoCTAFNAZEDSQGHA0kBhwNJ
-        AYcDSQGHA0kBhwNJAYcDSQGHA0cBgAQAAaoBsQG1Af0BYwFlAWIB/wIiAQ0B/wIuAQ4B/wI8ARkB/wJR
-        ATEB/wJXATsB/wJZAT4B/wFWAVUBOgH/AUsBTAEuAf8BPgE/AR4B/wEyATMBGAH/ASgBJwESAf8CPAE2
-        Af8BvwHGAcsB/wNaAcoDXgHOAfUC6QH/AdECyAH/AXACbgH/ArUBtAH/AcICwQH/AbwCuwH/AbwBuwG6
-        Af8BugK5Af8BuQG4AbcB/wG7ArkB/wG1ArQB/wFwAm8B/wHJAsIB/wH4AuwB/wFgAl8B2QOHAfYD/AH/
-        Ae0C7AH/Ae4B8AHyAf8B6QHsAe4B/wHaAcgBvwH/AdYBtwGnAf8B2QG+Aa4B/wHSAbYBpwH/AdABuQGw
-        Af8B1QG1AaMB/wHOAaoBlAH/AdYBzQHKAf8B7wHxAfMB/wPAAf8DVgHBCAADGwEmAUgBZwF/AesBAwHo
-        Av8BNAGbAcgB/wG7AbgBuQH/Ac0B2AHRAf8BywHVAdIB/wHJAdIB0AH/AcYB0QHOAf8BxAHPAc0B/wHB
-        Ac0BywH/AckB1QHXAf8BnQGkAagB/wQAAagBrQGyAf0BSgFNAUQB/wMAAf8CQAEfAf8CRwEiAf8BKQEo
-        AQAB/wI9AQsB/wI+AQ0B/wI7AQoB/wIxAQAB/wIkAQAB/wIcAQAB/wIRAQAB/wEgAR8BEgH/AbYBvQHC
-        Af8DWgHKA2oB5gHiAtAB/wHCArIB/wFaAVcBWAH/AV4BYgFpAf8BZQFqAXEB/wFkAWoBcgH/AWUBagFy
-        Af8BZQFqAXIB/wFkAWsBcwH/AWUBawFyAf8BYAFlAWwB/wFXAVUBVgH/AbkBrAGrAf8B4gLQAf8BdAJx
-        AesDiAH2A/wB/wHwAvIB/wHrAekB6gH/AdcBswGgAf8B6AG+AZUB/wH1AdEBogH/AfIB0gGnAf8B8wHQ
-        AaAB/wHrAcIBmQH/AfUBzQGhAf8B3gGoAXMB/wHTAcMBuwH/AfAB9AH3Af8DwQH/A1YBwQgAAykBPgEI
-        AX8BvwH8AQcB6gL/ASMBkQG3Af8BWQFwAUsB/wFVAYgBPQH/ATwBdwEbAf8BPQGDARoB/wFCAYUBIAH/
-        AToBdQEdAf8BJwFlAQ4B/wFzAZ4BaAH/AakBrAG0Af8EAAGoAaoBsAH9AUQBRwFCAf8CNAElAf8C2wHV
-        Af8CvQG3Af8CKQEKAf8CJwEAAf8CJQEAAf8CHQEAAf8CJAEAAf8CJAEAAf8CIAEAAf8CFQEAAf8CJQEX
-        Af8BtAG7AcEB/wNaAcoBcgJuAe8BzgK5Af8BzgG/AcEB/wHYAcMBvAH/AeABpwGKAf8B5gGlAYAB/wHp
-        AaIBbgH/AekBnQFmAf8B6QGdAWYB/wHpAaEBbQH/AeYBpgF2Af8B4AGoAYsB/wHZAcEBugH/Ac4BwAHC
-        Af8BzgK5Af8BeQJyAfADiQH2A/4B/wHwAfQB9wH/Ad0BuwGrAf8B7gG3AYMB/wHyAcABhwH/Ad8BswGR
-        Af8B3gG/AaoB/wHeAbIBjgH/AfMBwQGJAf8B9wHIAZUB/wHUAaMBhgH/Ad4B3AHeAf8B8gH0AfUB/wPC
-        Af8DVgHBCAADHAEoARgBegGsAfoBBwHoAv8BIAGQAbUB/wFZAXYBUAH/AYMBpQFtAf8BXgGQAU0B/wFf
-        AZABTQH/ASEBaQEEAf8BHwFlAQcB/wEJAVMBAAH/AWIBkgFZAf8BqgGrAbUB/wQAAqgBrQH9AT8CQAH/
-        AT4BPQEtAf8CgQFzAf8CqgGnAf8CkQGHAf8CHgEGAf8CkwGCAf8CUAE9Af8CFAEAAf8CGwEAAf8CGAEA
-        Af8CDQEAAf8CIAEXAf8BsAG3Ab0B/wNaAcoBgAJ+AfEB7QLkAf8C6wHxAf8B5QHRAcAB/wH5AYcBGgL/
-        AW0BAAL/AW0BAAL/AW4BAAL/AW4BAAL/AW8BAAL/AW8BAAH/AfoBbQEAAf8B5wHEAaoB/wHsAfAB+AH/
-        AeoC4AH/AX0CegHwA4kB9gT/AeoC5QH/AeUBqwGDAf8B9QGvAWcB/wHYAaoBjQH/AegB5gHoAf8C7QHr
-        Af8B5AHnAewB/wHbAa8BkgH/AfUBtQFzAf8B2QGiAXQB/wHbAdcB2AH/AfMB9wH4Af8CxQHEAf8DVgHB
-        CAADQgF1AQABuAHvAf8BBwHoAv8BIQGUAbYB/wGHAaEBgQH/AUABgwE0Af8BPAGDATEB/wE2AXQBJwH/
-        ARIBWQEAAf8BEQFUAQEB/wEAAUcBAAH/AWEBkAFaAf8BqgGsAbQB/wQAAaUBqAGpAf0BRQFIAUYB/wMA
-        Af8CAwEAAf8CqAGlAf8CpQGdAf8CCAEAAf8CWAFNAf8CvQG6Af8CkQGJAf8CFQEBAf8CDgEAAf8CCAEA
-        Af8BGwEaARYB/wGtAbQBuQH/A1oBygN9AfAE/wHxAe4B8gH/Ad0B1QHPAf8B8AHAAWsC/wG3AUEC/wGm
-        AR0B/wH+AaIBEAH/Af4BoQEOAf8B/gGhAQ4C/wGfAQkB/wHwAZwBGQH/AdsBzQG9Af8B5AHjAegB/wHy
-        AusB/wGGAYMBhQHxA4kB9gT/AecB2gHWAf8B6gGpAW4B/wHrAacBYgH/AdoBwwG3Af8B8AHtAeYB/wHm
-        AbgBiQH/Ae0B5wHaAf8B2wHAAbMB/wHwAcIBmQH/AeYBuAGVAf8B2gHNAcgB/wH0AfgB+gH/A8YB/wNW
-        AcEEAAMKAQ0BWAFcAWAB1AEAAeEC/wEHAeAC/wEcAZUBwAH/AS8BXAFSAf8BNgGQATgB/wENAYEBDAH/
-        ARABgQEPAf8BGAGCARYB/wEXAWsBEwH/AQABOgEAAf8BWgGJAVUB/wGsAa0BtQH/BAABogKoAf0BOwE+
-        AUAB/wEPAQ4BDQH/AqwBpQH/Ar0BugH/AisBHAH/AggBAAH/AkgBQAH/Ar4BuwH/ApwBmAH/AhABAgH/
-        AggBAAH/AQIBAQEAAf8BFgEXARUB/wGqAbIBtwH/A1oBygNmAeAB/wH7AfoB/wH4AfQB9QH/Ad8C2wH/
-        AeABywGrAf8B/QHlAbsB/wH8AeABswH/AfsB2QGjAf8B/AHTAZYB/wH7AdABkAH/Af4BzwGIAf8B5AHA
-        AYgB/wHUAcsBygH/Ac0BzAG7Af8B4gHbAc8B/wFqAWkBagHoA4sB9gT/Ae4C6gH/AecBqwGAAf8B9gG0
-        AW0B/wHUAZ8BdgH/AeMB4gHjAf8B6wHiAdAB/wHhAboBkwH/AdsBrQGLAf8B9wHTAbQB/wHeAa0BjgH/
-        Ad8B2QHXAf8B9QH5AfoB/wPIAf8DVgHBBAADUQGgAQABmQHqAf8BAAHmAv8BBQHbAfYB/wE5AeYB/AH/
-        AUIBpQHdAf8BTwGCAWsB/wGCAcQBdgH/AXUBvAF3Af8BdQG9AXYB/wGBAcIBggH/AUgBkQFIAf8BXQGM
-        AVkB/wGqAawBswH/BAABnwGmAagB/QEzATYBOAH/AXIBcQFwAf8DuAH/AgkBCAH/AwAB/wIZAQ0B/wKV
-        AY0B/wJMAUgB/wIDAQAB/wIGAQAB/wIGAQAB/wMAAf8BEwIVAf8BqAGwAbUB/wNaAcoDSQGHAcgCwgH/
-        AfYB7wHuAf8B6gLlAf8BwwG0AasB/wHuAdwBzAH/Ae8B4gHUAf8B7AHiAdYB/wHrAeMB1wH/AeoB4wHW
-        Af8B6gHfAdAB/wHFAbYBrQH/AeAB1wHZAf8B7gHkAeMB/wHHAcABvwH/A04BmAONAfYE/wH3Af0B/gH/
-        AeQBwAGsAf8B7wGsAW0B/wHxAboBhQH/AdgBpAGAAf8B2wG0AZsB/wHdAagBggH/AeUBxgGnAf8B5gGx
-        AY0B/wHdAbsBqAH/AegB7gHxAf8B9gL3Af8DyQH/A1YBwQQAAVcBWgFiAdUBAAHIAv8BAAHnAv8BBQH9
-        Af4B/wFaA/8BigHuAf4B/wFnAYYBnwH/AbsB0gGwAf8BtwHPAbAB/wG4Ac8BsQH/AbkB0AGyAf8BtgHQ
-        AbAB/wGnAb4BoQH/AaQBpwGsAf8EAAGbAaIBpwH9ATQBOAE5Af8CYAFfAf8DvQH/AooBiQH/AjcBMgH/
-        AwAB/wICAQAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/ARIBEwEUAf8BpgGuAbMB/wNaAcoDBwEJAz0BaANY
-        AbkDYAHeAagBpQGmAf0B+QH3AfYB/wH1AfoB+QH/AfAB+gH4Af8B7AH6AfkB/wHoAfsB+QH/Ae8C+QH/
-        AaUBnQGeAf4DYwHiA1oBvQNAAW8DCQEMA40B9gT/AfkB+gH7Af8B9QL2Af8B4wG5AaIB/wHsAa8BgQH/
-        AfYBwAGRAf8B9gHBAZcB/wH1AcsBpwH/AegBsgGPAf8B3gG4AaQB/wHrAe4B8AH/AesB7QHuAf8B9wL2
-        Af8DywH/A1YBwQQAASMBWAGRAfYBAAHHAv8BAAHqAv8BBAP/AVQD/wGUAfcC/wFkAYQBqgH/AtIBzQH/
-        AdEB1gHRAf8BzwHUAdAB/wHNAdMBzwH/AcwB0gHPAf8B2QLgAf8BnAGfAaIB/wQAAZYBnQGjAf0BRQFI
-        AUkB/wITARIB/wOyAf8D0QH/AjYBNwH/Aw8B/wIDAQIB/wMAAf8DAAH/AwAB/wMAAf8DAAH/ARABEQES
-        Af8BpQGtAbIB/wNaAcoMAAMOARMDWAHBBP8B+gP/AfUD/wHyA/8B7gP/AfkD/wFeAlwBzAMUARwMAAON
-        AfYE/wP5Af8B+QL7Af8B9wL7Af8B6wHbAdMB/wHnAcEBrgH/AeUBvAGlAf8B5QHBAa4B/wHoAdcB0AH/
-        AfAB9AH3Af8B7gLwAf8B6wLqAf8D+QH/A80B/wNWAcEEAAFJAVcBcgHoAQABywL/AREBsQHMAfwBUwFl
-        AW0B4wFKAekB9wH/AYgB8gL/AlYBWAG7A0MBeANDAXgDQwF4A0MBeANDAXgDQwF4A0EBcgQAAZEBmQGe
-        Af0BVAFXAVgB/wEuAi0B/wNNAf8DSwH/AzcB/wNCAf8DPAH/AzAB/wIjASQB/wMZAf8DEQH/AQkCCAH/
-        AR0CHgH/AaIBqgGvAf8DWgHKEAADUwGlA/0B/wH+A/8B+AP/AfUD/wHxA/8B+AP/A1UBshAAA5AB9gT/
-        A/sB/wP5Af8B+AL5Af8B+AH9Af4B/wH1AfoB/QH/AfIB9QH4Af8B8gH2AfoB/wHzAfcB+gH/Ae8B8AHx
-        Af8D7QH/A+sB/wP3Af8DzwH/A1cBwgQAA1MBqgEAAckC/wEmAYkBqwH3AlIBUwGoATEBywHtAf8BYAHN
-        AewB/wMrAUIgAAGPAZcBnQH9AVIBVAFVAf8BPgI7Af8CQQFAAf8BPwI+Af8CRgFFAf8BRwJGAf8BSAJH
-        Af8CSQFIAf8BSgJJAf8CSAFHAf8CRQFEAf8BQgJAAf8BOwI6Af8BnAGkAaoB/wNZAcwQAANWAasD/QX/
-        AfsD/wH4A/8B9QP/AfoD/wNXAbcDAwEEDAADmQH4HP8D/gH/A/0B/wP8Af8D+gH/A/kF/wPTAf8DVwHC
-        BAADOwFlASQBZwGdAfcBJQFqAZMB9gEbAWIBngH6AUYBaQF/Ae4CWgFhAdUDDQERIAABfwGHAY0B/gGP
-        AZcBmgH/AWYBagFtAf8BbQFyAXUB/wFsAXEBdAH/AWwBcQF0Af8BbAFxAXQB/wFsAXEBcwH/AWwBcQFz
-        Af8BbAFxAXQB/wFtAXABdAH/AW0BcgF1Af8BawFwAXMB/wF0AYEBhQH/AasBtgG8Af8DWQHHEAADVAGv
-        GP8DWAG7AwQBBQwAA1sBywOzAf4DuAH9A7gB/QO4Af0DuAH9A7gB/QO4Af0DuAH9A7gB/QO4Af0DuAH9
-        A7kB/QO7Af4DdAH1AzsBZUAAAlkBWgHPAZEBlAGVAfsBhgGNAZMB+gGDAYoBkAH6AYYBjQGTAfoBhwGP
-        AZUB+gGKAZABlgH6AYwBkgGYAfoBjAGTAZgB+gGPAZYBmQH6AZABmAGaAfoBkgGYAZoB+gGTAZkBmwH6
-        AZgBowGnAfwBcgF1AXcB8gM6AWIQAANRAZwBlQKTAfMBhwKGAe8BhwKGAe8BhwKGAe8BhwKGAe8BlQKT
-        AfMDUgGnAwEBAjAAAz8BbQEyAUgBpgH2AiEBIgExIAADBQEHAyMBMwM0AVQDJgE4AwwBEAMCAQNkAAMg
-        AS4DOgFhAzYBWQNFAX8DVgG7A1YBswNAAXADNwFaAzkBXwMcASgwAAM4AV4BPQGiAfgB/wJaAV0BygMX
-        ASATAAEBAwYBCAMLAQ8DQQFyAYICaAHvAV4CWAHZA1UBsgNIAYYDMgFRAxkBIwMNAREDCgEOAwcBCgMD
-        AQQIAAFZAlcBwgG+AYEBWQH7AaoBcgFOAfoBnwJ5AfoBoQF8AX0B+gGgAnsB+gGgAnoB+gGgAnoB+gGg
-        AnsB+gGgAXkBdwH6AbABewFmAfoBswF2AU0B+gG+AWUBRQH7AWACWwHQDAADAwEEA2AB3gJ/AX4B/gGG
-        AWcBZgH9AT4BbAG4Af8BOgG5AfMB/wE1AYgBzwH/AXcBcAF+Af4BjgGDAXEB/QFcAlYB/QNOAZccAAM5
-        AWADSgGNAUkCSAGHAzcBWwQAAyABLgFMAWcBjgHuAUUBuQH0Af8BWQFaAVsByAMWAR4IAAMEAQUDJAE2
-        A0QBeQNMAZIBdgJhAe4B/wH8Af0B/wH8AusB/wG+AaYBpwH9AWcCTQHyAVYCVAHfA1kBygNVAbIDUAGa
-        A0gBhQMzAVMDCwEPBAAB0gFzAUwC/wHEAV8B/wHvAZoBVgH/AdABxAHHAf8B0gLLAf8B0wHKAcsB/wHX
-        As4B/wHWAs4B/wHVAdAB0wH/AdQBwgG9Af8B/QG5AYwC/wGdAT4C/wGXAR8B/wHcAXcBQAH/EAADYwHf
-        Ab0BuQG4AfwBrAGlAaQB+gFhAagB0wH9AXEB5AL/AVsBtgHxAf8BmgGZAaUB+wHCAbcBtgH7AZMCkAH4
-        A0ABcBgAA0gBiAF8AnoB+gGqAqMB/wGKAm0B/wFqAmkB+QJbAVkBwwMoATwDVAGvAVoB8AL/ASsBdAHE
-        Af8CRQFGAX4IAAMdASoBtQE+AQAB/wH0AVYBAAH/AbsBRwETAf8B8QHMAc0C/wLzAv8B9wH2Bv8B9AH1
-        Af8B5wG9AbwB/wGgAVMBSwH/AWEBIAELAf8BVwEMAQAB/wGSATEBAAH/A1MBsAM2AVkEAAG7AXIBRAH8
-        Af8BtgFZAf8B7QGUAVYB/wHUAcIBxAH/AdoBWAE9Af8B1wGgAZYB/wHbAdcB2gH/AdwBzgHNAf8B2wHT
-        AdQB/wHYAb4BugH/AfMBlAFhAf8B/gGOATYC/wGPASIB/wHFAWsBQAH9CAADEQEXAxUBHQMpAT8DMwFS
-        AygBPAFTAlUBsAGmAcIB3wH/AUoBTAFdAfMDOgFiAy0BRgMvAUoDGAEhAxUBHQMPARQMAAMpAT4BdAFu
-        AWcB8gG/AbsBsQH/AawBrQGmAf8BxgK6Af8BrgKUAf8BrwGaAZcB/wNeAdACVQFXAboBVAHFAe8B/gFX
-        AeoB/AH/AVoBWwFeAcgDCQEMBAABtQE+AQAC/wFsAQoB/wHvAWoBDwH/AbsBdgFrAv8B6AHmAv8B5wHo
-        Av8C7wL/AvYC/wL6Bv8C+wH/AfICzwH/AbMBZQFiAf8BdQE1ASMB/wGyAT0BAAH/A0kBiQQAAboBbgFB
-        AfwB/wG7AV8B/wHvAZsBXgH/Ad0B0QHSAf8B5gE4ARUB/wHhAZ0BkQH/AeUB7QHvAf8B5QHfAd0B/wLm
-        AegB/wHgAcoBxQH/AfIBggFMAf8B/QGNATYC/wGYASsB/wHEAWkBQAH9BAADSwGQA1wB5wFcAlUB6gFb
-        AlgB4wNbAeEDWgHeAWgBYwFhAfABzQG5AbUB/wF4AWgBZQH8AVoBWQFYAeQBXwFdAV4B4ANdAeIDXAHn
-        A2AB6wNYAeMDQAFwAxYBHwM3AVsDVQG1AYcBdgGhAf8BYAFbAYwB/wFcAV4BgQH/AboBuAG2Af8BvgGs
-        AasB/wG7AaYBpQH/AcIBrAGiAf8BRAFCAWsB9QE3AZUBxgH7AWAD/wFIAcYB9QH/AkYBRwGABAABtQE+
-        AQAB/wH+AXYBGAH/AcoBXAElAf8B8QHDAbsB/wH8AdMBygH/AfcB0QHPAf8B2gGiAaUB/wHZAZ4BoQH/
-        AasBVwFhAv8C9AL/AvUC/wH+Af0D/wH9Af8BuQFnAV4B/wG1AT4BAAH/A0wBkQQAAboBbgFAAfwB/wG8
-        AWIB/wHwAaABZQH/AuYB6gH/AeUBlgGHAf8B5wHLAccB/wHtAfoB/gH/Ae0B8QH1Af8B7gH6Af4B/wHm
-        AdgB1AH/AfABZQE2Af8B/QGKATQC/wGcATMB/wHEAWgBQAH9BAABoAKSAfkB8gLwAf8B4gLgAf8B3QLb
-        Af8B3ALZAf8BzgLMAf8B0wLSAf8B5wLmAf8B7gLsAf8B8gLxAf8B8gLvAf8B9ALxAf8B5AHpAeIB/wHH
-        AeYBygH/AdABywHKAf8DVwHFA1YBswESAZYB4gH/AQoBkAHoAf8BAAGBAeoB/wEAAWoB6AH/AScBVwG8
-        Af8BrwGlAZ8B/wHOAcABvgH/AcwBuAGyAf8BpwGaAbYB/wE2AXUBzQH/AUgB0AHyAf8BXAH5Av8BZAP/
-        AUoBhAGrAfcDLAFEAbUBPgEAAf8B/gGHASoB/wHCAWwBWQH/AdUCmQH/AdYBnQGeAf8B1wGhAaMB/wHz
-        At4B/wH4AuwB/wG2AWcBbwH/Af0B5QHkAv8C7AL/AvMB/wH1Ac8BzQH/AY0BQgEtAf8B3gFOAQAB/wNL
-        AZAEAAG6AWsBPwH8Af8BwAFpAf8B8wGcAWAB/wHoAdIB0AH/AeoB6QHnAf8B6wHfAdwB/wHrAdkB1QH/
-        AesB2QHWAf8B7AHhAdoB/wHnAcEBtQH/Ae8BSwEZAf8B/AGGAS8C/wGgATgB/wHEAWcBQAH9BAABvQK6
-        Af0B7gLwAf8B0gLTAf8B1QLWAf8B1QLWAf8BwwLEAf8BzwLQAf8B9AH1AfQB/wHxAvIB/wHxAvIB/wHx
-        AvIB/wPzAf8B6QHuAeoB/wHcAe4B4AH/AeIB4AHfAf8DWQHHAVQBagF2AeEBPQGcAa4B9AEoAbYB1QH9
-        ARkBsQHvAf8BEgGhAe8B/wFcAYYBqAH/AakBngGWAf8B0QLGAf8B2wHLAcYB/wG9AacBvgH/AUoBpgHg
-        Af8BXQH9Av8BXgH8Av8BXAH1AfwB/wFSAdsB8wH/AlcBWQHCAbUBPgEAAv8BlQE+Af8B2wFlASkB/wHL
-        AYwBhAH/AfABwgG/Av8B7gHrAv8B/QH8Bf8B+QLmAf8BuAFmAW4C/wHjAeIC/wHpAegB/wGzAWABXAH/
-        AbMBcgFDAf8B8gFWAQAB/wNLAZAEAAG6AWoBPQH8Af8BxQFzAf8B/QGjAVcB/wH3AZkBUwH/AfgBmgFT
-        Af8B+AGXAU8B/wH4AZcBSwH/AfgBlAFIAf8B+AGUAUcB/wH5AY8BPwH/AfwBgQEtAv8BkQE1Av8BoAE8
-        Af8BxAFlAUAB/QQAAbYCsAH8AeUC5gH/AdsC3AH/A98B/wPfAf8D4AH/AeEC4AH/A+AB/wPfAf8D4AH/
-        A+AB/wPgAf8B4QHgAeEB/wHvAewB7wH/AeEC3QH/A1kBwwMMARADLwFJAVoBWAFdAeIBmwGPAZ4B/wF1
-        AW0BiAH/AXUBbwF2Af8BnwKdAf8B1gLNAf8B5AHbAdkB/wH7AeIB2AH/AY8BlAHJAf8BTQHTAfAB/wGA
-        A/8BYgHgAfQB/wFRAVYBcQHmAjQBNQFVAbUBPgEAAv8BoQFTAv8BcgEPAf8B/AHPAakB/wHgAagBjgH/
-        AcoBhgFzAf8B5QGsAakB/wH+AeAB3gL/AfwB+wH/AbkBawFyAv8B1gHNAf8B8gHBAbwB/wGCASwBIQH/
-        AekBqgFrAf8B9gFXAQAB/wNLAY8EAAG7AWYBOgH8Af8BzgGTAf8B+AHYAb4B/wH4AdcBugH/AfcB1AG1
-        Af8B9QHSAbMB/wHyAc8BsAH/AfEBzQGuAf8B8QHJAasB/wHvAckBqQH/AewBzAGtAf8B6AHEAakB/wH7
-        Aa8BXgH/AcUBYQE9Af0EAAGOAosB9AH3AvgB/wPxAf8D8AH/Ae4C7wH/A+4B/wHsAu0B/wHqAusB/wPp
-        Af8D6AH/A+cB/wPlAf8D4wH/AesC7AH/Ac8CygH/A1UBsQE9Aj4BagEfAVQBpgH6ARIBYQHCAf8BFwFq
-        AdMB/wEMAVkBzgH/ASMBUQG8Af8BqAGgAaIB/wHkAdkB1AH/AfEB6QHqAf8BsAG2AdkB/wFZAWgBvgH/
-        AS4BmgHZAf8BiAH+Av8BnQP/AVcBbgGHAe8CIQEiATEBtQE+AQAC/wGuAWkC/wFyAQ8C/wHcAb4C/wHc
-        Ab4B/wH+AdkBuAH/AeoBuQGdAf8BzQGJAXIB/wHbAZ0BmQH/AfoB0wHSAf8BvAFqAW4B/wG2AWoBYQH/
-        Aa0BQgEvAf8B/AHBAYwB/wH2AVcBAAH/A0QBfAQAAbsBZAE3AfwB/gHTAZ4B/wH1AvgB/wH8A/8B/AP/
-        AfwD/wH6Af0C/wH6AfsB/QH/AfoB9wH5Af8B+QL0Af8B+QHyAfMB/wHpAeYB6gH/AfIBswFsAf8BxgFg
-        ATkB/QQAAWYCYwHfCP8B+QL6Af8B9gL3Af8D8wH/Ae4C7wH/AeoC6wH/A+cB/wHiAuMB/wPeAf8B2QLb
-        Af8D1gH/Ad0C3gH/AagCogH/A0gBiAFUAWUBcAHdARsB3gL/ARAB1QL/AQABugL/AQABogL/AVIBmgHf
-        Af8ByAG0Aa4B/wHpAeAB3QH/Ae4B6QHwAf8BSQGMAdQB/wFbAcwB7wH/AYsB5wH3Af8BlwH9Av8BowP/
-        AZgD/wJZAV4BzAG1AT4BAAL/AbsBiAL/AXIBDxX/AfIC5QH/AdICpQH/AaQBRQFOAf8BywGqAakB/wP2
-        Bf8B9gFXAQAB/wMlATcEAAG7AWQBNwH8Af0B0gGcAf8B9gH1AfIK/wL8Av8B+QH2Av8B9wHyAv8B8wHu
-        Av8B8AHpAv8B8QHrAf8B8AHlAeQB/wHyAbMBagH/AcYBYAE3Af0EAANXAboB3wLVAf8B4wLZAf8B3ALT
-        Af8B2wLRAf8B2gLQAf8B1wLOAf8B1QLMAf8B1ALLAf8B0wLKAf8B0QLJAf8BzwLIAf8B0ALJAf8B1wLQ
-        Af8BeQJkAfsDNAFUAzIBUAM1AVYDVQG1AXMBkAGgAf8BpAHCAdoB/wHDAcoB0AH/AcsBvgG7Af8B8wHu
-        Ae0C/wH9Av8BhgGoAeEB/wF2AdsB8wH/AcQD/wG3A/8BSwGtAeIB/wE6AVwBkgH1AVQBVwFmAd8BtQE+
-        AQAC/wHJAZ8C/wGyAW4C/wFyAQ8C/wFyAQ8C/wFyAQ8C/wFyAQ8C/wFyAQ8C/wFyAQ8C/wFyAQ8B/wH+
-        AXIBDwH/Af4BcgEPAv8BcgEPAv8BcgEPAf8DKgFAAwQBBQQAAbsBYwE1AvwB0gGdAf8B9AHzAfEG/wH8
-        AfsC/wH3AfYC/wH0AfEC/wHyAe0C/wHuAegC/wHuAecC/wHzAe8B/wHsAeUB5AH/AfABsgFrAf8BxgFd
-        ATYB/QQAA0wBkgG3AqEB/wHGArAB/wHBAqwB/wHCAq0B/wHDAq4B/wHEArAB/wHGArMB/wHIArYB/wHL
-        ArkB/wHOAr0B/wHRAsEB/wHZAssB/wHWAsMB/wFkAlcB8QMdASoIAAMsAUQBXAFRAUEB+AHsAeEB3AH/
-        AeYB3QHbAf8B5QLaBf8B3wHZAdMB/wFBAUkBYAH7AVABqAHHAf0B0QP/AdED/wGNAccB6gH/A04BlAMB
-        AQIBtQE+AQAC/wHVAbUC/wHVAbUC/wHVAbQC/wHWAbUC/wHVAbMC/wHVAbMV/wG1AT4BAAH/AyoBQAME
-        AQUIAAG7AWMBNQH8AfsB0gGdAf8B8wHxAfAC/wL+Av8B+QH1Av8B9QHxAv8B8QHtAv8B7gHnAv8B7QHm
-        Av8B7wHpAv8B9gHzAf8B6wLlAf8B8QGzAW0B/wHHAV4BNwH9BAADPQFoAZwCiAH+AcoCtQH/AcYCsgH/
+        AUkDJQE3AxYBHgMSARkDIAEuAy0BRQMyAVADMgFRAy4BSAMiATIMAAMGAQgDUAGkA1kBzwNcAc4BVgFX
+        AWUB6AFHAVkBdwHyA1sB4QNZAcwDWwHQA0gBhBgAAwQBBgM0AVQDVgGzAXQBZAFaAecBgwFiAVgB7wGD
+        AWMBWAHvAXIBXwFXAegBVwJWAbgDNgFZAwcBCRAAA10B0gG1ApoB/wFyAl0B/wNQAZ4DWgHbA1kB5QMf
+        ASwgAAMDAQQDCgENAxEBFwFAAj8BbgFhAVwBWgHcAWIBWgFWAeQDWQHDA0IBdQM1AVYDRAF8AV0CWQHX
+        AZ4BbQFRAfcBoQFyAUEB+AFlAV4BWAHlA1QBqwNAAXEMAAMYASEBkgKNAfoB3gHOAcgB/wGtAbEBzgH/
+        AVQBwgH5Af8BYwHgAv8BhwGpAeAB/wHkAc4BwwH/AckCwgH/A1UBshQAAxIBGAFTAlIBqAH2AYoBVgH/
+        AfABvwGrAf8B4wHGAcAB/wHVAcABvgH/AdMBvwG9Af8B5AHGAcAB/wHvAcABrQH/AfYBjwFbAf8DVQGy
+        AxgBIQwAA1kBxwHIAbMBsgH/AaABhwGGAf0BXwFWAVQB+wFsAmkB/wFfAlkB/gNXAd8DWQHJA1oBzQNa
+        Ac0DWgHNA1sB0ANZAckDRQF9AwYBCAMiATEDMAFMAzEBTQJcAVoBzQH+AcYBpgH/AewB0AHFAf8B1gF/
+        AUsB/gNSAakDSgGMAXkBYQFTAe4B9gHCAaUB/wHXAsYB/wHVAcUBxgH/Ae8ByAG0Af8BrAFzAU0B+gNO
+        AZkIAAMEAQYDEAEWAz4BawNEAXkDQgF0AWIBdwGEAfMBcQGlAcoB/wNXAcUDPwFtA0UBfQMhATADCQEM
+        AwYBCAgAAxIBGAFbAlkBwwHzAakBhQH/Ac0BtgGuAf8BxgG8Ab8B/wHyAeoB7QH/AcsBxgHIAf8BxgHC
+        AcMB/wH0AewB7gH/AccBvgHCAf8ByAGyAa4B/wH0AbABjQH/AVsCWAHLAxUBHQgAAw8BFANIAYQDVgG7
+        AXoBfAF/Af4BcgGTAaAB/wFzAaMBrwH/AagBnwGtAf8BwQGOAZoB/wHOAXABgwH/AdYBZgFsAf8B4QFy
+        AXQB/wHgAW8BcwH/AeABbwGBAf8BXwFAAUIB/QNEAXoDGgElAycBOwMnATsDSAGEAekBmwFgAf8ByAHF
+        AdAB/wHqAbsBpAH/AV4CXAHOAVYCVQGxAfEBrwGJAf8BxgHBAcoB/wHcAbwBrgH/AeEBuwGpAf8BxAG8
+        AcQB/wHrAb8BqgH/AV0CWAHRBAABSQJIAYgDXAHnAVsCWAHpAVwCVwHfAWECXAHcA1sB2QGTAY0BjAH7
+        AbgBogGeAf8BXQFaAVkB7QNbAdkBXgJYAd0DWgHkA2AB6wNbAeEDOgFiAwgBCwFUAlIBpgH2AaUBaQH/
+        AdYBvQHDAf8BtAGwAdYB/wLcAdkC/wH+AfwB/wH3AvUB/wL1AfQC/wH9AfwB/wPdAf8B2gHTAdcB/wHg
+        AcgBxQH/AfMBpQFwAf8DVQGyAwoBDQQAA1IBqAFgAWQBZgHsAYoBlAGXAfsBtAHiAesB/wG0AfMC/wGr
+        Af4C/wGUAfcB+gH/AZEB2wHkAf8BjgGzAcAB/wGGAYEBkwH/AWgBOAE7AfwBZAJSAe8B0AJWAf8B3gFz
+        AXQB/wNWAbMHAAEBAwcBCQMPARQBXAJaAc0B4gHDAbYB/wHSAcoB0QH/AawBdAFNAfoBdgFUAUgB7gHh
+        AcIBtQH/Ac8BxgHMAf8BzAF/AUwB/gG/AVsBOAH9AdcBxgHFAf8B2gHFAcIB/wGIAWcBSwHyBAABkgKM
+        AvkC+AH/AeEC3wH/AdwC2gH/AdkC1wH/AcoCxwH/Ad8C3gH/Ae0C6wH/AfcC9AH/AfUC8gH/AfYB8wH0
+        Af8B7gHwAewB/wHMAewB0AH/AdEBzwHLAf8DVgG7AzABSwHFAVoBQAH9Ac0BoQGKAf8B2AHUAdUB/wLW
+        AfsB/wLQAfoD/wH9Cf8B/gL9Av8C/gH/Af4C/AH/AdkB1gHaAf8BygGhAY4B/wHnAWwBOwH/ATYCNQFY
+        BAABeAGYAaMC+gP/AdoD/wGvAfMC/wGMAeAC/wGJAeoC/wGHAfYC/wGTAf0C/wGeA/8BkwHzAf4B/wNX
+        Ad8DKQE+AZUCWgH7Ad8BbQFsAf8DVQGyAwABAQMKAQ0DHAEoAzIBUAFMAksBkAHKAX8BWgH+AdMBzgHW
+        Af8B4AG6AaYB/wHhAWEBGQH/AdsBwQG3Af8B1wHLAc8B/wGQAWIBSAH2AYIBWwFJAfEB4AHIAcMB/wHY
+        AsgB/wGqAWoBQQH5BAABrwKpAfwB7ALvAf8B1QLWAf8D2QH/AdcC2AH/AcsCzAH/AeEC4gH/AewC7QH/
+        AuoB6wH/AeoC7AH/AewC7QH/AegB6gHpAf8B5gHvAegB/wHhAt4B/wNVAboDUgGpAesBkQFQAf8BywG2
+        AbMB/wHaAd0B3gL/Av4B/wHFAcYB/AH/AtIB+hL/Av4B/wHdAd8B4QH/AcoBuAG3Af8B7QGVAVUB/wFY
+        AlYBuQQAAXoBjAGaAfcB3AP/AaIB6wL/AYAB3AL/AVoB0QL/AWIB3QL/AV4B5AL/AWkB6AL/AYUB9QL/
+        AYwB+QL/AVoCWwHhAyABLgGaAk8B+gHdAW0BbgH/A1UBsQMGAQgDNwFaAWACXAHUAYYBXwFMAfMBhAFf
+        AUwB8wHBAWEBGQH+AeABuQGmAf8B1AHPAdUB/wHvAZkBWQH/AeABuwGqAf8B1gHPAdUB/wHNAX8BSwH+
+        Ab0BVAExAf0B3QHMAcoB/wHeAcsByAH/AYcBXwFMAfMEAAGWApAB+QHuAvAB/wLmAeUB/wPmAf8D5gH/
+        AegC6QH/AeYC5QH/AewB6QHmAf8B7wHsAeYB/wLpAeYB/wPjAf8B4wLiAf8C7wHwAf8B2QHUAdUB/wNU
+        Aa8BZgFbAVoB4QHoAZYBWQH/AfMB7AHvAf8B/gH9BP8B/gH/AvcC/wK5AfsB/wLcDv8D/gL/Av4B/wH0
+        Ae0B8gH/AecBmAFfAf8BbgFXAVYB6AQAAV8BfgGGAfMBsAH2Av8BbwHaAv8BSAHMAv8BLwHBAv8BUAHT
+        Av8BPQHUAv8BRwHYAv8BWQHjAv8BYgHsAv8BWAJeAeUDKQE+AZoCUAH6Ad0CbQH/A1UBsQMqAUABiQFZ
+        AUIB9QHjAcQBtgH/Ad4B1wHcAf8B3gHWAdsB/wHgAbgBoQH/AeMBmAFcAf8B1gHPAdMB/wHnAb8BrQH/
+        Ae8BtQGVAf8B0wHQAdgB/wHkAcEBsQH/AegBvAGmAf8B1AHQAdYB/wHqAcMBrwH/AV4CXAHOBAABagJl
+        AeUE/wH8A/8B+QH9Af4B/wH0AfsB/QH/AfMB/AH+Af8B6wHpAesB/wHAAccB2gH/AawBtAHPAf8ByQHE
+        Ac8B/wLjAeAB/wHdAt4B/wHmAugB/wGzAq0B/wNIAYcBeQFUAU0B7gHZAYUBSAH/AcUBwwHJAf8B8gHz
+        AfQJ/wL0Av8BsAGqAcgB/wGxAacBowH/AeYB4gHfAf8B+gL5Bf8B9gH1AfYB/wHHAcgBzgH/AdkBjAFU
+        Af8BegFYAUoB7wQAAVkBeQGHAfIBiQHrAv8BUQHQAv8BRAHLAv8BSgHOAv8BZAHZAv8BWgHbAv8BRwHW
+        Av8BRAHYAv8BSAHlAv8BVAFZAWAB6wEsAisBQwGaAVABUQH6AdwBbQFuAf8DVQGxA1UBtQHfAbMBmQH/
+        AdoB1wHgAf8B2wGxAZsB/wHcAbYBoQH/AdcB1gHfAf8B6gG1AZgB/wHpAbsBpQH/AdcB0wHaAf8B8wGq
+        AYAB/wHqAbwBpAH/Ad4B1wHbAf8B3gHYAd0B/wHpAc4BwgH/AbUBXwFAAfsDOAFcBAADVwG6AesB4AHc
+        Af8B4QHHAb4B/wHXAcoByAH/AdwBwgG6Af8B0QGjAZkB/wFiAaMB3AH/ATwBtgHtAf8BIAHHAeoB/wEb
+        AYMBzAH/AawBqAG8Af8B2QHSAc0B/wHaAtcB/wF3AnQB/AMvAUoBdwFUAU0B7gHbAYUBRgH/AckByAHM
+        Af8B9gL3Bf8B7wLsAf8BzQHCAb4B/wG7AbABqwH/AZMBigGrAf8BtAGoAbYB/wHFAbkBtQH/AdICywH/
+        A/EB/wHOAc8B1QH/AdwBjAFSAf8BdgFYAUsB7wQAAVUBZQFvAeoBhgHdAf4B/wGJAeAC/wGFAdsB+wH/
+        AWwBygHxAf8BVQG4AesB/wFzAdAB8gH/AYYB2wL/AYUB4wL/AV0B4AL/AloBXwHbAyQBNQGaAVEBUgH6
+        AdwBbQFuAf8DVQGxAWwBWAFSAekB3gHJAcIB/wHhAdYB1wH/AbcBTwEsAf0BuwFcAUAB/QHgAdoB3QH/
+        AeMBxgG6Af8B9wGeAV4B/wHdAdYB2gH/AeYByAG7Af8BzgFvASsB/gGEAWcBTgHyAYgBZwFRAfIBXQJZ
+        Ac8DNQFXAwcBCQQAA0gBhgG8AaABnAH/AeMBdAE0Af8B3wGjAW4B/wHrAZ8BaQH/AdMBNgEMAf8BSwGE
+        AbYB/wFbAd0C/wFWA/8BIAHLAfsB/wFjAYABtwH/AeEBywHEAf8B2gHIAckB/wFiAlcB8QMVAR0BYQJX
+        Ad8B6QGQAUsB/wH0AesB7gH/AvkB+gH/AdICygH/AboCrAH/AdYBzwHOAf8B+wH5AfgB/wHqAewC/wHs
+        Ae0B/QH/Ae8B6wHoAf8B3wLZAf8B+QH4AfkB/wH1Ae4B8gH/AecBkgFSAf8BagFXAVYB6AQAAzUBVwNV
+        AbUBXQFtAXoB7QGGAaUBswH/AW8BiwGYAf8BZQGDAZQB/wFgAZMBqQH/AU4BfwGcAf4BRgFlAXcB9AJa
+        AV0BygMvAUoDHwEsAY8BTQFOAfoB4gFwAXEB/wNVAbQBhgFfAUwB8wHjAdMBzwH/AecB1wHVAf8BggFd
+        AUQB8wGHAWIBQwH0AeYC2wH/AeMB0QHLAf8B4AFmASMB/wHkAbcBnwH/AeAB4QHqAf8BzAGDAW0B/gNT
+        AaoDNgFZAxUBHQMDAQQIAAM0AVQBkAGDAYkB/gHsAZkBVAL/AcwBjgL/Ad0BtwH/AfMBXQErAf8BjgFd
+        AWcB/wFDAcQB/gH/AUsB+AH9Af8BHQHhAfoB/wExAXEB1wH/AeABygHNAf8BzAK4Af8DWAHdAwYBCAFS
+        AlABowHqAYwBRQH/Ac8BrwGnAf8BugG0AbgB/wHMAsIB/wHzAvEZ/wHbAd8B4gH/AcgBrwGoAf8B6wGP
+        AUYB/wNVAbUMAAM2AVkBfwF+AXcB/gGCAXMBcQH/AZwBjQGGAf8BxQGmAaEB/wF/AXYBewH+AWgCWQH1
+        AWQBXAFaAecDWgHYA1kB1wGlAWoBaAH+AeECgQH/A1ABnQFrAWEBWAHmAecB1AHOAf8B5gHeAeAB/wG9
+        AXABNwH+Ab8BeQFCAf4B5gHgAeQB/wHpAdMBygH/AXMBVAFLAe4BkAFiAUgB9gHmAeAB4gH/AekB1AHM
+        Af8BawFcAVUB5wM6AWEDIwEzAwgBCwgAAxoBJQFwAW4BcAH1AdUBowGMAf8B/QG2AV8C/wHlAawB/wH5
+        AYMBOAH/AcIBXgFFAf8BXgGvAcoB/wFaAbUBmAH/AVcBuAGQAf8BQAF0AYsB/wHFAbcBvAH/AbgCoQH/
+        A1YBuAQAAy0BRQGtAV8BRQH7AdMBkQFhAf8B1AHKAdAJ/wH+Av0J/wP9Av8C/QH/Af4C/AH/AdoB1gHc
+        Af8B0AGVAWgB/wHZAXMBPwH/AzMBUwwAAzUBVQF0AXMBcgH+AV4CYAH/AWwCaAH/AbsBnQGXAf8B9wHF
+        AbwB/wH7AcQBvQH/AfkBwgG7Af8B8QGxAasB/wHqAZ8BmQH/AeoBkwGQAf8BYwJZAesDHAEoAVMCUgGo
+        AecBvwGnAf8C5wHuAf8B5wHJAboB/wHnAcoBvQH/AecB6AHvAf8B6AG8AaAB/wFRAlABnwNOAZgB5wG9
+        AaUB/wHnAesB9QH/AeIBqQGHAf8BUgJQAaQDKAE8AwwBEAgAAwYBCAFfAl4B3QG4AaIBowH/AW8BVwGf
+        Af8BlgF0AZ8B/wGUAWYBmwH/AVMBOQGvAf8BWAGDAU0B/wFHAcMBWAH/AZYB9gGzAf8BWgHJAV0B/wFw
+        AYgBWgH/AYYCfwH+Az8BbQQAAwcBCQNQAZ4B6wGjAWUB/wHnAbcBowH/AdcBzgHSAf8B1gHYAdoB/wH+
+        AvwB/wH1AvQB/wH0AvMC/wH9Af4B/wHaAdwB3QH/AdYBzwHSAf8B5QG3AaYB/wHsAaYBaAH/A1MBqgMJ
+        AQwMAAMfASwDagH5AW8CbgH/AVUBVwFYAf8DUAH0A1EBogNWAbQDXAHJA2AB3gF1AWkBaAHtAVsCWQHE
+        Ax0BKgQAAx0BKgFrAWEBWAHmAegBzgG8Af8B6ALjAf8B6AHiAeMB/wHoAcoBuAH/AWwBXAFUAeoDJQE3
+        AxgBIgGHAWYBTAHzAekB2AHPAf8B6gHOAbsB/wFdAlkB0gMcAScDBwEKDAADKgFBAk8BTgGXAlYBbgHo
+        AWsBbgH5Af8BnQGmAf4B/wEsAS0B9gH/ASEBIwEyAfsBPgG9AVIB/wGiAf8BzgH/AYwB/wGwAf8BJQFk
+        AR0B/wNTAaoMAAMMARABVwJVAboB7AGwAYAB/wHRAaUBkAH/AcgBsgGxAf8B8gHmAegB/wHKAcIBxAH/
+        AcUBvQG/Af8B8wHoAeoB/wHKArYB/wHNAaMBkQH/Ae4BtAGFAf8BWQJXAcIDEAEVFAADWwHLA9cB/wOT
+        Af8DUAGjEAADBgEIEAADJAE2AVsCWQHEAZ4BagFHAfkBmgFwAVQB+AFaAlcBxQMpAT4DBgEIAwABAQM9
+        AWkBXAFaAVkBzAFcAlkBzAM7AWMDBwEKAwEBAhQAA0MBdwFqAWwC/wHLAcwC/wFhAV8C/wEMARABZAH9
+        ASkBdQEqAfoBYwGqAYMB+QFhAYIBawHuATwBhAE/AfcDRwGDEAADDQESAlABTwGbAd8BnAFdAf8B7AG+
+        AZwB/wHnAcIBrwH/AdkBtQGpAf8B1wGzAagB/wHnAcIBrwH/AewBvgGdAf8B4QGgAWIB/wJSAVABowMT
+        ARoYAAMnAToDewHxA14B2QMUARtwAAMQARYCWgFmAd4CqAHdAf0CUAHCAfoCWgFeAdUDOwFkAyYBOAMS
+        ARkDKAE8AxYBHxgAAy0BRgNRAaIBYgFeAVcB3wF8AWoBXgHuAXwBagFfAe4BZwFhAVsB4QJTAVIBqAMw
+        AUwDAgEDuAADIwEzA1kB7ANWAb4DEgEZCAADEQEXA1MBqgFkAVwBVQHqAXUBZgFRAfIBZgFdAVYB7QNZ
+        AccDKgFBBAADCQEMHAADRgGBA1YBuwNVAbUDVQG1A1UBtQNVAbUDVQG1A1UBtQNVAbUDVQG1A1UBtQNV
+        AbUDVgG2A1YBuwM8AWgMAAI5AToBYAI1AXcB9QJZAV0B1wNKAYsDLgFIAxgBIQMHAQpAAAMmATkDWAHp
+        AfIC5wH/AdoC0AH/A1cBwgMSARkDEQEXAl4BWwHZAfcB2AGrAv8B3gGtAv8B3QGuAv8B7AHCAf8B6AHO
+        AaoB/wFiAVgBUgHvA1kB0gNbAeEDWQHDA1ABnQM/AW4DIAEuDAABuwFlAUAB/QHwAYoBKQH/Ae0BcwEe
+        Af8B7gFyAR0B/wHuAW8BGQH/Ae4BbAEUAf8B7QFnAQoB/wHtAWIBAwH/Ae0BYwECAf8B7QFfAQAB/wHt
+        AVwBAAH/Ae0BWQEAAf8B8gFXAQAB/wHjAVUBAAH/A1kBxAwAAlEBUgGnAioB3gH/Ah8B1QH/Ag4BugH/
+        AgEBowH/AkgBZwHuAlUBVgG0A0ABcQMyAVEDFAEcMAADJwE7A1wB5wHqAt8B/wHsAuIB/wHmAtkB/wHc
+        AtUB/wNZAcQDVAGuAfoBvAGAAv8B2wGhAv8BxQGGAf8B/QHCAYQB/wH4AcIBiAL/Ad0BqQH/AeoBtQGH
+        Af8BvQGiAZcB/wHgAd0B4AH/AecB4gHjAf8B0wHMAc0B/wGcAZQBlQH+A2UB9ANZAccDMQFPBAABxgF/
+        AUYB/gH2AbcBigH/AfQBugGUAf8B8gG3AY8B/wHyAbYBjwH/AfIBtQGNAf8B8wG0AYgB/wHzAbEBhQH/
+        AfEBrgGAAf8B8AGqAXEB/wHwAaoBcAH/Ae8BqQFvAf8B8wGsAXIB/wHvAXEBIgH/A1YBwQgAAwoBDQJc
+        AV4BzgI4AfMB/wIpAewB/wIdAeYB/wIQAd4B/wIAAc8B/wGXAZEBxQH/AbQBqwGwAf8BagFkAZYB/wJb
+        AV4B2QJVAVYBsQNAAXEkAAMkATYDWQHsAekC3AH/AfUC7QH/AeEC2AH/AeQC2QH/AfwC9wH/AVoCWAHu
+        AYABXwFMAfMBrgFaAR4B/wHmAZwBRwL/Ab4BXwH/Ae0BpAFLAf8BrgFVARcB/wHlAaEBUQH/Ad4BlgFK
+        Af8BzQGfAXMB/wHNAcIBwQH/AewB3AHYAf8B7wHZAdcB/wHwAd4B3AL/Af0B/AH/AeAC1AH/A1YBuAQA
+        AbsBfQFLAf4B/wHxAfMB/wGZAeABsAH/ATgBxwFSAf8BNwHBAUwB/wElAbUBNAH/AawB3QG4Af8B/QHv
+        AfYB/wH5AbYBhwH/AfsBswGDAf8B+gGrAW4B/wH1AawBgAH/AekB5wHuAf8B4wGPAVUB/wNYAcAIAAMs
+        AUQCOwGNAfYCQAH3Af8CLwHqAf8CIwHlAf8CEgHgAf8BHQEcAd0B/wHdAdQB4AH/AfcB7QHeAf8B6QHe
+        AdgB/wHdAdIBzAH/AcwBwgG8Af8CTQFzAfogAAMkATUBXAJZAewB6wLkAf8B9QLtAf8B6gLiAf8B+wL4
+        Af8B9gL0Af8BXwJbAewDJgE4AYsBXAErAfwBhAE1AQAB/wHbAZYBRQH/AfIBuQFpAf8BtwFvATEB/wFo
+        ASUBAAH/AZUBRAEGAf8ByQGIATgB/wHPAZwBZwH/AeQBzAHEAv8B7QHfAv8B4gHRAf8B+QHVAcYB/wHY
+        AcABuwH/AWYCZAHoAykBPwQAAbwBfwFPAf4B/wHvAfAB/wGFAd0BmgH/ARsBzwE5Af8BFAHBASoB/wEA
+        AakBAAH/AZcB0wGbAv8C5wH/Af0BsAFoAv8BsQFsAv8BoQFTAf8B/AGcAVEB/wHtAeAB3gH/AeQBkAFT
+        Af8DWAHACAACPAE9AWcCLwHhAf8CPgH5Af8CMwHtAf8CKwHoAf8CFAHiAf8BSwFIAd4B/wHzAewB3wH/
+        AegB3wHbAf8B4gHYAdoB/wHoAd0B2wH/AewB4QHcAf8CWgFdAdMcAAMkATYBXwJXAegB6wLmBf8B+AL2
+        Af8B+gL2Af8B8gLvAf8BZAJiAecDJwE7BAABgwFlAUUB9AHgAacBXAL/Ad8BswH/AccBpgGGAf8BnwFv
+        AU8B/wGeAW4BSwH/AYQBSQEeAf8BcgE2AQAB/wGoAWoBRwH/A2UB9AFqAmUB6QGXAYsBhwH4AWoBZgFl
+        Ae0BUAJPAZsDCgEOCAABugF/AVMB/gH/Ae8B7gH/AYcB4QGhAf8BJAHeAVAB/wEeAdIBQQH/AQABuAEV
+        Af8BlwHWAZ8C/wHqAekB/wH+AbYBcgL/AbwBiQH/Af4BrAFkAf8B/AGiAVoB/wHwAeQB4gH/AeQBkwFW
+        Af8DWAHABAADBAEGA1EBogKDAfQB/wFWAVUB+QH/ATIBMQHyAf8BIQEiAewB/wEOAQ8B5gH/AZIBjwHi
+        Af8B+gHxAeEB/wHkAdsB3AH/AeMB2QHaAf8B7wHkAd4B/wHCAbgBxgH/A0gBhRAAAxoBJQMqAUEDOAFc
+        A14B5QHuAugN/wHxAu4B/wFiAmAB6QMmATkIAANWAbMB7wHKAaEC/wH7AfQB/wH5AfQB7gH/AewB2QHG
+        Af8B7QHYAcAB/wHnAdIBugH/Ac0BkQFSAf8BcgFQATwB/gNEAXoDAwEEAxEBFxQAAbcBfwFXAf4B/wHv
+        AesB/wG8Ae4BxwH/AYoB5gGUAf8BiQHjAY8B/wFtAdkBcAH/AcYB6QHHAv8B8QHwAv8BzwGZAv8B0QGc
+        Av8BygGTAf8B/QHHAZQB/wH0AusB/wHjAZEBVwH/A1gBwAQAAxQBGwFdAVwBZQHhAvkB+AH/AegB5AHx
+        Af8BxgHAAe8B/wGQAY0B7AH/AkQB6AH/AcsBxQHlAv8B9wHiAf8B8wHqAeAB/wHtAeMB3QH/AfcB7AHj
+        Af8BmAGQAbAB/wMsAUQIAAMWAR8DVAGrA2QB5wFoAmYB8AF3AmoB+QHgAtYN/wHvAusB/wFkAmMB7AMj
+        ATMMAAMRARcCYQFcAdwB+AHmAdMG/wH2AesB/wH7Ae0B3AH/AfcB2wG+Af8B4wG/AacB/wGrAacBrwH/
+        AmgBagH1A1wB6gNbAdkDWQHDA1IBpgM3AVoDAwEEBAABtgF/AVoB/gH/AfYB5gH/AcgBxwHzAf8BlAGL
+        Ad4B/wGXAY4B3gH/AZQBigHZAf8B2AHTAe4B/wH1AfYB+wH/AZgBrQH+Af8BjwGnAfsB/wGMAaEB+gH/
+        AZYBpgH6Af8B7wHwAfcB/wHpAZUBUgH/A1gBwAQAAyYBOQKWAc8D/wH8Af8B+QH2AfIB/wH8AfcB7wP/
+        AesB/wHZAdQB6AH/AToBOQHmAf8BYAFcAeIB/wGgAZoB4AH/AckBwgHcAf8B7wHpAeIB/wFiAV4BagHs
+        AxYBHwQAAxUBHQNaAdMBxwK4Af8B8QLlAf8B+QLxAf8B+wL0Af8B7ALlAf8B7ALlBf8B8gLtAf8DYAHr
+        AyUBNxQAAwkBDANQAZ4BcAFmAWIB6gHkAc0BvwH/AeIBvwGpAf8BvgFbAR4B/wHGAYQBQQH/AdUBrAFx
+        Af8BywGsAYsB/wHRAbkBogH/Ad0BxwG4Af8B2AHJAcIB/wHRAcMBxQH/A10B4gMMARAEAAG3AX8BXwH+
+        Af8B/gHqAf8BYgFnAd4B/wIAAcMB/wIAAbcB/wIAAZ8B/wGZAZgB0wH/Ae4B8AL/ARsBWwH8Af8BCQFY
+        Af0B/wEAATwB/AH/AREBPQH8Af8B6QHrAfkB/wHuAZ0BVQH/A1gBwAQAA0MBeALIAeYD/wH9Af8B9gLz
+        Af8B8wHuAfEC/wH7Ae0B/wGsAacB7AH/ARoBGwHqAf8CEgHkAf8BBAEFAd8B/wINAdwB/wExAS4B1gH/
+        A1QBrwMHAQkEAANQAZoBvAKvAf8B6QLaAf8B6QLdAf8B9ALqAf8B8wLuAf8B9gL0Af8B7gLnAf8B5gLf
+        Af8DXwHgAycBOyAAAy4BSAGdAZcBmwH8AdQBtQGoAf8BsgExAQAB/wHMAVIBAAH/Ac8BYQEAAf8B0gFs
+        AQQB/wHPAWwBBwH/Ac0BZAEFAf8BvgFYARUB/wHQAbgBrwH/A1oB1QMDAQQEAAG1AX8BZAH+Af8B/gHo
+        Af8BZgFrAegB/wIAAd8B/wIAAdIB/wIAAbgB/wGcAZsB2gH/Ae4B8AL/AS8BhQH9Af8BIwGMAf0B/wEX
+        AWIB/AH/ASIBVgH9Af8B6gHsAfwB/wHsAZ0BWAH/A1gBwAQAA1kBxwL6Af0C/wH9AfsB/wH4AfQB9QH/
+        AfcB8wHyAv8B/AHvAf8BdAFyAfAB/wErASwB7gH/AiwB6AH/AhsB4QH/AgkB4QH/AgABxQH/Aj8BQAFu
+        CAADYQHuAdwCyQH/Ad0CzQH/Ab0CrwH/AZ8ClQH/Ad8C1AH/AfMC7wH/AfsC9gH/AXMCbAH0AzQBVCQA
+        AUcCRgGBAdcB2gHfAf8BvwGPAYQB/wGsASMBAAH/AcABSAEAAf8ByAFVAQAB/wHLAVoBAAH/AcoBWAEA
+        Af8BxwFMAQAB/wG9AUYBAgH/AcQBrAGmAf8DVQGyCAABtAF/AWgB/gL/AewB/wGIAY0B6gH/ARMBFQHc
+        Af8BFwEZAdYB/wEQARIBwwH/AawBrQHjAf8B8QH1Av8BRQGKAv8BOQGOAv8BMAFwAv8BPQFqAv8B7gHy
+        Av8B6wGdAVwB/wNYAcAEAAJZAX0B8gLtAfcB/wL5AfwD/wH+A/8B+QH/AfMB8AH1Af8BVwFWAfYB/wIz
+        AfEB/wIuAeoB/wIjAeQB/wIZAegB/wIdAZEB/AIwATEBTQgAAXECbQH3Ae8C3AH/AcACsgH/A1UBtQM/
+        AW8BogKZAf8B9ALrAf8B+ALxAf8BdQJvAfIDKgFBJAADVQGyAegB5wHoAf8BqQFSAUIB/wGyASoBAAH/
+        AckBVQEAAf8B2gFlAQAB/wHeAWsBAAH/AdABWwEAAf8BuwE5AQAB/wG1AUkBHwH/AbwCrgH/A0gBiAgA
+        Aa8BfwFpAf4B+AHlAdgB/wHsAecB6wH/Ad8B1wHiAf8B3wHZAeQB/wHfAdgB5AH/Ae8B6QHrAf8B9gHu
+        AewB/wHiAdoB7QH/AeAB2QHtAf8B4AHaAe4B/wHjAd8B8AH/AfoB9AHyAf8B4gGTAVoB/wNWAcEEAAM4
+        AVwCUAFSAaQCWgFdAcoBbgFvAYQB8wLDAd4B/wLOAfQB/wJvAv8CVQH+Af8CPAH3Af8CJgHrAf8CGgHq
+        Af8CXAFgAdQDEAEVCAADZAHsAcgCugH/A1UBsAMWAR4DVQGyAcACtAH/AegC3AH/AfAC5wH/AWgCZgHr
+        AxwBJyAAAwMBBANeAdkB3gHZAdwB/wGhATUBGgH/AcABQAEAAf8BzwFfAQAB/wHfAW8BAAH/AecBggEA
+        Af8B4AFyAQAB/wHJAU0BAAH/AboBXQE/Af8BoQGZAZ4B/QM3AVoIAAHRAZ8BgwH/Af4BzgGYAf8B/QHI
+        AZIC/wHMAZEC/wHJAYwC/wHHAYkB/wH8Ab4BggH/AfkBtwFxAv8BvAFtAv8BuQFpAv8BtwFmAf8B/gGz
+        AWEC/wGxAWAB/wHvAZABOwH/A1kBxAwAAwcBCgMqAUEDOwFkAk8BUQGcAloBYAHeAlQBxQH/AmMB3wH/
+        AmAB9AH/AkUB7gH/A1QBrwwAA0IBdANRAZwDHwEtA1UBsgHAArAB/wHeAswB/wHoAtoB/wHOAsEB/wNT
+        AaokAAMRARcBcQJvAfMB0AG6Ab0B/wGRAQcBAAH/Aa8BIgEAAf8BugE6AQAB/wHEAUkBAAH/AckBTgEA
+        Af8ByAFOAQAB/wG7ATMBAAH/Ab4BbAFZAf8BfwFuAX8B9wMhATAIAAF0AWQBYAHxAawBegFqAfwBmQFk
+        AV8B+wGZAWABXwH7AZkBXwFZAfsBmQFfAVQB+wGZAV8BTgH7AZkBXwFJAfsBmQFfAUQB+wGZAV8BNAH7
+        AZkBXwEyAfsBmQFfATIB+wGdAV8BMQH7AZsBSwErAfwDSAGGHAADFAEbAyIBMgNCAXUCVwFZAcICTQF1
+        AfIDPgFrFAADUQGcAcUCtwH/Ae8C3QH/Ad4CywH/AcQCtwH/A2AB1AMVAR0kAAMwAU0BpQKcAf4B3AHO
+        Ac8B/wGdAksB/wGtAVQBRwH/Aa4BVwFCAf8BrgFXAT4B/wGuAVcBOgH/AawBUgE2Af8BoQE+ATEB/wHC
+        AZoBmAH/A2IB6QMHAQqMAANCAXYDZAHnAX0CbQH3A2QB7ANOAZgDFAEcKAADIgExA14B2QNsAe4BbQJu
+        Ae4CdwF7AfEDfgHzAYIBgAGCAfUBjAGKAYwB9wGQAY0BkAH5AZcBlQGWAfsBuAGzAbQB/QNWAbkIAAM6
+        AWEDWQHHA1kBzANaAcoDWgHKA1oBygNaAcoDWgHKA1oBygNaAcoDWgHKA1oBygNaAcoDXAHOA1kBwwM0
+        AVVAAANOAZgDWQHDA1YBvgNWAb4DVgG+A1YBvgNWAb4DVgG+A1YBvgNWAb4DVgG+A1YBvgNWAb4DVgG+
+        A1kBxANEAXwIAANIAYQBiQKHAfMBfwJ9AfABfwJ9AfABfwJ9AfABfwJ9AfABfwJ8AfABfQJ8AfABfQJ8
+        AfABfQJ8AfABjAKJAfMDUQGcCAADYQHuA+IB/wPdAf8D2gH/A9oB/wPYAf8B2ALXAf8D1wH/A9YB/wPV
+        Af8D1QH/A9QB/wPTAf8D4AH/A5kB/wNXAb0MAAMuAUcBXAFeAWEB2gMlATcoAAGZAZ0BnwH9AcoBzQHP
+        Af8BywHNAdAB/wHLAc4B0AH/AcoBzQHQAf8BygHNAc8B/wHJAc0BzwH/AcgBzAHOAf8ByAHMAc4B/wHI
+        AcsBzQH/AcgBywHNAf8ByAHLAc0B/wHIAcsBzQH/AckBywHOAf8BsQG1AbcB/wNbAdADAwEEAy8BSQNS
+        AaQB6ALjBf8B+wL5Af8B+gL3Af8B+AL0Af8B9gLwAf8B8wLsAf8B8ALoAf8B8gLrAf8B7ALlAf8DVgG2
+        AzEBTQMEAQYDiAH3BP8D9AH/A/MB/wHzAvIB/wHxAvAB/wHwAfEB8gH/Ae8B8AHxAf8B7QHuAe8B/wHr
+        AewB6wH/AesC7AH/AekB6gHsAf8B5QLmAf8D9QH/A8YB/wNZAcMIAAMbASYBRgFiAXUB7wEEAeQC/wJc
+        AWAB1CgAAbIBtAG2Af0B7QLwAf8B2QHbAdoB/wHbAd0B3gH/AdsB3QHeAf8B2wHeAd8B/wHbAd4B3wH/
+        AdsB3gHgAf8B2wHeAeAB/wHbAd4B4AH/AdwB3gHgAf8B2wHdAd4B/wHaAdsB3AH/AeYB6AHpAf8B4QHm
+        AekB/wNYAcsDPgFrAYkChgH1Ad0C1QH/Ad4C1Qb/Av0B/wH8AvgB/wH6AvUB/wH4AvEB/wH1Au0B/wHx
+        AukB/wH2Au8B/wHhAtYB/wHdAtYB/wONAfYDRAF6A3sB9gP7Af8D6gH/AesC6gH/AeoB6wHqAf8B6wHw
+        AfEB/wHmAekB6gH/AeEB4AHiAf8B4wHlAecB/wHnAewB7wH/AeEB4gHlAf8B3gHfAeEB/wHeAt8B/wLs
+        AesB/wO9Af8DVgHBCAADDgETAVIBYQFqAegBAwHxAv8BMgF7AZ4B+gJMAU0BkQNJAYcDSQGHA0kBhwNJ
+        AYcDSQGHA0kBhwNJAYcDRwGABAABqAGuAbIB/QFgAWIBXwH/Ah8BCgH/AisBCwH/AjkBFgH/Ak4BLgH/
+        AlQBOAH/AlYBOwH/AVMBUgE3Af8BSAFJASsB/wE7ATwBGwH/AS8BMAEVAf8BJQEkAQ8B/wI5ATMB/wG/
+        AcYBywH/A1oBygNeAc4B9QLpAf8B0QLIAf8BbQJrAf8CtQG0Af8BwgLBAf8BvAK7Af8BvAG7AboB/wG6
+        ArkB/wG5AbgBtwH/AbsCuQH/AbUCtAH/AW0CbAH/AckCwgH/AfgC7AH/A14B2QN9AfYD/AH/Ae0C7AH/
+        Ae4B8AHyAf8B6QHsAe4B/wHaAcgBvwH/AdYBtwGnAf8B2QG+Aa4B/wHSAbYBpwH/AdABuQGwAf8B1QG1
+        AaMB/wHOAaoBlAH/AdYBzQHKAf8B7wHxAfMB/wPAAf8DVgHBCAADGwEmAVEBYwF0AesBAAHoAv8BMQGb
+        AcgB/wG7AbgBuQH/Ac0B2AHRAf8BywHVAdIB/wHJAdIB0AH/AcYB0QHOAf8BxAHPAc0B/wHBAc0BywH/
+        AckB1QHXAf8BnQGkAagB/wQAAagBqgGvAf0BRwFKAUEB/wMAAf8CPQEcAf8CRAEfAf8BJgElAQAB/wI6
+        AQgB/wI7AQoB/wI4AQcB/wIuAQAB/wIhAQAB/wIZAQAB/wIOAQAB/wEdARwBDwH/AbYBvQHCAf8DWgHK
+        A2cB5gHiAtAB/wHCArIB/wFXAVQBVQH/AVsBXwFmAf8BYgFnAW4B/wFhAWcBbwH/AWIBZwFvAf8BYgFn
+        AW8B/wFhAWgBcAH/AWIBaAFvAf8BXQFiAWkB/wFUAVIBUwH/AbkBrAGrAf8B4gLQAf8BawJqAesDfQH2
+        A/wB/wHwAvIB/wHrAekB6gH/AdcBswGgAf8B6AG+AZUB/wH1AdEBogH/AfIB0gGnAf8B8wHQAaAB/wHr
+        AcIBmQH/AfUBzQGhAf8B3gGoAXAB/wHTAcMBuwH/AfAB9AH3Af8DwQH/A1YBwQgAAykBPgELAXwBuQH8
+        AQQB6gL/ASABkQG3Af8BVgFtAUgB/wFSAYgBOgH/ATkBdAEYAf8BOgGDARcB/wE/AYUBHQH/ATcBcgEa
+        Af8BJAFiAQsB/wFwAZ4BZQH/AakBrAG0Af8EAAKoAa0B/QFBAUQBPwH/AjEBIgH/AtsB1QH/Ar0BtwH/
+        AiYBBwH/AiQBAAH/AiIBAAH/AhoBAAH/AiEBAAH/AiEBAAH/Ah0BAAH/AhIBAAH/AiIBFAH/AbQBuwHB
+        Af8DWgHKAWsCZgHvAc4CuQH/Ac4BvwHBAf8B2AHDAbwB/wHgAacBigH/AeYBpQGAAf8B6QGiAWsB/wHp
+        AZ0BYwH/AekBnQFjAf8B6QGhAWoB/wHmAaYBcwH/AeABqAGLAf8B2QHBAboB/wHOAcABwgH/Ac4CuQH/
+        AW4CagHwA30B9gP+Af8B8AH0AfcB/wHdAbsBqwH/Ae4BtwGDAf8B8gHAAYcB/wHfAbMBkQH/Ad4BvwGq
+        Af8B3gGyAY4B/wHzAcEBiQH/AfcByAGVAf8B1AGjAYYB/wHeAdwB3gH/AfIB9AH1Af8DwgH/A1YBwQgA
+        AxwBKAEdAXcBpAH6AQQB6AL/AR0BkAG1Af8BVgFzAU0B/wGDAaUBagH/AVsBkAFKAf8BXAGQAUoB/wEe
+        AWYBAQH/ARwBYgEEAf8BBgFQAQAB/wFfAZIBVgH/AaoBqwG1Af8EAAKoAaoB/QE8Aj0B/wE7AToBKgH/
+        AoEBcAH/AqoBpwH/ApEBhwH/AhsBAwH/ApMBggH/Ak0BOgH/AhEBAAH/AhgBAAH/AhUBAAH/AgoBAAH/
+        Ah0BFAH/AbABtwG9Af8DWgHKAXcCdAHxAe0C5AH/AusB8QH/AeUB0QHAAf8B+QGHARcC/wFqAQAC/wFq
+        AQAC/wFrAQAC/wFrAQAC/wFsAQAC/wFsAQAB/wH6AWoBAAH/AecBxAGqAf8B7AHwAfgB/wHqAuAB/wF0
+        AnAB8AN9AfYE/wHqAuUB/wHlAasBgwH/AfUBrwFkAf8B2AGqAY0B/wHoAeYB6AH/Au0B6wH/AeQB5wHs
+        Af8B2wGvAZIB/wH1AbUBcAH/AdkBogFxAf8B2wHXAdgB/wHzAfcB+AH/AsUBxAH/A1YBwQgAA0IBdQEA
+        AbgB7wH/AQQB6AL/AR4BlAG2Af8BhwGhAYEB/wE9AYMBMQH/ATkBgwEuAf8BMwFxASQB/wEPAVYBAAH/
+        AQ4BUQEAAf8BAAFEAQAB/wFeAZABVwH/AaoBrAG0Af8EAAGlAqgB/QFCAUUBQwH/AwAB/wMAAf8CqAGl
+        Af8CpQGdAf8CBQEAAf8CVQFKAf8CvQG6Af8CkQGJAf8CEgEAAf8CCwEAAf8CBQEAAf8BGAEXARMB/wGt
+        AbQBuQH/A1oBygN0AfAE/wHxAe4B8gH/Ad0B1QHPAf8B8AHAAWgC/wG3AT4C/wGmARoB/wH+AaIBDQH/
+        Af4BoQELAf8B/gGhAQsC/wGfAQYB/wHwAZwBFgH/AdsBzQG9Af8B5AHjAegB/wHyAusB/wF+AXsBfgHx
+        A30B9gT/AecB2gHWAf8B6gGpAWsB/wHrAacBXwH/AdoBwwG3Af8B8AHtAeYB/wHmAbgBiQH/Ae0B5wHa
+        Af8B2wHAAbMB/wHwAcIBmQH/AeYBuAGVAf8B2gHNAcgB/wH0AfgB+gH/A8YB/wNWAcEEAAMKAQ0CXAFg
+        AdQBAAHhAv8BBAHgAv8BGQGVAcAB/wEsAVkBTwH/ATMBkAE1Af8BCgGBAQkB/wENAYEBDAH/ARUBggET
+        Af8BFAFoARAB/wEAATcBAAH/AVcBiQFSAf8BrAGtAbUB/wQAAaICqAH9ATgBOwE9Af8BDAELAQoB/wKs
+        AaUB/wK9AboB/wIoARkB/wIFAQAB/wJFAT0B/wK+AbsB/wKcAZgB/wINAQAB/wIFAQAB/wMAAf8BEwEU
+        ARIB/wGqAbIBtwH/A1oBygNjAeAB/wH7AfoB/wH4AfQB9QH/Ad8C2wH/AeABywGrAf8B/QHlAbsB/wH8
+        AeABswH/AfsB2QGjAf8B/AHTAZYB/wH7AdABkAH/Af4BzwGIAf8B5AHAAYgB/wHUAcsBygH/Ac0BzAG7
+        Af8B4gHbAc8B/wNmAegDfwH2BP8B7gLqAf8B5wGrAYAB/wH2AbQBagH/AdQBnwFzAf8B4wHiAeMB/wHr
+        AeIB0AH/AeEBugGTAf8B2wGtAYsB/wH3AdMBtAH/Ad4BrQGOAf8B3wHZAdcB/wH1AfkB+gH/A8gB/wNW
+        AcEEAANRAaABAAGZAeoB/wEAAeYC/wECAdsB9gH/ATYB5gH8Af8BPwGlAd0B/wFMAYIBaAH/AYIBxAFz
+        Af8BcgG8AXQB/wFyAb0BcwH/AYEBwgGCAf8BRQGRAUUB/wFaAYwBVgH/AaoBrAGzAf8EAAGfAaYBqAH9
+        ATABMwE1Af8BbwFuAW0B/wO4Af8CBgEFAf8DAAH/AhYBCgH/ApUBjQH/AkkBRQH/AwAB/wIDAQAB/wID
+        AQAB/wMAAf8BEAISAf8BqAGwAbUB/wNaAcoDSQGHAcgCwgH/AfYB7wHuAf8B6gLlAf8BwwG0AasB/wHu
+        AdwBzAH/Ae8B4gHUAf8B7AHiAdYB/wHrAeMB1wH/AeoB4wHWAf8B6gHfAdAB/wHFAbYBrQH/AeAB1wHZ
+        Af8B7gHkAeMB/wHHAcABvwH/A04BmAOBAfYE/wH3Af0B/gH/AeQBwAGsAf8B7wGsAWoB/wHxAboBhQH/
+        AdgBpAGAAf8B2wG0AZsB/wHdAagBggH/AeUBxgGnAf8B5gGxAY0B/wHdAbsBqAH/AegB7gHxAf8B9gL3
+        Af8DyQH/A1YBwQQAAloBXgHVAQAByAL/AQAB5wL/AQIB/QH+Af8BVwP/AYoB7gH+Af8BZAGGAZ8B/wG7
+        AdIBsAH/AbcBzwGwAf8BuAHPAbEB/wG5AdABsgH/AbYB0AGwAf8BpwG+AaEB/wGkAacBrAH/BAABmwGi
+        AacB/QExATUBNgH/Al0BXAH/A70B/wKKAYkB/wI0AS8B/wMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wMA
+        Af8BDwEQAREB/wGmAa4BswH/A1oBygMHAQkDPQFoA1gBuQNgAd4BqAGlAaYB/QH5AfcB9gH/AfUB+gH5
+        Af8B8AH6AfgB/wHsAfoB+QH/AegB+wH5Af8B7wL5Af8BnwGXAZgB/gNhAeIDWgG9A0ABbwMJAQwDgQH2
+        BP8B+QH6AfsB/wH1AvYB/wHjAbkBogH/AewBrwGBAf8B9gHAAZEB/wH2AcEBlwH/AfUBywGnAf8B6AGy
+        AY8B/wHeAbgBpAH/AesB7gHwAf8B6wHtAe4B/wH3AvYB/wPLAf8DVgHBBAABLgFYAYcB9gEAAccC/wEA
+        AeoC/wEBA/8BUQP/AZQB9wL/AWEBhAGqAf8C0gHNAf8B0QHWAdEB/wHPAdQB0AH/Ac0B0wHPAf8BzAHS
+        Ac8B/wHZAuAB/wGcAZ8BogH/BAABlgGdAaMB/QFCAUUBRgH/AhABDwH/A7IB/wPRAf8CMwE0Af8DDAH/
+        AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/AQ0BDgEPAf8BpQGtAbIB/wNaAcoMAAMOARMDWAHBBP8B+gP/
+        AfUD/wHyA/8B7gP/AfkD/wNcAcwDFAEcDAADgQH2BP8D+QH/AfkC+wH/AfcC+wH/AesB2wHTAf8B5wHB
+        Aa4B/wHlAbwBpQH/AeUBwQGuAf8B6AHXAdAB/wHwAfQB9wH/Ae4C8AH/AesC6gH/A/kB/wPNAf8DVgHB
+        BAABUgFXAWkB6AEAAcsC/wEUAasBwwH8AVgBYAFlAeMBRwHpAfcB/wGIAfIC/wJWAVgBuwNDAXgDQwF4
+        A0MBeANDAXgDQwF4A0MBeANBAXIEAAGRAZkBngH9AVEBVAFVAf8BKwIqAf8DSgH/A0gB/wM0Af8DPwH/
+        AzkB/wMtAf8CIAEhAf8DFgH/Aw4B/wEGAgUB/wEaAhsB/wGiAaoBrwH/A1oByhAAA1MBpQP9Af8B/gP/
+        AfgD/wH1A/8B8QP/AfgD/wNVAbIQAAOFAfYE/wP7Af8D+QH/AfgC+QH/AfgB/QH+Af8B9QH6Af0B/wHy
+        AfUB+AH/AfIB9gH6Af8B8wH3AfoB/wHvAfAB8QH/A+0B/wPrAf8D9wH/A88B/wNXAcIEAANTAaoBAAHJ
+        Av8BMgGGAaEB9wJSAVMBqAEuAcsB7QH/AV0BzQHsAf8DKwFCIAABjwGXAZ0B/QFPAVEBUgH/ATsCOAH/
+        Aj4BPQH/ATwCOwH/AkMBQgH/AUQCQwH/AUUCRAH/AkYBRQH/AUcCRgH/AkUBRAH/AkIBQQH/AT8CPQH/
+        ATgCNwH/AZwBpAGqAf8DWQHMEAADVgGrA/0F/wH7A/8B+AP/AfUD/wH6A/8DVwG3AwMBBAwAA5MB+Bz/
+        A/4B/wP9Af8D/AH/A/oB/wP5Bf8D0wH/A1cBwgQAAzsBZQEwAWcBkQH3AS8BYgGJAfYBHgFcAZgB+gFM
+        AWMBdgHuAloBXgHVAw0BESAAAX8BgQGHAf4BjwGXAZoB/wFjAWcBagH/AWoBbwFyAf8BaQFuAXEB/wFp
+        AW4BcQH/AWkBbgFxAf8BaQFuAXAB/wFpAW4BcAH/AWkBbgFxAf8BagFtAXEB/wFqAW8BcgH/AWgBbQFw
+        Af8BcQGBAYUB/wGrAbYBvAH/A1kBxxAAA1QBrxj/A1gBuwMEAQUMAANbAcsDrQH+A7UB/QO1Af0DtQH9
+        A7UB/QO1Af0DtQH9A7UB/QO1Af0DtQH9A7UB/QO2Af0DtQH+A24B9QM7AWVAAAJZAVoBzwGOAZEBkgH7
+        AX4BhAGKAfoBfQGBAYcB+gF+AYQBigH6AX4BhgGMAfoBgQGHAY0B+gGDAYkBjwH6AYMBigGPAfoBhgGN
+        AZAB+gGHAY8BkgH6AYkBjwGSAfoBigGQAZMB+gGPAZoBngH8AWoBbAFvAfIDOgFiEAADUQGcAYcChgHz
+        AXsCegHvAXsCegHvAXsCegHvAXsCegHvAYcChgHzA1IBpwMBAQIwAAM/AW0BNQFIAZYB9gIhASIBMSAA
+        AwUBBwMjATMDNAFUAyYBOAMMARADAgEDZAADIAEuAzoBYQM2AVkDRQF/A1YBuwNWAbMDQAFwAzcBWgM5
+        AV8DHAEoMAADOAFeAToBogH4Af8CWgFdAcoDFwEgEwABAQMGAQgDCwEPA0EBcgF1AmQB7wFeAlsB2QNV
+        AbIDSAGGAzIBUQMZASMDDQERAwoBDgMHAQoDAwEECAABWQJXAcIBsgF8AVkB+wGjAW8BTQH6AZkCdgH6
+        AZsBeQF6AfoBmgJ4AfoBmgJ3AfoBmgJ3AfoBmgJ4AfoBmgF2AXQB+gGnAXgBYAH6AakBcwFNAfoBsgFf
+        AUUB+wFeAlsB0AwAAwMBBANgAd4CfwF+Af4BhgFhAWAB/QE7AWkBuAH/ATcBuQHzAf8BMgGIAc8B/wF3
+        AXABfgH+AY4BgwFrAf0BVgJSAf0DTgGXHAADOQFgA0oBjQFJAkgBhwM3AVsEAAMgAS4BUwFhAX8B7gFC
+        AbkB9AH/A1sByAMWAR4IAAMEAQUDJAE2A0QBeQNMAZIBbAJhAe4B/wH8Af0B/wH8AusB/wG7AaYBpwH9
+        AWcCUQHyA1cB3wNaAcoDVQGyA1ABmgNIAYUDMwFTAwsBDwQAAdIBcAFJAv8BxAFcAf8B7wGaAVMB/wHQ
+        AcQBxwH/AdICywH/AdMBygHLAf8B1wLOAf8B1gLOAf8B1QHQAdMB/wHUAcIBvQH/Af0BuQGMAv8BnQE7
+        Av8BlwEcAf8B3AF0AT0B/xAAA2AB3wG3AbMBsgH8AaQBnwGeAfoBWwGoAcoB/QFuAeQC/wFYAbYB8QH/
+        ApUBmwH7AbcBqwGqAfsBiwKHAfgDQAFwGAADSAGIAXkCdwH6AaoCowH/AYoCagH/AWoCaQH5AlsBWQHD
+        AygBPANUAa8BVwHwAv8BKAFxAcQB/wJFAUYBfggAAx0BKgG1ATsBAAH/AfQBUwEAAf8BuwFEARAB/wHx
+        AcwBzQL/AvMC/wH3AfYG/wH0AfUB/wHnAb0BvAH/AaABUAFIAf8BXgEdAQgB/wFUAQkBAAH/AZIBLgEA
+        Af8DUwGwAzYBWQQAAbUBbwE/AfwB/wG2AVYB/wHtAZQBUwH/AdQBwgHEAf8B2gFVAToB/wHXAaABlgH/
+        AdsB1wHaAf8B3AHOAc0B/wHbAdMB1AH/AdgBvgG6Af8B8wGUAV4B/wH+AY4BMwL/AY8BHwH/Ab4BZQFA
+        Af0IAAMRARcDFQEdAykBPwMzAVIDKAE8AVMCVQGwAaYBwgHfAf8CTAFdAfMDOgFiAy0BRgMvAUoDGAEh
+        AxUBHQMPARQMAAMpAT4BawFpAWcB8gG/AbsBsQH/AawBrQGmAf8BxgK6Af8BrgKUAf8BrwGaAZcB/wNe
+        AdACVQFXAboBVAG/AekB/gFUAeoB/AH/A1sByAMJAQwEAAG1ATsBAAL/AWkBBwH/Ae8BZwEMAf8BuwFz
+        AWgC/wHoAeYC/wHnAegC/wLvAv8C9gL/AvoG/wL7Af8B8gLPAf8BswFiAV8B/wFyATIBIAH/AbIBOgEA
+        Af8DSQGJBAABtAFrAT0B/AH/AbsBXAH/Ae8BmwFbAf8B3QHRAdIB/wHmATUBEgH/AeEBnQGRAf8B5QHt
+        Ae8B/wHlAd8B3QH/AuYB6AH/AeABygHFAf8B8gGCAUkB/wH9AY0BMwL/AZgBKAH/Ab0BYwFAAf0EAANL
+        AZADXAHnAVwCVQHqAVsCWAHjA1sB4QNaAd4BZQJdAfABzQG5AbUB/wF1AWUBYgH8A1oB5ANfAeADXQHi
+        A1wB5wNgAesDWAHjA0ABcAMWAR8DNwFbA1UBtQGHAXMBoQH/AV0BWAGMAf8BWQFbAYEB/wG6AbgBtgH/
+        Ab4BrAGrAf8BuwGmAaUB/wHCAawBogH/AUQBQgFoAfUBNAGSAb0B+wFdA/8BRQHGAfUB/wJGAUcBgAQA
+        AbUBOwEAAf8B/gFzARUB/wHKAVkBIgH/AfEBwwG7Af8B/AHTAcoB/wH3AdEBzwH/AdoBogGlAf8B2QGe
+        AaEB/wGrAVQBXgL/AvQC/wL1Av8B/gH9A/8B/QH/AbkBZAFbAf8BtQE7AQAB/wNMAZEEAAG0AWsBPQH8
+        Af8BvAFfAf8B8AGgAWIB/wLmAeoB/wHlAZYBhwH/AecBywHHAf8B7QH6Af4B/wHtAfEB9QH/Ae4B+gH+
+        Af8B5gHYAdQB/wHwAWIBMwH/Af0BigExAv8BnAEwAf8BvQFiAUAB/QQAAZQCjQH5AfIC8AH/AeIC4AH/
+        Ad0C2wH/AdwC2QH/Ac4CzAH/AdMC0gH/AecC5gH/Ae4C7AH/AfIC8QH/AfIC7wH/AfQC8QH/AeQB6QHi
+        Af8BxwHmAcoB/wHQAcsBygH/A1cBxQNWAbMBDwGWAeIB/wEHAZAB6AH/AQABgQHqAf8BAAFnAegB/wEk
+        AVQBvAH/Aa8BpQGfAf8BzgHAAb4B/wHMAbgBsgH/AacBmgG2Af8BMwFyAc0B/wFFAdAB8gH/AVkB+QL/
+        AWED/wFQAYEBoQH3AywBRAG1ATsBAAH/Af4BhwEnAf8BwgFpAVYB/wHVApkB/wHWAZ0BngH/AdcBoQGj
+        Af8B8wLeAf8B+ALsAf8BtgFkAWwB/wH9AeUB5AL/AuwC/wLzAf8B9QHPAc0B/wGNAT8BKgH/Ad4BSwEA
+        Af8DSwGQBAABtAFoATwB/AH/AcABZgH/AfMBnAFdAf8B6AHSAdAB/wHqAekB5wH/AesB3wHcAf8B6wHZ
+        AdUB/wHrAdkB1gH/AewB4QHaAf8B5wHBAbUB/wHvAUgBFgH/AfwBhgEsAv8BoAE1Af8BvQFhAUAB/QQA
+        AboCtwH9Ae4C8AH/AdIC0wH/AdUC1gH/AdUC1gH/AcMCxAH/Ac8C0AH/AfQB9QH0Af8B8QLyAf8B8QLy
+        Af8B8QLyAf8D8wH/AekB7gHqAf8B3AHuAeAB/wHiAeAB3wH/A1kBxwFaAWQBaQHhAUABjgGcAfQBKwGz
+        AcwB/QEWAbEB7wH/AQ8BoQHvAf8BWQGGAagB/wGpAZ4BlgH/AdECxgH/AdsBywHGAf8BvQGnAb4B/wFH
+        AaYB4AH/AVoB/QL/AVsB/AL/AVkB9QH8Af8BTwHbAfMB/wJXAVkBwgG1ATsBAAL/AZUBOwH/AdsBYgEm
+        Af8BywGMAYQB/wHwAcIBvwL/Ae4B6wL/Af0B/AX/AfkC5gH/AbgBYwFrAv8B4wHiAv8B6QHoAf8BswFd
+        AVkB/wGzAW8BQAH/AfIBUwEAAf8DSwGQBAABtAFnAToB/AH/AcUBcAH/Af0BowFUAf8B9wGZAVAB/wH4
+        AZoBUAH/AfgBlwFMAf8B+AGXAUgB/wH4AZQBRQH/AfgBlAFEAf8B+QGPATwB/wH8AYEBKgL/AZEBMgL/
+        AaABOQH/Ab0BXwFAAf0EAAGwAqoB/AHlAuYB/wHbAtwB/wPfAf8D3wH/A+AB/wHhAuAB/wPgAf8D3wH/
+        A+AB/wPgAf8D4AH/AeEB4AHhAf8B7wHsAe8B/wHhAt0B/wNZAcMDDAEQAy8BSQFdAVwBXQHiAZsBjwGe
+        Af8BcgFqAYgB/wFyAWwBcwH/AZ8CnQH/AdYCzQH/AeQB2wHZAf8B+wHiAdgB/wGPAZQByQH/AUoB0wHw
+        Af8BgAP/AV8B4AH0Af8CWAFpAeYCNAE1AVUBtQE7AQAC/wGhAVAC/wFvAQwB/wH8Ac8BqQH/AeABqAGO
+        Af8BygGGAXAB/wHlAawBqQH/Af4B4AHeAv8B/AH7Af8BuQFoAW8C/wHWAc0B/wHyAcEBvAH/AYIBKQEe
+        Af8B6QGqAWgB/wH2AVQBAAH/A0sBjwQAAbUBYwE3AfwB/wHOAZMB/wH4AdgBvgH/AfgB1wG6Af8B9wHU
+        AbUB/wH1AdIBswH/AfIBzwGwAf8B8QHNAa4B/wHxAckBqwH/Ae8ByQGpAf8B7AHMAa0B/wHoAcQBqQH/
+        AfsBrwFbAf8BvgFbAUAB/QQAAYMCfwH0AfcC+AH/A/EB/wPwAf8B7gLvAf8D7gH/AewC7QH/AeoC6wH/
+        A+kB/wPoAf8D5wH/A+UB/wPjAf8B6wLsAf8BzwLKAf8DVQGxAT0CPgFqASIBUQGgAfoBDwFeAcIB/wEU
+        AWcB0wH/AQkBVgHOAf8BIAFOAbwB/wGoAaABogH/AeQB2QHUAf8B8QHpAeoB/wGwAbYB2QH/AVYBZQG+
+        Af8BKwGaAdkB/wGIAf4C/wGdA/8BWAFmAXsB7wIhASIBMQG1ATsBAAL/Aa4BZgL/AW8BDAL/AdwBvgL/
+        AdwBvgH/Af4B2QG4Af8B6gG5AZ0B/wHNAYkBbwH/AdsBnQGZAf8B+gHTAdIB/wG8AWcBawH/AbYBZwFe
+        Af8BrQE/ASwB/wH8AcEBjAH/AfYBVAEAAf8DRAF8BAABtQFhATQB/AH+AdMBngH/AfUC+AH/AfwD/wH8
+        A/8B/AP/AfoB/QL/AfoB+wH9Af8B+gH3AfkB/wH5AvQB/wH5AfIB8wH/AekB5gHqAf8B8gGzAWkB/wG+
+        AVoBPAH9BAABYQJgAd8I/wH5AvoB/wH2AvcB/wPzAf8B7gLvAf8B6gLrAf8D5wH/AeIC4wH/A94B/wHZ
+        AtsB/wPWAf8B3QLeAf8BqAKiAf8DSAGIAVgBYgFlAd0BGAHeAv8BDQHVAv8BAAG6Av8BAAGiAv8BTwGa
+        Ad8B/wHIAbQBrgH/AekB4AHdAf8B7gHpAfAB/wFGAYwB1AH/AVgBzAHvAf8BiwHnAfcB/wGXAf0C/wGj
+        A/8BmAP/AlkBXAHMAbUBOwEAAv8BuwGIAv8BbwEMFf8B8gLlAf8B0gKlAf8BpAFCAUsB/wHLAaoBqQH/
+        A/YF/wH2AVQBAAH/AyUBNwQAAbUBYQE0AfwB/QHSAZwB/wH2AfUB8gr/AvwC/wH5AfYC/wH3AfIC/wHz
+        Ae4C/wHwAekC/wHxAesB/wHwAeUB5AH/AfIBswFnAf8BvgFaAToB/QQAA1cBugHfAtUB/wHjAtkB/wHc
+        AtMB/wHbAtEB/wHaAtAB/wHXAs4B/wHVAswB/wHUAssB/wHTAsoB/wHRAskB/wHPAsgB/wHQAskB/wHX
+        AtAB/wFwAl8B+wM0AVQDMgFQAzUBVgNVAbUBcAGQAaAB/wGkAcIB2gH/AcMBygHQAf8BywG+AbsB/wHz
+        Ae4B7QL/Af0C/wGGAagB4QH/AXMB2wHzAf8BxAP/AbcD/wFIAa0B4gH/AUIBWQGGAfUCVwFhAd8BtQE7
+        AQAC/wHJAZ8C/wGyAWsC/wFvAQwC/wFvAQwC/wFvAQwC/wFvAQwC/wFvAQwC/wFvAQwC/wFvAQwB/wH+
+        AW8BDAH/Af4BbwEMAv8BbwEMAv8BbwEMAf8DKgFAAwQBBQQAAbUBYAEyAvwB0gGdAf8B9AHzAfEG/wH8
+        AfsC/wH3AfYC/wH0AfEC/wHyAe0C/wHuAegC/wHuAecC/wHzAe8B/wHsAeUB5AH/AfABsgFoAf8BvgFX
+        ATkB/QQAA0wBkgG3AqEB/wHGArAB/wHBAqwB/wHCAq0B/wHDAq4B/wHEArAB/wHGArMB/wHIArYB/wHL
+        ArkB/wHOAr0B/wHRAsEB/wHZAssB/wHWAsMB/wFkAlcB8QMdASoIAAMsAUQBXAFUAUEB+AHsAeEB3AH/
+        AeYB3QHbAf8B5QLaBf8B3wHZAdMB/wFBAUkBXwH7AU0BqAG+Af0B0QP/AdED/wGNAccB6gH/A04BlAMB
+        AQIBtQE7AQAC/wHVAbUC/wHVAbUC/wHVAbQC/wHWAbUC/wHVAbMC/wHVAbMV/wG1ATsBAAH/AyoBQAME
+        AQUIAAG1AWABMgH8AfsB0gGdAf8B8wHxAfAC/wL+Av8B+QH1Av8B9QHxAv8B8QHtAv8B7gHnAv8B7QHm
+        Av8B7wHpAv8B9gHzAf8B6wLlAf8B8QGzAWoB/wG+AVgBOgH9BAADPQFoAZYCggH+AcoCtQH/AcYCsgH/
         AcYCswH/AcgCtAH/AcoCtwH/AcsCuQH/Ac0CvAH/AdECwAH/AdMCxAH/AdcCygH/Ad8C0gH/AckCtQH/
-        AVsCWgHhAwwBEAwAA0oBjAFgAlsB/wGfApUB/wG0ArMB/wGIAYcBiAH/A1YBuANDAXcBUgFlAXwB6gHf
-        Af4C/wHnA/8B6wP/AVIBbQGhAfcDJAE2AbUBPgEAAv8B4AHHAv8B4AHHAv8B4AHHAv8B4AHHAv8B4AHH
-        Bf8BtQE+AQAB/wG1AT4BAAH/AbUBPgEAAf8BtQE+AQAB/wG1AT4BAAH/Ax0BKgMEAQUDAgEDCAABvgFe
-        AUAB/QH6AdQBoAH/AfIB7wHwAv8B/gP/AfgB9gL/AfUB8QL/AfEB7AL/Ae8B6wL/AfMB7gL/AfUB8wL/
-        AfwB+wH/AewC6gH/AeABpQFgAf8BvwFWAS0B/QQAAyYBOAF9AnEB9gHGArEB/wHHArMB/wHHArMB/wHJ
-        ArYB/wHLArkB/wHNArwB/wHQAr8B/wHSAsMB/wHVAsgB/wHbAtAB/wHdAtEB/wGwApwB/wNWAcEQAAMB
-        AQIDNAFUA0IBdAM+AWwDMQFPAwsBDwMAAQECWQFeAskB+QL/AfsH/wHRAfgB/gH/AVoBWwFdAcgBtQE+
-        AQAV/wG1AT4BAAH/AysBQgMHAQoDAwEEAwMBBAMCAQMDAAEBEAAB0AFfATAC/wHhAacB/wH3AfoB8wf/
-        AfoD/wH1Av8B/AHyAv8B/gH2A/8B+gP/Af0F/wHxAfUB7gH/AecBswFqAf8B0wFZARoB/wQAAxABFgFn
-        AmMB6gHDAq0B/wHPArsB/wHQAr4B/wHRAr8B/wHUAsMB/wHXAscB/wHbAssB/wHeAtAB/wHhAtYB/wHp
-        At4B/wHdAssB/wGYAoQB/wNMAZIsAAJIAUkBhwExAV8BpgH7AU0BbgGpAfoBSgFrAacB+gFJAWoBsgH7
-        AUEBTgF6Ae8DAQECAbUBPgEAAf8BtQE+AQAB/wG1AT4BAAH/AbUBPgEAAf8BtQE+AQAB/wMdASoDBAEF
-        AwIBAyAAAVYCVAGrAaoBWgEyAfsBkgFZAVYB9QGSAVkBWAH1AZIBWQFWAfUBkgFZAVQB9QGSAVkBTAH1
-        AZIBWQFUAfUBkgFZAVQB9QGSAVkBVAH1AZIBWQFUAfUBmgFXAVEB9wGqAVYBLAH7AVgCVgG7CAADUQGc
-        AYACeAH6AZUCiwH7AZYCgAH6AZYCgQH6AZkCgwH6AZoChgH6AZwCjAH6AZ0CkAH6AZ4ClQH6AZsClgH7
-        AZMCfwH8A18B4AMhATAYAAMhATEDQAFwA1ABngMpAT8EAAMKAQ4DEQEXHAADBAEFAxQBHAMnAToDLAFE
-        AygBPQMjATQDHgErAxgBIgMUARsDEAEVAwwBEAMJAQwDBAEGAzoBYQNYAccDWQHMA1oBygNaAcoDWgHK
-        A1oBygNaAcoDWgHKA1oBygNaAcoDWgHKA1oBygNaAc4DWQHDAzQBVQNKAYwDVgG2A1UBsQNVAbEDVQGx
-        A1UBsQNVAbEDVQGxA1UBsQNVAbEDVQGxA1UBsQNVAbEDVQGxA1YBtgNOAZgUAAFfAl4B2QHFArIB/wHP
-        ArsB/wNYAcADKQE/A1sBywNdAdIDMQFPGAADHwEsAlcBWgHFAVcBWgFgAdYDVwG/A1ABpANKAYsDQQFy
-        AzgBXQMxAU4DLQFFAygBPQMjATQDGgElA2UB7gPiAf8D3QH/A9oB/wPaAf8D2AH/A9gB/wPXAf8D1wH/
-        A9UB/wPVAf8D1AH/A8gB/wPaAf8DmQH/A1cBvQFuAUABNQH9AbQBdgFoAf8BsAGGAXYB/wG0AYgBgAH/
-        AbIBiAF3Af8BsQGGAXcB/wGuAYYBdwH/Aa0BhQF3Af8BrAGFAXYB/wGqAYQBdgH/AakBgQF1Af8BqAGC
-        AXYB/wGmAYEBdQH/AacBgwGCAf8BrAF1AW8B/wFIAT0BOQH0CAADOgFiAzgBXgMyAVEBhQJ7AfYB5gLS
-        Af8B5wLYAf8BxQK0Af8BnQKOAf8BzAK6Af8B4ALMAf8BjQJ/Af4DNwFbEAADAgEDAk8BUQGcATgB3gL/
-        AUYBswHHAf8BKAGNAa0B/wEXAZYB0QH/ARIBfwHHAf4BLQFaAY4B9QFKAVcBaAHoAVcBWgFeAdUDVwG/
-        A1IBpgNJAYkDNAFUA40B9wT/A/QB/wPzAf8D8wH/A/EB/wPwAf8D7gH/A+0B/wPrAf8D7AH/A+cB/wOW
-        Af8D0AH/A8wB/wNZAcMBpgFTAUIB/QHzAdsBzgH/AeAB0QHGAf8B3wHNAcEB/wHaAckBvwH/AdoByAG9
-        Af8B2gHFAbsB/wHZAcUBugH/AdkBxQG4Af8B2AHDAbYB/wHYAcEBtAH/AdgBwQGyAf8B1gG/AbAB/wHY
-        AcQBtQH/AeQBvAGoAf8BWQFIAUQB8gQAAzUBVwGvAp0B/wG4AqQB/wGlApMB/wHHArQB/wHhAtEB/wHt
-        AuEB/wHsAt8B/wHjAtIB/wHbAs4B/wH0AusB/wHxAuIB/wFZAlcBwhAAAw4BEwFNAV8BdAHoAVgB0wH0
-        Af8BswFzAVMB/wHiAakBhAH/AcEBlAFpAf8BpgGYAXQB/wGCAaMBnQH/AVcBsAHMAf8BOwG4AfYB/wEn
-        AbEC/wEbAZ4C/wELAVkB0wH/A1EBoAOFAfYD+wH/A+oB/wPrAf8D6gH/A+gB/wPnAf8D5gH/A+QB/wPj
-        Af8D5AH/A98B/wOcAf8D0AH/A8QB/wNWAcEBpAFSAUAB/QHvAccBnAH/AcQBpQGCAf8B2QGsAXUB/wHz
-        AbcBdwH/AfEBsQFuAf8B8gGtAWcB/wHyAakBXwH/AfIBpAFZAf8B8gGgAVMB/wHyAZwBTAH/AfIBmQFF
-        Af8B8gGVAT8B/wH1AZUBPAH/AfYBkAE1Af8BVgFHAUAB8QMMARABbAJpAecBzAK5Af8B3QLLAf8B2gLH
-        Af8B2ALHAf8B6QLcAf8B8QLmAf8B9gLsAf8B9gLtAf8B9gLtAf8B/QL2Af8B3QLQAf8DYQHcA0UBfgME
-        AQYIAAM4AVwBKQGpAfQB/wFiAaMBtAH/AeQBtAGLAv8BzwHEAv8B1gG9Av8B3AG2Af8B+wHIAZ0B/wHm
-        AbMBhAH/AcQBoAFwAf8BnwGbAXcB/wF0AqoB/wFRAc4C/wFYAVkBXAHNA4cB9gP8Af8D7QH/A+0B/wPs
-        Af8D6gH/A+kB/wPoAf8D5gH/A+UB/wPlAf8D4QH/A9MB/wPqAf8DwQH/A1YBwQGoAVEBQAH9AeYBywGu
-        Af8B0AHcAeMB/wHVAb0BpgH/Af4BvQGAAv8BvAGAAv8BtgFwAv8BsgFpAv8BrgFiAv8BqQFcAv8BpQFW
-        Av8BogFPAv8BnwFJAv8BnwFFAv8BmQE9Af8BWQFHAUAB8QQAA0wBkAHMAroB/wHpAtsB/wHoAtsB/wHt
-        AuAB/wHyAuYB/wHeAtEB/wHQAsMB/wHlAtoB/wH8AvQB/wH9AvcB/wHnAtsB/wHbAsYB/wGxAp4B/wM6
-        AWIEAAMDAQQDVgG2AUkBzwL/AZcBkAGAAf8B/QHVAboB/wH0AbsBuQH/Af0B3gG/Af8B/gHdAb8C/wHm
-        AcsC/wHnAcsC/wHnAckC/wHRAa4B/wHRAaABWgH/AR8BiQHSAf8DSgGKA4gB9gP9Af8D7gH/A+4B/wPt
-        Af8D6wH/A+oB/wPpAf8D5wH/A+YB/wPmAf8D4wH/A6IB/wPTAf8DxwH/A1YBwQGnAVEBQAH9AfAB1gG6
-        Af8B6AHzAfoB/wHhAcoBtAH/AfsBvAGBAv8BvQGCAv8BtwFzAv8BswFtAv8BrwFmAv8BqwFhAv8BpwFb
-        Av8BpAFUAv8BoQFPAv8BogFMAv8BnAFGAf8BWQFHAUEB8QMVAR0DSAGEAcACqwH/AeYC1wH/AewC4AH/
-        Ae8C4wH/AX8CegHvA0IBdAMsAUQDSAGFAakCpAH6Af8C/AL/AvsB/wH5AvMB/wHwAuUB/wNTAaoEAAMZ
-        ASMBMQFZAZgB9QFqAckB6wH/AcgBoAF1Af8B/AHTAdEB/wH2AcsBxQH/AfwB4wHKAf8B/QHgAcoB/wGu
-        AaABgQH/AeIBxQGwAv8B3QHFAf8B9AHJAawB/wH4AdgBqwH/AVgBWQFaAdsDIwEzA4kB9gP9Af8D8AH/
-        A+8B/wPuAf8D7AH/A+sB/wPqAf8D6QH/A+cB/wPpAf8D5AH/A5EB/wPNAf8DywH/A1YBwQGlAVMBQAH9
-        AfsB1AGqAf8B4wHDAaIB/wHvAcABlgL/AcIBjAL/Ab4BhQL/AbkBdwL/AbUBcQL/AbEBagL/Aa4BZQL/
-        AaoBXwL/AacBWQL/AaQBVAL/AaYBUgL/AaABSwH/AVkBRwFBAfEBZwJiAeQBwQKrAf8BzQK2Af8B5ALW
-        Af8B8wLpAf8BzQK9Af8DNAFVCAADCwEPAYQCfwHzAf8C+gn/Af0C9gH/A1sBywMAAQECQQFCAXMBMQGg
-        Af0B/wGVAbABrQH/Ae0BxAGkAf8B9QHHAdUB/wH4AeEB0gL/AekB2wH/Ac8BwwGnAf8BMgGkAUMB/wFY
-        AZEBTwH/Ad8BuwGsAf8B9QHLAbQB/wH4Ac4BoAH/A0oBigMTARoDiQH2A/4B/wPxAf8D8QH/A/AB/wPu
-        Af8D7QH/A+wB/wPqAf8D6QH/A+gB/wPmAf8DywH/A+gB/wPHAf8DVgHBAagBVAFAAf0B5wHKAagB/wHD
-        AbgBrQH/AdcBtQGWAv8BxQGPAv8BwQGKAv8BvAGDAv8BuAF1Av8BtAFvAv8BsgFpAv8BrgFkAv8BqwFe
-        Av8BqAFZAv8BqQFYAv8BpAFRAf8BWgFJAUEB8QFpAmYB4AHSAr0B/wHiAtIB/wHtAuIB/wH4Au0B/wGU
-        AowB+QMdASkEAAMUARsDVQGyAdgCxwH/Af4C+wX/AbMCqQH7A1EBoAMoAT0DBAEGAlkBXgHJAWEByAL/
-        AbgBpgGFAf8B+QHWAdMB/wHzAcsB2AH/AfcB6wHeAf8B/AHkAd4B/wGBAbEBcAH/AWIB6AGfAf8BVAHb
-        AY0B/wFYAZYBUgH/AesB1gHLAf8BYgFhAVwB3AMpAT8DDQERA4kB9gT/A/MB/wPyAf8D8gH/A/AB/wPv
-        Af8D7QH/A+wB/wPqAf8D6gH/A+gB/wPIAf8D5QH/A8kB/wNWAcEBqAFTAUAB/QHrAdYBvwH/AeQB8wL/
-        AdsBygG5Af8B+wHDAY0C/wHEAY8C/wHAAYcC/wG8AYIC/wG5AXQC/wG1AW8C/wGyAWkC/wGuAWQC/wGr
-        AV8C/wGtAV4C/wGoAVkB/wFaAUkBQwHxA1IBoQHUAsIB/wH2AuwB/wHyAugB/wH3Au4B/wHYAskB/wNg
-        AdYDVwG4AWoCaAHoAc4CuwH/AewC4Qn/AYICewHzAx0BKgQAAygBPAEhAU8BvQH6AZUBzgHiAf8B2AG2
-        AZEB/wH3AdMB7AH/AfMB4AHkAf8B/AHuAewB/wHKAdABuAH/AVMBxgFtAf8BYQG6AWoB/wFeAc8BhAH/
-        AVUB6AGbAf8BUwGZAU8B/wNOAZcDLwFKAxkBIwOLAfYE/wP0Af8D9AH/A/MB/wPxAf8D8AH/A+8B/wPt
-        Af8D7AH/A+0B/wPoAf8DiQH/A8kB/wPQAf8DVgHBAacBVQFAAf0B9gHcAb0B/wHnAeAB2AH/AecBzAGw
-        Af8B/gHHAZUC/wHGAZMC/wHCAYwC/wG+AYcC/wG7AYEC/wG4AXQC/wG0AW8C/wGyAWoC/wGvAWYC/wGx
-        AWUC/wGsAV8B/wFgAUkBQwHxAxwBKAFgAl8B0QGMAoQB8wHgAtEB/wH3Au8B/wH5AvEB/wHoAtoB/wHc
-        AskB/wHfAs8B/wHsAuMC/wL+Cf8B8ALlAf8DWAHBAwEBAgJPAVABmwFBAZ4C/wG1Ab4BqgH/AfIBzgG+
-        Af8B9wHTAe8B/wH8AfMB8QL/AfEB9AH/AWEBugFiAf8BXAG6AWMB/wHrAd4B2AH/AcgB0gG5Af8BZgHK
-        AXAB/wFLAe4BlQH/AVkBXQFZAdcDNwFaAykBPwONAfYE/wP2Af8D9QH/A/UB/wPzAf8D8gH/A/AB/wPv
-        Af8D7QH/A+0B/wPqAf8DsAH/A9wB/wPPAf8DVgHBAagBWAFAAf0B9QHXAbAB/wHUAbYBmAH/AegBvwGZ
-        Av8BzgGeAv8ByAGYAv8BxQGRAv8BwQGMAv8BvgGGAv8BuwGBAv8BtwF0Av8BtQFwAv8BsgFsAv8BtQFr
-        Av8BsQFlAf8BYAFKAUMB8QQAAwgBCwFlAmIB3AHQArsB/wH1AuwB/wH9AvgG/wL9Av8C/gn/AfQC7QH/
-        Af0C+wH/Ad0C0wH/A0ABbgQAATkBTgGLAfABhwHOAf0B/wHOAbkBkgL/Ad0B8QH/AfwB3gHuAf8B3gHb
-        AdQB/wHmAtsB/wHEAdIBtgH/AfEB6gHjAv8B8wH1Av8B9wHuAf8BhgGDAZYB/gNVAboBSQG/AWYB+gFZ
-        AV4BWQHXAzABTQONAfYE/wP3Af8D9gH/A/YB/wP0Af8D8wH/A/EB/wPwAf8D7gH/A+0B/wPrAf8D4gH/
-        A/QB/wPMAf8DVgHBAagBVwFAAf0B5gHUAbwB/wHSAdoB4AH/AdUBxAGxAf8B/AHNAZ0C/wHLAZwC/wHH
-        AZUC/wHDAZEC/wHBAYsC/wG+AYYC/wG7AYIC/wG4AXYC/wG2AXEC/wG4AXEC/wG0AWsB/wFgAUwBQwHx
-        CAADVQGwAdwCywL/Av0B/wH8AvUB/wHrAuEB/wH6AvYJ/wGKAoQB8gNEAXkDVAGuA0oBjAgAAVYBXQFz
-        AeIBvAHjAeQB/wHpAccBkgH/Ae4B1wHQAf8BVwGcAUoB/wESAYoBDQH/AREBgAEKAf8BTgGDATgB/wHv
-        Ad0BzgL/AfIB4AH/AecB4QHCAf8CWQFdAdIDGwEmAyIBMgFaAV4BWwHIAVgBWwFYAcYDjQH2BP8D+QH/
-        A/gB/wP4Af8D9gH/A/QB/wPzAf8D8gH/A/AB/wPxAf8D7QH/A50B/wPSAf8D0gH/A1YBwQGoAVgBQAH9
-        AfAB4QHNAf8B5gHxAfkB/wHfAdMBwwH/AfwB0gGlAv8B0gGlAv8BzgGfAv8BywGZAv8ByAGUAv8BxAGQ
-        Av8BwgGLAv8BwAGHAv8BvQGCAv8BvgGEAv8BvAF0Af8BYAFMAUUB8QgAAxIBGQNSAaMB2wLNAf8BbwJq
-        AeIDQAFuAXcCcgHnAf8C/gH/AfwC+QH/A1wByRQAAy0BRQNVAbIBWgJdAcoBWQFqAWYB7AFJAcoBRAH/
-        AUsB3QFJAf8BPgHYATgB/wEaAYwBKgH/AY0BrAHFAf8BqgHMAdcB/wFZAWoBiAHsAzEBTwMIAQsDAAEB
-        AwIBAwMfASwDkAH2BP8D+wH/A/kB/wP4Af8D9gH/A/QB/wPzAf8D8gH/A/EB/wPxAf8D7QH/A5YB/wPP
-        Af8D1AH/A1cBwgGjAXEBTQH+Af8B8gHNAf8B+gHeAcUC/wHbAbgC/wHgAbIC/wHeAa0C/wHZAaYC/wHW
-        AaIC/wHTAZwC/wHPAZgC/wHNAZQC/wHLAZAC/wHIAYwC/wHLAYwC/wHGAYcB/wFfAUoBPQHzEAADMgFQ
-        Ax8BLAQAA0oBiQFvAmoB4gNWAbEDNQFXIAADIAEuA1sBwwGEAasBhAH3AVwBYAFcAdQDPQFpAz4BawJB
-        AUIBcwMfAS0DBAEFAwABAQwAA5kB+Bz/A/4B/wP9Af8D/QH/A/sB/wPfAf8D9gH/A9QB/wNXAcIBWQFI
-        AT0B8gF7AU0BQAH6AXkBTQExAfoBeQFNATIB+gF4AU0BMgH6AXcBTQExAfoBdwFNAS8B+gF2AU0BLgH6
-        AXYBTQEsAfoBdQFMASoB+gF1AUoBKgH6AXUBSgEpAfoBdQFJASkB+gFqAUMBNQH5AXcBOAErAfwBWAJW
-        AdmAAANbAcsDswH+A7gB/QO4Af0DuAH9A7gB/QO4Af0DuAH9A7gB/QO4Af0DuAH9A7gB/QO6Af0DvgH+
-        A3QB9QM7AWVMAANWAbMDUgGpAzUBWAMtAUUDHAEnAxcBIAM7AWUBVwFkAWYB2wNBAXMDGgEkAwQBBhgA
-        AxUBHQNCAXYDVQGyA1cBwgNWAcEDVAGrAz4BawMPARQcAAMQARYDWwHIA2QB8QNiAe8DYgHvA2IB7wNi
-        Ae8DZwHyA1oB0wMUARsUAANWAbMBZwJNAfIBXAJXAeADVgG2A0QBeQMoATwDDQESKAADUgGpAQABlgHt
-        Af8BWQJeAdADRAF7AzUBVgJPAVEBnAEsAYoBtgH3AS0BhgGeAfUDPAFmAykBPgMXASADCgENAwIBAwwA
-        A0MBdwFjAlIB6gGtAXsBegH+AdoBoAGdAf8B4gG1Aa0B/wHeAa0BpQH/AcsBkQGKAf8BfAFDAUAB/AFY
-        AlYB3AM4AV0YAAMEAQYDdAHrA/oB/wPwAf8D8AH/A+8B/wPyAf8D8gH/A1cB3xQAASwCKwFDAaABbgFq
-        AfkB/wHjAdQB/wHvAcABswH/AdABmwGTAf8BlgFrAWkB/gFtAUQBRQH4AVgCUwHkA1cBvwNIAYYDLwFK
-        AxABFhgAAzEBTgEAAWEB6gH/AQABLQH0Af8BQwFnAX8B7gFWAV4BYAHZAQEBgwL/AQABMAHxAf8BUAFv
-        AXkB8QNTAaoDQQFyAzEBTwMhATEDDQESCAADUAGjAbICcQH9AfsC5AL/AekB5gL/AdkBzwL/AekB2QL/
-        AegB1gL/AecB1QL/AdoBygH/AdwBmgGRAf8BXAI8AfgDRQF/CAADBAEGAyoBQQM/AW0DSgGLA1kB6wO9
-        Af8DvwH/A7wB/wO9Af8DvgH/A60B/wNXAeUDTQGWA0IBdgMwAU0DFAEbBAABSQJIAYcB3wGsAaUC/wHc
-        AcUC/wHXAcEC/wHfAc0C/wHhAdMC/wHbAdAB/wH0AcgBvwH/AdkBpAGeAf8BrgFsAWkB/wFpAUQBQwH7
-        AVkCTgHrAVkCWAHHA04BlAMlATcLAAEBAw4BEwFRAXABfQHmAQIBHQH3Af8BCgEwAv8BDQFUAv8BCQEU
-        AfgB/wEAAWcB+AH/AbkBywG1Av8B3gGvAf8BhgFyAWQB8QNQAaQDNgFZAyIBMgQAA0sBkAHEAYgBigH+
-        Bf8B/gH8Av8B6QHnAv8BzQHDAv8B2AHJAv8B2gHJAv8B1wHGAv8B2gHHAv8B5QHRAf8B9AG1AacB/wFc
-        ATwBOwH4AzgBXAQAA1oBzQN+AfwBtwG4AbkB/wHQAdEB0gH/Ac4BzwHQAf8B2gHbAdwB/wLlAeYB/wHi
-        AeMB5AH/AeIB4wHkAf8B4wLlAf8C5QHnAf8BzAHRAc8B/wG7Ab8BvQH/AqwBrQH/A3kB/ANZAdIEAANb
-        AcgB8gHNAcQC/wHbAc0C/wHWAcwC/wHZAdEC/wHaAdQC/wHdAdYC/wHiAdkC/wHnAd0C/wHoAd4C/wHf
-        AdQB/wH6AcwBwQH/AeMBrQGmAf8BowFQAU8B/wNVAbIEAAMCAQMDCwEPAx0BKgFYAWABZQHWASYBYgH9
-        Af8BWwFjAf0B/wFNAVgB/AH/ASoBPgH8Af8BDgGUAfUB/wHEAcMBpQL/AdsBpQL/Ae8BxwH/AewBvgGV
-        Af8DUQGnAzMBUgMqAUEBlgJlAfkB/wHwAe8C/wH7AfkC/wHwAe8C/wHvAe4C/wHZAdEC/wHcAcwC/wHg
-        Ac4C/wHYAccC/wHTAcEC/wHUAcEC/wHjAcwB/wHcAZQBhwH/AVgCVgHcAxABFgO8Af0C+AH3Af8B1QHR
-        Ac4B/wHTAdABzQH/AdIB0AHNAf8B0QHPAcwB/wHGAcQBwgH/AbcBtgGzAf8BvgG8AbsB/wLNAcsB/wLR
-        Ac8B/wHPAdEBzgH/Ac4BzwHNAf8D2QX/A2wB8wMcASgBfAFjAWEB8AH/AeEB2gL/AeAB3AL/AeEB3wL/
-        AuMC/wLlAv8C5wL/AuUC/wHhAeAC/wHdAdsC/wHbAdUC/wHdAdAC/wHsAd0B/wHGAYIBdgH/A08BmwQA
-        AwkBDAMwAUsBWQFgAWMB1AE1AZoB/AH/AaUBsAH+Af8BnQGrAf0B/wFyAY0B/AH/AVQBZwH7Af8BHQFK
-        AfkB/wEUAYEB5gH/AZ4BrgGhAf8B/gG+AYMC/wHjAbAB/wGhAYQBaAH3A0UBfQFVAlMBsAHxAbsBuQL/
-        AdwB1wL/AdsB2AL/Ae4B7QL/AfcB9QL/AdQB0QL/AbkBsgL/AcYBuwL/AdgBxwL/AdYBxAL/AdIBvgL/
-        AdYBwQL/AdABugH/AY8BRAFAAf0DPgFrAa8BswG1AfsBuwGwAaYB/wGwAW4BPQH/AcYBiAFPAf8BxgGA
-        AUoB/wHGAXIBRQH/AcQBbgE/Af8BxAFoAToB/wHEAWMBNgH/AcIBXgEwAf8BwgFYASoB/wHCAVQBJwH/
-        AcEBTAEeAf8BmQFCASEB/wHSAdQB1gH/A2gB8AE+Aj0BagG/AYsBigH+Af8B7AHrAv8B5wHoAv8C7gL/
-        AvcB/wH+AvgB/wH8AvMB/wH+AvUC/wHvAe4C/wHqAesC/wLlAv8B5gHiAv8B0gHNAf8BgAJBAfkDMAFL
-        BAADQgF2AS0BdQGjAfYBIAFtAv8BjgGmAv8BjAGlAv8BjAGaAf0B/wFvAYgB/AH/AUYBYgH9Af8BJQFL
-        Av8BAQEtAv8BAAFdAfIB/wFVAaQBvAH/AcMBhAFLAf8BywFxATYB/wNWAcEBdQJiAekB/wHvAekC/wHk
-        AdwC/wHSAcsC/wHZAdIC/wHLAcoB/wH9AaoBrwH/Af4BwAHDAf8B/QGuAbQB/wH+Aa8BqwL/AdYBwwL/
-        AdMBvwL/AdABvAL/AdoBwwH/AcwBhgFxAf8DUwGtAasBsQGzAfsBvQGvAaEB/wHmAaIBZAL/AbwBhwL/
-        Aa4BcgL/AaUBaQL/AZwBYAL/AZQBWQH/Af4BjAFQAf8B/QGFAUcB/wH9AXUBQAH/AfwBbgE5Av8BZgEu
-        Af8BwAFPASIB/wHMAtAB/wJoAWkB8AFWAlQBqwHwAckByAL/AvoC/wH8Af0B/wH+AvoB/wH0AeUB5gH/
-        AeYBvgG9Af8B3QGYAZMB/wHvAdIB0Ab/AfQB9QL/AfAB7wL/AfQB9QH/AfACvAH/AVsCVgHhAw8BFAQA
-        AVgBXQFgAcsBWAFgAWgB1gFCAXQBmQH1AScBiQHKAf8BFQGVAekB/wFTAYoB/gH/AWcBdAH8Af8BGgGL
-        AfkB/wE7AaYB4AH/ASoBiwHOAf8BIgGAAcUB/wErAaYB2gH/Aa8BhwFeAf8B3wGXAU0B/wFuAV8BVwHo
-        AaoBdwFxAfkB/wH3Ae4C/wHrAeIC/wHpAd4C/wHYAc0C/wGpAaoB/wHiAbYBugH/AacCbwH9Ab4BmwGc
-        Af4B/QGuAbMC/wHBAbUC/wHWAcIC/wHPAbsC/wHZAcIB/wHfAZ4BjgH/A1cBwgGtAbEBswH7Ab0BrwGj
-        Af8B4QGgAWQC/wG5AYcB/wH5AawBcwH/AfgBpAFrAf8B+AGdAWMB/wH2AZYBXAH/AfYBjgFUAf8B9QGI
-        AU4B/wH0AYEBRwH/AfMBdAFAAf8B/QFtATcB/wG9AVQBKgH/Ac0C0AH/AmgBaQHwAWkCXwHjAfwB5wHm
-        Af8B+gHoAeUB/wHmAcEBvAH/AdIBmQGWAf8ByAF3AXUB/wHKAXMBcQH/Ac8BcgFtAf8B0wGDAXQB/wHy
-        Ad0B2gb/AvgC/wL+Af8B0gGRAZAB/wNTAbAQAAJdAVoBygGEAS8BAAH/AUwBUgFMAf8BJwGLAv8BOAFj
-        Av8BTAGYAcgB/wHvAZwBSwH/AYYBNwEBAf8BdwExAQAB/wGUAT8BCgH/AdsBjAE6Af8B1wGVAUwB/wGH
-        AWoBTAHzAa8BggF/AfsB/wH1Ae0C/wHoAd8C/wHqAd8C/wHYAc4C/wGzAbYB/wHSAbIBswH/AVgBMQEw
-        AfcBpwJvAv0BwAHFAv8BuAGuAv8B1wHBAv8BzwG7Av8B2AHCAf8B4gGiAZIB/wNXAcIBrQGxAbUB+wG8
-        Aa8BowH/AeIBowFoAv8BvQGLAf8B+gGxAYAB/wH5AakBbwH/AfkBogFoAf8B+AGbAWEB/wH3AZQBWgH/
-        AfYBjgFUAf8B9gGIAU0B/wH1AYIBRgH/Af0BdgFAAf8BvgFbAS8B/wHNAtAB/wJoAWkB8AGhAXcBbgH3
-        Ad0BnwGcAf8BsgFZAVcB/wGjAUUBRAH/AaYBSgFJAf8BsAFYAVcB/wG4AWMBYgH/Ab8BbAFrAf8BwAFm
-        AWMB/wHOAXYBbwH/AfcB3wHZBv8B9QHzAf8BowFPAU0B/QM9AWoQAAJZAVcBvwGeAVMBFQH/Ab4BhwFI
-        Af8BJQGFAfMB/wEGAVYB/QH/AVMBXAFdAf8BiwFFARIB/wFtATcBCQH/AWMBKwEAAf8BZAEpAQAB/wGA
-        AToBBQH/AY0BSQESAf8BbgFZAVQB6wGUAmsB9QH/AfQB7QL/AeoB4QL/AecB3AL/AeMB2wL/AbABsgH/
-        Ae4BsgG2Af8B0gGyAbMB/wHiAbcBuQH/Af0BqAGtAv8BywHEAv8B1AHDAv8BzwG6Av8B2wHEAf8B2wGX
-        AYoB/wNVAbEBrQGxAbUB+wG7Aa4BogH/AeMBpgFrAv8BwgGQAf8B+wG1AYQB/wH6Aa4BdQH/AfkBpwFt
-        Af8B+AGhAWcB/wH4AZoBYAH/AfcBlQFbAf8B9gGOAVQB/wH2AYkBTgH/Af4BhgFIAf8BvwFfATQB/wHN
-        As4B/wJoAWkB8ANXAboB4QGzAbUB/wHhAaEBpQH/Ac4BhwGIAf8BvQFqAWwB/wGtAlkB/wGlAk4B/wGk
-        AkwB/wGpAVMBUgH/AaoBTgFNAf8ByQFxAW0B/wH9AewB6gL/AeEB3AH/AWQBSQFHAfEDHAEoEAACSQFI
-        AYgBzwGIATkC/wHGAXcB/wFWAaUB6QH/AQoBgwH0Af8BrgGcAZEB/wG9AaABgwH/Ab0BpAGKAf8BtQGY
-        AXQB/wGdAW8BSgH/AWQBMAEEAf8BhAE8AQUB/wFbAlkBxAFjAloB2AH4AeQB3gL/AfAB5gL/AeMB3AL/
-        AeUB4QL/AdcB1QL/Aa8BsgL/AbIBtwL/Aa0BsQL/AcoBzAL/AeUB5AL/AdgB0wL/AcoBvAL/AdEBvAH/
-        Aa4BdAFqAf4DQgF2Aa4BsgG2AfsBuwGuAaIB/wHjAasBbwL/AccBlQH/AfsBugGJAf8B+wG1AYMB/wH6
-        Aa4BdAH/AfkBqAFuAf8B+QGgAWcB/wH4AZwBYgH/AfcBlQFbAf8B9gGRAVYB/wH+AY8BUQH/Ab4BZAE6
-        Af8BzAHOAc0B/wFoAmkB8AMYASEBfgJwAewB/wHmAekC/wHUAdcB/wH9AcoBzQH/AfUBvQHAAf8B5QGn
-        AaoB/wHSAY4BjwH/Ab8CbgH/AbABXAFdAf8BoQFCAUMB/wHQAYoBiAH/AekBowGdAf8DWQHMFAADHAEo
-        AasBeAFHAfoB9wHTAa0B/wGzAc4B7wH/AWgBsQH3Af8B/gHzAecB/wHoAdEBugH/AekB0AG3Af8B6wHR
-        AbgB/wHmAcwBtAH/AdcBtAGOAf8BrQFyATMB/gM7AWQBSQJIAYcB3QGsAaYC/wH5AfIC/wHlAeIC/wHj
-        AeAC/wHmAeIC/wHjAd8C/wHUAdIC/wHbAdkC/wHrAeoC/wHoAecC/wLmAv8B4wHfAf8B/QG3AasB/wFn
-        AVUBVAHrAxQBGwGuAbIBtgH7AbsBrgGiAf8B4wGwAXMC/wHMAZsB/wH8Ab8BjgH/AfsBugGIAf8B+gGz
-        AYEB/wH6Aa0BcwH/AfkBpgFtAf8B+AGjAWgB/wH4AZ0BYgH/AfcBmQFeAf8B/gGXAVoB/wG+AWoBPgH/
-        AcsBzQHMAf8BaAJpAfAEAAM7AWUBxgGzAbQB/QH/Ae0B7wL/AdwB3gL/AdoB3QL/AdgB3AL/AdUB2AL/
-        Ac0B0AH/AfsBwwHHAf8B7gG7Ab8B/wHgAZwBnQH/AYwCRwH5AzwBaBgAA0QBegHyAcYBmwH/Af0B6gHY
-        Av8B7gHhAf8B/gH7AfMB/wH3AeQB0wH/AfMB2AHBAf8B8wHcAcUB/wH4AecB0wH/AfgBxQGTAf8DUQGg
-        AxABFgMPARQBagJbAeEB8wHdAdcC/wH9AfoC/wHrAegC/wHpAeUC/wHrAeYC/wHsAecC/wHmAeMC/wHq
-        AekC/wHuAe0C/wH3AfYC/wH+Af0B/wG3AWgBZQH9A0MBdwQAAa4BsQG2AfsBuwGuAaAB/wHoAbkBhAL/
-        AdgBpwL/AcsBmgL/AcUBlAL/Ab4BjAL/AbkBhwL/AbMBgQL/Aa4BdAH/Af4BqAFuAf8B/gGkAWoC/wGk
-        AWYB/wHCAXEBRAH/AcsBzAHLAf8BaAJpAfAIAANYAbwB8wLoAv8B9wH5Av8B5wHqAv8B4wHmAv8B5AHn
-        Av8B7QHwAv8B5AHmAf8BvAGhAaIB/QFcAlkByQMvAUogAAJHAUYBgAG6AaABjgH4Af4B9QHqAv8B/QH4
-        Av8B/AH4Af8B/gH4AfEB/wH+AfUB6QH/AcsBsgGJAfwDUAGdAw0BEgMDAQQEAAMpAT8BggJdAfAB8wHi
-        Ad8G/wH5AfcC/wH0Ae8C/wHyAe0C/wHtAekC/wH0AfIG/wL4Af8BwwGHAYYB/gNRAaIIAAGvAbMBtwH7
-        AbMBpwGaAf8BzAGcAVsB/wHmAbkBggH/AeUBrgFwAf8B5QGoAWsB/wHkAaMBZgH/AeQBngFhAf8B4wGa
-        AV0B/wHiAZYBWAH/AeIBkgFUAf8B4QGOAVAB/wHkAY4BTQH/AakBYAEzAf8CyQHKAf8DaQHwCAADFgEf
-        AX4CcQHrDP8B/gH2AfcB/wHIAaQBpQH+AV0CWgHTATECMAFNLAADKgFBAlYBVQG0AY8BfwFyAfAB7AHJ
-        Aa4B/wGaAYgBeQHyAloBVwG9ATUCNAFVAwcBCQMBAQIMAAMqAUEBagJdAeIB3QGvAa4B/wH3AekB6AL/
-        Af0B+AP/AfsC/wH4AfMC/wHwAe0B/wHsAsoB/wGVAm0B9wNLAY4MAAG9Ar4B/QHbAdgB1gH/AbQBpAGV
-        Af8BuwGqAZkB/wG6AaoBmgH/AboBqQGaAf8BugGoAZoB/wG5AagBmQH/AbkBqAGaAf8BuQGnAZgB/wG5
-        AagBmQH/AbgBpwGYAf8BuAGkAZYB/wGyAaUBmgH/Au0B7gH/A24B8wwAA0ABbgHHArgB/QT/AcoCsQH+
-        AV8CWQHXAzcBWmgAAxABFgFJAkgBiAFiAlsB1gGSAWcBZgH0Aa8BgAF5AfsBqgJqAfkBcgJfAegBVgJV
-        AbEDKgFBEAADbgHlA7cB+wGpAawBrwH6AakBrAGvAfoBqQGsAa8B+gGpAawBrwH6AakBrAGvAfoBqQGr
-        Aa8B+gGpAasBrwH6AakBrAGuAfoBqAGrAa4B+gGoAasBrgH6AacBqwGtAfoBqQGsAa8B+gO5AfwDXAHJ
-        DAADAQECA1cBuAFsAmUB5QE9AjwBaAMDAQQ0AAMIAQsCUwFVAbACSQGaAfMCMgGaAfMCUwFVAbADCAEL
-        qAADEAEWAzoBYQNVAbQDSwGOAwMBBCAAAwQBBgMCAQMEAAMBAQIDUAGdAjsC/wIAAfQB/wNQAZ0DAQEC
-        BAADAgEDAwQBBiQAAz0BaQFfAl4B1wNSAaFgAAMJAQwDNwFaA1QBqwFhAlwB6gGuAqgB/QHlAuEB/wGI
-        AoEB/gNVAbEDDQESGAADJQE3A0gBhAwAA0IBdAIsAfAB/wIAAc0B/wNCAXQMAAJHAUgBgwMmATgcAAMD
-        AQQDXgHZAbkCtAH/AWECXwHVAwEBAhgAAw0BEgMeASsDAwEEAxYBHgFUAVgBWQHdAUcBUAFeAeoDQgF0
-        AxEBFwMcASgDNwFaA0QBewMoAT0MAAMpAT4DVAGuAWMCXwHqAakBqAGnAf0B3QLXAf8B+QH3AfgB/wH+
-        A/8B+gH+Bv8BrwKoAf8DWQHPAxkBIxAAAwwBEAJRAVIBpwM7AWQDJAE1AwABAQQAAzkBXwIKAccB/wIA
-        AasB/wM5AV8HAAEBAyQBNQM7AWMCUQFSAacDDAEQGAADVQGyAaICmwH/Ab0CuAH/A0sBjgMAAQEYAANX
-        Ab0BOQFEAV0B8ANHAYIDIAEuASwBRAFlAfQBAAGIAfQB/wEAAVABpgH/A1kBzAFfAlUB6AGZAVQBUwH/
-        AbQCZAH/AVkCSAHyAzgBXggAAYUCfwH1Ad8C0wH/AfoB8QHyBf8B+AH2AfgB/wH3AfUB9gH/AfMB6AHg
-        Af8B8QHLAaoB/wHxAdsBxQX/AccCwgH/AVcCVgHiAy0BRgwAAz4BawNEAXoDRAF5A0IBdAMAAQEEAAMw
-        AUsCEAGRAfsCEAGFAfsDMAFLBwABAQNCAXUDRAF5A0QBegM+AWsUAAMtAUUBewJ5AfoBxwLBAf8BawJq
-        AeYDDQESHAABNQFEAWQB9AEAAYwB/AH/AQABVAGsAf8DWAHGAVsBUAFPAekBhQGBAZUB/wEuAb0B/QH/
-        AQABnwHgAf8BnQGSAbEC/wG7AbcB/wH+AasBqgH/AcsBYQFjAf8BYAJBAfkDMAFNBAAB4QLTBf8B/gH9
-        AfsC/wH7AfMB/wH+AfYB5gH/AfsB5AHAAf8B/AHMAZAC/wG0AVcB/wH3AaIBSQH/AeoBxQGrAf8B/QP/
-        AtUB2AH/A1MB8QM6AWIIAANQAZ0DNQFWA0oBjAM0AVQDPwFtBAADFQEdAkwBYQHkAkwBYQHkAxUBHQQA
-        Az8BbQM1AVUDSgGMAzUBVQJPAVEBnA8AAQEDOwFkAW4CbAHuAbsCtAH/AboCtQH/AzoBYgQAAwMBBANM
-        AY8DQwF3AxsBJgwAAzABTQFRAVQBYQHuAS4BtQH2Af8BAAGVAeIB/wFyAYMBpwL/AbsBrwH/AeQBygHH
-        Af8BYwHVAe8B/wGLAa4BygH/Af4BqgGnAf8B8AKOAf8B7AGEAYgB/wHMAWYBaQH/AVsCWAHZBAADVgGr
-        Aa8CqQH6AfsB+gHqA/8B3gL/AfcBywL/AeEBpwL/AckBhAL/AbQBWgH/AfcBnAE/Af8B5gGDATIB/wHe
-        AaUBhwH/AfYB9wH6Af8B5QHmAekB/wFfAlgB+QNKAYoDBAEGA0oBigM+AWoDQgF2A0sBjgMyAVAEAAMl
-        ATcCSAFgAesCSAFgAesDJQE3BAADMQFPA0wBjwNCAXYDPgFqAkgBSQGICAADDQERA1sBwwGcApYB/wG9
-        ArcB/wHGAr8B/wNaAb0DBAEGA0oBiwNaAcUBtwKxAf8BvwK4Af8DPwFtDAADFAEcAWcCWwHhAfYB1wHT
-        Af8BZQHhAfkB/wFfAcUB5wH/AfUBxwHFAv8BwwG7Av8BsgGuAf8B/gGuAa0B/wH7AbEBtAH/Ae8BqwGk
-        Af8B3wGQAYoB/wHoAYMBhAH/AY8BTQFOAf8IAAMpAT8BYAJfAs8BwwG4Af4B/wHsAcsC/wHaAZ0C/wHB
-        AW0B/wH9Aa0BUQH/AfIBmQFEAf8B5AGDATcB/wHUAV4BIAH/AdABgAFZAf8B6wHfAd4B/wLpAesB/wFn
-        AlwB/QNLAZACRAFFAXwDPQFnAz0BZwNPAZcDEgEZAwoBDQJXAVkBwgIAAdMB/wIAAaEB/wJXAVkBwgMK
-        AQ0DEgEZA04BlgM9AWcDPgFqA0IBdAQAAwQBBQNUAawBsAKnAf8BxAK8Af8BwAK4Af8BuAKyAf8DWwHD
-        A14B0AGpAqQB/wHIAsIB/wHJAsIB/wFmAmUB4wMUARwMAAMcASgBkAFuAXAB/gH/AeQB3gH/Af4B1wHQ
-        Af8B+AHGAcQC/wHBAcMC/wHHAcoC/wHSAdMC/wLeAv8B4wHiAv8B3AHXAf8B8QG2Aa4B/wHFAXIBawH/
-        AWECXgHgEAADPgFqAW4CbAHlAeIBxgGyAv8BvwF2Av8BpQFEAf8B7gGRATwB/wHgAXYBNgH/AdMBXwEn
-        Af8BwwE9AQwB/wG8AUYBKQH/AeEBvQG5Af8B3wHUAdYB/wNbAdADRAF7Az0BZwM9AWcDTwGXAxIBGAMO
-        ARMCTgFrAeQBHAEuAv8CAAH0Af8CTAFhAeQDDgETAxEBFwNOAZYDPQFnAj0BPgFqA0IBdAQAAzMBUgGm
-        Ap0B/wHDArcB/wHJAsYB/wPTAf8B1wLVAf8BoQKWAf8BvAK1Af8ByQHCAcEB/wGVAo4B+QNNAZEDEgEY
-        EAADBAEGAUoCSQGJAZsBjAGNAfsB9gLVAv8B7gHtAv8B/QH8Bv8B/AH5Av8B8AHtAv8B4AHbAf8B8wHI
-        AcIB/wHTAaEBnAH/AYUBXgFbAf8DOAFcFAADBAEGA0wBkwGLAX8BfgH0Ae0BrwGKAf8B8AGNAUQB/wHe
-        AW0BMAH/AdABYgE3Af8BxAFfAUIB/wG3AVgBRgH/AbwBhQF3Af8BuAGoAaoB/wNVAbQDSgGKAz0BaQNC
-        AXYDTAGPAywBQwQAAzsBZQE7AT8BjAHzAjIBhwHzAzsBZQQAAysBQgNMAY8DQgF2Aj0BPgFqAkkBSgGJ
-        BAADVgGzAb0CsgH/AbsCsgH/AcgCxgH/AeIC4wH/AeAC3QH/AagCngH/AZ0ClgH7A1QBpgMaASUfAAEB
-        AzEBTgNWAbMBegF2AXMB7AHJAbcBsQH/AdEBvAG3Af8BzQG1Aa8B/wGlAZQBkgH7AV8CXQHSAXICZwHy
-        AdYBygHJAf8BtQGxAbIB/wM5AV8cAAMaASUDWwHGAcUBnwGUAf8BywGcAY0B/wG8AZ8BnQH/AbYBpAGl
-        Af8BtgGpAasB/wG2AaYBpwH/AV8CUgH0AyUBNwJPAVEBnAM1AVUDSgGLAzIBUANSAaMDEQEXBAADFgEe
-        AxYBHgQAAxEBFwNSAaQDMgFRA0oBiwM1AVYDUAGdBAABYgJhAd8BuQGuAawB/wGIAXIBcwH/AaUCmwH/
-        AewC6wH/AbgCrgH/AakBngGaAf8BQgFeAX4B9QNCAXQDMwFTAjwBPQFoAyMBNAMzAVMYAAMBAQIDFgEf
-        AyIBMgMoATwDJgE5AyYBOQMjATMDYAHeBP8BygLDAf8DNgFZIAADWQHHAbkBrQGwAf8BvQGyAbYB/wG6
-        Aa4BsAH/AbsCrAH/AcgCtgH/AYECfwH+A0IBdgQAAz4BawNEAXkDQwF4A0IBcwM5AV8DUgGjAy4BRwMR
-        ARcDEQEXAy4BRwNRAaIDOgFgA0IBcwNEAXkDRAF6Az4BawQAAxYBHwNcAc8BiwFyAXAB/wGzAqYB/wG7
-        ArMB/wG+AbUBtAH/AcQBrgGrAf8BGQGrAckB/wEAAcsB/AH/AQABrAHsAf8BAAGzAfAB/wEAAZQB3QH/
-        AQABngHnAf8DTgGZDAADAgEDAxUBHQMWAR8DFgEeAxsBJgMjATQDNQFXA08BlwNhAdcB3ALaAf4B6gLl
-        Af8DWwHGAw4BExwAA1QBqwHCArMB/wHQAsMB/wHJArwB/wHIArwB/wHRAsQB/wG6Aq0B/wNXAb0IAAMM
-        ARACUgFUAaYDNAFUAkcBSAGDA0QBegM0AVQDTAGPA08BlwNPAZcDTAGPAzQBVANEAXoCRwFIAYMCNAE1
-        AVUCUQFSAacDDAEQCAADUAGdAaMBnQGZAf8BpAGSAZAB/wGmAZMBkgH/AbQBqwGpAf8BPwGwAb0B/wEX
-        AdMB7wH/ARoB1gHzAf8BGQHVAfQB/wEaAdEB8wH/ARsB1QH2Af8BFQGyAeQB/wJTAVQBrAwAAwoBDQNX
-        AbgBcgFmAWcB6gF8AWwBbQHuAbkBpAGiAf0B0gG4AbYB/wHgAcsBygH/Ae0B2QHaAf8B4gLWAf8BdgJy
-        AekDTgGWAxYBHhwAA0IBdgGuAqEB/gHfAtYB/wHUAssB/wHUAssB/wHaAtEB/wHaAs8B/wFiAlkB7AMS
-        ARkMAAMjATMDUgGpAjQBNQFVA0MBdwNKAYsDQgF2Az0BZwM9AWgDQgF2A0oBiwNDAXcDNQFWA1IBqQMi
-        ATIMAANQAZoBcgGjAbYB/wGbAa0BsAH/AZIBwgHDAf8BgQHiAeMB/wErAYwBvwH8A0ABcQM7AWQDOgFi
-        AzoBYQM6AWEDMgFQFAADQwF4AYMCbgHvAZABdAF3AfEBdwJtAecBZgJiAdoDWwHEA04BlQM6AWADHQEq
-        AwEBAhwAAykBPgGOAosB+QHwAuwB/wHjAt8B/wHlAuEB/wHpAuYB/wHyAu0B/wGMAoIB+wM2AVkUAAMj
-        ATQCUQFSAacDRAF7AzUBVgM9AWkCPAE9AWcCPAE9AWcCPQE+AWoDNQFXA0QBewJRAVIBpwMjATQQAAMc
-        AScCRwFIAYMBWgJdAcoBWAFwAYIB7wFaAl0BygNIAYZsAAMhATABcAJsAewE/wP4Af8B9ALzAf8B7ALq
-        Af8B6QLmAf8BvwK3Af8DTwGcHAADDwEUAz4BawNQAZ0DSgGKA0QBewNEAXsCSQFKAYkCTwFRAZwCPQE+
-        AWoDDwEUmAADQAFxAagCoAH5AYwCiQHyAXACbAHmA2AB1gNYAcEDVAGuA0YBfwMDAQQwAAMRARcDSAGI
-        A1cBvwNWAcEDTAGTAxsBJtgAAwYBCAMxAU8DQgF2A0gBhwJRAVwB3wEEAQUBsgH/AgsBywH/AgwBygH/
-        AhkBmAH/AlYBVwHcAygBPFgAAwcBCgNEAXoDUgGpA0UBfQMmATgDCgEOFAADPwFuA1YBwQNXAb8DVgG+
-        A1YBvgNWAb4DVgG+A1YBvgNWAb4DVgG+A1YBvgNWAb4DVgG+A1gBwANWAb4DOQFfDAADPgFrAV4BVwFW
-        Ad8BmwFXATwB+gG8AX0BPQH+AVQBNAFvAf4BBgELAdQB/wErASwB7wH/AS8BMAH3Af8BSQFIAv8BWgFT
-        Av8BNgE1AcAB/wJZAVoBzgMKAQ4BXwJZAdcBhgFkAVIB9wF7AWIBWwH2AXsBYgFeAfYBfQFiAVsB9gF9
-        AWIBWQH2AX0BYgFaAfYBfwFiAVgB9gGBAWIBTAH2AYMBYgFJAfYBgwFiAUkB9gGFAWIBSQH2AYUBYgFJ
-        AfYBhQFiAUkB9gGLAWUBUQH3AWABWgFXAdkUAAFVAlMBsAHlAaYBTQH/Ae4ByAGXAf8BqwGDAVsB/gF0
-        AVIBOgH3AVcBVgFRAd8DVAGrAz4BawMjATMDBAEGBAABgQJ0AfYB2QLTAf8ByQK4Af8BuAKfAf8BvAKi
-        Af8BxAKpAf8BvgKkAf8BvAKqAf8ByQLBAf8B0gLMAf8BxwK9Af8BxQKwAf8B3gLAAf8B5ALFAf8BwgKT
-        Af8DVwHFBAADAwEEA1MBqgG7AZwBYwH9Af8B1gGqAv8B2QGcAf8B2wGzAZoB/wEhARsBvgH/AR4BIAHp
-        Af8CMAH3Af8CTQL/AVABVAHzAf8BNgFHAeAB/wE8ATQB7AH/AlMBXgHlAw8BFAF5AVsBWQHyAd8B2wHf
-        Af8B5wHgAeIB/wHhAbcBqgH/AeYBtAGSAf8B6gG5AZAB/wHdAbEBnQH/AdkByAHGAf8B2gHVAdoB/wHa
-        AdIB1QH/AdsB1AHXAf8B2wHUAdgB/wHcAdUB2AH/AeEB3AHfAf8B3AHbAeEB/wGAAWQBUwHxBAADFgEf
-        AVkCWgHKA1kBxANKAYoB0QGuAWkB/QG4Ab8BbwH/Ab4BxAGdAv8B7wHQAv8B7AHJAf8B9gHXAa0B/wHc
-        AbQBhgH/AakBgAFNAf0BbQFJATQB9gFdAVcBVAHgA04BmAG3AqoB/QH6A/8B4gLaAf8BzQK6Af8B1AK+
-        Af8B0AK8Af8B0gLKAf8B+AL3Df8B8QLtAf8B4ALUAf8B+QLaAf8B4wKxAf8DWAHLBAADUAGdAecBrQFz
-        Av8B7gHEAv8B3wG1Av8B6AGsAf8BqwGXAaAB/wEBAQIBxQH/ARQBFgHzAf8CRwL/AV4BTwH7Af8BQgFO
-        AewB/wEfAbkB6QH/ARsBVQHAAf8DVgG+BAABcgFhAVwB7gHtAewB7wH/Af4BwwGfAf8B/gGpAUwB/wHY
-        AZcBawH/Ab0BggFuAv8BrQFXAf8B6QGcAVwB/wG8AaABnQH/AcMBswG0Af8ByAK3Af8BzAK8Af8B0ALB
-        Af8B3QHQAdEB/wHsAeoB7QH/AXoBYQFVAe4EAANIAYQBaAHvAZEB/wFTAb8BZwH/AT8BdQEgAf8BZAG9
-        AVUB/wE1AcYBRAH/ATsBlwErAf8B6QHHAaMC/wHlAcQC/wHqAcwC/wHyAdkC/wH1Ad0C/wHsAdAB/wH6
-        AdUBqQH/AWUBVQFQAeoBpgKSAfwB7wLyAf8B2ALPAf8BxQKxAf8ByAKyAf8BwAKzAf8B5QLfAf8B+gL3
-        Af8B9gL1Af8B7wHwAfEB/wHyAvAB/wH3AvIB/wHeAtkB/wHYAsEB/wHaAqoB/wFbAloByAMvAUoBpgF0
-        AUwB+gH/AccBkQL/AdMBnwL/AccBjgL/AdIBhwH/Ab0BlwGCAf8CAAHGAf8BJQEjAv8BZAFqAfoB/wE9
-        AWkB3QH/AUIBPQHeAf8BMQGDAfwB/wEDAbIB7wH/AUIBUgFhAe0DNgFZAXICYQLuAd8B4AL/AbYBdQL/
-        AdoBjAH/AZsBjAHEAf8BRAE/AdAB/wH3Ac4BjwH/AfwBsQFfAf8B5QG+Aa4B/wLrAe8B/wHsAuUB/wHs
-        AuYB/wHtAucB/wHyAu0B/wHuAe0B7gH/AXoBYQFYAe4EAAM6AWEBnAHfAa0B/gHuAf8B8gH/AaUB+AG5
-        Af8BoAHxAbEB/wGoAf8BwAH/AWgBvwFmAf8B8gHZAbkC/wHnAcoC/wHoAcwB/wH9AegBzwH/Af0B6QHT
-        Av8B+AHqAf8B9QHdAcIB/wNTAa0BpgKRAfwB8ALzAf8B2QLQAf8ByAKzAf8BwAKtAf8BzALBAf8B7gLl
-        Af8B6ALmAf8B1ALSAf8BywLHAf8BygHJAcgB/wHkAuAB/wHuAuYB/wHWAskB/wHRAqMB/wFbAloByAFa
-        AlgBwAHOAXUBNgH/AdEBjAFJAf8B/AHDAXcC/wG9AWwC/wG8AWIB/wHtAbABVwH/ATcBJAGlAf8CPgL/
-        AWsBcgH+Af8BIwHBAfcB/wEWAYoB4wH/AVcBJwGQAf8BVgGEAacB/wEAAYgB6AH/A1ABnQFyAmEB7gHy
-        AekB6AH/AfwBywGoAv8B8QHIAf8BsQGvAeMB/wFvAW0B4wH/AfsB8AHOAf8B9QHCAZgB/wHGAaABlAH/
-        AcMBtwG5Af8BygK4Af8BzgK+Af8B0ALAAf8B2wLQAf8B8AHvAfIB/wF8AWMBXQHuBAADUAGeAYwB6AGl
-        Af8B4QH/AeMB/wG6Af8BwQH/AXUB/wGCAf8BdAHyAZEB/wFbAaMBUQH/Ae0B1wHBAv8B7wHXAf8B+wHq
-        AdUB/wH7AewB2wH/AfoB7gHgAv8B/gHxAf8BmgGDAV8B+wMqAUEBpgKQAfwB8ALzAf8B2QLQAf8BxwKy
-        Af8BvQKsAf8B0wLHAf8B6gLiAf8B4wHhAeAB/wGRAY0BjAH/ATABLgEtAf8BoAGdAZsB/wHZAdcB1gH/
-        AewC5QH/AdoC0AH/AckCnwH/AVsCWgHIAYIBZgFRAe0BqgFaAR8B/wGXAUEBBgH/AcMBcQEuAf8B+QGx
-        AVUC/wGxAVYC/wG8AVMB/wG1AXMBTgH/AUgBPgGvAf8BXgFcAe4B/wFLAWsB3QH/AQoBtQHvAf8BRQGV
-        AbMB/wG4AWoBVAH/AlcBXgHZAyEBMAFyAmEB7gH2AfUB9gH/Af0B4gHUAv8B5AHJAf8BowGeAcMB/wFg
-        AV0BqAH/Af0B3gHDAf8B9wHVAcQB/wHeAdMB0QH/Ad4C1gH/AeIC2AH/AeQC2gH/AeQC3AH/AesB5QHm
-        Af8B9AH1AfgB/wF8AWUBYQHuAzsBZAFfAcUBfwH+AdoB/gHlAf8B2AH/AdwB/wGsAf8BuAH/AYkB/QGT
-        Af8BnAH6Aa0B/wE/AcABWAH/AWMBjAFHAf8B+AHnAdoB/wH9AfIB5AH/AfkB7wHjAf8B/AH4AfAB/wH8
-        Ae0B3AH/AV0CWQHSAwEBAgGkApAB/AHwAvMB/wHZAtAB/wHHArIB/wG+Aq4B/wHVAsgB/wHoAuEB/wHo
-        AeUB5AH/AV4BWQFYAf8DAAH/AYECcwH/AeAC3QH/AeoC4gH/AdsC0gH/AcYCnwH/AVsCWgHIAZ8BcQE+
-        AfgBjQFFAQ4B/wFyAS4BAAH/AZsBTAEQAf8B8QGtAVoC/wHEAXUC/wHOAYcB/wHUAZABOwH/AWoBLwEP
-        Af8BVAEtATwB/wGSAUgBMgH/AaIBmgGJAf8BMgGsAfkB/wGeAYMBgAH/A1ABnQQAAXMBYwFhAe4B+QH4
-        AfkD/wH7Af8BxAHJAcoB/wFPAYoBsgH/ATIBagGfAf8BggGZAacB/wHsAd0B2AH/Ad8C1QH/AdwC0gH/
-        Ad8C1gH/AeEC1wH/AeIC2QH/AeoC4wH/AfgB+QH7Af8BfAFnAWEB7gEwAjEBTQFqAbYBiQH5AdAB+AHT
-        Af8ByAH9AdUB/wHjAf8B7wH/Ab8B/gHPAf8BiwHvAZIB/wFjAeMBhwH/AUoBnwFCAf8B8gHfAdoB/wH9
-        AfgB7wH/AfcB8QHtBf8ByAGnAZEB/gNCAXQEAAGkApAB/AHwAvQB/wHZAtAB/wHIArMB/wG8AqwB/wHQ
-        AsUB/wHsAuQB/wHjAuAB/wGuAaUBpAH/AWoCYAH/AbUBrQGsAf8B4ALdAf8B7wLlAf8B2QLNAf8BywKh
-        Af8BWwJaAcgBqAFqAUEB+QGJAUYBEAH/AZMBTQERAf8B2wGeAVMB/wH9AcsBigH/AeEBrAFrAf8BrwFx
-        AT0B/wGPAU0BGAH/AW8BLgEAAf8BbgErAQAB/wGGAToBAAH/AbIBXQEWAf8BnAFlAU4B/wGsAWsBRQH/
-        A1EBogQAAXYBZQFjAe4B/gL7Af8B8wH6Af0B/wGbAdgB+QH/AYIBvQHiAf8BbwGyAdcB/wFbAbYB4gH/
-        AbQBygHXAf8BygG1AbIB/wHFArUB/wHKArsB/wHOAr8B/wHRAsEB/wHbAtAB/wL6AfsB/wF8AWkBYQHu
-        AwQBBgFtAWkBWgHnAdQB8QHQAf8BowHtAbYB/wHMAf8B2wH/AZIB7wGjAf8BkAHUAY8B/wG2AdUBqQH/
-        Ad8B4wHQAf8B/QH2AfMB/wH2AfQB8gH/AfcB+AH5A/8B/AH/AWwBXwFUAe4DDQESBAABowKPAfwB8AL0
-        Af8B2QLQAf8BxwKyAf8BxAKwAf8BxwK8Af8B8QHoAekB/wH4AfkB+wH/AecC5QH/AeQC3gH/AeEB3gHd
-        Af8B8gHsAe0B/wHqAeQB5QH/AdYBxQHGAf8B1gKmAf8BWwJaAcgBgAFnAVQB6wHHAYkBPgH/AfMBtQFl
-        Av8B1AGbAf8B/gHdAbYB/wG+AZsBcwH/AZMBZwFIAf8BngF0AVQB/wGdAXEBTwH/AZABXwE3Af8BgAFF
-        ARUB/wFgASgBAAH/AXcBNwEAAf8BlwFjATQB/gNCAXQEAAF2AWcBZQHuAv8B/gH/AesB9QH8Af8BrgHc
-        AfcB/wHYAfcC/wHAAfAC/wF2AcoB8wH/Ab4B2AHnAf8B9QHwAe0B/wHxAu0B/wHzAu4B/wHzAu8B/wHz
-        AvAB/wH3AvQB/wH+A/8BfQFqAWEB7gNRAaIB+wHaAbwF/wHIAekBzAH/AY0B5QGaAf8BkAHZAZUB/wH0
-        AesB5wL/AfgB/QL/AfoB+wH/AfUB9wH1Af8C9wH4Af8B/QH+Av8B7QHVAcgB/wNRAacIAAGjAo4B/AHw
-        AvMB/wHYAs8B/wHEArEB/wHKArQB/wHEArMB/wHQAcgBxwH/AdABxwHDAf8D7AH/Ad4C4AH/AfwC+gH/
-        AfQB7gHtAf8B1ALNAf8B3QLBAf8B2gKoAf8DWQHJAlYBVQG0Ac4BiQE7Af8B7AHBAZAC/wHwAdsC/wH1
-        AekB/wHyAekB3wH/Ad0BygG2Af8B2QHEAa4B/wHgAcwBuAH/AdoBxgGwAf8ByQGuAZQB/wGhAW4BRwH/
-        AbEBYgEjAf8BagFUAUoB7gMYASEEAAF2AmkB7gT/AfwB/QL/Ac8B5wH3Af8B1QHsAfoB/wG0AeEB/QH/
-        AZ4B1QH6Af8C3gHiAf8BuQGhAZ8B/wG4AqQB/wG+AqsB/wHDArAB/wHEArQB/wHSAcQBxQH/Af0B/gL/
-        AX8BbAFjAe4BlgGAAVUB8wH/AfwB9wX/Ae8B2QG/Af8BvQHGAYsB/wHnAfQB5wL/AvsB/wH4AfoB/AH/
-        AfoB/QL/AfwD/wH9B/8BlgF8AV8B+wMmATgIAAGzAqgB/QH3AvwB/wHeAtcB/wHJArYB/wHQAroB/wHZ
-        AccBywH/AaYBjQGBAf8BmAFSASEB/wGaAZYBkwH/AWsBcAFzAf8B6gLsAf8B5wHdAdQB/wHkAcsBsQH/
-        AeoBxwGrAf8B0wGmAaUB/wFbAloBzgMpAT4BnAFuAUgB9gHuAdEBsAH/AfgB7gHiAf8B/QHzAekD/wH8
-        Af8B+QHwAecB/wHvAdYBvgH/AfAB1gG+Af8B7wHWAb4B/wHxAd0ByQH/AfoB2AGyAf8B1QGGAUEB/wNO
-        AZQIAAGAAnEB8gj/AfsD/wHfAfIC/wHTAe0C/wHvAfsD/wL+Af8B7QLpAf8B7gLrAf8B8ALtAf8B8QHu
-        Ae8B/wHyAe8B8AH/AfUB9AH1Bf8BhgF0AW0B8QJAAT8BbgFiAV0BWgHTAboBogGKAfkB7wHUAbYB/wHz
-        AcwBrAH/AfMB1AG4Af8B7QHLAawB/wHsAcsBrwH/AfQB3gHKAf8B9QHiAdUB/wH3Ae0B5gH/AfcB5QHZ
-        Af8DWwHQAwEBAggAAY0ChQH3AeUC3wH/AdQCxwH/AcYCtAH/AcwCuAH/AdgBwgHEAf8BvQGmAaIB/wGf
-        AYEBagH/Aa0BoQGgAf8BqwGjAaQB/wHLAb8BwAH/AdMBwgHBAf8B4gHPAcYB/wHhAcgBugH/AckBpQGk
-        Af8DUQGnBAADRAF6AcwBpQFgAf0B/AHsAdcB/wH6AfIB5wH/AfsB8wHrAf8B/AH0AesB/wH3AeUB1AH/
-        AfcB5AHSAf8B+QHuAeAC/wHzAdsB/wHyAbEBdAH/AVsCWQHEAwQBBggAAWACXAHUAYkCdAH3AYEBcQFu
-        AfYBhQFxAW0B9gGFAXEBawH2AYcBcQFoAfYBiQFxAWgB9gGIAXEBZwH2AYkBcwFrAfYBjQFzAWgB9gGN
-        AXMBZwH2AY0BcwFkAfYBjQFzAWIB9gGNAXMBYgH2AZYBdwFtAfcBXwJaAdgIAAMlATcCTwFOAZcBbgFm
-        AV8B4AHKAbEBmgH9AfMB3AHDAf8B/AHrAcoB/wGwAX8BZgH+A1UBsgJTAVIBqAFbAlkBxAMtAUUMAAE9
-        AjwBZwFSAlEBoQFgAl0B1wF+Am8B+gFkAlkB7AFWAlQBqwNQAZ0BUgFRAVIBoQNSAaEDUgGhAVICUQGh
-        A1IBoQNSAaEDUgGkA0wBkwMYASEIAAJHAUYBgAGhAXsBYgH2AfcB4gHMAv8B/QH3B/8B/QP/AfoC/wHu
-        AdcB/wG8AYcBbQH8A1YBtgMMARBcAAMHAQoDMAFLAlYBVQG0AZIBdQFlAfQDVQG1aAADKAE8AlYBVQG0
-        AXsBagFdAekBswGQAYEB+QG6AZsBewH6AYkBbgFdAfABXAJZAckDOgFh/wAZAAMfASwDSwGPA1UBtANX
-        Ab8DWAHAA1cBvQNUAa4DQQFzAw0BEmAAAwwBEANOAZQDVQG1A1UBtANVAbQDVQG1A1YBtgNWAbYDVQG6
-        A1YBvgNBAXMYAAMFAQcDAQECLAADMgFQAUYBWAFGAe8BKgGYAT4B/wExAbABTwH/ATUBuAFWAf8BNgG4
-        AVYB/wEyAbMBUQH/ASwBnQFDAf8BLAFSAS0B/QNXAcUDDwEULAADDwEUA04BlwNGAYADAwEEIAADSAGH
-        AZ4BQAFDAf8BsQFNAVAB/wG1AVABUwH/Ab4BWAFaAf8BxwFfAWEB/wHPAWcBaAH/AdQBawFsAf8B2QFw
-        AXEB/wHVAXYBdwH/AVsCVgHlAwYBCBAAAlMBVQGtAR0BdgHSAf8BQgFrAZYB9QFYAVkBWwHHAk0BTgGW
-        AzsBZQNKAY0BpAFtAVEB9wFjAV0BWQHXAVYCVQG0AU0CTAGRAUACPwFuAyUBNwQAAVkBXwFXAeABQAHV
-        AWsB/wFNAeUBiAH/AVgB4QGNAf8BXgHiAZIB/wFfAeEBkgH/AVsB4wGPAf8BUgHlAYsB/wFIAeABdQH/
-        ASkBZwEtAf4DQAFxKAADJQE3AVQBWwFVAeEBJwGSASAB/wEpAUABCQH9A1YBswMQARYcAAFbAlgBywHw
-        AZsBlAL/AbsBpAH/Af4BvQGpAv8BvAGoAv8BvgGrAv8BvAGoAv8BvAGpAv8BvwGqAv8BwwG4Af8BXwJY
-        AeMDBAEGEAABPQFdAYUB8AE/AcEB/gH/AWIByQH+Af8BWwHIAf4B/wFGAbcB8AH/AWEBYwFtAf8B8wG4
-        AYYC/wG/AXUC/wG5AWgC/wGyAVkC/wGxAVcB/wHsAaQBZQH/A0QBeQQAATsBiQFCAfwBZwHoAZwB/wF3
-        Ad4BnwH/AYkB4QGnAf8BkAHjAawB/wGRAeMBrQH/AY0B4gGqAf8BhAHfAaIB/wFxAewBogH/AUYBrwFb
-        Af8DUQGgJAADQgF2ATABYgE1AfYBKgHQAWEB/wEvAckBPQH/AS4BngEAAf8BIgFYAQAB/wFWAVcBVgHb
-        Ay0BRhQAAwEBAgFpAlIB6QH8AcYBrAL/AfUB2QH/AfgB7gHZAf8B+gH0AeIB/wH7AfQB5AL/AfwB8QL/
-        Af4B+QL/AfwB+AH/Ae0B4QHdAf8DVgG+EAADCQEMAQQBYwHUAf8BUgHFAf4B/wGSAdgC/wGWAdwC/wGD
-        AaoBvwH/AdgBnwF1Av8BzgGaAv8BywGTAv8BxQGIAv8BvgFyAf8B+AGyAWcB/wFwAXMBhwH/AlABUQGf
-        BAABWAGWAV8B+wGUAeoBtAH/AacB6AG8Af8BsgHsAccB/wG+AfMBzAH/AcAB9AHOAf8BtwHsAckB/wGt
-        AeoBwAH/AZ8B8AG7Af8BXgG2AXAB/wNMAZMgAAMnAToBJwGEATsB+gEtAdcBZQH/ASwB1gFqAf8BKQG0
-        ATEB/wErAZgBAAH/AS4BpAEAAf8BKQFuAQAB/wNZAcoUAAMjATMBlAFPAU0B+wH/AdMBtwL/AfcB3wH/
-        AZ0BjwGCAf8BSQFFAUEB/wGOAYgBjAH/AcIBsAGrAf8B6gHgAdED/wH+Af8BzQHBAcAB/wNGAYEQAAMc
-        ASgBAwFtAeIB/wFwAdAB/gH/Ab4B6AL/AbgB5QH9Af8BnwGMAYQB/wH9AdkBtAL/AdYBqwL/AdMBpAL/
-        Ac4BmwL/AcgBjgH/AckBjwFpAf8BQQGvAfkB/wNSAakEAAFVAWwBVQHqAbIB8QHJAf8B0AH0Ad0B/wHm
-        AfsB7AH/AeUB8QHrAf8B4gHvAekB/wHtAfwB8AH/AdwB9gHmAf8BwAH5AdMB/wFXAZ0BXwH9AzYBWRwA
-        AwwBEANYAcABJgG7AUsB/wErAdMBYwH/ASgBzQFiAf8BLwHAAUIB/wEsAZcBAAH/ASwBmwEAAf8BLQGY
-        AQAB/wEoAT0BPAH4A0gBhgMDAQQMAANEAXoBvQFdAVMC/wHeAb4C/wHxAdkB/wHCAbQBowH/AUoBUAFL
-        Af8BgQGnAcAB/wETAU8BpwH/AlIBcgH/Ae8B2wHJAf8BkwF9AXsB+gMtAUUQAAIrASwBQwELAYIB8AH/
-        AY8B2QH+Af8BwgHqAv8BwQHlAfgB/wHRAacBjAL/Ad4BuQL/AdwBtgL/AdkBsAL/AdUBqAH/AfMBpAFo
-        Af8BpgGqAa4B/wFDAbYB/gH/A0oBjQQAA04BmQG3AeABwAH/AfQB/wH0Af8B7AH9AdYB/wF0AYcB2wH/
-        AWABZQHbAf8B0AH7AcUB/wHpAf8B7AH/Ac0B8gHUAf8BWAFbAVgB2QMHAQoYAAMmATgCUQFcAd8BAAES
-        AagB/wEbAa8BSQH/ASoB1QFcAf8BSAHmAYMB/wFHAesBhwH/AS8BwQFEAf8BLAGdAQEB/wEqAY0BAAH/
-        AQYBYwGnAf8BCAE2AbMB/QNVAboDFQEdCAADVQGyAdIBbwFbAv8B5QHDAf8B8AHaAcIB/wHpAdkBwgH/
-        AbACpwH/AYwBvwHoAf8BDwGvAv8BAAFrAdIB/wFlAWkBogH/AWICUgHvAxIBGRAAAzgBXgEbAZEB/AH/
-        AZ4B3gL/AcgB6wL/AcUB4AHuAf8B5gG7AZsC/wHlAcgC/wHWAbAC/wGRAUUC/wGmAWIB/wHVAWYBNAH/
-        AZsB2wH6Af8BPgG1Af4B/wNBAXIEAAMPARQBWgFhAVoB1QGiAdIBoAH/AXQBwwG2Af8BHgFlAbkB/wER
-        AVMBuQH/ATUBsAGVAf8BdAHTAY0B/wFdAWwBXQHwAykBPhgAA0EBcwIjAXUB9gIAAfcB/wEAARUBywH/
-        AUYBxAFXAf8BiwH7AagB/wFoAf4BnwH/AUUB6gGDAf8BMAHWAWwB/wEsAcgBTAH/ASoBoAEMAf8BBQFx
-        AZwB/wEAAWsC/wEAATsBzgH/AlEBVwHfAzABSwMBAQIBYQJWAdwB4wGRAW0C/wHtAcoB/wHnAc8BtgH/
-        AeUB0AG6Af8B2gHEAbYB/wFMAXUBpwH/AWQB2QH3Af8BIwHOAv8BAAGaAewB/wEVATkBXwH9A1EBpwMG
-        AQgMAANEAXkBLAGYAv8BrAHjAv8BzwHuAv8ByQLNAf8B8wHaAcUC/wHxAeIC/wHrAdYC/wGuAW0B/wHY
-        AYYBWQH/AS4BHgF1Af8BagGqAeEB/wE6Aa0B+gH/AzgBXAgAAxkBIwFBAWoBbgH2AXEBtAHdAf8BvQHU
-        Ad8B/wHCAdcB3wH/AV0BngHLAf8BFQFuAXMB/wNNAZYcAAIfAZkB+AIAAv8CAAL/AgAB2QH/AU4BiwFx
-        Af8BpgH5AaAB/wFoAf8BoAH/AUEB5gGCAf8BMgHVAWUB/wEsAc0BTgH/ARcBogFHAf8BAAFxAcQB/wEA
-        AWMC/wEAAW0C/wEAAUoB5AH/A1gBwAMfASwBbwE4ATcB9QHzAa0BiwH/AfsB5QHFAf8B0QG5AaQB/wHG
-        AbIBoAH/Ae0B2AHBAf8BzAG+AbkB/wFOAYsBswH/AWQB3QHzAf8BPgHwAv8BAAHFAfsB/wEGAVEBgQH+
-        A1gBxgMVAR0IAANOAZQBPgGfAv8BuwHoAv8B1gHwAv8BzgHCAbYB/wH7AfAB5gL/AfYB7QH/Af0B8QHj
-        Af8B7gHNAa8B/wFbAUwBkwH/AQABCQG7Af8BAAEMAa0B/wEFARgBtQH/AlcBWgHFCAADOgFhAVgBqAHD
-        Af0BtAHPAeUB/wHmAeoB8QH/AewB7gH2Af8BvAHJAd0B/wFBAZYBzAH/AVgCWQHSAx8BLAMSARkDBAEG
-        AwQBBgwAAggBwQH9AgAC/wIAAv8BGQEXAf4B/wEBAQMBxwH/ARgBUwFrAf8BUwHnAWUB/wFLAfoBgQH/
-        AS0BxwFFAf8BCgGUAVcB/wEAAZsB1AH/AQABngL/AQABYwL/AQABZQL/AQABYQH4Af8BVwFYAVkBxwM6
-        AWIBjAE3AS8C/gHBAZkB/wHeAcgBrgH/AcUBrgGaAf8B0AG/AagB/wHTAcIBrQH/Ad8BzQGzAf8BuAGg
-        AZsB/wE7AWABmwH/AVwBzgHrAf8BUAH9Av8BAAHdAv8BAAFjAawB/wJXAVoB2gMlATcEAAJTAVUBsAFU
-        AasC/wHLAe0C/wHgAfQC/wHVAcABrQH/Af4B+wH4Av8B+wH3Af8B8wHwAewB/wHTAc4BzAH/AVEBWQG3
-        Af8BXQF1AfEB/wE1AUwB2wH/ATQBSQHaAf8CWAFgAdEIAAFQAlIBowGeAdkB9AH/AbIB4AH6Af8BqgHa
-        AfYB/wGdAdQB9QH/AZUB0QH1Af8BcQHNAfcB/wFRAVMBYQHxAWIBVwFUAd8BZQFYAVIB6QFeAVgBVwHZ
-        AV4BWgFYAdgDUwGwAygBPAQAAhABuQH7AgEC/wJGAv8CgQH+Af8BVAFRAf0B/wEKAQIB3gH/AQUBLAGI
-        Af8BKgGkAT8B/wENAZwBhwH/AQABowHsAf8BAAHMAv8BAAHHAv8BAAGcAv8BAAFsAv8BAAFZAfQB/wNY
-        AcYDTgGZAboBRAExAf8B8wHAAZgB/wHWAcIBpAH/AdABuAGeAf8BxgGVAY0B/wHLAYcBjQH/AccBgwGN
-        Af8B1QGQAZQB/wHUAYIBkwH/AV4BUwGbAf8BUAGzAd4B/wFZAfYC/wEQAd8C/wE7AWsBpwH/AlYBVwHc
-        BAACWAFdAcsBawG5Av8B3AHzAv8B6gH3Av8B3QHGAbIB/wHzAd8B0AH/AfUB5QHYAf8B9gHpAd4B/wH4
-        Ae0B5AH/Ab4BtgHMAf8BOQFEAbgB/wGXAZ8B0wH/AVABkAHQAf0DHwEsCAABTQJOAZYBsgHeAfIB/wHb
-        AfcC/wHRAe8C/wG4AeYC/wGgAd8C/wGGAdcC/wFTAVcBWQHsAasBcgFcAfgB/wHpAcAC/wHdAbwC/wHc
-        AbgB/wHcAaUBdwH/AWABVAFOAesDMAFLAigBwQH9AnEC/wKSAv8CcgL/AmgC/wFgAV4C/wElARgB4QH/
-        ARkBIQFqAfsBAAGsAeMB/wEAAfUC/wEAAd4C/wEAAcIC/wEAAbAC/wEAAaYC/wEAAXMB+wH/A1kBxAFa
-        AlkCygFZAT8B/wHgAb4BmAH/AdMBtQGXAf8B0wGWAY0B/wHxAaIBpQH/Af4BswG0Af8B/gG0AbYB/wH+
-        AbcBuQL/AcQBwgH/AfkBuAG6Af8BgwGAAbgB/wFLAa4B5QH/Aa0B8gHzAf8BcgGwAewB/wFEAUoBYwHt
-        BAACWQFhAdIBiwHIAv8B8QH6Av8B9wH8Av8B9gH5AfsB/wHwAeUB3AH/Ae4B4AHVAf8B7QHcAc8B/wHs
-        AdgByQH/AeoB1AHCAf8B9AHwAe0B/wH3AfsC/wFYAWgBfgHpDAADKAE8AXoBnAGpAfoE/wH1A/8BzwHy
-        Av8BtAHyAv8BYgGVAbwB/gFpAVkBTwHyAfkBzAGXAv8B3gGyAv8B4AG5Av8B4QG5Av8B7AG+Af8B7AGl
-        AWsB/wNXAb0CWAFdAcsCdgHlAf8CkQL/AnEC/wJnAv8CYwL/AUEBPQGZAfoDUAGdAVQBYQFpAd8BAAHp
-        Af4B/wEAAeQC/wEAAcAC/wEAAbEC/wEAAa4C/wEkAW0BqAH3AzoBYgFmAUIBQQHvAb4BagFLAf8BzAGi
-        AYQB/wHUAY4BhwH/AfcBqwGpAv8BtwGyAv8BtgGzAv8BvgG8Av8BxgHFAv8B2QHXAv8B/AH6Af8B5gGx
-        Ab0B/wFYAVQBXgHlAU4BbgG1Af0BHwFdAcoB/wNLAY8EAAMcAScCUwFVAa0CXAFfAdEBXQFeAWMB1wFf
-        AWIBaAHdAWABZAFvAeMBYwFqAXkB6QFlAXABiAHvAW0BfwGjAfUBdgGTAcgB+wGHAaYB8AH/AYgBqwH1
-        Af8CVAFWAasQAAFGAkcBgAGGAZ4BqAH6AdYB5QHuAf8BvAHiAfEB/wFtAZUBuAH8AlABUgGjAWYCWgHb
-        Af8B2gGUAv8BzQGZAv8BzgGdAv8BzAGbAv8B1wGcAf8B/gG1AWoB/wNXAb8EAAJPAVEBnAJCAboB/AKD
-        Av8CXAH1Af8CRgFrAe8DMwFSBAADEAEWAVgCWgHAAQMBtQH2Af8BAAHPAv8BAAGkAv8BVAFdAWsB4AMn
-        AToEAAF5ASkBJAH8AbYBZwFSAf8B6AGrAaAC/wHGAcAC/wHPAccC/wHUAc0C/wHeAdcC/wHmAeEC/wHv
-        AekC/wL6Af8BwQGKAZ8B/gNUAa8DBAEGA0ABcAJLAUwBjwMBAQIvAAEBAwUBBxgAAy8BSgFRAlIBoQNS
-        AakDOQFfBAADRQF9AdwBkwFyAf4B/wH0AdQC/wH0Ad8C/wH1Ad0C/wHbAaoB/wGWAVMBOwH3AzEBTwgA
-        AzsBZAJKAX0B7gJZAV4B0AMYASEQAANMAZIBMQFnAasB9gJVAVcBugMMARAIAAFiAlEB3wGdAUEBQAH+
-        AboBVgFVAf0BsQFcAV4B/AGwAV4BYwH8AZ8CXwH7AaABXwFgAfsBogFcAW4B+gGiAV8BaQH7AYABWQFn
-        AfIDRAF8eAABRwJGAYABdgFlAV4B5QG1AY0BfQH6AagBhQFuAfcBYAJcAdQDMwFShAADSwGOA1kBwwNX
-        AcIDQgF2QAADEQEXA0QBeQNWAbMDWAHGA1cBxQNUAa8DPQFqAw0BEhAAAlUBVwG6ASEBJAGXAfsBNwE6
-        AZUB+AEvATUBkwH4ASsBLwGRAfgBKAEuAY4B+AEoASsBiwH4ASUBKAGHAfgCJQF/AfgBIwElAX0B+AEj
-        ASQBfAH4ASIBIwF7AfgCIwF6AfgCIwF6AfgBFgEXAXYB+wJZAVsBwwwAA1MBqgNYAdEDWAHLA1oB1QFH
-        AVoBcgHtATkBXQGAAfMBTwFVAV8B6AJbAVkB0ANaAc4DWQHSA0QBfAgAATEBdAGWAfcBAAG1AeEB/wEE
-        AasB2gH/AUYBUQFZAewDGQEjOAADQwF3AWYBVgFVAesCfwFNAf4BgQGpAUsB/wGGAbsBWQH/AYkBtgFa
-        Af8BswGoAXUB/wGiAVwBUQH9AVgCVAHeAzkBXwwAATQBNQGOAfYBJgFBAe4B/wEOASkB5AH/AQkBIgHg
-        Af8BDAEhAdoB/wEKAR0B1QH/AQcBGAHPAf8BEgEgAdYB/wESARwB0gH/AQUBDAHBAf8BBQEJAb0B/wED
-        AQcBuQH/AgABtQH/AgABrwH/AQEBAgG5Af8CKQGAAfcMAAGyAasBrAH/AdsB0gHRAf8B4gHMAcIB/wGF
-        AaMB3gH/AV0B0gL/AWsB6QL/AWUBrQHyAf8B2gHGAcIB/wHfAdUB1AH/AbwCtgH/A1UBtQgAATUBewGO
-        AfQBAAHoAv8BAAHuAv8BBAGDAbUB/wJWAVgB3ANKAYsDAwEELAABUgJQAaQBuAGDAX8B/gH/Ae8B5QH/
-        Ad0B+AHPAf8B3wH1Ac4B/wHmAfUB1gH/AekB+gHfA/8B+gP/AfkB/wHrAcgBuQH/AWoBQQE8AfkDRAF6
-        CAADVQG1ASIBNQHbAf8BAAEUAeQB/wFbAWoB0QH/AasBrwHQAf8BqQGuAdkB/wGzAbcB4AH/AZwBnwHH
-        Af8BmgGcAcQB/wG0AbYB3AH/AawBrgHTAf8BrwGwAcsB/wFoAWoBugH/AgABpAH/AQEBAwGrAf8CVgFY
-        AcEMAANRAaADVQGtA1ABnQNVAbUBZgGtAdQB/QFwAbcB5wH/AVYBYAFrAesDVAGmA1UBrQNSAakDKAE8
-        CAABWQFdAV4B0wEAAdoB9AH/AQAB2QH3Af8BAAHMAfoB/wEGAbgB6wH/ASIBQwFqAfkDOAFcKAADSwGQ
-        AcYBmgF0Av8B/QHjAv8B6gHOAv8B4AHCAv8B3AG7Av8B3AG5Av8B3QG9Av8B4AHDAv8B6gHRA/8B9gH/
-        Af0B5AHUAf8BagFBATwB+QM4AV0EAAMrAUIBKAEuAZ0B+wEMASgB6gH/AXQBiAHXAf8B+QH1AdkB/wH4
-        AfYB6gP/AfsB/wJiAVYB/wJXAUwD/wH5Af8C+gHvAf8C+wHiAf8BjQGPAcUB/wIAAbUB/wEDAQUBkwH/
-        AzIBURgAAzMBUgGCAXwBfQH6AaUBmgGcAf8DVAGuGAADJAE1AU8BZgFxAegBAAHbAfQB/wEAAdoB9gH/
-        AQUB7gL/AQMBmgHUAf8BOAFHAVkB8gNLAZADIwEzHAADJgE4AYIBXAFDAfgBvwHTAY4C/wHbAbIC/wHP
-        AZwC/wHKAZMC/wHIAY8C/wHJAY4C/wHLAZQC/wHSAZ8C/wHWAakB/wHuAdUBqwL/AfgB4QH/AfIByAGt
-        Af8BWAFXAVQB3QMNARIDBAEFA1MBqgEhATQB3gH/AR4BNQHoAf8B1gHYAeUB/wH6AfkB8gH/Av0B/gH/
-        AtUB1wH/AtIB0wH/Av0B/gH/AvoB9QH/AeEB4gHlAf8BJQEoAbwB/wEAAQUBtQH/AlYBWAG5AwkBDAwA
-        AzEBTwNWAbYDVwHoAXgBfAF3AfoBswGrAaYB/wGGAnAB/wNYAdEDEAEWGAADJAE1AU4BagF5AesBAAHh
-        AfkB/wEAAdAB9QH/AQEB1AH+Af8BCQHBAfEB/wEPAUgBmQH9AUIBSgFdAe0DUQGnA0oBiwMkATUQAANV
-        AbIBcwGPAToB/wFvAaMBQwH/AfgByQGNAv8BwAF1Av8BugFsAv8BuQFoAv8BuwFrAf8B1AGvAVkB/wF3
-        AZgBOQH/AeEBvQFzAf8B7QHHAY4B/wGoAbIBZwH/AW0BqQFOAf8BlgFXAUAB/QM9AWoEAAMqAUEBOwFC
-        AY4B9QELAScB7QH/AW0BgwHoA/8B9wX/A7wB/wO1B/8B/AH/AZABlAHVAf8BAAEFAcAB/wEoASsBigH4
-        AzEBThAAAXACbQHxAeMB2gHbAf8B8wHrAeoB/wHpAewB5AH/AdsB0AHOAf8BywG4AbkB/wGOAoEB/wFW
-        AlMB4wM9AWoDAQECFAADJgE4AUcBaQF7Ae0BAAHiAfkB/wEAAdMB8wH/AQ4B5QH9Af8BFgHmAv8BEAGv
-        AfIB/wEAAV4BxgH/AQABUwG+Af8BSgFNAVoB5wM4AV0MAAFtAVUBUQHqAUIBggEgAf8BGQFhAQEB/wFz
-        AYkBLAH/AfUBswFbAv8BsQFWAv8BrgFSAv8BswFYAf8BhgGKASoB/wEJAVsBAAH/AW4BhgEoAf8B/QHF
-        AYMB/wGdAZwBRgH/AVkBkQEyAf8BxgGcAWYB/wNTAbAIAAJUAVYBqwEoAToB3gH/AUMBVwH1Af8B7QHu
-        AfwF/wOMAf8DdgX/AeoB6wH+Af8BKAEvAd8B/wEIAREBwAH/AlUBVwG3AwEBAhAAAYcCfQH4Ae0C4AH/
-        AeIC1gH/AecB3AHeAf8B2QHKAcsB/wHUAsMB/wHlAtQB/wHJAroB/wFaAlIB/QNXAcIDIQEwFAADKQE/
-        AUEBZgF/Ae8BAAHjAfoB/wEAAc4B8gH/ARkB5AH7Af8BOwP/AUUB6gL/AV0B5AL/ARYBigHnAf8BJAE2
-        AW0B9wNGAYAIAAGKAVsBQQH5ATABZAEPAf8BGgFPAQAB/wEXAU4BAAH/AbEBkQE1Av8BswFVAv8BtAFX
-        Av8BuAFaAf8BYQFuARwB/wEcAVIBAQH/ASEBUwEBAf8BqgGTATwB/wHlAbABXwH/AckBsgFqAf8B7AG6
-        AYoB/wNXAcUIAAMnAToCQQGhAfkBngGiAf0B/wLPBv8DbQH/A1sF/wKnAv8BHQEeAf4B/wEfASEBqAH9
-        Ay8BSRQAAYcChQH3AfkC8gH/AfIC7QH/AfEC7gH/AdwCzwH/Ac8CvQH/AdQCxQH/AeEC0gH/Ae8C4gH/
-        AZgCjQH/A1EBoRgAAy0BRgE/AWgBggHvAQAB3QH0Af8BAAHHAfAB/wEYAeAB9gH/AVAD/wGOA/8BjwH2
-        Av8BKgGjAfkB/wEqATUBZwH1Ay8BSgQAAZMBXwE0AfsBKAFPAQcB/wEZATsBAAH/AWcBZQEbAf8B4wGp
-        AU4C/wG3AV0B/wHbAaMBTAH/AbYBjgE5Af8BOAFKAQIB/wEdAT0BAAH/ASABQQEAAf8BOQFPAQYB/wGe
-        AYMBMgH/AaMBjwE/Af8BuwGXAVUB/wFZAlgBxwgAAwIBAwJQAVIBowF3AYIB5wH/Ab0BvAL/AvsC/wJM
-        AUgB/wI+ATkB/wL2Af4B/wJlAv8BKAEpAeIB/wNVAbIDBQEHFAABiAKHAfcB/gL8Af8B7ALmAf8B7wLq
-        Af8B3QLRAf8BzgK8Af8B0wLEAf8B1QLGAf8B7QLfAf8BugKtAf8DUgGpHAADSAGEAQABqAHaAf8BAAHr
-        Af0B/wEAAeQB9AH/ARYC/gH/AUcD/wGSA/8BmwP/ARMBdAHhAf8CVwFbAdADDwEUAYkBWAFIAfYBhQFu
-        AScB/wG3AYoBMwH/AfUBrgFTAv8BvgFqAf8B2wGsAWMB/wFRAVYBIgH/AT4BTQEaAf8BRAFOARwB/wE7
-        AUQBEwH/ASwBNgEAAf8BNgE3AQAB/wI+AQAB/wE9AUMBCgH/AZIBZwEwAf8DVQG0DAADJAE2AUoBTAGM
-        AfMBsgG0Af4B/wLfAv8CbQFnAf8CaAFcAf8CwAH8Af8BVAFVAf4B/wE3ATgBkgH3AyoBQRgAA4cB9wHY
-        AsoB/wHIArcB/wHoAuAB/wHfAtMB/wHMArkB/wHSAsEB/wHVAsQB/wHmAtYB/wGtAp8B/wNRAaccAAFX
-        AVsBYAHWAQABygH5Af8BAAHgAv8BAAHvAv8BAAH8Av8BFQP/ATwB+gL/AYYD/wFiAeAC/wEHAUsBoQH+
-        A0oBjAFhAVgBVwHZAbEBiwE5Af8B7QGqAUwC/wHKAYwC/wHeAbcB/wHgAdIBuQH/AZ8BpgGPAf8BoAGn
-        AY8B/wGoAasBkwH/AaYBqQGQAf8BlQGZAXQB/wFkAWgBQgH/AR8BLwEAAf8BJwE3AQIB/wGqAWgBNwH/
-        A0MBdwwAAwMBBANQAZ0BggGFAeUB/wHJAcgC/wLmAe8B/wLmAe0B/wKWAv8BSQFLAeMB/wNTAaoDBgEI
-        GAABhwKGAfcBzQK7Af8BwwKyAf8B7wLqAf8B3gLSAf8BxgKzAf8B0AK+Af8B0QLAAf8B4gLRAf8BqQKa
-        Af8DUQGnHAABVQJXAboBAAHHAfMB/wEAAdEC/wEAAdoC/wEAAfUC/wEVAdgB8QH/ATUBYAGJAfUBLAGo
-        AcsB/QFbA/8BCgGCAegB/wNOAZQBRwJGAYEBnQFsATQB/wGlAbUBdgH/AfkB7gHaAv8B8AHhAv8B9gHq
-        Af8B8QHuAeAB/wHCAc8BuAH/AcYB0QG6Af8BzQHVAbwB/wHEAdABtwH/AboBzQG1Af8BhQGoAYYB/wFt
-        AYABMAH/AWwBWQFPAewDEgEZEAADJQE3AU8BUAGLAfEBvgHAAf4B/wLXAv8ByQHIAv8BjgGPAv8BNwE4
-        AZAB9gMtAUUcAAOHAfcB7wLoAf8B8ALrAf8B/gL9Af8B2QLMAf8BvgKoAf8BxwK0Af8BzQK7Af8B3wLN
-        Af8BpgKXAf8DUQGnHAADEAEWAU0BZwF8AesBAAHTAv8BAAHPAv8BAAHoAv8BJQGMAcAB/gNZAc8BHwFr
-        AZsB+AEDAbMB8wH/AlcBWgG9Aw0BEgMNARIBYwFXAVYB3wG9AccBlQH/AcwB6QHRAf8B5QHpAdgB/wH4
-        AfQB6QL/Af0B+AH/AdkB6AHWAf8BvgHYAb4B/wHAAdgBvwH/AcMB2QHBAf8BwAHfAcoB/wG3AdgBqwH/
-        AZ4BfAFFAf4DRAF5GAADUAGeAYwBkAHlAf8CzAL/AbUBtAL/AXABcwHkAf8DVAGuIAADewH1Af8C/QH/
-        AfYC7wH/AeQC2wH/Ad4C0wH/AdMCxQH/AcQCsAH/AcECqwH/AdYCwQH/AaICkQH/A1EBpyAAAzkBXwEe
-        AXwBrAH6AQAB0QH7Af8BAAHeAv8BAAHBAe0B/wEGAX8BrgH+AQABjQHbAf8CWQFbAcMDBAEGCAADJQE3
-        AX8BWAFNAe8B4AHdAboB/wHbAfgB5wH/Ad4B8AHlAf8B7AH1Ae0B/wHjAe8B4wH/AdUB5wHWAf8B1QHq
-        AdwB/wHbAfYB6QH/AesB8AHPAf8ByQGTAVYB/wFSAlABpBwAAx0BKgFLAUwBjQHzAdYB2AL/AcwBzQL/
-        Aj4BnAH4AyYBOSAAAz4BawNkAeoBzALFAf8B8ALoAf8B8ALoAf8B6ALjAf8B4ALZAf8BzgK/Af8B0AK5
-        Af8BnQKLAf8DVAGrJAADOAFcAVQBXAFmAd8BAAGxAekB/wEAAeoC/wEAAcsB9AH/AVkBWgFdAcoDCQEM
-        EAADJQE3AWUCWAHdAeIBtwGeAf8B+AH3AewJ/wH7A/8B+gH+AfIB/wH2AdkBvQH/AZwBawFYAfgDTgGU
-        IAADAgEDA04BlAGTAZcB6AH/AZoBnwHpAf8CTwFTAaUDAwEEJAADCQEMA0sBjwFsAmsB7wHZAtYB/wH5
-        AvYB/wH6AvcB/wH4AvcB/wHtAuUB/wGXAooB/wNOAZkoAAMNARIDTgGUAToBZwGKAfABWQFaAV0BygMN
-        ARIYAAMJAQwBRwJGAYABYwFaAVgB2QGXAWwBYgH1AbcBjwF5AfsBrQGGAWoB+QF3AV0BVQHqA1UBsgMn
-        ATooAAMbASYCVwFmAdsBUQFTAWsB5AMiATIwAAMVAR0DUAGeAYECgAH1A44B+QNkAeMDWQHHA0wBkwMW
-        AR8IAAFCAU0BPgcAAT4DAAEoAwABQAMAASABAQIAAQEBAAEBBgABCRYAA/8BAAHwAR8GAAHgAQ8GAAHg
-        AQ8GAAHgAQ8GAAHgAQ8GAAHgAQ8GAAHgAQ8GAAHgAQ8GAAHgAQ8GAAHgAQ8GAAHgAQ8GAAHgAQ8GAAHg
-        AQ8GAAHgAQ8GAAHgAQ8GAAHgAQ8GAAH4AQ8C/wH+AX8C/wHwAQcC/wH+AX8C/wHwAQMB+QHPAeABDwL/
-        AeABAQH4AY8B4AEHAgAB4AEBAfABjwHmAUcCAAHAAQEB8AEHAeYBQwIAAcABAAHgAQcB/gEHAgABwAEA
-        AeIBEwHwAQcCAAHAAQABwgEzAeABDwIAAcABAAHEARMB4AEfAgABwAEBAYQBGQHgAW8CAAHgAQMBiAEJ
-        AeIBZwIAAfwBDwIAAeABRwIAAcABfwL/AfABBwIAAYMBvwL/AfwBPwL/Ac8BvwL/Af4BfwL/AfgBPwHH
-        AeMB4AEHAX8B/wHgAQMBwQHDAcABAwE/Af8BgAEBAcABAwHgAQcBjwH/AYABAQHgAQcBgAEBAYMB/wGA
-        AQEB4AEHAYABAQHBAf8BgAEBAeABBwGAAQEBwAH/AYABAQHgAQMBgAEBAeABPwGAAQABwAEBAYABAQHw
-        AR8EAAHAAQMB+AEPBAABwAEDAfwBBwQAAeABBwH+AQMBAAEBAfgBHwHgAQcB/wEBAYABAQH4AR8B8AEP
-        Af8BgQHAAQMB/AE/AfABDwH/AsABBwH8AT8B8AEPAf8B8AL/AfwBPwH4AR8B/wH8AeAD/wHCAQMB/wHh
-        AeABPwIAAYABAQH/AeABwAEPAgABgAEAAf8BwAGAAQcCAAGAAQAB/wGAAQABAwIAAYABAAH/AYEBAAED
-        AgABgAEAAf8BAwEAAQECAAGAAQAB/wEDBAABgAEAAY4BBwHgBAABAQEMAQ8B/AQAAQMBAAEfAf4EAAEB
-        AQABPwH/AQEDAAEBAQABPwH/AQMDAAEBAcABYwH/AYcDAAEDAcABAwH/AccDAAEHAeABAwL/AgABAQEP
-        AfABDwIAAv8BnwH/AYABAQIAAeMB/wGHAf8BgAEBAgABwQH/AYEB/wGAAQECAAHAAf8BwAH/AYABAQIA
-        AYABfwHAAf8BgAEBAgABgAE/AcAB/wGAAQEDAAEfAeABPwGAAQEDAAEPAfABHwGAAQEDAAEHAfgBDwGA
-        AQECAAEMAQcB/AEPAYABAQIAAR4BAwH8AQcBgAEBAgABPwGBAf4BAwGAAQECAAH/AcAB/wEDAYABAQIA
-        Af8B8AH/AYEBgAEBAgAB/wH4Af8BwQGAAQECAAP/AeEBgAEBBP8B4AEDAYABAQGAAQEBgAEHAYABAQGA
-        AQEDAAEDAgABgAEBAwABAQIAAYABAQMAAQECAAGAAQEDAAEBAgABgAEBBgABgAEBBgABgAEBBgABgAEB
-        BgABgAEBBgABgAEBBgAB/wHDAQABAQEAAQEBAAEBAeEBhwEAAQEBAAEHAQABAQHgAQcBAAEHAQABDwEA
-        AQcB8AEPAQABfwEAAf8BAAF/AfABDwEAAQ8BhwHhAeABBwH+AQcBAAIDAsABAwH4AQcBAAIBAoABAQHA
-        AQcGAAGAAQcGAAGAAQcCAAGAAQECAAGAAQcCAAHAAQMCAAGAAQcCAAHgAQcCAAGAAQcCAAHgAQcCAAGA
-        AQcCAAHAAQMCAAGAAQcCAAGAAQECAAGAAQEGAAGAAQEGAAGAAQEBAAIBAoABAQGAAQMBAAH/AQMCwAED
-        AYABDwL/AYcB4QHgAQcBgAF/Af8B+AIAAeMB/wHgAQcB/wHwAgABwQH/AYABAwHgASACAAGAAf8BgAEB
-        AcABAQMAAX8BgAEBAcABAwMAAT8BgAEBAYABBwMAAR8BgAEBAYABAQMAAQ8BgAEBBAABgAEHAYABAQQA
-        AcABAwGAAQEEAAHgAQEBgAEBAQABAQIAAfABAAGAAQEBAAEBAgAB+AEAAYABAQGAAQMCAAH8AQABgAEB
-        AfABAwIAAf4BAQGAAQEB/AEHAgAB/wEDAYABAwH/AQcCAAH/AYcBwAEHAYAB/wIAAeABBwHgAQcBgAH/
-        AgAB4AEHAcABAwGAAwABwAEBAYABAQGAAwABgAMAAYABAAGAAQABgAMAAYADAAGAAwABgAMAAYADAAGA
-        AwABgAMAAYADAAGAAwABgAMAAYADAAGAAgABAQGAAwAB4AIAAQEBgAEBAgAB4AIAAQEBgAEBAgAB4AEB
-        AQABAQHAAQMBgAEBAfAB9wGAAQEB8AEDAcABAwHwA/8B8AEDAfABBwX/AeEBgAG/AYABAAHgAT8B/wHA
-        AQABAwGAAQAB4AEHAf8BgAIAAYABAAHAAQEB/wMAAYABAAHAAQEB/gMAAYABAAHAAQEB/AEBAQABAQGA
-        AQABgAEBAeABAwEAAQ8BgAEAAYABAQGAAQcCAAGAAQABgAEBAQABDwGAAQABgAEAAYABAQEAAR8B4AEA
-        AYABAAGAAQMBAAE/AeABAQGAAQABgAEDAQABPwHgAQEBgAEAAYABAwEAAT8BwAEBAYABAAHgAQcBAAF/
-        AcABAQGAAQAB/gEHAcABfwHAAQEE/wHAAf8BwAEDAgAC/wIAAcABAwIAAeMB/wYAAcMB/wYAAcABAQYA
-        AcABAQYAAcABAQYAAcABAQYAAcABAQYAAYABAQYAAYABAQYAAYABAQYAAYABAQIAAeABBwIAAYABAQIA
-        AfABDwIAAYAB/wIAAfABBwIAAYAB/wIAAfABBwIAAv8CAAHwAQcB/wGPAfABPwL/AeABBwH/AYcBgAEB
-        AYABAQHAAQcB8AGDAgABgAEBAeABBwHgAQMCAAGAAQEBgAEBAcABAQIAAYABAQMAAQECAAGAAQEGAAGA
-        AQEGAAGAAQEGAAGAAQEGAAGAAQEGAAGAAQEGAAGAAQECAAHAAgABAQGAAQECAAHgAgABAQGAAQEBAAEB
-        AeACAAEHAYABAQEAAQEB/wHAAQABfwGAAQEBgAEBAfgBTwHgBQAB+AEHAeAFAAHAAQMBwAUAAYABAwHA
-        BwABwAUAAYABAAGABwABgAUAAQEBgAYAAQEIAAEBDgABgAEBBgABwAEDBgABwAEfBgAB8gEfAeABBwQA
-        BP8CAAL/AeABAwHwAQ8B4AEHAcABfwHgAQAB4AEHAeABDwGAAQcB4AEAAcABAwIAAYABAAHAAQABgAEB
-        AgABgAEAAYAHAAGABwABgAcAAYAGAAEBAeAGAAEBAeAGAAEBAeAGAAEDAeAFAAGAAQMB8AIAAQECAAHA
-        AQcB+AEAAYABAwIAAcABHwH8AQEBwAEHAgAB4AF/Av8B4AEPAgAB4AH/AfgBHwT/AfgBPwHIARMB/gE/
-        Av8BwAEfAZwBOQH8AR8BgAEHAQABDwEEASAB/AEfAYABAwEAAQcBBAEgAfgBPwGAAQEBAAEDAQQBIAHg
-        AUMBgAEBAgABBAEgAcABAwGAAQEBgAMAAYABAwGAAQEB4AMAAYABBwGAAQEB8AEAAQQBIAGAAR8BwAEB
-        AfwBAAECAUABgAEDAfABAQH+AQECAAGAAQEBwAEBAfwBAwIAAcABAQHAAQMB+AEDAYABAQHAAQMB4AEH
-        AfABBwHAAQMBwAP/AeABDwHgAQcE/wHgAQ8B/wEDBv8B8AEBAv8B+AEfAgAB4AMAAfgBAQIAAYADAAGA
-        AwABgAEBAgABgAcAAYAHAAGADAABAQMAAQEDAAEBAwABAQMAAQEDAAEDAwABAQMAAQMDAAEDAwABAwIA
-        AYABAwIAAcABBwIAAcABBwL/AfABfwL/AeABHwj/AYABPwL/AcABBwHnAf8BAAEfAfwBPwHAAQMBwAEB
-        AQABHwH4AR8BwAEDAcABAQEAAR8B8AEPAYABBwGAAQEBAAEfAeABDwGAAQcBgAEBAQABHwHAAQMBgAEH
-        AYABAQEAAR8BgAEBAYABBwGAAQEBAAE/AwABAwGAAQEBgAF/AwABAQGAAQEBgAEHBAABgAEBAYABAQQA
-        AYABAQGABQABgAEDAYAFAAGAAQMBwAEAAYEBAQIAAf8B5wHhAQACwwEAAR8D/wGBBP8BDwH/AfABDwIA
-        AeABAwEHAf8B4AEHAgAB4AEDAQEB/wHAAQMCAAHgAQMBAQH/AYABAQIAAfwBPwEAAX8EAAHgAR8BgAEP
-        AgABgAEBAeABBwHAAQcCAAHAAQEB4AEDAeABAwIAAcABAwHgAQMB8AEBAgABwAEDAeABAwH4AwAB4AEH
-        AeABAwH4AwAB4AEHAeABAwH4AwAB8AEPAeABAwH4AgABAQH4AR8B4AEDAfwBAQGAAQMB+AEfAeABAwH+
-        AQMBwAEHAfgBHwHwAQMB/wEHAeABDwH8AT8B/AEDCw==
+        A1sB4QMMARAMAANKAYwBXQJYAf8BnwKVAf8BtAKzAf8BiAGHAYgB/wNWAbgDQwF3AVUBYgFwAeoB3wH+
+        Av8B5wP/AesD/wFSAW0BlgH3AyQBNgG1ATsBAAL/AeABxwL/AeABxwL/AeABxwL/AeABxwL/AeABxwX/
+        AbUBOwEAAf8BtQE7AQAB/wG1ATsBAAH/AbUBOwEAAf8BtQE7AQAB/wMdASoDBAEFAwIBAwgAAbsBWAFA
+        Af0B+gHUAaAB/wHyAe8B8AL/Af4D/wH4AfYC/wH1AfEC/wHxAewC/wHvAesC/wHzAe4C/wH1AfMC/wH8
+        AfsB/wHsAuoB/wHgAaUBXQH/AbwBUgEwAf0EAAMmATgBdwJoAfYBxgKxAf8BxwKzAf8BxwKzAf8ByQK2
+        Af8BywK5Af8BzQK8Af8B0AK/Af8B0gLDAf8B1QLIAf8B2wLQAf8B3QLRAf8BsAKcAf8DVgHBEAADAQEC
+        AzQBVANCAXQDPgFsAzEBTwMLAQ8DAAEBAlkBXALJAfkC/wH7B/8B0QH4Af4B/wNbAcgBtQE7AQAV/wG1
+        ATsBAAH/AysBQgMHAQoDAwEEAwMBBAMCAQMDAAEBEAAB0AFcAS0C/wHhAacB/wH3AfoB8wf/AfoD/wH1
+        Av8B/AHyAv8B/gH2A/8B+gP/Af0F/wHxAfUB7gH/AecBswFnAf8B0wFWARcB/wQAAxABFgFkAl8B6gHD
+        Aq0B/wHPArsB/wHQAr4B/wHRAr8B/wHUAsMB/wHXAscB/wHbAssB/wHeAtAB/wHhAtYB/wHpAt4B/wHd
+        AssB/wGYAoQB/wNMAZIsAAJIAUkBhwExAV8BnAH7AU0BawGiAfoBTQFoAaEB+gFJAWIBpgH7AUoBUgFw
+        Ae8DAQECAbUBOwEAAf8BtQE7AQAB/wG1ATsBAAH/AbUBOwEAAf8BtQE7AQAB/wMdASoDBAEFAwIBAyAA
+        AVYCVAGrAZ4BWgEyAfsBhgJZAfUBhgJZAfUBhgJZAfUBhgFZAVcB9QGGAVkBTAH1AYYBWQFXAfUBhgFZ
+        AVcB9QGGAVkBVwH1AYYBWQFXAfUBjgFUAVEB9wGeAVYBLAH7AVgCVgG7CAADUQGcAXwCdQH6AZICiAH7
+        AY0CfAH6AY0CfAH6AZACfQH6AZICfgH6AZUCgwH6AZYChwH6AZgCjAH6AZYCkwH7AYoCfAH8A18B4AMh
+        ATAYAAMhATEDQAFwA1ABngMpAT8EAAMKAQ4DEQEXHAADBAEFAxQBHAMnAToDLAFEAygBPQMjATQDHgEr
+        AxgBIgMUARsDEAEVAwwBEAMJAQwDBAEGAzoBYQNZAccDWQHMA1oBygNaAcoDWgHKA1oBygNaAcoDWgHK
+        A1oBygNaAcoDWgHKA1oBygNcAc4DWQHDAzQBVQNKAYwDVgG2A1UBsQNVAbEDVQGxA1UBsQNVAbEDVQGx
+        A1UBsQNVAbEDVQGxA1UBsQNVAbEDVQGxA1YBtgNOAZgUAANeAdkBxQKyAf8BzwK7Af8DWAHAAykBPwNb
+        AcsDXQHSAzEBTxgAAx8BLAJXAVoBxQJbAWAB1gNXAb8DUAGkA0oBiwNBAXIDOAFdAzEBTgMtAUUDKAE9
+        AyMBNAMaASUDYQHuA+IB/wPdAf8D2gH/A9oB/wPYAf8D2AH/A9cB/wPXAf8D1QH/A9UB/wPUAf8DyAH/
+        A9oB/wOZAf8DVwG9AWgBQAE4Af0BtAFzAWUB/wGwAYYBcwH/AbQBiAGAAf8BsgGIAXQB/wGxAYYBdAH/
+        Aa4BhgF0Af8BrQGFAXQB/wGsAYUBcwH/AaoBhAFzAf8BqQGBAXIB/wGoAYIBcwH/AaYBgQFyAf8BpwGD
+        AYIB/wGsAXIBbAH/AU4BQAE/AfQIAAM6AWIDOAFeAzIBUQF7AnUB9gHmAtIB/wHnAtgB/wHFArQB/wGd
+        Ao4B/wHMAroB/wHgAswB/wGHAn8B/gM3AVsQAAMCAQMCTwFRAZwBNQHeAv8BQwGzAccB/wElAY0BrQH/
+        ARQBlgHRAf8BEgF/AcEB/gEzAVkBhAH1AVIBVwFlAegCWgFeAdUDVwG/A1IBpgNJAYkDNAFUA4gB9wT/
+        A/QB/wPzAf8D8wH/A/EB/wPwAf8D7gH/A+0B/wPrAf8D7AH/A+cB/wOWAf8D0AH/A8wB/wNZAcMBpgFQ
+        AUAB/QHzAdsBzgH/AeAB0QHGAf8B3wHNAcEB/wHaAckBvwH/AdoByAG9Af8B2gHFAbsB/wHZAcUBugH/
+        AdkBxQG4Af8B2AHDAbYB/wHYAcEBtAH/AdgBwQGyAf8B1gG/AbAB/wHYAcQBtQH/AeQBvAGoAf8BWQFL
+        AUkB8gQAAzUBVwGvAp0B/wG4AqQB/wGlApMB/wHHArQB/wHhAtEB/wHtAuEB/wHsAt8B/wHjAtIB/wHb
+        As4B/wH0AusB/wHxAuIB/wFZAlcBwhAAAw4BEwFVAV8BagHoAVUB0wH0Af8BswFwAVAB/wHiAakBhAH/
+        AcEBlAFmAf8BpgGYAXEB/wGCAaMBnQH/AVQBsAHMAf8BOAG4AfYB/wEkAbEC/wEYAZ4C/wEIAVYB0wH/
+        A1EBoAN7AfYD+wH/A+oB/wPrAf8D6gH/A+gB/wPnAf8D5gH/A+QB/wPjAf8D5AH/A98B/wOcAf8D0AH/
+        A8QB/wNWAcEBpAFPAUAB/QHvAccBnAH/AcQBpQGCAf8B2QGsAXIB/wHzAbcBdAH/AfEBsQFrAf8B8gGt
+        AWQB/wHyAakBXAH/AfIBpAFWAf8B8gGgAVAB/wHyAZwBSQH/AfIBmQFCAf8B8gGVATwB/wH1AZUBOQH/
+        AfYBkAEyAf8BVgFPAUcB8QMMARABZQJkAecBzAK5Af8B3QLLAf8B2gLHAf8B2ALHAf8B6QLcAf8B8QLm
+        Af8B9gLsAf8B9gLtAf8B9gLtAf8B/QL2Af8B3QLQAf8DYQHcA0UBfgMEAQYIAAM4AVwBJgGpAfQB/wFf
+        AaMBtAH/AeQBtAGLAv8BzwHEAv8B1gG9Av8B3AG2Af8B+wHIAZ0B/wHmAbMBhAH/AcQBoAFtAf8BnwGb
+        AXQB/wFxAqoB/wFOAc4C/wJaAVwBzQN9AfYD/AH/A+0B/wPtAf8D7AH/A+oB/wPpAf8D6AH/A+YB/wPl
+        Af8D5QH/A+EB/wPTAf8D6gH/A8EB/wNWAcEBqAFOAUAB/QHmAcsBrgH/AdAB3AHjAf8B1QG9AaYB/wH+
+        Ab0BgAL/AbwBgAL/AbYBbQL/AbIBZgL/Aa4BXwL/AakBWQL/AaUBUwL/AaIBTAL/AZ8BRgL/AZ8BQgL/
+        AZkBOgH/AVkBTwFHAfEEAANMAZABzAK6Af8B6QLbAf8B6ALbAf8B7QLgAf8B8gLmAf8B3gLRAf8B0ALD
+        Af8B5QLaAf8B/AL0Af8B/QL3Af8B5wLbAf8B2wLGAf8BsQKeAf8DOgFiBAADAwEEA1YBtgFGAc8C/wGX
+        AZABgAH/Af0B1QG6Af8B9AG7AbkB/wH9Ad4BvwH/Af4B3QG/Av8B5gHLAv8B5wHLAv8B5wHJAv8B0QGu
+        Af8B0QGgAVcB/wEcAYkB0gH/A0oBigN9AfYD/QH/A+4B/wPuAf8D7QH/A+sB/wPqAf8D6QH/A+cB/wPm
+        Af8D5gH/A+MB/wOiAf8D0wH/A8cB/wNWAcEBpwFOAUAB/QHwAdYBugH/AegB8wH6Af8B4QHKAbQB/wH7
+        AbwBgQL/Ab0BggL/AbcBcAL/AbMBagL/Aa8BYwL/AasBXgL/AacBWAL/AaQBUQL/AaEBTAL/AaIBSQL/
+        AZwBQwH/AVkBTwFHAfEDFQEdA0gBhAHAAqsB/wHmAtcB/wHsAuAB/wHvAuMB/wFzAnAB7wNCAXQDLAFE
+        A0gBhQGiAp4B+gH/AvwC/wL7Af8B+QLzAf8B8ALlAf8DUwGqBAADGQEjATgBWQGJAfUBZwHJAesB/wHI
+        AaABcgH/AfwB0wHRAf8B9gHLAcUB/wH8AeMBygH/Af0B4AHKAf8BrgGgAYEB/wHiAcUBsAL/Ad0BxQH/
+        AfQByQGsAf8B+AHYAasB/wNaAdsDIwEzA30B9gP9Af8D8AH/A+8B/wPuAf8D7AH/A+sB/wPqAf8D6QH/
+        A+cB/wPpAf8D5AH/A5EB/wPNAf8DywH/A1YBwQGlAVABQAH9AfsB1AGqAf8B4wHDAaIB/wHvAcABlgL/
+        AcIBjAL/Ab4BhQL/AbkBdAL/AbUBbgL/AbEBZwL/Aa4BYgL/AaoBXAL/AacBVgL/AaQBUQL/AaYBTwL/
+        AaABSAH/AVkBTwFHAfEDYQHkAcECqwH/Ac0CtgH/AeQC1gH/AfMC6QH/Ac0CvQH/AzQBVQgAAwsBDwF+
+        AnQB8wH/AvoJ/wH9AvYB/wNbAcsDAAEBAkEBQgFzAS4BoAH9Af8BlQGwAa0B/wHtAcQBpAH/AfUBxwHV
+        Af8B+AHhAdIC/wHpAdsB/wHPAcMBpwH/AS8BpAFAAf8BVQGRAUwB/wHfAbsBrAH/AfUBywG0Af8B+AHO
+        AaAB/wNKAYoDEwEaA30B9gP+Af8D8QH/A/EB/wPwAf8D7gH/A+0B/wPsAf8D6gH/A+kB/wPoAf8D5gH/
+        A8sB/wPoAf8DxwH/A1YBwQGoAVEBQAH9AecBygGoAf8BwwG4Aa0B/wHXAbUBlgL/AcUBjwL/AcEBigL/
+        AbwBgwL/AbgBcgL/AbQBbAL/AbIBZgL/Aa4BYQL/AasBWwL/AagBVgL/AakBVQL/AaQBTgH/AVoBUQFH
+        AfEBZAJjAeAB0gK9Af8B4gLSAf8B7QLiAf8B+ALtAf8BjgKJAfkDHQEpBAADFAEbA1UBsgHYAscB/wH+
+        AvsF/wGnAp0B+wNRAaADKAE9AwQBBgJZAVwByQFeAcgC/wG4AaYBhQH/AfkB1gHTAf8B8wHLAdgB/wH3
+        AesB3gH/AfwB5AHeAf8BgQGxAW0B/wFfAegBnwH/AVEB2wGNAf8BVQGWAU8B/wHrAdYBywH/AmEBXAHc
+        AykBPwMNAREDfQH2BP8D8wH/A/IB/wPyAf8D8AH/A+8B/wPtAf8D7AH/A+oB/wPqAf8D6AH/A8gB/wPl
+        Af8DyQH/A1YBwQGoAVABQAH9AesB1gG/Af8B5AHzAv8B2wHKAbkB/wH7AcMBjQL/AcQBjwL/AcABhwL/
+        AbwBggL/AbkBcQL/AbUBbAL/AbIBZgL/Aa4BYQL/AasBXAL/Aa0BWwL/AagBVgH/AVoBUQFJAfEDUgGh
+        AdQCwgH/AfYC7AH/AfIC6AH/AfcC7gH/AdgCyQH/A2AB1gNXAbgBZgJlAegBzgK7Af8B7ALhCf8BewJx
+        AfMDHQEqBAADKAE8ASQBTQGvAfoBlQHOAeIB/wHYAbYBkQH/AfcB0wHsAf8B8wHgAeQB/wH8Ae4B7AH/
+        AcoB0AG4Af8BUAHGAWoB/wFeAboBZwH/AVsBzwGEAf8BUgHoAZsB/wFQAZkBTAH/A04BlwMvAUoDGQEj
+        A38B9gT/A/QB/wP0Af8D8wH/A/EB/wPwAf8D7wH/A+0B/wPsAf8D7QH/A+gB/wOJAf8DyQH/A9AB/wNW
+        AcEBpwFSAUAB/QH2AdwBvQH/AecB4AHYAf8B5wHMAbAB/wH+AccBlQL/AcYBkwL/AcIBjAL/Ab4BhwL/
+        AbsBgQL/AbgBcQL/AbQBbAL/AbIBZwL/Aa8BYwL/AbEBYgL/AawBXAH/AWABUQFJAfEDHAEoAV0CXAHR
+        AYICfgHzAeAC0QH/AfcC7wH/AfkC8QH/AegC2gH/AdwCyQH/Ad8CzwH/AewC4wL/Av4J/wHwAuUB/wNY
+        AcEDAQECAk8BUAGbAT4BngL/AbUBvgGqAf8B8gHOAb4B/wH3AdMB7wH/AfwB8wHxAv8B8QH0Af8BXgG6
+        AV8B/wFZAboBYAH/AesB3gHYAf8ByAHSAbkB/wFjAcoBbQH/AUgB7gGVAf8BWQFdAVkB1wM3AVoDKQE/
+        A4EB9gT/A/YB/wP1Af8D9QH/A/MB/wPyAf8D8AH/A+8B/wPtAf8D7QH/A+oB/wOwAf8D3AH/A88B/wNW
+        AcEBqAFTAUAB/QH1AdcBsAH/AdQBtgGYAf8B6AG/AZkC/wHOAZ4C/wHIAZgC/wHFAZEC/wHBAYwC/wG+
+        AYYC/wG7AYEC/wG3AXEC/wG1AW0C/wGyAWkC/wG1AWgC/wGxAWIB/wFgAVIBSQHxBAADCAELA2EB3AHQ
+        ArsB/wH1AuwB/wH9AvgG/wL9Av8C/gn/AfQC7QH/Af0C+wH/Ad0C0wH/A0ABbgQAAUEBTgF9AfABhwHO
+        Af0B/wHOAbkBkgL/Ad0B8QH/AfwB3gHuAf8B3gHbAdQB/wHmAtsB/wHEAdIBtgH/AfEB6gHjAv8B8wH1
+        Av8B9wHuAf8BgAF/AZAB/gNVAboBTAGwAWAB+gFZAV0BWQHXAzABTQOBAfYE/wP3Af8D9gH/A/YB/wP0
+        Af8D8wH/A/EB/wPwAf8D7gH/A+0B/wPrAf8D4gH/A/QB/wPMAf8DVgHBAagBUwFAAf0B5gHUAbwB/wHS
+        AdoB4AH/AdUBxAGxAf8B/AHNAZ0C/wHLAZwC/wHHAZUC/wHDAZEC/wHBAYsC/wG+AYYC/wG7AYIC/wG4
+        AXMC/wG2AW4C/wG4AW4C/wG0AWgB/wFgAVMBSQHxCAADVQGwAdwCywL/Av0B/wH8AvUB/wHrAuEB/wH6
+        AvYJ/wF/AnsB8gNEAXkDVAGuA0oBjAgAAVoBXQFoAeIBvAHjAeQB/wHpAccBkgH/Ae4B1wHQAf8BVAGc
+        AUcB/wEPAYoBCgH/AQ4BgAEHAf8BSwGDATUB/wHvAd0BzgL/AfIB4AH/AecB4QHCAf8CWQFdAdIDGwEm
+        AyIBMgNbAcgBWAFbAVgBxgOBAfYE/wP5Af8D+AH/A/gB/wP2Af8D9AH/A/MB/wPyAf8D8AH/A/EB/wPt
+        Af8DnQH/A9IB/wPSAf8DVgHBAagBUwFAAf0B8AHhAc0B/wHmAfEB+QH/Ad8B0wHDAf8B/AHSAaUC/wHS
+        AaUC/wHOAZ8C/wHLAZkC/wHIAZQC/wHEAZAC/wHCAYsC/wHAAYcC/wG9AYIC/wG+AYQC/wG8AXEB/wFg
+        AVMBTAHxCAADEgEZA1IBowHbAs0B/wFlAmQB4gNAAW4BbQJqAecB/wL+Af8B/AL5Af8DXAHJFAADLQFF
+        A1UBsgFaAl0BygFZAmQB7AFGAcoBQQH/AUgB3QFGAf8BOwHYATUB/wEXAYwBJwH/AY0BrAHFAf8BqgHM
+        AdcB/wFZAWQBewHsAzEBTwMIAQsDAAEBAwIBAwMfASwDhQH2BP8D+wH/A/kB/wP4Af8D9gH/A/QB/wPz
+        Af8D8gH/A/EB/wPxAf8D7QH/A5YB/wPPAf8D1AH/A1cBwgGdAXEBTQH+Af8B8gHNAf8B+gHeAcUC/wHb
+        AbgC/wHgAbIC/wHeAa0C/wHZAaYC/wHWAaIC/wHTAZwC/wHPAZgC/wHNAZQC/wHLAZAC/wHIAYwC/wHL
+        AYwC/wHGAYcB/wFfAUwBRAHzEAADMgFQAx8BLAQAA0oBiQFlAmQB4gNWAbEDNQFXIAADIAEuA1sBwwGB
+        AaEBgQH3AVwBYAFcAdQDPQFpAz4BawJBAUIBcwMfAS0DBAEFAwABAQwAA5MB+Bz/A/4B/wP9Af8D/QH/
+        A/sB/wPfAf8D9gH/A9QB/wNXAcIBWQFLAUcB8gF4AU0BQwH6AXYBTQExAfoBdgFNATIB+gF1AU0BMgH6
+        AXQBTQExAfoBdAFNAS8B+gFzAU0BLgH6AXMBTQEsAfoBcgFNASoB+gFyAU0BKgH6AXIBTQEpAfoBcgFM
+        ASkB+gFqAUMBOwH5AXQBNQErAfwBWwJZAdmAAANbAcsDrQH+A7UB/QO1Af0DtQH9A7UB/QO1Af0DtQH9
+        A7UB/QO1Af0DtQH9A7UB/QO3Af0DuAH+A24B9QM7AWVMAANWAbMDUgGpAzUBWAMtAUUDHAEnAxcBIAM7
+        AWUBWgFfAWEB2wNBAXMDGgEkAwQBBhgAAxUBHQNCAXYDVQGyA1cBwgNWAcEDVAGrAz4BawMPARQcAAMQ
+        ARYDWwHIA2QB8QNiAe8DYgHvA2IB7wNiAe8DZwHyA1oB0wMUARsUAANWAbMBZwJRAfIBXwJbAeADVgG2
+        A0QBeQMoATwDDQESKAADUgGpAQABlgHtAf8BWwJeAdADRAF7AzUBVgJPAVEBnAE1AYcBpwH3ATMBgAGR
+        AfUDPAFmAykBPgMXASADCgENAwIBAwwAA0MBdwFfAlUB6gGnAXsBegH+AdoBoAGdAf8B4gG1Aa0B/wHe
+        Aa0BpQH/AcsBkQGKAf8BeQE+AT0B/AFcAloB3AM4AV0YAAMEAQYDawHrA/oB/wPwAf8D8AH/A+8B/wPy
+        Af8D8gH/A1cB3xQAASwCKwFDAZQCagH5Af8B4wHUAf8B7wHAAbMB/wHQAZsBkwH/AZABawFpAf4BZwFE
+        AUUB+AFaAlYB5ANXAb8DSAGGAy8BSgMQARYYAAMxAU4BAAFeAeoB/wEAASoB9AH/AUsBYQF2Ae4BWQJe
+        AdkBAAGDAv8BAAEtAfEB/wFTAWsBcQHxA1MBqgNBAXIDMQFPAyEBMQMNARIIAANQAaMBrwJrAf0B+wLk
+        Av8B6QHmAv8B2QHPAv8B6QHZAv8B6AHWAv8B5wHVAv8B2gHKAf8B3AGaAZEB/wFcAj4B+ANFAX8IAAME
+        AQYDKgFBAz8BbQNKAYsDWQHrA70B/wO/Af8DvAH/A70B/wO+Af8DrQH/A1sB5QNNAZYDQgF2AzABTQMU
+        ARsEAAFJAkgBhwHfAawBpQL/AdwBxQL/AdcBwQL/Ad8BzQL/AeEB0wL/AdsB0AH/AfQByAG/Af8B2QGk
+        AZ4B/wGuAWkBZgH/AWIBRAFDAfsBWQJVAesDWQHHA04BlAMlATcLAAEBAw4BEwFYAWkBcQHmAQABGgH3
+        Af8BBwEtAv8BCgFRAv8BBgERAfgB/wEAAWQB+AH/AbkBywG1Av8B3gGvAf8BfgFuAWQB8QNQAaQDNgFZ
+        AyIBMgQAA0sBkAG+AYIBhAH+Bf8B/gH8Av8B6QHnAv8BzQHDAv8B2AHJAv8B2gHJAv8B1wHGAv8B2gHH
+        Av8B5QHRAf8B9AG1AacB/wFcAj4B+AM4AVwEAANaAc0DewH8AbcBuAG5Af8B0AHRAdIB/wHOAc8B0AH/
+        AdoB2wHcAf8C5QHmAf8B4gHjAeQB/wHiAeMB5AH/AeMC5QH/AuUB5wH/AcwB0QHPAf8BuwG/Ab0B/wKs
+        Aa0B/wN2AfwDWQHSBAADWwHIAfIBzQHEAv8B2wHNAv8B1gHMAv8B2QHRAv8B2gHUAv8B3QHWAv8B4gHZ
+        Av8B5wHdAv8B6AHeAv8B3wHUAf8B+gHMAcEB/wHjAa0BpgH/AaMBTQFMAf8DVQGyBAADAgEDAwsBDwMd
+        ASoBWwJgAdYBIwFfAf0B/wFYAWAB/QH/AUoBVQH8Af8BJwE7AfwB/wELAZQB9QH/AcQBwwGlAv8B2wGl
+        Av8B7wHHAf8B7AG+AZUB/wNRAacDMwFSAyoBQQGOAmUB+QH/AfAB7wL/AfsB+QL/AfAB7wL/Ae8B7gL/
+        AdkB0QL/AdwBzAL/AeABzgL/AdgBxwL/AdMBwQL/AdQBwQL/AeMBzAH/AdwBlAGHAf8BXAJaAdwDEAEW
+        A7kB/QL4AfcB/wHVAdEBzgH/AdMB0AHNAf8B0gHQAc0B/wHRAc8BzAH/AcYBxAHCAf8BtwG2AbMB/wG+
+        AbwBuwH/As0BywH/AtEBzwH/Ac8B0QHOAf8BzgHPAc0B/wPZBf8DaAHzAxwBKAFyAl0B8AH/AeEB2gL/
+        AeAB3AL/AeEB3wL/AuMC/wLlAv8C5wL/AuUC/wHhAeAC/wHdAdsC/wHbAdUC/wHdAdAC/wHsAd0B/wHG
+        AYIBcwH/A08BmwQAAwkBDAMwAUsBXAJgAdQBMgGaAfwB/wGlAbAB/gH/AZ0BqwH9Af8BbwGNAfwB/wFR
+        AWQB+wH/ARoBRwH5Af8BEQGBAeYB/wGeAa4BoQH/Af4BvgGDAv8B4wGwAf8BlgGBAWgB9wNFAX0BVQJT
+        AbAB8QG7AbkC/wHcAdcC/wHbAdgC/wHuAe0C/wH3AfUC/wHUAdEC/wG5AbIC/wHGAbsC/wHYAccC/wHW
+        AcQC/wHSAb4C/wHWAcEC/wHQAboB/wGPAUEBQAH9Az4BawGjAacBqQH7AbsBsAGmAf8BsAFrAToB/wHG
+        AYgBTAH/AcYBgAFHAf8BxgFvAUIB/wHEAWsBPAH/AcQBZQE3Af8BxAFgATMB/wHCAVsBLQH/AcIBVQEn
+        Af8BwgFRASQB/wHBAUkBGwH/AZkBPwEeAf8B0gHUAdYB/wNlAfABPgI9AWoBuQGFAYQB/gH/AewB6wL/
+        AecB6AL/Au4C/wL3Af8B/gL4Af8B/ALzAf8B/gL1Av8B7wHuAv8B6gHrAv8C5QL/AeYB4gL/AdIBzQH/
+        AXoCQQH5AzABSwQAA0IBdgEyAW4BkwH2AR0BagL/AY4BpgL/AYwBpQL/AYwBmgH9Af8BbAGIAfwB/wFD
+        AV8B/QH/ASIBSAL/AQABKgL/AQABWgHyAf8BUgGkAbwB/wHDAYQBSAH/AcsBbgEzAf8DVgHBAWsCYgHp
+        Af8B7wHpAv8B5AHcAv8B0gHLAv8B2QHSAv8BywHKAf8B/QGqAa8B/wH+AcABwwH/Af0BrgG0Af8B/gGv
+        AasC/wHWAcMC/wHTAb8C/wHQAbwC/wHaAcMB/wHMAYYBbgH/A1MBrQGfAaUBpwH7Ab0BrwGhAf8B5gGi
+        AWEC/wG8AYcC/wGuAW8C/wGlAWYC/wGcAV0C/wGUAVYB/wH+AYwBTQH/Af0BhQFEAf8B/QFyAT0B/wH8
+        AWsBNgL/AWMBKwH/AcABTAEfAf8BzALQAf8CZQFmAfABVgJUAasB8AHJAcgC/wL6Av8B/AH9Af8B/gL6
+        Af8B9AHlAeYB/wHmAb4BvQH/Ad0BmAGTAf8B7wHSAdAG/wH0AfUC/wHwAe8C/wH0AfUB/wHwArwB/wNb
+        AeEDDwEUBAABWAJbAcsBWwJgAdYBQgFuAYoB9QEkAYkBygH/ARIBlQHpAf8BUAGKAf4B/wFkAXEB/AH/
+        ARcBiwH5Af8BOAGmAeAB/wEnAYsBzgH/AR8BgAHFAf8BKAGmAdoB/wGvAYcBWwH/Ad8BlwFKAf8BZwFf
+        AVcB6AGeAW4BagH5Af8B9wHuAv8B6wHiAv8B6QHeAv8B2AHNAv8BqQGqAf8B4gG2AboB/wGnAmkB/QG4
+        AZUBlgH+Af0BrgGzAv8BwQG1Av8B1gHCAv8BzwG7Av8B2QHCAf8B3wGeAY4B/wNXAcIBoQGlAacB+wG9
+        Aa8BowH/AeEBoAFhAv8BuQGHAf8B+QGsAXAB/wH4AaQBaAH/AfgBnQFgAf8B9gGWAVkB/wH2AY4BUQH/
+        AfUBiAFLAf8B9AGBAUQB/wHzAXEBPQH/Af0BagE0Af8BvQFRAScB/wHNAtAB/wJlAWYB8AFkAl8B4wH8
+        AecB5gH/AfoB6AHlAf8B5gHBAbwB/wHSAZkBlgH/AcgBdAFyAf8BygFwAW4B/wHPAW8BagH/AdMBgwFx
+        Af8B8gHdAdoG/wL4Av8C/gH/AdIBkQGQAf8DUwGwEAACXQFaAcoBhAEsAQAB/wFJAU8BSQH/ASQBiwL/
+        ATUBYAL/AUkBmAHIAf8B7wGcAUgB/wGGATQBAAH/AXQBLgEAAf8BlAE8AQcB/wHbAYwBNwH/AdcBlQFJ
+        Af8BgAFkAUwB8wGjAX8BdgH7Af8B9QHtAv8B6AHfAv8B6gHfAv8B2AHOAv8BswG2Af8B0gGyAbMB/wFV
+        AjYB9wGnAmkC/QHAAcUC/wG4Aa4C/wHXAcEC/wHPAbsC/wHYAcIB/wHiAaIBkgH/A1cBwgGhAaUBqQH7
+        AbwBrwGjAf8B4gGjAWUC/wG9AYsB/wH6AbEBgAH/AfkBqQFsAf8B+QGiAWUB/wH4AZsBXgH/AfcBlAFX
+        Af8B9gGOAVEB/wH2AYgBSgH/AfUBggFDAf8B/QFzAT0B/wG+AVgBLAH/Ac0C0AH/AmUBZgHwAZYBbgFt
+        AfcB3QGfAZwB/wGyAVYBVAH/AaMBQgFBAf8BpgFHAUYB/wGwAVUBVAH/AbgBYAFfAf8BvwFpAWgB/wHA
+        AWMBYAH/Ac4BcwFsAf8B9wHfAdkG/wH1AfMB/wGjAUwBSgH9Az0BahAAAlkBVwG/AZ4BUAESAf8BvgGH
+        AUUB/wEiAYUB8wH/AQMBUwH9Af8BUAFZAVoB/wGLAUIBDwH/AWoBNAEGAf8BYAEoAQAB/wFhASYBAAH/
+        AYABNwECAf8BjQFGAQ8B/wFpAVkBVwHrAYcCaAH1Af8B9AHtAv8B6gHhAv8B5wHcAv8B4wHbAv8BsAGy
+        Af8B7gGyAbYB/wHSAbIBswH/AeIBtwG5Af8B/QGoAa0C/wHLAcQC/wHUAcMC/wHPAboC/wHbAcQB/wHb
+        AZcBigH/A1UBsQGhAaUBqQH7AbsBrgGiAf8B4wGmAWgC/wHCAZAB/wH7AbUBhAH/AfoBrgFyAf8B+QGn
+        AWoB/wH4AaEBZAH/AfgBmgFdAf8B9wGVAVgB/wH2AY4BUQH/AfYBiQFLAf8B/gGGAUUB/wG/AVwBMQH/
+        Ac0CzgH/AmUBZgHwA1cBugHhAbMBtQH/AeEBoQGlAf8BzgGHAYgB/wG9AWcBaQH/Aa0CVgH/AaUCSwH/
+        AaQCSQH/AakBUAFPAf8BqgFLAUoB/wHJAW4BagH/Af0B7AHqAv8B4QHcAf8BZAFRAU8B8QMcASgQAAJJ
+        AUgBiAHPAYgBNgL/AcYBdAH/AVMBpQHpAf8BBwGDAfQB/wGuAZwBkQH/Ab0BoAGDAf8BvQGkAYoB/wG1
+        AZgBcQH/AZ0BbAFHAf8BYQEtAQEB/wGEATkBAgH/AVsCWQHEAV4CWgHYAfgB5AHeAv8B8AHmAv8B4wHc
+        Av8B5QHhAv8B1wHVAv8BrwGyAv8BsgG3Av8BrQGxAv8BygHMAv8B5QHkAv8B2AHTAv8BygG8Av8B0QG8
+        Af8BqAF0AWoB/gNCAXYBogGmAaoB+wG7Aa4BogH/AeMBqwFsAv8BxwGVAf8B+wG6AYkB/wH7AbUBgwH/
+        AfoBrgFxAf8B+QGoAWsB/wH5AaABZAH/AfgBnAFfAf8B9wGVAVgB/wH2AZEBUwH/Af4BjwFOAf8BvgFh
+        ATcB/wHMAc4BzQH/AWUCZgHwAxgBIQF0AmoB7AH/AeYB6QL/AdQB1wH/Af0BygHNAf8B9QG9AcAB/wHl
+        AacBqgH/AdIBjgGPAf8BvwJrAf8BsAFZAVoB/wGhAT8BQAH/AdABigGIAf8B6QGjAZ0B/wNZAcwUAAMc
+        ASgBpAF1AUoB+gH3AdMBrQH/AbMBzgHvAf8BZQGxAfcB/wH+AfMB5wH/AegB0QG6Af8B6QHQAbcB/wHr
+        AdEBuAH/AeYBzAG0Af8B1wG0AY4B/wGnAXIBMwH+AzsBZAFJAkgBhwHdAawBpgL/AfkB8gL/AeUB4gL/
+        AeMB4AL/AeYB4gL/AeMB3wL/AdQB0gL/AdsB2QL/AesB6gL/AegB5wL/AuYC/wHjAd8B/wH9AbcBqwH/
+        AWMBWAFXAesDFAEbAaIBpgGqAfsBuwGuAaIB/wHjAbABcAL/AcwBmwH/AfwBvwGOAf8B+wG6AYgB/wH6
+        AbMBgQH/AfoBrQFwAf8B+QGmAWoB/wH4AaMBZQH/AfgBnQFfAf8B9wGZAVsB/wH+AZcBVwH/Ab4BZwE7
+        Af8BywHNAcwB/wFlAmYB8AQAAzsBZQG+AbABsQH9Af8B7QHvAv8B3AHeAv8B2gHdAv8B2AHcAv8B1QHY
+        Av8BzQHQAf8B+wHDAccB/wHuAbsBvwH/AeABnAGdAf8BiQJHAfkDPAFoGAADRAF6AfIBxgGbAf8B/QHq
+        AdgC/wHuAeEB/wH+AfsB8wH/AfcB5AHTAf8B8wHYAcEB/wHzAdwBxQH/AfgB5wHTAf8B+AHFAZMB/wNR
+        AaADEAEWAw8BFAFkAlsB4QHzAd0B1wL/Af0B+gL/AesB6AL/AekB5QL/AesB5gL/AewB5wL/AeYB4wL/
+        AeoB6QL/Ae4B7QL/AfcB9gL/Af4B/QH/AbQBYgFfAf0DQwF3BAABogGlAaoB+wG7Aa4BoAH/AegBuQGE
+        Av8B2AGnAv8BywGaAv8BxQGUAv8BvgGMAv8BuQGHAv8BswGBAv8BrgFxAf8B/gGoAWsB/wH+AaQBZwL/
+        AaQBYwH/AcIBbgFBAf8BywHMAcsB/wFlAmYB8AgAA1gBvAHzAugC/wH3AfkC/wHnAeoC/wHjAeYC/wHk
+        AecC/wHtAfAC/wHkAeYB/wG5AaEBogH9AVwCWQHJAy8BSiAAAkcBRgGAAawBmQGFAfgB/gH1AeoC/wH9
+        AfgC/wH8AfgB/wH+AfgB8QH/Af4B9QHpAf8BwgGsAYAB/ANQAZ0DDQESAwMBBAQAAykBPwF3Al0B8AHz
+        AeIB3wb/AfkB9wL/AfQB7wL/AfIB7QL/Ae0B6QL/AfQB8gb/AvgB/wG9AYEBgAH+A1EBoggAAaMBpwGr
+        AfsBswGnAZoB/wHMAZwBWAH/AeYBuQGCAf8B5QGuAW0B/wHlAagBaAH/AeQBowFjAf8B5AGeAV4B/wHj
+        AZoBWgH/AeIBlgFVAf8B4gGSAVEB/wHhAY4BTQH/AeQBjgFKAf8BqQFdATAB/wLJAcoB/wNmAfAIAAMW
+        AR8BdAJqAesM/wH+AfYB9wH/AcIBngGfAf4BXQJaAdMBMQIwAU0sAAMqAUECVgFVAbQBgQF2AWoB8AHs
+        AckBrgH/AYsBfQFyAfICWgFXAb0BNQI0AVUDBwEJAwEBAgwAAyoBQQFkAl0B4gHdAa8BrgH/AfcB6QHo
+        Av8B/QH4A/8B+wL/AfgB8wL/AfAB7QH/AewCygH/AYsCbQH3A0sBjgwAAboCuwH9AdsB2AHWAf8BtAGk
+        AZUB/wG7AaoBmQH/AboBqgGaAf8BugGpAZoB/wG6AagBmgH/AbkBqAGZAf8BuQGoAZoB/wG5AacBmAH/
+        AbkBqAGZAf8BuAGnAZgB/wG4AaQBlgH/AbIBpQGaAf8C7QHuAf8DawHzDAADQAFuAb4CtQH9BP8BxAKr
+        Af4BXQJZAdcDNwFaaAADEAEWAUkCSAGIAWACWwHWAYcCZQH0AaMBeQFwAfsBngJqAfkBaQJfAegBVgJV
+        AbEDKgFBEAADZwHlA6sB+wGiAaQBpgH6AaIBpAGmAfoBogGkAaYB+gGiAaQBpgH6AaIBpAGmAfoBogGk
+        AaYB+gGiAaQBpgH6AaIBpAGmAfoBogGkAaYB+gGiAaQBpgH6AaEBpAGlAfoBogGkAaYB+gOzAfwDXAHJ
+        DAADAQECA1cBuANlAeUBPQI8AWgDAwEENAADCAELAlMBVQGwAkwBjAHzAjsBjAHzAlMBVQGwAwgBC6gA
+        AxABFgM6AWEDVQG0A0sBjgMDAQQgAAMEAQYDAgEDBAADAQECA1ABnQI4Av8CAAH0Af8DUAGdAwEBAgQA
+        AwIBAwMEAQYkAAM9AWkDXQHXA1IBoWAAAwkBDAM3AVoDVAGrAV0CXAHqAasCqAH9AeUC4QH/AYICfwH+
+        A1UBsQMNARIYAAMlATcDSAGEDAADQgF0AikB8AH/AgABzQH/A0IBdAwAAkcBSAGDAyYBOBwAAwMBBANe
+        AdkBuQK0Af8DXgHVAwEBAhgAAw0BEgMeASsDAwEEAxYBHgJYAVkB3QFQAVMBXAHqA0IBdAMRARcDHAEo
+        AzcBWgNEAXsDKAE9DAADKQE+A1QBrgFfAlwB6gKoAacB/QHdAtcB/wH5AfcB+AH/Af4D/wH6Af4G/wGv
+        AqgB/wNZAc8DGQEjEAADDAEQAlEBUgGnAzsBZAMkATUDAAEBBAADOQFfAgcBxwH/AgABqwH/AzkBXwcA
+        AQEDJAE1AzsBYwJRAVIBpwMMARAYAANVAbIBogKbAf8BvQK4Af8DSwGOAwABARgAA1cBvQFBAUwBXQHw
+        A0cBggMgAS4BNwFIAWUB9AEAAYgB9AH/AQABTQGmAf8DWQHMAV8CVwHoAZkBUQFQAf8BtAJhAf8BWQJL
+        AfIDOAFeCAABfwJ0AfUB3wLTAf8B+gHxAfIF/wH4AfYB+AH/AfcB9QH2Af8B8wHoAeAB/wHxAcsBqgH/
+        AfEB2wHFBf8BxwLCAf8BWwJaAeIDLQFGDAADPgFrA0QBegNEAXkDQgF0AwABAQQAAzABSwIWAY4B+wIW
+        AYIB+wMwAUsHAAEBA0IBdQNEAXkDRAF6Az4BaxQAAy0BRQF4AnYB+gHHAsEB/wFoAmcB5gMNARIcAAE+
+        AUgBZAH0AQABjAH8Af8BAAFRAawB/wNYAcYBWwJUAekBhQGBAZUB/wErAb0B/QH/AQABnwHgAf8BnQGS
+        AbEC/wG7AbcB/wH+AasBqgH/AcsBXgFgAf8BYAJBAfkDMAFNBAAB4QLTBf8B/gH9AfsC/wH7AfMB/wH+
+        AfYB5gH/AfsB5AHAAf8B/AHMAZAC/wG0AVQB/wH3AaIBRgH/AeoBxQGrAf8B/QP/AtUB2AH/A1MB8QM6
+        AWIIAANQAZ0DNQFWA0oBjAM0AVQDPwFtBAADFQEdAlQBYQHkAlQBYQHkAxUBHQQAAz8BbQM1AVUDSgGM
+        AzUBVQJPAVEBnA8AAQEDOwFkAWkCZwHuAbsCtAH/AboCtQH/AzoBYgQAAwMBBANMAY8DQwF3AxsBJgwA
+        AzABTQJUAWEB7gErAbUB9gH/AQABlQHiAf8BbwGDAacC/wG7Aa8B/wHkAcoBxwH/AWAB1QHvAf8BiwGu
+        AcoB/wH+AaoBpwH/AfACjgH/AewBhAGIAf8BzAFjAWYB/wNbAdkEAANWAasBpgKiAfoB+wH6AeoD/wHe
+        Av8B9wHLAv8B4QGnAv8ByQGEAv8BtAFXAf8B9wGcATwB/wHmAYMBLwH/Ad4BpQGHAf8B9gH3AfoB/wHl
+        AeYB6QH/AV8CWAH5A0oBigMEAQYDSgGKAz4BagNCAXYDSwGOAzIBUAQAAyUBNwJRAWAB6wJRAWAB6wMl
+        ATcEAAMxAU8DTAGPA0IBdgM+AWoCSAFJAYgIAAMNAREDWwHDAZwClgH/Ab0CtwH/AcYCvwH/A1oBvQME
+        AQYDSgGLA1oBxQG3ArEB/wG/ArgB/wM/AW0MAAMUARwBYQJbAeEB9gHXAdMB/wFiAeEB+QH/AVwBxQHn
+        Af8B9QHHAcUC/wHDAbsC/wGyAa4B/wH+Aa4BrQH/AfsBsQG0Af8B7wGrAaQB/wHfAZABigH/AegBgwGE
+        Af8BjwFKAUsB/wgAAykBPwNcAc8ByQG9AbIB/gH/AewBywL/AdoBnQL/AcEBagH/Af0BrQFOAf8B8gGZ
+        AUEB/wHkAYMBNAH/AdQBWwEdAf8B0AGAAVYB/wHrAd8B3gH/AukB6wH/AWECVgH9A0sBkAJEAUUBfAM9
+        AWcDPQFnA08BlwMSARkDCgENAlcBWQHCAgAB0wH/AgABoQH/AlcBWQHCAwoBDQMSARkDTgGWAz0BZwM+
+        AWoDQgF0BAADBAEFA1QBrAGwAqcB/wHEArwB/wHAArgB/wG4ArIB/wNbAcMDXgHQAakCpAH/AcgCwgH/
+        AckCwgH/AWICYAHjAxQBHAwAAxwBKAGKAW4BcAH+Af8B5AHeAf8B/gHXAdAB/wH4AcYBxAL/AcEBwwL/
+        AccBygL/AdIB0wL/At4C/wHjAeIC/wHcAdcB/wHxAbYBrgH/AcUBbwFoAf8DXwHgEAADPgFqAWcCZQHl
+        AeIBxgGyAv8BvwFzAv8BpQFBAf8B7gGRATkB/wHgAXMBMwH/AdMBXAEkAf8BwwE6AQkB/wG8AUMBJgH/
+        AeEBvQG5Af8B3wHUAdYB/wNbAdADRAF7Az0BZwM9AWcDTwGXAxIBGAMOARMCVAFkAeQBGQErAv8CAAH0
+        Af8CVAFhAeQDDgETAxEBFwNOAZYDPQFnAj0BPgFqA0IBdAQAAzMBUgGmAp0B/wHDArcB/wHJAsYB/wPT
+        Af8B1wLVAf8BoQKWAf8BvAK1Af8ByQHCAcEB/wGOAosB+QNNAZEDEgEYEAADBAEGAUoCSQGJAZYBiQGK
+        AfsB9gLVAv8B7gHtAv8B/QH8Bv8B/AH5Av8B8AHtAv8B4AHbAf8B8wHIAcIB/wHTAaEBnAH/AYUBWwFY
+        Af8DOAFcFAADBAEGA0wBkwF/AXkBeAH0Ae0BrwGKAf8B8AGNAUEB/wHeAWoBLQH/AdABXwE0Af8BxAFc
+        AT8B/wG3AVUBQwH/AbwBhQF0Af8BuAGoAaoB/wNVAbQDSgGKAz0BaQNCAXYDTAGPAywBQwQAAzsBZQFB
+        AUcBggHzAjsBgAHzAzsBZQQAAysBQgNMAY8DQgF2Aj0BPgFqAkkBSgGJBAADVgGzAb0CsgH/AbsCsgH/
+        AcgCxgH/AeIC4wH/AeAC3QH/AagCngH/AZcCkwH7A1QBpgMaASUfAAEBAzEBTgNWAbMBcAFuAWwB7AHJ
+        AbcBsQH/AdEBvAG3Af8BzQG1Aa8B/wGbAZEBjwH7A10B0gFqAmcB8gHWAcoByQH/AbUBsQGyAf8DOQFf
+        HAADGgElA1sBxgHFAZ8BlAH/AcsBnAGNAf8BvAGfAZ0B/wG2AaQBpQH/AbYBqQGrAf8BtgGmAacB/wFf
+        AlIB9AMlATcCTwFRAZwDNQFVA0oBiwMyAVADUgGjAxEBFwQAAxYBHgMWAR4EAAMRARcDUgGkAzIBUQNK
+        AYsDNQFWA1ABnQQAAV8CXgHfAbkBrgGsAf8BiAFvAXAB/wGlApsB/wHsAusB/wG4Aq4B/wGpAZ4BmgH/
+        AUIBWQFzAfUDQgF0AzMBUwI8AT0BaAMjATQDMwFTGAADAQECAxYBHwMiATIDKAE8AyYBOQMmATkDIwEz
+        A2AB3gT/AcoCwwH/AzYBWSAAA1kBxwG5Aa0BsAH/Ab0BsgG2Af8BugGuAbAB/wG7AqwB/wHIArYB/wN/
+        Af4DQgF2BAADPgFrA0QBeQNDAXgDQgFzAzkBXwNSAaMDLgFHAxEBFwMRARcDLgFHA1EBogM6AWADQgFz
+        A0QBeQNEAXoDPgFrBAADFgEfA1wBzwGLAW8BbQH/AbMCpgH/AbsCswH/Ab4BtQG0Af8BxAGuAasB/wEW
+        AasByQH/AQABywH8Af8BAAGsAewB/wEAAbMB8AH/AQABlAHdAf8BAAGeAecB/wNOAZkMAAMCAQMDFQEd
+        AxYBHwMWAR4DGwEmAyMBNAM1AVcDTwGXA14B1wHWAtQB/gHqAuUB/wNbAcYDDgETHAADVAGrAcICswH/
+        AdACwwH/AckCvAH/AcgCvAH/AdECxAH/AboCrQH/A1cBvQgAAwwBEAJSAVQBpgM0AVQCRwFIAYMDRAF6
+        AzQBVANMAY8DTwGXA08BlwNMAY8DNAFUA0QBegJHAUgBgwI0ATUBVQJRAVIBpwMMARAIAANQAZ0BowGd
+        AZkB/wGkAZIBkAH/AaYBkwGSAf8BtAGrAakB/wE8AbABvQH/ARQB0wHvAf8BFwHWAfMB/wEWAdUB9AH/
+        ARcB0QHzAf8BGAHVAfYB/wESAbIB5AH/AlMBVAGsDAADCgENA1cBuAFpAWMBZAHqAXICZwHuAbYBpAGi
+        Af0B0gG4AbYB/wHgAcsBygH/Ae0B2QHaAf8B4gLWAf8BbAJqAekDTgGWAxYBHhwAA0IBdgGoApsB/gHf
+        AtYB/wHUAssB/wHUAssB/wHaAtEB/wHaAs8B/wFiAlkB7AMSARkMAAMjATMDUgGpAjQBNQFVA0MBdwNK
+        AYsDQgF2Az0BZwM9AWgDQgF2A0oBiwNDAXcDNQFWA1IBqQMiATIMAANQAZoBbwGjAbYB/wGbAa0BsAH/
+        AZIBwgHDAf8BgQHiAeMB/wErAYMBuQH8A0ABcQM7AWQDOgFiAzoBYQM6AWEDMgFQFAADQwF4AXYCZgHv
+        AYMBbwFwAfEBbQJmAecDYQHaA1sBxANOAZUDOgFgAx0BKgMBAQIcAAMpAT4BiwKIAfkB8ALsAf8B4wLf
+        Af8B5QLhAf8B6QLmAf8B8gLtAf8BiQJ/AfsDNgFZFAADIwE0AlEBUgGnA0QBewM1AVYDPQFpAjwBPQFn
+        AjwBPQFnAj0BPgFqAzUBVwNEAXsCUQFSAacDIwE0EAADHAEnAkcBSAGDAVoCXQHKAVgBaAF1Ae8BWgJd
+        AcoDSAGGbAADIQEwAWoCZgHsBP8D+AH/AfQC8wH/AewC6gH/AekC5gH/Ab8CtwH/A08BnBwAAw8BFAM+
+        AWsDUAGdA0oBigNEAXsDRAF7AkkBSgGJAk8BUQGcAj0BPgFqAw8BFJgAA0ABcQGcApQB+QGBAn0B8gFp
+        AmgB5gNgAdYDWAHBA1QBrgNGAX8DAwEEMAADEQEXA0gBiANXAb8DVgHBA0wBkwMbASbYAAMGAQgDMQFP
+        A0IBdgNIAYcCVwFcAd8BAQECAbIB/wIIAcsB/wIJAcoB/wIWAZgB/wJaAVsB3AMoATxYAAMHAQoDRAF6
+        A1IBqQNFAX0DJgE4AwoBDhQAAz8BbgNWAcEDVwG/A1YBvgNWAb4DVgG+A1YBvgNWAb4DVgG+A1YBvgNW
+        Ab4DVgG+A1YBvgNYAcADVgG+AzkBXwwAAz4BawFcAlcB3wGTAVIBPwH6AbYBfQE9Af4BVAE0AW8B/gED
+        AQgB1AH/ASgBKQHvAf8BLAEtAfcB/wFGAUUC/wFXAVAC/wEzATIBwAH/A1wBzgMKAQ4BXQJZAdcBgwFk
+        AVIB9wF1AWIBWwH2AXUBYgFeAfYBdwFiAVsB9gF3AWIBWQH2AXcBYgFaAfYBeQFiAVgB9gF5AWIBSQH2
+        AXsBYgFJAfYBewFiAUkB9gF7AWIBSQH2AXsBYgFJAfYBewFiAUkB9gGHAWUBUQH3AV4BWwFaAdkUAAFV
+        AlMBsAHlAaYBSgH/Ae4ByAGXAf8BpQF/AVsB/gFtAVIBPQH3A1cB3wNUAasDPgFrAyMBMwMEAQYEAAF5
+        Am0B9gHZAtMB/wHJArgB/wG4Ap8B/wG8AqIB/wHEAqkB/wG+AqQB/wG8AqoB/wHJAsEB/wHSAswB/wHH
+        Ar0B/wHFArAB/wHeAsAB/wHkAsUB/wHCApMB/wNXAcUEAAMDAQQDUwGqAbgBnAFdAf0B/wHWAaoC/wHZ
+        AZwB/wHbAbMBmgH/AR4BGAG+Af8BGwEdAekB/wItAfcB/wJKAv8BTQFRAfMB/wEzAUQB4AH/ATkBMQHs
+        Af8CWAFeAeUDDwEUAXICWQHyAd8B2wHfAf8B5wHgAeIB/wHhAbcBqgH/AeYBtAGSAf8B6gG5AZAB/wHd
+        AbEBnQH/AdkByAHGAf8B2gHVAdoB/wHaAdIB1QH/AdsB1AHXAf8B2wHUAdgB/wHcAdUB2AH/AeEB3AHf
+        Af8B3AHbAeEB/wF3AWQBUwHxBAADFgEfA1oBygNZAcQDSgGKAcgBqwFjAf0BuAG/AWwB/wG+AcQBnQL/
+        Ae8B0AL/AewByQH/AfYB1wGtAf8B3AG0AYYB/wGoAYABSgH9AWQBSQE3AfYBXwFbAVoB4ANOAZgBtAKo
+        Af0B+gP/AeIC2gH/Ac0CugH/AdQCvgH/AdACvAH/AdICygH/AfgC9w3/AfEC7QH/AeAC1AH/AfkC2gH/
+        AeMCsQH/A1gBywQAA1ABnQHnAa0BcAL/Ae4BxAL/Ad8BtQL/AegBrAH/AasBlwGgAf8CAAHFAf8BEQET
+        AfMB/wJEAv8BWwFMAfsB/wE/AUsB7AH/ARwBuQHpAf8BGAFSAcAB/wNWAb4EAAFqAWEBXAHuAe0B7AHv
+        Af8B/gHDAZ8B/wH+AakBSQH/AdgBlwFoAf8BvQGCAWsC/wGtAVQB/wHpAZwBWQH/AbwBoAGdAf8BwwGz
+        AbQB/wHIArcB/wHMArwB/wHQAsEB/wHdAdAB0QH/AewB6gHtAf8BbwFhAVUB7gQAA0gBhAFlAe8BkQH/
+        AVABvwFkAf8BPAFyAR0B/wFhAb0BUgH/ATIBxgFBAf8BOAGXASgB/wHpAccBowL/AeUBxAL/AeoBzAL/
+        AfIB2QL/AfUB3QL/AewB0AH/AfoB1QGpAf8BYgFVAVMB6gGdAokB/AHvAvIB/wHYAs8B/wHFArEB/wHI
+        ArIB/wHAArMB/wHlAt8B/wH6AvcB/wH2AvUB/wHvAfAB8QH/AfIC8AH/AfcC8gH/Ad4C2QH/AdgCwQH/
+        AdoCqgH/A1sByAMvAUoBoAFxAU0B+gH/AccBkQL/AdMBnwL/AccBjgL/AdIBhwH/Ab0BlwGCAf8CAAHG
+        Af8BIgEgAv8BYQFnAfoB/wE6AWYB3QH/AT8BOgHeAf8BLgGDAfwB/wEAAbIB7wH/AUsBVQFeAe0DNgFZ
+        AWoCYQLuAd8B4AL/AbYBcgL/AdoBjAH/AZsBjAHEAf8BQQE8AdAB/wH3Ac4BjwH/AfwBsQFcAf8B5QG+
+        Aa4B/wLrAe8B/wHsAuUB/wHsAuYB/wHtAucB/wHyAu0B/wHuAe0B7gH/AW8BYQFYAe4EAAM6AWEBlgHZ
+        AacB/gHuAf8B8gH/AaUB+AG5Af8BoAHxAbEB/wGoAf8BwAH/AWUBvwFjAf8B8gHZAbkC/wHnAcoC/wHo
+        AcwB/wH9AegBzwH/Af0B6QHTAv8B+AHqAf8B9QHdAcIB/wNTAa0BnQKIAfwB8ALzAf8B2QLQAf8ByAKz
+        Af8BwAKtAf8BzALBAf8B7gLlAf8B6ALmAf8B1ALSAf8BywLHAf8BygHJAcgB/wHkAuAB/wHuAuYB/wHW
+        AskB/wHRAqMB/wNbAcgBWgJYAcABzgFyATMB/wHRAYwBRgH/AfwBwwF0Av8BvQFpAv8BvAFfAf8B7QGw
+        AVQB/wE0ASEBpQH/AjsC/wFoAW8B/gH/ASABwQH3Af8BEwGKAeMB/wFUASQBkAH/AVMBhAGnAf8BAAGI
+        AegB/wNQAZ0BagJhAe4B8gHpAegB/wH8AcsBqAL/AfEByAH/AbEBrwHjAf8BbAFqAeMB/wH7AfABzgH/
+        AfUBwgGYAf8BxgGgAZQB/wHDAbcBuQH/AcoCuAH/Ac4CvgH/AdACwAH/AdsC0AH/AfAB7wHyAf8BcgFh
+        AV0B7gQAA1ABngGMAegBpQH/AeEB/wHjAf8BugH/AcEB/wFyAf8BggH/AXEB8gGRAf8BWAGjAU4B/wHt
+        AdcBwQL/Ae8B1wH/AfsB6gHVAf8B+wHsAdsB/wH6Ae4B4AL/Af4B8QH/AZUBgAFfAfsDKgFBAZ0ChwH8
+        AfAC8wH/AdkC0AH/AccCsgH/Ab0CrAH/AdMCxwH/AeoC4gH/AeMB4QHgAf8BkQGNAYwB/wEtASsBKgH/
+        AaABnQGbAf8B2QHXAdYB/wHsAuUB/wHaAtAB/wHJAp8B/wNbAcgBdQFjAVQB7QGqAVcBHAH/AZcBPgED
+        Af8BwwFuASsB/wH5AbEBUgL/AbEBUwL/AbwBUAH/AbUBcAFLAf8BRQE7Aa8B/wFbAVkB7gH/AUgBaAHd
+        Af8BBwG1Ae8B/wFCAZUBswH/AbgBZwFRAf8CWgFeAdkDIQEwAWoCYQHuAfYB9QH2Af8B/QHiAdQC/wHk
+        AckB/wGjAZ4BwwH/AV0BWgGoAf8B/QHeAcMB/wH3AdUBxAH/Ad4B0wHRAf8B3gLWAf8B4gLYAf8B5ALa
+        Af8B5ALcAf8B6wHlAeYB/wH0AfUB+AH/AXICYQHuAzsBZAFfAb8BfwH+AdoB/gHlAf8B2AH/AdwB/wGs
+        Af8BuAH/AYkB/QGTAf8BnAH6Aa0B/wE8AcABVQH/AWABjAFEAf8B+AHnAdoB/wH9AfIB5AH/AfkB7wHj
+        Af8B/AH4AfAB/wH8Ae0B3AH/AV0CWQHSAwEBAgGbAocB/AHwAvMB/wHZAtAB/wHHArIB/wG+Aq4B/wHV
+        AsgB/wHoAuEB/wHoAeUB5AH/AVsBVgFVAf8DAAH/AYECcAH/AeAC3QH/AeoC4gH/AdsC0gH/AcYCnwH/
+        A1sByAGYAW4BPgH4AY0BQgELAf8BbwErAQAB/wGbAUkBDQH/AfEBrQFXAv8BxAFyAv8BzgGHAf8B1AGQ
+        ATgB/wFnASwBDAH/AVEBKgE5Af8BkgFFAS8B/wGiAZoBiQH/AS8BrAH5Af8BngGDAYAB/wNQAZ0EAAFr
+        AmEB7gH5AfgB+QP/AfsB/wHEAckBygH/AUwBigGyAf8BLwFnAZ8B/wGCAZkBpwH/AewB3QHYAf8B3wLV
+        Af8B3ALSAf8B3wLWAf8B4QLXAf8B4gLZAf8B6gLjAf8B+AH5AfsB/wFyAmEB7gEwAjEBTQFqAawBhgH5
+        AdAB+AHTAf8ByAH9AdUB/wHjAf8B7wH/Ab8B/gHPAf8BiwHvAZIB/wFgAeMBhwH/AUcBnwE/Af8B8gHf
+        AdoB/wH9AfgB7wH/AfcB8QHtBf8BwgGhAYsB/gNCAXQEAAGbAocB/AHwAvQB/wHZAtAB/wHIArMB/wG8
+        AqwB/wHQAsUB/wHsAuQB/wHjAuAB/wGuAaUBpAH/AWcCXQH/AbUBrQGsAf8B4ALdAf8B7wLlAf8B2QLN
+        Af8BywKhAf8DWwHIAZwBagFBAfkBiQFDAQ0B/wGTAUoBDgH/AdsBngFQAf8B/QHLAYoB/wHhAawBaAH/
+        Aa8BbgE6Af8BjwFKARUB/wFsASsBAAH/AWsBKAEAAf8BhgE3AQAB/wGyAVoBEwH/AZwBYgFLAf8BrAFo
+        AUIB/wNRAaIEAAFsAmEB7gH+AvsB/wHzAfoB/QH/AZsB2AH5Af8BggG9AeIB/wFsAbIB1wH/AVgBtgHi
+        Af8BtAHKAdcB/wHKAbUBsgH/AcUCtQH/AcoCuwH/Ac4CvwH/AdECwQH/AdsC0AH/AvoB+wH/AXIBYwFh
+        Ae4DBAEGAWYBZAFcAecB1AHxAdAB/wGjAe0BtgH/AcwB/wHbAf8BkgHvAaMB/wGQAdQBjwH/AbYB1QGp
+        Af8B3wHjAdAB/wH9AfYB8wH/AfYB9AHyAf8B9wH4AfkD/wH8Af8BZwFfAVQB7gMNARIEAAGaAoYB/AHw
+        AvQB/wHZAtAB/wHHArIB/wHEArAB/wHHArwB/wHxAegB6QH/AfgB+QH7Af8B5wLlAf8B5ALeAf8B4QHe
+        Ad0B/wHyAewB7QH/AeoB5AHlAf8B1gHFAcYB/wHWAqYB/wNbAcgBdgFjAVcB6wHHAYkBOwH/AfMBtQFi
+        Av8B1AGbAf8B/gHdAbYB/wG+AZsBcAH/AZMBZAFFAf8BngFxAVEB/wGdAW4BTAH/AZABXAE0Af8BgAFC
+        ARIB/wFdASUBAAH/AXQBNAEAAf8BkQFjATQB/gNCAXQEAAFsAmEB7gL/Af4B/wHrAfUB/AH/Aa4B3AH3
+        Af8B2AH3Av8BwAHwAv8BcwHKAfMB/wG+AdgB5wH/AfUB8AHtAf8B8QLtAf8B8wLuAf8B8wLvAf8B8wLw
+        Af8B9wL0Af8B/gP/AXMBZQFhAe4DUQGiAfsB2gG8Bf8ByAHpAcwB/wGNAeUBmgH/AZAB2QGVAf8B9AHr
+        AecC/wH4Af0C/wH6AfsB/wH1AfcB9QH/AvcB+AH/Af0B/gL/Ae0B1QHIAf8DUQGnCAABmgKFAfwB8ALz
+        Af8B2ALPAf8BxAKxAf8BygK0Af8BxAKzAf8B0AHIAccB/wHQAccBwwH/A+wB/wHeAuAB/wH8AvoB/wH0
+        Ae4B7QH/AdQCzQH/Ad0CwQH/AdoCqAH/A1kByQJWAVUBtAHOAYkBOAH/AewBwQGQAv8B8AHbAv8B9QHp
+        Af8B8gHpAd8B/wHdAcoBtgH/AdkBxAGuAf8B4AHMAbgB/wHaAcYBsAH/AckBrgGUAf8BoQFrAUQB/wGx
+        AV8BIAH/AWUBVAFRAe4DGAEhBAABbAJjAe4E/wH8Af0C/wHPAecB9wH/AdUB7AH6Af8BtAHhAf0B/wGe
+        AdUB+gH/At4B4gH/AbkBoQGfAf8BuAKkAf8BvgKrAf8BwwKwAf8BxAK0Af8B0gHEAcUB/wH9Af4C/wF2
+        AWcBYQHuAYgBdwFVAfMB/wH8AfcF/wHvAdkBvwH/Ab0BxgGLAf8B5wH0AecC/wL7Af8B+AH6AfwB/wH6
+        Af0C/wH8A/8B/Qf/AZMBcwFfAfsDJgE4CAABsAKoAf0B9wL8Af8B3gLXAf8ByQK2Af8B0AK6Af8B2QHH
+        AcsB/wGmAY0BgQH/AZgBTwEeAf8BmgGWAZMB/wFoAW0BcAH/AeoC7AH/AecB3QHUAf8B5AHLAbEB/wHq
+        AccBqwH/AdMBpgGlAf8DXAHOAykBPgGQAWUBSAH2Ae4B0QGwAf8B+AHuAeIB/wH9AfMB6QP/AfwB/wH5
+        AfAB5wH/Ae8B1gG+Af8B8AHWAb4B/wHvAdYBvgH/AfEB3QHJAf8B+gHYAbIB/wHVAYYBPgH/A04BlAgA
+        AXkCagHyCP8B+wP/Ad8B8gL/AdMB7QL/Ae8B+wP/Av4B/wHtAukB/wHuAusB/wHwAu0B/wHxAe4B7wH/
+        AfIB7wHwAf8B9QH0AfUF/wF+AW8BZwHxAkABPwFuAl0BWgHTAa8BlgGHAfkB7wHUAbYB/wHzAcwBrAH/
+        AfMB1AG4Af8B7QHLAawB/wHsAcsBrwH/AfQB3gHKAf8B9QHiAdUB/wH3Ae0B5gH/AfcB5QHZAf8DWwHQ
+        AwEBAggAAYgCggH3AeUC3wH/AdQCxwH/AcYCtAH/AcwCuAH/AdgBwgHEAf8BvQGmAaIB/wGfAYEBZwH/
+        Aa0BoQGgAf8BqwGjAaQB/wHLAb8BwAH/AdMBwgHBAf8B4gHPAcYB/wHhAcgBugH/AckBpQGkAf8DUQGn
+        BAADRAF6AcMBpQFaAf0B/AHsAdcB/wH6AfIB5wH/AfsB8wHrAf8B/AH0AesB/wH3AeUB1AH/AfcB5AHS
+        Af8B+QHuAeAC/wHzAdsB/wHyAbEBcQH/AVsCWQHEAwQBBggAAWACXAHUAYYCbQH3AXkBaAFlAfYBewFo
+        AWQB9gF7AWgBYgH2AX0BaAFiAfYBfQFoAWIB9gF9AWgBYgH2AX0BawFiAfYBgQFrAWIB9gGBAWsBYgH2
+        AYEBawFiAfYBgQFrAWIB9gGBAWsBYgH2AYwBbgFtAfcBXgJaAdgIAAMlATcCTwFOAZcBZgFjAV8B4AHB
+        Aa4BmgH9AfMB3AHDAf8B/AHrAcoB/wGqAX8BZgH+A1UBsgJTAVIBqAFbAlkBxAMtAUUMAAE9AjwBZwFS
+        AlEBoQNdAdcBewJsAfoBZAJZAewBVgJUAasDUAGdAVIBUQFSAaEDUgGhA1IBoQFSAlEBoQNSAaEDUgGh
+        A1IBpANMAZMDGAEhCAACRwFGAYABkwF1AWIB9gH3AeIBzAL/Af0B9wf/Af0D/wH6Av8B7gHXAf8BtgF+
+        AWoB/ANWAbYDDAEQXAADBwEKAzABSwJWAVUBtAGHAW0BZQH0A1UBtWgAAygBPAJWAVUBtAFuAWMBXQHp
+        AaoBjAF9AfkBrQGTAXgB+gF8AWkBXQHwAVwCWQHJAzoBYf8AGQADHwEsA0sBjwNVAbQDVwG/A1gBwANX
+        Ab0DVAGuA0EBcwMNARJgAAMMARADTgGUA1UBtQNVAbQDVQG0A1UBtQNWAbYDVgG2A1UBugNWAb4DQQFz
+        GAADBQEHAwEBAiwAAzIBUAFLAVgBSwHvAScBmAE7Af8BLgGwAUwB/wEyAbgBUwH/ATMBuAFTAf8BLwGz
+        AU4B/wEpAZ0BQAH/AS8BTwEwAf0DVwHFAw8BFCwAAw8BFANOAZcDRgGAAwMBBCAAA0gBhwGeAT0BQAH/
+        AbEBSgFNAf8BtQFNAVAB/wG+AVUBVwH/AccBXAFeAf8BzwFkAWUB/wHUAWgBaQH/AdkBbQFuAf8B1QFz
+        AXQB/wFeAlkB5QMGAQgQAAJTAVUBrQEaAXMB0gH/AUIBaAGJAfUDWQHHAk0BTgGWAzsBZQNKAY0BmgFt
+        AVEB9wFfAV0BWQHXAVYCVQG0AU0CTAGRAUACPwFuAyUBNwQAAVwBXwFbAeABPQHVAWgB/wFKAeUBiAH/
+        AVUB4QGNAf8BWwHiAZIB/wFcAeEBkgH/AVgB4wGPAf8BTwHlAYsB/wFFAeABcgH/ASkBZwEtAf4DQAFx
+        KAADJQE3AVoCWwHhASQBkgEdAf8BLAFAAQwB/QNWAbMDEAEWHAABWwJYAcsB8AGbAZQC/wG7AaQB/wH+
+        Ab0BqQL/AbwBqAL/Ab4BqwL/AbwBqAL/AbwBqQL/Ab8BqgL/AcMBuAH/AV8CWAHjAwQBBhAAAUMBXQF5
+        AfABPAHBAf4B/wFfAckB/gH/AVgByAH+Af8BQwG3AfAB/wFeAWABagH/AfMBuAGGAv8BvwFyAv8BuQFl
+        Av8BsgFWAv8BsQFUAf8B7AGkAWIB/wNEAXkEAAE4AYABPgH8AWQB6AGcAf8BdAHeAZ8B/wGJAeEBpwH/
+        AZAB4wGsAf8BkQHjAa0B/wGNAeIBqgH/AYQB3wGiAf8BbgHsAaIB/wFDAa8BWAH/A1EBoCQAA0IBdgEz
+        AWIBOAH2AScB0AFeAf8BLAHJAToB/wErAZ4BAAH/AR8BVQEAAf8DWgHbAy0BRhQAAwEBAgFjAlgB6QH8
+        AcYBrAL/AfUB2QH/AfgB7gHZAf8B+gH0AeIB/wH7AfQB5AL/AfwB8QL/Af4B+QL/AfwB+AH/Ae0B4QHd
+        Af8DVgG+EAADCQEMAQEBYAHUAf8BTwHFAf4B/wGSAdgC/wGWAdwC/wGDAaoBvwH/AdgBnwFyAv8BzgGa
+        Av8BywGTAv8BxQGIAv8BvgFvAf8B+AGyAWQB/wFtAXABhwH/AlABUQGfBAABWAGTAV8B+wGUAeoBtAH/
+        AacB6AG8Af8BsgHsAccB/wG+AfMBzAH/AcAB9AHOAf8BtwHsAckB/wGtAeoBwAH/AZ8B8AG7Af8BWwG2
+        AW0B/wNMAZMgAAMnAToBKQF9AT4B+gEqAdcBYgH/ASkB1gFnAf8BJgG0AS4B/wEoAZgBAAH/ASsBpAEA
+        Af8BJgFrAQAB/wNaAcoUAAMjATMBkQFPAU0B+wH/AdMBtwL/AfcB3wH/AZ0BjwGCAf8BRgFCAT4B/wGO
+        AYgBjAH/AcIBsAGrAf8B6gHgAdED/wH+Af8BzQHBAcAB/wNGAYEQAAMcASgBAAFqAeIB/wFtAdAB/gH/
+        Ab4B6AL/AbgB5QH9Af8BnwGMAYQB/wH9AdkBtAL/AdYBqwL/AdMBpAL/Ac4BmwL/AcgBjgH/AckBjwFm
+        Af8BPgGvAfkB/wNSAakEAAFVAWUBVQHqAbIB8QHJAf8B0AH0Ad0B/wHmAfsB7AH/AeUB8QHrAf8B4gHv
+        AekB/wHtAfwB8AH/AdwB9gHmAf8BwAH5AdMB/wFTAZ0BWQH9AzYBWRwAAwwBEANYAcABIwG7AUgB/wEo
+        AdMBYAH/ASUBzQFfAf8BLAHAAT8B/wEpAZcBAAH/ASkBmwEAAf8BKgGYAQAB/wExAj4B+ANIAYYDAwEE
+        DAADRAF6Ab0BWgFQAv8B3gG+Av8B8QHZAf8BwgG0AaMB/wFHAU0BSAH/AYEBpwHAAf8BEAFMAacB/wJP
+        AW8B/wHvAdsByQH/AYoBegF4AfoDLQFFEAACKwEsAUMBCAGCAfAB/wGPAdkB/gH/AcIB6gL/AcEB5QH4
+        Af8B0QGnAYwC/wHeAbkC/wHcAbYC/wHZAbAC/wHVAagB/wHzAaQBZQH/AaYBqgGuAf8BQAG2Af4B/wNK
+        AY0EAANOAZkBtwHgAcAB/wH0Af8B9AH/AewB/QHWAf8BcQGHAdsB/wFdAWIB2wH/AdAB+wHFAf8B6QH/
+        AewB/wHNAfIB1AH/A1sB2QMHAQoYAAMmATgCVwFcAd8BAAEPAagB/wEYAa8BRgH/AScB1QFZAf8BRQHm
+        AYMB/wFEAesBhwH/ASwBwQFBAf8BKQGdAQAB/wEnAY0BAAH/AQMBYAGnAf8BCwE5AbAB/QNVAboDFQEd
+        CAADVQGyAdIBbAFYAv8B5QHDAf8B8AHaAcIB/wHpAdkBwgH/AbACpwH/AYwBvwHoAf8BDAGvAv8BAAFo
+        AdIB/wFiAWYBogH/AWICVgHvAxIBGRAAAzgBXgEYAZEB/AH/AZ4B3gL/AcgB6wL/AcUB4AHuAf8B5gG7
+        AZsC/wHlAcgC/wHWAbAC/wGRAUIC/wGmAV8B/wHVAWMBMQH/AZsB2wH6Af8BOwG1Af4B/wNBAXIEAAMP
+        ARQBWgFeAVoB1QGiAdIBoAH/AXEBwwG2Af8BGwFiAbkB/wEOAVABuQH/ATIBsAGVAf8BcQHTAY0B/wFd
+        AWgBXQHwAykBPhgAA0EBcwIuAW4B9gIAAfcB/wEAARIBywH/AUMBxAFUAf8BiwH7AagB/wFlAf4BnwH/
+        AUIB6gGDAf8BLQHWAWkB/wEpAcgBSQH/AScBoAEJAf8BAgFuAZwB/wEAAWgC/wEAATgBzgH/A1cB3wMw
+        AUsDAQECAWECWgHcAeMBkQFqAv8B7QHKAf8B5wHPAbYB/wHlAdABugH/AdoBxAG2Af8BSQFyAacB/wFh
+        AdkB9wH/ASABzgL/AQABmgHsAf8BGAE8AVkB/QNRAacDBgEIDAADRAF5ASkBmAL/AawB4wL/Ac8B7gL/
+        AckCzQH/AfMB2gHFAv8B8QHiAv8B6wHWAv8BrgFqAf8B2AGGAVYB/wErARsBcgH/AWcBqgHhAf8BNwGt
+        AfoB/wM4AVwIAAMZASMBRwFiAWUB9gFuAbQB3QH/Ab0B1AHfAf8BwgHXAd8B/wFaAZ4BywH/ARIBawFw
+        Af8DTQGWHAACJQGTAfgCAAL/AgAC/wIAAdkB/wFLAYsBbgH/AaYB+QGgAf8BZQH/AaAB/wE+AeYBggH/
+        AS8B1QFiAf8BKQHNAUsB/wEUAaIBRAH/AQABbgHEAf8BAAFgAv8BAAFqAv8BAAFHAeQB/wNYAcADHwEs
+        AWwBQQFAAfUB8wGtAYsB/wH7AeUBxQH/AdEBuQGkAf8BxgGyAaAB/wHtAdgBwQH/AcwBvgG5Af8BSwGL
+        AbMB/wFhAd0B8wH/ATsB8AL/AQABxQH7Af8BBgFRAX8B/gNYAcYDFQEdCAADTgGUATsBnwL/AbsB6AL/
+        AdYB8AL/Ac4BwgG2Af8B+wHwAeYC/wH2Ae0B/wH9AfEB4wH/Ae4BzQGvAf8BWAFJAZMB/wEAAQYBuwH/
+        AQABCQGtAf8BAgEVAbUB/wJXAVoBxQgAAzoBYQFTAagBvQH9AbQBzwHlAf8B5gHqAfEB/wHsAe4B9gH/
+        AbwByQHdAf8BPgGWAcwB/wNZAdIDHwEsAxIBGQMEAQYDBAEGDAACCwG8Af0CAAL/AgAC/wEWARQB/gH/
+        AgABxwH/ARUBUAFoAf8BUAHnAWIB/wFIAfoBgQH/ASoBxwFCAf8BBwGUAVQB/wEAAZsB1AH/AQABngL/
+        AQABYAL/AQABYgL/AQABXgH4Af8DWQHHAzoBYgGGATcBLwL+AcEBmQH/Ad4ByAGuAf8BxQGuAZoB/wHQ
+        Ab8BqAH/AdMBwgGtAf8B3wHNAbMB/wG4AaABmwH/ATgBXQGbAf8BWQHOAesB/wFNAf0C/wEAAd0C/wEA
+        AWABrAH/AlsBXQHaAyUBNwQAAlMBVQGwAVEBqwL/AcsB7QL/AeAB9AL/AdUBwAGtAf8B/gH7AfgC/wH7
+        AfcB/wHzAfAB7AH/AdMBzgHMAf8BTgFWAbcB/wFaAXIB8QH/ATIBSQHbAf8BMQFGAdoB/wJYAV0B0QgA
+        AVACUgGjAZ4B2QH0Af8BsgHgAfoB/wGqAdoB9gH/AZ0B1AH1Af8BlQHRAfUB/wFuAc0B9wH/AlMBYQHx
+        AV8CVwHfAWICWAHpAV4BWwFaAdkBXgJaAdgDUwGwAygBPAQAAhYBrQH7AgAC/wJDAv8CgQH+Af8BUQFO
+        Af0B/wEHAQAB3gH/AQIBKQGIAf8BJwGkATwB/wEKAZwBhwH/AQABowHsAf8BAAHMAv8BAAHHAv8BAAGc
+        Av8BAAFpAv8BAAFWAfQB/wNYAcYDTgGZAboBQQEuAf8B8wHAAZgB/wHWAcIBpAH/AdABuAGeAf8BxgGV
+        AY0B/wHLAYcBjQH/AccBgwGNAf8B1QGQAZQB/wHUAYIBkwH/AVsBUAGbAf8BTQGzAd4B/wFWAfYC/wEN
+        Ad8C/wE4AWgBpwH/AloBWwHcBAACWAFbAcsBaAG5Av8B3AHzAv8B6gH3Av8B3QHGAbIB/wHzAd8B0AH/
+        AfUB5QHYAf8B9gHpAd4B/wH4Ae0B5AH/Ab4BtgHMAf8BNgFBAbgB/wGXAZ8B0wH/AU0BkAHHAf0DHwEs
+        CAABTQJOAZYBsgHeAfIB/wHbAfcC/wHRAe8C/wG4AeYC/wGgAd8C/wGGAdcC/wNZAewBngFvAVwB+AH/
+        AekBwAL/Ad0BvAL/AdwBuAH/AdwBpQF0Af8BYAFXAVUB6wMwAUsCKwG8Af0CbgL/ApIC/wJvAv8CZQL/
+        AV0BWwL/ASIBFQHhAf8BHwEhAWIB+wEAAawB4wH/AQAB9QL/AQAB3gL/AQABwgL/AQABsAL/AQABpgL/
+        AQABcAH7Af8DWQHEA1oCygFWATwB/wHgAb4BmAH/AdMBtQGXAf8B0wGWAY0B/wHxAaIBpQH/Af4BswG0
+        Af8B/gG0AbYB/wH+AbcBuQL/AcQBwgH/AfkBuAG6Af8BgwGAAbgB/wFIAa4B5QH/Aa0B8gHzAf8BbwGw
+        AewB/wFNAVEBYAHtBAACWQFdAdIBiwHIAv8B8QH6Av8B9wH8Av8B9gH5AfsB/wHwAeUB3AH/Ae4B4AHV
+        Af8B7QHcAc8B/wHsAdgByQH/AeoB1AHCAf8B9AHwAe0B/wH3AfsC/wFYAWIBcgHpDAADKAE8AXcBlQGi
+        AfoE/wH1A/8BzwHyAv8BtAHyAv8BYgGPAbYB/gFnAVkBVQHyAfkBzAGXAv8B3gGyAv8B4AG5Av8B4QG5
+        Av8B7AG+Af8B7AGlAWgB/wNXAb0CWAFbAcsCcwHlAf8CkQL/Am4C/wJkAv8CYAL/AUQBQAGQAfoDUAGd
+        AVcBXgFiAd8BAAHpAf4B/wEAAeQC/wEAAcAC/wEAAbEC/wEAAa4C/wEwAW0BngH3AzoBYgFjAkoB7wG+
+        AWcBSAH/AcwBogGEAf8B1AGOAYcB/wH3AasBqQL/AbcBsgL/AbYBswL/Ab4BvAL/AcYBxQL/AdkB1wL/
+        AfwB+gH/AeYBsQG9Af8BXQFYAV4B5QFLAWgBsgH9ARwBWgHKAf8DSwGPBAADHAEnAlMBVQGtA1wB0QJd
+        AV8B1wJeAWMB3QJfAWYB4wFiAWMBbgHpAWIBaAF7Ae8BagF0AZYB9QFtAZABvwH7AYcBpgHwAf8BiAGr
+        AfUB/wJUAVYBqxAAAUYCRwGAAX4BmAGiAfoB1gHlAe4B/wG8AeIB8QH/AWoBjAGyAfwCUAFSAaMBYQJa
+        AdsB/wHaAZQC/wHNAZkC/wHOAZ0C/wHMAZsC/wHXAZwB/wH+AbUBZwH/A1cBvwQAAk8BUQGcAj4BtAH8
+        AoMC/wJZAfUB/wJLAWUB7wMzAVIEAAMQARYBWAJaAcABAAG1AfYB/wEAAc8C/wEAAaQC/wFaAV8BZQHg
+        AycBOgQAAXYBKwEnAfwBtgFkAU8B/wHoAasBoAL/AcYBwAL/Ac8BxwL/AdQBzQL/Ad4B1wL/AeYB4QL/
+        Ae8B6QL/AvoB/wG7AYQBmQH+A1QBrwMEAQYDQAFwAksBTAGPAwEBAi8AAQEDBQEHGAADLwFKAVECUgGh
+        A1IBqQM5AV8EAANFAX0B1gGNAXIB/gH/AfQB1AL/AfQB3wL/AfUB3QL/AdsBqgH/AYwBUgE+AfcDMQFP
+        CAADOwFkAlEBcwHuAlsBXgHQAxgBIRAAA0wBkgE0AWIBmgH2AlUBVwG6AwwBEAgAAV8CVwHfAZcBQQFA
+        Af4BtwJSAf0BqwFZAVsB/AGqAVsBYAH8AZkCXwH7AZkCXwH7AZwBVgFrAfoBmgFfAWIB+wF5AVkBZwHy
+        A0QBfHgAAUcCRgGAAWwBZQFeAeUBqgGEAXoB+gGeAYIBbQH3AWACXAHUAzMBUoQAA0sBjgNZAcMDVwHC
+        A0IBdkAAAxEBFwNEAXkDVgGzA1gBxgNXAcUDVAGvAz0BagMNARIQAAJVAVcBugEhASQBlAH7ATsBPQGO
+        AfgBOAE6AYsB+AE0ATgBiAH4ATEBNwGFAfgBMQE0AYIB+AEuATEBfgH4Ai4BfAH4ASsBLgF6AfgBKwEs
+        AXkB+AEpASsBeAH4AisBdwH4AisBdwH4ARwBHQFtAfsCWQFbAcMMAANTAaoDWAHRA1gBywNaAdUBUAFd
+        AWoB7QE/AV0BdwHzAVYBVwFfAegDWwHQA1wBzgNZAdIDRAF8CAABNgFtAYwB9wEAAbUB4QH/AQEBqwHa
+        Af8BTwFXAVkB7AMZASM4AANDAXcBYgFZAVgB6wJ/AU0B/gGBAakBSAH/AYYBuwFWAf8BiQG2AVcB/wGz
+        AagBcgH/AaIBVgFOAf0BWgJYAd4DOQFfDAABNwE4AYMB9gEjAT4B7gH/AQsBJgHkAf8BBgEfAeAB/wEJ
+        AR4B2gH/AQcBGgHVAf8BBAEVAc8B/wEPAR0B1gH/AQ8BGQHSAf8BAgEJAcEB/wECAQYBvQH/AQABBAG5
+        Af8CAAG1Af8CAAGvAf8CAAG5Af8CMwF6AfcMAAGyAasBrAH/AdsB0gHRAf8B4gHMAcIB/wGFAaMB3gH/
+        AVoB0gL/AWgB6QL/AWIBrQHyAf8B2gHGAcIB/wHfAdUB1AH/AbwCtgH/A1UBtQgAAT4BdQGDAfQBAAHo
+        Av8BAAHuAv8BAQGDAbUB/wJaAVwB3ANKAYsDAwEELAABUgJQAaQBsgJ/Af4B/wHvAeUB/wHdAfgBzwH/
+        Ad8B9QHOAf8B5gH1AdYB/wHpAfoB3wP/AfoD/wH5Af8B6wHIAbkB/wFqAkEB+QNEAXoIAANVAbUBHwEy
+        AdsB/wEAAREB5AH/AVgBZwHRAf8BqwGvAdAB/wGpAa4B2QH/AbMBtwHgAf8BnAGfAccB/wGaAZwBxAH/
+        AbQBtgHcAf8BrAGuAdMB/wGvAbABywH/AWUBZwG6Af8CAAGkAf8CAAGrAf8CVgFYAcEMAANRAaADVQGt
+        A1ABnQNVAbUBYAGqAcsB/QFtAbcB5wH/AVkBYAFoAesDVAGmA1UBrQNSAakDKAE8CAABWgJdAdMBAAHa
+        AfQB/wEAAdkB9wH/AQABzAH6Af8BAwG4AesB/wElAUMBagH5AzgBXCgAA0sBkAHGAZoBcQL/Af0B4wL/
+        AeoBzgL/AeABwgL/AdwBuwL/AdwBuQL/Ad0BvQL/AeABwwL/AeoB0QP/AfYB/wH9AeQB1AH/AWoCQQH5
+        AzgBXQQAAysBQgEoAS4BlwH7AQkBJQHqAf8BcQGIAdcB/wH5AfUB2QH/AfgB9gHqA/8B+wH/Al8BUwH/
+        AlQBSQP/AfkB/wL6Ae8B/wL7AeIB/wGNAY8BxQH/AgABtQH/AQABAgGTAf8DMgFRGAADMwFSAX0BeQF6
+        AfoBpQGaAZwB/wNUAa4YAAMkATUBVgFjAWgB6AEAAdsB9AH/AQAB2gH2Af8BAgHuAv8BAAGaAdQB/wFD
+        AUoBWQHyA0sBkAMjATMcAAMmATgBfQFcAUMB+AG/AdMBjgL/AdsBsgL/Ac8BnAL/AcoBkwL/AcgBjwL/
+        AckBjgL/AcsBlAL/AdIBnwL/AdYBqQH/Ae4B1QGrAv8B+AHhAf8B8gHIAa0B/wNYAd0DDQESAwQBBQNT
+        AaoBHgExAd4B/wEbATIB6AH/AdYB2AHlAf8B+gH5AfIB/wL9Af4B/wLVAdcB/wLSAdMB/wL9Af4B/wL6
+        AfUB/wHhAeIB5QH/ASIBJQG8Af8BAAECAbUB/wJWAVgBuQMJAQwMAAMxAU8DVgG2A1cB6AF1AXkBdAH6
+        AbMBqwGmAf8BhgJtAf8DWAHRAxABFhgAAyQBNQFVAWcBcQHrAQAB4QH5Af8BAAHQAfUB/wEAAdQB/gH/
+        AQYBwQHxAf8BEgFFAZkB/QFLAVEBXQHtA1EBpwNKAYsDJAE1EAADVQGyAXABjwE3Af8BbAGjAUAB/wH4
+        AckBjQL/AcABcgL/AboBaQL/AbkBZQL/AbsBaAH/AdQBrwFWAf8BdAGYATYB/wHhAb0BcAH/Ae0BxwGO
+        Af8BqAGyAWQB/wFqAakBSwH/AZYBUwFAAf0DPQFqBAADKgFBAkIBhAH1AQgBJAHtAf8BagGDAegD/wH3
+        Bf8DvAH/A7UH/wH8Af8BkAGUAdUB/wEAAQIBwAH/ATEBNAGBAfgDMQFOEAABbQJnAfEB4wHaAdsB/wHz
+        AesB6gH/AekB7AHkAf8B2wHQAc4B/wHLAbgBuQH/AY4CgQH/A1gB4wM9AWoDAQECFAADJgE4AVABZgFx
+        Ae0BAAHiAfkB/wEAAdMB8wH/AQsB5QH9Af8BEwHmAv8BDQGvAfIB/wEAAVsBxgH/AQABUAG+Af8BUwFU
+        AVwB5wM4AV0MAAFmAVUBVAHqAT8BggEdAf8BFgFeAQAB/wFwAYkBKQH/AfUBswFYAv8BsQFTAv8BrgFP
+        Av8BswFVAf8BhgGKAScB/wEGAVgBAAH/AWsBhgElAf8B/QHFAYMB/wGdAZwBQwH/AVYBkQEvAf8BxgGc
+        AWMB/wNTAbAIAAJUAVYBqwElATcB3gH/AUABVAH1Af8B7QHuAfwF/wOMAf8DcwX/AeoB6wH+Af8BJQEs
+        Ad8B/wEFAQ4BwAH/AlUBVwG3AwEBAhAAAX4CegH4Ae0C4AH/AeIC1gH/AecB3AHeAf8B2QHKAcsB/wHU
+        AsMB/wHlAtQB/wHJAroB/wFUAk8B/QNXAcIDIQEwFAADKQE/AUoBYwFzAe8BAAHjAfoB/wEAAc4B8gH/
+        ARYB5AH7Af8BOAP/AUIB6gL/AVoB5AL/ARMBigHnAf8BMAE5AW0B9wNGAYAIAAGHAVsBQQH5AS0BYQEM
+        Af8BFwFMAQAB/wEUAUsBAAH/AbEBkQEyAv8BswFSAv8BtAFUAv8BuAFXAf8BXgFrARkB/wEZAU8BAAH/
+        AR4BUAEAAf8BqgGTATkB/wHlAbABXAH/AckBsgFnAf8B7AG6AYoB/wNXAcUIAAMnAToCQQGVAfkBngGi
+        Af0B/wLPBv8DagH/A1gF/wKnAv8BGgEbAf4B/wEiASQBqAH9Ay8BSRQAAYQCggH3AfkC8gH/AfIC7QH/
+        AfEC7gH/AdwCzwH/Ac8CvQH/AdQCxQH/AeEC0gH/Ae8C4gH/AZgCjQH/A1EBoRgAAy0BRgFJAWQBdQHv
+        AQAB3QH0Af8BAAHHAfAB/wEVAeAB9gH/AU0D/wGOA/8BjwH2Av8BJwGjAfkB/wEwAT4BYgH1Ay8BSgQA
+        AZABXwEyAfsBJQFMAQQB/wEWATgBAAH/AWQBYgEYAf8B4wGpAUsC/wG3AVoB/wHbAaMBSQH/AbYBjgE2
+        Af8BNQFHAQAB/wEaAToBAAH/AR0BPgEAAf8BNgFMAQMB/wGeAYMBLwH/AaMBjwE8Af8BuwGXAVIB/wNZ
+        AccIAAMCAQMCUAFSAaMBdAGCAecB/wG9AbwC/wL7Av8CSQFFAf8COwE2Af8C9gH+Af8CYgL/ASUBJgHi
+        Af8DVQGyAwUBBxQAAYUChAH3Af4C/AH/AewC5gH/Ae8C6gH/Ad0C0QH/Ac4CvAH/AdMCxAH/AdUCxgH/
+        Ae0C3wH/AboCrQH/A1IBqRwAA0gBhAEAAagB2gH/AQAB6wH9Af8BAAHkAfQB/wETAv4B/wFEA/8BkgP/
+        AZsD/wEQAXEB4QH/A1sB0AMPARQBfQFYAUgB9gGFAWsBJAH/AbcBigEwAf8B9QGuAVAC/wG+AWcB/wHb
+        AawBYAH/AU4BUwEfAf8BOwFKARcB/wFBAUsBGQH/ATgBQQEQAf8BKQEzAQAB/wEzATQBAAH/AjsBAAH/
+        AToBQAEHAf8BkgFkAS0B/wNVAbQMAAMkATYCTAGCAfMBsgG0Af4B/wLfAv8CagFkAf8CZQFZAf8CwAH8
+        Af8BUQFSAf4B/wE6ATsBigH3AyoBQRgAA4QB9wHYAsoB/wHIArcB/wHoAuAB/wHfAtMB/wHMArkB/wHS
+        AsEB/wHVAsQB/wHmAtYB/wGtAp8B/wNRAaccAAJbAWAB1gEAAcoB+QH/AQAB4AL/AQAB7wL/AQAB/AL/
+        ARID/wE5AfoC/wGGA/8BXwHgAv8BBwFLAZsB/gNKAYwBXgFbAVoB2QGxAYsBNgH/Ae0BqgFJAv8BygGM
+        Av8B3gG3Af8B4AHSAbkB/wGfAaYBjwH/AaABpwGPAf8BqAGrAZMB/wGmAakBkAH/AZUBmQFxAf8BYQFl
+        AT8B/wEcASwBAAH/ASQBNAEAAf8BqgFlATQB/wNDAXcMAAMDAQQDUAGdAYIBhQHlAf8ByQHIAv8C5gHv
+        Af8C5gHtAf8ClgL/AUYBSAHjAf8DUwGqAwYBCBgAAYQCgwH3Ac0CuwH/AcMCsgH/Ae8C6gH/Ad4C0gH/
+        AcYCswH/AdACvgH/AdECwAH/AeIC0QH/AakCmgH/A1EBpxwAAVUCVwG6AQABxwHzAf8BAAHRAv8BAAHa
+        Av8BAAH1Av8BEgHYAfEB/wE+AVoBggH1AS8BqAHCAf0BWAP/AQcBggHoAf8DTgGUAUcCRgGBAZ0BaQEx
+        Af8BpQG1AXMB/wH5Ae4B2gL/AfAB4QL/AfYB6gH/AfEB7gHgAf8BwgHPAbgB/wHGAdEBugH/Ac0B1QG8
+        Af8BxAHQAbcB/wG6Ac0BtQH/AYUBqAGGAf8BagGAAS0B/wFmAVkBVQHsAxIBGRAAAyUBNwJTAYAB8QG+
+        AcAB/gH/AtcC/wHJAcgC/wGOAY8C/wE7AT0BhQH2Ay0BRRwAA4QB9wHvAugB/wHwAusB/wH+Av0B/wHZ
+        AswB/wG+AqgB/wHHArQB/wHNArsB/wHfAs0B/wGmApcB/wNRAaccAAMQARYBVQFjAXMB6wEAAdMC/wEA
+        Ac8C/wEAAegC/wElAYYBugH+A1kBzwElAWUBlQH4AQABswHzAf8CVwFaAb0DDQESAw0BEgFgAlcB3wG9
+        AccBlQH/AcwB6QHRAf8B5QHpAdgB/wH4AfQB6QL/Af0B+AH/AdkB6AHWAf8BvgHYAb4B/wHAAdgBvwH/
+        AcMB2QHBAf8BwAHfAcoB/wG3AdgBqwH/AZgBfAFFAf4DRAF5GAADUAGeAYwBkAHlAf8CzAL/AbUBtAL/
+        AW0BcAHkAf8DVAGuIAADcAH1Af8C/QH/AfYC7wH/AeQC2wH/Ad4C0wH/AdMCxQH/AcQCsAH/AcECqwH/
+        AdYCwQH/AaICkQH/A1EBpyAAAzkBXwEhAXkBpAH6AQAB0QH7Af8BAAHeAv8BAAHBAe0B/wEGAX8BqAH+
+        AQABjQHbAf8CWQFbAcMDBAEGCAADJQE3AXMBWAFQAe8B4AHdAboB/wHbAfgB5wH/Ad4B8AHlAf8B7AH1
+        Ae0B/wHjAe8B4wH/AdUB5wHWAf8B1QHqAdwB/wHbAfYB6QH/AesB8AHPAf8ByQGTAVMB/wFSAlABpBwA
+        Ax0BKgJMAYIB8wHWAdgC/wHMAc0C/wI+AZYB+AMmATkgAAM+AWsDYQHqAcwCxQH/AfAC6AH/AfAC6AH/
+        AegC4wH/AeAC2QH/Ac4CvwH/AdACuQH/AZ0CiwH/A1QBqyQAAzgBXAFXAVwBYQHfAQABsQHpAf8BAAHq
+        Av8BAAHLAfQB/wJaAV0BygMJAQwQAAMlATcBYgJYAd0B4gG3AZ4B/wH4AfcB7An/AfsD/wH6Af4B8gH/
+        AfYB2QG9Af8BlgFlAVsB+ANOAZQgAAMCAQMDTgGUAZMBlwHoAf8BmgGfAekB/wJPAVMBpQMDAQQkAAMJ
+        AQwDSwGPA2UB7wHZAtYB/wH5AvYB/wH6AvcB/wH4AvcB/wHtAuUB/wGXAooB/wNOAZkoAAMNARIDTgGU
+        AUIBYwF8AfACWgFdAcoDDQESGAADCQEMAUcCRgGAAV4CWwHZAYkBaQFcAfUBqwGMAXAB+wGiAYMBagH5
+        AWwBXAFVAeoDVQGyAycBOigAAxsBJgJaAWEB2wFVAVYBZAHkAyIBMjAAAxUBHQNQAZ4BeAJ3AfUDiwH5
+        A18B4wNZAccDTAGTAxYBHwgAAUIBTQE+BwABPgMAASgDAAFAAwABIAEBAgABAQEAAQEGAAEJFgAD/wEA
+        AfABHwYAAeABDwYAAeABDwYAAeABDwYAAeABDwYAAeABDwYAAeABDwYAAeABDwYAAeABDwYAAeABDwYA
+        AeABDwYAAeABDwYAAeABDwYAAeABDwYAAeABDwYAAeABDwYAAfgBDwL/Af4BfwL/AfABBwL/Af4BfwL/
+        AfABAwH5Ac8B4AEPAv8B4AEBAfgBjwHgAQcCAAHgAQEB8AGPAeYBRwIAAcABAQHwAQcB5gFDAgABwAEA
+        AeABBwH+AQcCAAHAAQAB4gETAfABBwIAAcABAAHCATMB4AEPAgABwAEAAcQBEwHgAR8CAAHAAQEBhAEZ
+        AeABbwIAAeABAwGIAQkB4gFnAgAB/AEPAgAB4AFHAgABwAF/Av8B8AEHAgABgwG/Av8B/AE/Av8BzwG/
+        Av8B/gF/Av8B+AE/AccB4wHgAQcBfwH/AeABAwHBAcMBwAEDAT8B/wGAAQEBwAEDAeABBwGPAf8BgAEB
+        AeABBwGAAQEBgwH/AYABAQHgAQcBgAEBAcEB/wGAAQEB4AEHAYABAQHAAf8BgAEBAeABAwGAAQEB4AE/
+        AYABAAHAAQEBgAEBAfABHwQAAcABAwH4AQ8EAAHAAQMB/AEHBAAB4AEHAf4BAwEAAQEB+AEfAeABBwH/
+        AQEBgAEBAfgBHwHwAQ8B/wGBAcABAwH8AT8B8AEPAf8CwAEHAfwBPwHwAQ8B/wHwAv8B/AE/AfgBHwH/
+        AfwB4AP/AcIBAwH/AeEB4AE/AgABgAEBAf8B4AHAAQ8CAAGAAQAB/wHAAYABBwIAAYABAAH/AYABAAED
+        AgABgAEAAf8BgQEAAQMCAAGAAQAB/wEDAQABAQIAAYABAAH/AQMEAAGAAQABjgEHAeAEAAEBAQwBDwH8
+        BAABAwEAAR8B/gQAAQEBAAE/Af8BAQMAAQEBAAE/Af8BAwMAAQEBwAFjAf8BhwMAAQMBwAEDAf8BxwMA
+        AQcB4AEDAv8CAAEBAQ8B8AEPAgAC/wGfAf8BgAEBAgAB4wH/AYcB/wGAAQECAAHBAf8BgQH/AYABAQIA
+        AcAB/wHAAf8BgAEBAgABgAF/AcAB/wGAAQECAAGAAT8BwAH/AYABAQMAAR8B4AE/AYABAQMAAQ8B8AEf
+        AYABAQMAAQcB+AEPAYABAQIAAQwBBwH8AQ8BgAEBAgABHgEDAfwBBwGAAQECAAE/AYEB/gEDAYABAQIA
+        Af8BwAH/AQMBgAEBAgAB/wHwAf8BgQGAAQECAAH/AfgB/wHBAYABAQIAA/8B4QGAAQEE/wHgAQMBgAEB
+        AYABAQGAAQcBgAEBAYABAQMAAQMCAAGAAQEDAAEBAgABgAEBAwABAQIAAYABAQMAAQECAAGAAQEGAAGA
+        AQEGAAGAAQEGAAGAAQEGAAGAAQEGAAGAAQEGAAH/AcMBAAEBAQABAQEAAQEB4QGHAQABAQEAAQcBAAEB
+        AeABBwEAAQcBAAEPAQABBwHwAQ8BAAF/AQAB/wEAAX8B8AEPAQABDwGHAeEB4AEHAf4BBwEAAgMCwAED
+        AfgBBwEAAgECgAEBAcABBwYAAYABBwYAAYABBwIAAYABAQIAAYABBwIAAcABAwIAAYABBwIAAeABBwIA
+        AYABBwIAAeABBwIAAYABBwIAAcABAwIAAYABBwIAAYABAQIAAYABAQYAAYABAQYAAYABAQEAAgECgAEB
+        AYABAwEAAf8BAwLAAQMBgAEPAv8BhwHhAeABBwGAAX8B/wH4AgAB4wH/AeABBwH/AfACAAHBAf8BgAED
+        AeABIAIAAYAB/wGAAQEBwAEBAwABfwGAAQEBwAEDAwABPwGAAQEBgAEHAwABHwGAAQEBgAEBAwABDwGA
+        AQEEAAGAAQcBgAEBBAABwAEDAYABAQQAAeABAQGAAQEBAAEBAgAB8AEAAYABAQEAAQECAAH4AQABgAEB
+        AYABAwIAAfwBAAGAAQEB8AEDAgAB/gEBAYABAQH8AQcCAAH/AQMBgAEDAf8BBwIAAf8BhwHAAQcBgAH/
+        AgAB4AEHAeABBwGAAf8CAAHgAQcBwAEDAYADAAHAAQEBgAEBAYADAAGAAwABgAEAAYABAAGAAwABgAMA
+        AYADAAGAAwABgAMAAYADAAGAAwABgAMAAYADAAGAAwABgAMAAYACAAEBAYADAAHgAgABAQGAAQECAAHg
+        AgABAQGAAQECAAHgAQEBAAEBAcABAwGAAQEB8AH3AYABAQHwAQMBwAEDAfAD/wHwAQMB8AEHBf8B4QGA
+        Ab8BgAEAAeABPwH/AcABAAEDAYABAAHgAQcB/wGAAgABgAEAAcABAQH/AwABgAEAAcABAQH+AwABgAEA
+        AcABAQH8AQEBAAEBAYABAAGAAQEB4AEDAQABDwGAAQABgAEBAYABBwIAAYABAAGAAQEBAAEPAYABAAGA
+        AQABgAEBAQABHwHgAQABgAEAAYABAwEAAT8B4AEBAYABAAGAAQMBAAE/AeABAQGAAQABgAEDAQABPwHA
+        AQEBgAEAAeABBwEAAX8BwAEBAYABAAH+AQcBwAF/AcABAQT/AcAB/wHAAQMCAAL/AgABwAEDAgAB4wH/
+        BgABwwH/BgABwAEBBgABwAEBBgABwAEBBgABwAEBBgABwAEBBgABgAEBBgABgAEBBgABgAEBBgABgAEB
+        AgAB4AEHAgABgAEBAgAB8AEPAgABgAH/AgAB8AEHAgABgAH/AgAB8AEHAgAC/wIAAfABBwH/AY8B8AE/
+        Av8B4AEHAf8BhwGAAQEBgAEBAcABBwHwAYMCAAGAAQEB4AEHAeABAwIAAYABAQGAAQEBwAEBAgABgAEB
+        AwABAQIAAYABAQYAAYABAQYAAYABAQYAAYABAQYAAYABAQYAAYABAQYAAYABAQIAAcACAAEBAYABAQIA
+        AeACAAEBAYABAQEAAQEB4AIAAQcBgAEBAQABAQH/AcABAAF/AYABAQGAAQEB+AFPAeAFAAH4AQcB4AUA
+        AcABAwHABQABgAEDAcAHAAHABQABgAEAAYAHAAGABQABAQGABgABAQgAAQEOAAGAAQEGAAHAAQMGAAHA
+        AR8GAAHyAR8B4AEHBAAE/wIAAv8B4AEDAfABDwHgAQcBwAF/AeABAAHgAQcB4AEPAYABBwHgAQABwAED
+        AgABgAEAAcABAAGAAQECAAGAAQABgAcAAYAHAAGABwABgAYAAQEB4AYAAQEB4AYAAQEB4AYAAQMB4AUA
+        AYABAwHwAgABAQIAAcABBwH4AQABgAEDAgABwAEfAfwBAQHAAQcCAAHgAX8C/wHgAQ8CAAHgAf8B+AEf
+        BP8B+AE/AcgBEwH+AT8C/wHAAR8BnAE5AfwBHwGAAQcBAAEPAQQBIAH8AR8BgAEDAQABBwEEASAB+AE/
+        AYABAQEAAQMBBAEgAeABQwGAAQECAAEEASABwAEDAYABAQGAAwABgAEDAYABAQHgAwABgAEHAYABAQHw
+        AQABBAEgAYABHwHAAQEB/AEAAQIBQAGAAQMB8AEBAf4BAQIAAYABAQHAAQEB/AEDAgABwAEBAcABAwH4
+        AQMBgAEBAcABAwHgAQcB8AEHAcABAwHAA/8B4AEPAeABBwT/AeABDwH/AQMG/wHwAQEC/wH4AR8CAAHg
+        AwAB+AEBAgABgAMAAYADAAGAAQECAAGABwABgAcAAYAMAAEBAwABAQMAAQEDAAEBAwABAQMAAQMDAAEB
+        AwABAwMAAQMDAAEDAgABgAEDAgABwAEHAgABwAEHAv8B8AF/Av8B4AEfCP8BgAE/Av8BwAEHAecB/wEA
+        AR8B/AE/AcABAwHAAQEBAAEfAfgBHwHAAQMBwAEBAQABHwHwAQ8BgAEHAYABAQEAAR8B4AEPAYABBwGA
+        AQEBAAEfAcABAwGAAQcBgAEBAQABHwGAAQEBgAEHAYABAQEAAT8DAAEDAYABAQGAAX8DAAEBAYABAQGA
+        AQcEAAGAAQEBgAEBBAABgAEBAYAFAAGAAQMBgAUAAYABAwHAAQABgQEBAgAB/wHnAeEBAALDAQABHwP/
+        AYEE/wEPAf8B8AEPAgAB4AEDAQcB/wHgAQcCAAHgAQMBAQH/AcABAwIAAeABAwEBAf8BgAEBAgAB/AE/
+        AQABfwQAAeABHwGAAQ8CAAGAAQEB4AEHAcABBwIAAcABAQHgAQMB4AEDAgABwAEDAeABAwHwAQECAAHA
+        AQMB4AEDAfgDAAHgAQcB4AEDAfgDAAHgAQcB4AEDAfgDAAHwAQ8B4AEDAfgCAAEBAfgBHwHgAQMB/AEB
+        AYABAwH4AR8B4AEDAf4BAwHAAQcB+AEfAfABAwH/AQcB4AEPAfwBPwH8AQML
 </value>
   </data>
   <metadata name="m_ctxPwList.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
diff --git a/KeePass/Forms/MainForm_Functions.cs b/KeePass/Forms/MainForm_Functions.cs
index 8756d22..aefaa25 100644
--- a/KeePass/Forms/MainForm_Functions.cs
+++ b/KeePass/Forms/MainForm_Functions.cs
@@ -70,6 +70,9 @@ namespace KeePass.Forms
 		private DynamicMenu m_dynShowEntriesByTagsToolBar;
 		private DynamicMenu m_dynAddTag;
 		private DynamicMenu m_dynRemoveTag;
+		private OpenWithMenu m_dynOpenUrl;
+
+		private AsyncPwListUpdate m_asyncListUpdate = null;
 
 		private MruList m_mruList = new MruList();
 
@@ -85,6 +88,11 @@ namespace KeePass.Forms
 		private uint m_uLastInputTime = uint.MaxValue;
 		private long m_lLockAtGlobalTicks = long.MaxValue;
 
+		private bool m_bBlockQuickFind = false;
+		private object m_objQuickFindSync = new object();
+		private int m_iLastQuickFindTicks = Environment.TickCount - 1500;
+		private string m_strLastQuickSearch = string.Empty;
+
 		private ToolStripSeparator m_tsSepCustomToolBar = null;
 		private List<ToolStripButton> m_vCustomToolBarButtons = new List<ToolStripButton>();
 
@@ -122,7 +130,9 @@ namespace KeePass.Forms
 		private bool m_bUpdateUIStateOnce = false;
 		private int m_nLastSelChUpdateUIStateTicks = 0;
 
-		private int m_nAppMessage = Program.ApplicationMessage;
+		private readonly int m_nAppMessage = Program.ApplicationMessage;
+		private readonly int m_nTaskbarButtonMessage;
+		private bool m_bTaskbarButtonMessage;
 
 		private List<KeyValuePair<ToolStripItem, ToolStripItem>> m_vLinkedToolStripItems =
 			new List<KeyValuePair<ToolStripItem, ToolStripItem>>();
@@ -194,6 +204,12 @@ namespace KeePass.Forms
 			public string LockUnlock;
 		}
 
+		private enum AppCommandType
+		{
+			Window = 0,
+			Lock = 1
+		}
+
 		/// <summary>
 		/// Check if the main window is trayed (i.e. only the tray icon is visible).
 		/// </summary>
@@ -222,6 +238,8 @@ namespace KeePass.Forms
 
 		private void CleanUpEx()
 		{
+			m_asyncListUpdate.CancelPendingUpdatesAsync();
+
 			Program.TriggerSystem.RaiseEvent(EcasEventIDs.AppExit);
 
 			m_nClipClearCur = -1;
@@ -248,6 +266,7 @@ namespace KeePass.Forms
 			m_dynShowEntriesByTagsToolBar.MenuClick -= this.OnShowEntriesByTag;
 			m_dynAddTag.MenuClick -= this.OnAddEntryTag;
 			m_dynRemoveTag.MenuClick -= this.OnRemoveEntryTag;
+			m_dynOpenUrl.Destroy();
 
 			m_ctxEntryPreviewContextMenu.Detach();
 
@@ -264,6 +283,7 @@ namespace KeePass.Forms
 			if(m_fontBoldTree != null) { m_fontBoldTree.Dispose(); m_fontBoldTree = null; }
 			if(m_fontItalicTree != null) { m_fontItalicTree.Dispose(); m_fontItalicTree = null; }
 
+			m_asyncListUpdate.WaitAll();
 			m_bCleanedUp = true;
 		}
 
@@ -456,9 +476,6 @@ namespace KeePass.Forms
 			m_menuFileClose.Enabled = (s.DatabaseOpened || s.FileLocked);
 
 			m_menuFileLock.Enabled = m_tbLockWorkspace.Enabled = s.EnableLockCmd;
-			m_ctxTrayTray.Enabled = s.NoWindowShown;
-			m_ctxTrayLock.Enabled = (s.EnableLockCmd && s.NoWindowShown);
-			m_ctxTrayFileExit.Enabled = s.NoWindowShown;
 
 			m_menuEditFind.Enabled = m_menuToolsGeneratePwList.Enabled =
 				m_menuToolsTanWizard.Enabled =
@@ -732,14 +749,14 @@ namespace KeePass.Forms
 			if(!bRequireSelected)
 			{
 				ListViewItem lviFocused = m_lvEntries.FocusedItem;
-				if(lviFocused != null) return (PwEntry)lviFocused.Tag;
+				if(lviFocused != null) return ((PwListItem)lviFocused.Tag).Entry;
 			}
 
 			ListView.SelectedListViewItemCollection coll = m_lvEntries.SelectedItems;
 			if(coll.Count > 0)
 			{
 				ListViewItem lvi = coll[bGetLastSelectedEntry ? (coll.Count - 1) : 0];
-				if(lvi != null) return (PwEntry)lvi.Tag;
+				if(lvi != null) return ((PwListItem)lvi.Tag).Entry;
 			}
 
 			return null;
@@ -758,7 +775,7 @@ namespace KeePass.Forms
 
 			PwEntry[] vSelected = new PwEntry[coll.Count];
 			for(int i = 0; i < coll.Count; ++i)
-				vSelected[i] = (PwEntry)coll[i].Tag;
+				vSelected[i] = ((PwListItem)coll[i].Tag).Entry;
 
 			return vSelected;
 		}
@@ -820,7 +837,16 @@ namespace KeePass.Forms
 			if(pe == null) { Debug.Assert(false); return null; }
 
 			ListViewItem lvi = (lviTarget ?? new ListViewItem());
-			lvi.Tag = pe;
+
+			PwListItem pli = new PwListItem(pe);
+			if(lviTarget == null) lvi.Tag = pli; // Lock below (when adding it)
+			else
+			{
+				lock(m_asyncListUpdate.ListEditSyncObject) { lvi.Tag = pli; }
+			}
+
+			int iIndexHint = ((lviTarget != null) ? lviTarget.Index :
+				m_lvEntries.Items.Count);
 
 			if(pe.Expires && (pe.ExpiryTime <= m_dtCachedNow))
 			{
@@ -875,6 +901,8 @@ namespace KeePass.Forms
 			else if(lviTarget != null) lvi.BackColor = m_lvEntries.BackColor;
 			else { Debug.Assert(UIUtil.ColorsEqual(lvi.BackColor, m_lvEntries.BackColor)); }
 
+			bool bAsync;
+
 			// m_bOnlyTans &= PwDefs.IsTanEntry(pe);
 			if(m_bShowTanIndices && m_bOnlyTans)
 			{
@@ -883,28 +911,52 @@ namespace KeePass.Forms
 				if(strIndex.Length > 0) lvi.Text = strIndex;
 				else lvi.Text = PwDefs.TanTitle;
 			}
-			else lvi.Text = GetEntryFieldEx(pe, 0, true);
+			else
+			{
+				string strMain = GetEntryFieldEx(pe, 0, true, out bAsync);
+				lvi.Text = strMain;
+				if(bAsync)
+					m_asyncListUpdate.Queue(strMain, pli, iIndexHint, 0,
+						AsyncPwListUpdate.SprCompileFn);
+			}
 
 			int nColumns = m_lvEntries.Columns.Count;
 			if(lviTarget == null)
 			{
 				for(int iColumn = 1; iColumn < nColumns; ++iColumn)
-					lvi.SubItems.Add(GetEntryFieldEx(pe, iColumn, true));
+				{
+					string strSub = GetEntryFieldEx(pe, iColumn, true, out bAsync);
+					lvi.SubItems.Add(strSub);
+					if(bAsync)
+						m_asyncListUpdate.Queue(strSub, pli, iIndexHint, iColumn,
+							AsyncPwListUpdate.SprCompileFn);
+				}
 			}
 			else
 			{
 				int nSubItems = lvi.SubItems.Count;
 				for(int iColumn = 1; iColumn < nColumns; ++iColumn)
 				{
-					string strSub = GetEntryFieldEx(pe, iColumn, true);
+					string strSub = GetEntryFieldEx(pe, iColumn, true, out bAsync);
+
 					if(iColumn < nSubItems) lvi.SubItems[iColumn].Text = strSub;
 					else lvi.SubItems.Add(strSub);
+
+					if(bAsync)
+						m_asyncListUpdate.Queue(strSub, pli, iIndexHint, iColumn,
+							AsyncPwListUpdate.SprCompileFn);
 				}
 
 				Debug.Assert(lvi.SubItems.Count == nColumns);
 			}
 
-			if(lviTarget == null) m_lvEntries.Items.Add(lvi);
+			if(lviTarget == null)
+			{
+				lock(m_asyncListUpdate.ListEditSyncObject)
+				{
+					m_lvEntries.Items.Add(lvi);
+				}
+			}
 			return lvi;
 		}
 
@@ -925,7 +977,7 @@ namespace KeePass.Forms
 
 					foreach(ListViewGroup lvg in m_lvEntries.Groups)
 					{
-						PwGroup pgList = lvg.Tag as PwGroup;
+						PwGroup pgList = (lvg.Tag as PwGroup);
 						Debug.Assert(pgList != null);
 						if((pgList != null) && (pg == pgList))
 						{
@@ -993,7 +1045,22 @@ namespace KeePass.Forms
 
 			m_tvGroups.EndUpdate();
 
-			if(tnSelected != null) m_tvGroups.SelectedNode = tnSelected;
+			if(tnSelected != null)
+			{
+				// Ensure all parent tree nodes are expanded
+				List<TreeNode> lParents = new List<TreeNode>();
+				TreeNode tnUp = tnSelected;
+				while(true)
+				{
+					tnUp = tnUp.Parent;
+					if(tnUp == null) break;
+					lParents.Add(tnUp);
+				}
+				for(int i = (lParents.Count - 1); i >= 0; --i)
+					lParents[i].Expand();
+
+				m_tvGroups.SelectedNode = tnSelected;
+			}
 			else if(m_tvGroups.Nodes.Count > 0)
 				m_tvGroups.SelectedNode = m_tvGroups.Nodes[0];
 		}
@@ -1036,8 +1103,13 @@ namespace KeePass.Forms
 
 			m_bOnlyTans = ListContainsOnlyTans(pwlSource);
 
+			m_asyncListUpdate.CancelPendingUpdatesAsync();
+
 			m_lvEntries.BeginUpdate();
-			m_lvEntries.Items.Clear();
+			lock(m_asyncListUpdate.ListEditSyncObject)
+			{
+				m_lvEntries.Items.Clear();
+			}
 			m_lvEntries.Groups.Clear();
 			m_lvgLastEntryGroup = null;
 
@@ -1152,7 +1224,7 @@ namespace KeePass.Forms
 
 			foreach(ListViewItem lvi in m_lvEntries.Items)
 			{
-				SetListEntry(lvi.Tag as PwEntry, lvi);
+				SetListEntry(((PwListItem)lvi.Tag).Entry, lvi);
 			}
 
 			UIUtil.SetAlternatingBgColors(m_lvEntries, m_clrAlternateItemBgColor,
@@ -1160,73 +1232,6 @@ namespace KeePass.Forms
 			m_lvEntries.EndUpdate();
 		}
 
-		/* public void RefreshEntriesList()
-		{
-			int nItemCount = m_lvEntries.Items.Count;
-			if(nItemCount <= 0) return;
-
-			PwEntry peTop = GetTopEntry();
-			PwEntry peFocused = GetSelectedEntry(false);
-			int iScrollY = NativeMethods.GetScrollPosY(m_lvEntries.Handle);
-
-			UpdateImageLists(); // Important
-
-			PwEntry[] vSelected = GetSelectedEntries();
-			if(vSelected == null) vSelected = new PwEntry[0];
-
-			PwEntry[] vList = new PwEntry[nItemCount];
-			for(int iEnum = 0; iEnum < nItemCount; ++iEnum)
-				vList[iEnum] = (PwEntry)m_lvEntries.Items[iEnum].Tag;
-
-			m_lvEntries.BeginUpdate();
-			m_lvEntries.Items.Clear();
-			m_lvEntries.Groups.Clear();
-			m_lvgLastEntryGroup = null;
-
-			int nTopIndex = -1;
-			ListViewItem lviFocused = null;
-
-			m_dtCachedNow = DateTime.Now;
-			ListViewStateEx lvseCachedState = new ListViewStateEx(m_lvEntries);
-
-			for(int iAdd = 0; iAdd < nItemCount; ++iAdd)
-			{
-				PwEntry pe = vList[iAdd];
-
-				ListViewItem lvi = SetListEntry(pe, null);
-
-				if(pe == peTop) nTopIndex = iAdd;
-				if(pe == peFocused) lviFocused = lvi;
-
-				if(Array.IndexOf(vSelected, pe) >= 0) lvi.Selected = true;
-			}
-
-			Debug.Assert(lvseCachedState.CompareTo(m_lvEntries));
-
-			UIUtil.SetAlternatingBgColors(m_lvEntries, m_clrAlternateItemBgColor,
-				Program.Config.MainWindow.EntryListAlternatingBgColors);
-
-			Debug.Assert(m_bEntryGrouping == m_lvEntries.ShowGroups);
-			if(m_lvEntries.ShowGroups)
-			{
-				// Test nTopIndex to ensure we're not scrolling an unrelated list
-				if((nTopIndex >= 0) && (iScrollY > 0))
-					NativeMethods.Scroll(m_lvEntries, 0, iScrollY);
-			}
-			else
-			{
-				if(nTopIndex >= 0)
-				{
-					m_lvEntries.EnsureVisible(m_lvEntries.Items.Count - 1);
-					m_lvEntries.EnsureVisible(nTopIndex);
-				}
-			}
-
-			if(lviFocused != null) m_lvEntries.FocusedItem = lviFocused;
-
-			m_lvEntries.EndUpdate();
-		} */
-
 		private PwEntry GetTopEntry()
 		{
 			if(m_lvEntries.Items.Count == 0) return null;
@@ -1235,7 +1240,7 @@ namespace KeePass.Forms
 			try
 			{
 				ListViewItem lviTop = m_lvEntries.TopItem;
-				if(lviTop != null) peTop = (lviTop.Tag as PwEntry);
+				if(lviTop != null) peTop = ((PwListItem)lviTop.Tag).Entry;
 			}
 			catch(Exception) { }
 
@@ -1317,6 +1322,11 @@ namespace KeePass.Forms
 					m_pListSorter = new ListSorter(nColumn, sortOrder,
 						bSortNaturally, bSortTimes);
 					m_lvEntries.ListViewItemSorter = m_pListSorter;
+
+					// Workaround for XP bug
+					if(bUpdateEntryList && !KeePassLib.Native.NativeLib.IsUnix() &&
+						WinUtil.IsWindowsXP)
+						UpdateEntryList(null, true); // Only required on XP
 				}
 				else
 				{
@@ -1425,16 +1435,16 @@ namespace KeePass.Forms
 
 			EvAppendEntryField(rb, strItemSeparator, KPRes.Title,
 				IsColumnHidden(AceColumnType.Title) ? PwDefs.HiddenPassword :
-				pe.Strings.ReadSafe(PwDefs.TitleField));
+				pe.Strings.ReadSafe(PwDefs.TitleField), pe);
 			EvAppendEntryField(rb, strItemSeparator, KPRes.UserName,
 				IsColumnHidden(AceColumnType.UserName) ? PwDefs.HiddenPassword :
-				pe.Strings.ReadSafe(PwDefs.UserNameField));
+				pe.Strings.ReadSafe(PwDefs.UserNameField), pe);
 			EvAppendEntryField(rb, strItemSeparator, KPRes.Password,
 				IsColumnHidden(AceColumnType.Password) ? PwDefs.HiddenPassword :
-				pe.Strings.ReadSafe(PwDefs.PasswordField));
+				pe.Strings.ReadSafe(PwDefs.PasswordField), pe);
 			EvAppendEntryField(rb, strItemSeparator, KPRes.Url,
 				IsColumnHidden(AceColumnType.Url) ? PwDefs.HiddenPassword :
-				pe.Strings.ReadSafe(PwDefs.UrlField));
+				pe.Strings.ReadSafe(PwDefs.UrlField), pe);
 
 			bool bHideCustom = Program.Config.MainWindow.EntryView.HideProtectedCustomStrings;
 			foreach(KeyValuePair<string, ProtectedString> kvp in pe.Strings)
@@ -1443,19 +1453,19 @@ namespace KeePass.Forms
 
 				string strCustomValue = (bHideCustom ? pe.Strings.ReadSafeEx(kvp.Key) :
 					pe.Strings.ReadSafe(kvp.Key));
-				EvAppendEntryField(rb, strItemSeparator, kvp.Key, strCustomValue);
+				EvAppendEntryField(rb, strItemSeparator, kvp.Key, strCustomValue, pe);
 			}
 
 			EvAppendEntryField(rb, strItemSeparator, KPRes.CreationTime,
-				TimeUtil.ToDisplayString(pe.CreationTime));
+				TimeUtil.ToDisplayString(pe.CreationTime), null);
 			EvAppendEntryField(rb, strItemSeparator, KPRes.LastAccessTime,
-				TimeUtil.ToDisplayString(pe.LastAccessTime));
+				TimeUtil.ToDisplayString(pe.LastAccessTime), null);
 			EvAppendEntryField(rb, strItemSeparator, KPRes.LastModificationTime,
-				TimeUtil.ToDisplayString(pe.LastModificationTime));
+				TimeUtil.ToDisplayString(pe.LastModificationTime), null);
 
 			if(pe.Expires)
 				EvAppendEntryField(rb, strItemSeparator, KPRes.ExpiryTime,
-					TimeUtil.ToDisplayString(pe.ExpiryTime));
+					TimeUtil.ToDisplayString(pe.ExpiryTime), null);
 
 			if(pe.Binaries.UCount > 0)
 			{
@@ -1468,12 +1478,13 @@ namespace KeePass.Forms
 				}
 
 				EvAppendEntryField(rb, strItemSeparator, KPRes.Attachments,
-					sbBinaries.ToString());
+					sbBinaries.ToString(), null);
 			}
 
-			EvAppendEntryField(rb, strItemSeparator, KPRes.UrlOverride, pe.OverrideUrl);
+			EvAppendEntryField(rb, strItemSeparator, KPRes.UrlOverride,
+				pe.OverrideUrl, pe);
 			EvAppendEntryField(rb, strItemSeparator, KPRes.Tags,
-				StrUtil.TagsToString(pe.Tags, true));
+				StrUtil.TagsToString(pe.Tags, true), null);
 
 			string strNotes = (IsColumnHidden(AceColumnType.Notes) ?
 				PwDefs.HiddenPassword : pe.Strings.ReadSafe(PwDefs.NotesField));
@@ -1503,6 +1514,8 @@ namespace KeePass.Forms
 			// m_richEntryView.Rtf = sb.ToString();
 			rb.Build(m_richEntryView);
 
+			UIUtil.RtfLinkifyReferences(m_richEntryView, false);
+
 			Debug.Assert(m_richEntryView.HideSelection); // Flicker otherwise
 			if(pg != null)
 			{
@@ -1511,8 +1524,10 @@ namespace KeePass.Forms
 			}
 
 			// Linkify the URL
-			string strUrl = pe.Strings.ReadSafe(PwDefs.UrlField); // Not Ex
-			UIUtil.RtfLinkifyText(m_richEntryView, strUrl, false);
+			string strUrl = SprEngine.Compile(pe.Strings.ReadSafe(PwDefs.UrlField),
+				GetEntryListSprContext(pe, m_docMgr.SafeFindContainerOf(pe)));
+			if(strUrl != PwDefs.HiddenPassword)
+				UIUtil.RtfLinkifyText(m_richEntryView, strUrl, false);
 
 			// Linkify the attachments
 			foreach(KeyValuePair<string, ProtectedBinary> kvpBin in pe.Binaries)
@@ -1521,13 +1536,28 @@ namespace KeePass.Forms
 			m_richEntryView.Select(0, 0);
 		}
 
-		private static void EvAppendEntryField(RichTextBuilder rb,
-			string strItemSeparator, string strName, string strValue)
+		private void EvAppendEntryField(RichTextBuilder rb,
+			string strItemSeparator, string strName, string strValue,
+			PwEntry peSprCompile)
 		{
 			if(string.IsNullOrEmpty(strValue)) return;
 
 			rb.Append(strName, FontStyle.Bold, strItemSeparator, null, ":", " ");
-			rb.Append(strValue);
+
+			if((peSprCompile == null) || !SprEngine.MightDeref(strValue))
+				rb.Append(strValue);
+			else
+			{
+				string strCmp = SprEngine.Compile(strValue,
+					GetEntryListSprContext(peSprCompile,
+					m_docMgr.SafeFindContainerOf(peSprCompile)));
+				if(strCmp == strValue) rb.Append(strValue);
+				else
+				{
+					rb.Append(strCmp + " - ");
+					rb.Append(strValue, FontStyle.Italic);
+				}
+			}
 		}
 
 		private void PerformDefaultAction(object sender, EventArgs e, PwEntry pe,
@@ -1648,7 +1678,7 @@ namespace KeePass.Forms
 				// bool bMinimize = Program.Config.MainWindow.MinimizeAfterClipboardCopy;
 				// Form frmMin = (bMinimize ? this : null);
 
-				if(ClipboardUtil.CopyAndMinimize(UrlsToString(v), true, this, null, null))
+				if(ClipboardUtil.CopyAndMinimize(UrlsToString(v, true), true, this, null, null))
 					StartClipboardCountdown();
 			}
 			else // Open
@@ -1681,7 +1711,7 @@ namespace KeePass.Forms
 			OnEntryBinaryView(null, args);
 		}
 
-		private string UrlsToString(PwEntry[] vEntries)
+		private string UrlsToString(PwEntry[] vEntries, bool bActive)
 		{
 			if((vEntries == null) || (vEntries.Length == 0)) return string.Empty;
 
@@ -1690,9 +1720,11 @@ namespace KeePass.Forms
 			{
 				if(sb.Length > 0) sb.Append(MessageService.NewLine);
 
+				PwDatabase pd = m_docMgr.SafeFindContainerOf(pe);
+
 				string strUrl = pe.Strings.ReadSafe(PwDefs.UrlField);
-				strUrl = SprEngine.Compile(strUrl, false, pe, m_docMgr.ActiveDatabase,
-					false, false);
+				strUrl = SprEngine.Compile(strUrl, new SprContext(pe, pd,
+					(bActive ? SprCompileFlags.All : SprCompileFlags.NonActive)));
 
 				sb.Append(strUrl);
 			}
@@ -1701,6 +1733,9 @@ namespace KeePass.Forms
 			return sb.ToString();
 		}
 
+		private delegate void PerformQuickFindDelegate(string strSearch,
+			string strGroupName, bool bForceShowExpired);
+
 		/// <summary>
 		/// Do a quick find. All entries of the currently opened database are searched
 		/// for a string and the results are automatically displayed in the main window.
@@ -1724,11 +1759,30 @@ namespace KeePass.Forms
 				sp.SearchInUuids = sp.SearchInGroupNames = sp.SearchInTags = true;
 			sp.SearchInPasswords = Program.Config.MainWindow.QuickFindSearchInPasswords;
 
-			if(bForceShowExpired == false)
+			if(!bForceShowExpired)
 				sp.ExcludeExpired = Program.Config.MainWindow.QuickFindExcludeExpired;
 
+			SearchUtil.SetTransformation(sp, (Program.Config.MainWindow.QuickFindDerefData ?
+				SearchUtil.StrTrfDeref : string.Empty));
+
+			StatusBarLogger sl = null;
+			bool bBlock = (strSearch.Length > 0); // Showing all is fast
+			if(bBlock)
+			{
+				Application.DoEvents(); // Finalize UI messages before blocking
+				UIBlockInteraction(true);
+				sl = CreateStatusBarLogger();
+				sl.StartLogging(KPRes.SearchingOp + "...", false);
+			}
+
 			AutoAdjustMemProtSettings(m_docMgr.ActiveDatabase, sp);
-			m_docMgr.ActiveDatabase.RootGroup.SearchEntries(sp, pg.Entries, true);
+			m_docMgr.ActiveDatabase.RootGroup.SearchEntries(sp, pg.Entries, sl);
+
+			if(bBlock)
+			{
+				sl.EndLogging();
+				UIBlockInteraction(false);
+			}
 
 			UpdateEntryList(pg, false);
 			SelectFirstEntryIfNoneSelected();
@@ -1786,7 +1840,6 @@ namespace KeePass.Forms
 
 			PwDatabase pd = m_docMgr.ActiveDatabase;
 			if((pd == null) || !pd.IsOpen) return;
-
 			if(!AppPolicy.Current.ExportNoKey)
 			{
 				if(!KeyUtil.ReAskKey(pd, true)) return;
@@ -1974,7 +2027,11 @@ namespace KeePass.Forms
 				pwOpenedDb = OpenDatabaseInternal(ioc, cmpKey);
 			}
 
-			if((pwOpenedDb == null) || !pwOpenedDb.IsOpen) return;
+			if((pwOpenedDb == null) || !pwOpenedDb.IsOpen)
+			{
+				UpdateUIState(false); // Reset status bar text
+				return;
+			}
 
 			string strName = pwOpenedDb.IOConnectionInfo.GetDisplayName();
 			m_mruList.AddItem(strName, pwOpenedDb.IOConnectionInfo.CloneDeep(), true);
@@ -2061,7 +2118,7 @@ namespace KeePass.Forms
 			}
 
 			if(Program.Config.MainWindow.MinimizeAfterOpeningDatabase)
-				this.WindowState = FormWindowState.Minimized;
+				UIUtil.SetWindowState(this, FormWindowState.Minimized);
 
 			ResetDefaultFocus(null);
 		}
@@ -2183,7 +2240,7 @@ namespace KeePass.Forms
 
 			foreach(ListViewItem lvi in m_lvEntries.Items)
 			{
-				if(((PwEntry)lvi.Tag).Uuid.EqualsValue(puSearch))
+				if(((PwListItem)lvi.Tag).Entry.Uuid.EqualsValue(puSearch))
 					return lvi;
 			}
 
@@ -2195,6 +2252,13 @@ namespace KeePass.Forms
 			Debug.Assert(pg != null); if(pg == null) return;
 			if(!AppPolicy.Try(AppPolicyId.Print)) return;
 
+			PwDatabase pd = m_docMgr.ActiveDatabase;
+			if((pd == null) || !pd.IsOpen) return;
+			if(!AppPolicy.Current.PrintNoKey)
+			{
+				if(!KeyUtil.ReAskKey(pd, true)) return;
+			}
+
 			PrintForm pf = new PrintForm();
 			pf.InitEx(pg, true, m_pListSorter.Column);
 			UIUtil.ShowDialogAndDestroy(pf);
@@ -2373,6 +2437,13 @@ namespace KeePass.Forms
 			UpdateUIState(true);
 		}
 
+		public StatusBarLogger CreateStatusBarLogger()
+		{
+			StatusBarLogger sl = new StatusBarLogger();
+			sl.SetControls(m_statusPartInfo, m_statusPartProgress);
+			return sl;
+		}
+
 		/// <summary>
 		/// Create a new warnings logger object that logs directly into
 		/// the main status bar until the first warning is shown (in that
@@ -2381,9 +2452,7 @@ namespace KeePass.Forms
 		/// <returns>Reference to the new logger object.</returns>
 		public ShowWarningsLogger CreateShowWarningsLogger()
 		{
-			StatusBarLogger sl = new StatusBarLogger();
-			sl.SetControls(m_statusPartInfo, m_statusPartProgress);
-
+			StatusBarLogger sl = CreateStatusBarLogger();
 			return new ShowWarningsLogger(sl, this);
 		}
 
@@ -2440,6 +2509,12 @@ namespace KeePass.Forms
 			{
 				OnSessionLock(null, new SessionLockEventArgs(SessionLockReason.Suspend));
 			}
+			else if((m.Msg == m_nTaskbarButtonMessage) && m_bTaskbarButtonMessage)
+			{
+				m_bTaskbarButtonMessage = false;
+				UpdateUIState(false, null); // Set overlay icon
+				m_bTaskbarButtonMessage = true;
+			}
 
 			base.WndProc(ref m);
 		}
@@ -2518,7 +2593,9 @@ namespace KeePass.Forms
 			catch(Exception) { Debug.Assert(false); return; }
 
 			PwEntry peSel = GetSelectedEntry(true);
-			if(peSel != null) AutoType.PerformIntoCurrentWindow(peSel);
+			if(peSel != null)
+				AutoType.PerformIntoCurrentWindow(peSel,
+					m_docMgr.SafeFindContainerOf(peSel));
 			else
 			{
 				EnsureVisibleForegroundWindow(true, true);
@@ -2532,12 +2609,15 @@ namespace KeePass.Forms
 			if(bUntray && IsTrayed()) MinimizeToTray(false);
 
 			if(bRestoreWindow && (this.WindowState == FormWindowState.Minimized))
-				this.WindowState = FormWindowState.Normal;
+				UIUtil.SetWindowState(this, FormWindowState.Normal);
 
 			try
 			{
-				this.BringToFront();
-				this.Activate();
+				if(this.Visible) // && (this.WindowState != FormWindowState.Minimized)
+				{
+					this.BringToFront();
+					this.Activate();
+				}
 			}
 			catch(Exception) { Debug.Assert(false); }
 		}
@@ -2642,7 +2722,6 @@ namespace KeePass.Forms
 			m_ctxEntryEdit.ShortcutKeyDisplayString = "Return";
 			m_ctxEntryDelete.ShortcutKeyDisplayString = "Del";
 			m_ctxEntrySelectAll.ShortcutKeyDisplayString = strCtrl + "+A";
-			m_ctxEntryOpenUrl.ShortcutKeyDisplayString = strCtrl + "+U";
 
 			m_ctxEntryMoveToTop.ShortcutKeyDisplayString = strAlt + "+Home";
 			m_ctxEntryMoveOneUp.ShortcutKeyDisplayString = strAlt + "+Up";
@@ -2657,6 +2736,18 @@ namespace KeePass.Forms
 			m_ctxGroupMoveToBottom.ShortcutKeyDisplayString = strAlt + "+End";
 		}
 
+		private void AssignMenuShortcutsOpt()
+		{
+			try
+			{
+				string str = KPRes.KeyboardKeyCtrl + "+U";
+				bool b = Program.Config.MainWindow.CopyUrlsInsteadOfOpening;
+				m_ctxEntryOpenUrl.ShortcutKeyDisplayString = (b ? null : str);
+				m_ctxEntryCopyUrl.ShortcutKeyDisplayString = (b ? str : null);
+			}
+			catch(Exception) { Debug.Assert(false); }
+		}
+
 		private void SaveDatabaseAs(bool bOnline, object sender, bool bCopy)
 		{
 			if(!m_docMgr.ActiveDatabase.IsOpen) return;
@@ -2849,8 +2940,10 @@ namespace KeePass.Forms
 
 			if(c == null)
 			{
+				// QuickFind must be the first choice (see e.g.
+				// the option FocusQuickFindOnUntray)
 				if(m_tbQuickFind.Visible && m_tbQuickFind.Enabled)
-					c = m_tbQuickFind.Control; // Must be the first choice
+					c = m_tbQuickFind.Control;
 				else if(m_lvEntries.Visible && m_lvEntries.Enabled)
 					c = m_lvEntries;
 				else if(m_tvGroups.Visible && m_tvGroups.Enabled)
@@ -3137,7 +3230,7 @@ namespace KeePass.Forms
 
 			if(Program.Config.MainWindow.MinimizeAfterLocking &&
 				!IsAtLeastOneFileOpen())
-				this.WindowState = FormWindowState.Minimized;
+				UIUtil.SetWindowState(this, FormWindowState.Minimized);
 		}
 
 		private void SaveAllDocuments()
@@ -3351,8 +3444,8 @@ namespace KeePass.Forms
 				// EnsureVisibleForegroundWindow(false, false); // Don't!
 
 				if(this.WindowState == FormWindowState.Minimized)
-					this.WindowState = (Program.Config.MainWindow.Maximized ?
-						FormWindowState.Maximized : FormWindowState.Normal);
+					UIUtil.SetWindowState(this, (Program.Config.MainWindow.Maximized ?
+						FormWindowState.Maximized : FormWindowState.Normal));
 				else if(IsFileLocked(null) && !UIIsAutoUnlockBlocked())
 					OnFileLock(null, EventArgs.Empty); // Unlock
 
@@ -3369,19 +3462,23 @@ namespace KeePass.Forms
 				(Program.CommandLineArgs[AppDefs.CommandLineOptions.Minimize] != null))
 			{
 				if(bFormLoading)
+					UIUtil.SetWindowState(this, FormWindowState.Minimized);
+				else
 				{
-					this.WindowState = FormWindowState.Minimized;
+					// The following isn't required anymore, because the
+					// TaskbarButtonCreated message is handled
 
 					// Set the lock overlay icon again (the first time
 					// Windows ignores the call, maybe because the window
 					// wasn't fully constructed at that time yet)
-					if(IsFileLocked(null))
-						TaskbarList.SetOverlayIcon(this,
-							Properties.Resources.LockOverlay, KPRes.Locked);
+					// if(IsFileLocked(null))
+					//	TaskbarList.SetOverlayIcon(this,
+					//		Properties.Resources.LockOverlay, KPRes.Locked);
 				}
 
 				if(Program.Config.MainWindow.MinimizeToTray) MinimizeToTray(true);
-				else if(!bFormLoading) this.WindowState = FormWindowState.Minimized;
+				else if(!bFormLoading)
+					UIUtil.SetWindowState(this, FormWindowState.Minimized);
 			}
 
 			// Remove taskbar item
@@ -3403,13 +3500,15 @@ namespace KeePass.Forms
 			}
 		}
 
-		private void SelectEntries(PwObjectList<PwEntry> lEntries, bool bDeselectOthers)
+		private void SelectEntries(PwObjectList<PwEntry> lEntries,
+			bool bDeselectOthers, bool bFocusFirst)
 		{
 			m_bBlockEntrySelectionEvent = true;
 
+			bool bFirst = true;
 			for(int i = 0; i < m_lvEntries.Items.Count; ++i)
 			{
-				PwEntry pe = (m_lvEntries.Items[i].Tag as PwEntry);
+				PwEntry pe = ((PwListItem)m_lvEntries.Items[i].Tag).Entry;
 				if(pe == null) { Debug.Assert(false); continue; }
 
 				bool bFound = false;
@@ -3418,6 +3517,13 @@ namespace KeePass.Forms
 					if(pe == peFocus)
 					{
 						m_lvEntries.Items[i].Selected = true;
+
+						if(bFirst && bFocusFirst)
+						{
+							m_lvEntries.Items[i].Focused = true;
+							bFirst = false;
+						}
+
 						bFound = true;
 						break;
 					}
@@ -3438,13 +3544,13 @@ namespace KeePass.Forms
 			if(m_lvEntries.ShowGroups == false)
 			{
 				foreach(ListViewItem lvi in m_lvEntries.Items)
-					pg.AddEntry(lvi.Tag as PwEntry, false);
+					pg.AddEntry(((PwListItem)lvi.Tag).Entry, false);
 			}
 			else // Groups
 			{
 				foreach(ListViewGroup lvg in m_lvEntries.Groups)
 					foreach(ListViewItem lvi in lvg.Items)
-						pg.AddEntry(lvi.Tag as PwEntry, false);
+						pg.AddEntry(((PwListItem)lvi.Tag).Entry, false);
 			}
 
 			return pg;
@@ -3482,13 +3588,16 @@ namespace KeePass.Forms
 
 			if(bLockUIUpdate) m_lvEntries.BeginUpdate();
 
-			for(int i = m_lvEntries.Items.Count - 1; i >= 0; --i)
+			lock(m_asyncListUpdate.ListEditSyncObject)
 			{
-				PwEntry pe = (m_lvEntries.Items[i].Tag as PwEntry);
-				Debug.Assert(pe != null);
+				for(int i = m_lvEntries.Items.Count - 1; i >= 0; --i)
+				{
+					PwEntry pe = ((PwListItem)m_lvEntries.Items[i].Tag).Entry;
+					Debug.Assert(pe != null);
 
-				if(Array.IndexOf<PwEntry>(vEntries, pe) >= 0)
-					m_lvEntries.Items.RemoveAt(i);
+					if(Array.IndexOf<PwEntry>(vEntries, pe) >= 0)
+						m_lvEntries.Items.RemoveAt(i);
+				}
 			}
 
 			// Refresh alternating item background colors
@@ -3540,7 +3649,7 @@ namespace KeePass.Forms
 			dlg.MainInstruction = KPRes.OverwriteExistingFileQuestion;
 			dlg.AddButton((int)DialogResult.Yes, KPRes.Synchronize, KPRes.FileChangedSync);
 			dlg.AddButton((int)DialogResult.No, KPRes.Overwrite, KPRes.FileChangedOverwrite);
-			dlg.AddButton((int)DialogResult.Cancel, KPRes.Cancel, KPRes.FileSaveQOpCancel);
+			dlg.AddButton((int)DialogResult.Cancel, KPRes.CancelCmd, KPRes.FileSaveQOpCancel);
 
 			DialogResult dr;
 			if(dlg.ShowDialog()) dr = (DialogResult)dlg.Result;
@@ -3704,7 +3813,7 @@ namespace KeePass.Forms
 				dlg.SetIcon(VtdCustomIcon.Question);
 				dlg.WindowTitle = PwDefs.ShortProductName;
 				dlg.AddButton((int)DialogResult.OK, KPRes.DeleteCmd, null);
-				dlg.AddButton((int)DialogResult.Cancel, KPRes.DontDeleteCmd, null);
+				dlg.AddButton((int)DialogResult.Cancel, KPRes.CancelCmd, null);
 
 				if(dlg.ShowDialog())
 				{
@@ -3782,7 +3891,7 @@ namespace KeePass.Forms
 				dlg.SetIcon(VtdCustomIcon.Question);
 				dlg.WindowTitle = PwDefs.ShortProductName;
 				dlg.AddButton((int)DialogResult.OK, KPRes.DeleteCmd, null);
-				dlg.AddButton((int)DialogResult.Cancel, KPRes.DontDeleteCmd, null);
+				dlg.AddButton((int)DialogResult.Cancel, KPRes.CancelCmd, null);
 
 				if(dlg.ShowDialog())
 				{
@@ -3832,7 +3941,7 @@ namespace KeePass.Forms
 			dlg.SetIcon(VtdCustomIcon.Question);
 			dlg.WindowTitle = PwDefs.ShortProductName;
 			dlg.AddButton((int)DialogResult.OK, KPRes.DeleteCmd, null);
-			dlg.AddButton((int)DialogResult.Cancel, KPRes.DontDeleteCmd, null);
+			dlg.AddButton((int)DialogResult.Cancel, KPRes.CancelCmd, null);
 
 			if(dlg.ShowDialog())
 			{
@@ -4080,8 +4189,13 @@ namespace KeePass.Forms
 
 			if(!bGuiToInternal) // Internal to GUI
 			{
+				m_asyncListUpdate.CancelPendingUpdatesAsync();
+
 				m_lvEntries.BeginUpdate();
-				m_lvEntries.Items.Clear();
+				lock(m_asyncListUpdate.ListEditSyncObject)
+				{
+					m_lvEntries.Items.Clear();
+				}
 				m_lvEntries.Columns.Clear();
 
 				if(Program.Config.MainWindow.EntryListColumns.Count == 0)
@@ -4150,13 +4264,23 @@ namespace KeePass.Forms
 			Program.Config.MainWindow.EntryListColumns.Add(c);
 		}
 
-		private string GetEntryFieldEx(PwEntry pe, int iColumnID, bool bFormatForDisplay)
+		private string GetEntryFieldEx(PwEntry pe, int iColumnID,
+			bool bFormatForDisplay, out bool bRequestAsync)
 		{
 			List<AceColumn> l = Program.Config.MainWindow.EntryListColumns;
-			if((iColumnID < 0) || (iColumnID >= l.Count)) { Debug.Assert(false); return string.Empty; }
+			if((iColumnID < 0) || (iColumnID >= l.Count))
+			{
+				Debug.Assert(false);
+				bRequestAsync = false;
+				return string.Empty;
+			}
 
 			AceColumn col = l[iColumnID];
-			if(bFormatForDisplay && col.HideWithAsterisks) return PwDefs.HiddenPassword;
+			if(bFormatForDisplay && col.HideWithAsterisks)
+			{
+				bRequestAsync = false;
+				return PwDefs.HiddenPassword;
+			}
 
 			string str;
 			switch(col.Type)
@@ -4203,6 +4327,31 @@ namespace KeePass.Forms
 				default: Debug.Assert(false); str = string.Empty; break;
 			}
 
+			if(Program.Config.MainWindow.EntryListShowDerefData)
+			{
+				switch(col.Type)
+				{
+					case AceColumnType.Title:
+					case AceColumnType.UserName:
+					case AceColumnType.Password:
+					case AceColumnType.Url:
+					case AceColumnType.Notes:
+					case AceColumnType.CustomString:
+						bRequestAsync = SprEngine.MightDeref(str);
+						break;
+					default: bRequestAsync = false; break;
+				}
+
+				if(!Program.Config.MainWindow.EntryListShowDerefDataAsync &&
+					bRequestAsync)
+				{
+					PwListItem pli = new PwListItem(pe);
+					str = AsyncPwListUpdate.SprCompileFn(str, pli);
+					bRequestAsync = false;
+				}
+			}
+			else bRequestAsync = false;
+
 			return str;
 		}
 
@@ -4535,5 +4684,57 @@ namespace KeePass.Forms
 			if((u & (ulong)AceUIFlags.DisableTriggers) != 0)
 				m_menuToolsTriggers.Enabled = false;
 		}
+
+		private static void OnFormLoadParallelAsync(object stateInfo)
+		{
+			try
+			{
+				string strShInstUtil = UrlUtil.GetFileDirectory(
+					WinUtil.GetExecutable(), true, false) + AppDefs.ShInstUtil;
+
+				// Unblock the application such that the user isn't
+				// prompted next time anymore
+				WinUtil.RemoveZoneIdentifier(WinUtil.GetExecutable());
+				WinUtil.RemoveZoneIdentifier(AppHelp.LocalHelpFile);
+				WinUtil.RemoveZoneIdentifier(strShInstUtil);
+			}
+			catch(Exception) { Debug.Assert(false); }
+		}
+
+		private bool IsCommandTypeInvokable(MainAppState? sContext, AppCommandType t)
+		{
+			MainAppState s = (sContext.HasValue ? sContext.Value : GetMainAppState());
+
+			if(t == AppCommandType.Window)
+				return (s.NoWindowShown && !UIIsInteractionBlocked());
+			if(t == AppCommandType.Lock)
+				return (s.NoWindowShown && !UIIsInteractionBlocked() && s.EnableLockCmd);
+
+			return false;
+		}
+
+		private void UpdateTrayState()
+		{
+			UpdateUIState(false); // Update tray lock text
+
+			ulong u = Program.Config.UI.UIFlags;
+			bool bOptions = ((u & (ulong)AceUIFlags.DisableOptions) == 0);
+
+			MainAppState s = GetMainAppState();
+
+			m_ctxTrayTray.Enabled = IsCommandTypeInvokable(s, AppCommandType.Window);
+			m_ctxTrayOptions.Enabled = (IsCommandTypeInvokable(s,
+				AppCommandType.Window) && bOptions);
+			m_ctxTrayLock.Enabled = IsCommandTypeInvokable(s, AppCommandType.Lock);
+			m_ctxTrayFileExit.Enabled = IsCommandTypeInvokable(s, AppCommandType.Window);
+		}
+
+		internal static SprContext GetEntryListSprContext(PwEntry pe,
+			PwDatabase pd)
+		{
+			SprContext ctx = new SprContext(pe, pd, SprCompileFlags.Deref);
+			ctx.ForcePlainTextPasswords = false;
+			return ctx;
+		}
 	}
 }
diff --git a/KeePass/Forms/OptionsForm.Designer.cs b/KeePass/Forms/OptionsForm.Designer.cs
index 2f94e3b..12affa6 100644
--- a/KeePass/Forms/OptionsForm.Designer.cs
+++ b/KeePass/Forms/OptionsForm.Designer.cs
@@ -75,8 +75,8 @@
 			this.m_lblRestoreHotKey = new System.Windows.Forms.Label();
 			this.m_tbGlobalAutoType = new System.Windows.Forms.TextBox();
 			this.m_tabAdvanced = new System.Windows.Forms.TabPage();
-			this.m_lvAdvanced = new KeePass.UI.CustomListViewEx();
 			this.m_btnProxy = new System.Windows.Forms.Button();
+			this.m_lvAdvanced = new KeePass.UI.CustomListViewEx();
 			((System.ComponentModel.ISupportInitialize)(this.m_bannerImage)).BeginInit();
 			this.m_tabMain.SuspendLayout();
 			this.m_tabSecurity.SuspendLayout();
@@ -612,6 +612,16 @@
 			this.m_tabAdvanced.Text = "Advanced";
 			this.m_tabAdvanced.UseVisualStyleBackColor = true;
 			// 
+			// m_btnProxy
+			// 
+			this.m_btnProxy.Location = new System.Drawing.Point(472, 279);
+			this.m_btnProxy.Name = "m_btnProxy";
+			this.m_btnProxy.Size = new System.Drawing.Size(75, 23);
+			this.m_btnProxy.TabIndex = 1;
+			this.m_btnProxy.Text = "Proxy...";
+			this.m_btnProxy.UseVisualStyleBackColor = true;
+			this.m_btnProxy.Click += new System.EventHandler(this.OnBtnProxy);
+			// 
 			// m_lvAdvanced
 			// 
 			this.m_lvAdvanced.CheckBoxes = true;
@@ -625,16 +635,6 @@
 			this.m_lvAdvanced.UseCompatibleStateImageBehavior = false;
 			this.m_lvAdvanced.View = System.Windows.Forms.View.Details;
 			// 
-			// m_btnProxy
-			// 
-			this.m_btnProxy.Location = new System.Drawing.Point(472, 279);
-			this.m_btnProxy.Name = "m_btnProxy";
-			this.m_btnProxy.Size = new System.Drawing.Size(75, 23);
-			this.m_btnProxy.TabIndex = 1;
-			this.m_btnProxy.Text = "Proxy...";
-			this.m_btnProxy.UseVisualStyleBackColor = true;
-			this.m_btnProxy.Click += new System.EventHandler(this.OnBtnProxy);
-			// 
 			// OptionsForm
 			// 
 			this.AcceptButton = this.m_btnOK;
@@ -651,7 +651,7 @@
 			this.MinimizeBox = false;
 			this.Name = "OptionsForm";
 			this.ShowInTaskbar = false;
-			this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent;
+			this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;
 			this.Text = "Options";
 			this.Load += new System.EventHandler(this.OnFormLoad);
 			this.FormClosed += new System.Windows.Forms.FormClosedEventHandler(this.OnFormClosed);
diff --git a/KeePass/Forms/OptionsForm.cs b/KeePass/Forms/OptionsForm.cs
index c0ba1d2..23bcaa4 100644
--- a/KeePass/Forms/OptionsForm.cs
+++ b/KeePass/Forms/OptionsForm.cs
@@ -48,10 +48,10 @@ namespace KeePass.Forms
 		private bool m_bBlockUIUpdate = false;
 		private bool m_bLoadingSettings = false;
 
-		private CheckedLVItemDXList m_cdxSecurityOptions = new CheckedLVItemDXList();
-		private CheckedLVItemDXList m_cdxPolicy = new CheckedLVItemDXList();
-		private CheckedLVItemDXList m_cdxGuiOptions = new CheckedLVItemDXList();
-		private CheckedLVItemDXList m_cdxAdvanced = new CheckedLVItemDXList();
+		private CheckedLVItemDXList m_cdxSecurityOptions = null;
+		private CheckedLVItemDXList m_cdxPolicy = null;
+		private CheckedLVItemDXList m_cdxGuiOptions = null;
+		private CheckedLVItemDXList m_cdxAdvanced = null;
 
 		private HotKeyControlEx m_hkGlobalAutoType = null;
 		private HotKeyControlEx m_hkSelectedAutoType = null;
@@ -102,6 +102,9 @@ namespace KeePass.Forms
 
 		private void OnFormLoad(object sender, EventArgs e)
 		{
+			// Can be invoked by tray command; don't use CenterParent
+			Debug.Assert(this.StartPosition == FormStartPosition.CenterScreen);
+
 			GlobalWindowManager.AddWindow(this);
 
 			this.Icon = Properties.Resources.KeePass;
@@ -221,32 +224,34 @@ namespace KeePass.Forms
 			m_lvSecurityOptions.Groups.Add(lvg);
 			Debug.Assert(lvg.ListView == m_lvSecurityOptions);
 
+			m_cdxSecurityOptions = new CheckedLVItemDXList(m_lvSecurityOptions);
+
 			m_cdxSecurityOptions.CreateItem(Program.Config.Security.WorkspaceLocking,
-				"LockOnWindowMinimize", m_lvSecurityOptions, lvg, KPRes.LockOnMinimize);
+				"LockOnWindowMinimize", lvg, KPRes.LockOnMinimize);
 			m_cdxSecurityOptions.CreateItem(Program.Config.Security.WorkspaceLocking,
-				"LockOnSessionSwitch", m_lvSecurityOptions, lvg, KPRes.LockOnSessionSwitch);
+				"LockOnSessionSwitch", lvg, KPRes.LockOnSessionSwitch);
 			m_cdxSecurityOptions.CreateItem(Program.Config.Security.WorkspaceLocking,
-				"LockOnSuspend", m_lvSecurityOptions, lvg, KPRes.LockOnSuspend);
+				"LockOnSuspend", lvg, KPRes.LockOnSuspend);
 			m_cdxSecurityOptions.CreateItem(Program.Config.Security.WorkspaceLocking,
-				"LockOnRemoteControlChange", m_lvSecurityOptions, lvg, KPRes.LockOnRemoteControlChange);
+				"LockOnRemoteControlChange", lvg, KPRes.LockOnRemoteControlChange);
 			m_cdxSecurityOptions.CreateItem(Program.Config.Security.WorkspaceLocking,
-				"ExitInsteadOfLockingAfterTime", m_lvSecurityOptions, lvg, KPRes.ExitInsteadOfLockingAfterTime);
+				"ExitInsteadOfLockingAfterTime", lvg, KPRes.ExitInsteadOfLockingAfterTime);
 			m_cdxSecurityOptions.CreateItem(Program.Config.Security.WorkspaceLocking,
-				"AlwaysExitInsteadOfLocking", m_lvSecurityOptions, lvg, KPRes.ExitInsteadOfLockingAlways);
+				"AlwaysExitInsteadOfLocking", lvg, KPRes.ExitInsteadOfLockingAlways);
 			m_cdxSecurityOptions.CreateItem(Program.Config.Security, "ClipboardClearOnExit",
-				m_lvSecurityOptions, lvg, KPRes.ClipboardClearOnExit);
+				lvg, KPRes.ClipboardClearOnExit);
 			m_cdxSecurityOptions.CreateItem(Program.Config.Security,
-				"UseClipboardViewerIgnoreFormat", m_lvSecurityOptions, lvg,
+				"UseClipboardViewerIgnoreFormat", lvg,
 				KPRes.ClipboardViewerIgnoreFormat + " " + KPRes.NotRecommended);
 
 			if(NativeLib.IsLibraryInstalled())
 				m_cdxSecurityOptions.CreateItem(Program.Config.Native, "NativeKeyTransformations",
-					m_lvSecurityOptions, lvg, KPRes.NativeLibUse);
+					lvg, KPRes.NativeLibUse);
 
 			m_cdxSecurityOptions.CreateItem(Program.Config.Security, "MasterKeyOnSecureDesktop",
-				m_lvSecurityOptions, lvg, KPRes.MasterKeyOnSecureDesktop);
+				lvg, KPRes.MasterKeyOnSecureDesktop);
 			m_cdxSecurityOptions.CreateItem(Program.Config.Security, "ClearKeyCommandLineParams",
-				m_lvSecurityOptions, lvg, KPRes.ClearKeyCmdLineParams);
+				lvg, KPRes.ClearKeyCmdLineParams);
 
 			m_cdxSecurityOptions.UpdateData(false);
 			m_lvSecurityOptions.Columns[0].Width = m_lvSecurityOptions.ClientRectangle.Width -
@@ -257,18 +262,22 @@ namespace KeePass.Forms
 			string strDisplayDesc)
 		{
 			ListViewItem lvi = m_cdxPolicy.CreateItem(Program.Config.Security.Policy,
-				strPropertyName, m_lvPolicy, null, strDisplayName + "*");
+				strPropertyName, null, strDisplayName + "*");
 			lvi.SubItems.Add(strDisplayDesc);
 		}
 
 		private void LoadPolicyOptions()
 		{
+			m_cdxPolicy = new CheckedLVItemDXList(m_lvPolicy);
+
 			LoadPolicyOption("Plugins", KPRes.Plugins, KPRes.PolicyPluginsDesc);
 			LoadPolicyOption("Export", KPRes.Export, KPRes.PolicyExportDesc);
 			LoadPolicyOption("ExportNoKey", KPRes.Export + " - " + KPRes.NoKeyRepeat,
 				KPRes.PolicyExportNoKeyDesc);
 			LoadPolicyOption("Import", KPRes.Import, KPRes.PolicyImportDesc);
 			LoadPolicyOption("Print", KPRes.Print, KPRes.PolicyPrintDesc);
+			LoadPolicyOption("PrintNoKey", KPRes.Print + " - " + KPRes.NoKeyRepeat,
+				KPRes.PolicyPrintNoKeyDesc);
 			LoadPolicyOption("NewFile", KPRes.NewDatabase, KPRes.PolicyNewDatabaseDesc);
 			LoadPolicyOption("SaveFile", KPRes.SaveDatabase, KPRes.PolicySaveDatabaseDesc);
 			LoadPolicyOption("AutoType", KPRes.AutoType, KPRes.PolicyAutoTypeDesc);
@@ -296,57 +305,80 @@ namespace KeePass.Forms
 			m_lvGuiOptions.Groups.Add(lvg);
 			Debug.Assert(lvg.ListView == m_lvGuiOptions);
 
+			m_cdxGuiOptions = new CheckedLVItemDXList(m_lvGuiOptions);
+
 			m_cdxGuiOptions.CreateItem(Program.Config.MainWindow, "CloseButtonMinimizesWindow",
-				m_lvGuiOptions, lvg, KPRes.CloseButtonMinimizes);
+				lvg, KPRes.CloseButtonMinimizes);
 			m_cdxGuiOptions.CreateItem(Program.Config.MainWindow, "MinimizeToTray",
-				m_lvGuiOptions, lvg, KPRes.MinimizeToTray);
+				lvg, KPRes.MinimizeToTray);
 			m_cdxGuiOptions.CreateItem(Program.Config.UI.TrayIcon, "ShowOnlyIfTrayed",
-				m_lvGuiOptions, lvg, KPRes.ShowTrayOnlyIfTrayed);
+				lvg, KPRes.ShowTrayOnlyIfTrayed);
 			m_cdxGuiOptions.CreateItem(Program.Config.MainWindow, "ShowFullPathInTitle",
-				m_lvGuiOptions, lvg, KPRes.ShowFullPathInTitleBar);
+				lvg, KPRes.ShowFullPathInTitleBar);
 			m_cdxGuiOptions.CreateItem(Program.Config.MainWindow, "DropToBackAfterClipboardCopy",
-				m_lvGuiOptions, lvg, KPRes.DropToBackOnCopy);
+				lvg, KPRes.DropToBackOnCopy);
 			m_cdxGuiOptions.CreateItem(Program.Config.MainWindow, "MinimizeAfterClipboardCopy",
-				m_lvGuiOptions, lvg, KPRes.MinimizeAfterCopy);
+				lvg, KPRes.MinimizeAfterCopy);
 			m_cdxGuiOptions.CreateItem(Program.Config.MainWindow, "MinimizeAfterLocking",
-				m_lvGuiOptions, lvg, KPRes.MinimizeAfterLocking);
+				lvg, KPRes.MinimizeAfterLocking);
 			m_cdxGuiOptions.CreateItem(Program.Config.MainWindow, "MinimizeAfterOpeningDatabase",
-				m_lvGuiOptions, lvg, KPRes.MinimizeAfterOpeningDatabase);
-			m_cdxGuiOptions.CreateItem(Program.Config.MainWindow, "QuickFindSearchInPasswords",
-				m_lvGuiOptions, lvg, KPRes.QuickSearchInPasswords);
-			m_cdxGuiOptions.CreateItem(Program.Config.MainWindow, "QuickFindExcludeExpired",
-				m_lvGuiOptions, lvg, KPRes.QuickSearchExcludeExpired);
-			m_cdxGuiOptions.CreateItem(Program.Config.MainWindow, "FocusResultsAfterQuickFind",
-				m_lvGuiOptions, lvg, KPRes.FocusResultsAfterQuickFind);
-			m_cdxGuiOptions.CreateItem(Program.Config.MainWindow, "FocusQuickFindOnUntray",
-				m_lvGuiOptions, lvg, KPRes.FocusQuickFindOnUntray);
+				lvg, KPRes.MinimizeAfterOpeningDatabase);
 			m_cdxGuiOptions.CreateItem(Program.Config.MainWindow, "DisableSaveIfNotModified",
-				m_lvGuiOptions, lvg, KPRes.DisableSaveIfNotModified);
+				lvg, KPRes.DisableSaveIfNotModified);
 
 			lvg = new ListViewGroup(KPRes.EntryList);
 			m_lvGuiOptions.Groups.Add(lvg);
 			// m_cdxGuiOptions.CreateItem(Program.Config.MainWindow, "ShowGridLines",
 			//	m_lvGuiOptions, lvg, KPRes.ShowGridLines);
 			m_cdxGuiOptions.CreateItem(Program.Config.MainWindow, "EntryListAutoResizeColumns",
-				m_lvGuiOptions, lvg, KPRes.EntryListAutoResizeColumns);
+				lvg, KPRes.EntryListAutoResizeColumns);
 			m_cdxGuiOptions.CreateItem(Program.Config.MainWindow, "EntryListAlternatingBgColors",
-				m_lvGuiOptions, lvg, KPRes.AlternatingBgColors);
+				lvg, KPRes.AlternatingBgColors);
 			m_cdxGuiOptions.CreateItem(Program.Config.MainWindow, "CopyUrlsInsteadOfOpening",
-				m_lvGuiOptions, lvg, KPRes.CopyUrlsInsteadOfOpening);
+				lvg, KPRes.CopyUrlsInsteadOfOpening);
+
+			if(!Program.Config.MainWindow.EntryListShowDerefData)
+			{
+				Debug.Assert(!Program.Config.MainWindow.EntryListShowDerefDataAsync);
+				Program.Config.MainWindow.EntryListShowDerefDataAsync = false;
+			}
+			ListViewItem lviDeref = m_cdxGuiOptions.CreateItem(
+				Program.Config.MainWindow, "EntryListShowDerefData",
+				lvg, KPRes.ShowDerefData + " (" + KPRes.Slow + ")");
+			ListViewItem lviDerefAsync = m_cdxGuiOptions.CreateItem(
+				Program.Config.MainWindow, "EntryListShowDerefDataAsync",
+				lvg, KPRes.ShowDerefDataAsync + " (" + KPRes.IncompatibleWithSorting + ")");
+			m_cdxGuiOptions.AddLink(lviDeref, lviDerefAsync, CheckItemLinkType.UncheckedUnchecked);
+			m_cdxGuiOptions.AddLink(lviDerefAsync, lviDeref, CheckItemLinkType.CheckedChecked);
 
 			lvg = new ListViewGroup(KPRes.EntryView);
 			m_lvGuiOptions.Groups.Add(lvg);
 			m_cdxGuiOptions.CreateItem(Program.Config.MainWindow.EntryView, "HideProtectedCustomStrings",
-				m_lvGuiOptions, lvg, KPRes.EntryViewHideProtectedCustomStrings);
+				lvg, KPRes.EntryViewHideProtectedCustomStrings);
+
+			lvg = new ListViewGroup(KPRes.QuickSearchTb);
+			m_lvGuiOptions.Groups.Add(lvg);
+			m_cdxGuiOptions.CreateItem(Program.Config.MainWindow, "QuickFindSearchInPasswords",
+				lvg, KPRes.QuickSearchInPwFields);
+			m_cdxGuiOptions.CreateItem(Program.Config.MainWindow, "QuickFindExcludeExpired",
+				lvg, KPRes.QuickSearchExclExpired);
+			m_cdxGuiOptions.CreateItem(Program.Config.MainWindow, "QuickFindDerefData",
+				lvg, KPRes.QuickSearchDerefData + " (" + KPRes.Slow + ")");
+			m_cdxGuiOptions.CreateItem(Program.Config.MainWindow, "FocusResultsAfterQuickFind",
+				lvg, KPRes.FocusResultsAfterQuickSearch);
+			m_cdxGuiOptions.CreateItem(Program.Config.MainWindow, "FocusQuickFindOnRestore",
+				lvg, KPRes.FocusQuickFindOnRestore);
+			m_cdxGuiOptions.CreateItem(Program.Config.MainWindow, "FocusQuickFindOnUntray",
+				lvg, KPRes.FocusQuickFindOnUntray);
 
 			lvg = new ListViewGroup(KPRes.Advanced);
 			m_lvGuiOptions.Groups.Add(lvg);
 			m_cdxGuiOptions.CreateItem(Program.Config.UI, "UseCustomToolStripRenderer",
-				m_lvGuiOptions, lvg, KPRes.UseCustomToolStripRenderer);
+				lvg, KPRes.UseCustomToolStripRenderer);
 			m_cdxGuiOptions.CreateItem(Program.Config.UI, "ForceSystemFontUnix",
-				m_lvGuiOptions, lvg, KPRes.ForceSystemFontUnix);
+				lvg, KPRes.ForceSystemFontUnix);
 			m_cdxGuiOptions.CreateItem(Program.Config.UI, "ShowDbMntncResultsDialog",
-				m_lvGuiOptions, lvg, KPRes.DbMntncResults);
+				lvg, KPRes.DbMntncResults);
 
 			m_cdxGuiOptions.UpdateData(false);
 			m_lvGuiOptions.Columns[0].Width = m_lvGuiOptions.ClientRectangle.Width -
@@ -388,61 +420,73 @@ namespace KeePass.Forms
 		{
 			m_lvAdvanced.Columns.Add(string.Empty, 200); // Resize below
 
+			m_cdxAdvanced = new CheckedLVItemDXList(m_lvAdvanced);
+
 			ListViewGroup lvg = new ListViewGroup(KPRes.StartAndExit);
 			m_lvAdvanced.Groups.Add(lvg);
 			m_cdxAdvanced.CreateItem(Program.Config.Application.Start, "OpenLastFile",
-				m_lvAdvanced, lvg, KPRes.AutoRememberOpenLastFile);
+				lvg, KPRes.AutoRememberOpenLastFile);
 			m_cdxAdvanced.CreateItem(Program.Config.Integration, "LimitToSingleInstance",
-				m_lvAdvanced, lvg, KPRes.LimitSingleInstance);
+				lvg, KPRes.LimitSingleInstance);
 			m_cdxAdvanced.CreateItem(Program.Config.Application.Start, "CheckForUpdate",
-				m_lvAdvanced, lvg, KPRes.CheckForUpdAtStart);
+				lvg, KPRes.CheckForUpdAtStart);
 			m_cdxAdvanced.CreateItem(Program.Config.Application.Start, "MinimizedAndLocked",
-				m_lvAdvanced, lvg, KPRes.StartMinimizedAndLocked);
+				lvg, KPRes.StartMinimizedAndLocked);
 			m_cdxAdvanced.CreateItem(Program.Config.Application.FileClosing, "AutoSave",
-				m_lvAdvanced, lvg, KPRes.AutoSaveAtExit);
+				lvg, KPRes.AutoSaveAtExit);
 
 			lvg = new ListViewGroup(KPRes.AfterDatabaseOpen);
 			m_lvAdvanced.Groups.Add(lvg);
 			m_cdxAdvanced.CreateItem(Program.Config.Application.FileOpening, "ShowExpiredEntries",
-				m_lvAdvanced, lvg, KPRes.AutoShowExpiredEntries);
+				lvg, KPRes.AutoShowExpiredEntries);
 			m_cdxAdvanced.CreateItem(Program.Config.Application.FileOpening, "ShowSoonToExpireEntries",
-				m_lvAdvanced, lvg, KPRes.AutoShowSoonToExpireEntries);
+				lvg, KPRes.AutoShowSoonToExpireEntries);
 
 			lvg = new ListViewGroup(KPRes.AutoType);
 			m_lvAdvanced.Groups.Add(lvg);
 			m_cdxAdvanced.CreateItem(Program.Config.Integration, "AutoTypeMatchByTitle",
-				m_lvAdvanced, lvg, KPRes.AutoTypeMatchByTitle);
+				lvg, KPRes.AutoTypeMatchByTitle);
+			m_cdxAdvanced.CreateItem(Program.Config.Integration, "AutoTypeMatchByUrlInTitle",
+				lvg, KPRes.AutoTypeMatchByUrlInTitle);
 			m_cdxAdvanced.CreateItem(Program.Config.Integration, "AutoTypePrependInitSequenceForIE",
-				m_lvAdvanced, lvg, KPRes.AutoTypePrependInitSeqForIE);
+				lvg, KPRes.AutoTypePrependInitSeqForIE);
 			m_cdxAdvanced.CreateItem(Program.Config.Integration, "AutoTypeReleaseAltWithKeyPress",
-				m_lvAdvanced, lvg, KPRes.AutoTypeReleaseAltWithKeyPress);
+				lvg, KPRes.AutoTypeReleaseAltWithKeyPress);
 			m_cdxAdvanced.CreateItem(Program.Config.Integration, "AutoTypeCancelOnWindowChange",
-				m_lvAdvanced, lvg, KPRes.AutoTypeCancelOnWindowChange);
+				lvg, KPRes.AutoTypeCancelOnWindowChange);
 
 			lvg = new ListViewGroup(KPRes.Advanced);
 			m_lvAdvanced.Groups.Add(lvg);
-			m_cdxAdvanced.CreateItem(Program.Config.Integration, "SearchKeyFiles",
-				m_lvAdvanced, lvg, KPRes.SearchKeyFiles);
-			m_cdxAdvanced.CreateItem(Program.Config.Integration, "SearchKeyFilesOnRemovableMedia",
-				m_lvAdvanced, lvg, KPRes.SearchKeyFilesAlsoOnRemovable);
+
+			if(!Program.Config.Integration.SearchKeyFiles)
+				Program.Config.Integration.SearchKeyFilesOnRemovableMedia = false;
+			ListViewItem lviSearch = m_cdxAdvanced.CreateItem(
+				Program.Config.Integration, "SearchKeyFiles",
+				lvg, KPRes.SearchKeyFiles);
+			ListViewItem lviSearchRmv = m_cdxAdvanced.CreateItem(
+				Program.Config.Integration, "SearchKeyFilesOnRemovableMedia",
+				lvg, KPRes.SearchKeyFilesAlsoOnRemovable);
+			m_cdxAdvanced.AddLink(lviSearch, lviSearchRmv, CheckItemLinkType.UncheckedUnchecked);
+			m_cdxAdvanced.AddLink(lviSearchRmv, lviSearch, CheckItemLinkType.CheckedChecked);
+
 			m_cdxAdvanced.CreateItem(Program.Config.Defaults, "RememberKeySources",
-				m_lvAdvanced, lvg, KPRes.RememberKeySources);
+				lvg, KPRes.RememberKeySources);
 			m_cdxAdvanced.CreateItem(Program.Config.UI.Hiding, "SeparateHidingSettings",
-				m_lvAdvanced, lvg, KPRes.RememberHidingSettings);
+				lvg, KPRes.RememberHidingSettings);
 			m_cdxAdvanced.CreateItem(Program.Config.UI.Hiding, "UnhideButtonAlsoUnhidesSource",
-				m_lvAdvanced, lvg, KPRes.UnhideSourceCharactersToo);
+				lvg, KPRes.UnhideSourceCharactersToo);
 			m_cdxAdvanced.CreateItem(Program.Config.Application, "VerifyWrittenFileAfterSaving",
-				m_lvAdvanced, lvg, KPRes.VerifyWrittenFileAfterSave);
+				lvg, KPRes.VerifyWrittenFileAfterSave);
 			m_cdxAdvanced.CreateItem(Program.Config.Application, "UseTransactedFileWrites",
-				m_lvAdvanced, lvg, KPRes.UseTransactedDatabaseWrites);
+				lvg, KPRes.UseTransactedDatabaseWrites);
 			m_cdxAdvanced.CreateItem(Program.Config.Defaults, "TanExpiresOnUse",
-				m_lvAdvanced, lvg, KPRes.TanExpiresOnUse);
+				lvg, KPRes.TanExpiresOnUse);
 			m_cdxAdvanced.CreateItem(Program.Config.Defaults, "RecycleBinCollapse",
-				m_lvAdvanced, lvg, KPRes.RecycleBinCollapse);
+				lvg, KPRes.RecycleBinCollapse);
 			m_cdxAdvanced.CreateItem(Program.Config.UI, "SecureDesktopPlaySound",
-				m_lvAdvanced, lvg, KPRes.SecDeskPlaySound);
+				lvg, KPRes.SecDeskPlaySound);
 			m_cdxAdvanced.CreateItem(Program.Config.UI, "OptimizeForScreenReader",
-				m_lvAdvanced, lvg, KPRes.OptimizeForScreenReader);
+				lvg, KPRes.OptimizeForScreenReader);
 
 			m_cdxAdvanced.UpdateData(false);
 			m_lvAdvanced.Columns[0].Width = m_lvAdvanced.ClientRectangle.Width -
@@ -531,6 +575,11 @@ namespace KeePass.Forms
 			int nTab = m_tabMain.SelectedIndex;
 			if((nTab >= 0) && (nTab < m_tabMain.TabPages.Count))
 				Program.Config.Defaults.OptionsTabIndex = (uint)nTab;
+
+			m_cdxSecurityOptions.Release();
+			m_cdxPolicy.Release();
+			m_cdxGuiOptions.Release();
+			m_cdxAdvanced.Release();
 		}
 
 		private static void ChangeHotKey(ref Keys kPrevHK, HotKeyControlEx hkControl,
diff --git a/KeePass/Forms/PrintForm.Designer.cs b/KeePass/Forms/PrintForm.Designer.cs
index 12d1d8f..b528a18 100644
--- a/KeePass/Forms/PrintForm.Designer.cs
+++ b/KeePass/Forms/PrintForm.Designer.cs
@@ -505,7 +505,7 @@
 			this.m_btnOK.Name = "m_btnOK";
 			this.m_btnOK.Size = new System.Drawing.Size(75, 23);
 			this.m_btnOK.TabIndex = 0;
-			this.m_btnOK.Text = "&Print";
+			this.m_btnOK.Text = "&Print...";
 			this.m_btnOK.UseVisualStyleBackColor = true;
 			this.m_btnOK.Click += new System.EventHandler(this.OnBtnOK);
 			// 
diff --git a/KeePass/Forms/PrintForm.cs b/KeePass/Forms/PrintForm.cs
index 9f323ea..9012952 100644
--- a/KeePass/Forms/PrintForm.cs
+++ b/KeePass/Forms/PrintForm.cs
@@ -31,6 +31,7 @@ using KeePass.UI;
 using KeePass.Resources;
 
 using KeePassLib;
+using KeePassLib.Collections;
 using KeePassLib.Security;
 using KeePassLib.Delegates;
 using KeePassLib.Resources;
@@ -147,7 +148,7 @@ namespace KeePass.Forms
 
 			if(m_bPrintMode)
 			{
-				try { m_wbMain.Print(); } // Throws in Mono 1.2.6+
+				try { m_wbMain.ShowPrintDialog(); } // Throws in Mono 1.2.6+
 				catch(NotImplementedException)
 				{
 					MessageService.ShowWarning(KLRes.FrameworkNotImplExcp);
@@ -351,14 +352,17 @@ namespace KeePass.Forms
 
 					if(bAutoType)
 					{
-						foreach(KeyValuePair<string, string> kvp in pe.AutoType.WindowSequencePairs)
-							WriteDetailsLine(sb, KPRes.AutoType, kvp.Key + ": " + kvp.Value, bSmallMono, bMonoPasswords, strFontInit, strFontExit);
+						foreach(AutoTypeAssociation a in pe.AutoType.Associations)
+							WriteDetailsLine(sb, KPRes.AutoType, a.WindowName +
+								": " + a.Sequence, bSmallMono, bMonoPasswords,
+								strFontInit, strFontExit);
 					}
 
 					foreach(KeyValuePair<string, ProtectedString> kvp in pe.Strings)
 					{
 						if(bCustomStrings && !PwDefs.IsStandardField(kvp.Key))
-							WriteDetailsLine(sb, kvp, bSmallMono, bMonoPasswords, strFontInit, strFontExit);
+							WriteDetailsLine(sb, kvp, bSmallMono, bMonoPasswords,
+								strFontInit, strFontExit);
 					}
 
 					sb.AppendLine(@"<tr><td> </td></tr>");
diff --git a/KeePass/Forms/PrintForm.resx b/KeePass/Forms/PrintForm.resx
index 0e97d2d..5c542b5 100644
--- a/KeePass/Forms/PrintForm.resx
+++ b/KeePass/Forms/PrintForm.resx
@@ -124,42 +124,42 @@
     <value>
         AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj0yLjAuMC4w
         LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAACZTeXN0
-        ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAAAW
+        ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAAAS
         CAAAAk1TRnQBSQFMAgEBAgEAAQQBAAEEAQABEAEAARABAAT/ASEBAAj/AUIBTQE2BwABNgMAASgDAAFA
-        AwABEAMAAQEBAAEgBgABEEIAAxIBGQNTAaoDVAGrAx0BKiwAAyMBMwFkAkIB7AFZAlYBvgMSARmwAAMU
-        ARsBYAJWAdYBGwGAAd8B/wEnAW4BsAH/A1QBqygAAyYBOQFiAkUB6QHyAucB/wHaAtAB/wFZAlYBwgMS
-        ARmoAAMSARkBXgJWAdUBFAF1Ae0B/wFIAdsC/wFPAbQB6gH/A1MBqiQAAycBOwFkAkoB5wHqAt8B/wHs
-        AuIB/wHmAtkB/wHcAtUB/wFbAlgBxJQAAwMBBAMBAQIIAAMQARYBXgJVAdgBFQF2AfEB/wFHAdUC/wFY
-        AccB8gH/AV0CUwHXAxUBHSAAAyQBNgFkAkIB7AHpAtwB/wH1Au0B/wHhAtgB/wHkAtkB/wH8AvcB/wFh
-        Aj4B7owAAzQEVAGvAVwCVwHRAV4CWAHOAVICUQGhAygBPAFWAlUBtgE/AY4B9AH/AUUB1AL/AVcByAHz
-        Af8BXgJWAdUDFAEbIAADJAE1AWQCQwHsAesC5AH/AfUC7QH/AeoC4gH/AfsC+AH/AfYC9AH/AWQCQwHs
-        AyYBOIQAAwwBEANVAbIBbwFFAUYB+gGoAaUBoAH/AbYBsAGpAf8BowGfAZgB/wGAAXcBdQH/AV8CMgHz
-        AWQBRQFZAfwBywH0AfUB/wFqAccB+AH/AV4CVQHYAxUBHSAAAyQBNgFfAkUB6AHrAuYF/wH4AvYB/wH6
-        AvYB/wHyAu8B/wFkAkoB5wMnATuEAAMEAQYBWgJXAcUBtwGzAa8B/wH1AekB2AL/AfMB3wL/AfUB4gL/
-        AfQB4AH/AecB3gHLAf8BqAGgAZcB/wGmAaQBmAH/AXMBUwFgAfwBVgJVAbQDDwEUGAADGgElAyoBQQM4
-        AVwBZQJMAeUB7gLoDf8B8QLuAf8BYgJFAekDJgE5iAADSAGGAbUBsQGuAv8B8wHbAv8B8gHZAv8B8AHY
-        Av8B7wHYAv8B8AHZAv8B9wHgAf8B+gHsAdQB/wGkAZwBkAH/AVICLgH0AyUBNxQAAxYBHwNUAasBZAJK
-        AecBZQI9AfABagJBAfkB4ALWDf8B7wLrAf8BZAJDAewDIwEzjAABXwJRAeAB9AHlAdMC/wHtAc4C/wHo
-        AcwC/wHlAccC/wHlAccC/wHmAcgC/wHnAc0C/wH1AdsB/wHgAdABtwH/AWQBYgFfAf8DUQGgEAADFQEd
-        AVoCVgHTAccCuAH/AfEC5QH/AfkC8QH/AfsC9AH/AewC5QH/AewC5QX/AfIC7QH/AWMCRQHrAyUBN5AA
-        AYECRwH5Af8B6AHLAv8B3wG7Av8B2gGyAv8B1gGqAv8B1QGpAv8B1wGsAv8B2wG0Av8B6AHHAf8B/QHl
-        AcUB/wGKAoEB/wFcAlgBzwMDAQQMAANQAZoBvAKvAf8B6QLaAf8B6QLdAf8B9ALqAf8B8wLuAf8B9gL0
-        Af8B7gLnAf8B5gLfAf8BXwJRAeADJwE7lAABfAFsAWoB/AH/AdwBtwL/Ac8BngL/Ac0BmQL/Ac0BmQL/
-        Ac0BmgL/AcwBmQL/Ac0BmgL/AdcBqQL/Ad0BtAH/AZcBhwGBAf8BXAJXAdEDAwEEDAABYwI+Ae4B3ALJ
-        Af8B3QLNAf8BvQKvAf8BnwKVAf8B3wLUAf8B8wLvAf8B+wL2Af8BZQI5AfQDNAFUmAABawI7AfMB/wHX
-        AbIC/wHLAZQC/wHSAaQC/wHVAakC/wHWAasC/wHTAagC/wHPAZ8C/wHTAZ0B/wH3AccBmAH/AYICgQH/
-        A1QBrxAAAW0COQH3Ae8C3AH/AcACsgH/A1UBtQFAAj8BbwGiApkB/wH0AusB/wH4AvEB/wFnAjwB8gMq
-        AUGYAAFaAlcBxQHtAdABvgL/AdEBogL/AeABuwL/AeIBwwL/AeEBwgL/AeABvwL/AeABugL/AdgBpAH/
-        AdcBrAGJAf8BXwE0ATYB+wE1AjQBVRAAAWQCQwHsAcgCugH/AVUCUwGwAxYBHgNVAbIBwAK0Af8B6ALc
-        Af8B8ALnAf8BZAJGAesDHAEnmAADLQFFAXECOwH3AfkBzwG3Av8B1gG1Av8B6QHSAv8B8AHbAv8B6wHT
-        Af8B/gHbAbgB/wHrAboBlwH/AY8BggGBAf8BVgJVAbMUAANCAXQBUQJPAZwDHwEtA1UBsgHAArAB/wHe
-        AswB/wHoAtoB/wHOAsEB/wNTAaqgAAM/AW0BZAI2AfYB4gHAAbIB/wHyAcUBsAH/AfQByAG0Af8B7QG+
-        AakB/wHVAawBmQH/AZIBhwGEAf8BWgJXAcUDDwEUHAABUQJPAZwBxQK3Af8B7wLdAf8B3gLLAf8BxAK3
-        Af8BYAJXAdQDFQEdpAABLAIrAUMBWwJYAcQBZwI8AfIBigFZAVcB+wF4Aj4B+AFgAlIB3gNIAYQDBgEI
-        IAADQgF2AWQCSgHnAW0COQH3AWQCQwHsA04BmAMUARygAAFCAU0BPgcAAT4DAAEoAwABQAMAARADAAEB
-        AQABAQUAAYAXAAP/AQAB/wHwAf8B4QQAAf8B4AH/AcAEAAH/AcAB/wGABAAB+QGAAf8FAAHgAQEB/gUA
-        AYABAwH8AQEFAAEHAeABAwUAAQ8BgAEHBQABDwEAAQ8FAAEHAQABHwUAAQcBAAE/BQABDwEAAT8FAAEP
-        AQABPwUAAR8BAAF/BAABgAEfAcABfwQAAcABPwHAAf8EAAs=
+        AwABEAMAAQEBAAEgBgABEEIAAxIBGQNTAaoDVAGrAx0BKiwAAyMBMwFkAkYB7AFZAlYBvgMSARmwAAMU
+        ARsBYAJXAdYBGgGAAd8B/wEmAW0BsAH/A1QBqygAAyYBOQFiAkgB6QHyAucB/wHaAtAB/wFZAlcBwgMS
+        ARmoAAMSARkBXgJZAdUBEwF0Ae0B/wFHAdsC/wFOAbQB6gH/A1MBqiQAAycBOwFkAk0B5wHqAt8B/wHs
+        AuIB/wHmAtkB/wHcAtUB/wFbAlkBxJQAAwMBBAMBAQIIAAMQARYBXgJWAdgBFAF1AfEB/wFGAdUC/wFX
+        AccB8gH/AV0CVgHXAxUBHSAAAyQBNgFkAkYB7AHpAtwB/wH1Au0B/wHhAtgB/wHkAtkB/wH8AvcB/wFh
+        AkIB7owAAzQEVAGvAVwCWAHRAV4CWQHOAVICUQGhAygBPANWAbYBPgGOAfQB/wFEAdQC/wFWAcgB8wH/
+        AV4CWQHVAxQBGyAAAyQBNQFkAkYB7AHrAuQB/wH1Au0B/wHqAuIB/wH7AvgB/wH2AvQB/wFkAkYB7AMm
+        ATiEAAMMARADVQGyAW4BRgFHAfoBqAGlAaAB/wG2AbABqQH/AaMBnwGYAf8BgAF2AXQB/wFfAjcB8wFj
+        AUMBWAH8AcsB9AH1Af8BaQHHAfgB/wFeAlYB2AMVAR0gAAMkATYBXwJKAegB6wLmBf8B+AL2Af8B+gL2
+        Af8B8gLvAf8BZAJNAecDJwE7hAADBAEGAVoCVwHFAbcBswGvAf8B9QHpAdgC/wHzAd8C/wH1AeIC/wH0
+        AeAB/wHnAd4BywH/AagBoAGXAf8BpgGkAZgB/wFyAVEBXwH8AVYCVQG0Aw8BFBgAAxoBJQMqAUEDOAFc
+        AWUCTwHlAe4C6A3/AfEC7gH/AWICSAHpAyYBOYgAA0gBhgG1AbEBrgL/AfMB2wL/AfIB2QL/AfAB2AL/
+        Ae8B2AL/AfAB2QL/AfcB4AH/AfoB7AHUAf8BpAGcAZAB/wFSAjEB9AMlATcUAAMWAR8DVAGrAWQCTQHn
+        AWMCPwHwAWoCQQH5AeAC1g3/Ae8C6wH/AWQCRgHsAyMBM4wAAV8CVAHgAfQB5QHTAv8B7QHOAv8B6AHM
+        Av8B5QHHAv8B5QHHAv8B5gHIAv8B5wHNAv8B9QHbAf8B4AHQAbcB/wFjAWEBXgH/A1EBoBAAAxUBHQFa
+        AlcB0wHHArgB/wHxAuUB/wH5AvEB/wH7AvQB/wHsAuUB/wHsAuUF/wHyAu0B/wFiAkoB6wMlATeQAAGA
+        AkcB+QH/AegBywL/Ad8BuwL/AdoBsgL/AdYBqgL/AdUBqQL/AdcBrAL/AdsBtAL/AegBxwH/Af0B5QHF
+        Af8BigKBAf8BXAJZAc8DAwEEDAADUAGaAbwCrwH/AekC2gH/AekC3QH/AfQC6gH/AfMC7gH/AfYC9AH/
+        Ae4C5wH/AeYC3wH/AV8CVAHgAycBO5QAAXsBawFpAfwB/wHcAbcC/wHPAZ4C/wHNAZkC/wHNAZkC/wHN
+        AZoC/wHMAZkC/wHNAZoC/wHXAakC/wHdAbQB/wGXAYcBgQH/AVwCWAHRAwMBBAwAAWECQgHuAdwCyQH/
+        Ad0CzQH/Ab0CrwH/AZ8ClQH/Ad8C1AH/AfMC7wH/AfsC9gH/AWUCPQH0AzQBVJgAAWoCPQHzAf8B1wGy
+        Av8BywGUAv8B0gGkAv8B1QGpAv8B1gGrAv8B0wGoAv8BzwGfAv8B0wGdAf8B9wHHAZgB/wGCAoEB/wNU
+        Aa8QAAFtAjoB9wHvAtwB/wHAArIB/wNVAbUBQAI/AW8BogKZAf8B9ALrAf8B+ALxAf8BZwJAAfIDKgFB
+        mAABWgJXAcUB7QHQAb4C/wHRAaIC/wHgAbsC/wHiAcMC/wHhAcIC/wHgAb8C/wHgAboC/wHYAaQB/wHX
+        AawBiQH/AV8BMwE1AfsBNQI0AVUQAAFkAkYB7AHIAroB/wFVAlMBsAMWAR4DVQGyAcACtAH/AegC3AH/
+        AfAC5wH/AWMCSwHrAxwBJ5gAAy0BRQFuAjwB9wH5Ac8BtwL/AdYBtQL/AekB0gL/AfAB2wL/AesB0wH/
+        Af4B2wG4Af8B6wG6AZcB/wGPAYIBgQH/A1YBsxQAA0IBdAFRAk8BnAMfAS0DVQGyAcACsAH/Ad4CzAH/
+        AegC2gH/Ac4CwQH/A1MBqqAAAz8BbQFiAjcB9gHiAcABsgH/AfIBxQGwAf8B9AHIAbQB/wHtAb4BqQH/
+        AdUBrAGZAf8BkgGHAYQB/wFaAlcBxQMPARQcAAFRAk8BnAHFArcB/wHvAt0B/wHeAssB/wHEArcB/wFg
+        AlgB1AMVAR2kAAEsAisBQwFbAlkBxAFnAkAB8gGJAVkBVwH7AXcCPgH4AWACVAHeA0gBhAMGAQggAANC
+        AXYBZAJNAecBbQI6AfcBZAJGAewDTgGYAxQBHKAAAUIBTQE+BwABPgMAASgDAAFAAwABEAMAAQEBAAEB
+        BQABgBcAA/8BAAH/AfAB/wHhBAAB/wHgAf8BwAQAAf8BwAH/AYAEAAH5AYAB/wUAAeABAQH+BQABgAED
+        AfwBAQUAAQcB4AEDBQABDwGAAQcFAAEPAQABDwUAAQcBAAEfBQABBwEAAT8FAAEPAQABPwUAAQ8BAAE/
+        BQABHwEAAX8EAAGAAR8BwAF/BAABwAE/AcAB/wQACw==
 </value>
   </data>
 </root>
\ No newline at end of file
diff --git a/KeePass/Forms/PwEntryForm.cs b/KeePass/Forms/PwEntryForm.cs
index b79f7a2..775f9df 100644
--- a/KeePass/Forms/PwEntryForm.cs
+++ b/KeePass/Forms/PwEntryForm.cs
@@ -99,8 +99,8 @@ namespace KeePass.Forms
 					return true;
 				}
 
-				return !m_pwEntry.EqualsEntry(m_pwInitialEntry, false, true, true,
-					false, false);
+				return !m_pwEntry.EqualsEntry(m_pwInitialEntry, false, true,
+					true, false, false, MemProtCmpMode.CustomOnly);
 			}
 		}
 
@@ -418,7 +418,7 @@ namespace KeePass.Forms
 
 			int nWidth = m_lvAutoType.ClientRectangle.Width / 2;
 			m_lvAutoType.Columns.Add(KPRes.TargetWindow, nWidth);
-			m_lvAutoType.Columns.Add(KPRes.KeystrokeSequence, nWidth);
+			m_lvAutoType.Columns.Add(KPRes.Sequence, nWidth);
 
 			UpdateAutoTypeList();
 
@@ -439,10 +439,10 @@ namespace KeePass.Forms
 			m_lvAutoType.Items.Clear();
 
 			string strDefault = "(" + KPRes.Default + ")";
-			foreach(KeyValuePair<string, string> kvp in m_atConfig.WindowSequencePairs)
+			foreach(AutoTypeAssociation a in m_atConfig.Associations)
 			{
-				ListViewItem lvi = m_lvAutoType.Items.Add(kvp.Key, (int)PwIcon.List);
-				lvi.SubItems.Add((kvp.Value.Length > 0) ? kvp.Value : strDefault);
+				ListViewItem lvi = m_lvAutoType.Items.Add(a.WindowName, (int)PwIcon.List);
+				lvi.SubItems.Add((a.Sequence.Length > 0) ? a.Sequence : strDefault);
 			}
 		}
 
@@ -528,7 +528,7 @@ namespace KeePass.Forms
 			m_clrNormalBackColor = m_tbPassword.BackColor;
 			m_dynGenProfiles = new DynamicMenu(m_ctxPwGenProfiles.DropDownItems);
 			m_dynGenProfiles.MenuClick += this.OnProfilesDynamicMenuClick;
-			m_ctxNotes.Attach(m_rtNotes);
+			m_ctxNotes.Attach(m_rtNotes, this);
 
 			string strTitle = string.Empty, strDesc = string.Empty;
 			if(m_pwEditMode == PwEditMode.AddNewEntry)
@@ -757,7 +757,7 @@ namespace KeePass.Forms
 			m_pwEntry.Touch(true, false); // Touch *after* backup
 
 			if(m_pwEntry.EqualsEntry(m_pwInitialEntry, false, true, true, false,
-				bCreateBackup))
+				bCreateBackup, MemProtCmpMode.CustomOnly))
 			{
 				m_pwEntry.LastModificationTime = m_pwInitialEntry.LastModificationTime;
 
@@ -1046,7 +1046,7 @@ namespace KeePass.Forms
 			if(m_pwEditMode == PwEditMode.ViewReadOnlyEntry) return;
 
 			EditAutoTypeItemForm dlg = new EditAutoTypeItemForm();
-			dlg.InitEx(m_atConfig, m_vStrings, null, false);
+			dlg.InitEx(m_atConfig, m_vStrings, -1, false);
 
 			if(UIUtil.ShowDialogAndDestroy(dlg) == DialogResult.OK)
 			{
@@ -1061,11 +1061,10 @@ namespace KeePass.Forms
 
 			EditAutoTypeItemForm dlg = new EditAutoTypeItemForm();
 
-			ListView.SelectedListViewItemCollection lvSel = m_lvAutoType.SelectedItems;
+			ListView.SelectedIndexCollection lvSel = m_lvAutoType.SelectedIndices;
 			Debug.Assert(lvSel.Count == 1); if(lvSel.Count != 1) return;
 
-			string strOriginalName = lvSel[0].Text;
-			dlg.InitEx(m_atConfig, m_vStrings, strOriginalName, false);
+			dlg.InitEx(m_atConfig, m_vStrings, lvSel[0], false);
 
 			if(UIUtil.ShowDialogAndDestroy(dlg) == DialogResult.OK)
 				UpdateAutoTypeList();
@@ -1082,7 +1081,7 @@ namespace KeePass.Forms
 				j = nItemCount - i - 1;
 
 				if(m_lvAutoType.Items[j].Selected)
-					m_atConfig.Remove(m_lvAutoType.Items[j].Text);
+					m_atConfig.RemoveAt(j);
 			}
 
 			UpdateAutoTypeList();
@@ -1272,7 +1271,7 @@ namespace KeePass.Forms
 			m_atConfig.DefaultSequence = m_tbDefaultAutoTypeSeq.Text;
 
 			EditAutoTypeItemForm ef = new EditAutoTypeItemForm();
-			ef.InitEx(m_atConfig, m_vStrings, "(" + KPRes.Default + ")", true);
+			ef.InitEx(m_atConfig, m_vStrings, -1, true);
 
 			if(UIUtil.ShowDialogAndDestroy(ef) == DialogResult.OK)
 				m_tbDefaultAutoTypeSeq.Text = m_atConfig.DefaultSequence;
diff --git a/KeePass/Forms/PwGeneratorForm.cs b/KeePass/Forms/PwGeneratorForm.cs
index 22f0c8c..5f8f372 100644
--- a/KeePass/Forms/PwGeneratorForm.cs
+++ b/KeePass/Forms/PwGeneratorForm.cs
@@ -100,6 +100,7 @@ namespace KeePass.Forms
 			FontUtil.AssignDefaultBold(m_rbStandardCharSet);
 			FontUtil.AssignDefaultBold(m_rbPattern);
 			FontUtil.AssignDefaultBold(m_rbCustom);
+			FontUtil.AssignDefaultMono(m_tbPreview, true);
 
 			m_ttMain.SetToolTip(m_btnProfileAdd, KPRes.GenProfileSaveDesc);
 			m_ttMain.SetToolTip(m_btnProfileRemove, KPRes.GenProfileRemoveDesc);
diff --git a/KeePass/Forms/SearchForm.Designer.cs b/KeePass/Forms/SearchForm.Designer.cs
index d62a65e..83284f7 100644
--- a/KeePass/Forms/SearchForm.Designer.cs
+++ b/KeePass/Forms/SearchForm.Designer.cs
@@ -34,6 +34,7 @@
 			this.m_tbSearch = new System.Windows.Forms.TextBox();
 			this.m_lblSearchFor = new System.Windows.Forms.Label();
 			this.m_grpSearchIn = new System.Windows.Forms.GroupBox();
+			this.m_cbTags = new System.Windows.Forms.CheckBox();
 			this.m_cbGroupName = new System.Windows.Forms.CheckBox();
 			this.m_cbUuid = new System.Windows.Forms.CheckBox();
 			this.m_cbOtherFields = new System.Windows.Forms.CheckBox();
@@ -43,10 +44,10 @@
 			this.m_cbUserName = new System.Windows.Forms.CheckBox();
 			this.m_cbTitle = new System.Windows.Forms.CheckBox();
 			this.m_grpOptions = new System.Windows.Forms.GroupBox();
+			this.m_cbDerefData = new System.Windows.Forms.CheckBox();
 			this.m_cbExcludeExpired = new System.Windows.Forms.CheckBox();
 			this.m_cbCaseSensitive = new System.Windows.Forms.CheckBox();
 			this.m_cbRegEx = new System.Windows.Forms.CheckBox();
-			this.m_cbTags = new System.Windows.Forms.CheckBox();
 			((System.ComponentModel.ISupportInitialize)(this.m_bannerImage)).BeginInit();
 			this.m_grpSearchIn.SuspendLayout();
 			this.m_grpOptions.SuspendLayout();
@@ -64,7 +65,7 @@
 			// m_btnOK
 			// 
 			this.m_btnOK.DialogResult = System.Windows.Forms.DialogResult.OK;
-			this.m_btnOK.Location = new System.Drawing.Point(183, 289);
+			this.m_btnOK.Location = new System.Drawing.Point(183, 314);
 			this.m_btnOK.Name = "m_btnOK";
 			this.m_btnOK.Size = new System.Drawing.Size(75, 23);
 			this.m_btnOK.TabIndex = 5;
@@ -75,7 +76,7 @@
 			// m_btnCancel
 			// 
 			this.m_btnCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel;
-			this.m_btnCancel.Location = new System.Drawing.Point(264, 289);
+			this.m_btnCancel.Location = new System.Drawing.Point(264, 314);
 			this.m_btnCancel.Name = "m_btnCancel";
 			this.m_btnCancel.Size = new System.Drawing.Size(75, 23);
 			this.m_btnCancel.TabIndex = 6;
@@ -117,6 +118,16 @@
 			this.m_grpSearchIn.TabStop = false;
 			this.m_grpSearchIn.Text = "Search in";
 			// 
+			// m_cbTags
+			// 
+			this.m_cbTags.AutoSize = true;
+			this.m_cbTags.Location = new System.Drawing.Point(113, 65);
+			this.m_cbTags.Name = "m_cbTags";
+			this.m_cbTags.Size = new System.Drawing.Size(50, 17);
+			this.m_cbTags.TabIndex = 7;
+			this.m_cbTags.Text = "T&ags";
+			this.m_cbTags.UseVisualStyleBackColor = true;
+			// 
 			// m_cbGroupName
 			// 
 			this.m_cbGroupName.AutoSize = true;
@@ -199,15 +210,26 @@
 			// 
 			// m_grpOptions
 			// 
+			this.m_grpOptions.Controls.Add(this.m_cbDerefData);
 			this.m_grpOptions.Controls.Add(this.m_cbExcludeExpired);
 			this.m_grpOptions.Controls.Add(this.m_cbCaseSensitive);
 			this.m_grpOptions.Location = new System.Drawing.Point(12, 212);
 			this.m_grpOptions.Name = "m_grpOptions";
-			this.m_grpOptions.Size = new System.Drawing.Size(327, 67);
+			this.m_grpOptions.Size = new System.Drawing.Size(327, 92);
 			this.m_grpOptions.TabIndex = 4;
 			this.m_grpOptions.TabStop = false;
 			this.m_grpOptions.Text = "Options";
 			// 
+			// m_cbDerefData
+			// 
+			this.m_cbDerefData.AutoSize = true;
+			this.m_cbDerefData.Location = new System.Drawing.Point(9, 65);
+			this.m_cbDerefData.Name = "m_cbDerefData";
+			this.m_cbDerefData.Size = new System.Drawing.Size(140, 17);
+			this.m_cbDerefData.TabIndex = 2;
+			this.m_cbDerefData.Text = "Resolve fiel&d references";
+			this.m_cbDerefData.UseVisualStyleBackColor = true;
+			// 
 			// m_cbExcludeExpired
 			// 
 			this.m_cbExcludeExpired.AutoSize = true;
@@ -238,23 +260,13 @@
 			this.m_cbRegEx.Text = "&Regular expression";
 			this.m_cbRegEx.UseVisualStyleBackColor = true;
 			// 
-			// m_cbTags
-			// 
-			this.m_cbTags.AutoSize = true;
-			this.m_cbTags.Location = new System.Drawing.Point(113, 65);
-			this.m_cbTags.Name = "m_cbTags";
-			this.m_cbTags.Size = new System.Drawing.Size(50, 17);
-			this.m_cbTags.TabIndex = 7;
-			this.m_cbTags.Text = "T&ags";
-			this.m_cbTags.UseVisualStyleBackColor = true;
-			// 
 			// SearchForm
 			// 
 			this.AcceptButton = this.m_btnOK;
 			this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
 			this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
 			this.CancelButton = this.m_btnCancel;
-			this.ClientSize = new System.Drawing.Size(351, 324);
+			this.ClientSize = new System.Drawing.Size(351, 349);
 			this.Controls.Add(this.m_cbRegEx);
 			this.Controls.Add(this.m_grpOptions);
 			this.Controls.Add(this.m_grpSearchIn);
@@ -303,5 +315,6 @@
 		private System.Windows.Forms.CheckBox m_cbGroupName;
 		private System.Windows.Forms.CheckBox m_cbUuid;
 		private System.Windows.Forms.CheckBox m_cbTags;
+		private System.Windows.Forms.CheckBox m_cbDerefData;
 	}
 }
\ No newline at end of file
diff --git a/KeePass/Forms/SearchForm.cs b/KeePass/Forms/SearchForm.cs
index 9082a87..56f4e1f 100644
--- a/KeePass/Forms/SearchForm.cs
+++ b/KeePass/Forms/SearchForm.cs
@@ -27,11 +27,14 @@ using System.Windows.Forms;
 using System.Diagnostics;
 
 using KeePass.UI;
+using KeePass.Util;
+using KeePass.Util.Spr;
 using KeePass.Resources;
 
 using KeePassLib;
 using KeePassLib.Collections;
 using KeePassLib.Delegates;
+using KeePassLib.Interfaces;
 using KeePassLib.Security;
 using KeePassLib.Utility;
 
@@ -91,6 +94,8 @@ namespace KeePass.Forms
 				Properties.Resources.B48x48_XMag, strTitle, KPRes.SearchDesc);
 			this.Icon = Properties.Resources.KeePass;
 
+			m_cbDerefData.Text = m_cbDerefData.Text + " (" + KPRes.Slow + ")";
+
 			SearchParameters sp = Program.Config.Defaults.SearchParameters;
 			m_cbTitle.Checked = sp.SearchInTitles;
 			m_cbUserName.Checked = sp.SearchInUserNames;
@@ -102,13 +107,16 @@ namespace KeePass.Forms
 			m_cbGroupName.Checked = sp.SearchInGroupNames;
 			m_cbTags.Checked = sp.SearchInTags;
 
-			StringComparison sc = Program.Config.Defaults.SearchParameters.ComparisonMode;
+			StringComparison sc = sp.ComparisonMode;
 			m_cbCaseSensitive.Checked = ((sc != StringComparison.CurrentCultureIgnoreCase) &&
 				(sc != StringComparison.InvariantCultureIgnoreCase) &&
 				(sc != StringComparison.OrdinalIgnoreCase));
 
-			m_cbRegEx.Checked = Program.Config.Defaults.SearchParameters.RegularExpression;
-			m_cbExcludeExpired.Checked = Program.Config.Defaults.SearchParameters.ExcludeExpired;
+			m_cbRegEx.Checked = sp.RegularExpression;
+			m_cbExcludeExpired.Checked = sp.ExcludeExpired;
+
+			string strTrf = SearchUtil.GetTransformation(sp);
+			m_cbDerefData.Checked = (strTrf == SearchUtil.StrTrfDeref);
 
 			UIUtil.SetFocus(m_tbSearch, this);
 		}
@@ -139,12 +147,25 @@ namespace KeePass.Forms
 			if(m_pdContext != null)
 				MainForm.AutoAdjustMemProtSettings(m_pdContext, sp);
 
-			try { m_pgRoot.SearchEntries(sp, listResults, true); }
-			catch(Exception exFind) { MessageService.ShowWarning(exFind); }
+			Form fOptDialog;
+			IStatusLogger sl = StatusUtil.CreateStatusDialog(this, out fOptDialog,
+				null, KPRes.SearchingOp + "...", true, false);
+			if(fOptDialog != null) Program.MainForm.RedirectActivationPush(fOptDialog);
+			this.Enabled = false;
+
+			Exception exFind = null;
+			try { m_pgRoot.SearchEntries(sp, listResults, sl); }
+			catch(Exception ex) { exFind = ex; }
+
+			if(fOptDialog != null) Program.MainForm.RedirectActivationPop();
+			this.Enabled = true;
+			sl.EndLogging();
+
+			if(exFind != null) MessageService.ShowWarning(exFind);
 
 			m_pgResultsGroup = pgResults;
 
-			sp.SearchString = string.Empty; // Clear for saving
+			sp.SearchString = string.Empty; // Clear for saving (sp points to global)
 		}
 
 		private void OnBtnCancel(object sender, EventArgs e)
@@ -182,6 +203,9 @@ namespace KeePass.Forms
 
 			sp.ExcludeExpired = m_cbExcludeExpired.Checked;
 
+			SearchUtil.SetTransformation(sp, (m_cbDerefData.Checked ?
+				SearchUtil.StrTrfDeref : string.Empty));
+
 			return sp;
 		}
 	}
diff --git a/KeePass/Forms/StatusProgressForm.cs b/KeePass/Forms/StatusProgressForm.cs
index a21529b..786046d 100644
--- a/KeePass/Forms/StatusProgressForm.cs
+++ b/KeePass/Forms/StatusProgressForm.cs
@@ -48,6 +48,30 @@ namespace KeePass.Forms
 			get { return m_bCancelled; }
 		}
 
+		public static StatusProgressForm ConstructEx(string strTitle,
+			bool bCanCancel, bool bMarqueeProgress, Form fOwner,
+			string strInitialOp)
+		{
+			StatusProgressForm dlg = new StatusProgressForm();
+			dlg.InitEx(strTitle, bCanCancel, bMarqueeProgress, fOwner);
+
+			if(fOwner != null) dlg.Show(fOwner);
+			else dlg.Show();
+
+			dlg.StartLogging(strInitialOp, false);
+
+			return dlg;
+		}
+
+		public static void DestroyEx(StatusProgressForm dlg)
+		{
+			if(dlg == null) { Debug.Assert(false); return; }
+
+			dlg.EndLogging();
+			dlg.Close();
+			UIUtil.DestroyForm(dlg);
+		}
+
 		public void InitEx(string strTitle, bool bCanCancel, bool bMarqueeProgress,
 			Form fOwner)
 		{
@@ -106,7 +130,8 @@ namespace KeePass.Forms
 
 			if(strText != null) m_lblTotal.Text = strText;
 
-			if((nPercent >= 0) && (nPercent <= 100)) m_pbTotal.Value = nPercent;
+			if((nPercent >= 0) && (nPercent <= 100))
+				m_pbTotal.Value = nPercent; // .NET compares with cached value
 		}
 
 		private bool SetProgressGlobal(string strText, int nPercent)
diff --git a/KeePass/Forms/UrlSchemesForm.Designer.cs b/KeePass/Forms/UrlSchemesForm.Designer.cs
index ab0807b..6d2c287 100644
--- a/KeePass/Forms/UrlSchemesForm.Designer.cs
+++ b/KeePass/Forms/UrlSchemesForm.Designer.cs
@@ -30,7 +30,7 @@
 		{
 			this.m_btnOK = new System.Windows.Forms.Button();
 			this.m_btnCancel = new System.Windows.Forms.Button();
-			this.m_lvOverrides = new System.Windows.Forms.ListView();
+			this.m_lvOverrides = new KeePass.UI.CustomListViewEx();
 			this.m_btnAdd = new System.Windows.Forms.Button();
 			this.m_btnEdit = new System.Windows.Forms.Button();
 			this.m_btnDelete = new System.Windows.Forms.Button();
@@ -40,7 +40,7 @@
 			// m_btnOK
 			// 
 			this.m_btnOK.DialogResult = System.Windows.Forms.DialogResult.OK;
-			this.m_btnOK.Location = new System.Drawing.Point(320, 253);
+			this.m_btnOK.Location = new System.Drawing.Point(320, 289);
 			this.m_btnOK.Name = "m_btnOK";
 			this.m_btnOK.Size = new System.Drawing.Size(75, 23);
 			this.m_btnOK.TabIndex = 0;
@@ -51,7 +51,7 @@
 			// m_btnCancel
 			// 
 			this.m_btnCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel;
-			this.m_btnCancel.Location = new System.Drawing.Point(401, 253);
+			this.m_btnCancel.Location = new System.Drawing.Point(401, 289);
 			this.m_btnCancel.Name = "m_btnCancel";
 			this.m_btnCancel.Size = new System.Drawing.Size(75, 23);
 			this.m_btnCancel.TabIndex = 1;
@@ -66,7 +66,7 @@
 			this.m_lvOverrides.Location = new System.Drawing.Point(12, 12);
 			this.m_lvOverrides.Name = "m_lvOverrides";
 			this.m_lvOverrides.ShowItemToolTips = true;
-			this.m_lvOverrides.Size = new System.Drawing.Size(383, 218);
+			this.m_lvOverrides.Size = new System.Drawing.Size(383, 256);
 			this.m_lvOverrides.TabIndex = 2;
 			this.m_lvOverrides.UseCompatibleStateImageBehavior = false;
 			this.m_lvOverrides.View = System.Windows.Forms.View.Details;
@@ -106,7 +106,7 @@
 			// m_lblSep
 			// 
 			this.m_lblSep.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D;
-			this.m_lblSep.Location = new System.Drawing.Point(0, 243);
+			this.m_lblSep.Location = new System.Drawing.Point(0, 280);
 			this.m_lblSep.Name = "m_lblSep";
 			this.m_lblSep.Size = new System.Drawing.Size(489, 2);
 			this.m_lblSep.TabIndex = 6;
@@ -117,7 +117,7 @@
 			this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
 			this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
 			this.CancelButton = this.m_btnCancel;
-			this.ClientSize = new System.Drawing.Size(488, 288);
+			this.ClientSize = new System.Drawing.Size(488, 324);
 			this.Controls.Add(this.m_lblSep);
 			this.Controls.Add(this.m_btnDelete);
 			this.Controls.Add(this.m_btnEdit);
@@ -142,7 +142,7 @@
 
 		private System.Windows.Forms.Button m_btnOK;
 		private System.Windows.Forms.Button m_btnCancel;
-		private System.Windows.Forms.ListView m_lvOverrides;
+		private KeePass.UI.CustomListViewEx m_lvOverrides;
 		private System.Windows.Forms.Button m_btnAdd;
 		private System.Windows.Forms.Button m_btnEdit;
 		private System.Windows.Forms.Button m_btnDelete;
diff --git a/KeePass/Forms/UrlSchemesForm.cs b/KeePass/Forms/UrlSchemesForm.cs
index eadc777..d0e87ae 100644
--- a/KeePass/Forms/UrlSchemesForm.cs
+++ b/KeePass/Forms/UrlSchemesForm.cs
@@ -57,9 +57,11 @@ namespace KeePass.Forms
 			this.Icon = Properties.Resources.KeePass;
 			this.Text = KPRes.UrlSchemeOverrides;
 
+			UIUtil.SetExplorerTheme(m_lvOverrides.Handle);
+
 			int nWidth = (m_lvOverrides.ClientSize.Width - UIUtil.GetVScrollBarWidth()) / 4;
 			m_lvOverrides.Columns.Add(KPRes.Scheme, nWidth);
-			m_lvOverrides.Columns.Add(KPRes.UrlOverride, nWidth * 3 - 1);
+			m_lvOverrides.Columns.Add(KPRes.UrlOverride, nWidth * 3);
 
 			UpdateOverridesList();
 		}
@@ -73,16 +75,28 @@ namespace KeePass.Forms
 		{
 			m_lvOverrides.BeginUpdate();
 			m_lvOverrides.Items.Clear();
+			m_lvOverrides.Groups.Clear();
 
-			foreach(AceUrlSchemeOverride ovr in m_aceTmp.Overrides)
+			for(int i = 0; i < 2; ++i)
 			{
-				ListViewItem lvi = new ListViewItem(ovr.Scheme);
-				lvi.SubItems.Add(ovr.UrlOverride);
-				lvi.Tag = ovr; // Set before setting the Checked property
+				List<AceUrlSchemeOverride> l = ((i == 0) ?
+					m_aceTmp.BuiltInOverrides : m_aceTmp.CustomOverrides);
+
+				ListViewGroup lvg = new ListViewGroup((i == 0) ?
+					KPRes.OverridesBuiltIn : KPRes.OverridesCustom);
+				m_lvOverrides.Groups.Add(lvg);
 
-				lvi.Checked = ovr.Enabled;
+				foreach(AceUrlSchemeOverride ovr in l)
+				{
+					ListViewItem lvi = new ListViewItem(ovr.Scheme);
+					lvi.SubItems.Add(ovr.UrlOverride);
+					lvi.Tag = ovr; // Set before setting the Checked property
 
-				m_lvOverrides.Items.Add(lvi);
+					lvi.Checked = ovr.Enabled;
+
+					m_lvOverrides.Items.Add(lvi);
+					lvg.Items.Add(lvi);
+				}
 			}
 
 			m_lvOverrides.EndUpdate();
@@ -99,8 +113,22 @@ namespace KeePass.Forms
 
 		private void EnableControlsEx()
 		{
-			m_btnEdit.Enabled = (m_lvOverrides.SelectedIndices.Count == 1);
-			m_btnDelete.Enabled = (m_lvOverrides.SelectedIndices.Count >= 1);
+			ListView.SelectedIndexCollection lvsic = m_lvOverrides.SelectedIndices;
+			bool bOne = (lvsic.Count == 1);
+			bool bAtLeastOne = (lvsic.Count >= 1);
+
+			bool bBuiltIn = false;
+			for(int i = 0; i < lvsic.Count; ++i)
+			{
+				AceUrlSchemeOverride ovr = (m_lvOverrides.Items[lvsic[i]].Tag as
+					AceUrlSchemeOverride);
+				if(ovr == null) { Debug.Assert(false); continue; }
+
+				if(ovr.IsBuiltIn) { bBuiltIn = true; break; }
+			}
+
+			m_btnEdit.Enabled = (bOne && !bBuiltIn);
+			m_btnDelete.Enabled = (bAtLeastOne && !bBuiltIn);
 		}
 
 		private void OnOverridesSelectedIndexChanged(object sender, EventArgs e)
@@ -117,7 +145,7 @@ namespace KeePass.Forms
 			dlg.InitEx(ovr);
 			if(UIUtil.ShowDialogAndDestroy(dlg) == DialogResult.OK)
 			{
-				m_aceTmp.Overrides.Add(ovr);
+				m_aceTmp.CustomOverrides.Add(ovr);
 				UpdateOverridesList();
 				m_lvOverrides.EnsureVisible(m_lvOverrides.Items.Count - 1);
 			}
@@ -130,10 +158,15 @@ namespace KeePass.Forms
 
 			AceUrlSchemeOverride ovr = (lvsic[0].Tag as AceUrlSchemeOverride);
 			if(ovr == null) { Debug.Assert(false); return; }
+			if(ovr.IsBuiltIn) { Debug.Assert(false); return; }
 
 			UrlSchemeForm dlg = new UrlSchemeForm();
 			dlg.InitEx(ovr);
-			if(UIUtil.ShowDialogAndDestroy(dlg) == DialogResult.OK) UpdateOverridesList();
+			if(UIUtil.ShowDialogAndDestroy(dlg) == DialogResult.OK)
+			{
+				UpdateOverridesList();
+				m_lvOverrides.EnsureVisible(m_lvOverrides.Items.Count - 1);
+			}
 		}
 
 		private void OnBtnDelete(object sender, EventArgs e)
@@ -145,16 +178,19 @@ namespace KeePass.Forms
 			{
 				AceUrlSchemeOverride ovr = (lvi.Tag as AceUrlSchemeOverride);
 				if(ovr == null) { Debug.Assert(false); continue; }
+				if(ovr.IsBuiltIn) { Debug.Assert(false); continue; }
 
-				m_aceTmp.Overrides.Remove(ovr);
+				try { m_aceTmp.CustomOverrides.Remove(ovr); }
+				catch(Exception) { Debug.Assert(false); }
 			}
 
 			UpdateOverridesList();
+			m_lvOverrides.EnsureVisible(m_lvOverrides.Items.Count - 1);
 		}
 
 		private void OnBtnOK(object sender, EventArgs e)
 		{
-			m_aceOvr.Overrides = m_aceTmp.Overrides;
+			m_aceTmp.CopyTo(m_aceOvr);
 		}
 	}
 }
diff --git a/KeePass/KeePass.csproj b/KeePass/KeePass.csproj
index cddd7d2..2175f7c 100644
--- a/KeePass/KeePass.csproj
+++ b/KeePass/KeePass.csproj
@@ -368,6 +368,12 @@
     <Compile Include="Forms\AboutForm.Designer.cs">
       <DependentUpon>AboutForm.cs</DependentUpon>
     </Compile>
+    <Compile Include="Forms\AutoTypeCtxForm.cs">
+      <SubType>Form</SubType>
+    </Compile>
+    <Compile Include="Forms\AutoTypeCtxForm.Designer.cs">
+      <DependentUpon>AutoTypeCtxForm.cs</DependentUpon>
+    </Compile>
     <Compile Include="Forms\CharPickerForm.cs">
       <SubType>Form</SubType>
     </Compile>
@@ -404,6 +410,12 @@
     <Compile Include="Forms\DataViewerForm.Designer.cs">
       <DependentUpon>DataViewerForm.cs</DependentUpon>
     </Compile>
+    <Compile Include="Forms\DuplicationForm.cs">
+      <SubType>Form</SubType>
+    </Compile>
+    <Compile Include="Forms\DuplicationForm.Designer.cs">
+      <DependentUpon>DuplicationForm.cs</DependentUpon>
+    </Compile>
     <Compile Include="Forms\EcasActionForm.cs">
       <SubType>Form</SubType>
     </Compile>
@@ -649,6 +661,7 @@
     <Compile Include="Plugins\PlgxPluginInfo.cs" />
     <Compile Include="Plugins\PlgxPlugin.cs" />
     <Compile Include="Resources\KPRes.Generated.cs" />
+    <Compile Include="UI\AsyncPwListUpdate.cs" />
     <Compile Include="UI\BackgroundForm.cs">
       <SubType>Form</SubType>
     </Compile>
@@ -687,11 +700,13 @@
     <Compile Include="UI\ListViewStateEx.cs" />
     <Compile Include="UI\NotifyIconEx.cs" />
     <Compile Include="UI\OnDemandStatusDialog.cs" />
+    <Compile Include="UI\OpenWithMenu.cs" />
     <Compile Include="UI\PromptedTextBox.cs">
       <SubType>Component</SubType>
     </Compile>
     <Compile Include="UI\ProtectedDialog.cs" />
     <Compile Include="UI\RichTextBuilder.cs" />
+    <Compile Include="UI\StatusUtil.cs" />
     <Compile Include="UI\TabControlEx.cs">
     </Compile>
     <Compile Include="UI\TaskbarList.cs" />
@@ -700,6 +715,7 @@
     <Compile Include="UI\UserActivityNotifyFilter.cs" />
     <Compile Include="UI\VistaTaskDialog.cs">
     </Compile>
+    <Compile Include="Util\AutoTypeCtx.cs" />
     <Compile Include="Util\BinaryDataClassifier.cs" />
     <Compile Include="Util\CancellableOperationEventArgs.cs" />
     <Compile Include="Plugins\PluginInfo.cs" />
@@ -728,6 +744,9 @@
       <SubType>Designer</SubType>
       <DependentUpon>AboutForm.cs</DependentUpon>
     </EmbeddedResource>
+    <EmbeddedResource Include="Forms\AutoTypeCtxForm.resx">
+      <DependentUpon>AutoTypeCtxForm.cs</DependentUpon>
+    </EmbeddedResource>
     <EmbeddedResource Include="Forms\CharPickerForm.resx">
       <SubType>Designer</SubType>
       <DependentUpon>CharPickerForm.cs</DependentUpon>
@@ -750,6 +769,9 @@
       <SubType>Designer</SubType>
       <DependentUpon>DataViewerForm.cs</DependentUpon>
     </EmbeddedResource>
+    <EmbeddedResource Include="Forms\DuplicationForm.resx">
+      <DependentUpon>DuplicationForm.cs</DependentUpon>
+    </EmbeddedResource>
     <EmbeddedResource Include="Forms\EcasActionForm.resx">
       <DependentUpon>EcasActionForm.cs</DependentUpon>
     </EmbeddedResource>
@@ -941,15 +963,17 @@
     <Compile Include="Util\KeyUtil.cs" />
     <Compile Include="Util\NetUtil.cs" />
     <Compile Include="Util\PwGeneratorUtil.cs" />
+    <Compile Include="Util\SearchUtil.cs" />
     <Compile Include="Util\SendInputEx.cs" />
     <Compile Include="Util\SendInputEx.Unix.cs" />
     <Compile Include="Util\SendInputEx.Windows.cs" />
     <Compile Include="Util\SessionLockNotifier.cs" />
     <Compile Include="Util\HotKeyManager.cs" />
     <Compile Include="Util\ShellUtil.cs" />
-    <Compile Include="Util\Spr\SprContentFlags.cs" />
+    <Compile Include="Util\Spr\SprContext.cs" />
     <Compile Include="Util\Spr\SprEncoding.cs" />
     <Compile Include="Util\Spr\SprEngine.cs" />
+    <Compile Include="Util\Spr\SprEngine.PickChars.cs" />
     <Compile Include="Util\TempFilesPool.cs" />
     <Compile Include="Util\TextSimilarity.cs" />
     <Compile Include="Util\WinUtil.cs" />
@@ -1080,6 +1104,7 @@
   </ItemGroup>
   <ItemGroup>
     <Content Include="KeePass.ico" />
+    <None Include="Resources\Nuvola_Derived\B16x16_EditCopyLink.png" />
     <None Include="Resources\Images\B16x16_Imp_KasperskyPwMgr.png" />
     <None Include="Resources\Images\B16x16_Imp_StickyPw.png" />
     <None Include="Resources\Images\B16x16_Imp_PwsPlus.png" />
@@ -1203,6 +1228,6 @@
   </Target>
   -->
   <PropertyGroup>
-    <PostBuildEvent>"$(FrameworkSDKDir)bin\sgen.exe" /assembly:"$(TargetPath)" /force /nologo /compiler:/keycontainer:VS_KEY_E6D8E2B3F89DA59B /compiler:/delaysign-</PostBuildEvent>
+    <PostBuildEvent>"$(FrameworkSDKDir)bin\sgen.exe" /assembly:"$(TargetPath)" /force /nologo /compiler:/keycontainer:VS_KEY_33430356D8D7D1B8 /compiler:/delaysign-</PostBuildEvent>
   </PropertyGroup>
 </Project>
\ No newline at end of file
diff --git a/KeePass/Native/NativeMethods.Defs.cs b/KeePass/Native/NativeMethods.Defs.cs
index 3a59554..1fa6b1f 100644
--- a/KeePass/Native/NativeMethods.Defs.cs
+++ b/KeePass/Native/NativeMethods.Defs.cs
@@ -96,6 +96,7 @@ namespace KeePass.Native
 		internal const int ICON_BIG = 1;
 		internal const int ICON_SMALL2 = 2;
 
+		internal const int EM_GETCHARFORMAT = WM_USER + 58;
 		internal const int EM_SETCHARFORMAT = WM_USER + 68;
 
 		internal const int ES_WANTRETURN = 0x1000;
@@ -116,12 +117,16 @@ namespace KeePass.Native
 		internal const int ECM_FIRST = 0x1500;
 		internal const int EM_SETCUEBANNER = ECM_FIRST + 1;
 
+		internal const uint INVALID_FILE_ATTRIBUTES = 0xFFFFFFFFU;
+
 		internal const uint FSCTL_LOCK_VOLUME = 589848;
 		internal const uint FSCTL_UNLOCK_VOLUME = 589852;
 
 		internal const int LVM_FIRST = 0x1000;
 		internal const int LVM_ENSUREVISIBLE = LVM_FIRST + 19;
 		internal const int LVM_SCROLL = LVM_FIRST + 20;
+		// internal const int LVM_SETGROUPINFO = LVM_FIRST + 147; // >= Vista
+		// internal const int LVM_GETGROUPINFOBYINDEX = LVM_FIRST + 153; // >= Vista
 
 		internal const int WM_MOUSEACTIVATE = 0x21;
 		internal const int MA_ACTIVATE = 1;
@@ -184,6 +189,32 @@ namespace KeePass.Native
 		// internal const int LVN_FIRST = -100;
 		// internal const int LVN_LINKCLICK = LVN_FIRST - 84;
 
+		// internal const uint LVGF_NONE = 0x00000000;
+		// internal const uint LVGF_HEADER = 0x00000001;
+		// internal const uint LVGF_FOOTER = 0x00000002;
+		// internal const uint LVGF_STATE = 0x00000004;
+		// internal const uint LVGF_ALIGN = 0x00000008;
+		// internal const uint LVGF_GROUPID = 0x00000010;
+		// internal const uint LVGF_SUBTITLE = 0x00000100;
+		// internal const uint LVGF_TASK = 0x00000200;
+		// internal const uint LVGF_DESCRIPTIONTOP = 0x00000400;
+		// internal const uint LVGF_DESCRIPTIONBOTTOM = 0x00000800;
+		// internal const uint LVGF_TITLEIMAGE = 0x00001000;
+		// internal const uint LVGF_EXTENDEDIMAGE = 0x00002000;
+		// internal const uint LVGF_ITEMS = 0x00004000;
+		// internal const uint LVGF_SUBSET = 0x00008000;
+		// internal const uint LVGF_SUBSETITEMS = 0x00010000;
+
+		// internal const uint LVGS_NORMAL = 0x00000000;
+		// internal const uint LVGS_COLLAPSED = 0x00000001;
+		// internal const uint LVGS_HIDDEN = 0x00000002;
+		// internal const uint LVGS_NOHEADER = 0x00000004;
+		// internal const uint LVGS_COLLAPSIBLE = 0x00000008;
+		// internal const uint LVGS_FOCUSED = 0x00000010;
+		// internal const uint LVGS_SELECTED = 0x00000020;
+		// internal const uint LVGS_SUBSETED = 0x00000040;
+		// internal const uint LVGS_SUBSETLINKFOCUSED = 0x00000080;
+
 		[return: MarshalAs(UnmanagedType.Bool)]
 		internal delegate bool EnumWindowsProc(IntPtr hWnd, IntPtr lParam);
 
diff --git a/KeePass/Native/NativeMethods.New.cs b/KeePass/Native/NativeMethods.New.cs
index 9d91ab4..d7e297d 100644
--- a/KeePass/Native/NativeMethods.New.cs
+++ b/KeePass/Native/NativeMethods.New.cs
@@ -21,11 +21,12 @@ using System;
 using System.Text;
 using System.Security;
 using System.Runtime.InteropServices;
-using System.Diagnostics;
 using System.Windows.Forms;
 using System.Drawing;
 using System.Drawing.Drawing2D;
 using System.Drawing.Imaging;
+using System.IO;
+using System.Diagnostics;
 
 using KeePass.UI;
 using KeePass.Util;
@@ -53,7 +54,12 @@ namespace KeePass.Native
 			if(!KeePassLib.Native.NativeLib.IsUnix())
 				return GetForegroundWindow(); // Windows API
 
-			return new IntPtr(int.Parse(RunXDoTool("getactivewindow")));
+			try
+			{
+				return new IntPtr(int.Parse(RunXDoTool("getactivewindow")));
+			}
+			catch(Exception) { Debug.Assert(false); }
+			return IntPtr.Zero;
 		}
 
 		private static readonly char[] m_vWindowTrim = { '\r', '\n' };
@@ -337,5 +343,97 @@ namespace KeePass.Native
 
 			return false;
 		}
+
+		/// <summary>
+		/// Method for testing whether a file exists or not. Also
+		/// supports NTFS alternate data streams.
+		/// </summary>
+		/// <param name="strFilePath">Path of the file or stream.</param>
+		/// <returns><c>true</c> if the file exists.</returns>
+		public static bool FileExists(string strFilePath)
+		{
+			if(strFilePath == null) throw new ArgumentNullException("strFilePath");
+
+			try
+			{
+				return (GetFileAttributes(strFilePath) != INVALID_FILE_ATTRIBUTES);
+			}
+			catch(Exception) { Debug.Assert(KeePassLib.Native.NativeLib.IsUnix()); }
+
+			// Fallback to .NET method for Unix-like systems
+			try { return File.Exists(strFilePath); }
+			catch(Exception) { Debug.Assert(false); } // Invalid path
+
+			return false;
+		}
+
+		/* internal static LVGROUP GetGroupInfoByIndex(ListView lv, uint uIndex)
+		{
+			if(lv == null) throw new ArgumentNullException("lv");
+			if(uIndex >= (uint)lv.Groups.Count)
+				throw new ArgumentOutOfRangeException("uIndex");
+
+			const int nStrLen = 1024;
+
+			LVGROUP g = new LVGROUP();
+			g.cbSize = (uint)Marshal.SizeOf(typeof(LVGROUP));
+
+			g.mask = ...;
+
+			g.pszHeader = new StringBuilder(nStrLen);
+			g.cchHeader = nStrLen - 1;
+			g.pszFooter = new StringBuilder(nStrLen);
+			g.cchFooter = nStrLen - 1;
+			g.pszSubtitle = new StringBuilder(nStrLen);
+			g.cchSubtitle = (uint)(nStrLen - 1);
+			g.pszTask = new StringBuilder(nStrLen);
+			g.cchTask = (uint)(nStrLen - 1);
+			g.pszDescriptionTop = new StringBuilder(nStrLen);
+			g.cchDescriptionTop = (uint)(nStrLen - 1);
+			g.pszDescriptionBottom = new StringBuilder(nStrLen);
+			g.cchDescriptionBottom = (uint)(nStrLen - 1);
+			g.pszSubsetTitle = new StringBuilder(nStrLen);
+			g.cchSubsetTitle = (uint)(nStrLen - 1);
+
+			SendMessageLVGroup(lv.Handle, LVM_GETGROUPINFOBYINDEX,
+				new IntPtr((int)uIndex), ref g);
+			return g;
+		} */
+
+		/* internal static uint GetGroupStateByIndex(ListView lv, uint uIndex,
+			uint uStateMask, out int iGroupID)
+		{
+			if(lv == null) throw new ArgumentNullException("lv");
+			if(uIndex >= (uint)lv.Groups.Count)
+				throw new ArgumentOutOfRangeException("uIndex");
+
+			LVGROUP g = new LVGROUP();
+			g.cbSize = (uint)Marshal.SizeOf(g);
+
+			g.mask = (LVGF_STATE | LVGF_GROUPID);
+			g.stateMask = uStateMask;
+
+			SendMessageLVGroup(lv.Handle, LVM_GETGROUPINFOBYINDEX,
+				new IntPtr((int)uIndex), ref g);
+
+			iGroupID = g.iGroupId;
+			return g.state;
+		}
+
+		internal static void SetGroupState(ListView lv, int iGroupID,
+			uint uStateMask, uint uState)
+		{
+			if(lv == null) throw new ArgumentNullException("lv");
+
+			LVGROUP g = new LVGROUP();
+			g.cbSize = (uint)Marshal.SizeOf(g);
+
+			g.mask = LVGF_STATE;
+			g.stateMask = uStateMask;
+			g.state = uState;
+
+			SendMessageLVGroup(lv.Handle, LVM_SETGROUPINFO,
+				new IntPtr(iGroupID), ref g);
+		} */
 	}
 }
diff --git a/KeePass/Native/NativeMethods.Structs.cs b/KeePass/Native/NativeMethods.Structs.cs
index e0d3f2f..74a81fc 100644
--- a/KeePass/Native/NativeMethods.Structs.cs
+++ b/KeePass/Native/NativeMethods.Structs.cs
@@ -210,5 +210,58 @@ namespace KeePass.Native
 			[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 80)]
 			public string szTypeName;
 		}
+
+		/* // LVGROUP for Windows Vista and higher
+		[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
+		private struct LVGROUP
+		{
+			public uint cbSize;
+			public uint mask;
+
+			// [MarshalAs(UnmanagedType.LPWStr)]
+			// public StringBuilder pszHeader;
+			public IntPtr pszHeader;
+			public int cchHeader;
+
+			// [MarshalAs(UnmanagedType.LPWStr)]
+			// public StringBuilder pszFooter;
+			public IntPtr pszFooter;
+			public int cchFooter;
+
+			public int iGroupId;
+			public uint stateMask;
+			public uint state;
+			public uint uAlign;
+
+			// [MarshalAs(UnmanagedType.LPWStr)]
+			// public StringBuilder pszSubtitle;
+			public IntPtr pszSubtitle;
+			public uint cchSubtitle;
+
+			// [MarshalAs(UnmanagedType.LPWStr)]
+			// public StringBuilder pszTask;
+			public IntPtr pszTask;
+			public uint cchTask;
+
+			// [MarshalAs(UnmanagedType.LPWStr)]
+			// public StringBuilder pszDescriptionTop;
+			public IntPtr pszDescriptionTop;
+			public uint cchDescriptionTop;
+
+			// [MarshalAs(UnmanagedType.LPWStr)]
+			// public StringBuilder pszDescriptionBottom;
+			public IntPtr pszDescriptionBottom;
+			public uint cchDescriptionBottom;
+
+			public int iTitleImage;
+			public int iExtendedImage;
+			public int iFirstItem;
+			public uint cItems;
+
+			// [MarshalAs(UnmanagedType.LPWStr)]
+			// public StringBuilder pszSubsetTitle;
+			public IntPtr pszSubsetTitle;
+			public uint cchSubsetTitle;
+		} */
 	}
 }
diff --git a/KeePass/Native/NativeMethods.Unix.cs b/KeePass/Native/NativeMethods.Unix.cs
index 55e6f7e..31be498 100644
--- a/KeePass/Native/NativeMethods.Unix.cs
+++ b/KeePass/Native/NativeMethods.Unix.cs
@@ -24,6 +24,11 @@ using System.Windows.Forms;
 using System.Runtime.InteropServices;
 using System.Diagnostics;
 
+using KeePass.UI;
+using KeePass.Util;
+
+using KeePassLib.Utility;
+
 namespace KeePass.Native
 {
 	internal static partial class NativeMethods
@@ -74,7 +79,7 @@ namespace KeePass.Native
 				long lCurrent;
 				long.TryParse(strCurrent.Trim(), out lCurrent);
 
-				fCurrent.WindowState = FormWindowState.Minimized;
+				UIUtil.SetWindowState(fCurrent, FormWindowState.Minimized);
 
 				int nStart = Environment.TickCount;
 				while((Environment.TickCount - nStart) < 1000)
@@ -107,7 +112,7 @@ namespace KeePass.Native
 			string str = RunXDoTool("getactivewindow getwindowname");
 			if(string.IsNullOrEmpty(str)) return false;
 
-			return (str.Trim() != "usage: getactivewindow");
+			return !(str.Trim().Equals("usage: getactivewindow", StrUtil.CaseIgnoreCmp));
 		}
 
 		internal static string RunXDoTool(string strParams)
@@ -115,24 +120,9 @@ namespace KeePass.Native
 			try
 			{
 				Application.DoEvents(); // E.g. for clipboard updates
-
-				ProcessStartInfo psi = new ProcessStartInfo();
-
-				psi.CreateNoWindow = true;
-				psi.FileName = "xdotool";
-				psi.WindowStyle = ProcessWindowStyle.Hidden;
-				psi.UseShellExecute = false;
-				psi.RedirectStandardOutput = true;
-
-				if(!string.IsNullOrEmpty(strParams)) psi.Arguments = strParams;
-
-				Process p = Process.Start(psi);
-
-				string strOutput = p.StandardOutput.ReadToEnd();
-				p.WaitForExit();
-
+				string strOutput = WinUtil.RunConsoleApp("xdotool", strParams);
 				Application.DoEvents(); // E.g. for clipboard updates
-				return strOutput;
+				return (strOutput ?? string.Empty);
 			}
 			catch(Exception) { Debug.Assert(false); }
 
diff --git a/KeePass/Native/NativeMethods.cs b/KeePass/Native/NativeMethods.cs
index 74bf8c9..32ab2db 100644
--- a/KeePass/Native/NativeMethods.cs
+++ b/KeePass/Native/NativeMethods.cs
@@ -46,6 +46,10 @@ namespace KeePass.Native
 		internal static extern IntPtr SendMessageHDItem(IntPtr hWnd, int nMsg,
 			IntPtr wParam, ref HDITEM hdItem);
 
+		// [DllImport("User32.dll", EntryPoint = "SendMessage")]
+		// private static extern IntPtr SendMessageLVGroup(IntPtr hWnd, int nMsg,
+		//	IntPtr wParam, ref LVGROUP lvGroup);
+
 		[DllImport("User32.dll", SetLastError = true)]
 		internal static extern IntPtr SendMessageTimeout(IntPtr hWnd, int nMsg,
 			IntPtr wParam, IntPtr lParam, uint fuFlags, uint uTimeout,
@@ -77,6 +81,14 @@ namespace KeePass.Native
 		[DllImport("User32.dll", EntryPoint = "GetClassLongPtr")]
 		private static extern IntPtr GetClassLongPtr64(IntPtr hWnd, int nIndex);
 
+		[DllImport("User32.dll")]
+		[return: MarshalAs(UnmanagedType.Bool)]
+		internal static extern bool IsIconic(IntPtr hWnd);
+
+		[DllImport("User32.dll")]
+		[return: MarshalAs(UnmanagedType.Bool)]
+		internal static extern bool IsZoomed(IntPtr hWnd);
+
 		[DllImport("User32.dll", SetLastError = true)]
 		private static extern int GetWindowTextLength(IntPtr hWnd);
 
@@ -256,6 +268,13 @@ namespace KeePass.Native
 		[return: MarshalAs(UnmanagedType.Bool)]
 		internal static extern bool CloseHandle(IntPtr hObject);
 
+		[DllImport("Kernel32.dll", SetLastError = true, CharSet = CharSet.Auto)]
+		internal static extern uint GetFileAttributes(string lpFileName);
+
+		[DllImport("Kernel32.dll", SetLastError = true, CharSet = CharSet.Auto)]
+		[return: MarshalAs(UnmanagedType.Bool)]
+		internal static extern bool DeleteFile(string lpFileName);
+
 		[DllImport("Kernel32.dll", ExactSpelling = true, SetLastError = true)]
 		[return: MarshalAs(UnmanagedType.Bool)]
 		internal static extern bool DeviceIoControl(IntPtr hDevice, uint dwIoControlCode,
diff --git a/KeePass/Native/NativeProgressDialog.cs b/KeePass/Native/NativeProgressDialog.cs
index ea2d275..371ab80 100644
--- a/KeePass/Native/NativeProgressDialog.cs
+++ b/KeePass/Native/NativeProgressDialog.cs
@@ -22,35 +22,53 @@ using System;
 using System.Runtime.InteropServices;
 using System.Diagnostics;
 
+using KeePass.Util;
+
 using KeePassLib;
 using KeePassLib.Interfaces;
 
 namespace KeePass.Native
 {
+	[Flags]
+	public enum ProgDlgFlags
+	{
+		Normal = 0x0,
+		Modal = 0x1,
+		AutoTime = 0x2,
+		NoTime = 0x4,
+		NoMinimize = 0x8,
+		NoProgressBar = 0x10,
+		MarqueeProgress = 0x20,
+		NoCancel = 0x40
+	}
+
 	public sealed class NativeProgressDialog : IStatusLogger
 	{
-		private IProgressDialog m_p = null;
-		private uint m_uFlags = 0;
-
-		private const uint PROGDLG_NORMAL = 0x00000000;
-		private const uint PROGDLG_MODAL = 0x00000001;
-		private const uint PROGDLG_AUTOTIME = 0x00000002;
-		private const uint PROGDLG_NOTIME = 0x00000004;
-		private const uint PROGDLG_NOMINIMIZE = 0x00000008;
-		private const uint PROGDLG_NOPROGRESSBAR = 0x00000010;
-		private const uint PROGDLG_MARQUEEPROGRESS = 0x00000020;
-		private const uint PROGDLG_NOCANCEL = 0x00000040;
-
-		public NativeProgressDialog(bool bAutoTime, bool bNoTime, bool bMarquee,
-			bool bNoCancel)
+		private IProgressDialog m_p;
+		private uint m_uFlags;
+		private IntPtr m_hWndParent;
+		private uint m_uLastPercent = 0;
+
+		private const uint PDTIMER_RESET = 0x1;
+		private const uint PDTIMER_PAUSE = 0x2;
+		private const uint PDTIMER_RESUME = 0x3;
+
+		public static bool IsSupported
+		{
+			get
+			{
+				return (WinUtil.IsAtLeastWindowsVista &&
+					!KeePassLib.Native.NativeLib.IsUnix());
+			}
+		}
+
+		public NativeProgressDialog(IntPtr hWndParent, ProgDlgFlags fl)
 		{
-			if(bAutoTime) m_uFlags |= PROGDLG_AUTOTIME;
-			if(bNoTime) m_uFlags |= PROGDLG_NOTIME;
-			if(bMarquee) m_uFlags |= PROGDLG_MARQUEEPROGRESS;
-			if(bNoCancel) m_uFlags |= PROGDLG_NOCANCEL;
+			m_hWndParent = hWndParent;
+			m_uFlags = (uint)fl;
 
 			try { m_p = (IProgressDialog)(new Win32ProgressDialog()); }
-			catch(Exception) { Debug.Assert(false); }
+			catch(Exception) { Debug.Assert(false); m_p = null; }
 		}
 
 		~NativeProgressDialog()
@@ -60,54 +78,53 @@ namespace KeePass.Native
 
 		public void StartLogging(string strOperation, bool bWriteOperationToLog)
 		{
-			if(m_p != null)
-			{
-				m_p.SetTitle(PwDefs.ShortProductName);
+			if(m_p == null) { Debug.Assert(false); return; }
 
-				m_p.StartProgressDialog(IntPtr.Zero, IntPtr.Zero, m_uFlags, IntPtr.Zero);
+			m_p.SetTitle(PwDefs.ShortProductName);
+			m_p.StartProgressDialog(m_hWndParent, IntPtr.Zero, m_uFlags, IntPtr.Zero);
+			m_p.Timer(PDTIMER_RESET, IntPtr.Zero);
+			m_p.SetLine(1, strOperation, false, IntPtr.Zero);
 
-				m_p.SetLine(1, strOperation, false, IntPtr.Zero);
-			}
+			m_p.SetProgress(0, 100);
+			m_uLastPercent = 0;
 		}
 
 		public void EndLogging()
 		{
-			if(m_p != null)
-			{
-				m_p.StopProgressDialog();
-				try { Marshal.ReleaseComObject(m_p); }
-				catch(Exception) { Debug.Assert(false); }
-				m_p = null;
-			}
+			if(m_p == null) return; // Might be freed/null already, don't assert
+
+			m_p.StopProgressDialog();
+			try { Marshal.ReleaseComObject(m_p); }
+			catch(Exception) { Debug.Assert(false); }
+			m_p = null;
 		}
 
 		public bool SetProgress(uint uPercent)
 		{
-			if(m_p != null)
+			if(m_p == null) { Debug.Assert(false); return true; }
+
+			if(uPercent != m_uLastPercent)
 			{
 				m_p.SetProgress(uPercent, 100);
-				return !m_p.HasUserCancelled();
+				m_uLastPercent = uPercent;
 			}
 
-			return true;
+			return !m_p.HasUserCancelled();
 		}
 
 		public bool SetText(string strNewText, LogStatusType lsType)
 		{
-			if(m_p != null)
-			{
-				m_p.SetLine(2, strNewText, false, IntPtr.Zero);
-				return !m_p.HasUserCancelled();
-			}
+			if(m_p == null) { Debug.Assert(false); return true; }
 
-			return true;
+			m_p.SetLine(2, strNewText, false, IntPtr.Zero);
+			return !m_p.HasUserCancelled();
 		}
 
 		public bool ContinueWork()
 		{
-			if(m_p != null) return !m_p.HasUserCancelled();
+			if(m_p == null) { Debug.Assert(false); return true; }
 
-			return true;
+			return !m_p.HasUserCancelled();
 		}
 	}
 
diff --git a/KeePass/Plugins/PlgxCache.cs b/KeePass/Plugins/PlgxCache.cs
index 05a6444..3714833 100644
--- a/KeePass/Plugins/PlgxCache.cs
+++ b/KeePass/Plugins/PlgxCache.cs
@@ -68,7 +68,7 @@ namespace KeePass.Plugins
 			if(Program.Config.Application.PluginCachePath.Length > 0)
 			{
 				string strRoot = SprEngine.Compile(Program.Config.Application.PluginCachePath,
-					false, null, null, false, false);
+					null);
 				if(!string.IsNullOrEmpty(strRoot))
 				{
 					if(strRoot.EndsWith(new string(Path.DirectorySeparatorChar, 1)))
@@ -202,7 +202,8 @@ namespace KeePass.Plugins
 			if(!Directory.Exists(strRoot)) return;
 			
 			DirectoryInfo di = new DirectoryInfo(strRoot);
-			foreach(DirectoryInfo diSub in di.GetDirectories("*", SearchOption.TopDirectoryOnly))
+			foreach(DirectoryInfo diSub in di.GetDirectories("*",
+				SearchOption.TopDirectoryOnly))
 			{
 				try
 				{
diff --git a/KeePass/Plugins/PlgxPlugin.cs b/KeePass/Plugins/PlgxPlugin.cs
index 67bb7e8..3e24e0f 100644
--- a/KeePass/Plugins/PlgxPlugin.cs
+++ b/KeePass/Plugins/PlgxPlugin.cs
@@ -524,16 +524,31 @@ namespace KeePass.Plugins
 			CompileEmbeddedRes(plgx);
 			PrepareSourceFiles(plgx);
 
-			CompilerResults cr;
-			if(!CompileAssembly(plgx, out cr, null))
-				if(!CompileAssembly(plgx, out cr, "v3.5"))
+			string[] vCompilers = new string[] {
+				null, "v3.5",
+				"v4", // Suggested in CodeDomProvider.CreateProvider doc
+				"v4.0" // Apparently works for most people
+			};
+
+			CompilerResults cr = null;
+			bool bCompiled = false;
+			for(int iCmp = 0; iCmp < vCompilers.Length; ++iCmp)
+			{
+				if(CompileAssembly(plgx, ref cr, vCompilers[iCmp]))
 				{
-					if(Program.CommandLineArgs[
-						AppDefs.CommandLineOptions.SavePluginCompileRes] != null)
-						SaveCompilerResults(plgx, cr);
-
-					throw new InvalidOperationException();
+					bCompiled = true;
+					break;
 				}
+			}
+
+			if(!bCompiled)
+			{
+				if(Program.CommandLineArgs[
+					AppDefs.CommandLineOptions.SavePluginCompileRes] != null)
+					SaveCompilerResults(plgx, cr);
+
+				throw new InvalidOperationException();
+			}
 
 			Program.TempFilesPool.Add(cr.PathToAssembly);
 
@@ -547,7 +562,7 @@ namespace KeePass.Plugins
 		}
 
 		private static bool CompileAssembly(PlgxPluginInfo plgx,
-			out CompilerResults cr, string strCompilerVersion)
+			ref CompilerResults cr, string strCompilerVersion)
 		{
 			try
 			{
@@ -575,13 +590,15 @@ namespace KeePass.Plugins
 			}
 			catch(Exception) { }
 
-			cr = null;
+			// cr = null; // Keep previous results for output
 			return false;
 		}
 
 		private static void SaveCompilerResults(PlgxPluginInfo plgx,
 			CompilerResults cr)
 		{
+			if(cr == null) { Debug.Assert(false); return; }
+
 			StringBuilder sb = new StringBuilder();
 			foreach(string strOut in cr.Output)
 			{
@@ -696,7 +713,7 @@ namespace KeePass.Plugins
 				str = StrUtil.ReplaceCaseInsensitive(str, @"{PLGX_CACHE_DIR}", strCacheDir);
 
 			// str = UrlUtil.ConvertSeparators(str);
-			str = SprEngine.Compile(str, false, null, null, false, false);
+			str = SprEngine.Compile(str, null);
 
 			string strApp, strArgs;
 			StrUtil.SplitCommandLine(str, out strApp, out strArgs);
diff --git a/KeePass/Program.cs b/KeePass/Program.cs
index 7ae4b26..39e2d7c 100644
--- a/KeePass/Program.cs
+++ b/KeePass/Program.cs
@@ -202,6 +202,11 @@ namespace KeePass
 			Application.SetCompatibleTextRenderingDefault(false);
 			Application.DoEvents(); // Required
 
+			int nRandomSeed = (int)DateTime.UtcNow.Ticks;
+			// Prevent overflow (see Random class constructor)
+			if(nRandomSeed == int.MinValue) nRandomSeed = 17;
+			m_rndGlobal = new Random(nRandomSeed);
+
 			InitEnvSecurity();
 
 			try { SelfTest.TestFipsComplianceProblems(); }
@@ -211,11 +216,6 @@ namespace KeePass
 				return;
 			}
 
-			int nRandomSeed = (int)DateTime.Now.Ticks;
-			// Prevent overflow (see Random class constructor)
-			if(nRandomSeed == int.MinValue) nRandomSeed = 17;
-			m_rndGlobal = new Random(nRandomSeed);
-
 			// Set global localized strings
 			PwDatabase.LocalizedAppName = PwDefs.ShortProductName;
 			Kdb4File.DetermineLanguageId();
diff --git a/KeePass/Properties/AssemblyInfo.cs b/KeePass/Properties/AssemblyInfo.cs
index d1d2c0b..e08401f 100644
--- a/KeePass/Properties/AssemblyInfo.cs
+++ b/KeePass/Properties/AssemblyInfo.cs
@@ -38,5 +38,5 @@ using System.Runtime.InteropServices;
 [assembly: Guid("02020c52-c0da-47c0-9f3f-a6fe76cee400")]
 
 // Assembly version information
-[assembly: AssemblyVersion("2.1.6.*")]
-[assembly: AssemblyFileVersion("2.1.6.0")]
+[assembly: AssemblyVersion("2.1.7.*")]
+[assembly: AssemblyFileVersion("2.1.7.0")]
diff --git a/KeePass/Properties/Resources.Designer.cs b/KeePass/Properties/Resources.Designer.cs
index bc55bcf..292e4c4 100644
--- a/KeePass/Properties/Resources.Designer.cs
+++ b/KeePass/Properties/Resources.Designer.cs
@@ -1,7 +1,7 @@
 //------------------------------------------------------------------------------
 // <auto-generated>
 //     This code was generated by a tool.
-//     Runtime Version:2.0.50727.4211
+//     Runtime Version:2.0.50727.5446
 //
 //     Changes to this file may cause incorrect behavior and will be lost if
 //     the code is regenerated.
@@ -200,6 +200,13 @@ namespace KeePass.Properties {
             }
         }
         
+        internal static System.Drawing.Bitmap B16x16_EditCopyLink {
+            get {
+                object obj = ResourceManager.GetObject("B16x16_EditCopyLink", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
         internal static System.Drawing.Bitmap B16x16_EditDelete {
             get {
                 object obj = ResourceManager.GetObject("B16x16_EditDelete", resourceCulture);
diff --git a/KeePass/Properties/Resources.resx b/KeePass/Properties/Resources.resx
index e13ee0f..165f24f 100644
--- a/KeePass/Properties/Resources.resx
+++ b/KeePass/Properties/Resources.resx
@@ -571,4 +571,7 @@
   <data name="B16x16_Imp_KasperskyPwMgr" type="System.Resources.ResXFileRef, System.Windows.Forms">
     <value>..\Resources\Images\B16x16_Imp_KasperskyPwMgr.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
   </data>
+  <data name="B16x16_EditCopyLink" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>..\Resources\Nuvola_Derived\B16x16_EditCopyLink.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
 </root>
\ No newline at end of file
diff --git a/KeePass/Resources/KPRes.Generated.cs b/KeePass/Resources/KPRes.Generated.cs
index 50db2ce..07cf926 100644
--- a/KeePass/Resources/KPRes.Generated.cs
+++ b/KeePass/Resources/KPRes.Generated.cs
@@ -74,6 +74,7 @@ namespace KeePass.Resources
 			m_strAutoTypeEntrySelectionDescShort = TryGetEx(dictNew, "AutoTypeEntrySelectionDescShort", m_strAutoTypeEntrySelectionDescShort);
 			m_strAutoTypeGlobalHint = TryGetEx(dictNew, "AutoTypeGlobalHint", m_strAutoTypeGlobalHint);
 			m_strAutoTypeMatchByTitle = TryGetEx(dictNew, "AutoTypeMatchByTitle", m_strAutoTypeMatchByTitle);
+			m_strAutoTypeMatchByUrlInTitle = TryGetEx(dictNew, "AutoTypeMatchByUrlInTitle", m_strAutoTypeMatchByUrlInTitle);
 			m_strAutoTypeObfuscationHint = TryGetEx(dictNew, "AutoTypeObfuscationHint", m_strAutoTypeObfuscationHint);
 			m_strAutoTypePrependInitSeqForIE = TryGetEx(dictNew, "AutoTypePrependInitSeqForIE", m_strAutoTypePrependInitSeqForIE);
 			m_strAutoTypeReleaseAltWithKeyPress = TryGetEx(dictNew, "AutoTypeReleaseAltWithKeyPress", m_strAutoTypeReleaseAltWithKeyPress);
@@ -92,6 +93,7 @@ namespace KeePass.Resources
 			m_strButtonFinish = TryGetEx(dictNew, "ButtonFinish", m_strButtonFinish);
 			m_strButtonNext = TryGetEx(dictNew, "ButtonNext", m_strButtonNext);
 			m_strCancel = TryGetEx(dictNew, "Cancel", m_strCancel);
+			m_strCancelCmd = TryGetEx(dictNew, "CancelCmd", m_strCancelCmd);
 			m_strCannotMoveEntriesBcsGroup = TryGetEx(dictNew, "CannotMoveEntriesBcsGroup", m_strCannotMoveEntriesBcsGroup);
 			m_strChangeMasterKey = TryGetEx(dictNew, "ChangeMasterKey", m_strChangeMasterKey);
 			m_strChangeMasterKeyIntroShort = TryGetEx(dictNew, "ChangeMasterKeyIntroShort", m_strChangeMasterKeyIntroShort);
@@ -129,6 +131,7 @@ namespace KeePass.Resources
 			m_strCopiedEntryData = TryGetEx(dictNew, "CopiedEntryData", m_strCopiedEntryData);
 			m_strCopy = TryGetEx(dictNew, "Copy", m_strCopy);
 			m_strCopyAll = TryGetEx(dictNew, "CopyAll", m_strCopyAll);
+			m_strCopyLink = TryGetEx(dictNew, "CopyLink", m_strCopyLink);
 			m_strCopyOfItem = TryGetEx(dictNew, "CopyOfItem", m_strCopyOfItem);
 			m_strCopyPasswordFull = TryGetEx(dictNew, "CopyPasswordFull", m_strCopyPasswordFull);
 			m_strCopyPasswordMenu = TryGetEx(dictNew, "CopyPasswordMenu", m_strCopyPasswordMenu);
@@ -180,9 +183,8 @@ namespace KeePass.Resources
 			m_strDialogNoShowAgain = TryGetEx(dictNew, "DialogNoShowAgain", m_strDialogNoShowAgain);
 			m_strDisabled = TryGetEx(dictNew, "Disabled", m_strDisabled);
 			m_strDisableSaveIfNotModified = TryGetEx(dictNew, "DisableSaveIfNotModified", m_strDisableSaveIfNotModified);
-			m_strDiscardChanges = TryGetEx(dictNew, "DiscardChanges", m_strDiscardChanges);
+			m_strDiscardChangesCmd = TryGetEx(dictNew, "DiscardChangesCmd", m_strDiscardChangesCmd);
 			m_strDocumentationHint = TryGetEx(dictNew, "DocumentationHint", m_strDocumentationHint);
-			m_strDontDeleteCmd = TryGetEx(dictNew, "DontDeleteCmd", m_strDontDeleteCmd);
 			m_strDragDrop = TryGetEx(dictNew, "DragDrop", m_strDragDrop);
 			m_strDropToBackOnCopy = TryGetEx(dictNew, "DropToBackOnCopy", m_strDropToBackOnCopy);
 			m_strDuplicateStringFieldName = TryGetEx(dictNew, "DuplicateStringFieldName", m_strDuplicateStringFieldName);
@@ -276,8 +278,9 @@ namespace KeePass.Resources
 			m_strFileVerifyHashFailRec = TryGetEx(dictNew, "FileVerifyHashFailRec", m_strFileVerifyHashFailRec);
 			m_strFilter = TryGetEx(dictNew, "Filter", m_strFilter);
 			m_strFind = TryGetEx(dictNew, "Find", m_strFind);
+			m_strFocusQuickFindOnRestore = TryGetEx(dictNew, "FocusQuickFindOnRestore", m_strFocusQuickFindOnRestore);
 			m_strFocusQuickFindOnUntray = TryGetEx(dictNew, "FocusQuickFindOnUntray", m_strFocusQuickFindOnUntray);
-			m_strFocusResultsAfterQuickFind = TryGetEx(dictNew, "FocusResultsAfterQuickFind", m_strFocusResultsAfterQuickFind);
+			m_strFocusResultsAfterQuickSearch = TryGetEx(dictNew, "FocusResultsAfterQuickSearch", m_strFocusResultsAfterQuickSearch);
 			m_strFolder = TryGetEx(dictNew, "Folder", m_strFolder);
 			m_strFont = TryGetEx(dictNew, "Font", m_strFont);
 			m_strForceSystemFontUnix = TryGetEx(dictNew, "ForceSystemFontUnix", m_strForceSystemFontUnix);
@@ -328,6 +331,7 @@ namespace KeePass.Resources
 			m_strImportingStatusMsg = TryGetEx(dictNew, "ImportingStatusMsg", m_strImportingStatusMsg);
 			m_strImportMustRead = TryGetEx(dictNew, "ImportMustRead", m_strImportMustRead);
 			m_strImportMustReadQuestion = TryGetEx(dictNew, "ImportMustReadQuestion", m_strImportMustReadQuestion);
+			m_strIncompatibleWithSorting = TryGetEx(dictNew, "IncompatibleWithSorting", m_strIncompatibleWithSorting);
 			m_strInheritSettingFromParent = TryGetEx(dictNew, "InheritSettingFromParent", m_strInheritSettingFromParent);
 			m_strInternet = TryGetEx(dictNew, "Internet", m_strInternet);
 			m_strInvalidFileStructure = TryGetEx(dictNew, "InvalidFileStructure", m_strInvalidFileStructure);
@@ -358,7 +362,6 @@ namespace KeePass.Resources
 			m_strKeyFileUseExisting = TryGetEx(dictNew, "KeyFileUseExisting", m_strKeyFileUseExisting);
 			m_strKeyProvWithGuiOnSD = TryGetEx(dictNew, "KeyProvWithGuiOnSD", m_strKeyProvWithGuiOnSD);
 			m_strKeyProvWithGuiOnSDHint = TryGetEx(dictNew, "KeyProvWithGuiOnSDHint", m_strKeyProvWithGuiOnSDHint);
-			m_strKeystrokeSequence = TryGetEx(dictNew, "KeystrokeSequence", m_strKeystrokeSequence);
 			m_strLanguageSelected = TryGetEx(dictNew, "LanguageSelected", m_strLanguageSelected);
 			m_strLastAccessTime = TryGetEx(dictNew, "LastAccessTime", m_strLastAccessTime);
 			m_strLastModificationTime = TryGetEx(dictNew, "LastModificationTime", m_strLastModificationTime);
@@ -420,10 +423,13 @@ namespace KeePass.Resources
 			m_strOpenDatabaseFileStc = TryGetEx(dictNew, "OpenDatabaseFileStc", m_strOpenDatabaseFileStc);
 			m_strOpenedDatabaseFile = TryGetEx(dictNew, "OpenedDatabaseFile", m_strOpenedDatabaseFile);
 			m_strOpeningDatabase = TryGetEx(dictNew, "OpeningDatabase", m_strOpeningDatabase);
+			m_strOpenWith = TryGetEx(dictNew, "OpenWith", m_strOpenWith);
 			m_strOptimizeForScreenReader = TryGetEx(dictNew, "OptimizeForScreenReader", m_strOptimizeForScreenReader);
 			m_strOptions = TryGetEx(dictNew, "Options", m_strOptions);
 			m_strOptionsDesc = TryGetEx(dictNew, "OptionsDesc", m_strOptionsDesc);
 			m_strOtherPlaceholders = TryGetEx(dictNew, "OtherPlaceholders", m_strOtherPlaceholders);
+			m_strOverridesBuiltIn = TryGetEx(dictNew, "OverridesBuiltIn", m_strOverridesBuiltIn);
+			m_strOverridesCustom = TryGetEx(dictNew, "OverridesCustom", m_strOverridesCustom);
 			m_strOverwrite = TryGetEx(dictNew, "Overwrite", m_strOverwrite);
 			m_strOverwriteExistingFileQuestion = TryGetEx(dictNew, "OverwriteExistingFileQuestion", m_strOverwriteExistingFileQuestion);
 			m_strPackageInstallHint = TryGetEx(dictNew, "PackageInstallHint", m_strPackageInstallHint);
@@ -465,14 +471,16 @@ namespace KeePass.Resources
 			m_strPolicyNewDatabaseDesc = TryGetEx(dictNew, "PolicyNewDatabaseDesc", m_strPolicyNewDatabaseDesc);
 			m_strPolicyPluginsDesc = TryGetEx(dictNew, "PolicyPluginsDesc", m_strPolicyPluginsDesc);
 			m_strPolicyPrintDesc = TryGetEx(dictNew, "PolicyPrintDesc", m_strPolicyPrintDesc);
+			m_strPolicyPrintNoKeyDesc = TryGetEx(dictNew, "PolicyPrintNoKeyDesc", m_strPolicyPrintNoKeyDesc);
 			m_strPolicyRequiredFlag = TryGetEx(dictNew, "PolicyRequiredFlag", m_strPolicyRequiredFlag);
 			m_strPolicySaveDatabaseDesc = TryGetEx(dictNew, "PolicySaveDatabaseDesc", m_strPolicySaveDatabaseDesc);
 			m_strPolicyTriggersEditDesc = TryGetEx(dictNew, "PolicyTriggersEditDesc", m_strPolicyTriggersEditDesc);
 			m_strPrint = TryGetEx(dictNew, "Print", m_strPrint);
 			m_strPrintDesc = TryGetEx(dictNew, "PrintDesc", m_strPrintDesc);
-			m_strQuickSearch = TryGetEx(dictNew, "QuickSearch", m_strQuickSearch);
-			m_strQuickSearchExcludeExpired = TryGetEx(dictNew, "QuickSearchExcludeExpired", m_strQuickSearchExcludeExpired);
-			m_strQuickSearchInPasswords = TryGetEx(dictNew, "QuickSearchInPasswords", m_strQuickSearchInPasswords);
+			m_strQuickSearchExclExpired = TryGetEx(dictNew, "QuickSearchExclExpired", m_strQuickSearchExclExpired);
+			m_strQuickSearchInPwFields = TryGetEx(dictNew, "QuickSearchInPwFields", m_strQuickSearchInPwFields);
+			m_strQuickSearchDerefData = TryGetEx(dictNew, "QuickSearchDerefData", m_strQuickSearchDerefData);
+			m_strQuickSearchTb = TryGetEx(dictNew, "QuickSearchTb", m_strQuickSearchTb);
 			m_strRandomMacAddress = TryGetEx(dictNew, "RandomMacAddress", m_strRandomMacAddress);
 			m_strReady = TryGetEx(dictNew, "Ready", m_strReady);
 			m_strRecycleBin = TryGetEx(dictNew, "RecycleBin", m_strRecycleBin);
@@ -498,6 +506,7 @@ namespace KeePass.Resources
 			m_strSearch = TryGetEx(dictNew, "Search", m_strSearch);
 			m_strSearchDesc = TryGetEx(dictNew, "SearchDesc", m_strSearchDesc);
 			m_strSearchGroupName = TryGetEx(dictNew, "SearchGroupName", m_strSearchGroupName);
+			m_strSearchingOp = TryGetEx(dictNew, "SearchingOp", m_strSearchingOp);
 			m_strSearchItemsFoundSmall = TryGetEx(dictNew, "SearchItemsFoundSmall", m_strSearchItemsFoundSmall);
 			m_strSearchKeyFiles = TryGetEx(dictNew, "SearchKeyFiles", m_strSearchKeyFiles);
 			m_strSearchKeyFilesAlsoOnRemovable = TryGetEx(dictNew, "SearchKeyFilesAlsoOnRemovable", m_strSearchKeyFilesAlsoOnRemovable);
@@ -515,13 +524,17 @@ namespace KeePass.Resources
 			m_strSelectLanguage = TryGetEx(dictNew, "SelectLanguage", m_strSelectLanguage);
 			m_strSelectLanguageDesc = TryGetEx(dictNew, "SelectLanguageDesc", m_strSelectLanguageDesc);
 			m_strSelfTestFailed = TryGetEx(dictNew, "SelfTestFailed", m_strSelfTestFailed);
+			m_strSequence = TryGetEx(dictNew, "Sequence", m_strSequence);
 			m_strShowAllEntries = TryGetEx(dictNew, "ShowAllEntries", m_strShowAllEntries);
+			m_strShowDerefData = TryGetEx(dictNew, "ShowDerefData", m_strShowDerefData);
+			m_strShowDerefDataAsync = TryGetEx(dictNew, "ShowDerefDataAsync", m_strShowDerefDataAsync);
 			m_strShowEntries = TryGetEx(dictNew, "ShowEntries", m_strShowEntries);
 			m_strShowExpiredEntries = TryGetEx(dictNew, "ShowExpiredEntries", m_strShowExpiredEntries);
 			m_strShowFullPathInTitleBar = TryGetEx(dictNew, "ShowFullPathInTitleBar", m_strShowFullPathInTitleBar);
 			m_strShowIn = TryGetEx(dictNew, "ShowIn", m_strShowIn);
 			m_strShowTrayOnlyIfTrayed = TryGetEx(dictNew, "ShowTrayOnlyIfTrayed", m_strShowTrayOnlyIfTrayed);
 			m_strSize = TryGetEx(dictNew, "Size", m_strSize);
+			m_strSlow = TryGetEx(dictNew, "Slow", m_strSlow);
 			m_strSoonToExpireEntries = TryGetEx(dictNew, "SoonToExpireEntries", m_strSoonToExpireEntries);
 			m_strSpecialKeys = TryGetEx(dictNew, "SpecialKeys", m_strSpecialKeys);
 			m_strStandardExpireSelect = TryGetEx(dictNew, "StandardExpireSelect", m_strStandardExpireSelect);
@@ -673,6 +686,7 @@ namespace KeePass.Resources
 			"AutoTypeEntrySelectionDescShort",
 			"AutoTypeGlobalHint",
 			"AutoTypeMatchByTitle",
+			"AutoTypeMatchByUrlInTitle",
 			"AutoTypeObfuscationHint",
 			"AutoTypePrependInitSeqForIE",
 			"AutoTypeReleaseAltWithKeyPress",
@@ -691,6 +705,7 @@ namespace KeePass.Resources
 			"ButtonFinish",
 			"ButtonNext",
 			"Cancel",
+			"CancelCmd",
 			"CannotMoveEntriesBcsGroup",
 			"ChangeMasterKey",
 			"ChangeMasterKeyIntroShort",
@@ -728,6 +743,7 @@ namespace KeePass.Resources
 			"CopiedEntryData",
 			"Copy",
 			"CopyAll",
+			"CopyLink",
 			"CopyOfItem",
 			"CopyPasswordFull",
 			"CopyPasswordMenu",
@@ -779,9 +795,8 @@ namespace KeePass.Resources
 			"DialogNoShowAgain",
 			"Disabled",
 			"DisableSaveIfNotModified",
-			"DiscardChanges",
+			"DiscardChangesCmd",
 			"DocumentationHint",
-			"DontDeleteCmd",
 			"DragDrop",
 			"DropToBackOnCopy",
 			"DuplicateStringFieldName",
@@ -875,8 +890,9 @@ namespace KeePass.Resources
 			"FileVerifyHashFailRec",
 			"Filter",
 			"Find",
+			"FocusQuickFindOnRestore",
 			"FocusQuickFindOnUntray",
-			"FocusResultsAfterQuickFind",
+			"FocusResultsAfterQuickSearch",
 			"Folder",
 			"Font",
 			"ForceSystemFontUnix",
@@ -927,6 +943,7 @@ namespace KeePass.Resources
 			"ImportingStatusMsg",
 			"ImportMustRead",
 			"ImportMustReadQuestion",
+			"IncompatibleWithSorting",
 			"InheritSettingFromParent",
 			"Internet",
 			"InvalidFileStructure",
@@ -957,7 +974,6 @@ namespace KeePass.Resources
 			"KeyFileUseExisting",
 			"KeyProvWithGuiOnSD",
 			"KeyProvWithGuiOnSDHint",
-			"KeystrokeSequence",
 			"LanguageSelected",
 			"LastAccessTime",
 			"LastModificationTime",
@@ -1019,10 +1035,13 @@ namespace KeePass.Resources
 			"OpenDatabaseFileStc",
 			"OpenedDatabaseFile",
 			"OpeningDatabase",
+			"OpenWith",
 			"OptimizeForScreenReader",
 			"Options",
 			"OptionsDesc",
 			"OtherPlaceholders",
+			"OverridesBuiltIn",
+			"OverridesCustom",
 			"Overwrite",
 			"OverwriteExistingFileQuestion",
 			"PackageInstallHint",
@@ -1064,14 +1083,16 @@ namespace KeePass.Resources
 			"PolicyNewDatabaseDesc",
 			"PolicyPluginsDesc",
 			"PolicyPrintDesc",
+			"PolicyPrintNoKeyDesc",
 			"PolicyRequiredFlag",
 			"PolicySaveDatabaseDesc",
 			"PolicyTriggersEditDesc",
 			"Print",
 			"PrintDesc",
-			"QuickSearch",
-			"QuickSearchExcludeExpired",
-			"QuickSearchInPasswords",
+			"QuickSearchExclExpired",
+			"QuickSearchInPwFields",
+			"QuickSearchDerefData",
+			"QuickSearchTb",
 			"RandomMacAddress",
 			"Ready",
 			"RecycleBin",
@@ -1097,6 +1118,7 @@ namespace KeePass.Resources
 			"Search",
 			"SearchDesc",
 			"SearchGroupName",
+			"SearchingOp",
 			"SearchItemsFoundSmall",
 			"SearchKeyFiles",
 			"SearchKeyFilesAlsoOnRemovable",
@@ -1114,13 +1136,17 @@ namespace KeePass.Resources
 			"SelectLanguage",
 			"SelectLanguageDesc",
 			"SelfTestFailed",
+			"Sequence",
 			"ShowAllEntries",
+			"ShowDerefData",
+			"ShowDerefDataAsync",
 			"ShowEntries",
 			"ShowExpiredEntries",
 			"ShowFullPathInTitleBar",
 			"ShowIn",
 			"ShowTrayOnlyIfTrayed",
 			"Size",
+			"Slow",
 			"SoonToExpireEntries",
 			"SpecialKeys",
 			"StandardExpireSelect",
@@ -1756,6 +1782,17 @@ namespace KeePass.Resources
 			get { return m_strAutoTypeMatchByTitle; }
 		}
 
+		private static string m_strAutoTypeMatchByUrlInTitle =
+			@"An entry matches if its URL is contained in the target window title";
+		/// <summary>
+		/// Look up a localized string similar to
+		/// 'An entry matches if its URL is contained in the target window title'.
+		/// </summary>
+		public static string AutoTypeMatchByUrlInTitle
+		{
+			get { return m_strAutoTypeMatchByUrlInTitle; }
+		}
+
 		private static string m_strAutoTypeObfuscationHint =
 			@"Auto-type obfuscation may not work with all windows.";
 		/// <summary>
@@ -1954,6 +1991,17 @@ namespace KeePass.Resources
 			get { return m_strCancel; }
 		}
 
+		private static string m_strCancelCmd =
+			@"&Cancel";
+		/// <summary>
+		/// Look up a localized string similar to
+		/// '&Cancel'.
+		/// </summary>
+		public static string CancelCmd
+		{
+			get { return m_strCancelCmd; }
+		}
+
 		private static string m_strCannotMoveEntriesBcsGroup =
 			@"Cannot move entries because they aren't stored in the same group.";
 		/// <summary>
@@ -2361,6 +2409,17 @@ namespace KeePass.Resources
 			get { return m_strCopyAll; }
 		}
 
+		private static string m_strCopyLink =
+			@"Copy Link";
+		/// <summary>
+		/// Look up a localized string similar to
+		/// 'Copy Link'.
+		/// </summary>
+		public static string CopyLink
+		{
+			get { return m_strCopyLink; }
+		}
+
 		private static string m_strCopyOfItem =
 			@"Copy";
 		/// <summary>
@@ -2922,15 +2981,15 @@ namespace KeePass.Resources
 			get { return m_strDisableSaveIfNotModified; }
 		}
 
-		private static string m_strDiscardChanges =
-			@"Discard changes";
+		private static string m_strDiscardChangesCmd =
+			@"&Discard changes";
 		/// <summary>
 		/// Look up a localized string similar to
-		/// 'Discard changes'.
+		/// '&Discard changes'.
 		/// </summary>
-		public static string DiscardChanges
+		public static string DiscardChangesCmd
 		{
-			get { return m_strDiscardChanges; }
+			get { return m_strDiscardChangesCmd; }
 		}
 
 		private static string m_strDocumentationHint =
@@ -2944,17 +3003,6 @@ namespace KeePass.Resources
 			get { return m_strDocumentationHint; }
 		}
 
-		private static string m_strDontDeleteCmd =
-			@"Do&n't delete";
-		/// <summary>
-		/// Look up a localized string similar to
-		/// 'Do&n't delete'.
-		/// </summary>
-		public static string DontDeleteCmd
-		{
-			get { return m_strDontDeleteCmd; }
-		}
-
 		private static string m_strDragDrop =
 			@"Drag&Drop";
 		/// <summary>
@@ -3978,6 +4026,17 @@ namespace KeePass.Resources
 			get { return m_strFind; }
 		}
 
+		private static string m_strFocusQuickFindOnRestore =
+			@"Focus quick search box when restoring from taskbar";
+		/// <summary>
+		/// Look up a localized string similar to
+		/// 'Focus quick search box when restoring from taskbar'.
+		/// </summary>
+		public static string FocusQuickFindOnRestore
+		{
+			get { return m_strFocusQuickFindOnRestore; }
+		}
+
 		private static string m_strFocusQuickFindOnUntray =
 			@"Focus quick search box when restoring from tray";
 		/// <summary>
@@ -3989,15 +4048,15 @@ namespace KeePass.Resources
 			get { return m_strFocusQuickFindOnUntray; }
 		}
 
-		private static string m_strFocusResultsAfterQuickFind =
-			@"Focus entry list after a successful quick search (toolbar)";
+		private static string m_strFocusResultsAfterQuickSearch =
+			@"Focus entry list after a successful quick search";
 		/// <summary>
 		/// Look up a localized string similar to
-		/// 'Focus entry list after a successful quick search (toolbar)'.
+		/// 'Focus entry list after a successful quick search'.
 		/// </summary>
-		public static string FocusResultsAfterQuickFind
+		public static string FocusResultsAfterQuickSearch
 		{
-			get { return m_strFocusResultsAfterQuickFind; }
+			get { return m_strFocusResultsAfterQuickSearch; }
 		}
 
 		private static string m_strFolder =
@@ -4550,6 +4609,17 @@ namespace KeePass.Resources
 			get { return m_strImportMustReadQuestion; }
 		}
 
+		private static string m_strIncompatibleWithSorting =
+			@"incompatible with sorting";
+		/// <summary>
+		/// Look up a localized string similar to
+		/// 'incompatible with sorting'.
+		/// </summary>
+		public static string IncompatibleWithSorting
+		{
+			get { return m_strIncompatibleWithSorting; }
+		}
+
 		private static string m_strInheritSettingFromParent =
 			@"Inherit setting from parent";
 		/// <summary>
@@ -4880,17 +4950,6 @@ namespace KeePass.Resources
 			get { return m_strKeyProvWithGuiOnSDHint; }
 		}
 
-		private static string m_strKeystrokeSequence =
-			@"Keystroke Sequence";
-		/// <summary>
-		/// Look up a localized string similar to
-		/// 'Keystroke Sequence'.
-		/// </summary>
-		public static string KeystrokeSequence
-		{
-			get { return m_strKeystrokeSequence; }
-		}
-
 		private static string m_strLanguageSelected =
 			@"The selected language has been activated. KeePass must be restarted in order to load the language.";
 		/// <summary>
@@ -5562,6 +5621,17 @@ namespace KeePass.Resources
 			get { return m_strOpeningDatabase; }
 		}
 
+		private static string m_strOpenWith =
+			@"Open with {PARAM}";
+		/// <summary>
+		/// Look up a localized string similar to
+		/// 'Open with {PARAM}'.
+		/// </summary>
+		public static string OpenWith
+		{
+			get { return m_strOpenWith; }
+		}
+
 		private static string m_strOptimizeForScreenReader =
 			@"Optimize for screen reader (only enable if you're using a screen reader)";
 		/// <summary>
@@ -5606,6 +5676,28 @@ namespace KeePass.Resources
 			get { return m_strOtherPlaceholders; }
 		}
 
+		private static string m_strOverridesBuiltIn =
+			@"Built-In Overrides";
+		/// <summary>
+		/// Look up a localized string similar to
+		/// 'Built-In Overrides'.
+		/// </summary>
+		public static string OverridesBuiltIn
+		{
+			get { return m_strOverridesBuiltIn; }
+		}
+
+		private static string m_strOverridesCustom =
+			@"Custom Overrides";
+		/// <summary>
+		/// Look up a localized string similar to
+		/// 'Custom Overrides'.
+		/// </summary>
+		public static string OverridesCustom
+		{
+			get { return m_strOverridesCustom; }
+		}
+
 		private static string m_strOverwrite =
 			@"Overwrite";
 		/// <summary>
@@ -6057,6 +6149,17 @@ namespace KeePass.Resources
 			get { return m_strPolicyPrintDesc; }
 		}
 
+		private static string m_strPolicyPrintNoKeyDesc =
+			@"Do not require entering current master key before printing.";
+		/// <summary>
+		/// Look up a localized string similar to
+		/// 'Do not require entering current master key before printing.'.
+		/// </summary>
+		public static string PolicyPrintNoKeyDesc
+		{
+			get { return m_strPolicyPrintNoKeyDesc; }
+		}
+
 		private static string m_strPolicyRequiredFlag =
 			@"The following policy flag is required";
 		/// <summary>
@@ -6112,37 +6215,48 @@ namespace KeePass.Resources
 			get { return m_strPrintDesc; }
 		}
 
-		private static string m_strQuickSearch =
-			@"Quick Search";
+		private static string m_strQuickSearchExclExpired =
+			@"Exclude expired entries in quick searches";
 		/// <summary>
 		/// Look up a localized string similar to
-		/// 'Quick Search'.
+		/// 'Exclude expired entries in quick searches'.
 		/// </summary>
-		public static string QuickSearch
+		public static string QuickSearchExclExpired
 		{
-			get { return m_strQuickSearch; }
+			get { return m_strQuickSearchExclExpired; }
 		}
 
-		private static string m_strQuickSearchExcludeExpired =
-			@"Exclude expired entries in quick searches (toolbar)";
+		private static string m_strQuickSearchInPwFields =
+			@"Search for passwords in quick searches";
 		/// <summary>
 		/// Look up a localized string similar to
-		/// 'Exclude expired entries in quick searches (toolbar)'.
+		/// 'Search for passwords in quick searches'.
 		/// </summary>
-		public static string QuickSearchExcludeExpired
+		public static string QuickSearchInPwFields
 		{
-			get { return m_strQuickSearchExcludeExpired; }
+			get { return m_strQuickSearchInPwFields; }
 		}
 
-		private static string m_strQuickSearchInPasswords =
-			@"Search for passwords in quick searches (toolbar)";
+		private static string m_strQuickSearchDerefData =
+			@"Resolve field references in quick searches";
 		/// <summary>
 		/// Look up a localized string similar to
-		/// 'Search for passwords in quick searches (toolbar)'.
+		/// 'Resolve field references in quick searches'.
 		/// </summary>
-		public static string QuickSearchInPasswords
+		public static string QuickSearchDerefData
 		{
-			get { return m_strQuickSearchInPasswords; }
+			get { return m_strQuickSearchDerefData; }
+		}
+
+		private static string m_strQuickSearchTb =
+			@"Quick Search (Toolbar)";
+		/// <summary>
+		/// Look up a localized string similar to
+		/// 'Quick Search (Toolbar)'.
+		/// </summary>
+		public static string QuickSearchTb
+		{
+			get { return m_strQuickSearchTb; }
 		}
 
 		private static string m_strRandomMacAddress =
@@ -6420,6 +6534,17 @@ namespace KeePass.Resources
 			get { return m_strSearchGroupName; }
 		}
 
+		private static string m_strSearchingOp =
+			@"Searching";
+		/// <summary>
+		/// Look up a localized string similar to
+		/// 'Searching'.
+		/// </summary>
+		public static string SearchingOp
+		{
+			get { return m_strSearchingOp; }
+		}
+
 		private static string m_strSearchItemsFoundSmall =
 			@"entries found.";
 		/// <summary>
@@ -6607,6 +6732,17 @@ namespace KeePass.Resources
 			get { return m_strSelfTestFailed; }
 		}
 
+		private static string m_strSequence =
+			@"Sequence";
+		/// <summary>
+		/// Look up a localized string similar to
+		/// 'Sequence'.
+		/// </summary>
+		public static string Sequence
+		{
+			get { return m_strSequence; }
+		}
+
 		private static string m_strShowAllEntries =
 			@"Show All Entries";
 		/// <summary>
@@ -6618,6 +6754,28 @@ namespace KeePass.Resources
 			get { return m_strShowAllEntries; }
 		}
 
+		private static string m_strShowDerefData =
+			@"Show dereferenced data";
+		/// <summary>
+		/// Look up a localized string similar to
+		/// 'Show dereferenced data'.
+		/// </summary>
+		public static string ShowDerefData
+		{
+			get { return m_strShowDerefData; }
+		}
+
+		private static string m_strShowDerefDataAsync =
+			@"Show dereferenced data asynchronously";
+		/// <summary>
+		/// Look up a localized string similar to
+		/// 'Show dereferenced data asynchronously'.
+		/// </summary>
+		public static string ShowDerefDataAsync
+		{
+			get { return m_strShowDerefDataAsync; }
+		}
+
 		private static string m_strShowEntries =
 			@"Show Entries";
 		/// <summary>
@@ -6684,6 +6842,17 @@ namespace KeePass.Resources
 			get { return m_strSize; }
 		}
 
+		private static string m_strSlow =
+			@"slow";
+		/// <summary>
+		/// Look up a localized string similar to
+		/// 'slow'.
+		/// </summary>
+		public static string Slow
+		{
+			get { return m_strSlow; }
+		}
+
 		private static string m_strSoonToExpireEntries =
 			@"Expired Entries and Entries That Will Expire Soon";
 		/// <summary>
diff --git a/KeePass/Resources/Nuvola_Derived/B16x16_EditCopyLink.png b/KeePass/Resources/Nuvola_Derived/B16x16_EditCopyLink.png
new file mode 100644
index 0000000..731f611
Binary files /dev/null and b/KeePass/Resources/Nuvola_Derived/B16x16_EditCopyLink.png differ
diff --git a/KeePass/UI/AsyncPwListUpdate.cs b/KeePass/UI/AsyncPwListUpdate.cs
new file mode 100644
index 0000000..8c47c15
--- /dev/null
+++ b/KeePass/UI/AsyncPwListUpdate.cs
@@ -0,0 +1,265 @@
+/*
+  KeePass Password Safe - The Open-Source Password Manager
+  Copyright (C) 2003-2011 Dominik Reichl <dominik.reichl at t-online.de>
+
+  This program is free software; you can redistribute it and/or modify
+  it under the terms of the GNU General Public License as published by
+  the Free Software Foundation; either version 2 of the License, or
+  (at your option) any later version.
+
+  This program is distributed in the hope that it will be useful,
+  but WITHOUT ANY WARRANTY; without even the implied warranty of
+  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+  GNU General Public License for more details.
+
+  You should have received a copy of the GNU General Public License
+  along with this program; if not, write to the Free Software
+  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+*/
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using System.Windows.Forms;
+using System.Threading;
+using System.Diagnostics;
+
+using KeePass.Forms;
+using KeePass.Util.Spr;
+
+using KeePassLib;
+
+namespace KeePass.UI
+{
+	public sealed class PwListItem
+	{
+		private static long m_idNext = 1;
+
+		private readonly PwEntry m_pe;
+		public PwEntry Entry
+		{
+			get { return m_pe; }
+		}
+
+		private readonly long m_id;
+		public long ListViewItemID
+		{
+			get { return m_id; }
+		}
+
+		public PwListItem(PwEntry pe)
+		{
+			if(pe == null) throw new ArgumentNullException("pe");
+
+			m_pe = pe;
+
+			m_id = m_idNext;
+			unchecked { ++m_idNext; }
+		}
+	}
+
+	public delegate string PwTextUpdateDelegate(string strText, PwListItem li);
+
+	public sealed class AsyncPwListUpdate
+	{
+		private readonly ListView m_lv;
+
+		private object m_objListEditSync = new object();
+		public object ListEditSyncObject
+		{
+			get { return m_objListEditSync; }
+		}
+
+		private Dictionary<long, bool> m_dValidIDs = new Dictionary<long, bool>();
+		private object m_objValidIDsSync = new object();
+
+		private sealed class LviUpdInfo
+		{
+			public ListView ListView { get; set; }
+
+			public long UpdateID { get; set; }
+
+			public string Text { get; set; }
+			public PwListItem ListItem { get; set; }
+			public int IndexHint { get; set; }
+			public int SubItem { get; set; }
+
+			public PwTextUpdateDelegate Function { get; set; }
+
+			public object ListEditSyncObject { get; set; }
+
+			public object ValidIDsSyncObject { get; set; }
+			public Dictionary<long, bool> ValidIDs { get; set; }
+		}
+
+		public AsyncPwListUpdate(ListView lv)
+		{
+			if(lv == null) throw new ArgumentNullException("lv");
+
+			m_lv = lv;
+		}
+
+		public void Queue(string strText, PwListItem li, int iIndexHint,
+			int iSubItem, PwTextUpdateDelegate f)
+		{
+			if(strText == null) { Debug.Assert(false); return; }
+			if(li == null) { Debug.Assert(false); return; }
+			if(iSubItem < 0) { Debug.Assert(false); return; }
+			if(f == null) { Debug.Assert(false); return; }
+
+			LviUpdInfo state = new LviUpdInfo();
+			state.ListView = m_lv;
+			state.UpdateID = unchecked((li.ListViewItemID << 6) + iSubItem);
+			state.Text = strText;
+			state.ListItem = li;
+			state.IndexHint = ((iIndexHint >= 0) ? iIndexHint : 0);
+			state.SubItem = iSubItem;
+			state.Function = f;
+			state.ListEditSyncObject = m_objListEditSync;
+			state.ValidIDsSyncObject = m_objValidIDsSync;
+			state.ValidIDs = m_dValidIDs;
+
+			lock(m_objValidIDsSync)
+			{
+				Debug.Assert(!m_dValidIDs.ContainsKey(state.UpdateID));
+				m_dValidIDs[state.UpdateID] = true;
+			}
+
+			try
+			{
+				if(!ThreadPool.QueueUserWorkItem(new WaitCallback(UpdateItemFn),
+					state)) throw new InvalidOperationException();
+			}
+			catch(Exception)
+			{
+				Debug.Assert(false);
+				lock(m_objValidIDsSync) { m_dValidIDs.Remove(state.UpdateID); }
+			}
+		}
+
+		/// <summary>
+		/// Cancel all pending updates. This method is asynchronous,
+		/// i.e. it returns immediately and the number of queued
+		/// updates will decrease continually.
+		/// </summary>
+		public void CancelPendingUpdatesAsync()
+		{
+			lock(m_objValidIDsSync)
+			{
+				List<long> vKeys = new List<long>(m_dValidIDs.Keys);
+				foreach(long lKey in vKeys)
+				{
+					m_dValidIDs[lKey] = false;
+				}
+			}
+		}
+
+		public void WaitAll()
+		{
+			while(true)
+			{
+				lock(m_objValidIDsSync)
+				{
+					if(m_dValidIDs.Count == 0) break;
+				}
+
+				Thread.Sleep(4);
+				Application.DoEvents();
+			}
+		}
+
+		private static void UpdateItemFn(object state)
+		{
+			LviUpdInfo lui = (state as LviUpdInfo);
+			if(lui == null) { Debug.Assert(false); return; }
+
+			try // Avoid cross-thread exceptions
+			{
+				bool bWork;
+				lock(lui.ValidIDsSyncObject)
+				{
+					if(!lui.ValidIDs.TryGetValue(lui.UpdateID,
+						out bWork)) { Debug.Assert(false); return; }
+				}
+
+				if(bWork)
+				{
+					string strNew = lui.Function(lui.Text, lui.ListItem);
+					if(strNew == null) { Debug.Assert(false); return; }
+					if(strNew == lui.Text) return;
+
+					// if(lui.ListView.InvokeRequired)
+					lui.ListView.Invoke(new SetItemTextDelegate(
+						SetItemText), new object[] { strNew, lui });
+					// else SetItemText(strNew, lui);
+				}
+			}
+			catch(Exception) { Debug.Assert(false); }
+			finally
+			{
+				try // Avoid cross-thread exceptions
+				{
+					lock(lui.ValidIDsSyncObject)
+					{
+						if(!lui.ValidIDs.Remove(lui.UpdateID)) { Debug.Assert(false); }
+					}
+				}
+				catch(Exception) { Debug.Assert(false); }
+			}
+		}
+
+		private delegate void SetItemTextDelegate(string strText, LviUpdInfo lui);
+
+		private static void SetItemText(string strText, LviUpdInfo lui)
+		{
+			try // Avoid cross-thread exceptions
+			{
+				long lTargetID = lui.ListItem.ListViewItemID;
+				int iIndexHint = lui.IndexHint;
+
+				lock(lui.ListEditSyncObject)
+				{
+					ListView.ListViewItemCollection lvic = lui.ListView.Items;
+					int nCount = lvic.Count;
+
+					// for(int i = 0; i < nCount; ++i)
+					for(int i = nCount; i > 0; --i)
+					{
+						int j = ((iIndexHint + i) % nCount);
+						ListViewItem lvi = lvic[j];
+
+						PwListItem li = (lvi.Tag as PwListItem);
+						if(li == null) { Debug.Assert(false); continue; }
+
+						if(li.ListViewItemID != lTargetID) continue;
+
+						lvi.SubItems[lui.SubItem].Text = strText;
+						break;
+					}
+				}
+			}
+			catch(Exception) { Debug.Assert(false); }
+		}
+
+		internal static string SprCompileFn(string strText, PwListItem li)
+		{
+			string strCmp = null;
+
+			while(strCmp == null)
+			{
+				try
+				{
+					strCmp = SprEngine.Compile(strText, MainForm.GetEntryListSprContext(
+						li.Entry, Program.MainForm.DocumentManager.SafeFindContainerOf(
+						li.Entry)));
+				}
+				catch(InvalidOperationException) { } // Probably collection changed
+				catch(NullReferenceException) { } // Objects disposed already
+				catch(Exception) { Debug.Assert(false); }
+			}
+
+			if(strCmp == strText) return strText;
+			return (strCmp + " - " + strText);
+		}
+	}
+}
diff --git a/KeePass/UI/BannerFactory.cs b/KeePass/UI/BannerFactory.cs
index 63e52c0..5494957 100644
--- a/KeePass/UI/BannerFactory.cs
+++ b/KeePass/UI/BannerFactory.cs
@@ -68,7 +68,8 @@ namespace KeePass.UI
 
 	public static class BannerFactory
 	{
-		private static Dictionary<string, Image> m_vImageCache = new Dictionary<string, Image>();
+		private static Dictionary<string, Image> m_vImageCache =
+			new Dictionary<string, Image>();
 		private const int MaxCachedImages = 32;
 
 		private static BfBannerGenerator m_pCustomGen = null;
@@ -81,6 +82,12 @@ namespace KeePass.UI
 		public static Image CreateBanner(int nWidth, int nHeight, BannerStyle bs,
 			Image imgIcon, string strTitle, string strLine)
 		{
+			return CreateBanner(nWidth, nHeight, bs, imgIcon, strTitle, strLine, false);
+		}
+
+		public static Image CreateBanner(int nWidth, int nHeight, BannerStyle bs,
+			Image imgIcon, string strTitle, string strLine, bool bNoCache)
+		{
 			// imgIcon may be null.
 			Debug.Assert(strTitle != null); if(strTitle == null) throw new ArgumentNullException("strTitle");
 			Debug.Assert(strLine != null); if(strLine == null) throw new ArgumentNullException("strLine");
@@ -99,11 +106,11 @@ namespace KeePass.UI
 
 			strImageID += ":" + ((uint)bs).ToString();
 
-			// Try getting the banner from the banner cache.
-			Image img;
-			if(m_vImageCache.TryGetValue(strImageID, out img)) return img;
+			// Try getting the banner from the banner cache
+			Image img = null;
+			if(!bNoCache && m_vImageCache.TryGetValue(strImageID, out img))
+				return img;
 
-			Debug.Assert(img == null);
 			if(m_pCustomGen != null)
 				img = m_pCustomGen(new BfBannerInfo(nWidth, nHeight, bs, imgIcon,
 					strTitle, strLine));
@@ -283,17 +290,20 @@ namespace KeePass.UI
 				g.Dispose();
 			}
 
-			if(m_vImageCache.Count >= MaxCachedImages)
+			if(!bNoCache)
 			{
-				foreach(string strKey in m_vImageCache.Keys)
+				if(m_vImageCache.Count >= MaxCachedImages)
 				{
-					m_vImageCache.Remove(strKey);
-					break; // Remove first item only
+					foreach(string strKey in m_vImageCache.Keys)
+					{
+						m_vImageCache.Remove(strKey);
+						break; // Remove first item only
+					}
 				}
-			}
 
-			// Save in cache
-			m_vImageCache[strImageID] = img;
+				// Save in cache
+				m_vImageCache[strImageID] = img;
+			}
 
 			return img;
 		}
@@ -324,14 +334,45 @@ namespace KeePass.UI
 		public static void CreateBannerEx(Form f, PictureBox picBox, Image imgIcon,
 			string strTitle, string strLine)
 		{
+			CreateBannerEx(f, picBox, imgIcon, strTitle, strLine, false);
+		}
+
+		public static void CreateBannerEx(Form f, PictureBox picBox, Image imgIcon,
+			string strTitle, string strLine, bool bNoCache)
+		{
 			if(picBox == null) { Debug.Assert(false); return; }
 
 			try
 			{
 				picBox.Image = CreateBanner(picBox.Width, picBox.Height,
-					BannerStyle.Default, imgIcon, strTitle, strLine);
+					BannerStyle.Default, imgIcon, strTitle, strLine, bNoCache);
 			}
 			catch(Exception) { Debug.Assert(false); }
 		}
+
+		/// <summary>
+		/// Update/create a dialog banner. This method is intended for
+		/// updating banners in resizable dialogs. The created banner
+		/// images bypass the cache of the factory and are disposed
+		/// when the dialog is resized (i.e. the caller shouldn't do
+		/// anything with the banner images).
+		/// </summary>
+		public static void UpdateBanner(Form f, PictureBox picBox, Image imgIcon,
+			string strTitle, string strLine, ref int nOldWidth)
+		{
+			int nWidth = picBox.Width;
+			if(nWidth != nOldWidth)
+			{
+				Image imgPrev = null;
+				if(nOldWidth >= 0) imgPrev = picBox.Image;
+
+				BannerFactory.CreateBannerEx(f, picBox, imgIcon, strTitle,
+					strLine, true);
+
+				if(imgPrev != null) imgPrev.Dispose(); // Release old banner
+
+				nOldWidth = nWidth;
+			}
+		}
 	}
 }
diff --git a/KeePass/UI/CheckedLVItemDXList.cs b/KeePass/UI/CheckedLVItemDXList.cs
index 70a1375..54ada4a 100644
--- a/KeePass/UI/CheckedLVItemDXList.cs
+++ b/KeePass/UI/CheckedLVItemDXList.cs
@@ -30,22 +30,83 @@ using KeePassLib.Utility;
 
 namespace KeePass.UI
 {
+	public enum CheckItemLinkType
+	{
+		None = 0,
+		CheckedChecked,
+		UncheckedUnchecked,
+		CheckedUnchecked,
+		UncheckedChecked
+	}
+
 	public sealed class CheckedLVItemDXList
 	{
+		private ListView m_lv;
+
 		private List<object> m_vObjects = new List<object>();
 		private List<PropertyInfo> m_vProperties = new List<PropertyInfo>();
 		private List<ListViewItem> m_vListViewItems = new List<ListViewItem>();
 
-		public CheckedLVItemDXList()
+		private List<CheckItemLink> m_vLinks = new List<CheckItemLink>();
+
+		private sealed class CheckItemLink
+		{
+			private ListViewItem m_lvSource;
+			public ListViewItem Source { get { return m_lvSource; } }
+
+			private ListViewItem m_lvTarget;
+			public ListViewItem Target { get { return m_lvTarget; } }
+
+			private CheckItemLinkType m_t;
+			public CheckItemLinkType Type { get { return m_t; } }
+
+			public CheckItemLink(ListViewItem lviSource, ListViewItem lviTarget,
+				CheckItemLinkType cilType)
+			{
+				m_lvSource = lviSource;
+				m_lvTarget = lviTarget;
+				m_t = cilType;
+			}
+		}
+
+		public CheckedLVItemDXList(ListView lv)
+		{
+			if(lv == null) throw new ArgumentNullException("lv");
+
+			m_lv = lv;
+			m_lv.ItemChecked += this.OnItemCheckedChanged;
+		}
+
+#if DEBUG
+		~CheckedLVItemDXList()
 		{
+			Debug.Assert(m_lv == null); // Release should have been called
+		}
+#endif
+
+		public void Release()
+		{
+			if(m_lv == null) { Debug.Assert(false); return; }
+
+			m_vObjects.Clear();
+			m_vProperties.Clear();
+			m_vListViewItems.Clear();
+			m_vLinks.Clear();
+
+			m_lv.ItemChecked -= this.OnItemCheckedChanged;
+			m_lv = null;
 		}
 
 		public void UpdateData(bool bGuiToInternals)
 		{
+			if(m_lv == null) { Debug.Assert(false); return; }
+
 			for(int i = 0; i < m_vObjects.Count; ++i)
 			{
 				object o = m_vObjects[i];
 
+				Debug.Assert(m_vListViewItems[i].Index >= 0);
+				Debug.Assert(m_lv.Items.IndexOf(m_vListViewItems[i]) >= 0);
 				if(bGuiToInternals)
 				{
 					bool bChecked = m_vListViewItems[i].Checked;
@@ -60,18 +121,19 @@ namespace KeePass.UI
 		}
 
 		public ListViewItem CreateItem(object pContainer, string strPropertyName,
-			ListView lvList, ListViewGroup lvgContainer, string strDisplayString)
+			ListViewGroup lvgContainer, string strDisplayString)
 		{
 			if(pContainer == null) throw new ArgumentNullException("pContainer");
 			if(strPropertyName == null) throw new ArgumentNullException("strPropertyName");
 			if(strPropertyName.Length == 0) throw new ArgumentException();
-			if(lvList == null) throw new ArgumentNullException("lvList");
 			if(strDisplayString == null) throw new ArgumentNullException("strDisplayString");
 
+			if(m_lv == null) { Debug.Assert(false); return null; }
+
 			Type t = pContainer.GetType();
 			PropertyInfo pi = t.GetProperty(strPropertyName);
 			if((pi == null) || (pi.PropertyType != typeof(bool)) ||
-				(pi.CanRead == false) || (pi.CanWrite == false))
+				!pi.CanRead || !pi.CanWrite)
 				throw new ArgumentException();
 
 			ListViewItem lvi = new ListViewItem(strDisplayString);
@@ -79,9 +141,10 @@ namespace KeePass.UI
 			{
 				lvi.Group = lvgContainer;
 				Debug.Assert(lvgContainer.Items.IndexOf(lvi) >= 0);
+				Debug.Assert(m_lv.Groups.IndexOf(lvgContainer) >= 0);
 			}
 
-			lvList.Items.Add(lvi);
+			m_lv.Items.Add(lvi);
 
 			m_vObjects.Add(pContainer);
 			m_vProperties.Add(pi);
@@ -89,5 +152,49 @@ namespace KeePass.UI
 
 			return lvi;
 		}
+
+		public void AddLink(ListViewItem lviSource, ListViewItem lviTarget,
+			CheckItemLinkType t)
+		{
+			if(lviSource == null) { Debug.Assert(false); return; }
+			if(lviTarget == null) { Debug.Assert(false); return; }
+
+			if(m_lv == null) { Debug.Assert(false); return; }
+
+			Debug.Assert(m_vListViewItems.IndexOf(lviSource) >= 0);
+			Debug.Assert(m_vListViewItems.IndexOf(lviTarget) >= 0);
+
+			m_vLinks.Add(new CheckItemLink(lviSource, lviTarget, t));
+		}
+
+		private void OnItemCheckedChanged(object sender, ItemCheckedEventArgs e)
+		{
+			ListViewItem lvi = e.Item;
+			if(lvi == null) { Debug.Assert(false); return; }
+
+			bool bChecked = lvi.Checked;
+
+			// Debug.Assert(m_vListViewItems.IndexOf(lvi) >= 0);
+			foreach(CheckItemLink cl in m_vLinks)
+			{
+				if(cl.Source == lvi)
+				{
+					if(cl.Target.Index < 0) continue;
+
+					if((cl.Type == CheckItemLinkType.CheckedChecked) &&
+						bChecked && !cl.Target.Checked)
+						cl.Target.Checked = true;
+					else if((cl.Type == CheckItemLinkType.UncheckedUnchecked) &&
+						!bChecked && cl.Target.Checked)
+						cl.Target.Checked = false;
+					else if((cl.Type == CheckItemLinkType.CheckedUnchecked) &&
+						bChecked && cl.Target.Checked)
+						cl.Target.Checked = false;
+					else if((cl.Type == CheckItemLinkType.UncheckedChecked) &&
+						!bChecked && !cl.Target.Checked)
+						cl.Target.Checked = true;
+				}
+			}
+		}
 	}
 }
diff --git a/KeePass/UI/CustomListViewEx.cs b/KeePass/UI/CustomListViewEx.cs
index e6cc0d4..6a493c8 100644
--- a/KeePass/UI/CustomListViewEx.cs
+++ b/KeePass/UI/CustomListViewEx.cs
@@ -21,9 +21,11 @@ using System;
 using System.Collections.Generic;
 using System.Text;
 using System.Windows.Forms;
+using System.Threading;
 using System.Diagnostics;
 
 using KeePass.Native;
+using KeePass.Util;
 
 namespace KeePass.UI
 {
@@ -57,5 +59,123 @@ namespace KeePass.UI
 
 			base.OnMouseHover(e);
 		} */
+
+		/* protected override void OnKeyUp(KeyEventArgs e)
+		{
+			base.OnKeyUp(e);
+			UnfocusGroupInSingleMode();
+		}
+		private void UnfocusGroupInSingleMode()
+		{
+			try
+			{
+				if(!WinUtil.IsAtLeastWindowsVista) return;
+				if(KeePassLib.Native.NativeLib.IsUnix()) return;
+				if(!this.ShowGroups) return;
+				if(this.MultiSelect) return;
+
+				const uint m = (NativeMethods.LVGS_FOCUSED | NativeMethods.LVGS_SELECTED);
+
+				uint uGroups = (uint)this.Groups.Count;
+				for(uint u = 0; u < uGroups; ++u)
+				{
+					int iGroupID;
+					if(NativeMethods.GetGroupStateByIndex(this, u, m,
+						out iGroupID) == m)
+					{
+						NativeMethods.SetGroupState(this, iGroupID, m,
+							NativeMethods.LVGS_SELECTED);
+						return;
+					}
+				}
+			}
+			catch(Exception) { Debug.Assert(false); }
+		} */
+
+		protected override void OnKeyDown(KeyEventArgs e)
+		{
+			try { if(SkipGroupHeaderIfRequired(e)) return; }
+			catch(Exception) { Debug.Assert(false); }
+
+			base.OnKeyDown(e);
+		}
+
+		private bool SkipGroupHeaderIfRequired(KeyEventArgs e)
+		{
+			if(!this.ShowGroups) return false;
+			if(this.MultiSelect) return false;
+
+			ListViewItem lvi = this.FocusedItem;
+			if(lvi != null)
+			{
+				ListViewGroup g = lvi.Group;
+				ListViewItem lviChangeTo = null;
+
+				if((e.KeyCode == Keys.Up) && IsFirstLastItemInGroup(g, lvi, true))
+					lviChangeTo = (GetNextLvi(g, true) ?? lvi); // '??' for top item
+				else if((e.KeyCode == Keys.Down) && IsFirstLastItemInGroup(g, lvi, false))
+					lviChangeTo = (GetNextLvi(g, false) ?? lvi); // '??' for bottom item
+
+				if(lviChangeTo != null)
+				{
+					foreach(ListViewItem lviEnum in this.Items)
+						lviEnum.Selected = false;
+
+					lviChangeTo.Selected = true;
+					lviChangeTo.Focused = true;
+					EnsureVisible(lviChangeTo.Index);
+
+					e.Handled = true;
+					return true;
+				}
+			}
+
+			return false;
+		}
+
+		private static bool IsFirstLastItemInGroup(ListViewGroup g,
+			ListViewItem lvi, bool bFirst)
+		{
+			if(g == null) { Debug.Assert(false); return false; }
+
+			ListViewItemCollection c = g.Items;
+			if(c.Count == 0) { Debug.Assert(false); return false; }
+
+			return (bFirst ? (c[0] == lvi) : (c[c.Count - 1] == lvi));
+		}
+
+		private ListViewItem GetNextLvi(ListViewGroup gBaseExcl, bool bUp)
+		{
+			if(gBaseExcl == null) { Debug.Assert(false); return null; }
+
+			int i = this.Groups.IndexOf(gBaseExcl);
+			if(i < 0) { Debug.Assert(false); return null; }
+
+			if(bUp)
+			{
+				--i;
+				while(i >= 0)
+				{
+					ListViewGroup g = this.Groups[i];
+					if(g.Items.Count > 0) return g.Items[g.Items.Count - 1];
+
+					--i;
+				}
+			}
+			else // Down
+			{
+				++i;
+				int nGroups = this.Groups.Count;
+				while(i < nGroups)
+				{
+					ListViewGroup g = this.Groups[i];
+					if(g.Items.Count > 0) return g.Items[0];
+
+					++i;
+				}
+			}
+
+			return null;
+		}
 	}
 }
diff --git a/KeePass/UI/DocumentManagerEx.cs b/KeePass/UI/DocumentManagerEx.cs
index c44df74..839d1d0 100644
--- a/KeePass/UI/DocumentManagerEx.cs
+++ b/KeePass/UI/DocumentManagerEx.cs
@@ -24,6 +24,7 @@ using System.Windows.Forms;
 using System.Diagnostics;
 
 using KeePassLib;
+using KeePassLib.Delegates;
 using KeePassLib.Serialization;
 
 namespace KeePass.UI
@@ -147,6 +148,67 @@ namespace KeePass.UI
 
 			return null;
 		}
+
+		/// <summary>
+		/// Search for an entry in all opened databases. The
+		/// entry is identified by its reference (not its UUID).
+		/// </summary>
+		/// <param name="peObj">Entry to search for.</param>
+		/// <returns>Database containing the entry.</returns>
+		public PwDatabase FindContainerOf(PwEntry peObj)
+		{
+			if(peObj == null) return null; // No assert
+
+			PwGroup pg = peObj.ParentGroup;
+			if(pg != null)
+			{
+				while(pg.ParentGroup != null) { pg = pg.ParentGroup; }
+
+				foreach(PwDocument ds in m_vDocs)
+				{
+					PwDatabase pd = ds.Database;
+					if((pd == null) || !pd.IsOpen) continue;
+
+					if(object.ReferenceEquals(pd.RootGroup, pg))
+						return pd;
+				}
+
+				Debug.Assert(false);
+			}
+
+			return SlowFindContainerOf(peObj);
+		}
+
+		private PwDatabase SlowFindContainerOf(PwEntry peObj)
+		{
+			PwDatabase pdRet = null;
+			foreach(PwDocument ds in m_vDocs)
+			{
+				PwDatabase pd = ds.Database;
+				if((pd == null) || !pd.IsOpen) continue;
+
+				EntryHandler eh = delegate(PwEntry pe)
+				{
+					if(object.ReferenceEquals(pe, peObj))
+					{
+						pdRet = pd;
+						return false; // Stop traversal
+					}
+
+					return true;
+				};
+
+				pd.RootGroup.TraverseTree(TraversalMethod.PreOrder, null, eh);
+				if(pdRet != null) return pdRet;
+			}
+
+			return null;
+		}
+
+		public PwDatabase SafeFindContainerOf(PwEntry peObj)
+		{
+			return (FindContainerOf(peObj) ?? m_dsActive.Database);
+		}
 	}
 
 	public sealed class PwDocument
diff --git a/KeePass/UI/DynamicMenu.cs b/KeePass/UI/DynamicMenu.cs
index 24c8a9a..de94bda 100644
--- a/KeePass/UI/DynamicMenu.cs
+++ b/KeePass/UI/DynamicMenu.cs
@@ -99,7 +99,8 @@ namespace KeePass.UI
 			return AddItem(strItemText, imgSmallIcon, null);
 		}
 
-		public ToolStripMenuItem AddItem(string strItemText, Image imgSmallIcon, object objTag)
+		public ToolStripMenuItem AddItem(string strItemText, Image imgSmallIcon,
+			object objTag)
 		{
 			Debug.Assert(strItemText != null);
 			if(strItemText == null) throw new ArgumentNullException("strItemText");
diff --git a/KeePass/UI/FileDialogsEx.cs b/KeePass/UI/FileDialogsEx.cs
index f1a5359..4570209 100644
--- a/KeePass/UI/FileDialogsEx.cs
+++ b/KeePass/UI/FileDialogsEx.cs
@@ -62,25 +62,25 @@ namespace KeePass.UI
 				if(fsOrigin == FileSaveOrigin.Locking)
 				{
 					dlg.MainInstruction = KPRes.FileSaveQLocking;
-					dlg.AddButton((int)DialogResult.Yes, KPRes.Save, KPRes.FileSaveQOpYesLocking);
-					dlg.AddButton((int)DialogResult.No, KPRes.DiscardChanges, KPRes.FileSaveQOpNoLocking);
-					dlg.AddButton((int)DialogResult.Cancel, KPRes.Cancel, KPRes.FileSaveQOpCancel +
+					dlg.AddButton((int)DialogResult.Yes, KPRes.SaveCmd, KPRes.FileSaveQOpYesLocking);
+					dlg.AddButton((int)DialogResult.No, KPRes.DiscardChangesCmd, KPRes.FileSaveQOpNoLocking);
+					dlg.AddButton((int)DialogResult.Cancel, KPRes.CancelCmd, KPRes.FileSaveQOpCancel +
 						" " + KPRes.FileSaveQOpCancelLocking);
 				}
 				else if(fsOrigin == FileSaveOrigin.Exiting)
 				{
 					dlg.MainInstruction = KPRes.FileSaveQExiting;
-					dlg.AddButton((int)DialogResult.Yes, KPRes.Save, KPRes.FileSaveQOpYesExiting);
-					dlg.AddButton((int)DialogResult.No, KPRes.DiscardChanges, KPRes.FileSaveQOpNoExiting);
-					dlg.AddButton((int)DialogResult.Cancel, KPRes.Cancel, KPRes.FileSaveQOpCancel +
+					dlg.AddButton((int)DialogResult.Yes, KPRes.SaveCmd, KPRes.FileSaveQOpYesExiting);
+					dlg.AddButton((int)DialogResult.No, KPRes.DiscardChangesCmd, KPRes.FileSaveQOpNoExiting);
+					dlg.AddButton((int)DialogResult.Cancel, KPRes.CancelCmd, KPRes.FileSaveQOpCancel +
 						" " + KPRes.FileSaveQOpCancelExiting);
 				}
 				else
 				{
 					dlg.MainInstruction = KPRes.FileSaveQClosing;
-					dlg.AddButton((int)DialogResult.Yes, KPRes.Save, KPRes.FileSaveQOpYesClosing);
-					dlg.AddButton((int)DialogResult.No, KPRes.DiscardChanges, KPRes.FileSaveQOpNoClosing);
-					dlg.AddButton((int)DialogResult.Cancel, KPRes.Cancel, KPRes.FileSaveQOpCancel +
+					dlg.AddButton((int)DialogResult.Yes, KPRes.SaveCmd, KPRes.FileSaveQOpYesClosing);
+					dlg.AddButton((int)DialogResult.No, KPRes.DiscardChangesCmd, KPRes.FileSaveQOpNoClosing);
+					dlg.AddButton((int)DialogResult.Cancel, KPRes.CancelCmd, KPRes.FileSaveQOpCancel +
 						" " + KPRes.FileSaveQOpCancelClosing);
 					bShowCheckBox = false;
 				}
diff --git a/KeePass/UI/ListSorter.cs b/KeePass/UI/ListSorter.cs
index 36655c8..a804a75 100644
--- a/KeePass/UI/ListSorter.cs
+++ b/KeePass/UI/ListSorter.cs
@@ -20,6 +20,7 @@
 using System;
 using System.Collections;
 using System.Windows.Forms;
+using System.ComponentModel;
 using System.Diagnostics;
 
 using KeePass.Resources;
@@ -29,14 +30,11 @@ namespace KeePass.UI
 {
 	public sealed class ListSorter : IComparer
 	{
-		private int m_nColumn = -1;
-		private SortOrder m_oSort = SortOrder.Ascending;
-		private bool m_bCompareNaturally = true;
-		private bool m_bCompareTimes = false;
-
 		// Cached version of a string representing infinity
 		private string m_strNeverExpires = string.Empty;
 
+		private int m_nColumn = -1;
+		[DefaultValue(-1)]
 		public int Column
 		{
 			get { return m_nColumn; }
@@ -45,6 +43,7 @@ namespace KeePass.UI
 			set { m_nColumn = value; }
 		}
 
+		private SortOrder m_oSort = SortOrder.Ascending;
 		public SortOrder Order
 		{
 			get { return m_oSort; }
@@ -53,6 +52,8 @@ namespace KeePass.UI
 			set { m_oSort = value; }
 		}
 
+		private bool m_bCompareNaturally = true;
+		[DefaultValue(true)]
 		public bool CompareNaturally
 		{
 			get { return m_bCompareNaturally; }
@@ -61,6 +62,8 @@ namespace KeePass.UI
 			set { m_bCompareNaturally = value; }
 		}
 
+		private bool m_bCompareTimes = false;
+		[DefaultValue(false)]
 		public bool CompareTimes
 		{
 			get { return m_bCompareTimes; }
diff --git a/KeePass/UI/OnDemandStatusDialog.cs b/KeePass/UI/OnDemandStatusDialog.cs
index d9b2a01..8bee59f 100644
--- a/KeePass/UI/OnDemandStatusDialog.cs
+++ b/KeePass/UI/OnDemandStatusDialog.cs
@@ -36,6 +36,7 @@ namespace KeePass.UI
 		private Thread m_th = null;
 		private Form m_fOwner;
 		private StatusProgressForm m_dlgModal = null;
+		private object m_objSync = new object();
 
 		private const uint InitialProgress = 0;
 		private const string InitialStatus = null;
@@ -58,7 +59,7 @@ namespace KeePass.UI
 
 		public void EndLogging()
 		{
-			lock(this) { m_bTerminate = true; }
+			lock(m_objSync) { m_bTerminate = true; }
 			m_th = null;
 
 			if(m_dlgModal != null)
@@ -70,7 +71,7 @@ namespace KeePass.UI
 
 		public bool SetProgress(uint uPercent)
 		{
-			lock(this) { m_uProgress = uPercent; }
+			lock(m_objSync) { m_uProgress = uPercent; }
 
 			return ((m_dlgModal != null) ? m_dlgModal.SetProgress(uPercent) : true);
 		}
@@ -89,7 +90,7 @@ namespace KeePass.UI
 			if(!m_bUseThread && (m_dlgModal == null))
 				m_dlgModal = ConstructStatusDialog();
 
-			lock(this) { m_strProgress = strNewText; }
+			lock(m_objSync) { m_strProgress = strNewText; }
 			return ((m_dlgModal != null) ? m_dlgModal.SetText(strNewText, lsType) : true);
 		}
 
@@ -106,7 +107,7 @@ namespace KeePass.UI
 			StatusProgressForm dlg = null;
 			while(true)
 			{
-				lock(this)
+				lock(m_objSync)
 				{
 					if(m_bTerminate) break;
 
@@ -134,10 +135,8 @@ namespace KeePass.UI
 
 		private StatusProgressForm ConstructStatusDialog()
 		{
-			StatusProgressForm dlg = new StatusProgressForm();
-			dlg.InitEx(m_strTitle, false, true, m_bUseThread ? null : m_fOwner);
-			dlg.Show();
-			dlg.StartLogging(null, false);
+			StatusProgressForm dlg = StatusProgressForm.ConstructEx(
+				m_strTitle, false, true, (m_bUseThread ? null : m_fOwner), null);
 			dlg.SetProgress(m_uProgress);
 
 			MainForm mfOwner = ((m_fOwner != null) ? (m_fOwner as MainForm) : null);
@@ -161,9 +160,7 @@ namespace KeePass.UI
 					mfOwner.UIBlockInteraction(false);
 				}
 
-				dlg.EndLogging();
-				dlg.Close();
-				dlg.Dispose();
+				StatusProgressForm.DestroyEx(dlg);
 
 				// Conflict with 3116455
 				// if(mfOwner != null) mfOwner.Activate(); // Prevent disappearing
diff --git a/KeePass/UI/OpenWithMenu.cs b/KeePass/UI/OpenWithMenu.cs
new file mode 100644
index 0000000..29e43f9
--- /dev/null
+++ b/KeePass/UI/OpenWithMenu.cs
@@ -0,0 +1,295 @@
+/*
+  KeePass Password Safe - The Open-Source Password Manager
+  Copyright (C) 2003-2011 Dominik Reichl <dominik.reichl at t-online.de>
+
+  This program is free software; you can redistribute it and/or modify
+  it under the terms of the GNU General Public License as published by
+  the Free Software Foundation; either version 2 of the License, or
+  (at your option) any later version.
+
+  This program is distributed in the hope that it will be useful,
+  but WITHOUT ANY WARRANTY; without even the implied warranty of
+  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+  GNU General Public License for more details.
+
+  You should have received a copy of the GNU General Public License
+  along with this program; if not, write to the Free Software
+  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+*/
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using System.Windows.Forms;
+using System.Drawing;
+using System.Drawing.Drawing2D;
+using System.Drawing.Imaging;
+using System.IO;
+using System.Diagnostics;
+
+using Microsoft.Win32;
+
+using KeePass.Resources;
+using KeePass.Util;
+
+using KeePassLib;
+using KeePassLib.Native;
+using KeePassLib.Utility;
+
+namespace KeePass.UI
+{
+	internal sealed class OpenWithItem
+	{
+		private string m_strPath;
+		public string FilePath { get { return m_strPath; } }
+
+		private string m_strMenuText;
+		public string MenuText { get { return m_strMenuText; } }
+
+		private Image m_imgIcon;
+		public Image Image { get { return m_imgIcon; } }
+
+		private ToolStripMenuItem m_tsmi;
+		public ToolStripMenuItem MenuItem { get { return m_tsmi; } }
+
+		private OpenWithItem(string strFilePath, string strMenuText,
+			Image imgIcon, DynamicMenu dynMenu)
+		{
+			m_strPath = strFilePath;
+			m_strMenuText = strMenuText;
+			m_imgIcon = imgIcon;
+
+			m_tsmi = dynMenu.AddItem(m_strMenuText, m_imgIcon, this);
+
+			try { m_tsmi.ToolTipText = m_strPath; }
+			catch(Exception) { } // Too long?
+		}
+
+		public static OpenWithItem Create(string strFilePath, string strMenuText,
+			Image imgIcon, DynamicMenu dynMenu)
+		{
+			return new OpenWithItem(strFilePath, strMenuText, imgIcon, dynMenu);
+		}
+	}
+
+	public sealed class OpenWithMenu
+	{
+		private ToolStripMenuItem m_tsmiHost;
+		private DynamicMenu m_dynMenu;
+
+		private List<OpenWithItem> m_lOpenWith = null;
+
+		public OpenWithMenu(ToolStripMenuItem tsmiHost)
+		{
+			if(tsmiHost == null) { Debug.Assert(false); return; }
+
+			m_tsmiHost = tsmiHost;
+			m_dynMenu = new DynamicMenu(m_tsmiHost);
+			m_dynMenu.MenuClick += this.OnOpenUrl;
+
+			m_tsmiHost.DropDownOpening += this.OnMenuOpening;
+		}
+
+		~OpenWithMenu()
+		{
+			Destroy();
+		}
+
+		public void Destroy()
+		{
+			if(m_dynMenu != null)
+			{
+				m_dynMenu.Clear();
+				m_dynMenu.MenuClick -= this.OnOpenUrl;
+				m_dynMenu = null;
+
+				m_tsmiHost.DropDownOpening -= this.OnMenuOpening;
+				m_tsmiHost = null;
+
+				// After the menu has been destroyed:
+				ReleaseOpenWithList(); // Release icons, ...
+			}
+		}
+
+		private void OnMenuOpening(object sender, EventArgs e)
+		{
+			if(m_dynMenu == null) { Debug.Assert(false); return; }
+
+			if(m_lOpenWith == null) CreateOpenWithList();
+
+			PwEntry[] v = Program.MainForm.GetSelectedEntries();
+			if(v == null) v = new PwEntry[0];
+
+			bool bCanOpenWith = true;
+			uint uValidUrls = 0;
+			foreach(PwEntry pe in v)
+			{
+				string strUrl = pe.Strings.ReadSafe(PwDefs.UrlField);
+				if(string.IsNullOrEmpty(strUrl)) continue;
+
+				++uValidUrls;
+				bCanOpenWith &= !WinUtil.IsCommandLineUrl(strUrl);
+			}
+			if((v.Length == 0) || (uValidUrls == 0)) bCanOpenWith = false;
+
+			foreach(OpenWithItem it in m_lOpenWith)
+				it.MenuItem.Enabled = bCanOpenWith;
+		}
+
+		private void CreateOpenWithList()
+		{
+			ReleaseOpenWithList();
+
+			m_dynMenu.Clear();
+			m_dynMenu.AddSeparator();
+
+			m_lOpenWith = new List<OpenWithItem>();
+			FindAppsByKnown();
+			FindAppsByRegistry();
+
+			if(m_lOpenWith.Count == 0) m_dynMenu.Clear(); // Remove separator
+		}
+
+		private void ReleaseOpenWithList()
+		{
+			if(m_lOpenWith == null) return;
+
+			foreach(OpenWithItem it in m_lOpenWith)
+			{
+				if(it.Image != null) it.Image.Dispose();
+			}
+
+			m_lOpenWith = null;
+		}
+
+		private void OnOpenUrl(object sender, DynamicMenuEventArgs e)
+		{
+			if(e == null) { Debug.Assert(false); return; }
+
+			OpenWithItem it = (e.Tag as OpenWithItem);
+			if(it == null) { Debug.Assert(false); return; }
+
+			PwEntry[] v = Program.MainForm.GetSelectedEntries();
+			if(v == null) { Debug.Assert(false); return; }
+
+			foreach(PwEntry pe in v)
+			{
+				string strUrl = pe.Strings.ReadSafe(PwDefs.UrlField);
+				if(string.IsNullOrEmpty(strUrl)) continue;
+
+				WinUtil.OpenUrlWithApp(strUrl, pe, it.FilePath);
+			}
+		}
+
+		private void AddAppByFile(string strAppCmdLine, string strName)
+		{
+			if(string.IsNullOrEmpty(strAppCmdLine)) return; // No assert
+
+			string strPath = UrlUtil.GetShortestAbsolutePath(
+				UrlUtil.GetQuotedAppPath(strAppCmdLine).Trim());
+			if(strPath.Length == 0) { Debug.Assert(false); return; }
+
+			foreach(OpenWithItem it in m_lOpenWith)
+			{
+				if(it.FilePath.Equals(strPath, StrUtil.CaseIgnoreCmp))
+					return; // Already have an item for this
+			}
+
+			// Filter non-existing/legacy applications
+			try { if(!File.Exists(strPath)) return; }
+			catch(Exception) { Debug.Assert(false); return; }
+
+			if(string.IsNullOrEmpty(strName))
+				strName = UrlUtil.StripExtension(UrlUtil.GetFileName(strPath));
+
+			Image img = null;
+			try
+			{
+				Icon ico = Icon.ExtractAssociatedIcon(strPath);
+				if(ico == null) throw new InvalidOperationException();
+
+				img = new Bitmap(16, 16, PixelFormat.Format32bppArgb);
+				using(Graphics g = Graphics.FromImage(img))
+				{
+					g.Clear(Color.Transparent);
+					g.InterpolationMode = InterpolationMode.HighQualityBicubic;
+					g.SmoothingMode = SmoothingMode.HighQuality;
+					g.DrawIcon(ico, new Rectangle(0, 0, img.Width, img.Height));					
+				}
+
+				ico.Dispose();
+			}
+			catch(Exception) { Debug.Assert(false); }
+
+			string strMenuText = KPRes.OpenWith.Replace(@"{PARAM}", strName);
+			OpenWithItem owi = OpenWithItem.Create(strPath, strMenuText,
+				img, m_dynMenu);
+			m_lOpenWith.Add(owi);
+		}
+
+		private void FindAppsByKnown()
+		{
+			AddAppByFile(AppLocator.InternetExplorerPath, @"&Internet Explorer");
+			AddAppByFile(AppLocator.FirefoxPath, @"&Firefox");
+			AddAppByFile(AppLocator.OperaPath, @"O&pera");
+
+			AddAppByFile(AppLocator.ChromePath, (NativeLib.IsUnix() ?
+				@"&Google Chromium" : @"&Google Chrome"));
+
+			AddAppByFile(AppLocator.SafariPath, @"&Safari");
+
+			if(NativeLib.IsUnix())
+			{
+				AddAppByFile(AppLocator.FindAppUnix("epiphany-browser"), @"&Epiphany");
+				AddAppByFile(AppLocator.FindAppUnix("arora"), @"&Arora");
+				AddAppByFile(AppLocator.FindAppUnix("galeon"), @"Ga&leon");
+				AddAppByFile(AppLocator.FindAppUnix("konqueror"), @"&Konqueror");
+			}
+		}
+
+		private void FindAppsByRegistry()
+		{
+			try { FindAppsByRegistryPriv("SOFTWARE\\Clients\\StartMenuInternet"); }
+			catch(Exception) { }
+			try { FindAppsByRegistryPriv("SOFTWARE\\Wow6432Node\\Clients\\StartMenuInternet"); }
+			catch(Exception) { }
+		}
+
+		private void FindAppsByRegistryPriv(string strRootSubKey)
+		{
+			RegistryKey kRoot = Registry.LocalMachine.OpenSubKey(strRootSubKey);
+			if(kRoot == null) return; // No assert, key might not exist
+			string[] vAppSubKeys = kRoot.GetSubKeyNames();
+
+			foreach(string strAppSubKey in vAppSubKeys)
+			{
+				RegistryKey kApp = kRoot.OpenSubKey(strAppSubKey);
+				string strName = (kApp.GetValue(string.Empty) as string);
+				string strAltName = null;
+
+				RegistryKey kCmd = kApp.OpenSubKey("shell\\open\\command");
+				if(kCmd == null) { Debug.Assert(false); kApp.Close(); continue; }
+				string strCmdLine = (kCmd.GetValue(string.Empty) as string);
+				kCmd.Close();
+
+				RegistryKey kCaps = kApp.OpenSubKey("Capabilities");
+				if(kCaps != null)
+				{
+					strAltName = (kCaps.GetValue("ApplicationName") as string);
+					kCaps.Close();
+				}
+
+				kApp.Close();
+
+				string strDisplayName = string.Empty;
+				if(strName != null) strDisplayName = strName;
+				if((strAltName != null) && (strAltName.Length <= strDisplayName.Length))
+					strDisplayName = strAltName;
+
+				AddAppByFile(strCmdLine, strDisplayName);
+			}
+
+			kRoot.Close();
+		}
+	}
+}
diff --git a/KeePass/UI/RichTextBoxContextMenu.cs b/KeePass/UI/RichTextBoxContextMenu.cs
index 6cedc02..5bd24ed 100644
--- a/KeePass/UI/RichTextBoxContextMenu.cs
+++ b/KeePass/UI/RichTextBoxContextMenu.cs
@@ -23,27 +23,31 @@ using System.Windows.Forms;
 using System.Diagnostics;
 
 using KeePass.Resources;
+using KeePass.Util;
 
 namespace KeePass.UI
 {
-	internal enum RichTextBoxContextMenuCommands
-	{
-		Undo = 0,
-		Cut,
-		Copy,
-		Paste,
-		Delete,
-		CopyAll,
-		SelectAll,
-		Count
-	}
-
 	public sealed class RichTextBoxContextMenu
 	{
 		private RichTextBox m_rtb = null;
+		private Form m_form = null;
 		private ContextMenuStrip m_ctx = null;
 		private ToolStripItem[] m_vMenuItems =
-			new ToolStripItem[(int)RichTextBoxContextMenuCommands.Count];
+			new ToolStripItem[(int)RtbCtxCommands.Count];
+		private string m_strCurLink = string.Empty;
+
+		private enum RtbCtxCommands
+		{
+			Undo = 0,
+			Cut,
+			Copy,
+			Paste,
+			Delete,
+			CopyLink,
+			CopyAll,
+			SelectAll,
+			Count
+		}
 
 		public RichTextBoxContextMenu()
 		{
@@ -51,14 +55,21 @@ namespace KeePass.UI
 
 		~RichTextBoxContextMenu()
 		{
-			this.Detach();
+			Detach();
 		}
 
+		[Obsolete]
 		public void Attach(RichTextBox rtb)
 		{
-			this.Detach();
+			Attach(rtb, null);
+		}
+
+		public void Attach(RichTextBox rtb, Form fParent)
+		{
+			Detach();
 
 			m_rtb = rtb;
+			m_form = fParent;
 
 			m_ctx = CreateContextMenu();
 			m_ctx.Opening += this.OnMenuOpening;
@@ -77,10 +88,11 @@ namespace KeePass.UI
 				m_ctx.Opening -= this.OnMenuOpening;
 				m_ctx = null;
 
-				for(int i = 0; i < (int)RichTextBoxContextMenuCommands.Count; ++i)
+				for(int i = 0; i < (int)RtbCtxCommands.Count; ++i)
 					m_vMenuItems[i] = null;
 
 				m_rtb = null;
+				m_form = null;
 			}
 		}
 
@@ -103,22 +115,81 @@ namespace KeePass.UI
 				Properties.Resources.B16x16_EditDelete, this.OnDeleteCommand);
 			ctx.Items.Add(new ToolStripSeparator());
 
+			m_vMenuItems[++iPos] = ctx.Items.Add(KPRes.CopyLink,
+				Properties.Resources.B16x16_EditCopyLink, this.OnCopyLinkCommand);
 			m_vMenuItems[++iPos] = ctx.Items.Add(KPRes.CopyAll,
 				Properties.Resources.B16x16_EditShred, this.OnCopyAllCommand);
 			m_vMenuItems[++iPos] = ctx.Items.Add(KPRes.SelectAll,
 				Properties.Resources.B16x16_Edit, this.OnSelectAllCommand);
 			
-			Debug.Assert(iPos == ((int)RichTextBoxContextMenuCommands.Count - 1));
+			Debug.Assert(iPos == ((int)RtbCtxCommands.Count - 1));
 			return ctx;
 		}
 
 		private void OnMenuOpening(object sender, EventArgs e)
 		{
-			m_vMenuItems[(int)RichTextBoxContextMenuCommands.Undo].Enabled =
-				m_vMenuItems[(int)RichTextBoxContextMenuCommands.Cut].Enabled =
-				m_vMenuItems[(int)RichTextBoxContextMenuCommands.Paste].Enabled =
-				m_vMenuItems[(int)RichTextBoxContextMenuCommands.Delete].Enabled =
-				!m_rtb.ReadOnly;
+			bool bHasText = (m_rtb.TextLength > 0);
+			bool bHasSel = (m_rtb.SelectionLength > 0);
+
+			if(m_rtb.ReadOnly)
+			{
+				m_vMenuItems[(int)RtbCtxCommands.Undo].Enabled = false;
+				m_vMenuItems[(int)RtbCtxCommands.Cut].Enabled = false;
+				m_vMenuItems[(int)RtbCtxCommands.Paste].Enabled = false;
+				m_vMenuItems[(int)RtbCtxCommands.Delete].Enabled = false;
+			}
+			else // Editable
+			{
+				m_vMenuItems[(int)RtbCtxCommands.Undo].Enabled = m_rtb.CanUndo;
+				m_vMenuItems[(int)RtbCtxCommands.Cut].Enabled = bHasSel;
+				m_vMenuItems[(int)RtbCtxCommands.Paste].Enabled = true; // Optimistic
+				m_vMenuItems[(int)RtbCtxCommands.Delete].Enabled = bHasSel;
+			}
+
+			m_vMenuItems[(int)RtbCtxCommands.Copy].Enabled = bHasSel;
+			m_vMenuItems[(int)RtbCtxCommands.CopyAll].Enabled = bHasText;
+			m_vMenuItems[(int)RtbCtxCommands.SelectAll].Enabled = bHasText;
+
+			m_strCurLink = GetLinkBelowMouse();
+			m_vMenuItems[(int)RtbCtxCommands.CopyLink].Enabled = (m_strCurLink.Length > 0);
+		}
+
+		private string GetLinkBelowMouse()
+		{
+			// Save selection
+			int iSelStart = m_rtb.SelectionStart, iSelLength = m_rtb.SelectionLength;
+
+			string strLink = string.Empty;
+			try
+			{
+				int p = m_rtb.GetCharIndexFromPosition(m_rtb.PointToClient(
+					Cursor.Position));
+				m_rtb.Select(p, 1);
+				if(UIUtil.RtfIsFirstCharLink(m_rtb))
+				{
+					int l = p;
+					while((l - 1) >= 0)
+					{
+						m_rtb.Select(l - 1, 1);
+						if(!UIUtil.RtfIsFirstCharLink(m_rtb)) break;
+						--l;
+					}
+
+					int r = p, n = m_rtb.TextLength;
+					while((r + 1) < n)
+					{
+						m_rtb.Select(r + 1, 1);
+						if(!UIUtil.RtfIsFirstCharLink(m_rtb)) break;
+						++r;
+					}
+
+					strLink = m_rtb.Text.Substring(l, r - l + 1);
+				}
+			}
+			catch(Exception) { Debug.Assert(false); }
+
+			m_rtb.Select(iSelStart, iSelLength); // Restore selection
+			return strLink;
 		}
 
 		private void OnUndoCommand(object sender, EventArgs e)
@@ -155,6 +226,12 @@ namespace KeePass.UI
 			m_rtb.Select(nStart, 0);
 		}
 
+		private void OnCopyLinkCommand(object sender, EventArgs e)
+		{
+			ClipboardUtil.Copy(m_strCurLink, false, false, null, null,
+				(m_form != null) ? m_form.Handle : IntPtr.Zero);
+		}
+
 		private void OnCopyAllCommand(object sender, EventArgs e)
 		{
 			int nStart = m_rtb.SelectionStart, nLength = m_rtb.SelectionLength;
diff --git a/KeePass/UI/StatusUtil.cs b/KeePass/UI/StatusUtil.cs
new file mode 100644
index 0000000..ca3e8da
--- /dev/null
+++ b/KeePass/UI/StatusUtil.cs
@@ -0,0 +1,121 @@
+/*
+  KeePass Password Safe - The Open-Source Password Manager
+  Copyright (C) 2003-2011 Dominik Reichl <dominik.reichl at t-online.de>
+
+  This program is free software; you can redistribute it and/or modify
+  it under the terms of the GNU General Public License as published by
+  the Free Software Foundation; either version 2 of the License, or
+  (at your option) any later version.
+
+  This program is distributed in the hope that it will be useful,
+  but WITHOUT ANY WARRANTY; without even the implied warranty of
+  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+  GNU General Public License for more details.
+
+  You should have received a copy of the GNU General Public License
+  along with this program; if not, write to the Free Software
+  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+*/
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using System.Windows.Forms;
+using System.Diagnostics;
+
+using KeePass.Forms;
+using KeePass.Native;
+
+using KeePassLib;
+using KeePassLib.Interfaces;
+
+namespace KeePass.UI
+{
+	public static class StatusUtil
+	{
+		private sealed class StatusProgressFormWrapper : IStatusLogger
+		{
+			private StatusProgressForm m_dlg;
+			public StatusProgressForm Form
+			{
+				get { return m_dlg; }
+			}
+
+			public StatusProgressFormWrapper(Form fParent, string strTitle,
+				bool bCanCancel, bool bMarqueeProgress)
+			{
+				m_dlg = new StatusProgressForm();
+				m_dlg.InitEx(strTitle, bCanCancel, bMarqueeProgress, fParent);
+
+				if(fParent != null) m_dlg.Show(fParent);
+				else m_dlg.Show();
+			}
+
+			public void StartLogging(string strOperation, bool bWriteOperationToLog)
+			{
+				if(m_dlg == null) { Debug.Assert(false); return; }
+
+				m_dlg.StartLogging(strOperation, false);
+			}
+
+			public void EndLogging()
+			{
+				if(m_dlg == null) { Debug.Assert(false); return; }
+
+				m_dlg.EndLogging();
+				m_dlg.Close();
+				UIUtil.DestroyForm(m_dlg);
+				m_dlg = null;
+			}
+
+			public bool SetProgress(uint uPercent)
+			{
+				if(m_dlg == null) { Debug.Assert(false); return true; }
+
+				return m_dlg.SetProgress(uPercent);
+			}
+
+			public bool SetText(string strNewText, LogStatusType lsType)
+			{
+				if(m_dlg == null) { Debug.Assert(false); return true; }
+
+				return m_dlg.SetText(strNewText, lsType);
+			}
+
+			public bool ContinueWork()
+			{
+				if(m_dlg == null) { Debug.Assert(false); return true; }
+
+				return m_dlg.ContinueWork();
+			}
+		}
+
+		public static IStatusLogger CreateStatusDialog(Form fParent, out Form fOptDialog,
+			string strTitle, string strOp, bool bCanCancel, bool bMarqueeProgress)
+		{
+			if(string.IsNullOrEmpty(strTitle)) strTitle = PwDefs.ShortProductName;
+			if(strOp == null) strOp = string.Empty;
+
+			IStatusLogger sl;
+			// if(NativeProgressDialog.IsSupported)
+			// {
+			//	ProgDlgFlags fl = (ProgDlgFlags.AutoTime | ProgDlgFlags.NoMinimize);
+			//	if(!bCanCancel) fl |= ProgDlgFlags.NoCancel;
+			//	if(bMarqueeProgress) fl |= ProgDlgFlags.MarqueeProgress;
+			//	sl = new NativeProgressDialog((fParent != null) ? fParent.Handle :
+			//		IntPtr.Zero, fl);
+			//	fOptDialog = null;
+			// }
+			// else
+			// {
+				StatusProgressFormWrapper w = new StatusProgressFormWrapper(fParent,
+					strTitle, bCanCancel, bMarqueeProgress);
+				sl = w;
+				fOptDialog = w.Form;
+			// }
+
+			sl.StartLogging(strOp, false);
+			return sl;
+		}
+	}
+}
diff --git a/KeePass/UI/UIUtil.cs b/KeePass/UI/UIUtil.cs
index 2d4d140..35120ab 100644
--- a/KeePass/UI/UIUtil.cs
+++ b/KeePass/UI/UIUtil.cs
@@ -87,7 +87,7 @@ namespace KeePass.UI
 			try
 			{
 				NativeMethods.CHARFORMAT2 cf = new NativeMethods.CHARFORMAT2();
-				cf.cbSize = (UInt32)Marshal.SizeOf(cf);
+				cf.cbSize = (uint)Marshal.SizeOf(cf);
 
 				cf.dwMask = NativeMethods.CFM_LINK;
 				cf.dwEffects = NativeMethods.CFE_LINK;
@@ -104,6 +104,35 @@ namespace KeePass.UI
 			catch(Exception) { Debug.Assert(false); }
 		}
 
+		private static NativeMethods.CHARFORMAT2 RtfGetCharFormat(RichTextBox rtb)
+		{
+			NativeMethods.CHARFORMAT2 cf = new NativeMethods.CHARFORMAT2();
+			cf.cbSize = (uint)Marshal.SizeOf(cf);
+
+			try
+			{
+				IntPtr wParam = (IntPtr)NativeMethods.SCF_SELECTION;
+				IntPtr lParam = Marshal.AllocCoTaskMem(Marshal.SizeOf(cf));
+				Marshal.StructureToPtr(cf, lParam, false);
+
+				NativeMethods.SendMessage(rtb.Handle,
+					NativeMethods.EM_GETCHARFORMAT, wParam, lParam);
+
+				cf = (NativeMethods.CHARFORMAT2)Marshal.PtrToStructure(lParam,
+					typeof(NativeMethods.CHARFORMAT2));
+				Marshal.FreeCoTaskMem(lParam);
+			}
+			catch(Exception) { Debug.Assert(false); }
+
+			return cf;
+		}
+
+		public static bool RtfIsFirstCharLink(RichTextBox rtb)
+		{
+			NativeMethods.CHARFORMAT2 cf = RtfGetCharFormat(rtb);
+			return ((cf.dwEffects & NativeMethods.CFE_LINK) != 0);
+		}
+
 		public static void RtfLinkifyExtUrls(RichTextBox richTextBox, bool bResetSelection)
 		{
 			const string strProto = "cmd://";
@@ -151,6 +180,32 @@ namespace KeePass.UI
 			catch(Exception) { Debug.Assert(false); }
 		}
 
+		public static void RtfLinkifyReferences(RichTextBox rtb,
+			bool bResetTempSelection)
+		{
+			try
+			{
+				string str = rtb.Text;
+
+				int iOffset = 0;
+				while(true)
+				{
+					int iStart = str.IndexOf(SprEngine.StrRefStart, iOffset,
+						StrUtil.CaseIgnoreCmp);
+					if(iStart < 0) break;
+					int iEnd = str.IndexOf(SprEngine.StrRefEnd, iStart + 1,
+						StrUtil.CaseIgnoreCmp);
+					if(iEnd <= iStart) break;
+
+					string strRef = str.Substring(iStart, iEnd - iStart + 1);
+					RtfLinkifyText(rtb, strRef, bResetTempSelection);
+
+					iOffset = iStart + 1;
+				}
+			}
+			catch(Exception) { Debug.Assert(false); }
+		}
+
 		public static Image CreateColorBitmap24(int nWidth, int nHeight, Color color)
 		{
 			Bitmap bmp = new Bitmap(nWidth, nHeight, PixelFormat.Format24bppRgb);
@@ -420,7 +475,6 @@ namespace KeePass.UI
 				if(pe.ParentGroup != null)
 				{
 					string strGroup = pe.ParentGroup.GetFullPath();
-
 					if(strGroup != lvg.Header)
 					{
 						lvg = new ListViewGroup(strGroup, HorizontalAlignment.Left);
@@ -483,6 +537,106 @@ namespace KeePass.UI
 			lv.EndUpdate();
 		}
 
+		/// <summary>
+		/// Fill a <c>ListView</c> with password entries.
+		/// </summary>
+		public static void CreateEntryList(ListView lv, List<AutoTypeCtx> lCtxs,
+			ImageList ilIcons)
+		{
+			if(lv == null) throw new ArgumentNullException("lv");
+			if(lCtxs == null) throw new ArgumentNullException("lCtxs");
+
+			lv.BeginUpdate();
+
+			lv.Items.Clear();
+			lv.Columns.Clear();
+			lv.ShowGroups = true;
+			lv.SmallImageList = ilIcons;
+
+			lv.Columns.Add(KPRes.Title);
+			lv.Columns.Add(KPRes.UserName);
+			lv.Columns.Add(KPRes.Url);
+			lv.Columns.Add(KPRes.Sequence);
+
+			ListViewGroup lvg = new ListViewGroup(Guid.NewGuid().ToString());
+			DateTime dtNow = DateTime.Now;
+			bool bFirstEntry = true;
+
+			foreach(AutoTypeCtx ctx in lCtxs)
+			{
+				if(ctx == null) { Debug.Assert(false); continue; }
+				PwEntry pe = ctx.Entry;
+				if(pe == null) { Debug.Assert(false); continue; }
+				PwDatabase pd = ctx.Database;
+				if(pd == null) { Debug.Assert(false); continue; }
+
+				if(pe.ParentGroup != null)
+				{
+					string strGroup = pe.ParentGroup.GetFullPath(" - ", true);
+					if(strGroup != lvg.Header)
+					{
+						lvg = new ListViewGroup(strGroup, HorizontalAlignment.Left);
+						lv.Groups.Add(lvg);
+					}
+				}
+
+				SprContext sprCtx = new SprContext(pe, pd, SprCompileFlags.Deref);
+				sprCtx.ForcePlainTextPasswords = false;
+
+				ListViewItem lvi = new ListViewItem(SprEngine.Compile(
+					pe.Strings.ReadSafe(PwDefs.TitleField), sprCtx));
+
+				if(pe.Expires && (pe.ExpiryTime <= dtNow))
+					lvi.ImageIndex = (int)PwIcon.Expired;
+				else if(pe.CustomIconUuid == PwUuid.Zero)
+					lvi.ImageIndex = (int)pe.IconId;
+				else
+				{
+					int nInx = pd.GetCustomIconIndex(pe.CustomIconUuid);
+					if(nInx > -1)
+					{
+						ilIcons.Images.Add(new Bitmap(pd.GetCustomIcon(
+							pe.CustomIconUuid)));
+						lvi.ImageIndex = ilIcons.Images.Count - 1;
+					}
+					else { Debug.Assert(false); lvi.ImageIndex = (int)pe.IconId; }
+				}
+
+				lvi.SubItems.Add(SprEngine.Compile(pe.Strings.ReadSafe(
+					PwDefs.UserNameField), sprCtx));
+				lvi.SubItems.Add(SprEngine.Compile(pe.Strings.ReadSafe(
+					PwDefs.UrlField), sprCtx));
+				lvi.SubItems.Add(ctx.Sequence);
+
+				if(!pe.ForegroundColor.IsEmpty)
+					lvi.ForeColor = pe.ForegroundColor;
+				if(!pe.BackgroundColor.IsEmpty)
+					lvi.BackColor = pe.BackgroundColor;
+
+				lvi.Tag = ctx;
+
+				lv.Items.Add(lvi);
+				lvg.Items.Add(lvi);
+
+				if(bFirstEntry)
+				{
+					lvi.Selected = true;
+					lvi.Focused = true;
+
+					bFirstEntry = false;
+				}
+			}
+
+			int nColWidth = (lv.ClientRectangle.Width - GetVScrollBarWidth()) /
+				lv.Columns.Count;
+			foreach(ColumnHeader ch in lv.Columns)
+			{
+				ch.Width = nColWidth;
+			}
+
+			lv.EndUpdate();
+		}
+
 		public static int GetVScrollBarWidth()
 		{
 			try { return SystemInformation.VerticalScrollBarWidth; }
@@ -989,27 +1143,53 @@ namespace KeePass.UI
 
 			Color clrBg = lv.BackColor;
 
-			// Items in sorted groups don't have display-ordered indices
-			// (in contrast to a non-grouped sorted list)
-			if(lv.ShowGroups && (lv.ListViewItemSorter != null))
-				bAlternate = false;
-
-			for(int i = 0; i < lv.Items.Count; ++i)
+			if(!lv.ShowGroups || !bAlternate)
 			{
-				ListViewItem lvi = lv.Items[i];
-				Debug.Assert(lvi.Index == i);
-				Debug.Assert(lvi.UseItemStyleForSubItems);
-
-				if(!bAlternate)
+				for(int i = 0; i < lv.Items.Count; ++i)
 				{
-					if(ColorsEqual(lvi.BackColor, clrAlternate))
+					ListViewItem lvi = lv.Items[i];
+					Debug.Assert(lvi.Index == i);
+					Debug.Assert(lvi.UseItemStyleForSubItems);
+
+					if(!bAlternate)
+					{
+						if(ColorsEqual(lvi.BackColor, clrAlternate))
+							lvi.BackColor = clrBg;
+					}
+					else if(((i & 1) == 0) && ColorsEqual(lvi.BackColor, clrAlternate))
 						lvi.BackColor = clrBg;
+					else if(((i & 1) == 1) && ColorsEqual(lvi.BackColor, clrBg))
+						lvi.BackColor = clrAlternate;
 				}
-				else if(((i & 1) == 0) && ColorsEqual(lvi.BackColor, clrAlternate))
-					lvi.BackColor = clrBg;
-				else if(((i & 1) == 1) && ColorsEqual(lvi.BackColor, clrBg))
-					lvi.BackColor = clrAlternate;
 			}
+			else // Groups && alternating
+			{
+				foreach(ListViewGroup lvg in lv.Groups)
+				{
+					// Within the group the items are not in display order,
+					// but the order can be derived from the item indices
+					List<ListViewItem> lItems = new List<ListViewItem>();
+					foreach(ListViewItem lviEnum in lvg.Items)
+						lItems.Add(lviEnum);
+					lItems.Sort(UIUtil.LviCompareByIndex);
+
+					for(int i = 0; i < lItems.Count; ++i)
+					{
+						ListViewItem lvi = lItems[i];
+						Debug.Assert(lvi.UseItemStyleForSubItems);
+
+						if(((i & 1) == 0) && ColorsEqual(lvi.BackColor, clrAlternate))
+							lvi.BackColor = clrBg;
+						else if(((i & 1) == 1) && ColorsEqual(lvi.BackColor, clrBg))
+							lvi.BackColor = clrAlternate;
+					}
+				}
+			}
+		}
+
+		private static int LviCompareByIndex(ListViewItem a, ListViewItem b)
+		{
+			return a.Index.CompareTo(b.Index);
 		}
 
 		public static bool SetSortIcon(ListView lv, int iColumn, SortOrder so)
@@ -1275,6 +1455,30 @@ namespace KeePass.UI
 			else { Debug.Assert(false); }
 		}
 
+		public static string GetColumnWidths(ListView lv)
+		{
+			if(lv == null) { Debug.Assert(false); return string.Empty; }
+
+			int n = lv.Columns.Count;
+			int[] vSizes = new int[n];
+			for(int i = 0; i < n; ++i) vSizes[i] = lv.Columns[i].Width;
+
+			return StrUtil.SerializeIntArray(vSizes);
+		}
+
+		public static void SetColumnWidths(ListView lv, string strSizes)
+		{
+			if(string.IsNullOrEmpty(strSizes)) return; // No assert
+
+			int[] vSizes = StrUtil.DeserializeIntArray(strSizes);
+
+			int n = lv.Columns.Count;
+			Debug.Assert(n == vSizes.Length);
+
+			for(int i = 0; i < Math.Min(n, vSizes.Length); ++i)
+				lv.Columns[i].Width = vSizes[i];
+		}
+
 		public static void SetButtonImage(Button btn, Image img, bool b16To15)
 		{
 			if(btn == null) { Debug.Assert(false); return; }
@@ -1606,7 +1810,7 @@ namespace KeePass.UI
 				if(string.IsNullOrEmpty(strWav))
 					strWav = @"%SystemRoot%\Media\Windows User Account Control.wav";
 
-				strWav = SprEngine.Compile(strWav, false, null, null, false, false);
+				strWav = SprEngine.Compile(strWav, null);
 
 				if(!File.Exists(strWav)) throw new FileNotFoundException();
 
@@ -1663,5 +1867,57 @@ namespace KeePass.UI
 
 			return null;
 		}
+
+		/// <summary>
+		/// Set the state of a window. This is a workaround for
+		/// https://sourceforge.net/projects/keepass/forums/forum/329221/topic/4610118
+		/// </summary>
+		public static void SetWindowState(Form f, FormWindowState fws)
+		{
+			if(f == null) { Debug.Assert(false); return; }
+
+			f.WindowState = fws;
+
+			// If the window state change / resize handler changes
+			// the window state again, the property gets out of sync
+			// with the real state. Therefore, we now make sure that
+			// the property is synchronized with the actual window
+			// state.
+			try
+			{
+				// Get the value that .NET currently caches; note
+				// this isn't necessarily the real window state
+				// due to the bug
+				FormWindowState fwsCached = f.WindowState;
+
+				IntPtr hWnd = f.Handle;
+				if(hWnd == IntPtr.Zero) { Debug.Assert(false); return; }
+
+				// Get the real state using Windows API functions
+				bool bIsRealMin = NativeMethods.IsIconic(hWnd);
+				bool bIsRealMax = NativeMethods.IsZoomed(hWnd);
+
+				FormWindowState? fwsFix = null;
+				if(bIsRealMin && (fwsCached != FormWindowState.Minimized))
+					fwsFix = FormWindowState.Minimized;
+				else if(bIsRealMax && (fwsCached != FormWindowState.Maximized) &&
+					!bIsRealMin)
+					fwsFix = FormWindowState.Maximized;
+				else if(!bIsRealMin && !bIsRealMax &&
+					(fwsCached != FormWindowState.Normal))
+					fwsFix = FormWindowState.Normal;
+
+				if(fwsFix.HasValue)
+				{
+					// If the window is invisible, no state
+					// change / resize handlers are called
+					bool bVisible = f.Visible;
+					if(bVisible) f.Visible = false;
+					f.WindowState = fwsFix.Value;
+					if(bVisible) f.Visible = true;
+				}
+			}
+			catch(Exception) { Debug.Assert(KeePassLib.Native.NativeLib.IsUnix()); }
+		}
 	}
 }
diff --git a/KeePass/Util/AppLocator.cs b/KeePass/Util/AppLocator.cs
index 01e2e07..62cf203 100644
--- a/KeePass/Util/AppLocator.cs
+++ b/KeePass/Util/AppLocator.cs
@@ -27,6 +27,7 @@ using Microsoft.Win32;
 
 using KeePass.Util.Spr;
 
+using KeePassLib.Native;
 using KeePassLib.Security;
 using KeePassLib.Utility;
 
@@ -34,85 +35,74 @@ namespace KeePass.Util
 {
 	public static class AppLocator
 	{
-		private static string m_strIE = null;
-		private static string m_strFirefox = null;
-		private static string m_strOpera = null;
-		private static string m_strChrome = null;
+		private const int BrwIE = 0;
+		private const int BrwFirefox = 1;
+		private const int BrwOpera = 2;
+		private const int BrwChrome = 3;
+		private const int BrwSafari = 4;
+
+		private static Dictionary<int, string> m_dictPaths =
+			new Dictionary<int, string>();
 
 		public static string InternetExplorerPath
 		{
-			get
-			{
-				if(m_strIE != null) return m_strIE;
-				else
-				{
-					try { m_strIE = FindInternetExplorer(); }
-					catch(Exception) { m_strIE = null; }
-
-					return m_strIE;
-				}
-			}
+			get { return GetPath(BrwIE, FindInternetExplorer); }
 		}
 
 		public static string FirefoxPath
 		{
-			get
-			{
-				if(m_strFirefox != null) return m_strFirefox;
-				else
-				{
-					try { m_strFirefox = FindFirefox(); }
-					catch(Exception) { m_strFirefox = null; }
-
-					return m_strFirefox;
-				}
-			}
+			get { return GetPath(BrwFirefox, FindFirefox); }
 		}
 
 		public static string OperaPath
 		{
-			get
-			{
-				if(m_strOpera != null) return m_strOpera;
-				else
-				{
-					try { m_strOpera = FindOpera(); }
-					catch(Exception) { m_strOpera = null; }
-
-					return m_strOpera;
-				}
-			}
+			get { return GetPath(BrwOpera, FindOpera); }
 		}
 
 		public static string ChromePath
 		{
-			get
-			{
-				if(m_strChrome != null) return m_strChrome;
-				else
-				{
-					try { m_strChrome = FindChrome(); }
-					catch(Exception) { m_strChrome = null; }
-
-					return m_strChrome;
-				}
-			}
+			get { return GetPath(BrwChrome, FindChrome); }
+		}
+
+		public static string SafariPath
+		{
+			get { return GetPath(BrwSafari, FindSafari); }
 		}
 
-		public static string FillPlaceholders(string strText, SprContentFlags cf)
+		private delegate string FindAppDelegate();
+
+		private static string GetPath(int iBrwID, FindAppDelegate f)
+		{
+			string strPath;
+			if(m_dictPaths.TryGetValue(iBrwID, out strPath)) return strPath;
+
+			try { strPath = f(); }
+			catch(Exception) { strPath = null; }
+
+			m_dictPaths[iBrwID] = strPath;
+			return strPath;
+		}
+
+		public static string FillPlaceholders(string strText, SprContext ctx)
 		{
 			string str = strText;
 
-			str = AppLocator.ReplacePath(str, @"{INTERNETEXPLORER}", AppLocator.InternetExplorerPath, cf);
-			str = AppLocator.ReplacePath(str, @"{FIREFOX}", AppLocator.FirefoxPath, cf);
-			str = AppLocator.ReplacePath(str, @"{OPERA}", AppLocator.OperaPath, cf);
-			str = AppLocator.ReplacePath(str, @"{GOOGLECHROME}", AppLocator.ChromePath, cf);
+			str = AppLocator.ReplacePath(str, @"{INTERNETEXPLORER}",
+				AppLocator.InternetExplorerPath, ctx);
+			str = AppLocator.ReplacePath(str, @"{FIREFOX}",
+				AppLocator.FirefoxPath, ctx);
+			str = AppLocator.ReplacePath(str, @"{OPERA}",
+				AppLocator.OperaPath, ctx);
+			str = AppLocator.ReplacePath(str, @"{GOOGLECHROME}",
+				AppLocator.ChromePath, ctx);
+			str = AppLocator.ReplacePath(str, @"{SAFARI}",
+				AppLocator.SafariPath, ctx);
 
 			return str;
 		}
 
 		private static string ReplacePath(string str, string strPlaceholder,
-			string strFill, SprContentFlags cf)
+			string strFill, SprContext ctx)
 		{
 			if(str == null) { Debug.Assert(false); return string.Empty; }
 			if(strPlaceholder == null) { Debug.Assert(false); return str; }
@@ -120,10 +110,10 @@ namespace KeePass.Util
 			if(strFill == null) return str; // No assert
 
 			string strRep;
-			if((cf != null) && cf.EncodeQuotesForCommandLine)
-				strRep = "\"" + SprEngine.TransformContent(strFill, cf) + "\"";
+			if((ctx != null) && ctx.EncodeQuotesForCommandLine)
+				strRep = "\"" + SprEngine.TransformContent(strFill, ctx) + "\"";
 			else
-				strRep = SprEngine.TransformContent("\"" + strFill + "\"", cf);
+				strRep = SprEngine.TransformContent("\"" + strFill + "\"", ctx);
 
 			return StrUtil.ReplaceCaseInsensitive(str, strPlaceholder, strRep);
 		}
@@ -154,6 +144,8 @@ namespace KeePass.Util
 
 		private static string FindFirefox()
 		{
+			if(NativeLib.IsUnix()) return FindAppUnix("firefox");
+
 			try
 			{
 				string strPath = FindFirefoxPr(false);
@@ -205,6 +197,8 @@ namespace KeePass.Util
 
 		private static string FindOpera()
 		{
+			if(NativeLib.IsUnix()) return FindAppUnix("opera");
+
 			RegistryKey kHtml = Registry.ClassesRoot.OpenSubKey("Opera.HTML", false);
 			RegistryKey kShell = kHtml.OpenSubKey("shell", false);
 			RegistryKey kOpen = kShell.OpenSubKey("open", false);
@@ -228,6 +222,8 @@ namespace KeePass.Util
 		// HKEY_CLASSES_ROOT\\ChromeHTML\\shell\\open\\command
 		private static string FindChrome()
 		{
+			if(NativeLib.IsUnix()) return FindAppUnix("chromium-browser");
+
 			RegistryKey kHtml = Registry.ClassesRoot.OpenSubKey("ChromeHTML", false);
 			RegistryKey kShell = kHtml.OpenSubKey("shell", false);
 			RegistryKey kOpen = kShell.OpenSubKey("open", false);
@@ -272,5 +268,42 @@ namespace KeePass.Util
 			kApps.Close();
 			return strPath;
 		}
+
+		// HKEY_LOCAL_MACHINE\\SOFTWARE\\Apple Computer, Inc.\\Safari\\BrowserExe
+		private static string FindSafari()
+		{
+			RegistryKey kSoftware = Registry.LocalMachine.OpenSubKey("SOFTWARE", false);
+			RegistryKey kApple = kSoftware.OpenSubKey("Apple Computer, Inc.", false);
+			RegistryKey kSafari = kApple.OpenSubKey("Safari", false);
+			string strPath = (kSafari.GetValue("BrowserExe") as string);
+
+			if(strPath != null)
+			{
+				strPath = strPath.Trim();
+				strPath = UrlUtil.GetQuotedAppPath(strPath).Trim();
+			}
+			else { Debug.Assert(false); }
+
+			kSafari.Close();
+			kApple.Close();
+			kSoftware.Close();
+			return strPath;
+		}
+
+		public static string FindAppUnix(string strApp)
+		{
+			string str = WinUtil.RunConsoleApp("whereis", "-b " + strApp);
+			if(str == null) return null;
+
+			str = str.Trim();
+
+			int iPrefix = str.IndexOf(':');
+			if(iPrefix >= 0) str = str.Substring(iPrefix + 1).Trim();
+
+			int iSep = str.IndexOfAny(new char[]{ ' ', '\t', '\r', '\n' });
+			if(iSep >= 0) str = str.Substring(0, iSep);
+
+			return ((str.Length > 0) ? str : null);
+		}
 	}
 }
diff --git a/KeePass/Util/AutoType.cs b/KeePass/Util/AutoType.cs
index ebb0977..171fe03 100644
--- a/KeePass/Util/AutoType.cs
+++ b/KeePass/Util/AutoType.cs
@@ -57,8 +57,10 @@ namespace KeePass.Util
 
 		public bool SendObfuscated { get; set; }
 		public PwEntry Entry { get; private set; }
+		public PwDatabase Database { get; private set; }
 
-		public AutoTypeEventArgs(string strSequence, bool bObfuscated, PwEntry pe)
+		public AutoTypeEventArgs(string strSequence, bool bObfuscated, PwEntry pe,
+			PwDatabase pd)
 		{
 			if(strSequence == null) throw new ArgumentNullException("strSequence");
 			// pe may be null
@@ -66,6 +68,7 @@ namespace KeePass.Util
 			m_strSeq = strSequence;
 			this.SendObfuscated = bObfuscated;
 			this.Entry = pe;
+			this.Database = pd;
 		}
 	}
 
@@ -122,10 +125,13 @@ namespace KeePass.Util
 			return StrUtil.SimplePatternMatch(strF, strWindow, StrUtil.CaseIgnoreCmp);
 		}
 
-		private static bool Execute(string strSeq, PwEntry pweData)
+		private static bool Execute(AutoTypeCtx ctx)
 		{
-			Debug.Assert(strSeq != null); if(strSeq == null) return false;
-			Debug.Assert(pweData != null); if(pweData == null) return false;
+			if(ctx == null) { Debug.Assert(false); return false; }
+
+			string strSeq = ctx.Sequence;
+			PwEntry pweData = ctx.Entry;
+			if(pweData == null) { Debug.Assert(false); return false; }
 
 			if(!pweData.GetAutoTypeEnabled()) return false;
 			if(!AppPolicy.Try(AppPolicyId.AutoType)) return false;
@@ -140,18 +146,17 @@ namespace KeePass.Util
 				}
 			}
 
-			PwDatabase pwDatabase = null;
-			try { pwDatabase = Program.MainForm.PluginHost.Database; }
-			catch(Exception) { }
+			PwDatabase pwDatabase = ctx.Database;
 
 			bool bObfuscate = (pweData.AutoType.ObfuscationOptions !=
 				AutoTypeObfuscationOptions.None);
-			AutoTypeEventArgs args = new AutoTypeEventArgs(strSeq, bObfuscate, pweData);
+			AutoTypeEventArgs args = new AutoTypeEventArgs(strSeq, bObfuscate,
+				pweData, pwDatabase);
 
 			if(AutoType.FilterCompilePre != null) AutoType.FilterCompilePre(null, args);
 
-			args.Sequence = SprEngine.Compile(args.Sequence, true, pweData,
-				pwDatabase, true, false);
+			args.Sequence = SprEngine.Compile(args.Sequence, new SprContext(
+				pweData, pwDatabase, SprCompileFlags.All, true, false));
 
 			string strError = ValidateAutoTypeSequence(args.Sequence);
 			if(strError != null)
@@ -185,47 +190,51 @@ namespace KeePass.Util
 			return true;
 		}
 
-		private static bool PerformInternal(PwEntry pwe, string strWindow)
+		private static bool PerformInternal(AutoTypeCtx ctx, string strWindow)
 		{
-			Debug.Assert(pwe != null); if(pwe == null) return false;
+			if(ctx == null) { Debug.Assert(false); return false; }
 
-			string strSeq = GetSequenceForWindow(pwe, strWindow, false);
-			if((strSeq == null) || (strSeq.Length == 0)) return false;
+			AutoTypeCtx ctxNew = ctx.Clone();
 
 			if(Program.Config.Integration.AutoTypePrependInitSequenceForIE &&
 				WinUtil.IsInternetExplorer7Window(strWindow))
 			{
-				strSeq = @"{DELAY 50}1{DELAY 50}{BACKSPACE}" + strSeq;
+				ctxNew.Sequence = @"{DELAY 50}1{DELAY 50}{BACKSPACE}" +
+					ctxNew.Sequence;
 			}
 
-			AutoType.Execute(strSeq, pwe);
-			return true;
+			return AutoType.Execute(ctxNew);
 		}
 
-		private static string GetSequenceForWindow(PwEntry pwe, string strWindow,
-			bool bRequireDefinedWindow)
+		private static List<string> GetSequencesForWindow(PwEntry pwe,
+			string strWindow, PwDatabase pdContext)
 		{
-			Debug.Assert(strWindow != null); if(strWindow == null) return null;
-			Debug.Assert(pwe != null); if(pwe == null) return null;
+			List<string> l = new List<string>();
+
+			if(pwe == null) { Debug.Assert(false); return l; }
+			if(strWindow == null) { Debug.Assert(false); return l; }
 
-			if(!pwe.GetAutoTypeEnabled()) return null;
+			if(!pwe.GetAutoTypeEnabled()) return l;
 
-			string strSeq = null;
-			foreach(KeyValuePair<string, string> kvp in pwe.AutoType.WindowSequencePairs)
+			// Specifically defined sequences must match before the title,
+			// in order to allow selecting the first item as default one
+			foreach(AutoTypeAssociation a in pwe.AutoType.Associations)
 			{
-				string strWndSpec = kvp.Key;
+				string strWndSpec = a.WindowName;
 				if(strWndSpec == null) { Debug.Assert(false); continue; }
 
 				strWndSpec = strWndSpec.Trim();
 
 				if(strWndSpec.Length > 0)
-					strWndSpec = SprEngine.Compile(strWndSpec, false, pwe,
-						null, false, false);
+					strWndSpec = SprEngine.Compile(strWndSpec, new SprContext(
+						pwe, pdContext, SprCompileFlags.All));
 
 				if(MatchWindows(strWndSpec, strWindow))
 				{
-					strSeq = kvp.Value;
-					break;
+					string strSeq = a.Sequence;
+					if(string.IsNullOrEmpty(strSeq))
+						strSeq = pwe.GetAutoTypeSequence();
+					AddSequence(l, strSeq);
 				}
 			}
 
@@ -234,18 +243,66 @@ namespace KeePass.Util
 				string strTitle = pwe.Strings.ReadSafe(PwDefs.TitleField);
 				strTitle = strTitle.Trim();
 
-				if(string.IsNullOrEmpty(strSeq) && (strTitle.Length > 0) &&
-					(strWindow.IndexOf(strTitle, StrUtil.CaseIgnoreCmp) >= 0))
-				{
-					strSeq = pwe.AutoType.DefaultSequence;
-					Debug.Assert(strSeq != null);
-				}
+				if((strTitle.Length > 0) && (strWindow.IndexOf(strTitle,
+					StrUtil.CaseIgnoreCmp) >= 0))
+					AddSequence(l, pwe.GetAutoTypeSequence());
+			}
+
+			if(Program.Config.Integration.AutoTypeMatchByUrlInTitle)
+			{
+				string strUrl = pwe.Strings.ReadSafe(PwDefs.UrlField);
+				strUrl = strUrl.Trim();
+
+				if((strUrl.Length > 0) && (strWindow.IndexOf(strUrl,
+					StrUtil.CaseIgnoreCmp) >= 0))
+					AddSequence(l, pwe.GetAutoTypeSequence());
+			}
+
+			return l;
+		}
+
+		private static void AddSequence(List<string> lSeq, string strSeq)
+		{
+			string strCanSeq = CanonicalizeSeq(strSeq);
+
+			for(int i = 0; i < lSeq.Count; ++i)
+			{
+				string strCanEx = CanonicalizeSeq(lSeq[i]);
+				if(strCanEx.Equals(strCanSeq)) return; // Exists already
+			}
+
+			lSeq.Add(strSeq); // Non-canonical version
+		}
+
+		private const string StrBraceOpen = @"{1E1F63AB-2F63-4B60-ADBA-7F38B8D7778E}";
+		private const string StrBraceClose = @"{34D698D7-CEBF-4AF0-87BF-DC1B1F5E95A0}";
+		private static string CanonicalizeSeq(string strSeq)
+		{
+			// Preprocessing: balance braces
+			strSeq = strSeq.Replace(@"{{}", StrBraceOpen);
+			strSeq = strSeq.Replace(@"{}}", StrBraceClose);
+
+			StringBuilder sb = new StringBuilder();
+
+			bool bInPlh = false;
+			for(int i = 0; i < strSeq.Length; ++i)
+			{
+				char ch = strSeq[i];
+
+				if(ch == '{') bInPlh = true;
+				else if(ch == '}') bInPlh = false;
+				else if(bInPlh) ch = char.ToUpper(ch);
+
+				sb.Append(ch);
 			}
 
-			if((strSeq == null) && bRequireDefinedWindow) return null;
+			strSeq = sb.ToString();
+
+			// Postprocessing: restore braces
+			strSeq = strSeq.Replace(StrBraceOpen, @"{{}");
+			strSeq = strSeq.Replace(StrBraceClose, @"{}}");
 
-			if(!string.IsNullOrEmpty(strSeq)) return strSeq;
-			return pwe.GetAutoTypeSequence();
+			return strSeq;
 		}
 
 		public static bool IsValidAutoTypeWindow(IntPtr hWindow, bool bBeepIfNot)
@@ -285,7 +342,8 @@ namespace KeePass.Util
 			if(string.IsNullOrEmpty(strWindow)) return false;
 			if(!IsValidAutoTypeWindow(hWnd, true)) return false;
 
-			PwObjectList<PwEntry> vList = new PwObjectList<PwEntry>();
+			List<AutoTypeCtx> lCtxs = new List<AutoTypeCtx>();
+			PwDatabase pdCurrent = null;
 			DateTime dtNow = DateTime.Now;
 
 			EntryHandler eh = delegate(PwEntry pe)
@@ -293,8 +351,11 @@ namespace KeePass.Util
 				// Ignore expired entries
 				if(pe.Expires && (pe.ExpiryTime < dtNow)) return true;
 
-				if(GetSequenceForWindow(pe, strWindow, true) != null)
-					vList.Add(pe);
+				List<string> lSeq = GetSequencesForWindow(pe, strWindow, pdCurrent);
+				foreach(string strSeq in lSeq)
+				{
+					lCtxs.Add(new AutoTypeCtx(strSeq, pe, pdCurrent));
+				}
 
 				return true;
 			};
@@ -302,36 +363,43 @@ namespace KeePass.Util
 			foreach(PwDatabase pwSource in vSources)
 			{
 				if(pwSource.IsOpen == false) continue;
+				pdCurrent = pwSource;
 				pwSource.RootGroup.TraverseTree(TraversalMethod.PreOrder, null, eh);
 			}
 
-			if(vList.UCount == 1)
-				AutoType.PerformInternal(vList.GetAt(0), strWindow);
-			else if(vList.UCount > 1)
+			if(lCtxs.Count == 1)
+				AutoType.PerformInternal(lCtxs[0], strWindow);
+			else if(lCtxs.Count > 1)
 			{
-				EntryListForm elf = new EntryListForm();
-				elf.InitEx(KPRes.AutoTypeEntrySelection, KPRes.AutoTypeEntrySelectionDescShort,
-					KPRes.AutoTypeEntrySelectionDescLong,
-					Properties.Resources.B48x48_KGPG_Key2, ilIcons, vList);
-				elf.EnsureForeground = true;
+				AutoTypeCtxForm dlg = new AutoTypeCtxForm();
+				dlg.InitEx(lCtxs, ilIcons);
 
-				if(elf.ShowDialog() == DialogResult.OK)
+				if(dlg.ShowDialog() == DialogResult.OK)
 				{
 					try { NativeMethods.EnsureForegroundWindow(hWnd); }
 					catch(Exception) { Debug.Assert(false); }
 
-					if(elf.SelectedEntry != null)
-						AutoType.PerformInternal(elf.SelectedEntry, strWindow);
+					if(dlg.SelectedCtx != null)
+						AutoType.PerformInternal(dlg.SelectedCtx, strWindow);
 				}
-				UIUtil.DestroyForm(elf);
+				UIUtil.DestroyForm(dlg);
 			}
 
 			return true;
 		}
 
+		[Obsolete]
 		public static bool PerformIntoPreviousWindow(Form fCurrent, PwEntry pe)
 		{
-			if((pe != null) && !pe.GetAutoTypeEnabled()) return false;
+			return PerformIntoPreviousWindow(fCurrent, pe,
+				Program.MainForm.DocumentManager.SafeFindContainerOf(pe));
+		}
+
+		public static bool PerformIntoPreviousWindow(Form fCurrent, PwEntry pe,
+			PwDatabase pdContext)
+		{
+			if(pe == null) { Debug.Assert(false); return false; }
+			if(!pe.GetAutoTypeEnabled()) return false;
 			if(!AppPolicy.Try(AppPolicyId.AutoTypeWithoutContext)) return false;
 
 			bool bTopMost = ((fCurrent != null) ? fCurrent.TopMost : false);
@@ -341,7 +409,7 @@ namespace KeePass.Util
 			{
 				if(!NativeMethods.LoseFocus(fCurrent)) { Debug.Assert(false); }
 
-				return PerformIntoCurrentWindow(pe);
+				return PerformIntoCurrentWindow(pe, pdContext);
 			}
 			finally
 			{
@@ -349,8 +417,17 @@ namespace KeePass.Util
 			}
 		}
 
+		[Obsolete]
 		public static bool PerformIntoCurrentWindow(PwEntry pe)
 		{
+			return PerformIntoCurrentWindow(pe,
+				Program.MainForm.DocumentManager.SafeFindContainerOf(pe));
+		}
+
+		public static bool PerformIntoCurrentWindow(PwEntry pe, PwDatabase pdContext)
+		{
+			if(pe == null) { Debug.Assert(false); return false; }
+			if(!pe.GetAutoTypeEnabled()) return false;
 			if(!AppPolicy.Try(AppPolicyId.AutoTypeWithoutContext)) return false;
 
 			string strWindow;
@@ -369,7 +446,11 @@ namespace KeePass.Util
 
 			Thread.Sleep(100);
 
-			return AutoType.PerformInternal(pe, strWindow);
+			List<string> lSeq = GetSequencesForWindow(pe, strWindow, pdContext);
+			if(lSeq.Count == 0) lSeq.Add(pe.GetAutoTypeSequence());
+
+			AutoTypeCtx ctx = new AutoTypeCtx(lSeq[0], pe, pdContext);
+			return AutoType.PerformInternal(ctx, strWindow);
 		}
 
 		private static string ValidateAutoTypeSequence(string strSequence)
diff --git a/KeePass/Ecas/EcasParameter.cs b/KeePass/Util/AutoTypeCtx.cs
similarity index 53%
copy from KeePass/Ecas/EcasParameter.cs
copy to KeePass/Util/AutoTypeCtx.cs
index 8b34a09..eda8b21 100644
--- a/KeePass/Ecas/EcasParameter.cs
+++ b/KeePass/Util/AutoTypeCtx.cs
@@ -20,53 +20,56 @@
 using System;
 using System.Collections.Generic;
 using System.Text;
+using System.Diagnostics;
 
-namespace KeePass.Ecas
+using KeePassLib;
+
+namespace KeePass.Util
 {
-	public sealed class EcasParameter
+	/// <summary>
+	/// Auto-type candidate context.
+	/// </summary>
+	public sealed class AutoTypeCtx
 	{
-		private static EcasParameter[] m_epvNone = null;
-		public static EcasParameter[] EmptyArray
-		{
-			get
-			{
-				if(m_epvNone == null) m_epvNone = new EcasParameter[0];
-				return m_epvNone;
-			}
-		}
-
-		private string m_strName;
-		public string Name
+		private string m_strSeq = string.Empty;
+		public string Sequence
 		{
-			get { return m_strName; }
+			get { return m_strSeq; }
 			set
 			{
 				if(value == null) throw new ArgumentNullException("value");
-				m_strName = value;
+				m_strSeq = value;
 			}
 		}
 
-		private EcasValueType m_type;
-		public EcasValueType Type
+		private PwEntry m_pe = null;
+		public PwEntry Entry
 		{
-			get { return m_type; }
-			set { m_type = value; }
+			get { return m_pe; }
+			set { m_pe = value; }
 		}
 
-		private EcasEnum m_vEnumValues;
-		public EcasEnum EnumValues
+		private PwDatabase m_pd = null;
+		public PwDatabase Database
 		{
-			get { return m_vEnumValues; }
-			set { m_vEnumValues = value; } // May be null
+			get { return m_pd; }
+			set { m_pd = value; }
 		}
 
-		public EcasParameter(string strName, EcasValueType t, EcasEnum eEnumValues)
+		public AutoTypeCtx() { }
+
+		public AutoTypeCtx(string strSequence, PwEntry pe, PwDatabase pd)
 		{
-			if(strName == null) throw new ArgumentNullException("strName");
+			if(strSequence == null) throw new ArgumentNullException("strSequence");
 
-			m_strName = strName;
-			m_type = t;
-			m_vEnumValues = eEnumValues;
+			m_strSeq = strSequence;
+			m_pe = pe;
+			m_pd = pd;
+		}
+
+		public AutoTypeCtx Clone()
+		{
+			return (AutoTypeCtx)this.MemberwiseClone();
 		}
 	}
 }
diff --git a/KeePass/Util/ClipboardUtil.cs b/KeePass/Util/ClipboardUtil.cs
index 7ceee5e..fb8ba40 100644
--- a/KeePass/Util/ClipboardUtil.cs
+++ b/KeePass/Util/ClipboardUtil.cs
@@ -32,6 +32,7 @@ using System.Threading;
 using KeePass.App;
 using KeePass.Ecas;
 using KeePass.Native;
+using KeePass.UI;
 using KeePass.Util;
 using KeePass.Util.Spr;
 
@@ -76,8 +77,9 @@ namespace KeePass.Util
 			if(bIsEntryInfo && !AppPolicy.Try(AppPolicyId.CopyToClipboard))
 				return false;
 
-			string strData = (bSprCompile ? SprEngine.Compile(strToCopy, false,
-				peEntryInfo, pwReferenceSource, false, false) : strToCopy);
+			string strData = (bSprCompile ? SprEngine.Compile(strToCopy,
+				new SprContext(peEntryInfo, pwReferenceSource,
+				SprCompileFlags.All)) : strToCopy);
 
 			try
 			{
@@ -232,7 +234,7 @@ namespace KeePass.Util
 						NativeMethods.LoseFocus(formContext);
 
 					if(Program.Config.MainWindow.MinimizeAfterClipboardCopy)
-						formContext.WindowState = FormWindowState.Minimized;
+						UIUtil.SetWindowState(formContext, FormWindowState.Minimized);
 				}
 
 				return true;
diff --git a/KeePass/Util/EntryMenu.cs b/KeePass/Util/EntryMenu.cs
index 01055b2..1b9c808 100644
--- a/KeePass/Util/EntryMenu.cs
+++ b/KeePass/Util/EntryMenu.cs
@@ -170,12 +170,16 @@ namespace KeePass.Util
 
 		private static void OnAutoType(object sender, EventArgs e)
 		{
-			ToolStripMenuItem tsmi = sender as ToolStripMenuItem;
+			ToolStripMenuItem tsmi = (sender as ToolStripMenuItem);
 			Debug.Assert(tsmi != null); if(tsmi == null) return;
-			PwEntry pe = tsmi.Tag as PwEntry;
+			PwEntry pe = (tsmi.Tag as PwEntry);
 			Debug.Assert(pe != null); if(pe == null) return;
 
-			try { AutoType.PerformIntoCurrentWindow(pe); }
+			try
+			{
+				AutoType.PerformIntoCurrentWindow(pe,
+					Program.MainForm.DocumentManager.SafeFindContainerOf(pe));
+			}
 			catch(Exception ex)
 			{
 				MessageService.ShowWarning(ex);
@@ -184,13 +188,14 @@ namespace KeePass.Util
 
 		private static void OnCopyField(object sender, string strField)
 		{
-			ToolStripMenuItem tsmi = sender as ToolStripMenuItem;
+			ToolStripMenuItem tsmi = (sender as ToolStripMenuItem);
 			Debug.Assert(tsmi != null); if(tsmi == null) return;
-			PwEntry pe = tsmi.Tag as PwEntry;
+			PwEntry pe = (tsmi.Tag as PwEntry);
 			Debug.Assert(pe != null); if(pe == null) return;
 
 			ClipboardUtil.Copy(pe.Strings.ReadSafe(strField), true, true,
-				pe, Program.MainForm.DocumentManager.ActiveDatabase, IntPtr.Zero);
+				pe, Program.MainForm.DocumentManager.SafeFindContainerOf(pe),
+				IntPtr.Zero);
 		}
 
 		private static void OnCopyUserName(object sender, EventArgs e)
diff --git a/KeePass/Util/EntryTemplates.cs b/KeePass/Util/EntryTemplates.cs
index e165a9f..748489c 100644
--- a/KeePass/Util/EntryTemplates.cs
+++ b/KeePass/Util/EntryTemplates.cs
@@ -91,7 +91,7 @@ namespace KeePass.Util
 			tsmi.Click += OnMenuExecute;
 
 			Image img = null;
-			PwDatabase pd = Program.MainForm.ActiveDatabase;
+			PwDatabase pd = Program.MainForm.DocumentManager.SafeFindContainerOf(pe);
 			if(pd != null)
 			{
 				if(!pe.CustomIconUuid.EqualsValue(PwUuid.Zero))
diff --git a/KeePass/Util/EntryUtil.cs b/KeePass/Util/EntryUtil.cs
index a124880..0535138 100644
--- a/KeePass/Util/EntryUtil.cs
+++ b/KeePass/Util/EntryUtil.cs
@@ -178,304 +178,26 @@ namespace KeePass.Util
 			gz.Close(); ms.Close();
 		}
 
-		public static string FillPlaceholders(string strText, PwEntry pe,
-			PwDatabase pd, SprContentFlags cf)
+		public static string FillPlaceholders(string strText, SprContext ctx)
 		{
-			if(pe == null) return strText;
+			if((ctx == null) || (ctx.Entry == null)) return strText;
 
 			string str = strText;
 
-			// Legacy, for backward compatibility only; see PickChars
-			str = ReplacePickPw(str, pe, pd, cf);
+			if((ctx.Flags & SprCompileFlags.NewPassword) != SprCompileFlags.None)
+				str = ReplaceNewPasswordPlaceholder(str, ctx);
 
-			return str;
-		}
-
-		public static string FillPlaceholdersFinal(string strText, PwEntry pe,
-			PwDatabase pd, SprContentFlags cf)
-		{
-			if(pe == null) return strText;
-
-			string str = strText;
-
-			str = ReplacePickChars(str, pe, pd, cf);
-			str = ReplaceNewPasswordPlaceholder(str, pe, pd, cf);
-			str = ReplaceHmacOtpPlaceholder(str, pe, pd, cf);
-
-			return str;
-		}
-
-		/* private static string ReplacePickPw(string strText, PwEntry pe,
-			SprContentFlags cf)
-		{
-			string str = strText;
-
-			for(int iID = 1; iID < (int.MaxValue - 1); ++iID)
-			{
-				string strPlaceholder = @"{PICKPASSWORDCHARS";
-				if(iID > 1) strPlaceholder += iID.ToString();
-				strPlaceholder += @"}";
-
-				if(str.IndexOf(strPlaceholder, StrUtil.CaseIgnoreCmp) >= 0)
-				{
-					ProtectedString ps = pe.Strings.Get(PwDefs.PasswordField);
-					if(ps != null)
-					{
-						byte[] pb = ps.ReadUtf8();
-						bool bNotEmpty = (pb.Length > 0);
-						Array.Clear(pb, 0, pb.Length);
-
-						if(bNotEmpty)
-						{
-							CharPickerForm cpf = new CharPickerForm();
-							cpf.InitEx(ps, true, true, 0);
-
-							if(cpf.ShowDialog() == DialogResult.OK)
-								str = StrUtil.ReplaceCaseInsensitive(str, strPlaceholder,
-									SprEngine.TransformContent(cpf.SelectedCharacters.ReadString(), cf));
-							UIUtil.DestroyForm(cpf);
-						}
-					}
-
-					str = StrUtil.ReplaceCaseInsensitive(str, strPlaceholder, string.Empty);
-				}
-				else break;
-			}
-
-			return str;
-		} */
-
-		// Legacy, for backward compatibility only; see PickChars
-		private static string ReplacePickPw(string strText, PwEntry pe,
-			PwDatabase pd, SprContentFlags cf)
-		{
-			string str = strText;
-
-			while(true)
-			{
-				const string strStart = @"{PICKPASSWORDCHARS";
-
-				int iStart = str.IndexOf(strStart, StrUtil.CaseIgnoreCmp);
-				if(iStart < 0) break;
-
-				int iEnd = str.IndexOf('}', iStart);
-				if(iEnd < 0) break;
-
-				string strPlaceholder = str.Substring(iStart, iEnd - iStart + 1);
-
-				string strParam = str.Substring(iStart + strStart.Length,
-					iEnd - (iStart + strStart.Length));
-				string[] vParams = strParam.Split(new char[]{ ':' });
-
-				uint uCharCount = 0;
-				if(vParams.Length >= 2) uint.TryParse(vParams[1], out uCharCount);
-
-				str = ReplacePickPwPlaceholder(str, strPlaceholder, pe, pd, cf, uCharCount);
-			}
-
-			return str;
-		}
-
-		private static string ReplacePickPwPlaceholder(string str,
-			string strPlaceholder, PwEntry pe, PwDatabase pd, SprContentFlags cf,
-			uint uCharCount)
-		{
-			if(str.IndexOf(strPlaceholder, StrUtil.CaseIgnoreCmp) < 0) return str;
-
-			ProtectedString ps = pe.Strings.Get(PwDefs.PasswordField);
-			if(ps != null)
-			{
-				string strPassword = ps.ReadString();
-				string strPick = SprEngine.Compile(strPassword, false, pe, pd,
-					false, false); // Do not transform content yet
-
-				if(!string.IsNullOrEmpty(strPick))
-				{
-					ProtectedString psPick = new ProtectedString(false, strPick);
-					CharPickerForm dlg = new CharPickerForm();
-					dlg.InitEx(psPick, true, true, uCharCount, null);
-
-					if(dlg.ShowDialog() == DialogResult.OK)
-						str = StrUtil.ReplaceCaseInsensitive(str, strPlaceholder,
-							SprEngine.TransformContent(dlg.SelectedCharacters.ReadString(), cf));
-					UIUtil.DestroyForm(dlg);
-				}
-			}
-
-			return StrUtil.ReplaceCaseInsensitive(str, strPlaceholder, string.Empty);
-		}
-
-		private static string ReplacePickChars(string strText, PwEntry pe,
-			PwDatabase pd, SprContentFlags cf)
-		{
-			string str = strText;
-
-			Dictionary<string, string> dPicked = new Dictionary<string, string>();
-			while(true)
-			{
-				const string strStart = @"{PICKCHARS";
-
-				int iStart = str.IndexOf(strStart, StrUtil.CaseIgnoreCmp);
-				if(iStart < 0) break;
-
-				int iEnd = str.IndexOf('}', iStart);
-				if(iEnd < 0) break;
-
-				string strPlaceholder = str.Substring(iStart, iEnd - iStart + 1);
-
-				string strParam = str.Substring(iStart + strStart.Length,
-					iEnd - (iStart + strStart.Length));
-
-				string strRep = string.Empty;
-				bool bEncode = true;
-
-				if(strParam.Length == 0)
-					strRep = ShowCharPickDlg(pe.Strings.GetSafe(PwDefs.PasswordField),
-						0, null);
-				else if(strParam.StartsWith(":"))
-				{
-					string strParams = strParam.Substring(1);
-					string[] vParams = strParams.Split(new char[] { ':' },
-						StringSplitOptions.None);
-
-					string strField = string.Empty;
-					if(vParams.Length >= 1) strField = (vParams[0] ?? string.Empty).Trim();
-					if(strField.Length == 0) strField = PwDefs.PasswordField;
-
-					string strOptions = string.Empty;
-					if(vParams.Length >= 2) strOptions = (vParams[1] ?? string.Empty);
-
-					Dictionary<string, string> dOptions = new Dictionary<string, string>();
-					string[] vOptions = strOptions.Split(new char[] { ',' },
-						StringSplitOptions.RemoveEmptyEntries);
-					foreach(string strOption in vOptions)
-					{
-						string[] vKvp = strOption.Split(new char[] { '=' },
-							StringSplitOptions.None);
-						if(vKvp.Length != 2) continue;
-
-						dOptions[vKvp[0].Trim().ToLower()] = vKvp[1].Trim();
-					}
-
-					string strID = string.Empty;
-					if(dOptions.ContainsKey("id")) strID = dOptions["id"].ToLower();
-
-					uint uCharCount = 0;
-					if(dOptions.ContainsKey("c"))
-						uint.TryParse(dOptions["c"], out uCharCount);
-					if(dOptions.ContainsKey("count"))
-						uint.TryParse(dOptions["count"], out uCharCount);
-
-					bool? bInitHide = null;
-					if(dOptions.ContainsKey("hide"))
-						bInitHide = StrUtil.StringToBool(dOptions["hide"]);
-
-					ProtectedString psContent = pe.Strings.GetSafe(strField);
-					if(psContent.Length == 0) { } // Leave strRep empty
-					else if((strID.Length > 0) && dPicked.ContainsKey(strID))
-						strRep = dPicked[strID];
-					else
-						strRep = ShowCharPickDlg(psContent, uCharCount, bInitHide);
-
-					if(strID.Length > 0) dPicked[strID] = strRep;
-
-					if(dOptions.ContainsKey("conv"))
-					{
-						int iOffset = 0;
-						if(dOptions.ContainsKey("conv-offset"))
-							int.TryParse(dOptions["conv-offset"], out iOffset);
-
-						string strConvFmt = string.Empty;
-						if(dOptions.ContainsKey("conv-fmt"))
-							strConvFmt = dOptions["conv-fmt"];
-
-						string strConv = dOptions["conv"];
-						if(strConv.Equals("d", StrUtil.CaseIgnoreCmp))
-						{
-							strRep = ConvertToDownArrows(strRep, iOffset, strConvFmt);
-							bEncode = false;
-						}
-					}
-				}
-
-				str = StrUtil.ReplaceCaseInsensitive(str, strPlaceholder,
-					bEncode ? SprEngine.TransformContent(strRep, cf) : strRep);
-			}
+			if((ctx.Flags & SprCompileFlags.HmacOtp) != SprCompileFlags.None)
+				str = ReplaceHmacOtpPlaceholder(str, ctx);
 
 			return str;
 		}
 
-		private static string ShowCharPickDlg(ProtectedString psWord, uint uCharCount,
-			bool? bInitHide)
-		{
-			CharPickerForm cpf = new CharPickerForm();
-			cpf.InitEx(psWord, true, true, uCharCount, bInitHide);
-
-			string strResult = string.Empty;
-			if(cpf.ShowDialog() == DialogResult.OK)
-				strResult = cpf.SelectedCharacters.ReadString();
-
-			UIUtil.DestroyForm(cpf);
-			return strResult;
-		}
-
-		private static string ConvertToDownArrows(string str, int iOffset,
-			string strLayout)
-		{
-			if(string.IsNullOrEmpty(str)) return string.Empty;
-
-			StringBuilder sb = new StringBuilder();
-			for(int i = 0; i < str.Length; ++i)
-			{
-				// if((sb.Length > 0) && !string.IsNullOrEmpty(strSep)) sb.Append(strSep);
-
-				char ch = str[i];
-
-				int? iDowns = null;
-				if(strLayout.Length == 0)
-				{
-					if((ch >= '0') && (ch <= '9')) iDowns = (int)ch - '0';
-					else if((ch >= 'a') && (ch <= 'z')) iDowns = (int)ch - 'a';
-					else if((ch >= 'A') && (ch <= 'Z')) iDowns = (int)ch - 'A';
-				}
-				else if(strLayout.Equals("0a", StrUtil.CaseIgnoreCmp))
-				{
-					if((ch >= '0') && (ch <= '9')) iDowns = (int)ch - '0';
-					else if((ch >= 'a') && (ch <= 'z')) iDowns = (int)ch - 'a' + 10;
-					else if((ch >= 'A') && (ch <= 'Z')) iDowns = (int)ch - 'A' + 10;
-				}
-				else if(strLayout.Equals("a0", StrUtil.CaseIgnoreCmp))
-				{
-					if((ch >= '0') && (ch <= '9')) iDowns = (int)ch - '0' + 26;
-					else if((ch >= 'a') && (ch <= 'z')) iDowns = (int)ch - 'a';
-					else if((ch >= 'A') && (ch <= 'Z')) iDowns = (int)ch - 'A';
-				}
-				else if(strLayout.Equals("1a", StrUtil.CaseIgnoreCmp))
-				{
-					if((ch >= '1') && (ch <= '9')) iDowns = (int)ch - '1';
-					else if(ch == '0') iDowns = 9;
-					else if((ch >= 'a') && (ch <= 'z')) iDowns = (int)ch - 'a' + 10;
-					else if((ch >= 'A') && (ch <= 'Z')) iDowns = (int)ch - 'A' + 10;
-				}
-				else if(strLayout.Equals("a1", StrUtil.CaseIgnoreCmp))
-				{
-					if((ch >= '1') && (ch <= '9')) iDowns = (int)ch - '1' + 26;
-					else if(ch == '0') iDowns = 9 + 26;
-					else if((ch >= 'a') && (ch <= 'z')) iDowns = (int)ch - 'a';
-					else if((ch >= 'A') && (ch <= 'Z')) iDowns = (int)ch - 'A';
-				}
-
-				if(!iDowns.HasValue) continue;
-
-				for(int j = 0; j < (iOffset + iDowns); ++j) sb.Append(@"{DOWN}");
-			}
-
-			return sb.ToString();
-		}
-
 		private static string ReplaceNewPasswordPlaceholder(string strText,
-			PwEntry pe, PwDatabase pd, SprContentFlags cf)
+			SprContext ctx)
 		{
+			PwEntry pe = ctx.Entry;
+			PwDatabase pd = ctx.Database;
 			if((pe == null) || (pd == null)) return strText;
 
 			string str = strText;
@@ -493,9 +215,10 @@ namespace KeePass.Util
 				{
 					pe.CreateBackup(pd);
 					pe.Strings.Set(PwDefs.PasswordField, psAutoGen);
+					pe.Touch(true, false);
 					pd.Modified = true;
 
-					string strIns = SprEngine.TransformContent(psAutoGen.ReadString(), cf);
+					string strIns = SprEngine.TransformContent(psAutoGen.ReadString(), ctx);
 					str = StrUtil.ReplaceCaseInsensitive(str, strNewPwPlh, strIns);
 				}
 			}
@@ -504,8 +227,10 @@ namespace KeePass.Util
 		}
 
 		private static string ReplaceHmacOtpPlaceholder(string strText,
-			PwEntry pe, PwDatabase pd, SprContentFlags cf)
+			SprContext ctx)
 		{
+			PwEntry pe = ctx.Entry;
+			PwDatabase pd = ctx.Database;
 			if((pe == null) || (pd == null)) return strText;
 
 			string str = strText;
diff --git a/KeePass/Util/KeyUtil.cs b/KeePass/Util/KeyUtil.cs
index 12ad24b..b986638 100644
--- a/KeePass/Util/KeyUtil.cs
+++ b/KeePass/Util/KeyUtil.cs
@@ -59,7 +59,7 @@ namespace KeePass.Util
 				if(Program.KeyProviderPool.IsKeyProvider(strKeyFile))
 				{
 					KeyProviderQueryContext ctxKP = new KeyProviderQueryContext(
-						IOConnectionInfo.FromPath(args.FileName), false);
+						IOConnectionInfo.FromPath(args.FileName), false, false);
 
 					bool bPerformHash;
 					byte[] pbProvKey = Program.KeyProviderPool.GetKey(strKeyFile, ctxKP,
diff --git a/KeePass/Util/SearchUtil.cs b/KeePass/Util/SearchUtil.cs
new file mode 100644
index 0000000..14aec9a
--- /dev/null
+++ b/KeePass/Util/SearchUtil.cs
@@ -0,0 +1,68 @@
+/*
+  KeePass Password Safe - The Open-Source Password Manager
+  Copyright (C) 2003-2011 Dominik Reichl <dominik.reichl at t-online.de>
+
+  This program is free software; you can redistribute it and/or modify
+  it under the terms of the GNU General Public License as published by
+  the Free Software Foundation; either version 2 of the License, or
+  (at your option) any later version.
+
+  This program is distributed in the hope that it will be useful,
+  but WITHOUT ANY WARRANTY; without even the implied warranty of
+  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+  GNU General Public License for more details.
+
+  You should have received a copy of the GNU General Public License
+  along with this program; if not, write to the Free Software
+  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+*/
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using System.Diagnostics;
+
+using KeePass.Util.Spr;
+
+using KeePassLib;
+
+namespace KeePass.Util
+{
+	public static class SearchUtil
+	{
+		internal const string StrTrfDeref = "Deref";
+
+		internal static void PrepareForSerialize(SearchParameters sp)
+		{
+			if(sp == null) { Debug.Assert(false); return; }
+
+			sp.DataTransformation = GetTransformation(sp);
+		}
+
+		internal static void FinishDeserialize(SearchParameters sp)
+		{
+			if(sp == null) { Debug.Assert(false); return; }
+
+			SetTransformation(sp, sp.DataTransformation);
+		}
+
+		internal static string GetTransformation(SearchParameters spIn)
+		{
+			if(spIn == null) { Debug.Assert(false); return string.Empty; }
+
+			if(spIn.DataTransformationFn == null) return string.Empty;
+			return StrTrfDeref;
+		}
+
+		internal static void SetTransformation(SearchParameters spOut,
+			string strTrf)
+		{
+			if(spOut == null) { Debug.Assert(false); return; }
+			if(strTrf == null) { Debug.Assert(false); return; }
+
+			if(strTrf == StrTrfDeref)
+				spOut.DataTransformationFn = SprEngine.DerefFn;
+			else spOut.DataTransformationFn = null;
+		}
+	}
+}
diff --git a/KeePass/Util/SendInputEx.Unix.cs b/KeePass/Util/SendInputEx.Unix.cs
index 0f47a73..e30599f 100644
--- a/KeePass/Util/SendInputEx.Unix.cs
+++ b/KeePass/Util/SendInputEx.Unix.cs
@@ -98,6 +98,8 @@ namespace KeePass.Util
 			// the xdotool command line parameter is wrapped in '')
 			strSequence = strSequence.Replace(@"'", @"{apostrophe}");
 
+			strSequence = strSequence.Replace("\\", @"{backslash}");
+
 			StringBuilder sb = new StringBuilder();
 			bool bInCode = false;
 			Keys kMod = Keys.None;
diff --git a/KeePass/Util/SendInputEx.cs b/KeePass/Util/SendInputEx.cs
index c7c5add..593e93f 100644
--- a/KeePass/Util/SendInputEx.cs
+++ b/KeePass/Util/SendInputEx.cs
@@ -86,7 +86,7 @@ namespace KeePass.Util
 			SiStateEx si = new SiStateEx();
 			if(KeePassLib.Native.NativeLib.IsUnix())
 			{
-				si.DefaultDelay /= 2; // Starting external program takes time
+				si.DefaultDelay /= 3; // Starting external program takes time
 				return si;
 			}
 
diff --git a/KeePass/Util/Spr/SprContentFlags.cs b/KeePass/Util/Spr/SprContentFlags.cs
deleted file mode 100644
index 6672dff..0000000
--- a/KeePass/Util/Spr/SprContentFlags.cs
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
-  KeePass Password Safe - The Open-Source Password Manager
-  Copyright (C) 2003-2011 Dominik Reichl <dominik.reichl at t-online.de>
-
-  This program is free software; you can redistribute it and/or modify
-  it under the terms of the GNU General Public License as published by
-  the Free Software Foundation; either version 2 of the License, or
-  (at your option) any later version.
-
-  This program is distributed in the hope that it will be useful,
-  but WITHOUT ANY WARRANTY; without even the implied warranty of
-  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-  GNU General Public License for more details.
-
-  You should have received a copy of the GNU General Public License
-  along with this program; if not, write to the Free Software
-  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
-*/
-
-using System;
-using System.Collections.Generic;
-using System.Text;
-
-namespace KeePass.Util.Spr
-{
-	public sealed class SprContentFlags
-	{
-		private bool m_bMakeAT;
-		public bool EncodeAsAutoTypeSequence
-		{
-			get { return m_bMakeAT; }
-		}
-
-		private bool m_bMakeCmdQuotes;
-		public bool EncodeQuotesForCommandLine
-		{
-			get { return m_bMakeCmdQuotes; }
-		}
-
-		private bool m_bNoUrlSchemeOnce = false;
-		public bool UrlRemoveSchemeOnce
-		{
-			get { return m_bNoUrlSchemeOnce; }
-			set { m_bNoUrlSchemeOnce = value; }
-		}
-
-		public SprContentFlags(bool bEncodeAsAutoTypeSequence,
-			bool bEncodeQuotesForCommandLine)
-		{
-			m_bMakeAT = bEncodeAsAutoTypeSequence;
-			m_bMakeCmdQuotes = bEncodeQuotesForCommandLine;
-		}
-	}
-}
diff --git a/KeePass/Util/Spr/SprContext.cs b/KeePass/Util/Spr/SprContext.cs
new file mode 100644
index 0000000..bbffa82
--- /dev/null
+++ b/KeePass/Util/Spr/SprContext.cs
@@ -0,0 +1,172 @@
+/*
+  KeePass Password Safe - The Open-Source Password Manager
+  Copyright (C) 2003-2011 Dominik Reichl <dominik.reichl at t-online.de>
+
+  This program is free software; you can redistribute it and/or modify
+  it under the terms of the GNU General Public License as published by
+  the Free Software Foundation; either version 2 of the License, or
+  (at your option) any later version.
+
+  This program is distributed in the hope that it will be useful,
+  but WITHOUT ANY WARRANTY; without even the implied warranty of
+  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+  GNU General Public License for more details.
+
+  You should have received a copy of the GNU General Public License
+  along with this program; if not, write to the Free Software
+  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+*/
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using System.Diagnostics;
+
+using KeePassLib;
+using KeePassLib.Interfaces;
+
+using SprRefsCache = System.Collections.Generic.Dictionary<string, string>;
+
+namespace KeePass.Util.Spr
+{
+	[Flags]
+	public enum SprCompileFlags
+	{
+		None = 0,
+
+		AppPaths = 0x1, // Paths to IE, Firefox, Opera, ...
+		PickChars = 0x2,
+		EntryStrings = 0x4,
+		UrlRmvScm = 0x8,
+		PasswordEnc = 0x10,
+		Group = 0x20,
+		Paths = 0x40, // App-dir, doc-dir, path sep, ...
+		AutoType = 0x80, // Replacements like {CLEARFIELD}, ...
+		DateTime = 0x100,
+		References = 0x200,
+		EnvVars = 0x400,
+		NewPassword = 0x800,
+		HmacOtp = 0x1000,
+		Comments = 0x2000,
+
+		All = 0x3FFF,
+
+		UIInteractive = SprCompileFlags.PickChars,
+		StateChanging = (SprCompileFlags.NewPassword | SprCompileFlags.HmacOtp),
+
+		Active = (SprCompileFlags.UIInteractive | SprCompileFlags.StateChanging),
+		NonActive = (SprCompileFlags.All & ~SprCompileFlags.Active),
+
+		Deref = (SprCompileFlags.EntryStrings | SprCompileFlags.UrlRmvScm |
+			SprCompileFlags.References)
+	}
+
+	public sealed class SprContext
+	{
+		private PwEntry m_pe = null;
+		public PwEntry Entry
+		{
+			get { return m_pe; }
+			set { m_pe = value; }
+		}
+
+		private PwDatabase m_pd = null;
+		public PwDatabase Database
+		{
+			get { return m_pd; }
+			set { m_pd = value; }
+		}
+
+		private bool m_bMakeAT = false;
+		public bool EncodeAsAutoTypeSequence
+		{
+			get { return m_bMakeAT; }
+			set { m_bMakeAT = value; }
+		}
+
+		private bool m_bMakeCmdQuotes = false;
+		public bool EncodeQuotesForCommandLine
+		{
+			get { return m_bMakeCmdQuotes; }
+			set { m_bMakeCmdQuotes = value; }
+		}
+
+		private bool m_bForcePlainTextPasswords = true;
+		public bool ForcePlainTextPasswords
+		{
+			get { return m_bForcePlainTextPasswords; }
+			set { m_bForcePlainTextPasswords = value; }
+		}
+
+		private SprCompileFlags m_flags = SprCompileFlags.All;
+		public SprCompileFlags Flags
+		{
+			get { return m_flags; }
+			set { m_flags = value; }
+		}
+
+		private SprRefsCache m_refsCache = new SprRefsCache();
+		/// <summary>
+		/// Used internally by <c>SprEngine</c>; don't modify it.
+		/// </summary>
+		internal SprRefsCache RefsCache
+		{
+			get { return m_refsCache; }
+		}
+
+		private bool m_bNoUrlSchemeOnce = false;
+		/// <summary>
+		/// Used internally by <c>SprEngine</c>; don't modify it.
+		/// </summary>
+		internal bool UrlRemoveSchemeOnce
+		{
+			get { return m_bNoUrlSchemeOnce; }
+			set { m_bNoUrlSchemeOnce = value; }
+		}
+
+		public SprContext() { }
+
+		public SprContext(PwEntry pe, PwDatabase pd, SprCompileFlags fl)
+		{
+			Init(pe, pd, false, false, fl);
+		}
+
+		public SprContext(PwEntry pe, PwDatabase pd, SprCompileFlags fl,
+			bool bEncodeAsAutoTypeSequence, bool bEncodeQuotesForCommandLine)
+		{
+			Init(pe, pd, bEncodeAsAutoTypeSequence, bEncodeQuotesForCommandLine, fl);
+		}
+
+		private void Init(PwEntry pe, PwDatabase pd, bool bAT, bool bCmdQuotes,
+			SprCompileFlags fl)
+		{
+			m_pe = pe;
+			m_pd = pd;
+			m_bMakeAT = bAT;
+			m_bMakeCmdQuotes = bCmdQuotes;
+			m_flags = fl;
+		}
+
+		public SprContext Clone()
+		{
+			return (SprContext)this.MemberwiseClone();
+		}
+
+		/// <summary>
+		/// Used by <c>SprEngine</c> internally; do not use.
+		/// </summary>
+		internal SprContext WithoutContentTransformations()
+		{
+			SprContext ctx = Clone();
+
+			ctx.m_bMakeAT = false;
+			ctx.m_bMakeCmdQuotes = false;
+			ctx.m_bNoUrlSchemeOnce = false;
+
+			Debug.Assert(object.ReferenceEquals(m_pe, ctx.m_pe));
+			Debug.Assert(object.ReferenceEquals(m_pd, ctx.m_pd));
+			Debug.Assert(object.ReferenceEquals(m_refsCache, ctx.m_refsCache));
+			return ctx;
+		}
+	}
+}
diff --git a/KeePass/Util/Spr/SprEngine.PickChars.cs b/KeePass/Util/Spr/SprEngine.PickChars.cs
new file mode 100644
index 0000000..ce2f93c
--- /dev/null
+++ b/KeePass/Util/Spr/SprEngine.PickChars.cs
@@ -0,0 +1,325 @@
+/*
+  KeePass Password Safe - The Open-Source Password Manager
+  Copyright (C) 2003-2011 Dominik Reichl <dominik.reichl at t-online.de>
+
+  This program is free software; you can redistribute it and/or modify
+  it under the terms of the GNU General Public License as published by
+  the Free Software Foundation; either version 2 of the License, or
+  (at your option) any later version.
+
+  This program is distributed in the hope that it will be useful,
+  but WITHOUT ANY WARRANTY; without even the implied warranty of
+  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+  GNU General Public License for more details.
+
+  You should have received a copy of the GNU General Public License
+  along with this program; if not, write to the Free Software
+  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+*/
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using System.Windows.Forms;
+using System.Diagnostics;
+
+using KeePass.Forms;
+using KeePass.UI;
+
+using KeePassLib;
+using KeePassLib.Security;
+using KeePassLib.Utility;
+
+namespace KeePass.Util.Spr
+{
+	/// <summary>
+	/// String placeholders and field reference replacement engine.
+	/// </summary>
+	public static partial class SprEngine
+	{
+		/* private static string ReplacePickPw(string strText, PwEntry pe,
+			SprContentFlags cf)
+		{
+			string str = strText;
+
+			for(int iID = 1; iID < (int.MaxValue - 1); ++iID)
+			{
+				string strPlaceholder = @"{PICKPASSWORDCHARS";
+				if(iID > 1) strPlaceholder += iID.ToString();
+				strPlaceholder += @"}";
+
+				if(str.IndexOf(strPlaceholder, StrUtil.CaseIgnoreCmp) >= 0)
+				{
+					ProtectedString ps = pe.Strings.Get(PwDefs.PasswordField);
+					if(ps != null)
+					{
+						byte[] pb = ps.ReadUtf8();
+						bool bNotEmpty = (pb.Length > 0);
+						Array.Clear(pb, 0, pb.Length);
+
+						if(bNotEmpty)
+						{
+							CharPickerForm cpf = new CharPickerForm();
+							cpf.InitEx(ps, true, true, 0);
+
+							if(cpf.ShowDialog() == DialogResult.OK)
+								str = StrUtil.ReplaceCaseInsensitive(str, strPlaceholder,
+									SprEngine.TransformContent(cpf.SelectedCharacters.ReadString(), cf));
+							UIUtil.DestroyForm(cpf);
+						}
+					}
+
+					str = StrUtil.ReplaceCaseInsensitive(str, strPlaceholder, string.Empty);
+				}
+				else break;
+			}
+
+			return str;
+		} */
+
+		// Legacy, for backward compatibility only; see PickChars
+		private static string ReplacePickPw(string strText, SprContext ctx,
+			uint uRecursionLevel)
+		{
+			if(ctx.Entry == null) { Debug.Assert(false); return strText; }
+
+			string str = strText;
+
+			while(true)
+			{
+				const string strStart = @"{PICKPASSWORDCHARS";
+
+				int iStart = str.IndexOf(strStart, StrUtil.CaseIgnoreCmp);
+				if(iStart < 0) break;
+
+				int iEnd = str.IndexOf('}', iStart);
+				if(iEnd < 0) break;
+
+				string strPlaceholder = str.Substring(iStart, iEnd - iStart + 1);
+
+				string strParam = str.Substring(iStart + strStart.Length,
+					iEnd - (iStart + strStart.Length));
+				string[] vParams = strParam.Split(new char[] { ':' });
+
+				uint uCharCount = 0;
+				if(vParams.Length >= 2) uint.TryParse(vParams[1], out uCharCount);
+
+				str = ReplacePickPwPlaceholder(str, strPlaceholder, uCharCount,
+					ctx, uRecursionLevel);
+			}
+
+			return str;
+		}
+
+		private static string ReplacePickPwPlaceholder(string str,
+			string strPlaceholder, uint uCharCount, SprContext ctx,
+			uint uRecursionLevel)
+		{
+			if(str.IndexOf(strPlaceholder, StrUtil.CaseIgnoreCmp) < 0) return str;
+
+			ProtectedString ps = ctx.Entry.Strings.Get(PwDefs.PasswordField);
+			if(ps != null)
+			{
+				string strPassword = ps.ReadString();
+
+				string strPick = SprEngine.CompileInternal(strPassword,
+					ctx.WithoutContentTransformations(), uRecursionLevel + 1);
+
+				if(!string.IsNullOrEmpty(strPick))
+				{
+					ProtectedString psPick = new ProtectedString(false, strPick);
+					CharPickerForm dlg = new CharPickerForm();
+					dlg.InitEx(psPick, true, true, uCharCount, null);
+
+					if(dlg.ShowDialog() == DialogResult.OK)
+						str = StrUtil.ReplaceCaseInsensitive(str, strPlaceholder,
+							SprEngine.TransformContent(
+							dlg.SelectedCharacters.ReadString(), ctx));
+					UIUtil.DestroyForm(dlg);
+				}
+			}
+
+			return StrUtil.ReplaceCaseInsensitive(str, strPlaceholder, string.Empty);
+		}
+
+		private static string ReplacePickChars(string strText, SprContext ctx,
+			uint uRecursionLevel)
+		{
+			if(ctx.Entry == null) return strText; // No assert
+
+			string str = strText;
+
+			Dictionary<string, string> dPicked = new Dictionary<string, string>();
+			while(true)
+			{
+				const string strStart = @"{PICKCHARS";
+
+				int iStart = str.IndexOf(strStart, StrUtil.CaseIgnoreCmp);
+				if(iStart < 0) break;
+
+				int iEnd = str.IndexOf('}', iStart);
+				if(iEnd < 0) break;
+
+				string strPlaceholder = str.Substring(iStart, iEnd - iStart + 1);
+
+				string strParam = str.Substring(iStart + strStart.Length,
+					iEnd - (iStart + strStart.Length));
+
+				string strRep = string.Empty;
+				bool bEncode = true;
+
+				if(strParam.Length == 0)
+					strRep = ShowCharPickDlg(ctx.Entry.Strings.ReadSafe(
+						PwDefs.PasswordField), 0, null, ctx, uRecursionLevel);
+				else if(strParam.StartsWith(":"))
+				{
+					string strParams = strParam.Substring(1);
+					string[] vParams = strParams.Split(new char[] { ':' },
+						StringSplitOptions.None);
+
+					string strField = string.Empty;
+					if(vParams.Length >= 1) strField = (vParams[0] ?? string.Empty).Trim();
+					if(strField.Length == 0) strField = PwDefs.PasswordField;
+
+					string strOptions = string.Empty;
+					if(vParams.Length >= 2) strOptions = (vParams[1] ?? string.Empty);
+
+					Dictionary<string, string> dOptions = new Dictionary<string, string>();
+					string[] vOptions = strOptions.Split(new char[] { ',' },
+						StringSplitOptions.RemoveEmptyEntries);
+					foreach(string strOption in vOptions)
+					{
+						string[] vKvp = strOption.Split(new char[] { '=' },
+							StringSplitOptions.None);
+						if(vKvp.Length != 2) continue;
+
+						dOptions[vKvp[0].Trim().ToLower()] = vKvp[1].Trim();
+					}
+
+					string strID = string.Empty;
+					if(dOptions.ContainsKey("id")) strID = dOptions["id"].ToLower();
+
+					uint uCharCount = 0;
+					if(dOptions.ContainsKey("c"))
+						uint.TryParse(dOptions["c"], out uCharCount);
+					if(dOptions.ContainsKey("count"))
+						uint.TryParse(dOptions["count"], out uCharCount);
+
+					bool? bInitHide = null;
+					if(dOptions.ContainsKey("hide"))
+						bInitHide = StrUtil.StringToBool(dOptions["hide"]);
+
+					string strContent = ctx.Entry.Strings.ReadSafe(strField);
+					if(strContent.Length == 0) { } // Leave strRep empty
+					else if((strID.Length > 0) && dPicked.ContainsKey(strID))
+						strRep = dPicked[strID];
+					else
+						strRep = ShowCharPickDlg(strContent, uCharCount, bInitHide,
+							ctx, uRecursionLevel);
+
+					if(strID.Length > 0) dPicked[strID] = strRep;
+
+					if(dOptions.ContainsKey("conv"))
+					{
+						int iOffset = 0;
+						if(dOptions.ContainsKey("conv-offset"))
+							int.TryParse(dOptions["conv-offset"], out iOffset);
+
+						string strConvFmt = string.Empty;
+						if(dOptions.ContainsKey("conv-fmt"))
+							strConvFmt = dOptions["conv-fmt"];
+
+						string strConv = dOptions["conv"];
+						if(strConv.Equals("d", StrUtil.CaseIgnoreCmp))
+						{
+							strRep = ConvertToDownArrows(strRep, iOffset, strConvFmt);
+							bEncode = false;
+						}
+					}
+				}
+
+				str = StrUtil.ReplaceCaseInsensitive(str, strPlaceholder,
+					bEncode ? SprEngine.TransformContent(strRep, ctx) : strRep);
+			}
+
+			return str;
+		}
+
+		private static string ShowCharPickDlg(string strWord, uint uCharCount,
+			bool? bInitHide, SprContext ctx, uint uRecursionLevel)
+		{
+			string strPick = SprEngine.CompileInternal(strWord,
+				ctx.WithoutContentTransformations(), uRecursionLevel + 1);
+
+			// No need to show the dialog when there's nothing to pick from
+			// (this also prevents the dialog from showing up MaxRecursionDepth
+			// times in case of a cyclic {PICKCHARS})
+			if(string.IsNullOrEmpty(strPick)) return string.Empty;
+
+			CharPickerForm cpf = new CharPickerForm();
+			cpf.InitEx(new ProtectedString(false, strPick), true, true,
+				uCharCount, bInitHide);
+
+			string strResult = string.Empty;
+			if(cpf.ShowDialog() == DialogResult.OK)
+				strResult = cpf.SelectedCharacters.ReadString();
+
+			UIUtil.DestroyForm(cpf);
+			return strResult; // Don't transform here
+		}
+
+		private static string ConvertToDownArrows(string str, int iOffset,
+			string strLayout)
+		{
+			if(string.IsNullOrEmpty(str)) return string.Empty;
+
+			StringBuilder sb = new StringBuilder();
+			for(int i = 0; i < str.Length; ++i)
+			{
+				// if((sb.Length > 0) && !string.IsNullOrEmpty(strSep)) sb.Append(strSep);
+
+				char ch = str[i];
+
+				int? iDowns = null;
+				if(strLayout.Length == 0)
+				{
+					if((ch >= '0') && (ch <= '9')) iDowns = (int)ch - '0';
+					else if((ch >= 'a') && (ch <= 'z')) iDowns = (int)ch - 'a';
+					else if((ch >= 'A') && (ch <= 'Z')) iDowns = (int)ch - 'A';
+				}
+				else if(strLayout.Equals("0a", StrUtil.CaseIgnoreCmp))
+				{
+					if((ch >= '0') && (ch <= '9')) iDowns = (int)ch - '0';
+					else if((ch >= 'a') && (ch <= 'z')) iDowns = (int)ch - 'a' + 10;
+					else if((ch >= 'A') && (ch <= 'Z')) iDowns = (int)ch - 'A' + 10;
+				}
+				else if(strLayout.Equals("a0", StrUtil.CaseIgnoreCmp))
+				{
+					if((ch >= '0') && (ch <= '9')) iDowns = (int)ch - '0' + 26;
+					else if((ch >= 'a') && (ch <= 'z')) iDowns = (int)ch - 'a';
+					else if((ch >= 'A') && (ch <= 'Z')) iDowns = (int)ch - 'A';
+				}
+				else if(strLayout.Equals("1a", StrUtil.CaseIgnoreCmp))
+				{
+					if((ch >= '1') && (ch <= '9')) iDowns = (int)ch - '1';
+					else if(ch == '0') iDowns = 9;
+					else if((ch >= 'a') && (ch <= 'z')) iDowns = (int)ch - 'a' + 10;
+					else if((ch >= 'A') && (ch <= 'Z')) iDowns = (int)ch - 'A' + 10;
+				}
+				else if(strLayout.Equals("a1", StrUtil.CaseIgnoreCmp))
+				{
+					if((ch >= '1') && (ch <= '9')) iDowns = (int)ch - '1' + 26;
+					else if(ch == '0') iDowns = 9 + 26;
+					else if((ch >= 'a') && (ch <= 'z')) iDowns = (int)ch - 'a';
+					else if((ch >= 'A') && (ch <= 'Z')) iDowns = (int)ch - 'A';
+				}
+
+				if(!iDowns.HasValue) continue;
+
+				for(int j = 0; j < (iOffset + iDowns); ++j) sb.Append(@"{DOWN}");
+			}
+
+			return sb.ToString();
+		}
+	}
+}
diff --git a/KeePass/Util/Spr/SprEngine.cs b/KeePass/Util/Spr/SprEngine.cs
index e3c79bf..03320c1 100644
--- a/KeePass/Util/Spr/SprEngine.cs
+++ b/KeePass/Util/Spr/SprEngine.cs
@@ -24,234 +24,231 @@ using System.Text;
 using System.IO;
 using System.Diagnostics;
 
+using KeePass.App.Configuration;
+
 using KeePassLib;
 using KeePassLib.Collections;
 using KeePassLib.Security;
 using KeePassLib.Utility;
 
-using SprRefsCache = System.Collections.Generic.Dictionary<string, string>;
-
 namespace KeePass.Util.Spr
 {
 	/// <summary>
 	/// String placeholders and field reference replacement engine.
 	/// </summary>
-	public static class SprEngine
+	public static partial class SprEngine
 	{
 		private const uint MaxRecursionDepth = 12;
 		private const StringComparison ScMethod = StringComparison.OrdinalIgnoreCase;
 
 		private static string m_strAppExePath = string.Empty;
 
+		// private static readonly char[] m_vPlhEscapes = new char[] { '{', '}', '%' };
+
 		private static void InitializeStatic()
 		{
 			m_strAppExePath = WinUtil.GetExecutable();
 		}
 
+		[Obsolete]
 		public static string Compile(string strText, bool bIsAutoTypeSequence,
 			PwEntry pwEntry, PwDatabase pwDatabase, bool bEscapeForAutoType,
 			bool bEscapeQuotesForCommandLine)
 		{
+			SprContext ctx = new SprContext(pwEntry, pwDatabase, SprCompileFlags.All,
+				bEscapeForAutoType, bEscapeQuotesForCommandLine);
+			return Compile(strText, ctx);
+		}
+
+		public static string Compile(string strText, SprContext ctx)
+		{
 			if(strText == null) { Debug.Assert(false); return string.Empty; }
 			if(strText.Length == 0) return string.Empty;
 
 			SprEngine.InitializeStatic();
 
-			SprContentFlags cf = new SprContentFlags(bEscapeForAutoType &&
-				bIsAutoTypeSequence, bEscapeQuotesForCommandLine);
-
-			SprRefsCache vRefsCache = new SprRefsCache();
+			if(ctx == null) ctx = new SprContext();
+			ctx.RefsCache.Clear();
 
-			string str = SprEngine.CompileInternal(strText, pwEntry, pwDatabase,
-				cf, 0, vRefsCache);
+			string str = SprEngine.CompileInternal(strText, ctx, 0);
 
-			if(bEscapeForAutoType && !bIsAutoTypeSequence)
-				str = SprEncoding.MakeAutoTypeSequence(str);
+			// if(bEscapeForAutoType && !bIsAutoTypeSequence)
+			//	str = SprEncoding.MakeAutoTypeSequence(str);
 
 			return str;
 		}
 
-		private static string CompileInternal(string strText, PwEntry pwEntry,
-			PwDatabase pwDatabase, SprContentFlags cf, uint uRecursionLevel,
-			SprRefsCache vRefsCache)
+		private static string CompileInternal(string strText, SprContext ctx,
+			uint uRecursionLevel)
 		{
 			if(strText == null) { Debug.Assert(false); return string.Empty; }
+			if(ctx == null) { Debug.Assert(false); ctx = new SprContext(); }
 
 			if(uRecursionLevel >= SprEngine.MaxRecursionDepth)
 			{
 				Debug.Assert(false); // Most likely a recursive reference
-				return string.Empty; // Do not return strText
+				return string.Empty; // Do not return strText (endless loop)
 			}
 
 			string str = strText;
-			str = AppLocator.FillPlaceholders(str, cf);
-			str = EntryUtil.FillPlaceholders(str, pwEntry, pwDatabase, cf);
 
-			if(pwEntry != null)
+			if((ctx.Flags & SprCompileFlags.Comments) != SprCompileFlags.None)
+				str = RemoveComments(str);
+
+			if((ctx.Flags & SprCompileFlags.AppPaths) != SprCompileFlags.None)
+				str = AppLocator.FillPlaceholders(str, ctx);
+
+			if(ctx.Entry != null)
 			{
-				List<string> vKeys = pwEntry.Strings.GetKeys();
-
-				// Ensure that all standard field names are in the list
-				// (this is required in order to replace the standard placeholders
-				// even if the corresponding standard field isn't present in
-				// the entry)
-				List<string> vStdNames = PwDefs.GetStandardFields();
-				foreach(string strStdField in vStdNames)
-				{
-					if(!vKeys.Contains(strStdField)) vKeys.Add(strStdField);
-				}
+				if((ctx.Flags & SprCompileFlags.PickChars) != SprCompileFlags.None)
+					str = ReplacePickPw(str, ctx, uRecursionLevel);
 
-				// Do not directly enumerate the strings in pwEntry.Strings,
-				// because strings might change during the Spr compilation
-				foreach(string strField in vKeys)
+				if((ctx.Flags & SprCompileFlags.EntryStrings) != SprCompileFlags.None)
+					str = FillEntryStrings(str, ctx, uRecursionLevel);
+
+				if((ctx.Flags & SprCompileFlags.UrlRmvScm) != SprCompileFlags.None)
 				{
-					string strKey = (PwDefs.IsStandardField(strField) ?
-						(@"{" + strField + @"}") :
-						(@"{" + PwDefs.AutoTypeStringPrefix + strField + @"}"));
-
-					// Use GetSafe because the field doesn't necessarily exist
-					// (might be a standard field that has been added above)
-					str = SprEngine.FillIfExists(str, strKey, pwEntry.Strings.GetSafe(
-						strField), pwEntry, pwDatabase, cf, uRecursionLevel, vRefsCache);
+					ctx.UrlRemoveSchemeOnce = true;
+					str = SprEngine.FillIfExists(str, @"{URL:RMVSCM}",
+						ctx.Entry.Strings.GetSafe(PwDefs.UrlField), ctx, uRecursionLevel);
+					Debug.Assert(!ctx.UrlRemoveSchemeOnce);
 				}
 
-				if(cf != null) cf.UrlRemoveSchemeOnce = true;
-				str = SprEngine.FillIfExists(str, @"{URL:RMVSCM}",
-					pwEntry.Strings.GetSafe(PwDefs.UrlField), pwEntry,
-					pwDatabase, cf, uRecursionLevel, vRefsCache);
-				if(cf != null) { Debug.Assert(!cf.UrlRemoveSchemeOnce); }
-
-				if(str.IndexOf(@"{PASSWORD_ENC}", SprEngine.ScMethod) >= 0)
+				if(((ctx.Flags & SprCompileFlags.PasswordEnc) != SprCompileFlags.None) &&
+					(str.IndexOf(@"{PASSWORD_ENC}", SprEngine.ScMethod) >= 0))
 					str = SprEngine.FillIfExists(str, @"{PASSWORD_ENC}", new ProtectedString(false,
-						StrUtil.EncryptString(pwEntry.Strings.ReadSafe(PwDefs.PasswordField))),
-						pwEntry, pwDatabase, cf, uRecursionLevel, vRefsCache);
+						StrUtil.EncryptString(ctx.Entry.Strings.ReadSafe(PwDefs.PasswordField))),
+						ctx, uRecursionLevel);
 
-				if(pwEntry.ParentGroup != null)
+				if(((ctx.Flags & SprCompileFlags.Group) != SprCompileFlags.None) &&
+					(ctx.Entry.ParentGroup != null))
 				{
 					str = SprEngine.FillIfExists(str, @"{GROUP}", new ProtectedString(
-						false, pwEntry.ParentGroup.Name), pwEntry, pwDatabase,
-						cf, uRecursionLevel, vRefsCache);
+						false, ctx.Entry.ParentGroup.Name), ctx, uRecursionLevel);
 
 					str = SprEngine.FillIfExists(str, @"{GROUPPATH}", new ProtectedString(
-						false, pwEntry.ParentGroup.GetFullPath()), pwEntry, pwDatabase,
-						cf, uRecursionLevel, vRefsCache);
+						false, ctx.Entry.ParentGroup.GetFullPath()), ctx, uRecursionLevel);
 				}
 			}
 
-			if(m_strAppExePath != null)
+			if((ctx.Flags & SprCompileFlags.Paths) != SprCompileFlags.None)
 				str = SprEngine.FillIfExists(str, @"{APPDIR}", new ProtectedString(
 					false, UrlUtil.GetFileDirectory(m_strAppExePath, false, false)),
-					pwEntry, pwDatabase, cf, uRecursionLevel, vRefsCache);
+					ctx, uRecursionLevel);
+
+			if(ctx.Database != null)
+			{
+				if((ctx.Flags & SprCompileFlags.Paths) != SprCompileFlags.None)
+				{
+					// For backward compatibility only
+					str = SprEngine.FillIfExists(str, @"{DOCDIR}", new ProtectedString(
+						false, UrlUtil.GetFileDirectory(ctx.Database.IOConnectionInfo.Path,
+						false, false)), ctx, uRecursionLevel);
+
+					str = SprEngine.FillIfExists(str, @"{DB_PATH}", new ProtectedString(
+						false, ctx.Database.IOConnectionInfo.Path), ctx, uRecursionLevel);
+					str = SprEngine.FillIfExists(str, @"{DB_DIR}", new ProtectedString(
+						false, UrlUtil.GetFileDirectory(ctx.Database.IOConnectionInfo.Path,
+						false, false)), ctx, uRecursionLevel);
+					str = SprEngine.FillIfExists(str, @"{DB_NAME}", new ProtectedString(
+						false, UrlUtil.GetFileName(ctx.Database.IOConnectionInfo.Path)),
+						ctx, uRecursionLevel);
+					str = SprEngine.FillIfExists(str, @"{DB_BASENAME}", new ProtectedString(
+						false, UrlUtil.StripExtension(UrlUtil.GetFileName(
+						ctx.Database.IOConnectionInfo.Path))), ctx, uRecursionLevel);
+					str = SprEngine.FillIfExists(str, @"{DB_EXT}", new ProtectedString(
+						false, UrlUtil.GetExtension(ctx.Database.IOConnectionInfo.Path)),
+						ctx, uRecursionLevel);
+				}
+			}
+
+			if((ctx.Flags & SprCompileFlags.Paths) != SprCompileFlags.None)
+				str = SprEngine.FillIfExists(str, @"{ENV_DIRSEP}", new ProtectedString(
+					false, Path.DirectorySeparatorChar.ToString()), ctx, uRecursionLevel);
+
+			if((ctx.Flags & SprCompileFlags.AutoType) != SprCompileFlags.None)
+				str = StrUtil.ReplaceCaseInsensitive(str, @"{CLEARFIELD}",
+					@"{HOME}+({END}){DEL}{DELAY 50}");
 
-			if(pwDatabase != null)
+			if((ctx.Flags & SprCompileFlags.DateTime) != SprCompileFlags.None)
 			{
-				// For backward compatibility only
-				str = SprEngine.FillIfExists(str, @"{DOCDIR}", new ProtectedString(
-					false, UrlUtil.GetFileDirectory(pwDatabase.IOConnectionInfo.Path,
-					false, false)), pwEntry, pwDatabase, cf, uRecursionLevel, vRefsCache);
-
-				str = SprEngine.FillIfExists(str, @"{DB_PATH}", new ProtectedString(
-					false, pwDatabase.IOConnectionInfo.Path), pwEntry, pwDatabase,
-					cf, uRecursionLevel, vRefsCache);
-				str = SprEngine.FillIfExists(str, @"{DB_DIR}", new ProtectedString(
-					false, UrlUtil.GetFileDirectory(pwDatabase.IOConnectionInfo.Path,
-					false, false)), pwEntry, pwDatabase, cf, uRecursionLevel, vRefsCache);
-				str = SprEngine.FillIfExists(str, @"{DB_NAME}", new ProtectedString(
-					false, UrlUtil.GetFileName(pwDatabase.IOConnectionInfo.Path)),
-					pwEntry, pwDatabase, cf, uRecursionLevel, vRefsCache);
-				str = SprEngine.FillIfExists(str, @"{DB_BASENAME}", new ProtectedString(
-					false, UrlUtil.StripExtension(UrlUtil.GetFileName(
-					pwDatabase.IOConnectionInfo.Path))), pwEntry, pwDatabase, cf,
-					uRecursionLevel, vRefsCache);
-				str = SprEngine.FillIfExists(str, @"{DB_EXT}", new ProtectedString(
-					false, UrlUtil.GetExtension(pwDatabase.IOConnectionInfo.Path)),
-					pwEntry, pwDatabase, cf, uRecursionLevel, vRefsCache);
+				DateTime dtNow = DateTime.Now; // Local time
+				str = SprEngine.FillIfExists(str, @"{DT_YEAR}", new ProtectedString(
+					false, dtNow.Year.ToString("D4")), ctx, uRecursionLevel);
+				str = SprEngine.FillIfExists(str, @"{DT_MONTH}", new ProtectedString(
+					false, dtNow.Month.ToString("D2")), ctx, uRecursionLevel);
+				str = SprEngine.FillIfExists(str, @"{DT_DAY}", new ProtectedString(
+					false, dtNow.Day.ToString("D2")), ctx, uRecursionLevel);
+				str = SprEngine.FillIfExists(str, @"{DT_HOUR}", new ProtectedString(
+					false, dtNow.Hour.ToString("D2")), ctx, uRecursionLevel);
+				str = SprEngine.FillIfExists(str, @"{DT_MINUTE}", new ProtectedString(
+					false, dtNow.Minute.ToString("D2")), ctx, uRecursionLevel);
+				str = SprEngine.FillIfExists(str, @"{DT_SECOND}", new ProtectedString(
+					false, dtNow.Second.ToString("D2")), ctx, uRecursionLevel);
+				str = SprEngine.FillIfExists(str, @"{DT_SIMPLE}", new ProtectedString(
+					false, dtNow.ToString("yyyyMMddHHmmss")), ctx, uRecursionLevel);
+
+				dtNow = dtNow.ToUniversalTime();
+				str = SprEngine.FillIfExists(str, @"{DT_UTC_YEAR}", new ProtectedString(
+					false, dtNow.Year.ToString("D4")), ctx, uRecursionLevel);
+				str = SprEngine.FillIfExists(str, @"{DT_UTC_MONTH}", new ProtectedString(
+					false, dtNow.Month.ToString("D2")), ctx, uRecursionLevel);
+				str = SprEngine.FillIfExists(str, @"{DT_UTC_DAY}", new ProtectedString(
+					false, dtNow.Day.ToString("D2")), ctx, uRecursionLevel);
+				str = SprEngine.FillIfExists(str, @"{DT_UTC_HOUR}", new ProtectedString(
+					false, dtNow.Hour.ToString("D2")), ctx, uRecursionLevel);
+				str = SprEngine.FillIfExists(str, @"{DT_UTC_MINUTE}", new ProtectedString(
+					false, dtNow.Minute.ToString("D2")), ctx, uRecursionLevel);
+				str = SprEngine.FillIfExists(str, @"{DT_UTC_SECOND}", new ProtectedString(
+					false, dtNow.Second.ToString("D2")), ctx, uRecursionLevel);
+				str = SprEngine.FillIfExists(str, @"{DT_UTC_SIMPLE}", new ProtectedString(
+					false, dtNow.ToString("yyyyMMddHHmmss")), ctx, uRecursionLevel);
 			}
 
-			str = StrUtil.ReplaceCaseInsensitive(str, @"{CLEARFIELD}",
-				@"{HOME}+({END}){DEL}{DELAY 50}");
-
-			str = SprEngine.FillIfExists(str, @"{ENV_DIRSEP}", new ProtectedString(
-				false, Path.DirectorySeparatorChar.ToString()), pwEntry, pwDatabase, cf,
-				uRecursionLevel, vRefsCache);
-
-			DateTime dtNow = DateTime.Now; // Local time
-			str = SprEngine.FillIfExists(str, @"{DT_YEAR}", new ProtectedString(
-				false, dtNow.Year.ToString("D4")), pwEntry, pwDatabase, cf,
-				uRecursionLevel, vRefsCache);
-			str = SprEngine.FillIfExists(str, @"{DT_MONTH}", new ProtectedString(
-				false, dtNow.Month.ToString("D2")), pwEntry, pwDatabase, cf,
-				uRecursionLevel, vRefsCache);
-			str = SprEngine.FillIfExists(str, @"{DT_DAY}", new ProtectedString(
-				false, dtNow.Day.ToString("D2")), pwEntry, pwDatabase, cf,
-				uRecursionLevel, vRefsCache);
-			str = SprEngine.FillIfExists(str, @"{DT_HOUR}", new ProtectedString(
-				false, dtNow.Hour.ToString("D2")), pwEntry, pwDatabase, cf,
-				uRecursionLevel, vRefsCache);
-			str = SprEngine.FillIfExists(str, @"{DT_MINUTE}", new ProtectedString(
-				false, dtNow.Minute.ToString("D2")), pwEntry, pwDatabase, cf,
-				uRecursionLevel, vRefsCache);
-			str = SprEngine.FillIfExists(str, @"{DT_SECOND}", new ProtectedString(
-				false, dtNow.Second.ToString("D2")), pwEntry, pwDatabase, cf,
-				uRecursionLevel, vRefsCache);
-			str = SprEngine.FillIfExists(str, @"{DT_SIMPLE}", new ProtectedString(
-				false, dtNow.ToString("yyyyMMddHHmmss")), pwEntry, pwDatabase, cf,
-				uRecursionLevel, vRefsCache);
-
-			dtNow = dtNow.ToUniversalTime();
-			str = SprEngine.FillIfExists(str, @"{DT_UTC_YEAR}", new ProtectedString(
-				false, dtNow.Year.ToString("D4")), pwEntry, pwDatabase, cf,
-				uRecursionLevel, vRefsCache);
-			str = SprEngine.FillIfExists(str, @"{DT_UTC_MONTH}", new ProtectedString(
-				false, dtNow.Month.ToString("D2")), pwEntry, pwDatabase, cf,
-				uRecursionLevel, vRefsCache);
-			str = SprEngine.FillIfExists(str, @"{DT_UTC_DAY}", new ProtectedString(
-				false, dtNow.Day.ToString("D2")), pwEntry, pwDatabase, cf,
-				uRecursionLevel, vRefsCache);
-			str = SprEngine.FillIfExists(str, @"{DT_UTC_HOUR}", new ProtectedString(
-				false, dtNow.Hour.ToString("D2")), pwEntry, pwDatabase, cf,
-				uRecursionLevel, vRefsCache);
-			str = SprEngine.FillIfExists(str, @"{DT_UTC_MINUTE}", new ProtectedString(
-				false, dtNow.Minute.ToString("D2")), pwEntry, pwDatabase, cf,
-				uRecursionLevel, vRefsCache);
-			str = SprEngine.FillIfExists(str, @"{DT_UTC_SECOND}", new ProtectedString(
-				false, dtNow.Second.ToString("D2")), pwEntry, pwDatabase, cf,
-				uRecursionLevel, vRefsCache);
-			str = SprEngine.FillIfExists(str, @"{DT_UTC_SIMPLE}", new ProtectedString(
-				false, dtNow.ToString("yyyyMMddHHmmss")), pwEntry, pwDatabase, cf,
-				uRecursionLevel, vRefsCache);
-
-			str = SprEngine.FillRefPlaceholders(str, pwDatabase, cf, uRecursionLevel,
-				vRefsCache);
-
-			// Replace environment variables
-			foreach(DictionaryEntry de in Environment.GetEnvironmentVariables())
+			if((ctx.Flags & SprCompileFlags.References) != SprCompileFlags.None)
+				str = SprEngine.FillRefPlaceholders(str, ctx, uRecursionLevel);
+
+			if(((ctx.Flags & SprCompileFlags.EnvVars) != SprCompileFlags.None) &&
+				(str.IndexOf('%') >= 0))
 			{
-				string strKey = (de.Key as string);
-				string strValue = (de.Value as string);
-
-				if((strKey != null) && (strValue != null))
-					str = SprEngine.FillIfExists(str, @"%" + strKey + @"%",
-						new ProtectedString(false, strValue), pwEntry, pwDatabase,
-						cf, uRecursionLevel, vRefsCache);
-				else { Debug.Assert(false); }
+				// Replace environment variables
+				foreach(DictionaryEntry de in Environment.GetEnvironmentVariables())
+				{
+					string strKey = (de.Key as string);
+					string strValue = (de.Value as string);
+
+					if((strKey != null) && (strValue != null))
+						str = SprEngine.FillIfExists(str, @"%" + strKey + @"%",
+							new ProtectedString(false, strValue), ctx, uRecursionLevel);
+					else { Debug.Assert(false); }
+				}
+			}
+
+			str = EntryUtil.FillPlaceholders(str, ctx);
+
+			if((ctx.Flags & SprCompileFlags.PickChars) != SprCompileFlags.None)
+				str = ReplacePickChars(str, ctx, uRecursionLevel);
+
+			if(ctx.EncodeAsAutoTypeSequence)
+			{
+				str = str.Replace("\r\n", "\n");
+				str = str.Replace("\r", "\n");
+				str = str.Replace("\n", @"{ENTER}");
 			}
 
-			str = EntryUtil.FillPlaceholdersFinal(str, pwEntry, pwDatabase, cf);
 			return str;
 		}
 
 		private static string FillIfExists(string strData, string strPlaceholder,
-			ProtectedString psParsable, PwEntry pwEntry, PwDatabase pwDatabase,
-			SprContentFlags cf, uint uRecursionLevel, SprRefsCache vRefsCache)
+			ProtectedString psParsable, SprContext ctx, uint uRecursionLevel)
 		{
-			// The UrlRemoveSchemeOnce property of cf must be cleared
+			// The UrlRemoveSchemeOnce property of ctx must be cleared
 			// before this method returns and before any recursive call
 			bool bRemoveScheme = false;
-			if(cf != null)
+			if(ctx != null)
 			{
-				bRemoveScheme = cf.UrlRemoveSchemeOnce;
-				cf.UrlRemoveSchemeOnce = false;
+				bRemoveScheme = ctx.UrlRemoveSchemeOnce;
+				ctx.UrlRemoveSchemeOnce = false;
 			}
 
 			if(strData == null) { Debug.Assert(false); return string.Empty; }
@@ -262,20 +259,21 @@ namespace KeePass.Util.Spr
 			if(strData.IndexOf(strPlaceholder, SprEngine.ScMethod) >= 0)
 			{
 				string strReplacement = SprEngine.CompileInternal(
-					psParsable.ReadString(), pwEntry, pwDatabase, null,
-					uRecursionLevel + 1, vRefsCache);
+					psParsable.ReadString(), ctx.WithoutContentTransformations(),
+					uRecursionLevel + 1);
 
-				if(bRemoveScheme) strReplacement = UrlUtil.RemoveScheme(strReplacement);
+				if(bRemoveScheme)
+					strReplacement = UrlUtil.RemoveScheme(strReplacement);
 
 				return SprEngine.FillPlaceholder(strData, strPlaceholder,
-					strReplacement, cf);
+					strReplacement, ctx);
 			}
 
 			return strData;
 		}
 
 		private static string FillPlaceholder(string strData, string strPlaceholder,
-			string strReplaceWith, SprContentFlags cf)
+			string strReplaceWith, SprContext ctx)
 		{
 			if(strData == null) { Debug.Assert(false); return string.Empty; }
 			if(strPlaceholder == null) { Debug.Assert(false); return strData; }
@@ -283,75 +281,112 @@ namespace KeePass.Util.Spr
 			if(strReplaceWith == null) { Debug.Assert(false); return strData; }
 
 			return StrUtil.ReplaceCaseInsensitive(strData, strPlaceholder,
-				SprEngine.TransformContent(strReplaceWith, cf));
+				SprEngine.TransformContent(strReplaceWith, ctx));
 		}
 
-		public static string TransformContent(string strContent, SprContentFlags cf)
+		public static string TransformContent(string strContent, SprContext ctx)
 		{
 			if(strContent == null) { Debug.Assert(false); return string.Empty; }
 
 			string str = strContent;
 
-			if(cf != null)
+			if(ctx != null)
 			{
-				if(cf.EncodeQuotesForCommandLine)
+				if(ctx.EncodeQuotesForCommandLine)
 					str = SprEncoding.MakeCommandQuotes(str);
 
-				if(cf.EncodeAsAutoTypeSequence)
+				if(ctx.EncodeAsAutoTypeSequence)
 					str = SprEncoding.MakeAutoTypeSequence(str);
 			}
 
 			return str;
 		}
 
-		private static string FillRefPlaceholders(string strSeq, PwDatabase pwDatabase,
-			SprContentFlags cf, uint uRecursionLevel, SprRefsCache vRefsCache)
+		private static string FillEntryStrings(string str, SprContext ctx,
+			uint uRecursionLevel)
 		{
-			if(pwDatabase == null) return strSeq;
+			List<string> vKeys = ctx.Entry.Strings.GetKeys();
+
+			// Ensure that all standard field names are in the list
+			// (this is required in order to replace the standard placeholders
+			// even if the corresponding standard field isn't present in
+			// the entry)
+			List<string> vStdNames = PwDefs.GetStandardFields();
+			foreach(string strStdField in vStdNames)
+			{
+				if(!vKeys.Contains(strStdField)) vKeys.Add(strStdField);
+			}
+
+			// Do not directly enumerate the strings in ctx.Entry.Strings,
+			// because strings might change during the Spr compilation
+			foreach(string strField in vKeys)
+			{
+				string strKey = (PwDefs.IsStandardField(strField) ?
+					(@"{" + strField + @"}") :
+					(@"{" + PwDefs.AutoTypeStringPrefix + strField + @"}"));
+
+				if(!ctx.ForcePlainTextPasswords && strKey.Equals(@"{" +
+					PwDefs.PasswordField + @"}", StrUtil.CaseIgnoreCmp) &&
+					Program.Config.MainWindow.IsColumnHidden(AceColumnType.Password, true))
+				{
+					str = SprEngine.FillIfExists(str, strKey, new ProtectedString(
+						false, PwDefs.HiddenPassword), ctx, uRecursionLevel);
+					continue;
+				}
 
+				// Use GetSafe because the field doesn't necessarily exist
+				// (might be a standard field that has been added above)
+				str = SprEngine.FillIfExists(str, strKey, ctx.Entry.Strings.GetSafe(
+					strField), ctx, uRecursionLevel);
+			}
+
+			return str;
+		}
+
+		private const string StrRemStart = @"{C:";
+		private const string StrRemEnd = @"}";
+		private static string RemoveComments(string strSeq)
+		{
 			string str = strSeq;
 
-			const string strStart = @"{REF:";
-			const string strEnd = @"}";
+			while(true)
+			{
+				int iStart = str.IndexOf(StrRemStart, SprEngine.ScMethod);
+				if(iStart < 0) break;
+				int iEnd = str.IndexOf(StrRemEnd, iStart + 1, SprEngine.ScMethod);
+				if(iEnd <= iStart) break;
+
+				str = (str.Substring(0, iStart) + str.Substring(iEnd + StrRemEnd.Length));
+			}
+
+			return str;
+		}
+
+		internal const string StrRefStart = @"{REF:";
+		internal const string StrRefEnd = @"}";
+		private static string FillRefPlaceholders(string strSeq, SprContext ctx,
+			uint uRecursionLevel)
+		{
+			if(ctx.Database == null) return strSeq;
+
+			string str = strSeq;
 
 			int nOffset = 0;
 			for(int iLoop = 0; iLoop < 20; ++iLoop)
 			{
-				str = SprEngine.FillRefsUsingCache(str, vRefsCache);
+				str = SprEngine.FillRefsUsingCache(str, ctx);
 
-				int nStart = str.IndexOf(strStart, nOffset, SprEngine.ScMethod);
+				int nStart = str.IndexOf(StrRefStart, nOffset, SprEngine.ScMethod);
 				if(nStart < 0) break;
-				int nEnd = str.IndexOf(strEnd, nStart, SprEngine.ScMethod);
-				if(nEnd < 0) break;
+				int nEnd = str.IndexOf(StrRefEnd, nStart + 1, SprEngine.ScMethod);
+				if(nEnd <= nStart) break;
 
 				string strFullRef = str.Substring(nStart, nEnd - nStart + 1);
+				char chScan, chWanted;
+				PwEntry peFound = FindRefTarget(strFullRef, ctx, out chScan, out chWanted);
 
-				string strRef = str.Substring(nStart + strStart.Length, nEnd -
-					nStart - strStart.Length);
-				if(strRef.Length <= 4) { nOffset = nStart + 1; continue; }
-				if(strRef[1] != '@') { nOffset = nStart + 1; continue; }
-				if(strRef[3] != ':') { nOffset = nStart + 1; continue; }
-
-				char chScan = char.ToUpper(strRef[2]);
-				char chWanted = char.ToUpper(strRef[0]);
-
-				SearchParameters sp = SearchParameters.None;
-				sp.SearchString = strRef.Substring(4);
-				if(chScan == 'T') sp.SearchInTitles = true;
-				else if(chScan == 'U') sp.SearchInUserNames = true;
-				else if(chScan == 'A') sp.SearchInUrls = true;
-				else if(chScan == 'P') sp.SearchInPasswords = true;
-				else if(chScan == 'N') sp.SearchInNotes = true;
-				else if(chScan == 'I') sp.SearchInUuids = true;
-				else if(chScan == 'O') sp.SearchInOther = true;
-				else { nOffset = nStart + 1; continue; }
-
-				PwObjectList<PwEntry> lFound = new PwObjectList<PwEntry>();
-				pwDatabase.RootGroup.SearchEntries(sp, lFound, true);
-				if(lFound.UCount > 0)
+				if(peFound != null)
 				{
-					PwEntry peFound = lFound.GetAt(0);
-
 					string strInsData;
 					if(chWanted == 'T')
 						strInsData = peFound.Strings.ReadSafe(PwDefs.TitleField);
@@ -367,13 +402,20 @@ namespace KeePass.Util.Spr
 						strInsData = peFound.Uuid.ToHexString();
 					else { nOffset = nStart + 1; continue; }
 
+					if((chWanted == 'P') && !ctx.ForcePlainTextPasswords &&
+						Program.Config.MainWindow.IsColumnHidden(AceColumnType.Password, true))
+						strInsData = PwDefs.HiddenPassword;
+
+					SprContext sprSub = ctx.WithoutContentTransformations();
+					sprSub.Entry = peFound;
+
 					string strInnerContent = SprEngine.CompileInternal(strInsData,
-						peFound, pwDatabase, null, uRecursionLevel + 1, vRefsCache);
-					strInnerContent = SprEngine.TransformContent(strInnerContent, cf);
+						sprSub, uRecursionLevel + 1);
+					strInnerContent = SprEngine.TransformContent(strInnerContent, ctx);
 
 					// str = str.Substring(0, nStart) + strInnerContent + str.Substring(nEnd + 1);
-					SprEngine.AddRefToCache(strFullRef, strInnerContent, vRefsCache);
-					str = SprEngine.FillRefsUsingCache(str, vRefsCache);
+					SprEngine.AddRefToCache(strFullRef, strInnerContent, ctx);
+					str = SprEngine.FillRefsUsingCache(str, ctx);
 				}
 				else { nOffset = nStart + 1; continue; }
 			}
@@ -381,28 +423,95 @@ namespace KeePass.Util.Spr
 			return str;
 		}
 
-		private static string FillRefsUsingCache(string strText, SprRefsCache vRefs)
+		public static PwEntry FindRefTarget(string strFullRef, SprContext ctx,
+			out char chScan, out char chWanted)
+		{
+			chScan = char.MinValue;
+			chWanted = char.MinValue;
+
+			if(strFullRef == null) { Debug.Assert(false); return null; }
+			if(!strFullRef.StartsWith(StrRefStart, SprEngine.ScMethod) ||
+				!strFullRef.EndsWith(StrRefEnd, SprEngine.ScMethod))
+				return null;
+			if((ctx == null) || (ctx.Database == null)) { Debug.Assert(false); return null; }
+
+			string strRef = strFullRef.Substring(StrRefStart.Length,
+				strFullRef.Length - StrRefStart.Length - StrRefEnd.Length);
+			if(strRef.Length <= 4) return null;
+			if(strRef[1] != '@') return null;
+			if(strRef[3] != ':') return null;
+
+			chScan = char.ToUpper(strRef[2]);
+			chWanted = char.ToUpper(strRef[0]);
+
+			SearchParameters sp = SearchParameters.None;
+			sp.SearchString = strRef.Substring(4);
+			if(chScan == 'T') sp.SearchInTitles = true;
+			else if(chScan == 'U') sp.SearchInUserNames = true;
+			else if(chScan == 'A') sp.SearchInUrls = true;
+			else if(chScan == 'P') sp.SearchInPasswords = true;
+			else if(chScan == 'N') sp.SearchInNotes = true;
+			else if(chScan == 'I') sp.SearchInUuids = true;
+			else if(chScan == 'O') sp.SearchInOther = true;
+			else return null;
+
+			PwObjectList<PwEntry> lFound = new PwObjectList<PwEntry>();
+			ctx.Database.RootGroup.SearchEntries(sp, lFound);
+
+			return ((lFound.UCount > 0) ? lFound.GetAt(0) : null);
+		}
+
+		private static string FillRefsUsingCache(string strText, SprContext ctx)
 		{
 			string str = strText;
 
-			foreach(KeyValuePair<string, string> kvp in vRefs)
+			foreach(KeyValuePair<string, string> kvp in ctx.RefsCache)
 			{
-				str = str.Replace(kvp.Key, kvp.Value);
+				// str = str.Replace(kvp.Key, kvp.Value);
+				str = StrUtil.ReplaceCaseInsensitive(str, kvp.Key, kvp.Value);
 			}
 
 			return str;
 		}
 
 		private static void AddRefToCache(string strRef, string strValue,
-			SprRefsCache vRefs)
+			SprContext ctx)
 		{
 			if(strRef == null) { Debug.Assert(false); return; }
 			if(strValue == null) { Debug.Assert(false); return; }
-			if(vRefs == null) { Debug.Assert(false); return; }
+			if(ctx == null) { Debug.Assert(false); return; }
 
 			// Only add if not exists, do not overwrite
-			if(vRefs.ContainsKey(strRef) == false)
-				vRefs.Add(strRef, strValue);
+			if(!ctx.RefsCache.ContainsKey(strRef))
+				ctx.RefsCache.Add(strRef, strValue);
+		}
+
+		// internal static bool MightChange(string strText)
+		// {
+		//	if(string.IsNullOrEmpty(strText)) return false;
+		//	return (strText.IndexOfAny(m_vPlhEscapes) >= 0);
+		// }
+
+		/// <summary>
+		/// Fast probabilistic test whether a string might be
+		/// changed when compiling with <c>SprCompileFlags.Deref</c>.
+		/// </summary>
+		internal static bool MightDeref(string strText)
+		{
+			if(strText == null) return false;
+			return (strText.IndexOf('{') >= 0);
+		}
+
+		internal static string DerefFn(string str, PwEntry pe)
+		{
+			if(!MightDeref(str)) return str;
+
+			SprContext ctx = new SprContext(pe,
+				Program.MainForm.DocumentManager.SafeFindContainerOf(pe),
+				SprCompileFlags.Deref);
+			// ctx.ForcePlainTextPasswords = false;
+
+			return Compile(str, ctx);
 		}
 	}
 }
diff --git a/KeePass/Util/WinUtil.cs b/KeePass/Util/WinUtil.cs
index 6838a80..facf720 100644
--- a/KeePass/Util/WinUtil.cs
+++ b/KeePass/Util/WinUtil.cs
@@ -119,7 +119,13 @@ namespace KeePass.Util
 
 		public static void OpenUrl(string strUrlToOpen, PwEntry peDataSource)
 		{
-			// If URL is null, return false, do not throw exception.
+			OpenUrl(strUrlToOpen, peDataSource, true);
+		}
+
+		public static void OpenUrl(string strUrlToOpen, PwEntry peDataSource,
+			bool bAllowOverride)
+		{
+			// If URL is null, return, do not throw exception.
 			Debug.Assert(strUrlToOpen != null); if(strUrlToOpen == null) return;
 
 			string strPrevWorkDir = Directory.GetCurrentDirectory();
@@ -138,16 +144,17 @@ namespace KeePass.Util
 
 			bool bCmdQuotes = WinUtil.IsCommandLineUrl(strUrlFlt);
 
-			string strUrl = SprEngine.Compile(strUrlFlt, false, peDataSource,
-				pwDatabase, false, bCmdQuotes);
+			string strUrl = SprEngine.Compile(strUrlFlt, new SprContext(
+				peDataSource, pwDatabase, SprCompileFlags.All, false, bCmdQuotes));
 
 			string strOvr = Program.Config.Integration.UrlSchemeOverrides.GetOverrideForUrl(
 				strUrl);
+			if(!bAllowOverride) strOvr = null;
 			if(strOvr != null)
 			{
 				bCmdQuotes = WinUtil.IsCommandLineUrl(strOvr);
-				strUrl = SprEngine.Compile(strOvr, false, peDataSource, pwDatabase,
-					false, bCmdQuotes);
+				strUrl = SprEngine.Compile(strOvr, new SprContext(
+					peDataSource, pwDatabase, SprCompileFlags.All, false, bCmdQuotes));
 			}
 
 			if(WinUtil.IsCommandLineUrl(strUrl))
@@ -194,6 +201,25 @@ namespace KeePass.Util
 			Program.MainForm.UpdateUI(false, null, false, null, false, null, false);
 		}
 
+		public static void OpenUrlWithApp(string strUrlToOpen, PwEntry peDataSource,
+			string strAppPath)
+		{
+			if(string.IsNullOrEmpty(strUrlToOpen)) return;
+			if(string.IsNullOrEmpty(strAppPath)) return;
+
+			char[] vPathTrim = new char[]{ ' ', '\t', '\r', '\n',
+				'\"', '\'' };
+
+			string strUrl = strUrlToOpen.Trim(vPathTrim);
+			if(strUrl.Length == 0) { Debug.Assert(false); return; }
+
+			string strApp = strAppPath.Trim(vPathTrim);
+			if(strApp.Length == 0) { Debug.Assert(false); return; }
+
+			string str = "cmd://\"" + strApp + "\" \"" + strUrl + "\"";
+			OpenUrl(str, peDataSource, false);
+		}
+
 		private static void StartWithoutShellExecute(string strApp, string strArgs)
 		{
 			try
@@ -236,7 +262,7 @@ namespace KeePass.Util
 			try { m_strExePath = Assembly.GetExecutingAssembly().Location; }
 			catch(Exception) { }
 
-			if((m_strExePath == null) || (m_strExePath.Length == 0))
+			if(string.IsNullOrEmpty(m_strExePath))
 			{
 				m_strExePath = Assembly.GetExecutingAssembly().GetName().CodeBase;
 				m_strExePath = UrlUtil.FileUrlToPath(m_strExePath);
@@ -499,5 +525,49 @@ namespace KeePass.Util
 			if(NativeLib.IsUnix()) return "Unix";
 			return "Windows";
 		}
+
+		public static void RemoveZoneIdentifier(string strFilePath)
+		{
+			// No throw
+			if(string.IsNullOrEmpty(strFilePath)) { Debug.Assert(false); return; }
+
+			try
+			{
+				string strZoneId = strFilePath + ":Zone.Identifier";
+
+				if(NativeMethods.FileExists(strZoneId))
+					NativeMethods.DeleteFile(strZoneId);
+			}
+			catch(Exception) { Debug.Assert(NativeLib.IsUnix()); }
+		}
+
+		public static string RunConsoleApp(string strAppPath, string strParams)
+		{
+			if(strAppPath == null) throw new ArgumentNullException("strAppPath");
+			if(strAppPath.Length == 0) throw new ArgumentException("strAppPath");
+
+			try
+			{
+				ProcessStartInfo psi = new ProcessStartInfo();
+
+				psi.CreateNoWindow = true;
+				psi.FileName = strAppPath;
+				psi.WindowStyle = ProcessWindowStyle.Hidden;
+				psi.UseShellExecute = false;
+				psi.RedirectStandardOutput = true;
+
+				if(!string.IsNullOrEmpty(strParams)) psi.Arguments = strParams;
+
+				Process p = Process.Start(psi);
+
+				string strOutput = p.StandardOutput.ReadToEnd();
+				p.WaitForExit();
+
+				return strOutput;
+			}
+			catch(Exception) { Debug.Assert(false); }
+
+			return null;
+		}
 	}
 }
diff --git a/KeePassLib/Collections/AutoTypeConfig.cs b/KeePassLib/Collections/AutoTypeConfig.cs
index 84162f2..85196e7 100644
--- a/KeePassLib/Collections/AutoTypeConfig.cs
+++ b/KeePassLib/Collections/AutoTypeConfig.cs
@@ -32,45 +32,70 @@ namespace KeePassLib.Collections
 		UseClipboard = 1
 	}
 
-	/* public sealed class AutoTypeAssociation
+	public sealed class AutoTypeAssociation : IEquatable<AutoTypeAssociation>,
+		IDeepCloneable<AutoTypeAssociation>
 	{
 		private string m_strWindow = string.Empty;
-		private string m_strSequence = string.Empty;
-
 		public string WindowName
 		{
 			get { return m_strWindow; }
 			set
 			{
 				Debug.Assert(value != null); if(value == null) throw new ArgumentNullException("value");
-
 				m_strWindow = value;
 			}
 		}
 
-		public string KeySequence
+		private string m_strSequence = string.Empty;
+		public string Sequence
 		{
 			get { return m_strSequence; }
 			set
 			{
 				Debug.Assert(value != null); if(value == null) throw new ArgumentNullException("value");
-
 				m_strSequence = value;
 			}
 		}
-	} */
+
+		public AutoTypeAssociation() { }
+
+		public AutoTypeAssociation(string strWindow, string strSeq)
+		{
+			if(strWindow == null) throw new ArgumentNullException("strWindow");
+			if(strSeq == null) throw new ArgumentNullException("strSeq");
+
+			m_strWindow = strWindow;
+			m_strSequence = strSeq;
+		}
+
+		public bool Equals(AutoTypeAssociation other)
+		{
+			if(other == null) return false;
+
+			if(m_strWindow != other.m_strWindow) return false;
+			if(m_strSequence != other.m_strSequence) return false;
+
+			return true;
+		}
+
+		public AutoTypeAssociation CloneDeep()
+		{
+			return (AutoTypeAssociation)this.MemberwiseClone();
+		}
+	}
 
 	/// <summary>
-	/// A dictionary of auto-type window/keystroke sequence pairs.
+	/// A list of auto-type associations.
 	/// </summary>
-	public sealed class AutoTypeConfig : IDeepCloneable<AutoTypeConfig>
+	public sealed class AutoTypeConfig : IEquatable<AutoTypeConfig>,
+		IDeepCloneable<AutoTypeConfig>
 	{
 		private bool m_bEnabled = true;
 		private AutoTypeObfuscationOptions m_atooObfuscation =
 			AutoTypeObfuscationOptions.None;
 		private string m_strDefaultSequence = string.Empty;
-		private Dictionary<string, string> m_vWindowSeqPairs =
-			new Dictionary<string, string>();
+		private List<AutoTypeAssociation> m_lWindowAssocs =
+			new List<AutoTypeAssociation>();
 
 		/// <summary>
 		/// Specify whether auto-type is enabled or not.
@@ -92,7 +117,7 @@ namespace KeePassLib.Collections
 
 		/// <summary>
 		/// The default keystroke sequence that is auto-typed if
-		/// no matching window is found in the <c>Items</c>
+		/// no matching window is found in the <c>Associations</c>
 		/// container.
 		/// </summary>
 		public string DefaultSequence
@@ -108,134 +133,88 @@ namespace KeePassLib.Collections
 		/// <summary>
 		/// Get all auto-type window/keystroke sequence pairs.
 		/// </summary>
-		public IEnumerable<KeyValuePair<string, string>> WindowSequencePairs
+		public IEnumerable<AutoTypeAssociation> Associations
 		{
-			get { return m_vWindowSeqPairs; }
+			get { return m_lWindowAssocs; }
 		}
 
 		public int AssociationsCount
 		{
-			get { return m_vWindowSeqPairs.Count; }
+			get { return m_lWindowAssocs.Count; }
 		}
 
 		/// <summary>
-		/// Construct a new auto-type dictionary.
+		/// Construct a new auto-type associations list.
 		/// </summary>
 		public AutoTypeConfig()
 		{
 		}
 
 		/// <summary>
-		/// Remove all window/keystroke sequence associations.
+		/// Remove all associations.
 		/// </summary>
 		public void Clear()
 		{
-			m_vWindowSeqPairs.Clear();
+			m_lWindowAssocs.Clear();
 		}
 
 		/// <summary>
-		/// Clone the auto-type dictionary.
+		/// Clone the auto-type associations list.
 		/// </summary>
 		/// <returns>New, cloned object.</returns>
 		public AutoTypeConfig CloneDeep()
 		{
-			AutoTypeConfig newDic = new AutoTypeConfig();
+			AutoTypeConfig newCfg = new AutoTypeConfig();
 
-			newDic.m_bEnabled = m_bEnabled;
-			newDic.m_atooObfuscation = m_atooObfuscation;
-			newDic.m_strDefaultSequence = m_strDefaultSequence;
+			newCfg.m_bEnabled = m_bEnabled;
+			newCfg.m_atooObfuscation = m_atooObfuscation;
+			newCfg.m_strDefaultSequence = m_strDefaultSequence;
 
-			foreach(KeyValuePair<string, string> kvp in m_vWindowSeqPairs)
-				newDic.Set(kvp.Key, kvp.Value);
+			foreach(AutoTypeAssociation a in m_lWindowAssocs)
+				newCfg.Add(a.CloneDeep());
 
-			return newDic;
+			return newCfg;
 		}
 
-		public bool EqualsConfig(AutoTypeConfig cfg)
+		public bool Equals(AutoTypeConfig other)
 		{
-			if(cfg == null) { Debug.Assert(false); return false; }
+			if(other == null) { Debug.Assert(false); return false; }
 
-			if(m_bEnabled != cfg.m_bEnabled) return false;
-			if(m_atooObfuscation != cfg.m_atooObfuscation) return false;
-			if(m_strDefaultSequence != cfg.m_strDefaultSequence) return false;
+			if(m_bEnabled != other.m_bEnabled) return false;
+			if(m_atooObfuscation != other.m_atooObfuscation) return false;
+			if(m_strDefaultSequence != other.m_strDefaultSequence) return false;
 
-			if(m_vWindowSeqPairs.Count != cfg.m_vWindowSeqPairs.Count) return false;
-			foreach(KeyValuePair<string, string> kvp in m_vWindowSeqPairs)
+			if(m_lWindowAssocs.Count != other.m_lWindowAssocs.Count) return false;
+			for(int i = 0; i < m_lWindowAssocs.Count; ++i)
 			{
-				string strValue = cfg.Get(kvp.Key);
-				if((strValue == null) || (strValue != kvp.Value)) return false;
+				if(!m_lWindowAssocs[i].Equals(other.m_lWindowAssocs[i]))
+					return false;
 			}
 
 			return true;
 		}
 
-		/// <summary>
-		/// Set a window/keystroke sequence pair.
-		/// </summary>
-		/// <param name="strWindow">Name of the window. Must not be <c>null</c>.</param>
-		/// <param name="strKeystrokeSequence">Keystroke sequence for the specified
-		/// window. Must not be <c>null</c>.</param>
-		/// <exception cref="System.ArgumentNullException">Thrown if one of the input
-		/// parameters is <c>null</c>.</exception>
-		public void Set(string strWindow, string strKeystrokeSequence)
+		public void Add(AutoTypeAssociation a)
 		{
-			Debug.Assert(strWindow != null); if(strWindow == null) throw new ArgumentNullException("strWindow");
-			Debug.Assert(strKeystrokeSequence != null); if(strKeystrokeSequence == null) throw new ArgumentNullException("strKeystrokeSequence");
+			Debug.Assert(a != null); if(a == null) throw new ArgumentNullException("a");
 
-			m_vWindowSeqPairs[strWindow] = strKeystrokeSequence;
+			m_lWindowAssocs.Add(a);
 		}
 
-		/// <summary>
-		/// Get a keystroke sequence associated with the specified window.
-		/// Returns <c>null</c>, if no sequence can be found.
-		/// </summary>
-		/// <param name="strWindow">Window identifier.</param>
-		/// <returns>Keystroke sequence associated with the specified window.
-		/// The return value is <c>null</c>, if no keystroke sequence has been
-		/// defined for this window yet.</returns>
-		/// <exception cref="System.ArgumentNullException">Thrown if the input
-		/// parameter is <c>null</c>.</exception>
-		public string Get(string strWindow)
+		public AutoTypeAssociation GetAt(int iIndex)
 		{
-			Debug.Assert(strWindow != null); if(strWindow == null) throw new ArgumentNullException("strWindow");
+			if((iIndex < 0) || (iIndex >= m_lWindowAssocs.Count))
+				throw new ArgumentOutOfRangeException("iIndex");
 
-			string str;
-			if(m_vWindowSeqPairs.TryGetValue(strWindow, out str)) return str;
-
-			return null;
+			return m_lWindowAssocs[iIndex];
 		}
 
-		/// <summary>
-		/// Get a keystroke sequence associated with the specified window.
-		/// Returns an empty string (<c>""</c>), if no sequence can be found.
-		/// </summary>
-		/// <param name="strWindow">Window identifier.</param>
-		/// <returns>Keystroke sequence associated with the specified window.
-		/// The return value is an empty string (<c>""</c>), if no keystroke
-		/// sequence has been defined for this window yet.</returns>
-		/// <exception cref="System.ArgumentNullException">Thrown if the input
-		/// parameter is <c>null</c>.</exception>
-		public string GetSafe(string strWindow)
-		{
-			Debug.Assert(strWindow != null); if(strWindow == null) throw new ArgumentNullException("strWindow");
-
-			string str;
-			if(m_vWindowSeqPairs.TryGetValue(strWindow, out str))
-				return str;
-
-			return string.Empty;
-		}
-
-		/// <summary>
-		/// Remove an auto-type entry.
-		/// </summary>
-		/// <param name="strWindow">Window identifier. Must not be <c>null</c>.</param>
-		/// <returns>Returns <c>true</c> if the entry has been removed.</returns>
-		public bool Remove(string strWindow)
+		public void RemoveAt(int iIndex)
 		{
-			Debug.Assert(strWindow != null); if(strWindow == null) throw new ArgumentNullException("strWindow");
+			if((iIndex < 0) || (iIndex >= m_lWindowAssocs.Count))
+				throw new ArgumentOutOfRangeException("iIndex");
 
-			return m_vWindowSeqPairs.Remove(strWindow);
+			m_lWindowAssocs.RemoveAt(iIndex);
 		}
 	}
 }
diff --git a/KeePassLib/Collections/ProtectedStringDictionary.cs b/KeePassLib/Collections/ProtectedStringDictionary.cs
index c096c90..a72b4d6 100644
--- a/KeePassLib/Collections/ProtectedStringDictionary.cs
+++ b/KeePassLib/Collections/ProtectedStringDictionary.cs
@@ -94,8 +94,15 @@ namespace KeePassLib.Collections
 			return plNew;
 		}
 
+		[Obsolete]
 		public bool EqualsDictionary(ProtectedStringDictionary dict)
 		{
+			return EqualsDictionary(dict, MemProtCmpMode.None);
+		}
+
+		public bool EqualsDictionary(ProtectedStringDictionary dict,
+			MemProtCmpMode mpCompare)
+		{
 			if(dict == null) { Debug.Assert(false); return false; }
 
 			if(m_vStrings.Count != dict.m_vStrings.Count) return false;
@@ -104,6 +111,17 @@ namespace KeePassLib.Collections
 			{
 				ProtectedString ps = dict.Get(kvp.Key);
 				if(ps == null) return false;
+
+				if(mpCompare == MemProtCmpMode.Full)
+				{
+					if(ps.IsProtected != kvp.Value.IsProtected) return false;
+				}
+				else if(mpCompare == MemProtCmpMode.CustomOnly)
+				{
+					if(!PwDefs.IsStandardField(kvp.Key) &&
+						(ps.IsProtected != kvp.Value.IsProtected)) return false;
+				}
+
 				if(ps.ReadString() != kvp.Value.ReadString()) return false;
 			}
 
diff --git a/KeePassLib/Cryptography/PasswordGenerator/PatternBasedGenerator.cs b/KeePassLib/Cryptography/PasswordGenerator/PatternBasedGenerator.cs
index a0fb0c9..e892f79 100644
--- a/KeePassLib/Cryptography/PasswordGenerator/PatternBasedGenerator.cs
+++ b/KeePassLib/Cryptography/PasswordGenerator/PatternBasedGenerator.cs
@@ -133,8 +133,8 @@ namespace KeePassLib.Cryptography.PasswordGenerator
 
 			while(true)
 			{
-				int nOpen = str.IndexOf('{');
-				int nClose = str.IndexOf('}');
+				int nOpen = FindFirstUnescapedChar(str, '{');
+				int nClose = FindFirstUnescapedChar(str, '}');
 
 				if((nOpen >= 0) && (nOpen < nClose))
 				{
@@ -155,5 +155,18 @@ namespace KeePassLib.Cryptography.PasswordGenerator
 
 			return str;
 		}
+
+		private static int FindFirstUnescapedChar(string str, char ch)
+		{
+			for(int i = 0; i < str.Length; ++i)
+			{
+				char chCur = str[i];
+
+				if(chCur == '\\') ++i; // Next is escaped, skip it
+				else if(chCur == ch) return i;
+			}
+
+			return -1;
+		}
 	}
 }
diff --git a/KeePassLib/Cryptography/PasswordGenerator/PwProfile.cs b/KeePassLib/Cryptography/PasswordGenerator/PwProfile.cs
index ac8b2b9..089c27e 100644
--- a/KeePassLib/Cryptography/PasswordGenerator/PwProfile.cs
+++ b/KeePassLib/Cryptography/PasswordGenerator/PwProfile.cs
@@ -21,6 +21,7 @@ using System;
 using System.Collections.Generic;
 using System.Text;
 using System.Xml.Serialization;
+using System.ComponentModel;
 using System.Diagnostics;
 
 using KeePassLib.Interfaces;
@@ -55,6 +56,7 @@ namespace KeePassLib.Cryptography.PasswordGenerator
 	public sealed class PwProfile : IDeepCloneable<PwProfile>
 	{
 		private string m_strName = string.Empty;
+		[DefaultValue("")]
 		public string Name
 		{
 			get { return m_strName; }
@@ -69,6 +71,7 @@ namespace KeePassLib.Cryptography.PasswordGenerator
 		}
 
 		private bool m_bUserEntropy = false;
+		[DefaultValue(false)]
 		public bool CollectUserEntropy
 		{
 			get { return m_bUserEntropy; }
@@ -96,6 +99,7 @@ namespace KeePassLib.Cryptography.PasswordGenerator
 		}
 
 		private string m_strCharSetRanges = string.Empty;
+		[DefaultValue("")]
 		public string CharSetRanges
 		{
 			get { this.UpdateCharSet(true); return m_strCharSetRanges; }
@@ -108,6 +112,7 @@ namespace KeePassLib.Cryptography.PasswordGenerator
 		}
 
 		private string m_strCharSetAdditional = string.Empty;
+		[DefaultValue("")]
 		public string CharSetAdditional
 		{
 			get { this.UpdateCharSet(true); return m_strCharSetAdditional; }
@@ -120,6 +125,7 @@ namespace KeePassLib.Cryptography.PasswordGenerator
 		}
 
 		private string m_strPattern = string.Empty;
+		[DefaultValue("")]
 		public string Pattern
 		{
 			get { return m_strPattern; }
@@ -127,6 +133,7 @@ namespace KeePassLib.Cryptography.PasswordGenerator
 		}
 
 		private bool m_bPatternPermute = false;
+		[DefaultValue(false)]
 		public bool PatternPermutePassword
 		{
 			get { return m_bPatternPermute; }
@@ -134,6 +141,7 @@ namespace KeePassLib.Cryptography.PasswordGenerator
 		}
 
 		private bool m_bNoLookAlike = false;
+		[DefaultValue(false)]
 		public bool ExcludeLookAlike
 		{
 			get { return m_bNoLookAlike; }
@@ -141,6 +149,7 @@ namespace KeePassLib.Cryptography.PasswordGenerator
 		}
 
 		private bool m_bNoRepeat = false;
+		[DefaultValue(false)]
 		public bool NoRepeatingCharacters
 		{
 			get { return m_bNoRepeat; }
@@ -148,6 +157,7 @@ namespace KeePassLib.Cryptography.PasswordGenerator
 		}
 
 		private string m_strExclude = string.Empty;
+		[DefaultValue("")]
 		public string ExcludeCharacters
 		{
 			get { return m_strExclude; }
@@ -159,6 +169,7 @@ namespace KeePassLib.Cryptography.PasswordGenerator
 		}
 
 		private string m_strCustomID = string.Empty;
+		[DefaultValue("")]
 		public string CustomAlgorithmUuid
 		{
 			get { return m_strCustomID; }
@@ -170,6 +181,7 @@ namespace KeePassLib.Cryptography.PasswordGenerator
 		}
 
 		private string m_strCustomOpt = string.Empty;
+		[DefaultValue("")]
 		public string CustomAlgorithmOptions
 		{
 			get { return m_strCustomOpt; }
diff --git a/KeePassLib/Delegates/Handlers.cs b/KeePassLib/Delegates/Handlers.cs
index b0e81a7..27fc6fd 100644
--- a/KeePassLib/Delegates/Handlers.cs
+++ b/KeePassLib/Delegates/Handlers.cs
@@ -44,4 +44,6 @@ namespace KeePassLib.Delegates
 	public delegate bool EntryHandler(PwEntry pe);
 
 	public delegate void VoidDelegate();
+
+	public delegate string StrPwEntryDelegate(string str, PwEntry pe);
 }
diff --git a/KeePassLib/Keys/KcpKeyFile.cs b/KeePassLib/Keys/KcpKeyFile.cs
index 79ba8e6..959ad8e 100644
--- a/KeePassLib/Keys/KcpKeyFile.cs
+++ b/KeePassLib/Keys/KcpKeyFile.cs
@@ -27,6 +27,7 @@ using System.Diagnostics;
 
 using KeePassLib.Cryptography;
 using KeePassLib.Security;
+using KeePassLib.Serialization;
 using KeePassLib.Utility;
 
 namespace KeePassLib.Keys
@@ -36,8 +37,8 @@ namespace KeePassLib.Keys
 	/// </summary>
 	public sealed class KcpKeyFile : IUserKey
 	{
-		private string m_strPath = string.Empty;
-		private ProtectedBinary m_pbKeyData = null;
+		private string m_strPath;
+		private ProtectedBinary m_pbKeyData;
 
 		/// <summary>
 		/// Path to the key file.
@@ -59,12 +60,22 @@ namespace KeePassLib.Keys
 
 		public KcpKeyFile(string strKeyFile)
 		{
-			byte[] pbKey = LoadXmlKeyFile(strKeyFile);
-			if(pbKey == null) pbKey = LoadKeyFile(strKeyFile);
+			Construct(IOConnectionInfo.FromPath(strKeyFile));
+		}
+
+		public KcpKeyFile(IOConnectionInfo iocKeyFile)
+		{
+			Construct(iocKeyFile);
+		}
+
+		private void Construct(IOConnectionInfo iocFile)
+		{
+			byte[] pbKey = LoadXmlKeyFile(iocFile);
+			if(pbKey == null) pbKey = LoadKeyFile(iocFile);
 
 			if(pbKey == null) throw new InvalidOperationException();
 
-			m_strPath = strKeyFile;
+			m_strPath = iocFile.Path;
 			m_pbKeyData = new ProtectedBinary(true, pbKey);
 		}
 
@@ -82,24 +93,23 @@ namespace KeePassLib.Keys
 			}
 		}
 
-		private static byte[] LoadKeyFile(string strKeyFilePath)
+		private static byte[] LoadKeyFile(IOConnectionInfo iocFile)
 		{
-			FileStream fs;
-
-			try { fs = new FileStream(strKeyFilePath, FileMode.Open, FileAccess.Read, FileShare.Read); }
-			catch(Exception) { return null; }
+			Stream sIn = null;
+			try { sIn = IOConnection.OpenRead(iocFile); }
+			catch(Exception) { }
+			if(sIn == null) return null;
 
-			long lLength = fs.Length;
-			BinaryReader br = new BinaryReader(fs);
+			long lLength = sIn.Length;
+			BinaryReader br = new BinaryReader(sIn);
 			byte[] pbFileData = br.ReadBytes((int)lLength);
 			br.Close();
-			fs.Close();
+			sIn.Close();
 
 			byte[] pbKey = null;
-
 			if(lLength == 32) pbKey = LoadBinaryKey32(pbFileData);
 			else if(lLength == 64) pbKey = LoadHexKey32(pbFileData);
-			
+
 			if(pbKey == null)
 			{
 				if(pbFileData.Length == lLength)
@@ -197,16 +207,19 @@ namespace KeePassLib.Keys
 		private const string KeyElementName = "Key";
 		private const string KeyDataElementName = "Data";
 
-		private static byte[] LoadXmlKeyFile(string strFile)
+		private static byte[] LoadXmlKeyFile(IOConnectionInfo iocFile)
 		{
-			Debug.Assert(strFile != null); if(strFile == null) throw new ArgumentNullException("strFile");
+			Debug.Assert(iocFile != null); if(iocFile == null) throw new ArgumentNullException("iocFile");
 
+			Stream sIn = null;
 			byte[] pbKeyData = null;
 
 			try
 			{
+				sIn = IOConnection.OpenRead(iocFile);
+
 				XmlDocument doc = new XmlDocument();
-				doc.Load(strFile);
+				doc.Load(sIn);
 
 				XmlElement el = doc.DocumentElement;
 				if((el == null) || !el.Name.Equals(RootElementName)) return null;
@@ -228,7 +241,8 @@ namespace KeePassLib.Keys
 					}
 				}
 			}
-			catch(Exception) { return null; }
+			catch(Exception) { pbKeyData = null; }
+			finally { if(sIn != null) sIn.Close(); }
 
 			return pbKeyData;
 		}
diff --git a/KeePassLib/Keys/KeyProvider.cs b/KeePassLib/Keys/KeyProvider.cs
index 8af915a..dd26118 100644
--- a/KeePassLib/Keys/KeyProvider.cs
+++ b/KeePassLib/Keys/KeyProvider.cs
@@ -44,12 +44,20 @@ namespace KeePassLib.Keys
 			get { return m_bCreatingNewKey; }
 		}
 
-		public KeyProviderQueryContext(IOConnectionInfo ioInfo, bool bCreatingNewKey)
+		private bool m_bSecDesktop;
+		public bool IsOnSecureDesktop
+		{
+			get { return m_bSecDesktop; }
+		}
+
+		public KeyProviderQueryContext(IOConnectionInfo ioInfo, bool bCreatingNewKey,
+			bool bOnSecDesktop)
 		{
 			if(ioInfo == null) throw new ArgumentNullException("ioInfo");
 
 			m_ioInfo = ioInfo.CloneDeep();
 			m_bCreatingNewKey = bCreatingNewKey;
+			m_bSecDesktop = bOnSecDesktop;
 		}
 	}
 
@@ -108,6 +116,16 @@ namespace KeePassLib.Keys
 			get { return true; }
 		}
 
+		/// <summary>
+		/// This property specifies whether the key provider is compatible
+		/// with the secure desktop mode. This almost never is the case,
+		/// so you usually won't override this property.
+		/// </summary>
+		public virtual bool SecureDesktopCompatible
+		{
+			get { return false; }
+		}
+
 		public abstract byte[] GetKey(KeyProviderQueryContext ctx);
 	}
 
diff --git a/KeePassLib/Properties/AssemblyInfo.cs b/KeePassLib/Properties/AssemblyInfo.cs
index 23c8316..c5c3cc4 100644
--- a/KeePassLib/Properties/AssemblyInfo.cs
+++ b/KeePassLib/Properties/AssemblyInfo.cs
@@ -38,5 +38,5 @@ using System.Runtime.InteropServices;
 [assembly: Guid("395f6eec-a1e0-4438-aa82-b75099348134")]
 
 // Assembly version information
-[assembly: AssemblyVersion("2.1.6.*")]
-[assembly: AssemblyFileVersion("2.1.6.0")]
+[assembly: AssemblyVersion("2.1.7.*")]
+[assembly: AssemblyFileVersion("2.1.7.0")]
diff --git a/KeePassLib/PwDatabase.cs b/KeePassLib/PwDatabase.cs
index b6054c6..9442918 100644
--- a/KeePassLib/PwDatabase.cs
+++ b/KeePassLib/PwDatabase.cs
@@ -763,7 +763,7 @@ namespace KeePassLib
 					Debug.Assert(mm != PwMergeMethod.CreateNewUuids);
 
 					bool bEquals = peLocal.EqualsEntry(pe, true, false, true,
-						true, false);
+						true, false, MemProtCmpMode.None);
 
 					bool bOrgBackup = !bEquals;
 					if(mm != PwMergeMethod.OverwriteExisting)
diff --git a/KeePassLib/PwDefs.cs b/KeePassLib/PwDefs.cs
index 36fdce3..cf7c6e6 100644
--- a/KeePassLib/PwDefs.cs
+++ b/KeePassLib/PwDefs.cs
@@ -19,9 +19,11 @@
 
 using System;
 using System.Collections.Generic;
-using System.Diagnostics;
 using System.Xml.Serialization;
+using System.ComponentModel;
+using System.Diagnostics;
 
+using KeePassLib.Delegates;
 using KeePassLib.Interfaces;
 
 namespace KeePassLib
@@ -46,13 +48,13 @@ namespace KeePassLib
 		/// Version, encoded as 32-bit unsigned integer.
 		/// 2.00 = 0x02000000, 2.01 = 0x02000100, 2.15 = 0x02010500, etc.
 		/// </summary>
-		public const uint Version32 = 0x02010600;
-		public const ulong FileVersion64 = 0x0002001000000000UL;
+		public const uint Version32 = 0x02010700;
+		public const ulong FileVersion64 = 0x0002001100000000UL;
 
 		/// <summary>
 		/// Version, encoded as string.
 		/// </summary>
-		public const string VersionString = "2.16";
+		public const string VersionString = "2.17";
 
 		public const string Copyright = @"Copyright © 2003-2011 Dominik Reichl";
 
@@ -213,6 +215,7 @@ namespace KeePassLib
 	public sealed class SearchParameters
 	{
 		private string m_strText = string.Empty;
+		[DefaultValue("")]
 		public string SearchString
 		{
 			get { return m_strText; }
@@ -224,6 +227,7 @@ namespace KeePassLib
 		}
 
 		private bool m_bRegex = false;
+		[DefaultValue(false)]
 		public bool RegularExpression
 		{
 			get { return m_bRegex; }
@@ -231,6 +235,7 @@ namespace KeePassLib
 		}
 
 		private bool m_bSearchInTitles = true;
+		[DefaultValue(true)]
 		public bool SearchInTitles
 		{
 			get { return m_bSearchInTitles; }
@@ -238,6 +243,7 @@ namespace KeePassLib
 		}
 
 		private bool m_bSearchInUserNames = true;
+		[DefaultValue(true)]
 		public bool SearchInUserNames
 		{
 			get { return m_bSearchInUserNames; }
@@ -245,6 +251,7 @@ namespace KeePassLib
 		}
 
 		private bool m_bSearchInPasswords = false;
+		[DefaultValue(false)]
 		public bool SearchInPasswords
 		{
 			get { return m_bSearchInPasswords; }
@@ -252,6 +259,7 @@ namespace KeePassLib
 		}
 
 		private bool m_bSearchInUrls = true;
+		[DefaultValue(true)]
 		public bool SearchInUrls
 		{
 			get { return m_bSearchInUrls; }
@@ -259,6 +267,7 @@ namespace KeePassLib
 		}
 
 		private bool m_bSearchInNotes = true;
+		[DefaultValue(true)]
 		public bool SearchInNotes
 		{
 			get { return m_bSearchInNotes; }
@@ -266,6 +275,7 @@ namespace KeePassLib
 		}
 
 		private bool m_bSearchInOther = true;
+		[DefaultValue(true)]
 		public bool SearchInOther
 		{
 			get { return m_bSearchInOther; }
@@ -273,6 +283,7 @@ namespace KeePassLib
 		}
 
 		private bool m_bSearchInUuids = false;
+		[DefaultValue(false)]
 		public bool SearchInUuids
 		{
 			get { return m_bSearchInUuids; }
@@ -280,6 +291,7 @@ namespace KeePassLib
 		}
 
 		private bool m_bSearchInGroupNames = false;
+		[DefaultValue(false)]
 		public bool SearchInGroupNames
 		{
 			get { return m_bSearchInGroupNames; }
@@ -287,6 +299,7 @@ namespace KeePassLib
 		}
 
 		private bool m_bSearchInTags = true;
+		[DefaultValue(true)]
 		public bool SearchInTags
 		{
 			get { return m_bSearchInTags; }
@@ -305,12 +318,44 @@ namespace KeePassLib
 		}
 
 		private bool m_bExcludeExpired = false;
+		[DefaultValue(false)]
 		public bool ExcludeExpired
 		{
 			get { return m_bExcludeExpired; }
 			set { m_bExcludeExpired = value; }
 		}
 
+		private bool m_bRespectEntrySearchingDisabled = true;
+		[DefaultValue(true)]
+		public bool RespectEntrySearchingDisabled
+		{
+			get { return m_bRespectEntrySearchingDisabled; }
+			set { m_bRespectEntrySearchingDisabled = value; }
+		}
+
+		private StrPwEntryDelegate m_fnDataTrf = null;
+		[XmlIgnore]
+		public StrPwEntryDelegate DataTransformationFn
+		{
+			get { return m_fnDataTrf; }
+			set { m_fnDataTrf = value; }
+		}
+
+		private string m_strDataTrf = string.Empty;
+		/// <summary>
+		/// Only for serialization.
+		/// </summary>
+		[DefaultValue("")]
+		public string DataTransformation
+		{
+			get { return m_strDataTrf; }
+			set
+			{
+				if(value == null) throw new ArgumentNullException("value");
+				m_strDataTrf = value;
+			}
+		}
+
 		[XmlIgnore]
 		public static SearchParameters None
 		{
@@ -322,8 +367,8 @@ namespace KeePassLib
 				// sp.m_bRegex = false;
 				sp.m_bSearchInTitles = false;
 				sp.m_bSearchInUserNames = false;
-				sp.m_bSearchInUrls = false;
 				// sp.m_bSearchInPasswords = false;
+				sp.m_bSearchInUrls = false;
 				sp.m_bSearchInNotes = false;
 				sp.m_bSearchInOther = false;
 				// sp.m_bSearchInUuids = false;
@@ -331,6 +376,7 @@ namespace KeePassLib
 				sp.m_bSearchInTags = false;
 				// sp.m_scType = StringComparison.InvariantCultureIgnoreCase;
 				// sp.m_bExcludeExpired = false;
+				// m_bRespectEntrySearchingDisabled = true;
 
 				return sp;
 			}
@@ -342,6 +388,11 @@ namespace KeePassLib
 		public SearchParameters()
 		{
 		}
+
+		public SearchParameters Clone()
+		{
+			return (SearchParameters)this.MemberwiseClone();
+		}
 	}
 	#pragma warning restore 1591 // Missing XML comments warning
 
diff --git a/KeePassLib/PwEntry.cs b/KeePassLib/PwEntry.cs
index 69d5d68..275218b 100644
--- a/KeePassLib/PwEntry.cs
+++ b/KeePassLib/PwEntry.cs
@@ -72,7 +72,6 @@ namespace KeePassLib
 			set
 			{
 				Debug.Assert(value != null); if(value == null) throw new ArgumentNullException("value");
-
 				m_uuid = value;
 			}
 		}
@@ -106,7 +105,6 @@ namespace KeePassLib
 			set
 			{
 				Debug.Assert(value != null); if(value == null) throw new ArgumentNullException("value");
-				
 				m_listStrings = value;
 			}
 		}
@@ -120,7 +118,6 @@ namespace KeePassLib
 			set
 			{
 				Debug.Assert(value != null); if(value == null) throw new ArgumentNullException("value");
-				
 				m_listBinaries = value;
 			}
 		}
@@ -134,7 +131,6 @@ namespace KeePassLib
 			set
 			{
 				Debug.Assert(value != null); if(value == null) throw new ArgumentNullException("value");
-				
 				m_listAutoType = value;
 			}
 		}
@@ -148,7 +144,6 @@ namespace KeePassLib
 			set
 			{
 				Debug.Assert(value != null); if(value == null) throw new ArgumentNullException("value");
-
 				m_listHistory = value;
 			}
 		}
@@ -173,7 +168,6 @@ namespace KeePassLib
 			set
 			{
 				Debug.Assert(value != null); if(value == null) throw new ArgumentNullException("value");
-
 				m_pwCustomIconID = value;
 			}
 		}
@@ -261,7 +255,6 @@ namespace KeePassLib
 			set
 			{
 				if(value == null) throw new ArgumentNullException("value");
-
 				m_strOverrideUrl = value;
 			}
 		}
@@ -275,7 +268,6 @@ namespace KeePassLib
 			set
 			{
 				if(value == null) throw new ArgumentNullException("value");
-
 				m_vTags = value;
 			}
 		}
@@ -378,9 +370,18 @@ namespace KeePassLib
 			return peNew;
 		}
 
+		[Obsolete]
 		public bool EqualsEntry(PwEntry pe, bool bIgnoreParentGroup, bool bIgnoreLastMod,
 			bool bIgnoreLastAccess, bool bIgnoreHistory, bool bIgnoreThisLastBackup)
 		{
+			return EqualsEntry(pe, bIgnoreParentGroup, bIgnoreLastMod, bIgnoreLastAccess,
+				bIgnoreHistory, bIgnoreThisLastBackup, MemProtCmpMode.None);
+		}
+
+		public bool EqualsEntry(PwEntry pe, bool bIgnoreParentGroup, bool bIgnoreLastMod,
+			bool bIgnoreLastAccess, bool bIgnoreHistory, bool bIgnoreThisLastBackup,
+			MemProtCmpMode mpCmpStr)
+		{
 			if(pe == null) { Debug.Assert(false); return false; }
 
 			if(!m_uuid.EqualsValue(pe.m_uuid)) return false;
@@ -391,10 +392,11 @@ namespace KeePassLib
 					return false;
 			}
 
-			if(!m_listStrings.EqualsDictionary(pe.m_listStrings)) return false;
+			if(!m_listStrings.EqualsDictionary(pe.m_listStrings, mpCmpStr))
+				return false;
 			if(!m_listBinaries.EqualsDictionary(pe.m_listBinaries)) return false;
 
-			if(!m_listAutoType.EqualsConfig(pe.m_listAutoType)) return false;
+			if(!m_listAutoType.Equals(pe.m_listAutoType)) return false;
 
 			if(!bIgnoreHistory)
 			{
@@ -410,7 +412,8 @@ namespace KeePassLib
 				for(uint uHist = 0; uHist < pe.m_listHistory.UCount; ++uHist)
 				{
 					if(!m_listHistory.GetAt(uHist).EqualsEntry(pe.m_listHistory.GetAt(
-						uHist), true, bIgnoreLastMod, bIgnoreLastAccess, false, false))
+						uHist), true, bIgnoreLastMod, bIgnoreLastAccess, false, false,
+						MemProtCmpMode.None))
 						return false;
 				}
 			}
@@ -592,7 +595,7 @@ namespace KeePassLib
 			foreach(PwEntry pe in m_listHistory)
 			{
 				if(pe.EqualsEntry(peData, true, bIgnoreLastMod, bIgnoreLastAccess,
-					true, false)) return true;
+					true, false, MemProtCmpMode.None)) return true;
 			}
 
 			return false;
@@ -660,7 +663,7 @@ namespace KeePassLib
 
 		public bool GetAutoTypeEnabled()
 		{
-			if(m_listAutoType.Enabled == false) return false;
+			if(!m_listAutoType.Enabled) return false;
 
 			if(m_pParentGroup != null)
 				return m_pParentGroup.GetAutoTypeEnabledInherited();
@@ -717,10 +720,10 @@ namespace KeePassLib
 			}
 
 			uSize += (ulong)m_listAutoType.DefaultSequence.Length;
-			foreach(KeyValuePair<string, string> kvpCfg in m_listAutoType.WindowSequencePairs)
+			foreach(AutoTypeAssociation a in m_listAutoType.Associations)
 			{
-				uSize += (ulong)kvpCfg.Key.Length;
-				uSize += (ulong)kvpCfg.Value.Length;
+				uSize += (ulong)a.WindowName.Length;
+				uSize += (ulong)a.Sequence.Length;
 			}
 
 			foreach(PwEntry peHistory in m_listHistory)
diff --git a/KeePassLib/PwEnums.cs b/KeePassLib/PwEnums.cs
index e9fa514..3336664 100644
--- a/KeePassLib/PwEnums.cs
+++ b/KeePassLib/PwEnums.cs
@@ -60,7 +60,6 @@ namespace KeePassLib
 		PreOrder = 1
 	}
 
-#pragma warning disable 1591 // Missing XML comments warning
 	/// <summary>
 	/// Methods for merging password databases/entries.
 	/// </summary>
@@ -73,9 +72,7 @@ namespace KeePassLib
 		CreateNewUuids = 4,
 		Synchronize = 5
 	}
-#pragma warning restore 1591 // Missing XML comments warning
 
-#pragma warning disable 1591 // Missing XML comments warning
 	/// <summary>
 	/// Icon identifiers for groups and password entries.
 	/// </summary>
@@ -156,7 +153,6 @@ namespace KeePassLib
 		/// </summary>
 		Count
 	}
-#pragma warning restore 1591 // Missing XML comments warning
 
 	public enum ProxyServerType
 	{
@@ -164,4 +160,27 @@ namespace KeePassLib
 		System = 1,
 		Manual = 2
 	}
+
+	/// <summary>
+	/// Comparison modes for in-memory protected objects.
+	/// </summary>
+	public enum MemProtCmpMode
+	{
+		/// <summary>
+		/// Ignore the in-memory protection states.
+		/// </summary>
+		None = 0,
+
+		/// <summary>
+		/// Ignore the in-memory protection states of standard
+		/// objects; do compare in-memory protection states of
+		/// custom objects.
+		/// </summary>
+		CustomOnly,
+
+		/// <summary>
+		/// Compare in-memory protection states.
+		/// </summary>
+		Full
+	}
 }
diff --git a/KeePassLib/PwGroup.cs b/KeePassLib/PwGroup.cs
index c5bca77..a4c6f26 100644
--- a/KeePassLib/PwGroup.cs
+++ b/KeePassLib/PwGroup.cs
@@ -76,7 +76,6 @@ namespace KeePassLib
 			set
 			{
 				Debug.Assert(value != null); if(value == null) throw new ArgumentNullException("value");
-				
 				m_uuid = value;
 			}
 		}
@@ -90,7 +89,6 @@ namespace KeePassLib
 			set
 			{
 				Debug.Assert(value != null); if(value == null) throw new ArgumentNullException("value");
-				
 				m_strName = value;
 			}
 		}
@@ -104,7 +102,6 @@ namespace KeePassLib
 			set
 			{
 				Debug.Assert(value != null); if(value == null) throw new ArgumentNullException("value");
-
 				m_strNotes = value;
 			}
 		}
@@ -129,7 +126,6 @@ namespace KeePassLib
 			set
 			{
 				Debug.Assert(value != null); if(value == null) throw new ArgumentNullException("value");
-
 				m_pwCustomIconID = value;
 			}
 		}
@@ -503,6 +499,13 @@ namespace KeePassLib
 			}
 		}
 
+		public uint GetEntriesCount(bool bRecursive)
+		{
+			uint uGroups, uEntries;
+			GetCounts(bRecursive, out uGroups, out uEntries);
+			return uEntries;
+		}
+
 		/// <summary>
 		/// Traverse the group/entry tree in the current group. Various traversal
 		/// methods are available.
@@ -654,41 +657,72 @@ namespace KeePassLib
 		}
 
 		/// <summary>
-		/// Search this group and all groups in the current one for entries.
+		/// Search this group and all subgroups for entries.
 		/// </summary>
-		/// <param name="searchParams">Specifies the search method.</param>
+		/// <param name="sp">Specifies the search method.</param>
 		/// <param name="listStorage">Entry list in which the search results will
 		/// be stored.</param>
-		public void SearchEntries(SearchParameters searchParams, PwObjectList<PwEntry> listStorage,
-			bool bRespectEntrySearchingDisabled)
+		public void SearchEntries(SearchParameters sp, PwObjectList<PwEntry> listStorage)
 		{
-			List<string> lTerms = StrUtil.SplitSearchTerms(searchParams.SearchString);
-			if((lTerms.Count <= 1) || searchParams.RegularExpression)
+			SearchEntries(sp, listStorage, null);
+		}
+
+		/// <summary>
+		/// Search this group and all subgroups for entries.
+		/// </summary>
+		/// <param name="sp">Specifies the search method.</param>
+		/// <param name="listStorage">Entry list in which the search results will
+		/// be stored.</param>
+		public void SearchEntries(SearchParameters sp, PwObjectList<PwEntry> listStorage,
+			IStatusLogger slStatus)
+		{
+			if(sp == null) { Debug.Assert(false); return; }
+			if(listStorage == null) { Debug.Assert(false); return; }
+
+			ulong uCurEntries = 0, uTotalEntries = 0;
+
+			List<string> lTerms = StrUtil.SplitSearchTerms(sp.SearchString);
+			if((lTerms.Count <= 1) || sp.RegularExpression)
 			{
-				SearchEntriesSingle(searchParams, listStorage, bRespectEntrySearchingDisabled);
+				if(slStatus != null) uTotalEntries = GetEntriesCount(true);
+				SearchEntriesSingle(sp, listStorage, slStatus, ref uCurEntries,
+					uTotalEntries);
 				return;
 			}
 
 			// Search longer strings first (for improved performance)
 			lTerms.Sort(StrUtil.CompareLengthGt);
 
-			string strFullSearch = searchParams.SearchString; // Backup
+			string strFullSearch = sp.SearchString; // Backup
 
 			PwGroup pg = this;
 			for(int iTerm = 0; iTerm < lTerms.Count; ++iTerm)
 			{
+				// Update counters for a better state guess
+				if(slStatus != null)
+				{
+					ulong uRemRounds = (ulong)(lTerms.Count - iTerm);
+					uTotalEntries = uCurEntries + (uRemRounds *
+						pg.GetEntriesCount(true));
+				}
+
 				PwGroup pgNew = new PwGroup();
 
-				searchParams.SearchString = lTerms[iTerm];
+				sp.SearchString = lTerms[iTerm];
 
 				bool bNegate = false;
-				if(searchParams.SearchString.StartsWith("-"))
+				if(sp.SearchString.StartsWith("-"))
 				{
-					searchParams.SearchString = searchParams.SearchString.Substring(1);
-					bNegate = (searchParams.SearchString.Length > 0);
+					sp.SearchString = sp.SearchString.Substring(1);
+					bNegate = (sp.SearchString.Length > 0);
 				}
 
-				pg.SearchEntriesSingle(searchParams, pgNew.Entries, bRespectEntrySearchingDisabled);
+				if(!pg.SearchEntriesSingle(sp, pgNew.Entries, slStatus,
+					ref uCurEntries, uTotalEntries))
+				{
+					pg = null;
+					break;
+				}
 
 				if(bNegate)
 				{
@@ -703,54 +737,60 @@ namespace KeePassLib
 				else pg = pgNew;
 			}
 
-			listStorage.Add(pg.Entries);
-			searchParams.SearchString = strFullSearch; // Restore
+			if(pg != null) listStorage.Add(pg.Entries);
+			sp.SearchString = strFullSearch; // Restore
 		}
 
-		private void SearchEntriesSingle(SearchParameters searchParams,
-			PwObjectList<PwEntry> listStorage, bool bRespectEntrySearchingDisabled)
+		private bool SearchEntriesSingle(SearchParameters spIn,
+			PwObjectList<PwEntry> listStorage, IStatusLogger slStatus,
+			ref ulong uCurEntries, ulong uTotalEntries)
 		{
-			Debug.Assert(searchParams != null); if(searchParams == null) throw new ArgumentNullException("searchParams");
-			Debug.Assert(listStorage != null); if(listStorage == null) throw new ArgumentNullException("listStorage");
+			SearchParameters sp = spIn.Clone();
+			if(sp.SearchString == null) { Debug.Assert(false); return true; }
+			sp.SearchString = sp.SearchString.Trim();
 
-			string strSearch = searchParams.SearchString;
-			if(strSearch == null) { Debug.Assert(false); throw new ArgumentException(); }
-			strSearch = strSearch.Trim();
-
-			StringComparison scType = searchParams.ComparisonMode;
-			Regex rx = null;
-			EntryHandler eh = null;
-
-			bool bTitle = searchParams.SearchInTitles;
-			bool bUserName = searchParams.SearchInUserNames;
-			bool bPassword = searchParams.SearchInPasswords;
-			bool bUrl = searchParams.SearchInUrls;
-			bool bNotes = searchParams.SearchInNotes;
-			bool bOther = searchParams.SearchInOther;
-			bool bUuids = searchParams.SearchInUuids;
-			bool bGroupName = searchParams.SearchInGroupNames;
-			bool bTags = searchParams.SearchInTags;
-			bool bExcludeExpired = searchParams.ExcludeExpired;
+			bool bTitle = sp.SearchInTitles;
+			bool bUserName = sp.SearchInUserNames;
+			bool bPassword = sp.SearchInPasswords;
+			bool bUrl = sp.SearchInUrls;
+			bool bNotes = sp.SearchInNotes;
+			bool bOther = sp.SearchInOther;
+			bool bUuids = sp.SearchInUuids;
+			bool bGroupName = sp.SearchInGroupNames;
+			bool bTags = sp.SearchInTags;
+			bool bExcludeExpired = sp.ExcludeExpired;
+			bool bRespectEntrySearchingDisabled = sp.RespectEntrySearchingDisabled;
 
 			DateTime dtNow = DateTime.Now;
 
-			if(searchParams.RegularExpression)
+			Regex rx = null;
+			if(sp.RegularExpression)
 			{
 				RegexOptions ro = RegexOptions.Compiled;
-				if((scType == StringComparison.CurrentCultureIgnoreCase) ||
-					(scType == StringComparison.InvariantCultureIgnoreCase) ||
-					(scType == StringComparison.OrdinalIgnoreCase))
+				if((sp.ComparisonMode == StringComparison.CurrentCultureIgnoreCase) ||
+					(sp.ComparisonMode == StringComparison.InvariantCultureIgnoreCase) ||
+					(sp.ComparisonMode == StringComparison.OrdinalIgnoreCase))
 				{
 					ro |= RegexOptions.IgnoreCase;
 				}
 
-				rx = new Regex(strSearch, ro);
+				rx = new Regex(sp.SearchString, ro);
 			}
 
-			if(strSearch.Length <= 0) // Report all
+			ulong uLocalCurEntries = uCurEntries;
+
+			EntryHandler eh = null;
+			if(sp.SearchString.Length <= 0) // Report all
 			{
 				eh = delegate(PwEntry pe)
 				{
+					if(slStatus != null)
+					{
+						if(!slStatus.SetProgress((uint)((uLocalCurEntries *
+							100UL) / uTotalEntries))) return false;
+						++uLocalCurEntries;
+					}
+
 					if(bRespectEntrySearchingDisabled && !pe.GetSearchingEnabled())
 						return true; // Skip
 					if(bExcludeExpired && pe.Expires && (dtNow > pe.ExpiryTime))
@@ -764,6 +804,13 @@ namespace KeePassLib
 			{
 				eh = delegate(PwEntry pe)
 				{
+					if(slStatus != null)
+					{
+						if(!slStatus.SetProgress((uint)((uLocalCurEntries *
+							100UL) / uTotalEntries))) return false;
+						++uLocalCurEntries;
+					}
+
 					if(bRespectEntrySearchingDisabled && !pe.GetSearchingEnabled())
 						return true; // Skip
 					if(bExcludeExpired && pe.Expires && (dtNow > pe.ExpiryTime))
@@ -777,45 +824,43 @@ namespace KeePassLib
 
 						if(strKey == PwDefs.TitleField)
 						{
-							if(bTitle) SearchEvalAdd(strSearch, kvp.Value.ReadString(),
-								scType, rx, pe, listStorage);
+							if(bTitle) SearchEvalAdd(sp, kvp.Value.ReadString(),
+								rx, pe, listStorage);
 						}
 						else if(strKey == PwDefs.UserNameField)
 						{
-							if(bUserName) SearchEvalAdd(strSearch, kvp.Value.ReadString(),
-								scType, rx, pe, listStorage);
+							if(bUserName) SearchEvalAdd(sp, kvp.Value.ReadString(),
+								rx, pe, listStorage);
 						}
 						else if(strKey == PwDefs.PasswordField)
 						{
-							if(bPassword) SearchEvalAdd(strSearch, kvp.Value.ReadString(),
-								scType, rx, pe, listStorage);
+							if(bPassword) SearchEvalAdd(sp, kvp.Value.ReadString(),
+								rx, pe, listStorage);
 						}
 						else if(strKey == PwDefs.UrlField)
 						{
-							if(bUrl) SearchEvalAdd(strSearch, kvp.Value.ReadString(),
-								scType, rx, pe, listStorage);
+							if(bUrl) SearchEvalAdd(sp, kvp.Value.ReadString(),
+								rx, pe, listStorage);
 						}
 						else if(strKey == PwDefs.NotesField)
 						{
-							if(bNotes) SearchEvalAdd(strSearch, kvp.Value.ReadString(),
-								scType, rx, pe, listStorage);
+							if(bNotes) SearchEvalAdd(sp, kvp.Value.ReadString(),
+								rx, pe, listStorage);
 						}
 						else if(bOther)
-							SearchEvalAdd(strSearch, kvp.Value.ReadString(),
-								scType, rx, pe, listStorage);
+							SearchEvalAdd(sp, kvp.Value.ReadString(),
+								rx, pe, listStorage);
 
 						// An entry can match only once => break if we have added it
 						if(listStorage.UCount > uInitialResults) break;
 					}
 
 					if(bUuids && (listStorage.UCount == uInitialResults))
-						SearchEvalAdd(strSearch, pe.Uuid.ToHexString(),
-							scType, rx, pe, listStorage);
+						SearchEvalAdd(sp, pe.Uuid.ToHexString(), rx, pe, listStorage);
 
 					if(bGroupName && (listStorage.UCount == uInitialResults) &&
 						(pe.ParentGroup != null))
-						SearchEvalAdd(strSearch, pe.ParentGroup.Name,
-							scType, rx, pe, listStorage);
+						SearchEvalAdd(sp, pe.ParentGroup.Name, rx, pe, listStorage);
 
 					if(bTags)
 					{
@@ -823,7 +868,7 @@ namespace KeePassLib
 						{
 							if(listStorage.UCount != uInitialResults) break; // Match
 
-							SearchEvalAdd(strSearch, strTag, scType, rx, pe, listStorage);
+							SearchEvalAdd(sp, strTag, rx, pe, listStorage);
 						}
 					}
 
@@ -831,21 +876,34 @@ namespace KeePassLib
 				};
 			}
 
-			PreOrderTraverseTree(null, eh);
+			if(!PreOrderTraverseTree(null, eh)) return false;
+			uCurEntries = uLocalCurEntries;
+			return true;
 		}
 
-		private static void SearchEvalAdd(string strSearch, string strDataField,
-			StringComparison scType, Regex rx, PwEntry pe, PwObjectList<PwEntry> lResults)
+		private static void SearchEvalAdd(SearchParameters sp, string strDataField,
+			Regex rx, PwEntry pe, PwObjectList<PwEntry> lResults)
 		{
+			bool bMatch = false;
+
 			if(rx == null)
+				bMatch = (strDataField.IndexOf(sp.SearchString,
+					sp.ComparisonMode) >= 0);
+			else bMatch = rx.IsMatch(strDataField);
+
+			if(!bMatch && (sp.DataTransformationFn != null))
 			{
-				if(strDataField.IndexOf(strSearch, scType) >= 0)
-					lResults.Add(pe);
-			}
-			else // Regular expression
-			{
-				if(rx.IsMatch(strDataField)) lResults.Add(pe);
+				string strCmp = sp.DataTransformationFn(strDataField, pe);
+				if(!object.ReferenceEquals(strCmp, strDataField))
+				{
+					if(rx == null)
+						bMatch = (strCmp.IndexOf(sp.SearchString,
+							sp.ComparisonMode) >= 0);
+					else bMatch = rx.IsMatch(strCmp);
+				}
 			}
+
+			if(bMatch) lResults.Add(pe);
 		}
 
 		public List<string> BuildEntryTagsList()
diff --git a/KeePassLib/Security/ProtectedString.cs b/KeePassLib/Security/ProtectedString.cs
index c1a42a2..2cee9b6 100644
--- a/KeePassLib/Security/ProtectedString.cs
+++ b/KeePassLib/Security/ProtectedString.cs
@@ -35,6 +35,9 @@ namespace KeePassLib.Security
 	/// <summary>
 	/// Represents an in-memory encrypted string.
 	/// </summary>
+#if !KeePassLibSD
+	[DebuggerDisplay(@"{ReadString()}")]
+#endif
 	public sealed class ProtectedString
 	{
 		// SecureString objects are supported only on Windows 2000 SP3 and
diff --git a/KeePassLib/Serialization/IOConnection.cs b/KeePassLib/Serialization/IOConnection.cs
index 5a93b76..6e53d17 100644
--- a/KeePassLib/Serialization/IOConnection.cs
+++ b/KeePassLib/Serialization/IOConnection.cs
@@ -219,6 +219,12 @@ namespace KeePassLib.Serialization
 
 		public static Stream OpenRead(IOConnectionInfo ioc)
 		{
+			if(StrUtil.IsDataUri(ioc.Path))
+			{
+				byte[] pbData = StrUtil.DataUriToData(ioc.Path);
+				if(pbData != null) return new MemoryStream(pbData, false);
+			}
+
 			if(ioc.IsLocalFile()) return OpenReadLocal(ioc);
 
 			return CreateWebClient(ioc).OpenRead(new Uri(ioc.Path));
@@ -243,7 +249,16 @@ namespace KeePassLib.Serialization
 
 			if(ioc.IsLocalFile()) return OpenWriteLocal(ioc);
 
-			return CreateWebClient(ioc).OpenWrite(new Uri(ioc.Path));
+			Uri uri = new Uri(ioc.Path);
+
+			// Mono does not set HttpWebRequest.Method to POST for writes,
+			// so one needs to set the method to PUT explicitly
+			if(NativeLib.IsUnix() && (uri.Scheme.Equals(Uri.UriSchemeHttp,
+				StrUtil.CaseIgnoreCmp) || uri.Scheme.Equals(Uri.UriSchemeHttps,
+				StrUtil.CaseIgnoreCmp)))
+				return CreateWebClient(ioc).OpenWrite(uri, WebRequestMethods.Http.Put);
+
+			return CreateWebClient(ioc).OpenWrite(uri);
 		}
 #else
 		public static Stream OpenWrite(IOConnectionInfo ioc)
@@ -306,7 +321,7 @@ namespace KeePassLib.Serialization
 				}
 				else req.Method = WrmDeleteFile;
 
-				req.GetResponse();
+				DisposeResponse(req.GetResponse(), true);
 			}
 #endif
 		}
@@ -350,7 +365,7 @@ namespace KeePassLib.Serialization
 					req.Headers.Set(WrhMoveFileTo, iocTo.Path);
 				}
 
-				req.GetResponse();
+				DisposeResponse(req.GetResponse(), true);
 			}
 #endif
 
@@ -366,5 +381,23 @@ namespace KeePassLib.Serialization
 			// }
 			// DeleteFile(iocFrom);
 		}
+
+		private static void DisposeResponse(WebResponse wr, bool bGetStream)
+		{
+			if(wr == null) return;
+
+			try
+			{
+				if(bGetStream)
+				{
+					Stream s = wr.GetResponseStream();
+					if(s != null) s.Close();
+				}
+			}
+			catch(Exception) { Debug.Assert(false); }
+
+			try { wr.Close(); }
+			catch(Exception) { Debug.Assert(false); }
+		}
 	}
 }
diff --git a/KeePassLib/Serialization/IOConnectionInfo.cs b/KeePassLib/Serialization/IOConnectionInfo.cs
index b116ade..6913cdf 100644
--- a/KeePassLib/Serialization/IOConnectionInfo.cs
+++ b/KeePassLib/Serialization/IOConnectionInfo.cs
@@ -20,9 +20,10 @@
 using System;
 using System.Collections.Generic;
 using System.Text;
-using System.Diagnostics;
 using System.IO;
 using System.Net;
+using System.ComponentModel;
+using System.Diagnostics;
 
 using KeePassLib.Interfaces;
 using KeePassLib.Utility;
@@ -77,6 +78,7 @@ namespace KeePassLib.Serialization
 		}
 
 		private string m_strUser = string.Empty;
+		[DefaultValue("")]
 		public string UserName
 		{
 			get { return m_strUser; }
@@ -90,6 +92,7 @@ namespace KeePassLib.Serialization
 		}
 
 		private string m_strPassword = string.Empty;
+		[DefaultValue("")]
 		public string Password
 		{
 			get { return m_strPassword; }
diff --git a/KeePassLib/Serialization/Kdb4File.Read.Streamed.cs b/KeePassLib/Serialization/Kdb4File.Read.Streamed.cs
index b3122ff..6ad60f3 100644
--- a/KeePassLib/Serialization/Kdb4File.Read.Streamed.cs
+++ b/KeePassLib/Serialization/Kdb4File.Read.Streamed.cs
@@ -610,7 +610,9 @@ namespace KeePassLib.Serialization
 				return KdbContext.Entry;
 			else if((ctx == KdbContext.EntryAutoTypeItem) && (xr.Name == ElemAutoTypeItem))
 			{
-				m_ctxEntry.AutoType.Set(m_ctxATName, m_ctxATSeq);
+				AutoTypeAssociation atAssoc = new AutoTypeAssociation(m_ctxATName,
+					m_ctxATSeq);
+				m_ctxEntry.AutoType.Add(atAssoc);
 				m_ctxATName = null;
 				m_ctxATSeq = null;
 				return KdbContext.EntryAutoType;
diff --git a/KeePassLib/Serialization/Kdb4File.Write.cs b/KeePassLib/Serialization/Kdb4File.Write.cs
index 75d0500..5152d73 100644
--- a/KeePassLib/Serialization/Kdb4File.Write.cs
+++ b/KeePassLib/Serialization/Kdb4File.Write.cs
@@ -418,22 +418,23 @@ namespace KeePassLib.Serialization
 				WriteObject(kvp.Key, kvp.Value, true);
 		}
 
-		private void WriteList(string name, AutoTypeConfig dictAutoType)
+		private void WriteList(string name, AutoTypeConfig cfgAutoType)
 		{
 			Debug.Assert(name != null);
-			Debug.Assert(dictAutoType != null);
-			if(dictAutoType == null) throw new ArgumentNullException("dictAutoType");
+			Debug.Assert(cfgAutoType != null);
+			if(cfgAutoType == null) throw new ArgumentNullException("cfgAutoType");
 
 			m_xmlWriter.WriteStartElement(name);
 
-			WriteObject(ElemAutoTypeEnabled, dictAutoType.Enabled);
-			WriteObject(ElemAutoTypeObfuscation, (int)dictAutoType.ObfuscationOptions);
+			WriteObject(ElemAutoTypeEnabled, cfgAutoType.Enabled);
+			WriteObject(ElemAutoTypeObfuscation, (int)cfgAutoType.ObfuscationOptions);
 
-			if(dictAutoType.DefaultSequence.Length > 0)
-				WriteObject(ElemAutoTypeDefaultSeq, dictAutoType.DefaultSequence, true);
+			if(cfgAutoType.DefaultSequence.Length > 0)
+				WriteObject(ElemAutoTypeDefaultSeq, cfgAutoType.DefaultSequence, true);
 
-			foreach(KeyValuePair<string, string> kvp in dictAutoType.WindowSequencePairs)
-				WriteObject(ElemAutoTypeItem, ElemWindow, ElemKeystrokeSequence, kvp);
+			foreach(AutoTypeAssociation a in cfgAutoType.Associations)
+				WriteObject(ElemAutoTypeItem, ElemWindow, ElemKeystrokeSequence,
+					new KeyValuePair<string, string>(a.WindowName, a.Sequence));
 
 			m_xmlWriter.WriteEndElement();
 		}
diff --git a/KeePassLib/Translation/KPControlCustomization.cs b/KeePassLib/Translation/KPControlCustomization.cs
index 5ccf1e1..3eb5adb 100644
--- a/KeePassLib/Translation/KPControlCustomization.cs
+++ b/KeePassLib/Translation/KPControlCustomization.cs
@@ -20,6 +20,7 @@
 using System;
 using System.Collections.Generic;
 using System.Text;
+using System.ComponentModel;
 using System.Windows.Forms;
 using System.Diagnostics;
 using System.Xml.Serialization;
@@ -47,34 +48,54 @@ namespace KeePassLib.Translation
 
 		private string m_strPosX = string.Empty;
 		[XmlAttribute]
+		[DefaultValue("")]
 		public string X
 		{
 			get { return m_strPosX; }
-			set { m_strPosX = value; }
+			set
+			{
+				if(value == null) throw new ArgumentNullException("value");
+				m_strPosX = value;
+			}
 		}
 
 		private string m_strPosY = string.Empty;
 		[XmlAttribute]
+		[DefaultValue("")]
 		public string Y
 		{
 			get { return m_strPosY; }
-			set { m_strPosY = value; }
+			set
+			{
+				if(value == null) throw new ArgumentNullException("value");
+				m_strPosY = value;
+			}
 		}
 
 		private string m_strSizeW = string.Empty;
 		[XmlAttribute]
+		[DefaultValue("")]
 		public string Width
 		{
 			get { return m_strSizeW; }
-			set { m_strSizeW = value; }
+			set
+			{
+				if(value == null) throw new ArgumentNullException("value");
+				m_strSizeW = value;
+			}
 		}
 
 		private string m_strSizeH = string.Empty;
 		[XmlAttribute]
+		[DefaultValue("")]
 		public string Height
 		{
 			get { return m_strSizeH; }
-			set { m_strSizeH = value; }
+			set
+			{
+				if(value == null) throw new ArgumentNullException("value");
+				m_strSizeH = value;
+			}
 		}
 
 		public void SetControlRelativeValue(LayoutParameterEx lp, string strValue)
@@ -181,7 +202,7 @@ namespace KeePassLib.Translation
 
 	public sealed class KPControlCustomization : IComparable<KPControlCustomization>
 	{
-		private string m_strMemberName;
+		private string m_strMemberName = string.Empty;
 		/// <summary>
 		/// Member variable name of the control to be translated.
 		/// </summary>
@@ -189,7 +210,11 @@ namespace KeePassLib.Translation
 		public string Name
 		{
 			get { return m_strMemberName; }
-			set { m_strMemberName = value; }
+			set
+			{
+				if(value == null) throw new ArgumentNullException("value");
+				m_strMemberName = value;
+			}
 		}
 
 		private string m_strHash = string.Empty;
@@ -197,14 +222,23 @@ namespace KeePassLib.Translation
 		public string BaseHash
 		{
 			get { return m_strHash; }
-			set { m_strHash = value; }
+			set
+			{
+				if(value == null) throw new ArgumentNullException("value");
+				m_strHash = value;
+			}
 		}
 
 		private string m_strText = string.Empty;
+		[DefaultValue("")]
 		public string Text
 		{
 			get { return m_strText; }
-			set { m_strText = value; }
+			set
+			{
+				if(value == null) throw new ArgumentNullException("value");
+				m_strText = value;
+			}
 		}
 
 		private string m_strEngText = string.Empty;
diff --git a/KeePassLib/Translation/KPFormCustomization.cs b/KeePassLib/Translation/KPFormCustomization.cs
index 8b97c41..4281377 100644
--- a/KeePassLib/Translation/KPFormCustomization.cs
+++ b/KeePassLib/Translation/KPFormCustomization.cs
@@ -37,7 +37,11 @@ namespace KeePassLib.Translation
 		public string FullName
 		{
 			get { return m_strFQName; }
-			set { m_strFQName = value; }
+			set
+			{
+				if(value == null) throw new ArgumentNullException("value");
+				m_strFQName = value;
+			}
 		}
 
 		private KPControlCustomization m_ccWindow = new KPControlCustomization();
diff --git a/KeePassLib/Translation/KPStringTable.cs b/KeePassLib/Translation/KPStringTable.cs
index 8c89008..a8c77e2 100644
--- a/KeePassLib/Translation/KPStringTable.cs
+++ b/KeePassLib/Translation/KPStringTable.cs
@@ -33,7 +33,11 @@ namespace KeePassLib.Translation
 		public string Name
 		{
 			get { return m_strName; }
-			set { m_strName = value; }
+			set
+			{
+				if(value == null) throw new ArgumentNullException("value");
+				m_strName = value;
+			}
 		}
 
 		private List<KPStringTableItem> m_vItems = new List<KPStringTableItem>();
@@ -45,7 +49,6 @@ namespace KeePassLib.Translation
 			set
 			{
 				if(value == null) throw new ArgumentNullException("value");
-
 				m_vItems = value;
 			}
 		}
diff --git a/KeePassLib/Translation/KPTranslation.cs b/KeePassLib/Translation/KPTranslation.cs
index 2642393..88b5e0c 100644
--- a/KeePassLib/Translation/KPTranslation.cs
+++ b/KeePassLib/Translation/KPTranslation.cs
@@ -24,6 +24,7 @@ using System.IO;
 using System.Xml;
 using System.Xml.Serialization;
 using System.Windows.Forms;
+using System.ComponentModel;
 using System.Drawing;
 using System.Diagnostics;
 
@@ -76,6 +77,7 @@ namespace KeePassLib.Translation
 		}
 
 		private string m_strUnusedText = string.Empty;
+		[DefaultValue("")]
 		public string UnusedText
 		{
 			get { return m_strUnusedText; }
diff --git a/KeePassLib/Utility/StrUtil.cs b/KeePassLib/Utility/StrUtil.cs
index 91092f8..ac4a075 100644
--- a/KeePassLib/Utility/StrUtil.cs
+++ b/KeePassLib/Utility/StrUtil.cs
@@ -23,6 +23,7 @@ using System.Collections.Generic;
 using System.Diagnostics;
 using System.Text;
 using System.Drawing;
+// using System.Drawing.Imaging;
 using System.IO;
 using System.Text.RegularExpressions;
 using System.Security.Cryptography;
@@ -1040,5 +1041,85 @@ namespace KeePassLib.Utility
 			if(x.Length == y.Length) return 0;
 			return ((x.Length > y.Length) ? -1 : 1);
 		}
+
+		/* public static string ImageToDataUri(Image img)
+		{
+			if(img == null) { Debug.Assert(false); return string.Empty; }
+
+			MemoryStream ms = new MemoryStream();
+			img.Save(ms, ImageFormat.Png);
+
+			byte[] pbImage = ms.ToArray();
+			string strImage = Convert.ToBase64String(pbImage);
+
+			ms.Close();
+			return ("data:image/png;base64," + strImage);
+		} */
+
+		public static bool IsDataUri(string strUri)
+		{
+			if(strUri == null) { Debug.Assert(false); return false; }
+
+			return strUri.StartsWith("data:", StrUtil.CaseIgnoreCmp);
+		}
+
+		/// <summary>
+		/// Create a data URI (according to RFC 2397).
+		/// </summary>
+		/// <param name="pbData">Data to encode.</param>
+		/// <param name="strMimeType">Optional MIME type. If <c>null</c>,
+		/// an appropriate type is used.</param>
+		/// <returns>Data URI.</returns>
+		public static string DataToDataUri(byte[] pbData, string strMimeType)
+		{
+			if(pbData == null) throw new ArgumentNullException("pbData");
+
+			if(strMimeType == null) strMimeType = "application/octet-stream";
+
+#if !KeePassLibSD
+			return ("data:" + strMimeType + ";base64," + Convert.ToBase64String(
+				pbData, Base64FormattingOptions.None));
+#else
+			return ("data:" + strMimeType + ";base64," + Convert.ToBase64String(
+				pbData));
+#endif
+		}
+
+		/// <summary>
+		/// Convert a data URI (according to RFC 2397) to binary data.
+		/// </summary>
+		/// <param name="strDataUri">Data URI to decode.</param>
+		/// <returns>Decoded binary data.</returns>
+		public static byte[] DataUriToData(string strDataUri)
+		{
+			if(strDataUri == null) throw new ArgumentNullException("strDataUri");
+			if(!strDataUri.StartsWith("data:", StrUtil.CaseIgnoreCmp)) return null;
+
+			int iSep = strDataUri.IndexOf(',');
+			if(iSep < 0) return null;
+
+			string strDesc = strDataUri.Substring(5, iSep - 5);
+			bool bBase64 = strDesc.EndsWith(";base64", StrUtil.CaseIgnoreCmp);
+
+			string strData = strDataUri.Substring(iSep + 1);
+
+			if(bBase64) return Convert.FromBase64String(strData);
+
+			MemoryStream ms = new MemoryStream();
+
+			string[] v = strData.Split('%');
+			byte[] pb = Encoding.ASCII.GetBytes(v[0]);
+			ms.Write(pb, 0, pb.Length);
+			for(int i = 1; i < v.Length; ++i)
+			{
+				ms.WriteByte(Convert.ToByte(v[i].Substring(0, 2), 16));
+				pb = Encoding.ASCII.GetBytes(v[i].Substring(2));
+				ms.Write(pb, 0, pb.Length);
+			}
+
+			pb = ms.ToArray();
+			ms.Close();
+			return pb;
+		}
 	}
 }
diff --git a/KeePassLibSD/Properties/AssemblyInfo.cs b/KeePassLibSD/Properties/AssemblyInfo.cs
index 3e11e53..1e97eb4 100644
--- a/KeePassLibSD/Properties/AssemblyInfo.cs
+++ b/KeePassLibSD/Properties/AssemblyInfo.cs
@@ -38,4 +38,4 @@ using System.Runtime.InteropServices;
 [assembly: Guid("1d3c6f10-e10b-47be-a2f1-af2562d7d470")]
 
 // Assembly version information
-[assembly: AssemblyVersion("2.1.6.*")]
+[assembly: AssemblyVersion("2.1.7.*")]
diff --git a/ShInstUtil/ShInstUtil.cpp b/ShInstUtil/ShInstUtil.cpp
index 41ff93a..c926419 100644
--- a/ShInstUtil/ShInstUtil.cpp
+++ b/ShInstUtil/ShInstUtil.cpp
@@ -19,7 +19,10 @@
 
 #include "ShInstUtil.h"
 
+#pragma warning(push)
+#pragma warning(disable: 4996) // SCL warning
 #include <boost/algorithm/string/trim.hpp>
+#pragma warning(pop)
 
 static const std_string g_strNGenInstall = _T("ngen_install");
 static const std_string g_strNGenUninstall = _T("ngen_uninstall");
@@ -201,6 +204,8 @@ std_string FindNGen()
 	return strNGen;
 }
 
+#pragma warning(push)
+#pragma warning(disable: 4127) // Conditional expression is constant
 void FindNGenRec(const std_string& strPath, std_string& strNGenPath, FILETIME& ftCreation)
 {
 	const std_string strSearch = strPath + _T("*.*");
@@ -233,6 +238,7 @@ void FindNGenRec(const std_string& strPath, std_string& strNGenPath, FILETIME& f
 
 	FindClose(hFind);
 }
+#pragma warning(pop)
 
 void CheckDotNetInstalled()
 {
diff --git a/ShInstUtil/ShInstUtil.rc b/ShInstUtil/ShInstUtil.rc
index 795bd24..91a24c6 100644
--- a/ShInstUtil/ShInstUtil.rc
+++ b/ShInstUtil/ShInstUtil.rc
@@ -13,7 +13,7 @@
 #undef APSTUDIO_READONLY_SYMBOLS
 
 /////////////////////////////////////////////////////////////////////////////
-// Deutsch (Deutschland) resources
+// German (Germany) resources
 
 #if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_DEU)
 #ifdef _WIN32
@@ -46,12 +46,12 @@ END
 
 #endif    // APSTUDIO_INVOKED
 
-#endif    // Deutsch (Deutschland) resources
+#endif    // German (Germany) resources
 /////////////////////////////////////////////////////////////////////////////
 
 
 /////////////////////////////////////////////////////////////////////////////
-// Englisch (USA) resources
+// English (U.S.) resources
 
 #if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU)
 #ifdef _WIN32
@@ -65,8 +65,8 @@ LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US
 //
 
 VS_VERSION_INFO VERSIONINFO
- FILEVERSION 2,1,6,0
- PRODUCTVERSION 2,1,6,0
+ FILEVERSION 2,1,7,0
+ PRODUCTVERSION 2,1,7,0
  FILEFLAGSMASK 0x17L
 #ifdef _DEBUG
  FILEFLAGS 0x1L
@@ -83,12 +83,12 @@ BEGIN
         BEGIN
             VALUE "CompanyName", "Dominik Reichl"
             VALUE "FileDescription", "ShInstUtil - KeePass Helper Utility"
-            VALUE "FileVersion", "2, 1, 6, 0"
+            VALUE "FileVersion", "2, 1, 7, 0"
             VALUE "InternalName", "ShInstUtil"
             VALUE "LegalCopyright", "Copyright (c) 2007-2011 Dominik Reichl"
             VALUE "OriginalFilename", "ShInstUtil.exe"
             VALUE "ProductName", "ShInstUtil - KeePass Helper Utility"
-            VALUE "ProductVersion", "2, 1, 6, 0"
+            VALUE "ProductVersion", "2, 1, 7, 0"
         END
     END
     BLOCK "VarFileInfo"
@@ -97,7 +97,7 @@ BEGIN
     END
 END
 
-#endif    // Englisch (USA) resources
+#endif    // English (U.S.) resources
 /////////////////////////////////////////////////////////////////////////////
 
 
diff --git a/ShInstUtil/ShInstUtil.sln b/ShInstUtil/ShInstUtil.sln
index e83e7d7..81fd10a 100644
--- a/ShInstUtil/ShInstUtil.sln
+++ b/ShInstUtil/ShInstUtil.sln
@@ -1,6 +1,6 @@
 
-Microsoft Visual Studio Solution File, Format Version 9.00
-# Visual Studio 2005
+Microsoft Visual Studio Solution File, Format Version 10.00
+# Visual Studio 2008
 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ShInstUtil", "ShInstUtil.vcproj", "{C9FBA6FD-04AC-4B2F-8277-B852B8013DAE}"
 EndProject
 Global
diff --git a/ShInstUtil/ShInstUtil.vcproj b/ShInstUtil/ShInstUtil.vcproj
index 7771d41..95fb441 100644
--- a/ShInstUtil/ShInstUtil.vcproj
+++ b/ShInstUtil/ShInstUtil.vcproj
@@ -1,11 +1,12 @@
 <?xml version="1.0" encoding="Windows-1252"?>
 <VisualStudioProject
 	ProjectType="Visual C++"
-	Version="8,00"
+	Version="9,00"
 	Name="ShInstUtil"
 	ProjectGUID="{C9FBA6FD-04AC-4B2F-8277-B852B8013DAE}"
 	RootNamespace="ShInstUtil"
 	Keyword="Win32Proj"
+	TargetFrameworkVersion="131072"
 	>
 	<Platforms>
 		<Platform
@@ -46,7 +47,6 @@
 				RuntimeLibrary="1"
 				UsePrecompiledHeader="0"
 				WarningLevel="4"
-				Detect64BitPortabilityProblems="true"
 				DebugInformationFormat="4"
 			/>
 			<Tool
@@ -65,6 +65,8 @@
 				LinkIncremental="2"
 				GenerateDebugInformation="true"
 				SubSystem="2"
+				RandomizedBaseAddress="0"
+				DataExecutionPrevention="0"
 				TargetMachine="1"
 			/>
 			<Tool
@@ -87,9 +89,6 @@
 				Name="VCAppVerifierTool"
 			/>
 			<Tool
-				Name="VCWebDeploymentTool"
-			/>
-			<Tool
 				Name="VCPostBuildEventTool"
 			/>
 		</Configuration>
@@ -122,7 +121,6 @@
 				RuntimeLibrary="0"
 				UsePrecompiledHeader="0"
 				WarningLevel="4"
-				Detect64BitPortabilityProblems="true"
 				DebugInformationFormat="3"
 			/>
 			<Tool
@@ -143,6 +141,8 @@
 				SubSystem="2"
 				OptimizeReferences="2"
 				EnableCOMDATFolding="2"
+				RandomizedBaseAddress="0"
+				DataExecutionPrevention="0"
 				TargetMachine="1"
 			/>
 			<Tool
@@ -165,9 +165,6 @@
 				Name="VCAppVerifierTool"
 			/>
 			<Tool
-				Name="VCWebDeploymentTool"
-			/>
-			<Tool
 				Name="VCPostBuildEventTool"
 			/>
 		</Configuration>
diff --git a/Translation/DefaultText.xml b/Translation/DefaultText.xml
index 8d65257..9d930f2 100644
--- a/Translation/DefaultText.xml
+++ b/Translation/DefaultText.xml
@@ -145,6 +145,9 @@
 		<Data Name="AutoTypeMatchByTitle">
 			<Value>An entry matches if its title is contained in the target window title</Value>
 		</Data>
+		<Data Name="AutoTypeMatchByUrlInTitle">
+			<Value>An entry matches if its URL is contained in the target window title</Value>
+		</Data>
 		<Data Name="AutoTypeObfuscationHint">
 			<Value>Auto-type obfuscation may not work with all windows.</Value>
 		</Data>
@@ -199,6 +202,9 @@
 		<Data Name="Cancel">
 			<Value>Cancel</Value>
 		</Data>
+		<Data Name="CancelCmd">
+			<Value>&Cancel</Value>
+		</Data>
 		<Data Name="CannotMoveEntriesBcsGroup">
 			<Value>Cannot move entries because they aren't stored in the same group.</Value>
 		</Data>
@@ -310,6 +316,9 @@
 		<Data Name="CopyAll">
 			<Value>Copy All</Value>
 		</Data>
+		<Data Name="CopyLink">
+			<Value>Copy Link</Value>
+		</Data>
 		<Data Name="CopyOfItem">
 			<Value>Copy</Value>
 		</Data>
@@ -463,15 +472,12 @@
 		<Data Name="DisableSaveIfNotModified">
 			<Value>Disable 'Save' command (instead of graying it out) if the database hasn't been modified</Value>
 		</Data>
-		<Data Name="DiscardChanges">
-			<Value>Discard changes</Value>
+		<Data Name="DiscardChangesCmd">
+			<Value>&Discard changes</Value>
 		</Data>
 		<Data Name="DocumentationHint">
 			<Value>Please see the documentation for more details.</Value>
 		</Data>
-		<Data Name="DontDeleteCmd">
-			<Value>Do&n't delete</Value>
-		</Data>
 		<Data Name="DragDrop">
 			<Value>Drag&Drop</Value>
 		</Data>
@@ -751,11 +757,14 @@
 		<Data Name="Find">
 			<Value>Find</Value>
 		</Data>
+		<Data Name="FocusQuickFindOnRestore">
+			<Value>Focus quick search box when restoring from taskbar</Value>
+		</Data>
 		<Data Name="FocusQuickFindOnUntray">
 			<Value>Focus quick search box when restoring from tray</Value>
 		</Data>
-		<Data Name="FocusResultsAfterQuickFind">
-			<Value>Focus entry list after a successful quick search (toolbar)</Value>
+		<Data Name="FocusResultsAfterQuickSearch">
+			<Value>Focus entry list after a successful quick search</Value>
 		</Data>
 		<Data Name="Folder">
 			<Value>Folder</Value>
@@ -907,6 +916,9 @@
 		<Data Name="ImportMustReadQuestion">
 			<Value>Have you understood how the import process works and want to start it now?</Value>
 		</Data>
+		<Data Name="IncompatibleWithSorting">
+			<Value>incompatible with sorting</Value>
+		</Data>
 		<Data Name="InheritSettingFromParent">
 			<Value>Inherit setting from parent</Value>
 		</Data>
@@ -997,9 +1009,6 @@
 		<Data Name="KeyProvWithGuiOnSDHint">
 			<Value>If you want to use the selected key provider, you have to disable the secure desktop option in 'Tools' -> 'Options' -> tab 'Security'.</Value>
 		</Data>
-		<Data Name="KeystrokeSequence">
-			<Value>Keystroke Sequence</Value>
-		</Data>
 		<Data Name="LanguageSelected">
 			<Value>The selected language has been activated. KeePass must be restarted in order to load the language.</Value>
 		</Data>
@@ -1183,6 +1192,9 @@
 		<Data Name="OpeningDatabase">
 			<Value>Opening password database...</Value>
 		</Data>
+		<Data Name="OpenWith">
+			<Value>Open with {PARAM}</Value>
+		</Data>
 		<Data Name="OptimizeForScreenReader">
 			<Value>Optimize for screen reader (only enable if you're using a screen reader)</Value>
 		</Data>
@@ -1195,6 +1207,12 @@
 		<Data Name="OtherPlaceholders">
 			<Value>Other Placeholders</Value>
 		</Data>
+		<Data Name="OverridesBuiltIn">
+			<Value>Built-In Overrides</Value>
+		</Data>
+		<Data Name="OverridesCustom">
+			<Value>Custom Overrides</Value>
+		</Data>
 		<Data Name="Overwrite">
 			<Value>Overwrite</Value>
 		</Data>
@@ -1318,6 +1336,9 @@
 		<Data Name="PolicyPrintDesc">
 			<Value>Allow printing password entry lists.</Value>
 		</Data>
+		<Data Name="PolicyPrintNoKeyDesc">
+			<Value>Do not require entering current master key before printing.</Value>
+		</Data>
 		<Data Name="PolicyRequiredFlag">
 			<Value>The following policy flag is required</Value>
 		</Data>
@@ -1333,14 +1354,17 @@
 		<Data Name="PrintDesc">
 			<Value>Print password entries.</Value>
 		</Data>
-		<Data Name="QuickSearch">
-			<Value>Quick Search</Value>
+		<Data Name="QuickSearchExclExpired">
+			<Value>Exclude expired entries in quick searches</Value>
 		</Data>
-		<Data Name="QuickSearchExcludeExpired">
-			<Value>Exclude expired entries in quick searches (toolbar)</Value>
+		<Data Name="QuickSearchInPwFields">
+			<Value>Search for passwords in quick searches</Value>
 		</Data>
-		<Data Name="QuickSearchInPasswords">
-			<Value>Search for passwords in quick searches (toolbar)</Value>
+		<Data Name="QuickSearchDerefData">
+			<Value>Resolve field references in quick searches</Value>
+		</Data>
+		<Data Name="QuickSearchTb">
+			<Value>Quick Search (Toolbar)</Value>
 		</Data>
 		<Data Name="RandomMacAddress">
 			<Value>Random MAC Address</Value>
@@ -1417,6 +1441,9 @@
 		<Data Name="SearchGroupName">
 			<Value>Search Results</Value>
 		</Data>
+		<Data Name="SearchingOp">
+			<Value>Searching</Value>
+		</Data>
 		<Data Name="SearchItemsFoundSmall">
 			<Value>entries found.</Value>
 		</Data>
@@ -1468,9 +1495,18 @@
 		<Data Name="SelfTestFailed">
 			<Value>One or more of the KeePass self-tests failed.</Value>
 		</Data>
+		<Data Name="Sequence">
+			<Value>Sequence</Value>
+		</Data>
 		<Data Name="ShowAllEntries">
 			<Value>Show All Entries</Value>
 		</Data>
+		<Data Name="ShowDerefData">
+			<Value>Show dereferenced data</Value>
+		</Data>
+		<Data Name="ShowDerefDataAsync">
+			<Value>Show dereferenced data asynchronously</Value>
+		</Data>
 		<Data Name="ShowEntries">
 			<Value>Show Entries</Value>
 		</Data>
@@ -1489,6 +1525,9 @@
 		<Data Name="Size">
 			<Value>Size</Value>
 		</Data>
+		<Data Name="Slow">
+			<Value>slow</Value>
+		</Data>
 		<Data Name="SoonToExpireEntries">
 			<Value>Expired Entries and Entries That Will Expire Soon</Value>
 		</Data>
diff --git a/Translation/TrlUtil/FormTrlMgr.cs b/Translation/TrlUtil/FormTrlMgr.cs
index 1fc0b4c..0aacb56 100644
--- a/Translation/TrlUtil/FormTrlMgr.cs
+++ b/Translation/TrlUtil/FormTrlMgr.cs
@@ -44,12 +44,14 @@ namespace TrlUtil
 			List<KPFormCustomization> l = new List<KPFormCustomization>();
 
 			AddForm(l, new AboutForm());
+			AddForm(l, new AutoTypeCtxForm());
 			AddForm(l, new CharPickerForm());
 			AddForm(l, new ColumnsForm());
 			AddForm(l, new DatabaseOperationsForm());
 			AddForm(l, new DatabaseSettingsForm());
 			AddForm(l, new DataEditorForm());
 			AddForm(l, new DataViewerForm());
+			AddForm(l, new DuplicationForm());
 			AddForm(l, new EcasActionForm());
 			AddForm(l, new EcasConditionForm());
 			AddForm(l, new EcasEventForm());
@@ -134,6 +136,7 @@ namespace TrlUtil
 			else if(t == typeof(RichTextBox)) bAdd = true;
 			else if(t == typeof(KeePass.UI.CustomRichTextBoxEx)) bAdd = true;
 			else if(t == typeof(ComboBox)) bAdd = true;
+			else if(t == typeof(KeePass.UI.ImageComboBoxEx)) bAdd = true;
 			else if(t == typeof(Label)) bAdd = true;
 			else if(t == typeof(ListView)) bAdd = true;
 			else if(t == typeof(CustomListViewEx)) bAdd = true;
diff --git a/Translation/TrlUtil/Properties/AssemblyInfo.cs b/Translation/TrlUtil/Properties/AssemblyInfo.cs
index a70aae0..bc18051 100644
--- a/Translation/TrlUtil/Properties/AssemblyInfo.cs
+++ b/Translation/TrlUtil/Properties/AssemblyInfo.cs
@@ -38,5 +38,5 @@ using System.Runtime.InteropServices;
 [assembly: Guid("39aa6f93-a1c9-497f-bad2-cc42a61d5710")]
 
 // Assembly version information
-[assembly: AssemblyVersion("2.1.6.0")]
-[assembly: AssemblyFileVersion("2.1.6.0")]
+[assembly: AssemblyVersion("2.1.7.0")]
+[assembly: AssemblyFileVersion("2.1.7.0")]

-- 
keepass2



More information about the Pkg-cli-apps-commits mailing list