Basic SB1 Application Development with WebServer and MySQL

Mark Jolley -
9 MIN READ

I thought I would share my experiences with the community from when I created my first application and the hints and tips which I picked up from the internet and from colleagues. Hopefully the information below may help others who want to take the step to creating their first "Hello World" SB1 application. In this guide I will show how I have completed it using a Windows 7 machine, however it is just as simple to do using Linux and I have included links for that too.

 

The simple idea I wanted to do was to scan a barcode on the SB1 and then search a database on a server, find the product, return the data and show the data on the SB1. A basic price check application, which is a common use of the SB1.

 

Now being a native developer, this was one of the first time I had done a web based application. So the first thing I needed to do was get an environment set up. This was where I had the most issues and annoyances! The main problems were interference with other services which already ran on my machine (IIS, Soti, FileZilla) which all used port 80 or other ports which the webserver used.

 

Installation Tips:

 

 

Develop a Simple Application

 

As I mentioned earlier I wanted to create a demo price check application. I started by using the developer toolkit applications as a base http://support.symbol.com/support/search.do?cmd=displayKC&docType=kc&externalId=13880&sliceId=&dialogID=481754905&stateId=1%200%20481746650

 

The application I used was the Price Check App found here TSDxc60AenDT000700\Sample UserDrives\Full Sample User Drive\UserDrive\apps\PriceCheck

 

This does exactly the scenario which I wanted to do but does it locally on the device. I need to move it to be hosted by a webserver and the data be stored on the database rather than in the application.

 

Checking the WAMP Server installation

 

When you run the WAMP server if all is working as expected you should see a green "W" in the taskbar, this indicates all is working fine. If for some reason the icon is orange it may be that one of the services is not running. Always worth a reboot of the PC if thats happening. Else click on the "W" and this will bring up a pop-up. Here you can choose the Application, Service and see if they are running, if you are seeing problems, it maybe that something is already running on port 80 (which is what WAMP uses). You can check this by using CMD as using the command netstat -aon, this will list the services running and on what ports. However with a clean installation as suggested you should not see any issues :-)

 

Setup MySQL Database

 

Here is where we want to put the data in order to search for it.

  1. Load up the MySQL Workbench, this is what you should see

MySQL1.png

2. Now select the database in the left column. This will bring up an editor

3. Here choose New Schema and add the scheme name of product

4. Create a table with the name stock and then add the columns :- code, info1, info2, item, description, image - Set Code as the primary key, and set them all as VARCHAR(45), bar image which will need to be bigger to include the image data. Try VARCHAR(1000)

5. Save and apply that and this will create the database

6. Here if you right click on the table stock, and then choose "Edit Table Data" it will allow you to input the data.

