From: Subject: Get Acquainted with the New Advanced Features of JUnit 4 Date: Fri, 28 Dec 2007 08:46:58 -0700 MIME-Version: 1.0 Content-Type: multipart/related; type="text/html"; boundary="----=_NextPart_000_0000_01C8492E.34CF6730" X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2900.3198 This is a multi-part message in MIME format. ------=_NextPart_000_0000_01C8492E.34CF6730 Content-Type: text/html; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable Content-Location: http://www.devx.com/Java/Article/31983/1954?pf=true Get Acquainted with the New Advanced Features of = JUnit 4
3D"DevX
 
http://www.devx.com/ Printed from http://www.devx.com/Java/= Article/31983
 
Get Acquainted with the New Advanced = Features of=20 JUnit 4

Learn how to migrate from JUnit 3.8 to = JUnit 4.=20 Discover version 4's new features, including extensive use of = annotations,=20 and find out the status on IDE integration. 
by Antonio Goncalves =
oes = anybody=20 need an introduction on JUnit? No? OK, so I'll assume that you = know this=20 Java = unit testing=20 framework created by Kent Beck and Erich Gamma and skip the=20 introduction. Instead I will focus on the migration process from = JUnit 3.8=20 to the latest version, JUnit 4, and its integration in IDEs and = Ant.=20

JUnit 4 is a completely different API from the versions that = came=20 before it and depends on new features of Java 5.0 (annotations, = static=20 import=85). As you'll see, JUnit 4 is simpler, richer, and easier to use and = introduces more=20 flexible initialization and cleanup, timeouts, and parameterized = test=20 cases.=20

Nothing beats a bit of code for clarification. I'll use an = example that=20 I can use to illustrate different test cases throughout the = article: a=20 calculator. The sample calculator is very simple, inefficient, and = even=20 has a few bugs; it only manipulates integers and stores the result = in a=20 static variable. Substract method does not return a valid result, = multiply=20 is not implemented yet, and it looks like there is a bug on the = squareRoot=20 method: It loops infinitely. These bugs will help illustrate the=20 efficiency of the tests in JUnit 4. You can switch this calculator = on and=20 off and you can clear the result. Here is the code:


package calc;

public class Calculator {

    private static int result;          // Static variable where the =
result is stored

    public void add(int n) {
        result =3D result + n;
    }

    public void substract(int n) {
        result =3D result - 1;          //Bug : should be result =3D =
result - n
    }

    public void multiply(int n) {}     //Not implemented yet

    public void divide(int n) {
        result =3D result / n;
    }

    public void square(int n) {
        result =3D n * n;
    }

    public void squareRoot(int n) {
        for (; ;) ;                    //Bug : loops indefinitely
    }

    public void clear() {               // Cleans the result
        result =3D 0;
    }

    public void switchOn() {          // Swith on the screen, display =
"hello", beep
        result =3D 0;                    // and do other things that =
calculator do nowadays
    }

    public void switchOff() { }	     // Display "bye bye", beep, switch =
off the screen

    public int getResult() {
        return result;
    }
}



Migrating a Test Class
Now I'll take a simple test = class=20 already written in JUnit 3.8 and migrate it to JUnit 4. This class = has=20 some flaws: It does not test all the business methods and it looks = like=20 there is a bug in the testDivide method (8/2 is not equal to 5). = Because=20 the implementation of multiply is not ready, its test is written = but=20 ignored.=20

The differences between the two frameworks are highlighted in = bold (see=20 Table 1).=20

Table 1. CaculatorTest in JUnit 3.8 and JUnit 4
JUnit 3.8 = JUnit 4 =
package junit3; 

import = calc.Calculator;
import junit.framework.TestCase; =




public class CalculatorTest extends TestCase = {

private static Calculator calculator =3D=20 new Calculator();

@Override
protected = void setUp() {
calculator.clear();
}


= public void testAdd() {
calculator.add(1);
= calculator.add(1);
assertEquals(calculator.getResult(), 2);
= }


public void testSubtract() {
= calculator.add(10);
calculator.subtract(2);
= assertEquals(calculator.getResult(), 8);
}


public = void testDivide() {
calculator.add(8);
= calculator.divide(2);
assert calculator.getResult() =3D=3D = 5;
}

public void testDivideByZero() {
try = {
calculator.divide(0);
fail();
} catch = (ArithmeticException e) {
}
}

public void = notReadyYetTestMultiply() {
calculator.add(10);
= calculator.multiply(10);
assertEquals(calculator.getResult(), = 100);
}
}
package junit4; 

import = calc.Calculator;
import org.junit.Before;
import = org.junit.Ignore;
import org.junit.Test;
import static = org.junit.Assert.*;

public class CalculatorTest {

= private static Calculator calculator =3D=20 new Calculator();

@Before
= public void clearCalculator() {
= calculator.clear();
}

@Test
public void = add() {
calculator.add(1);
calculator.add(1);
= assertEquals(calculator.getResult(), 2);
}

= @Test
public void subtract() {
= calculator.add(10);
calculator.subtract(2);
= assertEquals(calculator.getResult(), 8);
}

= @Test
public void divide() {
= calculator.add(8);
calculator.divide(2);
assert = calculator.getResult() =3D=3D 5;
}

@Test(expected =3D = ArithmeticException.class)
public void divideByZero() {
= calculator.divide(0);
}


@Ignore("not ready = yet")
@Test
public void multiply() {
= calculator.add(10);
calculator.multiply(10);
= assertEquals(calculator.getResult(), 100);
= }
}

Packages
First of all, you can see that JUnit 4 uses = org.junit.* package while JUnit 3.8 uses junit.framework.*. Of course, for backward = compatibility,=20 the JUnit 4 jar file ships with both packages.=20

Inheritance
Test classes do not have to extend junit.framework.TestCase anymore. In fact, they = don't have=20 to extend anything. JUnit 4 has decided to use annotations = instead. To be=20 executed as a test case, a JUnit 4 class needs at least one @Test=20 annotation. For example, if you write a class with only @Before = and @After=20 annotations without at least one @Test method, you will get an = error when=20 trying to execute it: java.lang.Exception: No = runnable=20 methods.=20

Assert Methods
Because in JUnit 4 a test class = doesn't=20 inherit from TestCase (where assertEquals() methods=20 are defined in JUnit 3.8), you have to use the prefixed syntax = (e.g. Assert.assertEquals()) or, thanks to JDK 5.0, = import=20 statically the Assert class. In doing so, you can then use assertEquals methods exactly the way you have = used them=20 previously (e.g. assertEquals ()).=20

There are two new assertion methods in JUnit 4. They are used = to=20 compare arrays of objects. Both arrays are equal if each element = they=20 contain is equal.


public static void assertEquals(String message, Object[] expecteds, =
Object[] actuals);
public static void assertEquals(Object[] expecteds, Object[] actuals);
Twelve assertEquals methods have totally disappeared thanks = to the autoboxing of the JDK 5.0. Methods such as = assertEquals(long, long)=20 in JUnit 3.8 use the assertEquals(Object, Object) in JUnit 4. It = is the=20 same for assertEquals(byte, byte), assertEquals(int, int), and so = on. This=20 will help prevent the antipattern "Using the Wrong Assert" (see http://www-128.ibm.com/developerworks/opensource/library/= os-junit/=20 and http://www.exubero.com/junit/antipatterns.html = ).=20

A novelty with JUnit 4 is the neat integration of the assert = keyword=20 (divide() method in our example). You can use it as you would use = the=20 assertEquals methods, because they both throw the same exception=20 (java.lang.AssertionError). JUnit 3.8 assertEquals would throw a=20 junit.framework.AssertionFailedError. Note that when using assert, = you=20 must specify the =96ea parameter to Java; if not, asserts are = ignored (see=20 "Programming with Asserts").=20

Fixture
Fixtures are methods to initialize and = release any=20 common objects during tests. In JUnit 3.8 you would use setUp() for initialization before running each = test and=20 then tearDown() for cleaning purposes = after each=20 test had completed. Both methods are overridden from the TestCase = class=20 and therefore are uniquely defined. Note that I'm using the Java = 5.0=20 built-in @Override annotation for the setup method=97this = annotation=20 indicates that the method declaration is intended to override the = method=20 declaration in a superclass. Instead, JUnit 4 uses @Before and = @After=20 annotations. These methods can be called by any name (clearCalculator() in our example). I'll explain = more about=20 these annotations later in the article.=20

Tests
JUnit 3.8 recognizes a test method by analyzing = its=20 signature: The method name has to be prefixed with 'test', it must = return=20 void, and it must have no parameters (e.g. public = void=20 testDivide()). A test method that doesn't follow this = naming=20 convention is simply ignored by the framework and no exception is = thrown,=20 indicating a mistake has been made.=20

JUnit 4 doesn't use the same conventions. A test method does = not have=20 to be prefixed with 'test' but instead uses the @Test annotation. = As in=20 the previous framework, a test method must return void and have no = parameters. With JUnit 4 this is controlled at runtime and throws = an=20 exception if not respected:


java.lang.Exception: Method xxx should have no parameters
java.lang.Exception: Method xxx should be void
The @Test annotation supports the optional expected=20 parameters. It declares that a test method should throw an = exception. If=20 it doesn't or if it throws a different exception than the one = declared,=20 the test fails. In our example, dividing an integer by zero should = raise=20 an ArithmeticException.=20

Ignoring a Test
Remember that the multiply method is = not=20 implemented. However, you don't want the test to fail, you just = want it=20 ignored. How do you temporarily disable a test with JUnit 3.8? By=20 commenting it or changing the naming conventions so that the = runner=20 doesn't find it. In my example I used the method name notReadyYetTestMultiply(). It doesn't start with = 'test' so=20 it won't be recognized. The problem is that in the middle of = thousands of=20 other tests, you might not remember to rename this method.=20

To ignore a test in JUnit 4 you can comment a method or delete = the=20 @Test annotation (you can't change the naming conventions anymore = or an=20 exception would be thrown). However, the problem will remain: The = runner=20 will not report such a test. You can now add the @Ignore = annotation in=20 front or after @Test. Test runners will report the number of = ignored=20 tests, along with the number of tests that ran and the number of = tests=20 that failed. Note that @Ignore takes an optional parameter (a = String) if=20 you want to record why a test is being ignored.=20

Running the Tests
In JUnit 3.8 you could choose from = several=20 runners: text, AWT, or Swing. JUnit 4 only uses text runners. = Remember the=20 tagline underneath the JUnit logo? "Keep the bar green to keep the = code=20 clean." Well, JUnit 4 will not display any green bar to inform you = that=20 your tests have succeeded. If you want to see any kind of green = you'll=20 need to use JUnit=20 extensions or an IDE that integrates JUnit such as IDEA or = Eclipse"=20

First, I want to run the JUnit 3.8 test class with the good old = junit.textui.TestRunner (with the =96ea = parameter to take=20 into account the assert keyword).


java -ea junit.textui.TestRunner junit3.CalculatorTest

..F.E.

There was 1 error:
1) testDivide(junit3.CalculatorTest)java.lang.AssertionError
        at junit3.CalculatorTest.testDivide(CalculatorTest.java:33)

There was 1 failure:
1) =
testSubtract(junit3.CalculatorTest)junit.framework.AssertionFailedError: =
expected:<9> but was:<8>
        at junit3.CalculatorTest.testSubtract(CalculatorTest.java:27)

FAILURES!!!
Tests run: 4,  Failures: 1,  Errors: 1
TestDivide produces an error because assert ensures that = 8/2=20 does not equal 5. TestSubstract produces a failure because 10-2 = should be=20 equal to 8 but there is a bug in the implementation and it returns = 9.=20

Now I'll run both classes with the new org.junit.runner.JUnitCore runner, which acts = like a=20 facade for running tests. It can execute JUnit 4 and JUnit 3.8 = tests as=20 well as a mixture of both.


java =96ea org.junit.runner.JUnitCore junit3.CalculatorTest
JUnit version 4.1

..E.E.

There were 2 failures:
1) testSubtract(junit3.CalculatorTest)
junit.framework.AssertionFailedError: expected:<9> but =
was:<8>
        at junit.framework.Assert.fail(Assert.java:47)
2) testDivide(junit3.CalculatorTest)
java.lang.AssertionError
        at junit3.CalculatorTest.testDivide(CalculatorTest.java:33)

FAILURES!!!
Tests run: 4,  Failures: 2
***

java =96ea org.junit.runner.JUnitCore junit4.CalculatorTest
JUnit version 4.1

...E.EI

There were 2 failures:
1) subtract(junit4.CalculatorTest)
java.lang.AssertionError: expected:<9> but was:<8>
        at org.junit.Assert.fail(Assert.java:69)
2) divide(junit4.CalculatorTest)
java.lang.AssertionError
        at junit4.CalculatorTest.divide(CalculatorTest.java:40)

FAILURES!!!
Tests run: 4,  Failures: 2
The first visible difference is that the JUnit version = number=20 is displayed in the console (4.1). The second is that JUnit 3.8=20 differentiates failures and errors. JUnit 4 makes it simpler by = only using=20 failures. A novelty is the letter "I", which indicates that a test = has=20 been ignored.=20



Advanced Tests
Now I'll demonstrate some advanced = features=20 of JUnit 4. Listing 1=20 is a new test class, AdvancedTest, that extends AbstractParent.=20

Advanced Fixture
Both classes use the new annotations = @BeforeClass and @AfterClass as well as @Before and @After. The = main=20 differences between these annotations are shown in Table 2.=20

Table 2. @BeforeClass/@AfterClass vs. @Before/@After
@BeforeClass and=20 @AfterClass @Before and = @After=20
Only one method = per class=20 can be annotated. Multiple methods = can be=20 annotated. Order of execution is unspecified. Overridden = methods are=20 not run.
Method names are = irrelevant Method names are = irrelevant
Runs once per = class Runs = before/after each test=20 method
@BeforeClass = methods of=20 superclasses will be run before those of the current class.=20 @AfterClass methods declared in superclasses will be run = after those=20 of the current class. @Before in = superclasses are=20 run before those in subclasses. @After in superclasses are = run after=20 those in subclasses.
Must be public = and=20 static. Must be public = and non=20 static.
All @AfterClass = methods are=20 guaranteed to run even if a @BeforeClass method throws an=20 exception. All @After = methods are=20 guaranteed to run even if a @Before or @Test method throws = an=20 exception.

@BeforeClass and @AfterClass can be very useful if you need to = allocate=20 and release expensive resources only once. In our example the=20 AbstractParent starts and stops the entire test system using these = annotations on startTestSystem() and stopTestSystem() methods. And it initializes and = cleans=20 the system using @Before and @After. The child class AdvancedTest = also=20 uses a mixture of these annotations.=20

It is not good practice to have System.out.println in your test = code,=20 but in this case it helps to understand the order these = annotations are=20 called. When I run AdvancedTest I get:


Start test system                //@BeforeClass of parent
  Switch on calculator           //@BeforeClass of child

    Initialize test system       //First test
    Clear calculator

    Initialize test system       //Second test
    Clear calculator
    Clean test system

    Initialize test system       //Third test
    Clear calculator
    Clean test system

    Initialize test system       //Forth test
    Clear calculator
    Clean test system

  Switch off calculator          //@AfterClass of child
