You are viewing a plain text version of this content. The canonical link for it is here.
Posted to user@jmeter.apache.org by Olivier Schmitt <ol...@agriculture.gouv.fr> on 2007/03/14 13:05:17 UTC

Parameter value corruption

Hi,

i'm using jmeter 2.2.
I try to record a test plan with the proxy server.
My web app uses JSF 1.1.
The view state is saved in HTML in hidden input control.
A view state is a tree of JSF component state saved as a gzipped base64 string :

...
	ByteArrayOutputStream bos = new ByteArrayOutputStream();
         if (compress) {
             zos = new GZIPOutputStream(bos);
             oos = new ObjectOutputStream(zos);
         } else {
             oos = new ObjectOutputStream(bos);
         }
         oos.writeObject(view.getStructure());
         oos.writeObject(view.getState());
         oos.close();
         if (compress) {
             zos.close();
         }
         bos.close();

         hiddenField = " <input type=\"hidden\" name=\""
             + RIConstants.FACES_VIEW + "\"" + " value=\"" +
             (new String(Base64.encode(bos.toByteArray()), "ISO-8859-1")) +
             "\" />\n ";

...

sample :

H4sIAAAAAAAAAO19CXgcxZV/ayRZh2UsyZLlS/YQ29gGPDrm0OGQIMuyLVY+sM3...

When the current page is submitted by the browser, the proxy update the string into :

H4sIAAAAAAAAAO19CXgcxZV/ayRZh2UsyZLlS/YQ29gGPDrm0OGQIMuyLVY sM3...

the "+" char is missing at the end of the string !!!

So, JSF can not deserialized the string into objects : it crashes. (UTFDataFormatException, ZipException, ...)

I've remotly debugged jmeter to check when the value is altered.

When Proxy class record an HTTP request every parameter of the request is  always decoded.

The HTTPArgument class is used to represent a request parameter.

	public HTTPArgument(String name, String value, boolean alreadyEncoded) {
		setAlwaysEncoded(true);
		if (alreadyEncoded) {
			try {
				name = JOrphanUtils.decode(name, "UTF-8");
				value = JOrphanUtils.decode(value, "UTF-8");
			} catch (UnsupportedEncodingException e) {
				// UTF-8 unsupported? You must be joking!
				log.error("UTF-8 encoding not supported!");
				throw new Error(e.toString());
			}
		}
		setName(name);
		setValue(value);
		setMetaData("=");
	}

At least every parameter value is decoded with  URLDecoder.decode().

My parameter value is corrupted because of this call :

URLDecoder.decode("H4sIAAAAAAAAAO19CXgcxZVwz+iWZcuSJdv4HDDGds", "UTF-8")

returns H4sIAAAAAAAAAO19CXgcxZVwz iWZcuSJdv4HDDGds

Any idea ?







---------------------------------------------------------------------
To unsubscribe, e-mail: jmeter-user-unsubscribe@jakarta.apache.org
For additional commands, e-mail: jmeter-user-help@jakarta.apache.org


Re: Parameter value corruption

Posted by Olivier Schmitt <ol...@agriculture.gouv.fr>.
A bug has been discovered by jmeter dev team, here :

http://issues.apache.org/bugzilla/show_bug.cgi?id=41837

This is a problem of form encoding. JMeter handles multipart form encoding badly.

Thanks for your help.




---------------------------------------------------------------------
To unsubscribe, e-mail: jmeter-user-unsubscribe@jakarta.apache.org
For additional commands, e-mail: jmeter-user-help@jakarta.apache.org


Re: Parameter value corruption

Posted by Olivier Schmitt <ol...@agriculture.gouv.fr>.
I've checked again the behaviour of proxy.

Here is the stack trace :

HTTPArgument.<init>(String, String, boolean) line: 91	
MultipartUrlConfig.addEncodedArgument(String, String) line: 96	
MultipartUrlConfig.parseArguments(String) line: 127	
HttpRequestHdr.createSampler() line: 243	
HttpRequestHdr.getSampler() line: 182	
Proxy.run() line: 104	


The HTTPArgument constructor where decoding (corruption) is done :


	public HTTPArgument(String name, String value, boolean alreadyEncoded) {
		setAlwaysEncoded(true);
		if (alreadyEncoded) {
			try {
				name = JOrphanUtils.decode(name, "UTF-8");
				value = JOrphanUtils.decode(value, "UTF-8");
			} catch (UnsupportedEncodingException e) {
				// UTF-8 unsupported? You must be joking!
				log.error("UTF-8 encoding not supported!");
				throw new Error(e.toString());
			}
		}
		setName(name);
		setValue(value);
		setMetaData("=");
	}


As you can see in the following code, the method createSampler trigger the instianciation of HTTPArgument.
My value is corrupted before its used in GUI.

	public HTTPSamplerBase getSampler() throws MalformedURLException, IOException, ProtocolException {
		// Damn! A whole new GUI just to instantiate a test element?
		// Isn't there a beter way?
		HttpTestSampleGui tempGui = new HttpTestSampleGui();
		HTTPSamplerBase result = createSampler();
		tempGui.configure(result);
		tempGui.modifyTestElement(result);
		result.setFollowRedirects(false);
		result.setUseKeepAlive(true);
         	return result;
	}

> 
> Regardless of whether the JMeter proxy records the session correctly,
> to be useful, the test plan must be runnable independently.
> 

A sample of what kind of parameter i get with JSF :

agriForm:_idcl:agriForm=oid102panelcommand

agriForm:oid97value=25 RUE DES POTELOTS

agriForm:oid94value=3

agriForm:nomvalue=ALCIBIADE

