[seam-commits] Seam SVN: r10215 - in trunk: examples and 15 other directories.

seam-commits at lists.jboss.org seam-commits at lists.jboss.org
Thu Mar 26 03:42:18 EDT 2009


Author: christian.bauer at jboss.com
Date: 2009-03-26 03:42:18 -0400 (Thu, 26 Mar 2009)
New Revision: 10215

Added:
   trunk/examples/restbay/
   trunk/examples/restbay/build.xml
   trunk/examples/restbay/readme.txt
   trunk/examples/restbay/resources/
   trunk/examples/restbay/resources/META-INF/
   trunk/examples/restbay/resources/META-INF/application.xml
   trunk/examples/restbay/resources/META-INF/ejb-jar.xml
   trunk/examples/restbay/resources/META-INF/jboss-app.xml
   trunk/examples/restbay/resources/META-INF/persistence.xml
   trunk/examples/restbay/resources/WEB-INF/
   trunk/examples/restbay/resources/WEB-INF/components.xml
   trunk/examples/restbay/resources/WEB-INF/faces-config.xml
   trunk/examples/restbay/resources/WEB-INF/pages.xml
   trunk/examples/restbay/resources/WEB-INF/web.xml
   trunk/examples/restbay/resources/components.properties
   trunk/examples/restbay/resources/import.sql
   trunk/examples/restbay/resources/jboss-rest-bay-ds.xml
   trunk/examples/restbay/resources/log4j.xml
   trunk/examples/restbay/resources/seam.properties
   trunk/examples/restbay/src/
   trunk/examples/restbay/src/org/
   trunk/examples/restbay/src/org/jboss/
   trunk/examples/restbay/src/org/jboss/seam/
   trunk/examples/restbay/src/org/jboss/seam/example/
   trunk/examples/restbay/src/org/jboss/seam/example/restbay/
   trunk/examples/restbay/src/org/jboss/seam/example/restbay/Aargh.java
   trunk/examples/restbay/src/org/jboss/seam/example/restbay/Account.java
   trunk/examples/restbay/src/org/jboss/seam/example/restbay/Auction.java
   trunk/examples/restbay/src/org/jboss/seam/example/restbay/AuctionEndAction.java
   trunk/examples/restbay/src/org/jboss/seam/example/restbay/AuctionImage.java
   trunk/examples/restbay/src/org/jboss/seam/example/restbay/AuctionService.java
   trunk/examples/restbay/src/org/jboss/seam/example/restbay/Bid.java
   trunk/examples/restbay/src/org/jboss/seam/example/restbay/Category.java
   trunk/examples/restbay/src/org/jboss/seam/example/restbay/CategoryService.java
   trunk/examples/restbay/src/org/jboss/seam/example/restbay/CategoryServiceImpl.java
   trunk/examples/restbay/src/org/jboss/seam/example/restbay/Feedback.java
   trunk/examples/restbay/src/org/jboss/seam/example/restbay/User.java
   trunk/examples/restbay/src/org/jboss/seam/example/restbay/resteasy/
   trunk/examples/restbay/src/org/jboss/seam/example/restbay/resteasy/CalendarConverter.java
   trunk/examples/restbay/src/org/jboss/seam/example/restbay/resteasy/CalendarResource.java
   trunk/examples/restbay/src/org/jboss/seam/example/restbay/resteasy/SubResource.java
   trunk/examples/restbay/src/org/jboss/seam/example/restbay/resteasy/TestForm.java
   trunk/examples/restbay/src/org/jboss/seam/example/restbay/resteasy/TestProvider.java
   trunk/examples/restbay/src/org/jboss/seam/example/restbay/resteasy/TestResource.java
   trunk/examples/restbay/src/org/jboss/seam/example/restbay/test/
   trunk/examples/restbay/src/org/jboss/seam/example/restbay/test/AuctionServiceTest.java
   trunk/examples/restbay/src/org/jboss/seam/example/restbay/test/BasicServiceTest.java
   trunk/examples/restbay/src/org/jboss/seam/example/restbay/test/fwk/
   trunk/examples/restbay/src/org/jboss/seam/example/restbay/test/fwk/DelegatingServletInputStream.java
   trunk/examples/restbay/src/org/jboss/seam/example/restbay/test/fwk/DelegatingServletOutputStream.java
   trunk/examples/restbay/src/org/jboss/seam/example/restbay/test/fwk/HeaderValueHolder.java
   trunk/examples/restbay/src/org/jboss/seam/example/restbay/test/fwk/MockHttpServletRequest.java
   trunk/examples/restbay/src/org/jboss/seam/example/restbay/test/fwk/MockHttpServletResponse.java
   trunk/examples/restbay/src/org/jboss/seam/example/restbay/test/fwk/MockRequestDispatcher.java
   trunk/examples/restbay/src/org/jboss/seam/example/restbay/test/fwk/ResourceSeamTest.java
   trunk/examples/restbay/src/org/jboss/seam/example/restbay/test/testng.xml
   trunk/examples/restbay/view/
   trunk/examples/restbay/view/index.html
Modified:
   trunk/build.xml
   trunk/examples/build.xml
   trunk/examples/readme.txt
   trunk/src/main/org/jboss/seam/mock/AbstractSeamTest.java
Log:
JBSEAM-4033, new REST example application with unit tests

Modified: trunk/build.xml
===================================================================
--- trunk/build.xml	2009-03-25 21:32:34 UTC (rev 10214)
+++ trunk/build.xml	2009-03-26 07:42:18 UTC (rev 10215)
@@ -458,6 +458,7 @@
 		<cleanexample name="seamdiscs" />
 		<cleanexample name="icefaces" />
 		<cleanexample name="seambay" />
+		<cleanexample name="restbay" />
 		<cleanexample name="nestedbooking" />
 		<cleanexample name="wicket" />
 	</target>
@@ -492,6 +493,7 @@
 		<undeployexample name="seamdiscs" />
 		<undeployexample name="icefaces" />
 		<undeployexample name="seambay" />
+		<undeployexample name="restbay" />
 		<undeployexample name="nestedbooking" />
 		<undeployexample name="wicket" />
 	</target>
@@ -508,6 +510,7 @@
 		<testexample name="blog" />
 		<testexample name="seamdiscs" />
 		<testexample name="seambay" />
+		<testexample name="restbay" />
 		<testexample name="seamspace" />
 		<testexample name="drools" />
 		<testexample name="mail" />
@@ -557,6 +560,7 @@
 		<ant dir="examples/remoting/progressbar" target="validateConfiguration" inheritall="false" />
 		<ant dir="examples/rss" target="validateConfiguration" inheritall="false" />
 		<ant dir="examples/seambay" target="validateConfiguration" inheritall="false" />
+		<ant dir="examples/restbay" target="validateConfiguration" inheritall="false" />
 		<ant dir="examples/seamdiscs" target="validateConfiguration" inheritall="false" />
 		<!--<ant dir="examples/seampay" target="validateConfiguration" inheritall="false" />-->
 		<ant dir="examples/seamspace" target="validateConfiguration" inheritall="false" />
@@ -648,6 +652,7 @@
 				<include name="excel/**/*" />
 				<include name="rss/**/*" />
 				<include name="seambay/**/*" />
+				<include name="restbay/**/*" />
 				<include name="seampay/**/*" />
 				<include name="seamspace/**/*" />
 				<include name="mail/**/*" />

Modified: trunk/examples/build.xml
===================================================================
--- trunk/examples/build.xml	2009-03-25 21:32:34 UTC (rev 10214)
+++ trunk/examples/build.xml	2009-03-26 07:42:18 UTC (rev 10215)
@@ -222,12 +222,21 @@
 		<include name="slf4j-log4j12.jar" if="seam.wicket.lib" />
 	</fileset>
 
+	<!-- Seam RESTEasy integration, with required dependencies -->
+	<fileset id="seam.resteasy.jar" dir="${lib.dir}">
+		<include name="jboss-seam-resteasy.jar" if="seam.resteasy.lib" />
+		<include name="jaxrs-api.jar" if="seam.resteasy.lib" />
+		<include name="resteasy-jaxrs.jar" if="seam.resteasy.lib" />
+		<include name="slf4j-api.jar" if="seam.resteasy.lib" />
+		<include name="slf4j-log4j12.jar" if="seam.resteasy.lib" />
+	</fileset>
+
 	<!-- jboss-el -->
 	<fileset id="jboss-el.jar" dir="${lib.dir}">
 		<include name="jboss-el.jar" />
 	</fileset>
 
-	<!-- Dependencies for using Seam with JSF - only needed if the server 
+	<!-- Dependencies for using Seam with JSF - only needed if the server
 	     doesn't come with JSF! -->
 	<fileset id="jsf.jar" dir="${lib.dir}">
 		<include name="jsf-api.jar" />
@@ -708,6 +717,7 @@
 			<fileset refid="wicket-extensions.jar" />
 			<fileset refid="wicket-datetime.jar" />
 			<fileset refid="seam.wicket.jar" />
+			<fileset refid="seam.resteasy.jar" />
 			<fileset refid="seam.remoting.jar" />
 			<fileset refid="el-ri.jar" />
 			<fileset refid="trinidad-api.jar" />
@@ -960,6 +970,7 @@
 			<fileset refid="wicket-extensions.jar" />
 			<fileset refid="wicket-datetime.jar" />
 			<fileset refid="seam.wicket.jar" />
+         <fileset refid="seam.resteasy.jar" />
 			<fileset refid="trinidad-api.jar" />
 			<fileset refid="el-ri.jar"/>
 			<mapper type="flatten" />

Modified: trunk/examples/readme.txt
===================================================================
--- trunk/examples/readme.txt	2009-03-25 21:32:34 UTC (rev 10214)
+++ trunk/examples/readme.txt	2009-03-26 07:42:18 UTC (rev 10215)
@@ -70,6 +70,8 @@
                       
 remoting/progressbar/ An example of an Ajax progress bar.
 
+restbay/              An example of using Seam with JAX-RS plain HTTP Web Services.
+
 seambay/              An example of using Seam with Web Services.
 
 seamdiscs/            Demonstrates Seam, Trinidad, Ajax4jsf and Richfaces.

Added: trunk/examples/restbay/build.xml
===================================================================
--- trunk/examples/restbay/build.xml	                        (rev 0)
+++ trunk/examples/restbay/build.xml	2009-03-26 07:42:18 UTC (rev 10215)
@@ -0,0 +1,20 @@
+<?xml version="1.0"?>
+
+      
+<project name="RestBay" default="deploy" basedir=".">
+
+    <!-- Example name -->
+    <property name="Name"              value="RestBay Example"/>
+    <property name="example.name"      value="jboss-rest-bay"/>
+
+    <!-- Libraries -->
+    <property name="facelets.lib"      value="yes"/>
+    <property name="seam.ui.lib"       value="yes"/>
+    <property name="seam.resteasy.lib" value="yes"/>
+    
+    <property name="example.ds"        value="jboss-rest-bay-ds.xml"/>
+
+    <import file="../build.xml"/>
+
+</project>
+

Added: trunk/examples/restbay/readme.txt
===================================================================
--- trunk/examples/restbay/readme.txt	                        (rev 0)
+++ trunk/examples/restbay/readme.txt	2009-03-26 07:42:18 UTC (rev 10215)
@@ -0,0 +1,8 @@
+RestBay Example
+===============
+
+This example shows Seam/JAX-RS RESTful HTTP webservices integration.
+Deployment on Tomcat has not been tested, use JBoss AS.
+
+Visit http://localhost:8080/rest-bay on JBoss AS
+

Added: trunk/examples/restbay/resources/META-INF/application.xml
===================================================================
--- trunk/examples/restbay/resources/META-INF/application.xml	                        (rev 0)
+++ trunk/examples/restbay/resources/META-INF/application.xml	2009-03-26 07:42:18 UTC (rev 10215)
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<application xmlns="http://java.sun.com/xml/ns/javaee" 
+             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+             xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/application_5.xsd"
+             version="5">
+             
+  <display-name>RestBay</display-name>
+
+  <module>
+    <web>
+      <web-uri>jboss-rest-bay.war</web-uri>
+      <context-root>/rest-bay</context-root>
+    </web>
+  </module>
+  
+  <module>
+    <ejb>jboss-rest-bay.jar</ejb>
+  </module>
+  
+  <module>
+    <ejb>jboss-seam.jar</ejb>
+  </module>
+  
+</application>

Added: trunk/examples/restbay/resources/META-INF/ejb-jar.xml
===================================================================
--- trunk/examples/restbay/resources/META-INF/ejb-jar.xml	                        (rev 0)
+++ trunk/examples/restbay/resources/META-INF/ejb-jar.xml	2009-03-26 07:42:18 UTC (rev 10215)
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ejb-jar xmlns="http://java.sun.com/xml/ns/javaee" 
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
+         xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/ejb-jar_3_0.xsd"
+         version="3.0">
+         
+   <interceptors>
+     <interceptor>
+       <interceptor-class>org.jboss.seam.ejb.SeamInterceptor</interceptor-class>
+     </interceptor>
+   </interceptors>
+   
+   <assembly-descriptor>
+      <interceptor-binding>
+         <ejb-name>*</ejb-name>
+         <interceptor-class>org.jboss.seam.ejb.SeamInterceptor</interceptor-class>
+      </interceptor-binding>
+   </assembly-descriptor>
+   
+</ejb-jar>

Added: trunk/examples/restbay/resources/META-INF/jboss-app.xml
===================================================================
--- trunk/examples/restbay/resources/META-INF/jboss-app.xml	                        (rev 0)
+++ trunk/examples/restbay/resources/META-INF/jboss-app.xml	2009-03-26 07:42:18 UTC (rev 10215)
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+  <!DOCTYPE jboss-app
+    PUBLIC "-//JBoss//DTD J2EE Application 4.2//EN"
+    "http://www.jboss.org/j2ee/dtd/jboss-app_4_2.dtd">
+
+<jboss-app>
+      <loader-repository> 
+      seam.jboss.org:loader=rest-bay
+      </loader-repository> 
+</jboss-app> 
\ No newline at end of file

Added: trunk/examples/restbay/resources/META-INF/persistence.xml
===================================================================
--- trunk/examples/restbay/resources/META-INF/persistence.xml	                        (rev 0)
+++ trunk/examples/restbay/resources/META-INF/persistence.xml	2009-03-26 07:42:18 UTC (rev 10215)
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<persistence xmlns="http://java.sun.com/xml/ns/persistence" 
+             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+             xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd" 
+             version="1.0">
+   <persistence-unit name="restbayDatabase">
+      <provider>org.hibernate.ejb.HibernatePersistence</provider>
+      <jta-data-source>java:/restbayDatasource</jta-data-source>
+      <properties>
+         <property name="hibernate.hbm2ddl.auto" value="create-drop"/>
+         <property name="hibernate.show_sql" value="false"/>
+         <!-- These are the default for JBoss EJB3, but not for HEM: -->
+         <property name="hibernate.cache.provider_class" value="org.hibernate.cache.NoCacheProvider"/>
+         <property name="hibernate.transaction.manager_lookup_class" value="org.hibernate.transaction.JBossTransactionManagerLookup"/>
+         <property name="jboss.entity.manager.factory.jndi.name" value="java:/restbayEntityManagerFactory"/>
+      </properties>
+   </persistence-unit>
+</persistence>
\ No newline at end of file

Added: trunk/examples/restbay/resources/WEB-INF/components.xml
===================================================================
--- trunk/examples/restbay/resources/WEB-INF/components.xml	                        (rev 0)
+++ trunk/examples/restbay/resources/WEB-INF/components.xml	2009-03-26 07:42:18 UTC (rev 10215)
@@ -0,0 +1,35 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<components xmlns="http://jboss.com/products/seam/components"
+            xmlns:core="http://jboss.com/products/seam/core"
+            xmlns:persistence="http://jboss.com/products/seam/persistence"
+            xmlns:security="http://jboss.com/products/seam/security"
+            xmlns:drools="http://jboss.com/products/seam/drools"
+            xmlns:async="http://jboss.com/products/seam/async"
+            xmlns:web="http://jboss.com/products/seam/web"
+            xmlns:resteasy="http://jboss.com/products/seam/resteasy"
+            xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+            xsi:schemaLocation=
+                "http://jboss.com/products/seam/core http://jboss.com/products/seam/core-2.1.xsd
+                 http://jboss.com/products/seam/persistence http://jboss.com/products/seam/persistence-2.1.xsd 
+                 http://jboss.com/products/seam/components http://jboss.com/products/seam/components-2.1.xsd
+                 http://jboss.com/products/seam/security http://jboss.com/products/seam/security-2.1.xsd
+                 http://jboss.com/products/seam/async http://jboss.com/products/seam/async-2.1.xsd
+                 http://jboss.com/products/seam/web http://jboss.com/products/seam/web-2.1.xsd
+                 http://jboss.com/products/seam/resteasy http://jboss.com/products/seam/resteasy-2.1.xsd
+                 http://jboss.com/products/seam/drools http://jboss.com/products/seam/drools-2.1.xsd">
+
+    <core:init jndi-pattern="@jndiPattern@" debug="true"/>
+ 
+    <core:manager conversation-timeout="120000" 
+                  concurrent-request-timeout="500"
+                  conversation-id-parameter="cid"/>
+    
+    <persistence:managed-persistence-context name="entityManager" auto-create="true"
+                persistence-unit-jndi-name="java:/restbayEntityManagerFactory"/>
+
+    <async:quartz-dispatcher/>
+
+    <resteasy:application resource-path-prefix="/restv1">
+    </resteasy:application>
+
+</components>

Added: trunk/examples/restbay/resources/WEB-INF/faces-config.xml
===================================================================
--- trunk/examples/restbay/resources/WEB-INF/faces-config.xml	                        (rev 0)
+++ trunk/examples/restbay/resources/WEB-INF/faces-config.xml	2009-03-26 07:42:18 UTC (rev 10215)
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<faces-config version="1.2"
+              xmlns="http://java.sun.com/xml/ns/javaee"
+              xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+              xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-facesconfig_1_2.xsd">
+
+    <application>
+        <view-handler>com.sun.facelets.FaceletViewHandler</view-handler>
+    </application>
+
+</faces-config>

Added: trunk/examples/restbay/resources/WEB-INF/pages.xml
===================================================================
--- trunk/examples/restbay/resources/WEB-INF/pages.xml	                        (rev 0)
+++ trunk/examples/restbay/resources/WEB-INF/pages.xml	2009-03-26 07:42:18 UTC (rev 10215)
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<pages xmlns="http://jboss.com/products/seam/pages"
+       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+       xsi:schemaLocation="http://jboss.com/products/seam/pages http://jboss.com/products/seam/pages-2.1.xsd">
+
+    <exception class="java.lang.UnsupportedOperationException" log="false">
+        <http-error error-code="501">
+            <message>The request operation is not supported: #{org.jboss.seam.handledException.message}</message>
+        </http-error>
+    </exception>
+       
+</pages>

Added: trunk/examples/restbay/resources/WEB-INF/web.xml
===================================================================
--- trunk/examples/restbay/resources/WEB-INF/web.xml	                        (rev 0)
+++ trunk/examples/restbay/resources/WEB-INF/web.xml	2009-03-26 07:42:18 UTC (rev 10215)
@@ -0,0 +1,93 @@
+<?xml version="1.0" ?>
+<web-app xmlns="http://java.sun.com/xml/ns/javaee"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
+         version="2.5">
+
+    <!-- Seam -->
+
+    <listener>
+       <listener-class>org.jboss.seam.servlet.SeamListener</listener-class>
+    </listener>
+
+     <filter>
+         <filter-name>Seam Filter</filter-name>
+         <filter-class>org.jboss.seam.servlet.SeamFilter</filter-class>
+     </filter>
+
+     <filter-mapping>
+         <filter-name>Seam Filter</filter-name>
+         <url-pattern>/*</url-pattern>
+     </filter-mapping>
+
+    <servlet>
+       <servlet-name>Seam Resource Servlet</servlet-name>
+       <servlet-class>org.jboss.seam.servlet.SeamResourceServlet</servlet-class>
+    </servlet>
+
+    <servlet-mapping>
+       <servlet-name>Seam Resource Servlet</servlet-name>
+       <url-pattern>/seam/resource/*</url-pattern>
+    </servlet-mapping>
+
+   <!-- Facelets development mode (disable in production) -->
+
+   <context-param>
+       <param-name>facelets.DEVELOPMENT</param-name>
+       <param-value>false</param-value>
+   </context-param>
+
+    <context-param>
+        <param-name>facelets.SKIP_COMMENTS</param-name>
+        <param-value>true</param-value>
+    </context-param>
+
+    <!-- JSF -->
+
+    <context-param>
+       <param-name>javax.faces.DEFAULT_SUFFIX</param-name>
+       <param-value>.xhtml</param-value>
+    </context-param>
+
+    <context-param>
+        <param-name>com.sun.faces.numberOfViewsInSession</param-name>
+        <param-value>15</param-value>
+    </context-param>
+
+    <context-param>
+        <param-name>com.sun.faces.numberOfLogicalViews</param-name>
+        <param-value>15</param-value>
+    </context-param>
+
+    <context-param>
+        <param-name>com.sun.faces.responseBufferSize</param-name>
+        <param-value>32768</param-value>
+    </context-param>
+
+    <servlet>
+       <servlet-name>Faces Servlet</servlet-name>
+       <servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
+       <load-on-startup>1</load-on-startup>
+    </servlet>
+
+    <servlet-mapping>
+       <servlet-name>Faces Servlet</servlet-name>
+       <url-pattern>*.seam</url-pattern>
+    </servlet-mapping>
+
+    <security-constraint>
+        <display-name>Restrict raw XHTML Documents</display-name>
+        <web-resource-collection>
+            <web-resource-name>XHTML</web-resource-name>
+            <url-pattern>*.xhtml</url-pattern>
+        </web-resource-collection>
+        <auth-constraint>
+            <role-name>NONE</role-name>
+        </auth-constraint>
+    </security-constraint>
+
+    <session-config>
+        <session-timeout>10</session-timeout>
+    </session-config>
+
+</web-app>
\ No newline at end of file

Added: trunk/examples/restbay/resources/components.properties
===================================================================
--- trunk/examples/restbay/resources/components.properties	                        (rev 0)
+++ trunk/examples/restbay/resources/components.properties	2009-03-26 07:42:18 UTC (rev 10215)
@@ -0,0 +1,3 @@
+# The pattern in components.xml is replaced by an application server specific value in the ant build. This value is used for running tests
+
+jndiPattern \#{ejbName}/local
\ No newline at end of file

Added: trunk/examples/restbay/resources/import.sql
===================================================================
--- trunk/examples/restbay/resources/import.sql	                        (rev 0)
+++ trunk/examples/restbay/resources/import.sql	2009-03-26 07:42:18 UTC (rev 10215)
@@ -0,0 +1,108 @@
+insert into category (categoryId, name) values (1, 'Antiques');
+  insert into category (categoryId, name, parent_category_id) values (1001, 'Furniture', 1);
+  insert into category (categoryId, name, parent_category_id) values (1002, 'Silverware', 1);  
+
+insert into category (categoryId, name) values (2, 'Art');
+  insert into category (categoryId, name, parent_category_id) values (2001, 'Paintings', 2);
+  insert into category (categoryId, name, parent_category_id) values (2002, 'Prints', 2);
+  insert into category (categoryId, name, parent_category_id) values (2003, 'Sculptures', 2);
+
+insert into category (categoryId, name) values (3, 'Books');
+  insert into category (categoryId, name, parent_category_id) values (3001, 'Fiction', 3);
+  insert into category (categoryId, name, parent_category_id) values (3002, 'Non Fiction', 3);
+  insert into category (categoryId, name, parent_category_id) values (3003, 'Comic Books', 3);
+  insert into category (categoryId, name, parent_category_id) values (3004, 'Children', 3);
+  
+insert into category (categoryId, name) values (4, 'Cameras and Photography');
+  insert into category (categoryId, name, parent_category_id) values (4001, 'Digital Cameras', 4);
+  insert into category (categoryId, name, parent_category_id) values (4002, 'Memory Cards', 4);
+  insert into category (categoryId, name, parent_category_id) values (4003, 'Film Cameras', 4);
+  insert into category (categoryId, name, parent_category_id) values (4004, 'Video Cameras', 4);
+  
+insert into category (categoryId, name) values (5, 'Cars and Boats');
+  insert into category (categoryId, name, parent_category_id) values (5001, 'Cars', 5);
+  insert into category (categoryId, name, parent_category_id) values (5002, 'Motorcycles', 5);
+  insert into category (categoryId, name, parent_category_id) values (5003, 'Car Parts', 5);
+
+insert into category (categoryId, name) values (6, 'Cell Phones');
+  insert into category (categoryId, name, parent_category_id) values (6001, 'Mobile Phones', 6);
+  insert into category (categoryId, name, parent_category_id) values (6002, 'Mobile Accessories', 6);
+  insert into category (categoryId, name, parent_category_id) values (6003, 'Prepaid cards', 6);
+
+insert into category (categoryId, name) values (7, 'Clothing and Shoes');
+  insert into category (categoryId, name, parent_category_id) values (7001, 'Women', 7);
+  insert into category (categoryId, name, parent_category_id) values (7002, 'Men', 7);
+  insert into category (categoryId, name, parent_category_id) values (7003, 'Girls', 7);
+  insert into category (categoryId, name, parent_category_id) values (7004, 'Boys', 7);
+  insert into category (categoryId, name, parent_category_id) values (7005, 'Babies', 7);
+
+insert into category (categoryId, name) values (8, 'Computers');
+  insert into category (categoryId, name, parent_category_id) values (8001, 'Notebooks', 8);
+  insert into category (categoryId, name, parent_category_id) values (8002, 'Desktop PCs', 8);
+  insert into category (categoryId, name, parent_category_id) values (8003, 'Servers', 8);
+  insert into category (categoryId, name, parent_category_id) values (8004, 'Hardware', 8);
+  insert into category (categoryId, name, parent_category_id) values (8005, 'Software', 8);
+  
+insert into category (categoryId, name) values (9, 'Music');
+  insert into category (categoryId, name, parent_category_id) values (9001, 'CDs', 9);
+  insert into category (categoryId, name, parent_category_id) values (9002, 'Records', 9);
+
+insert into category (categoryId, name) values (10, 'Electronics');
+  insert into category (categoryId, name, parent_category_id) values (10001, 'Home Audio', 10);
+  insert into category (categoryId, name, parent_category_id) values (10002, 'MP3 Players', 10);
+  insert into category (categoryId, name, parent_category_id) values (10003, 'Television', 10);
+  insert into category (categoryId, name, parent_category_id) values (10004, 'Home theatre', 10);
+
+insert into category (categoryId, name) values (11, 'Home and Garden');
+  insert into category (categoryId, name, parent_category_id) values (11001, 'Kitchen', 11);
+  insert into category (categoryId, name, parent_category_id) values (11002, 'Real Estate', 11);
+  insert into category (categoryId, name, parent_category_id) values (11003, 'Furniture', 11);
+
+insert into category (categoryId, name) values (12, 'Musical Instruments');
+  insert into category (categoryId, name, parent_category_id) values (12001, 'Guitars', 12);
+  insert into category (categoryId, name, parent_category_id) values (12002, 'Pianos and Keyboards', 12);
+  insert into category (categoryId, name, parent_category_id) values (12003, 'Percussion', 12);
+  insert into category (categoryId, name, parent_category_id) values (12004, 'Orchestral', 12);
+
+insert into category (categoryId, name) values (13, 'Sporting goods');
+  insert into category (categoryId, name, parent_category_id) values (13001, 'Golf', 13);
+  insert into category (categoryId, name, parent_category_id) values (13002, 'Fishing', 13);
+  insert into category (categoryId, name, parent_category_id) values (13003, 'Tennis', 13);  
+
+insert into category (categoryId, name) values (14, 'Toys');
+  insert into category (categoryId, name, parent_category_id) values (14001, 'Remote control', 14);
+  insert into category (categoryId, name, parent_category_id) values (14002, 'Cars and trucks', 14);
+  insert into category (categoryId, name, parent_category_id) values (14003, 'Dolls', 14);
+  insert into category (categoryId, name, parent_category_id) values (14004, 'Educational', 14);
+
+insert into category (categoryId, name) values (15, 'Video Games');
+  insert into category (categoryId, name, parent_category_id) values (15001, 'PC', 15);
+  insert into category (categoryId, name, parent_category_id) values (15002, 'Nintendo Wii', 15);
+  insert into category (categoryId, name, parent_category_id) values (15003, 'Sony Playstation 3', 15);
+  insert into category (categoryId, name, parent_category_id) values (15004, 'XBox 360', 15);
+
+insert into account (accountId, name, feedbackScore, feedbackPercent, memberSince, location) values (1, 'honestjoe', 0, 0, CURRENT_TIMESTAMP, 'Sydney, NSW, Australia');
+insert into user (userId, username, password, account_id) values (1, 'demo', 'demo', 1);
+
+insert into account (accountId, name, feedbackScore, feedbackPercent, memberSince, location) values (2, 'bob', 0, 0, CURRENT_TIMESTAMP, 'Brisbane, QLD, Australia');
+insert into user (userId, username, password, account_id) values (2, 'bob', 'bob', 2);
+
+insert into auction (auctionId, account_id, title, description, category_Id, startingPrice, bids, endDate, status, version) values (19264723, 1, 'Whistler''s Mother, original painting by James McNeill Whistler', '+Whistler''s Mother'+char(10)+'*Arrangement in Grey and Black*: The Artist''s Mother, famous under its colloquial name Whistler''s Mother, is an 1871 oil-on-canvas painting by American-born painter James McNeill Whistler. The painting is 56.81 x 63.94 inches (144.3 x 162.4 cm), displayed in a frame of Whistler''s own design, and is currently owned by the Musée d''Orsay in Paris.', 2, 5999999.00, 0, CURRENT_TIMESTAMP, 1, 0);
+insert into auction (auctionId, account_id, title, description, category_Id, startingPrice, bids, endDate, status, version) values (62748261, 1, 'Lost Tales Volume 1 by J.R.R. Tolkien', 'THE BOOK OF LOST TALES, I, stands at the beginning of the entire conception of Middle-earth and Valinor. Here is the whole, glorious history of Middle-earth that J.R.R. Tolkien brought to mythic and dramatic life with his classic fantasy novels of the Ring Cycle.', 3, 4.50, 0, CURRENT_TIMESTAMP, 1, 0);
+insert into auction (auctionId, account_id, title, description, category_Id, startingPrice, bids, endDate, status, version) values (71234567, 1, 'Nikon D80 Digital Camera', 'The D80 features a new 10.2 effective megapixel DX Format CCD image sensor, bringing a new level of high resolution and sharp detail to the class while also providing plenty of freedom to crop creatively and print impressive enlargements. Nikon''s DX Format sensor and Nikon F bayonet lens mount design assure unprecedented compatibility across the comprehensive assortment of AF Nikkor lenses and DX Nikkor lenses designed exclusively for Nikon digital SLR cameras.', 4001, 899, 0, CURRENT_TIMESTAMP, 1, 0);
+insert into auction (auctionId, account_id, title, description, category_Id, startingPrice, bids, endDate, status, version) values (73219532, 1, 'Pontiac Firebird Trans Am T-top', 'In good condition, this car has had some custom work done on it.', 5001, 199000, 0, CURRENT_TIMESTAMP, 1, 0);
+
+insert into auctionImage (imageId, auction_id, data) values (1, 19264723, '89504E470D0A1A0A0000000D49484452000000C8000000B7080300000060F2E1B80000000467414D410000AFC837058AE90000001974455874536F6674776172650041646F626520496D616765526561647971C9653C00000300504C5445956836B5874746423BCAA6764A4541A67636CAA5695B5653D8AC75D5A967E5B877F8D699ECC589BA9877BB9457D9B687865419767267A39C8E3A3532DAB578E8C996A88557AB8764885922CAA884E5BB87030203716D63F9E8B6504B466D6962CDA45B615D54D9CEB0B48A67DBC78D956A44413B3899958E9B724634291469655C513211956527FCE7A9764817ABA49AB8B4A8867B69F4CB888B6335A47B574437229B755621180FE7C27B845933F7DAA7171211DAB99527221835302B8B6445AD8348C39D75BDA56D302B27DAB369514732FEF9CB7B542759544C2B2722BB8C5255514BC4945AD3AD856239128A8479F2CE957B55339E6F38FEFCD5694624ECD5A8726A5BEDD6B4AF833B764B2365615A8B6027EAD79A928B77684219AB7B40C59C63FCFBE7EACCA4BC8D5B93621B0F0909BB9248B48C51CC9C63C5964BFBE19E645448C493533A2F1AB2AEA6C59B5CA37B416D695D4A402BCFB287B4946CC49D6BF7D48FFDEEC255442!
 7AC7C4BBC9361F3DCB61910099D8766B38C5CB38451CC9B5BA27340C59562656155E3D9C5A37D62ADA9A2A37B4BBC946C7C4F185D594FC49B51B58D71CFC0A5CCB477B493627B786FEFE6A5BD9C6E865C41A99476BD9B61CC9D6BE8D38CFDF1B5CBB7966A6354776346C49E81956D51B17D448B836DDECFC48A6A52C38D57A3744BCBAC9030260D634A36BCA2852B1F0DF2D0A69F8258785A40AD8F67C8B06AA9A4908F5C25CB9B53724931EFE4B1E8CDB2B2AC9CAB8C6EB2855E9B927E6753397B715D555144EDE6C4D5AD918D755AC4956C594219634C44754410BEA25BB59C6BC08D49544D4EB9B49D523A21C9965CD3A1665C534566604C673A20584E38140C0FCA9651453C3D896F489F6D44F9EED99D6F2D877F8F7C75896D6A53746C79B07D53332C2DB49B616C502AD19D58824E21BA8550655E61AB754BA88F5CA87540905F35412D1F69676EBB865E5E5A43E1AF643C383E6E400F2E2F2A6F70630808092B2B2D0C0C0C101010231D1B906F3FBEBAAE303131A07052BE8E6552403048414D4B22051E1F1E55564555594DE0C09D755C50EBF67C9B000059A54944415478DA947D0D405475BAFE611860401CD44140C481B9CA0888BA32201032A068CC0CA032192124709D1052888FC4829071600D1DBD6A1AD49AE24DB2D034AB5D35D9D25259C592D0E5DE56B6841!
 233C9908F75D5ACF6FFBCBFDF9901DBFAEFDEF7CC9C3973E683DF739EF7793F7EE7E80
813B6CE733C24DBB2658BA727BB61D9E2E1E13145B4FF98F2F87F3C8A85DB7FC17E47F7DFFDE977AF4D7863DEE9835BBDC367CF0E0F0AAA0D9FBD7BC78EC0B8B8DDBBE376C7ED78737720B67607CE6E9C8D175E5DBF7EED57DEDE6BBDBCB71E3CBDC5D1D171DEF6795BB73BCEAD3AB861DEBCEDA7B756797D75B06AF576AF83AB0F1E38F8E21BA74FCF3B3D6FDEE9D378DF3CDCEB2ACA1C0F39CF8BF2F49C327E8A876F94E74B51535EC2B2E5A1C71F7F61E5F4C7C7BF347DFABBE385A7BD77874FBE535D5D9D5396EF2C93796E993265FCF8F118FEF277FFC8ECE13FFFF93F6921FBF37F8A1BB4FDC73FFF71D273FBC7CFF1F8C92305D0531CE7CE1D3DD97BF3E4F5DEDE9347CF1DBD7AF2C10D1B566F98BB61F4E6D1BBDE4F714C9930E1FDF7E7FCF4D34F53F0D6146CCC99F274CA1C0CCD23E5FD091352764DD8B56BF491CD4746C3C68D1EBD79F2E4A3F81E7CDDE60DB0C978EA15EE153EFBEF383CBBE3E2E202777F10B77B08C7E940ED8103B387BCBC85B9291ECE516BC2606B56329BFEC2CB640F3FFC08378CF991FF7CC0FEFC9F8FFCF9E13F3FFCF033CFBC3CFDF197A64C719F12E5EBE9BBC5D5B92EC739A7AEA2AE2CC7D9D959764876C8D939C0795ED9860D39756565CECE8E8E4F83E9C741B387C7168F2D5BE61D3A346FDE3CF802764F90793C3D65CAD3F31C7138!
 B6E0131B1CE74E98B07AF5DC37DE7074F4240E1D1D274C709CE0F1BBA727BC9F3267CEEF5E7BEDB5378076F3E60D9B374C1EFDE2FAF5B385C98E390EE90E9B563CB962935BD4FCF9F3A3C85E82AD7C41B497B1D08DECDD77DF7DE171BC88D1E0BE65CAA153F3B71C0A381570EAED804D9B56380504ACC3E3A64DEB3605B8060404DC0808983FDFD575BE6B80AB9B9BE77CCFA8299E51519EF3E1249EF4A7B03FE05451C0A9530187E6630FEDF5747575057EE79CB29C32E7436587E6391FDA7268DEA19C9C535B9C9DCB9CCBE6CDFBABDCF9100C47E2AF7F5D0DA73CE075A0E2ABD96BBD850DAECE39F1D13EC67207A715019BBEC09F3F15303F80D921FCAD43046DFE162C87020E61C0A74E6D3A255F01C3B857E4C5C7A7A7A7177738393965A7A73B39A5673BE13936F0485B2BD81327DA745871E6C94DF4B1534FAE600B1D3A0787F4F46C07D8A653F4859B3615ACC8CB5B41AF19D2D3E3E3F3F21CD25714C8E50E799B0A1C563864171717E37BF2707770C057E5ADC8F3F28AF73A7020F5E2D0412FE1447D806B4EF9D22B3E637C9E78E289D0D0D04CDC43B189A787E99119F6D076E813879F18E33366CCC68D1BC7F8C0D84EDB8B993E63323333E94DB68F8D19F3C418FA26FAEEC3F451DB6B6C7538131F09A54F7774748476848676300BEDC8EE604F845001A3C93C8C77!
 F9E0BBF137376223D1676362E298C4449FCC4C9FE84C8D3014B7E495BADABA3A21E75C
AB6B4E5DDCC2850BBFFDE8231AE0460C74CC4676C387C7D0B8690F8DE630DBA24DDB6B3EE2887DD84EFA3856ECEDEC755A6DE45FE673D8670CB0307800884F1E3E4CC782BE634CE6133E99EC8BF02413DF8681D30BECEEE37365E3C619DCB2B0907DFBED421AF0C285590B179E7DF3404090A94828CB5FF74551C5DCE8EFA72DFCF6DB6F3FC29B181C801E33E6CA18FBF83EE228C78CA187191B377E34E3233CCCD8C8863A63069E32FBF65BFE25788FF8FC23767C3E6207801D8D31FC2810BA19573672A4EC9B7DF821F3E107D276087CF813FA8BDC683B71C647DFE29695B570DAF7A9AF06CA83E4C982636B6B7E6B5D59F2C2EF812F2BEB231AC5952B893E3E87A30FC34271D80E1F1E730507E630BE1547F1CAD22B57AE2CDD88750FBD01073634B40747901E7C7A0E0B3D3D0239674F0FF6C239E83BC861C84F0E1FEE0915D897E22BC78CC17AE3C62B890C0C0DFA0A01FC881FFD2C76CCE9B09365D1116187896F7C84C3FD6D167899F6FDC28B414379B506B950DFDA9A5CEF5C96A3591A2704065EB27C79B9FCCB2F2F7F7999D9F53B77AE5F0E0F3F3A39FCEF97D75F3FBAFE32E239621E82FBF5C947995DBF7CB9BCFCCBABE5E59672B3B92BBBA101028E2F379797973798CB1D4C06F3E5CB86BDD8DFD5B5F772D7F5BDD7F79299BABACCF858797CF62532600F0C0C140!
 27BE8CE569AB8E8D4779626A65E599AB5E4934F3E7967E9D2A55045B44FE261A3201885504D6666E2951957962C5C382DFAE2EC8BF2F8BC22A13EE0ED8273D5151B26C7ADBF73C2D95196E2E14B367EFCF2E5FB7FFFD873648F3DF6D8EF7FFFFBC77ECBB61EFBE3737F7CEEB7CFD1AEFFA0E4F6B4E3DCD35BCBB6575599CDB5E5E6CB00116FAE3099AA4C55E6A37293B9EE44C586B20D5B37383ACE2D4B9179F87AC852F8E258E638D771EE76CA767726E35671A7AAA2A2AA62C39DB9658E8EF5734FECBA33F9CEE4A3938F5E0EF73EFAF7F0F5978F5EA6E3E65D853F741447A7BCB111E544DC3B4BE2761F1892D7AEC811E6AE7B7BEFB99CA31B28EF8E7EEDE93953E6FCD7949FFECB5692E0FEDF5846189EE2F65FFFF537AA54FEF0DAEF7EF7C68437DE98BB1D839A3B61FB89B2131B566F9FBB1DE9CB71FB8409F3E66279C3F18DD513B09AE7B87D5E190A92D3DBB7CF7B63DEDC0D1B46AF3EB8FA08D2F77AEFF55EEBC367AF67367BF76CA4EEBFCF9E8D1CFEF7D9E1E18DA88066AFC706B3A3DEEB8F7A1F3D7A70F569DC46AFF60EF78E8B9B3D7B481EE4502438BA3EB937BFBE62AEC7A8C5CB1F7A77D2BBEF4E9AF44724F66790DA617F7EE4CF8F3C62CBF1A2E1E9338F3CFCCC1F9F7BF78547294F6FF18CF288F238E4CC12394B67CEF3E8D9A143C881F3B744454D41D21!
 EFFD21456BF79501AF5406EF7402AF7F098830798E36B5B263CFDF46B4F63856A85F6C
CF99DC76B13525E9BC08D1EE980ED7AE38DD1BB4623A7BF38FAC5D3DB8FBC5A265B1F377BFD90BCBC2B59A8CF2F28C84FAE720490F10FF9E614B9F26478CA15B910D990F2E329B60F09F1D0A15387D8C321ECDEC48C92DB0A4A7C0EC55087036D8946CF9E94F3444746DFF136AB20363D89A7C8AC487EF1F1C5C574A3C761B314436CB5C5C54877F179555579E6BC3C39AA1C543E393975A88190E31DB79C3E307A97DC33FC2218D954DC5524B4B67EF169AB7CB26CCEFEC58B1F5AEC4101EF897F324A6094CD787E43A07FC29E42D82EFB9B587E23EBC066077BC67674883B11BF6837CF19A19962B21823260CE4B8CC4CEC159F903DC177B0ED508125EB50A123D4A943481D2A9B5B250BBF18543BB429FB4C91E0DAFAC5B92FAA37A4CC19B5D8FDA1F1A39C911737B258CDD3E218CA2657688DD51584C88F107C6760F9E80AA234A227E5129E405908F5197325F1CA18D1368A8F14B9C78899447CE50A520F7DD1158AA5B4CCA090FA114B49333ECAA2983BE3DB8F449BC1C2F218CA8B5452B02F98967AFAD4DC3B73670F0D1D085A91FD361871FD22799DBC2CC563FFE2F1FBDD178745EF68AC0D2FF70ABF1CEE653E7A94CACB3B2760F5BB5067A7EC826D184DEBD173B16334D68E8E5030EAD50A39621582D5F60A04968A9CBA737253757E757275757E7D7DD9DCB2B9DBB7!
 6FDF505156B69D95E4938F561D3D1AEEE58DBF128E90B41EA246004675DEB3A367C78ED41DD1587A52A31397BEB3343A31118706C96BC6D219388000C773FA342F537EFD1DD9ECDAA003C5C9D99FCA85D62FBEF874DD9DB2145F0019E53E7EF1AE09E8163C9F7E3A8596D79EFEDDEFA03AD8D3AF91E4DE40D3F0C61B4C71A35763397264EDFAB5070E1C089F7D00C12508F75ABE34CE6EC40D71C6CBEBAB2AEFB507F146EF232FBEF8221EB178A3C93A72F008DD8F6C5EFDE2EAD1EC156CB22F3F3D7AF4E9D1DB776DA7CE64FBE87964380E6515751BCACACAB6DED970A7EACE86F01DEF58CC45F5775A0F00487641C3A7C9E45A9F9EABAE97CD798831B2FFB949A377EF7AEDB539BF9B83F8CAA3ED7FF3D583F65B2CFFFD1FC825BE7328F6A4A43C3D61CB842D147771A30D4799634ACAF89F589B3665CA9C9FE6A4A450FF043BB10BBDD6EACD47366FF6C682E8BB7EFD1104DEF5A0C69B0EC807AC757A15CB8EB81D3B76BC4ABB3E78F5D5573FD8FD2A42F3ABA06EC78694A0A0F873B23BCEDEC826F10ED905A4914FCF1454CC0590FD8B478D5FBCFCB949CFFDE76F7FFB47BA61356CFFF15B1A3D862FA695E553C64FE13D92275AA82D6408BA8E689610800FA1377576441CF6941D9ACF5AA72D4F4FA135822D026D4A0A85D80908B51328E292E18594F73D00577C32873593!
 CBC7FFF4D3F847F73FF628D9BBEF221D3F3AFEA7F13FEDF2DEBED8AB31AF4866CEF72A
0EF232E7599EAC83463E2D483E512FF3786894FBFEF18BF74F9AF4D0335B3E9F9198B8143541260A652C8246ACAA0594CD8246A3C9BC92A8D144472746631BFE9C1A1DFDA6060FA9D1AF68A253133F4F4CC49E546CC1DBA377E01D1AACB0D60CC509713D71FC3BF0C9A54B53D9A7F1AEC0C09E2194297881DF87822C8220A05CC13E6168E8E2ECDA211C7A78B1D7575FCDDE3E21674D78505E80CC2BE7686DAD9721DEF8C55F05D98D4F3F2D28724C791F7964D4E2FDC4C8F4973F680A0EBE160CBB9670ED9A42DBA988E855A8150ADCAF29D8034CABD5E295CE04BD5EA173D125E95A94A2B5B424295B925AECA66B7111AD9B2D2E2AAB0A4F7449E775BA55A27DC86CD5C8A7AF63F9906F61F39BF75E7FFDBDF7DE7BFD9D1DAFBC79D1D931276C7D507C806B55595571B997BC5C80D85D5D9FFCB4A0DE51E6FBD0E2C570AEE593A63F377DFA81DEF6F6F67BEDF7A4520CC945A773E9F657A95419DD1918818ACCC52529A94529954A2512B55AEAE7F79D9F3FECEB909090EE10DAF88E9EFA63FD9D1F5E1C3B769B688B16CD5AB468D1B645DBB6CDFADF6D0FD8D86D63616C35F62F7E63BFC337FA616BEC587C81F8E5DDDD5FDF53CC9CBA6DED21591D80C0B5AA72AA2C8D5EA662235CCBD5F5ED270DADB214DF87D60008B916807CA09690B54B08098EB14EA5D20182CEEA8207B!
 AE1F8B70086B45DDDABEE958694F89594E06F014746085949087B02F3FFDADFDFCF6F2C8D7378C8DC668DDD767C1B1BF977808A01D3988FD3B0D3E8CBFCFDB87DE757E247A008CEB696D23FCD9CFAE2264FB9FBE4C678B97355455590A536AFDC78264770BDF1E419871C990712E278E0580E8D4C5FC980B44BEE492452A512379DCA25E9479DCB8F56971F9392408632A919BBA512697BAF5AD12BC9F02F29E1E30EA9C90014C24448FCBBD978BEF663C7F9C1C38FF571A0602F310863C581FBD388F11852C21EFCFD4B68EF5FFCFCFFE2EFFF9716C95B33A7AE0DF094876D088A4F6E35D555D5D6D65E8E0F753008CE37DE3E73065AF77DE825F7518B173320D32FAA25EDEA76E9BD7670A294B628935C5CE0F9492D706C1082ADE624006C012924977615065DF2D9673B3F0BD95953B3B3E4B31262E8B39D256925696C6C6339101AFCAC6D8C04B6CD3DC96FA4F9DB6E7E3836FE251C09DFF117DA0290E7A71E0B70AB0B9B0B20AED773AA1AC36BCBCB8D2B920567682439DFD1171A715FBC78145CEB5D06440210ED0404060456064447D2C083AEB919AA3EDFACBC0B8D0008A850F6F6F62A98A9B5BD0AB6D9DBDB8E1B94460B7885934A43381046909D8C613A4A00807B1588F067DBB092AFFDBEF607B17E7F69290590B501BE150464AFCC54B735A83CDC7C55484F46D47!
 AF2EDA27C99C74F2B171323147E5F5879917030634094248B9616523D1C0BAC2401C80
5E585E6F3D25209460E2025ED2EFFFB17D8D7B4FA5FB2FFF99FFF610F7C93DB22894A8461B7612A6C479F20B007711961635BD48C117779547D509E5C76A7A2AAB1DC2B7EC8188FA875A3E0C975D5AD1EEEDCB57ECFC47EB15D092814BAA40C880B0F53E45C49A476A54EA96CBEA05CA0949482110212D2BEEDA9B766CE9C396E1CEE33673E8FCD99CFC3663EFFD453B8FDE6374FFD86D6CA9A6D634778DAD891AEE52FBA561A16E656F0AE92120E8562C9D778D545F1D6F3E3D69E7297BB5507AD2892A1A7B4C47BD51A350E147E3FFDF4ED1C34B8702DC4ADE5CF3C474058604500A6B085C0054692A00DDCA0155D12D44E22B98037B513232E0022F9FAF971643347D8F3B4C09E22FBCD6FFE06202A1B906D0F309286C5C64A1AC64DF1C2AFC49FE32861B18405B216ADC8C88D9C460031E56CBD448C087972E10680ACAB96C9C8B516A34B7C66D2A4E92F5C6444DC9348296A2939102673889EBC8B5C0B7C2C90422304C43FA4044066721420E60F7F98F9070E854010231CC76F94D66D22215CE83620ECD0DBDC2B64581C25885D14CD2990877C1DE2E772731C18A98B92BB9EA8958391B2AA4BC55FD51A87D2F304B71B9F3EB9C994C2811023939E9B34FD15268D7BCCAD08084BC474835080A44589E8BB40BA0040DBD5C38CBC358E50906FBDF5D65B1CD6F3CFFFE9A93F!
 3DF5D41F8003409E02101E6945ADFBD9C49E56220638F6C45F44C580004509638432928BF6D8CC99C79CA3AA02728AE5724F53595550A3B9D6223831209F6E3221214E5F339EC2EF9F01642507A264C106A9AF8534C20D30C8800E6C49188EDB6A1D80A88911722D4231F3AD716F89EEF50766BF2103315230E26753C90824240C9B54281FFA95D84330C321BA96BF2A61D9CC712FCE8B32B50248B2A7497E34A831BCBCD8A9410E20679ECC2F7294FD841265144A943F4F7F6ED20BAFB42BED8C50B9E4D28DAA44C73C8CC1A1C28AF23A03A2502465D484B47F3D932B64DCB23DB065CB961DC30D36F5D8A265536D4094C340B6B15C2EA6426804D2B025909212AE177F0E81FC8B548300ACD22F9B3AF5585D94C9B5AED854E07A34EF68A0A5F672B9537C3CA2D69933EBEAEB5310B516030A732D004962381823481C2E2C6CD19AF19144FB281E00079068936A5435BD702D781312EFF1597BF6CC9AB5873D1C3F7E7CD6F190EF66914608C902EBD8918CF871B5D3BD24CDDFAE8B10A28255582525ACD4610AFA9A18D1EF993A151AA908A82BAE90CB8EE6790941976B8DC50D0E00B2E2CC991C6284B4CE5DEB8557A42DA2DA6D8C70C75291D259BD98C40A1435AF835B6A426A1462D47AEBD8F1B49D213B8F97D4A876D6586BC6A67DBC13A518C8F8DBDF0006AE856C300285!
 2D27A6A5A5F15C8E353EC034C2F9B0030161212E09CB1890B2FC9C5A79C17CAFA23B3D
81B5431AA7F83C62E4C9E46A99A7EF4351E347AD81D8DF9DC41951B2C825A5E49104D722182A5126903BF91655BE2C972B6B326A7ABB9944C68D3B96F699B526C4AF645B8D2AA3A6662C021A0E3917FB6FFE26D58DB5552C7EB61A8B1ED3A852C480D3A00ED43A3B1929252C5CED0CC9F0E7410D0FE45AFFB3B628AABAA82228AF607E5E8EB927A83628CEE8E020CCBFB1F74903C4EEBED29D89FD610099FEB1A445C4718F5C2BC925A3DB2E76CA25494C23A242149D2D00A2E87E1E1227209FEDFCB866E7D8123F545D288659D1E1477E05247F9310103F5BE41D2BA262A12A8D460B624276EE4C5BB46C5B491A6303E486705494F04354FA45E3A6AE2D0A3B915C468C1C9597075E6A1CD258107EE743235D47651EEEA3DC911017FFFEE1497F9CF4C29BC8EC528A5C121108274325424176A42ADE0E444A1AE97E7EDC4C11C84E84533FC8532CBF21ECA7B8487E23D16D63CFFDEC48388E340EC42FEDB392CF8EA71DDFB6ECD89EB11C081C8D6452C2D3BC0B340246DCF38BCA6AF30CAE7979B59782E05AC5C8ECF36F749DE99AEC28731F15361E40F63F3C09AEF51E80B44B2562D4D2B9A88810ABCB08A3F82B5533D7EABDAD54D5D4A8996B4D05903DCBF6CCDA767C166F3CA889422BC56B14680440ECE2E0C177ACBDDAFD2CE4E38F672D1B77ECD89E3DC7F71C5B96B6F3B!
 31AC865A75D2640E6A21F3B75D9DABAB0FA1C06C49C178FA618564CB556838379B24CB678947BD8E2C5EEBF7F8480AC42F845F52121D7A21E5195319C47380E16B40807FA60ADB4BB46A51635F2D6B1597B58009E85080C088B8068D12C5E694123147EFDFC6C40781249E36DC7CE8F9B4BEF1E5FF6228E0508D9732C6DE7CE1A722CA0A107E218AEF5DDB1FFD9B329ACDED9B1D1C120F392E76900C3A2F182D803E20D5D771C53168F0A0B5B1C06207F244648EAC8128C111D4F232C8588FD37DC8DB587BC75D74A55191CC8D47153671E3B8EE03B6BDB67DFD99A414A1933FFF614D30867843361CBEA884E4448C8C7172222224A41C91BC70065CFB2B11F436B805153033C35C44948864AFFD9D4457BE46165BE1382E2F39CCD79759AA120A1311AD5AF6C5D3680C83CC78F725F1C66630440DA79A72B5552C9DB8DA8A52304ACE272E15A0723E2240418E1AE3575EAB899C7E0E47EC7D3FC43BE13DBC2458B962D630AB103B19529363AA8F508C95875174022561D3BF616BC0B40667DFCB14A458C30630D740803B2765398B36F4A509E83CC2C77061063ADA616AEB5A9A1C174C251062064BF7FE4B96700E49ED2D655C1B39254DD6CDE0319A425C92E1029698480DC062304844B64E6B859B3A815476C2275CC221C4C231C48F336B191E2524FE38CF8A761BCAB5EF95!
 07DF7C30BB38E8D23EF8273A69DB7AAC8B918109A0CC8A82120CBE05A8E6E29C5790EA
E5526D38EA1DA38CD50719130DFD5C1E1FA9D7AD9E235BEEE58F63FFCEE33D35F789D55F1E846949C918C6EABCE85267D684EC545A7B4455F42D2A9ED94A8541F2BBE1EF71670A038456902752C5B347519167084DBB8E7593A44ADC5808CF5B3E50FDB140980EC5C7531FC1F1FAE3AFF0D54B2ECAD1797CD5A36EBBCD50A4AE05100B21348325400326ED11EC64831C47EC760DE11D8B8432314A3430C70E83299EA65CB47B9B9FBBAF9FE1E40263D7E01EAA0FEF01E4D5661F02135D6241DEBD65B5809CC6AC6762E76AD08A49BE743EA40785F45C52F95F0F61A9E03B1CD8E8C1D9E6E28F1A3698BF75E39E07DFCEE85F7D296BD786C1C53898A5112C2BD8B114240A6AE3D1596E3FB7471DE8A1B274CA6389AF5D380115940B679EF9D13885A6EBEBE9EC4C81F5F7EFC7526F5F6760A4E54FC8658939A75E4582D62854253281211482780D4EC54A89863F17E64B81779CA06840CE137699BBD45B7052DCA984883AA55AF7F7E60D7F1BBEFAD9AB5ECD88B8CD7101B9010824140BA6301E4C54DEE65514F17CB0B5CAB4DA6C0B8C0B8DAA17483E0E15A1E6FAA208DF8FABA797AEC7F843142057ABB5AC2A22C58806735B3D9134041CF4EF308AC6624897426243020DDC3A5FBCC61287F607DD5534F711C7F9328B7F93D6869AC194102AF59F5FADDF7BC47BFFAE1F9B4637B!
 5E3CF622C2F7CE6F542A3E51468E155293A1AA894D1B37F5D8A6B0324F596D72416B91C11C3414A7A935667B099EAD0DE6E43B48886BDC7CDD5A6570AD492F3FFE2C7996BA9775EC4A90510320E0A185DDF9ECA8C8080849E86C57D5402354FB3228CFFFC18663A6ADCFE5B5D69FFEB640B9CDEE51BCBFA546248D798F6EF63FEE5E5C3DFAD50BEF211D521FB0A7E6FCC72A71BE8C42162402D79A39F5D8DBD088ACDC24773D67300C5D8CDB6111E2AB0437D7F8AE8A0A47C7F1A33CDDDDEA65FB99469EE5F5070141B3DBACB3EA9218105A92D03052EDDBCEF20811A25513906EF22AAE1370F3A07F3DFF3C2BB5189034BF92EF462049437DC508517DB3F9831DBB0F8E3EF28F0BAB961D5BFBCDF165B354DFC0B54A868140F40032F3C50077675FCFC68282563980C4C569CA8DD955C2FC000703809046C6BBC9DE67510B40A0905EB55ACA674D9BAD560644C94951523A14631611A265AE657DEBAD1759AD05EE8F3138B03FFCE14FE80FC9BBFEF49B3FC1162C184B2595389945356F5A08852C98F595ED1FECF0AE0AF75EFF8FF7661DDBB3F3B3E37BB67DFC0D5CABC436114B2289FDEC4FCF9FDEE4EEE826B3C8935D0B0C154340922788404C398E1EE3117EDD64BEA491175E7A96A22F80B0A4A804105D339B034E5226B1A9767816698824024208488D5A1BA1A0CC5CAA!
 2E9594962E582059B04079E1876FBE39FF8DF51BEB79EBF91FAC3F58BFF94621F98EF2
F858D6CAA689456F1AD5B83BCF7FB0352EEEA89797F79159AF22F4C2F64024351C4306EBDD3390D9177CF7D9F14D51CE6EB22FE59FBA269B4CB385B8A172E3D53CC11340AE9F90B98191C5EEADBE8F01C8F497EE92D87BD54AB59A015152E4E5270C68F65A2996BE3C66257492D8553AD4CB08751256694AD823DFA66E929AFCE6A46672529A4E15CB12AA7659EBB4330365D537AFBCB223307CBD97B7F76C02729C6A4FE476042BEA06A868A4B825C11F5C80841825BB6AD84440868676084663B99CF2C81900F108438912251B06020C0A5D3307D2E2A253B1D994A4165592B2459C79E09516F26182C4AAFA18CB37D61F7556172BB298954E3DD4A8AC743CFDC78AB3D2B6D6636C096BD259E3C4D940BADBA952ADBAF0CA8EF0F0F507D7BFFAC1DA638B66A5BDBEF31F1F53FEC8E0D3416C8D44BF33E3E2A628574F6864856BB5E14E5060DC905168900B9E5F38745D3FE1E1B9780D3A12DFF1DCB5EEB279464844CD7C8BE6801810658B1FCD69B3E02B329290A06F97E8307632DD0F569DF51B6C138C1A9603481268926C53D97EDFA5B186D08F4F2BECA435468B68615D657DF69DC0F070AF8BAF7EB0FED8A2E3C7577D58F20DE22F9AB60C3271B21F45E42B8C118BFCC9D6645345D0D00E8DB1078CB8053838984EA08C5F130520EE003269E54B67C1487BBB629B4ACD4F9!
 120174A552ECCC9880FDEB02B6C40B4D21F388CF358AC0C938A0DA0863B379B16B10119CB4E79F8B1E69C81D9491E534314AE5AF0A666BDD7EC570ECC9A3575D1F145C7C7CEAAC111A2EF517120241374BE699BC25C3D658DC945ADF2EAEADA40CDD055A181C26F7A83215FE6418C84B9873DF6F0F449D3A7102338E2D22411088A2CA9BF4ACA4F96B0742811271E12605A29864E20E8649AD52AB20328EC6409861C5232A24E14B3B9BFBF38D90309D3591515F3AD8BAFEE7EE5D503B3F68CDBB367D1F159CB6A92446EBB6D9464C0118F3F090D00C8A6D6E46A53505C7460B660313320A6FC566AAC50FF2EDEFFC84308BF77DB2928C178F8A51CD8A253B269C7162A24956C6E8E475F3D32BB959B4EA75B65678446C0442A4E80FA8DECA5FCD814B51F9B5F60473C4465FDF19B0B1FBFF2DE7B00B26C192544142935497464F055DDEC909470A910103759A3BC8080046AA23516C1A916E1D7C99C5C2DF36540C2DC1F7DF88549107B293C4BAD001F4CEDAC4C645C28D9E48A72B8AB02219D3AE937183BEE2EF073AB0803CE9251C3E6D6D8C45B89BFDFC8592C3B9012727BE2AE46F5834E7761C185F756BDB2F6C565E31621008FFDCE8A38A7B3F2D3977CE234E4B39090E36FBBB97A3A7EB9178C5454D3E9614B68B9191DE29906430E0702D7FAFDC32F3CB3F2A5D2763A5!
 BA02056105159164C6248A4366B6F17832F4C21D17142AC5616B458D422D7268D96703
A58DCB217276CD62A248401C9E0B011E3503E9CFFE6E38FFFB1E7C565533F0B51470E0E2648080973AD6EDBC9BD12FFE39B0044F6651E34B2B73A4E83D64A538C84F87657BCE10407829EFDD187E15A53CEB633CFA1AE9C4E912875492A9554F96392C8C6C82C92A04D5033203ABAE9AC3A1B2724602E921036F1365CF3FAF153067C721A54F0D0A0B222D39C3F8EE6126EB5C75AA31D1C1C8C552829F7108E10BBF91F2F726B85D80D9B5AF79A0024CE1298E85425786E6A70D82BBA165ADDFD8F80912967D50C891A40D45470A9FCFD5A5A7EFC91F220533AE5758A5A9D14B31290EF9840CEEBAC36E31A11D54E48FC1E38C346D1D7961F6A443D8191E6E60B48E7633F9BB5CD2FC3453F180B246A65334722B2411F416667400A5CE5A63B9AE8A12121BAD84B707D3BBBCBC6481831321D4022D44CECED6CA60409BADB452A6951FEC8F4D1A2646713A4A829D11D6A13F47AAD244947B1D78EC31E80336A441C3F03C24FDDECA4584A40288F008855A9BC609DF5F1CDD21ABF906E250819BCDF94C06A56AE113EBBD51D92F66994B34CF6A54381F35E0089130463345CCBB5E8AA83A1DE0EE4F79C113A15AA56485849C5FDA985A68279134FDDBA54AA504B140AA534419AA05723B8E8ACE7CF5BAD762C3AEEF8E2D41A5349892DEE8A40326AF8C2F98087599B9592B1D6C8FB!
 CAE66D19FEED0424363656D29CC44379088FE4C4481131526E4E6E3524DF090CD468CA338B0D82AC20DBC17C429612C6813CF6F0CA97A74F890010A54421492217A200AC744902A0967BACF24249A5E635BC42AA1E946AF512028244C281E89850B8E7D7D866A0C532C576464DCCD219193C66A9080E2A6C494648E460677388BFCA5F31C890442A58E0A2BCC8CE5A1192E37551AEF33DCB0D72CAEC814371D1826041AD657070309B5A53C2E8A4EE1A778A5A103B97B352C2C256BB145A6F414A6CE194F06B2228B777EA13145089BA99015945BC503261BAE72AC9105D8B052E7F712A9A15E619ACF4A8A9E1314EC508D185E823D54ADD77AA906EFDE020C256EC60ACB4B93989123CABE5BF26D11F3FE51930DFE34B43DEBA64136A2D8DC628184D82B3A1CBC17087158D2B01E4B1871F2746F82C22CD2FB013BB2E192ED290B1CDEC24550B2B73A52D1250A3A5323E011E46A990542222B1B2E84F03B49F1360912BA4C496CF33481D901043A0B27956887E30C1EA1252A25225314206236323D5507B1267C49FE7F6B422CF0099DB975D862203AA5F34ED9668631E5C0B404C322A1A1F128140ECBC246C674530C69DC4B208BBAE434A9E2555B7E8D4CA24C4AD04BD0240887D74F5CDE7752E3AD1444678ACF163E36715169DB2E5F55506AB2B33C4372268E942D483B112!
 A595204B8990C8FB83F707152C6E596B28707D1DD20D20C7EBE6E7CB7CBFCC33E49B92
4D41468D70553324171CE57B1BC0088A46CEC8330C08C55D88BD852512DE6228D965366C4AB89D9E21274AB4C8220ABD42D2CCC6DEACFB810111BD8B0E35AF90180FFC641A3BBFC926A928CF10673C54ABAC3F841CF31F8CBC2969AE811B86F446DEC742BE45710BBE65E5A984B956DD8D00003124E71B2A0C419734966C02526FB87AD594DC2A5B438C84898C5C53E3A02BD42CFAD2ACBC52D2425264D7755028A3FA1E40A84841F46D514B81E287F3CDE4CD76467832E11538EB3DD835007EACABA861F983BB15D308C58845631591916A14A07E7E192AE6570C8A9E620DE5F7EE8CAFFDFDE92AAAE339F35B01C454946F3A670A12E22C1661284F702E307E6992B7CA461123C340588D0227C22A091257F92749432010CAED2D52356121A4A56A855E9FD0AE55323E74C34058DCAAE149519C9AE29198C75D962A993F89E18DE2F536EBE0FD48A9B544E7E717D212C31889A1C0554AB30674CD58065C8BAE393A5EE7DAEAEADB283F579F9C9F2C040EA1642C0690BD168B596424CC06A4903C4A41133EC82549ED12153262BBCA45D2CE2A60A90A725192F741EBFA043D5C8F7C0BAEDCFC20210C4B8D588197F0333F7C3684CD1A7242AC7CC3AAF3D342150A3C858EA43183913131241294290404D90472E7674401C45936BED15094232F9243233D1DD9C55F09AE864BB51C8!
 8EF4AF7C5EECF7146502F22E32975A8B7A4D874D12541167028EB6740D7BB284401D743424489A28ED007AB2549F84BE459493F03C21B3C9E94C52B664A78E45589D2E048ACD61FACD0F7FD48B555E5F275924A1D13138985A9248125AF662B87886F389E23739EFF53A33CF95CF23A431018E9281EAA129C93AF965F97B7BA829195EE61E319235B0AA96254F4AAD55ACA7CED126A462875F0C9857B2E4A2621B516158A42A1BFAF6F272034BD90D43C1209F31BB1B9E3E7CE9846E0559C10FE067603A10920245219A272B1B624915B45DE8F21DF8ABD59CA80501CECF667516BDE7C67D94FB579E78A8AF2E5E45A82D1F815C46E293799444658F89DBE061A81D720B86AE9020DD4556C825489FC685D40C8D494F5593F024EB0D2B7131BCDE400CD761CA2906DF91B7EC54E68B21E5DC57B5BDE4BB274A86B56C6C60CC60C365B95AA966E35E303CF4149EC4D85522A15816474237E1CCFF17496F9D6E615E58313E1529060B4801102626040DCC9B51E7BF9F1E7C0888235B22479AD82CFA420BD83147F2BBB1A3309C992C3401ED1AB29B537332C48CE3A22C6DEBA838E6ED6CA96883D49897F062FAE9830546274B3FED0A2A0BC11AB54E95C923262C9B3EEC73028B1098A05F8FBEC2BBBC165774DDAA9F965AE60A4A83E39B94830060A0DC5025CCBC1584E518B31820!
 EF1E5F1D3574E492026E8DEACA50D127812055D66782E55ABDAF1CA6D94BEFAD804758
23A8949A45949C98B90F0BE849CA6BB5B95C16B767E655F892D99D7A87EFCF147AB08E4BC4EAD8FA148250DB12A93BA317EA287800CEAB50A56ED41252E2C9EABD24EB9E6388F0FCF43CC4A5E17680CB234141BBD049983803AB2DE936BC477FFCB8F4F5AB92558CD295148B45A0572075DC0284DD2216AA99949D5BAF64E85E2260A944E6DAC3E58C1A6DF940C08E0342B936CEE45FDB68A1589E20526FE34FB63E5A9E347AB5894597F50321C31284892925AD491DCB5C80613B4143E592E01926E7CE567A73CEB5DC707E59DAB4E96AF331A838C4ED99603428EC1586EDE9B2F5BB35804B2FCE5951EC1284FDAB5DC6ED3E9053A243AB85608C7C1A4AEE8D5EAA9418C8DD52B1802EAE99B955CF53A1B14FC6948A484E77756308A8C90EFFD28A6CD1FD4FA4136F058854A29EDA44D92089112C97C42C255E2A20229D69D459E9EAD3F21D6562717E40F7538598CF1C67868E44BB3C10446C21890475F5E8EEA574F575B43025A6A67A93EA47A970A483F0200BD5319D62955EB298DC0D40C01BF105B0C5FB6828BB5EE35AC022EE1A7FD436C45226FF009903A961FFFC8D8053F48B4781C20BF62F7FB9D08391C48920E40BA5D7ECC3835DF97C46E5A977C0E1A09321A1D3AE29147AE9A4D5D5CECE3C37C1F7BF9D197A76F49E0D78B6A09C86DA5BFA4191D2E3BA948AD2F80!
 48D01D6A3BB552F4EC5A3DBA1F70A614F9E0A434DB2AC71A2A73C56B494A32F80571353B55E45DFC06DF6A56C40E324FC25A2DD18AA0C8A0F741AD9666414420743DBA0B807838BA075599107F8B842144AD74A772C139AF3CDE64AAF758B326ECA1307702F2CC74E411FAB882F3A2EC96B00E914FA3D2892C244317A5A2B393D5F0B1E45A0B943624E46476242A31198694F0061D50FC50FBF2591616D7A866C6D00763B82618A061208445CBC681F88FA8C8AF56D85934DF138C542517AD2BCA178420A325DD295EC8C9AB35EF35B4BA31D77247F87DE899955BB4ED0AF1A27EF2D0766A0AF98975099F5E51A8553A7527CDCFE915DA586D21F2FF0534DC0C0A4B28493AD6D7519D25CEAA85F0B9383AEF54A3E2D58BD505D9432949888D8C14D3464CE40320C8F41C08028E54C9280190BAF9BECEBE074CC945F9F9F942B470C9E8906D16EAF3AE96A343F4080B0B031088FDD167561E2220D0BB1438B4BDED52159DB8A2F97764907676264B51A3D46A3B69C61440904BA45C203C66914292C469A11AF142125E3266D08C678D9842AC3A9A90D1C60E521A17E51D33F82021F751A130206A76B5ABD20E8418290838D1DADAE3730940E2F38432438325BE2BDF978044B9FB3EF7F2E3CF4C3F44E1173A50334AD474F196A4DD652755904A52BACB0F6A255E437D8284481AA1!
 E60730A4CDEC51C9A4CE53448DAD60E417608510901AD245420295A4D4D00E875A716B
2492483D07C2A64094747165B775A77CBE87CC3DDC50D45A9FDF8A7E5DB01023399B56A41B4C8E6E00F290BBBBE76393964F5A79484FE1973E2FA1AB7FA4AC3B6CA949AA41C9AB432A41215FCA80B09015AB8F555F48B22B44C9DB079AFB60B5480697093F1DC24A7895DFD845DF29B42AE98821DBA4F1A06BDD874412880F3E99AEE4224993CFF775FDC9CB941F509F9F6F34A2637748AF021087F4BDD5F5BE61885A51EE3C8F1CA23C42690F318458A5F92009F2618654AA430AA1634FE779B40C879EBA4406A0599C1D86E9B85FD99B763EE71E92B113DB35218B8E4D5D366BD1225D1B1BED405BCCAF5B2C01E9558840942E56628434E21E2E2F6ACD87D83BAE0A1D0DD9D4585D6D38B3B7DE77315CCBD706A409403A51FF3256253FB2EB02939AD12BB42C4253A268CFA0F9150684E6E7E80C892D912C504A16B024AC13E7E8C4E9449ABE55599B17007F82E2F8AC0FD2DE3CBFD34FCD70F011131A51EAFC61806DED2BBC799B53C25C2B892E7E0B39E5EA26F3F59217B4169DCBD708419A8E867402E2D470665D354A9430BAF6E12106E41AAFB4288F3046E87C08B0D448918F5AF0AD2D74F906B916D880DCF5B7A54AFB74BD44D408ABE45994A2F91130888CC3F41099B0F3D5B4B8B47FEC5934B6BB77206660C08663D8CB806200BB10CD620B6FB33188AE4522B1EE3C3!
 5DFD31940025A7300A44308BDEA0046725638749D59774246E117401E9D8E5A0BAE059742C62320ED3479022F6BFF7ADB370B1001248AA4A476A91A799ECEF28010A95EDFD94E6448C107821B51636F49E82CA922413FC8448D862FA65331F8E107AFBEFAC1AC65CBB66D0BD1F77342DA606CA35254C90041C1479A0A6F924CD5FCEA7662A45BB5B3CED5CDD1CD4BFE452B1A924C8DA0716A70920B39671C1AF6B6B67A88401E9ABE7CFACA53C1D48524507CD52A7A7BD1AAF7227F246D2B61173649593BA2C471EA4CE05AD7774A201B96DDE15A5CEC7CE63449DD198BBE8F6A72169106DADAFFE272FCE37F7C30EB833DB3A6EED1B70D60C4FD0423B7ADADB2B2BF52743472ACB64A345A4D099C11FE8FA4D85556AA9D702D570FAFA2D6D6FCEA6A8D8FD0D3E1E094276C3873E64C57800CE11740A011911175CB2A04A7845EFAE72CD21F2512F423EDDD4AC2D74EF35BCA16E443899662AFBE534F40864F9DF08CC2E68714B1312CD751A981BB42E9123276D9FF94CC3AF6C1ACE3B396BD7573A072A0AD6DA0BFBF9F708085B6CA61183131FBF0E95814BFC3626FA194A8AA39E52C73F488AF43CCAAAE88D618351DE9D972E18EE98C43D70D37008902239ECBA7EF87460AAF69EF49A5DDD64EA9E2B6A257F223AAC65E690B886027E3D8DCB6B6532A49008EC14EB860025C6!
 B810437A9941C8C750FA85212C8E3599263D587BE45E5FF976DDB3242B61D5BB46DD9B
2B742722B898B0132E6591C466525574C645353CCFDE04E5663A8C5ABF9D835E13BEB0264AE1E07922BF28BAA4DD11A21DAC901AE7527AFA1E18C9B2780F842EC6EFBA73F0AD72A542728FC69F6AAFD96B6F7B6F2473A512271A1E21D72699752360442052AF8D858123CD5F1ECCA271B2154A9E8D476F532286DB7B72529AD21DDDDFEFE8B76AEDAB66DAAAA327740C4418FC3D9A4520C5E2033F8B6626442D48191EE8FEB021C651EB572537272F59D68419389A2D124783B3434801124C4A8516E6E9E8F4E7F74D29A79D750114A3A6F75AA3B3B7B7BEF6528C426444DB3F04A29BE96CE8D50E17B132D09748C1A85CD4696121428FE02758ACAC898B6FBC32E8F91DD8A6CBBDD2BE9855FC60EEA23F552053BF49075DB805DEDCCA96C418BDA2A1E39D93F5BE3C5966AA7DCD5D1D5A3512E3719AAF7A66A041FC1A1C3245415671BBB6EDC700B73775BE31605200F4D5F332FE22E34DD79BB5D7BBBB757716F1BDADCDE76EAAF68D6974EF22869D637813C4B1F4B73827A74A3702C76E5868414DFFC43B34E3F22AC0ED887D88F3835D04FE38CE9A7683522F98D78425199182189B0CE8A74C9FA6817176BC6A65667C7945A7951B221DF909A89B231BBE3A870B0DC2274B9324616BB45B93D8A7E64CDBC0F91246EDF6EEFEDEC6D57F4B684B4487B2179CA053CCD53E5A84D!
 E84C806B0DC6EAF570310521908897A028418AF20745E588AE6238573047B2016BEB7F10490C511343B2A7B720ED0C6AB5BCFA65618B4D38A2684C0E70764D6994D7559BF24DD18942748FB1C32CACBE1C78C92C232060C40D79E4D1E9A30EDD55D2DC82FAD63D974E756F2F54DEAB56B4E8C8C1927452059DADA213D39DA003AEA51F041689084302A5138E05D2C8814A1A53DB483E08473F43C209686B1B1881A48D499FF9187B4F53252A14ADCDB7182508852D2E1905F96587522EC98BAA0D15044473D8186A12B6160348ABAF5B58541480782E1FB59F5C0B72D6696F2BDA5D90187B291DF6F2EBD0DA754A691236B4EC9A07643AE520124542AC56B24022190603E50FE652D6E0428E612ECFC63A30C0731D7BEC6F6329C4469058783134CCB72A4923FA4EC24294B04495D462556D5A57E69A1264AA4B3618BA12333B841E63A641A8680C02104F59541463643C03A255B7BBB0939D8ADBBD5408B3AA5E4DD75F239FD009207043E7D7D9B47F67E4A01E40A4507A29FF37BEA024A18D8DDA1692F89116632D7B0431904B3FDB63A78CE5C536111C01894DA0CBA88814358B8868785B74AB8A02729C3D83AA92E5D7F30C00A2F131F6E4095B2D8197C2AB5B5B39236ECB1793D83BD5DAA41AE4A14E2844AAA06A04C55E8B0BFA0175A7CA452B25AE13F40968DC6F472AB4!
 31E45A0B9846D4A27BA9635860A5A10E504C22E7CF65AE847D1C483F254206E401BD33
D7E2509051EE27204931EF12033025F755750175F91E41F17293D900204E9AC31D0052511BF8F72FEFD403086384BB5682C22584FE3D45AFE2B6144D263C74AC52D97D4FDD8294DE4E735DF8724AE814B43A891605D14167224A49EDD205372B19211CC800F717C2C6860F87220CFD1C53CCC8086D07435E09207A0A299472A976254E2EA08CFBB0AEA8ACC8E3527C95A1CBC19C98199AA9B11C8E17EE9407ED6EAC3ED7EACE80B8ED7F7CFFF4957F0D56B434AB15F7DA6F51DC65C136497AAFBDB7C5AF59AF6C467172FB169B65EC1C44E2A69301833729C794AA23C008C402A5D3C831DEDC36EE3C03CC6FFA6DBBFAF9ABF44A3F79D6FD81FB2C770C3095D864820D722D42A215733BBB30FCFCA6A29C228FA0F23CC3E5F8A38963044D687A4FB150512E040148BD6F94DBA8F970AD8716BFBC725E44E73D159AF2965B943FE05C6A8554A550DD73F1937462A888EDB76FDFEC44A53508A9EB11EF6F69812102C229E51AB9D94FC73517464ED26F1306C69F9BCB052E3A1869C59637C47B3FCF8FCCBD2AD90C60825694BB848944795EBEA98C8098F3C2CBC3AF4487FA843A01C89DDAC0A0C6BDE7EA49EC3237DFC50F8D7FF9A553EADE960B38F094C015BDAC75675574779A55721B406EB7DF56DC4A505052472E8C8C641991A4CE70944A4A590D4583CEA572D026065EE4E6F!
 67341B347C6080FB73CE4E2B93D0AB70D54EE4BE8ECE401F8364DA74958E0BA209797257B06D5C6E7D5D6865F391CEAD3E194192F6C2D17021B4DC9ADEE6E0444B69F80CCFB1032C651EF55A342D1F2F96C17658D427D412AB9FD83420BE9286EA10905190829B109A80B491D12BAC0541DA1288D6563ED678C00098F4E4CEEB6DDFD04126B1BC40131BF90AA6CF54A1B732DF2AC4EDB9410BF5E61815C9E23F7182A2E8F6FAC6D4C3D9C7938B4C3C72C6C8D8F6BBCDC554D620FBBE1261BBFD21D40D85462EF3D3AA9D0CE7A2BB4BD687193A42E524948BBBA17D10AB98326A43AA965A7AE2FE1A6B6507B1347EF666C2C86DC8711F6F5F335595F9BDD72FBB02BD766FCE0F78B405808A05080EDCA81CADC413DBBB2AD93E74536F18CC3B5A220C7E01B585C1C1F54FBF72B3D9999A14688BDCA1C78E9B2A1DA31CCCD6D3131B2723CE511652789C3C5E5767BE72D84E15E6D3B9D6C835CD01BF6AADB93F0CD7A9A910227FA84E001EA39D8D82AD11CB1F161B07D7D7D1C0407D26F133BA3C186032D08C4C45CAC5F0C656C83B265CC406E650C3BB54BDE1BC9AF4D415514BC429E6FF0102CC58C119FC33E991D9966A12A1E40AAF6D653F845C945405E3A0520A8B47A5D92B49D9D68087AB56A6582324DD1F2177F6BB7E2767BBB343641ADBF0942622BF157B43191F8B37C6!
 07DB63BD944209928E2217FE2412B9730E6B671DFAAE49589188DFB6D60781D53C934C
622D9400C3F5D420DB37E4541759767A0A5B8B6D1F2F72B00E24340B602084DC7934644206B4E6925A8E33BEF2111020F38ED54F52628D428E0DB95AADE16E83F56DF1EABA5A9CEC1CA844A54A903B96D76670190BE891C09812166FAFB6C112C57046973AC814A0A07237088C9075BD43DD24121B49523B2665BB0435E729E2CD0581BDF1814944AFF4B2269A4AAD878C96C36E5C3B5C2EC40EED2447C2738912021D2AC7C0BCD467403925E714FAFD6C1AF1262A175EAFF0A6FC6F6C7540EA3A0C14F9CD8F78001481B23C006D42E10B4E9B9B604C9DC8E7B1E4F9678A5AF5FD4913D5B56028883C92C0B3216C75B2C97A2E9BFE262AE552C18CB2F9B5C0988CC06A45441F30EBDDACEDEDBBDB73BD9B4BB1649110C49D1C8AB93683E0BBD089BDDD1D349CC7E8E61A2CDA71812EE551C4AEECF4CDC81A3CE1E996C449C141F581FDF963B40618147BC1145B27E85D9E0200B0A2A8EBFDA7809AE352634D4A71C1A112E992FDF9145B9DD0893CD972D1E3565FA9ABF5E43B8EA54DF6B57E851332628B49DD0089D18012F2DB7E161D2588516CAA31E36B232762072900FCDCEC430108CAA8F45AE5C3B21F44E11D9801D180F003CF5F040478ED52F9229C6631148535EBCC1E01C64292E2F26460E6FECF1F16914EA8A35C6F2F88AD628374F0ABFCBC148D85FAF25495BD4A80D!
 6FDFBA759B0AE09B5A14EEFC5233ABB653A92D1D445315098D54122584878D6E629FCDB5208DFE61466C831CB6892221228AE14046AE2506ED36A634DA214E17715ADADA621D1ACC86FA4644ADAB163092E97338F170A350518C38664EAE8FBA21836BC91673208A7B5655676F67A71E486E533DA2602DE76DA9BA3942F1F105B091C05D6B106167203721762239FE443EF6894448BFE8546D2C1473246D0FC211473F9C6D44F28663B62D828B9C705E726357A49B1D721A6B117E2F05456F7C82FE43CF20A1AA566369309B5ADD64B2B0F93764EE2BDDA7879DBA865A13EAEEBC0520B76EB5DFBEC92E710021F7D01AAA3EBB4028F47441155102A547C6F4310933776238FA6CE3C031168150B9486808132B55F88456AE0D823D770E6FD95311159836B5F703C8E5F87CB8567C6D636D2AFF9FF88284C996388BD9905CEDE6EA491A0190952F9DBA4693499D0A54EA80428C24B0CA4D812E076EF6C30505499D65F6CAC1CAFB9131CC59B0D8F898389146698BBB6C347CF08C17961D28E672E988A9933BA1282BDBDAC6487F9B6D6AA28D187128CF2E021088A43C7523FB3F048DC2D120C162CE939F9BEF0A466432F751EE2BC34EE925F47F67118CDBFA5BBDB71537D50ABD96956FB78046A257532322298D1C4C40EA1DEC8B24FF1191101DE459B603DAC754C3D23A0B55FD!
 7DB93CCAB22AA63F37B7EFE791FAC14DAEFB7EBB4018232BCCD9F941B5F45F3C7ABDF3
91CF18E82450F00AD204C65FCECB97B9CAD6C86EB8112351F39AB46A346648EAF76F91DC6FDE962AF5440A22F12DF4D0120985AC08A02085B0A9C489B913EDD6C76256BF98DCFBD96AD8E9FB8707DBFF0B08FAFB47EEE9B757397620FD0072C6904D512B3BDEA9EB9DA5D1D14B97FA084295313AD0CB9C973CDF15798469048C50530618E89D6EDDBA094BA0896A54A16CFAFD56884E19194B174E32AEFBF5B1EDB103187C2E836003239628C3F98457910F8C74E2AF50F1C01E9BFCB9D829C0C1B5F21A722CB5160031456725267E9EB53150C8137604D69AF3AA5DF3B96BADF15D19B63598F84840E7741F1AB979F33670101DD440A3999248B4D4850437F3B333039109912C87E43E48091FAA888AC1B06799BE5F3191321BA336926C0992B56603FDB1C8ECD0487150767C8361C7D2C4A5594B96C2B58468C17239EF5C6B8E6CB1E70D99EF62DF95517F6DA2F68FA6D96FD3B9B55B3769A56557F86A63F5B7D48A4814A1918334058722A86D60624C2405DF1138FE09081BD444F1B98D267BFEFC1918717FBFFD055BA6A73A676020D621DD60915B6A8D00628A5E9AB864C992CF838472BADCA931FE5C72BD6CB14C26732320A722F969CE41FDED9BB7D8E3FDFBBDDBE85C9B96B8A1996B3D21816FA16768CBA5C26FA238ECBE077C6BE4135BCAFF3921FF54993D006CA23D0!
 2B3484751AF09409C8A026B2DE9D9E979D1331267A412905A8B60F932C82C3754CBC23CDD1810F7534DFC34E7E06D2D13C860ECFDFBB7BB5BE8E20060D01214D4BD5469E552B9C86EC3FAE81B81434C2CC3A39A38B20EFB674F9BF8209091159B2D95F6B7C5A6673BA4E70BC5B5E9E5D9A6E8199F672D5D923824840F192DE58D7906B349E6EED6DA2AF3F504234DFA603A87A3D5DEBFC94F40DFBA7F0B5985E6AC636FD24B0391F7D9199C4A0AA4AC62E2103831F6C03502905DCC3698131FC0F16084B0F9D6C4BE61BDE7B285925164BA437C76D150636DFCE56C7374D6D2A5001224845FEA70B258E2BBE24DF561BEAEE74EC8521623FCEAD98500C87B8309B10484E677911507091664423D15C18811AB3E1C2EEE552290BE61D7EA7BB00C7E4041C3B0EC1F9928B268D7BE18B40606EC9D726E537ABC21BBE852716DB9D978293A0B1259B2148C0842C7554BB9B9FC4E6B985B6B81C9D1714DD4BC48AE043020D112103A7710AB671739507112CBFC2AB2B2ADD256CE46E68E707F4E0ECB84F6616195FBB3433F0288E892E2C26089AFF68B1D594C656524FA685AC1B5D20DD9C9C6E2F2788B1098FA09625656A245B81C1ADA616C8C37979B1CDDDD5CD7994E94AD893AB54F41A70C22511992BAF7B14E3992C1D0DB36060763C476AA8F57BEB6C1D8814CE49AB0C3C81D0!
 E5B233433FC01F1483CF83ABEBA8D00D0F9ABC8C8262AEE2A9BD2D3F702C85554F11A2
1FA131032A3C722D4863ED181A6D15C7EBDDADD13402AE6AEA1CC4E572F0DB21B45DAD8D8260682CEE0122574094924B5D4BC439AD8F7402614E5923B0C8925995C9BE38C18E80881D8DFD96767966EB9A020A632D26E0012ECE420CF3618B389110D772D1F8B501CDAD17135DBC1A1BCFC04C47ECE5CE5380AE1970D9CAC6930765F6CF03E460B4311CB11D2D509956D2223F664383200E7DA42942D9451401821765BB4B603E91BF1DE3EFB5BE88469652543203212D9D4905E0046B2B38B2D43424F5656D6921900522E84763434C43B947F79C7DDB3F55CF91D00791B518BC6CBD134C506C7068B209A188626767D710C4D3CF136A9EF014E8673C7C49F1560C372983852E83FFBE488103EB18F608884341110BA1A223D5D1E5F2D94038810A4C9CA3AB96429CAF8CB426828FDFFFBE6EB27DC65ADADE5C4480043D0D48471E31EDBB48F03625FD4241E1C263D4EC9C4E18C3DA2767C201FDA1F7F3EEC07D1FE3C13814642D1D4B42F383898EEC1FBF635355DCB4E4F6E48161AB2CB8D9AA1E8250032C32750A8ED093DDC6076C8EB3A7A878098AF236A9D8A6C62009AC40778177FD6D4241E95C1260E45ECD57F6934237CE601B1FC6CC4BFF4C989F6E03B113062830B0B2322AE15465CBB56782D785F61F035A77479B63C303BBBA158A3495D7892800842ADD0D3D35070!
 CE10FFE5645FD7FCD6649363989B333B02DC0A61C3EBE0E0A67D3638FBF67DDF1419C325F28B4046942BC351E99F0FFD3FE3B157CB13FB2A239B180E661804065618E184A8552D646797170B9A44EE5A0424B3A721795D41F9E5EBBEF3D7B59EAB908545393735D1FBAF15165E8B8828C51A0B47C5181669099E56B8AF895AC35F3BAE2353C4AFEDB729FE810A87E626481AD8AE8CDD771338CE96128E0830024200242F3B592877022343EF64657D9295052041822634BBE05C41F6D1EB6EAE45AD7BAB1DC3A09160BC9D7D34A2B4948E0483C268B9161C1CCB5921206CAA77E2AF03F92715FFF2DE07F1F23964F407D83DD0145B68670403092ED41223068B018C64176B029700C692AC448D30A4C9ECB96AC82F28375F97B9AECBDF5B2F0B739BD7D454A8050682B1E0D9D2BBB415A1C50264D7E0AAD7D87F335D78F2644413CDB04DFC9728FA7E1D9FAD8CB4876A36A9C472601B7CAB3F12A288B02309A6634A40AE260B57C18810B86421124956A2205C1284D0AB79456F373498DC5CCFE59F436F353F805CEB5AE9DD5200797601EC2EF1426818410C4E61E1B49385D30AC148DFFF9F8F5F8C4B0FAAC896FCC4271C07820975FC91FB82454AE82FC3DBB58510BB035CEB6A71B64533B464217064656A8446A1A7C39897B3CEA161EF0D00494E718B723B8578078DD16717!
 3C7B77C182D205A5B088528682D935FAF29311FB2A6D09F1FF4748DFAFB9945D28C3E1
DBE65814E26348ED2C68D9D5CEFF3034525E0046B22D42DC276004404285C69ECC50A339E09C4343B5DB1700229345B9054452D8028CBB60E5EE820B84A574040CF675F0AC93FB6886E7C166FD5705FF4B443CE8632304D2C6521544D237CC4804795521A1816BC51B048B25DD32A439BBF0247C2B3313623F7CD862CE2F307725DF58975CCF1809008EC208C6C182BB00423870BF7BF76E69A98808AA2B2D3D19C1268272FBFE8F2A9F389281BE8923C316C751C9EB91186224988DFE1A5B15924B17461811B50CA10444089C064296906B05099982A5217F6F43D7F51BEB0A5AABDDDC7CDD8A8299CC4107A4BEE0026CC1B0DD657898464E9E2C0C8E1C2E7CFF4F421F1EFCC8F7E48AC52E4D6236DD8FEC27460A29F0302A0A0913B956B643795EA8A5381E8C4C6362A71FB412320F1B0988990391819173C111A0E102605CB8504A383EBCB0E0C208249C92936408244D48F103957DFF3AC8FE4BF1D8F207E703455D5B5F5F25855FEE5B1C86A230A2A3A1EBAA994EBD1987A217669148342290F273050DE6BD37D69D031099FB8DA2E0521A317CE90218F9905122B2729745B0D2889B85FB5876DCB78FD73F9195FF9E7BF53D48D68350C8AF6278E741A52995D87D95FB380ED207DD99D8B3BBAEC60B43966CA390B8108DD58C2C1F1148F6DE82ECCBA61B01C9AD10BB9BDBB!
 A6BB628F56C44040D9EEE04C4AE782A16F645B2539FE2299B89FF9E3D5034F6F53D5049F6B551EB012083D4011192D8C8BEFE265E20913C22B478D40603C865026244F59BB81048B2BE9DA11102358999C6AB7B0DD90DC4088B5A378ACE9632A99F7DF6D988D2BB8C0909A3A8D45EF31406130D91F65EF7976BA99FEDEAFB8570363C89447331BC5E1F8CE48577F0BEC8FE360212CC705C13FF3480345C35675ED238916B2D4466FF76A946B82824FA18AF1AC8B5E6B732206E3702A695B26C18F1EC02107281E3289500881ABBD580739301A1F2B7D276B6E617C7DCD7F7AF32BEBDC12275100034759191BC0D4243973B6063A490FB1555491DE90D4EE64C638FD32541438CCC58B814E157937838D4D855E0D0B5F7C617EB92CF1110E708AA4AC8B31694DAD4215D401118B291308D906BB1521EC7B15F3C09F52F4BAE5FAED76DF9BC92FA0ED654A34940EF100BFDC50EE4EEE338506A88780AAF1901E472E625C1221090854B961290B8CCC4C382D17CCEA1CB7463DDBAE46459BEEF8DFC695C22DCB32EF06CB8A0D496444A2314A514AD8209089BE160AC4CFC37AAC70743967DD685F7E634721C1E34A4687EF6015370A13E06AE652BBD0BED8C3434181B00C42808C234CE480F8A469F4CE16A5741BC39F946C1BA73D5B25637D7645653314E287CD165320484AB9D0A9!
 752149085C1E45B1468DA2A45FF9A98FB8B19BDEF973A9111732D84043868F02C0EEAF
79101078044563615168EE88C3890EC0EA7F2C35F0A1D8251C37E6A6F2134122720BD5BE42B1A1C4CAE05E7F2ABDD646EAE056721F4081042E990270F866801772F80A1FFA5ED5AF03E7BD7881B9547B9BF2A869F37B923E7805847CBFB5950124B2058640FBE49F91640AE053308D74452B4A14E4663760FFD648C20D06F22662DDCA8115235993E82656F5176BC897EE426DF5326BB917F96C72CCAEB4C1E1246070F5D04451DC1A0D0B1822FEC139B4630F4EBAAEEFBE5025E9CA0041D3472186188DD67772600E19D69210F5E6C53E8301A8D3D702CDC177EF2C9C2255900F22680745C4D0E70B2185CCF19AAEB7D5D65F33F3DCB1C0830EE5E605904DEC50217B62E9452C1A5B6856172051B314DFB067F2D7FFF73DEEF1BEE80E19D237AEB7DBC15D5D35A1BDC3431F21AA383B7A7C137098E60EC300A3EC61E4130062E24DF3A4940E05AA1C5F99B9C2CA6D6737BF79EF075F5747DF22CE138F96C2979D6DDBBA267914E08CDDD91E9A490E3D8C7E6299A6273FF6F9523CF24B995FB86670886A70AD8D09B2245604CF2B4F3667044B153A81125A240BF8D48E1F7E4B74BA38537334520C6AED675C977AADD5CE7BB3E39EDD98867CF9E7DF62E558CA5AC2A612611F1702485D77862B413128964FF7FAAB6F8ABB9681AF8A400D7B21D113F4EC136B7B2BF5068CCCEEC10!
 7C044D0FB91689FDE4C6682115403A8CF9014E46736B72F2DE3B6EAEB21B4FA2DB7F1669FD6C292B7C9FB50B9D3FDE1D51A814EE63920F6EA21923FCD5817FBFAD1227C2C8ADC44C115C384C091F321B3FADAFD91126A04471CAECC84C0410C42D56A2646DCC14A235A13EA1C6E480F44BA6D682BD7BAB65F900320D118BEA93BB17982D78D65EFA5EA0B28BAAFB5256594788AEC534DF44F1A6EFDFACB66CFA8884B20BED484602D9C76928B4259060FBC494D1097E95184A8CF47C42254AD612BAD4FFF018E491B7D3853BF97B0DC926D75659EB8AB31188BC28189FE552BFC0EB5E9E56D033DE2D0590B311D32222A67195EC639A67A570E4FF610E05457A243E5968CF115C0EFB827942B13DB141E2E01282AF851A0F77088902D46D146832286BE10C00C9CC3C8CCE6A53BA603A6730ECBD236B9505384C230C182CE9C3868409E56EA94D2F88070C46E134D101602CA555FEBB02A15CCA0A2A1B001B193CC107DB0F104B2FC3110D1AC9F4310A1B054D66A8934073D8590B3FA77F0FF3C418C1D85004D73AD7D5B5D7E4D92AFB624561E1D988B3627F4EF595D8E3F239946B6C0EA5900F7FDFB0058B9ACFFD9738FAC45630B2491F9C200A5CD44830FF22AA5178A21FE16EFB68663D3836F25AB64F223A114113DAE344B556D60CAE9131D08839B9E192E953872E838118!
 7972DA3E7BA9C9ABCE6B62DD663B32DC6CD18ACF07F3397F24F8DC074E40FD8A4C0807
9B62267135F110CE73EBF0B990A61126FE112AEF821B7DAE040248A610DAC1802CF97649345CCBE7708F312F39DE72FD6D4383C9207395057C7196D7CCD3C40E33A2D036636A73021B10FC2D76EE829D176313F454DAFF7CC6A7CF3E156FABB0FAC4A92BDB598FE161DABE841BAF7E9A86DF421377C196A52812AFA0B4123A7A18230BB3C00FFD4CA7A52BD9E14BF3B9BD97CDD7EB5D65AE4527BF9F760D4BF0B4C2EFAF7D1FFC7DF0BEEF1F3836E2B7B3E9F8CA7FB67FDD2DE6DAE7E06C78446BE315E803663F50EC04226E4D4159593D3D898853A1C69E69C4C8C2193E426A74E618C1D2258F6F34271BCA2F9BEB5D5364F3E2ABF21CE21D1C1CD2B3E38B8BCBCB8BAF161B9D8CF4C3CB870F1F663F2D98983863E9D2A5ACF0249B06638F6C75F2EC34D49BAF3FBB04F7F75EC7265D9A80FBB34B4E621B9996D9C9B30BB34E662DF97CE9129ACF616FF8FCF32567CF7EF2FA92773EA1674B3FFFFC9DCFB16B69E2E79FA762214BFDFCF5251752772CF944D39388E81B2AF46451465C480931FAF0985027074303C05C2DBF5CE55CEF3977FD6B739E9EF2D314761BBF7CF9F8E5E3E97726D92F4D4E89E2BF8EEBE9B1658BA3B3734E7585499E97176F708807F03C835C5E5050E45C975DBBF5B4F357A7E76DDF3EEFAB83A70F1D9CB7FAF47CB71B376EB8067CD1FA7681C16C315!
 778E5E5D41539E7B0DF803CE4EC5C5694F3D7D5A74FAFFEEAC0ECD55E8D97C36B8F7A7B1DADAAAAF2AAF2FAEAF4E90DAB2BB64E3E3AD9DB2B7C765C5CDC3FDE79FD59014034F44BD740F1EDC9931B8991C33EA116735EBCC5DC55FCE55193CC599647BFB418DDD313483F094D3F491AC756B0DD78BE9BDB0771BBE97730A371EFD1C4D14F37D2AD877EC0FA556357D0AAB3EBDFFCC781F56F7EF5CADA57E65D589BF6A69783F94CC199EC86E40EA70EA325283535957F7807FB39CD38FCC137DF79FD9D77DE01454BB350D17E026E4F8A64C3BEFF7EDAF7B4E2B42FF93C10E2EE89CE147C96B0DF360723D189570E0B41F179664B79D7E5C6EB4753EA274C99E3E1E9E13B65FC4BEE53DCC7BBFB4679F87ABA79CE97CD9739BBCEF77475756E75CE49961B0C8686068BC568B4189D8AD11F7438599C2CC5D90E0D0E0EC54EC5D9EFBDB935F595031FCC1E1AFAEACD03AF87BFF98F8B43A9D13D993D33A2AF5C99B1D4A7273AF0127DD458CCD70DE50DF1B541C6212188FD3E30B7DAF8035F7DE575C00B56F515D901EFAAAD5BAB2A56AF5EFFF71D9AC44CA40E217306809D64AE957805E5B059EE606C3499C3271F2DABDA41C7FED5DD1FCCDECD7E88F403DADA7D9131F1C17AEC5ABBFEC0FAB5F483D0B377FF3D2E905B50E0B0ED8E1356383804D5060D05D56A6AA33B044DB42!
 6FA9293311089D84983D20E7FFF4ADCDF67C7A5E21B0377075EA4DF387D73C78E3753D
F7C27F5CD1DC454F49BD19A37DFD4BCC2164DEAE789EF80C1D4CFDF498572A09E773E59181D9D8AAFCD1C8A5E9A452C11109FC4D0A0DDE5F0DBF0EB79E1DEDE8E299EF0DC9CEA1327F2735A9D5B5BF3F38B0A0C38FE796668FF6A716DF1554B7931FDFF04993D3D3D3E3E577CAE5CB9423FA94EBF19BF71C646FAB5F5190B978476F824666A348989C2D2C33E89784BF498D0A599993E1B7D1267CC1833E6936933C00B7BEFC62B4B375EC1C712372E1D9308DB98483F779CD911DAD151DC413F694CBFEEDE31D43114D4119F171F9F9EEE80F5577979E1A9899AE86863F48C8F1067A66D440C4B4D4CBD78B1D65C9E1D7EF9FAECF5293FCD99F3D3F89F48DACB17EF67C67EB8723976B8FF044FA357E877CF3D3C53648ECE65B0BA0AB9D96CCE8355E56D95D7D5D555799183141BE123F1C5D970B7F8F878733973987876B7D45EAEAAA82B732E7374A6AFA0ADB28AAA8AB28A0A3CD95E5637B72C4726DBE2E939C53DCAD3B98E7ED8D6D179FBEA835FAD5DBB7AEEF6B9DB478FDE8EFBFAD457A233E312B3889169DF260AA9A99AD4B88BC5E6ECCB7F3F6A5A3FE1FDF75398BDFFBEC74F84897E14963660EFD38A7E4276C21BB8EF7A63F4E823AB0FAEFEEAA097B7F781702C64F0686FEF8370E48393B1AC263B7D7AF4F6D1A7576F66CF0E1ED97CE4C8C18347BCBD276FDE4C3F!
 5A3F7AF3E8D11B36B31FAFF7DEECBD9E1EBC8FD2EF9B7B796FDD1ABE792B44C18ED65CEFB56B3F988DD78F1CF15AEF7D64F211EFF5B3D1A56B529101100BB25285CFA3113F2ED69AB22F41E9EBE98B77ED4A49D935FAB55DBB264C002A8F39EF4F78FF356CBEF67ECAFBAF01E284F7771198B9BBE68E5EBD79C3666F6F04C5F0F0C6D9B3C369095FEF7514AB706F4245BFBDEE7DE48837FDB4F1118C1EE3F3A6F7F38DC96CF13E4ABB26D30A3B271FC1EAA897F7EA835BAB266FF6DA5AB5A162C3862AAFF5FF8FAC2B0A6DDB8AA20922C66B22B90CC7AAFD35E61A020D8162236A08D82F0C0CA52E7171C94C4B1CDA115308A460F9A30AD548C158A56E044A14089506EE0CA68A4A31C561032F5D9B417FF2D3FC3664E0E4AF9F05F7CFEC5C397FBB929EA3A727BD7B9FEE3DE79A90DCA85BC52454CABD9AB011BB36203385770043F2C740B62FB9915C21998C7FAA09EBB1BEBA07804D9D014DE343583C4BD1968A4DD9FDA321040F833915B33D5CC6D5B3B3543C99017826291CE1A749AA1B1DF75A0F5F539BB19487E14700914D3C05A87EE695E2CD0D8BEF424E726D2F9A73B9420E3CDB06BEC5BD6BC94C66F8703AA312BF675E41DEB3782C3E129BFA3D11CF65DEE577F3576EE67323ED7C26F32255136EF5AB7C335006EC0270290822F49B92C8E54864023F830783C1A0!
 DFFF3A12DCF083BFE8BF1428379E08219061295D5C1F2BDE3A2D3E2A8E158BA7A7A7EB
EBC084878F86185A4CA78BE95F1125A3E962314D238A0F713A5A5ABEFEF2FACB1BAB82B0BAA4284F4CE589A65C174CC1F471DBF7EF7FDBBBAF9882AA2A9AAE547C3E2AC25D998383719AA169F0C9A80AD792529BB91C38E5F8E3CD02BD91426EF3452D1493760FB114E7786A1F1DF58F6247FDBE07B3F0847EA22A7A45A2A96274B46A2724C9712469CA96627D60AF3DB5F9D59E92B04DD953537DF858AD1672FAD29EE70E4E027B4894E813F84DB8DE2707A94A50A72FD98D06E12F1098203845EA8119DB8576BEFD7F3924F46D1F927C3C3C2CDC59CCEF1E5F5924F8452E83BB6D47AEAD3F4A97FE1D1DFD676565E5C18365700100F76734BF41C6C64E6F9D22DF02184E4F4FBFA112F1178715D3215F16DF2FCE3C2D10003F2D14B0CF5053289C0C0FEAA02B4F4F66323384D58BDE5D3320850C952A471F9AF754B0FDE2C91BFAC396E969AA307FE70EC0F8128E0CFA32977E997E334D9D973C7C1E89C3D3BE7E75DEBDC31B592CC09036DE48EA05A5575D42DE09402F30963097E4EEF8DDF157E3F3F39354892872EDDA0415F2B9100C5EB8B0E1F72D9942AF04EE7D984E87E03CA5DE72495816209F4D6A01C5374C73D55C0224EB8A690A04D1680445C57D00EB5208DE535285510CA5F1CF9E3D5B59FD4110BC41A552AFA4974AA6F9C147C9D84F482A7C3EF383A9AB6AEFF!
 3E710A675DC9ED3E91C7FC4D7F68B6448266737AE369BAD66B3B9333B784B683B18FC786F6D6D616D6161616DED2D6480E31E7A0783E7B83A3BBBB3B3D30CB75A56D8B200F0862C8B3D002B10F6C0E0382A6C6EE0685916D558B77803E318CF33AAE82E76A8B43B557797F93A76F86AE77147AE1CE8598EDBC806FD5C8533741983EB0C21A1C91CE3C2812C3D95D33111D30D5C96AB55C7E9E9724FEC54DB37AF2C6692239BEDE46EE3AF16D901BD604C77C7638DC1B9DC1B74BD1374ED0C884BBAE59D70B31C0622839CE6383407BADBAB814210021DBEC5C0323CB35A56D3DA024940234645D9CFAD623C8C826DD0B4D341571DF00CC475650351AC693AD425DEE00CC3A8330ED18D0964DD601AABF882B4426C4E9BC3A7256FB98E4B0178B591877BE13B7B2699FBF3FB666BB8BC98043336BBA47017D4D11C0ACEBBCFC98A9D6E970AA887B3612B4BFAF2862B3A554AEB9C2171B8D0E94016C17DE0382C765D76EBDE0B60BC864E32857926E1C7BABC5577C956F98091BA9AA2AABACA285720F2AC6B4C65ACC28B6EDD8D46798E31ADA79AC65C85E30C19D021EA2EC0C779FCF82A90373712CF251BD52D9EB932ACCF66B92C6E60A0BB70B7BC7139E0299DC5DE85EEDDB027D970132BC271D63E543B90E1B3A20A4B7AD84451930DC66322D5AD47C1FBB46110A3E1783066F!
 0EACB37C3650E232D0D7E02C378805B341152A37A28B1872421011C2376AD4921902D6
02E010BB79962F8E6B88AA11FE8A25EAAA9BA1272444712EDC6A7E34C0AB95652EA749045C82C18D94086E3077B07B27839DDC9DBB7EF22DAE727C7C75FCD47B2012294C8C42CAE4702601C7F30E0E70C4D010DA8885FF5B3622A8AC9E0D3DBDBFBDB5A85F397B90DCFB7296E5A68CB65D861212760589A72201B8020910241BD0EBEF66FF87CDFC98AE95B12BCAF536665CE5C9A5B3291A350AAC505C06691D989498E0570EFE5F26C60831958765516371B30C47653EDBFFF201447EE0E66A7DC3D21C51A12DCAF53DFE2B7F8D650AC568B0297B7109F708716798756AF56F7F6A2247B893AE3BF69FBFBFBA428DCE01BBF0F77F262FC3C442C8B72ABBA0700AD308145989ECA0866BAE530F9016F3159D70DD755F7DCA8AC8909646CC870C0618E53953C16B2919FD80DBC33904F7217F93ED284FCEEA7FF041800DC233D536C32B8830000000049454E44AE426082');
+
+insert into auctionImage (imageId, auction_id, data) values (2, 62748261, '89504E470D0A1A0A0000000D4948445200000082000000DF08030000000DCDFBE60000000467414D410000AFC837058AE90000001974455874536F6674776172650041646F626520496D616765526561647971C9653C00000300504C5445925131A9B3AEFFFCD8EFC872C4E5FFB6DBFED1CCB45E7788928B6DFFFFF5423A2F72694FA9CAE7BCE3FF474336D3D7CC859BA6C9B88FFFFFFE98A9A98A744D2B2823FFFFED3147547A98A5AAC5D9DCB055FFFBCA393632D7C591506879A9956CE7BB69312C2898B9D6B9D5ECA4BBCD585444BBDCF56C5033E4B756302A24DCB767758C9688A9C586979BF9DA99C3DFFE74858A33302B675B45AE8D53FEE7A8A8704B79949C38332BB4A571FCEAB899B5CC8BA3AAFEEAC8FBD888FFF6B9DBBA76F1DCC76A8089FFFFE4E8C98387A4BA67777A799AB697ABB4F8DDA595A39CB4D6F5998355534A37C4DEF5302A19474743E9D8A6FFE4986B8795A6A79DDFC376C3DAE9B3CEE6FBEED4FEDBBB7975646A8AA4877D65989784B3C9DAEDD599BCC8C758533A3B382BEAE7D6A9A58A425B6D7D8379B5DBF5B8AA85B9AC97263946C5BEA5CDB676CCE6FEBAC2BAE4CD96E4DBBAEBE5CA727B7AC8936A878B8345412D565A51BBB59B33302393AEC!
 4C7AB77FFF4A9D9E2DA949B97BBD7F5504C40F6CF8089958AC8A764AED4F538332245545855452AA49B877B6438DAAD64DBEAE7EDD38CADC4CE718FA7B6E3FF646A657EA0ABC5E4F6CA9954E2B78CCDECFF875841B5D7FDAFD2ECF4C9A8393F39D4E9FC2B3334A0C2DB4A4F49C5EBFF9EB3BABCB689E9EDE46A736AECF3E7B68839CFB566BCD7FD2A3029F5CC93CFE1E5EFE4B75C615CA1C4E5E0CCA651421AE9FEFDF6F5E1172E3A8FB3CA66441DBDD2DC3E3822FAD1B1C5D5F47DA2C291B3D3ADCEF0C8DFFEEEE2AA7F8E93BA9F59F4F6EE392C2BE1D0B7DAF4FFCDE5F4C67956434D53FEF6DFBBE3F6FBEFE36080935B4F28B4CFF1C9DEF6939082F6FEF6FCF6ECDDB0747C908D3A2C1E6F9199CE9F7E5E6F769CBCDF32382EF2FFFE2C2422A0B8A9342C2C8DAECE4B4E372A2C2DACB18AA2603EC3D7FCA3BEDF736E60AFB29A34392333242B423D3BBADFFFBEDFFFBADBFFBADBFBB9DFFBBEDFF9BEDBFFBEDBF9F9FBEE7093AD1C1C1822201AB07D5DD0ECF8E79675F3FBE57290AFC2D3ECA2A07B844427C4D1C9F7F7F3E8C16182A0BFBADEFF31F2450A000051D74944415478DA8CBC095C5367DA361EE0B00512911D0960580D1043221201850104641305C4028AA4222AE2C2188C1B68C5AD6ED8566806D48E53A415EA542B53C1D2C16F3EB55AFD8D4B91D722B695DA1!
 036C7DFD7F7F759DBBFE67FDDCF09D699B7F37EEF012190E43CD7B997EBBEEEFB39284
88E484876F2AA56984C83D623EC308D0CBFFCB0663FF34F988C46936998FD968E21F3617E60CDBFDE7AC8C4FFD2DA441F26EBF1C3FCE3F82F8687D83946AA53530595959509070061D024B21E19A4837DB51EB12EC3078130B1AFD62338B96968787818BFE68F21F6513F544FDFACD9EBCBEA8719A4FAF175FFE978E54786C0BA7E386063AA20A23239210A108C83227C0C9AC68F7F7D3BBB3C53FD4B238C1FF5FFE5C3FA9FAFFCE5895E7D0C9CBC31468FA70A96552624472DAE360E0D0DF200E865F5D6D6BF8101C7303308FFDCBF3C6F5EBDFEBF0030FDFAD8F412060F617024783F592121D9D3ABFA717DFDBFAE6BFA1718CCCBC3080A3A152287DCF5AFC7E02BDF5F85C0AFFFAB81E1537C1DB42E7B0C089511C911A95E0163F5E9F565D683E617F0AFB436BD02DB0CC1641AE18D35C8DCF64FEB32C3102EC0FB97AB1E5FFDA5A38D7884338C6479C5221C93E58BBD02468787F8357FB5192DF34F20281EC7CFC2103008A6C1718C83F4038B657AE695EBFEF5D1E078B4310883229122508E58A83C7E2EB0FAF1307E37F2D26CFFFC7AD32BBF0404D1D0A06808E12BB2B61699AC45FC650F8A8CF578CC632014A6DF3CFE058231787F84605972D72FFB8F673DAE3621274DFFCD61FDEA893893694824E28D0E2883CC120066CD1E1F1CFC6FCFF42B84C1C1C7FBC304553D2E!
 1F9EDB5F1D0C0826D1BF41FECF57C0D573E938070B48138745E97D22CEBA1EB8387666EBFF29046BD1E8FE58C1CE65BF7C78FC787EF0A8F1DFBE7CDC21E327AEE70639A371983C912E028571654062322A8CE90063BEBAC1FF010490A1312B30565095F6A645586C7EB0021086FE5F10F8EF22307519671A4E1FE1B8618EE38C2346A368B85AA138369CCE0DBE0AF6FF610511F14297A0D562823CEC78C0E151E3F0FFEB7DE3DC65B4361AD3878D266EB861B8AC33DD18CC81B10214C1F9D58AB1612A24FF530883A291E0C50982CA5F9624271C0FC81A1DFC77A1F02A043AB71187634AE9D34E2EBDD0F77CF88170AE3AF85883ADED8B9442FF0A56CBFE07078360A258E8020497E45BC7173F1E53C0B5BFAE33F80A8DBC8280F9C17AD068ECB0F5E7AADF395FEA18FCA2941B3556734F6D031E5F2DCC5700C2E0AB91FCEB0F2FB10D1AD94F944F1CF1C2D6D595B7D2BE5E30A65098460E8E8C67B509C55B645ED2C8DECC175023AD20B21EE2027D632E7015B37DF3AF6F2CAD0EE646B80309E7FEE679F54B05576F045F588BC64F653E98F17817B173100C9CE8A03130426071FCC4F6AF97FCE1C249A3F54191C8387870F0E0C17A13074B59BF8440843EC24A39DE8E4C1A345E08EC89A9503C9EED3BDB2B6776D668F0E0B103B6C737166E1CAD1EA69CE4AC4D83BF0161908F!
 123C2024838307AD0F8E6E4C10AC76AA4CFB7A7FD6D8498E2355426FB51619115546D1
3FA7D608DEC1DE0D08438AC09EC00B8A8AF0D214DF030187B974EED8015FCF52A72C147DCE8482C712E39F11987EB5027B8679E2E0480CAC10E19456773CBF4281C01E5510545CEAB0821BC6B95ED68397FE1934B2EFD617027D038F550342D66C5F2F2E9813890E24FC74C0373F98339A882E4D83AFC42F8B09A3D901E398E8A7836068C4426A446A58C2712F912220EB9D2C050EA34231CA2982DF79ECB8C3F86B411A277E066150C4C5F8068E95BDF3C2D731CBF7AA6238DDFA9D42DBFC73BEE78DD63B0000E2E75F13805634BE7239E3804460479788D9C939671DB9D13A4FAFC759C1C159F8A8CE1AADCE4F4919364318E48B07E35D3CC2551A2B626CFDCFDF2F2B2CDD181053BAB12DC5BFDED6372638C5B7E36E61A7E8D56C329AC6F888E63118C7411099D2458D7AA50AE4114EB651810DDC615B8F525B5F5F5B5F5B1CF85E7AD54B61E46360648477A6B5359FAEC6C151CE3FA7D3BF6D474C7853707078CC97F7DB76DCAFF30F0E08F7773CBFC364E4CAC606CD0B8F99E873C8384691C0C703E29D4281A52F8A75AA606B44976D945770D995AB674A0B9F1616DAAE5CE97BE0C993A7577D631E2B8CF5A24144A9482462D7806CA3B388AA535EC4740C1E148D8860B5C320562337C465057365CC4943C3C1C10A11119D5131AA500C716326C59851C191251ED3C55B1FD!
 C71CC5AA1A836E2B4A38060915C59199B5F7D25D8B734E6BB2FB3B28EAF5C19B5202B78B4C9F745D64905C7A597898E612D059DA31EC9C6718AC7DCC694A6614E74B06C3438AB024184304E7FCCD1C2D6833B449C312BEBB011FCC5052B82B38062746CF8247712F08D8A8A8A6A0587627EB09E43C40D0D9B148B5305B9035B2DCE9D1B3ED6501AF5E98551EE9DC0952B9DFE90257AA7DE76F6619085911B690B0F6F72745470D5C3102B3B1CD30302F21D1B4824588BB8F4FCFCFCACEA86C70AFC36207898E542673E1EA78B50C9F07D4156757EF568FA9701431CB723BD7A71FE75C5F041280BD19701DCE374CEF838F0B82077BDCD1FB79CAB56A417FA8F9E348E64C578AC74AA184525BEEF780119E2186E6BFBA4D0B6D4F6457E16656AC7D5D2525FDFABFEC322785454B6B1D0173F16E6371596228C3AD22118EE239C7C7D7DDB06D3AB0B7DF12C1F5B5787ACFDAFE2D7BEFB7F0A06070E3A1652C03DEDACD8EF22D85D54BE6ECB922F8D571A821548EFC3810481C3159A0E672916DCF5B5F5DFB1C37AC7DD420FDF8D28E8C7D21D0B577AA4E6577307EB712D23014D292B3D66C3106DBEA5E16D659C6807677DB71086DCB10341B938A6F44CE9C626C7B6B6ABA523F5A21DE74BCF34FAEEAF28131DB4367E195E5ADAB1E3F163AFE3821B2A3F1F9BD59F2AAC8F959521A!
 3157084FC3AB94BF4B87A8197AF6F2767CD71A35901511EA51B0F8F5607BF13EE51FA5
3D6A8F1202E65709803640FAFC30BB266DB8673C40F9C49A188F1D8B91F6950CD1D5E1075C637A0A2E2E498FFD59365D6239CA787FE4C44FE3198705811E06BDBC9E1FD6865F6CC98586EF1E998F5C12B22060156386C146181D1C38B4B4BFD2BAAB993F5A359150109674A9B5013B366AF2C3DF76985F58E8307AD45C3A3594D2B3D1667656DB4DD9895053F89EA4DC315811E97022B068DC35C5680E719DB4FB31E8F5DC84FE9E4C026B377B67A34E6941D4C1F341E56D8DA3E568C5D471F61E73A63E2C4D59F0E8948791E04EDC18A1760A983A6AC050756DA5E783C8AD4E182AB2B62769EC9091E15711B3D769E7B5C2D121D24675567ED5FB9D3EB5C604F78C568B5C8388440AF3E8C570472F52285E2F14F9E67AE5EBFF09DA27AF43027AA575438F51CEF59B932767404A70CB0B51D321AB300C1D5753A205423EF407D074760D846A7C388B583A6EB8B4B3D9CFE305A06A50CEB28AA6D1FECF482F04F05842C23D8E52031F6E1FDB0C2C69ED805081F64DD308AFE851882007EF84EF1E9D33309D72B2A2ECC760C06378C5D78D1F3D3625FC4D208573DFAA5EDD5619191A84935DD75D37BABABE99CC45B5CA07EA5D3753CB01ECC3AEEE111F307144C585C641ABBE0F4C063A36884ACF05316E2805E8217ED5F79C9E952E9F5EBC1AC9301FB8C5E8FF1F008E40E8E0C8D!
 8D7DDAB5D2F6A1D7C3D9A54D57468C63272FA0A6FD21B0B4B1D4ABCC388A5840491E85155419D3FD608541B3152E2016E4152672F4774E2B71352440000FC53355BF32E59835475608E62B17AE3B1856283DE3E1F4370EB5034A6508F44C56B85276D07A48B120ECCC4EDBABB6A52BCF5E1119C71415293D8BFF706163E94A5F140485ADAF4264A49ED2F5AB8CB7C90A23ACBA0C561CF790385D807C39287A9CB2F292FFE151489B835058C38AD9FA95B30181AC306A1C34F185332B70A54744C4198F988A91F4418A276B2332A23450340208C10BEE34FAA66E8C7951EA7F45641A527075507717BE9BBD72656140D64FB6B6F51CB3C2DAD7A66D7A6F0920302163BC709C7801340E2BBC38E3B1B14244740A695B7621F6CC257FD1E0773C0423D33F43C62B812B2F7DFAA5EF99D2402ED8C8D00E2A3A90111C19E40A9232E19D778E5DB9EA4F2F567029B68E1CF8F689C7CAA8BF9DF3B58528500082BBF7D44D1BC81104C1A4B8BE9132620CFEB7362239EE1CE6C8E324F883C31A6D3B4DA2C70C02699B51B4B964854B3F5D7F587AC636FF3007E3211E60058270D07ACC187CE74C427585A2BA6D078C00B2AFB3F51AC1AB46406FB17FB3F57DAC18CD4238CEB4F49EB3813262900A2A201800C1C82E3CBFF48C6F3EAA13CD884012BE2B9D3811F75DAA4769C028099B60C2B1!
 00103EFCF4FA6C8F339E0BAA47AD07EB19849D8117AC4DF5278D016167AEFEA4387952
313C3A3434167CB8CEB78943E51E6EE84110F7D8068F0E13049F7DDEDEE5ABEB210B5087D30F5F4F85152A1423F5D0B2C1B11E2BEBAA396385F5494570C5EC95B6018A412E6BB6C7CE0094C0B1ACC3FE0F4DE9140BD77FBABEA00ED71570389DDB3198CE6D44185F38593F76F224C231E1D393DF5D38F9A5A2E3CB93595975A58157686005DA5DE9B1F2EAA7A38A2CD4885579F3E32E069AAD40948A620D1E01538E049FB35DE9115EA1F8F28222F86F1B4B7D17678DA49BFE90EA71C9EB0A579D55916FFBC2F8CEE1540F8F05D7B30E07F4347A04A2D8A1CFBB809C09BC3E765271726C41C4195B50D37759150F6D1F5607FF67AC6F130C38347478C1FED233676C2176C90AAB9A27ED5B6B7192C2D168AC76DC6F7BE68CAF577EBA0815E3D88273611EA52FF21F5FA8CE0FF7B55D7C78C1E0B1FAC59E1E1E4F9A1A1A0216D795DE578CE4D79DD9E915501D7C18E72C8DC9876E500478AEF470F929B8FAE4C980C09E33BEA9F95FFE14E095E3DB79E1D305393B37D2544B311A9015B8F3CC55945E0AC7F8497BF37EC7626170C878DEB7D46367A947A96F0A7162D9E1AC800E5F0FDFAB8528C9B3AF046471D6D628D61E2B519FA1EC3C6CBFE4C2F1A3876FA163439DED4E0F8FD2ABFEC6EA8E03BE7845428CA2C2118FF0908A75A9C753C5D8591044E98136EA8547AF5F08F7B86!
 A040458216FCAF3F88B4B4EB21192D1B1A9A9A9CDCBEB61479BC804CD96AEE0B2C61CC39F16A6DCC5BBAAAFA08A38DE0D5CDCD0D6D671F761608C23A7686BF2F76FF2BFFBE5705B53608CD7FD9836B49B1BFD9B02F7C738060F75FA07EEDFBF3F262626D03FE66CBAE264E7D9A6A6B3FE5F1AA1A820BDBE4B4921F188E63E74D294E6894BBE14914A2631076196C5A121A1E909711DA92D6AE04D83F42BEBFA0BD73F1D05391BAF43B28DD58B0E5E395C017D683D325ACD29A020A135451C24E5316EC8C48946CAF040C11D3E76E5583A442C8A1547094604565D31360682E508C21440D8FF29E3059A5C31CD6934D2F08BFA266B2375EE6C8664CD14B4E2BB8A6A545445D67759E801A15A4646205E59E330646D14D11819D847CA76D03CCA38324C67B40EBE52862EC8280A2E2BB316B17E6C5031C6918A1735C50A264D9914BA81089AEF7519E5F1CD2BFA5A6BE26C30F90888AF1EBF00E5A58FB1A66EE882A21A576F1A1229F00F5050A2D091A6A3AA89AC49498B44F5AC831619212745A2B263341B1BA4F9147D8110863FF0030D7A6085D089ABD32173152636007EB5931CE45B7163BA7114C46A0D6988158DC7E026721807810E558A8B3E468C046FE1138DA011327B6870C82482C2E1685DEBC1FF7298F8D99C28CBCB8920C4A34C01024DA17F6BD0059BDCEFF0C7477!
 8C7DD8EB6326367877F67BAFFFDA6BBF77728868C6DF7119058834BF76FF3BF5B6D541
C1B726C7BD8E188B73535E5A73B36EDE044D6D6BF35FA63507808935E5AE1E06FCE67A085C23BFC9FBCF07F71B7A3D07F986B484909E89C5DD8D4F40235A7DEF1404A53F87D4EE4D871D7B1AD2325DD58D6E1DFE678F77C8731BDA9B0A921DC7F07F974F0B721A0A6F15608A562ADF82D2B98DBC2E14E6370CAEC63C1C1FE07F2DF091E0DC743FF9463C71CD387B874634AF895B34FB8E117F7E19AF4A7E1A3FE2FDA5040FC9F34553B167A353595A199120D99FE1D848A40DE0AEFADAE37220D4CFF0682C8385CD690127E0C2DD6939826C7A6BAB3C1C1319E4DE13082820B4E09F7AA0B7FC7FF29A39C8EC2CEF0172624F5704A4A7AD38198B30130EED090E9B72140117081512C16282346FFBD1528B91A5266071FE6FC9FDC0F8F894989C9E2CE16FAA7DC45BE72E907EA36D66DCC0A4F492F5304073B169E4D4941981A83C3672BBCAE163E0DE0402CF5FF068208FA66631841983C7149FA7F670513972E0A3870F68AA2A2232520B8AC3A3CFC70F0EC94C36D0DA0F474C593F0C381079A629E3A72A3C19C7FA1E38B17C661937114909B0E3C4C99CD8D0D7343C67F076150911A2188A758D85F4D1006C7C3D1DA9C0D88A321F4D4F5A26A51C393700E2D7D4A2788EBC57D0542921B19EEACE74E0E3FDD8862E0FFE581FB20FCE0176747CF163A72D5C6FC94A62CAF27F98E!
 4FEF2B90A44611CE4327A3A19EB57982443939CC6D4C40999A12EFC35BE125048E4645221A44C237B804C588A92D253C7DF4E4FD1447E3B0634AF870C38B94CE1D1D77EBC7149D4FC31DFD5F382AFC53FC1BAAC367370437BC78D1A668E8B81F7C18C1FB78E35347F8B19EDF932062E2109BD62F2198B81806A1B97C49B568F85708A2FA74909A697C8383A39C68DAE8DF60DC71F77EDBF0D00E7F7F54A78EBB77EF772A4ED6DF0DBF7FF6617A8551E1E81F7EFF2EC8A93ABDED4578474330D7E03FFB61E7DD17F73BB9329016D8851B44600E2AD0FAFECA0B1762220479CFA7DC84235E85005A03D7C20883C46D349B1E32960D933D391A770F2145D211FE282446D0E318C73D369E1C52942940A1DCF0285E38A4009FD2CC0C0D15CDCD760CD6535A184578BE13A5C24CBB3439CA8A0913E46DB30A2D5F92FE4F10506A40E43850BC445426497A72C3E3F3549188B32E03BE6328A86043B4D070F42023E874C4AE62F8246ADD31C58851916E1AE38EA14541678CCCAEE776DC3D7FBED3C4FD0AC1381AD825C8B37A3E99204097FF6A85C1B2CEB636C711519963DB5D3CB01E32A5B73D847C36A1DA74A257C7B7918626C7F4363CE9D8E6D8202A6B6B4BEFC4330DB8CC61CE543F94DE995E0F51945E9FEED809F9D3D9892EDA646C7B71F56A271C621A7784280BD4848CC84338!
 8A504BC7796150B4E32E083FFC7E4359C793F3FEF7C37718871C9F3EB99B8EA23DD2E1
EFD871FFACE8CADDF0B32F10A3770BC3CFA6341DDB71BEE36E4AC7C3279D5CE78BBB90D79DE1E71DA130BEBC9FE2DFD6D154066113DEC09938EBB6C2C24E6E70E4250463B0572C85639ECF2F014815233FF3C5EF87EE77EC308D383EF10FF67AE22F2ABBDB39C8959D0F179101F1CC88A829E56C43CAD9630F1D51AF9EDC2D6B6A18ECF477747CDA11EC3F3CDA56988228509C4F4947D537DD0569C24CE71BD2EFEEA04CEB0484116B74E507CDA55241043DE979F37B363F190F8A068DE641A7E2E1D34EC57059D9D9030DF92931016D3B464CA286F0F0E07A28BBA76DA3C1A301FE079A529EEC409428AA9FDE150D97216FC01C4D504BC31DE14F1DC1DBE1E1C348E6E1B694E161C7918603FE15303FC287AC40BBC207D954DD44491906473437FBAC5EA038281A21D8D43971E14FBF3BA9E0CAFC73F21DEFCC3E7BDE4B641A4E0704C4F28BC2CEE1E0E060D4C0A60385671B46AB035262200E480D3A3EF11AE5AA1BC21D53EE738F47EFBFF812526EB4E94047780C373ABB70761B72AC4CE15808E21A1939C8C6A9E40D0520BC1D1ADAFC9EC54F0AC235C426F4835CC753474540F015FFA701F99E671B9A1A8CC3C3E975B347CB868CE185289AD5A38E398E5C534ACEC62BC1014FFCF12E34FFA2FC278EC19CA2E9E9C3A7298F1515E12F02140AC5E187298E4D0F031E3F8E399!
 0D2203AA6E01C0F5CCD3F46D33A73E619C70223046F4FB9E9333137FF2453746C3E3B22F27ABAF18262B42C7CF663AF2781C7AAD3878D8AEA17B3213C071D0B3B386869FF947CEE9D32CFF30DC1570A9B88C4A07B1B0E3C548CA6DF6F7B7C37050119FE220B2D006A7680E23124DEE1FC27E1C691EA635E8539F95C7099898D85A91210849B37E3D7D8B82C36D24481DF681D1929DBF834A6BAC1FF457AC5C3A71DA365C343264567DD8B00EBB6B6FAF3E79B3A879A663B36C4943550D12E7BE25F4FB2C8DAD4F0F421C22D65F8587DCA0B8E0B4F090868F07ADC71A0B322FD61873F1CE60F41CD791D28F40A367240C094AAC9F45D4C97E0A655FCC4F2AF178F890E8EF0D2111E1155C74027F9EF3859EFFFC2BFD39AE466DB8BF367FDC3FD0FEEE8B8DFD171B7333DFD7EF8D97047489727F71DAD493EEEF007153B76BCE8B4EE3C7F1E3990829777B4BD78EADF71FEEEC3171DE1E1B423DEF6A2B030FC21789536154670D1A6ACE37241BC55FC8C6FD2BC460F8E8CD084DE9A66486523C1D5C3F5F5A6B1A17AEBFA74B62F8C04A15B24505FEB77EC4847249775EEE04651DD4CD523F5A44F45F5A6FA41C50E641CDB701795A58F388E183B71824E937187E30E23CD3FD21DF3BFCCEFE4685B63144149633D8210FFDE86D52EF91746064F9A148A3113EDD6588F28468787E89!
 606AC6E4DA335982C7874043E1CC1022814B01837A4407788CC41EF6D4227C4D1C2223
C43328DB6FF583F41D591ED6CD21EF7A0694C31A6500CD2D0C74823C67AE3E340B960D51B132FFE92BA382B58F1DD05C5850B0A23ED3D5FC90A868A42A73D4AE7C109868D87830F67E1181D350E0E0F8B907DE98A319CEEF149C700C786320EE982AC704C876E195170D4945D115D617586A3FAA0605ADF484C82674DB4F5820A861F2E04A2B98F9F686321DF7F7DC1E2C58BD1012E06E7B7397A79ED5FECE5886F5E8BBDD8D1B4D88BFAC3FD5E5EF9C0A108760C9FED0F9B5D780C5DB4B16EF659AF60341AC686F0D967B3B22A0E1FAE08080CC45B17E7E7E77B7939E6E73BE6E3A16327BC90FF654067E7F097D5013F9D3B17702EE0FA1FE41182668442EED6D5ABD396ADBFB17EFDB2CA889CAB09390911111109F4853FC222927B7A4E545676452427CB0317E7FFB47F764E8E674C7ED64F1B9D9CF2FFF37F05A47A860770E90181B3C33C6371EC3FE7D4E3DB43876F0FCE9280134424E48485E54439CD8E9D3D7B764A6AAA4B9A85C5F72E2E4B96249F103437CF7886E39B1933962F9FF1CCAEE0504F4F7272654225BE54AE5F5670021F950527AA6A6A82060A6EDCA83C7AA9B52739213921C13376F67100485DF0E7FFF8F39FFFB6D8D3D32B2060B14B54F2A54B3B77B6F654ED3CCA1F55872A2B2B4F9C38511911916C9B70AB2BA127A1CB33276DBBDD37DF7CF3DE37DF!
 2CDD6EB75E10DA3C63E9333BBB673366CCD814BFEA5951C1A1CA885B8BD2162DDABA68FB86E58BEC701415151538B043152496481E48565E6A8D88B5D81F9B1CB1FFC337F71F8F8AD9BF2030C173F1820F8FCB4F541DEDCFCECE3EDA1FA4AA0A02EA81430E453716E163FBF6ADDBB76FAFAC3A21978745A5A5A595FBBCF7DE8C457603B94B0549CDCB6FDCB8F1CC2FC3D575DAB4691919454595CB16E50263F9F74B6197893E1B96DF702D707575CD70B876FA76AD50289118F4977656F5DC4A4BFBFA970FDF7CD3292139226AF1FED8E3A9695BE5CB4E54E91F894BFAC599252A1C007D4D55F06C834DF9D21BCFBE4FCBDDBEECC4B2ADDB6F6DDFBAA17CADCF723FBB8CA5DFE7DE40464C2BBA71C3EE999F5F46C6B4B7DEFADCAFC8A1C06EF93357BFF7DE5B3E71E28AEFBF5F54E45094E1A0B223085AA1C4D0D8D8A8C797EC9D27D2DEB4FFF387E7D2D222625D8E9FFB70BF53F2CE9D47FBF5865EAD38A824A8447BAD045F7154152C5AB16869F937EF7D54BEC1CEA1B5CAE190C38F9B7CE27D66642CB7B958BEFE8460D31B33FC9E2D6B1D78F66CF9C4774343F36E66EC5165BCF79EEB8CBC4D6B665E2E07EC13AD0E457B428A6EF8A94EB76BF48D127C36EAF52BF5872ABFFEF39F57BBB824B446A4A5BDE97C6E596BB65EDFABD41BF4E2201C25701B8EFEAA135DEB5B5545!
 CF26CE8B8BFB66C0AE203324F3C8EF6FEECD7B2363D39A8B2B06825A05CD93566DB22B
285A3A6386CF449FA4C949F1AB5CF7383C2B9FF16C934FB1CF338781435537D6AB5499A755AECFFC1C4E0BC50F0C121C7A4963EFCEF54BDEFCF3925817B9938B8BCB8209FB2B7BF48DFA5E8944AAD48AC5FD2A872255504D49FFA3AAED370E05955C53F99547C7D9D9F9A9B42147F6DC9C14FAC6B4CFE357CDF0B17370403715BACAAEC86EF9AAE61933BE5A9594B7376F959FDD22BBED7619AB3E87F1EDEC06ECEC54BBDA4F9FBEE63A638643FBEDDAF67661FBED471A49F6A15BDB57BF79DCC5E5DC874BA2D2BE76B975A2B5B757AF94F46A34B58FFA4B0A8A8A82C406F1AED3250505AA9A921278F39B450E7B101B197BF6E4C537674CCFC878BF79DE8CA2226A6BF366B8FACDD8E7D39CE19731312F2F1469FA4D51819D5FB9CF47DFFB3D7BE6E0EAEA702444A8D5F63BF815855CCB98E6BAE7DAE976756376EBB2ED4E16B14EFB5DC29CD2A27A5A77665F821B7A35C2A0818112AD839F9D43A6C1A0BD864076509538383C5B6D53FE0C89E55AE470C4F58DCF711AD769CD793E7EAE3704CD53263DCFCBD8336DF3FC353E19457E3392429B43D7CC5BB17B45F9D22284B4DF8C196F644CFB51B54B28EE77282A72CDD8B42AB4F9F369AAF6ECECD6D69D272222E87EA0FDC713765ED25F3AAAD74B84FDCBD6DAEC1E7028F22B2AE9370877B96E7A7BD334BF4DCFEC1C16D96C7!
 9DD66E9D26738EB11A49FEB9EF721963ECF705D0108A179B3A66EFA3C292E7ADE2A3BD73D7E6FACC95BF3DA5F262E1A106BB42A3F9F55CDF1D3BECA3892293E7A292848E5EAFAF9F3D02979CD7B8405EB971DAAF2684D88FDDBFFFACF73F2842A0FD0D08945EB0782767F3C6177914386DD9E7EBD587DDAF5EDF8F73F5FB56995DD9E5D0EBB374C78FD9715F07AC1B56B7B3EC95835F98DF75D7F5C5E2E88DF7B7392D5E6CD6FFF7E53E467C8936BD7327C10977EAE25BB548B325CFDA67DFEC6B4F76F4E3F72CD70F468768D4A75CD35D46ACAF37857D78FECFFB8AC45DF93107B7CFFE2E36109C93B8F5659FC7FCECE36254BD7953F5B047B9568FBFBC5A7F7DC9CFCFEF4F7A7C1FFB8F01287DD3636B94B7F2C08515D7BBF39B419CFBCBD66A2E0E694C993274D9E1A99B429CE7B0ED2E15A094210FEDF93F19177DC1A9F551F7CF0D6DEBDD3A75FD3F667D788C5AA3D7B56CDCA0BB50AFD7C4DA2FDB2C64395094EB1A9A9510909B70EE90B80C07EC3A2B56B7917F6C333E2F64FA6DFB49AF4C6A4E6E7CFF3C0040EAA56CA94906BA7F73437874E9E3CF96673BC0F20EC9D3265D2DEC9494973BCBD23E700C3AE1220C898E13375CEBE7D793E73366FDBFBD6FB7BF79CD68AFBF541AA6B7BDE9E65B5D76ADBE639DECE5BFB936FDDCA71F2ACCBE909733AD49F0B04F697132!
 D2F4E7CE69059D2AFD71FD50B777D72E47D5C42E8E42993A63CCF2B9EF7ACC0AE0008A
EED697E9EB76DD6B6C993F2F6C509263F9F3469CAA4C9934267EDDBEC6D6919F7EEC4197B5C9F7DE3F3D99AA4F979CDA1F153A74E9EF2FEFB7B334E6BFBF5FD4141BB5CDFFE6072E8E4BC7DC5DECEABABAA22A292C3C2E006A7B0AA82D79D81C1DD3D6EED47CF54DAA01A83C12011AA3E09117C3B7DFA5B6F4D99126AB52F327161F9A2015C86EBAABCE6F9F3677D103A65FE666F9AB24C9A3265EFA4D06DFB22A32D131323A77E108FCE62B37764F19C6D7B93AC66C1F5EFBF35E5F34FDAB5FA7EB1F6F48CA991567B4393E2A313EDED17E90F45244445D9DA4638451CDA0000809078EAA389760EDA4CB141A216EE0A0939F2F3118140F0ED5B93676DF6F64EB477FEDD8A8C0CBF89D3DEDFB739FEE607F3376FDE6C090856CF9F5B854E7E9EB46F6A5CA2BBE59AC9569343F336E3F571C5DB70BDCFA710C6D09B19A76F6BB5EDED7B7C36CFDF161A5FFC5AA2BBBBF39F96B55646C5A686411324A7250281B3BBBBE567F3DEB373DD2514EE12B687B81E093942080482E9BFFF20DAD2DDDDDEFEEFE5BB977F35DDF57DABC94953B14652B1A5E066E8B659B3AC429392A646CE8F4B4CB48C8B9C3FEBF9E46DFBE65B7A2759594D22134D9A8458B9E9FAC9E9DBA7F72C9F3A3F69565E7CB177A2BBBDBBF3846561A90BCE2D088CB54D5E6D6F4F4600848F9E6514959CA6177F3EE3!
 C8270CC2B7823D3FFEFEC7E56B6165CB8F36BD3DFD081C63B56D5B52A477D23C4BC1DB3727CF9A959734F5DD79AF454646132E2B1C7B6FEE8B8CDC6765F51C08A6BC4501153AE5735757BB4D6BD64C9DBA2D2F2F321110EC9D5FBFB5F5C3FFF8CFFF78333021D9063FDB0382F7BC3576AEC8888C3D196FE4ED253F7CCBCCE03ABD68BADF339F68CBE84D9F4F7FC36AD6249C7A6F52D29AB844C1AAA4B8B8C859C5DE9633A32DBD2DBDE3229B43F3426745E67D3075FEACC9932856C90AF8F23C34694E64F1BEA459B3929AE7E072E8AAFFB4CCE23F1084CEBF74B5A62D74774F744FB43C053F643884B836C7BF91B769CF9E234798198EB063BAABDF269F39796FD0554F993279EFCD2444E329C1AAE6A9C884E839C8266FEFE8C87D79F1F1DBF6ED9BBA2FAF392F29CF6ADB1433024ADCBCC8F949A1C825AB78B8951038AF5E6FB165C9845F7EB18838513011B0121327A212A8AE15ECD9F3F9AABC35D33E09095161E99F431812C29031E3F3CF6FC6C7CFB782733F88F38EDB5CEC2358D39CB72F320EB4B4E6B3C8C8B8F9FBB0C4663C133935292F69FEAC6DA166003826CF9A1FB92D3434749B555E1C2020FADC172DCBFDE5F58F6DAAAA4E9C70D8337166A2E5F2A56B9FED52153984EC796346C69ED3D7AE8520275447E82B1D217B323266CCC898366DD6ACE7CFB7C57947!
 E635AF89167CB62F699B55E4E6B8B8B8CDFB8AE3E3F76D8EDBD61C8AD804C2B8A993B1
22B300FE3DB77A3E0BB98C1C0D4D2208F6EEF61F97FF896562AEF8685050C891E53397BB3EB3834E825EC0EAD7769DCE54658604310421AA904F006697835D46068AD41B08B3597392DE5EF59977A2A0386FDBB6BD93AD36CF8FCFDB367F7E7C52DCE65949F13793A237476EDE1C373F0F2CCACC30093C0E0643FE6E9B0408C870841E2519B2C0FE75554B55104C7EC3AE644055A26DD73ED264BADAA9DA8525104E99210EAA90924C952A042F5195F4EF2982429CF679DEF3D09B37D72006DD053ECD4956A1CD939EEFB36A6E4E9A9FB46F7E5ED2E6E839F16FAF593311393375D67CABC9C81F941104C3145865D2A4D0C9B0422248C89E1D1415DF6B6B33718D2A689B475A00D0B40885627C92822B29513994A8D00484B01F824A54AE45767ED3DEC8CB8B7F0D6495E82C28DEB76FD6075656CDFB662559ED9B5ABC26293E2F12E1F9597474F19C7920AFCDB342274DB64224902FA61097A3BA8340100989CC1BC40F0B5BE70A77E14277696FD7CE7DD4DBAB6E518B856A89243BBB2628A886AEBD5F4C8F2025FBFBB580EA9A91D19C3715E492E8EE2C98579C3415D78A24981A17171D1D3967AA0F9217CF8145E6F81447CE8F4491988485194F4D825FA07123F102770600EEA0AF8B6A6F0B3333B18246572B93BAC9D44AB5542371536B0C3535FDFDAA7E14EE6C40E83F5AD!
 5DFFFA81F9AD235E3FD19442E086BC1A9CF8AE7CD29DEB7A6785E71B4A5A565A2F73C1F9F7933E939F744EF53F3E6440242A8D5DEC993B7814B9E5B81BE118E8491967636BBC23DB7465DAB11E22A33D532A954DAD7ADC1A1566B2412AD46ACCDECD7025D4D9058035DDBAF85C8871D5C337C88629D9D0596DE33677A47479F8A5B8810A308030ECBCBEE3CDD26267A7B6F9E1ABA77D6B649CFB7A1964C06991397C2118984E0E28444160B36ADC21675AF460F6BD7A865DDDD3F740B85428D10288490B042718DB63FA83FB3A65FA3D56BC580200EBA760DBE9848AE7C5DE0CE5F3099948A2D732EB18E335FF8405AC5DB4267594D7A3E6BD636B0C22CA409713B3361F9C0047BF6E2DD52BDA445D7AB7E64A809CA161286DA76AD902C2161711924D606F58BFB6BB49A471A2D0E8390EC6067F791BDFD171304CC167C6CB3655F3EE27F488C2E2E9E0A82A2B4D8367F56687CE4E67DFB928AE318E602AD0DBD66DD8A209944D2D222E9D52985D9E48BEEDBB2769841AD8131901704A1A6462BAE110BE9375A2D542EE80399B1EEE309B0C2AFEB99BF3BBF7AD85B4627C5CFCA43248211664526AD9A4F0C5A6C49D1E83E3077C06EF7223B95466630281FB829957D3AB5465C937DFB9E4E57DB8DE01076D7AA859935E2203823534360C8411ABD5AA34174AA0A8A9E5DB49920F!
 8F592DD5F627805055C51BC6972DE145236A1F1F3A726CD89DB3C27691EEF88A5998FD
0D9CCBD5D9B596350FE704FD6A756AB6B25E21ACD5C9D5229ED561B343AD95CB5161032854283E69150CB20A0D9E995186A5441D75425CF6C6C04EEEEE38B25FEF3F58F4348F42EDE07570001545C349513EF397004F3C484A52AEDAE4C1C12499FEC07595FB75A5AABD388B3356E6E5275B754AD51DFD6D5AAB5C2FE4C83C6A055AB79089A476AAD52928DB8016D2DCD15809ECC8B5DFE6D08C040696105869EBA39CEDB32D13271DEBC798C55EC5F5FEA505203432B918832373799B44FDD8D78A811CF8549944A9952098FE8C8231A3520E82414A3F0820E0129118AB5C2A0A0430502CB7108EEEB7E1302AB0590B553ADAC3E88DC3C7F4E34204417CF0314E4A25D89B01D277473EB55BA8190100C7DD26E9841AC96018F52A6D3E994B53A8A4AB51AFF946A3202E84223D4225B109862437695E094A579E5D76DFEE8FC9B18E8722DE72441F583179322E32C5163F7A14A24963B08B5EDB7E78292756E3A9D54760F18C81C5260E806069DCCAD056650338A521357E95E6290E05BAD305BAC111A0417BDCD106CBEB1F97756A080F84BFCCDBD7B9FEF9B85328E02BA0F145DAEBADDDE8E56BB76AE4E874FA152860B578299652024350049A52D80A1A30501432D11AA75B08304102464148A1AA4A9416013678E478BDDABFF2B02465C0423D1327A6AD2DEE7F3374FDD573C!
 1F15658EA54FC96D6682B9EDAA1B05F8DA5DDB0D0412A55A296B516A109E80E0D6226B916245AC0A6C12FA821F241A0641ADD3696AB285D982799F512620112D727F0BC2C2999689BC2E4DF48E8C6FDE373F72FE07FB92F28A8B3F2AA25183AAC86ED1F2B5EEEB8AE66A11824845ACD2828B574AD4527628996180A01B4F1110209108CD6E91EAC4D91283E0D43C2CE1ECEEFC666EDAEABFFEE35F23D27D26952C568E80610EC4DC0753A74EFD20A9F8233B9860D7EE75544DF0EE757E1B768BE7CA74B082B245296D6911AAFB10152DD207141EB03E5B5F2D4105831D2464078D04F1A3CED62B05D1F3BC71928FFFF84BDA768B2D5BFE35101267CE3BC5A4AA3B2546DC6728AA73A2677AC7CD5B1E72FBF6FF7178DDD9FC0C52DB7DB7F0FFCC45D44B5B94A06AB54489C8708341A4585928D1C9280000907E94A859702034644282F0D9299861CB6A0BF9AD5C8BD5667E7E592FDC2D235FA392CAFBC23D6EDE9C357F21729A786DEEDCB9AA72774269EFCE17EECBB92A3505BDB257969DAD23A3CBDC1E48658C33B12CEF08B5B44FC9D627CA20B7F5E905A736477AA32DDAEA22BF9526DFC043B0B71F4702EB4793382057B8534C467F563C67CEBEA91910A2372EBA13ABDB134941C5B923707283E8DA646EE27EC49A5AE9E6A67C4001A153EBB251C4751418080F3E26943AA5!
 8E0245223815173DD3DDDE469E1A2B7791E7DA9B8B84190483306F21AF5209027A8DB8
3579ABF27C4E9D5A372E9912CDCA895EBF9B54D35C9D58AC012DC10D445752D023D2545C0BA6C075231CA46A864049B90308F322A3A3DD1357BBC4C6CA53D3B6FF751C015FB349B458CEBCCC0370675C6D6939277ED5AA35DECCFA3C0ADE4B44F097D7439ED4648AB54416ED321982810C8E0C44FE893558564D18E8E2198348198435C5C4B9DFCBC3A2C2E4F2F57F1A570CF62C1E98F5CD52196B5E2C5F3EC327CEBB7855DEBE71154FE295B7C1E50D13CA77170D14150C142D2B72086A075BC9DC90113A99B45628AED58883AA32790F485FA26891227405F3F64D4587B85A7EE74E545757AE3D6F025E38D93B3B9B9B05FCF6F23A9BDDBBCB4FADFB6826BA4F9FE89989AC4EF10A966266E1EE2095C300C4715026C802404AE00B508414FC08A5A0A161606B8D584D7CA1EC7B690906A1B8B878A6BB8D4B6A6C6CAC0B9F11660CBC77DDF9076B97FAED2E7F1D8AF1F2EF12292A493D26F2A940AF285FB448A5D5D64215422DB5C3F10E8B76AB6A51A5503A74B5284750B7350505AD416210D2EDEEDBDD521D31A952DAA8EC15446F2EFE2032711D4170C97DFDA5267ED9A6B0878936AA81EFCB73772F2FF746F441D49E5A730AB53291D9E8B2BDFDDA82FE4CB1100BA21EAB6B215634990E8B960EB4D7B60BD5B25A35F422C850452E1AC8ACBD4D477BBB16B5ABFB41E3835E0!
 1DAE9E262EF7516A9A9A91680F0F270B737071C7D2EDD35B0A1486567F391CF454B4244A9BAD0D2ACE42FAF5B5BA07D044A40055453F653DC6BDB331D8A54ED254135424DAD460B808FFA55550345F8DD6DE1AE10955D51914377B75AD9D8A81378C7CDF9604E9CF7D7B1A9A969B91FBF348039DC13897CDC6FEC0A7175B8E6BAC2671E328241A046879A797AD965BB01ED23A150A904EF2B5921862A8150697778E69089A6B2063A05A2514D5B042A075566A6CAF52B9F723BBB22D5EDDBEA078D2D02CBB862205867218FEA8AB0E013FCA50BD8E3753637D0257F12B2E7C71933FC8A2DF918A4AF7C3024BA5F76A86DD710D149D4BC3850D72A755443B51BCA559941AAA01AB14E53ABAE453B5302CD4AEDDCF2E51976AEAEAE9FDC56373636C211E8E4BCBDBF97CBBB6EFD62CFC7BF79FDC47530C1EBBB6FA84EC30A8269F19B36C5AFE1D99AEFE678AA70B754B5CFD5B8F15C03B1929D09218290B8DD5E5BB47611757955415A528CE871FB4BFA83608502BF0C34F976197B3EB92D018468D4BF39DEDEE5692E694E7FE423C06C0BE7B51B50046F0C386496ECC9D8F4FBB7A61F99B6E98D62DEF83C61F318166ADB35129E6B0C90E658B146580BF5DA7EBB64C30A87CC9AA02A87AA9A1AB1B8849ACACC9A5D8690A20C3FBFDD197E3F66EC39DD2D418D888CFCA078CEA9EFD!
 35C5CE413C6C38F0751BED4DE7E375AA04C55886BC657493F1E9936E7834D33CD8CE86
C2E91EE89CFE6C20F7D0F48B0D51080A04C5841D6DD276C6F2FB073D0C2FEC845343278AAA43F138189405DFED1EE1FA7F94DFFDCB55B5823888B2608F3566CB548DBBAC4FE25021C7FB75B6ABF811A0F6D66490842E1E611C1EF3F58C343308FD788C0BFB9565B2B25086E3209B173B698CC2EE9530B6B6F970CA8D04D0198584BCD4B498D18E4BD2BB3C4CEE6222C31FDFD6D5FDD16DA2123E2A0017CBEC9CD75495B6DF6334F073603362B4A6E6B6A1F6934DA5DD74242FC8E84FCECFA86A5D9FEEC2597ED2D97EE827613A28F00E141881858A30016E893486A6F67AA4AB0284D166A353A71504D0D847B3BAEE8FBB52B067E9CF6ED1B49BFFFF993DD0847EFE835F37C72D3725D722DFE4121E0CE87E3DF8B0A80A05D8DE2A2438F5A52722424E49323AEAFB1347819944B4FB797B8AA2007E00719A524556B54C6BE3E68B57674B0E8EF80405CABD6A1AD8460D6B6C311E513EC5C7FDC337DD6ACF8239F1C11A0953FF5D1A90D4B735D2C5C72574F701FAF11CEE5412A7409EDB5B5D48CA8DBDB3355AA4F8ECCC898C81098B9D97EA1AAD6E1E2EB7673354AA541ED4669413588F44A9FA4BB56A8BEAD866FFAE1884724D9334111E8ED4B0A6C2614FDF863C8CDA993270B3ED9836ECAB2DC66EDF76916162E5BB72FCBFD986768D4C122945CE27B1D983FA8E88656989929!
 0CF9C867C6423E0A7912BB98D9FEDEBAC4A57375506C4C8DB8F5A12A400F402529A96511A26DEBEF0F42283CA28762F2447F91CD8A239F4F9FFEC1D449CFF74CDF040889DF97AFFE262DF0B84B44C47A973F998B94B34D26108BB56A4D7B7BD0D2D7FFBEAEA636287357884FE2475F30047C503A7F31A0DD55B06E614189161A8964222A316B27A0A06BD5DD1A03DAA51AA1B65FAB7EA4A1B814A3B36D170F94BBFA7DF5FEB6E859939FBFFFD62A34F7FF37376DFBF6D8D4E3A9B12E6916BFFC915568E7850570A45EA3D7CD6D772877B7FFC7172AA121B3BDC4EFD45F12C70B381B84FFCECEEE2248ECF2EBCB846C7119C2D20DC2883165B744689048C48F50A51EA150182818B48847955DC6EFDFB78A9C7A330FCDB20F3AEB8569DB6FDDAA8B42B14E75494B334FD497526A095B90592A36E05E4773A24C57BF8FA0E913172E64CD0533056F35E78F8BD044114149FB20549844454474774BBA2506214A08A41B595548DFB441769BA6BDBF79FEE4BD56CF2785C20ADEDECB97755D3D107BDCC525D5C5E5FB5F9015EE5FAC50815F346877DA3337B06BDE807308B521AE3EA8094B5BEDEC6EACF89D3DCFCF2C2ED72D13A279D548492ACAA4884BF45450EB4A52CFC8696A6B350603E36914AD1ABF4D6F59CD7ABE97363B4237092EC745976F757A1AE594E60408695B27B87F!
 6C5F3E40842A44A1AF6DDFCD0C9F588453A0C8EEF1B174BF58D53FA06A6F2F72679D3F
6170FE7860AE0CD59029226A6CA11AFBA861A0AE41438A49080DAF113208064028CA609B5593270182ABC072E6BCF2ADF2036151B7E4B12EB1A988868F2754E9D4628DDA8008D2A82EDA53ECADCD440BDC7DDAD5D5CFD2FD86F651FF40C82ED58A75EBF8EC00958BA90C0949151204C240B3064090299968A384C1570A6FA156B2CB75531E8D949F873E7FDEBC078E9867B348EE541776EB56EC46A7AD100D5B726BA1C21149B0427BC1EBCCDEBB719A5A61889DDFE796A082DAB92AD7CCF61095EB8A85041046500BD93232B202F5B3040144459429AC51EBE839E8686D36284A2336685DF326B1C1515E6852BC9F20D172DE5A8BAEBAD4885B72CF54272744834581462F51EAB5BD1A6DEDAEA5346C765FA86A570BE78AFD36F9F95C5E219EDB5E9BE9EABAAB7D57896A030B5E9B5D42840E542113A5589F4584949F36A0D1D76998A412821F6B75C21A71BB6BB395D594E6E6BCA4A4E2C8CB82CBDE176DCAE5B1B151F2BAD8D42824C5D7EBFBF53497D128C14B0533ED898C51ADD492DA5DEFADF53BB570A05B785B7B4DE5F0A34AB8ABC4F562E2C28BBB0B32C5990634EBB8F23EE26A29DF2DF09DB55A4C7396710820C99A9A76D7BCF9F3ADF27C22E3488509DC2DCB9FA142DDAA9347A5CE0EEB4ACD4D3B841462432184DC45BE6C1581F595B5ED7EF33EB2FC5D6637B24A1!
 502F1539259B2ABA0A8C02108B2448C159432487489C100BFD732B224083235646D2D13741A614D26345D667F7BC62AABA4A4397134B772B717AC4B5CB76CBB4B5A9DBCAECEC9891CB1BD9FB4288237535CB4D69E0FC620A14EEDA62BB15B3A33D1AEBBBB5BAB7208A1BD0EBA4F24B3A4065A04B4A791D4D292A001363C5053DD62EE208650B23113AC80A7B4B042311B9CB1847216AC9E30C16E7B9A4BACDC332A2C4CEE62915609790116D58A07962E64AD8CBDF3066DAD4E22ABDDE5F09EFB5A9550DD2DA4FD0D7E7321C87CD06095DA142827315DAF5AC903A0A138AFAC919010B034960ED2FAB10EC09EA75841EED71BD20021B5EE4E4E424257ACCBD6AA472054A136B368ADBBB3599ED9A15482F3B525E5F6364150FFED244A697BA1BF0462906D3250566A7808D934E6D5A08B92B1FC942AF9490F20D440D281A96B3297F2AA87EF1E055B211AE530022044852574A56D6D6D45816A5721DFC6CBF6C72A8434E2CA61D106FB09556A89EEB63693BFF62A9AF1F78B69B24DC36564257800C204393A1E8F8441C2A2110537285383AEA2266829DF24B2ED14670192E1CE2D97AE9CBAA83B51F28408F9D62ADA3118B0F9C7CBDED27E42899A20740F2C5DF1F15283BA4F36B77D57D0CB03178D3E8E8D97256A5C39FA0561AD46681E36B1EE91461BE400D20DED24A5778F9!
 B8074B0C029B62E21C22922C1B30E8E48E88975395175A875A0DCFDEFE0DF851318867
2108A5022EDCE76D8BD6540D622D3CDADD59218EB17334D46EB8BB528CB0844E225438D160424E4F392FF025EA2A6B22A484C93586DD022B3320282BF7F2188AD9BED19152B2F74AABB1391909323971F3AB16CD9F7BF94DBE015ABCB5F87319CD7539D1322BB84058B827A116773E73ED25655D564A276D6504C640AD9905FC88A84140511D6D68CA725C38076B3167DA683967A5C4DCD8DF1299EBDFD177F143845793A39C9A3C2A270C8A33C6F2524A741444EB0489BF08F2DDB17FD027B4D08C2DB0C1A19CA6E8DB85789767DEE5C9D249BC563093801254DCB3661241AA54CA704FDD5A01468D4FC24D68C4146F56A6040087D85B45CF67FEDC707237FFFAB401ED19390D3639BE09B9C13E61425F74C96BBB8A4B958C8E5B1812E5DEBD3B6383BE792E8D48A3532A910FA504667D6B92959D70203682912B4B4F5426440EDBC10E2A89D869D3AF3E0D16C88DA1A079550869653AF5FF6E69B5BFEF4477CBCBE65CB1F052EF284B030FA8C08937B86C5C6CA91215DEB23222A7B2A13BA2292B72FF98F459A76D4B820B14EC7271A4BB63E3594201A032D3B687D213FE857B3C60D3D2420E095BA710C4A5977B62AA81DC92969A9B2D8B265C204FCDB4287401ED605528AEA0A0BEB720A4B708A8D75494D93A7C9B7CABB706CBD752BED8F5BC1EBB711CE383FCD8ADC640C07!
 229FB61D6104F649237E21429245289A486244546A9D6E7C9AA294D68A6B322127C512C9B2D5BF6CF9700B7D4E98F0E11641443212C1966EA2CCF1CC2108D00CB116E8F453A1A1E092D57FDDAABCADAE556752974EA30335ABC932994E9389EE9101A08C240C7418C42C42A9D546D9D2295F1ED26E8AD3B91A7D6F95CB6A0B60F8F0975F565B58AC5E22E8C2EAB6097484D585E538C53AC9A19DB0F856A734F6EDEB3F598865B5100B482974E932947D35EF8E5A31CFCB42E609C68E140C90053564328A059D52FAD20CE069F415528D5ABF3ED7C2C562C992255F1F4FA3B0832370FD8420E74E9D67D89D584F50652C5DBF3C1618B6CA2D9C5FAF92D60A596B88BCC62280A0A3699A8C08979A45A179CF896D33A8898AD95E1CB5FB40C020B4E0915A795BA796889586CA4AF9F1AF8F7FBD1F9768E1E2922BD88A4CF48CAAF38C8A72024186C53A39C5DE921384AD7801502E71FEF32125CDCCA8CAD092B026D51DE95C197810FD2A5D3E6DB25099A24D0709DB6DC9D64AC8097C52D09CAF458A948543C5BDBD427DE56A9784885492CB3804B13D4E4E9EB17572274F4FE048880DBB8314614F5AD0F372F8ED28BB32CA7C145B6115E81012144D930CCD720D7E5D5B4B9A94AA948C1FFCD3CBB3C51A26639524EE2993293894C848A5B4575F59B953EF1B9B8A703B9EEB22E83A!
 14961376071F6151757561BE77A2A866A7BAC4A6B9B0904067B1EC281891F43FDB4E42
A72C260C14946A6810AD986FA5D91618258A44C2AC040C12998C2812ACD4472FA64E4B03FA52F682191A5726B81C47F6C522162A7D290E7240CE514E9E39BE60C91C22CA5B4EB002EC90762BA2F228AE4D27AE41F181470C428301C9C797212C44FD3AA52B49740956E1773C9093A0525A18A58B44A49B140FD069F2E398C6C6C69DF2D83AA73A27B95C2EE8E94142801D936DC37212927B22C2C26015A447541ACB4917F9F6B4437AA544A94139D6D4EA58FFAEA155D80895769700619C1734126A68F1454618B20D3A14168992C96A4040D556F363DF16A5BE15512727089582E4E488B03B0909B72222A2802121CA33D609E688728A65B1F23579A432FB01A91EAC065E2049A06425A88FCE4DBF2542023AB6ED24615B0D444AD25A43B6504A66C0CBBA65D26EB290D23C846E696C4D937BC20A51B111824A3033AE1B11D01515063C514E613907502E9CF8708521BEDE7AC8401B3B08BE6C9D1BEB9BBB89A2995E576AC80C94252451B13C1BB7803674B0041C26E3A5BCB4BB4FD9CD7757F473AD54D2EA14EBE974272759BE15D48448C80100206104058E3C7035ACCE89B103D81AE5E250B684824922CE1622C2686B852050CB26653B8F100BAC489101FAA46E32733B25534247F26E9041F4327B00789F4C3657ADAFAABCE5147B75A747B29CFEA722E4A39353545844584!
 232E83A2AECEA9D9C3B4EF81563A81EBD5ECFBB5102F71A345272B5922F55EC21C2035460A0BC603B3E4CB4BAA1B5250585E65E2D35CF80D42C2A08244C23BEB4333921C777E5CEE42E4157581DA8C933CA36D996958B88A89C3B51774012759EC010BBF5A894C6F96C2F85325CAD247DA6D43149283107A5542A21FA34A0DF61A25126E3AD000685A8072A37B639368E80BC810B4B4ED8B9D323011911D1E5999372E74E14B2212C220105232CE10E2051A878A274276723BB69EB596A3E2D7A15C80635B54DDD92BE3E255BD14DD647F12A26254FC947A58CB6D1F1454D630EDAA4E32D673EF4BD8DFACAAED69DAD5DC8884A27CFAB75108EB040046148084344C20D708493A7BCC720314F96953F10D7E17A642CF369C7B1AF4F66DEA57663CB69A09F8452A2D2EC1A9E1CF95004218959E7FFABAA962825FA9EAE849E1E79579520411E76352AC5C916FC4025B3A78795CD1C8A5104696BE303759F4E59CBF6E4798EA1948025FAA47D2FAF895DF15C580B0C6EA03A6130D400043C564BD21986CF3648CC829EBD0BEECCD667F79CE8A9949FD00B22C2E07CCF3B61093DBEC9949709949F38E09B2879585523025847CA833280E24A26ED7333D31C795746974F5FF0CC5C371D0DB7240652FC445544E4624A5890162F23192B5070025363F6D1435DCB2E35522C508192531!
 878B2DCE08F3A1CB1CBF48D0F7036BA2D44D90D0CF7DC18927B34BE508F43701B87206
3BBF67D6405B184FA6C1DD54F78A05668660496B7640D90A644D278E94465D5831641421755484F79986D7282BC2EAA2E16CC48694A87BCE7C103B00A8946F23C3BA46EF77EE893FE700F7EE97B19FC44052421E08F7BCCDC6C317A1F6D88A240B259A494ED13D39BA803D72B1F541D3A2A7920112002C30EE42484DD62D5EA0E3E0F841D883A9073079EA8DCD9F240AAEEA6F33308CA3E373732E8031AAAB144E003D1BCE746FA44C62708E2020D3EFA17B4763AB58632494D31C15E87BAD9CDAA95E1A884F629E94F79727250322212921184576D6D73AE26E023073FB4EA1FB0B7F264D8DD875EEE07B71FD84F6E6EF7DCF8EE9DDD0E409BF1FC7D092FBB7A663B360B0612A98E924249C30704A3941983368BCD10404611E86200018A21EA0E5C0103809AA212F42D0F9474838C198392468AE6040002BA23837DA07A53092786646C353EF03233949AC918760785448C4E448A7051B319AD1B4D6901219917AFA4A3513A796204617AC6DEDAD9D8027AED96F293025801EBE2EC08C07BF7A4D003D98878A2082A9054BE195F305F9B075E8C32644C371139521E49943237D0989A1F8811594A205F7908C9C9093D7227F4D9E8F0EEDC41214FEBE96D5152AF4C65B1454610F8F067E795D4D0660FE898A71F65378DA0D5CA973326999B190320C8DCD894816F72A9118141CC!
 2C830F8340DEC59BA012FFBA927B92E5B1B3A19BEA62E5113BDD5A948845B2024242DADD6D9E6A2211647D861A7EAEA2948D0721C5C6CB2E929115F39A9B94A713A623098244CA4B17B2810C7E16A34C45D8DA1229C00A091E068FD2649469CF9E56DFA38D0F5A688EDBDDCDC24BD9DDCD4FD2A8E6CA74ECBE086AD95E5E2CAB2070911B6F03F2978CA70D7E30CFBF914F1E56B170027AAB41D015911391437F34970C23A022E8F5AD951148051CCAF1D8C23BA138945410D9BD414A19BB4A5CDB3D3E4B411632DE0E3C4730D3332CF7DC90474ABA9F082C25BB778FE50AB538E43B46947A01F423B110AAE3F6AE9D1209881399C38B4C0A9E3EF3781FE980AA4835926E44315F3C33351F80FC27C5A9D9E08CA1F046944AF89B4190C8EEDDEEEEBEAD54F7221CBB75DDEA6E0AD16CC4C2018ABF3B517279B284DDD6A0E669D45CE2D935CA9850949205E83625F57887C0DF1B43955B030AC66B98979992E9E361F0A55228E926B9D4F743F70F3FF4F535B28C900203BA3D40A0FA7CD5F62A14ECB243BD349011666B692A43E37B89B90EB999B52AC961D2E5ACF881A7700221E35C260A088FB846C2CB232A207D323E308912FAFA1EF43D780086FD015FD89D46083235133E02F2431D941AA2A155A243D3E6303010D44FB78BB2418939B2E1075C2AD6A31E91CCC06A14D34DE6!
 00A1FD08D08298952F3ED8C6139410D0AA0FA48DCA075225BEE06C90C0DD784D37F102
15A53ACF5B69F265977AD10CD6B41614140CD468D0A6E14CAC02102F91EE64DD03A966D626AB79D6932140D88D733462670D869A111533C3CB310F8520F45F8BAE856509E525720DC100530862595D8E8A75429BA7176A589F4E1B22E80CD44AA9DBAF628B06DC140974CB14937FECDE24084B8D81CD16587B2D8615E88506491F751B52B32F64DDB76FD3AD13B57474DFEE66304985022BA829025D7D9D535AE551FA133C9C8EBF01404B9364DA4FE02F05CEA0C82356A0B89232D2277AD1E9DCD46C2047B347D227241A292A49E2F7F15A55CA06D042FAE33BD6756766626121DD730945936D10F4F8DAFA5E8D754241D0EB79CBCACC335B89C45CF4E8963DE4372118573E94ECBC06D1E9507A34D4CCB07D1F5E3DDC23E1405CD127E5334923136ABAD99DD1A0F4EE1FEEDD96CD9D4B37844A714E4165EC9DABBE51F21EB2019D9BE97CD278ECF22916C07714947DE61641AAE407CB6C8C05C46EA48C0C6CDC452337A95943F0E5A48FF941AAEEA5DBAF33B5FDDA47623DCC20DCB54BBC4B9CA9D521AE1E089CEAEEF8E6C4765D6A649D16AB5E7DF4563E9418CBD109E98E4EB28F1BCF137D2C126894279349C80F6A351B71C8CCA55C66AE10EC2C7DCA47FAA53636177DCA6DCA6D56AF9D6073F1E247172F5EB4B129429BDCAB14D000BCAE2E819A67590BCF827D0C411F2D7!
 E4F66A67A37265B6901A579ACAC265F130C21DA2C1A28A86542A1F29E6CBC8190F2D7C1EF48942CFCC7CC99AF2D9C39D3DB7BE6CCCB0B17FE0E0FBF705EA151B7281B057234119EB1AD8D38E73D1D085D6936C003E93DE64EC0209146B5C08D0F853E257FA31CDF1D81A1353C26999BA14638EE01192F72CCA5F3F6B5E8D7A64FFFF65B7CBA4E9F7E04DFA7BB7EEB97B842582B9336C211754FEAEA5A1F48BAD573998AE8E379C01C896EAC46491945CAF882C57A6A751F1FEE4AE53D248959DB1B6A0CFC2BA54ADE924A56DCF0AE5DD17FF9592010FC2C98FED5BBEF7E35FD67FCF0B3EB171385B7BBC18EC44B7572DF0706752DEBDC799561164A7CD565FE95F2EEE06381B1255FFDD5F7CCB7FD92AB24867B3CF1B0169B816542656EE6CCD7D85F4FFD3E9AB6425EFBDFF4774CD3BFF8EAF66DB5442F003301C4A1C65EA9A41B390E832BA5F7EE29D56EF794F76875D43E73F195F1A121E50B8694DD310887B070919AA5589F1BF52960C83E255F31DD786954728A201CF9FDC7FCFD48AFFDF8F3B782E95FAC68977437C20A726AA213F4FA6C3556C3250105E2FD9E4489EF4C2AB322ECC60F8C5846F491186757A9A4BB37DC28B9653C7F48F96D42AA53D216BAE552FDC00D813E3733FA2FF41764BF73764FB44CB477FEC7DB4704821F17AED0491FF4322B00C29D9D8D781!
 B3E5BA4EC3E4DE93D56EA292EFADCB00EF102EF5537F2300F015C6930D04BC506250B4
26615225F44EA03A5DE20D1672B29B0A5CACC998070E46DDA6E5B68E9EEEE9CF87B84C517365A491F392296ACE01971E9C1837BD20712370242A7C215D0A63356768350813F988FF93B0398872979A06EE0369A7A30FBA8D5E6FB6A5998641FCDCEAE3A8A33F64A752504E1DBD7E8CFFCD8ED07FF781710165E6CAD426B491008833C99FE885CE9A657EA25D46150482859B551539650E3C2525DC65307CB053E7F78F1C400329DC5DFC5A06C51EAB3254A40A49B0A0D0E0BDF452C2E9CB9CE3B7A62F4CC85A716CEA45828EF6FADCACE167439911152535DE4115DFA653796B5B62E5B565950596090B21922D351E64D4FEA00C6F759489052B6DCE30344CD14B979F46ABEA113170067B83D10571DD5AA16C20A5FB95B5ACE8CF389F3B6B45C78F9C79FA75F5E21AC397AB44AE01B010C51C73FFCF09709132A57FF71C98D1B4B262C593D61429554C22426D5BC5FE95A2D79A94394AFF4943C57C9A4AF8CFEF1580F31CCDA36A5AC1F8EF8F6DDBFBB9F8AB62CF6B69C87BCF8EAE71F2F6F7824397A74A740BF3321AACEC9E5DC12170B8BAD95B969870AB6EFDEBA2837B78A49C13EDE29E658A7019784DF9B7793F265009DB4394F792EE1EF3336637163914B02B70456F8F62FF6896BE32CD7785B7EE46EEFFE2E5941238119048D2B3D7C23E4728BDCA324DA1BA5BD06A5A4!
 46DC9ADD2D9549D80DD41229F5EB549F996750E995AC4960F5540D4EBCC7C700A90824355F48E9DEDE5EF20DBE487A95B29285AFB168B4F48E8E8723C6213C524B100BD9BD8D2B77B6F6F46C3FEAA67CD0DB7BF4A89B5BD0FAAA1A9A1C4BA8FDA4722CE5ED4100F01E491FDFA64889C6988A521BD801BCA022FA2D72B4850D5A7B593BD0A22B59F8EE11400086793ED1DEF427B6EFFEFCE3C20DED2047BDE084C7CAC69567F4D955D93A69F6FA25ABABE63E5A3D61A09FCFAF3EF344800904838145859AA60CF4D70FF7180420A33F1542F6D4644BC0062D640129632682A0812A6F51EA4A2CFF22980E2B789F8223C80AF6B002412082DE1AD1EA0114BD477BA59A435B3E5EDFA2DFE06C135403F58CE4C499954C3428E98FA60D2063CA018A827BCC085809E121532322F8698194D91E8CD842377AC30868FA5A744A5DE665160B0BD77927AE894B9C7939F1EF6FC31113851A7244579A534E4FEB4E7DAB5ED952F0D75F7455139C9D17098384EA5A1AF8533413F3C0049271E1E6666E14912A64F33EF8EB5E1FAF2CC142D2164A46B716E60AC83476EBB91A56F8F9DB77ED2D2DED2DD75CB64F04417E05081BA025B38F0A12E46863A36E551EEA6D3158FC75D13220F8B8B53D48580B298473110B19B2599BC2F656400DA4E4DCA42C3FA9AFA1F8BB87571A8E1A10D02D8806!
 3D3584B8789D92A29139427519E1F836BBCFFF236FDAB0FE02BC3073457B773762A135
CCD33356EEB47EA7A6B7A660FDB20DCECECE1BDAB5AA4724C90D12D6FBF2DBEF4A767F8E928D7858E3D84731AA6675445A7354EA8640A50CA6CD0F98D7A0E91DBFDF1B684AA858FBFDDDD91D103EA2BDF8D78E087EBCBCA2BD56A6EC155CEA714A8872921FAA123FB2D962B3DDC6D9F97587B9FD4174A394AC1B10BA41D2FCB8B18FD74D6E6EE6BB026434E167F0B06AB644FACA78019D9D41924DF149031E442C78E108CB4A7BFB8B7497FF3FDE1650466835346BD2B746258475F518760AF51F3B3BAFFBABB37BC1DC16FA9BBF5EB546D6DD0708C26EF3AD52BC2234EB9A3EE90F325E38F551ABA694F4BDEC7AD83D6EEC5E5C6A34D91FE96412410BDEA65B972DD95F7EFCF8338A7579A658AF96082EED4CC809EBF2D51F128BD7D21FC77CECBE5B23CB6CADD1E8F824246FBB99472866253B3EF595F2429F91D103126E7D66C5C70F57FA0CD96406622D5DC9655841307D66E2CC85EE745FE9DB506ED317AE108A41E282433DB6095DF2D6C6D6D645AFFF83FD85CC961B41D935B92A098A045DB4942F06E3C32B37B7F1893ADAB43E7E355635CD0D241F308483353FACFB073B5E262BFCFC7B4B4BF6E7D17FF996007DB1A296B6B20495B4639C7CA9B76AD90971C16AE7D727D8BB4FC82D5A961B04B6A512CD0FD9C78DECE6E6368E41F6EB10BC8F9F27984198C50D939C527!
 EB628E3AD7044F0D54C526E7FF916BAEDE71F01819E16D07F8694D0DAD85BD5AB9434D658A0424DB041BD1676F3332225AF665BCC837CBE4D79657D73E926352BE5EFB67C8976FCCFA650C865AC580BBE855A7BFBB5BFBC7DE467FAAF00C80A3AB0AA20223922E1D04E7DAFBE57D9D8A8ACC9CD9DB0E5869B906D3848694F93FECF9B16FA90B2BF8172336FF93C18F7C62B702826FACCAE20D569FEE31C824110BE65FF050182E0936F050CC2C2F7401DB042576504FAC943555586DEC6C6ECECD643AB6F64BB65575555E9599C4B008376BD1B952D04E4FFA7E28A41DC86A1A8D3AD1E3214B469F170940C1D54085E3AB4851B8E1EF5A0E112E892426829189AFACC2D221C24B77AEA208CA078F1A0BDB307F7B62C598C13088136F55EC32D99FABFECA4A98864CB0424BEFF97DE7B92CCD00C645DA62435640F11666BF2237B3361E298D544F7707AEC39CC11DB1CBF89B1CD81C7F4AD3C47779CCD803C5BE3577A9E16677A1C29F563AEE680A4948AA248919AA435645242DB046A242DA15E967549EA3AFD434CDBE581439C08118E73043946AF77DD258C0BFB6D8E69FBF025CF1FB6F0EBDF7F9BDDD8CCB6A250C6A95443AE27131D9EDF9E4FCE237D2B42E5259E548A324FD2BA5093248934D82A54999E32B8ABC2D0C3F060C7D7D13B367F28DA29160C0208FAEBD6240B8!
 B3EBE95FEA38FBB999D518BC22C99166A18768578D6E9AC2EF8EA220A834425BEE05C5
C70B110820780A3E036107C31E53F2BEE0751C71F570EF9DF2D0DD26227BB890CB1828E80159EEEF77BCC165CCCFD9BD71F76CB51665B058D8142D8FAAC9A08DC8DCD579D40A5A1AEB42F3A0BEE77DE2D38F7C5220804B41B70A1F938E43E1F737F4C013191F5411B6DFBD090B9936041035DDE3F1E0C5E18720DD7C1E00A8AAB27BF66AE6B772DC0EC1B401DF659186A70011D0D93444D55B774A730BA2118929E9CC2BC0349165887316F0AE09B7A4060CA6601B3592F69FB901D14DBD63DD0512E3FBDC4F419F277C8EF9B5A30CBB2CCB3289E1D8208B4DD54A631855CD091749DCA29111DB14D4D585D6E7A25851E806F823FAE7B318B252154228361260EB38307AE9B46FF217F23D3B26BFBFA0EF5285CB5B8EBB6428BCDA00B9555E1F045B3D10D1DC545B1319F9D424195A23CDBCEB7B19183A5F2A47902B15A4805E6AB60F85D9BF39AF8E7460764ED09B5067FB7E21C737BCBB7CB9B74B7CB32B327DA41D9AD877BF77F577F05180070305F1E2202685D0000000049454E44AE426082');
+
+insert into auctionImage (imageId, auction_id, data) values (3, 71234567, 'FFD8FFE000104A46494600010200006400640000FFEC00114475636B7900010004000000320000FFEE000E41646F62650064C000000001FFDB008400080606060606080606080C0807080C0E0A08080A0E100D0D0E0D0D10110C0E0D0D0E0C110F12131413120F18181A1A181823222222232727272727272727272701090808090A090B09090B0E0B0D0B0E110E0E0E0E11130D0D0E0D0D1318110F0F0F0F1118161714141417161A1A18181A1A212120212127272727272727272727FFC000110800BE00BE03012200021101031101FFC400A300000104030100000000000000000000000003040506020708010101010101010100000000000000000000000102030405100002010302030406060608030509000001020300110412052131064151221361718132140791A1B1425223C1627282B233D1E192A2C2532415F04334D26373A3168393B37484942527081101010002010302060301000000000000000111023121410361045171B1123213E1224223FFDA000C03010002110311003F00DFF4514501451450145145014514501451450145145014964E4E3E1C2F93952AC30C62EF24842A81E926AB5D55D77B374D6248FE7C7979A874FC140EB24CB7E1ADE256D5A54!
 F3E55A23ABBAFB76DDF27C134B2A000AB491F96109E6B1C00B2ADBF19249AB225AE8EDB3A8765DE64961DB331326584069635B8650C4852CAC01E36A93AE5BD9FE63F55F4EE3A60EDD938FE55C12A71D1CB13CCC8E815DDBBC9635B4BA6FE6BEEBBCC6D24DB07E445E1972E19FC25D45DAD1326B03B7D1DF4C196D2A2B4E6F5F31333224231672ACBC55216291A7EDBF36ABB7CBCEA36EA2D8964C9CA8B2736076498C6EACC50B1F2DDD5492B71C38F3B52CC12E56DA28A2A28A28A280A28A280A28A280A28A81DF3AD3A57A6C94DEB75C7C597FC82DAA5FF00DD47A9FEAA09EA2B5B657CF2E8483F91265E5FA61C6703FF003BCBA6D1FCFAE8E720362EE280F69810FF000CA68369515AAF73F9EBD3B876183B766E6330B82EAB8E9EABC8DABFBB50C7E7FE41375E9B1A3D39A2FF00FC0A60CB76D15AA76CF9DF8392BE66E5B0E76240085391094C88C16171FE5B721D82A4FA9FE6F74D6D1B3459BB3E447BB67E629387891B5B4DB9BE57DE8957B88D4790EF04CC5ABA93AA764E93C03B8EF792208CDC4310F14B2B817D10C638B1FA876DAB9FFAAFE6C750F567998FB7BB6D1B3B12A208188C8900F09F3E65B117FC2961DE4D54776DDB75EA4DC9F75DEB25B2B2E4E1A8F048D2F711C29C910770F6F1A4042A1FCC43A18FBF6E4D6FC43F4D590B5E431884EA886827995E078!
 F7D28C0B1D4D727BCD16717F1281EA3FD358B391F7AFECFEBAA80803D14A626EF91B46
5264EDF2BA6546750086E0FEDA9E16F5D36725C589B03DDC0FD3483B244342003BC7F4D07999919D931159B234A7F94BEE9FDAB5AF5B23FFE7FDD22DBBA9770DBB2E68E21B8632F91A982892589F822DED76D2E7856AD7624DCD25A8A9041208E208E0411C88A2BBA68AE70E95F9F1BC6D18D0606FD88375C78404F8A57D195A7B0BEABA4840F513DA6B7D74EF50ED9D53B441BD6D3217C59C1E0C34BA329B34722F1B329ACAA568A28A028A28A02986F3BCEDDD3FB6CFBB6EB3AE3E263AEA776E64F6220FBCCDC801CE9EC8E91234B23048D0167763600017249F45735754F50E77CCEDFA6876FF30EDB8775DB6153A5145CA1CB9458DE47FBA2DC17877D04AF537CE8DFB7AC56C7E9CC1976AC63A84D98E43CE47604D234C7E9E24D6B04C1CCDC1E6CB5864CC78AD264E490D2E8D6748795ED65D478788D5E13E5D67A2049E7982B5B4C4A596307B2CA0F1AAF4B9F9B89B7E5EC3F10B1E0E166CA9262405109981D1E7D8FF38022DE23E1AD3286304C3DE5361DDFD54629C7F89920CB3E5A18C490C9D9AA3BB37AC9E02D565DBB71DDA1D9E464D8F0B70C04631AEE2F1E96591CDD7CC7F30316E36B30E1DF503B8E124980AF9457E2148D4C82CACEC7DD5F4D0CCF8AEB16FF00D3187852C7BAEDB90B2C7043E764E24D1CFA4C97F0C7165A8D1C54DD751A4F23A97A0F132A4276!
 F9C478615668CE263B5CB02BC4F9DC4926FCF81AA218321E026F2B248DADD8BC6EACC2E2E75D9BB7BE99E4E0E74BE74D279ACB29F3257214036B9BDC31E1C682F39BD65B3489E4ED1879AD3411B471CF3C90E3C68641E12F1E323B48539AFE60AA9A46071ED3CCF69F5D4E6DBB2E3626D58D3E540F264650F38330B8D04D97C2A4F136BF2AC644C4BD952207BAC07DB4C2749C4450B0ACB59A732C517646A3D2B71F61A6AEAA395C7D7FD1555E137AF2BC8C79B2794846BEE26DF6D2B247E502A38B7227FA281BC8FA780E7DA69A352D25C70A41AA2927E548B1A55CDE9BB3807BFD028053C6DE822B71FC81EADF81DDF23A572E4B63EE43CEC30790C98C78D47FE2463E95AD316919B87D03D34F7026CEDAF331B73C162995872A4F111CF54643034A3B9A8A8FD8B76C7DFB66C1DE714FE4E74293A8EED42E54FA54F0A90ACA8A28A2835A7CECEA37D9FA5576AC672997BDC871B5036231D46BC83ED164FDEAD25D21BCEEFD2396FBCEDC60B245E4E563E490639632DE65B4DC3020F152BF655E7E770C9CAEB0DBF1E4BFC2C1801E207DDD52CCE246FA23515ADB7CDA63DACE3CA26975E44624D31101403702F70D7AD49D12AD9BBFCEADFB75832B140C0C28E54F2965C68E433C7ABDE7865672755B85C2F0ECE3540974CDE5C30466281486676E0EF637B05E6013CC9E269B43!
 2438C2D047A6FCD98DDBF457AD9A40366B5FF0F0FB2825866AE26385202B5D999A43C2
E493C1071350B9BBC34AC7CA25DF9099F869FD841C1699E54E5C902FC799A683B4136BD2986C1E82E988FA8F033A7C9CD971E0DB93CFC891046238A366203BB49A99D9F43E9555ECE278D36CEDB1303758B6E973A3976BCA78AF9E9658DA266172EAA5BCB75E2B22DF8536E89EA2CCE9CC962029C69884C98278FCD8A48CFE38CD8929EF211C8F7DEA6F76DCE3DD53142C28B0431B2C6C57F32457919F5CC493A9BC46DE8A764BCAFDB0CF8437D6DEDD91F6ED9A093314232905615F2608D08278B16BD38EA6C0C1DBB33718E2C78A78362DBE7C861240AE24DC379C86F868A4E57F2C38D1DD5A68E1AFC4EA5458E2009F3233A1B570FC2453819BBB61FF00D26EB9318F3239B43B97532424344EC1B9B211E1BF2A0D83D41D010C599B7EDFB7CD0634E71944EAFA990AE247AB3F70CA983111E991B40402E6DD955B9FA177DF8E970B05E1CB54C38B728F29253145263E412B132F9FA74B330B6935190F5DF58E14F14CF9706E0B0AE4C7E565C48E92266B0972525161AD64717373EAA17E65EF4B3CF36E3818F9432F271323256CD1A98B038E3E246233A5215201B01CF99A08EDC3073B66DDE6DBF3BF2B2F124F2A78D595C060037065B83C0D483462DACDE457173A8F107D07B2AB99FBFB6E5B864EE59487CFCC9E4C99AC786A95CB902FD82F615350F53F4EAC0914D899ACE!
 A2CD22CB1007F7741B7D34C9837C982C0BC675A8E63932FED0FD351D2BA20BB1B7701CEA465DDBA7B264508B990A936676F2DAC0F3365D37A75B547B3ED9BBEBDC9E0CBDB322190E267B248C8AE002AE513C5AD48D24106C7E9A2ABE46A1AAFC08B803BBD7590C6636E1607881DE0D3BDD25C2CADCF2E6DB11930A595A4C7575D074B73B2EA6B0D5CB8D2A64F2F0F195C6A50192FDA2C6FCFDB40D5200BC7B69655038F60AC93437B8D73DDC8D1243E6A34478123977F6D04EEC5D6BD4FD38AA366DD24871D6E463330960E3C4FE5497517F45AB717447CE9C4DDE78B69EA88936FCE908487312E31E463C02B87E3131ECE247A4569DDC7130BA736DDBA195E2C8CCCFC54CD974D99214909F2E21DEFC3C5DDCAA2B76C59E1C3DBE5C82867CD864CA6547570B1960220D637562035D4F1A83B468AE7FF0096BF3A8624583D37D50ACF1061041BB6AB945274C6B90A45C85F77583CB98EDAE80A8AD17F37B2C3F5A62624A584306DF1B89109568A496697C608BF30801AD7DBBEC53661494CAAC54594B4416EBDFAA1F09FECD5DFE61B09BE6367A37111E2E2C76FDC793FC75599A59F0243F08EAD09E2D8D28D519FD922C50FAAB3B6BBF3E3DB17BCBC57ABDBF9BDBE3F5FBAF17DD27E3BEB99BEBE971F94FA2AEBD2D9321D31BA5FB000DFF669A6E1D3FF00EDCA1F3B2442BD800!
 E27D43813560CFDF3708D4B40B163771505DBE97E1F5552775C89F26633644AD2CA49D
4EE4B13F4F2A9ACF2FF00ADB1F2917CBB7B297FE3A5DFD6DDA4FAE4CE768359106A651C9A4E67D82B38CF951875FE639B06FC2391B536A908317CD1196242817D2BC58DFD57B0AE91E4DAE6E7127C8F36E8834B6278801549E3E3979B7B16A7A6961F308D6156F65B71B01651F50A8C8E3754F2D621123789BC5A6FE963727B294455001D2835701DFF005D564BB48AFEE191AC09711A8240ECFC74D32F1E4867F2A49D9C0557678665916CEBA829310E045FC4BD87853C8A4C8818B63C8D130209F2C95371C45F49ECA4242D2316909673CD98DCFD26985CA365C6325DA299DADCC17D4413DE08A61262E42936BB05EFE753830FE2658E252AAD23045776D2A093CD9FEE8A4F2B133701D5332162928D71483EFADEDAE36E522DEA60CABA6E0F1E06BCA979E1C778C3960437BA4733E8B73A6498524CF64B2802E7511C07A871FAA98536B8D36B7A6FDB4F30646659316E6CE35C63B9D471B7AD6F4DE481E3731B8B3AF31DE3BC5630C86195251CD1835BD541669A4DBDF6BC248420CB842F9BE55C5D5C36A12A9E4E8C398F794FA293C85276DD43FE54BFC429028AACCA0F82FE027F09E2BF51A76AAD2EDD9F18F7A38D66007721B31FAEAA23E26BFB2A4F19FCD0219399E11BF71EE3E8A6381B66E39302CF0A44C8D7B069F1D1F877C724AAE3E8A95C7D937B747923C279444A!
 5E4F24C7332A8E6DA2191DAC3B4DA886992CD2E977E33E3AF971B3712A973C16FCB49351933B9F05F9713C6E4FACD4BEE31B8F87CA0418F263D60AF6904A37D9508CA16503BEE3E9E1453766209B7672F65769FF00BB0FFD09FEF9AB87FB4FC5EAF4FC3F995C5D23799202AA07002DEAE17ADD1B3754EEB9FF00253A976D9A7FCEDA0E2E24130001F84C99624F29BBFC1AD2FDD52871D767FF00D91BC1EE5C503FFB74FE9AADE6CACA64B0F7869B8E24036E3C2AC5D7DE1F98DBCFA5314DFF00FA741FA2AB196DC4F6FA3D35A9C337957B2CBAC0DAAFA59CE807BAC2FF005D56B36E640A05C9E42AD39E8D31080F0ED63D9C6BDC6DA7216D2C51F924F0F3E4035907F086BE91EA5F6D4540E0EC92CBA24C90555B8AC63991DEC4F05152E9008D34C68A80B5B48600D87E2BF1A903B6C03F9BAA43DA599D87D1A94560F8F8518B79641EF52C3EDD74C19346571E631040FBCDEF0F628F7BD66B12C411A8942C3803E295BFA053A5C7C3907872D2092FC17255910FAA784385FDF503D3586562E660BA7C54463F387E4CA4ABC720FF00B9C888B46FEC6340DCD9542B0F2C1E5127163FB46863DB25947DD51C58D0AA782422CE78B16E2DECEFAF06924F9635B1E6E68002DC6D74EDB8FB694F87132D938DB921248F65F95266C0DCF89FBBB2958DDA33AB80B5B52DFEBA08CCB87CA1!
 ACC292A837915810FC3D208FAE968FFD4188E38690B831C28A2E7C475140A05EF7EEAB
2614E89219D50491CAA22CA8C2866786E1995351166E1DFC6AAD91E561E53E461078B0DA40C149BC91E9374901E3E2068161B51DD70669B1640F978C430C75167F2AC4B49AB9691DBDDF6D79D75297B5997848BE9FC5EDAB3E6678CC396B32FC0C732F018C9E689A4D5E643F14D248AC4160DF9838F1E56A63B6E141BA66C8999998FB608A0999A69C111C8D1A16487C1F7DED607F4F3553CD8F728F6FF23709618F2156192178A6019091C05C107B34D39DA63F3F731005B266C534010DEC04A8CC9F4102D515B33C1108C6646F2E3E3E5413CD14640778588675427EF32A70AB01CF824DFE3CFC7F063AE4234234B4768C3F01A646765F0F31ABD5C2818E149B03ED7045BB0D590259926F878819E38CE9D2753695621C31009E54B8936C89E0C8DA648B172E3895FCD00C2F1CDA1445E5BF8ACC928D4E6FCAAB9BEC1F07BEE7C086CA991205B1E0416245658A49B5CF77D34173EAA9B6ECE497376950B82372CC4C6B2E90639024A0AAF62B36A603B01AA5CA2CE0F2E3FA6ACA9E3E9A9C73F273A17F6490C89FE1AAE640F6F6D0618D0B4B2CF1C6A59CAF840ED3AD455E3A61E51D11D758A14D9A3DB18FA1C66AA5BEBAA463BBC5933BC6C55BCB7B11CC71156CD932A4C7E97EA6C4D47466E1E3CA47EBC1B863056FA246A0BD7CC65D1F31B713F8F1F11AFF00FB32BFE1AAB4E!
 924D3886152F2C86C91F227D7E8EF356FF9AC9E57CC067E425C0C77BFECBCC9FA2A0E29136EC6932FF2D7265505E69BF9704646A50C058B337BC11789EDE1567097932931F6FD8D03E537C4E7B0D41540E17FC01B820FD66E26A1B2773DC72C9F2408D4F644A656F6B9069093738A595A4C388E4BB125B3F33C4CE4F364887814562D919925F5E4372E005940F60A06B90B9F62D2CB94BE9D2C05FE8A6666C9D568B3C920FB93007B7B6AED0B745CF04693646760E5363812CABAA655C90A97741A8DE366D570470FA2A337DDAF6E85227C2DCA3DDA395995D1E3D0F1D8075FCCE1AB9DB5055E3432AC3E7E545C72A10CBC3F362F4FD5D94F307779B1D1D31241262CA41C8C3906B864B7F9B0B70BF730F10EC34DDF1A44623158863CF1E437BF0B781BB787B7D34CCC0B331931AF0E429E31F2E3DDD96B0E77A8AB4418906E71993680C66894BCFB63317994282CD2623F395140B943F98BFAC38D350BE72A287015B8AB8E4D7E5723B6A130F3668E6492366832E160E8C84AB065370C84710473AB5CF9789BC629DCD42C3B9060BB9632AD9272C0FF00AC8828B2BF0FCD5E00FBEBF7851114A6FE1896C396B3CFFAA8E00D97C6E7FE3852D28F390967B18949371EFADF9DFBC522A4B02221A40F79C9FB68178A67C77125AD13358806E14F3B561B9C297F88400C5370917B357!
 F5D60045AB410CE18789870B1B731EA34BE1FFA88E4C29BDE3E1F511EE9AA21A1495EF
8719FCC881747B78DA01E3B03FAA45FECA4BCC4D1A23168C8E24F16614F61963C4C869F220F39E28E787CBBD806951A20C7D08C6F51AA34D81E361C6A29CE1DD629C5EE5102DBF6645753FD9661ECAF336738A4C4FC64EC00DC5BB0DEB1C79C45E7B15BFE5116ED2C1B40FE214D2139AA8D343E388717516702FD8CA79502D14F3E44DE64F12C80D831616361E9A934DBE392369B0B8941AA484FBC00E6C3BE9B99124C44CB8134293E5CA8392BDAE3D8D4E766C87833B1F207882BADC7E25274B29F58341258773B06E8BCF4CB8725FF007A44FD355DC91CED56C971D70D3A8F0E2E31C3242A9EA139B7DB554C9E47EAA04A1FFA89BFF0DFEC156CD8E113F4D753E4123FD1E0E322AF6DE7DC31F8FD11D552117C89872FCB7E27D9574E99889E88EB99FB160DB23BFED66AB7E8A0D8DF37B18B75AEDD213A227DB899653EEAA4133B3B1F507F6D6A4DEB749378CDF868EE98501368EFDA78F8BBD8F363ECE42B6BFCFBDDA1C7CBC4C5880F8818EDE73F6F965C388FD45D54D69280F918BADB8BBDC9EF24F3FA4D2702423D523F918EB723DE6EC029C9C350006BC8DDA5AFA7D8A2DF5D3EDBB0BE1B0D4BF19651ADCFAEB0CA2224200F19ED3F656B1D1E6F279AE6EBAF493BA2E6C7C241F99A40FD58D0FF001014D81C243FE9B2DA07EE652A87D762E9FDD15ECB1BCD2E917676F6!
 9F6D2F89B54790EE919D663FE6CA6C114FE1D4785EB17A2F8F7DAFF24DA61611672A856FE5E4C67F2C9ECE22FA4FB6D5E4D8C677F2D8E9CB1FC89B979B6FB8FDCDDC695936F748DDB1D9254E22489486E5DA54535C77560312427CB63681CFBC8E3888C9FE13ECA4B97794D2689B257CC50572A3E6391B8E63D0072F5FAE9C6DB9ACACB3A1B32F86551FF1ED14A65066033748F35088B2D7B18FDD73E86EDA62E462E62CC0FE54DC24BF3E3F788E16EFAAA9D94F96CB2456D37BA70F0F2E2BEA20FD158CE9E2598D931E5BB46A87EEF6ADBB08ACF1D5A681E0E6CA4691F4E8FAEEBEDAC1151F1A4D68CF242434416E4056367D407603C6AA305D4EA51088E2E275376D877FA6948E4D3950CFE66B325D5EFEF02A6C357AC5607924B3B6AB70F2BB6CB6B03E822B290388598C3A3CA915F571BAA9F0E93E837A832DFB18459EC40F065C4265F59163FDE5A80B5CDEAE1D4281B0B64CCEFF003616F63238FE23552B69623B891F41A0418E99651FA84FD256B3D95A3F8F09331582447599BB9749607D840A560556C99CB0054461483E9E3FA2B38704487C8490A2486CC02A8245F916BF2A294DADE2381BBAB0F04A22F201EC904A185BF775539C068E0956561758C863E9B710BED3484FE5E1BAE342A1D53BEE45FBFD26BC123CAC0B72EE1C00F50A09CC795E7DB77A9E537925F2!
 1D8FA5A6D46ABB93C6E6A7F1386CBB99EF38C3FBEC7F4557F22F7B50248409A6D46DE0
603DA456E0D9BA5372C0F92DD49B84B8B27C4EEEF8B3C38E14F99F0B8D3C4DE615E76B6B7FD9E35A7553CCCC48EDC5E554FA580AEE9F2C7C3F956E1A34DBD16B54A398BE74CFF17D6B99149ABCB8FE1E0B2F16D3652DA477F1AA66E3851E267C185148F225E124C89A1AEEBE615B71E5DF571F9D50B63F58EE2E2FE2F879D78DB9AA76F67106AABBD3E9DC31F2480B718F215120942F0F2CAEA1DD6AA2CD3A853A4725F081E81C2A1F3389B9F4FD75313B02DAAFC0F1FA78D4365F6FA2E2BAECF9D223D51CA49E5FF32421030E617B4D4AC9819102E26DF8EDA0C807E61008506DA9ADC89E35E74F498072333173DB479D8EE31A4EC128E201F5D259FB9CD9D8F143190B2C17B30E0483E13CAB8DCFDD3E1DDEEF6F3C7FAF6BB5C6D8FEBF3EF2B0CDC59A193831F28314138035AB0E4D7502FC7DE1DD5079035F97311E5F9C0A49A7EEBAB5B50FD96B1A9C8B2258D089889E420E88549625BBDDADA5477F6D41EE80E3C51E331BBC6A59CF6966E24FD34DF6977B759359DA4E8B259C9EE332E498CCC005CA071B20760727483EC6A8E9E076C7971E41F9B0B30B71F7949BFB787D752BB36D93EEEDB962C32C70BC18EDB806975043E5A8D6BA941D2C59469E1C4F0ACB738C1CE192A2D1E763C1976E36BCD1F8FDDFD74AAD30D85CE49C75BF8A7538E4FEBDBC07FB616A412364DCB!
 CB864117C402A9211C144E97048EE17E3509B1BB6317039E364AB8FDD607FC3567DDA358777C7503DD6084778599D07F76912A091748758D448EA46A9BEEA8E2BC2FD87BEBD7F2FC9C8FCE666D0A4920D99AEBE1FDDEF34A4C024932321C650E4261AF3E0DEEB7ECD6190645C79752A0044519516BADC823DA40E35448EF3287D8F678CFBDF1129F669415556605D8F7927EBA95DDB2BF2B060BF08237948F4B1E1FC350909D72017E1CCD45384BA2B13EF4AC5ADE81C07D94F713C0AF90FC028B0F5D618F8AD396773A631EFB9E40770AF32A6125A18B8429C17D27BCD03566323B4879937A5A3E7EBA480B52D18B9A099C736D8F3CF7CB8E2FEAD66ABF3F16F6D4FAF8762C8B1B6BC98B87ECA39AAFCA497EFE200A053688BE237CDBE21FF00332E15FED4AA2BB96B8C3A1B03FDC7ADB61C68EF66CD819CDAF6D0DE6B7D4B5D9F52F2AD0BF3FF00672B9BB7EEEABF97970BE2CAC3B1E33A96FEB57FAAB4F48B1E46CF0C8AB1C52C5FE9E650E5A42070491C1E5E25B57597CC3E9AFF00D55D2D99B744A0E6460646113FE747C42FEF8BAFB6B9331C08F38E1E4C871F1B2C94C8B8008900F0AB92090350E356254FEDF9C3336E8A427F31079720EE65E148E51B8BF7F03E83D950D04B3ECD9D2E2E48B293A651C08BF638B5C71A909661CC1BA9FA08AE92E67AC79B7D31B667151!
 D33B236A1C181A45B2622DE65DA197B597883ECA73347E60F05DBD5EF0F67DE151B243
25C85B311D80D8FF65AC6B1B1ACB0E9F779954A8C86248B12A2C7E9E3516CF265CEB1AF391801DE4936E359B62CE4710101ED623EC1763F4539860F86000FFAA97C1129E05750E3237E1B0E55CDDF58B1F4A4D0C5BCCB992A66490C3039276E04CAA1CC881DADF734B71F65259C41C5D94837FF0042D1FA4AC7952AA5EDFAB521D23911ECFE76E93413BC12AAC71CF085D3114D2F8ED3860DC18C40F2EDA85CDC8E38A8E6E71B114C9CBDE919F21B9FA6415BECBDCDF6C177CCB0F7A6D23D773FD3564DDF2125DE636D5650E4B37E1024663501B327970C72C9FF003243337A81FEAA70990EF912E4DC068D4952DC46A6E1CBB4F13483D2C59A46562E2573F9ADC657E24DC0ECBDE9B65B20686254D06E65604DFC3C93F4D2DE18D4BCBA82A8F1B8E7CFBFB3D0291DA767DE3AA3735DBB67C67C9CB9FEE2F28E21C2EEE7C28A395CD15179B399646606FE610A96FC0BC07D269FE0E0A431879AEEEDC4A2F1F65EBA3FA13E4D6C7D3719CDDF638B76DDA54D0C2440F8D0A91C5228E40751FD7617EEB558733E57F40E69264D8B1A363F7B1C3407FF002192A6472ACED24A0269288392AF65346465E7CBBEBA6B27E487464B738EF9B8A7B04791AC0F64CB2542657C83C737387BE48BDCB3E3A3FD68D1FD95730C39FE948F9D6E4C8F90FBFA5CE3EE18338EC0EB2C44FD024151727C!
 96EB38CD93170E41F89726DFC6829914490E9D8D7F5F289F5E98C7FDAA8DC2DAB3B74CE870B031DF232A636871E21A9D8FABB07793CAB6F6D7F243A972DD23DDF2F1B6EC356D44404E44C6FCF4F0441F4D6DEE96E89E9FE90C7316D18D699C5A7CC94EB9E4FDA73D9E81615326156F963F2B60E8F8C6EDBAE89F7C954A80BC63C656F79233F798FDE6F60E1CF6551454515CF3F3AFE5F360E54BD55B6437DBB31BFF00C94683F933B7FCEF4239E7DCDEBAE86A4F231E0CA824C6C98D658265292C4E032B2B0B1560798341C5EB2E3EED847133DC47B96329F2324803CE516558ADABC44F6F0E14C4FC560C870F363789D403A1C10C011707D208EDAD9BF327E5065EC0F2EEDB046F97B2DCC8D125DA6C4EDF4978C7637676F7D51A1DDA2CD7D1D469F121C24699A01BA2EABB35D4DD48BDF8037E55B959B3B544BCACBE21C47630E55E7FB9B28B31D407E2B1FB6F4E8C788D2C8715D8C3ADBCA2DEF14B9D3A8AF6DAB35C78CF320FA74A93F652F5666B8E0C06E3953DD31A32C7F101603D7D82A4368D967CD96DC6432DC48F7D21C0F118E326DE1FC6FDD4B22C09CD7CC23906F77E8152FB46E93451E746618658A64119C99515840476202ADAF503FCAFBDDBC2F5246927BF4C9B56D2BB1E34EC51F8E69471E5B9215F5268B7874586961753606FC2A86E25CE9CC2BC24CA6D4F!
 FA912FF50B54A6E595267E418E2064762491704DC9D44B30E172C6EC7E8E0052F8F8F1
6D90B49211264C9C5CF2E5C947728A53835CA2B8C8228C58800003B07203DB58C51E845436B93A98DF8EA3D9ECABCF45FCAFDEFAC265DCB34B6DFB493ABE2DD3F325FF00E5E37ECEE73E1EEBD6F6D83A03A4FA6CACBB66DC9F12B6FF00573DE69AE3B43C97D3FBB6A995C342F4CFCA8EA4EAC923932236DA768E0CF9592A44920E7F910B589F416B0F5D741F4BF49EC9D21B78DBB65C7F295ACD3CEDE2966702DAE57ED3DDD83B054E5151451451405145140514514051451405145140514514056BBEAAF93DD35D42F2666003B46E0FC5A4C7506176EF920E02FE9522B625141CD3BA7C93EADC07271F1A1DCA3EC970E511BDBD31CDA38FA89A853F2F3AA62243ECBBA0B73D312BFD62F5D61455CD4C390DF62CCC47D12EC9B84928FBB930CC17FB11A2DFE9A798FD29D5DBC1448367CC310E11A240608941EC06411AA8AEB0A299A61CF7B57C98EAD9BCB191F09B642FFCD2EE669547EC4434B1FDFAD83D39F283A6F6678F2F742DBCE7A1D424C816841ECD30025787EB5EB61D14EA74780000002C0700057B451514514514051451405145140514514051451405145141FFD9');
+
+insert into auctionImage (imageId, auction_id, data) values (4, 73219532, 'FFD8FFE000104A46494600010201004800480000FFE1122B4578696600004D4D002A000000080007011200030000000100010000011A00050000000100000062011B0005000000010000006A012800030000000100020000013100020000001B0000007201320002000000140000008D8769000400000001000000A4000000D00000004800000001000000480000000141646F62652050686F746F73686F702043532057696E646F777300323030373A30383A32312031343A32373A3533000000000003A001000300000001FFFF0000A0020004000000010000019BA003000400000001000000D30000000000000006010300030000000100060000011A0005000000010000011E011B0005000000010000012601280003000000010002000002010004000000010000012E0202000400000001000010F50000000000000048000000010000004800000001FFD8FFE000104A46494600010201004800480000FFED000C41646F62655F434D0002FFEE000E41646F626500648000000001FFDB0084000C08080809080C09090C110B0A0B11150F0C0C0F1518131315131318110C0C0C0C0C0C110C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C010D0B0B0D0!
 E0D100E0E10140E0E0E14140E0E0E0E14110C0C0C0C0C11110C0C0C0C0C0C110C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0CFFC0001108005200A003012200021101031101FFDD0004000AFFC4013F0000010501010101010100000000000000030001020405060708090A0B0100010501010101010100000000000000010002030405060708090A0B1000010401030204020507060805030C33010002110304211231054151611322718132061491A1B14223241552C16233347282D14307259253F0E1F163733516A2B283264493546445C2A3743617D255E265F2B384C3D375E3F3462794A485B495C4D4E4F4A5B5C5D5E5F55666768696A6B6C6D6E6F637475767778797A7B7C7D7E7F711000202010204040304050607070605350100021103213112044151617122130532819114A1B14223C152D1F0332462E1728292435315637334F1250616A2B283072635C2D2449354A317644555367465E2F2B384C3D375E3F34694A485B495C4D4E4F4A5B5C5D5E5F55666768696A6B6C6D6E6F62737475767778797A7B7C7FFDA000C03010002110311003F00F2A4925A3D07A657D47A9574E4BDD4E1B4EFCAB9BCB6B68DFB5AE77E8DB6DDB7D1A3D4FD1FAAF4948B1BA5E5DF5B2FF4CB71DEE2D6D874DC447E8E907F9DB773B6376FE7AF51C5FF00127!
 D31D431F959F90CB5C039EC68AE1B23F9BDD0FDFB3F7D0BA074FC1EA3D7FEAFDADAEB7
BC576750BDB53CBEAC7AA9366374CC0A36FE8D8CC5C866FB1FF004F272FED17FA8BD41D05A41E0E85016934347E78EB3D37EACF4FEA57E150FCCC9AE976D1901D500E8FA5FA3D9FBDFCB59E71BA3983EAE5563BFE8AB7FF00EECD2BDE327EA3FD57C876F7F4EC6DCE3EE22B689FF3550BBFC597D50B2670437CEBB2C61FFA366D44D742A1E2F92744FAA8EFAC19A70BA5E656DB830BC0CB6BA998E5ACF47ED9EE566EFF0016DF5B19D4ACE9B562B322FA982D2EAEC6B58584EDDCC7E41A3F397A6E0FF8BCE8BD1FA8D3D4B02EBF19F4B8101F6B5CC3FC83EAB3F3BFAEAF7D71BAFE9A707EB062B1D63F12DF4B22A6CFBE8B47BDAE89FA16358E6222BBA0BE2DD4BEA67D69E961CECDE997B2B60DCFB58DF56B681F9CFBB1FD5A99FE7AC55F5074ECEA3A86155998E7F4768DC01E47F25CB99FAE1FE2E7A47D62A9F7E335983D53E933258D86D879DB975B3E9EFF00F4FF00CF33FE17F9A414F82A4AEF59E8F9DD13A8DBD373DA1991491BA24B4823735EC710DDCC72A49294924924A5249249294924924A524924929FFFD0F2FC5AEFB2FADB8EC365C5CD0C686EE971706D63619DDBAC735ABD1BA9399F57BA158336BCAE9DD67298D193877B1991D3F35FBBD47DB5BAAF528C6B19F4FF0056BB12DC67FF00825C57D5FEBFD4BA35EEFB13ABDB73AA7D955C03AB7BB1EC6E5E3EEF!
 A2EF6DB5FE63EB5EB1D1BEBB7D5EFAEB8F6F40EB58DF63CABC167D9AD32D7BBC71AE7358EAF26B77BDB5BD9EA33FC17AA929F3DE81F5DB27A0D8D7D14B0B9CD2CB6D2497EC25EF6D6CDD156DAEDB6DB7659F9FFB8BA7ABEB97D69EB56D55F42EAF88E7DAE6B3D2CAC618B60793ED67E91D9B8B639DF99E9E57AB67F83A571BF58BEAE370ADCBB7A4B9DD43A560D82AB7A835CD700F7C06B2DAEAFE69ACB7753EB6DF4EE7FF00C6D6BA9FFC6E32E9E8785D5FA1BFD5EA0719B6E7F4CC9009B5B645AEA7D2FA2EDBF43D37ECF576576D7E9E4A14B897A4AFA5FF008D605C6CEA186C24C9347A6D9EDBB6DDD3EEDDFF0081A164E17F8D5A585D57560F7766BF1B1CB7FEDCC7AEEB3FF65D59FA9FF5D31ADC22DCFC8786565CC2CBC39D7E3D8C69B2CC4C9B3F9CCA6ECAEDB30F21CCFB45955575791EA5F8F6D88D9DFE367EA66201E9645B9AEEEDC7A9D23FB593F67AFF00E9A5C28B79637FF8CACACB6D5976F4EC8CAC72432BC838CDB59BE376DA7F43733D4F6FE62DC2EFF1B6EC66B0E3F4DB00FCD6B8877DEDB5B5AC7EAFFE383A3E638D23A10CFC51AB3ED8E634EEFDEF4BD3CA633FEDC5C9D7F5EFAC62E4BACE9CE763E2BB8C37D8FB58DF2AAE2E664D4CFF008BB91FAA9ED70F03FC6431D6373B032763DFB9AFE9F9F463EC04FE65173B2287FF009957FC23D74383D1BEB438!
 977EDCEA18959E28C9A30EEB1BFD6C8AFD7A6CFEC2F3FA7FC65F5A7B36E3F507E15C7F
3729ADC9A4FC323D3FB551FF005C6DFF00F09720E4FF008CDFAFD8CE1EAE4561AEFA0F6D35398E03FD1DAC6B98FF00ECBD222FAA2DF42EBBF519FF00582918FD47A8D793753FCDE43F19ADC860D7D9EA635B8ECF49CE3BF63E85E57F5BBEA1758FAAFB6EC8DB918563B6B32AA9DA1DFE8ED69F756F42CBFAF3F59F2BA81EA2FCD757710D696D5EC6437E8FE899EDDFAFF3BFCEFF002D747D27FC6B5D662BFA6FD65C56751C2B9BB1EE3A3A3FE13DAFDFFE6FABFF0008950517CF2125B7D7713A251D5DC3A4DEFB3A5DA4398E30E7D6D31B9BED73BD5F49FF00BEB2DE4D56398ED966D301ED00B5C3F79A9290248CE752EE6BDA4F769D3EE76E43DADECEFBD25314939696F29925292492494FFFD1F2FA1F435978B5A5CF7571491D9FBEB76E76ADFF0004DB5AAD559F5DE68AFA8B4DCCA346BDB1EA160FA18F63E5BBEAFCC66EFD2D15FF0035FA3FD12AD4FA1E95FEA025FB07A2418876F66E96FE7FE8BD441060C8E7B24A767EAE75AEA7D133EBCFC6F7556BF65D5DB269BB8DD5DCDFF09E9FA8DB3F7E9FE714FAB7D69EA599F59EDFAC547EA19C5CC2DF49C4EC7575B31FF3BE9B2CF4FF00495BFD9FE0D49AC3D4FD3C4AF26AC2C0C66329A8E4EE0D75A1BBF21CDF42BB9CCDF77AB75977F35456FF00D358A56754B2B73BA37D64C365B550E0CF56A6575E5D247F85A72696B5B!
 9BBF76FD994EBAACBFF0007755FD2101AAE2340F43D5722AEB9D25FF5CBA68F4729BB31FEB160D26087021D8FD4F1F5F52BFD2B2BB6AB3F7EBFA7FA1CBF578DEA5416DC5F688B5C03ED0C1EC70780FAB2AAFCDF4721AF6BFF00AFFE62B26BCEFABF994F50C2B5B938974FA1920134DF5F17E2E4D4EFE43BD2CCC2BBFF003D3E9BACD2C77E3752A5B895E39DDB5EEE90D0E2E2E6171B72FA1DD646EB5EDDF65BD3BFC27AFE9FFDCDFD1943CC4D5D83BEF1FDC9035FEEBBEF1FF9147B71F0D8E206438C1E3D321C3FADB9CDF72116E30262C79F0F601FFA31252FE9B5EDDD48712D6CBDA60989FA4D8FCC6B7E927A72EFA1AE631D353FF9CA9C258E8FDEADDEDFEABFE9A835E2B707D6E70734C830041FBCAB7938953B0EBEA14BD8458E2CBF1EB906978FA1BF7B76FA7930FB29F4B7B3FC124A693CB49968DA0FE6F31F04C9E59E07EF1FDC9D9E96F1EA077A7DF6913F88494C525A2DC3E965A1C321E416CFD1E1DFE8FF00F3352FB2F491CDD61F648E3E9FEE7F57F9699EE8ED2FB1B039399D78B1FF008F173125A7E8F4601DAD84C0DB2401BBF3F77F27F7522DE88D0E80F710D1B65DF9DF9DC7E621EE0FDD97D89FBA1EB9710FF0DA75D22D67E89D36807754ED376BFE07F7FDBFE0FF009CFF0047BD01C04E9F72D2EA38FD3862E3E4603A7DA2BCAADCEDC7D5027D6AA5B5BDB!
 4DCDFF07FE0AD59B04F6253C1B6B1146BF259252D8E3DBEFD14488307FBD143FFD2F2A
486841F04921CA4A7B4FAAD8B55F5B7A65B7370EDEA543463E53B4DB6B2E666B9ADB0FB6B76462D4FA77FF84FD0D4B03ADE3E5D4EAABCB66CBB187D99F10416B3F498EEDEDFE73F4166D659FB95AD1EAA2A6FD5AE916CB9B5E456F6D9B359752E7575EF9F6FF39BBFEB6B0EBADD6E15EF3681F67756452774B83B757BD9F99FA2F6FF00DB899106C9F164911407806FF477752A70B22DAE819BD32C77A59B86E3209DB35DCD68FD2537D7B9CEC7CAA7DF5FFC47AD558D8D9548C4662D59AFAA96DEEC8AD8E66DB28B80636AC9AADA9DFA6DCDAD95DBB365BFE169C7B16762E5E4E1DA2EC6B0D760EE3BF939A7DAEFED21EC7B9A6C825A0C39DDA4A70E2B3755D169E1A1577FA5DBE8F7F8D4749FF18D762372F2DBD2FEB1555FA792FF004DA59962BFA36B18D763B7ED3B4FE6FF00DB7E8D55AB977F896CDA5AEB29CA66596825B492692E23F37D5D9735ABCD2BB1F5BC3D8E2D70E083075D0F1FC9571BD53AADF147AF93735C0EEA85B61DC00DCEF66E7FD162286DF5AC4A7A565598191D37D0C9AA3713906DE46E6B83AA0D62CB17B5B21B58877D205CED44EEDA61CD572EC234515E465616563D3701E8DB630EC7E9F98F70A5B67F610AAAF16DDCC6D36BAC602E7064980DD5EFFCFF006B3F3D252017D627F57AF5FEB98FFC113FDAA38AAA1FD99FFAADCADBFA4DF5E3FDAEDC!
 4CA6620DB391B49A86FF00A1FA66B3D3F77E6FB9557B3127D9618F39FF00C824AD54DCC7480FAEA7B265CCD8D6CFF6EB0CB5BFD87AD2C7FABF6F56ACDDD049CAB191EAF4F711F6A64FE7D6DF637368FF0085C7FD2B3FC3E353F9F9EFC56B2BAEE707B69B645769076B8B63D40C7EC0D7ECDCDDEA5899630726BCAC4B2C6DF53839AE80069D8C39252D97D2BAA6139CDCCC3BF1DCD12E16D6F640F1F7B5AAAAF46CAFF19BF5A7368B2BE9543198AF6ECDEE76EBEB247B9ADC9F559BBFE0ED7D1EAFFC67F3CB91B716E881D206E77E7D6FB9FAFCADB1A9BC71BAE217DAD7704EAF84D77A720C83AE853124F795D7F42FAB14F54E9D5E6F54BF0BA1E187BA9A32328BC597B9A76DBB196E454CB198EE3B3D46FF00E8B47FACBD3BEA67D5B7D7D3A2FEB79A432FB5F5DACC7A5A1CD9A99FA1AAF73FD563DB6FD2DFE9FA5FAC237DB55B4F1201260092780B4EFF00AB9D4F1706CCDCE6B30831AD7D78F90F15E45A1CE156EA309DFACB99EEDFEABEBAEAF4FF003D6B7493D7B375E8D463743C4921F9E3F4418D3F49D6754CA75F9CC67FC4DDFF005A59FD7EAE8D875D789D373DDD5725EE36E7E5EC2CAF78F6D5563FAA7D5B76EEBDD6DCEFE77F43E9A4083B288ADDFFD3F2A49249253D263D4EEA7F53ED6D52EC9E8B6BAF2C6BB9C6C8DAD7D9E97E7B712FAEEF51FF00E0BED6B3EAAC!
 D5F57B22D712DFB564D55B04B40736A6DAFB1DB4FE91CD6BDF5FD0F625F577ABBBA575
3A323716303B6D8E6C1863FF004776E63B732D66CFF04FF63D5BFADDD671BAA75065781A74EC261AB146C6573AEEB6DD94B6B67E99FEFF00A0C4DD6EBEABFA5FD1C11CEBA8F05D0D7818393F57DF938563321D8C1C7330AD219954EE79F4F270DED1B73315ACF4FED2D77D0FE73D0A7F9E5CF153A322EC7B5B752F35D8DFA2E1CA72C62013C0981263C1131321F8993564B58C7BA9707865AD0F618FCDB2B77B5ECFE4AD9AAAE85D4FA4E4E47DA074CEB38D363B1CE98D93572E6E2ED9F4333FEEBFF316FE8FD2FF000BE8630B6C78D86F7060D00717447F55BBD25336750CC0C153AD75B4C6D14DAE2EAF82D6FE8DC767B376EAD3D3857580B9AF63034725D1E5F9A846CB2769BA5A3832E8FC4284999DDAF8EA81BE9A2E0475D5B95E2D818FA9994DADB6C0B19FA40D7869DEDDDB5877ED7FEF209C32013EA34C7835FF00FA4F6AD6E99D63EAFD18A29EA1D128CDB9BC647DA726A7B8F8D8DA9EF67FDB7E92C4701261E23C04FDDEE096BDD5A765EC75BB595B9E5CC64EC69261B265DB1A7E8EE510D27C3E64048B4013B81F213FDC991436F1B3B3716A753458D635CEDCEFA24CF1F48EE57F17EB5755C7780F7557B48DBB6C6FB7E334FA4E58A9934E389DE20FD170C9302848D76BD1DBEA7998F9D97F69EA79CECCB1ADF4EBA71185B532B6CFA78F4D993E9FA35B27FC1E35D!
 FE93F9C7EF54FF68515698787554623D4BBF4F67C7F4BFAB7F998AA8C84D28D05BC45B3939F9596E6BB32FB2FDBF45AE71200FDD60FA157F618ABB9D3A7026404C922AB7FFFD4F2A4924925294BF37BFF00051492485249249214924924A5249249294924924A5249249294924924A5249249294924924A7FFFD9FFED16CA50686F746F73686F7020332E30003842494D0425000000000010000000000000000000000000000000003842494D03ED000000000010004800000001000200480000000100023842494D042600000000000E000000000000000000003F8000003842494D040D0000000000040000001E3842494D04190000000000040000001E3842494D03F3000000000009000000000000000001003842494D040A00000000000100003842494D271000000000000A000100000000000000023842494D03F5000000000048002F66660001006C66660006000000000001002F6666000100A1999A0006000000000001003200000001005A00000006000000000001003500000001002D000000060000000000013842494D03F80000000000700000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF03E800000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF03E800000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF03E80000000!
 0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF03E800003842494D040800000
0000010000000010000024000000240000000003842494D041E000000000004000000003842494D041A00000000033D000000060000000000000000000000D30000019B00000004006B00690074007400000001000000000000000000000000000000000000000100000000000000000000019B000000D300000000000000000000000000000000010000000000000000000000000000000000000010000000010000000000006E756C6C0000000200000006626F756E64734F626A6300000001000000000000526374310000000400000000546F70206C6F6E6700000000000000004C6566746C6F6E67000000000000000042746F6D6C6F6E67000000D300000000526768746C6F6E670000019B00000006736C69636573566C4C73000000014F626A6300000001000000000005736C6963650000001200000007736C69636549446C6F6E67000000000000000767726F757049446C6F6E6700000000000000066F726967696E656E756D0000000C45536C6963654F726967696E0000000D6175746F47656E6572617465640000000054797065656E756D0000000A45536C6963655479706500000000496D672000000006626F756E64734F626A6300000001000000000000526374310000000400000000546F70206C6F6E6700000000000000004C6566746C6F6E6700000000!
 0000000042746F6D6C6F6E67000000D300000000526768746C6F6E670000019B0000000375726C54455854000000010000000000006E756C6C54455854000000010000000000004D7367655445585400000001000000000006616C74546167544558540000000100000000000E63656C6C54657874497348544D4C626F6F6C010000000863656C6C546578745445585400000001000000000009686F727A416C69676E656E756D0000000F45536C696365486F727A416C69676E0000000764656661756C740000000976657274416C69676E656E756D0000000F45536C69636556657274416C69676E0000000764656661756C740000000B6267436F6C6F7254797065656E756D0000001145536C6963654247436F6C6F7254797065000000004E6F6E6500000009746F704F75747365746C6F6E67000000000000000A6C6566744F75747365746C6F6E67000000000000000C626F74746F6D4F75747365746C6F6E67000000000000000B72696768744F75747365746C6F6E6700000000003842494D042800000000000C000000013FF00000000000003842494D041100000000000101003842494D0414000000000004000000013842494D040C00000000111100000001000000A000000052000001E0000099C0000010F500180001FFD8FFE000104A46494600010201004800!
 480000FFED000C41646F62655F434D0002FFEE000E41646F626500648000000001FFDB
0084000C08080809080C09090C110B0A0B11150F0C0C0F1518131315131318110C0C0C0C0C0C110C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C010D0B0B0D0E0D100E0E10140E0E0E14140E0E0E0E14110C0C0C0C0C11110C0C0C0C0C0C110C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0CFFC0001108005200A003012200021101031101FFDD0004000AFFC4013F0000010501010101010100000000000000030001020405060708090A0B0100010501010101010100000000000000010002030405060708090A0B1000010401030204020507060805030C33010002110304211231054151611322718132061491A1B14223241552C16233347282D14307259253F0E1F163733516A2B283264493546445C2A3743617D255E265F2B384C3D375E3F3462794A485B495C4D4E4F4A5B5C5D5E5F55666768696A6B6C6D6E6F637475767778797A7B7C7D7E7F711000202010204040304050607070605350100021103213112044151617122130532819114A1B14223C152D1F0332462E1728292435315637334F1250616A2B283072635C2D2449354A317644555367465E2F2B384C3D375E3F34694A485B495C4D4E4F4A5B5C5D5E5F55666768696A6B6C6D6E6F62737475767778797A7B7C7FFDA000C03010002110311003F00F2A49!
 25A3D07A657D47A9574E4BDD4E1B4EFCAB9BCB6B68DFB5AE77E8DB6DDB7D1A3D4FD1FAAF4948B1BA5E5DF5B2FF4CB71DEE2D6D874DC447E8E907F9DB773B6376FE7AF51C5FF00127D31D431F959F90CB5C039EC68AE1B23F9BDD0FDFB3F7D0BA074FC1EA3D7FEAFDADAEB7BC576750BDB53CBEAC7AA9366374CC0A36FE8D8CC5C866FB1FF004F272FED17FA8BD41D05A41E0E85016934347E78EB3D37EACF4FEA57E150FCCC9AE976D1901D500E8FA5FA3D9FBDFCB59E71BA3983EAE5563BFE8AB7FF00EECD2BDE327EA3FD57C876F7F4EC6DCE3EE22B689FF3550BBFC597D50B2670437CEBB2C61FFA366D44D742A1E2F92744FAA8EFAC19A70BA5E656DB830BC0CB6BA998E5ACF47ED9EE566EFF0016DF5B19D4ACE9B562B322FA982D2EAEC6B58584EDDCC7E41A3F397A6E0FF8BCE8BD1FA8D3D4B02EBF19F4B8101F6B5CC3FC83EAB3F3BFAEAF7D71BAFE9A707EB062B1D63F12DF4B22A6CFBE8B47BDAE89FA16358E6222BBA0BE2DD4BEA67D69E961CECDE997B2B60DCFB58DF56B681F9CFBB1FD5A99FE7AC55F5074ECEA3A86155998E7F4768DC01E47F25CB99FAE1FE2E7A47D62A9F7E335983D53E933258D86D879DB975B3E9EFF00F4FF00CF33FE17F9A414F82A4AEF59E8F9DD13A8DBD373DA1991491BA24B4823735EC710DDCC72A49294924924A52492492949249!
 24A524924929FFFD0F2FC5AEFB2FADB8EC365C5CD0C686EE971706D63619DDBAC735AB
D1BA9399F57BA158336BCAE9DD67298D193877B1991D3F35FBBD47DB5BAAF528C6B19F4FF0056BB12DC67FF00825C57D5FEBFD4BA35EEFB13ABDB73AA7D955C03AB7BB1EC6E5E3EEFA2EF6DB5FE63EB5EB1D1BEBB7D5EFAEB8F6F40EB58DF63CABC167D9AD32D7BBC71AE7358EAF26B77BDB5BD9EA33FC17AA929F3DE81F5DB27A0D8D7D14B0B9CD2CB6D2497EC25EF6D6CDD156DAEDB6DB7659F9FFB8BA7ABEB97D69EB56D55F42EAF88E7DAE6B3D2CAC618B60793ED67E91D9B8B639DF99E9E57AB67F83A571BF58BEAE370ADCBB7A4B9DD43A560D82AB7A835CD700F7C06B2DAEAFE69ACB7753EB6DF4EE7FF00C6D6BA9FFC6E32E9E8785D5FA1BFD5EA0719B6E7F4CC9009B5B645AEA7D2FA2EDBF43D37ECF576576D7E9E4A14B897A4AFA5FF008D605C6CEA186C24C9347A6D9EDBB6DDD3EEDDFF0081A164E17F8D5A585D57560F7766BF1B1CB7FEDCC7AEEB3FF65D59FA9FF5D31ADC22DCFC8786565CC2CBC39D7E3D8C69B2CC4C9B3F9CCA6ECAEDB30F21CCFB45955575791EA5F8F6D88D9DFE367EA66201E9645B9AEEEDC7A9D23FB593F67AFF00E9A5C28B79637FF8CACACB6D5976F4EC8CAC72432BC838CDB59BE376DA7F43733D4F6FE62DC2EFF1B6EC66B0E3F4DB00FCD6B8877DEDB5B5AC7EAFFE383A3E638D23A10CFC51AB3ED8E634EEFDEF4BD3CA633FEDC5C9!
 D7F5EFAC62E4BACE9CE763E2BB8C37D8FB58DF2AAE2E664D4CFF008BB91FAA9ED70F03FC6431D6373B032763DFB9AFE9F9F463EC04FE65173B2287FF009957FC23D74383D1BEB438977EDCEA18959E28C9A30EEB1BFD6C8AFD7A6CFEC2F3FA7FC65F5A7B36E3F507E15C7F3729ADC9A4FC323D3FB551FF005C6DFF00F09720E4FF008CDFAFD8CE1EAE4561AEFA0F6D35398E03FD1DAC6B98FF00ECBD222FAA2DF42EBBF519FF00582918FD47A8D793753FCDE43F19ADC860D7D9EA635B8ECF49CE3BF63E85E57F5BBEA1758FAAFB6EC8DB918563B6B32AA9DA1DFE8ED69F756F42CBFAF3F59F2BA81EA2FCD757710D696D5EC6437E8FE899EDDFAFF3BFCEFF002D747D27FC6B5D662BFA6FD65C56751C2B9BB1EE3A3A3FE13DAFDFFE6FABFF0008950517CF2125B7D7713A251D5DC3A4DEFB3A5DA4398E30E7D6D31B9BED73BD5F49FF00BEB2DE4D56398ED966D301ED00B5C3F79A9290248CE752EE6BDA4F769D3EE76E43DADECEFBD25314939696F29925292492494FFFD1F2FA1F435978B5A5CF7571491D9FBEB76E76ADFF0004DB5AAD559F5DE68AFA8B4DCCA346BDB1EA160FA18F63E5BBEAFCC66EFD2D15FF0035FA3FD12AD4FA1E95FEA025FB07A2418876F66E96FE7FE8BD441060C8E7B24A767EAE75AEA7D133EBCFC6F7556BF65D5DB269BB8DD5DCDFF09E9FA8DB3F!
 7E9FE714FAB7D69EA599F59EDFAC547EA19C5CC2DF49C4EC7575B31FF3BE9B2CF4FF00
495BFD9FE0D49AC3D4FD3C4AF26AC2C0C66329A8E4EE0D75A1BBF21CDF42BB9CCDF77AB75977F35456FF00D358A56754B2B73BA37D64C365B550E0CF56A6575E5D247F85A72696B5B9BBF76FD994EBAACBFF0007755FD2101AAE2340F43D5722AEB9D25FF5CBA68F4729BB31FEB160D26087021D8FD4F1F5F52BFD2B2BB6AB3F7EBFA7FA1CBF578DEA5416DC5F688B5C03ED0C1EC70780FAB2AAFCDF4721AF6BFF00AFFE62B26BCEFABF994F50C2B5B938974FA1920134DF5F17E2E4D4EFE43BD2CCC2BBFF003D3E9BACD2C77E3752A5B895E39DDB5EEE90D0E2E2E6171B72FA1DD646EB5EDDF65BD3BFC27AFE9FFDCDFD1943CC4D5D83BEF1FDC9035FEEBBEF1FF9147B71F0D8E206438C1E3D321C3FADB9CDF72116E30262C79F0F601FFA31252FE9B5EDDD48712D6CBDA60989FA4D8FCC6B7E927A72EFA1AE631D353FF9CA9C258E8FDEADDEDFEABFE9A835E2B707D6E70734C830041FBCAB7938953B0EBEA14BD8458E2CBF1EB906978FA1BF7B76FA7930FB29F4B7B3FC124A693CB49968DA0FE6F31F04C9E59E07EF1FDC9D9E96F1EA077A7DF6913F88494C525A2DC3E965A1C321E416CFD1E1DFE8FF00F3352FB2F491CDD61F648E3E9FEE7F57F9699EE8ED2FB1B039399D78B1FF008F173125A7E8F4601DAD84C0DB2401BBF3F77F27F7522DE88D0E80F710D1B65DF9DF9!
 DC7E621EE0FDD97D89FBA1EB9710FF0DA75D22D67E89D36807754ED376BFE07F7FDBFE0FF009CFF0047BD01C04E9F72D2EA38FD3862E3E4603A7DA2BCAADCEDC7D5027D6AA5B5BDB4DCDFF07FE0AD59B04F6253C1B6B1146BF259252D8E3DBEFD14488307FBD143FFD2F2A486841F04921CA4A7B4FAAD8B55F5B7A65B7370EDEA543463E53B4DB6B2E666B9ADB0FB6B76462D4FA77FF84FD0D4B03ADE3E5D4EAABCB66CBB187D99F10416B3F498EEDEDFE73F4166D659FB95AD1EAA2A6FD5AE916CB9B5E456F6D9B359752E7575EF9F6FF39BBFEB6B0EBADD6E15EF3681F67756452774B83B757BD9F99FA2F6FF00DB899106C9F164911407806FF477752A70B22DAE819BD32C77A59B86E3209DB35DCD68FD2537D7B9CEC7CAA7DF5FFC47AD558D8D9548C4662D59AFAA96DEEC8AD8E66DB28B80636AC9AADA9DFA6DCDAD95DBB365BFE169C7B16762E5E4E1DA2EC6B0D760EE3BF939A7DAEFED21EC7B9A6C825A0C39DDA4A70E2B3755D169E1A1577FA5DBE8F7F8D4749FF18D762372F2DBD2FEB1555FA792FF004DA59962BFA36B18D763B7ED3B4FE6FF00DB7E8D55AB977F896CDA5AEB29CA66596825B492692E23F37D5D9735ABCD2BB1F5BC3D8E2D70E083075D0F1FC9571BD53AADF147AF93735C0EEA85B61DC00DCEF66E7FD162286DF5AC4A7A565598191D37D0C9AA3!
 713906DE46E6B83AA0D62CB17B5B21B58877D205CED44EEDA61CD572EC234515E46561
6563D3701E8DB630EC7E9F98F70A5B67F610AAAF16DDCC6D36BAC602E7064980DD5EFFCFF006B3F3D252017D627F57AF5FEB98FFC113FDAA38AAA1FD99FFAADCADBFA4DF5E3FDAEDC4CA6620DB391B49A86FF00A1FA66B3D3F77E6FB9557B3127D9618F39FF00C824AD54DCC7480FAEA7B265CCD8D6CFF6EB0CB5BFD87AD2C7FABF6F56ACDDD049CAB191EAF4F711F6A64FE7D6DF637368FF0085C7FD2B3FC3E353F9F9EFC56B2BAEE707B69B645769076B8B63D40C7EC0D7ECDCDDEA5899630726BCAC4B2C6DF53839AE80069D8C39252D97D2BAA6139CDCCC3BF1DCD12E16D6F640F1F7B5AAAAF46CAFF19BF5A7368B2BE9543198AF6ECDEE76EBEB247B9ADC9F559BBFE0ED7D1EAFFC67F3CB91B716E881D206E77E7D6FB9FAFCADB1A9BC71BAE217DAD7704EAF84D77A720C83AE853124F795D7F42FAB14F54E9D5E6F54BF0BA1E187BA9A32328BC597B9A76DBB196E454CB198EE3B3D46FF00E8B47FACBD3BEA67D5B7D7D3A2FEB79A432FB5F5DACC7A5A1CD9A99FA1AAF73FD563DB6FD2DFE9FA5FAC237DB55B4F1201260092780B4EFF00AB9D4F1706CCDCE6B30831AD7D78F90F15E45A1CE156EA309DFACB99EEDFEABEBAEAF4FF003D6B7493D7B375E8D463743C4921F9E3F4418D3F49D6754CA75F9CC67FC4DDFF005A59FD7EAE8D875D789D373DDD5725EE36E7E5EC!
 2CAF78F6D5563FAA7D5B76EEBDD6DCEFE77F43E9A4083B288ADDFFD3F2A49249253D263D4EEA7F53ED6D52EC9E8B6BAF2C6BB9C6C8DAD7D9E97E7B712FAEEF51FF00E0BED6B3EAACD5F57B22D712DFB564D55B04B40736A6DAFB1DB4FE91CD6BDF5FD0F625F577ABBBA5753A323716303B6D8E6C1863FF004776E63B732D66CFF04FF63D5BFADDD671BAA75065781A74EC261AB146C6573AEEB6DD94B6B67E99FEFF00A0C4DD6EBEABFA5FD1C11CEBA8F05D0D7818393F57DF938563321D8C1C7330AD219954EE79F4F270DED1B73315ACF4FED2D77D0FE73D0A7F9E5CF153A322EC7B5B752F35D8DFA2E1CA72C62013C0981263C1131321F8993564B58C7BA9707865AD0F618FCDB2B77B5ECFE4AD9AAAE85D4FA4E4E47DA074CEB38D363B1CE98D93572E6E2ED9F4333FEEBFF316FE8FD2FF000BE8630B6C78D86F7060D00717447F55BBD25336750CC0C153AD75B4C6D14DAE2EAF82D6FE8DC767B376EAD3D3857580B9AF63034725D1E5F9A846CB2769BA5A3832E8FC4284999DDAF8EA81BE9A2E0475D5B95E2D818FA9994DADB6C0B19FA40D7869DEDDDB5877ED7FEF209C32013EA34C7835FF00FA4F6AD6E99D63EAFD18A29EA1D128CDB9BC647DA726A7B8F8D8DA9EF67FDB7E92C4701261E23C04FDDEE096BDD5A765EC75BB595B9E5CC64EC69261B265DB1A7E8EE510!
 D27C3E64048B4013B81F213FDC991436F1B3B3716A753458D635CEDCEFA24CF1F48EE5
7F17EB5755C7780F7557B48DBB6C6FB7E334FA4E58A9934E389DE20FD170C9302848D76BD1DBEA7998F9D97F69EA79CECCB1ADF4EBA71185B532B6CFA78F4D993E9FA35B27FC1E35DFE93F9C7EF54FF68515698787554623D4BBF4F67C7F4BFAB7F998AA8C84D28D05BC45B3939F9596E6BB32FB2FDBF45AE71200FDD60FA157F618ABB9D3A7026404C922AB7FFFD4F2A4924925294BF37BFF00051492485249249214924924A5249249294924924A5249249294924924A5249249294924924A7FFFD9003842494D042100000000005300000001010000000F00410064006F00620065002000500068006F0074006F00730068006F00700000001200410064006F00620065002000500068006F0074006F00730068006F007000200043005300000001003842494D04060000000000070003000000010100FFE11803687474703A2F2F6E732E61646F62652E636F6D2F7861702F312E302F003C3F787061636B657420626567696E3D27EFBBBF272069643D2757354D304D7043656869487A7265537A4E54637A6B633964273F3E0A3C783A786D706D65746120786D6C6E733A783D2761646F62653A6E733A6D6574612F2720783A786D70746B3D27584D5020746F6F6C6B697420332E302D32382C206672616D65776F726B20312E36273E0A3C7264663A52444620786D6C6E733!
 A7264663D27687474703A2F2F7777772E77332E6F72672F313939392F30322F32322D7264662D73796E7461782D6E73232720786D6C6E733A69583D27687474703A2F2F6E732E61646F62652E636F6D2F69582F312E302F273E0A0A203C7264663A4465736372697074696F6E207264663A61626F75743D27757569643A63393464383463372D346639652D313164632D623434612D646261643265353765663037270A2020786D6C6E733A657869663D27687474703A2F2F6E732E61646F62652E636F6D2F657869662F312E302F273E0A20203C657869663A436F6C6F7253706163653E343239343936373239353C2F657869663A436F6C6F7253706163653E0A20203C657869663A506978656C5844696D656E73696F6E3E3431313C2F657869663A506978656C5844696D656E73696F6E3E0A20203C657869663A506978656C5944696D656E73696F6E3E3231313C2F657869663A506978656C5944696D656E73696F6E3E0A203C2F7264663A4465736372697074696F6E3E0A0A203C7264663A4465736372697074696F6E207264663A61626F75743D27757569643A63393464383463372D346639652D313164632D623434612D646261643265353765663037270A2020786D6C6E733A7064663D27687474703A2F2F6E732E61646F62652E636F6D2F7064662F312E332F2!
 73E0A203C2F7264663A4465736372697074696F6E3E0A0A203C7264663A44657363726
97074696F6E207264663A61626F75743D27757569643A63393464383463372D346639652D313164632D623434612D646261643265353765663037270A2020786D6C6E733A70686F746F73686F703D27687474703A2F2F6E732E61646F62652E636F6D2F70686F746F73686F702F312E302F273E0A20203C70686F746F73686F703A486973746F72793E3C2F70686F746F73686F703A486973746F72793E0A203C2F7264663A4465736372697074696F6E3E0A0A203C7264663A4465736372697074696F6E207264663A61626F75743D27757569643A63393464383463372D346639652D313164632D623434612D646261643265353765663037270A2020786D6C6E733A746966663D27687474703A2F2F6E732E61646F62652E636F6D2F746966662F312E302F273E0A20203C746966663A4F7269656E746174696F6E3E313C2F746966663A4F7269656E746174696F6E3E0A20203C746966663A585265736F6C7574696F6E3E37322F313C2F746966663A585265736F6C7574696F6E3E0A20203C746966663A595265736F6C7574696F6E3E37322F313C2F746966663A595265736F6C7574696F6E3E0A20203C746966663A5265736F6C7574696F6E556E69743E323C2F746966663A5265736F6C7574696F6E556E69743E0A203C2F7264663A4465736372697074696F6E3E0A0A!
 203C7264663A4465736372697074696F6E207264663A61626F75743D27757569643A63393464383463372D346639652D313164632D623434612D646261643265353765663037270A2020786D6C6E733A7861703D27687474703A2F2F6E732E61646F62652E636F6D2F7861702F312E302F273E0A20203C7861703A437265617465446174653E323030372D30382D32315431343A32353A32312B31303A30303C2F7861703A437265617465446174653E0A20203C7861703A4D6F64696679446174653E323030372D30382D32315431343A32373A35332B31303A30303C2F7861703A4D6F64696679446174653E0A20203C7861703A4D65746164617461446174653E323030372D30382D32315431343A32373A35332B31303A30303C2F7861703A4D65746164617461446174653E0A20203C7861703A43726561746F72546F6F6C3E41646F62652050686F746F73686F702043532057696E646F77733C2F7861703A43726561746F72546F6F6C3E0A203C2F7264663A4465736372697074696F6E3E0A0A203C7264663A4465736372697074696F6E207264663A61626F75743D27757569643A63393464383463372D346639652D313164632D623434612D646261643265353765663037270A2020786D6C6E733A7861704D4D3D27687474703A2F2F6E732E61646F62652E636F6D!
 2F7861702F312E302F6D6D2F273E0A20203C7861704D4D3A446F63756D656E7449443E
61646F62653A646F6369643A70686F746F73686F703A63393464383463362D346639652D313164632D623434612D6462616432653537656630373C2F7861704D4D3A446F63756D656E7449443E0A203C2F7264663A4465736372697074696F6E3E0A0A203C7264663A4465736372697074696F6E207264663A61626F75743D27757569643A63393464383463372D346639652D313164632D623434612D646261643265353765663037270A2020786D6C6E733A64633D27687474703A2F2F7075726C2E6F72672F64632F656C656D656E74732F312E312F273E0A20203C64633A666F726D61743E696D6167652F6A7065673C2F64633A666F726D61743E0A203C2F7264663A4465736372697074696F6E3E0A0A3C2F7264663A5244463E0A3C2F783A786D706D6574613E0A202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020200A202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202!
 020202020200A202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020200A202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020200A202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020200A202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020200A20202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202!
 0202020202020202020202020202020200A20202020202020202020202020202020202
0202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020200A202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020200A202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020200A202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020200A202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020200A20202020202020!
 2020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020200A202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020200A202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020200A202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020200A20202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020!
 2020200A20202020202020202020202020202020202020202020202020202020202020
2020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020200A202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020200A202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020200A202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020200A202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020200A20202020202020202020202020202020202020202!
 0202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020200A202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020200A202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020200A202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020200A202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020200A2020202020202020202!
 0202020202020202020202020202020202020202020202020202020202020202020202
0202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020200A202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020200A202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020200A202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020200A202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020200A20202020202020202020202020202020202020202020202020202020202020202020!
 2020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020200A202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020200A202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020200A202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020200A202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020200A2020202020202020202020202020202020202020202020!
 2020202020202020202020202020202020202020202020202020202020202020202020
2020202020202020202020202020202020202020202020202020202020202020202020202020202020200A202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020200A202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020200A202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020200A3C3F787061636B657420656E643D2777273F3EFFEE000E41646F626500640000000001FFDB0084000A07070708070A08080A0F0A080A0F120D0A0A0D1214101012101014110C0C0C0C0C0C110C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C010B0C0C15131522181822140E0E0E14140E0E0E0E14110C0C0C0C0C11110C0C0C0C0C0C110C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0CFFC000110800D3019B03011100021101031101FFDD0004003!
 4FFC401A20000000701010101010000000000000000040503020601000708090A0B0100020203010101010100000000000000010002030405060708090A0B1000020103030204020607030402060273010203110400052112314151061361227181143291A10715B14223C152D1E1331662F0247282F12543345392A2B26373C235442793A3B33617546474C3D2E2082683090A181984944546A4B456D355281AF2E3F3C4D4E4F465758595A5B5C5D5E5F566768696A6B6C6D6E6F637475767778797A7B7C7D7E7F738485868788898A8B8C8D8E8F82939495969798999A9B9C9D9E9F92A3A4A5A6A7A8A9AAABACADAEAFA110002020102030505040506040803036D0100021103042112314105511361220671819132A1B1F014C1D1E1234215526272F1332434438216925325A263B2C20773D235E2448317549308090A18192636451A2764745537F2A3B3C32829D3E3F38494A4B4C4D4E4F465758595A5B5C5D5E5F5465666768696A6B6C6D6E6F6475767778797A7B7C7D7E7F738485868788898A8B8C8D8E8F839495969798999A9B9C9D9E9F92A3A4A5A6A7A8A9AAABACADAEAFAFFDA000C03010002110311003F00E338ABB15762AEC55D8ABB15762AEC55D4C55D4C55D4C55D4C55D4C55D8ABA98ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AE!
 C55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15
762AEC55D8ABB157FFFD0E338ABB15762AEC55D8ABB155F1C324868AA4F6AE0269205B30F2BE8CEBA95BDA49A643737329A96B9E4CAAAC3F6A1FB1FF079599B6703DCB47F26797EDE10F269907AAF42C1A34201F051C7ECE4A365814D3FC37E5EFF00AB5DA7857D08FF00E69C931B483CE16FA069BA7B3AE9F6A25A1A7EE631DBE1FD9E593885B78C5D79B658E7744D3AC99396DFBA02A3232098943BF99ED9EA24D134F2C7AF18A877F1FDAC8D32523ACE90451F43B7DFF90B2E2B4D1BDF2AC8E1A5D1E5407ED08A634FF600E2B4B5FF00C16E4520D4231D36789B7FA571B2B4B1348D0AEE5E169753C658D156745DABFCCC8D920189653FF2A535C96D56E2D2FEDA6E42BC183A1DFA745930134A0245ABFE5B7997498CCB70B0C918EF149CBF80C41B5A48E0D0757B8DA0B492523F9057F564A90D4DA16B5054CDA7DCA05EA4C4F414FF002B8D302A04A95342083E076C55AC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC55D8ABFFFD1E338ABB15762AEC55D8AA77E5BF2DCFACCAF2BB7A1A75B82F7574DB2A81FB20FF3B64652A6518DA75777FA6A294B08C4505B8020000AB536F51DBF99FED653B92DE299E7E50E8725D4B73AF5E3191C90B106DF7A7DBC9016C245EB4065AD2E3B0C!
 2AF25FCC49B53B9B8748EDE564A9DC027AF4E83F6572C082F29B9D3EF44ACCD6F28249FB4A47F0DB224241421B79947C51B76EC47CBB60A4DB4508EA30526D6F163B5294F1FA322432B70046F4C56D1760E639C1F7FD472712D65EFDE43D48DDE9F1C25B93014F889EC3BFD1864141641ABE8D6D7D6B22BC6A5F89E2C7AF8F7F87005615E554B2B1D567B5994092324AF2DB6F1FF886495E851A44CA085AAD29423BF7FB59029416A1E59F2F6A8A45FE9D6F715EACD1AF2DBFCB03960430FD6FF25BCA97EA5AC049A74DDBD36E49FF0001272FF89629797F993F2A3CCFA187992317D68A4D2582A5A9FCCD1F518DAD30A646462AE0AB29A3291420E14358ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AFFFD2E338ABB15762AEC551DA369373AB6A3058DB29692660BB7604EEDFEC7232953288B7A84F656D39B4F24E9429046C0DE4A06EEEBFDE3D476E59546C96D3B04179E34ED374C82D74CB48B835033B53E23D157FE1B2F9000358365EC3E53D323D2F40B3B4414E3186623BB37C4DFAF2B80599DD39CB1834FBA91E3D7BE02A8196D165724D46F4DB635EBFF11C2249212F9F4547154501BB0DBC695FB3FF0060F2568A427F86E1706A919A9A54A0A787BE1B0A8697C9FA5B805ECA26A8D8!
 95506BF2FA31B5415C7E5DF9725A9364AA294251B8D083F16DFEC7FCFEDE054BEE3F29
FCBEF411ACD19E838BD7E2AB03D7F6A98D252B9FF296D91C7D5AEA443B7DA0A46FB76A74638400825927943CB77FA3DC2FEFD668CD08AA9141F6149E5FCDCB12A033FD99771B1ED90579779E2C8E93AB457D01A2B6FB6D4FC4FECFC39645059B79775AB6D4EC90C720760A050EC41A7BEFFEB64484A76BD37C82B476C055A342B461F4604B01F3BFE58699AF4525DD9C62DB5203E164002B91D9C61052F05D6344D4747BA7B5BE85A37534048D8FCB2484BF143B15762AEC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC55D8ABB157FFFD3E338ABB156C2D4D05493D862AE5525801D4ED8A43D0FC8C89A4417377222C7792A18EDE690D046187C4E72B9449671349FF906E34CB4F344AD777D1DCDDDD2B242D1F2216BF130FE5F897964626994907A8BAEB3E72782302482194CB31FF253655DBE15DF2C9498443DBAD5425BC680710140A7D18C58956C28689F6AE02556725A604B9C023E2E9892AE50BD7A9EB5F7E871B55A557B1A0EF4A78636AE31AD3E5523BF6A7BE1E25532869B0ED5EBF8FF00C2E0E24A9B42A6A8CBB375EA7AD77F8B0F12D3422457241DC9A915AD4D001D7ED6DFF35E1E2B452363FB3BFF0098ED8841623F989A7C979A621450CC84915F61BD3271D90F3BF2F6A3716172B1C9511921452B4AF4ED922!
 87B3695769716884302E051857BF86FFE4F1C81648E39155A77141F4644A5A00508ED885487CCDE51D2B5E857EB56C92C919AA96A827FC9665F8B0ABE7CF39F95FF00436A92C76E8C90B125617AD50782B1FEF13F970AD318C28762AEC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC55D8ABB157FFD4E338ABB154FF0040B7D164B3B86BA9261AA160B671A01E9D29F1F3277E4D842A69059FE879A39AFF0049924B4660E250A4301E2BB7FB2C4A433BD5DFCBFE63D3E19B48BD88DCC518596D1E91CAC07829A2B32E444BA24C5845816B2F3344A89E9BC61B973DA950D534C810CC72657E49B76B391F5865E51DECDC149A1A80DCD8AF2FF2B0016AF625B880202644E951F10FEB9214D641529F54B0881E5750A11B90CEBFD701924040CDE65D11369353B651DFF789FD71E24F0A1AE7CD3E5E28D4D5605F75753BF5EC701290109179E3CB70C7E9CBAB41211B862E2B4F0395D967C2170FCC2F28AD6BA9C3B74A303F778E4ACB1315ABF98DE51A1E5A8463DAB5A636BC2BD3F307CA2C69FA4E214EBC8918D95E1565F3D7945AA3F4B5B8FF00663240B13142EAFE67D2AF2C1EDF49D62DA3BA620095A40283BF1FF2B083BA692AD3E2861A037304EDDDC4C189FF0086CB048312197E9B7D0143575AF5FB61BB7FC0FECFECE02!
 57856EA77D66D1947F8D54FC63B74C3128A2C3F504D1B831F4C46CB5A501EF5FB59340
50B0F3C436158A2B39AE20068CD0AF24A8FF2BFC9FE5C3CD168A97F3674C818896C6EC28EADC09EE7B655205902D47F9D1E543F6D2E233DEA953FAF2165970A616FF9AFE4C94D0DE18DAA07C68C3AFD1B60E25E14D6D7CF5E53B91FBBD56DEA7F659C29FB9B25C48E12A1E63D1BCBDE6AB0685A685E602B0CF1BAB329EA3EC9C6D68BC1BCD9E4CD4746BC78A58EBD59644DD587D1D0EF920A4314208343B11D46162EC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC55D8ABB157FFD5E338ABB1546E9AD24570B2C6A5829A9DABF3D86297D15E59F36796757B086CEE1E249D1557D29E82A69FB3EA64884301FCD5D1BCBF6F22DD694C914E77758C8A57724FC3838536F3CB4BDB857E44866E25096A9241F13D722CB9239FCCBAA2ADBA4337A705B0FDDC2BB26FD792E3C979A7369E62F2D6A748B5A827B476EB756D2311BFED321DB06CBB856BBF22DB5EC267D03584BF04545BCD20590FB76DFF0067ECE3C34A0B17BAF2C6BD6B37A5358CFCAB4AAA16077FF23960B0947C1E4AF3B2209A0D26EC2B0142226DC1E878D315B4CAD3CAFE7A5DA4D05EE17B89E1DFC695F870AA60BE50BD714BCF295CC7E2F6A48FF846AE0428C9E48D22426AD7DA6B5765BCB73407DCA8F8714DA1A7FCBABF281F4FBAB6BD5EA151C2B7FC036349!
 B63F7BE5DD66C9CA5CD84D1B0EFC1B8FD0CB5C56D0234FBC6345B795BE48DFD315555D2B53A82B6D38FF0060E3EEDB1B545DB695E656DEDA0BC045775120FC462845187CF16BFF002DEA3D8498ECA86B9BDF35B232CF2DD94E8DCC3D29DD4E112410B74BD77CC1A4BD6CE69156B568981287FD65C3C48E166BA5FE68B10B16B3A52C8BB03340A4377FD93F0E3C416991C50FE5E799A30DC561B83BD194C2F5F6FE6E8B902C91B6FF00953E4E256AB34B53B7EF36DFFD55C484DA716FF95FE49550469E1BDD99ABFAF080C4C9737E58F9441E505BC96EDD8C5232FF005C7851C450D71F96B6AC0882FEE545085591F9A8069E2B9245B09F307E4F5E8E52DB37AE402792ECDDBED0DF0ABCD356D0AF34B99A39D190AF40C38D4614259815D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC55D8ABFFFD6E338AB22D03C95ABEB9A55FEAD6C512CEC01F519CEECE007F4D147F92705ABD4BF293C97A7CBA1AEA9A8DB892595996347150029A72A1FE6C92B21F317E5AE95A842EFA728B3BB00B46C9F08E5D474C41578B79A743D6F48B9306A45DC0DD589AD7B8C2770A18E8620785695C83353663F8F4C0AB4B1FBB0D22D1961A8B5B38E5531D7E250687E60FF003610696ADE95E58F385F69912DD076D47495A7AC0FC53423FCBAF55C06!
 36A090F63D2758D3F57B44BAB1996589C576EA3FD65C508EC50EC2AD322B02AC0153D4
1DC6054B6E3CB7A1DC37392CA30FD990703FF09C71A4DA0E7F2A45C58DA5DCD0B7EC873EAA0FF60DBF1FF658D2DA413DAF9B34E6669AC2DEFA104D25B7015E9E250E46AD97121A1F37D9C5384BB8DED1C6CCB347C4547F95BFFC364F802389935979974F923E71857DBFDD6411DBF0C7851699C5A969F31550C013D030A63C2AAE6DECE51BC71C83FD556F960A5B526D23496FB5636E7FE7927FCD38D2DBBF43E93FF2C307FC8A4FF9A70505B2B1F43D1A4003D8C040DC7EED47EA18696D5A3D3ECE2004518403600569BFB634B6AE1157A75A52BDE98D212AD535A1A74D1C6ED19E6090AE78B1F97ECE4C0B555B7D7F4D95C46F20864207C321001AF83569829531D987883F48A605631E70F2758EB96329F4C2DDA8255C0DCD3B6D84157CE3AFE817DA25F3DB5DC65373C188D8807122952CE35FEB8134D889E9502BEDDF05AD35C1BA50D7E5850B68475C55D4C55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC55FFFD7E338AB2AF2879BAEB45B1D4F4E047D52F63E4C09350E9B2F0FF5EBC5B01487AEFE5E7E60E897BA65B6992B0B5B981029E7B2B31279529F671521E86AE8E39230653D0835185093F99BCB765E61D365B3B850242A7D294804AB50F1DFED71DF1055F3D6B5E49D734A9E48A6B4731AC8104C07C2D5FB254E12120B1FBFB55B5!
 98C2B2895D7EDF1E80F75FA32292878636964545FB4E4015F12683150CC20FCBFD49F48BBB978D96EED08631D2B543D48382D29069FA85F68B7A258495653C648987C2CB5F895D0F55A6157A3683A890875CF2DB142BBEA1A583D0FED3443A64A9897A9F967CCF69AEDA2C8A42CE3ED2F4A9EF4C084F315762AEC55D8AA1A7D4AC206E135C468DFCA58576C55037B3F96EEA16FAD35BCE846EA4AB350F80FB7855E33E61B5B0B29E4B8D2A76B57EBFBA63C09A0FD9AE4A9095D87E636A76F586FD45D20F84C8A78B506DFEAE478995322B2F37E9B7C01B4D424B2BBEC9292072DBBD7085298CDE69F3669EA65F5CCF101B303CD48192A0C504FF9D3AADAB159A0576A529C40A6020282E3F9EF774A7D49397F36FF00860D9560FCF1D45B6FABA83E3F0D3F563B2AFB7FCF3BA5FEF6D43EFB5475FF0027E1C1B258BF9C3F31EF7CC5441188501A823AA8DF65A7F2E1B5A49AC3CDFACDA0F4DE5FACC03FDD736FB7806EAB91B4B2EF2FFE664F692288266850905AD663CE2249FD96FD9AE485143D4341FCC3D23520B1DD11693B7424D626F949DBFD96242A2BCCDE53D1BCD161C1C27320B453250D6A3F981FE6FDAC0AF9E7CD7E55BDF2D6A06DA7AB46DBC6F4EA3B602120A4D127360A3666341F4E0A656DB1922728E0AB2EC57C0D30B16C4B5DFF000EBE1DB0DA1504D11004918!
 3BEFB0AD053BF5C55CD1D9C83E1AA3788A907BF4F8B1553FA9291F0CA3E9047EAE58D2
A83C1221A11F76F81565315762AEC55D8ABB15762AEC55D8ABB15762AEC55D8ABB157FFD0E338AAE8C8E6BCBA577C551B2C7240C248DFE1FD8950EDD7D8E0A656CAFCA7F98FAD681208CC9EBD9B30E68FBEC3C0F6C569EF3E5EF34693E61B513D84A19E80C911FB4B5EDFE562C6921FCC5D5B4FFD1CFA4ADD88B529C0E0AA03305DF7FF00230713201E2573E46D712CA4D46085AE2CD0D1DC0DC78F25DF0AA47676F34D771C5102652C29E35AE297D55E5E0F2E8D672DCC7C6778544AA69B9038EF82904B11F3CFE59E9FAA412DE69F1FA576AB5F4D07DAA7864916F1AB7B8D5BCA7ABAB85292467E346FB322D7ECFF00B25C79279BD4F4CD7B4F36516B160A12DE57FF004A2868D149FCCC3F97964D872661279EB43B2B6497519BD1A8DDC02CA7A7C4A57E791A4A4F77F9C9E4D8437A52C9311D288547FC36FF00F0B8D2B11D4FF3CEECB95D3AD51129B336E7FE1B1D9522B8FCE6F364A8C8B22206AEEAA0115F0A2E0B4B14BDF336AF7B299A6B862EC6BD70DAA0DB52BF7AD677F8B63434FD582D548DCCCC38B3B30F024E2AB2BBFBE04DB7534C529869FAF6A7A791F579D820FD8624A9FF00626BFEAE4AD8D268DAC68DAB8E3A95BFD5A720FEFE2E95EBBA530DB14BAF7CBD3C4BEADA38BA80F464A134FF00571A54A0A952430208EA0E04B60E0576296B1577EBC508BB4D46!
 EACCD61734E9C4F4A61056999797BCFCF6D2AF3964B2714F8E33CA33DBE38C8C24AA6FE6DF317E99453EAC3323A541E038D695F81FAFC5CBF6B2403125E62E642E5A94604D29E3ED4CADB39A6B3CB6FAA5AA30023D4A15E2E2BB48BD981FE7E3F6B25CD8F2497A1AD771914B61A9FE7E18AAE24D295DBA62AD7A8C3BFD18DAB6253DFEFC55CD213D77F9FF006D7157108FDB89F6C5569888E8790F6C50B315762AEC55D8ABB15762AEC55D8ABB15762AFF00FFD1E338AAADB40D712F05EA1598FC9472C52113617E2D27FDEC627B63B490B7423A62A9A5F68F6D25AFE91D1E4F5ED284CD09FEF623DD641FB4BFE5E349B4268FAD6B1A35DACFA5DCBC339F868BB86AFEC943D6B815BD7759BCD4AEFD4BA62D702A6573D4BF7FF81C1492699B7E5FFE62C1A34634DD494C967310198D4F1A9FB584297A0E97F96BA147A936AF1FEF1243EAC201A81507A7DF86D8B0DFCD0F37F98F44F310D374BBC7B4B486142A894DEBBEED4C8D26D0DE53FCE6D5EDAE520D79BEB768EC019800244A9A576A72C559F79CBCA3A579B345FAF5804698A19A0993F6B6AE482393C5B42D565D03549ECAF949B09898AF213E07E1F500FF00270834A45A69797B1C2CDA2EA2DEAE9F2D1EC2E7C14D08E9F3C921865F594B6570F049BD3EC378AF62320943D7B62AD549EB8A1D8A5C37F9E2ADE056FF00!
 577C55C7A62968FF0099C50EAD70AABDB5E5CDAB73824287BD3A7DD8DA29341A8699A8
294D462F46E2945B98C6D53FCEB92B08A405EE9B25B51D1965818556543514276AE02136833D7FCFA604B58A1D8ABB15762AA89712A2940E781EAB5DB0DAD384C46DD8F6F95302569735A8EB8AAD249EBDFBE28762AE0698A5DD715762877BE2976055C1C8141EFF008E156CB2B9F8877EA3C3155A508F96285B8ABB15762AEC55D8ABB15762AEC55FFFD2E338AA73E5778535098CB2A435B69951E4FB3C8A5157014849B0A111677B73672FA96EE50F461D88FE5618AA77A29D3A6BE5BC91D22F4B93C90374242FEC7D3894848A790CB34929EAECCDF79AE052B01C52F41D07F347CC3A168D1430AA5D428C54FAE492BE014FF2E049633E6EF33CDE66D5DB5396210B322A18C1A814EE30B148C1C55E9BF951F982748BA5D17527FF0071D72E043231DA273F0FFC8B380A79B21FCD3F20C57103EBDA5A80F4E5322F420FED2F11879A06CF2A8EE1AF2C7EA13926E20A9B527AFF00951E486FB29EF5289D2FA2FA9DD3F0B88FFDE691813FF3C9B0284034091B9477A329A1DBFAE04D3825B8EAC4FCBC31577FA2F5F8BE5B6286AB057EC9A7CF14B7CA0EE877F7C55DCE0EF1FE27156FD4B5A6F19AFB1C50BE686D4A46D6AECEE56B3230A7135E8BFCD8AA17BD3BE156F1571AE2AAB05D4D0D551AA87AA1DD4FFB1C6D0D49E9BD5D071F15FE9812A5850EC55D8AB58AB7DB156B156!
 F156B156F15762AEEF8AB8604BB1576142ADBAC2D2A89DCA46DB33015A62956B9B392DC86FEF213BA4ABF648FA30250E1856806D850D1094F87AF8628598ABB15762AEC55D8ABB15762AFFFD3E338AB6868714868E28762AA901FDE0A8AEC462521B8E29659561894B48C68AA3A9381534D4342B8D2D62375C59E4152886A57D9FC1B224B30146D104914F00AB7A82A83FCA5AFF0C54840B432AEFC4D3E59360A7B8C55B048208342370462AF75FCB4F3F586ABA3FE81D6A709751A18D1E46E3EA47D29C9BF6D723C95E77E7CF2F4BA06B6D3414FABC8DEAC0EBBAEE796DF4E4AD3497EB1A77D6AC21F3058AFEE9CF0BB8D3731CA3F68FF0092F8AA512A5C5DACB74685A3A7A8075A7F3D302109850EC55AC55BC55D8A5D8A1B562AC194D08EF8A51AF025D406E20DA54FEF611D69FCC98AA08EDF218AB47143B15762AEC52EC50EC55D8ABB156B156F156B156F15762AEC55BE98A5C715762AD6284559DFCB6A4A802485BEDC2FBA9FA314AEBA8ADA40D7168782F56858EEB5FE5FF271541D714358ABB15762AEC55D8ABB15762AFF00FFD4E338AA32C74E9AEE1BB9E300ADA46259077A1609FC71484253156B1436AC54861B118AB24F295B88C5E6AEEA48B38C88BFE323EDFF000AB912C8285E6B22E0B015657079B11B93D4D321C2D9612F867782649E2A06435A7CBC72682!
 CD34AFCC0D0E04105E689134727F7CE054D4FED2A9C935B5AD794B48D5EDDF55F2A482
48F7696CBA3AEDFB2AD84845B03961921629229561D4114351812B031520A9A30EE36C559CF963558B5FB06F2D6AF255C293A75C39DD48DDA3A9C0136A5E5CB91A45E5DE95A901E8BD62BB81BA32578F35FF2F15426AFE5DBBD07525953F7BA5DC54C13FECBC4DFB24FF371C52916A7642D67F8378241CE26ED43DBFD8E1625038A1BC55D8ABB1576F8A5D8A15219648241246DC597A1C528DB9B78EEA037B6A2857FDE8847EC9FE75FF25B0252F20F8628A750F4C2B4EE0FD2876EB8AD3B8375A74C55BE0FFCA7EEC556D0E285E20958542123B1A1C064198812BBEAD31FD9391E20D83048F42B859CFF00CA71E30CBF2D3EE77D4E7FE438F1851A69F72E5B0B83FB269F2C1E206434933D177E8DB9077423E783C40CBF2735DFA2EE6952BB78E0F14321A29AF4D16EDC121761B93F2C4E6013F9193869339341B93D863E2865F9092F3A3CAA68C68723E30643B3E47F1FF1D54FD052802AD4E5D3078E127407BFF1FE955B4EF2B6A1A8C770F68BCCDB02CEB5DC81D78E5D1982E065C662527654524106A3623A11F3C9B52C34A6D507155B4C50D62ADE2AD62AEC55D8ABB15762AFFFD5E338AA67A4DCCD6F6BA918DA8B25BFA722F8867518AA5A7156B1570C55398F5492D745FA8C7B199FD4761E1DB0331C9BD0F451A8B34B7330B6B28CD1E6A57AF655C84A54CA31B6417BE4!
 8B6974F7BCD02F96F922AFAD6E4709471FB452BF6FF9B0092486112290E54EC41A119606A28BD2F57BFD26E96E6CA568E41D403B30FE565EF92050CC5BF44F9D612D185B3D7D17E24A7C131F15FD9E75C3CD584DED8DC594ED6F708525434653DA9914A823BC6C1D18AB8355606841C509C5C4B2EA9A7FD719B95E5AD04E7BB21FB2E7FD5C4A4320F2DEB0758D125F2B5F4844B532E9D31DC875F8BD1DFF00D5C8948492492CE312D8EA6B298A27F82440032B8F85978B7ECE1494233E803ECC770DFEC94628D94CDC69409A5ABB8FF2A423FE238AECB5EEB4FAFC1674F9C8C71A45AC1756C3A5AA56B5DC938ADAD6BA56624431A8ECA06D856D699F6FB0A2BD36EC702DAD33313BD3DF6C56D19A2FD59B508A3BB99A0B590F195D372478531484D3CD9A55BE9B7AB2E9AE65D3A6158A5AD4D47DA0D8D258F191EB5AEFE38D31B6BD593AF23855C2593F98F86287737229C8D3C31A4DB553D71547DAEA72C68B139AC6BD06D954E16E5E9F3889DD3A8EEF4E6B42776989A03DB314C656EE2192077D9D6B77688C7D652C08D80EB8C816D94E2792C82F2059C3B2D6304EC7C3E9C4C4D2F1C48A6AE2F217999914AA1ED8889A5196202A5D6A503A22C69C4A8F888EF82302C4668858754436DE97015FE6EF87C336BE3C2EDB835730C4F1A81F1F8D09C4E224B13A8815186FD5240E!
 00D8F439238CA7F3515F3EA6B3CBEA3F53E0300C6580D5443573AB195154B578EC0D3F
CEB86389AE7AB88E48ED07566B03EADADD05724728DB6A13D59724410E1E49C6480F3469C8253A85B00A929FF488C7ECB9FDB1FE449993136EBE428B1D2724C5AC50D62AEC55D8AAE11B9D8035C534D3295346143E18A1AC55D8ABFFD6E338AB61980201201D88F1C55AC55D8AB856B8AA20A996548D77AD117F56064CC34CD126D5661A4DA49C12DA22F393D0BA8E5C731EDBC8A0A76BA8DBD8CB15F584AF1CB6CE4CB6D27DA634E1B3775CB406B281F37D8C6CD6BAD5B270B7D4939B2765906CEBFECB26181635858AF8669609165898A3A905586C411BE2ACF74EBCD2FCE968BA6EA6CB6BAE46BC6D6E8FD9948E88FD32576AC3F59D12FF0047BD7B4BC8CA3A9F849E8C3B329C8A557CB7232EB16D1F2558E77114A24FB051CF16E58DA808EF35D82E81E66923B13C52064960706BBFDAE4ADF31812F43D37CB7A2F9F34D4D52290457ACA22BE8B6F865514136D9032A6556F33F33F966F3CBB7ED69742BB9F4DE840650763930589092E1438E28762AEC55BA1F9629A750834C569B181535B3D4C359C96175F14120F81BBAB766C369A4A585188AD69DF145358A1D438A5B0AC7A02715A5C2294F4463F20702D2E5B4BA6DC42E4788538555E2B4D4148020929E054E4486C8C88EA89B8B6BE8006688AA91DC7F6E478436F8D2EF4219E4F1E95DB0F08478D2EF5A6E24EA5B1E!
 10C4E6977B46663D5B0D20E43DED19D8FED63C28F10B4677FE6C691C656FACE3B9FBF0D2F1977AADD6A71A471968B31DC9C69165BE55EFE3BE34BC4883A8DD1B716ECD58E9420F5A78634B686A2F7E9E38A1C4C7BD01C2AEE49D97F1C0B6D161FCA0615B5CB2B28A2D062B6D7AB27F37DF8A16924F535C55AC55D8ABFFFD7E338ABB15762AEC55B1D715098E8AAD26A71B01C8A55C0F1E3F16573E4D90E6F40F21DCA47E628E365005D16576269F1302331ADC923663FAB7972E74E83509E68CF2B7BAE00914AA9272EE2DDAA92EFAC35EE917B6E187A50159A046FB400FB5C6BFB3973531FC2C1D8AB6A5948652430DC11B10714B294F33C3AC698BA56BBFDEC43FD135003E2423F665FE65C0A527FD03A9BC8CB6D09B80A2A1E2F8811E238E369E156B633DFA1D2EE2BF5A1FEF33C868411FEEA35FE6C28A28DF29F982F7CA7AFACB2AB0881F4AF2DCF74AFC5B7B7ECE448640BD5BCD5A4E9DE76D3126B2915AE0A096D5AA396E3ECB2E423B3221E74BF953E6BAA86B47A10492ABCA94C9DB05927E5D6AB1920DADD965EA040C7F1031B4D282F93A48686E2CEF78F7222236FF6430A16345E51B462B75697DCC7ECB155E9ED8AAC9351F2505022D32E4B52956947DFFB58ADA02E350D11FF00B9D3D90EDBB48715B413CF6BFB36F4F9B138A1BFAE463A5BC74F03538A5B4D415!
 2BFE8B0B127A9535FD78A2DC352707E182102BB7C15C696D736B17447D88D7E4831A5B
5A357BF1F664E3F251FD31A5B68EADA89EB3B7DC07F0C696D69D4AFC8A7AEF4F634C348586F6F0F59DCFF00B238A6DA4BCB9470E246246E2A491F8E34B69CC10E99ADAF1F512C354A7C3C8F186520789FEEDF0252CD434CBFD3A6F46F21689BB123E123C55BA3614213143B1570C55D8ABBB62AEC52DFB7EBC55DEF8A1AC52E2298A1D8AB58ABB15762ADD2B8AB650D0B5361D7DB155B8ABFFFD0E338ABB15762AEC55D8AA79E5789E4BAB96404BC76EEFB7CC6573E4DB0E69AB5EDCE9620BD836904AAC29D6A32902DB897A5EA5AD797BCC5A1AC8248D1EE47EF626F84F203E22DF77C3913B200796DCE911E9DAEC708902D95C7250F52400C29C4FD397E3958DDAF24698DDCC5E8DC4B175F4DD96BF234CB5A94CF6C5596687A4E9DA9693475513A13CA4A856DCFBE61E5C9289D9CEC38E321BA55A9797EE2D034B19F5211DC751BF719663CE24C726988DC25F697D7B672092D67785C774623F565F4E1D946BEB26F24125F2D6E06EB751FC32023ECB1FE6DF0532BB52D4EFA7BD6479D848EA3889A94765EDEA789C284DFCBDE6CBDD2A38E20D58A36E50BD48642372B5FE56C052FA0FCB3E71D1F5FD3E2B88275498802585C8043F703C7FC9C431213FDB0A164D043327A72A0743D8E2AC1FCD1E49F2ACB2196655499D764EA7E630A6DE1FE62D2ACF4FBE920B76E48A76AEF!
 B0DBB625212371434FBB1415B8ABB143B156B156F156B156F156B15762AEC55B04D7DF1566BE58F33DA4F08D23CC708BCB23F0C12B00658C9FE573D5710C89641FF2A7A3D5D5AEF41D423FAA9AF159ABC837F29E01B094241AAFE5379C34F72A2D45D46057D580F25A7DD5C0A90BF94F5F4AF3D3E71C763FBB6A0A7D18152D9ED67B7204D1B464F40C08FD78554A9F462AEA6F8157B46D4069B1EF8554F143B156FAE2968ED8A1AC55B552C683A9E98AA2ACF4DBBBD97D1B689E690F458D4B1FC305B2A66369F97CB650ADDF996FA1D2A0D8984B07B86FF5231809480EF31DFF009363F2AFD4B43B3717124E805ECC07A8EB1D5A4237F8579620959304C9307FFFD1E338ABB15762AEC55C31564DE4AB79A7BDBC8E204B9B57341EC572126C8A69ADBBD97D62DC44AF14B1A08CC8BDE9F13A7F94AD950E6DBCC30CFAC4A360E40F9E5DC21AB888578EF672D1F27E7C18150E7606BEF8294CAD46F64325D48E400C4D485E95C9060543A1C50AF6B7973692092091908F03407E6304A20B642663C93F5F334135A4B15CC656564215977049CC5FCBD4AC39875571A6344E663816D0C55D538AB81C56D36D335BBCB4B736B0CCB123372A95DBDF937DAED81369AA79F7CE81825BEAB3708871501CD29F22710AB87E6279D092B2EAB73E14572A41F98C5692BBAD6B55BB93D4B9D427!
 2D5A82ECC7E5F1570A10724734BF1B5CA4B2375AB54FFC3604A91B2B824900311D6846
1435F50BBFF7D31F90AF4F962868D9DD8EB0BFFC09EF8AAC30CABB3230F9823155B423B62AD5315762B4EA62AEC55D8ABA98ABA98AB6A581041A11D0E2967BE42F36DCC17F0D8BDCB5B3CADC526AFC0C49D9645F7C0AF6EB2F335BA916FAA3A5B4DFB13310B1BFFB23F0AB7F9388521172798F438D589BC8DB88A90A791FC30A1E37E7CD4752F353AC56BA6451450B12930203B0247DA3B1ED925610DE52D7475B63DFA32FF0391A64A12797756854B4B07003AD48C690ABA6E9171732189A48E343DE460A2B86916BEFFCB72DAC8144B1C808EA86BF88C69508DA484DE49957C4753912590088B0D21AE2654B5B79AEDC900041B75FBB23C41908944DFF009435A8F5192DBF47CEB312088550B50353F6F11253144C5F975AF2A09AFD23D3ADF6265B960A69FEA7DAC36C69111DAF9074750D75732EB176BD6180048ABEEEDD7136952BCFCC2BE585AD744B58748B53B7EE14190FFAD31DF1016D8CC93DE5FDC069A492E2773B3312EC49F9D70A115AF29B7BA4B006A2CE35434E9CD87A927FC3362104A575C287FFD2E338ABB15762AEC55D8AB2FF00CBE24F981E152795C412A285AD49FB54FF0085C849B228FF0039AFA69609C8F2F4C8E27B50FC59586CB61D7D716D32C29140B149182B2C8A4FC67B315CB834C9062B5F9E1404EBCC5A1B696B632D2897902CA056B43FB43!
 6C012424B8A1C70A1DED8ABB157018ABB15762AE15C55BE4474DB14B83B78E2B68A8353BB876560C3BABA86C555BF4BB56AD6B0904D4D1698AB6751B17147B155F74760715B515BB8D1C95122A7F287FBB15B4645A94206D75711D3A29F8BF8E2B6B5EFD5BA5D48DFEB01DFDC8C5567E90626866DBC4A7F41884B7F5C1CC51D0AF72CA3DB142A99E061B3C42BE232485093D3626861A76E8B914A994A529E91F9506295EC24E247A70F80206F8AAC5AD29E9C7F11D8D715733DB4647AB02B1F056F1C505AFAE5A2FD8B6FBD8E14350DF243711DC4702F28D83053D2A0F21D302593DD79E2E2FEC120BD025442C52D4034E44539F3FF002460654C69AE7507A942EA95F85456806F80C82F01EE53FF004F3FEFC3DFAB7F9F6C1C63BD3C07B9717BF514E52AFCC9C3C41784A935D5C9146918D7B924E4AD8D2C2EEDB6368A7A87933F2BE7D5B4C86FAF6E648619B75886C695F85B7F1CA0C89E4DC000CEB4EFCA7F2E5A3ABBA199850D5C93EFD0E3C25066986BB71E5FF26E9125F3C61154718615A2B3B6C02AEDFEAE3C081325E3FACFE6F799AFD985994B085BA08C55FF00E46B648414C9865EEA7A85FC865BCB992773D5A462DFAF2CA616A30DB4F3B058919D8F6504E032014449667E58FCB2D57596592E644B4B6A8E4588673FEAA03903907467C0F466D13F2EFC8962D3DE4!
 8936A010F02FF00BC90B11F0F0857ECF5C90DD897835E5C35CDDCD70DB995D9F7EBF11
AE4D828E2AFFFD3E338ABB15762AEC55D8AA7FE50BD167E62D3EE18FC1EA04623B72FDDFEAC89661927E60431D16290F09ED5DC293BF3590F25CAE3CD99E4F3F78D929C87DA151BD72D6A2168DCEDD70AB20D76D1AD74DB28E572F2B00E4313C96A3EC6F910C8B1FED9260EC55D8AA26C6D24BA94A44A5DC296006FD3C71A4AA5E08185445F57B85FB71F63EEB8AA0B143B15762AE38AAE8FD3E69CEBC2BF153AD3DB0253D934FD16396D26996EA0D3E65AB3B254920FFBACFED7C38195278D63F95CF6AA1750BA49D8EEEC84D3FD8D306E9D9896AB67696D7456CAE3EB56A45526E257FD890DDF24C690721424715E3B6E3AD4F8E142E81A24995A65E718FB495A5702A3EEAE74A59A19ECA034E03D686424A892BBF13E18D26D33B7D7BCB323402FB44555423D4781D94914FE5AE0A4D854F35C5E4A36B0DD79724904933524B592B58E9FEB622D058AD724C5D8A5DBE284E3CBD0E812CF2B6B73BC3022D5163524BB787C39136CC25B77F57FACCBF55AFD5F911172EBC7F679610C4A8D4E143B157034C555E0BB9E260508047B0C043389DD9BA44AD1C4CCA3914566A78F5CD64C9B76B8C0E16D220C76A2F86024B2118AA1D22D661C6715EF41B7E38633218CE00B8795F4EFB621A8F1249DFC7F0CB0E493488455F44F24D8C9AAFD76E9D63D36DFF7B372D9405F8A9960C848!
 A6A942215FCC7F9BD7A8FF00A3FCB6AB6D6508E097054176A0A1E21BECAE5F1877B8E4A49A47E6A79BB4EB9469EF5AEADC35658A40AD55AFC40353E1C970A109E79F3ADE79AF50599818ACA0A8B7B73BD3F99DBFCAC2C58DC56B248788049F000938929E1643A6F956E5C09EE63582DC6FEADC3841FF0003F6B2A948F46D8C40E69BAEADE59D1A3E0B39BD94758EDD78A57DE56C87864B33900E481D47F323579A236DA6A2E9D6C76223F89C8FF8CAE32D8E301A4CD8A4B35C5D4A6495DE695CD4B1259893965303BA8B295255B6606847B8C2C5AC55FFD4E338ABB15762AEC55D8AA26D64646575EB1B0714EBB11912CE2F4EF3AE976DAB5AE97AA5B49437F002D535F8D5072A8FF85CAB8A9B00795C808620F6CB83515F6B049717314110AC9230551EE71280C8FCEB14F05D4714CFEA7C2BC18F5A2A852323167262E726C1D8A156D638659552593D356DB9F61F3C5592689E57D4A46BD9616A1B581A68E64DC350576A78D327548B4326ABA76A30341AA4423BAA522BC4DB7EDEA0C814A497307A12B47C83807661D08F1C52A5B628762AD62AD83435F0ED8AA75AB799EF753D2EC74C991560B1148D86EC7B7C55C00322525C2C51D65AACD6904B0055912452143EFC49FDA18A6D038A1D8A5D438AD3A8715710476C50EC55AC55BA62AEC55D8ABB14BB143B156D4F121A9D!
 37F6C0905336D7F502080C00200D87400532BF083778C54A3D6B5189832CA6A37C4E28
A3C69045A79A754570CEC18775A01913862CFF003124F6CFCF76E9195B8B76E5D82D08F7EB959C05B066096EBFE71BCD521FA9C0A6DECBAB463AB9A53E3A65D085344E76925B69D7F78DC6DA0794FF0092A4E4EC30A25385F28CF0289352B982CD0FECBB866FF805C8992447BD733F946C80A09F5097B9DA28FF00E6AC1522CAC0517F35DCC7198B4EB78AC90FED22867FF836192E063C6945CDEDDDD316B999E527BB31392A0C6C9510093B0C28568E28854CEFC40FD91BB1F60302694BD561F64951ED86916B3143B157FFD5E338ABB15762AEC55D8AAADB3012807A1FD780B289DDEADE416B6D6B42BCD0EE49FACD9D6E2C8ED5A1D9D14FDAFB5FC994486EDCF38D6F49BBD32ECC37402C8DF1D01AECDBE5D16A92BF95F4F375A9A4AC4AC56A0CEEC3C23DFAF6C4958854F37943AA1F4E5F55194480D79539EF4C42C92139262EC50EC5594793BCEF79E5CBCAB28B8B294709E16DFE03D69FF3461B5669E6DF2EF92B58D206B3E5D7586E187236E94AFF00B28FED2E1A5793CF118A568DBAA9A6452A74C50D9523AEDE18AB54C55D8ABB15753156D4027734C5211296F11A55ABE343B64496C1108FB7B0B46721892A07507FAE532996D100A9243A6C47E1899C8EF5DBC3E788322990885159E00DFDC7C3B6C0F6193DDAF65513695237EF2C9D8FB3D31DD765295AC03D62B26!
 E3E0CE4E116834B3D4829F0D8AFD2C7C30B15394827E1B644E9DC9C2B487757353C500F6FD585042811BE2C5C17DC0C2ADF05AFDA0305A69516288F59540EFD71B5A718E21FEEC18AD0770B7FF7E7E18AD06B8DB8FDA24E2BB2C6E1FB35A7BE14394A721CC7C35DFE58AA7C9AD6876683EA5A5ACB2D07EF2E9B9FC43FC85A6468B2B086BAF34EB33A98D66F4223B7A700E0B4FA3E2C78429914A9E492462D231763D598D4FDE70B1B5B850EA62AD8A77FC314BB9B0FB3B62B6B6A49A9C50EC55D8ABB157FFFD6E338ABB15762AEC55D8AB8120D47518AB23D0B55BBD3EF20BEB37E13A1DB7D88FDA8DBFC96CAA41BE2F47D5ECFCB7E69812EE778ECEE9C0F55643C0EDD7D27FDA1918C96410D369DA2683E5FB916F203EAA15129DFD43523E03FC8B88B43C9266E4E77A81D32D0C0A99DBAE162D6143B156B154CF47D5A6B096AADF07F29E87DB0DAA6973A75BEB3135DD8B05B9AFEF2DCEC6B848B5482E6DA6B63C268D91C13D452B91A4DBA5BB9258D2370BC5294A000EC3155F15F7A69C1A08A4F765A9DB15B735EA9047D5A200F829FEB8AA9099791631A9AF6ED8AAA9BA848A7D5D3E78A149A588D3F7607CABFD714B5EA2F65FA2B82936DFD61C1D89FBF070A788AE178FF00CA3E9AFF005C7853C6C9346F26F9BB59884D61A7892261C96462A8B43FE5332E1A4712327FC!
 B7F3F5B935D2B9D3FDF6CAFB7FB16F8B1A419316BFB7D474FB936F7D0BDBDC2F589C50
EFED8D2F121FEB53766FC31A5E2537919CF226A70A2D6E286B156F15762AEC55AC55BC55D8AB58ABB156F156B155C013D074C52D1C50D571575715762AEC55D8ABB15762AFF00FFD7E338ABB15762AEC55D8ABB15445B5CB42C37A0AD41F039122D9C64F52F23DF585EC4DF5D457E042AC6C030A52B5CAAA8B61DD22F3FEB9697F24696EFCBEA8CF1040388E2771B6594C6D8281BE49834D8A16E143B157571575715558AE2589C346E558742A68714BD83C8571E5DF38E93268FADA45FA4A304432100391DA443B726FF00271560DE73F245D795AF95276F52C6727EAF70BEC7A32F50D82D698ABAAAB9556E401D9BC70A1512DA7701952A0F43518A57FE8FBCA06F4CD0F7A8FEB8A2945E378CD1C50E295CB04CC01552478F6C556FA5252BC4D315A68AB034228475C569DC1A95A6D8AD322D13CF1E6AD182476178E2251C4444065A0FF5B15A64C3F397CF063E2120E5FEFCF4C7EAC28A619AEEADAC6BF7C6FF005221EE080B50028A0F618094D2586271B152305AD2D2AC3A8A62B4DFA521FD93F71C2B4D1561D4118AB5435C50EA1C55D438ABB89C569D4F1C55D8AB58AB862ADE2AEA818AB8B1229DB156B15762AEC55D8ABB15762AEC55D8ABFFD0E338ABB15762AEC55D8ABB15762A8AB4D46EAD2A2191901F024603164254A6CED212E4D4B1FC714F35BD01ED5FD58A16!
 13858B58ABB15762AEC55D8AAF8279ADE559A0731CA86A8EA684118AA79ADF9DBCC3AE59C567A8DC0960880A0E0B5247ED33D397FC0E29B483143AA7156C3B0E848F962AE2C49A9249C55B0EE0503103D8E2AD726EB535C55AE47156F9B789C56DBF524FE63F7E29B6FD697F9CFDE7143425907476FBCE2AEF564FE6351B83538A6DC6473D589FA715B6FD697F9CFDE7145AD2EEDD589F99C55AE4715754E2AEA9C55D5C55D5C55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC55D8ABB157FFD1E338ABB15762AEC55D8ABB15762AE18AAE1F4FD1D31641AFBF14358A1D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC55D8ABFFFD9');
+
+update auction set image_id = 1 where auctionId = 19264723;
+update auction set image_id = 2 where auctionId = 62748261;
+update auction set image_id = 3 where auctionId = 71234567;
+update auction set image_id = 4 where auctionId = 73219532;
+
+insert into feedback (feedbackId, for_account_id, from_account_id, feedbackDate, item_id, rating, comment, response) values (1, 1, 2, CURRENT_TIMESTAMP, 19264723, 0, 'Pleasure to deal with', 'Thanks!');

Added: trunk/examples/restbay/resources/jboss-rest-bay-ds.xml
===================================================================
--- trunk/examples/restbay/resources/jboss-rest-bay-ds.xml	                        (rev 0)
+++ trunk/examples/restbay/resources/jboss-rest-bay-ds.xml	2009-03-26 07:42:18 UTC (rev 10215)
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<!DOCTYPE datasources
+    PUBLIC "-//JBoss//DTD JBOSS JCA Config 1.5//EN"
+    "http://www.jboss.org/j2ee/dtd/jboss-ds_1_5.dtd">
+
+<datasources>
+    <local-tx-datasource>
+        <jndi-name>restbayDatasource</jndi-name>
+        <connection-url>jdbc:hsqldb:.</connection-url>
+        <driver-class>org.hsqldb.jdbcDriver</driver-class>
+        <user-name>sa</user-name>
+        <password></password>
+    </local-tx-datasource>
+</datasources>
+

Added: trunk/examples/restbay/resources/log4j.xml
===================================================================
--- trunk/examples/restbay/resources/log4j.xml	                        (rev 0)
+++ trunk/examples/restbay/resources/log4j.xml	2009-03-26 07:42:18 UTC (rev 10215)
@@ -0,0 +1,122 @@
+<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
+
+<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/" debug="false">
+
+    <appender name="CONSOLE" class="org.apache.log4j.ConsoleAppender">
+        <errorHandler class="org.jboss.logging.util.OnlyOnceErrorHandler"/>
+        <param name="Target" value="System.out"/>
+        <layout class="org.apache.log4j.PatternLayout">
+            <!-- The default pattern: Date Priority [Category] Message\n -->
+            <param name="ConversionPattern" value="%-5p [%c{6}] %m%n"/>
+        </layout>
+    </appender>
+
+    <!-- ############### Embedded JBoss AS #################  -->
+    <category name="org.jboss">
+        <priority value="ERROR"/>
+    </category>
+    <category name="com.arjuna">
+        <priority value="ERROR"/>
+    </category>
+
+    <!-- EMB-6, JMS activation throws an error due to deployment ordering, but as there is a timeout
+    and retry the tests pass. Hide the error message -->
+    <category name="jboss.resource.adapter.jms.inflow.JmsActivation">
+        <priority value="ERROR"/>
+    </category>
+
+    <!-- ############### Hibernate logging ################# -->
+
+    <category name="org.hibernate">
+        <priority value="ERROR"/>
+    </category>
+
+    <!--
+    <category name="org.hibernate.SQL">
+        <priority value="TRACE"/>
+    </category>
+    <category name="org.hibernate.type">
+        <priority value="TRACE"/>
+    </category>
+    <category name="org.hibernate.loader">
+        <priority value="TRACE"/>
+    </category>
+    <category name="org.hibernate.cache">
+        <priority value="TRACE"/>
+    </category>
+    -->
+
+    <!-- Ajax4jsf is too noisy -->
+    <category name="org.ajax4jsf.cache">
+        <priority value="WARN"/>
+    </category>
+
+
+    <!-- ############### Seam logging ################### -->
+    <category name="org.jboss.seam">
+        <priority value="ERROR"/>
+    </category>
+
+    <category name="org.jboss.seam.resteasy">
+        <priority value="WARN"/>
+    </category>
+
+    <!-- Seam logs exceptions as WARN and re-throws them, switch to ERROR level -->
+    <category name="org.jboss.seam.web.ExceptionFilter">
+        <priority value="ERROR"/>
+    </category>
+
+    <!-- These things are too noisy
+    <category name="org.jboss.seam.jsf.SeamVariableResolver">
+        <priority value="INFO"/>
+    </category>
+    <category name="org.jboss.seam.contexts.Contexts">
+        <priority value="INFO"/>
+    </category>
+    <category name="org.jboss.seam.Component">
+        <priority value="INFO"/>
+    </category>
+    <category name="org.jboss.seam.deployment.Scanner">
+        <priority value="INFO"/>
+    </category>
+    <category name="org.jboss.seam.util.Naming">
+        <priority value="INFO"/>
+    </category>
+    <category name="org.jboss.seam.debug.hot">
+        <priority value="INFO"/>
+    </category>
+    <category name="org.jboss.seam.core.Events">
+        <priority value="INFO"/>
+    </category>
+    -->
+
+    <!-- Debugging conversations and persistence contexts
+    <category name="org.jboss.seam.core.Manager">
+        <priority value="DEBUG"/>
+    </category>
+    <category name="org.jboss.seam.core.ManagedPersistenceContext">
+        <priority value="DEBUG"/>
+    </category>
+    <category name="org.jboss.seam.jsf.AbstractSeamPhaseListener">
+        <priority value="DEBUG"/>
+    </category>
+    <category name="org.jboss.seam.interceptors.ConversationInterceptor">
+        <priority value="DEBUG"/>
+    </category>
+    <category name="org.jboss.seam.contexts.Lifecycle">
+        <priority value="DEBUG"/>
+    </category>
+    <category name="org.hibernate.impl.SessionImpl">
+        <priority value="DEBUG"/>
+    </category>
+    <category name="org.hibernate.event.def.AbstractFlushingEventListener">
+        <priority value="DEBUG"/>
+    </category>
+    -->
+
+    <root>
+        <priority value="INFO"/>
+        <appender-ref ref="CONSOLE"/>
+    </root>
+
+</log4j:configuration>

Added: trunk/examples/restbay/resources/seam.properties
===================================================================

Added: trunk/examples/restbay/src/org/jboss/seam/example/restbay/Aargh.java
===================================================================
--- trunk/examples/restbay/src/org/jboss/seam/example/restbay/Aargh.java	                        (rev 0)
+++ trunk/examples/restbay/src/org/jboss/seam/example/restbay/Aargh.java	2009-03-26 07:42:18 UTC (rev 10215)
@@ -0,0 +1,80 @@
+package org.jboss.seam.example.restbay;
+
+import org.jboss.seam.Component;
+import static org.jboss.seam.ScopeType.APPLICATION;
+import org.jboss.seam.annotations.Create;
+import org.jboss.seam.annotations.Name;
+import org.jboss.seam.annotations.Scope;
+import org.jboss.seam.annotations.Startup;
+import org.jboss.seam.annotations.intercept.BypassInterceptors;
+
+import javax.naming.InitialContext;
+import javax.persistence.EntityManager;
+import javax.transaction.SystemException;
+import javax.transaction.UserTransaction;
+import java.util.Calendar;
+import java.util.GregorianCalendar;
+import java.util.List;
+import java.util.Random;
+
+/**
+ * Nasty nasty hack because hsqldb doesn't support date arithmetic and we actually
+ * want to deploy with usable test data.
+ * 
+ * @author shane
+ *
+ */
+ at Startup
+ at Name("aargh")
+ at Scope(APPLICATION)
+ at BypassInterceptors
+public class Aargh
+{   
+
+   @Create
+   public void create()
+   {
+      UserTransaction t = null;
+      try
+      {
+         InitialContext ctx = new InitialContext();
+         
+         t = (UserTransaction) ctx.lookup("UserTransaction");
+         t.begin();
+      
+         EntityManager em = (EntityManager) Component.getInstance("entityManager", true);
+         
+         List<Auction> auctions = em.createQuery("select a from Auction a").getResultList();
+         
+         Calendar cal = new GregorianCalendar();
+         
+         Random r = new Random(System.currentTimeMillis());
+         
+         for (Auction auction : auctions)
+         {
+            cal.setTime(auction.getEndDate());
+            cal.add(Calendar.DATE, r.nextInt(7));
+            cal.add(Calendar.MINUTE, 30 + r.nextInt(1410));
+            auction.setEndDate(cal.getTime());
+            auction.setStatus(Auction.STATUS_COMPLETED);
+            em.merge(auction);
+
+            AuctionEndAction auctionEnd = (AuctionEndAction) Component.getInstance(AuctionEndAction.class, true);
+            auctionEnd.endAuction(auction.getAuctionId(), auction.getEndDate());
+         }
+         
+         t.commit();
+      } 
+      catch (Exception e)
+      {
+         try
+         {
+            if (t != null)
+               t.rollback();
+         } 
+         catch (SystemException e1) {}
+         
+         throw new RuntimeException("Error starting transaction", e);
+      }      
+   }
+}

Added: trunk/examples/restbay/src/org/jboss/seam/example/restbay/Account.java
===================================================================
--- trunk/examples/restbay/src/org/jboss/seam/example/restbay/Account.java	                        (rev 0)
+++ trunk/examples/restbay/src/org/jboss/seam/example/restbay/Account.java	2009-03-26 07:42:18 UTC (rev 10215)
@@ -0,0 +1,109 @@
+package org.jboss.seam.example.restbay;
+
+import java.io.Serializable;
+import java.util.Date;
+
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.Table;
+import javax.persistence.UniqueConstraint;
+
+import org.hibernate.validator.Length;
+import org.hibernate.validator.NotNull;
+import org.hibernate.validator.Pattern;
+
+ at Entity
+ at Table(uniqueConstraints = @UniqueConstraint(columnNames = "name"))
+public class Account implements Serializable
+{
+   private static final long serialVersionUID = 8444287111124328025L;
+   
+   private Integer accountId;
+   private String name;
+   private int feedbackScore;
+   private float feedbackPercent;
+   private Date memberSince;
+   private String location;
+   
+   @Id @GeneratedValue
+   public Integer getAccountId()
+   {
+      return accountId;
+   }
+   
+   public void setAccountId(Integer accountId)
+   {
+      this.accountId = accountId;
+   }
+   
+   @NotNull
+   @Length(min = 3, max = 40)
+   @Pattern(regex="[a-zA-Z]?[a-zA-Z0-9]+", 
+         message="Account name must start with a letter, and only contain letters or numbers")   
+   public String getName()
+   {
+      return name;
+   }
+   
+   public void setName(String name)
+   {
+      this.name = name;
+   }
+   
+   public int getFeedbackScore()
+   {
+      return feedbackScore;
+   }
+   
+   public void setFeedbackScore(int score)
+   {
+      this.feedbackScore = score;
+   }
+   
+   public float getFeedbackPercent()
+   {
+      return feedbackPercent;
+   }
+   
+   public void setFeedbackPercent(float percent)
+   {
+      this.feedbackPercent = percent;
+   }
+   
+   public Date getMemberSince()
+   {
+      return memberSince;
+   }
+   
+   public void setMemberSince(Date memberSince)
+   {
+      this.memberSince = memberSince;
+   }
+   
+   public String getLocation()
+   {
+      return location;
+   }
+   
+   public void setLocation(String location)
+   {
+      this.location = location;
+   }
+   
+   @Override
+   public boolean equals(Object value)
+   {
+      if (!(value instanceof Account)) return false;
+      
+      Account other = (Account) value;
+      
+      return other.accountId != null && other.accountId.equals(this.accountId);
+   }
+   
+   @Override
+   public int hashCode()
+   {
+      return accountId != null ? accountId.intValue() : super.hashCode();
+   }
+}

Added: trunk/examples/restbay/src/org/jboss/seam/example/restbay/Auction.java
===================================================================
--- trunk/examples/restbay/src/org/jboss/seam/example/restbay/Auction.java	                        (rev 0)
+++ trunk/examples/restbay/src/org/jboss/seam/example/restbay/Auction.java	2009-03-26 07:42:18 UTC (rev 10215)
@@ -0,0 +1,292 @@
+package org.jboss.seam.example.restbay;
+
+import java.io.Serializable;
+import java.util.Date;
+
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.JoinColumn;
+import javax.persistence.ManyToOne;
+import javax.persistence.OneToOne;
+import javax.persistence.Transient;
+import javax.persistence.Version;
+
+import org.hibernate.validator.NotNull;
+
+ at Entity
+public class Auction implements Serializable
+{
+   public static final int STATUS_UNLISTED = 0;
+   public static final int STATUS_LIVE = 1;
+   public static final int STATUS_COMPLETED = 2;
+   
+   private static final long serialVersionUID = -8349473227099432431L;
+
+   private Integer auctionId;
+   private Account account;
+   private Category category;
+   private String title;
+   private String description;
+   private Date endDate;
+   private AuctionImage image;
+   private Bid highBid;
+   private int bids;
+   private double startingPrice;
+   
+   private int status;   
+   private int version;
+   
+   @Id @GeneratedValue
+   public Integer getAuctionId()
+   {
+      return auctionId;
+   }
+   
+   public void setAuctionId(Integer auctionId)
+   {
+      this.auctionId = auctionId;
+   }
+   
+   @NotNull
+   @ManyToOne
+   @JoinColumn(name = "ACCOUNT_ID")
+   public Account getAccount()
+   {
+      return account;
+   }
+   
+   public void setAccount(Account account)
+   {
+      this.account = account;
+   }
+   
+   @NotNull   
+   @ManyToOne
+   @JoinColumn(name = "CATEGORY_ID")
+   public Category getCategory()
+   {
+      return category;
+   }
+   
+   public void setCategory(Category category)
+   {
+      this.category = category;
+   }
+   
+   @NotNull
+   public String getTitle()
+   {
+      return title;
+   }
+   
+   public void setTitle(String title)
+   {
+      this.title = title;
+   }
+   
+   @NotNull
+   public String getDescription()
+   {
+      return description;
+   }
+   
+   public void setDescription(String description)
+   {
+      this.description = description;
+   }
+   
+   @NotNull
+   public Date getEndDate()
+   {
+      return endDate;
+   }
+   
+   public void setEndDate(Date endDate)
+   {
+      this.endDate = endDate;
+   }
+   
+   @OneToOne
+   @JoinColumn(name = "IMAGE_ID")
+   public AuctionImage getImage()
+   {
+      return image;
+   }
+   
+   public void setImage(AuctionImage image)
+   {
+      this.image = image;
+   }
+   
+   @OneToOne
+   public Bid getHighBid()
+   {
+      return highBid;
+   }
+   
+   public void setHighBid(Bid highBid)
+   {
+      this.highBid = highBid;
+   }
+   
+   public int getBids()
+   {
+      return bids;
+   }
+   
+   public void setBids(int bids)
+   {
+      this.bids = bids;
+   }
+   
+   @Transient
+   public long getTimeLeft()
+   {      
+      return endDate != null ? (endDate.getTime() - System.currentTimeMillis()) : 0; 
+   }   
+   
+   @Transient
+   public String getPrettyTimeLeft()
+   {
+      long timeLeft = getTimeLeft() / 1000;
+      
+      int days = (int) Math.floor(timeLeft / (60 * 60 * 24));
+      
+      timeLeft -= days * 24 * 60 * 60;
+      int hours = (int) Math.floor(timeLeft / (60 * 60));
+      
+      timeLeft -= hours * 60 * 60;
+      int minutes = (int) Math.floor(timeLeft / 60);
+
+      StringBuilder sb = new StringBuilder();
+      
+      if (days > 0)
+         sb.append(String.format("%dd ", days));
+      
+      if (hours > 0)
+         sb.append(String.format("%dh ", hours));
+
+      if (minutes > 0)
+         sb.append(String.format("%dm ", minutes));     
+      
+      return sb.toString();
+   }
+   
+   @Transient
+   public String getDaysHoursLeft()
+   {
+      long timeLeft = getTimeLeft() / 1000;
+      
+      int days = (int) Math.floor(timeLeft / (60 * 60 * 24));
+      
+      timeLeft -= days * 24 * 60 * 60;
+      int hours = (int) Math.floor(timeLeft / (60 * 60));
+      
+      StringBuilder sb = new StringBuilder();
+      
+      if (days > 0)
+         sb.append(String.format("%d days ", days));
+      
+      if (hours > 0)
+         sb.append(String.format("%d hour", hours));
+      
+      if (hours > 1)
+         sb.append('s');
+      
+      return sb.toString();      
+   }
+   
+   public double getStartingPrice()
+   {
+      return startingPrice;
+   }
+   
+   public void setStartingPrice(double startingPrice)
+   {
+      this.startingPrice = startingPrice;
+   }
+   
+   public int getStatus()
+   {
+      return status;
+   }
+   
+   public void setStatus(int status)
+   {
+      this.status = status;
+   }
+   
+   @Version
+   public int getVersion()
+   {
+      return version;
+   }
+   
+   public void setVersion(int version)
+   {
+      this.version = version;
+   }
+   
+   @Transient 
+   public double getCurrentPrice()
+   {
+      return highBid != null ? highBid.getActualAmount() : getStartingPrice();
+   }
+   
+   @Transient
+   public double getRequiredBid()
+   {      
+      return highBid != null ? getRequiredBid(highBid.getActualAmount()) : 
+         getStartingPrice();
+   }
+   
+   /**
+    * Returns the amount required to outbid the specified bid amount.
+    * 
+    * @param amount The current bid amount
+    * @return The bid amount required to outbid the current bid
+    */
+   @Transient
+   static double getRequiredBid(double amount)
+   {
+      if (amount < 100)
+      {
+         return Math.ceil(amount) + 1;
+      }
+      else if (amount < 200)
+      {
+         return Math.ceil(amount) + 2;
+      }
+      else if (amount < 500)
+      {
+         return Math.ceil(amount) + 5;
+      }
+      else if (amount < 1000)
+      {
+         return Math.ceil(amount) + 10;
+      }
+      else if (amount < 5000)
+      {
+         return Math.ceil(amount) + 20;
+      }
+      else if (amount < 20000)
+      {
+         return Math.ceil(amount) + 50;
+      }
+      else if (amount < 50000)
+      {
+         return Math.ceil(amount) + 100;
+      }
+      else if (amount < 100000)
+      {
+         return Math.ceil(amount) + 200;
+      }
+      else if (amount < 500000)
+      {
+         return Math.ceil(amount) + 500;
+      }
+
+      return Math.ceil(amount) + 1000;
+   }
+}

Added: trunk/examples/restbay/src/org/jboss/seam/example/restbay/AuctionEndAction.java
===================================================================
--- trunk/examples/restbay/src/org/jboss/seam/example/restbay/AuctionEndAction.java	                        (rev 0)
+++ trunk/examples/restbay/src/org/jboss/seam/example/restbay/AuctionEndAction.java	2009-03-26 07:42:18 UTC (rev 10215)
@@ -0,0 +1,32 @@
+package org.jboss.seam.example.restbay;
+
+import org.jboss.seam.annotations.In;
+import org.jboss.seam.annotations.Name;
+import org.jboss.seam.annotations.Transactional;
+import org.jboss.seam.annotations.async.Asynchronous;
+import org.jboss.seam.annotations.async.Expiration;
+
+import javax.persistence.EntityManager;
+import javax.persistence.LockModeType;
+import java.util.Date;
+
+ at Name("auctionEnd")
+public class AuctionEndAction
+{
+   @In EntityManager entityManager;
+
+   @Asynchronous
+   @Transactional
+   public void endAuction(int auctionId, @Expiration Date endDate)
+   {
+      System.out.println("Auction " + auctionId + " ending");
+
+      Auction auction = entityManager.find(Auction.class, auctionId);
+
+      entityManager.lock(auction, LockModeType.WRITE);
+
+      auction.setStatus(Auction.STATUS_COMPLETED);
+
+      entityManager.merge(auction);
+   }
+}

Added: trunk/examples/restbay/src/org/jboss/seam/example/restbay/AuctionImage.java
===================================================================
--- trunk/examples/restbay/src/org/jboss/seam/example/restbay/AuctionImage.java	                        (rev 0)
+++ trunk/examples/restbay/src/org/jboss/seam/example/restbay/AuctionImage.java	2009-03-26 07:42:18 UTC (rev 10215)
@@ -0,0 +1,67 @@
+package org.jboss.seam.example.restbay;
+
+import java.io.Serializable;
+
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.JoinColumn;
+import javax.persistence.Lob;
+import javax.persistence.ManyToOne;
+import javax.xml.bind.annotation.XmlTransient;
+
+ at Entity
+public class AuctionImage implements Serializable
+{
+   private static final long serialVersionUID = -1219357931402690891L;
+
+   private Integer imageId;
+   private Auction auction;
+   private byte[] data;
+   private String contentType;
+   
+   @Id @GeneratedValue
+   public Integer getImageId()
+   {
+      return imageId;
+   }
+   
+   public void setImageId(Integer imageId)
+   {
+      this.imageId = imageId;
+   }
+   
+   @XmlTransient
+   @ManyToOne
+   @JoinColumn(name = "AUCTION_ID")
+   public Auction getAuction()
+   {
+      return auction;
+   }
+   
+   public void setAuction(Auction auction)
+   {
+      this.auction = auction;
+   }
+   
+   @Lob
+   public byte[] getData()
+   {
+      return data;
+   }
+   
+   public void setData(byte[] data)
+   {
+      this.data = data;
+   }
+   
+   public String getContentType()
+   {
+      return contentType;
+   }
+   
+   public void setContentType(String contentType)
+   {
+      this.contentType = contentType;
+   }
+}

Added: trunk/examples/restbay/src/org/jboss/seam/example/restbay/AuctionService.java
===================================================================
--- trunk/examples/restbay/src/org/jboss/seam/example/restbay/AuctionService.java	                        (rev 0)
+++ trunk/examples/restbay/src/org/jboss/seam/example/restbay/AuctionService.java	2009-03-26 07:42:18 UTC (rev 10215)
@@ -0,0 +1,69 @@
+package org.jboss.seam.example.restbay;
+
+import org.jboss.seam.annotations.Name;
+import org.jboss.seam.annotations.In;
+import org.jboss.seam.util.Reflections;
+
+import javax.ws.rs.*;
+import javax.ws.rs.core.HttpHeaders;
+import javax.ws.rs.core.Context;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.UriInfo;
+import javax.persistence.EntityManager;
+import java.util.GregorianCalendar;
+import java.util.List;
+import java.lang.reflect.Field;
+
+/**
+ * @author Christian Bauer
+ */
+ at Name("auctionService")
+ at Path("/auction")
+public class AuctionService
+{
+
+   @Context
+   private UriInfo uriInfo;
+
+   private HttpHeaders headers;
+
+   @Context
+   public void setHeaders(HttpHeaders headers) {
+      this.headers = headers;
+   }
+
+   @In
+   EntityManager entityManager;
+
+   @GET
+   @Produces("text/plain")
+   public String getAuctions()
+   {
+      // This is supposed to test field and setter injection for @Context
+      assert uriInfo.getPath().equals("/auction");
+      assert headers.getAcceptableMediaTypes().size() == 1;
+      assert headers.getAcceptableMediaTypes().get(0).toString().equals("text/plain");
+
+      List<Object[]> auctions =
+            entityManager.createQuery("select a.auctionId, a.title from Auction a order by a.auctionId asc").getResultList();
+      StringBuilder s = new StringBuilder();
+      for (Object[] auction : auctions)
+      {
+         s.append(auction[0]).append(",").append(auction[1]).append("\n");
+      }
+
+      return s.toString();
+   }
+
+   @GET
+   @Path("/{auctionId}")
+   @Produces("text/plain")
+   public String getAuction(@Context HttpHeaders httpHeaders, @PathParam("auctionId") int auctionId)
+   {
+      assert httpHeaders.getAcceptableMediaTypes().size() == 1;
+      assert httpHeaders.getAcceptableMediaTypes().get(0).toString().equals("text/plain");
+      
+      return entityManager.find(Auction.class, auctionId).getTitle();
+   }
+
+}
\ No newline at end of file

Added: trunk/examples/restbay/src/org/jboss/seam/example/restbay/Bid.java
===================================================================
--- trunk/examples/restbay/src/org/jboss/seam/example/restbay/Bid.java	                        (rev 0)
+++ trunk/examples/restbay/src/org/jboss/seam/example/restbay/Bid.java	2009-03-26 07:42:18 UTC (rev 10215)
@@ -0,0 +1,90 @@
+package org.jboss.seam.example.restbay;
+
+import java.io.Serializable;
+import java.util.Date;
+
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.ManyToOne;
+
+import org.hibernate.validator.NotNull;
+
+ at Entity
+public class Bid implements Serializable
+{
+   private static final long serialVersionUID = -6214050645831251660L;
+   
+   private Integer bidId;
+   private Auction auction;
+   private Account account;
+   private Date bidDate;
+   private double maxAmount;
+   private double actualAmount;
+   
+   @Id @GeneratedValue
+   public Integer getBidId()
+   {
+      return bidId;
+   }
+   
+   public void setBidId(Integer bidId)
+   {
+      this.bidId = bidId;
+   }
+   
+   @NotNull
+   @ManyToOne
+   public Auction getAuction()
+   {
+      return auction;
+   }
+   
+   public void setAuction(Auction auction)
+   {
+      this.auction = auction;
+   }
+   
+   @NotNull
+   public Account getAccount()
+   {
+      return account;
+   }
+   
+   public void setAccount(Account account)
+   {
+      this.account = account;
+   }
+   
+   @NotNull
+   public Date getBidDate()
+   {
+      return bidDate;
+   }
+   
+   public void setBidDate(Date bidDate)
+   {
+      this.bidDate = bidDate;
+   }
+   
+   public double getMaxAmount()
+   {
+      return maxAmount;
+   }
+   
+   public void setMaxAmount(double maxAmount)
+   {
+      this.maxAmount = maxAmount;
+   }
+   
+   public double getActualAmount()
+   {
+      return actualAmount;
+   }
+   
+   public void setActualAmount(double actualAmount)
+   {
+      this.actualAmount = actualAmount;
+   }
+}
+

Added: trunk/examples/restbay/src/org/jboss/seam/example/restbay/Category.java
===================================================================
--- trunk/examples/restbay/src/org/jboss/seam/example/restbay/Category.java	                        (rev 0)
+++ trunk/examples/restbay/src/org/jboss/seam/example/restbay/Category.java	2009-03-26 07:42:18 UTC (rev 10215)
@@ -0,0 +1,51 @@
+package org.jboss.seam.example.restbay;
+
+import java.io.Serializable;
+
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.JoinColumn;
+import javax.persistence.ManyToOne;
+
+ at Entity
+public class Category implements Serializable
+{
+   private static final long serialVersionUID = 411989568594034566L;
+   
+   private Integer categoryId;
+   private String name;
+   private Category parent;
+   
+   @Id
+   public Integer getCategoryId()
+   {
+      return categoryId;
+   }
+   
+   public void setCategoryId(Integer categoryId)
+   {
+      this.categoryId = categoryId;
+   }
+   
+   public String getName()
+   {
+      return name;
+   }
+   
+   public void setName(String name)
+   {
+      this.name = name;
+   }
+   
+   @ManyToOne
+   @JoinColumn(name = "PARENT_CATEGORY_ID")
+   public Category getParent()
+   {
+      return parent;
+   }
+   
+   public void setParent(Category parent)
+   {
+      this.parent = parent;
+   }
+}

Added: trunk/examples/restbay/src/org/jboss/seam/example/restbay/CategoryService.java
===================================================================
--- trunk/examples/restbay/src/org/jboss/seam/example/restbay/CategoryService.java	                        (rev 0)
+++ trunk/examples/restbay/src/org/jboss/seam/example/restbay/CategoryService.java	2009-03-26 07:42:18 UTC (rev 10215)
@@ -0,0 +1,13 @@
+package org.jboss.seam.example.restbay;
+
+/**
+ * @author Christian Bauer
+ */
+public interface CategoryService
+{
+
+   public String getCategories();
+
+   public String getCategory(int categoryId);
+
+}

Added: trunk/examples/restbay/src/org/jboss/seam/example/restbay/CategoryServiceImpl.java
===================================================================
--- trunk/examples/restbay/src/org/jboss/seam/example/restbay/CategoryServiceImpl.java	                        (rev 0)
+++ trunk/examples/restbay/src/org/jboss/seam/example/restbay/CategoryServiceImpl.java	2009-03-26 07:42:18 UTC (rev 10215)
@@ -0,0 +1,45 @@
+package org.jboss.seam.example.restbay;
+
+import org.jboss.seam.annotations.Name;
+import org.jboss.seam.annotations.In;
+
+import javax.ws.rs.*;
+import javax.persistence.EntityManager;
+import java.util.GregorianCalendar;
+import java.util.List;
+
+/**
+ * @author Christian Bauer
+ */
+ at Name("categoryService")
+ at Path("/category")
+public class CategoryServiceImpl implements CategoryService
+{
+
+   @In
+   EntityManager entityManager;
+
+   @GET
+   @Produces("text/plain")
+   public String getCategories()
+   {
+      List<Object[]> categories =
+            entityManager.createQuery("select c.categoryId, c.name from Category c order by c.id asc").getResultList();
+      StringBuilder s = new StringBuilder();
+      for (Object[] category : categories)
+      {
+         s.append(category[0]).append(",").append(category[1]).append("\n");
+      }
+
+      return s.toString();
+   }
+
+   @GET
+   @Path("/{categoryId}")
+   @Produces("text/plain")
+   public String getCategory(@PathParam("categoryId") int categoryId)
+   {
+      return entityManager.find(Category.class, categoryId).getName();
+   }
+
+}
\ No newline at end of file

Added: trunk/examples/restbay/src/org/jboss/seam/example/restbay/Feedback.java
===================================================================
--- trunk/examples/restbay/src/org/jboss/seam/example/restbay/Feedback.java	                        (rev 0)
+++ trunk/examples/restbay/src/org/jboss/seam/example/restbay/Feedback.java	2009-03-26 07:42:18 UTC (rev 10215)
@@ -0,0 +1,116 @@
+package org.jboss.seam.example.restbay;
+
+import java.io.Serializable;
+import java.util.Date;
+
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.JoinColumn;
+import javax.persistence.ManyToOne;
+import javax.persistence.OneToOne;
+
+ at Entity
+public class Feedback implements Serializable
+{
+   private static final long serialVersionUID = -5814392910187956828L;
+
+   public enum Rating {positive, neutral, negative};
+   
+   private Integer feedbackId;
+   private Account forAccount;
+   private Account fromAccount;
+   private Date feedbackDate;
+   private Auction item;
+   private Rating rating;
+   private String comment;
+   private String response;
+   
+   @Id @GeneratedValue
+   public Integer getFeedbackId()
+   {
+      return feedbackId;
+   }
+   
+   public void setFeedbackId(Integer feedbackId)
+   {
+      this.feedbackId = feedbackId;
+   }
+   
+   @ManyToOne
+   @JoinColumn(name = "FOR_ACCOUNT_ID")
+   public Account getForAccount()
+   {
+      return forAccount;
+   }
+   
+   public void setForAccount(Account account)
+   {
+      this.forAccount = account;
+   }
+   
+   @ManyToOne
+   @JoinColumn(name = "FROM_ACCOUNT_ID")
+   public Account getFromAccount()
+   {
+      return fromAccount;
+   }
+   
+   public void setFromAccount(Account account)
+   {
+      this.fromAccount = account;
+   }
+   
+   public Date getFeedbackDate()
+   {
+      return feedbackDate;
+   }
+   
+   public void setFeedbackDate(Date feedbackDate)
+   {
+      this.feedbackDate = feedbackDate;
+   }
+
+   @OneToOne
+   @JoinColumn(name = "ITEM_ID")
+   public Auction getItem()
+   {
+      return item;
+   }
+   
+   public void setItem(Auction item)
+   {
+      this.item = item;
+   }
+   
+   public Rating getRating()
+   {
+      return rating;
+   }
+   
+   public void setRating(Rating rating)
+   {
+      this.rating = rating;
+   }
+   
+   public String getComment()
+   {
+      return comment;
+   }
+   
+   public void setComment(String comment)
+   {
+      this.comment = comment;
+   }
+   
+   public String getResponse()
+   {
+      return response;
+   }
+   
+   public void setResponse(String response)
+   {
+      this.response = response;
+   }
+   
+}

Added: trunk/examples/restbay/src/org/jboss/seam/example/restbay/User.java
===================================================================
--- trunk/examples/restbay/src/org/jboss/seam/example/restbay/User.java	                        (rev 0)
+++ trunk/examples/restbay/src/org/jboss/seam/example/restbay/User.java	2009-03-26 07:42:18 UTC (rev 10215)
@@ -0,0 +1,75 @@
+package org.jboss.seam.example.restbay;
+
+import java.io.Serializable;
+
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.JoinColumn;
+import javax.persistence.OneToOne;
+import javax.persistence.Table;
+import javax.persistence.UniqueConstraint;
+
+import org.hibernate.validator.Length;
+import org.hibernate.validator.NotNull;
+import org.hibernate.validator.Pattern;
+
+ at Entity
+ at Table(uniqueConstraints = @UniqueConstraint(columnNames = "username"))
+public class User implements Serializable
+{   
+   private static final long serialVersionUID = 1L;
+   
+   private Integer userId;
+   private String username;
+   private String password;
+   private Account account;
+   
+   @Id @GeneratedValue
+   public Integer getUserId()
+   {
+      return userId;
+   }
+   
+   public void setUserId(Integer userId)
+   {
+      this.userId = userId;
+   }
+   
+   @NotNull
+   @Length(min = 3, max = 40)
+   @Pattern(regex="[a-zA-Z]?[a-zA-Z0-9]+", 
+         message="Username must start with a letter, and only contain letters or numbers")   
+   public String getUsername()
+   {
+      return username;
+   }
+   
+   public void setUsername(String username)
+   {
+      this.username = username;
+   }
+
+   public String getPassword()
+   {
+      return password;
+   }
+   
+   public void setPassword(String password)
+   {
+      this.password = password;
+   }
+   
+   @OneToOne
+   @NotNull
+   @JoinColumn(name = "ACCOUNT_ID")
+   public Account getAccount()
+   {
+      return account;
+   }
+   
+   public void setAccount(Account account)
+   {
+      this.account = account;
+   }
+}

Added: trunk/examples/restbay/src/org/jboss/seam/example/restbay/resteasy/CalendarConverter.java
===================================================================
--- trunk/examples/restbay/src/org/jboss/seam/example/restbay/resteasy/CalendarConverter.java	                        (rev 0)
+++ trunk/examples/restbay/src/org/jboss/seam/example/restbay/resteasy/CalendarConverter.java	2009-03-26 07:42:18 UTC (rev 10215)
@@ -0,0 +1,41 @@
+package org.jboss.seam.example.restbay.resteasy;
+
+import org.jboss.resteasy.spi.StringConverter;
+
+import javax.ws.rs.ext.Provider;
+import java.util.GregorianCalendar;
+import java.text.SimpleDateFormat;
+import java.text.ParseException;
+
+/**
+ * Converts QueryParam etc. strings to GregorianCalendar if they are in ISO date format
+ * @author Christian Bauer
+ */
+ at Provider
+public class CalendarConverter implements StringConverter<GregorianCalendar>
+{
+   public static final String ISO_FORMAT = "yyyy-MM-dd'T'HH:mm:ss";
+
+   public GregorianCalendar fromString(String s)
+   {
+      SimpleDateFormat sdf = new SimpleDateFormat(ISO_FORMAT);
+      GregorianCalendar cal = new GregorianCalendar();
+      try
+      {
+         cal.setTime(sdf.parse(s));
+      }
+      catch (ParseException e)
+      {
+         throw new RuntimeException(e);
+      }
+      return cal;
+
+   }
+
+   // TODO: RESTEasy doesn't seem to use that at all
+   public String toString(GregorianCalendar gregorianCalendar)
+   {
+      SimpleDateFormat sdf = new SimpleDateFormat(ISO_FORMAT);
+      return sdf.format(gregorianCalendar.getTime());
+   }
+}

Added: trunk/examples/restbay/src/org/jboss/seam/example/restbay/resteasy/CalendarResource.java
===================================================================
--- trunk/examples/restbay/src/org/jboss/seam/example/restbay/resteasy/CalendarResource.java	                        (rev 0)
+++ trunk/examples/restbay/src/org/jboss/seam/example/restbay/resteasy/CalendarResource.java	2009-03-26 07:42:18 UTC (rev 10215)
@@ -0,0 +1,25 @@
+package org.jboss.seam.example.restbay.resteasy;
+
+import javax.ws.rs.GET;
+import java.util.GregorianCalendar;
+
+/**
+ * @author Christian Bauer
+ */
+public class CalendarResource
+{
+   private GregorianCalendar cal;
+
+   public CalendarResource(GregorianCalendar cal)
+   {
+      this.cal = cal;
+   }
+
+   @GET
+   public long get()
+   {
+      System.out.println("#### GET");
+      return cal.getTime().getTime();
+   }
+
+}

Added: trunk/examples/restbay/src/org/jboss/seam/example/restbay/resteasy/SubResource.java
===================================================================
--- trunk/examples/restbay/src/org/jboss/seam/example/restbay/resteasy/SubResource.java	                        (rev 0)
+++ trunk/examples/restbay/src/org/jboss/seam/example/restbay/resteasy/SubResource.java	2009-03-26 07:42:18 UTC (rev 10215)
@@ -0,0 +1,21 @@
+package org.jboss.seam.example.restbay.resteasy;
+
+import javax.ws.rs.GET;
+
+/**
+ * @author Christian Bauer
+ */
+public class SubResource
+{
+   private String baz;
+
+   public SubResource(String baz)
+   {
+      this.baz = baz;
+   }
+
+   @GET
+   public String get() {
+      return "bar: " + baz;
+   }
+}

Added: trunk/examples/restbay/src/org/jboss/seam/example/restbay/resteasy/TestForm.java
===================================================================
--- trunk/examples/restbay/src/org/jboss/seam/example/restbay/resteasy/TestForm.java	                        (rev 0)
+++ trunk/examples/restbay/src/org/jboss/seam/example/restbay/resteasy/TestForm.java	2009-03-26 07:42:18 UTC (rev 10215)
@@ -0,0 +1,23 @@
+package org.jboss.seam.example.restbay.resteasy;
+
+import javax.ws.rs.FormParam;
+import javax.ws.rs.HeaderParam;
+
+/**
+ * @author Christian Bauer
+ */
+public class TestForm
+{
+
+   @FormParam("foo")
+   private String[] foo;
+
+   @HeaderParam("bar")
+   private String bar;
+
+   @Override
+   public String toString()
+   {
+      return bar + foo[0] + foo[1];
+   }
+}

Added: trunk/examples/restbay/src/org/jboss/seam/example/restbay/resteasy/TestProvider.java
===================================================================
--- trunk/examples/restbay/src/org/jboss/seam/example/restbay/resteasy/TestProvider.java	                        (rev 0)
+++ trunk/examples/restbay/src/org/jboss/seam/example/restbay/resteasy/TestProvider.java	2009-03-26 07:42:18 UTC (rev 10215)
@@ -0,0 +1,50 @@
+package org.jboss.seam.example.restbay.resteasy;
+
+import javax.ws.rs.Produces;
+import javax.ws.rs.WebApplicationException;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.MultivaluedMap;
+import javax.ws.rs.ext.MessageBodyWriter;
+import javax.ws.rs.ext.Provider;
+import java.lang.reflect.Type;
+import java.lang.annotation.Annotation;
+import java.io.OutputStream;
+import java.io.IOException;
+import java.util.List;
+
+/**
+ * @author Christian Bauer
+ */
+ at Provider
+ at Produces("text/csv")
+public class TestProvider implements MessageBodyWriter
+{
+
+   public boolean isWriteable(Class aClass, Type type, Annotation[] annotations, MediaType mediaType)
+   {
+      return List.class.isAssignableFrom(aClass);
+   }
+
+   public long getSize(Object o, Class aClass, Type type, Annotation[] annotations, MediaType mediaType)
+   {
+      return -1;
+   }
+
+   public void writeTo(Object o, Class aClass, Type type, Annotation[] annotations, MediaType mediaType,
+                       MultivaluedMap httpHeaders, OutputStream outputStream) throws IOException, WebApplicationException
+   {
+      List<String[]> lines = (List<String[]>) o;
+      StringBuilder cvs = new StringBuilder();
+      for (String[] line : lines)
+      {
+         for (String field : line)
+         {
+            cvs.append(field).append(",");
+         }
+         cvs.deleteCharAt(cvs.length() - 1);
+         cvs.append("\r\n");
+      }
+      outputStream.write(cvs.toString().getBytes());
+
+   }
+}

Added: trunk/examples/restbay/src/org/jboss/seam/example/restbay/resteasy/TestResource.java
===================================================================
--- trunk/examples/restbay/src/org/jboss/seam/example/restbay/resteasy/TestResource.java	                        (rev 0)
+++ trunk/examples/restbay/src/org/jboss/seam/example/restbay/resteasy/TestResource.java	2009-03-26 07:42:18 UTC (rev 10215)
@@ -0,0 +1,127 @@
+package org.jboss.seam.example.restbay.resteasy;
+
+import org.jboss.resteasy.annotations.Form;
+
+import javax.ws.rs.*;
+import javax.ws.rs.core.*;
+import java.util.GregorianCalendar;
+import java.util.List;
+import java.util.ArrayList;
+
+/**
+ * Plain JAX RS root resource, no Seam components/lifecycle.
+ * 
+ * @author Christian Bauer
+ */
+ at Path("/test")
+public class TestResource
+{
+
+   @Context
+   UriInfo uriInfo;
+
+   @Context
+   HttpHeaders headers;
+
+   @GET
+   @Path("/echouri")
+   public String echoUri()
+   {
+      return uriInfo.getPath();
+   }
+
+   @GET
+   @Path("/echoquery")
+   public String echoQueryParam(@QueryParam("bar") String bar)
+   {
+      return bar;
+   }
+
+   @GET
+   @Path("/echoheader")
+   public String echoHeaderParam(@HeaderParam("bar") String bar)
+   {
+      return bar;
+   }
+
+   @GET
+   @Path("/echocookie")
+   public String echoCookieParam(@CookieParam("bar") String bar)
+   {
+      return bar;
+   }
+
+   @GET
+   @Path("/echoencoded/{val}")
+   public String echoEncoded(@PathParam("val") @Encoded String val)
+   {
+      return val;
+   }
+
+   @POST
+   @Path("/echoformparams")
+   @Consumes("application/x-www-form-urlencoded")
+   public String echoFormParams(MultivaluedMap<String, String> formMap)
+   {
+      String result = "";
+      for (String s : formMap.get("foo"))
+      {
+         result = result + s;
+      }
+      return result;
+   }
+
+   @POST
+   @Path("/echoformparams2")
+   public String echoFormParams2(@FormParam("foo") String[] foo)
+   {
+      String result = "";
+      for (String s : foo)
+      {
+         result = result + s;
+      }
+      return result;
+   }
+
+   @POST
+   @Path("/echoformparams3")
+   public String echoFormParams3(@Form TestForm form)
+   {
+      return form.toString();
+   }
+
+   @Path("/foo/bar/{baz}")
+   public SubResource getBar(@PathParam("baz") String baz)
+   {
+      return new SubResource(baz);
+   }
+
+   @GET
+   @Path("/foo/{isoDate}")
+   public long convertPathParam(@PathParam("isoDate") GregorianCalendar isoDate)
+   {
+      return isoDate.getTime().getTime();
+   }
+
+   @GET
+   @Path("/foo/unsupported")
+   public String throwException()
+   {
+      throw new UnsupportedOperationException("foo");
+   }
+
+   @GET
+   @Path("/foo/commaseparated")
+   @Produces("text/csv")
+   public List<String[]> getCommaSeparated() {
+      assert headers.getAcceptableMediaTypes().size() == 2;
+      assert headers.getAcceptableMediaTypes().get(0).toString().equals("text/plain");
+      assert headers.getAcceptableMediaTypes().get(1).toString().equals("text/csv");
+      List<String[]> csv = new ArrayList();
+      csv.add(new String[]{"foo", "bar"});
+      csv.add(new String[]{"asdf", "123"});
+      return csv;
+   }
+
+
+}

Added: trunk/examples/restbay/src/org/jboss/seam/example/restbay/test/AuctionServiceTest.java
===================================================================
--- trunk/examples/restbay/src/org/jboss/seam/example/restbay/test/AuctionServiceTest.java	                        (rev 0)
+++ trunk/examples/restbay/src/org/jboss/seam/example/restbay/test/AuctionServiceTest.java	2009-03-26 07:42:18 UTC (rev 10215)
@@ -0,0 +1,85 @@
+package org.jboss.seam.example.restbay.test;
+
+import org.jboss.seam.example.restbay.test.fwk.ResourceSeamTest;
+import org.jboss.seam.example.restbay.test.fwk.MockHttpServletResponse;
+import org.testng.annotations.Test;
+
+import java.util.HashMap;
+import java.util.Map;
+
+public class AuctionServiceTest extends ResourceSeamTest
+{
+
+   @Override
+   public Map<String, Object> getDefaultHeaders()
+   {
+      return new HashMap<String, Object>()
+      {{
+            put("Accept", "text/plain");
+      }};
+   }
+
+   @Test
+   public void testCategories() throws Exception
+   {
+
+      new ResourceRequest(Method.GET, "/restv1/category")
+      {
+
+         @Override
+         protected void onResponse(MockHttpServletResponse response)
+         {
+            assert response.getStatus() == 200;
+            String[] lines = response.getContentAsString().split("\n");
+            assert lines[0].equals("1,Antiques");
+            assert lines[1].equals("2,Art");
+            assert lines[2].equals("3,Books");
+         }
+
+      }.run();
+
+      new ResourceRequest(Method.GET, "/restv1/category/1")
+      {
+
+         @Override
+         protected void onResponse(MockHttpServletResponse response)
+         {
+            assert response.getStatus() == 200;
+            assert response.getContentAsString().equals("Antiques");
+         }
+
+      }.run();
+
+   }
+
+   @Test
+   public void testAuctions() throws Exception
+   {
+
+      new ResourceRequest(Method.GET, "/restv1/auction")
+      {
+
+         @Override
+         protected void onResponse(MockHttpServletResponse response)
+         {
+            assert response.getStatus() == 200;
+            // TODO: Assert content
+         }
+
+      }.run();
+
+      new ResourceRequest(Method.GET, "/restv1/auction/19264723")
+      {
+
+         @Override
+         protected void onResponse(MockHttpServletResponse response)
+         {
+            assert response.getStatus() == 200;
+            assert response.getContentAsString().equals("Whistler's Mother, original painting by James McNeill Whistler");
+         }
+
+      }.run();
+
+   }
+
+}
\ No newline at end of file

Added: trunk/examples/restbay/src/org/jboss/seam/example/restbay/test/BasicServiceTest.java
===================================================================
--- trunk/examples/restbay/src/org/jboss/seam/example/restbay/test/BasicServiceTest.java	                        (rev 0)
+++ trunk/examples/restbay/src/org/jboss/seam/example/restbay/test/BasicServiceTest.java	2009-03-26 07:42:18 UTC (rev 10215)
@@ -0,0 +1,250 @@
+package org.jboss.seam.example.restbay.test;
+
+import org.jboss.seam.example.restbay.test.fwk.ResourceSeamTest;
+import org.jboss.seam.example.restbay.test.fwk.MockHttpServletResponse;
+import org.jboss.seam.example.restbay.test.fwk.MockHttpServletRequest;
+import org.testng.annotations.Test;
+
+import javax.servlet.http.Cookie;
+import javax.ws.rs.core.MediaType;
+import java.util.Map;
+import java.util.HashMap;
+
+public class BasicServiceTest extends ResourceSeamTest
+{
+
+   @Override
+   public Map<String, Object> getDefaultHeaders()
+   {
+      return new HashMap<String, Object>()
+      {{
+            put("Accept", "text/plain");
+      }};
+   }
+
+   @Test
+   public void testExeptionMapping() throws Exception
+   {
+      new ResourceRequest(Method.GET, "/restv1/test/foo/unsupported")
+      {
+
+         @Override
+         protected void onResponse(MockHttpServletResponse response)
+         {
+            assert response.getStatus() == 501;
+            assert response.getStatusMessage().equals("The request operation is not supported: foo");
+         }
+
+      }.run();
+
+   }
+
+   @Test
+   public void testPlainResources() throws Exception
+   {
+      new ResourceRequest(Method.GET, "/restv1/test/echouri")
+      {
+
+         @Override
+         protected void onResponse(MockHttpServletResponse response)
+         {
+            assert response.getStatus() == 200;
+            assert response.getContentAsString().equals("/test/echouri");
+         }
+
+      }.run();
+
+      new ResourceRequest(Method.GET, "/restv1/test/echoquery")
+      {
+
+         @Override
+         protected void prepareRequest(MockHttpServletRequest request)
+         {
+            request.setQueryString("asdf=123");
+            request.addQueryParameter("bar", "bbb");
+            request.addQueryParameter("baz", "bzzz");
+         }
+
+         @Override
+         protected void onResponse(MockHttpServletResponse response)
+         {
+            assert response.getStatus() == 200;
+            assert response.getContentAsString().equals("bbb");
+         }
+
+      }.run();
+
+      new ResourceRequest(Method.GET, "/restv1/test/echoheader")
+      {
+
+         @Override
+         protected void prepareRequest(MockHttpServletRequest request)
+         {
+            request.addHeader("bar", "baz");
+         }
+
+         @Override
+         protected void onResponse(MockHttpServletResponse response)
+         {
+            assert response.getStatus() == 200;
+            assert response.getContentAsString().equals("baz");
+         }
+
+      }.run();
+
+      new ResourceRequest(Method.GET, "/restv1/test/echocookie")
+      {
+
+         @Override
+         protected void prepareRequest(MockHttpServletRequest request)
+         {
+            request.addCookie(new Cookie("bar", "baz"));
+         }
+
+         @Override
+         protected void onResponse(MockHttpServletResponse response)
+         {
+            assert response.getStatus() == 200;
+            assert response.getContentAsString().equals("baz");
+         }
+
+      }.run();
+
+      new ResourceRequest(Method.GET, "/restv1/test/foo/bar/asdf")
+      {
+
+         @Override
+         protected void onResponse(MockHttpServletResponse response)
+         {
+
+            assert response.getStatus() == 200;
+            assert response.getContentAsString().equals("bar: asdf");
+         }
+
+      }.run();
+
+   }
+
+   @Test
+   public void testEncoding() throws Exception
+   {
+      new ResourceRequest(Method.GET, "/restv1/test/echoencoded/foo bar")
+      {
+
+         @Override
+         protected void onResponse(MockHttpServletResponse response)
+         {
+            assert response.getStatus() == 200;
+            assert response.getContentAsString().equals("foo%20bar");
+         }
+
+      }.run();
+   }
+
+   @Test
+   public void testFormHandling() throws Exception
+   {
+      new ResourceRequest(Method.POST, "/restv1/test/echoformparams")
+      {
+
+         @Override
+         protected void prepareRequest(MockHttpServletRequest request)
+         {
+            request.setContentType(MediaType.APPLICATION_FORM_URLENCODED);
+            request.addParameter("foo", new String[]{"bar", "baz"});
+         }
+
+         @Override
+         protected void onResponse(MockHttpServletResponse response)
+         {
+            assert response.getStatus() == 200;
+            assert response.getContentAsString().equals("barbaz");
+         }
+
+      }.run();
+
+      new ResourceRequest(Method.POST, "/restv1/test/echoformparams2")
+      {
+
+         @Override
+         protected void prepareRequest(MockHttpServletRequest request)
+         {
+            request.setContentType(MediaType.APPLICATION_FORM_URLENCODED);
+            request.addParameter("foo", new String[]{"bar", "baz"});
+         }
+
+         @Override
+         protected void onResponse(MockHttpServletResponse response)
+         {
+            assert response.getStatus() == 200;
+            assert response.getContentAsString().equals("barbaz");
+         }
+
+      }.run();
+
+      new ResourceRequest(Method.POST, "/restv1/test/echoformparams3")
+      {
+
+         @Override
+         protected void prepareRequest(MockHttpServletRequest request)
+         {
+            request.setContentType(MediaType.APPLICATION_FORM_URLENCODED);
+            request.addHeader("bar", "foo");
+            request.addParameter("foo", new String[]{"bar", "baz"});
+         }
+
+         @Override
+         protected void onResponse(MockHttpServletResponse response)
+         {
+            assert response.getStatus() == 200;
+            assert response.getContentAsString().equals("foobarbaz");
+         }
+
+      }.run();
+
+   }
+
+   @Test
+   public void testStringConverter() throws Exception
+   {
+      final String ISO_DATE = "2007-07-10T14:54:56-05:00";
+      final String ISO_DATE_MILLIS = "1184072096000";
+
+      new ResourceRequest(Method.GET, "/restv1/test/foo/" + ISO_DATE)
+      {
+
+         @Override
+         protected void onResponse(MockHttpServletResponse response)
+         {
+            assert response.getStatus() == 200;
+            assert response.getContentAsString().equals(ISO_DATE_MILLIS);
+         }
+
+      }.run();
+
+   }
+
+   @Test
+   public void testProvider() throws Exception
+   {
+
+      new ResourceRequest(Method.GET, "/restv1/test/foo/commaseparated")
+      {
+
+         @Override
+         protected void prepareRequest(MockHttpServletRequest request)
+         {
+            request.addHeader("Accept", "text/csv");
+         }
+
+         @Override
+         protected void onResponse(MockHttpServletResponse response)
+         {
+            assert response.getStatus() == 200;
+            assert response.getContentAsString().equals("foo,bar\r\nasdf,123\r\n");
+         }
+
+      }.run();
+
+   }
+}

Added: trunk/examples/restbay/src/org/jboss/seam/example/restbay/test/fwk/DelegatingServletInputStream.java
===================================================================
--- trunk/examples/restbay/src/org/jboss/seam/example/restbay/test/fwk/DelegatingServletInputStream.java	                        (rev 0)
+++ trunk/examples/restbay/src/org/jboss/seam/example/restbay/test/fwk/DelegatingServletInputStream.java	2009-03-26 07:42:18 UTC (rev 10215)
@@ -0,0 +1,64 @@
+/*
+ * Copyright 2002-2007 the original author or authors.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.jboss.seam.example.restbay.test.fwk;
+
+import java.io.IOException;
+import java.io.InputStream;
+
+import javax.servlet.ServletInputStream;
+
+/**
+ * Delegating implementation of {@link javax.servlet.ServletInputStream}.
+ *
+ * <p>Used by {@link MockHttpServletRequest}; typically not directly
+ * used for testing application controllers.
+ *
+ * @author Juergen Hoeller
+ * @since 1.0.2
+ * @see MockHttpServletRequest
+ */
+public class DelegatingServletInputStream extends ServletInputStream {
+
+	private final InputStream sourceStream;
+
+
+	/**
+	 * Create a DelegatingServletInputStream for the given source stream.
+	 * @param sourceStream the source stream (never <code>null</code>)
+	 */
+	public DelegatingServletInputStream(InputStream sourceStream) {
+		this.sourceStream = sourceStream;
+	}
+
+	/**
+	 * Return the underlying source stream (never <code>null</code>).
+	 */
+	public final InputStream getSourceStream() {
+		return this.sourceStream;
+	}
+
+
+	public int read() throws IOException {
+		return this.sourceStream.read();
+	}
+
+	public void close() throws IOException {
+		super.close();
+		this.sourceStream.close();
+	}
+
+}
\ No newline at end of file

Added: trunk/examples/restbay/src/org/jboss/seam/example/restbay/test/fwk/DelegatingServletOutputStream.java
===================================================================
--- trunk/examples/restbay/src/org/jboss/seam/example/restbay/test/fwk/DelegatingServletOutputStream.java	                        (rev 0)
+++ trunk/examples/restbay/src/org/jboss/seam/example/restbay/test/fwk/DelegatingServletOutputStream.java	2009-03-26 07:42:18 UTC (rev 10215)
@@ -0,0 +1,77 @@
+/*
+ * Copyright 2002-2007 the original author or authors.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.jboss.seam.example.restbay.test.fwk;
+
+import java.io.IOException;
+import java.io.OutputStream;
+
+import javax.servlet.ServletOutputStream;
+
+
+/**
+ * Delegating implementation of {@link javax.servlet.ServletOutputStream}.
+ * <p/>
+ * <p>Used by {@link org.jboss.seam.example.restbay.test.fwk.MockHttpServletResponse}; typically not directly
+ * used for testing application controllers.
+ *
+ * @author Juergen Hoeller
+ * @see org.jboss.seam.example.restbay.test.fwk.MockHttpServletResponse
+ * @since 1.0.2
+ */
+public class DelegatingServletOutputStream extends ServletOutputStream
+{
+
+   private final OutputStream targetStream;
+
+
+   /**
+    * Create a DelegatingServletOutputStream for the given target stream.
+    *
+    * @param targetStream the target stream (never <code>null</code>)
+    */
+   public DelegatingServletOutputStream(OutputStream targetStream)
+   {
+      this.targetStream = targetStream;
+   }
+
+   /**
+    * Return the underlying target stream (never <code>null</code>).
+    */
+   public final OutputStream getTargetStream()
+   {
+      return this.targetStream;
+   }
+
+
+   public void write(int b) throws IOException
+   {
+      this.targetStream.write(b);
+   }
+
+   public void flush() throws IOException
+   {
+      super.flush();
+      this.targetStream.flush();
+   }
+
+   public void close() throws IOException
+   {
+      super.close();
+      this.targetStream.close();
+	}
+
+}
\ No newline at end of file

Added: trunk/examples/restbay/src/org/jboss/seam/example/restbay/test/fwk/HeaderValueHolder.java
===================================================================
--- trunk/examples/restbay/src/org/jboss/seam/example/restbay/test/fwk/HeaderValueHolder.java	                        (rev 0)
+++ trunk/examples/restbay/src/org/jboss/seam/example/restbay/test/fwk/HeaderValueHolder.java	2009-03-26 07:42:18 UTC (rev 10215)
@@ -0,0 +1,100 @@
+/*
+ * Copyright 2002-2007 the original author or authors.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.jboss.seam.example.restbay.test.fwk;
+
+import java.util.*;
+import java.lang.reflect.Array;
+
+/**
+ * Internal helper class that serves as value holder for request headers.
+ *
+ * @author Juergen Hoeller
+ * @author Rick Evans
+ * @since 2.0.1
+ */
+class HeaderValueHolder {
+
+	private final List values = new LinkedList();
+
+
+	public void setValue(Object value) {
+		this.values.clear();
+		this.values.add(value);
+	}
+
+	public void addValue(Object value) {
+		this.values.add(value);
+	}
+
+	public void addValues(Collection values) {
+		this.values.addAll(values);
+	}
+
+	public void addValueArray(Object values) {
+		Object[] arr = toObjectArray(values);
+      this.values.addAll(Arrays.asList(arr));
+	}
+
+	public List getValues() {
+		return Collections.unmodifiableList(this.values);
+	}
+
+	public Object getValue() {
+		return (!this.values.isEmpty() ? this.values.get(0) : null);
+	}
+
+
+	/**
+	 * Find a HeaderValueHolder by name, ignoring casing.
+	 * @param headers the Map of header names to HeaderValueHolders
+	 * @param name the name of the desired header
+	 * @return the corresponding HeaderValueHolder,
+	 * or <code>null</code> if none found
+	 */
+	public static HeaderValueHolder getByName(Map headers, String name) {
+		for (Iterator it = headers.keySet().iterator(); it.hasNext();) {
+			String headerName = (String) it.next();
+			if (headerName.equalsIgnoreCase(name)) {
+				return (HeaderValueHolder) headers.get(headerName);
+			}
+		}
+		return null;
+	}
+
+   public static Object[] toObjectArray(Object source) {
+		if (source instanceof Object[]) {
+			return (Object[]) source;
+		}
+		if (source == null) {
+			return new Object[0];
+		}
+		if (!source.getClass().isArray()) {
+			throw new IllegalArgumentException("Source is not an array: " + source);
+		}
+		int length = Array.getLength(source);
+		if (length == 0) {
+			return new Object[0];
+		}
+		Class wrapperType = Array.get(source, 0).getClass();
+		Object[] newArray = (Object[]) Array.newInstance(wrapperType, length);
+		for (int i = 0; i < length; i++) {
+			newArray[i] = Array.get(source, i);
+		}
+		return newArray;
+	}
+
+}
\ No newline at end of file

Added: trunk/examples/restbay/src/org/jboss/seam/example/restbay/test/fwk/MockHttpServletRequest.java
===================================================================
--- trunk/examples/restbay/src/org/jboss/seam/example/restbay/test/fwk/MockHttpServletRequest.java	                        (rev 0)
+++ trunk/examples/restbay/src/org/jboss/seam/example/restbay/test/fwk/MockHttpServletRequest.java	2009-03-26 07:42:18 UTC (rev 10215)
@@ -0,0 +1,879 @@
+/*
+ * Copyright 2002-2008 the original author or authors.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.jboss.seam.example.restbay.test.fwk;
+
+import java.io.BufferedReader;
+import java.io.ByteArrayInputStream;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.io.Reader;
+import java.io.UnsupportedEncodingException;
+import java.security.Principal;
+import java.util.*;
+
+import javax.servlet.RequestDispatcher;
+import javax.servlet.ServletContext;
+import javax.servlet.ServletInputStream;
+import javax.servlet.http.Cookie;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpSession;
+
+import org.jboss.seam.mock.MockServletContext;
+import org.jboss.seam.mock.MockHttpSession;
+
+/**
+ * Mock implementation of the {@link javax.servlet.http.HttpServletRequest}
+ * interface. Supports the Servlet 2.4 API level.
+ *
+ * <p>Used for testing the web framework; also useful for testing
+ * application controllers.
+ *
+ * @author Juergen Hoeller
+ * @author Rod Johnson
+ * @author Rick Evans
+ * @author Mark Fisher
+ * @since 1.0.2
+ */
+public class MockHttpServletRequest implements HttpServletRequest {
+
+	/**
+	 * The default protocol: 'http'.
+	 */
+	public static final String DEFAULT_PROTOCOL = "http";
+
+	/**
+	 * The default server address: '127.0.0.1'.
+	 */
+	public static final String DEFAULT_SERVER_ADDR = "127.0.0.1";
+
+	/**
+	 * The default server name: 'localhost'.
+	 */
+	public static final String DEFAULT_SERVER_NAME = "localhost";
+
+	/**
+	 * The default server port: '80'.
+	 */
+	public static final int DEFAULT_SERVER_PORT = 80;
+
+	/**
+	 * The default remote address: '127.0.0.1'.
+	 */
+	public static final String DEFAULT_REMOTE_ADDR = "127.0.0.1";
+
+	/**
+	 * The default remote host: 'localhost'.
+	 */
+	public static final String DEFAULT_REMOTE_HOST = "localhost";
+
+	private boolean active = true;
+
+
+	//---------------------------------------------------------------------
+	// ServletRequest properties
+	//---------------------------------------------------------------------
+
+	private final Hashtable attributes = new Hashtable();
+
+	private String characterEncoding;
+
+	private byte[] content;
+
+	private String contentType;
+
+	private final Map parameters = new LinkedHashMap(16);
+
+	private String protocol = DEFAULT_PROTOCOL;
+
+	private String scheme = DEFAULT_PROTOCOL;
+
+	private String serverName = DEFAULT_SERVER_NAME;
+
+	private int serverPort = DEFAULT_SERVER_PORT;
+
+	private String remoteAddr = DEFAULT_REMOTE_ADDR;
+
+	private String remoteHost = DEFAULT_REMOTE_HOST;
+
+	/** List of locales in descending order */
+	private final Vector locales = new Vector();
+
+	private boolean secure = false;
+
+	private final ServletContext servletContext;
+
+	private int remotePort = DEFAULT_SERVER_PORT;
+
+	private String localName = DEFAULT_SERVER_NAME;
+
+	private String localAddr = DEFAULT_SERVER_ADDR;
+
+	private int localPort = DEFAULT_SERVER_PORT;
+
+
+	//---------------------------------------------------------------------
+	// HttpServletRequest properties
+	//---------------------------------------------------------------------
+
+	private String authType;
+
+	private Cookie[] cookies;
+
+	/**
+	 * The key is the lowercase header name; the value is a {@link HeaderValueHolder} object.
+	 */
+	private final Hashtable headers = new Hashtable();
+
+	private String method;
+
+	private String pathInfo;
+
+	private String contextPath = "";
+
+	private String queryString;
+
+   private Map<String,String> queryParameters = new HashMap();
+
+	private String remoteUser;
+
+	private final Set userRoles = new HashSet();
+
+	private Principal userPrincipal;
+
+	private String requestURI;
+
+	private String servletPath = "";
+
+	private HttpSession session;
+
+	private boolean requestedSessionIdValid = true;
+
+	private boolean requestedSessionIdFromCookie = true;
+
+	private boolean requestedSessionIdFromURL = false;
+
+
+   //---------------------------------------------------------------------
+	// Constructors
+	//---------------------------------------------------------------------
+
+	/**
+	 * Create a new MockHttpServletRequest with a default
+	 * {@link MockServletContext}.
+	 * @see MockServletContext
+	 */
+	public MockHttpServletRequest() {
+		this(null, "", "");
+	}
+
+	/**
+	 * Create a new MockHttpServletRequest with a default
+	 * {@link MockServletContext}.
+	 * @param method the request method (may be <code>null</code>)
+	 * @param requestURI the request URI (may be <code>null</code>)
+	 * @see #setMethod
+	 * @see #setRequestURI
+	 * @see MockServletContext
+	 */
+	public MockHttpServletRequest(String method, String requestURI) {
+		this(null, method, requestURI);
+	}
+
+	/**
+	 * Create a new MockHttpServletRequest.
+	 * @param servletContext the ServletContext that the request runs in
+	 * (may be <code>null</code> to use a default MockServletContext)
+	 * @see MockServletContext
+	 */
+	public MockHttpServletRequest(ServletContext servletContext) {
+		this(servletContext, "", "");
+	}
+
+	/**
+	 * Create a new MockHttpServletRequest.
+	 * @param servletContext the ServletContext that the request runs in
+	 * (may be <code>null</code> to use a default MockServletContext)
+	 * @param method the request method (may be <code>null</code>)
+	 * @param requestURI the request URI (may be <code>null</code>)
+	 * @see #setMethod
+	 * @see #setRequestURI
+	 * @see MockServletContext
+	 */
+	public MockHttpServletRequest(ServletContext servletContext, String method, String requestURI) {
+		this.servletContext = (servletContext != null ? servletContext : new MockServletContext());
+		this.method = method;
+		this.requestURI = requestURI;
+		this.locales.add(Locale.ENGLISH);
+	}
+
+
+	//---------------------------------------------------------------------
+	// Lifecycle methods
+	//---------------------------------------------------------------------
+
+	/**
+	 * Return the ServletContext that this request is associated with.
+	 * (Not available in the standard HttpServletRequest interface for some reason.)
+	 */
+	public ServletContext getServletContext() {
+		return this.servletContext;
+	}
+
+	/**
+	 * Return whether this request is still active (that is, not completed yet).
+	 */
+	public boolean isActive() {
+		return this.active;
+	}
+
+	/**
+	 * Mark this request as completed, keeping its state.
+	 */
+	public void close() {
+		this.active = false;
+	}
+
+	/**
+	 * Invalidate this request, clearing its state.
+	 */
+	public void invalidate() {
+		close();
+		clearAttributes();
+	}
+
+	/**
+	 * Check whether this request is still active (that is, not completed yet),
+	 * throwing an IllegalStateException if not active anymore.
+	 */
+	protected void checkActive() throws IllegalStateException {
+		if (!this.active) {
+			throw new IllegalStateException("Request is not active anymore");
+		}
+	}
+
+
+	//---------------------------------------------------------------------
+	// ServletRequest interface
+	//---------------------------------------------------------------------
+
+	public Object getAttribute(String name) {
+		checkActive();
+		return this.attributes.get(name);
+	}
+
+	public Enumeration getAttributeNames() {
+		checkActive();
+		return this.attributes.keys();
+	}
+
+	public String getCharacterEncoding() {
+		return this.characterEncoding;
+	}
+
+	public void setCharacterEncoding(String characterEncoding) {
+		this.characterEncoding = characterEncoding;
+	}
+
+	public void setContent(byte[] content) {
+		this.content = content;
+	}
+
+	public int getContentLength() {
+		return (this.content != null ? this.content.length : -1);
+	}
+
+	public void setContentType(String contentType) {
+		this.contentType = contentType;
+	}
+
+	public String getContentType() {
+		return this.contentType;
+	}
+
+	public ServletInputStream getInputStream() {
+		if (this.content != null) {
+			return new DelegatingServletInputStream(new ByteArrayInputStream(this.content));
+		}
+		else {
+			return null;
+		}
+	}
+
+	/**
+	 * Set a single value for the specified HTTP parameter.
+	 * <p>If there are already one or more values registered for the given
+	 * parameter name, they will be replaced.
+	 */
+	public void setParameter(String name, String value) {
+		setParameter(name, new String[] {value});
+	}
+
+	/**
+	 * Set an array of values for the specified HTTP parameter.
+	 * <p>If there are already one or more values registered for the given
+	 * parameter name, they will be replaced.
+	 */
+	public void setParameter(String name, String[] values) {
+		this.parameters.put(name, values);
+	}
+
+	/**
+	 * Sets all provided parameters <emphasis>replacing</emphasis> any
+	 * existing values for the provided parameter names. To add without
+	 * replacing existing values, use {@link #addParameters(Map)}.
+	 */
+	public void setParameters(Map params) {
+		for (Iterator it = params.keySet().iterator(); it.hasNext();) {
+			Object key = it.next();
+			Object value = params.get(key);
+			if (value instanceof String) {
+				this.setParameter((String) key, (String) value);
+			}
+			else if (value instanceof String[]) {
+				this.setParameter((String) key, (String[]) value);
+			}
+			else {
+				throw new IllegalArgumentException("Parameter map value must be single value " +
+						" or array of type [" + String.class.getName() + "]");
+			}
+		}
+	}
+
+	/**
+	 * Add a single value for the specified HTTP parameter.
+	 * <p>If there are already one or more values registered for the given
+	 * parameter name, the given value will be added to the end of the list.
+	 */
+	public void addParameter(String name, String value) {
+		addParameter(name, new String[] {value});
+	}
+
+	/**
+	 * Add an array of values for the specified HTTP parameter.
+	 * <p>If there are already one or more values registered for the given
+	 * parameter name, the given values will be added to the end of the list.
+	 */
+	public void addParameter(String name, String[] values) {
+		String[] oldArr = (String[]) this.parameters.get(name);
+		if (oldArr != null) {
+			String[] newArr = new String[oldArr.length + values.length];
+			System.arraycopy(oldArr, 0, newArr, 0, oldArr.length);
+			System.arraycopy(values, 0, newArr, oldArr.length, values.length);
+			this.parameters.put(name, newArr);
+		}
+		else {
+			this.parameters.put(name, values);
+		}
+	}
+
+	/**
+	 * Adds all provided parameters <emphasis>without</emphasis> replacing
+	 * any existing values. To replace existing values, use
+	 * {@link #setParameters(Map)}.
+	 */
+	public void addParameters(Map params) {
+		for (Iterator it = params.keySet().iterator(); it.hasNext();) {
+			Object key = it.next();
+			Object value = params.get(key);
+			if (value instanceof String) {
+				this.addParameter((String) key, (String) value);
+			}
+			else if (value instanceof String[]) {
+				this.addParameter((String) key, (String[]) value);
+			}
+			else {
+				throw new IllegalArgumentException("Parameter map value must be single value " +
+						" or array of type [" + String.class.getName() + "]");
+			}
+		}
+	}
+
+	/**
+	 * Remove already registered values for the specified HTTP parameter, if any.
+	 */
+	public void removeParameter(String name) {
+		this.parameters.remove(name);
+	}
+
+	/**
+	 * Removes all existing parameters.
+	 */
+	public void removeAllParameters() {
+		this.parameters.clear();
+	}
+
+	public String getParameter(String name) {
+		String[] arr = (String[]) this.parameters.get(name);
+		return (arr != null && arr.length > 0 ? arr[0] : null);
+	}
+
+	public Enumeration getParameterNames() {
+		return Collections.enumeration(this.parameters.keySet());
+	}
+
+	public String[] getParameterValues(String name) {
+		return (String[]) this.parameters.get(name);
+	}
+
+	public Map getParameterMap() {
+		return Collections.unmodifiableMap(this.parameters);
+	}
+
+   /**
+    * Add a query parameter that will be appended to the URI query string.
+    */
+   public void addQueryParameter(String name, String value) {
+      addParameter(name, value);
+      this.queryParameters.put(name, value);
+   }
+
+   public void removeQueryParameter(String name) {
+      removeParameter(name);
+      this.queryParameters.remove(name);
+   }
+
+   public Map<String, String> getQueryParameters()
+   {
+      return queryParameters;
+   }
+
+   public void setProtocol(String protocol) {
+		this.protocol = protocol;
+	}
+
+	public String getProtocol() {
+		return this.protocol;
+	}
+
+	public void setScheme(String scheme) {
+		this.scheme = scheme;
+	}
+
+	public String getScheme() {
+		return this.scheme;
+	}
+
+	public void setServerName(String serverName) {
+		this.serverName = serverName;
+	}
+
+	public String getServerName() {
+		return this.serverName;
+	}
+
+	public void setServerPort(int serverPort) {
+		this.serverPort = serverPort;
+	}
+
+	public int getServerPort() {
+		return this.serverPort;
+	}
+
+	public BufferedReader getReader() throws UnsupportedEncodingException {
+		if (this.content != null) {
+			InputStream sourceStream = new ByteArrayInputStream(this.content);
+			Reader sourceReader = (this.characterEncoding != null) ?
+					new InputStreamReader(sourceStream, this.characterEncoding) : new InputStreamReader(sourceStream);
+			return new BufferedReader(sourceReader);
+		}
+		else {
+			return null;
+		}
+	}
+
+	public void setRemoteAddr(String remoteAddr) {
+		this.remoteAddr = remoteAddr;
+	}
+
+	public String getRemoteAddr() {
+		return this.remoteAddr;
+	}
+
+	public void setRemoteHost(String remoteHost) {
+		this.remoteHost = remoteHost;
+	}
+
+	public String getRemoteHost() {
+		return this.remoteHost;
+	}
+
+	public void setAttribute(String name, Object value) {
+		checkActive();
+		if (value != null) {
+			this.attributes.put(name, value);
+		}
+		else {
+			this.attributes.remove(name);
+		}
+	}
+
+	public void removeAttribute(String name) {
+		checkActive();
+		this.attributes.remove(name);
+	}
+
+	/**
+	 * Clear all of this request's attributes.
+	 */
+	public void clearAttributes() {
+		this.attributes.clear();
+	}
+
+	/**
+	 * Add a new preferred locale, before any existing locales.
+	 */
+	public void addPreferredLocale(Locale locale) {
+		this.locales.add(0, locale);
+	}
+
+	public Locale getLocale() {
+		return (Locale) this.locales.get(0);
+	}
+
+	public Enumeration getLocales() {
+		return this.locales.elements();
+	}
+
+	public void setSecure(boolean secure) {
+		this.secure = secure;
+	}
+
+	public boolean isSecure() {
+		return this.secure;
+	}
+
+	public RequestDispatcher getRequestDispatcher(String path) {
+		return new MockRequestDispatcher(path);
+	}
+
+	public String getRealPath(String path) {
+		return this.servletContext.getRealPath(path);
+	}
+
+	public void setRemotePort(int remotePort) {
+		this.remotePort = remotePort;
+	}
+
+	public int getRemotePort() {
+		return this.remotePort;
+	}
+
+	public void setLocalName(String localName) {
+		this.localName = localName;
+	}
+
+	public String getLocalName() {
+		return this.localName;
+	}
+
+	public void setLocalAddr(String localAddr) {
+		this.localAddr = localAddr;
+	}
+
+	public String getLocalAddr() {
+		return this.localAddr;
+	}
+
+	public void setLocalPort(int localPort) {
+		this.localPort = localPort;
+	}
+
+	public int getLocalPort() {
+		return this.localPort;
+	}
+
+
+	//---------------------------------------------------------------------
+	// HttpServletRequest interface
+	//---------------------------------------------------------------------
+
+	public void setAuthType(String authType) {
+		this.authType = authType;
+	}
+
+	public String getAuthType() {
+		return this.authType;
+	}
+
+	public void setCookies(Cookie[] cookies) {
+		this.cookies = cookies;
+	}
+
+	public Cookie[] getCookies() {
+		return this.cookies;
+	}
+
+   public void addCookie(Cookie cookie) {
+      this.cookies = new Cookie[this.cookies.length+1];
+      this.cookies[this.cookies.length-1] = cookie;
+   }
+
+	/**
+	 * Add a header entry for the given name.
+	 * <p>If there was no entry for that header name before,
+	 * the value will be used as-is. In case of an existing entry,
+	 * a String array will be created, adding the given value (more
+	 * specifically, its toString representation) as further element.
+	 * <p>Multiple values can only be stored as list of Strings,
+	 * following the Servlet spec (see <code>getHeaders</code> accessor).
+	 * As alternative to repeated <code>addHeader</code> calls for
+	 * individual elements, you can use a single call with an entire
+	 * array or Collection of values as parameter.
+	 * @see #getHeaderNames
+	 * @see #getHeader
+	 * @see #getHeaders
+	 * @see #getDateHeader
+	 * @see #getIntHeader
+	 */
+	public void addHeader(String name, Object value) {
+		HeaderValueHolder header = HeaderValueHolder.getByName(this.headers, name);
+		if (header == null) {
+			header = new HeaderValueHolder();
+			this.headers.put(name, header);
+		}
+		if (value instanceof Collection) {
+			header.addValues((Collection) value);
+		}
+		else if (value.getClass().isArray()) {
+			header.addValueArray(value);
+		}
+		else {
+			header.addValue(value);
+		}
+	}
+
+	public long getDateHeader(String name) {
+		HeaderValueHolder header = HeaderValueHolder.getByName(this.headers, name);
+		Object value = (header != null ? header.getValue() : null);
+		if (value instanceof Date) {
+			return ((Date) value).getTime();
+		}
+		else if (value instanceof Number) {
+			return ((Number) value).longValue();
+		}
+		else if (value != null) {
+			throw new IllegalArgumentException(
+					"Value for header '" + name + "' is neither a Date nor a Number: " + value);
+		}
+		else {
+			return -1L;
+		}
+	}
+
+	public String getHeader(String name) {
+		HeaderValueHolder header = HeaderValueHolder.getByName(this.headers, name);
+		return (header != null ? header.getValue().toString() : null);
+	}
+
+	public Enumeration getHeaders(String name) {
+		HeaderValueHolder header = HeaderValueHolder.getByName(this.headers, name);
+		return Collections.enumeration(header != null ? header.getValues() : Collections.EMPTY_LIST);
+	}
+
+	public Enumeration getHeaderNames() {
+		return this.headers.keys();
+	}
+
+	public int getIntHeader(String name) {
+		HeaderValueHolder header = HeaderValueHolder.getByName(this.headers, name);
+		Object value = (header != null ? header.getValue() : null);
+		if (value instanceof Number) {
+			return ((Number) value).intValue();
+		}
+		else if (value instanceof String) {
+			return Integer.parseInt((String) value);
+		}
+		else if (value != null) {
+			throw new NumberFormatException("Value for header '" + name + "' is not a Number: " + value);
+		}
+		else {
+			return -1;
+		}
+	}
+
+	public void setMethod(String method) {
+		this.method = method;
+	}
+
+	public String getMethod() {
+		return this.method;
+	}
+
+	public void setPathInfo(String pathInfo) {
+		this.pathInfo = pathInfo;
+	}
+
+	public String getPathInfo() {
+		return this.pathInfo;
+	}
+
+	public String getPathTranslated() {
+		return (this.pathInfo != null ? getRealPath(this.pathInfo) : null);
+	}
+
+	public void setContextPath(String contextPath) {
+		this.contextPath = contextPath;
+	}
+
+	public String getContextPath() {
+		return this.contextPath;
+	}
+
+	public void setQueryString(String queryString) {
+		this.queryString = queryString;
+	}
+
+	public String getQueryString() {
+      if (getQueryParameters().size() > 0) {
+         StringBuilder q = new StringBuilder(queryString);
+         if (!queryString.endsWith("&")) q.append("&");
+         for (Map.Entry<String, String> entry : getQueryParameters().entrySet())
+         {
+            q.append(entry.getKey());
+            q.append("=");
+            q.append(entry.getValue());
+            q.append("&");
+         }
+         if (q.toString().endsWith("&")) {
+            q.deleteCharAt(q.length()-1);
+         }
+         return q.toString();
+      }
+		return this.queryString;
+	}
+
+	public void setRemoteUser(String remoteUser) {
+		this.remoteUser = remoteUser;
+	}
+
+	public String getRemoteUser() {
+		return this.remoteUser;
+	}
+
+	/**
+	 * @deprecated in favor of addUserRole
+	 * @see #addUserRole
+	 */
+	public void addRole(String role) {
+		addUserRole(role);
+	}
+
+	public void addUserRole(String role) {
+		this.userRoles.add(role);
+	}
+
+	public boolean isUserInRole(String role) {
+		return this.userRoles.contains(role);
+	}
+
+	public void setUserPrincipal(Principal userPrincipal) {
+		this.userPrincipal = userPrincipal;
+	}
+
+	public Principal getUserPrincipal() {
+		return this.userPrincipal;
+	}
+
+	public String getRequestedSessionId() {
+		HttpSession session = getSession();
+		return (session != null ? session.getId() : null);
+	}
+
+	public void setRequestURI(String requestURI) {
+		this.requestURI = requestURI;
+	}
+
+	public String getRequestURI() {
+		return this.requestURI;
+	}
+
+	public StringBuffer getRequestURL() {
+		StringBuffer url = new StringBuffer(this.scheme);
+		url.append("://").append(this.serverName).append(':').append(this.serverPort);
+		url.append(getRequestURI());
+		return url;
+	}
+
+	public void setServletPath(String servletPath) {
+		this.servletPath = servletPath;
+	}
+
+	public String getServletPath() {
+		return this.servletPath;
+	}
+
+	public void setSession(HttpSession session) {
+		this.session = session;
+      // TODO: We don't need session handling?
+      /*
+		if (session instanceof MockHttpSession) {
+			MockHttpSession mockSession = ((MockHttpSession) session);
+			mockSession.access();
+		}
+		*/
+	}
+
+	public HttpSession getSession(boolean create) {
+		checkActive();
+		// Reset session if invalidated.
+		if (this.session instanceof MockHttpSession && ((MockHttpSession) this.session).isInvalid()) {
+			this.session = null;
+		}
+		// Create new session if necessary.
+		if (this.session == null && create) {
+			this.session = new MockHttpSession(this.servletContext);
+		}
+		return this.session;
+	}
+
+	public HttpSession getSession() {
+		return getSession(true);
+	}
+
+	public void setRequestedSessionIdValid(boolean requestedSessionIdValid) {
+		this.requestedSessionIdValid = requestedSessionIdValid;
+	}
+
+	public boolean isRequestedSessionIdValid() {
+		return this.requestedSessionIdValid;
+	}
+
+	public void setRequestedSessionIdFromCookie(boolean requestedSessionIdFromCookie) {
+		this.requestedSessionIdFromCookie = requestedSessionIdFromCookie;
+	}
+
+	public boolean isRequestedSessionIdFromCookie() {
+		return this.requestedSessionIdFromCookie;
+	}
+
+	public void setRequestedSessionIdFromURL(boolean requestedSessionIdFromURL) {
+		this.requestedSessionIdFromURL = requestedSessionIdFromURL;
+	}
+
+	public boolean isRequestedSessionIdFromURL() {
+		return this.requestedSessionIdFromURL;
+	}
+
+	public boolean isRequestedSessionIdFromUrl() {
+		return isRequestedSessionIdFromURL();
+	}
+
+   public boolean isAllParametersInQueryString() {
+      return true;
+   }
+
+}
\ No newline at end of file

Added: trunk/examples/restbay/src/org/jboss/seam/example/restbay/test/fwk/MockHttpServletResponse.java
===================================================================
--- trunk/examples/restbay/src/org/jboss/seam/example/restbay/test/fwk/MockHttpServletResponse.java	                        (rev 0)
+++ trunk/examples/restbay/src/org/jboss/seam/example/restbay/test/fwk/MockHttpServletResponse.java	2009-03-26 07:42:18 UTC (rev 10215)
@@ -0,0 +1,518 @@
+/*
+ * Copyright 2002-2008 the original author or authors.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.jboss.seam.example.restbay.test.fwk;
+
+import org.jboss.seam.example.restbay.test.fwk.DelegatingServletOutputStream;
+
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.OutputStream;
+import java.io.OutputStreamWriter;
+import java.io.PrintWriter;
+import java.io.UnsupportedEncodingException;
+import java.io.Writer;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Locale;
+import java.util.Map;
+import java.util.Set;
+
+import javax.servlet.ServletOutputStream;
+import javax.servlet.http.Cookie;
+import javax.servlet.http.HttpServletResponse;
+
+
+/**
+ * Mock implementation of the {@link javax.servlet.http.HttpServletResponse}
+ * interface. Supports the Servlet 2.4 API level.
+ *
+ * <p>Used for testing the web framework; also useful for testing
+ * application controllers.
+ *
+ * @author Juergen Hoeller
+ * @author Rod Johnson
+ * @since 1.0.2
+ */
+public class MockHttpServletResponse implements HttpServletResponse {
+
+	public static final int DEFAULT_SERVER_PORT = 80;
+
+	private static final String CHARSET_PREFIX = "charset=";
+
+
+	//---------------------------------------------------------------------
+	// ServletResponse properties
+	//---------------------------------------------------------------------
+
+	private boolean outputStreamAccessAllowed = true;
+
+	private boolean writerAccessAllowed = true;
+
+	private String characterEncoding = "ISO-8859-1";
+
+	private final ByteArrayOutputStream content = new ByteArrayOutputStream();
+
+	private final ServletOutputStream outputStream = new ResponseServletOutputStream(this.content);
+
+	private PrintWriter writer;
+
+	private int contentLength = 0;
+
+	private String contentType;
+
+	private int bufferSize = 4096;
+
+	private boolean committed;
+
+	private Locale locale = Locale.getDefault();
+
+
+	//---------------------------------------------------------------------
+	// HttpServletResponse properties
+	//---------------------------------------------------------------------
+
+	private final List cookies = new ArrayList();
+
+	/**
+	 * The key is the lowercase header name; the value is a {@link HeaderValueHolder} object.
+	 */
+	private final Map headers = new HashMap();
+
+	private int status = HttpServletResponse.SC_OK;
+
+	private String statusMessage;
+
+	private String redirectedUrl;
+
+	private String forwardedUrl;
+
+	private String includedUrl;
+
+
+   //---------------------------------------------------------------------
+	// ServletResponse interface
+	//---------------------------------------------------------------------
+
+	/**
+	 * Set whether {@link #getOutputStream()} access is allowed.
+	 * <p>Default is <code>true</code>.
+	 */
+	public void setOutputStreamAccessAllowed(boolean outputStreamAccessAllowed) {
+		this.outputStreamAccessAllowed = outputStreamAccessAllowed;
+	}
+
+	/**
+	 * Return whether {@link #getOutputStream()} access is allowed.
+	 */
+	public boolean isOutputStreamAccessAllowed() {
+		return this.outputStreamAccessAllowed;
+	}
+
+	/**
+	 * Set whether {@link #getWriter()} access is allowed.
+	 * <p>Default is <code>true</code>.
+	 */
+	public void setWriterAccessAllowed(boolean writerAccessAllowed) {
+		this.writerAccessAllowed = writerAccessAllowed;
+	}
+
+	/**
+	 * Return whether {@link #getOutputStream()} access is allowed.
+	 */
+	public boolean isWriterAccessAllowed() {
+		return this.writerAccessAllowed;
+	}
+
+	public void setCharacterEncoding(String characterEncoding) {
+		this.characterEncoding = characterEncoding;
+	}
+
+	public String getCharacterEncoding() {
+		return this.characterEncoding;
+	}
+
+	public ServletOutputStream getOutputStream() {
+		if (!this.outputStreamAccessAllowed) {
+			throw new IllegalStateException("OutputStream access not allowed");
+		}
+		return this.outputStream;
+	}
+
+	public PrintWriter getWriter() throws UnsupportedEncodingException {
+		if (!this.writerAccessAllowed) {
+			throw new IllegalStateException("Writer access not allowed");
+		}
+		if (this.writer == null) {
+			Writer targetWriter = (this.characterEncoding != null ?
+					new OutputStreamWriter(this.content, this.characterEncoding) : new OutputStreamWriter(this.content));
+			this.writer = new ResponsePrintWriter(targetWriter);
+		}
+		return this.writer;
+	}
+
+	public byte[] getContentAsByteArray() {
+		flushBuffer();
+		return this.content.toByteArray();
+	}
+
+	public String getContentAsString() {
+		flushBuffer();
+      try {
+         return (this.characterEncoding != null) ?
+               this.content.toString(this.characterEncoding) : this.content.toString();
+      } catch (UnsupportedEncodingException ex) {
+         throw new RuntimeException(ex);
+      }
+	}
+
+	public void setContentLength(int contentLength) {
+		this.contentLength = contentLength;
+	}
+
+	public int getContentLength() {
+		return this.contentLength;
+	}
+
+	public void setContentType(String contentType) {
+		this.contentType = contentType;
+		if (contentType != null) {
+			int charsetIndex = contentType.toLowerCase().indexOf(CHARSET_PREFIX);
+			if (charsetIndex != -1) {
+				String encoding = contentType.substring(charsetIndex + CHARSET_PREFIX.length());
+				setCharacterEncoding(encoding);
+			}
+		}
+	}
+
+	public String getContentType() {
+		return this.contentType;
+	}
+
+	public void setBufferSize(int bufferSize) {
+		this.bufferSize = bufferSize;
+	}
+
+	public int getBufferSize() {
+		return this.bufferSize;
+	}
+
+	public void flushBuffer() {
+		setCommitted(true);
+	}
+
+	public void resetBuffer() {
+		if (isCommitted()) {
+			throw new IllegalStateException("Cannot reset buffer - response is already committed");
+		}
+		this.content.reset();
+	}
+
+	private void setCommittedIfBufferSizeExceeded() {
+		int bufSize = getBufferSize();
+		if (bufSize > 0 && this.content.size() > bufSize) {
+			setCommitted(true);
+		}
+	}
+
+	public void setCommitted(boolean committed) {
+		this.committed = committed;
+	}
+
+	public boolean isCommitted() {
+		return this.committed;
+	}
+
+	public void reset() {
+		resetBuffer();
+		this.characterEncoding = null;
+		this.contentLength = 0;
+		this.contentType = null;
+		this.locale = null;
+		this.cookies.clear();
+		this.headers.clear();
+		this.status = HttpServletResponse.SC_OK;
+		this.statusMessage = null;
+	}
+
+	public void setLocale(Locale locale) {
+		this.locale = locale;
+	}
+
+	public Locale getLocale() {
+		return this.locale;
+	}
+
+
+	//---------------------------------------------------------------------
+	// HttpServletResponse interface
+	//---------------------------------------------------------------------
+
+	public void addCookie(Cookie cookie) {
+		this.cookies.add(cookie);
+	}
+
+	public Cookie[] getCookies() {
+		return (Cookie[]) this.cookies.toArray(new Cookie[this.cookies.size()]);
+	}
+
+	public Cookie getCookie(String name) {
+		for (Iterator it = this.cookies.iterator(); it.hasNext();) {
+			Cookie cookie = (Cookie) it.next();
+			if (name.equals(cookie.getName())) {
+				return cookie;
+			}
+		}
+		return null;
+	}
+
+	public boolean containsHeader(String name) {
+		return (HeaderValueHolder.getByName(this.headers, name) != null);
+	}
+
+	/**
+	 * Return the names of all specified headers as a Set of Strings.
+	 * @return the <code>Set</code> of header name <code>Strings</code>, or an empty <code>Set</code> if none
+	 */
+	public Set getHeaderNames() {
+		return this.headers.keySet();
+	}
+
+	/**
+	 * Return the primary value for the given header, if any.
+	 * <p>Will return the first value in case of multiple values.
+	 * @param name the name of the header
+	 * @return the associated header value, or <code>null<code> if none
+	 */
+	public Object getHeader(String name) {
+		HeaderValueHolder header = HeaderValueHolder.getByName(this.headers, name);
+		return (header != null ? header.getValue() : null);
+	}
+
+	/**
+	 * Return all values for the given header as a List of value objects.
+	 * @param name the name of the header
+	 * @return the associated header values, or an empty List if none
+	 */
+	public List getHeaders(String name) {
+		HeaderValueHolder header = HeaderValueHolder.getByName(this.headers, name);
+		return (header != null ? header.getValues() : Collections.EMPTY_LIST);
+	}
+
+	/**
+	 * The default implementation returns the given URL String as-is.
+	 * <p>Can be overridden in subclasses, appending a session id or the like.
+	 */
+	public String encodeURL(String url) {
+		return url;
+	}
+
+	/**
+	 * The default implementation delegates to {@link #encodeURL},
+	 * returning the given URL String as-is.
+	 * <p>Can be overridden in subclasses, appending a session id or the like
+	 * in a redirect-specific fashion. For general URL encoding rules,
+	 * override the common {@link #encodeURL} method instead, appyling
+	 * to redirect URLs as well as to general URLs.
+	 */
+	public String encodeRedirectURL(String url) {
+		return encodeURL(url);
+	}
+
+	public String encodeUrl(String url) {
+		return encodeURL(url);
+	}
+
+	public String encodeRedirectUrl(String url) {
+		return encodeRedirectURL(url);
+	}
+
+	public void sendError(int status, String errorMessage) throws IOException {
+		if (isCommitted()) {
+			throw new IllegalStateException("Cannot set error status - response is already committed");
+		}
+		this.status = status;
+		this.statusMessage = errorMessage;
+		setCommitted(true);
+	}
+
+	public void sendError(int status) throws IOException {
+		if (isCommitted()) {
+			throw new IllegalStateException("Cannot set error status - response is already committed");
+		}
+		this.status = status;
+		setCommitted(true);
+	}
+
+	public void sendRedirect(String url) throws IOException {
+		if (isCommitted()) {
+			throw new IllegalStateException("Cannot send redirect - response is already committed");
+		}
+		this.redirectedUrl = url;
+		setCommitted(true);
+	}
+
+	public String getRedirectedUrl() {
+		return this.redirectedUrl;
+	}
+
+	public void setDateHeader(String name, long value) {
+		setHeaderValue(name, new Long(value));
+	}
+
+	public void addDateHeader(String name, long value) {
+		addHeaderValue(name, new Long(value));
+	}
+
+	public void setHeader(String name, String value) {
+		setHeaderValue(name, value);
+	}
+
+	public void addHeader(String name, String value) {
+		addHeaderValue(name, value);
+	}
+
+	public void setIntHeader(String name, int value) {
+		setHeaderValue(name, new Integer(value));
+	}
+
+	public void addIntHeader(String name, int value) {
+		addHeaderValue(name, new Integer(value));
+	}
+
+	private void setHeaderValue(String name, Object value) {
+		doAddHeaderValue(name, value, true);
+	}
+
+	private void addHeaderValue(String name, Object value) {
+		doAddHeaderValue(name, value, false);
+	}
+
+	private void doAddHeaderValue(String name, Object value, boolean replace) {
+		HeaderValueHolder header = HeaderValueHolder.getByName(this.headers, name);
+		if (header == null) {
+			header = new HeaderValueHolder();
+			this.headers.put(name, header);
+		}
+		if (replace) {
+			header.setValue(value);
+		}
+		else {
+			header.addValue(value);
+		}
+	}
+
+	public void setStatus(int status) {
+		this.status = status;
+	}
+
+	public void setStatus(int status, String statusMessage) {
+		this.status = status;
+		this.statusMessage = statusMessage;
+	}
+
+	public int getStatus() {
+		return this.status;
+	}
+
+	public String getStatusMessage() {
+		return this.statusMessage;
+	}
+
+
+	//---------------------------------------------------------------------
+	// Methods for MockRequestDispatcher
+	//---------------------------------------------------------------------
+
+	public void setForwardedUrl(String forwardedUrl) {
+		this.forwardedUrl = forwardedUrl;
+	}
+
+	public String getForwardedUrl() {
+		return this.forwardedUrl;
+	}
+
+	public void setIncludedUrl(String includedUrl) {
+		this.includedUrl = includedUrl;
+	}
+
+	public String getIncludedUrl() {
+		return this.includedUrl;
+	}
+
+
+   /**
+	 * Inner class that adapts the ServletOutputStream to mark the
+	 * response as committed once the buffer size is exceeded.
+	 */
+	private class ResponseServletOutputStream extends DelegatingServletOutputStream
+   {
+
+		public ResponseServletOutputStream(OutputStream out) {
+			super(out);
+		}
+
+		public void write(int b) throws IOException {
+			super.write(b);
+			super.flush();
+			setCommittedIfBufferSizeExceeded();
+		}
+
+		public void flush() throws IOException {
+			super.flush();
+			setCommitted(true);
+		}
+	}
+
+
+	/**
+	 * Inner class that adapts the PrintWriter to mark the
+	 * response as committed once the buffer size is exceeded.
+	 */
+	private class ResponsePrintWriter extends PrintWriter {
+
+		public ResponsePrintWriter(Writer out) {
+			super(out, true);
+		}
+
+		public void write(char buf[], int off, int len) {
+			super.write(buf, off, len);
+			super.flush();
+			setCommittedIfBufferSizeExceeded();
+		}
+
+		public void write(String s, int off, int len) {
+			super.write(s, off, len);
+			super.flush();
+			setCommittedIfBufferSizeExceeded();
+		}
+
+		public void write(int c) {
+			super.write(c);
+			super.flush();
+			setCommittedIfBufferSizeExceeded();
+		}
+
+		public void flush() {
+			super.flush();
+			setCommitted(true);
+		}
+	}
+
+}
\ No newline at end of file

Added: trunk/examples/restbay/src/org/jboss/seam/example/restbay/test/fwk/MockRequestDispatcher.java
===================================================================
--- trunk/examples/restbay/src/org/jboss/seam/example/restbay/test/fwk/MockRequestDispatcher.java	                        (rev 0)
+++ trunk/examples/restbay/src/org/jboss/seam/example/restbay/test/fwk/MockRequestDispatcher.java	2009-03-26 07:42:18 UTC (rev 10215)
@@ -0,0 +1,84 @@
+/*
+ * Copyright 2002-2007 the original author or authors.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.jboss.seam.example.restbay.test.fwk;
+
+import javax.servlet.RequestDispatcher;
+import javax.servlet.ServletRequest;
+import javax.servlet.ServletResponse;
+import javax.servlet.http.HttpServletResponseWrapper;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+
+/**
+ * Mock implementation of the {@link javax.servlet.RequestDispatcher} interface.
+ *
+ * <p>Used for testing the web framework; typically not necessary for
+ * testing application controllers.
+ *
+ * @author Rod Johnson
+ * @author Juergen Hoeller
+ * @since 1.0.2
+ */
+public class MockRequestDispatcher implements RequestDispatcher {
+
+	private final Log logger = LogFactory.getLog(getClass());
+
+	private final String url;
+
+
+	/**
+	 * Create a new MockRequestDispatcher for the given URL.
+	 * @param url the URL to dispatch to.
+	 */
+	public MockRequestDispatcher(String url) {
+		this.url = url;
+	}
+
+
+	public void forward(ServletRequest request, ServletResponse response) {
+		if (response.isCommitted()) {
+			throw new IllegalStateException("Cannot perform forward - response is already committed");
+		}
+		getMockHttpServletResponse(response).setForwardedUrl(this.url);
+		if (logger.isDebugEnabled()) {
+			logger.debug("MockRequestDispatcher: forwarding to URL [" + this.url + "]");
+		}
+	}
+
+	public void include(ServletRequest request, ServletResponse response) {
+		getMockHttpServletResponse(response).setIncludedUrl(this.url);
+		if (logger.isDebugEnabled()) {
+			logger.debug("MockRequestDispatcher: including URL [" + this.url + "]");
+		}
+	}
+
+	/**
+	 * Obtain the underlying MockHttpServletResponse,
+	 * unwrapping {@link HttpServletResponseWrapper} decorators if necessary.
+	 */
+	protected MockHttpServletResponse getMockHttpServletResponse(ServletResponse response) {
+		if (response instanceof MockHttpServletResponse) {
+			return (MockHttpServletResponse) response;
+		}
+		if (response instanceof HttpServletResponseWrapper) {
+			return getMockHttpServletResponse(((HttpServletResponseWrapper) response).getResponse());
+		}
+		throw new IllegalArgumentException("MockRequestDispatcher requires MockHttpServletResponse");
+	}
+
+}
\ No newline at end of file

Added: trunk/examples/restbay/src/org/jboss/seam/example/restbay/test/fwk/ResourceSeamTest.java
===================================================================
--- trunk/examples/restbay/src/org/jboss/seam/example/restbay/test/fwk/ResourceSeamTest.java	                        (rev 0)
+++ trunk/examples/restbay/src/org/jboss/seam/example/restbay/test/fwk/ResourceSeamTest.java	2009-03-26 07:42:18 UTC (rev 10215)
@@ -0,0 +1,179 @@
+package org.jboss.seam.example.restbay.test.fwk;
+
+import org.jboss.seam.mock.SeamTest;
+import org.jboss.seam.servlet.SeamResourceServlet;
+import org.testng.annotations.BeforeClass;
+
+import javax.servlet.*;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.Cookie;
+import java.util.*;
+import java.io.IOException;
+import java.security.Principal;
+
+/**
+ * @author Christian Bauer
+ */
+public class ResourceSeamTest extends SeamTest
+{
+
+   public enum Method
+   {
+      GET, PUT, POST, DELETE, HEAD, OPTIONS
+   }
+
+   protected SeamResourceServlet resourceServlet;
+
+   @BeforeClass
+   public void initResourceServlet() throws Exception
+   {
+      resourceServlet = new SeamResourceServlet();
+      resourceServlet.init(
+            new ServletConfig()
+            {
+               public String getServletName()
+               {
+                  return "Seam Resource Servlet";
+               }
+
+               public ServletContext getServletContext()
+               {
+                  return servletContext;
+               }
+
+               public String getInitParameter(String s)
+               {
+                  return null;
+               }
+
+               public Enumeration getInitParameterNames()
+               {
+                  return null;
+               }
+            }
+      );
+
+   }
+
+   public abstract class ResourceRequest
+   {
+
+      private Method httpMethod;
+      private String requestPath;
+      private MockHttpServletRequest request;
+      private MockHttpServletResponse response;
+
+      protected ResourceRequest(Method httpMethod, String requestPath)
+      {
+         this.httpMethod = httpMethod;
+         this.requestPath = getServletPath() + (requestPath.startsWith("/") ? requestPath : "/" + requestPath);
+      }
+
+      public void run() throws Exception
+      {
+         init();
+         prepareRequest(request);
+         seamFilter.doFilter(request, response, new FilterChain()
+         {
+            public void doFilter(ServletRequest request, ServletResponse response) throws IOException, ServletException
+            {
+               resourceServlet.service(request, response);
+            }
+         });
+         seamFilter.destroy();
+         onResponse(getResponse());
+      }
+
+      protected void init()
+      {
+         request = createRequest();
+         response = createResponse();
+
+         request.setMethod(httpMethod.toString());
+         request.setRequestURI(requestPath);
+
+         request.setServletPath(getServletPath());
+
+         request.setCookies(getCookies().toArray(new Cookie[getCookies().size()]));
+
+         for (Map.Entry<String, Object> entry : getDefaultHeaders().entrySet())
+         {
+            request.addHeader(entry.getKey(), entry.getValue());
+         }
+
+         request.setUserPrincipal(
+               new Principal()
+               {
+                  public String getName()
+                  {
+                     return getPrincipalName();
+                  }
+               }
+         );
+         for (String role : getPrincipalRoles())
+         {
+            request.addUserRole(role);
+         }
+
+      }
+
+      protected MockHttpServletRequest createRequest()
+      {
+         return new MockHttpServletRequest();
+      }
+
+      protected MockHttpServletResponse createResponse()
+      {
+         return new MockHttpServletResponse();
+      }
+
+      protected Map<String, String> getRequestQueryParameters()
+      {
+         return Collections.EMPTY_MAP;
+      }
+
+      protected List<Cookie> getCookies()
+      {
+         return Collections.EMPTY_LIST;
+      }
+
+      protected String getPrincipalName()
+      {
+         return null;
+      }
+
+      protected Set<String> getPrincipalRoles()
+      {
+         return Collections.EMPTY_SET;
+      }
+
+      protected void prepareRequest(MockHttpServletRequest request)
+      {
+      }
+
+      protected void onResponse(MockHttpServletResponse response)
+      {
+      }
+
+      public HttpServletRequest getRequest()
+      {
+         return request;
+      }
+
+      public MockHttpServletResponse getResponse()
+      {
+         return response;
+      }
+
+   }
+
+   public String getServletPath()
+   {
+      return "/seam/resource";
+   }
+
+   public Map<String, Object> getDefaultHeaders() {
+      return Collections.EMPTY_MAP;
+   }
+
+}

Added: trunk/examples/restbay/src/org/jboss/seam/example/restbay/test/testng.xml
===================================================================
--- trunk/examples/restbay/src/org/jboss/seam/example/restbay/test/testng.xml	                        (rev 0)
+++ trunk/examples/restbay/src/org/jboss/seam/example/restbay/test/testng.xml	2009-03-26 07:42:18 UTC (rev 10215)
@@ -0,0 +1,17 @@
+<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" >
+
+<suite name="RestBay" verbose="2" parallel="false">
+
+    <test name="RestBay: Basic Services">
+        <classes>
+            <class name="org.jboss.seam.example.restbay.test.BasicServiceTest"/>
+        </classes>
+    </test>
+
+    <test name="RestBay: Auction Services">
+      <classes>
+        <class name="org.jboss.seam.example.restbay.test.AuctionServiceTest"/>
+      </classes>
+    </test>
+
+</suite>
\ No newline at end of file

Added: trunk/examples/restbay/view/index.html
===================================================================
--- trunk/examples/restbay/view/index.html	                        (rev 0)
+++ trunk/examples/restbay/view/index.html	2009-03-26 07:42:18 UTC (rev 10215)
@@ -0,0 +1,31 @@
+<html>
+<head>
+    <title>restBay Seam example</title>
+</head>
+
+<body>
+
+<p>This application does not have a human-user interface. Execute 'ant test' to run the unit tests
+and explore the source code.</p>
+
+<p>
+You can invoke some of the RESTful webservices directly in your browser though:
+</p>
+
+<ul>
+    <li>
+        <a href="http://localhost:8080/rest-bay/seam/resource/restv1/auction">GET /auction</a>
+    </li>
+    <li>
+        <a href="http://localhost:8080/rest-bay/seam/resource/restv1/auction/19264723">GET /auction/{auctionId}</a>
+    </li>
+    <li>
+        <a href="http://localhost:8080/rest-bay/seam/resource/restv1/category">GET /category/</a>
+    </li>
+    <li>
+        <a href="http://localhost:8080/rest-bay/seam/resource/restv1/category/4">GET /category/{categoryId}</a>
+    </li>
+</ul>
+
+</body>
+</html>
\ No newline at end of file

Modified: trunk/src/main/org/jboss/seam/mock/AbstractSeamTest.java
===================================================================
--- trunk/src/main/org/jboss/seam/mock/AbstractSeamTest.java	2009-03-25 21:32:34 UTC (rev 10214)
+++ trunk/src/main/org/jboss/seam/mock/AbstractSeamTest.java	2009-03-26 07:42:18 UTC (rev 10215)
@@ -73,11 +73,11 @@
 
    private Application application;
    private ApplicationFactory applicationFactory;
-   private ServletContext servletContext;
+   protected ServletContext servletContext;
    private static SeamPhaseListener phases;
-   private MockHttpSession session;
+   protected MockHttpSession session;
    private Map<String, Map> conversationViewRootAttributes;
-   private Filter seamFilter;
+   protected Filter seamFilter;
    
    static 
    {




More information about the seam-commits mailing list