Stop test system                 //@AfterClass of parent
As you can see @BeforeClass and @AfterClass are only called = once, meanwhile @Before and @After are called for each test.=20

Timeout Tests
In the previous example I wrote a test = case for=20 the squareRoot() method. Remember that = there is a=20 bug in this method which causes it to loop indefinitely. I want = this test=20 to exit after 1 second if there is no result. That's what the = timeout=20 parameter does. This second optional parameter of the @Test = annotation=20 (the first one was expected), causes a test to fail if it takes = longer=20 than a specified amount of clock time (milliseconds). When I run = the test=20 I get:


There was 1 failure:
1) squareRoot(junit4.AdvancedTest)
java.lang.Exception: test timed out after 1000 milliseconds
        at =
org.junit.internal.runners.TestMethodRunner.runWithTimeout(TestMethodRunn=
er.java:68)
        at =
org.junit.internal.runners.TestMethodRunner.run(TestMethodRunner.java:43)=


FAILURES!!!
Tests run: 4,  Failures: 1

Parameterized Tests
In Listing 1 I tested the = squareRoot=20 <<it is the square method not the squareRoot>> method = by=20 creating several test methods (square2, square4, square5), which = do=20 exactly the same thing, parameterized by some variables. This = copy/paste=20 technique can now be optimized using a parameterized test case = (see Listing 2).=20

The test case in Listing 2 uses = two new=20 annotations. When a class is annotated with @RunWith, JUnit will = invoke=20 the class referenced to run the tests instead of the default = runner. To=20 use a parameterized test case, you need to use the runner org.junit.runners.Parameterized. To know which = parameters=20 to use, the test case needs a public static method (here data() but the name is irrelevant) that returns = a=20 Collection and is annotated with @Parameters. You also need a = public=20 constructor that takes these parameters.=20

When running this class, the output is:


java org.junit.runner.JUnitCore junit4.SquareTest
JUnit version 4.1

.......E

There was 1 failure:
1) square[6](junit4.SquareTest)
java.lang.AssertionError: expected:<48> but was:<49>
        at org.junit.Assert.fail(Assert.java:69)

FAILURES!!!
Tests run: 7,  Failures: 1
There are seven tests executed (the seven dots '.'), as if=20 seven individual square methods were written. Note that we have a = failure=20 in our test because the square of 7 is 49, not 48.=20

Suite
To run several test classes into a suite in = JUnit 3.8=20 you had to add a suite() method to your = classes.=20 With JUnit 4 you use annotations instead. To run the = CalculatorTest and=20 SquareTest you write an empty class with @RunWith and @Suite = annotations.


package junit4;

import org.junit.runner.RunWith;
import org.junit.runners.Suite;

@RunWith(Suite.class)
@Suite.SuiteClasses({
        CalculatorTest.class,
        SquareTest.class
        })
public class AllCalculatorTests {
}
Again, the @RunWith annotation is telling JUnit to use the=20 org.junit.runner.Suite. This runner allows = you to=20 manually build a suite containing tests from many classes. The = names of=20 these classes are defined in the @Suite.SuiteClass.=20 When you run this class, it will run CalculatorTest and = SquareTest. The=20 output is:

java -ea org.junit.runner.JUnitCore junit4.AllCalculatorTests
JUnit version 4.1

...E.EI.......E

There were 3 failures:
1) subtract(junit4.CalculatorTest)
java.lang.AssertionError: expected:<9> but was:<8>
        at org.junit.Assert.fail(Assert.java:69)
2) divide(junit4.CalculatorTest)
java.lang.AssertionError
        at junit4.CalculatorTest.divide(CalculatorTest.java:40)
3) square[6](junit4.SquareTest)
java.lang.AssertionError: expected:<48> but was:<49>
        at org.junit.Assert.fail(Assert.java:69)

FAILURES!!!
Tests run: 11,  Failures: 3
Runner
It may not be obvious but JUnit 4 uses=20 runners extensively. If @RunWith is not specified, your class will = still=20 be executed with a default runner (org.junit.internal.runners.TestClassRunner). The = original=20 Calculator class doesn't explicitly declare a runner, so therefore = it uses=20 the default. A class containing a method with @Test has a @RunWith = by=20 implication. In fact, you could add the following code to the = Calculator=20 class and the output would be exactly the same.

import org.junit.internal.runners.TestClassRunner;
import org.junit.runner.RunWith;

@RunWith(TestClassRunner.class)
public class CalculatorTest {
...
}
In the case of the @Parameterized and @Suite I needed a=20 special runner to execute my test cases. That's why I explicitly = annotated=20 them.=20



Tools Integration (or Lack Thereof)
As I'm writing = this=20 article, JUnit 4 integration in IDEs is not yet perfect. In fact = if you=20 try to run the test classes we=92ve just seen, they will not work = in any IDE=20 because they are not recognized as being test classes. For forward = compatibility JUnit 4 comes with an adapter (junit.framework.JUnit4TestAdapter) that you have = to use in=20 a suite() method. Here is the code you = have to add=20 in every class to make them understandable by IDEs, Ant, and JUnit = 3.8=20 text runner:

    public static junit.framework.Test suite() {
        return new JUnit4TestAdapter(CalculatorTest.class);
    }
Intellij IDEA
IDEA 5 does not integrate JUnit 4. = We=20 will have to wait for IDEA 6. In the meantime I've used the early = access=20 version (Demetra build 5321). The parameterized test case didn't = work. Figure 1 shows = the=20 CalculatorTest executing (the ignored test is represented with a = different=20 icon).=20


Figure = 1.=20 IDEA Demetra is only running CalculatorTest.
 
Figure = 2.=20 Eclipse 3.2RC7 is running the suite class=20 = AllCalculatorTests.

EclipseI=92ve=20 used the version 3.2 RC7 of Eclipse. It is not a stable version = but the=20 integration with JUnit 4 is much better than with IDEA. Figure 2 shows = what you=20 get when running the AllCalculatorTests class.=20

As you can see, the parameterized test case (SquareTest) is = represented=20 as seven individual tests.=20

Ant Integration
The junit task currently only = supports JUnit=20 3.8 style tests, meaning you also have to wrap your JUnit 4 tests = in a=20 JUnit4TestAdapter in order to run them in Ant. The <junit> task is used in exactly the same = way as in=20 JUnit 3.8:


    <!-- Test -->
    <target name=3D"test" depends=3D"compile">
        <junit fork=3D"yes" haltonfailure=3D"yes">
            <test name=3D" junit4.AllCalculatorTests"/>
            <formatter type=3D"plain" usefile=3D"false"/>
            <classpath refid=3D"classpath"/>
        </junit>
    </target>
JUnit: Losing Market or Coming Back Strong?
For a = long time JUnit was the defacto unit testing framework. But lately = not=20 much has happened to this framework: no major release, no notable = new=20 features. This is possibly the reason why other frameworks, such = as Test-NG have = started taking=20 over.=20

With this new version, JUnit is back on track. It has new APIs = and now=20 uses annotations, making it easier to develop test cases. In fact, = the=20 JUnit developers have started to think of new, future annotations. = For=20 example, you could add a @Prerequisite annotation for a test case = that=20 depends on prerequisites (e.g. you need to be online to execute = this=20 test); or add a @Repeat annotation that would specify the number = of=20 repetitions along with a timeout (e.g. repeat a test five times to = make=20 sure there is a real timeout problem); or even add a platform = parameter to=20 the @Ignore annotation (e.g. @Ignore(platform=3Dmacos), which = would ignore a=20 test only if you run on a MacOS platform). As you can see, JUnit = is still=20 alive with a promising future.=20

Antonio Goncalves is a senior architect = specialized=20 in Java/J2EE. Former BEA consultant he now helps insurance, = finance and=20 telecommunication clients set up their architectures. He also = teaches J2EE=20 at CNAM University in = Paris.