com.sun.faces.VIEW:H4sIAAAAAAAAAO19CXgcxZVwz iWZcuSJdv4HDDGdsCjYy7JJgFZlm0R 
YgtO4A3QGumJbUZTY96emQ5ByEJR5Ldb5MQsknISU4cyAUhu/8m2RwmgUBOIAkhF7u5gHBfyS7Z8Nd7fVX3VM90z0wL4pW z V53dWvq169q169qr7pUa4uJ3OhpDQVzuUz4XE 
KeTCeUVMh0dlQTigyPmkkpeFjvGV21e955JQkKsd4RqTk2I6JQsZhescOcLP8F3wQNeALPPHRsScsnWEa0qm 
VxuDz8lKFy7WifNZya6CEIxM0Eq1MOblJzCLaEw7OJzk7v5LLkdFFPT3GVccDZLWrcEaqiNMt4x 6a7V7//dv5DNVxgmKvNia8VZrMcxwWO1pKyOQcPc1jWEbiOeZVdN 
ihbk1pDFmF2z4uhyek/EyYn5DFZD4N9AxLsihlwjOicFSjORmBrJQhNIVfU 
TePj4jpAf1qwRP7cViKqJhhbJDuxadpaFeW2vqba05E4g5W/DSSWUqHd5Fip0yn50Uk8NT/ISgoYwzXpqgrq3SrvUXIxqps6nEq/fmlWxeGRVmobd1BGFPj9E1BLttDcGLvayLEQtNYsXGzfqgvWrQuWqCdbHP2uJ4yTev16r29rhiORdXDbQdEkEbAXbiM6m0mLlUIaSddTsOI 
QBgmSxHQlBcFYJBINq7W15RZEyBEcLjYM8P RRIvikAvdUfLRIIOEi/hAuaicc3N2uU4S i3d26P3U7 
DVXXojo6TbO8pTBKOSlB7jZXu/e/qtrGZVAz3kfbvKe98gnxOYyqe76gqUTX4kmLV3vVa56k24lquIXSFWhz0iRdkj4sgeESZ7RKL NDJWtJExx0bGmI2MIXhQB7utQxJH8AIdjBl3F 
eOikpykh9LC9v4TEaQCWtuYGuQg8PEZSAOwqCUUXiRVCWP14/hQ7ZONzBJ0Vw22RTuZe6UmqYWO6aETH5zz 
aeLEiKqdrO8ShzCj8WHuXHaFFbaEE9692BAJy7CY5hRZiiETfqiMtkq3dS/e619BvuXkM1Xb2Ll6 lXlyGKBa8OFL0xRH2i8swEQUvjhZ9cZT94jLkuuDFsaIvjrFfbPdjynlxvOiL4 
wX2z2ecl6cKPriBPvFdpNQzov7ir64j/3iPu9m0dDSS1Uc9GtBT1O1trNrGTobmt9eeN9o/ALqnqHrtpXnGWyTZml90qSiHpNmDZrUq5cqmH 
xB6gNrBKbLZrNW0Yz0D5VwhD4PjY3NJu3rO9zxwdF3tfv/L5 xvuKTrdK8F0nII2XYLvCShauayu4bW1znOY5KH8OQoN3aJbBvti1hhcn0rmH0W4XPbRWKuih9balh9otRg 
j3fYeRu3Oc31VZCLKtsPN5i1rKyqxwPg tvltNm9Z31eJ4cX3sa1us3nL r5K7C2 j21sm81b1ve5M7NFOLSU6i 
sVMihbMXfbN5icWhPAYfatXZjdTjUWWtHGVo7WqnWjjpr7ShDa0cr1dpRZ60dZWjtqDut7fy mLM 0m5Z3hdzN2kv8j5n7tJuWd9XyeQC3 
es0WIMjRZzp9GKSKAbKxgtbgWjzlYw6mgFowVWMGq3gtWxETFnHRpj6NCYXYfWVqcVzjSKxRmtqGQege9z1jsxht6JVap3Ys56J8bQO7GieseK2dkmxRg2KVY02l12/ 
LOeifO0DvxSvVO3FnvxBl6J15U71jp6ayxYwyNHatUY8edNVqcodHilWq0WMSFRrNWKtBoMWc/T7vF0GixiF2jxez 
H3smWB0NE3eWkzhDTuKVhEjwfc4aLc7QaPFKNVrcWaPFGRotXlSjWTE7W4g4w0LE7RaCrWGqo3cSznonwdA7iUr1TsJZ7yQYeifhXu/EnfVOnKF34pXqnYSz3kkw9E6iqN6x9sTZ1sUZti5eqY 
dcNZGCcasM 
Fu1umsQeNuNGi8uAaNO7c57qhB4wUaNB6ZVbhzy1wAsCzgQWSuWhLKpmGRkVyvD1ffDJ/OE4Jyr/TYp6wsZQVZORY2swTsK6KJPhvvwFpWIlHxuvMA/lfwtgTBOOgRY1rMKeFBKZ2fKsQXL2OJGPHtSPPKKCyvFaCMUQTRF 
oSpdI0vC4bTwm5HD8hEI7D/3P2VvSpWRw/10HrumGikqVPL2FCtuvBFgEXEy/S/I0lVgyHM2Y6S2NGmtJZ/7xyWd9ASJO4hmAuJX/BSVJxQVYWjFbAxSPkYr16sQK6ulWukCUEi9L9dDKJmJQyNjVRUKdg4dpy17Jw3U8lmewpT9gPTEpH90nZg1l2tkl/UdtCKq1zWtk 
IKSFpAJrsjlSrRVa24tjIcIl0uCRctkih5jD6gv2ZgRQ/Zq 1V5BsB sEDvyHqHGmGRbBUKqlBlXDl4BQ5rhoTEULeDOVcCx1B28 FbgWPViBS9E2kcZ72s2bxivw 4V1VGkUrSEJlCHZpskpQU 
MzgpJC8ldl5/YUwfIq8ca9ULiJY1NrEyLN 4JE 
Fd4hCOsXCaPd5XczfsqWzxgztxssCrxMnUR3iANoBgragKyUnScEb9Kb0mYzxGf3xklEc1Lz4eL9V8eLjdlPsl94Ff7Wnu6e44i2sZNG8bQW3DdW70HILu/hGkFTM2eyxvWYBVu42qbHdqIqeQfB6nTruJszObny/m 
W//uLLf/3O00/tFuHNneUl/YwJqYI8O 
x4GXPYEuRYikTvLUEPRi1rnkHhfTPPgLqHw3iPMax248DmcvbVikLgqtuDDeuzuT3YMEwqDJ6Xk7k2M8VcS0Kva7j/myeWXvLjGi64g2tOS3xqB/EQJHmYa1ImifmZlNKp2ew553Lw13K0kZSLoQ0E96TAp/SENfKuNU4egTqT0VyXnu6E 
tys3royI9Jmp3u6GZ3u6dY6DeXjhe2Hy09S2J422tdva1 Z8Qmqfb2s9vWW2b6eHmv7espdiTKUVE UoaTUPNty2hextc/uSbqZS1cweRgX04JqDHeQX CHGv2M60Z2b3WQ0wpN7WsZ 
R22sTACB/sqaqMqc xG2sMHaNZ6qPjB7vKnFPDGwjiC 
t5EuRwVs3FUuRFtw4b3dtsTfxFxr6YzjBb3z3rPIcNQRUGYQlUl5YbGzYb3shuOygRTllUY0uLP9thw2G5U2ORKMj9UOxt1ZY2jJawxO3S/gLpns8b2uYwXn7OyhRpDmHsTDMXaW64Y9MatYtBbLjeZ7etnta 
/3Pb12dpXbjjcaF kh9G SE Z7Yt0W9sXKXcJxZDGSIQpjZGIVY1EUDpr 
gwK456Bmm0G7C40WETGeksF8hm1CmWslx3KX0Dds8pYRVuSinQn4kplREqojEgRlRFhqYxItIzolG2Os1OW8tmCyLB1k0 
fXTB8nQ5HEsnS02FLpcLpsOW2dTps3LLJgN2rr7yPhYJo9rHf1kdb8/udm9/Pbn4ZTr 
bhka7izbUctva0CjbZYmaqwxqw/tmSwfsNU4VU8ZT6qamn7vQqSXkF/m7DMNUgpMhWN5XgpEL6hQE1PuYbNxC3zGCOtgRNNU1J3QQIoz4I1qGe7VDkqcKFEPEumRkjyCwN/CqA2/fD6xetW 
cVq/GjH6ocDnu4T5 wuLRNsJz0CmCK Q09T9EMO2XJCWbzcvcksO4Bz4MO TDe8eOCEll6zt/cP5HFuc2pYMchxvbg3lo6YPggxm/Gp3YUuFOp198VBjjs9nw4MH9 
4f2jF58aHjo1Rfv37t3FPA8OpvNZo0ACLZAC1N/PyRf/pMP/s9jQS5wIVenOhzZALyy5jEuCzGwXaO7Ry7eNnBgeJD0tEsnl5CX6d9AifCRHLxjsRlkGZGSfFq47C9tl3yw 78fCXK1w1zjJJ 
bTEopYYRrSEr5jCIfg8EKjnCN0Kw8IbMGN8zwsshnFARnsy QP4XjFC44LkPrnjUIFDB meRrdkO EIt8e3fv27sHCDi8/YDBidqqIoBXAboEFIfgFb 
A4nezszRLwKU/QPE4FE8o3HKVsWQhQxwwQVZV0T51631JksIgLO9CDJtTwpTUdSTXlVR36hzJER6gbyVzua69AI5I0qUDmdQOQUiHyUWF2wDo8mlelIVQSgilN1BvCm0cGBkc3jY8sH1okzryOgMo3BLykCJmeVnpgtWCzSle4Q3a1jEo70hvqPBXu/oD8AqkXqtOvS3qTlCd1hoRiQhVON7W9wfN918IxVuwESFbI7bYN7Vie 
mhPYU9tMTCZC2kDIDvdVRMKZNberq712/V7nLW/7KMrnnpZJDIq9lkDakj4c/HPnfY wx7wHW6GP1czeqnsYc8C 
qF2SGt9wpXq8h5obpjWGN2ZTkUZ0HxasdO9WCfPQ2e0Q2FWzcpiBOTyhYyf8nObqVGMknUqLxlTFImSw5qTZU5txOKZY4d7tUpU0aHwSdTMW0e45OXThDHPpPyhWc5p 
ZH9C6W1/zFWvMVKbtZhqEr0Xquuq2P4tiU3fpWqvVpYdyfxts4q97krNVQrIXiVCg2QLEJijMduS2mi2BZ4tWhSlScCNR4WuKVLdBpcrd2W4me1zN6vsyDXXIcwLhOB6M/bbS/oB 
d0xUOd4nwW7fKXWlpQrp4SsyIOYV0 2LawZwQx2Fwa4jiQJyaaTP/yOxlipcnxAwO pbucEyYogiydUySCS23dBMVBJXr14EvT8x7sK 7urygmQn1SJA x0FP6HxSHpd36Fw 
q2w2KFYGq1dlwPt1dtf6AtwHGTYr9fFFFwtGd7PaR200g/E 
p8FcRQ9mDxgOaiyxRjDmz8ABeAYOWyfLFHbrUl2WsC7WukWU05Yo8CLxE6mRFIlXTx4spbNYPoApzTXuBpLZO7T0Z9C9W0yLLibrARNsP3GcCGyOtBaWbEJ79w/v3WM 
lc1WxTgwW9irK9Ty5EanNvE6FGnKb/PG7AFa5zPL7kG7tQdzZeIolxFFAPXXIWc5QSv 
6nLlpFM1alGLUfPJS3QeqZje27L60KL5vX0g524MclXGiXJycQjizkMU18exHEZ006EK3FpmgxN6r8pt8JfnWNT7cATKFvUVDGW1OTed58sy9Y1eWalO92TwwCqU q0agFp4GIpRZ/5Ct 
AQ3fuVrN5r57fhAHFkrq8KPHZW4RoU9W4Zku/NIlIIbBFH7UzOz9596I8PrX7dTj3iSGbmatTPNMs5mTuDHdE8oPCKsEtKk24f4GcE 
YI7b3n5uz/4/d1BiNeZh4FOqwG85hypk8JnrMeDasFPoPjpScuRpEI6vFucFVJDI4egTdvETIo0WuH69ktpIZSU8sSvULaE1r2Oz2bTYhLN9gEhl4PhyAnJvCwqx 
BUMWLgwzJ55A3sMe1FB2GrOaYwaDdmUbpcGv 
15ctTb0RnO4OjVrA4SjtYUWOo1qSUlmTS94Gewchg/1Y4Mg0rMHlK4Rapd7eLOQgFpRRui3PEW8tgyfAz4gTS1DhYTE1mIQw8kEzmBTGtcAtfjYuKWpoLeVtd3BZZHib0nxDk9v/66Cf /Kar 
4JwdqsWWdajw1hvT35qTJCvuuk9qxdc 8A/6gzJIUqCcUOJCP0 KSdCE2LRWLw70dtP3jOivWdaDRkT1ubHFQza1SLaLii6mQSDO6CT62L4figSaueg3GJcPLuo 7qaIbZF 
WOVnT8k6gxN6MZOmk3aabHcZow 5fdjtLHuNIV7uav1DWEGFypygqwOJyTBCHAg36wqC acxgrRf 
YdwhwpMZdN88e2ZIjC2IrURvrFCbfm8mNTolKUfKu8ev8F8VrJdowpUGeIJqFlIoCn/BE0gXXGjO3clJTMTwFVJgRlKC3Az23HhlMbNxR71YZN4STRR5du3LTVThuN6dTf8SrPfk4v1X/QhECDwQJdp3P0HOg79OBGPek7N9JadL 
DptJ0oxDm88okGUrNZoRHyCw r 
jarYVMBJMSaW9S1Raq6B9BX6auT3Mp6o6g/HtSJqLxnIYRyktNZHOgTKKUMjlg4YK6XWzlAcUry9MA8OiIKfbYyd1zIPJRm8jvt3b0oMruh8qU8qhHKT8yF1JuP5kWuv0qppQfcS/lLlaYAHHI5HN25OnNju50L85G30Irg8qWloirUzfOp3NVXluiJqDjULzJuUc4AX0z3SMv8 
sVuskcS0vJS7dqs 0IxAr9WSN0jhcKzn1M6IQoq4/NZvSjVJ qMnhUn1LOfcJprVBen9BKffTFCnD24pw0xZL22pvcS3tlU kITqKOaADOaQAfd7kjxSM4 X4TTfHSU2nQYO1QLJnLyTO8cI1u 
EPU3Hhat5DroTjDoaMYWKD07vRczi8jUX0squ1vxb1MIcG5piaJ0 aMynCrgsYdb27VH 0YoXzQROa/WxWh3SrFMtD 
u1XYyTlwqyJ2typn7WhlblXEq1s1F5OnggP/odsyS9HO0eQpgv7S5VUX5mnW7MSX U79IhPZHAhmjBLMN86xYM7VfMfyTQfo02VVFczYS3C U/CRC j2G5iC6WG s9SrB9RgepaQ RkACxZog 
JcKIDhAj8FTDH0ghYaPYFzmaa1zNHieaF4rgdKndPEx5pZyKlSq bHtk JqVRaGBFmhDQg2ptKEb1SeHHv DhRJMzrA7IsHVW4NcybB4QsL/OKJBNnmVlhhPj4Tpj3q4shHYybGTa 
jNaY5ax76quYj GbjLFtYIx8p9eRbzRH/j1QfAiKT0LxWShuheJrUHwbiu/bMmZg Leop brvGNwwSonLsDdu244AeZYDZl8Oo3D2qL90mi3WAOpoVugXVIpqNfXhqcewYxeSx 
CZhVSH9Fu7afyDhizNS/URsFfyqKXSrH3GEr38ZOOYiyluc6kGCjwlWzK4DYuIM 7TfJkixOgwoWgNdY8cllITgoy 
RfKiVPZtKBwawfMxPIcVN6vVzmANcAjmDE9jVqE0Tko0XComNdr1x9V8UA5S6NwaXxdehinFSE75We8y2Z 
bVGkIO1n6As07j4hpC7QjPJj6tlCRZdo2H8qnYpawYqks1dXhvPSaaeMIZ0fdC2dyOQKFx4RciFqh0YutBE21guhM0NJXlakPEicIXubSAtoqWNI3CdMiatD2JPEQe36T6p4oPwUjWIuJK7XLnEf8Cxx0OSrvAjNJ3wUGoyWfXJeaBiUMYTmE16F5tQCodkSSk5K4mxImE2m8zmRkOUUWk4G4eaQdg 
Q/NiUknqEPUkJ1K6/W8UD5T00irmQkohdSj7uv5T82EcpwTjmZ elhEEZQ0pu8iolpxRICelrSDmWJb7bMlo69vHyKLkK/gY8 jdTNhoQ9iQbULv BRUPKRs4GsVcyEbULhs3 
i8bf/NRNjAseOu8bDAoY8jGl7zKxlqmbEgpMtfh09lJXuFW2yRkr0xuDsA9TU4azjTlpBFhL3KCtRvOUvFAuZlGMRdyErPLyS2 ywnpqn9ygovzX5uXEwZlDDn5qlc5WcWUE2CafIaYkRU2IRlUb 
gScr4pIU0Ie5IQqN1wgYoHygtpFHMhIXG7hHzFfwk530cJwdSOb89LCIMyhoTc5lVC1jlN4KHLEzKfxVn7ckpQ9uk3dDG50hSTZoQ9iQnUbrhKxQPl1TSKuRCThF1MTvgvJlf6KCaYLfT9eTFhUMYQk 
95FZPVhWLC53JEAPiMkttkc7cGZoTkgH5Xl5KbTSlZgLAnKYHaDbeoeKD8Eo1iLqSkzy4ld/kvJTcXlxLbmJ/Carcx4j8zm 
tuxBfbR1zh2vUdJeZVaOad5sjWIOxpZKF2w10qHii/R6Oo7siGHClEjetP/R/XO4tnhlawDO/QL30Z/h5L37RleCS2y2V4z0kRJZumJ0b8xEZ2a2JESTqyGnuaVT6WsZoyJuHJZvfT5mIZM21HgpO5nKyEpuM3J2FLGx471kbDmxX1qzML8aJ 
Ugi5sMi4gPsPjefoHZhZzcLQO7DJtVbjUfWoCdiqTVczri4vvLqZT0vg/y/DW 
pxo4hXu68/pN1RN4LqtxZQt/SmaRWhmzrWcUlS2Fi1Oyys6i0dq1YRsFboLjhvLv89FI9C8SxmAiyxcgkkdsHMFPNHTtZEANbpYC5dMAa5EjpZ/w/7X8utZIG0KHOO8juTNu5McQhMMelbUkinBVgsKVzMX7ZPu124pNgYM 
3zQoS92Ges3RhX8UCZoFFU1z6vdaIaZZ5/67t5Jv2sxuSEIRl9uq6Zlwx6jM1pySNeJWOtXTKm BOfUyDj5cRxhYdd0C26YGjzkMYxUxoWIexJGqB2Y1LFA2WKRuG7NBRMQv7kvzSM 
SUNuDXm2XlpsI1xvyENz3iVhqUjfCgrS6k85h F EwmD5yvcJ37jKv61xN4GW3DO0xpaEXYkzRA7cZ3qnigfBeNwndp6LdLw9P 
S8M7PE3JGcNrBvNfMFvrbngXWpQdmQFo03Fdw0H7Pm2OZwvCnsYTajfeoOKB8jiNwvfxLIjX/83/8fx0lafi60p0S5 
JP2/pmjYTR1L7NRMv1TJ9Iv6/NqK7mIjTVHQxEV/KaIk6Dw8ETJVHioZH56fcf7dTbgezH 2e1jZinKyzaZYeKWkXot26XQgs8moXFoBdmBFzogJWYekh/GXMAwdm 
ExSQOPwvGkcFiPsyThA7ca/qnig/F8ahd/GIdptMw6Bhf4bh 
d9Nw7Rgk9iQteamcaBMhlzYByiBd/hhJa1lGEcnq/QOES7NeOweN44nCzGwRaPrTXisYGVUKyDApKpAhGHoGwU9hrhVr6T1Yywjssu3 r26rSdn2zTqsXY 
RFYYdLGndVdAlY3JeVyoiCTHxt4MUUkuHW7emWAQFrEqUkwzW47wl7MLtZuGlfxQDlBo/Dd7Nr3cwRO8d3skn765HpGdN0yLwT0GBs7OQKneRWC1VYhwLjruCwStxM2rhPTo4nDdsG8qovFNaZYLEHYk1hA7aZ3q3igvJZG4btY2DdwBKyn0fsiFtf4JRawewOt7bxY0GNsbN0IvMyrWDSruTOE2cmErGlgguL6r5tc34GwJ66H2k3fUPFA 
U0ahe9cb9 aEaDOxfeL67/uF9fHoAORea63jbGxKSPQ65XrW4Drc4I8IyYhELHggPpT5/xHTM7vRNgT50PtpkdVPFA 
RqPwnfPtmy0CPf5z/iMVLjVEjeS/wMvN1noYSt2uk2mxttKgWXNSqbnWHM02hL2MJtZurlPxQFlPo/B9NO05f4GzfR9N0k/fY0mslL9Av6VrWiwJST2HsSRWxl9gq43oLmJJNBXLiyVpCX 
Bc0zlNj0fSzqZYknmt9EC50EBJwwHYO9RANI0AnDmVEB2iiphqh91GNlJ5xQ0lkViJx8qoVN53oeilYyR6hcYNmnjzvCuBMMLuUsKxJTyGToDnwzBELlBZd9rrlVzxjTGyxD2ZIyhdrOk4oEyS6Pw3RjbM/wCu/w3xhm/JhV9usaZFwh6jI0Mv8CrvArEUhCIDA 
HLuVCR/KymBKn8zC9WLIHL56nX9Jl4QOmLCxH2JMsQO3mD6p4oPwQjcJ3WbDn9wX2 
S8LH/BLFsDzRMM7Lwv0GBv5fYELvMrCMpAFOAAE1xsshgEOAGEYhjtMYTgFYU/CALWbv6vigfJOGoXvwmBP7wtQX4T2Sxju8EkYYpj1MjYvDNYxjplZL7xXYeg0hcHMeYVNiiAK1nxXGNlnTUlYgbAnSYDazc 
peKD8M43Cb0mIFeS XOK/JDzrlyTgwv2ReUmwjbEZrBPLMgv0nEEL3ClcK8wXtKCdJggLTjMFYSXCXgQBay9Yp KB8nQahe CUBC4m/RdEEg/fRIETMmQ5wXBNsZmSsa0V0HAqLV2uA0sQFiPs1mw1 
T8VQh74nyovWCfigfKV9EofOf8gjyMrP cv7fSBQhjr0Pg9WZrXZ8 EJJPHB8/cVyGj8EJafP0gf3CuKBdhFZOmKO6FGFPowq1F0yqeKAUaRS u7j2HQ B1/k/qhP 
L0SwdjwEZi1d0xYikNRzuBDB2vEQeK2N6C4WImgqlrcQoe94uMxUctPzCxEn00IEldT6NihgM1UAEjYC33VYfohFprWvUpysyw9VTWqNRXXazntQtK9gJi691aSNh0N/8oqYFnO8dujPwn2ymEmKWT6t 
1HU4ctrEPZkcaH2grtVPFDeQ6Pw3Y8qSGG62n 
LW/HJy46nlwTeDQWEpwMfd9IpMV33nKxCUltVnRLXyXqyquDydIrpyl9j0sadTmkCnSJLuGW5cb9knMTQ0mHqkRDCXvQI1m7pVPFAuZRG4bseKfDcvX9ZxKseIf30KRKR0LXIPM/TY2wu41/nlecxOD0hS3lcqxFCKVkSMRd4J1zTBWDAFIBTEfYkAFC7ZZuKB8pBGoXvAlCwbP9 
/wVgwC8BwGV76hsM8wKAY2wu23/MqwCop0dms2kxyWsLM60DJqhLAJW4chrCniQAardIKh4oszQK3yWgYLH 
ev8loETiSukhNdO7bzDe6XJu0AZDOsmPkcmBoo9phxaT20VfhoZeZQ7sWoQ9DSzUbrlaxQPlW2kUvg9sQbI3dSyHXwN7VZXnCEFzjnALFF9xmh5glsY3TV446VQf62vjZVuKeLdO0XlLQYlM3FzHv7ksS6Eu2vB55cRxCDmoCzeicky3E9811cnpCHtSJ1C75U4VD5R30Sj8VifxgtX7L/qvTr7rk6cUx9V76jsK8/yPY2yu3v 
7a/5XuIGS3/fMyupiV1IgBM6Szhd85nP1bkyA0ZfKkpgbduJ4StQt9H58bp BSBepP5sitR5hlyLV8pxeu 
UvKh4o/5tG4btIFeQB/D//RerPlbpeZuLfN4x3enG9LINsLoeaIwsPLWw1h3Udwl40JdZeuFjFA2UbjcJ3x6sg4 /rvg8r6adPmhLTO75rjvS8pkTRNdM77vAqBcuGM 
MElzrJCClCcjKj5YIvGkUgyaehCsrB2aYcnIGwJzmA2gtfruKB8hU0Ct/VW0Gyx 3 y8HZlao38xSJe8zWuhvYRQOpKTFD7JLMq0atU//QhOU6NHPUHNbVCHsaVqi98KCKB8pDNArf1VvBoRF3 z 
so75ne1i7pWd7/NDSNS3bA0k9d9ke1pbp2R4/thHdRbYHTcWysj1iES3b4yemzpuez/Y4mbI9qEVZcIuDsKIV3OgQdYlH4G7M5MSTzjko75MSzjT9LygehuIpJ5pGddqfrA5XVRe64zGdrCcrC5bnn5oB8v 
kjVVp/4L0fN8knxNCeDTIs2A27jWdlU0IT3txVu6l8ED5ExqF7z5oQRD8AZvd9MFZudevuVhc1x7zvE6PsZnU8VCZvN6r8 
gizuT1lyHshdexto4HygCNwndeL0jmeNB3Xif99InXMZnjqXlet42xmczxpFderwmHwwZ/nmXy ZkIe Lzsyg8UG6mUfjO5wU5G0 YpPCLz8 
qMK4QN7NZ/2y802XAqAOQQPpNVpbGJcL9eTkUMUZg0BzJjQh7GslBCg 
U22kUvo9kQRrrc/6P5KBvS9RBOBY3uMLJsYfsHJxPnayOfXlL1M7khNO9gi1O5OzXKX6yGoiqrvgnunWKnqzkKsueJowV/2CNSRuX2zRzUj632TZZWkSd24JW0dO5LVhbxwPlB2kUfqvjhH2JP0h9LdQvdezXuS2JHtQe8wxvG2NjiT 
4oBKGN2dMt5sMH0bYE8PfTuGB8g4ahe8Mb1 AD1o/WeILw99eqSdpLMAHqc8PlRONqWJUZ9Gvp 
cyqmNfYQ8u9n3cfIvqJECUgivmFZVNNo0V9iD1rYZyAjFVDOi0NtEofFdP9gX04HL/1VOJgE5p9WRk2wfXGu sYKIb1Uegda05kmch7GUksbaOB8oQjcJ3hWVPsg 
u8X0kST99UlgQewhuNAd3XmGhtBqZI8ENXhm/J8nLipSHL6ET7h8X0/DtZ35GSIaQsFvgiiCHNkpjOSl94gZF2KRwK6hz8nIDpO4OfEzLi2x9pSktXQh7khao3Tqi4oFyN43Cd71nzzAJnuG/tLyyUr1nDn 
v2Vp3w187KuCgqfopaY7cBoQ9jVySwgNlikbhu54rGDn/PzBA snoTFVzg Ks3KBg2NI1LTdIpf 
c5QbFWblBwW4b0V3kBtFULCs3KK7lBgWjpvKbns8NegnnBjV7Dc2aeSxBsAdBODUseBDjs4sMfgAHAVggeMhkQoU7heUg7APWtfEGwRWe4uUJMbOlOzu7NZkWeHkLGYXJrWN88lLYipxJEf5IS/KWdTvwz4G5ioZRW4xfTV6JEDCJ8MrZWSvuujXwC36EiDczJmZSYmbCrKLqN4U7lYhrOJfPhMf5pJALC 
nwIT6dF7ap9YensmmFWzlJ7LgkHxskoiBL6TShWZpc2S2lhLShJ1tvIa5XYcUZUTgaVvixtGAfmJg 
dsbAnMoamD38jDiBuarbeNm0RjgZelwFXyB/xo2UccNJc9XIw4TF2wraitJNv83QDexhVbjgK0JFrZhnrqYGdBh5ucNKMizjON4W1e6s1oq2b2UF7RtybF8Cm08P7ArWwKq7bVDf/4fzfp5tJffzmEMW3i9k0/yxUZnP5HCvjvYKjToG3zi/D27er1uhXxQ15YvcmUkWgXDxbYgmEHPOsk 
WskSTHtNIRORHyivZvKJfLzKHqdtKJh5jwrgkw/czc4qQDecmyVRlhB DY/ WWBHh1RKs4s1zYaiiAKoi8x0WxbGEiGS4oJmn2GgH7njfDKgneO 
gxbEAlydrkQmX7o5L/3Iloy0JyrfcaWkN5VuqImN2l/iWLv1JhdsAL8yneVHGuViaPqA8tHFgZHB42/DA9qFNxftaWguxB0zhGjWGTDkM2xmnUscRHBByOWDiKfK/kJkgXJyRlKGprHLMrvlxtXQvzf9eTHLLpABux5ZesMlMOQ64dh8d6AFmszak4XTUgKNMkwt8vniBA8HWl0OvPlwuPUjTaxmLXtukWWCa9UfFlDK5pb9v/VaNUpEYoZTqyIC3uQVAMrgTsiBkyENsEoLPqtegnOJO 
zXdMW4zblDOcbvlou4LmzhsTnKH/YaGZokFjeEWL7VXN 6sYt/RneaVxm2W47zKftfq5rbabtPNtjjR5ltYjvQq 12nt 
gOdYf9AYtTzdLZC92pNiuz4VLlKM1sDgG1XI6fEHKopxqnNIhtknIyt8PZjGvPhoky1SJq4e3COE/q6O8YNO5E vuike6 RBBaTtB2HOFn DAcrhceIfNNIQURp5ZNB15z3iVvPa0GKmnaV 
bOKd0CNbIVHs7MCHJOSOmv34GXE4menr7eSC 8WuZ2ucY2MAZ7rZKKFdt2ISlhjyb/s/PyR49fsyHIBUa4evUZhesdGZe7AH8Xhb8L8Xdp LusCLciPV7uulkHjhFzO2XFsTkW7 
1J9PVBF0GLvdITRh3XtmPwtQCdaPGeSF93AntXC18WgI23MGhdaT4z0TWY5nO5rbNeRodNz28sfn3 
8juejyJjzMhcV2l8Fgpw5t9sVtOIxAC26ow9PI6aeU4MS839hdPYPozj/cKdDQCJPDopKoKDcsdox2K9Bq3c7dcM5W7coJW75aKh3I2rduVuv6ErdwsaU7nbq5vKnX3HUO7GbaZyt9 
1qV3bbbrZVuVuXGYqd/tdp7cYyt3 QEnlXkGwoOY R8 l9QsOngv90bQdg q0HnYOg24mZIcPk1sZNoKcTDPschbDQn1gx4UW/E7zs6IUKS1 
NbT4KdwaUESzWuTjqDBGnLPwjoHBodGL9wzsHjrA8vmenLUS1cwQrMED7W5jiC4GIe9zKbqgd89wFtp5j 
zvxiNjxfoqCAjVvJ/BWn0G43mfSYGVAAneJqUcQglFpa3Fa1fqTCmC3Jwg7gXbA8XboXivd520mqGTcAkCT4S00wq/2vt mlans2g1yo NCal9BhqUyLeA7Cm2O44hpOC9hbcw 
GSyBGsvp2fmoNKT4TDB4B1sEpJxTok5CME6zePXn2qlJLAFRnfD0tgRIalgqG3cRtD 
bn0oDYKuLUFQg5YLKFpa553GnAGq7lLX5UgHBsUZOAyPaIqGgZQMM2bdsykqb56NpPml2yCuXuFwwnHoQTiMNgjsE/xooSD29 iDoNLCKQ1hhyikU6DodUI0jmtXnOKfTcMp 
C6HcuI4I2JldrTD3VSvxWh0RprSO1k8/j6coSKFRrsXiplSkUhiVSyVtms8qHA1e/DlrQ9jC4hNstTTgn9r1YWVEOrYraFxYts2H1XjGaExKU3QNJyRGctlt26xco71P2jvc3ZOYamztQwx9CPSeVoJSSPjQiw3PUxGwFM0x2oaAp7sEGPRI7BUt01d6ZkhfGXEmAcnyXQM8zWEDLHXlgilUTxugsZarZ5aYug4NUGuYE1Xe86o1qGJSbM2zLIAYdTFT5WI27rk81aDgFnCzSqrU9FhD6yOjXJmLSKg 
  QTx8krQlsMlsaH/qL7sAEmf77kGHN9CcZUCUkvaKhXDPaUXLEnKdpay avyzl14Y M4LqUlMxPAQ9DU3OHN 
