From users-return-26575-apmail-activemq-users-archive=activemq.apache.org@activemq.apache.org Wed Jan 26 15:47:38 2011 Return-Path: Delivered-To: apmail-activemq-users-archive@www.apache.org Received: (qmail 65907 invoked from network); 26 Jan 2011 15:47:37 -0000 Received: from hermes.apache.org (HELO mail.apache.org) (140.211.11.3) by minotaur.apache.org with SMTP; 26 Jan 2011 15:47:37 -0000 Received: (qmail 19776 invoked by uid 500); 26 Jan 2011 15:47:37 -0000 Delivered-To: apmail-activemq-users-archive@activemq.apache.org Received: (qmail 19480 invoked by uid 500); 26 Jan 2011 15:47:35 -0000 Mailing-List: contact users-help@activemq.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: users@activemq.apache.org Delivered-To: mailing list users@activemq.apache.org Received: (qmail 19467 invoked by uid 99); 26 Jan 2011 15:47:34 -0000 Received: from athena.apache.org (HELO athena.apache.org) (140.211.11.136) by apache.org (qpsmtpd/0.29) with ESMTP; Wed, 26 Jan 2011 15:47:34 +0000 X-ASF-Spam-Status: No, hits=0.0 required=10.0 tests= X-Spam-Check-By: apache.org Received-SPF: pass (athena.apache.org: domain of david.delbecq@oma.be designates 193.190.231.70 as permitted sender) Received: from [193.190.231.70] (HELO bonnie2.oma.be) (193.190.231.70) by apache.org (qpsmtpd/0.29) with ESMTP; Wed, 26 Jan 2011 15:47:33 +0000 Received: from bonnie2.oma.be (localhost [127.0.0.1]) by bonnie2.oma.be (8.13.6/8.11.1) with ESMTP id p0QFlAMa019783 for ; Wed, 26 Jan 2011 15:47:10 GMT Received: from [192.168.15.40] (cal-12.oma.be [192.168.15.40]) by bonnie2.oma.be (8.13.6/8.13.6/SuSE Linux 0.8) with ESMTP id p0QFlAYZ019780 for ; Wed, 26 Jan 2011 15:47:10 GMT Message-ID: <4D40417F.2010009@oma.be> Date: Wed, 26 Jan 2011 16:45:03 +0100 From: David Delbecq User-Agent: Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.2.13) Gecko/20101208 Lightning/1.0b2 Thunderbird/3.1.7 MIME-Version: 1.0 To: ActiveMQ Users Subject: ActiveMQInputStream recommanded usage? Content-Type: multipart/signed; protocol="application/pkcs7-signature"; micalg=sha1; boundary="------------ms030603000305010601000606" --------------ms030603000305010601000606 Content-Type: multipart/alternative; boundary="------------050405010909070208020806" This is a multi-part message in MIME format. --------------050405010909070208020806 Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: quoted-printable Hello, i am in the following situation. Several activemq client will send big=20 file. I made a simple unittest using ActiveMQInput/OutputStream, 10=20 threads sending a 100M file and one thread reading one file at a time. if i store the 10 files sequentially, no troubles if i send files in parallel and use the selector to distinguish between = files, ActiveMQInputStream lock after receiving 1.8M. I understand this=20 is because of queue page size and the selector applies only to message=20 in first page. So packet from 9 other files prevent inputstream from=20 receiving the rest of first file. So i created 1 queue per file instead. However, it exhibits same=20 behaviour. Looks like all my queues are sharing the same kahaDB page? So what is the proper way to send big files over activemq without having = files blocking each other? Is it possible, when i create my new queue=20 for the file, that i specify it has it's own page? We can not afford to=20 read all files in parallel! If usefull, see below the code used for the test. Thanks in advance for=20 any information you could have. import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.util.HashMap; import javax.jms.DeliveryMode; import javax.jms.JMSException; import javax.jms.Queue; import javax.jms.QueueSession; import javax.jms.Session; import org.apache.activemq.ActiveMQConnection; import org.apache.commons.io.IOUtils; import org.testng.Assert; import org.testng.annotations.AfterTest; import org.testng.annotations.Test; public class activeMQMassiveSendFilesTest { TestingConfigurator configurator; @AfterTest public void clean() { configurator.cleanup(); } @Test public void massiveTest() throws Exception { configurator =3D new TestingConfigurator(); configurator.init(); String[] names =3D new String[] { "bla", "blabla", "blablabla", "444", "uuid123", "truc", "bidule", "machin", "alpha", "beta" }; Thread[] t =3D new Thread[10]; class enqueuer extends Thread { private String id; public enqueuer(String id) { this.id =3D id; } @Override public void run() { // TODO Auto-generated method stub try { enqueueBigMessageContent(id, new MassiveInputStream( 1024 * 1024 * 100));// 100m file } catch (JMSException e) { e.printStackTrace(); } } } for (int i =3D 0; i < 10; i++) t[i] =3D new enqueuer(names[i]); for (int i =3D 0; i < 10; i++) t[i].start(); for (int i =3D 0; i < 10; i++) t[i].join(); for (String name : names) { Assert.assertTrue(dequeueBigMessageContent(name)); } } private boolean dequeueBigMessageContent(String name) throws JMSException { ActiveMQConnection connection =3D (ActiveMQConnection) configurator.connectionFactory .createConnection(); connection.start(); QueueSession queueSession =3D connection.createQueueSession(false, Session.AUTO_ACKNOWLEDGE); String queueName =3D configurator.testQueue+"."+name; System.out.println("reading from "+queueName); Queue destination =3D queueSession.createQueue(queueName); InputStream is =3D connection.createInputStream(destination)= ; int read=3D0; int count =3D 0; boolean ok=3Dtrue; try { while ((read=3Dis.read())>=3D0){ ok=3Dok & ( ((count++)&0xFF)=3D=3Dread); if (count%(1024*1024)=3D=3D0) System.out.println((count/1024/1024)+"M read"); } is.close(); } catch (IOException e) { e.printStackTrace(); } System.out.println("read "+(((float)count)/1024.0/1024.0)+"M elements from stream"); return ok; } private void enqueueBigMessageContent(final String uid, InputStream source) throws JMSException { HashMap map =3D new HashMap(= ); map.put("fileuid", uid); // init map message ActiveMQConnection connection =3D (ActiveMQConnection) configurator.connectionFactory .createConnection(); connection.start(); QueueSession queueSession =3D connection.createQueueSession(false, Session.AUTO_ACKNOWLEDGE); String queueName =3D configurator.testQueue+"."+uid; System.out.println("writing to "+queueName); Queue destination =3D queueSession.createQueue(queueName); OutputStream os =3D connection.createOutputStream(destination, map, DeliveryMode.PERSISTENT, 4, 0); try { System.out.println("start enqueuing " + uid); IOUtils.copy(source, os); os.close(); System.out.println("done enqueuing " + uid); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } connection.close(); System.out.println("connection closed for " + uid); } private static class MassiveInputStream extends InputStream { private long size; private long current; public MassiveInputStream(long size) { this.size =3D size; } @Override public int read() throws IOException { if (current > size) return -1; return (int) ((current++) & 0xFF); } } } --=20 David Delbecq ICT Institut Royal M=C3=A9t=C3=A9orologique Ext:557 --------------050405010909070208020806 Content-Type: text/html; charset=UTF-8 Content-Transfer-Encoding: quoted-printable Hello,

