Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 65 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
65
Dung lượng
335,67 KB
Nội dung
100 Part I ✦ Getting Started with Zope Table 4-9 (continued) Variable Description previous-sequence-start-number Returns the number (starting from 1) of the first item in the previous batch previous-sequence-end-index Returns the index (starting from 0) of the last item in the previous batch previous-sequence-end-number Returns the number (starting from 1) of the last item in the previous batch previous-sequence-size Returns the size of the previous batch previous-batches A sequence of mapping objects with information about all previous batches; each mapping object has these keys: batch-start-index, batch-end-index, and batch-size next-sequence True when the last item in the current batch is displayed and when that item is not the last item in the entire sequence next-sequence-start-index Returns the index (starting from 0) of the first item in the next batch next-sequence-start-number Returns the number (starting from 1) of the first item in the next batch next-sequence-end-index Returns the index (starting from 0) of the last item in the next batch next-sequence-end-number Returns the number (starting from 1) of the last item in the next batch next-sequence-size Returns the size of the next batch next-batches A sequence of mapping objects with information about all following batches; each mapping object has these keys: batch-start-index, batch-end-index, and batch-size Instead of looking at these variables one or two at a time, we are going to go ahead and hit you with whole thing at once. Take a look at the example that follows, but don’t get too upset; we will every part of it in just a minute. <dtml-var standard_html_header> <dtml-in listCustomers size=10 sort=name start=query_start> <dtml-if sequence-start> <H1>Customer List</H1> <dtml-if previous-sequence> <P><a href=”&dtml-URL;&dtml-sequence-query;query_start=&dtml-previous- sequence-start-number;”>Previous <dtml-var previous-sequence-size></a></P> c4857-3 Ch04.F 3/1/02 9:38 AM Page 100 101 Chapter 4 ✦ Document Template Markup Language </dtml-if> <table> <tr> <th>Customer</th> <th>Phone</th> <th>Address</th> </tr> </dtml-if> <tr<dtml-if sequence-even> bgcolor=”#EFEFEF”</dtml-if>> <td><dtml-var name></td> <td><dtml-var phone></td> <td><dtml-var address></td> </tr> <dtml-if sequence-end> </table> <dtml-if next-sequence> <P><a href=”&dtml-URL;&dtml-sequence-query;query_start=&dtml-next-sequence- start-number;”>Next <dtml-var next-sequence-size></a></P> </dtml-if> </dtml-if> </dtml-in> <dtml-var standard_html_footer> This isn’t really as bad as it looks. Let’s start from the beginning. The method listCustomers creates a list of customers with attributes for name, phone, and address. The size attribute limits our batches to a maximum of 10 results, and the sort attribute sorts the entire sequence by the name attribute. The start attribute tells the dtml-in tag which index (of the entire sequence) it should use to start the current batch. Next we have two nested dtml-if tags. The first checks to see whether sequence- start is true, meaning it checks to see whether the current item is the first item in this batch. If it is, it prints the <H1> text, evaluates a second dtml-if tag, and then inserts some column headers for the table we will use to display our results. This second dtml-if tag checks to see whether previous-sequence is true, meaning it checks for any items in the sequence before the first one of the current batch. If the first item in the current batch is not the first item in the entire sequence, a link to the previous batch of 10 results is inserted. Below this, we create the table row that will be inserted for each item in the current batch. There isn’t much going on here that hasn’t already been discussed under previous sections. Toward the end of the example you will see two more nested dtml-if tags. This sec- tion performs basically the same function as the first set of nested dtml-if tags except that here we are testing to see if the current item is the last item in this batch. If it is, the table is closed and another if check is evaluated to see whether c4857-3 Ch04.F 3/1/02 9:38 AM Page 101 102 Part I ✦ Getting Started with Zope this is the last batch in the sequence. Unless the current batch is the last batch of 10 results (or part-thereof), a link to the next batch is inserted. A few of the batch processing variables can be used to display statistics about the next and previous batches. In the previous example, the previous-sequence-size and next-sequence-size variables are used to show the number of results in the pre- vious and next batches, respectively. There are also variables to display the start- ing and ending index of the next and previous batches. The dtml-with Tag The dtml-with tag is used to push a particular object to the top of the namespace. This enables you to either add new attributes to the namespace by including an object outside of the normal chain of acquisition (like a subfolder), or look for vari- ables in a particular object before searching the rest of the namespace. In the example that follows, we must access several objects in another folder. This can be accomplished without the dtml-with tag by using an expression to access the objects of another container: <dtml-in expr=”Clients.getClientInfo(client_id=client_id)”> <H1><dtml-var name></H1> <dtml-if “employees > 50”> <dtml-var expr=”Clients.addInsuranceForm”> <dtml-else> <dtml-var expr=”Clients.smallBusinessMethod()”> </dtml-if> </dtml-in> As you can see, this can make for a lot of extra work if you need to access another folder like this more than once or twice. By using a dtml-with tag to push the Clients folder (and its contents) to the top of the namespace, this example becomes a little easier to read and a lot easier to write. Everything inside the dtml-with tag block will look for objects in the Clients folder before following the normal pattern of acquisition. <dtml-with Clients> <dtml-in expr=”getClientInfo(client_id=client_id)”> <H1><dtml-var name></H1> <dtml-if “employees > 50”> <dtml-var addInsuranceForm> <dtml-else> <dtml-var smallBusinessMethod> </dtml-if> </dtml-in> </dtml-with> Usually, the Request is at the bottom the namespace stack. In other words, it’s the last place Zope looks when searching for a variable. The dtml-with tag is often used c4857-3 Ch04.F 3/1/02 9:38 AM Page 102 103 Chapter 4 ✦ Document Template Markup Language to push the Request to the top of the namespace. This can be useful if you need to access a variable in the Request that also exists somewhere else in the namespace. Let’s say you need to access a variable in the Request called title. Finding the right title variable can be a problem as Zope looks for the name title in the client object before it looks in the Request. If you are working in a DTML Document, the client object is likely to have a title attribute and Zope will think this must be what you were looking for. By enclosing your dtml-var tag in a dtml-with tag block, you can force Zope to look in the Request before it looks anywhere else. <dtml-with REQUEST> <dtml-var title> </dtml-with> In the previous example, if the Request does not contain a title variable, it is still possible that a title variable from somewhere else in the namespace stack could be returned. Chances are, this is the wrong title. The only attribute prevents Zope from looking up objects outside the namespace specified in the dtml-with tag. This enables you to be sure about which variables are being inserted into your documents. <dtml-with REQUEST only> <dtml-var title> </dtml-with> The dtml-let Tag The dtml-let tag is used to create a new layer at the top of the namespace stack and assign multiple variables to that namespace. Although both the dtml-with and dtml- let tags are used to modify namespaces, the dtml-let tag is better suited for setting one or more new variables in the namespace instead of accessing the attributes or contents of an existing object. As with the dtml-with tag, any changes to the name- space stack are undone when the dtml-let tag is closed. In other words, the name- space stack is only changed for the contents of the dtml-let tag block. In the next example, the method getShoppingCart returns a list of objects with the following properties: sku, cost, and inventory. For each object in the sequence, the dtml-let assigns a value to the date and subtotal variables. <dtml-in getShoppingCart sort=”sku”> <dtml-let date=”ZopeTime()” subtotal=”cost*inventory”> <dtml-call “addToReceipt(sku=sku,date=date,subtotal=subtotal)”> </dtml-let> </dtml-in> This shows how multiple assignment with the dtml-let tag can help make simple scripting a little easier. c4857-3 Ch04.F 3/1/02 9:38 AM Page 103 104 Part I ✦ Getting Started with Zope The dtml-call Tag Sometimes you may find it necessary to call a method without displaying the results on your Web page. You may need to define a new a variable in the Request or insert some form elements into a database. The dtml-call tag is intended for just this purpose. Unlike the dtml-var tag, the dtml-call tag enables you to run a method without inserting any results into your document. For example, let’s say you want to insert the contents of an online questionnaire (an HTML form) into a MySQL database. One efficient way to achieve this is to have the form post to a DTML Method that contains only two dtml-call tags. The first tag calls a method insertQuestionnaire that inserts the form elements from the Request into a MySQL database, and the second tag redirects the user to another document, possibly a thank you page. <dtml-call insertQuestionnaire> <dtml-call “RESPONSE.redirect(‘thank_you.html’)”> This DTML Method is completely transparent to the user. Without any dtml-var tags or other forms of output, the user will not see the contents of this DTML method. For the user, it is a simple process of submitting the form and being taken to the thank_you.html page. The dtml-call tag is also commonly used to define a new variable in the current namespace by calling the set method of the Request object. For example, if a docu- ment always requires a certain variable but for some reason that variable is not always passed in when the document is loaded, you can set a default value for that variable in the Request. <dtml-unless new_variable> <dtml-call “REQUEST.set(‘new_variable’, 1)”> </dtml-unless> As with many things in Zope, there are other ways of achieving the same result, but sometimes how you perform a certain action with DTML is a function of personal preference and sometimes it is determined by the overall design of your Web site. The dtml-return Tag In earlier versions of Zope (before 2.3.0), the dtml-return tag was used to perform script-like computations with DTML Documents or Methods. If Zope encounters a dtml-return tag while rendering a document, only the results of the expression or name lookup in the tag itself will be displayed. All other content in the page is ignored. In other words, when a valid dtml-return tag is parsed, Zope stops evaluat- ing the rest of page and returns only the value of the tag. <H1>Ignore me!</H1> <dtml-return expr=”ZopeTime()”> c4857-3 Ch04.F 3/1/02 9:38 AM Page 104 [...]... that the mail headers and the rest of the contents of the tag are separated by a line break This is used to identify where the body of the message begins Although the contents of the dtml-sendmail tag can contain additional line breaks, Zope uses the first one it finds to start the body of the e-mail message Also, the body of the message is formatted as though it were in a HTML tag In other words,... the body of the e-mail messagse will not be encrypted After the body of the message, there is a dtml-boundary tag that indicates the next part of the e-mail message is an attachment A dtml-var tag is then used to insert the file you want to attach to the e-mail Notice also that there are no line breaks between the dtml-boundary tag, dtml-var tag and the close dtml-mime tag Any line breaks between these... [MSC 32 bit (Intel)] on win32 Copyright 1991-1995 Stichting Mathematisch Centrum, Amsterdam >>> 1001 + 1 1002 >>> c4857 -3 Ch05.F 3/ 1/02 9 :38 AM Page 1 23 Chapter 5 ✦ Object-Oriented Programming and Python The interactive interpreter has two prompts to indicate the “mode” the interpreter is in The first is the one you’ve seen in the previous example: >>> The second prompt type is the “continuation” prompt,... the order in which the expression is evaluated using parentheses (Notice that you get a completely different result.) >>> (1 + 2) * 3 9 131 c4857 -3 Ch05.F 132 3/ 1/02 9 :39 AM Page 132 Part I ✦ Getting Started with Zope When dividing integers the result is an integer Python does not do any rounding it ignores the remainder So for example: >>> 1 / 2 0 >>> 3/ 2 1 >>> 4/1 4 To discover what the remainder is... you compare the text in this example to the previous dtml-sendmail example, you may notice that using the dtml-mime tag changes a few things First, there is no line break between the mail headers and the open dtml-mime tag The first line break is inside the dtml-mime tag, and therefore, so is the body of the message For most e-mail messages, you may need to set the encode attribute of the dtml-mime... First, you need to tell the UNIX shell to use the Python interpreter when running the script This is done by making the following modification at the beginning of your script: #! /usr/bin/python print “Hello, world!” The string #! at the beginning of your script will tell the UNIX shell where to find the interpreter for the rest of the script In this case, the shell will look for the Python interpreter... contain other sub-branches The header document is displayed before the list of objects is any expanded branch of your tree that contains other sub-branches The footer attribute performs the same function, except that its document is displayed after the list of contents Changing how your tree is displayed The sort attribute of the dtml-tree tag works the same way as the sort attribute of the dtml-in tag The. .. The letter “a” is a sequence 1 item long 133 c4857 -3 Ch05.F 134 3/ 1/02 9 :39 AM Page 134 Part I ✦ Getting Started with Zope Accessing a particular character from within a string is fairly simple: >>> x = “spam and eggs” >>> x[6] ‘n’ >>> You indicate which element you want out of the sequence by specifying its index within square brackets Notice how the x[6] operation returns the seventh element in the. ..c4857 -3 Ch04.F 110 3/ 1/02 9 :38 AM Page 110 Part I ✦ Getting Started with Zope The following DTML is an excerpt from the standard_error_message method It can be found in the root folder Zope uses it to report most types of ZopeErrors This is included to show how these variables can be used to create your own custom error messages or to change the default message Zope uses . whether c4857 -3 Ch04.F 3/ 1/02 9 :38 AM Page 101 102 Part I ✦ Getting Started with Zope this is the last batch in the sequence. Unless the current batch is the last batch of 10 results (or part-thereof),. smallBusinessMethod> </dtml-if> </dtml-in> </dtml-with> Usually, the Request is at the bottom the namespace stack. In other words, it’s the last place Zope looks when searching for a variable. The dtml-with tag is often used c4857 -3 Ch04.F 3/ 1/02 9 :38 . src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABCYAAAKSCAIAAACBQk0xAAAACXBIWXMAABYlAAAWJQFJUiTwAAAgAElEQVR42u3dS4+k5 13/ 4afOxz73zLjHsccmxAw4JEKKhBCILEgkNpFQxCuAF8B7gi3LrGCBrEhICMTBiZIANk7iOJnMoaerq+p56lwsvupH/XeEFP7y4Ni+roXV7kN1TXcv6qP7/t 134 ztvv10AAAC8GE0/AgAAQHIAAACSAwAAQHIAAACSAwAAkBwAAACSAwAAkBwAAIDkAAAAkBwAAIDkAAAAJAcAAIDkAAAAJAcAACA5AAAAJAcAACA5AAAAyQEAACA5AAAAyQEAACA5AAAAyQEAAEgOAAAAyQEAAEgOAABAcgAAAEgOAABAcgAAAJIDAABAcgAAAJIDAACQHAAAAJIDAACQHAAAgOQAAACQHAAAgOQAAACQHAAAgOQAAAAkBwAAgOQAAAA+Ho39fu+nAAAAvCBWOQAAAMkBAABIDgAAAMkBAABIDgAAQHIAAABIDgAAQHIAAACSAwAAQHIAAACSAwAAkBwAAACSAwAAkBwAAIDkAAAAkBwAAIDkAAAAJIcfAQAAIDkAAADJAQAAIDkAAADJAQAASA4AAADJAQAASA4AAEByAAAASA4AAEByAAAAkgMAAEByAAAAkgMAAJAcAAAAkgMAAJAcAACA5AAAAJAcAACA5AAAAJAcAACA5AAAACQHAACA5AAAACQHAAAgOQAAACQHAAAgOQAAAMkBAAAgOQAAAMkBAABIDgAAAMkBAABIDgAAQHIAAABIDgAAQHIAAABIDgAAQHIAAACSAwAAQHIAAACSAwAAkBwAAACSAwAAkBwAAIDkAAAAkBwAAIDkAAAAJAcAAIDkAAAAJAcAACA5AAAAJAcAACA5AAAAJAcAACA5AAAAyQEAACA5AAAAyQEAAEgOAAAAyQEAAEgOAABAcgAAAEgOAABAcgAAAJIDAABAcgAAAJIDAACQHAAAAJIDAACQHAAAAJIDAACQHAAAgOQAAACQHAAAgOQAAAAkBwAAgOQAAAAkBwAAIDkAAAAkBwAAIDkAAADJAQAAIDkAAADJAQAASA4AAADJAQAASA4AAADJAQAASA4AAEByAAAASA4AAEByAAAAkgMAAEByAAAAkgMAAJAcAAAAkgMAAJAcAACA5AAAAJAcAACA5AAAACQHAACA5AAAACQHAACA5AAAACQHAAAgOQAAACQHAAAgOQAAAMkBAAAgOQAAAMkBAABIDgAAAMkBAABIDgAAQHIAAABIDgAAQHIAAACSAwAAQHIAAACSAwAAQHIAAACSAwAAkBwAAACSAwAAkBwAAIDkAAAAkBwAAIDkAAAAJAcAAIDkAAAAJAcAACA5AAAAJAcAACA5AAAAyQEAACA5AAAAyQEAACA5AAAAyQEAAEgOAAAAyQEAAEgOAABAcgAAAEgOAABAcgAAAJIDAABAcgAAAJIDAACQHAAAAJIDAACQHAAAgOQAAACQHAAAgOQAAACQHAAAgOQAAAAkBwAAgOQAAAAkBwAAIDkAAAAkBwAAIDkAAADJAQAAIDkAAADJAQAASA4AAADJAQAASA4AAEByAAAASA4AAEByAAAASA4AAEByAAAAkgMAAEByAAAAkgMAAJAcAAAAkgMAAJAcAACA5AAAAJAcAACA5AAAACQHAACA5AAAACQHAAAgOQAAACQHAAAgOQAAACQHAAAgOQAAAMkBAAAgOQAAAMkBAABIDgAAAMkBAABIDgAAQHIAAABIDgAAQHIAAACSAwAAQHIAAACSAwAAkBwAAACSAwAAkBwAAACSAwAAkBwAAIDkAAAAkBwAAIDkAAAAJAcAAIDkAAAAJAcAACA5AAAAJAcAACA5AAAAyQEAACA5AAAAyQEAAEgOAAAAyQEAAEgOAAAAyQEAAEgOAABAcgAAAEgOAABAcgAAAJIDAABAcgAAAJIDAACQHAAAAJIDAACQHAAAgOQAAACQHAAAgOQAAAAkBwAAgOQAAAAkBwAAgOQAAAAkBwAAIDkAAAAkBwAAIDkAAADJAQAAIDkAAADJAQAASA4AAADJAQAASA4AAEByAAAASA4AAEByAAAAkgMAAEByAAAAkgMAAJAcfgQAAIDkAAAAJAcAAIDkAAAAJAcAACA5AAAAJAcAACA5AAAAyQEAACA5AAAAyQEAAEgOAAAAyQEAAEgOAABAcgAAAEgOAABAcgAAAJIDAABAcgAAAJIDAABAcgAAAJIDAACQHAAAAJIDAACQHAAAgOQAAACQHAAAgOQAAAAkBwAAgOQAAAAkBwAAIDkAAAAkBwAAIDkAAADJAQAAIDkAAADJAQAAIDkAAADJAQAASA4AAADJAQAASA4AAEByAAAASA4AAEByAAAAkgMAAEByAAAAkgMAAJAcAAAAkgMAAJAcAACA5AAAAJAcAACA5AAAAJAcAACA5AAAACQHAACA5AAAACQHAAAgOQAAACQHAAAgOQAAAMkBAAAgOQAAAMkBAABIDgAAAMkBAABIDgAAQHIAAABIDgAAQHIAAABIDgAAQHIAAACSAwAAQHIAAACSAwAAkBwAAACSAwAAkBwAAIDkAAAAkBwAAIDkAAAAJAcAAIDkAAAAJAcAACA5AAAAJAcAACA5AAAAJAcAACA5AAAAyQEAACA5AAAAyQEAAEgOAAAAyQEAAEgOAABAcgAAAEgOAABAcgAAAJIDAABAcgAAAJIDAACQHAAAAJIDAACQHAAAAJIDAACQHAAAgOQAAACQHAAAgOQAAAAkBwAAgOQAAAAkBwAAIDkAAAAkBwAAIDkAAADJAQAAIDkAAADJAQAASA4AAADJAQAASA4AAADJAQAASA4AAEByAAAASA4AAEByAAAAkgMAAEByAAAAkgMAAJAcAAAAkgMAAJAcAACA5AAAAJAcAACA5AAAACQHAACA5AAAACQHAACA5AAAACQHAAAgOQAAACQHAAAgOQAAAMkBAAAgOQAAAMkBAABIDgAAAMkBAABIDgAAQHIAAABIDgAAQHIAAACSAwAAQHIAAACSAwAAQHIAAACSAwAAkBwAAACSAwAAkBwAAIDkAAAAkBwAAIDkAAAAJAcAAIDkAAAAJAcAACA5AAAAJAcAACA5AAAAyQEAACA5AAAAyQEAACA5AAAAyQEAAEgOAAAAyQEAAEgOAABAcgAAAEgOAABAcgAAAJIDAABAcgAAAJIDAACQHAAAAJIDAACQHAAAgOQAAACQHAAAgOQAAACQHAAAgOQAAAAkBwAAgOQAAAAkBwAAIDkAAAAkBwAAIDkAAADJAQAAIDkAAADJAQAASA4AAADJAQAASA4AAEByAAAASA4AAEByAAAASA4AAEByAAAAkgMAAEByAAAAkgMAAJAcAAAAkgMAAJAcAACA5AAAAJAcAACA5AAAACQHAACA5AAAACQHAAAgOQAAACQHAAAgOQAAACQHAAAgOQAAAMkBAAAgOQAAAMkBAABIDgAAAMkBAABIDgAAQHIAAABIDgAAQHIAAACSAwAAQHIAAACSAwAAkBwAAACSAwAAkBwAAACSAwAAkBwAAIDkAAAAkBwAAIDkAAAAJAcAAIDkAAAAJAcAACA5AAAAJAcAACA5AAAAyQEAACA5AAAAyQEAAEgOAAAAyQEAAEgOAABAcvgRAAAAkgMAAJAcAAAAkgMAAJAcAACA5AAAAJAcAACA5AAAACQHAACA5AAAACQHAAAgOQAAACQHAAAgOQAAAMkBAAAgOQAAgE+Eth/Br7j9ft9oNP6PP+2X+czdbrff78uyLMtysVjM5/PVajWbzcqynE6nm83m8PBwOBx+9atffRFPDwAAycGnx263Wy6X19fXi8ViNpv1+/0PPvhgsVgsl8vlctloNN57771nz54VRbFer9vtdlEUs9ms0+n84R/+oZ8eAIDkQFHs1uv1arVarVbr9brRaDQajWazmYTYbDbb7TZrGs1mczQa7ff7Bw8e5Gu3222j0fjKV77y9ttv//M//3NVVZvNpt1ut1qt3W53dXW1WCz6/b4fMgDAZ1Zjv9/7Kfwqe6Ebq3a7XVVViY3tdlvcbJeaz+fb7bbZbPb7/UajUVVVvjDv3O/3u92u1WoVRbHZbIbDYT7nv/7rvy4vL8uyfP78+Wq1mk6n3W 736 1//+h/90R/ZWAUAIDn4tCXHfr/PO2+///anbTabxWKRAYx+v7/dbtfrdVEU6/U6X7vb7Xa7XVEUeZC8c7PZtFqtvNFoNHa7XafTGQwGRVF873vfy6LHwcHB+fn5O++8893vfne73f7FX/zF8fGx5AAA+GyyserTUyZZqcgmqO12u1qt0gzNZrPZbCYM0gaJhwxmbDabTqezXC7zcn+z2TSbze12u9/vq6oaDAbZZLXdbrvd7na77fV6iY1er5eHSmY0Go3xeHx9fZ0Hmc1mDx8+fOedd/b7/be//e1vfOMbfkcAAJKDT57URVVVy+WyKIrtdpv9TgmP3W43n8+rqmo0GovFYjgcXl5evvzyy6+//vpyuUyNZNCi0WhcX1/3er3pdJo42e /3+ e96vc5cR4Y6Go1Gu91er9edTme9Xne73dVq1Wq1Op3O6enpZDJpNBqZAOl2u/fu3bu6uvrP//zP1WqVRAEAQHLwCciMvPpfrVabzaaeviiKIr2RlYf8tyiKfr+/2WwGg0EK4eDg4PHjx8PhMF9bFEVVVVkJ2e/3BwcH6xt5tJxAtdvtGo1Gp9PJOEen09ntdvVjZnveaDRqt9ubzSZ9Upbl66+//k//9E9FUVxeXl5cXPjdAQB8BrkK8BOTGev1uizLyWQymUxms9lkMsl5UHVaZMSi1WqlN1qtVrvdzpanwWDQ7/c7nU6j0Xj//fc3m82TJ08Wi0Wr1cpyRKPRGA6HKZDhcDgYDA4ODjqdTpIj+6ny0aOjo263OxwOs2qRz8kTaLfb4/E4wxjr9bqqqnv37iVUfvzjH/slAgB8Nlnl+NWVTU05uDa7pDLhnaGLVqvVbDbzzv1+n6WGfLT+8uyzyh6qbH/KPqj5fN5sNjO20Ww2s1Eqb2QJJZMh2U+VaElvtFqtsizz4CmNPMJqtep2u+12O3urkhxJmjt37jx9+vT999//3d/9Xb9TAADJwa+KzWYzmUzq2FgulzmvNpMSnU6n1Wr1er31ej2fz5MKg8EgtdBsNgeDwWw26/V69aapvCelsVqthsNh1kAyC57qyB6q1WqVKY56hKPX67Xb7SxrZP9VcWtwPDMheefh4WFWRdJCZVk+ePDgxz/+8XvvvZf7OvxmAQAkBx+/xWLx/PnzvOJfrVb7/T510ev1EhuNRiOXaWTbUqY1slKRGzPKsmw2m/Xkd7ql0+nUu7CGw2HOrSpu5jTytSmNfOFqtcpsRsbBs7qSx0mfZN4jaynNZjNbqkajUYbIc/zu3bt3h8Nh/kV37tzxywUA+Kwxy/GrZb/fP3ny5NGjR4mBdrudk2qLm2v75vN5o9EoyzKH1WY5oiiKrGNkKiN3aOT+71arld1WWc3IY2aho9FodLvddEg9AZKFiBy2WwdJ1jduT5MnMOoHzKhJiuX09DRPoK6ge/fuFUXxb//2b36/AACfQVY5Pma73e7y8vLRo0c/+9nPms3m/fv3i6Lo9Xr1vqbRaJQNUVlJKIqiqqrxeJzNUZnKyAm5i8Wi3is1Go3W6/V4PM61G+v1ut/vZ9a83W4vFotsc1osFomHxEk9tjEcDm8fg1s/SLfbzXWBmU3Ph7IvK73UarUODg4SMBkLmc1m2Vv1ne9856tf/WrGzQEAkBy8cLmM71vf+tbbb799dXX18OHDr33ta/VWqMj2pLxMr1cVut1uVVVZ5cgKQ32cVFYbbq9s5ELA4uZWjfRMbgAsbhYr8tF81XK5bLfbs9kscxrb7XY4HGZRJXMgaZKMlNRXDe5vHBwctNvt0Wg0nU4zg75YLM7Pzzudzmw2++lPf/rgwQO/egAAycH/hbfeeutb3/rWfD7/4he/+Kd/+qe9Xi9JUB8Ple1J2fiUN7IukYmO7XZbrxiUZZkbxPv9fhYcMmuRfsh6RWphuVx2u93i1r1++S75UKfTyWPmm9aXfmSBZb1e55Pz+SmNrKtkziTbsVqt1r17966vr4ubc6s2m83du3cXi8Xf/M3f/Nmf/dntpgIA4FPPi7+PzXw+H41GX/va 137 v 936 vHqWoxyfqU6Ha7Xan0+l2uzkAqtfrLZfLnG+bRYndbpc9TgcHB81mMzuaipuh8DzOer2uD7QtiqLVauUM3NxKntWMPIfIakkiJzeLZ6PXbrfrdrvNZjOBUQ+U5xvlLo5ms3lwcJD5k6IoVqtV7gHs9Xo/+9nPvve97zX+Z/4qAAAkBx+Zw8PDP/mTP3n99dfro2MzFFEfOFvcrHgkLXKrRlmWWXNIMBweHg6Hw263u1wuUxH1qsh2u82keL/fz5lXGfnIHqpc95EZjyTKYDDIY+YJrFar6+vremA9TylHY9XbqOpllvqqkLqajo+P88ZyuVyv16enp/leP/jBD/zqAQAkB/8X3n 333 V6vV58xVdzspMor+IxJFDeD2s1ms6qqRqORBYThcJh7OabT6XK5zFG5WQbJobrZIpW6yNjGarXKVHpWLbbb7XQ6zTxGvsV8Pk+KbDabqqq63e5gMOh0OrnBI0sZeaj8bzon+6+y4yvrJBkjOT09rU/dzTpMHueDDz7IADoAAJKDF+vx48eZ7a6nI25/tF4uyN6nfr/f7/dzV8ZsNsviQ1VVnU5nsVhUVbXZbMbj8eHhYVYtsjmq2+3m8bN1qj4nN1eVF0WR029z1WDGOcbj8Wg0Ojk5ST9sNpurq6vlcpktW5kgz53oy+UygXFwcDAej3NEb6vVyt6qXq83Go2Kmyn57Xb74MGDVqs1mUzeffddv30AAMnBC/fFL37x6uoqqxn7X5BsKIqi1WoNh8OqqoqiWCwWOSGqvsm7PjAqcxRXV1cZ8s6HyrIcDAb52jo80jmZHc+SyHq9HgwGo9FoPB6XZTmdTufzea786/V6Z2dnqZ18fpZKcpNgbiUvy7K6MRwO68WQk5OTPLf6qNwsv0gOAIDPFCdWfWxSAgcHB8XNLXv1HHa9HymfOZ/P63WJ7XY7GAwyDp6vymlROYGqXhvJTqdut5vrOzIHslqtut1ufZJVFk/yHDabTVmWRVEMh8PERp5Psiffpbi5MKS+ZLCees8USvZl1cPoh4eH2da13W6rqrp7926G4H/0ox/VyQQAwKeeVY6PzXQ6nUwm9aXd9fvrQ6tuv5rPnqgcjJsdTdlAlaWGLFZkpSJVkKWMTJmvVqusXSyXy6qqcgpW7grMGEkmQMbjcfZTZWA98+W5zq8sy6ycZKtVHjPPpyiK3BJY39qRLVhFUfT7/cxv5HCtsixzKcfjx48vLy/9AQAASA5erNwgXhRFrr+oG6NOjix6FEWRF/Tb7bbX66UTsmSRNYSce1tvmipu1iJ6vd5isVitVll/SL1k+SIzGEVRVFWVOOn3+9vtNkdU5aM5AiutkvOvskuq0+nU95Tn5Nx6+SWXkWecI/+Q4+PjfFoWOl5++eUsjzx69MgfAACA5ODFarfbuQSjTo7i5tCqOj+KoshKRX05Rga+64v86kTJ6kSuIc/ERXZP5TGbzeZ4PE4tpFKGw2GOlmq1WkdHRxlDz3JKfSlHTt2tz+3NOVfJmNvTIDk2d71eT6fTrHW0Wq3FYlEURZZNMt2RG9OPjo663e5PfvITfwAAAJKDF2swGOT1er2gUV/LfXuOPO9PY9Q7lxIAzWYzF/PVV4bnuNt+v5+xjaxFpBnqpOl2u6mX4XDYbDZHo1HGu4ubA3m73W5WYDqdTg7kzVG5uUe8vmi8KIqstGSfVb57IipbrfKtR6NRfdHHcrm8f/9+o9F4+vRpRswBAJAcvCj1XRb1LRz11Hheo9crGJn5TkXko71er77EI9cFFkWxXC6vrq4mk8lms8m4+e05kKIocupUtjnVQxfX19f1qEY2RGWDVvphNpstl8vJZHJ1ddVut7OTql4eyeJGn