jt2vCacC4/NiUqGzcVZUIDV9YN4y2rYKnscvbaLFHHxKJN5bS1VuvgBC2Dc7pi/Rbp7pFBcwlWG6Gc5YlwieG0IbTbM8wDfptHiSGavLCdlRqLeogmacJFBLug3Qzj4TB7NCWv7TzjtTXyOG 
Ee9o3h/ZIGaKLMjliaTInjoc2F10DXF9GgLU/gixBk5a5PLotT6ZJuDzaNgQaLTcpHd0nZQ9m1RtO/sJWL 
ulB3Sc6kIpIHmW4KjbmRdTxNVa1yVOQfCrC9a5pEyXiqBrTMlsnoAa4Qlx3FDoRnZy3dlkZo33u7C0fUY3fCRnGIvg 
fqvwDvVjkL5GkfHuo1Xmwg/4cOvbZDg1JYy3wygwMJeVMWu9roY2GkMqAQDSi0DXmbRY3W7PC0D2tUfS3fBoyNIJYMKdbuL9s5zZtcpzN7p VxvsPbQls lcP2GXp4QlKG0AD 
3HRtObdzARLthUziZFpOXbty0taDLpI9qJ4sn1S1jXCvawdWOHRSTKAVB6 fLavNZg9nGiq7dFjUhzCX0bNH26Ol9r7e2R03vQ573vN7tzYuwJF1D63oNe0995YdMjulQGiRbF7X 
uqd6nitPlYzJDNHtsGghpInt0nU95HMP6vdg9WNTSpiSwmP5nJghM0TaAoZtSuiBu49 
6cHX33RjkKsdJpNRcvOQIMNq7AgXFInRWUKtUQxnFGFCkLeOcA1pkViXNPSeC46g6cCfszK32bknRnu28TlhCOZyxzo u6kpM8jdi8sidXIev PSqr4TFrO6dvPZrUQ9wBAYCrae 
F77pPQxDXvoxPG0MEPUs8LV7ts7coGFQ9j 
lHmjgHGpmjBGO0pkgwStDLycwSLo2gCfXElzKTWtX0BGbBXNNlPon6hjDGPb8rJnfvVQYnIZGaQLzRDGCLcgJeSSspjVTBYMRV0a7L4O6Cxat242q9qNg 
Rd57pkNi2eTRxelc3Ce/LpNLSHU/8C6uIjoP0UWNzaQ8M79yD4PuuA1ZHp/SHiRggytrPtRv0Z O8jUHyQwrJvaN8wC0stcRP3CVkxIwoyTM 
gyhddPNfIeO7L1HO7B/YPsJ5rIFOa3bzMi8lJAb6k2/YV6qFde/ePsh6qIS/bJcmKLl9Q5RvUc0MjQ4dYzxGfq4HYiBntkW 
bj9QMDu1nPdEM36A9cZzMufi0qDbwTupFgwdHmA1sgsdI28QZXm/fD6nHBvZv28t6jPjoCwfkMUmmO3bvbFFVW3qmwJycwdJgGxyP6jwJyPDAs flZTEFh7RWPgmwIaTnzeqtaS3w5XEWUNhQVas4 
  PkoT34UOiI/pTp89vQwQO7vfj4ut7WPUmX7pJnS9lho55hKt9p0cZt73ZhHAF4bwmjtsdKlwUXjRzp5Na8B41aM6EjbdMA3/uLmDC4f12B5qk9wMtp 