i am in the following situation. Several activemq client will send big file. I made a simple unittest using ActiveMQInput/OutputStream, 10 threads sending a 100M file and one thread reading one file at a time.

if i store the 10 files sequentially, no troubles
if i send files in parallel and=C2=A0 use the selector to distinguish= between files, ActiveMQInputStream lock after receiving 1.8M. I understand this is because of queue page size and the selector applies only to message in first page. So packet from 9 other files prevent inputstream from receiving the rest of first file.

So i created 1 queue per file instead. However, it exhibits same behaviour. Looks like all my queues are sharing the same kahaDB page?

So what is the proper way to send big files over activemq without having files blocking each other? Is it possible, when i create my new queue for the file, that i specify it has it's own page? We can not afford to read all files in parallel!

If usefull, see below the code used for the test. Thanks in advance for any information you could have.


import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.HashMap;

import javax.jms.DeliveryMode;
import javax.jms.JMSException;
import javax.jms.Queue;
import javax.jms.QueueSession;
import javax.jms.Session;

import org.apache.activemq.ActiveMQConnection;
import org.apache.commons.io.IOUtils;
import org.testng.Assert;
import org.testng.annotations.AfterTest;
import org.testng.annotations.Test;

public class activeMQMassiveSendFilesTest {
=C2=A0=C2=A0=C2=A0 TestingConfigurator configurator;

=C2=A0=C2=A0=C2=A0 @AfterTest
=C2=A0=C2=A0=C2=A0 public void clean() {
=C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 configurator.cleanup();
=C2=A0=C2=A0=C2=A0 }

=C2=A0=C2=A0=C2=A0 @Test
=C2=A0=C2=A0=C2=A0 public void massiveTest() throws Exception {=
=C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 configurator =3D new Test= ingConfigurator();
=C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 configurator.init();=
=C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 String[] names =3D new St= ring[] { "bla", "blabla", "blablabla", "444",
=C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 =C2=A0= =C2=A0=C2=A0 "uuid123", "truc", "bidule", "machin", "alpha", "beta" };
=C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 Thread[] t =3D new Thread= [10];
=C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 class enqueuer extends Th= read {
=C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 privat= e String id;

=C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 public= enqueuer(String id) {
=C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 =C2=A0= =C2=A0=C2=A0 this.id =3D id;
=C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 }=

=C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 @Overr= ide
=C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 public= void run() {
=C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 =C2=A0= =C2=A0=C2=A0 // TODO Auto-generated method stub
=C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 =C2=A0= =C2=A0=C2=A0 try {
=C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 =C2=A0= =C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 enqueueBigMessageContent(id, new MassiveInputStream(
=C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 =C2=A0= =C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 102= 4 * 1024 * 100));// 100m file
=C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 =C2=A0= =C2=A0=C2=A0 } catch (JMSException e) {
=C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 =C2=A0= =C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 e.printStackTrace();
=C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 =C2=A0= =C2=A0=C2=A0 }
=C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 }=
=C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 }
=C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 for (int i =3D 0; i < = 10; i++)
=C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 t[i] =3D= new enqueuer(names[i]);

=C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 for (int i =3D 0; i < = 10; i++)
=C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 t[i].s= tart();

=C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 for (int i =3D 0; i < = 10; i++)
=C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 t[i].j= oin();
=C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 for (String name : names)= {
=C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 Assert= =2EassertTrue(dequeueBigMessageContent(name));
=C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 }
=C2=A0=C2=A0=C2=A0 }

=C2=A0=C2=A0=C2=A0 private boolean dequeueBigMessageContent(Str= ing name) throws JMSException {
=C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 ActiveMQConnection connec= tion =3D (ActiveMQConnection) configurator.connectionFactory
=C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 =C2=A0= =C2=A0=C2=A0 .createConnection();
=C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 connection.start();<= br> =C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 QueueSession queueSession= =3D connection.createQueueSession(false,
=C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 =C2=A0= =C2=A0=C2=A0 Session.AUTO_ACKNOWLEDGE);
=C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 String queueName =3D conf= igurator.testQueue+"."+name;
=C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 System.out.println("readi= ng from "+queueName);
=C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 Queue destination =3D queueSession.createQueue(queueName);
=C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 InputStream is =3D connection.createInputStream(destination);
=C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 int read=3D0;
=C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 int count =3D 0;
= =C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 boolean ok=3Dtrue; =C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 try {
=C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 while = ((read=3Dis.read())>=3D0){
=C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 =C2=A0= =C2=A0=C2=A0 ok=3Dok & ( ((count++)&0xFF)=3D=3Dread);=C2=A0=C2=A0= =C2=A0
=C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 =C2=A0= =C2=A0=C2=A0 if (count%(1024*1024)=3D=3D0)
=C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 =C2=A0= =C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 System.out.println((count/1024/1024)+"M read");
=C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 }=
=C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 is.clo= se();
=C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 } catch (IOException e) {=
=C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 e.prin= tStackTrace();
=C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 }
=C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 System.out.println("read "+(((float)count)/1024.0/1024.0)+"M elements from stream");<= br> =C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 return ok;
=C2=A0=C2=A0=C2=A0 }

=C2=A0=C2=A0=C2=A0 private void enqueueBigMessageContent(final = String uid, InputStream source)
=C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 throws= JMSException {
=C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 HashMap<String, Object= > map =3D new HashMap<String, Object>();
=C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 map.put("fileuid", uid);<= /tt>
=C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 // init map message<= br> =C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 ActiveMQConnection connec= tion =3D (ActiveMQConnection) configurator.connectionFactory
=C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 =C2=A0= =C2=A0=C2=A0 .createConnection();
=C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 connection.start();<= br> =C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 QueueSession queueSession= =3D connection.createQueueSession(false,
=C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 =C2=A0= =C2=A0=C2=A0 Session.AUTO_ACKNOWLEDGE);

=C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 String queueName =3D conf= igurator.testQueue+"."+uid;
=C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 System.out.println("writi= ng to "+queueName);
=C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 Queue destination =3D queueSession.createQueue(queueName);
=C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 OutputStream os =3D connection.createOutputStream(destination, map,
=C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 =C2=A0= =C2=A0=C2=A0 DeliveryMode.PERSISTENT, 4, 0);
=C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 try {
=C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 System= =2Eout.println("start enqueuing " + uid);
=C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 IOUtil= s.copy(source, os);
=C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 os.clo= se();
=C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 System= =2Eout.println("done enqueuing " + uid);
=C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 } catch (IOException e) {=
=C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 // TOD= O Auto-generated catch block
=C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 e.prin= tStackTrace();
=C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 }
=C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 connection.close();<= br> =C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 System.out.println("conne= ction closed for " + uid);
=C2=A0=C2=A0=C2=A0 }

=C2=A0=C2=A0=C2=A0 private static class MassiveInputStream exte= nds InputStream {
=C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 private long size; =C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 private long current;

=C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 public MassiveInputStream= (long size) {
=C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 this.s= ize =3D size;
=C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 }

=C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 @Override
=C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 public int read() throws = IOException {
=C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 if (cu= rrent > size)
=C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 =C2=A0= =C2=A0=C2=A0 return -1;
=C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 return= (int) ((current++) & 0xFF);
=C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 }
=C2=A0=C2=A0=C2=A0 }
}

