理解一个新的技术,无疑就是使用它了,下面我们就通过一个可执行的demo来展现REST的原理和使用。

  一 Demo

  1.1 服务器端

  1 主程序MainServer.java负责启动一个REST服务组件,并设置端口号,创建主路径/threshold及子路径(见步骤2),最后start启动即可。

public class MainServer extends Application {

    public static void main(String[] args) throws Exception {

        Component com = new Component();
        com.getServers().add(Protocol.HTTP, 12345);
        com.getDefaultHost().attach("/threshold", new ThresholdApplication());
        com.start();
    }
}

  2ThresholdApplicatio.java文件,增添路由, /threshold路径下新增三个路径,/threshold/register /threshold/metricRegister 和 /threshold/info

public class ThresholdApplication extends WadlApplication {
@Override
public Restlet createInboundRoot() {
Router router = new Router(getContext()) ;
router.attach("/register" ,RegisterResource.class);
router.attach("/metricRegister" ,MetricResource.class);
router.attach("/info" ,InfoResource.class);
return router;
}
}

  3InfoResource.java文件,为路径/threshold/register实现get和post接口,post方式需要解读参数。

public class InfoResource extends WadlServerResource{
@Get
public Representation method1() throws ResourceException {
return new StringRepresentation("Info Register Success! Get Method");
} @Post
public Representation method2(Representation entity)
throws ResourceException {
String result = getRequest().getEntityAsText();
System.out.println(result);
return new StringRepresentation("Info Register Success! Post Method");
}
}

  4MetricResourc.java文件,原理同步骤3

public class MetricResource extends WadlServerResource{
@Get
public Representation method1() throws ResourceException {
return new StringRepresentation("Metric Register Success! Get Method");
} @Post
public Representation method2(Representation entity)
throws ResourceException {
String result = getRequest().getEntityAsText();
System.out.println(result);
return new StringRepresentation("Metric Register Success! Post Method");
}
}

  5原理同步骤3

public class RegisterResource extends WadlServerResource{
@Get
public Representation method1() throws ResourceException {
return new StringRepresentation("Register Success! Get Method");
} @Post
public Representation method2(Representation entity)
throws ResourceException {
String result = getRequest().getEntityAsText();
System.out.println(result);
return new StringRepresentation("Register Success! Post Method");
}
}

  1.2 客户端

  测试程序TestClient.java,扮演客户端的角色,请求服务器url.

public class TestClient {

    @Test
public void test01() throws IOException{
ClientResource client = new ClientResource("http://localhost:12345/threshold/register");
Representation result = client.get() ;
System.out.println(result.getText());
} @Test
public void test02() throws IOException{
ClientResource client = new ClientResource("http://localhost:12345/threshold/register");
Gson gson = new Gson();
String str =gson.toJson("");
Representation result = client.post(str) ;
System.out.println(result.getText());
}
@Test
public void test03() throws IOException{
ClientResource client = new ClientResource("http://localhost:12345/threshold/metricRegister");
Representation result = client.get() ;
System.out.println(result.getText());
} @Test
public void test04() throws IOException{
ClientResource client = new ClientResource("http://localhost:12345/threshold/metricRegister");
Gson gson = new Gson();
String str =gson.toJson("");
Representation result = client.post(str) ;
System.out.println(result.getText());
}
@Test
public void test05() throws IOException{
ClientResource client = new ClientResource("http://localhost:12345/threshold/info");
Representation result = client.get() ;
System.out.println(result.getText());
} @Test
public void test06() throws IOException{
ClientResource client = new ClientResource("http://localhost:12345/threshold/info");
Gson gson = new Gson();
String str =gson.toJson("");
Representation result = client.post(str) ;
System.out.println(result.getText());
} }

  1.3测试和结果

  1先启动服务器程序,执行main文件

  2执行客户端请求,单元测试程序

  get方式的单元测试1的结果如下:

aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAZcAAAIDCAYAAADIeVPFAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAGeYSURBVHhe7X1rjCXHdd4AThAEcZA/RoD8yp8ADowARmB5AU+cMEAcJAoSGXJCy0lsa2UzE8XxQ7IoW4KU7EYSsqRlm5eySEheOxqbskxrZFGQuSMJdLQkRfFNrVbULhmOyeVrRWqXjyHFx5IiVemq7uquqj716q7uru77DdC4c293V1d959T56pyqPrXBHH/7+/uMH9vb2+JT/X78nj3GD/X3kP9dzws9x5+DPyAABIAAEMgXgQ2QS77CQc2AABAAAnNFAOQyV8mh3kAACACBjBEAuWQsHFQNCAABIDBXBEAuc5Uc6g0EgAAQyBgBkEvGwkHVgAAQAAJzRQDkMlfJod5AAAgAgYwRWF9y2buOXbVxMbtqdZYQz1l20+bF7FBxnh/kNbtX2s8lFXhAXZI+bz6F7W5tsI2N8tjaJeq9t2KbtnMTNLOuL1nZCSqERwKBAREAuZDkUiHuIqDRyCWgLgMqiFr03mqzNubSqPPPzdVezxrssdWmhSCKklUS2djYZPrjHPcmJxd3PZ0giLpsMYoDe4KH24FAlgiAXLqSy9jidHpaY1dml20lNZQ2o13+vuEc6fcw+NGw9XjW7hbb2FyxvjQcXWXcAAQmQmD+5FIZ3Z2tMkwljq07SzhNg1x5Gzt8+CjPFffx8Jh2nxQGadB9YSr9/KGNS9lNQRbFc19AXVohvKq9LVx4+1znvMpoIZfKUyBDVcY56e3Q3lDlnQSN9mmD7wyZWetZtmuleGhB9fTiJdwvkEsITrhmMQgshlwObVzJTitGUyMQ6Z0Q5ELe5ySX6qTT2Fd1CVYTSSyO+wI8l/OrSwuSlGR2J9tRiVari+tcSKUpcjF/49+bEBY39nYHhCYIQTze0b7Lm6DOuerJzymeEicEzUPr6blgriVEuXDNQhBYDLk0k+6l4RTfQzyXOiym3NeVXAIIgNSbkPss15SE0iw+aMhF94QE2dZ/rnMhmk2Qi+ENlN5LQy61h0LPvJNzLoOQi7OeRrtanlMXcjEIKwReXAMEFoDA8shFNcIx5EIZb5fRj73epSxdycVYVKB7LvKBlZciCMj0jFznXBUmyCU07CO8AXMexWK0W54DVadIz8VZzyHIpayzIEp4LgswmWhCKAKLIxfNwGpGuxmtUyEz0jDHkgsLCG+Rkgm4j6qLGuarn03P8Zze4uQSf45WJFtYzBX6Ukoi5lJ42Ky96qzvhL4tLGarp49cypVrnVbHhZJvaM/FdUAgcwQWQy5qaEgNAZVGtTx2VuW7LSq5kPdVhlwPN1X3MXW0r5Rdh53M86ET+pb7nHUxwluifcacixIya3Bpt0EPm/m0NmxCv5kvqUiieieFfC9FC1epy42rsFJ9rzzXLrMp13VOuBHi/Zd6OXU9r+MnF/1ec1m0AzeQi0+pcH5hCCyGXOiXIRcmLTRnvgiAXOYrO9S8EwIgl06w4SYgEIlA0LLqyDJxORDIGAGQS8bCQdWWhYB7xdyy2orWAIH5kwtkCASAABAAAtkhAHLJTiSoEBAAAkBg/giAXOYvQ7QACAABIJAdAiCX7ESCCgEBIAAE5o8AyGX+MkQLgAAQAALZIQByyU4kqBAQAAJAYP4IgFzmL0O0AAgAASCQHQIgl+xEggoBASAABOaPAMhl/jJEC4AAEAAC2SEAcslOJKgQEAACQGD+CIBc5i9DtAAIAAEgkB0CIJfsRIIKAQEgAATmjwDIZf4yRAuAABAAAtkhAHLJTiSoEBAAAkBg/giAXOYvQ7QACAABIJAdAr3J5Uc+zljMkQKB/f39FMWgDCAABIAAEBgIgd7kwg09J5fQzxTtALmkQBFlAAEgAASGQ6A3ucQQSypSSFXOcLCiZCAABIDAeiPQm1xCPRZ5XQjcF155lZ176jl2y92n2bEv3yU++Xf+O//LgVyeOHaYXXLJJeI4fOyJkGbhGiAABIDA2iDQm1xSey4vFwRyz6kz7OQDj7GzzzzPnn/1dfF58oFHxe/8/NTkIojl8DFWUsoT7NjhS9jRE8V/CuFI4klDPs0z1kYz0VAgAARmjUBvckntuTx+7ll2132PsPMvv1Ydr7Nz1f/890effHpicjnBjl5ylBVc0vw9cYwd5uxS/xHX9FITkEsv+HAzEAACoyPQm1xSey5fuOVedurss+zh57/LHnn+1eKzOb55dp/x81N6Ltw7EWGwE0frsNjREwWZ1J4Ml6GFXDgJVaE07tFofGSck6E22hs6zBCJG72v4IFAAAhEINCbXFJ7Ltdcfxu74+yL7MNX77QO/js/PyW5nDjKDTsnD/7JPYrqu5dcTMKRZZTSOnHUIBtNiPBcInQalwIBIJABAr3JJbXn8vmbT7K7z5xn959/id1XHfc/Vf7Pf+fnpyMXbuSLkBj3MgSZSMII8FwMz6Sck2k8kNpD0dwZqSEglwz6CqoABIBABAK9ySW153LmW0+zr5x8kD30zEvF8TJ7UHyWx80nH2L8/HTkUpEID4mVM/gNyfg8F36Pdo1FSjLcpsfM6kUDEbLFpUAACACByRDoTS6pPZfvvHSB3XLiAXbrvQ+y+x57ij26/yK77/Hz7LZ7HxK/8/PZkIskDEk2tRipORf+myv0peiA8HL0RQM8bIYlz5P1EzwYCACBSAR6k0tqz4XX/4WXXmGPPfkMu+Gr32Cf/dLt4vPx4jv/nf9NRy5VWEyEw4qwVhEiO1osQ1bDWyX+YRP65nJmdflyKzqmhdUwoR+p57gcCACBkRHoTS6pPZeQ9k9HLr6J95Da4xogAASAwPIR6E0uQ3guPtinJBexBFmdOym+k3PwvkbgPBAAAkBgwQj0Jpd181y4LujvnhgvVC5YWdA0IAAEgEAoAr3JZWrP5cnnv8dwAAPoAHQAOpCXDvQml6k9FyhUXgoFeUAe0AHoANeB3uQCzwWKBGMCHYAOQAdMHehNLvBcApXqxGfZlRsXsysve5wI4z3Ojh24mB0qzvODvOYzV9rPjR0aDKlLdc01nwnEZ+w29Hzep962wX5ObduJK9gbDlzBbu9Zbt1BnfqyTEyzJigu3w1D5glkzfVooyh3423HFhfe700u8FwCO3qIsXBdE2LQEyh7UAcPqUsUueyxDxxI3XEdZVaGQnTqjR9jHzihyrC8j5/TyEPB9vbLfow0BsJQRBuJamDxtjt04xKiL2PJ2/mcY+znBI7qscU+Je/RsNYxrQ1rfa9y3+ht8+jgEOQiypyyzYG2q6MsepMLPJdAAYUYi5BrOgo6iDRSlp0tuZTGsCYOrYPzc5xsfMRkMwjy/kCdEHjPnVxkW3nbTVworBsyb3l/KfUvuqwhBjgePfjMFttI6e1GtzlGT+Ov7U0ua+e5VARwzdvKMJU45KjTJAfVwMpzxX08PKbdV4/yqNCZL2Smnz+0cSk7po3ETaWQ11/JbquVsfrtwGfZffy3qt7tMJ2nLsZ9/H5fWEx4Aa2Rr+JNOEa+Txrn3nDZnhj9O8s0OrS8VvdS7IaGG0T5HIqwbV4Nde1tb2tCobUuSflJPbus1AldX0o58PDpfZddWumhIk9Sfnewa4iQq7jfIvdar4OMVptcKCxU/KzkwmWkeY4lSam4615PiKdU1u8Dir4F6UvRdvVZLW/Wqp/259W6AHLZZ9vb2yLlijz49+P37Ilj7TyXqtMf2qg6M0Ugcl6FOEfe5ySXihxIr4YiioARhulVSEPG5xBcBOmqZ8h9ViNlM+amwdI9A/fIly5TNXjCaBQjxw+0CMNVHzOMZuAdHepwey5SX0oSkQOHilyKgco1XNdU7K1yaAhJJTpRrhgcleQTRyhq29vkQhFxC391YKGO4gXBlKRhlmMPP7r0pQrfybClkJMqS5/nQpw3y9C+G89T2qORS3QYNaB/Bw0Ghi8HnkusIFpGXhkRhngu9YQ+MZJ0hcWoc53DaLpBU0evpRFTvZqweurGr/F+fJ5L2dEsHdsYFZpzJLWHQnZQN7moBqptBEPJjuqgsaGxwLCYNiCwDypc8hOeEicSZTBR/ybDc5WXFCa3/uRim9fSPFBNvg58nfpiEo8p43hysXlmZZuM57XCr13m54YnhJTh897ksq6eS72iK2jUSHgEsWQRe72HNBsjpI9osyKX0LBBFUbRJ9MtxqK6tgmxUNfNhFzMRQCFzF3yk4OI24oBBA/rXnnZHXV4rTEqlQcjSEYdZPgMW8KwWKW73Hi/4YC5eMJBLk59yYlcSixjQqgpjf5YZfUml3Wdc5Hkoo3YNQJo5ifEKNAgh9ZIn3eoWM+lHm3GGAFpJEojco2I6bfj9WT7XGExcmTtn3ORik7PZRgTwi7CJMJR9jKVcAgVrrB5UmI0OlBYTM572DCm8CXIRc6XkfLjZRwoQmnFcRvXNfE/LaNyPsg3f+f2XMo5MXP+LHBCvyaKkujNwQC9Ks+lLwa5EHJ3z6d1CYuZc0HGgofQwVNsdCWT63uTy7p6Ls0ErN451Una0nBX5+u5mmYStw49EOeayXB1JEncK2PlctI3wiDUdTWMVDNJXD6vCZG462Jte4iy25YHm6GOOi7fLBmWCwLck622RQIqWVDLatvLZ1NN6Dexd2VxiDGhX3vIoeRSey8OPRPyloMfSSBt2YaFxjxLkaVXSSz7ti5FFve05dUiGGoJs1VfzHoSgwRSB9t6pi02sLbPFRarSBnk4p7QX3fPZSwXE8/xhWVGOu+csA/wbEKIFtcM8EIhtVR6JJ2xyRPkgtVimmHvPIk+sSLDYCUzWGlfooRejDNwypBcolcWzktXeofF4LnMS+DjdOTlY9JaBs1HoQteVjp/vcmQXNR3shaoO73JZeo5l9C9BXAdEAACQAAIjIdAb3KZ2nMZDyo8CQgAASAABEIR6E0u8FxCocZ1QAAIAIH1QaA3ucBzmVZZdreabLRbu0Rd9lZss1iySZ6btupr83TIaDxRA+vxsFafxHFXbcyZFeu/WRg8l3GEqXaajY1NttpTn7vHVpsWAklOLrZn7bItLQGlWcdxcMr3KTnIKF90YmuG/hCL2HDX76022YY5ei0GuvBchsM8UcmlUWoJTyvdYbgS1aIpxkUuDaEIhdtcMY0Dk9dlTgXmIKM54WWrK/pDVlIUg9ct1gqapCAXeC4Di9omvABycYYIKo9Gvt3eDDy4B7LFVpwcKk9ks3KTBGG00uNLQuH3Kd6KWW/r84qGGOfk80QTPfWsldp4nnDTV2VIsKyz3gH0ka9yzlVPj6itZZYNIb3LcWU0gK7uXceuKrI47GwpWQa27lTGIuV5mdHiqtXZ4tydbKf4rfy/+Tu/KpKmbl7Hzruqif6g6LQarSj77dj9geuv1l8V2cFzGaC/pSwyzANwjYqpc4YiFirZEEMV3pJss1umPm9GJmGeizCaNWO5nseYGa+t8ROGxCQslczcnUn1nNRn6HVTpeWup0uu9jLlXTnIyNECg1Tbgw7LvRW58CSXp4tLBEEUKWxuEi6rQSK7JQHt7J5lN21ayEUlJuKR6A859QdjQGnIqze5wHNJSSXtsgbpTKQhCTPathF4QRH6nIsaEnM+jzsnlUdkxG2pWG5DEgEjNWqBg0akBt6eetol7e5k5X2R5DKIjAbQ1Ypcai+kJpDiWdX/ah4+/j+/9vRW4c1wIpGeTyGr+jcnB4aEW3PAeh36gzkY0wXXm1ywWmyADqsNpk3PgXpeZGfi3oh1PsRttN3kUhFUZRhrd9n5PKU9wktqPJ7RySW0ni0RDEAug8hoOM/FRS47BMnLENjpwtPhIbWrVneS3kwbavQH3TzI0NgAgy1vfxiYXOC5DEwu1Yi3+4S+LSxmW57sI5cyjNWOs+oGtvRGZNiqHMUFLYdWY+resJj0tqpJXiV8Zw21OfGMqKcm9r6TzGPJaABddXkuMmRGhbq4V7N5JdspjtP8OvE/D5n56jgXrNehPwwcFoPn4usMKc7blvlKo9q868JH/qURd53jp9XJ7uL+2pPxk4t+r2VCvwqT1SRkfV67nhoJSW9GTMrry5vVBQabxeS9OqFpJxcKG/uEfviKN7MdssycZJRCF81QYjlhT3ouAmp9Qr+ej9GIp5yDaeZqfPVEfyjnxKbvD4NO6MNz8XUEnAcCQAAILBQBx+o9zLksVOZoFhAAAkBgDATIlyiLB/cmF3guY4gPzwACQAAI5IsAFYbuTS6Yc8lX4KgZEAACQGAqBHqTCzyXqUSH5wIBIAAE8kWgN7nAc8lXuKgZEAACQGAqBHqTCzyXqUSH53oRSJ4R2vvE0S7wppYfrSbdH+Rtw4Llp6LWmq/g7V5A0tfe5ALPpXvnCrtzHVLZd80Y7Llv8cbJ1v6ueIZpZNqrlrwVgV8OtpVW/lx1aaUwRGm9yQWeyxBi0cY1WrbhsFxjQ9cpdfn+Tkg/set9qes/VXkLJ5fksI6tLyGDHyJdvWh3SEqh5AAlLbA3ucBzSSoPorCuqeztqfOF6rpS0g+UHj8+jX9ZTzXNv3x7353+X7+vlXamw3YDPimnxzMgUwKRDNOHi68dQ5yf/VYEWpaIUh9tmSdC9VP2QVu6en7e5tU4ZVTVNSjV0hDCVsrsTS7wXAaWkDGCCU9lb6TON/J0iXKUuK412zDxfFpxh0jjb2DbehvYNxIlznvzlSlbBbS2G7DLenA8yTehE3ouXVPue9TfH96JTLoq9FEd7afYLsLVCGNwpyVz9G3R4GpbgGcStHeNUfclkQs8lzHIRRm9B6eyNxVfV3T3Hiq6t6DmMLKlx2/lKtNyH/lG4Y5O2Bo1huwtI2XSLrdPpmWnCTL2EK+v7bjdQBkWse9XU5afkFwGUeMAA5r9VgQOcvFu0eAjF1tITAojBL9BBJekUHguSWAcshBFwaJS2XckF2+a7aqtRnr8In41bBr/Mk5gbKka77mMTi5d8RybXAbxXEKMY6TnMoieufuvHtZTkkV6ZQtysSLLvRJ+bG9vi0/1+/F79hg/4LkMSSwiMtue0A9KZW+QixHisWcNjkg7rxl7133+UTiZXZUK5RHbFdvj1l3CYj5vgZb3MHjatxRwey62bRGG1lWz/Lmkx9cHTFrY17ks2N9X7FmDA4i3R1jMNZczlhbAcxkL6c7PMZWwVGh/Knv3EmZnSvqu6fGTp/HXJ+bNtPplZEjdOsA0xvRiAOFlibCdmbbcT4I2MQ6Bp31LAc92ClZcOithjxvnsxWBxNucUzQXlWjbflt1voKM1M/ynCtdfSnCYk+k2Jl5+bzY+3pI2HZrb3KB5zKAVJIUaYbFkhSKQoDAeiFALOrwkUIwQE7PJMCzIR9Ukjk8l2Ap6BdyQsOfDwGQiw8hnAcCXgRa5OIPhXnLVC5I+RKl9LxyIBbeRHguMZowq2tBLrMSFyqbKQLtEGRq490KqXJCyyCs1VcgvckF77n0FQHuBwJAAAgsD4He5II5l+UpBVoEBIAAEOiLQG9ygefSVwS4HwgAASCwPAR6kws8l+Upxdq3KHE2ZW9q+QDAnUudA+7ve0mKNvStQ+73R6XOX0hafZdMepMLPJcRVN5cS59kss/3dvsI7Qp+xIvF8sobWZJmhzyzE7n48PSdt1es0/sOIe2MviaXdDN0PeiknSmW5fpl12XVlz/vWrSAsrqhN7nAcxlYnmaixWSP83eYZI/qXdC54sXRU0Wugpz/fHj6zlva1uUt7cFgyptcmmanXik5VOr8ru+yDCbgpAX3Jhd4Lknl0S7MQS7tvV2MF6gMj0cuofSmZbekpOf3lW/JlxmVV1U6/FCPYnfrxuKt+OrYfLhIWVj+7a3uLJZenqvb3nznpKLcI/9XrqXRL40LleKfX+9Kj28P/9jL9OJZtlK83KZj5a6nrCu19HURKf4HSmXfSvoplcS21UIrk3CTBSNEtr6XKl2ep/VcRtmNu1q43uQCz6Ur9OH31Qre2vrUGPkYo1x3nN42GjNHfc0zynrw3Ft65/Ov+y/DWg2BlN83Vy8KEDjpyP+p7yb5+JGrUt80m2sUCS+bhIP29Pi1FbIQgSsdv88zsZGLq0z7yHb2Kf7NzbCSpbIXGmSk5ad+M7BVXpZsk4UvAaWSzJJSTpf3aTsHctlj8Fz8pi7VFRTJqB2h9CykP1DlJuJeBulaWDqMI414M8rSCcdLLrunCk+n8VR0AuFEcydrqt2eXzHJx4+naVwCtxtofCerl1GH5hJkaPan1beHd5JvmTB2FmYXufRKZW8hF2+Zrv7iI5c+qfOXGxqD5+K3VJldYaSfqFedOOLMZnp8a5hGuBHW1PldyaXteSgEsvdw4VUo8ymciLT5FZN8QsSxxuTiTQNf4dfSiZCknWnnXIZJZW8hlwBcxOBsk0oWCXIJ6XXmNb3JBZ5LF9h73EPMwexuFW75ypMygnC/6VixPXdSELkQ7rwgF8VzEXMv8rvq1Qii4XMs6uQ9n3dRPRsDOzJ8YBjK4O0GfGExdzp+d+zdPudi94bcYTH7jqDm3I5F31pbJgyU4p+S0WCp7F1hMQcuNfnQiR8HS53vCYt5owI9TMnQt/YmF8y5DCwiYtKzZVRIA9vOieTeS16JG1vSiIeQC522vJpzISfk1Un7glQ4wRAhtHohgDGZTz+v63YDrlT2ASP76PT//jJtRm1OKf7HTmUfOqFfb/Mt+k9b/zXDPlDqfOuEfkap87tauN7kAs+lK/QJ7wtw+RM+bQZFpV6KOmGTs1qKnBCHIVPZJ6xmUFGdU+e75lvySZ0fhAFxUW9ygefSFfpU96VNAZ6qVtOWsyByKYDM5yXKhFIdOJV9wpoGFZXyJcrcUucHATAEucBz6Qp9//vkhOic47L9UaBKWBa5iFmE4p2i0PeJhsE0danDp7JPXWNfeVGp8xeSVt+FCTwXn8bgPBAAAkAACEQj0Jtc4LlEY44bgAAQAAKLR6A3uWDOZfE6ggYCASAABKIR6E0u6+i51G/KLysIHq08uAEIAAEgYEOgN7msr+ey3LQN6C5AAAgAgb4I9CaXdfRcJOjLW8HTV51wPxAAAkCgRKA3uayv57LE5aHoFkAACACBNAj0Jpd191zwjkkaRUQpQAAILAuB3uSyzp4LV4Vyct+zn8OydAatAQJAAAh4EehNLvBcmv1TvGjjAiAABIDAmiDQm1zW2XPBhP6a9BI0EwgAgWgEepPLunsueNUlWudwAxAAAmuAQG9ygeeyBlqCJgIBIAAEIhHoTS7r67ngJcpIXcPlQAAIrBECSciFE0zokQJb7i1N+Yf0L1Oij2cDASAwBwR6kws39DFHClCmJpcUbUAZQAAIAIElIwByWbJ00TYgAASAwEQIgFwmAh6PBQJAAAgsGQGQy5Kli7YBASAABCZCAOQyEfB4LBAAAkBgyQiAXJYsXbQNCAABIDARAiCXiYDHY4EAEAACS0YA5LJk6aJtQAAIAIGJEAC5TAQ8HgsEgAAQWDICIJclSxdtAwJAAAhMhADIZSLg8VggAASAwJIRALksWbpoGxAAAkBgIgRALhMBj8cCASAABJaMAMhlydJF24AAEAACEyEAcpkIeDwWCAABILBkBEAuS5Yu2gYEgAAQmAgBkMtEwOOxQAAIAIElIwByWbJ00TYgAASAwEQIZEkuF155lZ176jl2y92n2bEv3yU++Xf+O//LYSfKJ44dZpdccok4Dh97YiLx4bFAAAgAgTwRyI5cXi4I5J5TZ9jJBx5jZ595nj3/6uvi8+QDj4rf+fmpyUUQy+FjrKSUJ9ixw5ewoyeK/xTCkcSThnyaZ+SpRqgVEAACQEBHIDtyefzcs+yu+x5h519+rTpeZ+eq//nvjz759MTkcoIdveQoK7ik+XviGDvM2aX+I67ppXkgl17w4WYgAARGRyA7cvnCLfeyU2efZQ8//132yPOvFp/N8c2z+4yfn9Jz4d6JCIOdOFqHxY6eKMik9mS4DC3kwkmoCqVxj0bjI+OcDLXR3tBhhkjc6H0FDwQCQCACgezI5Zrrb2N3nH2RffjqndbBf+fnpySXE0e5YefkwT+5R1F995KLSTiyjFJaJ44aZKMJEZ5LhE7jUiAABDJAIDty+fzNJ9ndZ86z+8+/xO6rjvufKv/nv/Pz05ELN/JFSIx7GYJMJGEEeC6GZ1LOyTQeSO2haO6M1BCQSwZ9BVUAAkAgAoHsyOXMt55mXzn5IHvomZeK42X2oPgsj5tPPsT4+enIpSIRHhIrZ/AbkvF5Lvwe7RqLlGS4TY+Z1YsGImSLS4EAEAACkyGQHbl856UL7JYTD7Bb732Q3ffYU+zR/RfZfY+fZ7fd+5D4nZ/PhlwkYUiyqcVIzbnw31yhL0UHhJejLxrgYTMseZ6sn+DBQAAIRCKQHbnw+r/w0ivssSefYTd89Rvss1+6XXw+Xnznv/O/6cilCouJcFgR1ipCZEeLZchqeKvEP2xC31zOrC5fbkXHtLAaJvQj9RyXAwEgMDICWZKLD4PpyMU38e6rOc4DASAABNYDAZBLrJzNuZPiOzkHH1surgcCQAAILAgBkEsHYervnhgvVHYoD7cAASAABJaGAMhlaRJFe4AAEAACGSAAcslACKgCEAACQGBpCIBcliZRtAcIAAEgkAECIJexhLB3Hbtq42J21eos8cSz7KbNi9mh4jw/yGt2r7SfG6sN8jkhdamu2dkdu3LjPG93a4NtqW3bW7HNzRXbS/V4p76kegjKCUaAy3fDkHnwzfYLuR5tFOVuaMqUoOAMigC5jCWEEGPhuibEoI/VlpC6RJHLHlttpu64jjIrQyE69cYmW6mM4DpX4bu32iSNgTAU0UaiGlhs3alLL0RfxpK38zm7bEvgqB5brOZdDU9dxrVhre9V7hu9bR4dHIJcRJlTtnlYkEEuw+LblB5iLEKuGau+fZ+TLbmUxrDmAK2DcwPTdHZBIqY34jQIvGyDrLw4zp1cane2aLtpKCmsG3xa3p8XqyEvGGKA46nv7lZbv4Zs4shlg1xiAa8IYGerDFOJQ446TXJQDaw8V9zHw2PafbIOJLn4Qmb6+UMbl7KbnLEZef2V7HTd9uq3zevYef5bVe92mM5TF+M+fr8vLCYMeGvkqxhox8iXGec2KxfEWabRoeW1pMPBrzUMJjeI8jmU6ti8Gura01tNKLTWJSk/qWerMpyq60spBx4+Pb+6tNJDRZ6k/O5kO0TIVdxvkXut10F9hBOJTi4UFip+VnIRuKteTklSKu661xPiKZX1Wyn6FqQvvDvI0BUVFrPqp/15NZwgl322vb0tUq7Ig38/fs+eONTfQ/4P0lPPRVO+oc+qTn9oo+rMFIHIeRXiHHmfk1xkLIaas6GIIgBh06uQhozHMlwE6apnyH3WqtlGjabB0j0D98iXLlM1eMJoFJ7JykIYbeMY4JlEhzrcnovUl5JE5MChIpdioLLDdU3F3iqHhpBUMYhyxeCoJJ84QlFLapMLRcQt/NWBheolKsRulmMPP7r0pQrfyVGEkJPqZfo8F+K8WYb23XgeMVApWKtDGDWgf2dyCTyXWEG0vAtlRBjiudQT+sRI0hUWo851DqPpBk0dvZZGTPVqwuqpG7/G+/F5LiX8lo5tjArNOZLaQyHdDje5qAaK9EYoY1DMJLRDP6YCBRCQdktgWEwbENgHFS75CU+JE4kymKh/Y7pXGia3/uTimqKi5evA16kvpuxM/YgnF5tnVrbJeJ426DCIJ9YGzeR6kEusoEyDHjRqJDyCWLKIvd7TrsYI6SParMglNGxQhVH0yXSLsaiubUIs7etKo0ZNtGZGLuYigELmLvnJQcTpYgDBw7pXre6sw2uNulQejAjFqYMMX0dJGBaTznohh81Nc/GEg1yc+pITuVRDKsvCEB/SczkPcomVlGHktRG7dq4ZCYpRoOs+V7jJea5jWEyUWRqRHRHTb8fr5XLolkciHA0iREeOrP1zLrJ59FyGMSHskhURjrKXqYRDDA/FTixyNOqZsO8aFpPzHjZ5U/gS5CLny0j58TI2i1BacZzmMhT/0zIq54N883duz6WcEzPnzwIn9GuiKMnfHAzQq/Jc+mKQS/R8WpewmDkXZAxYQgdPsTYqk+tBLrGCqOdcmslYNYSgTtKWhrvqvK77iHPNZLg6kqSeaZ4PNwh1XQ0j1UwSl89r2ueui7XtIRjblgCboY46Ll92dnUxQCvEElSmffGALFstN+WEfg2LNgFfyc85h2UJpVUFWuUn9UzIWw5MpL60ZRsWGvMsRZZeJbHs27oUWdzTlkuLYKglzFZ9MetJDBJIfWnrmbbYwNo+V1isEhTIBRP6mm3sPM8RYmFxTfYIJF+KnH2LF1LBkJDmyE0FuYBcQC4jd7rMH5f2JcrMG7uY6mVILtEh1HkJA2GxWHnBc4lFbJHXt5ZBL3xZ6fyFmCG58OlL+d5NdGaH/CUCcslfRqghEAACQGB2CIBcZicyVBgIAAEgkD8CIJf8ZYQaAgEgAARmhwDIZXYi0yvszHvELx0im+vMMRu7+pDReIgD6/GwVp9kzkGeWTEGcplGFtFP1d8JMNfo+9PLp5svdOUBU987ic0OHA3JzG7IQUYzg8xRXfSHfGRJrp4sXhwHueQjI0tNqpe4nOzgy4uUspEucmkIhUxXn7IasysrBxnNDjSiwugPWUnRtpwa5JKVmOjKBK2Fpw1X6lTh7vT4Rs4ns94dUucLQDwpzfVNqZr0GsJNX5W7B5Zv2uupN+JTtvt1xVpm2RByQ7RxZeRvQ/QVMgkmtQWFaLayZUCd8j8g/b+tIugPik6b2xLY080M1R9cGSvguUT3pnFvCPMAXKNi6lxEavJWDqYwz0VPi94xdb43pbm7M6kbfakx4W4p291yt5cp78tBRo42kBmFA3YHNbag0HPRGSRS50fzpf+31xP9wZarzZ1uRm4vIbd6StMf3BnAQS7jckX00wbpTDGpyVsjxcA5F3Vvjo6p87unNC83eKIjiV1TtrtEF5JmP5JcBpFRtPr5b3DlQCM2j+O56nhSTXf6/5HJZRCsjVxmi+wP7hdTQS7+7jPtFeS+ImaVIg1XTGryKHKpRlVVZ60TDYbmUDJS549OLqH1bGnEAOQyiIyG81xkFmaZlVkkvXRsdR2W/p+oL/qDBkoziPJ7LtGDLW9/ALlMSw69n953AtMWFnON7N2pwkNS2eup6zumzveGxWSIQGauNeZc6gkZVQguPCPqqcl1LjLqrYztAgI2yCN3t4xI/68/dC5Y6wOOZfYHhMUG6FFjF2lLF+5KB+5JFe5MTe7Zh4JMTW4qWlnn2nvpmjrfkbJdXWCwWUzeq7tE2sNiYpbZSNdv34NdnbdxS91WZk4yGkBvfdtbt7aT0LcUKInHTP/vqyf6g7krq9BqmadM9Ltx+gMm9H26ivNAAAgAASAQj4Bj9R7mXOLhxB1AAAgAASBQIWDbggLkAhUBAkAACACBXghQYWiQSy9IcTMQAAJAAAhQCIBcoBdAAAgAASCQHAGQS3JIUSAQAAJAAAiAXKADQGDBCLRi4Xx1j/q2+ILbjqZNiwDIZVr8A5/eflciXQr9wCrgsh4ITCM/2yoefx60Hk3FrUCgQgDkkr0qhLyRnH0j1riCE8nPmT04JF3NGosMTU+CAMglCYwDFuLLpWS8+V6/Ec+r5ElXv9Le6JX5Uj1t0d6YL9PZ297CH7wuXWAfO0X8RPJzvTldqsYm26Dc30q+8Iy7KBfuUREAuWSuD6oRUNM7yM5vTXPizctVEENTSGu/ExoWY8RrJLYbtS5zShFf4Tye/AI8E+smT1tiwAByydwwzKB6IJfMhdQeYeqJKGuDZViDPhmF7ZC4yWXcunQU3BQp4jXZjCE/d7baErkAAuoIMW4DAhwBkEvuetBKe21Jr58wXb0LEvfe5dWdY9Slp+cyaop4bXXWGPIDueTerdehfiCX7KVsZBe2bJcrmqGGOrxhMU/mYwqXmGWsQ9elq9xGTxE/hfwCvBJPWEybL+uKNe5bawRALrMQf3iKcS0CY01X795YKNxzUfem9yy3HaAunUSXeYr4VPLrPKEvPUJMunRSL9zUIABygTaEI0CsfPIZsfDCcWVSBDovRS4HCfBckkpjLQsDuayl2Ds2ukUuXXdu7Ph83BaFQOxLlHJBBoglCmZcbEEA5ALViECgHfqCIYqAb4JLW8vD+QABIa8JJLF+jwS5rJ/M0WIgAASAwOAIgFwGhxgPAAJAAAisHwIgl/WTOVoMBIAAEBgcAZDL4BBn/IBq2SlC8BnLKMOqmfM4Z1aM/VBhSY4XdX1v8fkfiu8hf877Yt6pCnkYrhkdAZDL6JB3eKD5NrojnUhU6dmQi+Wt9ajGzPXibm3XMyWMt3SYXIG225DLH262yYX/xsnnvcV12p/nPmwNMFedLusNcsldfuab9q36djNOeTV7CW3oimj/to/2rpH1rf6CPAoCOVNAwIlEJRHuyfxhkXDb/F2gxcnFcl+JZkCmga6w477BEQC5DA5xzwc4yEXNsssz2ZbHJltV2fNF+GJV7DxYn2tSvqgjXz0sVr69b03H70q572qqZWuAPm3ojGwm2wb42m7fMsFwAAo5u7Y3SLX1QR8SI8klQIDYGiAApEwvAblkKhi1WrURIrentY98BYEo97RT4lP3VqlmyHT87qzILiit6fjFTX3aQDzVmdQyo20DXG135oZzk8swWx/08yK6kouWL09tNvadyd5ygVyyF1FTQZpk3IbZPVlvIxdbUsvu5GJLx1+2rk8bYgWY27YBdNvdWya4yWWYrQ9CMi3bZdGZXBAai1XwbK4HuWQjitCKmClX+hjmWHIpouDcGyJCcKG1Lwoo7w9clOD2eCxP9aTjD2rDGNsGOIi1D7nUqCRtA8glWMdxoUAA5DI3RSDmYGyxcL9hjiSXVMtDiYnh7m2IFGBMG1JuG+AI45Btd4bFCrmt5NIrT363ZG3IMyyG9EOR+j/i5SCXEcHu9Chi8rkV6tJG6saEvrn8UxktNx5I6Y2U5brT8ZtLYDeKyX/yEVpjPen4RWRMXXgQ0oZOaIqb7G0YbtsAGaoiw5SWttdenrFQo2pE7UHqBna4NnSZ0OerxfgyZPVoLUl2iNI6oY+tAbp3gJHuBLmMBPQiHrOElPtLaMNUyuRM4z9EpVzeErYGGALxlGWCXFKiufSylpByfwltmFDPrJ7EAHWyvUSJrQEGAHuAIkEuA4C63CKXkHJ/CW2YVsP8c3kJ6oetARKAOG0RIJdp8cfTgQAQAAKLRADkskixolFAAAgAgWkRALlMiz+eDgSAABBYJAIgl0WKFY0SCGST9Tm9POy54dI/a6gSvW1YsPxCMR1lfivm3a/QihfXgVwiwJrm0irXV5+34qepeMRTu2YG9ty3eONka39XPCNEluxSR12Tyy8nXPx1iV+Z5y/TJrYhtjcAuSTrJEMVpK/1FwpHJrAc6vljlNu1U3S9b4w2jfGMhZNLcghz0peQgVHIC8oqSH3a1y8DAyUqkEtyBU5doCF080U2I49W8wa4O3W+Kx2/M9W7JXW+GoaSb/6H1MWXdt58m16WGXOfO6OBzEzAW+DZbsAh2vR4ujMllFVpGxMfLqm1M6Q8XYamwaQNojNk1kHnu+Pi0QlrXbh41KwTzbYIIXWxZkPoWKZTPyshxntKvMuUuQKpzBMgl5DeMek1Orno7quZTFC91kidb+Sqsqfjd5VZpk6hMy1H1KX1ImPgiKv1hrjvPuK8M2eXa7sBtxIMjif5dnxCz8WT7LNrF/CHW1wyDMh9p2VN9snPpy9UKx39yLMtQtdtJlybpHUt066fSpu7ZGAAuXTtGjncZ8y5qCEx0iDIvFymsdc7lnvPDzXzsb4BmTV1fkxdYkiilVtNHfn6jIVlZG+wY4NFiLdA60RyPD053myei/v3sfU5JNQSSS5D6ZkVGns/8mWu7rrNRCu/n2b/i7B4K6u4vMCOZdjCgBB5hesQPJdwrCa6UhF41bHqRIXc8FrnXzqSi7NMBQIzdX5MXYLJxRMSdOwD4wwbjUkuXfEcm1wG8VxCjFUkuQyiZ66u3Z1c6lIjt5lwkUvXMkEugeZ7f38/8MolXEZM6NeZiEuvJihMZYSi3OEtW5kGnhpJRNSFcL9D0s6XcXg9Zu/O1NslLGbbKM0fFrPLoSue0guVKWvC5it4TbtkME7fW6p6O3esiyQXQbqBOh+qZ7LhZIjHIBe1H3nCYhqeUXUJIeWi9Igyg8ilR1iM2voAnkv6HpW4RFPRys5VC9MccdaejBFO22jS2EvjY+3z1jKlkWvCZvqeX/oEZuNVBYSbtGfqKfflAoHN1apou2Fgyfva9dQmHbVQm4pLQD0t0nV23o54qhO/ets97eN1tOCZWDkDijPrKuXnaoOnfU6d9wwOHLjQ2yK4+5F9WwRPX/HIiB4cdC8zhFw6TehLPAljAnIJ6B7zvMR05+fZCtQaCEyLwET9qIsX0QuoQG+p9YyS8OC59AJ/bjdP1CnmBhPqCwScCEzXjzp5Eh2l6V/V1y7Yt/UBPJeOwsj/tuk6Rf7YoIZAIBSBaftRSDgrtCXW6wba3gDk0lsyKAAIAAEgAARMBEAu0AkgAASAABBIjgDIJTmkKBAIAAEgAARALtABIGAiUC2vdL6eEYGaM09WYDmjxN4ddUnRhsCmzvayloy4Htlecnadmy0CesVBLnMQpLmuP4nV86VOyQmYF4vljjdaXhYdoJ6dyMWHp++8vR1jrhpyo5kwl1kvsdH1oBNC0stk4x7vl51NRq5VWF1WaMXVe9qrQS7T4u9/uvkWsP+OwCv8HSawoBEuO1e8PHmqeDc75z8fnr7zlraN/r6DC+O8yaWpeeoVXh7ZOWXken+k67slOfeDpm4gl9zl5CCX9t4uxgtNhscjX3Typvw27lPT3Jdvihdv6Bfu/kqkYwlMbVLgvLt1Y3F9dWw+XGQGK//2Vneyja1ztSSa75xUlHvk/8q1tPhK47Lie99Um6ypL3m50o/bwz/2Mr14lq0UL5vpTqe7nvwuWxoXVxu6bZkQkp3Akgi03shOZm7Qs0FYu1grKak980ToVgvlsyzkYtHrdtr4JgtGiGx9qXZcnqf1nCPbcO4mS9YP5DIDSdUK3orfuhM7dkvPbXbM5hllPXh6Db3zUW/n6rCWYa2GQMrvm6sXS1NQkI78n/puko9fZFXKjsYisU0l/Y0//biNCArjKcuM3jagS5n2ka29DXb5SbIKykVHjsZTei5G27SElO420EStagVFLp4yFXm2ycLluQR4Hy7PxnYO5LLHeBLJmMNvGPxXrFfiygYPimTUjsDPq4a+U8pvc35HjErLkWgzytIJx0suu6cKT6fxVHQC4URzpyi//GvPr5jk49cQ05DoxsE/OW73MurQXMso+MJeXcq0h3fmn+LfQS4OHSxl78OawM1bZqXfZDp7H7n4doxcz9AYPBe/pcrsinJUXo8+61UnjjhzTMpvR0rzruTS9jwUAtl7uPAqlPkUTkTa/IpJPiHiWGNymUuKf+GxqvsGKaE0bxs6kIu3zJJcNjcL77y9dSkR0pR6GDK/A3Jp9VrpkWxvb2veCf9+/J49ccR4Lak8jlTlhJip7K4h5mB2t4qOuSr2dnGtIiPcbzpWbJCXAkAQuRDuvCAXxXMRcy/yu+rVCKLhcyzq5D2fd1E9G0MisWnSK6PmXnDXxcvwpbnvUqY7LDabFP+UjJxLce06WJv0gpjsHrMtLOaYH6zJh07EaJ9XGTYs5o0KZGegmgrBc8lYOKJqxKRny6iQBrZ7em5zQlimzg8hFzpteTXnQk7Iq5P2BalwgiFCaPVCAGMyv0uadHtYrI1Zs2AhYMI7Ov2/v0znhL5t+VxmKf5pGZmei7FXj7UNVYd1bikQNqFfbwkh+o/iOVVla4bd8bxBJvQdqexzN1myfiCXuUjKVc8Al38JzQxvQ0ioIry0Sa/MailyQiRaCyJ8nl/CZ6cuapClyPZU9qmrP1R5IJehkB2tXH8IYbSqZPOgBZFLgWk+L1EmFHCLXOatxylfovSlsk8ohUGLArkMCu+whcsJ0TnHZYdBaFnkUkZHw98nGgbT1KW2Q5Bz1+OWjFyp7AdKc59aSn3KA7n0QQ/3AgEgAASAAIkAyAWKAQSAABAAAskRALkkhxQFAgEgAASAAMilgw6433zvUCBuAQJAAAgsDAGQS2eBBrw81bls3AgEgAAQmDcCIJce8lveCp4eYOBWIAAEgICCAMilhzqAXHqAh1uBABBYNAIglx7i9aV96FE0bgUCQAAIzBoBkEtP8ZWT+4GbI/V8Fm4HAkAACMwFAZBLD0nBc+kBHm4FAkBg0QiAXHqIF3MuPcDDrUAACCwaAZBLD/GCXHqAh1uBABBYNAIglx7iBbn0AA+3AgEgsGgEQC6dxYuXKDtDhxuBABBYPAIglw4iRvqXDqDhFiAABNYKAZDLWokbjQUCQAAIjIMAyGUcnPEUIAAEgMBaIQByWStxo7FAAAgAgXEQyJJcLrzyKjv31HPslrtPs2Nfvkt88u/8d/63v78/DjqOpzxx7DC75JJLxHH42BOT1wcVAAJAAAjkhEB25PJyQSD3nDrDTj7wGDv7zPPs+VdfF58nH3hU/M7PT00uglgOH2MlpTzBjh2+hB09UfynEI4knjTk0zwjJ+VBXYAAEAACNgSyI5fHzz3L7rrvEXb+5deq43V2rvqf//7ok09PTC4n2NFLjrKCS5q/J46xw5xd6j/iml46CHLpBR9uBgJAYHQEsiOXL9xyLzt19ln28PPfZY88/2rx2RzfPLvP+PkpPRfunYgw2ImjdVjs6ImCTGpPhsvQQi6chKpQGvdoND4yzslQG+0NHWaIxI3eV/BAIAAEIhDIjlyuuf42dsfZF9mHr95pHfx3fn5KcjlxlBt2Th78k3sU1XcvuZiEI8sopXXiqEE2mhDhuUToNC4FAkAgAwSyI5fP33yS3X3mPLv//Evsvuq4/6nyf/47Pz8duXAjX4TEuJchyEQSRoDnYngm5ZxM44HUHormzkgNAblk0FdQBSAABCIQyI5cznzrafaVkw+yh555qTheZg+Kz/K4+eRDjJ+fjlwqEuEhsXIGvyEZn+fC79GusUhJhtv0mFm9aCBCtrgUCAABIDAZAtmRy3deusBuOfEAu/XeB9l9jz3FHt1/kd33+Hl2270Pid/5+WzIRRKGJJtajNScC//NFfpSdEB4OfqiAR42w5LnyfoJHgwEgEAkAtmRC6//Cy+9wh578hl2w1e/wT77pdvF5+PFd/47/5uOXKqwmAiHFWGtIkR2tFiGrIa3SvzDJvTN5czq8uVWdEwLq2FCP1LPcTkQAAIjI5AlufgwmI5cfBPvvprjPBAAAkBgPRAAucTK2Zw7Kb6Tc/Cx5eJ6IAAEgMCCEAC5dBCm/u6J8UJlh/JwCxAAAkBgaQiAXJYmUbQHCAABIJABAiCXDISAKgABIAAEloYAyGVpEkV7gAAQAAIZIAByGUsIe9exqzYuZletzhJPPMtu2ryYHSrO84O8ZvdK+7mx2iCfE1KX6pqd3bErN87zdrc22Jbatr0V29xcsb1Uj3fqS6qHoJxgBLh8NwyZB99sv5Dr0UZR7oamTAkKzqAIkMtYQggxFq5rQgz6WG0JqUsUueyx1WbqjusoszIUolNvbLKVwgh1ZyfOSXj3VpukMRD3RhuJamCxdacuvRB9GUvezufssi2BlXpssZp3Nax1GetY8/uV+0Zvm0cHhyAXUeaUbR4WZJDLsPg2pYcYi5Brxqpv3+dkSy6lMaw5wNHBBYmY3ojTIPCydbLywzh3cqnd2aLtpqGksG7waXl/frAGvGKIAY6nurtbbf0asIVjFw1yiUW8IoCdrTJMJQ456jTJQTWw8lxxHw+PaffVQ2IqdOYLmennD21cym5yxmbk9Vey03Xbq982r2Pn+W9VvdthOk9djPv4/b6wmDDgrZGvYqAdI19mnNusXBBnmUaHltdSDgfloXCDKJ9DqY7Nq6GuPb3VhEJrXZLyk3q2KnVC15dSDjx8en51aaWHijxJ+d3JdoiQq7jfIvdar4P6CCcSnVx8+FnJhctIC0GVJKXirns9IZ5SWb+Vom9B+sK7gwxdUWExq37an1fDCXLZZ9vb2yLlijz49+P37IlD/T3k/yA99Vw05Rv6rOr0hzaqzkwRiJxXIc6R9znJpTpJejUUUQQgbHoV0pDxWIaLIF31DLnPWjXbqNE0WLpn4B750mWqBk8YjcIzWWmEoYR5WnMoAZ5JdKjD7blIfSlJRA4cKnIpBio7XNdU7K1yaAhJFYMoVwyOSvKJIxS1pDa5UETcwl8dWKh4C4IpScMsxx5+dOlLJVc5ihByUr1Mn+dCnDfL0L4bz1Pao5FLdBg1oH9ncgk8l1hBtIy8MiIM8VzqCX1iJOkKi1HnOofRdIOmjl5LI6Z6NWH11I1f4/34PJcSfkvHNkaF5hxJ7aGQHdRNLqqBsnojLYPQNqBt9QkgIO2mwLCYNiCwDypc8hOeEicSZTBR/8Z0rzRMbv3JxWVbafk68HXqiyk7Uz/iycXmmZVtMp6nDToM4om1QTO5HuQSKyjToAeNGgmPIJYsYq/3tKsxQvqINityCQ0bVGEUfTLdYiyqa5sQi8uomIYsM3IxFwEUMnfJTw4iThcDCB7WvWp1Zx1ea9Sl8mBEKE4dZPg6SsKwmHTWixDW5qa5eMJBLk59yYlcqiGVZWGID+m5nAe5xErKMPLaiF0714wExSjQdZ+sQ6znUo82Y4yAfFhpRHZETL8dr5fLoVseiXA0iLkhcmTtn3ORtaG9B2NC2CUrIhxlL1MJh1DhiqZSxoRrgFfSNSwm5z1sukDhS5CLnC8j5cfL2CxCacVxmstQ/E/LqJwP8s3fuT2Xck7MnD8LnNCviaIkf3MwQK/Kc+mLQS6E3N3zaV3CYuZckLHgIXTwFGujMrke5BIriHrOpZmMVUMI6iRtabirzuu6jzjXTIarI0nqmeb5cINQ19UwUs0kcfm8pn3uuljbHoKxbXmwGeqo4/JlZ1cXA7RCLEFlqnF3Y1kt8d5Kygn9GhZtAr6Sn3MOyxJKqwq0yk/qmZC3HPxIfWnLNiw05lmKLL1K77JvZSmyuKe9qKNFMPV8jX1Cv1ntZ9aTWNVH6ktbz7TFBtb2ucJilaBALpjQ12xj53mOEAuLa7JHIPlS5OxbvJAKhoQ0R24qyAXkAnIZudNl/ri0L1Fm3tjFVC9DcokOoc5LGAiLxcoLnkssYou8vrUMmo9CF7ysdP5CzJBc+PSlfO9mgboDcpl/r0ELgAAQAALZIQByyU4kqBAQAAJAYP4IgFzmL0O0AAgAASCQHQIgl+xEElchZ94jXtQQ2Vzjqrj2V0NG46kAsB4Pa/VJ5hzkmRVjIJdpZBH9VHcqeH96+XTzha48YOp7J7HZgaMhmdkNOchoZpA5qov+kI8sydWTxYvjIJd8ZGSpSfUSl5MdfHmRUjbSRS4NoZDp6lNWY3Zl5SCj2YFGVBj9ISsp2pZTg1yyEhNdmaC18LThSp0q3J0e30iNYta7Q+p8AYgnpbm+KVXzprZw01fl7oHlW/x66o34lO1+XbGWWTaE3BBtXBn52xB9hUyCSW1BIZqtbBlQp/wPSP9vqwj6g6LT6uZr7owAQ/UHV8YKeC7RvWncG8I8ANeomDoXkZq8lYMpzHPR06K7nlemVKcTG7tyU/k7k7rRl/qMbinb3XK3lynvy0FGjjaQGYUDdgc1tqDQc9EZJFLnR/Ol/7fXE/3Blqttiv7gzrUHchmXK6KfNkhniklN3hopBs65qHm5OqbO757S3EFYIhW6ZT7IU0+78AISWtq2FbB5NYPIKFr9/De4cqARm8fxXHU8qaY7/f/I5DII1o48dYvpD+4XU0Eu/u4z7RWurL11zSJHxTGpyaPIpTLaVeepEw2G5lAyUuePTi6h9WxpxADkMoiMhvNcZBZmmZVZJL10bHUdlv6fqC/6gwZK45H7PRd62rbrFga8GiCXacmh99P7TmDawmK2kIc/m2tIKvtyfkbOc3RMne/d6U96IDJzrTHnUk/IqEJw4RlRT02uc5FRb2VsFxCwQR65u2VE+n/9oXPBWjfay+wPCIsN0KPGLtKWLtyVDtyTKtyayt5PLvokuzTwpqKVda69l66p8x0p29UFBpvF5L26h3vIFshNuv6QlO0+mZt4yzJzkpGvDR3O+7a3bm0noW8pUBKPmf7fVw/0B3NXVo7YFP0BE/o+XcV5IAAEgAAQiEfAsXoPcy7xcOIOIAAEgAAQqBCwbUEBcoGKAAEgAASAQC8EqDA0yKUXpLgZCAABIAAEKARALtALIAAEgAAQSI4AyCU5pCgQCAABIAAEQC7QgeUisODtBryp5WcgVW8bFiw/VTyt+QrebjXDxQxkibDYLIVkW9M/y8ZYKt01Y7DnvsUbJ1v7u+I5hU4teSsCvxxsK638ueqmkFXcM+G5xOE1wdXEm74LGNXoQPo7IQ181/smEOMgj1w4uSTHbGx9CRn86Nm6myaHpBRKDlDSAkEuSeEcorCuqezLN+1XIg1LmXa+flu+qKYzBfdA6fGpurjT+Jf1bN6kb1LWxNzXyqnkSeNvw8wl3fR4BmRKIJJh+nAZQkN9Zc5+KwItS4TRlyy6FCIH19vtHFObV+PEu6prus0BfdK1nwe5dMdupDt1cglPZV+F06SWGXm6RDmKB2RNgGdkEbanVRkijb8BcXASTXkfMXL05isrcJGYBSVJLJ81OJ7km9AJPZeuKfc9vcAf3olMutpKlqj2D0Png7eLcA4b9CzaWkJRl84LeiD38Kk0xp6du1ZfvuWEzbOx1Bnk0s8u7+/v9ytgVnd3Td1tKr6u6O49VHRvYUNJUV+PyMyh0SBpy4XV1jwXfdMvX5ijfb5PpmWv50IlyuyYXr2VcXZochmkT4SEdiLJZSg9s7bfaINKLt4tGnzk4iOOEPwGEVySQuG5JIFxyEIUBYtKZd+RXELTzhvp8QUJWOeCfCEe1x4x5uZIaoecAbl0xdMcoQ9NLoN4LiHGMZJcBtEzd//Vw3qKPnplC3KxIss9BH5sb2+LT/X78Xv2GD/U30P+T2GG189zMfamD0plbxh0I0TgDm8F7EAovH7VbXelq/eRSxlWUueEhJ5QoTxiu+LWfbWSdQmLmRmSfaPLJixm3y+jK572LQXKp9qNly+en6If+suYS3r8qiVUSMm5LNi/RYNdDgHE60gKaXe0Sk/f3if8Ukt1BTyXVEgOVk7XVPbuJczOlPRd0+MnT+OvT+ibafUbApJhPNMY04sB9FCbuiulnwRtYh4CT3sKdc92CjUxm7gMpqSOguezFYHE2xwkmItKtNCsVecrSLTz+g6ovgFApwl9+bwMZvRBLlP0t1GeaYbFRnkoHgIEloUAsajDRwrBADg9kwDPhnxQSebwXIKloF+4XmGxjiB5tiDtWiruAwJrhUCLXPyhsBh8Ur5EKT2vHIiFYwDPJUYTZnUtPJdZiQuVzRSBdggytfFuhVQ5oWUQ1uorEJBLXwRxPxAAAkAACLQQALlAKYAAEAACQCA5AiCX5JCiQCAABIAAEAC5QAeAgIlA4mzK3tTyARJwLnUOuL/vJSna0LcOud8flTp/IWn1XTIBueSusbx+5lr6JJN9vrfbcwLmxWJ55Y0sSbNDmtWJXHx4+s7bK9bpfYeQdkZfkzCXWfSz1RvoetDJIlMsy/XLrsuqL3/etV4gTX4zyGVyEXgqYCZaTFZff4dJ9qjeBZ0rkvydKhZX5/znw9N33tK2Lm9pDwZT3uTSNDv1SsmhUud3fZdlMAEnLXh0cglJERNyzYULF1if44UXXuh1f59n495+sgN+wA86kL8OzJZcHnnkEWYejz76KIs5qDLwWxtXYAJMoAPQgVgdmC25nD17lpnHt771LRZzUGXgtzauwASYQAegA7E6MFtyOX/+PIs5nnrqKWYe586dYziAAXQAOgAdSK8DsyWXp59+mpnHM888w+TBiYQrDP9Uf1f/p8rAb21cgQkwgQ5AB2J1YJHkIonliiuuEAQDckHHiO0YuB46Ax3opwOLIxdJLO9+97vFJmcgl34Kgg4G/KAD0IEuOrAocpHE8q53vYtdfvnl7C/+4i9ALkT4sIui4B4YGOgAdCBGBxZFLtxLed/73scOHTrE/uiP/ojdcMMNIBeQS2tuLqaD4FoYVOhANx1YFLlIz+UjH/kI+/SnP81uvPFGkAvIBeQCHYAOTKADiyIXPnEvCeZP//RP2S233AJymUCpMNLrNtIDbsBtSTqwOHJRCeb48eMgF5ALRq3QAejABDqwSHJRCQbvuWA0uKTRINoCfZ6LDiyWXGzvtuAlSnTOuXRO1BO6OmcdmC25PPvsswwHMIAOQAegA3nqwGzJ5bnnnmN9j5DU/rhmnwEDYAAdgA7E6sBsySVForlvf/vbDAcwgA5AB6AD6XWgN7kcv2eP4QAG0AHoAHQAOqDqAMgF5IjBAXQAOgAdSK4DncmFJ4XEAQygA9AB6AB0gNKBTuQSO7GD6zEZCB2ADkAH1ksHQC776yVwdHDIGzoAHRhDB0AuIBcsNYYOQAegA8l1IBm5nDp1CnMwmIeCDkAHoAPQAaEDvclFJZUxXK2lPENOgC2lPbm1A/jaQz/ABmGxIfur1K9e5CKJZciKLrFsDv4S25VLm4Cvm1hykRPqsTySU/teZ3IBsXRTDBi+briFGiLgC2IJ1RVcl7Yvmn2vE7lQxLL9sYNse/UzTHx+7O1FzO097Nrty9i1136MXfu5a4vji+zaL97IPnfj14vj/rUcucPwpVVm0zgA3zBiOXz4MHvrWy9q9UH+u+8cDPKwOjxXfKm+l45cCmL5+v4Fxv+evHChdfDfb7jlVP375258eO0IBsZv2I4JfMPJ5Ti7SCMYTir8N34cOkSf49fM1fih3uP3vU7kQnXij60O1uTyyMkT7NTlH2R3vfmN4pN/L8nlm4Jcvl2RzzoRjM3w/edfvpz9/K99mB18x2+zX/j1K9h/+Y0Ve/t7Psp++f1Xs187/HH2rg/9IfvNI9vsfb99DTt0xafYBz9yLTo4sWzURyyXvu1XNdz+2386pH1/9y/8ymJxNbGRRCJJhH/n/9fkcrwhGJV0QC7DGui5EqCt7yUjl9VlJbl8ryCRU5d/iJ395f/KvnPo/eKTf3+9OHPDV77Jvv3KBXbulVcEyUxHLl9jRw5ssIM74ymLTQCr7c+xW7/+V+wrd/8/duMdp4vw4Y3sSzd/nV3/5bvZdTfczv78C7eyT19/C/vU529mnyzOffD3FkIuXzvCDmwcYEe+lkYGPnL5pZ99tyCP2z57Cfujd3+/OK75je9nd33+beL3X/35X187cvmEQiL8f0ku4vfqHP+Uv4Nc0uhqehLZYQc3DrKdid7VGYFc3i7I5bWCXbjH8uxFb2bPXfRT4vOuf3VR8XtJLucLYnmqIpdrraGx0vhvWI0PB7M4f+AI+1onQPMhF+65/K/f+ST7wBV/wj505afY//7op9lvXb3Dfvvjf86u+IPr2Ec+8Xl21R8fYx/75BfYH1z7pYJc/sxiBCVmHLfyGJM8ozvMyOTy1p9+v8Dtk7/5t9lr3/6z+viz9/5N8fsv/seSfNxHpXdzwFdpi81z4SQiCcYkl5pggsilrXsboxq7OcllCKwWTi6XHS7J5dXXX2f3v/lN7LG3/Azbf+uW+OTfv8vJpZhzefqVV9kzr75aTO67JvVLARw4cIAdOPK1Vof/2pEDpQFdALl8+Pc/K0KG8u/2kw9q380v/HraAHLMFE8gsfH2G16fYR6W0H2ey7//t+V8weqtf4N9/Y//Vn189Be+T/z+lp96bxCxNITN2zPdaDFGHhS5XHT8E4JYXOTCJ/2po/1sQrY7ByMGOH10oySW+cilT1ttfWzh5HK4IpcLBbk8ce9Jdv9vfYjd9VNvZPcVn/z7K8Xv3HPZL4jlueLYDiCXg0d46MTswJURPVIo70LI5ZZ7HmC3FsctJ6pD/f/EX9W/31qcDyaXwmDuHCwImiDnGMOU7tohOlXT2Xzk8hMXfUCQx8nr3sYu/+m/xi5/y18vju9jX/zkvxO/v/GN/8NNLpysO+ubj3iHPU+Ry1s/cYhddOgTjH/y+RZJNJx0+O/iXEEu/O/MmePiOF6co1aZ7e9bZCsGOCEE3EM3ZieXHm21etaLJ5d3sO2d4+yP//ymYm7gK+zaz98qjs996W52/f89wb5400n2l8WE/pdvPc1uvP1+9rHPfd3RmRsBtAwkHxHxTi4/JeBCkamQkCxLDaUZApb3Htyp6qS72Y2BpsraZ7UnJZ5Pdyab8TtShMDUv5uKeRfX35GrXWExfQ6jwY6u9/6+3k697sY9ZCgoFKfCA1VkI+TXMjy2svrhe/XN17Of+J1fYj9x5a+wf/GRd7Kr7/mqkPGP/rOPavq3+U//Z6TnYhJCKBYH2UHulSukL/SnJq7QcsqQcBfdk5P0kkTExD4nG04sFblwsuFEwgmFH2cuKudeosjFJB2yjxo6KHGw9mcad3sI2KHjpg5q38P6TCNHu/7qAzQ7uZSybOwH778bwib5+qJJLhH9uqPeqW0afM7lPe95hwiLvfDd77IXXvsu+05xPPvkafH/C6+9Jr7zsBj/XF3rIhauPIoAhHstATd+r4Epfj+ozL8Q99CGs3iWuFY1ylww6ndVGWS8VCGQwNGZTQCHV58qSPfeApt7tU/+G3Xw6+PDYkS9K2LRPBsfbtr5SJxIQyNxdJTVE99/WRDLq88fYRf2j7DvvnAZ+9cff4fA74d/7HfF5xduOsHe9M7PsJ985w570699ml3/l7faSaYK9bQHEJFYaAMjVb8iy+mIjSQX6b1c9NbSi1HJRXouncNiYtBn9B1PH9VCW9ZrCS/PKRfDe1d1OIBcdFmXRrsdDXDJzawvMedSD2qVaAOhI1pdWn1R7UuONlcyabcrwuYZHtTg5PKO97xHkMvLr70uDk4sdxz5x+Lz5YJc+G88LMbDZpdt3+4ZJbYNuhCoCrjpuVhHcdRIofrtoEpclRLUitp4QXx+p1Qoqiw5SnCvfLIJ4D2Xb2uOCicZ1x+/3k4uap1tyqK0sxXmaeOujwhN0tcxcuNEeYtVh3Bi3g/fH3/vz7PfveGN9fHPP/hWgd8PvqEklzf/+mfYPeefqY+fLAjGFwqsvQVpFDrpTCUf1cB1Kse18KWUtXUpMvdOuMdSkIuc0HeFxbhexnsuer+gPS16NB/ilamyIuXi0vEActH0n7A54vlOudHk4ve0PP1Xs0WK50LW0dOvo/VOb9Pg5PL2d5Tkwif0L7x6QRALe/Dj4pP/9ur3CnIpPJdXis/Ltm+MIJdKeIWSHFHnEFQQKxe6HlGQ7q0KSDV64AsGzBVpNgVqjcRsIxKaZGwCeOcHf599rlhy/Lm/vEN8cnIR3y0Hvz7Ic9FGF0TntSqhrL+DlPkS7micPOTinc+QI744fC/f+RP2I7/4ZvaGrTezHy2O93+5DIf9/R/+PfF50c9ezX7j+hvq46Kf/ZiXXEr8lYnkaCyaESo3iLXediinrEscNvV7LsqSY2q1mBoWk+GxKHLp2ked/dk3P+WTC8eKIHaOo89uuMjFq7+y3vawmKpXejTF0xeFLioDNZJQHf26s97Rgxdpn5K95/L2dxyuliJ/rySWr7ypPvh3sRS5IBe+auzwxyLJpZ4bUMJRDi9Gj116BFMpcjOSMFefcENAhOWUuZ4j9fsydsWxkct/f9/VmqOye2P5wqntj1+fhFxsYTE11MiXgysuu45rJE7esJi+dLrGvJBPH3wlVn/3Bz+h4fb3/lFJIp/50jfY5sVXsB9/y4r9k59esUt/63oaX64nChYlucgOG4tFZciK1WYH1RV+KmFV+jWE7sWQS+ewmBluNgyYs486rzXIJUAurdCvNq/TDFb8dsOU8w47IiIaLvnHeS5ynlSfh6sGD86+6AmLGf1a95w66K9jqXtycjn49pJcCu4oyeXr76oP/p3/fsNXTolP/ucmmLaRFmCrnZuMSZZhmgMFGTSrVHys34xC6zikd3GArjBi4k1OWGsGqLnO9YY+f9cl5khDLmq7Zf3VxQhq6JA6L0d6rkUUOk7aEnIyJEG/o9MHX4nVD/xDPZz4Az90VCORv/MP9O8UxnqYxniPKFJnam/D1JfIcrpgIwlDvChZvSzJPReZV4yflxP66moxX1is7gPkawL6XIPeR5WFCcIIuq81ZeOUi3PRir4gwm83TJ03515D3jEj5lyqQYqQJTm48/XFLhP6BEk7F0TZPcbBw2I/8/bL6vQvD/2ffyMIRh78O//j6V/UP78H43OB53Pet1TWF+cf/7zPfc8L+/nhOx5+FDZ33/15MX9Sv4lfrBjjv3E9k+fCw2LjtWX8fpBD2/Lui6OQCyeYmOOy1UJSmXjf7G5PqubfSfJWaBM/kEv8yFIlEUksElf1nBkay193cyCElHXIuy8OTi5QOLcyzc/45a3QIJdw4zU/3Qtv23rYnbz7IsglwLsYUlHRwYc1GMA33nMZUt9R9rD6nhO+IBeQS+AS23l2CpALyCUng7tOdQG5gFxALhPrwFQGB8Q7zwHTVPoS+9zk5MILxAEMoAPQAegAdIDSgWQvUcayHa7HaAo6AB2ADixXB0AuaxoqQadebqeGbCHbHHQA5AJyWfRcTA6dDHWAsV9HHQC5gFxALtAB6AB0ILkOgFygVMmVah1HaWgzvBPogK4DyyOXHPaOd6awnkMnVBLh5YDnkgcAa4WvmWBxDn0hoI4+GVo3hwsoe7a6/zUGchlCeD3JRct0q24PbMm43H3EZGyHqm3zXGV89XWcIfBLUqbaNmIPmGqDJPumTWXHr2Vhzcht7kJYGYzQvd0d+NbPtu4VQmXYNbfZttTPyDxcZjQO2e++j0FMRS62NlV169n/7P3JIWtzXyhVh2PJxaObZhZomY26vUMmx8PTD4y+1rI9pu616mbXr5HIJe/cOG1l6lnfZMqdqjNaNgsrDIq5016poKmeKw2RC8+eWJObuJVlaptwGVtlb4i9VIz2E6TGO1uLgDT59iSXTpu6heDakIC2IVn9vECdSEL0si7p9Ipu09DkUqbop424g3SDyaUaLATqZm23rNtdu/oBXV+5n4zNJlL9xqZfIBey8/Q0eNmTS3tzIF2Z0hmBstyRyaXV2UL29LF3trmTi9hh0bmltdJ2q6Hq47GkJxe6TcOTi/O5NiIOJpe4QYPss629rpSNDJt9rXz9sPHU3eRJ9CWLfg1DLtrujkbopVZy/femQbLy1XlxfTU63Ck6SRUmEh1e2fuZ3uK4uu/IwXozLw04cmOm2Pqarme1YZDamTuHlmxG3oadvvlRGeYg2uMlP3PORQ2X2J5tw9qGJ4GbVzci2meEENsjsrABRBrPxaGHtTG34NR1C1pN52LI1byWkrcxIi6Mmb5zoktH7Lqkh+UMO6D2e9+AxcSM7OeeNsRs2tYiZEOW2uZpBr7yOZq+hulmSS6OECHHwdsP9EGDHhajwqShupR0zkWJ/3pHSSYgaoVlOYQSynIlqUjgVOFqgq6ErF2n7CV9kBOXMtoxQif61sdq3F6tb9sL0HeU00cjcbFtilwc2Hnc47o9ncnFJTcP1tYQFGXMLFgHto8ayU1PLsqW0arh19pkCVXFzLmQul4NxIIMmKnbFllYR+M+HfFsx2uGL9V5INHvja3OqXlIs262fm5tQ4GB1TYQWBI2R/V2qR0mm8ExMR/o9PQND9LRl8P6gd0j1QcMHq+qRWSpyEXzVKjKGp1G8TjUrVFLr4JiRlNhHd9bgjY7hy5MfXJMKm5EfSnh+oy3Fy9HGMGJnRwxmQpLtMdqsORoSJ3Qr/73PtuGdURYzPsM7hkGtM87YgsbHSb1XL6mdtCqDQnIxbcooRnhEttY8whAa96nqptXFkQbvPcouuQchIaMkC2ePdH/6H6u2BFi4ELfY/QPjp16r9ceVO0qtmK3L6AI0013uJkaUJQLVMLnjCivyFY3UxapyEVxU+mReYxxG4lcKgNPh9Mi6utVpsSei4+4NFkoXprmOThc6drVtpCLlZSoEavt+apBi8DamIxuSMZXRoihCp9z0UeEls7mnPTn94xNLqZhCai3R9ekodImdJ33KAaIvE7BhRxktutMGUtNPs5+3mCitcFzj1xFSNoOrz2oIjOF/A9YV5gFkotvfqxVl8By634WQy5t/RphzoWaSKJCSRavgYwrJvBcDODLUYqtDq76muek8ight6RzLo66FM85Uo9E26FGdYRbttfwAApMWqvFvC6/GuYI9Fyc8wEp2ucjm7DJTWlEdM+gLFsd/em608wlNdc4iHcoz4XSOf5bPTiwhOA0nXDpfTViFyubVLn7+oonLGbUT50zaOMs66D0tYqUtJWCyoCoVYbAxGiD0zZUgxAVS2cfMe2Bgrs1gkHIhpAn6YW4+pZ3YFrITvH4XeF90ls29GsYciFWTdQuphS0nMgKmqgbIixWCb16/oHCTVVXVoTXV19YIAw2X0DgDDvZ45xBq7as2CnvZfB2KYrSag+XkRnCsL7nooRTrM92eS7KRDzHxegoMVhrE46u9mn1bIeD1HAs/98WWlLDYuQ7L5Wum+8H6KGHUHIxcJIyiplzkeRADmjanoGGA/Uch67JsIw5aVyGiaqFLRq2ZuhEhnHltUTYToSPqPPtECMtH3c/p9vgu0cOTijv02cPTOKQGPC268+V7Ra6acrTNmAlr3PhR8zhSLw1fXDUTYsoNNGK0cil+4t+oYYY1wHj9DpAzrkkfffDU2fvaDOuzdZlq2O2KehZ4SGcqdpUP9cXngpqb5wcc+3rqixALmsk+FwVMud6ubyVoevtf0O/i0GyTIJn1w/CySX9S7+huJZYHuEh5iSRitDn9r3O9BhLzyZsYYjv2Y1+gVyy61Q+4eH80EYd5eegYzHkMlF967Dy0GlzJmpfT9sIcukJIAzRPBUfcoPcoAPD6gDIBeSClPvQAegAdCC5DoBcoFTJlQojwmFHhMAX+M5BB0AuIBeQC3QAOgAdSK4DIBcoVXKlmsOoCnXE6B86MKwOgFxALiAX6AB0ADqQXAdALlCq5EqFEeGwI0LgC3znoAO9yWV7e5vhAAbQAegAdAA6oOpAb3Jh+AMCQAAIAAEgYCAAcoFKAAEgAASAQHIEQC7JIUWBQAAIAAEgsGxy2VuxIiMbY7tTCrp4+MbWMBXIon09mrZVyIbLJ1pGe4xtdr23R319twp5DCRr+ezdonyJ2WbxvBR/PjnMXc9SYIQyohFISy5SCaXyb6lWvTIISQ29p8xRO4WtLrmRyxByiNY75YYu9eH3bDJWfGh/3PBqBlcpe1VcL/VS/VwV17jO8ZGJeZ9Nh3k5vLz6TyHBKL0PuI/rdipyEfV1yCF5P+oi8z46hnunQCAduQgFJDq82dGiOpkPkpyUdAJy8cFDns8JM49Rs7avA7nUZbnInjpn/GbVc36dqv/yeyzegfeNSS6d9Mx1UywmySuAAkdAYBxyIUeGSkdU3XIzRMLPrarwlhhBVmGHmDI1QquMhXq/OtpUww5yxKqNRgmpOOtSPU8tVy3P9PZCydcaynC0z4eZqy42OYiRfSETG54u2fpGzDmSi22Ez+Wreeqy8l0NaYBXHuu5aLIww3eW57lCZlZ96aGDIxg9PGIcBNKRC6+vNDCk0gd2MjNuzZVbLY9/rw2wr0zqfBXmkIZAGH3Z0YzRZyvM0mU05nue2snN0a9PCWLb5/IUzFG7URerHFztM+pPzkn4ZEhh4PBcqNAXNbggoQ3wXIS+mB66pT6dyTPAo4v1XLj8SPILIUGbntl016cTXWTu6ws4nxsCaclFto4kGYdCtbwFRWk1MjHh8ylpQKfQDN5Q5KK0R32eOfIThtEVWgxpv2EgWwbdgpmvLlY5eJ7nkm1n4zt2WExZPEDJxzkI8emozSSk9FxCBi2u5xHnnPrSUQdzs46oTy8EhiEXUaVq9OL1MgzFpzwXbeSpttfXcWPJpShbCx30NfQSBwu5RHlGthG8uRquY8f21aUTuXhkOxtyMUNIhix6DYBmSi5Ofemog71MGW7ODYHhyIWa+BRx+8Lga/xgLAQQxj3Uc6nIwDonEkkusaEGU5pU++ScRB19UJermgQcqx6R7ZPFW+vpWLbdhVxMHTBluwRy8epMgMdODp5Sei5VWcnDYjZ98ZGLr9/G9gNcnyMC6ciFmgg3O43mSlsm9MXkfQS5kGVWnYlcQupRfHMCOua9BbIunueZ4YWgSdoe7eNaaJODqy5dyIU/S8VTk62rDb6uMnZYzOG5kESteO6uZcwyfNyaE1LDcJb3gLykZmJo4i3b5JKDR0ZWfQkgF5sO+kSP87NBIB25zKbJjopqk/vVdVbjsYQGz7UNrgn0EdtELlAY6fnR5DJSvfAYIFAhAHJRVaFFLn3DVtCzYRDIhFyGaVxYqSCXMJxw1WQIgFw06IkwgO8dl8lEt84PNuRkXfCxQIyGSP+yQJjQpOkRALlMLwPUAAgAASCwOARALosTKRoEBIAAEJgeAZDL9DJADYAAEAACi0NgHuRSTF5uFks6ncv0FyeaiRoksN5svY40UW1GeuxusWJ6q//ODAK7BOWM1Go8BggMiUBCcuEddKPITi6PhAaqE7nsFanORiSkqo51++fKhJ3IpcS6kX0o7h1kVExob6jkF6UbtueBXIY0Mih7PRFITC4NoewVL4htFC8EGu/jj4hyB8PVtXadDHLXhw19X6yhrYilE5nGy4jr1Waxl8tmtYpvb7XFtraa7250QC5Daw/KBwISgcHIhb8FroUIjJG9ZovEaFQf+UrjsVu8xCjPteyXUWZjcApiM8qjRrtUufx5W8Wb5DwMV54PCHM4ycUw1kToRG2j+TzrOReeFlyE0F3nxAWR5CJk58DIUk8x+HDJyNJHBbmsdtlqiw9cCrIo/i9/q4YxnZ5XtVnRw7o8AjN9DzxVVwL1BfYHCKwBAoORizCKdS80DRb/Lr0c9X9u2wpj1fJ46BGnIAJHUks6LOaqC398UW/l+e5nNBpSG8tW3d3kouOka5z9nL8NNlz87YkjF9Hu6mEqYZQ/uevJdz+MDV3yZ/Cyucey4l6L+F+SS9fnVSFdZRuGmjDNgYP2vbyvxhpzLmtgMtHEUAQSk4vifahG1pyPECPW/uRSGzPLJk2k4XLWpSSXThGeCvE2ybjIxSBWTWqOc542uHBxYxbvuajkUlZfIQxPPbuQSy0fxZDX5NL5eXYZtdun6Ig5EAK5hNodXLcGCCQml4owqk5ehxZIb6RBVw/9UAsBPCNcGc7Q4xX0qDigLn3IpWyVOqIdgFw8baiRJXGpzrrOxSh+qy6KrLz1jPdcSPLnz+FC6/w8kEuMyHEtEAhBYBhy4eNXEVOXsXgjfKDWjBORd+I/wAhZ5jK02HnL8Lch6uu5lIN3dTmv6oHIVVUSF9dkuOucA0+zSa7RNHUuenFCWZcGZ1VW/npyvNsysquuk1w0UqfLoJ/nGAC4wmLaOVO2Id0P1wCB5SIwGLnI0bttotWc19Andw3ja0z8lp5FwPJXLUyieERm+KTDHIumEsSCBNX7UeciNovFAvo7FWY71MlxxzlrG1y4hGIWu4zcsQzdgXVDxKHL1y2DDOm51MRuCc+2zquhWQV3k3Q1+erY6PNMcfNVyzUraBkQKHZOcYGwv7/P+LG9vS0+qe+9QSRWG8WOZnvXAQUAASAABIBAUgQyJBd/KCUpAigMCAABIAAEkiMwPbkQ4a2YGHxyRFAgEAACQAAI9EYgA3Lp3QYUAASAABAAApkhAHLJTCCoDhAAAkBgCQiAXJYgRbQBCAABIJAZAiCXzASC6gABIAAEloAAyGUJUkQbgAAQAAKZIQByyUwgqA4QAAJAYAkIgFyWIEW0AQgAASCQGQIgl8wEguoAASAABJaAAMhlCVJEG4AAEAACmSEAcslMIKgOEAACQGAJCIBcliBFtAEIAAEgkBkCIJfMBILqAAEgAASWgADIZQlSRBuAABAAApkhAHLJTCCoDhAAAkBgCQiAXJYgRbQBCAABIJAZAiCXzASC6gABIAAEloAAyGUJUkQbgAAQAAKZIQByyUwgqA4QAAJAYAkIgFyWIEW0AQgAASCQGQIgl8wEguoAASAABJaAAMhlCVJEG4AAEAACmSEAcslMIKgOEAACQGAJCIBcliBFtAEIAAEgkBkCIJfMBILqAAEgAASWgADIZQlSRBuAABAAApkhAHLJTCCoDhAAAkBgCQiAXJYgRbQBCAABIJAZAiCXzASC6gABIAAEloAAyGUJUkQbgAAQAAKZIQByyUwgqA4QAAJAYAkIgFyWIEW0AQgAASCQGQIgl8wEguoAASAABJaAAMhlCVJEG4AAEAACmSEAcslMIKgOEAACQGAJCIBcliBFtAEIAAEgkBkCIJfMBILqAAEgAASWgADIZQlSRBuAABAAApkhAHLJTCCoDhAAAkBgCQiAXJYgRbQBCAABIJAZAiCXzASC6gABIAAEloAAyGUJUkQbgAAQAAKZIQByyUwgqA4QAAJAYAkIgFyWIEW0AQgAASCQGQIgl8wEguoAASAABJaAAMhlCVJEG4AAEAACmSEAcslMIKgOEAACQGAJCIBcliBFtAEIAAEgkBkCIJfMBILqAAEgAASWgADIZQlSRBuAABAAApkhAHLJTCCoDhAAAkBgCQiAXJYgRbQBCAABIJAZAiCXzASC6gABIAAEloAAyGUJUkQbgAAQAAKZIQByyUwgqA4QAAJAYAkIgFyWIEW0AQgAASCQGQIgl8wEguoAASAABJaAAMhlCVJEG4AAEAACmSEAcslMIKgOEAACQGAJCIBcliBFtAEIAAEgkBkCIJfMBILqAAEgAASWgADIZQlSRBuAABAAApkhAHLJTCCoDhAAAkBgCQiAXJYgRbQBCAABIJAZAiCXzASC6gABIAAEloAAyGUJUkQbgAAQAAKZIQByyUwgqA4QAAJAYAkIgFyWIEW0AQgAASCQGQIgl8wEguoAASAABJaAAMhlCVJEG4AAEAACmSEAcslMIKgOEAACQGAJCIBcliBFtAEIAAEgkBkCIJfMBILqAAEgAASWgADIZQlSRBuAABAAApkhAHLJTCCoDhAAAkBgCQiAXJYgRbQBCAABIJAZAiCXzASC6gABIAAEloAAyGUJUkQbgAAQAAKZIQByyUwgqA4QAAJAYAkIgFyWIEW0AQgAASCQGQIgl8wEguoAASAABJaAAMhlCVJEG4AAEAACmSEAcslMIKgOEAACQGAJCIBcliBFtAEIAAEgkBkCIJfMBILqAAEgAASWgADIZQlSRBuAABAAApkhAHLJTCCoDhAAAkBgCQiAXJYgRbQBCAABIJAZAv8fbAuPtE0WwbIAAAAASUVORK5CYII=" alt="" width="347" height="440" />

  备注:项目源码,后期本人会放在github上,https://github.com/rongyux/REST-Demo

  二 RESTful 理论

  2.1 论文理论

  什么是REST?首先在其缩写上理解,REpresentation State Transfer ,即(资源)表现层状态转化。最初是2000年Roy Thomas Fielding在他的博士论文中提出的,需要深入理解拜读下其论文。

  下面要理解这三个单词是什么意思。其它几个概念辅助理解这三个概念叙述。

  1 资源:我们平常上网访问的一张图片、一个文档、一个视频等都是资源。

  2 表现层:,一个图片他可以jpg、png等方式展现;就是一个资源可以多种形式表现出来。

  3 URI: 一个URI定位一个资源

  4 状态转化:客户端通过四个HTTP动词,对服务器端资源进行操作,实现"表现层状态转化"。

  就是HTTP协议里面,四个表示操作方式的动词:GET、POST、PUT、DELETE。它们分别对应四种基本操作:GET用来获取资源,POST用来新建资源(也可以用于更新资源),PUT用来更新资源,DELETE用来删除资源。

  2.2 REST是一种架构风格  

  

  REST是一种框架规范,和HTTP协议一样,规范统一了表达格式。RESTful架构有一些典型的设计误区。

  最常见的一种设计错误,就是URI包含动词。因为"资源"表示一种实体,所以应该是名词,URI不应该有动词,动词应该放在HTTP协议中。

  举例来说,

  1某个URI是/posts/show/1,其中show是动词,这个URI就设计错了,正确的写法应该是/posts/1,然后用GET方法表示show。

  如果某些动作是HTTP动词表示不了的,你就应该把动作做成一种资源。比如网上汇款,从账户1向账户2汇款500元,错误的URI是:

  POST /accounts/1/transfer/500/to/2

  正确的写法是把动词transfer改成名词transaction,资源不能是动词,但是可以是一种服务:

  POST /transaction HTTP/1.1
  Host: 127.0.0.1
  
  from=1&to=2&amount=500.00

  2另一个设计误区,就是在URI中加入版本号

  http://www.example.com/app/1.0/foo

  http://www.example.com/app/1.1/foo

  http://www.example.com/app/2.0/foo

  因为不同的版本,可以理解成同一种资源的不同表现形式,所以应该采用同一个URI。版本号可以在HTTP请求头信息的Accept字段中进行区分:

  Accept: vnd.example-com.foo+json; version=1.0

  Accept: vnd.example-com.foo+json; version=1.1

  Accept: vnd.example-com.foo+json; version=2.0

  3.3 总结

  1REST四个基本原则:
  1).使用HTTP动词:GET POST PUT DELETE;
  2).无状态连接,服务器端不应保存过多上下文状态,即每个请求都是独立的;
  3).为每个资源设置URI;
  4).通过XML JSON进行数据传递;

  2实现上述原则的架构即可称为RESTFul架构。
  1).互联网环境下,任何应用的架构和API可以被快速理解;
  2).分布式环境下,任何请求都可以被发送到任意服务器;
  3).异构环境下,任何资源的访问和使用方式都统一;

  源码上传本人github:

  https://github.com/rongyux/REST_ServerClient_Demo

 理论部分参考:https://github.com/astaxie/build-web-application-with-golang/blob/master/zh/08.3.md

          http://www.ruanyifeng.com/blog/2011/09/restful.html