G9g/8iLaWBOYVHWsDDvcLAw9aaE1w3kFRkZoO1vNhVEfrQ3gw44OLqfUgk7eSHJqg9y2t4KFQaGBs36bQekpHjiuELmjHxGyhybYr4MFiDbO4CgewcHKHPQDq1oe4HWmITwLAx1UHsFVCBDYtZvHs6kxBkxlReYT9XDU2vJU8N7tg 
/WOpLUHilqjEMG0L7RBsz/y0LPu60V2E7S2uv iHykKmxbCg8aixjG6Jfisrq0kcNPfU 
f/TUkJUaD1/eO/Gtp7KvVfUUIVXlemrxbimj8BkllOWPCaHUBh4co4ELhiz9eVGd4qhVZb3XQWXVUiI9BJEoMgVRv0LQvouht0ZJP/cPjQyYTzUOHJHycubEcdYzqLsuAF133t6D5jMdw5mcAu/B7c68iHN21vOovi5C2g4P0eoLdiO0l1AsLkP3VhmOQc2PepThaW2RqgNDg9skKS3wGWb4UQ/KO4cfGyA0Nm5Idp22Euo66hgw5btdD9oV5aIVcxTvP93dkq9VVcQMVfFhekw66Gnc4KSQvHRMXdGsLP5vEU3PEX 
r9LYfKREh8bxUbH6LPHgjFF 
A4lYobmcsEOOmnTuMXrpcIIbyD47h0MW/NNrMOse4LIFL6P2Z81XhBdrCfqjHkLZGXr3UU16Yv/3DbgRuzRwJ3IZSAmf01SpzCUPmjjvK3Kgwq/CywFcsc4aq36zKnUUE2bbR4pqqj7RfV51lXCtr9ulSVtYqbvt1zmxCMV9vAfPBUlj79Scns/Xamc3cXvV5C3e0f 
nFY63LOWqh1h/W6td1t2fWIkpP348UjglTW6fNfAHbwv 0mi 
wdlACL0siHlc6tBHP1cDgZSgtZSY2Gdy3Uv18nxAWMf9nXCRtIJcGs/vREzbTCxwZ8qWVXrClBEMW6a6dR/sNHv2Shc2qlnKgWmh7yoEHJl38XAkmLb151DmbQE0xbqX5t6e7G 
5QnzRysaVUVYutDu6FwjWpX4w043AN2hgB Gi2 Jqcy5VxWy8wi 42uhcllsbVPnhaMbZMhowF66XUgrXWb8tC9Vf1X4GflvdaUizpNN8I4FIW9qLC6nmheiktOIS 
1Er1CQv7/32uVK9gd09fqv6WtYsFS9VbXC1Vm3hfjLXqNc5d1BerrV/083uxukiD9NXqb1ob5H212t/N5me4M0V0PB 
72m3Yne8UdDDrvnO205usts08AvhuGqOqcxwPSfCW9IMLrKP8mP6506adJ45nThyXeczPXvIq01MLIKypyAaFH4O9AsUbA0/sU9GY5X4TD/w6UOWzn1YwSEhpOvvXyQxNV7Vjn0g3i0q952Of1jj3SBeyH7CEDIns14lPRRqla9wfFdW4JWlXlZOBNFdJ4erRp4iw3CVMb6Q 
RuR66wKUP2Vzvi4QRXnbJvw2DWMeM0p9GaiE9KPAEVt2MBMiAqoe1JfPaHOKGZkXwaqFFPnEDTlGCZMORHGFKfU1CFPS6k7gr8ia5ZV2FNUV JUsslES/xv/Jf6KKkv82iJd0kX 
l0yRv8JHkS/WKl3mf12GzF/hj8zDxUHnUzl 5OAQuN3 ZFMiuK9zT1WUSMBRibCYy3OomtqlirvgBrzvtVs1I ZERTgwou2zg5Vbau vjTQxHAlDlh532PwL 
01ADTYZyEtu/GXRY0H5lKH2e6F/inN4PIx KRRwWmlNosjRalaSWRe8l5gkYx X1mGjqXZMmo2WcWPYiu7xHIWHXZyP1mvcKHY Ggjp1yFvAttEDYaKjXiDsH9oP5xkWy lUuQHc9wY 
rA6p6M9Nmud3qqUUv9LGKPp5Xw0FmO5jCWym4Hh6sfocXMXUyR0ny6 6QjjNg8rXIu2SD4wQWRw 
u8wKLgYjv2iO2E7ZwtoiYbHDEs/ahJ0utq7jJ7wFvLj9F1sWavdlbmOw4cxmTcMCcThvWhEti7/ vMHfnfpL 7E9FEr4aFjTzLGwTb1XsWkTULd4g44nrERB 
eXI0jfE8f1E8QImf0yvsG/FhHLfkO/vphi2YOR0r/6KZZ14K8Jf4/y2ATyiK13EMQeMwby/EtfEMmvjpYqSlq/KWkvMCStDlZhBd8c2wZn2erBk60t39B5UWQLfYsGP2UL92qMGLlhf3cS1ooSZvbBSc6MbTY19f/n5Kynx5CzmmZb7/EQHNwRCtZMs2y 
iVx7EZGLQIWl1RA5lyfJspuBk9DSXx60SZvbs2Q1qatN8WASqnVsbNar1DSC1KhtYIuLkcJaQ32GSmUYFRGZ5NP5MtqWsvB2gnNUnBKMbWRmw8kUJ6UeQ4jUeBqmPfADJxb4adBnFa49leravbvrGPkLbdy1a8vUFHy 
quMjOZlbAYdq48mEST5NxoKXwxeSyfJwZlw6/cf3/IBbPf2BINc4zDUmIV8ul58a5ppTOeUAPyNmJnLDxBbzR/eOj 
cEZZhbaPzeLo6PX8gtOSqm0zt3j6rX1LMbDnMNEoI5hQseHj7MdeTEqWwauwcv3sfLPOaednz8MFGjxhnJWP28WZlrN89S1J/pueWhZ49uv 
l63KcWHIbvsXJBPEdkKA9M0EWQirm7Ov8gcPHHLsd/KIUytGD3v19yxszDN39S93fr8H7jOyaxDvye pWqO24AeQNuABrD4GuYyJNck/0aIj9vNlR7a/sX8 /Wkf/bC7 5/4HV3 ACL/zubzXHH788 
MIfJ5 ufx/X/cIf/6nxgvMJ6j/e1vSm wj8YM30D95H4AejX/jw QDPXvc6hD/9vrcsB/jRExsBfmj5OR B5x8SD9 B8HsX98P9h37zuk/dR CHF3feCPDDe8 
8ZjnA779yDPA9fNvoOQj/9dPfB/hP/a9/BOA/KW3bAN fPvfJ9yP86Fcuh cfWfeDHQA/csnHU9C R9733NMI39dyP9x/dPElk9D 
R/fO7AV8j175tk6Ev3VRFO//zxe/BfBj/bcfh/uPSfdLCH8m823A99jva1YB/PjqQ5 B9z/ D l3QX8efy/3IDz/ I/f8wqAn2h68HtQ/4kdX/sTwlfeczfUf Irf3gfws 
99nGo/2RP6xDAT4pj90D9Jz VeArh3 / OdR/6swzToH3PXXeVy54J8CZia92c9EXnr7q6D1k6F94 tY7zr0B4Kc dDHAz2zuufVBAj9z PJPdnPbX3hG/Oy74D3PfOzCsQcBvm/FiY0w8L 
KHbmci3I1y76zfznok9GP7bkB4H969peoX7575/MA19ZevB/q177i6RsQPnb1Cwh/ TWrHwT4sS/cBHDdpqEg3K9L/vwChD889XmEfx6sB7h yb/8A8D1e152C8Jv/XoTwt 
diOwcAO38TLA17Dlqz9BOP qMxH /O/fjPDDx 4DuHH9oi6AGy/ 2JUIXxf/JcL33tULcFPrxW8DuGn46d8gfNUdfwOBaPrmaw5uBPj5J29EAYlfFQS4eXrF Qjf LnPI/yHwTqAF4R 
9g8ALzh86c0I/wvXhPCPrr0Y4JaF4mWTBG55Ffcs0KvlzdecifB3Nn0M4T// 
30AL9y6fy/AC9O/vRLhm7/ybej/wv9q6QV40YbfyQAvenX0Nwh/aOFahH/w4VGgT2t77HsAtw7eHkD46ouOIfxvj38O4b/d/hj0d3F4 WGAF ee 
ADCHx9oRPihU3YB3LZcvBXgtosGnkX4Hfe8DOjTds RjwHcXvv8zwBu3/XuvQi/9vQrEP76X2 D/rY/vrsH4CWx9dMAL0nlf43wZ/asQfgXvxkF 
nSsnbkL4I5XNQYQvvYjswh/p/tzAHc23bEe4M6tFxxG E091wF9Or/w5kaEn7twJ8BL13/mVoCXXvrmZxD UMfLgD5LH7jxeoCXtZ/9M4CXHbx3D8JXC1cg/P2X3wb0WfbXf 4BePm28WmAl09/ 
dcI/ s71iD8UOgA0OOUs/71LoBPuWiYQ/j6B2YRvmf6swCvWNa0HuAVu667EOF/lq8D qz42okGgFfWfGAnwCt7//QlhGdPPIPwZw5uAvqsfPSR6wFetfYNPwV4VbJzD8LXfuotCN9/2Qmgx 
qmH3YDvHrvp7MIX/bnXyF8249WI/xM6O0Ar 
n/y50Ar7n07RzQZ83nTz2K8AM3fxbgtaefd/oN6H52vKPYKnpVPcyI6WF2MjzMWvALqutVUiF4/PrbmUVcS4yed3l1LVnnn1U0m4sbjfU8m6soFVz3Oheq4fHtAqw2CeWlgHfcWYXZn2d/tQ38VVvr2Y5r3HBcV9v48EWc51mqFRWDUyuYXG0oIgEJFBGa9Up8QgR5rn6s6NE4W7wejbNDTAv6J0TI1P2QJMqhNHwSLzkpCtS3aGr1XzUP6r 
C55txjY6H2S2CW48h9TswG7rjCSaeonPH1koEHE8P3UBT2d3csVmdBwJ5is0boUt3Oc0aC k5B/NI93JpLDjUrC wDx5yvTxnNqxmtob60EjNJkt7Kv/QCDKozoU 
mtyYaXILP1ZHJtvagPgWy4kXUTe4NJGwDKsLg1vckniXx95ubGdJrWemP5fUegq3SL1rbrMqrQWNPbzbhbSgCCMEMFIFD SzWVmcwiOd2wwgpP0p3OnOR4alEFs4m5kwFCeMVidoITVNCLVlZ6 
TLe8E0nQm8BmsCcPWCdnpnVtNREWHx3MCNVMee7speYxZ5dG/POrOXqPTVB41S0waKxCTcxnpcr24vDBAM 
ZKZgqCJKXHeNm0fHVL2DJUDRGyNRGXHs71WXYS7mVnj3CUFpx22JYNn82FDRWqBQIJoq m4agg4mM7S1AGzremxAcUcuclNvG50FF8LoLiYnwGa8IehU5Iy 
9MmoiqKz7W/Qe9vZTcnDNncnOh0dsSclM8OTOqJ2fWUB8tdJOcSYrG57NqafqMCBtj5zLJ0sADPZq1oyg6dpUmWUZtSZY11gNh/EiyJP0s6vxWmmQZZSRZ1gxbuqUlWTZSq93ufb4qtEpLsqx5pY3YLpIsaepV25l641wlWfbiMtvbzd6/dJMsKfJcVsa3DFJSLkdmQe4SLHtx2e 
NhhyVSrBsNrGX9WmVCjIszWMSasD21ByBApG8ocy8yg6KVOzEyk47MZmZlb3oulEnts5VZmXnzajQ76NGQEUFV EbT0t yRwjgx6s0x4qEefDjLlRb0z9L26M3Iuyzq03A2dnh 
mxKhmrUMnstMHVyCiBs5q2q/wybdvZ6l8kAvNAqDfb4xC9MdVjMg5/qLnQYgFKxSGqMnXXGxE3p 4XFbSC9AXPvkrlQ5rU WZ1xouwaZ 
hW15UNsVIwngZbNrxj8XZdCEh7qAsYHByOyiRjnfOCaNiyMzybidWNbbl1wh2JjEwdnzIbB6AcApqBxzv1HE9glCxAz6j0vHpgqwCuAonoHR8BoqbpudkwUjvXJ8pAvbPcMBDbbBgBClJSTiYFOjkmxBMOwtBBANI 
RdbCCIYLpj2QQgaCSPu5o/MJf 3aPyPr3Vg/UiPwfoUQ54krB/pNllfYbB h876U2JOCJ34aAjOn/ON 
19fhPvR/3qDhSxzGcXVm4EzFurA9pKRKJX3Pcc9LQ6pGUUtExsplo6ZiKobBlrNZCzquwk1r7Nw1ksiilo0GtQbMaJB1FdSXEaDmmuzamkMYR3C hC6jQYZeGDwjtpR 
BkN0rpPDeBbrQPoQzSI9NPPaJC1S3o06EpLt7RoEJJ5bqJB1lbp0aCrbcR2EQ2iqefDNvtIjLFuEMEoBXXU6Utjm33EjOT i2fZNba5G7Jb Xb5pTfYUfgpu5GCSO57fJddn7fLR5iR3GtYsjuH2 
UjzEjutd5lt9R2 dLuinMyGp4p S2W8GLgx3IYl UjLztlMZUtyCtSuEDMFA08YqvwXGX4U7janu7u9UW5oqyVwEjC6Jb7Q8Q8rwT2ecklGoSzldP6UmDDQCaTT MK 
lnaz5CghGRBgYObCUB86DQfyvITQihLppPJE8fhTDxB4U5zXhoE7rKsDcIcY mvdJWiqtSlP3NyCpdC1HHpL/EZrAmHOiyFYzSWPmAiqq5TaF0bjNA5LjdYZcQ/b3Dpz4ze 
ns2mdE9XQ18uqgacH02mYG32NlkpJdqN309m8zSRe1ssppPWHUwnk2m8tWvq3w2WZkN1Y3Fp1jGAvnepbGoJCP4y1B8k6WEMaxJnWPn6QPf5ZylUZ7O7Td64aPOjbrPvjjAz1CZm0uGMrIwIeYUmU5VKqJNc 
Rxy8cNG7JWTbpsmZMmXbYSilXIPssgp3fZGijWZv3XoP2UBr11rjTosmVGT33WoP02DWo9/LV8DdrvQoOSXmZLxIwq1Z79DO15C0N7qvy0unztWZaERzG0TB3s6IuEn 
1RwjOpwbSUoyS9m5Z0d07VWcXVwGYyJJuT8BaLQmi0K4RtjgphBxQ7VTbaBQVkmCw7z3 
FEKXTFL8xZwphm9FTfxWC0T1dIVjPQS1bIRh4iyqEbX4rBEv3dIXwHyyFgPy0y4NCcLs8UMm88rtQ/LTwQxh9MbjxM0s/lt5VMJEk80jQOMuyriaTgOOHVQwwWBEUXySqW69wW6F3 TQvyoJ 
yo6R6hTaElr3OmvqUw5PYCVa5nD3a95gp0/coF65mw7K Sp1H86af pNv0 7PwO7qLs1SXxXy TV8i3p1erR3DwpBigykobTJ3QHzjJ/eW4dcBoEsJe9zXwxgG9nYa 
uyrZ8SrqPngT/ZK409lx9SrrPPge t4TCdvcp6T43U A5 ZR0H2sGbD19WFPZb52ei09J97EmuvcUqBad512qF89Woca0CngwK567 
1vGbDeKiQO/szSQYRuAgEhFUGJnKakdkqQIMhxNbUgpBuVZxkLhmsEHVB/Jltg9W3pKz/KUe42OljFlJz0y2zcijCslpvA LOVEo6yhiRgjV2mvYKB86RVrMNDb 
G3ZzW41m70fPvJSqt3/H0FMGapstgEA