--=20
David Delbecq
ICT
Institut Royal M=C3=A9t=C3=A9orologique
Ext:557
--------------050405010909070208020806-- --------------ms030603000305010601000606 Content-Type: application/pkcs7-signature; name="smime.p7s" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="smime.p7s" Content-Description: S/MIME Cryptographic Signature MIAGCSqGSIb3DQEHAqCAMIACAQExCzAJBgUrDgMCGgUAMIAGCSqGSIb3DQEHAQAAoIIQ9jCC BIowggNyoAMCAQICECf06hH0eobEbp27bqkXBwcwDQYJKoZIhvcNAQEFBQAwbzELMAkGA1UE BhMCU0UxFDASBgNVBAoTC0FkZFRydXN0IEFCMSYwJAYDVQQLEx1BZGRUcnVzdCBFeHRlcm5h bCBUVFAgTmV0d29yazEiMCAGA1UEAxMZQWRkVHJ1c3QgRXh0ZXJuYWwgQ0EgUm9vdDAeFw0w NTA2MDcwODA5MTBaFw0yMDA1MzAxMDQ4MzhaMIGuMQswCQYDVQQGEwJVUzELMAkGA1UECBMC VVQxFzAVBgNVBAcTDlNhbHQgTGFrZSBDaXR5MR4wHAYDVQQKExVUaGUgVVNFUlRSVVNUIE5l dHdvcmsxITAfBgNVBAsTGGh0dHA6Ly93d3cudXNlcnRydXN0LmNvbTE2MDQGA1UEAxMtVVRO LVVTRVJGaXJzdC1DbGllbnQgQXV0aGVudGljYXRpb24gYW5kIEVtYWlsMIIBIjANBgkqhkiG 9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsjmFpPJ9q0E7YkY3rs3BYHW8OWX5ShpHornMSMxqmNVN NRm5pELlzkniii8efNIxB8dOtINknS4p1aJkxIW9hVE1eaROaJB7HHqkkqgX8pgV8pPMyaQy lbsMTzC9mKALi+VuG6JG+ni8om+rWV6lL8/K2m2qL+usobNqqrcuZzWLeeEeaYji5kbNoKXq vgvOdjp6Dpvq/NonWz1zHyLmSGHGTPNpsaguG7bUMSAsvIKKjqQOpdeJQ/wWWq8dcdcRWdq6 hw2v+vPhwvCkxWeM1tZUOt4KpLoDd7NlyP0e03RiqhjKaJMeoYV+9Udly/hNVyh00jT/MLbu 9mIwFIws6wIDAQABo4HhMIHeMB8GA1UdIwQYMBaAFK29mHo0tCb3+sQmVO8DveAky1QaMB0G A1UdDgQWBBSJgmd9xJ0mcABLtFBIfN49rgRufTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/ BAUwAwEB/zB7BgNVHR8EdDByMDigNqA0hjJodHRwOi8vY3JsLmNvbW9kb2NhLmNvbS9BZGRU cnVzdEV4dGVybmFsQ0FSb290LmNybDA2oDSgMoYwaHR0cDovL2NybC5jb21vZG8ubmV0L0Fk ZFRydXN0RXh0ZXJuYWxDQVJvb3QuY3JsMA0GCSqGSIb3DQEBBQUAA4IBAQAZ2IkRbyispgCi 54fBm5AD236hEv0e8+LwAamUVEJrmgnEoG3XkJIEA2Z5Q3H8+G+v23ZF4jcaPd3kWQR4rBz0 g0bzes9bhHIt5UbBuhgRKfPLSXmHPLptBZ2kbWhPrXIUNqi5sf2/z3/wpGqUNVCPz4FtVbHd WTBK322gnGQfSXzvNrv042n0+DmPWq1LhTq3Du3Tzw1EovsEv+QvcI4l+1pUBrPQxLxtjftz Mizpm4QkLdZ/kXpoAlAfDj9N6cz1u2fo3BwuO/xOzf4CjuOoEwqlJkRl6RDyTVKnrtw+ymsy XEFs/vVdoOr/0fqbhlhtPZZH5f4ulQTCAMyOofK7MIIGMDCCBRigAwIBAgIRAPahsPx1/sHL s4hgB6tfPmIwDQYJKoZIhvcNAQEFBQAwga4xCzAJBgNVBAYTAlVTMQswCQYDVQQIEwJVVDEX MBUGA1UEBxMOU2FsdCBMYWtlIENpdHkxHjAcBgNVBAoTFVRoZSBVU0VSVFJVU1QgTmV0d29y azEhMB8GA1UECxMYaHR0cDovL3d3dy51c2VydHJ1c3QuY29tMTYwNAYDVQQDEy1VVE4tVVNF UkZpcnN0LUNsaWVudCBBdXRoZW50aWNhdGlvbiBhbmQgRW1haWwwHhcNMTAwNjA3MDAwMDAw WhcNMTEwNjA3MjM1OTU5WjCB3TE1MDMGA1UECxMsQ29tb2RvIFRydXN0IE5ldHdvcmsgLSBQ RVJTT05BIE5PVCBWQUxJREFURUQxRjBEBgNVBAsTPVRlcm1zIGFuZCBDb25kaXRpb25zIG9m IHVzZTogaHR0cDovL3d3dy5jb21vZG8ubmV0L3JlcG9zaXRvcnkxHzAdBgNVBAsTFihjKTIw MDMgQ29tb2RvIExpbWl0ZWQxFjAUBgNVBAMTDURhdmlkIERlbGJlY3ExIzAhBgkqhkiG9w0B CQEWFGRhdmlkLmRlbGJlY3FAb21hLmJlMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC AQEAwfHE7IYsrjXpCS2/FJckqDpCvfjF4sYkktSPFZdyxScd6qj0Z0F2x+kPEHzuBwVifoZX e944qGI31kJcDl4OZsQKhjJUB5mh7xCv8rvfCxUJKBA8J5xiRh7oPcxLpezkJbPFZv/UO3Qf u8cbrYhSCIV7jUi8KzD0CflzM2EdD5riLELVtblGhSCOhBUV2yl74fTTgnUtYiQXBRP+EPHs HO9HSIM7AtkwRVAzEsr7t6GUJjYPIKjsGWhRxdCyRX3cZZvNEOwk7Ujb+Qym8meg6feyUFZ8 UafW3ecp1I/2cMKUsZnvzlhdAuHbRc7NPE7LmaJWhoB77EeOWJ76TpbDowIDAQABo4ICFjCC AhIwHwYDVR0jBBgwFoAUiYJnfcSdJnAAS7RQSHzePa4Ebn0wHQYDVR0OBBYEFOwxQRT5Cm9c m+gqTk92kg1Bqfq+MA4GA1UdDwEB/wQEAwIFoDAMBgNVHRMBAf8EAjAAMCAGA1UdJQQZMBcG CCsGAQUFBwMEBgsrBgEEAbIxAQMFAjARBglghkgBhvhCAQEEBAMCBSAwRgYDVR0gBD8wPTA7 BgwrBgEEAbIxAQIBAQEwKzApBggrBgEFBQcCARYdaHR0cHM6Ly9zZWN1cmUuY29tb2RvLm5l dC9DUFMwgaUGA1UdHwSBnTCBmjBMoEqgSIZGaHR0cDovL2NybC5jb21vZG9jYS5jb20vVVRO LVVTRVJGaXJzdC1DbGllbnRBdXRoZW50aWNhdGlvbmFuZEVtYWlsLmNybDBKoEigRoZEaHR0 cDovL2NybC5jb21vZG8ubmV0L1VUTi1VU0VSRmlyc3QtQ2xpZW50QXV0aGVudGljYXRpb25h bmRFbWFpbC5jcmwwbAYIKwYBBQUHAQEEYDBeMDYGCCsGAQUFBzAChipodHRwOi8vY3J0LmNv bW9kb2NhLmNvbS9VVE5BQUFDbGllbnRDQS5jcnQwJAYIKwYBBQUHMAGGGGh0dHA6Ly9vY3Nw LmNvbW9kb2NhLmNvbTAfBgNVHREEGDAWgRRkYXZpZC5kZWxiZWNxQG9tYS5iZTANBgkqhkiG 9w0BAQUFAAOCAQEAaM2juZzJrhTZuFl/LNqOn1fbStud8tBYyRz47qqGyqwXWRv/x6jtTdIz 0/kdjGfOqYlErV4vdHROtk6+CYpRJoLf+ujjwyxyJjPuKHZVD6JzE3Cm/X1nP5CpE/3QyHs9 RpE4BKjNI+VUoBB2QqnsMsW26MwiT7XQ/UweA2jzpLhj6rz5BiLglAzYBHAeLlOGFY9ZokD3 1k/D0f8PGIQ4SCCYl/xPlfwBp+i3OICd4nVja20gHwiKYHYV5fQsdQzDvG0fiyqc3BVsIdT7 6V+iLvDkTCmtuPvlB8DyLaWrHlf6H+jv/b8QXGB2ADFJxjW/3nWH2EMOHcM2A2Fzv8wylDCC BjAwggUYoAMCAQICEQD2obD8df7By7OIYAerXz5iMA0GCSqGSIb3DQEBBQUAMIGuMQswCQYD VQQGEwJVUzELMAkGA1UECBMCVVQxFzAVBgNVBAcTDlNhbHQgTGFrZSBDaXR5MR4wHAYDVQQK ExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxITAfBgNVBAsTGGh0dHA6Ly93d3cudXNlcnRydXN0 LmNvbTE2MDQGA1UEAxMtVVROLVVTRVJGaXJzdC1DbGllbnQgQXV0aGVudGljYXRpb24gYW5k IEVtYWlsMB4XDTEwMDYwNzAwMDAwMFoXDTExMDYwNzIzNTk1OVowgd0xNTAzBgNVBAsTLENv bW9kbyBUcnVzdCBOZXR3b3JrIC0gUEVSU09OQSBOT1QgVkFMSURBVEVEMUYwRAYDVQQLEz1U ZXJtcyBhbmQgQ29uZGl0aW9ucyBvZiB1c2U6IGh0dHA6Ly93d3cuY29tb2RvLm5ldC9yZXBv c2l0b3J5MR8wHQYDVQQLExYoYykyMDAzIENvbW9kbyBMaW1pdGVkMRYwFAYDVQQDEw1EYXZp ZCBEZWxiZWNxMSMwIQYJKoZIhvcNAQkBFhRkYXZpZC5kZWxiZWNxQG9tYS5iZTCCASIwDQYJ KoZIhvcNAQEBBQADggEPADCCAQoCggEBAMHxxOyGLK416QktvxSXJKg6Qr34xeLGJJLUjxWX csUnHeqo9GdBdsfpDxB87gcFYn6GV3veOKhiN9ZCXA5eDmbECoYyVAeZoe8Qr/K73wsVCSgQ PCecYkYe6D3MS6Xs5CWzxWb/1Dt0H7vHG62IUgiFe41IvCsw9An5czNhHQ+a4ixC1bW5RoUg joQVFdspe+H004J1LWIkFwUT/hDx7BzvR0iDOwLZMEVQMxLK+7ehlCY2DyCo7BloUcXQskV9 3GWbzRDsJO1I2/kMpvJnoOn3slBWfFGn1t3nKdSP9nDClLGZ785YXQLh20XOzTxOy5miVoaA e+xHjlie+k6Ww6MCAwEAAaOCAhYwggISMB8GA1UdIwQYMBaAFImCZ33EnSZwAEu0UEh83j2u BG59MB0GA1UdDgQWBBTsMUEU+QpvXJvoKk5PdpINQan6vjAOBgNVHQ8BAf8EBAMCBaAwDAYD VR0TAQH/BAIwADAgBgNVHSUEGTAXBggrBgEFBQcDBAYLKwYBBAGyMQEDBQIwEQYJYIZIAYb4 QgEBBAQDAgUgMEYGA1UdIAQ/MD0wOwYMKwYBBAGyMQECAQEBMCswKQYIKwYBBQUHAgEWHWh0 dHBzOi8vc2VjdXJlLmNvbW9kby5uZXQvQ1BTMIGlBgNVHR8EgZ0wgZowTKBKoEiGRmh0dHA6 Ly9jcmwuY29tb2RvY2EuY29tL1VUTi1VU0VSRmlyc3QtQ2xpZW50QXV0aGVudGljYXRpb25h bmRFbWFpbC5jcmwwSqBIoEaGRGh0dHA6Ly9jcmwuY29tb2RvLm5ldC9VVE4tVVNFUkZpcnN0 LUNsaWVudEF1dGhlbnRpY2F0aW9uYW5kRW1haWwuY3JsMGwGCCsGAQUFBwEBBGAwXjA2Bggr BgEFBQcwAoYqaHR0cDovL2NydC5jb21vZG9jYS5jb20vVVROQUFBQ2xpZW50Q0EuY3J0MCQG CCsGAQUFBzABhhhodHRwOi8vb2NzcC5jb21vZG9jYS5jb20wHwYDVR0RBBgwFoEUZGF2aWQu ZGVsYmVjcUBvbWEuYmUwDQYJKoZIhvcNAQEFBQADggEBAGjNo7mcya4U2bhZfyzajp9X20rb nfLQWMkc+O6qhsqsF1kb/8eo7U3SM9P5HYxnzqmJRK1eL3R0TrZOvgmKUSaC3/ro48MsciYz 7ih2VQ+icxNwpv19Zz+QqRP90Mh7PUaROASozSPlVKAQdkKp7DLFtujMIk+10P1MHgNo86S4 Y+q8+QYi4JQM2ARwHi5ThhWPWaJA99ZPw9H/DxiEOEggmJf8T5X8AafotziAneJ1Y2ttIB8I imB2FeX0LHUMw7xtH4sqnNwVbCHU++lfoi7w5Ewprbj75QfA8i2lqx5X+h/o7/2/EFxgdgAx ScY1v951h9hDDh3DNgNhc7/MMpQxggRgMIIEXAIBATCBxDCBrjELMAkGA1UEBhMCVVMxCzAJ BgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2UgQ2l0eTEeMBwGA1UEChMVVGhlIFVTRVJU UlVTVCBOZXR3b3JrMSEwHwYDVQQLExhodHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xNjA0BgNV BAMTLVVUTi1VU0VSRmlyc3QtQ2xpZW50IEF1dGhlbnRpY2F0aW9uIGFuZCBFbWFpbAIRAPah sPx1/sHLs4hgB6tfPmIwCQYFKw4DAhoFAKCCAnAwGAYJKoZIhvcNAQkDMQsGCSqGSIb3DQEH ATAcBgkqhkiG9w0BCQUxDxcNMTEwMTI2MTU0NTAzWjAjBgkqhkiG9w0BCQQxFgQULo4P4br3 MTLebi6NENwit0oOTYYwXwYJKoZIhvcNAQkPMVIwUDALBglghkgBZQMEAQIwCgYIKoZIhvcN AwcwDgYIKoZIhvcNAwICAgCAMA0GCCqGSIb3DQMCAgFAMAcGBSsOAwIHMA0GCCqGSIb3DQMC AgEoMIHVBgkrBgEEAYI3EAQxgccwgcQwga4xCzAJBgNVBAYTAlVTMQswCQYDVQQIEwJVVDEX MBUGA1UEBxMOU2FsdCBMYWtlIENpdHkxHjAcBgNVBAoTFVRoZSBVU0VSVFJVU1QgTmV0d29y azEhMB8GA1UECxMYaHR0cDovL3d3dy51c2VydHJ1c3QuY29tMTYwNAYDVQQDEy1VVE4tVVNF UkZpcnN0LUNsaWVudCBBdXRoZW50aWNhdGlvbiBhbmQgRW1haWwCEQD2obD8df7By7OIYAer Xz5iMIHXBgsqhkiG9w0BCRACCzGBx6CBxDCBrjELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAlVU MRcwFQYDVQQHEw5TYWx0IExha2UgQ2l0eTEeMBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3 b3JrMSEwHwYDVQQLExhodHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xNjA0BgNVBAMTLVVUTi1V U0VSRmlyc3QtQ2xpZW50IEF1dGhlbnRpY2F0aW9uIGFuZCBFbWFpbAIRAPahsPx1/sHLs4hg B6tfPmIwDQYJKoZIhvcNAQEBBQAEggEATLr1qflqDifMCjH4BJAI5+LW4K8W1F/qC55n/aBM OBxS/L5U84eRdDH8E7fzp2WpDIZxvdsmV4e35qgow+BgwqD1pCLieCGgsA9CBycT+RnVt0dr V175S1Xow3tFixJTWTQdvkzxv0mM8BCDBPk9ef/qU56KM/CUnI8ogjNo7+DVIgMby15tg801 IUY3fWFEGi8osGDtUER7AZ1CRYZnf8Zd7Zuc6MEOvCaojWyFnGEH/gkzyd2KpE6Vbq6S7a3v lgKw0OuTq31GsDhmANQLhN/p0Z5//na2fx0WwRFvQcvpFp9dxlXo5fX0SeD77wGuej1j29z5 yVf2TVpUraMy7AAAAAAAAA== --------------ms030603000305010601000606--