REST实战:SeverClient项目+RESTful理论的更多相关文章

  1. C实战:项目构建Make,Automake,CMake

    C实战:项目构建Make,Automake,CMake 在本系列文章<C实战:强大的程序调试工具GDB>中我们简要学习了流行的调试工具GDB的使用方法.本文继续"C实战" ...

  2. C实战:项目构建Make,Automake,CMake【转】

    转自:https://blog.csdn.net/dc_726/article/details/48978849 版权声明:本文为博主原创文章,未经博主允许不得转载.欢迎访问 http://blog. ...

  3. spring mvc 实战化项目之三板斧

    laravel实战化项目之三板斧 spring mvc 实战化项目之三板斧 asp.net mvc 实战化项目之三板斧 接上文希望从一张表(tb_role_info 用户角色表)的CRUD展开spri ...

  4. asp.net mvc 实战化项目之三板斧

    laravel实战化项目之三板斧 spring mvc 实战化项目之三板斧 asp.net mvc 实战化项目之三板斧 接上文希望从一张表(tb_role_info 用户角色表)的CRUD展开asp. ...

  5. laravel实战化项目之三板斧

    laravel实战化项目之三板斧 spring mvc 实战化项目之三板斧 asp.net mvc 实战化项目之三板斧 laravel是我工作10多年来见到的真正能称得上让phper从面条一样杂乱的代 ...

  6. Flask框架的学习与实战(二):实战小项目

    昨天写了一篇flask开发环境搭建,今天继续,进行一个实战小项目-blog系统. blog系统很简单,只有一个页面,然而麻雀虽小五脏俱全.这里目的不是为了做项目而做项目,这篇文章本意是通过这次练习传达 ...

  7. Flutter实战视频-移动电商-02.Flutter实战建立项目和编写入口文件

    02.Flutter实战建立项目和编写入口文件 创建项目: flutter create flutter_shop 创建完成之后呢,它会提示我们, 进入flutter_shop的目录,然后执行flut ...

  8. 重磅!阿里P8费心整理Netty实战+指南+项目白皮书PDF,总计1.08G

    前言 Netty是一款用于快速开发高性能的网络应用程序的Java框架.它封装了网络编程的复杂性,使网络编程和Web技术的最新进展能够被比以往更广泛的开发人员接触到. Netty不只是一个接口和类的集合 ...

  9. ElasticSearch实战系列四: ElasticSearch理论知识介绍

    前言 在前几篇关于ElasticSearch的文章中,简单的讲了下有关ElasticSearch的一些使用,这篇文章讲一下有关 ElasticSearch的一些理论知识以及自己的一些见解. 虽然本人是 ...