agriForm:oid98value=

agriForm:oid95value=on

agriForm:oid92value=2


> Therefore, you need to check that the viewstate can be captured OK in
> a variable, and when the variable is used as the value in the HTTP
> parameter section that is sent correctly.

A test plan variable or a java variable ?

If you're talking about a test plan variable, i imagine the process is :

- do not use the proxy
- parse the HTML to extract the viewid string into a variable
- submit the extracted value


But there is a major issue : i can't build test plans by hand, it's too complex and too long.



---------------------------------------------------------------------
To unsubscribe, e-mail: jmeter-user-unsubscribe@jakarta.apache.org
For additional commands, e-mail: jmeter-user-help@jakarta.apache.org


Re: Parameter value corruption

Posted by sebb <se...@gmail.com>.
On 15/03/07, Olivier Schmitt <ol...@agriculture.gouv.fr> wrote:
> >
> >> The view string change for every page.
> >
> >
> > Which is why I asked if you could try a simple test to extract the
> > string and see if it works in the following page if you switch off
> > encoding.
>
> As far as i know, the proxy construct HTTPSampler inside the following code :
>
>        public void run() {
>                HttpRequestHdr request = new HttpRequestHdr();
>                SampleResult result = null;
>                HeaderManager headers = null;
>
>                HTTPSamplerBase sampler = null;
>                try {
>                        request.parse(new BufferedInputStream(clientSocket.getInputStream()));
>
>                        sampler = request.getSampler(); (*)
>
>                        /*
>                         * Create a Header Manager to ensure that the browsers headers are
>                         * captured and sent to the server
>                         */
>                        headers = request.getHeaderManager();
>                        sampler.setHeaderManager(headers);
>                        ...
>
> It seems the parameter is corrupted before the HTTP request is displayed in JMeter GUI (*).
> So, i don't understand how "switch off encoding" in JMeter GUI can possibly solve my problem.

Regardless of whether the JMeter proxy records the session correctly,
to be useful, the test plan must be runnable independently.

Therefore, you need to check that the viewstate can be captured OK in
a variable, and when the variable is used as the value in the HTTP
parameter section that is sent correctly.

> I will check again in debug mode to get the exact stack trace.
>
>
>
>
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: jmeter-user-unsubscribe@jakarta.apache.org
> For additional commands, e-mail: jmeter-user-help@jakarta.apache.org
>
>

---------------------------------------------------------------------
To unsubscribe, e-mail: jmeter-user-unsubscribe@jakarta.apache.org
For additional commands, e-mail: jmeter-user-help@jakarta.apache.org


Re: Parameter value corruption

Posted by Olivier Schmitt <ol...@agriculture.gouv.fr>.
> 
>> The view string change for every page.
> 
> 
> Which is why I asked if you could try a simple test to extract the
> string and see if it works in the following page if you switch off
> encoding.

As far as i know, the proxy construct HTTPSampler inside the following code :

	public void run() {
		HttpRequestHdr request = new HttpRequestHdr();
		SampleResult result = null;
		HeaderManager headers = null;

		HTTPSamplerBase sampler = null;
		try {
			request.parse(new BufferedInputStream(clientSocket.getInputStream()));

			sampler = request.getSampler(); (*)

			/*
			 * Create a Header Manager to ensure that the browsers headers are
			 * captured and sent to the server
			 */
			headers = request.getHeaderManager();
			sampler.setHeaderManager(headers);
			...

It seems the parameter is corrupted before the HTTP request is displayed in JMeter GUI (*).
So, i don't understand how "switch off encoding" in JMeter GUI can possibly solve my problem.
I will check again in debug mode to get the exact stack trace.





---------------------------------------------------------------------
To unsubscribe, e-mail: jmeter-user-unsubscribe@jakarta.apache.org
For additional commands, e-mail: jmeter-user-help@jakarta.apache.org


Re: Parameter value corruption

Posted by sebb <se...@gmail.com>.
On 15/03/07, Olivier Schmitt <ol...@agriculture.gouv.fr> wrote:
>
>
> > You should be able to extract the base64 string from a page, and put
> > it in a variable.
>
>
> > If you then use that variable in a parameter, and disable encoding,
> > does that not work?
>
>
> I can't record my test plan properly.

Yes, I know.

> When the view string is corrupted , I can't go anywhere,
> every single click re-submit the form, the proxy re-corrupts
> the view string, JSF re-throws exception.

Yes.

> The view string change for every page.

Which is why I asked if you could try a simple test to extract the
string and see if it works in the following page if you switch off
encoding.

> My organization, 50 developers, use JMeter , we force them to use Jmeter :  i would like to
> find a solution without any extra load for them.

Unless there is a public server we can test against that can be used
to demonstrate the same behaviour, it's not going to be easy fixing
this. We'll need some help from you.

---------------------------------------------------------------------
To unsubscribe, e-mail: jmeter-user-unsubscribe@jakarta.apache.org
For additional commands, e-mail: jmeter-user-help@jakarta.apache.org


Re: Parameter value corruption

Posted by Olivier Schmitt <ol...@agriculture.gouv.fr>.

> You should be able to extract the base64 string from a page, and put
> it in a variable.


> If you then use that variable in a parameter, and disable encoding,
> does that not work?


I can't record my test plan properly.
When the view string is corrupted , I can't go anywhere,
every single click re-submit the form, the proxy re-corrupts
the view string, JSF re-throws exception.
The view string change for every page.
My organization, 50 developers, use JMeter , we force them to use Jmeter :  i would like to
find a solution without any extra load for them.

---------------------------------------------------------------------
To unsubscribe, e-mail: jmeter-user-unsubscribe@jakarta.apache.org
For additional commands, e-mail: jmeter-user-help@jakarta.apache.org


Re: Parameter value corruption

Posted by sebb <se...@gmail.com>.
You should be able to extract the base64 string from a page, and put
it in a variable.

If you then use that variable in a parameter, and disable encoding,
does that not work?

On 14/03/07, Olivier Schmitt <ol...@agriculture.gouv.fr> wrote:
> >
> >
> > Can you successfully send the parameters if you update the test plan
> > and set the "Encode" check-box off?
> >
> > I.e. can you manually make it work (without or after using the proxy
> > recorder)?
> >
>
> no.
> JSF needs the view state of the current component tree in current request.
> This view state is gzipped byte array encoded in Base64, so a human can not set this field
> by hand.
>
> JSF renders HTML by himself (computes name of input, ... ): input, links, ...
> You can not set the parameter names and values by hand.
>
>
>
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: jmeter-user-unsubscribe@jakarta.apache.org
> For additional commands, e-mail: jmeter-user-help@jakarta.apache.org
>
>

---------------------------------------------------------------------
To unsubscribe, e-mail: jmeter-user-unsubscribe@jakarta.apache.org
For additional commands, e-mail: jmeter-user-help@jakarta.apache.org


Re: Parameter value corruption

Posted by Olivier Schmitt <ol...@agriculture.gouv.fr>.
> 
> 
> Can you successfully send the parameters if you update the test plan
> and set the "Encode" check-box off?
> 
> I.e. can you manually make it work (without or after using the proxy 
> recorder)?
> 

no.
JSF needs the view state of the current component tree in current request.
This view state is gzipped byte array encoded in Base64, so a human can not set this field
by hand.

JSF renders HTML by himself (computes name of input, ... ): input, links, ...
You can not set the parameter names and values by hand.




---------------------------------------------------------------------
To unsubscribe, e-mail: jmeter-user-unsubscribe@jakarta.apache.org
For additional commands, e-mail: jmeter-user-help@jakarta.apache.org


Re: Parameter value corruption

Posted by sebb <se...@gmail.com>.
On 14/03/07, Olivier Schmitt <ol...@agriculture.gouv.fr> wrote:
>
>
> > There are some problems with encoding/decoding which have yet to be
> > resolved.
> >
> > There may well be a Bugzilla issue for this particular problem; if so
> > feel free to add any new information to it.
> >
> > If not, please create a new Bugzilla issue with the details from this
> > e-mail.
> >
> > Thanks.
> >
> > Note that patches are of course welcome, but they must not break any
> > correct behaviour and/or functionality.
>
> This issue http://issues.apache.org/bugzilla/show_bug.cgi?id=38115 describes a bug on decode phase
> but i'm not sure my issue match this issue.
>
> I'm fully aware of that : i've patched jakarta slide last month because of a major failure.
> I must patch jmeter because we need it.

Can you successfully send the parameters if you update the test plan
and set the "Encode" check-box off?

I.e. can you manually make it work (without or after using the proxy recorder)?

> I know jmeter as an end user, and i don't want to break any correct behaviour.
> Please let me know if you have any clue about how to patch this behaviour.
>

---------------------------------------------------------------------
To unsubscribe, e-mail: jmeter-user-unsubscribe@jakarta.apache.org
For additional commands, e-mail: jmeter-user-help@jakarta.apache.org


Re: Parameter value corruption

Posted by Olivier Schmitt <ol...@agriculture.gouv.fr>.

> There are some problems with encoding/decoding which have yet to be 
> resolved.
> 
> There may well be a Bugzilla issue for this particular problem; if so
> feel free to add any new information to it.
> 
> If not, please create a new Bugzilla issue with the details from this 
> e-mail.
> 
> Thanks.
> 
> Note that patches are of course welcome, but they must not break any
> correct behaviour and/or functionality.

This issue http://issues.apache.org/bugzilla/show_bug.cgi?id=38115 describes a bug on decode phase
but i'm not sure my issue match this issue.

I'm fully aware of that : i've patched jakarta slide last month because of a major failure.
I must patch jmeter because we need it.
I know jmeter as an end user, and i don't want to break any correct behaviour.
Please let me know if you have any clue about how to patch this behaviour.



---------------------------------------------------------------------
To unsubscribe, e-mail: jmeter-user-unsubscribe@jakarta.apache.org
For additional commands, e-mail: jmeter-user-help@jakarta.apache.org


Re: Parameter value corruption

Posted by sebb <se...@gmail.com>.
There are some problems with encoding/decoding which have yet to be resolved.

There may well be a Bugzilla issue for this particular problem; if so
feel free to add any new information to it.

If not, please create a new Bugzilla issue with the details from this e-mail.

Thanks.

Note that patches are of course welcome, but they must not break any
correct behaviour and/or functionality.

On 14/03/07, Olivier Schmitt <ol...@agriculture.gouv.fr> wrote:
> Hi,
>
> i'm using jmeter 2.2.
> I try to record a test plan with the proxy server.
> My web app uses JSF 1.1.
> The view state is saved in HTML in hidden input control.
> A view state is a tree of JSF component state saved as a gzipped base64 string :
>
> ...
>        ByteArrayOutputStream bos = new ByteArrayOutputStream();
>         if (compress) {
>             zos = new GZIPOutputStream(bos);
>             oos = new ObjectOutputStream(zos);
>         } else {
>             oos = new ObjectOutputStream(bos);
>         }
>         oos.writeObject(view.getStructure());
>         oos.writeObject(view.getState());
>         oos.close();
>         if (compress) {
>             zos.close();
>         }
>         bos.close();
>
>         hiddenField = " <input type=\"hidden\" name=\""
>             + RIConstants.FACES_VIEW + "\"" + " value=\"" +
>             (new String(Base64.encode(bos.toByteArray()), "ISO-8859-1")) +
>             "\" />\n ";
>
> ...
>
> sample :
>
> H4sIAAAAAAAAAO19CXgcxZV/ayRZh2UsyZLlS/YQ29gGPDrm0OGQIMuyLVY+sM3...
>
> When the current page is submitted by the browser, the proxy update the string into :
>
> H4sIAAAAAAAAAO19CXgcxZV/ayRZh2UsyZLlS/YQ29gGPDrm0OGQIMuyLVY sM3...
>
> the "+" char is missing at the end of the string !!!
>
> So, JSF can not deserialized the string into objects : it crashes. (UTFDataFormatException, ZipException, ...)
>
> I've remotly debugged jmeter to check when the value is altered.
>
> When Proxy class record an HTTP request every parameter of the request is  always decoded.
>
> The HTTPArgument class is used to represent a request parameter.
>
>        public HTTPArgument(String name, String value, boolean alreadyEncoded) {
>                setAlwaysEncoded(true);
>                if (alreadyEncoded) {
>                        try {
>                                name = JOrphanUtils.decode(name, "UTF-8");
>                                value = JOrphanUtils.decode(value, "UTF-8");
>                        } catch (UnsupportedEncodingException e) {
>                                // UTF-8 unsupported? You must be joking!
>                                log.error("UTF-8 encoding not supported!");
>                                throw new Error(e.toString());
>                        }
>                }
>                setName(name);
>                setValue(value);
>                setMetaData("=");
>        }
>
> At least every parameter value is decoded with  URLDecoder.decode().
>
> My parameter value is corrupted because of this call :
>
> URLDecoder.decode("H4sIAAAAAAAAAO19CXgcxZVwz+iWZcuSJdv4HDDGds", "UTF-8")
>
> returns H4sIAAAAAAAAAO19CXgcxZVwz iWZcuSJdv4HDDGds
>
> Any idea ?
>
>
>
>
>
>
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: jmeter-user-unsubscribe@jakarta.apache.org
> For additional commands, e-mail: jmeter-user-help@jakarta.apache.org
>
>

---------------------------------------------------------------------
To unsubscribe, e-mail: jmeter-user-unsubscribe@jakarta.apache.org
For additional commands, e-mail: jmeter-user-help@jakarta.apache.org