7. Here is used the data from the Product Info HTML page

 

 

                                        {                                                   info1: '$5.75',                                                   info2: '',                                                   image: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAACWCAMAAACsAjcrAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAMAUExURQEBAQICAgMDAwQEBAUFBQYGBgcHBwgICAkJCQoKCgsLCwwMDA0NDQ4ODg8PDxAQEBERERISEhMTExQUFBUVFRYWFhcXFxgYGBkZGRoaGhsbGxwcHB0dHR4eHh8fHyAgICEhISIiIiMjIyQkJCUlJSYmJicnJygoKCkpKSoqKisrKywsLC0tLS4uLi8vLzAwMDExMTIyMjMzMzQ0NDU1NTY2Njc3Nzg4ODk5OTo6Ojs7Ozw8PD09PT4+Pj8/P0BAQEFBQUJCQkNDQ0REREVFRUZGRkdHR0hISElJSUpKSktLS0xMTE1NTU5OTk9PT1BQUFFRUVJSUlNTU1RUVFVVVVZWVldXV1hYWFlZWVpaWltbW1xcXF1dXV5eXl9fX2BgYGFhYWJiYmNjY2RkZGVlZWZmZmdnZ2hoaGlpaWpqamtra2xsbG1tbW5ubm9vb3BwcHFxcXJycnNzc3R0dHV1dXZ2dnd3d3h4eHl5eXp6ent7e3x8fH19fX5+fn9/f4CAgIGBgYKCgoODg4SEhIWFhYaGhoeHh4iIiImJiYqKiouLi4yMjI2NjY6Ojo+Pj5CQkJGRkZKSkpOTk5SUlJWVlZaWlpeXl5iYmJmZmZqampubm5ycnJ2dnZ6enp+fn6CgoKGhoaKioqOjo6SkpKWlpaampqenp6ioqKmpqaqqqqurq6ysrK2tra6urq+vr7CwsLGxsbKysrOzs7S0tLW1tba2tre3t7i4uLm5ubq6uru7u7y8vL29vb6+vr+/v8DAwMHBwcLCwsPDw8TExMXFxcbGxsfHx8jIyMnJycrKysvLy8zMzM3Nzc7Ozs/Pz9DQ0NHR0dLS0tPT09TU1NXV1dbW1tfX19jY2NnZ2dra2tvb29zc3N3d3d7e3t/f3+Dg4OHh4eLi4uPj4+Tk5OXl5ebm5ufn5+jo6Onp6erq6uvr6+zs7O3t7e7u7u/v7/Dw8PHx8fLy8vPz8/T09PX19fb29vf39/j4+Pn5+fr6+vv7+/z8/P39/f7+/v///wAAAJJCwWIAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAAadEVYdFNvZnR3YXJlAFBhaW50Lk5FVCB2My41LjEwMPRyoQAAashJREFUeF5F/QdYm9m1Ngxj0yQQQiDRe++9994FCKEGEiqA6KJ3RO+9996bjXHvbTy2pxd7+kwmySQ5OclJT86b5OTNe/334znf9W8DBhvjZ2nttda9yr63Sn5JhUJRUV6hqFRUVlVVVddgVdVi1dXX1dWWldTU15ULYr3tzc3sgpjCAnmRvPlgMoeVncVmZbEy8Z4R6Rvo6x8eGRHi5+Ph4uTk4eMrP+3IEeVERcRGGtBMsysKlN/+qVsuyhW3dDZXFeFHSArKqnv7a3KbC6OjYmLjosOiYmNj42KwomK5OdzsrKwsNpvFjAn3cHCwt7O1s7N3sHdwcHJydnHz9AljD756uzzY3TfGxdzRxcnZ0d7OztbGSqW8uloBMSBIVTWxIEFtVW1dXT1WQ01xeSX+oLGxujArxtPazMo9LE1QuzcnzMT/lAVBMtKZKWFhyd6u3t6e7k4O9i7+kYkpKYqTTlFebrR/uIs+zcBXWNb3wQfKHGYar6VeJs4rK1c0KAeHlTlBQYr8iMhYSBIbFwdBIExsTBxXwOXgVcJ7RiwhCB4SgmA5OEIQVw+vgND4jORAL/cwVrSjg5uLCyGIna21SlVlBYSohDaqIUlNDWSoq4YYDQ2NjXX5yRx8TWinob66OCclxMPOxilzazkvEy9aNpuVzkxLS4sICHS0dXLGS+PmFZGBxSw/rc+SCCMsGbpUqollRGFJZyPLz8kmoLaxoqqupat/dLSnNNbHN6BAEhoZH5+AFR8fHxcXnxAfl8AV8LnZbDbe0glBIIcNVGJn5+D4RhB3T28/fx9vr4CgmOz0qHAfVxcn6MzW1kZFoVBgR73RBiEIoYuG2vrGN6u2Rp5aSeyw2ppq4nsqy2S89JCU1Q1ZFtSP/4zFykhPTwoOCAoKCwuLiElNz8zKyMxMl5+0BIs59nr6VKpOYLATU5wX52ZpRLOr6e8bHB4eHhmozQ7xDQjyzuIFRSb+uCBLQkJiYnwiN+d/BclKj418I4gtIQihEEIQV3cPT08vT29meoIwT8YJcnN2diC2lo0Knr2WsIs3xoHPa2vrG+oaGpuaIEj98G5TFSEI5KiE5sorKqsriivWtgohRXY21J/FjE9OffP86ZnZXA7+BHaTLj0ctEyP1TFyoVNsIlxt/NkxtkZ0fapdw9zk+MjIcIsoOsDfK5YVFR/tGpKcnJSUmIR3iJGYlJDEy+G90Ug2Oz0u0tPe3tbaGnvrfzXiBElc3dzdPbxiUtLG1xQJPm4ubwSxs1d5Ywz19cSrTuwqfNZACPLjauluxVe1hK6wBcvLysorymsb13aL8D9xOFyYY0RoYEBIRExcUGIWm4snYLEgVN7uBMPDRd3YR8/S01HPyDEl3Csw1Jri0Do3OTnZVZAY5O8dwsmUcaJDLO0DYpJTIAeEgURJCcn8XEIjeFGyM+IhiJ2NNSGJvZ29I7G3nF1csL2gFa/w6i9eN4e5u7pAJxDPTaWxoaGJeP0bsGAZsI2Gxjc7C8IQfwrJaohdV1kJ31aiqBTKa1YOygg5OJykSDd3Tycb54CIuMDYbDaHMNOszMzM3M0lc1NLhqWbW0JoYlqWrLGlZ+OQo+vSvrQwpUgJCgjw92ZVCONDQpjxIVZOAXEpUAt8BCFOsgBbC4vH42bER3kQm8aa2Fy2dg6EtWN3Obt6eECUiMZvfjcV4e3lHe7j5eXp4aHS1tbS2trS0tzcQnx4s5p+3FnEe8OPBlL9Ro6yIllBXkqSeO6kitAHl5vs7+Lm5R0cl8HKxo7K5guwcsX5RVXTswWyUkVtY2tH98DwyMjQ0PLLlyK9gKGtIUFwYGCAPy8vP03m6RIiKpcEO1rZ+8enpSWnpCZDlhQejB2vEZfDzYyP9rS3hUbemPuPbgsacXJ2d3f39A1jVnXwQgP9gzIDvLA8VRTVtU3NLa1tLW1tyrZWLAjUCKmaoQ6Yx/9n6ZWK8jJFuUzIz2ZyJi7Xc7Px6NnZmVksNocD75WcGM/Mk0rzBAKpsqe7u7Ozb6C/v6+3p7e3t3+wV9m7cvd2pp7f1GBSSFhwQConQ5pfxHcPTCssFvCSwlytbH3iU1LT8CsljS8U8CAJIUgCBIFjJTSCzQWN/Oi3vPz8A0PDI6LCAgMCA/xCRYHe8GLeKm0NNVVwv9W1Dc2QQqlsVyrbmlvbIFkTIQhhOsTWqqooK62uywwO9PMO7Tpr4qRERoaHRyemRGVjR2clRvoFpvIFImlBfllXR3t3d1dXd09Pbw/e+wcGB/rHdh8eZOn7j5XGRETHifK5IXJJeXxYbDonpyA3Iz053MPaxi8hg5mezkzPk4py+DxisRKi3aEQK8JIIIiji5uHt19AUHBoSEgoVlhIcFCAv1+YKMDH18fHR+XK9sL4QGdzHZxShaKmvhHKUba2tStbscegE3gBItRDIaUl1Y2p7s5ODm71V9q4icEBwYERyWnx2Vwuhx0b7eEak80trG+tqO9oburs6OrugjZ6ujsJQYZGli6fr3LpIQN5UX58sSTNP7SYHYbwV9w/flYOB56eFuNj7xMYmZaVmSXPzxPmCHKwshMjXa2trKxs7BycXD0hQkhYeDjcfBikIGQJCQoK9PcN4wb6E0vlT//x3avnd07WpwaUDdU1DdWKypr62gaopLW1ubGecMdESKyuhCA1LenwFoH+iitd3PTk1HQWhMDCNkiJCA5N4Yor6+qKKusaaps6utpgewhEVb0DiByT60fHMzI31kxuUnpGdrCXR0hCTFw8q2p+9aNvyzIzMzKy2JlsjrdTOBxGeZFELBIKRXlCTnyYqz1E8A0Ixk6KJFYEIQneQoODQ0JCgoMhSmR6YAC8h7/K3//9//7vP/7yXz988e69w6muwZG6ejx0RRW2WlNzE7xYHUIMYewIIg3tLK/0hMjYqit9HDb8CvYyfhGiwPFncfgFFSVFRcWltdWNLaWVspJCubSorH9waHhkYmljbaw6S7EqFJQF+nv4hEbHxaSWjJ/slzS3CojIw+bkVLXI4rBPBfUV+VJxXp5YnMeNjw4Li4yKjo2JiY6KjoqMjIqMgAxQCKGTcHwIDvD18gnz8vP18fZWufrkg69//dd//b//+8+//tfXjx68c7Iz09/S2NRAON3q6jrCFddWKQggU9Hcw/XPi+Gwm86HuVnZEIIAEgiL+O95kIufX15WWlFe1VxVU11crairb25q6xoegiCj03NTI425Jd25SUkBfiExiXGJ0pHDqzf2BeEpCKGIrgJFdY2yq1DAE3bXyPMlEjEWPxVeGaiFECQagkCUCKgjPCI8Iiwk0M/TFbHQ3t7Vz90DiMtJpb2rf2xx7/rT1z//wz/+9X/+++9//v0Prx+cbm3ODve0tzTU1pQDwdRUA3+VF9f15QbGsJkhZVcneBCAJ8oVSWT5cnlhcWmxGM4mp7yxta2tvbOtQdnR2dHR1tLQ1FCpHBkZGZsYGx1tFVbtdSRExMYjWuT2bB1Pr97c5wTGI/JkcwTC0pbF0c5iIV+80FZcKJNIpBKxgIn4AkEIWPxGjiioJDw8NMDbzQlOzMbE0c3NzdU70IlwZ04qAISNLW0d3X3Dk2uHtz/6ya//+T///Mef/+vPv/rixa3D1anBjqbG5gYIA5W0DEuCkznZ0dLzWT4gY7a0UFwgF0mLi4S84qYqaU52TkFJRUmJsrFCkS8R5sJeJUXy1tHRkcnpsdGRNlHTwxV2OjMulte9fXLWnCzbPeIExOHncHgCYcGN/7rZWlIkK300XgZJpFCKgJmaAhD2RiOwj/CwIF9PZ3hhwn+5e3pZM5wQ1x19IpzeeGWVCrhegBNYQ2l1bXVdU13vxNL5nY/+8vf/+fe///GHH1493JucXRztUTZWlbZOFcbkIJ4rzhb5LLakoa6oqq1NXtrd2cAV9TaI8zk5AliLoLm1Rl4oK68qlzd0dPT2wwl3dAyMjCqlykdnhelMUffulcuX90ubGxZO+f6x7KxsXq6sqObww59dbakub/zVTkWJvEAGO8lJT06Kj40h1BARHupqZW1ra29gBnSCQO7u5mrrE+3j4e4Sx3NxdXFxc1MpKS2rAIavrCznyWpgaLkJickZvLaz+x/97Dd/+Mvf//XvP3323usPn1zbXRweXypNEwqyMwsvrwkyWcKWtpZmsaSvo7mmjZdaUcorEQje+P+q9qa29ra21rq6pta2JiVWW8fgyEhXYceDR9PlQwfnZ2dXru0olF27l/lIb/IKSqvqWzp6BiYGOpX1g/99uxYqKSiQSXiwdVg03BMcVICnq5uHh6u5OZ7a3csbi7Na6uPp6RGX7O79JrIXFxWVlJWVlZSVZKYVytkp0cHR0SGhuZW1vRPLB9effvzdD7/56//8v3/97Tfff/zoqComMzPBP+t0k5+eySpqbCnMTFP2dVfkJMdLZSkFAj5h81y5shHwjcjLmlrb2zu7+3u7+0eGR7pzau89e3jtzo3zK1evXb3SVTx876YoXVZcUdPY1tU/Mj45MdLVVj3482uVRVCIRJLHCoJ3DfDz9fb0gC04E8vRN8LZzd0XIMfPjyUJg7fy8HCGiTja26sgdy0qLikpLi7KCmbmMgPdPIKDvLyYOTVEZtXU3js2u3n17dff/+df/vnv/7pTGxkc7O2Scbybw8zILGqqqhbLO2qr4+Ec0zMjAbUgiCBb1NxY19Da0NjS0NjZPzA0MjoKCxkd60zMu//y6aN7N69du3Hj5u2z7Rtv3aniFFfWt/XCq80vzE73ipgp7HpxMgwDUDg5zj84JMjXzckB4ORNnuvq6hEZAggfEBxEADYfiOPtaEgnlr6+ilgmyy8swpIzvYKTkr2cnN1cnFwi2IqyMuSNRJpS29Q5NLN+evvZ8+sN4f7e7s5ph0fC9IxMaWVuSVVdEVealcEhcCM7R8DPEQo4/Frg0I6OTiCu/uHB0TF4rLHRgaHuWO7jD58/ffzgwaOnj++eH65PdNcLBNVN7T3AlROzCwvT7anudjYI5ARAdHJ09vEPDQv2d3cCgHdyRhbiAfPwBdT1CQoNCUY0BPz093akaFMo2lgqQmGeMFcklspkafi+cHcnqMnBySO7+I2iykpLywnsUkVkv72H7XEhgf6ezP3TPMCiLA4Qb3YZR6ooLhXm5+Qyc3JzhUCVnIqefgATLHwY6m7vGu2qb+io7EjP//D7rz/74On1rUlluTg7PS01lSnGf1NW09Y/NTfVW1eQ6GhoYkRnMBjG1qaGxq5BsPFAL+QbKDpACG9vH1+gKl8/BMMwyELsPC8HHQohCIWiUoUsoxA1gdycDG9vd3dsNwJpuvJgbwWFhYX5+E0mK5AXFkg5+StT9eVyMa/05LI4LS2ViYw9NaGpva2qJDe9jJ/LyhWKRLmC7OySXsArRMLBgaG2tu7aqvaBurxxRVvP2Qf3tkZrBckRIWGxzCyeIBeCs9MyOTm5/OysTGZKSqyzoaOjhbm5mbOXs5GxW2hUVESwNwyESAmBC339/IFGAgJRsYlAYAfeCvGGIDo0OhUaOVga6+9qa6yrriiM93Cxt3G0t7V3tHfNLpDC4qQSkShPBI2JBBx2TGr7YHtDTalYcXRFggQ3jZmWkhxXKBPwM5PDomMiEwmNiHJ42QU9o5MTo5BkaLgmf6JlZFgJ8FU2WJMT6WrhGxEWl5bFFRXAnCV5+LkBjq6ewanYE7nVSpaTubOXp7urvZu3p6OlV1QcKkW+SJo8AdR9IURgEIGvQqJjICGcMmCXn72ONsXQmK6np/KXv/3p11+/d/9sZ2miOsLHzcbJwdbeycGPn4sdz8/hc7g8Pp/LF3CymBGBfr7Z0fFSnnT7egHEeFNCgTzJKRmCAlZ8SGyuEP8iJ4cna+vrHxoj8qnB/qad1bPz1bHVmaFJqYerBd0zMQs/jZ8nz8/HCwUgEmjnEZ7X3D08X9c3w3MysXZyMDe3sLZ187P0i09Jio8K8CbkgC4Cg4LfwPfQ8Nj4WEAWxPmomAB7HS2qoYmFuanKwtGdl59//8N//PbXP3+9KE5C4LSxc3LLaqgsLZQKeTwOC1k4ij/YREE+DpbJQWElovzNW8VpTCaTkAUYnMks6BhUMoPi88SinFyBgJ/f1NDcODwKbALce/vu24+vHx3tTo0WOFkY0z0TIEhOrqRYXlhYAFkKw5yD5DOX1i9dn+jv4zib2zq7u3l6eHkHOlgFpmSlp8SH+Hp5+/gjDcFOImBWRFhkQmI8KmAAYHGJwXY62jq6VF1dqgpPIMova+4emdu6fPekReJsb29j6xizcO1gfW64s66qPIOZmpqSmhoTHRfgYmcV4BlXLS/euFNBCEIIkUZsMElzewczMEUmLSltqigUyFpqGip7xwYG+ofmzl5+8skHD6/sLg8PF1vr0fU9Eti8HKFIWgqHD8PLL41xTZl5+vLGwdbh/LDA1dTSyt7FE1bsaWsbzORlM5PD/WEayKbCgYNjkMNERUYnIR8lCnpxyelh9tQ3xq6tpZKZyWJxZDKJIDsrOzUsyM3eztrWPvnmd9//9Ceff/BgpyszATWB1PSE4PAwJ1QCbNIbG2o271URiWk6E/g0JSUlnSuWl4tZOcXyjv7RAWVeQXtre8foUBfc78T6s59+9/rl7b2luQkFCl16HonZAmFeXj4y59Ji4M2qRO+i3Vs3r7318NbKiNDD2NjEzMbeBRUeO4cwVg43Ky06OIDIRyJj4pOQDackJ8TGIbVHRS8hMSWDHQljJ5wvjD0RNcsUsVTMz4hDrdXJCUmyrYNPXuvQ4v75vUfrhf/7L5jRnv4O1jZWtrntPd0nj2qSUtMysvkiSWFFXWvf4Mj62fnmVENh9/joxFBBSW8f4uDk6MT48MTKk28/f/vO4cJ4X4fc14xB90zi5ORJJAU/5pzFRQ1p/h0nZ3fP3/nmvZVRqZepiZmFs5sDHKe9Q4RAlsNhxYUhM4zELkphotKcmcFMTkaZNglAKi0zmxfjRNOhYunSVEpyuOysPIlIkB4VFhGEGqsdEmTXyIQkZhY3R5idmJDKYiUlJmak+7jYIXe24M0tTl1+PKMcmFjc3Lt0/c6Dhw+vrW8frS/21FcWdE2NDneX1I+OjU8Mjg5PzfQ0jd2/u9lWV56fk5UhFMV4ewYlcXIlMpkcOSdRKCtpzfSvWTi59eTbr6/OzRX4o87gQFSp3L18gpmysjx+dlJkaHhUTFxiKtJIIgXKSk/PykhNhnrSszi8aFdrSwtzCwsra5U7w33t9ZXlxUUQPyszHFU7qMQlIiY6JuZNahaTUKIIi4jIyI50QInVwTz7yu3t47eePX3x5MHDt++eX76yXVLe2JNuaWxoL0SdRQSgniMV5RXEchRVsnhn79gwd6f4rPTUVEF9aXpkWFgiSkGFhSVEKaBaoShrz/aVzR7d/OGrvdGJqYLEuNjIxFQmKksiaXlFUakkl5sSExEJOZLTkbbAgcL7ZHHw41JSmRn4kwQExrCISKQrKj/84pc//OSzdx9c2Zkfaqsp8oHXsrR1CY3EX2MhIkUXNbNLJNnZsUSwdDQXPPvo9srkkHK6Rioty2Ulckoss7qHfbRJWrp27o5Wpgx9Go2qR9VWN5XKnNXJ2lQ9XYv88aGBzqrmsuzk2IQMgawEcKGxGRVZqKWd7ZvZsXh0d0/Z0dVeW1pQvtZdVlJcUq6orS8TFcryBGlxSHaJfQV9ENgaiRiXnZEKVJCRxRFISmqb29qaa0tEKlWtfVNrx7eevPfqy68+2SplJ8RDeBYnIzbiTXIckagYmO3equFz4/1dUSOzLP34mxfdIn50ZFRcAvSbEC5z4PR1+ZjqaJMvXryoqoUgq62lo6WpYVlaHkqmGFrQaVal81s7Walt1VxmQlKWqIjIOTs6UaeBKMpMn4hEQVVDOVFdQ363+vMbw+3NTa0ojFWm86XSXGZ8NBSSwswgKmgIalyUU9loZ2SyucKC8oaukanp8X5oQIUPwCpEvayhsaFK2SR8I2V1Q1N9SRZROAoKyr+xfTh7WJfDlxVnOljbuwx/9rMPR+QlmRlsrkCUx0qPibGSHlbY61Np2uoa6hpUExpVn6ZP1dSwq1RE0/RMLQz1Hdof3Od4cnpbOMzEZLa0HLCtub+3qwOiNLUyvSMSWXllzf3jc8s7l06vvLo02N7couwZHqtLS05lMhOgkbjENBZ8RL5MVpgvFqE4zGZlZHF5EKSuc2xxdXlmtKdJJTbQzz9CmF97tLU8Pb800adsqiHaDJUVkuS4aGiFtzaz3S8X5+ZsnilcrW19Br741evFukp5nkgsluQL4mNtjaruVzrSqframiRNTaoeRZtKY1A1NIyzpN66VH2GuYn/wTtN5t783kZOelJKdkF1c2tL++hgTztUUleXGcUuaBzbvnLr5tXD9fHmzvePBjvblF2DUzOV/gCK/pEJCUlpWTmSAiQuFUVAhUKU69ks7DQewmpV2/DCxursSG+TSkJyQEB44eja7Vvbm6f3nzx8+PDe7evnJ7vrK7Njfa21FUXytuWBCqGAP7WoiAoKj8s7e//lWouiTFGCJKacBURhEt9R7GNmYKCvT9fXQ2pA09XTo1K0zUsXUmi6+nRDA5++2jTvaGFTWVZKPDRS2dTS1Kxs7p5c2T063BmtLcwvqaotlfCY8eFBnukvj0e7Ozp7RxeWG6KJ4IGeBZsnKiyrQt+spqxQAjAH1/WmhMTLlRYpGvunZicHulpUWAPZySzZjV998t1a9/STDz/5+tUnn33x+tNPHr/98p13333x9pO7D57eOpwe6BhpLxPy+AJeYVX/dEdzy0B7XWVZdYapsaGBuY+vs5WhoYGhsbGxkbGRoYGBAYOubyXsjDUwAgoycwgCxoiIi49CiTMoIi6JiSCcyizs3vnw21cvzga5MYkJ4T4eXv4IGCG8Z8fjfV09w9NrWz05QrFUml9QVKqobmjr7OpsrVMUiXMF6DFCEqLqzBUU1vWNDHU1tneUqoQxfTyDIob++snrm+s773z8zV9++59//Muff/+nb3744Sff/+wn377+xc+//9n3X3z68vGd8/2Vyb7mClnj3FBvz8hgq0KuYFmaGerS9PSMjIB4iLiE9x+XnoW9q5kuDRqiG5qYmlpYWVpYWFpbopJrhao02gSeIQk5Ih6LmRTLzJfh9xS8yFxuzeODyYG+wfGlnYO1yYmxwb7O9tYW2H7vYH9Xa72iQCQg2mSJSRmpcRnZLMnE6cOdrtzMspZsFX8nM3u/tJaPr5/fPrv59U8//OCH73/xq9/96r9//V//+Ns//hsi/f2///C7P//mt7/76VevPn73+b0rB0uLS7MT4zMrC70tDVxrcyP017AoFLwDLwD6EJ/hgza+BH7Qwu/4GyqgHY0GCd9ISqNqW7m72phhWVjFj4+Wl1RUto0s7pzeu7s3Mzo0OrdxfOl4e3F+fmywR9k1PtnTUdfRUV2Sk8zmxSTwBUmpWUKpuKxpaPfGu3vyosE+pUAlKJLVsnR8eXls+fzyvV8+3tn74Ouvn3/yiz+9fv6b3/31t//533/4+//91//89f/85Z//+Ps///uPP/vy453RraeP7l4+ONjc3D9rgSC0N2IQGef/Jmv/35dE4gaBiARO+39FhczEN5FJWhQrNxcThByavp7ou7sdPeMru5dvPnr33VuHCxNj08t7V25sjYx1lTXVFlevPHv2+O3540szvcpqeZE0T5xfKpfIZbyS0oLFW2/P1/YM5UWzVIIK2kd3ltdm+hdPDo4+mahTzJ2cLyzffHQ+9vzLn3/51U9ffPOnv/7+d3/71fd/+DOhmh++f3Tl8XfffPXxs3tXz+6/N21rbQrL/hG4aWkRr/+Pb1oUfEnWwh8Rf0eh4DPir4nvImuRNUlkio2rkzGNpkdn0EVfP+5BQ2hienVn+/Tm0dL01PzG0fU7880j1fKmhStnj77//PF/fHXpfH5kuFxcxIuLFwoRUqK8uCL+1MHx9PJxf2YoRyUgN4vfWNY4cfjo8Oj4+XJ5TtPYbFvTxN6meGznzuHmjdHDWy8fP/3y2eUXX3725U9/+PLrd+7ee/7Bu0/vXL919cmrNXsbc/03ghAPjuf/X3mIL7DIWMQHLS3Sm6UJD62hronPtKh2zvamdIaRiblF3Ma9ptqa0p6W+pnFtZtHa3Pzm8fntx+stvY1NrbNX73z3W/enr95f3yrX1ktzeOyQxwz+Pzk7Ejb+PRESX098JBAIOGohOawuXKRYvzD3z+/cfXtpyvjk1vHS2MLVy/V9u3cOJg7nVvcuHpt7WxbuXN+dOXJo6vHtx6cHty5srO5sLtw/Fa/nY0FQ/cNlP7x9f7/C0Imv3l2DQ1NDU1NTQ0s6IGshb0GqchaNFtnO2BdOw8Pj7j+7eL6jvbJ1vKRobU7l3Y2t46v3rz/uMtXXCRv6d49PZ5baW+ZrG0pF+eX5MfHuhg4+noFYK4CfaIcJP489KmlHJUMoUze2j49+84//va73/7pj7/+2VdfffftZ+99+cnDW48++ObVh0/2N/aubyyvdWwdzG09unq4to/AtbnU1Tw4VNV9WG5rZw1BYNjE/vlxd8G44bv09Gh0QyNjM3NLW3u0L4kuByY1EgC+mbaaZLK2no2TjbG5tZOTlWX4wLRIXlGnLC1SVIzev360t3fpxu2Hb/V6JPAL5LLmzqbWuaXl3d21zfX9/cliQVxobAaPJy5Go622DEkmT5AnyeWoFEu7+gYHenqvfvzVn/72y1/85+/+9O9//PVvf/ufv//tj7//y7/+9ZtfvHp0+vDJvfu9s9ev3Lrz8Ksv33n2ztuP7+1PbC6iD1/qYG9toEeFV3pjxG/2E80nKiIiKiE5Ky+/oLi0HF09okvcQrTC0NFra20I1NTSotAgiJGVuw1cs1/xeJW8oaWpf6R34uTh9ZPdg/M79x4/u75zfOnKzfsP3nr/088+f//r3/38wcnBandDRa6oqrESTQDURxEg88XAKhKhQAWlg4QQf++qYY60Ttk/OzW1ee3y3tHlu5///LvvvvnlD49+/6vnd9/68OtvZk9++ds/fPfy9//87z/91+9+/7tfffz6k49u7dY62Vkb6MMXUSHKG6erQzFILswvQ5+ro6tnsB8VroGBPqIL19XV2dFW34BximCSlpaOvq2jtaldoL2ZlZVTzPzza5cefvzzX/3Hb343N7x9eHr9/v0nz9955/Hu4aPLL25fvzQ2oOw7PWpvaaypruSl8SUSAXIRSVlJvlQKyJInlQmZKmGJgbGcWNO81Ra5ovvmt49Pb29eWV+/Ob7y5PnLdz98v7a+7+Tx8+ef/8fc7p/+8a8/ffuP//vvf//9j3/++5//9s9//OGLh42O9laGAIk0mqUJnWofHuKFCiezpL69o0bZC+jX1dWB5ydiGtHrRjevuam5IZSspU2l2znamDuFu1jZ2HqWXvvN969+8dt//uvff/ljR/va6dmtR09evHt5qa987trsxoCyBe2Cyu7uqqbW+pZaXrJIIhQXFEgLClAO5KTGhQf7utmbqqQkZZf2NUaKH/7nq//4y9///cdf//Dd7z754Z+f/58vbt+7e/fm/vbC5c/O3vn+7vGnP/vVP375/Ff/+tsff/Xr//zr33751YuDmTkFthZRVaLp2luZuoSG+zt7xvEKawEHFY1NLc3IOmqbm9D+QneytqbhTTu/tTkKcujS7R2tLVyiPWwdnXzKbz1ZeXh398H88Mbj4ZndsyvnV/aXxqqFspKC3ApFiRxYrLxYJinGdElnQ5WkFJ0gQVpKhDesDNuB2NhUqgqqXTGpfGlh8+TG2z/59Z9/9c3X73z25S/+8eu/f7C+ubm5fePFo3vXdm7cWTh5eXr+/GjlxpdX9jYevdzsSs+fn+qrTnawIwRBPMCjWRozDBnugYGs2npi5qO2TdnY2qpobq6pbaiqqJZJayBHU1Nba5w2ALKBg6NrSESyt72zR2rPtXc//uY3f/3TR/d+84e12ZHBDqDi6opqyC5hSURcnqi4oqjII1CGwgI7MdzP1dqErkMfzEV0IuvAq7xZKuHIAxPSORxWBrekpX9rd+ntG9cu3//t27/87uT85oP7J2dPfgqT+O1//O7Xv/7Vz7775psv31op52d6WEYLyrODHW2Q4hszoBAgECwdvDra1PBqDEwQvd2G+tbivKJCeVldtaRYLKuAOloxmJBC09LRNXC0T7tyd72eHRMurKlfeO+Dn7x+/bOvv7rRVJRbWFqYX9NUU4ECRX6mUJSVjrZVaKCJuYu1laW1rbV9YKAF3cDuuE7f1NjUxskvIj4eSb0KUS2KT83CoAGLQ2BK0Uxv1+DknbUH746NrV3aKCpvu//7P/7lTz/72+9/81+/+9NfPl9szMkuzvOydrUBBrQlJnN+FOQNhCIAFdUwqayxHcbR3t3W0FBV3VRP2EcVmsQNjXWNzRhGKAx3ZFAZDrbs93/3H99+cCZLzmTKT4Z6mpu6ajDRI88tKJJIK0plnMyUmFAfdw9XZzsHt5DUjOi4ysHFzaE6aXdzkqujf36shyAxKlUgh67La4pVHAODvXyDw2OZzAw0mlkpSWx+YU//6NLBbl/nYBWfk1P+9Bff/fD9uz988cGrz75/KgvzDRHL4+3xYljY2VpBEggCW6cBEf64dE1YxcUYJqyu7eysrVe2tDY2Vdc0K0qqKkuKC0sl5a3KoaGqJBtjB9vsl7/46c9/+dOemEJ58WB3a0edSCwpqZQKhWxUScL9vL39fP1jEkSKrrZi0fhcTQz76vvv3K5Mj84RxNmZuAZEKhZrubVDivwk7+DoLJXgwtGSGB9rZ0+PwIj45LSU2DT0Xhqb24emxwZGOwZvXxKfP5kYGXvvJ6+ef/TRl2P2QZ72TlYmpmbm+GViZI6ZQxOGIWxOT08f7yjB0QzC8gvlaAOWdrZXFivy8/FVaW25WFYszZcWCBVt7Qsn67VhPg52KZdeffXTzz8YiGnpaR0Y7uksy8pIiQ5H18PHx8/PyzOisKoCUwrzh2897MnlBjrFVOyul3DiZONn4zHuKY1Lx2dnh6fvfPRkK8/Bo6JT5era0kyXSMRx8w8PD/JHGYiZUyDjli+ujlYUN1QMfP1l5sRWbir35WcfP333w6+Gg0NNTI0hhwmSKEMG3QyVFVN9x8IgK3MD7HpjIyMDhklYQREaEvLitm74rQa4rcbWZjje1mZM6jS1tCrHluaaUmMc7N1SS/t37z5oCpNK+YLMpAi/oKTEQLY0T1pa2jTe11Rc0bc2kF0xsnTpbGteFDywtzPSMD3X8eDjl5O56+/eGing87NbH744rPR1jZJFqfzjzz/fEBQcPbx7Z7igbXtucGhhvK6orW3tagefxx/oefZJRsW8ICa5pWf23kKNLNXPyczc1NTUBBVBCzNTEytHJwczA8swV2vkuhZWJhDEyDRElo+YXlRU34fyL6aEBvqIcIgKakdHO7ZaW3dvR7lU6GKP4SVnn9jUuJAUQWnHZP/g3vRws3jnqL795t3dW4fLZzefbpcII4OY3Us9bI/UvASOj2XLoyUkUt4OOdVMhoGFnRc7IcTOPHAwh66j0rbTl+7km1K1s7dwePrk9R//8PNf//Tl55++1VNR39q0MPfO8zwWnx0ZmRaXmJMZYmlsxIA+YBXEYljaO2LIxszQAFicQXTyiDcG3UuMdmZBUZGC6FwNoG2FyI4+XAchB2Zc2np6iiIFtfG21hZezsjz9fVDxJfuHX717YvlgQNlvGzx9NrKWHt8XMdGlZWGIVXdEAO41voOFoYWDqGu5VIvGs0xxphs5GTDMPe01dOjG7oEWOjpqlhZ6tMsbPUMnT1TE6XtCuXpWPNiV3HpFDe5uH9u49p7H77c7NjsD4jmZlcJHIyMGQwLO1NYhL6+gZm1i4+Hs5MjdGFgaGhk+ONiMCzj5aVyeVFJUVkPej1okmDOCZJAJz8K0tGj5Dj6cQWOLp52xnoMYE59pyKmEzMlIz6OFeEemRwbGhaU4Wnv5evmYo4pPEevQF8O2z5FlJRVxXNzSlcUZJd1JmRWNaY5uXMrB0pC+GUdJU4qITZOgZ6Ovj4WPt5ugX7RgfHMJJ+gmJD45JDAaI4op7iqvau2qzWUuXX50zUvhqk53djahGFk4WxmRtRW0ah0sbdywGgbMRLm7Yu5I7/4vPLykvKKssKiDqLZgw4cAbYwvwVJOpRtbV3dDfG27v7xdu7RoQ4GehQdfTNmRnFhbUezsq+zt7WxrXRotJM5OtClLJwW+Sws8qanay5Phi5cbx972O6XsHx1rOvwMG3wYCvLNbxz5VJd2sDyYZW7Sl+ivNHTs1MZVd/Ky8pTKjta+uvqMYEGkJHAbcoTVclQ221Oi7t29W6vi5mNhzXdzMjYzsUJlmIOiO7oEMLNrcGAQLOyq3d4pL+zs0kiUlRiIrokv6DljSBDxDBdT3dPR2dXe3Nbc2PnUI8wxM3MxtLRPyom0snK3tiqjJUlK83LzuTEpyRkpCRl5WSFSXgFQq4ihXlQHS3KjOFEBmam+CVwfS08UhP8w1ND7aITIjCNEpuc4O6WmpHmY6MiDEvIcdQPz3QPzkCTkp0nL6mtzhfLhVxJqlcAOzFZgu5BQXWS7/bR7U4/SVl/v5+ptQ0ydUNTE2QbaDfG109sHRwdHZ8eHR9uzM/NjRXnYCykSlFWWNAwjEGU4SGUQvoqmmvLaltqFOJyReXw5HgrO9TRwtLOKzrUJ4sbYxHnb+bu4+Xt6mllEuAfEmjuExdqRrexsTf3SqsOsafr6WhYp6IAaBxoqkPT1NAy9zPQVtchsh2apramBvJmCxsVugEDAc1A19zEkG5krGdAN7R1IQocbgEmpi5uLo5RCBZObsZ2Yxu3J6IGl+cbE31jkyUpLmlCcWGuJNvZIWUIuHt/99L53sHu+uL40KA8q0KBHn15SXHDyPjE2MjQYHdFc0GlXFZRVlwTk1eT39vX3VPMdjczMfFPsfEJ46UZ+PnSDEwsbKwdLA1D3J2dLf1DvPVpxoa6OrZhVSFULZo+2dhVX5dq4mJGI2vqmjn4W1LJVMdwb1d7Q30tOkOfSjdSoZsZ0nRoRrp6RoZ0Q3M0uXUNTC19LYy9zAzM/AKCnYNohsaWDrYBS0f35qM7VrONvZ1tXVIS3XmVFd21RUlOdomLV25dO9k/PD6+fLg5PzTcJWMrqstLy8sV5c2wjf7RoaG+ioYyaWl7iaJCJiwuKBvsbK1MDPdAzzMpztrd1tfbNj2Jbm7u4GJtZEDFkxB1cF2iCKCmRnGrDFLT1NGnIv/X1KbpaRm7GejqUxjWdC11miUgqoupvomZEVWLoqLP0COTtPVJ2nQtMsWAghqhLl4MPV0DMwt9qompq6euoa2br6sPB/Og9qF51joEIAEe0bN0YabGRDja+RRNH6HZubO7d+lgdXFmrJOfUg702ltXg0m15paOsdGxqd421HEaqxrbC1raC1sHu5TiiPhgK//gHH9rF3v/QNcCqWuAu0+Yna2jr52TvZmuhTGZ4WKmqXpR09DTlKJrYqlP0tRSV9OlquonGKtpkxlUdW0NdXVNCoWkpaNO0lSlOquQiMq5JkpNuoZ0Co2otukzrOhGJnoWBjQaXKwVw9De3dvNtaC5rTaQy7WhvRFEj6ajF8rPKeLihEJ068razu7u/t7+yZWjrfmhwqzSrtmVjfnBuq5+ZVclJmanZkeHh/t6Bvq6lF3trd0DA631W6PpNuGxg20mhq4JfvapnLRgexMTCzt7Fxtnewtje18D3SB7dVUNhpaqqo6pj72BO0PTyERHQ10n2EhHT4tCVqWQ1DW1dVDgoGhoqKlq66ggTSVpqJMNNLXNzXSpFiQ6RU/fBJVnRoiJvqG5m5OlnbWDs3NA4vkP3zxmDSj86Jhyx6JR6QHZRbVSFwdfcffmzt7u+tbOzv7B3u7UcHtDbdvcyhp6iv3TE9OjLdWVbaMYrRkZ6Vc2Y9amqbW3p6xkpCLJMUt04/14Y984L4fELF6knZGVlaenu6GVA8PEzAq1Ywt9TS19iiZJx4DoPRqqWvvqqWsb2Dl76KtSbGhUDZqeLoWYeVDX0YZYKgw1LbKGhjr6AHo0LW0dLRqFZmlhZmmsZ8ugGqBTbQjnYu9m7py7dbaWII0yMDKi0xkGDF1durG9V2i4k11cTcfS+traysoyyhzLG+sz/W31bfMrq5szLUML8wu97eMD9U1D4zD6gd4uBHhM0jYIMU7mbp+Ve/xhjaFXnId9CjfHw8zc2tTG2NDcmGZuaeVgrG9ux9AkWRngNSerk00MSeraDJKqlqWnsxlJjeLlpa2mq6dFMnE20lBjGNO0VVWMYFWompE0STQdkjbsiUY3t2AY69LMzKl0KxNLYzNbO78IM+2Ug7tH6XwvmgEDqAB+gsowBdqydrRlKkfWNjc2tzY2d3e3N7dXJ/o62zoQBQcHeuc21td6p7fXO9tW15YX52dnplCXHp/oa8iPc3KxcWDxVh6W093C3OzTOTEebglZ3ibWxmZGOvrwPlokih5FTcNYW4dK1tI1MGLQtTSwm2DNevp0A0AhdTWKobY61dpATZNmakS6qGJibM4gacAda+tStOl0IHKGNkNP30jf1p6mb2Zga2lmZeHtY6rBPry6y8xw1rcCWMfPoVL1DU0RDx1tU+uG1jY21jZ3D48PdrdXxnsqG2bmJiYn5xbX9o4O9qfHF+fa2lf391Zm5uamJ6cnx4ebS0szQoPM7JnpI0cyXQc3D2d+joOHi3+AnZGzs4elua2Vp4Eq1Vwfxq6lqUWCLzKgadMp6rp6ZG0dPXN7n6SEMEsNDR19dVU0ydS1tUjqFy+qWLokOWlo6mir07Q1yQBRNKqulh5V31KXrq9DM2ZYGNtZmNnZW2ikH9+5nMVyYdii9gYb0aXS8Bvd3N7OJ6thag3Z/cbm/tY6umBdEm5zRevExOLy0vLe5Su7i4O9Q7VVA7PTLc1tjU3d/e1NFXJ5cky6g2NCXHUvR88RrkSc5+RvZmFtxrC0MtVDEzzESpUeYa16UVVfh6ypT9ai66jBa2npa6NSaWJt6eAf4qRnYECnwE1dVNeEU1BTVaGaWlDVNLTJ6lAgjWJM0tXSJusZWtsxUDnUdbK0ZJibGtu6GGs5lS8PBfjYGdM14fGoEPdNk8AYiVVY6ejm/t72+vre1trKxMRofnRJ7wK22d7OysrG7t7+2uJGR0Vj/3BNcYkcAb68Qi4RBAVwIjAOx80L1TV39nSTipx9LBGa9WAlFg7uTjZ0dZIlQ4OkpUdWJ5kYu7ppG5sQ20YdClKnauPhNXUsLPUMqdp6hqjHahlR1VS09dTV4JGxBXHiQ8OAQjei0fEDTeFmtXUtTC1NTK0NDE1p2roeyZHG5i6eoTFhrqZI0Sk0c3NTIzPUtZxFI0tL24eHu9s7R7tzi4sNzVeePbx9/+HTp+fbS4sT8yubW+21bV0T1YUyUWltibysJCfRwTmb6epk7eFtrWPo4u6eL7SyDYyOcafTdPR1TRzcnI311IyNYK80eFS4FX0tXxcNS0fqRZKdLpmhraqmTVJVha/Vgs1AKxqGepoq8FQkNXVVXW0NVHBpRHdGm4IWLYXCsDTWBWRBIGU4epsZOMSUdqX61Q+OTQ02FTA9DBiGxAExFyd0ekVD88ub29ubW3t76/PjY4e3b927evnqlZu39pcXZsdmt493evLjmHkoU1XUVMsk+cXyBOPkoYZEZ3NnXzs9K4SpojwTTPx52Xu62dGNdbXI6Ayrk/UpajrWZENoQo1M1VZTN7MjqVLiAx3t1S9QrZEVoelC1tTSVldXu3CRpKlC1TSgkBCuKbAqCpVCgq5IdJoug25gpAc7MaDpGZsY29jajO7fOhRaESOrNq6+we4GVo4WpmYWNg72zqmldW3d/T0YTRwfVLbUNx+dXXl49ewco6R7I70jfX1TS2Mt0vCYZDZXXIEZgUJUnAONCzE61FgizoxwdvR0cS2RmTrCxhkGdFMjJweGhSsDgU6LdFHDQJ1C1qSboLdK1lRVVVMjG5pb61xUo5sYmtmYeTrqAsmoaSDmw2vpaFK1qfrGxmQyTZeip6NtaKqloadLszQggj1Nz16PgTKDi73J5Np4Y0RgR1tqeGBMUlqskbOfrbWdo5O9bWhDS1tnNwqj6PP14fzL+O7h+cOrl65ev3Zlb1TZ0TM6OthWkC/KLamubu1pVZRXVRXxQz3a+ocGlXV1pVX5EV6WdiKpjYupqaEBDQf+gFutzZ2oOm6m6ojqZE01kq4RWY1mABMhqwOF6euStNHIpxtZOpnQnCy11LQYumSNiyqwHzJ6L1rq2FBkqg6ZwjDUoCHNo8MMKLoUa0MjK1MrOzPrwpb60qCYuTJXczsrC+AwQwsLVxwEtbcNa+yDAN3d3QNDoyNA7MNru9ceXjs5v379bG9lon9odHxssDS/BE2M8raeltJC1D9rpRWzY71d7U0t5SXiaA9rvzSOl4d3kK0tSjCG5ia29kb6WiRLY7zQBtoamlZmdHRZ9DXIejQNCs41WqLXR9Ek69ANtHWszEma2iZ2dDUIgjijpq5DViPRDekkI7IWg6ZvpEOh6+gx6DoGFFMHKwB7G2PrrJW9HWF8m5eNhZOVhbUVzcjGMykxNsLB2jm1tgspU5tS2Tk40K1sGtw+vHb//Pj82rXzg401DFgMj812lBZlCoWS0pqa8tLW3rqioo6Z4TJU63o7qlN9nF0S2Nz4KF9/DydrPDSdZm5nQdfUoNJ1SRQAKYqjo76GFp2qrqZJ0VAn0XUYxjpGFnCY5sZExwhKoOqTL15Q0dSgkVWhPooaQDyJpqVnamakB3PTphmZ0IzpZv5+WjRzK2tt3qt3TqQRHAdDa2dkhqZUc19RW6NC6OHinjhy+ezsaGtlfnZ6sK2ucezg+PqjK8dXryJDWdpcWt7YOrh+srY6kJ/BkVXW1lQivcqXVLY0VleUd46OtLBCYwN9gzObx6RJXpjKAVQwIzCppgbdSk9D34hEJevpaqjr+9HUGYjkQOgkTfgiS20yRd/QUM/QlIIOhY6amoaKmgZFU01NTZ92gQzx1akefgFmOjpkXX0dCytza6pFQCCFbmFuR8457xUGWkI/VlbGVs6BrOr+laOjg/XRidn12y/e++Cjjz/+8J2H52sDPRPHV24+gI3cOL92/dZbb794H3/34YcvH25OTq8f7G0uz0wMduDcUF2dvHJgeFKZ5o15RS/3tNaxue7mGqYpSiF6nv7Ai1q6pAsG9hq66mQ9TVUturqGk5uWqqOfjoaGFlmNqnlRVZOkzzCxMEPvyw6GrkK6qI69pUYC5FJTUyeTTJG9wKfp6arpGJrbkPXNTHVpGM/T4glRg6PpMxhOZsENYyt7J2dXr9+8dffhg0fP3vv400/e/+C9997/8JMPnt6//+Dq8d7a/pOPP379+Rdffv761aeffvLJJx9//OrVp598/NGH7z1/9vTmdFVpW3l+3XDvpCIG43JugYGBHr7h7NrBje2R0nRXUxfTi75eumoXybrq6D4aGJFV8YKTkWjZe1CM3Q21NUgaFy7iabU0tY00YNbAkSqmGE3SVFVX1yA6lLq6JCJSkvS1NDXJVLqFK50RGaZraGZuoQMbo+uh4O4YYMAcW945Pju/cffBk6fPn7/z0Sefvn71yaefvfrgnedPINida9cGKi+//8EHL+88fvni7ecvXr77zjsvXz7HZ88e3b9z+8aVncHayva84pbJ9o5EJwxEmFs6uXsG+Hm5e/FGV7f3etl+xlr6TsYXVYGbNABmTYzIegboIZDxbBQLJ10zRxrgC9nEBB1LHSCUixTyRRUjDW1EIPRcL1xEOgkETNXW0iBrUCg0GoNm7WTj4U6lGhlTtUgM+EddqhYAZFRV+8r+wcHh8cnl8+uXL12/iXnApy/e++jV649ePH304Nbh/mDT2aNnb9/auf3s6dOnz56/eP7ixYvnz56//eTBnevXrxyuTY0PF+WUdXYpKqNDI/18PRysTM2sHL38o4qGB7ubkPFXiKNtAaU0tTTVaJ5WRkgQGYiQWnC/OoZ0srG19sWLagYBTjQGRUtdQ0OVRAHWYriFGsJHaF68SNbXMDZQNcB21CDrUilAWZYUGlkdoNjEhGpsaWRI9G9tba1CS1rWllbWVjCecHZtBx3X1TWkVYcnV67fvPfw8dO37+0NNJw9evLkbPXm08dP33r7+Rs5Xrx49vThnTtXz053l2enOsU19X1VDUM9nV2NjZW5cW4oJps5JjSOYYa7D76vpbs5P9HVUEtDTcvYJYRBppDhXvEsOgwbZ4Rpqrq6up4lVc/NhKxGoZOJOEJlWJprXlAla6tf1DRA7NA0tNKhapN0GVo0Cxsn+C7EKANTCz0DBjAiJrHMLM1DiprmUTdEf39zZmN7Zp7AuSuQZm11Y2Nz7+jk/Gio5vytx49OFq8/fvQIGoEQ2FjPnj6+f+fGlUuHm8ur8y2VGHVSTkxMd7f0dHUP9JQnuRobuaTX4+AicpnhoR6U8poUOdH+5poXdQy09b101HWo2PRaOnQLPS0TY20K1chQm2xuoqFOc7CkqF4E1tLFCN9FdSOSmqaePkNXQ8+YQqWSaUDNxlaOVJK1A1XfyMyWYmCsz6DTjC3tXdzjihuWRjGl2Dw70dSxQQiySKzl5ZX11VX06w42WkovP3308HDh+sOHj6CTZ2+//eytt3Di4t6tq6dHe6vzexsdrW1dDf3Dyp6aovKiwsaBzp6iQDN3rgJ97ObmrpqioYnh3h6c8FGIYtxMKTQzB4q2i52mhr4eRUNLW4Omj+EDPX0tNeQjWgjhJOQj6iRAFQwjamsgmiCcXNRkULXgudV0MNJHJQHda2vrGZlRgj1tHW3ojr7Bscnc0vrNk/2podHp+dnZTWRQi4sLC5gZWoUcKyurGwer1ZKdh/fu7Sxev0cI8gSivPXkyaOH9+/evHq8vzUzsjZW19I+KFf2tSubKyqq5GWKsuHuhkRfXlFNQ3NtfXtyZEPvyAiO+fZ1NlUVi1Kjw1DhNDVQ13Dx0dGkaGloUAFfNDBxZGFMTMZT1ZCPkDTINE3AMVXCm6nrasKIkHKoIi/WN8JOVFMFLDA0MaA7ugeF+xmHZhWAuKKiZu/B9Z3Vpdmla/cOpgg5IMnC0voqPl1ZWd9fqeDP371xY3X2+p0nT548e/bs7ZfPn731+O6dm+eXj7YXAVvKpXWNHayqsd72nqaa+ubmytLa5iGlgI852qqKijy/6PLWyqyM/vnp8YGumuKyCkWtxEsPYyyGVjRHR+AvGIWaJgK/ga22lr6ZDjSjoofSBJShrqlGoWqpa5qqk2gkVQ0tnYvquiQoDpkZVc/GzM2XHJ/NijOPknLsLOzSm6bndm7evnbt+vm1rfHp+dVN6GJtfXN1cRVr/WBBGNR46/x4pG1qbmlxeWP7YGdjdfvqyaXTqzeODk/XJmaU+QWK9jpObs8qOrjNrY31dTixWN+r5OSVVVeUspMDggSiMDdpa+c0xvwqxRKRRFIol8Va6JA0KY5mSLW01RAQtSkksi7wlaYO+aKqCs3MMd5WlSgTUTSR7uuRTM01NbQ1GcAt6qh3AdprkvQc4kO10vML+NZZXFtX4+i9J7dvXbt17cbV6+enSABnunA6rLlzZGpuYXl1fWN1rDg9jj/Q3ViSJ8qTFVU1dYwvbZ/df/r42dPnLx49vnfr7HC2o614uDA/JaZrfaqnrbKqFX2s+tqxhTJhWVFhRqzQE1wQIawaYWFnZ2dbU1WBUCJmscvk4qI8b6qNARA6jEKN7miIER2Smoa6to7aBRVXS59Uiwuq8HPQFMNUDypDtkLSJV8AksRUjzqJokll2PpTshvqCuzSg83oTo3z/eMrO/vby+u7RydHu/ubY+2d7TgL21SPrmfX0EBLfVtzfXPv2NjIxOTU2uryxsmVS5cun2Bb7a4vbe0c7W9vrMy09wiLw6x8S2aWppQNtQ3Krs72ofkaYQE/LlzMc/DKTI8vZwnqO3Gau72+vLhCUYq0rKWrx0/DyNFMT09HTVXd0Iyip6eNT1BZ1VRVYZDpdI0Lqmp6mupUhnukjYoqhUwyNtBWhci6aqqwKW0SjWFirxVd31DsGOfjaBgy0NfUNYJXfnFhdXtzdWF+FvP8kzgTNjKABkj/APpUOJEPUD82NTUCWXB0b3QU3zE9MwXqCkz5LUwODiqHKgvz3HCSKriwfQAnG5Td/eNTyhyJODFJXJbuE8vzz80KjmfmZ+dW1ImKW4YWh+sbW5UNUkMy2dAMWTB2i5aWuqkNRU1NW0udpK6qoqJBU78Ar0VRv6iuTTejXrxAomrq6lPVLuI7NLRwXkaHxDBA/SKiqbnCNdhW3yihs6t3aGJ6cRFn7haXllZWVxZmsGbn5menJibnZ4jnHpucmpiam52ZWVlaWpqfmZ2dh1NbRbxZnFvfWBzr7W3qlzbm+qCVZ2ztmyKubursVjbXSHkFeaJyhYTDZicEZIbHBcYkO2K6ubyooR8/v7+qQh5vpqVB0talk4hCkKqqNuK1hr4JFYUjFWAWoix0EeBFE3aiDbCpjd1F1jNCmqxJZxja6KrrGBjp0OLqmqs8vQx1TZM7euB5Z1FahLPd2VnDA8JlLS3AZc3NLayvTI5PTs8uwX+try8tbayvQlIiXG5tb6Jet7qyvbO/ONih7C+vTgu0t7SxNjZAk9s7ODQySSCRFPPkJflcbq4sKjQ2IsifFeTP9OMpSuobK3vGWyWiZB8XCt1Ah3BPCBZ6FNSvkbAY6eFLlYuELahCEDUSSsKqdLK+sbqmrqamAR2qIzOAL3UJnGVgkFjXUOnpomvhmtg9MDI5t4RIjqfc21lfwy5D+MDTLuHhd1ZnZmDz8GFbWBBjCd8JMXYOdxAr15Y30X9YHe8a7e3I88XJGlsrNB+JgqBVEDMvr7BIqpDmsjM5+Xx/Znoql+PDjMwsl8vryyWtXXWCNNQ8qAaGKF9pQCNa+lRAQuwqVCdU1aARlOqwj3Qw1kbS1TFRx3dpIzMhq+voUTS1UKHQ1dPVN2CYptY3Vnt6002t0/oHxucWlwk8sgFhNre2IRC0g1d7hajSLSysrK5t7KE6BB0AkS2vra9vbe8fbW9sra+t7J5e2psZ6R8vbEtxdY2L9rZBIxUlUFOXFHGBSF7QUluWm5aQlFOYEJ1TXsoOSvGSVuQV1uWLm7qqeXFu5gxzcx06Wr0A8ehUaVJtLCzoJCLaqRD4hIAo2siwdByzE1XUUB7S14aR6xvqamiiCKNrao6pPqv0+vpKz7AsR5vs4dGZhRUoYGN3f3trE1X4DZR88fBrKxs7m3vbCIkoPEIdeN9c30BRmPhye2tjfWNtGQnA8c7k3Fh3e0O4syPm7Jh+rrboeRvbx+SXFpQUt1c2y7gZKZk4gJMrh26y2BVyXnmToKCyUy4JN9NnmLlbGRhrX1C5oGluo6Wpa+/gYa+LnaWuggRFU/XCRQIJa2PWxkJdVccIaBLBnU5HVCcZGqJ8T0VDDxqp8w1pa6xsGxqfXQCwWtvcOTjY2drexfbC7scvFLZ28cBY+IBH397f3YZeIND2xur6+ubGxvLC9MzS9tL8WGN3RaGQGxYW4BiWxQz1tjXxzixWKDAgV6cszmHzpckBUXHJqSkpyVXl0vy2Kq6ioTU3y0ObpKNnau4ZE2xvbcnwc0GabmnthDAJAwfW0kZqSFiK6kUk8voaSCs1VLHPAPTVSFRsLboRw5phZpHW3NoUFNja1gkLmV9GwEZNDt2d3d3dnW1CDLzuOwd725triImEFDs7O7sHh/v7ezuQaGPlzSbcWJ6bHB0Ym5+a7avh4fBfVICznaNPUCQ70joMg5hlNQ0Yb5KlBifGhsdkCdLjY+JzqyUCeausoLqjLieKQaJRkBIaRIa6enuZG2urk9BKsdAjofSLAh1ROlKDtWN7oT6pQyVwDOoVOhqaSLj0kNajhGRON/SUdvV0hPkpW4tQbF/cwTbaxqPu4Q2SwB9tYC/tHx7s7m1toLmwtbl7cLC3f4hy/N7uztYmkb9soxu0NI/T3r3tXUPTbUk+fj4hoYER4ZiojPRziOXISkDuVa+syfV3iw8I9IvJymWlpVQpxDlllXyFor8mx1Fd21WfhE6OPjIQACqk5loUXR2i5KBqrKKlro6aiiqUo4FxaTUt/QuQRJumjoTfiI6/QSUZYxlWvomygf6OKN92mUc23BLsYIt4zXe2dnf3DmAqG9voIh4fI2/cwWZCQ3EfpYnDQ/Tj9vZ2tlaXAYr3Lp1uLy7Mz81Mj/b3jfXlczg4UZEtyOFmpqdFRPJkitrmhprazvq89MTEmMTwpCiuKF1Uj7PC9fLcyubBinSGGsnUyMMIpUVioyBaoNRAQkkIPuuimQo6IzqmNFVVIpEn6dCcTFXUdMkkBsxcg0ZRpwKTaaN74BubImrvUMZ5N3vYsSen5uBntxAQ8JDwpocHxO7Z3Tu8dLp/sL+zvbe3d3iIRPho/+AQ4sHisRNX1g5vnG/PIcTPT45OTfQ0VylwHkQuy5dKcnMFuZJqYpwWM7XtzdWKEiknnZ+bmV+aVV4hKyxrlhQ0zCiLw3TVSSS6py48L0RAjNDXpNhZ4pABgqKGuooqilgA7xe1AN11LLxinVVUUW7RUqNoUYG/dIGCtfVN3SMTUvnVzco4V2mAVDkzRYDDzR9f9dPz0yPsKOjg4PjSyf4RdhIK85ggODnFvtrfgefaXF1CD251/yrG3odGF9B6QAWyUdg9NdgI/pXC0hoMPw3NIo/H9E1XN9gyQB5XVasoqSnNKc8TyRV1OYUdm6UcCyqqVVREBgMzOFV1VFVI2k4oRpvrEptK5SIR14FREC3J+jZuHuYXLkIbJDXMtKMmoYPgqWviGByDExuFzQNVvPa5ja3l+RXY8/bO3tGlK5cvXblydnZydHBwdHrpFHqAkn7UByEITGgfBrS6MDc7v37pyjoabzMLSyB86Rht7RjtmRsd6G8DPB7vr9s83Vyfnuns7gCxQXUNuMqU7ZW1oIvJl8oUpTlFfSOSSDoZebo+HKq+CWC7ujra0WRLBw9PSxpJTYuEyK5K0iBMHVVTAHvUVuDDSBQ1srYWzUAH0/laNGu/iKgocVv/4sbB8dV7t09XFuF60ck9PL10duX08tVr55dOjo8vnZ+fYo5jf393B64KfbiTE7R/9vbhiVcXpqdn9i4fzvf3VpaCQqG1RTk4stCgHO8dHmrvfMOcsrjcpOyZGR3pKW7qqO/sa2/A3Ep9ebUwr5RfLpfWzDVzg4Moauo46gT/gwCopmnubqBBNrVydTVGhZFMUbkA+K4BgELWQhkFDg0ZCxyVrjaSXzS09Qz1jB0jiXNxi8cnpxunD29dvba/sAhXCpd0fIoJ3cugoji/cukUSdP1s0uXTt5YBfwAfDMsf2/3AHtrZW5qchq965neDmkhJuOKZIregZbO3qHRqdoGEMeIG0aGGyQlrd2oOChGlM2DI+PtAz09zbXFmaL84nppQdflco4FRQPVXxLF4KImZiMoOqYmaC5iXsJKh+iz01RUgbuQm2gQKZcG2TDOQkUdzURtNTLN3DM8q3m8vn1scWN17eDu3atbx++98+j6laOlpbWNXWyf08vnV69evXbr9s3r186v3rp14+r5GfYTZNjc3kMk3Ns/OEIYwdaan5mY3FhbneyZmZ+dm5mdxpDkFGg3JqbnOvML8qVCGfZQfmFxGY5alpbLpHU4qjPfgXZjaWF9SWuNtGziRJpiQKSxJCTqcElaGtoM4EH4LPSm0DiB21JR04TCKFCWqirqds48QxV8STJ0SirpXj55/NUvHj15+fbD+7d2X704OH7nw5dPcOJiaXFtG/o4uXJOdHOu3bxz5yZoNW7dunnj6uVLJwj2WHu7Wzv7R6eXYTZ7mxuESuZnFib6llaXcI56bLSnB2B/YmJsZqiwrq6mimDpI84MVtUoSrnZ6dny3uOFib397saehdE5pbyqTymOM0MmrqFh6IHIoI15CAYdg140EiI3PBUWNKJjYK9z4SKMQ1vfwMlLR0UVhdOsmeNbj956/u4Hrz58+tFHH396Ov/FoweffvXZ+7f3JgfnFtDkPDiGhRDD32fn129chzR37z24fX755PiAgFiI+bu7R2fXb16/eu3K/tbyzPjoyPjU2OAiKhb9XT19ff39Xe2dg+PTw4UNTbWgj6qrhxg411BVzspKzSzsnhoaW12a2drcuL3dLVe0FuSFodehqkk3tySrobqLh9WhMew90Ts11deE14KNaNLs0JW7SCITjtaARjgEVbLk6PHLd1GW/uTV5w/e/fzLF52DH338059/88nj9aGmJpQbgH23MH+yh5gH13Xt5r233vno1WfvXCeMHaB3cxcB5eAmasOoA6Hee7azvjCNtGt8aWNhuL1vZHR8fGygt61jZHKwEKNdFWVgywF5J8EfVcFhpvCFDYMjo7PTCxtTI1v9+bKKejHL1wjtD00LGwwPWtHhaFH0oZj7uFphOJ+G5JymckFVk6YL/0vRV0W9kbB1uC1S8tSV52gGfPT61Rfv3fjki8O89lefv/7g7RuHY83l5Z2A8SsAVqdn1+/cf/Ts5fsfv/7im+9++pMv3r+Jwa29faB3xPadPcIxn5+fXbl59/qlSxtzM1NTk6urk519MBJ8MY1uStfIaBFOgZSWlBaX46R+IThaSjgpmcLcup4BCL06N9TVVlVYVVMizwl3dIUgVram6JXpoxAHmKupbWqmgyFwhEdNssqFCxegjIsIHqoI+lrmzuqwFWrc8M7po49fffrq9Wevr91+ezy59uGD+7dvnB6sLy5tXL55/9l7H378yavPvvjyq2+//e4n33+Pt6/ef3r3BKhxC29IqpBE7a4vr6zMAZktQRmjAwNI2JdWR7v6+4fHRmenhgb6OloHJsCLUlKEWU78Ag2EvFiencoVCuoG+4daq+uVOOLf2tI701OWl2xE1VTXttAzpKhhuAPntuxtSRoUfcQWws+qqUEjJDLyKiIoYlTAMCwEbQZdg4S23uX9G+9+/tU3337z/uXL7Y2n9+7DZD786JOPX71+/fqzzz/74quvvv3uu+/eyPCT73/67cePYO97wPPALtsYFthZW9pAdjg/AWqRsSGC0wlV3dHZrcm+YXjXydkxTG32KfvHixTNMI9y/FJUgGW0SMRLzxLwW6YnxtpKCqUFRTVdw4trC7XiOERCDTK6DNoXySbomurbGWpoUXBKm0TRhb9CPqJJ5IQQ5Q1igQsA7KLopCqrOzaX1h9+9uXX3375YGP82bvvvHjn/Q9ff4ZGCARBBwdS4O0n3/+EePv29bN7N67dvLY1v3nv6QHyqt3drUUib1+Yn54cGxns7+vuRKI/vrywOjyEmvcCRmzm5mYnO7smykvqqitrSoU54FQRS2RiiQTMVrymhY2tm9cv7W9tzQ0PzyzMteaFU6maFF0SyYgweSqEAhih6cHygeV1oBMVFH3VNFSxv3QI4EjGTBHqEzT2aJNyfHRo5vTll199/enp8TdvP3jvNbYa9toXX3355Vdfff3tN1AWthUE+fb187vXr4Oh6ezgxqtPHx8jgyI87vTiwuzsDEH1Mtjfgzns3p7+kenVwcFlpCWEKCurs12tY+WF1WDpLcsDNUwpKASHBkqyc3NZHRs7Jy9fvHj54ScvHt482V8bjLfQ0cMj6xkT42jIoIDWVdWM0FRALYWEzBfuFxVGNaSIGN+6qP4GKCK60LirPZ3t3UNDo5tvffHdNx8+uHftBtwYuoE4t/XFl198gQ+Q8Otvvv3JT74DDd9VhPbLp1eefPr9l7fOieNpqyvzM2Mzc1MTWCjcQ44OkKr19fSvT/WjILS6jMrQ8upMZ894RWFNRUVlRWFFZWHL+sry+kkdm8fN6llYOn724uV777546/6N66fzA5XmqIWo0zxTPSkYIUApF81CdQ1k5WoIJPDGF5Hqoj0F3ahSKPhUCwKqqV80zJsf7gGh39DQ2OK1j7/5/jFabbcfvoCFQyeEkbx69QUMHYJ889VHT25euXS0d3DlwSc/+dnX944uowyB8hXO/Q+NozA3OoYhQBzCV4LsDiPMK5Pg7UKla252enZ+oqN3qq6gGtzPlRJJkbRpenho/KCRDWIHGM/qwdntR48fv7x/euV4sHWxyoOqTtJ3rKxxNaUTuRTCoqaqJjwUw1Rb/cIF1LWAfKlUaIpQi4auBvEtFoDYa4vry5irnJiYO3371dO9/dObD5+988H777wFW/nofz3W11998fqTJ4Al+5t79z/5FuetH+2fnsArDYCtrb2huRssjRjx7/pxJL4TXXjl8kxPz/jUDAp2KDv2tvRMN0pKS4BMCviCnPrpocHRvSYWeFnBgDY0ODK9tL53/frx3nZvx9xaqSEKVpo+Ynd9lIHgp5DPatO0SRpUzD0SkR3mDsGgEfitC6poiGiouzSsrc6uHB5vAxbNwX3u3jifOTi8evfp2w/u3Lz18Onb73wAzXz2+ZdffPrRBy9u7e9tbt/88Luffv/9Tz883rm6U5QvZjNTE6JC4grqQXnWDlZRyNHeMTjW1dq8tDgMNRBFmIXp4da2oZkmUQmOqIKJlcevnejrGdxvBY00r6MbJ+bacIi9d2RifHS4sWNmaZKppYZdRMcUDbH9NayM1ck6DB3iC6IrgnKQBoqlqBPB5AGOAR8DBk6Pttbnl493IcXMNBLb3U3ZwuGlW48ebmyeX7v54OlzODBYy6uP3nv32trp1tbV97+B0X/3/RcPLp9cv763NddZX5WXGp2YlRgezcrLzZPml9T3YFC+p7VlYWFuqBWME/Nz4wNtzf1TC90SheQNdR2PVz052De0187nZXB6Olt7ujtawNXb1FiFQfueycHhTgdVEkpYcLWEpZMc9Il2Ovki7B5yqQLGQx1kAuBDBnWMeDBntnYgCabhliZReZ6fHZ/eXoovunx85fbtxYG5a5ev30U0B3557+0rx5cn2nfO3v3uJ998DV/89Ts3z87ugpnt7GBvbWEMjE5yK113PhuHg0OSxWJROahRp5cXZoZ7wT+L84ldcKzL/bI3vIwSENgpRoG/trsF7Izc3pbmLgjTCHLrisKcHMVIX/3YZAzamfo6ONmsg2quFnJxyIVRM3gpDGqqEEVUHQqwC4Yl0F3Qz51fmkMzbXp0crS7E+SN6wsz82uz0aFzxyfnV1aGWiYPLl+6dv8pjpjfWO2a2enafvfLb78m/Ne333z48Prlq9f39rZWtw53FvHvZhrc6F7cpoaKKnGSpFiGJkr9+NoS6tmL80Oj8+g6rq5uDJfVg7q2ugqJe/n80sLcYU9GYoYAZww6etubCNJOJPCijv7u0fnxWAYxikbB+CW6Cgjmapg4gdmT0ZsmmaqoX9QghprxF9po7tLZszMrs6DjQDBbXBzr7h2eXUAFeiLApXr9cGNudLC7u3f16PK1a1dvbk31t88c3/scvhjOGL741ePzg+PjDbBeTCHxgnddm6pwoTjFytvrW1pLGmsbxse6m2pau9pa28E8290zMDg22DvcLxODuUgMStmcPNBUtykVmaksTjN6LK1KtLKqy4olWXl9HU0zq8MRxCCTiTGwO5Eiwu+STfU1LmKGCF7LSAU7TF1VG/6YMH3VwInLKBscHx2eXD7e3VwZgWFOzi8u9Dqb53QNt1Q2dg31tzb2ra9OLm/2Dw5PnzwlJk0+QaD87PPXz87X1vdW5uenRudQIwUyPpgtd9AwD2Y3o5k+0N/VNTraq+Sm5CaHRDKTWPEpmUyxIDxElhHH5CQnpadFxqemJLGSQO/KzmQ2tja0NeN8cm11eYmckz/coVxeHYrHeXhVQysc20RXgaSpiwiJUhCyLPhbFB/grC6SYUOA72okVtf4/Arqg3u7pzh6sEAMt45Pzc0o7fVjyxQSgaJnpKenHQT2rePLYPw4e4xW5/MX737wPoz/xY3NlYOVmYWZ6dlNFCCA47dHSmw19ALEPbNjyoFxbNmxgfZ8DjvSy9PXO9jd298vPiPAIifNNxREUqwM/4iUtKSMwMzELCEzplHZ3AZ22wYwvOMsfuXIwNzOwlC2PmaY6DZW5iaYaMQoI8omUIyJPpIQgEYC2qNiDZcFCGZb1YstMLqJCujuGlFJX18Z65lanGpwpbnnlgoySjpASNyDokBt38bc9ODszuUb9+9hxgFjAW9d3509PB2fnJubW0UJeH//YGu8Jc9cnZJcWtU1OtDTvn3jJpKAulKJICM5PjohyM8bh38irKMCXR0DggJTef4RzLR0Vigvlp2XFFnZDgfcWF5cKC/KzmSVdS3uLo93ie3MGFpWxAl67C01zALhmfV0dLWgCg2SitpFTKWoEq4Xw4AR/Wsbc/3VI8AQoJo6OcEQ7NLY8Hi/PMjRmSnnp8qVCAxdDQBHLcf70x1tyu6R+aXNnf3L1++cIuHYXRydmp1f3oNGD48Xe5QVWeYXzSQlBaV1PYNiWdf24cxAe31ViQx0vgU5ApCbZLOSkmMjQ/y9PP0i7B39/CJC/ZL9k7jRcUUtnTNz483IT9hxoczG6bWJiYHmfA+cDLE2NDTTU9cx1qbbAYpQcVADVUcVsr4Kcl0cX8AYEWY9GBE9y4f7y90Nw4ubRMJ95TIKbJuzzbnh4ONLFPLTJMqepqomHCEuq72004sjxfUtfS319bX1PXOzC9Nzc92DMzOrB0eHR4jvbb3Kcq6jaiBPUiDOL26oYSWwa5bOLoPZZ3ZlbX6op6URLExo4oKIlp8J/rcIkFkGBXiF+IbHhjIL61qHF1cXhgc6JeKS5tHRgZbF/tZCL0MTdDq0UG/QNDHSRctQTYeO/tqFixc0jVU0L6hRkJBgl2nq0oMaZlCRnm7OSslRTO6enF3BL8SUbkFafEJMiiAlq36oQ9HYXF1eVrnWIipt7+9ubK8tK62vFlcMzq3O97T3DS+gnnXpZGe0t7skvyjbVisiOZObzReKCtDtyOAXKWfX9w5PTo6IatLlk8OTvY2VhYmeenAFFOYlxSRl5GQlpKclZ0jrunsH4TvHxmcHelprahuHVlubCt1wUgSWTPQPcdQFR2OIsgr6IUgONWAjamipMzCFo8cwjqkY3VxfmlvpqWkdXcM8MlFeuHbteH9eKQclVFpIlLynt0nZVlNWVNJVnVfU1jfU1lAnl1U15iv6F49mMGk6vTI5Orcz1z9YwQNtLMdSDzOp4LwGVw+fzxewEkMTM/iFdcruwcl5TBWtb+8eXTq/fvX88u46QH1jhaymICMtIzWBXzG7tbMxP9zZUl8plytqGpcGKxUFnmgXqGsZ4IAC5hgwsoHhH+AsdQ0YyQW434uqF9SpxMYytssqb11AirpH1HGvnhDNKNQ8jzcBVydxHLJSLMivqFF2KutKCyQdtSypsqOvs66xQFrRWF7ZvbzT0zkwsTw9Nbs8Vi5MTc7JL67KsTYMCAfPKZsvADsmKy0+nc3LE4Afi8lk5xbWdE0uL8zPL70piG/trc/OLk6s781NTSGJQQrZoSjML0Q6X1FZW9c1WV1cIPUkY27LwwsTDRjv10QfEa6LgCOE40UPEQ4Y+AXNUUt3UZmotH8G2RvaOFfOdhcnJ6ZnpldWllbR1RwFooX7KS5W4NB8Mb88Nya3tq61rb4yT1bdVFvfMTnROzqLf7g6Wg+yqvQcGRhb8+xNggKjmKDO5vM5oPdKTErh5okJVmIJ6I0KS+vbQMzePwZoOrcwOzkxMz2xgLbj8vxkd608T1KEfkl1cVGJorp1qL64WJLtrUMiG+E4uxEFzXQUGQDcL5IZmmhTQSMaahdUVdETUccROO+C4vhYdmFT79Dw6PTK9uabfvMK+oAoXG8uLkz094yujjcVFRSXFWazM1ni0spGZRNSiXIQzLcq+6eWVubGG6Ss2Ihkfk5+UXFNg8zTKtQ/PD6TECI9Mz0jKz2NkyMEAy0a0AXFigpUHqpK88GUWlbRUg/ugfp6EKPXlBfj7LW8qqmtvhTut0heXNvXCt7tgoxAIxxX0HbNDaAzKBRzuF1IoGlAuF9oBDZPmA8OzJja+cmrmaAu4Ve09w2NT83ObJwe7+BQHrofRE/wYB8jotMriyON8vyS2tqK4kJhXklDc11xCbiBa5o7R8eHWuSclIT46FSBUEC87vl5Ic5R/qFRcZmCdF4m7hvAyf9sXo5IxGelZzDTcOcKR1xeqxBnJidir2XzRFIcVy5BlQt3otS0tNfnY5SluLhcoexRFBaVFqaEWpD1LDUZoZ7EIW1LkiaoDSkUKomoBCFDhCDEPlOnWDr4igqTQXaVysHUdCsm2WYWFrfPLx/sIkCi+L6PUtzx1vrW7vbS+CCmwtoa69u62uuKc4VF2G2d7VVSLhMXb8QksQsKxXxuLsixOJGekQH+0Slp6SlMNi8zGZyyfL5QAqbaNHBHEqSVLFGJokiWC9ZKJpOD2RkUIEoJtvq6qvrGMim6PBU1TR39DUXykhJZZryttnUoRQvn9HQIwAXfi6PONAzYqGKAGfuKhCN/JJKxo7Mvlx8dFR+fmJ6ZkZQurGkd2zm7tT23Stg82rWb2/vHV64fohB/eulodby3tW91f/9kb3Wqt0YmFOYwU0CkCXJLJgdX5ZQhCymuqMgJco8IDEwCKz8nI5GVI+GlpXP4IGkvlHJZoBZNBakriy8rleeLBZxM0EKKQW7O55XV19XjnqAaeVlDRUVje+9QOzYbwc/L9LE2YhAMcbBpIrciMncyETtQzlKBqaAypEcxtHd08mVnhkXGJ8ZFxzET45JZeVUjCwsjs5vo1EIlRBcKFfiz4318uHy6O71AjGNsbyxOjyjFSZA+F1wrggxROSwUmBUE+IqCRHuHcFDCJsSn8vJ5TFaOTJYNokiuML9IKsrNzkxLYYIwL0uMRoNULkEDLk8kyMnF8Akub6quKS+QlLd0dg+MdpfhfoCKIlFGQrCXHU6IYYycmCQj6u4owaNZha0FYwfw0tTRM7LCdT6eyfGhMeBuBYleZExKSkZmVm7F4EgnwGtHe1dn/xRSiKUl+OLp2YmGRhSjKgjLLC0r5iYz+fLqWjBhVtS1KHGLAQjqFA11xfFOhrbeQWHBBM8iWyACG3tOoZQFMh4heJBxx0c2i81KTc1g54DMuhii5QjzcgRCVnYB7mqqqyqVsDMLcNNDey0O+ReXFecmJUcF+tnTdRlobBJpIqEJIs8lAuIFGDvqEbo4lgGNuMcmRMfFJYCsPRJ0kwls6DtTmgeuZbCGgjgpRwinSbDZgTo3JSk5LYMHvmFxPm7eyMyvb22ulBcp2nDYsKmmVlFUVl1blelmo2fn7hkaFBGPKy1YXIRELlcs4yYmskRF+Xl5Qj6bzYEvS0/ngEU/HzmkCES7eZwM2A0uA5Jlp+PyHiF4zIEd84vkvNjUxMhQd3MGenAIiXh+lIBwnExNDXIQGItM0cU8gKUdjqZHpiXDRJJiYyBLHPYwMXoAwnDcCxBPEIeDYDI1KQ53AsUnJIOFM52bi10NqAROb3B6lhZXtg8TR2Gqa4sLQaYvCnG31sVxd29P3yhmBodPXMLAY4NzjZeUmCGWE7TTPNwpBGLSFCZHmi8RS/LypAQpczpHVlxSWiRJTUhkSUvE8hK5DNz+4oy4jNTYSHcLQ13UTojqKBHLLxrQiDCCWRTML+KYsYW5JW75cInISMDVLCmJ0TEgb03EHROx8dGxaal49ETQ0iZBlvjkxDjcb5QExtF0DnQklubxeSIxX1CoKKvqHumtKweveYVUXldbyAz3taA52VuAYjwgPpXNZbO5/FxeemauODspPotwbBwwLrJZacng98wlbrgQ5WLDifjpGbk4vpQjQrQR44x/CWinC/LzBQlccXZydKiHjSHR2iSmHIilo0tUtZCPYL4MvAEWFjbgJneOyCCeOy0tMTGVlYjtRVwwEZXIYhJXZiVAI8kJkcyUGOKzlPTMTHCL5uSJc7iifJkwR1TW2DfaXpLDkVZU5UvKGxSgJ/I3p7s5WDq4u3oAOmam43lBKw+3xkc2K5HyOSxmOpgKM3FxFJebg20q4ubJRGJBeipHVFCYI5LghpmCqoayQlBmgowksbS5gh0TFeLjgGPEVGyuN4IQIJKY81NRJ1MNQA1l9eYSnBBhRgRxUU5aKjslIio6OiYazK1xKeyMZFgEQhgIpXH9VxIuUckErThuteEJRQIQD+HkkbCiZ0hZCCJbgVSULWtoluVkxfhZmnnZWtgHBPoEJ6exskEUSVz0wWFlYp/lSvjZ2fGRTNDjgNaQDz5RoRhUWRJUszOSWfgh4nwZzJ+dV6aoKskXS4uL0+VyAS8uJiLYzdxIF0UUQgAiRYS1q17UUcE5EmMLa+s3t3c5BouSQnh8dkZGdhYom8E6HRVB0Dcn81jgv2YRl7shVsSmZOCStyxWWoaAyxUIOHnFRQXYFTJFsZjHFhWKwPJf3lkpkPOi/BwsvZ2trPxjwgOiiYhI2ARBgcsX5OUKxFlpaXEx6cm494qFTZqTw88RCbJzJQIBK4nJE2Zmg4QYnHmikpq6clmupLQ0NTmDk58MRlw/a0MGUbCGBMTgH1FPuWiuQtEzMjG1sAHNLyQJTfchClDCvNykKEIM3I2HC+XiYlJ4GWBcxn7GhiL4yTNYGbhALJUFhmSuBO0muSyXz8HNCtnZuaWyDFYxpigLC9hRfm4mFpb21vbBQT7R6bgKh8vF7sIMlpiblpXIFWclxycyU+IzIAjE4GRzhWKOIB+k1knJbIL9S5rLF5QQN5+VS3IL6hVZmdLWylQIEhbobEbH6BxRjCNrgwYOM7MkFRqoE0wtfxTENiLFP4knEIgLOLgvAdzF8GCJxGaKYbLTcAkBcW1YCkFNDpSEz1NTOMKszDfcIYV88EGlgsw+C6TJ8qaWAklBHjPSz8MarH9OLt4+niGgZk/Pys1O52YzmTxc9pKQiHoJM5nJAYM3RBTkCLIB8flsiVSYnRzP5ElKyqS5QnkldhZuzJGDA1heUFYrSoiNjgoPC/Z0tLMwICOw69B0iHMlmDIlGO/MQTtGLLukJL+4LL6wUJwKTvaYuKQ0uEbQT4NKOxOErixWOis9JQ1XB8L1Z2YgMKfxRFl8GRpmJTmpGakxMUk8vpCXX9tSlisTc+ODvL0cjAyM7QPCUGhIxL/K4ueBf5SD3cVOiItLyhbm4FbFPA74zrMgCchWBcJMWEl2GmCFoBCE78WK4nQhEGkFYGpTab4gKQmvLsJ1sL+Pq6OtMQ6PaZJxIg6BXkPF0NjIBDZihavIrN1AY5/Myc2Xc2LDYOoJKemgIScuZUGUxI7KgFKAj9KJz7DHYC+pGTlCnpBo9QvSkhKiYzOzpTJxZWMVJgB4rChfHz9rip6BlUdkbFhQMgv5VZZAArPGpRLs5MjIRB5yFDaTmc1jpb+5oCAHkrCywGOUHh+Xxs2vVJSVyNixafWd5bJ8Pr9EEO8eGhcVHgMSctxg5emCY2V6xKgfhmtwGknFxAwHjyytiGuvrALYcQmsbEmJKAmXbb3hPU4jLpNLiI6IjgjBPksmHBe44glBiOsCQecMKgi+WCaWidiJMbFJmex8hJCavNxSSQYz3CfQVx9FWAsXr/ik4BgwzWcSt79gC4EEOiMxBgzyWdlpiZEA8JnZAngtsKvjmjKeiJ+REJUAOt3KEtzWlZosqy0r5Ac6e1sb+vDT3txoCZUE+HrgAkZrI0xbk4iDlBoqEMPC0sLKiuB9DWfFZbD5JQWZUbgrAVy7yWnM5ISk2NjIoNBgv7BY4sZAEN4TghDKgSBpmBzL5uaIsrI4SQkJzHS2sECqqJEhMnMzmEF+4Y44pU01dfUIAT8ciKfh7pgZeUIu7hcCvo5NAXV3dERQVCJuiQS9P/ZWFjw6XHN6ckxsWm5FVWkuLzsjRVBRVhBv426lYc0XMaNwZU80rvUMxIks3C/iYG6gByMh2gpEMLTEwgfHNFYiP7uyThAXDt7vaICS1PT0lKTo8IhgXHoVEpaAW7jeYG8YO15d2EsyMQPH4QtgnoC/bB6LlyevknOFpVJMxQUGBRrifyAZOvqHhEawcjOTwUKclsoBRz2bDd0mxrPzsuIgYAafy8yAj+FzEGcQHbNSk8G3nVXWgPvApCwmpzQ/3T8wwkg3RJbzozPFvQRBfrjgjSBDAz26Pg6MaUIjuJQBN2WYW1n68dPSeeKWskTiGoPIeJD0w+emx8VFEfeWhASF408gBaIi/jQ1kwWNpEAlwE9pqfEgducIcN1nbnkRn1tUyM1ITQoLMtfARJIaxdg1NDIiVlqSAVyDn8CBTriZMLWkFKFcmJWWkpLJTknhgFBZkJWJuiKCVnJsfHyyFPeTtVdmZ3ALZeyMREcLl3ARC843nFghxO1oPl64ptTWAlxYFA2r/x+sVfWSw4TNIAAAAABJRU5ErkJggg==',                                                   code: '294491310254',                                                   item: 'Cheese',                                                   description: 'Jasper Hill Cabot Cloth Bound Cheddar'                                         }

 

 

Enter that data into the table and it should be as shown here (NB I only entered two records)

MySQL1.png

 

 

Webpage Development

 

With the data inserted into the table now we can get on with coding the HTML page in order to sync the data. Using the Price Check application I am going to modify it to firstly remove the Database from within it and then hook it up to the database via a PHP script. The first thing I needed to do was in the DecodeEvent fucntion which handles the decoding of the barcode, now rather than doing the searching through the internal database, I send that data to my PHP page. In that PHP page, I can then search the database.

 

Here are the changes I made

 

                             function decodeEvent(str)                               {                                          str= str.data;                                if (window.XMLHttpRequest)                                 {// code for IE7+, Firefox, Chrome, Opera, Safari                                           xmlhttp=new XMLHttpRequest();                                 }                               else                                 {// code for IE6, IE5                                           xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");                                 }                                          xmlhttp.onreadystatechange=function()                                 {                                 if (xmlhttp.readyState==4 && xmlhttp.status==200)                                         {                                                   UpdateScreen();                                         }                                 }                               xmlhttp.open("POST","getuser.php",true);                               xmlhttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");                               xmlhttp.send("q=" + str); }

 

 

You will notice a few things in this code:

  1. Firstly I create a HTTP request in order to send the data
  2. I then have a callback which waits on the object to be returned and then it will update the screen with that data - this is this snippet - 200 means that the xmlhttp return is "OK" and the ready state of "4" means "Completed"
 if (xmlhttp.readyState==4 && xmlhttp.status==200) {                                         UpdateScreen(); } 

 

More states can be looked for such as error responses etc - they can be seen here - http://msdn.microsoft.com/en-us/library/windows/desktop/ms767625(v=vs.85).aspx,and the ready states -   http://msdn.microsoft.com/en-us/library/windows/desktop/ms753702(v=vs.85).aspx

 

Then I "POST" the request to my PHP page. This is where the data from this page will be interpreted and returned to the page. I used POST rather than GET as it is described as more secure. Theres quite a few documents describing the differences.

 

The Update screen function then updates the screen with the data returned. As you can see it is returned as XML and you can get the data from the XML file as shown below.

 

function UpdateScreen() {           document.getElementById('info1').innerHTML = xmlhttp.responseXML.getElementsByTagName("info1")[0].firstChild.data;           document.getElementById('info2').innerHTML = xmlhttp.responseXML.getElementsByTagName("info2")[0].firstChild.data;           document.getElementById('image').src = xmlhttp.responseXML.getElementsByTagName("image")[0].firstChild.data;           document.getElementById('code').innerHTML = xmlhttp.responseXML.getElementsByTagName("code")[0].firstChild.data;           document.getElementById('item').innerHTML = xmlhttp.responseXML.getElementsByTagName("item")[0].firstChild.data;           document.getElementById('description').innerHTML = xmlhttp.responseXML.getElementsByTagName("description")[0].firstChild.data;           document.getElementById('priceLookup').className = '';           document.getElementById('information').className = 'hidden';           setTimeout(function(){document.getElementById('details').style.maxWidth = 320 - document.getElementById('image_div').clientWidth;},300);           asl.back(function()           {                     document.getElementById('priceLookup').className = 'hidden';                     document.getElementById('information').className = '';                       asl.back(exit);           });

 

PHP Page

 

This page is used to receive the data which was sent from the HTML page. Here the data which has been sent as 'q' is recieved (Line 2), then we connect to the MySQL database which we previously created with Database name "Product" and username "root" and the password is blank.

 

Then using a simple SQL Select from the Table stock where the code equals the data we have received. Here we set variables for all of the data which has been received and then outputted as XML at the bottom of this page

 

You can test this by just using the PHP command window. If you navigate to the directory where php is located and then run php.exe and then the file you want to run, this will execute it and test that page (just incase your HTML page is broken). Simply change the SQL query to be a number you know exists!

 

        

 

Getting the page set up on the webserver

 

Now you have the pages, we need to make sure they work on the webserver and on the SB1. First lets check them on the PC which you are using. Drop them into your webserver folder, normally C:\wamp\www

 

As we are wanting to use these on the SB1 we will need to also include in this folder the "asl.css" and the "asl.js" so also drop them in. Due to this we need to edit the HTML file to update the path from

 

 

 

to

 

so that the asl.js is found on the server. With these 4 files on the server we can now view the site.

 

If you load Chrome up and then navigate to http://localhost:8080/index.html,this should then show you the SB1 page. It should look similar to below

 

If you have issues, check the Chrome Developer options (F12) and this will bring up a console, from here you can see the HTML/Javascript Errors, if no errors are shown, it may be your php, test as documented above

 

MySQL1.png

Obviously you cant scan a barcode to test but you could insert a button and send that data to the DecodeEvent function to test the return values to the database

 

Add this to the information body at the bottom of the page

 

 

Submit Details

 

 

Setting Up Your SB1

 

So your application works with your webrowser and you can access data from the database, now we need to get this on your SB1, and this is the simplest thing so far :-)

 

On your SB1 connect your device to the same wireless network as your webserver is connected to

 

Take your SB1, and if you have one, connect your developer backhouse. If you do not have this you will need to use MSP staging server or equivalent to do the next parts.

 

When the SB1 is connected you will see the UserDrive as an external drive. Navigate their and then create a folder called "Config". Navigate into there.

 

In here we need to place a file called apps.json. This will link your SB1 to your webserver

 

On your webserver get your IP Address- CMD->IpConfig

 

Using this we need to create an apps.json

 

{ "name": "Price Check Web Demo", "url": "http://192.168.4.184:80/index5.html", "icon":"http://192.168.4.159:8080/price_check_icon.png", "login": false, "canOverwriteBadge": true }

Here the IP Address on my server is 192.168.4.184 and i have been using port 80. Also I have put an icon on my webserver which is for the application icon on the device's screen.

 

With that saved onto the device, reboot the unit, using the Scan and Home key and then the application icon should show on the device.

 

Click the icon and your scan demo should be there, scan a barcode from the demo scan sheet and it should show the data.

Untitled.png

NB: The image may not show as they are too large to send over the webserver, create a smaller image and convert it to base64 via a online tool

profile

Mark Jolley

Please register or login to post a reply

8 Replies

D David Males

I would like to share what i have been doing however my "hands are tied" to some extent.
Suffice to say that it was the following:
Website 1 has a page which enables the scanner. it makes calls to the webapi.
WebApi hosted on IIS7 returns json data for the page to handle. If this approach is used then enabling CORS is important for the webpi to allow it to serve the requests from website 1.

If you have any questions then I will try and help out.

M Mark Jolley

Hi David,

Great news you found it useful :-) Sometimes you write these things and are never quite sure if they will be read!

Glad you managed to get it working and apologies for not getting back quick enough to answer your issues.

Is this something you could share with us and do a quick write up for others?

Cheers
Mark

O Ojaswini Kulkarni

Hello David,
It would be great if you could share your demo application. I am planning to use ASP.Net and MSSQL server.

Cheers
OJ

M Marcel Pertile

David I am having a few issues with the SB1 app... Any change you are still willing to share or sample application for me to get an idea of what I am doing wrong?

Thank You Very much!

Marcel

D David Males

Hi Marcel,
Sure I will try and help out where I can. It might be a good idea to start a new discussion with a summary of your app/how you created it and what the problem/error is?

Cheers
David

D David Males

Looks good, I will have to try it out. I am trying to get a demo app working in the.NET environment .
Run a web app on my webserver with webapi. The webapis are used by ajax calls to update the screen.
Have you tried using jquery when developing web apps for the SB1?
My first attempt at this has resulted in the app working in desktop browser but the ajax call to get product info failing. Once the fail callback function is ok'd the screen keeps refreshing!!

FYI - the web app uses following
asl.js
asl.css
knockout.js - I have watched the developer video which suggested a SPA approach
jquery.js
modernizr.js
myown.js with ajax calls and update DOM elements.
Obviously I will have start again and probably running before walking! so starting with creating the XMLHttprequest object could be good starting point.
Cheers

D David Males

If anyone is interested I have a got my demo working. In a similar vein to the example above I have got my demo working. On the client dev side I wanted to get back to basics so just used the following:
asl.js
asl.css
mytest.js - using xmlHttpRequest

A page does the following:
Scan barcode - calls webapi in ASP.NET. Retrieves basic product details and displays on screen.
There is a number field which displays SB1 keyboard to allow user to enter number.
Update button - calls webapi to update database.

J Jitul Vijaychandra Chanar

Well described and useful article.