随机推荐

  1. [LintCode] Divide Two Integers 两数相除

    Divide two integers without using multiplication, division and mod operator. If it is overflow, retu ...

  2. HTML 父元素与子元素之间的margin-top问题

    问题: 父元素的盒子包含一个子元素盒子,给子元素盒子一个垂直外边距margin-top,父元素盒子也会往下走margin-top的值,而子元素和父元素的边距则没有发生变化. 代码如下: <div ...

  3. c#语句 类

    知识点: 1.string类 2.Math类 3.DateTime  获取时间 for穷举 1.羽毛球拍15元,球3元,水2元.现有200元,每种至少买一个,共有多少种可能.

  4. js中获取键盘事件【转】

    <script type="text/javascript" language=JavaScript charset="UTF-8"> 2 docu ...

  5. 导出所选行为excle

    要实现的是将所选行导出.例如勾选这两条

  6. Web前端代码页面布局总结

    一.  html (1)编码:所有编码均采用xhtml,标签必须闭合,属性值用双引号包括,编码统一为utf-8. (2)语义化:语义化html,正确使用标签. (3)文件命名:命名以中文命名,依实际模 ...

  7. 应该掌握的MySQL命令、MySQL语句

    一.MySQL常用的命令: 1. 连接数据库:mysql>mysql -uroot -p回车,再输入密码   mysql -h 192.168.0.200 -P 3306 -u root -p2 ...

  8. Devexpress TreeList控件绑定显示父子节点对像

    今天一位同事咨询Devexpress TreeList控件绑定自动显示父子节点对像,但结果是不会显示带父子节点关系,而是将所有的节点作为父节点显示出来了,对像类的代码如下 public class I ...

  9. 房间安排-nyoj168

    描述 2010年上海世界博览会(Expo2010),是第41届世界博览会.于2010年5月1日至10月31日期间,在中国上海市举行.本次世博会也是由中国举办的首届世界博览会.上海世博会以“城市,让生活 ...

  10. Python的正则表达式笔记

    1. "先抓大再抓小": 遇到一个正则表达式无法一次性筛选出所需内容时, 可以先在一个范围内筛选第一次, 再在小范围中筛选第二次. 2. pattern = re.compile( ...