DevX is a division of = Jupitermedia=20 Corporation
=A9 Copyright 2005 Jupitermedia Corporation. All = Rights=20 Reserved. Legal=20 Notices
------=_NextPart_000_0000_01C8492E.34CF6730 Content-Type: image/gif Content-Transfer-Encoding: base64 Content-Location: http://www.devx.com/assets/devx/4055.gif R0lGODlhnACjAPcAAPr65v9mAAAAAP////n55bWOa/9cAP63h7KypKqqnPj45Pb24v9pAP6kZv/J pVBCM4iGev9hAJqajal4UKGhlP6sdf9kAPT04RUIAPTixeRbAM+abjkXANt6NpY8AMHBsv2SSf+D Mc3NvYQ1AMbGtqSVgBgYFtlXAMnJuebm1Ojo1v6yfrRIAOrq2NXVxP/z6/5xE9HRwPdrFg0NDGZm Xv57I0kdAOZ2KO7u2729reTk0lYjAGcpAPLy3+Hhz6VCACgnJP51GP/dxsWrjvDw3f6aVv6eWv/F nf/w5v9nADw8N/Hx3vPz4Ozs2Z2dkP6KO/+OQ+qIQwwFANfEquLi0KWlmLKplv9sAOzs2v9pBd3d y//p2WxsY/9rCcxSAN/fzdjYxuXVuuWXXu/v3EdHQf+BLMi7pfNiABAQD//QsLi4qujKqC0SAFJS TPCfYa+voXNdSeireMWFU92JTeu6jeZ8MPr13tOme7W1p/9uDtvbyf/t4P/j0CMOAFxbU4JEGP50 CuTcxcZ/SXIuAP9tC3Z2bM/PvzIxLXsxAPqiX/N8K7u7rAYGBgYDAPx+J/TSrP9lBf/Alv/VuOvh yf/9+/nv1vJyGu7mz/eGNtWLUf6HNulyH/Tr0/9nA/Tbu/llAB8fHb6+r//59fXCktjOt9B+Qvtu Dv9mAf13HoB+c/+8j/NyE8BNANPTwo+OgvWLPvaZVP/7+PVsDwIBAOteAP/Yv//178jBrbmwnPSA OPHTsb2hg//+/u5vGPTy3QEBAP1nA/Ht2PlqCeOPVAEAAP9nC/niwf/9/P+XUf/+/POeWfJ3H7m0 owgIB/9nAv9kA/xpBgEBAcvLu/1lAPb03vtmAAICAtnWw87ItPxuBAQCAP5nAfX14fx4EuDNsf5m ANmUXwUEBP9sDLxdG0g7L/5mAffHme3t2tNsI/TKn+/HnviLMtbSv/dnAMPDs+uiaP9jByYfGK+d hU5MRO+xfciUZenBmftqAPPYtqqikOmNTO7hx/b28vN4JO+CNfLw3CH5BAAAAAAALAAAAACcAKMA AAj/AAEIHEiwoMGDCBMqXMiwocOHECNKnEixosWLGDNq3Mixo8ePIEOKHEmypMmTKFOqXMmypcuX MGPKnEmzps2bOHPq3Mmzp8+fQIMKHUq0qNGjSJMqXcq0qdOnUKNKnUq1qtWrWLNqFUmgq9evBLa+ 7GpIjQQIXGjMm0emrds2XAq5ekMiRVexXLuSkECDDBAT0QQIFjwDjeHDg5uZONQm1Ru7YfFm7Kog VKFDJhgNnqHEj6sqodwZimGo9GhpoRK4oqFkhgA0QNpQgCyZIoELLlIBcU2YTCo8YHyowEG8uPEx Y4gQWYJFhxZpEJQYNtHmDZG7tRl2VRGqDZrBJshI/3CRokmL8y1UqF+Pvn2TJudwJF9y7gsFMiZm AHGlRUHk7AZ11cQbZGgmACOHFALGeSqk4KCDOkT44IQTstcCfPIR0YMW0aExQyouYAcgAF0xgYcf g6ExjxPpXcMONmaYMcUaNK4RRhiB+EDFjhH2qAOF6p3XRIY9JNCGCWhAoIeIeFFGAg3hCIbGAxMM sYsYyryyThnddAPDlzCgggkmILhBDx1rBLIjFT5K+GCQLcSnoTs0mACEExcwmRUBCizhChCDcfBH B+sAcgUDASSq6KKMBtAJKq8oQ88abfYIpAoX4qAhCX7MQEYo/mlFmSHzRCmAFIiccMUVjbbqqqLO QP/6zhoU1ppCkENqiMeRrvj3H1V8KuAEoIJxwAoDrL6qrLKogEDHrQ3aCm2mRLQgwSF+fKEnVHyO UQhvs/CgwaHLlqssIWVUMEl66tmKaa49tMKFEjmEGhVlX7RhjWAYeFANA0mYK/Crj9Kzj3nsRutg kOeMscQYOaTS369M8enLFOQM1gcLAA/ssbKOjHLJOQivZ/KFDjPhCze+NkWZMe/YEKgXiH5s86sg 6DIGDiQzaGHDS1ywgAL2KsUnNaOgw8ZgNmhQ881QNwrDCpcQsXPP7mnaAzdDU1wUZRkkcsLSgjX9 dNRoLwrCI0ssYTXP772ntdBEey1UsI9oogEHTNP/cnbagAeAyig9FK7ccRrSXTRRwaoSxBl8C8aG qoFXrmgeFQTDBBM9tK2chkwobvdPR1dACAM8DMYGzQFbbnkWiXByweyb97D5BSy3zLgC3DTQCQMj /CKYFD9c0brrlieBzCXcNO8810PrfrcC1DSQxBWsYCAYMSMYj/z3ATyRAfQLRF83AXZUYsf66ytw kALsx88SZdUHwAAtkQuwwyfHg+/6E5wwH9F8RQBjGOGAByxCA4xxl65UogEIRCADVRKs3gUgCfdI nWD64DT/+a8IATwfZRRQiSI0ChnUGKACEtEoEFRicSXhEzcOkKgrsEB7gvnB3zzoukT4omteIdoC /4xRA0Z1QRXlW4A5CMGoIHgieqP7iAxH0QX77W0wO9ghD123gtyNkBsXWMIomLioIOCDCZ4o4qKy cAAiiC6GCliAJ1BxQQZ4YDAYOIEWt1i5Lpgjd0JkAhHOoQJYtHAfhmQULEZGBCZ0jSR8WgAnnlDD E/RhMCPoGB/9VwNP5G4BYSSkDsLgCEZlARN5YJQjvKEDFZwjaHXjShyZ0IBEMaAaiFCdHjfJQ1hw gmvcYMIYWqCDL+iBDqZYljjioIcv6KAFY3AkDDkSrAukAwa2PAEOieEBTfISfM5YQQ9m1wMcqMAH enCBIcSwLH2IoBV6EA4OevBIkMjwEphIVBKmMf+IQHXQXEmIgAEGStCBRuCbrwqCLmxHnxT4AAyG QIEZFPGqfpgBBYYITgrOQc9paiSS/6iAohigARwKIJP9U5YFahCCMjwBCjCFaRmcgVBXwQIHbjuH QyFKgg8MIZmNMsUdPkACEWgUB9KMokUiyQR8BEFRSbjjBr2QLHMZIA2xeAEvBsBVrjqgCxaoaavU kRxzPtQQJAiFGjbQqG3MQQ2hIEFGhTOGCxDNngq4QDBYqM9P5I8H7UipsgxwhD3EoqtdPQJYxdoo TFxiZ8TUQitQ8AE1gKOtbw0FCmKgBR00YQksU2pFItmDR5DRfl6YxfCK9zFUhAAKB6AEYhUbVsb/ MooOxGnCTkXgjjtAo1XQ2IA7jCrPpHqkmsFIpC15IDwBcMBvHxOoATohidku1raLcsQliBPZGNyi H6+yhBk461nQehQjMlyCLrIA1TNcUjCDqOrHLNCFI1i3tthNlDPoEJ8mnBMM+mgnO+hq1/MudZbn cMOiGMACKaxWvh6zACEccN/8LgoTLeAZMenxW2VtIw7PNK9obcO7JewDm4q6wiCay4Z/2kzCFE7s dS0cgDyoAz4tCIMaFQWMOsiCUahYQxM6OuKJzBIH9KCpou6RPxtAOMITrjCNEwULTF0CBI3qAAVK 0cJLEPm4JW5BPkdqScHMontRg7GUp4yKQKSA/x5VXJQl5EEBeWyiUfQQsUeIxgQchOG0AbjCDxws AAxwzFwWkO5Aw6pmGePXVYkmaAQO6r8u0CEMdFwUNOpRBQpUYRfCaKIujLuRSC6hBXFgb4pHQIwN akCwjBJoF0IAggYU4QldMEAEouzoVwk0D5owgq01AQNdN6qgyJZ0rJNtgFy84ngB7UACqkDtBMyh UWUYn4EnwqcLjEEFY9bnFXagum0sywA1OEAttmCLAVBiD7VowCm6EGOu0rZViQ6BKmqxB9nGYg9C OAIIApooC+ShASuogMIXvvAVQEFREi5Cwhme8HeIQQzDGMYcNoCLBHjc41bIxByGIQY3uEEZnv8g dUbi2IMmhOGpI4Uc0/YYgAhkoQJb6GoshFCLw1IiEjCwb68ZZXBV7IGrlODDurv6AgfU4KARQEXO EUv1AdAwrBEIQi2qPgB+kEIEKHCHWhHwhrKb/Q0IgOtmO9sCPU+Gd0RQATIXPLbB8GCPWXeAbAcg ihXU4EuoaAASBuAAodt7xgV3hBC4yotIlOFLQQDB4rnKB00ctBNlKEIaqC6KA4Dg8WtEBRQawIeu 8qEBd0BBT3OgBjy4Hg9qaL3r4SrX4Kigrnd9+wVwMAkFLwp7721EN1sVARhsnquiKMIpJj1pC4Qg 54MfeqIiUIPSc/UAkGD+pGtQXa5uIQRQj0D/F47PVSEYINGPrvmkkdFuVVQxCu4Qew4WsYgchOID +A9FDvZPVOKmAKn1dBEs53LhVkM3JBjCt0MR8AwHgFgrcArpFwEgcFhrRl/kJwR5QGmKYgAh8AJd lQbiUFsGAAIeWH4aSHyOgAR7AAMHpQhmgH/45w4kgALSUIOqF38zOFcb9WUXIUPVYg8U9XseoA2r pYAgsFXeFwQnWHBZQH6Hh18RUAEUKAoNsIQBYAGQoAqI1QBQ2H0DgASW9yoGkAiUUAG1JQNmIIMz KAKG0Aou8IatYAgiIA1s6ALxNBw8eGDe9maZlmJDyC9ekFLFN3nXlwXpV3DIQHX3FgAGUAZT/zcA e1ADh8iIyLB3A8AHqsaIDUCBlLACBiCGDmALkpgoBjAFJCANo+ECYKAFX+ADX6AFegAGbwgGzfRM 0RSAFYFgOgALQOWHqlVogUh0iYhYUGCF0xcE7TZ0BrACiCUEk8iIz6dzT1BbBmd9A1ALIUh8ZYAE keAMIjgFIhADtPgFVLAwDkIFrsiKPtBKr1RgRaYQptYCVPAK5vZ7/QSI/WMBWWB4A2ALjvCJ+JYH TnhvEZAHXkh4xlhzqLB1jLcCGmgAsYV8RgCQjLKMA/AEGhgBcSCOWlCOmZJb6fEmGeZGuEhi3BB3 PhCEi5IN9wiM+ZgHJchVtaCEkNYFkVBhBv/wBDE5AEeQkOLnhGmggSsVkw4ACRFYfbVACBqYBPrg Ap2lAk0AOrXzMDxDHIkDReiVVziQAlqAYivZkhgQjBAXAkjIVWnAgq9yChWAk0ZAdZHwjPpYb5d4 ghZgeHugCRRJig0wAEawhPpwDT6wUUFDPgsARptzO1wTSxiBYCmgB72YYrk0PIcGcSBgiQNwlgmZ KGvZawawl4glCi8QmqI5mlqFWHuQiVeoCRQ4AJ64KMXHb0/HKP5ACj7QAiSpQgOUROazLRQxgDoA Bo9ZQ38oAAnIKBVQllbXCc+omRUWAcz4mS9gC9I5ndT5AkhwnUjAB6PIhISonQ8JAqxphYr/4A1U YJu+kAHomZ4ZgJtewRFxdGoPFZyBNpzaMHyLsplddQDKqSz4yZNgZQGnoIWI5QBlEAIGeqAImqBl EGcQ15ZdVQQAaQGdcASi8AR5mSjjWZtE4A2DMRhKwAQEBGYneU4uIJ+C1giDMQhnYwFFkAwDmoH8 iZP9yZMRYAE2eqM4mqOHWHzRR3hKyYhlYAtHYJSNoghTIE8U0KGC8aGK2RE+qAJf0AomeoCCkUWL YgFPYJmYmZb9eW+dSXUOsJyI1gnP2Y9h+AwVQAkQ2ipGqgXlAQFKKgBtsARABGZ7qAUxYKJe8F4C wAYrGgSigFgzmZD0dZOcCQLJKJOZKTAR/9CB+ZkFBgADSICBk9imP8IFccoFQVOSujcGXJmnjUJS +cNBx6OPDOl9sUl8MECI/ol1NcCqewBzabaPXYUEStiWFXChimKkwREIShCnENCOTfpRWvmp8pkE DCAz/DKZiaKWiBULIaCr04cKq9mqVxgBhiqRiwpxYjiMXGUEXSAEkZiQUYANqxgG36GkVYCHoeWk xaoFhrAMrXIFGiQA2oBmikJ9iToAXAhpDqqMUHB0XeUA0nqlWQACDBprWtdVkgAFx3AEBRsA+iAN qsgMcSoA7vBMbrRt3PauhuAP9fh7wYNF8iWhDfiBhHCI9MWq1jp92QqJePkqFsCAnZiQBv+An8eA BC+Aka8yDJuVG3EKCigQmADoPtTksVHQYQtGpX0KXfmKCtYYCzwba0ZwDDsZCTMWAWVgjYSXfcQH CWtpC9PoKhz4iNe4qOCAUTEwD3E6DyLgphw1NO66e1y5Tj/GKCTFp4YGYREABTFZC8WWrzn5AntQ ppdpAcY2fYjaVZ0ID+cnuDDQgMm3qBDJuEawnKewAUWFDfGQqSKgB57VUXPrqXh6B/LaKFegrIKB CE8WAUVAlOA3UDCADHvACw0QAohlCw1QA4SgZJrYoz8XApA6UHkAApv3Av06WIt7iXmwnEJ1ik5g IB0qAZ8bunJ7tHcaA7iADjtkRyhaNmf/8DeJhgyPuAWqsAIHUF3HkKtPUHV84ABhSIpQcKqQ6AAr gL7dJwQgUKPLYgHFcHwrIKbLMAQzCAf70qGgkADVO2TXW2p5FXdRmgMT8GQM4AUmJQUs8GT5Fgk7 aZbIIFBQUKvXKQpI8MGLYgBBUAH0i1iS0ACo8LjlYgDIIAmSgApiWgc5QAK30LlK2gahYAh6sFEg +o4P8aQ+4AIfUADZ0CrVkD8CwLqwZgBZEAJGoHArYAQhwII2CgMw9QRl8MUtlUqxlnWjx3BFQGyJ KzBZEARBIKYBMAeh4QrNAKwkwFn/Z1dE7BDp1QJHjAK7sAqtAjytJjmUg2+Ju3yJmwSI/8tszyhQ J+jILzZpyxJcofEAQVsFJOACX6ACG5vHDsFy8ggG0pADp8soSXAChCYYHvBkRGejloOjW2QJQxAK +WACceoHmhUcbdeuHeGbeiACHyAIT7ZPqutc4zJl31MHapADcBCnzQABH2BU1mu0c7uVeOoOu7DE ofoDSmqfyFw525AJaiAPtqykSkAXdoxUHEti3galrUACzNALgsUAZ0A2kuO03ww4srALeNDMShoO XJADKOACwtHJUhRmD4UCOSAIWlQNUjUYOpTPgXMDCEDOcQoEVRDNYFCedLrOvbkALacDv/wBu6C0 C6YB9iwAfYDPEn0zwFAPb+DPHcoINP+wCHUMt9IUEnzSZ58Kz3XgKnakpCoKay1tLqtgBRAwx0oK BAmgWQR9e3is0w9MogrNVoF8RYOBwTRX1GmZCVZALDNNA2owXBvddpzqwCAdysCMCzfgKjZEhKrD 0lxdLqsgDygSp4fwBjncCm5atCPBZ9YcA+6gBvVwCoH8CeTWoUM91+bCAHKQCkrdoc+sBhqtobws 1ReAki6g0FbQ1vO6px0qBd1E1IytKKsAAaBwsW2AADZtx3Hr0QeW1r8JzHhQD8DQKtfjAd+7QazA yqVtS4JwCBeL0ZQtDbZn0JCkADwtWSSwCFbw07iN2EraYr7N2AyADg9gKh06AxDA2jf/Pc2ebJLV 8lC0vQt3G6pl1qE2INelnQTZ8Afa3aF+8AaUTVxQDdsrB9I6hafN/QaZUA5uzQqpXDbszdXI6gED 7qFVgAc5bMcMjN9Zmdn/hRp40NmvcgUP3TdbjcwMYEcJLhiH4ARpR9YFHdUnQVq6xd+L8Abm7SpJ kAQtqeHW7eEXCwpzgQdO/QU7eNayJOHk/QF48AZycNuHPQiDzDSsU9T0jAi73aFoUAho1+Cgu8sQ Tqz63dOLgAAJ0AGvcj+J3aFscCwbXlPISgv1qqQzwAUJMOL2fYtVTqyZrdaD/Qb54NnzqgFfjkce 0A7VXVMd7gXFvN1qTt8fQLE6/trh/23lPP0Fmx0KeJAAdtblZ3DmdqcqY75FV3AGHmBSSmoCg47j a6exJj4/YSbSMdDcWi4PvdDln4AIcA3mP/AJfc5DyOIFea6koJAKVRDlcqUHVADVPG4S1fRt5D3n CVAAqw7UDs3pZrYDvX3pyXMFtDACfIrXEFAFa74IJI6HwX7iLKdTjC4NQP4GVVAAdwbUDJbSGjMI qkLarnNLP+DEShoNZPAZ2U7iO3jZY1FiTeAck+Xo5C4Pdt4o13MCt77uTvPi7n4zCv8J8f7hKUID ToDtbK7J5QFL1AwTkRTnVKAHp54DWl4F8sDlLk7Pm36xhebsZ4Cs3sTwHX5LGkDtEP8vGNYABKng afcuAk6ZArbpjjTBVGbFU1k+bVtm0njLAAY/843ABiNwArTwCcjS4QtfRx3OKmegASywA1LwiyiP Bn4gAZ6Gdtqu82x3m4k+EjJUTruF6kQvB+dN8AzwDT/ABq8ep7/ABoPAAiegAWcQaKvy94C/Kgzw CbRwAqzgAVqP8tutBBBAARSQAG/A4EXllKLe7S6R9jpV7EPfaQVwA0QO1NOu7hcrBRzAAyPwAyzA Cl6w+qzvBSzAAh4wCDZQ7YovAM2QIE6A85EfVxml47apcjZRTUugW18ABiJAAiBP7hTgBHKQ7C5+ BScwAvJe+8SJAdZ//cxO/YRxCBL/7/gUT9mbpVE9b/kaTzRhRPw8lQNBTvQF0AEhG8hXoAGI3+Ta X/8oHx6FkPu6jwfaDhDSWunxkaIJkQsLFBAA0NDhQ4gRJU6kWDEiAQULLixpksIHGEMkQql5k6AK BScFOmwL0NLlSwZXzrAawUHATZw5de7kmdOEEhqpnFCgUCXBGwRqQpEQ4UILFRXnliRcaNHqVaxX MWrk6BFMDBQf1CAwSbSEypdpW8ZMooGmDSk95fb8ySWVhKFFEyRAgCeHOxQxwHzR0QJHD24KqmZl 3Jjx1o3nVPjQ00qauxx4Sp50crYDNLUvk7CldYLmDjaNZs0iJvfXLG19gJAJWgJv/16jb97gWfQB hSGnBQ8ySbzY8XHkEzEq4NYDhwodWlyIEDl2M0oJJeRsEgYsdMvRDBhMO3OmNIsfiEasZ4/IA4tx gmzfxp27b2+mrQbrUIFjqkICGEpuQAIbWq65MVpI4YuvUMBMs71Owq4AQW6QpbvvAkgiPAY2TEsY WTYppQD6iCoqN6TUyOGD/MB4yqAxEFNMwAJrTG65BZggoiMfpAvpg0UgLAslJ7IrQI4ONulFFlmA OeVJKE8JABgme9mkgxFtcyKvE/fSLalFQgFMBP1eNOy/GW1U80bIlnhOBwZboQ5IPBDYTMItizTy SEH69LNPOQooYL48TTTqKKTwUP8jTHdIkAY4F6lIwTAiiJuRxjUzbezAHsboiAotvppzEesilJDI PPWUYFX6CiWqikO/5G3FRh/VjyAdJj2nUm4UMk5TYB9TjCscFOxRVBLcGalO3Uw91URooYU11kQX FZMEFESIwQUw9PiiIBUoJc7XAIM1d9MDdTzH2FBdMAQFEj7IgVRmS9rr3mkPvRdRBPpS8YMxDWmF Wy2+oCLXFs4ZY4lxLz334U2HvaAHItZNgYov9BAVXnfkJVWNOvu1UzekRMZD0UVoxVZbbr31Iddw FV6iB6ochvjmrAKUmOJioetR41YMEQHeZD8IJZQcklY66aMBJmFlgQn2QdJwm8D/gYiZL+hVsV9x 9lorHLlhYglPFdTBhy9CBcOFGIQWQRoU4pY7bmlEEMGQbQn+FuaEF+6BiYR8XQjTrwsHe1huJiYC hyZaUCGFs3vUQmMwKnfhcm4r71YLLXx4OYVJrSbib60FH9xw1B3TGfGJyWbccdB10IEKKjy3feqD c02haoVHB3wBwQMkPHXic14uo8SZ6GEJIsbA4ZwmGm9heuqnb+IcHMbAmvStuS63ePDZPD6jBRK/ QPkell9i/fXTJ71004UPf/4aheeaa+Dz56bX/E2/dHj6BZBAwlvd/Qw4OPkJUIEQI+D3FvhACEZQ ghOkYAUteEEMZlCDG+RgBz34F0EQhlCEIyRhCU14QhSmUIUrZGELURcQADs= ------=_NextPart_000_0000_01C8492E.34CF6730 Content-Type: image/gif Content-Transfer-Encoding: base64 Content-Location: http://www.devx.com/assets/dropcaps/3573.gif R0lGODlhFwAYAMQAAP12F/yVSP19Iv1tCPr03fvRpfyMOvvNoPr13/yqaPyqafydVfvXrvrz2v1u CvvKm/uxdPuzd/1xDvu1ef1qBPr65v////1oAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAAA AAAALAAAAAAXABgAAAXIYCWOyJEYAAUYyYGMMPwEV23bwROPDSTdwJoE0ogRFMFkTUGATZaMqJRR 8N0mowKgBrF4v99KwgYoiBa2LnhtGdcWFcYg7YXYJAuGt/K7DBgRN2p2QA11NhE0dBaENwFeDDgC godAEns2Ag6UjElfNg6bi403nzUOk6OeXpmKXJWOkDiBqkAPXhMUNRFytYsWqX8VaK8WDVMVX7lv IlrFbF4PuhdlI08XamsNDwZXMEdKSUwxPX3hQ0U7FTPhOeowJScpKy0vMSEAOw== ------=_NextPart_000_0000_01C8492E.34CF6730 Content-Type: image/png Content-Transfer-Encoding: base64 Content-Location: http://assets.devx.com/articlefigs/16496.png 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 f6G2dIbhCX7bk0G7kcL7WpS4pQC8PAForEfZUUt/056bpSP5hqjsyDWJwudi7aki76qjY+doogn9 ZT85EqE8jd0GRSBifmYgtl10i+r1ksfEhgZQNCnQmqjRrUdajFVoTw5r1rVbZrBjYnyMqw0aPdEn apBF6ql3z6T9yjUvPtAsjYkz2gou9Np2xoYiRK+nZrJfa+Mmc1+uzG+Jy4/FbUGsRMXCjji7JU6u i5N3xOm7YnZDbPMECkXsXhxXPxlN7JZrDxqNJiOdMZN6mHmbxi8abEfWUrtQBO/T6A+SFoF4VItJ NZqRw/6UY1/OCpRuzAk3ZqM3ZjV92ZaI1nG0mAZLnIkWxqXMT6vvjotj42OpIWUmrhaesZKsshNJ iu7Qcl5tjVkzeAna25rVb3XWe17nd8HOLfhF4VJjV5zxa8S9X7yIEr8EkL9vCNCs8Lj4MvFFHHry ZBCpQfeqmc2JV3RGawDFejJwh0UEJqtqtfaQIvNRn0tBJ6Lx0v+tLW+UFAqJkNqIs8pjuSI1k2PT 6bNXm0Kirqqxn6VkKinvyMWNMj1Tmfil13WobFtEox6BW2osyNVGGDpDq6X1aGVLZwSdzjnEuNrQ p2XoOkNbSyroMf+/i+7Jo2F1iGW/vKpnVsrXpeJC8YuFtd8vSH9eEO4vJKWFpLwgPl2I/bDgTW/R 9SPRY1BXLyZTQyVlc/nyqYeZUwlNXmghqFbycEjvTFM8o1itFZssSWN576QjXxci97Yj322zjVZa LyUExctkl8Zes7pbrymy+rpST0q5n0or35cJfWZYvXxMzbwZZ/9Vq4oiLRvqwa/9LNbJAV5mDHjJ QxW4ZOvcgvc2mjyxFrQ6YzzjXhGXDrqAMM7NbNtG27Le52qYcgYWi75IInMPERiORX51Uk+sFdWg 1x48GWQJr/lvirMfmFcktD3p1CVtVwule9jV27XJ02IyLiQ8SA3rEl40t0AQGu+ezSSPJ/K3S99K scjrpPi0eAbpjJlzyUZDKd+rRF9PGCP/AZbw2n9IVVW5UDj4w8sSXpqCuVGOJceapL+eVgqf+Rg6 MbWIuubb77b5c7M8nuFRZ3j00wrQ42qh3SLfKK/Q0i5sJE03Su3hMU1VkDhrqQpNXtD/8fdNLZBT r69tNjMfuy1Run3luqA06h9kJ8bTxalpCm8mPs81dhn7mQbyWsceS4oRmk8z8555EV5jozJ3P0q+ Fy/Xa7Iss8eqKIuLv8xkSOQ9bc00ej3CalL1B1n4NNu/S3h1qxMP1477LT88QRCe5cPlidqNBIxL eEmfTcdOv6t/2tj6VvxyuTdPBpEanXd8W6mh/UH3M3/CdrVQUhW0JIf4ZmxsLEl3h/IDqbEniMdY 4lex7a2KItPGEWLk1Vr8So2Xi2G0bhh+1cZB7oFC02yX/6bNXZk5HaXl0TrpRJpjS0tTUHQkc9qr zqDqnKQGhTTcnalJctvRE5MFGkCJjl1LJJj4ljZjsvqI1X5g0o4mEmgeD2nXhOS4P19LatCqHiLF MzSpwUUVCQsuMrT9blqCY4ifF9a+a2Ra27W4H9rC5ONpLtEWb0v1569ERLL/ItLy5O5SI/3NtPqP tMxMQ3gcma4Ji2TgRJpFWjGqp3X1gVSlBefPTyfOHI7kbQfgaH3udNcPTw2EZ/lo9VzPt7ZPVwvt Ralh3HSNNpEXns2pIznRYaM1fmG4LExO80KVhkx/4oXXBbrRalENWpv8l2aRwe34khrauAlfdMtw +Br+8PigylHY2dXlCx4gqkFSQ9MBtLa988QUmi5qW2lpvajuUJyADwntd67jtM2mGkumMu+0jxKt 3qtpM1rooFlN+/N/Wyu68FGtvWZxs5y94DbwMfrVdONEPVGNF97PxWnGNG23dn+bIhmRPbWZSsVS 2G6t5+8ScBAEukGA1Mbifyx2w9LB2ehFqeG0lbwLlUPcbu3g+sqhpsADEwfs+UFGNQ64aV6qoxHG WGsklcuL/aP1pkn/a2nWuY/dAhIkNSaOpXPn91c281Ip8oAACAwegcoDae1OF9Z4PEgyhyM13Fvo tJU8pIYtgX6XGgd5uaMuEAABEACBgycQ5AmUsL0Uz04lvv6RXqmi0bGpzAcP6TXsSmEfBEAABEAA BEAgDAK9KDXCaCdsggAIgAAIgAAIHAoBSI1DwY5KQQAEQAAEQOCoEOjFuRoB2NO00AClbIvI5ZfL QHXLJuyAAAiAAAiAwJElcDhSo7FDO5w0vK3YeGS7Bg0HgS4QoHVEBCEWo63nnQ9aKIU2sdE3uOlC rT1mQttfcTiq0sLAOEAABA6DwOFIDfmZVNoqS5JE24UeRqtRJwgcFQLRaCyRiGc/vqw6bAtHOqO5 p9Z+kKp/26av5EByEUUx+dZoOpXyuLLtQEJAo0DgEAkcjtSQnkjLKyvzN17ZgfMQKaBqEBhgArOf fZT7POckNeR6vVZ7KAxF0uMT0ahb8KN/ESmKsr1ZlHca6bHRoxlMpeAW7cAApdW/13C/e35oUiO/ lL/19Wq/44P/IND7BD76cHLxRt5JapD/+Zv57JW5QdUZvINIbcx/OTeaStUe1KRngxm8cbkUxZGE +GYyczoDtdH7X9iB9LDnpAbt5lX9W7UpS7TZRCQhpn49RntY4AABEAhMoK3UmP1sVtP9zou4B666 hwoOMeKQfDN57vxkbECDNy605Wf1arVCGSbOYoucHroqj44rQR52Ld4r0+Yd2k5jXT20TbzuFJRv Lo89Xc7sfpt5vDh2b0b54z+X1le0aWs4QAAEQiAgPau/sErfsgFOWivF4+IR1BnU8MRIPJlMDupc nBC+FjDZZQK+pUbtsdRQGg2VdiNXtstV+qcplTbLq+ul5TtFOu/dWRIT1TsLmWg9PjbB3s6wkZNa OibGf36YuX+1up4PrDZee+01L254zObFVFfyXP+3612xYzISktkwXIVNEOg6AUGIdN1m3xgUIkdw 5KhvemfQHfU9gELbmQpD2pAGjXRor3yLbdpCs/VP+kjbQ5UyaHttO26qTtNCTXM1SrfzmbjKUtpm m/Xv8lfv0T7d6vKXWbaeZUqd/cxKb+cy522WJzdKhL///e/W/qIMtudNOZ2yeSxO1kxipZNKSRBc +9dr3EPje/erkee0zR/M4KBf/Eelfe4DKBTVyN+cbw2gOMYOF77yt7fT1U/sd809TOJDAnE4d3Yy fdpt+9z87bIwHPfop6rUsx+4WfNo52Cy8Y5evFmghQYOpkbUAgI6Ad9RDRM7mkqWiCdi9EBdPEHv NZ0hCPQ+cSzhnTJFLE7u1tibrS22FYn+5EVIqVCigzbDPBZnv2AnH9E3xGyS6wD98F5jGDm5G2RZ f9OVWnTN0daaU05EMtqiQwZtooZzKsrRxhtT5y5OTX88lXpvShifkt6aqoxMbA9nSmysqKRW5eTy D+Lyg3jhfrxY1Taq7cXkoZvjI2Lm9OjEO2ktndHT6MSZ0Ynx0Qyl0zydTJ86KQxHPZhEFhAAAdaR 1Igdi0WGIrTyT3O3SaMq9MdFUxukmWmEZdeHcK6Wt+PHBBaNazpDrQuaXlFjrdAJG6bzmtqI/yxV vy8be8wlDkEfWQdE+El+3vipKacxG6/OaM30qdWa6ZpysqZXanXVFIHgQsEoF/Qz9IYnXqnxjfG9 SYLwyAeufRAwEXCZpuGXla2p1yIRnlwqcv/UWtB7fu9NSBwT5v6QE48xMa4n+vmkpcxmNDHC30dZ K7iLAwRAwAuB4FJDe2iKfrvQcyJDEXrlQyd0RhtMab3xfjSfVDVVQQMlqsIouDfUjAosQT8YaNEh bSwmqsU2fsHY04debOpBDpOe8Bj8sBbXoxTGIIpRKziNlVjzG8/wtriHQNxDGvQpTybpwE9y8eE9 KOKFLfIMLgG3CaFjojBzmolRFhdYZoRl32KL42z5vejqB/Fvfyt++6/J0hep0s2x0lJm/sqoOELz IczWIpFIs9ngid47zz8lwL6mpvrK76n3sp/nKN/0p9orPxK3NVUh3hGkC2ryjva+6fz3LfbLf9AT 5aT3LrUaP7XN2TaDpyYhEwgcNoGAUoPEBK3123x1/cGXEzX86AwiEKH8FAV5ts12afREodVmxJgQ f53+5iiayKCZXJrg8PobwhpI8AXZb3H3ORm2UQ1f/nSYWQ97IJLRIcmjXDxGvyhIuf5p5dVUuP6n wtyfCrk/rVCa/+PK/J9WYkNC9Bfmr2okEiOFoQNsqY2Y9sVvvfJDf09v9E/5e+NHLvm71UH5L+bI 1PJN7ZXrDPmiKt7WdAaJoNp5NXlXGF23/3NEyqDx/Ec9+XKJSrnnb5vBV3XIDAIHSSCg1Nh3cY9p oydccOizK1pzRfl0UY9HcyTJ6jXWkFhTZs2GMJKYGRdm3omz3QqLRdkvoxQqoSmnLCq2NWgNG7Qt YszQYXFrXaapJPyftuM7vvz0mFkPe1B+hDc8QkM2GwKtuRfXfjf1apq5+ruZud/NzP5uava3U5cp fTLl8nPfI1ge+eCZDYGQl6LEZMeY32MVXrLxqAbXGfS3TLqo/UGLn9bcILVRec/H3zce5OCVGgMe xjP8I9s8enH3DO7hEy9NRh4QCI9AcKlh3JyJxlB42h9GIX/9BDZGT2eUpwqrS2xXoTmhal0ulFlh U2XxtKZghBi91ptCaqw1b/TFwe/Z4aHprmWjq14eTulu7bAGAu0JuM/lfCWq8TKeod1y9+jXhfba 0hmte7DJlNMZ43n9j4Ze1sunVstOrWjf/ldyUFRD1xnRsRg1MHo6Vt9sxMdjWjMd/r5R4MEqJniQ g1vXAx66MjB+ShmMcRFjEd05UwZrfp8NRXYQOAgCAaWGJil2tTEU+sppczVaBw9vGBbA8Cr8o1Gh 8vYMe1rThlGGmEJreT1QKLFokgKrmukn9YdvTluX1NUjBHqcwHjGyM903mM2smAMQhhLeZEL1vz6 eIr+rIo1wmE7bZOfNE4Cdbo69JxOGTCB4yC+WINVh8poSzZjVONlPMOoMwZhe5E9CtNqnUdRDYpn 0BvSGcpWg+IZpDPon/QqnomJ7zhGWaxiwngtWIWI9UrxG5/wm3+wrk20pj8IBJQa+3J7t6HN2KAx lFaiPzoKhSUCHaPns/TIHHtMakONnxpdviJSYo9XNGPV7aKSTJ+dsTVsfdjVOmbBC5qmhbbNposJ 48xNqxGTVyYJ4lSpXsp9WqjRuD4awodCjAMipjP6tFC9OEZPAl2VR62Q83zM1t23NVHDPD9Dj2e0 3tDIKYf2iqnmT3Lkdbo375+k93RmP/7xMicvZSxrfe9+xn0+qb/e5HM1hJbOoDf11isdJESk7xq1 DdlX4JaX9RKB4ErFOObi7rff/P4oIDcIdIlAR1KDnmuVd2R65QetHxrg68cbEj0WTf++UIpOK/dK bKvEnkpaqm7X174tsYn0b3MCPZRyZA49sNH1CETXDR6ZPjnSDaX7K2mI1kQN8/wMPm6yrzNoVoPD yEJLbSR4aumM1m3bcNJ0hv/TVKRt/s47iSsnOiiqoesM/SQfOuFyqrkvjDqv08aC3xmgfvOH4jSM goAzAd9Sgx4P4QfN1KTnWunQjfN/0jAHP80XFfV+kNrI/Paa8IdK+cTV0hORUvn41ehnpcwH2cHe c9IWkTV04Z2kS06EN7qCcQCNtFt0S66r1SeMUu0xTyol6YkqPdOS/EyR6XWHqT/ZzdXgMzkaMk/G mRz6Sf38yzx0O7cUccvfrgkee42HViiqMXnqKr2ZuaLND81+liOdMft5jj6d+31OFx8mm8YnXfnt 3xiisM7ksAYwdAvW4rwukxFTfo9tRDYQOGACvhcm74p/1oXJu2IWRkAABKwEPC1MvrRMcUknerNf fEsLAnuce6U2pPnPJzvviEgsoemPLh2CEP3o0nTbhcmXN6TMmTQt4eVYLUU1Wp9dvXS5er8yc57m k/XHgYXJ+6OfBtRLSI0B7Vg0CwReEOhcagwAS+9SYzQ1qg3Xvpx00ho04Qha81FyNxavfnqZBotq DyA1BuDSQBMOgoDvAZSwnZq9cjnsKmAfBEDARICeMVFplZxBTp6CMopS375fKd3bLm3yVNHSVmWb p3Jl+/7DzOlMtfqwVnuoBp0Fj8sPBI4agZ6TGketA9BeEOgJAm0nOgxABg+gsxfHZt4TPaY+2tbV Q9ORBQRCJDBQUoOegin+pbywkV/YKBT/WrbuBBsiSJgGARAAARAAARCwI9BzczVoAGX+xqLfzqJV v/KbhUpSEo7HVLWpLe+hqsIOy8hjM+PTUdoZDgcIHFUCLnM1GopS+0Fau7u8eLNAWzIPMCFBiF3+ dKbttNABJsCnhV69Mudr14gBBoKmHSSBQZAaJCzmNueFs4lRlqSH3WtMkmmNj90G/RkllOkf4nOn 51zUBt/3xDt0v/m9W0ZOEAiDgIvUkOv14nffynJ97nNtXbjBPmY/mx3sBqJ1INCzBAZBalxfX2i+ F51mGaJc03ZSkSt7NR7baO5qc8Ema6mrZ7NOfcClg5OAsJ53yalX4bKtvNENXxKnZ68hONbjBFyk Bv3SXf5zYeY3V5Mn+uahzU5oYyInLXlEA82dMERZEAhAoO+lBg2dzOzMZY9PJ1hCi2do+8NK8p5C UkOLE1JQeFeNKWz1rVuGxcZeAeU3SuFFlHix6SVPgB5FERAwEXCXGhRUp9ET+ZlE35VB2MQE3Q8C INB7BPpeaqxtFlfHqzk2Qzpj4dIqDaAUlq7m9lakS1L+P67N/OY6/TP7ZGFuZ2rin7Swh36Ytlq1 xjZMZ6xbs+pneHDCKB2crBlr10MatnZ0a6ZPe+8Sgke9TsCL1JAe0yOdZUmSFGWQZ2z0elfBPxAY UAJ9LzXm7l6X3mMzQxPXLy3fWprNs9XtSzWSFzOXFqjL8iQ7dgs0IP1uLXXNMIbiJAv8nudXhS4s 9IvESXwY8zu959rC3cKAXo1oVigEvEiN2qPK8srK/I1boXgAoyAAAkebQMCHXWmn+NoDqXivvHy3 6JjuFAu31wLgpYdQnJKtNRorKbEKxTMMI5Da1vOFpbnspYW54ZnIi31b2jrDJ22YQhROpfQd4Y0K g+/UqssFL9Zs7bR1FRlAoLsEEM/oLk9YAwEQ0AkElBqlrapUrzd3m7FojBLtrBYbjlHS3wTe4pU8 o4ddnZK158ThJO0oK+3VTy6JM5dyFNJYXporsm3SGvSEK39lQ0JyWOx6r1v3r/dShXWKRjA7XupC HhAAARAAARA4dAIBpQb5TTqDv+6/UZtNtXXmxZuDadvkWKb5g0w/yCiqkV5KTS6li6wSZcLU0gSF Ouh1ga0JO+rEqVcmarj45vI0ikt4w+kjkzX3qaDG6SAHQw+1gAAIgAAIgEDYBIJLjchwJCJo4xTa a2uEgt68PBO24y/s0/7y6fqotoSG2qQAhsBoo6RXjoYip6UkbW1vPMsVAD+8eGrNbzxjnODJbbo8 xarXaxxkcSplW4sXh5EHBEAABEAABHqEQHCpocUzWg+UyjsUVFDoTWO3oQc2qHkHtibd7Jls4l6z vkNyQ9EFRaQ1clJUt4UNNTs+Y8VtGrYwigPb99ZhDv0MN+5lHMSYR6/FasekiniGHrli4AYIgAAI gAAI+CIQXGrwYIa+GkxsWEinkto/KcJB5/dUmrfhy5XAmePHovnz+bGtROUvlTWlVGY1Sqtqae37 tdGNWP5sjiIfgY13WNA9wtGhcRQHARAAARAAgd4nEFxqNJSGsqPwFpKqaO4xQYjQUnTahFBKBxjV oLpIbeQuXCu+lZ+uZuJ3GtE7jelyevn4/LXzVw9RZ/BQR+9fBPAQBEAABEAABMIjEFBqNPe0oZNE PGF+0qQV0uBTNw4sqqHTIVUxNT6Ru5Cbv5A7Nz5xuCIjvD6DZRAAARAAARDoIwIBpYbWwj1GgkO7 ne+9Oi3jRVSjjyjAVRAAARAAARAAgZAI+JMa9KDH6kaJ1uyieaDkEB9A0R7uMMqLF1GNkDyGWRAA ARAAARAAgT4i4E9qlDa3I0MRWqqLghnRY9oLf8yEpmi0HkJpNRxRjT7qf7gKAiAAAiAAAiET8Cc1 SFTQoIn2RGtLT+w/zsoVBh18/e/Di2rQ8y/Fv5QXNvILG4XiX8vYKjnkiwfmQQAEQAAEQKA9AX9S Y/JsRlunazii7FIUQ6GdUPYfNlFpiqh57awDW1eDWklbyV/fyE8/m1v+p9L2uFw8VV2IFyb/6yPS HPRRewzIAQIgAAIgAAIgEA4Bf1KDIhYTZ8YoiSMJ8kd7tJUealXVzHh64p1MYiR+8k2R720WHY5m TqdnLpwLx+1XrJLumdvMNc6yyTcmMkMpcZhkT0IYjjaibDVZzm3l/KoN6xKiHhcVPYDGogoQAAEQ AAEQ6C8CPqXGi8Ylk0n+lusM8Xic/zN5QiTNQcGPyfcy2knPW6p2Qi1/rxA9K86wiRQTYyyWYAmq l2RQpLUY+fab9cJmoRP7KAsCIAACIAACIBCYQECpQXED8bh2R58481JnBHaik4IUsaik5AwbpT1Y aqwus4bMZG6Q1AatYUpvSokq5m10AhllQQAEQAAEQCAwgYBSg+rLjI9Nn5+gQZPAdXelYOl+STge E1lCYlL+0urypSKFN8iyfKWei2bl36v541dpJKX0fclUnXW7NS9nuuIzjIAACIAACIDA0SEQXGr0 CKPKTpWmpkpMXri0emtpNr2UnLm0MDc0xYaE7KWFwn9cy6nL5Gr1ec3ksL7JGZ+HwTcrMW5sZj3T I02GGyAAAiAAAiDQRwR6UWrMXrnslGzJqmqzxCpNmjfy8mNtd/vC0hypjbnhGT5TtW1Uo4+6Da6C AAiAAAiAQL8Q6EWpMX9j0SlZsYrDSXrsVtqrn1wSZy7lti/VlpfmimybtAZN0+CvFOFIDovGsohY 9MsFCj9BAARAAAT6nUAvSg1fTCfHMs0fZEVpUFQjvZSaXEoXWSXKhKmlCQp10OsCWxN21IlTGV9m kRkEQAAEQAAEQKArBPpeatDi6On6KG3OwtQmBTAEZl5JrKHIaSmpbdRiOGhOhmkSqJczXSEOIyDQ ywRee+26nnrZT+6brat00qPnbXNy+x6t6dmCldJb5F5dJ8bbNiRAY9vadMrQ3YZ011rgRqGgE4G+ lxrUsNkz2cS9Zn2H5IaiC4pIa+SkqG4LG2p2fMbafn0SKL3hn3o5gysJBAabwN//fq31XbhG6SBv PAGoknvcT+6zfpj+6WK5bc62GWyNByv14q/QK23hcipY6wIgtXoe3jXQCSW7v+dmbgGajyLhERgE qRE/Fs2fz49tJSp/qawppTKrUVpVS2vfr41uxPJnc9pO9zhAAASCEtB/Mpp+OzoFFaznA+R0v8nx T01mnerVc+oAnCI3TkEd649mlxa5YzYWdHpv9NPaTP6px9/xtoisFlziQ06sTM20Reedksdagl7C KHfIBAZBahBCUhu5C9eKb+Wnq5n4nUb0TmO6nF4+Pn/t/FXojEO+xFB9/xPgP0D1KIJ+o9KDCros sI00GE96z+mOzRh90X8fO0U4dAf02q05jQ00/eC2FndvkbtI0j2nGk3vrT/0bZtpdLWtIDP1kVME yBaIU+3WrgnQ70bPbXn2//cGLXhJYECkBm8QqYqp8Ynchdz8hdy58QmIDFzpIBCMAP+JGXhggldq LG79zcoHaEwV2Z4M1gRjKY+xeqfabYu7/Ar3WJ27SvCitLyQcSHv0U8vtQSjbSzlMaphjJ10AtBv o5C/QwIDJTU6ZIHiIAACukro7n1I/21tNGsNinCBwtOh3Ei8127boh68fgbMT2NzunuJ9mDfDZJL AaXGdrnKU2nLId0rDxImtAUEQMAvgbaxfavBQ5EXuhuHW7sXvF3x0Doe5KVqyuOxdo/ZPFaKbINB 4LXG8x/1luS/Wsl+MkX/lJ7V8zfnF28WVLVh204SGfKO4aO9/Vzq3v6KnbTPGW3x6sRIeiLll/K3 vl61ZqB1Qmn9rsGAi1aAQC8Q+OjDycUbeXWvaXVG/6bXHlX4V9I4m8HpHqz/mnTPbBpA0a3x88Yb ktUgD2+40DPdz6w2uQWjh7bveRVOLjkV9+K/exP4/d44SmXbIu5e21a4sDJx5v80ttcJnbX3PfaI bb87XQwu8L1/d1zQeTeCnKES6EhqRIa09b+b+p+wluDQ1MYei0UPQWrQjvbVv1WbskRbzkYSYurX Y8Irq2mEShLGQaBHCfiSGj3aBrgFAiDQzwQCDqDoTbbRGVxtHOyh7qqlOwXlm8tjT5czu99mHi+O 3ZtR/vjPpfUV+uhgfUFtIAACIAACIAACLwkElRovRkz2LenxDPq36aPwaZOYqN5ZyETr8bEJ9naG jZzU0jEx/vPDzP2r1fV8ALXBt3vFAQIgAAIgAAIg0CGBoFKD9krdezF0YqszDlBwbK8Xxo4L7NQU G0nVq9vTt+XpDcbO5tgvRRaJjP2Q3/5urUNMVDyw+AhcsHOfYQEEQAAEQAAEDp1AUKmhKwmLzuBz NWxmoIXTVopYnNytsTfTmnlFYnuqtmU83zV+OMaOxdkv2MlHNL81nOphFQRAAARAAARAwJVAQKmx f+O21RkHS7xa3o4fo03W4prOUOvCnioIakybDaoy2mItqqmN+M9S9Xvzw7fG7daMgQf9vWk/Nh7Y 4J8aX/XzJiN6ZmPBg2WD2kAABEAABEDg8AkElBranbw193N/BqhRcxxso5pPqpqqUOpMpc1dG2yo SVu7JqI0vtNkQwIbimqxjV8w9vSh0S/SAfrmak7+6hl0DcHP8PzcAn9vymk1bix4sHhQGwiAAAiA AAgcMoHgUsNRZ3Q8S4OW1nBKVloRqm63wZ5ts10aPVGEISbGhPjrJD8UTWQIkZbgsHnmtcMpFLrO 4LLDGMM45C5F9SAAAiAAAiDQSwSCSo3WhAxKtJQFBTb4/Iz91HHzaAkvp2S13RxJsnqNNSTWlFmz IYwkZsaFmXfibLdCi3uwX0aZtrYGjaSIxrI8zNAVfeAlQNIxEhgAARAAARAAgX4lEFBqqHtMGBYo 0ZZm+8exaPRFShyLanMzD+QYPZ1RniqsLrFdheaEqnW5UGaFTZXF09rkUCFGr/WmkBprzRt99TBG Jg7EWVQCAj1NYH/3s1e3tArVY6rRat/2pHc3fBXnTXY3bsTiJad3V005vTgT2DgvePBd7NFhX21v 22XGxnp3oOs5PRr0m80XK7/GQ8ofUGpMnBmbPJtxShNnMy6rkne3JdGoUHl7hj2tacMoQ0yhtbwe KJRYNMmYtpgpe1J/+OY0qSJjvfqQB1cbeoTDdmqnKY9Vr5gGUEzWuhU+6S43WAMBWwJ8rzP6SH/j F5TH24CLWe5A4MNa3MklOt+2Lp7HI4221twb5b14J5B7oYutHGzb7tRMj6A8ZvN7pYVk1rsbh+6A d1f1nAGlRoCawisyej5bVFLsMakNNX5qdPmKSIk9XtFqrG4XlWT67IxVH5imaupTO3VhYZ03qhcx hUNMZbl2MdrHtNDweh+Wu0jA+idMP6P/GjZWZ/25z+8Ntpm9+GlrUL/f6D/mrG+4cScnO3HJ6LaR j/c2mhpl/Enq5eeptSInyLY5jZm5gjR1REhdbHTG2oN6j7hcFbbN9NJGJ5sml7zAN5ly6nTTBel0 fdpeh34v5k5UppfvYEh5BkFq0MBN+veFUnRauVdiWyX2VNJSdbu+9m2JTaR/mxPooRQcIAACQQkY f9kbbxvWn/vGiEiA315OBrnjukH+RvdKd8k29uDkEi8eDIktEFtTxpymVtje+K33Np2JsZm8rLG9 ti6ZQLnf160VWZ3XfW4b6dGxcyPceSPwtvBtO87axU4Xg7WxukFjK3xdALYXmOk61PNYr0/vfeT+ jetHtTEIUoOuFVIbmd9eE/5QKZ+4WnoiUiofvxr9rJT5IEtTSXxdTMgMAiBgJWD9PcfvHzy1vW04 IQ1c0Mt9uu2dNXBHG9vu3UiAxgaryOSSx3pD6mLvfDrJ6bGNuuhxEiJd9MGjS1YBys84RVA6vPI7 aWAnZQdEanAENEl17MwEaQ5KY+MZ0/yMTjChLAgccQL6r1jTD1N+vh9/ZpnC6b761/bnvi8LHjMf WEX8BmaNVVhDHR497/Fsnejjg2mabXccTNVh1DJQUiMMQLAJAiBgS8CLvPCSxzverljTI/nG26qu n7j+cHKpQwesxTs0qP/89c7QV04v7ul53NFZ6/Vi3FjKb36nlvapMnbpOL/kfV0D3cr8WuP5j7qt /Fcr2U+m6J/Ss3r+5vziTdo6pNGtmox2pCdSfil/6+tVq3FavIsW1QijUtgEgaNJ4KMPJxdv5FVa P9dy6N/02qOK/pXU/6YbAxjGP/T66LhuzxQrtrXgC77pR6euD0z3G+Ntw3oLsfXf3VW9ItubnBMQ yuxSuwtPvZSX4twloyryfqZtTsrQYReb0NkqA+OV46XtRq+sV51Ow+q5qTlGbvwjX6Mb+sVgvfz4 RyYHjD1u6n3rxeDRprUiU/ODtcjXt7KTzJAandBDWRDoAwJ+pUYvNCnwzaAXnIcPB0zA79XiN7/3 5oRn2bsPvZlzoAZQaOXS4l/KCxv5hY1C8a9l7Obam9ccvAIBJwI8FIy/17hCvBPgUQGPwyv6WIPH /B7dwHXbFtSASA1auev6Rn762dzyP5W2x+XiqepCvDD5Xx+R5qCP2lJABhAAgV4gYJ2W2AtewYde JuDrmglprqUvH3oZZni+DYLUUHaVuc1c4yybfGMiM5QShxPxaEIYjjaibDVZzm3l3NWG333X/OYP r/NgGQRAAARAAAR6n8AgSI38vUL0rDjDJlK0qyuLJViCVigXBCHSWox8+816YbPQtiecBASERVt0 yAACIAACIAACLgT6XmpQxKKSkjNslHY8qbG6zBoyk3mDSW3EWmqjlKi2nbfhtPUatmTD9wcEQAAE QAAEOiEQUGrUNsuVD2crf8hb6y59kS99OLu9XurELe9lS/dLwvGYyBISk/KXVpcvFSm8QcXlK/Vc NCv/Xs0fv0ojKaXvzf6Y9kjj0QvTdmvGM6b8/KOubEPvvbHICQIgAAIgAAJ9RyCg1BB+n8tEhczG WuXzBWObS58v0MmJ57J800aFhEGnslNle0xi8sKl1VtLs+ml5MylhbmhKTYkZC8tFP7jWk5dpnqr z2vG2kkiWHdTc3HPmt94BoMsYfQsbIIACIAACAwGgYBSoyGKrF5nv5nJbBa3X6gNTWdsFqOnxmrP JJUyBD1oFS+nZGtSVZslVmky4yCJtn18YWmO1Mbc8ExkyKsrfMN3HrFoO3SCqIZXrMgHAiAAAiBw hAkElBqjf16s/sQY7aR6fiqzVSSRoesM6X65cvzk9NfzganSaqFOyWpTHE4qiiLt1U8uiTOXctuX astLc0W2TVqDpmnwV4pwJIeDSx+nhlj3jg/cZBQEARAAARAAgUElEFBqEA5x41bpZ8Y2SwLtcLZZ 1OIZY2P1arkcFyfXbx0Yr8mxTPMHWVEaFNVIL6Uml9JFVokyYWppgkId9LrA1oQddeJUxqNLPLDR NqRhtIYBFI9skQ0EQAAEQOAIEgguNQjW6Pqt4lBELW9HxzOkM5T71dIxceIAdQb5QHvEp+ujDUVh apMCGAKLamEMw9FQ5LSUNO3yyvWE90md1vzGM750yRG8yNBkEAABEACBo0ygI6lB4NRkUm3d5tme 2lAbzWTy4GnOnskm7jXrO+SHouuMSGvkpKhuCxtqdnzG6pVp+MMoF2zfW4dLfE0sPXgsqBEEQAAE QAAEeoFAR1KD5mek72njJkq1Wq9WxeRoZmN19dVnUg6gkfFj0fz5/NhWovKXyppSKrMapVW1tPb9 2uhGLH82R5GPA3ADVYAACIAACIAACFgJBJcams74bjXe0hnFaOLbY6JUq4lviJn15UNRG7kL14pv 5aermfidRvROY7qcXj4+f+38VegMXPcgAAIgAAIgcIgEAkoNWqcrtbEcP51RHmg6g+Zn0FTQ0ohY eyyJI2LmbqH45QGtq2FkR6pianwidyE3fyF3bnwCIuMQLyxUDQIgAAIgAAKcQECpoX5XSiRHdZ3B bWlq442T5WdSQoiy9SIQgwAIgAAIgAAIgEBAqSH8Zrr4vLH8K/PzJtPrtypjmeXhGK3u1bNw6cGT 0Uvlg3/tWSBwDARAAARAAATCI/Ba4/mPuvX8VyvZT6bon9Kzev7m/OLNgqo2wqhbeiLll/K3vl61 Gqd1Qmn9rjAq1W2SzgjVvq3x6ldpPBN78NhRIxH46MPJxRt5da9ppaF/02uPKk5fSTAEARAAgQ4J BIxqdFhrF4vnb6/p6fqfVi5/vnD507nLV+boDf3T+KleKd31u+iAR1OpT7Y95kQ2EAABEAABEBgk An0vNagzshfPTb+Tiam1mbHlxUvFxc+Ki5dWFv9lfurX87E9afpshjIY++xQ7vqHom8G6UpFW0AA BEAABPqUwCBIjYWvVua+mG3sSasPUvnvxvLfjebvJfP3Tha/Fxo7q7k/zFIGY/f4uutXlsY8dq17 zkPRNx49RzYQAAEQAAEQCI/AIEiNxNDDxc+j2Y+z2Q8msxdHsxfi2fNq9rycPS/NnK3Nf7iaEOQO oxpGGeFdfATWN+H1NyyDAAiAAAiAwAET6Hupoew0pLqU30jkb2/nbxe11zv1/Ho0vy7mN04WtPBG UpJKyo6qk/UV1bD2R7BZpYhqHPCVjepAAARAAAR6hEDfSw1Zrl/7WMlenMheSGQvRLMXhOwF1kpq 9kIze0Gh2Ma19yvy85eBDbrrU2SCJ+oG/Q1/r3eMKXphzK+XMpblBZ0sdKhveuRygRsgAAIgAAIg 4JdA30sNpsr5ddaKZ1TytyUtpHGH5e8I+bvx/N1E/q4W28jfEymbKapBwQlKpAz0N+7seDZjHn6G G2nLHVGNtoiQAQRAAARAYCAJ9KLUoKU1nJJNH+yx7FmaliFrkYyLFMzgUY1I67X1/nwje7ZmLBjq XV9XHlzEmPTNQF5DaBQIgAAIgAAIuBDoOalB63e5JJuWCNH83dh+POO2kr+j5u+y/F2KasS0RDM2 tEkbo4zFDveuH6q+wSUOAiAAAiAAAj1LoOekhl9S0YQ4eeJh9r1qK7DRzF6MZi8msxfFl+m8Ovlr OfGruG457Lu+Pi5jbAvmavjtWeQHARAAARAYDAJ9LzUS8Vhu49387bgWz7gT0SZq3JZfTWpuPRM9 5imqwVWCdbKnft7Y63pOL8+khK1vBuNyRCtAAARAAAQGj0DfSw3qkrnPczGasTH+UAtsXIy1UqKV Ytl3SjEWpQzGnqO7vi4ObN/o8z2plDEDf286Y7Vge5UgqjF4Xx60CARAAARAwAuBQZAaq5vb8vDl yzffvX6jkf+qlP+mkv9mm95c//fS5S/SMptcvVc6yLEM04RQXjWiGl4uR+QBARAAARAYPAKDIDWo V4SokDw1wV6fqT3N1KqxWjVRe5pmw1PJVIY+MnVbV+76LoMmth8hqjF4Xx60CARAAARAwAuBnttE 3ovTHeZ57bXXuqI2/LrhZfkNvzaRHwTaEsAm8m0RIQMIgECoBAYkquGLEekMHmM4+FdffiIzCIAA CIAACAwAgaMY1RiAbkMTQMA7AUQ1vLNCThAAgTAIHMWoRhgcYRMEQAAEQAAEQMCWAKQGLgwQAAEQ AAEQAIEQCUBqhAgXpkEABEAABEAABCA1cA2AAAiAAAiAAAiESABSI0S4MA0CIAACIAACIACpgWsA BEAABEAABEAgRAKQGiHChWkQAAEQAAEQAAFIDVwDIAACIAACIAACIRKA1AgRLkyDAAiAAAiAAAhA auAaAAEQAAEQAAEQCJEApEaIcGEaBEAABEAABEAAUgPXAAiAAAiAAAiAQIgEIDVChAvTIAACIAAC IAACkBq4BkAABEAABEAABEIkAKkRIlyYBgEQAAEQAAEQgNTANQACIAACIAACIBAiAUiNEOHCNAiA AAiAAAiAAKQGrgEQAAEQAAEQAIEQCUBqhAgXpkEABEAABEAABCA1cA2AAAiAAAiAAAiESABSI0S4 MA0CIAACIAACIACpgWsABEAABEAABEAgRAKQGiHChWkQAAEQAAEQAAFIDVwDIAACIAACIAACIRKA 1AgRLkyDAAiAAAiAAAhAauAaAAEQAAEQAAEQCJEApEaIcGEaBEAABEAABEAAUgPXAAiAAAiAAAiA QIgEIDVChAvTIAACIAACIAACkBq4BkAABEAABEAABEIkAKkRIlyYBgEQAAEQAAEQgNTANQACIAAC IAACIBAiAUiNEOHCNAiAAAiAAAiAAKQGrgEQAAEQAAEQAIEQCUBqhAgXpkEABEAABEAABCA1cA2A AAiAAAiAAAiESABSI0S4MA0CIAACIAACIACpgWsABEAABEAABEAgRAKQGiHChWkQAAEQAAEQAAFI DVwDIAACTBhi0WgMIEAABEAgDAKvNZ7/qNvNf7WS/WSK/ik9q+dvzi/eLKhqI4xapSdSfil/6+vV MIzDJgiAgJHARx9OLt7Iq3tNKxb9my4/k9Y2VuXndWUnlK88egQEQOAoE4DUOMq9j7YfCQIuUkOu 1xdu7P+oEIYiRwIHGgkCIHDgBA5HatBPqMKfV+Zv3Drw9qJCEDhyBGavfJT7fc42qtFQFIovTr8/ xQTojCN3YaDBIHBgBA5HajR2FERrD6yPUdFRJkAzMJJvJqcvTNtKDSKzenel9oOkKBg3OcqXCdoO AuESOBypQW1CtDbcjoV1EHiVgJPU0HMJAqaF4qIBARAIhcChSY1QWgOjIAACIAACIAACPUbA/mFX evINBwiAAAiAAAiAAAh0TsA+qqFPFhPfEDuvAxa6SICeTuyiNZgCARAAARAAgbAJ2EsNqpVPFpv7 /FrYHsC+LwKzn836yo/MIAACIAACIHC4BBylBl/bB6tsHW73WGvX1ki4Weg1r+APCIAACIAACDgR gNTos2uDS42QVnHtMxZwFwRAAARAoB8IYA+Ufugl+AgCIAACIAACfUvAg9TYYwypRwj07XUGx0EA BEAABI4sAQ9Sg6kMqVcIHNkLFQ0HARAAARDoVwJepMYhtO21X3RnRwaPdjxmOwQQqBIEQAAEQAAE +pxAF6SG7X2aTuqJEIV0LzfV0vW+COC20SWPxT1m63rrYBAEQAAEQAAEDoBAO6nRbo7C/m3y1Wx0 8u/Npp5oqge99zfhg5ruoWpTLTZFPNjRSjll81jc4Cp3icrtv2nXCrfabcsewEWBKkAABEAABECg ewTaSQ2mqs7ptUik2dQ2hDTlsZ6hnJSHXnnS3/OC+nn+ESXdgrGIsRZetdU3U35bO3otvGqX6rR4 zAuHTf7rZY3WdH9MBKytMJ4x1eICvDVpBgcIgAAIgAAI9BOBtlLDsTGRSIzrDOtB5+lTnkyf0kf8 U/0Nz8D/yT/Si+jZTOddALe149451uL8DJWydcYFgksrjKaMze+nCwe+ggAIgAAIgIA3AsGlBr/7 cmXgJCm8SwQnb50kS7fym+z4rc5JbLU1ayXmrb+QCwRAAARAAAT6jIAHqeEw26D5U4MnLSZBr06T EuhjfTIEf2+cG2H81PjRi/N6LeYqdFOGerVogcErm3pNtb/qmGNx11L2DTe61+Lz0rG9/X/uCzWX mSJWpH12dcFdEAABEAABEGAepEb7JSWIo8vaG/xT46v+T+t505mXliOvU/jkZS3Nn2TTGUMtPJtt vcaP3LOZHDb6bOu2iYCRiX0rqAkWLG2XMMElCwIgAAIgAAJ9RsCL1PDdpMjrCT29uKG2MWKbv6Un 9k1Z7Rg/pWxUgfGMsT7TeY/ZjAZNxj02ivtgbYWpUXoG36BRAARAAARAAAR6nkC77daWllVVCbsV kVii2eA/8XG4ERCE6EeXprHdGq4SEAABEACBPiIQSlSjj9oPV0EABEAABEAABEIl4BjVoFrzN/Mz l7LR4Yi6p61JheNwCQhDEWW3WVjKX/1sDpvIH25foHYQAAEQAAHvBNykRmmzRLe39NiYEDUvj+G9 AuTsFgFFaWxvUY+wiXemlV2MN3WLK+yAAAiAAAiES8BNalDN21vlarUiPZPC9QLWPRAQR8RUKpkZ f5fyIs7kARiygAAIgAAI9ASBNlKDfKTABhsSesJZOEEE9lToDFwIIAACIAACfUSgvdToo8bAVRAA ARAAARAAgV4j8P8Bu3rpaGSy2N0AAAAASUVORK5CYII= ------=_NextPart_000_0000_01C8492E.34CF6730 Content-Type: image/png Content-Transfer-Encoding: base64 Content-Location: http://assets.devx.com/articlefigs/16497.png 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 ------=_NextPart_000_0000_01C8492E.34CF6730 Content-Type: text/css; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable Content-Location: http://www.devx.com/styles/cps.css .error { BORDER-RIGHT: red 2px solid; PADDING-RIGHT: 10px; BORDER-TOP: red 2px = solid; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; MARGIN: 20px; FONT: = 11px Verdana, Geneva, Arial, Helvetica, sans-serif; BORDER-LEFT: red 2px = solid; COLOR: black; PADDING-TOP: 10px; BORDER-BOTTOM: red 2px solid; = BACKGROUND-COLOR: white } .message { BORDER-RIGHT: green 2px solid; PADDING-RIGHT: 10px; BORDER-TOP: green = 2px solid; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; MARGIN: 20px; FONT: = 11px Verdana, Geneva, Arial, Helvetica, sans-serif; BORDER-LEFT: green = 2px solid; COLOR: black; PADDING-TOP: 10px; BORDER-BOTTOM: green 2px = solid; BACKGROUND-COLOR: white } .copyright { FONT-WEIGHT: bold; FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Verdana, = Arial, Helvetica, sans-serif; TEXT-ALIGN: center } .formFieldError { FONT-WEIGHT: bold; FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Verdana, = Arial, Helvetica, sans-serif; TEXT-ALIGN: right } .billingMessage { FONT-WEIGHT: bold; FONT-SIZE: 11px; COLOR: red; FONT-STYLE: italic; = FONT-FAMILY: Verdana, Arial, Helvetica, sans-serif; TEXT-ALIGN: left } .imgBtn { BORDER-RIGHT: medium none; BORDER-TOP: medium none; BORDER-LEFT: medium = none; CURSOR: hand; BORDER-BOTTOM: medium none } .stageControlBar { BORDER-RIGHT: #6f6c60 2px solid; BORDER-TOP: white 2px solid; = BORDER-LEFT: white 2px solid; BORDER-BOTTOM: #6f6c60 2px solid; = BACKGROUND-COLOR: #cdccc5 } .smOptionTag { FONT-WEIGHT: bold; FONT-SIZE: 10px; LEFT: 0px; LINE-HEIGHT: 14px; = FONT-FAMILY: Verdana, Arial, Helvetica, sans-serif; POSITION: relative; = TOP: -2px } .menuItems { MARGIN-LEFT: 3px; BORDER-BOTTOM: white 1px solid } .taxTypesDiv { BORDER-RIGHT: black 2px solid; PADDING-RIGHT: 3px; BORDER-TOP: black = 2px solid; PADDING-LEFT: 3px; LEFT: 0px; PADDING-BOTTOM: 3px; = BORDER-LEFT: black 2px solid; PADDING-TOP: 3px; BORDER-BOTTOM: black 2px = solid; POSITION: absolute; TOP: 16px; BACKGROUND-COLOR: #d3d3d3; = TEXT-ALIGN: left } .navBar { BORDER-RIGHT: #e0c189 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: white = 1px solid; MARGIN-TOP: 2px; PADDING-LEFT: 5px; PADDING-BOTTOM: 5px; = MARGIN-LEFT: 2px; VERTICAL-ALIGN: top; BORDER-LEFT: white 1px solid; = PADDING-TOP: 5px; BORDER-BOTTOM: #e0c189 1px solid; BACKGROUND-COLOR: = #fff5ce } .tabOn { BORDER-RIGHT: gray 2px solid; PADDING-RIGHT: 5px; BORDER-TOP: #eeeeee = 2px solid; PADDING-LEFT: 5px; BACKGROUND: silver; PADDING-BOTTOM: 3px; = FONT: bold 11px Verdana, Geneva, Arial, Helvetica, sans-serif; = BORDER-LEFT: #eeeeee 2px solid; CURSOR: pointer; COLOR: white; = PADDING-TOP: 3px; BORDER-BOTTOM: silver 2px solid; TEXT-ALIGN: center } .widgetBox { BORDER-RIGHT: pink 1px solid; BORDER-TOP: pink 1px solid; MARGIN: 1px; = BORDER-LEFT: pink 1px solid; BORDER-BOTTOM: pink 1px solid } .widgetEdit { BACKGROUND: silver; OVERFLOW: hidden; WIDTH: 100%; HEIGHT: 15px; = TEXT-ALIGN: left } .widgetName { LEFT: 0px; FONT: 9px Verdana, Geneva, Arial, Helvetica, sans-serif; = POSITION: relative; TOP: -2px } .tabOff { BORDER-RIGHT: gray 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #d3d3d3 = 1px solid; PADDING-LEFT: 5px; BACKGROUND: darkgray; PADDING-BOTTOM: 3px; = FONT: bold 11px Verdana, Geneva, Arial, Helvetica, sans-serif; = BORDER-LEFT: #d3d3d3 1px solid; CURSOR: hand; COLOR: white; PADDING-TOP: = 3px; BORDER-BOTTOM: #d3d3d3 2px solid; TEXT-ALIGN: center } .tabCardBG { BORDER-RIGHT: gray 2px solid; PADDING-RIGHT: 10px; PADDING-LEFT: 10px; = BACKGROUND: silver; PADDING-BOTTOM: 10px; BORDER-LEFT: #eeeeee 2px = solid; PADDING-TOP: 10px; BORDER-BOTTOM: gray 2px solid } .tabCardPosition { LEFT: 0px; POSITION: relative; TOP: 0px } .tabCardFirst { LEFT: 0px; VISIBILITY: visible; OVERFLOW: auto; POSITION: absolute; = TOP: 0px } .tabCard { LEFT: 0px; VISIBILITY: hidden; OVERFLOW: auto; POSITION: absolute; TOP: = 0px } .pageTitle { BORDER-RIGHT: #3d583e 2px solid; PADDING-RIGHT: 10px; BORDER-TOP: = #6495ed 2px solid; PADDING-LEFT: 10px; BACKGROUND: #aaaaaa; = PADDING-BOTTOM: 5px; FONT: bold 16px Verdana, Geneva, Arial, Helvetica, = sans-serif; BORDER-LEFT: #6495ed 2px solid; COLOR: white; PADDING-TOP: = 5px; BORDER-BOTTOM: #3d583e 2px solid } .miniPageTitle { BORDER-RIGHT: #3d583e 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: = #6495ed 1px solid; PADDING-LEFT: 5px; BACKGROUND: #0000cd; = MARGIN-BOTTOM: 10px; PADDING-BOTTOM: 5px; FONT: bold 10px Verdana, = Geneva, Arial, Helvetica, sans-serif; BORDER-LEFT: #6495ed 1px solid; = COLOR: white; PADDING-TOP: 3px; BORDER-BOTTOM: #3d583e 1px solid } .dlgBox { BORDER-RIGHT: black 2px solid; PADDING-RIGHT: 2px; BORDER-TOP: black = 1px solid; PADDING-LEFT: 2px; RIGHT: 0px; BACKGROUND: silver; LEFT: 0px; = PADDING-BOTTOM: 2px; BORDER-LEFT: black 1px solid; PADDING-TOP: 2px; = BORDER-BOTTOM: black 2px solid; POSITION: absolute } .insetBox { BORDER-RIGHT: #d3d3d3 1px solid; BORDER-TOP: gray 1px solid; = BORDER-LEFT: gray 1px solid; BORDER-BOTTOM: #d3d3d3 1px solid } TH { BORDER-RIGHT: black 1px solid; BORDER-TOP: #6495ed 1px solid; FONT: = bold 11px Verdana, Geneva, Arial, Helvetica, sans-serif; BORDER-LEFT: = #6495ed 1px solid; COLOR: #ffffff; BORDER-BOTTOM: black 1px solid; = BACKGROUND-COLOR: #0000cd } TH.subHead { BORDER-RIGHT: black 1px solid; BORDER-TOP: #f5f5f5 1px solid; FONT: = 10px Verdana, Geneva, Arial, Helvetica, sans-serif; BORDER-LEFT: #f5f5f5 = 1px solid; COLOR: black; BORDER-BOTTOM: black 1px solid; = BACKGROUND-COLOR: #d3d3d3 } .simpleBox { BORDER-RIGHT: black 1px solid; BORDER-TOP: black 1px solid; = BORDER-LEFT: black 1px solid; BORDER-BOTTOM: black 1px solid; = BACKGROUND-COLOR: #ffffff } .grayLineAbove { BORDER-TOP: silver 1px solid } .menuDiv { BORDER-RIGHT: #3d583e 1px solid; BORDER-TOP: #6495ed 1px solid; = MARGIN-TOP: 10px; BACKGROUND: #0000cd; MARGIN-BOTTOM: 5px; = PADDING-BOTTOM: 2px; FONT: bold 11px Verdana, Geneva, Arial, Helvetica, = sans-serif; BORDER-LEFT: #6495ed 1px solid; COLOR: white; PADDING-TOP: = 2px; BORDER-BOTTOM: #3d583e 1px solid } TH.tableSort { FONT-WEIGHT: normal; FONT-SIZE: 8pt; CURSOR: hand; COLOR: white; = FONT-FAMILY: Verdana, Arial, Helvetica, sans-serif; BACKGROUND-COLOR: = #0000cd; TEXT-DECORATION: none } TH.tableSortOver { BORDER-RIGHT: 1px solid; BORDER-TOP: black 1px solid; FONT-WEIGHT: = normal; FONT-SIZE: 8pt; BORDER-LEFT: black 1px solid; CURSOR: hand; = COLOR: #000000; BORDER-BOTTOM: #c0c0c0 1px solid; FONT-FAMILY: Verdana, = Arial, Helvetica, sans-serif; BACKGROUND-COLOR: #b9ceba; = TEXT-DECORATION: none } .disabledText { OVERFLOW-Y: scroll; FONT-SIZE: 12px; OVERFLOW-X: scroll; WIDTH: 600px; = WORD-BREAK: normal; FONT-FAMILY: monospace; HEIGHT: 230px; = BACKGROUND-COLOR: #f5f5f5 } .fieldLabel { FONT-WEIGHT: bold; FONT-SIZE: 11px; FONT-FAMILY: Verdana, Arial, = Helvetica, sans-serif; TEXT-ALIGN: right } .fieldLabelLeft { FONT-WEIGHT: bold; FONT-SIZE: 11px; FONT-FAMILY: Verdana, Arial, = Helvetica, sans-serif; TEXT-ALIGN: left } .fieldEntry { FONT-SIZE: 11px; FONT-FAMILY: Verdana, Arial, Helvetica, sans-serif } .smOptionTag { FONT-WEIGHT: bold; FONT-SIZE: 10px; LEFT: 0px; LINE-HEIGHT: 14px; = FONT-FAMILY: Verdana, Arial, Helvetica, sans-serif; POSITION: relative; = TOP: -2px } .smTag { FONT-WEIGHT: bold; FONT-SIZE: 10px; LEFT: 0px; FONT-FAMILY: Verdana, = Arial, Helvetica, sans-serif } A:hover { TEXT-DECORATION: underline } .navItem { FONT: bold 11px Verdana, Geneva, Arial, Helvetica, sans-serif; COLOR: = blue; TEXT-DECORATION: none } .navItemDiv { PADDING-BOTTOM: 1px; MARGIN-LEFT: 3px; PADDING-TOP: 1px; BORDER-BOTTOM: = white 1px solid } .mdSans { FONT: 11px Verdana, Geneva, Arial, Helvetica, sans-serif } .mdBldSans { FONT: bold 11px Verdana, Geneva, Arial, Helvetica, sans-serif } .smFieldLabel { FONT-WEIGHT: bold; FONT-SIZE: 10px; LINE-HEIGHT: 14px; FONT-FAMILY: = Verdana, Arial, Helvetica, sans-serif } .smBtn { FONT-WEIGHT: bold; FONT-SIZE: 10px; FONT-FAMILY: Verdana, Arial, = Helvetica, sans-serif } TD { FONT-SIZE: smaller; FONT-FAMILY: Arial, Helvetica, Sans-serif } .tinyMessage { FONT-SIZE: 8pt; FONT-FAMILY: Arial, Helvetica, Sans-serif } .btnBar { MARGIN-TOP: 5px; MARGIN-BOTTOM: 5px; TEXT-ALIGN: center } .regFeedback { FONT-WEIGHT: bold; COLOR: red } .surveyQuestion { FONT: 11px Verdana, Geneva, Arial, Helvetica, sans-serif; COLOR: black } .surveyInstructions { FONT: italic 10px "Tahoma", Geneva, Arial, Helvetica, sans-serif; = BACKGROUND-COLOR: #99ff66 } .surveyChoice { FONT: 10px "Comic Sans MS", Geneva, Arial, Helvetica, sans-serif } .surveyRequired { COLOR: red } .surveyQEHeaderText { FONT-WEIGHT: normal; FONT-SIZE: 12px; COLOR: #000000; FONT-FAMILY: = Futura, Arial, Helvetica, sans-serif; TEXT-DECORATION: none } .surveyQEFooterText { FONT-WEIGHT: normal; FONT-SIZE: 12px; COLOR: #000000; FONT-FAMILY: = Futura, Arial, Helvetica, sans-serif; TEXT-DECORATION: none } A { COLOR: #003366; TEXT-DECORATION: none } A.leftnav { COLOR: #ffffff } A.rightnav { COLOR: #336699 } A:hover { TEXT-DECORATION: underline } .smallerfont { FONT-SIZE: 10px; FONT-FAMILY: Arial, Helvetica, Sans-Serif } .smallfont { FONT-SIZE: 11px; FONT-FAMILY: Arial, Helvetica, Sans-Serif } .smallfontRight { FONT-SIZE: 11px; FONT-FAMILY: Arial, Helvetica, Sans-Serif; TEXT-ALIGN: = right; TEXT-DECORATION: underline } .newsletterFont { FONT-SIZE: 11px; COLOR: #336699; FONT-FAMILY: Arial, Helvetica, = Sans-Serif } .doorFeatureAreaLabel { FONT-WEIGHT: bolder; FONT-SIZE: 16px; COLOR: #003366; FONT-FAMILY: = Verdana, Arial, Helvetica, Sans-Serif } .doorFeatureArea { FONT-SIZE: 11px; FONT-FAMILY: Arial, Helvetica, Sans-Serif } .doorFeatureAreaTitle { FONT-SIZE: 14px; FONT-FAMILY: Arial, Helvetica, Sans-Serif } .articleTitle { FONT-WEIGHT: bolder; FONT-SIZE: 16px; COLOR: #336699; FONT-FAMILY: = Verdana, Arial, Helvetica, Sans-Serif } .articleDek { MARGIN-TOP: 0px; FONT-WEIGHT: bolder; FONT-SIZE: 12px; FONT-STYLE: = italic; FONT-FAMILY: Verdana, Arial, Helvetica, Sans-Serif } .articleAuthor { MARGIN-TOP: 12px; FONT-SIZE: 10px; FONT-STYLE: normal; FONT-FAMILY: = Arial, Helvetica, Sans-Serif } .articleBio { FONT-SIZE: 11px; FONT-STYLE: italic; FONT-FAMILY: Arial, Helvetica, = Sans-Serif } A.downloadLink { FONT-WEIGHT: bold; FONT-SIZE: 11px; COLOR: #336699; FONT-FAMILY: Arial, = Helvetica, Sans-Serif } .downloadMoreLink { FONT-WEIGHT: bold; FONT-SIZE: 12px; COLOR: #336699; FONT-FAMILY: Arial, = Helvetica, Sans-Serif } A.FeaturedBoxLink { FONT-WEIGHT: bolder; FONT-SIZE: 11px; COLOR: #336699; FONT-FAMILY: = Arial, Helvetica, Sans-Serif } .downloadText { FONT-SIZE: 11px; COLOR: #336699; FONT-FAMILY: Arial, Helvetica, = Sans-Serif } .regFeedback { COLOR: red } .regTopLabel { FONT-WEIGHT: bolder; FONT-SIZE: 16px; COLOR: #003366; FONT-FAMILY: = Verdana, Arial, Helvetica, Sans-Serif } .regLabel { FONT-WEIGHT: bolder; FONT-SIZE: 12px; COLOR: #003366; FONT-FAMILY: = Arial, Helvetica, Sans-Serif } .downloadTopTitle { FONT-WEIGHT: bolder; FONT-SIZE: 16px; COLOR: #336699; FONT-FAMILY: = Verdana, Arial, Helvetica, Sans-Serif } .downloadIntro { FONT-SIZE: 13px; FONT-FAMILY: Verdana, Arial, Helvetica, Sans-Serif } A.downloadTryIt { FONT-SIZE: 12px; COLOR: #ff6600; FONT-FAMILY: Arial, Helvetica, = Sans-Serif } .downloadTitle { FONT-WEIGHT: bolder; FONT-SIZE: 14px; COLOR: #336699; FONT-FAMILY: = Verdana, Arial, Helvetica, Sans-Serif } .smallestText { FONT-SIZE: 10px; FONT-FAMILY: Arial, Helvetica, Sans-Serif } .licenseAgreement { FONT-WEIGHT: bolder; FONT-SIZE: 14px; COLOR: #336699; FONT-FAMILY: = Verdana, Arial, Helvetica, Sans-Serif } .licenseDesc { FONT-SIZE: 11px; FONT-STYLE: italic; FONT-FAMILY: Arial, Helvetica, = Sans-Serif } A.discMsgNavLink { =09 } A.discMsgNavLinkDisabled { =09 } A.discTopicLink { FONT-SIZE: 12px; COLOR: #336699; FONT-FAMILY: Arial, Helvetica, = Sans-Serif } .discTopOfPageTD { =09 } .discTopicsTD { FONT-SIZE: 12px; COLOR: #336699; FONT-FAMILY: Arial, Helvetica, = Sans-Serif } .discAuthorTH { =09 } .discAuthorTD { =09 } .discDatePostedTH { =09 } .discDatePostedTD { =09 } .discMsgSubjectTH { =09 } .discMsgSubjectTD { =09 } .discSimpleBox { =09 } .discAuthorLabel { FONT-WEIGHT: bolder; FONT-SIZE: 12px; COLOR: #336699; FONT-FAMILY: = Arial, Helvetica, Sans-Serif } .discAuthorEntry { FONT-SIZE: 12px; COLOR: #000000; FONT-FAMILY: Arial, Helvetica, = Sans-Serif } .discDatePostedLabel { FONT-WEIGHT: bolder; FONT-SIZE: 12px; COLOR: #336699; FONT-FAMILY: = Arial, Helvetica, Sans-Serif } .discDatePostedEntry { FONT-SIZE: 12px; COLOR: #000000; FONT-FAMILY: Arial, Helvetica, = Sans-Serif } .discSubjectLabel { FONT-WEIGHT: bolder; FONT-SIZE: 12px; COLOR: #336699; FONT-FAMILY: = Arial, Helvetica, Sans-Serif } .discSubjectEntry { FONT-WEIGHT: bolder; FONT-SIZE: 12px; COLOR: #000000; FONT-FAMILY: = Arial, Helvetica, Sans-Serif } .discMsgBody { PADDING-RIGHT: 3px; PADDING-LEFT: 3px; FONT-SIZE: 12px; PADDING-BOTTOM: = 3px; COLOR: #000000; PADDING-TOP: 3px; FONT-FAMILY: Arial, Helvetica, = Sans-Serif; BACKGROUND-COLOR: #ccffff } .discRecentMsgsTH { =09 } .discRecentMsgsTD { =09 } .discRecentAuthorTH { =09 } .discRecentAuthorTD { =09 } .discRecentDatePostedTH { =09 } .discRecentDatePostedTD { =09 } .discSubjectTD { =09 } .discMessageTitle { FONT-WEIGHT: bolder; FONT-SIZE: 14px; COLOR: #336699; FONT-FAMILY: = Verdana, Arial, Helvetica, Sans-Serif } .discMultipage { =09 } .discPostAuthorLabel { FONT-WEIGHT: bolder; FONT-SIZE: 12px; COLOR: #000000; FONT-FAMILY: = Arial, Helvetica, Sans-Serif } .discPostEmailLabel { FONT-WEIGHT: bolder; FONT-SIZE: 12px; COLOR: #000000; FONT-FAMILY: = Arial, Helvetica, Sans-Serif } .discPostDatePostedLabel { =09 } .discPostSubjectLabel { FONT-WEIGHT: bolder; FONT-SIZE: 12px; COLOR: #336699; FONT-FAMILY: = Arial, Helvetica, Sans-Serif } .discPostParentMsgLabel { FONT-WEIGHT: bolder; FONT-SIZE: 12px; COLOR: #336699; FONT-FAMILY: = Arial, Helvetica, Sans-Serif } .discPostParentMsg { FONT-SIZE: 12px; COLOR: #003366; FONT-FAMILY: Arial, Helvetica, = Sans-Serif } .discPostFieldEntry { =09 } .discPostMsgLabel { FONT-WEIGHT: bolder; FONT-SIZE: 12px; COLOR: #336699; FONT-FAMILY: = Arial, Helvetica, Sans-Serif } .discPostMsgBody { =09 } .discFieldLabel { FONT-WEIGHT: bolder; FONT-SIZE: 12px; COLOR: #336699; FONT-FAMILY: = Verdana, Arial, Helvetica, Sans-Serif; TEXT-ALIGN: right } .discTblHead { PADDING-RIGHT: 2px; PADDING-LEFT: 2px; FONT-WEIGHT: bold; FONT-SIZE: = 11px; PADDING-BOTTOM: 2px; COLOR: #ffffff; PADDING-TOP: 2px; = FONT-FAMILY: Verdana, Arial, Helvetica, Sans-Serif; BACKGROUND-COLOR: = #336699 } .discHeader { PADDING-RIGHT: 2px; PADDING-LEFT: 2px; FONT-WEIGHT: bold; FONT-SIZE: = 11px; PADDING-BOTTOM: 2px; CURSOR: hand; COLOR: #ffffff; PADDING-TOP: = 2px; FONT-FAMILY: Arial, Helvetica, Sans-Serif; BACKGROUND-COLOR: = #394d8c } .discSortHeader { PADDING-RIGHT: 2px; PADDING-LEFT: 2px; FONT-WEIGHT: bold; FONT-SIZE: = 11px; PADDING-BOTTOM: 2px; CURSOR: hand; COLOR: #fed980; PADDING-TOP: = 2px; FONT-FAMILY: Verdana, Arial, Helvetica, Sans-Serif; = BACKGROUND-COLOR: #336699; TEXT-DECORATION: underline } .discAuthor { PADDING-RIGHT: 2px; PADDING-LEFT: 2px; FONT-SIZE: 11px; PADDING-BOTTOM: = 2px; COLOR: #000000; PADDING-TOP: 2px; FONT-FAMILY: Verdana, Arial, = Helvetica, Sans-Serif; BACKGROUND-COLOR: #ccffff } .HeadingStyle { FONT-WEIGHT: bold; FONT-SIZE: 16px; FONT-FAMILY: Arial, Helvetica, = sans-serif } .WhiteHeadingStyle { FONT-WEIGHT: bold; FONT-SIZE: 16px; COLOR: #ffffff; FONT-FAMILY: Arial, = Helvetica, sans-serif } .QuestionStyle { FONT-WEIGHT: normal; FONT-SIZE: 12px; FONT-FAMILY: Arial, Helvetica, = sans-serif } .InstructionStyle { FONT-WEIGHT: normal; FONT-SIZE: 12px; FONT-STYLE: italic; FONT-FAMILY: = Arial, Helvetica, sans-serif } .AnswerStyle { FONT-WEIGHT: normal; FONT-SIZE: 12px; FONT-FAMILY: Arial, Helvetica, = sans-serif } .ViewResultsStyle { FONT-WEIGHT: normal; FONT-SIZE: 11px; FONT-FAMILY: Arial, Helvetica, = sans-serif } .ScoreStyle { FONT-WEIGHT: normal; FONT-SIZE: 12px; FONT-FAMILY: Arial, Helvetica, = sans-serif } .TotalVotesStyle { FONT-WEIGHT: bold; FONT-SIZE: 12px; FONT-FAMILY: Arial, Helvetica, = sans-serif } .defaultText { FONT-WEIGHT: normal; FONT-SIZE: 12px; COLOR: #000000; FONT-FAMILY: = Arial, Helvetica, sans-serif; TEXT-DECORATION: none } CODE { FONT-SIZE: 110% } .smallwhitefont { FONT-SIZE: 11px; COLOR: #ffffff; FONT-FAMILY: Arial, Helvetica, = Sans-Serif } ------=_NextPart_000_0000_01C8492E.34CF6730 Content-Type: text/css; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable Content-Location: http://www.devx.com/styles/pf.css A { COLOR: #0000ff; TEXT-DECORATION: underline } .articleSubtitle { FONT-WEIGHT: bold; FONT-SIZE: 14px; COLOR: #000000; FONT-STYLE: normal; = FONT-FAMILY: Arial, Helvetica, Sans-Serif } .arthead { FONT-WEIGHT: bold; FONT-SIZE: 24px; COLOR: black; LINE-HEIGHT: 25px; = FONT-FAMILY: Verdana, Arial, Geneva } ------=_NextPart_000_0000_01C8492E.34CF6730 Content-Type: application/octet-stream Content-Transfer-Encoding: quoted-printable Content-Location: http://www.devx.com/scripts/globalFuncs.js function editWidget(widget_ID, host) { var winProps =3D = "width=3D850,height=3D600,titlebar=3D0,toolbar=3D0,location=3D0,menubar=3D= 0,scrollbars=3D1,resizable=3D1,channelmode=3D0,directories=3D0,status=3D1= "; = window.open("http://"+host+"/cms/popup.cfm?methodId=3D113&popup=3D1&wid=3D= " + widget_ID, "widgetEditor", winProps, true); } function editContent(content_id) { var winProps =3D = "width=3D800,height=3D570,titlebar=3D0,toolbar=3D0,location=3D0,menubar=3D= 0,scrollbars=3D1,resizable=3D1,channelmode=3D0,directories=3D0,status=3D1= "; window.open("/cms/popup.cfm?methodId=3D8&popup=3D1&id=3D" + content_id, = "contentEditor", winProps, true); } function popUpWindow(theURL, width, height) { var winProps =3D "width=3D" + width + ",height=3D" + height; winProps +=3D = ",titlebar=3D0,toolbar=3D0,location=3D0,menubar=3D0,scrollbars=3D1,resiza= ble=3D1,channelmode=3D0,directories=3D0,status=3D1"; window.open(theURL,"popUp",winProps,true); } function popUpNoResize(theURL, width, height) { var winProps =3D "width=3D" + width + ",height=3D" + height; winProps +=3D = ",titlebar=3D0,toolbar=3D0,location=3D0,menubar=3D0,scrollbars=3D1,resiza= ble=3D0,channelmode=3D0,directories=3D0,status=3D1"; window.open(theURL,"popUp",winProps,true); } function popUpNoScroll(theURL, width, height) { var winProps =3D "width=3D" + width + ",height=3D" + height; winProps +=3D = ",titlebar=3D0,toolbar=3D0,location=3D0,menubar=3D0,scrollbars=3D0,resiza= ble=3D1,channelmode=3D0,directories=3D0,status=3D1"; window.open(theURL,"popUp",winProps,true); } function emailCheck(emailStr) { /* author: Sandeep V. Tamhankar (stamhankar@hotmail.com) */ /* conforms closely to RFC 822. */ =09 /* The following pattern is used to check if the entered e-mail address = */ /* fits the user@domain format. It also is used to separate the = username */ /* from the domain. */ var emailPat=3D/^(.+)@(.+)$/; /* The following string represents the pattern for matching all special = */ /* characters. We don't want to allow special characters in the = address. */ /* These characters include ( ) < > @ , ; : \ " . [ ] */ var specialChars=3D"\\(\\)<>@,;:\\\\\\\"\\.\\[\\]"; /* The following string represents the range of characters allowed in a = */ /* username or domainname. It really states which chars aren't = allowed. */ var validChars=3D"\[^\\s" + specialChars + "\]"; /* The following pattern applies if the "user" is a quoted string (in = */ /* which case, there are no rules about which characters are allowed */ /* and which aren't; anything goes). E.g. "jiminy cricket"@disney.com = */ /* is a legal e-mail address. */ var quotedUser=3D"(\"[^\"]*\")"; /* The following pattern applies for domains that are IP addresses, = */ /* rather than symbolic names. E.g. joe@[123.124.233.4] is a legal */ /* e-mail address. NOTE: The square brackets are required. */ var ipDomainPat=3D/^\[(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})\]$/; /* The following string represents an atom (basically a series of = non-special characters.) */ var atom=3DvalidChars + '+'; /* The following string represents one word in the typical username.*/ /* For example, in john.doe@somewhere.com, john and doe are words. */ /* Basically, a word is either an atom or quoted string. */ var word=3D"(" + atom + "|" + quotedUser + ")"; // The following pattern describes the structure of the user var userPat=3Dnew RegExp("^" + word + "(\\." + word + ")*$"); /* The following pattern describes the structure of a normal symbolic = domain, as opposed to ipDomainPat, shown above. */ var domainPat=3Dnew RegExp("^" + atom + "(\\." + atom +")*$") ; /* Finally, let's start trying to figure out if the supplied address is = valid. */=09 /* Begin with the coarse pattern to simply break up user@domain into = different pieces that are easy to analyze. */ var matchArray=3DemailStr.match(emailPat); if (matchArray=3D=3Dnull) { /* Too many/few @'s or something; basically, this address doesn't even = fit the general mould of a valid e-mail address. */ alert("Email address seems incorrect (check @ and .'s)"); return false; } var user=3DmatchArray[1]; var domain=3DmatchArray[2]; =09 // See if "user" is valid=20 if (user.match(userPat)=3D=3Dnull) { // user is not valid alert("The username doesn't seem to be valid."); return false; } =09 /* if the e-mail address is at an IP address (as opposed to a symbolic = host name) make sure the IP address is valid. */ var IPArray=3Ddomain.match(ipDomainPat); if (IPArray!=3Dnull) { // this is an IP address for (var i=3D1;i<=3D4;i++) { if (IPArray[i]>255) { alert("Destination IP address is invalid!"); return false; } } return true; }=09 // Domain is symbolic name var domainArray=3Ddomain.match(domainPat); if (domainArray=3D=3Dnull) { alert("The domain name doesn't seem to be valid."); return false; }=09 /* domain name seems valid, but now make sure that it ends in a */ /* three-letter word (like com, edu, gov) or a two-letter word, */ /* representing country (uk, nl), and that there's a hostname = preceding */ /* the domain or country. */ =09 /* Now we need to break up the domain to get a count of how many atoms = it consists of. */ var atomPat=3Dnew RegExp(atom,"g"); var domArr=3Ddomain.match(atomPat); var len=3DdomArr.length; if (domArr[domArr.length-1].length<2 ||=20 domArr[domArr.length-1].length>4) { // the address must end in a two, three, or four letter word (four = letter to support the .name domain) alert("The address must end in a three or four letter domain, or two = letter country."); return false; } =09 // Make sure there's a host name preceding the domain. if (len<2) { var errStr=3D"This address is missing a hostname!"; alert(errStr); return false; } =09 // If we've gotten this far, everything's valid! return true; } function forgotPassword(email) { var theURL =3D "/passwordLookup.cfm?emailAddr=3D" + email; popUpWindow(theURL, 300,320); } function trackClick(contentID,destURL,userID,trackingKey,title) { var xmlhttp =3D false; var theURL =3D = "http://www.devx.com/RSSLinkTracker/RSSLinkTracker.cfm?contentID=3D" + = contentID + "&destURL=3D" + destURL + "&userID=3D" + userID + "&trk=3D" = + trackingKey + "&title=3D" + title; if (!xmlhttp && typeof XMLHttpRequest!=3D'undefined') { try { xmlhttp =3D new XMLHttpRequest(); } catch (e) { xmlhttp=3Dfalse; } } if (!xmlhttp && window.createRequest) { try { xmlhttp =3D window.createRequest(); } catch (e) { xmlhttp=3Dfalse; } } =09 xmlhttp.open("GET", theURL, true); =09 xmlhttp.send(null) } ------=_NextPart_000_0000_01C8492E.34CF6730--