From fc584813bb78f3d9088d4823ce4db4e1d2488df6 Mon Sep 17 00:00:00 2001 From: markpollack Date: Tue, 17 Jun 2008 02:13:28 +0000 Subject: [PATCH] fixes for daily build target misc updates to ref documentation use signed NNS assembly based on spring.net key sync vs.net 2003 solution --- Spring.Net.2003.sln | 12 + Spring.build | 31 +- doc/reference/src/index.xml | 6 +- .../src/templated/windows-service.xml | 441 ---------------- doc/reference/src/transaction.xml | 2 +- doc/reference/src/windows-service.xml | 470 +----------------- doc/reference/src/xsd-configuration.xml | 148 +++++- .../Examples/Pool/Grep.cs | 140 ++++++ .../Examples/Pool/PooledQueuedExecutor.cs | 190 +++++++ .../Spring.Examples.Pool.csproj | 120 +++++ .../Spring.Examples.Pool.sln | 29 ++ lib/Net/2.0/Apache.NMS.MSMQ.dll | Bin 36864 -> 36864 bytes lib/Net/2.0/Apache.NMS.dll | Bin 32768 -> 19456 bytes ...a.NHibernate.Integration.Tests.2003.csproj | 20 +- .../Spring.Data.Tests.2003.csproj | 15 + .../Spring.Web.Tests.2003.csproj | 2 +- 16 files changed, 664 insertions(+), 962 deletions(-) delete mode 100644 doc/reference/src/templated/windows-service.xml create mode 100644 examples/Spring/Spring.Examples.Pool/Examples/Pool/Grep.cs create mode 100644 examples/Spring/Spring.Examples.Pool/Examples/Pool/PooledQueuedExecutor.cs create mode 100644 examples/Spring/Spring.Examples.Pool/Spring.Examples.Pool.csproj create mode 100644 examples/Spring/Spring.Examples.Pool/Spring.Examples.Pool.sln diff --git a/Spring.Net.2003.sln b/Spring.Net.2003.sln index 63d7a2c3..a58ecbe4 100644 --- a/Spring.Net.2003.sln +++ b/Spring.Net.2003.sln @@ -67,6 +67,10 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Spring.Data.NHibernate12.20 ProjectSection(ProjectDependencies) = postProject EndProjectSection EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Spring.Messaging.Nms.2003", "src\Spring\Spring.Messaging.Nms\Spring.Messaging.Nms.2003.csproj", "{C17B27C2-4343-45BA-9A21-73C3CEC19BAD}" + ProjectSection(ProjectDependencies) = postProject + EndProjectSection +EndProject Global GlobalSection(SolutionConfiguration) = preSolution Debug = Debug @@ -213,6 +217,14 @@ Global {2E12AE3E-5690-46A5-9F89-80F1D3004ADB}.Release.Build.0 = Release|.NET {2E12AE3E-5690-46A5-9F89-80F1D3004ADB}.Release-1.1.ActiveCfg = Release|.NET {2E12AE3E-5690-46A5-9F89-80F1D3004ADB}.Release-1.1.Build.0 = Release|.NET + {C17B27C2-4343-45BA-9A21-73C3CEC19BAD}.Debug.ActiveCfg = Debug|.NET + {C17B27C2-4343-45BA-9A21-73C3CEC19BAD}.Debug.Build.0 = Debug|.NET + {C17B27C2-4343-45BA-9A21-73C3CEC19BAD}.Debug-1.1.ActiveCfg = Debug|.NET + {C17B27C2-4343-45BA-9A21-73C3CEC19BAD}.Debug-1.1.Build.0 = Debug|.NET + {C17B27C2-4343-45BA-9A21-73C3CEC19BAD}.Release.ActiveCfg = Release|.NET + {C17B27C2-4343-45BA-9A21-73C3CEC19BAD}.Release.Build.0 = Release|.NET + {C17B27C2-4343-45BA-9A21-73C3CEC19BAD}.Release-1.1.ActiveCfg = Release|.NET + {C17B27C2-4343-45BA-9A21-73C3CEC19BAD}.Release-1.1.Build.0 = Release|.NET EndGlobalSection GlobalSection(SolutionItems) = postSolution doc\NamespaceSummary.xml = doc\NamespaceSummary.xml diff --git a/Spring.build b/Spring.build index 02956fd2..68112c1f 100644 --- a/Spring.build +++ b/Spring.build @@ -199,6 +199,7 @@ + @@ -309,7 +310,7 @@ - + @@ -324,7 +325,7 @@ - + @@ -336,6 +337,7 @@ + @@ -343,6 +345,7 @@ depends="set-net-1.1-runtime-configuration, check-spring-basedir, clean-current-bin-dir, TestInit"> + @@ -350,6 +353,7 @@ depends="set-net-2.0-runtime-configuration, check-spring-basedir, clean-current-bin-dir, TestInit"> + @@ -644,10 +648,8 @@ - - + - @@ -695,18 +697,6 @@ - - @@ -778,7 +768,6 @@ - @@ -870,6 +859,8 @@ + + @@ -947,6 +938,8 @@ + + @@ -1016,7 +1009,7 @@ file="src/Spring/Spring.Services/Remoting/Config/spring-remoting-1.1.xsd"/> + file="build-support/install-schema.build"/> diff --git a/doc/reference/src/index.xml b/doc/reference/src/index.xml index fdf2dfe5..8b903cd6 100644 --- a/doc/reference/src/index.xml +++ b/doc/reference/src/index.xml @@ -54,7 +54,7 @@ The Spring.NET Framework Reference Documentation Version 1.1.2 - Last Updated May 6, 2008 + Last Updated June 12, 2008 Mark @@ -288,6 +288,7 @@ &services; &webservices; + VS.NET Integration diff --git a/doc/reference/src/templated/windows-service.xml b/doc/reference/src/templated/windows-service.xml deleted file mode 100644 index 6830dd73..00000000 --- a/doc/reference/src/templated/windows-service.xml +++ /dev/null @@ -1,441 +0,0 @@ -<%@ CodeTemplate %> -<%@ Assembly Name="System.Web" %> -<%@ Import Namespace="System.IO" %> -<%@ Import Namespace="System.Xml" %> -<%@ Import Namespace="System.Web" %> -<%@ Import Namespace="System.Text" %> - -<%@ Assembly Name="AgileDocs.Core" %> -<%@ Import Namespace="AgileDocs.Core" %> - - - - - - - Windows Services - - - Remarks - - This is functionality that will be included after the - 1.0 release. If you want to use these features please get the - code from CVS - (instructions) or from the download section of the Spring.NET website that contains an - .zip with the full CVS tree. - In addition to this documentation - you can refer to the example program located at - examples\Spring\Spring.Examples.WindowsService - to better understand the package. Please check the Spring.NET - website - for the latest updates to this document. - - - - Introduction - - Developers usually create Windows Services using the - Visual Studio .NET wizard. While not difficult to do, this - procedure is repetative and does not encourage separation between - infrastructure code (windows service) and application code. This is - generally considered a "bad thing" but you can certainly disagree. - - - As Spring.NET can provide an explicitly managed - initialize/destroy lifecycle for singleton objects, there is - a natural synergy with the lifecycle of a Windows service. - As such, it could be very convenient to expose a Spring application - context as a Windows service. Starting and stopping the service corresponds - to creating and destroying an application context and its - contained objects. This approach provides a high level means to - declare what objects are created and destroyed when developing - a Windows service. - - - To do that, Spring.NET requires the installation of one physical - service able to run as services as many applications as you want - each a - logical independent service in their own application domain. - By default, the deployment and updating of the service can also - be done by copying the relevant executables to a special directory. - - - The executable that at present provides these features is the - Spring.Services.WindowsService.Process.exe - assembly. It makes heavy use of classes and interfaces definde in - the Spring.Services.WindowsService.Common.dll - assembly. You should reference the common assembly it if you want to - follow the advice on customization contained in the following sections - - - The benefits of this approach, a part from those given by separating - infrastructure code and application code (a field where Spring.NET - tries hard to succeed) is that you can think about installing a new - service at client site by simply dropping a new application assembly - in a remote directory. - - - - - The <literal>Spring.Services.WindowsService.Process.exe</literal> application - - Installing - - The installation can be done in two ways, using the .NET SDK - installutil.exe tool or using the more mundane - Spring.Services.WindowsService.Installer.exe; - while the former is the standard, the latter is probably - more flexible. It allows you to customize the name/display name of the - service and has the ability to install multiple times the same assembly - with different names. This can be useful in a - number of scenarios, especially where you don't like, for some - reasons, to run several different logical services under the - same physical windows service. - - - Be aware of the fact that the service will be installed as - running with the system account (installing with a specific - user account seems a bit buggy on Windows XP) - - - That said, while installutil - - is documented on its own , - the command line for - Spring.Services.WindowsService.Installer.exe - is as follow: - Spring.Services.WindowsService.Installer.exe - -usage: - install service-exe-path service-display-name service-name - uninstall service-name [i|u] service-exe-path service-display-name service-name - for example, to install, you can invoke it with the following: - ... install Spring.Services.WindowsService.Process.exe "Spring.Service Support" spring-service - and to uninstall it: - ... uninstall spring-service - - - - Configuration - - The standard .NET .config file - can be used to tune some parameters of - Spring.Services.WindowsService.Process.exe, - (including log4net settings, for which it is recomended to consult - the log4net documentation). - - - This file also define the context run by this process; here the file in its current beauty: - <%= XmlExample("src/Spring/Spring.Services/App.config", "code") %> - - - As you see, the context is defined in another file: let's review the objects it defines. - - - Firstly, it is worth notice that in order to 'localize' the service (i.e. to know where it is installed to use that directory as - base for the deploy dir as in the above file) you should define an object like this: the name is not - very important, it is important that it is an IObjectFactoryPostProcessor and so will be - automatically applied to this application context: - <%= XmlExample("src/Spring/Spring.Services/WindowsService/Process/service-process-definition.xml", "code/localizer") %> - - - In that object definition you can customize the prefix for the following string - <%= CsExample("src/Spring/Spring.Services/WindowsService/Common/Localizer.cs", "code/process.format") %> - but you usually won't need it; the default value is - <%= CsExample("src/Spring/Spring.Services/WindowsService/Common/Localizer.cs", "code/localizer.def.prefix") %> - - - The sole important object defined by this context, i.e. the main object run by the service. - The thing you can (and should) configure is the path to the folder you will use as the deploy location; - the current definition, to avoid the need for a fully qualified path (e.g.: c:\spring\services) uses - the properties made available by the localizer above: - <%= XmlExample("src/Spring/Spring.Services/WindowsService/Process/service-process-definition.xml", "code/service") %> - - - The above object is then easily remoted using spring remoting utilities (please notice you should tune the remoting configuration - listed in the standard .NET .config file, listed above): - <%= XmlExample("src/Spring/Spring.Services/WindowsService/Process/service-process-definition.xml", "code/remoted.service") %> - - - - - - Running an application context as a windows service - - If you package an application using the layout and - conventions described here, you'll be able to run an - application context as a Windows Service. - The conventions used are modeled after those used by ASP.NET - and are very easy to follow. - - - As already said, you'll have a Spring.NET application context running in - a dedicated AppDomain hosted in a process running - as a windows service: that process is able to run many application contexts - simultaneously. - - A complete application runable as service consists of a - directory containing: - - - - The .NET configuration file - service.config: - this file should define your application context. - Moreover this files will be used - by the CLR to configure the application domain - your application will run in, exactly as you expect. - This file has the same role of ASP.NET Web.config - file. - - - - - Optional: an xml context file (watcher.xml) - defining the watcher for your application. - The watcher controls the automatic redeployment of the - service and is discussed more in the following section. - - - - Recomended: along the lines of ASP.NET convention, a bin - subdirectory containing all - the assemblies your application needs; you can of course put - your assemblies in the same directory where you put - service.config but this is not encouraged ... - - - - - - <literal>service.config</literal> - - This is the standard .NET configuration file for the - AppDomain that will host your application. It is - semantically equivalent to the ASP.NET Web.config - file. - - - log4net users please notice that (as - of 1.2 beta 9) file appenders, when dealing with a relative - file name, assume it is relative to the application - domain code base. If you use log4net, it is very handy with the mechanics used by - Spring Windows Service as every log file you will specify will - be relative the directory containing the service application. - - - - - This file should also define your application context. When the - service is started and stopped, the corresponding lifecycle methods - are called on all the singletons defined. Of course, singletons are - automatically instantiated by the application context when the - service starts. For more information on lifecycles in Spring.NET see - - Here an example taken from the tests: - <%= XmlExample("test/Spring/Spring.Services.Tests/Data/Spring/WindowsService/Echo/service.config", "code") %> - - - In this case the context is (again!) defined in another file (author's personal taste...) and the only 'service' is the - echo object (there is also a PropertyPlaceholderConfigurer just to make the example - more realistic): - <%= XmlExample("test/Spring/Spring.Services.Tests/Data/Spring/WindowsService/Echo/service.xml", "code") %> - - - Let the application know where it is - - There are some properties you may need at runtime, when your services - will run, and you cannot know in advance. Hopefully, your xml - definition file will allow to find the information it needs using some - predefined variables you can use inside the service definition file - with the standard - NAnt style ${property name} syntax. - These properies are: - - - spring.services.application.fullpath - that will be replaced with the full path of the application's - AppDomain.BaseDirectory, i.e., where your - application has been deployed; - - - spring.services.application.name that - will be replaced with the name of the subdirectory where the - application has been deployed. Each application is deployed in - its own directory, of course; - - - - - These properties are accessible only if one defines a localizer in the - context like this (the localizer is a special IObjectFactoryPostProcessor: - <%= XmlExample("test/Spring/Spring.Services.Tests/Data/Spring/WindowsService/Simple/service.xml", "code/localizer") %> - - - As you can see above, one can easily change the prefix used by that localizer and then write someting like: - <%= XmlExample("test/Spring/Spring.Services.Tests/Data/Spring/WindowsService/Simple/service.xml", "code/simple") %> - - - - - - <literal>watcher.xml</literal> - optional - - This file allows you to optionally define a watcher for your application - that can automatically redeploy it when needed. - - - The important thing to notice is that you can define your own - application watcher, named watcher. Here it is used - a watcher that listen for changes on the filesystem, configured to - listen for some changes and to ignore others. - - - You can provide your own implementation defining an object named - watcher that implements - Spring.Services.WindowsService.Common.Deploy.IApplicationWatcher: - <%= CsExample("src/Spring/Spring.Services/WindowsService/Common/Deploy/IApplicationWatcher.cs", "code/interface") %> - - - Please notice that this interface is currently a movable target and - will probably change before the first official release (this will probably - affect also the way a watcher will know about the application it should - monitor, as shown in a few lines). - - A tipical example of this file is give here: - <%= XmlExample("test/Spring/Spring.Services.Tests/Data/Spring/WindowsService/Cassini/watcher.xml", "code") %> - - - As you can see, if you need it, you can reference the - Spring.Services.WindowsService.Common.IApplication - object that your watcher should watch using the name - .injected.application. - - - - <literal>bin</literal> directory - optional - - This is, by default, the folder where your assemblies are placed - in the same way they are in an ASP.NET application. - - - Putting assemblies there is more a convention and maybe a good - practice (they are isolated from other artifacts, but maybe you will - prefer to use another directory (modify the - service.config file accordingly) or the application - directory directly (= bin parent). - - - Be aware of the fact that the process in which your application will - run will have its own PATH environmental variable. As such - don't expect to be successfull using dlls imported - with [DllImport] if they are not in the system PATH of the - hosting machine: while it is well known that the CLR fusion - algorithm will not consider the PATH variable, you may be biten - by assemblies using non-system dlls (SQLite and Firebird ADO.NET - providers are good examples). - - Reiterating, one can put assemblies in another directory - under the application directory tree, and write - the .NET configuration file (service.config) - accordingly: .NET probing algorithm is always in place. - - - Please notice that it is not required that - your application uses or include any of the Spring.NET assemblies: - any object in any assembly, given it has lifecycle methods, can - be run as a service: non invasive infrastructure support courtesy - of Spring.NET! - - - - - - Customizing or extending - - It should be said that support for windows service has been initially - developed with a clear but limited set of 'extension points' in mind, - mainly related to the way you can deploy your services: - deploy location (filesystem, zip archives, mailbox, urls, ...), - (auto-)updating features, and so on. - - - To better understand the following discussion, the following figure - depicts some of the inner details of - Spring.Services.WindowsService.Process.exe - at run-time: - - - - - - Spring.Services.WindowsService.Process.exe run-time details - - - - - The <literal>.config</literal> file - - - The executable Spring.Services.WindowsService.Process.exe - is somewhat configured by the corresponding - .config file. - Please notice that this file is the most important extension point - for windows service support, and it will probably be made more powerful - and flexible in the future. - - - For applications deployed in the standard way (i.e. on the filesystem - as explained above) the updating features are configured by the - watcher.xml file, if present, - as already seen. - - - There should be however, other ways to deploy your applications, - maybe just as zip files dropped somewhere on the web or sent via - e-mail. - - - For these scenarios, your deploy location will be something that - implements - Spring.Services.WindowsService.Common.Deploy.IDeployLocation. - - Please notice that, while questionable, it actually entends - IDisposable this has been done - as it is possible that a deploy location holds resources that should be - released, for example network connections, lock files or the like: - - <%= CsExample("src/Spring/Spring.Services/WindowsService/Common/Deploy/IDeployLocation.cs", "code/interface") %> - <%= CsExample("src/Spring/Spring.Services/WindowsService/Common/Deploy/IDeployEventSource.cs", "code/interface") %> - - - - diff --git a/doc/reference/src/transaction.xml b/doc/reference/src/transaction.xml index 1d567dd3..498d4151 100644 --- a/doc/reference/src/transaction.xml +++ b/doc/reference/src/transaction.xml @@ -917,7 +917,7 @@ mgr.DeleteTwoTestObjects("Jack", "Jill"); <objects xmlns="http://www.springframework.net" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" - xmlns:tx="http://www.springframework.net/schema/tx" + xmlns:tx="http://www.springframework.net/tx" xmlns:db="http://www.springframework.net/database" xsi:schemaLocation="http://www.springframework.net http://www.springframework.net/schema/objects/spring-objects.xsd http://www.springframework.net/schema/tx http://www.springframework.net/schema/tx/spring-tx-1.1.xsd" diff --git a/doc/reference/src/windows-service.xml b/doc/reference/src/windows-service.xml index 470b2acf..682e0066 100644 --- a/doc/reference/src/windows-service.xml +++ b/doc/reference/src/windows-service.xml @@ -172,472 +172,4 @@ usage: base for the deploy dir as in the above file) you should define an object like this: the name is not very important, it is important that it is an IObjectFactoryPostProcessor and so will be automatically applied to this application context: - -<!-- provides access to the ${spring.services.process.base.dir} property --> -<object - name="localizer" - type="Spring.Services.WindowsService.Common.Localizer+ForProcess, Spring.Services.WindowsService.Common"> - <!-- change this to access the property with another prefix, for example ${foo.process.base.dir} - <property name="prefix" value="foo"/> - --> -</object> - - - In that object definition you can customize the prefix for the following string - -public static readonly string SpringServicesProcessBaseDirFormat = "{0}.process.base.dir"; - but you usually won't need it; the default value is - -public static readonly string DefaultPrefix = "spring.services"; - - - The sole important object defined by this context, i.e. the main object run by the service. - The thing you can (and should) configure is the path to the folder you will use as the deploy location; - the current definition, to avoid the need for a fully qualified path (e.g.: c:\spring\services) uses - the properties made available by the localizer above: - -<object - name="service" - type="Spring.Services.WindowsService.Common.DefaultService, Spring.Services.WindowsService.Common" - init-method="Start" - destroy-method="Stop"> - <property name="DeployPath" value="${spring.services.process.base.dir}/deploy"/> -</object> - - - The above object is then easily remoted using spring remoting utilities (please notice you should tune the remoting configuration - listed in the standard .NET .config file, listed above): - -<object name="remoted.service" type="Spring.Remoting.SaoExporter, Spring.Services"> - <property name="TargetName" value="service"/> - <property name="ServiceName" value="SpringWindowsService.rem"/> -</object> - - - - - - Running an application context as a windows service - - If you package an application using the layout and - conventions described here, you'll be able to run an - application context as a Windows Service. - The conventions used are modeled after those used by ASP.NET - and are very easy to follow. - - - As already said, you'll have a Spring.NET application context running in - a dedicated AppDomain hosted in a process running - as a windows service: that process is able to run many application contexts - simultaneously. - - A complete application runable as service consists of a - directory containing: - - - - The .NET configuration file - service.config: - this file should define your application context. - Moreover this files will be used - by the CLR to configure the application domain - your application will run in, exactly as you expect. - This file has the same role of ASP.NET Web.config - file. - - - - - Optional: an xml context file (watcher.xml) - defining the watcher for your application. - The watcher controls the automatic redeployment of the - service and is discussed more in the following section. - - - - Recomended: along the lines of ASP.NET convention, a bin - subdirectory containing all - the assemblies your application needs; you can of course put - your assemblies in the same directory where you put - service.config but this is not encouraged ... - - - - - - <literal>service.config</literal> - - This is the standard .NET configuration file for the - AppDomain that will host your application. It is - semantically equivalent to the ASP.NET Web.config - file. - - - log4net users please notice that (as - of 1.2 beta 9) file appenders, when dealing with a relative - file name, assume it is relative to the application - domain code base. If you use log4net, it is very handy with the mechanics used by - Spring Windows Service as every log file you will specify will - be relative the directory containing the service application. - - - - - This file should also define your application context. When the - service is started and stopped, the corresponding lifecycle methods - are called on all the singletons defined. Of course, singletons are - automatically instantiated by the application context when the - service starts. For more information on lifecycles in Spring.NET see - - Here an example taken from the tests: - -<configuration> - - <configSections> - <sectionGroup name="spring"> - <section name="context" type="Spring.Context.Support.ContextHandler, Spring.Core" /> - <section name="objects" type="Spring.Context.Support.DefaultSectionHandler, Spring.Core" /> - </sectionGroup> - </configSections> - - <appSettings> - <add key="port" value="10"/> - </appSettings> - - <spring> - <context type="Spring.Context.Support.XmlApplicationContext, Spring.Core"> - <resource uri="file://~/service.xml" /> - </context> - </spring> - -</configuration> - - - In this case the context is (again!) defined in another file (author's personal taste...) and the only 'service' is the - echo object (there is also a PropertyPlaceholderConfigurer just to make the example - more realistic): - -<objects xmlns="http://www.springframework.net" - xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" - xsi:schemaLocation="http://www.springframework.net http://www.springframework.net/xsd/spring-objects.xsd"> - - <object name="echo" - type="Spring.Services.WindowsService.Samples.Echo, Spring.Services.WindowsService.Tests" - init-method="Start" destroy-method="Stop"> - <property name="port"><value>${port}</value></property> - </object> - - <object id="configurer" type="Spring.Objects.Factory.Config.PropertyPlaceholderConfigurer, Spring.Core"> - <property name="locations"> - <list> - <value>file://~/service.config</value> - </list> - </property> - <property name="configSections"> - <list> - <value>appSettings</value> - </list> - </property> - </object> - -</objects> - - - Let the application know where it is - - There are some properties you may need at runtime, when your services - will run, and you cannot know in advance. Hopefully, your xml - definition file will allow to find the information it needs using some - predefined variables you can use inside the service definition file - with the standard - NAnt style ${property name} syntax. - These properies are: - - - spring.services.application.fullpath - that will be replaced with the full path of the application's - AppDomain.BaseDirectory, i.e., where your - application has been deployed; - - - spring.services.application.name that - will be replaced with the name of the subdirectory where the - application has been deployed. Each application is deployed in - its own directory, of course; - - - - - These properties are accessible only if one defines a localizer in the - context like this (the localizer is a special IObjectFactoryPostProcessor: - -<!-- provides access to the ${spring.services.application.*} properties --> -<object - name="localizer" - type="Spring.Services.WindowsService.Common.Localizer+ForApplication, Spring.Services.WindowsService.Common"> - <!-- change this to access the property with another prefix, for example ${foo.application.base.dir} - --> - <property name="prefix" value="myPrefix"/> -</object> - - - As you can see above, one can easily change the prefix used by that localizer and then write someting like: - -<object name="simple" - type="Spring.Services.WindowsService.Samples.Simple, Spring.Services.WindowsService.Tests" - init-method="Start" destroy-method="Stop"> - <constructor-arg index="0" value="${myPrefix.application.name},${myPrefix.application.fullPath}"/> - <property name="AppName"> - <value>${myPrefix.application.name}</value> - </property> - <property name="AppFullPath"> - <value>${myPrefix.application.fullpath}</value> - </property> -</object> - - - - - - <literal>watcher.xml</literal> - optional - - This file allows you to optionally define a watcher for your application - that can automatically redeploy it when needed. - - - The important thing to notice is that you can define your own - application watcher, named watcher. Here it is used - a watcher that listen for changes on the filesystem, configured to - listen for some changes and to ignore others. - - - You can provide your own implementation defining an object named - watcher that implements - Spring.Services.WindowsService.Common.Deploy.IApplicationWatcher: - -/// <summary> -Interface defining the contract for an application watcher. -<p>An application watcher is responsible to dispatch an -<see cref="IApplicationWatcherFactory">event</see> whenever it thinks the -application has been updated.</p> -<p>Usually it should not raise other kind of events -as they are usually raised by the <see cref="FileSystemApplicationWatcher"/> -that creates the watcher itself</p> -</summary> -<remarks>Usually instances of this interface need to be disposed</remarks> -<seealso cref="DeployEventArgs"/> -<seealso cref="IDeployLocation"/> -<seealso cref="DeployEventType.ApplicationUpdated"/> -<seealso cref="DeployEventAggregator"/> -<seealso cref="IDeployLocation"/> -<seealso cref="DeployEventType"/> -public interface IApplicationWatcher : IDisposable -{ - /// <summary> - /// The watched application - /// </summary> - IApplication Application {get; } - - /// <summary> - /// Start to watch the application, using the given dispatcher to - /// dispatch deply events - /// </summary> - /// <param name="dispatcher">the dispatcher used to raise deploy events</param> - void StartWatching (IDeployEventDispatcher dispatcher); - - /// <summary> - /// Stop to watch the application. - /// </summary> - void StopWatching (); - - /// <summary> - /// If physical events watched by this watcher should be filtered, this methods - /// will allow to set filters that allows and disallows the event to be raised - /// by the watcher. - /// </summary> - /// <param name="allows">the list of allowing filters</param> - /// <param name="disallows">the list of disallowing filters</param> - /// <seealso cref="FilteringSupport"/> - /// <seealso cref="RegularExpressionFilter"/> - void SetFilters (IList allows, IList disallows); -} - - - Please notice that this interface is currently a movable target and - will probably change before the first official release (this will probably - affect also the way a watcher will know about the application it should - monitor, as shown in a few lines). - - A tipical example of this file is give here: - -<objects> - - <object name='watcher' - type='Spring.Services.WindowsService.Common.Deploy.FileSystem.FileSystemApplicationWatcher'> - <!-- - we can get access to the IApplication we are asked to monitor - using a reference like the following - --> - <constructor-arg ref='.injected.application'/> - - <!-- sometimes the windows OS will decide to not give you the same case you see in explorer: - in fact one should consider this OS case-insensitive with regard to file names ... - The following property, true by default can however be tuned - <property name="ignoreCase" value="false"/> - --> - - <property name="includes"> - <list> - <value>wwwroot/bin/*.*</value> - <value>service.config</value> - <value>service.xml</value> - </list> - </property> - - <!-- - <property name="excludes"> - <list> - <value>Db/**/*.*</value> - <value>Jobs</value> - <value>Jobs</value> - <value>**/*.log</value> - </list> - </property> - --> - - </object> - -</objects> - - - As you can see, if you need it, you can reference the - Spring.Services.WindowsService.Common.IApplication - object that your watcher should watch using the name - .injected.application. - - - - <literal>bin</literal> directory - optional - - This is, by default, the folder where your assemblies are placed - in the same way they are in an ASP.NET application. - - - Putting assemblies there is more a convention and maybe a good - practice (they are isolated from other artifacts, but maybe you will - prefer to use another directory (modify the - service.config file accordingly) or the application - directory directly (= bin parent). - - - Be aware of the fact that the process in which your application will - run will have its own PATH environmental variable. As such - don't expect to be successfull using dlls imported - with [DllImport] if they are not in the system PATH of the - hosting machine: while it is well known that the CLR fusion - algorithm will not consider the PATH variable, you may be biten - by assemblies using non-system dlls (SQLite and Firebird ADO.NET - providers are good examples). - - Reiterating, one can put assemblies in another directory - under the application directory tree, and write - the .NET configuration file (service.config) - accordingly: .NET probing algorithm is always in place. - - - Please notice that it is not required that - your application uses or include any of the Spring.NET assemblies: - any object in any assembly, given it has lifecycle methods, can - be run as a service: non invasive infrastructure support courtesy - of Spring.NET! - - - - - - Customizing or extending - - It should be said that support for windows service has been initially - developed with a clear but limited set of 'extension points' in mind, - mainly related to the way you can deploy your services: - deploy location (filesystem, zip archives, mailbox, urls, ...), - (auto-)updating features, and so on. - - - To better understand the following discussion, the following figure - depicts some of the inner details of - Spring.Services.WindowsService.Process.exe - at run-time: - - - - - - Spring.Services.WindowsService.Process.exe run-time details - - - - - The <literal>.config</literal> file - - - The executable Spring.Services.WindowsService.Process.exe - is somewhat configured by the corresponding - .config file. - Please notice that this file is the most important extension point - for windows service support, and it will probably be made more powerful - and flexible in the future. - - - For applications deployed in the standard way (i.e. on the filesystem - as explained above) the updating features are configured by the - watcher.xml file, if present, - as already seen. - - - There should be however, other ways to deploy your applications, - maybe just as zip files dropped somewhere on the web or sent via - e-mail. - - - For these scenarios, your deploy location will be something that - implements - Spring.Services.WindowsService.Common.Deploy.IDeployLocation. - - Please notice that, while questionable, it actually entends - IDisposable this has been done - as it is possible that a deploy location holds resources that should be - released, for example network connections, lock files or the like: - - -/// <summary> -/// Interface defining how a deploy location should look like -/// </summary> -public interface IDeployLocation : IDeployEventSource, IDisposable -{ - /// <summary> - /// The list of applications deployed at this location - /// Usually non-valid applications are not listed - /// </summary> - /// <seealso cref="Application"/> - IList Applications { get; } -} - -/// <summary> -/// Interface defining the contract for an object acting as the source of -/// deploy events (application added, removed, updated) -/// </summary> -/// <seealso cref="DeployEventArgs"/> -/// <seealso cref="DeployEventHandler"/> -public interface IDeployEventSource -{ - /// <summary> - /// The multicaster for deploy events - /// </summary> - event DeployEventHandler DeployEvent; -} - - - - + \ No newline at end of file diff --git a/doc/reference/src/xsd-configuration.xml b/doc/reference/src/xsd-configuration.xml index 4f3c7be0..498c6cce 100644 --- a/doc/reference/src/xsd-configuration.xml +++ b/doc/reference/src/xsd-configuration.xml @@ -8,7 +8,7 @@ This appendix details the use of XML Schema-based configuration in Spring. - The 'classic' + The 'classic' <object/>-based schema is good, but its generic-nature comes with a price in terms of configuration overhead. Creating a custom XML Schema-based configuration makes Spring XML @@ -58,7 +58,7 @@ you can copy and paste (!) and then plug <object/> definitions into like you have always done. However, the entire point of using custom schema tags is to make - configuration easier. + configuration easier. The rest of this chapter gives an overview of custom XML Schema @@ -90,10 +90,14 @@ <?xml version="1.0" encoding="UTF-8"?> <object xmlns="http://www.springframework.net" - xmlns:aop="http://www.springframework.org/schema/aop" - xmlns:tx="http://www.springframework.org/schema/tx"> + xmlns:aop="http://www.springframework.net/aop" + xmlns:tx="http://www.springframework.net/tx"> -<!-- <object/> definitions here --> + <!-- <object/> definitions here --> + + <!-- <tx/> transaction definitions here --> + + <!-- <aop/> AOP definitions here --> </object> @@ -106,6 +110,28 @@ the tags in the aop namespace are available to you. + + You will also need to configure the AOP and Transaction namespace + parsers in the main .NET application configuration file as shown + below + + <configuration> + + <configSections> + <sectionGroup name="spring"> + <!-- other Spring config sections handler like context, typeAliases, etc not shown for brevity --> + <section name="parsers" type="Spring.Context.Support.NamespaceParsersSectionHandler, Spring.Core"/> + </sectionGroup> + </configSections> + + <spring> + <parsers> + <parser type="Spring.Aop.Config.AopNamespaceParser, Spring.Aop" /> + <parser type="Spring.Transaction.Config.TxNamespaceParser, Spring.Data" /> + </parsers> + </spring> + +</configuration>
@@ -123,12 +149,33 @@ <?xml version="1.0" encoding="UTF-8"?> <objects xmlns="http://www.springframework.net" - xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" - xmlns:aop="http://www.springframework.org/schema/aop"> + xmlns:aop="http://www.springframework.net/aop"> -<!-- <object/> definitions here --> + <!-- <object/> definitions here --> + + <!-- <aop/> AOP definitions here --> </objects> + + You will also need to configure the AOP namespace parser in the + main .NET application configuration file as shown below + + <configuration> + + <configSections> + <sectionGroup name="spring"> + <!-- other Spring config sections handler like context, typeAliases, etc not shown for brevity --> + <section name="parsers" type="Spring.Context.Support.NamespaceParsersSectionHandler, Spring.Core"/> + </sectionGroup> + </configSections> + + <spring> + <parsers> + <parser type="Spring.Aop.Config.AopNamespaceParser, Spring.Aop" /> + </parsers> + </spring> + +</configuration>
@@ -143,12 +190,33 @@ <?xml version="1.0" encoding="UTF-8"?> <objects xmlns="http://www.springframework.net" - xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" - xmlns:db="http://www.springframework.org/schema/db"> + xmlns:db="http://www.springframework.net/db"> -<!-- <object/> definitions here --> + <!-- <object/> definitions here --> + + <!-- <db/> database definitions here --> </objects> + + You will also need to configure the Database namespace parser in + the main .NET application configuration file as shown below + + <configuration> + + <configSections> + <sectionGroup name="spring"> + <!-- other Spring config sections handler like context, typeAliases, etc not shown for brevity --> + <section name="parsers" type="Spring.Context.Support.NamespaceParsersSectionHandler, Spring.Core"/> + </sectionGroup> + </configSections> + + <spring> + <parsers> + <parser type="Spring.Data.Config.DatabaseNamespaceParser, Spring.Data" /> + </parsers> + </spring> + +</configuration>
@@ -160,13 +228,34 @@ the chapter <?xml version="1.0" encoding="UTF-8"?> -<objects xmlns="http://www.springframework.org/schema/objects" - xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" - xmlns:r="http://www.springframework.org/schema/remoting"> +<objects xmlns="http://www.springframework.net" + xmlns:r="http://www.springframework.net/remoting"> -<!-- <object/> definitions here --> + <!-- <object/> definitions here --> + + <!-- <r/> remoting definitions here --> </objects> + + You will also need to configure the remoting namespace parser in + the main .NET application configuration file as shown below + + <configuration> + + <configSections> + <sectionGroup name="spring"> + <!-- other Spring config sections handler like context, typeAliases, etc not shown for brevity --> + <section name="parsers" type="Spring.Context.Support.NamespaceParsersSectionHandler, Spring.Core"/> + </sectionGroup> + </configSections> + + <spring> + <parsers> + <parser type="Spring.Remoting.Config.RemotingNamespaceParser, Spring.Services" /> + </parsers> + </spring> + +</configuration>
@@ -178,13 +267,34 @@ linkend="validation" /> <?xml version="1.0" encoding="UTF-8"?> -<objects xmlns="http://www.springframework.net" - xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" - xmlns:v="http://www.springframework.org/schema/validation"> +<objects xmlns="http://www.springframework.net" + xmlns:v="http://www.springframework.net/validation"> -<!-- <object/> definitions here --> + <!-- <object/> definitions here --> + + <!-- <v/> valdiation definitions here --> </objects> + + You will also need to configure the validation namespace parser in + the main .NET application configuration file as shown below + + <configuration> + + <configSections> + <sectionGroup name="spring"> + <!-- other Spring config sections handler like context, typeAliases, etc not shown for brevity --> + <section name="parsers" type="Spring.Context.Support.NamespaceParsersSectionHandler, Spring.Core"/> + </sectionGroup> + </configSections> + + <spring> + <parsers> + <parser type="Spring.Validation.Config.ValidationNamespaceParser, Spring.Core" /> + </parsers> + </spring> + +</configuration>
diff --git a/examples/Spring/Spring.Examples.Pool/Examples/Pool/Grep.cs b/examples/Spring/Spring.Examples.Pool/Examples/Pool/Grep.cs new file mode 100644 index 00000000..04f82015 --- /dev/null +++ b/examples/Spring/Spring.Examples.Pool/Examples/Pool/Grep.cs @@ -0,0 +1,140 @@ +//// +using System; +using System.IO; +using System.Reflection; +using System.Text.RegularExpressions; +using System.Threading; +using Spring.Threading; + +namespace Spring.Examples.Pool +{ + public class Grep : IRunnable + { + private string file; + private string regexPattern; + + public class Match + { + string fileName, line; + int lineNum; + + public Match(string fileName, int lineNum, string line) + { + this.fileName = fileName; + this.lineNum = lineNum; + this.line = line; + } + + public void Print() + { + Console.Out.WriteLine("thread #{0}: {1}: {2}: {3}", Thread.CurrentThread.GetHashCode(), fileName, lineNum, line); + } + } + + public class Error + { + string file; + Exception e; + + public Error(string file, Exception e) + { + this.file = file; + this.e = e; + } + + public void Print() + { + Console.Out.WriteLine("file [{0}]: {1}", file, e.Message); + } + } + + public Grep(string file, string regexPattern) + { + this.file = file; + this.regexPattern = regexPattern; + } + + public void Run() + { + try + { + int lineNum = 1; + using (TextReader r = File.OpenText(file)) + { + string line = null; + while ((line = r.ReadLine()) != null) + { + if (Regex.IsMatch(line, Regex.Escape(regexPattern), RegexOptions.Singleline)) + { + new Grep.Match(file, lineNum, line).Print(); + } + lineNum++; + } + } + } + catch (Exception e) + { + new Grep.Error(file, e).Print(); + } + } + } + + public class ParallelGrep + { + //// + private PooledQueuedExecutor executor; + + public ParallelGrep(int size) + { + executor = new PooledQueuedExecutor(size); + } + + public void Recurse(string startPath, string filePattern, string regexPattern) + { + foreach (string file in Directory.GetFiles(startPath, filePattern)) + { + executor.Execute(new Grep(file, regexPattern)); + } + foreach (string directory in Directory.GetDirectories(startPath)) + { + Recurse(directory, filePattern, regexPattern); + } + } + + public void Stop() + { + executor.Stop(); + } + //// + + //// + public static void Main(string[] args) + { + if (args.Length < 3) + { + Console.Out.WriteLine("usage: {0} regex directory file-pattern [pool-size]", Assembly.GetEntryAssembly().CodeBase); + Environment.Exit(1); + } + + string regexPattern = args[0]; + string startPath = args[1]; + string filePattern = args[2]; + int size = 10; + try + { + size = Int32.Parse(args[3]); + } + catch + { + } + Console.Out.WriteLine ("pool size {0}", size); + + ParallelGrep grep = new ParallelGrep(size); + grep.Recurse(startPath, filePattern, regexPattern); + grep.Stop(); + } + //// + + } +} +//// diff --git a/examples/Spring/Spring.Examples.Pool/Examples/Pool/PooledQueuedExecutor.cs b/examples/Spring/Spring.Examples.Pool/Examples/Pool/PooledQueuedExecutor.cs new file mode 100644 index 00000000..60a959d8 --- /dev/null +++ b/examples/Spring/Spring.Examples.Pool/Examples/Pool/PooledQueuedExecutor.cs @@ -0,0 +1,190 @@ +//// +using System; +using System.Collections; +using System.Threading; +using Spring.Pool; +using Spring.Threading; + +namespace Spring.Examples.Pool +{ + /// + /// Factory of istances. + /// + //// + public class QueuedExecutorPoolableFactory : IPoolableObjectFactory + { + //// + //// + void IPoolableObjectFactory.DestroyObject(object o) + { + // ah, self documenting code: + // Here you can see that we decided to let the + // executor process all the currently queued tasks. + QueuedExecutor executor = o as QueuedExecutor; + executor.ShutdownAfterProcessingCurrentlyQueuedTasks(); + } + //// + + //// + bool IPoolableObjectFactory.ValidateObject(object o) + { + QueuedExecutor executor = o as QueuedExecutor; + return executor.Thread != null; + } + //// + + //// + void IPoolableObjectFactory.ActivateObject(object o) + { + QueuedExecutor executor = o as QueuedExecutor; + executor.Restart(); + } + //// + + //// + void IPoolableObjectFactory.PassivateObject(object o) + { + } + //// + + //// + object IPoolableObjectFactory.MakeObject() + { + // to actually make this work as a pooled executor + // use a bounded queue of capacity 1. + // If we don't do this one of the queued executors + // will accept all the queued IRunnables as, by default + // its queue is unbounded, and the PooledExecutor + // will happen to always run only one thread ... + return new QueuedExecutor(new BoundedBuffer(1)); + } + //// + } + + //// + public class PooledObjectHolder : IDisposable + { + IObjectPool pool; + object pooled; + + /// + /// Builds a new + /// trying to borrow an object form it + /// + /// + private PooledObjectHolder(IObjectPool pool) + { + this.pool = pool; + this.pooled = pool.BorrowObject(); + } + + /// + /// Allow to access the borrowed pooled object + /// + public object Pooled + { + get + { + return pooled; + } + } + + /// + /// Returns the borrowed object to the pool + /// + public void Dispose() + { + pool.ReturnObject(pooled); + } + + /// + /// Creates a new for the + /// given pool. + /// + public static PooledObjectHolder UseFrom(IObjectPool pool) + { + return new PooledObjectHolder(pool); + } + } + //// + + public class PooledQueuedExecutor : IExecutor + { + Spring.Pool.SimplePool pool; + private IList syncs; + + class Queuer + { + IObjectPool pool; + IRunnable runnable; + private ISync sync; + + public Queuer (IObjectPool pool, IRunnable runnable) + { + this.pool = pool; + this.runnable = runnable; + this.sync = new Latch(); + } + + public void Queue () + { + //// + using (PooledObjectHolder holder = PooledObjectHolder.UseFrom(pool)) + { + QueuedExecutor executor = (QueuedExecutor) holder.Pooled; + executor.Execute(runnable); + } + //// + sync.Release(); + } + + public static ISync Queue (IObjectPool pool, IRunnable runnable) + { + Queuer queuer = new Queuer(pool, runnable); + Thread thread = new Thread(new ThreadStart(queuer.Queue)); + thread.Start(); + return queuer.Sync; + } + + public ISync Sync + { + get + { + return sync; + } + } + } + + public PooledQueuedExecutor(int size) + { + //// + pool = new SimplePool(new QueuedExecutorPoolableFactory(), size); + //// + syncs = ArrayList.Synchronized(new ArrayList()); + } + + public PooledQueuedExecutor() + : this(10) + { + } + + public void Execute(IRunnable runnable) + { + // queue the task and remember its ISync ... + syncs.Add(Queuer.Queue(pool, runnable)); + } + + //// + public void Stop () + { + // waits for all the grep-task to have been queued ... + foreach (ISync sync in syncs) + { + sync.Acquire(); + } + pool.Close(); + } + //// + } +} +//// \ No newline at end of file diff --git a/examples/Spring/Spring.Examples.Pool/Spring.Examples.Pool.csproj b/examples/Spring/Spring.Examples.Pool/Spring.Examples.Pool.csproj new file mode 100644 index 00000000..c4f5265a --- /dev/null +++ b/examples/Spring/Spring.Examples.Pool/Spring.Examples.Pool.csproj @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/examples/Spring/Spring.Examples.Pool/Spring.Examples.Pool.sln b/examples/Spring/Spring.Examples.Pool/Spring.Examples.Pool.sln new file mode 100644 index 00000000..2e07bb35 --- /dev/null +++ b/examples/Spring/Spring.Examples.Pool/Spring.Examples.Pool.sln @@ -0,0 +1,29 @@ +Microsoft Visual Studio Solution File, Format Version 8.00 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Spring.Core", "..\..\..\src\Spring\Spring.Core\Spring.Core.2003.csproj", "{710961A3-0DF4-49E4-A26E-F5B9C044AC84}" + ProjectSection(ProjectDependencies) = postProject + EndProjectSection +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Spring.Examples.Pool", "Spring.Examples.Pool.csproj", "{C261D9ED-85C3-4B35-BE48-7156F5B17430}" + ProjectSection(ProjectDependencies) = postProject + EndProjectSection +EndProject +Global + GlobalSection(SolutionConfiguration) = preSolution + Debug = Debug + Release = Release + EndGlobalSection + GlobalSection(ProjectConfiguration) = postSolution + {710961A3-0DF4-49E4-A26E-F5B9C044AC84}.Debug.ActiveCfg = Debug|.NET + {710961A3-0DF4-49E4-A26E-F5B9C044AC84}.Debug.Build.0 = Debug|.NET + {710961A3-0DF4-49E4-A26E-F5B9C044AC84}.Release.ActiveCfg = Release|.NET + {710961A3-0DF4-49E4-A26E-F5B9C044AC84}.Release.Build.0 = Release|.NET + {C261D9ED-85C3-4B35-BE48-7156F5B17430}.Debug.ActiveCfg = Debug|.NET + {C261D9ED-85C3-4B35-BE48-7156F5B17430}.Debug.Build.0 = Debug|.NET + {C261D9ED-85C3-4B35-BE48-7156F5B17430}.Release.ActiveCfg = Release|.NET + {C261D9ED-85C3-4B35-BE48-7156F5B17430}.Release.Build.0 = Release|.NET + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + EndGlobalSection + GlobalSection(ExtensibilityAddIns) = postSolution + EndGlobalSection +EndGlobal diff --git a/lib/Net/2.0/Apache.NMS.MSMQ.dll b/lib/Net/2.0/Apache.NMS.MSMQ.dll index 2620faf1f7d3fff82e5962c30dc66b47e087a37a..19082fe7df774b017db41ffe849b6d026aa0ba50 100644 GIT binary patch literal 36864 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 b!~-K981cY}2Sz+F;(-wljCkO`r3d~OQdGl? literal 36864 zcmeHwdw5*cb?-WlIrETatQkFQgN(;ugKSyCHpXC^hh)jdlSuMIGR9!X9!X|MMdIJrlAwcU80;Isbq#^wXg{E=H<4fr+d6edo`&(=8 zGjk-7^pXD4UX3&B?Dg1duf6u#d#}Ccpmbk)Gg(Ar(rK3C(zXH$~`R637nu#L!I;(y@NZ<+@q zIF4IQ38F}82DFYbzNo^eoyZ`nU1G?&6>Y}JJXi(sNHaN$PAAhEV{8%2m~WJA?2hGKLfUBT}MNIb?kwdho+=iv)cIr>^U3IbLY+^BF`rCOwS|XIhA}OJqViXR zxU=j7-49$(sCuj5=Ms!E$Cy;{6)^4#t`wBqBwvL+x{MQJzIK7esZQFB(4vo;#jj!@ z#@OxV)vWOSdJL9fHZ@?hXwfNV)5+j3y4WmSfsq`GvYg^!@CqM5MP#rLMz#_^+OJHn z#1CU)mq}z5l&4U~V8Hc09;3OThK3Io}m&x{U z3}bqs!|=`A1rhTg8;3Bi4zxS_UgZPV)0ly+>&js+uXdi1loO9!w34 zk0o;;ZY_>kqdbUp?_01K9g2oq7LyuS-O-?Q_pDmgR8TcI3k^0K4NzX)Orb@K)KEbE zqIF&o&W^!0c6RL&n^u8|G33}_vYLlg!Io3VG@DxBF|!FX$0^Q+X7?ljRa;3{MuzK3 zUlu|i`p){``ij0NnML?JGR9QRtW;;B-`WpVtZiC`=6Tk$y#X4+6OFO{cv*j~9k*LP z1V^)}5eJ5;n z)Bo#EirX_U;ogL$TU_N0GMy&$$02quOoJn7QLAaOg;JJvgx3~aF~(`q+M;5<3D!C? zR2-{(CyBnt$to_d&@Gt@yv}(u9j?NrVVm|Cwg}s_+{2J=+QQ9pP++B>fe5pkR)R8y z;6huAPF`ZspF%$>@_Iv-%T4p_i6H)4G;SVb#V+zs=e4Z9A z&i`Nu$6cVbV!tV3m9o@+b2^Au5xvn|MI1$FHB63s2B<_b;Ua~HMH*oq2^JBQ5La^z zb{l+8i<|1J4^cDhFxK!K>ViR56P5}L!sar;4#e!H^M$w%VTA>99T2mrN8oxu&1Ii# zH4yvk6T1W#n~}Pzy6QSisDtb`4t5^v6=W$#xXrN2i>@jyRYlF{>0_0is-3kNgP>Lw z83^<`;Gz=_IkA9?q2_|^!ru<`VD`hyTY=QtL3gpQm5tz*2gPf876s$BrXNBj7pn=} z2+tH-QHqA$GnoLPuwsSXB_cu1^FBx)x(-=)sgil)A_{w54^!A(Cgf0s6!L~`aaB-x zN)}S_RTzV*29;jN%F>Rh5AD3JVASx$_aZLi!!eH-(tC*KafENZ_N-E5)~O)IdSUSV zAnb^|Mu}GtU}^%1KE;Rs%ly&=zRB@VKECCSRs=l#*lWx6_f^$zHus^h0(j} z6#XpM*SQTsU)8VVHcYDIHlo8k2$%TUVa#WXwij;k$uKrm23_~bFy@oNl;b|}T&Qec zjERgzPoPgg(Wm9;Q^d3!_fmL|>Z&aFY*08rdAGs>DtNUSYT6EgD&Q-?|L8dYP3Hpe zJYvZiSU-g2t^^h9i@OR>Pmge!;I0-fWUXmQS1lr5 zzdiw7m}2mo<$i=i2}WYMi@2C@h!J2HF@_Ws*c*Y<0Z_w%G#0{$y8~sH?W-_RCB-ZZ z4wfhgeyA*n_)JE1uZdI0V>z5ohrX$HhJo zX}DbKBZHHX4-=0UEl3Sh0}|>A%INAg>eprWCW3b!|Dic`TRs< zzop3Y6nQ5l*_Ps8L4$;}%)fsJ-Ankz7wC|zm0sJ(1JDP~0}uh62YemPG<}S%H4icg z2|HYd1r=GdYz$4~%!JXR55D*Eciu$cU?tkbm|pc4L59Z)c_(2k5NCBwmxHZ(!#qpY zRK-*KT@h2v6JS2C{ijM@tF9^M=h=02Qg9!ACHdIB~FE(Op!lb=q;w# zyeEH#&=33QhWJY6q=Z;R&kXjJ;$ey)Ca^`>^kbO0yY?l}5Uf>}6cRS!3V~qP4*kmK63ghq0hRchaK^w!`Wt$DfUM?d>%cpzH^(3SA7-pJn2F5UH zaM1i1nF|hnP+O*Zli0GmA~2~<6?5nhwJM*mMz;?QM@+~46l(ip6Z@`T&T_X*736V& z{eC&~Aa`i0u$PY@jc>Y<4K;OQ z-}}LvQMY&rh{bJemgEHy3GS0&(;n2vgu=Z3sO4RMHC@K)o0p;C>rhz^wpe1|TvPn% zxZ7EP-iRX254yLoak6!4BY5YGpu$sy=O^i0q|Yh~D87QCNen)YCI|7f-K(L+a=*p8 zI2PGoSU(79_musuPFGQj9J*GX+bX^-DP-{ALl>W8NQNkCr!`m$@rVSOz2R6D;aT-z11zCn(@OiR)KS zs*m+xLj6Bxg49QtTK4sfdRBNk&Yq;BeXq>(Yf|28h+d6+rTZqtqy{%mz+!oiJ(iVbP&28Jo zJ|%0bIuEOPr+99*GBMe<3t$_*$iXc4a%MR#OLf1if(?axxc%Tv+uaM^eZg6Ur-d-v zx-aPKJQh3F^-<_T>|(83Tx*FhTdJ(lNR2W zd!|%}8VY~SEr(`0%9PNo!n;C%DIuRJyzuh5>GQCqjcqB!0yGkt$(K1;Pi%Jt%4?nG zoe8Ju3KXj;SR0H7kwH6!1SFdZAV#R6Dq%JiQHvc+y*(!>9$WUG1o&8!5a;H>v!SQy8B|uO zl#E$jnXl@ZRuMt1B%o~O7#0ox8Gf=H9iWN%?sJ#n02iiNh0@R8OV?G&M$zVCD zW%z-d>oy#O1{|oUr>sVOP!40Z2757%m;oF`FQFEBArUO!3bh+6u#{Myj zJE3HZ-QbPon%)nsG4wBt*sEyYveqT7XD>Nt85$=128oG6ZzC%{4HK)ck?2?h%DtsR zHopg<3EncI;{njN^wJm5qZ-goyJ$Q{|Evn@0nvNL zS$sgp0!Q2MnU19a#UBKc{dd`{q_0-qG_UkUe3q5M?fdjcJkHOB!R>NMvA zJ_#71On@mb1|AN?=pN@LCq@gxH#rgdqwq2#M&FQfeT3_F3d{;zSj7~#YG;*0?^Ln2 zxz!983k*kpR_#zyfYIA;d8c;AehXE^knz_$dxC$PST=}QEr1ojI& zEbwlDkJWHnKdyP9#-Vup{hII4f;juIFTOnPP)XqJah7=yFhXCBbBo`Je+%5d7kGN& zmng4Du*^Dv+W{kVXJVO=pl>ApG=Y?Kytx zV1#~M$NDd*XKj7;H_y0<_%8A$x(?8xJB0qEz^@B@LEtL_za#JsfxnQt9f&lCwm1BY z!(7J)N4|lWJ%tt_);(+$untd7KtVMgcrjcWUODX8k`&$%LA)H6rUwn zN$Mr&T)G$S9RbESau*BlGr~I=QP1_hsIgswJq;`b$=!l|OY`;!_HDuDLYsjA{{gVG zX#ss&c)yZ*3+Og7k~L%*+@sU!4&l`Zb~Zf;tkLAzvB-=8t}qjT-DW-DB~tD;XQMo9 zHUjQ5=K_9I=+~I1q5PQH0{E=C6!2Fz*L^7P9N>2XFVMx~r#L@Fd6ARAEzU=rceyMY zlup%((!AT@R`v`06URVjzTyM`kA)ux{8IRdHaHLus&fvDf5 zv5eIZET^&k&>5s7y564s5wnp zeX?MSHFkzzeS$qp=LAxa%xSDG@G!7PHP#jQ5-|07HqaY*T=qA{pN)_qrXCxr~J4~GSgtaF`iV2wzTJzHkc8D*@SX3=uNo(-|pvuV9xC&KHXWj5_n zJmUV%rYpZ`d&cX|EMpGcTgFZ?PN6?5V@<}X^lBMfV$7#L zPIu^p@s`tuRriR-e&n2IETsE2_DiQ7*zq#94%pvoEFA2@>c@E>YdI;n3D|s%wFb8u z&D2@OwgVefShzhngbd?qjcp9(fL*JxoxvTr<-12?`Cvb=F9`Nlcr17Yvb?7>_NCw` zu;&Cj8v0RiGxmx%HTKWJt-#*V*ym7h35A;3&ZD8%QEv&=33ehJ4h`W3XR*dk3FUyD ztFg1dTSgl-wgJ3lv|X^Hp}nC2q*x`5jfaMSsn4^4+Hlc8Rxh7t11;gJ45Ww}TOB@Z zte|nJ_pHIZb7(!MTXfu5AHLQ&myQYctih72Xd|vX*}JTBHI)QAZluFE8|Tse8Y_fv zGtQ?VC%`)9FQ6F{u#?JIH_n3#%Glk;g|tMl6UH^+`;B&5U&bB;wo6IUHQ`5$4%%O? z*GB7Tyo?<;*3rwl9>>yp`nAS>8Gg}NPqT3S$9?!^_!VI1YRrkeW~8XEjQy?gAsQ)T zKQy}N5sfuQ-Z3`Na~fL~dC%yjH#N2zZxQv;uQb*dam+1LgX=E8NIiH@Yspt5Cjt9~#@>m{1%|-GM@8K>nx!$0x@~l- zU?+^~sy4cm76ap*a!u8_=B2b&V;g{7Mjui2u!5~Ix6^H^Uig#X?WD&wb~~_L^s2&) z2dd69()8;x)@7z?z6AOS;}P)sX@kai-1}*(#@LpA8WQX%eNC_{1v_rMEZE~3`@Uf3 z$#gkxyjRt0_EVq6cm@n`$FY<1T7IcHsIg~_S=GDD-DPZ5^=@-d8CzFfFfXTTMGLR< zowS$k5lrm}d+AZdGv-Cxz&oz7GooJt_Ct*=iN1t0+OHKBJ}3Gx4O62`pVQH_m7k05)!USY=3=>6sheNAIGNAEVSpcggv+3162k>1zXebFzP zC91)Jk|X({=%eO7TBEW58GXXsPkkEuO7to703FrXUqp|aSJCYndp`QSc{M$+vHu-? z$sD8CHTHV++vXvP$!YY2@%`xEnB$bx*pH)cnjfRh8v8%dADGwBpvK;d{>1z^eMVze z>>cwcJ)p7b*e}d$>2EaF5c?PNI{K-`PLCPZC+WjDxpI$MV;uyJc)OusU2%avwP6Z>OZf z!aR#_r*k#-lh_*TcIp&N&D%R@yT*9l-a$iJ(wdQ?&(gTYYG!l;`y#L;GKe#0bX$K& z-_Y1vV0Y4+B6);9GNTP=`IB(X$+qx}yNl)vc9e!^^qP0kHib#XayO(5`c(Y)g~vq$ zLsM&06s7r_WiFo@CbzZ7sZc6<44i0K+ai;>S0@;LuMAD<2i?NCiEkjfMTR9!Eu+dm zfV?G=wnzp%Noi48GS!}ci#L>26?-PycC5Byt&&_=SD{=eWrilDq`X`zN%Y)$ujSb6^6;s-SrY=cFA;u|mJtB0kXFn((UfWP9|F#HB)SEc@ z**J{_aMB5&?BE3A;2FeOAP9O0wR07I>Y&TLj(#n4^0I zJ_y)nJpp)`^$cJeebcx%zRUWiu_U_7dc}Aoeued2(7Rz1bHn)S1rO6JMpxiL^DWR< z;XT)%#2>W&QR=<|_~)p#I`J@Gqwh_;U>RmQF&pwDiC3&A=y2kvfY&De5s=TFPe5lk z;7tjfGfghfHhGmcj8_sV)OsZTD{1{VR+#t{`2_t8l26dP zUqYER%!9TzdPZd8#Ha5#@eRNobV_YK;AypM?Pq9dZ9nLIqwox^tL;XaPy5f%CAB%g z*Mr@Vxw5v;#*6W=_8IyE$ZR6Mxp;>Duy(ioBjcgkoNb7Io}ou-S?0?Ezgc?~>b@c6 zx261E?GE}8JaY?bt*X1#W(&J%slZogypDTuf8D$G9k7`K{|uNzj~=KB1Q^Bx)%0}T zT)^k+76ekLb*Z@tuqCj`1sJ<bG(KN{V}O1B6ewfS?*f*hZ-M@UdU)P68d4bjNW;%SNi+=6 zO5;?4%NpK=WKVuw)tNhalN5<5DLh(vEzv*W6~_(6BlX zqBi;m%$eKifEl1W=^)@eGzNG-9RhrS4g-FHt^s_6J`VUOeFE@tx(@KG^hv;{=?1{# zbQ9onbPM2%^l7sdzxBQCwDMge;90a2a5ZHBJLoRJ57TkLy)=TO*k$w!lm~=FXnSl3xMTA#9Rv;NS!*LuWy%zDQ9YwPc_}jFU~Ql$kPBQLxGivJ;NHOJ0-p~&5_l}|mB7~nF9qHX{7c{*XOm-MWx^X~SP^XG z2-ldLG_0(WUk9og&Y5v9xQ1Sh5?F=mumaU%^_hv4W-eBj`H1rcsJ{@>Y5NZVv-VAZ zCHolQ$L-qzkJJEUD;yQoc3BweAUVi=Pj1E9(&rL@!JEyTbjkKr@^-@XLy^z{GDP zRb1Xi@a2CN z{;~fo(2w9*Lmvk;;mH8X*Www%o1hM4Lh!7KZxHn7fraRs`0`#51~&p|VzsYAxf+n) zyNIG31LSwAW}sXnFo6*<@nu+xea0M-?t_a)BN@i!+F?Q zOga^qiTC&L!a3e*I}NZIV{G82W&z4Ac=N@;?F++Y7_G4Ljt={1GnUWCiT!cC~pwB3A>U>8vzZ>xz#9d1~h03b}#&978DuiG6Q&1Ej2_L20!P^Pt~ySKHww|i6TU@k{%(#1@7 zrdUkx$xP-Gept+;hdpj*rdZ16)1@qapWo1bd1j#Gar*EFd%W_d(adOuG`6vTmIpEg zN@+reo8OlyltAgs>`ss7ylNFXN_nV8BkR%wCAV;Z)*L8hik|vjn92rJ^c6>kp{{*k zZ{FRX%M9+xtWW0$b0Br6N4#1a3)$gpDZ4KN8dX}L;o^W>$YuMf_dv0f8P?tM`Jrq$ zrTpDbP3(Wl?|_u@fY;-S3p%sK5x1D`&t)i8vBB$QYC<sF};tx`dU_7#LFg!Ep8(}yGe>X`+J2gms z+2Ks@NIFj?6#CpQxRQod)PM^W#Vj0{FVRRL>lU)5160V21&+EPkim31K^{JD% z?i3;`2hl&+TFy_>Qf!!Zh8FTsw2Tfxcu9*?2wGxe#d})BNAYAlw|WvDuKAlYgP9x# zrH~o)I=fj9fUe=8x&j+oaVL7*$K#}BrF>DQq@rB=@c{Ksp|tW0iJ`1;S7*H@JN{S;IM8H$w-F~Xf0NtcFHAaH@Zw$Y=cihb@#c0jnPqMESm z7|=7rBW@v$Wv9cF38qqSFzrgKH=z`9t<_#?tsmd07zWSTVZHSIO) zZ?fMVgqLM0YTZ1VFTq2ty_rHboy%UO*4@-Pw=kS8@dCQLT;jIYa8>T36qr(xWO4-) zfePB2x^(T%4eNHMdiqHI@EX_U^-Q!$K>(A*Q9WtQ#!9KE7v#aLEN$L6cG5&bWq5S| zlpx+)@s@Hm3W!SHiY6e4FTH7CLg#f0N}@NDA0)M~X7s3NzQ)-0i4@;zsfKalTCQjl z7Gv(ZFC-pDg*f(SRbY+AWYo4I!6mU{$=JxnUb1b zC@48(IC@=F3{`Iuu_EMGUKY|scNnP{ZFY0Hesohp&F2`7Ag>pCFZ&<|`2uZl2isOY|bli#!^Ofwo=A@b9GB8o1^xUJDeR@C*Mq zb!}+Z(!G6~Q=W(@Zr{AQeVeM%-Mx>CJbd`;@2o&G9%d+9)YsbfU3^`cB3o9F=c z37Ik2+;=U*_T(Ydfss;KOgft{!vCC(>cGSlktiu*fTbl41+h16Y@f9TliN zfv?NCY2m8^D4p&oA3-3aODT>BZcCnAm+@4^Tg>xeT(jalVA5w6QU%F>I)*X>dj+3> zW(O7OvR}n%+F{}&y((hf5AZzYM;1#Wa%YKoad4_AWiWYW=w;12EfwMI-?m(Ic)D1q zjFjg^d0OyfpGwt}bt*$TsuwUArKVh2j4I}qoAeUA%x)c_n03X>aDVPVDzB0{EbHmq z#hhZe`Sudt?(H8%G3_y9(S zJB*{?fvGj%hTYjc*i3l!naai%IZ(*T(lnLXmo4RdrgwDVv^G4F%ck=_3q059+!&#c z<$DAv^1kcb&Bv($ z%vl^`Dq)o8q}%Pk+%qh-0lU>OZb#G=4OhiY4OABOaRJ(X$2p?4oc|YF*WgZvZ&~C~ zrjslRumCkC**?DeWr$jj(T!o4TFGJJW4`B;ecUWw)x4+9g zBH6{L$1SB0PZ`dqGJ}=IE=2^9JF+vC&+yrfuP%6jP)X^UjNXjZ>D_;SpeSHtuaNA? zOCQSVDXYP@3ZskqJj0Z(bblsCNZ&Ky^OmItY;s11#k@4C_DfwX>1<5pQM;DPaL6tp zA&|xbmmloSl(*%+A%y-Qx2#HPt59Xm^yK;x3#&L(>5-`fBau6ohFo+pUAY5=#VRo^ zsEi0xUY)-uEf@Osa=1TJs7&m=nFBn1OPohwcjFz-mncZ%K3p#nyd$b@gZEIz))m}g zP4V(bEOkp)5a3zM7_L}Oz34Lbac>hZrt-y7IzN!vuv@lREDtb^cNFQk43}0fgj5lM zsxCz}F6K$yR1tekc2Ay{NVbL6=J}E}&7%q(J`5d{Y8%tp0+K2YxQ_yPR(l}C9$-kZu0!XB^y&Jd;XyH^r#gk|tAj}qfW zNDfdI<&sDzQ7?<~5cmwUQfC-EmQ9PcRp8;OeRZd_$ZeHCVg36c#~KQvgUe}XAJDZ~ zql^Cn2DJkMxAv7=7(pEu){cra+dF`|Y^4jB!+$5EEKfqBs4Zn}_-j4D@~G+4-ZBab z+rxC_g(Thv^Y?+J58#j6XYi+VdI4E#K2f`2aPo~Qc7s&4#d z!M`8V9?WBK)9^5BOX3$27d0@=QRe#nfCG@o${75I+i9=p{r6kC3AR#iAM6{J-f%zJ zx0_&JM!x@fI)86F$N$GRxNsEasbKI1gNF_Gbut*k;HL5I05*(&9K22V8B7I^;&Ht^ zehw?i@Z>QJ9G2cNasY8~XGN+NH78FZo=G zBnb)Tj(}Q1TSJiNpynyXft8kk9gr3|G+28S9@2%stxhLo*q6$CUN}vuKX)x%DRxx+?oB|kslL+Yet1Xu zmFA@2fqlSp(66SrnzT}9c2dVcQp<1%3&%Q$C1x?~C+mEC$A}Jna3t}_aPN79)#&iE zL)ug0osxDres~%4%P=huTBY}%kJPw&JYIz9G>*@y^4yY(-ipkP5B%`teH-nbC;se) zxBlW|{Z~@x%U5l`c=qx)ud|#)C%#eBiCIp(+jLCR34l<8?|FfwVI2GcW)uFS{w7ocvI(_AsAD!lYodnRif>`Y7Sm~jo!eM*BZL~+ifv-WHdJQiiEXA6 zviZ#i2rdsja^cQH@oz^~0oj4?{2+`-EKk%pP`o2iBUQuUq-`X^W+2`z>}Vofl?)gO zJekIAgc;PcHTBZ-m0XNV^9xzkLi7m|^F`l$Heq{R>XO|8Uw3`GXdtkhi}&u~L?xaORMXkVI$f|bA{7D6?Cn&=S< z!_dHn&W7&|U|jPG2BQqt11N1-F+0mlzjN$2E`)`OTAC~QKZF%YyuAu|}X%|s36B4$cr z{O5MiY%~Kw6Vc2K&#}V6z?{GwD}(_hs7Hrsj#U-JOa%fuH-kBXCTeWFSr>C)(2kht zkOeaub+->kf;OUl{BU9i8saWzqd^DbwFCdMiL}@nW+n9uRx-ff-9&gZn2%Rk%y_pN z`S@X;4VXh!!2sfW2ckI*Q{lRwBX-%s5X_$wz$g+z20aO35<$xj?p2i6hX@2iELaT{ z<3FDhNGwT6KN9UMIETT~V9%mc3HV;WtlPaK|Sh>vRtUNZUR8X4ci3s~~-LKE&Zc%s)*2)2abJsFs= z8OAF>ay3T5avU2_fI-DfAZT96>Wlzv9lu3U&KC;aCPJ{q52K$Zq6`4xU^ZF|90nl< z5eC%^q8RhooW^j_Mr_<_dZjy1;*sS>U~?@B=q-pc4tIfspuCH%9={7zwjh2uEfxf& z6w|bfvJ)YTl?R**VwZbt%nn9krY6K1W4e;rIH!>Zpe1CGwX_xgu}r|gdQ0cv-J$ZG zRkEpLVRG4$C1f!&kJX)mt-eVb7WQ;UfMXFJ8Io?P=eL8}2^* z7x4y_{#C`vrq-TJDXGrDIJbEXCd*e6V&=kC$#(qTfqB;yLQA^4lck|dlC5svm?~Q? z4uMPHpP+aKg%Ep)PT~J>y3cIbT1b!d_|Eq@61)40B3u6d6f+?|gzvjo#^HbdJIi_XME#)(%?W*_Xw~Drx3ZwbG z+i_X7T`tuo^IJy-`{@XB9Pe{Cmy;eg@#*~yc17j;kj`AL8^>$)>P{vj?=Ughqkv9EFRimv#cK#aoKK zc-L?P-eug0XAj7{uu7hr{!b?m16uiDvkr$4KH2l3 zgb$zmnU8l!@s~ru-}4fBN+b& zjkYlgx_7u$M-nWVIHK~=QXMRl=p)}kRE|U5orF5dsC%BI9Pj$YQg!BU!n>nA=no(C zy7BaGc)VjL9|!&NDI8Nr!~@=8xYE~!a`0-05BL!D+vWIJz8f-p5a#2QXL&o`Gfe?k zhkCY0->RUmyYLpQ=L7C_9tYVTJlP8V3_%-Sl!FCl;-5O&XK^ItLp%Ss%4wgkTG2kP zi6Ms-4?X5j4)56-<_)sY}bLpH*tfY`2Dz1`m{l}&C$kv z@_fRW8d<;o-_^H489#N^p>7cIV^3Mjf5u!Pym5_`5;0o2r7U4pm^gZB>OX?SW|zOnYG31JfRu_Q13UrakcA#{(nk|1z2CL=o;^DRd++CS{<-IK zx^dQC-?i3n{eHjod+)vD@-x3lE+W$K`{E0tCvfMhQRv?%eNcx+KNX@!{684;gtF`h zW7@Z*^3iP0=*lI!qn(LN#wbKP^k}Xp6HR5J%`I)wZX>BT1cQO`mg|*^h?XfX^7gJ- zTFmWT3XLgKd_)T%!HutTHi1O(>%)&r7sX9A%MDJ-&v$wjKgb{afKabSH&KQBSGrq} zZE=-vB5Gl#kLV2!!m-z_uz@VSk*NAu-QUAeyXa!&1GXy&Nkc(Dw}5-H5hRKq*A?Y< zUQwb=4Y_=-6GACl9~cjQ&G6}Va#`tC{Mgs&_&KgdGZ%*h2{)OL%chc> zo{bURJCn#iz=~*P)C&DE@?&B7PY=F4JzjC~lz+K$ekOXLb-{+WPyBps`I;BMKW*nP zuAYDO>GyuUVPoq>H(&J1s(mZ_&;H$8;oj?)4%_h7k;o@)yFUH=((DU=nSAXFKYHq) zCco&J`ENfP+j;loXP!7G^U40dG5}aTc%txWyOaL)#sJ3+3>5MM?P^q z9{;BUqnG@7_k%B0kD98|2`H386jmpc#nAczbypZPaMbIKMZmo6sf8X26`ji;CNI~4 z(~ZO(VMDrrna;JF6CU+?%ydXLDBWB&R>@hIrnTZ{4(u?dO8KA9Ze05y8})e=Q)4Iu z^<}Ci84M2`Evp(>JUgG*RI_|zRaa~n5^)(^Q(e+sz>=CnO|!#eRqRl$s#SAi9C!pU z2AHiM4xDn}k+oH|Cz>^=-KtjQhr`Qmgg~=vh0&r?gm7snATrqrk!hM;;J&x zf&o-W%2$gx`Dhsj30JfU184Z~DqMN=k3b(PqD8-rws#7VyLKUy*eKXs$Tq^Qk5-&S zwDqh$IMHg?451k2f`BEwfQ9R8TUBA!nbI?3HCz@pWmkXS^h7o-wgXY+RE@4enc+8_ zM^FL*HFqgm&4_}p^Q*%Rv~i$<)Ztf7M31c0!dlhni8qBcV=Uxl-b!~>rDt+W*d6v9 zDEArTAgr1;*JoLK!``aVr`{CyignQc_0))laBeUBtFiGg&2K`^=Xv~92mHei7!x1~ zdxo#8^n^WO_t#S=ANJIan(C%|Q9cAOtQsgnAmB0(pMZhMBT%VL?m^FM0Q!w7teMJW z8pu%NWKd*!3U2jZJvuC`^`I4%N_W^@=MB4!>5#u&YxbL=^wnz!Ly4#uaUNSUU{O0! zb!jn7et}vRaU4uhg1O^}=Blnd275q@eTywxi=#%1-2=>H+a5dXk)IFo8X8cIxkwU2 z06k^ix?#xZez4_UU+gQ87lvR=2R!xRoT6}x%!4d{7YxojI%?wQCj@gBLF_k9Wf$C9 z{`}pn#|9$KzOD5AvfL(00Lp4fc&3Hs{- ze(&(%#%TcMKD4om&?hJW``rKJqDcG2nji{PmANih0A`hD-aN5|Ky~Z$&A65OJjNp2 zeYr6z`s`w`g;^*8a+vM%=T@fi!wiKGW3PGBM)Zt}ET@#OzSL%p) zn`jJmUP3NZ5cN_CU4Y6^&U_q+10K~l9ruZ@@~YtE3ZMT#na68N{KMA;{XX>J-+7EP zU{ZUstPC1Ah^H2_2sfBZGtdqmo<*en8ZN*T66nK(t=U7=?h3^obixJbP^|Bhd#k{@ zGPxPIvAe3;fx_F5C%of$!b8Us-f0RuV%V>F5HHSFHI}2K#!al+Y%0R0!WCO#YdT^W zVaFu7*-Rpefk{Nu5qoM-l3UCqq8OM&G##-cgOc28CK1KJB%OW=?fHI?Qxakx8vl7sSPux&N>-gj#ra3=v5<$#$5pB1fsXGT90ch7@@HY24~I+JFg#yVtlStK;a&lm>3Z;2F0dZFI0PF79({M?dEGqeIYV$|;0}mvf(u zALdG#So(3tkR=RdLg0A}5mr|2qnuuT*oY7&E!h)dffFCayIGrnRVxpjs?JnBbcWDY zp=*Vvg!Tx1SA7*Wqg_nbxn`;Xddqdh<)IB4r=9I#x=83Z{O9{UbXI`rcF+KwRnFR- zLN5>Y1U+=0(0-x65c-+WVIkHw2wfs{v(Sr$9tg3YS3?hmJoIVke}pci07BrQIYUMc z@z8pqJBM%ypBuuKuL-}tg86S&aCvSN`f>&5^19GJ2%Q$L4tuCI%$8>gofKi4JrR~X zEc6#5Q7bw3sg)BeL$suF9_Tuu+d(~aZ{_)z0L^GK<$o2}_l?E8SVSiSdC*2~(KU)r zg@i57u#gXk=uANx1x1$>C zSxyatp106cK|iq2G(m4#Xs&qq04NAA^F;So(Si2U-WzA(mOoGAZan3+aNcw9v(ZuCmZ2f^M?V0YUc-K;IdFUbfJU zV)-Kr-6Ums1BlCVm!OY;{6L2VX)2=#eOpi%XdOo7BdB`?O%&ZQdK9_~)e5X5AFE#h z|0ne{nn?-QIiMM#=ejz`?R{{Zxp@{iS-q-HgZlSAO24=X87P1V2Oa2Mt$P#I;Tjh^AkiGtw8o$|~g94qAN4;r3>CFH)`sdMl1)F`$k(AW|R z9`H<3qNWp+?Ax9O2YT7F2V={;`h%}~_E{(j%lACf73o&Q=rbVc5HRj{S9)j3E|pXE zyT^J@!#FZ8M$IJ@Jlor%Of2ex+r0;=gmw==dk3ILy%$@S#R!_|%m}VmaDu^QMsTAt z$wnN(Ize2r?|M@THV$$z$~e#~&^3sL>-VO&$AR7l!qLS_$F;>4!$Mzp*DFr6OPS`- zU8>A*peq&G-ayhH)O-gq&zo0&u+mrOKx2K^5RM9R^#`Zz4ZtJJ6Z% zd77;=;Io7-fv(Zk-3pzJ+)w*bN>fqie%W{Z0Cckhz3sb0Szud!=sWB{ivIy+p{-N= zj{s@BxspD=50AfsHaem#qTx2$M@uMbqazAV6LR$jAN4-3;8yTkvo zL$}TUs)EyjX&KDCiplKdN9mZd$sZ^S`IG*yt7i zZ{|}Ry}YF3UhYIU zI}rDBK6voe@8(`!Lfp$QG*!@XFE1gU8TxG9>@p`h&543b%MO+-Wlpx!1v|?2ICR^} z_Bl{5bQjqF>Xq~xLHp_a@>kSv&9-_zy4Qm>_Y6UqMNS{ftB+!I|( zGi=>Hx|Ze(x=1Xqqs4-*@r?<7pcRO8Sp}U|vM7LY06S_O$U7;&*-c#tCLT>_9=}w2_N#TDe^nIaP z1>27h>g4B(WCy59yFp!akw{Gc|1b0#*f6Se4X8pl*;J*wz`KaG3Oy+FaiL%4^A%`S z`ia;$eZC_SrpNPX*3RkEY5!}aa?u|^HTtvo(XdTb$+Ri)E@DefEZvr+)8}Bm0)7-4 z=Ah1ePZ0TFNu$V*rK;7MCHa2^N%JvvQ7JAGj;cZ>s#3cxF?koA?U3l;U1FnIa+WA$ z(!p^y+oBX(#cIvtOYn|Lyln+lX@~GPehL4EXy1sau>2U*MMH2@QRrGwm2MN>*-OnF zo#pwVSiUZnruIK4@lzCMwPE;8#cw*!QBj8=2!-<~hVWAHReNyOiLccHcM?&8e`b(j|1+Alxh5i|IqRX$`qAs8?=qwtkTsWk{ zHB`>^Bb7_RhhZ}dC)EdreCR3%Ka$2M-y8B**BtRMN%_@~gLn$^A45V~9Fn1+pAH!f z8mwSCrox~&HGr-XKVy{UijR~rN=wB!ZH#hGMGQ1qu>?MiiYeMEdIGz;Fzu;W44(Ii zbCkO)&d{2a$10vjs^=^A;JMFx6|1!M%3r{bQMB+`uzUbJ!?;owUaTdQQ^OrvO4%CT zqQ#Y-a1LoN2p^yAjQD3arQtQ1U-%EE#_RwDCJCT1zsf>ynv}yFO zknC4}6S-I0uk5LKSi4^AIo}sy6RmtjJE+X4#0gg9hn2RQKx{JplGp0DKR7%x?twfIc)p?yEZvxD*UN6;Ak3AB#>3OZfn zvqe5n!fV&(2Q7SQv}3Fb>=VjDd-W)Jc%k0rC0qVU-u@`7Yk$FLm+$eYP7<;c21! z8PIn3^PrvXmq53R85&k#Bf=~SG*CxOmKA6Idvt_N*II)zqZY^(SZh3P7!R;U$JMQ@)0z8zGh)iewI z8c>zi(j4&XKvha&l&G`?zEw)Wt4dojuc@>R<3^!0sEQr@BGBt_K2|XY$3YKZJSlVo zs7g1|a?sn5ze=|wf0gb)&MNx+YS258n@SJSdeFz{ETnoIRK>SKXM;XT8$q9<1n3cr zNR^%@9WC*y>vt}#k5?-5;(NV|pG2d zWfH7z@695mLx7Scvc)o3_fl?_050=A-JHE8SeZlcIw3$9>_SpJvm=pCB^}-!x|WWu zC}Ad>xtBW#IWucfeYyOB+GQoJ1>LD{Z~vRtB5 zx7x)DMk#xkrZ(hD0+E^l)U z+;ZqyoQ>X;Nw(<)GHu$8rsMP!vtSMFTXK3LiFcH=Jdx>1q+4~kT(krIiMo665!GokJWJRZ%=jWv@?}S8awlg zvIfS)*2Ip4$?1%nQ=2zaL#NcS-8daeNz!iEsY}w;g-$9d7+G~)Xr$9-pU*e6W%bS! z`rdhZlFXO1%_$iU=t8tIk<07oNMI30blogQZA#CRBal){hl(pL-6MzZ<7DLE%`P|3 zAfaXH==8*uY0F}guyl;ujb-TUMHdcns4o-~IV4sh3?hR&tZh-m zmcCU_>S<(~Ls)E4Hr?B96jQY7CbYC%E{uonY|&ii3#;D3J7P2_6c9MW0O+VEP^pdp zj@mFPmK?mZ)B?>Sf-Mz~0Z(OIZp==Y9L+El`QjZDQjflIBQ^CDoa2U?d$ReKZO#s` zFr9)Erv!sPlgAW_87YzG$<5e?;Vc~<;|c?vgkP9Qr#ljz+h~E_mC9IVi!w=zlL=eO z8P5xkwkUBthtom~+Jau3{J2VvV%UoTx5Dw{5&|haIu9F}H33K@lN;?R$DY(N1sFT@ z<0uxUjl52FYO_=bWN~FN=VEiVwI^gtSe&m-Ef>kr6YQ3X=S%u{-b~82kQW^wHl|Hc z@6@sF0wdW=LR$4soyU}QUt#bBC6zw5t~R!rHa%kw2}d{N*f}6)=IFnybwJkIomNs7 zdoXJ-=ktVL?C|E)F-SPrved!Z<-i0bo!K&$bF23_S42x+TGvg%z!lh(4cLM>D(|SN zUCV*R!F)JS;3yw?TR-Z`EC@+l6||fLW2i z;#%U&X2h&)?#E1s(3|@;6E^qAR>hVgdvol8F$bGzXAeSCdyLSsG`g{GqgFJROnO|d z;zWs=&B2O>KUUAP2{S@O%)2Dp+&hIc0h|01+|3S3 zPDy=p0?U*=fQz`ev%q%Q5;=x@eq%v4($Y@CN&5*WEr4QoV+e5JES5uLu@WDPm*7}D z`UP^cc5bcuW^3n$6*RARccgpS8@rXYb`2NM$TSu3xm^dgt+v&dDi)%eJ=iD@N`ZWn z*xKf{4OT5Qvc0)f*OtOyl{uV_qmT`Grgv}(1b=g?3*(GyFj$SnurrsEqugL+d#aFj z6n)_`oGiPu=@gD7CF5e~Fn?l?)__S$$40hI&+SNcVk?UjYf||XhQ^>I&8b9J#=r@% zGmn!X23Z%6ppuy>!;yfGoO!#Atc$fWpWvxv)&^DU+l*`gIYqD*wfkE>XWSlP3GhNW5e{^EdAOXe|b>qyN&FPy{=khWkb3&YtkGgrJ zEb<&E=q(K+9+V4va3;YTg%gFb6G60g!`$C!a9thyBD8}P=QO+!F$UTCf1z2ZN`w1Nz{yAsUvUGdnwK9 zda|^1=W*tjGi?SY)O@rES7<#ch-Uw-e7ZvD{G?D2-bPlmeH5)tA{c!$%fx2U_6aOKe89Qx4BB zGq6e^rviK$KnZv!7ruO&5(nBLIEB2Ucq-b8XQ)y5O-Raal%arMj^;v2OSq&_cJ_V9czd=RI?gEyyEJ^|@sB<1!gFAJQ*z-7@e{`rT(-&}eW`SdVb91w zuDwW;qHg5C(c#i?L=tvQqO=)yJ&hgspD&~2Sf4@Z^QZ^MYX|CtNd$a7BEr$)H$GhE&Cqm_GG)pD+yl!}ou>@)LSZw) z9H9=>suwRCN^u_;Pky%S3oriP4?nwh#Z&LxTABIqYJ+@_pSNMn$m#Fybq|a96xHRa zBrS^92JWb$RFXHUs+B-mj0r?4J|PdsLar#jyY)nBRF99PK44~45Q>a(#eibWc)}A@ zPXKQ~6r>A;CvfTs0no^#ke6IaHSU}w2?t;lMNl(D;d(AXxE=}>KQ}AgEQ*MB0{c%Q zqYyLAATW)=GzL?E32;#(_BD)a+$c&+;|OR96O{?dg?g$=^$2l1(jRq2rbR|ZW>gEF z#wAO8qDmxo!@At;=LxU_B=50qZkaZrXs!2Edk^Y&qDV$p*P}r-sZD zoywre0!;`;WR4a?VYo)^T=w=zGv8K5no)7Sg?tD+-&Mo}%=w{^%1*Yxy8^^1vrG!; zbMqvZnraE!qMB+SsgZdRFm6&J@sJOHLlvsPKQE~@)zvi;jd@&(d8)^)xK$6nFh*0= zYo177pPL92e+Z%AhVGzhV5>cZu)(2^l`dp};ws_3i~4TGJ2TSy@aH$^IUepqz^!df z)9|JaFNG9(^a1197Y`nu`}6;(du06QfpISA|M1vfjGIG0yQih%%sHoJZ@xeMH)Y80 zfB&HN&bZ*JM}Kqw_vSoyaov~?&in3TFaP}RH=nq??1YC_o`28p+TXtSwU<`h(K_w+ z?|66+S5m->QERe3uVONgpuv3Aey^&U5)Zk2h_vQaA~kNW>I21a_o;!XSMiw_Iv2Ni z$cG5jglb%P6&VVJD!jhPq?%BOB{d;m4SEel;%<<>gMKt=-=R>r?=aklLe*#%h#&Hk ztGYT8kMuq1jbhlNT|!2pl<4YEKn!qnQVae^OB6+~8p?Lu#BhgHezVCLa=suPLxk$Ek{_ z2A_OcdOZJ)%4Q|HEY-m;im<3FbmEpmAv<@<6n<#CL+{?+kTBov8M&@0nQm+hg7~9} zwiQh)+m^Pp6J-=iIsC;MR_KMOxsk%YrRaIm+-OrKn&ACC{Nn#dfRhWhOM0|mSjKv^ zCC3ks^<;E;Dv5U{Qu5gHmgST9e`+AxU}TQUqxu{R4gxbiVNPUuyIQq2m&mR#GWOOJ zFLUq$MIwg32(tb^2Rt4w!fy{gzTMNr1Eaa^mzP(q|JDFz>YMtZ3EsCC5@azxuK&cl}>IzihBHU+y=Y| z(Gz*yVbG9Gc5n@*Z(?d*D>mUCHTh#{<0hvB&+T)~>GX0uBQ#&I>AJjtWt%T1P_)r$ z{15*B>j?1QxDmdYpuT~{lpc>A*kC!^EyZtLAC#Ebi&vjE9qbx>MX(Wc5%$Y%*dw;! z?;$thzJeBm=j%J#N1vPD2yk!b%e-UPEf>4wvEsa%0r)!z-g_^`PLTJ!yhG=GEnnk_ zQBWE^)ZWG5RZyk^e58=J>o}gC7MrQ4xA|{6c8!PuzNFcTw7fU&w)fhY z7jU}Z^8oMoc}Khg-&C~W9>cD61th$8UXDBO@e|0;%r%Oypi=P5J6GPvPm=wA6G{|? zqyx5GLUX6jdwky4^Nx74$T%N90Sxra(iYehPey!RVhi3)CnZ`tB{#N2ejR^9W_rlV$y(;;@Jo6%w0aG z-ymPt6kD-b;?pT*&%&>H4r9CH$Cl53=AQo8IC7e)n3xs2UDrt5@(!QVP`;`5kEjvf z1S!&!%ov*|z*23UW#BgD_HB@e;+%+UAMtlP%aBhOO2yyZ@R_eyYSSf=!k1lxWZVV| zCH^N%KbwKmj>*kNn>h1~B0mEyU%)AtdkeSUVo1z$-M~J+RO({(0<*7iiHdRNnwc%= z^nbiMwM+Y~L~aIZ%IDd_fcAH$FZKDq-!63+pZvv>)910RW3~;uK#us_&>y}=ga^A literal 32768 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 diff --git a/test/Spring/Spring.Data.NHibernate.Integration.Tests/Spring.Data.NHibernate.Integration.Tests.2003.csproj b/test/Spring/Spring.Data.NHibernate.Integration.Tests/Spring.Data.NHibernate.Integration.Tests.2003.csproj index 175e4527..a3823a90 100644 --- a/test/Spring/Spring.Data.NHibernate.Integration.Tests/Spring.Data.NHibernate.Integration.Tests.2003.csproj +++ b/test/Spring/Spring.Data.NHibernate.Integration.Tests/Spring.Data.NHibernate.Integration.Tests.2003.csproj @@ -79,16 +79,6 @@ AssemblyName = "System.Xml" HintPath = "C:\WINDOWS\Microsoft.NET\Framework\v1.1.4322\System.XML.dll" /> - - + + + + +