From evan.cheng at apple.com Mon Mar 31 02:18:39 2008 From: evan.cheng at apple.com (Evan Cheng) Date: Mon, 31 Mar 2008 00:18:39 -0700 Subject: [llvm-commits] Speeding up instruction selection In-Reply-To: References: <97188DDC-093E-4733-B8A2-7B30B6684DE1@apple.com> <00FB5805-1FA5-4534-BBD0-E6E34EC17BF1@apple.com> <1C1F9E6C-5B8E-4667-A119-4590F340FDE7@apple.com> <83CD954F-CD49-4D4B-950D-B6CB6CD1B32D@apple.com> Message-ID: <417E9823-6AF6-44B0-83FD-89F0CC079B6A@apple.com> Ok, as long as the compile time increase isn't noticeable I won't sweat it. However, if it happens in a few places, perhaps we need (yet another) a getNode() that takes iterators and hide the copying inside that instead. Evan On Mar 28, 2008, at 3:14 PM, Dan Gohman wrote: > > On Mar 27, 2008, at 6:04 PM, Evan Cheng wrote: >> >>> OK. This is also my view. I don't think this temporary SmallVectors >>> introduce any significant overhead. According to the profiler (I use >>> Google profiling tools, which do not require to compile with -pg), >>> they consume virtually no time and that even on big testcases, >>> that I >>> like so much :-) >> >> I am not sure about this. For all the places which pass the list of >> SDOperand's as a ptr to an array, you want to make a copy of it into >> an array before passing it? > > Hi Evan, > > The patch is not changing every place that passes lists of > SDOperands to make an extra copy. The copy is only needed when > passing an existing node's operands, which is are now stored as > an array of SDUse, to a function that wants an SDOperand array. > And judging by Roman's current patch, this doesn't happen in > all that many places. > > Dan > > _______________________________________________ > llvm-commits mailing list > llvm-commits at cs.uiuc.edu > http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits From evan.cheng at apple.com Mon Mar 31 02:24:05 2008 From: evan.cheng at apple.com (Evan Cheng) Date: Mon, 31 Mar 2008 07:24:05 -0000 Subject: [llvm-commits] [test-suite] r48975 - /test-suite/trunk/MultiSource/Applications/sqlite3/Makefile Message-ID: <200803310724.m2V7O5CD032069@zion.cs.uiuc.edu> Author: evancheng Date: Mon Mar 31 02:24:04 2008 New Revision: 48975 URL: http://llvm.org/viewvc/llvm-project?rev=48975&view=rev Log: Support building with objdir != srcdir. Patch by Julien Lerough. Modified: test-suite/trunk/MultiSource/Applications/sqlite3/Makefile Modified: test-suite/trunk/MultiSource/Applications/sqlite3/Makefile URL: http://llvm.org/viewvc/llvm-project/test-suite/trunk/MultiSource/Applications/sqlite3/Makefile?rev=48975&r1=48974&r2=48975&view=diff ============================================================================== --- test-suite/trunk/MultiSource/Applications/sqlite3/Makefile (original) +++ test-suite/trunk/MultiSource/Applications/sqlite3/Makefile Mon Mar 31 02:24:04 2008 @@ -17,10 +17,10 @@ # the input files are generated from a tcl script # it needs to be generated before sqlite is run -sqlite3.c: test15.sql +$(SourceDir)/sqlite3.c: test15.sql -test15.sql: speedtest.tcl - $(TCLSH) speedtest.tcl +test15.sql: $(SourceDir)/speedtest.tcl + $(TCLSH) $< clean:: rm -f test*.sql From evan.cheng at apple.com Mon Mar 31 02:53:30 2008 From: evan.cheng at apple.com (Evan Cheng) Date: Mon, 31 Mar 2008 07:53:30 -0000 Subject: [llvm-commits] [llvm] r48976 - /llvm/trunk/lib/CodeGen/LiveIntervalAnalysis.cpp Message-ID: <200803310753.m2V7rUwA008575@zion.cs.uiuc.edu> Author: evancheng Date: Mon Mar 31 02:53:30 2008 New Revision: 48976 URL: http://llvm.org/viewvc/llvm-project?rev=48976&view=rev Log: The support for remat of instructions with a register operand is hackish, to say the least. Since the register operand guaranteed to be PIC base and that it is already live at all uses, we are making sure it will not be spilled after its uses are rematerialized for both performance and correctness reasons. Modified: llvm/trunk/lib/CodeGen/LiveIntervalAnalysis.cpp Modified: llvm/trunk/lib/CodeGen/LiveIntervalAnalysis.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/LiveIntervalAnalysis.cpp?rev=48976&r1=48975&r2=48976&view=diff ============================================================================== --- llvm/trunk/lib/CodeGen/LiveIntervalAnalysis.cpp (original) +++ llvm/trunk/lib/CodeGen/LiveIntervalAnalysis.cpp Mon Mar 31 02:53:30 2008 @@ -886,15 +886,6 @@ if (MI == ReMatOrigDefMI && CanDelete) { DOUT << "\t\t\t\tErasing re-materlizable def: "; DOUT << MI << '\n'; - unsigned ImpUse = getReMatImplicitUse(li, MI); - if (ImpUse) { - // To be deleted MI has a virtual register operand, update the - // spill weight of the register interval. - unsigned loopDepth = loopInfo->getLoopDepth(MI->getParent()); - LiveInterval &ImpLi = getInterval(ImpUse); - ImpLi.weight -= - getSpillWeight(false, true, loopDepth) / ImpLi.getSize(); - } RemoveMachineInstrFromMaps(MI); vrm.RemoveMachineInstrFromMaps(MI); MI->eraseFromParent(); @@ -1116,6 +1107,7 @@ MachineInstr *MI = &(*ri); MachineOperand &O = ri.getOperand(); ++ri; + assert(!O.isImplicit() && "Spilling register that's used as implicit use?"); unsigned index = getInstructionIndex(MI); if (index < start || index >= end) continue; @@ -1147,11 +1139,10 @@ if (ImpUse && MI != ReMatDefMI) { // Re-matting an instruction with virtual register use. Update the - // register interval's spill weight. - unsigned loopDepth = loopInfo->getLoopDepth(MI->getParent()); + // register interval's spill weight to HUGE_VALF to prevent it from + // being spilled. LiveInterval &ImpLi = getInterval(ImpUse); - ImpLi.weight += - getSpillWeight(false, true, loopDepth) * NumUses / ImpLi.getSize(); + ImpLi.weight = HUGE_VALF; } unsigned MBBId = MBB->getNumber(); @@ -1575,12 +1566,10 @@ if (ImpUse) { // Re-matting an instruction with virtual register use. Add the // register as an implicit use on the use MI and update the register - // interval's spill weight. - unsigned loopDepth = loopInfo->getLoopDepth(MI->getParent()); + // interval's spill weight to HUGE_VALF to prevent it from being + // spilled. LiveInterval &ImpLi = getInterval(ImpUse); - ImpLi.weight += - getSpillWeight(false, true, loopDepth) / ImpLi.getSize(); - + ImpLi.weight = HUGE_VALF; MI->addOperand(MachineOperand::CreateReg(ImpUse, false, true)); } } From evan.cheng at apple.com Mon Mar 31 02:54:19 2008 From: evan.cheng at apple.com (Evan Cheng) Date: Mon, 31 Mar 2008 07:54:19 -0000 Subject: [llvm-commits] [llvm] r48977 - /llvm/trunk/lib/Target/X86/X86InstrInfo.cpp Message-ID: <200803310754.m2V7sJkW008612@zion.cs.uiuc.edu> Author: evancheng Date: Mon Mar 31 02:54:19 2008 New Revision: 48977 URL: http://llvm.org/viewvc/llvm-project?rev=48977&view=rev Log: Re-apply 48911. Modified: llvm/trunk/lib/Target/X86/X86InstrInfo.cpp Modified: llvm/trunk/lib/Target/X86/X86InstrInfo.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/X86/X86InstrInfo.cpp?rev=48977&r1=48976&r2=48977&view=diff ============================================================================== --- llvm/trunk/lib/Target/X86/X86InstrInfo.cpp (original) +++ llvm/trunk/lib/Target/X86/X86InstrInfo.cpp Mon Mar 31 02:54:19 2008 @@ -748,6 +748,12 @@ } return isPICBase; } + +/// isGVStub - Return true if the GV requires an extra load to get the +/// real address. +static inline bool isGVStub(GlobalValue *GV, X86TargetMachine &TM) { + return TM.getSubtarget().GVRequiresExtraLoad(GV, TM, false); +} bool X86InstrInfo::isReallyTriviallyReMaterializable(MachineInstr *MI) const { switch (MI->getOpcode()) { @@ -769,7 +775,9 @@ if (MI->getOperand(1).isReg() && MI->getOperand(2).isImm() && MI->getOperand(3).isReg() && MI->getOperand(3).getReg() == 0 && - MI->getOperand(4).isCPI()) { + (MI->getOperand(4).isCPI() || + (MI->getOperand(4).isGlobal() && + isGVStub(MI->getOperand(4).getGlobal(), TM)))) { unsigned BaseReg = MI->getOperand(1).getReg(); if (BaseReg == 0) return true; @@ -831,13 +839,9 @@ // Loads from constant pools are trivially invariant. if (MO.isCPI()) return true; - - if (MO.isGlobal()) { - if (TM.getSubtarget().GVRequiresExtraLoad(MO.getGlobal(), - TM, false)) - return true; - return false; - } + + if (MO.isGlobal()) + return isGVStub(MO.getGlobal(), TM); // If this is a load from an invariant stack slot, the load is a constant. if (MO.isFI()) { From idadesub at users.sourceforge.net Mon Mar 31 03:44:53 2008 From: idadesub at users.sourceforge.net (Erick Tryzelaar) Date: Mon, 31 Mar 2008 08:44:53 -0000 Subject: [llvm-commits] [llvm] r48978 - in /llvm/trunk/docs/tutorial: OCamlLangImpl3.html OCamlLangImpl4.html OCamlLangImpl5.html OCamlLangImpl6.html OCamlLangImpl7.html Message-ID: <200803310844.m2V8is9B010008@zion.cs.uiuc.edu> Author: erickt Date: Mon Mar 31 03:44:50 2008 New Revision: 48978 URL: http://llvm.org/viewvc/llvm-project?rev=48978&view=rev Log: Chapter 5, 6, and 7 of the ocaml/kaleidoscope tutorial and fix some tabs in chapter 3 and 4. Added: llvm/trunk/docs/tutorial/OCamlLangImpl5.html llvm/trunk/docs/tutorial/OCamlLangImpl6.html llvm/trunk/docs/tutorial/OCamlLangImpl7.html Modified: llvm/trunk/docs/tutorial/OCamlLangImpl3.html llvm/trunk/docs/tutorial/OCamlLangImpl4.html Modified: llvm/trunk/docs/tutorial/OCamlLangImpl3.html URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/docs/tutorial/OCamlLangImpl3.html?rev=48978&r1=48977&r2=48978&view=diff ============================================================================== --- llvm/trunk/docs/tutorial/OCamlLangImpl3.html (original) +++ llvm/trunk/docs/tutorial/OCamlLangImpl3.html Mon Mar 31 03:44:50 2008 @@ -183,7 +183,7 @@ let i = build_fcmp Fcmp.Ult lhs_val rhs_val "cmptmp" builder in build_uitofp i double_type "booltmp" builder | _ -> raise (Error "invalid binary operator") - end + end @@ -280,7 +280,7 @@ (* Make the function type: double(double,double) etc. *) let doubles = Array.make (Array.length args) double_type in let ft = function_type double_type doubles in - let f = + let f = match lookup_function name the_module with Modified: llvm/trunk/docs/tutorial/OCamlLangImpl4.html URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/docs/tutorial/OCamlLangImpl4.html?rev=48978&r1=48977&r2=48978&view=diff ============================================================================== --- llvm/trunk/docs/tutorial/OCamlLangImpl4.html (original) +++ llvm/trunk/docs/tutorial/OCamlLangImpl4.html Mon Mar 31 03:44:50 2008 @@ -237,7 +237,7 @@
 let codegen_func the_fpm = function
-			...
+      ...
       try
         let ret_val = codegen_expr body in
 
@@ -316,10 +316,9 @@
 ...
 let main () =
   ...
-	
-  (* Create the JIT. *)
+  (* Create the JIT. *)
   let the_module_provider = ModuleProvider.create Codegen.the_module in
-	let the_execution_engine = ExecutionEngine.create the_module_provider in
+  let the_execution_engine = ExecutionEngine.create the_module_provider in
   ...
 
@@ -508,6 +507,17 @@ LLVM JIT and optimizer. To build this example, use:

+
+
+# Compile
+ocamlbuild toy.byte
+# Run
+./toy.byte
+
+
+ +

Here is the code:

+
_tags:
Added: llvm/trunk/docs/tutorial/OCamlLangImpl5.html URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/docs/tutorial/OCamlLangImpl5.html?rev=48978&view=auto ============================================================================== --- llvm/trunk/docs/tutorial/OCamlLangImpl5.html (added) +++ llvm/trunk/docs/tutorial/OCamlLangImpl5.html Mon Mar 31 03:44:50 2008 @@ -0,0 +1,1564 @@ + + + + + Kaleidoscope: Extending the Language: Control Flow + + + + + + + + +
Kaleidoscope: Extending the Language: Control Flow
+ + + +
+

+ Written by Chris Lattner + and Erick Tryzelaar +

+
+ + + + + +
+ +

Welcome to Chapter 5 of the "Implementing a language +with LLVM" tutorial. Parts 1-4 described the implementation of the simple +Kaleidoscope language and included support for generating LLVM IR, followed by +optimizations and a JIT compiler. Unfortunately, as presented, Kaleidoscope is +mostly useless: it has no control flow other than call and return. This means +that you can't have conditional branches in the code, significantly limiting its +power. In this episode of "build that compiler", we'll extend Kaleidoscope to +have an if/then/else expression plus a simple 'for' loop.

+ +
+ + + + + +
+ +

+Extending Kaleidoscope to support if/then/else is quite straightforward. It +basically requires adding lexer support for this "new" concept to the lexer, +parser, AST, and LLVM code emitter. This example is nice, because it shows how +easy it is to "grow" a language over time, incrementally extending it as new +ideas are discovered.

+ +

Before we get going on "how" we add this extension, lets talk about "what" we +want. The basic idea is that we want to be able to write this sort of thing: +

+ +
+
+def fib(x)
+  if x < 3 then
+    1
+  else
+    fib(x-1)+fib(x-2);
+
+
+ +

In Kaleidoscope, every construct is an expression: there are no statements. +As such, the if/then/else expression needs to return a value like any other. +Since we're using a mostly functional form, we'll have it evaluate its +conditional, then return the 'then' or 'else' value based on how the condition +was resolved. This is very similar to the C "?:" expression.

+ +

The semantics of the if/then/else expression is that it evaluates the +condition to a boolean equality value: 0.0 is considered to be false and +everything else is considered to be true. +If the condition is true, the first subexpression is evaluated and returned, if +the condition is false, the second subexpression is evaluated and returned. +Since Kaleidoscope allows side-effects, this behavior is important to nail down. +

+ +

Now that we know what we "want", lets break this down into its constituent +pieces.

+ +
+ + + + + + +
+ +

The lexer extensions are straightforward. First we add new variants +for the relevant tokens:

+ +
+
+  (* control *)
+  | If | Then | Else | For | In
+
+
+ +

Once we have that, we recognize the new keywords in the lexer. This is pretty simple +stuff:

+ +
+
+      ...
+      match Buffer.contents buffer with
+      | "def" -> [< 'Token.Def; stream >]
+      | "extern" -> [< 'Token.Extern; stream >]
+      | "if" -> [< 'Token.If; stream >]
+      | "then" -> [< 'Token.Then; stream >]
+      | "else" -> [< 'Token.Else; stream >]
+      | "for" -> [< 'Token.For; stream >]
+      | "in" -> [< 'Token.In; stream >]
+      | id -> [< 'Token.Ident id; stream >]
+
+
+ +
+ + + + + +
+ +

To represent the new expression we add a new AST variant for it:

+ +
+
+type expr =
+  ...
+  (* variant for if/then/else. *)
+  | If of expr * expr * expr
+
+
+ +

The AST variant just has pointers to the various subexpressions.

+ +
+ + + + + +
+ +

Now that we have the relevant tokens coming from the lexer and we have the +AST node to build, our parsing logic is relatively straightforward. First we +define a new parsing function:

+ +
+
+let rec parse_primary = parser
+  ...
+  (* ifexpr ::= 'if' expr 'then' expr 'else' expr *)
+  | [< 'Token.If; c=parse_expr;
+       'Token.Then ?? "expected 'then'"; t=parse_expr;
+       'Token.Else ?? "expected 'else'"; e=parse_expr >] ->
+      Ast.If (c, t, e)
+
+
+ +

Next we hook it up as a primary expression:

+ +
+
+let rec parse_primary = parser
+  ...
+  (* ifexpr ::= 'if' expr 'then' expr 'else' expr *)
+  | [< 'Token.If; c=parse_expr;
+       'Token.Then ?? "expected 'then'"; t=parse_expr;
+       'Token.Else ?? "expected 'else'"; e=parse_expr >] ->
+      Ast.If (c, t, e)
+
+
+ +
+ + + + + +
+ +

Now that we have it parsing and building the AST, the final piece is adding +LLVM code generation support. This is the most interesting part of the +if/then/else example, because this is where it starts to introduce new concepts. +All of the code above has been thoroughly described in previous chapters. +

+ +

To motivate the code we want to produce, lets take a look at a simple +example. Consider:

+ +
+
+extern foo();
+extern bar();
+def baz(x) if x then foo() else bar();
+
+
+ +

If you disable optimizations, the code you'll (soon) get from Kaleidoscope +looks like this:

+ +
+
+declare double @foo()
+
+declare double @bar()
+
+define double @baz(double %x) {
+entry:
+  %ifcond = fcmp one double %x, 0.000000e+00
+  br i1 %ifcond, label %then, label %else
+
+then:    ; preds = %entry
+  %calltmp = call double @foo()
+  br label %ifcont
+
+else:    ; preds = %entry
+  %calltmp1 = call double @bar()
+  br label %ifcont
+
+ifcont:    ; preds = %else, %then
+  %iftmp = phi double [ %calltmp, %then ], [ %calltmp1, %else ]
+  ret double %iftmp
+}
+
+
+ +

To visualize the control flow graph, you can use a nifty feature of the LLVM +'opt' tool. If you put this LLVM IR +into "t.ll" and run "llvm-as < t.ll | opt -analyze -view-cfg", a window will pop up and you'll +see this graph:

+ +
Example CFG
+ +

Another way to get this is to call "Llvm_analysis.view_function_cfg +f" or "Llvm_analysis.view_function_cfg_only f" (where f +is a "Function") either by inserting actual calls into the code and +recompiling or by calling these in the debugger. LLVM has many nice features +for visualizing various graphs.

+ +

Getting back to the generated code, it is fairly simple: the entry block +evaluates the conditional expression ("x" in our case here) and compares the +result to 0.0 with the "fcmp one" +instruction ('one' is "Ordered and Not Equal"). Based on the result of this +expression, the code jumps to either the "then" or "else" blocks, which contain +the expressions for the true/false cases.

+ +

Once the then/else blocks are finished executing, they both branch back to the +'ifcont' block to execute the code that happens after the if/then/else. In this +case the only thing left to do is to return to the caller of the function. The +question then becomes: how does the code know which expression to return?

+ +

The answer to this question involves an important SSA operation: the +Phi +operation. If you're not familiar with SSA, the wikipedia +article is a good introduction and there are various other introductions to +it available on your favorite search engine. The short version is that +"execution" of the Phi operation requires "remembering" which block control came +from. The Phi operation takes on the value corresponding to the input control +block. In this case, if control comes in from the "then" block, it gets the +value of "calltmp". If control comes from the "else" block, it gets the value +of "calltmp1".

+ +

At this point, you are probably starting to think "Oh no! This means my +simple and elegant front-end will have to start generating SSA form in order to +use LLVM!". Fortunately, this is not the case, and we strongly advise +not implementing an SSA construction algorithm in your front-end +unless there is an amazingly good reason to do so. In practice, there are two +sorts of values that float around in code written for your average imperative +programming language that might need Phi nodes:

+ +
    +
  1. Code that involves user variables: x = 1; x = x + 1;
  2. +
  3. Values that are implicit in the structure of your AST, such as the Phi node +in this case.
  4. +
+ +

In Chapter 7 of this tutorial ("mutable +variables"), we'll talk about #1 +in depth. For now, just believe me that you don't need SSA construction to +handle this case. For #2, you have the choice of using the techniques that we will +describe for #1, or you can insert Phi nodes directly, if convenient. In this +case, it is really really easy to generate the Phi node, so we choose to do it +directly.

+ +

Okay, enough of the motivation and overview, lets generate code!

+ +
+ + + + + +
+ +

In order to generate code for this, we implement the Codegen method +for IfExprAST:

+ +
+
+let rec codegen_expr = function
+  ...
+  | Ast.If (cond, then_, else_) ->
+      let cond = codegen_expr cond in
+
+      (* Convert condition to a bool by comparing equal to 0.0 *)
+      let zero = const_float double_type 0.0 in
+      let cond_val = build_fcmp Fcmp.One cond zero "ifcond" builder in
+
+
+ +

This code is straightforward and similar to what we saw before. We emit the +expression for the condition, then compare that value to zero to get a truth +value as a 1-bit (bool) value.

+ +
+
+      (* Grab the first block so that we might later add the conditional branch
+       * to it at the end of the function. *)
+      let start_bb = insertion_block builder in
+      let the_function = block_parent start_bb in
+
+      let then_bb = append_block "then" the_function in
+      position_at_end then_bb builder;
+
+
+ +

+As opposed to the C++ tutorial, we have to build +our basic blocks bottom up since we can't have dangling BasicBlocks. We start +off by saving a pointer to the first block (which might not be the entry +block), which we'll need to build a conditional branch later. We do this by +asking the builder for the current BasicBlock. The fourth line +gets the current Function object that is being built. It gets this by the +start_bb for its "parent" (the function it is currently embedded +into).

+ +

Once it has that, it creates one block. It is automatically appended into +the function's list of blocks.

+ +
+
+      (* Emit 'then' value. *)
+      position_at_end then_bb builder;
+      let then_val = codegen_expr then_ in
+
+      (* Codegen of 'then' can change the current block, update then_bb for the
+       * phi. We create a new name because one is used for the phi node, and the
+       * other is used for the conditional branch. *)
+      let new_then_bb = insertion_block builder in
+
+
+ +

We move the builder to start inserting into the "then" block. Strictly +speaking, this call moves the insertion point to be at the end of the specified +block. However, since the "then" block is empty, it also starts out by +inserting at the beginning of the block. :)

+ +

Once the insertion point is set, we recursively codegen the "then" expression +from the AST.

+ +

The final line here is quite subtle, but is very important. The basic issue +is that when we create the Phi node in the merge block, we need to set up the +block/value pairs that indicate how the Phi will work. Importantly, the Phi +node expects to have an entry for each predecessor of the block in the CFG. Why +then, are we getting the current block when we just set it to ThenBB 5 lines +above? The problem is that the "Then" expression may actually itself change the +block that the Builder is emitting into if, for example, it contains a nested +"if/then/else" expression. Because calling Codegen recursively could +arbitrarily change the notion of the current block, we are required to get an +up-to-date value for code that will set up the Phi node.

+ +
+
+      (* Emit 'else' value. *)
+      let else_bb = append_block "else" the_function in
+      position_at_end else_bb builder;
+      let else_val = codegen_expr else_ in
+
+      (* Codegen of 'else' can change the current block, update else_bb for the
+       * phi. *)
+      let new_else_bb = insertion_block builder in
+
+
+ +

Code generation for the 'else' block is basically identical to codegen for +the 'then' block.

+ +
+
+      (* Emit merge block. *)
+      let merge_bb = append_block "ifcont" the_function in
+      position_at_end merge_bb builder;
+      let incoming = [(then_val, new_then_bb); (else_val, new_else_bb)] in
+      let phi = build_phi incoming "iftmp" builder in
+
+
+ +

The first two lines here are now familiar: the first adds the "merge" block +to the Function object. The second block changes the insertion point so that +newly created code will go into the "merge" block. Once that is done, we need +to create the PHI node and set up the block/value pairs for the PHI.

+ +
+
+      (* Return to the start block to add the conditional branch. *)
+      position_at_end start_bb builder;
+      ignore (build_cond_br cond_val then_bb else_bb builder);
+
+
+ +

Once the blocks are created, we can emit the conditional branch that chooses +between them. Note that creating new blocks does not implicitly affect the +LLVMBuilder, so it is still inserting into the block that the condition +went into. This is why we needed to save the "start" block.

+ +
+
+      (* Set a unconditional branch at the end of the 'then' block and the
+       * 'else' block to the 'merge' block. *)
+      position_at_end new_then_bb builder; ignore (build_br merge_bb builder);
+      position_at_end new_else_bb builder; ignore (build_br merge_bb builder);
+
+      (* Finally, set the builder to the end of the merge block. *)
+      position_at_end merge_bb builder;
+
+      phi
+
+
+ +

To finish off the blocks, we create an unconditional branch +to the merge block. One interesting (and very important) aspect of the LLVM IR +is that it requires all basic blocks +to be "terminated" with a control flow +instruction such as return or branch. This means that all control flow, +including fall throughs must be made explicit in the LLVM IR. If you +violate this rule, the verifier will emit an error. + +

Finally, the CodeGen function returns the phi node as the value computed by +the if/then/else expression. In our example above, this returned value will +feed into the code for the top-level function, which will create the return +instruction.

+ +

Overall, we now have the ability to execute conditional code in +Kaleidoscope. With this extension, Kaleidoscope is a fairly complete language +that can calculate a wide variety of numeric functions. Next up we'll add +another useful expression that is familiar from non-functional languages...

+ +
+ + + + + +
+ +

Now that we know how to add basic control flow constructs to the language, +we have the tools to add more powerful things. Lets add something more +aggressive, a 'for' expression:

+ +
+
+ extern putchard(char);
+ def printstar(n)
+   for i = 1, i < n, 1.0 in
+     putchard(42);  # ascii 42 = '*'
+
+ # print 100 '*' characters
+ printstar(100);
+
+
+ +

This expression defines a new variable ("i" in this case) which iterates from +a starting value, while the condition ("i < n" in this case) is true, +incrementing by an optional step value ("1.0" in this case). If the step value +is omitted, it defaults to 1.0. While the loop is true, it executes its +body expression. Because we don't have anything better to return, we'll just +define the loop as always returning 0.0. In the future when we have mutable +variables, it will get more useful.

+ +

As before, lets talk about the changes that we need to Kaleidoscope to +support this.

+ +
+ + + + + +
+ +

The lexer extensions are the same sort of thing as for if/then/else:

+ +
+
+  ... in Token.token ...
+  (* control *)
+  | If | Then | Else
+  | For | In
+
+  ... in Lexer.lex_ident...
+      match Buffer.contents buffer with
+      | "def" -> [< 'Token.Def; stream >]
+      | "extern" -> [< 'Token.Extern; stream >]
+      | "if" -> [< 'Token.If; stream >]
+      | "then" -> [< 'Token.Then; stream >]
+      | "else" -> [< 'Token.Else; stream >]
+      | "for" -> [< 'Token.For; stream >]
+      | "in" -> [< 'Token.In; stream >]
+      | id -> [< 'Token.Ident id; stream >]
+
+
+ +
+ + + + + +
+ +

The AST variant is just as simple. It basically boils down to capturing +the variable name and the constituent expressions in the node.

+ +
+
+type expr =
+  ...
+  (* variant for for/in. *)
+  | For of string * expr * expr * expr option * expr
+
+
+ +
+ + + + + +
+ +

The parser code is also fairly standard. The only interesting thing here is +handling of the optional step value. The parser code handles it by checking to +see if the second comma is present. If not, it sets the step value to null in +the AST node:

+ +
+
+let rec parse_primary = parser
+  ...
+  (* forexpr
+        ::= 'for' identifier '=' expr ',' expr (',' expr)? 'in' expression *)
+  | [< 'Token.For;
+       'Token.Ident id ?? "expected identifier after for";
+       'Token.Kwd '=' ?? "expected '=' after for";
+       stream >] ->
+      begin parser
+        | [<
+             start=parse_expr;
+             'Token.Kwd ',' ?? "expected ',' after for";
+             end_=parse_expr;
+             stream >] ->
+            let step =
+              begin parser
+              | [< 'Token.Kwd ','; step=parse_expr >] -> Some step
+              | [< >] -> None
+              end stream
+            in
+            begin parser
+            | [< 'Token.In; body=parse_expr >] ->
+                Ast.For (id, start, end_, step, body)
+            | [< >] ->
+                raise (Stream.Error "expected 'in' after for")
+            end stream
+        | [< >] ->
+            raise (Stream.Error "expected '=' after for")
+      end stream
+
+
+ +
+ + + + + +
+ +

Now we get to the good part: the LLVM IR we want to generate for this thing. +With the simple example above, we get this LLVM IR (note that this dump is +generated with optimizations disabled for clarity): +

+ +
+
+declare double @putchard(double)
+
+define double @printstar(double %n) {
+entry:
+        ; initial value = 1.0 (inlined into phi)
+  br label %loop
+
+loop:    ; preds = %loop, %entry
+  %i = phi double [ 1.000000e+00, %entry ], [ %nextvar, %loop ]
+        ; body
+  %calltmp = call double @putchard( double 4.200000e+01 )
+        ; increment
+  %nextvar = add double %i, 1.000000e+00
+
+        ; termination test
+  %cmptmp = fcmp ult double %i, %n
+  %booltmp = uitofp i1 %cmptmp to double
+  %loopcond = fcmp one double %booltmp, 0.000000e+00
+  br i1 %loopcond, label %loop, label %afterloop
+
+afterloop:    ; preds = %loop
+        ; loop always returns 0.0
+  ret double 0.000000e+00
+}
+
+
+ +

This loop contains all the same constructs we saw before: a phi node, several +expressions, and some basic blocks. Lets see how this fits together.

+ +
+ + + + + +
+ +

The first part of Codegen is very simple: we just output the start expression +for the loop value:

+ +
+
+let rec codegen_expr = function
+  ...
+  | Ast.For (var_name, start, end_, step, body) ->
+      (* Emit the start code first, without 'variable' in scope. *)
+      let start_val = codegen_expr start in
+
+
+ +

With this out of the way, the next step is to set up the LLVM basic block +for the start of the loop body. In the case above, the whole loop body is one +block, but remember that the body code itself could consist of multiple blocks +(e.g. if it contains an if/then/else or a for/in expression).

+ +
+
+      (* Make the new basic block for the loop header, inserting after current
+       * block. *)
+      let preheader_bb = insertion_block builder in
+      let the_function = block_parent preheader_bb in
+      let loop_bb = append_block "loop" the_function in
+
+      (* Insert an explicit fall through from the current block to the
+       * loop_bb. *)
+      ignore (build_br loop_bb builder);
+
+
+ +

This code is similar to what we saw for if/then/else. Because we will need +it to create the Phi node, we remember the block that falls through into the +loop. Once we have that, we create the actual block that starts the loop and +create an unconditional branch for the fall-through between the two blocks.

+ +
+
+      (* Start insertion in loop_bb. *)
+      position_at_end loop_bb builder;
+
+      (* Start the PHI node with an entry for start. *)
+      let variable = build_phi [(start_val, preheader_bb)] var_name builder in
+
+
+ +

Now that the "preheader" for the loop is set up, we switch to emitting code +for the loop body. To begin with, we move the insertion point and create the +PHI node for the loop induction variable. Since we already know the incoming +value for the starting value, we add it to the Phi node. Note that the Phi will +eventually get a second value for the backedge, but we can't set it up yet +(because it doesn't exist!).

+ +
+
+      (* Within the loop, the variable is defined equal to the PHI node. If it
+       * shadows an existing variable, we have to restore it, so save it
+       * now. *)
+      let old_val =
+        try Some (Hashtbl.find named_values var_name) with Not_found -> None
+      in
+      Hashtbl.add named_values var_name variable;
+
+      (* Emit the body of the loop.  This, like any other expr, can change the
+       * current BB.  Note that we ignore the value computed by the body, but
+       * don't allow an error *)
+      ignore (codegen_expr body);
+
+
+ +

Now the code starts to get more interesting. Our 'for' loop introduces a new +variable to the symbol table. This means that our symbol table can now contain +either function arguments or loop variables. To handle this, before we codegen +the body of the loop, we add the loop variable as the current value for its +name. Note that it is possible that there is a variable of the same name in the +outer scope. It would be easy to make this an error (emit an error and return +null if there is already an entry for VarName) but we choose to allow shadowing +of variables. In order to handle this correctly, we remember the Value that +we are potentially shadowing in old_val (which will be None if there is +no shadowed variable).

+ +

Once the loop variable is set into the symbol table, the code recursively +codegen's the body. This allows the body to use the loop variable: any +references to it will naturally find it in the symbol table.

+ +
+
+      (* Emit the step value. *)
+      let step_val =
+        match step with
+        | Some step -> codegen_expr step
+        (* If not specified, use 1.0. *)
+        | None -> const_float double_type 1.0
+      in
+
+      let next_var = build_add variable step_val "nextvar" builder in
+
+
+ +

Now that the body is emitted, we compute the next value of the iteration +variable by adding the step value, or 1.0 if it isn't present. +'next_var' will be the value of the loop variable on the next iteration +of the loop.

+ +
+
+      (* Compute the end condition. *)
+      let end_cond = codegen_expr end_ in
+
+      (* Convert condition to a bool by comparing equal to 0.0. *)
+      let zero = const_float double_type 0.0 in
+      let end_cond = build_fcmp Fcmp.One end_cond zero "loopcond" builder in
+
+
+ +

Finally, we evaluate the exit value of the loop, to determine whether the +loop should exit. This mirrors the condition evaluation for the if/then/else +statement.

+ +
+
+      (* Create the "after loop" block and insert it. *)
+      let loop_end_bb = insertion_block builder in
+      let after_bb = append_block "afterloop" the_function in
+
+      (* Insert the conditional branch into the end of loop_end_bb. *)
+      ignore (build_cond_br end_cond loop_bb after_bb builder);
+
+      (* Any new code will be inserted in after_bb. *)
+      position_at_end after_bb builder;
+
+
+ +

With the code for the body of the loop complete, we just need to finish up +the control flow for it. This code remembers the end block (for the phi node), then creates the block for the loop exit ("afterloop"). Based on the value of the +exit condition, it creates a conditional branch that chooses between executing +the loop again and exiting the loop. Any future code is emitted in the +"afterloop" block, so it sets the insertion position to it.

+ +
+
+      (* Add a new entry to the PHI node for the backedge. *)
+      add_incoming (next_var, loop_end_bb) variable;
+
+      (* Restore the unshadowed variable. *)
+      begin match old_val with
+      | Some old_val -> Hashtbl.add named_values var_name old_val
+      | None -> ()
+      end;
+
+      (* for expr always returns 0.0. *)
+      const_null double_type
+
+
+ +

The final code handles various cleanups: now that we have the +"next_var" value, we can add the incoming value to the loop PHI node. +After that, we remove the loop variable from the symbol table, so that it isn't +in scope after the for loop. Finally, code generation of the for loop always +returns 0.0, so that is what we return from Codegen.codegen_expr.

+ +

With this, we conclude the "adding control flow to Kaleidoscope" chapter of +the tutorial. In this chapter we added two control flow constructs, and used +them to motivate a couple of aspects of the LLVM IR that are important for +front-end implementors to know. In the next chapter of our saga, we will get +a bit crazier and add user-defined operators +to our poor innocent language.

+ +
+ + + + + +
+ +

+Here is the complete code listing for our running example, enhanced with the +if/then/else and for expressions.. To build this example, use: +

+ +
+
+# Compile
+ocamlbuild toy.byte
+# Run
+./toy.byte
+
+
+ +

Here is the code:

+ +
+
_tags:
+
+
+<{lexer,parser}.ml>: use_camlp4, pp(camlp4of)
+<*.{byte,native}>: g++, use_llvm, use_llvm_analysis
+<*.{byte,native}>: use_llvm_executionengine, use_llvm_target
+<*.{byte,native}>: use_llvm_scalar_opts, use_bindings
+
+
+ +
myocamlbuild.ml:
+
+
+open Ocamlbuild_plugin;;
+
+ocaml_lib ~extern:true "llvm";;
+ocaml_lib ~extern:true "llvm_analysis";;
+ocaml_lib ~extern:true "llvm_executionengine";;
+ocaml_lib ~extern:true "llvm_target";;
+ocaml_lib ~extern:true "llvm_scalar_opts";;
+
+flag ["link"; "ocaml"; "g++"] (S[A"-cc"; A"g++"]);;
+dep ["link"; "ocaml"; "use_bindings"] ["bindings.o"];;
+
+
+ +
token.ml:
+
+
+(*===----------------------------------------------------------------------===
+ * Lexer Tokens
+ *===----------------------------------------------------------------------===*)
+
+(* The lexer returns these 'Kwd' if it is an unknown character, otherwise one of
+ * these others for known things. *)
+type token =
+  (* commands *)
+  | Def | Extern
+
+  (* primary *)
+  | Ident of string | Number of float
+
+  (* unknown *)
+  | Kwd of char
+
+  (* control *)
+  | If | Then | Else
+  | For | In
+
+
+ +
lexer.ml:
+
+
+(*===----------------------------------------------------------------------===
+ * Lexer
+ *===----------------------------------------------------------------------===*)
+
+let rec lex = parser
+  (* Skip any whitespace. *)
+  | [< ' (' ' | '\n' | '\r' | '\t'); stream >] -> lex stream
+
+  (* identifier: [a-zA-Z][a-zA-Z0-9] *)
+  | [< ' ('A' .. 'Z' | 'a' .. 'z' as c); stream >] ->
+      let buffer = Buffer.create 1 in
+      Buffer.add_char buffer c;
+      lex_ident buffer stream
+
+  (* number: [0-9.]+ *)
+  | [< ' ('0' .. '9' as c); stream >] ->
+      let buffer = Buffer.create 1 in
+      Buffer.add_char buffer c;
+      lex_number buffer stream
+
+  (* Comment until end of line. *)
+  | [< ' ('#'); stream >] ->
+      lex_comment stream
+
+  (* Otherwise, just return the character as its ascii value. *)
+  | [< 'c; stream >] ->
+      [< 'Token.Kwd c; lex stream >]
+
+  (* end of stream. *)
+  | [< >] -> [< >]
+
+and lex_number buffer = parser
+  | [< ' ('0' .. '9' | '.' as c); stream >] ->
+      Buffer.add_char buffer c;
+      lex_number buffer stream
+  | [< stream=lex >] ->
+      [< 'Token.Number (float_of_string (Buffer.contents buffer)); stream >]
+
+and lex_ident buffer = parser
+  | [< ' ('A' .. 'Z' | 'a' .. 'z' | '0' .. '9' as c); stream >] ->
+      Buffer.add_char buffer c;
+      lex_ident buffer stream
+  | [< stream=lex >] ->
+      match Buffer.contents buffer with
+      | "def" -> [< 'Token.Def; stream >]
+      | "extern" -> [< 'Token.Extern; stream >]
+      | "if" -> [< 'Token.If; stream >]
+      | "then" -> [< 'Token.Then; stream >]
+      | "else" -> [< 'Token.Else; stream >]
+      | "for" -> [< 'Token.For; stream >]
+      | "in" -> [< 'Token.In; stream >]
+      | id -> [< 'Token.Ident id; stream >]
+
+and lex_comment = parser
+  | [< ' ('\n'); stream=lex >] -> stream
+  | [< 'c; e=lex_comment >] -> e
+  | [< >] -> [< >]
+
+
+ +
ast.ml:
+
+
+(*===----------------------------------------------------------------------===
+ * Abstract Syntax Tree (aka Parse Tree)
+ *===----------------------------------------------------------------------===*)
+
+(* expr - Base type for all expression nodes. *)
+type expr =
+  (* variant for numeric literals like "1.0". *)
+  | Number of float
+
+  (* variant for referencing a variable, like "a". *)
+  | Variable of string
+
+  (* variant for a binary operator. *)
+  | Binary of char * expr * expr
+
+  (* variant for function calls. *)
+  | Call of string * expr array
+
+  (* variant for if/then/else. *)
+  | If of expr * expr * expr
+
+  (* variant for for/in. *)
+  | For of string * expr * expr * expr option * expr
+
+(* proto - This type represents the "prototype" for a function, which captures
+ * its name, and its argument names (thus implicitly the number of arguments the
+ * function takes). *)
+type proto = Prototype of string * string array
+
+(* func - This type represents a function definition itself. *)
+type func = Function of proto * expr
+
+
+ +
parser.ml:
+
+
+(*===---------------------------------------------------------------------===
+ * Parser
+ *===---------------------------------------------------------------------===*)
+
+(* binop_precedence - This holds the precedence for each binary operator that is
+ * defined *)
+let binop_precedence:(char, int) Hashtbl.t = Hashtbl.create 10
+
+(* precedence - Get the precedence of the pending binary operator token. *)
+let precedence c = try Hashtbl.find binop_precedence c with Not_found -> -1
+
+(* primary
+ *   ::= identifier
+ *   ::= numberexpr
+ *   ::= parenexpr
+ *   ::= ifexpr
+ *   ::= forexpr *)
+let rec parse_primary = parser
+  (* numberexpr ::= number *)
+  | [< 'Token.Number n >] -> Ast.Number n
+
+  (* parenexpr ::= '(' expression ')' *)
+  | [< 'Token.Kwd '('; e=parse_expr; 'Token.Kwd ')' ?? "expected ')'" >] -> e
+
+  (* identifierexpr
+   *   ::= identifier
+   *   ::= identifier '(' argumentexpr ')' *)
+  | [< 'Token.Ident id; stream >] ->
+      let rec parse_args accumulator = parser
+        | [< e=parse_expr; stream >] ->
+            begin parser
+              | [< 'Token.Kwd ','; e=parse_args (e :: accumulator) >] -> e
+              | [< >] -> e :: accumulator
+            end stream
+        | [< >] -> accumulator
+      in
+      let rec parse_ident id = parser
+        (* Call. *)
+        | [< 'Token.Kwd '(';
+             args=parse_args [];
+             'Token.Kwd ')' ?? "expected ')'">] ->
+            Ast.Call (id, Array.of_list (List.rev args))
+
+        (* Simple variable ref. *)
+        | [< >] -> Ast.Variable id
+      in
+      parse_ident id stream
+
+  (* ifexpr ::= 'if' expr 'then' expr 'else' expr *)
+  | [< 'Token.If; c=parse_expr;
+       'Token.Then ?? "expected 'then'"; t=parse_expr;
+       'Token.Else ?? "expected 'else'"; e=parse_expr >] ->
+      Ast.If (c, t, e)
+
+  (* forexpr
+        ::= 'for' identifier '=' expr ',' expr (',' expr)? 'in' expression *)
+  | [< 'Token.For;
+       'Token.Ident id ?? "expected identifier after for";
+       'Token.Kwd '=' ?? "expected '=' after for";
+       stream >] ->
+      begin parser
+        | [<
+             start=parse_expr;
+             'Token.Kwd ',' ?? "expected ',' after for";
+             end_=parse_expr;
+             stream >] ->
+            let step =
+              begin parser
+              | [< 'Token.Kwd ','; step=parse_expr >] -> Some step
+              | [< >] -> None
+              end stream
+            in
+            begin parser
+            | [< 'Token.In; body=parse_expr >] ->
+                Ast.For (id, start, end_, step, body)
+            | [< >] ->
+                raise (Stream.Error "expected 'in' after for")
+            end stream
+        | [< >] ->
+            raise (Stream.Error "expected '=' after for")
+      end stream
+
+  | [< >] -> raise (Stream.Error "unknown token when expecting an expression.")
+
+(* binoprhs
+ *   ::= ('+' primary)* *)
+and parse_bin_rhs expr_prec lhs stream =
+  match Stream.peek stream with
+  (* If this is a binop, find its precedence. *)
+  | Some (Token.Kwd c) when Hashtbl.mem binop_precedence c ->
+      let token_prec = precedence c in
+
+      (* If this is a binop that binds at least as tightly as the current binop,
+       * consume it, otherwise we are done. *)
+      if token_prec < expr_prec then lhs else begin
+        (* Eat the binop. *)
+        Stream.junk stream;
+
+        (* Parse the primary expression after the binary operator. *)
+        let rhs = parse_primary stream in
+
+        (* Okay, we know this is a binop. *)
+        let rhs =
+          match Stream.peek stream with
+          | Some (Token.Kwd c2) ->
+              (* If BinOp binds less tightly with rhs than the operator after
+               * rhs, let the pending operator take rhs as its lhs. *)
+              let next_prec = precedence c2 in
+              if token_prec < next_prec
+              then parse_bin_rhs (token_prec + 1) rhs stream
+              else rhs
+          | _ -> rhs
+        in
+
+        (* Merge lhs/rhs. *)
+        let lhs = Ast.Binary (c, lhs, rhs) in
+        parse_bin_rhs expr_prec lhs stream
+      end
+  | _ -> lhs
+
+(* expression
+ *   ::= primary binoprhs *)
+and parse_expr = parser
+  | [< lhs=parse_primary; stream >] -> parse_bin_rhs 0 lhs stream
+
+(* prototype
+ *   ::= id '(' id* ')' *)
+let parse_prototype =
+  let rec parse_args accumulator = parser
+    | [< 'Token.Ident id; e=parse_args (id::accumulator) >] -> e
+    | [< >] -> accumulator
+  in
+
+  parser
+  | [< 'Token.Ident id;
+       'Token.Kwd '(' ?? "expected '(' in prototype";
+       args=parse_args [];
+       'Token.Kwd ')' ?? "expected ')' in prototype" >] ->
+      (* success. *)
+      Ast.Prototype (id, Array.of_list (List.rev args))
+
+  | [< >] ->
+      raise (Stream.Error "expected function name in prototype")
+
+(* definition ::= 'def' prototype expression *)
+let parse_definition = parser
+  | [< 'Token.Def; p=parse_prototype; e=parse_expr >] ->
+      Ast.Function (p, e)
+
+(* toplevelexpr ::= expression *)
+let parse_toplevel = parser
+  | [< e=parse_expr >] ->
+      (* Make an anonymous proto. *)
+      Ast.Function (Ast.Prototype ("", [||]), e)
+
+(*  external ::= 'extern' prototype *)
+let parse_extern = parser
+  | [< 'Token.Extern; e=parse_prototype >] -> e
+
+
+ +
codegen.ml:
+
+
+(*===----------------------------------------------------------------------===
+ * Code Generation
+ *===----------------------------------------------------------------------===*)
+
+open Llvm
+
+exception Error of string
+
+let the_module = create_module "my cool jit"
+let builder = builder ()
+let named_values:(string, llvalue) Hashtbl.t = Hashtbl.create 10
+
+let rec codegen_expr = function
+  | Ast.Number n -> const_float double_type n
+  | Ast.Variable name ->
+      (try Hashtbl.find named_values name with
+        | Not_found -> raise (Error "unknown variable name"))
+  | Ast.Binary (op, lhs, rhs) ->
+      let lhs_val = codegen_expr lhs in
+      let rhs_val = codegen_expr rhs in
+      begin
+        match op with
+        | '+' -> build_add lhs_val rhs_val "addtmp" builder
+        | '-' -> build_sub lhs_val rhs_val "subtmp" builder
+        | '*' -> build_mul lhs_val rhs_val "multmp" builder
+        | '<' ->
+            (* Convert bool 0/1 to double 0.0 or 1.0 *)
+            let i = build_fcmp Fcmp.Ult lhs_val rhs_val "cmptmp" builder in
+            build_uitofp i double_type "booltmp" builder
+        | _ -> raise (Error "invalid binary operator")
+      end
+  | Ast.Call (callee, args) ->
+      (* Look up the name in the module table. *)
+      let callee =
+        match lookup_function callee the_module with
+        | Some callee -> callee
+        | None -> raise (Error "unknown function referenced")
+      in
+      let params = params callee in
+
+      (* If argument mismatch error. *)
+      if Array.length params == Array.length args then () else
+        raise (Error "incorrect # arguments passed");
+      let args = Array.map codegen_expr args in
+      build_call callee args "calltmp" builder
+  | Ast.If (cond, then_, else_) ->
+      let cond = codegen_expr cond in
+
+      (* Convert condition to a bool by comparing equal to 0.0 *)
+      let zero = const_float double_type 0.0 in
+      let cond_val = build_fcmp Fcmp.One cond zero "ifcond" builder in
+
+      (* Grab the first block so that we might later add the conditional branch
+       * to it at the end of the function. *)
+      let start_bb = insertion_block builder in
+      let the_function = block_parent start_bb in
+
+      let then_bb = append_block "then" the_function in
+
+      (* Emit 'then' value. *)
+      position_at_end then_bb builder;
+      let then_val = codegen_expr then_ in
+
+      (* Codegen of 'then' can change the current block, update then_bb for the
+       * phi. We create a new name because one is used for the phi node, and the
+       * other is used for the conditional branch. *)
+      let new_then_bb = insertion_block builder in
+
+      (* Emit 'else' value. *)
+      let else_bb = append_block "else" the_function in
+      position_at_end else_bb builder;
+      let else_val = codegen_expr else_ in
+
+      (* Codegen of 'else' can change the current block, update else_bb for the
+       * phi. *)
+      let new_else_bb = insertion_block builder in
+
+      (* Emit merge block. *)
+      let merge_bb = append_block "ifcont" the_function in
+      position_at_end merge_bb builder;
+      let incoming = [(then_val, new_then_bb); (else_val, new_else_bb)] in
+      let phi = build_phi incoming "iftmp" builder in
+
+      (* Return to the start block to add the conditional branch. *)
+      position_at_end start_bb builder;
+      ignore (build_cond_br cond_val then_bb else_bb builder);
+
+      (* Set a unconditional branch at the end of the 'then' block and the
+       * 'else' block to the 'merge' block. *)
+      position_at_end new_then_bb builder; ignore (build_br merge_bb builder);
+      position_at_end new_else_bb builder; ignore (build_br merge_bb builder);
+
+      (* Finally, set the builder to the end of the merge block. *)
+      position_at_end merge_bb builder;
+
+      phi
+  | Ast.For (var_name, start, end_, step, body) ->
+      (* Emit the start code first, without 'variable' in scope. *)
+      let start_val = codegen_expr start in
+
+      (* Make the new basic block for the loop header, inserting after current
+       * block. *)
+      let preheader_bb = insertion_block builder in
+      let the_function = block_parent preheader_bb in
+      let loop_bb = append_block "loop" the_function in
+
+      (* Insert an explicit fall through from the current block to the
+       * loop_bb. *)
+      ignore (build_br loop_bb builder);
+
+      (* Start insertion in loop_bb. *)
+      position_at_end loop_bb builder;
+
+      (* Start the PHI node with an entry for start. *)
+      let variable = build_phi [(start_val, preheader_bb)] var_name builder in
+
+      (* Within the loop, the variable is defined equal to the PHI node. If it
+       * shadows an existing variable, we have to restore it, so save it
+       * now. *)
+      let old_val =
+        try Some (Hashtbl.find named_values var_name) with Not_found -> None
+      in
+      Hashtbl.add named_values var_name variable;
+
+      (* Emit the body of the loop.  This, like any other expr, can change the
+       * current BB.  Note that we ignore the value computed by the body, but
+       * don't allow an error *)
+      ignore (codegen_expr body);
+
+      (* Emit the step value. *)
+      let step_val =
+        match step with
+        | Some step -> codegen_expr step
+        (* If not specified, use 1.0. *)
+        | None -> const_float double_type 1.0
+      in
+
+      let next_var = build_add variable step_val "nextvar" builder in
+
+      (* Compute the end condition. *)
+      let end_cond = codegen_expr end_ in
+
+      (* Convert condition to a bool by comparing equal to 0.0. *)
+      let zero = const_float double_type 0.0 in
+      let end_cond = build_fcmp Fcmp.One end_cond zero "loopcond" builder in
+
+      (* Create the "after loop" block and insert it. *)
+      let loop_end_bb = insertion_block builder in
+      let after_bb = append_block "afterloop" the_function in
+
+      (* Insert the conditional branch into the end of loop_end_bb. *)
+      ignore (build_cond_br end_cond loop_bb after_bb builder);
+
+      (* Any new code will be inserted in after_bb. *)
+      position_at_end after_bb builder;
+
+      (* Add a new entry to the PHI node for the backedge. *)
+      add_incoming (next_var, loop_end_bb) variable;
+
+      (* Restore the unshadowed variable. *)
+      begin match old_val with
+      | Some old_val -> Hashtbl.add named_values var_name old_val
+      | None -> ()
+      end;
+
+      (* for expr always returns 0.0. *)
+      const_null double_type
+
+let codegen_proto = function
+  | Ast.Prototype (name, args) ->
+      (* Make the function type: double(double,double) etc. *)
+      let doubles = Array.make (Array.length args) double_type in
+      let ft = function_type double_type doubles in
+      let f =
+        match lookup_function name the_module with
+        | None -> declare_function name ft the_module
+
+        (* If 'f' conflicted, there was already something named 'name'. If it
+         * has a body, don't allow redefinition or reextern. *)
+        | Some f ->
+            (* If 'f' already has a body, reject this. *)
+            if block_begin f <> At_end f then
+              raise (Error "redefinition of function");
+
+            (* If 'f' took a different number of arguments, reject. *)
+            if element_type (type_of f) <> ft then
+              raise (Error "redefinition of function with different # args");
+            f
+      in
+
+      (* Set names for all arguments. *)
+      Array.iteri (fun i a ->
+        let n = args.(i) in
+        set_value_name n a;
+        Hashtbl.add named_values n a;
+      ) (params f);
+      f
+
+let codegen_func the_fpm = function
+  | Ast.Function (proto, body) ->
+      Hashtbl.clear named_values;
+      let the_function = codegen_proto proto in
+
+      (* Create a new basic block to start insertion into. *)
+      let bb = append_block "entry" the_function in
+      position_at_end bb builder;
+
+      try
+        let ret_val = codegen_expr body in
+
+        (* Finish off the function. *)
+        let _ = build_ret ret_val builder in
+
+        (* Validate the generated code, checking for consistency. *)
+        Llvm_analysis.assert_valid_function the_function;
+
+        (* Optimize the function. *)
+        let _ = PassManager.run_function the_function the_fpm in
+
+        the_function
+      with e ->
+        delete_function the_function;
+        raise e
+
+
+ +
toplevel.ml:
+
+
+(*===----------------------------------------------------------------------===
+ * Top-Level parsing and JIT Driver
+ *===----------------------------------------------------------------------===*)
+
+open Llvm
+open Llvm_executionengine
+
+(* top ::= definition | external | expression | ';' *)
+let rec main_loop the_fpm the_execution_engine stream =
+  match Stream.peek stream with
+  | None -> ()
+
+  (* ignore top-level semicolons. *)
+  | Some (Token.Kwd ';') ->
+      Stream.junk stream;
+      main_loop the_fpm the_execution_engine stream
+
+  | Some token ->
+      begin
+        try match token with
+        | Token.Def ->
+            let e = Parser.parse_definition stream in
+            print_endline "parsed a function definition.";
+            dump_value (Codegen.codegen_func the_fpm e);
+        | Token.Extern ->
+            let e = Parser.parse_extern stream in
+            print_endline "parsed an extern.";
+            dump_value (Codegen.codegen_proto e);
+        | _ ->
+            (* Evaluate a top-level expression into an anonymous function. *)
+            let e = Parser.parse_toplevel stream in
+            print_endline "parsed a top-level expr";
+            let the_function = Codegen.codegen_func the_fpm e in
+            dump_value the_function;
+
+            (* JIT the function, returning a function pointer. *)
+            let result = ExecutionEngine.run_function the_function [||]
+              the_execution_engine in
+
+            print_string "Evaluated to ";
+            print_float (GenericValue.as_float double_type result);
+            print_newline ();
+        with Stream.Error s | Codegen.Error s ->
+          (* Skip token for error recovery. *)
+          Stream.junk stream;
+          print_endline s;
+      end;
+      print_string "ready> "; flush stdout;
+      main_loop the_fpm the_execution_engine stream
+
+
+ +
toy.ml:
+
+
+(*===----------------------------------------------------------------------===
+ * Main driver code.
+ *===----------------------------------------------------------------------===*)
+
+open Llvm
+open Llvm_executionengine
+open Llvm_target
+open Llvm_scalar_opts
+
+let main () =
+  (* Install standard binary operators.
+   * 1 is the lowest precedence. *)
+  Hashtbl.add Parser.binop_precedence '<' 10;
+  Hashtbl.add Parser.binop_precedence '+' 20;
+  Hashtbl.add Parser.binop_precedence '-' 20;
+  Hashtbl.add Parser.binop_precedence '*' 40;    (* highest. *)
+
+  (* Prime the first token. *)
+  print_string "ready> "; flush stdout;
+  let stream = Lexer.lex (Stream.of_channel stdin) in
+
+  (* Create the JIT. *)
+  let the_module_provider = ModuleProvider.create Codegen.the_module in
+  let the_execution_engine = ExecutionEngine.create the_module_provider in
+  let the_fpm = PassManager.create_function the_module_provider in
+
+  (* Set up the optimizer pipeline.  Start with registering info about how the
+   * target lays out data structures. *)
+  TargetData.add (ExecutionEngine.target_data the_execution_engine) the_fpm;
+
+  (* Do simple "peephole" optimizations and bit-twiddling optzn. *)
+  add_instruction_combining the_fpm;
+
+  (* reassociate expressions. *)
+  add_reassociation the_fpm;
+
+  (* Eliminate Common SubExpressions. *)
+  add_gvn the_fpm;
+
+  (* Simplify the control flow graph (deleting unreachable blocks, etc). *)
+  add_cfg_simplification the_fpm;
+
+  (* Run the main "interpreter loop" now. *)
+  Toplevel.main_loop the_fpm the_execution_engine stream;
+
+  (* Print out all the generated code. *)
+  dump_module Codegen.the_module
+;;
+
+main ()
+
+
+ +
bindings.c
+
+
+#include <stdio.h>
+
+/* putchard - putchar that takes a double and returns 0. */
+extern double putchard(double X) {
+  putchar((char)X);
+  return 0;
+}
+
+
+
+ +Next: Extending the language: user-defined +operators +
+ + +
+
+ Valid CSS! + Valid HTML 4.01! + + Chris Lattner
+ Erick Tryzelaar
+ The LLVM Compiler Infrastructure
+ Last modified: $Date: 2007-10-17 11:05:13 -0700 (Wed, 17 Oct 2007) $ +
+ + Added: llvm/trunk/docs/tutorial/OCamlLangImpl6.html URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/docs/tutorial/OCamlLangImpl6.html?rev=48978&view=auto ============================================================================== --- llvm/trunk/docs/tutorial/OCamlLangImpl6.html (added) +++ llvm/trunk/docs/tutorial/OCamlLangImpl6.html Mon Mar 31 03:44:50 2008 @@ -0,0 +1,1569 @@ + + + + + Kaleidoscope: Extending the Language: User-defined Operators + + + + + + + + +
Kaleidoscope: Extending the Language: User-defined Operators
+ + + +
+

+ Written by Chris Lattner + and Erick Tryzelaar +

+
+ + + + + +
+ +

Welcome to Chapter 6 of the "Implementing a language +with LLVM" tutorial. At this point in our tutorial, we now have a fully +functional language that is fairly minimal, but also useful. There +is still one big problem with it, however. Our language doesn't have many +useful operators (like division, logical negation, or even any comparisons +besides less-than).

+ +

This chapter of the tutorial takes a wild digression into adding user-defined +operators to the simple and beautiful Kaleidoscope language. This digression now +gives us a simple and ugly language in some ways, but also a powerful one at the +same time. One of the great things about creating your own language is that you +get to decide what is good or bad. In this tutorial we'll assume that it is +okay to use this as a way to show some interesting parsing techniques.

+ +

At the end of this tutorial, we'll run through an example Kaleidoscope +application that renders the Mandelbrot set. This gives +an example of what you can build with Kaleidoscope and its feature set.

+ +
+ + + + + +
+ +

+The "operator overloading" that we will add to Kaleidoscope is more general than +languages like C++. In C++, you are only allowed to redefine existing +operators: you can't programatically change the grammar, introduce new +operators, change precedence levels, etc. In this chapter, we will add this +capability to Kaleidoscope, which will let the user round out the set of +operators that are supported.

+ +

The point of going into user-defined operators in a tutorial like this is to +show the power and flexibility of using a hand-written parser. Thus far, the parser +we have been implementing uses recursive descent for most parts of the grammar and +operator precedence parsing for the expressions. See Chapter 2 for details. Without using operator +precedence parsing, it would be very difficult to allow the programmer to +introduce new operators into the grammar: the grammar is dynamically extensible +as the JIT runs.

+ +

The two specific features we'll add are programmable unary operators (right +now, Kaleidoscope has no unary operators at all) as well as binary operators. +An example of this is:

+ +
+
+# Logical unary not.
+def unary!(v)
+  if v then
+    0
+  else
+    1;
+
+# Define > with the same precedence as <.
+def binary> 10 (LHS RHS)
+  RHS < LHS;
+
+# Binary "logical or", (note that it does not "short circuit")
+def binary| 5 (LHS RHS)
+  if LHS then
+    1
+  else if RHS then
+    1
+  else
+    0;
+
+# Define = with slightly lower precedence than relationals.
+def binary= 9 (LHS RHS)
+  !(LHS < RHS | LHS > RHS);
+
+
+ +

Many languages aspire to being able to implement their standard runtime +library in the language itself. In Kaleidoscope, we can implement significant +parts of the language in the library!

+ +

We will break down implementation of these features into two parts: +implementing support for user-defined binary operators and adding unary +operators.

+ +
+ + + + + +
+ +

Adding support for user-defined binary operators is pretty simple with our +current framework. We'll first add support for the unary/binary keywords:

+ +
+
+type token =
+  ...
+  (* operators *)
+  | Binary | Unary
+
+...
+
+and lex_ident buffer = parser
+  ...
+      | "for" -> [< 'Token.For; stream >]
+      | "in" -> [< 'Token.In; stream >]
+      | "binary" -> [< 'Token.Binary; stream >]
+      | "unary" -> [< 'Token.Unary; stream >]
+
+
+ +

This just adds lexer support for the unary and binary keywords, like we +did in previous chapters. One nice +thing about our current AST, is that we represent binary operators with full +generalisation by using their ASCII code as the opcode. For our extended +operators, we'll use this same representation, so we don't need any new AST or +parser support.

+ +

On the other hand, we have to be able to represent the definitions of these +new operators, in the "def binary| 5" part of the function definition. In our +grammar so far, the "name" for the function definition is parsed as the +"prototype" production and into the Ast.Prototype AST node. To +represent our new user-defined operators as prototypes, we have to extend +the Ast.Prototype AST node like this:

+ +
+
+(* proto - This type represents the "prototype" for a function, which captures
+ * its name, and its argument names (thus implicitly the number of arguments the
+ * function takes). *)
+type proto =
+  | Prototype of string * string array
+  | BinOpPrototype of string * string array * int
+
+
+ +

Basically, in addition to knowing a name for the prototype, we now keep track +of whether it was an operator, and if it was, what precedence level the operator +is at. The precedence is only used for binary operators (as you'll see below, +it just doesn't apply for unary operators). Now that we have a way to represent +the prototype for a user-defined operator, we need to parse it:

+ +
+
+(* prototype
+ *   ::= id '(' id* ')'
+ *   ::= binary LETTER number? (id, id)
+ *   ::= unary LETTER number? (id) *)
+let parse_prototype =
+  let rec parse_args accumulator = parser
+    | [< 'Token.Ident id; e=parse_args (id::accumulator) >] -> e
+    | [< >] -> accumulator
+  in
+  let parse_operator = parser
+    | [< 'Token.Unary >] -> "unary", 1
+    | [< 'Token.Binary >] -> "binary", 2
+  in
+  let parse_binary_precedence = parser
+    | [< 'Token.Number n >] -> int_of_float n
+    | [< >] -> 30
+  in
+  parser
+  | [< 'Token.Ident id;
+       'Token.Kwd '(' ?? "expected '(' in prototype";
+       args=parse_args [];
+       'Token.Kwd ')' ?? "expected ')' in prototype" >] ->
+      (* success. *)
+      Ast.Prototype (id, Array.of_list (List.rev args))
+  | [< (prefix, kind)=parse_operator;
+       'Token.Kwd op ?? "expected an operator";
+       (* Read the precedence if present. *)
+       binary_precedence=parse_binary_precedence;
+       'Token.Kwd '(' ?? "expected '(' in prototype";
+        args=parse_args [];
+       'Token.Kwd ')' ?? "expected ')' in prototype" >] ->
+      let name = prefix ^ (String.make 1 op) in
+      let args = Array.of_list (List.rev args) in
+
+      (* Verify right number of arguments for operator. *)
+      if Array.length args != kind
+      then raise (Stream.Error "invalid number of operands for operator")
+      else
+        if kind == 1 then
+          Ast.Prototype (name, args)
+        else
+          Ast.BinOpPrototype (name, args, binary_precedence)
+  | [< >] ->
+      raise (Stream.Error "expected function name in prototype")
+
+
+ +

This is all fairly straightforward parsing code, and we have already seen +a lot of similar code in the past. One interesting part about the code above is +the couple lines that set up name for binary operators. This builds +names like "binary@" for a newly defined "@" operator. This then takes +advantage of the fact that symbol names in the LLVM symbol table are allowed to +have any character in them, including embedded nul characters.

+ +

The next interesting thing to add, is codegen support for these binary +operators. Given our current structure, this is a simple addition of a default +case for our existing binary operator node:

+ +
+
+let codegen_expr = function
+  ...
+  | Ast.Binary (op, lhs, rhs) ->
+      let lhs_val = codegen_expr lhs in
+      let rhs_val = codegen_expr rhs in
+      begin
+        match op with
+        | '+' -> build_add lhs_val rhs_val "addtmp" builder
+        | '-' -> build_sub lhs_val rhs_val "subtmp" builder
+        | '*' -> build_mul lhs_val rhs_val "multmp" builder
+        | '<' ->
+            (* Convert bool 0/1 to double 0.0 or 1.0 *)
+            let i = build_fcmp Fcmp.Ult lhs_val rhs_val "cmptmp" builder in
+            build_uitofp i double_type "booltmp" builder
+        | _ ->
+            (* If it wasn't a builtin binary operator, it must be a user defined
+             * one. Emit a call to it. *)
+            let callee = "binary" ^ (String.make 1 op) in
+            let callee =
+              match lookup_function callee the_module with
+              | Some callee -> callee
+              | None -> raise (Error "binary operator not found!")
+            in
+            build_call callee [|lhs_val; rhs_val|] "binop" builder
+      end
+
+
+ +

As you can see above, the new code is actually really simple. It just does +a lookup for the appropriate operator in the symbol table and generates a +function call to it. Since user-defined operators are just built as normal +functions (because the "prototype" boils down to a function with the right +name) everything falls into place.

+ +

The final piece of code we are missing, is a bit of top level magic:

+ +
+
+let codegen_func the_fpm = function
+  | Ast.Function (proto, body) ->
+      Hashtbl.clear named_values;
+      let the_function = codegen_proto proto in
+
+      (* If this is an operator, install it. *)
+      begin match proto with
+      | Ast.BinOpPrototype (name, args, prec) ->
+          let op = name.[String.length name - 1] in
+          Hashtbl.add Parser.binop_precedence op prec;
+      | _ -> ()
+      end;
+
+      (* Create a new basic block to start insertion into. *)
+      let bb = append_block "entry" the_function in
+      position_at_end bb builder;
+      ...
+
+
+ +

Basically, before codegening a function, if it is a user-defined operator, we +register it in the precedence table. This allows the binary operator parsing +logic we already have in place to handle it. Since we are working on a +fully-general operator precedence parser, this is all we need to do to "extend +the grammar".

+ +

Now we have useful user-defined binary operators. This builds a lot +on the previous framework we built for other operators. Adding unary operators +is a bit more challenging, because we don't have any framework for it yet - lets +see what it takes.

+ +
+ + + + + +
+ +

Since we don't currently support unary operators in the Kaleidoscope +language, we'll need to add everything to support them. Above, we added simple +support for the 'unary' keyword to the lexer. In addition to that, we need an +AST node:

+ +
+
+type expr =
+  ...
+  (* variant for a unary operator. *)
+  | Unary of char * expr
+  ...
+
+
+ +

This AST node is very simple and obvious by now. It directly mirrors the +binary operator AST node, except that it only has one child. With this, we +need to add the parsing logic. Parsing a unary operator is pretty simple: we'll +add a new function to do it:

+ +
+
+(* unary
+ *   ::= primary
+ *   ::= '!' unary *)
+and parse_unary = parser
+  (* If this is a unary operator, read it. *)
+  | [< 'Token.Kwd op when op != '(' && op != ')'; operand=parse_expr >] ->
+      Ast.Unary (op, operand)
+
+  (* If the current token is not an operator, it must be a primary expr. *)
+  | [< stream >] -> parse_primary stream
+
+
+ +

The grammar we add is pretty straightforward here. If we see a unary +operator when parsing a primary operator, we eat the operator as a prefix and +parse the remaining piece as another unary operator. This allows us to handle +multiple unary operators (e.g. "!!x"). Note that unary operators can't have +ambiguous parses like binary operators can, so there is no need for precedence +information.

+ +

The problem with this function, is that we need to call ParseUnary from +somewhere. To do this, we change previous callers of ParsePrimary to call +parse_unary instead:

+ +
+
+(* binoprhs
+ *   ::= ('+' primary)* *)
+and parse_bin_rhs expr_prec lhs stream =
+        ...
+        (* Parse the unary expression after the binary operator. *)
+        let rhs = parse_unary stream in
+        ...
+
+...
+
+(* expression
+ *   ::= primary binoprhs *)
+and parse_expr = parser
+  | [< lhs=parse_unary; stream >] -> parse_bin_rhs 0 lhs stream
+
+
+ +

With these two simple changes, we are now able to parse unary operators and build the +AST for them. Next up, we need to add parser support for prototypes, to parse +the unary operator prototype. We extend the binary operator code above +with:

+ +
+
+(* prototype
+ *   ::= id '(' id* ')'
+ *   ::= binary LETTER number? (id, id)
+ *   ::= unary LETTER number? (id) *)
+let parse_prototype =
+  let rec parse_args accumulator = parser
+    | [< 'Token.Ident id; e=parse_args (id::accumulator) >] -> e
+    | [< >] -> accumulator
+  in
+  let parse_operator = parser
+    | [< 'Token.Unary >] -> "unary", 1
+    | [< 'Token.Binary >] -> "binary", 2
+  in
+  let parse_binary_precedence = parser
+    | [< 'Token.Number n >] -> int_of_float n
+    | [< >] -> 30
+  in
+  parser
+  | [< 'Token.Ident id;
+       'Token.Kwd '(' ?? "expected '(' in prototype";
+       args=parse_args [];
+       'Token.Kwd ')' ?? "expected ')' in prototype" >] ->
+      (* success. *)
+      Ast.Prototype (id, Array.of_list (List.rev args))
+  | [< (prefix, kind)=parse_operator;
+       'Token.Kwd op ?? "expected an operator";
+       (* Read the precedence if present. *)
+       binary_precedence=parse_binary_precedence;
+       'Token.Kwd '(' ?? "expected '(' in prototype";
+        args=parse_args [];
+       'Token.Kwd ')' ?? "expected ')' in prototype" >] ->
+      let name = prefix ^ (String.make 1 op) in
+      let args = Array.of_list (List.rev args) in
+
+      (* Verify right number of arguments for operator. *)
+      if Array.length args != kind
+      then raise (Stream.Error "invalid number of operands for operator")
+      else
+        if kind == 1 then
+          Ast.Prototype (name, args)
+        else
+          Ast.BinOpPrototype (name, args, binary_precedence)
+  | [< >] ->
+      raise (Stream.Error "expected function name in prototype")
+
+
+ +

As with binary operators, we name unary operators with a name that includes +the operator character. This assists us at code generation time. Speaking of, +the final piece we need to add is codegen support for unary operators. It looks +like this:

+ +
+
+let rec codegen_expr = function
+  ...
+  | Ast.Unary (op, operand) ->
+      let operand = codegen_expr operand in
+      let callee = "unary" ^ (String.make 1 op) in
+      let callee =
+        match lookup_function callee the_module with
+        | Some callee -> callee
+        | None -> raise (Error "unknown unary operator")
+      in
+      build_call callee [|operand|] "unop" builder
+
+
+ +

This code is similar to, but simpler than, the code for binary operators. It +is simpler primarily because it doesn't need to handle any predefined operators. +

+ +
+ + + + + +
+ +

It is somewhat hard to believe, but with a few simple extensions we've +covered in the last chapters, we have grown a real-ish language. With this, we +can do a lot of interesting things, including I/O, math, and a bunch of other +things. For example, we can now add a nice sequencing operator (printd is +defined to print out the specified value and a newline):

+ +
+
+ready> extern printd(x);
+Read extern: declare double @printd(double)
+ready> def binary : 1 (x y) 0;  # Low-precedence operator that ignores operands.
+..
+ready> printd(123) : printd(456) : printd(789);
+123.000000
+456.000000
+789.000000
+Evaluated to 0.000000
+
+
+ +

We can also define a bunch of other "primitive" operations, such as:

+ +
+
+# Logical unary not.
+def unary!(v)
+  if v then
+    0
+  else
+    1;
+
+# Unary negate.
+def unary-(v)
+  0-v;
+
+# Define > with the same precedence as >.
+def binary> 10 (LHS RHS)
+  RHS < LHS;
+
+# Binary logical or, which does not short circuit.
+def binary| 5 (LHS RHS)
+  if LHS then
+    1
+  else if RHS then
+    1
+  else
+    0;
+
+# Binary logical and, which does not short circuit.
+def binary& 6 (LHS RHS)
+  if !LHS then
+    0
+  else
+    !!RHS;
+
+# Define = with slightly lower precedence than relationals.
+def binary = 9 (LHS RHS)
+  !(LHS < RHS | LHS > RHS);
+
+
+
+ + +

Given the previous if/then/else support, we can also define interesting +functions for I/O. For example, the following prints out a character whose +"density" reflects the value passed in: the lower the value, the denser the +character:

+ +
+
+ready>
+
+extern putchard(char)
+def printdensity(d)
+  if d > 8 then
+    putchard(32)  # ' '
+  else if d > 4 then
+    putchard(46)  # '.'
+  else if d > 2 then
+    putchard(43)  # '+'
+  else
+    putchard(42); # '*'
+...
+ready> printdensity(1): printdensity(2): printdensity(3) :
+          printdensity(4): printdensity(5): printdensity(9): putchard(10);
+*++..
+Evaluated to 0.000000
+
+
+ +

Based on these simple primitive operations, we can start to define more +interesting things. For example, here's a little function that solves for the +number of iterations it takes a function in the complex plane to +converge:

+ +
+
+# determine whether the specific location diverges.
+# Solve for z = z^2 + c in the complex plane.
+def mandleconverger(real imag iters creal cimag)
+  if iters > 255 | (real*real + imag*imag > 4) then
+    iters
+  else
+    mandleconverger(real*real - imag*imag + creal,
+                    2*real*imag + cimag,
+                    iters+1, creal, cimag);
+
+# return the number of iterations required for the iteration to escape
+def mandleconverge(real imag)
+  mandleconverger(real, imag, 0, real, imag);
+
+
+ +

This "z = z2 + c" function is a beautiful little creature that is the basis +for computation of the Mandelbrot Set. Our +mandelconverge function returns the number of iterations that it takes +for a complex orbit to escape, saturating to 255. This is not a very useful +function by itself, but if you plot its value over a two-dimensional plane, +you can see the Mandelbrot set. Given that we are limited to using putchard +here, our amazing graphical output is limited, but we can whip together +something using the density plotter above:

+ +
+
+# compute and plot the mandlebrot set with the specified 2 dimensional range
+# info.
+def mandelhelp(xmin xmax xstep   ymin ymax ystep)
+  for y = ymin, y < ymax, ystep in (
+    (for x = xmin, x < xmax, xstep in
+       printdensity(mandleconverge(x,y)))
+    : putchard(10)
+  )
+
+# mandel - This is a convenient helper function for ploting the mandelbrot set
+# from the specified position with the specified Magnification.
+def mandel(realstart imagstart realmag imagmag)
+  mandelhelp(realstart, realstart+realmag*78, realmag,
+             imagstart, imagstart+imagmag*40, imagmag);
+
+
+ +

Given this, we can try plotting out the mandlebrot set! Lets try it out:

+ +
+
+ready> mandel(-2.3, -1.3, 0.05, 0.07);
+*******************************+++++++++++*************************************
+*************************+++++++++++++++++++++++*******************************
+**********************+++++++++++++++++++++++++++++****************************
+*******************+++++++++++++++++++++.. ...++++++++*************************
+*****************++++++++++++++++++++++.... ...+++++++++***********************
+***************+++++++++++++++++++++++.....   ...+++++++++*********************
+**************+++++++++++++++++++++++....     ....+++++++++********************
+*************++++++++++++++++++++++......      .....++++++++*******************
+************+++++++++++++++++++++.......       .......+++++++******************
+***********+++++++++++++++++++....                ... .+++++++*****************
+**********+++++++++++++++++.......                     .+++++++****************
+*********++++++++++++++...........                    ...+++++++***************
+********++++++++++++............                      ...++++++++**************
+********++++++++++... ..........                        .++++++++**************
+*******+++++++++.....                                   .+++++++++*************
+*******++++++++......                                  ..+++++++++*************
+*******++++++.......                                   ..+++++++++*************
+*******+++++......                                     ..+++++++++*************
+*******.... ....                                      ...+++++++++*************
+*******.... .                                         ...+++++++++*************
+*******+++++......                                    ...+++++++++*************
+*******++++++.......                                   ..+++++++++*************
+*******++++++++......                                   .+++++++++*************
+*******+++++++++.....                                  ..+++++++++*************
+********++++++++++... ..........                        .++++++++**************
+********++++++++++++............                      ...++++++++**************
+*********++++++++++++++..........                     ...+++++++***************
+**********++++++++++++++++........                     .+++++++****************
+**********++++++++++++++++++++....                ... ..+++++++****************
+***********++++++++++++++++++++++.......       .......++++++++*****************
+************+++++++++++++++++++++++......      ......++++++++******************
+**************+++++++++++++++++++++++....      ....++++++++********************
+***************+++++++++++++++++++++++.....   ...+++++++++*********************
+*****************++++++++++++++++++++++....  ...++++++++***********************
+*******************+++++++++++++++++++++......++++++++*************************
+*********************++++++++++++++++++++++.++++++++***************************
+*************************+++++++++++++++++++++++*******************************
+******************************+++++++++++++************************************
+*******************************************************************************
+*******************************************************************************
+*******************************************************************************
+Evaluated to 0.000000
+ready> mandel(-2, -1, 0.02, 0.04);
+**************************+++++++++++++++++++++++++++++++++++++++++++++++++++++
+***********************++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+*********************+++++++++++++++++++++++++++++++++++++++++++++++++++++++++.
+*******************+++++++++++++++++++++++++++++++++++++++++++++++++++++++++...
+*****************+++++++++++++++++++++++++++++++++++++++++++++++++++++++++.....
+***************++++++++++++++++++++++++++++++++++++++++++++++++++++++++........
+**************++++++++++++++++++++++++++++++++++++++++++++++++++++++...........
+************+++++++++++++++++++++++++++++++++++++++++++++++++++++..............
+***********++++++++++++++++++++++++++++++++++++++++++++++++++........        .
+**********++++++++++++++++++++++++++++++++++++++++++++++.............
+********+++++++++++++++++++++++++++++++++++++++++++..................
+*******+++++++++++++++++++++++++++++++++++++++.......................
+******+++++++++++++++++++++++++++++++++++...........................
+*****++++++++++++++++++++++++++++++++............................
+*****++++++++++++++++++++++++++++...............................
+****++++++++++++++++++++++++++......   .........................
+***++++++++++++++++++++++++.........     ......    ...........
+***++++++++++++++++++++++............
+**+++++++++++++++++++++..............
+**+++++++++++++++++++................
+*++++++++++++++++++.................
+*++++++++++++++++............ ...
+*++++++++++++++..............
+*+++....++++................
+*..........  ...........
+*
+*..........  ...........
+*+++....++++................
+*++++++++++++++..............
+*++++++++++++++++............ ...
+*++++++++++++++++++.................
+**+++++++++++++++++++................
+**+++++++++++++++++++++..............
+***++++++++++++++++++++++............
+***++++++++++++++++++++++++.........     ......    ...........
+****++++++++++++++++++++++++++......   .........................
+*****++++++++++++++++++++++++++++...............................
+*****++++++++++++++++++++++++++++++++............................
+******+++++++++++++++++++++++++++++++++++...........................
+*******+++++++++++++++++++++++++++++++++++++++.......................
+********+++++++++++++++++++++++++++++++++++++++++++..................
+Evaluated to 0.000000
+ready> mandel(-0.9, -1.4, 0.02, 0.03);
+*******************************************************************************
+*******************************************************************************
+*******************************************************************************
+**********+++++++++++++++++++++************************************************
+*+++++++++++++++++++++++++++++++++++++++***************************************
++++++++++++++++++++++++++++++++++++++++++++++**********************************
+++++++++++++++++++++++++++++++++++++++++++++++++++*****************************
+++++++++++++++++++++++++++++++++++++++++++++++++++++++*************************
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++**********************
++++++++++++++++++++++++++++++++++.........++++++++++++++++++*******************
++++++++++++++++++++++++++++++++....   ......+++++++++++++++++++****************
++++++++++++++++++++++++++++++.......  ........+++++++++++++++++++**************
+++++++++++++++++++++++++++++........   ........++++++++++++++++++++************
++++++++++++++++++++++++++++.........     ..  ...+++++++++++++++++++++**********
+++++++++++++++++++++++++++...........        ....++++++++++++++++++++++********
+++++++++++++++++++++++++.............       .......++++++++++++++++++++++******
++++++++++++++++++++++++.............        ........+++++++++++++++++++++++****
+++++++++++++++++++++++...........           ..........++++++++++++++++++++++***
+++++++++++++++++++++...........                .........++++++++++++++++++++++*
+++++++++++++++++++............                  ...........++++++++++++++++++++
+++++++++++++++++...............                 .............++++++++++++++++++
+++++++++++++++.................                 ...............++++++++++++++++
+++++++++++++..................                  .................++++++++++++++
++++++++++..................                      .................+++++++++++++
+++++++........        .                               .........  ..++++++++++++
+++............                                         ......    ....++++++++++
+..............                                                    ...++++++++++
+..............                                                    ....+++++++++
+..............                                                    .....++++++++
+.............                                                    ......++++++++
+...........                                                     .......++++++++
+.........                                                       ........+++++++
+.........                                                       ........+++++++
+.........                                                           ....+++++++
+........                                                             ...+++++++
+.......                                                              ...+++++++
+                                                                    ....+++++++
+                                                                   .....+++++++
+                                                                    ....+++++++
+                                                                    ....+++++++
+                                                                    ....+++++++
+Evaluated to 0.000000
+ready> ^D
+
+
+ +

At this point, you may be starting to realize that Kaleidoscope is a real +and powerful language. It may not be self-similar :), but it can be used to +plot things that are!

+ +

With this, we conclude the "adding user-defined operators" chapter of the +tutorial. We have successfully augmented our language, adding the ability to +extend the language in the library, and we have shown how this can be used to +build a simple but interesting end-user application in Kaleidoscope. At this +point, Kaleidoscope can build a variety of applications that are functional and +can call functions with side-effects, but it can't actually define and mutate a +variable itself.

+ +

Strikingly, variable mutation is an important feature of some +languages, and it is not at all obvious how to add +support for mutable variables without having to add an "SSA construction" +phase to your front-end. In the next chapter, we will describe how you can +add variable mutation without building SSA in your front-end.

+ +
+ + + + + + +
+ +

+Here is the complete code listing for our running example, enhanced with the +if/then/else and for expressions.. To build this example, use: +

+ +
+
+# Compile
+ocamlbuild toy.byte
+# Run
+./toy.byte
+
+
+ +

Here is the code:

+ +
+
_tags:
+
+
+<{lexer,parser}.ml>: use_camlp4, pp(camlp4of)
+<*.{byte,native}>: g++, use_llvm, use_llvm_analysis
+<*.{byte,native}>: use_llvm_executionengine, use_llvm_target
+<*.{byte,native}>: use_llvm_scalar_opts, use_bindings
+
+
+ +
myocamlbuild.ml:
+
+
+open Ocamlbuild_plugin;;
+
+ocaml_lib ~extern:true "llvm";;
+ocaml_lib ~extern:true "llvm_analysis";;
+ocaml_lib ~extern:true "llvm_executionengine";;
+ocaml_lib ~extern:true "llvm_target";;
+ocaml_lib ~extern:true "llvm_scalar_opts";;
+
+flag ["link"; "ocaml"; "g++"] (S[A"-cc"; A"g++"]);;
+dep ["link"; "ocaml"; "use_bindings"] ["bindings.o"];;
+
+
+ +
token.ml:
+
+
+(*===----------------------------------------------------------------------===
+ * Lexer Tokens
+ *===----------------------------------------------------------------------===*)
+
+(* The lexer returns these 'Kwd' if it is an unknown character, otherwise one of
+ * these others for known things. *)
+type token =
+  (* commands *)
+  | Def | Extern
+
+  (* primary *)
+  | Ident of string | Number of float
+
+  (* unknown *)
+  | Kwd of char
+
+  (* control *)
+  | If | Then | Else
+  | For | In
+
+  (* operators *)
+  | Binary | Unary
+
+
+ +
lexer.ml:
+
+
+(*===----------------------------------------------------------------------===
+ * Lexer
+ *===----------------------------------------------------------------------===*)
+
+let rec lex = parser
+  (* Skip any whitespace. *)
+  | [< ' (' ' | '\n' | '\r' | '\t'); stream >] -> lex stream
+
+  (* identifier: [a-zA-Z][a-zA-Z0-9] *)
+  | [< ' ('A' .. 'Z' | 'a' .. 'z' as c); stream >] ->
+      let buffer = Buffer.create 1 in
+      Buffer.add_char buffer c;
+      lex_ident buffer stream
+
+  (* number: [0-9.]+ *)
+  | [< ' ('0' .. '9' as c); stream >] ->
+      let buffer = Buffer.create 1 in
+      Buffer.add_char buffer c;
+      lex_number buffer stream
+
+  (* Comment until end of line. *)
+  | [< ' ('#'); stream >] ->
+      lex_comment stream
+
+  (* Otherwise, just return the character as its ascii value. *)
+  | [< 'c; stream >] ->
+      [< 'Token.Kwd c; lex stream >]
+
+  (* end of stream. *)
+  | [< >] -> [< >]
+
+and lex_number buffer = parser
+  | [< ' ('0' .. '9' | '.' as c); stream >] ->
+      Buffer.add_char buffer c;
+      lex_number buffer stream
+  | [< stream=lex >] ->
+      [< 'Token.Number (float_of_string (Buffer.contents buffer)); stream >]
+
+and lex_ident buffer = parser
+  | [< ' ('A' .. 'Z' | 'a' .. 'z' | '0' .. '9' as c); stream >] ->
+      Buffer.add_char buffer c;
+      lex_ident buffer stream
+  | [< stream=lex >] ->
+      match Buffer.contents buffer with
+      | "def" -> [< 'Token.Def; stream >]
+      | "extern" -> [< 'Token.Extern; stream >]
+      | "if" -> [< 'Token.If; stream >]
+      | "then" -> [< 'Token.Then; stream >]
+      | "else" -> [< 'Token.Else; stream >]
+      | "for" -> [< 'Token.For; stream >]
+      | "in" -> [< 'Token.In; stream >]
+      | "binary" -> [< 'Token.Binary; stream >]
+      | "unary" -> [< 'Token.Unary; stream >]
+      | id -> [< 'Token.Ident id; stream >]
+
+and lex_comment = parser
+  | [< ' ('\n'); stream=lex >] -> stream
+  | [< 'c; e=lex_comment >] -> e
+  | [< >] -> [< >]
+
+
+ +
ast.ml:
+
+
+(*===----------------------------------------------------------------------===
+ * Abstract Syntax Tree (aka Parse Tree)
+ *===----------------------------------------------------------------------===*)
+
+(* expr - Base type for all expression nodes. *)
+type expr =
+  (* variant for numeric literals like "1.0". *)
+  | Number of float
+
+  (* variant for referencing a variable, like "a". *)
+  | Variable of string
+
+  (* variant for a unary operator. *)
+  | Unary of char * expr
+
+  (* variant for a binary operator. *)
+  | Binary of char * expr * expr
+
+  (* variant for function calls. *)
+  | Call of string * expr array
+
+  (* variant for if/then/else. *)
+  | If of expr * expr * expr
+
+  (* variant for for/in. *)
+  | For of string * expr * expr * expr option * expr
+
+(* proto - This type represents the "prototype" for a function, which captures
+ * its name, and its argument names (thus implicitly the number of arguments the
+ * function takes). *)
+type proto =
+  | Prototype of string * string array
+  | BinOpPrototype of string * string array * int
+
+(* func - This type represents a function definition itself. *)
+type func = Function of proto * expr
+
+
+ +
parser.ml:
+
+
+(*===---------------------------------------------------------------------===
+ * Parser
+ *===---------------------------------------------------------------------===*)
+
+(* binop_precedence - This holds the precedence for each binary operator that is
+ * defined *)
+let binop_precedence:(char, int) Hashtbl.t = Hashtbl.create 10
+
+(* precedence - Get the precedence of the pending binary operator token. *)
+let precedence c = try Hashtbl.find binop_precedence c with Not_found -> -1
+
+(* primary
+ *   ::= identifier
+ *   ::= numberexpr
+ *   ::= parenexpr
+ *   ::= ifexpr
+ *   ::= forexpr *)
+let rec parse_primary = parser
+  (* numberexpr ::= number *)
+  | [< 'Token.Number n >] -> Ast.Number n
+
+  (* parenexpr ::= '(' expression ')' *)
+  | [< 'Token.Kwd '('; e=parse_expr; 'Token.Kwd ')' ?? "expected ')'" >] -> e
+
+  (* identifierexpr
+   *   ::= identifier
+   *   ::= identifier '(' argumentexpr ')' *)
+  | [< 'Token.Ident id; stream >] ->
+      let rec parse_args accumulator = parser
+        | [< e=parse_expr; stream >] ->
+            begin parser
+              | [< 'Token.Kwd ','; e=parse_args (e :: accumulator) >] -> e
+              | [< >] -> e :: accumulator
+            end stream
+        | [< >] -> accumulator
+      in
+      let rec parse_ident id = parser
+        (* Call. *)
+        | [< 'Token.Kwd '(';
+             args=parse_args [];
+             'Token.Kwd ')' ?? "expected ')'">] ->
+            Ast.Call (id, Array.of_list (List.rev args))
+
+        (* Simple variable ref. *)
+        | [< >] -> Ast.Variable id
+      in
+      parse_ident id stream
+
+  (* ifexpr ::= 'if' expr 'then' expr 'else' expr *)
+  | [< 'Token.If; c=parse_expr;
+       'Token.Then ?? "expected 'then'"; t=parse_expr;
+       'Token.Else ?? "expected 'else'"; e=parse_expr >] ->
+      Ast.If (c, t, e)
+
+  (* forexpr
+        ::= 'for' identifier '=' expr ',' expr (',' expr)? 'in' expression *)
+  | [< 'Token.For;
+       'Token.Ident id ?? "expected identifier after for";
+       'Token.Kwd '=' ?? "expected '=' after for";
+       stream >] ->
+      begin parser
+        | [<
+             start=parse_expr;
+             'Token.Kwd ',' ?? "expected ',' after for";
+             end_=parse_expr;
+             stream >] ->
+            let step =
+              begin parser
+              | [< 'Token.Kwd ','; step=parse_expr >] -> Some step
+              | [< >] -> None
+              end stream
+            in
+            begin parser
+            | [< 'Token.In; body=parse_expr >] ->
+                Ast.For (id, start, end_, step, body)
+            | [< >] ->
+                raise (Stream.Error "expected 'in' after for")
+            end stream
+        | [< >] ->
+            raise (Stream.Error "expected '=' after for")
+      end stream
+
+  | [< >] -> raise (Stream.Error "unknown token when expecting an expression.")
+
+(* unary
+ *   ::= primary
+ *   ::= '!' unary *)
+and parse_unary = parser
+  (* If this is a unary operator, read it. *)
+  | [< 'Token.Kwd op when op != '(' && op != ')'; operand=parse_expr >] ->
+      Ast.Unary (op, operand)
+
+  (* If the current token is not an operator, it must be a primary expr. *)
+  | [< stream >] -> parse_primary stream
+
+(* binoprhs
+ *   ::= ('+' primary)* *)
+and parse_bin_rhs expr_prec lhs stream =
+  match Stream.peek stream with
+  (* If this is a binop, find its precedence. *)
+  | Some (Token.Kwd c) when Hashtbl.mem binop_precedence c ->
+      let token_prec = precedence c in
+
+      (* If this is a binop that binds at least as tightly as the current binop,
+       * consume it, otherwise we are done. *)
+      if token_prec < expr_prec then lhs else begin
+        (* Eat the binop. *)
+        Stream.junk stream;
+
+        (* Parse the unary expression after the binary operator. *)
+        let rhs = parse_unary stream in
+
+        (* Okay, we know this is a binop. *)
+        let rhs =
+          match Stream.peek stream with
+          | Some (Token.Kwd c2) ->
+              (* If BinOp binds less tightly with rhs than the operator after
+               * rhs, let the pending operator take rhs as its lhs. *)
+              let next_prec = precedence c2 in
+              if token_prec < next_prec
+              then parse_bin_rhs (token_prec + 1) rhs stream
+              else rhs
+          | _ -> rhs
+        in
+
+        (* Merge lhs/rhs. *)
+        let lhs = Ast.Binary (c, lhs, rhs) in
+        parse_bin_rhs expr_prec lhs stream
+      end
+  | _ -> lhs
+
+(* expression
+ *   ::= primary binoprhs *)
+and parse_expr = parser
+  | [< lhs=parse_unary; stream >] -> parse_bin_rhs 0 lhs stream
+
+(* prototype
+ *   ::= id '(' id* ')'
+ *   ::= binary LETTER number? (id, id)
+ *   ::= unary LETTER number? (id) *)
+let parse_prototype =
+  let rec parse_args accumulator = parser
+    | [< 'Token.Ident id; e=parse_args (id::accumulator) >] -> e
+    | [< >] -> accumulator
+  in
+  let parse_operator = parser
+    | [< 'Token.Unary >] -> "unary", 1
+    | [< 'Token.Binary >] -> "binary", 2
+  in
+  let parse_binary_precedence = parser
+    | [< 'Token.Number n >] -> int_of_float n
+    | [< >] -> 30
+  in
+  parser
+  | [< 'Token.Ident id;
+       'Token.Kwd '(' ?? "expected '(' in prototype";
+       args=parse_args [];
+       'Token.Kwd ')' ?? "expected ')' in prototype" >] ->
+      (* success. *)
+      Ast.Prototype (id, Array.of_list (List.rev args))
+  | [< (prefix, kind)=parse_operator;
+       'Token.Kwd op ?? "expected an operator";
+       (* Read the precedence if present. *)
+       binary_precedence=parse_binary_precedence;
+       'Token.Kwd '(' ?? "expected '(' in prototype";
+        args=parse_args [];
+       'Token.Kwd ')' ?? "expected ')' in prototype" >] ->
+      let name = prefix ^ (String.make 1 op) in
+      let args = Array.of_list (List.rev args) in
+
+      (* Verify right number of arguments for operator. *)
+      if Array.length args != kind
+      then raise (Stream.Error "invalid number of operands for operator")
+      else
+        if kind == 1 then
+          Ast.Prototype (name, args)
+        else
+          Ast.BinOpPrototype (name, args, binary_precedence)
+  | [< >] ->
+      raise (Stream.Error "expected function name in prototype")
+
+(* definition ::= 'def' prototype expression *)
+let parse_definition = parser
+  | [< 'Token.Def; p=parse_prototype; e=parse_expr >] ->
+      Ast.Function (p, e)
+
+(* toplevelexpr ::= expression *)
+let parse_toplevel = parser
+  | [< e=parse_expr >] ->
+      (* Make an anonymous proto. *)
+      Ast.Function (Ast.Prototype ("", [||]), e)
+
+(*  external ::= 'extern' prototype *)
+let parse_extern = parser
+  | [< 'Token.Extern; e=parse_prototype >] -> e
+
+
+ +
codegen.ml:
+
+
+(*===----------------------------------------------------------------------===
+ * Code Generation
+ *===----------------------------------------------------------------------===*)
+
+open Llvm
+
+exception Error of string
+
+let the_module = create_module "my cool jit"
+let builder = builder ()
+let named_values:(string, llvalue) Hashtbl.t = Hashtbl.create 10
+
+let rec codegen_expr = function
+  | Ast.Number n -> const_float double_type n
+  | Ast.Variable name ->
+      (try Hashtbl.find named_values name with
+        | Not_found -> raise (Error "unknown variable name"))
+  | Ast.Unary (op, operand) ->
+      let operand = codegen_expr operand in
+      let callee = "unary" ^ (String.make 1 op) in
+      let callee =
+        match lookup_function callee the_module with
+        | Some callee -> callee
+        | None -> raise (Error "unknown unary operator")
+      in
+      build_call callee [|operand|] "unop" builder
+  | Ast.Binary (op, lhs, rhs) ->
+      let lhs_val = codegen_expr lhs in
+      let rhs_val = codegen_expr rhs in
+      begin
+        match op with
+        | '+' -> build_add lhs_val rhs_val "addtmp" builder
+        | '-' -> build_sub lhs_val rhs_val "subtmp" builder
+        | '*' -> build_mul lhs_val rhs_val "multmp" builder
+        | '<' ->
+            (* Convert bool 0/1 to double 0.0 or 1.0 *)
+            let i = build_fcmp Fcmp.Ult lhs_val rhs_val "cmptmp" builder in
+            build_uitofp i double_type "booltmp" builder
+        | _ ->
+            (* If it wasn't a builtin binary operator, it must be a user defined
+             * one. Emit a call to it. *)
+            let callee = "binary" ^ (String.make 1 op) in
+            let callee =
+              match lookup_function callee the_module with
+              | Some callee -> callee
+              | None -> raise (Error "binary operator not found!")
+            in
+            build_call callee [|lhs_val; rhs_val|] "binop" builder
+      end
+  | Ast.Call (callee, args) ->
+      (* Look up the name in the module table. *)
+      let callee =
+        match lookup_function callee the_module with
+        | Some callee -> callee
+        | None -> raise (Error "unknown function referenced")
+      in
+      let params = params callee in
+
+      (* If argument mismatch error. *)
+      if Array.length params == Array.length args then () else
+        raise (Error "incorrect # arguments passed");
+      let args = Array.map codegen_expr args in
+      build_call callee args "calltmp" builder
+  | Ast.If (cond, then_, else_) ->
+      let cond = codegen_expr cond in
+
+      (* Convert condition to a bool by comparing equal to 0.0 *)
+      let zero = const_float double_type 0.0 in
+      let cond_val = build_fcmp Fcmp.One cond zero "ifcond" builder in
+
+      (* Grab the first block so that we might later add the conditional branch
+       * to it at the end of the function. *)
+      let start_bb = insertion_block builder in
+      let the_function = block_parent start_bb in
+
+      let then_bb = append_block "then" the_function in
+
+      (* Emit 'then' value. *)
+      position_at_end then_bb builder;
+      let then_val = codegen_expr then_ in
+
+      (* Codegen of 'then' can change the current block, update then_bb for the
+       * phi. We create a new name because one is used for the phi node, and the
+       * other is used for the conditional branch. *)
+      let new_then_bb = insertion_block builder in
+
+      (* Emit 'else' value. *)
+      let else_bb = append_block "else" the_function in
+      position_at_end else_bb builder;
+      let else_val = codegen_expr else_ in
+
+      (* Codegen of 'else' can change the current block, update else_bb for the
+       * phi. *)
+      let new_else_bb = insertion_block builder in
+
+      (* Emit merge block. *)
+      let merge_bb = append_block "ifcont" the_function in
+      position_at_end merge_bb builder;
+      let incoming = [(then_val, new_then_bb); (else_val, new_else_bb)] in
+      let phi = build_phi incoming "iftmp" builder in
+
+      (* Return to the start block to add the conditional branch. *)
+      position_at_end start_bb builder;
+      ignore (build_cond_br cond_val then_bb else_bb builder);
+
+      (* Set a unconditional branch at the end of the 'then' block and the
+       * 'else' block to the 'merge' block. *)
+      position_at_end new_then_bb builder; ignore (build_br merge_bb builder);
+      position_at_end new_else_bb builder; ignore (build_br merge_bb builder);
+
+      (* Finally, set the builder to the end of the merge block. *)
+      position_at_end merge_bb builder;
+
+      phi
+  | Ast.For (var_name, start, end_, step, body) ->
+      (* Emit the start code first, without 'variable' in scope. *)
+      let start_val = codegen_expr start in
+
+      (* Make the new basic block for the loop header, inserting after current
+       * block. *)
+      let preheader_bb = insertion_block builder in
+      let the_function = block_parent preheader_bb in
+      let loop_bb = append_block "loop" the_function in
+
+      (* Insert an explicit fall through from the current block to the
+       * loop_bb. *)
+      ignore (build_br loop_bb builder);
+
+      (* Start insertion in loop_bb. *)
+      position_at_end loop_bb builder;
+
+      (* Start the PHI node with an entry for start. *)
+      let variable = build_phi [(start_val, preheader_bb)] var_name builder in
+
+      (* Within the loop, the variable is defined equal to the PHI node. If it
+       * shadows an existing variable, we have to restore it, so save it
+       * now. *)
+      let old_val =
+        try Some (Hashtbl.find named_values var_name) with Not_found -> None
+      in
+      Hashtbl.add named_values var_name variable;
+
+      (* Emit the body of the loop.  This, like any other expr, can change the
+       * current BB.  Note that we ignore the value computed by the body, but
+       * don't allow an error *)
+      ignore (codegen_expr body);
+
+      (* Emit the step value. *)
+      let step_val =
+        match step with
+        | Some step -> codegen_expr step
+        (* If not specified, use 1.0. *)
+        | None -> const_float double_type 1.0
+      in
+
+      let next_var = build_add variable step_val "nextvar" builder in
+
+      (* Compute the end condition. *)
+      let end_cond = codegen_expr end_ in
+
+      (* Convert condition to a bool by comparing equal to 0.0. *)
+      let zero = const_float double_type 0.0 in
+      let end_cond = build_fcmp Fcmp.One end_cond zero "loopcond" builder in
+
+      (* Create the "after loop" block and insert it. *)
+      let loop_end_bb = insertion_block builder in
+      let after_bb = append_block "afterloop" the_function in
+
+      (* Insert the conditional branch into the end of loop_end_bb. *)
+      ignore (build_cond_br end_cond loop_bb after_bb builder);
+
+      (* Any new code will be inserted in after_bb. *)
+      position_at_end after_bb builder;
+
+      (* Add a new entry to the PHI node for the backedge. *)
+      add_incoming (next_var, loop_end_bb) variable;
+
+      (* Restore the unshadowed variable. *)
+      begin match old_val with
+      | Some old_val -> Hashtbl.add named_values var_name old_val
+      | None -> ()
+      end;
+
+      (* for expr always returns 0.0. *)
+      const_null double_type
+
+let codegen_proto = function
+  | Ast.Prototype (name, args) | Ast.BinOpPrototype (name, args, _) ->
+      (* Make the function type: double(double,double) etc. *)
+      let doubles = Array.make (Array.length args) double_type in
+      let ft = function_type double_type doubles in
+      let f =
+        match lookup_function name the_module with
+        | None -> declare_function name ft the_module
+
+        (* If 'f' conflicted, there was already something named 'name'. If it
+         * has a body, don't allow redefinition or reextern. *)
+        | Some f ->
+            (* If 'f' already has a body, reject this. *)
+            if block_begin f <> At_end f then
+              raise (Error "redefinition of function");
+
+            (* If 'f' took a different number of arguments, reject. *)
+            if element_type (type_of f) <> ft then
+              raise (Error "redefinition of function with different # args");
+            f
+      in
+
+      (* Set names for all arguments. *)
+      Array.iteri (fun i a ->
+        let n = args.(i) in
+        set_value_name n a;
+        Hashtbl.add named_values n a;
+      ) (params f);
+      f
+
+let codegen_func the_fpm = function
+  | Ast.Function (proto, body) ->
+      Hashtbl.clear named_values;
+      let the_function = codegen_proto proto in
+
+      (* If this is an operator, install it. *)
+      begin match proto with
+      | Ast.BinOpPrototype (name, args, prec) ->
+          let op = name.[String.length name - 1] in
+          Hashtbl.add Parser.binop_precedence op prec;
+      | _ -> ()
+      end;
+
+      (* Create a new basic block to start insertion into. *)
+      let bb = append_block "entry" the_function in
+      position_at_end bb builder;
+
+      try
+        let ret_val = codegen_expr body in
+
+        (* Finish off the function. *)
+        let _ = build_ret ret_val builder in
+
+        (* Validate the generated code, checking for consistency. *)
+        Llvm_analysis.assert_valid_function the_function;
+
+        (* Optimize the function. *)
+        let _ = PassManager.run_function the_function the_fpm in
+
+        the_function
+      with e ->
+        delete_function the_function;
+        raise e
+
+
+ +
toplevel.ml:
+
+
+(*===----------------------------------------------------------------------===
+ * Top-Level parsing and JIT Driver
+ *===----------------------------------------------------------------------===*)
+
+open Llvm
+open Llvm_executionengine
+
+(* top ::= definition | external | expression | ';' *)
+let rec main_loop the_fpm the_execution_engine stream =
+  match Stream.peek stream with
+  | None -> ()
+
+  (* ignore top-level semicolons. *)
+  | Some (Token.Kwd ';') ->
+      Stream.junk stream;
+      main_loop the_fpm the_execution_engine stream
+
+  | Some token ->
+      begin
+        try match token with
+        | Token.Def ->
+            let e = Parser.parse_definition stream in
+            print_endline "parsed a function definition.";
+            dump_value (Codegen.codegen_func the_fpm e);
+        | Token.Extern ->
+            let e = Parser.parse_extern stream in
+            print_endline "parsed an extern.";
+            dump_value (Codegen.codegen_proto e);
+        | _ ->
+            (* Evaluate a top-level expression into an anonymous function. *)
+            let e = Parser.parse_toplevel stream in
+            print_endline "parsed a top-level expr";
+            let the_function = Codegen.codegen_func the_fpm e in
+            dump_value the_function;
+
+            (* JIT the function, returning a function pointer. *)
+            let result = ExecutionEngine.run_function the_function [||]
+              the_execution_engine in
+
+            print_string "Evaluated to ";
+            print_float (GenericValue.as_float double_type result);
+            print_newline ();
+        with Stream.Error s | Codegen.Error s ->
+          (* Skip token for error recovery. *)
+          Stream.junk stream;
+          print_endline s;
+      end;
+      print_string "ready> "; flush stdout;
+      main_loop the_fpm the_execution_engine stream
+
+
+ +
toy.ml:
+
+
+(*===----------------------------------------------------------------------===
+ * Main driver code.
+ *===----------------------------------------------------------------------===*)
+
+open Llvm
+open Llvm_executionengine
+open Llvm_target
+open Llvm_scalar_opts
+
+let main () =
+  (* Install standard binary operators.
+   * 1 is the lowest precedence. *)
+  Hashtbl.add Parser.binop_precedence '<' 10;
+  Hashtbl.add Parser.binop_precedence '+' 20;
+  Hashtbl.add Parser.binop_precedence '-' 20;
+  Hashtbl.add Parser.binop_precedence '*' 40;    (* highest. *)
+
+  (* Prime the first token. *)
+  print_string "ready> "; flush stdout;
+  let stream = Lexer.lex (Stream.of_channel stdin) in
+
+  (* Create the JIT. *)
+  let the_module_provider = ModuleProvider.create Codegen.the_module in
+  let the_execution_engine = ExecutionEngine.create the_module_provider in
+  let the_fpm = PassManager.create_function the_module_provider in
+
+  (* Set up the optimizer pipeline.  Start with registering info about how the
+   * target lays out data structures. *)
+  TargetData.add (ExecutionEngine.target_data the_execution_engine) the_fpm;
+
+  (* Do simple "peephole" optimizations and bit-twiddling optzn. *)
+  add_instruction_combining the_fpm;
+
+  (* reassociate expressions. *)
+  add_reassociation the_fpm;
+
+  (* Eliminate Common SubExpressions. *)
+  add_gvn the_fpm;
+
+  (* Simplify the control flow graph (deleting unreachable blocks, etc). *)
+  add_cfg_simplification the_fpm;
+
+  (* Run the main "interpreter loop" now. *)
+  Toplevel.main_loop the_fpm the_execution_engine stream;
+
+  (* Print out all the generated code. *)
+  dump_module Codegen.the_module
+;;
+
+main ()
+
+
+ +
bindings.c
+
+
+#include <stdio.h>
+
+/* putchard - putchar that takes a double and returns 0. */
+extern double putchard(double X) {
+  putchar((char)X);
+  return 0;
+}
+
+/* printd - printf that takes a double prints it as "%f\n", returning 0. */
+extern double printd(double X) {
+  printf("%f\n", X);
+  return 0;
+}
+
+
+
+ +Next: Extending the language: mutable variables / +SSA construction +
+ + +
+
+ Valid CSS! + Valid HTML 4.01! + + Chris Lattner
+ Erick Tryzelaar
+ The LLVM Compiler Infrastructure
+ Last modified: $Date: 2007-10-17 11:05:13 -0700 (Wed, 17 Oct 2007) $ +
+ + Added: llvm/trunk/docs/tutorial/OCamlLangImpl7.html URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/docs/tutorial/OCamlLangImpl7.html?rev=48978&view=auto ============================================================================== --- llvm/trunk/docs/tutorial/OCamlLangImpl7.html (added) +++ llvm/trunk/docs/tutorial/OCamlLangImpl7.html Mon Mar 31 03:44:50 2008 @@ -0,0 +1,1902 @@ + + + + + Kaleidoscope: Extending the Language: Mutable Variables / SSA + construction + + + + + + + + +
Kaleidoscope: Extending the Language: Mutable Variables
+ + + +
+

+ Written by Chris Lattner + and Erick Tryzelaar +

+
+ + + + + +
+ +

Welcome to Chapter 7 of the "Implementing a language +with LLVM" tutorial. In chapters 1 through 6, we've built a very +respectable, albeit simple, functional +programming language. In our journey, we learned some parsing techniques, +how to build and represent an AST, how to build LLVM IR, and how to optimize +the resultant code as well as JIT compile it.

+ +

While Kaleidoscope is interesting as a functional language, the fact that it +is functional makes it "too easy" to generate LLVM IR for it. In particular, a +functional language makes it very easy to build LLVM IR directly in SSA form. +Since LLVM requires that the input code be in SSA form, this is a very nice +property and it is often unclear to newcomers how to generate code for an +imperative language with mutable variables.

+ +

The short (and happy) summary of this chapter is that there is no need for +your front-end to build SSA form: LLVM provides highly tuned and well tested +support for this, though the way it works is a bit unexpected for some.

+ +
+ + + + + +
+ +

+To understand why mutable variables cause complexities in SSA construction, +consider this extremely simple C example: +

+ +
+
+int G, H;
+int test(_Bool Condition) {
+  int X;
+  if (Condition)
+    X = G;
+  else
+    X = H;
+  return X;
+}
+
+
+ +

In this case, we have the variable "X", whose value depends on the path +executed in the program. Because there are two different possible values for X +before the return instruction, a PHI node is inserted to merge the two values. +The LLVM IR that we want for this example looks like this:

+ +
+
+ at G = weak global i32 0   ; type of @G is i32*
+ at H = weak global i32 0   ; type of @H is i32*
+
+define i32 @test(i1 %Condition) {
+entry:
+  br i1 %Condition, label %cond_true, label %cond_false
+
+cond_true:
+  %X.0 = load i32* @G
+  br label %cond_next
+
+cond_false:
+  %X.1 = load i32* @H
+  br label %cond_next
+
+cond_next:
+  %X.2 = phi i32 [ %X.1, %cond_false ], [ %X.0, %cond_true ]
+  ret i32 %X.2
+}
+
+
+ +

In this example, the loads from the G and H global variables are explicit in +the LLVM IR, and they live in the then/else branches of the if statement +(cond_true/cond_false). In order to merge the incoming values, the X.2 phi node +in the cond_next block selects the right value to use based on where control +flow is coming from: if control flow comes from the cond_false block, X.2 gets +the value of X.1. Alternatively, if control flow comes from cond_true, it gets +the value of X.0. The intent of this chapter is not to explain the details of +SSA form. For more information, see one of the many online +references.

+ +

The question for this article is "who places the phi nodes when lowering +assignments to mutable variables?". The issue here is that LLVM +requires that its IR be in SSA form: there is no "non-ssa" mode for it. +However, SSA construction requires non-trivial algorithms and data structures, +so it is inconvenient and wasteful for every front-end to have to reproduce this +logic.

+ +
+ + + + + +
+ +

The 'trick' here is that while LLVM does require all register values to be +in SSA form, it does not require (or permit) memory objects to be in SSA form. +In the example above, note that the loads from G and H are direct accesses to +G and H: they are not renamed or versioned. This differs from some other +compiler systems, which do try to version memory objects. In LLVM, instead of +encoding dataflow analysis of memory into the LLVM IR, it is handled with Analysis Passes which are computed on +demand.

+ +

+With this in mind, the high-level idea is that we want to make a stack variable +(which lives in memory, because it is on the stack) for each mutable object in +a function. To take advantage of this trick, we need to talk about how LLVM +represents stack variables. +

+ +

In LLVM, all memory accesses are explicit with load/store instructions, and +it is carefully designed not to have (or need) an "address-of" operator. Notice +how the type of the @G/@H global variables is actually "i32*" even though the +variable is defined as "i32". What this means is that @G defines space +for an i32 in the global data area, but its name actually refers to the +address for that space. Stack variables work the same way, except that instead of +being declared with global variable definitions, they are declared with the +LLVM alloca instruction:

+ +
+
+define i32 @example() {
+entry:
+  %X = alloca i32           ; type of %X is i32*.
+  ...
+  %tmp = load i32* %X       ; load the stack value %X from the stack.
+  %tmp2 = add i32 %tmp, 1   ; increment it
+  store i32 %tmp2, i32* %X  ; store it back
+  ...
+
+
+ +

This code shows an example of how you can declare and manipulate a stack +variable in the LLVM IR. Stack memory allocated with the alloca instruction is +fully general: you can pass the address of the stack slot to functions, you can +store it in other variables, etc. In our example above, we could rewrite the +example to use the alloca technique to avoid using a PHI node:

+ +
+
+ at G = weak global i32 0   ; type of @G is i32*
+ at H = weak global i32 0   ; type of @H is i32*
+
+define i32 @test(i1 %Condition) {
+entry:
+  %X = alloca i32           ; type of %X is i32*.
+  br i1 %Condition, label %cond_true, label %cond_false
+
+cond_true:
+  %X.0 = load i32* @G
+        store i32 %X.0, i32* %X   ; Update X
+  br label %cond_next
+
+cond_false:
+  %X.1 = load i32* @H
+        store i32 %X.1, i32* %X   ; Update X
+  br label %cond_next
+
+cond_next:
+  %X.2 = load i32* %X       ; Read X
+  ret i32 %X.2
+}
+
+
+ +

With this, we have discovered a way to handle arbitrary mutable variables +without the need to create Phi nodes at all:

+ +
    +
  1. Each mutable variable becomes a stack allocation.
  2. +
  3. Each read of the variable becomes a load from the stack.
  4. +
  5. Each update of the variable becomes a store to the stack.
  6. +
  7. Taking the address of a variable just uses the stack address directly.
  8. +
+ +

While this solution has solved our immediate problem, it introduced another +one: we have now apparently introduced a lot of stack traffic for very simple +and common operations, a major performance problem. Fortunately for us, the +LLVM optimizer has a highly-tuned optimization pass named "mem2reg" that handles +this case, promoting allocas like this into SSA registers, inserting Phi nodes +as appropriate. If you run this example through the pass, for example, you'll +get:

+ +
+
+$ llvm-as < example.ll | opt -mem2reg | llvm-dis
+ at G = weak global i32 0
+ at H = weak global i32 0
+
+define i32 @test(i1 %Condition) {
+entry:
+  br i1 %Condition, label %cond_true, label %cond_false
+
+cond_true:
+  %X.0 = load i32* @G
+  br label %cond_next
+
+cond_false:
+  %X.1 = load i32* @H
+  br label %cond_next
+
+cond_next:
+  %X.01 = phi i32 [ %X.1, %cond_false ], [ %X.0, %cond_true ]
+  ret i32 %X.01
+}
+
+
+ +

The mem2reg pass implements the standard "iterated dominance frontier" +algorithm for constructing SSA form and has a number of optimizations that speed +up (very common) degenerate cases. The mem2reg optimization pass is the answer +to dealing with mutable variables, and we highly recommend that you depend on +it. Note that mem2reg only works on variables in certain circumstances:

+ +
    +
  1. mem2reg is alloca-driven: it looks for allocas and if it can handle them, it +promotes them. It does not apply to global variables or heap allocations.
  2. + +
  3. mem2reg only looks for alloca instructions in the entry block of the +function. Being in the entry block guarantees that the alloca is only executed +once, which makes analysis simpler.
  4. + +
  5. mem2reg only promotes allocas whose uses are direct loads and stores. If +the address of the stack object is passed to a function, or if any funny pointer +arithmetic is involved, the alloca will not be promoted.
  6. + +
  7. mem2reg only works on allocas of first class +values (such as pointers, scalars and vectors), and only if the array size +of the allocation is 1 (or missing in the .ll file). mem2reg is not capable of +promoting structs or arrays to registers. Note that the "scalarrepl" pass is +more powerful and can promote structs, "unions", and arrays in many cases.
  8. + +
+ +

+All of these properties are easy to satisfy for most imperative languages, and +we'll illustrate it below with Kaleidoscope. The final question you may be +asking is: should I bother with this nonsense for my front-end? Wouldn't it be +better if I just did SSA construction directly, avoiding use of the mem2reg +optimization pass? In short, we strongly recommend that you use this technique +for building SSA form, unless there is an extremely good reason not to. Using +this technique is:

+ +
    +
  • Proven and well tested: llvm-gcc and clang both use this technique for local +mutable variables. As such, the most common clients of LLVM are using this to +handle a bulk of their variables. You can be sure that bugs are found fast and +fixed early.
  • + +
  • Extremely Fast: mem2reg has a number of special cases that make it fast in +common cases as well as fully general. For example, it has fast-paths for +variables that are only used in a single block, variables that only have one +assignment point, good heuristics to avoid insertion of unneeded phi nodes, etc. +
  • + +
  • Needed for debug info generation: +Debug information in LLVM relies on having the address of the variable +exposed so that debug info can be attached to it. This technique dovetails +very naturally with this style of debug info.
  • +
+ +

If nothing else, this makes it much easier to get your front-end up and +running, and is very simple to implement. Lets extend Kaleidoscope with mutable +variables now! +

+ +
+ + + + + +
+ +

Now that we know the sort of problem we want to tackle, lets see what this +looks like in the context of our little Kaleidoscope language. We're going to +add two features:

+ +
    +
  1. The ability to mutate variables with the '=' operator.
  2. +
  3. The ability to define new variables.
  4. +
+ +

While the first item is really what this is about, we only have variables +for incoming arguments as well as for induction variables, and redefining those only +goes so far :). Also, the ability to define new variables is a +useful thing regardless of whether you will be mutating them. Here's a +motivating example that shows how we could use these:

+ +
+
+# Define ':' for sequencing: as a low-precedence operator that ignores operands
+# and just returns the RHS.
+def binary : 1 (x y) y;
+
+# Recursive fib, we could do this before.
+def fib(x)
+  if (x < 3) then
+    1
+  else
+    fib(x-1)+fib(x-2);
+
+# Iterative fib.
+def fibi(x)
+  var a = 1, b = 1, c in
+  (for i = 3, i < x in
+     c = a + b :
+     a = b :
+     b = c) :
+  b;
+
+# Call it.
+fibi(10);
+
+
+ +

+In order to mutate variables, we have to change our existing variables to use +the "alloca trick". Once we have that, we'll add our new operator, then extend +Kaleidoscope to support new variable definitions. +

+ +
+ + + + + +
+ +

+The symbol table in Kaleidoscope is managed at code generation time by the +'named_values' map. This map currently keeps track of the LLVM +"Value*" that holds the double value for the named variable. In order to +support mutation, we need to change this slightly, so that it +named_values holds the memory location of the variable in +question. Note that this change is a refactoring: it changes the structure of +the code, but does not (by itself) change the behavior of the compiler. All of +these changes are isolated in the Kaleidoscope code generator.

+ +

+At this point in Kaleidoscope's development, it only supports variables for two +things: incoming arguments to functions and the induction variable of 'for' +loops. For consistency, we'll allow mutation of these variables in addition to +other user-defined variables. This means that these will both need memory +locations. +

+ +

To start our transformation of Kaleidoscope, we'll change the +named_values map so that it maps to AllocaInst* instead of Value*. +Once we do this, the C++ compiler will tell us what parts of the code we need to +update:

+ +

Note: the ocaml bindings currently model both Value*s and +AllocInst*s as Llvm.llvalues, but this may change in the +future to be more type safe.

+ +
+
+let named_values:(string, llvalue) Hashtbl.t = Hashtbl.create 10
+
+
+ +

Also, since we will need to create these alloca's, we'll use a helper +function that ensures that the allocas are created in the entry block of the +function:

+ +
+
+(* Create an alloca instruction in the entry block of the function. This
+ * is used for mutable variables etc. *)
+let create_entry_block_alloca the_function var_name =
+  let builder = builder_at (instr_begin (entry_block the_function)) in
+  build_alloca double_type var_name builder
+
+
+ +

This funny looking code creates an Llvm.llbuilder object that is +pointing at the first instruction of the entry block. It then creates an alloca +with the expected name and returns it. Because all values in Kaleidoscope are +doubles, there is no need to pass in a type to use.

+ +

With this in place, the first functionality change we want to make is to +variable references. In our new scheme, variables live on the stack, so code +generating a reference to them actually needs to produce a load from the stack +slot:

+ +
+
+let rec codegen_expr = function
+  ...
+  | Ast.Variable name ->
+      let v = try Hashtbl.find named_values name with
+        | Not_found -> raise (Error "unknown variable name")
+      in
+      (* Load the value. *)
+      build_load v name builder
+
+
+ +

As you can see, this is pretty straightforward. Now we need to update the +things that define the variables to set up the alloca. We'll start with +codegen_expr Ast.For ... (see the full code listing +for the unabridged code):

+ +
+
+  | Ast.For (var_name, start, end_, step, body) ->
+      let the_function = block_parent (insertion_block builder) in
+
+      (* Create an alloca for the variable in the entry block. *)
+      let alloca = create_entry_block_alloca the_function var_name in
+
+      (* Emit the start code first, without 'variable' in scope. *)
+      let start_val = codegen_expr start in
+
+      (* Store the value into the alloca. *)
+      ignore(build_store start_val alloca builder);
+
+      ...
+
+      (* Within the loop, the variable is defined equal to the PHI node. If it
+       * shadows an existing variable, we have to restore it, so save it
+       * now. *)
+      let old_val =
+        try Some (Hashtbl.find named_values var_name) with Not_found -> None
+      in
+      Hashtbl.add named_values var_name alloca;
+
+      ...
+
+      (* Compute the end condition. *)
+      let end_cond = codegen_expr end_ in
+
+      (* Reload, increment, and restore the alloca. This handles the case where
+       * the body of the loop mutates the variable. *)
+      let cur_var = build_load alloca var_name builder in
+      let next_var = build_add cur_var step_val "nextvar" builder in
+      ignore(build_store next_var alloca builder);
+      ...
+
+
+ +

This code is virtually identical to the code before we allowed mutable variables. +The big difference is that we no longer have to construct a PHI node, and we use +load/store to access the variable as needed.

+ +

To support mutable argument variables, we need to also make allocas for them. +The code for this is also pretty simple:

+ +
+
+(* Create an alloca for each argument and register the argument in the symbol
+ * table so that references to it will succeed. *)
+let create_argument_allocas the_function proto =
+  let args = match proto with
+    | Ast.Prototype (_, args) | Ast.BinOpPrototype (_, args, _) -> args
+  in
+  Array.iteri (fun i ai ->
+    let var_name = args.(i) in
+    (* Create an alloca for this variable. *)
+    let alloca = create_entry_block_alloca the_function var_name in
+
+    (* Store the initial value into the alloca. *)
+    ignore(build_store ai alloca builder);
+
+    (* Add arguments to variable symbol table. *)
+    Hashtbl.add named_values var_name alloca;
+  ) (params the_function)
+
+
+ +

For each argument, we make an alloca, store the input value to the function +into the alloca, and register the alloca as the memory location for the +argument. This method gets invoked by Codegen.codegen_func right after +it sets up the entry block for the function.

+ +

The final missing piece is adding the mem2reg pass, which allows us to get +good codegen once again:

+ +
+
+let main () =
+  ...
+  let the_fpm = PassManager.create_function the_module_provider in
+
+  (* Set up the optimizer pipeline.  Start with registering info about how the
+   * target lays out data structures. *)
+  TargetData.add (ExecutionEngine.target_data the_execution_engine) the_fpm;
+
+  (* Promote allocas to registers. *)
+  add_memory_to_register_promotion the_fpm;
+
+  (* Do simple "peephole" optimizations and bit-twiddling optzn. *)
+  add_instruction_combining the_fpm;
+
+  (* reassociate expressions. *)
+  add_reassociation the_fpm;
+
+
+ +

It is interesting to see what the code looks like before and after the +mem2reg optimization runs. For example, this is the before/after code for our +recursive fib function. Before the optimization:

+ +
+
+define double @fib(double %x) {
+entry:
+  %x1 = alloca double
+  store double %x, double* %x1
+  %x2 = load double* %x1
+  %cmptmp = fcmp ult double %x2, 3.000000e+00
+  %booltmp = uitofp i1 %cmptmp to double
+  %ifcond = fcmp one double %booltmp, 0.000000e+00
+  br i1 %ifcond, label %then, label %else
+
+then:    ; preds = %entry
+  br label %ifcont
+
+else:    ; preds = %entry
+  %x3 = load double* %x1
+  %subtmp = sub double %x3, 1.000000e+00
+  %calltmp = call double @fib( double %subtmp )
+  %x4 = load double* %x1
+  %subtmp5 = sub double %x4, 2.000000e+00
+  %calltmp6 = call double @fib( double %subtmp5 )
+  %addtmp = add double %calltmp, %calltmp6
+  br label %ifcont
+
+ifcont:    ; preds = %else, %then
+  %iftmp = phi double [ 1.000000e+00, %then ], [ %addtmp, %else ]
+  ret double %iftmp
+}
+
+
+ +

Here there is only one variable (x, the input argument) but you can still +see the extremely simple-minded code generation strategy we are using. In the +entry block, an alloca is created, and the initial input value is stored into +it. Each reference to the variable does a reload from the stack. Also, note +that we didn't modify the if/then/else expression, so it still inserts a PHI +node. While we could make an alloca for it, it is actually easier to create a +PHI node for it, so we still just make the PHI.

+ +

Here is the code after the mem2reg pass runs:

+ +
+
+define double @fib(double %x) {
+entry:
+  %cmptmp = fcmp ult double %x, 3.000000e+00
+  %booltmp = uitofp i1 %cmptmp to double
+  %ifcond = fcmp one double %booltmp, 0.000000e+00
+  br i1 %ifcond, label %then, label %else
+
+then:
+  br label %ifcont
+
+else:
+  %subtmp = sub double %x, 1.000000e+00
+  %calltmp = call double @fib( double %subtmp )
+  %subtmp5 = sub double %x, 2.000000e+00
+  %calltmp6 = call double @fib( double %subtmp5 )
+  %addtmp = add double %calltmp, %calltmp6
+  br label %ifcont
+
+ifcont:    ; preds = %else, %then
+  %iftmp = phi double [ 1.000000e+00, %then ], [ %addtmp, %else ]
+  ret double %iftmp
+}
+
+
+ +

This is a trivial case for mem2reg, since there are no redefinitions of the +variable. The point of showing this is to calm your tension about inserting +such blatent inefficiencies :).

+ +

After the rest of the optimizers run, we get:

+ +
+
+define double @fib(double %x) {
+entry:
+  %cmptmp = fcmp ult double %x, 3.000000e+00
+  %booltmp = uitofp i1 %cmptmp to double
+  %ifcond = fcmp ueq double %booltmp, 0.000000e+00
+  br i1 %ifcond, label %else, label %ifcont
+
+else:
+  %subtmp = sub double %x, 1.000000e+00
+  %calltmp = call double @fib( double %subtmp )
+  %subtmp5 = sub double %x, 2.000000e+00
+  %calltmp6 = call double @fib( double %subtmp5 )
+  %addtmp = add double %calltmp, %calltmp6
+  ret double %addtmp
+
+ifcont:
+  ret double 1.000000e+00
+}
+
+
+ +

Here we see that the simplifycfg pass decided to clone the return instruction +into the end of the 'else' block. This allowed it to eliminate some branches +and the PHI node.

+ +

Now that all symbol table references are updated to use stack variables, +we'll add the assignment operator.

+ +
+ + + + + +
+ +

With our current framework, adding a new assignment operator is really +simple. We will parse it just like any other binary operator, but handle it +internally (instead of allowing the user to define it). The first step is to +set a precedence:

+ +
+
+let main () =
+  (* Install standard binary operators.
+   * 1 is the lowest precedence. *)
+  Hashtbl.add Parser.binop_precedence '=' 2;
+  Hashtbl.add Parser.binop_precedence '<' 10;
+  Hashtbl.add Parser.binop_precedence '+' 20;
+  Hashtbl.add Parser.binop_precedence '-' 20;
+  ...
+
+
+ +

Now that the parser knows the precedence of the binary operator, it takes +care of all the parsing and AST generation. We just need to implement codegen +for the assignment operator. This looks like:

+ +
+
+let rec codegen_expr = function
+      begin match op with
+      | '=' ->
+          (* Special case '=' because we don't want to emit the LHS as an
+           * expression. *)
+          let name =
+            match lhs with
+            | Ast.Variable name -> name
+            | _ -> raise (Error "destination of '=' must be a variable")
+          in
+
+
+ +

Unlike the rest of the binary operators, our assignment operator doesn't +follow the "emit LHS, emit RHS, do computation" model. As such, it is handled +as a special case before the other binary operators are handled. The other +strange thing is that it requires the LHS to be a variable. It is invalid to +have "(x+1) = expr" - only things like "x = expr" are allowed. +

+ + +
+
+          (* Codegen the rhs. *)
+          let val_ = codegen_expr rhs in
+
+          (* Lookup the name. *)
+          let variable = try Hashtbl.find named_values name with
+          | Not_found -> raise (Error "unknown variable name")
+          in
+          ignore(build_store val_ variable builder);
+          val_
+      | _ ->
+			...
+
+
+ +

Once we have the variable, codegen'ing the assignment is straightforward: +we emit the RHS of the assignment, create a store, and return the computed +value. Returning a value allows for chained assignments like "X = (Y = Z)".

+ +

Now that we have an assignment operator, we can mutate loop variables and +arguments. For example, we can now run code like this:

+ +
+
+# Function to print a double.
+extern printd(x);
+
+# Define ':' for sequencing: as a low-precedence operator that ignores operands
+# and just returns the RHS.
+def binary : 1 (x y) y;
+
+def test(x)
+  printd(x) :
+  x = 4 :
+  printd(x);
+
+test(123);
+
+
+ +

When run, this example prints "123" and then "4", showing that we did +actually mutate the value! Okay, we have now officially implemented our goal: +getting this to work requires SSA construction in the general case. However, +to be really useful, we want the ability to define our own local variables, lets +add this next! +

+ +
+ + + + + +
+ +

Adding var/in is just like any other other extensions we made to +Kaleidoscope: we extend the lexer, the parser, the AST and the code generator. +The first step for adding our new 'var/in' construct is to extend the lexer. +As before, this is pretty trivial, the code looks like this:

+ +
+
+type token =
+  ...
+  (* var definition *)
+  | Var
+
+...
+
+and lex_ident buffer = parser
+      ...
+      | "in" -> [< 'Token.In; stream >]
+      | "binary" -> [< 'Token.Binary; stream >]
+      | "unary" -> [< 'Token.Unary; stream >]
+      | "var" -> [< 'Token.Var; stream >]
+      ...
+
+
+ +

The next step is to define the AST node that we will construct. For var/in, +it looks like this:

+ +
+
+type expr =
+  ...
+  (* variant for var/in. *)
+  | Var of (string * expr option) array * expr
+  ...
+
+
+ +

var/in allows a list of names to be defined all at once, and each name can +optionally have an initializer value. As such, we capture this information in +the VarNames vector. Also, var/in has a body, this body is allowed to access +the variables defined by the var/in.

+ +

With this in place, we can define the parser pieces. The first thing we do +is add it as a primary expression:

+ +
+
+(* primary
+ *   ::= identifier
+ *   ::= numberexpr
+ *   ::= parenexpr
+ *   ::= ifexpr
+ *   ::= forexpr
+ *   ::= varexpr *)
+let rec parse_primary = parser
+  ...
+  (* varexpr
+   *   ::= 'var' identifier ('=' expression?
+   *             (',' identifier ('=' expression)?)* 'in' expression *)
+  | [< 'Token.Var;
+       (* At least one variable name is required. *)
+       'Token.Ident id ?? "expected identifier after var";
+       init=parse_var_init;
+       var_names=parse_var_names [(id, init)];
+       (* At this point, we have to have 'in'. *)
+       'Token.In ?? "expected 'in' keyword after 'var'";
+       body=parse_expr >] ->
+      Ast.Var (Array.of_list (List.rev var_names), body)
+
+...
+
+and parse_var_init = parser
+  (* read in the optional initializer. *)
+  | [< 'Token.Kwd '='; e=parse_expr >] -> Some e
+  | [< >] -> None
+
+and parse_var_names accumulator = parser
+  | [< 'Token.Kwd ',';
+       'Token.Ident id ?? "expected identifier list after var";
+       init=parse_var_init;
+       e=parse_var_names ((id, init) :: accumulator) >] -> e
+  | [< >] -> accumulator
+
+
+ +

Now that we can parse and represent the code, we need to support emission of +LLVM IR for it. This code starts out with:

+ +
+
+let rec codegen_expr = function
+  ...
+  | Ast.Var (var_names, body)
+      let old_bindings = ref [] in
+
+      let the_function = block_parent (insertion_block builder) in
+
+      (* Register all variables and emit their initializer. *)
+      Array.iter (fun (var_name, init) ->
+
+
+ +

Basically it loops over all the variables, installing them one at a time. +For each variable we put into the symbol table, we remember the previous value +that we replace in OldBindings.

+ +
+
+        (* Emit the initializer before adding the variable to scope, this
+         * prevents the initializer from referencing the variable itself, and
+         * permits stuff like this:
+         *   var a = 1 in
+         *     var a = a in ...   # refers to outer 'a'. *)
+        let init_val =
+          match init with
+          | Some init -> codegen_expr init
+          (* If not specified, use 0.0. *)
+          | None -> const_float double_type 0.0
+        in
+
+        let alloca = create_entry_block_alloca the_function var_name in
+        ignore(build_store init_val alloca builder);
+
+        (* Remember the old variable binding so that we can restore the binding
+         * when we unrecurse. *)
+
+        begin
+          try
+            let old_value = Hashtbl.find named_values var_name in
+            old_bindings := (var_name, old_value) :: !old_bindings;
+          with Not_found > ()
+        end;
+
+        (* Remember this binding. *)
+        Hashtbl.add named_values var_name alloca;
+      ) var_names;
+
+
+ +

There are more comments here than code. The basic idea is that we emit the +initializer, create the alloca, then update the symbol table to point to it. +Once all the variables are installed in the symbol table, we evaluate the body +of the var/in expression:

+ +
+
+      (* Codegen the body, now that all vars are in scope. *)
+      let body_val = codegen_expr body in
+
+
+ +

Finally, before returning, we restore the previous variable bindings:

+ +
+
+      (* Pop all our variables from scope. *)
+      List.iter (fun (var_name, old_value) ->
+        Hashtbl.add named_values var_name old_value
+      ) !old_bindings;
+
+      (* Return the body computation. *)
+      body_val
+
+
+ +

The end result of all of this is that we get properly scoped variable +definitions, and we even (trivially) allow mutation of them :).

+ +

With this, we completed what we set out to do. Our nice iterative fib +example from the intro compiles and runs just fine. The mem2reg pass optimizes +all of our stack variables into SSA registers, inserting PHI nodes where needed, +and our front-end remains simple: no "iterated dominance frontier" computation +anywhere in sight.

+ +
+ + + + + +
+ +

+Here is the complete code listing for our running example, enhanced with mutable +variables and var/in support. To build this example, use: +

+ +
+
+# Compile
+ocamlbuild toy.byte
+# Run
+./toy.byte
+
+
+ +

Here is the code:

+ +
+
_tags:
+
+
+<{lexer,parser}.ml>: use_camlp4, pp(camlp4of)
+<*.{byte,native}>: g++, use_llvm, use_llvm_analysis
+<*.{byte,native}>: use_llvm_executionengine, use_llvm_target
+<*.{byte,native}>: use_llvm_scalar_opts, use_bindings
+
+
+ +
myocamlbuild.ml:
+
+
+open Ocamlbuild_plugin;;
+
+ocaml_lib ~extern:true "llvm";;
+ocaml_lib ~extern:true "llvm_analysis";;
+ocaml_lib ~extern:true "llvm_executionengine";;
+ocaml_lib ~extern:true "llvm_target";;
+ocaml_lib ~extern:true "llvm_scalar_opts";;
+
+flag ["link"; "ocaml"; "g++"] (S[A"-cc"; A"g++"]);;
+dep ["link"; "ocaml"; "use_bindings"] ["bindings.o"];;
+
+
+ +
token.ml:
+
+
+(*===----------------------------------------------------------------------===
+ * Lexer Tokens
+ *===----------------------------------------------------------------------===*)
+
+(* The lexer returns these 'Kwd' if it is an unknown character, otherwise one of
+ * these others for known things. *)
+type token =
+  (* commands *)
+  | Def | Extern
+
+  (* primary *)
+  | Ident of string | Number of float
+
+  (* unknown *)
+  | Kwd of char
+
+  (* control *)
+  | If | Then | Else
+  | For | In
+
+  (* operators *)
+  | Binary | Unary
+
+  (* var definition *)
+  | Var
+
+
+ +
lexer.ml:
+
+
+(*===----------------------------------------------------------------------===
+ * Lexer
+ *===----------------------------------------------------------------------===*)
+
+let rec lex = parser
+  (* Skip any whitespace. *)
+  | [< ' (' ' | '\n' | '\r' | '\t'); stream >] -> lex stream
+
+  (* identifier: [a-zA-Z][a-zA-Z0-9] *)
+  | [< ' ('A' .. 'Z' | 'a' .. 'z' as c); stream >] ->
+      let buffer = Buffer.create 1 in
+      Buffer.add_char buffer c;
+      lex_ident buffer stream
+
+  (* number: [0-9.]+ *)
+  | [< ' ('0' .. '9' as c); stream >] ->
+      let buffer = Buffer.create 1 in
+      Buffer.add_char buffer c;
+      lex_number buffer stream
+
+  (* Comment until end of line. *)
+  | [< ' ('#'); stream >] ->
+      lex_comment stream
+
+  (* Otherwise, just return the character as its ascii value. *)
+  | [< 'c; stream >] ->
+      [< 'Token.Kwd c; lex stream >]
+
+  (* end of stream. *)
+  | [< >] -> [< >]
+
+and lex_number buffer = parser
+  | [< ' ('0' .. '9' | '.' as c); stream >] ->
+      Buffer.add_char buffer c;
+      lex_number buffer stream
+  | [< stream=lex >] ->
+      [< 'Token.Number (float_of_string (Buffer.contents buffer)); stream >]
+
+and lex_ident buffer = parser
+  | [< ' ('A' .. 'Z' | 'a' .. 'z' | '0' .. '9' as c); stream >] ->
+      Buffer.add_char buffer c;
+      lex_ident buffer stream
+  | [< stream=lex >] ->
+      match Buffer.contents buffer with
+      | "def" -> [< 'Token.Def; stream >]
+      | "extern" -> [< 'Token.Extern; stream >]
+      | "if" -> [< 'Token.If; stream >]
+      | "then" -> [< 'Token.Then; stream >]
+      | "else" -> [< 'Token.Else; stream >]
+      | "for" -> [< 'Token.For; stream >]
+      | "in" -> [< 'Token.In; stream >]
+      | "binary" -> [< 'Token.Binary; stream >]
+      | "unary" -> [< 'Token.Unary; stream >]
+      | "var" -> [< 'Token.Var; stream >]
+      | id -> [< 'Token.Ident id; stream >]
+
+and lex_comment = parser
+  | [< ' ('\n'); stream=lex >] -> stream
+  | [< 'c; e=lex_comment >] -> e
+  | [< >] -> [< >]
+
+
+ +
ast.ml:
+
+
+(*===----------------------------------------------------------------------===
+ * Abstract Syntax Tree (aka Parse Tree)
+ *===----------------------------------------------------------------------===*)
+
+(* expr - Base type for all expression nodes. *)
+type expr =
+  (* variant for numeric literals like "1.0". *)
+  | Number of float
+
+  (* variant for referencing a variable, like "a". *)
+  | Variable of string
+
+  (* variant for a unary operator. *)
+  | Unary of char * expr
+
+  (* variant for a binary operator. *)
+  | Binary of char * expr * expr
+
+  (* variant for function calls. *)
+  | Call of string * expr array
+
+  (* variant for if/then/else. *)
+  | If of expr * expr * expr
+
+  (* variant for for/in. *)
+  | For of string * expr * expr * expr option * expr
+
+  (* variant for var/in. *)
+  | Var of (string * expr option) array * expr
+
+(* proto - This type represents the "prototype" for a function, which captures
+ * its name, and its argument names (thus implicitly the number of arguments the
+ * function takes). *)
+type proto =
+  | Prototype of string * string array
+  | BinOpPrototype of string * string array * int
+
+(* func - This type represents a function definition itself. *)
+type func = Function of proto * expr
+
+
+ +
parser.ml:
+
+
+(*===---------------------------------------------------------------------===
+ * Parser
+ *===---------------------------------------------------------------------===*)
+
+(* binop_precedence - This holds the precedence for each binary operator that is
+ * defined *)
+let binop_precedence:(char, int) Hashtbl.t = Hashtbl.create 10
+
+(* precedence - Get the precedence of the pending binary operator token. *)
+let precedence c = try Hashtbl.find binop_precedence c with Not_found -> -1
+
+(* primary
+ *   ::= identifier
+ *   ::= numberexpr
+ *   ::= parenexpr
+ *   ::= ifexpr
+ *   ::= forexpr
+ *   ::= varexpr *)
+let rec parse_primary = parser
+  (* numberexpr ::= number *)
+  | [< 'Token.Number n >] -> Ast.Number n
+
+  (* parenexpr ::= '(' expression ')' *)
+  | [< 'Token.Kwd '('; e=parse_expr; 'Token.Kwd ')' ?? "expected ')'" >] -> e
+
+  (* identifierexpr
+   *   ::= identifier
+   *   ::= identifier '(' argumentexpr ')' *)
+  | [< 'Token.Ident id; stream >] ->
+      let rec parse_args accumulator = parser
+        | [< e=parse_expr; stream >] ->
+            begin parser
+              | [< 'Token.Kwd ','; e=parse_args (e :: accumulator) >] -> e
+              | [< >] -> e :: accumulator
+            end stream
+        | [< >] -> accumulator
+      in
+      let rec parse_ident id = parser
+        (* Call. *)
+        | [< 'Token.Kwd '(';
+             args=parse_args [];
+             'Token.Kwd ')' ?? "expected ')'">] ->
+            Ast.Call (id, Array.of_list (List.rev args))
+
+        (* Simple variable ref. *)
+        | [< >] -> Ast.Variable id
+      in
+      parse_ident id stream
+
+  (* ifexpr ::= 'if' expr 'then' expr 'else' expr *)
+  | [< 'Token.If; c=parse_expr;
+       'Token.Then ?? "expected 'then'"; t=parse_expr;
+       'Token.Else ?? "expected 'else'"; e=parse_expr >] ->
+      Ast.If (c, t, e)
+
+  (* forexpr
+        ::= 'for' identifier '=' expr ',' expr (',' expr)? 'in' expression *)
+  | [< 'Token.For;
+       'Token.Ident id ?? "expected identifier after for";
+       'Token.Kwd '=' ?? "expected '=' after for";
+       stream >] ->
+      begin parser
+        | [<
+             start=parse_expr;
+             'Token.Kwd ',' ?? "expected ',' after for";
+             end_=parse_expr;
+             stream >] ->
+            let step =
+              begin parser
+              | [< 'Token.Kwd ','; step=parse_expr >] -> Some step
+              | [< >] -> None
+              end stream
+            in
+            begin parser
+            | [< 'Token.In; body=parse_expr >] ->
+                Ast.For (id, start, end_, step, body)
+            | [< >] ->
+                raise (Stream.Error "expected 'in' after for")
+            end stream
+        | [< >] ->
+            raise (Stream.Error "expected '=' after for")
+      end stream
+
+  (* varexpr
+   *   ::= 'var' identifier ('=' expression?
+   *             (',' identifier ('=' expression)?)* 'in' expression *)
+  | [< 'Token.Var;
+       (* At least one variable name is required. *)
+       'Token.Ident id ?? "expected identifier after var";
+       init=parse_var_init;
+       var_names=parse_var_names [(id, init)];
+       (* At this point, we have to have 'in'. *)
+       'Token.In ?? "expected 'in' keyword after 'var'";
+       body=parse_expr >] ->
+      Ast.Var (Array.of_list (List.rev var_names), body)
+
+  | [< >] -> raise (Stream.Error "unknown token when expecting an expression.")
+
+(* unary
+ *   ::= primary
+ *   ::= '!' unary *)
+and parse_unary = parser
+  (* If this is a unary operator, read it. *)
+  | [< 'Token.Kwd op when op != '(' && op != ')'; operand=parse_expr >] ->
+      Ast.Unary (op, operand)
+
+  (* If the current token is not an operator, it must be a primary expr. *)
+  | [< stream >] -> parse_primary stream
+
+(* binoprhs
+ *   ::= ('+' primary)* *)
+and parse_bin_rhs expr_prec lhs stream =
+  match Stream.peek stream with
+  (* If this is a binop, find its precedence. *)
+  | Some (Token.Kwd c) when Hashtbl.mem binop_precedence c ->
+      let token_prec = precedence c in
+
+      (* If this is a binop that binds at least as tightly as the current binop,
+       * consume it, otherwise we are done. *)
+      if token_prec < expr_prec then lhs else begin
+        (* Eat the binop. *)
+        Stream.junk stream;
+
+        (* Parse the primary expression after the binary operator. *)
+        let rhs = parse_unary stream in
+
+        (* Okay, we know this is a binop. *)
+        let rhs =
+          match Stream.peek stream with
+          | Some (Token.Kwd c2) ->
+              (* If BinOp binds less tightly with rhs than the operator after
+               * rhs, let the pending operator take rhs as its lhs. *)
+              let next_prec = precedence c2 in
+              if token_prec < next_prec
+              then parse_bin_rhs (token_prec + 1) rhs stream
+              else rhs
+          | _ -> rhs
+        in
+
+        (* Merge lhs/rhs. *)
+        let lhs = Ast.Binary (c, lhs, rhs) in
+        parse_bin_rhs expr_prec lhs stream
+      end
+  | _ -> lhs
+
+and parse_var_init = parser
+  (* read in the optional initializer. *)
+  | [< 'Token.Kwd '='; e=parse_expr >] -> Some e
+  | [< >] -> None
+
+and parse_var_names accumulator = parser
+  | [< 'Token.Kwd ',';
+       'Token.Ident id ?? "expected identifier list after var";
+       init=parse_var_init;
+       e=parse_var_names ((id, init) :: accumulator) >] -> e
+  | [< >] -> accumulator
+
+(* expression
+ *   ::= primary binoprhs *)
+and parse_expr = parser
+  | [< lhs=parse_unary; stream >] -> parse_bin_rhs 0 lhs stream
+
+(* prototype
+ *   ::= id '(' id* ')'
+ *   ::= binary LETTER number? (id, id)
+ *   ::= unary LETTER number? (id) *)
+let parse_prototype =
+  let rec parse_args accumulator = parser
+    | [< 'Token.Ident id; e=parse_args (id::accumulator) >] -> e
+    | [< >] -> accumulator
+  in
+  let parse_operator = parser
+    | [< 'Token.Unary >] -> "unary", 1
+    | [< 'Token.Binary >] -> "binary", 2
+  in
+  let parse_binary_precedence = parser
+    | [< 'Token.Number n >] -> int_of_float n
+    | [< >] -> 30
+  in
+  parser
+  | [< 'Token.Ident id;
+       'Token.Kwd '(' ?? "expected '(' in prototype";
+       args=parse_args [];
+       'Token.Kwd ')' ?? "expected ')' in prototype" >] ->
+      (* success. *)
+      Ast.Prototype (id, Array.of_list (List.rev args))
+  | [< (prefix, kind)=parse_operator;
+       'Token.Kwd op ?? "expected an operator";
+       (* Read the precedence if present. *)
+       binary_precedence=parse_binary_precedence;
+       'Token.Kwd '(' ?? "expected '(' in prototype";
+        args=parse_args [];
+       'Token.Kwd ')' ?? "expected ')' in prototype" >] ->
+      let name = prefix ^ (String.make 1 op) in
+      let args = Array.of_list (List.rev args) in
+
+      (* Verify right number of arguments for operator. *)
+      if Array.length args != kind
+      then raise (Stream.Error "invalid number of operands for operator")
+      else
+        if kind == 1 then
+          Ast.Prototype (name, args)
+        else
+          Ast.BinOpPrototype (name, args, binary_precedence)
+  | [< >] ->
+      raise (Stream.Error "expected function name in prototype")
+
+(* definition ::= 'def' prototype expression *)
+let parse_definition = parser
+  | [< 'Token.Def; p=parse_prototype; e=parse_expr >] ->
+      Ast.Function (p, e)
+
+(* toplevelexpr ::= expression *)
+let parse_toplevel = parser
+  | [< e=parse_expr >] ->
+      (* Make an anonymous proto. *)
+      Ast.Function (Ast.Prototype ("", [||]), e)
+
+(*  external ::= 'extern' prototype *)
+let parse_extern = parser
+  | [< 'Token.Extern; e=parse_prototype >] -> e
+
+
+ +
codegen.ml:
+
+
+(*===----------------------------------------------------------------------===
+ * Code Generation
+ *===----------------------------------------------------------------------===*)
+
+open Llvm
+
+exception Error of string
+
+let the_module = create_module "my cool jit"
+let builder = builder ()
+let named_values:(string, llvalue) Hashtbl.t = Hashtbl.create 10
+
+(* Create an alloca instruction in the entry block of the function. This
+ * is used for mutable variables etc. *)
+let create_entry_block_alloca the_function var_name =
+  let builder = builder_at (instr_begin (entry_block the_function)) in
+  build_alloca double_type var_name builder
+
+let rec codegen_expr = function
+  | Ast.Number n -> const_float double_type n
+  | Ast.Variable name ->
+      let v = try Hashtbl.find named_values name with
+        | Not_found -> raise (Error "unknown variable name")
+      in
+      (* Load the value. *)
+      build_load v name builder
+  | Ast.Unary (op, operand) ->
+      let operand = codegen_expr operand in
+      let callee = "unary" ^ (String.make 1 op) in
+      let callee =
+        match lookup_function callee the_module with
+        | Some callee -> callee
+        | None -> raise (Error "unknown unary operator")
+      in
+      build_call callee [|operand|] "unop" builder
+  | Ast.Binary (op, lhs, rhs) ->
+      begin match op with
+      | '=' ->
+          (* Special case '=' because we don't want to emit the LHS as an
+           * expression. *)
+          let name =
+            match lhs with
+            | Ast.Variable name -> name
+            | _ -> raise (Error "destination of '=' must be a variable")
+          in
+
+          (* Codegen the rhs. *)
+          let val_ = codegen_expr rhs in
+
+          (* Lookup the name. *)
+          let variable = try Hashtbl.find named_values name with
+          | Not_found -> raise (Error "unknown variable name")
+          in
+          ignore(build_store val_ variable builder);
+          val_
+      | _ ->
+          let lhs_val = codegen_expr lhs in
+          let rhs_val = codegen_expr rhs in
+          begin
+            match op with
+            | '+' -> build_add lhs_val rhs_val "addtmp" builder
+            | '-' -> build_sub lhs_val rhs_val "subtmp" builder
+            | '*' -> build_mul lhs_val rhs_val "multmp" builder
+            | '<' ->
+                (* Convert bool 0/1 to double 0.0 or 1.0 *)
+                let i = build_fcmp Fcmp.Ult lhs_val rhs_val "cmptmp" builder in
+                build_uitofp i double_type "booltmp" builder
+            | _ ->
+                (* If it wasn't a builtin binary operator, it must be a user defined
+                 * one. Emit a call to it. *)
+                let callee = "binary" ^ (String.make 1 op) in
+                let callee =
+                  match lookup_function callee the_module with
+                  | Some callee -> callee
+                  | None -> raise (Error "binary operator not found!")
+                in
+                build_call callee [|lhs_val; rhs_val|] "binop" builder
+          end
+      end
+  | Ast.Call (callee, args) ->
+      (* Look up the name in the module table. *)
+      let callee =
+        match lookup_function callee the_module with
+        | Some callee -> callee
+        | None -> raise (Error "unknown function referenced")
+      in
+      let params = params callee in
+
+      (* If argument mismatch error. *)
+      if Array.length params == Array.length args then () else
+        raise (Error "incorrect # arguments passed");
+      let args = Array.map codegen_expr args in
+      build_call callee args "calltmp" builder
+  | Ast.If (cond, then_, else_) ->
+      let cond = codegen_expr cond in
+
+      (* Convert condition to a bool by comparing equal to 0.0 *)
+      let zero = const_float double_type 0.0 in
+      let cond_val = build_fcmp Fcmp.One cond zero "ifcond" builder in
+
+      (* Grab the first block so that we might later add the conditional branch
+       * to it at the end of the function. *)
+      let start_bb = insertion_block builder in
+      let the_function = block_parent start_bb in
+
+      let then_bb = append_block "then" the_function in
+
+      (* Emit 'then' value. *)
+      position_at_end then_bb builder;
+      let then_val = codegen_expr then_ in
+
+      (* Codegen of 'then' can change the current block, update then_bb for the
+       * phi. We create a new name because one is used for the phi node, and the
+       * other is used for the conditional branch. *)
+      let new_then_bb = insertion_block builder in
+
+      (* Emit 'else' value. *)
+      let else_bb = append_block "else" the_function in
+      position_at_end else_bb builder;
+      let else_val = codegen_expr else_ in
+
+      (* Codegen of 'else' can change the current block, update else_bb for the
+       * phi. *)
+      let new_else_bb = insertion_block builder in
+
+      (* Emit merge block. *)
+      let merge_bb = append_block "ifcont" the_function in
+      position_at_end merge_bb builder;
+      let incoming = [(then_val, new_then_bb); (else_val, new_else_bb)] in
+      let phi = build_phi incoming "iftmp" builder in
+
+      (* Return to the start block to add the conditional branch. *)
+      position_at_end start_bb builder;
+      ignore (build_cond_br cond_val then_bb else_bb builder);
+
+      (* Set a unconditional branch at the end of the 'then' block and the
+       * 'else' block to the 'merge' block. *)
+      position_at_end new_then_bb builder; ignore (build_br merge_bb builder);
+      position_at_end new_else_bb builder; ignore (build_br merge_bb builder);
+
+      (* Finally, set the builder to the end of the merge block. *)
+      position_at_end merge_bb builder;
+
+      phi
+  | Ast.For (var_name, start, end_, step, body) ->
+      (* Output this as:
+       *   var = alloca double
+       *   ...
+       *   start = startexpr
+       *   store start -> var
+       *   goto loop
+       * loop:
+       *   ...
+       *   bodyexpr
+       *   ...
+       * loopend:
+       *   step = stepexpr
+       *   endcond = endexpr
+       *
+       *   curvar = load var
+       *   nextvar = curvar + step
+       *   store nextvar -> var
+       *   br endcond, loop, endloop
+       * outloop: *)
+
+      let the_function = block_parent (insertion_block builder) in
+
+      (* Create an alloca for the variable in the entry block. *)
+      let alloca = create_entry_block_alloca the_function var_name in
+
+      (* Emit the start code first, without 'variable' in scope. *)
+      let start_val = codegen_expr start in
+
+      (* Store the value into the alloca. *)
+      ignore(build_store start_val alloca builder);
+
+      (* Make the new basic block for the loop header, inserting after current
+       * block. *)
+      let loop_bb = append_block "loop" the_function in
+
+      (* Insert an explicit fall through from the current block to the
+       * loop_bb. *)
+      ignore (build_br loop_bb builder);
+
+      (* Start insertion in loop_bb. *)
+      position_at_end loop_bb builder;
+
+      (* Within the loop, the variable is defined equal to the PHI node. If it
+       * shadows an existing variable, we have to restore it, so save it
+       * now. *)
+      let old_val =
+        try Some (Hashtbl.find named_values var_name) with Not_found -> None
+      in
+      Hashtbl.add named_values var_name alloca;
+
+      (* Emit the body of the loop.  This, like any other expr, can change the
+       * current BB.  Note that we ignore the value computed by the body, but
+       * don't allow an error *)
+      ignore (codegen_expr body);
+
+      (* Emit the step value. *)
+      let step_val =
+        match step with
+        | Some step -> codegen_expr step
+        (* If not specified, use 1.0. *)
+        | None -> const_float double_type 1.0
+      in
+
+      (* Compute the end condition. *)
+      let end_cond = codegen_expr end_ in
+
+      (* Reload, increment, and restore the alloca. This handles the case where
+       * the body of the loop mutates the variable. *)
+      let cur_var = build_load alloca var_name builder in
+      let next_var = build_add cur_var step_val "nextvar" builder in
+      ignore(build_store next_var alloca builder);
+
+      (* Convert condition to a bool by comparing equal to 0.0. *)
+      let zero = const_float double_type 0.0 in
+      let end_cond = build_fcmp Fcmp.One end_cond zero "loopcond" builder in
+
+      (* Create the "after loop" block and insert it. *)
+      let after_bb = append_block "afterloop" the_function in
+
+      (* Insert the conditional branch into the end of loop_end_bb. *)
+      ignore (build_cond_br end_cond loop_bb after_bb builder);
+
+      (* Any new code will be inserted in after_bb. *)
+      position_at_end after_bb builder;
+
+      (* Restore the unshadowed variable. *)
+      begin match old_val with
+      | Some old_val -> Hashtbl.add named_values var_name old_val
+      | None -> ()
+      end;
+
+      (* for expr always returns 0.0. *)
+      const_null double_type
+  | Ast.Var (var_names, body) ->
+      let old_bindings = ref [] in
+
+      let the_function = block_parent (insertion_block builder) in
+
+      (* Register all variables and emit their initializer. *)
+      Array.iter (fun (var_name, init) ->
+        (* Emit the initializer before adding the variable to scope, this
+         * prevents the initializer from referencing the variable itself, and
+         * permits stuff like this:
+         *   var a = 1 in
+         *     var a = a in ...   # refers to outer 'a'. *)
+        let init_val =
+          match init with
+          | Some init -> codegen_expr init
+          (* If not specified, use 0.0. *)
+          | None -> const_float double_type 0.0
+        in
+
+        let alloca = create_entry_block_alloca the_function var_name in
+        ignore(build_store init_val alloca builder);
+
+        (* Remember the old variable binding so that we can restore the binding
+         * when we unrecurse. *)
+        begin
+          try
+            let old_value = Hashtbl.find named_values var_name in
+            old_bindings := (var_name, old_value) :: !old_bindings;
+          with Not_found -> ()
+        end;
+
+        (* Remember this binding. *)
+        Hashtbl.add named_values var_name alloca;
+      ) var_names;
+
+      (* Codegen the body, now that all vars are in scope. *)
+      let body_val = codegen_expr body in
+
+      (* Pop all our variables from scope. *)
+      List.iter (fun (var_name, old_value) ->
+        Hashtbl.add named_values var_name old_value
+      ) !old_bindings;
+
+      (* Return the body computation. *)
+      body_val
+
+let codegen_proto = function
+  | Ast.Prototype (name, args) | Ast.BinOpPrototype (name, args, _) ->
+      (* Make the function type: double(double,double) etc. *)
+      let doubles = Array.make (Array.length args) double_type in
+      let ft = function_type double_type doubles in
+      let f =
+        match lookup_function name the_module with
+        | None -> declare_function name ft the_module
+
+        (* If 'f' conflicted, there was already something named 'name'. If it
+         * has a body, don't allow redefinition or reextern. *)
+        | Some f ->
+            (* If 'f' already has a body, reject this. *)
+            if block_begin f <> At_end f then
+              raise (Error "redefinition of function");
+
+            (* If 'f' took a different number of arguments, reject. *)
+            if element_type (type_of f) <> ft then
+              raise (Error "redefinition of function with different # args");
+            f
+      in
+
+      (* Set names for all arguments. *)
+      Array.iteri (fun i a ->
+        let n = args.(i) in
+        set_value_name n a;
+        Hashtbl.add named_values n a;
+      ) (params f);
+      f
+
+(* Create an alloca for each argument and register the argument in the symbol
+ * table so that references to it will succeed. *)
+let create_argument_allocas the_function proto =
+  let args = match proto with
+    | Ast.Prototype (_, args) | Ast.BinOpPrototype (_, args, _) -> args
+  in
+  Array.iteri (fun i ai ->
+    let var_name = args.(i) in
+    (* Create an alloca for this variable. *)
+    let alloca = create_entry_block_alloca the_function var_name in
+
+    (* Store the initial value into the alloca. *)
+    ignore(build_store ai alloca builder);
+
+    (* Add arguments to variable symbol table. *)
+    Hashtbl.add named_values var_name alloca;
+  ) (params the_function)
+
+let codegen_func the_fpm = function
+  | Ast.Function (proto, body) ->
+      Hashtbl.clear named_values;
+      let the_function = codegen_proto proto in
+
+      (* If this is an operator, install it. *)
+      begin match proto with
+      | Ast.BinOpPrototype (name, args, prec) ->
+          let op = name.[String.length name - 1] in
+          Hashtbl.add Parser.binop_precedence op prec;
+      | _ -> ()
+      end;
+
+      (* Create a new basic block to start insertion into. *)
+      let bb = append_block "entry" the_function in
+      position_at_end bb builder;
+
+      try
+        (* Add all arguments to the symbol table and create their allocas. *)
+        create_argument_allocas the_function proto;
+
+        let ret_val = codegen_expr body in
+
+        (* Finish off the function. *)
+        let _ = build_ret ret_val builder in
+
+        (* Validate the generated code, checking for consistency. *)
+        Llvm_analysis.assert_valid_function the_function;
+
+        (* Optimize the function. *)
+        let _ = PassManager.run_function the_function the_fpm in
+
+        the_function
+      with e ->
+        delete_function the_function;
+        raise e
+
+
+ +
toplevel.ml:
+
+
+(*===----------------------------------------------------------------------===
+ * Top-Level parsing and JIT Driver
+ *===----------------------------------------------------------------------===*)
+
+open Llvm
+open Llvm_executionengine
+
+(* top ::= definition | external | expression | ';' *)
+let rec main_loop the_fpm the_execution_engine stream =
+  match Stream.peek stream with
+  | None -> ()
+
+  (* ignore top-level semicolons. *)
+  | Some (Token.Kwd ';') ->
+      Stream.junk stream;
+      main_loop the_fpm the_execution_engine stream
+
+  | Some token ->
+      begin
+        try match token with
+        | Token.Def ->
+            let e = Parser.parse_definition stream in
+            print_endline "parsed a function definition.";
+            dump_value (Codegen.codegen_func the_fpm e);
+        | Token.Extern ->
+            let e = Parser.parse_extern stream in
+            print_endline "parsed an extern.";
+            dump_value (Codegen.codegen_proto e);
+        | _ ->
+            (* Evaluate a top-level expression into an anonymous function. *)
+            let e = Parser.parse_toplevel stream in
+            print_endline "parsed a top-level expr";
+            let the_function = Codegen.codegen_func the_fpm e in
+            dump_value the_function;
+
+            (* JIT the function, returning a function pointer. *)
+            let result = ExecutionEngine.run_function the_function [||]
+              the_execution_engine in
+
+            print_string "Evaluated to ";
+            print_float (GenericValue.as_float double_type result);
+            print_newline ();
+        with Stream.Error s | Codegen.Error s ->
+          (* Skip token for error recovery. *)
+          Stream.junk stream;
+          print_endline s;
+      end;
+      print_string "ready> "; flush stdout;
+      main_loop the_fpm the_execution_engine stream
+
+
+ +
toy.ml:
+
+
+(*===----------------------------------------------------------------------===
+ * Main driver code.
+ *===----------------------------------------------------------------------===*)
+
+open Llvm
+open Llvm_executionengine
+open Llvm_target
+open Llvm_scalar_opts
+
+let main () =
+  (* Install standard binary operators.
+   * 1 is the lowest precedence. *)
+  Hashtbl.add Parser.binop_precedence '=' 2;
+  Hashtbl.add Parser.binop_precedence '<' 10;
+  Hashtbl.add Parser.binop_precedence '+' 20;
+  Hashtbl.add Parser.binop_precedence '-' 20;
+  Hashtbl.add Parser.binop_precedence '*' 40;    (* highest. *)
+
+  (* Prime the first token. *)
+  print_string "ready> "; flush stdout;
+  let stream = Lexer.lex (Stream.of_channel stdin) in
+
+  (* Create the JIT. *)
+  let the_module_provider = ModuleProvider.create Codegen.the_module in
+  let the_execution_engine = ExecutionEngine.create the_module_provider in
+  let the_fpm = PassManager.create_function the_module_provider in
+
+  (* Set up the optimizer pipeline.  Start with registering info about how the
+   * target lays out data structures. *)
+  TargetData.add (ExecutionEngine.target_data the_execution_engine) the_fpm;
+
+  (* Promote allocas to registers. *)
+  add_memory_to_register_promotion the_fpm;
+
+  (* Do simple "peephole" optimizations and bit-twiddling optzn. *)
+  add_instruction_combining the_fpm;
+
+  (* reassociate expressions. *)
+  add_reassociation the_fpm;
+
+  (* Eliminate Common SubExpressions. *)
+  add_gvn the_fpm;
+
+  (* Simplify the control flow graph (deleting unreachable blocks, etc). *)
+  add_cfg_simplification the_fpm;
+
+  (* Run the main "interpreter loop" now. *)
+  Toplevel.main_loop the_fpm the_execution_engine stream;
+
+  (* Print out all the generated code. *)
+  dump_module Codegen.the_module
+;;
+
+main ()
+
+
+ +
bindings.c
+
+
+#include <stdio.h>
+
+/* putchard - putchar that takes a double and returns 0. */
+extern double putchard(double X) {
+  putchar((char)X);
+  return 0;
+}
+
+/* printd - printf that takes a double prints it as "%f\n", returning 0. */
+extern double printd(double X) {
+  printf("%f\n", X);
+  return 0;
+}
+
+
+
+ +Next: Conclusion and other useful LLVM tidbits +
+ + +
+
+ Valid CSS! + Valid HTML 4.01! + + Chris Lattner
+ The LLVM Compiler Infrastructure
+ Erick Tryzelaar
+ Last modified: $Date: 2007-10-17 11:05:13 -0700 (Wed, 17 Oct 2007) $ +
+ + From idadesub at users.sourceforge.net Mon Mar 31 03:50:45 2008 From: idadesub at users.sourceforge.net (Erick Tryzelaar) Date: Mon, 31 Mar 2008 08:50:45 -0000 Subject: [llvm-commits] [llvm] r48979 - /llvm/trunk/docs/tutorial/index.html Message-ID: <200803310850.m2V8ojtt010167@zion.cs.uiuc.edu> Author: erickt Date: Mon Mar 31 03:50:45 2008 New Revision: 48979 URL: http://llvm.org/viewvc/llvm-project?rev=48979&view=rev Log: There isn't any c++ code in LangImpl8.html, so use that instead of OCamlLangImpl8.html. Modified: llvm/trunk/docs/tutorial/index.html Modified: llvm/trunk/docs/tutorial/index.html URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/docs/tutorial/index.html?rev=48979&r1=48978&r2=48979&view=diff ============================================================================== --- llvm/trunk/docs/tutorial/index.html (original) +++ llvm/trunk/docs/tutorial/index.html Mon Mar 31 03:50:45 2008 @@ -45,7 +45,7 @@
  • Extending the language: control flow
  • Extending the language: user-defined operators
  • Extending the language: mutable variables / SSA construction
  • -
  • Conclusion and other useful LLVM tidbits
  • +
  • Conclusion and other useful LLVM tidbits
  • Advanced Topics
      From baldrick at free.fr Mon Mar 31 06:44:10 2008 From: baldrick at free.fr (Duncan Sands) Date: Mon, 31 Mar 2008 13:44:10 +0200 Subject: [llvm-commits] =?iso-8859-1?q?=5Bllvm-gcc-4=2E2=5D_r48608_-_in=09?= =?iso-8859-1?q?/llvm-gcc-4=2E2/trunk/gcc=3A_config/i386/llvm-i386-target?= =?iso-8859-1?q?=2Eh=09config/i386/llvm-i386=2Ecpp_config/rs6000/llvm-rs60?= =?iso-8859-1?q?00=2Ecpp=09config/rs6000/rs6000=2Eh_llvm-abi=2Eh_llvm-conv?= =?iso-8859-1?q?ert=2Ecpp?= In-Reply-To: References: <200803201842.m2KIgwT9002122@zion.cs.uiuc.edu> <200803251803.53233.baldrick@free.fr> Message-ID: <200803311344.11770.baldrick@free.fr> Hi Dale, > > Hi Dale, I've cleaned up the return value part > > in commit 48778. Can you please check that it > > works properly for you. I haven't yet decided > > the best way of handling the argument case. > > There are some regressions but they all appear to be a different > problem. We'll need to get that cleaned up to be sure. while cleaning up the call argument part, I discovered an existing bug. Compiling SingleSource/UnitTests/Vector/SSE/sse.isamax.c on x86-32 linux gives the assertion cc1: Instructions.cpp:258: void llvm::CallInst::init(llvm::Value*, llvm::Value* const*, unsigned int): Assertion `(NumParams == FTy->getNumParams() || (FTy->isVarArg() && NumParams > FTy->getNumParams())) && "Calling a function with bad signature!"' failed. The reason is that @llvm.x86.sse.movmsk.ps is declared as declare i32 @llvm.x86.sse.movmsk.ps(<4 x float>) nounwind readnone but the vector is being passed in integer registers in the call, namely as two i64's. Ciao, Duncan. From gordonhenriksen at mac.com Mon Mar 31 07:04:46 2008 From: gordonhenriksen at mac.com (Gordon Henriksen) Date: Mon, 31 Mar 2008 08:04:46 -0400 Subject: [llvm-commits] [PATCH] Expose Function::viewCFG and Function::viewCFGOnly to bindings. In-Reply-To: <1206916389-84564-1-git-send-email-idadesub@users.sourceforge.net> References: <1206916389-84564-1-git-send-email-idadesub@users.sourceforge.net> Message-ID: On 2008-03-30, at 18:33, Erick Tryzelaar wrote: > These are some other functions referenced in the tutorial, so we > should > expose them in ocaml. I put them in analysis because having them in > VMCore created a dependency cycle. Looks good. Please commit. ? Gordon From romix.llvm at googlemail.com Mon Mar 31 07:09:04 2008 From: romix.llvm at googlemail.com (Roman Levenstein) Date: Mon, 31 Mar 2008 13:09:04 +0100 Subject: [llvm-commits] Speeding up instruction selection In-Reply-To: <417E9823-6AF6-44B0-83FD-89F0CC079B6A@apple.com> References: <00FB5805-1FA5-4534-BBD0-E6E34EC17BF1@apple.com> <1C1F9E6C-5B8E-4667-A119-4590F340FDE7@apple.com> <83CD954F-CD49-4D4B-950D-B6CB6CD1B32D@apple.com> <417E9823-6AF6-44B0-83FD-89F0CC079B6A@apple.com> Message-ID: Hi Dan, Hi Evan, Here is the updated patch. 1) I introduced the SDOperandPtr class, as I suggested in my last email. This class is a sort of an "intelligent" pointer. With this class, there is no need to copy the SDOperand arrays into the temporary SmallVectors. Therefore there is no additional overhead. 2) Additionally, I also finally made SDOperand a member of the SDUse, instead of using it as a base class. Now we can be sure that no unintentional conversion of SDUse into SDOperand happens. 3) I also changed the return types of some methods from SDUse to SDOperand, as it was suggested during the review. This patch passes all DejaGnu tests. -Roman 2008/3/31, Evan Cheng : > Ok, as long as the compile time increase isn't noticeable I won't > sweat it. However, if it happens in a few places, perhaps we need (yet > another) a getNode() that takes iterators and hide the copying inside > that instead. > > > Evan > > > On Mar 28, 2008, at 3:14 PM, Dan Gohman wrote: > > > > > On Mar 27, 2008, at 6:04 PM, Evan Cheng wrote: > >> > >>> OK. This is also my view. I don't think this temporary SmallVectors > >>> introduce any significant overhead. According to the profiler (I use > >>> Google profiling tools, which do not require to compile with -pg), > >>> they consume virtually no time and that even on big testcases, > >>> that I > >>> like so much :-) > >> > >> I am not sure about this. For all the places which pass the list of > >> SDOperand's as a ptr to an array, you want to make a copy of it into > >> an array before passing it? > > > > Hi Evan, > > > > The patch is not changing every place that passes lists of > > SDOperands to make an extra copy. The copy is only needed when > > passing an existing node's operands, which is are now stored as > > an array of SDUse, to a function that wants an SDOperand array. > > And judging by Roman's current patch, this doesn't happen in > > all that many places. > > > > Dan -------------- next part -------------- A non-text attachment was scrubbed... Name: SDNodeUses.patch Type: text/x-patch Size: 55907 bytes Desc: not available Url : http://lists.cs.uiuc.edu/pipermail/llvm-commits/attachments/20080331/c78088e6/attachment.bin From baldrick at free.fr Mon Mar 31 07:39:29 2008 From: baldrick at free.fr (Duncan Sands) Date: Mon, 31 Mar 2008 14:39:29 +0200 Subject: [llvm-commits] =?iso-8859-1?q?=5Bllvm-gcc-4=2E2=5D_r48608_-_in=09?= =?iso-8859-1?q?/llvm-gcc-4=2E2/trunk/gcc=3A_config/i386/llvm-i386-target?= =?iso-8859-1?q?=2Eh=09config/i386/llvm-i386=2Ecpp_config/rs6000/llvm-rs60?= =?iso-8859-1?q?00=2Ecpp=09config/rs6000/rs6000=2Eh_llvm-abi=2Eh_llvm-conv?= =?iso-8859-1?q?ert=2Ecpp?= In-Reply-To: <200803311344.11770.baldrick@free.fr> References: <200803201842.m2KIgwT9002122@zion.cs.uiuc.edu> <200803311344.11770.baldrick@free.fr> Message-ID: <200803311439.30161.baldrick@free.fr> > while cleaning up the call argument part, I discovered an existing bug. > Compiling SingleSource/UnitTests/Vector/SSE/sse.isamax.c on x86-32 linux > gives the assertion > > cc1: Instructions.cpp:258: void llvm::CallInst::init(llvm::Value*, llvm::Value* const*, unsigned int): Assertion `(NumParams == FTy->getNumParams() || (FTy->isVarArg() && NumParams > FTy->getNumParams())) && "Calling a function with bad signature!"' failed. > > The reason is that @llvm.x86.sse.movmsk.ps is declared as > > declare i32 @llvm.x86.sse.movmsk.ps(<4 x float>) nounwind readnone > > but the vector is being passed in integer registers in the call, namely > as two i64's. How about giving DefaultABI a isBuiltin parameter, not just HandleReturnType, and use that for parameters? That said, since builtins really have their own ABI, maybe the right thing to do is to introduce a new ABI template for use with builtins rather than complicating DefaultABI. Not sure it's worth it though. Ciao, Duncan. From jon at alacatialabs.com Mon Mar 31 10:43:02 2008 From: jon at alacatialabs.com (Jonathan Johnson) Date: Mon, 31 Mar 2008 10:43:02 -0500 Subject: [llvm-commits] CVS: llvm-www/devmtg/current/index.html Message-ID: <200803311543.m2VFh2xp022505@zion.cs.uiuc.edu> Changes in directory llvm-www/devmtg/current: index.html updated: 1.7 -> 1.8 --- Log message: Added date and location for conference, removed poll. Added section for agenda, with link to email if interested in presenting. --- Diffs of the changes: (+9 -14) index.html | 23 +++++++++-------------- 1 files changed, 9 insertions(+), 14 deletions(-) Index: llvm-www/devmtg/current/index.html diff -u llvm-www/devmtg/current/index.html:1.7 llvm-www/devmtg/current/index.html:1.8 --- llvm-www/devmtg/current/index.html:1.7 Sun Mar 23 15:50:28 2008 +++ llvm-www/devmtg/current/index.html Mon Mar 31 10:42:21 2008 @@ -3,8 +3,8 @@
        -
      1. Meeting Date
      2. Important Notes
      3. +
      4. Agenda
      5. Attendees
      @@ -13,21 +13,11 @@
    1. Why: To get acquainted, learn how LLVM is used, and exchange ideas.
    2. -
    3. When: To be determined.
    4. -
    5. Where: To be determined.
    6. +
    7. When: August 1, 2008
    8. +
    9. Where: Apple Campus (4 Infinite Loop, Cupertino, CA)
    10. - -
      -

      We are currently conducting a poll to help decide what date the 2008 Developer meeting will be on. - -

      -
      -
      @@ -36,11 +26,16 @@
    11. Are you willing to give a talk? on what topic?
    12. What topics are your primary interests?
    13. Are you or your company willing to make a donation?
    14. -
    15. What timeframe and location is best for you?
    16. + +
      +

      The meeting is tentatively scheduled between 8:00 AM and 5:00 PM Pacific Time. The schedule of talks has not yet been decided. If you are interested in speaking, please let us know what topic you'd like to present.

      +
      + +

      This table lists all attendees that have expressed interest in attending this year's conference.

      From baldrick at free.fr Mon Mar 31 11:08:50 2008 From: baldrick at free.fr (Duncan Sands) Date: Mon, 31 Mar 2008 18:08:50 +0200 Subject: [llvm-commits] [llvm-gcc-4.2] r48608 - in /llvm-gcc-4.2/trunk/gcc: config/i386/llvm-i386-target.h config/i386/llvm-i386.cpp config/rs6000/llvm-rs6000.cpp config/rs6000/rs6000.h llvm-abi.h llvm-convert.cpp In-Reply-To: <200803251803.53233.baldrick@free.fr> References: <200803201842.m2KIgwT9002122@zion.cs.uiuc.edu> <200803202054.04966.baldrick@free.fr> <200803251803.53233.baldrick@free.fr> Message-ID: <200803311808.51505.baldrick@free.fr> > Hi Dale, I've cleaned up the return value part > in commit 48778. Can you please check that it > works properly for you. I haven't yet decided > the best way of handling the argument case. This is what I'm testing for the call argument case. It seems to work! I did some additional small cleanups in the same code area while there. It does introduce a slow-down in the common case: scalars are always stored to a temporary and later loaded out (if not passed in integer registers). It would be easy to eliminate this, though it's not clear to me if it really matters. Duncan. Index: gcc-4.2.llvm/gcc/llvm-convert.cpp =================================================================== --- gcc-4.2.llvm.orig/gcc/llvm-convert.cpp 2008-03-29 00:15:38.000000000 +0100 +++ gcc-4.2.llvm/gcc/llvm-convert.cpp 2008-03-31 18:02:31.000000000 +0200 @@ -2282,44 +2282,26 @@ /// definition for this target to figure out how to pass arguments into the /// stack/regs for a function call. struct FunctionCallArgumentConversion : public DefaultABIClient { - tree CallExpression; SmallVector &CallOperands; - CallingConv::ID &CallingConvention; - LLVMBuilder &Builder; + SmallVector LocStack; + const FunctionType *FTy; const MemRef *DestLoc; + bool useReturnSlot; + LLVMBuilder &Builder; MemRef RetBuf; - std::vector LocStack; bool isShadowRet; - FunctionCallArgumentConversion(tree exp, SmallVector &ops, - CallingConv::ID &cc, - LLVMBuilder &b, const MemRef *destloc) - : CallExpression(exp), CallOperands(ops), CallingConvention(cc), - Builder(b), DestLoc(destloc), isShadowRet(false) { - CallingConvention = CallingConv::C; -#ifdef TARGET_ADJUST_LLVM_CC - tree ftype; - if (tree fdecl = get_callee_fndecl(exp)) { - ftype = TREE_TYPE(fdecl); - } else { - ftype = TREE_TYPE(TREE_OPERAND(exp,0)); + FunctionCallArgumentConversion(SmallVector &ops, + const FunctionType *FnTy, + const MemRef *destloc, + bool ReturnSlotOpt, + LLVMBuilder &b) + : CallOperands(ops), FTy(FnTy), DestLoc(destloc), + useReturnSlot(ReturnSlotOpt), Builder(b), isShadowRet(false) { } - // If it's call to pointer, we look for the function type. - if (TREE_CODE(ftype) == POINTER_TYPE) - ftype = TREE_TYPE(ftype); - } - - TARGET_ADJUST_LLVM_CC(CallingConvention, ftype); -#endif - } - void setLocation(Value *Loc) { LocStack.push_back(Loc); } - void clear() { - assert(LocStack.size() == 1 && "Imbalance!"); - LocStack.clear(); - } bool isShadowReturn() { return isShadowRet; } @@ -2349,7 +2331,7 @@ assert(DestLoc == 0 && "Call returns a scalar but caller expects aggregate!"); } - + /// HandleAggregateResultAsScalar - This callback is invoked if the function /// returns an aggregate value by bit converting it to the specified scalar /// type and returning that. @@ -2371,7 +2353,7 @@ // The result is unused, but still needs to be stored somewhere. Value *Buf = TheTreeToLLVM->CreateTemporary(PtrArgTy->getElementType()); CallOperands.push_back(Buf); - } else if (CALL_EXPR_RETURN_SLOT_OPT(CallExpression)) { + } else if (useReturnSlot) { // Letting the call write directly to the final destination is safe and // may be required. Do not use a buffer. CallOperands.push_back(DestLoc->Ptr); @@ -2387,6 +2369,10 @@ isShadowRet = true; } + /// HandleScalarShadowArgument - This callback is invoked if the function + /// returns a scalar value by using a "shadow" first parameter, which is a + /// pointer to the scalar, of type PtrArgTy. If RetPtr is set to true, + /// the pointer argument itself is returned from the function. void HandleScalarShadowArgument(const PointerType *PtrArgTy, bool RetPtr) { assert(DestLoc == 0 && "Call returns a scalar but caller expects aggregate!"); @@ -2399,16 +2385,38 @@ isShadowRet = true; } + /// HandleScalarArgument - This is the primary callback that specifies an + /// LLVM argument to pass. It is only used for first class types. void HandleScalarArgument(const llvm::Type *LLVMTy, tree type) { assert(!LocStack.empty()); Value *Loc = LocStack.back(); - if (cast(Loc->getType())->getElementType() != LLVMTy) - // This always deals with pointer types so BitCast is appropriate - Loc = Builder.CreateBitCast(Loc, PointerType::getUnqual(LLVMTy), "tmp"); - - CallOperands.push_back(Builder.CreateLoad(Loc, "tmp")); + if (Loc->getType() != PointerType::getUnqual(LLVMTy)) + Loc = Builder.CreateBitCast(Loc, PointerType::getUnqual(LLVMTy)); + + // Load the scalar value and perform any implicit type conversions. + Loc = Builder.CreateLoad(Loc, "tmp"); + if (CallOperands.size() < FTy->getNumParams()) { + const Type *CalledTy = FTy->getParamType(CallOperands.size()); + if (Loc->getType() != CalledTy) { + assert(type && "Inconsistent parameter types?"); + bool isSigned = !TYPE_UNSIGNED(type); + Loc = TheTreeToLLVM->CastToAnyType(Loc, isSigned, CalledTy, false); + } + } + + CallOperands.push_back(Loc); } - + + /// HandleByInvisibleReferenceArgument - This callback is invoked if a pointer + /// (of type PtrTy) to the argument is passed rather than the argument itself. + void HandleByInvisibleReferenceArgument(const llvm::Type *PtrTy, tree type){ + assert(!LocStack.empty()); + Value *Loc = LocStack.back(); + if (Loc->getType() != PtrTy) + Loc = Builder.CreateBitCast(Loc, PtrTy); + CallOperands.push_back(Loc); + } + /// HandleByValArgument - This callback is invoked if the aggregate function /// argument is passed by value. It is lowered to a parameter passed by /// reference with an additional parameter attribute "ByVal". @@ -2419,16 +2427,17 @@ CallOperands.push_back(Loc); } + /// EnterField - Called when we're about the enter the field of a struct + /// or union. FieldNo is the number of the element we are entering in the + /// LLVM Struct, StructTy is the LLVM type of the struct we are entering. void EnterField(unsigned FieldNo, const llvm::Type *StructTy) { Value *Loc = LocStack.back(); - if (cast(Loc->getType())->getElementType() != StructTy) - // This always deals with pointer types so BitCast is appropriate - Loc = Builder.CreateBitCast(Loc, PointerType::getUnqual(StructTy), - "tmp"); - - LocStack.push_back(Builder.CreateStructGEP(Loc, FieldNo, "tmp")); + if (Loc->getType() != PointerType::getUnqual(StructTy)) + Loc = Builder.CreateBitCast(Loc, PointerType::getUnqual(StructTy)); + LocStack.push_back(Builder.CreateStructGEP(Loc, FieldNo, "field")); } void ExitField() { + assert(!LocStack.empty()); LocStack.pop_back(); } }; @@ -2445,6 +2454,7 @@ if (PAL.isEmpty() && isa(Callee)) PAL = cast(Callee)->getParamAttrs(); + // Work out whether to use an invoke or an ordinary call. if (!tree_could_throw_p(exp)) // This call does not throw - mark it 'nounwind'. PAL = PAL.addAttr(0, ParamAttr::NoUnwind); @@ -2474,15 +2484,26 @@ } } + tree fndecl = get_callee_fndecl(exp); + tree fntype = fndecl ? + TREE_TYPE(fndecl) : TREE_TYPE (TREE_TYPE(TREE_OPERAND (exp, 0))); + + // Determine the calling convention. + CallingConv::ID CallingConvention = CallingConv::C; +#ifdef TARGET_ADJUST_LLVM_CC + TARGET_ADJUST_LLVM_CC(CallingConvention, fntype); +#endif + SmallVector CallOperands; - CallingConv::ID CallingConvention; - FunctionCallArgumentConversion Client(exp, CallOperands, CallingConvention, - Builder, DestLoc); + const PointerType *PFTy = cast(Callee->getType()); + const FunctionType *FTy = cast(PFTy->getElementType()); + FunctionCallArgumentConversion Client(CallOperands, FTy, DestLoc, + CALL_EXPR_RETURN_SLOT_OPT(exp), + Builder); TheLLVMABI ABIConverter(Client); // Handle the result, including struct returns. - tree fndecl = get_callee_fndecl(exp); - ABIConverter.HandleReturnType(TREE_TYPE(exp), + ABIConverter.HandleReturnType(TREE_TYPE(exp), fndecl ? DECL_BUILT_IN(fndecl) : false); // Pass the static chain, if any, as the first parameter. @@ -2490,52 +2511,27 @@ CallOperands.push_back(Emit(TREE_OPERAND(exp, 2), 0)); // Loop over the arguments, expanding them and adding them to the op list. - const PointerType *PFTy = cast(Callee->getType()); - const FunctionType *FTy = cast(PFTy->getElementType()); for (tree arg = TREE_OPERAND(exp, 1); arg; arg = TREE_CHAIN(arg)) { - const Type *ActualArgTy = ConvertType(TREE_TYPE(TREE_VALUE(arg))); - const Type *ArgTy = ActualArgTy; - if (CallOperands.size() < FTy->getNumParams()) - ArgTy = FTy->getParamType(CallOperands.size()); - - // If we are implicitly passing the address of this argument instead of - // passing it by value, handle this first. - if (isPassedByInvisibleReference(TREE_TYPE(TREE_VALUE(arg)))) { - // Get the address of the parameter passed in. - LValue ArgVal = EmitLV(TREE_VALUE(arg)); - assert(!ArgVal.isBitfield() && "Bitfields shouldn't be invisible refs!"); - Value *Ptr = ArgVal.Ptr; - - if (CallOperands.size() >= FTy->getNumParams()) - ArgTy = PointerType::getUnqual(ArgTy); - CallOperands.push_back(BitCastToType(Ptr, ArgTy)); - } else if (ActualArgTy->isFirstClassType()) { + const Type *ArgTy = ConvertType(TREE_TYPE(TREE_VALUE(arg))); + + // Push the address of the argument. + if (ArgTy->isFirstClassType()) { + // Store to a temporary, and use the temporary's address. Value *V = Emit(TREE_VALUE(arg), 0); - if (TREE_CODE(TREE_TYPE(TREE_VALUE(arg)))==VECTOR_TYPE && - LLVM_SHOULD_PASS_VECTOR_IN_INTEGER_REGS(TREE_TYPE(TREE_VALUE(arg)))) { - // Passed as integer registers. We need a stack object, not a value. - MemRef NewLoc = CreateTempLoc(ConvertType(TREE_TYPE(TREE_VALUE(arg)))); - StoreInst *St = Builder.CreateStore(V, NewLoc.Ptr, false); - Client.setLocation(NewLoc.Ptr); - ParameterAttributes Attributes = ParamAttr::None; - ABIConverter.HandleArgument(TREE_TYPE(TREE_VALUE(arg)), &Attributes); - if (Attributes != ParamAttr::None) - PAL = PAL.addAttr(CallOperands.size(), Attributes); - } else { - bool isSigned = !TYPE_UNSIGNED(TREE_TYPE(TREE_VALUE(arg))); - CallOperands.push_back(CastToAnyType(V, isSigned, ArgTy, false)); - } + Value *Tmp = CreateTemporary(ArgTy); + Builder.CreateStore(V, Tmp); + Client.setLocation(Tmp); } else { - // If this is an aggregate value passed by-value, use the current ABI to - // determine how the parameters are passed. - LValue LV = EmitLV(TREE_VALUE(arg)); - assert(!LV.isBitfield() && "Bitfields are first-class types!"); - Client.setLocation(LV.Ptr); - ParameterAttributes Attributes = ParamAttr::None; - ABIConverter.HandleArgument(TREE_TYPE(TREE_VALUE(arg)), &Attributes); - if (Attributes != ParamAttr::None) - PAL = PAL.addAttr(CallOperands.size(), Attributes); + // An aggregate - get the address directly. + LValue ArgVal = EmitLV(TREE_VALUE(arg)); + assert(!ArgVal.isBitfield() && "Bitfields are first-class types!"); + Client.setLocation(ArgVal.Ptr); } + + ParameterAttributes Attributes = ParamAttr::None; + ABIConverter.HandleArgument(TREE_TYPE(TREE_VALUE(arg)), &Attributes); + if (Attributes != ParamAttr::None) + PAL = PAL.addAttr(CallOperands.size(), Attributes); } // Compile stuff like: Index: gcc-4.2.llvm/gcc/llvm-abi.h =================================================================== --- gcc-4.2.llvm.orig/gcc/llvm-abi.h 2008-03-29 00:15:38.000000000 +0100 +++ gcc-4.2.llvm/gcc/llvm-abi.h 2008-03-29 00:49:28.000000000 +0100 @@ -73,9 +73,13 @@ void HandleScalarShadowArgument(const PointerType *PtrArgTy, bool RetPtr) {} - /// HandleScalarArgument - This is the primary callback that specifies an LLVM - /// argument to pass. - void HandleScalarArgument(const llvm::Type *LLVMTy, tree argTreeType) {} + /// HandleScalarArgument - This is the primary callback that specifies an + /// LLVM argument to pass. It is only used for first class types. + void HandleScalarArgument(const llvm::Type *LLVMTy, tree type) {} + + /// HandleByInvisibleReferenceArgument - This callback is invoked if a pointer + /// (of type PtrTy) to the argument is passed rather than the argument itself. + void HandleByInvisibleReferenceArgument(const llvm::Type *PtrTy, tree type) {} /// HandleByValArgument - This callback is invoked if the aggregate function /// argument is passed by value. @@ -330,7 +334,7 @@ // not include variable sized fields here. std::vector Elts; if (isPassedByInvisibleReference(type)) { // variable size -> by-ref. - C.HandleScalarArgument(PointerType::getUnqual(Ty), type); + C.HandleByInvisibleReferenceArgument(PointerType::getUnqual(Ty), type); } else if (Ty->getTypeID()==Type::VectorTyID) { if (LLVM_SHOULD_PASS_VECTOR_IN_INTEGER_REGS(type)) { PassInIntegerRegisters(type, Ty); Index: gcc-4.2.llvm/gcc/llvm-types.cpp =================================================================== --- gcc-4.2.llvm.orig/gcc/llvm-types.cpp 2008-03-30 17:32:45.000000000 +0200 +++ gcc-4.2.llvm/gcc/llvm-types.cpp 2008-03-30 17:34:32.000000000 +0200 @@ -995,6 +995,12 @@ ArgTypes.push_back(LLVMTy); } + /// HandleByInvisibleReferenceArgument - This callback is invoked if a pointer + /// (of type PtrTy) to the argument is passed rather than the argument itself. + void HandleByInvisibleReferenceArgument(const llvm::Type *PtrTy, tree type) { + ArgTypes.push_back(PtrTy); + } + /// HandleByValArgument - This callback is invoked if the aggregate function /// argument is passed by value. It is lowered to a parameter passed by /// reference with an additional parameter attribute "ByVal". From idadesub at users.sourceforge.net Mon Mar 31 11:22:09 2008 From: idadesub at users.sourceforge.net (Erick Tryzelaar) Date: Mon, 31 Mar 2008 16:22:09 -0000 Subject: [llvm-commits] [llvm] r48982 - in /llvm/trunk: bindings/ocaml/analysis/analysis_ocaml.c bindings/ocaml/analysis/llvm_analysis.ml bindings/ocaml/analysis/llvm_analysis.mli include/llvm-c/Analysis.h lib/Analysis/Analysis.cpp Message-ID: <200803311622.m2VGM96J023744@zion.cs.uiuc.edu> Author: erickt Date: Mon Mar 31 11:22:09 2008 New Revision: 48982 URL: http://llvm.org/viewvc/llvm-project?rev=48982&view=rev Log: Expose Function::viewCFG and Function::viewCFGOnly to bindings. Modified: llvm/trunk/bindings/ocaml/analysis/analysis_ocaml.c llvm/trunk/bindings/ocaml/analysis/llvm_analysis.ml llvm/trunk/bindings/ocaml/analysis/llvm_analysis.mli llvm/trunk/include/llvm-c/Analysis.h llvm/trunk/lib/Analysis/Analysis.cpp Modified: llvm/trunk/bindings/ocaml/analysis/analysis_ocaml.c URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/bindings/ocaml/analysis/analysis_ocaml.c?rev=48982&r1=48981&r2=48982&view=diff ============================================================================== --- llvm/trunk/bindings/ocaml/analysis/analysis_ocaml.c (original) +++ llvm/trunk/bindings/ocaml/analysis/analysis_ocaml.c Mon Mar 31 11:22:09 2008 @@ -58,3 +58,15 @@ LLVMVerifyFunction(Fn, LLVMAbortProcessAction); return Val_unit; } + +/* Llvm.llvalue -> unit */ +CAMLprim value llvm_view_function_cfg(LLVMValueRef Fn) { + LLVMViewFunctionCFG(Fn); + return Val_unit; +} + +/* Llvm.llvalue -> unit */ +CAMLprim value llvm_view_function_cfg_only(LLVMValueRef Fn) { + LLVMViewFunctionCFGOnly(Fn); + return Val_unit; +} Modified: llvm/trunk/bindings/ocaml/analysis/llvm_analysis.ml URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/bindings/ocaml/analysis/llvm_analysis.ml?rev=48982&r1=48981&r2=48982&view=diff ============================================================================== --- llvm/trunk/bindings/ocaml/analysis/llvm_analysis.ml (original) +++ llvm/trunk/bindings/ocaml/analysis/llvm_analysis.ml Mon Mar 31 11:22:09 2008 @@ -17,3 +17,6 @@ external assert_valid_function : Llvm.llvalue -> unit = "llvm_assert_valid_function" +external view_function_cfg : Llvm.llvalue -> unit = "llvm_view_function_cfg" +external view_function_cfg_only : Llvm.llvalue -> unit + = "llvm_view_function_cfg_only" Modified: llvm/trunk/bindings/ocaml/analysis/llvm_analysis.mli URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/bindings/ocaml/analysis/llvm_analysis.mli?rev=48982&r1=48981&r2=48982&view=diff ============================================================================== --- llvm/trunk/bindings/ocaml/analysis/llvm_analysis.mli (original) +++ llvm/trunk/bindings/ocaml/analysis/llvm_analysis.mli Mon Mar 31 11:22:09 2008 @@ -33,3 +33,14 @@ [llvm::verifyFunction]. *) external assert_valid_function : Llvm.llvalue -> unit = "llvm_assert_valid_function" + +(** [view_function_cfg f] opens up a ghostscript window displaying the CFG of + the current function with the code for each basic block inside. + See [llvm::Function::viewCFG]. *) +external view_function_cfg : Llvm.llvalue -> unit = "llvm_view_function_cfg" + +(** [view_function_cfg_only f] works just like [view_function_cfg], but does not + include the contents of basic blocks into the nodes. + See [llvm::Function::viewCFGOnly]. *) +external view_function_cfg_only : Llvm.llvalue -> unit + = "llvm_view_function_cfg_only" Modified: llvm/trunk/include/llvm-c/Analysis.h URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm-c/Analysis.h?rev=48982&r1=48981&r2=48982&view=diff ============================================================================== --- llvm/trunk/include/llvm-c/Analysis.h (original) +++ llvm/trunk/include/llvm-c/Analysis.h Mon Mar 31 11:22:09 2008 @@ -43,6 +43,10 @@ for debugging. */ int LLVMVerifyFunction(LLVMValueRef Fn, LLVMVerifierFailureAction Action); +/* Open up a ghostview window that displays the CFG of the current function. + Useful for debugging. */ +void LLVMViewFunctionCFG(LLVMValueRef Fn); +void LLVMViewFunctionCFGOnly(LLVMValueRef Fn); #ifdef __cplusplus } Modified: llvm/trunk/lib/Analysis/Analysis.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Analysis/Analysis.cpp?rev=48982&r1=48981&r2=48982&view=diff ============================================================================== --- llvm/trunk/lib/Analysis/Analysis.cpp (original) +++ llvm/trunk/lib/Analysis/Analysis.cpp Mon Mar 31 11:22:09 2008 @@ -33,3 +33,12 @@ static_cast(Action)); } +void LLVMViewFunctionCFG(LLVMValueRef Fn) { + Function *F = unwrap(Fn); + F->viewCFG(); +} + +void LLVMViewFunctionCFGOnly(LLVMValueRef Fn) { + Function *F = unwrap(Fn); + F->viewCFGOnly(); +} From dalej at apple.com Mon Mar 31 11:44:38 2008 From: dalej at apple.com (Dale Johannesen) Date: Mon, 31 Mar 2008 09:44:38 -0700 Subject: [llvm-commits] [llvm-gcc-4.2] r48608 - in /llvm-gcc-4.2/trunk/gcc: config/i386/llvm-i386-target.h config/i386/llvm-i386.cpp config/rs6000/llvm-rs6000.cpp config/rs6000/rs6000.h llvm-abi.h llvm-convert.cpp In-Reply-To: <200803311344.11770.baldrick@free.fr> References: <200803201842.m2KIgwT9002122@zion.cs.uiuc.edu> <200803251803.53233.baldrick@free.fr> <200803311344.11770.baldrick@free.fr> Message-ID: <36997245-BEA4-402E-BFF2-3C14A689A98F@apple.com> On Mar 31, 2008, at 4:44 AM, Duncan Sands wrote: > Hi Dale, > >>> Hi Dale, I've cleaned up the return value part >>> in commit 48778. Can you please check that it >>> works properly for you. I haven't yet decided >>> the best way of handling the argument case. >> >> There are some regressions but they all appear to be a different >> problem. We'll need to get that cleaned up to be sure. > > while cleaning up the call argument part, I discovered an existing > bug. > Compiling SingleSource/UnitTests/Vector/SSE/sse.isamax.c on x86-32 > linux > gives the assertion > > cc1: Instructions.cpp:258: void llvm::CallInst::init(llvm::Value*, > llvm::Value* const*, unsigned int): Assertion `(NumParams == FTy- > >getNumParams() || (FTy->isVarArg() && NumParams > FTy- > >getNumParams())) && "Calling a function with bad signature!"' failed. > > The reason is that @llvm.x86.sse.movmsk.ps is declared as > > declare i32 @llvm.x86.sse.movmsk.ps(<4 x float>) nounwind readnone > > but the vector is being passed in integer registers in the call, > namely > as two i64's. This works on darwin (<4 x float> is used consistently). llvm_x86_should_pass_vector_in_integer_regs is all dependent on TARGET_MACHO and presumably shouldn't be, but it may not be as simple as removing TARGET_MACHO. From gordonhenriksen at mac.com Mon Mar 31 11:46:23 2008 From: gordonhenriksen at mac.com (Gordon Henriksen) Date: Mon, 31 Mar 2008 16:46:23 -0000 Subject: [llvm-commits] [llvm] r48983 - /llvm/trunk/Makefile.config.in Message-ID: <200803311646.m2VGkNpf024497@zion.cs.uiuc.edu> Author: gordon Date: Mon Mar 31 11:46:23 2008 New Revision: 48983 URL: http://llvm.org/viewvc/llvm-project?rev=48983&view=rev Log: Reverting r48974. See PR2183 for details. Modified: llvm/trunk/Makefile.config.in Modified: llvm/trunk/Makefile.config.in URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/Makefile.config.in?rev=48983&r1=48982&r2=48983&view=diff ============================================================================== --- llvm/trunk/Makefile.config.in (original) +++ llvm/trunk/Makefile.config.in Mon Mar 31 11:46:23 2008 @@ -151,10 +151,10 @@ DOXYGEN := @DOXYGEN@ GROFF := @GROFF@ GZIP := @GZIP@ -OCAMLC := "@OCAMLC@" -OCAMLOPT := "@OCAMLOPT@" -OCAMLDEP := "@OCAMLDEP@" -OCAMLDOC := "@OCAMLDOC@" +OCAMLC := @OCAMLC@ +OCAMLOPT := @OCAMLOPT@ +OCAMLDEP := @OCAMLDEP@ +OCAMLDOC := @OCAMLDOC@ POD2HTML := @POD2HTML@ POD2MAN := @POD2MAN@ RUNTEST := @RUNTEST@ From gordonhenriksen at mac.com Mon Mar 31 12:08:58 2008 From: gordonhenriksen at mac.com (Gordon Henriksen) Date: Mon, 31 Mar 2008 13:08:58 -0400 Subject: [llvm-commits] [llvm] r48974 - /llvm/trunk/Makefile.config.in In-Reply-To: <200803310346.m2V3kjcC026106@zion.cs.uiuc.edu> References: <200803310346.m2V3kjcC026106@zion.cs.uiuc.edu> Message-ID: <741CE38D-84C1-42D1-AD24-8AB028F3B009@mac.com> Hi Erick, Please run 'make check' before committing. I reverted this because it broke same; see PR2183. I'd love it if spaces in pathnames worked, too, but in general spaces + make = lose. The user in question has several options. He can: 1. --enable-bindings=none 2. Put an ocaml installation in his path, at a location with no spaces. 3. Use ./configure OCAMLDEP=... OCAMLC=... OCAMLOPT=... OCAMLDOC=... to specify executables with no spaces in their path. Thanks, Gordon On Mar 30, 2008, at 23:46, Erick Tryzelaar wrote: > Author: erickt > Date: Sun Mar 30 22:46:43 2008 > New Revision: 48974 > > URL: http://llvm.org/viewvc/llvm-project?rev=48974&view=rev > Log: > Quote the ocaml executables > > realazthat in #llvm was having problems building llvm > because configure was finding an ocaml executable in > a directory with a space in it's name. This patch > puts quotes around the name so that llvm can build for > him. > > Modified: > llvm/trunk/Makefile.config.in > > Modified: llvm/trunk/Makefile.config.in > URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/Makefile.config.in?rev=48974&r1=48973&r2=48974&view=diff > > = > = > = > = > = > = > = > = > ====================================================================== > --- llvm/trunk/Makefile.config.in (original) > +++ llvm/trunk/Makefile.config.in Sun Mar 30 22:46:43 2008 > @@ -151,10 +151,10 @@ > DOXYGEN := @DOXYGEN@ > GROFF := @GROFF@ > GZIP := @GZIP@ > -OCAMLC := @OCAMLC@ > -OCAMLOPT := @OCAMLOPT@ > -OCAMLDEP := @OCAMLDEP@ > -OCAMLDOC := @OCAMLDOC@ > +OCAMLC := "@OCAMLC@" > +OCAMLOPT := "@OCAMLOPT@" > +OCAMLDEP := "@OCAMLDEP@" > +OCAMLDOC := "@OCAMLDOC@" > POD2HTML := @POD2HTML@ > POD2MAN := @POD2MAN@ > RUNTEST := @RUNTEST@ > > > _______________________________________________ > llvm-commits mailing list > llvm-commits at cs.uiuc.edu > http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits From gordonhenriksen at mac.com Mon Mar 31 12:27:57 2008 From: gordonhenriksen at mac.com (Gordon Henriksen) Date: Mon, 31 Mar 2008 17:27:57 -0000 Subject: [llvm-commits] [llvm] r48985 - /llvm/trunk/docs/Makefile Message-ID: <200803311727.m2VHRwh6025844@zion.cs.uiuc.edu> Author: gordon Date: Mon Mar 31 12:27:57 2008 New Revision: 48985 URL: http://llvm.org/viewvc/llvm-project?rev=48985&view=rev Log: Add a unified 'generated documentation' target so the web site script has a consistent target to use. Modified: llvm/trunk/docs/Makefile Modified: llvm/trunk/docs/Makefile URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/docs/Makefile?rev=48985&r1=48984&r2=48985&view=diff ============================================================================== --- llvm/trunk/docs/Makefile (original) +++ llvm/trunk/docs/Makefile Mon Mar 31 12:27:57 2008 @@ -31,7 +31,7 @@ doxygen.intro EXTRA_DIST := $(HTML) $(DOXYFILES) llvm.css CommandGuide img -.PHONY: install-html install-doxygen doxygen install-ocamldoc ocamldoc +.PHONY: install-html install-doxygen doxygen install-ocamldoc ocamldoc generated install_targets := install-html ifeq ($(ENABLE_DOXYGEN),1) @@ -42,6 +42,10 @@ endif install-local:: $(install_targets) +# Live documentation is generated for the web site using this target: +# 'make generated BUILD_FOR_WEBSITE=1' +generated:: doxygen ocamldoc + install-html: $(PROJ_OBJ_DIR)/html.tar.gz $(Echo) Installing HTML documentation $(Verb) $(MKDIR) $(PROJ_docsdir)/html From gohman at apple.com Mon Mar 31 12:56:06 2008 From: gohman at apple.com (Dan Gohman) Date: Mon, 31 Mar 2008 10:56:06 -0700 Subject: [llvm-commits] Speeding up instruction selection In-Reply-To: References: <97188DDC-093E-4733-B8A2-7B30B6684DE1@apple.com> <00FB5805-1FA5-4534-BBD0-E6E34EC17BF1@apple.com> <1C1F9E6C-5B8E-4667-A119-4590F340FDE7@apple.com> Message-ID: <0029C41F-1C95-41FC-825C-3929E75DC2BE@apple.com> On Mar 30, 2008, at 11:26 AM, Chris Lattner wrote: > > On Mar 27, 2008, at 5:10 PM, Dan Gohman wrote: > >> I tested the SDNodeUses.patch and it passed. I have one comment >> on this patch; I don't think this change: >> >> - const SDOperand &getOperand(unsigned Num) const { >> + const SDUse &getOperand(unsigned Num) const { >> >> and several other related changes (getChain, getBasePtr, etc.) >> are right. I think these should still return SDOperand references. >> This will help keep client code more consistent. Other than that >> I think this patch is ok to commit. > > Incidentally, I think it would be even better to return SDOperand by > value. This is a small value class, so I think it will be a win. > What do you think? These trivial accessor member functions ought to be inlined in any optimized build, but I agree that it's slightly nicer to return SDOperand by value. Dan From lattner at apple.com Mon Mar 31 13:04:19 2008 From: lattner at apple.com (Tanya Lattner) Date: Mon, 31 Mar 2008 11:04:19 -0700 Subject: [llvm-commits] [llvm] r48982 - in /llvm/trunk: bindings/ocaml/analysis/analysis_ocaml.c bindings/ocaml/analysis/llvm_analysis.ml bindings/ocaml/analysis/llvm_analysis.mli include/llvm-c/Analysis.h lib/Analysis/Analysis.cpp In-Reply-To: <200803311622.m2VGM96J023744@zion.cs.uiuc.edu> References: <200803311622.m2VGM96J023744@zion.cs.uiuc.edu> Message-ID: I don't think /* comment */ works for doxygen style comments. It should be /** comment */ and it should be for each function. -Tanya On Mar 31, 2008, at 9:22 AM, Erick Tryzelaar wrote: > Author: erickt > Date: Mon Mar 31 11:22:09 2008 > New Revision: 48982 > > URL: http://llvm.org/viewvc/llvm-project?rev=48982&view=rev > Log: > Expose Function::viewCFG and Function::viewCFGOnly to bindings. > > Modified: > llvm/trunk/bindings/ocaml/analysis/analysis_ocaml.c > llvm/trunk/bindings/ocaml/analysis/llvm_analysis.ml > llvm/trunk/bindings/ocaml/analysis/llvm_analysis.mli > llvm/trunk/include/llvm-c/Analysis.h > llvm/trunk/lib/Analysis/Analysis.cpp > > Modified: llvm/trunk/bindings/ocaml/analysis/analysis_ocaml.c > URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/bindings/ocaml/ > analysis/analysis_ocaml.c?rev=48982&r1=48981&r2=48982&view=diff > > ====================================================================== > ======== > --- llvm/trunk/bindings/ocaml/analysis/analysis_ocaml.c (original) > +++ llvm/trunk/bindings/ocaml/analysis/analysis_ocaml.c Mon Mar 31 > 11:22:09 2008 > @@ -58,3 +58,15 @@ > LLVMVerifyFunction(Fn, LLVMAbortProcessAction); > return Val_unit; > } > + > +/* Llvm.llvalue -> unit */ > +CAMLprim value llvm_view_function_cfg(LLVMValueRef Fn) { > + LLVMViewFunctionCFG(Fn); > + return Val_unit; > +} > + > +/* Llvm.llvalue -> unit */ > +CAMLprim value llvm_view_function_cfg_only(LLVMValueRef Fn) { > + LLVMViewFunctionCFGOnly(Fn); > + return Val_unit; > +} > > Modified: llvm/trunk/bindings/ocaml/analysis/llvm_analysis.ml > URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/bindings/ocaml/ > analysis/llvm_analysis.ml?rev=48982&r1=48981&r2=48982&view=diff > > ====================================================================== > ======== > --- llvm/trunk/bindings/ocaml/analysis/llvm_analysis.ml (original) > +++ llvm/trunk/bindings/ocaml/analysis/llvm_analysis.ml Mon Mar 31 > 11:22:09 2008 > @@ -17,3 +17,6 @@ > > external assert_valid_function : Llvm.llvalue -> unit > = "llvm_assert_valid_function" > +external view_function_cfg : Llvm.llvalue -> unit = > "llvm_view_function_cfg" > +external view_function_cfg_only : Llvm.llvalue -> unit > + = "llvm_view_function_cfg_only" > > Modified: llvm/trunk/bindings/ocaml/analysis/llvm_analysis.mli > URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/bindings/ocaml/ > analysis/llvm_analysis.mli?rev=48982&r1=48981&r2=48982&view=diff > > ====================================================================== > ======== > --- llvm/trunk/bindings/ocaml/analysis/llvm_analysis.mli (original) > +++ llvm/trunk/bindings/ocaml/analysis/llvm_analysis.mli Mon Mar 31 > 11:22:09 2008 > @@ -33,3 +33,14 @@ > [llvm::verifyFunction]. *) > external assert_valid_function : Llvm.llvalue -> unit > = "llvm_assert_valid_function" > + > +(** [view_function_cfg f] opens up a ghostscript window displaying > the CFG of > + the current function with the code for each basic block inside. > + See [llvm::Function::viewCFG]. *) > +external view_function_cfg : Llvm.llvalue -> unit = > "llvm_view_function_cfg" > + > +(** [view_function_cfg_only f] works just like > [view_function_cfg], but does not > + include the contents of basic blocks into the nodes. > + See [llvm::Function::viewCFGOnly]. *) > +external view_function_cfg_only : Llvm.llvalue -> unit > + = "llvm_view_function_cfg_only" > > Modified: llvm/trunk/include/llvm-c/Analysis.h > URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm-c/ > Analysis.h?rev=48982&r1=48981&r2=48982&view=diff > > ====================================================================== > ======== > --- llvm/trunk/include/llvm-c/Analysis.h (original) > +++ llvm/trunk/include/llvm-c/Analysis.h Mon Mar 31 11:22:09 2008 > @@ -43,6 +43,10 @@ > for debugging. */ > int LLVMVerifyFunction(LLVMValueRef Fn, LLVMVerifierFailureAction > Action); > > +/* Open up a ghostview window that displays the CFG of the current > function. > + Useful for debugging. */ > +void LLVMViewFunctionCFG(LLVMValueRef Fn); > +void LLVMViewFunctionCFGOnly(LLVMValueRef Fn); > > #ifdef __cplusplus > } > > Modified: llvm/trunk/lib/Analysis/Analysis.cpp > URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Analysis/ > Analysis.cpp?rev=48982&r1=48981&r2=48982&view=diff > > ====================================================================== > ======== > --- llvm/trunk/lib/Analysis/Analysis.cpp (original) > +++ llvm/trunk/lib/Analysis/Analysis.cpp Mon Mar 31 11:22:09 2008 > @@ -33,3 +33,12 @@ > static_cast(Action)); > } > > +void LLVMViewFunctionCFG(LLVMValueRef Fn) { > + Function *F = unwrap(Fn); > + F->viewCFG(); > +} > + > +void LLVMViewFunctionCFGOnly(LLVMValueRef Fn) { > + Function *F = unwrap(Fn); > + F->viewCFGOnly(); > +} > > > _______________________________________________ > llvm-commits mailing list > llvm-commits at cs.uiuc.edu > http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits From gordonhenriksen at mac.com Mon Mar 31 13:09:24 2008 From: gordonhenriksen at mac.com (Gordon Henriksen) Date: Mon, 31 Mar 2008 14:09:24 -0400 Subject: [llvm-commits] [PATCH] Add support for generating ocaml documentation. In-Reply-To: <1205054203-480-1-git-send-email-idadesub@users.sourceforge.net> References: <> <1205054203-480-1-git-send-email-idadesub@users.sourceforge.net> Message-ID: On Mar 9, 2008, at 05:16, Erick Tryzelaar wrote: > This patch integrates automatic generation of ocaml documation > with the build system. It copies the doxygen install and > directory hierarchy. Gordon, I'll leave the re-configuration to > you. > --- > Makefile.config.in | 4 ++++ > autoconf/configure.ac | 13 +++++++++++++ > bindings/ocaml/Makefile | 6 ++++++ > bindings/ocaml/Makefile.ocaml | 6 ++++++ > docs/Makefile | 41 ++++++++++++++++++++++++++++++++ > +++------ > 5 files changed, 64 insertions(+), 6 deletions(-) Hi Erick, Could you see if it's possible to get this set up so that it builds without having previously built the rest of the source tree? I guess there are two approaches here. The first is modifying Makefile.ocaml up so that it doesn't rely upon llvm-config when invoking just the 'ocamldoc' target. I expect that's not practical. The second would be to not invoke those makefiles at all, which does mean we have to work harder to find source files to ocamldoc. We have to be careful because the .mli's are copied into the intermediate Debug|Release|Release+Asserts|etc. build directory for compatibility with retrograde compilers that don't support -c -o. It makes me squeamish, but something like this command seems to work: find `find $(LLVM_SRC_DIR)/bindings/ocaml -name Makefile -exec dirname '{}' ';'` -type d -depth 1 -prune -o -name '*.mli' -print Hopefully, just handing that blob off to ocamldoc and generating a single .odoc dump for the entire tree will work. Please test your changes with both srcdir=objdir and srcdir?objdir builds; both offer gotchas in this instance. Thanks! ? Gordon P.S. ? You can quickly achieve a pseudo-pristine source tree like this: svn status --no-ignore | perl -ne '/^I (.*)/ && print "$1\0"' | xargs -0 rm -rf (That nukes all the svn:ignore'd files.) From gordonhenriksen at mac.com Mon Mar 31 13:11:02 2008 From: gordonhenriksen at mac.com (Gordon Henriksen) Date: Mon, 31 Mar 2008 14:11:02 -0400 Subject: [llvm-commits] [llvm] r48982 - in /llvm/trunk: bindings/ocaml/analysis/analysis_ocaml.c bindings/ocaml/analysis/llvm_analysis.ml bindings/ocaml/analysis/llvm_analysis.mli include/llvm-c/Analysis.h lib/Analysis/Analysis.cpp In-Reply-To: References: <200803311622.m2VGM96J023744@zion.cs.uiuc.edu> Message-ID: <08611959-F3BC-4E23-86CA-E1D203DC5F91@mac.com> Is llvm-c included in doxygen output? On Mar 31, 2008, at 14:04, Tanya Lattner wrote: > I don't think /* comment */ works for doxygen style comments. It > should be /** comment */ and it should be for each function. > > -Tanya > > On Mar 31, 2008, at 9:22 AM, Erick Tryzelaar wrote: > >> Author: erickt >> Date: Mon Mar 31 11:22:09 2008 >> New Revision: 48982 >> >> URL: http://llvm.org/viewvc/llvm-project?rev=48982&view=rev >> Log: >> Expose Function::viewCFG and Function::viewCFGOnly to bindings. >> >> Modified: >> llvm/trunk/bindings/ocaml/analysis/analysis_ocaml.c >> llvm/trunk/bindings/ocaml/analysis/llvm_analysis.ml >> llvm/trunk/bindings/ocaml/analysis/llvm_analysis.mli >> llvm/trunk/include/llvm-c/Analysis.h >> llvm/trunk/lib/Analysis/Analysis.cpp >> >> Modified: llvm/trunk/bindings/ocaml/analysis/analysis_ocaml.c >> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/bindings/ocaml/ >> analysis/analysis_ocaml.c?rev=48982&r1=48981&r2=48982&view=diff >> >> = >> ===================================================================== >> ======== >> --- llvm/trunk/bindings/ocaml/analysis/analysis_ocaml.c (original) >> +++ llvm/trunk/bindings/ocaml/analysis/analysis_ocaml.c Mon Mar 31 >> 11:22:09 2008 >> @@ -58,3 +58,15 @@ >> LLVMVerifyFunction(Fn, LLVMAbortProcessAction); >> return Val_unit; >> } >> + >> +/* Llvm.llvalue -> unit */ >> +CAMLprim value llvm_view_function_cfg(LLVMValueRef Fn) { >> + LLVMViewFunctionCFG(Fn); >> + return Val_unit; >> +} >> + >> +/* Llvm.llvalue -> unit */ >> +CAMLprim value llvm_view_function_cfg_only(LLVMValueRef Fn) { >> + LLVMViewFunctionCFGOnly(Fn); >> + return Val_unit; >> +} >> >> Modified: llvm/trunk/bindings/ocaml/analysis/llvm_analysis.ml >> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/bindings/ocaml/ >> analysis/llvm_analysis.ml?rev=48982&r1=48981&r2=48982&view=diff >> >> = >> ===================================================================== >> ======== >> --- llvm/trunk/bindings/ocaml/analysis/llvm_analysis.ml (original) >> +++ llvm/trunk/bindings/ocaml/analysis/llvm_analysis.ml Mon Mar 31 >> 11:22:09 2008 >> @@ -17,3 +17,6 @@ >> >> external assert_valid_function : Llvm.llvalue -> unit >> = "llvm_assert_valid_function" >> +external view_function_cfg : Llvm.llvalue -> unit = >> "llvm_view_function_cfg" >> +external view_function_cfg_only : Llvm.llvalue -> unit >> + = "llvm_view_function_cfg_only" >> >> Modified: llvm/trunk/bindings/ocaml/analysis/llvm_analysis.mli >> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/bindings/ocaml/ >> analysis/llvm_analysis.mli?rev=48982&r1=48981&r2=48982&view=diff >> >> = >> ===================================================================== >> ======== >> --- llvm/trunk/bindings/ocaml/analysis/llvm_analysis.mli (original) >> +++ llvm/trunk/bindings/ocaml/analysis/llvm_analysis.mli Mon Mar 31 >> 11:22:09 2008 >> @@ -33,3 +33,14 @@ >> [llvm::verifyFunction]. *) >> external assert_valid_function : Llvm.llvalue -> unit >> = "llvm_assert_valid_function" >> + >> +(** [view_function_cfg f] opens up a ghostscript window displaying >> the CFG of >> + the current function with the code for each basic block inside. >> + See [llvm::Function::viewCFG]. *) >> +external view_function_cfg : Llvm.llvalue -> unit = >> "llvm_view_function_cfg" >> + >> +(** [view_function_cfg_only f] works just like >> [view_function_cfg], but does not >> + include the contents of basic blocks into the nodes. >> + See [llvm::Function::viewCFGOnly]. *) >> +external view_function_cfg_only : Llvm.llvalue -> unit >> + = "llvm_view_function_cfg_only" >> >> Modified: llvm/trunk/include/llvm-c/Analysis.h >> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm-c/ >> Analysis.h?rev=48982&r1=48981&r2=48982&view=diff >> >> = >> ===================================================================== >> ======== >> --- llvm/trunk/include/llvm-c/Analysis.h (original) >> +++ llvm/trunk/include/llvm-c/Analysis.h Mon Mar 31 11:22:09 2008 >> @@ -43,6 +43,10 @@ >> for debugging. */ >> int LLVMVerifyFunction(LLVMValueRef Fn, LLVMVerifierFailureAction >> Action); >> >> +/* Open up a ghostview window that displays the CFG of the current >> function. >> + Useful for debugging. */ >> +void LLVMViewFunctionCFG(LLVMValueRef Fn); >> +void LLVMViewFunctionCFGOnly(LLVMValueRef Fn); >> >> #ifdef __cplusplus >> } >> >> Modified: llvm/trunk/lib/Analysis/Analysis.cpp >> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Analysis/ >> Analysis.cpp?rev=48982&r1=48981&r2=48982&view=diff >> >> = >> ===================================================================== >> ======== >> --- llvm/trunk/lib/Analysis/Analysis.cpp (original) >> +++ llvm/trunk/lib/Analysis/Analysis.cpp Mon Mar 31 11:22:09 2008 >> @@ -33,3 +33,12 @@ >> static_cast(Action)); >> } >> >> +void LLVMViewFunctionCFG(LLVMValueRef Fn) { >> + Function *F = unwrap(Fn); >> + F->viewCFG(); >> +} >> + >> +void LLVMViewFunctionCFGOnly(LLVMValueRef Fn) { >> + Function *F = unwrap(Fn); >> + F->viewCFGOnly(); >> +} >> >> >> _______________________________________________ >> llvm-commits mailing list >> llvm-commits at cs.uiuc.edu >> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits > > _______________________________________________ > llvm-commits mailing list > llvm-commits at cs.uiuc.edu > http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits ? Gordon From lattner at apple.com Mon Mar 31 13:17:31 2008 From: lattner at apple.com (Tanya Lattner) Date: Mon, 31 Mar 2008 11:17:31 -0700 Subject: [llvm-commits] [llvm] r48982 - in /llvm/trunk: bindings/ocaml/analysis/analysis_ocaml.c bindings/ocaml/analysis/llvm_analysis.ml bindings/ocaml/analysis/llvm_analysis.mli include/llvm-c/Analysis.h lib/Analysis/Analysis.cpp In-Reply-To: <08611959-F3BC-4E23-86CA-E1D203DC5F91@mac.com> References: <200803311622.m2VGM96J023744@zion.cs.uiuc.edu> <08611959-F3BC-4E23-86CA-E1D203DC5F91@mac.com> Message-ID: On Mar 31, 2008, at 11:11 AM, Gordon Henriksen wrote: > Is llvm-c included in doxygen output? > I'm not sure, but I thought you guys were trying to get doxygen docs for ocaml bindings. If so, you'll need to fix those. Maybe I am misunderstanding :) -Tanya > On Mar 31, 2008, at 14:04, Tanya Lattner wrote: > >> I don't think /* comment */ works for doxygen style comments. It >> should be /** comment */ and it should be for each function. >> >> -Tanya >> >> On Mar 31, 2008, at 9:22 AM, Erick Tryzelaar wrote: >> >>> Author: erickt >>> Date: Mon Mar 31 11:22:09 2008 >>> New Revision: 48982 >>> >>> URL: http://llvm.org/viewvc/llvm-project?rev=48982&view=rev >>> Log: >>> Expose Function::viewCFG and Function::viewCFGOnly to bindings. >>> >>> Modified: >>> llvm/trunk/bindings/ocaml/analysis/analysis_ocaml.c >>> llvm/trunk/bindings/ocaml/analysis/llvm_analysis.ml >>> llvm/trunk/bindings/ocaml/analysis/llvm_analysis.mli >>> llvm/trunk/include/llvm-c/Analysis.h >>> llvm/trunk/lib/Analysis/Analysis.cpp >>> >>> Modified: llvm/trunk/bindings/ocaml/analysis/analysis_ocaml.c >>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/bindings/ocaml/ >>> analysis/analysis_ocaml.c?rev=48982&r1=48981&r2=48982&view=diff >>> >>> = >>> ==================================================================== >>> = >>> ======== >>> --- llvm/trunk/bindings/ocaml/analysis/analysis_ocaml.c (original) >>> +++ llvm/trunk/bindings/ocaml/analysis/analysis_ocaml.c Mon Mar 31 >>> 11:22:09 2008 >>> @@ -58,3 +58,15 @@ >>> LLVMVerifyFunction(Fn, LLVMAbortProcessAction); >>> return Val_unit; >>> } >>> + >>> +/* Llvm.llvalue -> unit */ >>> +CAMLprim value llvm_view_function_cfg(LLVMValueRef Fn) { >>> + LLVMViewFunctionCFG(Fn); >>> + return Val_unit; >>> +} >>> + >>> +/* Llvm.llvalue -> unit */ >>> +CAMLprim value llvm_view_function_cfg_only(LLVMValueRef Fn) { >>> + LLVMViewFunctionCFGOnly(Fn); >>> + return Val_unit; >>> +} >>> >>> Modified: llvm/trunk/bindings/ocaml/analysis/llvm_analysis.ml >>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/bindings/ocaml/ >>> analysis/llvm_analysis.ml?rev=48982&r1=48981&r2=48982&view=diff >>> >>> = >>> ==================================================================== >>> = >>> ======== >>> --- llvm/trunk/bindings/ocaml/analysis/llvm_analysis.ml (original) >>> +++ llvm/trunk/bindings/ocaml/analysis/llvm_analysis.ml Mon Mar 31 >>> 11:22:09 2008 >>> @@ -17,3 +17,6 @@ >>> >>> external assert_valid_function : Llvm.llvalue -> unit >>> = "llvm_assert_valid_function" >>> +external view_function_cfg : Llvm.llvalue -> unit = >>> "llvm_view_function_cfg" >>> +external view_function_cfg_only : Llvm.llvalue -> unit >>> + = "llvm_view_function_cfg_only" >>> >>> Modified: llvm/trunk/bindings/ocaml/analysis/llvm_analysis.mli >>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/bindings/ocaml/ >>> analysis/llvm_analysis.mli?rev=48982&r1=48981&r2=48982&view=diff >>> >>> = >>> ==================================================================== >>> = >>> ======== >>> --- llvm/trunk/bindings/ocaml/analysis/llvm_analysis.mli (original) >>> +++ llvm/trunk/bindings/ocaml/analysis/llvm_analysis.mli Mon Mar 31 >>> 11:22:09 2008 >>> @@ -33,3 +33,14 @@ >>> [llvm::verifyFunction]. *) >>> external assert_valid_function : Llvm.llvalue -> unit >>> = "llvm_assert_valid_function" >>> + >>> +(** [view_function_cfg f] opens up a ghostscript window displaying >>> the CFG of >>> + the current function with the code for each basic block inside. >>> + See [llvm::Function::viewCFG]. *) >>> +external view_function_cfg : Llvm.llvalue -> unit = >>> "llvm_view_function_cfg" >>> + >>> +(** [view_function_cfg_only f] works just like >>> [view_function_cfg], but does not >>> + include the contents of basic blocks into the nodes. >>> + See [llvm::Function::viewCFGOnly]. *) >>> +external view_function_cfg_only : Llvm.llvalue -> unit >>> + = "llvm_view_function_cfg_only" >>> >>> Modified: llvm/trunk/include/llvm-c/Analysis.h >>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm-c/ >>> Analysis.h?rev=48982&r1=48981&r2=48982&view=diff >>> >>> = >>> ==================================================================== >>> = >>> ======== >>> --- llvm/trunk/include/llvm-c/Analysis.h (original) >>> +++ llvm/trunk/include/llvm-c/Analysis.h Mon Mar 31 11:22:09 2008 >>> @@ -43,6 +43,10 @@ >>> for debugging. */ >>> int LLVMVerifyFunction(LLVMValueRef Fn, LLVMVerifierFailureAction >>> Action); >>> >>> +/* Open up a ghostview window that displays the CFG of the current >>> function. >>> + Useful for debugging. */ >>> +void LLVMViewFunctionCFG(LLVMValueRef Fn); >>> +void LLVMViewFunctionCFGOnly(LLVMValueRef Fn); >>> >>> #ifdef __cplusplus >>> } >>> >>> Modified: llvm/trunk/lib/Analysis/Analysis.cpp >>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Analysis/ >>> Analysis.cpp?rev=48982&r1=48981&r2=48982&view=diff >>> >>> = >>> ==================================================================== >>> = >>> ======== >>> --- llvm/trunk/lib/Analysis/Analysis.cpp (original) >>> +++ llvm/trunk/lib/Analysis/Analysis.cpp Mon Mar 31 11:22:09 2008 >>> @@ -33,3 +33,12 @@ >>> static_cast(Action)); >>> } >>> >>> +void LLVMViewFunctionCFG(LLVMValueRef Fn) { >>> + Function *F = unwrap(Fn); >>> + F->viewCFG(); >>> +} >>> + >>> +void LLVMViewFunctionCFGOnly(LLVMValueRef Fn) { >>> + Function *F = unwrap(Fn); >>> + F->viewCFGOnly(); >>> +} >>> >>> >>> _______________________________________________ >>> llvm-commits mailing list >>> llvm-commits at cs.uiuc.edu >>> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits >> >> _______________________________________________ >> llvm-commits mailing list >> llvm-commits at cs.uiuc.edu >> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits > > > > ? Gordon > > > _______________________________________________ > llvm-commits mailing list > llvm-commits at cs.uiuc.edu > http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits From dalej at apple.com Mon Mar 31 13:26:13 2008 From: dalej at apple.com (Dale Johannesen) Date: Mon, 31 Mar 2008 18:26:13 -0000 Subject: [llvm-commits] [llvm-gcc-4.2] r48988 - /llvm-gcc-4.2/trunk/gcc/config/i386/llvm-i386.cpp Message-ID: <200803311826.m2VIQDf5027568@zion.cs.uiuc.edu> Author: johannes Date: Mon Mar 31 13:26:13 2008 New Revision: 48988 URL: http://llvm.org/viewvc/llvm-project?rev=48988&view=rev Log: Put passing of vector parameters back the way it was on non-Darwin. Modified: llvm-gcc-4.2/trunk/gcc/config/i386/llvm-i386.cpp Modified: llvm-gcc-4.2/trunk/gcc/config/i386/llvm-i386.cpp URL: http://llvm.org/viewvc/llvm-project/llvm-gcc-4.2/trunk/gcc/config/i386/llvm-i386.cpp?rev=48988&r1=48987&r2=48988&view=diff ============================================================================== --- llvm-gcc-4.2/trunk/gcc/config/i386/llvm-i386.cpp (original) +++ llvm-gcc-4.2/trunk/gcc/config/i386/llvm-i386.cpp Mon Mar 31 13:26:13 2008 @@ -843,12 +843,13 @@ return true; } -/* Vectors which are not MMX nor SSE should be passed as integers. */ +/* On Darwin, vectors which are not MMX nor SSE should be passed as integers. */ bool llvm_x86_should_pass_vector_in_integer_regs(tree type) { - if (TARGET_MACHO && - TREE_CODE(type) == VECTOR_TYPE && - TYPE_SIZE(type) && - TREE_CODE(TYPE_SIZE(type))==INTEGER_CST) { + if (!TARGET_MACHO) + return false; + if (TREE_CODE(type) == VECTOR_TYPE && + TYPE_SIZE(type) && + TREE_CODE(TYPE_SIZE(type))==INTEGER_CST) { if (TREE_INT_CST_LOW(TYPE_SIZE(type))==64 && TARGET_MMX) return false; if (TREE_INT_CST_LOW(TYPE_SIZE(type))==128 && TARGET_SSE) From dalej at apple.com Mon Mar 31 13:28:12 2008 From: dalej at apple.com (Dale Johannesen) Date: Mon, 31 Mar 2008 11:28:12 -0700 Subject: [llvm-commits] [llvm-gcc-4.2] r48608 - in /llvm-gcc-4.2/trunk/gcc: config/i386/llvm-i386-target.h config/i386/llvm-i386.cpp config/rs6000/llvm-rs6000.cpp config/rs6000/rs6000.h llvm-abi.h llvm-convert.cpp In-Reply-To: <36997245-BEA4-402E-BFF2-3C14A689A98F@apple.com> References: <200803201842.m2KIgwT9002122@zion.cs.uiuc.edu> <200803251803.53233.baldrick@free.fr> <200803311344.11770.baldrick@free.fr> <36997245-BEA4-402E-BFF2-3C14A689A98F@apple.com> Message-ID: <8D828044-847C-4EC8-B1AE-0E2991FA5037@apple.com> On Mar 31, 2008, at 9:44 AM, Dale Johannesen wrote: >> cc1: Instructions.cpp:258: void llvm::CallInst::init(llvm::Value*, >> llvm::Value* const*, unsigned int): Assertion `(NumParams == FTy- >> >getNumParams() || (FTy->isVarArg() && NumParams > FTy- >> >getNumParams())) && "Calling a function with bad signature!"' >> failed. >> >> The reason is that @llvm.x86.sse.movmsk.ps is declared as >> >> declare i32 @llvm.x86.sse.movmsk.ps(<4 x float>) nounwind readnone >> >> but the vector is being passed in integer registers in the call, >> namely >> as two i64's. > > This works on darwin (<4 x float> is used consistently). > llvm_x86_should_pass_vector_in_integer_regs is all dependent on > TARGET_MACHO and presumably shouldn't be, but it may not be as > simple as removing TARGET_MACHO. Actually, I think I accidentally changed the behavior on Linux; 48988 should put it back the way it was. From gordonhenriksen at mac.com Mon Mar 31 13:28:22 2008 From: gordonhenriksen at mac.com (Gordon Henriksen) Date: Mon, 31 Mar 2008 14:28:22 -0400 Subject: [llvm-commits] [llvm] r48982 - in /llvm/trunk: bindings/ocaml/analysis/analysis_ocaml.c bindings/ocaml/analysis/llvm_analysis.ml bindings/ocaml/analysis/llvm_analysis.mli include/llvm-c/Analysis.h lib/Analysis/Analysis.cpp In-Reply-To: References: <200803311622.m2VGM96J023744@zion.cs.uiuc.edu> <08611959-F3BC-4E23-86CA-E1D203DC5F91@mac.com> Message-ID: On Mar 31, 2008, at 14:17, Tanya Lattner wrote: > On Mar 31, 2008, at 11:11 AM, Gordon Henriksen wrote: > >> Is llvm-c included in doxygen output? > > I'm not sure, but I thought you guys were trying to get doxygen docs > for ocaml bindings. If so, you'll need to fix those. Maybe I am > misunderstanding :) We're actually looking at ocamldoc, which is a separate program that operates on ML interfaces (.mli files). Does look like doxygen should pick up llvm-c, though, upon deeper investigation. ? Gordon From gohman at apple.com Mon Mar 31 13:35:47 2008 From: gohman at apple.com (Dan Gohman) Date: Mon, 31 Mar 2008 11:35:47 -0700 Subject: [llvm-commits] Speeding up instruction selection In-Reply-To: References: <00FB5805-1FA5-4534-BBD0-E6E34EC17BF1@apple.com> <1C1F9E6C-5B8E-4667-A119-4590F340FDE7@apple.com> <83CD954F-CD49-4D4B-950D-B6CB6CD1B32D@apple.com> <417E9823-6AF6-44B0-83FD-89F0CC079B6A@apple.com> Message-ID: <12135E84-9812-4EC9-84F8-62D7FCF752DB@apple.com> Hi Roman, On Mar 31, 2008, at 5:09 AM, Roman Levenstein wrote: > Hi Dan, Hi Evan, > > Here is the updated patch. > > 1) I introduced the SDOperandPtr class, as I suggested in my last > email. This class is a sort of an "intelligent" pointer. With this > class, there is no need to copy the SDOperand arrays into the > temporary SmallVectors. Therefore there is no additional overhead. Ok. I actually prefer the temporary SmallVectors approach; they incurred extra overhead when needed, while the SDOperandPtr approach spreads out overhead to a wider extent. But I don't think it's a big deal either way. > 2) Additionally, I also finally made SDOperand a member of the SDUse, > instead of using it as a base class. Now we can be sure that no > unintentional conversion of SDUse into SDOperand happens. Cool. > 3) I also changed the return types of some methods from SDUse to > SDOperand, as it was suggested during the review. Cool. > This patch passes all DejaGnu tests. Ok. I'm a bit busy at the moment; I'll be doing more work on this and your other patches hopefully soon. Dan From criswell at uiuc.edu Mon Mar 31 14:46:41 2008 From: criswell at uiuc.edu (John Criswell) Date: Mon, 31 Mar 2008 19:46:41 -0000 Subject: [llvm-commits] [poolalloc] r48992 - /poolalloc/trunk/lib/PoolAllocate/TransformFunctionBody.cpp Message-ID: <200803311946.m2VJkfDZ030313@zion.cs.uiuc.edu> Author: criswell Date: Mon Mar 31 14:46:40 2008 New Revision: 48992 URL: http://llvm.org/viewvc/llvm-project?rev=48992&view=rev Log: Added an assertion. Modified: poolalloc/trunk/lib/PoolAllocate/TransformFunctionBody.cpp Modified: poolalloc/trunk/lib/PoolAllocate/TransformFunctionBody.cpp URL: http://llvm.org/viewvc/llvm-project/poolalloc/trunk/lib/PoolAllocate/TransformFunctionBody.cpp?rev=48992&r1=48991&r2=48992&view=diff ============================================================================== --- poolalloc/trunk/lib/PoolAllocate/TransformFunctionBody.cpp (original) +++ poolalloc/trunk/lib/PoolAllocate/TransformFunctionBody.cpp Mon Mar 31 14:46:40 2008 @@ -588,6 +588,7 @@ NewCallee = CFI->Clone; ArgNodes = CFI->ArgNodes; + assert ((ECGraphs.hasGraph (*CF)) && "Function has no ECGraph!\n"); CalleeGraph = &ECGraphs.getDSGraph(*CF); } else { DEBUG(std::cerr << " Handling indirect call: " << *TheCall); From criswell at uiuc.edu Mon Mar 31 14:47:26 2008 From: criswell at uiuc.edu (John Criswell) Date: Mon, 31 Mar 2008 19:47:26 -0000 Subject: [llvm-commits] [poolalloc] r48993 - /poolalloc/trunk/lib/PoolAllocate/PASimple.cpp Message-ID: <200803311947.m2VJlQf8030341@zion.cs.uiuc.edu> Author: criswell Date: Mon Mar 31 14:47:26 2008 New Revision: 48993 URL: http://llvm.org/viewvc/llvm-project?rev=48993&view=rev Log: Record the DSNode and Pool Descriptor for every transformation of realloc(). Modified: poolalloc/trunk/lib/PoolAllocate/PASimple.cpp Modified: poolalloc/trunk/lib/PoolAllocate/PASimple.cpp URL: http://llvm.org/viewvc/llvm-project/poolalloc/trunk/lib/PoolAllocate/PASimple.cpp?rev=48993&r1=48992&r2=48993&view=diff ============================================================================== --- poolalloc/trunk/lib/PoolAllocate/PASimple.cpp (original) +++ poolalloc/trunk/lib/PoolAllocate/PASimple.cpp Mon Mar 31 14:47:26 2008 @@ -174,6 +174,10 @@ isa(CE->getOperand(0))) CF = cast(CE->getOperand(0)); if (CF && (CF->isDeclaration()) && (CF->getName() == "realloc")) { + // Associate the global pool decriptor with the DSNode + DSNode * Node = ECG.getNodeForValue(CI).getNode(); + FInfo.PoolDescriptors.insert(make_pair(Node,TheGlobalPool)); + // Mark the realloc as an instruction to delete toDelete.push_back(ii); From evan.cheng at apple.com Mon Mar 31 15:40:39 2008 From: evan.cheng at apple.com (Evan Cheng) Date: Mon, 31 Mar 2008 20:40:39 -0000 Subject: [llvm-commits] [llvm] r48995 - in /llvm/trunk: include/llvm/Target/ lib/CodeGen/ lib/Target/ARM/ lib/Target/Alpha/ lib/Target/CellSPU/ lib/Target/IA64/ lib/Target/Mips/ lib/Target/PowerPC/ lib/Target/Sparc/ lib/Target/X86/ Message-ID: <200803312040.m2VKee3Y032418@zion.cs.uiuc.edu> Author: evancheng Date: Mon Mar 31 15:40:39 2008 New Revision: 48995 URL: http://llvm.org/viewvc/llvm-project?rev=48995&view=rev Log: Move reMaterialize() from TargetRegisterInfo to TargetInstrInfo. Modified: llvm/trunk/include/llvm/Target/TargetInstrInfo.h llvm/trunk/include/llvm/Target/TargetRegisterInfo.h llvm/trunk/lib/CodeGen/TargetInstrInfoImpl.cpp llvm/trunk/lib/CodeGen/VirtRegMap.cpp llvm/trunk/lib/Target/ARM/ARMInstrInfo.cpp llvm/trunk/lib/Target/ARM/ARMInstrInfo.h llvm/trunk/lib/Target/ARM/ARMRegisterInfo.cpp llvm/trunk/lib/Target/ARM/ARMRegisterInfo.h llvm/trunk/lib/Target/Alpha/AlphaRegisterInfo.cpp llvm/trunk/lib/Target/Alpha/AlphaRegisterInfo.h llvm/trunk/lib/Target/CellSPU/SPURegisterInfo.cpp llvm/trunk/lib/Target/CellSPU/SPURegisterInfo.h llvm/trunk/lib/Target/IA64/IA64RegisterInfo.cpp llvm/trunk/lib/Target/IA64/IA64RegisterInfo.h llvm/trunk/lib/Target/Mips/MipsRegisterInfo.cpp llvm/trunk/lib/Target/Mips/MipsRegisterInfo.h llvm/trunk/lib/Target/PowerPC/PPCRegisterInfo.cpp llvm/trunk/lib/Target/PowerPC/PPCRegisterInfo.h llvm/trunk/lib/Target/Sparc/SparcRegisterInfo.cpp llvm/trunk/lib/Target/Sparc/SparcRegisterInfo.h llvm/trunk/lib/Target/X86/X86InstrInfo.cpp llvm/trunk/lib/Target/X86/X86InstrInfo.h llvm/trunk/lib/Target/X86/X86RegisterInfo.cpp llvm/trunk/lib/Target/X86/X86RegisterInfo.h Modified: llvm/trunk/include/llvm/Target/TargetInstrInfo.h URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Target/TargetInstrInfo.h?rev=48995&r1=48994&r2=48995&view=diff ============================================================================== --- llvm/trunk/include/llvm/Target/TargetInstrInfo.h (original) +++ llvm/trunk/include/llvm/Target/TargetInstrInfo.h Mon Mar 31 15:40:39 2008 @@ -112,6 +112,13 @@ return 0; } + /// reMaterialize - Re-issue the specified 'original' instruction at the + /// specific location targeting a new destination register. + virtual void reMaterialize(MachineBasicBlock &MBB, + MachineBasicBlock::iterator MI, + unsigned DestReg, + const MachineInstr *Orig) const = 0; + /// isInvariantLoad - Return true if the specified instruction (which is /// marked mayLoad) is loading from a location whose value is invariant across /// the function. For example, loading a value from the constant pool or from @@ -397,7 +404,10 @@ unsigned &OpIdx) const; virtual bool PredicateInstruction(MachineInstr *MI, const std::vector &Pred) const; - + virtual void reMaterialize(MachineBasicBlock &MBB, + MachineBasicBlock::iterator MI, + unsigned DestReg, + const MachineInstr *Orig) const; }; } // End llvm namespace Modified: llvm/trunk/include/llvm/Target/TargetRegisterInfo.h URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Target/TargetRegisterInfo.h?rev=48995&r1=48994&r2=48995&view=diff ============================================================================== --- llvm/trunk/include/llvm/Target/TargetRegisterInfo.h (original) +++ llvm/trunk/include/llvm/Target/TargetRegisterInfo.h Mon Mar 31 15:40:39 2008 @@ -487,13 +487,6 @@ return NULL; } - /// reMaterialize - Re-issue the specified 'original' instruction at the - /// specific location targeting a new destination register. - virtual void reMaterialize(MachineBasicBlock &MBB, - MachineBasicBlock::iterator MI, - unsigned DestReg, - const MachineInstr *Orig) const = 0; - /// targetHandlesStackFrameRounding - Returns true if the target is /// responsible for rounding up the stack frame (probably at emitPrologue /// time). Modified: llvm/trunk/lib/CodeGen/TargetInstrInfoImpl.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/TargetInstrInfoImpl.cpp?rev=48995&r1=48994&r2=48995&view=diff ============================================================================== --- llvm/trunk/lib/CodeGen/TargetInstrInfoImpl.cpp (original) +++ llvm/trunk/lib/CodeGen/TargetInstrInfoImpl.cpp Mon Mar 31 15:40:39 2008 @@ -84,3 +84,13 @@ } return MadeChange; } + +void TargetInstrInfoImpl::reMaterialize(MachineBasicBlock &MBB, + MachineBasicBlock::iterator I, + unsigned DestReg, + const MachineInstr *Orig) const { + MachineInstr *MI = Orig->clone(); + MI->getOperand(0).setReg(DestReg); + MBB.insert(I, MI); +} + Modified: llvm/trunk/lib/CodeGen/VirtRegMap.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/VirtRegMap.cpp?rev=48995&r1=48994&r2=48995&view=diff ============================================================================== --- llvm/trunk/lib/CodeGen/VirtRegMap.cpp (original) +++ llvm/trunk/lib/CodeGen/VirtRegMap.cpp Mon Mar 31 15:40:39 2008 @@ -642,9 +642,10 @@ static void ReMaterialize(MachineBasicBlock &MBB, MachineBasicBlock::iterator &MII, unsigned DestReg, unsigned Reg, + const TargetInstrInfo *TII, const TargetRegisterInfo *TRI, VirtRegMap &VRM) { - TRI->reMaterialize(MBB, MII, DestReg, VRM.getReMaterializedMI(Reg)); + TII->reMaterialize(MBB, MII, DestReg, VRM.getReMaterializedMI(Reg)); MachineInstr *NewMI = prior(MII); for (unsigned i = 0, e = NewMI->getNumOperands(); i != e; ++i) { MachineOperand &MO = NewMI->getOperand(i); @@ -784,7 +785,7 @@ MachineBasicBlock::iterator MII = MI; if (NewOp.StackSlotOrReMat > VirtRegMap::MAX_STACK_SLOT) { - ReMaterialize(*MBB, MII, NewPhysReg, NewOp.VirtReg, TRI, VRM); + ReMaterialize(*MBB, MII, NewPhysReg, NewOp.VirtReg, TII, TRI,VRM); } else { TII->loadRegFromStackSlot(*MBB, MII, NewPhysReg, NewOp.StackSlotOrReMat, AliasRC); @@ -1098,7 +1099,7 @@ unsigned Phys = VRM.getPhys(VirtReg); RegInfo->setPhysRegUsed(Phys); if (VRM.isReMaterialized(VirtReg)) { - ReMaterialize(MBB, MII, Phys, VirtReg, TRI, VRM); + ReMaterialize(MBB, MII, Phys, VirtReg, TII, TRI, VRM); } else { const TargetRegisterClass* RC = RegInfo->getRegClass(VirtReg); int SS = VRM.getStackSlot(VirtReg); @@ -1351,7 +1352,7 @@ RegInfo->setPhysRegUsed(PhysReg); ReusedOperands.markClobbered(PhysReg); if (DoReMat) { - ReMaterialize(MBB, MII, PhysReg, VirtReg, TRI, VRM); + ReMaterialize(MBB, MII, PhysReg, VirtReg, TII, TRI, VRM); } else { const TargetRegisterClass* RC = RegInfo->getRegClass(VirtReg); TII->loadRegFromStackSlot(MBB, &MI, PhysReg, SSorRMId, RC); Modified: llvm/trunk/lib/Target/ARM/ARMInstrInfo.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/ARM/ARMInstrInfo.cpp?rev=48995&r1=48994&r2=48995&view=diff ============================================================================== --- llvm/trunk/lib/Target/ARM/ARMInstrInfo.cpp (original) +++ llvm/trunk/lib/Target/ARM/ARMInstrInfo.cpp Mon Mar 31 15:40:39 2008 @@ -141,6 +141,22 @@ return 0; } +void ARMInstrInfo::reMaterialize(MachineBasicBlock &MBB, + MachineBasicBlock::iterator I, + unsigned DestReg, + const MachineInstr *Orig) const { + if (Orig->getOpcode() == ARM::MOVi2pieces) { + RI.emitLoadConstPool(MBB, I, DestReg, Orig->getOperand(1).getImm(), + Orig->getOperand(2).getImm(), + Orig->getOperand(3).getReg(), this, false); + return; + } + + MachineInstr *MI = Orig->clone(); + MI->getOperand(0).setReg(DestReg); + MBB.insert(I, MI); +} + static unsigned getUnindexedOpcode(unsigned Opc) { switch (Opc) { default: break; @@ -934,3 +950,4 @@ } return FnSize; } + Modified: llvm/trunk/lib/Target/ARM/ARMInstrInfo.h URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/ARM/ARMInstrInfo.h?rev=48995&r1=48994&r2=48995&view=diff ============================================================================== --- llvm/trunk/lib/Target/ARM/ARMInstrInfo.h (original) +++ llvm/trunk/lib/Target/ARM/ARMInstrInfo.h Mon Mar 31 15:40:39 2008 @@ -148,6 +148,9 @@ virtual unsigned isLoadFromStackSlot(MachineInstr *MI, int &FrameIndex) const; virtual unsigned isStoreToStackSlot(MachineInstr *MI, int &FrameIndex) const; + void reMaterialize(MachineBasicBlock &MBB, MachineBasicBlock::iterator MI, + unsigned DestReg, const MachineInstr *Orig) const; + virtual MachineInstr *convertToThreeAddress(MachineFunction::iterator &MFI, MachineBasicBlock::iterator &MBBI, LiveVariables &LV) const; Modified: llvm/trunk/lib/Target/ARM/ARMRegisterInfo.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/ARM/ARMRegisterInfo.cpp?rev=48995&r1=48994&r2=48995&view=diff ============================================================================== --- llvm/trunk/lib/Target/ARM/ARMRegisterInfo.cpp (original) +++ llvm/trunk/lib/Target/ARM/ARMRegisterInfo.cpp Mon Mar 31 15:40:39 2008 @@ -100,38 +100,21 @@ /// emitLoadConstPool - Emits a load from constpool to materialize the /// specified immediate. -static void emitLoadConstPool(MachineBasicBlock &MBB, - MachineBasicBlock::iterator &MBBI, - unsigned DestReg, int Val, - ARMCC::CondCodes Pred, unsigned PredReg, - const TargetInstrInfo &TII, bool isThumb) { +void ARMRegisterInfo::emitLoadConstPool(MachineBasicBlock &MBB, + MachineBasicBlock::iterator &MBBI, + unsigned DestReg, int Val, + unsigned Pred, unsigned PredReg, + const TargetInstrInfo *TII, + bool isThumb) const { MachineFunction &MF = *MBB.getParent(); MachineConstantPool *ConstantPool = MF.getConstantPool(); Constant *C = ConstantInt::get(Type::Int32Ty, Val); unsigned Idx = ConstantPool->getConstantPoolIndex(C, 2); if (isThumb) - BuildMI(MBB, MBBI, TII.get(ARM::tLDRcp), DestReg).addConstantPoolIndex(Idx); + BuildMI(MBB, MBBI, TII->get(ARM::tLDRcp),DestReg).addConstantPoolIndex(Idx); else - BuildMI(MBB, MBBI, TII.get(ARM::LDRcp), DestReg).addConstantPoolIndex(Idx) - .addReg(0).addImm(0).addImm((unsigned)Pred).addReg(PredReg); -} - -void ARMRegisterInfo::reMaterialize(MachineBasicBlock &MBB, - MachineBasicBlock::iterator I, - unsigned DestReg, - const MachineInstr *Orig) const { - if (Orig->getOpcode() == ARM::MOVi2pieces) { - emitLoadConstPool(MBB, I, DestReg, - Orig->getOperand(1).getImm(), - (ARMCC::CondCodes)Orig->getOperand(2).getImm(), - Orig->getOperand(3).getReg(), - TII, false); - return; - } - - MachineInstr *MI = Orig->clone(); - MI->getOperand(0).setReg(DestReg); - MBB.insert(I, MI); + BuildMI(MBB, MBBI, TII->get(ARM::LDRcp), DestReg).addConstantPoolIndex(Idx) + .addReg(0).addImm(0).addImm(Pred).addReg(PredReg); } /// isLowRegister - Returns true if the register is low register r0-r7. @@ -344,7 +327,7 @@ BuildMI(MBB, MBBI, TII.get(ARM::tNEG), LdReg) .addReg(LdReg, false, false, true); } else - emitLoadConstPool(MBB, MBBI, LdReg, NumBytes, ARMCC::AL, 0, TII, true); + MRI.emitLoadConstPool(MBB, MBBI, LdReg, NumBytes, ARMCC::AL, 0,&TII,true); // Emit add / sub. int Opc = (isSub) ? ARM::tSUBrr : (isHigh ? ARM::tADDhirr : ARM::tADDrr); @@ -785,7 +768,7 @@ emitThumbRegPlusImmInReg(MBB, II, TmpReg, FrameReg, Offset, false, TII, *this); else { - emitLoadConstPool(MBB, II, TmpReg, Offset, ARMCC::AL, 0, TII, true); + emitLoadConstPool(MBB, II, TmpReg, Offset, ARMCC::AL, 0, &TII, true); UseRR = true; } } else @@ -822,7 +805,7 @@ emitThumbRegPlusImmInReg(MBB, II, TmpReg, FrameReg, Offset, false, TII, *this); else { - emitLoadConstPool(MBB, II, TmpReg, Offset, ARMCC::AL, 0, TII, true); + emitLoadConstPool(MBB, II, TmpReg, Offset, ARMCC::AL, 0, &TII, true); UseRR = true; } } else @@ -1402,4 +1385,3 @@ } #include "ARMGenRegisterInfo.inc" - Modified: llvm/trunk/lib/Target/ARM/ARMRegisterInfo.h URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/ARM/ARMRegisterInfo.h?rev=48995&r1=48994&r2=48995&view=diff ============================================================================== --- llvm/trunk/lib/Target/ARM/ARMRegisterInfo.h (original) +++ llvm/trunk/lib/Target/ARM/ARMRegisterInfo.h Mon Mar 31 15:40:39 2008 @@ -32,14 +32,19 @@ public: ARMRegisterInfo(const TargetInstrInfo &tii, const ARMSubtarget &STI); + /// emitLoadConstPool - Emits a load from constpool to materialize the + /// specified immediate. + void emitLoadConstPool(MachineBasicBlock &MBB, + MachineBasicBlock::iterator &MBBI, + unsigned DestReg, int Val, + unsigned Pred, unsigned PredReg, + const TargetInstrInfo *TII, bool isThumb) const; + /// getRegisterNumbering - Given the enum value for some register, e.g. /// ARM::LR, return the number that it corresponds to (e.g. 14). static unsigned getRegisterNumbering(unsigned RegEnum); /// Code Generation virtual methods... - void reMaterialize(MachineBasicBlock &MBB, MachineBasicBlock::iterator MI, - unsigned DestReg, const MachineInstr *Orig) const; - const unsigned *getCalleeSavedRegs(const MachineFunction *MF = 0) const; const TargetRegisterClass* const* Modified: llvm/trunk/lib/Target/Alpha/AlphaRegisterInfo.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/Alpha/AlphaRegisterInfo.cpp?rev=48995&r1=48994&r2=48995&view=diff ============================================================================== --- llvm/trunk/lib/Target/Alpha/AlphaRegisterInfo.cpp (original) +++ llvm/trunk/lib/Target/Alpha/AlphaRegisterInfo.cpp Mon Mar 31 15:40:39 2008 @@ -58,15 +58,6 @@ { } -void AlphaRegisterInfo::reMaterialize(MachineBasicBlock &MBB, - MachineBasicBlock::iterator I, - unsigned DestReg, - const MachineInstr *Orig) const { - MachineInstr *MI = Orig->clone(); - MI->getOperand(0).setReg(DestReg); - MBB.insert(I, MI); -} - const unsigned* AlphaRegisterInfo::getCalleeSavedRegs(const MachineFunction *MF) const { static const unsigned CalleeSavedRegs[] = { Modified: llvm/trunk/lib/Target/Alpha/AlphaRegisterInfo.h URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/Alpha/AlphaRegisterInfo.h?rev=48995&r1=48994&r2=48995&view=diff ============================================================================== --- llvm/trunk/lib/Target/Alpha/AlphaRegisterInfo.h (original) +++ llvm/trunk/lib/Target/Alpha/AlphaRegisterInfo.h Mon Mar 31 15:40:39 2008 @@ -28,9 +28,6 @@ AlphaRegisterInfo(const TargetInstrInfo &tii); /// Code Generation virtual methods... - void reMaterialize(MachineBasicBlock &MBB, MachineBasicBlock::iterator MI, - unsigned DestReg, const MachineInstr *Orig) const; - const unsigned *getCalleeSavedRegs(const MachineFunction *MF = 0) const; const TargetRegisterClass* const* getCalleeSavedRegClasses( Modified: llvm/trunk/lib/Target/CellSPU/SPURegisterInfo.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/CellSPU/SPURegisterInfo.cpp?rev=48995&r1=48994&r2=48995&view=diff ============================================================================== --- llvm/trunk/lib/Target/CellSPU/SPURegisterInfo.cpp (original) +++ llvm/trunk/lib/Target/CellSPU/SPURegisterInfo.cpp Mon Mar 31 15:40:39 2008 @@ -191,15 +191,6 @@ { } -void SPURegisterInfo::reMaterialize(MachineBasicBlock &MBB, - MachineBasicBlock::iterator I, - unsigned DestReg, - const MachineInstr *Orig) const { - MachineInstr *MI = Orig->clone(); - MI->getOperand(0).setReg(DestReg); - MBB.insert(I, MI); -} - // SPU's 128-bit registers used for argument passing: static const unsigned SPU_ArgRegs[] = { SPU::R3, SPU::R4, SPU::R5, SPU::R6, SPU::R7, SPU::R8, SPU::R9, Modified: llvm/trunk/lib/Target/CellSPU/SPURegisterInfo.h URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/CellSPU/SPURegisterInfo.h?rev=48995&r1=48994&r2=48995&view=diff ============================================================================== --- llvm/trunk/lib/Target/CellSPU/SPURegisterInfo.h (original) +++ llvm/trunk/lib/Target/CellSPU/SPURegisterInfo.h Mon Mar 31 15:40:39 2008 @@ -41,9 +41,6 @@ */ static unsigned getRegisterNumbering(unsigned RegEnum); - void reMaterialize(MachineBasicBlock &MBB, MachineBasicBlock::iterator MI, - unsigned DestReg, const MachineInstr *Orig) const; - //! Return the array of callee-saved registers virtual const unsigned* getCalleeSavedRegs(const MachineFunction *MF) const; Modified: llvm/trunk/lib/Target/IA64/IA64RegisterInfo.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/IA64/IA64RegisterInfo.cpp?rev=48995&r1=48994&r2=48995&view=diff ============================================================================== --- llvm/trunk/lib/Target/IA64/IA64RegisterInfo.cpp (original) +++ llvm/trunk/lib/Target/IA64/IA64RegisterInfo.cpp Mon Mar 31 15:40:39 2008 @@ -37,15 +37,6 @@ : IA64GenRegisterInfo(IA64::ADJUSTCALLSTACKDOWN, IA64::ADJUSTCALLSTACKUP), TII(tii) {} -void IA64RegisterInfo::reMaterialize(MachineBasicBlock &MBB, - MachineBasicBlock::iterator I, - unsigned DestReg, - const MachineInstr *Orig) const { - MachineInstr *MI = Orig->clone(); - MI->getOperand(0).setReg(DestReg); - MBB.insert(I, MI); -} - const unsigned* IA64RegisterInfo::getCalleeSavedRegs(const MachineFunction *MF) const { static const unsigned CalleeSavedRegs[] = { Modified: llvm/trunk/lib/Target/IA64/IA64RegisterInfo.h URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/IA64/IA64RegisterInfo.h?rev=48995&r1=48994&r2=48995&view=diff ============================================================================== --- llvm/trunk/lib/Target/IA64/IA64RegisterInfo.h (original) +++ llvm/trunk/lib/Target/IA64/IA64RegisterInfo.h Mon Mar 31 15:40:39 2008 @@ -27,9 +27,6 @@ IA64RegisterInfo(const TargetInstrInfo &tii); /// Code Generation virtual methods... - void reMaterialize(MachineBasicBlock &MBB, MachineBasicBlock::iterator MI, - unsigned DestReg, const MachineInstr *Orig) const; - const unsigned *getCalleeSavedRegs(const MachineFunction *MF = 0) const; const TargetRegisterClass* const* getCalleeSavedRegClasses( Modified: llvm/trunk/lib/Target/Mips/MipsRegisterInfo.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/Mips/MipsRegisterInfo.cpp?rev=48995&r1=48994&r2=48995&view=diff ============================================================================== --- llvm/trunk/lib/Target/Mips/MipsRegisterInfo.cpp (original) +++ llvm/trunk/lib/Target/Mips/MipsRegisterInfo.cpp Mon Mar 31 15:40:39 2008 @@ -84,16 +84,6 @@ return 0; // Not reached } -void MipsRegisterInfo::reMaterialize(MachineBasicBlock &MBB, - MachineBasicBlock::iterator I, - unsigned DestReg, - const MachineInstr *Orig) const -{ - MachineInstr *MI = Orig->clone(); - MI->getOperand(0).setReg(DestReg); - MBB.insert(I, MI); -} - //===----------------------------------------------------------------------===// // // Callee Saved Registers methods Modified: llvm/trunk/lib/Target/Mips/MipsRegisterInfo.h URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/Mips/MipsRegisterInfo.h?rev=48995&r1=48994&r2=48995&view=diff ============================================================================== --- llvm/trunk/lib/Target/Mips/MipsRegisterInfo.h (original) +++ llvm/trunk/lib/Target/Mips/MipsRegisterInfo.h Mon Mar 31 15:40:39 2008 @@ -32,9 +32,6 @@ static unsigned getRegisterNumbering(unsigned RegEnum); /// Code Generation virtual methods... - void reMaterialize(MachineBasicBlock &MBB, MachineBasicBlock::iterator MI, - unsigned DestReg, const MachineInstr *Orig) const; - const unsigned *getCalleeSavedRegs(const MachineFunction* MF = 0) const; const TargetRegisterClass* const* Modified: llvm/trunk/lib/Target/PowerPC/PPCRegisterInfo.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/PowerPC/PPCRegisterInfo.cpp?rev=48995&r1=48994&r2=48995&view=diff ============================================================================== --- llvm/trunk/lib/Target/PowerPC/PPCRegisterInfo.cpp (original) +++ llvm/trunk/lib/Target/PowerPC/PPCRegisterInfo.cpp Mon Mar 31 15:40:39 2008 @@ -136,15 +136,6 @@ ImmToIdxMap[PPC::ADDI8] = PPC::ADD8; ImmToIdxMap[PPC::STD_32] = PPC::STDX_32; } -void PPCRegisterInfo::reMaterialize(MachineBasicBlock &MBB, - MachineBasicBlock::iterator I, - unsigned DestReg, - const MachineInstr *Orig) const { - MachineInstr *MI = Orig->clone(); - MI->getOperand(0).setReg(DestReg); - MBB.insert(I, MI); -} - const unsigned* PPCRegisterInfo::getCalleeSavedRegs(const MachineFunction *MF) const { // 32-bit Darwin calling convention. Modified: llvm/trunk/lib/Target/PowerPC/PPCRegisterInfo.h URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/PowerPC/PPCRegisterInfo.h?rev=48995&r1=48994&r2=48995&view=diff ============================================================================== --- llvm/trunk/lib/Target/PowerPC/PPCRegisterInfo.h (original) +++ llvm/trunk/lib/Target/PowerPC/PPCRegisterInfo.h Mon Mar 31 15:40:39 2008 @@ -36,9 +36,6 @@ static unsigned getRegisterNumbering(unsigned RegEnum); /// Code Generation virtual methods... - void reMaterialize(MachineBasicBlock &MBB, MachineBasicBlock::iterator MI, - unsigned DestReg, const MachineInstr *Orig) const; - const unsigned *getCalleeSavedRegs(const MachineFunction* MF = 0) const; const TargetRegisterClass* const* Modified: llvm/trunk/lib/Target/Sparc/SparcRegisterInfo.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/Sparc/SparcRegisterInfo.cpp?rev=48995&r1=48994&r2=48995&view=diff ============================================================================== --- llvm/trunk/lib/Target/Sparc/SparcRegisterInfo.cpp (original) +++ llvm/trunk/lib/Target/Sparc/SparcRegisterInfo.cpp Mon Mar 31 15:40:39 2008 @@ -30,15 +30,6 @@ Subtarget(st), TII(tii) { } -void SparcRegisterInfo::reMaterialize(MachineBasicBlock &MBB, - MachineBasicBlock::iterator I, - unsigned DestReg, - const MachineInstr *Orig) const { - MachineInstr *MI = Orig->clone(); - MI->getOperand(0).setReg(DestReg); - MBB.insert(I, MI); -} - const unsigned* SparcRegisterInfo::getCalleeSavedRegs(const MachineFunction *MF) const { static const unsigned CalleeSavedRegs[] = { 0 }; Modified: llvm/trunk/lib/Target/Sparc/SparcRegisterInfo.h URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/Sparc/SparcRegisterInfo.h?rev=48995&r1=48994&r2=48995&view=diff ============================================================================== --- llvm/trunk/lib/Target/Sparc/SparcRegisterInfo.h (original) +++ llvm/trunk/lib/Target/Sparc/SparcRegisterInfo.h Mon Mar 31 15:40:39 2008 @@ -30,9 +30,6 @@ SparcRegisterInfo(SparcSubtarget &st, const TargetInstrInfo &tii); /// Code Generation virtual methods... - void reMaterialize(MachineBasicBlock &MBB, MachineBasicBlock::iterator MI, - unsigned DestReg, const MachineInstr *Orig) const; - const unsigned *getCalleeSavedRegs(const MachineFunction *MF = 0) const; const TargetRegisterClass* const* getCalleeSavedRegClasses( Modified: llvm/trunk/lib/Target/X86/X86InstrInfo.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/X86/X86InstrInfo.cpp?rev=48995&r1=48994&r2=48995&view=diff ============================================================================== --- llvm/trunk/lib/Target/X86/X86InstrInfo.cpp (original) +++ llvm/trunk/lib/Target/X86/X86InstrInfo.cpp Mon Mar 31 15:40:39 2008 @@ -820,6 +820,34 @@ return true; } +void X86InstrInfo::reMaterialize(MachineBasicBlock &MBB, + MachineBasicBlock::iterator I, + unsigned DestReg, + const MachineInstr *Orig) const { + // MOV32r0 etc. are implemented with xor which clobbers condition code. + // Re-materialize them as movri instructions to avoid side effects. + switch (Orig->getOpcode()) { + case X86::MOV8r0: + BuildMI(MBB, I, get(X86::MOV8ri), DestReg).addImm(0); + break; + case X86::MOV16r0: + BuildMI(MBB, I, get(X86::MOV16ri), DestReg).addImm(0); + break; + case X86::MOV32r0: + BuildMI(MBB, I, get(X86::MOV32ri), DestReg).addImm(0); + break; + case X86::MOV64r0: + BuildMI(MBB, I, get(X86::MOV64ri32), DestReg).addImm(0); + break; + default: { + MachineInstr *MI = Orig->clone(); + MI->getOperand(0).setReg(DestReg); + MBB.insert(I, MI); + break; + } + } +} + /// isInvariantLoad - Return true if the specified instruction (which is marked /// mayLoad) is loading from a location whose value is invariant across the /// function. For example, loading a value from the constant pool or from Modified: llvm/trunk/lib/Target/X86/X86InstrInfo.h URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/X86/X86InstrInfo.h?rev=48995&r1=48994&r2=48995&view=diff ============================================================================== --- llvm/trunk/lib/Target/X86/X86InstrInfo.h (original) +++ llvm/trunk/lib/Target/X86/X86InstrInfo.h Mon Mar 31 15:40:39 2008 @@ -258,7 +258,11 @@ unsigned& destReg) const; unsigned isLoadFromStackSlot(MachineInstr *MI, int &FrameIndex) const; unsigned isStoreToStackSlot(MachineInstr *MI, int &FrameIndex) const; + bool isReallyTriviallyReMaterializable(MachineInstr *MI) const; + void reMaterialize(MachineBasicBlock &MBB, MachineBasicBlock::iterator MI, + unsigned DestReg, const MachineInstr *Orig) const; + bool isInvariantLoad(MachineInstr *MI) const; /// convertToThreeAddress - This method must be implemented by targets that Modified: llvm/trunk/lib/Target/X86/X86RegisterInfo.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/X86/X86RegisterInfo.cpp?rev=48995&r1=48994&r2=48995&view=diff ============================================================================== --- llvm/trunk/lib/Target/X86/X86RegisterInfo.cpp (original) +++ llvm/trunk/lib/Target/X86/X86RegisterInfo.cpp Mon Mar 31 15:40:39 2008 @@ -155,34 +155,6 @@ return NULL; } -void X86RegisterInfo::reMaterialize(MachineBasicBlock &MBB, - MachineBasicBlock::iterator I, - unsigned DestReg, - const MachineInstr *Orig) const { - // MOV32r0 etc. are implemented with xor which clobbers condition code. - // Re-materialize them as movri instructions to avoid side effects. - switch (Orig->getOpcode()) { - case X86::MOV8r0: - BuildMI(MBB, I, TII.get(X86::MOV8ri), DestReg).addImm(0); - break; - case X86::MOV16r0: - BuildMI(MBB, I, TII.get(X86::MOV16ri), DestReg).addImm(0); - break; - case X86::MOV32r0: - BuildMI(MBB, I, TII.get(X86::MOV32ri), DestReg).addImm(0); - break; - case X86::MOV64r0: - BuildMI(MBB, I, TII.get(X86::MOV64ri32), DestReg).addImm(0); - break; - default: { - MachineInstr *MI = Orig->clone(); - MI->getOperand(0).setReg(DestReg); - MBB.insert(I, MI); - break; - } - } -} - const unsigned * X86RegisterInfo::getCalleeSavedRegs(const MachineFunction *MF) const { static const unsigned CalleeSavedRegs32Bit[] = { Modified: llvm/trunk/lib/Target/X86/X86RegisterInfo.h URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/X86/X86RegisterInfo.h?rev=48995&r1=48994&r2=48995&view=diff ============================================================================== --- llvm/trunk/lib/Target/X86/X86RegisterInfo.h (original) +++ llvm/trunk/lib/Target/X86/X86RegisterInfo.h Mon Mar 31 15:40:39 2008 @@ -97,9 +97,6 @@ const TargetRegisterClass * getCrossCopyRegClass(const TargetRegisterClass *RC) const; - void reMaterialize(MachineBasicBlock &MBB, MachineBasicBlock::iterator MI, - unsigned DestReg, const MachineInstr *Orig) const; - /// getCalleeSavedRegs - Return a null-terminated list of all of the /// callee-save registers on this target. const unsigned *getCalleeSavedRegs(const MachineFunction* MF = 0) const; From gohman at apple.com Mon Mar 31 15:32:52 2008 From: gohman at apple.com (Dan Gohman) Date: Mon, 31 Mar 2008 20:32:52 -0000 Subject: [llvm-commits] [llvm] r48994 - in /llvm/trunk: lib/CodeGen/SelectionDAG/DAGCombiner.cpp test/CodeGen/X86/pr2182.ll Message-ID: <200803312032.m2VKWqZK032124@zion.cs.uiuc.edu> Author: djg Date: Mon Mar 31 15:32:52 2008 New Revision: 48994 URL: http://llvm.org/viewvc/llvm-project?rev=48994&view=rev Log: Fix a DAGCombiner optimization to respect volatile qualification. Added: llvm/trunk/test/CodeGen/X86/pr2182.ll Modified: llvm/trunk/lib/CodeGen/SelectionDAG/DAGCombiner.cpp Modified: llvm/trunk/lib/CodeGen/SelectionDAG/DAGCombiner.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/SelectionDAG/DAGCombiner.cpp?rev=48994&r1=48993&r2=48994&view=diff ============================================================================== --- llvm/trunk/lib/CodeGen/SelectionDAG/DAGCombiner.cpp (original) +++ llvm/trunk/lib/CodeGen/SelectionDAG/DAGCombiner.cpp Mon Mar 31 15:32:52 2008 @@ -4387,7 +4387,8 @@ // value. // TODO: Handle store large -> read small portion. // TODO: Handle TRUNCSTORE/LOADEXT - if (LD->getExtensionType() == ISD::NON_EXTLOAD) { + if (LD->getExtensionType() == ISD::NON_EXTLOAD && + !LD->isVolatile()) { if (ISD::isNON_TRUNCStore(Chain.Val)) { StoreSDNode *PrevST = cast(Chain); if (PrevST->getBasePtr() == Ptr && Added: llvm/trunk/test/CodeGen/X86/pr2182.ll URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/X86/pr2182.ll?rev=48994&view=auto ============================================================================== --- llvm/trunk/test/CodeGen/X86/pr2182.ll (added) +++ llvm/trunk/test/CodeGen/X86/pr2182.ll Mon Mar 31 15:32:52 2008 @@ -0,0 +1,24 @@ +; RUN: llvm-as < %s | llc | grep {addl \$3, (%eax)} | count 4 +; PR2182 + +target datalayout = +"e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-a0:0:64-f80:128:128" +target triple = "i386-apple-darwin8" + at x = weak global i32 0 ; [#uses=8] + +define void @loop_2() nounwind { +entry: + %tmp = volatile load i32* @x, align 4 ; [#uses=1] + %tmp1 = add i32 %tmp, 3 ; [#uses=1] + volatile store i32 %tmp1, i32* @x, align 4 + %tmp.1 = volatile load i32* @x, align 4 ; [#uses=1] + %tmp1.1 = add i32 %tmp.1, 3 ; [#uses=1] + volatile store i32 %tmp1.1, i32* @x, align 4 + %tmp.2 = volatile load i32* @x, align 4 ; [#uses=1] + %tmp1.2 = add i32 %tmp.2, 3 ; [#uses=1] + volatile store i32 %tmp1.2, i32* @x, align 4 + %tmp.3 = volatile load i32* @x, align 4 ; [#uses=1] + %tmp1.3 = add i32 %tmp.3, 3 ; [#uses=1] + volatile store i32 %tmp1.3, i32* @x, align 4 + ret void +} From gohman at apple.com Mon Mar 31 17:08:01 2008 From: gohman at apple.com (Dan Gohman) Date: Mon, 31 Mar 2008 22:08:01 -0000 Subject: [llvm-commits] [llvm] r48999 - /llvm/trunk/lib/Analysis/MemoryDependenceAnalysis.cpp Message-ID: <200803312208.m2VM81vX002558@zion.cs.uiuc.edu> Author: djg Date: Mon Mar 31 17:08:00 2008 New Revision: 48999 URL: http://llvm.org/viewvc/llvm-project?rev=48999&view=rev Log: Set blockBegin to point to the beginning of the block, not the end. Modified: llvm/trunk/lib/Analysis/MemoryDependenceAnalysis.cpp Modified: llvm/trunk/lib/Analysis/MemoryDependenceAnalysis.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Analysis/MemoryDependenceAnalysis.cpp?rev=48999&r1=48998&r2=48999&view=diff ============================================================================== --- llvm/trunk/lib/Analysis/MemoryDependenceAnalysis.cpp (original) +++ llvm/trunk/lib/Analysis/MemoryDependenceAnalysis.cpp Mon Mar 31 17:08:00 2008 @@ -99,11 +99,11 @@ // If the starting point was specifiy, use it if (start) { QI = start; - blockBegin = start->getParent()->end(); + blockBegin = start->getParent()->begin(); // If the starting point wasn't specified, but the block was, use it } else if (!start && block) { QI = block->end(); - blockBegin = block->end(); + blockBegin = block->begin(); } // Walk backwards through the block, looking for dependencies From natebegeman at mac.com Mon Mar 31 17:19:25 2008 From: natebegeman at mac.com (Nate Begeman) Date: Mon, 31 Mar 2008 22:19:25 -0000 Subject: [llvm-commits] [llvm] r49000 - /llvm/trunk/lib/System/Unix/Process.inc Message-ID: <200803312219.m2VMJQVN002954@zion.cs.uiuc.edu> Author: sampo Date: Mon Mar 31 17:19:25 2008 New Revision: 49000 URL: http://llvm.org/viewvc/llvm-project?rev=49000&view=rev Log: Actually disable crash reporting on Mac OS X, returning bugpoint to speedy crash miscompilations. Modified: llvm/trunk/lib/System/Unix/Process.inc Modified: llvm/trunk/lib/System/Unix/Process.inc URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/System/Unix/Process.inc?rev=49000&r1=48999&r2=49000&view=diff ============================================================================== --- llvm/trunk/lib/System/Unix/Process.inc (original) +++ llvm/trunk/lib/System/Unix/Process.inc Mon Mar 31 17:19:25 2008 @@ -123,10 +123,6 @@ return getgid(); } -#ifdef HAVE_MACH_MACH_H -#include -#endif - // Some LLVM programs such as bugpoint produce core files as a normal part of // their operation. To prevent the disk from filling up, this function // does what's necessary to prevent their generation. @@ -138,25 +134,12 @@ #endif #ifdef HAVE_MACH_MACH_H - // Disable crash reporting on Mac OS/X. - - // get information about the original set of exception ports for the task - mach_msg_type_number_t Count = 0; - exception_mask_t OriginalMasks[EXC_TYPES_COUNT]; - exception_port_t OriginalPorts[EXC_TYPES_COUNT]; - exception_behavior_t OriginalBehaviors[EXC_TYPES_COUNT]; - thread_state_flavor_t OriginalFlavors[EXC_TYPES_COUNT]; - kern_return_t err = - task_get_exception_ports(mach_task_self(), EXC_MASK_ALL, OriginalMasks, - &Count, OriginalPorts, OriginalBehaviors, - OriginalFlavors); - if (err == KERN_SUCCESS) { - // replace each with MACH_PORT_NULL. - for (unsigned i = 0; i != Count; ++i) - task_set_exception_ports(mach_task_self(), OriginalMasks[i], - MACH_PORT_NULL, OriginalBehaviors[i], - OriginalFlavors[i]); - } + // Disable crash reporting on Mac OS X. + signal(SIGABRT, _exit); + signal(SIGILL, _exit); + signal(SIGFPE, _exit); + signal(SIGSEGV, _exit); + signal(SIGBUS, _exit); #endif } From evan.cheng at apple.com Mon Mar 31 18:19:51 2008 From: evan.cheng at apple.com (Evan Cheng) Date: Mon, 31 Mar 2008 23:19:51 -0000 Subject: [llvm-commits] [llvm] r49002 - in /llvm/trunk: lib/CodeGen/LiveIntervalAnalysis.cpp lib/Target/X86/X86InstrInfo.cpp test/CodeGen/X86/2008-03-31-SpillerFoldingBug.ll Message-ID: <200803312319.m2VNJpDM004834@zion.cs.uiuc.edu> Author: evancheng Date: Mon Mar 31 18:19:51 2008 New Revision: 49002 URL: http://llvm.org/viewvc/llvm-project?rev=49002&view=rev Log: It's not safe to fold a load from GV stub or constantpool into a two-address use. Added: llvm/trunk/test/CodeGen/X86/2008-03-31-SpillerFoldingBug.ll Modified: llvm/trunk/lib/CodeGen/LiveIntervalAnalysis.cpp llvm/trunk/lib/Target/X86/X86InstrInfo.cpp Modified: llvm/trunk/lib/CodeGen/LiveIntervalAnalysis.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/LiveIntervalAnalysis.cpp?rev=49002&r1=49001&r2=49002&view=diff ============================================================================== --- llvm/trunk/lib/CodeGen/LiveIntervalAnalysis.cpp (original) +++ llvm/trunk/lib/CodeGen/LiveIntervalAnalysis.cpp Mon Mar 31 18:19:51 2008 @@ -757,8 +757,9 @@ if (FilterFoldedOps(MI, Ops, MRInfo, FoldOps)) return false; - // Can't fold a load from fixed stack slot into a two address instruction. - if (isSS && DefMI && (MRInfo & VirtRegMap::isMod)) + // The only time it's safe to fold into a two address instruction is when + // it's folding reload and spill from / into a spill stack slot. + if (DefMI && (MRInfo & VirtRegMap::isMod)) return false; MachineInstr *fmi = isSS ? tii_->foldMemoryOperand(*mf_, MI, FoldOps, Slot) Modified: llvm/trunk/lib/Target/X86/X86InstrInfo.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/X86/X86InstrInfo.cpp?rev=49002&r1=49001&r2=49002&view=diff ============================================================================== --- llvm/trunk/lib/Target/X86/X86InstrInfo.cpp (original) +++ llvm/trunk/lib/Target/X86/X86InstrInfo.cpp Mon Mar 31 18:19:51 2008 @@ -1825,7 +1825,15 @@ MI->getOperand(0).getReg() == MI->getOperand(1).getReg()) { OpcodeTablePtr = &RegOp2MemOpTable2Addr; isTwoAddrFold = true; + // Can't write back to CPI or a GV stub. + if (MOs[3].isCPI() || + (MOs[3].isGlobal() && isGVStub(MOs[3].getGlobal(), TM))) + return NULL; } else if (i == 0) { // If operand 0 + // Can't write back to CPI or a GV stub. + if (MOs[3].isCPI() || + (MOs[3].isGlobal() && isGVStub(MOs[3].getGlobal(), TM))) + return NULL; if (MI->getOpcode() == X86::MOV16r0) NewMI = MakeM0Inst(*this, X86::MOV16mi, MOs, MI); else if (MI->getOpcode() == X86::MOV32r0) Added: llvm/trunk/test/CodeGen/X86/2008-03-31-SpillerFoldingBug.ll URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/X86/2008-03-31-SpillerFoldingBug.ll?rev=49002&view=auto ============================================================================== --- llvm/trunk/test/CodeGen/X86/2008-03-31-SpillerFoldingBug.ll (added) +++ llvm/trunk/test/CodeGen/X86/2008-03-31-SpillerFoldingBug.ll Mon Mar 31 18:19:51 2008 @@ -0,0 +1,40 @@ +; RUN: llvm-as < %s | llc -mtriple=i386-apple-darwin -relocation-model=pic -disable-fp-elim | grep add | grep 12 | not grep non_lazy_ptr +; Don't fold re-materialized load into a two address instruction + + %"struct.Smarts::Runnable" = type { i32 (...)**, i32 } + %struct.__sbuf = type { i8*, i32 } + %"struct.std::ios_base" = type { i32 (...)**, i32, i32, i32, i32, i32, %"struct.std::ios_base::_Callback_list"*, %struct.__sbuf, [8 x %struct.__sbuf], i32, %struct.__sbuf*, %"struct.std::locale" } + %"struct.std::ios_base::_Callback_list" = type { %"struct.std::ios_base::_Callback_list"*, void (i32, %"struct.std::ios_base"*, i32)*, i32, i32 } + %"struct.std::locale" = type { %"struct.std::locale::_Impl"* } + %"struct.std::locale::_Impl" = type { i32, %"struct.Smarts::Runnable"**, i32, %"struct.Smarts::Runnable"**, i8** } + at _ZTVSt9basic_iosIcSt11char_traitsIcEE = external constant [4 x i32 (...)*] ; <[4 x i32 (...)*]*> [#uses=1] + at _ZTTSt19basic_ostringstreamIcSt11char_traitsIcESaIcEE = external constant [4 x i8*] ; <[4 x i8*]*> [#uses=1] + at _ZTVSt19basic_ostringstreamIcSt11char_traitsIcESaIcEE = external constant [10 x i32 (...)*] ; <[10 x i32 (...)*]*> [#uses=2] + at _ZTVSt15basic_streambufIcSt11char_traitsIcEE = external constant [16 x i32 (...)*] ; <[16 x i32 (...)*]*> [#uses=1] + at _ZTVSt15basic_stringbufIcSt11char_traitsIcESaIcEE = external constant [16 x i32 (...)*] ; <[16 x i32 (...)*]*> [#uses=1] + +define void @_GLOBAL__I__ZN5Pooma5pinfoE() nounwind { +entry: + store i32 (...)** getelementptr ([10 x i32 (...)*]* @_ZTVSt19basic_ostringstreamIcSt11char_traitsIcESaIcEE, i32 0, i32 8), i32 (...)*** null, align 4 + %tmp96.i.i142.i = call i8* @_Znwm( i32 180 ) nounwind ; [#uses=2] + call void @_ZNSt8ios_baseC2Ev( %"struct.std::ios_base"* null ) nounwind + store i32 (...)** getelementptr ([4 x i32 (...)*]* @_ZTVSt9basic_iosIcSt11char_traitsIcEE, i32 0, i32 2), i32 (...)*** null, align 4 + store i32 (...)** null, i32 (...)*** null, align 4 + %ctg2242.i.i163.i = getelementptr i8* %tmp96.i.i142.i, i32 0 ; [#uses=1] + %tmp150.i.i164.i = load i8** getelementptr ([4 x i8*]* @_ZTTSt19basic_ostringstreamIcSt11char_traitsIcESaIcEE, i32 0, i64 2), align 4 ; [#uses=1] + %tmp150151.i.i165.i = bitcast i8* %tmp150.i.i164.i to i32 (...)** ; [#uses=1] + %tmp153.i.i166.i = bitcast i8* %ctg2242.i.i163.i to i32 (...)*** ; [#uses=1] + store i32 (...)** %tmp150151.i.i165.i, i32 (...)*** %tmp153.i.i166.i, align 4 + %tmp159.i.i167.i = bitcast i8* %tmp96.i.i142.i to i32 (...)*** ; [#uses=1] + store i32 (...)** getelementptr ([10 x i32 (...)*]* @_ZTVSt19basic_ostringstreamIcSt11char_traitsIcESaIcEE, i32 0, i32 3), i32 (...)*** %tmp159.i.i167.i, align 4 + store i32 (...)** getelementptr ([16 x i32 (...)*]* @_ZTVSt15basic_streambufIcSt11char_traitsIcEE, i32 0, i32 2), i32 (...)*** null, align 4 + call void @_ZNSt6localeC1Ev( %"struct.std::locale"* null ) nounwind + store i32 (...)** getelementptr ([16 x i32 (...)*]* @_ZTVSt15basic_stringbufIcSt11char_traitsIcESaIcEE, i32 0, i32 2), i32 (...)*** null, align 4 + unreachable +} + +declare i8* @_Znwm(i32) + +declare void @_ZNSt8ios_baseC2Ev(%"struct.std::ios_base"*) + +declare void @_ZNSt6localeC1Ev(%"struct.std::locale"*) nounwind From gohman at apple.com Mon Mar 31 18:19:49 2008 From: gohman at apple.com (Dan Gohman) Date: Mon, 31 Mar 2008 16:19:49 -0700 Subject: [llvm-commits] Speeding up instruction selection In-Reply-To: References: <06B92AA2-1D4F-4D70-AF1B-337C7C8EBEC4@apple.com> <97188DDC-093E-4733-B8A2-7B30B6684DE1@apple.com> <00FB5805-1FA5-4534-BBD0-E6E34EC17BF1@apple.com> Message-ID: <84648A85-6EB1-4FE5-96B4-749BD5A8D938@apple.com> On Mar 26, 2008, at 12:19 PM, Roman Levenstein wrote: > > Evan played with it, but there was a problem with 176.gcc (which is > probably unrelated) and somehow the review is stuck at the moment. Hi Roman, I believe we've finally resolved the 176.gcc problem! One of Evan's coalescer fixes, 48752, allows 176.gcc to pass, even with your queue ordering patch applied. Thanks for your patience while we investigated this. Dan From dalej at apple.com Mon Mar 31 18:20:10 2008 From: dalej at apple.com (Dale Johannesen) Date: Mon, 31 Mar 2008 23:20:10 -0000 Subject: [llvm-commits] [llvm] r49003 - in /llvm/trunk/test/CodeGen: PowerPC/fold-li.ll PowerPC/reg-coalesce-simple.ll PowerPC/rotl-2.ll X86/2006-03-02-InstrSchedBug.ll X86/2006-05-02-InstrSched1.ll X86/2006-05-02-InstrSched2.ll X86/2006-05-11-InstrSched.ll X86/constant-pool-remat-0.ll X86/iabs.ll X86/or-branch.ll X86/select.ll X86/setuge.ll X86/x86-64-mem.ll X86/zero-remat.ll Message-ID: <200803312320.m2VNKAdJ004885@zion.cs.uiuc.edu> Author: johannes Date: Mon Mar 31 18:20:09 2008 New Revision: 49003 URL: http://llvm.org/viewvc/llvm-project?rev=49003&view=rev Log: Mark functions in some tests as 'nounwind'. Generating EH info for these functions causes the tests to fail for random reasons (e.g. looking for 'or' or counting lines with asm-printer; labels count as lines.) Modified: llvm/trunk/test/CodeGen/PowerPC/fold-li.ll llvm/trunk/test/CodeGen/PowerPC/reg-coalesce-simple.ll llvm/trunk/test/CodeGen/PowerPC/rotl-2.ll llvm/trunk/test/CodeGen/X86/2006-03-02-InstrSchedBug.ll llvm/trunk/test/CodeGen/X86/2006-05-02-InstrSched1.ll llvm/trunk/test/CodeGen/X86/2006-05-02-InstrSched2.ll llvm/trunk/test/CodeGen/X86/2006-05-11-InstrSched.ll llvm/trunk/test/CodeGen/X86/constant-pool-remat-0.ll llvm/trunk/test/CodeGen/X86/iabs.ll llvm/trunk/test/CodeGen/X86/or-branch.ll llvm/trunk/test/CodeGen/X86/select.ll llvm/trunk/test/CodeGen/X86/setuge.ll llvm/trunk/test/CodeGen/X86/x86-64-mem.ll llvm/trunk/test/CodeGen/X86/zero-remat.ll Modified: llvm/trunk/test/CodeGen/PowerPC/fold-li.ll URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/PowerPC/fold-li.ll?rev=49003&r1=49002&r2=49003&view=diff ============================================================================== --- llvm/trunk/test/CodeGen/PowerPC/fold-li.ll (original) +++ llvm/trunk/test/CodeGen/PowerPC/fold-li.ll Mon Mar 31 18:20:09 2008 @@ -3,12 +3,12 @@ ;; Test that immediates are folded into these instructions correctly. -define i32 @ADD(i32 %X) { +define i32 @ADD(i32 %X) nounwind { %Y = add i32 %X, 65537 ; [#uses=1] ret i32 %Y } -define i32 @SUB(i32 %X) { +define i32 @SUB(i32 %X) nounwind { %Y = sub i32 %X, 65537 ; [#uses=1] ret i32 %Y } Modified: llvm/trunk/test/CodeGen/PowerPC/reg-coalesce-simple.ll URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/PowerPC/reg-coalesce-simple.ll?rev=49003&r1=49002&r2=49003&view=diff ============================================================================== --- llvm/trunk/test/CodeGen/PowerPC/reg-coalesce-simple.ll (original) +++ llvm/trunk/test/CodeGen/PowerPC/reg-coalesce-simple.ll Mon Mar 31 18:20:09 2008 @@ -2,7 +2,7 @@ %struct.foo = type { i32, i32, [0 x i8] } -define i32 @test(%struct.foo* %X) { +define i32 @test(%struct.foo* %X) nounwind { %tmp1 = getelementptr %struct.foo* %X, i32 0, i32 2, i32 100 ; [#uses=1] %tmp = load i8* %tmp1 ; [#uses=1] %tmp2 = zext i8 %tmp to i32 ; [#uses=1] Modified: llvm/trunk/test/CodeGen/PowerPC/rotl-2.ll URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/PowerPC/rotl-2.ll?rev=49003&r1=49002&r2=49003&view=diff ============================================================================== --- llvm/trunk/test/CodeGen/PowerPC/rotl-2.ll (original) +++ llvm/trunk/test/CodeGen/PowerPC/rotl-2.ll Mon Mar 31 18:20:09 2008 @@ -2,7 +2,7 @@ ; RUN: llvm-as < %s | llc -march=ppc32 | grep rlwnm | count 2 ; RUN: llvm-as < %s | llc -march=ppc32 | not grep or -define i32 @rotl32(i32 %A, i8 %Amt) { +define i32 @rotl32(i32 %A, i8 %Amt) nounwind { %shift.upgrd.1 = zext i8 %Amt to i32 ; [#uses=1] %B = shl i32 %A, %shift.upgrd.1 ; [#uses=1] %Amt2 = sub i8 32, %Amt ; [#uses=1] @@ -12,7 +12,7 @@ ret i32 %D } -define i32 @rotr32(i32 %A, i8 %Amt) { +define i32 @rotr32(i32 %A, i8 %Amt) nounwind { %shift.upgrd.3 = zext i8 %Amt to i32 ; [#uses=1] %B = lshr i32 %A, %shift.upgrd.3 ; [#uses=1] %Amt2 = sub i8 32, %Amt ; [#uses=1] @@ -22,14 +22,14 @@ ret i32 %D } -define i32 @rotli32(i32 %A) { +define i32 @rotli32(i32 %A) nounwind { %B = shl i32 %A, 5 ; [#uses=1] %C = lshr i32 %A, 27 ; [#uses=1] %D = or i32 %B, %C ; [#uses=1] ret i32 %D } -define i32 @rotri32(i32 %A) { +define i32 @rotri32(i32 %A) nounwind { %B = lshr i32 %A, 5 ; [#uses=1] %C = shl i32 %A, 27 ; [#uses=1] %D = or i32 %B, %C ; [#uses=1] Modified: llvm/trunk/test/CodeGen/X86/2006-03-02-InstrSchedBug.ll URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/X86/2006-03-02-InstrSchedBug.ll?rev=49003&r1=49002&r2=49003&view=diff ============================================================================== --- llvm/trunk/test/CodeGen/X86/2006-03-02-InstrSchedBug.ll (original) +++ llvm/trunk/test/CodeGen/X86/2006-03-02-InstrSchedBug.ll Mon Mar 31 18:20:09 2008 @@ -1,7 +1,7 @@ ; RUN: llvm-as < %s | llc -march=x86 -stats |& \ ; RUN: grep asm-printer | grep 7 -define i32 @g(i32 %a, i32 %b) { +define i32 @g(i32 %a, i32 %b) nounwind { %tmp.1 = shl i32 %b, 1 ; [#uses=1] %tmp.3 = add i32 %tmp.1, %a ; [#uses=1] %tmp.5 = mul i32 %tmp.3, %a ; [#uses=1] Modified: llvm/trunk/test/CodeGen/X86/2006-05-02-InstrSched1.ll URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/X86/2006-05-02-InstrSched1.ll?rev=49003&r1=49002&r2=49003&view=diff ============================================================================== --- llvm/trunk/test/CodeGen/X86/2006-05-02-InstrSched1.ll (original) +++ llvm/trunk/test/CodeGen/X86/2006-05-02-InstrSched1.ll Mon Mar 31 18:20:09 2008 @@ -5,7 +5,7 @@ @size20 = external global i32 ; [#uses=1] @in5 = external global i8* ; [#uses=1] -define i32 @compare(i8* %a, i8* %b) { +define i32 @compare(i8* %a, i8* %b) nounwind { %tmp = bitcast i8* %a to i32* ; [#uses=1] %tmp1 = bitcast i8* %b to i32* ; [#uses=1] %tmp.upgrd.1 = load i32* @size20 ; [#uses=1] Modified: llvm/trunk/test/CodeGen/X86/2006-05-02-InstrSched2.ll URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/X86/2006-05-02-InstrSched2.ll?rev=49003&r1=49002&r2=49003&view=diff ============================================================================== --- llvm/trunk/test/CodeGen/X86/2006-05-02-InstrSched2.ll (original) +++ llvm/trunk/test/CodeGen/X86/2006-05-02-InstrSched2.ll Mon Mar 31 18:20:09 2008 @@ -1,7 +1,7 @@ ; RUN: llvm-as < %s | llc -march=x86 -stats |& \ ; RUN: grep asm-printer | grep 13 -define void @_ZN9__gnu_cxx9hashtableISt4pairIKPKciES3_NS_4hashIS3_EESt10_Select1stIS5_E5eqstrSaIiEE14find_or_insertERKS5__cond_true456.i(i8* %tmp435.i, i32* %tmp449.i.out) { +define void @_ZN9__gnu_cxx9hashtableISt4pairIKPKciES3_NS_4hashIS3_EESt10_Select1stIS5_E5eqstrSaIiEE14find_or_insertERKS5__cond_true456.i(i8* %tmp435.i, i32* %tmp449.i.out) nounwind { newFuncRoot: br label %cond_true456.i bb459.i.exitStub: ; preds = %cond_true456.i Modified: llvm/trunk/test/CodeGen/X86/2006-05-11-InstrSched.ll URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/X86/2006-05-11-InstrSched.ll?rev=49003&r1=49002&r2=49003&view=diff ============================================================================== --- llvm/trunk/test/CodeGen/X86/2006-05-11-InstrSched.ll (original) +++ llvm/trunk/test/CodeGen/X86/2006-05-11-InstrSched.ll Mon Mar 31 18:20:09 2008 @@ -2,7 +2,7 @@ ; RUN: grep {asm-printer} | grep 32 target datalayout = "e-p:32:32" -define void @foo(i32* %mc, i32* %bp, i32* %ms, i32* %xmb, i32* %mpp, i32* %tpmm, i32* %ip, i32* %tpim, i32* %dpp, i32* %tpdm, i32* %bpi, i32 %M) { +define void @foo(i32* %mc, i32* %bp, i32* %ms, i32* %xmb, i32* %mpp, i32* %tpmm, i32* %ip, i32* %tpim, i32* %dpp, i32* %tpdm, i32* %bpi, i32 %M) nounwind { entry: %tmp9 = icmp slt i32 %M, 5 ; [#uses=1] br i1 %tmp9, label %return, label %cond_true Modified: llvm/trunk/test/CodeGen/X86/constant-pool-remat-0.ll URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/X86/constant-pool-remat-0.ll?rev=49003&r1=49002&r2=49003&view=diff ============================================================================== --- llvm/trunk/test/CodeGen/X86/constant-pool-remat-0.ll (original) +++ llvm/trunk/test/CodeGen/X86/constant-pool-remat-0.ll Mon Mar 31 18:20:09 2008 @@ -5,7 +5,7 @@ declare fastcc float @qux(float %y) -define fastcc float @array(float %a) { +define fastcc float @array(float %a) nounwind { %n = mul float %a, 9.0 %m = call fastcc float @qux(float %n) %o = mul float %m, 9.0 Modified: llvm/trunk/test/CodeGen/X86/iabs.ll URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/X86/iabs.ll?rev=49003&r1=49002&r2=49003&view=diff ============================================================================== --- llvm/trunk/test/CodeGen/X86/iabs.ll (original) +++ llvm/trunk/test/CodeGen/X86/iabs.ll Mon Mar 31 18:20:09 2008 @@ -8,7 +8,7 @@ ;; xorl %eax, %edi ;; movl %edi, %eax ;; ret -define i32 @test(i32 %a) { +define i32 @test(i32 %a) nounwind { %tmp1neg = sub i32 0, %a %b = icmp sgt i32 %a, -1 %abs = select i1 %b, i32 %a, i32 %tmp1neg Modified: llvm/trunk/test/CodeGen/X86/or-branch.ll URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/X86/or-branch.ll?rev=49003&r1=49002&r2=49003&view=diff ============================================================================== --- llvm/trunk/test/CodeGen/X86/or-branch.ll (original) +++ llvm/trunk/test/CodeGen/X86/or-branch.ll Mon Mar 31 18:20:09 2008 @@ -1,6 +1,6 @@ ; RUN: llvm-as < %s | llc -march=x86 | not grep set -define void @foo(i32 %X, i32 %Y, i32 %Z) { +define void @foo(i32 %X, i32 %Y, i32 %Z) nounwind { entry: %tmp = tail call i32 (...)* @bar( ) ; [#uses=0] %tmp.upgrd.1 = icmp eq i32 %X, 0 ; [#uses=1] Modified: llvm/trunk/test/CodeGen/X86/select.ll URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/X86/select.ll?rev=49003&r1=49002&r2=49003&view=diff ============================================================================== --- llvm/trunk/test/CodeGen/X86/select.ll (original) +++ llvm/trunk/test/CodeGen/X86/select.ll Mon Mar 31 18:20:09 2008 @@ -2,61 +2,61 @@ ; RUN: llvm-as < %s | llc -march=x86 -mcpu=yonah ; RUN: llvm-as < %s | llc -march=x86 -mcpu=yonah | not grep set -define i1 @boolSel(i1 %A, i1 %B, i1 %C) { +define i1 @boolSel(i1 %A, i1 %B, i1 %C) nounwind { %X = select i1 %A, i1 %B, i1 %C ; [#uses=1] ret i1 %X } -define i8 @byteSel(i1 %A, i8 %B, i8 %C) { +define i8 @byteSel(i1 %A, i8 %B, i8 %C) nounwind { %X = select i1 %A, i8 %B, i8 %C ; [#uses=1] ret i8 %X } -define i16 @shortSel(i1 %A, i16 %B, i16 %C) { +define i16 @shortSel(i1 %A, i16 %B, i16 %C) nounwind { %X = select i1 %A, i16 %B, i16 %C ; [#uses=1] ret i16 %X } -define i32 @intSel(i1 %A, i32 %B, i32 %C) { +define i32 @intSel(i1 %A, i32 %B, i32 %C) nounwind { %X = select i1 %A, i32 %B, i32 %C ; [#uses=1] ret i32 %X } -define i64 @longSel(i1 %A, i64 %B, i64 %C) { +define i64 @longSel(i1 %A, i64 %B, i64 %C) nounwind { %X = select i1 %A, i64 %B, i64 %C ; [#uses=1] ret i64 %X } -define double @doubleSel(i1 %A, double %B, double %C) { +define double @doubleSel(i1 %A, double %B, double %C) nounwind { %X = select i1 %A, double %B, double %C ; [#uses=1] ret double %X } -define i8 @foldSel(i1 %A, i8 %B, i8 %C) { +define i8 @foldSel(i1 %A, i8 %B, i8 %C) nounwind { %Cond = icmp slt i8 %B, %C ; [#uses=1] %X = select i1 %Cond, i8 %B, i8 %C ; [#uses=1] ret i8 %X } -define i32 @foldSel2(i1 %A, i32 %B, i32 %C) { +define i32 @foldSel2(i1 %A, i32 %B, i32 %C) nounwind { %Cond = icmp eq i32 %B, %C ; [#uses=1] %X = select i1 %Cond, i32 %B, i32 %C ; [#uses=1] ret i32 %X } -define i32 @foldSel2a(i1 %A, i32 %B, i32 %C, double %X, double %Y) { +define i32 @foldSel2a(i1 %A, i32 %B, i32 %C, double %X, double %Y) nounwind { %Cond = fcmp olt double %X, %Y ; [#uses=1] %X.upgrd.1 = select i1 %Cond, i32 %B, i32 %C ; [#uses=1] ret i32 %X.upgrd.1 } -define float @foldSel3(i1 %A, float %B, float %C, i32 %X, i32 %Y) { +define float @foldSel3(i1 %A, float %B, float %C, i32 %X, i32 %Y) nounwind { %Cond = icmp ult i32 %X, %Y ; [#uses=1] %X.upgrd.2 = select i1 %Cond, float %B, float %C ; [#uses=1] ret float %X.upgrd.2 } -define float @nofoldSel4(i1 %A, float %B, float %C, i32 %X, i32 %Y) { +define float @nofoldSel4(i1 %A, float %B, float %C, i32 %X, i32 %Y) nounwind { %Cond = icmp slt i32 %X, %Y ; [#uses=1] %X.upgrd.3 = select i1 %Cond, float %B, float %C ; [#uses=1] ret float %X.upgrd.3 Modified: llvm/trunk/test/CodeGen/X86/setuge.ll URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/X86/setuge.ll?rev=49003&r1=49002&r2=49003&view=diff ============================================================================== --- llvm/trunk/test/CodeGen/X86/setuge.ll (original) +++ llvm/trunk/test/CodeGen/X86/setuge.ll Mon Mar 31 18:20:09 2008 @@ -2,7 +2,7 @@ declare i1 @llvm.isunordered.f32(float, float) -define float @cmp(float %A, float %B, float %C, float %D) { +define float @cmp(float %A, float %B, float %C, float %D) nounwind { entry: %tmp.1 = fcmp uno float %A, %B ; [#uses=1] %tmp.2 = fcmp oge float %A, %B ; [#uses=1] Modified: llvm/trunk/test/CodeGen/X86/x86-64-mem.ll URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/X86/x86-64-mem.ll?rev=49003&r1=49002&r2=49003&view=diff ============================================================================== --- llvm/trunk/test/CodeGen/X86/x86-64-mem.ll (original) +++ llvm/trunk/test/CodeGen/X86/x86-64-mem.ll Mon Mar 31 18:20:09 2008 @@ -17,18 +17,18 @@ @bsrc = internal global [500000 x i32] zeroinitializer, align 32 ; <[500000 x i32]*> [#uses=0] @bdst = internal global [500000 x i32] zeroinitializer, align 32 ; <[500000 x i32]*> [#uses=0] -define void @test1() { +define void @test1() nounwind { %tmp = load i32* getelementptr ([0 x i32]* @src, i32 0, i32 0) ; [#uses=1] store i32 %tmp, i32* getelementptr ([0 x i32]* @dst, i32 0, i32 0) ret void } -define void @test2() { +define void @test2() nounwind { store i32* getelementptr ([0 x i32]* @dst, i32 0, i32 0), i32** @ptr ret void } -define void @test3() { +define void @test3() nounwind { store i32* getelementptr ([500 x i32]* @ldst, i32 0, i32 0), i32** @lptr br label %return Modified: llvm/trunk/test/CodeGen/X86/zero-remat.ll URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/X86/zero-remat.ll?rev=49003&r1=49002&r2=49003&view=diff ============================================================================== --- llvm/trunk/test/CodeGen/X86/zero-remat.ll (original) +++ llvm/trunk/test/CodeGen/X86/zero-remat.ll Mon Mar 31 18:20:09 2008 @@ -6,11 +6,11 @@ declare void @bar(double %x) declare void @barf(float %x) -define double @foo() { +define double @foo() nounwind { call void @bar(double 0.0) ret double 0.0 } -define float @foof() { +define float @foof() nounwind { call void @barf(float 0.0) ret float 0.0 } From edwintorok at gmail.com Mon Mar 31 12:51:37 2008 From: edwintorok at gmail.com (=?ISO-8859-1?Q?T=F6r=F6k_Edwin?=) Date: Mon, 31 Mar 2008 20:51:37 +0300 Subject: [llvm-commits] [PATCH] add GraphTraits for class User Message-ID: <47F124A9.40508@gmail.com> Hi, This patch adds GraphTraits for class User, allowing to use a depth-first iterator to find out all values that depend on (use) a certain Value. This can currently be done only by coding a recursive function. I tried to use forward declaration of GraphTraits/Inverse to avoid including the header for it, but that doesn't work, because of Inverse. Is it ok to include those headers in User.h? If not, where should I move this GraphTraits code? Please review this patch, and let me know if I am allowed to commit it. Thanks, --Edwin -------------- next part -------------- A non-text attachment was scrubbed... Name: user_graphtraits.patch Type: text/x-diff Size: 1514 bytes Desc: not available Url : http://lists.cs.uiuc.edu/pipermail/llvm-commits/attachments/20080331/c8acaa71/attachment.bin From dalej at apple.com Mon Mar 31 18:40:24 2008 From: dalej at apple.com (Dale Johannesen) Date: Mon, 31 Mar 2008 23:40:24 -0000 Subject: [llvm-commits] [llvm] r49006 - in /llvm/trunk/lib: CodeGen/DwarfWriter.cpp CodeGen/LLVMTargetMachine.cpp CodeGen/SelectionDAG/SelectionDAGISel.cpp Target/PowerPC/PPCAsmPrinter.cpp Target/PowerPC/PPCRegisterInfo.cpp Target/X86/X86AsmPrinter.cpp Target/X86/X86RegisterInfo.cpp Transforms/Utils/LowerInvoke.cpp Message-ID: <200803312340.m2VNeOu9005523@zion.cs.uiuc.edu> Author: johannes Date: Mon Mar 31 18:40:23 2008 New Revision: 49006 URL: http://llvm.org/viewvc/llvm-project?rev=49006&view=rev Log: Emit exception handling info for functions which are not marked nounwind, or for all functions when -enable-eh is set, provided the target supports Dwarf EH. llvm-gcc generates nounwind in the right places; other FEs will need to do so also. Given such a FE, -enable-eh should no longer be needed. Modified: llvm/trunk/lib/CodeGen/DwarfWriter.cpp llvm/trunk/lib/CodeGen/LLVMTargetMachine.cpp llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp llvm/trunk/lib/Target/PowerPC/PPCAsmPrinter.cpp llvm/trunk/lib/Target/PowerPC/PPCRegisterInfo.cpp llvm/trunk/lib/Target/X86/X86AsmPrinter.cpp llvm/trunk/lib/Target/X86/X86RegisterInfo.cpp llvm/trunk/lib/Transforms/Utils/LowerInvoke.cpp Modified: llvm/trunk/lib/CodeGen/DwarfWriter.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/DwarfWriter.cpp?rev=49006&r1=49005&r2=49006&view=diff ============================================================================== --- llvm/trunk/lib/CodeGen/DwarfWriter.cpp (original) +++ llvm/trunk/lib/CodeGen/DwarfWriter.cpp Mon Mar 31 18:40:23 2008 @@ -2778,9 +2778,13 @@ std::vector EHFrames; - /// shouldEmit - Flag to indicate if debug information should be emitted. - /// + /// shouldEmit - Per-function flag to indicate if EH information should + /// be emitted. bool shouldEmit; + + /// shouldEmitModule - Per-module flag to indicate if EH information should + /// be emitted. + bool shouldEmitModule; /// EmitCommonEHFrame - Emit the common eh unwind frame. /// @@ -3368,6 +3372,7 @@ DwarfException(std::ostream &OS, AsmPrinter *A, const TargetAsmInfo *T) : Dwarf(OS, A, T, "eh") , shouldEmit(false) + , shouldEmitModule(false) {} virtual ~DwarfException() {} @@ -3387,7 +3392,7 @@ /// EndModule - Emit all exception information that should come after the /// content. void EndModule() { - if (!shouldEmit) return; + if (!shouldEmitModule) return; const std::vector Personalities = MMI->getPersonalities(); for (unsigned i =0; i < Personalities.size(); ++i) @@ -3403,13 +3408,14 @@ void BeginFunction(MachineFunction *MF) { this->MF = MF; - if (MMI && - ExceptionHandling && + shouldEmit = false; + if ((ExceptionHandling || !MF->getFunction()->doesNotThrow()) && TAI->doesSupportExceptionHandling()) { shouldEmit = true; // Assumes in correct section after the entry point. EmitLabel("eh_func_begin", ++SubprogramCount); } + shouldEmitModule |= shouldEmit; } /// EndFunction - Gather and emit post-function exception information. Modified: llvm/trunk/lib/CodeGen/LLVMTargetMachine.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/LLVMTargetMachine.cpp?rev=49006&r1=49005&r2=49006&view=diff ============================================================================== --- llvm/trunk/lib/CodeGen/LLVMTargetMachine.cpp (original) +++ llvm/trunk/lib/CodeGen/LLVMTargetMachine.cpp Mon Mar 31 18:40:23 2008 @@ -66,8 +66,7 @@ PM.add(createGCLoweringPass()); - if (!ExceptionHandling) - PM.add(createLowerInvokePass(getTargetLowering())); + PM.add(createLowerInvokePass(getTargetLowering())); // Make sure that no unreachable blocks are instruction selected. PM.add(createUnreachableBlockEliminationPass()); @@ -192,8 +191,7 @@ PM.add(createGCLoweringPass()); - if (!ExceptionHandling) - PM.add(createLowerInvokePass(getTargetLowering())); + PM.add(createLowerInvokePass(getTargetLowering())); // Make sure that no unreachable blocks are instruction selected. PM.add(createUnreachableBlockEliminationPass()); Modified: llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp?rev=49006&r1=49005&r2=49006&view=diff ============================================================================== --- llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp (original) +++ llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp Mon Mar 31 18:40:23 2008 @@ -169,6 +169,7 @@ Function &Fn; MachineFunction &MF; MachineRegisterInfo &RegInfo; + bool needsExceptionHandling; FunctionLoweringInfo(TargetLowering &TLI, Function &Fn,MachineFunction &MF); @@ -304,6 +305,10 @@ BuildMI(MBB, TII->get(TargetInstrInfo::PHI), PHIReg+i); } } + + // Figure out whether we need to generate EH info. Currently we do this for + // all functions not marked no-unwind, or if requested via -enable-eh. + needsExceptionHandling = ExceptionHandling || !Fn.doesNotThrow(); } /// CreateRegForValue - Allocate the appropriate number of virtual registers of @@ -2827,7 +2832,7 @@ } case Intrinsic::eh_exception: { - if (ExceptionHandling) { + if (FuncInfo.needsExceptionHandling) { if (!CurMBB->isLandingPad()) { // FIXME: Mark exception register as live in. Hack for PR1508. unsigned Reg = TLI.getExceptionAddressRegister(); @@ -2852,7 +2857,7 @@ MVT::ValueType VT = (Intrinsic == Intrinsic::eh_selector_i32 ? MVT::i32 : MVT::i64); - if (ExceptionHandling && MMI) { + if (FuncInfo.needsExceptionHandling && MMI) { if (CurMBB->isLandingPad()) addCatchInfo(I, MMI, CurMBB); else { @@ -2902,7 +2907,7 @@ case Intrinsic::eh_return: { MachineModuleInfo *MMI = DAG.getMachineModuleInfo(); - if (MMI && ExceptionHandling) { + if (MMI && FuncInfo.needsExceptionHandling) { MMI->setCallsEHReturn(true); DAG.setRoot(DAG.getNode(ISD::EH_RETURN, MVT::Other, @@ -2925,7 +2930,7 @@ } case Intrinsic::eh_dwarf_cfa: { - if (ExceptionHandling) { + if (FuncInfo.needsExceptionHandling) { MVT::ValueType VT = getValue(I.getOperand(1)).getValueType(); SDOperand CfaArg; if (MVT::getSizeInBits(VT) > MVT::getSizeInBits(TLI.getPointerTy())) @@ -3176,7 +3181,7 @@ Args.push_back(Entry); } - if (LandingPad && ExceptionHandling && MMI) { + if (LandingPad && FuncInfo.needsExceptionHandling && MMI) { // Insert a label before the invoke call to mark the try range. This can be // used to detect deletion of the invoke via the MachineModuleInfo. BeginLabel = MMI->NextLabelID(); @@ -3195,7 +3200,7 @@ setValue(CS.getInstruction(), Result.first); DAG.setRoot(Result.second); - if (LandingPad && ExceptionHandling && MMI) { + if (LandingPad && FuncInfo.needsExceptionHandling && MMI) { // Insert a label at the end of the invoke call to mark the try range. This // can be used to detect deletion of the invoke via the MachineModuleInfo. EndLabel = MMI->NextLabelID(); @@ -4614,7 +4619,7 @@ FunctionLoweringInfo FuncInfo(TLI, Fn, MF); - if (ExceptionHandling) + if (FuncInfo.needsExceptionHandling) for (Function::iterator I = Fn.begin(), E = Fn.end(); I != E; ++I) if (InvokeInst *Invoke = dyn_cast(I->getTerminator())) // Mark landing pad. @@ -4757,7 +4762,7 @@ MachineModuleInfo *MMI = DAG.getMachineModuleInfo(); - if (ExceptionHandling && MMI && BB->isLandingPad()) { + if (FuncInfo.needsExceptionHandling && MMI && BB->isLandingPad()) { // Add a label to mark the beginning of the landing pad. Deletion of the // landing pad can thus be detected via the MachineModuleInfo. unsigned LabelID = MMI->addLandingPad(BB); Modified: llvm/trunk/lib/Target/PowerPC/PPCAsmPrinter.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/PowerPC/PPCAsmPrinter.cpp?rev=49006&r1=49005&r2=49006&view=diff ============================================================================== --- llvm/trunk/lib/Target/PowerPC/PPCAsmPrinter.cpp (original) +++ llvm/trunk/lib/Target/PowerPC/PPCAsmPrinter.cpp Mon Mar 31 18:40:23 2008 @@ -1086,8 +1086,9 @@ O << "\n"; - if (ExceptionHandling && TAI->doesSupportExceptionHandling() && MMI) { + if (TAI->doesSupportExceptionHandling() && MMI) { // Add the (possibly multiple) personalities to the set of global values. + // Only referenced functions get into the Personalities list. const std::vector& Personalities = MMI->getPersonalities(); for (std::vector::const_iterator I = Personalities.begin(), Modified: llvm/trunk/lib/Target/PowerPC/PPCRegisterInfo.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/PowerPC/PPCRegisterInfo.cpp?rev=49006&r1=49005&r2=49006&view=diff ============================================================================== --- llvm/trunk/lib/Target/PowerPC/PPCRegisterInfo.cpp (original) +++ llvm/trunk/lib/Target/PowerPC/PPCRegisterInfo.cpp Mon Mar 31 18:40:23 2008 @@ -20,6 +20,7 @@ #include "PPCFrameInfo.h" #include "PPCSubtarget.h" #include "llvm/Constants.h" +#include "llvm/Function.h" #include "llvm/Type.h" #include "llvm/CodeGen/ValueTypes.h" #include "llvm/CodeGen/MachineInstrBuilder.h" @@ -946,6 +947,8 @@ MachineBasicBlock::iterator MBBI = MBB.begin(); MachineFrameInfo *MFI = MF.getFrameInfo(); MachineModuleInfo *MMI = MFI->getMachineModuleInfo(); + bool needsFrameInfo = (MMI && MMI->hasDebugInfo()) || + ExceptionHandling || !MF.getFunction()->doesNotThrow(); // Prepare for frame info. unsigned FrameLabelId = 0; @@ -1019,7 +1022,7 @@ unsigned TargetAlign = MF.getTarget().getFrameInfo()->getStackAlignment(); unsigned MaxAlign = MFI->getMaxAlignment(); - if (MMI && MMI->needsFrameInfo()) { + if (needsFrameInfo) { // Mark effective beginning of when frame pointer becomes valid. FrameLabelId = MMI->NextLabelID(); BuildMI(MBB, MBBI, TII.get(PPC::LABEL)).addImm(FrameLabelId).addImm(0); @@ -1095,7 +1098,7 @@ } } - if (MMI && MMI->needsFrameInfo()) { + if (needsFrameInfo) { std::vector &Moves = MMI->getFrameMoves(); if (NegFrameSize) { Modified: llvm/trunk/lib/Target/X86/X86AsmPrinter.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/X86/X86AsmPrinter.cpp?rev=49006&r1=49005&r2=49006&view=diff ============================================================================== --- llvm/trunk/lib/Target/X86/X86AsmPrinter.cpp (original) +++ llvm/trunk/lib/Target/X86/X86AsmPrinter.cpp Mon Mar 31 18:40:23 2008 @@ -381,9 +381,9 @@ O << "\n"; - if (ExceptionHandling && TAI->doesSupportExceptionHandling() && MMI && - !Subtarget->is64Bit()) { + if (TAI->doesSupportExceptionHandling() && MMI && !Subtarget->is64Bit()) { // Add the (possibly multiple) personalities to the set of global values. + // Only referenced functions get into the Personalities list. const std::vector& Personalities = MMI->getPersonalities(); for (std::vector::const_iterator I = Personalities.begin(), Modified: llvm/trunk/lib/Target/X86/X86RegisterInfo.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/X86/X86RegisterInfo.cpp?rev=49006&r1=49005&r2=49006&view=diff ============================================================================== --- llvm/trunk/lib/Target/X86/X86RegisterInfo.cpp (original) +++ llvm/trunk/lib/Target/X86/X86RegisterInfo.cpp Mon Mar 31 18:40:23 2008 @@ -504,6 +504,8 @@ MachineModuleInfo *MMI = MFI->getMachineModuleInfo(); X86MachineFunctionInfo *X86FI = MF.getInfo(); MachineBasicBlock::iterator MBBI = MBB.begin(); + bool needsFrameInfo = (MMI && MMI->hasDebugInfo()) || + ExceptionHandling || !Fn->doesNotThrow(); // Prepare for frame info. unsigned FrameLabelId = 0; @@ -536,7 +538,7 @@ .addReg(FramePtr); NumBytes -= SlotSize; - if (MMI && MMI->needsFrameInfo()) { + if (needsFrameInfo) { // Mark effective beginning of when frame pointer becomes valid. FrameLabelId = MMI->NextLabelID(); BuildMI(MBB, MBBI, TII.get(X86::LABEL)).addImm(FrameLabelId).addImm(0); @@ -548,7 +550,7 @@ } unsigned ReadyLabelId = 0; - if (MMI && MMI->needsFrameInfo()) { + if (needsFrameInfo) { // Mark effective beginning of when frame pointer is ready. ReadyLabelId = MMI->NextLabelID(); BuildMI(MBB, MBBI, TII.get(X86::LABEL)).addImm(ReadyLabelId).addImm(0); @@ -607,7 +609,7 @@ } } - if (MMI && MMI->needsFrameInfo()) { + if (needsFrameInfo) { std::vector &Moves = MMI->getFrameMoves(); const TargetData *TD = MF.getTarget().getTargetData(); Modified: llvm/trunk/lib/Transforms/Utils/LowerInvoke.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Utils/LowerInvoke.cpp?rev=49006&r1=49005&r2=49006&view=diff ============================================================================== --- llvm/trunk/lib/Transforms/Utils/LowerInvoke.cpp (original) +++ llvm/trunk/lib/Transforms/Utils/LowerInvoke.cpp Mon Mar 31 18:40:23 2008 @@ -47,6 +47,9 @@ #include "llvm/Support/CommandLine.h" #include "llvm/Support/Compiler.h" #include "llvm/Target/TargetLowering.h" +#include "llvm/Target/TargetOptions.h" +#include "llvm/Target/TargetMachine.h" +#include "llvm/Target/TargetAsmInfo.h" #include #include using namespace llvm; @@ -592,6 +595,12 @@ } bool LowerInvoke::runOnFunction(Function &F) { + // If we will be generating exception info, don't do anything here. + if ((ExceptionHandling || !F.doesNotThrow()) && + TLI && + TLI->getTargetMachine().getTargetAsmInfo()-> + doesSupportExceptionHandling()) + return false; if (ExpensiveEHSupport) return insertExpensiveEHSupport(F); else From dalej at apple.com Mon Mar 31 18:43:08 2008 From: dalej at apple.com (Dale Johannesen) Date: Mon, 31 Mar 2008 23:43:08 -0000 Subject: [llvm-commits] [test-suite] r49007 - /test-suite/trunk/Makefile.programs Message-ID: <200803312343.m2VNh9XS005622@zion.cs.uiuc.edu> Author: johannes Date: Mon Mar 31 18:43:08 2008 New Revision: 49007 URL: http://llvm.org/viewvc/llvm-project?rev=49007&view=rev Log: Remove -enable-eh; it is no longer required. Modified: test-suite/trunk/Makefile.programs Modified: test-suite/trunk/Makefile.programs URL: http://llvm.org/viewvc/llvm-project/test-suite/trunk/Makefile.programs?rev=49007&r1=49006&r2=49007&view=diff ============================================================================== --- test-suite/trunk/Makefile.programs (original) +++ test-suite/trunk/Makefile.programs Mon Mar 31 18:43:08 2008 @@ -321,11 +321,12 @@ # expensive) support for it. ifdef REQUIRES_EH_SUPPORT # PPC and X86 support DWARF exceptions, for everything else, default to SJLJ +# -enable-eh is no longer required to get DWARF exceptions. ifeq ($(ARCH),PowerPC) -LLCFLAGS += -enable-eh +#LLCFLAGS += -enable-eh else ifeq ($(ARCH),x86) -LLCFLAGS += -enable-eh +#LLCFLAGS += -enable-eh else LLCFLAGS += -enable-correct-eh-support LLVMLD_FLAGS += -disable-inlining From sabre at nondot.org Mon Mar 31 19:35:55 2008 From: sabre at nondot.org (Chris Lattner) Date: Tue, 01 Apr 2008 00:35:55 -0000 Subject: [llvm-commits] [llvm] r49008 - in /llvm/trunk: include/llvm/System/MappedFile.h lib/System/MappedFile.cpp Message-ID: <200804010035.m310ZtHC007922@zion.cs.uiuc.edu> Author: lattner Date: Mon Mar 31 19:35:55 2008 New Revision: 49008 URL: http://llvm.org/viewvc/llvm-project?rev=49008&view=rev Log: remove DEFINING_FILE_FOR for MappedFile.h Modified: llvm/trunk/include/llvm/System/MappedFile.h llvm/trunk/lib/System/MappedFile.cpp Modified: llvm/trunk/include/llvm/System/MappedFile.h URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/System/MappedFile.h?rev=49008&r1=49007&r2=49008&view=diff ============================================================================== --- llvm/trunk/include/llvm/System/MappedFile.h (original) +++ llvm/trunk/include/llvm/System/MappedFile.h Mon Mar 31 19:35:55 2008 @@ -15,7 +15,6 @@ #define LLVM_SYSTEM_MAPPEDFILE_H #include "llvm/System/Path.h" -#include "llvm/System/IncludeFile.h" namespace llvm { namespace sys { @@ -162,7 +161,7 @@ /// @{ private: ///< Disallow assignment - MappedFile& operator = ( const MappedFile & that ); + MappedFile& operator=(const MappedFile &that); ///< Disallow copying MappedFile(const MappedFile& that); /// @} @@ -170,6 +169,4 @@ } } -FORCE_DEFINING_FILE_TO_BE_LINKED(SystemMappedFile) - #endif Modified: llvm/trunk/lib/System/MappedFile.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/System/MappedFile.cpp?rev=49008&r1=49007&r2=49008&view=diff ============================================================================== --- llvm/trunk/lib/System/MappedFile.cpp (original) +++ llvm/trunk/lib/System/MappedFile.cpp Mon Mar 31 19:35:55 2008 @@ -32,4 +32,3 @@ #include "Win32/MappedFile.inc" #endif -DEFINING_FILE_FOR(SystemMappedFile) From sabre at nondot.org Mon Mar 31 19:53:25 2008 From: sabre at nondot.org (Chris Lattner) Date: Tue, 01 Apr 2008 00:53:25 -0000 Subject: [llvm-commits] [llvm] r49009 - in /llvm/trunk: include/llvm/System/MappedFile.h lib/System/Unix/MappedFile.inc lib/System/Win32/MappedFile.inc Message-ID: <200804010053.m310rPQ4008477@zion.cs.uiuc.edu> Author: lattner Date: Mon Mar 31 19:53:25 2008 New Revision: 49009 URL: http://llvm.org/viewvc/llvm-project?rev=49009&view=rev Log: cleanup the MappedFile API and comments. This removes and updates tons of out of date comments (really nothing throws here!) and fixes some other fairly glaring issues: "size" used to return the size of the file *and* change it, depending on how you called it. Modified: llvm/trunk/include/llvm/System/MappedFile.h llvm/trunk/lib/System/Unix/MappedFile.inc llvm/trunk/lib/System/Win32/MappedFile.inc Modified: llvm/trunk/include/llvm/System/MappedFile.h URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/System/MappedFile.h?rev=49009&r1=49008&r2=49009&view=diff ============================================================================== --- llvm/trunk/include/llvm/System/MappedFile.h (original) +++ llvm/trunk/include/llvm/System/MappedFile.h Mon Mar 31 19:53:25 2008 @@ -28,145 +28,90 @@ /// for mapping a file into memory for both read and write access. This class /// does not provide facilities for finding the file or operating on paths to /// files. The sys::Path class is used for that. - /// @since 1.4 - /// @brief An abstraction for memory mapped files. class MappedFile { - /// @name Types - /// @{ + sys::PathWithStatus Path; ///< Path to the file. + unsigned Options; ///< Options used to create the mapping + void *BasePtr; ///< Pointer to the base memory address + mutable MappedFileInfo *MapInfo; ///< Platform specific info for the mapping + + MappedFile& operator=(const MappedFile &that); // DO NOT IMPLEMENT + MappedFile(const MappedFile &that); // DO NOT IMPLEMENT public: enum MappingOptions { - READ_ACCESS = 0x0001, ///< Map the file for reading - WRITE_ACCESS = 0x0002, ///< Map the file for write access - EXEC_ACCESS = 0x0004, ///< Map the file for execution access + READ_ACCESS = 0x0001, ///< Map the file for reading + WRITE_ACCESS = 0x0002, ///< Map the file for write access + EXEC_ACCESS = 0x0004, ///< Map the file for execution access SHARED_MAPPING = 0x0008 ///< Map the file shared with other processes }; - /// @} - /// @name Constructors - /// @{ - public: - /// Construct a MappedFile to the \p path in the operating system's file - /// system with the mapping \p options provided. - /// @throws std::string if an error occurs - MappedFile() : path_(), options_(READ_ACCESS), base_(0), info_(0) {} + + MappedFile() : Options(READ_ACCESS), BasePtr(0), MapInfo(0) {} /// Destruct a MappedFile and release all memory associated with it. - /// @throws std::string if an error occurs - ~MappedFile() { if (info_) terminate(); } + ~MappedFile() { close(); } + + public: // Accessors - /// @} - /// @name Accessors - /// @{ - public: /// This function determines if the file is currently mapped or not. - /// @returns true iff the file is mapped into memory, false otherwise - /// @brief Determine if a MappedFile is currently mapped - /// @throws nothing - bool isMapped() const { return base_ != 0; } + bool isMapped() const { return BasePtr != 0; } /// This function returns a void* pointer to the base address of the file /// mapping. This is the memory address of the first byte in the file. /// Note that although a non-const pointer is returned, the memory might /// not actually be writable, depending on the MappingOptions used when /// the MappedFile was opened. - /// @returns The base pointer to the memory mapped file. - /// @brief Obtain the base pointer to the memory mapped file. - /// @throws nothing - void* base() const { return base_; } + void* base() const { return BasePtr; } /// This function returns a char* pointer to the base address of the file /// mapping. This is the memory address of the first byte in the file. /// Note that although a non-const pointer is returned, the memory might /// not actually be writable, depending on the MappingOptions used when /// the MappedFile was opened. - /// @returns The base pointer to the memory mapped file as a char pointer. - /// @brief Obtain the base pointer to the memory mapped file. - /// @throws nothing - char* charBase() const { return reinterpret_cast(base_); } + char* charBase() const { return reinterpret_cast(BasePtr); } /// This function returns a reference to the sys::Path object kept by the /// MappedFile object. This contains the path to the file that is or /// will be mapped. - /// @returns sys::Path containing the path name. - /// @brief Returns the mapped file's path as a sys::Path - /// @throws nothing - const sys::Path& path() const { return path_; } + const sys::Path& path() const { return Path; } /// This function returns the number of bytes in the file. - /// @throws std::string if an error occurs size_t size() const; - /// @} - /// @name Mutators - /// @{ - public: - /// Open a file to be mapped and get its size but don't map it yet. - /// @returns true if an error occurred - bool open( - const sys::Path& p, ///< Path to file to be mapped - int options = READ_ACCESS, ///< Access mode for the mapping - std::string* ErrMsg = 0 ///< Optional error string pointer - ) { - path_ = p; - options_ = options; + public: // Mutators + + /// Open a file to be mapped and get its size but don't map it yet. Return + /// true on error. + bool open(const sys::Path &P, int options = READ_ACCESS, + std::string *ErrMsg = 0) { + Path = P; + Options = options; return initialize(ErrMsg); } - /// The mapped file is removed from memory. If the file was mapped for + /// unmap - Remove the mapped file from memory. If the file was mapped for /// write access, the memory contents will be automatically synchronized /// with the file's disk contents. - /// @brief Remove the file mapping from memory. void unmap(); - /// The mapped file is put into memory. - /// @returns The base memory address of the mapped file or 0 if an error - /// occurred. - /// @brief Map the file into memory. - void* map( - std::string* ErrMsg = 0///< Optional error string pointer - ); + /// map - Reserve space for the file, map it into memory, and return a + /// pointer to it. This returns the base memory address of the mapped file + /// or 0 if an error occurred. + void *map(std::string* ErrMsg = 0); - /// This method causes the size of the file, and consequently the size - /// of the mapping to be set. This is logically the same as unmap(), + /// resize - This method causes the size of the file, and consequently the + /// size of the mapping to be set. This is logically the same as unmap(), /// adjust size of the file, map(). Consequently, when calling this /// function, the caller should not rely on previous results of the /// map(), base(), or baseChar() members as they may point to invalid /// areas of memory after this call. - /// @throws std::string if an error occurs - /// @brief Set the size of the file and memory mapping. - bool size(size_t new_size, std::string* ErrMsg = 0); - - void close() { if (info_) terminate(); } - - /// @} - /// @name Implementation - /// @{ - private: - /// @brief Initialize platform-specific portion - bool initialize(std::string* ErrMsg); + bool resize(size_t new_size, std::string *ErrMsg = 0); - /// @brief Terminate platform-specific portion - void terminate(); + void close() { if (MapInfo) terminate(); } - /// @} - /// @name Data - /// @{ - private: - sys::PathWithStatus path_; ///< Path to the file. - int options_; ///< Options used to create the mapping - void* base_; ///< Pointer to the base memory address - mutable MappedFileInfo* info_; ///< Platform specific info for the mapping - - /// @} - /// @name Disabled - /// @{ private: - ///< Disallow assignment - MappedFile& operator=(const MappedFile &that); - ///< Disallow copying - MappedFile(const MappedFile& that); - /// @} + bool initialize(std::string *ErrMsg); + void terminate(); }; -} -} +} // end namespace sys +} // end namespace llvm #endif Modified: llvm/trunk/lib/System/Unix/MappedFile.inc URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/System/Unix/MappedFile.inc?rev=49009&r1=49008&r2=49009&view=diff ============================================================================== --- llvm/trunk/lib/System/Unix/MappedFile.inc (original) +++ llvm/trunk/lib/System/Unix/MappedFile.inc Mon Mar 31 19:53:25 2008 @@ -31,105 +31,109 @@ #include #endif -namespace llvm { +using namespace llvm; using namespace sys; -struct sys::MappedFileInfo { - int FD; - off_t Size; -}; +namespace llvm { + namespace sys { + struct MappedFileInfo { + int FD; + off_t Size; + }; + } +} bool MappedFile::initialize(std::string* ErrMsg) { int mode = 0; - if (options_ & READ_ACCESS) - if (options_ & WRITE_ACCESS) + if (Options & READ_ACCESS) + if (Options & WRITE_ACCESS) mode = O_RDWR; else mode = O_RDONLY; - else if (options_ & WRITE_ACCESS) + else if (Options & WRITE_ACCESS) mode = O_WRONLY; - int FD = ::open(path_.c_str(), mode); + int FD = ::open(Path.c_str(), mode); if (FD < 0) { - MakeErrMsg(ErrMsg, "can't open file '" + path_.toString() + "'"); + MakeErrMsg(ErrMsg, "can't open file '" + Path.toString() + "'"); return true; } - const FileStatus *Status = path_.getFileStatus(false, ErrMsg); + const FileStatus *Status = Path.getFileStatus(false, ErrMsg); if (!Status) { ::close(FD); return true; } - info_ = new MappedFileInfo; - info_->FD = FD; - info_->Size = Status->getSize(); + MapInfo = new MappedFileInfo(); + MapInfo->FD = FD; + MapInfo->Size = Status->getSize(); return false; } void MappedFile::terminate() { - assert(info_ && "MappedFile not initialized"); - ::close(info_->FD); - delete info_; - info_ = 0; + assert(MapInfo && "MappedFile not initialized"); + ::close(MapInfo->FD); + delete MapInfo; + MapInfo = 0; } void MappedFile::unmap() { - assert(info_ && "MappedFile not initialized"); - if (isMapped()) { - if (options_ & WRITE_ACCESS) - ::msync(base_, info_->Size, MS_SYNC); - ::munmap(base_, info_->Size); - base_ = 0; // Mark this as non-mapped. - } + assert(MapInfo && "MappedFile not initialized"); + if (!isMapped()) return; + + if (Options & WRITE_ACCESS) + ::msync(BasePtr, MapInfo->Size, MS_SYNC); + ::munmap(BasePtr, MapInfo->Size); + BasePtr = 0; // Mark this as non-mapped. } void* MappedFile::map(std::string* ErrMsg) { - assert(info_ && "MappedFile not initialized"); - if (!isMapped()) { - int prot = PROT_NONE; - int flags = 0; + assert(MapInfo && "MappedFile not initialized"); + if (isMapped()) return BasePtr; + + int prot = PROT_NONE; + int flags = 0; #ifdef MAP_FILE - flags |= MAP_FILE; + flags |= MAP_FILE; #endif - if (options_ == 0) { - prot = PROT_READ; - flags = MAP_PRIVATE; - } else { - if (options_ & READ_ACCESS) - prot |= PROT_READ; - if (options_ & WRITE_ACCESS) - prot |= PROT_WRITE; - if (options_ & EXEC_ACCESS) - prot |= PROT_EXEC; - if (options_ & SHARED_MAPPING) - flags |= MAP_SHARED; - else - flags |= MAP_PRIVATE; - } - size_t map_size = ((info_->Size / Process::GetPageSize())+1) * - Process::GetPageSize(); - - base_ = ::mmap(0, map_size, prot, flags, info_->FD, 0); - if (base_ == MAP_FAILED) { - MakeErrMsg(ErrMsg, "Can't map file:" + path_.toString()); - return 0; - } + if (Options == 0) { + prot = PROT_READ; + flags = MAP_PRIVATE; + } else { + if (Options & READ_ACCESS) + prot |= PROT_READ; + if (Options & WRITE_ACCESS) + prot |= PROT_WRITE; + if (Options & EXEC_ACCESS) + prot |= PROT_EXEC; + if (Options & SHARED_MAPPING) + flags |= MAP_SHARED; + else + flags |= MAP_PRIVATE; } - return base_; + size_t map_size = ((MapInfo->Size / Process::GetPageSize())+1) * + Process::GetPageSize(); + + BasePtr = ::mmap(0, map_size, prot, flags, MapInfo->FD, 0); + if (BasePtr == MAP_FAILED) { + MakeErrMsg(ErrMsg, "Can't map file:" + Path.toString()); + return 0; + } + return BasePtr; } size_t MappedFile::size() const { - assert(info_ && "MappedFile not initialized"); - return info_->Size; + assert(MapInfo && "MappedFile not initialized"); + return MapInfo->Size; } -bool MappedFile::size(size_t new_size, std::string* ErrMsg) { - assert(info_ && "MappedFile not initialized"); +bool MappedFile::resize(size_t new_size, std::string* ErrMsg) { + assert(MapInfo && "MappedFile not initialized"); // Take the mapping out of memory - this->unmap(); + unmap(); // Adjust the current size to a page boundary - size_t cur_size = ((info_->Size / Process::GetPageSize())+1) * + size_t cur_size = ((MapInfo->Size / Process::GetPageSize())+1) * Process::GetPageSize(); // Adjust the new_size to a page boundary @@ -140,15 +144,12 @@ if (new_size > cur_size) { // Ensure we can allocate at least the idodes necessary to handle the // file size requested. - if ((off_t)-1 == ::lseek(info_->FD, new_size, SEEK_SET)) + if ((off_t)-1 == ::lseek(MapInfo->FD, new_size, SEEK_SET)) return MakeErrMsg(ErrMsg, "Can't lseek: "); - if (-1 == ::write(info_->FD, "\0", 1)) + if (-1 == ::write(MapInfo->FD, "\0", 1)) return MakeErrMsg(ErrMsg, "Can't write: "); } // Put the mapping back into memory. - return this->map(ErrMsg); + return map(ErrMsg); } - -} - Modified: llvm/trunk/lib/System/Win32/MappedFile.inc URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/System/Win32/MappedFile.inc?rev=49009&r1=49008&r2=49009&view=diff ============================================================================== --- llvm/trunk/lib/System/Win32/MappedFile.inc (original) +++ llvm/trunk/lib/System/Win32/MappedFile.inc Mon Mar 31 19:53:25 2008 @@ -28,32 +28,32 @@ }; bool MappedFile::initialize(std::string* ErrMsg) { - assert(!info_); - info_ = new MappedFileInfo; - info_->hFile = INVALID_HANDLE_VALUE; - info_->hMapping = NULL; - - DWORD mode = options_ & WRITE_ACCESS ? GENERIC_WRITE : GENERIC_READ; - DWORD disposition = options_ & WRITE_ACCESS ? OPEN_ALWAYS : OPEN_EXISTING; - DWORD share = options_ & WRITE_ACCESS ? FILE_SHARE_WRITE : FILE_SHARE_READ; - share = options_ & SHARED_MAPPING ? share : 0; - info_->hFile = CreateFile(path_.c_str(), mode, share, NULL, disposition, + assert(!MapInfo); + MapInfo = new MappedFileInfo; + MapInfo->hFile = INVALID_HANDLE_VALUE; + MapInfo->hMapping = NULL; + + DWORD mode = Options & WRITE_ACCESS ? GENERIC_WRITE : GENERIC_READ; + DWORD disposition = Options & WRITE_ACCESS ? OPEN_ALWAYS : OPEN_EXISTING; + DWORD share = Options & WRITE_ACCESS ? FILE_SHARE_WRITE : FILE_SHARE_READ; + share = Options & SHARED_MAPPING ? share : 0; + MapInfo->hFile = CreateFile(Path.c_str(), mode, share, NULL, disposition, FILE_ATTRIBUTE_NORMAL, NULL); - if (info_->hFile == INVALID_HANDLE_VALUE) { - delete info_; - info_ = NULL; + if (MapInfo->hFile == INVALID_HANDLE_VALUE) { + delete MapInfo; + MapInfo = NULL; return MakeErrMsg(ErrMsg, - std::string("Can't open file: ") + path_.toString()); + std::string("Can't open file: ") + Path.toString()); } LARGE_INTEGER size; - if (!GetFileSizeEx(info_->hFile, &size) || - (info_->size = size_t(size.QuadPart), info_->size != size.QuadPart)) { - CloseHandle(info_->hFile); - delete info_; - info_ = NULL; + if (!GetFileSizeEx(MapInfo->hFile, &size) || + (MapInfo->size = size_t(size.QuadPart), MapInfo->size != size.QuadPart)) { + CloseHandle(MapInfo->hFile); + delete MapInfo; + MapInfo = NULL; return MakeErrMsg(ErrMsg, - std::string("Can't get size of file: ") + path_.toString()); + std::string("Can't get size of file: ") + Path.toString()); } return false; @@ -61,56 +61,56 @@ void MappedFile::terminate() { unmap(); - if (info_->hFile != INVALID_HANDLE_VALUE) - CloseHandle(info_->hFile); - delete info_; - info_ = NULL; + if (MapInfo->hFile != INVALID_HANDLE_VALUE) + CloseHandle(MapInfo->hFile); + delete MapInfo; + MapInfo = NULL; } void MappedFile::unmap() { - assert(info_ && "MappedFile not initialized"); + assert(MapInfo && "MappedFile not initialized"); if (isMapped()) { - UnmapViewOfFile(base_); - base_ = NULL; + UnmapViewOfFile(BasePtr); + BasePtr = NULL; } - if (info_->hMapping != INVALID_HANDLE_VALUE) { - CloseHandle(info_->hMapping); - info_->hMapping = NULL; + if (MapInfo->hMapping != INVALID_HANDLE_VALUE) { + CloseHandle(MapInfo->hMapping); + MapInfo->hMapping = NULL; } } void* MappedFile::map(std::string* ErrMsg) { if (!isMapped()) { DWORD prot = PAGE_READONLY; - if (options_ & EXEC_ACCESS) + if (Options & EXEC_ACCESS) prot = SEC_IMAGE; - else if (options_ & WRITE_ACCESS) + else if (Options & WRITE_ACCESS) prot = PAGE_READWRITE; - info_->hMapping = CreateFileMapping(info_->hFile, NULL, prot, 0, 0, NULL); - if (info_->hMapping == NULL) { - MakeErrMsg(ErrMsg, std::string("Can't map file: ") + path_.toString()); + MapInfo->hMapping = CreateFileMapping(MapInfo->hFile, NULL, prot, 0, 0, NULL); + if (MapInfo->hMapping == NULL) { + MakeErrMsg(ErrMsg, std::string("Can't map file: ") + Path.toString()); return 0; } - prot = (options_ & WRITE_ACCESS) ? FILE_MAP_WRITE : FILE_MAP_READ; - base_ = MapViewOfFileEx(info_->hMapping, prot, 0, 0, 0, NULL); - if (base_ == NULL) { - CloseHandle(info_->hMapping); - info_->hMapping = NULL; - MakeErrMsg(ErrMsg, std::string("Can't map file: ") + path_.toString()); + prot = (Options & WRITE_ACCESS) ? FILE_MAP_WRITE : FILE_MAP_READ; + BasePtr = MapViewOfFileEx(MapInfo->hMapping, prot, 0, 0, 0, NULL); + if (BasePtr == NULL) { + CloseHandle(MapInfo->hMapping); + MapInfo->hMapping = NULL; + MakeErrMsg(ErrMsg, std::string("Can't map file: ") + Path.toString()); return 0; } } - return base_; + return BasePtr; } size_t MappedFile::size() const { - assert(info_ && "MappedFile not initialized"); - return info_->size; + assert(MapInfo && "MappedFile not initialized"); + return MapInfo->size; } -bool MappedFile::size(size_t new_size, std::string* ErrMsg) { - assert(info_ && "MappedFile not initialized"); +bool MappedFile::resize(size_t new_size, std::string* ErrMsg) { + assert(MapInfo && "MappedFile not initialized"); // Take the mapping out of memory. unmap(); @@ -120,16 +120,16 @@ new_size = (new_size + pagesizem1) & ~pagesizem1; // If the file needs to be extended, do so. - if (new_size > info_->size) { + if (new_size > MapInfo->size) { LARGE_INTEGER eof; eof.QuadPart = new_size; - if (!SetFilePointerEx(info_->hFile, eof, NULL, FILE_BEGIN)) + if (!SetFilePointerEx(MapInfo->hFile, eof, NULL, FILE_BEGIN)) return MakeErrMsg(ErrMsg, - std::string("Can't set end of file: ") + path_.toString()); - if (!SetEndOfFile(info_->hFile)) + std::string("Can't set end of file: ") + Path.toString()); + if (!SetEndOfFile(MapInfo->hFile)) return MakeErrMsg(ErrMsg, - std::string("Can't set end of file: ") + path_.toString()); - info_->size = new_size; + std::string("Can't set end of file: ") + Path.toString()); + MapInfo->size = new_size; } // Remap the file. From sabre at nondot.org Mon Mar 31 19:54:40 2008 From: sabre at nondot.org (Chris Lattner) Date: Tue, 01 Apr 2008 00:54:40 -0000 Subject: [llvm-commits] [llvm] r49010 - /llvm/trunk/include/llvm/CodeGen/MachineRegisterInfo.h Message-ID: <200804010054.m310sedk008532@zion.cs.uiuc.edu> Author: lattner Date: Mon Mar 31 19:54:39 2008 New Revision: 49010 URL: http://llvm.org/viewvc/llvm-project?rev=49010&view=rev Log: update comment. Modified: llvm/trunk/include/llvm/CodeGen/MachineRegisterInfo.h Modified: llvm/trunk/include/llvm/CodeGen/MachineRegisterInfo.h URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/CodeGen/MachineRegisterInfo.h?rev=49010&r1=49009&r2=49010&view=diff ============================================================================== --- llvm/trunk/include/llvm/CodeGen/MachineRegisterInfo.h (original) +++ llvm/trunk/include/llvm/CodeGen/MachineRegisterInfo.h Mon Mar 31 19:54:39 2008 @@ -21,8 +21,9 @@ namespace llvm { -/// MachineRegisterInfo - Keep track of information for each virtual register, -/// including its register class. +/// MachineRegisterInfo - Keep track of information for virtual and physical +/// registers, including vreg register classes, use/def chains for registers, +/// etc. class MachineRegisterInfo { /// VRegInfo - Information we keep for each virtual register. The entries in /// this vector are actually converted to vreg numbers by adding the From dalej at apple.com Mon Mar 31 19:57:48 2008 From: dalej at apple.com (Dale Johannesen) Date: Tue, 01 Apr 2008 00:57:48 -0000 Subject: [llvm-commits] [llvm] r49011 - /llvm/trunk/lib/Target/X86/X86ISelLowering.cpp Message-ID: <200804010057.m310vm4H008626@zion.cs.uiuc.edu> Author: johannes Date: Mon Mar 31 19:57:48 2008 New Revision: 49011 URL: http://llvm.org/viewvc/llvm-project?rev=49011&view=rev Log: Accept 'y' constraint (MMX) in inline asm. Modified: llvm/trunk/lib/Target/X86/X86ISelLowering.cpp Modified: llvm/trunk/lib/Target/X86/X86ISelLowering.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/X86/X86ISelLowering.cpp?rev=49011&r1=49010&r2=49011&view=diff ============================================================================== --- llvm/trunk/lib/Target/X86/X86ISelLowering.cpp (original) +++ llvm/trunk/lib/Target/X86/X86ISelLowering.cpp Mon Mar 31 19:57:48 2008 @@ -6132,6 +6132,7 @@ case 'q': case 'Q': case 'x': + case 'y': case 'Y': return C_RegisterClass; default: From gohman at apple.com Mon Mar 31 20:08:19 2008 From: gohman at apple.com (Dan Gohman) Date: Mon, 31 Mar 2008 18:08:19 -0700 Subject: [llvm-commits] [PATCH] add GraphTraits for class User In-Reply-To: <47F124A9.40508@gmail.com> References: <47F124A9.40508@gmail.com> Message-ID: On Mar 31, 2008, at 10:51 AM, T?r?k Edwin wrote: > Hi, > > This patch adds GraphTraits for class User, allowing to use a > depth-first iterator to find out all values that depend on (use) a > certain Value. > This can currently be done only by coding a recursive function. > > I tried to use forward declaration of GraphTraits/Inverse to avoid > including the header for it, but that doesn't work, because of > Inverse. > Is it ok to include those headers in User.h? If not, where should I > move > this GraphTraits code? Including those headers in User.h would be undesirable. Could you put this code in a new header file, similar to how llvm/Support/CFG.h contains the graph traits for BasicBlock objects? Maybe the new file could be named llvm/Support/SSAGraph.h. Also, please use two-space indentation. Otherwise, the patch looks ok to me. Dan From evan.cheng at apple.com Mon Mar 31 20:50:16 2008 From: evan.cheng at apple.com (Evan Cheng) Date: Tue, 01 Apr 2008 01:50:16 -0000 Subject: [llvm-commits] [llvm] r49012 - in /llvm/trunk: lib/CodeGen/SelectionDAG/LegalizeDAG.cpp lib/Target/ARM/ARMISelLowering.cpp test/CodeGen/ARM/fpconv.ll Message-ID: <200804010150.m311oG7C010209@zion.cs.uiuc.edu> Author: evancheng Date: Mon Mar 31 20:50:16 2008 New Revision: 49012 URL: http://llvm.org/viewvc/llvm-project?rev=49012&view=rev Log: Unbreak ARM / Thumb soft FP support. Modified: llvm/trunk/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp llvm/trunk/lib/Target/ARM/ARMISelLowering.cpp llvm/trunk/test/CodeGen/ARM/fpconv.ll Modified: llvm/trunk/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp?rev=49012&r1=49011&r2=49012&view=diff ============================================================================== --- llvm/trunk/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp (original) +++ llvm/trunk/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp Mon Mar 31 20:50:16 2008 @@ -5450,7 +5450,14 @@ } RTLIB::Libcall LC; - if (SourceVT == MVT::i64) { + if (SourceVT == MVT::i32) { + if (DestTy == MVT::f32) + LC = isSigned ? RTLIB::SINTTOFP_I64_F32 : RTLIB::UINTTOFP_I64_F32; + else { + assert(DestTy == MVT::f64 && "Unknown fp value type!"); + LC = isSigned ? RTLIB::SINTTOFP_I32_F64 : RTLIB::UINTTOFP_I32_F64; + } + } else if (SourceVT == MVT::i64) { if (DestTy == MVT::f32) LC = RTLIB::SINTTOFP_I64_F32; else if (DestTy == MVT::f64) @@ -5481,7 +5488,7 @@ SDOperand HiPart; SDOperand Result = ExpandLibCall(TLI.getLibcallName(LC), Source.Val, isSigned, HiPart); - if (Result.getValueType() != DestTy) + if (Result.getValueType() != DestTy && HiPart.Val) Result = DAG.getNode(ISD::BUILD_PAIR, DestTy, Result, HiPart); return Result; } @@ -6773,7 +6780,8 @@ Lo = ExpandIntToFP(Node->getOpcode() == ISD::SINT_TO_FP, VT, Node->getOperand(0)); - ExpandOp(Lo, Lo, Hi); + if (getTypeAction(Lo.getValueType()) == Expand) + ExpandOp(Lo, Lo, Hi); break; } } Modified: llvm/trunk/lib/Target/ARM/ARMISelLowering.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/ARM/ARMISelLowering.cpp?rev=49012&r1=49011&r2=49012&view=diff ============================================================================== --- llvm/trunk/lib/Target/ARM/ARMISelLowering.cpp (original) +++ llvm/trunk/lib/Target/ARM/ARMISelLowering.cpp Mon Mar 31 20:50:16 2008 @@ -248,16 +248,20 @@ setOperationAction(ISD::FCOS , MVT::f64, Expand); setOperationAction(ISD::FREM , MVT::f64, Expand); setOperationAction(ISD::FREM , MVT::f32, Expand); - setOperationAction(ISD::FCOPYSIGN, MVT::f64, Custom); - setOperationAction(ISD::FCOPYSIGN, MVT::f32, Custom); + if (!UseSoftFloat && Subtarget->hasVFP2() && !Subtarget->isThumb()) { + setOperationAction(ISD::FCOPYSIGN, MVT::f64, Custom); + setOperationAction(ISD::FCOPYSIGN, MVT::f32, Custom); + } setOperationAction(ISD::FPOW , MVT::f64, Expand); setOperationAction(ISD::FPOW , MVT::f32, Expand); // int <-> fp are custom expanded into bit_convert + ARMISD ops. - setOperationAction(ISD::SINT_TO_FP, MVT::i32, Custom); - setOperationAction(ISD::UINT_TO_FP, MVT::i32, Custom); - setOperationAction(ISD::FP_TO_UINT, MVT::i32, Custom); - setOperationAction(ISD::FP_TO_SINT, MVT::i32, Custom); + if (!UseSoftFloat && Subtarget->hasVFP2() && !Subtarget->isThumb()) { + setOperationAction(ISD::SINT_TO_FP, MVT::i32, Custom); + setOperationAction(ISD::UINT_TO_FP, MVT::i32, Custom); + setOperationAction(ISD::FP_TO_UINT, MVT::i32, Custom); + setOperationAction(ISD::FP_TO_SINT, MVT::i32, Custom); + } // We have target-specific dag combine patterns for the following nodes: // ARMISD::FMRRD - No need to call setTargetDAGCombine Modified: llvm/trunk/test/CodeGen/ARM/fpconv.ll URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/ARM/fpconv.ll?rev=49012&r1=49011&r2=49012&view=diff ============================================================================== --- llvm/trunk/test/CodeGen/ARM/fpconv.ll (original) +++ llvm/trunk/test/CodeGen/ARM/fpconv.ll Mon Mar 31 20:50:16 2008 @@ -9,6 +9,16 @@ ; RUN: grep fsitod %t ; RUN: grep fuitos %t ; RUN: grep fuitod %t +; RUN: llvm-as < %s | llc -march=arm > %t +; RUN: grep truncdfsf2 %t +; RUN: grep extendsfdf2 %t +; RUN: grep fixsfsi %t +; RUN: grep fixunssfsi %t +; RUN: grep fixdfsi %t +; RUN: grep fixunsdfsi %t +; RUN: grep floatdisf %t +; RUN: grep floatsidf %t +; RUN: llvm-as < %s | llc -march=thumb define float @f1(double %x) { entry: From evan.cheng at apple.com Mon Mar 31 20:51:26 2008 From: evan.cheng at apple.com (Evan Cheng) Date: Tue, 01 Apr 2008 01:51:26 -0000 Subject: [llvm-commits] [llvm] r49013 - /llvm/trunk/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp Message-ID: <200804010151.m311pQ2O010259@zion.cs.uiuc.edu> Author: evancheng Date: Mon Mar 31 20:51:26 2008 New Revision: 49013 URL: http://llvm.org/viewvc/llvm-project?rev=49013&view=rev Log: Add comment. Modified: llvm/trunk/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp Modified: llvm/trunk/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp?rev=49013&r1=49012&r2=49013&view=diff ============================================================================== --- llvm/trunk/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp (original) +++ llvm/trunk/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp Mon Mar 31 20:51:26 2008 @@ -6781,6 +6781,7 @@ Lo = ExpandIntToFP(Node->getOpcode() == ISD::SINT_TO_FP, VT, Node->getOperand(0)); if (getTypeAction(Lo.getValueType()) == Expand) + // float to i32 etc. can be 'expanded' to a single node. ExpandOp(Lo, Lo, Hi); break; } From evan.cheng at apple.com Mon Mar 31 21:00:10 2008 From: evan.cheng at apple.com (Evan Cheng) Date: Tue, 01 Apr 2008 02:00:10 -0000 Subject: [llvm-commits] [llvm] r49014 - /llvm/trunk/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp Message-ID: <200804010200.m3120ARa010487@zion.cs.uiuc.edu> Author: evancheng Date: Mon Mar 31 21:00:09 2008 New Revision: 49014 URL: http://llvm.org/viewvc/llvm-project?rev=49014&view=rev Log: Pasto. Modified: llvm/trunk/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp Modified: llvm/trunk/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp?rev=49014&r1=49013&r2=49014&view=diff ============================================================================== --- llvm/trunk/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp (original) +++ llvm/trunk/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp Mon Mar 31 21:00:09 2008 @@ -5452,7 +5452,7 @@ RTLIB::Libcall LC; if (SourceVT == MVT::i32) { if (DestTy == MVT::f32) - LC = isSigned ? RTLIB::SINTTOFP_I64_F32 : RTLIB::UINTTOFP_I64_F32; + LC = isSigned ? RTLIB::SINTTOFP_I32_F32 : RTLIB::UINTTOFP_I32_F32; else { assert(DestTy == MVT::f64 && "Unknown fp value type!"); LC = isSigned ? RTLIB::SINTTOFP_I32_F64 : RTLIB::UINTTOFP_I32_F64; From dpatel at apple.com Mon Mar 31 21:02:44 2008 From: dpatel at apple.com (Devang Patel) Date: Tue, 01 Apr 2008 02:02:44 -0000 Subject: [llvm-commits] [llvm-gcc-4.2] r49015 - in /llvm-gcc-4.2/trunk/gcc: config/i386/llvm-i386-target.h llvm-abi.h Message-ID: <200804010202.m3122jvQ010566@zion.cs.uiuc.edu> Author: dpatel Date: Mon Mar 31 21:02:44 2008 New Revision: 49015 URL: http://llvm.org/viewvc/llvm-project?rev=49015&view=rev Log: s/LLVM_SHOULD_RETURN_STRUCT_AS_SCALAR/LLVM_SHOULD_RETURN_SELT_STRUCT_AS_SCALAR/g Modified: llvm-gcc-4.2/trunk/gcc/config/i386/llvm-i386-target.h llvm-gcc-4.2/trunk/gcc/llvm-abi.h Modified: llvm-gcc-4.2/trunk/gcc/config/i386/llvm-i386-target.h URL: http://llvm.org/viewvc/llvm-project/llvm-gcc-4.2/trunk/gcc/config/i386/llvm-i386-target.h?rev=49015&r1=49014&r2=49015&view=diff ============================================================================== --- llvm-gcc-4.2/trunk/gcc/config/i386/llvm-i386-target.h (original) +++ llvm-gcc-4.2/trunk/gcc/config/i386/llvm-i386-target.h Mon Mar 31 21:02:44 2008 @@ -93,8 +93,8 @@ /* Structs containing a single data field plus zero-length fields are considered as if they were the type of the data field. */ -#ifndef LLVM_SHOULD_RETURN_STRUCT_AS_SCALAR -#define LLVM_SHOULD_RETURN_STRUCT_AS_SCALAR(X) \ +#ifndef LLVM_SHOULD_RETURN_SELT_STRUCT_AS_SCALAR +#define LLVM_SHOULD_RETURN_SELT_STRUCT_AS_SCALAR(X) \ isSingleElementStructOrArray(X, true, false) #endif Modified: llvm-gcc-4.2/trunk/gcc/llvm-abi.h URL: http://llvm.org/viewvc/llvm-project/llvm-gcc-4.2/trunk/gcc/llvm-abi.h?rev=49015&r1=49014&r2=49015&view=diff ============================================================================== --- llvm-gcc-4.2/trunk/gcc/llvm-abi.h (original) +++ llvm-gcc-4.2/trunk/gcc/llvm-abi.h Mon Mar 31 21:02:44 2008 @@ -205,13 +205,14 @@ !isSingleElementStructOrArray(X, false, true) #endif -// LLVM_SHOULD_RETURN_STRUCT_AS_SCALAR - Return a TYPE tree if this struct -// should be returned using the convention for that scalar TYPE, 0 otherwise. +// LLVM_SHOULD_RETURN_SELT_STRUCT_AS_SCALAR - Return a TYPE tree if this single +// element struct should be returned using the convention for that scalar TYPE, +// 0 otherwise. // The returned TYPE must be the same size as X for this to work; that is // checked elsewhere. (Structs where this is not the case can be constructed // by abusing the __aligned__ attribute.) -#ifndef LLVM_SHOULD_RETURN_STRUCT_AS_SCALAR -#define LLVM_SHOULD_RETURN_STRUCT_AS_SCALAR(X) \ +#ifndef LLVM_SHOULD_RETURN_SELT_STRUCT_AS_SCALAR +#define LLVM_SHOULD_RETURN_SELT_STRUCT_AS_SCALAR(X) \ isSingleElementStructOrArray(X, false, false) #endif @@ -280,7 +281,7 @@ && (!TARGET_64BIT || TREE_INT_CST_LOW(TYPE_SIZE_UNIT(type))<=8) #endif ) { - tree SingleElt = LLVM_SHOULD_RETURN_STRUCT_AS_SCALAR(type); + tree SingleElt = LLVM_SHOULD_RETURN_SELT_STRUCT_AS_SCALAR(type); if (SingleElt && TYPE_SIZE(SingleElt) && TREE_CODE(TYPE_SIZE(SingleElt)) == INTEGER_CST && TREE_INT_CST_LOW(TYPE_SIZE_UNIT(type)) == From evan.cheng at apple.com Mon Mar 31 21:18:22 2008 From: evan.cheng at apple.com (Evan Cheng) Date: Tue, 01 Apr 2008 02:18:22 -0000 Subject: [llvm-commits] [llvm] r49016 - in /llvm/trunk: lib/CodeGen/SelectionDAG/LegalizeDAG.cpp test/CodeGen/ARM/fpconv.ll Message-ID: <200804010218.m312IMoi010991@zion.cs.uiuc.edu> Author: evancheng Date: Mon Mar 31 21:18:22 2008 New Revision: 49016 URL: http://llvm.org/viewvc/llvm-project?rev=49016&view=rev Log: More soft fp fixes. Modified: llvm/trunk/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp llvm/trunk/test/CodeGen/ARM/fpconv.ll Modified: llvm/trunk/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp?rev=49016&r1=49015&r2=49016&view=diff ============================================================================== --- llvm/trunk/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp (original) +++ llvm/trunk/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp Mon Mar 31 21:18:22 2008 @@ -5369,7 +5369,8 @@ MVT::ValueType SourceVT = Source.getValueType(); bool ExpandSource = getTypeAction(SourceVT) == Expand; - if (!isSigned) { + // Special case for i32 source to take advantage of UINTTOFP_I32_F32, etc. + if (!isSigned && SourceVT != MVT::i32) { // The integer value loaded will be incorrectly if the 'sign bit' of the // incoming integer is set. To handle this, we dynamically test to see if // it is set, and, if so, add a fudge factor. Modified: llvm/trunk/test/CodeGen/ARM/fpconv.ll URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/ARM/fpconv.ll?rev=49016&r1=49015&r2=49016&view=diff ============================================================================== --- llvm/trunk/test/CodeGen/ARM/fpconv.ll (original) +++ llvm/trunk/test/CodeGen/ARM/fpconv.ll Mon Mar 31 21:18:22 2008 @@ -16,8 +16,10 @@ ; RUN: grep fixunssfsi %t ; RUN: grep fixdfsi %t ; RUN: grep fixunsdfsi %t -; RUN: grep floatdisf %t +; RUN: grep floatsisf %t ; RUN: grep floatsidf %t +; RUN: grep floatunsisf %t +; RUN: grep floatunsidf %t ; RUN: llvm-as < %s | llc -march=thumb define float @f1(double %x) { From dpatel at apple.com Mon Mar 31 21:29:32 2008 From: dpatel at apple.com (Devang Patel) Date: Tue, 01 Apr 2008 02:29:32 -0000 Subject: [llvm-commits] [llvm-gcc-4.2] r49017 - in /llvm-gcc-4.2/trunk/gcc: config/i386/llvm-i386-target.h config/i386/llvm-i386.cpp config/rs6000/llvm-rs6000.cpp config/rs6000/rs6000.h llvm-abi.h Message-ID: <200804010229.m312TWhV011299@zion.cs.uiuc.edu> Author: dpatel Date: Mon Mar 31 21:29:32 2008 New Revision: 49017 URL: http://llvm.org/viewvc/llvm-project?rev=49017&view=rev Log: Simplify. Move target specific code into the area where target specific code lives. This patch does not introduce any functionality change, at least that is the intent. Modified: llvm-gcc-4.2/trunk/gcc/config/i386/llvm-i386-target.h llvm-gcc-4.2/trunk/gcc/config/i386/llvm-i386.cpp llvm-gcc-4.2/trunk/gcc/config/rs6000/llvm-rs6000.cpp llvm-gcc-4.2/trunk/gcc/config/rs6000/rs6000.h llvm-gcc-4.2/trunk/gcc/llvm-abi.h Modified: llvm-gcc-4.2/trunk/gcc/config/i386/llvm-i386-target.h URL: http://llvm.org/viewvc/llvm-project/llvm-gcc-4.2/trunk/gcc/config/i386/llvm-i386-target.h?rev=49017&r1=49016&r2=49017&view=diff ============================================================================== --- llvm-gcc-4.2/trunk/gcc/config/i386/llvm-i386-target.h (original) +++ llvm-gcc-4.2/trunk/gcc/config/i386/llvm-i386-target.h Mon Mar 31 21:29:32 2008 @@ -98,6 +98,13 @@ isSingleElementStructOrArray(X, true, false) #endif +#ifndef LLVM_SHOULD_RETURN_STRUCT_AS_SCALAR +#define LLVM_SHOULD_RETURN_STRUCT_AS_SCALAR(X) \ + llvm_x86_should_return_struct_as_scalar(X) +#endif + +extern bool llvm_x86_should_return_struct_as_scalar(tree); + extern bool llvm_x86_should_pass_vector_in_integer_regs(tree); /* Vectors which are not MMX nor SSE should be passed as integers. */ Modified: llvm-gcc-4.2/trunk/gcc/config/i386/llvm-i386.cpp URL: http://llvm.org/viewvc/llvm-project/llvm-gcc-4.2/trunk/gcc/config/i386/llvm-i386.cpp?rev=49017&r1=49016&r2=49017&view=diff ============================================================================== --- llvm-gcc-4.2/trunk/gcc/config/i386/llvm-i386.cpp (original) +++ llvm-gcc-4.2/trunk/gcc/config/i386/llvm-i386.cpp Mon Mar 31 21:29:32 2008 @@ -674,6 +674,17 @@ return true; } +/* Returns true if TYPE should be pass as scalar. */ +bool llvm_x86_should_return_struct_as_scalar(tree type) { + // FIXME without this, 64-bit _Complex long double crashes. With it, we + // just produce incorrect code. + if (!TARGET_64BIT) + return true; + if (TREE_INT_CST_LOW(TYPE_SIZE_UNIT(type)) << 8) + return true; + return false; +} + /* Target hook for llvm-abi.h. It returns true if an aggregate of the specified type should be passed in a number of registers of mixed types. It also returns a vector of types that correspond to the registers used Modified: llvm-gcc-4.2/trunk/gcc/config/rs6000/llvm-rs6000.cpp URL: http://llvm.org/viewvc/llvm-project/llvm-gcc-4.2/trunk/gcc/config/rs6000/llvm-rs6000.cpp?rev=49017&r1=49016&r2=49017&view=diff ============================================================================== --- llvm-gcc-4.2/trunk/gcc/config/rs6000/llvm-rs6000.cpp (original) +++ llvm-gcc-4.2/trunk/gcc/config/rs6000/llvm-rs6000.cpp Mon Mar 31 21:29:32 2008 @@ -487,5 +487,20 @@ return false; } +/* Returns true if TYPE should be pass as scalar. */ +bool llvm_rs6000_should_return_struct_as_scalar(tree type) { + // FIXME darwin ppc64 often returns structs partly in memory and partly + // in regs. The binary interface of return_in_memory (which does the + // work for aggregate_value_p) is not a good match for this; in fact + // this target returns false if any part of it goes in registers. Which + // means aggregate_value_p is not useful on this target for this purpose. + // This is a big nasty longterm problem. For now put things back the + // way they used to be (wrong, but fewer crashes). + if (!TARGET_64BIT) + return true; + if (TREE_INT_CST_LOW(TYPE_SIZE_UNIT(type))<=8) + return true; + return false; +} /* LLVM LOCAL end (ENTIRE FILE!) */ Modified: llvm-gcc-4.2/trunk/gcc/config/rs6000/rs6000.h URL: http://llvm.org/viewvc/llvm-project/llvm-gcc-4.2/trunk/gcc/config/rs6000/rs6000.h?rev=49017&r1=49016&r2=49017&view=diff ============================================================================== --- llvm-gcc-4.2/trunk/gcc/config/rs6000/rs6000.h (original) +++ llvm-gcc-4.2/trunk/gcc/config/rs6000/rs6000.h Mon Mar 31 21:29:32 2008 @@ -3507,6 +3507,12 @@ #define LLVM_SHOULD_RETURN_VECTOR_AS_SHADOW(X,isBuiltin)\ llvm_rs6000_should_return_vector_as_shadow((X), (isBuiltin)) +#ifndef LLVM_SHOULD_RETURN_STRUCT_AS_SCALAR +#define LLVM_SHOULD_RETURN_STRUCT_AS_SCALAR(X) \ + llvm_rs6000_should_return_struct_as_scalar(X) +#endif + +extern bool llvm_rs6000_should_return_struct_as_scalar(tree); #endif /* LLVM_ABI_H */ /* LLVM LOCAL end */ Modified: llvm-gcc-4.2/trunk/gcc/llvm-abi.h URL: http://llvm.org/viewvc/llvm-project/llvm-gcc-4.2/trunk/gcc/llvm-abi.h?rev=49017&r1=49016&r2=49017&view=diff ============================================================================== --- llvm-gcc-4.2/trunk/gcc/llvm-abi.h (original) +++ llvm-gcc-4.2/trunk/gcc/llvm-abi.h Mon Mar 31 21:29:32 2008 @@ -96,6 +96,15 @@ TREE_CODE(type) == COMPLEX_TYPE; } +// isAggregateFunctionParam - Return true if the specified GCC type +// satisfies function.c:aggregate_value_p() +static bool isAggregateFunctionParam(tree type) { + if (TYPE_SIZE(type) && TREE_CODE(TYPE_SIZE(type)) == INTEGER_CST + && !aggregate_value_p(type, current_function_decl)) + return true; + return false; +} + /// isSingleElementStructOrArray - If this is (recursively) a structure with one /// field or an array with one element, return the field type, otherwise return /// null. If ignoreZeroLength, the struct (recursively) may include zero-length @@ -216,6 +225,13 @@ isSingleElementStructOrArray(X, false, false) #endif +// LLVM_SHOULD_RETURN_STRUCT_AS_SCALAR - Return true if TYPE tree should +// be returned as a scalar. +#ifndef LLVM_SHOULD_RETURN_STRUCT_AS_SCALAR +#define LLVM_SHOULD_RETURN_STRUCT_AS_SCALAR(x) \ + false +#endif + // LLVM_SHOULD_RETURN_VECTOR_AS_SCALAR - Return a TYPE tree if this vector type // should be returned using the convention for that scalar TYPE, 0 otherwise. // X may be evaluated more than once. @@ -263,24 +279,8 @@ } else if (Ty->isFirstClassType() || Ty == Type::VoidTy) { // Return scalar values normally. C.HandleScalarResult(Ty); - } else if (TYPE_SIZE(type) && TREE_CODE(TYPE_SIZE(type)) == INTEGER_CST && - !aggregate_value_p(type, current_function_decl) -#if defined(TARGET_386) - // FIXME without this, 64-bit _Complex long double crashes. With it, we - // just produce incorrect code. - && (!TARGET_64BIT || TREE_INT_CST_LOW(TYPE_SIZE_UNIT(type))<=8) -#endif -#if defined(TARGET_POWERPC) - // FIXME darwin ppc64 often returns structs partly in memory and partly - // in regs. The binary interface of return_in_memory (which does the - // work for aggregate_value_p) is not a good match for this; in fact - // this target returns false if any part of it goes in registers. Which - // means aggregate_value_p is not useful on this target for this purpose. - // This is a big nasty longterm problem. For now put things back the - // way they used to be (wrong, but fewer crashes). - && (!TARGET_64BIT || TREE_INT_CST_LOW(TYPE_SIZE_UNIT(type))<=8) -#endif - ) { + } else if (isAggregateFunctionParam(type) + && LLVM_SHOULD_RETURN_STRUCT_AS_SCALAR(type)) { tree SingleElt = LLVM_SHOULD_RETURN_SELT_STRUCT_AS_SCALAR(type); if (SingleElt && TYPE_SIZE(SingleElt) && TREE_CODE(TYPE_SIZE(SingleElt)) == INTEGER_CST && From dpatel at apple.com Mon Mar 31 21:35:42 2008 From: dpatel at apple.com (Devang Patel) Date: Tue, 01 Apr 2008 02:35:42 -0000 Subject: [llvm-commits] [llvm-gcc-4.2] r49018 - /llvm-gcc-4.2/trunk/gcc/config/i386/llvm-i386.cpp Message-ID: <200804010235.m312ZgQJ011483@zion.cs.uiuc.edu> Author: dpatel Date: Mon Mar 31 21:35:42 2008 New Revision: 49018 URL: http://llvm.org/viewvc/llvm-project?rev=49018&view=rev Log: Restore original behavior. Fix typo in previous commit. Modified: llvm-gcc-4.2/trunk/gcc/config/i386/llvm-i386.cpp Modified: llvm-gcc-4.2/trunk/gcc/config/i386/llvm-i386.cpp URL: http://llvm.org/viewvc/llvm-project/llvm-gcc-4.2/trunk/gcc/config/i386/llvm-i386.cpp?rev=49018&r1=49017&r2=49018&view=diff ============================================================================== --- llvm-gcc-4.2/trunk/gcc/config/i386/llvm-i386.cpp (original) +++ llvm-gcc-4.2/trunk/gcc/config/i386/llvm-i386.cpp Mon Mar 31 21:35:42 2008 @@ -680,7 +680,7 @@ // just produce incorrect code. if (!TARGET_64BIT) return true; - if (TREE_INT_CST_LOW(TYPE_SIZE_UNIT(type)) << 8) + if (TREE_INT_CST_LOW(TYPE_SIZE_UNIT(type)) <= 8) return true; return false; } From dpatel at apple.com Mon Mar 31 21:39:53 2008 From: dpatel at apple.com (Devang Patel) Date: Tue, 01 Apr 2008 02:39:53 -0000 Subject: [llvm-commits] [llvm-gcc-4.2] r49019 - /llvm-gcc-4.2/trunk/gcc/config/i386/llvm-i386.cpp Message-ID: <200804010239.m312drHK011602@zion.cs.uiuc.edu> Author: dpatel Date: Mon Mar 31 21:39:52 2008 New Revision: 49019 URL: http://llvm.org/viewvc/llvm-project?rev=49019&view=rev Log: Explicitly check _Complex to address FIXME as per comment in the code.. Modified: llvm-gcc-4.2/trunk/gcc/config/i386/llvm-i386.cpp Modified: llvm-gcc-4.2/trunk/gcc/config/i386/llvm-i386.cpp URL: http://llvm.org/viewvc/llvm-project/llvm-gcc-4.2/trunk/gcc/config/i386/llvm-i386.cpp?rev=49019&r1=49018&r2=49019&view=diff ============================================================================== --- llvm-gcc-4.2/trunk/gcc/config/i386/llvm-i386.cpp (original) +++ llvm-gcc-4.2/trunk/gcc/config/i386/llvm-i386.cpp Mon Mar 31 21:39:52 2008 @@ -682,6 +682,8 @@ return true; if (TREE_INT_CST_LOW(TYPE_SIZE_UNIT(type)) <= 8) return true; + if (TREE_CODE(type) != COMPLEX_TYPE) + return true; return false; } From clattner at apple.com Mon Mar 31 21:43:24 2008 From: clattner at apple.com (Chris Lattner) Date: Mon, 31 Mar 2008 19:43:24 -0700 Subject: [llvm-commits] [test-suite] r49007 - /test-suite/trunk/Makefile.programs In-Reply-To: <200803312343.m2VNh9XS005622@zion.cs.uiuc.edu> References: <200803312343.m2VNh9XS005622@zion.cs.uiuc.edu> Message-ID: <0A746DAE-0596-40D7-AD29-27BBC69652FE@apple.com> On Mar 31, 2008, at 4:43 PM, Dale Johannesen wrote: > Author: johannes > Date: Mon Mar 31 18:43:08 2008 > New Revision: 49007 > > URL: http://llvm.org/viewvc/llvm-project?rev=49007&view=rev > Log: > Remove -enable-eh; it is no longer required. Shouldn't these lines actually be removed? It seems strange to have them commented out like this. I'd think something like: # PPC and X86 support DWARF EH by default always. ifneq ($(ARCH),PowerPC) ifneq ($(ARCH),x86) > LLCFLAGS += -enable-correct-eh-support > LLVMLD_FLAGS += -disable-inlining .. endif endif would work. -Chris > > Modified: > test-suite/trunk/Makefile.programs > > Modified: test-suite/trunk/Makefile.programs > URL: http://llvm.org/viewvc/llvm-project/test-suite/trunk/Makefile.programs?rev=49007&r1=49006&r2=49007&view=diff > > = > = > = > = > = > = > = > = > ====================================================================== > --- test-suite/trunk/Makefile.programs (original) > +++ test-suite/trunk/Makefile.programs Mon Mar 31 18:43:08 2008 > @@ -321,11 +321,12 @@ > # expensive) support for it. > ifdef REQUIRES_EH_SUPPORT > # PPC and X86 support DWARF exceptions, for everything else, default > to SJLJ > +# -enable-eh is no longer required to get DWARF exceptions. > ifeq ($(ARCH),PowerPC) > -LLCFLAGS += -enable-eh > +#LLCFLAGS += -enable-eh > else > ifeq ($(ARCH),x86) > -LLCFLAGS += -enable-eh > +#LLCFLAGS += -enable-eh > else > LLCFLAGS += -enable-correct-eh-support > LLVMLD_FLAGS += -disable-inlining > > > _______________________________________________ > llvm-commits mailing list > llvm-commits at cs.uiuc.edu > http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits From sabre at nondot.org Mon Mar 31 21:58:05 2008 From: sabre at nondot.org (Chris Lattner) Date: Tue, 01 Apr 2008 02:58:05 -0000 Subject: [llvm-commits] [llvm] r49020 - in /llvm/trunk/lib/Archive: Archive.cpp ArchiveReader.cpp ArchiveWriter.cpp Message-ID: <200804010258.m312w5TW012098@zion.cs.uiuc.edu> Author: lattner Date: Mon Mar 31 21:58:05 2008 New Revision: 49020 URL: http://llvm.org/viewvc/llvm-project?rev=49020&view=rev Log: add missing #includes Modified: llvm/trunk/lib/Archive/Archive.cpp llvm/trunk/lib/Archive/ArchiveReader.cpp llvm/trunk/lib/Archive/ArchiveWriter.cpp Modified: llvm/trunk/lib/Archive/Archive.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Archive/Archive.cpp?rev=49020&r1=49019&r2=49020&view=diff ============================================================================== --- llvm/trunk/lib/Archive/Archive.cpp (original) +++ llvm/trunk/lib/Archive/Archive.cpp Mon Mar 31 21:58:05 2008 @@ -17,6 +17,7 @@ #include "llvm/ModuleProvider.h" #include "llvm/Module.h" #include "llvm/Support/MemoryBuffer.h" +#include "llvm/System/MappedFile.h" #include "llvm/System/Process.h" #include #include Modified: llvm/trunk/lib/Archive/ArchiveReader.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Archive/ArchiveReader.cpp?rev=49020&r1=49019&r2=49020&view=diff ============================================================================== --- llvm/trunk/lib/Archive/ArchiveReader.cpp (original) +++ llvm/trunk/lib/Archive/ArchiveReader.cpp Mon Mar 31 21:58:05 2008 @@ -14,6 +14,7 @@ #include "ArchiveInternals.h" #include "llvm/Bitcode/ReaderWriter.h" #include "llvm/Support/MemoryBuffer.h" +#include "llvm/System/MappedFile.h" #include "llvm/Module.h" #include using namespace llvm; Modified: llvm/trunk/lib/Archive/ArchiveWriter.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Archive/ArchiveWriter.cpp?rev=49020&r1=49019&r2=49020&view=diff ============================================================================== --- llvm/trunk/lib/Archive/ArchiveWriter.cpp (original) +++ llvm/trunk/lib/Archive/ArchiveWriter.cpp Mon Mar 31 21:58:05 2008 @@ -13,6 +13,7 @@ #include "ArchiveInternals.h" #include "llvm/Bitcode/ReaderWriter.h" +#include "llvm/System/MappedFile.h" #include "llvm/System/Signals.h" #include "llvm/System/Process.h" #include "llvm/ModuleProvider.h" From sabre at nondot.org Mon Mar 31 22:01:15 2008 From: sabre at nondot.org (Chris Lattner) Date: Tue, 01 Apr 2008 03:01:15 -0000 Subject: [llvm-commits] [llvm] r49021 - /llvm/trunk/include/llvm/Bitcode/Archive.h Message-ID: <200804010301.m3131F0h012215@zion.cs.uiuc.edu> Author: lattner Date: Mon Mar 31 22:01:15 2008 New Revision: 49021 URL: http://llvm.org/viewvc/llvm-project?rev=49021&view=rev Log: remove extraneous #include Modified: llvm/trunk/include/llvm/Bitcode/Archive.h Modified: llvm/trunk/include/llvm/Bitcode/Archive.h URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Bitcode/Archive.h?rev=49021&r1=49020&r2=49021&view=diff ============================================================================== --- llvm/trunk/include/llvm/Bitcode/Archive.h (original) +++ llvm/trunk/include/llvm/Bitcode/Archive.h Mon Mar 31 22:01:15 2008 @@ -19,12 +19,12 @@ #include "llvm/ADT/ilist" #include "llvm/System/Path.h" -#include "llvm/System/MappedFile.h" #include #include #include namespace llvm { + namespace sys { class MappedFile; } // Forward declare classes class ModuleProvider; // From VMCore From sabre at nondot.org Mon Mar 31 22:10:23 2008 From: sabre at nondot.org (Chris Lattner) Date: Tue, 01 Apr 2008 03:10:23 -0000 Subject: [llvm-commits] [llvm] r49022 - in /llvm/trunk: include/llvm/Debugger/SourceFile.h include/llvm/System/MappedFile.h lib/Archive/Archive.cpp lib/Archive/ArchiveWriter.cpp lib/Support/FileUtilities.cpp lib/Support/MemoryBuffer.cpp lib/System/Unix/MappedFile.inc lib/System/Win32/MappedFile.inc Message-ID: <200804010310.m313AOa1012486@zion.cs.uiuc.edu> Author: lattner Date: Mon Mar 31 22:10:22 2008 New Revision: 49022 URL: http://llvm.org/viewvc/llvm-project?rev=49022&view=rev Log: Remove MappedFile support for mapping files for write and exec and shared. This complicates the design, is not used, and probably doesn't even work. Modified: llvm/trunk/include/llvm/Debugger/SourceFile.h llvm/trunk/include/llvm/System/MappedFile.h llvm/trunk/lib/Archive/Archive.cpp llvm/trunk/lib/Archive/ArchiveWriter.cpp llvm/trunk/lib/Support/FileUtilities.cpp llvm/trunk/lib/Support/MemoryBuffer.cpp llvm/trunk/lib/System/Unix/MappedFile.inc llvm/trunk/lib/System/Win32/MappedFile.inc Modified: llvm/trunk/include/llvm/Debugger/SourceFile.h URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Debugger/SourceFile.h?rev=49022&r1=49021&r2=49022&view=diff ============================================================================== --- llvm/trunk/include/llvm/Debugger/SourceFile.h (original) +++ llvm/trunk/include/llvm/Debugger/SourceFile.h Mon Mar 31 22:10:22 2008 @@ -52,7 +52,7 @@ SourceFile(const std::string &fn, const GlobalVariable *Desc) : Filename(fn), Descriptor(Desc), File() { std::string ErrMsg; - if (File.open(Filename, sys::MappedFile::READ_ACCESS, &ErrMsg)) + if (File.open(Filename, &ErrMsg)) throw ErrMsg; readFile(); } Modified: llvm/trunk/include/llvm/System/MappedFile.h URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/System/MappedFile.h?rev=49022&r1=49021&r2=49022&view=diff ============================================================================== --- llvm/trunk/include/llvm/System/MappedFile.h (original) +++ llvm/trunk/include/llvm/System/MappedFile.h Mon Mar 31 22:10:22 2008 @@ -25,26 +25,16 @@ /// This class provides an abstraction for a memory mapped file in the /// operating system's filesystem. It provides platform independent operations - /// for mapping a file into memory for both read and write access. This class - /// does not provide facilities for finding the file or operating on paths to - /// files. The sys::Path class is used for that. + /// for mapping a file into memory for both read access. class MappedFile { sys::PathWithStatus Path; ///< Path to the file. - unsigned Options; ///< Options used to create the mapping void *BasePtr; ///< Pointer to the base memory address mutable MappedFileInfo *MapInfo; ///< Platform specific info for the mapping MappedFile& operator=(const MappedFile &that); // DO NOT IMPLEMENT MappedFile(const MappedFile &that); // DO NOT IMPLEMENT public: - enum MappingOptions { - READ_ACCESS = 0x0001, ///< Map the file for reading - WRITE_ACCESS = 0x0002, ///< Map the file for write access - EXEC_ACCESS = 0x0004, ///< Map the file for execution access - SHARED_MAPPING = 0x0008 ///< Map the file shared with other processes - }; - - MappedFile() : Options(READ_ACCESS), BasePtr(0), MapInfo(0) {} + MappedFile() : BasePtr(0), MapInfo(0) {} /// Destruct a MappedFile and release all memory associated with it. ~MappedFile() { close(); } @@ -71,7 +61,7 @@ /// This function returns a reference to the sys::Path object kept by the /// MappedFile object. This contains the path to the file that is or /// will be mapped. - const sys::Path& path() const { return Path; } + const sys::PathWithStatus &path() const { return Path; } /// This function returns the number of bytes in the file. size_t size() const; @@ -80,10 +70,8 @@ /// Open a file to be mapped and get its size but don't map it yet. Return /// true on error. - bool open(const sys::Path &P, int options = READ_ACCESS, - std::string *ErrMsg = 0) { + bool open(const sys::Path &P, std::string *ErrMsg = 0) { Path = P; - Options = options; return initialize(ErrMsg); } @@ -97,14 +85,6 @@ /// or 0 if an error occurred. void *map(std::string* ErrMsg = 0); - /// resize - This method causes the size of the file, and consequently the - /// size of the mapping to be set. This is logically the same as unmap(), - /// adjust size of the file, map(). Consequently, when calling this - /// function, the caller should not rely on previous results of the - /// map(), base(), or baseChar() members as they may point to invalid - /// areas of memory after this call. - bool resize(size_t new_size, std::string *ErrMsg = 0); - void close() { if (MapInfo) terminate(); } private: Modified: llvm/trunk/lib/Archive/Archive.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Archive/Archive.cpp?rev=49022&r1=49021&r2=49022&view=diff ============================================================================== --- llvm/trunk/lib/Archive/Archive.cpp (original) +++ llvm/trunk/lib/Archive/Archive.cpp Mon Mar 31 22:10:22 2008 @@ -148,7 +148,7 @@ Archive::mapToMemory(std::string* ErrMsg) { mapfile = new sys::MappedFile(); - if (mapfile->open(archPath, sys::MappedFile::READ_ACCESS, ErrMsg)) + if (mapfile->open(archPath, ErrMsg)) return true; if (!(base = (char*) mapfile->map(ErrMsg))) return true; Modified: llvm/trunk/lib/Archive/ArchiveWriter.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Archive/ArchiveWriter.cpp?rev=49022&r1=49021&r2=49022&view=diff ============================================================================== --- llvm/trunk/lib/Archive/ArchiveWriter.cpp (original) +++ llvm/trunk/lib/Archive/ArchiveWriter.cpp Mon Mar 31 22:10:22 2008 @@ -212,7 +212,7 @@ sys::MappedFile* mFile = 0; if (!data) { mFile = new sys::MappedFile(); - if (mFile->open(member.getPath(), sys::MappedFile::READ_ACCESS, ErrMsg)) + if (mFile->open(member.getPath(), ErrMsg)) return true; if (!(data = (const char*) mFile->map(ErrMsg))) return true; @@ -411,7 +411,7 @@ // Map in the archive we just wrote. sys::MappedFile arch; - if (arch.open(TmpArchive, sys::MappedFile::READ_ACCESS, ErrMsg)) + if (arch.open(TmpArchive, ErrMsg)) return true; const char* base; if (!(base = (const char*) arch.map(ErrMsg))) Modified: llvm/trunk/lib/Support/FileUtilities.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Support/FileUtilities.cpp?rev=49022&r1=49021&r2=49022&view=diff ============================================================================== --- llvm/trunk/lib/Support/FileUtilities.cpp (original) +++ llvm/trunk/lib/Support/FileUtilities.cpp Mon Mar 31 22:10:22 2008 @@ -192,10 +192,10 @@ // Now its safe to mmap the files into memory becasue both files // have a non-zero size. sys::MappedFile F1; - if (F1.open(FileA, sys::MappedFile::READ_ACCESS, Error)) + if (F1.open(FileA, Error)) return 2; sys::MappedFile F2; - if (F2.open(FileB, sys::MappedFile::READ_ACCESS, Error)) + if (F2.open(FileB, Error)) return 2; if (!F1.map(Error)) return 2; Modified: llvm/trunk/lib/Support/MemoryBuffer.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Support/MemoryBuffer.cpp?rev=49022&r1=49021&r2=49022&view=diff ============================================================================== --- llvm/trunk/lib/Support/MemoryBuffer.cpp (original) +++ llvm/trunk/lib/Support/MemoryBuffer.cpp Mon Mar 31 22:10:22 2008 @@ -159,7 +159,7 @@ std::string *ErrStr) { // FIXME: This does an extra stat syscall to figure out the size, but we // already know the size! - bool Failure = File.open(Filename, sys::MappedFile::READ_ACCESS, ErrStr); + bool Failure = File.open(Filename, ErrStr); if (Failure) return true; if (!File.map(ErrStr)) Modified: llvm/trunk/lib/System/Unix/MappedFile.inc URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/System/Unix/MappedFile.inc?rev=49022&r1=49021&r2=49022&view=diff ============================================================================== --- llvm/trunk/lib/System/Unix/MappedFile.inc (original) +++ llvm/trunk/lib/System/Unix/MappedFile.inc Mon Mar 31 22:10:22 2008 @@ -1,4 +1,4 @@ -//===- Unix/MappedFile.cpp - Unix MappedFile Implementation -----*- C++ -*-===// +//===- Unix/MappedFile.inc - Unix MappedFile Implementation -----*- C++ -*-===// // // The LLVM Compiler Infrastructure // @@ -11,11 +11,6 @@ // //===----------------------------------------------------------------------===// -//===----------------------------------------------------------------------===// -//=== WARNING: Implementation here must contain only generic UNIX code that -//=== is guaranteed to work on *all* UNIX variants. -//===----------------------------------------------------------------------===// - #include "Unix.h" #include "llvm/System/Process.h" @@ -44,16 +39,7 @@ } bool MappedFile::initialize(std::string* ErrMsg) { - int mode = 0; - if (Options & READ_ACCESS) - if (Options & WRITE_ACCESS) - mode = O_RDWR; - else - mode = O_RDONLY; - else if (Options & WRITE_ACCESS) - mode = O_WRONLY; - - int FD = ::open(Path.c_str(), mode); + int FD = ::open(Path.c_str(), O_RDONLY); if (FD < 0) { MakeErrMsg(ErrMsg, "can't open file '" + Path.toString() + "'"); return true; @@ -80,8 +66,6 @@ assert(MapInfo && "MappedFile not initialized"); if (!isMapped()) return; - if (Options & WRITE_ACCESS) - ::msync(BasePtr, MapInfo->Size, MS_SYNC); ::munmap(BasePtr, MapInfo->Size); BasePtr = 0; // Mark this as non-mapped. } @@ -90,28 +74,13 @@ assert(MapInfo && "MappedFile not initialized"); if (isMapped()) return BasePtr; - int prot = PROT_NONE; - int flags = 0; + int prot = PROT_READ; + int flags = MAP_PRIVATE; #ifdef MAP_FILE flags |= MAP_FILE; #endif - if (Options == 0) { - prot = PROT_READ; - flags = MAP_PRIVATE; - } else { - if (Options & READ_ACCESS) - prot |= PROT_READ; - if (Options & WRITE_ACCESS) - prot |= PROT_WRITE; - if (Options & EXEC_ACCESS) - prot |= PROT_EXEC; - if (Options & SHARED_MAPPING) - flags |= MAP_SHARED; - else - flags |= MAP_PRIVATE; - } - size_t map_size = ((MapInfo->Size / Process::GetPageSize())+1) * - Process::GetPageSize(); + size_t PageSize = Process::GetPageSize(); + size_t map_size = ((MapInfo->Size / PageSize)+1) * PageSize; BasePtr = ::mmap(0, map_size, prot, flags, MapInfo->FD, 0); if (BasePtr == MAP_FAILED) { @@ -126,30 +95,3 @@ return MapInfo->Size; } -bool MappedFile::resize(size_t new_size, std::string* ErrMsg) { - assert(MapInfo && "MappedFile not initialized"); - - // Take the mapping out of memory - unmap(); - - // Adjust the current size to a page boundary - size_t cur_size = ((MapInfo->Size / Process::GetPageSize())+1) * - Process::GetPageSize(); - - // Adjust the new_size to a page boundary - new_size = ((new_size / Process::GetPageSize())+1) * - Process::GetPageSize(); - - // If the file needs to be extended - if (new_size > cur_size) { - // Ensure we can allocate at least the idodes necessary to handle the - // file size requested. - if ((off_t)-1 == ::lseek(MapInfo->FD, new_size, SEEK_SET)) - return MakeErrMsg(ErrMsg, "Can't lseek: "); - if (-1 == ::write(MapInfo->FD, "\0", 1)) - return MakeErrMsg(ErrMsg, "Can't write: "); - } - - // Put the mapping back into memory. - return map(ErrMsg); -} Modified: llvm/trunk/lib/System/Win32/MappedFile.inc URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/System/Win32/MappedFile.inc?rev=49022&r1=49021&r2=49022&view=diff ============================================================================== --- llvm/trunk/lib/System/Win32/MappedFile.inc (original) +++ llvm/trunk/lib/System/Win32/MappedFile.inc Mon Mar 31 22:10:22 2008 @@ -33,17 +33,13 @@ MapInfo->hFile = INVALID_HANDLE_VALUE; MapInfo->hMapping = NULL; - DWORD mode = Options & WRITE_ACCESS ? GENERIC_WRITE : GENERIC_READ; - DWORD disposition = Options & WRITE_ACCESS ? OPEN_ALWAYS : OPEN_EXISTING; - DWORD share = Options & WRITE_ACCESS ? FILE_SHARE_WRITE : FILE_SHARE_READ; - share = Options & SHARED_MAPPING ? share : 0; - MapInfo->hFile = CreateFile(Path.c_str(), mode, share, NULL, disposition, - FILE_ATTRIBUTE_NORMAL, NULL); + MapInfo->hFile = CreateFile(Path.c_str(), GENERIC_READ, 0, NULL, + OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); if (MapInfo->hFile == INVALID_HANDLE_VALUE) { delete MapInfo; MapInfo = NULL; return MakeErrMsg(ErrMsg, - std::string("Can't open file: ") + Path.toString()); + std::string("Can't open file: ") + Path.toString()); } LARGE_INTEGER size; @@ -81,19 +77,14 @@ void* MappedFile::map(std::string* ErrMsg) { if (!isMapped()) { - DWORD prot = PAGE_READONLY; - if (Options & EXEC_ACCESS) - prot = SEC_IMAGE; - else if (Options & WRITE_ACCESS) - prot = PAGE_READWRITE; - MapInfo->hMapping = CreateFileMapping(MapInfo->hFile, NULL, prot, 0, 0, NULL); + MapInfo->hMapping = CreateFileMapping(MapInfo->hFile, NULL, PAGE_READONLY, + 0, 0, NULL); if (MapInfo->hMapping == NULL) { MakeErrMsg(ErrMsg, std::string("Can't map file: ") + Path.toString()); return 0; } - prot = (Options & WRITE_ACCESS) ? FILE_MAP_WRITE : FILE_MAP_READ; - BasePtr = MapViewOfFileEx(MapInfo->hMapping, prot, 0, 0, 0, NULL); + BasePtr = MapViewOfFileEx(MapInfo->hMapping, FILE_MAP_READ, 0, 0, 0, NULL); if (BasePtr == NULL) { CloseHandle(MapInfo->hMapping); MapInfo->hMapping = NULL; @@ -109,32 +100,5 @@ return MapInfo->size; } -bool MappedFile::resize(size_t new_size, std::string* ErrMsg) { - assert(MapInfo && "MappedFile not initialized"); - - // Take the mapping out of memory. - unmap(); - - // Adjust the new_size to a page boundary. - size_t pagesizem1 = Process::GetPageSize() - 1; - new_size = (new_size + pagesizem1) & ~pagesizem1; - - // If the file needs to be extended, do so. - if (new_size > MapInfo->size) { - LARGE_INTEGER eof; - eof.QuadPart = new_size; - if (!SetFilePointerEx(MapInfo->hFile, eof, NULL, FILE_BEGIN)) - return MakeErrMsg(ErrMsg, - std::string("Can't set end of file: ") + Path.toString()); - if (!SetEndOfFile(MapInfo->hFile)) - return MakeErrMsg(ErrMsg, - std::string("Can't set end of file: ") + Path.toString()); - MapInfo->size = new_size; - } - - // Remap the file. - return map(ErrMsg); -} - } From sabre at nondot.org Mon Mar 31 22:20:31 2008 From: sabre at nondot.org (Chris Lattner) Date: Tue, 01 Apr 2008 03:20:31 -0000 Subject: [llvm-commits] [llvm] r49023 - /llvm/trunk/include/llvm/System/Path.h Message-ID: <200804010320.m313KWLe012852@zion.cs.uiuc.edu> Author: lattner Date: Mon Mar 31 22:20:31 2008 New Revision: 49023 URL: http://llvm.org/viewvc/llvm-project?rev=49023&view=rev Log: add an accessor. Modified: llvm/trunk/include/llvm/System/Path.h Modified: llvm/trunk/include/llvm/System/Path.h URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/System/Path.h?rev=49023&r1=49022&r2=49023&view=diff ============================================================================== --- llvm/trunk/include/llvm/System/Path.h (original) +++ llvm/trunk/include/llvm/System/Path.h Mon Mar 31 22:20:31 2008 @@ -282,6 +282,9 @@ /// @returns a 'C' string containing the path name. /// @brief Returns the path as a C string. const char *c_str() const { return path.c_str(); } + + /// size - Return the length in bytes of this path name. + unsigned size() const { return path.size(); } /// @} /// @name Disk Accessors From dalej at apple.com Mon Mar 31 22:26:49 2008 From: dalej at apple.com (Dale Johannesen) Date: Mon, 31 Mar 2008 20:26:49 -0700 Subject: [llvm-commits] [test-suite] r49007 - /test-suite/trunk/Makefile.programs In-Reply-To: <0A746DAE-0596-40D7-AD29-27BBC69652FE@apple.com> References: <200803312343.m2VNh9XS005622@zion.cs.uiuc.edu> <0A746DAE-0596-40D7-AD29-27BBC69652FE@apple.com> Message-ID: On Mar 31, 2008, at 7:43 PM, Chris Lattner wrote: > On Mar 31, 2008, at 4:43 PM, Dale Johannesen wrote: > >> Author: johannes >> Date: Mon Mar 31 18:43:08 2008 >> New Revision: 49007 >> >> URL: http://llvm.org/viewvc/llvm-project?rev=49007&view=rev >> Log: >> Remove -enable-eh; it is no longer required. > > Shouldn't these lines actually be removed? It seems strange to have > them commented out like this. Eventually, yes, I was going to give it a couple days to settle down. > I'd think something like: > > # PPC and X86 support DWARF EH by default always. > ifneq ($(ARCH),PowerPC) > ifneq ($(ARCH),x86) >> LLCFLAGS += -enable-correct-eh-support >> LLVMLD_FLAGS += -disable-inlining > .. > endif > endif > > would work. > > -Chris > >> >> Modified: >> test-suite/trunk/Makefile.programs >> >> Modified: test-suite/trunk/Makefile.programs >> URL: http://llvm.org/viewvc/llvm-project/test-suite/trunk/Makefile.programs?rev=49007&r1=49006&r2=49007&view=diff >> >> = >> = >> = >> = >> = >> = >> = >> = >> = >> ===================================================================== >> --- test-suite/trunk/Makefile.programs (original) >> +++ test-suite/trunk/Makefile.programs Mon Mar 31 18:43:08 2008 >> @@ -321,11 +321,12 @@ >> # expensive) support for it. >> ifdef REQUIRES_EH_SUPPORT >> # PPC and X86 support DWARF exceptions, for everything else, default >> to SJLJ >> +# -enable-eh is no longer required to get DWARF exceptions. >> ifeq ($(ARCH),PowerPC) >> -LLCFLAGS += -enable-eh >> +#LLCFLAGS += -enable-eh >> else >> ifeq ($(ARCH),x86) >> -LLCFLAGS += -enable-eh >> +#LLCFLAGS += -enable-eh >> else >> LLCFLAGS += -enable-correct-eh-support >> LLVMLD_FLAGS += -disable-inlining >> >> >> _______________________________________________ >> llvm-commits mailing list >> llvm-commits at cs.uiuc.edu >> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits > > _______________________________________________ > llvm-commits mailing list > llvm-commits at cs.uiuc.edu > http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits From dalej at apple.com Mon Mar 31 22:29:11 2008 From: dalej at apple.com (Dale Johannesen) Date: Mon, 31 Mar 2008 20:29:11 -0700 Subject: [llvm-commits] [llvm-gcc-4.2] r49015 - in /llvm-gcc-4.2/trunk/gcc: config/i386/llvm-i386-target.h llvm-abi.h In-Reply-To: <200804010202.m3122jvQ010566@zion.cs.uiuc.edu> References: <200804010202.m3122jvQ010566@zion.cs.uiuc.edu> Message-ID: <9E26F41C-9E87-43D2-AD13-5A485AA4D103@apple.com> On Mar 31, 2008, at 7:02 PM, Devang Patel wrote: > Author: dpatel > Date: Mon Mar 31 21:02:44 2008 > New Revision: 49015 > > URL: http://llvm.org/viewvc/llvm-project?rev=49015&view=rev > Log: > s/LLVM_SHOULD_RETURN_STRUCT_AS_SCALAR/ > LLVM_SHOULD_RETURN_SELT_STRUCT_AS_SCALAR/g I don't like this one. Structs that are returned as scalars are not, in fact, always single-element. > Modified: > llvm-gcc-4.2/trunk/gcc/config/i386/llvm-i386-target.h > llvm-gcc-4.2/trunk/gcc/llvm-abi.h > > Modified: llvm-gcc-4.2/trunk/gcc/config/i386/llvm-i386-target.h > URL: http://llvm.org/viewvc/llvm-project/llvm-gcc-4.2/trunk/gcc/config/i386/llvm-i386-target.h?rev=49015&r1=49014&r2=49015&view=diff > > = > = > = > = > = > = > = > = > ====================================================================== > --- llvm-gcc-4.2/trunk/gcc/config/i386/llvm-i386-target.h (original) > +++ llvm-gcc-4.2/trunk/gcc/config/i386/llvm-i386-target.h Mon Mar 31 > 21:02:44 2008 > @@ -93,8 +93,8 @@ > > /* Structs containing a single data field plus zero-length fields are > considered as if they were the type of the data field. */ > -#ifndef LLVM_SHOULD_RETURN_STRUCT_AS_SCALAR > -#define LLVM_SHOULD_RETURN_STRUCT_AS_SCALAR(X) \ > +#ifndef LLVM_SHOULD_RETURN_SELT_STRUCT_AS_SCALAR > +#define LLVM_SHOULD_RETURN_SELT_STRUCT_AS_SCALAR(X) \ > isSingleElementStructOrArray(X, true, false) > #endif > > > Modified: llvm-gcc-4.2/trunk/gcc/llvm-abi.h > URL: http://llvm.org/viewvc/llvm-project/llvm-gcc-4.2/trunk/gcc/llvm-abi.h?rev=49015&r1=49014&r2=49015&view=diff > > = > = > = > = > = > = > = > = > ====================================================================== > --- llvm-gcc-4.2/trunk/gcc/llvm-abi.h (original) > +++ llvm-gcc-4.2/trunk/gcc/llvm-abi.h Mon Mar 31 21:02:44 2008 > @@ -205,13 +205,14 @@ > !isSingleElementStructOrArray(X, false, true) > #endif > > -// LLVM_SHOULD_RETURN_STRUCT_AS_SCALAR - Return a TYPE tree if this > struct > -// should be returned using the convention for that scalar TYPE, 0 > otherwise. > +// LLVM_SHOULD_RETURN_SELT_STRUCT_AS_SCALAR - Return a TYPE tree if > this single > +// element struct should be returned using the convention for that > scalar TYPE, > +// 0 otherwise. > // The returned TYPE must be the same size as X for this to work; > that is > // checked elsewhere. (Structs where this is not the case can be > constructed > // by abusing the __aligned__ attribute.) > -#ifndef LLVM_SHOULD_RETURN_STRUCT_AS_SCALAR > -#define LLVM_SHOULD_RETURN_STRUCT_AS_SCALAR(X) \ > +#ifndef LLVM_SHOULD_RETURN_SELT_STRUCT_AS_SCALAR > +#define LLVM_SHOULD_RETURN_SELT_STRUCT_AS_SCALAR(X) \ > isSingleElementStructOrArray(X, false, false) > #endif > > @@ -280,7 +281,7 @@ > && (!TARGET_64BIT || > TREE_INT_CST_LOW(TYPE_SIZE_UNIT(type))<=8) > #endif > ) { > - tree SingleElt = LLVM_SHOULD_RETURN_STRUCT_AS_SCALAR(type); > + tree SingleElt = > LLVM_SHOULD_RETURN_SELT_STRUCT_AS_SCALAR(type); > if (SingleElt && TYPE_SIZE(SingleElt) && > TREE_CODE(TYPE_SIZE(SingleElt)) == INTEGER_CST && > TREE_INT_CST_LOW(TYPE_SIZE_UNIT(type)) == > > > _______________________________________________ > llvm-commits mailing list > llvm-commits at cs.uiuc.edu > http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits From sabre at nondot.org Mon Mar 31 22:39:50 2008 From: sabre at nondot.org (Chris Lattner) Date: Tue, 01 Apr 2008 03:39:50 -0000 Subject: [llvm-commits] [llvm] r49024 - /llvm/trunk/lib/Support/FileUtilities.cpp Message-ID: <200804010339.m313doHq013414@zion.cs.uiuc.edu> Author: lattner Date: Mon Mar 31 22:39:49 2008 New Revision: 49024 URL: http://llvm.org/viewvc/llvm-project?rev=49024&view=rev Log: Change DiffFilesWithTolerance to be written in terms of MemoryBuffer, not an mmapped file. This more closely matches its requirements and provides an implicitly null terminated buffer, something this routine had to emulate itself before. Modified: llvm/trunk/lib/Support/FileUtilities.cpp Modified: llvm/trunk/lib/Support/FileUtilities.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Support/FileUtilities.cpp?rev=49024&r1=49023&r2=49024&view=diff ============================================================================== --- llvm/trunk/lib/Support/FileUtilities.cpp (original) +++ llvm/trunk/lib/Support/FileUtilities.cpp Mon Mar 31 22:39:49 2008 @@ -14,7 +14,9 @@ #include "llvm/Support/FileUtilities.h" #include "llvm/System/Path.h" -#include "llvm/System/MappedFile.h" +#include "llvm/Support/MemoryBuffer.h" +#include "llvm/ADT/OwningPtr.h" +#include "llvm/ADT/SmallString.h" #include "llvm/ADT/StringExtras.h" #include #include @@ -44,7 +46,7 @@ } } -static char *BackupNumber(char *Pos, char *FirstChar) { +static const char *BackupNumber(const char *Pos, const char *FirstChar) { // If we didn't stop in the middle of a number, don't backup. if (!isNumberChar(*Pos)) return Pos; @@ -57,11 +59,21 @@ return Pos; } +/// EndOfNumber - Return the first character that is not part of the specified +/// number. This assumes that the buffer is null terminated, so it won't fall +/// off the end. +static const char *EndOfNumber(const char *Pos) { + while (isNumberChar(*Pos)) + ++Pos; + return Pos; +} + /// CompareNumbers - compare two numbers, returning true if they are different. -static bool CompareNumbers(char *&F1P, char *&F2P, char *F1End, char *F2End, +static bool CompareNumbers(const char *&F1P, const char *&F2P, + const char *F1End, const char *F2End, double AbsTolerance, double RelTolerance, std::string *ErrorMsg) { - char *F1NumEnd, *F2NumEnd; + const char *F1NumEnd, *F2NumEnd; double V1 = 0.0, V2 = 0.0; // If one of the positions is at a space and the other isn't, chomp up 'til @@ -71,30 +83,35 @@ while (isspace(*F2P) && F2P != F2End) ++F2P; - // If we stop on numbers, compare their difference. Note that some ugliness - // is built into this to permit support for numbers that use "D" or "d" as - // their exponential marker, e.g. "1.234D45". This occurs in 200.sixtrack in - // spec2k. - if (isNumberChar(*F1P) && isNumberChar(*F2P)) { - bool isDNotation; - do { - isDNotation = false; - V1 = strtod(F1P, &F1NumEnd); - V2 = strtod(F2P, &F2NumEnd); - - if (*F1NumEnd == 'D' || *F1NumEnd == 'd') { - *F1NumEnd = 'e'; // Strange exponential notation! - isDNotation = true; - } - if (*F2NumEnd == 'D' || *F2NumEnd == 'd') { - *F2NumEnd = 'e'; // Strange exponential notation! - isDNotation = true; - } - } while (isDNotation); - } else { - // Otherwise, the diff failed. + // If we stop on numbers, compare their difference. + if (!isNumberChar(*F1P) || !isNumberChar(*F2P)) { + // The diff failed. F1NumEnd = F1P; F2NumEnd = F2P; + } else { + // Note that some ugliness is built into this to permit support for numbers + // that use "D" or "d" as their exponential marker, e.g. "1.234D45". This + // occurs in 200.sixtrack in spec2k. + V1 = strtod(F1P, const_cast(&F1NumEnd)); + V2 = strtod(F2P, const_cast(&F2NumEnd)); + + if (*F1NumEnd == 'D' || *F1NumEnd == 'd') { + // Copy string into tmp buffer to replace the 'D' with an 'e'. + SmallString<200> StrTmp(F1P, EndOfNumber(F1NumEnd)+1); + StrTmp[F1NumEnd-F1P] = 'e'; // Strange exponential notation! + + V1 = strtod(&StrTmp[0], const_cast(&F1NumEnd)); + F1NumEnd = F1P + (F1NumEnd-&StrTmp[0]); + } + + if (*F2NumEnd == 'D' || *F2NumEnd == 'd') { + // Copy string into tmp buffer to replace the 'D' with an 'e'. + SmallString<200> StrTmp(F2P, EndOfNumber(F2NumEnd)+1); + StrTmp[F2NumEnd-F2P] = 'e'; // Strange exponential notation! + + V2 = strtod(&StrTmp[0], const_cast(&F2NumEnd)); + F2NumEnd = F2P + (F2NumEnd-&StrTmp[0]); + } } if (F1NumEnd == F1P || F2NumEnd == F2P) { @@ -135,25 +152,6 @@ return false; } -// PadFileIfNeeded - If the files are not identical, we will have to be doing -// numeric comparisons in here. There are bad cases involved where we (i.e., -// strtod) might run off the beginning or end of the file if it starts or ends -// with a number. Because of this, if needed, we pad the file so that it starts -// and ends with a null character. -static void PadFileIfNeeded(char *&FileStart, char *&FileEnd, char *&FP) { - if (FileStart-FileEnd < 2 || - isNumberChar(FileStart[0]) || isNumberChar(FileEnd[-1])) { - unsigned FileLen = FileEnd-FileStart; - char *NewFile = new char[FileLen+2]; - NewFile[0] = 0; // Add null padding - NewFile[FileLen+1] = 0; // Add null padding - memcpy(NewFile+1, FileStart, FileLen); - FP = NewFile+(FP-FileStart)+1; - FileStart = NewFile+1; - FileEnd = FileStart+FileLen; - } -} - /// DiffFilesWithTolerance - Compare the two files specified, returning 0 if the /// files match, 1 if they are different, and 2 if there is a file error. This /// function differs from DiffFiles in that you can specify an absolete and @@ -191,27 +189,23 @@ // Now its safe to mmap the files into memory becasue both files // have a non-zero size. - sys::MappedFile F1; - if (F1.open(FileA, Error)) - return 2; - sys::MappedFile F2; - if (F2.open(FileB, Error)) - return 2; - if (!F1.map(Error)) + OwningPtr F1(MemoryBuffer::getFile(FileA.c_str(), FileA.size(), + Error)); + OwningPtr F2(MemoryBuffer::getFile(FileB.c_str(), FileB.size(), + Error)); + if (F1 == 0 || F2 == 0) return 2; - if (!F2.map(Error)) - return 2; - + // Okay, now that we opened the files, scan them for the first difference. - char *File1Start = F1.charBase(); - char *File2Start = F2.charBase(); - char *File1End = File1Start+A_size; - char *File2End = File2Start+B_size; - char *F1P = File1Start; - char *F2P = File2Start; + const char *File1Start = F1->getBufferStart(); + const char *File2Start = F2->getBufferStart(); + const char *File1End = F1->getBufferEnd(); + const char *File2End = F2->getBufferEnd(); + const char *F1P = File1Start; + const char *F2P = File2Start; if (A_size == B_size) { - // Are the buffers identical? + // Are the buffers identical? Common case: Handle this efficiently. if (std::memcmp(File1Start, File2Start, A_size) == 0) return 0; @@ -222,13 +216,6 @@ } } - char *OrigFile1Start = File1Start; - char *OrigFile2Start = File2Start; - - // If the files need padding, do so now. - PadFileIfNeeded(File1Start, File1End, F1P); - PadFileIfNeeded(File2Start, File2End, F2P); - bool CompareFailed = false; while (1) { // Scan for the end of file or next difference. @@ -272,9 +259,5 @@ CompareFailed = true; } - if (OrigFile1Start != File1Start) - delete[] (File1Start-1); // Back up past null byte - if (OrigFile2Start != File2Start) - delete[] (File2Start-1); // Back up past null byte return CompareFailed; } From sabre at nondot.org Mon Mar 31 22:40:54 2008 From: sabre at nondot.org (Chris Lattner) Date: Tue, 01 Apr 2008 03:40:54 -0000 Subject: [llvm-commits] [llvm] r49025 - in /llvm/trunk: include/llvm/System/MappedFile.h lib/Debugger/SourceFile.cpp lib/Support/MemoryBuffer.cpp Message-ID: <200804010340.m313escO013458@zion.cs.uiuc.edu> Author: lattner Date: Mon Mar 31 22:40:53 2008 New Revision: 49025 URL: http://llvm.org/viewvc/llvm-project?rev=49025&view=rev Log: Remove the MappedFile::charBase member, rename base -> getBase() and make getBase() return a const-correct pointer. Modified: llvm/trunk/include/llvm/System/MappedFile.h llvm/trunk/lib/Debugger/SourceFile.cpp llvm/trunk/lib/Support/MemoryBuffer.cpp Modified: llvm/trunk/include/llvm/System/MappedFile.h URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/System/MappedFile.h?rev=49025&r1=49024&r2=49025&view=diff ============================================================================== --- llvm/trunk/include/llvm/System/MappedFile.h (original) +++ llvm/trunk/include/llvm/System/MappedFile.h Mon Mar 31 22:40:53 2008 @@ -25,7 +25,7 @@ /// This class provides an abstraction for a memory mapped file in the /// operating system's filesystem. It provides platform independent operations - /// for mapping a file into memory for both read access. + /// for mapping a file into memory for read access. class MappedFile { sys::PathWithStatus Path; ///< Path to the file. void *BasePtr; ///< Pointer to the base memory address @@ -44,19 +44,9 @@ /// This function determines if the file is currently mapped or not. bool isMapped() const { return BasePtr != 0; } - /// This function returns a void* pointer to the base address of the file + /// getBase - Returns a const void* pointer to the base address of the file /// mapping. This is the memory address of the first byte in the file. - /// Note that although a non-const pointer is returned, the memory might - /// not actually be writable, depending on the MappingOptions used when - /// the MappedFile was opened. - void* base() const { return BasePtr; } - - /// This function returns a char* pointer to the base address of the file - /// mapping. This is the memory address of the first byte in the file. - /// Note that although a non-const pointer is returned, the memory might - /// not actually be writable, depending on the MappingOptions used when - /// the MappedFile was opened. - char* charBase() const { return reinterpret_cast(BasePtr); } + const void *getBase() const { return BasePtr; } /// This function returns a reference to the sys::Path object kept by the /// MappedFile object. This contains the path to the file that is or Modified: llvm/trunk/lib/Debugger/SourceFile.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Debugger/SourceFile.cpp?rev=49025&r1=49024&r2=49025&view=diff ============================================================================== --- llvm/trunk/lib/Debugger/SourceFile.cpp (original) +++ llvm/trunk/lib/Debugger/SourceFile.cpp Mon Mar 31 22:40:53 2008 @@ -28,7 +28,7 @@ /// void SourceFile::calculateLineOffsets() const { assert(LineOffset.empty() && "Line offsets already computed!"); - const char *BufPtr = File.charBase(); + const char *BufPtr = (const char *)File.getBase(); const char *FileStart = BufPtr; const char *FileEnd = FileStart + File.size(); do { @@ -61,12 +61,12 @@ if (LineNo >= LineOffset.size()) return; // Otherwise, they are asking for a valid line, which we can fulfill. - LineStart = File.charBase()+LineOffset[LineNo]; + LineStart = (const char *)File.getBase()+LineOffset[LineNo]; if (LineNo+1 < LineOffset.size()) - LineEnd = File.charBase()+LineOffset[LineNo+1]; + LineEnd = (const char *)File.getBase()+LineOffset[LineNo+1]; else - LineEnd = File.charBase() + File.size(); + LineEnd = (const char *)File.getBase() + File.size(); // If the line ended with a newline, strip it off. while (LineEnd != LineStart && (LineEnd[-1] == '\n' || LineEnd[-1] == '\r')) Modified: llvm/trunk/lib/Support/MemoryBuffer.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Support/MemoryBuffer.cpp?rev=49025&r1=49024&r2=49025&view=diff ============================================================================== --- llvm/trunk/lib/Support/MemoryBuffer.cpp (original) +++ llvm/trunk/lib/Support/MemoryBuffer.cpp Mon Mar 31 22:40:53 2008 @@ -173,11 +173,12 @@ // If this file is not an exact multiple of the system page size (common // case), then the OS has zero terminated the buffer for us. - if ((Size & (PageSize-1))) { - init(File.charBase(), File.charBase()+Size); + const char *FileBase = static_cast(File.getBase()); + if ((Size & (PageSize-1)) != 0) { + init(FileBase, FileBase+Size); } else { // Otherwise, we allocate a new memory buffer and copy the data over - initCopyOf(File.charBase(), File.charBase()+Size); + initCopyOf(FileBase, FileBase+Size); // No need to keep the file mapped any longer. File.unmap(); From clattner at apple.com Mon Mar 31 22:44:58 2008 From: clattner at apple.com (Chris Lattner) Date: Mon, 31 Mar 2008 20:44:58 -0700 Subject: [llvm-commits] [test-suite] r49007 - /test-suite/trunk/Makefile.programs In-Reply-To: References: <200803312343.m2VNh9XS005622@zion.cs.uiuc.edu> <0A746DAE-0596-40D7-AD29-27BBC69652FE@apple.com> Message-ID: <8D705B1F-293E-44AF-9295-2B71B9BEDAFD@apple.com> >> >> Shouldn't these lines actually be removed? It seems strange to have >> them commented out like this. > > Eventually, yes, I was going to give it a couple days to settle down. Ok! Thanks Dale, -Chris From sabre at nondot.org Mon Mar 31 22:49:39 2008 From: sabre at nondot.org (Chris Lattner) Date: Tue, 01 Apr 2008 03:49:39 -0000 Subject: [llvm-commits] [llvm] r49026 - in /llvm/trunk: include/llvm/System/MappedFile.h lib/System/Unix/MappedFile.inc lib/System/Win32/MappedFile.inc Message-ID: <200804010349.m313ndtq013739@zion.cs.uiuc.edu> Author: lattner Date: Mon Mar 31 22:49:38 2008 New Revision: 49026 URL: http://llvm.org/viewvc/llvm-project?rev=49026&view=rev Log: Make MappedFile::map return a const correct pointer, don't leak address space on Unix platforms. Modified: llvm/trunk/include/llvm/System/MappedFile.h llvm/trunk/lib/System/Unix/MappedFile.inc llvm/trunk/lib/System/Win32/MappedFile.inc Modified: llvm/trunk/include/llvm/System/MappedFile.h URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/System/MappedFile.h?rev=49026&r1=49025&r2=49026&view=diff ============================================================================== --- llvm/trunk/include/llvm/System/MappedFile.h (original) +++ llvm/trunk/include/llvm/System/MappedFile.h Mon Mar 31 22:49:38 2008 @@ -65,15 +65,13 @@ return initialize(ErrMsg); } - /// unmap - Remove the mapped file from memory. If the file was mapped for - /// write access, the memory contents will be automatically synchronized - /// with the file's disk contents. + /// unmap - Remove the mapped file from memory. void unmap(); /// map - Reserve space for the file, map it into memory, and return a /// pointer to it. This returns the base memory address of the mapped file /// or 0 if an error occurred. - void *map(std::string* ErrMsg = 0); + const void *map(std::string* ErrMsg = 0); void close() { if (MapInfo) terminate(); } Modified: llvm/trunk/lib/System/Unix/MappedFile.inc URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/System/Unix/MappedFile.inc?rev=49026&r1=49025&r2=49026&view=diff ============================================================================== --- llvm/trunk/lib/System/Unix/MappedFile.inc (original) +++ llvm/trunk/lib/System/Unix/MappedFile.inc Mon Mar 31 22:49:38 2008 @@ -56,6 +56,7 @@ } void MappedFile::terminate() { + unmap(); assert(MapInfo && "MappedFile not initialized"); ::close(MapInfo->FD); delete MapInfo; @@ -70,7 +71,7 @@ BasePtr = 0; // Mark this as non-mapped. } -void* MappedFile::map(std::string* ErrMsg) { +const void* MappedFile::map(std::string* ErrMsg) { assert(MapInfo && "MappedFile not initialized"); if (isMapped()) return BasePtr; Modified: llvm/trunk/lib/System/Win32/MappedFile.inc URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/System/Win32/MappedFile.inc?rev=49026&r1=49025&r2=49026&view=diff ============================================================================== --- llvm/trunk/lib/System/Win32/MappedFile.inc (original) +++ llvm/trunk/lib/System/Win32/MappedFile.inc Mon Mar 31 22:49:38 2008 @@ -75,7 +75,7 @@ } } -void* MappedFile::map(std::string* ErrMsg) { +const void* MappedFile::map(std::string* ErrMsg) { if (!isMapped()) { MapInfo->hMapping = CreateFileMapping(MapInfo->hFile, NULL, PAGE_READONLY, 0, 0, NULL); From sabre at nondot.org Mon Mar 31 22:59:34 2008 From: sabre at nondot.org (Chris Lattner) Date: Tue, 01 Apr 2008 03:59:34 -0000 Subject: [llvm-commits] [llvm] r49027 - in /llvm/trunk: include/llvm/Debugger/SourceFile.h lib/Debugger/SourceFile.cpp Message-ID: <200804010359.m313xYYh013993@zion.cs.uiuc.edu> Author: lattner Date: Mon Mar 31 22:59:34 2008 New Revision: 49027 URL: http://llvm.org/viewvc/llvm-project?rev=49027&view=rev Log: rewrite SourceFile to be in terms of MemoryBuffer, not MappedFile. Modified: llvm/trunk/include/llvm/Debugger/SourceFile.h llvm/trunk/lib/Debugger/SourceFile.cpp Modified: llvm/trunk/include/llvm/Debugger/SourceFile.h URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Debugger/SourceFile.h?rev=49027&r1=49026&r2=49027&view=diff ============================================================================== --- llvm/trunk/include/llvm/Debugger/SourceFile.h (original) +++ llvm/trunk/include/llvm/Debugger/SourceFile.h Mon Mar 31 22:59:34 2008 @@ -17,11 +17,12 @@ #define LLVM_DEBUGGER_SOURCEFILE_H #include "llvm/System/Path.h" -#include "llvm/System/MappedFile.h" +#include "llvm/ADT/OwningPtr.h" #include namespace llvm { class GlobalVariable; + class MemoryBuffer; class SourceFile { /// Filename - This is the full path of the file that is loaded. @@ -35,7 +36,7 @@ const GlobalVariable *Descriptor; /// This is the memory mapping for the file so we can gain access to it. - sys::MappedFile File; + OwningPtr File; /// LineOffset - This vector contains a mapping from source line numbers to /// their offsets in the file. This data is computed lazily, the first time @@ -49,16 +50,9 @@ /// NOT throw an exception if the file is not found, if there is an error /// reading it, or if the user cancels the operation. Instead, it will just /// be an empty source file. - SourceFile(const std::string &fn, const GlobalVariable *Desc) - : Filename(fn), Descriptor(Desc), File() { - std::string ErrMsg; - if (File.open(Filename, &ErrMsg)) - throw ErrMsg; - readFile(); - } - ~SourceFile() { - File.unmap(); - } + SourceFile(const std::string &fn, const GlobalVariable *Desc); + + ~SourceFile(); /// getDescriptor - Return the debugging decriptor for this source file. /// @@ -84,10 +78,6 @@ } private: - /// readFile - Load Filename into memory - /// - void readFile(); - /// calculateLineOffsets - Compute the LineOffset vector for the current /// file. void calculateLineOffsets() const; Modified: llvm/trunk/lib/Debugger/SourceFile.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Debugger/SourceFile.cpp?rev=49027&r1=49026&r2=49027&view=diff ============================================================================== --- llvm/trunk/lib/Debugger/SourceFile.cpp (original) +++ llvm/trunk/lib/Debugger/SourceFile.cpp Mon Mar 31 22:59:34 2008 @@ -12,25 +12,32 @@ //===----------------------------------------------------------------------===// #include "llvm/Debugger/SourceFile.h" +#include "llvm/Support/MemoryBuffer.h" #include - using namespace llvm; -/// readFile - Load Filename -/// -void SourceFile::readFile() { - std::string ErrMsg; - if (!File.map(&ErrMsg)) - throw ErrMsg; +static const char EmptyFile = 0; + +SourceFile::SourceFile(const std::string &fn, const GlobalVariable *Desc) + : Filename(fn), Descriptor(Desc) { + File.reset(MemoryBuffer::getFileOrSTDIN(fn)); + + // On error, return an empty buffer. + if (File == 0) + File.reset(MemoryBuffer::getMemBuffer(&EmptyFile, &EmptyFile)); } +SourceFile::~SourceFile() { +} + + /// calculateLineOffsets - Compute the LineOffset vector for the current file. /// void SourceFile::calculateLineOffsets() const { assert(LineOffset.empty() && "Line offsets already computed!"); - const char *BufPtr = (const char *)File.getBase(); + const char *BufPtr = File->getBufferStart(); const char *FileStart = BufPtr; - const char *FileEnd = FileStart + File.size(); + const char *FileEnd = File->getBufferEnd(); do { LineOffset.push_back(BufPtr-FileStart); @@ -54,19 +61,18 @@ void SourceFile::getSourceLine(unsigned LineNo, const char *&LineStart, const char *&LineEnd) const { LineStart = LineEnd = 0; - if (!File.isMapped()) return; // Couldn't load file, return null pointers if (LineOffset.empty()) calculateLineOffsets(); // Asking for an out-of-range line number? if (LineNo >= LineOffset.size()) return; // Otherwise, they are asking for a valid line, which we can fulfill. - LineStart = (const char *)File.getBase()+LineOffset[LineNo]; + LineStart = File->getBufferStart()+LineOffset[LineNo]; if (LineNo+1 < LineOffset.size()) - LineEnd = (const char *)File.getBase()+LineOffset[LineNo+1]; + LineEnd = File->getBufferStart()+LineOffset[LineNo+1]; else - LineEnd = (const char *)File.getBase() + File.size(); + LineEnd = File->getBufferEnd(); // If the line ended with a newline, strip it off. while (LineEnd != LineStart && (LineEnd[-1] == '\n' || LineEnd[-1] == '\r')) From sabre at nondot.org Mon Mar 31 23:00:45 2008 From: sabre at nondot.org (Chris Lattner) Date: Tue, 01 Apr 2008 04:00:45 -0000 Subject: [llvm-commits] [llvm] r49028 - /llvm/trunk/include/llvm/LinkAllVMCore.h Message-ID: <200804010400.m3140jsi014037@zion.cs.uiuc.edu> Author: lattner Date: Mon Mar 31 23:00:45 2008 New Revision: 49028 URL: http://llvm.org/viewvc/llvm-project?rev=49028&view=rev Log: prune unneeded #includes Modified: llvm/trunk/include/llvm/LinkAllVMCore.h Modified: llvm/trunk/include/llvm/LinkAllVMCore.h URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/LinkAllVMCore.h?rev=49028&r1=49027&r2=49028&view=diff ============================================================================== --- llvm/trunk/include/llvm/LinkAllVMCore.h (original) +++ llvm/trunk/include/llvm/LinkAllVMCore.h Mon Mar 31 23:00:45 2008 @@ -16,8 +16,6 @@ #ifndef LLVM_LINKALLVMCORE_H #define LLVM_LINKALLVMCORE_H -#include "llvm/System/IncludeFile.h" - #include "llvm/Module.h" #include "llvm/Instructions.h" #include "llvm/IntrinsicInst.h" @@ -25,7 +23,6 @@ #include "llvm/Analysis/Verifier.h" #include "llvm/System/Alarm.h" #include "llvm/System/DynamicLibrary.h" -#include "llvm/System/MappedFile.h" #include "llvm/System/Memory.h" #include "llvm/System/Mutex.h" #include "llvm/System/Path.h" From idadesub at users.sourceforge.net Mon Mar 31 23:26:18 2008 From: idadesub at users.sourceforge.net (Erick Tryzelaar) Date: Mon, 31 Mar 2008 21:26:18 -0700 Subject: [llvm-commits] [PATCH] Setup ocamldoc to build on the website. Message-ID: <1207023978-5470-1-git-send-email-idadesub@users.sourceforge.net> This lets ocamldoc run without depending on llvm-config existing. It also changes it so that the .odoc files depend on the installed .cmi files instead of the ones in the build directory. I'm not yet sure if this is enough for the BUILD_FOR_WEBSITE though. --- bindings/ocaml/Makefile.ocaml | 6 +++++- 1 files changed, 5 insertions(+), 1 deletions(-) -------------- next part -------------- A non-text attachment was scrubbed... Name: 253a8b03de30f7532b6fb57854b5a094467ad685.diff Type: text/x-patch Size: 1294 bytes Desc: not available Url : http://lists.cs.uiuc.edu/pipermail/llvm-commits/attachments/20080331/dd998db3/attachment.bin From sabre at nondot.org Mon Mar 31 23:26:46 2008 From: sabre at nondot.org (Chris Lattner) Date: Tue, 01 Apr 2008 04:26:46 -0000 Subject: [llvm-commits] [llvm] r49029 - in /llvm/trunk: include/llvm/Bitcode/Archive.h lib/Archive/Archive.cpp lib/Archive/ArchiveReader.cpp lib/Archive/ArchiveWriter.cpp Message-ID: <200804010426.m314QkvF014806@zion.cs.uiuc.edu> Author: lattner Date: Mon Mar 31 23:26:46 2008 New Revision: 49029 URL: http://llvm.org/viewvc/llvm-project?rev=49029&view=rev Log: change the archive stuff to use MemoryBuffer instead of mappedfile. MemoryBuffer is higher level and more closely matches the model needed. Modified: llvm/trunk/include/llvm/Bitcode/Archive.h llvm/trunk/lib/Archive/Archive.cpp llvm/trunk/lib/Archive/ArchiveReader.cpp llvm/trunk/lib/Archive/ArchiveWriter.cpp Modified: llvm/trunk/include/llvm/Bitcode/Archive.h URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Bitcode/Archive.h?rev=49029&r1=49028&r2=49029&view=diff ============================================================================== --- llvm/trunk/include/llvm/Bitcode/Archive.h (original) +++ llvm/trunk/include/llvm/Bitcode/Archive.h Mon Mar 31 23:26:46 2008 @@ -24,7 +24,7 @@ #include namespace llvm { - namespace sys { class MappedFile; } + class MemoryBuffer; // Forward declare classes class ModuleProvider; // From VMCore @@ -534,7 +534,7 @@ protected: sys::Path archPath; ///< Path to the archive file we read/write MembersList members; ///< The ilist of ArchiveMember - sys::MappedFile* mapfile; ///< Raw Archive contents mapped into memory + MemoryBuffer *mapfile; ///< Raw Archive contents mapped into memory const char* base; ///< Base of the memory mapped file data SymTabType symTab; ///< The symbol table std::string strtab; ///< The string table for long file names Modified: llvm/trunk/lib/Archive/Archive.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Archive/Archive.cpp?rev=49029&r1=49028&r2=49029&view=diff ============================================================================== --- llvm/trunk/lib/Archive/Archive.cpp (original) +++ llvm/trunk/lib/Archive/Archive.cpp Mon Mar 31 23:26:46 2008 @@ -17,7 +17,6 @@ #include "llvm/ModuleProvider.h" #include "llvm/Module.h" #include "llvm/Support/MemoryBuffer.h" -#include "llvm/System/MappedFile.h" #include "llvm/System/Process.h" #include #include @@ -145,25 +144,19 @@ } bool -Archive::mapToMemory(std::string* ErrMsg) -{ - mapfile = new sys::MappedFile(); - if (mapfile->open(archPath, ErrMsg)) - return true; - if (!(base = (char*) mapfile->map(ErrMsg))) +Archive::mapToMemory(std::string* ErrMsg) { + mapfile = MemoryBuffer::getFile(archPath.c_str(), archPath.size(), ErrMsg); + if (mapfile == 0) return true; + base = mapfile->getBufferStart(); return false; } void Archive::cleanUpMemory() { // Shutdown the file mapping - if (mapfile) { - mapfile->close(); - delete mapfile; - - mapfile = 0; - base = 0; - } + delete mapfile; + mapfile = 0; + base = 0; // Forget the entire symbol table symTab.clear(); Modified: llvm/trunk/lib/Archive/ArchiveReader.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Archive/ArchiveReader.cpp?rev=49029&r1=49028&r2=49029&view=diff ============================================================================== --- llvm/trunk/lib/Archive/ArchiveReader.cpp (original) +++ llvm/trunk/lib/Archive/ArchiveReader.cpp Mon Mar 31 23:26:46 2008 @@ -14,7 +14,6 @@ #include "ArchiveInternals.h" #include "llvm/Bitcode/ReaderWriter.h" #include "llvm/Support/MemoryBuffer.h" -#include "llvm/System/MappedFile.h" #include "llvm/Module.h" #include using namespace llvm; @@ -239,7 +238,7 @@ bool Archive::checkSignature(std::string* error) { // Check the magic string at file's header - if (mapfile->size() < 8 || memcmp(base, ARFILE_MAGIC, 8)) { + if (mapfile->getBufferSize() < 8 || memcmp(base, ARFILE_MAGIC, 8)) { if (error) *error = "invalid signature for an archive file"; return false; @@ -257,7 +256,7 @@ members.clear(); symTab.clear(); const char *At = base; - const char *End = base + mapfile->size(); + const char *End = mapfile->getBufferEnd(); if (!checkSignature(error)) return false; @@ -370,7 +369,7 @@ members.clear(); symTab.clear(); const char *At = base; - const char *End = base + mapfile->size(); + const char *End = mapfile->getBufferEnd(); // Make sure we're dealing with an archive if (!checkSignature(ErrorMsg)) @@ -478,7 +477,8 @@ // Module hasn't been loaded yet, we need to load it const char* modptr = base + fileOffset; - ArchiveMember* mbr = parseMemberHeader(modptr, base + mapfile->size(),ErrMsg); + ArchiveMember* mbr = parseMemberHeader(modptr, mapfile->getBufferEnd(), + ErrMsg); if (!mbr) return 0; @@ -517,8 +517,8 @@ // below. // Get a pointer to the first file - const char* At = ((const char*)base) + firstFileOffset; - const char* End = ((const char*)base) + mapfile->size(); + const char* At = base + firstFileOffset; + const char* End = mapfile->getBufferEnd(); while ( At < End) { // Compute the offset to be put in the symbol table Modified: llvm/trunk/lib/Archive/ArchiveWriter.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Archive/ArchiveWriter.cpp?rev=49029&r1=49028&r2=49029&view=diff ============================================================================== --- llvm/trunk/lib/Archive/ArchiveWriter.cpp (original) +++ llvm/trunk/lib/Archive/ArchiveWriter.cpp Mon Mar 31 23:26:46 2008 @@ -13,7 +13,8 @@ #include "ArchiveInternals.h" #include "llvm/Bitcode/ReaderWriter.h" -#include "llvm/System/MappedFile.h" +#include "llvm/ADT/OwningPtr.h" +#include "llvm/Support/MemoryBuffer.h" #include "llvm/System/Signals.h" #include "llvm/System/Process.h" #include "llvm/ModuleProvider.h" @@ -208,15 +209,15 @@ // Get the data and its size either from the // member's in-memory data or directly from the file. size_t fSize = member.getSize(); - const char* data = (const char*)member.getData(); - sys::MappedFile* mFile = 0; + const char *data = (const char*)member.getData(); + MemoryBuffer *mFile = 0; if (!data) { - mFile = new sys::MappedFile(); - if (mFile->open(member.getPath(), ErrMsg)) + mFile = MemoryBuffer::getFile(member.getPath().c_str(), + member.getPath().size(), ErrMsg); + if (mFile == 0) return true; - if (!(data = (const char*) mFile->map(ErrMsg))) - return true; - fSize = mFile->size(); + data = mFile->getBufferStart(); + fSize = mFile->getBufferSize(); } // Now that we have the data in memory, update the @@ -247,10 +248,7 @@ // We don't need this module any more. delete MP; } else { - if (mFile != 0) { - mFile->close(); - delete mFile; - } + delete mFile; if (ErrMsg) *ErrMsg = "Can't parse bitcode member: " + member.getPath().toString() + ": " + *ErrMsg; @@ -281,10 +279,7 @@ ARFile << ARFILE_PAD; // Close the mapped file if it was opened - if (mFile != 0) { - mFile->close(); - delete mFile; - } + delete mFile; return false; } @@ -349,7 +344,7 @@ { // Make sure they haven't opened up the file, not loaded it, // but are now trying to write it which would wipe out the file. - if (members.empty() && mapfile && mapfile->size() > 8) { + if (members.empty() && mapfile && mapfile->getBufferSize() > 8) { if (ErrMsg) *ErrMsg = "Can't write an archive not opened for writing"; return true; @@ -408,18 +403,17 @@ // ensure compatibility with other archivers we need to put the symbol // table first in the file. Unfortunately, this means mapping the file // we just wrote back in and copying it to the destination file. + sys::Path FinalFilePath = archPath; // Map in the archive we just wrote. - sys::MappedFile arch; - if (arch.open(TmpArchive, ErrMsg)) - return true; - const char* base; - if (!(base = (const char*) arch.map(ErrMsg))) - return true; + { + OwningPtr arch(MemoryBuffer::getFile(TmpArchive.c_str(), + TmpArchive.size())); + if (arch == 0) return true; + const char* base = arch->getBufferStart(); // Open another temporary file in order to avoid invalidating the // mmapped data - sys::Path FinalFilePath = archPath; if (FinalFilePath.createTemporaryFileOnDisk(ErrMsg)) return true; sys::RemoveFileOnSignal(FinalFilePath); @@ -456,11 +450,11 @@ // Copy the temporary file contents being sure to skip the file's magic // number. FinalFile.write(base + sizeof(ARFILE_MAGIC)-1, - arch.size()-sizeof(ARFILE_MAGIC)+1); + arch->getBufferSize()-sizeof(ARFILE_MAGIC)+1); // Close up shop FinalFile.close(); - arch.close(); + } // free arch. // Move the final file over top of TmpArchive if (FinalFilePath.renamePathOnDisk(TmpArchive, ErrMsg)) From nicholas at mxc.ca Tue Apr 1 00:19:03 2008 From: nicholas at mxc.ca (Nick Lewycky) Date: Mon, 31 Mar 2008 22:19:03 -0700 Subject: [llvm-commits] [PATCH] add GraphTraits for class User In-Reply-To: <47F124A9.40508@gmail.com> References: <47F124A9.40508@gmail.com> Message-ID: <47F1C5C7.4010803@mxc.ca> Don't add this to User.h. Create Support/DataFlow.h? UseDef.h? Not sure. No tabs allowed. You have a lot of whitespace errors. Decide, is it "User *X" or "User* X"? I suggest the former. Also, there should be a space after the "if" keyword. Include a version that works on non-const User. +//===----------------------------------------------------------------------===// +// Provide specializations of GraphTraits to be able to treat a def-use/use-def chains +// as graphs 80 column rule. That line is 88 columns. Nick T?r?k Edwin wrote: > Hi, > > This patch adds GraphTraits for class User, allowing to use a > depth-first iterator to find out all values that depend on (use) a > certain Value. > This can currently be done only by coding a recursive function. > > I tried to use forward declaration of GraphTraits/Inverse to avoid > including the header for it, but that doesn't work, because of Inverse. > Is it ok to include those headers in User.h? If not, where should I move > this GraphTraits code? > > Please review this patch, and let me know if I am allowed to commit it. > > Thanks, > --Edwin From gordonhenriksen at mac.com Tue Apr 1 00:39:18 2008 From: gordonhenriksen at mac.com (Gordon Henriksen) Date: Tue, 1 Apr 2008 01:39:18 -0400 Subject: [llvm-commits] [PATCH] Setup ocamldoc to build on the website. In-Reply-To: <1207023978-5470-1-git-send-email-idadesub@users.sourceforge.net> References: <1207023978-5470-1-git-send-email-idadesub@users.sourceforge.net> Message-ID: <4292471D-27EF-46F3-86CE-F0179F20C343@mac.com> On Apr 1, 2008, at 00:26, Erick Tryzelaar wrote: > This lets ocamldoc run without depending on llvm-config existing. > > It also changes it so that the .odoc files depend on the > installed .cmi files instead of the ones in the build directory. This latter change seems undesirable. What's the motivation? We never want to touch files outside of objdir unless explicitly requested by 'make install' or -'uninstall'. Frequently, the building user doesn't have write permission to install directories (e.g., /usr/local). > I'm not yet sure if this is enough for the BUILD_FOR_WEBSITE > though. > --- > bindings/ocaml/Makefile.ocaml | 6 +++++- > 1 files changed, 5 insertions(+), 1 deletions(-) ? Gordon From sabre at nondot.org Tue Apr 1 01:00:12 2008 From: sabre at nondot.org (Chris Lattner) Date: Tue, 01 Apr 2008 06:00:12 -0000 Subject: [llvm-commits] [llvm] r49030 - in /llvm/trunk: include/llvm/System/Path.h lib/System/Unix/Path.inc lib/System/Win32/Path.inc Message-ID: <200804010600.m3160CD2017663@zion.cs.uiuc.edu> Author: lattner Date: Tue Apr 1 01:00:12 2008 New Revision: 49030 URL: http://llvm.org/viewvc/llvm-project?rev=49030&view=rev Log: Stub out some sys::Path::MapInFilePages/UnMapFilePages methods. Modified: llvm/trunk/include/llvm/System/Path.h llvm/trunk/lib/System/Unix/Path.inc llvm/trunk/lib/System/Win32/Path.inc Modified: llvm/trunk/include/llvm/System/Path.h URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/System/Path.h?rev=49030&r1=49029&r2=49030&view=diff ============================================================================== --- llvm/trunk/include/llvm/System/Path.h (original) +++ llvm/trunk/include/llvm/System/Path.h Tue Apr 1 01:00:12 2008 @@ -544,6 +544,29 @@ /// @brief Removes the file or directory from the filesystem. bool eraseFromDisk(bool destroy_contents = false, std::string *Err = 0) const; + + + /// MapInFilePages - This is a low level system API to map in the file + /// that is currently opened as FD into the current processes' address + /// space for read only access. This function may return null on failure + /// or if the system cannot provide the following constraints: + /// 1) The pages must be valid after the FD is closed, until + /// UnMapFilePages is called. + /// 2) Any padding after the end of the file must be zero filled, if + /// present. + /// 3) The pages must be contiguous. + /// + /// This API is not intended for general use, clients should use + /// MemoryBuffer::getFile instead. + static const char *MapInFilePages(int FD, uint64_t FileSize); + + /// UnMapFilePages - Free pages mapped into the current process by + /// MapInFilePages. + /// + /// This API is not intended for general use, clients should use + /// MemoryBuffer::getFile instead. + static void UnMapFilePages(const char *Base, uint64_t FileSize); + /// @} /// @name Data /// @{ Modified: llvm/trunk/lib/System/Unix/Path.inc URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/System/Unix/Path.inc?rev=49030&r1=49029&r2=49030&view=diff ============================================================================== --- llvm/trunk/lib/System/Unix/Path.inc (original) +++ llvm/trunk/lib/System/Unix/Path.inc Tue Apr 1 01:00:12 2008 @@ -745,5 +745,15 @@ return false; } +/// MapInFilePages - Not yet implemented on win32. +const char *Path::MapInFilePages(int FD, uint64_t FileSize) { + return 0; +} + +/// MapInFilePages - Not yet implemented on win32. +void Path::UnMapFilePages(const char *Base, uint64_t FileSize) { + assert(0 && "NOT IMPLEMENTED"); +} + } // end llvm namespace Modified: llvm/trunk/lib/System/Win32/Path.inc URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/System/Win32/Path.inc?rev=49030&r1=49029&r2=49030&view=diff ============================================================================== --- llvm/trunk/lib/System/Win32/Path.inc (original) +++ llvm/trunk/lib/System/Win32/Path.inc Tue Apr 1 01:00:12 2008 @@ -773,5 +773,15 @@ return false; } +/// MapInFilePages - Not yet implemented on win32. +const char *Path::MapInFilePages(int FD, uint64_t FileSize) { + return 0; +} + +/// MapInFilePages - Not yet implemented on win32. +void Path::UnMapFilePages(const char *Base, uint64_t FileSize) { + assert(0 && "NOT IMPLEMENTED"); +} + } } From asl at math.spbu.ru Tue Apr 1 00:54:05 2008 From: asl at math.spbu.ru (Anton Korobeynikov) Date: Tue, 01 Apr 2008 09:54:05 +0400 Subject: [llvm-commits] [llvm] r49006 - in /llvm/trunk/lib: CodeGen/DwarfWriter.cpp CodeGen/LLVMTargetMachine.cpp CodeGen/SelectionDAG/SelectionDAGISel.cpp Target/PowerPC/PPCAsmPrinter.cpp Target/PowerPC/PPCRegisterInfo.cpp Target/X86/X86AsmPrinter.cpp Target/X86/X86RegisterInfo.cpp Transforms/Utils/LowerInvoke.cpp In-Reply-To: <200803312340.m2VNeOu9005523@zion.cs.uiuc.edu> References: <200803312340.m2VNeOu9005523@zion.cs.uiuc.edu> Message-ID: <1207029245.16812.433.camel@asl.dorms.spbu.ru> Dale, > Emit exception handling info for functions which are > not marked nounwind, or for all functions when -enable-eh > is set, provided the target supports Dwarf EH. Is this correct? Nounwind function can easily require EH information, for example: void foo() { try { bar(); } catch(...) { baz(); } } foo() can be marked as nounwind, but it requires EH info to be emitted. -- With best regards, Anton Korobeynikov. Faculty of Mathematics & Mechanics, Saint Petersburg State University. From sabre at nondot.org Tue Apr 1 01:05:22 2008 From: sabre at nondot.org (Chris Lattner) Date: Tue, 01 Apr 2008 06:05:22 -0000 Subject: [llvm-commits] [llvm] r49031 - /llvm/trunk/lib/Support/MemoryBuffer.cpp Message-ID: <200804010605.m3165Mux017834@zion.cs.uiuc.edu> Author: lattner Date: Tue Apr 1 01:05:21 2008 New Revision: 49031 URL: http://llvm.org/viewvc/llvm-project?rev=49031&view=rev Log: Reimplement MemoryBuffer::getFile with three enhancements: 1) stop using MappedFile. 2) if profitable use the sys::path::MapInFilePages api to read the file. 3) otherwise fallback to read. When sys::path::MapInFilePages is implemented, this provides several benefits: #1: this avoids fragmenting memory for small files. #2: this avoids extraneous stat calls when the file size is known. #3: this only keeps the file descriptor open while reading the file, not for the duration of the lifetime of the memory buffer. This fixes a serious clang FD 'leak' problem. I believe that this will work on a win32 machine, but I don't have one to test on. I'd appreciate it if someone could check. Modified: llvm/trunk/lib/Support/MemoryBuffer.cpp Modified: llvm/trunk/lib/Support/MemoryBuffer.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Support/MemoryBuffer.cpp?rev=49031&r1=49030&r2=49031&view=diff ============================================================================== --- llvm/trunk/lib/Support/MemoryBuffer.cpp (original) +++ llvm/trunk/lib/Support/MemoryBuffer.cpp Tue Apr 1 01:05:21 2008 @@ -12,13 +12,24 @@ //===----------------------------------------------------------------------===// #include "llvm/Support/MemoryBuffer.h" -#include "llvm/System/MappedFile.h" +#include "llvm/ADT/OwningPtr.h" +#include "llvm/ADT/SmallString.h" +#include "llvm/System/Path.h" #include "llvm/System/Process.h" #include "llvm/System/Program.h" #include #include #include #include +#include +#include +#if !defined(_MSC_VER) && !defined(__MINGW32__) +#include +#include +#include +#else +#include +#endif using namespace llvm; //===----------------------------------------------------------------------===// @@ -136,108 +147,78 @@ } //===----------------------------------------------------------------------===// -// MemoryBufferMMapFile implementation. +// MemoryBuffer::getFile implementation. //===----------------------------------------------------------------------===// namespace { +/// MemoryBufferMMapFile - This represents a file that was mapped in with the +/// sys::Path::MapInFilePages method. When destroyed, it calls the +/// sys::Path::UnMapFilePages method. class MemoryBufferMMapFile : public MemoryBuffer { - sys::MappedFile File; + std::string Filename; public: - MemoryBufferMMapFile() {} - - bool open(const sys::Path &Filename, std::string *ErrStr); + MemoryBufferMMapFile(const char *filename, const char *Pages, uint64_t Size) + : Filename(filename) { + init(Pages, Pages+Size); + } virtual const char *getBufferIdentifier() const { - return File.path().c_str(); + return Filename.c_str(); } - ~MemoryBufferMMapFile(); -}; -} - -bool MemoryBufferMMapFile::open(const sys::Path &Filename, - std::string *ErrStr) { - // FIXME: This does an extra stat syscall to figure out the size, but we - // already know the size! - bool Failure = File.open(Filename, ErrStr); - if (Failure) return true; - - if (!File.map(ErrStr)) - return true; - - size_t Size = File.size(); - - static unsigned PageSize = sys::Process::GetPageSize(); - assert(((PageSize & (PageSize-1)) == 0) && PageSize && - "Page size is not a power of 2!"); - - // If this file is not an exact multiple of the system page size (common - // case), then the OS has zero terminated the buffer for us. - const char *FileBase = static_cast(File.getBase()); - if ((Size & (PageSize-1)) != 0) { - init(FileBase, FileBase+Size); - } else { - // Otherwise, we allocate a new memory buffer and copy the data over - initCopyOf(FileBase, FileBase+Size); - - // No need to keep the file mapped any longer. - File.unmap(); + ~MemoryBufferMMapFile() { + sys::Path::UnMapFilePages(getBufferStart(), getBufferSize()); } - return false; -} - -MemoryBufferMMapFile::~MemoryBufferMMapFile() { - if (File.isMapped()) - File.unmap(); +}; } -//===----------------------------------------------------------------------===// -// MemoryBuffer::getFile implementation. -//===----------------------------------------------------------------------===// - MemoryBuffer *MemoryBuffer::getFile(const char *FilenameStart, unsigned FnSize, - std::string *ErrStr, int64_t FileSize){ - // FIXME: it would be nice if PathWithStatus didn't copy the filename into a - // temporary string. :( - sys::PathWithStatus P(FilenameStart, FnSize); -#if 1 - MemoryBufferMMapFile *M = new MemoryBufferMMapFile(); - if (!M->open(P, ErrStr)) - return M; - delete M; - return 0; -#else - // FIXME: We need an efficient and portable method to open a file and then use - // 'read' to copy the bits out. The unix implementation is below. This is - // an important optimization for clients that want to open large numbers of - // small files (using mmap on everything can easily exhaust address space!). + std::string *ErrStr, int64_t FileSize) { + // Null terminate the filename. + SmallString<1000> Filename(FilenameStart, FilenameStart+FnSize); + Filename.push_back(0); + + int OpenFlags = 0; +#ifdef O_BINARY + Flags |= O_BINARY; // Open input file in binary mode on win32. +#endif + int FD = ::open(&Filename[0], O_RDONLY|OpenFlags); + if (FD == -1) { + if (ErrStr) *ErrStr = "could not open file"; + return 0; + } - // If the user didn't specify a filesize, do a stat to find it. + // If we don't know the file size, use fstat to find out. fstat on an open + // file descriptor is cheaper than stat on a random path. if (FileSize == -1) { - const sys::FileStatus *FS = P.getFileStatus(); - if (FS == 0) return 0; // Error stat'ing file. - - FileSize = FS->fileSize; + struct stat FileInfo; + // TODO: This should use fstat64 when available. + if (fstat(FD, &FileInfo) == -1) { + if (ErrStr) *ErrStr = "could not get file length"; + ::close(FD); + return 0; + } + FileSize = FileInfo.st_size; } - // If the file is larger than some threshold, use mmap, otherwise use 'read'. - if (FileSize >= 4096*4) { - MemoryBufferMMapFile *M = new MemoryBufferMMapFile(); - if (!M->open(P, ErrStr)) - return M; - delete M; - return 0; + + // If the file is large, try to use mmap to read it in. We don't use mmap + // for small files, because this can severely fragment our address space. Also + // don't try to map files that are exactly a multiple of the system page size, + // as the file would not have the required null terminator. + if (FileSize >= 4096*4 && + (FileSize & (sys::Process::GetPageSize()-1)) != 0) { + if (const char *Pages = sys::Path::MapInFilePages(FD, FileSize)) { + // Close the file descriptor, now that the whole file is in memory. + ::close(FD); + return new MemoryBufferMMapFile(&Filename[0], Pages, FileSize); + } } - MemoryBuffer *SB = getNewUninitMemBuffer(FileSize, FilenameStart); + OwningPtr SB; + SB.reset(MemoryBuffer::getNewUninitMemBuffer(FileSize, &Filename[0])); char *BufPtr = const_cast(SB->getBufferStart()); - int FD = ::open(FilenameStart, O_RDONLY); - if (FD == -1) { - delete SB; - return 0; - } - unsigned BytesLeft = FileSize; while (BytesLeft) { ssize_t NumRead = ::read(FD, BufPtr, BytesLeft); @@ -249,17 +230,15 @@ } else { // error reading. close(FD); - delete SB; + if (ErrStr) *ErrStr = "error reading file data"; return 0; } } close(FD); - return SB; -#endif + return SB.take(); } - //===----------------------------------------------------------------------===// // MemoryBuffer::getSTDIN implementation. //===----------------------------------------------------------------------===// From resistor at mac.com Tue Apr 1 01:12:27 2008 From: resistor at mac.com (Owen Anderson) Date: Tue, 1 Apr 2008 01:12:27 -0500 Subject: [llvm-commits] [llvm] r48999 - /llvm/trunk/lib/Analysis/MemoryDependenceAnalysis.cpp In-Reply-To: <200803312208.m2VM81vX002558@zion.cs.uiuc.edu> References: <200803312208.m2VM81vX002558@zion.cs.uiuc.edu> Message-ID: <9BDB5904-0D83-4B2F-A332-51DE480BC86C@mac.com> Dan, I don't think this is right. MemDep walks backwards through the block to find dependencies, so it needs to start at the end of the block. --Owen On Mar 31, 2008, at 5:08 PM, Dan Gohman wrote: > Author: djg > Date: Mon Mar 31 17:08:00 2008 > New Revision: 48999 > > URL: http://llvm.org/viewvc/llvm-project?rev=48999&view=rev > Log: > Set blockBegin to point to the beginning of the block, > not the end. > > Modified: > llvm/trunk/lib/Analysis/MemoryDependenceAnalysis.cpp > > Modified: llvm/trunk/lib/Analysis/MemoryDependenceAnalysis.cpp > URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Analysis/MemoryDependenceAnalysis.cpp?rev=48999&r1=48998&r2=48999&view=diff > > = > = > = > = > = > = > = > = > ====================================================================== > --- llvm/trunk/lib/Analysis/MemoryDependenceAnalysis.cpp (original) > +++ llvm/trunk/lib/Analysis/MemoryDependenceAnalysis.cpp Mon Mar 31 > 17:08:00 2008 > @@ -99,11 +99,11 @@ > // If the starting point was specifiy, use it > if (start) { > QI = start; > - blockBegin = start->getParent()->end(); > + blockBegin = start->getParent()->begin(); > // If the starting point wasn't specified, but the block was, use it > } else if (!start && block) { > QI = block->end(); > - blockBegin = block->end(); > + blockBegin = block->begin(); > } > > // Walk backwards through the block, looking for dependencies > > > _______________________________________________ > llvm-commits mailing list > llvm-commits at cs.uiuc.edu > http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits -------------- next part -------------- A non-text attachment was scrubbed... Name: smime.p7s Type: application/pkcs7-signature Size: 2555 bytes Desc: not available Url : http://lists.cs.uiuc.edu/pipermail/llvm-commits/attachments/20080401/5afe6aad/attachment.bin From sabre at nondot.org Tue Apr 1 01:20:44 2008 From: sabre at nondot.org (Chris Lattner) Date: Tue, 01 Apr 2008 06:20:44 -0000 Subject: [llvm-commits] [llvm] r49035 - in /llvm/trunk: include/llvm/System/MappedFile.h lib/System/MappedFile.cpp lib/System/Unix/MappedFile.inc lib/System/Win32/MappedFile.inc Message-ID: <200804010620.m316KiOY018363@zion.cs.uiuc.edu> Author: lattner Date: Tue Apr 1 01:20:44 2008 New Revision: 49035 URL: http://llvm.org/viewvc/llvm-project?rev=49035&view=rev Log: MappedFile is dead, remove it. Removed: llvm/trunk/include/llvm/System/MappedFile.h llvm/trunk/lib/System/MappedFile.cpp llvm/trunk/lib/System/Unix/MappedFile.inc llvm/trunk/lib/System/Win32/MappedFile.inc Removed: llvm/trunk/include/llvm/System/MappedFile.h URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/System/MappedFile.h?rev=49034&view=auto ============================================================================== --- llvm/trunk/include/llvm/System/MappedFile.h (original) +++ llvm/trunk/include/llvm/System/MappedFile.h (removed) @@ -1,85 +0,0 @@ -//===- llvm/System/MappedFile.h - MappedFile OS Concept ---------*- C++ -*-===// -// -// The LLVM Compiler Infrastructure -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. -// -//===----------------------------------------------------------------------===// -// -// This file declares the llvm::sys::MappedFile class. -// -//===----------------------------------------------------------------------===// - -#ifndef LLVM_SYSTEM_MAPPEDFILE_H -#define LLVM_SYSTEM_MAPPEDFILE_H - -#include "llvm/System/Path.h" - -namespace llvm { -namespace sys { - - /// Forward declare a class used for holding platform specific information - /// that needs to be - struct MappedFileInfo; - - /// This class provides an abstraction for a memory mapped file in the - /// operating system's filesystem. It provides platform independent operations - /// for mapping a file into memory for read access. - class MappedFile { - sys::PathWithStatus Path; ///< Path to the file. - void *BasePtr; ///< Pointer to the base memory address - mutable MappedFileInfo *MapInfo; ///< Platform specific info for the mapping - - MappedFile& operator=(const MappedFile &that); // DO NOT IMPLEMENT - MappedFile(const MappedFile &that); // DO NOT IMPLEMENT - public: - MappedFile() : BasePtr(0), MapInfo(0) {} - - /// Destruct a MappedFile and release all memory associated with it. - ~MappedFile() { close(); } - - public: // Accessors - - /// This function determines if the file is currently mapped or not. - bool isMapped() const { return BasePtr != 0; } - - /// getBase - Returns a const void* pointer to the base address of the file - /// mapping. This is the memory address of the first byte in the file. - const void *getBase() const { return BasePtr; } - - /// This function returns a reference to the sys::Path object kept by the - /// MappedFile object. This contains the path to the file that is or - /// will be mapped. - const sys::PathWithStatus &path() const { return Path; } - - /// This function returns the number of bytes in the file. - size_t size() const; - - public: // Mutators - - /// Open a file to be mapped and get its size but don't map it yet. Return - /// true on error. - bool open(const sys::Path &P, std::string *ErrMsg = 0) { - Path = P; - return initialize(ErrMsg); - } - - /// unmap - Remove the mapped file from memory. - void unmap(); - - /// map - Reserve space for the file, map it into memory, and return a - /// pointer to it. This returns the base memory address of the mapped file - /// or 0 if an error occurred. - const void *map(std::string* ErrMsg = 0); - - void close() { if (MapInfo) terminate(); } - - private: - bool initialize(std::string *ErrMsg); - void terminate(); - }; -} // end namespace sys -} // end namespace llvm - -#endif Removed: llvm/trunk/lib/System/MappedFile.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/System/MappedFile.cpp?rev=49034&view=auto ============================================================================== --- llvm/trunk/lib/System/MappedFile.cpp (original) +++ llvm/trunk/lib/System/MappedFile.cpp (removed) @@ -1,34 +0,0 @@ -//===- MappedFile.cpp - MappedFile Support ----------------------*- C++ -*-===// -// -// The LLVM Compiler Infrastructure -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. -// -//===----------------------------------------------------------------------===// -// -// This file implements the mapped file concept. -// -//===----------------------------------------------------------------------===// - -#include "llvm/System/MappedFile.h" -#include "llvm/Config/config.h" - -namespace llvm { -using namespace sys; - -//===----------------------------------------------------------------------===// -//=== WARNING: Implementation here must contain only TRULY operating system -//=== independent code. -//===----------------------------------------------------------------------===// - -} - -// Include the platform-specific parts of this class. -#ifdef LLVM_ON_UNIX -#include "Unix/MappedFile.inc" -#endif -#ifdef LLVM_ON_WIN32 -#include "Win32/MappedFile.inc" -#endif - Removed: llvm/trunk/lib/System/Unix/MappedFile.inc URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/System/Unix/MappedFile.inc?rev=49034&view=auto ============================================================================== --- llvm/trunk/lib/System/Unix/MappedFile.inc (original) +++ llvm/trunk/lib/System/Unix/MappedFile.inc (removed) @@ -1,97 +0,0 @@ -//===- Unix/MappedFile.inc - Unix MappedFile Implementation -----*- C++ -*-===// -// -// The LLVM Compiler Infrastructure -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. -// -//===----------------------------------------------------------------------===// -// -// This file provides the generic Unix implementation of the MappedFile concept. -// -//===----------------------------------------------------------------------===// - -#include "Unix.h" -#include "llvm/System/Process.h" - -#ifdef HAVE_FCNTL_H -#include -#endif - -#ifdef HAVE_SYS_MMAN_H -#include -#endif - -#ifdef HAVE_SYS_STAT_H -#include -#endif - -using namespace llvm; -using namespace sys; - -namespace llvm { - namespace sys { - struct MappedFileInfo { - int FD; - off_t Size; - }; - } -} - -bool MappedFile::initialize(std::string* ErrMsg) { - int FD = ::open(Path.c_str(), O_RDONLY); - if (FD < 0) { - MakeErrMsg(ErrMsg, "can't open file '" + Path.toString() + "'"); - return true; - } - const FileStatus *Status = Path.getFileStatus(false, ErrMsg); - if (!Status) { - ::close(FD); - return true; - } - MapInfo = new MappedFileInfo(); - MapInfo->FD = FD; - MapInfo->Size = Status->getSize(); - return false; -} - -void MappedFile::terminate() { - unmap(); - assert(MapInfo && "MappedFile not initialized"); - ::close(MapInfo->FD); - delete MapInfo; - MapInfo = 0; -} - -void MappedFile::unmap() { - assert(MapInfo && "MappedFile not initialized"); - if (!isMapped()) return; - - ::munmap(BasePtr, MapInfo->Size); - BasePtr = 0; // Mark this as non-mapped. -} - -const void* MappedFile::map(std::string* ErrMsg) { - assert(MapInfo && "MappedFile not initialized"); - if (isMapped()) return BasePtr; - - int flags = MAP_PRIVATE; -#ifdef MAP_FILE - flags |= MAP_FILE; -#endif - size_t PageSize = Process::GetPageSize(); - size_t map_size = ((MapInfo->Size / PageSize)+1) * PageSize; - - BasePtr = ::mmap(0, map_size, PROT_READ, flags, MapInfo->FD, 0); - if (BasePtr == MAP_FAILED) { - MakeErrMsg(ErrMsg, "Can't map file:" + Path.toString()); - return 0; - } - return BasePtr; -} - -size_t MappedFile::size() const { - assert(MapInfo && "MappedFile not initialized"); - return MapInfo->Size; -} - Removed: llvm/trunk/lib/System/Win32/MappedFile.inc URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/System/Win32/MappedFile.inc?rev=49034&view=auto ============================================================================== --- llvm/trunk/lib/System/Win32/MappedFile.inc (original) +++ llvm/trunk/lib/System/Win32/MappedFile.inc (removed) @@ -1,104 +0,0 @@ -//===- Win32/MappedFile.cpp - Win32 MappedFile Implementation ---*- C++ -*-===// -// -// The LLVM Compiler Infrastructure -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. -// -//===----------------------------------------------------------------------===// -// -// This file provides the Win32 implementation of the MappedFile concept. -// -//===----------------------------------------------------------------------===// - -//===----------------------------------------------------------------------===// -//=== WARNING: Implementation here must contain only Win32 code. -//===----------------------------------------------------------------------===// - -#include "Win32.h" -#include "llvm/System/Process.h" - -namespace llvm { -using namespace sys; - -struct sys::MappedFileInfo { - HANDLE hFile; - HANDLE hMapping; - size_t size; -}; - -bool MappedFile::initialize(std::string* ErrMsg) { - assert(!MapInfo); - MapInfo = new MappedFileInfo; - MapInfo->hFile = INVALID_HANDLE_VALUE; - MapInfo->hMapping = NULL; - - MapInfo->hFile = CreateFile(Path.c_str(), GENERIC_READ, 0, NULL, - OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); - if (MapInfo->hFile == INVALID_HANDLE_VALUE) { - delete MapInfo; - MapInfo = NULL; - return MakeErrMsg(ErrMsg, - std::string("Can't open file: ") + Path.toString()); - } - - LARGE_INTEGER size; - if (!GetFileSizeEx(MapInfo->hFile, &size) || - (MapInfo->size = size_t(size.QuadPart), MapInfo->size != size.QuadPart)) { - CloseHandle(MapInfo->hFile); - delete MapInfo; - MapInfo = NULL; - return MakeErrMsg(ErrMsg, - std::string("Can't get size of file: ") + Path.toString()); - } - - return false; -} - -void MappedFile::terminate() { - unmap(); - if (MapInfo->hFile != INVALID_HANDLE_VALUE) - CloseHandle(MapInfo->hFile); - delete MapInfo; - MapInfo = NULL; -} - -void MappedFile::unmap() { - assert(MapInfo && "MappedFile not initialized"); - if (isMapped()) { - UnmapViewOfFile(BasePtr); - BasePtr = NULL; - } - if (MapInfo->hMapping != INVALID_HANDLE_VALUE) { - CloseHandle(MapInfo->hMapping); - MapInfo->hMapping = NULL; - } -} - -const void* MappedFile::map(std::string* ErrMsg) { - if (!isMapped()) { - MapInfo->hMapping = CreateFileMapping(MapInfo->hFile, NULL, PAGE_READONLY, - 0, 0, NULL); - if (MapInfo->hMapping == NULL) { - MakeErrMsg(ErrMsg, std::string("Can't map file: ") + Path.toString()); - return 0; - } - - BasePtr = MapViewOfFileEx(MapInfo->hMapping, FILE_MAP_READ, 0, 0, 0, NULL); - if (BasePtr == NULL) { - CloseHandle(MapInfo->hMapping); - MapInfo->hMapping = NULL; - MakeErrMsg(ErrMsg, std::string("Can't map file: ") + Path.toString()); - return 0; - } - } - return BasePtr; -} - -size_t MappedFile::size() const { - assert(MapInfo && "MappedFile not initialized"); - return MapInfo->size; -} - -} - From sabre at nondot.org Tue Apr 1 01:25:23 2008 From: sabre at nondot.org (Chris Lattner) Date: Tue, 01 Apr 2008 06:25:23 -0000 Subject: [llvm-commits] [llvm] r49036 - /llvm/trunk/lib/System/Unix/Path.inc Message-ID: <200804010625.m316PNiZ018496@zion.cs.uiuc.edu> Author: lattner Date: Tue Apr 1 01:25:23 2008 New Revision: 49036 URL: http://llvm.org/viewvc/llvm-project?rev=49036&view=rev Log: add some #includes. Modified: llvm/trunk/lib/System/Unix/Path.inc Modified: llvm/trunk/lib/System/Unix/Path.inc URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/System/Unix/Path.inc?rev=49036&r1=49035&r2=49036&view=diff ============================================================================== --- llvm/trunk/lib/System/Unix/Path.inc (original) +++ llvm/trunk/lib/System/Unix/Path.inc Tue Apr 1 01:25:23 2008 @@ -24,6 +24,12 @@ #if HAVE_FCNTL_H #include #endif +#ifdef HAVE_SYS_MMAN_H +#include +#endif +#ifdef HAVE_SYS_STAT_H +#include +#endif #if HAVE_UTIME_H #include #endif @@ -753,11 +759,11 @@ void *BasePtr = ::mmap(0, FileSize, PROT_READ, Flags, FD, 0); if (BasePtr == MAP_FAILED) return 0; - return BasePtr; + return (const char*)BasePtr; } void Path::UnMapFilePages(const char *BasePtr, uint64_t FileSize) { - ::munmap(BasePtr, FileSize); + ::munmap((void*)BasePtr, FileSize); } } // end llvm namespace From sabre at nondot.org Tue Apr 1 01:16:24 2008 From: sabre at nondot.org (Chris Lattner) Date: Tue, 01 Apr 2008 06:16:24 -0000 Subject: [llvm-commits] [llvm] r49034 - in /llvm/trunk/lib/System/Unix: MappedFile.inc Path.inc Message-ID: <200804010616.m316GO6T018217@zion.cs.uiuc.edu> Author: lattner Date: Tue Apr 1 01:16:24 2008 New Revision: 49034 URL: http://llvm.org/viewvc/llvm-project?rev=49034&view=rev Log: Implement Path::MapInFilePages/UnMapFilePages on unix, which provides fast MappedFile::getFile for large files. Modified: llvm/trunk/lib/System/Unix/MappedFile.inc llvm/trunk/lib/System/Unix/Path.inc Modified: llvm/trunk/lib/System/Unix/MappedFile.inc URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/System/Unix/MappedFile.inc?rev=49034&r1=49033&r2=49034&view=diff ============================================================================== --- llvm/trunk/lib/System/Unix/MappedFile.inc (original) +++ llvm/trunk/lib/System/Unix/MappedFile.inc Tue Apr 1 01:16:24 2008 @@ -75,7 +75,6 @@ assert(MapInfo && "MappedFile not initialized"); if (isMapped()) return BasePtr; - int prot = PROT_READ; int flags = MAP_PRIVATE; #ifdef MAP_FILE flags |= MAP_FILE; @@ -83,7 +82,7 @@ size_t PageSize = Process::GetPageSize(); size_t map_size = ((MapInfo->Size / PageSize)+1) * PageSize; - BasePtr = ::mmap(0, map_size, prot, flags, MapInfo->FD, 0); + BasePtr = ::mmap(0, map_size, PROT_READ, flags, MapInfo->FD, 0); if (BasePtr == MAP_FAILED) { MakeErrMsg(ErrMsg, "Can't map file:" + Path.toString()); return 0; Modified: llvm/trunk/lib/System/Unix/Path.inc URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/System/Unix/Path.inc?rev=49034&r1=49033&r2=49034&view=diff ============================================================================== --- llvm/trunk/lib/System/Unix/Path.inc (original) +++ llvm/trunk/lib/System/Unix/Path.inc Tue Apr 1 01:16:24 2008 @@ -745,14 +745,19 @@ return false; } -/// MapInFilePages - Not yet implemented on win32. const char *Path::MapInFilePages(int FD, uint64_t FileSize) { - return 0; + int Flags = MAP_PRIVATE; +#ifdef MAP_FILE + Flags |= MAP_FILE; +#endif + void *BasePtr = ::mmap(0, FileSize, PROT_READ, Flags, FD, 0); + if (BasePtr == MAP_FAILED) + return 0; + return BasePtr; } -/// MapInFilePages - Not yet implemented on win32. -void Path::UnMapFilePages(const char *Base, uint64_t FileSize) { - assert(0 && "NOT IMPLEMENTED"); +void Path::UnMapFilePages(const char *BasePtr, uint64_t FileSize) { + ::munmap(BasePtr, FileSize); } } // end llvm namespace From evan.cheng at apple.com Tue Apr 1 02:05:45 2008 From: evan.cheng at apple.com (Evan Cheng) Date: Tue, 1 Apr 2008 00:05:45 -0700 Subject: [llvm-commits] [llvm] r48999 - /llvm/trunk/lib/Analysis/MemoryDependenceAnalysis.cpp In-Reply-To: <9BDB5904-0D83-4B2F-A332-51DE480BC86C@mac.com> References: <200803312208.m2VM81vX002558@zion.cs.uiuc.edu> <9BDB5904-0D83-4B2F-A332-51DE480BC86C@mac.com> Message-ID: It looks right to me: // If the starting point was specifiy, use it if (start) { QI = start; blockBegin = start->getParent()->begin(); // If the starting point wasn't specified, but the block was, use it } else if (!start && block) { QI = block->end(); blockBegin = block->begin(); } // Walk backwards through the block, looking for dependencies while (QI != blockBegin) { --QI; QI is the iterator. Seems to me blockBegin really should point to the start of the block. Evan On Mar 31, 2008, at 11:12 PM, Owen Anderson wrote: > Dan, > > I don't think this is right. MemDep walks backwards through the > block to find dependencies, so it needs to start at the end of the > block. > > --Owen > > On Mar 31, 2008, at 5:08 PM, Dan Gohman wrote: > >> Author: djg >> Date: Mon Mar 31 17:08:00 2008 >> New Revision: 48999 >> >> URL: http://llvm.org/viewvc/llvm-project?rev=48999&view=rev >> Log: >> Set blockBegin to point to the beginning of the block, >> not the end. >> >> Modified: >> llvm/trunk/lib/Analysis/MemoryDependenceAnalysis.cpp >> >> Modified: llvm/trunk/lib/Analysis/MemoryDependenceAnalysis.cpp >> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Analysis/MemoryDependenceAnalysis.cpp?rev=48999&r1=48998&r2=48999&view=diff >> >> = >> = >> = >> = >> = >> = >> = >> = >> = >> ===================================================================== >> --- llvm/trunk/lib/Analysis/MemoryDependenceAnalysis.cpp (original) >> +++ llvm/trunk/lib/Analysis/MemoryDependenceAnalysis.cpp Mon Mar 31 >> 17:08:00 2008 >> @@ -99,11 +99,11 @@ >> // If the starting point was specifiy, use it >> if (start) { >> QI = start; >> - blockBegin = start->getParent()->end(); >> + blockBegin = start->getParent()->begin(); >> // If the starting point wasn't specified, but the block was, use it >> } else if (!start && block) { >> QI = block->end(); >> - blockBegin = block->end(); >> + blockBegin = block->begin(); >> } >> >> // Walk backwards through the block, looking for dependencies >> >> >> _______________________________________________ >> llvm-commits mailing list >> llvm-commits at cs.uiuc.edu >> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits > > _______________________________________________ > llvm-commits mailing list > llvm-commits at cs.uiuc.edu > http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits From resistor at mac.com Tue Apr 1 02:27:49 2008 From: resistor at mac.com (Owen Anderson) Date: Tue, 1 Apr 2008 02:27:49 -0500 Subject: [llvm-commits] [llvm] r48999 - /llvm/trunk/lib/Analysis/MemoryDependenceAnalysis.cpp In-Reply-To: References: <200803312208.m2VM81vX002558@zion.cs.uiuc.edu> <9BDB5904-0D83-4B2F-A332-51DE480BC86C@mac.com> Message-ID: <2B7782A8-082D-4BCD-8AD9-38EE83EA5AE1@mac.com> Ah, my bad. I misread what he was doing. :-) --Owen On Apr 1, 2008, at 2:05 AM, Evan Cheng wrote: > It looks right to me: > > // If the starting point was specifiy, use it > if (start) { > QI = start; > blockBegin = start->getParent()->begin(); > // If the starting point wasn't specified, but the block was, use it > } else if (!start && block) { > QI = block->end(); > blockBegin = block->begin(); > } > > // Walk backwards through the block, looking for dependencies > while (QI != blockBegin) { > --QI; > > QI is the iterator. Seems to me blockBegin really should point to the > start of the block. > > Evan > > On Mar 31, 2008, at 11:12 PM, Owen Anderson wrote: > >> Dan, >> >> I don't think this is right. MemDep walks backwards through the >> block to find dependencies, so it needs to start at the end of the >> block. >> >> --Owen >> >> On Mar 31, 2008, at 5:08 PM, Dan Gohman wrote: >> >>> Author: djg >>> Date: Mon Mar 31 17:08:00 2008 >>> New Revision: 48999 >>> >>> URL: http://llvm.org/viewvc/llvm-project?rev=48999&view=rev >>> Log: >>> Set blockBegin to point to the beginning of the block, >>> not the end. >>> >>> Modified: >>> llvm/trunk/lib/Analysis/MemoryDependenceAnalysis.cpp >>> >>> Modified: llvm/trunk/lib/Analysis/MemoryDependenceAnalysis.cpp >>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Analysis/MemoryDependenceAnalysis.cpp?rev=48999&r1=48998&r2=48999&view=diff >>> >>> = >>> = >>> = >>> = >>> = >>> = >>> = >>> = >>> = >>> = >>> ==================================================================== >>> --- llvm/trunk/lib/Analysis/MemoryDependenceAnalysis.cpp (original) >>> +++ llvm/trunk/lib/Analysis/MemoryDependenceAnalysis.cpp Mon Mar 31 >>> 17:08:00 2008 >>> @@ -99,11 +99,11 @@ >>> // If the starting point was specifiy, use it >>> if (start) { >>> QI = start; >>> - blockBegin = start->getParent()->end(); >>> + blockBegin = start->getParent()->begin(); >>> // If the starting point wasn't specified, but the block was, use it >>> } else if (!start && block) { >>> QI = block->end(); >>> - blockBegin = block->end(); >>> + blockBegin = block->begin(); >>> } >>> >>> // Walk backwards through the block, looking for dependencies >>> >>> >>> _______________________________________________ >>> llvm-commits mailing list >>> llvm-commits at cs.uiuc.edu >>> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits >> >> _______________________________________________ >> llvm-commits mailing list >> llvm-commits at cs.uiuc.edu >> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits > > _______________________________________________ > llvm-commits mailing list > llvm-commits at cs.uiuc.edu > http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits -------------- next part -------------- A non-text attachment was scrubbed... Name: smime.p7s Type: application/pkcs7-signature Size: 2555 bytes Desc: not available Url : http://lists.cs.uiuc.edu/pipermail/llvm-commits/attachments/20080401/b2275e6b/attachment.bin From evan.cheng at apple.com Tue Apr 1 02:33:13 2008 From: evan.cheng at apple.com (Evan Cheng) Date: Tue, 01 Apr 2008 07:33:13 -0000 Subject: [llvm-commits] [llvm] r49037 - /llvm/trunk/lib/Target/X86/X86InstrInfo.cpp Message-ID: <200804010733.m317XDpw021704@zion.cs.uiuc.edu> Author: evancheng Date: Tue Apr 1 02:33:13 2008 New Revision: 49037 URL: http://llvm.org/viewvc/llvm-project?rev=49037&view=rev Log: Disabling remat of load from gv stub (temporarily) again to fix llvmgcc bootstrap miscompare. Modified: llvm/trunk/lib/Target/X86/X86InstrInfo.cpp Modified: llvm/trunk/lib/Target/X86/X86InstrInfo.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/X86/X86InstrInfo.cpp?rev=49037&r1=49036&r2=49037&view=diff ============================================================================== --- llvm/trunk/lib/Target/X86/X86InstrInfo.cpp (original) +++ llvm/trunk/lib/Target/X86/X86InstrInfo.cpp Tue Apr 1 02:33:13 2008 @@ -752,7 +752,10 @@ /// isGVStub - Return true if the GV requires an extra load to get the /// real address. static inline bool isGVStub(GlobalValue *GV, X86TargetMachine &TM) { + return false; + /* Temporarily disabled. return TM.getSubtarget().GVRequiresExtraLoad(GV, TM, false); + */ } bool X86InstrInfo::isReallyTriviallyReMaterializable(MachineInstr *MI) const { From baldrick at free.fr Tue Apr 1 05:53:19 2008 From: baldrick at free.fr (Duncan Sands) Date: Tue, 1 Apr 2008 12:53:19 +0200 Subject: [llvm-commits] =?iso-8859-1?q?=5Bllvm-gcc-4=2E2=5D_r48608_-_in=09?= =?iso-8859-1?q?/llvm-gcc-4=2E2/trunk/gcc=3A_config/i386/llvm-i386-target?= =?iso-8859-1?q?=2Eh=09config/i386/llvm-i386=2Ecpp_config/rs6000/llvm-rs60?= =?iso-8859-1?q?00=2Ecpp=09config/rs6000/rs6000=2Eh_llvm-abi=2Eh_llvm-conv?= =?iso-8859-1?q?ert=2Ecpp?= In-Reply-To: <8D828044-847C-4EC8-B1AE-0E2991FA5037@apple.com> References: <200803201842.m2KIgwT9002122@zion.cs.uiuc.edu> <36997245-BEA4-402E-BFF2-3C14A689A98F@apple.com> <8D828044-847C-4EC8-B1AE-0E2991FA5037@apple.com> Message-ID: <200804011253.20380.baldrick@free.fr> > > This works on darwin (<4 x float> is used consistently). > > llvm_x86_should_pass_vector_in_integer_regs is all dependent on > > TARGET_MACHO and presumably shouldn't be, but it may not be as > > simple as removing TARGET_MACHO. > > Actually, I think I accidentally changed the behavior on Linux; 48988 > should put it back the way it was. Great - thanks. Duncan. From baldrick at free.fr Tue Apr 1 04:18:24 2008 From: baldrick at free.fr (Duncan Sands) Date: Tue, 1 Apr 2008 11:18:24 +0200 Subject: [llvm-commits] [llvm-gcc-4.2] r49017 - in /llvm-gcc-4.2/trunk/gcc: config/i386/llvm-i386-target.h config/i386/llvm-i386.cpp config/rs6000/llvm-rs6000.cpp config/rs6000/rs6000.h llvm-abi.h In-Reply-To: <200804010229.m312TWhV011299@zion.cs.uiuc.edu> References: <200804010229.m312TWhV011299@zion.cs.uiuc.edu> Message-ID: <200804011118.25704.baldrick@free.fr> Hi Devang, > +/* Returns true if TYPE should be pass as scalar. */ should be pass -> should be passed > +/* Returns true if TYPE should be pass as scalar. */ Likewise. > +// isAggregateFunctionParam - Return true if the specified GCC type > +// satisfies function.c:aggregate_value_p() > +static bool isAggregateFunctionParam(tree type) { > + if (TYPE_SIZE(type) && TREE_CODE(TYPE_SIZE(type)) == INTEGER_CST > + && !aggregate_value_p(type, current_function_decl)) Use of current_function_decl is bogus because the ABI logic is also used when calling a function, in which case it is the declaration of the callee that you need here! I understand that this is not your fault: the bug was already present in the original code. But since you seem to be working on this stuff, maybe you could fix this while there. Thanks, Duncan. From baldrick at free.fr Tue Apr 1 06:49:48 2008 From: baldrick at free.fr (Duncan Sands) Date: Tue, 1 Apr 2008 13:49:48 +0200 Subject: [llvm-commits] [llvm] r49006 - in /llvm/trunk/lib: CodeGen/DwarfWriter.cpp CodeGen/LLVMTargetMachine.cpp CodeGen/SelectionDAG/SelectionDAGISel.cpp Target/PowerPC/PPCAsmPrinter.cpp Target/PowerPC/PPCRegisterInfo.cpp Target/X86/X86AsmPrinter.cpp Target/X86/X86RegisterInfo.cpp Transforms/Utils/LowerInvoke.cpp In-Reply-To: <200803312340.m2VNeOu9005523@zion.cs.uiuc.edu> References: <200803312340.m2VNeOu9005523@zion.cs.uiuc.edu> Message-ID: <200804011349.49716.baldrick@free.fr> Hi Dale, > Emit exception handling info for functions which are > not marked nounwind, that doesn't sound right. As I had already explained to you in a private email, the dwarf info has two parts related to exception handling: the eh table, and frame moves info. If a function is nounwind then there is no need to generate the frame moves info. If a function has no invokes then there is no need to generate the eh table. These are independent. A nounwind function can have invokes (indeed this is quite common after optimization - see prune-eh), I see that Anton sent you an example. For such a function you should generate an EH table but no frame moves. If a nounwind function has no invokes then you can just not generate dwarf info at all (I'm ignoring debug intrinsics here, which in general require dwarf info). And if a not-nounwind function has no invokes then you don't have to generate an EH table. I think this is already the case (hopefully Anton will correct me if I'm wrong): we only generate an EH table if there is a personality function, and the only way to have a personality function is if there are invokes (it is also possible to have invokes without a personality, but since we don't know how to codegen those you can just ignore this). So I think all you need to do is this: make generation of frame moves optional. Generate frame moves for a function if and only if it is not-nounwind (or has debug intrinsics). If the function doesn't require frame moves or an EH table then don't generate a dwarf frame for it at all. > or for all functions when -enable-eh > is set, provided the target supports Dwarf EH. Presumably this is for debugging purposes? If so, how about making this a hidden option and renaming it to -debug-eh ? Otherwise people are going to think they need this for eh support. Which they don't, right? (If I understand you correctly, you've basically turned on eh support unconditionally). > llvm-gcc generates nounwind in the right places; other FEs > will need to do so also. Given such a FE, -enable-eh should > no longer be needed. > + /// shouldEmit - Per-function flag to indicate if EH information should > + /// be emitted. > bool shouldEmit; This is too crude. I think you need to distinguish between frame moves (= locating the values of variables) and the EH table (matching exceptions to actions). So you need two variables here. > + if ((ExceptionHandling || !MF->getFunction()->doesNotThrow()) && > TAI->doesSupportExceptionHandling()) { > shouldEmit = true; This looks badly wrong: you just broke nounwind functions that contain invokes. > - if (!ExceptionHandling) > - PM.add(createLowerInvokePass(getTargetLowering())); > + PM.add(createLowerInvokePass(getTargetLowering())); Does this mean that you just lowered all exception handling to setjmp/longjmp? Hopefully not, but I vaguely recall from the last time I looked at this stuff that it is surprisingly easy to make a mistake here. > - if (!ExceptionHandling) > - PM.add(createLowerInvokePass(getTargetLowering())); > + PM.add(createLowerInvokePass(getTargetLowering())); Likewise. > + // Figure out whether we need to generate EH info. Currently we do this for > + // all functions not marked no-unwind, or if requested via -enable-eh. > + needsExceptionHandling = ExceptionHandling || !Fn.doesNotThrow(); This is wrong, see above. There's already a test somewhere that only outputs the EH table if there is a personality function. > case Intrinsic::eh_exception: { > - if (ExceptionHandling) { > + if (FuncInfo.needsExceptionHandling) { This is backwards. If a function has invokes then it requires an EH table. The only way to get the eh_exception intrinsic is to have an invoke. Thus if you see eh_exception then the function has an invoke so for sure you want to lower it (unless eh has been globally turned off, which is what the previous test was for). There should be no test here. You should really just substitute "true" for ExceptionHandling everywhere... > - if (ExceptionHandling && MMI) { > + if (FuncInfo.needsExceptionHandling && MMI) { Likewise for all the other examples of this. > - if (LandingPad && ExceptionHandling && MMI) { > + if (LandingPad && FuncInfo.needsExceptionHandling && MMI) { > // Insert a label before the invoke call to mark the try range. This can be Likewise: you're only getting here if you have an invoke, so no test is needed (see below also). > bool LowerInvoke::runOnFunction(Function &F) { > + // If we will be generating exception info, don't do anything here. > + if ((ExceptionHandling || !F.doesNotThrow()) && > + TLI && > + TLI->getTargetMachine().getTargetAsmInfo()-> > + doesSupportExceptionHandling()) > + return false; The !F.doesNotThrow() test is bogus. Also, what is ExceptionHandling doing here? Shouldn't the test be: do this if -enable-correct-eh-support was specified and the target does not support exception handling? Ciao, Duncan. From romix.llvm at googlemail.com Tue Apr 1 08:23:17 2008 From: romix.llvm at googlemail.com (Roman Levenstein) Date: Tue, 1 Apr 2008 14:23:17 +0100 Subject: [llvm-commits] Speeding up instruction selection In-Reply-To: <84648A85-6EB1-4FE5-96B4-749BD5A8D938@apple.com> References: <97188DDC-093E-4733-B8A2-7B30B6684DE1@apple.com> <00FB5805-1FA5-4534-BBD0-E6E34EC17BF1@apple.com> <84648A85-6EB1-4FE5-96B4-749BD5A8D938@apple.com> Message-ID: Hi Dan, 2008/4/1, Dan Gohman : > > On Mar 26, 2008, at 12:19 PM, Roman Levenstein wrote: > > > > > Evan played with it, but there was a problem with 176.gcc (which is > > probably unrelated) and somehow the review is stuck at the moment. > > > Hi Roman, > > I believe we've finally resolved the 176.gcc problem! One of Evan's > coalescer fixes, 48752, allows 176.gcc to pass, even with your queue > ordering patch applied. > > Thanks for your patience while we investigated this. These are good news. How do we proceed with that patch? -Roman From baldrick at free.fr Tue Apr 1 04:08:56 2008 From: baldrick at free.fr (Duncan Sands) Date: Tue, 1 Apr 2008 11:08:56 +0200 Subject: [llvm-commits] [llvm] r49003 - in /llvm/trunk/test/CodeGen: PowerPC/fold-li.ll PowerPC/reg-coalesce-simple.ll PowerPC/rotl-2.ll X86/2006-03-02-InstrSchedBug.ll X86/2006-05-02-InstrSched1.ll X86/2006-05-02-InstrSched2.ll X86/2006-05-11-InstrSched.ll X86/constant-pool-remat-0.ll X86/iabs.ll X86/or-branch.ll X86/select.ll X86/setuge.ll X86/x86-64-mem.ll X86/zero-remat.ll In-Reply-To: <200803312320.m2VNKAdJ004885@zion.cs.uiuc.edu> References: <200803312320.m2VNKAdJ004885@zion.cs.uiuc.edu> Message-ID: <200804011108.56894.baldrick@free.fr> Hi Dale, > Mark functions in some tests as 'nounwind'. Generating > EH info for these functions causes the tests to fail for > random reasons (e.g. looking for 'or' or counting lines > with asm-printer; labels count as lines.) when you talk of extra labels, do you mean labels in the DAG, or labels output in the assembler? The reason I ask is that some time ago I managed to eliminate generation of exception handling labels in the DAG when they weren't actually needed, so I was wondering if pointless labels have managed to creep back in somehow. Ciao, Duncan. From dpatel at apple.com Tue Apr 1 11:14:12 2008 From: dpatel at apple.com (Devang Patel) Date: Tue, 1 Apr 2008 09:14:12 -0700 Subject: [llvm-commits] [llvm-gcc-4.2] r49015 - in /llvm-gcc-4.2/trunk/gcc: config/i386/llvm-i386-target.h llvm-abi.h In-Reply-To: <9E26F41C-9E87-43D2-AD13-5A485AA4D103@apple.com> References: <200804010202.m3122jvQ010566@zion.cs.uiuc.edu> <9E26F41C-9E87-43D2-AD13-5A485AA4D103@apple.com> Message-ID: <5AFDD946-8E2B-44B4-AD34-C0C8CA8C50CC@apple.com> On Mar 31, 2008, at 8:29 PM, Dale Johannesen wrote: > On Mar 31, 2008, at 7:02 PM, Devang Patel wrote: > >> Author: dpatel >> Date: Mon Mar 31 21:02:44 2008 >> New Revision: 49015 >> >> URL: http://llvm.org/viewvc/llvm-project?rev=49015&view=rev >> Log: >> s/LLVM_SHOULD_RETURN_STRUCT_AS_SCALAR/ >> LLVM_SHOULD_RETURN_SELT_STRUCT_AS_SCALAR/g > > I don't like this one. Structs that are returned as scalars are not, > in fact, always single-element. True, but this hook explicitly checks single-element. So it is a good idea to rename the hook to make this clear. - Devang -------------- next part -------------- An HTML attachment was scrubbed... URL: http://lists.cs.uiuc.edu/pipermail/llvm-commits/attachments/20080401/c07eb608/attachment.html From evan.cheng at apple.com Tue Apr 1 11:56:27 2008 From: evan.cheng at apple.com (Evan Cheng) Date: Tue, 1 Apr 2008 09:56:27 -0700 Subject: [llvm-commits] Speeding up instruction selection In-Reply-To: References: <97188DDC-093E-4733-B8A2-7B30B6684DE1@apple.com> <00FB5805-1FA5-4534-BBD0-E6E34EC17BF1@apple.com> <84648A85-6EB1-4FE5-96B4-749BD5A8D938@apple.com> Message-ID: <039F7990-10A9-4153-A91B-024551DF3541@apple.com> Please hold off checking it in for a bit. llvm tot is having some problems and I'd like to get to the bottom of it first. Also, the tie breaker is less than ideal. I think we need a tie- breaker that is "the SUnit that's added to the queue is preferred". That means it prefers nodes which are closer to the end of block. What do you think? Evan On Apr 1, 2008, at 6:23 AM, Roman Levenstein wrote: > Hi Dan, > > 2008/4/1, Dan Gohman : >> >> On Mar 26, 2008, at 12:19 PM, Roman Levenstein wrote: >>> >> >>> Evan played with it, but there was a problem with 176.gcc (which is >>> probably unrelated) and somehow the review is stuck at the moment. >> >> >> Hi Roman, >> >> I believe we've finally resolved the 176.gcc problem! One of Evan's >> coalescer fixes, 48752, allows 176.gcc to pass, even with your queue >> ordering patch applied. >> >> Thanks for your patience while we investigated this. > > These are good news. How do we proceed with that patch? > > -Roman > _______________________________________________ > llvm-commits mailing list > llvm-commits at cs.uiuc.edu > http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits From evan.cheng at apple.com Tue Apr 1 11:58:04 2008 From: evan.cheng at apple.com (Evan Cheng) Date: Tue, 1 Apr 2008 09:58:04 -0700 Subject: [llvm-commits] [llvm-gcc-4.2] r49015 - in /llvm-gcc-4.2/trunk/gcc: config/i386/llvm-i386-target.h llvm-abi.h In-Reply-To: <5AFDD946-8E2B-44B4-AD34-C0C8CA8C50CC@apple.com> References: <200804010202.m3122jvQ010566@zion.cs.uiuc.edu> <9E26F41C-9E87-43D2-AD13-5A485AA4D103@apple.com> <5AFDD946-8E2B-44B4-AD34-C0C8CA8C50CC@apple.com> Message-ID: <72BD293A-4F1E-4DE1-8439-1546A7977F25@apple.com> I agree with Dale. While the implementation of the hook currently checks for single element struct, it doesn't have to stay that way. The former name more clearly spells out its semantics in my opinion. Evan On Apr 1, 2008, at 9:14 AM, Devang Patel wrote: > > On Mar 31, 2008, at 8:29 PM, Dale Johannesen wrote: >> On Mar 31, 2008, at 7:02 PM, Devang Patel wrote: >> >>> Author: dpatel >>> Date: Mon Mar 31 21:02:44 2008 >>> New Revision: 49015 >>> >>> URL: http://llvm.org/viewvc/llvm-project?rev=49015&view=rev >>> Log: >>> s/LLVM_SHOULD_RETURN_STRUCT_AS_SCALAR/ >>> LLVM_SHOULD_RETURN_SELT_STRUCT_AS_SCALAR/g >> >> I don't like this one. Structs that are returned as scalars are not, >> in fact, always single-element. > > True, but this hook explicitly checks single-element. So it is a > good idea to rename the hook to make this clear. > > - > Devang > _______________________________________________ > llvm-commits mailing list > llvm-commits at cs.uiuc.edu > http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits -------------- next part -------------- An HTML attachment was scrubbed... URL: http://lists.cs.uiuc.edu/pipermail/llvm-commits/attachments/20080401/6c1ba62b/attachment.html From baldrick at free.fr Tue Apr 1 12:05:40 2008 From: baldrick at free.fr (Duncan Sands) Date: Tue, 01 Apr 2008 17:05:40 -0000 Subject: [llvm-commits] [llvm-gcc-4.2] r49038 - in /llvm-gcc-4.2/trunk/gcc: llvm-abi.h llvm-convert.cpp llvm-types.cpp Message-ID: <200804011705.m31H5elq013011@zion.cs.uiuc.edu> Author: baldrick Date: Tue Apr 1 12:05:39 2008 New Revision: 49038 URL: http://llvm.org/viewvc/llvm-project?rev=49038&view=rev Log: Rework call-argument handling so that it is entirely driven by the ABI. That way there is no longer any need for logic about vectors and by-invisible-reference parameters to be duplicated in EmitCallOf. Modified: llvm-gcc-4.2/trunk/gcc/llvm-abi.h llvm-gcc-4.2/trunk/gcc/llvm-convert.cpp llvm-gcc-4.2/trunk/gcc/llvm-types.cpp Modified: llvm-gcc-4.2/trunk/gcc/llvm-abi.h URL: http://llvm.org/viewvc/llvm-project/llvm-gcc-4.2/trunk/gcc/llvm-abi.h?rev=49038&r1=49037&r2=49038&view=diff ============================================================================== --- llvm-gcc-4.2/trunk/gcc/llvm-abi.h (original) +++ llvm-gcc-4.2/trunk/gcc/llvm-abi.h Tue Apr 1 12:05:39 2008 @@ -73,9 +73,13 @@ void HandleScalarShadowArgument(const PointerType *PtrArgTy, bool RetPtr) {} - /// HandleScalarArgument - This is the primary callback that specifies an LLVM - /// argument to pass. - void HandleScalarArgument(const llvm::Type *LLVMTy, tree argTreeType) {} + /// HandleScalarArgument - This is the primary callback that specifies an + /// LLVM argument to pass. It is only used for first class types. + void HandleScalarArgument(const llvm::Type *LLVMTy, tree type) {} + + /// HandleByInvisibleReferenceArgument - This callback is invoked if a pointer + /// (of type PtrTy) to the argument is passed rather than the argument itself. + void HandleByInvisibleReferenceArgument(const llvm::Type *PtrTy, tree type) {} /// HandleByValArgument - This callback is invoked if the aggregate function /// argument is passed by value. @@ -331,7 +335,7 @@ // not include variable sized fields here. std::vector Elts; if (isPassedByInvisibleReference(type)) { // variable size -> by-ref. - C.HandleScalarArgument(PointerType::getUnqual(Ty), type); + C.HandleByInvisibleReferenceArgument(PointerType::getUnqual(Ty), type); } else if (Ty->getTypeID()==Type::VectorTyID) { if (LLVM_SHOULD_PASS_VECTOR_IN_INTEGER_REGS(type)) { PassInIntegerRegisters(type, Ty); Modified: llvm-gcc-4.2/trunk/gcc/llvm-convert.cpp URL: http://llvm.org/viewvc/llvm-project/llvm-gcc-4.2/trunk/gcc/llvm-convert.cpp?rev=49038&r1=49037&r2=49038&view=diff ============================================================================== --- llvm-gcc-4.2/trunk/gcc/llvm-convert.cpp (original) +++ llvm-gcc-4.2/trunk/gcc/llvm-convert.cpp Tue Apr 1 12:05:39 2008 @@ -2282,40 +2282,66 @@ /// definition for this target to figure out how to pass arguments into the /// stack/regs for a function call. struct FunctionCallArgumentConversion : public DefaultABIClient { - tree CallExpression; SmallVector &CallOperands; - CallingConv::ID &CallingConvention; - LLVMBuilder &Builder; + SmallVector LocStack; + const FunctionType *FTy; const MemRef *DestLoc; + bool useReturnSlot; + LLVMBuilder &Builder; + Value *TheValue; MemRef RetBuf; - std::vector LocStack; bool isShadowRet; - FunctionCallArgumentConversion(tree exp, SmallVector &ops, - CallingConv::ID &cc, - LLVMBuilder &b, const MemRef *destloc) - : CallExpression(exp), CallOperands(ops), CallingConvention(cc), - Builder(b), DestLoc(destloc), isShadowRet(false) { - CallingConvention = CallingConv::C; -#ifdef TARGET_ADJUST_LLVM_CC - tree ftype; - if (tree fdecl = get_callee_fndecl(exp)) { - ftype = TREE_TYPE(fdecl); - } else { - ftype = TREE_TYPE(TREE_OPERAND(exp,0)); + FunctionCallArgumentConversion(SmallVector &ops, + const FunctionType *FnTy, + const MemRef *destloc, + bool ReturnSlotOpt, + LLVMBuilder &b) + : CallOperands(ops), FTy(FnTy), DestLoc(destloc), + useReturnSlot(ReturnSlotOpt), Builder(b), isShadowRet(false) { } + + // Push the address of an argument. + void pushAddress(Value *Loc) { + assert(Loc && "Invalid location!"); + LocStack.push_back(Loc); + } + + // Push the value of an argument. + void pushValue(Value *V) { + assert(LocStack.empty() && "Value only allowed at top level!"); + LocStack.push_back(NULL); + TheValue = V; + } - // If it's call to pointer, we look for the function type. - if (TREE_CODE(ftype) == POINTER_TYPE) - ftype = TREE_TYPE(ftype); + // Get the address of the current location. + Value *getAddress(void) { + assert(!LocStack.empty()); + Value *&Loc = LocStack.back(); + if (!Loc) { + // A value. Store to a temporary, and return the temporary's address. + // Any future access to this argument will reuse the same address. + Loc = TheTreeToLLVM->CreateTemporary(TheValue->getType()); + Builder.CreateStore(TheValue, Loc); } - - TARGET_ADJUST_LLVM_CC(CallingConvention, ftype); -#endif + return Loc; } - - void setLocation(Value *Loc) { - LocStack.push_back(Loc); + + // Get the value of the current location (of type Ty). + Value *getValue(const Type *Ty) { + assert(!LocStack.empty()); + Value *Loc = LocStack.back(); + if (Loc) { + // An address. Convert to the right type and load the value out. + if (Loc->getType() != PointerType::getUnqual(Ty)) + Loc = Builder.CreateBitCast(Loc, PointerType::getUnqual(Ty), "tmp"); + return Builder.CreateLoad(Loc, "val"); + } else { + // A value - just return it. + assert(TheValue->getType() == Ty && "Value not of expected type!"); + return TheValue; + } } + void clear() { assert(LocStack.size() == 1 && "Imbalance!"); LocStack.clear(); @@ -2349,7 +2375,7 @@ assert(DestLoc == 0 && "Call returns a scalar but caller expects aggregate!"); } - + /// HandleAggregateResultAsScalar - This callback is invoked if the function /// returns an aggregate value by bit converting it to the specified scalar /// type and returning that. @@ -2371,7 +2397,7 @@ // The result is unused, but still needs to be stored somewhere. Value *Buf = TheTreeToLLVM->CreateTemporary(PtrArgTy->getElementType()); CallOperands.push_back(Buf); - } else if (CALL_EXPR_RETURN_SLOT_OPT(CallExpression)) { + } else if (useReturnSlot) { // Letting the call write directly to the final destination is safe and // may be required. Do not use a buffer. CallOperands.push_back(DestLoc->Ptr); @@ -2387,6 +2413,10 @@ isShadowRet = true; } + /// HandleScalarShadowArgument - This callback is invoked if the function + /// returns a scalar value by using a "shadow" first parameter, which is a + /// pointer to the scalar, of type PtrArgTy. If RetPtr is set to true, + /// the pointer argument itself is returned from the function. void HandleScalarShadowArgument(const PointerType *PtrArgTy, bool RetPtr) { assert(DestLoc == 0 && "Call returns a scalar but caller expects aggregate!"); @@ -2399,36 +2429,54 @@ isShadowRet = true; } + /// HandleScalarArgument - This is the primary callback that specifies an + /// LLVM argument to pass. It is only used for first class types. void HandleScalarArgument(const llvm::Type *LLVMTy, tree type) { - assert(!LocStack.empty()); - Value *Loc = LocStack.back(); - if (cast(Loc->getType())->getElementType() != LLVMTy) - // This always deals with pointer types so BitCast is appropriate - Loc = Builder.CreateBitCast(Loc, PointerType::getUnqual(LLVMTy), "tmp"); - - CallOperands.push_back(Builder.CreateLoad(Loc, "tmp")); + Value *Loc = getValue(LLVMTy); + + // Perform any implicit type conversions. + if (CallOperands.size() < FTy->getNumParams()) { + const Type *CalledTy = FTy->getParamType(CallOperands.size()); + if (Loc->getType() != CalledTy) { + assert(type && "Inconsistent parameter types?"); + bool isSigned = !TYPE_UNSIGNED(type); + Loc = TheTreeToLLVM->CastToAnyType(Loc, isSigned, CalledTy, false); + } + } + + CallOperands.push_back(Loc); } - + + /// HandleByInvisibleReferenceArgument - This callback is invoked if a pointer + /// (of type PtrTy) to the argument is passed rather than the argument itself. + void HandleByInvisibleReferenceArgument(const llvm::Type *PtrTy, tree type){ + Value *Loc = getAddress(); + if (Loc->getType() != PtrTy) + Loc = Builder.CreateBitCast(Loc, PtrTy, "tmp"); + CallOperands.push_back(Loc); + } + /// HandleByValArgument - This callback is invoked if the aggregate function /// argument is passed by value. It is lowered to a parameter passed by /// reference with an additional parameter attribute "ByVal". void HandleByValArgument(const llvm::Type *LLVMTy, tree type) { - assert(!LocStack.empty()); - Value *Loc = LocStack.back(); + Value *Loc = getAddress(); assert(PointerType::getUnqual(LLVMTy) == Loc->getType()); CallOperands.push_back(Loc); } + /// EnterField - Called when we're about the enter the field of a struct + /// or union. FieldNo is the number of the element we are entering in the + /// LLVM Struct, StructTy is the LLVM type of the struct we are entering. void EnterField(unsigned FieldNo, const llvm::Type *StructTy) { - Value *Loc = LocStack.back(); - if (cast(Loc->getType())->getElementType() != StructTy) - // This always deals with pointer types so BitCast is appropriate - Loc = Builder.CreateBitCast(Loc, PointerType::getUnqual(StructTy), + Value *Loc = getAddress(); + if (Loc->getType() != PointerType::getUnqual(StructTy)) + Loc = Builder.CreateBitCast(Loc, PointerType::getUnqual(StructTy), "tmp"); - - LocStack.push_back(Builder.CreateStructGEP(Loc, FieldNo, "tmp")); + pushAddress(Builder.CreateStructGEP(Loc, FieldNo, "elt")); } void ExitField() { + assert(!LocStack.empty()); LocStack.pop_back(); } }; @@ -2445,6 +2493,7 @@ if (PAL.isEmpty() && isa(Callee)) PAL = cast(Callee)->getParamAttrs(); + // Work out whether to use an invoke or an ordinary call. if (!tree_could_throw_p(exp)) // This call does not throw - mark it 'nounwind'. PAL = PAL.addAttr(0, ParamAttr::NoUnwind); @@ -2474,15 +2523,26 @@ } } + tree fndecl = get_callee_fndecl(exp); + tree fntype = fndecl ? + TREE_TYPE(fndecl) : TREE_TYPE (TREE_TYPE(TREE_OPERAND (exp, 0))); + + // Determine the calling convention. + CallingConv::ID CallingConvention = CallingConv::C; +#ifdef TARGET_ADJUST_LLVM_CC + TARGET_ADJUST_LLVM_CC(CallingConvention, fntype); +#endif + SmallVector CallOperands; - CallingConv::ID CallingConvention; - FunctionCallArgumentConversion Client(exp, CallOperands, CallingConvention, - Builder, DestLoc); + const PointerType *PFTy = cast(Callee->getType()); + const FunctionType *FTy = cast(PFTy->getElementType()); + FunctionCallArgumentConversion Client(CallOperands, FTy, DestLoc, + CALL_EXPR_RETURN_SLOT_OPT(exp), + Builder); TheLLVMABI ABIConverter(Client); // Handle the result, including struct returns. - tree fndecl = get_callee_fndecl(exp); - ABIConverter.HandleReturnType(TREE_TYPE(exp), + ABIConverter.HandleReturnType(TREE_TYPE(exp), fndecl ? DECL_BUILT_IN(fndecl) : false); // Pass the static chain, if any, as the first parameter. @@ -2490,52 +2550,26 @@ CallOperands.push_back(Emit(TREE_OPERAND(exp, 2), 0)); // Loop over the arguments, expanding them and adding them to the op list. - const PointerType *PFTy = cast(Callee->getType()); - const FunctionType *FTy = cast(PFTy->getElementType()); for (tree arg = TREE_OPERAND(exp, 1); arg; arg = TREE_CHAIN(arg)) { - const Type *ActualArgTy = ConvertType(TREE_TYPE(TREE_VALUE(arg))); - const Type *ArgTy = ActualArgTy; - if (CallOperands.size() < FTy->getNumParams()) - ArgTy = FTy->getParamType(CallOperands.size()); - - // If we are implicitly passing the address of this argument instead of - // passing it by value, handle this first. - if (isPassedByInvisibleReference(TREE_TYPE(TREE_VALUE(arg)))) { - // Get the address of the parameter passed in. - LValue ArgVal = EmitLV(TREE_VALUE(arg)); - assert(!ArgVal.isBitfield() && "Bitfields shouldn't be invisible refs!"); - Value *Ptr = ArgVal.Ptr; - - if (CallOperands.size() >= FTy->getNumParams()) - ArgTy = PointerType::getUnqual(ArgTy); - CallOperands.push_back(BitCastToType(Ptr, ArgTy)); - } else if (ActualArgTy->isFirstClassType()) { - Value *V = Emit(TREE_VALUE(arg), 0); - if (TREE_CODE(TREE_TYPE(TREE_VALUE(arg)))==VECTOR_TYPE && - LLVM_SHOULD_PASS_VECTOR_IN_INTEGER_REGS(TREE_TYPE(TREE_VALUE(arg)))) { - // Passed as integer registers. We need a stack object, not a value. - MemRef NewLoc = CreateTempLoc(ConvertType(TREE_TYPE(TREE_VALUE(arg)))); - StoreInst *St = Builder.CreateStore(V, NewLoc.Ptr, false); - Client.setLocation(NewLoc.Ptr); - ParameterAttributes Attributes = ParamAttr::None; - ABIConverter.HandleArgument(TREE_TYPE(TREE_VALUE(arg)), &Attributes); - if (Attributes != ParamAttr::None) - PAL = PAL.addAttr(CallOperands.size(), Attributes); - } else { - bool isSigned = !TYPE_UNSIGNED(TREE_TYPE(TREE_VALUE(arg))); - CallOperands.push_back(CastToAnyType(V, isSigned, ArgTy, false)); - } + const Type *ArgTy = ConvertType(TREE_TYPE(TREE_VALUE(arg))); + + // Push the argument. + if (ArgTy->isFirstClassType()) { + // A scalar - push the value. + Client.pushValue(Emit(TREE_VALUE(arg), 0)); } else { - // If this is an aggregate value passed by-value, use the current ABI to - // determine how the parameters are passed. - LValue LV = EmitLV(TREE_VALUE(arg)); - assert(!LV.isBitfield() && "Bitfields are first-class types!"); - Client.setLocation(LV.Ptr); - ParameterAttributes Attributes = ParamAttr::None; - ABIConverter.HandleArgument(TREE_TYPE(TREE_VALUE(arg)), &Attributes); - if (Attributes != ParamAttr::None) - PAL = PAL.addAttr(CallOperands.size(), Attributes); + // An aggregate - push the address. + LValue ArgVal = EmitLV(TREE_VALUE(arg)); + assert(!ArgVal.isBitfield() && "Bitfields are first-class types!"); + Client.pushAddress(ArgVal.Ptr); } + + ParameterAttributes Attributes = ParamAttr::None; + ABIConverter.HandleArgument(TREE_TYPE(TREE_VALUE(arg)), &Attributes); + if (Attributes != ParamAttr::None) + PAL = PAL.addAttr(CallOperands.size(), Attributes); + + Client.clear(); } // Compile stuff like: Modified: llvm-gcc-4.2/trunk/gcc/llvm-types.cpp URL: http://llvm.org/viewvc/llvm-project/llvm-gcc-4.2/trunk/gcc/llvm-types.cpp?rev=49038&r1=49037&r2=49038&view=diff ============================================================================== --- llvm-gcc-4.2/trunk/gcc/llvm-types.cpp (original) +++ llvm-gcc-4.2/trunk/gcc/llvm-types.cpp Tue Apr 1 12:05:39 2008 @@ -995,6 +995,12 @@ ArgTypes.push_back(LLVMTy); } + /// HandleByInvisibleReferenceArgument - This callback is invoked if a pointer + /// (of type PtrTy) to the argument is passed rather than the argument itself. + void HandleByInvisibleReferenceArgument(const llvm::Type *PtrTy, tree type) { + ArgTypes.push_back(PtrTy); + } + /// HandleByValArgument - This callback is invoked if the aggregate function /// argument is passed by value. It is lowered to a parameter passed by /// reference with an additional parameter attribute "ByVal". From dalej at apple.com Tue Apr 1 12:14:44 2008 From: dalej at apple.com (Dale Johannesen) Date: Tue, 1 Apr 2008 10:14:44 -0700 Subject: [llvm-commits] [llvm] r49006 - in /llvm/trunk/lib: CodeGen/DwarfWriter.cpp CodeGen/LLVMTargetMachine.cpp CodeGen/SelectionDAG/SelectionDAGISel.cpp Target/PowerPC/PPCAsmPrinter.cpp Target/PowerPC/PPCRegisterInfo.cpp Target/X86/X86AsmPrinter.cpp Target/X86/X86RegisterInfo.cpp Transforms/Utils/LowerInvoke.cpp In-Reply-To: <1207029245.16812.433.camel@asl.dorms.spbu.ru> References: <200803312340.m2VNeOu9005523@zion.cs.uiuc.edu> <1207029245.16812.433.camel@asl.dorms.spbu.ru> Message-ID: <3827336E-9836-4D08-AD1C-D787E7BFA52B@apple.com> On Mar 31, 2008, at 10:54 PM, Anton Korobeynikov wrote: > Dale, > >> Emit exception handling info for functions which are >> not marked nounwind, or for all functions when -enable-eh >> is set, provided the target supports Dwarf EH. > Is this correct? Nounwind function can easily require EH information, > for example: > > void foo() { > try { > bar(); > } catch(...) { > baz(); > } > } > > foo() can be marked as nounwind, but it requires EH info to be > emitted. Hmm. llvm-gcc does not, in fact, mark foo() as nounwind. "nounwind" is derived from gcc's attribute TREE_NOTHROW, defined as: /* In a FUNCTION_DECL, nonzero means a call to the function cannot throw an exception. In a CALL_EXPR, nonzero means the call cannot throw. */ That looks semantically the same as "nounwind", and the code in cp that sets TREE_NOTHROW seems to be trying to follow this description. So it may be this is working because of a compensating bug in llvm-gcc. I'll look further. It does seem to me that "needs EH info" is a more useful bit of information than the current defined semantics. From baldrick at free.fr Tue Apr 1 12:18:08 2008 From: baldrick at free.fr (Duncan Sands) Date: Tue, 1 Apr 2008 19:18:08 +0200 Subject: [llvm-commits] [llvm-gcc-4.2] r48608 - in /llvm-gcc-4.2/trunk/gcc: config/i386/llvm-i386-target.h config/i386/llvm-i386.cpp config/rs6000/llvm-rs6000.cpp config/rs6000/rs6000.h llvm-abi.h llvm-convert.cpp In-Reply-To: <200803251803.53233.baldrick@free.fr> References: <200803201842.m2KIgwT9002122@zion.cs.uiuc.edu> <200803202054.04966.baldrick@free.fr> <200803251803.53233.baldrick@free.fr> Message-ID: <200804011918.12001.baldrick@free.fr> Hi Dale, I've cleaned up the argument passing part in commit 49038. Can you please check that this works for you. Thanks, Duncan. From dalej at apple.com Tue Apr 1 12:20:21 2008 From: dalej at apple.com (Dale Johannesen) Date: Tue, 1 Apr 2008 10:20:21 -0700 Subject: [llvm-commits] [llvm-gcc-4.2] r48608 - in /llvm-gcc-4.2/trunk/gcc: config/i386/llvm-i386-target.h config/i386/llvm-i386.cpp config/rs6000/llvm-rs6000.cpp config/rs6000/rs6000.h llvm-abi.h llvm-convert.cpp In-Reply-To: <200804011918.12001.baldrick@free.fr> References: <200803201842.m2KIgwT9002122@zion.cs.uiuc.edu> <200803202054.04966.baldrick@free.fr> <200803251803.53233.baldrick@free.fr> <200804011918.12001.baldrick@free.fr> Message-ID: <5F629C4A-DA01-4781-9272-1495ADD793CF@apple.com> On Apr 1, 2008, at 10:18 AM, Duncan Sands wrote: > Hi Dale, I've cleaned up the argument passing part > in commit 49038. Can you please check that this > works for you. Eventually, yes. The breakage I was talking about before is not cleaned up yet, so I can't do it immediately. From clattner at apple.com Tue Apr 1 12:40:28 2008 From: clattner at apple.com (Chris Lattner) Date: Tue, 1 Apr 2008 10:40:28 -0700 Subject: [llvm-commits] [llvm] r49006 - in /llvm/trunk/lib: CodeGen/DwarfWriter.cpp CodeGen/LLVMTargetMachine.cpp CodeGen/SelectionDAG/SelectionDAGISel.cpp Target/PowerPC/PPCAsmPrinter.cpp Target/PowerPC/PPCRegisterInfo.cpp Target/X86/X86AsmPrinter.cpp Target/X86/X86RegisterInfo.cpp Transforms/Utils/LowerInvoke.cpp In-Reply-To: <3827336E-9836-4D08-AD1C-D787E7BFA52B@apple.com> References: <200803312340.m2VNeOu9005523@zion.cs.uiuc.edu> <1207029245.16812.433.camel@asl.dorms.spbu.ru> <3827336E-9836-4D08-AD1C-D787E7BFA52B@apple.com> Message-ID: <75025401-0C0F-41FC-8A6B-BC20F56F5FCA@apple.com> On Apr 1, 2008, at 10:14 AM, Dale Johannesen wrote: > > On Mar 31, 2008, at 10:54 PM, Anton Korobeynikov wrote: > >> Dale, >> >>> Emit exception handling info for functions which are >>> not marked nounwind, or for all functions when -enable-eh >>> is set, provided the target supports Dwarf EH. >> Is this correct? Nounwind function can easily require EH information, >> for example: >> >> void foo() { >> try { >> bar(); >> } catch(...) { >> baz(); >> } >> } >> >> foo() can be marked as nounwind, but it requires EH info to be >> emitted. > > Hmm. llvm-gcc does not, in fact, mark foo() as nounwind. In this case, that is because baz() could throw. Try: int foo() { try { bar(); } catch(...) { return 17 } return 42; } > > > "nounwind" is derived from gcc's attribute TREE_NOTHROW, defined as: > /* In a FUNCTION_DECL, nonzero means a call to the function cannot > throw > an exception. In a CALL_EXPR, nonzero means the call cannot > throw. */ > > That looks semantically the same as "nounwind", and the code in cp > that sets TREE_NOTHROW > seems to be trying to follow this description. So it may be this is > working because of a compensating > bug in llvm-gcc. I'll look further. > > It does seem to me that "needs EH info" is a more useful bit of > information than the current defined semantics. > > _______________________________________________ > llvm-commits mailing list > llvm-commits at cs.uiuc.edu > http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits From dalej at apple.com Tue Apr 1 12:49:27 2008 From: dalej at apple.com (Dale Johannesen) Date: Tue, 1 Apr 2008 10:49:27 -0700 Subject: [llvm-commits] [llvm] r49006 - in /llvm/trunk/lib: CodeGen/DwarfWriter.cpp CodeGen/LLVMTargetMachine.cpp CodeGen/SelectionDAG/SelectionDAGISel.cpp Target/PowerPC/PPCAsmPrinter.cpp Target/PowerPC/PPCRegisterInfo.cpp Target/X86/X86AsmPrinter.cpp Target/X86/X86RegisterInfo.cpp Transforms/Utils/LowerInvoke.cpp In-Reply-To: <75025401-0C0F-41FC-8A6B-BC20F56F5FCA@apple.com> References: <200803312340.m2VNeOu9005523@zion.cs.uiuc.edu> <1207029245.16812.433.camel@asl.dorms.spbu.ru> <3827336E-9836-4D08-AD1C-D787E7BFA52B@apple.com> <75025401-0C0F-41FC-8A6B-BC20F56F5FCA@apple.com> Message-ID: <9619FEA7-CC30-4FB2-94B0-D9F4F37BE40F@apple.com> On Apr 1, 2008, at 10:40 AM, Chris Lattner wrote: >> >> Hmm. llvm-gcc does not, in fact, mark foo() as nounwind. > > In this case, that is because baz() could throw. Try: > > int foo() { > try { > bar(); > } catch(...) { > return 17 > } > return 42; > } llvm-gcc still does not mark foo as nounwind. From evan.cheng at apple.com Tue Apr 1 12:49:48 2008 From: evan.cheng at apple.com (Evan Cheng) Date: Tue, 01 Apr 2008 17:49:48 -0000 Subject: [llvm-commits] [test-suite] r49039 - /test-suite/trunk/MultiSource/Applications/sqlite3/Makefile Message-ID: <200804011749.m31HnmM2014303@zion.cs.uiuc.edu> Author: evancheng Date: Tue Apr 1 12:49:48 2008 New Revision: 49039 URL: http://llvm.org/viewvc/llvm-project?rev=49039&view=rev Log: Unbreak sqlite when objdir == srcdir. This hopefully allow objdir != srcdir to work as well. Modified: test-suite/trunk/MultiSource/Applications/sqlite3/Makefile Modified: test-suite/trunk/MultiSource/Applications/sqlite3/Makefile URL: http://llvm.org/viewvc/llvm-project/test-suite/trunk/MultiSource/Applications/sqlite3/Makefile?rev=49039&r1=49038&r2=49039&view=diff ============================================================================== --- test-suite/trunk/MultiSource/Applications/sqlite3/Makefile (original) +++ test-suite/trunk/MultiSource/Applications/sqlite3/Makefile Tue Apr 1 12:49:48 2008 @@ -1,5 +1,4 @@ LEVEL = ../../../ -#RUN_OPTIONS = Source = sqlite3.c shell.c @@ -17,10 +16,10 @@ # the input files are generated from a tcl script # it needs to be generated before sqlite is run -$(SourceDir)/sqlite3.c: test15.sql +sqlite3.c: $(PROJ_SRC_DIR)/test15.sql -test15.sql: $(SourceDir)/speedtest.tcl - $(TCLSH) $< +$(PROJ_SRC_DIR)/test15.sql: $(PROJ_SRC_DIR)/speedtest.tcl + $(TCLSH) $(PROJ_SRC_DIR)/speedtest.tcl clean:: rm -f test*.sql From sabre at nondot.org Tue Apr 1 13:02:36 2008 From: sabre at nondot.org (Chris Lattner) Date: Tue, 01 Apr 2008 18:02:36 -0000 Subject: [llvm-commits] [llvm] r49040 - /llvm/trunk/docs/CommandLine.html Message-ID: <200804011802.m31I2a8K014695@zion.cs.uiuc.edu> Author: lattner Date: Tue Apr 1 13:02:36 2008 New Revision: 49040 URL: http://llvm.org/viewvc/llvm-project?rev=49040&view=rev Log: minor typo Modified: llvm/trunk/docs/CommandLine.html Modified: llvm/trunk/docs/CommandLine.html URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/docs/CommandLine.html?rev=49040&r1=49039&r2=49040&view=diff ============================================================================== --- llvm/trunk/docs/CommandLine.html (original) +++ llvm/trunk/docs/CommandLine.html Tue Apr 1 13:02:36 2008 @@ -902,7 +902,7 @@ example, consider gcc's -x LANG option. This tells gcc to ignore the suffix of subsequent positional arguments and force the file to be interpreted as if it contained source code in language - LANG. In order to handle this properly , you need to know the + LANG. In order to handle this properly, you need to know the absolute position of each argument, especially those in lists, so their interaction(s) can be applied correctly. This is also useful for options like -llibname which is actually a positional argument that starts with From sabre at nondot.org Tue Apr 1 13:04:04 2008 From: sabre at nondot.org (Chris Lattner) Date: Tue, 01 Apr 2008 18:04:04 -0000 Subject: [llvm-commits] [llvm] r49041 - in /llvm/trunk: include/llvm/Support/MemoryBuffer.h lib/Archive/Archive.cpp lib/Archive/ArchiveWriter.cpp lib/AsmParser/Parser.cpp lib/Debugger/Debugger.cpp lib/Linker/Linker.cpp lib/Support/FileUtilities.cpp lib/Support/MemoryBuffer.cpp lib/VMCore/Core.cpp tools/llvm-bcanalyzer/llvm-bcanalyzer.cpp tools/lto2/LTOCodeGenerator.cpp tools/lto2/LTOModule.cpp utils/TableGen/TGLexer.cpp utils/TableGen/TableGen.cpp Message-ID: <200804011804.m31I44VA014761@zion.cs.uiuc.edu> Author: lattner Date: Tue Apr 1 13:04:03 2008 New Revision: 49041 URL: http://llvm.org/viewvc/llvm-project?rev=49041&view=rev Log: Change the MemoryBuffer::getFile* methods to take just a pointer to the start of a filename, not a filename+length. All clients can produce a null terminated name, and the system api's require null terminated strings anyway. Modified: llvm/trunk/include/llvm/Support/MemoryBuffer.h llvm/trunk/lib/Archive/Archive.cpp llvm/trunk/lib/Archive/ArchiveWriter.cpp llvm/trunk/lib/AsmParser/Parser.cpp llvm/trunk/lib/Debugger/Debugger.cpp llvm/trunk/lib/Linker/Linker.cpp llvm/trunk/lib/Support/FileUtilities.cpp llvm/trunk/lib/Support/MemoryBuffer.cpp llvm/trunk/lib/VMCore/Core.cpp llvm/trunk/tools/llvm-bcanalyzer/llvm-bcanalyzer.cpp llvm/trunk/tools/lto2/LTOCodeGenerator.cpp llvm/trunk/tools/lto2/LTOModule.cpp llvm/trunk/utils/TableGen/TGLexer.cpp llvm/trunk/utils/TableGen/TableGen.cpp Modified: llvm/trunk/include/llvm/Support/MemoryBuffer.h URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Support/MemoryBuffer.h?rev=49041&r1=49040&r2=49041&view=diff ============================================================================== --- llvm/trunk/include/llvm/Support/MemoryBuffer.h (original) +++ llvm/trunk/include/llvm/Support/MemoryBuffer.h Tue Apr 1 13:04:03 2008 @@ -52,7 +52,7 @@ /// MemoryBuffer if successful, otherwise returning null. If FileSize is /// specified, this means that the client knows that the file exists and that /// it has the specified size. - static MemoryBuffer *getFile(const char *FilenameStart, unsigned FnSize, + static MemoryBuffer *getFile(const char *Filename, std::string *ErrStr = 0, int64_t FileSize = -1); @@ -90,7 +90,7 @@ /// if the Filename is "-". If an error occurs, this returns null and fills /// in *ErrStr with a reason. If stdin is empty, this API (unlike getSTDIN) /// returns an empty buffer. - static MemoryBuffer *getFileOrSTDIN(const char *FilenameStart,unsigned FnSize, + static MemoryBuffer *getFileOrSTDIN(const char *Filename, std::string *ErrStr = 0, int64_t FileSize = -1); @@ -100,7 +100,7 @@ static MemoryBuffer *getFileOrSTDIN(const std::string &FN, std::string *ErrStr = 0, int64_t FileSize = -1) { - return getFileOrSTDIN(&FN[0], FN.size(), ErrStr, FileSize); + return getFileOrSTDIN(FN.c_str(), ErrStr, FileSize); } }; Modified: llvm/trunk/lib/Archive/Archive.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Archive/Archive.cpp?rev=49041&r1=49040&r2=49041&view=diff ============================================================================== --- llvm/trunk/lib/Archive/Archive.cpp (original) +++ llvm/trunk/lib/Archive/Archive.cpp Tue Apr 1 13:04:03 2008 @@ -145,7 +145,7 @@ bool Archive::mapToMemory(std::string* ErrMsg) { - mapfile = MemoryBuffer::getFile(archPath.c_str(), archPath.size(), ErrMsg); + mapfile = MemoryBuffer::getFile(archPath.c_str(), ErrMsg); if (mapfile == 0) return true; base = mapfile->getBufferStart(); @@ -211,8 +211,7 @@ std::vector& symbols, std::string* ErrMsg) { std::auto_ptr Buffer( - MemoryBuffer::getFileOrSTDIN(&fName.toString()[0], - fName.toString().size())); + MemoryBuffer::getFileOrSTDIN(fName.c_str())); if (!Buffer.get()) { if (ErrMsg) *ErrMsg = "Could not open file '" + fName.toString() + "'"; return true; Modified: llvm/trunk/lib/Archive/ArchiveWriter.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Archive/ArchiveWriter.cpp?rev=49041&r1=49040&r2=49041&view=diff ============================================================================== --- llvm/trunk/lib/Archive/ArchiveWriter.cpp (original) +++ llvm/trunk/lib/Archive/ArchiveWriter.cpp Tue Apr 1 13:04:03 2008 @@ -212,8 +212,7 @@ const char *data = (const char*)member.getData(); MemoryBuffer *mFile = 0; if (!data) { - mFile = MemoryBuffer::getFile(member.getPath().c_str(), - member.getPath().size(), ErrMsg); + mFile = MemoryBuffer::getFile(member.getPath().c_str(), ErrMsg); if (mFile == 0) return true; data = mFile->getBufferStart(); @@ -407,8 +406,7 @@ // Map in the archive we just wrote. { - OwningPtr arch(MemoryBuffer::getFile(TmpArchive.c_str(), - TmpArchive.size())); + OwningPtr arch(MemoryBuffer::getFile(TmpArchive.c_str())); if (arch == 0) return true; const char* base = arch->getBufferStart(); Modified: llvm/trunk/lib/AsmParser/Parser.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/AsmParser/Parser.cpp?rev=49041&r1=49040&r2=49041&view=diff ============================================================================== --- llvm/trunk/lib/AsmParser/Parser.cpp (original) +++ llvm/trunk/lib/AsmParser/Parser.cpp Tue Apr 1 13:04:03 2008 @@ -22,8 +22,7 @@ Module *llvm::ParseAssemblyFile(const std::string &Filename, ParseError* Err) { std::string ErrorStr; - MemoryBuffer *F = MemoryBuffer::getFileOrSTDIN(&Filename[0], Filename.size(), - &ErrorStr); + MemoryBuffer *F = MemoryBuffer::getFileOrSTDIN(Filename.c_str(), &ErrorStr); if (F == 0) { if (Err) Err->setError(Filename, "Could not open input file '" + Filename + "'"); Modified: llvm/trunk/lib/Debugger/Debugger.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Debugger/Debugger.cpp?rev=49041&r1=49040&r2=49041&view=diff ============================================================================== --- llvm/trunk/lib/Debugger/Debugger.cpp (original) +++ llvm/trunk/lib/Debugger/Debugger.cpp Tue Apr 1 13:04:03 2008 @@ -47,7 +47,7 @@ static Module * getMaterializedModuleProvider(const std::string &Filename) { std::auto_ptr Buffer; - Buffer.reset(MemoryBuffer::getFileOrSTDIN(&Filename[0], Filename.size())); + Buffer.reset(MemoryBuffer::getFileOrSTDIN(Filename.c_str())); if (Buffer.get()) return ParseBitcodeFile(Buffer.get()); return 0; Modified: llvm/trunk/lib/Linker/Linker.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Linker/Linker.cpp?rev=49041&r1=49040&r2=49041&view=diff ============================================================================== --- llvm/trunk/lib/Linker/Linker.cpp (original) +++ llvm/trunk/lib/Linker/Linker.cpp Tue Apr 1 13:04:03 2008 @@ -19,7 +19,8 @@ #include "llvm/Support/Streams.h" using namespace llvm; -Linker::Linker(const std::string& progname, const std::string& modname, unsigned flags) +Linker::Linker(const std::string& progname, const std::string& modname, + unsigned flags) : Composite(0) , LibPaths() , Flags(flags) @@ -103,8 +104,7 @@ Module *Result = 0; const std::string &FNS = FN.toString(); - std::auto_ptr Buffer( - MemoryBuffer::getFileOrSTDIN(&FNS[0], FNS.size())); + std::auto_ptr Buffer(MemoryBuffer::getFileOrSTDIN(FNS.c_str())); if (Buffer.get()) Result = ParseBitcodeFile(Buffer.get(), &ParseErrorMessage); else Modified: llvm/trunk/lib/Support/FileUtilities.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Support/FileUtilities.cpp?rev=49041&r1=49040&r2=49041&view=diff ============================================================================== --- llvm/trunk/lib/Support/FileUtilities.cpp (original) +++ llvm/trunk/lib/Support/FileUtilities.cpp Tue Apr 1 13:04:03 2008 @@ -189,10 +189,8 @@ // Now its safe to mmap the files into memory becasue both files // have a non-zero size. - OwningPtr F1(MemoryBuffer::getFile(FileA.c_str(), FileA.size(), - Error)); - OwningPtr F2(MemoryBuffer::getFile(FileB.c_str(), FileB.size(), - Error)); + OwningPtr F1(MemoryBuffer::getFile(FileA.c_str(), Error)); + OwningPtr F2(MemoryBuffer::getFile(FileB.c_str(), Error)); if (F1 == 0 || F2 == 0) return 2; Modified: llvm/trunk/lib/Support/MemoryBuffer.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Support/MemoryBuffer.cpp?rev=49041&r1=49040&r2=49041&view=diff ============================================================================== --- llvm/trunk/lib/Support/MemoryBuffer.cpp (original) +++ llvm/trunk/lib/Support/MemoryBuffer.cpp Tue Apr 1 13:04:03 2008 @@ -132,12 +132,11 @@ /// if the Filename is "-". If an error occurs, this returns null and fills /// in *ErrStr with a reason. If stdin is empty, this API (unlike getSTDIN) /// returns an empty buffer. -MemoryBuffer *MemoryBuffer::getFileOrSTDIN(const char *FilenameStart, - unsigned FnSize, +MemoryBuffer *MemoryBuffer::getFileOrSTDIN(const char *Filename, std::string *ErrStr, int64_t FileSize) { - if (FnSize != 1 || FilenameStart[0] != '-') - return getFile(FilenameStart, FnSize, ErrStr, FileSize); + if (Filename[0] != '-' || Filename[1] != 0) + return getFile(Filename, ErrStr, FileSize); MemoryBuffer *M = getSTDIN(); if (M) return M; @@ -172,17 +171,13 @@ }; } -MemoryBuffer *MemoryBuffer::getFile(const char *FilenameStart, unsigned FnSize, - std::string *ErrStr, int64_t FileSize) { - // Null terminate the filename. - SmallString<1000> Filename(FilenameStart, FilenameStart+FnSize); - Filename.push_back(0); - +MemoryBuffer *MemoryBuffer::getFile(const char *Filename, std::string *ErrStr, + int64_t FileSize) { int OpenFlags = 0; #ifdef O_BINARY Flags |= O_BINARY; // Open input file in binary mode on win32. #endif - int FD = ::open(&Filename[0], O_RDONLY|OpenFlags); + int FD = ::open(Filename, O_RDONLY|OpenFlags); if (FD == -1) { if (ErrStr) *ErrStr = "could not open file"; return 0; @@ -211,12 +206,12 @@ if (const char *Pages = sys::Path::MapInFilePages(FD, FileSize)) { // Close the file descriptor, now that the whole file is in memory. ::close(FD); - return new MemoryBufferMMapFile(&Filename[0], Pages, FileSize); + return new MemoryBufferMMapFile(Filename, Pages, FileSize); } } OwningPtr SB; - SB.reset(MemoryBuffer::getNewUninitMemBuffer(FileSize, &Filename[0])); + SB.reset(MemoryBuffer::getNewUninitMemBuffer(FileSize, Filename)); char *BufPtr = const_cast(SB->getBufferStart()); unsigned BytesLeft = FileSize; Modified: llvm/trunk/lib/VMCore/Core.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/VMCore/Core.cpp?rev=49041&r1=49040&r2=49041&view=diff ============================================================================== --- llvm/trunk/lib/VMCore/Core.cpp (original) +++ llvm/trunk/lib/VMCore/Core.cpp Tue Apr 1 13:04:03 2008 @@ -1307,7 +1307,7 @@ LLVMMemoryBufferRef *OutMemBuf, char **OutMessage) { std::string Error; - if (MemoryBuffer *MB = MemoryBuffer::getFile(Path, strlen(Path), &Error)) { + if (MemoryBuffer *MB = MemoryBuffer::getFile(Path, &Error)) { *OutMemBuf = wrap(MB); return 0; } Modified: llvm/trunk/tools/llvm-bcanalyzer/llvm-bcanalyzer.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-bcanalyzer/llvm-bcanalyzer.cpp?rev=49041&r1=49040&r2=49041&view=diff ============================================================================== --- llvm/trunk/tools/llvm-bcanalyzer/llvm-bcanalyzer.cpp (original) +++ llvm/trunk/tools/llvm-bcanalyzer/llvm-bcanalyzer.cpp Tue Apr 1 13:04:03 2008 @@ -374,11 +374,7 @@ /// AnalyzeBitcode - Analyze the bitcode file specified by InputFilename. static int AnalyzeBitcode() { // Read the input file. - MemoryBuffer *Buffer; - if (InputFilename == "-") - Buffer = MemoryBuffer::getSTDIN(); - else - Buffer = MemoryBuffer::getFile(&InputFilename[0], InputFilename.size()); + MemoryBuffer *Buffer = MemoryBuffer::getFileOrSTDIN(InputFilename.c_str()); if (Buffer == 0) return Error("Error reading '" + InputFilename + "'."); Modified: llvm/trunk/tools/lto2/LTOCodeGenerator.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/lto2/LTOCodeGenerator.cpp?rev=49041&r1=49040&r2=49041&view=diff ============================================================================== --- llvm/trunk/tools/lto2/LTOCodeGenerator.cpp (original) +++ llvm/trunk/tools/lto2/LTOCodeGenerator.cpp Tue Apr 1 13:04:03 2008 @@ -186,8 +186,7 @@ delete _nativeObjectFile; // read .o file into memory buffer - _nativeObjectFile = MemoryBuffer::getFile(&uniqueObjStr[0], - uniqueObjStr.size(), &errMsg); + _nativeObjectFile = MemoryBuffer::getFile(uniqueObjStr.c_str(),&errMsg); } // remove temp files Modified: llvm/trunk/tools/lto2/LTOModule.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/lto2/LTOModule.cpp?rev=49041&r1=49040&r2=49041&view=diff ============================================================================== --- llvm/trunk/tools/lto2/LTOModule.cpp (original) +++ llvm/trunk/tools/lto2/LTOModule.cpp Tue Apr 1 13:04:03 2008 @@ -43,11 +43,11 @@ return llvm::sys::Path(path).isBitcodeFile(); } -bool LTOModule::isBitcodeFileForTarget(const void* mem, - size_t length, const char* triplePrefix) +bool LTOModule::isBitcodeFileForTarget(const void* mem, size_t length, + const char* triplePrefix) { MemoryBuffer* buffer = MemoryBuffer::getMemBuffer((char*)mem, - (char*)mem+length); + (char*)mem+length); if ( buffer == NULL ) return false; return isTargetMatch(buffer, triplePrefix); @@ -55,10 +55,10 @@ bool LTOModule::isBitcodeFileForTarget(const char* path, - const char* triplePrefix) + const char* triplePrefix) { - MemoryBuffer* buffer = MemoryBuffer::getFile(path, strlen(path)); - if ( buffer == NULL ) + MemoryBuffer *buffer = MemoryBuffer::getFile(path); + if (buffer == NULL) return false; return isTargetMatch(buffer, triplePrefix); } @@ -85,8 +85,7 @@ LTOModule* LTOModule::makeLTOModule(const char* path, std::string& errMsg) { - OwningPtr buffer(MemoryBuffer::getFile( - path, strlen(path), &errMsg)); + OwningPtr buffer(MemoryBuffer::getFile(path, &errMsg)); if ( !buffer ) return NULL; return makeLTOModule(buffer.get(), errMsg); Modified: llvm/trunk/utils/TableGen/TGLexer.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/utils/TableGen/TGLexer.cpp?rev=49041&r1=49040&r2=49041&view=diff ============================================================================== --- llvm/trunk/utils/TableGen/TGLexer.cpp (original) +++ llvm/trunk/utils/TableGen/TGLexer.cpp Tue Apr 1 13:04:03 2008 @@ -256,12 +256,12 @@ std::string Filename = CurStrVal; // Try to find the file. - MemoryBuffer *NewBuf = MemoryBuffer::getFile(&Filename[0], Filename.size()); + MemoryBuffer *NewBuf = MemoryBuffer::getFile(Filename.c_str()); // If the file didn't exist directly, see if it's in an include path. for (unsigned i = 0, e = IncludeDirectories.size(); i != e && !NewBuf; ++i) { std::string IncFile = IncludeDirectories[i] + "/" + Filename; - NewBuf = MemoryBuffer::getFile(&IncFile[0], IncFile.size()); + NewBuf = MemoryBuffer::getFile(IncFile.c_str()); } if (NewBuf == 0) { Modified: llvm/trunk/utils/TableGen/TableGen.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/utils/TableGen/TableGen.cpp?rev=49041&r1=49040&r2=49041&view=diff ============================================================================== --- llvm/trunk/utils/TableGen/TableGen.cpp (original) +++ llvm/trunk/utils/TableGen/TableGen.cpp Tue Apr 1 13:04:03 2008 @@ -107,8 +107,7 @@ static bool ParseFile(const std::string &Filename, const std::vector &IncludeDirs) { std::string ErrorStr; - MemoryBuffer *F = MemoryBuffer::getFileOrSTDIN(&Filename[0], Filename.size(), - &ErrorStr); + MemoryBuffer *F = MemoryBuffer::getFileOrSTDIN(Filename.c_str(), &ErrorStr); if (F == 0) { cerr << "Could not open input file '" + Filename + "': " << ErrorStr <<"\n"; return true; From resistor at mac.com Tue Apr 1 13:05:08 2008 From: resistor at mac.com (Owen Anderson) Date: Tue, 01 Apr 2008 18:05:08 -0000 Subject: [llvm-commits] [llvm] r49043 - /llvm/trunk/lib/CodeGen/StrongPHIElimination.cpp Message-ID: <200804011805.m31I58gE014815@zion.cs.uiuc.edu> Author: resistor Date: Tue Apr 1 13:05:08 2008 New Revision: 49043 URL: http://llvm.org/viewvc/llvm-project?rev=49043&view=rev Log: Don't dereference MBB->end(). Modified: llvm/trunk/lib/CodeGen/StrongPHIElimination.cpp Modified: llvm/trunk/lib/CodeGen/StrongPHIElimination.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/StrongPHIElimination.cpp?rev=49043&r1=49042&r2=49043&view=diff ============================================================================== --- llvm/trunk/lib/CodeGen/StrongPHIElimination.cpp (original) +++ llvm/trunk/lib/CodeGen/StrongPHIElimination.cpp Tue Apr 1 13:05:08 2008 @@ -408,7 +408,7 @@ // Iterate over all the PHI nodes in this block MachineBasicBlock::iterator P = MBB->begin(); - while (P->getOpcode() == TargetInstrInfo::PHI) { + while (P != MBB->end() && P->getOpcode() == TargetInstrInfo::PHI) { unsigned DestReg = P->getOperand(0).getReg(); // Don't both doing PHI elimination for dead PHI's. From dalej at apple.com Tue Apr 1 13:05:47 2008 From: dalej at apple.com (Dale Johannesen) Date: Tue, 1 Apr 2008 11:05:47 -0700 Subject: [llvm-commits] [llvm] r49006 - in /llvm/trunk/lib: CodeGen/DwarfWriter.cpp CodeGen/LLVMTargetMachine.cpp CodeGen/SelectionDAG/SelectionDAGISel.cpp Target/PowerPC/PPCAsmPrinter.cpp Target/PowerPC/PPCRegisterInfo.cpp Target/X86/X86AsmPrinter.cpp Target/X86/X86RegisterInfo.cpp Transforms/Utils/LowerInvoke.cpp In-Reply-To: <200804011349.49716.baldrick@free.fr> References: <200803312340.m2VNeOu9005523@zion.cs.uiuc.edu> <200804011349.49716.baldrick@free.fr> Message-ID: <23A53AED-4314-44B7-B64F-EBC9F8059963@apple.com> On Apr 1, 2008, at 4:49 AM, Duncan Sands wrote: > Hi Dale, > >> Emit exception handling info for functions which are >> not marked nounwind, > > that doesn't sound right. As I had already explained to you > in a private email, the dwarf info has two parts related to > exception handling: the eh table, and frame moves info. If > a function is nounwind then there is no need to generate the > frame moves info. If a function has no invokes then there > is no need to generate the eh table. These are independent. > A nounwind function can have invokes (indeed this is quite > common after optimization - see prune-eh), I see that Anton > sent you an example. His example doesn't work. If it did, quite a few things would be wrong, as you say. > For such a function you should generate an EH table but no frame > moves. I have not tried to prune the frame moves yet, that isn't needed for correctness. > If a nounwind function has no invokes then you can just not > generate dwarf info at all (I'm ignoring debug intrinsics > here, which in general require dwarf info). > And if a not-nounwind function has no invokes then you don't > have to generate an EH table. I think this is already the > case (hopefully Anton will correct me if I'm wrong): we only > generate an EH table if there is a personality function, and > the only way to have a personality function is if there are > invokes (it is also possible to have invokes without a personality, > but since we don't know how to codegen those you can just > ignore this). > > So I think all you need to do is this: make generation of > frame moves optional. Generate frame moves for a function > if and only if it is not-nounwind (or has debug intrinsics). > If the function doesn't require frame moves or an EH table > then don't generate a dwarf frame for it at all. > >> or for all functions when -enable-eh >> is set, provided the target supports Dwarf EH. > > Presumably this is for debugging purposes? If so, how about > making this a hidden option and renaming it to -debug-eh ? > Otherwise people are going to think they need this for eh > support. Which they don't, right? (If I understand you > correctly, you've basically turned on eh support > unconditionally). I am trying to "turn on" EH support based on the IR information rather than a command line flag. Chris did not want to remove -enable-eh yet. It and ExceptionHandling should go away eventually. >> llvm-gcc generates nounwind in the right places; other FEs >> will need to do so also. Given such a FE, -enable-eh should >> no longer be needed. > >> + /// shouldEmit - Per-function flag to indicate if EH information >> should >> + /// be emitted. >> bool shouldEmit; > > This is too crude. I think you need to distinguish between frame > moves > (= locating the values of variables) and the EH table (matching > exceptions > to actions). So you need two variables here. > >> + if ((ExceptionHandling || !MF->getFunction()->doesNotThrow()) && >> TAI->doesSupportExceptionHandling()) { >> shouldEmit = true; > > This looks badly wrong: you just broke nounwind functions that > contain invokes. If such exist, that is true. >> - if (!ExceptionHandling) >> - PM.add(createLowerInvokePass(getTargetLowering())); >> + PM.add(createLowerInvokePass(getTargetLowering())); > > Does this mean that you just lowered all exception handling to > setjmp/longjmp? No. The idea was to postpone deciding to do LowerInvoke until LowerInvoke is actually executed, when we have a function to look at. But probably this should look at getTargetAsmInfo()- >doesSupportExceptionHandling() instead. I think we want to do this lowering whenever the target doesn't support Dwarf EH. > Hopefully not, but I vaguely recall from the last time I looked at > this stuff > that it is surprisingly easy to make a mistake here. That is true, but I did test it. >> - if (!ExceptionHandling) >> - PM.add(createLowerInvokePass(getTargetLowering())); >> + PM.add(createLowerInvokePass(getTargetLowering())); > > Likewise. > >> + // Figure out whether we need to generate EH info. Currently we >> do this for >> + // all functions not marked no-unwind, or if requested via - >> enable-eh. >> + needsExceptionHandling = ExceptionHandling || !Fn.doesNotThrow(); > > This is wrong, see above. There's already a test somewhere that > only outputs > the EH table if there is a personality function. > >> case Intrinsic::eh_exception: { >> - if (ExceptionHandling) { >> + if (FuncInfo.needsExceptionHandling) { > > This is backwards. If a function has invokes then it requires an EH > table. > The only way to get the eh_exception intrinsic is to have an > invoke. Thus if > you see eh_exception then the function has an invoke so for sure you > want to > lower it (unless eh has been globally turned off, which is what the > previous > test was for). There should be no test here. You should really just > substitute "true" for ExceptionHandling everywhere... > >> - if (ExceptionHandling && MMI) { >> + if (FuncInfo.needsExceptionHandling && MMI) { > > Likewise for all the other examples of this. > >> - if (LandingPad && ExceptionHandling && MMI) { >> + if (LandingPad && FuncInfo.needsExceptionHandling && MMI) { >> // Insert a label before the invoke call to mark the try >> range. This can be > > Likewise: you're only getting here if you have an invoke, so no test > is needed (see below also). > >> bool LowerInvoke::runOnFunction(Function &F) { >> + // If we will be generating exception info, don't do anything >> here. >> + if ((ExceptionHandling || !F.doesNotThrow()) && >> + TLI && >> + TLI->getTargetMachine().getTargetAsmInfo()-> >> + doesSupportExceptionHandling()) >> + return false; > > The !F.doesNotThrow() test is bogus. Also, what is > ExceptionHandling doing > here? Shouldn't the test be: do this if -enable-correct-eh-support > was > specified and the target does not support exception handling? Currently, if -enable-correct-eh-support is not on here, we simply change invokes to calls. I could be persuaded that an error is better. From baldrick at free.fr Tue Apr 1 13:10:42 2008 From: baldrick at free.fr (Duncan Sands) Date: Tue, 1 Apr 2008 20:10:42 +0200 Subject: [llvm-commits] =?iso-8859-1?q?=5Bllvm=5D_r49006_-_in=09/llvm/trun?= =?iso-8859-1?q?k/lib=3A_CodeGen/DwarfWriter=2Ecpp=09CodeGen/LLVMTargetMac?= =?iso-8859-1?q?hine=2Ecpp_CodeGen/SelectionDAG/SelectionDAGISel=2Ecpp=09T?= =?iso-8859-1?q?arget/PowerPC/PPCAsmPrinter=2Ecpp_Target/PowerPC/PPCRegist?= =?iso-8859-1?q?erInfo=2Ecpp=09Target/X86/X86AsmPrinter=2Ecpp_Target/X86/X?= =?iso-8859-1?q?86RegisterInfo=2Ecpp=09Transforms/Utils/LowerInvoke=2Ecpp?= In-Reply-To: <9619FEA7-CC30-4FB2-94B0-D9F4F37BE40F@apple.com> References: <200803312340.m2VNeOu9005523@zion.cs.uiuc.edu> <75025401-0C0F-41FC-8A6B-BC20F56F5FCA@apple.com> <9619FEA7-CC30-4FB2-94B0-D9F4F37BE40F@apple.com> Message-ID: <200804012010.44169.baldrick@free.fr> > llvm-gcc still does not mark foo as nounwind. That's because the C++ end-of-catch routine is not marked "nothrow". Ciao, D. From clattner at apple.com Tue Apr 1 13:12:57 2008 From: clattner at apple.com (Chris Lattner) Date: Tue, 1 Apr 2008 11:12:57 -0700 Subject: [llvm-commits] [llvm] r49006 - in /llvm/trunk/lib: CodeGen/DwarfWriter.cpp CodeGen/LLVMTargetMachine.cpp CodeGen/SelectionDAG/SelectionDAGISel.cpp Target/PowerPC/PPCAsmPrinter.cpp Target/PowerPC/PPCRegisterInfo.cpp Target/X86/X86AsmPrinter.cpp Target/X86/X86RegisterInfo.cpp Transforms/Utils/LowerInvoke.cpp In-Reply-To: <9619FEA7-CC30-4FB2-94B0-D9F4F37BE40F@apple.com> References: <200803312340.m2VNeOu9005523@zion.cs.uiuc.edu> <1207029245.16812.433.camel@asl.dorms.spbu.ru> <3827336E-9836-4D08-AD1C-D787E7BFA52B@apple.com> <75025401-0C0F-41FC-8A6B-BC20F56F5FCA@apple.com> <9619FEA7-CC30-4FB2-94B0-D9F4F37BE40F@apple.com> Message-ID: <7B891073-ECE6-4F89-BA9B-A637A3BCA8A6@apple.com> On Apr 1, 2008, at 10:49 AM, Dale Johannesen wrote: > > On Apr 1, 2008, at 10:40 AM, Chris Lattner wrote: >>> >>> Hmm. llvm-gcc does not, in fact, mark foo() as nounwind. >> >> In this case, that is because baz() could throw. Try: >> >> int foo() { >> try { >> bar(); >> } catch(...) { >> return 17 >> } >> return 42; >> } > > llvm-gcc still does not mark foo as nounwind. Regardless of whether it does or not, it would be correct for it to be marked nounwind. This detail is a missed optimization in llvm-gcc, but it doesn't affect the discussion afaict. How about something like: void bar(); int foo() throw() { bar(); } Same idea, and it is marked nounwind. -Chris From clattner at apple.com Tue Apr 1 13:13:43 2008 From: clattner at apple.com (Chris Lattner) Date: Tue, 1 Apr 2008 11:13:43 -0700 Subject: [llvm-commits] [llvm] r49006 - in /llvm/trunk/lib: CodeGen/DwarfWriter.cpp CodeGen/LLVMTargetMachine.cpp CodeGen/SelectionDAG/SelectionDAGISel.cpp Target/PowerPC/PPCAsmPrinter.cpp Target/PowerPC/PPCRegisterInfo.cpp Target/X86/X86AsmPrinter.cpp Target/X86/X86RegisterInfo.cpp Transforms/Utils/LowerInvoke.cpp In-Reply-To: <200804012010.44169.baldrick@free.fr> References: <200803312340.m2VNeOu9005523@zion.cs.uiuc.edu> <75025401-0C0F-41FC-8A6B-BC20F56F5FCA@apple.com> <9619FEA7-CC30-4FB2-94B0-D9F4F37BE40F@apple.com> <200804012010.44169.baldrick@free.fr> Message-ID: On Apr 1, 2008, at 11:10 AM, Duncan Sands wrote: >> llvm-gcc still does not mark foo as nounwind. > > That's because the C++ end-of-catch routine is > not marked "nothrow". Really? Is that intentional? -Chris From dalej at apple.com Tue Apr 1 13:22:21 2008 From: dalej at apple.com (Dale Johannesen) Date: Tue, 1 Apr 2008 11:22:21 -0700 Subject: [llvm-commits] [llvm] r49006 - in /llvm/trunk/lib: CodeGen/DwarfWriter.cpp CodeGen/LLVMTargetMachine.cpp CodeGen/SelectionDAG/SelectionDAGISel.cpp Target/PowerPC/PPCAsmPrinter.cpp Target/PowerPC/PPCRegisterInfo.cpp Target/X86/X86AsmPrinter.cpp Target/X86/X86RegisterInfo.cpp Transforms/Utils/LowerInvoke.cpp In-Reply-To: <7B891073-ECE6-4F89-BA9B-A637A3BCA8A6@apple.com> References: <200803312340.m2VNeOu9005523@zion.cs.uiuc.edu> <1207029245.16812.433.camel@asl.dorms.spbu.ru> <3827336E-9836-4D08-AD1C-D787E7BFA52B@apple.com> <75025401-0C0F-41FC-8A6B-BC20F56F5FCA@apple.com> <9619FEA7-CC30-4FB2-94B0-D9F4F37BE40F@apple.com> <7B891073-ECE6-4F89-BA9B-A637A3BCA8A6@apple.com> Message-ID: On Apr 1, 2008, at 11:12 AM, Chris Lattner wrote: > > On Apr 1, 2008, at 10:49 AM, Dale Johannesen wrote: > >> >> On Apr 1, 2008, at 10:40 AM, Chris Lattner wrote: >>>> >>>> Hmm. llvm-gcc does not, in fact, mark foo() as nounwind. >>> >>> In this case, that is because baz() could throw. Try: >>> >>> int foo() { >>> try { >>> bar(); >>> } catch(...) { >>> return 17 >>> } >>> return 42; >>> } >> >> llvm-gcc still does not mark foo as nounwind. > > Regardless of whether it does or not, it would be correct for it to be > marked nounwind. This detail is a missed optimization in llvm-gcc, > but it doesn't affect the discussion afaict. No, it only affects whether things work:) > How about something like: > > void bar(); > int foo() throw() { > bar(); > } > > Same idea, and it is marked nounwind. OK, this one I believe. While llvm-g++ does produce an EH table, llvm- g++ -emit-llvm | llc does not. I'll fix it. From clattner at apple.com Tue Apr 1 13:31:01 2008 From: clattner at apple.com (Chris Lattner) Date: Tue, 1 Apr 2008 11:31:01 -0700 Subject: [llvm-commits] [llvm] r49006 - in /llvm/trunk/lib: CodeGen/DwarfWriter.cpp CodeGen/LLVMTargetMachine.cpp CodeGen/SelectionDAG/SelectionDAGISel.cpp Target/PowerPC/PPCAsmPrinter.cpp Target/PowerPC/PPCRegisterInfo.cpp Target/X86/X86AsmPrinter.cpp Target/X86/X86RegisterInfo.cpp Transforms/Utils/LowerInvoke.cpp In-Reply-To: References: <200803312340.m2VNeOu9005523@zion.cs.uiuc.edu> <1207029245.16812.433.camel@asl.dorms.spbu.ru> <3827336E-9836-4D08-AD1C-D787E7BFA52B@apple.com> <75025401-0C0F-41FC-8A6B-BC20F56F5FCA@apple.com> <9619FEA7-CC30-4FB2-94B0-D9F4F37BE40F@apple.com> <7B891073-ECE6-4F89-BA9B-A637A3BCA8A6@apple.com> Message-ID: <500AE06C-7497-4598-A5E1-3FEC6A098262@apple.com> On Apr 1, 2008, at 11:22 AM, Dale Johannesen wrote: >>>> In this case, that is because baz() could throw. Try: >>>> >>>> int foo() { >>>> try { >>>> bar(); >>>> } catch(...) { >>>> return 17 >>>> } >>>> return 42; >>>> } >>> >>> llvm-gcc still does not mark foo as nounwind. >> >> Regardless of whether it does or not, it would be correct for it to >> be >> marked nounwind. This detail is a missed optimization in llvm-gcc, >> but it doesn't affect the discussion afaict. > > No, it only affects whether things work:) The semantics of the nounwind attribute are independent of whether llvm-gcc happens to apply it or not. In this case, not marking it nounwind may be a missed optimization, but applying it *is* correct and should not "break" the code. >> How about something like: >> >> void bar(); >> int foo() throw() { >> bar(); >> } >> >> Same idea, and it is marked nounwind. > > OK, this one I believe. While llvm-g++ does produce an EH table, > llvm- > g++ -emit-llvm | llc does not. I'll fix it. Thanks Dale! -Chris From sabre at nondot.org Tue Apr 1 13:45:28 2008 From: sabre at nondot.org (Chris Lattner) Date: Tue, 01 Apr 2008 18:45:28 -0000 Subject: [llvm-commits] [llvm] r49044 - /llvm/trunk/docs/LangRef.html Message-ID: <200804011845.m31IjSqo016189@zion.cs.uiuc.edu> Author: lattner Date: Tue Apr 1 13:45:27 2008 New Revision: 49044 URL: http://llvm.org/viewvc/llvm-project?rev=49044&view=rev Log: make langref more precise, wave 1, from Jon Sargeant Modified: llvm/trunk/docs/LangRef.html Modified: llvm/trunk/docs/LangRef.html URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/docs/LangRef.html?rev=49044&r1=49043&r2=49044&view=diff ============================================================================== --- llvm/trunk/docs/LangRef.html (original) +++ llvm/trunk/docs/LangRef.html Tue Apr 1 13:45:27 2008 @@ -1465,8 +1465,10 @@
      Floating point constants use standard decimal notation (e.g. 123.421), exponential notation (e.g. 1.23421e+2), or a more precise hexadecimal - notation (see below). Floating point constants must have a floating point type.
      + notation (see below). The assembler requires the exact decimal value of + a floating-point constant. For example, the assembler accepts 1.25 but + rejects 1.3 because 1.3 is a repeating decimal in binary. Floating point + constants must have a floating point type.
  • Null pointer constants
    @@ -2190,7 +2192,7 @@ types. This instruction can also take vector versions of the values in which case the elements must be integers.

    Semantics:
    -

    The value produced is the signed integer quotient of the two operands.

    +

    The value produced is the signed integer quotient of the two operands rounded towards zero.

    Note that signed integer division and unsigned integer division are distinct operations; for unsigned integer division, use 'udiv'.

    Division by zero leads to undefined behavior. Overflow also leads to @@ -2238,8 +2240,7 @@ of the values in which case the elements must be integers.

    Semantics:

    This instruction returns the unsigned integer remainder of a division. -This instruction always performs an unsigned division to get the remainder, -regardless of whether the arguments are unsigned or not.

    +This instruction always performs an unsigned division to get the remainder.

    Note that unsigned integer remainder and signed integer remainder are distinct operations; for signed integer remainder, use 'srem'.

    Taking the remainder of a division by zero leads to undefined behavior.

    @@ -2303,7 +2304,8 @@ identical types. This instruction can also take vector versions of floating point values.

    Semantics:
    -

    This instruction returns the remainder of a division.

    +

    This instruction returns the remainder of a division. +The remainder has the same sign as the dividend.

    Example:
      <result> = frem float 4.0, %var          ; yields {float}:result = 4.0 % %var
     
    @@ -2316,9 +2318,8 @@

    Bitwise binary operators are used to do various forms of bit-twiddling in a program. They are generally very efficient instructions and can commonly be strength reduced from other -instructions. They require two operands, execute an operation on them, -and produce a single value. The resulting value of the bitwise binary -operators is always the same type as its first operand.

    +instructions. They require two operands of the same type, execute an operation on them, +and produce a single value. The resulting value is the same type as its operands.

    @@ -2341,9 +2342,9 @@
    Semantics:
    -

    The value produced is var1 * 2var2. If -var2 is (statically or dynamically) equal to or larger than the number -of bits in var1, the result is undefined.

    +

    The value produced is var1 * 2var2 mod 2n, +where n is the width of the result. If var2 is (statically or dynamically) negative or +equal to or larger than the number of bits in var1, the result is undefined.

    Example:
       <result> = shl i32 4, %var   ; yields {i32}: 4 << %var
    
    
    
    
    From sabre at nondot.org  Tue Apr  1 13:47:32 2008
    From: sabre at nondot.org (Chris Lattner)
    Date: Tue, 01 Apr 2008 18:47:32 -0000
    Subject: [llvm-commits] [llvm] r49045 - /llvm/trunk/docs/LangRef.html
    Message-ID: <200804011847.m31IlWUx016288@zion.cs.uiuc.edu>
    
    Author: lattner
    Date: Tue Apr  1 13:47:32 2008
    New Revision: 49045
    
    URL: http://llvm.org/viewvc/llvm-project?rev=49045&view=rev
    Log:
    add a dropped hunk from Jon Sargeant's patch.
    
    Modified:
        llvm/trunk/docs/LangRef.html
    
    Modified: llvm/trunk/docs/LangRef.html
    URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/docs/LangRef.html?rev=49045&r1=49044&r2=49045&view=diff
    
    ==============================================================================
    --- llvm/trunk/docs/LangRef.html (original)
    +++ llvm/trunk/docs/LangRef.html Tue Apr  1 13:47:32 2008
    @@ -2055,11 +2055,10 @@
     
     

    Binary operators are used to do most of the computation in a -program. They require two operands, execute an operation on them, and +program. They require two operands of the same type, execute an operation on them, and produce a single value. The operands might represent multiple data, as is the case with the vector data type. -The result value of a binary operator is not -necessarily the same type as its operands.

    +The result value has the same type as its operands.

    There are several different binary operators:

    From dberlin at dberlin.org Tue Apr 1 14:22:51 2008 From: dberlin at dberlin.org (Daniel Berlin) Date: Tue, 1 Apr 2008 15:22:51 -0400 Subject: [llvm-commits] [llvm] r49006 - in /llvm/trunk/lib: CodeGen/DwarfWriter.cpp CodeGen/LLVMTargetMachine.cpp CodeGen/SelectionDAG/SelectionDAGISel.cpp Target/PowerPC/PPCAsmPrinter.cpp Target/PowerPC/PPCRegisterInfo.cpp Target/X86/X86AsmPrinter.cpp Ta Message-ID: <4aca3dc20804011222j3d604f04n786827a914b85951@mail.gmail.com> On Tue, Apr 1, 2008 at 2:12 PM, Chris Lattner wrote: > > On Apr 1, 2008, at 10:49 AM, Dale Johannesen wrote: > > > > > On Apr 1, 2008, at 10:40 AM, Chris Lattner wrote: > >>> > >>> Hmm. llvm-gcc does not, in fact, mark foo() as nounwind. > >> > >> In this case, that is because baz() could throw. Try: > >> > >> int foo() { > >> try { > >> bar(); > >> } catch(...) { > >> return 17 > >> } > >> return 42; > >> } > > > > llvm-gcc still does not mark foo as nounwind. > > Regardless of whether it does or not, it would be correct for it to be > marked nounwind. This detail is a missed optimization in llvm-gcc, Yes, and one intended to be fixed soon (along with a real definition of TREE_NOTHROW that specifies whether the called functions by this function are guaranteed not to throw either, since this is currently underspecified, as you've all discovered :P). From dalej at apple.com Tue Apr 1 15:00:57 2008 From: dalej at apple.com (Dale Johannesen) Date: Tue, 01 Apr 2008 20:00:57 -0000 Subject: [llvm-commits] [llvm] r49046 - in /llvm/trunk/lib: CodeGen/DwarfWriter.cpp CodeGen/LLVMTargetMachine.cpp CodeGen/SelectionDAG/SelectionDAGISel.cpp Target/PowerPC/PPCAsmPrinter.cpp Target/PowerPC/PPCRegisterInfo.cpp Target/X86/X86AsmPrinter.cpp Target/X86/X86RegisterInfo.cpp Transforms/Utils/LowerInvoke.cpp Message-ID: <200804012000.m31K0vUe018662@zion.cs.uiuc.edu> Author: johannes Date: Tue Apr 1 15:00:57 2008 New Revision: 49046 URL: http://llvm.org/viewvc/llvm-project?rev=49046&view=rev Log: Revert 49006 for the moment. Modified: llvm/trunk/lib/CodeGen/DwarfWriter.cpp llvm/trunk/lib/CodeGen/LLVMTargetMachine.cpp llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp llvm/trunk/lib/Target/PowerPC/PPCAsmPrinter.cpp llvm/trunk/lib/Target/PowerPC/PPCRegisterInfo.cpp llvm/trunk/lib/Target/X86/X86AsmPrinter.cpp llvm/trunk/lib/Target/X86/X86RegisterInfo.cpp llvm/trunk/lib/Transforms/Utils/LowerInvoke.cpp Modified: llvm/trunk/lib/CodeGen/DwarfWriter.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/DwarfWriter.cpp?rev=49046&r1=49045&r2=49046&view=diff ============================================================================== --- llvm/trunk/lib/CodeGen/DwarfWriter.cpp (original) +++ llvm/trunk/lib/CodeGen/DwarfWriter.cpp Tue Apr 1 15:00:57 2008 @@ -2778,13 +2778,9 @@ std::vector EHFrames; - /// shouldEmit - Per-function flag to indicate if EH information should - /// be emitted. + /// shouldEmit - Flag to indicate if debug information should be emitted. + /// bool shouldEmit; - - /// shouldEmitModule - Per-module flag to indicate if EH information should - /// be emitted. - bool shouldEmitModule; /// EmitCommonEHFrame - Emit the common eh unwind frame. /// @@ -3372,7 +3368,6 @@ DwarfException(std::ostream &OS, AsmPrinter *A, const TargetAsmInfo *T) : Dwarf(OS, A, T, "eh") , shouldEmit(false) - , shouldEmitModule(false) {} virtual ~DwarfException() {} @@ -3392,7 +3387,7 @@ /// EndModule - Emit all exception information that should come after the /// content. void EndModule() { - if (!shouldEmitModule) return; + if (!shouldEmit) return; const std::vector Personalities = MMI->getPersonalities(); for (unsigned i =0; i < Personalities.size(); ++i) @@ -3408,14 +3403,13 @@ void BeginFunction(MachineFunction *MF) { this->MF = MF; - shouldEmit = false; - if ((ExceptionHandling || !MF->getFunction()->doesNotThrow()) && + if (MMI && + ExceptionHandling && TAI->doesSupportExceptionHandling()) { shouldEmit = true; // Assumes in correct section after the entry point. EmitLabel("eh_func_begin", ++SubprogramCount); } - shouldEmitModule |= shouldEmit; } /// EndFunction - Gather and emit post-function exception information. Modified: llvm/trunk/lib/CodeGen/LLVMTargetMachine.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/LLVMTargetMachine.cpp?rev=49046&r1=49045&r2=49046&view=diff ============================================================================== --- llvm/trunk/lib/CodeGen/LLVMTargetMachine.cpp (original) +++ llvm/trunk/lib/CodeGen/LLVMTargetMachine.cpp Tue Apr 1 15:00:57 2008 @@ -66,7 +66,8 @@ PM.add(createGCLoweringPass()); - PM.add(createLowerInvokePass(getTargetLowering())); + if (!ExceptionHandling) + PM.add(createLowerInvokePass(getTargetLowering())); // Make sure that no unreachable blocks are instruction selected. PM.add(createUnreachableBlockEliminationPass()); @@ -191,7 +192,8 @@ PM.add(createGCLoweringPass()); - PM.add(createLowerInvokePass(getTargetLowering())); + if (!ExceptionHandling) + PM.add(createLowerInvokePass(getTargetLowering())); // Make sure that no unreachable blocks are instruction selected. PM.add(createUnreachableBlockEliminationPass()); Modified: llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp?rev=49046&r1=49045&r2=49046&view=diff ============================================================================== --- llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp (original) +++ llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp Tue Apr 1 15:00:57 2008 @@ -169,7 +169,6 @@ Function &Fn; MachineFunction &MF; MachineRegisterInfo &RegInfo; - bool needsExceptionHandling; FunctionLoweringInfo(TargetLowering &TLI, Function &Fn,MachineFunction &MF); @@ -305,10 +304,6 @@ BuildMI(MBB, TII->get(TargetInstrInfo::PHI), PHIReg+i); } } - - // Figure out whether we need to generate EH info. Currently we do this for - // all functions not marked no-unwind, or if requested via -enable-eh. - needsExceptionHandling = ExceptionHandling || !Fn.doesNotThrow(); } /// CreateRegForValue - Allocate the appropriate number of virtual registers of @@ -2832,7 +2827,7 @@ } case Intrinsic::eh_exception: { - if (FuncInfo.needsExceptionHandling) { + if (ExceptionHandling) { if (!CurMBB->isLandingPad()) { // FIXME: Mark exception register as live in. Hack for PR1508. unsigned Reg = TLI.getExceptionAddressRegister(); @@ -2857,7 +2852,7 @@ MVT::ValueType VT = (Intrinsic == Intrinsic::eh_selector_i32 ? MVT::i32 : MVT::i64); - if (FuncInfo.needsExceptionHandling && MMI) { + if (ExceptionHandling && MMI) { if (CurMBB->isLandingPad()) addCatchInfo(I, MMI, CurMBB); else { @@ -2907,7 +2902,7 @@ case Intrinsic::eh_return: { MachineModuleInfo *MMI = DAG.getMachineModuleInfo(); - if (MMI && FuncInfo.needsExceptionHandling) { + if (MMI && ExceptionHandling) { MMI->setCallsEHReturn(true); DAG.setRoot(DAG.getNode(ISD::EH_RETURN, MVT::Other, @@ -2930,7 +2925,7 @@ } case Intrinsic::eh_dwarf_cfa: { - if (FuncInfo.needsExceptionHandling) { + if (ExceptionHandling) { MVT::ValueType VT = getValue(I.getOperand(1)).getValueType(); SDOperand CfaArg; if (MVT::getSizeInBits(VT) > MVT::getSizeInBits(TLI.getPointerTy())) @@ -3181,7 +3176,7 @@ Args.push_back(Entry); } - if (LandingPad && FuncInfo.needsExceptionHandling && MMI) { + if (LandingPad && ExceptionHandling && MMI) { // Insert a label before the invoke call to mark the try range. This can be // used to detect deletion of the invoke via the MachineModuleInfo. BeginLabel = MMI->NextLabelID(); @@ -3200,7 +3195,7 @@ setValue(CS.getInstruction(), Result.first); DAG.setRoot(Result.second); - if (LandingPad && FuncInfo.needsExceptionHandling && MMI) { + if (LandingPad && ExceptionHandling && MMI) { // Insert a label at the end of the invoke call to mark the try range. This // can be used to detect deletion of the invoke via the MachineModuleInfo. EndLabel = MMI->NextLabelID(); @@ -4619,7 +4614,7 @@ FunctionLoweringInfo FuncInfo(TLI, Fn, MF); - if (FuncInfo.needsExceptionHandling) + if (ExceptionHandling) for (Function::iterator I = Fn.begin(), E = Fn.end(); I != E; ++I) if (InvokeInst *Invoke = dyn_cast(I->getTerminator())) // Mark landing pad. @@ -4762,7 +4757,7 @@ MachineModuleInfo *MMI = DAG.getMachineModuleInfo(); - if (FuncInfo.needsExceptionHandling && MMI && BB->isLandingPad()) { + if (ExceptionHandling && MMI && BB->isLandingPad()) { // Add a label to mark the beginning of the landing pad. Deletion of the // landing pad can thus be detected via the MachineModuleInfo. unsigned LabelID = MMI->addLandingPad(BB); Modified: llvm/trunk/lib/Target/PowerPC/PPCAsmPrinter.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/PowerPC/PPCAsmPrinter.cpp?rev=49046&r1=49045&r2=49046&view=diff ============================================================================== --- llvm/trunk/lib/Target/PowerPC/PPCAsmPrinter.cpp (original) +++ llvm/trunk/lib/Target/PowerPC/PPCAsmPrinter.cpp Tue Apr 1 15:00:57 2008 @@ -1086,9 +1086,8 @@ O << "\n"; - if (TAI->doesSupportExceptionHandling() && MMI) { + if (ExceptionHandling && TAI->doesSupportExceptionHandling() && MMI) { // Add the (possibly multiple) personalities to the set of global values. - // Only referenced functions get into the Personalities list. const std::vector& Personalities = MMI->getPersonalities(); for (std::vector::const_iterator I = Personalities.begin(), Modified: llvm/trunk/lib/Target/PowerPC/PPCRegisterInfo.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/PowerPC/PPCRegisterInfo.cpp?rev=49046&r1=49045&r2=49046&view=diff ============================================================================== --- llvm/trunk/lib/Target/PowerPC/PPCRegisterInfo.cpp (original) +++ llvm/trunk/lib/Target/PowerPC/PPCRegisterInfo.cpp Tue Apr 1 15:00:57 2008 @@ -20,7 +20,6 @@ #include "PPCFrameInfo.h" #include "PPCSubtarget.h" #include "llvm/Constants.h" -#include "llvm/Function.h" #include "llvm/Type.h" #include "llvm/CodeGen/ValueTypes.h" #include "llvm/CodeGen/MachineInstrBuilder.h" @@ -947,8 +946,6 @@ MachineBasicBlock::iterator MBBI = MBB.begin(); MachineFrameInfo *MFI = MF.getFrameInfo(); MachineModuleInfo *MMI = MFI->getMachineModuleInfo(); - bool needsFrameInfo = (MMI && MMI->hasDebugInfo()) || - ExceptionHandling || !MF.getFunction()->doesNotThrow(); // Prepare for frame info. unsigned FrameLabelId = 0; @@ -1022,7 +1019,7 @@ unsigned TargetAlign = MF.getTarget().getFrameInfo()->getStackAlignment(); unsigned MaxAlign = MFI->getMaxAlignment(); - if (needsFrameInfo) { + if (MMI && MMI->needsFrameInfo()) { // Mark effective beginning of when frame pointer becomes valid. FrameLabelId = MMI->NextLabelID(); BuildMI(MBB, MBBI, TII.get(PPC::LABEL)).addImm(FrameLabelId).addImm(0); @@ -1098,7 +1095,7 @@ } } - if (needsFrameInfo) { + if (MMI && MMI->needsFrameInfo()) { std::vector &Moves = MMI->getFrameMoves(); if (NegFrameSize) { Modified: llvm/trunk/lib/Target/X86/X86AsmPrinter.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/X86/X86AsmPrinter.cpp?rev=49046&r1=49045&r2=49046&view=diff ============================================================================== --- llvm/trunk/lib/Target/X86/X86AsmPrinter.cpp (original) +++ llvm/trunk/lib/Target/X86/X86AsmPrinter.cpp Tue Apr 1 15:00:57 2008 @@ -381,9 +381,9 @@ O << "\n"; - if (TAI->doesSupportExceptionHandling() && MMI && !Subtarget->is64Bit()) { + if (ExceptionHandling && TAI->doesSupportExceptionHandling() && MMI && + !Subtarget->is64Bit()) { // Add the (possibly multiple) personalities to the set of global values. - // Only referenced functions get into the Personalities list. const std::vector& Personalities = MMI->getPersonalities(); for (std::vector::const_iterator I = Personalities.begin(), Modified: llvm/trunk/lib/Target/X86/X86RegisterInfo.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/X86/X86RegisterInfo.cpp?rev=49046&r1=49045&r2=49046&view=diff ============================================================================== --- llvm/trunk/lib/Target/X86/X86RegisterInfo.cpp (original) +++ llvm/trunk/lib/Target/X86/X86RegisterInfo.cpp Tue Apr 1 15:00:57 2008 @@ -504,8 +504,6 @@ MachineModuleInfo *MMI = MFI->getMachineModuleInfo(); X86MachineFunctionInfo *X86FI = MF.getInfo(); MachineBasicBlock::iterator MBBI = MBB.begin(); - bool needsFrameInfo = (MMI && MMI->hasDebugInfo()) || - ExceptionHandling || !Fn->doesNotThrow(); // Prepare for frame info. unsigned FrameLabelId = 0; @@ -538,7 +536,7 @@ .addReg(FramePtr); NumBytes -= SlotSize; - if (needsFrameInfo) { + if (MMI && MMI->needsFrameInfo()) { // Mark effective beginning of when frame pointer becomes valid. FrameLabelId = MMI->NextLabelID(); BuildMI(MBB, MBBI, TII.get(X86::LABEL)).addImm(FrameLabelId).addImm(0); @@ -550,7 +548,7 @@ } unsigned ReadyLabelId = 0; - if (needsFrameInfo) { + if (MMI && MMI->needsFrameInfo()) { // Mark effective beginning of when frame pointer is ready. ReadyLabelId = MMI->NextLabelID(); BuildMI(MBB, MBBI, TII.get(X86::LABEL)).addImm(ReadyLabelId).addImm(0); @@ -609,7 +607,7 @@ } } - if (needsFrameInfo) { + if (MMI && MMI->needsFrameInfo()) { std::vector &Moves = MMI->getFrameMoves(); const TargetData *TD = MF.getTarget().getTargetData(); Modified: llvm/trunk/lib/Transforms/Utils/LowerInvoke.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Utils/LowerInvoke.cpp?rev=49046&r1=49045&r2=49046&view=diff ============================================================================== --- llvm/trunk/lib/Transforms/Utils/LowerInvoke.cpp (original) +++ llvm/trunk/lib/Transforms/Utils/LowerInvoke.cpp Tue Apr 1 15:00:57 2008 @@ -47,9 +47,6 @@ #include "llvm/Support/CommandLine.h" #include "llvm/Support/Compiler.h" #include "llvm/Target/TargetLowering.h" -#include "llvm/Target/TargetOptions.h" -#include "llvm/Target/TargetMachine.h" -#include "llvm/Target/TargetAsmInfo.h" #include #include using namespace llvm; @@ -595,12 +592,6 @@ } bool LowerInvoke::runOnFunction(Function &F) { - // If we will be generating exception info, don't do anything here. - if ((ExceptionHandling || !F.doesNotThrow()) && - TLI && - TLI->getTargetMachine().getTargetAsmInfo()-> - doesSupportExceptionHandling()) - return false; if (ExpensiveEHSupport) return insertExpensiveEHSupport(F); else From dalej at apple.com Tue Apr 1 15:06:51 2008 From: dalej at apple.com (Dale Johannesen) Date: Tue, 01 Apr 2008 20:06:51 -0000 Subject: [llvm-commits] [test-suite] r49047 - /test-suite/trunk/Makefile.programs Message-ID: <200804012006.m31K6phL019106@zion.cs.uiuc.edu> Author: johannes Date: Tue Apr 1 15:06:51 2008 New Revision: 49047 URL: http://llvm.org/viewvc/llvm-project?rev=49047&view=rev Log: Put -enable-eh back for the moment. Modified: test-suite/trunk/Makefile.programs Modified: test-suite/trunk/Makefile.programs URL: http://llvm.org/viewvc/llvm-project/test-suite/trunk/Makefile.programs?rev=49047&r1=49046&r2=49047&view=diff ============================================================================== --- test-suite/trunk/Makefile.programs (original) +++ test-suite/trunk/Makefile.programs Tue Apr 1 15:06:51 2008 @@ -323,10 +323,10 @@ # PPC and X86 support DWARF exceptions, for everything else, default to SJLJ # -enable-eh is no longer required to get DWARF exceptions. ifeq ($(ARCH),PowerPC) -#LLCFLAGS += -enable-eh +LLCFLAGS += -enable-eh else ifeq ($(ARCH),x86) -#LLCFLAGS += -enable-eh +LLCFLAGS += -enable-eh else LLCFLAGS += -enable-correct-eh-support LLVMLD_FLAGS += -disable-inlining From edwintorok at gmail.com Tue Apr 1 15:21:03 2008 From: edwintorok at gmail.com (=?ISO-8859-1?Q?T=F6r=F6k_Edwin?=) Date: Tue, 01 Apr 2008 23:21:03 +0300 Subject: [llvm-commits] [PATCH] add GraphTraits for class User In-Reply-To: References: <47F124A9.40508@gmail.com> Message-ID: <47F2992F.5000508@gmail.com> Dan Gohman wrote: > On Mar 31, 2008, at 10:51 AM, T?r?k Edwin wrote: > >> Hi, >> >> This patch adds GraphTraits for class User, allowing to use a >> depth-first iterator to find out all values that depend on (use) a >> certain Value. >> This can currently be done only by coding a recursive function. >> >> I tried to use forward declaration of GraphTraits/Inverse to avoid >> including the header for it, but that doesn't work, because of >> Inverse. >> Is it ok to include those headers in User.h? If not, where should I >> move >> this GraphTraits code? >> > > Including those headers in User.h would be undesirable. Could you put > this code in a new header file, similar to how > llvm/Support/CFG.h contains the graph traits for BasicBlock objects? > Ok, I named it Support/DataFlow.h. Nick Lewycky wrote: > Don't add this to User.h. Create Support/DataFlow.h? UseDef.h? Not sure. > > No tabs allowed. > Ok, fixed. > You have a lot of whitespace errors. Decide, is it "User *X" or "User* = > > X"? I suggest the former. Also, there should be a space after the "if" = > > keyword. > I usually use "User *X" for variables and parameters, and "User*" for function return types. I don't have a good reason why, so using "User *X" consistently looks like a good suggestion. > Include a version that works on non-const User. > Ok, I did that. Thanks for the comments, I attached a new patch. Is the generic description of this new file Ok? Best regards, --Edwin -------------- next part -------------- A non-text attachment was scrubbed... Name: user_graphtraits2.patch Type: text/x-diff Size: 3025 bytes Desc: not available Url : http://lists.cs.uiuc.edu/pipermail/llvm-commits/attachments/20080401/500af84b/attachment.bin From gohman at apple.com Tue Apr 1 15:38:36 2008 From: gohman at apple.com (Dan Gohman) Date: Tue, 01 Apr 2008 20:38:36 -0000 Subject: [llvm-commits] [llvm] r49048 - in /llvm/trunk: lib/Target/X86/X86ISelLowering.cpp lib/Target/X86/X86Subtarget.cpp lib/Target/X86/X86Subtarget.h test/CodeGen/X86/darwin-bzero.ll Message-ID: <200804012038.m31Kcaxl020634@zion.cs.uiuc.edu> Author: djg Date: Tue Apr 1 15:38:36 2008 New Revision: 49048 URL: http://llvm.org/viewvc/llvm-project?rev=49048&view=rev Log: Speculatively micro-optimize memory-zeroing calls on Darwin 10. Added: llvm/trunk/test/CodeGen/X86/darwin-bzero.ll Modified: llvm/trunk/lib/Target/X86/X86ISelLowering.cpp llvm/trunk/lib/Target/X86/X86Subtarget.cpp llvm/trunk/lib/Target/X86/X86Subtarget.h Modified: llvm/trunk/lib/Target/X86/X86ISelLowering.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/X86/X86ISelLowering.cpp?rev=49048&r1=49047&r2=49048&view=diff ============================================================================== --- llvm/trunk/lib/Target/X86/X86ISelLowering.cpp (original) +++ llvm/trunk/lib/Target/X86/X86ISelLowering.cpp Tue Apr 1 15:38:36 2008 @@ -4560,6 +4560,11 @@ // address value and run time information about the CPU. if ((Align & 3) != 0 || (I && I->getValue() > Subtarget->getMaxInlineSizeThreshold())) { + + // Check to see if there is a specialized entry-point for memory zeroing. + const char *bzeroEntry = Subtarget->getBZeroEntry(); + ConstantSDNode *V = dyn_cast(Op.getOperand(2)); + MVT::ValueType IntPtr = getPointerTy(); const Type *IntPtrTy = getTargetData()->getIntPtrType(); TargetLowering::ArgListTy Args; @@ -4567,15 +4572,20 @@ Entry.Node = Op.getOperand(1); Entry.Ty = IntPtrTy; Args.push_back(Entry); - // Extend the unsigned i8 argument to be an int value for the call. - Entry.Node = DAG.getNode(ISD::ZERO_EXTEND, MVT::i32, Op.getOperand(2)); - Entry.Ty = IntPtrTy; - Args.push_back(Entry); + + if (!bzeroEntry) { + // Extend the unsigned i8 argument to be an int value for the call. + Entry.Node = DAG.getNode(ISD::ZERO_EXTEND, MVT::i32, Op.getOperand(2)); + Entry.Ty = IntPtrTy; + Args.push_back(Entry); + } + Entry.Node = Op.getOperand(3); Args.push_back(Entry); + const char *Name = bzeroEntry ? bzeroEntry : "memset"; std::pair CallResult = LowerCallTo(Chain, Type::VoidTy, false, false, false, CallingConv::C, - false, DAG.getExternalSymbol("memset", IntPtr), Args, DAG); + false, DAG.getExternalSymbol(Name, IntPtr), Args, DAG); return CallResult.second; } Modified: llvm/trunk/lib/Target/X86/X86Subtarget.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/X86/X86Subtarget.cpp?rev=49048&r1=49047&r2=49048&view=diff ============================================================================== --- llvm/trunk/lib/Target/X86/X86Subtarget.cpp (original) +++ llvm/trunk/lib/Target/X86/X86Subtarget.cpp Tue Apr 1 15:38:36 2008 @@ -53,6 +53,20 @@ return false; } +/// This function returns the name of a function which has an interface +/// like the non-standard bzero function, if such a function exists on +/// the current subtarget and it is considered prefereable over +/// memset with zero passed as the second argument. Otherwise it +/// returns null. +const char *X86Subtarget::getBZeroEntry() const { + + // Darwin 10 has a __bzero entry point for this purpose. + if (getDarwinVers() >= 10) + return "__bzero"; + + return 0; +} + /// GetCpuIDAndInfo - Execute the specified cpuid and return the 4 values in the /// specified arguments. If we can't run cpuid on the host, return true. bool X86::GetCpuIDAndInfo(unsigned value, unsigned *rEAX, unsigned *rEBX, Modified: llvm/trunk/lib/Target/X86/X86Subtarget.h URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/X86/X86Subtarget.h?rev=49048&r1=49047&r2=49048&view=diff ============================================================================== --- llvm/trunk/lib/Target/X86/X86Subtarget.h (original) +++ llvm/trunk/lib/Target/X86/X86Subtarget.h Tue Apr 1 15:38:36 2008 @@ -171,6 +171,12 @@ bool GVRequiresExtraLoad(const GlobalValue* GV, const TargetMachine& TM, bool isDirectCall) const; + /// This function returns the name of a function which has an interface + /// like the non-standard bzero function, if such a function exists on + /// the current subtarget and it is considered prefereable over + /// memset with zero passed as the second argument. Otherwise it + /// returns null. + const char *getBZeroEntry() const; }; namespace X86 { Added: llvm/trunk/test/CodeGen/X86/darwin-bzero.ll URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/X86/darwin-bzero.ll?rev=49048&view=auto ============================================================================== --- llvm/trunk/test/CodeGen/X86/darwin-bzero.ll (added) +++ llvm/trunk/test/CodeGen/X86/darwin-bzero.ll Tue Apr 1 15:38:36 2008 @@ -0,0 +1,8 @@ +; RUN: llvm-as < %s | llc -mtriple=i386-apple-darwin10 | grep __bzero + +declare void @llvm.memset.i32(i8*, i8, i32, i32) + +define void @foo(i8* %p, i32 %len) { + call void @llvm.memset.i32(i8* %p, i8 0, i32 %len, i32 1); + ret void +} From clattner at apple.com Tue Apr 1 15:48:18 2008 From: clattner at apple.com (Chris Lattner) Date: Tue, 1 Apr 2008 13:48:18 -0700 Subject: [llvm-commits] [llvm] r49048 - in /llvm/trunk: lib/Target/X86/X86ISelLowering.cpp lib/Target/X86/X86Subtarget.cpp lib/Target/X86/X86Subtarget.h test/CodeGen/X86/darwin-bzero.ll In-Reply-To: <200804012038.m31Kcaxl020634@zion.cs.uiuc.edu> References: <200804012038.m31Kcaxl020634@zion.cs.uiuc.edu> Message-ID: On Apr 1, 2008, at 1:38 PM, Dan Gohman wrote: > URL: http://llvm.org/viewvc/llvm-project?rev=49048&view=rev > Log: > Speculatively micro-optimize memory-zeroing calls on Darwin 10. Thanks Dan! Is this checking to see that the memset value is equal to zero? memset(x, 1, n) shouldn't use bzero. Maybe I'm just missing the check, -Chris From gohman at apple.com Tue Apr 1 15:56:18 2008 From: gohman at apple.com (Dan Gohman) Date: Tue, 01 Apr 2008 20:56:18 -0000 Subject: [llvm-commits] [llvm] r49050 - /llvm/trunk/lib/Target/X86/X86ISelLowering.cpp Message-ID: <200804012056.m31KuILb021134@zion.cs.uiuc.edu> Author: djg Date: Tue Apr 1 15:56:18 2008 New Revision: 49050 URL: http://llvm.org/viewvc/llvm-project?rev=49050&view=rev Log: Don't use __bzero for memset if the second argument isn't zero. Modified: llvm/trunk/lib/Target/X86/X86ISelLowering.cpp Modified: llvm/trunk/lib/Target/X86/X86ISelLowering.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/X86/X86ISelLowering.cpp?rev=49050&r1=49049&r2=49050&view=diff ============================================================================== --- llvm/trunk/lib/Target/X86/X86ISelLowering.cpp (original) +++ llvm/trunk/lib/Target/X86/X86ISelLowering.cpp Tue Apr 1 15:56:18 2008 @@ -4562,8 +4562,9 @@ (I && I->getValue() > Subtarget->getMaxInlineSizeThreshold())) { // Check to see if there is a specialized entry-point for memory zeroing. - const char *bzeroEntry = Subtarget->getBZeroEntry(); ConstantSDNode *V = dyn_cast(Op.getOperand(2)); + const char *bzeroEntry = + V && V->isNullValue() ? Subtarget->getBZeroEntry() : 0; MVT::ValueType IntPtr = getPointerTy(); const Type *IntPtrTy = getTargetData()->getIntPtrType(); From gohman at apple.com Tue Apr 1 15:58:08 2008 From: gohman at apple.com (Dan Gohman) Date: Tue, 1 Apr 2008 13:58:08 -0700 Subject: [llvm-commits] [llvm] r49048 - in /llvm/trunk: lib/Target/X86/X86ISelLowering.cpp lib/Target/X86/X86Subtarget.cpp lib/Target/X86/X86Subtarget.h test/CodeGen/X86/darwin-bzero.ll In-Reply-To: References: <200804012038.m31Kcaxl020634@zion.cs.uiuc.edu> Message-ID: On Apr 1, 2008, at 1:48 PM, Chris Lattner wrote: > On Apr 1, 2008, at 1:38 PM, Dan Gohman wrote: >> URL: http://llvm.org/viewvc/llvm-project?rev=49048&view=rev >> Log: >> Speculatively micro-optimize memory-zeroing calls on Darwin 10. > > Thanks Dan! Is this checking to see that the memset value is equal to > zero? memset(x, 1, n) shouldn't use bzero. Maybe I'm just missing > the check, You didn't miss it. It was in the original patch but I accidentally dropped it when introducing the subtarget code. Dan From clattner at apple.com Tue Apr 1 16:01:56 2008 From: clattner at apple.com (Chris Lattner) Date: Tue, 1 Apr 2008 14:01:56 -0700 Subject: [llvm-commits] [llvm] r49048 - in /llvm/trunk: lib/Target/X86/X86ISelLowering.cpp lib/Target/X86/X86Subtarget.cpp lib/Target/X86/X86Subtarget.h test/CodeGen/X86/darwin-bzero.ll In-Reply-To: References: <200804012038.m31Kcaxl020634@zion.cs.uiuc.edu> Message-ID: <2EB68036-1F0E-40D8-87A7-581EA90826A7@apple.com> On Apr 1, 2008, at 1:58 PM, Dan Gohman wrote: > On Apr 1, 2008, at 1:48 PM, Chris Lattner wrote: >> On Apr 1, 2008, at 1:38 PM, Dan Gohman wrote: >>> URL: http://llvm.org/viewvc/llvm-project?rev=49048&view=rev >>> Log: >>> Speculatively micro-optimize memory-zeroing calls on Darwin 10. >> >> Thanks Dan! Is this checking to see that the memset value is equal >> to >> zero? memset(x, 1, n) shouldn't use bzero. Maybe I'm just missing >> the check, > > You didn't miss it. It was in the original patch but I accidentally > dropped it when introducing the subtarget code. Ok, thanks! -Chris From evan.cheng at apple.com Tue Apr 1 16:37:32 2008 From: evan.cheng at apple.com (Evan Cheng) Date: Tue, 01 Apr 2008 21:37:32 -0000 Subject: [llvm-commits] [llvm] r49053 - /llvm/trunk/lib/CodeGen/LiveIntervalAnalysis.cpp Message-ID: <200804012137.m31LbWaC022362@zion.cs.uiuc.edu> Author: evancheng Date: Tue Apr 1 16:37:32 2008 New Revision: 49053 URL: http://llvm.org/viewvc/llvm-project?rev=49053&view=rev Log: Re-materialization is for uses only. Modified: llvm/trunk/lib/CodeGen/LiveIntervalAnalysis.cpp Modified: llvm/trunk/lib/CodeGen/LiveIntervalAnalysis.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/LiveIntervalAnalysis.cpp?rev=49053&r1=49052&r2=49053&view=diff ============================================================================== --- llvm/trunk/lib/CodeGen/LiveIntervalAnalysis.cpp (original) +++ llvm/trunk/lib/CodeGen/LiveIntervalAnalysis.cpp Tue Apr 1 16:37:32 2008 @@ -794,7 +794,7 @@ /// folding is possible. bool LiveIntervals::canFoldMemoryOperand(MachineInstr *MI, SmallVector &Ops, - bool ReMatLoad) const { + bool ReMat) const { // Filter the list of operand indexes that are to be folded. Abort if // any operand will prevent folding. unsigned MRInfo = 0; @@ -802,8 +802,8 @@ if (FilterFoldedOps(MI, Ops, MRInfo, FoldOps)) return false; - // Can't fold a remat'ed load into a two address instruction. - if (ReMatLoad && (MRInfo & VirtRegMap::isMod)) + // It's only legal to remat for a use, not a def. + if (ReMat && (MRInfo & VirtRegMap::isMod)) return false; return tii_->canFoldMemoryOperand(MI, FoldOps); @@ -947,7 +947,7 @@ goto RestartInstruction; } } else { - CanFold = canFoldMemoryOperand(MI, Ops, DefIsReMat && isLoad); + CanFold = canFoldMemoryOperand(MI, Ops, DefIsReMat); } } else CanFold = false; From evan.cheng at apple.com Tue Apr 1 16:38:20 2008 From: evan.cheng at apple.com (Evan Cheng) Date: Tue, 01 Apr 2008 21:38:20 -0000 Subject: [llvm-commits] [llvm] r49054 - /llvm/trunk/lib/Target/X86/X86InstrInfo.cpp Message-ID: <200804012138.m31LcKtt022395@zion.cs.uiuc.edu> Author: evancheng Date: Tue Apr 1 16:38:20 2008 New Revision: 49054 URL: http://llvm.org/viewvc/llvm-project?rev=49054&view=rev Log: Remove unnecessary and non-deterministic checking code. Re-enable remat of load from gv stub. Modified: llvm/trunk/lib/Target/X86/X86InstrInfo.cpp Modified: llvm/trunk/lib/Target/X86/X86InstrInfo.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/X86/X86InstrInfo.cpp?rev=49054&r1=49053&r2=49054&view=diff ============================================================================== --- llvm/trunk/lib/Target/X86/X86InstrInfo.cpp (original) +++ llvm/trunk/lib/Target/X86/X86InstrInfo.cpp Tue Apr 1 16:38:20 2008 @@ -752,10 +752,7 @@ /// isGVStub - Return true if the GV requires an extra load to get the /// real address. static inline bool isGVStub(GlobalValue *GV, X86TargetMachine &TM) { - return false; - /* Temporarily disabled. return TM.getSubtarget().GVRequiresExtraLoad(GV, TM, false); - */ } bool X86InstrInfo::isReallyTriviallyReMaterializable(MachineInstr *MI) const { @@ -1828,15 +1825,7 @@ MI->getOperand(0).getReg() == MI->getOperand(1).getReg()) { OpcodeTablePtr = &RegOp2MemOpTable2Addr; isTwoAddrFold = true; - // Can't write back to CPI or a GV stub. - if (MOs[3].isCPI() || - (MOs[3].isGlobal() && isGVStub(MOs[3].getGlobal(), TM))) - return NULL; } else if (i == 0) { // If operand 0 - // Can't write back to CPI or a GV stub. - if (MOs[3].isCPI() || - (MOs[3].isGlobal() && isGVStub(MOs[3].getGlobal(), TM))) - return NULL; if (MI->getOpcode() == X86::MOV16r0) NewMI = MakeM0Inst(*this, X86::MOV16mi, MOs, MI); else if (MI->getOpcode() == X86::MOV32r0) From dalej at apple.com Tue Apr 1 16:44:59 2008 From: dalej at apple.com (Dale Johannesen) Date: Tue, 1 Apr 2008 14:44:59 -0700 Subject: [llvm-commits] [llvm] r49006 - in /llvm/trunk/lib: CodeGen/DwarfWriter.cpp CodeGen/LLVMTargetMachine.cpp CodeGen/SelectionDAG/SelectionDAGISel.cpp Target/PowerPC/PPCAsmPrinter.cpp Target/PowerPC/PPCRegisterInfo.cpp Target/X86/X86AsmPrinter.cpp Target/X86/X86RegisterInfo.cpp Transforms/Utils/LowerInvoke.cpp In-Reply-To: <200804011349.49716.baldrick@free.fr> References: <200803312340.m2VNeOu9005523@zion.cs.uiuc.edu> <200804011349.49716.baldrick@free.fr> Message-ID: On Apr 1, 2008, at 4:49 AM, Duncan Sands wrote: > the dwarf info has two parts related to > exception handling: the eh table, and frame moves info. If > a function is nounwind then there is no need to generate the > frame moves info. If a function has no invokes then there > is no need to generate the eh table. So in the testcase CodeGen/X86/2007-09-17-ObjcFrameEH.ll, there is no need to generate the .eh symbol the test is looking for. Is that right? From isanbard at gmail.com Tue Apr 1 17:09:20 2008 From: isanbard at gmail.com (Bill Wendling) Date: Tue, 01 Apr 2008 22:09:20 -0000 Subject: [llvm-commits] [llvm] r49055 - /llvm/trunk/lib/Support/MemoryBuffer.cpp Message-ID: <200804012209.m31M9Kor023386@zion.cs.uiuc.edu> Author: void Date: Tue Apr 1 17:09:20 2008 New Revision: 49055 URL: http://llvm.org/viewvc/llvm-project?rev=49055&view=rev Log: Fix compilation errors on MSVC. Patch by Argiris Kirtzidis! Modified: llvm/trunk/lib/Support/MemoryBuffer.cpp Modified: llvm/trunk/lib/Support/MemoryBuffer.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Support/MemoryBuffer.cpp?rev=49055&r1=49054&r2=49055&view=diff ============================================================================== --- llvm/trunk/lib/Support/MemoryBuffer.cpp (original) +++ llvm/trunk/lib/Support/MemoryBuffer.cpp Tue Apr 1 17:09:20 2008 @@ -29,6 +29,7 @@ #include #else #include +#include #endif using namespace llvm; @@ -175,7 +176,7 @@ int64_t FileSize) { int OpenFlags = 0; #ifdef O_BINARY - Flags |= O_BINARY; // Open input file in binary mode on win32. + OpenFlags |= O_BINARY; // Open input file in binary mode on win32. #endif int FD = ::open(Filename, O_RDONLY|OpenFlags); if (FD == -1) { From greened at obbligato.org Tue Apr 1 17:14:23 2008 From: greened at obbligato.org (David Greene) Date: Tue, 01 Apr 2008 22:14:23 -0000 Subject: [llvm-commits] [llvm] r49056 - /llvm/trunk/lib/Transforms/Scalar/LoopIndexSplit.cpp Message-ID: <200804012214.m31MENkW023546@zion.cs.uiuc.edu> Author: greened Date: Tue Apr 1 17:14:23 2008 New Revision: 49056 URL: http://llvm.org/viewvc/llvm-project?rev=49056&view=rev Log: Iterators folloring a SmallVector erased element are invalidated so don't access cached iterators from after the erased element. Modified: llvm/trunk/lib/Transforms/Scalar/LoopIndexSplit.cpp Modified: llvm/trunk/lib/Transforms/Scalar/LoopIndexSplit.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Scalar/LoopIndexSplit.cpp?rev=49056&r1=49055&r2=49056&view=diff ============================================================================== --- llvm/trunk/lib/Transforms/Scalar/LoopIndexSplit.cpp (original) +++ llvm/trunk/lib/Transforms/Scalar/LoopIndexSplit.cpp Tue Apr 1 17:14:23 2008 @@ -232,8 +232,8 @@ return false; // First see if it is possible to eliminate loop itself or not. - for (SmallVector::iterator SI = SplitData.begin(), - E = SplitData.end(); SI != E;) { + for (SmallVector::iterator SI = SplitData.begin(); + SI != SplitData.end();) { SplitInfo &SD = *SI; ICmpInst *CI = dyn_cast(SD.SplitCondition); if (SD.SplitCondition->getOpcode() == Instruction::And) { @@ -244,8 +244,7 @@ return Changed; } else { SmallVector::iterator Delete_SI = SI; - ++SI; - SplitData.erase(Delete_SI); + SI = SplitData.erase(Delete_SI); } } else if (CI && CI->getPredicate() == ICmpInst::ICMP_EQ) { @@ -256,8 +255,7 @@ return Changed; } else { SmallVector::iterator Delete_SI = SI; - ++SI; - SplitData.erase(Delete_SI); + SI = SplitData.erase(Delete_SI); } } else ++SI; From resistor at mac.com Tue Apr 1 17:55:53 2008 From: resistor at mac.com (Owen Anderson) Date: Tue, 1 Apr 2008 17:55:53 -0500 Subject: [llvm-commits] [llvm] r49056 - /llvm/trunk/lib/Transforms/Scalar/LoopIndexSplit.cpp In-Reply-To: <200804012214.m31MENkW023546@zion.cs.uiuc.edu> References: <200804012214.m31MENkW023546@zion.cs.uiuc.edu> Message-ID: <14B3E407-1549-45E2-870E-E7C7AA967E01@mac.com> David, This is breaking the build. Please fix. --Owen On Apr 1, 2008, at 5:14 PM, David Greene wrote: > Author: greened > Date: Tue Apr 1 17:14:23 2008 > New Revision: 49056 > > URL: http://llvm.org/viewvc/llvm-project?rev=49056&view=rev > Log: > > Iterators folloring a SmallVector erased element are invalidated so > don't access cached iterators from after the erased element. > > Modified: > llvm/trunk/lib/Transforms/Scalar/LoopIndexSplit.cpp > > Modified: llvm/trunk/lib/Transforms/Scalar/LoopIndexSplit.cpp > URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Scalar/LoopIndexSplit.cpp?rev=49056&r1=49055&r2=49056&view=diff > > = > = > = > = > = > = > = > = > ====================================================================== > --- llvm/trunk/lib/Transforms/Scalar/LoopIndexSplit.cpp (original) > +++ llvm/trunk/lib/Transforms/Scalar/LoopIndexSplit.cpp Tue Apr 1 > 17:14:23 2008 > @@ -232,8 +232,8 @@ > return false; > > // First see if it is possible to eliminate loop itself or not. > - for (SmallVector::iterator SI = SplitData.begin(), > - E = SplitData.end(); SI != E;) { > + for (SmallVector::iterator SI = SplitData.begin(); > + SI != SplitData.end();) { > SplitInfo &SD = *SI; > ICmpInst *CI = dyn_cast(SD.SplitCondition); > if (SD.SplitCondition->getOpcode() == Instruction::And) { > @@ -244,8 +244,7 @@ > return Changed; > } else { > SmallVector::iterator Delete_SI = SI; > - ++SI; > - SplitData.erase(Delete_SI); > + SI = SplitData.erase(Delete_SI); > } > } > else if (CI && CI->getPredicate() == ICmpInst::ICMP_EQ) { > @@ -256,8 +255,7 @@ > return Changed; > } else { > SmallVector::iterator Delete_SI = SI; > - ++SI; > - SplitData.erase(Delete_SI); > + SI = SplitData.erase(Delete_SI); > } > } else > ++SI; > > > _______________________________________________ > llvm-commits mailing list > llvm-commits at cs.uiuc.edu > http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits -------------- next part -------------- A non-text attachment was scrubbed... Name: smime.p7s Type: application/pkcs7-signature Size: 2555 bytes Desc: not available Url : http://lists.cs.uiuc.edu/pipermail/llvm-commits/attachments/20080401/78276a3d/attachment.bin From evan.cheng at apple.com Tue Apr 1 18:26:12 2008 From: evan.cheng at apple.com (Evan Cheng) Date: Tue, 01 Apr 2008 23:26:12 -0000 Subject: [llvm-commits] [llvm] r49059 - /llvm/trunk/lib/Target/X86/X86InstrInfo.cpp Message-ID: <200804012326.m31NQCT9025661@zion.cs.uiuc.edu> Author: evancheng Date: Tue Apr 1 18:26:12 2008 New Revision: 49059 URL: http://llvm.org/viewvc/llvm-project?rev=49059&view=rev Log: ReMat of load from stub in pic mode extends the life of pic base. Currently spiller doesn't do a good job of estimating the impact. Disable for now. Modified: llvm/trunk/lib/Target/X86/X86InstrInfo.cpp Modified: llvm/trunk/lib/Target/X86/X86InstrInfo.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/X86/X86InstrInfo.cpp?rev=49059&r1=49058&r2=49059&view=diff ============================================================================== --- llvm/trunk/lib/Target/X86/X86InstrInfo.cpp (original) +++ llvm/trunk/lib/Target/X86/X86InstrInfo.cpp Tue Apr 1 18:26:12 2008 @@ -37,6 +37,10 @@ cl::desc("Print instructions that the allocator wants to" " fuse, but the X86 backend currently can't"), cl::Hidden); + cl::opt + ReMatPICStubLoad("remat-pic-stub-load", + cl::desc("Re-materialize load from stub in PIC mode"), + cl::init(false), cl::Hidden); } X86InstrInfo::X86InstrInfo(X86TargetMachine &tm) @@ -782,6 +786,8 @@ if (BaseReg == 0) return true; // Allow re-materialization of PIC load. + if (!ReMatPICStubLoad && MI->getOperand(4).isGlobal()) + return false; MachineRegisterInfo &MRI = MI->getParent()->getParent()->getRegInfo(); bool isPICBase = false; for (MachineRegisterInfo::def_iterator I = MRI.def_begin(BaseReg), From tonic at nondot.org Tue Apr 1 18:41:44 2008 From: tonic at nondot.org (Tanya Lattner) Date: Tue, 01 Apr 2008 23:41:44 -0000 Subject: [llvm-commits] [llvm] r49060 - /llvm/trunk/lib/Transforms/Scalar/LoopIndexSplit.cpp Message-ID: <200804012341.m31Nfiji026152@zion.cs.uiuc.edu> Author: tbrethou Date: Tue Apr 1 18:41:44 2008 New Revision: 49060 URL: http://llvm.org/viewvc/llvm-project?rev=49060&view=rev Log: Reverting 49056 due to the build being broken. Modified: llvm/trunk/lib/Transforms/Scalar/LoopIndexSplit.cpp Modified: llvm/trunk/lib/Transforms/Scalar/LoopIndexSplit.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Scalar/LoopIndexSplit.cpp?rev=49060&r1=49059&r2=49060&view=diff ============================================================================== --- llvm/trunk/lib/Transforms/Scalar/LoopIndexSplit.cpp (original) +++ llvm/trunk/lib/Transforms/Scalar/LoopIndexSplit.cpp Tue Apr 1 18:41:44 2008 @@ -232,8 +232,8 @@ return false; // First see if it is possible to eliminate loop itself or not. - for (SmallVector::iterator SI = SplitData.begin(); - SI != SplitData.end();) { + for (SmallVector::iterator SI = SplitData.begin(), + E = SplitData.end(); SI != E;) { SplitInfo &SD = *SI; ICmpInst *CI = dyn_cast(SD.SplitCondition); if (SD.SplitCondition->getOpcode() == Instruction::And) { @@ -244,7 +244,8 @@ return Changed; } else { SmallVector::iterator Delete_SI = SI; - SI = SplitData.erase(Delete_SI); + ++SI; + SplitData.erase(Delete_SI); } } else if (CI && CI->getPredicate() == ICmpInst::ICMP_EQ) { @@ -255,7 +256,8 @@ return Changed; } else { SmallVector::iterator Delete_SI = SI; - SI = SplitData.erase(Delete_SI); + ++SI; + SplitData.erase(Delete_SI); } } else ++SI; From lattner at apple.com Tue Apr 1 18:39:34 2008 From: lattner at apple.com (Tanya Lattner) Date: Tue, 1 Apr 2008 16:39:34 -0700 Subject: [llvm-commits] [llvm] r49056 - /llvm/trunk/lib/Transforms/Scalar/LoopIndexSplit.cpp In-Reply-To: <14B3E407-1549-45E2-870E-E7C7AA967E01@mac.com> References: <200804012214.m31MENkW023546@zion.cs.uiuc.edu> <14B3E407-1549-45E2-870E-E7C7AA967E01@mac.com> Message-ID: <720F2137-E73D-4798-9213-5CB1B6A16A61@apple.com> This has been reverted. -Tanya On Apr 1, 2008, at 3:55 PM, Owen Anderson wrote: > David, > > This is breaking the build. Please fix. > > --Owen > > On Apr 1, 2008, at 5:14 PM, David Greene wrote: > >> Author: greened >> Date: Tue Apr 1 17:14:23 2008 >> New Revision: 49056 >> >> URL: http://llvm.org/viewvc/llvm-project?rev=49056&view=rev >> Log: >> >> Iterators folloring a SmallVector erased element are invalidated so >> don't access cached iterators from after the erased element. >> >> Modified: >> llvm/trunk/lib/Transforms/Scalar/LoopIndexSplit.cpp >> >> Modified: llvm/trunk/lib/Transforms/Scalar/LoopIndexSplit.cpp >> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/ >> Scalar/LoopIndexSplit.cpp?rev=49056&r1=49055&r2=49056&view=diff >> >> = >> = >> = >> = >> = >> = >> = >> = >> ===================================================================== >> = >> --- llvm/trunk/lib/Transforms/Scalar/LoopIndexSplit.cpp (original) >> +++ llvm/trunk/lib/Transforms/Scalar/LoopIndexSplit.cpp Tue Apr 1 >> 17:14:23 2008 >> @@ -232,8 +232,8 @@ >> return false; >> >> // First see if it is possible to eliminate loop itself or not. >> - for (SmallVector::iterator SI = SplitData.begin(), >> - E = SplitData.end(); SI != E;) { >> + for (SmallVector::iterator SI = SplitData.begin(); >> + SI != SplitData.end();) { >> SplitInfo &SD = *SI; >> ICmpInst *CI = dyn_cast(SD.SplitCondition); >> if (SD.SplitCondition->getOpcode() == Instruction::And) { >> @@ -244,8 +244,7 @@ >> return Changed; >> } else { >> SmallVector::iterator Delete_SI = SI; >> - ++SI; >> - SplitData.erase(Delete_SI); >> + SI = SplitData.erase(Delete_SI); >> } >> } >> else if (CI && CI->getPredicate() == ICmpInst::ICMP_EQ) { >> @@ -256,8 +255,7 @@ >> return Changed; >> } else { >> SmallVector::iterator Delete_SI = SI; >> - ++SI; >> - SplitData.erase(Delete_SI); >> + SI = SplitData.erase(Delete_SI); >> } >> } else >> ++SI; >> >> >> _______________________________________________ >> llvm-commits mailing list >> llvm-commits at cs.uiuc.edu >> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits > > _______________________________________________ > llvm-commits mailing list > llvm-commits at cs.uiuc.edu > http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits From clattner at apple.com Tue Apr 1 18:51:05 2008 From: clattner at apple.com (Chris Lattner) Date: Tue, 1 Apr 2008 16:51:05 -0700 Subject: [llvm-commits] [llvm] r49006 - in /llvm/trunk/lib: CodeGen/DwarfWriter.cpp CodeGen/LLVMTargetMachine.cpp CodeGen/SelectionDAG/SelectionDAGISel.cpp Target/PowerPC/PPCAsmPrinter.cpp Target/PowerPC/PPCRegisterInfo.cpp Target/X86/X86AsmPrinter.cpp Target/X86/X86RegisterInfo.cpp Transforms/Utils/LowerInvoke.cpp In-Reply-To: References: <200803312340.m2VNeOu9005523@zion.cs.uiuc.edu> <200804011349.49716.baldrick@free.fr> Message-ID: On Apr 1, 2008, at 2:44 PM, Dale Johannesen wrote: > > > On Apr 1, 2008, at 4:49 AM, Duncan Sands wrote: > >> the dwarf info has two parts related to >> exception handling: the eh table, and frame moves info. If >> a function is nounwind then there is no need to generate the >> frame moves info. If a function has no invokes then there >> is no need to generate the eh table. > > So in the testcase CodeGen/X86/2007-09-17-ObjcFrameEH.ll, > there is no need to generate the .eh symbol the test is looking > for. Is that right? Yep, from the commit message: -- Objective-C was generating EH frame info like this: "_-[NSString(local) isNullOrNil]".eh = 0 .no_dead_strip "_-[NSString(local) isNullOrNil]".eh The ".eh" should be inside the quotes. --- To make this test test the thing that we care about, I'd add a call to the body of the function. -Chris From evan.cheng at apple.com Tue Apr 1 18:59:29 2008 From: evan.cheng at apple.com (Evan Cheng) Date: Tue, 01 Apr 2008 23:59:29 -0000 Subject: [llvm-commits] [llvm] r49061 - in /llvm/trunk/lib/Transforms: IPO/Inliner.cpp Utils/InlineCost.cpp Message-ID: <200804012359.m31NxUgc026842@zion.cs.uiuc.edu> Author: evancheng Date: Tue Apr 1 18:59:29 2008 New Revision: 49061 URL: http://llvm.org/viewvc/llvm-project?rev=49061&view=rev Log: 1. Drop default inline threshold back down to 200. 2. Do not use # of basic blocks as part of the cost computation since it doesn't really figure into function size. 3. More aggressively inline function with vector code. Modified: llvm/trunk/lib/Transforms/IPO/Inliner.cpp llvm/trunk/lib/Transforms/Utils/InlineCost.cpp Modified: llvm/trunk/lib/Transforms/IPO/Inliner.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/IPO/Inliner.cpp?rev=49061&r1=49060&r2=49061&view=diff ============================================================================== --- llvm/trunk/lib/Transforms/IPO/Inliner.cpp (original) +++ llvm/trunk/lib/Transforms/IPO/Inliner.cpp Tue Apr 1 18:59:29 2008 @@ -32,8 +32,8 @@ namespace { cl::opt - InlineLimit("inline-threshold", cl::Hidden, cl::init(400), - cl::desc("Control the amount of inlining to perform (default = 400)")); + InlineLimit("inline-threshold", cl::Hidden, cl::init(200), + cl::desc("Control the amount of inlining to perform (default = 200)")); } Inliner::Inliner(const void *ID) Modified: llvm/trunk/lib/Transforms/Utils/InlineCost.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Utils/InlineCost.cpp?rev=49061&r1=49060&r2=49061&view=diff ============================================================================== --- llvm/trunk/lib/Transforms/Utils/InlineCost.cpp (original) +++ llvm/trunk/lib/Transforms/Utils/InlineCost.cpp Tue Apr 1 18:59:29 2008 @@ -234,14 +234,12 @@ // Now that we have considered all of the factors that make the call site more // likely to be inlined, look at factors that make us not want to inline it. - // Don't inline into something too big, which would make it bigger. Here, we - // count each basic block as a single unit. + // Don't inline into something too big, which would make it bigger. // InlineCost += Caller->size()/20; - // Look at the size of the callee. Each basic block counts as 20 units, and - // each instruction counts as 5. - InlineCost += CalleeFI.NumInsts*5 + CalleeFI.NumBlocks*20; + // Look at the size of the callee. Each instruction counts as 5. + InlineCost += CalleeFI.NumInsts*5; return InlineCost; } @@ -258,9 +256,16 @@ if (CalleeFI.NumBlocks == 0) CalleeFI.analyzeFunction(Callee); + float Factor = 1.0f; + // Single BB functions are often written to be inlined. + if (CalleeFI.NumBlocks == 1) + Factor += 0.5f; + // Be more aggressive if the function contains a good chunk (if it mades up // at least 10% of the instructions) of vector instructions. - if (CalleeFI.NumVectorInsts > CalleeFI.NumInsts/10) - return 1.5f; - return 1.0f; + if (CalleeFI.NumVectorInsts > CalleeFI.NumInsts/2) + Factor += 2.0f; + else if (CalleeFI.NumVectorInsts > CalleeFI.NumInsts/10) + Factor += 1.5f; + return Factor; } From evan.cheng at apple.com Tue Apr 1 19:00:43 2008 From: evan.cheng at apple.com (Evan Cheng) Date: Wed, 02 Apr 2008 00:00:43 -0000 Subject: [llvm-commits] [llvm-gcc-4.2] r49062 - /llvm-gcc-4.2/trunk/gcc/llvm-backend.cpp Message-ID: <200804020000.m3200hih026932@zion.cs.uiuc.edu> Author: evancheng Date: Tue Apr 1 19:00:42 2008 New Revision: 49062 URL: http://llvm.org/viewvc/llvm-project?rev=49062&view=rev Log: Drop inline threshold to 100 when optimizing for size. Modified: llvm-gcc-4.2/trunk/gcc/llvm-backend.cpp Modified: llvm-gcc-4.2/trunk/gcc/llvm-backend.cpp URL: http://llvm.org/viewvc/llvm-project/llvm-gcc-4.2/trunk/gcc/llvm-backend.cpp?rev=49062&r1=49061&r2=49062&view=diff ============================================================================== --- llvm-gcc-4.2/trunk/gcc/llvm-backend.cpp (original) +++ llvm-gcc-4.2/trunk/gcc/llvm-backend.cpp Tue Apr 1 19:00:42 2008 @@ -129,8 +129,8 @@ if (flag_debug_pass_arguments) Args.push_back("--debug-pass=Arguments"); if (optimize_size) - // Reduce inline limit. Default limit is 400. - Args.push_back("--inline-threshold=200"); + // Reduce inline limit. Default limit is 200. + Args.push_back("--inline-threshold=100"); // If there are options that should be passed through to the LLVM backend // directly from the command line, do so now. This is mainly for debugging From evan.cheng at apple.com Tue Apr 1 19:14:23 2008 From: evan.cheng at apple.com (Evan Cheng) Date: Wed, 02 Apr 2008 00:14:23 -0000 Subject: [llvm-commits] [test-suite] r49063 - /test-suite/trunk/autoconf/configure.ac Message-ID: <200804020014.m320ENiM027611@zion.cs.uiuc.edu> Author: evancheng Date: Tue Apr 1 19:14:23 2008 New Revision: 49063 URL: http://llvm.org/viewvc/llvm-project?rev=49063&view=rev Log: Enable SPEC benchmark with objdir != srcdir. Patch by Julien Lerouge. Modified: test-suite/trunk/autoconf/configure.ac Modified: test-suite/trunk/autoconf/configure.ac URL: http://llvm.org/viewvc/llvm-project/test-suite/trunk/autoconf/configure.ac?rev=49063&r1=49062&r2=49063&view=diff ============================================================================== --- test-suite/trunk/autoconf/configure.ac (original) +++ test-suite/trunk/autoconf/configure.ac Tue Apr 1 19:14:23 2008 @@ -31,6 +31,7 @@ AC_CONFIG_MAKEFILE(External/Povray/Makefile) AC_CONFIG_MAKEFILE(External/SPEC/Makefile) AC_CONFIG_MAKEFILE(External/SPEC/Makefile.spec) +AC_CONFIG_MAKEFILE(External/SPEC/Makefile.spec.config) AC_CONFIG_MAKEFILE(External/SPEC/Makefile.spec2006) AC_CONFIG_MAKEFILE(External/SPEC/Makefile.spec2000) AC_CONFIG_MAKEFILE(External/SPEC/Makefile.spec95) From dalej at apple.com Tue Apr 1 19:25:04 2008 From: dalej at apple.com (Dale Johannesen) Date: Wed, 02 Apr 2008 00:25:04 -0000 Subject: [llvm-commits] [llvm] r49064 - in /llvm/trunk: include/llvm/CodeGen/MachineModuleInfo.h lib/CodeGen/DwarfWriter.cpp lib/CodeGen/LLVMTargetMachine.cpp lib/CodeGen/MachineModuleInfo.cpp lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp lib/Target/PowerPC/PPCAsmPrinter.cpp lib/Target/PowerPC/PPCRegisterInfo.cpp lib/Target/X86/X86ATTAsmPrinter.cpp lib/Target/X86/X86AsmPrinter.cpp lib/Target/X86/X86RegisterInfo.cpp Message-ID: <200804020025.m320P5FC028148@zion.cs.uiuc.edu> Author: johannes Date: Tue Apr 1 19:25:04 2008 New Revision: 49064 URL: http://llvm.org/viewvc/llvm-project?rev=49064&view=rev Log: Recommitting EH patch; this should answer most of the review feedback. -enable-eh is still accepted but doesn't do anything. EH intrinsics use Dwarf EH if the target supports that, and are handled by LowerInvoke otherwise. The separation of the EH table and frame move data is, I think, logically figured out, but either one still causes full EH info to be generated (not sure how to split the metadata correctly). MachineModuleInfo::needsFrameInfo is no longer used and is removed. Modified: llvm/trunk/include/llvm/CodeGen/MachineModuleInfo.h llvm/trunk/lib/CodeGen/DwarfWriter.cpp llvm/trunk/lib/CodeGen/LLVMTargetMachine.cpp llvm/trunk/lib/CodeGen/MachineModuleInfo.cpp llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp llvm/trunk/lib/Target/PowerPC/PPCAsmPrinter.cpp llvm/trunk/lib/Target/PowerPC/PPCRegisterInfo.cpp llvm/trunk/lib/Target/X86/X86ATTAsmPrinter.cpp llvm/trunk/lib/Target/X86/X86AsmPrinter.cpp llvm/trunk/lib/Target/X86/X86RegisterInfo.cpp Modified: llvm/trunk/include/llvm/CodeGen/MachineModuleInfo.h URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/CodeGen/MachineModuleInfo.h?rev=49064&r1=49063&r2=49064&view=diff ============================================================================== --- llvm/trunk/include/llvm/CodeGen/MachineModuleInfo.h (original) +++ llvm/trunk/include/llvm/CodeGen/MachineModuleInfo.h Tue Apr 1 19:25:04 2008 @@ -1091,10 +1091,6 @@ /// bool hasDebugInfo() const { return !CompileUnits.empty(); } - /// needsFrameInfo - Returns true if we need to gather callee-saved register - /// move info for the frame. - bool needsFrameInfo() const; - bool callsEHReturn() const { return CallsEHReturn; } void setCallsEHReturn(bool b) { CallsEHReturn = b; } Modified: llvm/trunk/lib/CodeGen/DwarfWriter.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/DwarfWriter.cpp?rev=49064&r1=49063&r2=49064&view=diff ============================================================================== --- llvm/trunk/lib/CodeGen/DwarfWriter.cpp (original) +++ llvm/trunk/lib/CodeGen/DwarfWriter.cpp Tue Apr 1 19:25:04 2008 @@ -2777,10 +2777,22 @@ }; std::vector EHFrames; - - /// shouldEmit - Flag to indicate if debug information should be emitted. - /// - bool shouldEmit; + + /// shouldEmitTable - Per-function flag to indicate if EH tables should + /// be emitted. + bool shouldEmitTable; + + /// shouldEmitMoves - Per-function flag to indicate if frame moves info + /// should be emitted. + bool shouldEmitMoves; + + /// shouldEmitTableModule - Per-module flag to indicate if EH tables + /// should be emitted. + bool shouldEmitTableModule; + + /// shouldEmitFrameModule - Per-module flag to indicate if frame moves + /// should be emitted. + bool shouldEmitMovesModule; /// EmitCommonEHFrame - Emit the common eh unwind frame. /// @@ -3045,9 +3057,6 @@ }; void EmitExceptionTable() { - // Map all labels and get rid of any dead landing pads. - MMI->TidyLandingPads(); - const std::vector &TypeInfos = MMI->getTypeInfos(); const std::vector &FilterIds = MMI->getFilterIds(); const std::vector &PadInfos = MMI->getLandingPads(); @@ -3367,7 +3376,10 @@ // DwarfException(std::ostream &OS, AsmPrinter *A, const TargetAsmInfo *T) : Dwarf(OS, A, T, "eh") - , shouldEmit(false) + , shouldEmitTable(false) + , shouldEmitMoves(false) + , shouldEmitTableModule(false) + , shouldEmitMovesModule(false) {} virtual ~DwarfException() {} @@ -3387,48 +3399,59 @@ /// EndModule - Emit all exception information that should come after the /// content. void EndModule() { - if (!shouldEmit) return; - - const std::vector Personalities = MMI->getPersonalities(); - for (unsigned i =0; i < Personalities.size(); ++i) - EmitCommonEHFrame(Personalities[i], i); - - for (std::vector::iterator I = EHFrames.begin(), - E = EHFrames.end(); I != E; ++I) - EmitEHFrame(*I); + if (shouldEmitMovesModule || shouldEmitTableModule) { + const std::vector Personalities = MMI->getPersonalities(); + for (unsigned i =0; i < Personalities.size(); ++i) + EmitCommonEHFrame(Personalities[i], i); + + for (std::vector::iterator I = EHFrames.begin(), + E = EHFrames.end(); I != E; ++I) + EmitEHFrame(*I); + } } /// BeginFunction - Gather pre-function exception information. Assumes being /// emitted immediately after the function entry point. void BeginFunction(MachineFunction *MF) { this->MF = MF; - - if (MMI && - ExceptionHandling && - TAI->doesSupportExceptionHandling()) { - shouldEmit = true; - // Assumes in correct section after the entry point. - EmitLabel("eh_func_begin", ++SubprogramCount); + shouldEmitTable = shouldEmitMoves = false; + if (TAI->doesSupportExceptionHandling()) { + + // Map all labels and get rid of any dead landing pads. + MMI->TidyLandingPads(); + // If any landing pads survive, we need an EH table. + if (MMI->getLandingPads().size()) + shouldEmitTable = true; + + // See if we need frame move info. + if (MMI->hasDebugInfo() || !MF->getFunction()->doesNotThrow()) + shouldEmitMoves = true; + + if (shouldEmitMoves || shouldEmitTable) + // Assumes in correct section after the entry point. + EmitLabel("eh_func_begin", ++SubprogramCount); } + shouldEmitTableModule |= shouldEmitTable; + shouldEmitMovesModule |= shouldEmitMoves; } /// EndFunction - Gather and emit post-function exception information. /// void EndFunction() { - if (!shouldEmit) return; - - EmitLabel("eh_func_end", SubprogramCount); - EmitExceptionTable(); - - // Save EH frame information - EHFrames. - push_back(FunctionEHFrameInfo(getAsm()->getCurrentFunctionEHName(MF), + if (shouldEmitMoves || shouldEmitTable) { + EmitLabel("eh_func_end", SubprogramCount); + EmitExceptionTable(); + + // Save EH frame information + EHFrames. + push_back(FunctionEHFrameInfo(getAsm()->getCurrentFunctionEHName(MF), SubprogramCount, MMI->getPersonalityIndex(), MF->getFrameInfo()->hasCalls(), !MMI->getLandingPads().empty(), MMI->getFrameMoves(), MF->getFunction())); + } } }; Modified: llvm/trunk/lib/CodeGen/LLVMTargetMachine.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/LLVMTargetMachine.cpp?rev=49064&r1=49063&r2=49064&view=diff ============================================================================== --- llvm/trunk/lib/CodeGen/LLVMTargetMachine.cpp (original) +++ llvm/trunk/lib/CodeGen/LLVMTargetMachine.cpp Tue Apr 1 19:25:04 2008 @@ -19,6 +19,7 @@ #include "llvm/CodeGen/Passes.h" #include "llvm/CodeGen/Collector.h" #include "llvm/Target/TargetOptions.h" +#include "llvm/Target/TargetAsmInfo.h" #include "llvm/Transforms/Scalar.h" #include "llvm/Support/CommandLine.h" using namespace llvm; @@ -66,7 +67,7 @@ PM.add(createGCLoweringPass()); - if (!ExceptionHandling) + if (!getTargetAsmInfo()->doesSupportExceptionHandling()) PM.add(createLowerInvokePass(getTargetLowering())); // Make sure that no unreachable blocks are instruction selected. @@ -192,7 +193,7 @@ PM.add(createGCLoweringPass()); - if (!ExceptionHandling) + if (!getTargetAsmInfo()->doesSupportExceptionHandling()) PM.add(createLowerInvokePass(getTargetLowering())); // Make sure that no unreachable blocks are instruction selected. Modified: llvm/trunk/lib/CodeGen/MachineModuleInfo.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/MachineModuleInfo.cpp?rev=49064&r1=49063&r2=49064&view=diff ============================================================================== --- llvm/trunk/lib/CodeGen/MachineModuleInfo.cpp (original) +++ llvm/trunk/lib/CodeGen/MachineModuleInfo.cpp Tue Apr 1 19:25:04 2008 @@ -1583,12 +1583,6 @@ } } -/// needsFrameInfo - Returns true if we need to gather callee-saved register -/// move info for the frame. -bool MachineModuleInfo::needsFrameInfo() const { - return hasDebugInfo() || ExceptionHandling; -} - /// SetupCompileUnits - Set up the unique vector of compile units. /// void MachineModuleInfo::SetupCompileUnits(Module &M) { Modified: llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp?rev=49064&r1=49063&r2=49064&view=diff ============================================================================== --- llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp (original) +++ llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp Tue Apr 1 19:25:04 2008 @@ -2827,22 +2827,18 @@ } case Intrinsic::eh_exception: { - if (ExceptionHandling) { - if (!CurMBB->isLandingPad()) { - // FIXME: Mark exception register as live in. Hack for PR1508. - unsigned Reg = TLI.getExceptionAddressRegister(); - if (Reg) CurMBB->addLiveIn(Reg); - } - // Insert the EXCEPTIONADDR instruction. - SDVTList VTs = DAG.getVTList(TLI.getPointerTy(), MVT::Other); - SDOperand Ops[1]; - Ops[0] = DAG.getRoot(); - SDOperand Op = DAG.getNode(ISD::EXCEPTIONADDR, VTs, Ops, 1); - setValue(&I, Op); - DAG.setRoot(Op.getValue(1)); - } else { - setValue(&I, DAG.getConstant(0, TLI.getPointerTy())); - } + if (!CurMBB->isLandingPad()) { + // FIXME: Mark exception register as live in. Hack for PR1508. + unsigned Reg = TLI.getExceptionAddressRegister(); + if (Reg) CurMBB->addLiveIn(Reg); + } + // Insert the EXCEPTIONADDR instruction. + SDVTList VTs = DAG.getVTList(TLI.getPointerTy(), MVT::Other); + SDOperand Ops[1]; + Ops[0] = DAG.getRoot(); + SDOperand Op = DAG.getNode(ISD::EXCEPTIONADDR, VTs, Ops, 1); + setValue(&I, Op); + DAG.setRoot(Op.getValue(1)); return 0; } @@ -2852,7 +2848,7 @@ MVT::ValueType VT = (Intrinsic == Intrinsic::eh_selector_i32 ? MVT::i32 : MVT::i64); - if (ExceptionHandling && MMI) { + if (MMI) { if (CurMBB->isLandingPad()) addCatchInfo(I, MMI, CurMBB); else { @@ -2902,7 +2898,7 @@ case Intrinsic::eh_return: { MachineModuleInfo *MMI = DAG.getMachineModuleInfo(); - if (MMI && ExceptionHandling) { + if (MMI) { MMI->setCallsEHReturn(true); DAG.setRoot(DAG.getNode(ISD::EH_RETURN, MVT::Other, @@ -2925,32 +2921,27 @@ } case Intrinsic::eh_dwarf_cfa: { - if (ExceptionHandling) { - MVT::ValueType VT = getValue(I.getOperand(1)).getValueType(); - SDOperand CfaArg; - if (MVT::getSizeInBits(VT) > MVT::getSizeInBits(TLI.getPointerTy())) - CfaArg = DAG.getNode(ISD::TRUNCATE, - TLI.getPointerTy(), getValue(I.getOperand(1))); - else - CfaArg = DAG.getNode(ISD::SIGN_EXTEND, - TLI.getPointerTy(), getValue(I.getOperand(1))); - - SDOperand Offset = DAG.getNode(ISD::ADD, - TLI.getPointerTy(), - DAG.getNode(ISD::FRAME_TO_ARGS_OFFSET, - TLI.getPointerTy()), - CfaArg); - setValue(&I, DAG.getNode(ISD::ADD, - TLI.getPointerTy(), - DAG.getNode(ISD::FRAMEADDR, - TLI.getPointerTy(), - DAG.getConstant(0, - TLI.getPointerTy())), - Offset)); - } else { - setValue(&I, DAG.getConstant(0, TLI.getPointerTy())); - } - + MVT::ValueType VT = getValue(I.getOperand(1)).getValueType(); + SDOperand CfaArg; + if (MVT::getSizeInBits(VT) > MVT::getSizeInBits(TLI.getPointerTy())) + CfaArg = DAG.getNode(ISD::TRUNCATE, + TLI.getPointerTy(), getValue(I.getOperand(1))); + else + CfaArg = DAG.getNode(ISD::SIGN_EXTEND, + TLI.getPointerTy(), getValue(I.getOperand(1))); + + SDOperand Offset = DAG.getNode(ISD::ADD, + TLI.getPointerTy(), + DAG.getNode(ISD::FRAME_TO_ARGS_OFFSET, + TLI.getPointerTy()), + CfaArg); + setValue(&I, DAG.getNode(ISD::ADD, + TLI.getPointerTy(), + DAG.getNode(ISD::FRAMEADDR, + TLI.getPointerTy(), + DAG.getConstant(0, + TLI.getPointerTy())), + Offset)); return 0; } @@ -3176,7 +3167,7 @@ Args.push_back(Entry); } - if (LandingPad && ExceptionHandling && MMI) { + if (LandingPad && MMI) { // Insert a label before the invoke call to mark the try range. This can be // used to detect deletion of the invoke via the MachineModuleInfo. BeginLabel = MMI->NextLabelID(); @@ -3195,7 +3186,7 @@ setValue(CS.getInstruction(), Result.first); DAG.setRoot(Result.second); - if (LandingPad && ExceptionHandling && MMI) { + if (LandingPad && MMI) { // Insert a label at the end of the invoke call to mark the try range. This // can be used to detect deletion of the invoke via the MachineModuleInfo. EndLabel = MMI->NextLabelID(); @@ -4614,11 +4605,10 @@ FunctionLoweringInfo FuncInfo(TLI, Fn, MF); - if (ExceptionHandling) - for (Function::iterator I = Fn.begin(), E = Fn.end(); I != E; ++I) - if (InvokeInst *Invoke = dyn_cast(I->getTerminator())) - // Mark landing pad. - FuncInfo.MBBMap[Invoke->getSuccessor(1)]->setIsLandingPad(); + for (Function::iterator I = Fn.begin(), E = Fn.end(); I != E; ++I) + if (InvokeInst *Invoke = dyn_cast(I->getTerminator())) + // Mark landing pad. + FuncInfo.MBBMap[Invoke->getSuccessor(1)]->setIsLandingPad(); for (Function::iterator I = Fn.begin(), E = Fn.end(); I != E; ++I) SelectBasicBlock(I, MF, FuncInfo); @@ -4757,7 +4747,7 @@ MachineModuleInfo *MMI = DAG.getMachineModuleInfo(); - if (ExceptionHandling && MMI && BB->isLandingPad()) { + if (MMI && BB->isLandingPad()) { // Add a label to mark the beginning of the landing pad. Deletion of the // landing pad can thus be detected via the MachineModuleInfo. unsigned LabelID = MMI->addLandingPad(BB); Modified: llvm/trunk/lib/Target/PowerPC/PPCAsmPrinter.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/PowerPC/PPCAsmPrinter.cpp?rev=49064&r1=49063&r2=49064&view=diff ============================================================================== --- llvm/trunk/lib/Target/PowerPC/PPCAsmPrinter.cpp (original) +++ llvm/trunk/lib/Target/PowerPC/PPCAsmPrinter.cpp Tue Apr 1 19:25:04 2008 @@ -1086,8 +1086,9 @@ O << "\n"; - if (ExceptionHandling && TAI->doesSupportExceptionHandling() && MMI) { + if (TAI->doesSupportExceptionHandling() && MMI) { // Add the (possibly multiple) personalities to the set of global values. + // Only referenced functions get into the Personalities list. const std::vector& Personalities = MMI->getPersonalities(); for (std::vector::const_iterator I = Personalities.begin(), Modified: llvm/trunk/lib/Target/PowerPC/PPCRegisterInfo.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/PowerPC/PPCRegisterInfo.cpp?rev=49064&r1=49063&r2=49064&view=diff ============================================================================== --- llvm/trunk/lib/Target/PowerPC/PPCRegisterInfo.cpp (original) +++ llvm/trunk/lib/Target/PowerPC/PPCRegisterInfo.cpp Tue Apr 1 19:25:04 2008 @@ -20,6 +20,7 @@ #include "PPCFrameInfo.h" #include "PPCSubtarget.h" #include "llvm/Constants.h" +#include "llvm/Function.h" #include "llvm/Type.h" #include "llvm/CodeGen/ValueTypes.h" #include "llvm/CodeGen/MachineInstrBuilder.h" @@ -946,6 +947,8 @@ MachineBasicBlock::iterator MBBI = MBB.begin(); MachineFrameInfo *MFI = MF.getFrameInfo(); MachineModuleInfo *MMI = MFI->getMachineModuleInfo(); + bool needsFrameInfo = (MMI && MMI->hasDebugInfo()) || + !MF.getFunction()->doesNotThrow(); // Prepare for frame info. unsigned FrameLabelId = 0; @@ -1019,7 +1022,7 @@ unsigned TargetAlign = MF.getTarget().getFrameInfo()->getStackAlignment(); unsigned MaxAlign = MFI->getMaxAlignment(); - if (MMI && MMI->needsFrameInfo()) { + if (needsFrameInfo) { // Mark effective beginning of when frame pointer becomes valid. FrameLabelId = MMI->NextLabelID(); BuildMI(MBB, MBBI, TII.get(PPC::LABEL)).addImm(FrameLabelId).addImm(0); @@ -1095,7 +1098,7 @@ } } - if (MMI && MMI->needsFrameInfo()) { + if (needsFrameInfo) { std::vector &Moves = MMI->getFrameMoves(); if (NegFrameSize) { Modified: llvm/trunk/lib/Target/X86/X86ATTAsmPrinter.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/X86/X86ATTAsmPrinter.cpp?rev=49064&r1=49063&r2=49064&view=diff ============================================================================== --- llvm/trunk/lib/Target/X86/X86ATTAsmPrinter.cpp (original) +++ llvm/trunk/lib/Target/X86/X86ATTAsmPrinter.cpp Tue Apr 1 19:25:04 2008 @@ -150,8 +150,9 @@ F->getLinkage() == Function::WeakLinkage)) O << "Lllvm$workaround$fake$stub$" << CurrentFnName << ":\n"; - if (TAI->doesSupportDebugInformation()) { - // Emit pre-function debug information. + if (TAI->doesSupportDebugInformation() || + TAI->doesSupportExceptionHandling()) { + // Emit pre-function debug and/or EH information. DW.BeginFunction(&MF); } Modified: llvm/trunk/lib/Target/X86/X86AsmPrinter.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/X86/X86AsmPrinter.cpp?rev=49064&r1=49063&r2=49064&view=diff ============================================================================== --- llvm/trunk/lib/Target/X86/X86AsmPrinter.cpp (original) +++ llvm/trunk/lib/Target/X86/X86AsmPrinter.cpp Tue Apr 1 19:25:04 2008 @@ -381,9 +381,9 @@ O << "\n"; - if (ExceptionHandling && TAI->doesSupportExceptionHandling() && MMI && - !Subtarget->is64Bit()) { + if (TAI->doesSupportExceptionHandling() && MMI && !Subtarget->is64Bit()) { // Add the (possibly multiple) personalities to the set of global values. + // Only referenced functions get into the Personalities list. const std::vector& Personalities = MMI->getPersonalities(); for (std::vector::const_iterator I = Personalities.begin(), Modified: llvm/trunk/lib/Target/X86/X86RegisterInfo.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/X86/X86RegisterInfo.cpp?rev=49064&r1=49063&r2=49064&view=diff ============================================================================== --- llvm/trunk/lib/Target/X86/X86RegisterInfo.cpp (original) +++ llvm/trunk/lib/Target/X86/X86RegisterInfo.cpp Tue Apr 1 19:25:04 2008 @@ -504,6 +504,7 @@ MachineModuleInfo *MMI = MFI->getMachineModuleInfo(); X86MachineFunctionInfo *X86FI = MF.getInfo(); MachineBasicBlock::iterator MBBI = MBB.begin(); + bool needsFrameInfo = (MMI && MMI->hasDebugInfo()) || !Fn->doesNotThrow(); // Prepare for frame info. unsigned FrameLabelId = 0; @@ -536,7 +537,7 @@ .addReg(FramePtr); NumBytes -= SlotSize; - if (MMI && MMI->needsFrameInfo()) { + if (needsFrameInfo) { // Mark effective beginning of when frame pointer becomes valid. FrameLabelId = MMI->NextLabelID(); BuildMI(MBB, MBBI, TII.get(X86::LABEL)).addImm(FrameLabelId).addImm(0); @@ -548,7 +549,7 @@ } unsigned ReadyLabelId = 0; - if (MMI && MMI->needsFrameInfo()) { + if (needsFrameInfo) { // Mark effective beginning of when frame pointer is ready. ReadyLabelId = MMI->NextLabelID(); BuildMI(MBB, MBBI, TII.get(X86::LABEL)).addImm(ReadyLabelId).addImm(0); @@ -607,7 +608,7 @@ } } - if (MMI && MMI->needsFrameInfo()) { + if (needsFrameInfo) { std::vector &Moves = MMI->getFrameMoves(); const TargetData *TD = MF.getTarget().getTargetData(); From sabre at nondot.org Tue Apr 1 19:38:26 2008 From: sabre at nondot.org (Chris Lattner) Date: Wed, 02 Apr 2008 00:38:26 -0000 Subject: [llvm-commits] [llvm] r49065 - /llvm/trunk/docs/LangRef.html Message-ID: <200804020038.m320cQeJ028501@zion.cs.uiuc.edu> Author: lattner Date: Tue Apr 1 19:38:26 2008 New Revision: 49065 URL: http://llvm.org/viewvc/llvm-project?rev=49065&view=rev Log: more edits from Jon Sargeant Modified: llvm/trunk/docs/LangRef.html Modified: llvm/trunk/docs/LangRef.html URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/docs/LangRef.html?rev=49065&r1=49064&r2=49065&view=diff ============================================================================== --- llvm/trunk/docs/LangRef.html (original) +++ llvm/trunk/docs/LangRef.html Tue Apr 1 19:38:26 2008 @@ -2787,7 +2787,7 @@ bytes of memory from the operating system and returns a pointer of the appropriate type to the program. If "NumElements" is specified, it is the number of elements allocated, otherwise "NumElements" is defaulted to be one. -If an alignment is specified, the value result of the allocation is guaranteed to +If a constant alignment is specified, the value result of the allocation is guaranteed to be aligned to at least that boundary. If not specified, or if zero, the target can choose to align the allocation on any convenient boundary.

    @@ -2796,7 +2796,8 @@
    Semantics:

    Memory is allocated using the system "malloc" function, and -a pointer is returned.

    +a pointer is returned. Allocating zero bytes is undefined. The result is null +if there is insufficient memory available.

    Example:
    @@ -2838,7 +2839,8 @@
    Semantics:

    Access to the memory pointed to by the pointer is no longer defined -after this instruction executes.

    +after this instruction executes. If the pointer is null, the result is +undefined.

    Example:
    @@ -2874,7 +2876,7 @@ bytes of memory on the runtime stack, returning a pointer of the appropriate type to the program. If "NumElements" is specified, it is the number of elements allocated, otherwise "NumElements" is defaulted to be one. -If an alignment is specified, the value result of the allocation is guaranteed +If a constant alignment is specified, the value result of the allocation is guaranteed to be aligned to at least that boundary. If not specified, or if zero, the target can choose to align the allocation on any convenient boundary.

    @@ -2887,7 +2889,8 @@ instruction is commonly used to represent automatic variables that must have an address available. When the function returns (either with the ret or unwind -instructions), the memory is reclaimed.

    +instructions), the memory is reclaimed. Allocating zero bytes +is legal, but the result is undefined.

    Example:
    @@ -2916,7 +2919,7 @@ volatile load and store instructions.

    -The optional "align" argument specifies the alignment of the operation +The optional constant "align" argument specifies the alignment of the operation (that is, the alignment of the memory address). A value of 0 or an omitted "align" argument means that the operation has the preferential alignment for the target. It is the responsibility of the code emitter @@ -2947,13 +2950,14 @@

    Arguments:

    There are two arguments to the 'store' instruction: a value to store and an address at which to store it. The type of the '<pointer>' -operand must be a pointer to the type of the '<value>' +operand must be a pointer to the first class type +of the '<value>' operand. If the store is marked as volatile, then the optimizer is not allowed to modify the number or order of execution of this store with other volatile load and store instructions.

    -The optional "align" argument specifies the alignment of the operation +The optional constant "align" argument specifies the alignment of the operation (that is, the alignment of the memory address). A value of 0 or an omitted "align" argument means that the operation has the preferential alignment for the target. It is the responsibility of the code emitter @@ -3043,8 +3047,8 @@ on the pointer type that is being indexed into. Pointer and array types can use a 32-bit or 64-bit integer type but the value will always be sign extended -to 64-bits. Structure types require i32 -constants.

    +to 64-bits. Structure and packed +structure types require i32 constants.

    In the example above, the first index is indexing into the '%ST*' type, which is a pointer, yielding a '%ST' = '{ i32, double, %RT @@ -3552,7 +3556,7 @@

    Overview:

    The 'icmp' instruction returns a boolean value based on comparison -of its two integer operands.

    +of its two integer or pointer operands.

    Arguments:

    The 'icmp' instruction takes three operands. The first operand is the condition code indicating the kind of comparison to perform. It is not @@ -3918,7 +3922,7 @@

    The 'getresult' instruction takes a call or invoke value as its first argument. The value must have structure type. -The second argument is an unsigned index value which must be in range for +The second argument is a constant unsigned index value which must be in range for the number of values returned by the call.

    Semantics:
    From dalej at apple.com Tue Apr 1 19:57:48 2008 From: dalej at apple.com (Dale Johannesen) Date: Wed, 02 Apr 2008 00:57:48 -0000 Subject: [llvm-commits] [test-suite] r49067 - /test-suite/trunk/Makefile.programs Message-ID: <200804020057.m320vmRq029114@zion.cs.uiuc.edu> Author: johannes Date: Tue Apr 1 19:57:47 2008 New Revision: 49067 URL: http://llvm.org/viewvc/llvm-project?rev=49067&view=rev Log: re-remove -enable-eh, hopefully permanently this time Modified: test-suite/trunk/Makefile.programs Modified: test-suite/trunk/Makefile.programs URL: http://llvm.org/viewvc/llvm-project/test-suite/trunk/Makefile.programs?rev=49067&r1=49066&r2=49067&view=diff ============================================================================== --- test-suite/trunk/Makefile.programs (original) +++ test-suite/trunk/Makefile.programs Tue Apr 1 19:57:47 2008 @@ -322,12 +322,8 @@ ifdef REQUIRES_EH_SUPPORT # PPC and X86 support DWARF exceptions, for everything else, default to SJLJ # -enable-eh is no longer required to get DWARF exceptions. -ifeq ($(ARCH),PowerPC) -LLCFLAGS += -enable-eh -else -ifeq ($(ARCH),x86) -LLCFLAGS += -enable-eh -else +ifneq ($(ARCH),PowerPC) +ifneq ($(ARCH),x86) LLCFLAGS += -enable-correct-eh-support LLVMLD_FLAGS += -disable-inlining endif From gohman at apple.com Tue Apr 1 20:29:11 2008 From: gohman at apple.com (Dan Gohman) Date: Tue, 1 Apr 2008 18:29:11 -0700 Subject: [llvm-commits] [llvm] r49065 - /llvm/trunk/docs/LangRef.html In-Reply-To: <200804020038.m320cQeJ028501@zion.cs.uiuc.edu> References: <200804020038.m320cQeJ028501@zion.cs.uiuc.edu> Message-ID: <4D24BED6-E69F-499B-BE7A-3A304746F227@apple.com> On Apr 1, 2008, at 5:38 PM, Chris Lattner wrote: > @@ -2787,7 +2787,7 @@ > bytes of memory from the operating system and returns a pointer of the > appropriate type to the program. If "NumElements" is specified, it > is the > number of elements allocated, otherwise "NumElements" is defaulted > to be one. > -If an alignment is specified, the value result of the allocation is > guaranteed to > +If a constant alignment is specified, the value result of the > allocation is guaranteed to > be aligned to at least that boundary. If not specified, or if zero, > the target can > choose to align the allocation on any convenient boundary.

    This new wording makes the text a little ambiguous. How about mentioning the requirement that the value be constant in a separate sentance? "The alignment must be a constant integer." > > > @@ -2796,7 +2796,8 @@ >
    Semantics:
    > >

    Memory is allocated using the system "malloc" function, > and > -a pointer is returned.

    > +a pointer is returned. Allocating zero bytes is undefined. The > result is null > +if there is insufficient memory available.

    Allocating zero bytes with malloc is defined in ISO C. Having LLVM differ from ISO C here breaks -raiseallocs, among other things. > > >
    Example:
    > > @@ -2838,7 +2839,8 @@ >
    Semantics:
    > >

    Access to the memory pointed to by the pointer is no longer defined > -after this instruction executes.

    > +after this instruction executes. If the pointer is null, the > result is > +undefined.

    Similar to above, calling free on a null pointer is well defined in ISO C, and it's problematic for LLVM to diverge in this area. >
    Example:
    > > @@ -2874,7 +2876,7 @@ > bytes of memory on the runtime stack, returning a pointer of the > appropriate type to the program. If "NumElements" is specified, it > is the > number of elements allocated, otherwise "NumElements" is defaulted > to be one. > -If an alignment is specified, the value result of the allocation is > guaranteed > +If a constant alignment is specified, the value result of the > allocation is guaranteed > to be aligned to at least that boundary. If not specified, or if > zero, the target > can choose to align the allocation on any convenient boundary.

    Ambiguous; see above. > > > @@ -2887,7 +2889,8 @@ > instruction is commonly used to represent automatic variables that > must > have an address available. When the function returns (either with > the href="#i_ret">ret or unwind > -instructions), the memory is reclaimed.

    > +instructions), the memory is reclaimed. Allocating zero bytes > +is legal, but the result is undefined.

    What does "legal" here mean, especially when paired with an undefined result? Also, is it really desirable to have alloca(0) be undefined? > > (that is, the alignment of the memory address). A value of 0 or an > omitted "align" argument means that the operation has the preferential > alignment for the target. It is the responsibility of the code emitter > @@ -2947,13 +2950,14 @@ >
    Arguments:
    >

    There are two arguments to the 'store' instruction: a > value > to store and an address at which to store it. The type of the > '<pointer>' > -operand must be a pointer to the type of the '<value>' > +operand must be a pointer to the first > class type > +of the '<value>' How about: "... must be a pointer to the type of the value, which must be a first class type." ? Dan From gohman at apple.com Tue Apr 1 20:38:15 2008 From: gohman at apple.com (Dan Gohman) Date: Tue, 1 Apr 2008 18:38:15 -0700 Subject: [llvm-commits] [PATCH] add GraphTraits for class User In-Reply-To: <47F2992F.5000508@gmail.com> References: <47F124A9.40508@gmail.com> <47F2992F.5000508@gmail.com> Message-ID: <00F45023-3418-4EDD-9EA3-8D44E2AAAB47@apple.com> On Apr 1, 2008, at 1:21 PM, T?r?k Edwin wrote: > > Thanks for the comments, I attached a new patch. Is the generic > description of this new file Ok? > +// This file defines specializations of GraphTraits that allows Use- > Def > +// relations to be treated as proper graphs for generic algorithms. Mention Def-Use as well, and it looks good to me. Dan From resistor at mac.com Tue Apr 1 21:12:47 2008 From: resistor at mac.com (Owen Anderson) Date: Wed, 02 Apr 2008 02:12:47 -0000 Subject: [llvm-commits] [llvm] r49069 - /llvm/trunk/lib/CodeGen/StrongPHIElimination.cpp Message-ID: <200804020212.m322Cl7e031109@zion.cs.uiuc.edu> Author: resistor Date: Tue Apr 1 21:12:45 2008 New Revision: 49069 URL: http://llvm.org/viewvc/llvm-project?rev=49069&view=rev Log: Correctly mark a valno that was previous defined by a PHI node as having an unknown defining inst after PHI elimination. Modified: llvm/trunk/lib/CodeGen/StrongPHIElimination.cpp Modified: llvm/trunk/lib/CodeGen/StrongPHIElimination.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/StrongPHIElimination.cpp?rev=49069&r1=49068&r2=49069&view=diff ============================================================================== --- llvm/trunk/lib/CodeGen/StrongPHIElimination.cpp (original) +++ llvm/trunk/lib/CodeGen/StrongPHIElimination.cpp Tue Apr 1 21:12:45 2008 @@ -845,7 +845,6 @@ } bool StrongPHIElimination::runOnMachineFunction(MachineFunction &Fn) { - LiveIntervals& LI = getAnalysis(); // Compute DFS numbers of each block @@ -889,17 +888,21 @@ // If this is a dead PHI node, then remove it from LiveIntervals. unsigned DestReg = PInstr->getOperand(0).getReg(); + LiveInterval& PI = LI.getInterval(DestReg); if (PInstr->registerDefIsDead(DestReg)) { - LiveInterval& PI = LI.getInterval(DestReg); - if (PI.containsOneValue()) { LI.removeInterval(DestReg); } else { unsigned idx = LI.getDefIndex(LI.getInstructionIndex(PInstr)); PI.removeRange(*PI.getLiveRangeContaining(idx), true); } + } else { + // If the PHI is not dead, then the valno defined by the PHI + // now has an unknown def. + unsigned idx = LI.getDefIndex(LI.getInstructionIndex(PInstr)); + PI.getLiveRangeContaining(idx)->valno->def = ~0U; } - + LI.RemoveMachineInstrFromMaps(PInstr); PInstr->eraseFromParent(); } From resistor at mac.com Tue Apr 1 22:00:14 2008 From: resistor at mac.com (Owen Anderson) Date: Wed, 02 Apr 2008 03:00:14 -0000 Subject: [llvm-commits] [llvm] r49070 - /llvm/trunk/lib/CodeGen/StrongPHIElimination.cpp Message-ID: <200804020300.m3230E4T032561@zion.cs.uiuc.edu> Author: resistor Date: Tue Apr 1 22:00:13 2008 New Revision: 49070 URL: http://llvm.org/viewvc/llvm-project?rev=49070&view=rev Log: In some situations, we need to check for local interferences between the PHI node and its inputs. Modified: llvm/trunk/lib/CodeGen/StrongPHIElimination.cpp Modified: llvm/trunk/lib/CodeGen/StrongPHIElimination.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/StrongPHIElimination.cpp?rev=49070&r1=49069&r2=49070&view=diff ============================================================================== --- llvm/trunk/lib/CodeGen/StrongPHIElimination.cpp (original) +++ llvm/trunk/lib/CodeGen/StrongPHIElimination.cpp Tue Apr 1 22:00:13 2008 @@ -483,8 +483,17 @@ std::vector > localInterferences; processPHIUnion(P, PHIUnion, DF, localInterferences); + // If one of the inputs is defined in the same block as the current PHI + // then we need to check for a local interference between that input and + // the PHI. + for (std::map::iterator I = PHIUnion.begin(), + E = PHIUnion.end(); I != E; ++I) + if (MRI.getVRegDef(I->first)->getParent() == P->getParent()) + localInterferences.push_back(std::make_pair(I->first, + P->getOperand(0).getReg())); + // The dominator forest walk may have returned some register pairs whose - // interference cannot be determines from dominator analysis. We now + // interference cannot be determined from dominator analysis. We now // examine these pairs for local interferences. for (std::vector >::iterator I = localInterferences.begin(), E = localInterferences.end(); I != E; ++I) { @@ -527,7 +536,7 @@ } } - // Add the renaming set for this PHI node to our overal renaming information + // Add the renaming set for this PHI node to our overall renaming information RenameSets.insert(std::make_pair(P->getOperand(0).getReg(), PHIUnion)); // Remember which registers are already renamed, so that we don't try to From asl at math.spbu.ru Wed Apr 2 00:23:58 2008 From: asl at math.spbu.ru (Anton Korobeynikov) Date: Wed, 02 Apr 2008 05:23:58 -0000 Subject: [llvm-commits] [llvm] r49079 - in /llvm/trunk: include/llvm/CodeGen/CallingConvLower.h lib/Target/TargetCallingConv.td lib/Target/X86/X86CallingConv.td utils/TableGen/CallingConvEmitter.cpp Message-ID: <200804020523.m325NwBq005114@zion.cs.uiuc.edu> Author: asl Date: Wed Apr 2 00:23:57 2008 New Revision: 49079 URL: http://llvm.org/viewvc/llvm-project?rev=49079&view=rev Log: Add new CC lowering rule: provide a list of registers, which can be 'shadowed', when some another register is used for argument passing. Currently is used on Win64. Modified: llvm/trunk/include/llvm/CodeGen/CallingConvLower.h llvm/trunk/lib/Target/TargetCallingConv.td llvm/trunk/lib/Target/X86/X86CallingConv.td llvm/trunk/utils/TableGen/CallingConvEmitter.cpp Modified: llvm/trunk/include/llvm/CodeGen/CallingConvLower.h URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/CodeGen/CallingConvLower.h?rev=49079&r1=49078&r2=49079&view=diff ============================================================================== --- llvm/trunk/include/llvm/CodeGen/CallingConvLower.h (original) +++ llvm/trunk/include/llvm/CodeGen/CallingConvLower.h Wed Apr 2 00:23:57 2008 @@ -167,7 +167,15 @@ MarkAllocated(Reg); return Reg; } - + + /// Version of AllocateReg with extra register to be shadowed. + unsigned AllocateReg(unsigned Reg, unsigned ShadowReg) { + if (isAllocated(Reg)) return 0; + MarkAllocated(Reg); + MarkAllocated(ShadowReg); + return Reg; + } + /// AllocateReg - Attempt to allocate one of the specified registers. If none /// are available, return zero. Otherwise, return the first one available, /// marking it and any aliases as allocated. @@ -175,13 +183,27 @@ unsigned FirstUnalloc = getFirstUnallocated(Regs, NumRegs); if (FirstUnalloc == NumRegs) return 0; // Didn't find the reg. - + // Mark the register and any aliases as allocated. unsigned Reg = Regs[FirstUnalloc]; MarkAllocated(Reg); return Reg; } - + + /// Version of AllocateReg with list of registers to be shadowed. + unsigned AllocateReg(const unsigned *Regs, const unsigned *ShadowRegs, + unsigned NumRegs) { + unsigned FirstUnalloc = getFirstUnallocated(Regs, NumRegs); + if (FirstUnalloc == NumRegs) + return 0; // Didn't find the reg. + + // Mark the register and any aliases as allocated. + unsigned Reg = Regs[FirstUnalloc], ShadowReg = ShadowRegs[FirstUnalloc]; + MarkAllocated(Reg); + MarkAllocated(ShadowReg); + return Reg; + } + /// AllocateStack - Allocate a chunk of stack space with the specified size /// and alignment. unsigned AllocateStack(unsigned Size, unsigned Align) { Modified: llvm/trunk/lib/Target/TargetCallingConv.td URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/TargetCallingConv.td?rev=49079&r1=49078&r2=49079&view=diff ============================================================================== --- llvm/trunk/lib/Target/TargetCallingConv.td (original) +++ llvm/trunk/lib/Target/TargetCallingConv.td Wed Apr 2 00:23:57 2008 @@ -59,6 +59,14 @@ list RegList = regList; } +/// CCAssignToRegWithShadow - Same as CCAssignToReg, but with list of registers +/// which became shadowed, when some register is used. +class CCAssignToRegWithShadow regList, + list shadowList> : CCAction { + list RegList = regList; + list ShadowRegList = shadowList; +} + /// CCAssignToStack - This action always matches: it assigns the value to a /// stack slot of the specified size and alignment on the stack. If size is /// zero then the ABI size is used; if align is zero then the ABI alignment Modified: llvm/trunk/lib/Target/X86/X86CallingConv.td URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/X86/X86CallingConv.td?rev=49079&r1=49078&r2=49079&view=diff ============================================================================== --- llvm/trunk/lib/Target/X86/X86CallingConv.td (original) +++ llvm/trunk/lib/Target/X86/X86CallingConv.td Wed Apr 2 00:23:57 2008 @@ -158,22 +158,29 @@ def CC_X86_Win64_C : CallingConv<[ // FIXME: Handle byval stuff. // FIXME: Handle fp80. - // FIXME: Handle shadowed arguments. - // FIXME: Handle nested functions. + // FIXME: Handle varargs. // Promote i8/i16 arguments to i32. CCIfType<[i8, i16], CCPromoteToType>, + // The 'nest' parameter, if any, is passed in R10. + CCIfNest>, + // The first 4 integer arguments are passed in integer registers. - CCIfType<[i32], CCAssignToReg<[ECX, EDX, R8D, R9D]>>, - CCIfType<[i64], CCAssignToReg<[RCX, RDX, R8 , R9 ]>>, + CCIfType<[i32], CCAssignToRegWithShadow<[ECX , EDX , R8D , R9D ], + [XMM0, XMM1, XMM2, XMM3]>>, + CCIfType<[i64], CCAssignToRegWithShadow<[RCX , RDX , R8 , R9 ], + [XMM0, XMM1, XMM2, XMM3]>>, // The first 4 FP/Vector arguments are passed in XMM registers. CCIfType<[f32, f64, v16i8, v8i16, v4i32, v2i64, v4f32, v2f64], - CCAssignToReg<[XMM0, XMM1, XMM2, XMM3]>>, + CCAssignToRegWithShadow<[XMM0, XMM1, XMM2, XMM3], + [RCX , RDX , R8 , R9 ]>>, // The first 4 MMX vector arguments are passed in GPRs. - CCIfType<[v8i8, v4i16, v2i32, v1i64], CCAssignToReg<[RCX, RDX, R8, R9]>>, + CCIfType<[v8i8, v4i16, v2i32, v1i64], + CCAssignToRegWithShadow<[RCX , RDX , R8 , R9 ], + [XMM0, XMM1, XMM2, XMM3]>>, // Integer/FP values get stored in stack slots that are 8 bytes in size and // 16-byte aligned if there are no more registers to hold them. Modified: llvm/trunk/utils/TableGen/CallingConvEmitter.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/utils/TableGen/CallingConvEmitter.cpp?rev=49079&r1=49078&r2=49079&view=diff ============================================================================== --- llvm/trunk/utils/TableGen/CallingConvEmitter.cpp (original) +++ llvm/trunk/utils/TableGen/CallingConvEmitter.cpp Wed Apr 2 00:23:57 2008 @@ -111,6 +111,48 @@ << "Reg, LocVT, LocInfo));\n"; O << IndentStr << " return false;\n"; O << IndentStr << "}\n"; + } else if (Action->isSubClassOf("CCAssignToRegWithShadow")) { + ListInit *RegList = Action->getValueAsListInit("RegList"); + ListInit *ShadowRegList = Action->getValueAsListInit("ShadowRegList"); + if (ShadowRegList->getSize() >0 && + ShadowRegList->getSize() != RegList->getSize()) + throw "Invalid length of list of shadowed registers"; + + if (RegList->getSize() == 1) { + O << IndentStr << "if (unsigned Reg = State.AllocateReg("; + O << getQualifiedName(RegList->getElementAsRecord(0)); + O << ", " << getQualifiedName(ShadowRegList->getElementAsRecord(0)); + O << ")) {\n"; + } else { + unsigned RegListNumber = ++Counter; + unsigned ShadowRegListNumber = ++Counter; + + O << IndentStr << "static const unsigned RegList" << RegListNumber + << "[] = {\n"; + O << IndentStr << " "; + for (unsigned i = 0, e = RegList->getSize(); i != e; ++i) { + if (i != 0) O << ", "; + O << getQualifiedName(RegList->getElementAsRecord(i)); + } + O << "\n" << IndentStr << "};\n"; + + O << IndentStr << "static const unsigned RegList" + << ShadowRegListNumber << "[] = {\n"; + O << IndentStr << " "; + for (unsigned i = 0, e = ShadowRegList->getSize(); i != e; ++i) { + if (i != 0) O << ", "; + O << getQualifiedName(ShadowRegList->getElementAsRecord(i)); + } + O << "\n" << IndentStr << "};\n"; + + O << IndentStr << "if (unsigned Reg = State.AllocateReg(RegList" + << RegListNumber << ", " << "RegList" << ShadowRegListNumber + << ", " << RegList->getSize() << ")) {\n"; + } + O << IndentStr << " State.addLoc(CCValAssign::getReg(ValNo, ValVT, " + << "Reg, LocVT, LocInfo));\n"; + O << IndentStr << " return false;\n"; + O << IndentStr << "}\n"; } else if (Action->isSubClassOf("CCAssignToStack")) { int Size = Action->getValueAsInt("Size"); int Align = Action->getValueAsInt("Align"); From romix.llvm at googlemail.com Wed Apr 2 02:55:18 2008 From: romix.llvm at googlemail.com (Roman Levenstein) Date: Wed, 2 Apr 2008 08:55:18 +0100 Subject: [llvm-commits] Speeding up instruction selection In-Reply-To: <039F7990-10A9-4153-A91B-024551DF3541@apple.com> References: <97188DDC-093E-4733-B8A2-7B30B6684DE1@apple.com> <00FB5805-1FA5-4534-BBD0-E6E34EC17BF1@apple.com> <84648A85-6EB1-4FE5-96B4-749BD5A8D938@apple.com> <039F7990-10A9-4153-A91B-024551DF3541@apple.com> Message-ID: Hi Evan, 2008/4/1, Evan Cheng : > Please hold off checking it in for a bit. llvm tot is having some > problems and I'd like to get to the bottom of it first. OK. > Also, the tie breaker is less than ideal. I think we need a tie- > breaker that is "the SUnit that's added to the queue is preferred". > That means it prefers nodes which are closer to the end of block. What > do you think? Do you actually mean "the SUnit that's added to the queue LAST (or FIRST) is preferred"? I'll think about it. -Roman > On Apr 1, 2008, at 6:23 AM, Roman Levenstein wrote: > > > Hi Dan, > > > > 2008/4/1, Dan Gohman : > >> > >> On Mar 26, 2008, at 12:19 PM, Roman Levenstein wrote: > >>> > >> > >>> Evan played with it, but there was a problem with 176.gcc (which is > >>> probably unrelated) and somehow the review is stuck at the moment. > >> > >> > >> Hi Roman, > >> > >> I believe we've finally resolved the 176.gcc problem! One of Evan's > >> coalescer fixes, 48752, allows 176.gcc to pass, even with your queue > >> ordering patch applied. > >> > >> Thanks for your patience while we investigated this. > > > > These are good news. How do we proceed with that patch? > > > > -Roman > > > _______________________________________________ > > llvm-commits mailing list > > llvm-commits at cs.uiuc.edu > > http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits > > _______________________________________________ > llvm-commits mailing list > llvm-commits at cs.uiuc.edu > http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits > From evan.cheng at apple.com Wed Apr 2 03:16:13 2008 From: evan.cheng at apple.com (Evan Cheng) Date: Wed, 2 Apr 2008 01:16:13 -0700 Subject: [llvm-commits] Speeding up instruction selection In-Reply-To: References: <97188DDC-093E-4733-B8A2-7B30B6684DE1@apple.com> <00FB5805-1FA5-4534-BBD0-E6E34EC17BF1@apple.com> <84648A85-6EB1-4FE5-96B4-749BD5A8D938@apple.com> <039F7990-10A9-4153-A91B-024551DF3541@apple.com> Message-ID: On Apr 2, 2008, at 12:55 AM, Roman Levenstein wrote: > Hi Evan, > > 2008/4/1, Evan Cheng : >> Please hold off checking it in for a bit. llvm tot is having some >> problems and I'd like to get to the bottom of it first. > > OK. > >> Also, the tie breaker is less than ideal. I think we need a tie- >> breaker that is "the SUnit that's added to the queue is preferred". >> That means it prefers nodes which are closer to the end of block. >> What >> do you think? > > Do you actually mean "the SUnit that's added to the queue LAST (or > FIRST) is preferred"? I'll think about it. Yep "first". Basically, if all else being equal, let the node that's ready first be scheduled first. We can add a order id to SUnit which gets set when it's pushed into the ready queue. What do you think? Evan > > > -Roman > > >> On Apr 1, 2008, at 6:23 AM, Roman Levenstein wrote: >> >>> Hi Dan, >>> >>> 2008/4/1, Dan Gohman : >>>> >>>> On Mar 26, 2008, at 12:19 PM, Roman Levenstein wrote: >>>>> >>>> >>>>> Evan played with it, but there was a problem with 176.gcc (which >>>>> is >>>>> probably unrelated) and somehow the review is stuck at the moment. >>>> >>>> >>>> Hi Roman, >>>> >>>> I believe we've finally resolved the 176.gcc problem! One of Evan's >>>> coalescer fixes, 48752, allows 176.gcc to pass, even with your >>>> queue >>>> ordering patch applied. >>>> >>>> Thanks for your patience while we investigated this. >>> >>> These are good news. How do we proceed with that patch? >>> >>> -Roman >> >>> _______________________________________________ >>> llvm-commits mailing list >>> llvm-commits at cs.uiuc.edu >>> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits >> >> _______________________________________________ >> llvm-commits mailing list >> llvm-commits at cs.uiuc.edu >> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits >> > _______________________________________________ > llvm-commits mailing list > llvm-commits at cs.uiuc.edu > http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits From romix.llvm at googlemail.com Wed Apr 2 03:57:00 2008 From: romix.llvm at googlemail.com (Roman Levenstein) Date: Wed, 2 Apr 2008 09:57:00 +0100 Subject: [llvm-commits] Speeding up instruction selection In-Reply-To: References: <00FB5805-1FA5-4534-BBD0-E6E34EC17BF1@apple.com> <84648A85-6EB1-4FE5-96B4-749BD5A8D938@apple.com> <039F7990-10A9-4153-A91B-024551DF3541@apple.com> Message-ID: 2008/4/2, Evan Cheng : > > On Apr 2, 2008, at 12:55 AM, Roman Levenstein wrote: > > > Hi Evan, > > > > 2008/4/1, Evan Cheng : > >> Please hold off checking it in for a bit. llvm tot is having some > >> problems and I'd like to get to the bottom of it first. > > > > OK. > > > >> Also, the tie breaker is less than ideal. I think we need a tie- > >> breaker that is "the SUnit that's added to the queue is preferred". > >> That means it prefers nodes which are closer to the end of block. > >> What > >> do you think? > > > > Do you actually mean "the SUnit that's added to the queue LAST (or > > FIRST) is preferred"? I'll think about it. > > > Yep "first". Basically, if all else being equal, let the node that's > ready first be scheduled first. We can add a order id to SUnit which > gets set when it's pushed into the ready queue. What do you think? Makes sense. The queue should have a global "current id" counter. Its current value is assigned to each node being inserted into the ready queue and then incremented. When the node is removed from the queue for any reason, its queue order id is reset. It should be rather easy to implement. BTW, do you really want this queue order id in the SUnit or in a separate array indexed by SUnit unique ids? -Roman From baldrick at free.fr Wed Apr 2 06:44:23 2008 From: baldrick at free.fr (Duncan Sands) Date: Wed, 2 Apr 2008 13:44:23 +0200 Subject: [llvm-commits] =?iso-8859-1?q?=5Bllvm=5D_r49006_-_in=09/llvm/trun?= =?iso-8859-1?q?k/lib=3A_CodeGen/DwarfWriter=2Ecpp=09CodeGen/LLVMTargetMac?= =?iso-8859-1?q?hine=2Ecpp_CodeGen/SelectionDAG/SelectionDAGISel=2Ecpp=09T?= =?iso-8859-1?q?arget/PowerPC/PPCAsmPrinter=2Ecpp_Target/PowerPC/PPCRegist?= =?iso-8859-1?q?erInfo=2Ecpp=09Target/X86/X86AsmPrinter=2Ecpp_Target/X86/X?= =?iso-8859-1?q?86RegisterInfo=2Ecpp=09Transforms/Utils/LowerInvoke=2Ecpp?= In-Reply-To: References: <200803312340.m2VNeOu9005523@zion.cs.uiuc.edu> <200804012010.44169.baldrick@free.fr> Message-ID: <200804021344.23537.baldrick@free.fr> > > That's because the C++ end-of-catch routine is > > not marked "nothrow". > > Really? Is that intentional? At first glance, there's nothing stopping __cxa_end_catch being marked nothrow. I will take a closer look later. Ciao, Duncan. From baldrick at free.fr Wed Apr 2 07:17:44 2008 From: baldrick at free.fr (Duncan Sands) Date: Wed, 2 Apr 2008 14:17:44 +0200 Subject: [llvm-commits] [llvm] r49064 - in /llvm/trunk: include/llvm/CodeGen/MachineModuleInfo.h lib/CodeGen/DwarfWriter.cpp lib/CodeGen/LLVMTargetMachine.cpp lib/CodeGen/MachineModuleInfo.cpp lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp lib/Target/PowerPC/PPCAsmPrinter.cpp lib/Target/PowerPC/PPCRegisterInfo.cpp lib/Target/X86/X86ATTAsmPrinter.cpp lib/Target/X86/X86AsmPrinter.cpp lib/Target/X86/X86RegisterInfo.cpp In-Reply-To: <200804020025.m320P5FC028148@zion.cs.uiuc.edu> References: <200804020025.m320P5FC028148@zion.cs.uiuc.edu> Message-ID: <200804021417.45539.baldrick@free.fr> Hi Dale, > Recommitting EH patch; this should answer most of the > review feedback. yes, this is much better - thanks a lot! > -enable-eh is still accepted but doesn't do anything. What is the status of -enable-correct-eh? > The separation of the EH table and frame move data is, > I think, logically figured out, but either one still > causes full EH info to be generated (not sure how to > split the metadata correctly). Me neither, but it would be a nice win if we could. Want to open a PR for this? > void BeginFunction(MachineFunction *MF) { > this->MF = MF; > - > - if (MMI && > - ExceptionHandling && > - TAI->doesSupportExceptionHandling()) { > - shouldEmit = true; > - // Assumes in correct section after the entry point. > - EmitLabel("eh_func_begin", ++SubprogramCount); > + shouldEmitTable = shouldEmitMoves = false; > + if (TAI->doesSupportExceptionHandling()) { > + > + // Map all labels and get rid of any dead landing pads. > + MMI->TidyLandingPads(); There used to be a check that MMI is not NULL, but not anymore. > + bool needsFrameInfo = (MMI && MMI->hasDebugInfo()) || How about calling this needsFrameMoves? I don't feel strongly about this. Thanks again! Duncan. From dag at cray.com Wed Apr 2 09:52:07 2008 From: dag at cray.com (David Greene) Date: Wed, 2 Apr 2008 08:52:07 -0600 Subject: [llvm-commits] [llvm] r49056 - /llvm/trunk/lib/Transforms/Scalar/LoopIndexSplit.cpp In-Reply-To: <14B3E407-1549-45E2-870E-E7C7AA967E01@mac.com> References: <200804012214.m31MENkW023546@zion.cs.uiuc.edu> <14B3E407-1549-45E2-870E-E7C7AA967E01@mac.com> Message-ID: <200804020952.07520.dag@cray.com> On Tuesday 01 April 2008 17:55, Owen Anderson wrote: > David, > > This is breaking the build. Please fix. What's happening with the build? I didn't see any problems before I committed it. -Dave From edwintorok at gmail.com Wed Apr 2 09:58:57 2008 From: edwintorok at gmail.com (=?ISO-8859-1?Q?T=F6r=F6k_Edwin?=) Date: Wed, 02 Apr 2008 17:58:57 +0300 Subject: [llvm-commits] [PATCH] add GraphTraits for class User In-Reply-To: <00F45023-3418-4EDD-9EA3-8D44E2AAAB47@apple.com> References: <47F124A9.40508@gmail.com> <47F2992F.5000508@gmail.com> <00F45023-3418-4EDD-9EA3-8D44E2AAAB47@apple.com> Message-ID: <47F39F31.4070701@gmail.com> Dan Gohman wrote: > On Apr 1, 2008, at 1:21 PM, T?r?k Edwin wrote: > >> Thanks for the comments, I attached a new patch. Is the generic >> description of this new file Ok? >> > > >> +// This file defines specializations of GraphTraits that allows Use- >> Def >> +// relations to be treated as proper graphs for generic algorithms. >> > > Mention Def-Use as well, and it looks good to me. Thanks, I made the change and committed revision 49088. This was the first patch I committed to the llvm repository! Best regards, --Edwin From criswell at cs.uiuc.edu Wed Apr 2 10:54:38 2008 From: criswell at cs.uiuc.edu (John Criswell) Date: Wed, 2 Apr 2008 10:54:38 -0500 Subject: [llvm-commits] CVS: llvm-www/Users.html Message-ID: <200804021554.m32FscAQ031120@maute.cs.uiuc.edu> Changes in directory llvm-www: Users.html updated: 1.29 -> 1.30 --- Log message: Added Anna University, Carnegie Mellon University, and University of Utah as educational users. --- Diffs of the changes: (+19 -1) Users.html | 20 +++++++++++++++++++- 1 files changed, 19 insertions(+), 1 deletion(-) Index: llvm-www/Users.html diff -u llvm-www/Users.html:1.29 llvm-www/Users.html:1.30 --- llvm-www/Users.html:1.29 Mon Mar 24 16:28:53 2008 +++ llvm-www/Users.html Wed Apr 2 10:53:50 2008 @@ -238,6 +238,18 @@ + Anna University, Chennai, India + + + + + + Carnegie Mellon University + + + + + University of Illinois at Urbana-Champaign @@ -254,6 +266,12 @@ + + + University of Utah + + + @@ -300,6 +318,6 @@ src="http://www.w3.org/Icons/valid-html401" alt="Valid HTML 4.01!">
    LLVM Development List
    - Last modified: $Date: 2008/03/24 21:28:53 $ + Last modified: $Date: 2008/04/02 15:53:50 $ From criswell at cs.uiuc.edu Wed Apr 2 10:57:36 2008 From: criswell at cs.uiuc.edu (John Criswell) Date: Wed, 2 Apr 2008 10:57:36 -0500 Subject: [llvm-commits] CVS: llvm-www/Users.html Message-ID: <200804021557.m32FvagD031343@maute.cs.uiuc.edu> Changes in directory llvm-www: Users.html updated: 1.30 -> 1.31 --- Log message: Removed extra . --- Diffs of the changes: (+1 -2) Users.html | 3 +-- 1 files changed, 1 insertion(+), 2 deletions(-) Index: llvm-www/Users.html diff -u llvm-www/Users.html:1.30 llvm-www/Users.html:1.31 --- llvm-www/Users.html:1.30 Wed Apr 2 10:53:50 2008 +++ llvm-www/Users.html Wed Apr 2 10:56:42 2008 @@ -272,7 +272,6 @@ -
    @@ -318,6 +317,6 @@ src="http://www.w3.org/Icons/valid-html401" alt="Valid HTML 4.01!">
    LLVM Development List
    - Last modified: $Date: 2008/04/02 15:53:50 $ + Last modified: $Date: 2008/04/02 15:56:42 $ From gohman at apple.com Wed Apr 2 11:54:47 2008 From: gohman at apple.com (Dan Gohman) Date: Wed, 2 Apr 2008 09:54:47 -0700 Subject: [llvm-commits] [llvm] r49056 - /llvm/trunk/lib/Transforms/Scalar/LoopIndexSplit.cpp In-Reply-To: <200804020952.07520.dag@cray.com> References: <200804012214.m31MENkW023546@zion.cs.uiuc.edu> <14B3E407-1549-45E2-870E-E7C7AA967E01@mac.com> <200804020952.07520.dag@cray.com> Message-ID: <1EC2BF49-B2BA-4F2E-8F14-0DCF62611586@apple.com> On Apr 2, 2008, at 7:52 AM, David Greene wrote: > On Tuesday 01 April 2008 17:55, Owen Anderson wrote: >> David, >> >> This is breaking the build. Please fix. > > What's happening with the build? I didn't see any problems before > I committed it. lib/Transforms/Scalar/LoopIndexSplit.cpp: In member function ?virtual bool::LoopIndexSplit::runOnLoop(llvm::Loop*, llvm::LPPassManager&)?: lib/Transforms/Scalar/LoopIndexSplit.cpp:247: error: void value not ignored as it ought to be lib/Transforms/Scalar/LoopIndexSplit.cpp:258: error: void value not ignored as it ought to be Do you have a patch to make SmallVector's erase return an iterator like std::vector's? Dan From dalej at apple.com Wed Apr 2 12:04:48 2008 From: dalej at apple.com (Dale Johannesen) Date: Wed, 02 Apr 2008 17:04:48 -0000 Subject: [llvm-commits] [llvm] r49096 - in /llvm/trunk/lib: CodeGen/DwarfWriter.cpp Target/PowerPC/PPCRegisterInfo.cpp Target/X86/X86RegisterInfo.cpp Message-ID: <200804021704.m32H4m1c006009@zion.cs.uiuc.edu> Author: johannes Date: Wed Apr 2 12:04:45 2008 New Revision: 49096 URL: http://llvm.org/viewvc/llvm-project?rev=49096&view=rev Log: Cosmetic changes per EH patch review feedback. Modified: llvm/trunk/lib/CodeGen/DwarfWriter.cpp llvm/trunk/lib/Target/PowerPC/PPCRegisterInfo.cpp llvm/trunk/lib/Target/X86/X86RegisterInfo.cpp Modified: llvm/trunk/lib/CodeGen/DwarfWriter.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/DwarfWriter.cpp?rev=49096&r1=49095&r2=49096&view=diff ============================================================================== --- llvm/trunk/lib/CodeGen/DwarfWriter.cpp (original) +++ llvm/trunk/lib/CodeGen/DwarfWriter.cpp Wed Apr 2 12:04:45 2008 @@ -3415,7 +3415,7 @@ void BeginFunction(MachineFunction *MF) { this->MF = MF; shouldEmitTable = shouldEmitMoves = false; - if (TAI->doesSupportExceptionHandling()) { + if (MMI && TAI->doesSupportExceptionHandling()) { // Map all labels and get rid of any dead landing pads. MMI->TidyLandingPads(); Modified: llvm/trunk/lib/Target/PowerPC/PPCRegisterInfo.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/PowerPC/PPCRegisterInfo.cpp?rev=49096&r1=49095&r2=49096&view=diff ============================================================================== --- llvm/trunk/lib/Target/PowerPC/PPCRegisterInfo.cpp (original) +++ llvm/trunk/lib/Target/PowerPC/PPCRegisterInfo.cpp Wed Apr 2 12:04:45 2008 @@ -947,7 +947,7 @@ MachineBasicBlock::iterator MBBI = MBB.begin(); MachineFrameInfo *MFI = MF.getFrameInfo(); MachineModuleInfo *MMI = MFI->getMachineModuleInfo(); - bool needsFrameInfo = (MMI && MMI->hasDebugInfo()) || + bool needsFrameMoves = (MMI && MMI->hasDebugInfo()) || !MF.getFunction()->doesNotThrow(); // Prepare for frame info. @@ -1022,7 +1022,7 @@ unsigned TargetAlign = MF.getTarget().getFrameInfo()->getStackAlignment(); unsigned MaxAlign = MFI->getMaxAlignment(); - if (needsFrameInfo) { + if (needsFrameMoves) { // Mark effective beginning of when frame pointer becomes valid. FrameLabelId = MMI->NextLabelID(); BuildMI(MBB, MBBI, TII.get(PPC::LABEL)).addImm(FrameLabelId).addImm(0); @@ -1098,7 +1098,7 @@ } } - if (needsFrameInfo) { + if (needsFrameMoves) { std::vector &Moves = MMI->getFrameMoves(); if (NegFrameSize) { Modified: llvm/trunk/lib/Target/X86/X86RegisterInfo.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/X86/X86RegisterInfo.cpp?rev=49096&r1=49095&r2=49096&view=diff ============================================================================== --- llvm/trunk/lib/Target/X86/X86RegisterInfo.cpp (original) +++ llvm/trunk/lib/Target/X86/X86RegisterInfo.cpp Wed Apr 2 12:04:45 2008 @@ -504,7 +504,7 @@ MachineModuleInfo *MMI = MFI->getMachineModuleInfo(); X86MachineFunctionInfo *X86FI = MF.getInfo(); MachineBasicBlock::iterator MBBI = MBB.begin(); - bool needsFrameInfo = (MMI && MMI->hasDebugInfo()) || !Fn->doesNotThrow(); + bool needsFrameMoves = (MMI && MMI->hasDebugInfo()) || !Fn->doesNotThrow(); // Prepare for frame info. unsigned FrameLabelId = 0; @@ -537,7 +537,7 @@ .addReg(FramePtr); NumBytes -= SlotSize; - if (needsFrameInfo) { + if (needsFrameMoves) { // Mark effective beginning of when frame pointer becomes valid. FrameLabelId = MMI->NextLabelID(); BuildMI(MBB, MBBI, TII.get(X86::LABEL)).addImm(FrameLabelId).addImm(0); @@ -549,7 +549,7 @@ } unsigned ReadyLabelId = 0; - if (needsFrameInfo) { + if (needsFrameMoves) { // Mark effective beginning of when frame pointer is ready. ReadyLabelId = MMI->NextLabelID(); BuildMI(MBB, MBBI, TII.get(X86::LABEL)).addImm(ReadyLabelId).addImm(0); @@ -608,7 +608,7 @@ } } - if (needsFrameInfo) { + if (needsFrameMoves) { std::vector &Moves = MMI->getFrameMoves(); const TargetData *TD = MF.getTarget().getTargetData(); From dalej at apple.com Wed Apr 2 12:10:08 2008 From: dalej at apple.com (Dale Johannesen) Date: Wed, 2 Apr 2008 10:10:08 -0700 Subject: [llvm-commits] [llvm] r49064 - in /llvm/trunk: include/llvm/CodeGen/MachineModuleInfo.h lib/CodeGen/DwarfWriter.cpp lib/CodeGen/LLVMTargetMachine.cpp lib/CodeGen/MachineModuleInfo.cpp lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp lib/Target/PowerPC/PPCAsmPrinter.cpp lib/Target/PowerPC/PPCRegisterInfo.cpp lib/Target/X86/X86ATTAsmPrinter.cpp lib/Target/X86/X86AsmPrinter.cpp lib/Target/X86/X86RegisterInfo.cpp In-Reply-To: <200804021417.45539.baldrick@free.fr> References: <200804020025.m320P5FC028148@zion.cs.uiuc.edu> <200804021417.45539.baldrick@free.fr> Message-ID: On Apr 2, 2008, at 5:17 AM, Duncan Sands wrote: > Hi Dale, > >> Recommitting EH patch; this should answer most of the >> review feedback. > > yes, this is much better - thanks a lot! > >> -enable-eh is still accepted but doesn't do anything. > > What is the status of -enable-correct-eh? It will not cause non-Dwarf to be emitted for targets that support Dwarf. I guess that's a change; can put it back the way it was if you think it's important. It don't think it ever worked on Darwin anyway, so this isn't something I'm interested in. >> The separation of the EH table and frame move data is, >> I think, logically figured out, but either one still >> causes full EH info to be generated (not sure how to >> split the metadata correctly). > > Me neither, but it would be a nice win if we could. Want > to open a PR for this? I'm not sure it's even possible on Darwin; our linker has a fair amount of knowledge about EH tables built into it, and may not take kindly to having them change. There is also the matter of binary compatibility with gcc-compiled code. >> void BeginFunction(MachineFunction *MF) { >> this->MF = MF; >> - >> - if (MMI && >> - ExceptionHandling && >> - TAI->doesSupportExceptionHandling()) { >> - shouldEmit = true; >> - // Assumes in correct section after the entry point. >> - EmitLabel("eh_func_begin", ++SubprogramCount); >> + shouldEmitTable = shouldEmitMoves = false; >> + if (TAI->doesSupportExceptionHandling()) { >> + >> + // Map all labels and get rid of any dead landing pads. >> + MMI->TidyLandingPads(); > > There used to be a check that MMI is not NULL, but not anymore. Replaced (though I don't think MMI can be null there). >> + bool needsFrameInfo = (MMI && MMI->hasDebugInfo()) || > > How about calling this needsFrameMoves? I don't feel strongly > about this. Why not. Done. From clattner at apple.com Wed Apr 2 12:13:58 2008 From: clattner at apple.com (Chris Lattner) Date: Wed, 2 Apr 2008 10:13:58 -0700 Subject: [llvm-commits] [llvm] r49064 - in /llvm/trunk: include/llvm/CodeGen/MachineModuleInfo.h lib/CodeGen/DwarfWriter.cpp lib/CodeGen/LLVMTargetMachine.cpp lib/CodeGen/MachineModuleInfo.cpp lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp lib/Target/PowerPC/PPCAsmPrinter.cpp lib/Target/PowerPC/PPCRegisterInfo.cpp lib/Target/X86/X86ATTAsmPrinter.cpp lib/Target/X86/X86AsmPrinter.cpp lib/Target/X86/X86RegisterInfo.cpp In-Reply-To: References: <200804020025.m320P5FC028148@zion.cs.uiuc.edu> <200804021417.45539.baldrick@free.fr> Message-ID: <0167DE4E-83C0-4A57-8C7B-D16B950EB716@apple.com> On Apr 2, 2008, at 10:10 AM, Dale Johannesen wrote: > > On Apr 2, 2008, at 5:17 AM, Duncan Sands wrote: > >> Hi Dale, >> >>> Recommitting EH patch; this should answer most of the >>> review feedback. >> >> yes, this is much better - thanks a lot! >> >>> -enable-eh is still accepted but doesn't do anything. >> >> What is the status of -enable-correct-eh? > > It will not cause non-Dwarf to be emitted for targets that support > Dwarf. > I guess that's a change; can put it back the way it was if you think > it's > important. It don't think it ever worked on Darwin anyway, so this > isn't > something I'm interested in. I don't think anyone with working dwarf support would ever want "- enable-correct-eh". I think this is fine. >>> The separation of the EH table and frame move data is, >>> I think, logically figured out, but either one still >>> causes full EH info to be generated (not sure how to >>> split the metadata correctly). >> >> Me neither, but it would be a nice win if we could. Want >> to open a PR for this? > > I'm not sure it's even possible on Darwin; our linker has a fair > amount of > knowledge about EH tables built into it, and may not take kindly to > having them change. > There is also the matter of binary compatibility with gcc-compiled > code. Anything that shrinks EH data is goodness, but I agree it is probably not a high priority. -Chris From evan.cheng at apple.com Wed Apr 2 12:23:52 2008 From: evan.cheng at apple.com (Evan Cheng) Date: Wed, 02 Apr 2008 17:23:52 -0000 Subject: [llvm-commits] [llvm] r49099 - in /llvm/trunk: include/llvm/CodeGen/LiveVariables.h lib/CodeGen/PHIElimination.cpp lib/CodeGen/RegAllocLocal.cpp Message-ID: <200804021723.m32HNrCp006579@zion.cs.uiuc.edu> Author: evancheng Date: Wed Apr 2 12:23:50 2008 New Revision: 49099 URL: http://llvm.org/viewvc/llvm-project?rev=49099&view=rev Log: Remove #include from LiveVariables.h. Not referenced. Modified: llvm/trunk/include/llvm/CodeGen/LiveVariables.h llvm/trunk/lib/CodeGen/PHIElimination.cpp llvm/trunk/lib/CodeGen/RegAllocLocal.cpp Modified: llvm/trunk/include/llvm/CodeGen/LiveVariables.h URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/CodeGen/LiveVariables.h?rev=49099&r1=49098&r2=49099&view=diff ============================================================================== --- llvm/trunk/include/llvm/CodeGen/LiveVariables.h (original) +++ llvm/trunk/include/llvm/CodeGen/LiveVariables.h Wed Apr 2 12:23:50 2008 @@ -33,7 +33,6 @@ #include "llvm/ADT/BitVector.h" #include "llvm/ADT/SmallSet.h" #include "llvm/ADT/SmallVector.h" -#include namespace llvm { Modified: llvm/trunk/lib/CodeGen/PHIElimination.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/PHIElimination.cpp?rev=49099&r1=49098&r2=49099&view=diff ============================================================================== --- llvm/trunk/lib/CodeGen/PHIElimination.cpp (original) +++ llvm/trunk/lib/CodeGen/PHIElimination.cpp Wed Apr 2 12:23:50 2008 @@ -24,8 +24,9 @@ #include "llvm/ADT/STLExtras.h" #include "llvm/ADT/Statistic.h" #include "llvm/Support/Compiler.h" -#include #include +#include +#include using namespace llvm; STATISTIC(NumAtomic, "Number of atomic phis lowered"); Modified: llvm/trunk/lib/CodeGen/RegAllocLocal.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/RegAllocLocal.cpp?rev=49099&r1=49098&r2=49099&view=diff ============================================================================== --- llvm/trunk/lib/CodeGen/RegAllocLocal.cpp (original) +++ llvm/trunk/lib/CodeGen/RegAllocLocal.cpp Wed Apr 2 12:23:50 2008 @@ -31,6 +31,7 @@ #include "llvm/ADT/Statistic.h" #include "llvm/ADT/STLExtras.h" #include +#include using namespace llvm; STATISTIC(NumStores, "Number of stores added"); From dalej at apple.com Wed Apr 2 12:30:27 2008 From: dalej at apple.com (Dale Johannesen) Date: Wed, 2 Apr 2008 10:30:27 -0700 Subject: [llvm-commits] [llvm] r49003 - in /llvm/trunk/test/CodeGen: PowerPC/fold-li.ll PowerPC/reg-coalesce-simple.ll PowerPC/rotl-2.ll X86/2006-03-02-InstrSchedBug.ll X86/2006-05-02-InstrSched1.ll X86/2006-05-02-InstrSched2.ll X86/2006-05-11-InstrSched.ll X86/constant-pool-remat-0.ll X86/iabs.ll X86/or-branch.ll X86/select.ll X86/setuge.ll X86/x86-64-mem.ll X86/zero-remat.ll In-Reply-To: <200804011108.56894.baldrick@free.fr> References: <200803312320.m2VNKAdJ004885@zion.cs.uiuc.edu> <200804011108.56894.baldrick@free.fr> Message-ID: <46656DC3-F703-48E2-89E9-4F89579F9C5D@apple.com> On Apr 1, 2008, at 2:08 AM, Duncan Sands wrote: > Hi Dale, > >> Mark functions in some tests as 'nounwind'. Generating >> EH info for these functions causes the tests to fail for >> random reasons (e.g. looking for 'or' or counting lines >> with asm-printer; labels count as lines.) > > when you talk of extra labels, do you mean labels in the DAG, > or labels output in the assembler? The reason I ask is that > some time ago I managed to eliminate generation of exception > handling labels in the DAG when they weren't actually needed, > so I was wondering if pointless labels have managed to creep > back in somehow. The labels in question all seem to be valid when EH is being generated. From evan.cheng at apple.com Wed Apr 2 12:48:44 2008 From: evan.cheng at apple.com (Evan Cheng) Date: Wed, 2 Apr 2008 10:48:44 -0700 Subject: [llvm-commits] Speeding up instruction selection In-Reply-To: References: <00FB5805-1FA5-4534-BBD0-E6E34EC17BF1@apple.com> <84648A85-6EB1-4FE5-96B4-749BD5A8D938@apple.com> <039F7990-10A9-4153-A91B-024551DF3541@apple.com> Message-ID: <6878E8F2-B19D-430F-ADCF-DA84A7F3B742@apple.com> On Apr 2, 2008, at 1:57 AM, Roman Levenstein wrote: > 2008/4/2, Evan Cheng : >> >> On Apr 2, 2008, at 12:55 AM, Roman Levenstein wrote: >> >>> Hi Evan, >>> >>> 2008/4/1, Evan Cheng : >>>> Please hold off checking it in for a bit. llvm tot is having some >>>> problems and I'd like to get to the bottom of it first. >>> >>> OK. >>> >>>> Also, the tie breaker is less than ideal. I think we need a tie- >>>> breaker that is "the SUnit that's added to the queue is preferred". >>>> That means it prefers nodes which are closer to the end of block. >>>> What >>>> do you think? >>> >>> Do you actually mean "the SUnit that's added to the queue LAST (or >>> FIRST) is preferred"? I'll think about it. >> >> >> Yep "first". Basically, if all else being equal, let the node that's >> ready first be scheduled first. We can add a order id to SUnit which >> gets set when it's pushed into the ready queue. What do you think? > > Makes sense. The queue should have a global "current id" counter. Its > current value is assigned to each node being inserted into the ready > queue and then incremented. When the node is removed from the queue > for any reason, its queue order id is reset. It should be rather easy > to implement. Yep. > > > BTW, do you really want this queue order id in the SUnit or in a > separate array indexed by SUnit unique ids? It should be in SUnit since the sort functions don't have access to ScheduleDAG members. Evan > > > -Roman > _______________________________________________ > llvm-commits mailing list > llvm-commits at cs.uiuc.edu > http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits From evan.cheng at apple.com Wed Apr 2 13:04:08 2008 From: evan.cheng at apple.com (Evan Cheng) Date: Wed, 02 Apr 2008 18:04:08 -0000 Subject: [llvm-commits] [llvm] r49105 - in /llvm/trunk: include/llvm/CodeGen/LiveVariables.h lib/CodeGen/LiveVariables.cpp Message-ID: <200804021804.m32I493j007856@zion.cs.uiuc.edu> Author: evancheng Date: Wed Apr 2 13:04:08 2008 New Revision: 49105 URL: http://llvm.org/viewvc/llvm-project?rev=49105&view=rev Log: Now that I am told MachineRegisterInfo also tracks physical register uses / defs, I can do away with the horribleness I introduced a while back. It's impossible to detect if there is any use of a physical register below an instruction (and before any def of the register) with some cheap book keeping. Modified: llvm/trunk/include/llvm/CodeGen/LiveVariables.h llvm/trunk/lib/CodeGen/LiveVariables.cpp Modified: llvm/trunk/include/llvm/CodeGen/LiveVariables.h URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/CodeGen/LiveVariables.h?rev=49105&r1=49104&r2=49105&view=diff ============================================================================== --- llvm/trunk/include/llvm/CodeGen/LiveVariables.h (original) +++ llvm/trunk/include/llvm/CodeGen/LiveVariables.h Wed Apr 2 13:04:08 2008 @@ -31,11 +31,13 @@ #include "llvm/CodeGen/MachineFunctionPass.h" #include "llvm/ADT/BitVector.h" +#include "llvm/ADT/DenseMap.h" #include "llvm/ADT/SmallSet.h" #include "llvm/ADT/SmallVector.h" namespace llvm { +class MachineRegisterInfo; class TargetRegisterInfo; class LiveVariables : public MachineFunctionPass { @@ -128,6 +130,8 @@ private: // Intermediate data structures MachineFunction *MF; + MachineRegisterInfo* MRI; + const TargetRegisterInfo *TRI; // PhysRegInfo - Keep track of which instruction was the last def/use of a @@ -152,6 +156,10 @@ SmallVector *PHIVarInfo; + // DistanceMap - Keep track the distance of a MI from the start of the + // current basic block. + DenseMap DistanceMap; + void addRegisterKills(unsigned Reg, MachineInstr *MI, SmallSet &SubKills); Modified: llvm/trunk/lib/CodeGen/LiveVariables.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/LiveVariables.cpp?rev=49105&r1=49104&r2=49105&view=diff ============================================================================== --- llvm/trunk/lib/CodeGen/LiveVariables.cpp (original) +++ llvm/trunk/lib/CodeGen/LiveVariables.cpp Wed Apr 2 13:04:08 2008 @@ -118,8 +118,7 @@ void LiveVariables::HandleVirtRegUse(unsigned reg, MachineBasicBlock *MBB, MachineInstr *MI) { - const MachineRegisterInfo &MRI = MBB->getParent()->getRegInfo(); - assert(MRI.getVRegDef(reg) && "Register use before def!"); + assert(MRI->getVRegDef(reg) && "Register use before def!"); unsigned BBNum = MBB->getNumber(); @@ -140,7 +139,7 @@ assert(VRInfo.Kills[i]->getParent() != MBB && "entry should be at end!"); #endif - assert(MBB != MRI.getVRegDef(reg)->getParent() && + assert(MBB != MRI->getVRegDef(reg)->getParent() && "Should have kill for defblock!"); // Add a new kill entry for this basic block. If this virtual register is @@ -152,7 +151,7 @@ // Update all dominating blocks to mark them as "known live". for (MachineBasicBlock::const_pred_iterator PI = MBB->pred_begin(), E = MBB->pred_end(); PI != E; ++PI) - MarkVirtRegAliveInBlock(VRInfo, MRI.getVRegDef(reg)->getParent(), *PI); + MarkVirtRegAliveInBlock(VRInfo, MRI->getVRegDef(reg)->getParent(), *PI); } /// HandlePhysRegUse - Turn previous partial def's into read/mod/writes. Add @@ -305,25 +304,63 @@ MachineBasicBlock *MBB) { if (I == MBB->end()) return false; - ++I; - // FIXME: This is slow. We probably need a smarter solution. Possibilities: - // 1. Scan all instructions once and build def / use information of physical - // registers. We also need a fast way to compare relative ordering of - // instructions. - // 2. Cache information so this function only has to scan instructions that - // read / def physical instructions. - for (MachineBasicBlock::iterator E = MBB->end(); I != E; ++I) { - MachineInstr *MI = I; - for (unsigned i = 0, e = MI->getNumOperands(); i != e; ++i) { - const MachineOperand &MO = MI->getOperand(i); - if (!MO.isRegister() || MO.getReg() != Reg) - continue; - if (MO.isDef()) - return false; - return true; + + // First find out if there are any uses / defs below. + bool hasDistInfo = true; + unsigned CurDist = DistanceMap[I]; + SmallVector Uses; + SmallVector Defs; + for (MachineRegisterInfo::reg_iterator RI = MRI->reg_begin(Reg), + RE = MRI->reg_end(); RI != RE; ++RI) { + MachineOperand &UDO = RI.getOperand(); + MachineInstr *UDMI = &*RI; + if (UDMI->getParent() != MBB) + continue; + DenseMap::iterator DI = DistanceMap.find(UDMI); + bool isBelow = false; + if (DI == DistanceMap.end()) { + // Must be below if it hasn't been assigned a distance yet. + isBelow = true; + hasDistInfo = false; + } else if (DI->second > CurDist) + isBelow = true; + if (isBelow) { + if (UDO.isUse()) + Uses.push_back(UDMI); + if (UDO.isDef()) + Defs.push_back(UDMI); } } - return false; + + if (Uses.empty()) + // No uses below. + return false; + else if (!Uses.empty() && Defs.empty()) + // There are uses below but no defs below. + return true; + // There are both uses and defs below. We need to know which comes first. + if (!hasDistInfo) { + // Complete DistanceMap for this MBB. This information is computed only + // once per MBB. + ++I; + ++CurDist; + for (MachineBasicBlock::iterator E = MBB->end(); I != E; ++I, ++CurDist) + DistanceMap.insert(std::make_pair(I, CurDist)); + } + + unsigned EarliestUse = CurDist; + for (unsigned i = 0, e = Uses.size(); i != e; ++i) { + unsigned Dist = DistanceMap[Uses[i]]; + if (Dist < EarliestUse) + EarliestUse = Dist; + } + for (unsigned i = 0, e = Defs.size(); i != e; ++i) { + unsigned Dist = DistanceMap[Defs[i]]; + if (Dist < EarliestUse) + // The register is defined before its first use below. + return false; + } + return true; } void LiveVariables::HandlePhysRegDef(unsigned Reg, MachineInstr *MI) { @@ -408,8 +445,8 @@ bool LiveVariables::runOnMachineFunction(MachineFunction &mf) { MF = &mf; + MRI = &mf.getRegInfo(); TRI = MF->getTarget().getRegisterInfo(); - MachineRegisterInfo& MRI = mf.getRegInfo(); ReservedRegisters = TRI->getReservedRegs(mf); @@ -449,9 +486,12 @@ } // Loop over all of the instructions, processing them. + DistanceMap.clear(); + unsigned Dist = 0; for (MachineBasicBlock::iterator I = MBB->begin(), E = MBB->end(); I != E; ++I) { MachineInstr *MI = I; + DistanceMap.insert(std::make_pair(MI, Dist++)); // Process all of the operands of the instruction... unsigned NumOperandsToProcess = MI->getNumOperands(); @@ -507,7 +547,7 @@ for (SmallVector::iterator I = VarInfoVec.begin(), E = VarInfoVec.end(); I != E; ++I) // Mark it alive only in the block we are representing. - MarkVirtRegAliveInBlock(getVarInfo(*I), MRI.getVRegDef(*I)->getParent(), + MarkVirtRegAliveInBlock(getVarInfo(*I),MRI->getVRegDef(*I)->getParent(), MBB); } @@ -549,7 +589,7 @@ for (unsigned i = 0, e1 = VirtRegInfo.size(); i != e1; ++i) for (unsigned j = 0, e2 = VirtRegInfo[i].Kills.size(); j != e2; ++j) if (VirtRegInfo[i].Kills[j] == - MRI.getVRegDef(i + TargetRegisterInfo::FirstVirtualRegister)) + MRI->getVRegDef(i + TargetRegisterInfo::FirstVirtualRegister)) VirtRegInfo[i] .Kills[j]->addRegisterDead(i + TargetRegisterInfo::FirstVirtualRegister, From evan.cheng at apple.com Wed Apr 2 13:05:48 2008 From: evan.cheng at apple.com (Evan Cheng) Date: Wed, 2 Apr 2008 11:05:48 -0700 Subject: [llvm-commits] [llvm] r48521 - in /llvm/trunk: include/llvm/CodeGen/LiveVariables.h lib/CodeGen/LiveVariables.cpp test/CodeGen/PowerPC/2008-03-18-RegScavengerAssert.ll test/CodeGen/X86/x86-64-ret0.ll In-Reply-To: References: <200803190052.m2J0qKMl003299@zion.cs.uiuc.edu> <1F8B64DC-E15B-4CB0-83D7-B3A53D5454BE@apple.com> <8C07A027-CAAF-4AA4-B2C9-7BB2894EE585@apple.com> Message-ID: <81564F68-4B2A-4E65-A566-EDAC42895C80@apple.com> On Mar 24, 2008, at 10:01 PM, Owen Anderson wrote: > On Mar 24, 2008, at 11:48 PM, Chris Lattner wrote: > >> >> On Mar 24, 2008, at 6:41 PM, Evan Cheng wrote: >> >>>> How about using reg_iterators to do this? I assume this only >>>> applies >>>> to vregs. If you walk the use_iterator list for the register, >>>> you can >>>> very efficiently discard uses in other blocks (check User- >>>> >getparent() >>>> == MBB). Any uses within the same block are either a) in phi >>>> nodes, >>>> in which case they are above the instruction or b) users later in >>>> the >>>> block. >>> >>> No, this applies to physical registers only. >>> >>> We need def / use information for physical registers and MI to >>> distance from top of MBB mapping to quickly determine this property. >>> This is not *yet* showing up to be a compile time issue, so I am >>> ignoring it for now. >>> >>> Isn't Owen going to do something about LiveVariables? Can I >>> volunteer >>> Own to own this problem? :-) >> >> Sure you can volunteer him; lets see how much he fights back! What >> do you say Owen? :) > > Gah, what am I being volunteered for? I'm not planning to do > anything to LV anymore. That plan got revised when I changed the > pass ordering for StrongPHIElimination. Fear not young man. I've fixed this. I'll volunteer you for something else another time. :-) Evan > > > --Owen > _______________________________________________ > llvm-commits mailing list > llvm-commits at cs.uiuc.edu > http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits From greened at obbligato.org Wed Apr 2 13:24:46 2008 From: greened at obbligato.org (David Greene) Date: Wed, 02 Apr 2008 18:24:46 -0000 Subject: [llvm-commits] [llvm] r49106 - in /llvm/trunk: include/llvm/ADT/SmallVector.h lib/Transforms/Scalar/LoopIndexSplit.cpp Message-ID: <200804021824.m32IOk9Q008455@zion.cs.uiuc.edu> Author: greened Date: Wed Apr 2 13:24:46 2008 New Revision: 49106 URL: http://llvm.org/viewvc/llvm-project?rev=49106&view=rev Log: Iterators folloring a SmallVector erased element are invalidated so don't access cached iterators from after the erased element. Re-apply 49056 with SmallVector support. Modified: llvm/trunk/include/llvm/ADT/SmallVector.h llvm/trunk/lib/Transforms/Scalar/LoopIndexSplit.cpp Modified: llvm/trunk/include/llvm/ADT/SmallVector.h URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/ADT/SmallVector.h?rev=49106&r1=49105&r2=49106&view=diff ============================================================================== --- llvm/trunk/include/llvm/ADT/SmallVector.h (original) +++ llvm/trunk/include/llvm/ADT/SmallVector.h Wed Apr 2 13:24:46 2008 @@ -208,19 +208,23 @@ construct_range(Begin, End, Elt); } - void erase(iterator I) { + iterator erase(iterator I) { + iterator N = I; // Shift all elts down one. std::copy(I+1, End, I); // Drop the last elt. pop_back(); + return(N); } - void erase(iterator S, iterator E) { + iterator erase(iterator S, iterator E) { + iterator N = S; // Shift all elts down. iterator I = std::copy(E, End, S); // Drop the last elts. destroy_range(I, End); End = I; + return(N); } iterator insert(iterator I, const T &Elt) { Modified: llvm/trunk/lib/Transforms/Scalar/LoopIndexSplit.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Scalar/LoopIndexSplit.cpp?rev=49106&r1=49105&r2=49106&view=diff ============================================================================== --- llvm/trunk/lib/Transforms/Scalar/LoopIndexSplit.cpp (original) +++ llvm/trunk/lib/Transforms/Scalar/LoopIndexSplit.cpp Wed Apr 2 13:24:46 2008 @@ -232,8 +232,8 @@ return false; // First see if it is possible to eliminate loop itself or not. - for (SmallVector::iterator SI = SplitData.begin(), - E = SplitData.end(); SI != E;) { + for (SmallVector::iterator SI = SplitData.begin(); + SI != SplitData.end();) { SplitInfo &SD = *SI; ICmpInst *CI = dyn_cast(SD.SplitCondition); if (SD.SplitCondition->getOpcode() == Instruction::And) { @@ -244,8 +244,7 @@ return Changed; } else { SmallVector::iterator Delete_SI = SI; - ++SI; - SplitData.erase(Delete_SI); + SI = SplitData.erase(Delete_SI); } } else if (CI && CI->getPredicate() == ICmpInst::ICMP_EQ) { @@ -256,8 +255,7 @@ return Changed; } else { SmallVector::iterator Delete_SI = SI; - ++SI; - SplitData.erase(Delete_SI); + SI = SplitData.erase(Delete_SI); } } else ++SI; From dag at cray.com Wed Apr 2 13:25:10 2008 From: dag at cray.com (David Greene) Date: Wed, 2 Apr 2008 12:25:10 -0600 Subject: [llvm-commits] [llvm] r49056 - /llvm/trunk/lib/Transforms/Scalar/LoopIndexSplit.cpp In-Reply-To: <1EC2BF49-B2BA-4F2E-8F14-0DCF62611586@apple.com> References: <200804012214.m31MENkW023546@zion.cs.uiuc.edu> <200804020952.07520.dag@cray.com> <1EC2BF49-B2BA-4F2E-8F14-0DCF62611586@apple.com> Message-ID: <200804021325.10776.dag@cray.com> On Wednesday 02 April 2008 11:54, Dan Gohman wrote: > lib/Transforms/Scalar/LoopIndexSplit.cpp: In member function ?virtual > bool::LoopIndexSplit::runOnLoop(llvm::Loop*, > llvm::LPPassManager&)?: > lib/Transforms/Scalar/LoopIndexSplit.cpp:247: error: void value not > ignored as it ought to be > lib/Transforms/Scalar/LoopIndexSplit.cpp:258: error: void value not > ignored as it ought to be > > Do you have a patch to make SmallVector's erase return an iterator > like std::vector's? D'oh! Fixed. -Dave From baldrick at free.fr Wed Apr 2 13:31:03 2008 From: baldrick at free.fr (Duncan Sands) Date: Wed, 2 Apr 2008 20:31:03 +0200 Subject: [llvm-commits] =?iso-8859-1?q?=5Bllvm=5D_r49006_-_in=09/llvm/trun?= =?iso-8859-1?q?k/lib=3A_CodeGen/DwarfWriter=2Ecpp=09CodeGen/LLVMTargetMac?= =?iso-8859-1?q?hine=2Ecpp_CodeGen/SelectionDAG/SelectionDAGISel=2Ecpp=09T?= =?iso-8859-1?q?arget/PowerPC/PPCAsmPrinter=2Ecpp_Target/PowerPC/PPCRegist?= =?iso-8859-1?q?erInfo=2Ecpp=09Target/X86/X86AsmPrinter=2Ecpp_Target/X86/X?= =?iso-8859-1?q?86RegisterInfo=2Ecpp=09Transforms/Utils/LowerInvoke=2Ecpp?= In-Reply-To: <200804021344.23537.baldrick@free.fr> References: <200803312340.m2VNeOu9005523@zion.cs.uiuc.edu> <200804021344.23537.baldrick@free.fr> Message-ID: <200804022031.06050.baldrick@free.fr> > At first glance, there's nothing stopping __cxa_end_catch > being marked nothrow. I will take a closer look later. If the destructor for an exception object throws, then that exception will propagate out of __cxa_end_catch, so it cannot be marked nothrow. Too bad. Duncan. From baldrick at free.fr Wed Apr 2 13:47:42 2008 From: baldrick at free.fr (Duncan Sands) Date: Wed, 2 Apr 2008 20:47:42 +0200 Subject: [llvm-commits] [llvm] r49003 - in /llvm/trunk/test/CodeGen: PowerPC/fold-li.ll PowerPC/reg-coalesce-simple.ll PowerPC/rotl-2.ll X86/2006-03-02-InstrSchedBug.ll X86/2006-05-02-InstrSched1.ll X86/2006-05-02-InstrSched2.ll X86/2006-05-11-InstrSched.ll X86/constant-pool-remat-0.ll X86/iabs.ll X86/or-branch.ll X86/select.ll X86/setuge.ll X86/x86-64-mem.ll X86/zero-remat.ll In-Reply-To: <46656DC3-F703-48E2-89E9-4F89579F9C5D@apple.com> References: <200803312320.m2VNKAdJ004885@zion.cs.uiuc.edu> <200804011108.56894.baldrick@free.fr> <46656DC3-F703-48E2-89E9-4F89579F9C5D@apple.com> Message-ID: <200804022047.52009.baldrick@free.fr> > The labels in question all seem to be valid when EH is being generated. I meant: in a function with no invokes, does turning on eh (now the default) generate labels that wouldn't have been generated with eh turned off? The problem with labels is that they get in the way of some codegen optimizations. It would be bad if by turning on eh unconditionally, code that doesn't require eh is being slowed down. Ciao, Duncan. From baldrick at free.fr Wed Apr 2 14:05:01 2008 From: baldrick at free.fr (Duncan Sands) Date: Wed, 2 Apr 2008 21:05:01 +0200 Subject: [llvm-commits] [llvm] r49064 - in /llvm/trunk: include/llvm/CodeGen/MachineModuleInfo.h lib/CodeGen/DwarfWriter.cpp lib/CodeGen/LLVMTargetMachine.cpp lib/CodeGen/MachineModuleInfo.cpp lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp lib/Target/PowerPC/PPCAsmPrinter.cpp lib/Target/PowerPC/PPCRegisterInfo.cpp lib/Target/X86/X86ATTAsmPrinter.cpp lib/Target/X86/X86AsmPrinter.cpp lib/Target/X86/X86RegisterInfo.cpp In-Reply-To: References: <200804020025.m320P5FC028148@zion.cs.uiuc.edu> <200804021417.45539.baldrick@free.fr> Message-ID: <200804022105.04172.baldrick@free.fr> Hi, > >> The separation of the EH table and frame move data is, > >> I think, logically figured out, but either one still > >> causes full EH info to be generated (not sure how to > >> split the metadata correctly). > > > > Me neither, but it would be a nice win if we could. Want > > to open a PR for this? > > I'm not sure it's even possible on Darwin; our linker has a fair > amount of > knowledge about EH tables built into it, and may not take kindly to > having them change. > There is also the matter of binary compatibility with gcc-compiled code. it should be pretty easy to generate a frame moves entry with no actual moves in it, just the surrounding junk. This should be compatible with anything. I've opened PR2188 for this. That said, you already dealt with the most important case - while it would be nice to go all the way, PR2188 won't make a difference most of the time. Ciao, Duncan. From gohman at apple.com Wed Apr 2 14:40:15 2008 From: gohman at apple.com (Dan Gohman) Date: Wed, 02 Apr 2008 19:40:15 -0000 Subject: [llvm-commits] [llvm] r49109 - /llvm/trunk/lib/Target/CBackend/CBackend.cpp Message-ID: <200804021940.m32JeFuu010594@zion.cs.uiuc.edu> Author: djg Date: Wed Apr 2 14:40:14 2008 New Revision: 49109 URL: http://llvm.org/viewvc/llvm-project?rev=49109&view=rev Log: Partial CBackend support for 128-bit integers. This is needed now that llvm-gcc is lowering appropriately-sized struct returns to i128 on x86-64. Modified: llvm/trunk/lib/Target/CBackend/CBackend.cpp Modified: llvm/trunk/lib/Target/CBackend/CBackend.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/CBackend/CBackend.cpp?rev=49109&r1=49108&r2=49109&view=diff ============================================================================== --- llvm/trunk/lib/Target/CBackend/CBackend.cpp (original) +++ llvm/trunk/lib/Target/CBackend/CBackend.cpp Wed Apr 2 14:40:14 2008 @@ -445,9 +445,11 @@ return Out << (isSigned?"signed":"unsigned") << " short " << NameSoFar; else if (NumBits <= 32) return Out << (isSigned?"signed":"unsigned") << " int " << NameSoFar; - else { - assert(NumBits <= 64 && "Bit widths > 64 not implemented yet"); + else if (NumBits <= 64) return Out << (isSigned?"signed":"unsigned") << " long long "<< NameSoFar; + else { + assert(NumBits <= 128 && "Bit widths > 128 not implemented yet"); + return Out << (isSigned?"llvmInt128":"llvmUInt128") << " " << NameSoFar; } } case Type::FloatTyID: return Out << "float " << NameSoFar; @@ -1478,6 +1480,11 @@ << "#define __builtin_stack_restore(X) /* noop */\n" << "#endif\n\n"; + Out << "#ifdef __GNUC__ /* 128-bit integer types */\n" + << "typedef int __attribute__((mode(TI))) llvmInt128;\n" + << "typedef unsigned __attribute__((mode(TI))) llvmUInt128;\n" + << "#endif\n\n"; + // Output target-specific code that should be inserted into main. Out << "#define CODE_FOR_MAIN() /* Any target-specific code for main()*/\n"; } From dalej at apple.com Wed Apr 2 15:10:53 2008 From: dalej at apple.com (Dale Johannesen) Date: Wed, 02 Apr 2008 20:10:53 -0000 Subject: [llvm-commits] [llvm] r49110 - in /llvm/trunk: lib/CodeGen/AsmPrinter.cpp tools/lto/lto.cpp Message-ID: <200804022010.m32KArMB011667@zion.cs.uiuc.edu> Author: johannes Date: Wed Apr 2 15:10:52 2008 New Revision: 49110 URL: http://llvm.org/viewvc/llvm-project?rev=49110&view=rev Log: Make EH work with unnamed functions. Reenable running StripSymbols when EH is on. Modified: llvm/trunk/lib/CodeGen/AsmPrinter.cpp llvm/trunk/tools/lto/lto.cpp Modified: llvm/trunk/lib/CodeGen/AsmPrinter.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/AsmPrinter.cpp?rev=49110&r1=49109&r2=49110&view=diff ============================================================================== --- llvm/trunk/lib/CodeGen/AsmPrinter.cpp (original) +++ llvm/trunk/lib/CodeGen/AsmPrinter.cpp Wed Apr 2 15:10:52 2008 @@ -198,8 +198,10 @@ std::string AsmPrinter::getCurrentFunctionEHName(const MachineFunction *MF) { assert(MF && "No machine function?"); - return Mang->makeNameProper(MF->getFunction()->getName() + ".eh", - TAI->getGlobalPrefix()); + std::string Name = MF->getFunction()->getName(); + if (Name.empty()) + Name = Mang->getValueName(MF->getFunction()); + return Mang->makeNameProper(Name + ".eh", TAI->getGlobalPrefix()); } void AsmPrinter::SetupMachineFunction(MachineFunction &MF) { Modified: llvm/trunk/tools/lto/lto.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/lto/lto.cpp?rev=49110&r1=49109&r2=49110&view=diff ============================================================================== --- llvm/trunk/tools/lto/lto.cpp (original) +++ llvm/trunk/tools/lto/lto.cpp Wed Apr 2 15:10:52 2008 @@ -303,10 +303,7 @@ // If the -s command line option was specified, strip the symbols out of the // resulting program to make it smaller. -s is a GLD option that we are // supporting. - if(!ExceptionHandling) - // FIXME : This causes multiple nameless _.eh symbols on - // darwin when EH is ON. - Passes.add(createStripSymbolsPass()); + Passes.add(createStripSymbolsPass()); // Propagate constants at call sites into the functions they call. Passes.add(createIPConstantPropagationPass()); From dalej at apple.com Wed Apr 2 15:16:42 2008 From: dalej at apple.com (Dale Johannesen) Date: Wed, 02 Apr 2008 20:16:42 -0000 Subject: [llvm-commits] [llvm] r49111 - /llvm/trunk/test/CodeGen/X86/2008-04-02-unnamedEH.ll Message-ID: <200804022016.m32KGgn4011811@zion.cs.uiuc.edu> Author: johannes Date: Wed Apr 2 15:16:41 2008 New Revision: 49111 URL: http://llvm.org/viewvc/llvm-project?rev=49111&view=rev Log: Testcase for EH with functions whose names are stripped. Added: llvm/trunk/test/CodeGen/X86/2008-04-02-unnamedEH.ll Added: llvm/trunk/test/CodeGen/X86/2008-04-02-unnamedEH.ll URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/X86/2008-04-02-unnamedEH.ll?rev=49111&view=auto ============================================================================== --- llvm/trunk/test/CodeGen/X86/2008-04-02-unnamedEH.ll (added) +++ llvm/trunk/test/CodeGen/X86/2008-04-02-unnamedEH.ll Wed Apr 2 15:16:41 2008 @@ -0,0 +1,27 @@ +; RUN: llvm-as < %s | llc | grep unnamed_1_0.eh +; ModuleID = '' +target datalayout = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-a0:0:64-f80:128:128" +target triple = "i386-apple-darwin8" + +define void @_Z3bazv() { + call i32 @0( ) ; :1 [#uses=0] + br label %2 +;

    @?= 6#^ %T![C I at 4(_^"X<*(%".OWB?9) +M 0 ) (GPP>@?= 6#^ %T![C I at 4(_^"X<*(%".OWB?8< +M ) 0 )0 (M%"(E#!(M&!(E#"(MU$,=% &"G!0CII4," )"+10B)0P2+ +M1 at B)0PB+1 at 2)0PR+=1#'10"$IP4(Z=]# @"-=@ 4 !) 0 +M)0 (M&!(E%$(MU),=% !BG!0C_)HGVBT8$B44(BT8(B440BW4DQT4 M*<% +M"/\F!P$ "0 "#QQ@[>UQW1<='[#2-1_B)12"+=0#'1?P(J 4(@^T$BP;_X,=# +M;!@ #'100\J 4(QT, at _@ ;@LV0<(Z^*-=@ ' 0 ) .N*B?8 +M ' 0 )0 (M%%(E%_(EU^,=% +"H!0B#[0CI^&< 0[0U1R)XM&!(E%_(EU^(M%"(E%\,=%[.1H +M"0C'1?00J04(@^T4N- *!0C_X(M#_.OY "4 ") +M=0#'1?QX9PD(@^T$Z6X"__^)]@ E QT7\5%P) +M"(EU^,=% )BI!0B#[0CI0U___XUV * H P ! $ %@ ! (U%\#M#5'(BQT7X +M]! ("(EU_(M&"/?8B47TBT8$B47P@^T0N/"Z!0C_X(M#^.OYD ( 5 +MC47P.T-4UQW.<='^""J!0B+10B)1_R+ +M102)!XM%#(E%"(EU#(U'^(E%!,=% %1<"0B+=13'113 J04(N%"I!0C_X,=# +M; P "+0_CK\HUV 4 E BT4$B47\BT40B47X +MB740QT4 9*H%"(/M".DF; B?:4)P, )@ "0 0"#QPP[>UQW,L='^.BI +M!0B+10B)1_R+102)!XU'^(E%"(E% (M&$(E%_,=%!,BJ!0B#[02X#!<&"/_@ +MQT-L# (M#^.ORB?8 "% )0 (M%$(E%#(M%!(E% +M$(M%"(E%!(EU",=% %1<"0B+=13'113 J04(Z=7]__^0 +M!0 "4 ")=?R+10R)1?C'10!0JP4(@^T(Z61K #4)@, )@ "0 0"+ +M102)10"+10B)1?R+1A")10C'1020JP4(@^T$Z1L/ "-=@"<)@, !0 "0 +M!0"#QP@[>UQW&\='_%"I!0B+102)!XM&!/?0P>@?=!&#^ %T*<=#; @ "+ +M0_C_X(M&!(E% (MU%(U'_(E%%,=%_/2J!0B#[02+!NOABT8$B44 BW44C4?\ +MB444QT7\M*L%"(/M!(L&Z\2-=@ D)@, !@ !( !0"-1=@[0U1R.<=%^/00 +M" B)=?R+1A2)1>2+1A")1>B+1 at R)1>R+1 at B)1?"+1 at 2)1?2+=AC'1>#DJP4( +M@^T at BP;_X(M#^.OYB?;H 0 , E P & )0 ? (''[ #M[7 ^' +MRP$ ,>'&/___Z0*" B+102)AQS___^+11B)AR#____'AR3___^D"@@(BT4( +MB8'0/___Z0*" B+11")AT3___^+11B)ATC____'ATS___^$ +M 0@(C8= ____B8=0____QX=8____%'H%"(V'&/___XF'7/___XV',/___XF' +M8/___XV'0/___XF'9/___XV'3/___XF':/___\>';/___X0!" B-AUC___^) +MAW#____'AWC___\D 0@(B8=\____QT>$>(X%"(V'&/___XE'B(V')/___XE' +MC(V',/___XE'D(V';/___XE'E(V'>/___XE'F,='G.0!" B-1X2)1Z#'1ZB$ +M 0@(B4>LQT>T) $("(E'N,='P'";!0B-AQC___^)1\2-AR3___^)1\B-ATS_ +M__^)1\R-AVS___^)1]"-AWC___^)1]2-1YR)1]B-1ZB)1]R-1[2)1^"+112) +M1^3'1^A$B4?LC4>HB4?TC4>TB4?XBT44B4?\C4? B0>) +M11B-=^B#Q1B+103_X,=#;.P "+0_CK\HGVQT48_%T)"+Y4; D(@\48_V4$ +MD) + ( !$ "+=0#'10#PK at 4(_R8A ) (M%!(E% (M&!(E% +M!.G+%P C78 0 "0 "+502+1 at 2)102)UL=% -2N!0C_)@ @ 8 +MC47T.T-4UQW.L='^#S]!PB#[ Q6Z)05 @"#Q!"-1_B)1 at 3'!EC\ +M!PC'1?CT$ @(B47\QT7T_-(("(/M#+C K00(_^#'0VP, BT/XZ_*0D +M @ 8 C47T.T-4UQW.L='^#S]!PB#[ Q6Z#05 @"#Q!"-1_B) +M1 at 3'!EC\!PC'1?CT$ @(B47\QT7T_%T)"(/M#+C@#08(_^#'0VP, BT/X +MZ_*0D 0 0 $0 (MU ,=% .2O!0C_)@ D BT8$B44 Z1'= +M "0! ! 1 BW4 QT4 $+ %"/\F "0 "#QP@[>UQW(=GH +MV'8$V5PD",='_'2P! B+1"0(B0>-=_R#Q02+10#_X,=#; @ "+0_CK\I"0 +MD * $ BT4 BT#L T4 _^"0("0# 0 0 $0 ! (U%_#M#5'(. +MBW4 QT4 V+ %"(L&_^"^$&,)"(M#_.OT "0 "#QPP[>UQW&L='^&@[ +M!@B)=_R+10")!XUW^(/%"(M% /_ at QT-L# ,=#(/X &X+-D'".OID+0C +M P ) ! (M&!(E%_,=% )2P!0B#[03I>], )"0D! ! _V4 +MD! ) _V4 D" D P + ( !$ ?P"-1?@[0U1R$8MU!,=%_ RW +M!0B#[02+!O_ at OB!C"0B+0_SK])#IJP$ (UV D BT8$-0 (") +M0RB#Q03_90"-=@ ) (M&!#4 " B4,H@\4$_V4 C78 "0 +M "+1 at 0U @(E#*(/%!/]E (UV %@ C",# $( E $$ @\<( +M.WM<=R*+1 at 0] @'4DQT4 9&<)",=%"&BQ!0B#[PBX?+X%"/_ at QT-L" +M (M#^.OR]]C'1_QL#P4(B0>-1_R)10#'10A,L04(N'R^!0CKTXUV (/'##M[ +M7'-1_B)10#'10B$L04(N'R^!0C_X,=# +M; P "+0_CK\NPB P " ) !! (MU",=% *RQ!0C_)M0B P " ) !% +M (GPP>@?= 6#^ %T#+XD9 D(@\4,BP;_X+A,L at 4(Z_>0( "@(@, +M @ "4 10"+1 at 3!Z!]T!8/X 70,OB1D"0B#Q0R+!O_ at N$RR!0CK]XM&!(E# +M!(MV",=#" #'10!DL at 4(Z: X @!0_O__ $PB P $ @ X +M10"-1?0[0U1R'8M&!(E%_(M&"(E%^(MV!,=%])BR!0B#[0R+!O_ at BT/\Z_F) +M]@ D @\<(.WM<=Q?'1_QTL 0(BT,HB0>-=_R#Q02+10#_X,=#; @ +M "XF-0'".OPC78 "0 "#QP@[>UQW%\='_'2P! B+0RB)!XUW_(/% +M!(M% /_ at QT-L" +B8U <(Z_"-=@"H(0, 0 "0 0"%]G4,OLQL"0B# +MQ0B+!O_ at BW4$QT4$6+,%"(/%!+CLL at 4(Z^HH ' A P ! )0 ! +M (-^! !U#+[,; D(@\4(BP;_X(MU!,=%!""S!0B#Q02X[+(%".OJB?:+1 at 2) +M0P2+=@C'0P@ QT4 E+,%".ED-P( '"$# ( D $< @\<,.WM<=RG' +M1_CLL at 4(BT4$B4?\BT4(B0>-1_B)10B+=03'103,LP4(@\4$BP;_X,=#; P +M #'10 @?= 6#^ %T +M![@0M04(_^"^D&P)"(/%#(L&Z_*0( #<'P, @ "4 3P"+1 at 3! +MZ!]T!8/X 70'N!"U!0C_X+Z0; D(@\4,BP;K\HM&!(E#!(MV",=#" #' +M10 HM04(Z=PU @"4'P, @ "0 3P"+=03'10!-=@"+1 at 2)0P2+=@C'0P@ +MQT4 O+4%".E4-0( #!\# ( D %\ BW4$QT4 Z+4%"/\F]!X# ( D +M '\ A?8/G\ /ML"%P'0%@_@!= >X++8%"/_ at OEQD"0B#Q0R+!NOR* +M "\'@, @ "4 ?P"#?@0 #Y_ #[; A P " +M) !_ (MU!,=% 'RV!0C_)E0> P " ) !_ (7V=0>XS+8%"/_ at N!"U!0CK +M]XGV% L'@, @ "4 ?P"#?@0 =0>XS+8%"/_ at N!"U!0CK]XM& +M!(E#!(MV",=#" #'10#DM at 4(Z3 at T @ ( & (U%]#M#5')"@\<, +M.WM<=SK'1_@\_0<(@^P,5NA<#0( @\00C4?XB48$QP98_ <(QT7X]! ("(E% +M_,=%](S5" B#[0RXP*T$"/_ at QT-L# (M#^.ORD)"#/6R&"0@ = :#Q03_ +M9?S'!6R&"0@! @^T$QT4 ,#$%"(/M!,=% .2J! B#[03'10#$" 4(@^T$ +MQT4 [$\%"(/M!,=% "03!0B#[03'10",#P4(@^T$QT4 J!$%"(/M!,=% )Q- +M!0CKGI"XG+<%"/_ at D 0 0 $0 (MU ,=% #"X!0C_)@ D +M@\<(.WM<=RV#[!#91 at 3='"3HEMK^_X/$$-E<) C'1_QTL 0(BT0D"(D'C7?\ +M@\4$BT4 _^#'0VP( BT/XZ_*0D) $ $ !$ "+=0#'10"4N 4( +M_R8 ) (/'"#M[7'UQW0]E&!-U<)!C=1"08V>C9\]U<) B+1"0(BU0D +M#(E$)!")5"04W40D$-E<)"3'1_QTL 0(BT0D)(D'C7?\@\4$BT4 _^#'0VP( +M BT/XZ_*0"P " 1 C47\.T-4<@Z+=0#'10!HN at 4(BP;_X+YL +M8PD(BT/\Z_0, ! )0 (M&!(E% .E]V D(M&!(E% +M (M&"(E%_(/M!.EP[0U1R'L=%^ AC"0B+ +M10")1?3'1?S NP4(@^T,N- *!0C_X+ZD8PD(BT/\Z_3# ) (M%!(MT +ML R#Q1#_)O@< P## ) ! (M%#(E%_(M&!(E%^(M%"(E%],=% "B[!0B# +M[0SI$Z$ (UV ,@< P"# ) ! (M5"(M&!(E%"(G6QT4 0+L%"/\FJ!P# +M "$ D $ BT8,B47\BT8(B44 BW8$QT7X<+L%"(/M"/\FD @ +M=!P# $( E < @\4$ZP ^VP(7 = 6#^ %T"H/%!+B0. at 8(Z]Z^<&P)",=%!)"[!0B# +MQ02+!NO+!0 ! 1 V44 V$T V5PD&-GHV$0D&-E<)!2#[!#91"0D +MW1PDZ*G9_O_97"0 at V44 V$0D(-E<)!S91"0-=_R# +MQ02X]! ("/_ at QT-L" (M#^.OR_!L# L @ $0#_!XU%[#M#5'(> +MBT4 B47XQT7T"&,)",=%_*C$!0B#[0RXW(X&"/_ at O@AD"0B+0_SK] D +M @\<,.WM<=QS'1_AH.P8(B7?\BT4 B0>-=_B#Q0BX]! ("/_ at QT-L# +M ,=#(/X &X+-D'".OIC78 A!L# ( D $ B74$BU4(BT4 B44(B54 +MBT4,B47\QT4,M+X%"(/M!.E@=P !(&P, @ "4 P#'1?SH +M80D(B77XQT4 _+X%"(/M".D#9 C78 8&P, @ "4 P#' +M1?Q<9PD(B77XQT4 -+\%"(/M".F/5P C78 "!L# @ 4 $ C47P.T-4 +MUQW',='^&@[!@B)=_R+10")!XUW^(/%"+CT$ @(_^#'0VP, +M QT, at _@ ;@LV0<(Z^F-=@!T&@, @ "0 0")=02+50B+10")10B) +M50"+10R)1?S'10S$OP4(@^T$Z5!V #@: P!$ )0 # (EU +M ,=%" S !0CI_6( ) !0: P!$ )0 # (EU_,=%^.AA"0C' +M10!$P 4(@^T(Z8M6 "-=@#L&0, 1 "0 P"%]@^?P ^VP(7 = 6#^ %T +M)(7V=1"^B&<)",=% &C !0B+!O_ at OE1G"0C'10!HP 4(BP;K[KY<9PD(QT4 +M:, %"(L&Z]Z-=@!$ ) 9 P!$ )0 # (M&!,'H'W0%@_@!=":# +M?@0 =1"^B&<)",=% &C !0B+!O_ at OEQG"0C'10!HP 4(BP;K[KY49PD(QT4 +M:, %"(L&Z]Z0BT8$B4,$BW8(QT,( ,=% )# !0CI*"H" +M'!D# , E , B74 BW4$QT7\[, %"(/M!/\FB?9L / 8 P # +M )0 ' (/'"#M[7'<>BU8$@?H " =1^^9&<)",=% &#!!0B#[PB+!O_@ +MQT-L" (M#^.ORB=#WT,'H'W0%@_@!=!Z)T/?8QT?\; \%"(D'C7?\QT4 +M8,$%"+A at P04(Z\;'10!@P04(@^\(BP;KN(/'##M[7'-=_C'10!@P04( +MN&#!!0CKV<=% &#!!0B#[PR+!NO+B?8@& , @ ! !( AP"-1=P[0U1R'X/' +M##M[7'<7QT7X]! ("(EU_(M&#,'H'W01 at _@!=#G'0VP, BT/X_^"+1 at B) +M1?"+1 at 2)1?2+1 at R)1>C'1>0(8PD(QT7L9+\%"(/M'(/O#+CPN at 4(Z]''1_B, +MOP4(BT8,B4?\BT8$B47TBT8(B47PC4?XB47LB<;'1>B(P04(@^T8BP;KHI!$ +M A )0 (/'"#M[7'-1_2)102)=0#'1?RH; D(QT7X$&0)",=%]&O____' +M1?#@; D(QT4(S,,%"(/M$+BT@ 8(_^#'0VP0 QT4 Z,,%",=#(/\ "X +M+-D'".OBD!06 P C ) #?!XM%!"GPC5#H@?IK____#Y[ #[; AP[ +M0U1R4(/'##M[7'=(QT?X//T'"(/L#%;HS/\! (/$$(U'^(E&!,<&6/P'",=% +M^/00" B)1?S'1?!$: D(QT7L%&T)",=%]$#%!0B#[12X4",&"/_ at QT-L# +M (M#^.OR "0 "#QPP[>UQW',='^&@[!@B)=_R+10")!XUW^(/%"+CT +M$ @(_^#'0VP, QT, at _@ ;@LV0<(Z^F0D) + ( !$ "+=0#' +M10 - +M=_R#Q12+10#_X,=#; @ #'0R#_ $!N"S9!PCKZ3@ !B +M @ $0 (/L$-E%!-T<).C6S_[_V5PD&-E% -T<).C'S_[_@\00V5PD +M!-E$) C8="0$V5LH@\4(_V4 C78 ZUQW)HM&!#4 " B40D",='_'2P! B+1"0(B0>-=_R#Q02X]! ( +M"/_ at QT-L" (M#^.ORD) ( & (U%^#M#5');@\<4.WM<=U/'1_ \ +M_0<(@^P,5NA8_ $ @\0(C4?PB48$QP98_ <(QT7X]! ("(E%_&H :@#H]/4! +M (/$$-E<) C'1_QTL 0(BT0D"(D'C7?\@^T(N/00" C_X,=#;!0 "+0_CK +M\I#@$P, " !@ P"-1? [0U1R1(/'##M[7'<\QT?X//T'"(/L#%;HW/L! +M (/$$(U'^(E&!,<&6/P'",=%^/00" B)1?R^+&T)",=%]&C)!0B#[0R+!O_@ +MQT-L# (M#^.OR(0 "0 "#QP@[>UQW)-E%!-AV!-E<) C'1_QTL 0( +MBT0D"(D'C7?\@\4(N/00" C_X,=#; @ "+0_CK\D 3 P ) ! (M& +M!(E% +Y,9 D(QT7\),D%"(/M!/\FD(,]<(8)" !T!H/%!/]E_,<%<(8)" $ +M "#[03'10!T+P4(@^T$QT4 Q$L%"(/M!,=% &A,!0B#[03'10#$" 4(@^T$ +MQT4 Y*H$"(/M!,=% %0#!0B#[03'10"<&@8(@^T$QT4 \*\$"(/M!,=% "03 +M!0CKE(UV +B R04(_^"0G!(# 0 0 $0 ! (/'*#M[7'=/QT?<<#$% +M"(M% (E'X,='Y#@%!0C'1^A07 D(QT?LX%\)",='\%1<"0C'1_1P90D(C4?< +MB4?XQT?\J (%"(U'Y(D'C4?\B44 N&P%!0C_X,=#;"@ "^;&0)"(M#_.OM +M*!(# !, ! $0 ! (U%_#M#5'(0BW4$QT7\P,H%"(G%BP;_X+YT9 D( +MBT/\Z_2)]C@ \!$# $, E $ @\<(.WM<=R+'1_Q0!04(BT8( +MB0>-1_R)10B+102)10")=02X*/,%"/_ at QT-L" (M#^.ORB?:#QP@[>UQW +M(L='_% %!0B+1 at R)!XU'_(E%"(M%!(E% (EU!+ at H\P4(_^#'0VP( BT/X +MZ_*0D& &!@ ;!$# !P $0 ' (U%Z#M#5'(M@\<,.WM<=R6+ +M110K11!U+L='^/#/!0B+10B)1_R+11")!XUW^(/%&(M% /_ at QT-L# +Y\ +M9 D(BT/\Z^V+=0")10#'1?P-=_R+10#_X,=# +M; @ "+0_SK\F( D @\<8.WM<=S6+50@#503'1^Q$ P4(BT8$B4?P +MBT8(B4?TQT?X (E7_(M&%(D'C7?L@\4,N/00" C_X,=#;!@ "+0_CK +M\HUV $ @ 2 C47L.T-4UQW(\=' +M]##-!0B+11")1_B+11B)1_R+10R)!XUW](/%((M% /_ at QT-L$ (M#^.OR +MD"$ D @\<8.WM<=S+'1^Q$ P4(BT8$B4?PBT8(B4?TQT?X (M% +M!(E'_(M&%(D'C7?L@\4(N/00" C_X,=#;!@ "+0_CK\HGV 0 ! !8 "- +M1? [0U1R(<=%^/00" B)=?R+1 at B)1?2+=@3'1?#8S04(@^T0BP;_X(M#^.OY +MB?98#@, 1PP "0 0"#QQ [>UQW&XM6!(72=2"+51B%TG5?@\4@@^\0N"CW +M!0C_X,=#;! "+0_CK\CM5" ^

    P(90D(QT7\!,\%"(/M%+CT608(_^#'0VPH +MBT/XZ_*)]B$ D @\<8.WM<=S+'1^Q$ P4(BT8$B4?PBT8(B4?TQT?X +M (M%!(E'_(M&%(D'C7?L@\4(N/00" C_X,=#;!@ "+0_CK\HGV 0 ! +M !8 "-1? [0U1R(<=%^/00" B)=?R+1 at B)1?2+=@3'1?"@SP4(@^T0BP;_ +MX(M#^.OYD) H (@, P $ !$ P"-1>P[0U1R%KX! +MQT7\U- %"(/M!+A at W0<(_^"^A&0)"(M#_.OTZ=/___^-=@!,# , "0 +M P"#QP@[>UQW-<='_%02!0B)-\=% !AG"0B-1_R)1?S'1?CL7PD(QT7TM&0) +M",=%\*1D"0B#[1"XR.H$"/_ at QT-L" ,=#(/X "X+-D'".OIB?;L"P, +M "0 P"#QQ@[>UQW-L='[$0#!0B)=_#'1_3T9 at D(QT?X ,='_ +M #'!P$ "-=^S'10!TT 4(N-3>!PC_X,=#;!@ #'0R#^ N"S9!PCK +MZ9"0"P, "P # 1 $ C47X.T-4-=_B#Q0B+10#_X,=#;" #'0R#_ N"S9!PCKZ8UV +M $ D BT8$B47\QT4 M-$%"(/M!.G?@ C78 0@ "0 ")=0B+ +M=03'1000T at 4(@\4$_R:)]B, D @\<8.WM<=S?'1^Q$ P4(B7?PBT4, +MB4?TQT?X ,='_ "+102)!XUW[,=%!##2!0B#Q02XU-X'"/_ at QT-L +M& ,=#(/X "X+-D'".OI @ "0 "+1 at 2)10"+=@3'1?Q,T at 4(@^T$ +MZ: * @ "@, " !@ P"-1? [0U1R1(/'##M[7'<\QT?X//T'"(/L#%;H +MU/$! (/$$(U'^(E&!,<&6/P'",=%^/00" B)1?R^K&T)",=%]&C3!0B#[0R+ +M!O_ at QT-L# (M#^.OR(0 "0 "#QP@[>UQW'(M%! M&!,='_. %!0B) +M!XUW_(/%"+CT$ @(_^#'0VP( BT/XZ_)D"0, "0 0"+1 at 2)10"^ +M,&D)",=%_"S3!0B#[03_)I!$"0, %@ ' 1 '\ C47T.T-4UQW(\='],@*!@B+10R)1_B+112)1_R+102)!XUW](/%&(M% /_ at QT-L$ +M ,=#(/X "X+-D'".OI- 8# $4! D $ @\<,.WM<=S#'1_@\U at 4(BT4, +MB4?\BT4$B0>+=03'0P2(7 D(C4?XB4,(QT4 :-8%"+B\WP<(_^#'0VP, +MN*S2!PCK\(GVX 4# @ D $ @\<@.WM<=TK'1^34U04(BT4 at B4?HBT4< +MB4?LBT44B4?PBT40B4?TBT4,B4?XBT4(B4?\BT4$B0>)=2"-1^2)0P3'10RT +MU at 4(@\4,N"#V!PC_X,=#;" #'0R#^ N"S9!PCKZ9!L!0, !P "0 +M 0")=0#'1?P(UP4(@^T$Z=X< @")]DP% P % ) ! (M&!(E% (M&"(E% +M_+XH8 D(QT7X?-<%"(/M".D8!P( ( 4# 4 D $ QT4 G-<%"/\FC78 +M_ 0# 4 D D QT7\]&8)"(M%%(E%^,=% ,C7!0B#[0CI//G__]0$ P ' +M ) ) (/''#M[7'=$QT?HY-0%"(M%'(E'[(M%&(E'\(M%$(E'](M%#(E' +M^(M%"(E'_(M%!(D'B74,C4?HB4,$QT4(X-<%"(/%"+@@]@<(_^#'0VP< +MQT, at _@ + at LV0<(Z^F-=@!D! , !@ "0 "0")=0#'1?P(V 4(@^T$Z>(; +M @")]D0$ P $ ) ) (M&!(E% (M&"(E%_+XH8 D(QT7X>-@%"(/M".D< +M!@( & 0# 0 D D QT4 F-@%"/\FC78 9/O__P #T P, ! 0 +M + D C47<.T-4@@8 D( +MBT8$B47DQT7LQ-@%"(/M'+ at XT04(_^"+0_SK^9 0 $ ! +M0 $ ", P, ! "4 "P"#QQ0[>UQW*\='\.C8!0B+11")1_2+10R) +M1_B+10B)1_R+102)!XUW\(/%%+CT$ @(_^#'0VP4 BT/XZ_*0BT40B44 +MBT4$B440BT4,B44$B74,O@!E"0B#[03I[E8" (GV' ,# 4 2 L C47@ +M.T-4#[ 1J ?]U /]V!.C0B $ @\00 +MQT?\X 4%"(D'C7?\@\4$BT4 _^#'0VP( BT/\Z_*0$ +M 0 "4 "+=03'100 Z5T_ @"0BW4$QT4$ 0 .E-/P( D"$ D +M @\<(.WM<=R#'1_Q-1_R)102+=@C'10"LV at 4(BP;_X,=# +M; @ "+0_CK\@$ D BU4$BT8$B44$B=;'10#4V at 4(_R8" %0 +M (U%\#M#5'(AQT7X]! ("(EU_(M&"(E%](MV!,=%\!#;!0B#[1"+!O_ at BT/X +MZ_F)]G@! P!& ) ) (MV!.FX_O__9 $# $8 D D QT4 :-L%"/\F +MC78 % @ 0 $# < E L @\4 at Z40# "+=0R#Q1SI!38" +M )"+=03'101\VP4(Z?4U @"0$ $# < D L QT4 H-L%"/\FC78 ^ # +M $8 D D BW8$Z3C^___D , 1@ "0 "0#'10#HVP4(_R:-=@ 4 +M" # , !P "4 "P"#Q2#IQ ( (MU#(/%'.F%-0( D(MU!,=% +M!/S;!0CI=34" ) 8 'P P ' )0!9 (M%"(E%_,=% -#;!0B# +M[03I'VL (UV (MV!,=% "#!0B#[03_)I"0D P +M%/X" 0 $0 ! +[T9 D(Z>[R 0")]NGO____D)"0 " !@ "- +M1?0[0U1R0H/'##M[7' 0" @%]! ("/_@ 0 ! !, "-1?0[0U1R +M&L=%^/00" B)=?R+=@3'1?3 at WP4(B<6+!O_ at BT/XZ_F0!@ "0 "#QRP[ +M>UQW3L='V%02!0B+102)1]S'1^"$ @4(BT44B4?DBT48B4?HBT40B4?LBT4, +MB4?PBT4(B4?TB7?XC4?8B4?\QP=07 D(C7?@@\4L:B?;D____ .#[ @ +M $ @ X 0"-1?@[0U1R%HM&!(E%_(M&"(E%^(/M"+A<^@4(_^"+0_SK +M^9!# ) (/'##M[7'<=QT?X/ 0%"(M%!(E'_(M%#(D'C7?X@\40BT4 +M_^#'0VP, QT, at _@ + at LV0<(Z^F)]FS[ @!# ) ! (/'##M[7'

    [0U1R0X/'&#M[7'<[BT4,B<(K50AU +M0L='[$0#!0B+102)1_"+112)1_3'1_@ QT?\ (M%$(D'C7?L@\48 +MBT4 _^#'0VP8 O at QE"0B+0_SK[<='[. %!0B)5_#'1_0UQW.L='^#S] +M!PB#[ Q6Z%C? 0"#Q!"-1_B)1 at 3'!EC\!PC'1?CT$ @(B47\QT7T*-T("(/M +M#+C K00(_^#'0VP, BT/XZ_*0D(CW @ 5 4 !$ 0"#QRP[>UQW +M7<='V##F!0B+102)1]S'1^1DY at 4(C4?8B4?HQT?P=.<%"(M%!(E'](M%#(E' +M^(M%$(E'_(M%"(D'C4?DB440C4?PB44,BT4 B44(QT4$"&4)"+Y@:@D(N PM +M" C_X,=#;"P "^:&4)"(M#_.OMB?8! $ $P (U%]#M#5'(:QT7X]! ( +M"(EU_(M&!(E%](/M#+AL[ 4(_^"+0_CK^9#4]@( 0 ! !, 0"-1? [0U1R +M'\=%^/00" B)=?R+1 at 2)1?2^1&L)"(/M$+ at D' @(_^"+0_CK^>L:B?;D____ +M $ 0 # L "#QP@[>UQW+(M&!(/ "(/L!/]V$ -&#%#_ +M=@CHD+#^_X/$$,='_. %!0B)!XUW_(M% /_ at QT-L" (M#_.ORPP "0 +M "#QQ0[>UQW*\='\*SF!0B+102)1_2+10R)1_B+10B)1_R+1 at 2)!XUW\(/% +M$+CT$ @(_^#'0VP4 BT/XZ_*0 at P "0 "+50B+1 at 2)10B)UL=% /3F +M!0C_)@, D BU4,BT8$B44,B=;'10 \YP4(_R8$ $@ (U%Z#M# +M5'(MQT7X]! ("(EU_(M&$(E%[(M&#(E%\(M&"(E%](MV!,=%Z%CG!0B#[1B+ +M!O_ at BT/XZ_F0D @ 8 C47T.T-4UQW.L='^#S]!PB#[ Q6 +MZ.C< 0"#Q!"-1_B)1 at 3'!EC\!PC'1?CT$ @(B47\QT7T/-T("(/M#+C K00( +M_^#'0VP, BT/XZ_*0D##U @ 5 4 !$ 0"#QRP[>UQW7<='V*#H +M!0B+102)1]S'1^34Z 4(C4?8B4?HQT?PY.D%"(M%!(E'](M%#(E'^(M%$(E' +M_(M%"(D'C4?DB440C4?PB44,BT4 B44(QT4$"&4)"+Y@:@D(N PM" C_X,=# +M;"P "^@&4)"(M#_.OMB?8! $ $P (U%]#M#5'(:QT7X]! ("(EU_(M& +M!(E%](/M#+AL[ 4(_^"+0_CK^9!\] ( 0 ! !, 0"-1? [0U1R'\=%^/00 +M" B)=?R+1 at 2)1?2^]&H)"(/M$+ at D' @(_^"+0_CK^>L:B?;D____ +M $ 0 # L "#QP@[>UQW+(M&!(/ "(/L!/]V$ -&#%#_=@CH<*G^ +M_X/$$,='_. %!0B)!XUW_(M% /_ at QT-L" (M#_.ORPP "0 "#QQ0[ +M>UQW*\='\!SI!0B+102)1_2+10R)1_B+10B)1_R+1 at 2)!XUW\(/%$+CT$ @( +M_^#'0VP4 BT/XZ_*0 at P "0 "+50B+1 at 2)10B)UL=% &3I!0C_)@, +M D BU4,BT8$B44,B=;'10"LZ04(_R8$ $@ (U%Z#M#5'(MQT7X +M]! ("(EU_(M&$(E%[(M&#(E%\(M&"(E%](MV!,=%Z,CI!0B#[1B+!O_ at BT/X +MZ_F0D!, P $0 (U%]#M#5'(.BW4 QT4 J.H%"(L&_^"^B&4)"(M# +M_.OT "0 "#QQ@[>UQW+,='[#@%!0B)=_"+10")1_2+102)1_B+10B) +M1_R+10R)!XUW[(/%%(M% /_ at QT-L& ,=#(/X 2X+-D'".OIC78 @ +M "0 "+102)10"+10B)102+1A2)1?R+1A")1?B+1 at B)1?3'10A4Z at 4(@^T, +MZ0<' "0D)!P\@( " !@ P"-1? [0U1R1(/'##M[7'<\QT?X//T'"(/L +M#%;HO-D! (/$$(U'^(E&!,<&6/P'",=%^/00" B)1?R^8&D)",=%](#K!0B# +M[0R+!O_ at QT-L# (M#^.OR(0 "0 "#QP@[>UQW'(M%! M&!,='_. % +M!0B)!XUW_(/%"+CT$ @(_^#'0VP( BT/XZ_+8\0( "0 0"+1 at 2) +M10"^2&D)",=%_$3K!0B#[03_)I ( & (U%^#M#5')+@\<4.WM<=T/' +M1_ \_0<(@^P,5N@ V0$ @\00C4?PB48$QP98_ <(QT7X]! ("(E%_,='_!RK +M! C'!P @ "-=_R#[0BX]! ("/_ at QT-L% (M#^.ORD @ 8 C47T +M.T-4UQW.L='^#S]!PB#[ Q6Z)C8 0"#Q!"-1_B)1 at 3'!EC\!PC' +M1?CT$ @(B47\QT7T7-T("(/M#+C K00(_^#'0VP, BT/XZ_*0D 0 0 +M $0 (MU ,=% (#L!0C_)@ D @\<(.WM<=Q?'1_S@!04(BT8$ +MB0>-=_R#Q02+10#_X,=#; @ "+0_CK\I"P\ ( ! " 1 , C47@ +M.T-4<@Z+=0#'10 4[@4(BP;_X+[,90D(BT/\Z_2$\ ( @ "0 0"+10B) +M< 2+102)10B#Q0CI2 $ &3P @#H!@ ) # ,=%%"!@"0B+50R+10B)10R) +M50B+51"+102)11")502+1 at 2)10#'11CH[ 4(Z>_U__^-=@ 8 !SP +M @#H )0 # (M5((M%%(E"!(M%'(E%((/%(.G= D(MU&,=% CM!0C_ +M)NSO @ # ) # (M&%(E%\(M&$(E%](M&#(E%^(M&!(E%_(EU (MV",=% +M[%#M!0B#[13_)HGVM.\" (, D , BT8$BU $B44,B=;'10" [04(_R8, +M # P , # !\[P( P "4 P"+=0B#Q1#_90"- +M=@"+=0S'10"X[04(_R98[P( "0 P"+1 at 2)1?B)=?R+1AB)10"+=@C' +M1?3P[04(@^T,_R:0D##O @ $ ( !$ P"-1=@[0U1R#HMU ,=% '3Q +M!0B+!O_ at OM1E"0B+0_SK] D @\<(.WM<=QG'1_S@!04(BT8$B0>- +M=_R#Q02X]! ("/_ at QT-L" (M#^.ORC78 0 ! !, "-1?0[0U1R&L=% +M^/00" B)=?R+=@3'1?1L[@4(B<6+!O_ at BT/XZ_F0!0 "0 "#QR0[>UQW +M0L='X(0"!0C'1^1<;@D(QT?H\&8)"(M%%(E'[(M%$(E'\(M%#(E'](EW^(M% +M"(E'_(M%!(D'C7?@@\48N/00" C_X,=#;"0 "+0_CK\HGV!@ !( "- +M1> [0U1R.<=%^/00" B)=?R+1AB)1>2+1A2)1>B+1A")1>R+1 at R)1?"+1 at B) +M1?2+=@3'1>#4[@4(@^T at BP;_X(M#^.OYB?8'! ) (/''#M[7'=#@^P, +M_W8$Z,YV 0"#Q!#'1^@T[P4(BT44B4?LBT40B4?PBT4,B4?TBT4(B4?XBT4< +MB4?\BT4$B0>-=^B#Q2"+10#_X,=#;!P "+0_CK\I '! ) (M&!,= +M!"A@"0B+11R)=1R)QL=% (3O!0C_)I ' ) (MU&,=% .3O!0C_)NM6 +MB?8 ) (/'"#M[7'<4QT?\X 4%"(DWC7?\@\4$BT4 _^#'0VP( +MQT, at _P + at LV0<(Z^F-=@"H____ $ ! T "-1?@[ +M0U1R%XM&!(E%^,=%_"#P!0B#[0BX:"D%"/_ at BT/\Z_D ) (/'"#M[ +M7'<9QT?\;/ %"(M&!(D'C7?\@\4$N/00" C_X,=#; @ "+0_CK\HUV $ +M 0 3 C47T.T-4UQW2,=' +M^*3N!0B+1 at 2)1_R-1_B)10"+1AR)1?R+1AB)1?B+1 at R)1?2+1A")1?"+1A2) +M1>R+1B")1>B+=B#'1>0<\04(@^TUQW'L='_' Q!0B+1 at 2) +M!XUW_(/%!*'@$ @(!?00" C_X,=#; @ "+0_CK\HGV@\<(.WM<=Q['1_QP +M,04(BT8$B0>-=_R#Q02AX! (" 7T$ @(_^#'0VP( BT/XZ_*)]A +M $ E BW4$QT4$3/(%"(/%!/\FD(/%"/\FC78 @ !4 +M "-1? [0U1R(<=%^/00" B)=?R+1 at 2)1?2+=@C'1?#(\@4(@^T0BP;_X(M# +M^.OYD)!4Z@( % % 1 < @\<(.WM<=QG'1_P$]@4(BT4,B0>-1_R) +M10RXU/<%"/_ at QT-L" +[@90D(BT/\Z^V)]NF; 0 C78 "0 "# +MQQ@[>UQW,L='[$0#!0B+1 at 2)1_#'1_0 at 8 D(BT8,B4?XBT80B4?\BT84B0>- +M=^R#Q02X]! ("/_ at QT-L& (M#^.ORB?8! $ $P (U%]#M#5'(:QT7X +M]! ("(EU_(MV!,=%]&SS!0B)Q8L&_^"+0_CK^9!$ ) (/'##M[7'<@ +MQT?XO/,%"(EW_(M5!(U'^(E"!(MU#(/%#+ at P'@@(_^#'0VP, QT, at _@ +M + at LV0<(Z^F-=@ T $3I @#) 0 )0 ! (M5#(M%"(E%#(E5"(M% +M$(E%!,=%$/1F"0B+112)10"+11R)1?S'113L\P4(@^T$Z1"Y "+11B+502) +M4 2+=2"#Q2#IJ"D" /#H @ $ ) ! (EU\(M&%(E%](M&$(E%^(M&#(E% +M_(M&!(E% (MV",=%[$#T!0B#[13_)HGVN.@" , D $ BT8$BU $B44 +MB=;'1?R4] 4(@^T$_R:08/[__P "(Z ( ! 0 + $ C474.T-4 +M-=_"#Q12+10#_X,=#;!0 "+0_CK\HUV (MU +M$(M%#(E%$(/%#.E?)@( C78 J.<" $ D < BT8$B47XBT88B47\B74 +MBW8(QT7T4/4%"(/M#/\FB?9XYP( ! ! $ , < C47P.T-4____^0D) 4 4 !$ +M "#QQ0[>UQW*\='\/#Y!0B+10B)1_2+10R)1_B+10")1_R+102)!XUW\(/% +M$+ at DS@<(_^#'0VP4 OB!F"0B+0_SK[>G3 0 C78 P !( "-1>P[ +M0U1R)L=%^/00" B)=?R+1 at R)1?2+1 at B)1?"+1 at 2)1>R#[12X+.H%"/_ at BT/X +MZ_F0 at P "0 "+!F:#>/X*=3J#QQ@[>UQW/\='["CX!0B+1 at 2)1_"+10B) +M1_2+102)1_C'1_RH @4(C4?LB0>-=_R#Q1"XY-$'"/_ at B74,@\4,N&P%!0CK +M\<=#;!@ "+0_CKY0, D BW4,QT4 9/@%"/\F! " 0 + +MC47T.T-4UQW1<='Y.#X!0B+102) +M1^B)=^R+10R)1_"+10B)1_3'1_BD"@@(BT40B4?\B3>)=1"-=_B-1^2)0P3' +M10 P^04(N'C0!PC_X,=#;" #'0R#^ N"S9!PCKZ8GV P "0 "+ +M1 at 2)10"+=@3'1?Q4^04(@^T$Z>#Z 0 H_O__ $ ! L +M "-1>P[0U1R(XM&$(E%](M&#(E%^(M&"(E%_(MV!,=%\,#Y!0B#[1"+!O_@ +MBT/\Z_D, %SC @ $ !$ 0"^9&X)".FBUP$ B?;I[___ +M_Y"0D#SC @ + , !$ !P"-1?@[0U1R%(MU!,=%_(3\!0B#[02XN/0' +M"/_ at OCAF"0B+0_SK](GV#.," $ 0 3 $ C47P.T-4UQW)\='^,CZ!0B+102)1_R+=0B- +M1_B)0P3'10CX^@4(@\4(N"#V!PC_X,=#; P #'0R#^ N"S9!PCKZ3CB +M @ # ) % (M%!(E% ,=%!!#[!0CITO+__XGV&.(" $ 0 3 $ C47T +M.T-4- '"/_ at QT-L# (M#^.ORC78 -.$" ( D < +MB74 BW8(QT7\X/L%"(/M!/\FB?84X0( @ "0 !P#'10!D_ 4(_R:0D) 4 +M 4 !$ "#QQ0[>UQW*\='\,S^!0B+10B)1_2+10R)1_B+10")1_R+ +M102)!XUW\(/%$+ at DS@<(_^#'0VP4 OD!F"0B+0_SK[>GG 0 C78 P +M !( "-1>P[0U1R)L=%^/00" B)=?R+1 at R)1?2+1 at B)1?"+1 at 2)1>R#[12X +M+.H%"/_ at BT/XZ_F0 at P "0 "+!F:#>/X*=3J#QQ@[>UQW/\='[/#\!0B+ +M1 at 2)1_"+10B)1_2+102)1_C'1_RH @4(C4?LB0>-=_R#Q1"XY-$'"/_ at B74, +M@\4,N&P%!0CK\<=#;!@ "+0_CKY0, D BW4,QT4 +/T%"/\F! " +M 0 + C47T.T-4UQW0L='Y*C]!0B+102)1^B)=^R+10R)1_"+ +M10B)1_3'1_BD"@@(BT40B4?\B3>-=_B-1^2)0P3'10 @_ at 4(N'C0!PC_X,=# +M;" #'0R#^ N"S9!PCKZ9 # ) (M&!(E% (MV!,=%_#3^!0B# +M[03I!/8! !3^__\ 0 $ "P (U%[#M#5'(CBT80B47T +MBT8,B47XBT8(B47\BW8$QT7PG/X%"(/M$(L&_^"+0_SK^0 @ 8 C47T +M.T-4UQW.L='^#S]!PB#[ Q6Z)S% 0"#Q!"-1_B)1 at 3'!EC\!PC' +M1?CT$ @(B47\QT7TI-T("(/M#+C K00(_^#'0VP, BT/XZ_*0D @ 8 +M C47T.T-4UQW.L='^#S]!PB#[ Q6Z#S% 0"#Q!"-1_B)1 at 3' +M!EC\!PC'1?CT$ @(B47\QT7TN-T("(/M#+C K00(_^#'0VP, BT/XZ_*0 +MD(,]>(8)" !T!H/%!/]E_,<%>(8)" $ "#[03'10 @,P4(@^T$QT4 H#,% +M"(/M!,=% (!&!@B#[03'10 P,04(@^T$QT4 ="\%"(/M!,=% Q4!@B#[03' +M10#L3P4(@^T$QT4 Y*H$"(/M!,=% %0#!0B#[03'10 L]@4(@^T$QT4 J!$% +M"(/M!,=% (P/!0B#[03'10 D$P4(@^T$QT4 Q @%"(/M!,=% #2P! CI5?__ +M_[B\_P4(_^"0.-T" 0 @ $0 ! (U%]#M#5'(.BW4 QT4 O (&"(L& +M_^"^=&8)"(M#_.OT(@ "0 "#QR0[>UQW0L='X$0#!0B)=^3'1^@@8 D( +MQT?L ,='\ "+102)1_3'1_B-=_B#Q0R+ +M10#_X,=#;"0 #'0R#^ N"S9!PCKZ9 ! ) (M&!(E% (MV!,=% +M_+ !@B#[03I,-P! $ D @\<8.WM<=S3'1^Q$ P4(BT4$B4?PQT?T +M(& )",='^ #'1_P BT8$B0>-=^R#Q0BX]! ("/_ at QT-L& (M# +M^.OR @ !4 "-1>P[0U1R)\=%^/00" B)=?R+1 at B)1?2+1 at 2)1>S'1? X +M 08(@^T4N)0+!@C_X(M#^.OY$ P "4 #'10 at 8 08( +M@\4$Z;4) "0@\<8.WM<=SF+50B+1 at B)0 at 3'1^R( 08(BT4$B4?PBT8$B4?T +MQT?XG*D$"(M%#(E'_(U'[(D'C7?X@\40BT4 _^#'0VP8 BT/XZ_*-=@ # +M ) (M&!(M !(MU!(E%!,=% - !!@C_)HUV ( D BT8$BT $ +MB44 BU4$BT8$B44$B=;'1?PX @8(@^T$_R8, # PVP( @ +M "4 0"^?&8)"(/%#/]E )"+10B)=0B)QL=% %@"!@C_)HUV 3; @ +M) ! (M&&(E%_(M&'(E% (MV%,=%^) "!@B#[0C_)I#P[0U1R*L=%_%A<"0C'1?A<7 D(BT8(B47TBT8,B47PBT8$B47L@^T4N'RS +M!@C_X(M#_.OYD D OHA<"0B#Q03_90"0V-D" 0 @ ! ( "P ! +M (U%[#M#5'(JQT7\7%P)",=%^%A<"0B+1 at R)1?2+1 at B)1?"+1 at 2)1>R#[12X +M?+,&"/_ at BT/\Z_F0G-D" ,8& D $ BT40B448B744BT4$B440@\40Z9G^ +M__^0;-D" (8& D \ @\<0.WM<=U"+30B+51B+1 at 2(1!$(@WX$"G5)BU48 +M0L=']/0#!@B+10B)1_B+112)1_R)%XU'](E%_(M%!(E%^,=%])QF"0C'10 X +M! 8(@^T,N(C*!0C_X,=#;! "+0_CK\HM5&$*+11")1?R)UH/M!(/O$+C, +M!08(Z]F-=@!0 -C8 @"&!P )0 / (/'$#M[7'<\QT?TF ,&"(M% +M"(E'^(M%&(E'_(M%%(D'C4?TB444BT4$B440QT4,G&8)",=%&-@#!@B#Q0RX +MB,H%"/_ at QT-L$ (M#^.ORBT8(B440BW8$QT4 7 0&"/\FB?9HV ( ! " +M $ @ + $ C47L.T-4UQW$CMU& ^4P ^VP(7 ="&# +M^ %T,\=#;! #'103,!08(QT, at _P ;@LV0<(_^")=1R+=0#'103P! 8( +M@\4$@^\0BP;KY\=']&0%!@B+10R)1_B)=_R+11B)!XU'](E%^(M%"(E%],=% +M\)QF"0C'1?RH!08(@^T0N(C*!0CKKI"0 " !@ "-1?0[0U1R0H/'##M[ +M7'-1_2)112+ +M102)11#'10R<9 at D(QT48M <&"(/%#+B(R at 4(_^#'0VP0 BT/XZ_*+1 at B) +M11"+=@3'10#,!P8(_R:)]H#5 @ $ ( 0 " L 0"-1>P[0U1R*L=%_%Q< +M"0C'1?A87 D(BT8(B47TBT8,B47PBT8$B47L@^T4N'RS!@C_X(M#_.OYD$35 +M @!('P ) ! (M%!(E%((EU'(M%#(E%&(/%&.GQ_?__D!35 @"&!P ) / +M (/'$#M[7'<2.W48#Y3 #[; A @&"(M%#(E' +M^(EW_(M%&(D'C4?TB47XBT4(B47TQT7PG&8)",=%_+P(!@B#[1"XB,H%".NN +MD)",U ( "P # 1 , C47T.T-4#QPP[>UQW/\='^#S]!PB# +M[ Q6Z'2W 0"#Q!"-1_B)1 at 3'!EC\!PC'1?CT$ @(B47\QT7T(' )"+Z at 7 D( +M@^T0N"0<" C_X,=#; P "+0_CK\I + ( !$ "#QQ [>UQW),=' +M]-P*" B+10")1_B+102)1_R-1_2)!XG&@\4$N)#,!PC_X,=#;! "^1&<) +M"(M#_.OMC78 ! ! 1 @\<,.WM<=R+'1_C,J00(BT4 B4?\C4?X +MB0>)QH/%!(M% (M [ -% /_ at QT-L# +Y(9PD(BT/\Z^V0"P " 1 +M C47P.T-4<@Z+=0#'10"8$ 8(BP;_X+Y,9PD(BT/\Z_3$ 0 ) (/' +M&#M[7'+10B)10R-1_B)10B#Q0BX* X&"/_ at QT-L# ,=# +M(/\ &X+-D'".OIB?9D A )0 (/'"#M[7'UQW(,='^'P*!0B+10")1_R)-XUW^(/% +M"(M% (M [ -% /_ at QT-L# ,=#(/\ &X+-D'".OIC78 % +M 0P "4 "+=@3'10BL#P8(@\4(Z3K0 0")]HM%!(E#!(M&"(E#"(M& +M!(E##(MU",=%#/@/!@B#Q0SI;-(! !0 $ E BU4$ +MBT8$B44$B=;'10 H#P8(_R:+1 at 2)1?R+1 at B)10"+102)=02)QL=%^$P0!@B# +M[0C_)@L @ $0 (U%]#M#5'(.BW4 QT4 3!,&"(L&_^"^4&<)"(M# +M_.OT(0 "0 "#QQ [>UQW)\=']&P/!0B)=_C'1_QL#P4(BT4$B0>-1_2) +M102-=_R#Q02+103_X,=#;! "X]-,'".OPC78 8@ "0 "+102)10"+ +M10B)1?R)=0C'100 $08(@^T$Z4I- ")]D( D @\<,.WM<=R7'1_A\ +M"@4(BT4 B4?\B3>+10B)10R-1_B)10B#Q0BXV! &"/_ at QT-L# ,=#(/\ +M &X+-D'".OIB?8D A )0 (M&!(E% (M&!(E%^(M% +M!(E%],=%_$@1!@B#[0SI^TL (UV (EU (MU!,=%_' 1!@B#[03IE\X! (UV +M $ D @\<,.WM<=Q_'1_A\"@4(BT4 B4?\B3>-1_B)102#Q02XV! & +M"/_ at QT-L# ,=#(/\ &X+-D'".OI 0 "0 "#QPP[>UQW)<='^'P* +M!0B+10")1_R)-XM%"(E%!(U'^(E%"(/%!+C8$ 8(_^#'0VP, QT, at _P +M ;@LV0<(Z^F)]@ D @\<8.WM<=S/'1^Q\"@4(BT4(B4?PBT4 B4?T +MQT?X? H%"(M%!(E'_(DWC4?LB44,C7?X@\4,BT4$_^#'0VP8 QT, at _P ! +M K at LV0<(Z^D4 !# )0 (MV!,=%"% 2!@B#Q0CIALT! +M (GVBT4$B4,$BT8(B4,(BT8$B4,,BW4(QT4,G!(&"(/%#.DXUP$ , +M 0 "4 "+1 at 0] @'43O@ (#'10 ,$@8(N)C@!PC_X(MU +M!(E%!,=% , at 1!@B+!NOMB?:+1 at 2)1?R+1 at B)10"+102)=02)QL=%^ 3!@B# +M[0C_)@ @ 8 C47P.T-4UQW0<='^#S]!PB#[ Q6Z/RP 0"# +MQ!"-1_B)1 at 3'!EC\!PC'1?CT$ @(B47\QT7TD&<)",=%\%QG"0B#[1"X* X& +M"/_ at QT-L# (M#^.ORD)"0"P " 1 C47X.T-4<@Z+=0#'10!$ +M%@8(BP;_X+YT9PD(BT/\Z_1" ) (/'##M[7'UQW/HM%!(E$) 29]WX$B40D +M"(M%!)GW?@3'1_1L#P4(B5?XQT?\; \%"(M$) B)!XU'](E%!(UW_(/%!(M% +M!/_ at QT-L$ (M#^.ORB?:)=0"+=03'1?PX% 8(@^T$Z9_+ 0"-=@ ! +M) (/'##M[7'+10B)102-1_B)10B#Q02X$!0&"/_ at QT-L# ,=#(/\ &X+-D' +M".OIB?8 ) (/'&#M[7'-,! # +M $ E BT8$/0 (!U$[X " QT4 !!4&"+B8X <(_^"+=02)103' +M10"0% 8(BP;K[8GVBT8$B47\BT8(B44 BT4$B74$B<;'1?CX%08(@^T(_R8$ +M $ !$ "-1?P[0U1R%XM% (E%_,=% -06!@B#[02X_-4&"/_ at OGAG +M"0B+0_SK](UV D @\<(.WM<=Q3'1_P-=_R#Q02+10#_ +MX,=#; @ "X]-,'".OPD) + ( !$ "-1? [0U1R#HMU ,=% (P9 +M!@B+!O_ at OGQG"0B+0_SK],0! D @\<8.WM<=SC'1^Q\"@4(BT4 B4?P +MB7?TQT?X? H%"(M%"(E'_(M%%(D'C4?LB444C4?XB440@\40N P7!@C_X,=# +M;!@ #'0R#_ !N"S9!PCKZ8UV &( D B74,BW4(QT7\-!<&"(/M +M!.GOR $ C78 0@ "0 "#QPP[>UQW)<='^'P*!0B+10")1_R)-XM%"(E% +M#(U'^(E%"(/%"+@,%P8(_^#'0VP, QT, at _P ;@LV0<(Z^F)]G0 +M "$ E @\<(.WM<=T*+1 at 3W902)P8U" 8/X 7<-BT4$B<(S +M5 at 0QRL'J'X72=2V+100/KT8$QT?\; \%"(D'C7?\@\4(BT4 BT#P T4 _^#' +M0VP( BT/XZ_*+1 at 2)10"+=03'1?R4%P8(@^T$@^\(N)C@!PCKU9")=0"+ +M=03'1?RT%P8(@^T$Z0/( 0"-=@ ! ) (/'##M[7'UQW(,='^'P*!0B+10")1_R)-XUW^(/%"(M% +M (M [ -% /_ at QT-L# ,=#(/\ &X+-D'".OIC78 % +M0P "4 "+=@3'10B@& 8(@\4(Z4;' 0")]HM%!(E#!(M&"(E#"(M&!(E# +M#(MU",=%#.P8!@B#Q0SIN,H! !0 $ E BU4$BT8$ +MB44$B=;'10 ,& 8(_R:+1 at 2)1?R+1 at B)10"+102)=02)QL=%^$ 9!@B#[0C_ +M)@0 0 $0 (MU ,=% . 9!@C_)@ D @\<(.WM<=QW'1_QL +M#P4(BT8$B0>-=_R#Q02+10"+0/ #10#_X,=#; @ "+0_CK\I"0D 0 0 +M $0 (MU ,=% #0:!@C_)@ D BW84Z52R 0"#/8"&"0@ = :# +MQ03_9?S'!8"&"0@! @^T$QT4 Y*H$"(/M!,=% /"O! B#[03'10#$" 4( +M@^T$QT4 "!(%"(/M!,=% (P/!0B#[03'10"<&@8(Z[*0N#P:!@C_X)"#/82& +M"0@ = :#Q03_9?S'!82&"0@! @^T$QT4 Y*H$".ODC78 N)P:!@C_X)! +MPP( "P " 1 $ @'0/___X0!" B-AS3___^)AT3____'ATS___]D' 8(BT4 B8=0____ +MQX=8____) $("(V'-/___XF'7/___\>'9/___[ (B4>8QT>@>!T&"(U'E(E'I,='K,0=!@B)1[#'1[@0'@8(B4>\ +MQT?$^" &"(M%!(E'R(M% (E'S(V'?/___XE'T(U'B(E'U(U'E(E'V(U'H(E' +MW(U'K(E'X(U'N(E'Y,='Z)PB!@B-AT#___^)1^R-ATS___^)1_"-AUC___^) +M1_2-AV3___^)1_B-AW#___^)1_R-1\2)!XUWZ(/%"(M% /_ at QT-LT +Z8 +M9PD(BT/\Z^V-=@ ) ,=% $1H"0B+=B2#[03IRO\! (GV 0 ! !, +M "-1? [0U1R&\=%^/00" B)=?R+=@3'1?1(' 8(@^T,BP;_X(M#^.OY +M "0 #'10#D: D(BW8D@^T$Z7[_ 0")]@$ 0 3 C47P.T-4_@$ B?8! $ $P (U%\#M#5'(;QT7X]! ("(EU_(MV +M!,=%]/0=!@B#[0R+!O_ at BT/XZ_D" ) (M%"(M5!(E5"(E%!(MV$.E( +M @( P !( "-1>P[0U1R)\=%^/00" B)=?R+1 at R)1?"+1 at B)1?2+=@3' +M1>Q '@8(@^T4BP;_X(M#^.OY @ "0 "+=A3I_ $" , 2 C47L +M.T-4!@B#[12+!O_ at BT/XZ_D! ) (M% +M!(E% (MV$(/M!.E; 0( C78 @ !4 "-1>P[0U1R(<=%^/00" B)=?R+ +M1 at B)1?2+=@3'1? P'P8(@^T0BP;_X(M#^.OYB?9D !-A +M)0 (/'(#M[7'=0QT?D7!X&"(M%)(E'Z(M%,(E'[(M%-(E'\,=']*@>!@B+ +M11R)1_B+112)1_R+102)!XU'Y(E%-(M%,(E%+(U'](E%,(MU#(/%++CX( 8( +M_^#'0VP@ BT/XZ_*#QQP[>UQW/L='Z/0>!@B+12B)1^R+11")1_"+102) +M1_3'1_A,'P8(BT4DB4?\BT4PB0>-1^B)102-=_B#Q02X4" &"/_ at QT-L' +M (M#^.ORB?8+80 ) (EU+(M% (E%^(MU',=%_) ?!@B#[0SIN?L! ) 0 +M + 0 )0 (M%*(E%_(MU)(/M!.O"B?:+=2R#Q2SI]:L! +M ) + ) (M%*(E%_(M%$(E%^(MV!,=% ( @!@B#[0SIVO\! (GV"P +M "0 "+=@3'10"D( 8(_R8+ ) (MV",=% ,P@!@C_)A, P ( +M"P (U%S#M#5'(^B77 at BT8@B47DBT8P[0U1R)\=%^/00" B)=?R+1 at R)1?"+1 at B)1?2+ +M=@3'1>Q,(08(@^T4BP;_X(M#^.OY$ !XO ( AP( "4 0"^H&<) +M"(/%'.G?J@$ C78 @\<0.WM<=S3'1_1<(08(BT40B4?XBT4(B4?\BT4+ +M11B)11R)112-1_2)11B+=02#Q12X^" &"/_ at QT-L$ (M#^.OR( +M ,O ( " "4 0"+11")10"+12")1?R+=03'102D(08(@^T(Z6[^ 0") +M]HMU&(/%(.E5J@$ D-2[ @ ( ) ! (M%((E%_(M%$(E%^(MV!,=% ! B +M!@B#[0SI-OX! (GVJ+L" < D $ BT84B44 BW8$QT7\2"(&"(/M!/\F +MC78 @+L" L @ & "P ! (U%V#M#5'(OBT88B47LBT84B47PBT80B47T +MBT8,B47XBT8(B47\BW8$QT7H="(&"(/M&(L&_^"+0_SK^3R[ @ ( & # +M (U%\#M#5')'@\<,.WM<=S_'1_@\_0<(@^P,5NB\H0$ @\00C4?XB48$QP98 +M_ <(QT7X]! ("(E%_,=%](!H"0B^H%P)"(/M$+ at D' @(_^#'0VP, BT/X +MZ_*0V+H" L @ $0 / (U%\#M#5'(>BT4$B47XQT7TY&@)",=%_"PE +M!@B#[0RXT H%"/_ at OK!G"0B+0_SK] $ E BT4$ +MB74$B<:#Q03_902)]@ <+H" ( E $ BT4$B44 BT4(B47\ +MB74(QT4$E",&"(/M!.FVM0 B?8 )0 (EU /]E +M!(GV 0 "4 "+102)=02)QH/%!/]E!(GV +M #\N0( 0P "4 0"+10R)10")=0S'10@() 8(Z4NU "-=@ +M )0 (EU /]E!(GVO+D" , D 4 A?9U%KXD; D(QT4, +M6"0&"(/%"+B0S <(_^"+102)1?R+10B)1?C'10 L) 8(@^T(N(S9!@CKX9 \ +M '"Y @ " )0 % (-^! !U%KXD; D(QT4([",&"(/%!+B0S <( +M_^")=?R+102)1?B)=03'10"X(P8(@^T(N(S9!@CKX8UV (EU (M&!(E#!(MV +M",=#" #'1?QL) 8(@^T$Z5[& 0")]AP _+@" ( E \ +MBT4(B47\BT4$B47XQT4 N"0&"(/M".E1MP D+[T: D(@\4,_R:0D-BX @ +M ( & # (U%\#M#5')'@\<,.WM<=S_'1_@\_0<(@^P,5NA GP$ @\00C4?X +MB48$QP98_ <(QT7X]! ("(E%_,=%](!H"0B^H%P)"(/M$+ at D' @(_^#'0VP, +M BT/XZ_*0! ! 1 @\-=_"#Q02+10#_X,=#;#@ "^(&@)"(M#_.OMB?8 ) ,=% +M '!H"0B+=B2#[03IVO4! (GV "0 "+=@3'10 X)@8(_R8! $ $P +M (U%\#M#5'(;QT7X]! ("(EU_(MV!,=%]%0F!@B#[0R+!O_ at BT/XZ_D +M) ,=% .1H"0B+=B2#[03I>O4! (GV "0 "+=@3'10"8)@8(_R8! +M $ $P (U%\#M#5'(;QT7X]! ("(EU_(MV!,=%]+0F!@B#[0R+!O_ at BT/X +MZ_D" ) (MV$.F<^0$ P !( "-1>P[0U1R)\=%^/00" B)=?R+ +M1 at R)1?"+1 at B)1?2+=@3'1>SX)@8(@^T4BP;_X(M#^.OY! "0 "#QQ [ +M>UQW,<='] @G!@B+10R)1_B+10B)1_R+11")!XM%!(E%$(U'](E%#(MV!(/% +M"+B<( @(_^#'0VP0 BT/XZ_*-=@ $ ) (MV!,=% $0G!@C_)@0 +M D BW8(QT4 E"<&"/\F! ! 0 + C47P.T-4-=_R#Q02+10#_X,=#; @ "X]-,'".OP +MB?8A ) (M%!(E% (M&!(E%_,=%!"PH!@B#[03I:34 )"XM0( 0@ +M "0 0"+1 at 2%P'4/OB1L"0B#Q0BXD,P'"/_ at B44(BW4$QT4$8"@&"(/%!(L& +MZ^J0D("U @ + ( !$ 0"-1?P[0U1R$(MU!,=%_/0H!@B)Q8L&_^"^ +M+&@)"(M#_.OTB?90M0( 0@ "0 0"+1 at 2)10B#Q03IAA( )"0-+4" L +M @ $0 # (U%]#M#5'(>BT4$B47XQT7TY&@)",=%_%@I!@B#[0RXT H% +M"/_ at OC1H"0B+0_SK] @ \+0" ( E , @\4$Z>RL "^)&P) +M"(/%".DCHP$ D)"0T+0" 0 0 $0 ! (U%^#M#5'(>QT7\<&@)"(M% +M (E%^,=% /@I!@B#[0BX3-8&"/_ at OCQH"0B+0_SK] D A?9U$[Y8 +M7 D(@\4$BT4 BT#L T4 _^"^7%P)"(/%!(M% (M \ -% .OKB?8L +M )0 (-^! !U$[Y87 D(@\4$BT4 BT#L T4 _^"^7%P)"(/% +M!(M% (M \ -% .OKBT8$B4,$BW8(QT,( ,=% + at I!@CI-,$! BT @ +M ( & ! (U%\#M#5')'@\<,.WM<=S_'1_@\_0<(@^P,5NA4F@$ @\00C4?X +MB48$QP98_ <(QT7X]! ("(E%_+XD; D(QT7TL"H&"(/M$+B0S <(_^#'0VP, +M BT/XZ_*0 "0 "+=@2#Q03_)I"S @ $ $ !$ #P"#QQ@[ +M>UQW*L='[!0K!@B+10")1_#'1_B\,P8(BT4 B4?\C4?LB0>-=_B#Q02+10#_ +MX,=#;!@ "^>&@)"(M#_.OMD $ 0 3 C47T.T-4"L&"/\FPP "0 "+=@3'10"\*P8( +M_R8! $ $P (U%\#M#5'(=QT7X]! ("(EU_,=%]$1H"0B+=@2)Q;@D' @( +M_^"+0_CK^8GVPP "0 "#QPP[>UQW)L='^.0K!@B+1B2)1_R-1_B)10R+ +M102)10B+=A2#Q02XG" ("/_ at QT-L# (M#^.ORB?;# ) (MV!,=% +M !@L!@C_)L, D BW8$QT4 7"P&"/\F# 0P "4 +M "+=0S'10#0*P8(_R:+=0S'10!P+ 8(_R9G! ) ,=%".1H"0B+10R) +M103'10Q$: D(BT40B44 QT40D"P&".DFR0 B?80 '2Q @ % 0 +M)0 ! +[$<0D(@\44Z9>? 0"-=@"#[0CKKXUV @ 4! E +M @^T(ZY.-=@"+=0R#Q13I99\! ) D ""Q @ ' )0 ! (M% +M"(E% ,=%_$1H"0C'1?A$: D(QT4(["P&"(/M".D!$ D(M%%(E%!(MU&,=% +M"!@M!@CIJ^X! (UV "P T+ " < E $ BT4$B47\BT4(B47X +MQT7T1&@)",=%\.1H"0C'10! +08(@^T0Z:L/ "-=@"+=12#Q1SIR9X! )", +ML ( !0 "0 0")=02+10")1?B)=?3'1?!$: D(QT7LO&@)",=%_) M!@B# +M[13I9P\ (UV %2P @ % ) ! (EU_,=% -0M!@B#[03IHL( (GV-+ " +M 4 D $ @\4$Z]N-=@ !2P @!' )0 # (EU ,=%""PN +M!@CI^?3__Y /"O @ ' )0 # (M%"(E%_(EU^,=% $@N!@B# +M[0CI&-[^_P Q*\" $< E , @\<(.WM<=R^+10CWV,='_&P/ +M!0B)!XEU",=%_'!H"0B-1_R)1?C'10!L+ at 8(@^T(N P7!@C_X,=#; @ "+ +M0_CK\I &RO @ F )0 # (EU (M%"(E%^,=%]$1H"0C'1?R8 +M+ at 8(@^T,Z?WG__^01*\" 4 D $ @\4$Z>C^__\ "2O @!' +M )0 # (EU ,=%"!PO!@CI"?3__Y "O @ ' )0 # (M% +M"(E%_(EU^,=% #@O!@B#[0CI*-W^_P U*X" < E , QT7\ +M<&@)"(M%"(E%^(EU",=% %PO!@B#[0CI9>?__Y *"N @ & +M)0 # (EU (M%"(E%^,=%]$1H"0C'1?R(+P8(@^T,Z3'G__^0>*X" 4 D +M $ @\4$Z1S^__\ %BN @ & )0 # (M%!(E% (EU_,=%!. at O +M!@B#[03I-//__P +*X" 8 E < B77\QT7X['$)",=% 0P +M!@B#[0CI4]S^_XUV _*T" 4 E < B74 BT4$B47XQT7T +M1&@)",=%_# P!@B#[0SIC>;__Y#4K0( !0 "0 0"#Q03I>/W__P +M M*T" ,@ E , BT4$B44(B74$QT4,C# &"(/%!.F0\O__ +M "(K0( 2 "4 P"+10R)1?R)=?C'10"H, 8(@^T(Z;#;_O\ +M %RM @"( )0 # (/'##M[7')=0S' +M1?QP: D(C4?XB47XQT4 U# &"(/M"+@,%P8(_^#'0VP, BT/XZ_*-=@ +M /RL @!' )0 # (EU (M%#(E%^,=%]$1H"0C'1?P ,08(@^T, +MZ8WE__^0U*P" 4 D $ @\4$Z7C\__\ +2L @!' )0 # +M (EU ,=%"(PQ!@CIF?'__Y )"L @ ' )0 # (M%"(E%_(EU +M^,=% *@Q!@B#[0CIN-K^_P 9*P" < E , QT7\<&@)"(M% +M"(E%^(EU",=% ,PQ!@B#[0CI]>3__Y #"L @ & )0 # (EU +M (M%"(E%^,=%]$1H"0C'1?SX,08(@^T,Z<'D__^0? #\JP( !0 +M "4 !P"+5 at 2!^@ (!U'L=%_'!H"0B+102)1?C'10!@, 8(@^T(N P7!@C_ +MX(G0]]#!Z!]T!8/X 70AB54 QT7X<&@)"(M%!(E%],=%_/ N!@B#[0RX#!<& +M".O/B74 QT7X<&@)"(M%!(E%],=%_+PO!@B#[0RX#!<&".NNC78 BT8(]]#! +MZ!]T!8/X 70JBT8$B47\BT8(B44 QT7T<&@)"(M%!(E%\,=%^& Q!@B#[1"X +M#!<&"/_ at B74 QT7X<&@)"(M%!(E%],=%_"PR!@B#[0RX#!<&".O=B?88JP( +M P "0 !P"+1 at 2)10"+1 at B)1?R+=@3'1?A@, at 8(@^T(_R:0\*H" ( D +M < B74$BW4 QT4 1#,&"/\FD-"J @ " ) / (M&"(E%_(M&!(E%^(M% +M"(E%],=% &PS!@B#[0SI6[X (UV )RJ @ $ $ @ X #P"-1=0[0U1R +M'XM&"(E%_(M5 (M&!(E% (G6QT7XB#,&"(/M"(L&_^"+0_SK^0 @ 8 +MC47T.T-4UQW.L='^#S]!PB#[ Q6Z+"0 0"#Q!"-1_B)1 at 3'!EC\ +M!PC'1?CT$ @(B47\QT7T:-X("(/M#+C K00(_^#'0VP, BT/XZ_*0D#"J +M @ + ( !$ 0"-1?P[0U1R$(MU!,=%_. T!@B)Q8L&_^"^D&@)"(M# +M_.OTB?8 ) (/'"#M[7'<4QT?\'*L$"(DWC7?\@\4$BT4 _^#'0VP( +M N/33!PCK\(GV(0 "0 "+102)10"+1 at 2)1?S'102$- 8(@^T$Z=TI +M "0J*D" $( D $ BT8$AP[0U1R$8M%!(7 =12+=0B# +MQ0R+!O_ at OJQH"0B+0_SK](E%^(MU (/M"+B at -08(Z^20 +MY0$ "4 "+101(B440BT44B44,B744@\4,Z:#___\ B +M )0 (M%!(E%^(/M".L)D&, D BU4 B=#!Z!^-! *#X/XYPG4@ +MB=#!ZA\!T-'XB44,B74$B74 QT4(C#4&"+@,%P8(_^"+11")1?B)=1")=?3' +M1?Q at -08(@^T,N P7!@CKX9",J ( "P " 1 , C47T.T-46 0"0D) $ $ !$ +M "+=0"#Q03_)A2H @ 4 0 !$ P"-1?0[0U1R'8M%"(E%^(M%!(E% +M],=%_! Y!@B#[0RX#!<&"/_ at OL1H"0B+0_SK]) -2G @## +M)0 ! (M%!(E%#(EU"(/%".E[[/__C78 "LIP( 0P "4 0"+ +M10R)1?R)=?C'10#$- at 8(@^T(Z0C at __\ ("G @"$ )0 ! (M% +M$(E% (EU$(M%!(E%_,=%!.PV!@B#[03IUM___XGV5*<" (0 D $ A?8/ +MG\ /ML"%P'0%@_@!="2%]G40OHAG"0C'10 8-P8(BP;_X+Y49PD(QT4 &#<& +M"(L&Z^Z^7&<)",=% !@W!@B+!NO>C78 1 #XI@( A "4 0"+ +M1 at 3!Z!]T!8/X 70F at WX$ '40OHAG"0C'10 8-P8(BP;_X+Y<9PD(QT4 &#<& +M"(L&Z^Z^5&<)",=% !@W!@B+!NO>D(M&!(E#!(MV",=#" #'10!$-P8( +MZ72S 0 (2F @!$ )0 ! (EU"(MU#,=% * W!@C_)I!L +M %RF @!$ )0 # (/'"#M[7'<>BU8$@?H " =1^^9&<)",=% !0X +M!@B#[PB+!O_ at QT-L" (M#^.ORB=#WT,'H'W0%@_@!=!Z)T/?8QT?\; \% +M"(D'C7?\QT4 %#@&"+ at 4. 8(Z\;'10 4. 8(@^\(BP;KN(/'##M[7'- +M=_C'10 4. 8(N!0X!@CKV<=% !0X!@B#[PR+!NO+B?8 (2E @#$ +M )0 # (EU#,=% #@X!@C_)G"E @ + ( !$ 0"-1?P[0U1R$(MU +M!,=%_%0Z!@B)Q8L&_^"^S&@)"(M#_.OTB?8 ( %P (U%^#M#5'(O@\<( +M.WM<=R?'1?CT$ @(B77\BT8$F?=^",='_!RK! B)%XUW_(/M"+CT$ @(_^#' +M0VP( BT/XZ_*0 " !< "-1?@[0U1R+X/'"#M[7'-=_R#[0BX]! ("/_ at QT-L" (M#^.ORD"$ +M D @\-0O^+50")502)5?R)10"#[02X&".N^D)"@HP( +M"P " 1 $ C47T.T-4-=_R#Q02X]! ("/_ at QT-L +M" +CTTP<(Z_ ( %P (U%[#M#5'(GQT7X]! ("(EU_(M&"(E%\(M& +M!(E%[,=%]+@[!@B#[12XL%X&"/_ at BT/XZ_D ) (/'"#M[7'<6QT?\ +M'*L$"(DWC7?\@\4$N/00" C_X,=#; @ "X]-,'".OP " !< "-1>P[ +M0U1R)\=%^/00" B)=?R+1 at B)1?"+1 at 2)1>S'1?0H/ 8(@^T4N.1=!@C_X(M# +M^.OY(0 "0 "#QR0[>UQW0\='X.P[!@B+1 at 2)1^2+102)1^C'1^Q#QPP[>UQW/\='^#S]!PB# +M[ Q6Z*2' 0"#Q!"-1_B)1 at 3'!EC\!PC'1?CT$ @(B47\QT7T,'()"+Z at 7 D( +M@^T0N"0<" C_X,=#; P "+0_CK\I 4 0 !$ "-1?P[0U1R#HMU +M ,=% )! !@B+!O_ at O@1I"0B+0_SK] D A?9U$[Y87 D(@\4$BT4 +MBT#L T4 _^"^7%P)"(/%!(M% (M \ -% .OKB?8P A +M)0 (M%!#M&! ^4P ^VP(E$) C!X *+L/C)" B#Q0B+5"0(]]J+10"+1)#P +M T4 _^")]HM&!(E#!(MV"(M%!(E#",=%!(P]!@B#Q03I6JT! (GV "0 +M "%]G43OEA<"0B#Q02+10"+0.P#10#_X+Y<7 D(@\4$BT4 BT#P T4 Z^N) +M]@ D A?9U$[Y87 D(@\4$BT4 BT#L T4 _^"^7%P)"(/%!(M% (M +M\ -% .OKB?8@ !" )0 (M%!(E#!(M&!(E#"(MU",=% +M""0^!@B#Q0CIOJP! (GVBT4$B4,$BT8(B4,(BT8$B4,,BW4(QT4(6#X&"(/% +M".GTK $ % 0 "4 "+502+1 at 2)102)UL=% ,P]!@C_ +M)HM&!(E% (M5!(M&"(E%!(G6QT7\F#X&"(/M!/\FC78 I "0 "+=0C' +M10SP/@8(@\4,_R:00P "0 "%]G4*@^T$N"P_!@C_X+Y<7 D(@\40BT4 +MBT#P T4 Z^N-=@ T !# )0 (M%"#M&! ^4P ^VP(7 +M= 6#^ %T$[Y<7 D(@\40BT4 BT#P T4 _^"#[02X+#\&".OTB?:+1 at 2)0P2+ +M=@B+10B)0PC'10!$/P8(Z:FK 0"00P "0 "%]G4*@^T$N"P_!@C_X+Y< +M7 D(@\40BT4 BT#P T4 Z^N-=@!# ) (7V=0J#[02X+#\&"/_ at OEQ< +M"0B#Q1"+10"+0/ #10#KZXUV " (0 E BT4$B4,$ +MBT8$B4,(BW4,QT4$U#\&"(/%!.D>JP$ B?:+102)0P2+1 at B)0PB+1 at 2)0PR+ +M=0S'100 0 8(@\4$Z52K 0 4 # )0 (M5"(M&!(E% +M"(G6QT4 ?#\&"/\FBT8$B44 BU4(BT8(B44(B=;'1?PX0 8(@^T$_R:0D) ) +M ( !$ "#QQ@[>UQW#8M% ,'H'W06 at _@!=!O'0VP8 O at AI"0B+ +M0_S_X(/O&+B(0 at 8(Z_2+10")PO?:B=#!Z!]T!8/X 70TQT?LB$$&"(M%!(E' +M\(E7],='^,RI! C'1_QL<@D(C4?LB0>-=_B#Q0B+10"+0.P#10#KK<='[!Q" +M!@B+102)1_")5_3'1_C,J00(QT?\;'()"(U'[(D'C7?X@\4(BT4 BT#L T4 +MZ7;___^)]@$ 0 6 C47P.T-4 IR(M6!(E5 +M](E%\(/M$+B(0 at 8(_^"+0_CK^9 ! $ %@ (U%\#M#5')+@\<,.WM<=T/' +M1?CT$ @(B77\QT?XP$$&"(M&!(E'_(M&"(D'BTX(N&=F9F;WZ8G0P?@"P?D? +M*<&-1_B)1?2)3?"#[1"XB$(&"/_ at QT-L# (M#^.ORD D @ $0 +M (/'%#M[7'<3 at WT "0^>P ^VP(7 =!:#^ %T7\=#;!0 "^#&D)"(M#_/_@ +MBT4 N at H ")T9GW^8/",,='\+2I! B)5_3'1_C,J00(C4?PB4?\BT4$B0>+ +M30"X9V9F9O?IP?H"P?D?*UQW'8M&!(M5!(L$@L='_#00!0B)!XUW_(/%"(M% /_ at QT-L" +M (M#^.ORC78 0 "0 "+502+1 at 2)102)UL=% 'A$!@C_)H,]D(8)" !T +M!H/%!/]E_,<%D(8)" $ "#[03'10#DJ at 0(@^T$QT4 ,#$%"(/M!,=% %0# +M!0B#[03'10 ,, at 4(Z\:0N,A$!@C_X)"#/92&"0@ = :#Q03_9?S'!92&"0@! +M @^T$QT4 Y*H$"(/M!,=% %P0!0B#[03'10"H$04(@^T$QT4 G+<%"(/M +M!,=% (P/!0B#[03'10 D$P4(@^T$QT4 ,#$%"(/M!,=% /0L!0B#[03'10#0 +M+04(ZY2-=@"X%$4&"/_ at D!"9 @ # $ !$ P"-1?@[0U1R,H/'"#M[ +M7'UQW%L='_. %!0B)-XUW_(/%!+CT$ @(_^#'0VP( QT, at _P +M + at LV0<(Z^F0,)<" 0 @ $0 ' (U%[#M#5'(3OGQI"0C'1?P82 at 8( +M@^T$BP;_X+Y :0D(BT/\Z_2-=@#K5HGV "0 "#QP@[>UQW%,='_. % +M!0B)-XUW_(/%!(M% /_ at QT-L" ,=#(/\ "X+-D'".OIC78 J/___P +M ! @ 0 C47T.T-4+102)1?S'10"$2 8(@^T$N!A1!@C_X+Z4<@D(@\4, +MBT4 Z_'8E0( (@ "0 0"%]G47BT4$B47\QT4 N$@&"(/M!+B at 5 8(_^"^ +ME'()"(/%#(M% .OQI)4" "( D $ A?9U%XM%!(E%_,=% .Q(!@B#[02X +M*%,&"/_ at ONAI"0B#Q0R+10#K\7"5 @ ! ) ! (EU (EU^,=%_"!)!@B# +M[0CI2PD (UV $R5 @ B ) ! (M%!(E% ,=%!%1)!@CIQ at D (GV*)4" +M $ D , @\<,.WM<=SV+102#P C'1_@,2 8(B4?\BU8$B1>)10"-1_B) +M1?C'1?3L:0D(QT7PC&D)",=%_'A)!@B#[1"X-$$%"/_ at QT-L# (M#^.OR +MC78 R)0" $ D , B?"+=02)103'10"8208(_R:-=@"HE ( 0 "0 +M P"+=@3'10#X208(Z8F3 0"0 " !@ "-1?0[0U1R0H/'##M[7'UQW%L='_. % +M!0B)-XUW_(/%!+CT$ @(_^#'0VP( QT, at _P + at LV0<(Z^F0" +M ! 1 O@ ! #_90#I\____Y"0D @ P $0 +M (M5 (M%!(/%"(/L!%!2:@/H7TS^_X/$$(G&_V4 D)"0 " !@ "-1?0[ +M0U1R0H/'##M[7'UQW%L='_. %!0B)-XUW_(/%!+CT$ @(_^#'0VP( QT, at _P +M + at LV0<(Z^F0" ! 1 O@ $ #_90#I\___ +M_Y"0D , @ $0 (M% (/%!"4 \ /0" /E, /MO#_90"0D) +M ( & (U%]#M#5')"@\<,.WM<=SK'1_@\_0<(@^P,5NB4> $ @\00C4?X +MB48$QP98_ <(QT7X]! ("(E%_,=%]&Q,!@B#[0RXP/\&"/_ at QT-L# (M# +M^.ORB?8 ) (/'"#M[7'<6QT?\'*L$"(DWC7?\@\4$N/00" C_X,=# +M; @ #'0R#_ N"S9!PCKZ9 $ $ !$ "+=0#'10# 3 8(_R8 +M ) (-^!/]U$[Y87 D(@\4$BT4 BT#L T4 _^"^7%P)"(/%!(M% (M +M\ -% .OKS)$" L P $0 ? (U%\#M#5'(:BT4$B47XBW4 QT7\6% & +M"(/M#+ at D' @(_^"^D&D)"(M#_.OT "0 "^B%P)"(/%!/]E )#C +M) (M%! M&!(M5"(E5!(E%"(M%#(E% ,=%##!-!@CI/[, (UV %R1 @#C +M ) ! (M&!(E%"+Y@:0D(QT4 1$T&"/\F-)$" ., D 4 B74,OKQR +M"0C'10!T308(_R:-=@ 4D0( XP "0 !0#KWHGV" #\D ( XP +M "4 !0"+=@3KPXUV (M&!(E#!(MV",=% +1-!@CI6YX! (UV -"0 @ C +M) % (5U!'4:BT4,B47\BW4(QT4 S$T&"(/M"+ at D' @(_^"^B%P)"(/%$(M% +M .OQF) " ", D 4 BT8$B47\QT7X 0 ,=% /A-!@B#[0CIO(, '"0 +M @ " ) 5 (M&!(E% +ZL:0D(QT7\,$X&"(/M!/\FD$R0 @ " ) 5 +M ,=% %A.!@C_)HUV #20 @ " ) = (EU_,=%^)AI"0C'1?2,:0D(QT4 +M?$X&"(/M#.F \O[_ZWJ)]@ D @\<(.WM<=Q3'1_S@!04(B3>-=_R# +MQ02+10#_X,=#; @ #'0R#_ N"S9!PCKZ8UV "$ D BT8$B44 +MBT4$B47\QT4$P$X&"(/M!.G9! D(3___\ G(\" 0 $ #0 ! +M (U%]#M#5'(9BT8$B47\OM!R"0C'1?C\3 at 8(@^T(BP;_X(M#_.OYB?;K>HGV +M "0 "#QP@[>UQW%,='_. %!0B)-XUW_(/%!(M% /_ at QT-L" ,=# +M(/\ "X+-D'".OIC78 (0 "0 "+1 at 2)10"+102)1?S'101D3P8(@^T$ +MZ34$ "0A/___P #XC@( ! 0 - $ C47T.T-4-=_S'10"43 at 8(QT7\J!$("(/M!+BH$0@(_^#'0VP( BT/XZ_*0BT8$ +MB4,$BW8(QT4 "% &".F;FP$ D)"0 " !@ "-1?0[0U1R0H/'##M[7'UQW/,='^#S]!PB#[ Q6Z$QS 0"#Q!"- +M1_B)1 at 3'!EC\!PC'1?CT$ @(B47\OF!I"0C'1?2T408(@^T,BP;_X,=#; P +M "+0_CK\@ D @\<(.WM<=QG'1_P-=_R#Q02X]! ( +M"/_ at QT-L" (M#^.ORD)"0 " !@ "-1?0[0U1R0H/'##M[7'UQW%L='_. % +M!0B)-XUW_(/%!+CT$ @(_^#'0VP( QT, at _P + at LV0<(Z^F0" +M ! 1 O@ ( #_90#I\____Y"0D , @ $0 +M (M% (/%!"4 \ /0! /E, /MO#_90"0D) ( $ +M !$ "^ 0 /]E .GS____D)"0 P " 1 BT4 @\4$@^P, +M4.B)0_[_@\00B<;_90"0 P " 1 BT4 @\4$)0#P ] ! ^4 +MP ^V\/]E )"0D , @ $0 (M% (/%!(MP$/]E @ +M 0 $0 +X" _V4 Z?/___^0D) ( & (U%]#M#5')" +M@\<,.WM<=SK'1_@\_0<(@^P,5N at 4<0$ @\00C4?XB48$QP98_ <(QT7X]! ( +M"(E%_,=%]/3>" B#[0RXP*T$"/_ at QT-L# (M#^.ORD) ( , !$ +M "+50"+102#Q0B#[ A04NC)0?[_@\00B<;_90"0 at SV@A at D( '0&@\4$_V7\ +MQP6 at A@D( 0 (/M!,=% '0O!0B#[03'10!L*P4(@^T$QT4 (#,%"(/M!,=% +M * S!0B#[03'10#XJ 0(@^T$QT4 ,#$%"(/M!,=% .2J! B#[03'10",#P4( +M@^T$QT4 J!$%"(/M!,=% %0#!0CKBI"X#%0&"/_ at D , @ $0 (M% +M (/%!"4 \ /0# /E, /MO#_90"0D) ( $ +M !$ "^ /]E .GS____D)"0* B@( ! 1 $ +MC47\.T-4UQW%,='_%02!0B)-XUW_(/%!(M% /_ at QT-L" +M ,=#(/X "X+-D'".OID)"0B(D" 0 @ $0 / (U%_#M#5'(UQW.L='^#S]!PB#[ Q6Z&1M 0"#Q!"-1_B)1 at 3'!EC\!PC'1?CT$ @( +MB47\QT7T5-\("(/M#+C K00(_^#'0VP, BT/XZ_*0D"@ K(<" +M 0 $0 / (U%\#M#5'(3ON1>"0C'1?SP5P8(@^T$BP;_X+Y$:@D( +MBT/\Z_2-=@#IT____XUV $@ :(<" E \ @\<(.WM<=S'' +M1_Q0!04(BT8(B0?'10#$9 D(C4?\B47\QT7XY%X)",=%] AF"0B#[0RX*/,% +M"/_ at QT-L" (M#^.ORC78 @\<(.WM<=S''1_Q0!04(BT8,B0?'10#$9 D( +MC4?\B47\QT7XY%X)",=%] AF"0B#[0RX*/,%"/_ at QT-L" (M#^.ORD)"0 +M " !@ "-1?0[0U1R0H/'##M[7'?^_Y $ ) (EU (EU^(MU!,=%_(A:!@B#[0SI8,$! L P +M $0 (MU ,=% !Q;!@C_)B$ D @\<(.WM<=QR+100#1 at 2+ ,=' +M_#00!0B)!XUW_(/%"(M% /_ at QT-L" (M#^.OR 0 "0 "+502+1 at 2) +M102)UL=% .1:!@C_)@0 0 $0 +Y\:@D(@\4$_V4 D 0 0 +M$0 +Y\:@D(@\4$_V4 D @ ! _V4 D @ ) _V4 D L @ +M $0 (/'%#M[7'P ^VP(7 = 6#^ %T5L='X!RK! B+ +M10B)1^3'1^@!@CKW8M% $B9]WT$C7#_@\4(BT4 Z\J-=@!B ) (M%!,'H +M'W0%@_@!=!.+502)T)GW?0B)QH/%#(M% /_@@WT( ^?P ^VP(7 = 6#^ %T +M$XM5!(G0F?=]"(G&@\4,BT4 Z]B+101 F?=]"(UP_X/%#(M% .O%D)"0" " +M 1 BT4 F?=]!(-] /G\ /ML"%P'0%@_@!=%*+10#!Z!]T!8/X +M 70*B=:#Q0B+10#_X(-]! /G\ /ML"%P'0%@_@!= J)UH/%"(M% .OAA=)U +M#;X @\4(BT4 Z]")U at -U!(/%"(M% .O#BT4$P>@?= 6#^ %T6(M% ,'H +M'W0%@_@!= J)UH/%"(M% .N?@WT$ ^?P ^VP(7 = 6#^ %T"HG6@\4(BT4 +MZX*%TG40O@ "#Q0B+10#I;O___XG6 W4$@\4(BT4 Z5[___^%TG40O@ +M "#Q0B+10#I2O___XG6 W4$@\4(BT4 Z3K___^0D) "@ ! (M% (M +M[ -% /_ at D L @ $0 (MU ,=% !1@!@C_)B$ D BT4$.T8$ +M#YS #[; B40D",'@ HNP^,D("(/%"(M4) CWVHM% (M$D/ #10#_X(GV 0 +M "0 "+502+1 at 2)102)UL=% -Q?!@C_)@ * ( BT4 BT#H T4 _^"0 +M"P " 1 BW4 QT4 E& &"/\F(0 "0 "+100[1 at 0/GL /ML") +M1"0(P> "B[#XR0@(@\4(BU0D"/?:BT4 BT20\ -% /_ at B?8! ) (M5 +M!(M&!(E%!(G6QT4 7& &"/\F"P " 1 BW4 QT4 Y& &"/\F(0 +M "0 "+102)10"+1 at 2)103IV[ (UV $ D BU4$BT8$B44$B=;' +M10#(8 8(_R8( 0 /]E ) ( "0 /]E )"$?@( ! " 1 +M < C47X.T-4UQW),='^!P4!PB+102)1_R+1 at 2)!XUW^(/%"*'@$ @(!?00 +M" C_X,=#; P "+0_CK\@( 5 C47P.T-4+=@2-1_B)0P3'10!P8 at 8( +MN S?!PC_X,=#; P "+0_CK\HUV -1\ @ ! ) # (EU +X4:PD(QT7\ +MB&(&"(/M!/\F$ "L? ( 0 "4 P"+=03'101D808(@\4$_R:0 +MQT4 U&(&".E4D0$ C $ " ? ( ! 1 < C47P.T-4P( +M " !@ 0"-1?0[0U1R1(/'##M[7'<\QT?X//T'"(/L#%;HV& ! (/$$(U' +M^(E&!,<&6/P'",=%^/00" B)1?R^!&L)",=%])!G!@B#[0R+!O_ at QT-L# +M (M#^.ORF'L" @ 8 $ C47T.T-4UQW/,='^#S]!PB#[ Q6 +MZ'1@ 0"#Q!"-1_B)1 at 3'!EC\!PC'1?CT$ @(B47\O at 1K"0C'1?2 at 9P8(@^T, +MBP;_X,=#; P "+0_CK\C1[ @ 6 < !$ #P"-1=P[0U1R$[X4:PD( +MQT7\<' &"(/M!(L&_^"^-&L)"(M#_.OTC78 Z6_^__^-=@#I"P$ (UV , +M D @\40_V4 B?;0>@( 0P "0 0"#QR [>UQW@( PP "0 +M 0")=0R^" ,=% .AD!@CI&'@! !1Z @!B ) ! (EU (MU",=%_(1E +M!@B#[03I]W $ $'D" &, D $ @\<0.WM<=S;'1_3@!04(BT4(B4?X +MBU8$C4?TB4($QT?\U&4&"(M%!(D'C7?\QT4(B&8&"(/%"+B,[0<(_^#'0VP0 +M BT/XZ_*)]K!X @ B ) % (M%!(L0BT $B54 B44$ODQT"0C'1?RH +M9 at 8(@^T$_R:0A'@" "( D 4 Z]*)]G1X @ B ) ' (/^_W48QT7\ +M/'0)",=% "QG!@B#[02X\#,%"/_ at N !G!@CK]T1X @ ) ' (U6"(E5 +M_(EU (E5],=%^#QG!@B#[0SI99L ) ) (MV!(/%!/\F "0 +M "+=@B#Q03_)@( 5 C47P.T-4UQW&X/^!'4KBT4( +MB444BW4$@\44@^\,N(1K!@C_X,=#; P #'0R#_ N"S9!PCKZ<='^)RI +M! C'1_Q@= D(BT4(B0>-=_B#Q1B+10#KRXGV)@< "0 "#QQ0[>UQW&8/^ +M_W4PQT4$Z&<&"(/%!(/O%+AL0 at 4(_^#'0VP4 QT4 2&@&",=#(/\ "X +M+-D'".OBQT?PX 4%"(EW],='^)RI! B-1_")1_R+10R)!XUW^(/%'(M% .N[ +MA0, "0 "#[03KCXUV (4# D BT4,0(E$) 2+112)1"0(BT40B40D +M#(M&!(E$)!#'10"T: 8(BT- at B6@TBU-HC4<$B4($@^P,4^BA+ $ @\0$B40D +M(/]T)!QJ /]T)"#_="0 at _W0D(.A.*O[_@\04B40D)/]T)"#H^RP! (/$$(M# +M8(MH- 6, B4-4BT-HBW@$@^\$B<*+0!C!X P# DB)0UR+="08_V4 C78 +MA0, "0 "#[03IV/[__X4# D BT4,0(E$) 2+112)1"0(BT40B40D +M#(M&!(E$)!#'10!H:08(BT- at B6@TBU-HC4<$B4($@^P,4^CM*P$ @\0$B40D +M(/]T)!QJ /]T)"#_="0 at _W0D(.B:*?[_@\04B40D)/]T)"#H1RP! (/$$(M# +M8(MH- 6, B4-4BT-HBW@$@^\$B<*+0!C!X P# DB)0UR+="08_V4 C78 +MA0, "0 "#[03I)/[__X4# D BT4,0(E$) 2+112)1"0(BT40B40D +M#(M&!(E$)!#'10 <:@8(BT- at B6@TBU-HC4<$B4($@^P,4^@Y*P$ @\0$B40D +M(/]T)!QJ /]T)"#_="0 at _W0D(.CF*/[_@\04B40D)/]T)"#HDRL! (/$$(M# +M8(MH- 6, B4-4BT-HBW@$@^\$B<*+0!C!X P# DB)0UR+="08_V4 C78 +M!@< "0 "+11 [1 at 0/E, /ML"%P'0%@_@!=#V+11 [1 at 0/G, /ML"%P'0% +M at _@!=!&+=03'103$: 8(@\4$BP;_X(M&!(E%$(MU!,=%!'AI!@B#Q02+!NOG +MBT8$B440BW4$QT4$+&H&"(/%!(L&Z]"-=@"% P ) (M&"(E% (M5"(M& +M!(E%"(G6QT7\T&H&"(/M!/\FC78 A0, "0 #'10!$:P8(_R:-=@ $ ( +M @ # L "-1> [0U0/@I0 "#QP@[>UP/AX@ "#[ AJ (U$)!Q0Z+$J +M_O^#Q!"+3"00C0R)C0R)N*V+VVCW;"04B00DB50D!,'Z#8E4) R+1"04F8M$ +M) PIT(T,2,='_!RK! B)#XEU\(M&"(E%](M&%(E%^(M&$(E%_(M% (E%Z(M& +M#(E% (M&!(E%Y(U'_(E%X,=%[&QK!@B#[2"X*'0&"/_ at QT-L" (M#_.OR +M 0@ "4 "+10B)10")=0CI.J@ (GV @ "0 "+ +M10B)1?R+1 at B)10B+502+1 at 2)102)UL=% $1L!@B#[03K/9 ( +M " )0 (MU"(/%#/\FBT8(B44(BW8$QT4 7&P&"/\FB?8$ $ 0 +M P "-1?0[0U1R'(EU_(M5 (M&!(E% (G6QT7XE&P&"(/M"(L&_^"+0_SK +M^8UV ( 5 C47T.T-4UQW*<=%^/00" B)=?S'1_R\; 8( +MBT8$B0>+1 at B)1?2-=_R#[0RXO&P&"/_ at QT-L" (M#^.ORC78 D'(" HO +M D $ B74DBT4(B44)=0"-1_B)10R+ +M1 at 2)12"-1_B)1?B+102)1?2+10B)1?#'1>P\:PD(QT7\K&X&"(/M%+B\%@<( +M_^#'0VP, BT/XZ_*-=@ L< ( " ( "0 P"#[ S_=@3H(?P (/$$(EU +M (M5#(M&!(E%#(G6QT7\)&\&"(/M!/\F^&\" < D , @^P,_W8$Z.W[ +M "#Q!")=0"+51"+1 at 2)11")UL=%_*1O!@B#[03_)L1O @ ' ) # (M% +M#(EU#(G&QT4 V&\&"/\FC78 I&\" < D , BW8$QT,$7'0)",=% QP +M!@CIRFX! (GV?&\" 8 D < B74 OB1K"0C'1?PL< 8(@^T$_R9<;P( +M!@ "0 !P"+=@3'0P0<= D(QT4 4' &".F&;@$ D)! ;P( ! " 1 +M < C47X.T-4F' 0"0 0 +M "0 "#QPP[>UQW),='^! 6!PB+102)1_R+1 at 2)!XUW^(/%"*'D$ @(!?00 +M" C_X,=#; P "+0_CK\@( 5 C47P.T-4+=@2-1_B)0P3'10#H<08( +MN S?!PC_X,=#; P "+0_CK\HUV )!M @ ! ) # (EU +X4:PD(QT7\ +M '(&"(/M!/\F$ !H;0( 0 "4 P"+=03'103<< 8(@\4$_R:0 +MQT4 3'(&".G<@0$ * \;0( ! 1 , C47H.T-4UQW=HM5!"M5"(E4) 2+1 at 2)1"04N1^%ZU&) +MT/?IB40D"(E4) R+1"0,P?@$BTPD!,'Y'RG(BU0D%(D"C02 C02 T>"+5"0$ +M*<*-%)*-%)*-%)*-%)+!X at 6+1"04B5 $QT?XG*D$"(M%#(E'_(DWC7?X@\40 +MBT4 _^#'0VP, BT/XZ_*)]D0 D BT40B44(BT4$B440@\4(Z2S_ +M__^% ) (M&!#M%# ^=P ^VP(7 = 6#^ %T&8M5$(M&!(E%$(G6QT4( +M5'0&"(/%"(L&_^")=12+=03'0P2(7 D(QT4$Z'0&"(/%!+@@]@<(Z^ $ +M) (M&!(E% (M5"(M&"(E%"(G6QT7\!'4&"(/M!/\FC78 # +M @P "4 "^#'0)"(/%$/]E )"+1 at B)10")=0R+=@3'1?Q8=08(@^T$ +M_R8$ $ !$ "+=0"#Q03_)@0 0 $0 (U%_#M#5'(.BW4 +MQT4 ^'4&"(L&_^"^A&L)"(M#_.OT "0 #'10#___]_BT8$B47\@^T$ +MZUQW%8M% #M%! ^?P ^VP(7 =!:#^ %T,,=# +M; @ "^E&L)"(M#_/_ at QT?\I'@&"(M%!(D'BT4 B44$C7?\@\4$N*1X!@CK +MW[Y47 D(@\4(@^\(BT4 BT#P T4 Z\F0 0 " !( "-1?0[0U1R'\=%^/00 +M" B)=?R+1 at P[1@@/E, /ML"%P'0*@_@!=!F+0_C_X(M&#$")1?2+=@2#[0RX +MI'@&".OJOE1<"0B#[0BAY! (" 7T$ @(Z]8# $ ! T "#QR0[>UQW +M1L='X$1X!@B)=^2+1 at 2)1^B+10")1^S'1_ 08( +M_R:P9@( "0 0"#QP@[>UQW&8M&!#W___]_=1N^M&L)"(/%!(/O"(L& +M_^#'0VP( BT/XZ_) QT?\'*L$"(D'C7?\@\4$BT4 Z]V0D L @ +M$0 (MU ,=% ,!Y!@C_)B$ D BT4$B44 BT8$B44$Z2/^__^-=@ ! +M ) (M5!(M&!(E%!(G6QT4 I'D&"/\F%&8" @ 8 , C47P.T-4 +M#QPP[>UQW/\='^#S]!PB#[ Q6Z,!* 0"#Q!"-1_B)1 at 3'!EC\!PC'1?CT +M$ @(B47\QT7TC'0)"+Z at 7 D(@^T0N"0<" C_X,=#; P "+0_CK\I"T90( +M " !@ P"-1? [0U1R1X/'##M[7'<_QT?X//T'"(/L#%;H6$H! (/$$(U' +M^(E&!,<&6/P'",=%^/00" B)1?S'1?2<= D(OJ!<"0B#[1"X)!P("/_ at QT-L +M# (M#^.ORD @ 8 C47T.T-4UQW.L='^#S]!PB#[ Q6 +MZ/1) 0"#Q!"-1_B)1 at 3'!EC\!PC'1?CT$ @(B47\QT7T!. ("(/M#+C K00( +M_^#'0VP, BT/XZ_*0D/1D @ ) ( !$ 0"-1?0[0U1R%XM% (E% +M_,=% %1]!@B#[02X* L'"/_ at OM1K"0B+0_SK](UV $ 0 3 C47P.T-4 +MP8(BT8$B4?\BT8( +MB0>-1_B)1?3'1?#$:PD(@^T0N BM! C_X,=#; P "+0_CK\I#48P( 8P +M "0 0"#QPP[>UQW)<='^-A[!@B+11")1_R+10")!XU'^(E%$(EU#(/%#+@( +MK00(_^#'0VP, QT4$-'P&",=#(/X &X+-D'".OBC78 ?&," , D +M $ @\<,.WM<=RR#?@1\=3+'1_C,J00(QT?\#&P)"(M%!(D'C4?XB47\BW4( +M@^T$N#1\!@C_X,=#; P "+0_CK\L=%_%1<"0B+=0B#[02#[PRX-'P&".O; +MD!0 $&," ( E $ QT7X5%P)"(MU!(/M".DJ____B?:+1 at B) +M10"+=@3'1?R,? 8(@^T$_R:-=@#88@( 0 "0 0")=02+=0#'10#X? 8( +M_R:0 "T8@( 0 "4 0")=?S'1?BX= D(QT4 ,'T&"(/M".GK +M5@ D)"0C&(" , 0 $0 # (/'%#M[7' "B[#X +MR0@(@\4(BU0D"/?:BT4 BT20\ -% /_ at D $ D BU4$BT8$B44$B=;' +M10!(@ 8(_R9T 1@( (1@ @ 8 !$ !P"-1>0[0U1R'8/'"#M[ +M7'<5BT40.T4$#Y[ #[; AUQW',='^&@[!@B) +M=_R+10")!XUW^(/%"+CT$ @(_^#'0VP, QT, at _@ ;@LV0<(Z^F-=@ +M +!? @ ! )0 ! (M%!(E% (EU_,=%!#B!!@B#[03IL*'__P +M A%\" ( E $ BT4$B44 BT4(B47\B74(QT4$B($&"(/M!.DZ +ME?__B?987P( @ "0 0"+1 at B)1?R+102)1?B+1 at 2)103'10"T at 08(@^T( +MZ0N5__^-=@ H7P( P !( 0"-1>0[0U1R)\=%^/00" B)=?R+1 at B)1?"+ +M1 at 2)1?2+=@S'1>S@@08(@^T4BP;_X(M#^.OY- #@7@( " D "4 +M!0"#QP@[>UQW'<='_!RK! B+11R)!XU'_(E%((MU"(/%((M%!/_ at QT-L" +M (M#^.ORC78 @\<0.WM<=S7'1_00@@8(BT4 at B4?XBT44B4?\BT4,B0>+51Q* +MC4?TB44 at B54 @"' +M! ) % (EU (M&"(E%^(M&!(E%](M%$(E%\(M%'(E%[,=%_%B"!@B#[13I +M[G( (GV'%X" $8& D 4 B74 BT8$B448BU4,BT8(B44,B=;'1?SD@@8( +M@^T$_R;T70( @ !4 0"-1? [0U1R(,=%^/00" B)=?R+1 at B)1?2+1 at 2) +M1?"#[1"XT.<&"/_ at BT/XZ_F-=@ , *Q= @!& @ )0 ' (MU&,=% +M !R#!@C_)H/'##M[7'-=_R# +MQ1"+10#_X,=#; @ "+0_CK\H1= @ % $ !$ !P"-1>P[0U1R%(M% +M (E#*,=% '"%!@BX?.P'"/_ at OFAL"0B+0_SK](GV !(70( 0 +M "4 0")=0#II)[__P +%T" ( E $ BT4$B44 BT4(B47\ +MB74(QT4$I(0&"(/M!.DNDO__B?8 70( 0P "0 0")=0R+10")102+10B) +M10#'10C A 8(Z062__^0V%P" "$ D < BT4(B47XB74(QT7T;&T)",=% +M_.R$!@B#[0SIP68 ) *1< @ A )0 ' ,=%_.AA"0B)=?C' +M10 4A08(@^T(Z>^=__^-=@!\7 ( "0 !P"#QPP[>UQW,\='^'P*!0B+ +M102)1_R+10")!XEU",=% %QG"0B-1_B)1?S'101(A08(@^T$N P7!@C_X,=# +M; P #'0R#_ $!N"S9!PCKZ61< @ ( & ' (U%X#M#5').@\<,.WM< +M=T;'1_@\_0<(@^P,5NC4/@$ @\00C4?XB48$QP98_ <(QT7X]! ("(E%_+Y- +M! QT,$=',)",=%]-2'!@B#[0RX -X'"/_ at QT-L# (M#^.ORB?;K&HGV +MY/___P ! $ , @\<0.WM<=RN+1 at 3' -S_!PB+1 at 3' +M1_2 "0<(QT?X_%T)",='_+AL"0B)!XUW](M% /_ at QT-L$ (M#_.ORD)A; +M @ ( % ! (U%[#M#5'(=QT7X]! ("(EU_(M6!(72=1&^1&@)"(/M"(L& +M_^"+0_CK^872#Y_ #[; AUQW1<=']$R&!@B)=_C'1_R0AP8(B3?'1?RX$0@( +MQT7X3 0 ,=%] "-1_2)1?"-1_R)1>S'10# AP8(@^T4N)1V!@C_X,=# +M;! #'0R#^ N"S9!PCKZ9"0+%H" 8 0 $0 # (U%[#M#5'(= +MBT4 BU4$B4,XB5,\QT4$$(P&"(/%!+@ [0<(_^"^@&P)"(M#_.OTD$@ +M "$ E @\<,.WM<=S2#[ C_=03_=@3H[30! (/$$-T<),=' +M^!3?! B+!"2+5"0$B4?\B1>-=_B#Q0BX]! ("/_ at QT-L# (M#^.OR@\<, +M.WM<=SN#[ 3_=02+1 at 2#P A0_W8(Z -1_B)11"#Q1"+103_ +MX,=#; P #'101DB08(QT, at _@ ;@LV0<(Z^(A ) (M% (E%^(/M +M".NID"$ D BT8(B47TBW8$@^T,ZY*)]B$ D BT4 B47X@^T( +MZ7K___^)]B$ D BT8(B47TBW8$@^T,Z5____^-=@!D6 ( 1 $ "0 +M 0"%]G46OB1L"0C'10STB08(@\4(N)#,!PC_X(/'##M[7'UQW)<='^'P*!0B+102)1_R+10B) +M!XEU"(U'^(E%!(/%!+@,%P8(_^#'0VP, BT/XZ_*-=@#X5@( 0 " !( +M 0"-1> [0U1R,,=%^/00" B)=?R+1 at R)1?2+1 at 2)1?"+5 at B%TG48OD1H"0C' +M1>PTBP8(@^T4BP;_X(M#^.OYA=(/G\ /ML"%P'0%@_@!=!.^N&<)",=%[#2+ +M!@B#[12+!NO5C4+_QT7H"&,)"(E%Y,=%X AC"0C'1>PTBP8(@^T at N!@U!@CK +ML(GV9%8" D , @\<0.WM<=Q*)\/?0P>@?=!Z#^ $/A)T #'0VP0 +M QT, at _P ! ;@LV0<(_^")=0B)\O?:=33'1_1\"@4(BT4$B4?XBT4 B4?\ +MQT4 Z&$)"(U'](E%_,=%!!"+!@B#[02#[P2X$!0&".O!A=(/G\ /ML"%P'0% +M at _@!= ^^N&<)"(/%#(/O$(L&ZZ&-0O_'1?@(8PD(B47TQT7P"&,)",=%_(B* +M!@B#[1"#[Q"X&".EV____QT?T?(L&"(M%!(E'^(EW_(M% (D'QT4( &T) +M"(UW](/%"(M%!.E,____D)"0!0 ! 1 C47X.T-4 "B[#XR0@(@\4( +MBU0D"/?:BT4 BT20\ -% /_ at C78 0 "0 "+502+1 at 2)102)UL=% *"- +M!@C_)B15 @ ( & # (U%\#M#5')$@\<,.WM<=SS'1_@\_0<(@^P,5NB@ +M-@$ @\00C4?XB48$QP98_ <(QT7X]! ("(E%_+XL;0D(QT7TM(X&"(/M#(L& +M_^#'0VP, BT/XZ_(A ) (/'"#M[7'@[0U1R'8M% (E%^(M%!(E%],=%_ R2!@B#[0RX .(& +M"/_ at OJ!L"0B+0_SK]) ! $ $P (U%\#M#5'(AQT7X]! ("(EU_(M&!(E% +M],=%\.1H"0B#[1"XT H%"/_ at BT/XZ_F)]@ $%0" "0! E $ +MBT4$B44 Z9T "0^%," "0! D $ QT4$6(\&"(/%!/\F' #8 +M4P( ) "4 0"+10R)1?R+11")1?C'10!PCP8(@^T(Z2V!__^0ODQH"0C' +M10!8CP8(_R:)]A@ F%," &4 E $ BT4$0(E%"(MU#,=%!)"/ +M!@B#Q03_)HGVBW4$@\48_V4 C78 :%," (, D $ B740BT4,B47XB77T +MQT7\T(\&"(/M#.GE40 D .%," "0! E $ BT4$B44 Z\@D +M4P( ) $ "0 0#'100PD 8(@\4$_R8,4P( ) $ "0 0#'100PD 8(@\4$ +M_R;T4@( 10 "0 0"%]G43ODQH"0C'100PD 8(@\4$BP;_X(M%!(E% (M% +M%(E%_,=%!%R0!@B#[02XV! &".OA, "L4@( ) "4 0"#?@0 +M=1"^3&@)",=% #"0!@B+!O_ at B77\BT40B47XQT4 1) &"(/M"+C8$ 8(Z^2) +M=0"+1 at 2)0P2+=@C'0P@ QT7\=) &"(/M!.EF6@$ B?9,4@( ) $ "0 +M 0#'100PD 8(@\4$_R8P4@( @ "0 P"#QPP[>UQW/8T$-L='^!2/!@B+ +M502)5_R-5_B)50")1?R)PH7 =2S'1?3H80D(BT4(B47PQT7X')$&"(/M$+C8 +M$ 8(_^#'0VP, N/33!PCK\(7 #Y_ #[; AB$__^^ +M (/%#/]E )!L40( " !@ P"-1>P[0U1R4(/'##M[7'=(QT?X//T'"(/L +M#%;H9#(! (/$$(U'^(E&!,<&6/P'",=%^/00" B)1?S'1?!$: D(QT7LU'0) +M",=%]*B2!@B#[12X4",&"/_ at QT-L# (M#^.OR "0 "#QPP[>UQW +M',='^&@[!@B)=_R+10")!XUW^(/%"+CT$ @(_^#'0VP, QT, at _@ ;@L +MV0<(Z^F0D) ) ( !$ "-1?P[0U1R$(MU!,=%_!R3!@B)Q8L&_^"^ +MP&P)"(M#_.OTB?9B ) (/'"#M[7'UQW+\='^'P*!0B+10R)1_R+ +M10B)!XM%!(E%"(U'^(E%!,=%#$25!@B#Q02X$!0&".O'QT-L# +CTTP<( +MZ[F07 !P3@( HP "4 0"#QPP[>UQW'X-^! !U);XD; D(QT4( +M+)4&"(/%!(/O#+B0S <(_^#'0VP, BT/XZ_+'1_A\"@4(BT4(B4?\BT4$ +MB0>)=02-1_B)10#'10 at 8E08(N! 4!@CKR8EU (M&!(E#!(MV",=#" #' +M1?Q\E08(@^T$Z095 0")]B$ D BT4 B47X@^T(Z3;^__^)]B$ D +M @\<(.WM<=QR)\ ^O103'1_P-=_R#Q0BX]! ("/_ at QT-L" +M +CTTP<(Z_")]HQ- @ A ) ! (/'"#M[7'<=BU4$A=)U),='_!RK! B) +M-XUW_(/%"+CT$ @(_^#'0VP( N/33!PCK\(72#Y_ #[; AUQW$HGP]]#!Z!]T'H/X 0^$G0 ,=#;! #'0R#_ $! +MN"S9!PC_X(EU"(GR]]IU-,=']'P*!0B+102)1_B+10")1_S'10#H80D(C4?T +MB47\QT4$>)8&"(/M!(/O!+ at 0% 8(Z\&%T@^?P ^VP(7 = 6#^ %T#[ZX9PD( +M@\4,@^\0BP;KH8U"_\=%^ AC"0B)1?3'1? (8PD(QT7\\)4&"(/M$(/O$+ at 8 +M-08(Z7;____'1_1-=@ ! ) (EU (M5!(M&!(E%!(G6 +MQT7\1)D&"(/M!/\FD)"@2P( " !@ P"-1>P[0U1R4(/'##M[7'=(QT?X +M//T'"(/L#%;H_"H! (/$$(U'^(E&!,<&6/P'",=%^/00" B)1?S'1?!$: D( +MQT7L\&P)",=%]!":!@B#[12X4",&"/_ at QT-L# (M#^.OR "0 "# +MQPP[>UQW',='^&@[!@B)=_R+10")!XUW^(/%"+CT$ @(_^#'0VP, QT,@ +M_@ ;@LV0<(Z^F0D) ( & (U%\#M#5'))@\<,.WM<=T''1_@\_0<( +M@^P,5NA,*@$ @\00C4?XB48$QP98_ <(QT7X]! ("(E%_,=%]%QG"0C'1? ( +M8PD(@^T0N P7!@C_X,=#; P "+0_CK\I"0D#!+ @ + ( !$ ?P"- +M1?@[0U1R$8MU!,=%_,R@!@B#[02+!O_ at O@QM"0B+0_SK])#IMP$ (UV +M D BT8$BU8(@?( " B4,XB5,\@\4$_V4 "0 "+1 at 2+5@B! +M\@ (")0SB)4SR#Q03_90 ) (M&!(M6"('R @(E#.(E3/(/% +M!/]E %@ D$H" $( E $$ @\<(.WM<=R*+1 at 0] @'4DQT4 +M9&<)",=%"!B;!@B#[PBX>*$&"/_ at QT-L" (M#^.OR]]C'1_QL#P4(B0>- +M1_R)10#'10CXF at 8(N'BA!@CKTXUV (/'##M[7'-1_B)10#'10 at XFP8(N'BA!@C_X,=#; P "+0_CK\O!) @ " +M) !! (MU",=% &2;!@C_)MA) @ " ) !A (GPP>@?= 6#^ %T#+Y<;0D( +M@\4,BP;_X+@$G 8(Z_>0( "D20( @ "4 80"+1 at 3!Z!]T!8/X +M 70,OEQM"0B#Q0R+!O_ at N 2A. 0!$_O__ %!) @ $ @ X 80"-1?0[0U1R'8M&!(E%_(M& +M"(E%^(MV!,=%]%"-=_B#Q02+10#_X,=#; P "X1-4'".OPD +M D @\<,.WM<=QW'1_ at 4WP0(BT,XBU,\B4?\B1>-=_B#Q02+10#_X,=# +M; P "X1-4'".OPD+!( @ ! ) ! (7V=0R^C&T)"(/%"(L&_^"+=03' +M1004G08(@\4$N*2$@" $ E $ @WX$ '4,OHQM +M"0B#Q0B+!O_ at BW4$QT4$V)P&"(/%!+BDG 8(Z^J)]HM&!(E#!(MV",=#" +M #'10!4G08(Z:1- 0 82 ( @ "0 <0"#QPP[>UQW*<='^*2!@B#[03ILDP! (GV)$<" ( D '$ +MBW4$QT4 >)X&"/\F#$<" ( D 'D B?#!Z!]T!8/X 70'N-">!@C_X+Y\ +M;0D(@\4,BP;K\I @ -A& @ " )0!Y (M&!,'H'W0%@_@!= >X +MT)X&"/_ at OGQM"0B#Q0R+!NORBT8$B4,$BW8(QT,( ,=% .B>!@CI'$P! +M )!& @ " ) !Y (MU!,=% !R?!@C_)GA& @ " ) !] (7V=0R^3&T) +M"(/%#(L&_^"X9)\&".OWD!P 3$8" ( E 'T @WX$ '4,ODQM +M"0B#Q0R+!O_ at N&2?!@CK]XUV (M&!(E#!(MV",=#" #'10!\GP8(Z91+ +M 0 (1@( @ "0 ?0"+=03'10"HGP8(_R;P10( @ "0 ?P"%]@^?P ^V +MP(7 = 6#^ %T![CLGP8(_^"^]'0)"(/%#(L&Z_(H +A% @ " +M)0!_ (-^! /G\ /ML"%P'0%@_@!= >X[)\&"/_ at OO1T"0B#Q0R+!NORB?:+ +M1 at 2)0P2+=@C'0P@ QT4 !* &".GT2@$ :$4" ( D '\ BW4$QT4 +M/* &"/\F4$4" ( D '\ A?9U![B,H 8(_^"XT)X&".OWB?84 +M "A% @ " )0!_ (-^! !U![B,H 8(_^"XT)X&".OWBT8$B4,$BW8(QT,( +M ,=% *2@!@CI>$H! $!% @ ( & ! (U%\#M#5'))@\<,.WM<=T'' +M1_@\_0<(@^P,5NB8(P$ @\00C4?XB48$QP98_ <(QT7X]! ("(E%_,=%]%QG +M"0C'1? \;0D(@^T0N P7!@C_X,=#; P "+0_CK\I"0D Q% @ + ( +M !$ _P>-1>P[0U1R'HM% (E%^,=%] AC"0C'1?RPIP8(@^T,N-R.!@C_X+XD +M;0D(BT/\Z_0 ) (/'##M[7'<-=_B# +MQ0BX]! ("/_ at QT-L# ,=#(/X &X+-D'".OIC78 A$," ( D $ +MB74$BU4(BT4 B44(B54 BT4,B47\QT4,P*(&"(/M!.E4D___ !( +M0P( 1 "4 P")=0#'10@(HP8(Z0& __^0 D0P( 1 "4 +M P")=?S'1?CH80D(QT4 0*,&"(/M".F/<___C78 _$(" $0 D , A?8/ +MG\ /ML"%P'0%@_@!="2%]G40OHAG"0C'10!DHP8(BP;_X+Y49PD(QT4 9*,& +M"(L&Z^Z^7&<)",=% &2C!@B+!NO>C78 1 "@0@( 1 "4 P"+ +M1 at 3!Z!]T!8/X 70F at WX$ '40OHAG"0C'10!DHP8(BP;_X+Y<9PD(QT4 9*,& +M"(L&Z^Z^5&<)",=% &2C!@B+!NO>D(M&!(E#!(MV",=#" #'10",HP8( +MZ2Q' 0 "Q" @ # )0 # (EU (MU!,=%_.BC!@B#[03_)HGV +M; 0@( P "4 !P"#QP@[>UQW'HM6!('Z @'4?OF1G"0C' +M10!B=#WV,=' +M_&P/!0B)!XUW_,=% %RD!@BX7*0&".O&QT4 7*0&"(/O"(L&Z[B#QPP[>UQW +M#XM&"/?0P>@?=!&#^ %T,<=#; P "+0_C_X(M6"/?:QT?X? H%"(M&!(E' +M_(D7C7?XQT4 7*0&"+AUQW%\=%^/00" B)=?R+1 at S!Z!]T$8/X 70YQT-L +M# (M#^/_ at BT8(B47PBT8$B47TBT8,B47HQT7D"&,)",=%[&"B!@B#[1R# +M[PRX\+H%".O1QT?XB*(&"(M&#(E'_(M&!(E%](M&"(E%\(U'^(E%[(G&QT7H +MA*0&"(/M&(L&ZZ*02 (0 "4 "#QPP[>UQW,H/L"/]U +M!/]V!.B!%P$ @\00W1PDQT?X%-\$"(L$)(M4) 2)1_R)%XUW^(/%"(M% /_@ +MQT-L# (M#^.ORB?:#QPP[>UQW.8/L!/]U!(M&!(/ "%#_=@CHFQ8! (/$ +M$-T<),='^!3?! B+!"2+5"0$B4?\B1>-=_B#Q0B+10#_X,=#; P "+0_CK +M\HUV /0_ @ ! ) # (M%!(E%_(M&!(E%!,=%^"0<" C'1?3(9PD(QT4 +M^*4&"(/M#.D#A/__C78 O#\" D , B74$BW4 QT4 G*8&"/\FD)0_ +M @ " ) #?!X/'$#M[7'=+QT?T5*4&"(M%!(E'^(M%"(E'_(DWC4?TB44$ +MB74 QT7\G&T)",=%^.1T"0C'1?3.^___QT7PO'0)",=%"-2F!@B#[1"XM( & +M"/_ at QT-L$ ,=% /"F!@C'0R#_ N"S9!PCKXI 8/P( (P "0 WP>+ +M100I\(U0RX'ZSOO__P^>P ^VP(7 = 6#^ %T#(G6@\4$N/"F!@C_X+[.^___ +M@\4$N/"F!@CK[]0^ @ " ) #_!XEU (M%"(E%^,=%] AC"0C'1?QLIP8( +M@^T,Z0WG__^0 " !@ "-1?@[0U1R6X/'%#M[7'=3QT?P//T'"(/L#%;H +MR!P! (/$"(U'\(E&!,<&6/P'",=%^/00" B)1?QJ &H!Z&06 0"#Q!#97"0( +MQT?\=+ $"(M$) B)!XUW_(/M"+CT$ @(_^#'0VP4 BT/XZ_*0S#X" +M @ 8 $ C47P.T-4UQW0<='^#S]!PB#[ Q6Z$P< 0"#Q!"-1_B) +M1 at 3'!EC\!PC'1?CT$ @(B47\QT7T%P ,=%\ AC"0B#[1"X\+H%"/_ at QT-L +M# (M#^.ORD)"0 " !@ "-1?@[0U1R6(/'&#M[7'=0QT?L//T'"(/L +M#%;HY!L! (/$$(U'[(E&!,<&6/P'",=%^/00" B)1?S9[MCPW1PDQT?X%-\$ +M"(L$)(M4) 2)1_R)%XUW^(/M"+CT$ @(_^#'0VP8 BT/XZ_)@/@( " +M !@ 0"-1? [0U1R1X/'##M[7'<_QT?X//T'"(/L#%;H;!L! (/$$(U'^(E& +M!,<&6/P'",=%^/00" B)1?S'1?28YP@(OMQK"0B#[1"X&!H("/_ at QT-L# +M (M#^.ORD&0^ @ ( & ! (U%\#M#5'))@\<,.WM<=T''1_@\_0<(@^P, +M5N@$&P$ @\00C4?XB48$QP98_ <(QT7X]! ("(E%_,=%].AA"0C'1? (8PD( +M@^T0N #U!@C_X,=#; P "+0_CK\I"0D @ 8 C47X.T-4UQW;,='[#S]!PB#[ Q6Z)P: 0"#Q!"-1^R)1 at 3'!EC\!PC'1?CT$ @(B47\ +MV>[UQW6,='[#S]!PB#[ Q6Z P: 0"#Q B-1^R)1 at 3'!EC\!PC' +M1?CT$ @(B47\:@!J .BY$@$ @\00W1PDQT?X%-\$"(L$)(M4) 2)1_R)%XUW +M^(/M"+CT$ @(_^#'0VP8 BT/XZ_*8/0( " !@ P"-1>P[0U1R4(/' +M##M[7'=(QT?X//T'"(/L#%;HC!D! (/$$(U'^(E&!,<&6/P'",=%^/00" B) +M1?S'1?!$: D(QT7L)'4)",=%]("K!@B#[12X4",&"/_ at QT-L# (M#^.OR +M "0 "#QPP[>UQW',='^&@[!@B)=_R+10")!XUW^(/%"+CT$ @(_^#' +M0VP, QT, at _@ ;@LV0<(Z^F0D)#L/ ( " !@ P"-1? [0U1R1(/' +M##M[7'<\QT?X//T'"(/L#%;HV!@! (/$$(U'^(E&!,<&6/P'",=%^/00" B) +M1?R^C&4)",=%]&2L!@B#[0R+!O_ at QT-L# (M#^.OR(0 "0 "#QP@[ +M>UQW'(M%! M&!,='_. %!0B)!XUW_(/%"+CT$ @(_^#'0VP( BT/XZ_)0 +M/ ( "0 0"+1 at 2)10"^X'()",=%_"BL!@B#[03_)I T/ ( " !@ +M 0"-1?0[0U1R0H/'##M[7'__ +M__^0D)!X A@, %0[ @ < !$ !P"-1?0[0U1R'8/'&#M[7'<5 +MBT4(.T4,#Y3 #[; AP[0U1R.(M&$(E%^(U5\(U& +M"(L(B0PDBT $B40D!(D*BTPD!(E*!(M&!(E%[,=%_!"N!@B#[12X: ('"/_@ +MBT/\Z_G% 0 ) (/'&#M[7'-=^R#Q1B+10#_X,=#;!@ #'0R#^ N"S9!PCK +MZ8GVI#D" &<' D , QT0D! #'!"0 @\<4.WM<=U+'1_" K at 8( +MBT44B4?TC5?XC44$BPB)#"2+0 2)1"0$B0J+3"0$B4H$BT8$B0>-1_")103' +M10 T=0D(QT7\>&X)",=%"-RN!@B#[02X-$$%"/_ at QT-L% (M#^.ORC78 +M'#D" ,4! D < BT4(*T4,@^P,4.CSN@ @\00C4W\B0&)402+1 at 2)10R^ +M5'4)",=%^#BO!@B#[0C_)I"0D @ 8 C47T.T-4UQW.L=' +M^#S]!PB#[ Q6Z*@4 0"#Q!"-1_B)1 at 3'!EC\!PC'1?CT$ @(B47\QT7TY.@( +M"(/M#+C K00(_^#'0VP, BT/XZ_*0D @ 8 C47T.T-4UQW.L='^#S]!PB#[ Q6Z$@4 0"#Q!"-1_B)1 at 3'!EC\!PC'1?CT$ @(B47\ +MQT7T!.D("(/M#+C K00(_^#'0VP, BT/XZ_*0D%0X @ $ ( !$ +M 0"-1> [0U1R#HMU ,=% -2Q!@B+!O_ at OG!N"0B+0_SK]$( D BT4$ +MB7 $OHA<"0B#Q0S_90"-=@ ,. ( YPH "0 0"+50R+102)10R)502+11") +M10#'11 @8 D(BT8$B47\QT44Z+ &"(/M!.GR,?__B?84 , at W @#G +M )0 ! (M5&(M%%(E"!+Z(7 D(@\4 at _V4 BW4UQW6\='[#S]!PB#[ Q6 +MZ+01 0"-1^R)1 at 3'!EC\!PC'1?CT$ @(B47\QP0D 0 .B0MP @\0(4E#H +M++8 (/$$,='^+ %!0B-3_R) 8E1!(UW^(/M"+CT$ @(_^#'0VP8 BT/X +MZ_*0) ,8 "@-0( ' 1 $ C47<.T-4-=^R#Q3R+10#KSXMU.,=% +M +"S!@B#[QB+!NN^C78 Z0\ "0 "+13")=3")QL=%_"BT!@B#[03_)NE7 +M @ C78 8@ "0 "#QQ@[>UQW+\='[$0#!0B)=_#'1_0 at 8 D(QT?X +M ,='_ "+102)!XUW[(/%#(M% /_ at QT-L& ,=#(/X "X+-D'".OI +M:1L "0 "#QQ@[>UQW'HM5)(M%&(E"!(M%!#M%( ^4P ^VP(7 =!J#^ %T +M+,=#;!@ #'0R#^ N"S9!PC_X(MU(,=%' 2U!@B#Q1R#[QBX8-T'".OG +MQT?L1 ,%"(M%#(E'\,=']"!@"0C'1_@ QT?\ (M%!(D'C7?L@\4H +MBT4 Z[4T,P( ZC8 "0 0#'10 @8 D(BT4(B47\BT4,B47XQT7T (M% +M$(E%\(M%((E%[,=%!%BU!@B#[13I"RW__XUV )0 Z#(" &D; E +M $ @\<8.WM<=Q6+100[12 /E, /ML"%P'01 at _@!=!G'0VP8 BT/X_^"# +M[02#[QBXZ+4&".OQBT4(.T4$#Y7 #[; AR+1 at 2)12"+1 at 2)1>C'10#UQW&(M%$"M% +M##M%) ^?P ^VP(7 =!&#^ %T(\=#;!@ "+0_C_X(MU!,=%#."W!@B#Q0R# +M[QBX4+<&".OGBT4H@\ (BU4<@\((@^P$_W4D4 at -%#%#H/=W]_X/$$(M5# -5 +M),='[$0#!0B+12B)1_"+10B)1_2+11B)1_B)5_R+11")!XM5%(U'[(E"!(M% +M((E%!,=% #'1?P QT4((& )"(MU'(/M!+C at M 8(Z6W___^-=@"+ +M=03'10P at N 8(@\4,Z3[^__^)]OPO @ ( P ) ! (/',#M[7'=_BT84B44 +MQT?44+<&"(M%!(E'V(M%"(E'W(M&!(E'X(M&"(E'Y(M%#(E'Z(M%&(E'[(M& +M%(E'\(M&#(E'](M&$(E'^(M%%(E'_(M%$(D'C4?4B47TBT8(B47XBT80B47\ +MBT8,B44(BU48BT8$B448B=;'1?! N 8(@^T0BP;_X,=#;# "+0_CK\I!< +M+P( AP$ "0 0"+1 at 2+4 2)10")UL=%_""Y!@B#[03_)I X+P( Q at 0 "0 +M 0"+1 at 2)10"+1AR)11B+=AC'1?S N08(@^T$_R:0 " !@ "-1?0[0U1R +M0H/'##M[7'L:B?;D____ $ " ! "#QP@[>UQW)(/L!&H! +M_W8$_W8(Z(37_?^#Q!#'1_S@!04(B0>-=_R+10#_X,=#; @ "+0_SK\@$ +M D OHA<"0B#Q0C_90"0S"T" "( D , @\<@.WM<=U?'1^3@!04( +MBT8$B4?HQT?LR+H&"(U'Y(E'\,='^!"[!@B+102)1_R+1 at 2)!XU'[(E% (U' +M^(E%_,=%^'1U"0C'1?0(90D(QT4$4+L&"(/M#+CT608(_^#'0VP@ BT/X +MZ_*05"T" ,, D , C4X(BU4(B%8(B4T(B74,BW4$QT4$:+L&"(/%!/\F +MB?94 % 8+0( A $ "4 !P"^ 0 ,=%!."[!@B#Q03IA"$! +M (/'"#M[7'UQW*<='_+2I! B+11")!XU'_(E% +M$,=%#%Q<"0B+102)10B#Q0BXH"D'"/_ at QT-L" (M#^.ORC78 >"P" &( +M D < B77\BT8$B44 BW84QT7X&+P&"(/M"/\F4"P" 0 @ ( $ ' +M (U%[#M#5'(?BT8(B47\BU4 BT8$B44 B=;'1?BXO 8(@^T(BP;_X(M#_.OY +M H !0"+10"+0-P#10#_X) "@ (M% (M \ -% /_ at D * +M @ _V4 D * $ BT4 BT#L T4 _^"0 H P#_90"0 H +M! #_90"0 "P" L @ $0#__XU%\#M#5'(.BW4 QT4 M+X&"(L&_^"^ +M#&\)"(M#_.OT, "0 8 # "4*P( 0 "4 'P#'10#\ +M=0D(Z4#O_?_'10!H;PD(Z33O_?_'10#,=0D(Z2CO_?_'10"(;PD(Z1SO_?_' +M10!X;PD(Z1#O_?\8 # !4*P( 0 "4 !P#'10 D;PD(Z>SN +M_?_'10",=0D(Z>#N_?_'10 4;PD(Z=3N_?\X*P( @ !4 0"-1>P[0U1R +M)\=%^/00" B)=?R+1 at 2)1?2+1 at B)1?#'1>QP7 D(@^T4N/S !@C_X(M#^.OY +M]"H" $ D $ BT84B44 BT80B47\BT8,B47XBT8(B47TBT8$B47P@^T0 +MZ3H) ")]M0J @ ! ) #__XL&#[= _H/X$'<'_R2%E.D("(MV!,=% +R] +M!@B+!O_ at BT8$B44 N%S#!@CK\8M&!(E% +@(K00(Z^2+=@3'10 0O at 8(BP;K +MUL=% -QU"0BX"*T$".O(QT4 W'4)"+@(K00(Z[K'10!(;PD(N BM! CKK,=% +M +AO"0BX"*T$".N>BT8$B44 N BM! CKD8/'##M[7'-=_B#Q0R+10"+0.P#10#KFI 0 /0F @!# )0 # ,=% +M"#QV"0B#Q0CI]>G]_Y"+1 at 2)10B+=03'101DP at 8(@\4$_R:0D) "@ 2 +M /]E ) "@ # (M% (M Y -% /_ at D*0F @ + ( !$ !P"+=0#' +M10 ,Q08(_R8" %0 (U%\#M#5'(@QT7X]! ("(EU_(M&!(E%](M&"(E% +M\(/M$+@(K00(_^"+0_CK^8UV @ 3"8" $ E $ BW4$@\4( +M_R:#QPP[>UQW(\='^'##!@B+102)1_R)-XU'^(E%!,=% *QU"0BX"*T$"/_@ +MQT-L# (M#^.ORD F @ " %0 ! (U%\#M#5'(AQT7X]! ("(EU_(M& +M"(E%](MV!,=%\+3#!@B#[1"+!O_ at BT/XZ_F)]@( 5 C47P.T-4UQW)L='^ #$!@B+1 at 2)1_R+ +M102)!XU'^(E%!,=% )QU"0BX"*T$"/_ at QT-L# (M#^.ORB?:#QPP[>UQW +M)L='^,C$!@B+102)1_R+1 at 2)!XU'^(E%!,=% ,AO"0BX"*T$"/_ at QT-L# +M (M#^.ORD) ( & (U%]#M#5')"@\<,.WM<=SK'1_@\_0<(@^P,5N at 4 +M_P @\00C4?XB48$QP98_ <(QT7X]! ("(E%_,=%] SJ" B#[0RXP*T$"/_@ +MQT-L# (M#^.ORD) ( & (U%]#M#5')"@\<,.WM<=SK'1_@\_0<( +M@^P,5NBT_@ @\00C4?XB48$QP98_ <(QT7X]! ("(E%_,=%]!SJ" B#[0RX +MP*T$"/_ at QT-L# (M#^.ORD) ( & (U%]#M#5')"@\<,.WM<=SK' +M1_@\_0<(@^P,5NA4_@ @\00C4?XB48$QP98_ <(QT7X]! ("(E%_,=%]"CJ +M" B#[0RXP*T$"/_ at QT-L# (M#^.ORD) "@ , /]E ) ( & +M (U%]#M#5')"@\<,.WM<=SK'1_@\_0<(@^P,5NCH_0 @\00C4?XB48$QP98 +M_ <(QT7X]! ("(E%_,=%]$#J" B#[0RXP*T$"/_ at QT-L# (M#^.ORD) +M "@ (M% (M \ -% /_ at D $ " _V4 D $ ) _V4 D +M @ 8 C47T.T-4UQW.L='^#S]!PB#[ Q6Z%S] "#Q!"-1_B) +M1 at 3'!EC\!PC'1?CT$ @(B47\QT7T3.H("(/M#+C K00(_^#'0VP, BT/X +MZ_*0D ( $ $ BT4 BT#L T4 _^"0 @ D 0"+10"+0.P#10#_X) +M "@ + /]E )!\(@( %@ & 1 \ C47\.T-4UQW-<=' +M\!3*!@B+102)1_2+10R)1_B+112)1_R+10B)!XU'\(E%%(MU$,=%_+C,!@B# +M[02+!O_ at QT-L% +Z8;PD(BT/\Z^V)]@( 5 C47P.T-4UQW,\=%^/00" B)=?S'1_C,J00(QT?\;'8)"(M&!(D'C4?XB47TBT8(B47P +M@^T0N BM! C_X,=#; P "+0_CK\I ( +PA @ ! )0 ! (MU +M!(/%"/\F@\<,.WM<=R/'1_A R 8(BT4$B4?\B3>-1_B)103'10#8;PD(N BM +M! C_X,=#; P "+0_CK\I!P(0( @ !4 0"-1? [0U1R(<=%^/00" B) +M=?R+1 at B)1?2+=@3'1?"DR 8(@^T0BP;_X(M#^.OYB?8T(0( P !( !0"- +M1? [0U1R.H/'##M[7'UQW'<='^(C) +M!@B+102)1_R-1_B)102)=0"X"*T$"/_ at QT-L# (M#^.ORC78 2" " 0 +M 2 L C47P.T-4UQW.<=%^/00" B)=?S'1_0LR08(BT8$B4?X +MBT8(B4?\BT8,B0>-1_2)1?2+=A#'1?#,R08(@^T0BP;_X,=#;! "+0_CK +M\HUV .0? @ ! $ $P ! (U%\#M#5'(AQT7X]! ("(EU_(M&!(E%],=%\*QU +M"0B#[1"X"*T$"/_ at BT/XZ_F)]J@? @ " %0 ! (U%\#M#5')(@\<8.WM< +M=T#'1?CT$ @(B77\QT?L>,H&"(M&!(E'\,='^,RI! C'1_S$=@D(C4?LB0>- +M1_B)1?2+1 at B)1?"#[1"X"*T$"/_ at QT-L& (M#^.OR0!\" $ 0 3 $ +MC47P.T-4UQW0,=%^/00" B)=?S'1^P< +MRP8(BT8$B4?PQT?XS*D$",='_,1V"0B-1^R)!XU'^(E%](M&"(E%\(/M$+@( +MK00(_^#'0VP8 BT/XZ_(\ )0> @ ! )0 % (/'##M[7'UQW(\='^'3,!@B+11B)1_R- +M1_B)11B+1 at 2)112#Q12X"*T$"/_ at QT-L# (M#^.ORD*P= @ + ( +M !$ __^+=0#'10!$S08(_R8 ! )0 (EU .G0W_W_ +MA!T" $ D /__BP8/MT#^@_ at 3=P?_)(74Z@@(OAQV"0C'10 PS08(BP;_ +MX+[L=0D(QT4 ,,T&"(L&Z^Z^I'8)",=% ##-!@B+!NO>OEQV"0C'10 PS08( +MBP;KSKX,=PD(QT4 ,,T&"(L&Z[Z^S'8)",=% ##-!@B+!NNNOMQV"0C'10 P +MS08(BP;KGKY,=@D(QT4 ,,T&"(L&ZXZ^_'8)",=% ##-!@B+!NE[____OKQU +M"0C'10 PS08(BP;I:/___[[L=@D(QT4 ,,T&"(L&Z57___^^J&\)",=% ##- +M!@B+!NE"____O at AP"0C'10 PS08(BP;I+____[Z4=@D(QT4 ,,T&"(L&Z1S_ +M__^^#'8)",=% ##-!@B+!ND)____OK1V"0C'10 PS08(BP;I]O[__[XL=@D( +MQT4 ,,T&"(L&Z>/^__^^''<)",=% ##-!@B+!NG0_O__OG1V"0C'10 PS08( +MBP;IO?[__[XL=PD(QT4 ,,T&"(L&Z:K^__^0D @ 8 C47T.T-4UQW.L='^#S]!PB#[ Q6Z-SU "#Q!"-1_B)1 at 3'!EC\!PC'1?CT$ @( +MB47\QT7T).L("(/M#+C K00(_^#'0VP, BT/XZ_*0D @ 8 C47T +M.T-4UQW.L='^#S]!PB#[ Q6Z'SU "#Q!"-1_B)1 at 3'!EC\!PC' +M1?CT$ @(B47\QT7T+.L("(/M#+C K00(_^#'0VP, BT/XZ_*0D @ 8 +M C47T.T-4UQW.L='^#S]!PB#[ Q6Z!SU "#Q!"-1_B)1 at 3' +M!EC\!PC'1?CT$ @(B47\QT7T0.L("(/M#+C K00(_^#'0VP, BT/XZ_*0 +MD @ 8 C47T.T-4UQW.L='^#S]!PB#[ Q6Z+ST "#Q!"- +M1_B)1 at 3'!EC\!PC'1?CT$ @(B47\QT7T6.L("(/M#+C K00(_^#'0VP, +MBT/XZ_*0D @ 8 C47T.T-4UQW.L='^#S]!PB#[ Q6Z%ST +M "#Q!"-1_B)1 at 3'!EC\!PC'1?CT$ @(B47\QT7T7.L("(/M#+C K00(_^#' +M0VP, BT/XZ_*0D @ 8 C47T.T-4UQW.L='^#S]!PB# +M[ Q6Z/SS "#Q!"-1_B)1 at 3'!EC\!PC'1?CT$ @(B47\QT7T;.L("(/M#+C +MK00(_^#'0VP, BT/XZ_*0D @ 8 C47T.T-4UQW.L=' +M^#S]!PB#[ Q6Z)SS "#Q!"-1_B)1 at 3'!EC\!PC'1?CT$ @(B47\QT7T=.L( +M"(/M#+C K00(_^#'0VP, BT/XZ_*0D( #D 0 @ +M$0 ,=$) P QT0D" #'1"04 ,=$)! C44(BQ")5"00 +MBT $B40D%(M5 (E4) B+102)1"0,_W0D%/]T)!3_="04_W0D%.B=E@ @\00 +MA@?= 6#^ %T#;X +M@\4(BT4 Z^2^_____X/%"(M% .O7 at WT$'P^?P ^VP(7 = 6#^ %T$HM-!(M% +M (G&T^:#Q0B+10#KLKX @\4(BT4 ZZ7D& ( " !@ P"-1? [0U1R +M28/'##M[7'=!QT?X//T'"(/L#%;H_/$ (/$$(U'^(E&!,<&6/P'",=%^/00 +M" B)1?S'1?1 < D(QT7P,' )"(/M$+@(K00(_^#'0VP, BT/XZ_*0D) +M ( & (U%]#M#5')"@\<,.WM<=SK'1_@\_0<(@^P,5NB4\0 @\00C4?X +MB48$QP98_ <(QT7X]! ("(E%_,=%])#K" B#[0RXP*T$"/_ at QT-L# (M# +M^.ORD) L& ( " !@ P"-1? [0U1R28/'##M[7'=!QT?X//T'"(/L#%;H +M,/$ (/$$(U'^(E&!,<&6/P'",=%^/00" B)1?S'1?18< D(QT7PI'<)"(/M +M$+@(K00(_^#'0VP, BT/XZ_*0D) + ( !$ "-1?P[0U1R'8M% +M (E%_(M%!(E% ,=%!!34!@B#[02X6-0&"/_ at OE!P"0B+0_SK]) ) +M (/'##M[7'<:QT?XG*D$"(EW_(M% (D'C7?X@\4(BT4 _^#'0VP, QT,@ +M_@ ;@LV0<(Z^F0"P " 1 C47L.T-4- +M1^")11"-=_B#Q1"+103_X,=#;# "+0_CK\HUV !0 $( +M E QT4(5%P)"+Y47 D(@\4(_V4$B?:+1 at B)1?R)=0"+1 at 2)10B+1 at 2) +M1?2+=03'1?C(U 8(@^T0Z95& 0"0 " !@ "-1?0[0U1R0H/'##M[7'UQW)<='^'P*!0B+10")1_R)-XM%"(E%#(U'^(E%"(/%"+A,U at 8(_^#' +M0VP, QT, at _P ;@LV0<(Z^F)]C@ U!0" "$ E $ @\<( +M.WM<=R&+1029]WX$QT?\; \%"(D7C7?\@\4(BT4 BT#P T4 _^#'0VP( +MBT/XZ_*-=@")=0"+=03'1?R(U at 8(@^T$Z6L) 0"-=@!X% ( 0 "0 0"# +MQPP[>UQW'\='^'P*!0B+10")1_R)-XU'^(E%!(/%!+A,U at 8(_^#'0VP, +MQT, at _P ;@LV0<(Z^D ) (/'"#M[7'<:QT?\; \%"(DWC7?\@\4$ +MBT4 BT#P T4 _^#'0VP( N/33!PCK\ D BT4 B4,$QT4$@-<& +M"(/%!.EW% $ C78 0@ "0 "+10B)0P2)+ +M10B)10R-1_B)10B#Q0BXC-D&"/_ at QT-L# ,=#(/\ &X+-D'".OIB?8X +M )P1 @ A )0 ! (/'"#M[7'- +M1_B)102#Q02XC-D&"/_ at QT-L# ,=#(/\ &X+-D'".OI "0 "# +MQPP[>UQW(,='^'P*!0B+10")1_R)-XUW^(/%"(M% (M [ -% /_ at QT-L# +M ,=#(/\ &X+-D'".OIC78 0@ "0 "+10B)0P2)+10")1?S'10!<9PD(@^T$N)P,!0C_X+[4< D(BT/\ +MZ_20D) L#P( "P " 1 \ C47L.T-4UQW&L='_&P/!0B)-XUW_(/%!(M% +M (M \ -% /_ at QT-L" +CTTP<(Z_ ) (/'"#M[7'<:QT?\; \% +M"(DWC7?\@\4$BT4 BT#P T4 _^#'0VP( N/33!PCK\)@. @ F!0 ) ! +M (/'##M[7'<>BT48A@?#X2> @_@!#X2] QT-L# +M ,=% #C=!@C'0R#_ N"S9!PC_X(-]$ !U&(G"/0 (!U+[YD9PD(@\4< +M@^\,BP;KX(M%#(E#!(ES"(MU!,=%&/S^;'$)"(/%#(L&_^"+1 at C!Z!]T!8/X 70-BW8( +M@^T,N#C>!@CKY(M&"(G&]]Z#[0RX.-X&".O3B<+!ZA]T!8/Z 70,B<:#[0RX +M.-X&".N[B<;WWH/M#+ at XW@8(ZZV-=@ ) (/'##M[7'<@QT?X? H% +M"(M% (E'_(DWC7?X@\4(BT4 BT#L T4 _^#'0VP, QT, at _P ;@LV0<( +MZ^F-=@ ) (/'##M[7'<@QT?X? H%"(M% (E'_(DWC7?X@\4(BT4 +MBT#L T4 _^#'0VP, QT, at _P ;@LV0<(Z^F-=@ , !0, @!# +M )0 # (EU"(/%".G9_/__D(M5"(72=1.+5 at B%TG4QOFQQ"0B#Q1"+!O_@ +MBT4$B4,$BT8(B4,(BT8$B4,,B=;'10P8WP8(@\4,N-#D!PCKV8M%!(E#!(E3 +M"(M&!(E##+X QT4,8-\&"(/%#+C0Y <(Z[0< (P+ @ ! +M)0 / (EU (M5!(M&!(E%!(G6QT7\?-X&"(/M!/\FB?:+1 at 2)1?R+1 at B)10"+ +M102)=02)QL=%^+3?!@B#[0C_)D0+ @ " ) / (MU!,=%!#C@!@B#Q03_ +M)I L"P( 0@ "0 0"#QPP[>UQW'\='^'P*!0B+10")1_R)-XU'^(E%#(/% +M"+B8W 8(_^#'0VP, QT, at _P ;@LV0<(Z^DD -@* @ " +M)0 / (%^! (!U$[X " QT4 G. &"+B8X <(_^"X at . &".OWD.EK____ +MC78 H H" ( D \ BW4(QT4 [. &"/\FC H" $ D $ @\<,.WM< +M=Q_'1_A\"@4(BT4 B4?\B3>-1_B)102#Q02XF-P&"/_ at QT-L# ,=#(/\ +M &X+-D'".OI* X"@( @ "4 #P"!?@0 " =1:^ @,=% +M!#SA!@B#Q02XF. '"/_ at N"3A!@CK]XGVZ6O___^0D) $ $ !$ "- +M1?P[0U1R%XM% (E%_,=% %QG"0B#[02X/$H'"/_ at OA!Q"0B+0_SK])"0D L +M @ $0 (U%_#M#5'(.BW4 QT4 A.,&"(L&_^"^6'$)"(M#_.OT +M "0 "%]@^?P ^VP(E$) C!X *+L/C)" B#Q02+5"0(]]J+10"+1)#P T4 +M_^")]C "$ E BT4$.T8$#YS #[; B40D",'@ HNP +M^,D("(/%"(M4) CWVHM% (M$D/ #10#_X(GVBT8$B4,$BW8(BT4$B4,(QT4$ +M*.(&"(/%!.F^" $ B?8 ) (GPP>@?B40D",'@ HNP^,D("(/%!(M4 +M) CWVHM% (M$D/ #10#_X) ) (GPP>@?B40D",'@ HNP^,D("(/% +M!(M4) CWVHM% (M$D/ #10#_X) @ !" )0 (M%!(E# +M!(M&!(E#"(MU",=%",#B!@B#Q0CI*@@! (GVBT4$B4,$BT8(B4,(BT8$B4,, +MBW4(QT4(\.(&"(/%".E@" $ % 0 "4 "+502+1 at 2) +M102)UL=% &CB!@C_)HM&!(E% (M5!(M&"(E%!(G6QT7\+.,&"(/M!/\FD)"0 +M"P " 1 C47T.T-4UQW +M#XM&!/?0P>@?=!&#^ %T)<=#; @ "+0_C_X(M&!/?8QT?\'*L$"(D'C7?\ +M@\4$BT4 Z^6#Q02#[PB+!NO;D) + ( !$ "-1?0[0U1R'8M%!(E% +M^(M% (E%],=%_-#D!@B#[0RXI$8'"/_ at OF1Q"0B+0_SK]) ( +M " )0 (MU"(/%#/\FBW4$@\4,_R8+ ( !$ "-1?P[0U1R +M%XM% (E%_,=% %QG"0B#[02X+#\'"/_ at OFAQ"0B+0_SK])"0D+ & @ ( +M& # (U%\#M#5')'@\<,.WM<=S_'1_@\_0<(@^P,5NA\WP @\00C4?XB48$ +MQP98_ <(QT7X]! ("(E%_,=%].QW"0B^H%P)"(/M$+ at D' @(_^#'0VP, +MBT/XZ_*04 8" @ 8 , C47P.T-4#QPP[>UQW/\='^#S]!PB#[ Q6 +MZ!3? "#Q!"-1_B)1 at 3'!EC\!PC'1?CT$ @(B47\QT7T_'<)"+Z at 7 D(@^T0 +MN"0<" C_X,=#; P "+0_CK\I 3 , !$ "-1?0[0U1R'8M% (E% +M^(M%!(E%],=%_#CF!@B#[0RXG P%"/_ at OHQQ"0B+0_SK]) +M !# )0 (EU"(/%!.GI6 D L @ $0 (U%_#M#5'(=BT4 +MB47\BT4$B44 QT4$B.8&"(/M!+C8$ 8(_^"^I'$)"(M#_.OTD D +M@\<,.WM<=QK'1_B-=_B#Q0B+10#_X,=#; P #'0R#^ +M !N"S9!PCKZ9 + ( !$ "+=0#'10 8YP8(_R8A ) (/' +M"#M[7'<:BT4$ T8$QT?\-! %"(D'C7?\@\4(BT4 _^#'0VP( BT/XZ_*) +M]@$ D BU4$BT8$B44$B=;'10#@Y at 8(_R:H! ( ! ! 1 $ +MC47\.T-4<@Z+=0#'10"HYP8(BP;_X+ZL<0D(BT/\Z_0 ) (/'##M[ +M7'<:QT?X:#L&"(EW_(M% (D'C7?X@\4(BT4 _^#'0VP, QT, at _@ ;@L +MV0<(Z^F0/ 0" D $ BT8$B47\QT4 9.<&"(/M!.EG% D)"0& 0" +M L @ $0 ! (U%]#M#5'(.BW4 QT4 <.@&"(L&_^"^M'$)"(M#_.OT +M "0 "#QPP[>UQW&L='^&@[!@B)=_R+10")!XUW^(/%"(M% /_ at QT-L +M# ,=#(/X &X+-D'".OID*P# @ " ) ! (M&!(E% (M%!(E%_(M& +M"(E%!(M%"(E%^,=%"/CG!@B#[0CI'4[__Y!X P( 0 "0 0"+1 at B)10"+ +M502+1 at 2)102)UL=%_#SH!@B#[03_)I"0D$P# @ + ( !$ 0"-1?P[ +M0U1R$(MU!,=%_ CI!@B)Q8L&_^"^O'$)"(M#_.OTB?8A ) (/'"#M[ +M7'<;BT8$F?=]!,='_!RK! B)!XUW_(/%"(M% /_ at QT-L" (M#^.ORD.0" +M @!" ) ! (M&!(7 =0^^)&P)"(/%"+B0S <(_^")10B+=03'103,Z 8( +M@\4$BP;KZI"0L (" @ 8 $ C47P.T-4#QPP[>UQW/\='^#S]!PB# +M[ Q6Z&#; "#Q!"-1_B)1 at 3'!EC\!PC'1?CT$ @(B47\QT7T].L("+[<:PD( +M@^T0N!@:" C_X,=#; P "+0_CK\I!L @( "P " 1 $ C47\.T-4 +MUQW +M&XM&!)GW?03'1_P-=_R#Q0B+10#_X,=#; @ "+0_CK\I $ @( +M0@ "0 0"+1 at 2%P'4/OB1L"0B#Q0BXD,P'"/_ at B44(BW4$QT4$V.D&"(/% +M!(L&Z^J0D,P! @ $ $ !$ 0"-1?@[0U1R'L=%_%QG"0B+10")1?C' +M10#4Z at 8(@^T(N P7!@C_X+[<<0D(BT/\Z_0 ) (/'##M[7'<:QT?X +M:#L&"(EW_(M% (D'C7?X@\4(BT4 _^#'0VP, QT, at _@ ;@LV0<(Z^F0 +M !( 0( "4 0#'1?Q$: D(B77XQT4 B.H&"(/M".EC./__ +MD)"0( $" L @ $0 ! (U%]#M#5'(>BT4$B47XQT7TY&@)",=%_%3K +M!@B#[0RXT H%"/_ at ON1Q"0B+0_SK] D @\4(_R:-=@ 8 +M ,P @ " )0 ! (M%!(E% (M%"(E%!,=%"#CK!@CI;"7__[Y,: D(@\4, +M_R:0D* @ ( & ! (U%\#M#5'))@\<,.WM<=T''1_@\_0<(@^P,5N@< +MV0 @\00C4?XB48$QP98_ <(QT7X]! ("(E%_,=%]'!H"0C'1?!D9PD(@^T0 +MN P7!@C_X,=#; P "+0_CK\I"0D#0 @ * ( !$ !P"-1?0[0U1R +M#XM%!/?0P>@?= ^#^ %T5K[\<0D(BT/\_^"+102)PO?:=17'101$: D(QT4 +M1&@)"+C@]P8(Z^"%T@^?P ^VP(7 = 6#^ %T#+YT> D(@\4(BP;KPXE5!(MU +M ,=% -CL!@B+!NNRBU4$A=)U%,=%!$1H"0B^1&@)"(/%!(M%!.N7A=(/G\ / +MML"%P'0%@_@!= ^^='@)"(/%"(L&Z7?___^)502+=0#'10 ,[08(BP;I8___ +M_W3_ 0 ) ! (M% (E%!(EU .D6"P B?94_P$ (0 "0 P"+501* +MBT8(B44 BT8$B47\B57XB77TQT4$O.P&"(/M#.F[ 0 C78 (/\! "$ D +M $ BU4$2HM&"(E%!(M&!(E% (E5_(EU^(/M".F. 0 D)#X_@$ "P " +M 1 $ C47T.T-4 "0D)"0_@$ "P " 1 $ C47T.T-4#QPP[>UQW/\='^#S]!PB#[ Q6Z%S6 "#Q!"-1_B)1 at 3'!EC\ +M!PC'1?CT$ @(B47\QT7T@&@)"+Z at 7 D(@^T0N"0<" C_X,=#; P "+0_CK +M\I X 1 (S] 0 0 !$ P"-1>P[0U1R$HM%!(7 =16+=0B# +MQ0R+103_X+XD<@D(BT/\Z_2)102+=0#'10"@\ 8(BP;KXXUV .G#____C78 +M1/T! *8# D $ @\<,.WM<=S*+50A*QT?X:#L&"(M%'(E'_(M%#(D'BT4 +MB44D*3[ 0 C ) # (M%!(E%^(M&"(E%_(MV!(/M".N0! ! +M 1 BW4 QT4 ,/$&"/\F "0 "%]@^?P ^VP(7 = 6#^ %T)H7V +M=1''10!$: D(ON1H"0B+103_X,=% $1H"0B^O&@)"(M%!.OMQT4 1&@)"+Y$ +M: D(BT4$Z]Q( )0 (M&!,'H'W0%@_@!="B#?@0 +M=1''10!$: D(ON1H"0B+103_X,=% $1H"0B^1&@)"(M%!.OMQT4 1&@)"+Z\ +M: D(BT4$Z]R)]HM&!(E#!(MV",=#" #'10#4\ 8(Z>#Y ( & +M (U%]#M#5')"@\<,.WM<=SK'1_@\_0<(@^P,5N@$TP @\00C4?XB48$QP98 +M_ <(QT7X]! ("(E%_,=%]$SL" B#[0RXP*T$"/_ at QT-L# (M#^.ORD)!D +M^@$ $P # 1 $ @\UQW',='^)RI! B) +M=_R+10")!XUW^(/%"+CT$ @(_^#'0VP, QT, at _@ ;@LV0<(Z^F-=@ +M ) (/'##M[7'<[W ")]M3X +M 0 " %0 ! (U%[#M#5'(AQT7X]! ("(EU_(M&"(E%](MV!,=%\#3S!@B# +M[1"+!O_ at BT/XZ_F)]@ $ E @\<,.WM<=QS'1_AH +M.P8(B7?\BT4$B0>-=_B#Q0BX]! ("/_ at QT-L# (M#^.OR 0 "0 "+ +M=@C'10#8\P8(_R8" %0 (U%\#M#5'(AQT7X]! ("(EU_(M&!(E%](MV +M",=%\!#T!@B#[1"+!O_ at BT/XZ_F)]@$ D @\<,.WM<=QW'1_ at D 0@( +MBT4$B4?\C4?XB44$BW8DN"0<" C_X,=#; P "+0_CK\HUV $ D +MBW8$QT4 7/0&"/\F 0 "0 "+=@3'10"8] 8(_R8" %0 (U%\#M# +M5'(AQT7X]! ("(EU_(M&!(E%](MV",=%\*ST!@B#[1"+!O_ at BT/XZ_F0D&SW +M 0 + ( !$ P"-1?@[0U1R%XM%!(E%^,=%_-CU!@B#[0BX>%('"/_@ +MODAR"0B+0_SK](UV D @\<,.WM<=QK'1_AH.P8(B7?\BT4 B0>- +M=_B#Q0B+10#_X,=#; P #'0R#^ !N"S9!PCKZ9 /#V 0 ! +M )0 ! (M%!(E% (EU_,=%!#3U!@B#[03IN"W__P Q/8! ( +M E $ B74 BT4$B47\QT4$@/4&"(/M!.E((?__ "8]@$ @ +M "4 0"+10B)1?R)=0C'10"L]08(@^T$Z21, 4 0 !$ "-1?@[ +M0U1R'8M%#(E%_(M% (E%^,=% )#W!@B#[0BX#!<&"/_ at OE!R"0B+0_SK]) +M ) (7V#Y_ #[; B40D",'@ HNP^,D("(/%!(M4) CWVHM% (M$D/ # +M10#_X(GV, (0 "4 "+100[1 at 0/G, /ML")1"0(P> " +MB[#XR0@(@\4(BU0D"/?:BT4 BT20\ -% /_ at B?:+1 at 2)0P2+=@B+102)0PC' +M100T]@8(@\4$Z;+T ")]@ D B?#!Z!^)1"0(P> "B[#XR0@(@\4$ +MBU0D"/?:BT4 BT20\ -% /_ at D D B?#!Z!^)1"0(P> "B[#XR0@( +M@\4$BU0D"/?:BT4 BT20\ -% /_ at D" $( E BT4$ +MB4,$BT8$B4,(BW4(QT4(S/8&"(/%".D>] B?:+102)0P2+1 at B)0PB+1 at 2) +M0PR+=0C'10C\]@8(@\4(Z53T 8 "# )0 (M&!(E% +M#(M%"(E% ,=%"'3V!@CI9!___XM&"(E%#(M%!(E% (M%"(E%_(M&!(E%",=% +M!#CW!@B#[03I/1___Y"4] $ "P " 1 , C47P.T-4C78 1 "X\P$ 0P "4 0"+1 at 3!Z!]T!8/X 70F at WX$ +M '40OHAG"0C'10! ^ 8(BP;_X+Y<9PD(QT4 0/@&"(L&Z^Z^5&<)",=% $#X +M!@B+!NO>D(M&!(E#!(MV",=#" #'10!D^ 8(Z53R $3S +M 0 " )0 ! (EU (MU!,=%_,#X!@B#[03_)HGV; 8\P$ @ +M "4 P"#QP@[>UQW'HM6!('Z @'4?OF1G"0C'10 T^08(@^\(BP;_X,=# +M; @ "+0_CK\HG0]]#!Z!]T!8/X 70>B=#WV,='_&P/!0B)!XUW_,=% #3Y +M!@BX-/D&".O&QT4 -/D&"(/O"(L&Z[B#QPP[>UQW#XM&"/?0P>@?=!&#^ %T +M,<=#; P "+0_C_X(M6"/?:QT?X? H%"(M&!(E'_(D7C7?XQT4 -/D&"+ at T +M^08(Z]G'10 T^08(@^\,BP;KRY"0"P " 1 C47D.T-4<@Z+=0#' +M10 4^P8(BP;_X+Y<<@D(BT/\Z_04 )0 +Y87 D( +M@\4$BT4 BT#L T4 _^"0OEQ<"0B#Q02+10"+0/ #10#_X) @ +M $ )0 (M5#(M%!(E%#(E5!(M%$(E% ,=%$&#Z!@CIJEL (GVOEA< +M"0B#Q12+10"+0.P#10#_X) " ) (M&"(E%_(M&!(E% (M&"(E%](M& +M!(E%\(M%!(E%[(M%"(E%Z,=%^)SZ!@B#[1CI64+__Y ! ) (M&"(E% +M (M5!(M&!(E%!(G6QT7\V/H&"(/M!/\FD)"0$ # 1 C47\.T-4 +MUQW*L='_&P/!0B+10")!\=%_%QG"0B-1_R)1?C'10"$_ 8( +M@^T(N P7!@C_X,=#; @ "^9'()"(M#_.OMD ^.\! E +M $ QT4 1&@)"(EU_(/M!.FZ)O__D) 3 , !$ "+=0#'10#4_ 8( +M_R8B ) (M%!(E% (M&!(E%!.D_%_[_C78 @ "0 "+502+1 at 2) +M102)UL=% +C\!@C_)HCO 0 + ( !$ 0"+=0#'10!(_P8(_R8" +M) (/'##M[7'-1_B)10B+1 at 2)103'10 N @4!0C_X,=#; P "+0_CK +M\@, 2 C47L.T-4BYDOW_@\00B<;_90"0 " !@ "- +M1?0[0U1R0H/'##M[7'UQW%L='_. %!0B)-XUW_(/%!+CT$ @(_^#'0VP( QT,@ +M_P + at LV0<(Z^F0# $ 1 BTT BU4$BT4(@\4,@^P$4%)1Z!&5 +M_?^#Q!")QO]E ) ( & (U%]#M#5')"@\<,.WM<=SK'1_@\_0<(@^P, +M5NC4PP @\00C4?XB48$QP98_ <(QT7X]! ("(E%_,=%]"P!!PB#[0RX' ,' +M"/_ at QT-L# (M#^.ORB?8 ) (/'"#M[7'<6QT?\X 4%"(DWC7?\ +M@\4$N/00" C_X,=#; @ #'0R#_ N"S9!PCKZ9 ( & (U%]#M# +M5')"@\<,.WM<=SK'1_@\_0<(@^P,5N at XPP @\00C4?XB48$QP98_ <(QT7X +M]! ("(E%_,=%],@!!PB#[0RX%%P'"/_ at QT-L# (M#^.ORB?8 ) +M (/'"#M[7'<6QT?\X 4%"(DWC7?\@\4$N/00" C_X,=#; @ #'0R#_ +MN"S9!PCKZ9 , 0 !$ "+30"+502+10B#Q0R#[ 104E'H/97]_X/$ +M$(G&_V4 D * BT4 BT#P T4 _^"0 H 0"+10"+0.P#10#_ +MX)!( Y $ 0 !$ #'1"0$ ,<$) "+50"- +M102+"(D,)(M !(E$) 2+10R#Q1!0_W0D"/]T) A2Z$Z2_?^#Q!"-3?B) 8E1 +M!(G-_V4(B?;IL____Y"0D @ 0 $0 +X$ +M_V4 Z?/___^0D) # ( !$ "+10"#Q02#[ Q0Z!&1_?^#Q!")QO]E +M ) ( $ !$ "^ P /]E .GS____D)"0! " +M 1 OHA<"0B#Q03_90"0! ! 1 @\<@.WM<=S?'1^08 +M! <(BT4 B4?HQT?P? 0'"(M% (E'](U'Y(E'^,='_, $!PB-1_")!XUW_(/% +M!(M% /_ at QT-L( +X0UQW +M(,='^*@#!PB+1B2)1_R-1_B)10"+=AB#[02X)!P("/_ at QT-L# (M#^.OR +M 0 ! !, "-1? [0U1R&\=%^/00" B)=?R+=@3'1?3< P<(@^T,BP;_X(M# +M^.OY @ "0 "+10B+502)50B)102+=@3I0!P! ( D BW8$QT4 +M2 0'"/\F! ! ( . C47X.T-4+1 at B)1?R+=@3'1?AD! <(@^T( +MBP;_X(M#_.OY "0 "^B%P)"(/%!/]E ) + , 0 P "-1?@[ +M0U1R(XM% (E%_(M%!(E% (M&!(E%^,=%!*@$!PB#[0BX-$$%"/_ at BT/\Z_F$ +MYP$ $P # 1 \ @\<0.WM<=S/'1_0\" <(BT4(B4?XBT4$B4?\BT4 +MB0>-1_2)103'10"DP[0U1R(<=%^/00" B)=?R+1 at B)1?2+=@3'1?"H!0<(@^T0BP;_ +MX(M#^.OYB?8 ) (/'&#M[7'-=_B#Q02AX! (" 7T$ @(_^#'0VP8 BT/X +MZ_(! $ $P (U%]#M#5'(:QT7X]! ("(EU_(MV!,=%]#P&!PB)Q8L&_^"+ +M0_CK^9#,Y0$ 0 ! !, 0"-1? [0U1R28/'&#M[7'=!QT7X]! ("(EU_,=' +M[) &!PB+1 at 2)1_#'1_C,J00(QT?\E& )"(U'[(D'C4?XB47TQT7PE',)"(/M +M$+@(K00(_^#'0VP8 BT/XZ_*-=@!@Y0$ 0 "0 0"#QQ@[>UQW/<=' +M[,0&!PB+102)1_#'1_C,J00(QT?\K& )"(U'[(D'C4?XB44$BT8$B44 QT7\ +M (/M!+@(% 4(_^#'0VP8 BT/XZ_*-=@ Y0$ @ !4 0"-1>P[ +M0U1R(<=%^/00" B)=?R+1 at B)1?2+=@3'1? P!P<(@^T0BP;_X(M#^.OYB?; +MY $ @ !4 P"-1? [0U1R3X/'&#M[7'='QT7X]! ("(EU_,='[) '!PB+ +M1 at 2)1_"+1 at B)1_3'1_C,J00(QT?\E& )"(U'[(D'C4?XB47TQT7PM',)"(/M +M$+@(K00(_^#'0VP8 BT/XZ_*04.0! , 2 , C47P.T-4UQW,L=%^/00" B)=?S'1_C,!P<(BT8(B4?\BT8,B0>-1_B)1?2+1 at 2)1?"# +M[1"X"*T$"/_ at QT-L# (M#^.ORB?8 .3C 0 )0 ! (EU +M +Z at 7 D(@^T$Z703 0#8XP$ " !@ P"-1? [0U1R1X/'##M[7'<_QT?X +M//T'"(/L#%;HY+L (/$$(U'^(E&!,<&6/P'",=%^/00" B)1?S'1?2$UQW.L='^#S]!PB#[ Q6Z("[ "#Q!"-1_B)1 at 3'!EC\!PC'1?CT$ @( +MB47\QT7TG.P("(/M#+C K00(_^#'0VP, BT/XZ_*0D , ! _V4 +MD , ) _V4 D @ 8 C47T.T-4UQW.L='^#S]!PB# +M[ Q6Z B[ "#Q!"-1_B)1 at 3'!EC\!PC'1?CT$ @(B47\QT7TP.P("(/M#+C +MK00(_^#'0VP, BT/XZ_*0D @ 8 C47T.T-4UQW.L=' +M^#S]!PB#[ Q6Z*BZ "#Q!"-1_B)1 at 3'!EC\!PC'1?CT$ @(B47\QT7TT.P( +M"(/M#+C K00(_^#'0VP, BT/XZ_*0D @ 8 C47T.T-4UQW.L='^#S]!PB#[ Q6Z$BZ "#Q!"-1_B)1 at 3'!EC\!PC'1?CT$ @(B47\ +MQT7TU.P("(/M#+C K00(_^#'0VP, BT/XZ_*0D L @ $0 (MU +M ,=% @+!PC_)B$ D @\<(.WM<=QJ+100#1 at 3'1_P-=_R# +MQ0B+10#_X,=#; @ "+0_CK\HGV 0 "0 "+502+1 at 2)102)UL=% - * +M!PC_)@, 0 $0 (/'"#M[7'<=QT?\2 P'"(M% (D'QT4 (UW +M_+A(# <(_^#'0VP( OLAS"0B+0_SK[8GV 0 ! !8 "-1?0[0U1R(,=% +M^/00" B)=?R+1 at B#P 2)1?2+=@2#[0RX2 P'"/_ at BT/XZ_F-=@ ! $ %@ +M (U%]#M#5'(@QT7X]! ("(EU_(M&"(/ XE%](MV!(/M#+A(# <(_^"+0_CK +M^8UV $ 0 6 C47T.T-4-=_B#Q02+10"+ +M0.P#10#IL?[__\='Y- at +!PB)=^B+10")1^R+50!"BT8$#[84$(M$) C!X :- +MA!" S___QT?PM*D$"(E'],='^,RI! B-1_")1_R-1^2)!XUW^(/%!(M% (M +M[ -% .E8_O__QT?D$ P'"(EWZ(M% (E'[,='\+2I! B+1"0(B4?TQT?XS*D$ +M"(U'\(E'_(U'Y(D'C7?X@\4$BT4 BT#L T4 Z13^__^0D L @ $0 +M (MU ,=% +P.!PC_)B$ D BT4$.T8$#Y_ #[; B40D",'@ HNP^,D( +M"(/%"(M4) CWVHM% (M$D/ #10#_X(GV 0 "0 "+502+1 at 2)102)UL=% +M (0.!PC_)@L @ $0 (MU ,=% "@/!PC_)B$ D @\<(.WM< +M=QJ+100K1 at 3'1_P-=_R#Q0B+10#_X,=#; @ "+0_CK\HGV 0 +M "0 "+502+1 at 2)102)UL=% / .!PC_)@L @ $0 (MU ,=% )0/ +M!PC_)B$ D BT4$.T8$#YW #[; B40D",'@ HNP^,D("(/%"(M4) CW +MVHM% (M$D/ #10#_X(GV 0 "0 "+502+1 at 2)102)UL=% %P/!PC_)BS= +M 0 ( ( !$ 0"-1?P[0U1R#8M% ,'H'W0/@_@!=!>^V',)"(M#_/_@ +MBW4 @^T$N 00!PCK\8M% (G&]]Z#[02X!! '".O at C78 X-P! &( D $ +MBT4(P>@?= 6#^ %T/X-]! !U$XM%"(7 =2B^_',)"(/%#(L&_^"+10B%P'4( +M@\4,BT4 Z^^)0P2#Q0RX..L'".OBB<:#Q0R+10#KV(-]! !U$XM%"(7 =2J^ +M_',)"(/%#(L&Z[^+10B%P'4(@\4,BT4 Z[#WV(E#!(/%#+ at XZP<(ZZ&)QO?> +M@\4,BT4 ZY60 H "+10"+0/ #10#_X) + ( !$ "-1?P[ +M0U1R#HMU ,=% P1!PB+!O_ at ON!S"0B+0_SK]$( D BT4(.T8$#Y[ +M#[; A)]@$ D B74 BU4$ +MBT8$B44$B=;'1?S<$ <(@^T$_R:0D L @ $0 (U%_#M#5'(.BW4 +MQT4 C!$'"(L&_^"^Y',)"(M#_.OT0@ "0 "+10@[1 at 0/GL /ML"%P'0% +M at _@!= >#Q0R+!O_ at BW4$@\4,BP;K](GV 0 "0 ")=0"+502+1 at 2)102) +MUL=%_%P1!PB#[03_)I"0" " 1 BT4 .T4$#YS #[; A#QPP[>UQW/\='^#S]!PB#[ Q6Z.BP "#Q!"-1_B)1 at 3' +M!EC\!PC'1?CT$ @(B47\QT7TW'@)"+Z at 7 D(@^T0N"0<" C_X,=#; P "+ +M0_CK\I ! $ !0 ! (M% (M [ -% /_ at D $ 0 ) $ BT4 BT#L T4 _^"0 +M! ! 1 @\<,.WM<=Q['1_B00 +M" @%]! ("/_ at QT-L# (M#^.OROEA<"0B#[0BAX! (" 7T$ @(Z]Z0D!0 +M!0 $0 (U%_#M#5'(0BW4,QT7\4!D'"(G%BP;_X+XT= D(BT/\Z_2) +M]B$ D @\<(.WM<=Q6+1 at 0[100/E, /ML"%P'01 at _@!=$3'0VP( +MBT/X_^"+1 at 0[100/G, /ML"%P'0%@_@!= J#Q0B#[PB+!NO?QT?\X 4%"(M% +M!(D'C7?\@\4(N/00" CKQL='_. %!0B+102)!XUW_(/%"+CT$ @(ZZV)]@$ +M 0 6 C47P.T-4UQW-XM%"(M.!(G"P>H%@^ ?#ZL$D<=' +M^&P7!PB+102)1_R+10B)!XEU"(U'^(E%!(/%!+B\%@<(_^#'0VP, BT/X +MZ_*0(0 "0 "#QP@[>UQW%8M&!#M%! ^4P ^VP(7 =!&#^ %T1,=#; @ +M "+0_C_X(M&!#M%! ^

    -=_R#Q0BX]! (".O&QT?\X 4%"(M%!(D'C7?\@\4(N/00" CKK8GV +M 0 ! !8 "-1? [0U1R(<=%^/00" B)=?R+1 at B)1?2+=@3'1?#X%P<(@^T0 +MBP;_X(M#^.OYB?:$ ) (/'##M[7'UQW/HM%$(M.!(G"@^(?P>@%#Z,4 at 0^2PH32=3''1_C,J00( +MBT4$B4?\BT48B0>-1_B)11B)=1"#Q0RX?!D'"/_ at QT-L# (M#^.ORB740 +MBW4(QT,$B%P)",=%"*09!PB#Q0B#[PRX(/8'".O1D 0 D @\4$Z43_ +M__]& ) (/'##M[7'<^BT4(BTX$B<*#XA_!Z 4/HQ2!#Y+"A-)U,<=' +M^,RI! B+112)1_R+11B)!XU'^(E%&(EU%(/%#+A\&0<(_^#'0VP, BT/X +MZ_*)=12+=03'0P2(7 D(QT4(,!H'"(/%"(/O#+@@]@<(Z]&0( +M ! "4 ")=?R+1 at 2)10"+50B+1 at B)10B)UL=%^+09!PB#[0C_)HM& +M!(E%_(M&"(E% (M%#(EU#(G&QT7X0!H'"(/M"/\F# P +M "4 "+=0R#Q1#_90"-=@"+1 at B)10"+=@3'1?S(&@<(@^T$_R:0D) ( +M& (U%]#M#5')"@\<,.WM<=SK'1_@\_0<(@^P,5NA8J0 @\00C4?XB48$ +MQP98_ <(QT7X]! ("(E%_,=%]/#L" B#[0RXP*T$"/_ at QT-L# (M#^.OR +MD) ( & (U%]#M#5')"@\<,.WM<=SK'1_@\_0<(@^P,5NCXJ @\00 +MC4?XB48$QP98_ <(QT7X]! ("(E%_,=%]&AT"0B#[0RXZ ,%"/_ at QT-L# +M (M#^.ORD) $ $ !$ "#QPP[>UQW'L='^)RI! C'1_Q47 D(BT4 +MB0>-=_B#Q02+10#_X,=#; P "^7'0)"(M#_.OMD"@ +M 0 $0 (U%_#M#5'(5OCQK"0C'1?R4' <(B<6XU-X'"/_ at OFAT"0B+ +M0_SK])#IT____XUV D @\<(.WM<=Q3'1_Q4$@4(B3>-=_R#Q02+ +M10#_X,=#; @ #'0R#^ N"S9!PCKZ9"0D @ 8 C47T.T-4UQW.L='^#S]!PB#[ Q6Z-"G "#Q!"-1_B)1 at 3'!EC\!PC'1?CT$ @( +MB47\QT7T['@)"(/M#+CH P4(_^#'0VP, BT/XZ_*0D $ 0 % _V4 +MD $ 0 ) _V4 D L @ $0 (MU ,=% 'P=!PC_)B$ D +MBT4$B44 BT8$B44$Z:\ "-=@ ! ) (M5!(M&!(E%!(G6QT4 8!T' +M"/\F! ! 1 BW4 @\4$_R83 , !$ "+=0#'10 '@<( +M_R9B ) (M%!(E% (M%"(E%!(M&!(E%".EU 0 D"( D BU4( +MBT8$B44(B=;'10#$'0<(_R8" ) (M5!(M&!(E%!(G6QT4 Y!T'"/\F +M" " 1 C47\.T-4UQW +M.L='^#S]!PB#[ Q6Z!2F "#Q!"-1_B)1 at 3'!EC\!PC'1?CT$ @(B47\QT7T +M".T("(/M#+C K00(_^#'0VP, BT/XZ_*0D @ 8 C47T.T-4UQW.L='^#S]!PB#[ Q6Z+2E "#Q!"-1_B)1 at 3'!EC\!PC'1?CT$ @( +MB47\QT7T1.T("(/M#+C K00(_^#'0VP, BT/XZ_*0D P P $0 +M (M%!#M% ^=P ^VP(7 = 6#^ %T![BL(0<(_^"X@!\'".OWD P P +M$0 (/')#M[7'<5BT4(.T4$#YS #[; AUQW%8M% #M&" ^?P ^V +MP(7 =!&#^ %T4L=#;"0 "+0_S_X,='X&@@!PB)=^2+1 at 2)1^B+10")1^S' +M1_ UQW%8M%"#M%! ^?P ^VP(7 =!:# +M^ %T6L=#;"0 "^M'0)"(M#_/_ at QT?@?",'"(M%"(E'Y(M%!(E'Z(M% (E' +M[,='\!RK! B+10")1_3'1_C,J00(C4?PB4?\C4?@B0>-=_B#Q0R+10"+0.P# +M10#KM8M%"#M% ^?P ^VP(7 = 6#^ %T.,='X!RK! B+10")1^3'1^C,J00( +MC4?@B4?LQT?P5%P)"(UWZ(/%#(/O$(M% (M [ -% .EH____OE1<"0B#Q0R# +M[R2+10"+0/ #10#I3____XUV $ @ 2 C47T.T-4+1 at B)1?2- +M=_B#[0RXT"('"/_ at QT-L# (M#^.OR! ! 1 BW4 QT4 [",' +M"/\F "0 "#?@1\=1.^7%P)"(/%!(M% (M \ -% /_ at OEA<"0B#Q02+ +M10"+0.P#10#KZY3) 0 ( & # (U%[#M#5')0@\<,.WM<=TC'1_@\_0<( +M@^P,5NA\H @\00C4?XB48$QP98_ <(QT7X]! ("(E%_,=%\$1H"0C'1>SP +M; D(QT7TD"0'"(/M%+A0(P8(_^#'0VP, BT/XZ_( ) (/'##M[ +M7'<P4=0D(QT7TL"4'"(/M%+A0(P8(_^#'0VP, +MBT/XZ_( ) (/'##M[7'<UQW5,='[#S]!PB#[ Q6Z*R> "#Q!"-1^R)1 at 3'!EC\!PC'1?CT$ @( +MB47\V>[ D(@^T0N P7!@C_X,=#; P "+0_CK +M\I"0D!3( 0 ( & ! (U%\#M#5'))@\<,.WM<=T''1_@\_0<(@^P,5NA8 +MG0 @\00C4?XB48$QP98_ <(QT7X]! ("(E%_,=%]%QG"0C'1? >0D(@^T0 +MN P7!@C_X,=#; P "+0_CK\I"0D @ 8 C47T.T-4UQW +M.L='^#S]!PB#[ Q6Z/"< "#Q!"-1_B)1 at 3'!EC\!PC'1?CT$ @(B47\QT7T +M8.\("(/M#+C K00(_^#'0VP, BT/XZ_*0D @ 8 C47T.T-4UQW.L='^#S]!PB#[ Q6Z)"< "#Q!"-1_B)1 at 3'!EC\!PC'1?CT$ @( +MB47\QT7T<.\("(/M#+C K00(_^#'0VP, BT/XZ_*0D @ 8 C47X +M.T-4UQW0\='\#S]!PB#[ Q6Z#"< "#Q!"-1_")1 at 3'!EC\!PC' +M1?CT$ @(B47\QT?\X 4%",<' 0 (UW_(/M"+CT$ @(_^#'0VP4 BT/X +MZ_*0 " !@ "-1?0[0U1R0H/'##M[7'UQW.L='^#S]!PB# +M[ Q6Z+R. "#Q!"-1_B)1 at 3'!EC\!PC'1?CT$ @(B47\QT7T3'<)"(/M#+B@ +M6 <(_^#'0VP, BT/XZ_*0D 0 0 $0 (MU ,=% %PV!PC_)@ +M D @\<(.WM<=QF+1 at 3WV,='_. %!0B)!XUW_(/%!(M% /_ at QT-L" +M (M#^.ORD)"0! ! 1 BW4 QT4 K#8'"/\F "0 "+1 at 2% +MP'4-OGQW"0B#Q02+10#_X,'H'W0%@_@!= V^:'<)"(/%!(M% .OGOG!W"0B# +MQ02+10#KV at L @ $0 (MU ,=% #PW!PC_)B$ D @\<(.WM< +M=QN+100/KT8$QT?\X 4%"(D'C7?\@\4(BT4 _^#'0VP( BT/XZ_*0 0 +M "0 "+502+1 at 2)102)UL=% 0W!PC_)@L @ $0 (MU ,=% *@W +M!PC_)B$ D @\<(.WM<=QJ+100K1 at 3'1_S@!04(B0>-=_R#Q0B+10#_ +MX,=#; @ "+0_CK\HGV 0 "0 "+502+1 at 2)102)UL=% ' W!PC_)A, +M P $0 (MU ,=% /@W!PC_)B( D BT4$B44 BT8$B44$Z1O< +M_?^-=@ " ) (M5!(M&!(E%!(G6QT4 W#<'"/\F! ! 1 +MC47X.T-4<@Z+=0#'10! . <(BP;_X+Z,=PD(BT/\Z_0 ) ,=% %1< +M"0B+1 at 2)1?S'1?@ @^T(Z:S;_?\$ $ !$ "+=0#'10!\. <( +M_R8 ) (/'"#M[7'<1BT8$A-=_R#Q02+10#K +MQI"0D L @ $0 (MU ,=% "@Y!PC_)B$ D @\<(.WM<=QJ+ +M100#1 at 3'1_S@!04(B0>-=_R#Q0B+10#_X,=#; @ "+0_CK\HGV 0 "0 +M "+502+1 at 2)102)UL=% / X!PC_)@L @ $0 (MU ,=% * Y!PC_ +M)B$ D BT4$.T8$#Y3 #[; A-=_R#Q02+10#_X,=#; @ "X]-,'".OPB?8L +M )0 (/'"#M[7'<7QT?\X 4%"(M&!(D'C7?\@\4$BT4 _^#' +M0VP( BT/XZ_*0BT8$B4,$BW8(QT4 U#D'".GOL0 D)"0"P " 1 +M BW4 QT4 L#H'"/\F(0 "0 "+100[1 at 0/E, /ML")1"0(P> "B[#X +MR0@(@\4(BU0D"/?:BT4 BT20\ -% /_ at B?8! ) (M5!(M&!(E%!(G6 +MQT4 >#H'"/\F " !@ "-1?0[0U1R0H/'##M[7' "B[#XR0@(@\4(BU0D"/?:BT4 BT20\ -% /_ at B?:+ +M1 at 2)0P2+=@B+102)0PC'1018.P<(@\4$Z8ZO ")]@ D B?#WT,'H +M'XE$) C!X *+L/C)" B#Q02+5"0(]]J+10"+1)#P T4 _^"-=@ ) +M (GP]]#!Z!^)1"0(P> "B[#XR0@(@\4$BU0D"/?:BT4 BT20\ -% /_ at C78 +M( 0@ "4 "+102)0P2+1 at 2)0PB+=0C'10CP.P<(@\4( +MZ?*N ")]HM%!(E#!(M&"(E#"(M&!(E##(MU",=%""0\!PB#Q0CI**\ !0 +M $ E BU4$BT8$B44$B=;'10"8.P<(_R:+1 at 2)10"+ +M502+1 at B)102)UL=%_&0\!PB#[03_)I"0D L @ $0 (U%_#M#5'(. +MBW4 QT4 A#X'"(L&_^"^N'<)"(M#_.OT "0 ")\,'H'XE$) C!X *+ +ML/C)" B#Q02+5"0(]]J+10"+1)#P T4 _^"0, (0 "4 +M "+100[1 at 0/G\ /ML")1"0(P> "B[#XR0@(@\4(BU0D"/?:BT4 BT20\ -% +M /_ at B?:+1 at 2)0P2+=@B+102)0PC'100D/0<(@\4$Z<:M ")]@ D +MA?8/G\ /ML")1"0(P> "B[#XR0@(@\4$BU0D"/?:BT4 BT20\ -% /_ at B?8 +M ) (7V#Y_ #[; B40D",'@ HNP^,D("(/%!(M4) CWVHM% (M$D/ # +M10#_X(GV( 0@ "4 "+102)0P2+1 at 2)0PB+=0C'10BX +M/0<(@\4(Z2JM ")]HM%!(E#!(M&"(E#"(M&!(E##(MU",=%".P]!PB#Q0CI +M8*T !0 $ E BU4$BT8$B44$B=;'10!@/0<(_R:+ +M1 at 2)10"+502+1 at B)102)UL=%_"P^!PB#[03_)I"0D,2R 0 ( & # (U% +M\#M#5')'@\<,.WM<=S_'1_@\_0<(@^P,5NC+10B)11"-=_"#Q1"X%$$'"/_ at QT-L% +[< +M=PD(BT/\Z^V)]@ $ E BT4$B74$B<:#Q03IN +M , 2 C47H.T-4UQW,<=']&1 !PB+112)1_B+11")1_R+10R)!XM%%(E%$(U'](E%%(MU +M"(/%#+B<( @(_^#'0VP0 BT/XZ_*-=@"+=02#Q13IB8L ) $ $ ! +M L "-1>0[0U1R,HM&$(E%\(M&#(E%](EU^(M&"(E%_(M&!(E%Z(M% (E% +MY,=%[+1 !PB#[1RX .(&"/_ at BT/\Z_F0! ! 1 C47\.T-4+ +M10")1?S'10!<9PD(@^T$N"@.!@C_X+[@=PD(BT/\Z_20D) + ( !$ +M "#QPP[>UQW'\='^-A!!PB+10")1_R+102)!XU'^(E%!+@\2@<(_^#'0VP, +M ON1W"0B+0_SK[0( 5 C47P.T-4@?= 6#^ %T+(-^! !U$[Z(9PD( +M@\4$BT4 BT#P T4 _^"^7&<)"(/%!(M% (M \ -% .OKOE1G"0B#Q02+10"+ +M0/ #10#KV(M&!(E#!(MV",=#" #'10 H0@<(Z8"H ( & (U% +M]#M#5')"@\<,.WM<=SK'1_@\_0<(@^P,5NBD at 0 @\00C4?XB48$QP98_ <( +MQT7X]! ("(E%_,=%])#Q" B#[0RXP*T$"/_ at QT-L# (M#^.ORD) ( +M& (U%]#M#5')"@\<,.WM<=SK'1_@\_0<(@^P,5NA$@0 @\00C4?XB48$ +MQP98_ <(QT7X]! ("(E%_,=%]+SQ" B#[0RXP*T$"/_ at QT-L# (M#^.OR +MD) + ( !$ "-1?P[0U1R#HMU ,=% 1&!PB+!O_ at O@QX"0B+0_SK +M] D A?8/G\ /ML"%P'0%@_@!=#*)\,'H'W0%@_@!=!.^I&H)"(/% +M!(M% (M [ -% /_ at OJQJ"0B#Q02+10"+0.@#10#KZ[ZH:@D(@\4$BT4 BT#P +M T4 Z]B)]F0 "$ E BT4$.T8$#Y3 #[; A% +M]@^?P ^VP(7 = 6#^ %T$[ZD:@D(@\4$BT4 BT#L T4 _^"^K&H)"(/%!(M% +M (M Z -% .OKOJAJ"0B#Q02+10"+0/ #10#KV(GV "0 ")\,'H'W0% +M at _@!=#>%]@^?P ^VP(7 = 6#^ %T$[ZD:@D(@\4$BT4 BT#L T4 _^"^K&H) +M"(/%!(M% (M Z -% .OKOJAJ"0B#Q02+10"+0/ #10#KV(GV( +M 0@ "4 "+102)0P2+1 at 2)0PB+=0C'10C at 1 <(@\4(Z:JE ")]HM% +M!(E#!(M&"(E#"(M&!(E##(MU",=%"$!%!PB#Q0CIX*4 !0 +M $ E BU4$BT8$B44$B=;'10!41 <(_R:+1 at 2)10"+502+1 at B)102) +MUL=%_*Q%!PB#[03_)I"0D @ 8 C47T.T-4UQW.L='^#S] +M!PB#[ Q6Z&!^ "#Q!"-1_B)1 at 3'!EC\!PC'1?CT$ @(B47\QT7TZ/$("(/M +M#+C K00(_^#'0VP, BT/XZ_*0D L @ $0 (U%_#M#5'(.BW4 +MQT4 ,$@'"(L&_^"^('@)"(M#_.OT "0 ")\/?0P>@?B40D",'@ HNP +M^,D("(/%!(M4) CWVHM% (M$D/ #10#_X(UV # "$ E +M BT4$.T8$#Y[ #[; B40D",'@ HNP^,D("(/%"(M4) CWVHM% (M$D/ # +M10#_X(GVBT8$B4,$BW8(BT4$B4,(QT4$S$8'"(/%!.D:I B?8 ) +M (7V#Y[ #[; B40D",'@ HNP^,D("(/%!(M4) CWVHM% (M$D/ #10#_X(GV +M "0 "%]@^>P ^VP(E$) C!X *+L/C)" B#Q02+5"0(]]J+10"+1)#P +M T4 _^")]B $( E BT4$B4,$BT8$B4,(BW4(QT4( +M9$<'"(/%".E^HP B?:+102)0P2+1 at B)0PB+1 at 2)0PR+=0C'10B81P<(@\4( +MZ;2C 4 ! )0 (M5!(M&!(E%!(G6QT4 #$<'"/\F +MBT8$B44 BU4$BT8(B44$B=;'1?S81P<(@^T$_R:0D) + ( !$ "- +M1?P[0U1R#HMU ,=% /Q)!PB+!O_ at OB1X"0B+0_SK] D A?9U$[Y< +M7 D(@\4$BT4 BT#P T4 _^"^6%P)"(/%!(M% (M [ -% .OKB?8P +M A )0 (M%!#M&! ^5P ^VP(E$) C!X *+L/C)" B#Q0B+5"0( +M]]J+10"+1)#P T4 _^")]HM&!(E#!(MV"(M%!(E#",=%!)A(!PB#Q03I3J( +M (GV "0 "%]G43OEQ<"0B#Q02+10"+0/ #10#_X+Y87 D(@\4$BT4 +MBT#L T4 Z^N)]@ D A?9U$[Y<7 D(@\4$BT4 BT#P T4 _^"^6%P) +M"(/%!(M% (M [ -% .OKB?8@ !" )0 (M%!(E#!(M& +M!(E#"(MU",=%"#!)!PB#Q0CILJ$ (GVBT4$B4,$BT8(B4,(BT8$B4,,BW4( +MQT4(9$D'"(/%".GHH0 % 0 "4 "+502+1 at 2)102) +MUL=% -A(!PC_)HM&!(E% (M5!(M&"(E%!(G6QT7\I$D'"(/M!/\FD)"0"P " +M 1 @\<8.WM<=S;'1^S,2@<(BT4 B4?PBT4$B4?TQT?XS*D$"(M% +M (E'_(U'[(D'C7?X@\4(BT4 BT#L T4 _^#'0VP8 OBAX"0B+0_SK[9 " +M %0 (U%\#M#5'(@QT7X]! ("(EU_(M&"(E%](M&!(E%\(/M$+ at H#@8( +M_^"+0_CK^8UV ( 5 C47P.T-4UQW,L=%^/00" B)=?S' +M1_B42@<(BT8$B4?\BT8(B0>+1 at B)1?2-1_B)1?"#[1"X/$H'"/_ at QT-L# +M (M#^.ORB?83 , !$ "#QQ [>UQW*,=']*Q+!PB+102)1_B+10") +M1_R+10B)!XU'](E%"(MU +B<( @(_^#'0VP0 OBQX"0B+0_SK[8UV ( +M 5 C47P.T-4P[0U1R0(/'##M[7'UQW*<=%^/00" B)=?S' +M1_QD30<(BT8$B0>+1 at B)1?2-=_R#[0RX9$T'"/_ at QT-L" (M#^.ORC78 +M+*0! , 2 $ C47L.T-4UQW.<=%^/00" B)=?S'1_B<30<( +MBT8$B4?\BT8,B0>-1_B)1?2+1 at B)1?#'1>P @^T4N'1>!PC_X,=#; P +M "+0_CK\HUV P O*,! $ E , QT4 G& )".F at 7OW_@\<< +M.WM<=SW'1^CP30<(BT4$B4?LBT8$B4?PBT8(B4?TQT?XS*D$",='_-!@"0B- +M1^B)!XUW^(/%"(M% (M [ -% /_ at QT-L' (M#^.ORD)"0! ! 1 +M BW4 @\4$_R85 4 !$ "#QQ0[>UQW,<='\ 10!PB+11")1_2+ +M10R)1_B+10")1_R+102)!XM%"(E%$(UW\(/%$+@$4 <(_^#'0VP4 OD1X +M"0B+0_SK[8GV 0 "4 "+102)=02)QH/%!.FX +M P !( "-1>@[0U1R+<=%^/00" B)=?R+1 at R)1?2+1 at B)1>R+1 at 2)1>C' +M1? \3P<(@^T8N"@.!@C_X(M#^.OYB?9( % )0 (/' +M$#M[7'UQW&8M&!#T " =1N^ +M9&<)"(/%!(/O"(L&_^#'0VP( BT/XZ_+WV,='_&P/!0B)!XUW_(/%!(M% +M (M \ -% .O6C78 @\<,.WM<=R6+5 at CWVL='^'P*!0B+1 at 2)1_R)%XUW^(/% +M!(M% (M [ -% /_ at QT-L# (M#^.ORD)"0$P # 1 @\<,.WM< +M=R7'1_ at T4@<(BT4(B4?\BT4$B0>+10")10B-=_B#Q0BX-%('"/_ at QT-L# +M +Y0> D(BT/\Z^V)]@ $ E BT4$B74$B<:#Q03I +MR , 2 C47H.T-4UQW/,='Z'11!PB+10R)1^R+10B)1_"+102)1_3'1_C,J00(BT4, +MB4?\C4?HB0>-=_B#Q1"+10"+0.P#10#_X,=#;!P "+0_CK\KY47 D(@\40 +MBT4 BT#P T4 _^"0! ! ( . C47L.T-4S'1?3$40<(@^T4N/P\!PC_X(M#_.OYD*R? 0 $ $ !$ +M 0"+=0#'10"84@<(_R9D (R? 0 )0 ! (/'"#M[7'<:BU8$ +M@?H " =1N^9&<)"(/%!(/O"(L&_^#'0VP( BT/XZ_*)T/?0P>@?= 6# +M^ %T'HG0]]C'1_QL#P4(B0>-=_R#Q02+10"+0/ #10#KQH/%!(/O"(L&Z[R# +MQPP[>UQW#XM&"/?0P>@?=!&#^ %T,<=#; P "+0_C_X(M6"/?:QT?X? H% +M"(M&!(E'_(D7C7?X@\4$BT4 BT#L T4 Z]F#Q02#[PR+!NO/D) + ( +M !$ "-1?P[0U1R'8M% (E%_(M%!(E% ,=%!)13!PB#[02X$!0&"/_ at OEQX +M"0B+0_SK]) ) (/'##M[7'<:QT?XG*D$"(EW_(M% (D'C7?X@\4( +MBT4 _^#'0VP, QT, at _@ ;@LV0<(Z^F0$P # 1 @\<,.WM< +M=R7'1_@$50<(BT4(B4?\BT4$B0>+10")10B-=_B#Q0BX!%4'"/_ at QT-L# +M +Y@> D(BT/\Z^V)]@ $ E BT4$B74$B<:#Q03I +MR , 2 C47H.T-4UQW/,='Z$14!PB+10R)1^R+10B)1_"+102)1_3'1_C,J00(BT4, +MB4?\C4?HB0>-=_B#Q1"+10"+0.P#10#_X,=#;!P "+0_CK\KY47 D(@\40 +MBT4 BT#P T4 _^"0! ! ( . C47L.T-4S'1?245 <(@^T4N #B!@C_X(M#_.OYD."< 0 $ $ !$ +M 0"-1?@[0U1R'HM% (E%_,=% %1<"0C'1?@ @^T(N'1>!PC_X+YD> D( +MBT/\Z_2HG $ " !@ P"-1? [0U1R1X/'##M[7'<_QT?X//T'"(/L#%;H +M'&\ (/$$(U'^(E&!,<&6/P'",=%^/00" B)1?S'1?2 : D(OJ!<"0B#[1"X +M)!P("/_ at QT-L# (M#^.ORD$B< 0 ( & ! (U%\#M#5')'@\<,.WM< +M=S_'1_@\_0<(@^P,5NBT;@ @\00C4?XB48$QP98_ <(QT7X]! ("(E%_+XD +M; D(QT7T4%8'"(/M$+B0S <(_^#'0VP, BT/XZ_*0 "0 "+=@B# +MQ03_)A0 ! $0 (U%^#M#5'(=BT4,B47\BT4 B47XQT4 %@'"(/M +M"+@,%P8(_^"^E'@)"(M#_.OTD D B?#WT,'H'XE$) C!X *+L/C) +M" B#Q02+5"0(]]J+10"+1)#P T4 _^"-=@ P A )0 +M (M%!#M&! ^>P ^VP(E$) C!X *+L/C)" B#Q0B+5"0(]]J+10"+1)#P T4 +M_^")]HM&!(E#!(MV"(M%!(E#",=%!)Q6!PB#Q03I2I0 (GV "0 "% +M]@^>P ^VP(E$) C!X *+L/C)" B#Q02+5"0(]]J+10"+1)#P T4 _^")]@ +M D A?8/GL /ML")1"0(P> "B[#XR0@(@\4$BU0D"/?:BT4 BT20\ -% +M /_ at B?8@ !" )0 (M%!(E#!(M&!(E#"(MU",=%"#17 +M!PB#Q0CIKI, (GVBT4$B4,$BT8(B4,(BT8$B4,,BW4(QT4(:%<'"(/%".GD +MDP & @P "4 "+1 at 2)10R+10B)10#'10C<5@<(Z?2^ +M_O^+1 at B)10R+102)10"+10B)1?R+1 at 2)10C'102H5P<(@^T$Z D(BT/\Z_0 +M) ,=% %1<"0B+1 at 2)1?S'1?@ @^T(Z7B[_?^8F0$ ! ! 1 +M $ @\<4.WM<=R3'1_#H6 <(BT4 B4?TQT?\C%L'"(U'\(D'C7?\@\4$BT4 +M_^#'0VP4 OIQX"0B+0_SK[8UV $ 0 3 C47T.T-4UQW-<=%^/00" B)=?S'1_BD"@@(BT80B4?\BT8,B0>-1_B)1?2+1 at B)1?"+ +M=@2#[12XG" ("/_ at QT-L# (M#^.ORC78 . P "4 +M "#QPP[>UQW),='^,RI! C'1_R$8 D(BT4(B0>-=_B#Q1"+10"+0.P#10#_ +MX,=#; P "+0_CK\H/'(#M[7'=#QT?D&%D'"(M%#(E'Z(M&!(E'[(M&"(E' +M\(M%!(E'],='^,RI! C'1_R,8 D(C4?DB0>-=_B#Q1"+10"+0.P#10#_X,=# +M;" "+0_CK\I $ $ @ X "-1?0[0U1R(HEU^(M&"(E%_(M5 (M& +M!(E% (G6QT7T@%D'"(/M#(L&_^"+0_SK^9 # $@ (U%]#M#5'(W@\<, +M.WM<=R_'1?CT$ @(B77\QT?X'%H'"(M&!(E'_(M&"(D'BT8,B47TC7?X@^T, +MN!Q:!PC_X,=#; P "+0_CK\I $ $@ (U%[#M#5')#@\<0.WM<=SO' +M1?CT$ @(B77\QT?T5%H'"(M&!(E'^(M&"(E'_(M&$(D'C4?TB47TBT8,B47P +MBW8$@^T4N)P@" C_X,=#;! "+0_CK\I 0 "27 0 " )0 ! +M ,=%!)Q@"0B#Q03IY5']_Y"#QR [>UQW0\='Y*A:!PB+102)1^B+10B)1^R+ +M1 at 2)1_"+1 at B)1_3'1_C,J00(QT?\T& )"(U'Y(D'C7?X@\4,BT4 BT#L T4 +M_^#'0VP@ BT/XZ_*0K)8! L @ ! # ! (U%_#M#5'(9BU4 BT8$ +MB44 B=;'1?P46P<(@^T$BP;_X(M#_.OYD) $ $ !$ "-1?P[0U1R +M#HMU ,=% .A;!PB+!O_ at OJ1X"0B+0_SK] D QT4 <%P)"(MV!(/M +M!.DJP D) ( $ !$ "^0 /]E .GS____ +MD)"0 " !@ "-1?0[0U1R0H/'##M[7'-=_R#Q0B+10#_X,=#; @ +M "XK-('".OPC78 "0 ")=0#'0P1<7 D(QT7\.%T'"(/M!.F7F +MD)"0&)4! @ 8 $ C47P.T-4UQW0<='^#S]!PB#[ Q6Z AG +M "#Q!"-1_B)1 at 3'!EC\!PC'1?CT$ @(B47\QT7T- ,=%\ AC"0B#[1"X +M\+H%"/_ at QT-L# (M#^.ORD)"0Z)0! @ 8 $ C47P.T-4UQW0<='^#S]!PB#[ Q6Z)QF "#Q!"-1_B)1 at 3'!EC\!PC'1?CT$ @(B47\ +MQT7T-0 ,=%\ AC"0B#[1"X\+H%"/_ at QT-L# (M#^.ORD)"0?)0! \ +M P $0 ! (U%^#M#5'(3 at WT !@^?P ^VP(7 = ^#^ %T%+X0>0D(BT/\ +M_^"#Q02XF%\'".OTQT7\B&<)"(M%!(E%^,=% #1?!PB#[0BX .(&".O6C78 +M()0! ( 5 $ C47P.T-4UQW,\=%^/00" B)=?S'1_C,J00( +MQT?\,'D)"(M&"(D'C4?XB47TBT8$B47P@^T0N)A?!PC_X,=#; P "+0_CK +M\I ( +R3 0 " )0 ! (/%!.E< @\<8.WM<=S?'1^S07@<( +MBT4$B4?PBT4(B4?TQT?XS*D$",='_"AY"0B-1^R)!XUW^(/%#(M% (M [ -% +M /_ at QT-L& (M#^.ORD%R3 0 + ( !$ 0"-1?0[0U1R'L=%^(AG +M"0B+10")1?3'1?S48 <(@^T,N #B!@C_X+X8>0D(BT/\Z_0 +M ! )0 (EU .E0 0 4 #\D@$ 0 "4 0"#QP@[>UQW +M'8M&!#T " =1^^9&<)",=% -Q?!PB#[PB+!O_ at QT-L" (M#^.OR]]C' +M1_QL#P4(B0>-=_S'10#<7P<(N-Q?!PCKUHUV (/'##M[7'-=_C'10#<7P<(N-Q?!PC_X,=#; P "+0_CK\HUV &22 +M 0 " %0 ! (U%\#M#5'(AQT7X]! ("(EU_(M&"(E%](MV!,=%\/A?!PB# +M[1"+!O_ at BT/XZ_F)]@@ ()(! ( E $ @\4$Z5@ "#QQ@[ +M>UQW-\='[)!@!PB+102)1_"+10B)1_3'1_C,J00(QT?\('D)"(U'[(D'C7?X +M@\4,BT4 BT#L T4 _^#'0VP8 BT/XZ_*0"P " 1 C47T.T-4 +M0D(BT4 B47TQT7\&&,'"(/M#+@ X at 8(_^"^.'D)"(M#_.OT @ +M "0 "#QQ0[>UQW+XU&,,='\+2I! B)1_3'1_C,J00(C4?PB4?\BT4(B0>- +M1_B)10B#Q02X-&$'"/_ at QT-L% +CTTP<(Z_"-=@!( " +M )0 (/'%#M[7'UQW,XM&!(/ ,,='\+2I! B)1_3'1_C,J00(C4?PB4?\BT4$B0>- +M=_B#Q0B+10"+0.P#10#_X,=#;!0 "+0_CK\I"+1 at 2)0P2+=@C'10!(8@<( +MZ4.) "-=@ < " )0 ,=% #QY"0B+102)1?S'100P +M8@<(@^T$Z=RP_O^+=03'102D8@<(@\4$_R:058GE5U93@>RL BWT(C5V( +M@?\ ! ?AN#[ QH^/((".AU&P Z#PP_?^#. 0/A62)182+1>")18"+ +M18R)A7S___^+18B)A7C___^-!)N--(4 BX;HA at D(BY;LA at D(BTV$,=$S +M18 )P74BBX;@A at D(BY;DA at D(BXU\____,=$SA7C___\)P0^$Y0 $,['<"& +M"0A\LX-]$ /A( "[ #L=Q(8)"'USBT7DB85T____BT7 at B85P____ +MBT6,B85L____BT6(B85H____C02;C32% (N&Z-8)"(N6[-8)"(N-=/__ +M_S'1,X5P____"<%U'HN&X-8)"(N6Y-8)"(N-;/___S'1,X5H____"<%T94,[ +M'<2&"0A\L8L-Q(8)"(U! :/$A at D(C0R)P>$"BT6(BU6,B8'@U at D(B9'DU at D( +MBT7 at BU7DB8'HU at D(B9'LU at D(B;GPU at D(N #I?0$ +C_____Z7,! "X +M_____^EI 0 N/_____I7P$ +C_____Z54! "X .E+ 0 NP [ +M'<2&"0A]=XM%Y(F%9/___XM%X(F%8/___XM%C(F%7/___XM%B(F%6/___XT$ +MFXTTA0 "+ANC6"0B+ENS6"0B+C63___\QT3.%8/___PG!=2*+AN#6"0B+ +MEN36"0B+C5S___\QT3.%6/___PG!#X1Q____0SL=Q(8)"'RMNP ['<"& +M"0A]=XM%Y(F%5/___XM%X(F%4/___XM%C(F%3/___XM%B(F%2/___XT$FXTT +MA0 "+ANB&"0B+ENR&"0B+C53___\QT3.%4/___PG!=2*+AN"&"0B+EN2& +M"0B+C4S___\QT3.%2/___PG!#X3W_O__0SL=P(8)"'RMBPW A at D(C4$!H\"& +M"0B-#(G!X0*+18B+58R)@>"&"0B)D>2&"0B+1>"+5>2)@>B&"0B)D>R&"0B) +MN?"&"0BX (UE]%M>7\G#58GE5U:+30BZ #L5P(8)"'U0C022.0R% +M\(8)"'4[0CL5P(8)"'TE_+@% C322P>8"C;[,A at D(@<;@A at D(B<'SI4([ +M%<"&"0A\X?\-P(8)"+@ ZVM".Q7 A at D(?+"Z #L5Q(8)"'U0C022 +M.0R%\-8)"'4[0CL5Q(8)"'TE_+@% C322P>8"C;[,U at D(@<;@U at D(B<'S +MI4([%<2&"0A\X?\-Q(8)"+@ ZPY".Q7$A at D(?+"X 0 %Y?R<-5B>56 +M4XM="(MU#(M5$(M-%+@! .564XM="(MU#(M5$(M-%+@! .R<-5B>564XM= +M"(MU#(M5$(M-%+@! .53BT4(BU4,BTT0BUT4,<@QV at G0#Y7 +M#[; 6\G#58GE5E.+70B+=0R+51"+312X 0 #G.? M_!#G3<@6X %M> +MR<-5B>564XM="(MU#(M5$(M-%+@! .6#[ C_=13_=1#_=0S_=0CH +MF5 ! (/$$,G#58GE@^P(_W44_W40_W4,_W4(Z'E. 0"#Q!#)PU6)Y8/L"/]U +M%/]U$/]U#/]U". at -30$ @\00R<-5B>6+10B+50SWV(/2 /?:R<-5B>6+11"+ +M510#10 at 350S)PU6)Y8M%"(M5#"M%$!M5%,G#58GE5U93@^P,BTT0BUT4BT4( +M]^&)1>B+=0@/K_.)UP'W#Z]-#(T,#XE-[(M%Z(M5[(/$#%M>7\G#58GE4XM% +M"(M5#(M-$(M=%"'((=I;R<-5B>53BT4(BU4,BTT0BUT4"<@)VEO)PU6)Y5.+ +M10B+50R+31"+710QR#':6\G#58GEBT4(BU4,]]#WTLG#58GEBTT0BT4(BU4, +M#Z7"T^#VP2!T!XG"N #)PU6)Y8M-$(M%"(M5# ^MT-/J]L$@= >)T+H +M R<-5B>6+31"+10B+50P/I<+3X/;!('0'B<*X ,G#58GEBTT0BT4( +MBU4,#ZW0T_KVP2!T!8G0P?H?R<-5B>6+31"+10B+50P/K=#3ZO;!('0'B="Z +M ,G#58GEBT4(F6+10B+50S)PU6)Y8M%"+H +MR<-5B>6+10C)PU6)Y8M%"(M5#,G#58GE5E.+10R+=0BY +L A?9T +M287V?P>#_O]T$.L>@_X!=1F+"+L ZS"+"+L ]]F#TP#WV^L at BPB[ +M (M !(G"N !P1'3A?9Y!_?9@], ]]N)R(G:6U[)PU6)Y593BT4, +MBW4(N0 "[ (7V=$F%]G\'@_[_=!#K'H/^ 749BPB[ .LPBPB[ +M /?9@], ]]OK((L(NP "+0 2)PK@ <$1TX7V>0?WV8/3 /?; +MBR<.0D%6)Y5>+?0BX +D@ _/.K7\G#D%6)Y5.#[ 2#Y/"# +M[!1HI*@$"/]U#/]U".A]%0 Z)L& "#Q AJ &A,6PD(Z#0% ")P^B&!@ +M@\00 at _L"=!.#^P)W!X/[ 70WZSR#^P-T&>LU@^P,:!3S" CHZQ( +CZ +M@\00ZRN#[ QH@?,(".C4$@ N/P "#Q!#K%+@ ZPV#[ QH//,(".AC +M$@ @^P,4.B(%@ N "+7?S)PX/L&&H"Z.=9 #' +2I! B+5"0 at B5 $ +M@\0#Q!")V(/$$%M>7\-3@^P4BQW@)@H(QP7@)@H( /\U+"H* +M".B7)0 @\0,BT at TC5'\B5 TQT'\R ("(M(-(U1_(E0-,=!_+ at 1" B+2#2- +M4?R)4#2+5"04B5'\BT at TC5'\B5 TQT'\]-$'"%/_="0<4.B")@ @\086\-3 +M@^P4BQW@)@H(QP7@)@H( /]T)"#H)R4 (/$#(M(-(U1_(E0-,=!_,@ +M" B+2#2-4?R)4#3'0?RX$0@(BT at TC5'\B5 TBU0D%(E1_(M(-(U1_(E0-,=! +M_/31!PA3_W0D(%#H$B8 (/$&%O#@^P,BU0D$(M$)!2#^ )T$X/X G<'@_@! +M=%CK.X/X W0# QP0D 0 .B3$ +M@\0,P\/#D,<%("H*" #'!20J"@@ QP4H*@H( @ ,<%+"H*" ! +M #'!30J"@A QP4X*@H( $ ,<%,"H*" #'!3PJ"@@ QP5( +M*@H( ,<%3"H*" "$#'!4 J"@@ QP5$*@H( 0,<%4"H*" ( +M #'!50J"@@" QP58*@H( 0 ,<%7"H*" #'!6 J"@@ QP5D +M*@H( ^0,<%<"H*"!0 ##55=64X/L#(ML)"#HM2/]_XL0ZP%%#[Y% /9$ +M0@$@=?2)[^B>(_W_BQ#K 4?Q6+$8M,)$2+!+&)1)4 BT0D2/\ ZRZ#?"0( +M '48BTPD0(L1BTPD1(L$L8D$D8M$)$#_ .L/@^P(:A]H'/P(".AR"0 1CG^ +M#XPA____ZQ\Y_GT;BTPD0(L1BTPD1(L$L8D$D8M$)$#_ $8Y_GSEBU0D0(L" +MBTPD1,<$@0 "+5"1(BP+'1(4 +X @SH #X[3!0 BT2U ( X +M+70O@^P,_S5 at A0D(Z& =_?^#Q C_=+4 :-GS" CH1 at D ,=$)!P! @\00 +MZ8X% "+1+4 #[Y 8/H/X/X.0^'7 at 4 /\DA;S\" C'1"0, 0 .EF!0 +M@^P,BT2U (/ E#H- < (7 >04%_P\ ,'X#*,T*@H(@\00A< /A3H% "# +M[ S_=+4 Z/@' "#Q!#I)@4 ,<%:"H*" $ #I%P4 (M$M0" > ( =#^# +MP *#[ 1J &H 4.CN&_W_@\00W5PD&(M$)!B+5"0@"HR at J"@B#Q!"%P ^%,P0 (/L#/]TM0#H +M\08 (/$$.D?! @^P,BT2U (/ E#H[04 ,'H J,L*@H(@\00A< /A?P# +M "#[ S_=+4 Z+H& "#Q!#IZ , (/L#(M$M0"#P )0Z+8% "%P'D%!?\/ +M #!^ RC,"H*"(/$$(7 #X6\ P @^P,_W2U .AZ!@ @\00Z:@# "+1+4 +M@\ "@^P$:@!J %#HA1K]_X/$$-U<)""+1"0 at BU0D)(E$)!B)5"0G?X/;$1707V06H_ @(VAM P @\00ZPZ#[ 1245#H;QC]_X/$ +M$(/$#,-55U93@>R4 BZPDJ (N\)+@ "^ (L$KX/ FAY] @( +M4.AJ%OW_@\00A@^P$ +M_S2?:)ST" A6Z+7^__^#Q!!#.YPDK 'SB@^P(:.4("0A6Z)K^__^X +M (/$$('$C %M>7UW#5U.#["2+7"0PN " .P /A,\ "#[ 1J &H +M4^CO%/W_@\00W5PD"(M$) B+5"0,B40D$(E4)!2+1"00BU0D%(E$)!B)5"0< +MB=_\N?____^P /*N]]$/OD09_H/X9W0%@_A'=1#9!;#\" C<3"08W5PD&.M, +M at _AM= 6#^$UU$-D%M/P("-Q,)!C=7"08ZS*#^&MT!8/X2W40V06L_ @(W$PD +M&-U<)!CK&(/X=W0%@_A7=0[9!;C\" C<3"08W5PD&-E\) 9FBT0D!K0,9HE$ +M) 3=1"08V6PD!-L<)-EL) :+!"2#Q"1;7\.#[!3_="08:*;T" CHS0 ,<$ +M) $ #HP at 0 %.#[!"+7"08:B__,^B9%_W_@\00A0F"@B) H7)= >AZ"8*"(D!PX/L&(M4 +M)""+1"0@F"@A2Z)G___^#Q!S#D)"0@^P,C40D%(/L"%#_="0< +M_Q40>@D(QP0D_@ . at S! @^P4_W0D'/]T)!S_%1!Z"0C'!"3^ Z!8$ +M "#[!#_="08_W0D&&BD_0@(Z*W___^#[ R-1"04@^P(4/]T)!S_%1AZ"0B# +MQ!S#@^P4_W0D'/]T)!S_%1AZ"0B#Q!S#@^P,C40D%(/L"%#_="0<_Q44>@D( +M@\0 _#\ - " B#Q!"%]G0- +MLOZA!"<*"(FP^#\ *$$)PH(C020HS at L"@B#[ AHZ"L*"&C8 @(Z)@Z ") +M'"3HD;T (/$%%M>PU.![ @! "#/?0F"@@ ?PV#[ QH6/X(".B=_/___PWT +M)@H(@SWT)@H( ^/I .A;,@ Z.06 #HD4@ (/L#&H Z.4! #'!"0! +M Z-D! #'!"0" Z,T! "#Q 2-G"2, 4^C5$_W_@\0(:A93Z"H2 +M_?^#Q R-1"0$4%-J .A*$OW_NP "#Q!!3Z/#]__^#Q 2%P'0/@^P$4&H +M4^BY$/W_@\000X/[ G[>@^P$:@"-1"0(4&H"Z \2_?_H'3( .BU00 @\00 +M@<0( 0 6\.#[ SH'/___X/$#,.#[ R#/?0F"@@!=1;H 4D .@"____@^P, +M_W0D'.@$ @\0,PX/L&/]T)!SH/!/]_U.#[!2+7"0<4^B>$/W_@\00AUU!;BH_@@(4%?HOA']_X/$$.D" +M 0 @_X =W*!^__)FCMW:H/L$&H :.@# !64^AH-0$ @\044&H :.@# !6 +M4^A*- $ @\00:@!HZ , %)0Z$4U 0"#Q!!0@^P,:@!H0$(/ %93Z"0T 0"# +MQ!Q0N++^" B%[74%N,3^" A05^A'$?W_@\0 at Z8L "#[!!J &CH P 5E/H +M_C0! (/$&%"#[ 1J &CH P 5E/HW3,! (/$$&H :.@# !24.C8- $ @\04 +M4&H :$!"#P!64^BZ,P$ @\00:@!HZ , %)0Z+4T 0"#Q!!0@^P,:@!H ,J: +M.U93Z)0S 0"#Q!Q0N-3^" B%[74%N.W^" A05^BW$/W_@\0 at B?B#Q Q;7E]= +MPX/L&/]T)!SH#@_]_X/$',.0D+@ P\/#P\.+1"0$9L= $@< QT 40'H) +M",.+5"0$9H-Z$@=U)F;'0A( *$4)PH(B4($B144)PH(@3T8)PH(0'H)"'4& +MB148)PH(PU.+1"0(BU@,@?LT>@D(=!;_@D(=!"+%21Z"0B+0 at RC)'H)".L5@^P,:@7H?C\ (G" +MQP"D_@<(@\00BT0D$(E"!(G0@\0,PX/L#($]('H)"#AZ"0AT$(L5('H)"(M" +M!*,@>@D(ZQB#[ QH! , . at Z/P B<+' +S^!PB#Q!#'0 at 0X>@D(QT(, +M (G0@\0,PU93@^P$BW0D$($]''H)"#QZ"0AT$(L=''H)"(M##*,<>@D(ZQ6# +M[ QJ!>CL/@ B#(/L#/]T)"SH +MP_[__XE8#,= $#1Z"0B#Q!"!^S1Z"0AT XE#$(E&#(E%"$<[?"0$7UW#5U93BT0D$(MP$(M^#('^ +M.'H)"'1*N0 Y^7,QC01)C02&BU at 0BT 8BU ,BT 0@?HT>@D(= .)0A ] +M-'H)"'0%B5 ,ZP.)4PQ!.?ERSXMV!+\ 0 @?XX>@D(=;9;7E_#5E.#[ 2+ +M="00BUX0BU,,@?K_ ?P^-!%*-3(,0C4(!B4,,ZQ7H+_[__XE8!,= # $ +M ")1A"-2!")R(/$!%M>PU575E.#[ R+;"0 at BWPD),=$) @ BTT0BUD, +M@?DX>@D(=&:Z #G:!!U.L=$) @! @WPD, !T +M(HM$)"@Y1 at 1T"<=%! ( #K$(M4)"PY5 at AT!\=%! $ "+1"0LB48(ZQ5" +M.=IRLXM)!+L 0 @?DX>@D(=9J#?"0( '4<@^P,5>@B____B3B+5"0XB5 $ +MBU0D/(E0"(/$$(/$#%M>7UW#55=64X/L"(M\)!R+;"0 at QP0D ,=$) 0 +M @?\\>@D(=%R+7Q"+P0"#Y7 #[; +MB00DAYRWHM_!+T 0 @?\X>@D(=<6+%"2)T(/$"%M> +M7UW#QP4<>@D(/'H)",<%('H)"#AZ"0C'!21Z"0 at T>@D(P\.#[!C_="0P0%=0E3Z#?]__^#Q 3'0P0$ 6\-3BUPD"(-[! 5U +M"5/H&OW__X/$!,=#! ( !;PXM$) 2+0 S#4XM<) A3Z/'^__^#Q 2%P'4- +M at WL$!70'QT,$ @ %O#55=64X/L#/]T)"#HR_[__XE$) R#Q 2%P ^$J@ +M (M$)""+: R#> 0!=1R!_3QZ"0AU%,= ! ( #'1"0( .F! BT0D +M((MP$(M^#('^.'H)"'18NP Y^W,_C01;C02&C5 0BT at 0@?T\>@D(=1&+ +M0 at B)0011Z+;Z__^#Q 3K%8/L#&H _W((_W($457H\?S__X/$($,Y^W+!BW8$ +MOP ! "!_CAZ"0AUJ(M$)""#> 0!=0V#?00 =0?'100! BT0D"(/$#%M> +M7UW#55=64X/L#(ML)""+7"0D5>CQ_?__@\0$AA9_/__@\0 at 0SG[@D(=%J+71"+@D(=<:#?"0$ '42BVT,@?T\>@D(=::#?"0$ '1 .VPD('4- +MBU0D*(M$) B)4 CK38-\) 0 =":#[ S_="0LZ.#Y__^)PHDXBTPD&(M!"(E" +M!(M$)#B)0 at B#Q!#K((/L#/]T)"SHNOG__XG"B3B+1P2)0 at 2+3"0XB4H(@\00 +M@\0,6UY?7<.055=64X/L&(ML)"S'1"00 (M$)#")1"04C40D%%#H4[( +M (/$$(,]-"<*" !T&8/L#&@(_P@(Z-'O___'!"0! Z,;S__^#/3 G"@@ +M=!?'!3 G"@@ QT0D! $ #HY04 ($]+'H)"$ K"@AT!>B4'0 @3T< +M)PH(0'H)"'4, at 3TD)PH(0'H)"'0<@^P, at 3T4)PH(0'H)" ^4P ^VP%#H<18 +M (/$$(,],"<*" /A6S___^!/10G"@A >@D(#X6; @3T<)PH(0'H)" ^% +MBP ($])"<*"$!Z"0AU?X/L"&H!:'69!PCH!+( (/$$($]%"<*"$!Z"0AU +M8>BP&@ ABU&@ @STP)PH( ^%!____X$]+'H)"$ K"@AT.NC=' +MZS.+%1 G"@B+ @^W0!)(@_@"=Q2#[ AH & )"/\RZ#P. "#Q!#K#8/L#&A@ +M_P@(Z%7N__^+%10G"@B!^D!Z"0AT)8M"!*,4)PH(QT($0'H)"($]%"<*"$!Z +M"0AU"L<%&"<*"$!Z"0B)TXM$) B)4&B#/70J"@@ =2Z!/10G"@A >@D(=1B! +M/1PG"@A >@D(=0R!/20G"@A >@D(= K'!2PG"@@! #[=S$.BE OW_BU,@ +MB1#'!30G"@@! @_X"=#F#_@)W!X/^ 703ZT"#_ at -T!8/^!74VOP4 #K +M/(/L"(M$)!"#P A0:&P " CH8RL (G'@\00ZR"#[ S_="04Z/P1 0")QX/$ +M$.L-@^P,:)#_" CH;.W__\<%-"<*" "+1"0(BUAHZ"("_?^+ (E#((/_ +M!0^'B@( /\DO?0!"0B+1"0(@7AT ! ^&W (MX=(''_P\ ,'O#(GX +M P6$*PH(.P6,*PH(#X.\ HX0K"@B#[ Q7Z(^K ")QHM$)!B+0'")1 at B+ +M1"08BT!PBT ,B48,BT0D&(M <(/$$(-X# !T"(M #(EP".L/BU0D"*$<*0H( +MB7 $B7)LBT0D"(M <(EP#(GRB?C!X 4!\#GP=A^)P:$<*0H(B4(4QT(0 +M ,="' "#PB YT7?CH1PI"@@!> B+1"0(B7!PH10G"@B)0P2)'10G"@B! +M/1 at G"@A >@D(#X6O 0 B1T8)PH(Z:0! "#[ Q3Z*7P #'!4 G"@@! +MQP4L)PH( 0 *$4)PH(B4,$B1T4)PH(@\00 at 3T8)PH(0'H)" ^%9@$ (D= +M&"<*".E; 0 @^P,4^A<\ B1PDZ'D' ")PH/$$(-[) !T!8M#)(D0H10G +M"@B)0 at 2)%10G"@B!/1 at G"@A >@D(#X4< 0 B148)PH(Z1$! #'!2PG"@@ +M #[=#$#GP#X7)_?__@^P,4^C\[P @\00 at 3T4)PH(0'H)"'4(B1T4)PH( +MZPBA&"<*"(E8!(D=&"<*".G( @^P,4^C)[P @\00Z;< Y70!U>F:# +M>Q %=1J#?0@ = N+10B+4S2+4 at 2)$,=%! $ #K'(-]" !T"8M%",< +M (-\) 0!&<"#P .)102#?0P =0J+11"C$"<*".L)BU4,BT40B4(0 at WT0 '0* +MBT40QT , (/L#/]T)!3HPJT (/$'%M>7UW#@WLD '0R at 3T4)PH(0'H) +M"'4(B1T4)PH(ZPBA&"<*"(E8!(D=&"<*".L.@^P(5VBT_P@(Z+#J__^#/4 G +M"@@ #X0/^___BQTH)PH(@?M >@D(=$1F at WL0!'0R at 7LH/'H)"'0I9H-[$@!U +M(H/L#/]S*.CK]O__@\00A@D( +MH2 at G"@@]0'H)"'09BU@$@^P,4.AG"0 @\00B=B!^T!Z"0AUYXL5$"<*"(72 +M=!Z+0A"C$"<*"(/L#%+HM>[__X/$$(L5$"<*"(72=>*#[ AJ /]T)!SH8MO_ +M_X/$"%!H4 ,)".C>W/__Z%#=___HR^S__\<$) #HS>W__^@ZW?__B=B# +MQ A;PU.#[ BA*"<*"#U >@D(=!F+6 R#[ Q0Z+(( "#Q!")V('[0'H)"'7G +M@\0(6\-75E/H _[\_XLXBW0D$(/N"(M&:&;'0! ! (/L#/]V:.AT[0 BU9H +MH3PG"@B)0 at 2+1FBC/"<*"(M&:(/$$(-X& !U$F;'0!(+ (M&:,= &$!Z"0CK +M"8M&:&;'0!(, (M&:(M8'(/L#%;HHZL ,<%-"<*" #HCOW\_XDX@\00 +MB=A;7E_#5U93@^P0BW0D(.AT_?S_BSB#[ R-1"084.A5JP NCPG"@B+'3PG +M"@B#Q!"!^T!Z"0AT(CES''00C5,$BUL$@?M >@D(=>WK#8M#!(D"@?M >@D( +M=0V#[ QHW/\(".A4Z/__QT,$0'H)"&:#>Q(+=16#[ S_@D(C4(!HRAZ"0B)41QFQT$2 #'01@ QT$@ ,=!) ") +M<2R#Q!"+'2 at J"@B!^P#X P!V3KH ^ , B=B)U[H ]_>!^O_[ 0!W&HG: +MP>H+N" (! +WXHG0P> '*=")P\'C"^L@D(QP4<)PH(0'H)",<%("<*"$!Z"0C'!20G"@A >@D(QP4\)PH( +M0'H)",<%$"<*" #'!2 at G"@A >@D(QP4L)PH( ,<%,"<*" "+ +M#7 J"@BX9V9F9O?IB=#!^ /!^1\IR*-T*@H(Z$ZH "#Q S#QP4X)PH( 0 +M ,-64X/L#(M<)!C_="0<4^C"]?__BW,$B1PDZ'#J__^)\(/$%%M>PU.#[ B+ +M7"00 at 3T4)PH(0'H)"'06@^P,:!0G"@C_T\<$)!@G"@C_TX/$$($]'"<*"$!Z +M"0AT%H/L#&@<)PH(_]/'!"0@)PH(_].#Q!"!/20G"@A >@D(= V#[ QH)"<* +M"/_3@\00 at 3T\)PH(0'H)"'0-@^P,:#PG"@C_TX/$$(/L#%/HR!, (/$&%O# +M@^P4:@!H=9D'".@/J @\0$+ +MZQR)VL'J"[@@" 0"]^*)T,'@!RG0P> +C8@ ^ , BAO +M*P B40D%/RY#@ (G'B>[SI8M%+(U$A0"+530IT(/ .(M,)!2-')F#X/PI +MPXG6B<*)P<'I HG?\Z6#X *%P'0"9J6)T(/@ 87 = &DBW0D%(E>-(M$)!B) +M1BQFQT40! ")=02+12R-1(4XB44T9L=%$@ QT8( (/$$(GP@\0,6UY? +M7<-3@^P(BU0D$&;'0A( (M:!,="!$!Z"0B!/10G"@A >@D(=0B)%10G"@CK +M"*$8)PH(B5 $B148)PH(Z-RE ")V(/$"%O#@^P8_W0D'.BN____@\0@D(=>V#Q S#QP4P)PH( 0 ,<%+"<*" $ +M ##5U93BUPD$&:#>Q( #X3> 0 #[=#$H/X!P^'> $ /\DA0P""0B^0'H) +M"(M[%(U/!(M7!#GR="HYVG46BT,$B0$Y7PP/A7 ! ")=PSI: $ (U*!(G6 +MBU($@?I >@D(==:#[ QH_/\(". at DXO__BT,4C4@$BU $@?I >@D(=!8YV@^$ +M+0$ (U*!(M2!('Z0'H)"'7J@^P,:" "0CH\.'__XM#%&:#>! $=0J+0 1F +M at W@0!'3VC4 at 8BU 8@?I >@D(=!8YV@^$UP (U*!(M2!('Z0'H)"'7J@^P, +M:$P "0CHJ^'__[D BQ4<)PH(@?I >@D(=%(YVG5!A'__[D BQ4D)PH( +M@?I >@D(=!TYVG4,A7\.#[ R+5"009HM"$H/H"V:#^ %V#H/L"&H 4NA5 @\00@\0, +MPU.#[ B+7"009H-[$ 5T)F:#>Q #=!]FBT,2@^@+9H/X 78,@^P,4^BZ_?__ +M@\009L=#$ , @\0(6\.#[!3_="0<_W0D'.@$ @\0! %#X2J @ 9H-X$ ,/A)\" "# +M[ Q0Z%C]__^+5"0PBWHT@\00 at 3_TT0<(=06#QP3K"8/O!,<'3'H)"(U?!(M' +M!(/H#.F/ 9HM "(/H1F:#^ %W*(/L#(M$)"S_<"CHU^O__X/$!(M4)"S_ +MLDBU,$@\(#ZQR+0 at 2+5! ,0NL2BT,$BU 8@\(" +MZP>+4 at 2#XA]"C1R3BP.#Z QF at W@(*G0K9H-X""MU!X-\)"0 =1UF at W@(+'06 +M9H-X"$8/A4K___^#?"0H ^$/____P^W0 B#^"P/A'L! "#^"Q_$X/X*@^$ +M at P (/X*W0RZ74! "#^$8/A6P! "#[ R+1"0L_W HZ!+K__^+5"0PB5HT +M9L="$ $ @\00Z54! "#[ QJ NA!)@ QP#(T <(BU0D-(E0!(U[_(/$$(M4 +M)""#>A@ =0?'0AA >@D(B0?'1_STT0<(C4?\BU0D((E"-&;'0A ! .D) 0 +MB=XI_HGPP?@"C7#_@\ "@^P,4.CG)0 B<6)< 2+!XE%"(/'!+H @\00 +M.?)S#HL'@\<$B425#$(Y\G+RQT4 <,T'"(M+!(L1#[="_/:$ *&$"0@!#X6# +M @?H0_0<(=0Z#[ S_<03H(?O__X/$$(M+!(G()0#P#P#!Z >)RH'B #P +M_XG&"=:#?A =0Z):02+0P3' 'C[!PCK0(M+!($Y$/T'"'0FBT80C03 BQ40 +M*0H(BT2"%(E!"(M&$(T$P(M+!(L5$"D*"(E, at A2+0P2): 2+0P3' 'C\!PB# +MQP2)+^FI_?__@\<$BT0D(&;'0! # (EX-.L-@^P,:'4#"0CH5=W__X/$#%M> +M7UW#55=64X/L#(ML)"#'1"0( (MU-(L.@^D,B@'B/L'".M$BTX$@3D0_0<(=":+0Q"-!,"+%1 I"@B+ +M1((4B4$(BT,0C03 BTX$BQ40*0H(B4R"%(M&!(M4) B)4 2+1 at 3' 'C\!PB) +M_NG8_O__B74TN$8 #K)8EU-+ at K ZQN)=32X2 .L1B74TN"P #K +M!XG^Z:G^__^#Q Q;7E]=PU=64XM\)!"+=S2+#H/I#(G*#[=!"(/H(X/X!GH8P>@0)?\ "-1 (5ZR2+1 at 2#P /K'(M!!(M$" Q +MZQ*+1 at 2+0!B#P +K!XM"!(/@'T"-%(8/MT$(@_A&= >#^$=T#.L4B7@D(='&+6 at RA*"<* +M"(E"#(D5*"<*" ^W0A*#^ =W0/\DA?P""0B#[ AH^%\)"%+HX?K__X/$$.LS +M@^P(: !@"0A2Z,[Z__^#Q!#K((/L"&CH7PD(4NB[^O__@\00ZPV#[ QHQ ) +M".C4VO__B=J!^T!Z"0AUCX/$"%O#@^P,BU0D$ ^W0A*#^ P/A]8 #_)(4< +M PD(@^P(_W(4:( #"0CH&]O__X/$$.G* @^P(_W(4:)X#"0CH ]O__X/$ +M$.FR @^P(_W(4:+L#"0CHZ]K__X/$$.F: @^P,:,\#"0CHUMK__X/$ +M$.F% @^P(BT(4_W <:/@ "0CHN]K__X/$$.MM@^P,:.4#"0CHJ=K__X/$ +M$.M;@^P,: $"0CHE]K__X/$$.M)@^P,:"P!"0CHA=K__X/$$.LW@^P,:$P! +M"0CH<]K__X/$$.LE@^P,:) !"0CH8=K__X/$$.L34O]R' ^W0A)0:+ !"0CH +MR-G__X/$#,.#[ R+5"00#[="$(/X W0'@_@%=!3K)(/L#&@/! D(Z"':__^# +MQ!#K'H/L#&@?! D(Z _:__^#Q!#K#(/L#%+HN_[__X/$$(/$#,-3@^P4:"T$ +M"0CH[-G__XL=*"<*"(/$$('[0'H)"'0S@^P$4_]S'&@[! D(Z,K9__^)'"3H +M??___\<$).4("0CHMMG__X/$$(M;#('[0'H)"'7-@\0(6\.0D%93BUPD#+D +M @3TD)PH(0'H)"'1EH20G"@B)PHG>*W 4A?9^58M"!*,D)PH(9L="$@ +MQT($0'H)"*$4)PH(B4($B144)PH(@3T8)PH(0'H)"'4&B148)PH(N0$ "! +M/20G"@A >@D(= ^+%20G"@B)V"M"%(7 ?ZN)R%M>PU575E.![!P! "^____ +M_\=$) 0 QT0D" #'1"0, .BC#0$ HT at G"@B)QU#H1O___X/$ +M!(7 #X7; @ NP "#O"0P 0 '0[N____P>!/20G"@A >@D(="JA)"<* +M"(M %"GXC02 C02 C02 C02 B@D(=%V+>00/MT$2 +M at _@$= >#^ 5T'>LSBT$4.<9] HG&B<+!Z at 6#X!\/JX24D .LEBT$4.<9] +M HG&B<+!Z at 6#X!\/JT24$.L-@^P,:$P$"0CHD=?__XGY@?] >@D(=:.X@]X; +M0_?CB=#!Z!*)1"0(C02 C02 C02 C02 C02 C02 P> &*<.)7"0,ZVWH(>S\ +M_X,X!'0B at S@)#X0I____@^P,:%<$"0CH1NO\_\<$)%X$"0CH+M?__X$]+'H) +M"$ K"@AT"NAP!0 Z9@! "#/3 G"@@ #X6+ 0 Z#8, 0!0Z.#]__^#Q 2! +M/10G"@A >@D(#X5M 0 @^P,C40D%%!J (U$)"10C80DJ %"-1@%0Z%GK +M_/^#Q""%P ^(:/___[T N0$ "%R74+ at WPD! /A 8! "+#1PG"@B! +M^4!Z"0@/A,T "+>00/MT$2 at _@$= >#^ 5T,>M;NP "#?"0$ '4:BT$4 +MB<*#XA_!Z 4/HY2$D ^2PH32= 6[ 0 (G8ZSF[ (-\) 0 =1>+ +M012)PH/B'\'H!0^C5(00#Y+"A-)T!;L! B=CK#8/L#&AL! D(Z!S6__^% +MP'0O9L=!$@ QT$$0'H)"*$4)PH(B4$$B0T4)PH(@3T8)PH(0'H)"'49B0T8 +M)PH(ZQ&%[74(B0T<)PH(ZP.)302)S8GY@?] >@D(#X4S____A>UU%L<%("<* +M"$!Z"0C'!1PG"@A >@D(ZPW'101 >@D(B2T@)PH(@[PD, $ !T&8,],"<* +M" !U$($]%"<*"$!Z"0@/A C]__^!Q!P! !;7E]=PY##4X/L"(M<)! ['6 at G +M"@A\;H,]9"<*" !U'X/L"&AW! D(C02=! %#HI=G__Z-D)PH(@\00ZR.# +M[ 1H=P0)"(T$G00 !0_S5D)PH(Z+/9__^C9"<*"(/$$(L5:"<*"#G:?Q&A +M9"<*",<$D/____]".=I^[XU# :-H)PH(@\0(6\.#[!AJ .B)VO__@\0R$ B[0DD (L-+'H)"*%D)PH(BQ2PC4$$HRQZ"0C!X at 2A@"@*"(L$ +M HD!@3TL>@D(@"L*"'49@^P,:(4$"0CHZM3__\<$) $ #HW]C__X/L#(U< +M) Q3Z KL_/^#Q A64^A at ZOS_@\0,:@!3:@'H@^K\_X/$$(/^$G4-@^P,:A+H +M9?___X/$$,<%+"<*" $ "!Q(0 !;7L.#[!AH@"<*".B^Z_S_@\0@D(0"L*"'4C at STP)PH( '4:Z"+J_/^!/2QZ +M"0A *PH(=0F#/3 G"@@ =.:#Q S#55=64X'LG $ (NT)+ ! "+O"2T 0 +MBZPDO $ (7V>$*#[ R-G"0< 0 4^@6Z_S_@\00A^G\_X/$$(7 = JZ_?___^F4 0 @^P, +M5NC2_?__H60G"@B+'+#'A"24 (/$$(/__G0=@__^?PZ-1P6#^ $/ +MAYP #K6(/__W0LZ9 "A9"<*",<$L/[___^#[ A6:( G"@CH7^O\_\=$ +M)! ! @\00ZW:A9"<*",<$L/____^#[ A6:( G"@CH..O\_\=$)! +M@\00ZT^+A"2X 0 BQ"A9"<*"(D4L(/L"%9H@"<*".B,Z/S_QT0D$/ZI!PB# +MQ!"#__MU"\>$)(0 " _P5L)PH(ZPV#[ QHG at 0)".APTO__A>UT&(U$ +M) 2#[ 1H@ %50Z%7I_/^#Q!#K$(/L#(U$)!!0Z-/I_/^#Q!"X (/^ +M$74+ at SU@)PH( '0"L $)A"2$ @^P$:@"-1"0(4%;HQ.7\_X/$$(7 =1N# +M[ 1J (V$))@ !0:@+H&>C\_X/$$(7 ="2%VW at 9@^P,H60G"@C_-+#HZ@( +M /\-;"<*"(/$$+K]____ZQB-0P.)VH/X G8.BX0DN $ (D8NOS___^)T('$ +MG $ %M>7UW#4X/L".AV_?__ at 3TL>@D(0"L*"'1RBQ4L>@D(C4+\HRQZ"0B+ +M6OR#[ S_-2PJ"@CHG.G__XM(-(U1_(E0-,=!_,@ " B+2#2-4?R)4#3'0?RX +M$0@(BT at TC5'\B5 TB5G\BT at TC5'\B5 TQT'\]-$'"(D$).B!ZO__@\00 at 3TL +M>@D(0"L*"'6.Z O]__^#Q A;PU93@^P$BW0D$(L=+'H)"('[0"L*"'04@^L$ +M@^P,4__6@\00@?M *PH(=>R#Q 1;7L.#[ R#/3 G"@@ = V#[ QH_ . at F +MU?__Z"7N__^#Q S#4X'L- $ ,>$))P #UK0<(C9PDG (V$)* !0 +MZ"_H_/_'A"0D 0 (/$#(U$) 104VH"Z#3D_/^#Q!"%P'00@^P,:+@$ +M"0CHQ]#__X/$$(/L"&H!:@+H@>3\_\>$)* #PJ0<(@\0$C9PDG (V$ +M)* !0Z,_G_/_'A"0D 0 (/$#(U$) 104VH2Z-3C_/^#Q!"%P'00 +M@^P,:.0$"0CH9]#__X/$$('$* $ %O#D(M$) 3!X 2+%8 H"@B+!!##PXM$ +M) 2+$&:#>OP>=!QF at WK\(G059H-Z_!]T#F:#>OP@= =F at WK\(74HBT $BQ!F +M at WK\'G3T9H-Z_")T[6:#>OP?=.9F at WK\('3?9H-Z_"%TV,-64X/L!(MT)!"# +M/80H"@@ =07HXP %;HD?___XG&@^P$4/\UC"@*".A2\ B<.#Q!"%VW50 +MBPV * H(H80H"@B)PRG+P?L$BP"CA"@*"(G:P>($QT0*" "A@"@*"(DT +M J& * H(QT0"# "#[ 135O\UC"@*".CB\ B=B#Q!"#Q 1;7L.#[!C_ +M="0 P =2^#> @ =2F)PX,X '05@^P$:@#_,/\UC"@*".@ \0 @\00H80H +M"@B) XD=A"@*"(/$"%O#4X/L"(L=B"@*"(7;=6?'!8 at H"@A @^P(: \% +M"0AH 0 .C at TO__HX H"@B#Q!"-4!"Y 7P P .=!R((D(QT $ +M ,= " #'0 P B<&#Z! YT'/@B16$* H(Z(OR "CC"@*".MHBQ6( +M* H(C002HX at H"@B#[ 1H#P4)",'B!5+_-8 H"@CHH]+__Z. * H(@\00B=K! +MX at 2-# *[ (U$"O YR'(@B1C'0 0 QT ( ,= # ")PX/H +M$#G(<^")#80H"@B#Q A;PU=64XM\)!"AB"@*",'@!(L5@"@*"(TT$(U:$#GS +M $BQ6 * H(C300C5H0.?-S-(-[# !T#(/L +M#(U##%#_UX/$$(L#AP@ =4"#>PP =2N)WX,[ '05 +M@^P$:@#_,_\UC"@*".CY[@ @\00H80H"@B)!XD]A"@*".L/@^P,_S/H5* +M (D#@\00@\,0.?-RBEM>7\-75E.+?"00A?]T)H,]C"@*" !T'8/L"&H _S6, +M* H(Z&WO #HLO *.,* H(@\00H8 at H"@C!X 2+%8 H"@B--!"-6A Y\P^# +MI0 (,[ '4I at WL$ ^$BP (/L!&H _W,$_S6,* H(Z%[N #'0P0 +M@\00ZVR+ SL%@"@*"'($.?!R7H7_="&#[ 2)V"L%@"@*",'X!%#_,_\UC"@* +M".BC[0 @\00ZSF+ SM#!'0R@^P$:@#_X (/$#(G8*P6 +M* H(P?@$4/\S_S6,* H(Z&CM "#Q!"#PQ Y\P^"6____UM>7\.0D(/L*(U$ +M) Q0Z-/B_/^CF"@*"(M$)!"CG"@*"(/$+,.AT"@*""L%U"@*"-L%D"@*"%#: +M/"2-9"0$PX/L#.B_____H9PH"@@K!=0H"@C;!9 H"@A0VCPD@\00PX/L9(U$ +M) A0:@#HE]_\_XM$)#2#Q&S#@^P, at STD*@H( W8<@^P,:"@%"0CH:P@ ,<$ +M)' %"0CH7P@ (/$$(/L"&B>" D(H5 J"@C!X )0Z$7/__^C^"@*"+H +M@\00 at SU0*@H( '85H?@H"@C'!) 0CD54"H*"'?K@\0,PX/L&&H"Z$C@ +M_/^#Q!"#^/]U&8/L#&BL!0D(Z!C+___'!"0! Z-_.__^CD"@*".CM_O__ +MH9 at H"@BCE"@*"(/$#,.#[ SHU_[__Z&<* H(HZ H"@BAF"@*"*.H* H(H90H +M"@@[!9 at H"@A^#,<%I"@*" #K$*&8* H(*P64* H(HZ0H"@B#Q S#@^P, +MZ([^__^AF"@*"*.T* H(*P7<* H(*P6H* H(H[ H"@B%P'D*QP6P* H( +M *&<* H(*P74* H(*P6@* H(HZPH"@B%P'D*QP6L* H( (/$#,.#[ SH +M-?[__Z&<* H(*P6L* H(*P74* H(*P6@* H(H[@H"@BAF"@*""L%M"@*"*.\ +M* H(@SVX* H( 'D*QP6X* H( (,]O"@*" !Y"L<%O"@*" "#Q S# +M@^P,H6 at J"@B%P'0Q at _@!=AR#[ QHJ @)".C6R?__QP7T* H( 0 (/$$.L0 +M@^P,:*T("0CHNLG__X/$$(,])"H*" !T+.B4_?__H9PH"@BCT"@*"*&8* H( +MH]@H"@B#/20J"@@ = KHS/W__Z/L* H(@\0,PU575E.#[ R+?"0P at STD*@H( +M ^$.0$ .A,_?__BQV<* H(BRV8* H(B=XK-= H"@B)Z"L%V"@*"(E$) B# +M/20J"@@$#X6: Z'3]__^)1"0$BT0D*,'@ E"+1"0HP> "4(M$)"C!X )0 +M:*\("0CHZ04 %>+%>PH"@B)T"L%\"@*"%"+1"0<*=!0B>@K!90H"@C;!9 H +M"@C9P%#:/"2-9"3\W1PDV0H"@B#/?0H"@@ =!J#[ QHO@@)". at 7R/__QP7T* H( (/$$(/$#%M> +M7UW#55=64X'L+ ( (NT)$ " "#/20J"@@ #X2F! O0 #HQ?O__XL] +MG"@*"*&8* H(*P64* H(B40D%(GPF0$UP"@*"!$5Q"@*"%?;!"2-9"0$V>[9 +MR=KIW^" Y$6 ]$!U!;\! VT0D%-GNV@H"@@ ="YJ 5.AX"@* +M",'@ KH 4E#HWLO__X/$#/\UZ"@*"%-H* 8)".A9 P @\00@^P,:.4( +M"0CH20, +L @\00 at SU0*@H( '8W@^P4VP60* H(H?@H"@C:/)C='"13 +MC13;H1 I"@C_=) <:%@&"0CH#0, (/$($,Y'5 J"@AWR8/L"*%\*0H()?\/ +M !0:(0&"0CHZ0( (/L#-L%D"@*"-G VCVD* H(W5PD"-H]H"@*"-T<)&BD +M!@D(Z,$" "#Q 3;!9 H"@C9P-H]L"@*"-U<) C:/:PH"@C='"1HS 8)".B9 +M @ @\0$VP60* H(V<#:/=PH"@C=7"0(VCW4* H(W1PD:/0&"0CH<0( (/$ +M!-L%D"@*"-G VCV\* H(W5PD"-H]N"@*"-T<)&@^MG)W5PD"-G!VCW4 +M* H(WLG9R=Q\)!S>^=T<)&AP!PD(Z,X! "#Q" [/=0H"@AU%6H!C40D)%!J +M &H Z"3*__^#Q!#K86H!C40D)%"AP"@*"(L5Q"@*" ^DP at +!X )24-\L)(UD +M) B%TGD&V 48"0D(W5PD(-U$)"")^"L%U"@*"-L%D"@*"%#:/"2-9"3\WOG= +M'"3H'?L (/$"%)0Z,')__^#Q!"#[ B-1"0H4&B "4+@ +M at SWH* H( '03H>0H"@C!X *Z /*!P@ @ "+6@"+<@2+>@B+:@R!Q!P@ ##D)!64X/L +M%(MT)""+7"0DQT0D" #'1"0, (GQA?9Y O?927 at HV04<"0D(W40D +M"-C)BP2+N@ !24-\L)(UD) C>P=U<) A)>>#=V-U$) C9[MG)W>'?X-W9 +M at .1%@/Q =!R#[ 3_="0LC60D^-T<). at KVOS_W5PD&(/$$.L"W=B%]GD%@'0D +M#X#=1"0(@\046U[#4X/L"(M<)!")V(7;>0+WV%#;!"2-9"0$W1PDW00DV>[9 +MR=WAW^#=V8#D18#\0'0<@^P$_W0D&(UD)/C='"3HRMG\_]U<)!"#Q!#K MW8 +MA=MY!8!T) > W00D@\0(6\-64X/L%(MT)""+7"0DN ")1"00B?&%]GD" +M]]E)>"C9!1P)"0C9P-A,)!"+!(NZ %)0WRPDC60D"-[!V5PD$$EYX-W8 +MV40D$-GNV06 ="03 at -E$)!"#Q!1;7L-3@^P(BUPD$(G8A=MY O?84-L$ +M)(UD) 397"0$V40D!-GNV06 ="0'@-E$) 2#Q A;PU=64XM<)!"+?"04 +MBT0D&(M4)!R)P<<# @ (7 =1?WPO___W]U#\=#! #'!P #K8,=# +M! ( ")T,'H%"7_!P +3,$ ")UH'B__\/ #W-^___= B!R@ $ #K'T#W +MP@ $ !U%M'B@?D " @]K_T>%(]\( ! =.J)!XM#"(D(BT,(B5 $A?9Y +M _=;!%M>7\-64XM,) R+7"00BU0D%,)(]\( ( =/6) XM!"(D0A?9Y _=9 +M!%M>PU.+5"0(BTPD#+L B$P'4*]\+__W\ = *Q 8G(PX%\) 0 " #Y3 #[; PY"055=6 +M4X/L#(,]$"D*" /A8P# "#/3 J"@@ =$&A/"H*"#L%,"H*"'8%HS J"@B# +M/3 J"@@ =":A-"H*"#L%,"H*"'89@^P,:" )"0CHW;W__\<$) $ #H&M7\ +M_^@%? @^P(:)L)"0BA4"H*"(T$P,'@ E#HP,'__Z,0*0H(O0 "#Q!"# +M/5 J"@@ =CN-1.T BQ40*0H(C02"B2C'0!!$>@D(QT 41'H)",= ' #' +M0" QT , $4Y+5 J"@AWQ8L5$"D*"(D5%"D*"*%0*@H(C03 C42" +MW*,8*0H(@SU0*@H( 79YQT ( 0 (L=&"D*"(/L"&BM"0D(:E#H+<'__XE# +M!+T @\00 at SU0*@H( 71PC5SM ,'C HL55"H*"*$0*0H(B50#"(LU$"D* +M"(/L"&C$"0D(H50J"@B-!(#!X 10Z.3 __^)1#,$@\001:%0*@H(2#GH=[GK +M)Z$4*0H(QT ( 0 (L=%"D*"(/L"&C$"0D(:E#HK\#__XE#!(/$$+T +M at SU0*@H( ^&R@ +\ BQ40*0H(B=:-!.T B<,!Z(-\@@@ #X2: +M C0PKP>$"C02_P> $ T0Q!(DXQT $ ,= - #'0 @ B $C5084(E4& Q'BQT0*0H(BT09"$@Y^'?8BPT0*0H(C53M ,'B HM< +M"@2-!+_!X 2+5 HHB508#$6A4"H*"$@YZ'>/@SU<*@H( '0J at SU0*@H( 742 +M@^P,:&0)"0CH(KO__X/$$.L/H1 at I"@B+0 3'0" ! H1 at I"@B+0 2)0 RA +M$"D*",= # "A$"D*"(M !*,<*0H(Z,8 #'!90K"@@ QP4 *0H( +M ,<%!"D*" #'!9 K"@@ QP6$*PH( *$T*@H(HXPK"@B# +M[ 1HV\@'"&BCR <(:'O(!PCH2]+\_X/$$(/$#%M>7UW#@^P0 B<*)6 B%VW0#B4,,H1PI +M"@B)0A3'0A QT(< (L"B4($B=-&.?YRS<=## ")V%M>7\-7 +M5E.+?"00BQT<*0H(BW,(.?YT=SG^0 B=J#Q! Y_G?A +MH1PI"@B)4 0Y_G,1@ = :+01B)4 R)+Z$< +M*0H( 5@@"C80! /S__^F( O@ +M "#/5 J"@@ =GBA$"D*"(E$) B)1"0$BQ50*@H(B10DN0 "-!/:+5"0$ +M at WR"" !T28M\) B-'(4 A?9U!(7)="^-!(G!X 2)P at -4.P2+0AP#0 at C! +MX J-K"@ _/__ at WHL '0-BU(LBT($*P+!Z (!Q4$Y3#L(=\)&.30D=YZ)Z(/$ +M#%M>7UW#55=64X/L$,=$) P O0 "#/5 J"@@ #X: H1 I"@B) +M1"0(B40D!(L54"H*"(D4)+\ C43M (M4) 2#?((( '10BW0D"(T2 =1"+00B+ +M5"0,C11"B50D#.L'BT$( 40D#$N@ (/$',.#[ SHW>@ (/$#,.0D%93@^P$BW0D +M$+L B?*%]G07 at 7H,,'H)"'0!0\<"_/T'"(M2$(72=>F%VP^$OP (/L +M#(U# U#H/OO__XG!QP#<_P<(QT ( (E8!+L B?*#Q!"%]G08 at 7H, +M,'H)"'0(BT(,B429#$.+4A"%TG7HBS4L*@H(@^P(48/L$%/H':'__X/$"%!H +M &$)". at 5H___@\044.@,H___B<.)-"3H5,O__XM(-(U1_(E0-,=!_,@ " B+ +M2#2-4?R)4#3'0?RX$0@(BT at TC5'\B5 TB5G\BT at TC5'\B5 TQT'\]-$'"(D$ +M). at YS/__@\00@\0$6U[#PY"0D(/L#/]T)!3_="04:-@)"0C_-62%"0CH\<;\ +M_X/$',.0PY"0D(/L#(M4)!2)T,'H%%!2:! *"0C_-62%"0CHRL;\_X/$',.0 +MD(/L$/]T)!1H> H)"/\U9(4)".BMQOS_@\0 "*<6+=@B#P at RY #M,) AS +M#(L"B42- (/"!$'K[HL&Z]0 &P (GR#[]&!HE$) B)P<'A HGH*ONBP;KZ = B?*+1 at 2)1"0(B<'!X0*)Z"G( +M@^@(.T-4@IR(UH^(MV"(/"#+D ZP6+0_C_X#M, +M) AS#(L"B42- (/"!$'K[HL&#[] _(/X27<'_R2%" P)"(L&Z]:+=@3KY8M% +M .O,D D @^P,BT- at _W 8Z!W.__^#Q!"+0V#'0!@ @\4$_V4 +MC78 "0 "+0V#'0!A >@D(@\4$_V4 C47X.T-4<@N+0V"#>!@ =!?K +M-\=#(/X #'0R0DS@<(N"C8!PC_X(M#8,= &$!Z"0B!?0 4S@<(= R#[03' +M10#HS0<(ZP.#Q02#[02XN!$(".O2C47X.T-4<@N+0V"#>!@ =1?K2,=#(/X +M #'0R1XS@<(N"C8!PC_X(/L#(M#8/]P&.AES?__@\00BT- at QT 8 (%] +M .C-!PAT#(/M!,=% !3.!PCK X/%!(/M!+BX$0@(Z\&-=@!F at WX0!'4%BW8$ +MZ_0/OT82 at WX8 '11 at _@!=$R#^ -T1X/X!'1"@_@%=#V#^ 9T.(/X"'0SBU-@ +MBT88B4($BT- at B488BT-@9L= $@, BT- at B7 4QT, at _ ,=#).#.!PBXT-L' +M"/_ at .W-@=!2#[ C_! #=">+:#0%C (E#5(M#:(MX!(/O!(G" +MBT 8P> , P)(B4-!@ #Y7 #[; B44$@^T$N+ at 1" C_X,=# +M(/P #'0R1XT <(N"C8!PCKZ9 ! $@ (MV!.D BT- at B6@T@^P( +M5O]S8.BQT/__@\00B<*+0V"+:#2#^D9U:HM *(E$) B#[ S_="04Z%.Z__^# +MQ 2)1"00_W0D%.@!NO__@\00BT- at QT H/'H)"(-\) 0 =2N#[ QH/'H)".C0 +MN?__@\00B40D"(M#8(M4) B)4"B+=0B#[02XN!$("/_@@\4,Z73___^#^BQU +M,8M#8(M0+(ULD#")=0"+0V!FQT 0 P"+0V"):#2+4VB-1P2)0 at 2^!0 +C9 +MO <(Z\"#^BMT!8M-!.L#BTT(B>B#^BMT!8/%".L3@\4, at W@$ '4*@^T$QT4 +MZ,T'"(M#8(-X& !U!\= &$!Z"0B#[02)=0")SH/M!+ at P'@@(Z6____^0Z>?^ +M__^0D) ! ) (MU!(/%"(L&#[] _(/X27<'_R2%, T)"(L&_^"+=@3K +MY8M% .OTB?:#[0B)=03'10#TT0<(.WM<=P>^ @ .M5*WML at 7ML ! '<) +MBT-H at W@( '4'O@$ #K.8M3:(U'!(E"!(M#:(M "(E#:(MX!(/O!(G"BT 8 +MP> , P)(B4-<@STL)PH( '4%BT4 _^"^ P (M#8(EH-(M3:(U'!(E"!(M# +M8&;'0! ! +C9O <(Z]J-=@ [>UQW![X" ZU4K>VR!>VP $ =PF+0VB# +M> @ =0>^ 0 .LYBU-HC4<$B4($BT-HBT (B4-HBW@$@^\$B<*+0!C!X P# +M DB)0UR#/2PG"@@ =06+10#_X+X# BT- at B6@TBU-HC4<$B4($BT- at 9L= +M$ $ N-F\!PCKV@ D @\4$_V4 B?8! ) (MU!(/%"/]E (UV +M (/M"(EU!,=% $33!P@[>UQW![X" ZU4K>VR!>VP $ =PF+0VB#> @ +M=0>^ 0 .LYBU-HC4<$B4($BT-HBT (B4-HBW@$@^\$B<*+0!C!X P# DB) +M0UR#/2PG"@@ =06+10#_X+X# BT- at B6@TBU-HC4<$B4($BT- at 9L= $ $ +MN-F\!PCKVHUV "$ D BW4$@\4(_V4 C78 @^T(B74$QT4 Z-,'"#M[ +M7'<'O@( #K52M[;(%[; 0 !W"8M#:(-X" !U![X! ZSF+4VB-1P2) +M0 at 2+0VB+0 B)0VB+> 2#[P2)PHM &,'@# ,"2(E#7(,]+"<*" !U!8M% /_@ +MO@, "+0V"):#2+4VB-1P2)0 at 2+0V!FQT 0 0"XV;P'".O:C78 (0 "0 +M "+102)0RB#Q0C_90"#[0B+0RB)103'10",U <(.WM<=P>^ @ .M5*WML +M at 7ML ! '<)BT-H at W@( '4'O@$ #K.8M3:(U'!(E"!(M#:(M "(E#:(MX +M!(/O!(G"BT 8P> , P)(B4-<@STL)PH( '4%BT4 _^"^ P (M#8(EH-(M3 +M:(U'!(E"!(M#8&;'0! ! +C9O <(Z]IB ) (M%!(M5"(E#.(E3/(/% +M#/]E (GV@^T,BT,XBU,\B44$B54(QT4 ,-4'"#M[7'<'O@( #K52M[;(%[ +M; 0 !W"8M#:(-X" !U![X! ZSF+4VB-1P2)0 at 2+0VB+0 B)0VB+> 2# +M[P2)PHM &,'@# ,"2(E#7(,]+"<*" !U!8M% /_ at O@, "+0V"):#2+4VB- +M1P2)0 at 2+0V!FQT 0 0"XV;P'".O:B?9B ) ,=$) 0 QP0D +M (U%!(L0B10DBT $B40D!(L$)(M4) 2)0TB)4TR#Q0S_90"-=@"#[0R-302+ +M0TB+4TR) 8E1!,=% .35!P@[>UQW![X" ZU4K>VR!>VP $ =PF+0VB# +M> @ =0>^ 0 .LYBU-HC4<$B4($BT-HBT (B4-HBW@$@^\$B<*+0!C!X P# +M DB)0UR#/2PG"@@ =06+10#_X+X# BT- at B6@TBU-HC4<$B4($BT- at 9L= +M$ $ N-F\!PCKV@$ D @\4$_V4$B?:+%H/J& ^_0 at R%P'0;@_@!= R+ +M!(4 at A D(@^ ?ZQ"+4 at 2+!HL$ NL&BT($@^ ?@^T,B74(B44$QT4 B-<'"#M[ +M7'<'O@( #K52M[;(%[; 0 !W"8M#:(-X" !U![X! ZSF+4VB-1P2) +M0 at 2+0VB+0 B)0VB+> 2#[P2)PHM &,'@# ,"2(E#7(,]+"<*" !U!8M% /_@ +MO@, "+0V"):#2+4VB-1P2)0 at 2+0V!FQT 0 0"XV;P'".O:B?8 *0 +M (MU"(/%#/\F "@ #'1"0$ ,<$) "-14R+$(D4)(M !(E$ +M) 2+!"2+5"0$B4-(B5-,BT5$BU5(B4- B5-$BT4\BU5 B4,XB5,\BT4XB4,T +MBT4TB4,PBT4PB4,LBT4LB4,HBT4HB4,UQW![X" ZU4K>VR!>VP $ =PF+ +M0VB#> @ =0>^ 0 .LYBU-HC4<$B4($BT-HBT (B4-HBW@$@^\$B<*+0!C! +MX P# DB)0UR#/2PG"@@ =06+10#_X+X# BT- at B6@TBU-HC4<$B4($BT-@ +M9L= $ $ N-F\!PCKVHUV ^V0R(/ME,C ="+1(4 B4,D@^U4C4U,BT-(BU-, +MB0&)402+0T"+4T2)142)54B+0SB+4SR)13R)54"+0S2)13B+0S")132+0RR) +M13"+0RB)12R+0QR)12B+0QB)122+0Q2)12"+0Q")11R+0PR)11B+0PB)112+ +M0P2)11")=0R+0R2)10B+0R")103'10"8UP<(.WM<=P>^ @ .M5*WML at 7ML +M ! '<)BT-H at W@( '4'O@$ #K.8M3:(U'!(E"!(M#:(M "(E#:(MX!(/O +M!(G"BT 8P> , P)(B4-<@STL)PH( '4%BT4 _^"^ P (M#8(EH-(M3:(U' +M!(E"!(M#8&;'0! ! +C9O <(Z]J)]H/M5(U-3(M#2(M33(D!B5$$BT- BU-$ +MB45$B55(BT,XBU,\B44\B55 BT,TB44XBT,PB44TBT,LB44PBT,HB44LBT,< +MB44HBT,8B44DBT,4B44 at BT,0B44@"B40D +M"(/ H/L#%#H]>G__X/$$,< K/\'"(M4) B)4 2)QHM% .O1D(ET)!BAA"L* +M"#L%C"L*"'(5QT, at _0 ,=#) #>!PBX0-H'"/_ at BT0D&(/ XE$)!2#[ Q0 +MZ$?H__^#Q!")1"0,QP#$_P<(BU0D&(E0!(M+!(E,)!")PH/"#(M$)!2+3"0, +MC02!.=!V"XM,)!")"H/"!.OFBW0D#(M% .NGC78 QP;$_P<(@WX( '5%B70D +M"(GQ@>$ \ \ P>D'B? E #P_PG!@WD0 '0GBT$0C03 BQ40*0H(BT2"$(E& +M"(M!$(T$P(L5$"D*"(M,) B)3((0_V4 @\<,.WM<=Q.-1_C' /3_!PB)< 2) +MQHM% /_ at QT-L# ,=#(/X #'0R34W@<(N"C8!PCKXI"#QR0[>UQW.8M. +M!(U'^,< I H("(M3!(E0!(E("(U0],= ]"0!" B)0 at 2)5 at 2-4.C'0.B$ 0@( +MB4($B=:+10#_X,=#;"0 #'0R#\ QT,D#-\'"+ at HV <(Z^*-=@"#QP@[ +M>UQW$XU'_,< +/X'"(EP!(G&BT4 _^#'0VP( QT, at _P ,=#)&S?!PBX +M*-@'".OBD$YE=R!W96%K('!O:6YT97(@870@)7 * (-[" !U!\=#"#!Z"0B# +MQQ0[>UQW+8U'\,< Y/T'"(EP!(M3!(E0"(M3"(E0#(L5E"L*"(E0$*.4*PH( +MB<:+10#_X,=#;!0 #'0R#X QT,DO-\'"+ at HV <(Z^*)]H$^_/T'"'44 +MO@ #'1?PP>@D(@^T$BT4$_^#'!OS]!PB+3 at R+1A")1 at 2!^3!Z"0AT$+X! +M B4W\@^T$BT4$Z]>^ ,=%_#!Z"0B#[02+103KPY")\+H @3[D +M_0<(=0BZ 0 (M&"(G6B47\@^T$_V4$B?:)\(/'##M[7'#"Y (7V?C#K',=#; P #'0R#_ QT,DF. '"+ at H +MV <(_^"Y 0 (DWZPFY______?8B0>)SHE5_(/M!(M%!.O?@\<,.WM<=QN- +M1_C' *S_!PC'0 0! N@ "%]G0EZQS'0VP, QT, at _P ,=#)/S@ +M!PBX*-@'"/_ at N@$ ")-XG6B47\@^T$BT4$Z^J0BT-(BU-,B40D$(E4)!3' +M1"0, (72> >#?"04 '\:@WPD%/]_"7P1 at WPD$ !V"L=$) @! ZPC' +M1"0( @ (M$) C!X *-?#@(.WM<=QV)^2G!@^D$QP&L_P<(BU0D"(E1!(-\ +M)!0 >"7K.(M4) B-!)4( B4-LQT, at _P ,=#)%#A!PBX*-@'"/_ at QT0D +M# $ #W7"00 at U0D% #W7"04BU0D%(E4) 2#?"0( G0UQW5HU'^(E$) 3' *S_!PC'0 0! +MBT0D!(/ "*/(*PH(@^P$_W0D#&C,*PH(:, K"@CHN=+__X/$$(LUS"L*"(M$ +M) 2)1?RAQ"L*"(E%^(/M"(M%"/_ at QT-L# ,=#(/\ #'0R1\[ <(N"C8 +M!PCKXHUV (M#.(M3/(E$)!")5"04@\<0.WM<=U>-1_2)1"0,QP"L_P<(QT $ +M @ (M$) R#P BCR"L*"/]T)!3_="04:,PK"@AHP"L*".B3T?__@\00BS7, +M*PH(BT0D#(E%_*'$*PH(B47X@^T(BT4(_^#'0VP0 QT, at _P ,=#) #M +M!PBX*-@'".OBC78 H80K"@@[!8PK"@AR%<=#(/X #'0R2,[0<(N$#:!PC_ +MX(ET) B#[ S_-2PJ"@CH0ZG__X/$!(G"BT at TC4'\B4(TQT'\R ("(M*-(U! +M_(E"-,=!_+ at 1" B+2C2-0?R)0C2+1"04B4'\BTHTC4'\B4(TQT'\]-$'"(G6 +M4N@?JO__@\00QP4L)PH( 0 (M% .N-D.EC[?__C78 BW- at _V4 B?;_90"0 +M@^P,_W- at Z'>F__^#Q!")QO]E (/L#&A8#@D(Z(R0__^#[ QH@ X)".A_D/__ +M@^P,:*@."0CH/__^#[ QH.! )".A*C___@^P,:& 0 +M"0CH/8___X/L#&B($ D(Z#"/__^#[ QHL! )". at CC___C78 Q/___[?___^J +M____G?___Y#___^#____=O___VG___\ (@ $8 ");"0(BT- at BU H +M at WT$ '5+@^P,4NATF___@\00A@D(Z.V:__^#Q!")PHM#8(E0 +M*(M$) B+< B#[02XN!$("/_ at BT-@QT H/'H)"(/%#(M% .OL@^P,_W- at Z,B< +M__^#Q!"%P'4P@^P,:#QZ"0CHH)K__X/$$(G"BT- at B5 HBT0D",= ! "+ +M< B#[02XN!$(".NJN'3@[0U1R/HM#8(/L#/]P*. at PF?__@\00BU- at B4(H@^T4QT4 +MW.X'",=%! ")=0B+2P2)30R)11"#[02XN!$("/_ at QT, at _ ,=#),#Q +M!PBX*-@'".OID*&$*PH(.P6,*PH(@D(B<:+10#_X,=#;! #'0R#^ QT,DF/,'"+ at HV <( +MZ^*)]J&$*PH(.P6,*PH(UQW)8U'\,< =/X'",= !$!Z"0C'0 Q +M>@D(QT 00'H)"(G&BT4 _^#'0VP4 QT, at _P ,=#)&ST!PBX*-@'".OB +MC78 B70D"($^=/X'"'5(@7X$0'H)"'0+BU8,BT- at B4($ZPJ+0V"+5"0(B4($ +MBT- at QT $0'H)"(M#8&;'0!(! (M#8(M4) B)4!2+0V")0 at RXW-P'"/_ at BT0D +M"(M $(E$) 2+5"0(@7H$0'H)"'44QP)T_@<(QT(00'H)"(G&BT4 Z]*+1"0( +MBU $BT(T@\ ,B4(TBT#\BU0D"(E"$(/L#/]R!.B!IO__@\00B<*+1"0(B5 $ +M@?I >@D(=0?'0 Q >@D(BW0D!(M% .N)C78 B70D"($^=/X'"'44O@ #' +M1?PP>@D(@^T$BT4$_^"+1"0(BT 0B40D!(M4) B!>@1 >@D(=0_'0A! >@D( +MQP)T_@<(ZT"+1"0(BU $BT(T@\ ,B4(TBT#\BU0D"(E"$(/L#/]R!.CNI?__ +M@\00B<*+1"0(B5 $@?I >@D(=0?'0 Q >@D(O@$ "+5"0$B57\@^T$BT4$ +MZX.0B70D"($^7/X'"'5(@7X$0'H)"'0+BU8,BT- at B4($ZPJ+0V"+5"0(B4($ +MBT- at QT $0'H)"(M#8&;'0!(! (M#8(M4) B)4!2+0V")0 at RX*-T'"/_ at BT0D +M"(%X!$!Z"0AU%8M#!(M4) B)0A#' ES^!PB+10#KW(M$) B+2 2+032+4P2) +M4 2+033' $33!PB#[ R+5"04_W($Z""E__^#Q!")P8M$) B)2 2!^4!Z"0AU +M!\= #$!Z"0B+10#KE(GVB70D"($^7/X'"'4*O@ "+10#_X(M$) B!> 1 +M>@D(=16+0P2+5"0(B4(0QP)<_@<(BT4 Z]R+1"0(BT@$BT$TBU,$B5 $BT$T +MQP!$TP<(@^P,BU0D%/]R!.B>I/__@\00B<&+1"0(B4@$@?E >@D(=0?'0 Q +M>@D(BT4 ZY2#QP@[>UQW(H/L#%;HR[?__X/$$(G!P> $ P6 * H(@W@, '0A +MBU ,ZS;'0VP( QT, at _@ ,=#)&#W!PBX*-@'"/_ at C5?\QP)$_@<(B4H$ +MBUQW-(GY*<&#P03' 5S[!PB) +M<02+0P2)00B+0PB)00R+0PR)01"+0Q!FB4$49HE1%KH ZQB)0VS'0R#0 +M QT,D$/@'"+ at HV <(_^"+1"0(.5 $=@N+1) (B421&$+K[(G.BT4 Z^.) +M]H/'##M[7'<9C4?XQP 4S0<(9L= !@ B7 (B<:+10#_X,=#; P #'0R#^ +M QT,DE/@'"+ at HV <(Z^*-=@"+0V!FQT 2! "+0V")@D( +M= V+4V"A("<*"(E0!.L(BT- at HQPG"@B+0V"C("<*".ECX___C78 BT- at 9L= +M$@4 BT- at B7 4 at 3T<)PH(0'H)"'0-BU- at H2 G"@B)4 3K"(M#8*,<)PH(BT-@ +MHR G"@CI(^/__XUV (M#8&;'0!(& .BNN@ B40D$+E9%[?1B?#WX8E$) B) +M5"0,BTPD#,'I#@-,)!"+0V")2!3'1"04 (L5)"<*"('Z0'H)"'0..4H4 +M BW8$_R:-=@ ! '@ (MV!/]E (GV +M 0 !X "+=@2+10"+0/ #10#_X(GV 0 !X "+=@2+10"+0.P#10#_ +MX(GV 0 !X "+=@2+10"+0.@#10#_X(GV 0 !X "+=@2+10"+0.0# +M10#_X(GV 0 !X "+=@2+10"+0. #10#_X(GV 0 !X "+=@2+10"+ +M0-P#10#_X(GV 0 !X "+=@2+10"+0-@#10#_X(GV 0 !X "+=@2+ +M10"+0-0#10#_X(GV 0 "( "+=@3_)HUV $ 0 @ BW8$_R:-=@ ! +M $ 'P (MV!/\FC78 0 ! "$ "+=@3_)HUV @ N BT- at QT $ +M0'H)"(M#8(E&!(M#8&;'0!(" (M#8(EP%,<&$/T'"(ET) B)\8'A / / ,'I +M!XGP)0 \/\)P8-Y$ !T)XM!$(T$P(L5$"D*"(M$@A")1 at B+01"-!,"+%1 I +M"@B+3"0(B4R"$.F1W___D $ 0 O BU- at BT8$B4($BT- at B48$BT- at 9L= +M$@( BT- at B7 4Z67?__^0 " "T "+0V#'0 1 >@D(BT- at B48$BT- at 9L= +M$@( BT- at B7 4QP80_0<(B70D"(GQ@>$ \ \ P>D'B? E #P_PG!@WD0 '0G +MBT$0C03 BQ40*0H(BT2"$(E&"(M!$(T$P(L5$"D*"(M,) B)3((0Z>W>__^0 +M #L "#[ QHZ! )".@?@?__C78 0 $ "#[ QH_! )".@'@?__ +MC78 $ #@ "#[ QH&!$)".CO@/__C78 $ $ "#[ QH,!$)".C7 +M@/__C78 H "#[ QH3!$)".B_@/__C78 ! #D "#[ QH;!$) +M".BG@/__C78 ! #H "#[ QHA!$)".B/@/__C78 ! #( "#[ QH +MH!$)".AW@/__C78 ! #( "#[ QHO!$)".A?@/__C78 $, "# +M[ QHV!$)".A'@/__C78 $( "#[ QH\!$)". at O@/__C78 $0 +M "#[ QH$!()". at 7@/__C78 $4 "#[ QH+!()".C_?___C78 +M H "#[ QH2!()".CG?___C78 H "#[ QH;!()".C/?___C78 +M H "#[ QHD!()".BW?___C78 H "#[ QHJ!()".B??___ +MC78 H "#[ QHR!()".B'?___C78 0 ! #< "#[ QHZ!()".AO +M?___C78 H "#[ QH!!,)".A7?___C78 0 ! $ "#[ QH*!,) +M". at _?___C78 #, "#[ QH2!,)". at G?___C78 #0 "#[ QH +M9!,)".@/?___C78 #4 "#[ QHA!,)".CW?O__C78 0 ! #8 "# +M[ QHJ!,)".C??O__C78 H #_90"0 +M "P "#[02)=03'10#TT0<(BT- at 9L= +M$ 4 BT- at B6@TBU-HC4<$B4($O at 4 #I;KS__Y"+0V"+:#0%C (E#5(M# +M:(MX!(/O!(G"BT 8P> , P)(B4-<_V4 "0 "#Q02+!@^_0/R#^$EW +M!_\DA< 3"0B+!O_ at BW8$Z^6+10#K]) ) (/%!/]E (GVZ02\__^- +M=@"++3 at L"@B+10")1"0(@\4$_V0D" D BW8$@\4$BP8/OT#\@_A) +M=P?_)(7H% D(BP;_X(MV!.OEBT4 Z_2)]@ 9 C47T.T-4R+1A")1>B+1 at R)1>2+1 at B)1>"+=@2#[2"#[02XO#0("/_ at BT/XZ_F0BT4$ +MB40D"(/%"($X$/T'"'4.@^P,_W $Z+:/__^#Q!"+5"0(@>( \ \ P>H'BT0D +M""4 /#_"<*#>A =#N+3"0(@3D0_0<(=!>+0A"-!,"+%1 I"@B-1((4BQ") +M40B)"(M$) B)< 3' 'C\!PB+10"+0/ #10#_X(M4) B)<@3' IC[!PB+10"+ +M0/ #10#KYHM%!(E$) B#Q0B!.!#]!PAU#H/L#/]P!. at EC___@\00BU0D"('B +M / / ,'J!XM$) @E #P_PG"@WH0 '0[BTPD"($Y$/T'"'07BT(0C03 BQ40 +M*0H(C42"%(L0B5$(B0B+1"0(B7 $QP!X_ <(BT4 BT#L T4 _^"+5"0(B7($ +MQP*P^P<(BT4 BT#L T4 Z^:+102)1"0(@\4(@3 at 0_0<(=0Z#[ S_< 3HE([_ +M_X/$$(M4) B!X@#P#P#!Z@>+1"0()0 \/\)PH-Z$ !T.XM,) B!.1#]!PAT +M%XM"$(T$P(L5$"D*"(U$@A2+$(E1"(D(BT0D"(EP!,< >/P'"(M% (M Z -% +M /_ at BU0D"(ER!,<"R/L'"(M% (M Z -% .OFBT4$B40D"(/%"($X$/T'"'4. +M@^P,_W $Z ..__^#Q!"+5"0(@>( \ \ P>H'BT0D""4 /#_"<*#>A =#N+ +M3"0(@3D0_0<(=!>+0A"-!,"+%1 I"@B-1((4BQ")40B)"(M$) B)< 3' 'C\ +M!PB+10"+0.0#10#_X(M4) B)<@3' N#[!PB+10"+0.0#10#KYHM%!(E$) B# +MQ0B!.!#]!PAU#H/L#/]P!.ARC?__@\00BU0D"('B / / ,'J!XM$) @E #P +M_PG"@WH0 '0[BTPD"($Y$/T'"'07BT(0C03 BQ40*0H(C42"%(L0B5$(B0B+ +M1"0(B7 $QP!X_ <(BT4 BT#@ T4 _^"+5"0(B7($QP+X^P<(BT4 BT#@ T4 +MZ^:+102)1"0(@\4(@3 at 0_0<(=0Z#[ S_< 3HX8S__X/$$(M4) B!X@#P#P#! +MZ@>+1"0()0 \/\)PH-Z$ !T.XM,) B!.1#]!PAT%XM"$(T$P(L5$"D*"(U$ +M at A2+$(E1"(D(BT0D"(EP!,< >/P'"(M% (M W -% /_ at BU0D"(ER!,<"$/P' +M"(M% (M W -% .OFBT4$B40D"(/%"($X$/T'"'4.@^P,_W $Z%",__^#Q!"+ +M5"0(@>( \ \ P>H'BT0D""4 /#_"<*#>A =#N+3"0(@3D0_0<(=!>+0A"- +M!,"+%1 I"@B-1((4BQ")40B)"(M$) B)< 3' 'C\!PB+10"+0-@#10#_X(M4 +M) B)<@3' BC\!PB+10"+0-@#10#KYHM%!(E$) B#Q0B!.!#]!PAU#H/L#/]P +M!.B_B___@\00BU0D"('B / / ,'J!XM$) @E #P_PG"@WH0 '0[BTPD"($Y +M$/T'"'07BT(0C03 BQ40*0H(C42"%(L0B5$(B0B+1"0(B7 $QP!X_ <(BT4 +MBT#4 T4 _^"+5"0(B7($QP) _ <(BT4 BT#4 T4 Z^9#____LO[__R'^__^0 +M_?____S__V[\___=^___3/O__P ! *@ (M%!(E$) B#Q0B!.!#] +M!PAU#H/L#/]P!.@"B___@\00BU0D"('B / / ,'J!XM$) @E #P_PG"@WH0 +M '0UBTPD"($Y$/T'"'07BT(0C03 BQ40*0H(C42"%(L0B5$(B0B+1"0(B7 $ +MQP!X_ <(BT4 _^"+5"0(B7($QP*(^P<(BT4 Z^R-=@ +M ) (/%!/]E )"0 "0 +M "+!H/H" ^W0 2#^$EW!_\DA7 at G"0B#[ QH:"<)".@&;?__#[]&%(E$)!"# +M^ %T0;H, @\<,.WM<=R6-5_C' KS,!PB+1"002&:)0 at 2)<@AFQT(& ") +MUH/%!(M% .L-B5-LQT4 N!$("(M#^/_@@\4$N%S[!PCK](L&#[] ]HE$)!"# +M^ %T0;H, @\<,.WM<=R6-3_C' ;S,!PB+1"002&:)002)<0AFQT$& ") +MSH/%!(M% .NSB5-LQT4 N!$("(M#^.ND@\4$BP;KG0^_1 at 2)1"00 at _@!#X2> +M B70D! ^_5@:-%)4, =<[>UQW/HGY*=&#P02)3"08QP&\S <(BT0D +M$$AFB4$$BT0D! ^_0 :)1"049HE!!HM4) 2+0 at B)00C'1"0, .L2B5-L +MQT4 N!$("(M#^.DF____BTPD%#E,) QS'XM$) R+5"0$BT2"#(M4) R+3"08 +MB421#$*)5"0,Z]>+="08@\4$BT4 Z>[^__^#Q03'0P2X$0@(N+S,!PCIVO[_ +M_\=% + at 1" B+!NG,_O__BW8$Z5;^__^)]B$ D BP:#Z @/MT $@_A) +M=P?_)(6P* D(@^P,:* H"0CH4FO__P^_1A2)1"00 at _@!=&"Z$ (/'$#M[ +M7'UQW*HU'](E$) S' +S, +M!PB+1"002(M4) QFB4($B7((9L="!@$ N@ #K#XE3;,=% &P3" B+0_CK +M at 872=0Z+102+3"0,B4$,L@'K[HMT) R#Q0B+10#I8/___X/%!(L&Z5;___\/ +MOT8$B40D$(/X 0^$KP (ET) P/OU8&C125$ '7.WM<=T")^2G1@\$$ +MB4PD&,@I"0B#[ QHV"D) +M".A&:?__#[]&%(E$)!"#^ %T;[D4 @\<4.WM<=RF-5_")5"0,QP*\S <( +MBT0D$$AFB4($B7((9L="!@( QT0D! #K#XE+;,=% '@5" B+0_C_X(-\ +M) 0!=Q>+3"0$BT2-!(M4) R)1(H,08E,) 3KXHMT) R#Q0R+10#KU(/%!+A< +M^P<(Z\J+!@^_0/:)1"00 at _@!='6Y% (/'%#M[7'BU0D% -4) 2+3"0$BTR-!(M$)!B)3) ,_T0D +M!.O;BW0D&(/%#(M% .E5_O__@\4$QT,$>!4("+B\S <(Z4'^___'10!X%0@( +MBP;I,_[__XMV!.FY_?__D&( D BP:#Z @/MT $@_A)=P?_)(4@*PD( +M@^P,:! K"0CH]F;__P^_1A2)1"00 at _@!=&^Y% (/'%#M[7'UQW*8U/\(E, +M) S' ;S,!PB+1"002&:)002)<0AFQT$& @#'1"0$ .L2B4MLQT4 R!<( +M"(M#^.ES____ at WPD! %W%XM4) 2+1)4$BTPD#(E$D0Q"B50D!.OBBW0D#(/% +M#(M% .E&____@\4$BP;I//___P^_1 at 2)1"00 at _@!#X36 B70D# ^_3@:- +M#(T4 <\[>UQW28GZ*UQW +M)HU7](E4) S' KS,!PB+1"002&:)0 at 2)<@AFQT(& 0"Z .L/B5-LQT4 +M&!H("(M#^/_ at A=)U#HM%!(M,) R)00RR >ONBW0D#(/%"(M% .O@@\4$N%S[ +M!PCKUHL&#[] ]HE$)!"#^ %T9[H0 @\<0.WM<=RJ-1_2)1"0,QP"\S <( +MBT0D$$B+5"0,9HE"!(ER"&;'0 at 8! +H ZP^)4VS'10 8&@@(BT/XZX&% +MTG4.BT4$BTPD#(E!#+(!Z^Z+="0,@\4(BT4 Z6#___^#Q02+!NE6____#[]& +M!(E$)!"#^ $/A*\ ")="0,#[]6!HT4E1 !USM[7'= B?DIT8/!!(E, +M)!C' ;S,!PB+1"002&:)002+1"0,#[] !HE$)!2+1"040&:)00:+5"0,BT(( +MB4$(N@ #K$HE3;,=% !@:" B+0_CIW?[__SM4)!1S$XM,) R+3)$,BT0D +M&(E,D Q"Z^>Z (72=1:+102+5"04BTPD&(E$D0RZ 0 .OFBW0D&(/% +M"(M% .F6_O__@\4$QT,$&!H("+B\S <(Z8+^___'10 8&@@(BP;I=/[__XMV +M!.G]_?__D $ D BP:#Z @/MT $@_A)=P?_)(60+0D(@^P,:( M"0CH +MFF+__P^_1A2)1"00 at _@!=&"Z$ (/'$#M[7'UQW*HU'](E$) S' +S,!PB+1"002(M4) QFB4($B7(( +M9L="!@$ N@ #K#XE3;,=% "0<" B+0_CK at 872=0Z+102+3"0,B4$,L@'K +M[HMT) R#Q0B+10#I8/___X/%!(L&Z5;___\/OT8$B40D$(/X 0^$KP (ET +M) P/OU8&C125$ '7.WM<=T")^2G1@\$$B4PD&," B+!NGD_?__BW8$Z9_]__^-=@ " ) (L&@^@(#[= !(/X +M27<'_R2% # )"(/L#&CP+PD(Z")>__\/OT84 at _@!=12+102)10#'100D' @( +MN%S[!PC_X(/X G1TQT0D$!0 "#QQ0[>UQW)XU7\(E4) S' KS,!PB#Z )F +MB4($B7((9L="!@( QT0D$ #K$XM,)!")2VS'10"<( @(BT/XZZ^#?"00 +M 7<7BU0D$(M$E02+3"0,B421#$*)5"00Z^*+="0,@\4,BT4 ZX6#Q02X7/L' +M".EX____BP8/OT#V at _@!=12+102)10#'100D' @(BP;I6?___X/X G1ZQT0D +M$!0 "#QQ0[>UQW)XU7\(E4) S' KS,!PB#Z )FB4($B7((9L="!@( QT0D +M$ #K%HM,)!")2VS'10"<( @(BT/XZ0?___^#?"00 7<7BU0D$(M$E02+ +M3"0,B421#$*)5"00Z^*+="0,@\4,BT4 Z=K^__^#Q02+!NG0_O__#[]&!(/X +M 74>BT4$B44 QT4$)!P(",=#!"0<" BXO,P'".FI_O__ at _@"#X3< B70D +M# ^_5@:-#)44 B4PD$ '/.WM<=T>)^BG*@\($B50D&,<"O,P'"(/H F:) +M0 at 2+3"0,#[])!HE,)!2+1"04@\ "9HE"!HM4) R+0 at B+3"08B4$(QT0D$ +M #K%HM$)!")0VS'10"<( @(BT/XZ2G^__^+5"04.50D$',?BTPD$(M$) R+ +M3(@,BT0D$(M4)!B)3((,0(E$)!#KU\=$)! @WPD$ %W'HM,)!0#3"00 +MBT0D$(M$A02+5"08B42*#/]$)!#KVXMT)!B#Q0R+10#IQ/W__X/%!,=#!)P@ +M" BXO,P'".FP_?__QT4 G" ("(L&Z:+]__^+=@3I7?W__Y " ) (L& +M@^@(#[= !(/X27<'_R2%.#$)"(/L#&@H,0D(Z'9;__\/OT84 at _@!=12+102) +M10#'100P'@@(N%S[!PC_X(/X G4:BT4$B44 BT4(B44$QT4(N!$("+A<^P<( +MZ]^#^ -T=\=$)! 4 @\<4.WM<=R>-5_")5"0,QP*\S <(@^@#9HE"!(ER +M"&;'0 at 8" ,=$)! ZQ.+3"00B4MLQT4 2",("(M#^.N0 at WPD$ %W%XM4 +M)!"+1)4$BTPD#(E$D0Q"B50D$.OBBW0D#(/%#(M% .EC____@\4$N%S[!PCI +M5O___XL&#[] ]H/X 744BT4$B44 QT4$,!X("(L&Z3?___^#^ )U&HM%!(E% +M (M%"(E%!,=%"+ at 1" B+!ND8____ at _@#='K'1"00% (/'%#M[7'+5"00BT25!(M,) R)1)$,0HE4)!#KXHMT +M) R#Q0R+10#IF?[__X/%!(L&Z8_^__\/OT8$@_@!=1Z+102)10#'100P'@@( +MQT,$)!P("+B\S <(Z6C^__^#^ )U)(M%!(E% (M%"(E%!,=%"+ at 1" C'0P2< +M( @(N+S,!PCI/_[__X/X P^$W (ET) P/OU8&C0R5% (E,)! !SSM[ +M7'='B?HIRH/"!(E4)!C' KS,!PB#Z -FB4($BTPD# ^_20:)3"04BT0D%(/ +M F:)0@:+5"0,BT((BTPD&(E!",=$)! ZQ:+1"00B4-LQT4 2",("(M# +M^.F__?__BU0D%#E4)!!S'XM,)!"+1"0,BTR(#(M$)!"+5"08B4R"#$")1"00 +MZ]?'1"00 (-\)! !=QZ+3"04 TPD$(M$)!"+1(4$BU0D&(E$B at S_1"00 +MZ]N+="08@\4,BT4 Z5K]__^#Q03'0P1((P@(N+S,!PCI1OW__\=% $@C" B+ +M!NDX_?__BW8$Z?/\__^-=@ # ) (L&@^@(#[= !(/X27<'_R2%<#() +M"(/L#&A@, at D(Z%Y8__\/OT84 at _@!=12+102)10#'102<( @(N%S[!PC_X(/X +M G4:BT4$B44 BT4(B44$QT4()!P("+A<^P<(Z]^#^ -T=\=$)! 8 @\<8 +M.WM<=R>-5^R)5"0,QP*\S <(@^@#9HE"!(ER"&;'0 at 8# ,=$)! ZQ.+ +M3"00B4MLQT4 8"8("(M#^.N0 at WPD$ )W%XM4)!"+1)4$BTPD#(E$D0Q"B50D +M$.OBBW0D#(/%$(M% .EC____@\4$N%S[!PCI5O___XL&#[] ]H/X 744BT4$ +MB44 QT4$G" ("(L&Z3?___^#^ )U&HM%!(E% (M%"(E%!,=%""0<" B+!ND8 +M____ at _@#='K'1"00& (/'&#M[7'+5"00BT25!(M,) R)1)$,0HE4)!#KXHMT) R#Q1"+10#IF?[__X/%!(L& +MZ8_^__\/OT8$@_@!=1Z+102)10#'102<( @(QT,$)!P("+B\S <(Z6C^__^# +M^ )U)(M%!(E% (M%"(E%!,=%""0<" C'0P2<( @(N+S,!PCI/_[__X/X P^$ +MW (ET) P/OU8&C0R5& (E,)! !SSM[7'='B?HIRH/"!(E4)!C' KS, +M!PB#Z -FB4($BTPD# ^_20:)3"04BT0D%(/ V:)0@:+5"0,BT((BTPD&(E! +M",=$)! ZQ:+1"00B4-LQT4 8"8("(M#^.F__?__BU0D%#E4)!!S'XM, +M)!"+1"0,BTR(#(M$)!"+5"08B4R"#$")1"00Z]?'1"00 (-\)! "=QZ+ +M3"04 TPD$(M$)!"+1(4$BU0D&(E$B at S_1"00Z]N+="08@\40BT4 Z5K]__^# +MQ03'0P1@)@@(N+S,!PCI1OW__\=% & F" B+!NDX_?__BW8$Z?/\__^-=@ # +M ) (L&@^@(#[= !(/X27<'_R2%J#,)"(/L#&B8,PD(Z$95__\/OT84 +M at _@!=12+102)10#'101((P@(N%S[!PC_X(/X G4:BT4$B44 BT4(B44$QT4( +M,!X("+A<^P<(Z]^#^ -U((M%!(E% (M%"(E%!(M%#(E%",=%#+ at 1" BX7/L' +M".NZ at _@$='K'1"00& (/'&#M[7'+5"00BT25!(M,) R)1)$,0HE4)!#KXHMT) R#Q1"+10#I.____X/%!+A< +M^P<(Z2[___^+!@^_0/:#^ %U%(M%!(E% ,=%!$@C" B+!ND/____ at _@"=1J+ +M102)10"+10B)103'10 at P'@@(BP;I\/[__X/X W4 at BT4$B44 BT4(B44$BT4, +MB44(QT4,N!$("(L&ZL=$)! 8 @\<8.WM<=R>-5^R)5"0, +MQP*\S <(@^@$9HE"!(ER"&;'0 at 8# ,=$)! ZQ:+3"00B4MLQT4 >"D( +M"(M#^.EY_O__ at WPD$ )W%XM4)!"+1)4$BTPD#(E$D0Q"B50D$.OBBW0D#(/% +M$(M% .E,_O__@\4$BP;I0O[__P^_1 at 2#^ %U'HM%!(E% ,=%!$@C" C'0P0D +M' @(N+S,!PCI&_[__X/X G4DBT4$B44 BT4(B44$QT4(,!X(",=#!)P@" BX +MO,P'".GR_?__ at _@#=2J+102)10"+10B)102+10R)10C'10RX$0@(QT,$8"8( +M"+B\S <(ZUQW +M1XGZ*BTPD% -,)!"+1"00BT2%!(M4)!B)1(H,_T0D$.O; +MBW0D&(/%$(M% .G>_/__@\4$QT,$>"D("+B\S <(Z T"0B# +M[ QHT#0)".BR4?__#[]&%(/X 744BT4$B44 QT4$8"8("+A<^P<(_^"#^ )U +M&HM%!(E% (M%"(E%!,=%")P@" BX7/L'".O?@_@#=2"+102)10"+10B)102+ +M10R)10C'10PD' @(N%S[!PCKNH/X!'1ZQT0D$!P "#QQP[>UQW)XU7Z(E4 +M) S' KS,!PB#Z 1FB4($B7((9L="!@0 QT0D$ #K%HM,)!")2VS'10 , +M+0@(BT/XZ6C___^#?"00 W<7BU0D$(M$E02+3"0,B421#$*)5"00Z^*+="0, +M@\44BT4 Z3O___^#Q02X7/L'".DN____BP8/OT#V at _@!=12+102)10#'101@ +M)@@(BP;I#____X/X G4:BT4$B44 BT4(B44$QT4(G" ("(L&Z?#^__^#^ -U +M((M%!(E% (M%"(E%!(M%#(E%",=%#"0<" B+!NG+_O__ at _@$='K'1"00' +M (/''#M[7'?[__X-\)! #=Q>+5"00BT25!(M,) R) +M1)$,0HE4)!#KXHMT) R#Q12+10#I3/[__X/%!(L&Z4+^__\/OT8$@_@!=1Z+ +M102)10#'101@)@@(QT,$)!P("+B\S <(Z1O^__^#^ )U)(M%!(E% (M%"(E% +M!,=%")P@" C'0P2<( @(N+S,!PCI\OW__X/X W4JBT4$B44 BT4(B44$BT4, +MB44(QT4,)!P(",=#!& F" BXO,P'".G#_?__ at _@$#X3< B70D# ^_5@:- +M#)4< B4PD$ '/.WM<=T>)^BG*@\($B50D&,<"O,P'"(/H!&:)0 at 2+3"0, +M#[])!HE,)!2+1"04@\ $9HE"!HM4) R+0 at B+3"08B4$(QT0D$ #K%HM$ +M)!")0VS'10 ,+0@(BT/XZ4/]__^+5"04.50D$',?BTPD$(M$) R+3(@,BT0D +M$(M4)!B)3((,0(E$)!#KU\=$)! @WPD$ -W'HM,)!0#3"00BT0D$(M$ +MA02+5"08B42*#/]$)!#KVXMT)!B#Q12+10#IWOS__X/%!,=#! PM" BXO,P' +M".G*_/__QT4 #"T("(L&Z;S\__^+=@3I=_S__XUV 4 D BP:#Z @/ +MMT $@_A)=P?_)(4<- at D(@^P,: @V"0CH'D[__P^_1A2#^ %U%(M%!(E% ,=% +M! PM" BX7/L'"/_@@_@"=1J+102)10"+10B)103'10A@)@@(N%S[!PCKWX/X +M W4 at BT4$B44 BT4(B44$BT4,B44(QT4,G" ("+A<^P<(Z[J#^ 1U)HM%!(E% +M (M%"(E%!(M%#(E%"(M%$(E%#,=%$"0<" BX7/L'".N/@_@%='K'1"00( +M (/'(#M[7'+5"00BT25!(M,) R) +M1)$,0HE4)!#KXHMT) R#Q1B+10#I$/___X/%!+A<^P<(Z0/___^+!@^_0/:# +M^ %U%(M%!(E% ,=%! PM" B+!NGD_O__ at _@"=1J+102)10"+10B)103'10A@ +M)@@(BP;IQ?[__X/X W4 at BT4$B44 BT4(B44$BT4,B44(QT4,G" ("(L&Z:#^ +M__^#^ 1U)HM%!(E% (M%"(E%!(M%#(E%"(M%$(E%#,=%$"0<" B+!NEU_O__ +M at _@%='K'1"00( (/'(#M[7'+ +M5"00BT25!(M,) R)1)$,0HE4)!#KXHMT) R#Q1B+10#I]OW__X/%!(L&Z>S] +M__\/OT8$@_@!=1Z+102)10#'100,+0@(QT,$)!P("+B\S <(Z<7]__^#^ )U +M)(M%!(E% (M%"(E%!,=%"& F" C'0P2<( @(N+S,!PCIG/W__X/X W4JBT4$ +MB44 BT4(B44$BT4,B44(QT4,G" (",=#!& F" BXO,P'".EM_?__ at _@$=3"+ +M102)10"+10B)102+10R)10B+11")10S'11 D' @(QT,$#"T("+B\S <(Z3C] +M__^#^ 4/A-P ")="0,#[]6!HT,E2 ")3"00 <\[>UQW1XGZ*BTPD% -,)!"+1"00BT2%!(M4)!B)1(H,_T0D$.O;BW0D&(/%&(M% +M .E3_/__@\4$QT,$H# ("+B\S <(Z3_\___'10"@, @(BP;I,?S__XMV!.GL +M^___!@ "0 "+!H/H" ^W0 2#^$EW!_\DA5 at W"0B#[ QH1#<)".@"2O__ +M#[]&%(/X 744BT4$B44 QT4$H# ("+A<^P<(_^"#^ )U&HM%!(E% (M%"(E% +M!,=%" PM" BX7/L'".O?@_@#=2"+102)10"+10B)102+10R)10C'10Q@)@@( +MN%S[!PCKNH/X!'4FBT4$B44 BT4(B44$BT4,B44(BT40B44,QT40G" ("+A< +M^P<(ZX^#^ 5U+XM%!(E% (M%"(E%!(M%#(E%"(M%$(E%#(M%%(E%$,=%%"0< +M" BX7/L'".E;____ at _@&='K'1"00) (/')#M[7'+5"00BT25!(M,) R)1)$,0HE4)!#KXHMT) R#Q1R+10#I +MW/[__X/%!+A<^P<(Z<_^__^+!@^_0/:#^ %U%(M%!(E% ,=%!* P" B+!NFP +M_O__ at _@"=1J+102)10"+10B)103'10@,+0@(BP;ID?[__X/X W4 at BT4$B44 +MBT4(B44$BT4,B44(QT4,8"8("(L&Z6S^__^#^ 1U)HM%!(E% (M%"(E%!(M% +M#(E%"(M%$(E%#,=%$)P@" B+!NE!_O__ at _@%=2R+102)10"+10B)102+10R) +M10B+11")10R+112)11#'110D' @(BP;I$/[__X/X!G1ZQT0D$"0 "#QR0[ +M>UQW)XU7X(E4) S' KS,!PB#Z 9FB4($B7((9L="!@8 QT0D$ #K%HM, +M)!")2VS'10"\- @(BT/XZ;[]__^#?"00!7<7BU0D$(M$E02+3"0,B421#$*) +M5"00Z^*+="0,@\4BT4$B44 +MQT4$H# (",=#!"0<" BXO,P'".E at _?__ at _@"=22+102)10"+10B)103'10@, +M+0@(QT,$G" ("+B\S <(Z3?]__^#^ -U*HM%!(E% (M%"(E%!(M%#(E%",=% +M#& F" C'0P1@)@@(N+S,!PCI"/W__X/X!'4PBT4$B44 BT4(B44$BT4,B44( +MBT40B44,QT40G" (",=#! PM" BXO,P'".G3_/__ at _@%=3:+102)10"+10B) +M102+10R)10B+11")10R+112)11#'110D' @(QT,$H# ("+B\S <(Z9C\__^# +M^ 8/A-P ")="0,#[]6!HT,E20 ")3"00 <\[>UQW1XGZ*BTPD% -,)!"+1"00BT2%!(M4)!B)1(H,_T0D$.O;BW0D&(/%'(M% .FS +M^___@\4$QT,$O#0("+B\S <(Z9_[___'10"\- @(BP;ID?O__XMV!.E,^___ +M_R:)]H/M#(EU",=%! $ #'10"(UP<(Z1^9__^-=@#_)HGV@^T,B74(QT4$ +M 0 ,=% (C7!PCI_YC__XUV /\FB?:#[0R)=0C'100! QT4 B-<'".G? +MF/__C78 _R:)]H/M#(EU",=%! ( #'10"(UP<(Z;^8__^-=@#_)HGV@^T, +MB74(QT4$ @ ,=% (C7!PCIGYC__XUV /\FB?:#[0R)=0C'100" QT4 +MB-<'".E_F/__C78 _R:)]H/M#(EU",=%! ( #'10"(UP<(Z5^8__^-=@#_ +M)HGV@^T,B74(QT4$ @ ,=% (C7!PCI/YC__XUV /\FB?:#[0R)=0C'100" +M QT4 B-<'".D?F/__C78 _R:)]H/M#(EU",=%! , #'10"(UP<(Z?^7 +M__^-=@#_)HGV@^T,B74(QT4$ P ,=% (C7!PCIWY?__XUV /\FB?:#[0R) +M=0C'100# QT4 B-<'".F_E___C78 _R:)]H/M#(EU",=%! , #'10"( +MUP<(Z9^7__^-=@#_)HGV@^T,B74(QT4$ P ,=% (C7!PCI?Y?__XUV /\F +MB?:#[0R)=0C'100# QT4 B-<'".E?E___C78 _R:)]H/M#(EU",=%! , +M #'10"(UP<(Z3^7__^-=@#_)HGV@^T,B74(QT4$ P ,=% (C7!PCI'Y?_ +M_XUV /\FB?:#[0R)=0C'100$ QT4 B-<'".G_EO__C78 _R:)]H/M#(EU +M",=%! 4 #'10"(UP<(Z=^6__^-=@#_)HGV@^T,B74(QT4$!@ ,=% (C7 +M!PCIOY;__XUV /\FB?:#[0R)=0C'100' QT4 B-<'".F?EO__C78 _R:) +M]H/M#(EU",=%! @ #'10"(UP<(Z7^6__^0D)!75E.+="00@^P(:( X"0A6 +MZ/M&__^)QX/L#&H>Z"M8_/^)P??9B?LARXU4-_\ARBG: <*#Q!QJ!U)3Z.U7 +M_/^#Q!"%P'0.@^P(5VB0. D(Z%Q"__^)^%M>7\.#Q 3#5E.#[ 2+5"00BUPD +M%(MT)!BX (72= >#^@%T+NM9@^P,:@[H=____\8 6,9 6B)6 +&0 90 +MQD 'N(EP",9 #/_&0 W@@\00ZRV#[ QJ$>A+____Q@!HB5@!QD %N(EP!L9 +M"FC'0 N*/ @(QD /_\9 $."#Q!"#Q 1;7L-3@^P(BUPD$( [:'0=@#M8=!.# +M[ A3:+ at X"0CH!4+__X/$$.LR@#MH=1"#[ S_ % <.)]XG9 +MA?9T+8ES&(L#B4,$N@$ "-0R Y\G,9QT $ ,= & ")2 A"@\ @ +M.?IRYXG8Z;$ "-4PB+6PB%VW6CZ$-V ")QX/L#%#H*@, (U?0(/$$(GU +MB=F%]G0NB7,8BT= B4,$N@$ "-1V Y\G,9QT $ ,= & ")2 A" +M@\ @.>IRYX'^_0 '=1NOX ")\,'@!8T\&"GR="V)5QB+!XE'!+D! +MC4<@.=%S&<= ! #'0!@ B7@(08/ (#G1#[ R)\,'@!0'84.CX +M @\00B=B#Q Q;7E]=PX/L&&H!Z)W^__^#Q!S#55=64X/L#(ML)""[ +M +X OP "Y (L5,"D*"(72=#B!>AC^ =2&%]G0+BP$% 0 +M #D"= N)UHG/NP$ #K 4,YZW04ZP6^ (G1BU((A=)UR#GK=1:%_W4* +MBT((HS I"@CK(8M""(E'".L9@^P,5>@-=@ B<.)!"3H[P$ (US0(/$$+O^ +M B?''1AC^ BP:)1 at 2Z 0 (U&(,= ! #'0!@ B4@(0H/ +M(#G:)Z,'@"(/H HE&&(GP@\0,6UY?7<-64X/L!(M,)!"!>1C^ =A&# +M[ Q1Z.H "#Q!#IW +L BQ4P*0H(A=)T%8L".P%S#XG3BU((A=)T +M!HL".P%R\87;=1"A,"D*"(E!"(D-,"D*".M:BT,(B4$(B4L(B , P$[ +M G4UB=@#0AB)01B+0 at B)00B+#Q 1;7L-75E.+7"00BT,8P> ,B<;![A1&=%R__@ (/L +M#(G8)0 \/]0Z'$ "#Q!")V<=#&/X "+ XE#!+H! C4, at QT $ +M ,= & ")2 A"@\ @.?IRYX/L#%/HEO[__X/$$('# 0 $YUJ5M>7\-3 +M@^P(BT0D$(7 =!6+6 B#[ Q0Z&[^__^)V(/$$(7;=>N#Q A;PU.+1"0(C9 +M( C4A !0#P#P")PSG0<@^)$8/!(('" ! #G3<_%;PY"+1"0$QP RP =06)2RSK$HM#+(M3)(E0!(M#+(E("(E++(L!B4,D!0 0 ") +M0RC_0S3_!5 at I"@B)R(/$"%O#55=64X/L7,=$)"P QT0D) #H=VC_ +M_^BF2/__Z"AS___HDH;__XE$)#"#?"1T '07H5 J"@A(HSPI"@C'!4 I"@@! +M ZVS'!3PI"@@ QT0D( "#/5 J"@@ =CJ+'1 I"@B+-5 J"@B+ +M5"0 at C032P> "BTP8!(M1" -1'#M4& QR"HM,)"")#3PI"@C_1"0 at .W0D('?2 +MH5 J"@A(.P4\*0H(#Y3 #[; HT I"@C'!3 at I"@@! QP5 at + H( 0 (,] +M0"D*" !T'X/L#*%0*@H(C03 P> " P40*0H(_W#PZ,0\ "#Q!"#/5 J"@@! +M=2&A'"D*"(M0,(D55"D*",= , "A'"D*",= - #'!5 at I"@@ +MQT0D( "+1"0 at C13 P>("H1 I"@C'1 (41'H)"*$0*0H(QT0"$$1Z"0B] +M *$0*0H(@WP"" /AO< "+5"0 at C032P> "B40D'(-\)" =1&%[74- +M at SU0*@H( 0^'O0 (U$K0#!X 2+%1 I"@B)QHM,)!P#=!$$QT8D ,=& +M+ #'1C @^P,5NC0_?__B<*)1C"+ (E&/(E6.,=&0 #'1D0 +M QT9( (M6&(/$$(72= N#8AS^BU((A=)U]8-^( !T2XM&",'@#(G' +MP>\%=#Z#[ R-A_\/ #!Z Q0Z"WY__^)1DR+&(/$#%=J %/H:U+\_X/$$(M6 +M!(72=!&)6 at R#ZX"#2AP(BU((A=)U[T6A$"D*"(M4)!PY; ((#X<7_____T0D +M((M,)" [#3PI"@@/AKS^__^A/"D*"$")1"0 at .050*@H(#X:L O0 "+ +M%1 I"@B)TXM$)"#!X .)P0-$)""#?((( '1WB<^+1"0 at C10!C42M ,'@!(G& +M W23!(-^+ !U%H/L#%;HQ/S__XE&!,=&" $ "#Q!"+1B2)1CR+1BR)1CC' +M1C QT8T ,=&0 #'1D0 QT9( $6+'1 I"@B)^8M4 +M)""-!!>'_3"0 at BTPD(#L-/"D*"'>1 +MH5 J"@A(B40D(#L%/"D*"'9O@^P,BU0D+(T>'_3"0 at BTPD(#L-/"D*"'>1QP5$*0H( +M (/L#&AK4P@(Z!,Y #'!40I"@@ QP0D:U,("/^4)( #'!"24 +M*PH(Z$8+ "AE"L*"*-8+ H(QP64*PH( ,<%2"D*" "A*"<*"*-, +M*0H(QP4H)PH(0'H)",<%7"P*"$!Z"0C'!"1K4P@(Z*)I__^#Q!"] (,] +M0"D*" !T#H,]."D*" %T!>BN,P @SUL*0H( '4?@SUP*0H( '46 at SU<*0H( +M '07H60I"@@[!6 I"@AT"NB3) O0$ "+'5 J"@A+>':+%1 I"@B-!-N+ +M3(((27ACC3R% (7;=0V%R74)@SU0*@H( 7=(C02)P> $BQ40*0H(B<8# +M=!<$B1U$*0H(BT8L.T8X=0B+1CP[1B1S%H/L#%;H1!D +T! @\00Z5__ +M__^#?D #X5)_?__27FD2WF*A>T/A2O____H1P@ (7 #X4>____BQT0)PH( +MA=MT)X/L#/\SZ"D* "#Q!"%P'4-@^P,:.4X"0CH73;__XD#BUL0A=MUV>@N +M:?__QT0D( "#/5 J"@@ =GJ] (L5$"D*"(G3BT0D(,'@ XG! T0D +M((-\@@@ =$F)SXM$)""-% &-1*T P> $B<8#=),$@WPD( !U#87M=0F#/5 J +M"@@!=PF+5BR+1B2)0 at 1%BQT0*0H(B?F+5"0 at C007.6R#"'>Y_T0D((M,)" Y +M#5 J"@AWAH,]0"D*" !T)*$8*0H(BT $@W@@ '06BT (B40D)(/L#/]T)'SH +MJE$ (/$$*%8*0H(P> *B40D*,=$)" @SU0*@H( ^&# ( (M$)" [ +M!3PI"@AW#8L5$"D*"(T$P/]$@AR] (L5$"D*"(G3BT0D(,'@ XG! T0D +M((-\@@@ #X2Z 0 B4PD%(M$)""-% &-1*T P> $B<8#=),$@WPD( !U#87M +M=0F#/5 J"@@!=R2+5"0 at .Q4\*0H(#X<5 0 BU8LBP(K0 at 0% ! ,'X BE$ +M)"B+3"0 at .PT\*0H(#X?Q @WX@ '00BT0D)"M&",'@"@%$)"SK"HM&",'@ +M"@%$)"R#?"0@ '4(A>T/A(8 "#?B =$F+5C"%TG0+ at V(<_HM2"(72=?6# +M?@0 =0B+1C")1 at 3K'HM6!(72=!>+6 at B%VW4&BT8PB4((@V(<]XG:A=MUZ8M& +M" -&-(E&".LI@^P,_W8$Z)KV__^+5C")5 at 2+1C2)1 at B#Q!"%TG0+ at V(<_HM2 +M"(72=?7'1C QT8T (M6&(72=!6+6 at B#[ Q2Z.'T__^)VH/$$(7; +M=>N+5D2%TG0+ at V(<_HM2"(72=?6+1D2)1AB+1DB)1ASK38M61(72="V-?AB+ +M6 at B#8AS^B=&+1AB)0 at C'0 at P @WX8 '0&BT88B5 ,B0^)VH7;==:+1@@# +M1C2)1 at C'1C0 BT8< T9(B48<18L=$"D*"(M,)!2+5"0 at C001.6R#" ^' +M2O[___]$)""+3"0 at .0U0*@H(#X?T_?__ at SU *0H( ^$" ( (,]4"H*" $/ +MAOL! "+-3 J"@B++5 J"@BA&"D*"(M0!(M"" -"'(E$)!B+1"08N@ !2 +M4-\L)(UD) C<#4 J"@C=7"10H3 at J"@BZ %)0WRPDC60D"-U<)$C=1"1( +MW40D4-G)W>'?X-W9]L0!= ;=V-U$)%#9?"1&9HM$)$:T#&:)1"1$V6PD1-]\ +M)#C9;"1&BT0D.(G#N@ !25M\L)(UD) C<#4 at J"@C8-30Y"0C=7"1(H30J +M"@BZ %)0WRPDC60D"-U<)%#=1"10W40D2-G)W>'?X-W9]L0!= ;=V-U$ +M)$C9;"1$WWPD.-EL)$:+1"0XB<>#/5 J"@@!=ER#/5PJ"@@ =4*%]G1/H1 at I +M"@B+0 2+0 BZ %)0WRPDC60D"+H 4E;?+"2-9"0(W U@*@H(V#6H +M_ @(V $B<8#=),$@WX@ '04 at WY, '0.@^P,_W9,Z%?Q__^# +MQ!!%BQT0*0H(B?F+5"0 at C007.6R#"'>\_T0D((M,)" [#3PI"@AVB8,]4"H* +M" $/A0\! "#/50I"@@ =!&#[ S_-50I"@CHA/+__X/$$*$<*0H(BU PA=)T +M#L="' "+4 at B%TG7RH1PI"@B+2#2^,"H*"(,],"H*" !T<+H 4E'? +M+"2-9"0(W U *@H(V,"A,"H*"+H 4E#?+"39R8UD) C:Z=_@]L1%=3R- +M% FA,"H*"(G#*=.-!)N-!(#!X *Z / "BQT<*0H(N@ #WO__@\0$_S5<+ H(Z#=3__^#Q 3_-4 I"@CHZ&'__X/$!/\U/"D*"/]T +M)#C_="1(_W0D1/]T)$SH667__X/$(. at X6O__@\1<6UY?7<-75E._ (L5 +M2"D*"(/Z 0^$]@ (/Z 7(3N "#^@(/A*P! #IF@$ ,<%1"D*" +M "^6"P*"(L=6"P*"(7;#X2- @3O\_0<(=0>+4P2)%NMTBP,/MT#\@_ at X +M= R#^$!U5XM3!(D6ZUV#[ S_['!4 at I"@@! N $ #IR0 +Y,*0H(BQU,*0H( +M@?M >@D(=&R#[ Q3Z-4 "#Q!"%P'0"B<,/MU,0 at _H$=!.#^@1_!X/Z W00 +MZQR#^@5T">L5BU,$B1;K+8M3#,=##$!Z"0B)%NL?A@D(=92A3"D*"#U >@D(=""+6 SH0 ( +M (L57"P*"(E0#*-<+ H(B=B!^T!Z"0AUX,<%2"D*" ( "X 0 .L-@^P, +M:/\X"0CH<"S__UM>7\-3@^P(BUPD$(L#ACS 0 B0.-6!"+0!"%P'7O +M@\0(6\-55U93BW0D%(LM/"D*"(L^@^\(B?#!Z!2 N( L"@@ =0>)\.FF +MB? E / / ,'H!XGR@>( /#_"= Y:!!V!XGPZ88 #V0!P!= 2)\.M\]D < +M G0'N #K;_9 ' AT(HGQ*PC!^0*)R\'K!8M0#(/A'[@! T^"%!)IT +M!(GPZT#^$!T"NLCBW8$Z6#___^+ +M1 at 3K&V:#?A $=0B+=@3I3/___[@ ZP6X %M>7UW#4X/L"(M<)!"+ +M ^@ 0 B0.#Q A;PU575E.#[ R+?"0 at BVPD)(M<)"B+="0LBT84.P5$*0H( +M$ \ \ P>D'B=@E #P_PG!@WD0 '0CBT$0C03 +MBQ40*0H(BT2"%(E#"(M!$(T$P(L5$"D*"(E<@A2)V(/$!%M>PU575E.#[ R) +MPXG8P>@4 at +B + H( ^$;@$ (G8)0#P#P#!Z >)VH'B #P_PG"BT(0.P4\ +M*0H(=AD[!40I"@AS"L<%4"D*" $ ")V.E-"@ ]D(< @^$M (L+@^D( +M9H-Y!#MU#&:#>Q $=06+6P3KE(G8)0#P#P#!Z >)VH'B #P_XG!"='V01P! +M=!>+01 [!40I"@AS;L<%4"D*" $ #K8HM1%(-Y# !T"XM1#(M!"(E"".L& +MBT$(B4(8 at WD( '0)BU$(BT$,B4(,BT$4BU ,BT(4.P5$*0H(@%BU(,@^$?OP$ ")_=/EA2R"=4.)V2GQP?D"B+1A0[!40I"@AS$J%$*0H(C03 BQ40*0H( +MBWR"!(M')(T$F#M'*'(,@^P,5^A8Z___@\00BT\DB>J%VW0-BP*#P at 2) 8/! +M!$MU\XM')(E/),=% ,S]!PB)103ID @ (M3!($[M*D$"'43C0354'H)"('Z +M_P ^&<@@ ($['*L$"'45 at _KP?!"-!-70@@D(@_H0#XY5" B=V_ @ +M (GSBT84.P5$*0H(K__X/$$(M+)(GJA?]T#8L"@\($B0&#P01/=?.+0R2)2R3'10#,_0<( +MB44$Z>T' ")W;\# B?.+1A0[!40I"@AS$J%$*0H(C03 BQ40*0H(BUR" +M!(M#)(T$N#M#*'(,@^P,4^A-ZO__@\00BTLDB>J%_W0-BP*#P at 2) 8/!!$]U +M\XM#)(E+),=% ,S]!PB)103IA0< (G=OP, ")\XM&%#L%1"D*"',2H40I +M"@B-!,"+%1 I"@B+7(($BT,DC02X.T,H<@R#[ Q3Z.7I__^#Q!"+2R2)ZH7_ +M= V+ H/"!(D!@\$$3W7SBT,DB4LDQT4 S/T'"(E%!.D=!P B=T/MP$/MU$" +MC5P0 8GWBT84.P5$*0H(+1A0[!40I"@AS$J%$*0H(C03 BQ40*0H(BWR" +M!(M')(T$F#M'*'(,@^P,5^BJY___@\00BT\DB>J%VW0-BP*#P at 2) 8/!!$MU +M\XM')(E/),=% ,S]!PB)103IX at 0 /\%-"D*". at W^O___PTT*0H(QP/,_0<( +MB4,$Z<,$ "+6P3I)/K__V:#>08 =!V#/4 I"@@ =!2#>PP =0ZA."D*"(E# +M#(D=."D*"(G8Z9 $ !F at WD& '0=@SU *0H( '04 at WL$ '4.H3 at I"@B)0P2) +M'3 at I"@B)V.EE! @SU *0H( '0:@WL, '44 at WL( '4.H3 at I"@B)0PB)'3 at I +M"@B)V.D[! @SU *0H( '0?#[<1#[=! @'"@WR3! !U#Z$X*0H(B423!(D= +M."D*"(G8Z0P$ ")V.D%! @^P(4V at 6.0D(Z+TC__^)W0^W0P:-6 .)]XM& +M%#L%1"D*"',2H40I"@B-!,"+%1 I"@B+?(($BT@'@>( /#_"="+0! [!40I"@AS"L<%4"D*" $ "+0P3IVP( +M (G=BUL$@\,"B?>+1A0[!40I"@AS$J%$*0H(C03 BQ40*0H(BWR"!(M')(T$ +MF#M'*'(,@^P,5^@ZY?__@\00BT\DB>J%VW0-BP*#P at 2) 8/!!$MU\XM')(E/ +M),=% ,S]!PB)103I<@( (G=BUL$@\,#B?>+1A0[!40I"@AS$J%$*0H(C03 +MBQ40*0H(BWR"!(M')(T$F#M'*'(,@^P,5^C1Y/__@\00BT\DB>J%VW0-BP*# +MP at 2) 8/!!$MU\XM')(E/),=% ,S]!PB)103I"0( (G?9H-[$ 1U"(M;!.EA +M]___BT,L@\ .5FH.4%/H3_;__XG#@\0(4%?H8P, (M7-(M+-(/$$(M'+(U$ +MAS at YT'85BP*#P at 2) 8/!!(M'+(U$AS at YT'?KB=CIK $ (G=OP4 ")\XM& +M%#L%1"D*"',2H40I"@B-!,"+%1 I"@B+7(($BT,DC02X.T,H<@R#[ Q3Z SD +M__^#Q!"+2R2)ZH7_= V+ H/"!(D!@\$$3W7SBT,DB4LDQT4 S/T'"(E%!.E$ +M 0 B=V_!0 (GSBT84.P5$*0H(J%_W0-BP*# +MP at 2) 8/!!$]U\XM#)(E+),=% ,S]!PB)103K=XG=OP0# ")\XM&%#L%1"D* +M"',2H40I"@B-!,"+%1 I"@B+7(($BT,DC02X.T,H<@R#[ Q3Z-?B__^#Q!"+ +M2R2)ZH7_= V+ H/"!(D!@\$$3W7SBT,DB4LDQT4 S/T'"(E%!.L2@^P(#[=! +M!%!H7#D)".C&'___@\0,6UY?7<-55U93@^P,BWPD)(MW!(LOB?@E / / ,'H +M!XGZ@>( /#_"="+0!"Z #L%/"D*" ^'/0$ ,<'F/P'"(GR@>( \ \ +MP>H'B? E #P_PG"B?#!Z!2 N( L"@@ =#"+0ARH 74BJ AT)8GQ*PK!^0*) +MR\'K!8M2#(/A'[@! T^"%!)IT![@! ZP6X (7 #X71 BQ:# +MZ@@/MT($@_A #X>M _R2%(#P)"(M$)""+=(8$B?*!X@#P#P#!Z@>)\"4 +M /#_"<*)\,'H%("X@"P*" !T,(M"'*@!=2*H"'0EB?$K"L'Y HG+P>L%BU(, +M@^$?N $ #3X(4$FG0'N $ #K!;@ B?*%P'1:ZU&+=@3I&?___X,] +M-"D*" =W0/\%-"D*"(/L"%;_,NC!_O___PTT*0H(@\00A/L' +M"(G&Z>+^__^#[ @/MT($4&B .0D(Z% >__^)+[H B="#Q Q;7E]=PXM4 +M) B)T"M$) 2#X/P!0C3#55=64X/L#+T BT0D((M8"(M !(E$) B+1"0@ +MBS"_ #M\) AS*_;# 70'BP;HD?/__T>#Q at 3WQQ\ !U"T6+1"0 at BURH +M".L"T>L[?"0(O+__XE&#(M&$.AO\O__ +MB480BQ0DB15$*0H(B?&!X0#P#P#!Z0>)\"4 /#_"<&#>1 =".+01"-!,"+ +M%1 I"@B+1((0B48(BT$0C03 BQ40*0H(B72"$,<%4"D*" "#QA3IBPD +M (U#\(G" U (#[=8%HUZ&('[__\ '4.@^P,5^@L_O__@\00ZQ>%VW03]L,! +M= >+!^C?\?__@\<$T>MU[8M&".C0\?__B48(BT8$Z,7Q__^)1 at 2#Q at SI,0D +M (U#_(G" U/\#[=8"HUZ#('[__\ '4.@^P,5^C2_?__@\00ZQ>%VW03]L,! +M= >+!^B%\?__@\<$T>MU[8M&".AV\?__B48(BT8$Z&OQ__^)1 at 2#Q at SIUP@ +M (U#_(G" U/\#[=8"HUZ#('[__\ '4.@^P,5^AX_?__@\00ZQ>%VW03]L,! +M= >+!^@K\?__@\<$T>MU[8M&!.@<\?__B48$@\8,Z8@( "-0_")P at -0" ^W +M6!:->AB!^___ !U#H/L#%?H*?W__X/$$.L7A=MT$_;# 70'BP?HW/#__X/' +M!-'K=>V+1 at 3HS?#__XE&!(/&".DY" C4/\B<(#4_P/MU@*C7H,@?O__P +M=0Z#[ Q7Z-K\__^#Q!#K%X7;=!/VPP%T!XL'Z(WP__^#QP31ZW7M@\8,Z?4' +M "-0_")P at -0" ^W6!:->AB!^___ !U#H/L#%?HEOS__X/$$.L7A=MT$_;# +M 70'BP?H2?#__X/'!-'K=>V#Q at CIL0< (U#_(G" U/\#[=8"HUZ#('[__\ +M '4.@^P,5^A2_/__@\00ZQ>%VW03]L,!= >+!^@%\/__@\<$T>MU[8/&#.EM +M!P C4/PB<(#4 @/MU at 6C7H8@?O__P =0Z#[ Q7Z [\__^#Q!#K%X7;=!/V +MPP%T!XL'Z,'O__^#QP31ZW7M@\8,Z2D' "-0_R)P at -3_ ^W6 J->@R!^___ +M !U#H/L#%?HROO__X/$$.L7A=MT$_;# 70'BP?H?>___X/'!-'K=>V+1 at 3H +M;N___XE&!(/&#.G:!@ C4/PB<(#4 @/MU at 6C7H8@?O__P =0Z#[ Q7Z'O[ +M__^#Q!#K%X7;=!/VPP%T!XL'Z"[O__^#QP31ZW7MBT8$Z!_O__^)1 at 2#Q at SI +MBP8 (U#\(G" U (#[=X%HUJ&('___\ '4.@^P,5>@L^___@\00ZUV%_W19 +M]\GK0(U#_(G" U/\#[=X"HUJ#('___\ +M '4.@^P,5>CJ^O__@\00ZQN%_W07]\[__X/%!-'O=>D/ +MMSN-?+X$@\8$.?YS$(L&Z'WN__^)!H/&!#G^$ \ \ P>D'B? E #P_PG!@WD0 '0CBT$0C03 BQ40 +M*0H(BT2"%(E&"(M!$(T$P(L5$"D*"(ET at A2#Q at SI, at 4 ,<%1"D*" "+ +M1 at 3HJ>W__XE&!(L$)*-$*0H(B?&!X0#P#P#!Z0>)\"4 /#_"<&#>1 =".+ +M01"-!,"+%1 I"@B+1((0B48(BT$0C03 BQ40*0H(B72"$,<%4"D*" "# +MQ at SIQ@0 ,<%4"D*" "#Q at SIM 0 (/&#.FL! BT8$Z"WM__^)1 at 2) +M\8'A / / ,'I!XGP)0 \/\)P8-Y$ !T(XM!$(T$P(L5$"D*"(M$@A")1 at B+ +M01"-!,"+%1 I"@B)=((0QP50*0H( (/&#.E2! BT8$Z-/L__^)1 at 2# +MQ at SI/P0 (M&".C [/__B48(@^P(BT8$C42&#%"-1 at Q0Z%$5 "+1 at 2-=(8, +M@\00Z1$$ ")]8M&".B0[/__B48(BP"#Z!B-?@P/MW8&#[=0#(/Z 70<@_H! +M?P:%TG0)ZT:#^@)T)>L_BT $B#QP31ZTYUZHG^Z6D# "+1 at 2# +MP *--(;I6P, ,<%1"D*" "+1 at 2#P .-'(:#Q at PYWG,0BP;HP^O__XD& +M@\8$.=YR\(L4)(D51"D*"(M,) B!X0#P#P#!Z0>+1"0()0 \/\)P8-Y$ !T +M*XM!$(T$P(L5$"D*"(M$@A"+5"0(B4((BT$0C03 BQ40*0H(BTPD"(E, at A#' +M!5 I"@@ Z= " #'1@@ BT8$@\ #C1R&@\8,.=X/@[4" "+!N at W +MZ___B0:#Q at 0YWG+PZ: " ")\\<%1"D*" "#[ Q6Z*KW__^+1"00HT0I +M"@B#Q!")\8'A / / ,'I!XGP)0 \/\)P8-Y$ !T(XM!$(T$P(L5$"D*"(M$ +M at A")1 at B+01"-!,"+%1 I"@B)=((0QP50*0H( (M#+(/ #HTTANDJ @ +MQP5$*0H( (M&!.BAZO__B48$BT8,Z);J__^)1 at R+1A#HB^K__XE&$(L4 +M)(D51"D*"(GQ@>$ \ \ P>D'B? E #P_PG!@WD0 '0CBT$0C03 BQ40*0H( +MBT2"$(E&"(M!$(T$P(L5$"D*"(ET at A#'!5 I"@@ @\84Z:$ \ \ +MP>D'B? E #P_PG!@WD0 '0CBT$0C03 BQ40*0H(BT2"$(E&"(M!$(T$P(L5 +M$"D*"(ET at A#'!5 I"@@ @\80Z2\! #'!40I"@@ BT8,Z*;I__^) +M1 at R+1A#HF^G__XE&$(L$)*-$*0H(B?&!X0#P#P#!Z0>)\"4 /#_"<&#>1 +M=".+01"-!,"+%1 I"@B+1((0B48(BT$0C03 BQ40*0H(B72"$,<%4"D*" +M "#QA3IN (GUC5X0QP5$*0H( (M&!. at JZ?__B48$OP "#?@P +M=BB+ ^@5Z?__B0.+0P3H"^G__XE#!(M#".@ Z?__B4,(1X/###E]#'?8BQ0D +MB15$*0H(B>F!X0#P#P#!Z0>)Z"4 /#_"<&#>1 =".+01"-!,"+%1 I"@B+ +M1((0B44(BT$0C03 BQ40*0H(B6R"$,<%4"D*" "!QA , #K$X/L!%8/ +MMT,$4&BL.0D(Z.\2__^#/5 I"@@ ="O'!5 I"@@ @^P(H40I"@B-!,"+ +M%1 I"@B-!()0_W0D%.C:Y___@\00BT0D!(M,)" Y02P/A7GU__\Y<20/AV/U +M__^+3"0$BU0D((E*.(ER/(/$#%M>7UW#55=64X/L#*$8*0H(BP"C1"D*"(E$ +M) 2A9"D*"(G".P5@*0H(#X3T!P C4+\HV0I"@B+?__XE&!(M&#.BVY___ +MB48,BT80Z*OG__^)1A"+1"0$HT0I"@C'!5 I"@@ Z0H' "-0_")P at -0 +M" ^W6!:->AB!^___ !U#H/L#%?HJ//__X/$$.L7A=MT$_;# 70'BP?H6^?_ +M_X/'!-'K=>V+1 at CH3.?__XE&"(M&!.A!Y___B48$Z;,& "-0_R)P at -3_ ^W +M6 J->@R!^___ !U#H/L#%?H4?/__X/$$.L7A=MT$_;# 70'BP?H!.?__X/' +M!-'K=>V+1 at CH]>;__XE&"(M&!.CJYO__B48$Z5P& "-0_")P at -0" ^W6!:- +M>AB!^___ !U#H/L#%?H^O+__X/$$.L7A=MT$_;# 70'BP?HK>;__X/'!-'K +M=>V+1 at 3HGN;__XE&!.D0!@ C4/\B<(#4_P/MU@*C7H,@?O__P =0Z#[ Q7 +MZ*[R__^#Q!#K%X7;=!/VPP%T!XL'Z&'F__^#QP31ZW7MBT8$Z%+F__^)1 at 3I +MQ 4 (U#\(G" U (#[=8%HUR&('[__\ '41@^P,5NAB\O__@\00Z9P% "% +MVP^$E 4 /;# 70'BP;H#N;__X/&!-'K=>WI? 4 (U#_(G" U/\#[=8"HUR +M#('[__\ '41@^P,5N@:\O__@\00Z50% "%VP^$3 4 /;# 70'BP;HQN7_ +M_X/&!-'K=>WI- 4 (U#\(G" U (#[=X%HUJ&('___\ '4.@^P,5>C2\?__ +M@\00ZUV%_W19]\7__X/%!-'O=>GK0(U#_(G" U/\#[=X +M"HUJ#('___\ '4.@^P,5>B0\?__@\00ZQN%_W07]\D/MQN-7)X$@\8$.=X/@Z $ "+!N@?Y?__B0:#Q at 0YWG+PZ8L$ +M "+1 at 3H">7__XE&!(M&".C^Y/__B48(BT8,Z//D__^)1 at R+1A#HZ.3__XE& +M$.E:! BT8$Z-CD__^)1 at 2#/5 I"@@ =#V)\8'A / / ,'I!XGP)0 \/\) +MP8-Y$ !T(XM!$(T$P(L5$"D*"(M$@A2)1 at B+01"-!,"+%1 I"@B)=((4QP50 +M*0H( .GZ P QP5$*0H( (M&!.ANY/__B48$BWPD!(D]1"D*",<% +M4"D*" #IS , ,<%4"D*" #IO0, (M&!.@[Y/__B48$QP50*0H( +M .FC P BT8$Z"'D__^)1 at 3IDP, (M&". at 1Y/__B48(@^P(BT8$C42& +M#%"-1 at Q0Z*(, "#Q!#I; , (GUBT8(Z.CC__^)1 at B+ (/H&(U^# ^W7 at 8/ +MMU , at _H!=!R#^@%_!H72= GK1H/Z G0EZS^+0 2)QL'N!>M%@^P$4P- !(/ +M&%!7Z/0+ "#Q!#I%0, (/L!%.+1 at B#P!A0C48,4.C8"P @\00Z?D" / +MMT ,BP2%((0)"(G&P>X%#[==!H7;#X3= @ ]\8! =0F+!^A4X___B0># +MQP31[DMUY^F_ @ QP5$*0H( (M&!(/ XT#X-B @ BP;HX>+__XD&@\8$.=YR\.E- @ QP5$*0H( +M (/L#%;H5N___XM\)!2)/40I"@C'!5 I"@@ @\00Z1X" #'!40I"@@ +M BT8$Z)+B__^)1 at 2+1@SHA^+__XE&#(M&$.A\XO__B480BT0D!*-$*0H( +MB?&!X0#P#P#!Z0>)\"4 /#_"<&#>1 =".+01"-!,"+%1 I"@B+1((0B48( +MBT$0C03 BQ40*0H(B72"$,<%4"D*" #IG@$ ,<%1"D*" "+1 at 3H +M$N+__XE&!(M&#.@'XO__B48,BWPD!(D]1"D*"(GQ@>$ \ \ P>D'B? E #P +M_PG!@WD0 '0CBT$0C03 BQ40*0H(BT2"$(E&"(M!$(T$P(L5$"D*"(ET at A#' +M!5 I"@@ Z2@! ")]8U>$,<%1"D*" "+1 at 3HE^'__XE&!+\ +M at WX, '8HBP/H at N'__XD#BT,$Z'CA__^)0P2+0PCH;>'__XE#"$>#PPPY?0QW +MV(M$) 2C1"D*"(GI@>$ \ \ P>D'B>@E #P_PG!@WD0 '0CBT$0C03 BQ40 +M*0H(BT2"$(E%"(M!$(T$P(L5$"D*"(EL at A#'!5 I"@@ Z88 #'!40I +M"@@ BT8,Z/K at __^)1 at R+1A#H[^#__XE&$(M\) 2)/40I"@B)\8'A / / +M ,'I!XGP)0 \/\)P8-Y$ !T(XM!$(T$P(L5$"D*"(M$@A")1 at B+01"-!,"+ +M%1 I"@B)=((0QP50*0H( .L3@^P$5@^W0P10:.0Y"0CH[ K__X,]4"D* +M" !T*\<%4"D*" "#[ BA1"D*"(T$P(L5$"D*"(T$@E#_="04Z-??__^# +MQ!"+3"0(@\$$BT0D""4 \ \ P>@'BU0D"('B #P_PG0*PC!^0*)R\'K!8M0 +M#(/A'[@! T^ )!)J+%60I"@@[%6 I"@@/A0SX__^#/6PI"@@ ="J#/7 I +M"@@ =2['!6PI"@@ H1 at I"@B+0 2+0 2C<"D*"(L HW0I"@B#/7 I"@@ +M#X2[ BQUP*0H(O@$ #K!X,%="D*" 2+0P0[!70I"@AV'XL-="D*""L+ +MP?D"B7UW#55=64X/L#(M<)""+/40I"@B+$X/J" ^W +M0 at 2#^#L/AQD" #_)(54/PD(#[__^)0P3I[0$ ,<%1"D*" ")V8'A / / +M ,'I!XG8)0 \/\)P8-Y$ !T(XM!$(T$P(L5$"D*"(M$@A")0PB+01"-!,"+ +M%1 I"@B)7((0BT,$@\ #C32#@\,,.?-S$(L#Z$7>__^) X/#!#GS)V"4 /#_"<&#>1 =".+01"-!,"+%1 I"@B+1((0B4,(BT$0 +MC03 BQ40*0H(B5R"$(D]1"D*",<%4"D*" #IV0 (M#".B'W?__B4,( +M@^P(BT,$C42##%"-0PQ0Z!@& "#Q!#IL@ (G=BT,(Z%[=__^)0PB+ (/H +M&(U[# ^W6P8/MU , at _H!=!R#^@%_!H72= GK0(/Z G0BZSF+0 2)QL'N!>L_ +M@^P$4P- !(/ &%!7Z&H% "#Q!#K7H/L!%.+10B#P!A0C44,4.A1!0 @\00 +MZT4/MT ,BP2%((0)"(G&P>X%#[==!H7;="WWQ@$ !U"8L'Z-3<__^)!X/' +M!-'N2W7GZQ*#[ @/MT($4&@D. at D(Z!P'__^A4"D*",<%4"D*" "#Q Q; +M7E]=PU575E.#[ R+?"0 at BU\4O41Z"0B+7UW#55=64X/L#(ML)""+=1B+1 at B)1"0(QP5$ +M*0H( ,<%4"D*" "!_D1Z"0@/A&8" "+%H/J" ^W0 at 2#Z!^#^"8/ +MAR@" #_)(5$0 D(BT40B48(B740BT8$@\ #C3R&C5X,.?L/@Q8" "+ ^AE +MV___B0.#PP0Y^W+PZ0$" "+10"C1"D*"(M&!(/ XT\AHU>##G[7UW#5U93BS4X*0H(H1 at I"@B+ *-$*0H(@_X! +M#X1F 0 BPZ-6?@/MT'X#[=3 @'0BT2&!*,X*0H(#[=!^ ^W4P(!T(L58"P* +M"(E4A at 2)-6 L"@@/MT,$@_ at 1#X2H @_ at 1?PZ#^ D/A-@ #I\P (/X +M&'1+ at _@B#X7E BT8$Z+'8__^)1 at 2#/5 I"@@ #X3? QP50*0H( +M (M&"*- at + H(H1 at I"@B+0!2)1 at BA&"D*"(EP%.FU C4/\B<(#4_P/MU@* +MC7(,@?O__P =1&#[ Q6Z(_D__^#Q!#IC0 (7;#X2% ]L,!= >+!N@[ +MV/__@\8$T>MU[>MPC4/PB<(#4 @/MU at 6C7(8@?O__P =0Z#[ Q6Z$KD__^# +MQ!#K2X7;=$?VPP%T!XL&Z/W7__^#Q at 31ZW7MZS(/MSN-?+X$C5X$.?MS)(L# +MZ-_7__^) X/#!#G[7\-55U93@^P,BW0D(+T BT0D)(M8!+\ .WPD*',M]L,! +M=0F+!NB!U___B09'@\8$]\L%A>UT%O;# 74)BP?HZM;__XD'@\<$T>M.=>J+1"0( P"+5"0( +M#[=:"HUP#('[__\ '41@^P,5NCVXO__@\00Z6T! "%VP^$90$ /;# 70' +MBP;HHM;__X/&!-'K=>WI30$ (/'!(L'Z(S6__^)!X/'!(M8&(/L!%.#P!A0 +M5^C'_O__C3R?@\00Z2(! "+5"0(BT($BUP0#(/'!(/L!%.)T -"!(/ #%!7 +MZ)O^__^-/)^#Q!#I7____XMO!(UW#+\( #[?=]L,!=0F+!N at EUO__B0:# +MQ at 31ZT]UZHGHP>@.)?P# "-? 8HP>T8#X2[ BP?H_=7__XD'@\<$377Q +MZ:< "+1PCHZ-7__XE'"(L0@^H8@\<,#[="#(7 = >#^ %T$>LTBT($B<;! +M[@6)PX/C'^LZBT($BUP0&(/L!%.)T -"!(/ &%!7Z/;]__^#Q!"-/)_INO[_ +M_P^W0 at R+!(4 at A D(B<;![@6)PX/C'X7;#X2=_O__]\8! =0F+!^ANU?__ +MB0>#QP31[DMUY^E__O__@^P(BU0D$ ^W0 at A0:, Z"0CHK__^_SM\)"0/@OS] +M__^#Q Q;7E]=PU=64XM<)!"+4T"%TG17C7M$BT((B4- B=&+0T2)0 at C'0 at P +M @WM$ '0&BT-$B5 ,B0^+0T@#0AB)0TB+,H/L#%;HZ_7__X/$$(7 = ^# +M[ C_V+'00I +M"@B%VW03@^P,C4,$4/_6@\00BUL(A=MU[8/$!%M>PU.+1"0(BT at TBP&#Z P/ +MMT (@_ at J= N#^"P/A(( #K)HM!!($XF/P'"'1U at 3@0_0<(= Z!.#S]!PAT +M!L< F/P'"(/!".O!BQ&#Z at P/MT((@^@C at _@&=SK_)(5X00D(BT$$B<+!ZAC! +MZ! E_P (U4 A7K)(M1!(/" ^LEG____6\-55U93@^P @J#X4E 0 +MB=Z+0P2!.)C\!PAU$X-\) P #X2& 0 C7OXZ7X! "#?"08 ^$Q0 (M$ +M)!0Y0P0/A*( "+2P2+$0^W0OSVA "AA D( 0^%BP ('Z$/T'"'4.@^P, +M_W$$Z%P:__^#Q!"+3 at 2)R"4 \ \ P>@'B/L'".M$BTX$@3D0_0<(=":+11"-!,"+%1 I"@B+1((4B4$( +MBT40C03 BTX$BQ40*0H(B4R"%(M&!(M4)!2)4 2+1 at 3' 'C\!PB#1"0, HM$ +M) R) XE[!(/#".FD BT,$@3B8_ <(=!:!.!#]!PAT#H$X//T'"'0&QP"8 +M_ <(QT0D& $ "+=@2)="04@\,(ZV_'1"08 (-\) P = .->_C'1"0, +M (L3@^H,#[=""(/H(X/X!GH8P>@0)?\ "- +M5 (5ZR2+4P2#P@/K'(M"!(M4$ Q"ZQ*+0P2+4!B#P at +K!XM2!(/B'T*-'),[ +M7"00#X)2_O__C5\(B=Z+5"0P.7HT)VH'B #P_PG0]D < 74*BP.) +M002-006) XM)".LKBTD,ZR:+203K(0^W @^W4@(!T(M, at 03K$H/L" ^W0 at 10 +M:+!!"0CHWOK^_X/Y 0^%;O___X/$"%O#55=64X/L/(M<)% [7"14#X,4! +MBQ.#Z at P/MT((@^@C at _@E#X?C P _R2%:$()"(MK!(GI@>'__P @\,,OP@ +M #VP0%U,XLSB?#!Z!2 N( L"@@ =".)\"4 \ \ P>@'B?*!X@ \/\)T/9 +M' %U"8L&B0.-0P&)!H/#!-'I3W7 B>C!Z XE_ , (U< RB)[\'O& ^$@@, +M (L+B@'B)\H'B #P_PG0]D < 74)BP:) +M XU# 8D&@\,$T>E/=<#IZ0( (/#!(L+B@'B@'B-1P&) 46#QP3W +MQ1\ !U$O]$)"R+1"0LBU0D-(MT@@3K M'N.VPD,'*?BT0D.(T<@^D; @ +M@\,$BT($BWP0#(G=C40"#(E$)"B)?"0DQT0D' "+< 3'1"0@ #E\ +M)"!S:??& 0 '4UBTT B@'B+0/^H 77Y +MC5CHBTX(B@'B)RH'B #P +M_PG0]D < 74*BP&)10"-10&) ?]$)!"#Q03V1"00'W42_T0D#(M$) R+5"08 +MBUR"!.L"T>N+1"04.40D$'*:C3RWZUD/MT,,BP2%((0)"(G#P>L%B<:#YA^% +M]G1 ]L,!=3.+#XG(P>@4 at +B + H( '0CB<@E / / ,'H!XG*@>( /#_"=#V +M0!P!=0F+ 8D'C4@4 at +B + H( '0DB<@E +M / / ,'H!XG*@>( /#_"=#V0!P!=0J+ 8E#!(U#!8D!BTL,B@'B@4 at +B + H( '0DB<@E / / ,'H!XG*@>( /#_"=#V +M0!P!=0J+ 8E#%(U#%8D!@WL8 '0UBTL8B@'B)RH'B #P_PG0]D < 74*BP&)0RB-0RF) 8/L"(M#+(U$ +M at SA0_W,TZ)KZ__^+0RR#P Z-!(.#Q!A;PU575E.#[!R#?"0P ^$$P, (M$ +M)#"+"(L1@^H(#[="!(/H'(/X'P^'TP( /\DA0!#"0B+002#P .--(&#P0PY +M\0^#R@( (L9B=C!Z!2 N( L"@@ =".)V"4 \ \ P>@'B=J!X@ \/\)T/9 +M' %U"8L#B0&-00&) X/!!#GQ)VH'B #P_PG0]D < 74*BP.) +M00B-00F) X/L"(M&!(U$A at Q0C48,4.BI^?__@\00Z2<" ")3"08BT$(BP"H +M 70'BT#_J %U^8/H&(M\)!B#QPR+5"08#[=:!@^W4 R#^@%T*8/Z 7\)A=)T +M$^DX 0 @_H"#X2> Z2H! "+0 2)QL'N!>DM 0 T $@\ 8B40D%(E< +M)!#'1"0, (MP!+T .=T/@U8! #WQ@$ !U,XL/B@'B-1P&) 46#QP3W +MQ1\ !U$O]$) R+1"0,BU0D%(MT@@3K M'N.VPD$'*?Z? "+?"08@\<, +MBU0D&(M""(U0&(E4) B)7"0$QP0D (MP'+T .=T/@\ #WQ@$ +M !U,XL/B@'B-1P&) 46#QP3WQ1\ !U$/\$)(L$)(M4) B+=(($ZP+1[CML) 1R +MH>M?#[= #(L$A2"$"0B)QL'N!8M$)!@/MU@&A=MT0_?& 0 '4SBP^)R,'H +M%("X@"P*" !T(XG()0#P#P#!Z >)RH'B #P_PG0]D < 74)BP&)!XU' 8D! +M@\<$T>Y+=;V+5"08BTH(B@'BW\__^#Q!Q;7E]=PU.#[ B+7"00A=MT)XL3.5,$ +M=AF+ H/H"(/L"%)0Z!8 ")PH/$$#E#!'?GBUL(A=MUV8/$"%O#55=64X/L +M+(M<)$"+="1$#[=#!(/X10^' 0H /\DA8!#"0B-1 at CI! H (M.!(G(P>@4 +M at +B + H( '0DB<@E / / ,'H!XG*@>( /#_"=#V0!P!=0J+ 8E&!(U&!8D! +MC48(Z<<) "+3 at 2)R,'H%("X@"P*" !T)(G()0#P#P#!Z >)RH'B #P_PG0 +M]D < 74*BP&)1 at 2-1@6) 8U&#.F*"0 C48,Z8() "+3 at 2)R,'H%("X@"P* +M" !T)(G()0#P#P#!Z >)RH'B #P_PG0]D < 74*BP&)1 at 2-1@6) 8U&#.E% +M"0 BTX$B@'B)RH'B #P +M_PG0]D < 74*BP&)1 at B-1@F) 8U&#.G3" B?.+3 at 2)R,'H%("X@"P*" !T +M)(G()0#P#P#!Z >)RH'B #P_PG0]D < 74*BP&)1 at 2-1@6) 8M+"(G(P>@4 +M at +B + H( '0DB<@E / / ,'H!XG*@>( /#_"=#V0!P!=0J+ 8E#"(U#"8D! +MBTL,B@'B)RH'B #P_PG0 +M]D < 74*BP&)0Q"-0Q&) 0^W0Q:-!(;I\0< ^W.XU\O at 2#Q at 0Y_G,ZBPZ) +MR,'H%("X@"P*" !T(XG()0#P#P#!Z >)RH'B #P_PG0]D < 74)BP&)!HU& +M 8D!@\8$.?YRQ@^W0P*-!(;IG0< (GSBTX$B@'B)RH'B #P_PG0]D < 74*BP&)0PB-0PF) 8M+#(G( +MP>@4 at +B + H( '0DB<@E / / ,'H!XG*@>( /#_"=#V0!P!=0J+ 8E##(U# +M#8D!@WL0 '0UBTL0B@'B@'B)RH'B #P_PG0]D < 74*BP&)0PR-0PV) 8M+ +M$(G(P>@4 at +B + H( '0DB<@E / / ,'H!XG*@>( /#_"=#V0!P!=0J+ 8E# +M$(U#$8D!C484Z1 & "+3 at 2)R,'H%("X@"P*" !T)(G()0#P#P#!Z >)RH'B +M #P_PG0]D < 74*BP&)1 at 2-1@6) 8U&#.G3!0 BTX$B@'B@'B+0/^H 77Y@^@8BVPD*(/%#(M4)"@/MW(&#[=0#(/Z +M 70I at _H!?PF%TG03Z4T! "#^@(/A*@ #I/P$ (M !(G#P>L%Z4(! ") +M[P- !(/ &(E$)"2)="0 at QT0D& "+6 3'1"0< #ET)!QS9/;# 74S +MBP^)R,'H%("X@"P*" !T(XG()0#P#P#!Z >)RH'B #P_PG0]D < 74)BP&) +M!XU' 8D!_T0D'(/'!/9$)!P?=1+_1"08BT0D&(M4)"2+7(($ZP+1ZXM$)" Y +M1"0<)RH'B #P_PG0]D < 74)BP&)!XU' 8D!_T0D#(/'!/9$) P?=1+_ +M1"0(BT0D"(M4)!2+7(($ZP+1ZXM$)! Y1"0,L%BU0D* ^W<@:%]G1"]L,!=36+30")R,'H%("X@"P*" !T)(G()0#P +M#P#!Z >)RH'B #P_PG0]D < 74*BP&)10"-10&) 8/%!-'K3G6^BT0D*(M( +M"(G(P>@4 at +B + H( '0JB<@E / / ,'H!XG*@>( /#_"=#V0!P!=1"+ 8M4 +M)"B)0 at B)T(/ "8D!B>CI#@, (M&!(/ HT$AND P BT8$@\ #C1R&@\8, +M.=YS.HL.B@'B@4 at +B + H( '0DB<@E / / ,'H!XG*@>( /#_"=#V0!P!=0J+ 8E& +M!(U&!8D!BTL,B@'B)RH'B +M #P_PG0]D < 74*BP&)0Q"-0Q&) 8U&%.GU 0 B?.+3 at 2)R,'H%("X@"P* +M" !T)(G()0#P#P#!Z >)RH'B #P_PG0]D < 74*BP&)1 at 2-1@6) 8M+#(G( +MP>@4 at +B + H( '0DB<@E / / ,'H!XG*@>( /#_"=#V0!P!=0J+ 8E##(U# +M#8D!C480Z8$! ")\XM.#(G(P>@4 at +B + H( '0DB<@E / / ,'H!XG*@>( +M /#_"=#V0!P!=0J+ 8E&#(UD!BTL0B@'B@'B@4 at +B + H( '0CB<@E / / ,'H +M!XG*@>( /#_"=#V0!P!=0F+ 8D#C4,!B0&+2P2)R,'H%("X@"P*" !T)(G( +M)0#P#P#!Z >)RH'B #P_PG0]D < 74*BP&)0P2-0P6) 8M+"(G(P>@4 at +B +M+ H( '0DB<@E / / ,'H!XG*@>( /#_"=#V0!P!=0J+ 8E#"(U#"8D!1X/# +M##E]# ^'5O___XV&$ P .L2@^P(#[=#!%!H0$()".C(Y_[_@\0L6UY?7<-5 +M5U93@^P,BW0D((ET) 2+!HE$) B%]@^$Z (L>.5X$=PCIT0 (/#!#E> +M! ^&Q0 (G9*P[!^0*)RL'J!8M&#(/A'[\! T^>%/)!TUCE>! ^&G@ +M (L#J %T!XM _Z@!=?F#Z B)W8/L"%-0Z%'U__^)PXG'*>_!_P*+1"08C12X +MBTPD%(L!!0 0 "#Q! YPG8RC4T$*P[!^0*)RL'J!8/A'[@! T^")P??1 +MBT8,(0R0BTPD!(M)"(E,) 2+ 8E$) B+3"0(BU4 ]L(!= M*BP*)"HG"J %U +M]8E5 (M,) B-#+F)3"0(.5X$#X<[____BW8(A?8/A1C___^#Q Q;7E]=PU57 +M5E.#[!R+1"0PBT $B40D%(G'BQ")5"08QT0D# $ "%P ^$T $ (LW.7<$ +M#X:Z 0 NP$ #K X/&!#EW! ^&IP$ (GQ*P_!^0*)RL'J!8M'#(/A'XG= +MT^6%+)!TV3EW! ^&@P$ (U.!"L/P?D"B 0[=1"#[ C_="0 at 5NB>QO__@\00C02M %$)!@!QCEW! ^'1O[__XM_ +M"(7_#X4P_O__BTPD&(M4)!2)2 at 2#>@@ =!F#[ S_<@CHZ*;__XM<)"3'0P@ +M @\00BT0D#(ML)#")10B+1"0,@\0<6UY?7<-64XMT) R+7A2!^T1Z"0AT +M/XM+"(G(P>@4 at +B + H( '0DB<@E / / ,'H!XG*@>( /#_"=#V0!P!=0J+ +M 8E#"(U#"8D!B@4 at +B + H( '0DB<@E / / ,'H +M!XG*@>( /#_"=#V0!P!=0J+ 8E&%(U&%8D!6U[#55=64X/L&&B9G0@(_U0D +M,(/$$(,]E"L*" !T.XL-E"L*"(G(P>@4 at +B + H( '0GB<@E / / ,'H!XG* +M@>( /#_"=#V0!P!=0V+ :.4*PH(QP&5*PH(@SU8+ H( '0[BPU8+ H(B@'B@4 at +B + H( +M '0DB<@E / / ,'H!XG*@>( /#_"=#V0!P!=0J+ 8E#$(U#$8D!C03_BQ40 +M*0H(C02"4.A\_O__@\0$1SD]4"H*"'>ABPTH)PH(B@'B)RH'B #P_PG0]D < 74-BP&C7"P* +M",@4 at +B + H( '0CB=@E / / ,'H!XG: +M@>( /#_"=#V0!P!=0F+ XD!C4$!B0.+21"%R77&@^P,_S5 at + H(Z*CF___' +M!"29G0@(Z)P4___'!"29G0@(Z$7C__^_ (/$$(,]4"H*" /AH< "^ +M (L5$"D*"(G3C03] (G! ?B#?((( '1;B___X/$!/]S1.A1[/__H5 J"@A(@\00.?AU%(-[! !T#H/L +M#/]S!.C/^?__@\001HL=$"D*"(GIC40] #ET at PAWIT7UW#4XM<) B+"XG( +MP>@4 at +B + H( '0CB<@E / / ,'H!XG*@>( /#_"=#V0!P!=0F+ 8D#C4,! +MB0%;PY"+5"0$BT0D"(G!P>D"B<@C0@@Y GX%B<@C0 at S#5U93@^P$BW0D%(M\ +M)!BY ( _ '0:NP< $ #!X0N)R"-&"#D& +M?@6)R"-&#(/$!%M>7\.+1"0(.40D! ^4P ^VP,.#[!3_="0<_W0D'.AF]/O_ +MA< /E, /ML"#Q!S#@^P4:+!%"0AH ! .C,Y/[_BTPD)(M4)"")1(H8@\0< +MPU575E.#[!R+?"0PBQ>)T -'!#W__P\ #X\3 0 B="%TGD%!?\# #!^ J) +M1"08BQ>)T(72>0:- at O\# E /S__RG"B50D%(M'!(G% R^)Z(7M>0:-A?\# +M #!^ J)1"00B>B%[7D&C87_ P )0#\__^)ZBG"B50D#'40@^P(_W0D&%?H +M5/___X/$$(L'0(D'.T<$=1G'!P #1X(E'!(M'#(E'"-'@@\@!B4<,_T<4 +MQT0D! #'1"0( (M,)!B+1(\8BU0D%(L0:-@?\# ")P\'["HG(A0:- at O\# ")Q\'_"HG0A=)Y!HV"_P, "4 _/__B=,I +MP^@O____B2B+5"0XB5 $BU2^&(L4FHE0"(M4OAB)!)J#Q!Q;7E]=PU575E.# +M[!2+="0HBVPD++\ 55;_EA at 0 ")PH72>0:- at O\# #!^ J)1"08B="% +MTGD&C8+_ P )0#\__\IPHE4)!2+5"08BT26&(M,)!2+'(B#Q!"%VW1;@^P( +M5?\S_Y8<$ @\00A0:-A_\# E /S__RG'@WPD" !X +M787_>#>+5"0(BTPD((M$D1B+'+B%VW0ABW,(A>UT"X/L#/]S!/_5@\004^@I +M_O__@\0$B?.%]G7?3WG)@^P,BT0D%(M4)"S_=((8Z%GA_O^__P, (/$$/], +M) AYHX/L#/]T)"SH/^'^_X/$'%M>7UW#4X/L$&C+10D(:" 0 #HA^#^_XG# +M@\0(:@!0Z)S[__^+4QB#Q!"-@@ 0 YT'85QP( @\($BT,8!0 0 Y +MT'?KQP, QT,$ 0 ,=#"/\# #'0PS_!P QT,0 ,=#% $ "+ +M1"00B8,8$ BT0D%(F#'! (G8@\0(6\.#[!1H-YX("&C4G0@(Z&7___^# +MQ!S#@^P4:$:>" AH\)T(".A/____@\04 _R2%*$8)"(M$)!R+ +M0 2)1"0( /#_B<,)TX-[$ !U$HM$)!R)002+103' 'C[!PCK1(M- +M!($Y$/T'"'0FBT,0C03 BQ40*0H(BT2"%(E!"(M#$(T$P(M-!(L5$"D*"(E, +M at A2+102+5"0H8P>@0)?\ "-5 (5ZR2+502#P@/K'(M"!(M4 +M$ Q"ZQ*+102+4!B#P at +K!XM2!(/B'T*+1)4 9H-X_",/A($" "+="1 at BT9H +MB6 at TBT9H9L= $ $ N , #I& P (M4)!R+ @^W0/R#^!H/A$ ! "#^!P/ +MA=$! ")UHM""(L 9H-X_!H/A;\! "#Q00/MU($.U0D&'->N0 YT7,- +MBT2- (E$C?Q!.=%R\XM$)!@IT(L$A32%"0B)1)7\@^T$#[=6!HT$E0 I +MQ;D @_H =A&+1(X,B42- $$/MT8&.0P^W%%Y#B5PD%(M$A0")1?R+1)4 +MB47X@^T(Z4/___^+5"04BTPD$ ^W!%%"B50D% ^W%%'_1"04BUPD% ^W#%E# +MB5PD%(M$A0")1?R+1)4 B47XBT2- (E%](/M#.D ____BW0D%(M4)! /MP1R +M1HET)!2+3"0(BP2!B47\@^T$Z=W^__^+7"04BW0D$ ^W!%Y#B5PD%,=%^&3Z +M!PB+5"0(BP2"B47\@^T(Z;/^__^+3"04BUPD$ ^W!$M!B4PD%,=%^(#Z!PB+ +M="0(BP2&B47\@^T(Z8G^__^+5"04BTPD$ ^W!%%"B50D%,=%^)SZ!PB+7"0( +MBP2#B47\@^T(Z5_^__^+="04BU0D$ ^W!')&B70D%,=%^+CZ!PB+3"0(BP2! +MB47\@^T(Z37^__^+7"04BW0D$ ^W!%Y#B5PD%,=%^-CZ!PB+5"0(BP2"B47\ +M@^T(Z0O^__^+3"04BUPD$ ^W!$M!B4PD%,=%^/SZ!PB+="0(BP2&B47\@^T( +MZ>']__^+5"04BTPD$ ^W!%%"B50D%,=%^"3[!PB+7"0(BP2#B47\@^T(Z;?] +M__^#[03'10 8&@@(Z:C]__^#[03'10"X$0@(Z9G]__^#[03'10!L$P@(Z8K] +M__^#[03'10!X%0@(Z7O]__^#[03'10#(%P@(Z6S]__^#[03'10 D' @(Z5W] +M__^#[03'10"<( @(Z4[]__^#[03'10!@)@@(Z3_]__^#[03'10 ,+0@(Z3#] +M__^#[03'10"@, @(Z2']__^#[03'10"\- @(Z1+]__^+="04BT0D$ ^W''!& +M#[<,<$:)="04C02- "G%N@ YR@^-YOS__XT$$XMT) R+!(:)1)4 +M0CG*?.WISOS__XM$)!2+5"00#[<,0D /MQQ"0(E$)!1)> Z-%!F+1(T B425 +M $EY\HULG0#IGOS__XM,)!2+="00#[<<3D&)3"04C4,#N0, ")PCG!=@*) +MRH/L#%+HJ1C__X/$$(E%_&:)6 ;' !3-!PB#[03I7/S__XM$)!2+5"00#[0XG80XE<)!0/OP1& 425 .GX]___BT0D%(M4)! /MQQ" +M0(E$)!0/MP1"_T0D%(M,) R+/('H,^'[_XG&BU0D8(M":(M ((D&@^U4P>,0 +M@,O_B5T$QT4 F-<'"(M":(EH-(/L#(G0@\ (4.CSXO[_B<.#Q 2+3"1LBT%H +MBT T@\!44/_7B1PDZ%[C_O^#Z B)1"1PBT!HC9", B50D,(MH-(/%5(L6 +MB5 @@\00Z5KW__^+3"04BUPD$ ^W#$N)3"04Z47W__^#[ QHVD4)".C,R_[_ +M@^P,:/A%"0CHO\O^_X/$3%M>7UW#D)"04X'LI (N$)*P ")1"0,C5PD +M#(U$)!!0Z"#C^__'A"24 (/$#&H 4VH:Z"C?^_^!Q*@ !;PU.# +M["2+7"0L_W0D,.BO____Z(X "C2"<*"+C336(0]^.)T,'H!HE$)!B-!("- +M!("-!(#!X ,IPXT;__P\ @\0(N $ I\%!3Z.+>^_^#Q!"#^/]U#8/L#&C$1PD(Z+')_O^% +M]GXD@^P(5HT$.RGP4.BZWOO_@\00 at _C_=0V#[ QHQ$<)".B)R?[_*?.!PP +M$ ")V%M>7\-75E.+?"00B?O!XQ2#/8 I"@@ =1"#[ Q3Z&3___^)QH/$$.M( +M@^P(4_\U@"D*".C4_O__B<:#Q!"I__\/ '0M@^P(4U#H3=[[_X/$$(/X_W4- +M@^P,:/='"0CH',G^_X/L#%/H&O___XG&@\00C00>HX I"@B[ #G[7\-5B>575E.#[!39?>[H +M %N!P[^C !FBT7NW44(V8,\[O__M QFB47LV,G9;>S??>#9;>XQTHM% +MX%)0WRPDV(M(K___WNG9;>S??>#9;>Z+=>"#Q!R)PELQP#'_"?!>"?I?R<.0 +MD%6)Y5=6@^P8BWT,A?_'1?0 BW4(BT40BU44#XBU A=(/B)T "% +MTHEU[(E%X(E5\(G^=1(Y^'9>B?J+1>SW=>")Q^L*B?8Y??!V)S'_D,=%Z +M "+3?2%R8GXBU7H= ?WV(/2 /?:@\087E_)PXUV ^]1?")QX/W'W5I.W7P +M=PJ+5> Q_SE5['+"OP$ #KNXUV (M]X(7_=0ZX 0 #'),=+W\8E%X(GP +M,=+W=>")1>B+1>SW=>")Q^N6C78 ]]B#T@#WVO=5].E4____D/?>@]< ]]_' +M1?3_____Z3C___^0N" I^(E%Y(GYBU7PT^*+1>"*3>33Z G"B?G39>") +M5?"*3>2)\M/JB?G3YHM%[(I-Y-/H"<:)^8GP]W7PB=:)Q]-E[(M%X/?G.?)W +M#P^%$____SM%[ ^&"O___T_I!/___U6)Y5=6@^PPBWT,A?_'1> QT7D +M ,=%[ "+=0B+11"+510/B",! "%T@^(#P$ (U-\(72B4WHB47, +MB57B%P(E5V'0;BT78B47 at QT7D +M (M%Z(M5X(M-Y(D0B4@$BT7PBU7TZQV0BU74.57<=C")=>")5>2+1>"+ +M5>2)1?")5?2)]HM-[(7)= WWV(/2 /?:B47PB57T@\0P7E_)PY /O477^ +M___WWH/7 /??QT7L_____^G*_O__D+@@ *?")1="+5=R)\=/BBT7,BDW0 +MT^@)PHGQTV7,B572)5?2)_G41.?AV38GZBT7P]W7D +MBR#Q!1>B?A?R<.0#[U%](G'@_B)^8M5 +M]-/BBT7DBDWHT^@)PHGYTV7DB57TBDWHB?+3ZHGYT^:+1?"*3>C3Z G&B?F) +M\/=U](G6B3WYSGR=P\/A3____\[1? /AC;___]/Z3#___]5B>57 +M5H/L,(M5%(M%$(G7C4WPB<:+50R+10B%_\=%X #'1>0 B4WLB47< +MB57,=3XYU@^&H@ /?VBTWLAR+5>"+ +M3>2)$(E(!(M%\(M5](/$,%Y?R<.)]CM]S'8?BU4(BTW,B57 at B4WDBT7@BU7D +MB47PB57T@\0P7E_)PP^]QX/P'XE%U'5A.7W,=P4Y==QR$(M5S(M%W"GP&?J) +M1=R)5R%TG2ABT7"0CT7 at D(6%\)".Q;"0C<6PD( +MS%L)")1;"0AL6PD(8%P)"'1;"0AL6PD(A%L)",1?"0AT7PD(!%P)"-Q;"0C, +M6PD(;%L)")1;"0C\6PD(( IE;F0@ !0871T97)N(&UA=&-H(&9A:6QU5)E +M860 -&<)"+A@"0A;70 H%P)",!@"0A#:&%R+FEN=%1O1&EG:70Z(&YO +M="!A(&1I9VET( .1>"0C at 90D("&8)",1D"0CH8 D(6&$)"-A@"0CX8 D( +MX& )"%80 #P/P / _VP])0 +M #\ _ /P #\ _VP])0!@M1%3[(0E /P / _ +M \#_;#TE /P #\ _ /P #_;#TE &"U$5/LA"4 +M _(&,)" / _ \#_;#TE /P #\ _ /P +M #_;#TE &"U$5/LA"4 _F&<)"+AG"0CT9PD()&P)" / _ +M \#_;#TE /P #\ _ /P #_;#TE &"U$5/LA"4 _ +M \#\ #P/]L/24 _ /P #\ _ /]L/24 8 +M+414^R$)0 #\ #P/P / _VP])0 #\ _ /P +M #\ _VP])0!@M1%3[(0E /]QK"0A'2$,O1FQO870N;&AS.B at U-S(L +M,BDM*#4W-"PR,RE\8V%S90 #P/P / _VP])0 #\ _ +M /P #\ _VP])0!@M1%3[(0E /P / _ \#_; +M#TE /P #\ _ /P #_;#TE &"U$5/LA"4 _/&@)"(!L +M"0@ #P/P / _VP])0 #\ _ /P #\ _VP]) +M0!@M1%3[(0E /UQB"0@ #P/P / _VP])0 #\ _ +M /P #\ _VP])0!@M1%3[(0E /P / _ \#_; +M#TE /P #\ _ /P #_;#TE &"U$5/LA"4 _ +M\#\ #P/]L/24 _ /P #\ _ /]L/24 8+414^R$) +M0 #\ #P/P / _VP])0 #\ _ /P #\ _ +MVP])0!@M1%3[(0E /P / _ \#_;#TE /P #\ +M _ /P #_;#TE &"U$5/LA"4 _ \#\ #P/]L/ +M24 _ /P #\ _ /]L/24 8+414^R$)0 #\ #P +M/P / _VP])0 #\ _ /P #\ _VP])0!@M1%3[(0E +M /P / _ \#_;#TE /P #\ _ /P #_; +M#TE &"U$5/LA"4 _ \#\ #P/]L/24 _ /P +M #\ _ /]L/24 8+414^R$)0 #^X9PD(3&@)""1L"0C$; D(I&,) +M" / _ \#_;#TE /P #\ _ /P #_;#TE +M&"U$5/LA"4 _ \#\ #P/]L/24 _ /P #\ +M _ /]L/24 8+414^R$)0 #\P+C!E, #P/P / _ +MVP])0 #\ _ /P #\ _VP])0!@M1%3[(0E /P +M / _ \#_;#TE /P #\ _ /P #_;#TE &"U$5/LA +M"4 _ \#\ #P/]L/24 _ /P #\ _ +M/]L/24 8+414^R$)0 #\ #P/P / _VP])0 #\ _ +M /P #\ _VP])0!@M1%3[(0E /P / _ \#_; +M#TE /P #\ _ /P #_;#TE &"U$5/LA"4 _ +M\#\ #P/]L/24 _ /P #\ _ /]L/24 8+414^R$) +M0 #\ / _ \#_;#TE /P #\ _ /P +M #_;#TE &"U$5/LA"4 _:&P)" / _ \#_;#TE +M/P #\ _ /P #_;#TE &"U$5/LA"4 _ \#\ +M #P/]L/24 _ /P #\ _ /]L/24 8+414^R$)0 #\ +M #P/P / _VP])0 #\ _ /P #\ _VP])0!@M +M1%3[(0E /V1G"0C,; D()&0)")!L"0CX8PD(7&0)" AD"0@ #P +M/P / _VP])0 #\ _ /P #\ _VP])0!@M1%3[(0E +M /V4P / _ \#_;#TE /P #\ _ /P +M #_;#TE &"U$5/LA"4 _ \#\ #P/]L/24 _ +M/P #\ _ /]L/24 8+414^R$)0 #\ #P/P / _ +MVP])0 #\ _ /P #\ _VP])0!@M1%3[(0E /P +M / _ \#_;#TE /P #\ _ /P #_;#TE &"U$5/LA +M"4 _ / _ \#_;#TE /P #\ _ /P +M #_;#TE &"U$5/LA"4 _,"X \#\ #P/]L/24 _ +M /P #\ _ /]L/24 8+414^R$)0 #\ #P/P +M / _VP])0 #\ _ /P #\ _VP])0!@M1%3[(0E /P +M / _ \#_;#TE /P #\ _ /P #_;#TE &"U$ +M5/LA"4 _ \#\ #P/]L/24 _ /P #\ _ +M /]L/24 8+414^R$)0 #\ #P/P / _VP])0 #\ +M _ /P #\ _VP])0!@M1%3[(0E /P / _ +M\#_;#TE /P #\ _ /P #_;#TE &"U$5/LA"4 _ +M / _ \#_;#TE /P #\ _ /P #_;#TE &"U$ +M5/LA"4 _U&@)"(1J"0AP; D( \#\ #P/]L/24 _ +M /P #\ _ /]L/24 8+414^R$)0 #\ #P/P +M / _VP])0 #\ _ /P #\ _VP])0!@M1%3[(0E /P +M / _ \#_;#TE /P #\ _ /P #_;#TE &"U$ +M5/LA"4 _ \#\ #P/]L/24 _ /P #\ _ +M /]L/24 8+414^R$)0 #\N,&4 \#\ #P/]L/24 +M _ /P #\ _ /]L/24 8+414^R$)0 #\ #P/P +M / _VP])0 #\ _ /P #\ _VP])0!@M1%3[(0E +M/P / _ \#_;#TE /P #\ _ /P #_;#TE +M&"U$5/LA"4 _ \#\ #P/]L/24 _ /P #\ +M _ /]L/24 8+414^R$)0 #\ #P/P / _VP])0 +M #\ _ /P #\ _VP])0!@M1%3[(0E /TQD"0@ #P +M/P / _VP])0 #\ _ /P #\ _VP])0!@M1%3[(0E +M /V1G"0BP9PD(Q&@)",AG"0AX: D(H&P)"$QL"0BD8PD(X&P)"!!D"0BH +M; D( \#\ #P/]L/24 _ /P #\ _ /]L/ +M24 8+414^R$)0 #^P9PD(%&T)" / _ \#_;#TE +M/P #\ _ /P #_;#TE &"U$5/LA"4 _ \#\ +M #P/]L/24 _ /P #\ _ /]L/24 8+414^R$)0 #_< +M:PD(1TA#+T9L;V%T+FQH0 1&L)"&AA;F1L92!I +M7!E <:@D(#&\)""1J +M"0A,:@D(1&H)",95!@C&508(QE4&",95!@C&508(QE4&"-I5!@C&508(YE4& +M",95!@C&508(QE4&",95!@C&508(QE4&",95!@C&508()7, .1>"0C at 90D( +M"&8)",1D"0AN;R!T:')E861S('1O(')U;CH@(&EN9FEN:71E(&QO;W @;W(@ +M9&5A9&QO8VL_ ",:@D(;',)"$EN= D= D(%&L)"$QK"0A,= D(/'0)"#1K +M"0C\:@D(!&L)" 1K"0 at 4:PD()&L)"&QT"0 at T:PD()'0)"!1K"0A,:PD(3'0) +M"&QT"0BD:PD(M&L)"*!<"0B,= D(H%P)")QT"0 at Z( Q&L)",1K"0 at 4; D( +M27)R969U=&%B;&4@<&%T=&5R;B!F86EL960 at 9F]R('!A='1E&AA=7-T:79E('!A='1E2!E;&5M +M96YT " H !%>&ET1F%I;'5R92 97AI=#H@ !I;G9A;&ED(&%R9W5M +M96YT #!P"0A < D(4')E;'5D92X I'<)"%AP"0 at Z(&5M<'1Y(&QI +M D()'()"%1R"0 at D +M; D(A'@)"*!<"0B : D(L&<)""1R"0A2871I;RXE.B!Z97)O(&1E;F]M:6YA +M=&]R )&P)"%1X"0BP9PD(9&<)"+!G"0BP9PD(G& )"*!<"0BD2XA*3H@=6YD969I;F5D(&%R'L ?2YI;F1E>#H at 26YD97@@ /QS"0B@ +M7 D(W'@)"'-T87)T24]397)V:6-E5&AR96%D %!R96QU9&4N16YU;2YP +MTEN='TZ('1R:65D('1O('1A:V4 at 8'!R960G(&]F(&UI;D)O=6YD +M %!R96QU9&4N16YU;2YS=6-C>TEN='TZ('1R:65D('1O('1A:V4 at 8'-U8V,G +M(&]F(&UA>$)O=6YD / _ \#_;#TE /P #\ +M _ /P #_;#TE &"U$5/LA"4 _L&<)"/!L"0@ #P/P +M / _VP])0 #\ _ /P #\ _VP])0!@M1%3[(0E +M/P / _ \#_;#TE /P #\ _ /P #_;#TE +M&"U$5/LA"4 _!'4)" / _ \#_;#TE /P #\ +M _ /P #_;#TE &"U$5/LA"4 _L&<)"!1U"0@ #P/P +M / _VP])0 #\ _ /P #\ _VP])0!@M1%3[(0E +M/P / _ \#_;#TE /P #\ _ /P #_;#TE +M&"U$5/LA"4 _I&,)" / _ \#_;#TE /P #\ +M _ /P #_;#TE &"U$5/LA"4 _\'@)" / _ +M\#_;#TE /P #\ _ /P #_;#TE &"U$5/LA"4 _ 'D) +M"&9L=7-H4F5A9$)U9F9E<@!H86YD;&4@:7, at 8VQO2!I;F1E>"!O=70@;V8@0!D;V5S(&YO="!E>&ES= 87)I=&AM971I8R!O +M=F5R9FQO=P!H87)D=V%R92!F875L= 86QR96%D>2!E>&ES=', '1I;65O +M=70 17AI=%-U8V-E D(1TA#+DYU;2YG8V1);G1E9V5R.B!G8V0@ +M," P(&ES('5N9&5F:6YE9 !02 P %!R96QU9&4N26YT96=R86PNTEN=&5G +M97)].B!D:79I9&4 at 8GD@, 9&<)")Q@"0AD9PD(9&<)"&1G"0AD9PD(H%P) +M"(!H"0 at D; D(G& )"'5N:VYO=VX at 9FEL92!T>7!E 1TA#+D)A'!E8W1E9"!25%, at 87)G=6UE;G0Z +M("5S "4P+C$R,G,N7-T96T@;W!T +M:6]NF4^(%-E +M=',@=&AE(&EN:71I86P@=&AR96%D('-T86-K('-I>F4@*&1E9F%U;'0@,6LI +M("!%9W,Z("UK-&L@(" M:S)M " @+4$\F4@*&1E9F%U;'0@ +M,$TI(" @16=S.B M2#(T;2 @+4 at Q1P " @+6T\;CX@(" @36EN:6UU;2 E +M(&]F(&AE87 @=VAI8V@@;75S="!B92!A=F%I;&%B;&4@*&1E9F%U;'0@,R4I +M (" M1SQN/B @("!.=6UB97(@;V8 at 9V5N97)A=&EO;G,@*&1E9F%U;'0Z +M(#(I (" M5#QN/B @("!.=6UB97(@;V8@6]U;F=EF4@;W5T('5P9&%T92!F +M2!B92!A=F%I;&%B;&4 at 9F]R('!R;V=R86US(&-O +M;7!I;&5D(&$@9&EF9F5R96YT('=A>2X !4:&4 at 1TA#(%5S97(G2UT:6-K>2!S=&%T

    P<()78'"&5V!PC,>0<(;WL'"&][!PC,=@<(7W@'",=X!PAO>P<( +M;WL'"#5W!PAO>P<(HW<'"&][!PAO>P<(=7D'"&][!PB2>0<(!WD'")-X!PAO +M>P<(;WL'"&][!PAO>P<(;WL'"&9Y!PAO>P<(;WL'"&][!PAO>P<(;WL'"&][ +M!PAO>P<(IGH'"'1V!PAO>P<(;'H'"&][!PAO>P<(KWD'"&][!PAO>P<(;'<' +M"&][!PCC=P<(;WL'"&][!PAU>0<(B7H'",-Z!P at 3>0<('WD'"&][!PAO>P<( +M;WL'".!Z!PA!4U-%4E1)3TX at 1D%)3$5$.B!F:6QE("5S+"!L:6YE("5U"@ @ +M(" @4&QE87-E(')E<&]R="!T:&ES(&%S(&$@8G5G('1O(&=L87-G;W'0 at 9FEE;&0 !S8VAE +M9'5L93H@:6YV86QI9"!T:')E860@'1E5]B;&]C:V5D.B E9"!F;W(@5%-/("5D("@E9"D BE <(GY$'"-62!P@? +MDP<(:),'"'F3!PCDG0<(2!P96YD:6YG('-I9VYA;', 71E2!I;B!U71E2 H)6QD('-A;7!L97,I+" E;'5-(&EN('5S92P@)2XR9B!)3DE4 +M("@E+C)F(&5L87!S960I+" E+C)F($U55" H)2XR9B!E;&%PF4@)6QD +M(&)Y=&5S+ at I55]F2!E;G1E5]F2!E;G1E5]F2!E;G1E5]F2!E;G1E5]F2!E;G1EFA?9F%S= !44T\@;V)J96-T +M(&5N=&5R960A $5604-5051%1"!O8FIE8W0 at 96YT97)E9"$ !714%+(&]B +M:F5C="!E;G1E" @1'@@($1X("!$>" @1'@@($1X( +M"!$>" A&' @($1X("#T=" @1'@@('QX("!\>" @?'@@('QX("!\>" @Y' @( +M.1P("#D<" @Y' @(.1P("#D<" @Y' @(.1P("#D<" @Y' @($1X("!$>" @1 +M'@@($1X("!$>" @Y' @(.1P("#D<" @Y' @(.1P("#D<" @Y' @(.1P("#D< +M" @Y' @(.1P("#D<" @Y' @(.1P("#D<" @Y' @(.1P("#D<" @Y' @(.1P( +M"#D<" @Y' @(.1P("#D<" AS=&=?87!?<'9?" A%'@@( +M11X("$4>" A%'@@(11X("$4>" A%'@@(11X("$4>" CF'@@(YAX(".8>" CF +M'@@(YAX(".8>" CF'@@(>R ("'L@" A[( @(>R ("'L@" A[( @(>R ("'L@ +M" A2'@@(>R ("((?" A[( @(B2 ("(D@" B)( @(B2 ("(D@" A%'@@(11X( +M"$4>" A%'@@(11X("$4>" A%'@@(11X("$4>" A%'@@(>R ("'L@" A[( @( +M>R ("'L@" A%'@@(11X("$4>" A%'@@(11X("$4>" A%'@@(11X("$4>" A% +M'@@(11X("$4>" A%'@@(11X("$4>" A%'@@(11X("$4>" A%'@@(11X("$4> +M" A%'@@(11X("$4>" AS=&=?87!?<'!?- @(GC0(")XT" B>- @(GC0(")XT" B>- @(PC (")XT" CQ,@@( +MGC0("*PT" BL- @(K#0("*PT" BL- @(M3 ("+4P" BU, @(M3 ("+4P" BU +M, @(M3 ("+4P" BU, @(M3 (")XT" B>- @(GC0(")XT" B>- @(M3 ("+4P +M" BU, @(M3 ("+4P" BU, @(M3 ("+4P" BU, @(M3 ("+4P" BU, @(M3 ( +M"+4P" BU, @(M3 ("+4P" BU, @(M3 ("+4P" BU, @(M3 ("+4P" BU, @( +M71E7!E("5D($ @)7 :P@(WFL("-YK" C>:P@(9F4("&EC" C\8P@(9F(("!=E" B$9 @(WFL( +M"*AE" @:8P@(N&,(",!B" C(9 @(0&0("-YK" B?9P@($F8(".!G" C at 9P@( +MLF<("-YK" C>:P@(2F8("%QF" C>:P@(WFL("-YK" C>:P@(WFL("-YK" C> +M:P@(WFL("-YK" C>:P@(WFL("#UG" @]9P@(16<("#UG" @]9P@(XV$("(AH +M" B6: @((6D("+]F" @K9P@(Z&4(".AE" CH90@(46D("-YK" C>:P@(WFL( +M"-YK" C>:P@(WFL(",=I" A*:@@(.6L(",)J" CA@@($GL("!)[" @2>P@($GL("!)[" @2>P@( +M$GL("!)[" @2>P@($GL("!)[" @2>P@($GL(".=Y" @2>P@($GL(")YY" @2 +M>P@(\7@(""-Y" B%>0@($GL("!)[" @2>P@($GL(",UY" @2>P@($GL("!)[ +M" @2>P@($GL("!)[" A*>@@(>7H(")UZ" CQ>@@(Y'T("&I]" AJ?0@(#WX( +M" ]^" @[?@@(BGX("%=]" AJ?0@(:GT("!M_" @;?P@(&W\("!M_" @;?P@( +M&W\("!M_" @;?P@(&W\("!M_" @;?P@(&W\("!M_" @;?P@(&W\("!M_" @; +M?P@(&W\("!M_" @;?P@(&W\("!M_" @;?P@(&W\("!M_" AJ?0@(:GT("&I] +M" CM@ @(^( ("/B " CC@ @(XX (",6 " C;@ @(U((("-^"" C?@@@(RH(( +M",J"" BL@@@(PH(("'1H/" @4C0@(#(T("-.- +M" B6C0@(CHT(" :7" @&EP@(!I<(" :7" @GCP@(%(T(" R-" C3C0@(EHT( +M"(Z-" @&EP@()X\("%&-" B.C0@(TXT("):-" B.C0@(!I<("$61" A%C@@( +MW)$("-R1" B"D0@(!I<(" B1" @GCP@(")$(" :7" @&EP@(!I<(" :7" @& +MEP@(!I<(" :7" @&EP@(!I<(" :7" @&EP@()X\("">/" @GCP@()X\("">/ +M" A?D @("I0("!B4" @8E @()X\("">/" A[CP@()X\("">/" AIE @(!I<( +M" :7" @&EP@(!I<(" :7" @&EP@(>I0("".5" @+E@@(EY4("&B9" AHF0@( +M")D(" B9" @/F0@(#YD(" ^9" AHF0@(:)D("&B9" AHF0@(:)D(" B9" @( +MF0@(#YD(" ^9" @/F0@(:)D("&B9" @/F0@(#YD(" ^9" @/F0@(#YD("&B9 +M" @6F0@(1ID(""69" @EF0@('9D("&B9" AHF0@(:)D("&B9" AHF0@(:)D( +M"&B9" AHF0@(:)D("&B9" AHF0@(:)D("&B9" AHF0@(:)D("&B9" AHF0@( +M:)D("&B9" AHF0@(:)D(""Z9" @VF0@(-ID("&B9" AHF0@(:)D("&B9" AH +MF0@(/ID("&B9" AHF0@(:)D("&B9" AHF0@(:)D("$R9" A3F0@(6ID("&&9 +M" AA;&QO8U-E9VUE;G0 86QL;V-(87-H3&ES= !A;&QO8TAA2 H71E"0C at 80D($&()"%!B"0@ 9!$%"-A<"0C87 at D( +M!&,)"%1B"0@ Z-4$" 1="0AP8PD(1&,)" A>"0B at 7@D(P%X)".1A"0AL +M7 at D(U%X)",QA"0 at X8PD(:&,)"+Q>"0AT7 at D(H&()")1B"0C(80D(!%X)"&A> +M"0@ )!$%"-A<"0A\8PD($&,)" !\$04(<%T)" 1="0A<8 at D(8%X) +M"(AB"0CP70D()&()" $L04(A%T)"!Q="0A<7 at D(6%X)"(!>"0AX7 at D( +M;&,)"&1B"0@ 8PD(S&()")A>"0 at T7@D(>&,)"#Q>"0AH8 at D(#%X)" !H +MMP0( $"Y! @HJP0( +2Y! @XN at 0(H+H$" #PN at 0( "BK +M! @* -$\%"'Q>"0A\8 at D( 0 /C5! A8=04(4-8$"*36! @ +M # J00(90 C7! @@UP0(1-<$" (V 0(C-@$"/#8! AHV00( +MS-D$"'3:! CLV at 0(!-L$""BK! @8 P*D$"# !!0AP(04( $ E!0BL)@4(>"@% +M", at H!0@ !H*04(C"D%"+0I!0@ !@*@4( +M>"H%" !PO!0@ #P,P4(T#0%"#1!!0AL +M0 at 4(%$,%"*A$!0C42 4(=%L&"'!J"0AT:@D(%&D)"!!I"0AL:@D(>&H)"+!A +M"0BL80D( 0 A-!0A8304(-$X%"$!0!0@ U% %" ,5P4(D%<% +M"/17!0@ !<6 4(W%@%"( /!0@! @ \%" " 604( +M @ \%" H #L604( 'A:!0@ _%X%"&!?!0@ +M .&$%"*AA!0@ (8 at 4( ;&(%"*AB +M!0@ ^&(%" !H:P4(Z&L%" AL!0@ !P; 4(^&P% +M" #X;@4( %"P!0BL<@4($',%"(1S!0AP=04(T'4%" +M $AV!0@ #0=@4( ,"N!0@,KP4( +M J*D$"-!C"0 at 88PD( 0 &RO!0@ #0KP4(_*\%"( / +M!0@" ;+ %" HJP0(@ !BQ!0@ 1+<%" +M !RX!0 at HJP0( 0 ("X!0C at N 4( 0+D%" +M +RY!0 at TN@4(@+ $"-L/24"4N at 4(#&$&""1>"0@@9 D(L&,)"$AL"0B8 +M8 at D(C&P)"-QL"0A$; D( 0 /"Z!0@ (+P%"'B\!0C J00(+@ .B\ +M!0@ $F08(**L$"(/___](O04( X*D$ +M")!>"0A47 D( 0 -2]!0@ !\O at 4( -3$!0@ +M "(Q04(/,8%" +#&!0A8QP4(I,<%" +M $C(!0@ #$R 4( $,H%" +M "(R at 4( $C+!0@ .- %" XT04( ,S2!0@ +M HJP0( @ )#3!0@ )-T%" (S=!0@ +MJ*D$".Q?"0A87 D( 0 .S>!0@ "-\%" +0"!0 at T +M90D( '#?!0@ T.(%""CC!0@ J*D$"-AF"0A87 D( 0 (SD +M!0@ !$!04(4%P)"/AF"0C\7 at D(6&4)"%!<"0@ **L$ +M" $ !(Y04( L.4%" "XYP4( +M(.@%" LZ at 4(Y.H%" +0"!0CH;0D( *#K!0@ +M ([ 4( ;.P%"+SL!0@ 1.X%" +M #<\04(*/,%" "T @4(S&T)" H]P4(J*D$""1G"0A<7 D( 0 +M $3W!0@ "T]P4( -3W!0A8# 8(4%P)" $ X^@4( +M %SZ!0@ G/P%"*BI! @ 9PD(6%P)" $ $_P4( +M 9/\%" (@ !@@ J*D$"!AG"0C$9 at D( .@" +M!@@ ) ,&" !!@BP7P8(G! '"#!@!@@,808(Y&H)".!J"0C8:@D(U',)",QS +M"0C<:@D(X',)".1S"0@! R%\&"$A@!@BT8 8(-$\%"/1S"0CP08(F&L)"(AK"0B = D(@&L)"(1K"0A\= D(H&L)"(1T +M"0@ O'4&"-!U!@@@=@8( )1V!@C8=P8(*'D&" "0>08(X'D& +M" $AZ!@@ "L>@8( +M%'L&" " ?08( ."I! @$; D(5%P)" $ $?@8( +M P*D$" H # J00(( &1^!@@ #$?@8( +M .,<&"#QO"0@! *'\&"*Q_!@@T@ 8(M( &" #@J00(_%T) +M"%1<"0@! Y(,&"&B$!@@ S(4&" $B(!@@ +M (T&"(R-!@@ C at 8( W(X&" \D at 8( +M **L$"$P$ #PD at 8(<),&" ",F 8( ')D&"*29 +M!@@ !4F at 8( (-\$" Q)H& +M" (H08( >*$&" #8IP8( +M5*@&" +RH!@@ TJ08( +M G*D&" 2J!@@ "4J at 8( +M %*L&" ,BK!@@ "(K 8( +M 1 4%"%!<"0C at 7PD(5%P)"#!N"0A07 D( $0%!0A07 D( +MW&8)"/Q>"0A,;@D(4%P)" "T @4(S&X)" #HK 8( +M 6*T&" "$K08( /BO!@@ "T @4(L&X)" $ +M !8L 8( **L$"/____^T @4(A&X)" # L 8( +M /RQ!@@ V+(&"$0%!0A07 D(X%\)"%1<"0A$=0D(4%P)" #LL at 8( +M 1 4%"%!<"0@(;PD(5%P)"%1<"0A07 D( 0 $0%!0A0 +M7 D(X%\)"%1<"0AD=0D(4%P)" !\LP8( BZ!@@ +M !PN at 8( &B]!@A\O08( C !@@ "(P 8( +M _, &" ! PP8(7,,&" ",Q08( +M[,4&" $S&!@@ "XQ at 8( +M 1,<&" .#'!@@ $,T&" #$S at 8( +M ),\&" (3/!@@ #DSP8( +M 1- &" *30!@@ $T08( +M =-$&" C2!@BDT at 8( #-,&" +M '#3!@@ #08(X'<)"-1P"0B 9PD(>&<)"!!Q"0CD=PD( +M:'$)"(QQ"0@! C-D&" ! D( 0 "BK! @ < H%"!1Q"0B0<0D(3&<)"'QG"0A at 8 D(2'@) +M"%1X"0CH=PD(0'@)" X at 8(Q.,&""3D!@B,Y 8([.0&""3E!@@ +M ",Y08( ].4&"/@3!0 at P> D(9'@)"#AX"0@ +M 4.8&",SF!@@\YP8( -#G!@@ H.@&" ! Z08( +M K.D&" !0Z at 8( #K!@@ A.L&" +M /3K!@@ /.T&" "H[08( $3N!@@ "X[@8( +M ,#P!@B<\08( !/(&" ]08( /SU!@C@ +M]P8( "SZ!@A ^P8()/P&" # J00(+0 /@3!0B(<@D(F'@)"(QR +M"0@ I/P&"/C\!@@ 1 ('",#_!@A$!04(4%P)".1F"0CL:0D(K'@) +M"%!<"0@ W/\&" 0 !P@ "D <(S '" +M &@!!P@ ( @<(: ('"- "!PCL @<(' ,'","I! @* +M . ,'"% #!PB #P4( 0 ' *!0A( +M!P@ !0'P<(@!\'"*PA!PC8(P<()"0'" +M "BK! @" V"0'" $0E!P@ #T)0<( +M <"8'" -PF!P@ !( +M)P<( L"<'" ! H!P@ +M !P* <( V"@'" #@I!P@ +M "@*0<( " L!P@ " + <( +MX"P'" $ M!P@ "@+0<( +M "X'" & N!P@ # +@<( +M ("\'" ( O!P@ #@+P<( +M 0# '" * P!P@ ,0<( +M P*D$""D !@,0<( P#$'" +M " R!P@ " ,@<( X#('" +M ,"I! A] 0#,'" * S!P@ +M - <( 8#0'" , T!P@ +M @-0<( @#4'" .0U!P@ +M #X$P4(B'<)"(QW"0@\=PD( $@V!PB8-@<([ 4%" $ +M #L!04(______ V!PCL!04( %PW!PC(-P<(&#@'"&@X!PC<. <(2#D' +M", Y!PAD.@<(S#H'" # [!PC\/ <(Q#X'" +M "BK! C_____+#\'"(P_!PCL/P<(8$$'")A!!P at 40@<(_$('" +M %Q#!P@ # 0P<(0$8'" *1& +M!PAP2 <(/$H'""A+!P at 03 <( $1,!P@ R$X'"-Q.!PA44 <( +M A1!PAX4@<( %Q3!PC84P<(2%4'" ! $ 4( (15!P@ +M #L50<( 9%8'"$Q8!PB at 6 <( ,!;!P at 4 +M7 <(+%P'" ."I! BL8 D(S'@)" $ #@J00(K& )"%1< +M"0@! C%P'" 1=!PB870<( !%X' +M" '1>!P@ F%\'" # J00(+0 ,"I! @H +MP*D$""D T80<(@ \%" H +M K@@)"+ST" BN" D(!/4("#CU" AH]0@(L/4("*X("0CH]0@(K@@)""#V +M" BN" D(:/8("+3V" BN" D(!/<("%3W" B@]P@(Z/<(""SX" A<^ @(G/@( +M".SX" @\^0@(K@@)"'3Y" BX^0@(_/D("*X("0BN" D((/H("&#Z" BN" D( +MI/H("-3Z" @<^P@(K@@)"*X("0A<^P@(K@@)"*C[" CT^P@(K@@)" "/ +M?P<(B( '""V !P@\>@D(.'H)"#1Z"0@! 0"L*"!3^!PCL_@<(!/\'"!S_ +M!P at T_P<(3/\'"'S_!P@, @(P*D$" # J00( 0 ,"I! @" P*D$ +M" , # J00(! ,"I! @% P*D$" 8 # J00(!P ,"I! @( +MP*D$" D # J00("@ ,"I! @+ P*D$" P # J00(#0 ,"I! @. +M P*D$" \ # J00($ ,"I! @1 P*D$"!( # J00($P ,"I +M! @4 P*D$"!4 # J00(%@ ,"I! @7 P*D$"!@ # J00(&0 +M ,"I! @: P*D$"!L # J00(' ,"I! @= P*D$"!X # J00( +M'P ,"I! @@ P*D$""$ # J00((@ ,"I! @C P*D$""0 # +MJ00()0 ,"I! @F P*D$""< # J00(* ,"I! @I P*D$""H +M # J00(*P ,"I! @L P*D$""T # J00(+@ ,"I! @O P*D$ +M"# # J00(,0 ,"I! @R P*D$"#, # J00(- ,"I! @U +MP*D$"#8 # J00(-P ,"I! @X P*D$"#D # J00(.@ ,"I! @[ +M P*D$"#P # J00(/0 ,"I! @^ P*D$"#\ # J00(0 ,"I +M! A! P*D$"$( # J00(0P ,"I! A$ P*D$"$4 # J00(1@ +M ,"I! A' P*D$"$@ # J00(20 ,"I! A* P*D$"$L # J00( +M3 ,"I! A- P*D$"$X # J00(3P ,"I! A0 P*D$"%$ # +MJ00(4@ ,"I! A3 P*D$"%0 # J00(50 ,"I! A6 P*D$"%< +M # J00(6 ,"I! A9 P*D$"%H # J00(6P ,"I! A< P*D$ +M"%T # J00(7@ ,"I! A? P*D$"& # J00(80 ,"I! AB +MP*D$"&, # J00(9 ,"I! AE P*D$"&8 # J00(9P ,"I! AH +M P*D$"&D # J00(:@ ,"I! AK P*D$"&P # J00(;0 ,"I +M! AN P*D$"&\ # J00(< ,"I! AQ P*D$"'( # J00(

    0 ,"I! AZ P*D$"'L # J00(? ,"I! A] P*D$"'X # +MJ00(?P ,"I! B P*D$"($ # J00(@@ ,"I! B# P*D$"(0 +M # J00(A0 ,"I! B& P*D$"(< # J00(B ,"I! B) P*D$ +M"(H # J00(BP ,"I! B, P*D$"(T # J00(C@ ,"I! B/ +MP*D$") # J00(D0 ,"I! B2 P*D$"), # J00(E ,"I! B5 +M P*D$")8 # J00(EP ,"I! B8 P*D$")D # J00(F@ ,"I +M! B; P*D$")P # J00(G0 ,"I! B> P*D$")\ # J00(H +M ,"I! BA P*D$"*( # J00(HP ,"I! BD P*D$"*4 # J00( +MI@ ,"I! BG P*D$"*@ # J00(J0 ,"I! BJ P*D$"*L # +MJ00(K ,"I! BM P*D$"*X # J00(KP ,"I! BP P*D$"+$ +M # J00(L@ ,"I! BS P*D$"+0 # J00(M0 ,"I! BV P*D$ +M"+< # J00(N ,"I! BY P*D$"+H # J00(NP ,"I! B\ +MP*D$"+T # J00(O@ ,"I! B_ P*D$", # J00(P0 ,"I! C" +M P*D$",, # J00(Q ,"I! C% P*D$",8 # J00(QP ,"I +M! C( P*D$",D # J00(R@ ,"I! C+ P*D$",P # J00(S0 +M ,"I! C. P*D$",\ # J00(T ,"I! C1 P*D$"-( # J00( +MTP ,"I! C4 P*D$"-4 # J00(U@ ,"I! C7 P*D$"-@ # +MJ00(V0 ,"I! C: P*D$"-L # J00(W ,"I! C= P*D$"-X +M # J00(WP ,"I! C@ P*D$".$ # J00(X@ ,"I! CC P*D$ +M".0 # J00(Y0 ,"I! CF P*D$".< # J00(Z ,"I! CI +MP*D$".H # J00(ZP ,"I! CL P*D$".T # J00([@ ,"I! CO +M P*D$"/ # J00(\0 ,"I! CR P*D$"/, # J00(] ,"I +M! CU P*D$"/8 # J00(]P ,"I! CX P*D$"/D # J00(^@ +M ,"I! C[ P*D$"/P # J00(_0 ,"I! C^ P*D$"/\ HJP0( +M\/___RBK! CQ____**L$"/+___\HJP0(\____RBK! CT____**L$"/7___\H +MJP0(]O___RBK! CW____**L$"/C___\HJP0(^?___RBK! CZ____**L$"/O_ +M__\HJP0(_/___RBK! C]____**L$"/[___\HJP0(_____RBK! @ **L$ +M" $ HJP0( @ "BK! @# **L$" 0 HJP0(!0 "BK! @& +M**L$" < HJP0(" "BK! @) **L$" H HJP0("P "BK! @, +M **L$" T HJP0(#@ "BK! @/ **L$"! +M !P.0@(D#D("+ Y" C0.0@(\#D("! Z" @P.@@(4#H("' Z" B0.@@(L#H( +M"- Z" CP.@@($#L("# [" A0.P@(<#L(") [" BP.P@(T#L("/ [" @0/ @( +M =#D(")0Y" BT.0@(U#D("/0Y" @4.@@(-#H("%0Z" AT +M.@@(E#H("+0Z" C4.@@(]#H("!0[" @T.P@(5#L("'0[" B4.P@(M#L("-0[ +M" CT.P@(%#P(" "$ ! (0 &( !B 8@ +M "( !" @ ., !C HP ", ## 0P (, # +M! 4 & !P @ +M % 4 !0 % 4 !0 - T #0 - (4 A0"% (4 A0"% (T D@"2 )( +MD@"2 )( F@"2 4 $ % ! ! $$ 00!! $, 0( @@"" ( @ " @ " +M ( 1@!$ &0 1 !$ &4 10!E $4 90!% $4 10!% &4 90!E &0 9 $4 +M9 !E &0 9 " ( @ E !X D' @(G" ("& F" @,+0@(H# ("+PT" @ +M1T-#.B H1TY5*2 S+C0N,R R,# U,#(R-R H4F5D($AA=" S+C0N,RTR,BD +M $=#0SH@*$=.52D@,RXT+C,@,C P-3 R,C<@*%)E9"!(870@,RXT+C,M,C(I +M !'0T,Z("A'3E4I(#,N-"XR(#(P,#0Q,#$W("A2960 at 2&%T(#,N-"XR+38N +M9F,S*0 1T-#.B H1TY5*2 S+C0N,B R,# T,3 Q-R H4F5D($AA=" S+C0N +M,BTV+F9C,RD $=#0SH@*$=.52D@,RXT+C(@,C P-#$P,3<@*%)E9"!(870@ +M,RXT+C(M-BYF8S,I !'0T,Z("A'3E4I(#,N-"XR(#(P,#0Q,#$W("A2960@ +M2&%T(#,N-"XR+38N9F,S*0 1T-#.B H1TY5*2 S+C0N,B R,# T,3 Q-R H +M4F5D($AA=" S+C0N,BTV+F9C,RD $=#0SH@*$=.52D@,RXT+C(@,C P-#$P +M,3<@*%)E9"!(870@,RXT+C(M-BYF8S,I !'0T,Z("A'3E4I(#,N-"XR(#(P +M,#0Q,#$W("A2960 at 2&%T(#,N-"XR+38N9F,S*0 1T-#.B H1TY5*2 S+C0N +M,B R,# T,3 Q-R H4F5D($AA=" S+C0N,BTV+F9C,RD $=#0SH@*$=.52D@ +M,RXT+C(@,C P-#$P,3<@*%)E9"!(870@,RXT+C(M-BYF8S,I !'0T,Z("A' +M3E4I(#,N-"XR(#(P,#0Q,#$W("A2960 at 2&%T(#,N-"XR+38N9F,S*0 1T-# +M.B H1TY5*2 S+C0N,B R,# T,3 Q-R H4F5D($AA=" S+C0N,BTV+F9C,RD +M $=#0SH@*$=.52D@,RXT+C(@,C P-#$P,3<@*%)E9"!(870@,RXT+C(M-BYF +M8S,I !'0T,Z("A'3E4I(#,N-"XR(#(P,#0Q,#$W("A2960 at 2&%T(#,N-"XR +M+38N9F,S*0 1T-#.B H1TY5*2 S+C0N,B R,# T,3 Q-R H4F5D($AA=" S +M+C0N,BTV+F9C,RD $=#0SH@*$=.52D@,RXT+C(@,C P-#$P,3<@*%)E9"!( +M870@,RXT+C(M-BYF8S,I !'0T,Z("A'3E4I(#,N-"XR(#(P,#0Q,#$W("A2 +M960 at 2&%T(#,N-"XR+38N9F,S*0 1T-#.B H1TY5*2 S+C0N,B R,# T,3 Q +M-R H4F5D($AA=" S+C0N,BTV+F9C,RD $=#0SH@*$=.52D@,RXT+C(@,C P +M-#$P,3<@*%)E9"!(870@,RXT+C(M-BYF8S,I !'0T,Z("A'3E4I(#,N-"XR +M(#(P,#0Q,#$W("A2960 at 2&%T(#,N-"XR+38N9F,S*0 1T-#.B H1TY5*2 S +M+C0N,B R,# T,3 Q-R H4F5D($AA=" S+C0N,BTV+F9C,RD $=#0SH@*$=. +M52D@,RXT+C(@,C P-#$P,3<@*%)E9"!(870@,RXT+C(M-BYF8S,I !'0T,Z +M("A'3E4I(#,N-"XR(#(P,#0Q,#$W("A2960 at 2&%T(#,N-"XR+38N9F,S*0 +M1T-#.B H1TY5*2 S+C0N,B R,# T,3 Q-R H4F5D($AA=" S+C0N,BTV+F9C +M,RD $=#0SH@*$=.52D@,RXT+C(@,C P-#$P,3<@*%)E9"!(870@,RXT+C(M +M-BYF8S,I !'0T,Z("A'3E4I(#,N-"XR(#(P,#0Q,#$W("A2960 at 2&%T(#,N +M-"XR+38N9F,S*0 1T-#.B H1TY5*2 S+C0N,B R,# T,3 Q-R H4F5D($AA +M=" S+C0N,BTV+F9C,RD $=#0SH@*$=.52D@,RXT+C(@,C P-#$P,3<@*%)E +M9"!(870@,RXT+C(M-BYF8S,I !'0T,Z("A'3E4I(#,N-"XR(#(P,#0Q,#$W +M("A2960 at 2&%T(#,N-"XR+38N9F,S*0 1T-#.B H1TY5*2 S+C0N,B R,# T +M,3 Q-R H4F5D($AA=" S+C0N,BTV+F9C,RD $=#0SH@*$=.52D@,RXT+C(@ +M,C P-#$P,3<@*%)E9"!(870@,RXT+C(M-BYF8S,I !'0T,Z("A'3E4I(#,N +M-"XR(#(P,#0Q,#$W("A2960 at 2&%T(#,N-"XR+38N9F,S*0 1T-#.B H1TY5 +M*2 S+C0N,B R,# T,3 Q-R H4F5D($AA=" S+C0N,BTV+F9C,RD $=#0SH@ +M*$=.52D@,RXT+C(@,C P-#$P,3<@*%)E9"!(870@,RXT+C(M-BYF8S,I !' +M0T,Z("A'3E4I(#,N-"XR(#(P,#0Q,#$W("A2960 at 2&%T(#,N-"XR+38N9F,S +M*0 1T-#.B H1TY5*2 S+C0N,B R,# T,3 Q-R H4F5D($AA=" S+C0N,BTV +M+F9C,RD $=#0SH@*$=.52D@,RXT+C(@,C P-#$P,3<@*%)E9"!(870@,RXT +M+C(M-BYF8S,I !'0T,Z("A'3E4I(#,N-"XR(#(P,#0Q,#$W("A2960 at 2&%T +M(#,N-"XR+38N9F,S*0 1T-#.B H1TY5*2 S+C0N,B R,# T,3 Q-R H4F5D +M($AA=" S+C0N,BTV+F9C,RD $=#0SH@*$=.52D@,RXT+C(@,C P-#$P,3<@ +M*%)E9"!(870@,RXT+C(M-BYF8S,I !'0T,Z("A'3E4I(#,N-"XR(#(P,#0Q +M,#$W("A2960 at 2&%T(#,N-"XR+38N9F,S*0 1T-#.B H1TY5*2 S+C0N,B R +M,# T,3 Q-R H4F5D($AA=" S+C0N,BTV+F9C,RD $=#0SH@*$=.52D@,RXT +M+C(@,C P-#$P,3<@*%)E9"!(870@,RXT+C(M-BYF8S,I !'0T,Z("A'3E4I +M(#,N-"XR(#(P,#0Q,#$W("A2960 at 2&%T(#,N-"XR+38N9F,S*0 1T-#.B H +M1TY5*2 S+C0N,R R,# U,#(R-R H4F5D($AA=" S+C0N,RTR,BD "YS>6UT +M86( +G-T'0 +F9I;FD +G)O9&%T +M80 N96A?9G)A;65?:&1R "YE:%]FP $ & K)<$ +M"*P7 "()00 $ ($ ! !@ #2]" @T/00 +M&@ ! "' 0 ( !0O0@(4#T$ ,2* +M 0 CP $ " %$@)"!3(! L +M $ )T ! @ $!("0A R 0 G ! +M "G 0 , #<6 D(W,@$ @ 0 +MK@ $ # Y%@)".3(! ( $ +4 ! +M P .Q8"0CLR 0 ! ! "Z !@ , +M #P6 D(\,@$ . % 0 ( PP $ # T%D) +M"-#)! $ $ ! ,@ ! P -19"0C4R00 +M8 $ ! 0 #1 0 , ! 6PD(0,L$ ! J +M " UP @ # 8(4)"%#U! @MP +M @ -P ! !0]00 Q0@ 0 +M 1 P %?X$ .4 $ +M 0 ( (0#!0" L $ ' %80 $ $ D # +M $M 8 FY,! 0 +M #2!! @ P ! !(@00( , @ :($$ +M" # , 'R$! @ P $ "! @, 0 , @# #TG00(# $ # 2 +M P %%P)" 0 ! !< 'P, $A<"0@( 0 7 "P# "8I 0(% $ +M# V P <)X$" P ! P 0 , $B>! @0 0 , $H# #8O0@(! +M $ #@!3 P 5*$$" P ! P 70, !R?! @, 0 , &<# #(G at 0( +M# $ # !Q P M)\$" P ! P >P, %R?! @, 0 , (4# !( +MH00(% $ # "/ P * $" P ! P F0, .R?! @, 0 , *,# +M !*8$" P +M " P E 0 '"F! @( @ , )\$ !PI 0(% $ # "I! 9*8$ +M" P " P M 0 /"E! AR @ , +\$ "$I 0(% $ # #)! +M>*4$"'8 " P U 0 2E! AR @ , -\$ X7 D(" $ %P#L +M! 0%P)" @ ! !< ^00 /BD! @+ @ , 0% #@I 0(& ( +M# /!0 H*0$" @ ! P &04 -"D! @4 0 , ",% #8I 0(" +M ( # M!0 $ /'_0@( '"%"0@$ 0 8 #D% +M 0 \?]" @ =(4)" 0 ! !@ 104 ! #Q_T(" !X +MA0D(! $ & !1!0 $ /'_704 ! #Q_VD% +M 0 \?]I!0 $ /'_:04 ! #Q +M_VD% 0 \?]I!0 $ /'_:04 +M! #Q_VD% 0 \?]I!0 $ /'_:04 +M ! #Q_W4% !4O@@(&@ $ #@!I!0 $ /'_:04 +M ! #Q_T(" !\A0D(! $ & !I!0 $ /'_:04 +M ! #Q_VD% 0 \?]^!0 W*L$" P ! P +MB 4 (2K! @4 0 , )(% "0JP0(/P ( # "=!0 A*L$" L " +M P J 4 (BL! @4 0 , +(% !$K 0(" $ # "\!0 G*P$"%T +M " P QP4 (BL! @3 @ , -(% !@K00(% $ # # @ , &4' "" R+\$" P +M ! P Z @ S ! @, 0 , /(( !$P 0(" $ # #\" ;, $ +M" @ ! P !@D (C ! @( 0 , ! ) #,P 0(% $ # :"0 +MS, $" @ " P ) D .C ! @4 0 , "X) #XP 0(# ( # Y +M"0 Z, $" X " P 1 D !#!! @, 0 , $X) "(P00(% $ +M# !8"0 E,$$" @ " P 8PD (C!! @* @ , &X) "HP00(# +M $ # !X"0 Y,$$"!0 ! P @@D /#!! @( @ , (T) #DP00( +M"@ ( # "8"0 !,($" P ! P H at D $#"! @4 0 , *P) ! +MP at 0($@ ( # "V"0 8,($" P ! P P D *S"! @, 0 , ,H) +M #HP at 0(% $ # #4"0 ],($" @ " P WPD .C"! @* @ , +M .H) (PP0(# $ # #T"0 1,,$"!0 ! P _ at D *##! A8 +M @ , D* !$PP0(60 ( # 4"@ !,0$" P ! P '@H (S$! @4 +M 0 , "@* #DQ 0(%0 ( # S"@ C,0$"%@ " P /@H !#% +M! @4 0 , $@* LQ00(C ( # !3"@ $,4$"!P " P 7 at H +M ,3%! @, 0 , &@* Q at 0(# $ # !R"@ 1,8$"!0 ! P +M? H $3&! @( @ , (8* !8Q at 0(# $ # "0"@ Y,8$" P ! +M P F at H &3'! @( 0 , *0* "8QP0(" $ # "N"@ U,<$"!0 +M ! P N H -3'! @2 @ , ,(* #TQP0(# $ # #,"@ 9,@$ +M" P ! P U at H (3(! @4 0 , . * "$R 0(0@ ( # #J"@ +MW,@$"!0 ! P ] H -S(! @8 @ , /X* R00(# $ # ( +M"P @,D$"!0 ! P $@L )3)! @V @ , !T+ " R00(% ( +M# H"P X,D$"!0 ! P , at L .S)! @, @ , #T+ #@R00("@ +M ( # !("P !,H$" P ! P 4 at L $#*! @4 0 , %P+ !,R at 0( +M" ( # !G"P 0,H$" H " P <@L &#*! @, 0 , 'P+ "0 +MR at 0(" $ # "&"P Z,H$" @ ! P D L "C+! @, 0 , )H+ +M !LRP0(% $ # "D"P @,L$"#8 " P KPL &S+! @4 @ , +M +H+ # RP0(" $ # #$"P _,L$"!0 ! P S at L /S+! @( +M @ , - at + 8S 0(% $ # #B"P ,,P$" D " P [0L !C,! @8 +M @ , /@+ !$S 0(" $ # "# E,P$"!0 ! P # P *C, +M! @V @ , !<, "4S 0(% ( # B# [,P$" P ! P + P +M ##-! @, 0 , #8, # S00(# $ # ! # V,T$" P ! P +M2 at P *C.! @4 0 , %0, "TS at 0(% ( # !?# J,X$" P " +M P :@P .#.! @8 0 , '0, #@S at 0(#@ ( # !^# J,\$"! +M ! P B P /C.! @( 0 , )(, !LSP0(& $ # "<# C,\$ +M" P " P IPP 'S/! @/ @ , +(, !LSP0(#P ( # "]# +MW,\$" @ ! P QPP .S/! @( 0 , -$, DT 0(" $ # #; +M# 3- $" P ! P Y0P ,#0! @, 0 , .\, #DT 0(# $ +M# #Y# _- $" P ! P PT !31! @, 0 , T- !XT00(# +M $ # 7#0 "-($" @ ! P (0T "32! @( 0 , "L- !4T at 0( +M" $ # U#0 >-($" P ! P /PT ,32! @, 0 , $D- #D +MT at 0(# $ # !3#0 _-($" P ! P 70T !S3! @4 0 , &<- +M HTP0(" ( # !R#0 '-,$" P " P ?0T $33! @4 0 , +M (<- !-0$" P ! P ^0T +M ,C4! @, 0 , ,. #@U 0(# $ # -#@ -4$"!0 ! P +M%PX S5! @/ @ , "(. U00(# ( # M#@ U, (" P ! +M X -PX ##5! @4 0 , $$. !TU00("@ ( # !,#@ ,-4$"$$ +M " P 5PX .# " @, 0 . #P& 0 \?\\!@ +M $ /'_/ 8 ! #Q_SP& 0 \?]A#@ +M#-8$" @ ! P / 8 ! #Q_SP& 0 \?]K +M#@ 9-8$" @ ! P / 8 ! #Q_W4. !TP@@(! $ +M#@ \!@ $ /'_/ 8 ! #Q_SP& +M 0 \?\\!@ $ /'_?@X )#7! @, 0 , (@. #4UP0( +M# $ # "2#@ P-<$" @ ! P / 8 ! #Q_YP. !H +MV 0(" $ # "F#@ ,-@$" @ ! P / 8 ! #Q_[ . +M "@V 0(" $ # \!@ $ /'_/ 8 ! #Q +M_[H. !\V00(" $ # \!@ $ /'_Q X %3:! @( +M 0 , ,X. #TV00(" $ # \!@ $ /'_V X ,S:! @( +M 0 , .(. "(V at 0(" $ # \!@ $ /'_/ 8 +M ! #Q_^P. 8VP0(" $ # \!@ $ /'_/ 8 +M ! #Q_SP& 0 \?_V#@ <-L$" @ ! P +M/ 8 ! #Q_P / (W 0(" $ # *#P R-L$" @ ! +M P / 8 ! #Q_Q0/ \W 0(" $ # \!@ +M $ /'_'@\ &S&" @* 0 . #P& 0 \?\\!@ +M $ /'_)P\ #=! @( 0 , #P& 0 \?\Q#P +MN-T$" @ ! P .P\ &3=! @( 0 , #P& 0 \?]% +M#P 7,<("" ! X / 8 ! #Q_TX/ !4W at 0(" $ +M# \!@ $ /'_6 \ /C>! @( 0 , &(/ "XW at 0(" +M $ # \!@ $ /'_/ 8 ! #Q_VP/ +M 0 \?]L#P $ /'_F at H /3@! @0 0 , %X* H +MX00(# $ # !V#P \-\$" P ! P @ \ %#@! @, 0 , (H/ +M ",X 0(# $ # !L#P $ /'_E \ &C(" @) 0 . +M &P/ 0 \?^=#P 5.($" P ! P IP\ !SB! @, +M 0 , &P/ 0 \?^V" .4$" P ! P L0\ /SH! @0 +M 0 , +L/ #$0 1.T$" P +M " P Z1$ #M! A$ @ , /01 !<[00(# $ # #^$0 E.T$ +M" P ! P "!( +CM! @, 0 , !(2 #<[00(# $ # <$@ +M..X$" @ ! P )A( (#N! @, 0 , # 2 #4[@0(# $ # !L +M#P $ /'_.A( /CO! @, 0 , $02 "\[P0(" $ +M# !L#P $ /'_3A( +#P! @4 0 , %@2 !,\ 0(# +M $ # !B$@ ]/ $"%$ " P ;1( +#P! A! @ , &P/ +M 0 \?]X$@ P,@(" D ! X ; \ ! #Q_X$2 #( +M\P0(& $ # "+$@ ^/$$" 4 " P E1( CR! @( 0 , )\2 +M !$\@0(" $ # "I$@ J/($" @ ! P LQ( ,#R! @, 0 , +M +T2 #\\@0(" $ # #'$@ $/,$" @ ! P T1( ##S! @( +M 0 , -L2 "8\P0(" $ # !L#P $ /'_Y1( +M ! #Q__ 2 # ]@0($ $ # #Z$@ _/8$"!0 ! P !!, +CT +M! @( 0 , X3 8]00(" $ # 8$P -/4$" @ ! P (A, +M %#U! @( 0 , "P3 "D]00(" $ # V$P ,/8$""0 ! P +M0!, %#V! @5 @ , $H3 !(]@0(" ( # !5$P 0/8$" @ " +M P 8!, #CV! @( @ , &L3 P]@0(" ( # !V$P =/8$" P +M ! P @!, #CW! @Z @ , (L3 #\]@0(.@ ( # #E$@ +M $ /'_EA, ,CZ! @( 0 , * 3 !D^P0($ $ # "J$P +M#/P$"!@ ! P M!, %0 !0@, 0 , +X3 !L^ 0(" $ # #( +M$P O/@$" @ ! P TA, /#X! @, 0 , -P3 !L^00(" $ +M# #F$P K/D$" @ ! P \!, /SY! @( 0 , /H3 !<^@0(" +M $ # $% ?/H$" @ ! P #A0 .3Z! @( 0 , !@4 H^P0( +M# $ # B% C/L$" ( " P +!0 )S[! @, 0 , #84 # +M^P0(# $ # ! % 1/P$" ( " P 2A0 &#\! @8 0 , %04 +M "(_ 0(" $ # !>% Z/P$" @ ! P :!0 "S]! @, 0 , +M '(4 !T_00(# $ # !\% F/T$"!@ ! P AA0 .S]! @: +M @ , )$4 #0_00(&@ ( # "<% F/T$"#< " P IQ0 !3^! @, +M 0 , +$4 !H_ at 0(# $ # "[% H/X$""0 ! P Q10 .#^ +M! @M @ , ,\4 #4_ at 0(# ( # #:% H/X$"#( " P Y10 +M !S_! @, 0 , .\4 !0_P0($ $ # #Y% C/\$" @ ! P +M Q4 )S_! @( 0 , T5 "X_P0(% $ # 7%0 %"$< " +M P (A4 +C_! A' @ , .42 0 \?\M%0 #,D(" T +M ! X Y1( ! #Q_^42 0 \?_E$@ +M $ /'_-A4 ! "!0@, 0 , $ 5 "P 04(& $ # !*%0 +MS $%"!0 " P 514 +@!!0 at 4 @ , & 5 "P 04(" ( # !K +M%0 [ $%" P ! P Y1( ! #Q_W45 TR0@("0 $ +M#@!^%0 $ /'_?A4 ! #Q_WX5 +M 0 \?]^%0 $ /'_?A4 ! #Q_WX5 +M 0 \?^*%0 , ,%" @ ! P E!4 .P"!0@( 0 , 'X5 +M 0 \?]^%0 $ /'_?A4 ! #Q_WX5 +M 0 \?]" @ B(4)" 0 ! !@ ?A4 ! #Q +M_YX5 8! 4(" $ # !^%0 $ /'_?A4 +M! #Q_WX5 0 \?]^%0 $ /'_?A4 +M ! #Q_WX5 0 \?]^%0 $ /'_?A4 +M ! #Q_WX5 0 \?^H%0 E 0%" @ ! P ?A4 +M ! #Q_WX5 0 \?^R%0 & 4%" @ ! P +MO!4 -0$!0@( 0 , 'X5 0 \?]^%0 $ +M /'_?A4 ! #Q_WX5 0 \?]^%0 +M $ /'_?A4 ! #Q_WX5 0 \?]^%0 +M $ /'_?A4 ! #Q_WX5 0 \?]^%0 +M $ /'_QA4 ! #Q_\85 0 \?_& +M%0 $ /'_QA4 ! #Q_](5 0 +M\?_>%0 O 8%"!0 ! P Z!4 "P&!0@( 0 , /(5 !P!@4(" +M $ # #\%0 T 8%"&$ " P !Q8 +P&!0 at 2 @ , -(5 +M 0 \?\2%@ N <%"!0 ! P '!8 '0'!0@( 0 , "86 #, +M!P4(2@ ( # Q%@ N <%"!, " P TA4 ! #Q_SP6 +M !<" 4(% $ # !&%@ : @%"!0 " P 418 %P(!0@* @ , +M -(5 0 \?]<%@ J @%"!0 ! P 9A8 +0(!0 at . +M @ , '$6 "H" 4("0 ( # #2%0 $ /'_0@( (R%"0@$ +M 0 8 -(5 0 \?]\%@ / D%"!0 ! P AA8 $0) +M!0 at Y @ , )$6 \"04(" ( # #2%0 $ /'_G!8 +M /P)!0 at 4 0 , *86 "X"04(" $ # "P%@ $ H%"$H " P +MNQ8 /P)!0 at 3 @ , ,86 0 \?_&%@ $ +M /'_QA8 ! #Q_](6 "\"@4(" $ # #&%@ +M $ /'_W!8 %P,!0 at 4 0 , .86 #X"@4(" $ # #P%@ . L% +M"!0 ! P ^A8 &@+!0@> @ , 47 X"P4(+@ ( # 0%P +MD L%" @ ! P &A< ,0+!0@( 0 , "07 $# 4(% $ # N +M%P ) P%""0 " P .1< 0,!0@> @ , $07 !P# 4('0 ( +M# !/%P 7 P%"!0 " P QA8 ! #Q_UH7 (#P4(% +M $ # !D%P Q P%" @ ! P ;A< "0-!0@( 0 , '@7 !$#04( +M" $ # ""%P G T%"!0 ! P C!< /P-!0 at 5 @ , )<7 "< +M#04(7P ( # "B%P ' X%" @ ! P K!< &@.!0@( 0 , +87 +M "\#@4(% $ # # %P T X%""0 " P RQ< +P.!0 at 2 @ , +M -87 <#P4(( ( # #A%P " \%"!0 " P QA8 +M! #Q_^P7 !<#P4(" $ # #&%@ $ /'_QA8 +M ! #Q_T(" "0A0D(! $ & #V%P $ /'_ A@ /@/ +M!0@( 0 , L8 0 \?\+& $ /'_%Q@ +M ! #Q_T(" "4A0D(! $ & C& $ /'_ +M(Q@ ! #Q_R,8 0 \?\O& 2!$%" @ ! +M P (Q@ ! #Q_R,8 0 \?\C& +M $ /'_.1@ * 1!0@( 0 , ",8 0 \?]" @ F(4) +M" 0 ! !@ 0Q@ ! #Q_T(" "!D 0;!0 at . @ , ((9 "8&@4(; ( # "- +M&0 '!L%" @ ! P EQD # ;!0@( 0 , *$9 !$&P4(" $ +M# "K&0 R!L%"!0 ! P M1D "P @ , .(: #$(@4(% $ +M# #L&@ Q"(%"!( " P ]AH .PB!0 at 4 0 , ; #L(@4(&0 +M ( # *&P '",%"!0 ! P %!L !PC!0@> @ , !X; !((P4( +M# $ # H&P ?",%" P ! P ,AL *PC!0@, 0 , #P; #< +M(P4(# $ # !&&P #"0%" P ! P 4!L ! #Q_T(" +M "\A0D(! $ & !<&P $ /'_:!L "@F!0@( 0 , +M '(; !X)04(" $ # !\&P B"4%" @ ! P AAL *0E!0@( +M 0 , %P; 0 \?]" @ P(4)" 0 ! !@ 7!L +M ! #Q_Y ; !@)P4(% $ # ":&P U"8%" @ ! P I!L !0G +M!0@( 0 , *X; T)P4(" $ # "X&P ;"<%"!4 " P PQL +M & G!0 at + @ , ,X; 0 \?]" @ Q(4)" 0 ! !@ +MV1L ! #Q_T(" #(A0D(! $ & #D&P $ +M /'_0@( ,R%"0@$ 0 8 / ; 0 \?_P&P +M $ /'__!L "@I!0@( 0 , / ; 0 \?_P&P +M $ /'_\!L ! #Q_P8< 4*@4(" $ # #P&P +M $ /'_\!L ! #Q_Q < #8*@4(" $ # : +M' $ /'_0@( -"%"0@$ 0 8 "4< 0 +M\?]" @ U(4)" 0 ! !@ ,1P ! #Q_T(" #8A0D(! +M $ & \' $ /'_0@( -R%"0@$ 0 8 $<< +M 0 \?]" @ X(4)" 0 ! !@ 4QP ! #Q_T(" #D +MA0D(! $ & !?' $ /'_0@( .B%"0@$ 0 8 &H< +M 0 \?]" @ [(4)" 0 ! !@ =AP ! #Q +M_T(" #PA0D(! $ & " ' $ /'_0@( /2%"0@$ +M 0 8 ( < 0 \?^+' $ /'_0@( /B%"0@$ +M 0 8 )<< 0 \?]" @ _(4)" 0 ! !@ HAP +M ! #Q_T(" A at D(! $ & "M' $ /'_0@( +M 2&"0@$ 0 8 +D< 0 \?]" @ "(8)" 0 ! !@ +MQ!P ! #Q_T(" ,A at D(! $ & !1!0 $ +M /'_0@( !"&"0@$ 0 8 %$% 0 \?]1!0 +M $ /'_T!P ! #Q_T(" 4A at D(! $ & !=!0 +M $ /'_0@( !B&"0@$ 0 8 -L< 0 \?]" @ +M'(8)" 0 ! !@ YQP ! #Q_T(" @A at D(! $ & #S +M' $ /'_0@( "2&"0@$ 0 8 /\< 0 +M\?]" @ *(8)" 0 ! !@ "QT ! #Q_Q<= !\- 4(" +M $ # A'0 '#0%" @ ! P "QT ! #Q_RL= #X0 4( +M& $ # U'0 %" 4 " P /QT "@U!0@( 0 , $D= !( +M0 4(" $ # !3'0 J$ %" @ ! P 71T ,1 !0@( 0 , L= +M 0 \?]G'0 O$$%" @ ! P <1T &1!!0@( 0 , +M 'L= "8004(% $ # "%'0 I$$%" \ " P D!T )A!!0@) +M @ , L= 0 \?]" @ +(8)" 0 ! !@ "QT +M ! #Q_YL= 0 \?]" @ ,(8)" 0 ! !@ FQT +M ! #Q_Z<= !H0P4(# $ # "Q'0 D$0%" @ ! P NQT +M +1#!0@( 0 , ,4= !01 4(" $ # ";'0 $ /'_ +MSQT #A&!0@( 0 , -D= #@1 4(" $ # #C'0 4$4%" P ! +M P [1T !1%!0 at 4 0 , /<= L104(%0 ( # "'@ %$4%"!4 +M " P #1X (1%!0@( 0 , !<> "4104(" $ # A'@ X$4% +M" @ ! P *QX ! #Q_T(" TA at D(! $ & W'@ +M $ /'_0@( #B&"0@$ 0 8 $,> 0 \?]" +M @ /(8)" 0 ! !@ 3QX ! #Q_T(" ! A at D(! $ +M& !;'@ $ /'_0@( $2&"0@$ 0 8 %L> +M 0 \?]G'@ )$H%" @ ! P <1X "A)!0@( 0 , 'L> !T204( +M" $ # "%'@ O$D%" @ ! P CQX /Q)!0@( 0 , )D> +M 0 \?]" @ 2(8)" 0 ! !@ I1X ! #Q_T(" +M !,A at D(! $ & "Q'@ $ /'_0@( %"&"0@$ 0 8 +M +T> 0 \?]" @ 5(8)" 0 ! !@ R1X +M! #Q_T(" !8A at D(! $ & #5'@ $ /'_0@( %R&"0@$ +M 0 8 -4> 0 \?_5'@ $ /'_X1X #A- +M!0@( 0 , .L> <304(" $ # #5'@ $ /'_]1X +M &Q-!0@( 0 , /\> 0 \?]" @ 8(8)" 0 ! !@ +M:04 ! #Q_VD% 0 \?]I!0 $ +M /'_"Q\ +1.!0@, 0 , !4? !\3 at 4(" $ # !I!0 +M $ /'_:04 ! #Q_Q\? 0 \?]" @ 9(8) +M" 0 ! !@ *1\ ! #Q_T(" !HA at D(! $ & D!@ +M $ /'_-1\ (Q0!0@, 0 , #P& 0 \?\_ +M'P C%8%" P ! P 21\ Q1!0@( 0 , %,? 44 at 4(" $ +M# !='P *%(%" @ ! P 9Q\ &Q2!0@, 0 , '$? #<4 at 4(" +M $ # !['P (%,%" P ! P A1\ *!3!0@, 0 , (\? #\4P4( +M" $ # "9'P 0%0%" P ! P HQ\ +Q4!0@, 0 , *T? #\ +M5 4(# $ # "W'P H%4%" P ! P P1\ .!5!0@, 0 , ,L? +M <5 at 4(" $ # \!@ $ /'_U1\ &Q7!0@( 0 , +M -\? T5P4(" $ # \!@ $ /'_Z1\ *17!0@( +M 0 , #P& 0 \?_S'P ^,H(""0 ! X / 8 +M ! #Q__P? !P6 4(" $ # \!@ $ /'_!B &!9 +M!0@( 0 , ! @ $604(" $ # :( /%D%" @ ! P / 8 +M ! #Q_SP& 0 \?\\!@ $ /'_ +M)" #C," @B 0 . #P& 0 \?\\!@ $ +M /'_+2 1:!0@, 0 , #P& 0 \?\W( ,%L%" @ +M ! P 02 #!>!0 at 0 0 , $L@ #D7 at 4(# $ # !5( V%H% +M" @ ! P 7R Q;!0@( 0 , &D@ !D6P4(# $ # !S( +MK%L%" P ! P ?2 -Q;!0@( 0 , (<@ !L7 4(" $ # "1 +M( B%P%" @ ! P FR *1!0@= @ , .(@ #,704( +M- ( # #M( ;%X%" P ! P / 8 ! #Q_SP& +M 0 \?].$@ W%\%" @ ! P ]R !1@!0@( 0 , $A +M !88 4(# $ # +(0 ^& %" P ! P %2$ ,Q?!0@( 0 , +M !\A "48 4(% $ # I(0 H& %"!X " P -"$ )1@!0 at + +M @ , #\A #(8 4(" $ # \!@ $ /'_22$ (QA!0@( +M 0 , %,A !,804(" $ # \!@ $ /'_/ 8 +M ! #Q_UTA TS@@("0 $ #@ \!@ $ /'_/ 8 +M ! #Q_V8A #48 at 4(# $ # \!@ $ /'_ +M<"$ '1C!0@( 0 , 'HA "H8P4(# $ # "$(0 ,&L%"! ! +M P CB$ %!C!0@( 0 , )@A !@8P4(" $ # "B(0 [&,%"!0 +M ! P K"$ #!D!0A* @ , +"( (!H!0@( 0 , ((B +M #D: 4(" $ # ",(@ .&D%" @ ! P EB( *!I!0@( 0 , +M * B #L:04(# $ # "J(@ #&L%" P ! P / 8 +M! #Q_[0B #$:P4(" $ # "^(@ D&L%" @ ! P / 8 +M ! #Q_SP& 0 \?_((@ J,\(""0 ! X / 8 +M ! #Q_]$B #4; 4(" $ # #;(@ A&P%" @ ! P / 8 +M ! #Q_^4B #8;@4(# $ # #O(@ /&T%"!0 ! P +M^2( (AM!0@( @ , 0C \;04(20 ( # /(P G&T%" P ! +M P &2, &!N!0@, 0 , #P& 0 \?^V$0 6&\%" @ +M ! P )A( (QO!0@, 0 , ",C !L<@4(# $ # M(P O&\% +M" @ ! P -R, /!O!0@( 0 , $$C T< 4(" $ # !+(P +M2' %" @ ! P 52, %QP!0@( 0 , %\C "0< 4(" $ # !I +M(P U' %" @ ! P 4(" $ # "[) +M,'@%" P ! P Q20 &AX!0 at 4 0 , ,\D "4> 4((@ ( # #: +M) :'@%""P " P Y20 ,!X!0@( 0 , .\D #4> 4(# $ +M# #Y) 2'D%" P ! P R4 /1Y!0@, 0 , TE 4>@4(# +M $ # 7)0 4'H%" 4 " P (24 %A[!0 at 8 0 , "LE !L>@4( +M% $ # U)0 ;'H%"!( " P /R4 (QZ!0@, 0 , $DE 0 +M>P4(" $ # !3)0 O'L%" @ ! P 724 1\!0@% @ , &R4 "!\!0 at 2 @ , +M (4E ! ? 4(# $ # "/)0 U'P%"!0 ! P F24 -1\!0 at 2 +M @ , *,E #P? 4(" $ # "M)0 I'T%" @ ! P MR4 /1]!0@( +M 0 , ,$E !$?@4(" $ # #+)0 E'X%" @ ! P U24 .1^ +M!0@( 0 , -\E D?P4(% $ # #I)0 9'\%"!L " P ]"4 +M "1_!0@] @ , /\E "(?P4(" $ # ))@ V'\%" @ ! P +M$R8 "B !0@( 0 , !TF !<@ 4(" $ # G)@ K( %" @ ! +M P ,28 /R !0@( 0 , #LF \@04(% $ # !%)@ 7($%""0 +M " P 4"8 #R!!0@> @ , %LF "4 at 04(% $ # !E)@ J($% +M"!T " P <"8 )2!!0 at 4 @ , 'LF #<@04(% $ # "%)@ +MW($%"$8 " P CR8 #""!0@, 0 , )DF "4@@4(# $ # "C +M)@ #(,%" P ! P K28 (2#!0 at 4 0 , + @ , )LH PC04(% +M $ # "E* 3(T%"" " P L"@ #"-!0@: @ , +LH " C04( +M% $ # #%* @(T%"$ " P SR@ ,R-!0@, 0 , -DH P +MC at 4(# $ # #C* >(X%" P ! P [2@ ,".!0@( 0 , /!0@( 0 , %+ J* %"%8 " P Z2P "2A!0@( +M 0 , /,L " H04(" $ # #]+ Z*$%"!0 ! P !RT 2B +M!0 at A @ , !(M #HH04(&P ( # =+0 /*(%"!0 ! P )RT +M %"B!0 at 8 @ , #(M \H at 4($@ ( # ]+0 <*(%" @ ! P +M1RT )2B!0@( 0 , %$M #,H at 4(" $ # !;+0 !*,%" @ ! +M P 92T #RC!0@( 0 , &\M !0J04($ $ # !Y+0 V*,%"!0 +M ! P @RT &2D!0@> @ , (XM #8HP4(BP ( # "9+0 C*0% +M" @ ! P HRT ,2D!0@( 0 , *TM !8I04(" $ # "W+0 +MD*4%" @ ! P P2T #"F!0 at 4 0 , ,LM !0I at 4() ( # #6 +M+0 ,*8%"!X " P X2T (BF!0 at 4 0 , .LM " @ , #\O #TJ at 4(# $ # !)+P 4*L%"!0 +M ! P 4R\ %"K!0 at K @ , %TO "0JP4(% $ # !G+P D*L% +M"!@ " P <2\ +2K!0@, 0 , 'LO #DJP4(# $ # "%+P +M7*P%" P ! P CR\ *"N!0 at 2 @ , )HO "XK 4(Y@$ ( # \ +M!@ $ /'_I2\ /"N!0@( 0 , *\O #4K at 4(" $ +M# \!@ $ /'_N2\ /S2" @& 0 . #P& +M 0 \?\\!@ $ /'_/ 8 ! #Q_\(O #DKP4( +M" $ # \!@ $ /'_S"\ !"P!0@( 0 , #P& +M 0 \?\\!@ $ /'_/ 8 ! #Q_]8O +M #8L 4(# $ # #@+P E+ %" @ ! P / 8 ! #Q +M_SP& 0 \?\\!@ $ /'_ZB\ RW!0 at 4 +M 0 , /0O \L04(!0 ( # #^+P [+(%"!@ ! P "# $RQ!0@( +M 0 , !(P !HL04(" $ # <, A+$%" @ ! P )C *RQ +M!0 at 4 0 , # P $L at 4(/ ( # [, K+$%"%4 " P 1C +M $RR!0@, 0 , % P !DL at 4(# $ # !:, F+(%"!0 ! P +M9# +BR!0@< @ , &\P "8L at 4(( ( # !Z, (+,%" @ ! +M P A# %BS!0@( 0 , (XP "4LP4(# $ # "8, S+,%"!0 +M ! P HC /2S!0@< @ , *TP #,LP4()@ ( # "X, '+0% +M" P ! P PC 'BT!0@, 0 , ,PP "XM 4(% $ # #6, +MX+0%""( " P X3 +BT!0 at G @ , .PP 0M04(# $ # #V +M, *+4%" P ! P #$ %RU!0 at 4 0 , HQ !\M04(' ( +M# 5,0 7+4%"" " P (#$ *2U!0@, 0 , "HQ "\M04(# +M $ # T,0 Z+4%"!0 ! P /C$ 2V!0@< @ , $DQ #HM04( +M&0 ( # !4,0 ++8%" P ! P 7C$ $2V!0@, 0 , &@Q !\ +MM at 4(% $ # !R,0 I+8%"!P " P ?3$ 'RV!0 at F @ , (@Q +M #,M at 4(# $ # "2,0 Y+8%" P ! P G#$ ""W!0@< @ , +M *,@ C+P%" @ ! P / 8 ! #Q_SP& +M 0 \?]H,@ (-D(" 0 ! X / 8 ! #Q_SP& +M 0 \?\\!@ $ /'_/ 8 ! #Q_SP& +M 0 \?]Q,@ -+X%" @ ! P / 8 ! #Q +M_WLR "HQ 4(# $ # "%,@ M+X%" @ ! P CS( /R^!0@, +M 0 , )DR TOP4(% $ # "C,@ -+\%"!D " P K3( &2_!0 at 4 +M 0 , +,T%"!0 +M ! P C#0 )C-!0 at W @ , )-@% +M" P ! P 0#8 )C8!0@, 0 , $HV #$V 4(# $ # !4-@ +M4-D%""0 ! P 7C8 %#9!0 at _ @ , &DV "0V04((@ ( # !S +M-@ P-D%" P ! P ?38 S:!0@, 0 , (!0 at + @ , , at W !DW at 4(# $ # #2-P F-X%" P +M ! P ; \ ! #Q_VP/ 0 \?]L#P +M $ /'_W#< 3=" @' 0 . &P/ 0 \?]L#P +M $ /'_Y3< !#@!0@( 0 , .\W "XX at 4(# $ # #Y +M-P X-\%""0 ! P S@ /3?!0 at 4 @ , TX #@WP4(% ( +M# 8. 0. %" @ ! P (C@ *S@!0@( 0 , "PX #(X 4(" +M $ # V. %.$%" ( " P 0#@ ##A!0 at 8 0 , $HX !CH )CP!0@( 0 , (0Z #0\ 4(" $ # "..@ /$% +M" @ ! P F#H !SQ!0 at 4 0 , *(Z !@\04(!0 ( # "M.@ +M'/$%"$0 " P ; \ ! #Q_[@Z #H\@4(" $ # #" +M.@ 3/(%"!0 ! P S#H (#R!0 at R @ , -3P .#[!0 at D 0 , (,\ < +M_ 4(.0 ( # "-/ X/L%"#L " P F#P &3\!0@, 0 , &P/ +M 0 \?^B/ S/X%"!@ ! P K#P .#\!0@% @ , +M +8\ #P_ 4(" $ # # / +/T%" @ ! P RCP )#]!0@( +M 0 , -0\ "H_04(# $ # #>/ Y/T%" @ ! P Z#P /C]!0@( +M 0 , /(\ @_ at 4(" $ # #\/ -/X%" @ ! P !CT )S^ +M!0@( 0 , &P/ 0 \?_E$@ $ /'_$#T +M *3=" @4 0 . .42 0 \?\9/0 N-T(" @ ! X +MY1( ! #Q_T(" !XA at D(! $ & #E$@ $ +M /'_(CT +P"!@@, 0 , "P] "P 8(" $ # V/0 & $&" @ +M ! P 0#T #@!!@@( 0 , $H] "( 08(" $ # !4/0 T $& +M"!0 ! P 7CT . !!@A- @ , &D] #0 08(#P ( # !T/0 +M. (&" @ ! P ?CT %@"!@@( 0 , (@] "0 @8(& $ # "2 +M/0 G (&"!$ " P G#T ) "!@@+ @ , .42 0 +M\?_E$@ $ /'_IST %@#!@@, 0 , +$] #,!08(# +M $ # "[/0 F ,&"! ! P Q3T -@#!@@( 0 , ,\] #T P8( +M$ $ # #9/0 . 0&" P ! P XST %P$!@@, 0 , .T] #P +M! 8(% $ # #W/0 0 4&"!( " P CX / $!@A0 @ , T^ +M !D!08($ $ # 7/@ J 4&" P ! P Y1( ! #Q +M_R$^ #8W0@(%P $ #@#E$@ $ /'_*CX #0'!@@, +M 0 , #0^ #@" 8(# $ # ^/@ = <&"! ! P 2#X +0'!@@( +M 0 , %(^ #,!P8(# $ # ! @&"! ! P ACX +M +P(!@@, 0 , .42 0 \?^0/@ [ D&"!0 ! P +MFCX *@)!@@, 0 , *0^ "\"08(# $ # "N/@ ^ D&"!( " +M P N3X .P)!@@+ @ , .42 0 \?]^%0 +M $ /'_?A4 ! #Q_WX5 0 \?]^%0 +M $ /'_?A4 ! #Q_WX5 0 \?]^%0 +M $ /'_?A4 ! #Q_WX5 0 \?]^ +M%0 $ /'_?A4 ! #Q_WX5 0 +M\?]^%0 $ /'_?A4 ! #Q_WX5 +M 0 \?]^%0 $ /'_?A4 ! #Q_WX5 +M 0 \?]^%0 $ /'_?A4 ! #Q_WX5 +M 0 \?]^%0 $ /'_?A4 ! #Q_WX5 +M 0 \?]^%0 $ /'_?A4 ! #Q +M_WX5 0 \?]^%0 $ /'_Q#X ,!@@( +M 0 , ,X^ "\"P8(" $ # !^%0 $ /'_?A4 +M ! #Q_WX5 0 \?]^%0 $ /'_?A4 +M ! #Q_WX5 0 \?]^%0 $ /'_?A4 +M ! #Q_WX5 0 \?]^%0 $ /'_ +M?A4 ! #Q_WX5 0 \?]^%0 $ +M /'_?A4 ! #Q_WX5 0 \?]^%0 +M $ /'_?A4 ! #Q_WX5 0 \?_&%0 +M $ /'_0@( 'R&"0@$ 0 8 -(5 0 \?_2%0 +M $ /'_QA8 ! #Q_]@^ "8$ 8(% $ # #B +M/@ 4 X&" @ ! P [#X + .!@@( 0 , /8^ #0#@8(" $ +M# /P * \&"!0 ! P "C\ (P/!@@5 @ , !4_ H#P8(80 +M ( # @/P K \&" @ ! P *C\ /@/!@@( 0 , #0_ !,$ 8( +M% $ # ^/P 8! &""0 " P 23\ $P0!@@2 @ , %0_ "L +M$ 8(( ( # !?/P F! &"!0 " P QA8 ! #Q_VH_ +M !,$P8(% $ # !T/P !$&" @ ! P ?C\ $@1!@@( 0 , +M (@_ !P$08(" $ # "2/P R!$&"!0 ! P G#\ .P1!@@5 +M @ , *<_ #($08((0 ( # "R/P #!(&" @ ! P O#\ % 2!@@( +M 0 , ,8_ "<$@8(" $ # #0/P !,&"!0 ! P VC\ !03 +M!@@D @ , .4_ $P8($@ ( # #P/P ?!,&"" " P ^S\ +M $P3!@@N @ , ,86 0 \?_&%@ $ /'_ +MQA8 ! #Q_\86 0 \?\&0 1!8&"!0 ! +M P $$ #@4!@@( 0 , !I "0% 8(% $ # D0 Y!0&"!4 +M " P +T ) 4!@A2 @ , #I $%08(" $ # !$0 2!4& +M" @ ! P 3D )05!@@( 0 , %A #X%08(% $ # !B0 +M#!8&""0 " P ;4 /@5!@@2 @ , 'A !T%@8(( ( # "# +M0 1!8&""X " P QA8 ! #Q_XY #4%@8(" $ +M# #&%@ $ /'_F$ (P9!@@4 0 , *) T%P8(" +M $ # "L0 E!<&" @ ! P MD +07!@@( 0 , ,! ,& 8( +M% $ # #*0 @!@&"!4 " P U4 P8!@AS @ , .! "@ +M& 8(" $ # #J0 [!@&" @ ! P ]$ $ 9!@@4 0 , /Y +M !4&08() ( # )00 0!D&"!( " P %$$ * 9!@@@ @ , +M !]! ",&08(% ( # #&%@ $ /'_*D$ . 9!@@( +M 0 , ,86 0 \?\T00 -!H&" @ ! P QA8 +M ! #Q_\86 0 \?_V%P $ /'_0@( ("& +M"0@$ 0 8 L8 0 \?]" @ A(8)" 0 ! !@ (Q@ +M ! #Q_SY! !D' 8(" $ # !(00 L!P&" @ ! P +M4D$ /P!T&" @ ! +M P <$$ ,0=!@@( 0 , 'I! 0'@8(" $ # "$00 ^" &" P +M ! P CD$ )PB!@@0 0 , )A! !(' 8(" $ # "B00 E!P& +M" @ ! P K$$ . +M00 7!X&" @ ! P Z$$ )@>!@@( 0 , /)! "H'@8(" $ +M# #\00 Y!X&" @ ! P !D( /0>!@@( 0 , !!" P'P8(" +M $ # :0@ 3!\&" @ ! P )$( ) ?!@@4 0 , "Y" #T'P8( +M4@ ( # Y0@ D!\&"&0 " P 1$( % @!@@( 0 , $Y" " +M( 8(% $ # !80@ D" &" L " P 8T( ( @!@@. @ , &Y" +M "D( 8(" $ # !X0@ S" &" @ ! P @D( . @!@@( 0 , +M (Q" !,(08(" $ # "60@ 7"$&" @ ! P H$( *0A!@@4 +M 0 , *I" "T(08(2 ( # "U0@ I"$&" T " P P$( ! B!@@4 +M 0 , ,I" P(@8("P ( # #50@ $"(&"!X " P X$( $@B +M!@@, 0 , .I" !T(@8(# $ # C& $ /'_(Q@ +M ! #Q__1" L)08(% $ # #^0@ E",&"!0 ! P +M"$, )0C!@@. @ , !)# "X(P8(% $ # <0P N",&"!X " +M P )D, .PC!@@4 0 , #!# #L(P8(!@ ( # Z0P ""0&"!0 +M ! P 1$, @D!@@. @ , $Y# L) 8(% $ # !80P +"0& +M"!4 " P 8D, %@D!@@4 0 , &Q# !8) 8(!@ ( # !V0P +M;"0&" P ! P @$, + at D!@@4 0 , (I# #T) 8((@ ( # "5 +M0P N"0&"#D " P H$, $@E!@@* @ , *M# L)08(&P ( +M# C& $ /'_(Q@ ! #Q_R,8 +M 0 \?\C& $ /'_MD, &@F!@@( 0 , ,!# #()@8( +M" $ # #*0P P"<&" P ! P U$, #@F!@@( 0 , -Y# !4 +M)@8(" $ # #H0P F"8&" @ ! P \D, +0F!@@( 0 , /Q# +M #X)@8(" $ # &1 ""<&" @ ! P $$0 $0G!@@( 0 , +M !I$ "4)P8(" $ # D1 J"<&" @ ! P (Q@ +M! #Q_RY$ "(* 8(# $ # X1 +"@&" @ ! P 0D0 & H!@@( +M 0 , ",8 0 \?],1 ]"@&" P ! P (Q@ +M ! #Q_U9$ !8*08(% $ # !@1 8"D&" T " P :T0 +M %@I!@@( @ , ",8 0 \?]V1 ^"D&"!0 ! P +M@$0 + at I!@@( 0 , (I$ D*@8(' ( # "51 ^"D&""P " +M P (Q@ ! #Q_R,8 0 \?^@1 L"H&" @ +M ! P (Q@ ! #Q_R,8 0 \?\C& +M $ /'_JD0 !0K!@@( 0 , +1$ "\,P8($ $ # "^1 +M1"L&" @ ! P R$0 '@K!@@( 0 , -)$ "\*P8(" $ # #< +M1 T"L&" @ ! P YD0 .0K!@@( 0 , /!$ 8+ 8(" $ +M# #Z1 7"P&" @ ! P !$4 ' L!@@( 0 , Y% "0+ 8(% +M $ # 810 G"P&" P " P (T4 ) L!@@, @ , "Y% "P+ 8( +M" $ # X10 ["P&"!0 ! P 0D4 /PL!@@% @ , $U% #L +M+ 8(#0 ( # !810 &"T&"!0 ! P 8D4 " M!@@+ @ , &U% +M 8+08(!0 ( # !X10 0"T&"!0 ! P @D4 &0M!@@5 @ , +M (U% ! +08((P ( # "810 D"T&"!0 ! P HD4 +PM!@@+ +M @ , *U% "0+08(*0 ( # "X10 U"T&" P ! P PD4 PN!@@, +M 0 , ,Q% L+ at 8(# $ # #610 2"X&"!0 ! P X$4 $@N +M!@@/ @ , .I% !L+ at 8(% $ # #T10 ;"X&"!@ " P _D4 +M )@N!@@4 0 , A& "8+ at 8(0P ( # 21@ \"X&"!0 ! P +M'$8 / N!@@? @ , "9& <+P8(# $ # P1@ ."\&"!0 ! +M P .D8 #@O!@@/ @ , $1& !<+P8(% $ # !.1@ 7"\&"!@ +M " P 6$8 (@O!@@4 0 , &)& "(+P8('P ( # !L1@ O"\& +M"!0 ! P =D8 +PO!@@? @ , (!& #H+P8(# $ # "*1@ +M!# &"!0 ! P E$8 0P!@@8 @ , )Y& P, 8(% $ # "H +M1@ ,# &"!D " P LD8 & P!@@4 0 , +Q& !@, 8('P ( +M# #&1@ C# &" P ! P T$8 *@P!@@4 0 , -I& "H, 8(& +M ( # #D1@ U# &"!0 ! P [D8 -0P!@@8 @ , /A& ,08( +M% $ # "1P #$&"$D " P #$< & Q!@@4 0 , !9' !@ +M,08('P ( # @1P C#$&" P ! P *D< *@Q!@@4 0 , #1' +M "H,08(#P ( # ^1P S#$&"!0 ! P 2$< ,PQ!@@8 @ , +M %)' #X,08(% $ # !<1P ^#$&"!\ " P 9D< "PR!@@4 +M 0 , '!' L, at 8('P ( # !Z1P 8#(&"!0 ! P A$< -PR!@A: +M @ , (]' !@, at 8(>0 ( # ":1P 1#,&" P ! P I$< &PS +M!@@, 0 , *Y' "(,P8(# $ # C& $ /'_N$< +M &C>" @= 0 . ",8 0 \?_!1P X#0&" P ! P +MRT< (0T!@@( 0 , -5' "X- 8(" $ # C& $ +M /'_(Q@ ! #Q_]]' "@-08(" $ # #I1P 8#4&"!0 +M ! P \T< & U!@@8 @ , /U' ",-08(% $ # '2 C#4& +M" L " P (Q@ ! #Q_Q%( !$- at 8(% $ # ;2 +M3#8&" T " P )D@ $0V!@@( @ , ",8 0 \?\C +M& $ /'_(Q@ ! #Q_S%( 0.08(% $ +M# [2 Q#8&"!0 ! P 14@ ,0V!@@1 @ , $]( #L- at 8(% +M $ # !92 [#8&"!@ " P 8T@ !@W!@@4 0 , &U( 8-P8( +M'@ ( # !W2 1#<&" P ! P @4@ * W!@@4 0 , (M( #D +M-P8(' ( # "62 H#<&"$, " P H4@ !0X!@@4 0 , *M( +M 4. 8(#P ( # "U2 .#@&"!0 ! P OT@ *0X!@A6 @ , +M ,I( X. 8(; ( # #52 $#D&" P " P (Q@ +M! #Q_]]( !4. at 8(# $ # #I2 6#D&" @ ! P \T@ *0Y!@@( +M 0 , /U( #P.08(" $ # C& $ /'_(Q@ +M ! #Q_P=) !(.P8(% $ # 120 4#L&" T " P '$D +M $@[!@@( @ , ",8 0 \?\C& $ /'_ +M(Q@ ! #Q_R=) "8/ 8(" $ # Q20 N#L&" @ ! +M P .TD .P[!@@( 0 , $5) H/ 8(" $ # !/20 7#P&" @ +M ! P (Q@ ! #Q_R,8 0 \?]920 D$ & +M"!0 ! P 8TD (P]!@@( 0 , &U) #,/08(% $ # !W20 +M_#T&"!X " P @DD ,P]!@@N @ , (U) D/@8(" $ # "7 +M20 6#X&" @ ! P H4D )@^!@@4 0 , *M) "X/@8() ( +M# "V20 F#X&"!X " P P4D / ^!@@4 0 , ,M) $/P8('0 +M ( # #620 \#X&"!0 " P X4D "P_!@@( 0 , .M) !$/P8( +M" $ # #U20 ?#\&"!0 ! P _TD + _!@@; @ , I* !\ +M/P8(,@ ( # 52@ U#\&" @ ! P 'TH ! !@@( 0 , "E* +M X0 8(% $ # S2@ 6$ &""0 " P /DH #A !@@> @ , +M $E* "D0 8('0 ( # !42@ D$ &"!0 " P 6Q@ +M! #Q_U]* "(008(" $ # !I2@ '$(&" @ ! P $D&" P ! P <4L )A)!@@, +M 0 , 'M+ #X208(# $ # #P&P $ /'_A4L )!*!@@( +M 0 , / ; 0 \?_P&P $ /'_\!L +M ! #Q_X]+ " 2P8(" $ # #P&P $ /'_\!L +M ! #Q__ ; 0 \?_P&P $ /'_ +MF4L &Q,!@@( 0 , / ; 0 \?^C2P P$P&" @ ! +M P \!L ! #Q_ZU+ !84 8(% $ # "W2P ,$T&" @ +M ! P P4L $1-!@@( 0 , ,M+ !T308(# $ # #52P E$T& +M" P ! P WTL +1-!@@, 0 , .E+ #,308(% $ # #S2P +MU$T&"!4 " P _DL ,Q-!@@% @ , E, #X308(# $ # 3 +M3 ,$X&" P ! P '4P %A.!@@, 0 , $1" !\3 at 8(# $ +M# G3 E$X&" P ! P ,4P +1.!@@" @ , 9" P3P8(& +M $ # [3 P$X&" @ ! P 14P /Q.!@@( 0 , $], !83P8( +M @ ( # !93 U$\&"!@ ! P 8TP &1/!@@( 0 , &U, "@ +M3P8(" $ # !W3 "% &" P ! P @4P )10!@@5 @ , (Q, +M !84 8(.P ( # #P&P $ /'_ETP -S>" @1 0 . +M / ; 0 \?_P&P $ /'_\!L +M! #Q_Z!, "T408(" $ # #P&P $ /'_JDP $Q2!@@( +M 0 , / ; 0 \?_P&P $ /'_\!L +M ! #Q__ ; 0 \?_P&P $ /'_\!L +M ! #Q__ ; 0 \?_P&P $ /'_ +M\!L ! #Q_[1, #TW@@(!P $ #@#P&P $ +M /'_\!L ! #Q_T(" "@A at D(! $ & #P&P +M $ /'_\!L ! #Q__ ; 0 \?^ ' +M $ /'_O4P #15!@@( 0 , ( < 0 \?_'3 +MZ%8&" P ! P T4P +15!@@, 0 , -M, #\508(# $ # #E +M3 +%8&" @ ! P [TP %!6!@@( 0 , /E, !P5 at 8(# $ +M# #30 G%8&" P ! P @!P ! #Q_PU- !4WP@( P +M $ #@" ' $ /'_@!P ! #Q_Q9- #P5P8( +M% $ # @30 .%@&"$4 " P *TT /!7!@A% @ , ( < +M 0 \?\V30 :-\(""\ ! X /TT ! #Q_T(" +M "DA at D(! $ & !+30 $ /'_0@( *B&"0@$ 0 8 +M %T% 0 \?\+'0 $ /'_"QT +M! #Q_U=- "L6 at 8(" $ # !A30 )%H&" @ ! P :TT #1:!@@( +M 0 , '5- "(6 at 8(% $ # !_30 E%H&" \ " P BDT (A: +M!@@) @ , %L> 0 \?_5'@ $ /'_E4T +M !Q;!@@( 0 , )]- #D6 at 8(" $ # #5'@ $ /'_ +MU1X ! #Q_]4> 0 \?_5'@ $ +M /'_J4T -!;!@@( 0 , +-- !$7 8(# $ # "]30 "%P&" @ +M ! P QTT "1 0 \?__'@ +M $ /'__QX ! #Q_]%- "@WP@(! $ #@!I!0 +M $ /'_VDT $A>!@@( 0 , &D% 0 \?]I +M!0 $ /'_:04 ! #Q_VD% 0 +M\?]I!0 $ /'_:04 ! #Q_VD% +M 0 \?_D30 %& &" @ ! P [DT -Q?!@@( 0 , &D% +M 0 \?]I!0 $ /'_^$T )1@!@@( 0 , ). !< +M8 8(" $ # !I!0 $ /'_#$X .1@!@@( 0 , !9. +M #(8 8(" $ # !I!0 $ /'_:04 ! #Q +M_Q\? 0 \?\@3@ _&(&"!0 ! P *DX %!A!@@( +M 0 , #1. !D808(" $ # ^3@ ?&$&" @ ! P 2$X +QA!@@( +M 0 , %). #X808(# $ # !<3@ 6&(&" @ ! P 9DX '!B +M!@@, 0 , '!. "(8 at 8(# $ # !Z3@ U&(&" P ! P A$X +M QC!@@, @ , (]. #\8 at 8(#P ( # ?'P $ /'_ +MFDX &QG!@@, 0 , *1. "09P8(" $ # "N3@ H&<&" @ ! +M P N$X '!P!@@, 0 , ,). #$9 8(!0 ( # #I1P U&4&"!@ +M ! P S$X -1D!@@( 0 , -9. #H9 8(# $ # #@3@ A&4& +M" P ! P ZDX *1E!@@, 0 , /1. ,9 at 8(" $ # #^3@ +M:&8&" @ ! P "$\ (AF!@@( 0 , !)/ "H9 at 8(# $ # < +M3P &<&" P ! P )D\ "QG!@@, 0 , #!/ \9P8(# $ +M# Z3P L&<&" @ ! P 1$\ .AG!@@( 0 , $Y/ "$:P8(# +M $ # !83P 2&@&" @ ! P 8D\ +1H!@@( 0 , &Q/ #$: 8( +M" $ # !V3P :&D&" @ ! P @$\ 'AI!@@( 0 , (I/ < +M:@8(" $ # "43P +&H&" @ ! P GD\ -!J!@@( 0 , *A/ +M !$:P8(" $ # "R3P ;&L&" @ ! P O$\ $1L!@@4 0 , +M ,9/ !$; 8(#@ ( # #03P 7&P&" @ ! P VD\ +QL!@@, +M 0 , .1/ "4; 8(% $ # #N3P G&P&"!( " P ^4\ )1L!@@( +M @ , 10 #P; 8(" $ # .4 1&T&" P ! P &% '!M +M!@@, 0 , ")0 "D;08(# $ # L4 R&T&" P ! P -E +M -AM!@@, 0 , $!0 4;@8(% $ # !*4 &&X&"!$ " P +M55 !1N!@@" @ , &!0 X;@8(# $ # !J4 4&X&" P ! +M P =% '1N!@@, 0 , 'Y0 "4;@8(# $ # "(4 K&X&" P +M ! P DE "1O!@@, 0 , )Q0 "D;P8(# $ # "F4 V&\& +M" P ! P L% QP!@@, 0 , +I0 L< 8(# $ # #$4 +M4' &" P ! P 'Q\ ! #Q_Q\? 0 \?_. +M4 ='(&"!0 ! P V% ,AP!@@( 0 , .)0 #<< 8(" $ +M# #L4 ]' &" @ ! P ]E #1Q!@@( 0 , !1 !P<08(# +M $ # *40 T'$&" @ ! P %%$ .AQ!@@, 0 , !Y1 <@8( +M# $ # H40 3'(&" P ! P ,E$ (1R!@@, @ , #U1 !T +M<@8(#P ( # ?'P $ /'_2%$ 1T!@@, 0 , %)1 +M #@<@8(" $ # !<40 ]'(&" @ ! P 9E$ !AS!@@( 0 , +M '!1 !$ 8(# $ # R4@ +M1'@&" @ ! P *1\ ! #Q_RD? 0 \?\\ +M4@ 0'D&" P ! P *1\ ! #Q_T92 # >08(" $ +M# !04@ I'D&" @ ! P *1\ ! #Q_RD? +M 0 \?\D!@ $ /'_6E( 3@" @# 0 . "0& +M 0 \?]C4@ 5'T&"!0 ! P ;5( $A[!@@( 0 , '=2 " +M>P8(" $ # "!4@ V'L&" P ! P BU( #1\!@@, 0 , )52 +M ",? 8(# $ # "?4@ ^'P&"!0 ! P J5( Q]!@@5 @ , +M +12 #X? 8($@ ( # "_4@ ,'T&" P ! P R5( %1]!@@9 +M @ , "0& 0 \?_34@ S'T&" P ! P ) 8 +M ! #Q_R0& 0 \?_=4@ %. (""< ! X ) 8 +M ! #Q_R0& 0 \?\D!@ $ /'_YE( +M #S@" @; 0 . "0& 0 \?\D!@ $ /'_ +M/ 8 ! #Q_^]2 !\?P8(" $ # #Y4@ 6'\&" @ ! +M P / 8 ! #Q_P-3 ,@ 8(" $ # -4P U'\&" @ +M ! P / 8 ! #Q_Q=3 "(@ 8(" $ # A4P 2( & +M" @ ! P / 8 ! #Q_RM3 ", at P8(% $ # U4P +M.($&" @ ! P /U, (B!!@@4 0 , $E3 "(@08(& ( # !3 +M4P M($&"!0 ! P 75, +2!!@@> @ , &=3 #@@08(# $ +M# !Q4P $((&" P ! P >U, %B"!@@4 0 , (53 ",@@8(20 +M ( # "04P 6((&"#$ " P FU, .2"!@@, 0 , *53 <@P8( +M# $ # "O4P 2(,&" P ! P N5, )B#!@@] @ , ,13 ", +M at P8(# ( # \!@ $ /'_/ 8 ! #Q_\]3 +M 0A 8(" $ # \!@ $ /'_V5, '"%!@@, 0 , +M .-3 "DA 8(% $ # #M4P I(0&" @ " P ]U, ,"$!@@4 +M 0 , %4 # A 8('@ ( # +5 [(0&" P ! P %50 !2%!@@, +M 0 , !]4 !(A08(% $ # I5 2(4&"!D " P / 8 +M ! #Q_]XT #4AP8(# $ # S5 ,(8&" ( " P /50 +M $R&!@@8 0 , $=4 "8A at 8(# $ # !15 #(<&" P ! P +M6U0 %2'!@@, 0 , &54 "0AP8($ $ # !O5 P(<&" @ ! +M P / 8 ! #Q_WE4 0C 8(# $ # "#5 C(@&"!0 +M ! P C50 -2(!@A/ @ , )A4 ",B 8(2 ( # "C5 +(D& +M" @ ! P K50 &2)!@@( 0 , +=4 "PB08(" $ # #!5 +MQ(D&" @ ! P RU0 -R)!@@( 0 , -54 #TB08(" $ # #? +M5 %(H&" P ! P Z50 (B*!@@4 0 , /-4 #DB at 8((@ ( +M# #^5 B(H&"%P " P "54 !"+!@@( 0 , !-5 TBP8(% +M $ # =50 -(L&"#D " P )U4 'R+!@@, 0 , #P& +M 0 \?\Q50 ,(T&" @ ! P / 8 ! #Q_SM5 #@ +MC08(" $ # !%50 H(T&" @ ! P / 8 ! #Q_T]5 +M "TC at 8(# $ # !950 8(X&" @ ! P / 8 ! #Q +M_V-5 ,D at 8(% $ # !M50 %(\&" @ ! P =U4 %B/!@@4 +M 0 , (%5 !8CP8("P ( # "+50 ) &" P ! P E54 '"/!@@, +M 0 , )]5 "0CP8(% $ # "I50 K(\&" X " P M%4 )"/ +M!@@; @ , +]5 #0CP8(% $ # #)50 Z(\&" D " P U%4 +M -"/!@@6 @ , -]5 PD 8(% $ # #I50 ,) &" @ " P +M\U4 $20!@@, 0 , /U5 !!@@4 0 , #M8 "@ +MG at 8((@ ( # !&6 >)X&""< " P 45@ -">!@@, 0 , %M8 +M #HG at 8(# $ # !E6 ')\&"!0 ! P ;U@ #R?!@@< @ , +M 'I8 "$Q 8(-P ( # :7@ ?,0&" @ " P +M)5X ,C$!@@, 0 , "]> !(Q08(.@ ( # Z7@ #,4&"#H " +M P ?A4 ! #Q_T5> ,Z@@(#0 $ #@!^%0 +M $ /'_3EX !SJ" @) 0 . 'X5 0 \?]77@ *.H( +M"!4 ! X ?A4 ! #Q_WX5 0 \?]@7@ +M0.H(" D ! X ?A4 ! #Q_WX5 0 \?]^ +M%0 $ /'_:5X $SJ" @/ 0 . 'X5 0 +M\?]^%0 $ /'_?A4 ! #Q_W)> 4R at 8(# +M $ # !\7@ N,P&"!0 ! P AEX $#(!@@( 0 , )!> "DR 8( +M% $ # ":7@ K,@&"#< " P I5X *3(!@@( @ , +!> #P +MR 8(# $ # "Z7@ +,D&" P ! P Q%X (C)!@@, 0 , ,Y> +M #,R08(% $ # #87@ U,D&"#$ " P XUX ,S)!@@( @ , +M .Y> !XR at 8(# $ # #X7@ M,H&" P ! P E\ !S+!@@, +M 0 , Q? !8RP8(# $ # 67P R,L&"!0 ! P (%\ 3,!@@Z +M @ , "M? #(RP8(.@ ( # V7P 5,P&"!0 ! P 0%\ %S, +M!@@, @ , $M? !4S 8(" ( # !67P =,P&" P ! P 8%\ +M ,C,!@@W @ , &M? "XS 8(#P ( # !^%0 $ /'_ +M=E\ $3-!@@, 0 , (!? PS08(% $ # "*7P ,,T&" @ " +M P E%\ ,CJ" @, 0 . 'X5 0 \?^>7P ).L(" < +M ! X ?A4 ! #Q_Z=? LZP@($@ $ #@!^%0 +M $ /'_L%\ $#K" @8 0 . 'X5 0 \?^Y7P +M6.L(" , ! X ?A4 ! #Q_\)? !8 6-@& +M" \ " P Z6 *#8!@@4 0 , /-@ #0V 8('0 ( # #^8 +MH-@&""X " P "6$ !39!@@* @ , !1A $V08(#P ( # #& +M%@ $ /'_'V$ $#9!@@( 0 , ,86 0 +M\?_&%@ $ /'_*6$ #3!@@, 0 , UB !\W at 8(% $ # 78@ E-X&"'D " P +M(F( 'S>!@@8 @ , "UB 8WP8(" $ # W8@ 8-\&" @ ! +M P 06( +3?!@@4 0 , $MB # WP8(9 ( # !68@ M-\&" L +M " P 86( #C@!@@4 0 , &MB !4X 8(( ( # !V8@ .. & +M"!H " P @6( (#@!@@, 0 , (MB " @ , AC +M !HX at 8(+@ ( # 38P P.(&" @ ! P '6, /#B!@@( 0 , +M "=C LXP8(% $ # Q8P 3.,&""0 " P /&, "SC!@@> +M @ , $=C "8XP8('0 ( # !28P A.,&"!0 " P QA8 +M ! #Q_UUC (Y 8(% $ # !G8P $.0&" @ " P 0 \?\K'@ +M $ /'_*QX ! #Q__\> 0 \?^S: +M/ @'" P ! P O6@ * (!P at 4 0 , ,=H !4!0<(" $ # #1 +M: > 4'" @ ! P VV@ *@%!P@( 0 , .5H $!@<(" $ +M# #O: / 8'" @ ! P ^6@ ) &!P@( 0 , -I #$!@<(# +M $ # -:0 , <'" P ! P E64 ) '!P@, 0 , !=I #,!P<( +M# $ # A:0 H @'"! " P _QX ! #Q__\> +M 0 \?\K:0 G.P("", ! X _QX ! #Q__\> +M 0 \?\T:0 P.P(" \ ! X _QX ! #Q +M_SUI #0[ @(! $ #@#_'@ $ /'_1FD -3L" @0 +M 0 . &D% 0 \?]/:0 " L'" @ ! P 66D - *!P@( +M 0 , &D% 0 \?]C:0 2 P'" P ! P ;6D &@+ +M!P@( 0 , '=I "@"P<(" $ # "!:0 V L'" @ ! P BVD +M ! ,!P@( 0 , &D% 0 \?^5:0 O X'" @ ! P +MGVD (0.!P@( 0 , &D% 0 \?^I:0 * \'" @ ! +M P LVD / .!P@( 0 , &D% 0 \?^]:0 E \'" @ +M ! P QVD %P/!P@( 0 , &D% 0 \?_1:0 !! ' +M" P ! P :04 ! #Q_VD% 0 \?_;:0 +M#!$'" @ ! P Y6D -P0!P@( 0 , &D% 0 \?_O +M:0 C!$'" @ ! P ^6D %P1!P@( 0 , &D% 0 +M\?]I!0 $ /'_ VH ' 2!P@( 0 , UJ X$@<(" +M $ # !I!0 $ /'_%VH -P2!P@( 0 , "%J "D$@<( +M" $ # !I!0 $ /'_*VH $@3!P@( 0 , #5J 0 +M$P<(" $ # !I!0 $ /'_/VH 'P3!P@( 0 , &D% +M 0 \?\?'P $ /'_'Q\ ! #Q +M_Q\? 0 \?\?'P $ /'_26H *05!P at 4 +M 0 , %-J "X% <(" $ # !=:@ ]!0'" @ ! P 9VH / 5!P at 8 +M @ , ')J "D%0<(2P ( # ?'P $ /'_'Q\ +M ! #Q_Q\? 0 \?]]:@ 4!D'"!0 ! P AVH +M . at 6!P@( 0 , )%J !L%P<(" $ # ";:@ I!<'" @ ! P +MI6H /@7!P@( 0 , *]J !\& <(" $ # "Y:@ M!@'" @ ! +M P PVH !09!P at 4 0 , ,UJ H&0<(% ( # #8:@ %!D'"!0 +M " P XVH %P9!P at 2 @ , .YJ !0&0<("0 ( # ?'P +M $ /'_^6H !P;!P at 4 0 , -K "D&0<(" $ # -:P +MM!D'" @ ! P %VL # :!P@( 0 , "%K ! &@<(" $ # K +M:P R!H'"!0 ! P -6L .@:!P@@ @ , $!K #(&@<(( ( +M# !+:P *!L'"!4 " P 5FL !P;!P@) @ , !\? +M 0 \?]A:P \.P("!4 ! X 'Q\ ! #Q_Q\? +M 0 \?\?'P $ /'_'Q\ ! #Q_VIK "4 +M' <(" $ # ?'P $ /'_'Q\ ! #Q_RD? +M 0 \?]T:P ?!T'" @ ! P ?FL & =!P@( 0 , +M "D? 0 \?\I'P $ /'_B&L >!P@( +M 0 , ))K #$'0<(" $ # "<:P Y!T'" @ ! P *1\ +M ! #Q_RD? 0 \?^F:P ".T("#D ! X *1\ +M ! #Q_Z]K !$[0@(.0 $ #@ I'P $ /'_*1\ +M ! #Q_[AK !0(0<(" $ # #":P :" '" @ ! P +MS&L *0@!P@, 0 , "D? 0 \?]?2@ ?",'" @ ! +M P UFL )0B!P@( 0 , .!K #0(@<(# $ # D!@ +M $ /'_ZFL .PC!P@( 0 , #P& 0 \?_T:P D"0' +M" @ ! P / 8 ! #Q_SP& 0 \?\\!@ +M $ /'__FL + E!P@( 0 , #P& 0 \?\\ +M!@ $ /'_/ 8 ! #Q_SP& 0 +M\?]L#P $ /'_"&P &#O" @0 0 . &P/ +M 0 \?\1; <.\("!$ ! X ; \ ! #Q_VP/ +M 0 \?\:; A.\("!\ ! X Y1( ! #Q_R-L "D +M[P@("0 $ #@#E$@ $ /'_+&P L!P@, 0 , #9L +M #(*0<(" $ # ! ; Z"D'" P ! P 2FP "@J!P@, 0 , +M %1L !(*@<(% $ # !>; F"H'"%X " P :6P $@J!PA. +M @ , '1L $*P<(# $ # !^; 7"L'" P ! P B&P (PK!P@, +M 0 , ))L "L*P<(# $ # "<; T"L'" P ! P ?A4 +M ! #Q_Z9L "T[P@(#@ $ #@!^%0 $ /'_KVP +M ,3O" @9 0 . 'X5 0 \?^X; X.\(" , ! X +M?A4 ! #Q_\%L #D[P@(#0 $ #@!^%0 $ +M /'_RFP /3O" @2 0 . 'X5 0 \?_3; "/ ("!P +M ! X ?A4 ! #Q_]QL D\ @(#P $ #@!^%0 +M $ /'_Y6P #3P" @4 0 . 'X5 0 \?_N; +M2/ (" \ ! X ?A4 ! #Q__=L !8\ @(#P $ #@!^ +M%0 $ /'_ &T &CP" @( 0 . 'X5 0 +M\?\);0 @ , IO !@/0<(+@ ( # 5 +M;P N#T'" @ ! P 'V\ .P]!P@( 0 , "EO L/@<(% $ +M# S;P 3#X'""0 " P /F\ "P^!P@> @ , $EO "8/@<('0 +M ( # !4;P A#X'"!0 " P QA8 ! #Q_\86 +M 0 \?_&%@ $ /'_7V\ ' _!P at 4 0 , &EO !X +M/P<(" ( # !T;P <#\'" @ " P ?V\ - _!P at 4 0 , (EO +M #8/P<(" ( # "4;P T#\'" @ " P QA8 ! #Q +M_Y]O 400<(# $ # "I;P 3$ '"!0 ! P LV\ $Q !P at 0 +M @ , +UO !D0 <(" $ # #';P M$ '"!0 ! P T6\ /Q !P at + +M @ , -QO "T0 <(10 ( # #&%@ $ /'_QA8 +M ! #Q_^=O #800<(" $ # #&%@ $ /'_\6\ +M (Q"!P at 4 0 , /MO H0@<(" $ # %< V$('"!P " P +M$' (Q"!PA, @ , ,86 0 \?\;< D/$(""D ! +M X QA8 ! #Q_R1P "\\0@(+ $ #@#&%@ +M $ /'_+7 1&!P at 4 0 , #=P #H0P<(" $ # !!< 5$0' +M"!0 ! P 2W +A$!P@> @ , %9P !41 <(8P ( # !A< +MX$0'" @ ! P :W $!%!P@( 0 , '5P "L10<(% $ # !_ +M< S$4'""0 " P BG *Q%!P@> @ , )5P 81@<('0 ( +M# "@< !$8'"!0 " P QA8 ! #Q_ZMP #H\0@(*P +M $ #@#&%@ $ /'_M' #!(!P at 4 0 , +YP #,1@<( +M" $ # #(< #$<'"!0 ! P TG #Q'!P@> @ , -UP , +M1P<(+@ ( # #H< 9$<'" @ ! P \G )A'!P@( 0 , /QP +M #81P<(% $ # &<0 ^$<'""0 " P $7$ -A'!P@> @ , +M !QQ !$2 <('0 ( # G<0 ,$@'"!0 " P QA8 +M! #Q_S)Q #\20<(% $ # \<0 F$@'" @ ! P 1G$ -A(!P at 4 +M 0 , %!Q (20<('@ ( # !;<0 V$@'""X " P 9G$ #!) +M!P@( 0 , '!Q !D20<(" $ # !Z<0 I$D'"!0 ! P A'$ +M ,1)!P at D @ , (]Q "D20<('@ ( # ":<0 $$H'"!T " P +MI7$ /Q)!P at 4 @ , ,86 0 \?^P<0 S$H'" @ ! +M P NG$ )1*!P@( 0 , ,1Q "L2P<(" $ # #.<0 =$L'" @ +M ! P QA8 ! #Q_]AQ H3 <(# $ # #&%@ +M $ /'_XG$ %Q.!P at 4 0 , .QQ !<3 <(# $ # #V<0 +MR$P'"!0 ! P '( !-!PA1 @ , MR #(3 <(. ( # 6 +M<@ 9$T'"! ! P ('( )Q-!P@, 0 , "IR #P30<(# $ +M# T<@ :$X'"%$ " P /W( %Q.!P@, @ , ,86 +M 0 \?_&%@ $ /'_2G( 10!P@, 0 , %1R \3P<( +M% $ # !><@ /$\'"! " P :'( %1/!P@( 0 , ')R "D +M3P<(% $ # !\<@ [$\'" L " P AW( *1/!PA% @ , ,86 +M 0 \?^2<@ =% '"!0 ! P G'( ,!0!P at Y @ , +M *=R !T4 <(20 ( # #&%@ $ /'_LG( #12!P@, +M 0 , +QR !<40<(% $ # #&<@ 7%$'"! " P T'( '11!P@( +M 0 , -IR #$40<(% $ # #D<@ %%('"!, " P [W( ,11 +M!PA0 @ , ,86 0 \?_Z<@ F%('"!0 ! P !', +M /Q2!PA2 @ , ]S "84@<(9 ( # #&%@ $ /'_ +M&G, )13!P@( 0 , ,86 0 \?\D

    @ , )]S #<5@<(+@ +M ( # "J

    @ , -YS 8 +M6 <()P ( # #I

    = ^%\'"!0 ! P Z'0 $A@!P at Y @ , /-T #X7P<( +M30 ( # #^= D& '" P ! P "'4 -Q@!PA+ @ , !-U #4 +M8 <(" ( # #&%@ $ /'_QA8 ! #Q_\86 +M 0 \?_&%@ $ /'_'G4 !AC!P at 4 0 , +M "AU !L80<(" $ # R=0 R&$'"!0 ! P /'4 !!B!P at 5 +M @ , $=U #(80<(1@ ( # !2=0 ,&('" @ ! P 7'4 $AB!P@( +M 0 , &9U "D8@<(% $ # !P=0 [&('"!4 " P >W4 *1B +M!PA' @ , (9U T8P<(#P ( # "1=0 &&,'"!P " P QA8 +M ! #Q_YQU 0 \?^G=0 P(8)" 0 ! !@ +ML74 ,2&"0@$ 0 8 +QU #@A at D( % $ & #%=0 X-8)" !0 ! +M !@ SW4 ! #Q_]IU 0 \?_H=0 +M $ /'_[W4 ! #Q__AU #@)@H(! $ & )=@ +M $ /'_%'8 &!Y"0BP 0 7 !]V !G@D(! $ %P 8=P :H8'" $ " P ,'< &N&!P@! @ , +M $MW !LA@<( 0 ( # !4=P ;88'" $ " P 7W< &Z&!P at 2 +M @ , &AW " A@<(,@ ( # !S=P LH8'""@ " P A7< -J&!PA! +M @ , )UW ;AP<(2P ( # "P=P 9H<'"&0 " P Q'< ,J' +M!PB4 @ , -YW !>B <(8P ( # #X=P P8@'"$, " P !G@ +M 2)!PBV @ , !AX "ZB0<(F@ ( # U> 5(H'")( " P +M2G@ ! #Q_U5X H>@D(! $ %P!D> ."<*" 0 ! +M !@ ?'@ "2/!PB,!0 @ , (5X ! )PH(! $ & "1> 7YH'"#D! +M " P I7@ ,N>!PC( @ @ , +%X !GG@<(.@ ( # #)> /"<* +M" 0 ! !@ Y'@ /J7!P at R @ , /1X !/F0<()@ ( # >0 +M)YH'"!P " P "7D $0G"@@$ 0 8 !5Y "8FP<(1@ ( # F +M>0 39P'"/0! " P -'D !ND!P@! 0 @ , $AY 0 $ /'_8WD ! #Q_VUY !D)PH(! +M $ & !V>0 :"<*" 0 ! !@ @'D &PG"@@$ 0 8 )-Y !MJ0<( +M at P ( # "A>0 \*D'" X " P KGD /ZI!PBC @ , +YY " +M)PH(@ $ & #*>0 "@*"( ! !@ UWD /6M!P at B @ , .AY +M 0 \?_Q>0 A"@*" 0 ! !@ 7H (@H"@@$ 0 8 +M IZ ",* H(! $ & ;>@ ZJX'"%( " P +GH +M! #Q_S9Z "0* H(! $ & !%>@ E"@*" 0 ! !@ 5GH )@H"@@$ +M 0 8 &EZ "<* H(! $ & !Y>@ H"@*" 0 ! !@ AGH *0H +M"@@$ 0 8 )9Z "H* H(! $ & "G>@ K"@*" 0 ! !@ LWH +M + H"@@$ 0 8 ,)Z "T* H(! $ & #2>@ N"@*" 0 ! !@ +MWWH +PH"@@$ 0 8 .]Z # * H(" $ & #\>@ R"@*" @ ! +M !@ "GL - H"@@$ 0 8 !A[ #4* H(! $ & D>P V"@*" 0 +M ! !@ ,WL -PH"@@$ 0 8 $![ #@* H(! $ & !->P Y"@* +M" 0 ! !@ 6GL . at H"@@$ 0 8 &M[ #L* H(! $ & ![>P +M\"@*" 0 ! !@ B7L $RS!P@? @ , ))[ "FLP<(%P ( # "= +M>P 0;P'"#4 " P J7L /@H"@@$ 0 8 +=[ #T* H(! $ +M& # >P =KP'"!P " P RWL )*\!P@< @ , -9[ +M 0 \?_@>P $ /'_[WL ! #Q__E[ #;R <( +M 0 ( # *? H\@'"#@ " P &WP 'O(!P at H @ , "I\ +M 0 \?\R? *"D*" 0 ! !@ 1WP +3*!P at M @ , %-\ +M 0 \?]:? $ /'_:7P ! #Q +M_W9\ 0 \?]_? $ /'_BWP +M! #Q_Y5\ 0 \?^E? $ /'_L7P +M ! #Q_[U\ 0 \?_)? $ /'_U7P %@. +M"0 at G 0 . -U\ " #@D()P $ #@#E? J X)""< ! X [7P +M - ."0 at G 0 . /5\ #X#@D()P $ #@#]? ( \)""< ! X +M!7T $@/"0 at G 0 . U] !P#PD()P $ #@ 5?0 F \)""8 ! +M X '7T , /"0 at F 0 . "5] #H#PD()@ $ #@ M?0 $! )""8 +M ! X -7T #@0"0 at F 0 . #U] !@$ D()@ $ #@!%?0 B! ) +M""8 ! X 37T + 0"0 at F 0 . %5] 0 \?]A?0 +MZ! )"!0 ! X :'T /P0"0@: 0 . &]] 8$0D(%0 $ #@!V +M?0 ,!$)"!H ! X ?7T $P1"0@= 0 . (1] !L$0D(& $ +M#@"+?0 A!$)"!P ! X DGT * 1"0@: 0 . )E] "\$0D(&P +M $ #@"@?0 V!$)"!4 ! X J'T / 1"0@@ 0 . +!] 0$@D( +M&P $ #@"X?0 +!()"!P ! X P'T $@2"0 at C 0 . ,A] !L +M$@D((P $ #@#0?0 D!()"!@ ! X V'T *@2"0@> 0 . .!] +M #($@D('0 $ #@#H?0 Z!()"!D ! X \'T 03"0 at C 0 . +M /A] H$PD('P $ #@ ?@ 2!,)"!H ! X "'X &03"0@= +M 0 . !!^ "$$PD() $ #@ 8?@ J!,)"!@ ! X ('X +M ! #Q_RQ^ 0 \?\X?@ $ /'_1'X +M ! #Q_U!^ !H)PD(#0 $ #@!8?@ H"@)" T ! X 8'X +M - at I"0 at - 0 . &A^ 0*PD(#0 $ #@!P?@ 2"P)" T ! X +M>'X ( M"0 at - 0 . (!^ "X+ at D(#@ $ #@"(?@ \"\)" X ! +M X D'X "@Q"0@/ 0 . )A^ !@, at D(#P $ #@"@?@ F#,)"! +M ! X J'X - T"0 at 0 0 . +!^ (- at D($0 $ #@"X?@ 1#<) +M"!( ! X P'X ! #Q_\M^ P/ @(6@ ( # #:?@ +M $ /'_YWX # I"@@$ 0 8 /%^ #4/@@(W0 ( # +M?P 44$(""H " P "W\ +9 " AU @ , !E_ 0 +M\?\F?P ?$$("!( " P -7\ ! #Q_T1_ +M 0 \?])?P -(4)" 0 ! !< 6'\ #0I"@@$ 0 8 &U_ "T00@( +M:P ( # !\?P /"D*" 0 ! !@ ?G\ %@I"@@$ 0 8 (E_ ! +M*0H(! $ & "2?P ."D*" 0 ! !@ H7\ -5_" @@ @ , +-_ +M !4*0H(! $ & #!?P 7"D*" 0 ! !@ TW\ & I"@@$ 0 8 +M -Y_ !D*0H(! $ & #F?P :"D*" 0 ! !@ \7\ $-_" AI +M @ , " #;=P@(Q0 ( # 7@ 1"D*" 0 ! !@ (( &UA" CH +M"@ @ , "F "@> @(HP( ( # _@ :U,("!8 " P 28 '12 +M" @D @ , %R !(*0H(! $ & !G@ 3"D*" 0 ! !@ =X +M $-[" B( 0 @ , (> !L*0H(! $ & "=@ <"D*" 0 ! !@ +MK( %5L" @A"0 @ , ," ":4 @(V@$ ( # #7@ K'\(""D " +M P [X 'I4" BH"@ @ , /B "!4P@(>P ( # !@0 _%,("'X +M " P "X$ % I"@@$ 0 8 !J! B7P@(?P$ ( # N at 0 LF ( +M"%X " P 2($ !!A" A= @ , %2! B?0@((0( ( # !C at 0 +MRWP("%< " P >8$ '0I"@@$ 0 8 (6! !V=0@(90( ( # "2 +M at 0 9H ("*, " P IH$ F!" @Q @ @ , +F! 0 +M\?_%@0 :(,("*@ " P TX$ !"$" @Q! @ , ."! !!B @(0P$ +M ( # #K at 0 A(D(""T# " P _($ +&," @X @ , >" #IC @( +M-PH ( # 2@@ ()<(" T! " P )8( "V8" @[ @ @ , #F" !H +MF@@(B ( # !.@@ F9T("#H " P 58( ! #Q_UR" +M #4G0@(' ( # !E@@ \)T("$< " P ;8( #>>" @/ @ , +M 'F" !&G@@(' ( # "$@@ 8IX(""( " P D8( (2>" @X 0 +M @ , )B" !X*0H(! $ & "A@@ +J ("%\ " P KX( (V@" @3 +M @ , +R" "FH@@(B0 ( # #,@@ $ /'_VH( #B% +M"0 at 8 0 7 .B" 0 \?_Q@@ ++,("$ " P "(, +M ! #Q_Q&# !0M @(#P ( # A at P ;;0("'H " P +M*8, .>T" A^ @ , #F# " *0H(! $ & !(@P W&8)" 0 1 +M !< :8, "Q@"0@$ $0 7 (J# "A <('P !( # "7 at P W(X&"! +M 1 P N8, )1D"0 at 0 $0 7 -Z# #T\@@(! !$ #@#P at P !/\' +M" @ 1 P #(0 -1Q"0@( $0 7 ".$ #0 @(!0 !( # SA +M%&$)" 0 1 !< 4X0 'AI"0@$ $0 7 '^$ #L_@<(" !$ # "; +MA F"$%" 4 2 P NX0 )!Y!@@, $0 , -:$ 2@ !( +M #AA ,!T'" @ 1 P ^H0 %@L"@@$ $0 8 R% (< D($ +M !$ %P FA0 -( &" P 1 P .X4 'BA!@@0 $0 , %R% #0W <( +M" !$ # !TA0 8/<'"&< 2 P BH4 -Q?"0@$ $0 7 *B% # +M,0<(" !$ # "]A0 LH0'"* ! 2 P TH4 "0!" @( $0 , .6% +M P[@@(! !$ #@ !A@ ) ,'" 4 2 P *88 !C"0@$ $0 7 +M $F& #U^0<("P !( # !BA@ S/T'" @ 1 P =88 (S9!@@0 +M$0 , (^& !@W0<(3P !( # "CA@ M',)"! 1 !< OH8 $A@!@@, +M $0 , -.& #T9 at D(! !$ %P#RA@ 2,@%" @ 1 P #H< -#G +M!@@0 $0 , "&' "@LP8(!0 !( # ! AP 9!$%" @ 1 P 9(< +M )AW"0@$ $0 7 'N' Z@@(# !$ #@"9AP -(,'" P 2 P +MHH< %P+" @( $0 , +2' #$/@<(# !$ # #.AP #-,&" @ 1 +M P \X< +SJ" @, $0 . !*( #<"0@(" !$ # HB R&,&" P +M 1 P 18@ (G'!P@\ $@ , %6( 0>@D(! !$ %P!JB )&@) +M" @ 1 !< @8@ /S$!P at 8 $@ , (N( 8QP8(" !$ # "OB +MK!(%"! 1 P R8@ )!L!P@; $@ , -2( $P0<(J , !( # #@ +MB N'()" 0 1 !< #(D &RP!0 at 0 $0 , ">) #<> D($ !$ +M%P!%B0 "-(&" P 1 P 78D -1>"0@$ $0 7 'F) T P@(" +M !$ # "0B0 ?!D'" P 1 P N(D -A3!P@, $0 , ,^) \!P@( +M" !$ # #DB0 M/T'" @ 1 P \8D /1D"0@, $0 7 !** +M- <(" !$ # IB@ V& )" @ 1 !< 1(H BX!0@' $@ , %F* +M "T$0<(# !$ # !UB@ J'('"+\ 2 P BHH $#I! @, $0 , +M *Z* #PW@@(! !$ #@#8B@ K/\'" @ 1 P ZXH 'AN"0@( +M$0 7 .+ )@ !( 2BP 3 H(" @ 1 P *(L ,3K" @0 +M $0 . $"+ !PJ at 0(" !$ # !;BP "-@$" P 1 P 0 !$)0<(# !$ # !4D G&T)"! 1 !< =) +M 'Q#!@AA $@ , (V0 \Q at 4(# !$ # "JD X D(! !$ %P!$D0 E&8)" @ +M 1 !< 8I$ #1Z"0@$ $0 7 (&1 !@R @(" !$ #@":D0 /& ) +M" 0 1 !< N9$ )AR"0@$ $0 7 .61 #$%X)" 0 1 !< D), )%O!PA2 $@ , )F3 +M @9 at D(! !$ %P"\DP L.\'" T 2 P UY, &@V!@@, $0 , +M /&3 4;PD($ !$ %P )E B,4%" P 1 P (90 'C0!PA' +M$@ , "Z4 ",% <(# !$ # !3E 7%@%" P 1 P 9Y0 ,C=" @0 +M $0 . (&4 !4; D($ !$ %P">E X& )" @ 1 !< P90 -! +M!@@, $0 , -64 <"P8(" !$ # #YE F&<)" @ 1 !< #I4 +M / S!@@( $0 , "F5 !?MP<(SP0 !( # SE0 <),&"! 1 P +M694 -AF"0@$ $0 7 'V5 !D=PD(! !$ %P"6E0 U ((" @ 1 +M P K94 -1S"0@$ $0 7 ,65 !,0 at 4(!P !( # #AE0 ! ,(" @ +M 1 P ])4 $0#!0@( $0 , !"6 #X$P4(" !$ # NE@ A&X) +M"!P 1 !< 2)8 %!R"0@$ $0 7 &"6 #L50<(# !$ # !UE@ +MU&@)" @ 1 !< D)8 +S>" @, $0 . +26 "@, @(" !$ # #& +ME@ (F\'" @ 2 P U)8 /R_!@@( $0 , /V6 "PS@@(! !$ +M#@ 7EP I ((" @ 1 P *I< !0"" @( $0 , $&7 #<_P<(" +M !$ # !>EP 0&P)" 0 1 !< ?9< (0!" @( $0 , )"7 4.@@( +M&0 !( # "@EP ,#L'" P 1 P LY< +#=!PA/ $@ , ,V7 !, +M$ 4(" !$ # #FEP 87\'"!D 2 P \9< &A@"0@$ $0 7 !&8 +M #(%P@(" !$ # ?F E'()" 0 1 !< 1Y@ %P0!0BJ $@ , +M %R8 !H< D(+ !$ %P!WF $,%" < 2 P E)@ *0Q!0 at O +M$@ , *N8 \KP<(C0 !( # "\F 9FX'"!L 2 P R9@ )QX"0@( +M $0 7 .B8 <9PD(! !$ %P *F0 % H(" @ 1 P ()D /1S +M"0@$ $0 7 #B9 !LW0@(" !$ #@!5F0 V&,)"! 1 !< =9D +M 1J"0@, $0 7 )R9 #X8 D(" !$ %P"XF0 R (" @ 1 P +MRYD & E!@@, $0 , -^9 8. <(# !$ # #VF0 J.T&"! 1 +M P $)H ) ?!0AU $@ , "6: "_L0<(E0 !( # VF@ _&H)" @ +M 1 !< 59H '1J"0@$ $0 7 (": 88 at D(" !$ %P">F@ T'4% +M" @ 1 P LYH ."P! @0 $0 , ,V: #(W@@(% !$ #@#^F@ +M@&@)"! 1 !< ')L '0Z" @9 $@ , "R; "DT at 8(# !$ # !( +MFP $'D)" @ 1 !< 9IL +QW"0 at 0 $0 7 (.; ,W@@(" !$ +M#@"4FP [%D%"! 1 P JYL .P>!P@( $0 , ,B; #()08(# +M !$ # # "DSP@(! !$ #@!IG@ JVP'"!L 2 P +M !SE0<(+@ !( # "EG@ /&T)"! 1 +M !< Q9X (SM!PB3 $@ , -&> "L:@D(! !$ %P#FG@ I$4&"! +M 1 P !Y\ /3E!@@, $0 , "2? "./ @(@ !( # SGP I($' +M"(( 2 P /Y\ -!C"0@( $0 7 %:? !DXP@(# !$ #@!WGP +MT%D&" P 1 P GI\ "QW"0 at 0 $0 7 +B? ! PP8(" !$ # #> +MGP J.,(" @ 1 X ^I\ -S)" @0 $0 . !*@ "T.0@(&0 !( +M# AH U#H("!D 2 P ,J &0&" @( $0 , $:@ #U;@<(" +M !( # !3H +KP'"!, 2 P 8J .1*!@@% $@ , (N@ ($@4( +M.0 !( # ">H ? H%" @ 1 P M* (#>!PA4 $@ , ,N@ #$ +M_P<(" !$ # #AH (-<$" P 1 P _: /!8"0@ $0#Q_P:A +M #L*P4(!P !( # EH0 %0\(")$ 2 P .:$ $3)" @$ $0 . +M %*A !L] 0($ !$ # !LH0 R"0%"%< 2 P @Z$ '1V"0 at 0 +M$0 7 )VA !H8PD(! !$ %P"ZH0 (!H&" P 1 P RZ$ -Q>"0@( +M $0 7 ..A #T!@@(" !$ # #\H0 /&\)" 0 1 !< 'J( )P" +M!0@( $0 , $"B B ( !( !0H@ &&D)" @ 1 !< =*( +M ( ?!P@, $0 , (VB "P'0<(# !$ # "LH@ ]&<)""P 1 !< +MS:( *# !P@? $@ , -BB #@R @(! !$ #@ "HP ^ D'" @ 1 +M P &J, ."X!0@( $0 , #>C W$ @(D0 !( # !+HP Z*P&" @ +M 1 P ::, .Q/!0 at Y $@ , 'ZC <" @(" !$ # "3HP ,/@$ +M"! 1 P LJ, +C'!@@( $0 , -FC !,R0@(" !$ #@#UHP +M1&,'""$# 2 P _J, ,0(!0A# $@ , !.D !880D($ !$ %P!' +MI *&,)"! 1 !< 9Z0 *1'!0@' $@ , (*D "<( @(" !$ +M# "1I N/0'",D 2 P H:0 ,S9! @, $0 , +ZD !08 at D(! +M !$ %P#=I <&H)" 0 1 !< !J4 '!U!0@, $0 , ""E HXP4( +M& !$ # !%I0 Z+P%" @ 1 P 8J4 )C\!P@( $0 , '6E "< +M$ <(" !$ # ".I0 ^$H&" P 1 P MZ4 -S5! @( $0 , ->E +M 080D(! !$ %P#[I0 >+P%" P 1 P #J8 !0I!@@0 $0 , +M "*F @808($ !$ # !!I@ S'@)"! 1 !< 7J8 *!N"0 at 0 +M$0 7 '6F !D: <('P !( # "!I@ AVD'"!$ 2 P D*8 'SL" @$ +M $0 . *RF #(*@8($ !$ # #(I@ H%(&" 4 2 P \:8 .2J +M! @E $@ , :G # J00(" !$ # @IP = 4(" @ 1 P .*< +M -Q.!P@, $0 , $VG !@=PD(! !$ %P!FIP 5$<%"$T 2 P +M at J< AY!@@( $0 , )VG \V@@(! !$ #@"YIP ,"<*" 0 1 +M !@ Q:< 'I_!P at 5 $@ , -&G "":@<('0 !( # #IIP -.P(" 0 +M 1 X *@ &AB"0@$ $0 7 !NH #@O@<(F@ !( # JJ @"L* +M" 0 1 !@ ,Z@ %SO" @$ $0 . $^H #4_@<(" !$ # !DJ +M0'()" @ 1 !< B*@ /19!@@, $0 , +FH #XR0@(" !$ #@#4 +MJ VVT'"", 2 P X*@ ' F!P@, $0 , /VH !D/08(# !$ +M# 4J0 \PT(")$ 2 P **D -1T"0 at 0 $0 7 $BI !L0 at 4(& +M !$ # !IJ0 '*@$" 4 2 P >:D .A&!@@( $0 , )^I \O08( +M" !$ # #.J0 W#$%""4 2 P Y:D .!8!@B) $@ , "J < +M7 at D(" !$ %P ?J@ *($&" 4 2 P .ZH -^J!P at . $@ , $NJ +M @: D(! !$ %P!BJ@ ]&L)"! 1 !< ?JH +P(!P@, $0 , +M )FJ #PWP@(! !$ #@"MJ@ (!X'" P 1 P PZH /Q4!@@8 +M$0 , .>J \5P8(" !$ # (JP + 4%" @ 1 P +ZL /31!@@% +M $@ , $6K !X, 4(30 !( # ! D(! !$ %P VK 9+ $" < 2 +M P 3ZP )1V"0 at 0 $0 7 &FL "\9 8(!0 !( # "%K 6%X)" 0 +M 1 !< I:P 'QO!P at 5 $@ , +&L "DJ 0(!P !( # #"K 26\' +M"!L 2 P T*P -$," B1 $@ , .2L !@:@D(! !$ %P 8K0 +M 'P 2 *:T ( O!P@( $0 , $"M !()P<(# !$ # != +MK0 ?- (" 0 1 X P "L;0D($ !$ %P!@L ,&<)" 0 1 !< +M at K - Z" @" $@ , )&P #P<@D(! !$ %P"]L $"<*" 0 1 +M !@ RK E $@ -RP "T7PD(" !$ %P#WL P%X)" 0 +M 1 !< %;$ #6$!P@/ $@ , !ZQ T:@D($ !$ %P!%L0 =. ' +M""( 2 P 5K$ *C(" @( $0 . '*Q !@8 D(! !$ %P"0L0 +MK%P)" @ 1 !< K+$ #A>"0@$ $0 7 ,FQ #TZP8($ !$ # #C +ML0 4/$$" @ 1 P ^[$ 'QW"0@( $0 7 !&R #P;@D($ !$ +M%P ML@ ) ,&"!@ 1 P 2+( /AN!0 at 0 $0 , %ZR !0> D(! +M !$ %P!XL@ W H(" @ 1 P BK( -1(!0@, $0 , +2R "\8PD( +M$ !$ %P#4L@ ?KX'"&( 2 P YK( "!P"0 at 0 $0 7 6S +M <0 !( 6LP 'D 2 )K, +3K" @( $0 . #ZS +M #\/ 8(# !$ # !2LP 4 4%" @ 1 P ;+, ( R!P@( $0 , +M (.S "DW at 0(# !$ # "?LP ]&@'"!P 2 P K;, "#=" @( +M$0 . -&S #@0P8(!P !( # #ILP A'0)" 0 1 !< "[0 %"]" @$ +M $0 . !*T #CM0<(? $ !( # =M 6%\)" @ 1 !< .+0 *3? +M" @, $0 . %:T $VP0(# !$ # !RM G (" @ 1 P @[0 +M &"]" @( $0 . ).T " -0<(" !$ # "JM &6\'" D 2 P +MN+0 ^U!PA> $@ , ,6T !D> D(" !$ %P#?M =$,&" < 2 +M P ];0 # 4!P@( $0 , !&U "4W@@(" !$ #@ EM0 '+@%" P +M 1 P /[4 +QM"0 at 0 $0 7 &VU "$> D($ !$ %P"%M0 V&\) +M"! 1 !< I+4 !1[!@@0 $0 , +NU !H80D(! !$ %P#@M0 +MP$,'" P 1 P ]K4 .QF"0@$ $0 7 "&V "P( !( S +MM@ @ D'" @ 1 P 2[8 #Q1!@@( $0 , 'RV !<<0D(! !$ +M%P"5M@ +/H'" L 2 P KK8 +!N"0@< $0 7 ,BV "$)P4(+P +M !( # #@M@ /.T&"! 1 P ^+8 "R $@ !"W ([ 4( +M" !$ # FMP K-P(" 0 1 X 4[< *QR!0@, $0 , &VW S +M< <(<@ !( # !XMP YVH'" @ 2 P B;< "S9!@@, $0 , )^W +M D) <(# !$ # "\MP V',)" @ 1 !< V+< -;P!P at . $@ , +M /*W L\@@(" !$ #@ %N ,W\'"!D 2 P $+@ &SN" @( +M$0 . "RX "DQP4(# !$ # !"N D (%" @ 1 P 9;@ A +M $@ 'BX #PF@@(J0( !( # " N %H 2 D+@ $UQ +M!PAR $@ , )^X D$@<(# !$ # "WN +/X'" @ 1 P R+@ +M 'Q>"0@$ $0 7 ."X 0;P<("0 !( # #MN H6<'"!\ 2 P +M^K@ !1Q"0 at 0 $0 7 !BY #$8 at D(" !$ %P \N0 \#(%""4 2 +M P 4KD #N $@ &2Y #<9 D(" !$ %P"%N0 Y%T&" P +M 1 P G;D QW"0 at 0 $0 7 +>Y "$+04(!P !( # #CN0 K'0) +M" 0 1 !< _;D . L!P@( $0 , !*Z \D at 8(# !$ # ON@ +MA*T&"!@ 1 P 4[H 3*!PBM $@ , %ZZ "LZ @(" !$ #@!Z +MN@ C[T'"%\ 2 P C;H (1?"0@( $0 7 *JZ "8:0<(.0 !( +M# "YN@ /- (" @ 1 X U+H +Q+!0@' $@ , /:Z TV @(# +M !$ #@ -NP 4! 2 '[L +!C"0@$ $0 7 #6[ "H804( +M" !$ # !2NP 1&<)" 0 1 !< ;;L '!E"0 at 0 $0 7 (Z[ "@ +MR @(" !$ #@"QNP ,"@%""4 2 P S[L - [" @" $@ , .&[ +M [0<(B0 !( # #UNP I&0)" @ 1 !< $+P 'ON!P at - $@ , +M "R\ #\=0D($ !$ %P!$O . ,'" P 1 P 9;P %10!P at 0 +M$0 , (&\ !(>@D(! !$ %P"@O ,#L(" ( 2 P K[P /1>"0@( +M $0 7 ,R\ #\W @(! !$ #@#CO A%L&" P 1 P #;T .C5 +M! @( $0 , #"] #(\ <(#@ !( # !*O0 (-X(" @ 1 X 9+T +M $0"!P@( $0 , )"] 4S@<(" !$ # "TO0 <+H&"! 1 P +MS;T '1@"0@$ $0 7 .R] !$8PD(! !$ %P (O@ K 0%" P 1 +M P (;X !O"0@( $0 7 #V^ #4=PD(! !$ %P!AO@ 5' )" 0 +M 1 !< >[X +!J"0 at H $0 7 )>^ ",8 D(" !$ %P"OO@ %"<* +M" 0 1 !@ O+X * P!P@( $0 , -.^ #8\P<(.P !( # #CO@ +MB, &" @ 1 P ^+X %QH"0 at 4 $0 7 !F_ !((P@(" !$ # I +MOP R.H$"! 1 P 1K\ "@.!@@, $0 , &"_ "8:PD(" !$ +M%P!XOP W%@)" 0 O'_B;\ (!L"0@( $0 7 +*_ .@ +M !( #'OP 5#L("!D 2 P V+\ ) 2!P@, $0 , .V_ !LLP@( +M;P !( # #YOP V' )" @ 1 !< $, #@6!P@( $0 , "C !\ +MZ0@(# !$ #@!'P #] '" X 2 P 7< %C'!0 at 8 $0 , 'G +M D:@D($ !$ %P"=P 7&0)"! 1 !< O< BA!@@, $0 , +M -K #DU0<(" !$ # #IP +Z,("!8 2 P ^, )#H!PB@ +M$@ , K! !0'P<(# !$ # AP0 :%L&" @ 1 P 2,$ 3_!0@( +M $0 , &+! ,108(!P !( # !VP0 ?&()" 0 1 !< D\$ 3T +M! @, $0 , *O! #!0@, $0 , )?" !D:P<(:@ !( # "JP@ X&P)"! +M 1 !< RL( "#P! @0 $0 , .+" #\9 at D(! !$ %P "PP P/ & +M" P 1 P %\, /IJ!PAJ $@ , "O# #,=PD(" !$ %P!"PP +MD#D(" ( 2 P 3\, )C@!PAD $@ , &+# P'@@(" !$ # !Q +MPP ]-\(" @ 1 X A<, %@T!@@0 $0 , )G# #P7PD(! !$ +M%P"]PP )0 2 S\, -#B!0@, $0 , .3# #X9 at D(! +M !$ %P *Q '+$$"!@ 1 P )\0 &PK!0A_ $@ , $?$ H4 4( +M!P !( # !;Q ."D'" @ 1 P =,0 $@Y!P@, $0 , (C$ ! +M)04(& !$ # "IQ !&$)" 0 1 !< T<0 " O!P@( $0 , .C$ +M #HZP@(! !$ #@#ZQ T&D)" 0 1 !< )L4 ,8^" @. $@ , +M #'% #0"0@$ $0 7 *+( "(^P<( +M" !$ # "VR X/8'"( 2 P R,@ )7N!P at - $@ , .3( #\ +MZ00(" !$ # #ZR ]*D$" @ 1 P %"0@$ $0 7 +M &S) P.@@( @ !( # !ZR0 ""\%" < 2 P E\D )[P!P at . +M$@ , +') ! V@<(HP !( # "_R0 /&,)" @ 1 !< W\D '1?"0 at 0 +M $0 7 /K) "8U08(" !$ # 6R@ %&T)"! 1 !< -LH /#( +M" @< $0 . %3* $<@D(" !$ %P!OR@ P/<%" 4 2 P D D(! !$ +M%P!@S Y+X(" @ 1 X >,P /0[" @9 $@ , (W, !3C0<(X +M !( # "9S 7 D(" @ 1 P L\P #C>" @( $0 . ,;, #8(P<( +M# !$ # #9S B.L(" @ 1 X ],P !!@"0@$ $0 7 _- +M J@$ !( DS0 6+ &" @ 1 P 0,T !1?"0@( $0 7 %_- +M !,'0<(# !$ # !\S0 A'4)" @ 1 !< H&,)" 0 1 !< +M!\\ " U!P@( $0 , ![/ #8 @<(!0 !( # !&SP ;.H("% 1 +M X 9,\ #!N"0 at 0 $0 7 '[/ !LF 0(& !$ # "/SP ^%T)" 0 +M 1 !< K<\ ! !@ $@ ,+/ L#08(# !$ # #7SP N,@( +M" @ 1 X [L\ QO"0@( $0 7 !#0 "P7P8(" !$ # IT +M 'D)"! 1 !< 2= +#E!0 at 0 $0 , &O0 #,7PD($ !$ %P") +MT 7#<'" P 1 P F] )Q@"0 at 0 $0 7 +/0 #L[P<(+ !$ +M# #-T *-P$" P 1 P YM #?" @0 $0 . G1 # .0<(# +M !$ # DT0 $&()" @ 1 !< /M$ /S5!@@, $0 , %O1 # I0<( +M at 0 !( # !QT0 :, &" @ 1 P E-$ !E"0@( $0 7 +S1 !P +MX at 0($ !$ # #8T0 / (""P 1 P [=$ !@G"@@$ $0 8 /K1 +M "X: D(! !$ %P 7T@ ^+ %" @ 1 P .-( &5F!PC+ $@ , +M $/2 !D^@<(+ !$ # !5T@ 1)D'" L 2 P 8]( '!>"0@$ +M$0 7 (#2 "D< D(* !$ %P"@T@ )/((" 0 1 X LM( (@=!0@% +M $@ , ,O2 #SP <(#P !( # #?T@ X&$)" 0 1 !< ]M( /QW +M"0 at 0 $0 7 !/3 "L(0<(# !$ # LTP )'()" @ 1 !< 1-, +M .S:! @, $0 ,  !<_@<(" !$ # !STP @"@*" 0 1 !@ +MA-, %*&!P at 0 $@ , )'3 (X at 0(!0 !( # "ITP -/((" 0 1 +M X O=, %P%!0@( $0 , -K3 L;0D($ !$ %P#XTP "*,'"(T +M 2 P #=0 .#W!@@0 $0 , "+4 !0.@@( @ !( # PU A (% +M" @ 1 P 4-0 (QW"0@$ $0 7 &K4 !0 P4(" !$ # ")U +M9&D'"!( 2 P F=0 &S?!P at W $@ , *W4 #D_0<(" !$ # "[ +MU ]/\'" @ 1 P S-0 +QU"0 at 0 $0 7 .;4 #8^0<(! !$ +M# "U0 K$P&" P 1 P (]4 ,PZ!P@( $0 , #[5 "8F 0(& +M !$ # !.U0 M/$$" P 1 P <-4 )@K"@@, $0 8 'C5 (9 D( +M" !$ %P";U0 #8 2 M]4 #33!P@( $0 , ,C5 ( +M40<(# !$ # #?U0 .4! 2 [M4 "A_!@@, $0 , K6 +M "@7 D(! !$ %P AU@ ^&P%"! 1 P /=8 #AX"0@( $0 7 +M %?6 ,X @(" !$ #@!MU@ O&8)" @ 1 !< B-8 *07!0@' +M$@ , *+6 "4\' +M" T 2 P 9]@ * M!P@( $0 , 'S8 T)PH(! !$ & "'V +M#'@)" 0 1 !< H-@ )QW"0@$ $0 7 +[8 4W0@(# !$ #@#B +MV M&L)"! 1 !< ^M@ ,QC"0@$ $0 7 !C9 ",<@D(" !$ +M%P [V0 NO '" X 2 P 5=D $QZ"0@$ $0 7 &O9 T.@@(&0 +M !( # ![V0 /4&"! 1 P D-D &B]" @, $0 . )_9 $9PD( +M! !$ %P"\V0 O&@)" @ 1 !< T]D )2J!@@( $0 , /#9 "T +M! @(" !$ # (V@ \-T(" 0 1 X (=H #' !P at F $@ , #+: +M #H4 at 8(& !$ # !;V@ 5!(%" @ 1 P ==H !#-!@@0 $0 , +M )3: @:0D(" !$ %P"WV@ -! %" @ 1 P S=H !!G"0@$ +M$0 7 .W: #4W@<(-P !( # #^V@ 8#$'" @ 1 P %=L -?/!P at . +M $@ , "O; "E< <(J !( # \VP T*\%" P 1 P 6=L %Q> +M"0@$ $0 7 'C; #T$ @(+ !$ # "+VP !%T'"!@ 1 P IML +M "#H!0 at 0 $0 , ,G; 0<0D(! !$ %P#CVP '&H)" @ 1 !< +M"MP )0+!@@, $0 , "3< #$7 at D($ !$ %P!!W P+D(" P! 2 +M @P 2]P $35!PB6 $@ , %7< !L @(* !( # !JW U' )" 0 +M 1 !< @-P *30!@@( $0 , )S< !T <(#@ !( # "RW @&$) +M" 0 1 !< W]P "1O"0 at 0 $0 7 /?< !X%0@(" !$ # %W0 +M5 0(" @ 1 P '-T (.$!P at O $@ , "W= "D:PD($ !$ %P!% +MW0 ),X'"%0 2 P 8=T !1J"0@( $0 7 (C= !X\0@(" !$ +M#@"CW0 H'<)" 0 1 !< NMT '19!@@O $@ , ,_= #]OP<(- +M !( # #;W0 -&$'" P 1 P \-T ,!@"0 at 0 $0 7 ;> !@00<( +M# !$ # 9W@ !)D&" @ 1 P .]X )AP"0@( $0 7 %?> "D +M7 at D($ !$ %P!VW@ 5 $(" @ 1 P C=X , at W!P@, $0 , *;> +M #D<0D(" !$ %P##W@ S'8)"! 1 !< W=X !@-!@@' $@ , +M /#> " R @(( !$ #@ +WP S&T)"!P 1 !< )=\ %1K"0@$ +M$0 7 $G? 8-08(# !$ # !=WP GL4'"%0 2 P :M\ #01!0@, +M $0 , (;? ",F 8(" !$ # "CWP /4# 2 KM\ "P' +M" @( $0 , ,?? !T'P4(" !$ # #CWP #8&"! 1 P ^-\ +M #!I"0 at 0 $0 7 "'@ P> D(" !$ %P \X 2%\)"! 1 !< +M9> #QK"0@( $0 7 (/@ "<# 4(# !$ # ">X ;;4'"'8 2 +M P J^ ."I! @( $0 , ,3@ !8< D($ !$ %P#CX Y $(" @ +M 1 P ]N +AA"0@( $0 7 !?A L/P<(# !$ # XX0 5-X( +M" 0 1 X 3.$ --N!P@( $@ , %CA #DSP8(" !$ # !TX0 +M &H)" 0 1 !< GN$ !M @ $@ *GA TD at 0( !( "@"O +MX0 "X'" @ 1 P R^$ % N!0@' $@ , .7A #D)@H(! !$ +M& #OX0 5-L(" 0 1 X "^( /1J"0@( $0 7 "WB #XW at 4(!0 +M !( # !+X@ .-$%"! 1 P 9N( $1J!P@? $@ , 'WB ! *PH( +M0 !$ & "1X@ HF@'""D 2 P G>( .QI"0 at 0 $0 7 ,'B \ +M! 4(" !$ # #AX@ ,' )"! 1 !< ">, !!D"0 at 0 $0 7 "GC +M IE@<(L@ !( # VXP G!H&""4 2 P 2N, &!T"0@( $0 7 +M &GC "T8PD(" !$ %P")XP *& )" 0 1 !< J^, -SK" @( +M$0 . ,3C !88 D(! !$ %P#8XP $&D)" 0 1 !< _>, * 6!@@, +M $0 , !?D ,9PD(! !$ %P WY ')D&" P 1 P 4.0 +$_ +M" @% 0 $@ , %KD !,6 <(# !$ # !VY O\ '"!4 2 P AN0 +M ,#Q!PA; $@ , )CD ,:0D(! !$ %P"QY *#$%" < 2 P +MQN0 $&F!P at J P $@ , -'D #P70D(" !$ %P#LY 6',)"!0 1 +M !< $N4 ! \" @" $@ , ";E !X"08($ !$ # ^Y0 E!(%" < +M 2 P 4^4 AB"0@( $0 7 '+E !4A <(+P !( # "%Y0 8%\) +M"! 1 !< H.4 $ P!P@( $0 , +7E "L\ <(#@ !( # #/Y0 +M""D*" 0 1 !@ V.4 /Q"!P@( $0 , /+E C08(# !$ # 2 +MY@ 9&P)" 0 1 !< ,^8 %S[!P at 8 $0 , $#F "<_ 4(# !$ +M# !>Y@ \&P)"! 1 !< ?N8 -!:!@@, $0 , *CF "(0 at 8(# +M !$ # "^Y@ _-\(" @ 1 X TN8 #B!@@, $0 , ./F "PWP@( +M# !$ #@#^Y@ 5%L)" @ 1 !< $>< $QN"0 at 0 $0 7 ##G P +M,04(+P !( # !'YP B%@&" @ 1 P :N< ) [" @" $@ , 'KG +M "TW @(# !$ #@"@YP #"L%"%< 2 P PN< &1B"0@$ $0 7 +M -_G "4< D(! !$ %P#_YP !-$&" @ 1 P %N@ !AF"0@( +M$0 7 #OH ",9 at D(" !$ %P!7Z -+H%" P 1 P =.@ 'C2" @4 +M $0 . )3H &P( !( "FZ S(4&" P 1 P O.@ #S] +M!P@( $0 , -/H #X8PD($ !$ %P#SZ _VD'"!< 2 P _>@ +M ##I!PAW $@ , !;I "0<0D(% !$ %P VZ0 7!P'"!@ 1 P +M4ND (P)!P@( $0 , &WI #1:0<(%P !( # !WZ0 ?!$%" @ 1 +M P F>D "@$!0@( $0 , +WI !T+ 4(=0 !( # #CZ0 U$L&" 4 +M 2 P #.H "1L"0 at 0 $0 7 "OJ #M at P<(%0 !( # YZ@ U#D( +M"!D 2 P 2.H 1L"0@( $0 7 %OJ #RQ0<(CP !( # !IZ@ +M1/<%" @ 1 P @.H '3H %Q@"0@$ $0 7 .?J ",5 8(!P !( +M# *ZP J&(%"! 1 P )>L %!*!0A# $@ , $CK #9O <( +M ! # !2ZP \& )" 0 1 !< ;>L + [" @" $@ , '[K !<^@4( +M$ !$ # "JZP _&D)" 0 1 !< UNL #BK! @, $0 , .OK ! +M?P<('0 !( # #QZP -*D$" < 2 P !NP ,QL"0 at 0 $0 7 ";L +M #LL at 8(" !$ # Z[ T- '"!,! 2 P 1^P $?N!P at - $@ , +M &/L DJ 0(!0 !( # !T[ $"D*" 0 1 !@ @.P 'R]!@@0 +M$0 , )_L #,< D(" !$ %P"\[ " L&" @ 1 P W^P Z +M $@ /'L "TZ @(" !$ #@ 6[0 .L&"! 1 P ,.T .1J +M"0 at 0 $0 7 $OM !B#0@(D0 !( # !?[0 "&(%" @ 1 P >^T +M "!V!@@0 $0 , )#M HO08(" !$ # "U[0 ).,(" @ 1 X +MT>T +A@"0@( $0 7 /'M "(_ <(" !$ # *[@ #8 2 +M &NX *Q7!@@8 $0 , #SN #<: D(" !$ %P!6[@ R-\("! +M 1 X >NX +1@!@@, $0 , )3N #<=0D($ !$ %P"S[@ ^%\) +M" 0 1 !< V>X "IO!P at + $@ , .?N !8K08(& !$ # )[P +M&' )" 0 1 !< (N\ . O!P@( $0 , #GO 6 !( !, +M[P T& )" @ 1 !< 9.\ %!@"0@$ $0 7 (#O T_P<(" !$ +M# "7[P *&D)" @ 1 !< NN\ BZ!@@( $0 , -/O "4"0@(" +M !$ # #M[P G*D$" @ 1 P !O ,QN"0@< $0 7 "#P "L?P8( +M# !$ # Y\ ^&\)"! 1 !< 6/ ,C " @, $0 . 'CP !< +M+ H(! !$ & ",\ M'8)"! 1 !< IO *!J"0@$ $0 7 ,'P +M #H @8($ !$ # #:\ ' ,'"!@ 1 P O$ #1D"0@$ $0 7 +M "3Q / !( Y\0 V%X)" 0 1 !< 6/$ .AC"0 at 0 +M$0 7 'CQ !(, 4()0 !( # "0\0 :+$'"%< 2 P I?$ *1?"0 at 0 +M $0 7 ,+Q 8Z0@(! !$ #@#6\0 I"L*" 0 1 !@ V?$ "#V +M!PB^ $@ , .CQ !H*@4(!0 !( # 1\@ (!@@, $0 , .7S "8"0<(" !$ +M# #]\P 1$L%"'4 2 P (/0 +#R" @$ $0 . #ST ",V 0(# +M !$ # !5] M&()"! 1 !< ;?0 (C;!P at B $@ , '[T "^:@<( +M"0 !( # "-] 7.H("! 1 X J_0 +S,!P@( $0 , +CT , +M=@D($ !$ %P#2] +"<*" 0 1 !@ X?0 *#>" @$ $0 . /CT +M #,2P8(& !$ # A]0 -&L)" @ 1 !< 2?4 #Z!P at + $@ , +M &+U " 90D(" !$ %P"(]0 (#('" @ 1 P G_4 %AE"0 at 0 +M$0 7 ,#U !@T 4(!0 !( # #8]0 O"<%"&L 2 P [O4 +#[!P@( +M $0 , /WU !D5@<(# !$ # 4]@ H:H'"!$ 2 P )/8 ,1L +M"0@( $0 7 $WV C at 8(# !$ # !J]@ M $(" @ 1 P @?8 +M "1T"0 at 0 $0 7 )SV !09PD(! !$ %P"^]@ A 0(" @ 1 P +MT?8 ,QS"0@$ $0 7 .GV #<"@8(" !$ # .]P A%X)" 0 1 +M !< +?< !3=!P@( $0 , $3W (K00(# !$ # !8]P 0YH'"!P +M 2 P :_< &"%"0@$ $0 8 'WW !T7@<($ !$ # "8]P ;%D& +M" < 2 P LO< -QQ"0@( $0 7 -#W ,7 at D(" !$ %P#P]P +MM&0)"! 1 !< "_@ #C=" @$ $0 . "SX "<7 D(! !$ %P!3 +M^ " ('" P 1 P ?/@ &2%"0@$ $0 8 ([X "]?@<(( !( +M# ":^ -,P(" 0 1 X M/@ )SZ!P@( $0 , ,;X 8[ @(! +M !$ #@#9^ 5'@)" @ 1 !< [_@ -1I"0@$ $0 7 !OY ",# 8( +M" !$ # !!^0 T# %"%< 2 P 5_D #1T"0@$ $0 7 'WY !( +M> D(" !$ %P"<^0 \#D(" ( 2 P J?D / S!0@, $0 , ,OY +M T90D(' !$ %P#L^0 0'@)" 0 1 !< "OH + "!P@% $@ , +M #/Z #,=0D($ !$ %P!+^@ $&,)" @ 1 !< :?H /CI" @( +M$0 . (3Z !(:0D($ !$ %P"O^@ =/X'" @ 1 P P_H /"O! @Y +M $@ , -?Z "$SP8(" !$ # #L^@ R:\'"!\ 2 P ^?H ,#? +M" @$ $0 . !7[ #$W0@(! !$ #@ M^P ?&,)""@ 1 !< 3/L +M $B(!@@0 $0 , '+[ X# 8(" !$ # "?^P &&<)" 0 1 !< +MO_L +:4!P@& $@ , ,W[ !L/0@( 0 !( # #@^P ]#H("!D 2 +M P \?L %1R"0@( $0 7 G\ ",=0D($ !$ %P A_ #P +M 2 +?P PM" @( $0 , #[\ 0_P O%P)" @ 1 !< ?O\ -3H +M" @$ $0 . )__ !8304(# !$ # #&_P > P&" @ 1 P ZO\ +M .KY!P at + $@ , , 0"P!04(" !$ # ; $ %%P'"!@ 1 P +M1 ! $&>!P at F $@ , %$ 0 DW04(" !$ # !I $ ?&<)" 0 1 +M !< AP ! &!?!0 at 0 $0 , )T 0 [@\ !( "P $ *&<)" 0 +M 1 !< U0 ! )0#" @( $0 , .P 0#$!@8($ !$ # & 0$ H&L) +M" 0 1 !< ) $! $3>" @$ $0 . #H! 0#0.0@( @ !( # !' 0$ +M##(%"-P 2 P 80$! $07!0@( $0 , ( ! 0!H= D(! !$ %P"? +M 0$ (/((" 0 1 X N@$! 'AA"0@$ $0 7 .4! 0 ,90D(" !$ +M%P - @$ (+P%" P 1 P )P(! "0=!0@, $0 , #\" 0 ,7PD(" +M !$ %P!: @$ [ @(" @ 1 P @$ X'()"! 1 !< R (! 'A:!0 at 0 $0 , .," 0 +M *3X !( #W @$ 6"@%" < 2 P % ,! !BQ!PA0 $@ , "<# +M 0#(1 8(0P !( # \ P$ K'$)" @ 1 !< 6@,! &@3!P@, $0 , +M ',# 0 DY08(# !$ # "- P$ 6,<(" 0 1 X I@,! .!I"0@$ +M$0 7 -(# 0#T P@(" !$ # #I P$ "%X)" 0 1 !< !@0! *@K"@@, +M $0 8 X$ 0!,Q at 8(" !$ # C! $ ,4$ 2 + at 0! &@X +M!P@, $0 , $$$ 0"8U <(D !( # !+! $ X',)" 0 1 !< : 0! +M $!0!0 at 0 $0 , (8$ 0!$80D(! !$ %P"R! $ Y-$'" 4 2 P +MP00! +0K"@@, $0 8 ,D$ 0!H; D(" !$ %P#J! $ P&<'""D 2 +M P ]P0! (1W"0@$ $0 7 P% 0!D_P4(" !$ # >!0$ A"L*" 0 +M 1 !@ *P4! #P:!@A7 $@ , $ % 0"<'0<(# !$ # !7!0$ :!\% +M" @ 1 P < 4! /1E"0@$ $0 7 (T% 0!(80D($ !$ %P"X!0$ +M8#$%" < 2 P S at 4! (S4" @$ $0 . .@% 0"L80D(! !$ %P 2 +M!@$ B"L*" 0 1 !@ )@8! )QU"0 at 0 $0 7 #X& 0"\%@<(# !$ +M# !A!@$ 1.P'"!H 2 P = 8! )C=" @, $0 . )\& 0#DR @(# +M !$ #@#&!@$ M'<)" 0 1 !< W 8! #SI" A $0 . /H& 0#<=PD( +M! !$ %P 2!P$ E&L)" 0 1 !< *P%4&"! 1 +M P A0D! '!="0 at 4 $0 7 *4) 0!<'P4(" !$ # #!"0$ X,<&"! +M 1 P X D! -BR!@@, $0 , /X) 0#H:0D(! !$ %P I"@$ C,4& +M" @ 1 P 10H! & G"@@$ $0 8 $\* 0 H>0D(" !$ %P!E"@$ +M_%X%" P 1 P ?PH! '3L" @( $0 . ),* 0!\" @(" !$ # "L +M"@$ I-P(" @ 1 X R H! (QJ"0 at 0 $0 7 -X* 0"8W 8($ !$ +M# #W"@$ ?%,&" 4 2 P ( L! !S@!PA7 $@ , #4+ 0"(9PD(" +M !$ %P!*"P$ ["8*" 0 1 !@ 5 L! "1>"0 at 0 $0 7 '(+ 0 SK0<( +MD0 !( # "&"P$ !%X'" P 1 P HPL! /P(" @( $0 , + at + 0"5 +MHP<(A@ !( # #)"P$ V&D)" 0 1 !< ]0L! #1.!0@, $0 , !H, +M 0"LEP0( !( # A# $ "&<)" 0 1 !< 0PP! "AY!@@0 $0 , +M %@, 0 (; 4(# !$ # !U# $ ^',)" 0 1 !< D0P! %!>"0@( +M$0 7 *X, 0!P* <(" !$ # #)# $ W&L)" @ 1 !< XPP! AC"0@( +M $0 7 /D, 0"R00@( 0 !( # +#0$ 2!L'" @ 1 P )PT! $1K +M"0@( $0 7 $@- 0" ;@D(! !$ %P!I#0$ : ('"!@ 1 P D at T! +M (#)!0AU $@ , *T- 0"(W 0(" !$ # #)#0$ &*P$" P 1 P +MW T! &1O!P@( $@ , .T- 0#@90D(" !$ %P 6#@$ E#D("!D 2 +M P )0X! /0Y" @9 $@ , #0. 0"0S <(+ !$ # !"#@$ )!8'" @ +M 1 P 70X! (!B"0@( $0 7 'P. 0 ,JP0(!P !( # "0#@$ _$P& +M"! 1 P P at X! $#*" @, $0 . .$. 0"8;PD(" !$ %P ##P$ +MC%P)" 0 1 !< &P\! + at 1" @( $0 , "D/ 0#(" @( $0 . #,2 0""@0<((@ !( # !"$@$ U, '"!\ 2 P +M5A(! "SI" @0 $0 . &X2 0# L 8($ !$ # "4$@$ &%$&" P 1 +M P O1(! *!8!P at 0 $0 , -D2 0#\<@D(! !$ %P %$P$ \.('"* +M 2 P &!,! #C0!0 at 8 $0 , # 3 0#L=PD($ !$ %P!-$P$ 4'H) +M" ( 1 !< 8A,! &P/!0@( $0 , '@3 0#];@<("P !( # "%$P$ +M)&8)" P 1 !< GQ,! '0'" @( $0 , +03 0#\_0<(" !$ # #' +M$P$ =#D("!D 2 P UA,! */O!P at - $@ , /$3 0 4\@@(! !$ +M#@ (% $ 7&D)" 0 1 !< -!0! #MH!P at I $@ , $ 4 0"PE <(!@ +M !( # !8% $ S,P(" P 1 X ;A0! $1U"0 at 0 $0 7 (@4 0!4 P4( +M?P !( # "?% $ V*H$" @ 1 P NQ0! )AB"0@$ $0 7 -$4 0!T +M9 D(" !$ %P#X% $ 0"T'" @ 1 P #Q4! 'S_!P@( $0 , "L5 +M 0"<90D(# !$ %P!-%0$ ; 4%" P 1 P 9!4! #X!P at 0 $@ , +M 'H5 0!H;PD($ !$ %P"2%0$ )&T)" @ 1 !< MA4! .0B!@@, +M$0 , -$5 0 LJ 0(;0 !( # #A%0$ 8!(%" @ 1 P _A4! 'A&!@@' +M $@ , "46 0"XM 0(!0 !( # !"%@$ ) 0(" @ 1 P 518! .SD +M!@@, $0 , &X6 0!(Y@@(! !$ #@"*%@$ O.L(" @ 1 X HQ8! +M *S;!P at B $@ , +P6 0!T+P4(.0 !( # #6%@$ ?.\'" T 2 P +M\18! ,#6!PB^ $@ , /X6 0#$=@D(" !$ %P 6%P$ X' )" @ 1 +M !< ,A"0 at 0 $0 7 $48 0 $\@8($ !$ # !F +M& $ B H&" @ 1 P AQ@! *0)" @( $0 , )T8 0#@9 at D(! !$ +M%P#"& $ .8 2 V1@! " I"@@( $0 8 .D8 0",Y08(# +M !$ # #&0$ [ ('" P 1 P +!D! "!G"0@$ $0 7 $L9 0 +M3 !( !@&0$ 8'@)" 0 1 !< >AD! ,AA"0@$ $0 7 )09 0#@ +M*PH(> !$ & "C&0$ 6&\)"! 1 !< PAD! !2H! @% $@ , -$9 +M 0" ! 4(# !$ # #I&0$ F"8%" < 2 P !QH! $S6!@@0 $0 , +M " : 0 XQP8(" !$ # !'&@$ #*\%" @ 1 P 9!H! (PI!0@, +M$0 , (T: 0"RJ@<(& !( # ">&@$ ;"P%" < 2 P N!H! $1X"0@$ +M $0 7 - : 0!$[ @(" !$ #@#D&@$ 4/0'"!P 2 P ]QH! .!Y +M!@@, $0 , P; 0"PY@<(H !( # C&P$ 3&T)"! 1 !< 0QL! +M #1G"0 at 0 $0 7 %L; 0# ]P0($ !$ # "#&P$ C$4&" < 2 P +ME1L! +:T!PA9 $@ , *0; 0#$WP@(! !$ #@# &P$ >K\'"(, 2 +M P SAL! ,!;!P@, $0 , .,; 0"4*PH(! !$ & #Q&P$ ("4%" < +M 2 P !QP! C@" @$ $0 . !T< 0! < D($ !$ %P \' $ VX ' +M"*< 2 P 1!P! $#>" @$ $0 . %<< 0!D<@D(" !$ %P!W' $ +M(.P(" 0 1 X D!P! - "!P at 8 $0 , +@< 0 T]P4(!0 !( # #2 +M' $ I H(" @ 1 P Y!P! Q!P@( $0 , /L< 0!DX00(" !$ +M# /'0$ S-(%" P 1 P ,1T! +#(" @( $0 . %8= 0 4] <(/ +M !( # !G'0$ 9*T&" 4 2 P B1T! Q7!0@, $0 , * = 0#(JP8( +M# !$ # #&'0$ DVX'"!X 2 P TQT! +QT"0 at 0 $0 7 /,= 0 4 +M8 D(! !$ %P 0'@$ 8!T%"!@ 1 P *1X! (1J"0@( $0 7 $0> +M 0!\8 D(" !$ %P!A'@$ ++ $" < 2 P =!X! *0%" @( $0 , +M (@> 0#H, at 4(!P !( # "A'@$ Z,T'" @ 1 P QQX! % $!0@( +M$0 , .H> 0"(@ <(* !( # #X'@$ #&$&" @ 1 P %1\! %CK!P@; +M $@ , "H? 0#4004(=0 !( # !''P$ GFT'"!L 2 P 5!\! (3K +M!@@, $0 , ' ? 0!((@$ J-X(" 0 1 X MB(! /C5! @, $0 , -(B +M 0 4W@@(" !$ #@#F(@$ Z$8%"&$ 2 P !2,! )RW!0AK $@ , +M !LC 0#F; <(( !( # G(P$ R&\)"! 1 !< /R,! *AQ"0@$ +M$0 7 %@C 0#<90D(! !$ %P!^(P$ @%X)" 0 1 !< G2,! "+ +M $@ + C 0"$' <(!0 !( # #,(P$ )&()" @ 1 !< Y2,! $37 +M! @0 $0 , /XC 0#4.P@(&0 !( # 2) $ \%,&" P 1 P .R0! +M )1B"0@$ $0 7 %@D 0",$04(# !$ # !P) $ >&H)" 0 1 !< +MG20! X]" A< $@ , +0D 0#T5P4(# !$ # #1) $ (ZL'"! " 2 +M P X20! *C+!0@% $@ , @E 0#T+ 4(0P !( # R)0$ .&$%" P +M 1 P 3"4! *@1!0A7 $@ , &$E 0"4L 0($ !$ # !Z)0$ G'0) +M"! 1 !< FB4! /!S"0@$ $0 7 +(E 0#H7PD(! !$ %P#:)0$ +ML&<)" @ 1 !< ^24! '3:! @, $0 , XF 0! $ 4(" !$ # G +M)@$ ^Y8'" @ 2 P -R8! & F" @( $0 , $"0@$ +M $0 7 *$H 0#4,04(!P !( # "W* $ .&,)" 0 1 !< U"@! *S$ +M!P at 4 $@ , . H 0#NO0<(D !( # #N* $ @"P*" 0 1 !@ ^2@! +M .1W"0@$ $0 7 !0D(! !$ %P"#*@$ +MR/<'"#4 2 P F"H! #O $@ *"0 at 0 $0 7 )!PA] $@ , +M ( L 0",J00(!P !( # "5+ $ [!,%" @ 1 P L"P! +Q>"0@$ +M$0 7 ,TL 0 L.08($ !$ # #E+ $ Y.P(" 0 1 X _2P! *&5!PB( +M $@ , LM 0"UG@<(%@ !( # 6+0$ .&8)" @ 1 !< 12T! &1; +M"0@( $0 7 %0M 0!0%P4(" !$ # !V+0$ I@\(")$ 2 P BBT! +M .QX"0@$ $0 7 *@M 0#@D(! !$ %P '+P$ +MT'(&" 4 2 P *"\! %S D($ !$ %P#P, $ D%X)" @ 1 !< #3$! ' *!0@( $0 , +M "DQ 0!,O@@(" !$ #@ \,0$ ; D(" @ 1 P 4C$! (6S!P at A +M$@ , & Q 0!\9 at D($ !$ %P!U,0$ ?"D*" 0 1 !@ AS$! &QO!P@( +M $@ , )(Q 0 $ D(! !$ %P!>,P$ U 4% +M" @ 1 P >3,! %QT"0@$ $0 7 )4S 0#H:P<(J !( # ":,P$ +MY.,%" 4 2 P OS,! P7!@@, $0 , -HS 0"8\P<(/@ !( # #I +M,P$ !HL'"! 2 P _3,! '69!PB, $@ , 8T 0!H 0<(" !$ +M# M- $ 1!\%" @ 1 P 1S0! "C=!P at U $@ , %DT 0#,90D(" +M !$ %P!Z- $ <%\)" 0 1 !< GS0! 0&" @( $0 , +,T 0 7K@<( +MP !( # #'- $ F%P)" 0 1 !< Z30! '!L!0@, $0 , ,U 0 +M3 at 4(!P !( # 6-0$ _',)"! 1 !< +34! "3D!@@, $0 , $ U +M 0"08 at D(! !$ %P!;-0$ J!L'" @ 1 P <#4! -SN!P at L $0 , +M (LU 0#PZP@(! !$ #@"G-0$ 1,<&" @ 1 P O#4! *36! @( +M$0 , - at U 0 \=@D($ !$ %P#P-0$ * L'" P 1 P $S8! $1H"0@( +M $0 7 "DV 0#H:0<(%P !( # R-@$ O-\(" 0 1 X 2C8! UT +M!PCC!P $@ , %@V 0 $@4(!P !( # !L-@$ D&D)" @ 1 !< H38! +M + O!0@' $@ , +HV 0!P$04(" !$ # #9-@$ >,X'"&4 2 P +M]S8! ) *!0@( $0 , ! W 0 T"P8(" !$ # V-P$ /$8&"#D 2 +M P 7C" @$ $0 . ( X 0 W0 !( +M "=. $ $H 2 KC@! $!Z"0@$ $0 7 , at X 0"LZ08($ +M !$ # #<. $ O)0'"+< 2 P Z#@! %Q#!P@( $0 , (Y 0"\Z @( +M! !$ #@ L.0$ *,! 2 .CD! 'F+!PC5 $@ , $\Y 0#< +M6 D( ! "\?]@.0$ C!X'" @ 1 P ?#D! 'RS!@@8 $0 , )LY +M 0!@*@4(& !$ # #$.0$ W/D'" 0 1 P XCD! $AR"0@( $0 7 +M /HY 0!8<0D(! !$ %P ..@$ Z',)" 0 1 !< +3H! . -!@@, +M$0 , $,Z 0 P8 8(" !$ # !<.@$ (.X'" 4 2 P :3H! )1X"0@$ +M $0 7 (,Z 0"\=08(# !$ # "<.@$ $"@'" @ 1 P LSH! @4 +M!0@, $0 , -,Z 0#$S at 8(" !$ # #J.@$ 1'H)" 0 1 !< SL! +M +AW"0@$ $0 7 !<[ 0"T9 at D(" !$ %P V.P$ N,8&" @ 1 P +M2SL! !A@"0@$ $0 7 &<[ 0"0W0@(! !$ #@"(.P$ LT$(" $ 2 +M P ESL! $"Y!0@( $0 , +,[ 0 $8 D(# !$ %P#4.P$ Z' )""@ +M 1 !< \SL! "> $@ (\ 0"4!@@(" !$ # :/ $ ]-T( +M"! 1 X -3P! "3/!@@( $0 , %$\ 0 XX0@(# !$ #@!L/ $ +M_% %" 4 2 P C#P! .3K" @$ $0 . *8\ 0#H+P4(5P !( # "_ +M/ $ >& )" 0 1 !< VCP! /S>" @$ $0 . /T\ 0 0_ <(" !$ +M# ,/0$ K*@$"$, 2 P 'CT! #Q?"0@$ $0 7 #T] 0 L7PD($ +M !$ %P!6/0$ ^/L'" @ 1 P 93T! (S4!P@( $0 , '0] 0#L/P<( +M# !$ # ")/0$ _, &"! 1 P I3T! $ M!0A# $@ , -(] 0#$ +M:PD($ !$ %P#H/0$ "&\)" 0 1 !< #X! H!@@0 $0 , !0^ +M 0 T=0D($ !$ %P N/@$ 5&8)"! 1 !< 2SX! (P3!0@( $0 , +M & ^ 0"\7PD(" !$ %P!U/@$ ,&8)" @ 1 !< FSX! &QD"0@( +M$0 7 ,P^ 0 &;0<(&P !( # #8/@$ -$$%" P 1 P 3\! (1S!0@, +M $0 , !T_ 0 JM <(0P !( # L/P$ P*T$" P 1 P 2S\! /#8 +M! @, $0 , &4_ 0"DF08(# !$ # ""/P$ ;/0'"$D 2 P D3\! +M D 0 $@ *$_ 0!X4@<($ !$ # "T/P$ ?+X%"! 1 P +MU#\! .1D"0 at 0 $0 7 .X_ 0!L<@D(" !$ %P &0 $ R/L'" @ 1 +M P %4 ! %2R!PCV $@ , "I 0 , , !( ]0 $ 1(0'"! +M 2 P 2T ! !#F!PB@ $@ , %U 0! ;PD(" !$ %P!_0 $ Z.P( +M" @ 1 X DD ! ) Z" @" $@ , *% 0 L:0<(' !( # "N0 $ +M@$(%"'\ 2 P S$ ! '!<"0@( $0 7 .= 0!$^@4(!0 !( # * +M00$ I!,&" @ 1 P '$$! & N!P@( $0 , #-! 0 H4P8(# !$ +M# !<00$ 7.\$" P 1 P @D$! #RI! A- $@ , )A! 0#P> D($ +M !$ %P"X00$ D&L)" 0 1 !< TT$! !."0@( +M$0 7 "-# 0!TO0@(! !$ #@ Q0P$ 2%4'"! 1 P 2$,! !W!@@% +M $@ , &!# 0"87P<($ !$ # !S0P$ -,,&" @ 1 P ET,! A- +M!0@, $0 , +Y# 0"8,04(" !$ # #>0P$ E-T(" 0 1 X $0! +M K $@ ]$ 0! 6PD( " %P :1 $ @6X'"!( 2 P +M)40! -@ " @4 $@ , "Y$ 0 P8P8(& !$ # !*1 $ .&0)" 0 1 +M !< :40! .P%!0@( $0 , (1$ 0 4^0<(/0 !( # "51 $ A&$)""@ +M 1 !< OD0! /P4!0 at 0 $0 , -M$ 0" P <(( !( # #P1 $ ,XX' +M"/ 2 P _40! $@4!P@, $0 , !5% 0 ! @, +M$0 , %%' 0 ?0 !( !A1P$ /!T'" @ 1 P ?4" @( $0 . ,U( 0!L8 D(" !$ %P#B2 $ +H +M 2 ]$@! -!A"0 at 0 $0 7 !1) 0!L= D($ !$ %P O20$ %&4) +M"! 1 !< 4$D! ,3(!0@, $0 , &U) 0!\80D(! !$ %P"520$ +M["P%" < 2 P NDD! ' !@@' $@ , ,Q) 0"<"@8(" !$ # #Q +M20$ -T! 2 TH! /C)!0@' $@ , !U* 0!<6PD(" !$ +M%P O2@$ O/\%"+0 2 P 0DH! &6U" B? $@ , $U* 0 A^@<("P +M !( # !F2@$ ,'D)" @ 1 !< ?$H! (0." B1 $@ , )!* 0#P[@8( +M!0 !( # "E2@$ I%P)" @ 1 !< P4H! #W)!PC' $@ , ,I* 0 +M N0$ !( #=2@$ S D(" @ 1 P ]TH! '!A"0@$ $0 7 "-+ +M 0#\]08(# !$ # X2P$ 7&()" @ 1 !< 6DL! -1E"0@( $0 7 +M ']+ 0 -@ !( "02P$ R# %" < 2 P IDL! .AA"0@( +M$0 7 +Q+ 0"H; D($ !$ %P#<2P$ 7%P)" 0 1 !< ]$L! + *!@@( +M $0 , !U, 0 *0H(! !$ & F3 $ GGX'"!\ 2 P ,DP! $QL +M"0@( $0 7 %%, 0#,J00(" !$ # !G3 $ T-L'"*, 2 P =4P! +M 'AG"0@$ $0 7 )), 0#LS@@($ !$ #@"P3 $ U% %"!@ 1 P +MT$P! "X $@ -U, 0!P; D($ !$ %P#V3 $ E#H("!D 2 +M P !TT! &0'" @( $0 , "!- 0 $;@D(# !$ %P Z30$ 5%P)" 0 +M 1 !< 44T! /AA"0 at 0 $0 7 &]- 0#SSP<(#@ !( # "%30$ 5\ ' +M""D 2 P FDT! !3^!P@( $0 , +!- 0"<:@D(! !$ %P#+30$ +M0%X)"! 1 !< ZDT! (1S"0 at 0 $0 7 A. 0"@9PD($ !$ %P F +M3@$ G$H%"* 2 P 2$X! ,07!0 at 8 $0 , &!. 0"T<0D(" !$ +M%P!V3@$ N!,'" P 1 P BDX! $3^!P@( $0 , )]. 0 T$0<(# +M !$ # "Z3@$ F#8'" P 1 P T$X! *QF"0@( $0 7 .U. 0!D=0D( +M$ !$ %P '3P$ <-,&" P 1 P (T\! )A!!P@, $0 , #Y/ 0 +M , !( !13P$ ['8)"! 1 !< :T\! #@?!0@( $0 , ()/ +M 0!$TP<(" !$ # "63P$ 9'X&" @ 1 P L$\! #QW"0 at 0 $0 7 +M ,]/ 0"L!P@(" !$ # #D3P$ X/L'" @ 1 P \T\! +CZ!P@( +M$0 , 10 0 .@ !( <4 $ <-\%"! 1 P 05 ! "QB"0@$ +M $0 7 %Y0 0!PS0<(" !$ # !P4 $ ;&H)" 0 1 !< G5 ! &AK +M!0@, $0 , +=0 0!L=@D(" !$ %P#/4 $ 1& )" @ 1 !< YE ! +M -Q8"0@ $ +Q__I0 0!?P<(%0 !( # 650$ X#('" @ 1 P +54! -AW +M!@@, $0 , $-5 0#@:@D(! !$ %P!@50$ .)P'"!4 2 P <%4! +M %EG!P at I $@ , 'U5 0"X; D(" !$ %P"850$ A&L)" 0 1 !< +MM%4! "1D"0 at 0 $0 7 -15 0#,<@D(! !$ %P 5@$ U/<%" P 1 +M P (%8! ,!A"0@( $0 7 $-6 0""9P<('P !( # !05@$ %&P)"! +M 1 !< ;58! %#F!@@, $0 , (E6 0#P)@H(! !$ & "25@$ 4%P) +M" 0 1 !< KE8! !* $@ ,56 0 $4P8(# !$ # #N5@$ +M^*\&" @ 1 P !5"0@$ $0 7 ,1: 0 8 D(! !$ %P#G6@$ D%P)" 0 +M 1 !< _5H! -3A! @8 $0 , !5; 0 D' @(" !$ # C6P$ ]'0) +M"! 1 !< 0UL! -W'!PB> $@ , %); 0 V0 !( !B6P$ +MZ, &" @ 1 P B%L! ,1Q"0 at 0 $0 7 *A; 0#0=08(# !$ # #! +M6P$ T H%" P 1 P U%L! )2Z!0@, $0 , /5; 0#<\04(# !$ +M# 87 $ 8 $%"! 1 P +5P! 0I"@@$ $0 8 $%< 0!TL 0(" +M !$ # !97 $ G <(" @ 1 P 0!0W@@(! !$ #@!77@$ 8%X)" @ 1 !< 0#LZP@(! !$ #@"K7@$ 9'$)" 0 1 !< Q%X! +M @@!0@' $@ , -A> 0!8# 8(" !$ # #_7@$ M @(" @ 1 P +M&%\! -3$!0@, $0 , #5? 0#4^ <(/0 !( # !%7P$ 1 4%" @ 1 +M P 95\! (P(" @( $0 , 'I? 0"]LP<(;0 !( # "$7P$ @&<)" 0 +M 1 !< H5\! &AQ"0@$ $0 7 +U? 0!$T 8(" !$ # #27P$ <.4' +M"* 2 P Y5\! %@N!0 at E $@ , /M? 0"(R at 4($ !$ # ?8 $ +MQ%\)" @ 1 !< -V ! '3K!PA< $@ , $Q@ 0# *PH(# !$ & !4 +M8 $ &$&" @ 1 P ;F ! C?!0@( $0 , (5@ 0#T<@D(! !$ +M%P"Q8 $ O'()"! 1 !< XF ! *AE"0 at 0 $0 7 UA 0"(90D(! +M !$ %P P80$ 4#L(" ( 2 P /V$! )#P!P at . $@ , %EA 0! _ <( +M" !$ # !H80$ ;3T("%D! 2 P @D(! !$ %P#>8P$ ,P'"!\ 2 +M P [6,! !1S"0@( $0 7 MD 0!P: D(" !$ %P ?9 $ U%D)" +M 1 /'_-60! #E $@ $5D 0 @= D(! !$ %P!M9 $ "&4) +M" 0 1 !< A60! )3L" @( $0 . )]D 0" / H( ! \?^D9 $ +M"0@$ $0 7 'QH 0 @9 D(! !$ %P"7: $ +M #( 2 J6@! 1="0 at 8 $0 7 ,]H 0"(" 4(# !$ # #E: $ +MI$8'" P 1 P ^&@! !Y $@ AI 0 0P !( : +M:0$ Q 8(" @ 1 P +FD! (QI"0@$ $0 7 %)I 0 LZ at 4(# !$ +M# !R:0$ D"L*" 0 1 !@ @VD! -C=! @, $0 , )UI 0#,W @(" +M !$ #@"^:0$ A!X%" < 2 P U6D! %S(" @$ $0 . .QI 0"T$ <( +M# !$ # &:@$ *.P(" P 1 X 'VH! "!N"0@( $0 7 $1J 0"$ +MY@@(+ !$ #@!D:@$ )&<)" 0 1 !< @VH! QS"0@$ $0 7 *=J +M 0 /P'" @ 1 P *&\! !0[" @9 $@ , #EO +M 0!P#@<(# !$ # !.;P$ -*D&" P 1 P :V\! '0*" @( $0 , +M 'UO 0#I9P<(*0 !( # "*;P$ !'4)"! 1 !< JF\! &Q>"0@$ +M$0 7 ,9O 0" - at 8($ !$ # #;;P$ M"D%" @ 1 P W ! *"Z! @0 +M $0 , "!P 0#(+04(!P !( # U< $ N&<)"! 1 !< 3' ! &P3 +M" @( $0 , %IP 0#':@<(" !( # !I< $ X(P'"#H 2 P <7 ! +M "Y $@ (1P 0 <7 <(!0 !( # "M< $ !#(%" < 2 P +MPW ! %#=" @$ $0 . .5P 0!\P 8(" !$ # )<0$ &HT'"#D 2 +M P $W$! *"$"0B4 $0 7 "%Q 0!D9PD($ !$ %P V<0$ 9!(%""\ +M 2 P 3'$! ,9L!P@@ $@ , %=Q 0"D8 at D($ !$ %P!O<0$ ;&$) +M" 0 1 !< F'$! &C\!P@( $0 , *IQ 0#,"@D($0 !$ #@"[<0$ +MK"8%" P 1 P V'$! (-H!P@? $@ , .1Q 0 !P8(& !$ # +M<@$ 5*@&" P 1 P '7(! *1Q"0@$ $0 7 #QR 0#D%@4(" !$ +M# !/<@$ D'<)" 0 1 !< 97(! ,CA!@@, $0 , 'QR 0 D0$ +M !( "*<@$ 2+T&" @ 1 P L'(! %3=" @( $0 . -)R 0"(UP<( +M" !$ # #B<@$ T&()"! 1 !< G,! .SR" @$ $0 . !YS 0!4 +M8 at D(" !$ %P \"H%" @ 1 P NG,! ')^!P at L $@ , +M ,9S 0"!Q@<(" $ !( # #/ $ 5+T(" 0 1 X 1G@! ,1+!0AA +M$@ , %YX 0"P[P@(! !$ #@!_> $ ?'$)"! 1 !< G'@! (!]!@@0 +M $0 , +-X 0 LF <($ !( # #"> $ YHH'"!\ 2 P SW@! "1U +M"0 at 0 $0 7 .]X 0"8,P4(!P !( # !>0$ ]& )" 0 1 !< &WD! +M ' Y" @" $@ , "AY 0"L1P4(B0 !( # !+>0$ ("P'" @ 1 P +M8'D! AI"0@$ $0 7 '=Y 0!@+ H(! !$ & "0>0$ 0# %" < 2 +M P J'D! $1F"0 at 0 $0 7 ,EY 0!,9 D($ !$ %P#H>0$ >+T("#0 +M 1 X \WD! ( #!@@% $@ , YZ 0#X<@D(! !$ %P Y>@$ ,XL' +M"!T 2 P 3WH! #*" @( $0 . &QZ 0"PQ at 4(& !$ # "+>@$ +M4"$%" < 2 P I7H! #R8!PA\ $@ , +AZ 0 X\@@(! !$ #@#3 +M>@$ ;NX'" T 2 P [WH! %#A!PC[ $@ , 5[ 0#$ @4(# !$ +M# >>P$ ;',)" @ 1 !< /GL! &!I"0 at 0 $0 7 &M[ 0 D$04(" +M !$ # ")>P$ ('D)" @ 1 !< GWL! + at O!0 at E $@ , +5[ 0" 'P4( +M" !$ # #.>P$ EN\'" T 2 P Z7L! +EM!P at B $@ , /9[ 0!8 +M8PD($ !$ %P 5? $ VY8'"" 2 P ('P! *3>" @$ $0 . #9\ +M 0",W04($ !$ # !.? $ O-\'"%X 2 P 7'P! &QB"0 at 0 $0 7 +M 'Q\ 0 D508(!0 !( # "@? $ %$,%" P 1 P R'P! !@@!0@( +M$0 , .!\ 0 =T <(#@ !( # #V? $ V&H)" 0 1 !< #GT! ,QD"0 at 0 +M $0 7 "]] 0"<\08(" !$ # !*?0$ Z*\'"$X 2 P 6'T! . at F +M"@@$ $0 8 &)] 0#L;@<("0 !( # !O?0$ I,<&" @ 1 P DWT! +M )RI!@@, $0 , *E] 0!.C <(D@ !( # "\?0$ V"0'" P 1 P +MV7T! /#R" @$ $0 . /-] 0"4YP@(! !$ #@ /?@$ .-4("!P 1 +M X +'X! "PI"@@$ $0 8 #E^ 0#0' <(" !$ # !1?@$ _ H&" @ +M 1 P =WX! .1T"0 at 0 $0 7 )=^ 0 <+P4(# !$ # #(?@$ G&() +M" 0 1 !< YWX! #!*!@@( $0 , ]_ 0!4=0D($ !$ %P M?P$ +MCW\'")X 2 P 17\! &@[!@@( $0 , %U_ 0"@; D(" !$ %P"" +M?P$ /&0)"! 1 !< FW\! +#<" @$ $0 . +Y_ 0 ,0 !( +M #1?P$ ['4)"! 1 !< ZW\! "S'!@@( $0 , ^ 0!D;@D(# +M !$ %P I@ $ )'$)" @ 1 !< 0( ! $Q_!P at 5 $@ , $R 0",7 <( +M" !$ # !G@ $ ,,! 2 >8 ! $S " @$ $0 . )6 0 ( +M;P<(" !( # "A@ $ Z&L%" P 1 P N8 ! $#[!@@, $0 , ,Z +M 0#P80D(" !$ %P#F@ $ )$X%" @ 1 P ($! !PI"@@$ $0 8 +M 6! 0"TW@@(" !$ #@ E at 0$ Z& )" @ 1 !< 2($! .AN"0@( +M$0 7 &J! 0!T6P8(" !$ # "4 at 0$ ?&0)" @ 1 !< OH$! +12!@@, +M $0 , .>! 0 47 at D(" !$ %P *@@$ 0%L)" 0 !< %X(! !1% +M!@AU $@ , "J" 0"4_P<(" !$ # !"@@$ %.D(" 0 1 X 9X(! +M (P?!0@( $0 , (." 0 )@ !( "2@@$ W#,%" < 2 P +MIX(! +RO! @, $0 , +N" 0!8:0D(! !$ %P#G@@$ ='()"!0 1 +M !< !(,! '1U"0 at 0 $0 7 ""# 0"(\0<(-P !( # P at P$ M#H("!D +M 2 P 08,! "C\!P@( $0 , %"# 0#\70D(" !$ %P!K at P$ V/H' +M" @ 1 P ?(,! $!I"0@( $0 7 *2# 0 D^P<(" !$ # "T at P$ +MU%<&" 4 2 P UH,! $!B"0 at 0 $0 7 /6# 0 @,P4(=0 !( # ( +MA $ $&D'"!P 2 P %X0! #SL" @( $0 . "J$ 0 W0@(! !$ +M#@!'A $ Y.H%" P 1 P :H0! .!B"0 at 0 $0 7 (.$ 0!TT08(& +M !$ # "9A $ P"X'" @ 1 P KH0! "CR" @$ $0 . ,2$ 0!<;@D( +M" !$ %P#>A $ @ \H0! !Z $@ N% 0"4 +M#08(# !$ # CA0$ *%T'" 4 2 P /H4! -3K" @( $0 . %>% +M 0 !F@<($P !( # !AA0$ I7('" $ 2 P :H4! + Z" @" $@ , +M 'F% 0 HV <( 0$ !( # "$A0$ =&D)" 0 1 !< L84! ,PK"@@$ +M$0 8 +J% 0#0<@D($ !$ %P#KA0$ /'D)" @ 1 !< "88! !V " A) +M $@ , !*& 0 D[ @(! !$ #@ MA@$ :+T&" @ 1 P 288! $ ' +M!0@, $0 , &N& 0!(>@8(# !$ # " A@$ !%X)" 0 1 !< FH8! +M -Q8"0@ $ +Q_["& 0"TVP0(# !$ # #+A@$ ( D'" @ 1 P +MYH8! $#)" @$ $0 . /F& 0 F00($ !$ # %AP$ 2&<)" 0 1 +M !< 'HX" @( $0 . !N- 0#H;0D(' !$ +M%P \C0$ D#H&"! 1 P 5(T! +2I! @( $0 , &N- 0#^;0<(,@ +M !( # !XC0$ W!H&"! 1 P BHT! #!@"0@, $0 7 *R- 0 0M @( +M/P !( # "\C0$ 7'()" 0 1 !< UXT! = 0 $@ .V- 0"\ +MGP@(<@ !( # #]C0$ \+H%"! 1 P %8X! )!7!0@, $0 , "Z. +M 0 <)PH(! !$ & _C@$ '!0'" @ 1 P 6(X! !:+!P@= $@ , +M &R. 0"@;PD(" !$ %P".C@$ _#P'" P 1 P GXX! )1V!@@8 +M$0 , +>. 0 @8 at D(! !$ %P#4C@$ '/('"'L! 2 P X8X! )C7!P@( +M $0 , /&. 0 4>08(" !$ # /CP$ F%T'" P 1 P +(\! #0> +M!0A- $@ , $2/ 0 ,; D(" !$ %P!:CP$ W-H(" @ 1 X =H\! +M "@(!0 at 0 $0 , (J/ 0 ;0D(# !$ %P"CCP$ K'4)"! 1 !< +MNX\! - at 0!@@, $0 , -J/ 0 0_0<(" !$ # #PCP$ B &"! 1 +M P I ! .1A"0@$ $0 7 !Z0 0!TR @(# !$ #@ UD $ 9 0%" @ +M 1 P 5) ! (SD!0@, $0 , 'F0 0#MJ@<(-@ !( # "*D $ ;'@) +M" @ 1 !< HY ! PA!0A# $@ , +Z0 0#L%P4(!0 !( # #6D $ +M2VX'"!L 2 P X) ! &3_!P@( $0 , /*0 0!L[ 4(# !$ # 0 +MD0$ <#L(" ( 2 P 'Y$! %"+!P@( $@ , #.1 0! ;@D(# !$ +M%P!-D0$ [%\)" 0 1 !< ;9$! /0E!P@( $0 , (J1 0!2 0"A +M8 @($0 !( # @D@$ @ +Y(! ,0(" @( $0 , $22 +M 0!<"P8(" !$ # !FD@$ 0+D$" P 1 P @9(! "! $@ +M )*2 0"4.P@(&0 !( # "DD@$ O H&" @ 1 P RI(! .R^" @$ +M$0 . ..2 0 H]P4(& !$ # #]D@$ W%0&" 4 2 P )I,! *AR!@@8 +M $0 , $>3 0 <"04(# !$ # !@DP$ ^*@$"#D 2 P =I,! $!@ +M"0@$ $0 7 !C86QL7V=M;VY? !G:&,X,C$P+FAC ',S,TU?:6YF;P!S +M,S-%7VEN9F\ E]C;&]S=7)E '(R54Y?8VQOE]S='( E]I;F9O ',Y349?:6YF +M;P!S8T9M7VEN9F\ 5]I;F9O '-B3'-?:6YF;P!S.6)27VEN9F\ +ME]D9FQT ',Y8T)?:6YF;P!S.6-!7VEN9F\ 5\Q7V%L= !S-V%Y7S!? +M86QT ',V='!?:6YF;P!S-G5O7VEN9F\ E]I;F9O ',R-D5?:6YF;P!S,C9$7VEN9F\ GA?:6YF;P!S,7IX7S%?86QT ',Q>GA?,%]A;'0 D=?,5]A +M;'0 %]I;F9O ',R;F)?:6YF;P!S,FYB7S%? +M86QT ',R;F)?,%]A;'0 9VAC,CDQ,SDN:&, 9VAC,3DQ.2YH8P!S,C!F7VEN +M9F\ E]I;F9O '-C.$5?:6YF;P!S +M8SA#7VEN9F\ 5]I;F9O '-B2'A?:6YF +M;P!S8DAX7S%?86QT '-B2'A?,%]A;'0 %]I;F9O '-C,$1? +M:6YF;P!S8EI97VEN9F\ E]I;F9O ',X-7I?,5]A;'0 +ME\P7V%L= !S.#5V7VEN9F\ 5]S;&]W ',X6'E?:6YF;P!S8FM%7VEN9F\ %]I +M;F9O '-B;'A?,5]A;'0 %\P7V%L= !S.3%T7VEN9F\ 5]I;F9O +M ',Y,4Y?:6YF;P!S.3%97VEN9F\ C-?FA?:6YF;P!S85G!?:6YF +M;P!S.'IP7S%?86QT ',X>G!?,%]A;'0 5]I;F9O ',X>D]?:6YF;P!S +M85=A7VEN9F\ E)?:6YF;P!S85=E +M7VEN9F\ E]I;F9O ',X=WI?9&9L= !S.'=X7VEN9F\ %]D9FQT ',X +M=T]?:6YF;P!S85-87VEN9F\ #5?:6YF;P!S.'@U7V1F +M;'0 #-?9&9L= !S.'=:7VEN9F\ &5? +M:6YF;P!S.'AE7S%?86QT ',X>&5?,%]A;'0 E]I;F9O '-A5#)?:6YF +M;P!S850R7S%?86QT '-A5#)?,%]A;'0 %]S;&]W ',Y2'A?:6YF +M;P!S8F1&7VEN9F\ G%?,U]A;'0 G%?,%]A;'0 DA?D-?:6YF;P!S87I"7VEN9F\ GI?:6YF;P!S.39.7VEN9F\ G9?:6YF;P!S87IU7VEN +M9F\ E!?,5]A;'0 E9?:6YF;P!S87I6 +M7S)?86QT '-A>E9?,5]A;'0 E-?:6YF;P!S87I27VEN9F\ E)?,%]A;'0 E%?,5]A;'0 6E?:6YF;P!S87EH7VEN9F\ 6A?,E]A;'0 6Q? +M:6YF;P!S87EK7VEN9F\ 5]I;F9O '-A47A?:6YF;P!S +M85%X7V1F;'0 %\P7V%L= !S86MX7VEN9F\ E]I;F9O ',X4U)? +M:6YF;P!S.%1G7VEN9F\ 'E?:6YF;P!S87AW7VEN9F\ '9?,%]A;'0 &]?:6YF;P!S-V9*7VEN9F\ 8S9%1%]S='( 79?:6YF;P!S-GEE7VEN9F\ 4)?:6YF;P!S-V=7 +M7VEN9F\ 5\Q7V%L= !S,C!Y7S!?86QT ',Q +M0D%?,5]A;'0 5\Q7V%L +M= !S,4UY7S!?86QT ',R:#=?:6YF;P!S,F at V7VEN9F\ E]I;F9O ',R'9?:6YF +M;P!S-7AY7VEN9F\ 6U?:6YF;P!S-7E!7VEN9F\ E]I;F9O ',W.%!?:6YF;P!S-S9Z7VEN9F\ 5]I;F9O ',W.&U?:6YF;P!S-7IK7VEN9F\ EI?:6YF +M;P!S-S at T7VEN9F\ %\Q7V%L= !S-FYX7S!?86QT ',V;FA?:6YF;P!S-4-87VEN +M9F\ 6I?:6YF;P!S,GEK +M7VEN9F\ 9VAC,C at Y,C8N:&, %]I;F9O ',U4%%?:6YF;P!S-5!.7VEN +M9F\ EE? +M:6YF;P!S-7I87VEN9F\ E=?:6YF;P!S-7I67VEN9F\ +ME1?,%]A;'0 8S4X +M,U]S='( %]I;F9O +M ',S9$U?:6YF;P!S,T157VEN9F\ %]I;F9O ',X;7A?9&9L= !S84%]I;F9O '-A9'=?:6YF;P!S.#)*7VEN9F\ E]I;F9O +M '-B-#)?:6YF;P!S8C0Q7VEN9F\ F1?:6YF;P!S-GIB7VEN9F\ FM?:6YF;P!S-GIH7VEN9F\ 5]I;F9O ',V>FQ?:6YF;P!S-GIL7S%? +M86QT ',V>FQ?,%]A;'0 F9?:6YF;P!S-GIV7VEN9F\ +MG%?:6YF;P!S-GIP7VEN9F\ F]? +M,5]A;'0 5\P7V%L= !C-F)H +M7W-T<@!S-$5B7VEN9F\ %]I;F9O ',S=DE?:6YF;P!S-$5H7VEN +M9F\ 5]I;F9O ',R<5=?:6YF;P!S,G(R7VEN9F\ %]I;F9O ',Q1#!?:6YF;P!S,4-9 +M7VEN9F\ %]S='( 8S9%2U]S='( %]I;F9O ',V4$Q?:6YF +M;P!S-E!+7VEN9F\ %]I;F9O ',R:GA?,5]A;'0 %\P7V%L= !S,5%97VEN9F\ 0!2='-&;&%G'0 6-L95]T=F%R +M7W=A:71?<75E=64 6-L95]C;&]S=7)E5]T +M;U]G8P!T:')E8613=&%C:T]V97)F;&]W ')A:7-E07-Y;F-? &1E;&5T951H +M'1R85]R;V]T +M5-A;7!L97, 1T-?'1?&ET+F, 3W5T3V9(96%P+F, 4G1S3W!T2YC &EN:71#87!A8FEL:71Y $-L;W-U +M4)L86-K2&]L90!T:')E8613<75E +M97IE4W1A8VL 1T-#;VUP86-T+F, =&AR96%D7W-T871I8P!T:')E861?FE)3T)AFE)3T)A +MF1W:6YT96=EFE.=6U?:G1OFE0;W-I>'II26YT97)N86QS7WID=V-C86QL,C1?8VQOFE#4%54:6UE7V=E +M=$-0551I;65?5]C;VY?:6YF;P!O;&1?=V5A:U]P=')? +M;&ES= !'2$-Z:4E/0F%S95]L=FPU,U]C;&]S=7)E $=(0WII1FQO871?>F=Z +M95]I;F9O $=(0WII1FQO871?>F1W>F1S9G)O;5)A='IQ,5]I;F9O '-T9U]B +M;&]C:U]T86ME;79AFA?9F%S= !'2$-Z +M:4E/0F%S95]5FE&;&]A=%]Z9$QR-U P;'9L-#E?0!S=&=?159!0U5!5$5$ +M7VEN9F\ 1TA#>FE.=6U?<75O=$EN=&5G97)?:6YF;P!N97=">71E07)R87EZ +M:%]F87-T $=(0WII07)R7WID3'(T<$QA,E]C;&]S=7)E $=(0WII0F%S95]L +M94EN=%]I;F9O $=(0WII24]"87-E7U)E861"=69F97)?8VQOFE296%L7V$Q-5]I;F9O $=( +M0WII24]?>F1W8V]M;6ET0G5F9F5R>G%?&ET '-T9U]A<%\U +M7W5P9%]I;F9O $=(0WII3G5M7WID3'(Q=V]L=FPV7VEN9F\ 1TA#>FE,:7-T +M7WID3')G4'!R96QZ=6QIFE#;VYC +M7W!E;F1I;F=%=F5N='-?:6YF;P!A;&QO8V%T961?8GET97, 9F%T86Q);G1E +MFE296%L7V1I=C%?8VQO6Y#048 +M1TA#>FE)3T)AFE3:&]W +M7VEN=%1O1&EG:71?:6YF;P!R='-?;6M#:&%R &EN:713=&]R86=E %-YFE& +M;&]A=%]T;U)A=&EO;F%L7VEN9F\ 1TA#>FE"87-E7WID3'(R-&5L=FPT7V-L +M;W-UFE);G1?>F1WFE&;&]A=%]T86Y& +M;&]A=%]C;&]S=7)E '-T9U]S96Q?FE#;VYC +M7WID3'(T0C%C;VUP;&5T95)E<75EG5L +M:7-T7VEN9F\ FE4;W!(86YD;&5R7V1S7V-L;W-UFE"87-E7V-O;7!AG5F;&%G +MFE. +M=6U?9V-D26YT96=EFE"87-E7WID3'(R-&ML=FPV7VEN9F\ +M1TA#>FE&;&]A=%]A8V]S:#%?:6YF;P!'2$-Z:4AA;F1L95]F;'5S:%=R:71E +M0G5F9F5R3VYL>5]C;&]S=7)E $=(0WII4F5A;%]L=FPQ7V-L;W-UFE);G1?>G R7VEN9F\ 1&%T87II5'5P;&5?6C)47W-T871I +M8U]I;F9O $=(0WII4F5A;%]T;U)A=&EO;F%L,E]SFE#;VYC7WID +M3'(T0FQF7V-L;W-UF1,FE#>FE3=')I +M;F=?=VET:$-!4W1R:6YG7VEN9F\ 1TA#>FE&;&]A=%]S8V%L949L;V%T,5]C +M;&]S=7)E %]?FE(86YD;&5?9G)O;4EN +M=&5GFE(86YD;&5?9F1Z=7-T9&]U=%]C;&]S=7)E +M $=(0WII24]"87-E7VQV;#4T7V-L;W-UFA?9F%S= !3>7-T +M96UZ:5!OFE);G1EF1W8V-A;&Q?:6YF;P!'2$-Z:4YU;5]Z +M9&1M;6EN7VEN9F\ FE296%L7WIDFE&;&]A +M=%]C96EL:6YG7VEN9F\ 1F]R96EG;GII0WII17)R;W)?=&AR;W=%FE3=&]R +M86)L90!'2$-Z:4YU;5]E;G5M1&5L=&%);G1E9V5R7VEN9F\ 1TA#>FE296%L +M7WID3'(TFE#;VYC7W!E;F1I;F=%=F5N='-? +M8VQOFE"87-E7UHP5%]C;&]S=7)E %]?FA?9F%S= !' +M2$-Z:4-O;F-?FE3:&]W7W-H;W=3:6=N961);G1?:6YF;P!S=&=?8V%T8VA?FE296%L7WID=W!R;W!EFE&;&]A=%]Z9&9296%L1FQO871&;&]A=%]C;&]S=7)E $=( +M0WII4'1R7W!L=7-0=')?:6YF;P!S=&=?87!?FE. +M=6U?>F1W<75O=%)E;4EN=&5G97)?8VQOF1,F1,F1,F1,&QV +M;%]SFE.=6U?>G-Z95]C;&]S=7)E $=(0WII24]?>F1W=W)I=&5, +M:6YEFE,:7-T7WID=W-P;&ET071Z +M:%]C;&]S=7)E %-YFE"87-E7W!L=7-);G1?8VQOFE%;G5M7V5F9'1) +M;G1$;E]C;&]S=7)E $=(0WII3&ES=%]Z9'=S<&%N7VEN9F\ 1TA#>FE%;G5M +M7WID3'(Q>41L=FPQ-U]C;&]S=7)E $=(0WII26YT7WID=W-H:69T,U]C;&]S +M=7)E $=(0WII24]?>F1,GIL=FPQ,5]I;F9O $UA:6Y?;6%I;E]I;F9O +M '-I9V%C=&EO;D! 1TQ)0D-?,BXP %]?FE#7P!' +M2$-Z:49L;V%T7V1E8V]D949L;V%T,5]C;&]S=7)E ')TFE296%L7W1O26YT96=EFE#;VYC7WID3'(T0C5Z9'=I;G-E5]I;F9O +M $=(0WII1FQO871?86)S7VEN9F\ 1TA#>FE)3U]Z9'=WFE3:&]W7VET;W-?:6YF;P!'2$-Z +M:4E/0F%S95]!F-? +M8VQOF1,FE&;&]A=%]Z9'=Z9'-PFE)3T)AFE&;&]A=%]Z9'=E>'!O;F5N=%]C;&]S=7)E +M '-T9U]S96Q?,5]U<&1?:6YF;P!S=&=?FE.=6U? +M>F=Z95]I;F9O &YE=U!I;FYE9$)Y=&5!7IH7V9AFE0=')? +M1G5N4'1R7V-O;E]I;F9O &1E8G5G0F5L8V@ 1TA#>FE086-K7W5N<&%C:T-3 +M=')I;F=?8VQOFE296%D7P!' +M2$-Z:4YU;5]Z9&9.=6U);G1?8VQOFE2871I;U\ ;&]O:W5P4W1A8FQE +M3F%M90!R='-?;6M&=6Y0='( 1TA#>FE3:&]W7WID9&US:&]W3&ES=%]C;&]S +M=7)E $=(0WII24]"87-E7TQI;F5"=69F97)I;F=?8VQOFE"87-E7V5Q26YT7V-L;W-UFE( +M86YD;&5?:$-L;W-E>G5H96QP7W-R= !'2$-Z:49L;V%T7WID3'(W3C1L=FPR +M.5]C;&]S=7)E %-YFE296%L7VQV;#5?:6YF;P!'2$-Z:4EN=%]Z9&1MF1,7IU86QI9VYM96YT,E]C +M;&]S=7)E $=(0WII1FQO871?>F1WFE0;W-I>'II26YT97)N86QS7WID=W-E=$YO;D)L;V-K:6YG1D1?F1,FE.=6U?>F1WFE.=6U?>F1,FE%;G5M +M7WID3'(Q>7IZ;'9L,35?:6YF;P!'2$-Z:5)E86Q?979E;E]I;F9O ')E;6]V +M94AAFE)3T)AFE3=&%B +M;&50='( 1TA#>FE)3T)AF1WG5E;F-O9&5&;&]A +M='IH7VEN9F\ 1TA#>FE(86YD;&5?FE)3U]L=FPW +M7V-L;W-UFE);G1?238T>FA?F5R0F%T8VA?8VQOFE3=&]R86)L95]R96%D4'1R3V9F4'1R7VEN9F\ 4WES=&5M>FE0;W-I +M>'II26YT97)N86QS7WID=V-C86QL,S%?8VQOFE#;VYC7W!E;F1I;F=$96QA +M>7-?8VQOG%?8VQOFE&;&]A=%]Z +M9$QR-T]3;'9L-#5?8VQOFA?9F%S= !'2$-Z:4)A7-T96UZ:4-0551I;65?>F1,FE&;&]A=%]Z9'=I +M;G1E9V5R3&]G0F%S95]SF1,FE)3T)A5I:97)O7W-T871I8U]I;F9O $=(0WII1FQO871?>F1, +MFE3:&]W7VEN=%1O1&EG:71?FE.=6U?>FU?:6YF;P!'2$-Z:49L;V%T7VQV;#1? +M8VQOFE)3T)AFE#4%54:6UE7WID +M3'(R031Z9'=A7V-L;W-UFE%;G5M7V5F9'1);G15<%]I;F9O $=( +M0WII16YU;5]E;G5M1G)O;51H96Y4;S-?:6YF;P!'2$-Z:5)E86Q?>F1F26YT +M96=R86Q);G1?8VQOF1,'ID +M=VQA>GIY4F5A9$AA=F5"=69F97)?F1,FE%;G5M7P!S=&=?5)E860Q7VEN9F\ 1TA#>FE)3T)AFE3:&]W7WID=VEN=%1O1&EG:71?FE-87)S +M:&%L '-T9U]A<%]P<%]I;F9O '1A:V5-5F%R>FA?9F%S= !'2$-Z:49L;V%T +M7V1E8V]D949L;V%T,5]I;F9O $=(0WII1FQO871?9G)O;4EN=&5G97)?8VQO +MFE3=&]R86)L95]P;VQY>G5S:7IZ94]F,E]C;&]S=7)E +M $=(0WII1FQO871?=&%N:$9L;V%T7VEN9F\ 1TA#>FE(86YD;&5?>F1W9FQU +MF1,7-T96UZ:5!OFE);G1EF1W8V-A;&PW,%]I;F9O $=( +M0WII1FQO871?6D-$1FQO871I;F=?8V]N7VEN9F\ 4WES=&5M>FE%;G9IFE&;&]A=%]Z;%]I;F9O $=(0WII +M4F5A;%]R96TR7VEN9F\ 1TA#>FE#;VYC7W1HFE(86YD;&5?9'-? +M8VQOF1W=&]2871I;VYA;%]SFE296%L7WIDFE"87-E7T-Z:%]S=&%T:6-?:6YF;P!S +M=&=?F1,F1,F1W<')O<&5R1G)A8W1I;VY?8VQOFE#>FE%4UA>4)L;V-K7VEN +M9F\ 1TA#>FE"87-E7T)O;VQ?8VQOFE&;&]A=%]Z9$QR-T]9;'9L-#A?:6YF;P!'2$-Z:5)E86Q?>F1W>F5Z95]I +M;F9O '-T9U]U<&1?9G)A;65?,U]R970 1TA#>FE&;&]A=%]Z9$QR-U P;'9L +M-#E?8VQOFE#>FE%FE0;W-I>'II26YT97)N86QS7V]Z=5)$ +M5U)?:6YF;P!'2$-Z:4E/0F%S95]5;G-A=&ES9FEE9$-O;G-TFE4=7!L95\ 7U]S=&=I;FET7T1A +M=&%Z:4AAFE&;&]A=%]Z9$QR-T]#;&ET-E]C;&]S=7)E +M $=(0WII1FQO871?>F1WFE296%L7V5V96Y?8VQOFE!FE%;G5M7W-U +M8V,U7W-R= !'2$-Z:45N=6U?969D26YT7VEN9F\ 0V]N=')O;'II17AC97!T +M:6]N7WID3'(R65)L=FPT7VEN9F\ 0V]N=')O;'II17AC97!T:6]N7WID3'(R +M64)A7VEN9F\ 1TA#>FE)3T)AFE);G1?>F1W>F5Z95]S;&]W %]?FE)3U)E +M9E\ F1,FE)3T)A +MFE-87)S:&%L>FE!5]L=FQ?8VQOFE%>&-E<'1I;VX 1TA#>FE)3T)AF1,FE&;&]A=%]F;&]A +M=$1I9VETFE# +M>FE%4UA>4)L;V-K7V-L;W-UF1,FE&;&]A=%]R;W5N9%]SFE&;&]A=%]Z9$QR-TY#9',Q7VEN9F\ 7U]S=&=I;FET7T=(0WII07)R7P!S +M=&=?FE(86YD;&5?>F1,5]FFE&;&]A=%]Z +M;'IE7V-L;W-U7-T96UZ:5!OFE);G1EF1W8V-A;&PU-E]I +M;F9O %-YFE296%L7UI#1$9R86-T:6]N86Q?8V]N7VEN9F\ 7U]S=&=I;FET +M7U-YFE);G1? +M23$V>FA?8V]N7VEN9F\ FE)3T)A45X:7-TF1,FE(86YD;&5?;6M3=&1(86YD;&5?FE(86YD;&5?;'9L,3 T7VEN9F\ 1TA#>FE);G1?;&ET +M-5]C;&]S=7)E $=(0WII24]?>F1,FE.=6U?=7!Z=6QIFE-87)S:&%L>FE!5]Z9'=P965K07)R87E?:6YF;P!'2$-Z:49L +M;V%T7WID3'(W34=L=FPQ-U]C;&]S=7)E %]?:6YT7V5N8V]D949L;V%T $=( +M0WII3&ES=%]Z9$QR,45/;'9L,C%?8VQOFE)3T)AFE3=&]R86)L90!'2$-Z:45N=6U?96YU +M;49R;VU4:&5N5&\S7V-L;W-UFE( +M86YD;&5?:$-L;W-E7V-L;W-UFE#;VYC7W1HFE&;&]A=%]N96=A=&5&;&]A=%]I;F9O '-T9U]F;W)C94E/ +M7VEN9F\ 6D--86EN7VUA:6Y?FE.=6U?>F1D;7-H;W=? +M8VQOFE3=&%B;&4 1TA#>FE#;VYC7U=R:71E +M7W-T871I8U]I;F9O $=(0WII4F5A;%]Z9'=A-E]SFE&;&]A=%]A +M7IU7V-L;W-UFE296%L7VQV;#$V7V-L;W-UFE) +M3T)AF1,FE!FE0;W-I>'II26YT97)N86QS7U)E9W5L87)& +M:6QE7W-T871I8U]I;F9O $=(0WII3G5M7WID9&UM87A?8VQOFE(86YD;&5?;'9L-S=?8VQOFE%>&ET7P!'2$-Z:5)E86Q?<75O=%)E;3)? +M:6YF;P!S:6=I;G1EFE(86YD;&5?>F1,GIE9$AA;F1L +M95]SFE&;&]A=%]C;W-H1FQO871?:6YF;P!R='-?979A;$E/ '-T +M9U]W;W)D-C14;U=OFE.=6U?F1,FE"87-E7WID=V=C9$EN=%]C;&]S +M=7)E '-T9U]C871C:%]S=&U?9G)A;65?-5]R970 1TA#>FE296%L7VQV;#1? +MFE&;&]A=%]Z9$QR-U!I;'9L-31?F5Z95]C;&]S=7)E ')T +MFE.=6U?>F1F17%);G1E9V5R +M7V-L;W-UFE&;&]A=%]Z9'=F;&]A=%1O1&EG:71S7V-L;W-U'1Z:5!AFE296%D4')E8P!'2$-Z:45N=6U?969D +M=$EN=%]C;&]S=7)E $=(0WII24]"87-E7V$T-E]I;F9O $=(0WII1FQO871? +M>F1,FE(86YD;&5?>F1W9FQUFE&;&]A=%]Z9'=Z9'-R;W5N9%]S +MF1W97AP=%]SFE&;&]A=%]Z +M;%]C;&]S=7)E $=(0WII1FQO871?>F1,FE, +M:7-T7W)E<&5A=$9"7V-L;W-UFE(86YD;&5?>F1,FE(86YD;&5?>F1,FE)3WII56YS869E7P!S=&=?87!?5]FFE%>&-E<'1I;VY?>F1,FE(86YD;&5?;'9L,3$R7W-R= !&;W)E:6=N>FE3 +M=&]R86)L95]P;VQY>G5P;VME0GET94]F9C)?:6YF;P!'2$-Z:49L;V%T7UI# +M1$9L;V%T:6YG7W-T871I8U]I;F9O '-T9U]C871C:%]S=&U?9G)A;65?-%]R +M970 1TA#>FE296%L7WID3'(T7-T96UZ:5!OFE) +M;G1E6YC17AC +M97!T:6]NF1W:%!U=$-H87)?:6YF;P!' +M2$-Z:5)E86Q?>F1P,4EN=&5GFE&;&]A=%]E>'!& +M;&]A=%]C;&]S=7)E $=(0WII24]"87-E7V)U9E=0=')?:6YF;P!'2$-Z:4E/ +M7WID=VA0=71#:&%R7V-L;W-UFE.=6U?96YU;41E;'1A5&]);G1E +M9V5R7V-L;W-UFE,:7-T7WID=W-P86Y?8VQOF1F3W)D26YT7V-L;W-UFE3:&]W7VQV;#$T7V-L;W-UFE%;G5M7W-U8V,U7V-L;W-UFE"87-E7VYE26YT7VEN +M9F\ FE.=6U?;'9L,35?8VQOF1W;&]G0F%S +M93%?:6YF;P!#;VYTFE%>&-E<'1I;VY?>F1,F1, +M&]R26YT96=EFE%;G5M7V5F9'1);G1?:6YF;P!&;W)E +M:6=N>FE3=&]R86)L95]:0T13=&]R86)L95]C;VY?:6YF;P!'2$-Z:4E/7WID +M3'(U4D)L=FPQ,E]I;F9O %]?FE&;&]A +M=%]Z9&1M>G-Z93%?8VQOFE.=6U?FE3:&]W7P!'2$-Z:49L;V%T7WID=WIDFE796%K7WID=W)U;D9I;F%L:7IZ97)" +M871C:%]I;F9O '-T9U]I;G1E9V5R5&]);G0V- !'2$-Z:49L;V%T7WID3'(W +M3U%L=FPT-%]C;&]S=7)E $=(0WII2&%N9&QE7VA#;&]S95]I;F9O $=(0WII +M24]"87-E7TEN=&5RFE296%L7WID=V$R7VEN +M9F\ FE%;G5M7VQV;#$X7W-R= !'2$-Z:5)E86Q?;6]D,5]I;F9O $=( +M0WII24]"87-E7W5N7!E7V-L;W-UFE&;&]A=%]Z9'=S:&]WFE0;W-I>'II5'EP97-? %]?FE)3U]Z9$QR-5)V;'9L.5]I;F9O $=(0WII26YT +M7WIS>F4S7VEN9F\ 4WES=&5M>FE%;G9IFE796%K7WID=W)U;D9I;F%L:7IZ97)"871C:%]C;&]S=7)E $=(0WII +M24]"87-E7VQV;#4Q7VEN9F\ 1TA#>FE296%L7V$Q-5]SFE0 +M;W-I>'II26YT97)N86QS7WID=V-C86QL,C%?8VQOFE!F1S:6YD97A%FE)3U]Z9$QR-5)T;'9L.%]C;&]S=7)E +M '-T9U]I;G1E0!'2$-Z:5)E86Q?;'9L-E]C;&]S +M=7)E &9R965(87-H5&%B;&4 1TA#>FE"87-E7TQ47V-L;W-UFE. +M=6U?F1W9FQO8714;T1I9VET +MFE)3U]Z9'=WFE3:&]W $=(0WII1FQO871?>F1,FE&;&]A=%]F;&]O +MFE)3T)AFE%>&-E<'1I;VY? %]?9'-O7VAA;F1L90!'2$-Z:49L;V%T7VES3F5G +M871I=F5:6F5R;S%?8VQOFA?9F%S= !S=&=?8V%T8VA?FE(86YD;&5?;&ET,5]I;F9O $=(0WII0F%S95]4FE&;&]A=%]IFE&;&]A=%]Z9$QR-TYG;'9L,S-?8VQOF1,FE& +M;&]A=%]Z9$QR-T]5;'9L-#9?8VQO5)E860Q7W-R= !'2$-Z:5)E86Q?<75O=%)E;3)?8VQOFE"87-E7W!L=7-);G1? +M:6YF;P!'2$-Z:4E/0F%S95]T:')O=U]C;&]S=7)E $=(0WII4F5A;%]Z9'=Z +M9'-R961U8V5?FE( +M86YD;&5?>F1,FE"87-E7V5Q26YT7VEN9F\ +M:'-?97AI= !?7W-T9VEN:71?1&%T87II0F]O; !'2$-Z:49L;V%T7W-H;W=S +M4')E8U]C;&]S=7)E '-T9U]S=&M?$5RFA?9F%S= !I;FET4U1- $=(0WII24]" +M87-E7U!R;W1O8V]L17)R;W)?8VQOFA?9F%S= !3>7-T +M96UZ:5!OFE);G1EF1W8V-A;&PS,%]C;&]S=7)E $=(0WII +M1FQO871?FE296%L7VQV +M;#5?F1,F$R7VEN9F\ 1TA#>FE( +M86YD;&5?;W!E;D9I;&5Z<5]C;&]S=7)E $=(0WII16YU;5]E;G5M1G)O;51H +M96XS7VEN9F\ 1TA#>FE)3U]Z9$QR,C-Q:%!U=&-"=69F97)E9%]C;&]S=7)E +M $=(0WII4VAO=U]A,5]C;&]S=7)E '-T871?96YD26YI= !'2$-Z:4AA;F1L +M95]O<&5N1F1?:6YF;P!'2$-Z:4YU;5]E;G5M1&5L=&%4;TEN=&5G97)&0E]C +M;&]S=7)E &9R965#:&%I;@!'2$-Z:5!TFE4;W!(86YD;&5R7WID3'(R:GAL=FQ?:6YF;P!S=&=&FE&;&]A +M=%]FFE0;W-I>'II26YT97)N86QS7WID=V-C86QL,S)? +M8VQOGIE9#%?8VQOFE&;&]A=%]T:6UEFE,:7-T7VQV;#(R7VEN9F\ 1TA#>FE(86YD;&5?:$-L;W-E +M7W-R= !'2$-Z:4E/0F%S95]Z9'=S:&]WFE" +M87-E7T517W-T871I8U]I;F9O $=(0WII1FQO871?>F1,FE(86YD;&5?>F1WF1,GIL=FPQ,5]C;&]S=7)E $=(0WII26YT7WIM,E]I;F9O $=( +M0WII4VAO=U]L=FPQ-E]C;&]S=7)E '-T9U]A=&]M:6-A;&QY7V9R86UE7VEN +M9F\ 1TA#>FE&;&]A=%]L;V=&;&]A=%]I;F9O $-O;G1R;VQZ:45X8V5P=&EO +M;E]Z9$QR,EE0;'9L,U]SFE);G1?9G)O;4EN=&5G97(R7VEN9F\ +M1TA#>FE&;&]A=%]S:6=N=6U?8VQOFE&;&]A=%]:0T1296%L1FQO871?8V]N +M7VEN9F\ =6YL;V-K1FEL90!S=&=?8W1O:5]2,7!?:6YF;P!E>&ET4V-H961U +M;&5R $=(0WII1FQO871?>F1W86-OFE.=6U?>F1F +M16YU;4EN=&5G97)?8VQOFE%;G5M7V5F9'1);G1$;E]I;F9O $=(0WII4F5A;%]Z9'=F,E]C;&]S +M=7)E $=(0WII1FQO871?9FQO871286YG93%?:6YF;P!S=&=?1E5,3%]-5D%2 +M7VEN9F\ FE(86YD +M;&5?;'9L,3 U7W-L;W< 1TA#>FE296%L7VQV;#$V7W-R= !'2$-Z:4E/0F%S +M95]-5F%R7W-T871I8U]I;F9O $=(0WII1FQO871?>F1,49R86UE2&5L<&5R $=(0WII4F5A;%]Z9'=A-5]I;F9O +M '-T9U]A<%]S=&M?<&X 1TA#>FE)3T)AG5Z=5]C;VY?:6YF +M;P!'2$-Z:4EN=%]Z9&1MFA? +M9F%S= !S=&=?5T5!2U]I;F9O '-T9U]-551?5D%27VEN9F\ 1TA#>FE)3T)A +MFE0;W-I>'II26YT97)N86QS7V$U7VEN9F\ 1TA#>FE,:7-T7WID +M3'(Q1%=L=FPS7VEN9F\ 36%I;E]L=FPQ,5]I;F9O $=(0WII2&%N9&QE7W=I +M=&A(86YD;&5Z=7IU>G%?:6YF;P!M<%]T;7 R $=(0WII1FQO871?>F1W>F1S +M9G)O;5)A='IQ7V-L;W-UFE.=6U?=7!Z=6QIFE% +MFE.=6U?FE)3U]H4'5T0VAAFE-87)S:&%L>FE! +M;&QO8P!/;D5X:71(;V]K $=(0WII3G5M7W%U;W1296U);G1E9V5R7VEN9F\ +M1TA#>FE&;&]A=%]Z9$QR-U!#;'9L-3A?:6YF;P!R='-?;6M7;W)D,38 ;VQD +M97-T7V=E;@!'2$-Z:45RFE.=6U?&ET $=( +M0WII3G5M7W-H;W=S4')E8U]I;F9O $=(0WII1FQO871?>F1,FE(86YD;&5?;'9L-S-?8VQO5]FF1S>F1D;7-H;W=,:7-T,U]C;&]S=7)E +M '-T9U]C871C:%]S=&U?9G)A;65?,U]R970 F1S>G9?:6YF;P!-86EN +M7VQV;#$Q7W-R= !'2$-Z:4E/0F%S95]B=693:7IZ95]C;&]S=7)E $=(0WII +M4F5A;%]L=FPR7V-L;W-UFE&;&]A=%]Z9$QR-TU9;'9L,C9?:6YF +M;P!S=&=?7-T96UZ:5!OFE);G1EF1W8V-A;&PS,U]I;F9O $=(0WII4U12969?4U12969?8V]N7VEN9F\ +M1TA#>FE)3T)AF1WFE0=')?4'1R7V-O;E]I;F9O $=( +M0WII24]"87-E7U1I;65%>'!IFA?9F%S +M= !'2$-Z:4E/0F%S95]L=FPT-U]I;F9O '-T9U]C871C:%]FFE&;&]A=%]F;&]A=%)A9&EX,5]C;&]S=7)E '-T9U]U<&1?9G)A +M;65?:6YF;P!'2$-Z:4-O;F-?>F1,FE)3T)AF5?:6YF;P!'2$-Z:49L;V%T7WID3'(W3GED +MF1W<&5E:T%RFE)3T)AFE%;G5M7VQV;#$X7V-L;W-UF4S7V-L;W-UFE.=6U?:G1OFE3:&]W +M7VQV;%]C;&]S=7)E $=(0WII3G5M7W-U8V-?:6YF;P!'2$-Z:49L;V%T7T9& +M17AP;VYE;G1?FE.=6U?F1,F1S>F1D;61I=E]C;&]S=7)E $=(0WII24]"87-E7VQV;#8P7V-L;W-U +MG%? +MFE#;VYC7WID3'(T +M05I:9V5T1&5L87DQ7V-L;W-UFE296%L7WID=V9?:6YF;P!A;&QO +M8TYUFE296%L7WID<#%);G1E9W)A;%]I;F9O $=(0WII1FQO +M871?>F1,FE7;W)D7UG52 +M1%=27V-L;W-UFE.=6U?FE( +M86YD;&5?>F1,F1,FE"87-E7UI#7W-T871I8U]I;F9O $=(0WII +M3&ES=%]Z9$QR,45K;'9L,3-?8VQOFE%FE.=6U?96YU +M;41E;'1A5&]);G1E9V5R7VEN9F\ 1TA#>FE296%L7VQV;#$W7W-R= !R='-? +M9V5T0VAA<@!'2$-Z:4E/0F%S95]Z9$QR-4)B830W7VEN9F\ 4WES=&5M>FE0 +M;W-I>'II26YT97)N86QS7WID=V-C86QL7V-L;W-U'1Z:5)E861Z:4QE> !PFE&;&]A=%]Z9$QR-TU1;'9L +M,C)?FE0;W-I>'II26YT97)N86QS7V$Q +M7V-L;W-UFE)3T)AF1,FE&;&]A +M=%]Z9$QR-T]7;'9L-#=?8VQOF1,FE&;&]A=%]Z9$QR-TUU;'9L,3%?8VQOFE.=6U?>F1,FE3=&]R86)L95]WFE)3T)A +M7IH7V9AFE3:&]W7VET;W-Z +M<5]C;&]S=7)E %]?FE,:7-T &%W86ET179E;G0 1TA# +M>FE&;&]A=%]C96EL:6YG7V-L;W-UF1F +M4VAO=T-);G1?8VQOF1,FE(86YD;&5?;'9L,3 T7V-L;W-UFE)3T)AF1WFE&;&]A=%]E;F-O9&5&;&]A='IH7V-L;W-UF1,7IU +M<&5E:T)Y=&5/9F8R7VEN9F\ 1TA#>FE3:&]W7VET;W-Z<5]I;F9O $=(0WII +M16YU;5]L=FPQ-E]SFE.=6U?>FQ?:6YF;P!'2$-Z:4-O;F-?>F1, +MFE(86YD;&5? +M>F1,GIA,E]C;&]S=7)E %]?FE-87EB95\ 0V]N +M=')O;'II17AC97!T:6]N7WID3'(R649L=FQ?:6YF;P!S=&=?87!?FE(86YD;&5?>F1W9FEL;%)E861"=69F97),;V]P7W-R= !?7W-T +M9VEN:71?4WES=&5M>FE0;W-I>'II4VEG;F%LFE&;&]A=%]E>'!O +M;F5N=#%?8VQOFE(86YD;&5?:6]E>G5N;W12 +M96%D86)L95]C;&]S=7)E $=(0WII24]?=W)I=&5,:6YEF1W9FQO +M8714;T1I9VETFE&;&]A=%]E +M>'!TFE&;&]A=%]Z +M9$QR-TY+;'9L,SE?8VQO&]R-C0 8V]M<&QE;65N=$EN=&5G +M97)Z:%]F87-T $=(0WII3G5M7WID9E-H;W=);G1E9V5R7V-L;W-UFE#;VYC7WID3'(T059L=FPQ,%]I;F9O $=(0WII07)R7T%RFE)3T)A7-T96UZ:5!O +MFE);G1EF1W8V-A;&PS,5]S;&]W $=(0WII17)R7V1I=EI: +M97)O17)R;W)?8VQOF5.=7)S97)Y $=(0WII2&%N9&QE +M7VQV;#(V7VEN9F\ GIEFE.=6U?>F5Z95]C;&]S=7)E %]?7-T96UZ:5!O +MFE);G1EFE&;&]A=%]Z9'-FFE4;W!(86YD;&5R7VLQ7V-L;W-UF1W:&%N9&QE1FEN86QI>GIEFE" +M87-E7V9O;&1R7VEN9F\ =F)AFE&;&]A=%]Z9$QR-TU/;'9L,C%?8VQOFA?9F%S= !S=&=?8V%T8VA?FE.=6U?<75O=$EN=&5G97)?8VQOF1S>F1D;61I=E]I;F9O $=(0WII0F%S95]Z9&9%<4EN=%]C +M;&]S=7)E '-T9U]U<&1?9G)A;65?,E]R970 1TA#>FE&;&]A=%]Z9$QR-TUM +M;'9L-U]I;F9O $=(0WII16YU;5]PFE3:&]W7WID=VEN=%1O1&EG:71?8VQOFE)3T)AF1,FE);G1?>F1W>F5Z95]C;&]S=7)E $=(0WII24]"87-E7VQV;#0Y +M7VEN9F\ ;65M;6]V94! 1TQ)0D-?,BXP $=(0WII4VAO=U]L=FPQ,U]C;&]S +M=7)E $=(0WII3&ES=%]P;VQY>G5R979?8VQOFE)3U]Z9$QR-5)J;'9L,U]I;F9O '-T9U]S96Q?FE&;&]A=%]Z9&1M;6EN,5]I;F9O $=(0WII24]" +M87-E7WID3'(U0FQA-3)?8VQOFE)3T)AFA?8VQOFE0;W-I>'II26YT97)N86QS7WID +M=V-C86QL-U]I;F9O $=(0WII1FQO871?>F1WFE&;&]A=%]Z9$QR-TUY;'9L,3-?8VQOFE0;W-I>'II26YT97)N86QS7WID +M=V-C86QL,S1?FE(86YD;&5?;'9L,3 X7W-R= !'2$-Z:4AA;F1L95]L +M=FPR-E]C;&]S=7)E $=(0WII1FQO871?>F1,FE);G0 FE#;VYC7W!R;V1397)V:6-E +M5&AR96%D7V-L;W-UFE0;W-I>'II26YT97)N86QS7WID=V-C86QL,C!?8VQOFE.=6T FE296%L7WIDFA?:6YF;P!'2$-Z:4%RF1,FE&;&]A=%]L:70S7V-L;W-UFE)3T)AF1W>F1S>F-?FE#;VYC7WID +M3'(T0GAS97)V:6-E>G5L;V]P,5]C;&]S=7)E '-T9U]I;G1E0!'2$-Z:4AA;F1L95]Z9'=WFE(86YD;&5?>F1,FE(86YD;&5?;'9L,3 X7W-L;W< 7U]S=&=I;FET +M7U-YF1W>F1S<')O<&5R +M1G)A8W1I;VXR7V-L;W-UFE&;&]A=%]Z9$QR-TY);'9L,SA?:6YF +M;P!S=&=?FE"87-E7V=T26YT7V-L;W-UFE) +M3T)AFE(87-H5&%B;&4 1TA#>FE296%L7W1O4F%T:6]N86PR7V-L;W-UFE&;&]A=%]Z9'-Z9&1M871A;C)?8VQOFA?8VQO7-T +M96UZ:5!OFE);G1EF1W8V-A;&PV,E]I;F9O '-T9&5RF1,FE296%L7W)E;3%?7-T96UZ:5!OFE);G1EF1W +M8V-A;&PS,U]C;&]S=7)E $=(0WII24]"87-E7U-T86-K3W9EFE#>FE%FE(86YD;&5?>F1,FE.=6U?9G)O;4EN=&5G97(Q7V-L;W-UFE0;W-I>'II +M26YT97)N86QS7WID=V-C86QL-C=?7-T96UZ:5!OFE);G1EFE%FE)3U]WFE&;&]A=%]Z9&9/F1W>F1S<')O<&5R1G)A8W1I;VXS7VEN9F\ 1TA#>FE)3T)AFE)3T)AE]I;FET '-T9U]A<%]P +M<'!P7VEN9F\ 1TA#>FE&;&]A=%]Z9U]I;F9O &UPFE&;&]A=%]L=FPT,5]SFE%>&-E<'1I;VY?=6YC875G:'1%>&-E<'1I;VY(86YD;&5R7W-R= !?7W-T +M9VEN:71?1TA#>FE#;VYC $=(0WII1FQO871?9F]R;6%T4F5A;$9L;V%T7VEN +M9F\ 1TA#>FE.=6U?9G)O;4EN=&5G97)?:6YF;P!?7V=M<'I?>&]R $=(0WII +M24]?:%!U=%-TFE)3T)AG5I;FET>G%?8VQOF1S979E;E]I;F9O $=( +M0WII1FQO871?>F1,FE7;W)D7UFA?5)E861(879E +M0G5F9F5R7VEN9F\ 1TA#>FE)3U]Z9$QR-5-";&%Z>GE296%D,5]C;&]S=7)E +M $=(0WII1FQO871?;'9L-#)?8VQO7-T96UZ:5!OFE);G1E +M0!'2$-Z:4EN=%])-C1Z:%]C +M;VY?:6YF;P!3>7-T96UZ:5!OFE);G1EF1W8V-A;&PS,%]I +M;F9O &1E;&5T951HFE%;G5M7V5N=6U&FE296%L7V1I=DUO9#%?F1,FE.=6U? +M;F5G871E26YT96=EFE4 +M=7!L95]:-%1?FE0;W-I>'II26YT97)N86QS +M7V]Z=4-214%47V-L;W-UFE&;&]A=%]Z9'=R;W5N9%1O7VEN9F\ +M=F9PFE)3WII56YS +M869E &UAFE796%K7P!' +M2$-Z:5)E86Q?=&]2871I;VYA;#%?8VQOFE.=6U?>F1,FE0;W-I>'II26YT97)N86QS7WID=V-C +M86QL,39?8VQOFE"87-E7WID7-T96UZ:5!OFE);G1EF1W8V-A +M;&PS-%]C;&]S=7)E ')A:7-E24]Z:%]F87-T ')EFE&;&]A +M=%]Z9'=T;U)A=&EO;F%L7V-L;W-UFE086-K7P!'2$-Z:45N=6U?=&]%;G5M-%]I;F9O $=( +M0WII5V]R9%]7-C1Z:%]C;VY?:6YF;P!'2$-Z:4AA;F1L95]I;V5Z=45/1E]C +M;&]S=7)E %-YG5"24Y!4EE?8VQO +MFE&;&]A=%]T;U)A=&EO +M;F%L7W-R= !&;W)E:6=N>FE3=&]R86)L95]P;VQY>G5Z9&1M<&]K93)?8VQO +MF5R7W-R= !'2$-Z:4E/7WID3'(U4WIZ;&%Z>GE296%D0G5F9F5R960Q +M7W-R= !'2$-Z:4YU;5]Z9WIE7V-L;W-UFE)3T)AF1WFE.=6U?9&YZ=69B7V-L;W-UFE%;G5M +M7V5F=$EN=%]C;&]S=7)E ')TFE(86YD;&5?=&AR;W=%FE296%L7W1O4F%T:6]N86PR7VEN9F\ 1TA#>FE);G1?;&ET-%]C +M;&]S=7)E '-T9U]C871C:%]R971R>5]FFE#;VYC7P!S=&=?FE)3T)AFE7;W)D &UAFE3:&]W7WID=W-H;W=3 +M:6=N961);G1?8VQOFA?FE&;&]A=%]Z +M9&9296%L1FQO871?8VQOFA?FE)3T)AF1WF1,FE.=6U?9V-D26YT96=EGIE5V5A:WIH7V9AFE.=6U?;'9L7V-L;W-UF1F17%&;&]A=%]C;&]S=7)E '-T87)T4VEG;F%L2&%N +M9&QEFE&;&]A=%]Z9$QR-U!K;'9L-35?:6YF;P!S=&=?FE"87-E7W5N<&%C:T%P +M<&5N9$-3=')I;F=Z:%]I;F9O %]S=&%R= !'2$-Z:4E/0F%S95]3=&%C:T]V +M97)F;&]W7V-L;W-UFE%;G5M7W-U8V,U7VEN9F\ 1TA#>FE&;&]A +M=%]Z9$QR-TYI;'9L,S1?:6YF;P!'2$-Z:4)AFE&;&]A=%]Z9$QR-TQ7835?8VQOG5#55)?:6YF;P!'2$-Z:45R0!'2$-Z:4-O;F-? +M>F1,FE#;VYC7W1HFE(86YD;&5?>F1,FE0;W-I>'II26YT97)N86QS7WID=V-C86QL-C=?:6YF;P!?7W-T9VEN:71? +M1TA#>FE&;W)E:6=N4'1R7P!'2$-Z:49L;V%T7WID3'(W36ML=FPV7VEN9F\ +M1TA#>FE"87-E7VUA<%]I;F9O ')TFE(86YD +M;&5?=V%N=%=R:71A8FQE2&%N9&QE>G%?8VQOF1W>F1SFE"87-E %-YFE&;&]A=%]Z9'=Z9'-Z9&1M +M871A;C)?FE&;&]A=%]A8V]S +M1FQO871?:6YF;P!'2$-Z:5-H;W=?;'9L,35?8VQO7-T96UZ:5!OFE);G1EFE(86YD +M;&5?:$-L;W-E>G5H86YD;&5Z=5]I;F9O $=(0WII3G5M7WID3'(Q=VUL=FPU +M7V-L;W-UFE)3T)AFE&;&]A=%]E +M>'!&;&]A=%]I;F9O '-T9U]A<%\T7W5P9%]I;F9O $=(0WII1FQO871?FE)3U]Z9$QR,C-Q:%!U=&-"=69F97)E9%]I;F9O +M $=(0WII4F5A;%]Q=6]T4F5M,5]SFE(86YD;&5?:$-L;W-E>G5H86YD;&5Z=5]S +MF1,FE(86YD;&5?;'9L-S1?:6YF;P!3=&%C:T]V +M97)F;&]W2&]O:P!'2$-Z:4E/0F%S95]/=&AEF5D $=(0WII +M24]?>F1W:%!U=$-H87)?FE0;W-I>'II26YT97)N86QS7WID=V-C86QL +M,C-?:6YF;P!'2$-Z:5-H;W=?>F1D;7-H;W=,:7-T7VEN9F\ 4WES=&5M>FE0 +M;W-I>'II26YT97)N86QS7WID=V-C86QL-#9?8VQOFE(86YD;&5?;'9L,3 X7VEN9F\ 1TA#>FE.=6U?>F1, +MFA?8V]N7VEN9F\ FE0;W-I>'II26YT97)N +M86QS7WID=V-C86QL-S!?8VQOFE(86YD +M;&5?;'9L-SE?8VQOFE)3T)AFE(86YD;&5?=V%N=%=R:71A8FQE2&%N9&QE7V-L;W-UFE) +M3T)AFE(86YD;&5?>F1,F1W>F1S9G)O;5)A='IQ,5]C;&]S +M=7)E $=(0WII4F5A;%]Z9$QR-'-.;'9L-U]I;F9O %]?7-T +M96UZ:41I7II26YT97)N86QS $=(0WII1FQO871?>F1WFE.=6U? +M<75O=$EN=&5G97)?FE&;&]A=%]R;W5N9%]C;&]S +M=7)E $=(0WII1FQO871?>F1,FE!F1, +MFE&;&]A=%]Z9'=Z9'-FFE(86YD;&5?>F1W9FEL;%)E861"=69F97),;V]P7VEN9F\ 7U]S=&=I +M;FET7T9OFE#>FE4 +M>7!EFE&;&]A=%]A=&%N:#%?:6YF +M;P!'2$-Z:4AA;F1L95]S=&1O=71?8VQOF1W<')O +M<&5R1G)A8W1I;VY?:6YF;P!'2$-Z:4E/0F%S95]296%D36]D95]S=&%T:6-? +M:6YF;P!S=&=?FE)3T)AFE0;W-I>'II26YT97)N86QS7WID=V-C86QL-#9?:6YF;P!'2$-Z:4E/0F%S +M95]/=&AEFE.=6U?9&YZ=6QIFE%;G9IFE)3T)A&-E<'1I;VY?FE&;&]A=%]Z9$QR-TU%;'9L,39?:6YF;P!3>7-T96UZ:5!OFE);G1EF1W8V-A;&PV-5]I;F9O &)L;V-K57-EF1W9C)?&%C=$EN=&5G97)Z:%]F87-T $=( +M0WII1FQO871?>F1,FE,:7-T7VQV;#(R +M7V-L;W-UFE)3U]Z9$QR-5-Z>FQA>GIY4F5A9$)U9F9E&ET $=(0WII0V]N +M8U]P96YD:6YG1&5L87ES7W-R= !?7V1E8V]D949L;V%T $=(0WII4VAO=U]S +M:&]WF1,FE296%L +M7WID=W1O4F%T:6]N86Q?8VQOF1S>F1D;61I=E]S +MFE0;W-I>'II26YT97)N86QS7WID=V-C86QL-E]I;F9O $=( +M0WII2&%N9&QE7VEO97IU14]&7W-L;W< FE)3T)AG5F;&%GFA?9F%S= !'2$-Z:4AA +M;F1L95]I;V5Z=6YO=%=R:71A8FQE7W-L;W< 1TA#>FE&;&]A=%]AG5F;&%GFE4;W!(86YD;&5R7V1S +M,5]I;F9O $=(0WII07)R7WID=VEN9&5X,5]C;&]S=7)E $=(0WII4VAO=U]I +M;G14;T1I9VET7V-L;W-U&-E<'1I;VYS>FA?FE)3T)AG574D].3%E? +M8VQOFE(86YD;&5?>F1,FE&;&]A=%]Z9&9296%L1G)A8T9L;V%T7V-L;W-UFE" +M87-E7VUI;G5S26YT7VEN9F\ 1TA#>FE)3T)A6YC5VET:$QO8VL 86QL;V-?2'!,:6T +MFE)3U]L=FPV7V-L;W-UFE)3T)A +M7-T96UZ:4-0551I;65?9V5T0U!55&EM95]C;&]S=7)E %-YFE#;VYC7W!R;V1397)V:6-E5&AR96%D7W-R +M= !'2$-Z:49L;V%T7UI#1%)E86Q&;&]A=%]S=&%T:6-?:6YF;P!'2$-Z:49L +M;V%T7W)E8VEP7V-L;W-UFA?9F%S= !S;&5E<&EN +M9U]Q=65U90!'2$-Z:4)AF1, +MFE3=&]R86)L95]WFE0;W-I>'II26YT97)N86QS7V]Z +M=4%04$5.1%]C;&]S=7)E &YE=T)#3WIH7V9AFE(86YD;&5?=V%N +M=%=R:71A8FQE2&%N9&QE>G%?:6YF;P!'2$-Z:5)E86Q?>F1W9&EV36]D7W-R +M= !'2$-Z:49L;V%T7VES26YF:6YI=&4Q7VEN9F\ 1TA#>FE,:7-T7VQV;#(R +M7W-R= !?7W-T9VEN:71?1F]R96EG;GII1F]R96EG;E!TFE#;VYC7WID3'(T059L +M=FPQ,%]S;&]W $=(0WII1FQO871?9FQO;W)?8VQO7-T96UZ:5!O +MFE);G1EF1W8V-A;&PU,E]I;F9O $=(0WII1FQO871?8V]S +M:$9L;V%T7V-L;W-UFE296%L7WID<#%296%L7VEN9F\ 1F]R96EG +M;GII4W1O7IU<&]K94)Y=&5/9F8R7V-L;W-UF1D;7-H;W=?:6YF;P!'2$-Z:45N=6U? +M>F1,GIL=FPQ-5]C;&]S=7)E $=(0WII0F%S95]N94EN=%]C;&]S=7)E +M $=(0WII24]"87-E7T)L;V-K961);F1E9FEN:71E;'E?8VQOF1W>F1SFE&;&]A=%]Z97IE7VEN +M9F\ 1TA#>FE0=')?4'1R7W-T871I8U]I;F9O ')TFE);G1?>F1D;7-H;W=,:7-T,E]I;F9O $=( +M0WII0F%S95]:0T1%<5]S=&%T:6-?:6YF;P!'2$-Z:4YU;5]E;G5M1&5L=&%4 +M;TEN=&5G97)&0E]I;F9O %]?FE-87)S:&%L>FE! +M0!3>7-T96UZ:5!OFE);G1EF1,5]F +MF1,F1S>F1D;7-H;WFE0;W-I>'II26YT97)N86QS +M7V]Z=5=23TY,65]I;F9O &]R26YT96=EFE3:&]W7W-H +M;W=3:6=N961);G1?8VQOFE&;&]A=%]E>'!TFE0;W-I>'II26YT97)N86QS7WID=V-C86QL-S5?8VQOFE&;&]A=%]A&ET4W1O +MFE.=6U?96YU;49R +M;VU4:&5N7V-L;W-UFE.=6U?FE.=6U?<75O=%)E;4EN=&5G97)? +M8VQOE]F9&EV7W%R $=(0WII24]"87-E7TEL;&5G86Q/<&5R871I;VY?8VQO7IUF5/9C)?:6YF;P!'2$-Z:4E/0F%S95]A +M-C9?8VQOF5R +MFE& +M;&]A=%]Z9$QR-TU!;'9L,31?:6YF;P!'2$-Z:4YU;5]Z9$QR,7=G;'9L,E]C +M;&]S=7)E %]?7-T96UZ:5!R;V-E5]S=&%R= !N97=!7IH7V9AFE3:&]W7UI#1%-H;W=?8V]N7VEN9F\ 1TA#>FE&;&]A +M=%]A8V]S1FQO871?8VQOF1W9V-D26YT7W-R= !S=7-P96YD5&AR96%D ')A:7-E07-Y +M;F, 1TA#>FE(86YD;&5?>F1,F1,FE%;G5M7W!R +M960U7V-L;W-UFE0;W-I>'II26YT97)N86QS7V-O;G-T>G5F +M>G5G971F;%]I;F9O %-YF1S>F1D;6UI;C)?8VQO'1Z:5)E861Z:4QE>%\ 6)E7TIU +MFE3:&]W7WIDFE#>FE%7IU7VEN9F\ 1TA#>FE%FE);G1?23AZ:%]C;VY?:6YF;P!S:'5T9&]W;DAAFE&;&]A=%]Z9'=E>'!T7V-L;W-U7-T96UZ:5!OFE);G1EFE)3U]L=FPU7V-L;W-UFE%>&-E<'1I;VY? +M>F1,FE.=6U?9G)O;4EN +M=&5G97(Q7VEN9F\ 1TA#>FE&;&]A=%]Z9'=R;W5N9%1O7W-R= !'2$-Z:5)E +M86Q?>F1F26YT96=R86Q);G1E9V5R7V-L;W-UFE)3T)AFE&;&]A=%]P:3%?8VQO5)E861(879E0G5F9F5R7V-L;W-U4E/7P!'2$-Z:4-O;F-?>F1,FE296%L7VQV;#1?:6YF;P!3>7-T96UZ:5!OFE);G1EF1W8V-A;&PV-5]C;&]S=7)E '-T9U].3U]&24Y!3$E:15)?8VQOFE);G1? +M23$V>FA?FE#;VYC7WID3'(T0FYF,5]C;&]S=7)E +M &UA:6X 1TA#>FE(86YD;&5?>F1W9FQUFE7;W)D7U=Z:%]S=&%T:6-?:6YF;P!S +M=&=?8FQO8VM?<'5T;79A<@!'2$-Z:4AA;F1L95]H0VQOG5Z=7IQ7V-L;W-UFA?8VQOF1,FE)3T)A +MFE&;&]A=%]Z9$QR-TUI;'9L-5]I;F9O $=(0WII +M24]"87-E7V$U-5]C;&]S=7)E $=(0WII0F%S95]U;G!A8VM#4W1R:6YG571F +M.'IH7VEN9F\ 1TA#>FE296%L7VQV;%]C;&]S=7)E '-T9U]OF1WFE-;VYA9 !'2$-Z +M:5)E86Q?6D-$4F5A;$9R86-?8V]N7VEN9F\ =6YB;&]C:T%S>6YC17AC97!T +M:6]NFE.=6U?2GIH7W-T871I8U]I;F9O $=(0WII24]" +M87-E7T)U9F9EFE);G1EFE4;W!(86YD;&5R7V1S7W-R= !I;FET061J=7-T;W( +M3W5T3V9(96%P2&]O:P!S=&=?FE0;W-I>'II26YT97)N86QS7WID=V-C86QL +M,39?:6YF;P!?7W-T9VEN:71?1TA#>FE3:&]W $=(0WII4F5A;%]Z8U]SFE296%L7W)E;3%?:6YF +M;P!F;W)K4')O8V5SF1,FE)3U]Z9'=C;VUM:71" +M=69F97)Z<5]I;F9O %-YFE2 +M96%L7WID=WIL>F5?8VQOFE(86YD;&5?;'9L-SE?:6YF;P!'2$-Z:5-H;W=?>F1WFE)3U]Z9'=W +MFE)3T)AFE.=6U?>F1F3W)D26YT96=EF1W=W)I=&5";&]C:W-? +MFE(86YD;&5?>F1,'1Z:5!AFE296%D4')E8U\ 1TA#>FE%FE(86YD;&5? +M;'9L,S!?8VQOFE(86YD;&5? +M>F1,GIE9$AA;F1L95]C;&]S=7)E ')TFA?:6YF;P!'2$-Z:49L;V%T7WID=V%C +M;W-H,5]I;F9O $=(0WII1FQO871?>F1,FE3:&]W7VQV;#$X7V-L;W-UFE)3T)AF1WFE"87-E7WIZ97)O26YT7V-L;W-UFE(86YD +M;&5?:6]E>G5C;&]S961(86YD;&5?FE(86YD;&5?>F1,FE&;&]A=%]Z +M9$QR-U!E;'9L-3)?8VQO$AA;F1L95]C;VY?:6YF +M;P!'2$-Z:4AA;F1L95]L=FPQ,#A?8VQOF1F3G5M1FQO871?8VQOFE&;&]A=%]TFE3=&%B;&5? $=( +M0WII1FQO871?;'9L,S5?8VQOFE%;G5M7V5F=$EN=$9"7W-L;W< 1TA#>FE. +M=6U?:G1O6)E7TYO=&AI;F=?FE(86YD;&5?:6]E +M>G5C;&]S961(86YD;&5?F1,FE&;&]A=%]Z9'=L;V="87-E,5]C;&]S=7)E $=(0WII26YT7TDS +M,GIH7W-T871I8U]I;F9O '=A:717F1F4W1OF1W:6YT +M5&]$:6=I=%]I;F9O &ES1&]U8FQE3F5G871I=F5:97)O '-T;5=R:71E5%9A +M<@!'2$-Z:4-O;F-?>F1,7-T96UZ:5!OFE);G1E +MF1W8V-A;&PW7V-L;W-UFE3=&]R86)L95]R96%D4'1R +M3V9F4'1R7V-L;W-UFE0;W-I>'II26YT97)N86QS7W-I>GIE +M;V9Z=7-T871?:6YF;P!?7V9I>'5NFE&;&]A=%]Z9'=Z +M9'-FG%?FE#4%54 +M:6UE7V=E=$-0551I;65?FE&;W)E:6=N +M4'1R '-T9U]A<%\V7W5P9%]I;F9O '-T;W!4:6UE<@!'2$-Z:49L;V%T7V9L +M;V%T1&EG:71S,5]I;F9O %]F:6YI '-T9U]L94EN=#8T %]?FA?FE&;&]A=%]T +M86Y&;&]A=%]I;F9O '-QFE%;G9IFE&;&]A=%]Z9&1M;6%X,5]C;&]S +M=7)E $=(0WII3G5M7W!L=7-);G1E9V5R7V-L;W-U7IH +M7V9AFE(86YD;&5?>F1,FE&;&]A=%]Z9$QR-TXT;'9L,CE?:6YF;P!'2$-Z:5)E86Q?>F1F4F5A +M;$EN=%]C;&]S=7)E $=(0WII4F5A;%]Q=6]T,E]SFE296%L7V$R +M7V-L;W-UFE&;&]A=%]Z9$QR-TU) +M;'9L,3A?8VQOFE)3T)AF1D;7-H;W=?8VQOFE#>FE%5]C;&]S=7)E +M $=(0WII4F5A;%]Z9'=Z;%]I;F9O $=(0WII1FQO871?<')O<&5R1G)A8W1I +M;VY?8VQOFE&;&]A=%]A,U]C;&]S=7)E $=(0WII1FQO871?>F1,FE"87-E7T9A;'-E7V-L;W-UFE)3T)AFE"87-E7UI# +M7V-O;E]I;F9O '-T9U]G96Y?8FQO8VL 1TA#>FE.=6U?:6YT96=EFE(86YD;&5?;'9L-S9?8VQOF1,FE"87-E7V1I=DEN='IH7V-L +M;W-UFE&;&]A=%]Z9$QR-TUI;'9L-5]C;&]S=7)E $=(0WII07)R +M7WID3'(TFE-87)S:&%L>FE0;V]L7P!'2$-Z +M:51O<$AA;F1L97)?9'-?:6YF;P!'2$-Z:5)E86Q?83$U7V-L;W-UFE"87-E7VQV;#5?:6YF;P!S=&=?4U1!0DQ%7TY!345?:6YF;P!'2$-Z:4)A +MF1S>F1D;6UI;C)?:6YF;P!'2$-Z:4EN=%]S:6=N=6TR7VEN9F\ 1TA# +M>FE)3U]WFE)3T)A +MFE%F1,FE&;&]A=%]P;'5S1FQO871?8VQOFE3=&]R86)L95]P;VQY>G5P965K0GET94]F9C)? +M8VQOF1W7-T96UZ +M:5!OFE);G1EF1W8V-A;&PS,E]I;F9O $=(0WII3&ES=%]Z +M9$QR,417;'9L,U]C;&]S=7)E $=(0WII24]"87-E7VQV;#0Y7V-L;W-UFE&;&]A=%]&>FA?FE%;G5M7V9R;VU%;G5M +M-%]C;&]S=7)E '-T9U]U<&1?9G)A;65?,%]R970 1TA#>FE(86YD;&5?>F1, +MGIE9$AA;F1L95]I;F9O '-T9U]A<%]S=&M?<' +M1TA#>FE"87-E7TEZ:%]C;VY?:6YF;P!S=&U686QI9&%T951R86YS86-T:6]N +M $=(0WII3G5M7V5N=6U&0!'2$-Z:4E/0F%S +M95]!<'!E;F1(86YD;&5?8VQOFE&;&]A=%]Z9'=F;&]A=%1O1&EG:71S7VEN9F\ 7U]S=&=I;FET7T=(0WII +M4F5A9 !'2$-Z:5)E86Q?>F1W9C%?8VQOFE(86YD +M;&5?9$5&055,5'IU0E5&1D52>G5325I:15]I;F9O $=(0WII1FQO871?<')O +M<&5R1G)A8W1I;VY?:6YF;P!S=&=?FE(86YD +M;&5?;6M3=&1(86YD;&5?8VQOFE#4%54:6UE7V=E=$-0551I;65?:6YF;P!S=&=#86QL;V-">71EF1D;7IG>F5?:6YF;P!'2$-Z:45N=6U?969D=$EN=%5P7V-L +M;W-UFE&;&]A=%]Z9$QR-U!G;'9L-3-?FE%;G5M7V5F=$EN=%]I;F9O $=(0WII0F%S95]C;VUP87)E +M26YT7V-L;W-U$5X<'1?8VQOFE&;&]A=%]Z9$QR-TU1;'9L,C)?8VQO7-T96UZ +M:5!OFE);G1EF1W8V-A;&PU,5]C;&]S=7)E $=(0WII2&%N +M9&QE7W=I=&A(86YD;&5Z=7IQ7VEN9F\ 1TA#>FE&;&]A=%]Z9'=Z9'-Z9&1M +M871A;C)?8VQOFE%F1,FE0;W-I>'II26YT97)N86QS7WID=V-C86QL-CA? +M:6YF;P!'2$-Z:4AA;F1L95]L=FPW,5]I;F9O $=(0WII24]"87-E7VQV;#8P +M7VEN9F\ 1TA#>FE296%L7W%U;W0Q7V-L;W-UFE0;W-I>'II +M26YT97)N86QS7VEO97IU=6YK;F]W;F9I;&5T>7!E7V-L;W-UFE& +M;&]A=%]Z9'=Z9'-FFE)3WII17)R;W)? '-T9U]S96Q?,3!? +M;F]U<&1?:6YF;P!S=&=?=V]R9%1O5V]R9#8T $=(0WII4F5A;%]Z9'=Z9'-R +M961U8V5?:6YF;P!'2$-Z:4E/0F%S95])3T5X8V5P=&EO;E]S=&%T:6-?:6YF +M;P!'2$-Z:49L;V%T7WID3'(W3T]L=FPT,U]I;F9O '-T9U]G8U]U= !'2$-Z +M:4E/0F%S95]L=FPV,U]C;&]S=7)E &]BFE&;&]A=%]Z9$QR-TU9;'9L,C9?8VQOFE)3T)A&-E<'1I +M;VY?FE,:7-T +M7WID=VQE;E]C;&]S=7)E %]?FE0='( 1TA#>FE& +M;&]A=%]IF1W>F5Z95]C;&]S=7)E +M $=(0WII24]"87-E7T1E861L;V-K7W-T871I8U]I;F9O $=(0WII1FQO871? +M1'IH7V-O;E]I;F9O $=(0WII1FQO871?FE)3T)AFE(86YD;&5?;'9L,3 U7VEN9F\ FE%;G5M7V5N=6U&F5?:6YF;P!' +M2$-Z:49L;V%T7VES1&5N;W)M86QI>GIE9#%?:6YF;P!'2$-Z:4AA;F1L95]Z +M9'=A=6=M96YT24]%FE&;&]A=%]&>FA?8V]N7VEN9F\ FE3:&]W7WID +MF1,FE);G1?>G R7V-L;W-UFE0;W-I>'II26YT +M97)N86QS7V]Z=4Y/3D),3T-+7VEN9F\ 4WES=&5M>FE0;W-I>'II26YT97)N +M86QS7WID=V-C86QL-35?FE)3T)AFE#;VYC7W!E;F1I;F=$96QA>7-?:6YF;P!S=&=?5]I;G1EF1S979E;E]SFE&;&]A=%]TF1F1FQO871I;F=&;&]A=%]C;&]S=7)E $=(0WII4F5A;%]Q=6]T +M,5]SFE.=6U?>F1D;6UI;E]C;&]S=7)E %]?FE)3T)AF1,FE.=6U?96YU;49R;VU4 +M;U]C;&]S=7)E $=(0WII24]"87-E7V$U-%]I;F9O '%U;W1);G1E9V5R>FA? +M9F%S= !?7W-T9VEN:71?5&5X='II4VAO=U\ 1TA#>FE(86YD;&5?=V%N=%=R +M:71A8FQE2&%N9&QE7VEN9F\ 1TA#>FE)3U]H4'5T4W1R7V-L;W-UFE0;W-I>'II +M26YT97)N86QS7WID=V-C86QL-C=?8VQO7-T96UZ:5!OFE) +M;G1EFE(86YD;&5? +M9$5&055,5'IU0E5&1D52>G5325I:15]C;&]S=7)E $=(0WII2&%N9&QE7V%U +M9VUE;G1)3T5RF4S7VEN9F\ 1F]R +M96EG;GII0WII17)R;W)?>F1W8V-A;&PR7V-L;W-UFE0;W-I +M>'II26YT97)N86QS7WID=V-C86QL,C9?:6YF;P!S=&=?8W1O:5],,5]I;F9O +M $=(0WII0V]N8U]T:')E861786ET4F5A9%]I;F9O %-YG521$].3%E?8VQO71E7-T +M96UZ:5!OFE);G1EFE0 +M;W-I>'II26YT97)N86QS7WID=V-C86QL,C9?8VQOFE#>FE%FE#;VYC7WID3'(T0C5Z9'=I;G-E5]C;&]S=7)E $=(0WII +M2&%N9&QE7V$Q.%]C;&]S=7)E $=(0WII07)R7V%RFA?9F%S +M= !S=&=?24Y43$E+15]C;&]S=7)E $=(0WII1FQO871?871A;D9L;V%T7VEN +M9F\ 1TA#>FE&;&]A=%]E;F-O9&5&;&]A=#%?8VQOFE0;W-I>'II26YT97)N86QS7WID=V-C86QL +M,C-?8VQOFA?:6YF;P!A;&QO +M8TYUFE0 +M='( 1TA#>FE.=6U?9G)O;4EN=&5G97)?8VQOF5?8VQOFE"87-E7W5N +M<&%C:T%P<&5N9$-3=')I;F=Z:%]C;&]S=7)E $=(0WII24]"87-E7VQV;#8R +M7V-L;W-UFE296%L7WID=V$R7V-L;W-UFE!F1W +M:6YD97 at Q7VEN9F\ 1TA#>FE)3T)A5]S +M=&%T:6-?:6YF;P!?7W-T9VEN:71?1TA#>FE.=6U? &YE>'1?<&5N9&EN9U]H +M86YD;&5R '-T9U]S=')L96X 1TA#>FE&;&]A=%]Z9&93:&]W1FQO871?8VQO +MFE)3T)AFE&;&]A=%]A8V]S:#%?8VQOFE0;W-I>'II26YT97)N86QS7V$U7V-L;W-UFE(86YD;&5? +M875G;65N=$E/17)R;W)?:6YF;P!S;6%L;%]A;&QO8U]L:7-T $=(0WII1FQO +M871?>F1,61S7VEN9F\ 1TA#>FE(86YD;&5?>F1,G5F;&%G +MFE296%L7WID +M=WIDF-?FE%>&-E<'1I;VY?>F1, +MFQZ95]I;F9O $=(0WII2&%N9&QE +M7W=A;G17FE7;W)D7UF1W=&]2871I;VYA;%]SFE0;W-I +M>'II26YT97)N86QS7V$Q7VEN9F\ F1,FE0;W-I>'II26YT97)N +M86QS7WID=V-C86QL-35?:6YF;P!R='-?9V5T26YT $=(0WII3&ES=%]P;VQY +M>G5I;FET>G%?:6YF;P!'2$-Z:4AA;F1L95]A,C1?:6YF;P!'2$-Z:4E/0F%S +M95]297-O=7)C945X:&%UFE" +M87-E7WID=V=C9$EN=%]I;F9O %-YFE&;&]A=%]Z9'=Z9'-FFE&;&]A=%]Z9'=AG5S=&%T7V-L +M;W-UFE&;&]A=%]C;W-&;&]A=%]C;&]S=7)E $=(0WII2&%N9&QE +M7WID3'(X;F9L=FPR.5]C;&]S=7)E '-T9U])3D1?3TQ$1T5.7VEN9F\ F1W839?:6YF;P!3>7-T +M96UZ:5!OFE);G1EFE&;&]A +M=%]Z9'-Z9&1M871A;C)?:6YF;P!?7W-T9VEN:71?5&5X='II4F5A9 !'2$-Z +M:5)E86Q?;'9L-5]C;&]S=7)E '-T9U]A<%]F7VEN9F\ FE0;W-I>'II +M26YT97)N86QS7WID=V-C86QL,S!?FE(86YD;&5?>F1W=W)I=&5287="=69F97)?'!IF1W=W)I=&5";&]C:W-? +M:6YF;P!'2$-Z:49L;V%T7WID3'(W3U-L=FPT-5]I;F9O $=(0WII3G5M7V1I +M=DUO9$EN=&5G97)?8VQOFE) +M;G1?86)S,E]C;&]S=7)E $=(0WII3G5M7V5N=6U&FE&;&]A=%]Z9$QR-TU%;'9L,39?8VQOFE&;&]A=%]Z9'-F7-T96UZ:5!OFE);G1EFE)3T)AFE)3P!'2$-Z:4E/0F%S95].;U-U8VA4:&EN9U]S=&%T:6-?:6YF +M;P!'2$-Z:49L;V%T7V-E:6QI;F=?FE.=6U?>F1W<75O=%)E +M;4EN=&5G97)?:6YF;P!'2$-Z:5)E86Q?;'9L-E]I;F9O &MI;&Q4:')E861Z +M:%]F87-T $=(0WII4F5A;%]:0T1);G1E9W)A;%]C;VY?:6YF;P!'2$-Z:4E/ +M7VA0=71#:&%R5]S=&%R= !?7W-T9VEN:71?5&5X='II4F5A9%\ 1TA#>FE. +M=6U?:6YT,DEN=&5G97)?:6YF;P!S=&=?87!?;E]I;F9O $=(0WII26YT7WID +M9E-H;W=);G0S,E]C;&]S=7)E $=(0WII07)R7WID=VEN9&5X,5]SFE"87-E7WID3'(R-&ML=FPV7V-L;W-UFE(86YD;&5? $=(0WII5&]P2&%N9&QEFE(86YD;&5?;W!E;D9D7V-L;W-UFE)3T)AFE296%L7WID=W1O4F%T:6]N86Q?:6YF;P!'2$-Z +M:49L;V%T7VES3F5G871I=F5:6F5R;S%?:6YF;P!S=&=?FE&;&]A=%]Z +M9$QR-U!O;'9L-3=?:6YF;P!3>7-T96UZ:5!OFE);G1EF1, +MFE3=&]R86)L95]P +M;VQY>G5A;&EG;FUE;G0R7VEN9F\ 7TE/7W-T9&EN7W5S960 7U]S=&=I;FET +M7T9OFE)3U]Z9$QR,C-Q:%!U=&-"=69F97)E9%]S +MFE.=6U?>F1,FE-87)S:&%L>FE!;&QO8U\ 1TA#>FE)3T)AFE3:&]W7VET;W-?8VQOFE)3U]Z9'=WFE0;W-I>'II26YT97)N86QS7WID=V-C86QL-E]C;&]S=7)E '-T;4-O +M;F1E;6Y4F1WFE#4%54:6UE '-C:&5D=6QE5V%I=%1HF1D +M;7-H;W=,:7-T7W-R= !S=&=?8V%T8VA?$5RG5.3TY"3$]#2U]C;&]S=7)E $=(0WII4F5A;%]:0T12 +M96%L7W-T871I8U]I;F9O $=(0WII3G5M7VQV;#E?8VQOFE7;W)D7UFE(86YD;&5?;'9L,3$R7VEN9F\ ;6M796%K>FA?9F%S +M= !'2$-Z:49L;V%T7WID3'(W3FEL=FPS-%]C;&]S=7)E $-O;G1R;VQZ:45X +M8V5P=&EO;E]Z9$QR,EE2;'9L-%]S;&]W $9OFE"87-E7VQT26YT7V-L;W-UFE(86YD;&5?>F1,FE296%L7WID +M3'(TFE& +M;&]A=%]Z9$QR-U P;'9L-#E?:6YF;P!'2$-Z:4YU;5]Z9'=S:&]WF1,F1,F1,7-T96UZ:5!OFE);G1EFE(86YD;&5?FE296%L7UI#>G9?8V]N +M7VEN9F\ 1TA#>FE&;&]A=%]Z9'=I;G1E9V5R3&]G0F%S95]C;&]S=7)E $=( +M0WII1FQO871?;'9L-#%?8VQOFE.=6U?;'9L,31? +M8VQOF1,FE&;&]A=%]IFE2 +M96%L7WID=V8Q7VEN9F\ 1TA#>FE&;&]A=%]L=FPX7V-L;W-UFE" +M87-E7UHP5%]S=&%T:6-?:6YF;P!G,',P %-YF1W85]SFE4;W!(86YD;&5R7W1O<$AA;F1L97)?8VQOFE(86YD;&5? +M>F1W9FEL;%)E861"=69F97),;V]P7V-L;W-UFE0;W-I>'II +M26YT97)N86QS7WID=V-C86QL,C%?:6YF;P!'2$-Z:49L;V%T7V9OFE(86YD;&5?9FQUFE3:&]W7WID9E-H;W=);G1?8VQOFE&;&]A=%]M:6Y%>'!T +M7V-L;W-U7-T96UZ:5!OFE);G1E +M7!E7V-L;W-UFE& +M;&]A=%]L=FPS,E]C;&]S=7)E $=(0WII26YT7WID=WIE>F5?:6YF;P!'2$-Z +M:4E/0F%S95]A-CE?:6YF;P!'2$-Z:4YU;5]Z9&1MFE( +M86YD;&5?;'9L.3-?8VQOF1,FE0;W-I>'II26YT97)N86QS7U)E9W5L87)&:6QE7V-L +M;W-UFE0;W-I>'II26YT97)N86QS7V-O;G-T +M>G5F>G5G971F;%]C;&]S=7)E $=(0WII3G5M7WID3'(Q=W=L=FPQ,%]C;&]S +M=7)E &UAG5526YT7VEN9F\ 1TA#>FE%;G5M7VQV;#$V7VEN9F\ 1TA#>FE&;&]A=%]A +M=&%N:#%?8VQOFE&;&]A +M=%]M:6YUFE!F1,FE,:7-T7VEN:71?FE0;W-I>'II26YT97)N86QS7WID=V-C +M86QL-35?8VQOFE296%L7UI#1$EN=&5GFA?9F%S= !'2$-Z:4E/0F%S95]);F%P<')O +M<')I871E5'EP95]S=&%T:6-?:6YF;P!'2$-Z:49L;V%T7WID=W1O4F%T:6]N +M86Q?:6YF;P!'2$-Z:4QIF1,G!Z<%]C;&]S=7)E $=(0WII +M3G5M7W-I9VYU;3)?8VQOFE)3T)AF1WGE296%D0G5F9F5R960Q7V-L;W-U +MFE)3T)AFE%>&-E<'1I +M;VY?>F1,F1,FE&;&]A=%]P;W=EFE!F1,FE2 +M96%L7WID=V8R7VEN9F\ FE296%L +M7W%U;W0Q7VEN9F\ 1TA#>FE)3T)AFE&;&]A +M=%]S:&]W3&ES=%]I;F9O $=(0WII24]"87-E7WID3'(U0FAA-3!?8VQO%]R,0!'2$-Z:4)AFA?:6YF;P!S=&=?87!?FE)3T)AF1,FA?9F%S= !S=&=? +MFE( +M86YD;&5?F1,FE&;&]A=%]Z9$QR-TY);'9L,SA?8VQOFE296%L7WID=V1I=DUO9%]I;F9O $=(0WII +M4F5A;%]R96TR7W-R= !'2$-Z:4AA;F1L95]Z9$QR.'$Y;'9L.3E?8VQOF1W>F1S>F-?:6YF;P!'2$-Z:4)AF-?:6YF;P!'2$-Z:4E/0F%S +M95]S=&%C:T]V97)F;&]W7V-L;W-UF=Z95]C;&]S=7)E %]?9GAS=&%T-C1 0$=,24)#7S(N,@!L +M;V]K=7!(87-H5&%B;&4 1TA#>FE&;&]A=%]Z9'=E>'!T7VEN9F\ 1TA#>FE& +M;&]A=%]C;W-&;&]A=%]I;F9O &)L;V-K961?<75E=65?:&0 1TA#>FE#;VYC +M7U=R:71E7V-O;E]I;F9O '-T;4%B;W)T5')A;G-A8W1I;VX 1TA#>FE)3T)A +MF1WFE%;G5M7V5F=$EN=$9"7VEN9F\ 1TA#>FE&;&]A=%]Z9'=A=&%N:#%?8VQO +M7IH7V9AF1,FE%F1,FE4;W!(86YD;&5R7V1S7W-L;W< FE(86YD;&5?;'9L-SA? +M8VQOF1,FE)3T)A&AA=7-T961?FE. +M=6U?;'9L,39?8VQOFE)3T)AFE)3T)A +MFE(86YD;&5?:6]E>G5%3T9?:6YF;P!3>7-T96UZ:5!O +MFE);G1EF1W8V-A;&PR-5]S;&]W $=(0WII0V]N8U]PG5R979?:6YF;P!? +M7W-T9VEN:71?1&%T87II0FETFE,:7-T7W1A:V5Z=75N +#include +#include +#include +#include + +#define MAX_SIZE 10000000 + +int skip_to_newline(char* input, int offset) { /*1*/ + while(input[offset] != 10) /*2*/ + {offset++;} /*3*/ + return ++offset; /*4*/ +} + +decode_char(char in) { /*5*/ + return ((in) - ' ') & 63; /*6*/ +} + +int decode(char* input, int offset, char* output) { /*7*/ + int ooffset = 0; /*8*/ + while (input[offset] != 32) { /*9*/ + int encodedoctets; /*10*/ + encodedoctets = decode_char(input[offset]); /*11*/ + for (++offset; encodedoctets > 0; offset += 4, encodedoctets -= 3) { /*12*/ + char ch; /*13*/ + if (encodedoctets >= 3) { /*14*/ + ch = decode_char (input[offset]) << 2 | /*15*/ + decode_char (input[offset+1]) >> 4; /*16*/ + output[ooffset++] = ch; /*17*/ + ch = decode_char (input[offset+1]) << 4 | /*18*/ + decode_char (input[offset+2]) >> 2; /*19*/ + output[ooffset++] = ch; /*20*/ + ch = decode_char (input[offset+2]) << 6 | /*21*/ + decode_char (input[offset+3]); /*22*/ + output[ooffset++] = ch; /*23*/ + } else { + if (encodedoctets >= 1) { /*24*/ + ch = decode_char (input[offset]) << 2 | /*25*/ + decode_char (input[offset+1]) >> 4; /*26*/ + output[ooffset++] = ch; /*27*/ + } + if (encodedoctets >= 2) { /*28*/ + ch = decode_char (input[offset+1]) << 4 | /*29*/ + decode_char (input[offset+2]) >> 2; /*30*/ + output[ooffset++] = ch; /*31*/ + } + } + } + offset = skip_to_newline(input, offset); /*32*/ + } + offset = skip_to_newline(input, offset); /*33*/ + if (input[offset]=='e' && input[offset+1]=='n' /*34*/ + && input[offset+2]=='d') { /*35*/ + return ooffset; /*36*/ + } + exit(1); /*37*/ + } + + + +int do_decode(char* input, char* output, char* outfilename) { /*38*/ + int mode, namelen; /*39*/ + if (sscanf (input, "begin %o %s \n", &mode, outfilename)==2){ /*40*/ + namelen = strlen(outfilename); /*41*/ + return decode(input, namelen+12, output); /*42*/ + } + exit(1); /*43*/ +} +/*==========================================================================*/ + +static size_t read_data(FILE *in, void *buffer) +{ + return fread(buffer, 1, MAX_SIZE, in); +} + +static size_t write_data(FILE *out, int size, void *buffer) +{ + return fwrite(buffer, 1, size, out); +} + + +int main(int argc, char *argv[]) +{ + FILE *in,*out; + int i; + size_t size; + int outsize,time; + unsigned char *inbuf, *outbuf, *temp; + char outfilename[100]; + char postfix[] = ".c"; + struct timeval pre,post; + + /* optional input arg */ + inbuf = malloc(MAX_SIZE); + outbuf = malloc(MAX_SIZE); + + if (argc > 1) { + //create_test_data(argv[1]); // for testing purposes + if ((in = fopen(argv[1], "r")) == NULL) { + perror(argv[1]); + exit(1); + } + argv++; argc--; + } + + else{ + in = stdin; + out = stdout; + } + if (argc != 1) { + printf("Usage: uudecode [infile]\n"); + exit(2); + } + size = read_data(in, inbuf); + gettimeofday(&pre,0); + for(i=0;i<100;i++){ + outsize = do_decode(inbuf,outbuf,outfilename); + } + + printf("%d", outsize); + exit(0); +} \ No newline at end of file Added: test-suite/trunk/MultiSource/Benchmarks/BitBench/uuencode/Makefile URL: http://llvm.org/viewvc/llvm-project/test-suite/trunk/MultiSource/Benchmarks/BitBench/uuencode/Makefile?rev=49147&view=auto ============================================================================== --- test-suite/trunk/MultiSource/Benchmarks/BitBench/uuencode/Makefile (added) +++ test-suite/trunk/MultiSource/Benchmarks/BitBench/uuencode/Makefile Thu Apr 3 01:40:56 2008 @@ -0,0 +1,6 @@ +LEVEL = ../../../.. + +PROG = uuencode +LDFLAGS = +RUN_OPTIONS = uuencode.c +include $(LEVEL)/MultiSource/Makefile.multisrc Added: test-suite/trunk/MultiSource/Benchmarks/BitBench/uuencode/uuencode.c URL: http://llvm.org/viewvc/llvm-project/test-suite/trunk/MultiSource/Benchmarks/BitBench/uuencode/uuencode.c?rev=49147&view=auto ============================================================================== --- test-suite/trunk/MultiSource/Benchmarks/BitBench/uuencode/uuencode.c (added) +++ test-suite/trunk/MultiSource/Benchmarks/BitBench/uuencode/uuencode.c Thu Apr 3 01:40:56 2008 @@ -0,0 +1,198 @@ +/* uuencode.c -- uuencode utility. + * Copyright (C) 1994, 1995 Free Software Foundation, Inc. + * + * This product is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This product is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this product; see the file COPYING. If not, write to + * the Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA + * 02111-1307, USA. + */ + +/* Copyright (c) 1983 Regents of the University of California. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +/* Reworked to GNU style by Ian Lance Taylor, ian at airs.com, August 93. */ +/* Hacked to work with BusyBox by Alfred M. Szmidt */ +/* Rewrritten to fit my benchmark rules by Per Gustafsson */ + +#include +#include +#include +#include +#include + +#define MAX_SIZE 1000000 + +encode_char(char c) { /*1*/ + return (32+(c & 63)); /*2*/ +} + +void encode_line(char* input, int offset, int octets, char* line){ /*3*/ + int loffs=0; /*4*/ + line[loffs]=encode_char(octets); /*5*/ + for (++loffs; octets > 0; offset += 3, octets -= 3) { /*6*/ + char ch; /*7*/ + if (octets >= 3) { /*8*/ + ch = encode_char (input[offset] >> 2); /*9*/ + line[loffs++] = ch; /*10*/ + ch = encode_char ((input[offset] << 4) | (input[offset+1] >> 4)); /*11*/ + line[loffs++] = ch; /*12*/ + ch = encode_char ((input[offset+1] << 2) | (input[offset+2] >> 6)); /*13*/ + line[loffs++] = ch; /*14*/ + ch = encode_char (input[offset+2]); /*15*/ + line[loffs++] = ch; /*16*/ + } else { + if (octets == 1) { /*17*/ + ch = encode_char (input[offset] >> 2); /*18*/ + line[loffs++] = ch; /*19*/ + ch = encode_char (input[offset] << 4); /*20*/ + line[loffs++] = ch; /*21*/ + line[loffs++] = '='; /*22*/ + line[loffs++] = '='; /*23*/ + } else { + if (octets == 2) { /*24*/ + ch = encode_char ((input[offset]) >> 2); /*25*/ + line[loffs++] = ch; /*26*/ + ch = encode_char ((input[offset] << 4) | (input[offset+1] >> 4)); /*27*/ + line[loffs++] = ch; /*28*/ + ch = encode_char (input[offset+1] << 2); /*29*/ + line[loffs++] = ch; /*30*/ + line[loffs++] = '='; /*31*/ + } + } + } + } + line[loffs++] = '\n'; /*32*/ + line[loffs] = 0; /*33*/ + return ; +} + +void encode(char* input, int limit, char* output){ /*34*/ + char line[63]; /*35*/ + int offset=0; /*36*/ + while(offset= 45) { /*38*/ + encode_line(input, offset, 45, line); /*39*/ + offset += 45; /*40*/ + } + else { + encode_line(input, offset, limit-offset, line); /*41*/ + offset = limit; /*42*/ + } + strcat(output,line); /*43*/ + output = output + strlen(output); /*44*/ + } + strcat(output," \nend"); /*45*/ + return; +} + +int do_encode(char* input, char* output, int len, char* infilename) { /*46*/ + int mode, namelen; /*47*/ + strcpy(output, "begin 640 "); /*48*/ + strcat(output,infilename); /*49*/ + strcat(output, " \n");{ /*50*/ + namelen = strlen(infilename); /*51*/ + encode(input, len, output+strlen(output)); /*52*/ + return strlen(output); /*53*/ + } + exit(1); /*54*/ +} + +/*==========================================================================*/ + +static size_t read_data(FILE *in, void *buffer) +{ + return fread(buffer, 1, MAX_SIZE, in); +} + +static size_t write_data(FILE *out, int size, void *buffer) +{ + return fwrite(buffer, 1, size, out); +} + +int main(int argc, char *argv[]) +{ + FILE *in,*out; + int i; + size_t size; + int outsize,time; + unsigned char *inbuf, *outbuf, *temp; + char outfilename[100]; + char postfix[] = ".c"; + struct timeval pre,post; + + /* optional input arg */ + inbuf = malloc(MAX_SIZE); + outbuf = malloc(MAX_SIZE*2); + + if (argc > 1) { + //create_test_data(argv[1]); // for testing purposes + if ((in = fopen(argv[1], "r")) == NULL) { + perror(argv[1]); + exit(1); + } + strcpy(outfilename,argv[1]); + strcat(outfilename,postfix); + argc--; + } + + else{ + in = stdin; + out = stdout; + } + if (argc != 1) { + printf("Usage: uuencode [infile]\n"); + exit(2); + } + size = read_data(in, inbuf); + gettimeofday(&pre,0); + for(i=0;i<100;i++){ + outsize = do_encode(inbuf,outbuf, size, argv[1]); + + } + + gettimeofday(&post,0); + time = ((post.tv_sec*1000000+post.tv_usec)-(pre.tv_sec*1000000+pre.tv_usec)); + + printf("%d", outsize); + + exit(0); +} \ No newline at end of file From resistor at mac.com Thu Apr 3 01:40:56 2008 From: resistor at mac.com (Owen Anderson) Date: Thu, 03 Apr 2008 06:40:56 -0000 Subject: [llvm-commits] [test-suite] r49147 [2/3] - in /test-suite/trunk/MultiSource/Benchmarks/BitBench: Makefile drop3/ drop3/Makefile drop3/drop3.c drop3/input-file drop3/input-file.c huffman/ huffman/Makefile huffman/huffman.c huffman/input-file huffman/input-file.c uudecode/ uudecode/Makefile uudecode/input-file uudecode/uudecode.c uuencode/ uuencode/Makefile uuencode/uuencode.c Message-ID: <200804030640.m336ewxG029940@zion.cs.uiuc.edu> Added: test-suite/trunk/MultiSource/Benchmarks/BitBench/drop3/input-file URL: http://llvm.org/viewvc/llvm-project/test-suite/trunk/MultiSource/Benchmarks/BitBench/drop3/input-file?rev=49147&view=auto ============================================================================== --- test-suite/trunk/MultiSource/Benchmarks/BitBench/drop3/input-file (added) +++ test-suite/trunk/MultiSource/Benchmarks/BitBench/drop3/input-file Thu Apr 3 01:40:56 2008 @@ -0,0 +1,12016 @@ +module 'tr' ['arg'/0, + 'module_info'/0, + 'module_info'/1] + attributes [] +'arg'/0 = + fun () -> + let <_cor0> = + #{#<4>(4,1,'integer',['unsigned','big']), + #<5>(4,1,'integer',['unsigned','big']), + #<0>(64,1,'integer',['unsigned','big']), + #<1>(8,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<1345227250>(32,1,'integer',['unsigned','big']), + #<3192222976>(32,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<0>(56,1,'integer',['unsigned','big']), + #<4294967295>(32,1,'integer',['unsigned','big'])}# + in let <_cor1> = + #{#<4>(4,1,'integer',['unsigned','big']), + #<5>(4,1,'integer',['unsigned','big']), + #<0>(64,1,'integer',['unsigned','big']), + #<1>(8,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<1345227250>(32,1,'integer',['unsigned','big']), + #<3192222976>(32,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<0>(56,1,'integer',['unsigned','big']), + #<4294967295>(32,1,'integer',['unsigned','big'])}# + in let <_cor2> = + #{#<4>(4,1,'integer',['unsigned','big']), + #<5>(4,1,'integer',['unsigned','big']), + #<0>(64,1,'integer',['unsigned','big']), + #<6>(8,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<1345227236>(32,1,'integer',['unsigned','big']), + #<3169685504>(32,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<0>(56,1,'integer',['unsigned','big']), + #<512>(32,1,'integer',['unsigned','big'])}# + in let <_cor3> = + #{#<4>(4,1,'integer',['unsigned','big']), + #<5>(4,1,'integer',['unsigned','big']), + #<0>(64,1,'integer',['unsigned','big']), + #<6>(8,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<1345227155>(32,1,'integer',['unsigned','big']), + #<3287212287>(32,1,'integer',['unsigned','big']), + #<65535>(16,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<0>(56,1,'integer',['unsigned','big']), + #<0>(32,1,'integer',['unsigned','big'])}# + in let <_cor4> = + #{#<4>(4,1,'integer',['unsigned','big']), + #<5>(4,1,'integer',['unsigned','big']), + #<0>(64,1,'integer',['unsigned','big']), + #<6>(8,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<1345227232>(32,1,'integer',['unsigned','big']), + #<3117867794>(32,1,'integer',['unsigned','big']), + #<65535>(16,1,'integer',['unsigned','big']), + #<1433>(16,1,'integer',['unsigned','big']), + #<0>(56,1,'integer',['unsigned','big']), + #<4294967295>(32,1,'integer',['unsigned','big'])}# + in let <_cor5> = + #{#<4>(4,1,'integer',['unsigned','big']), + #<5>(4,1,'integer',['unsigned','big']), + #<0>(64,1,'integer',['unsigned','big']), + #<6>(8,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<1345227264>(32,1,'integer',['unsigned','big']), + #<1345224704>(32,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<65535>(16,1,'integer',['unsigned','big']), + #<0>(56,1,'integer',['unsigned','big']), + #<4294967295>(32,1,'integer',['unsigned','big'])}# + in let <_cor6> = + #{#<4>(4,1,'integer',['unsigned','big']), + #<5>(4,1,'integer',['unsigned','big']), + #<0>(64,1,'integer',['unsigned','big']), + #<6>(8,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<1345227225>(32,1,'integer',['unsigned','big']), + #<3240344314>(32,1,'integer',['unsigned','big']), + #<65535>(16,1,'integer',['unsigned','big']), + #<1489>(16,1,'integer',['unsigned','big']), + #<0>(56,1,'integer',['unsigned','big']), + #<4294967295>(32,1,'integer',['unsigned','big'])}# + in let <_cor7> = + #{#<4>(4,1,'integer',['unsigned','big']), + #<5>(4,1,'integer',['unsigned','big']), + #<0>(64,1,'integer',['unsigned','big']), + #<6>(8,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<1345227236>(32,1,'integer',['unsigned','big']), + #<3169685504>(32,1,'integer',['unsigned','big']), + #<65535>(16,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<0>(56,1,'integer',['unsigned','big']), + #<512>(32,1,'integer',['unsigned','big'])}# + in let <_cor8> = + #{#<4>(4,1,'integer',['unsigned','big']), + #<5>(4,1,'integer',['unsigned','big']), + #<0>(64,1,'integer',['unsigned','big']), + #<0>(8,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<1345227775>(32,1,'integer',['unsigned','big']), + #<3532670656>(32,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<65535>(16,1,'integer',['unsigned','big']), + #<0>(56,1,'integer',['unsigned','big']), + #<0>(32,1,'integer',['unsigned','big'])}# + in let <_cor9> = + #{#<4>(4,1,'integer',['unsigned','big']), + #<5>(4,1,'integer',['unsigned','big']), + #<0>(64,1,'integer',['unsigned','big']), + #<6>(8,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<1345227206>(32,1,'integer',['unsigned','big']), + #<3041262554>(32,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<62009>(16,1,'integer',['unsigned','big']), + #<0>(56,1,'integer',['unsigned','big']), + #<0>(32,1,'integer',['unsigned','big'])}# + in let <_cor10> = + #{#<4>(4,1,'integer',['unsigned','big']), + #<5>(4,1,'integer',['unsigned','big']), + #<0>(64,1,'integer',['unsigned','big']), + #<6>(8,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<1345227248>(32,1,'integer',['unsigned','big']), + #<3192296356>(32,1,'integer',['unsigned','big']), + #<65535>(16,1,'integer',['unsigned','big']), + #<1706>(16,1,'integer',['unsigned','big']), + #<0>(56,1,'integer',['unsigned','big']), + #<0>(32,1,'integer',['unsigned','big'])}# + in let <_cor11> = + #{#<4>(4,1,'integer',['unsigned','big']), + #<5>(4,1,'integer',['unsigned','big']), + #<0>(64,1,'integer',['unsigned','big']), + #<6>(8,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<1345227225>(32,1,'integer',['unsigned','big']), + #<1208502272>(32,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<1706>(16,1,'integer',['unsigned','big']), + #<0>(56,1,'integer',['unsigned','big']), + #<268439552>(32,1,'integer',['unsigned','big'])}# + in let <_cor12> = + #{#<4>(4,1,'integer',['unsigned','big']), + #<5>(4,1,'integer',['unsigned','big']), + #<0>(64,1,'integer',['unsigned','big']), + #<6>(8,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<1345227226>(32,1,'integer',['unsigned','big']), + #<1036523944>(32,1,'integer',['unsigned','big']), + #<65535>(16,1,'integer',['unsigned','big']), + #<1525>(16,1,'integer',['unsigned','big']), + #<0>(56,1,'integer',['unsigned','big']), + #<4294967295>(32,1,'integer',['unsigned','big'])}# + in let <_cor13> = + #{#<4>(4,1,'integer',['unsigned','big']), + #<5>(4,1,'integer',['unsigned','big']), + #<0>(64,1,'integer',['unsigned','big']), + #<6>(8,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<1345227226>(32,1,'integer',['unsigned','big']), + #<1036523944>(32,1,'integer',['unsigned','big']), + #<65535>(16,1,'integer',['unsigned','big']), + #<1525>(16,1,'integer',['unsigned','big']), + #<0>(56,1,'integer',['unsigned','big']), + #<4294967295>(32,1,'integer',['unsigned','big'])}# + in let <_cor14> = + #{#<4>(4,1,'integer',['unsigned','big']), + #<5>(4,1,'integer',['unsigned','big']), + #<0>(64,1,'integer',['unsigned','big']), + #<6>(8,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<1345227264>(32,1,'integer',['unsigned','big']), + #<3024894975>(32,1,'integer',['unsigned','big']), + #<65535>(16,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<0>(56,1,'integer',['unsigned','big']), + #<268439552>(32,1,'integer',['unsigned','big'])}# + in let <_cor15> = + #{#<4>(4,1,'integer',['unsigned','big']), + #<5>(4,1,'integer',['unsigned','big']), + #<0>(64,1,'integer',['unsigned','big']), + #<6>(8,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<1345227264>(32,1,'integer',['unsigned','big']), + #<3191877248>(32,1,'integer',['unsigned','big']), + #<65535>(16,1,'integer',['unsigned','big']), + #<1521>(16,1,'integer',['unsigned','big']), + #<0>(56,1,'integer',['unsigned','big']), + #<512>(32,1,'integer',['unsigned','big'])}# + in let <_cor16> = + #{#<4>(4,1,'integer',['unsigned','big']), + #<5>(4,1,'integer',['unsigned','big']), + #<0>(64,1,'integer',['unsigned','big']), + #<6>(8,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<1345227187>(32,1,'integer',['unsigned','big']), + #<4153228288>(32,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<1521>(16,1,'integer',['unsigned','big']), + #<0>(56,1,'integer',['unsigned','big']), + #<0>(32,1,'integer',['unsigned','big'])}# + in let <_cor17> = + #{#<4>(4,1,'integer',['unsigned','big']), + #<5>(4,1,'integer',['unsigned','big']), + #<0>(64,1,'integer',['unsigned','big']), + #<6>(8,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<1345227137>(32,1,'integer',['unsigned','big']), + #<3375892261>(32,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<1221>(16,1,'integer',['unsigned','big']), + #<0>(56,1,'integer',['unsigned','big']), + #<4294967295>(32,1,'integer',['unsigned','big'])}# + in let <_cor18> = + #{#<4>(4,1,'integer',['unsigned','big']), + #<5>(4,1,'integer',['unsigned','big']), + #<0>(64,1,'integer',['unsigned','big']), + #<6>(8,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<1345227187>(32,1,'integer',['unsigned','big']), + #<4047451439>(32,1,'integer',['unsigned','big']), + #<65535>(16,1,'integer',['unsigned','big']), + #<5632>(16,1,'integer',['unsigned','big']), + #<0>(56,1,'integer',['unsigned','big']), + #<0>(32,1,'integer',['unsigned','big'])}# + in let <_cor19> = + #{#<4>(4,1,'integer',['unsigned','big']), + #<5>(4,1,'integer',['unsigned','big']), + #<0>(64,1,'integer',['unsigned','big']), + #<6>(8,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<1345227137>(32,1,'integer',['unsigned','big']), + #<3375892261>(32,1,'integer',['unsigned','big']), + #<65535>(16,1,'integer',['unsigned','big']), + #<1221>(16,1,'integer',['unsigned','big']), + #<0>(56,1,'integer',['unsigned','big']), + #<4294967295>(32,1,'integer',['unsigned','big'])}# + in let <_cor20> = + #{#<4>(4,1,'integer',['unsigned','big']), + #<5>(4,1,'integer',['unsigned','big']), + #<0>(64,1,'integer',['unsigned','big']), + #<6>(8,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<1345227248>(32,1,'integer',['unsigned','big']), + #<3169702199>(32,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<0>(56,1,'integer',['unsigned','big']), + #<0>(32,1,'integer',['unsigned','big'])}# + in let <_cor21> = + #{#<4>(4,1,'integer',['unsigned','big']), + #<5>(4,1,'integer',['unsigned','big']), + #<0>(64,1,'integer',['unsigned','big']), + #<6>(8,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<1345227206>(32,1,'integer',['unsigned','big']), + #<3041502560>(32,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<5555>(16,1,'integer',['unsigned','big']), + #<0>(56,1,'integer',['unsigned','big']), + #<4294967295>(32,1,'integer',['unsigned','big'])}# + in let <_cor22> = + #{#<4>(4,1,'integer',['unsigned','big']), + #<5>(4,1,'integer',['unsigned','big']), + #<0>(64,1,'integer',['unsigned','big']), + #<6>(8,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<1345227144>(32,1,'integer',['unsigned','big']), + #<3553806329>(32,1,'integer',['unsigned','big']), + #<65535>(16,1,'integer',['unsigned','big']), + #<14753>(16,1,'integer',['unsigned','big']), + #<0>(56,1,'integer',['unsigned','big']), + #<4294967295>(32,1,'integer',['unsigned','big'])}# + in let <_cor23> = + #{#<4>(4,1,'integer',['unsigned','big']), + #<5>(4,1,'integer',['unsigned','big']), + #<0>(64,1,'integer',['unsigned','big']), + #<6>(8,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<1345226752>(32,1,'integer',['unsigned','big']), + #<3342062546>(32,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<8000>(16,1,'integer',['unsigned','big']), + #<0>(56,1,'integer',['unsigned','big']), + #<4294967295>(32,1,'integer',['unsigned','big'])}# + in let <_cor24> = + #{#<4>(4,1,'integer',['unsigned','big']), + #<5>(4,1,'integer',['unsigned','big']), + #<0>(64,1,'integer',['unsigned','big']), + #<6>(8,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<1345226752>(32,1,'integer',['unsigned','big']), + #<3192368248>(32,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<1704>(16,1,'integer',['unsigned','big']), + #<0>(56,1,'integer',['unsigned','big']), + #<4294967295>(32,1,'integer',['unsigned','big'])}# + in let <_cor25> = + #{#<4>(4,1,'integer',['unsigned','big']), + #<5>(4,1,'integer',['unsigned','big']), + #<0>(64,1,'integer',['unsigned','big']), + #<6>(8,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<1345227205>(32,1,'integer',['unsigned','big']), + #<3056020112>(32,1,'integer',['unsigned','big']), + #<65535>(16,1,'integer',['unsigned','big']), + #<1521>(16,1,'integer',['unsigned','big']), + #<0>(56,1,'integer',['unsigned','big']), + #<0>(32,1,'integer',['unsigned','big'])}# + in let <_cor26> = + #{#<4>(4,1,'integer',['unsigned','big']), + #<5>(4,1,'integer',['unsigned','big']), + #<0>(64,1,'integer',['unsigned','big']), + #<0>(8,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<1345227155>(32,1,'integer',['unsigned','big']), + #<3240285566>(32,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<0>(56,1,'integer',['unsigned','big']), + #<4294967295>(32,1,'integer',['unsigned','big'])}# + in let <_cor27> = + #{#<4>(4,1,'integer',['unsigned','big']), + #<5>(4,1,'integer',['unsigned','big']), + #<0>(64,1,'integer',['unsigned','big']), + #<0>(8,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<1345227155>(32,1,'integer',['unsigned','big']), + #<3240285566>(32,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<0>(56,1,'integer',['unsigned','big']), + #<4294967295>(32,1,'integer',['unsigned','big'])}# + in let <_cor28> = + #{#<4>(4,1,'integer',['unsigned','big']), + #<5>(4,1,'integer',['unsigned','big']), + #<0>(64,1,'integer',['unsigned','big']), + #<6>(8,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<1345227246>(32,1,'integer',['unsigned','big']), + #<3144057598>(32,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<1708>(16,1,'integer',['unsigned','big']), + #<0>(56,1,'integer',['unsigned','big']), + #<4294967295>(32,1,'integer',['unsigned','big'])}# + in let <_cor29> = + #{#<4>(4,1,'integer',['unsigned','big']), + #<5>(4,1,'integer',['unsigned','big']), + #<0>(64,1,'integer',['unsigned','big']), + #<6>(8,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<1345227246>(32,1,'integer',['unsigned','big']), + #<3144057598>(32,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<1708>(16,1,'integer',['unsigned','big']), + #<0>(56,1,'integer',['unsigned','big']), + #<4294967295>(32,1,'integer',['unsigned','big'])}# + in let <_cor30> = + #{#<4>(4,1,'integer',['unsigned','big']), + #<5>(4,1,'integer',['unsigned','big']), + #<0>(64,1,'integer',['unsigned','big']), + #<6>(8,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<1345227225>(32,1,'integer',['unsigned','big']), + #<1208502272>(32,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<1706>(16,1,'integer',['unsigned','big']), + #<0>(56,1,'integer',['unsigned','big']), + #<268439552>(32,1,'integer',['unsigned','big'])}# + in let <_cor31> = + #{#<4>(4,1,'integer',['unsigned','big']), + #<5>(4,1,'integer',['unsigned','big']), + #<0>(64,1,'integer',['unsigned','big']), + #<6>(8,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<1345227248>(32,1,'integer',['unsigned','big']), + #<3192223002>(32,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<1521>(16,1,'integer',['unsigned','big']), + #<0>(56,1,'integer',['unsigned','big']), + #<0>(32,1,'integer',['unsigned','big'])}# + in let <_cor32> = + #{#<4>(4,1,'integer',['unsigned','big']), + #<5>(4,1,'integer',['unsigned','big']), + #<0>(64,1,'integer',['unsigned','big']), + #<6>(8,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<1345226752>(32,1,'integer',['unsigned','big']), + #<3192368255>(32,1,'integer',['unsigned','big']), + #<65535>(16,1,'integer',['unsigned','big']), + #<1704>(16,1,'integer',['unsigned','big']), + #<0>(56,1,'integer',['unsigned','big']), + #<0>(32,1,'integer',['unsigned','big'])}# + in let <_cor33> = + #{#<4>(4,1,'integer',['unsigned','big']), + #<5>(4,1,'integer',['unsigned','big']), + #<0>(64,1,'integer',['unsigned','big']), + #<6>(8,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<1345227225>(32,1,'integer',['unsigned','big']), + #<3240344315>(32,1,'integer',['unsigned','big']), + #<65535>(16,1,'integer',['unsigned','big']), + #<1489>(16,1,'integer',['unsigned','big']), + #<0>(56,1,'integer',['unsigned','big']), + #<4294967295>(32,1,'integer',['unsigned','big'])}# + in let <_cor34> = + #{#<4>(4,1,'integer',['unsigned','big']), + #<5>(4,1,'integer',['unsigned','big']), + #<0>(64,1,'integer',['unsigned','big']), + #<6>(8,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<1345227204>(32,1,'integer',['unsigned','big']), + #<3056020112>(32,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<1521>(16,1,'integer',['unsigned','big']), + #<0>(56,1,'integer',['unsigned','big']), + #<0>(32,1,'integer',['unsigned','big'])}# + in let <_cor35> = + #{#<4>(4,1,'integer',['unsigned','big']), + #<5>(4,1,'integer',['unsigned','big']), + #<0>(64,1,'integer',['unsigned','big']), + #<6>(8,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<1345227206>(32,1,'integer',['unsigned','big']), + #<3055802373>(32,1,'integer',['unsigned','big']), + #<65535>(16,1,'integer',['unsigned','big']), + #<20>(16,1,'integer',['unsigned','big']), + #<0>(56,1,'integer',['unsigned','big']), + #<512>(32,1,'integer',['unsigned','big'])}# + in let <_cor36> = + #{#<4>(4,1,'integer',['unsigned','big']), + #<5>(4,1,'integer',['unsigned','big']), + #<0>(64,1,'integer',['unsigned','big']), + #<6>(8,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<1345227248>(32,1,'integer',['unsigned','big']), + #<3192223002>(32,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<1432>(16,1,'integer',['unsigned','big']), + #<0>(56,1,'integer',['unsigned','big']), + #<0>(32,1,'integer',['unsigned','big'])}# + in let <_cor37> = + #{#<4>(4,1,'integer',['unsigned','big']), + #<5>(4,1,'integer',['unsigned','big']), + #<0>(64,1,'integer',['unsigned','big']), + #<6>(8,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<1345227007>(32,1,'integer',['unsigned','big']), + #<3056017066>(32,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<15126>(16,1,'integer',['unsigned','big']), + #<0>(56,1,'integer',['unsigned','big']), + #<4294967295>(32,1,'integer',['unsigned','big'])}# + in let <_cor38> = + #{#<4>(4,1,'integer',['unsigned','big']), + #<5>(4,1,'integer',['unsigned','big']), + #<0>(64,1,'integer',['unsigned','big']), + #<6>(8,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<1345227206>(32,1,'integer',['unsigned','big']), + #<3028821692>(32,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<65535>(16,1,'integer',['unsigned','big']), + #<0>(56,1,'integer',['unsigned','big']), + #<4294967295>(32,1,'integer',['unsigned','big'])}# + in let <_cor39> = + #{#<4>(4,1,'integer',['unsigned','big']), + #<5>(4,1,'integer',['unsigned','big']), + #<0>(64,1,'integer',['unsigned','big']), + #<6>(8,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<1345226752>(32,1,'integer',['unsigned','big']), + #<3192368248>(32,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<1704>(16,1,'integer',['unsigned','big']), + #<0>(56,1,'integer',['unsigned','big']), + #<4294967295>(32,1,'integer',['unsigned','big'])}# + in let <_cor40> = + #{#<4>(4,1,'integer',['unsigned','big']), + #<5>(4,1,'integer',['unsigned','big']), + #<0>(64,1,'integer',['unsigned','big']), + #<6>(8,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<1345227264>(32,1,'integer',['unsigned','big']), + #<1345224704>(32,1,'integer',['unsigned','big']), + #<65535>(16,1,'integer',['unsigned','big']), + #<65535>(16,1,'integer',['unsigned','big']), + #<0>(56,1,'integer',['unsigned','big']), + #<4294967295>(32,1,'integer',['unsigned','big'])}# + in let <_cor41> = + #{#<4>(4,1,'integer',['unsigned','big']), + #<5>(4,1,'integer',['unsigned','big']), + #<0>(64,1,'integer',['unsigned','big']), + #<6>(8,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<1345227248>(32,1,'integer',['unsigned','big']), + #<3192223001>(32,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<1300>(16,1,'integer',['unsigned','big']), + #<0>(56,1,'integer',['unsigned','big']), + #<0>(32,1,'integer',['unsigned','big'])}# + in let <_cor42> = + #{#<4>(4,1,'integer',['unsigned','big']), + #<5>(4,1,'integer',['unsigned','big']), + #<0>(64,1,'integer',['unsigned','big']), + #<6>(8,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<1345227144>(32,1,'integer',['unsigned','big']), + #<3553806329>(32,1,'integer',['unsigned','big']), + #<65535>(16,1,'integer',['unsigned','big']), + #<14753>(16,1,'integer',['unsigned','big']), + #<0>(56,1,'integer',['unsigned','big']), + #<4294967295>(32,1,'integer',['unsigned','big'])}# + in let <_cor43> = + #{#<4>(4,1,'integer',['unsigned','big']), + #<5>(4,1,'integer',['unsigned','big']), + #<0>(64,1,'integer',['unsigned','big']), + #<6>(8,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<1345227144>(32,1,'integer',['unsigned','big']), + #<3553806329>(32,1,'integer',['unsigned','big']), + #<65535>(16,1,'integer',['unsigned','big']), + #<14753>(16,1,'integer',['unsigned','big']), + #<0>(56,1,'integer',['unsigned','big']), + #<4294967295>(32,1,'integer',['unsigned','big'])}# + in let <_cor44> = + #{#<4>(4,1,'integer',['unsigned','big']), + #<5>(4,1,'integer',['unsigned','big']), + #<0>(64,1,'integer',['unsigned','big']), + #<6>(8,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<1345227144>(32,1,'integer',['unsigned','big']), + #<3553806329>(32,1,'integer',['unsigned','big']), + #<65535>(16,1,'integer',['unsigned','big']), + #<14753>(16,1,'integer',['unsigned','big']), + #<0>(56,1,'integer',['unsigned','big']), + #<4294967295>(32,1,'integer',['unsigned','big'])}# + in let <_cor45> = + #{#<4>(4,1,'integer',['unsigned','big']), + #<5>(4,1,'integer',['unsigned','big']), + #<0>(64,1,'integer',['unsigned','big']), + #<6>(8,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<1345227144>(32,1,'integer',['unsigned','big']), + #<3553806329>(32,1,'integer',['unsigned','big']), + #<65535>(16,1,'integer',['unsigned','big']), + #<14753>(16,1,'integer',['unsigned','big']), + #<0>(56,1,'integer',['unsigned','big']), + #<4294967295>(32,1,'integer',['unsigned','big'])}# + in let <_cor46> = + #{#<4>(4,1,'integer',['unsigned','big']), + #<5>(4,1,'integer',['unsigned','big']), + #<0>(64,1,'integer',['unsigned','big']), + #<6>(8,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<1345227144>(32,1,'integer',['unsigned','big']), + #<3553806329>(32,1,'integer',['unsigned','big']), + #<65535>(16,1,'integer',['unsigned','big']), + #<14753>(16,1,'integer',['unsigned','big']), + #<0>(56,1,'integer',['unsigned','big']), + #<4294967295>(32,1,'integer',['unsigned','big'])}# + in let <_cor47> = + #{#<4>(4,1,'integer',['unsigned','big']), + #<5>(4,1,'integer',['unsigned','big']), + #<0>(64,1,'integer',['unsigned','big']), + #<6>(8,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<1345227144>(32,1,'integer',['unsigned','big']), + #<3553806329>(32,1,'integer',['unsigned','big']), + #<65535>(16,1,'integer',['unsigned','big']), + #<14753>(16,1,'integer',['unsigned','big']), + #<0>(56,1,'integer',['unsigned','big']), + #<4294967295>(32,1,'integer',['unsigned','big'])}# + in let <_cor48> = + #{#<4>(4,1,'integer',['unsigned','big']), + #<5>(4,1,'integer',['unsigned','big']), + #<0>(64,1,'integer',['unsigned','big']), + #<6>(8,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<1345227144>(32,1,'integer',['unsigned','big']), + #<3553806329>(32,1,'integer',['unsigned','big']), + #<65535>(16,1,'integer',['unsigned','big']), + #<14753>(16,1,'integer',['unsigned','big']), + #<0>(56,1,'integer',['unsigned','big']), + #<4294967295>(32,1,'integer',['unsigned','big'])}# + in let <_cor49> = + #{#<4>(4,1,'integer',['unsigned','big']), + #<5>(4,1,'integer',['unsigned','big']), + #<0>(64,1,'integer',['unsigned','big']), + #<6>(8,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<1345227144>(32,1,'integer',['unsigned','big']), + #<3553806329>(32,1,'integer',['unsigned','big']), + #<65535>(16,1,'integer',['unsigned','big']), + #<14753>(16,1,'integer',['unsigned','big']), + #<0>(56,1,'integer',['unsigned','big']), + #<4294967295>(32,1,'integer',['unsigned','big'])}# + in let <_cor50> = + #{#<4>(4,1,'integer',['unsigned','big']), + #<5>(4,1,'integer',['unsigned','big']), + #<0>(64,1,'integer',['unsigned','big']), + #<6>(8,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<1345227144>(32,1,'integer',['unsigned','big']), + #<3553806329>(32,1,'integer',['unsigned','big']), + #<65535>(16,1,'integer',['unsigned','big']), + #<14753>(16,1,'integer',['unsigned','big']), + #<0>(56,1,'integer',['unsigned','big']), + #<4294967295>(32,1,'integer',['unsigned','big'])}# + in let <_cor51> = + #{#<4>(4,1,'integer',['unsigned','big']), + #<5>(4,1,'integer',['unsigned','big']), + #<0>(64,1,'integer',['unsigned','big']), + #<6>(8,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<1345227144>(32,1,'integer',['unsigned','big']), + #<3553806329>(32,1,'integer',['unsigned','big']), + #<65535>(16,1,'integer',['unsigned','big']), + #<14753>(16,1,'integer',['unsigned','big']), + #<0>(56,1,'integer',['unsigned','big']), + #<4294967295>(32,1,'integer',['unsigned','big'])}# + in let <_cor52> = + #{#<4>(4,1,'integer',['unsigned','big']), + #<5>(4,1,'integer',['unsigned','big']), + #<0>(64,1,'integer',['unsigned','big']), + #<6>(8,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<1345227144>(32,1,'integer',['unsigned','big']), + #<3553806329>(32,1,'integer',['unsigned','big']), + #<65535>(16,1,'integer',['unsigned','big']), + #<14753>(16,1,'integer',['unsigned','big']), + #<0>(56,1,'integer',['unsigned','big']), + #<4294967295>(32,1,'integer',['unsigned','big'])}# + in let <_cor53> = + #{#<4>(4,1,'integer',['unsigned','big']), + #<5>(4,1,'integer',['unsigned','big']), + #<0>(64,1,'integer',['unsigned','big']), + #<6>(8,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<1345227149>(32,1,'integer',['unsigned','big']), + #<3375855564>(32,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<80>(16,1,'integer',['unsigned','big']), + #<0>(56,1,'integer',['unsigned','big']), + #<0>(32,1,'integer',['unsigned','big'])}# + in let <_cor54> = + #{#<4>(4,1,'integer',['unsigned','big']), + #<5>(4,1,'integer',['unsigned','big']), + #<0>(64,1,'integer',['unsigned','big']), + #<6>(8,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<1345227204>(32,1,'integer',['unsigned','big']), + #<3056020112>(32,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<1521>(16,1,'integer',['unsigned','big']), + #<0>(56,1,'integer',['unsigned','big']), + #<0>(32,1,'integer',['unsigned','big'])}# + in let <_cor55> = + #{#<4>(4,1,'integer',['unsigned','big']), + #<5>(4,1,'integer',['unsigned','big']), + #<0>(64,1,'integer',['unsigned','big']), + #<6>(8,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<1345227248>(32,1,'integer',['unsigned','big']), + #<3191877249>(32,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<0>(56,1,'integer',['unsigned','big']), + #<512>(32,1,'integer',['unsigned','big'])}# + in let <_cor56> = + #{#<4>(4,1,'integer',['unsigned','big']), + #<5>(4,1,'integer',['unsigned','big']), + #<0>(64,1,'integer',['unsigned','big']), + #<6>(8,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<1345227248>(32,1,'integer',['unsigned','big']), + #<3192296356>(32,1,'integer',['unsigned','big']), + #<65535>(16,1,'integer',['unsigned','big']), + #<1706>(16,1,'integer',['unsigned','big']), + #<0>(56,1,'integer',['unsigned','big']), + #<0>(32,1,'integer',['unsigned','big'])}# + in let <_cor57> = + #{#<4>(4,1,'integer',['unsigned','big']), + #<5>(4,1,'integer',['unsigned','big']), + #<0>(64,1,'integer',['unsigned','big']), + #<6>(8,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<1345227248>(32,1,'integer',['unsigned','big']), + #<3191877255>(32,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<1708>(16,1,'integer',['unsigned','big']), + #<0>(56,1,'integer',['unsigned','big']), + #<4294967295>(32,1,'integer',['unsigned','big'])}# + in let <_cor58> = + #{#<4>(4,1,'integer',['unsigned','big']), + #<5>(4,1,'integer',['unsigned','big']), + #<0>(64,1,'integer',['unsigned','big']), + #<255>(8,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<1345227215>(32,1,'integer',['unsigned','big']), + #<656798129>(32,1,'integer',['unsigned','big']), + #<65535>(16,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<0>(56,1,'integer',['unsigned','big']), + #<0>(32,1,'integer',['unsigned','big'])}# + in let <_cor59> = + #{#<4>(4,1,'integer',['unsigned','big']), + #<5>(4,1,'integer',['unsigned','big']), + #<0>(64,1,'integer',['unsigned','big']), + #<255>(8,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<1345227215>(32,1,'integer',['unsigned','big']), + #<656798129>(32,1,'integer',['unsigned','big']), + #<65535>(16,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<0>(56,1,'integer',['unsigned','big']), + #<0>(32,1,'integer',['unsigned','big'])}# + in let <_cor60> = + #{#<4>(4,1,'integer',['unsigned','big']), + #<5>(4,1,'integer',['unsigned','big']), + #<0>(64,1,'integer',['unsigned','big']), + #<6>(8,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<1345227236>(32,1,'integer',['unsigned','big']), + #<3180215030>(32,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<5540>(16,1,'integer',['unsigned','big']), + #<0>(56,1,'integer',['unsigned','big']), + #<4294967295>(32,1,'integer',['unsigned','big'])}# + in let <_cor61> = + #{#<4>(4,1,'integer',['unsigned','big']), + #<5>(4,1,'integer',['unsigned','big']), + #<0>(64,1,'integer',['unsigned','big']), + #<0>(8,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<1345228799>(32,1,'integer',['unsigned','big']), + #<2147483648>(32,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<65535>(16,1,'integer',['unsigned','big']), + #<0>(56,1,'integer',['unsigned','big']), + #<0>(32,1,'integer',['unsigned','big'])}# + in let <_cor62> = + #{#<4>(4,1,'integer',['unsigned','big']), + #<5>(4,1,'integer',['unsigned','big']), + #<0>(64,1,'integer',['unsigned','big']), + #<6>(8,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<1345227212>(32,1,'integer',['unsigned','big']), + #<1345228029>(32,1,'integer',['unsigned','big']), + #<65535>(16,1,'integer',['unsigned','big']), + #<1715>(16,1,'integer',['unsigned','big']), + #<0>(56,1,'integer',['unsigned','big']), + #<512>(32,1,'integer',['unsigned','big'])}# + in let <_cor63> = + #{#<4>(4,1,'integer',['unsigned','big']), + #<5>(4,1,'integer',['unsigned','big']), + #<0>(64,1,'integer',['unsigned','big']), + #<6>(8,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<1345227232>(32,1,'integer',['unsigned','big']), + #<3117867794>(32,1,'integer',['unsigned','big']), + #<65535>(16,1,'integer',['unsigned','big']), + #<1433>(16,1,'integer',['unsigned','big']), + #<0>(56,1,'integer',['unsigned','big']), + #<0>(32,1,'integer',['unsigned','big'])}# + in let <_cor64> = + #{#<4>(4,1,'integer',['unsigned','big']), + #<5>(4,1,'integer',['unsigned','big']), + #<0>(64,1,'integer',['unsigned','big']), + #<6>(8,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<1345227206>(32,1,'integer',['unsigned','big']), + #<3056020118>(32,1,'integer',['unsigned','big']), + #<65535>(16,1,'integer',['unsigned','big']), + #<65535>(16,1,'integer',['unsigned','big']), + #<0>(56,1,'integer',['unsigned','big']), + #<0>(32,1,'integer',['unsigned','big'])}# + in let <_cor65> = + #{#<4>(4,1,'integer',['unsigned','big']), + #<5>(4,1,'integer',['unsigned','big']), + #<0>(64,1,'integer',['unsigned','big']), + #<6>(8,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<1345227225>(32,1,'integer',['unsigned','big']), + #<3240344290>(32,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<1526>(16,1,'integer',['unsigned','big']), + #<0>(56,1,'integer',['unsigned','big']), + #<4294967295>(32,1,'integer',['unsigned','big'])}# + in let <_cor66> = + #{#<4>(4,1,'integer',['unsigned','big']), + #<5>(4,1,'integer',['unsigned','big']), + #<0>(64,1,'integer',['unsigned','big']), + #<6>(8,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<1345227137>(32,1,'integer',['unsigned','big']), + #<3375892261>(32,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<1221>(16,1,'integer',['unsigned','big']), + #<0>(56,1,'integer',['unsigned','big']), + #<4294967295>(32,1,'integer',['unsigned','big'])}# + in let <_cor67> = + #{#<4>(4,1,'integer',['unsigned','big']), + #<5>(4,1,'integer',['unsigned','big']), + #<0>(64,1,'integer',['unsigned','big']), + #<255>(8,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<1345226752>(32,1,'integer',['unsigned','big']), + #<3056017064>(32,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<65535>(16,1,'integer',['unsigned','big']), + #<0>(56,1,'integer',['unsigned','big']), + #<4294967295>(32,1,'integer',['unsigned','big'])}# + in let <_cor68> = + #{#<4>(4,1,'integer',['unsigned','big']), + #<5>(4,1,'integer',['unsigned','big']), + #<0>(64,1,'integer',['unsigned','big']), + #<1>(8,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<1345227264>(32,1,'integer',['unsigned','big']), + #<1428305289>(32,1,'integer',['unsigned','big']), + #<65535>(16,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<0>(56,1,'integer',['unsigned','big']), + #<0>(32,1,'integer',['unsigned','big'])}# + in let <_cor69> = + #{#<4>(4,1,'integer',['unsigned','big']), + #<5>(4,1,'integer',['unsigned','big']), + #<0>(64,1,'integer',['unsigned','big']), + #<6>(8,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<1345227248>(32,1,'integer',['unsigned','big']), + #<3192223001>(32,1,'integer',['unsigned','big']), + #<65535>(16,1,'integer',['unsigned','big']), + #<1300>(16,1,'integer',['unsigned','big']), + #<0>(56,1,'integer',['unsigned','big']), + #<0>(32,1,'integer',['unsigned','big'])}# + in let <_cor70> = + #{#<4>(4,1,'integer',['unsigned','big']), + #<5>(4,1,'integer',['unsigned','big']), + #<0>(64,1,'integer',['unsigned','big']), + #<6>(8,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<1345227248>(32,1,'integer',['unsigned','big']), + #<3192223001>(32,1,'integer',['unsigned','big']), + #<65535>(16,1,'integer',['unsigned','big']), + #<1300>(16,1,'integer',['unsigned','big']), + #<0>(56,1,'integer',['unsigned','big']), + #<0>(32,1,'integer',['unsigned','big'])}# + in let <_cor71> = + #{#<4>(4,1,'integer',['unsigned','big']), + #<5>(4,1,'integer',['unsigned','big']), + #<0>(64,1,'integer',['unsigned','big']), + #<6>(8,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<1345227248>(32,1,'integer',['unsigned','big']), + #<3191877248>(32,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<0>(56,1,'integer',['unsigned','big']), + #<512>(32,1,'integer',['unsigned','big'])}# + in let <_cor72> = + #{#<4>(4,1,'integer',['unsigned','big']), + #<5>(4,1,'integer',['unsigned','big']), + #<0>(64,1,'integer',['unsigned','big']), + #<6>(8,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<1345227225>(32,1,'integer',['unsigned','big']), + #<1208504319>(32,1,'integer',['unsigned','big']), + #<65535>(16,1,'integer',['unsigned','big']), + #<1706>(16,1,'integer',['unsigned','big']), + #<0>(56,1,'integer',['unsigned','big']), + #<268439552>(32,1,'integer',['unsigned','big'])}# + in let <_cor73> = + #{#<4>(4,1,'integer',['unsigned','big']), + #<5>(4,1,'integer',['unsigned','big']), + #<0>(64,1,'integer',['unsigned','big']), + #<6>(8,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<1345227206>(32,1,'integer',['unsigned','big']), + #<3056020118>(32,1,'integer',['unsigned','big']), + #<65535>(16,1,'integer',['unsigned','big']), + #<65535>(16,1,'integer',['unsigned','big']), + #<0>(56,1,'integer',['unsigned','big']), + #<4294967295>(32,1,'integer',['unsigned','big'])}# + in let <_cor74> = + #{#<4>(4,1,'integer',['unsigned','big']), + #<5>(4,1,'integer',['unsigned','big']), + #<0>(64,1,'integer',['unsigned','big']), + #<6>(8,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<1345226752>(32,1,'integer',['unsigned','big']), + #<3376152576>(32,1,'integer',['unsigned','big']), + #<65535>(16,1,'integer',['unsigned','big']), + #<65535>(16,1,'integer',['unsigned','big']), + #<0>(56,1,'integer',['unsigned','big']), + #<4294967295>(32,1,'integer',['unsigned','big'])}# + in let <_cor75> = + #{#<4>(4,1,'integer',['unsigned','big']), + #<5>(4,1,'integer',['unsigned','big']), + #<0>(64,1,'integer',['unsigned','big']), + #<6>(8,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<1345226752>(32,1,'integer',['unsigned','big']), + #<3281059620>(32,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<65535>(16,1,'integer',['unsigned','big']), + #<0>(56,1,'integer',['unsigned','big']), + #<4294967295>(32,1,'integer',['unsigned','big'])}# + in let <_cor76> = + #{#<4>(4,1,'integer',['unsigned','big']), + #<5>(4,1,'integer',['unsigned','big']), + #<0>(64,1,'integer',['unsigned','big']), + #<6>(8,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<1345227248>(32,1,'integer',['unsigned','big']), + #<3192223002>(32,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<1712>(16,1,'integer',['unsigned','big']), + #<0>(56,1,'integer',['unsigned','big']), + #<512>(32,1,'integer',['unsigned','big'])}# + in let <_cor77> = + #{#<4>(4,1,'integer',['unsigned','big']), + #<5>(4,1,'integer',['unsigned','big']), + #<0>(64,1,'integer',['unsigned','big']), + #<6>(8,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<1345227191>(32,1,'integer',['unsigned','big']), + #<250419011>(32,1,'integer',['unsigned','big']), + #<65535>(16,1,'integer',['unsigned','big']), + #<1521>(16,1,'integer',['unsigned','big']), + #<0>(56,1,'integer',['unsigned','big']), + #<0>(32,1,'integer',['unsigned','big'])}# + in let <_cor78> = + #{#<4>(4,1,'integer',['unsigned','big']), + #<5>(4,1,'integer',['unsigned','big']), + #<0>(64,1,'integer',['unsigned','big']), + #<0>(8,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<1345227214>(32,1,'integer',['unsigned','big']), + #<656798128>(32,1,'integer',['unsigned','big']), + #<65535>(16,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<0>(56,1,'integer',['unsigned','big']), + #<4294967295>(32,1,'integer',['unsigned','big'])}# + in let <_cor79> = + #{#<4>(4,1,'integer',['unsigned','big']), + #<5>(4,1,'integer',['unsigned','big']), + #<0>(64,1,'integer',['unsigned','big']), + #<6>(8,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<1345227227>(32,1,'integer',['unsigned','big']), + #<1036523944>(32,1,'integer',['unsigned','big']), + #<65535>(16,1,'integer',['unsigned','big']), + #<1525>(16,1,'integer',['unsigned','big']), + #<0>(56,1,'integer',['unsigned','big']), + #<0>(32,1,'integer',['unsigned','big'])}# + in let <_cor80> = + #{#<4>(4,1,'integer',['unsigned','big']), + #<5>(4,1,'integer',['unsigned','big']), + #<0>(64,1,'integer',['unsigned','big']), + #<6>(8,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<1345227206>(32,1,'integer',['unsigned','big']), + #<3041502561>(32,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<5555>(16,1,'integer',['unsigned','big']), + #<0>(56,1,'integer',['unsigned','big']), + #<4294967295>(32,1,'integer',['unsigned','big'])}# + in let <_cor81> = + #{#<4>(4,1,'integer',['unsigned','big']), + #<5>(4,1,'integer',['unsigned','big']), + #<0>(64,1,'integer',['unsigned','big']), + #<6>(8,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<1345227206>(32,1,'integer',['unsigned','big']), + #<3041502561>(32,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<5555>(16,1,'integer',['unsigned','big']), + #<0>(56,1,'integer',['unsigned','big']), + #<4294967295>(32,1,'integer',['unsigned','big'])}# + in let <_cor82> = + #{#<4>(4,1,'integer',['unsigned','big']), + #<5>(4,1,'integer',['unsigned','big']), + #<0>(64,1,'integer',['unsigned','big']), + #<6>(8,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<1345227248>(32,1,'integer',['unsigned','big']), + #<3192223002>(32,1,'integer',['unsigned','big']), + #<65535>(16,1,'integer',['unsigned','big']), + #<1712>(16,1,'integer',['unsigned','big']), + #<0>(56,1,'integer',['unsigned','big']), + #<512>(32,1,'integer',['unsigned','big'])}# + in let <_cor83> = + #{#<4>(4,1,'integer',['unsigned','big']), + #<5>(4,1,'integer',['unsigned','big']), + #<0>(64,1,'integer',['unsigned','big']), + #<6>(8,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<1345227203>(32,1,'integer',['unsigned','big']), + #<639942762>(32,1,'integer',['unsigned','big']), + #<65535>(16,1,'integer',['unsigned','big']), + #<1521>(16,1,'integer',['unsigned','big']), + #<0>(56,1,'integer',['unsigned','big']), + #<268439552>(32,1,'integer',['unsigned','big'])}# + in let <_cor84> = + #{#<4>(4,1,'integer',['unsigned','big']), + #<5>(4,1,'integer',['unsigned','big']), + #<0>(64,1,'integer',['unsigned','big']), + #<6>(8,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<1345227205>(32,1,'integer',['unsigned','big']), + #<3056020112>(32,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<1521>(16,1,'integer',['unsigned','big']), + #<0>(56,1,'integer',['unsigned','big']), + #<4294967295>(32,1,'integer',['unsigned','big'])}# + in let <_cor85> = + #{#<4>(4,1,'integer',['unsigned','big']), + #<5>(4,1,'integer',['unsigned','big']), + #<0>(64,1,'integer',['unsigned','big']), + #<6>(8,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<1345227225>(32,1,'integer',['unsigned','big']), + #<3240344290>(32,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<1526>(16,1,'integer',['unsigned','big']), + #<0>(56,1,'integer',['unsigned','big']), + #<4294967295>(32,1,'integer',['unsigned','big'])}# + in let <_cor86> = + #{#<4>(4,1,'integer',['unsigned','big']), + #<5>(4,1,'integer',['unsigned','big']), + #<0>(64,1,'integer',['unsigned','big']), + #<6>(8,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<1345227215>(32,1,'integer',['unsigned','big']), + #<2374210999>(32,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<8000>(16,1,'integer',['unsigned','big']), + #<0>(56,1,'integer',['unsigned','big']), + #<0>(32,1,'integer',['unsigned','big'])}# + in let <_cor87> = + #{#<4>(4,1,'integer',['unsigned','big']), + #<5>(4,1,'integer',['unsigned','big']), + #<0>(64,1,'integer',['unsigned','big']), + #<6>(8,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<1345227212>(32,1,'integer',['unsigned','big']), + #<1345228029>(32,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<1715>(16,1,'integer',['unsigned','big']), + #<0>(56,1,'integer',['unsigned','big']), + #<512>(32,1,'integer',['unsigned','big'])}# + in let <_cor88> = + #{#<4>(4,1,'integer',['unsigned','big']), + #<5>(4,1,'integer',['unsigned','big']), + #<0>(64,1,'integer',['unsigned','big']), + #<6>(8,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<1345227775>(32,1,'integer',['unsigned','big']), + #<3191930879>(32,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<65535>(16,1,'integer',['unsigned','big']), + #<0>(56,1,'integer',['unsigned','big']), + #<512>(32,1,'integer',['unsigned','big'])}# + in let <_cor89> = + #{#<4>(4,1,'integer',['unsigned','big']), + #<5>(4,1,'integer',['unsigned','big']), + #<0>(64,1,'integer',['unsigned','big']), + #<0>(8,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<1345227155>(32,1,'integer',['unsigned','big']), + #<3240285566>(32,1,'integer',['unsigned','big']), + #<65535>(16,1,'integer',['unsigned','big']), + #<65535>(16,1,'integer',['unsigned','big']), + #<0>(56,1,'integer',['unsigned','big']), + #<4294967295>(32,1,'integer',['unsigned','big'])}# + in let <_cor90> = + #{#<4>(4,1,'integer',['unsigned','big']), + #<5>(4,1,'integer',['unsigned','big']), + #<0>(64,1,'integer',['unsigned','big']), + #<6>(8,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<1345227251>(32,1,'integer',['unsigned','big']), + #<3169702822>(32,1,'integer',['unsigned','big']), + #<65535>(16,1,'integer',['unsigned','big']), + #<1432>(16,1,'integer',['unsigned','big']), + #<0>(56,1,'integer',['unsigned','big']), + #<4294967295>(32,1,'integer',['unsigned','big'])}# + in let <_cor91> = + #{#<4>(4,1,'integer',['unsigned','big']), + #<5>(4,1,'integer',['unsigned','big']), + #<0>(64,1,'integer',['unsigned','big']), + #<6>(8,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<1345227212>(32,1,'integer',['unsigned','big']), + #<2348399657>(32,1,'integer',['unsigned','big']), + #<65535>(16,1,'integer',['unsigned','big']), + #<30210>(16,1,'integer',['unsigned','big']), + #<0>(56,1,'integer',['unsigned','big']), + #<0>(32,1,'integer',['unsigned','big'])}# + in let <_cor92> = + #{#<4>(4,1,'integer',['unsigned','big']), + #<5>(4,1,'integer',['unsigned','big']), + #<0>(64,1,'integer',['unsigned','big']), + #<6>(8,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<1345226752>(32,1,'integer',['unsigned','big']), + #<3192368248>(32,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<1704>(16,1,'integer',['unsigned','big']), + #<0>(56,1,'integer',['unsigned','big']), + #<0>(32,1,'integer',['unsigned','big'])}# + in let <_cor93> = + #{#<4>(4,1,'integer',['unsigned','big']), + #<5>(4,1,'integer',['unsigned','big']), + #<0>(64,1,'integer',['unsigned','big']), + #<6>(8,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<1345227251>(32,1,'integer',['unsigned','big']), + #<770421281>(32,1,'integer',['unsigned','big']), + #<65535>(16,1,'integer',['unsigned','big']), + #<1717>(16,1,'integer',['unsigned','big']), + #<0>(56,1,'integer',['unsigned','big']), + #<4294967295>(32,1,'integer',['unsigned','big'])}# + in let <_cor94> = + #{#<4>(4,1,'integer',['unsigned','big']), + #<5>(4,1,'integer',['unsigned','big']), + #<0>(64,1,'integer',['unsigned','big']), + #<6>(8,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<1345227228>(32,1,'integer',['unsigned','big']), + #<2266513408>(32,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<1715>(16,1,'integer',['unsigned','big']), + #<0>(56,1,'integer',['unsigned','big']), + #<0>(32,1,'integer',['unsigned','big'])}# + in let <_cor95> = + #{#<4>(4,1,'integer',['unsigned','big']), + #<5>(4,1,'integer',['unsigned','big']), + #<0>(64,1,'integer',['unsigned','big']), + #<6>(8,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<1345227227>(32,1,'integer',['unsigned','big']), + #<2441875187>(32,1,'integer',['unsigned','big']), + #<65535>(16,1,'integer',['unsigned','big']), + #<1734>(16,1,'integer',['unsigned','big']), + #<0>(56,1,'integer',['unsigned','big']), + #<4294967295>(32,1,'integer',['unsigned','big'])}# + in let <_cor96> = + #{#<4>(4,1,'integer',['unsigned','big']), + #<5>(4,1,'integer',['unsigned','big']), + #<0>(64,1,'integer',['unsigned','big']), + #<6>(8,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<1345227152>(32,1,'integer',['unsigned','big']), + #<3240344271>(32,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<61809>(16,1,'integer',['unsigned','big']), + #<0>(56,1,'integer',['unsigned','big']), + #<4294967295>(32,1,'integer',['unsigned','big'])}# + in let <_cor97> = + #{#<4>(4,1,'integer',['unsigned','big']), + #<5>(4,1,'integer',['unsigned','big']), + #<0>(64,1,'integer',['unsigned','big']), + #<6>(8,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<1345227192>(32,1,'integer',['unsigned','big']), + #<4235120639>(32,1,'integer',['unsigned','big']), + #<65535>(16,1,'integer',['unsigned','big']), + #<65535>(16,1,'integer',['unsigned','big']), + #<0>(56,1,'integer',['unsigned','big']), + #<4294967295>(32,1,'integer',['unsigned','big'])}# + in let <_cor98> = + #{#<4>(4,1,'integer',['unsigned','big']), + #<5>(4,1,'integer',['unsigned','big']), + #<0>(64,1,'integer',['unsigned','big']), + #<6>(8,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<3468369046>(32,1,'integer',['unsigned','big']), + #<3192223003>(32,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<1521>(16,1,'integer',['unsigned','big']), + #<0>(56,1,'integer',['unsigned','big']), + #<512>(32,1,'integer',['unsigned','big'])}# + in let <_cor99> = + #{#<4>(4,1,'integer',['unsigned','big']), + #<5>(4,1,'integer',['unsigned','big']), + #<0>(64,1,'integer',['unsigned','big']), + #<6>(8,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<1345227251>(32,1,'integer',['unsigned','big']), + #<3192223003>(32,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<0>(56,1,'integer',['unsigned','big']), + #<4294967295>(32,1,'integer',['unsigned','big'])}# + in let <_cor100> = + #{#<4>(4,1,'integer',['unsigned','big']), + #<5>(4,1,'integer',['unsigned','big']), + #<0>(64,1,'integer',['unsigned','big']), + #<6>(8,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<1345227248>(32,1,'integer',['unsigned','big']), + #<761119360>(32,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<65535>(16,1,'integer',['unsigned','big']), + #<0>(56,1,'integer',['unsigned','big']), + #<4294967295>(32,1,'integer',['unsigned','big'])}# + in let <_cor101> = + #{#<4>(4,1,'integer',['unsigned','big']), + #<5>(4,1,'integer',['unsigned','big']), + #<0>(64,1,'integer',['unsigned','big']), + #<6>(8,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<1345227252>(32,1,'integer',['unsigned','big']), + #<3191875583>(32,1,'integer',['unsigned','big']), + #<65535>(16,1,'integer',['unsigned','big']), + #<65535>(16,1,'integer',['unsigned','big']), + #<0>(56,1,'integer',['unsigned','big']), + #<4294967295>(32,1,'integer',['unsigned','big'])}# + in let <_cor102> = + #{#<4>(4,1,'integer',['unsigned','big']), + #<5>(4,1,'integer',['unsigned','big']), + #<0>(64,1,'integer',['unsigned','big']), + #<255>(8,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<1345227215>(32,1,'integer',['unsigned','big']), + #<656798129>(32,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<0>(56,1,'integer',['unsigned','big']), + #<4294967295>(32,1,'integer',['unsigned','big'])}# + in let <_cor103> = + #{#<4>(4,1,'integer',['unsigned','big']), + #<5>(4,1,'integer',['unsigned','big']), + #<0>(64,1,'integer',['unsigned','big']), + #<6>(8,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<1345227245>(32,1,'integer',['unsigned','big']), + #<3056017064>(32,1,'integer',['unsigned','big']), + #<65535>(16,1,'integer',['unsigned','big']), + #<1433>(16,1,'integer',['unsigned','big']), + #<0>(56,1,'integer',['unsigned','big']), + #<512>(32,1,'integer',['unsigned','big'])}# + in let <_cor104> = + #{#<4>(4,1,'integer',['unsigned','big']), + #<5>(4,1,'integer',['unsigned','big']), + #<0>(64,1,'integer',['unsigned','big']), + #<6>(8,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<1345227236>(32,1,'integer',['unsigned','big']), + #<3169686634>(32,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<61119>(16,1,'integer',['unsigned','big']), + #<0>(56,1,'integer',['unsigned','big']), + #<0>(32,1,'integer',['unsigned','big'])}# + in let <_cor105> = + #{#<4>(4,1,'integer',['unsigned','big']), + #<5>(4,1,'integer',['unsigned','big']), + #<0>(64,1,'integer',['unsigned','big']), + #<6>(8,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<1345227232>(32,1,'integer',['unsigned','big']), + #<3180218897>(32,1,'integer',['unsigned','big']), + #<65535>(16,1,'integer',['unsigned','big']), + #<8100>(16,1,'integer',['unsigned','big']), + #<0>(56,1,'integer',['unsigned','big']), + #<4294967295>(32,1,'integer',['unsigned','big'])}# + in let <_cor106> = + #{#<4>(4,1,'integer',['unsigned','big']), + #<5>(4,1,'integer',['unsigned','big']), + #<0>(64,1,'integer',['unsigned','big']), + #<6>(8,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<0>(32,1,'integer',['unsigned','big']), + #<281018367>(32,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<65535>(16,1,'integer',['unsigned','big']), + #<0>(56,1,'integer',['unsigned','big']), + #<4294967295>(32,1,'integer',['unsigned','big'])}# + in let <_cor107> = + #{#<4>(4,1,'integer',['unsigned','big']), + #<5>(4,1,'integer',['unsigned','big']), + #<0>(64,1,'integer',['unsigned','big']), + #<6>(8,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<1345227246>(32,1,'integer',['unsigned','big']), + #<3117736694>(32,1,'integer',['unsigned','big']), + #<65535>(16,1,'integer',['unsigned','big']), + #<1221>(16,1,'integer',['unsigned','big']), + #<0>(56,1,'integer',['unsigned','big']), + #<0>(32,1,'integer',['unsigned','big'])}# + in let <_cor108> = + #{#<4>(4,1,'integer',['unsigned','big']), + #<5>(4,1,'integer',['unsigned','big']), + #<0>(64,1,'integer',['unsigned','big']), + #<6>(8,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<1345227153>(32,1,'integer',['unsigned','big']), + #<3317245439>(32,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<1525>(16,1,'integer',['unsigned','big']), + #<0>(56,1,'integer',['unsigned','big']), + #<512>(32,1,'integer',['unsigned','big'])}# + in let <_cor109> = + #{#<4>(4,1,'integer',['unsigned','big']), + #<5>(4,1,'integer',['unsigned','big']), + #<0>(64,1,'integer',['unsigned','big']), + #<6>(8,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<1345227251>(32,1,'integer',['unsigned','big']), + #<3192223003>(32,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<65535>(16,1,'integer',['unsigned','big']), + #<0>(56,1,'integer',['unsigned','big']), + #<4294967295>(32,1,'integer',['unsigned','big'])}# + in let <_cor110> = + #{#<4>(4,1,'integer',['unsigned','big']), + #<5>(4,1,'integer',['unsigned','big']), + #<0>(64,1,'integer',['unsigned','big']), + #<6>(8,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<1345226752>(32,1,'integer',['unsigned','big']), + #<3342062546>(32,1,'integer',['unsigned','big']), + #<65535>(16,1,'integer',['unsigned','big']), + #<8000>(16,1,'integer',['unsigned','big']), + #<0>(56,1,'integer',['unsigned','big']), + #<4294967295>(32,1,'integer',['unsigned','big'])}# + in let <_cor111> = + #{#<4>(4,1,'integer',['unsigned','big']), + #<5>(4,1,'integer',['unsigned','big']), + #<0>(64,1,'integer',['unsigned','big']), + #<6>(8,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<1345227206>(32,1,'integer',['unsigned','big']), + #<3024357980>(32,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<2051>(16,1,'integer',['unsigned','big']), + #<0>(56,1,'integer',['unsigned','big']), + #<268439552>(32,1,'integer',['unsigned','big'])}# + in let <_cor112> = + #{#<4>(4,1,'integer',['unsigned','big']), + #<5>(4,1,'integer',['unsigned','big']), + #<0>(64,1,'integer',['unsigned','big']), + #<6>(8,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<1345227143>(32,1,'integer',['unsigned','big']), + #<3375398496>(32,1,'integer',['unsigned','big']), + #<65535>(16,1,'integer',['unsigned','big']), + #<1221>(16,1,'integer',['unsigned','big']), + #<0>(56,1,'integer',['unsigned','big']), + #<0>(32,1,'integer',['unsigned','big'])}# + in let <_cor113> = + #{#<4>(4,1,'integer',['unsigned','big']), + #<5>(4,1,'integer',['unsigned','big']), + #<0>(64,1,'integer',['unsigned','big']), + #<6>(8,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<1345227137>(32,1,'integer',['unsigned','big']), + #<3375892261>(32,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<1221>(16,1,'integer',['unsigned','big']), + #<0>(56,1,'integer',['unsigned','big']), + #<4294967295>(32,1,'integer',['unsigned','big'])}# + in let <_cor114> = + #{#<4>(4,1,'integer',['unsigned','big']), + #<5>(4,1,'integer',['unsigned','big']), + #<0>(64,1,'integer',['unsigned','big']), + #<6>(8,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<1345227236>(32,1,'integer',['unsigned','big']), + #<3169685504>(32,1,'integer',['unsigned','big']), + #<65535>(16,1,'integer',['unsigned','big']), + #<65535>(16,1,'integer',['unsigned','big']), + #<0>(56,1,'integer',['unsigned','big']), + #<512>(32,1,'integer',['unsigned','big'])}# + in let <_cor115> = + #{#<4>(4,1,'integer',['unsigned','big']), + #<5>(4,1,'integer',['unsigned','big']), + #<0>(64,1,'integer',['unsigned','big']), + #<6>(8,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<1345226752>(32,1,'integer',['unsigned','big']), + #<2374893567>(32,1,'integer',['unsigned','big']), + #<65535>(16,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<0>(56,1,'integer',['unsigned','big']), + #<0>(32,1,'integer',['unsigned','big'])}# + in let <_cor116> = + #{#<4>(4,1,'integer',['unsigned','big']), + #<5>(4,1,'integer',['unsigned','big']), + #<0>(64,1,'integer',['unsigned','big']), + #<6>(8,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<1345227206>(32,1,'integer',['unsigned','big']), + #<3024357983>(32,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<2051>(16,1,'integer',['unsigned','big']), + #<0>(56,1,'integer',['unsigned','big']), + #<268439552>(32,1,'integer',['unsigned','big'])}# + in let <_cor117> = + #{#<4>(4,1,'integer',['unsigned','big']), + #<5>(4,1,'integer',['unsigned','big']), + #<0>(64,1,'integer',['unsigned','big']), + #<6>(8,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<1345226752>(32,1,'integer',['unsigned','big']), + #<3191930879>(32,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<65535>(16,1,'integer',['unsigned','big']), + #<0>(56,1,'integer',['unsigned','big']), + #<512>(32,1,'integer',['unsigned','big'])}# + in let <_cor118> = + #{#<4>(4,1,'integer',['unsigned','big']), + #<5>(4,1,'integer',['unsigned','big']), + #<0>(64,1,'integer',['unsigned','big']), + #<6>(8,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<1345226752>(32,1,'integer',['unsigned','big']), + #<3191930879>(32,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<65535>(16,1,'integer',['unsigned','big']), + #<0>(56,1,'integer',['unsigned','big']), + #<512>(32,1,'integer',['unsigned','big'])}# + in let <_cor119> = + #{#<4>(4,1,'integer',['unsigned','big']), + #<5>(4,1,'integer',['unsigned','big']), + #<0>(64,1,'integer',['unsigned','big']), + #<6>(8,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<1345227206>(32,1,'integer',['unsigned','big']), + #<3056020118>(32,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<0>(56,1,'integer',['unsigned','big']), + #<0>(32,1,'integer',['unsigned','big'])}# + in let <_cor120> = + #{#<4>(4,1,'integer',['unsigned','big']), + #<5>(4,1,'integer',['unsigned','big']), + #<0>(64,1,'integer',['unsigned','big']), + #<6>(8,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<1345227206>(32,1,'integer',['unsigned','big']), + #<3056020118>(32,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<0>(56,1,'integer',['unsigned','big']), + #<0>(32,1,'integer',['unsigned','big'])}# + in let <_cor121> = + #{#<4>(4,1,'integer',['unsigned','big']), + #<5>(4,1,'integer',['unsigned','big']), + #<0>(64,1,'integer',['unsigned','big']), + #<6>(8,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<1345227206>(32,1,'integer',['unsigned','big']), + #<3056020118>(32,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<0>(56,1,'integer',['unsigned','big']), + #<0>(32,1,'integer',['unsigned','big'])}# + in let <_cor122> = + #{#<4>(4,1,'integer',['unsigned','big']), + #<5>(4,1,'integer',['unsigned','big']), + #<0>(64,1,'integer',['unsigned','big']), + #<6>(8,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<1345227206>(32,1,'integer',['unsigned','big']), + #<3056020118>(32,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<0>(56,1,'integer',['unsigned','big']), + #<0>(32,1,'integer',['unsigned','big'])}# + in let <_cor123> = + #{#<4>(4,1,'integer',['unsigned','big']), + #<5>(4,1,'integer',['unsigned','big']), + #<0>(64,1,'integer',['unsigned','big']), + #<6>(8,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<1345227250>(32,1,'integer',['unsigned','big']), + #<770421281>(32,1,'integer',['unsigned','big']), + #<65535>(16,1,'integer',['unsigned','big']), + #<1717>(16,1,'integer',['unsigned','big']), + #<0>(56,1,'integer',['unsigned','big']), + #<4294967295>(32,1,'integer',['unsigned','big'])}# + in let <_cor124> = + #{#<4>(4,1,'integer',['unsigned','big']), + #<5>(4,1,'integer',['unsigned','big']), + #<0>(64,1,'integer',['unsigned','big']), + #<6>(8,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<1345227248>(32,1,'integer',['unsigned','big']), + #<761119487>(32,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<65535>(16,1,'integer',['unsigned','big']), + #<0>(56,1,'integer',['unsigned','big']), + #<4294967295>(32,1,'integer',['unsigned','big'])}# + in let <_cor125> = + #{#<4>(4,1,'integer',['unsigned','big']), + #<5>(4,1,'integer',['unsigned','big']), + #<0>(64,1,'integer',['unsigned','big']), + #<6>(8,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<1345226752>(32,1,'integer',['unsigned','big']), + #<3192368248>(32,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<1704>(16,1,'integer',['unsigned','big']), + #<0>(56,1,'integer',['unsigned','big']), + #<0>(32,1,'integer',['unsigned','big'])}# + in let <_cor126> = + #{#<4>(4,1,'integer',['unsigned','big']), + #<5>(4,1,'integer',['unsigned','big']), + #<0>(64,1,'integer',['unsigned','big']), + #<6>(8,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<1345227155>(32,1,'integer',['unsigned','big']), + #<3240285513>(32,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<1733>(16,1,'integer',['unsigned','big']), + #<0>(56,1,'integer',['unsigned','big']), + #<268439552>(32,1,'integer',['unsigned','big'])}# + in let <_cor127> = + #{#<4>(4,1,'integer',['unsigned','big']), + #<5>(4,1,'integer',['unsigned','big']), + #<0>(64,1,'integer',['unsigned','big']), + #<0>(8,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<1345226752>(32,1,'integer',['unsigned','big']), + #<3192127488>(32,1,'integer',['unsigned','big']), + #<65535>(16,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<0>(56,1,'integer',['unsigned','big']), + #<0>(32,1,'integer',['unsigned','big'])}# + in let <_cor128> = + #{#<4>(4,1,'integer',['unsigned','big']), + #<5>(4,1,'integer',['unsigned','big']), + #<0>(64,1,'integer',['unsigned','big']), + #<6>(8,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<1345227206>(32,1,'integer',['unsigned','big']), + #<3055802373>(32,1,'integer',['unsigned','big']), + #<65535>(16,1,'integer',['unsigned','big']), + #<20>(16,1,'integer',['unsigned','big']), + #<0>(56,1,'integer',['unsigned','big']), + #<512>(32,1,'integer',['unsigned','big'])}# + in let <_cor129> = + #{#<4>(4,1,'integer',['unsigned','big']), + #<5>(4,1,'integer',['unsigned','big']), + #<0>(64,1,'integer',['unsigned','big']), + #<6>(8,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<1345227206>(32,1,'integer',['unsigned','big']), + #<3055802373>(32,1,'integer',['unsigned','big']), + #<65535>(16,1,'integer',['unsigned','big']), + #<20>(16,1,'integer',['unsigned','big']), + #<0>(56,1,'integer',['unsigned','big']), + #<512>(32,1,'integer',['unsigned','big'])}# + in let <_cor130> = + #{#<4>(4,1,'integer',['unsigned','big']), + #<5>(4,1,'integer',['unsigned','big']), + #<0>(64,1,'integer',['unsigned','big']), + #<6>(8,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<1345227206>(32,1,'integer',['unsigned','big']), + #<3055802373>(32,1,'integer',['unsigned','big']), + #<65535>(16,1,'integer',['unsigned','big']), + #<20>(16,1,'integer',['unsigned','big']), + #<0>(56,1,'integer',['unsigned','big']), + #<512>(32,1,'integer',['unsigned','big'])}# + in let <_cor131> = + #{#<4>(4,1,'integer',['unsigned','big']), + #<5>(4,1,'integer',['unsigned','big']), + #<0>(64,1,'integer',['unsigned','big']), + #<6>(8,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<1345227206>(32,1,'integer',['unsigned','big']), + #<3055802373>(32,1,'integer',['unsigned','big']), + #<65535>(16,1,'integer',['unsigned','big']), + #<20>(16,1,'integer',['unsigned','big']), + #<0>(56,1,'integer',['unsigned','big']), + #<512>(32,1,'integer',['unsigned','big'])}# + in let <_cor132> = + #{#<4>(4,1,'integer',['unsigned','big']), + #<5>(4,1,'integer',['unsigned','big']), + #<0>(64,1,'integer',['unsigned','big']), + #<6>(8,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<1345227206>(32,1,'integer',['unsigned','big']), + #<3055802373>(32,1,'integer',['unsigned','big']), + #<65535>(16,1,'integer',['unsigned','big']), + #<20>(16,1,'integer',['unsigned','big']), + #<0>(56,1,'integer',['unsigned','big']), + #<512>(32,1,'integer',['unsigned','big'])}# + in let <_cor133> = + #{#<4>(4,1,'integer',['unsigned','big']), + #<5>(4,1,'integer',['unsigned','big']), + #<0>(64,1,'integer',['unsigned','big']), + #<6>(8,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<1345227206>(32,1,'integer',['unsigned','big']), + #<3055802373>(32,1,'integer',['unsigned','big']), + #<65535>(16,1,'integer',['unsigned','big']), + #<20>(16,1,'integer',['unsigned','big']), + #<0>(56,1,'integer',['unsigned','big']), + #<512>(32,1,'integer',['unsigned','big'])}# + in let <_cor134> = + #{#<4>(4,1,'integer',['unsigned','big']), + #<5>(4,1,'integer',['unsigned','big']), + #<0>(64,1,'integer',['unsigned','big']), + #<6>(8,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<1345227206>(32,1,'integer',['unsigned','big']), + #<3055802373>(32,1,'integer',['unsigned','big']), + #<65535>(16,1,'integer',['unsigned','big']), + #<20>(16,1,'integer',['unsigned','big']), + #<0>(56,1,'integer',['unsigned','big']), + #<512>(32,1,'integer',['unsigned','big'])}# + in let <_cor135> = + #{#<4>(4,1,'integer',['unsigned','big']), + #<5>(4,1,'integer',['unsigned','big']), + #<0>(64,1,'integer',['unsigned','big']), + #<6>(8,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<1345227206>(32,1,'integer',['unsigned','big']), + #<3055802373>(32,1,'integer',['unsigned','big']), + #<65535>(16,1,'integer',['unsigned','big']), + #<20>(16,1,'integer',['unsigned','big']), + #<0>(56,1,'integer',['unsigned','big']), + #<512>(32,1,'integer',['unsigned','big'])}# + in let <_cor136> = + #{#<4>(4,1,'integer',['unsigned','big']), + #<5>(4,1,'integer',['unsigned','big']), + #<0>(64,1,'integer',['unsigned','big']), + #<6>(8,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<1345227206>(32,1,'integer',['unsigned','big']), + #<3055802373>(32,1,'integer',['unsigned','big']), + #<65535>(16,1,'integer',['unsigned','big']), + #<20>(16,1,'integer',['unsigned','big']), + #<0>(56,1,'integer',['unsigned','big']), + #<512>(32,1,'integer',['unsigned','big'])}# + in let <_cor137> = + #{#<4>(4,1,'integer',['unsigned','big']), + #<5>(4,1,'integer',['unsigned','big']), + #<0>(64,1,'integer',['unsigned','big']), + #<6>(8,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<1345227236>(32,1,'integer',['unsigned','big']), + #<3180210507>(32,1,'integer',['unsigned','big']), + #<65535>(16,1,'integer',['unsigned','big']), + #<5540>(16,1,'integer',['unsigned','big']), + #<0>(56,1,'integer',['unsigned','big']), + #<4294967295>(32,1,'integer',['unsigned','big'])}# + in let <_cor138> = + #{#<4>(4,1,'integer',['unsigned','big']), + #<5>(4,1,'integer',['unsigned','big']), + #<0>(64,1,'integer',['unsigned','big']), + #<255>(8,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<1345226752>(32,1,'integer',['unsigned','big']), + #<3532670719>(32,1,'integer',['unsigned','big']), + #<65535>(16,1,'integer',['unsigned','big']), + #<65535>(16,1,'integer',['unsigned','big']), + #<0>(56,1,'integer',['unsigned','big']), + #<0>(32,1,'integer',['unsigned','big'])}# + in let <_cor139> = + #{#<4>(4,1,'integer',['unsigned','big']), + #<5>(4,1,'integer',['unsigned','big']), + #<0>(64,1,'integer',['unsigned','big']), + #<6>(8,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<1345227227>(32,1,'integer',['unsigned','big']), + #<2159611346>(32,1,'integer',['unsigned','big']), + #<65535>(16,1,'integer',['unsigned','big']), + #<8000>(16,1,'integer',['unsigned','big']), + #<0>(56,1,'integer',['unsigned','big']), + #<512>(32,1,'integer',['unsigned','big'])}# + in let <_cor140> = + #{#<4>(4,1,'integer',['unsigned','big']), + #<5>(4,1,'integer',['unsigned','big']), + #<0>(64,1,'integer',['unsigned','big']), + #<6>(8,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<1345227248>(32,1,'integer',['unsigned','big']), + #<3192223000>(32,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<1350>(16,1,'integer',['unsigned','big']), + #<0>(56,1,'integer',['unsigned','big']), + #<4294967295>(32,1,'integer',['unsigned','big'])}# + in let <_cor141> = + #{#<4>(4,1,'integer',['unsigned','big']), + #<5>(4,1,'integer',['unsigned','big']), + #<0>(64,1,'integer',['unsigned','big']), + #<6>(8,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<1345227155>(32,1,'integer',['unsigned','big']), + #<3240285513>(32,1,'integer',['unsigned','big']), + #<65535>(16,1,'integer',['unsigned','big']), + #<1733>(16,1,'integer',['unsigned','big']), + #<0>(56,1,'integer',['unsigned','big']), + #<268439552>(32,1,'integer',['unsigned','big'])}# + in let <_cor142> = + #{#<4>(4,1,'integer',['unsigned','big']), + #<5>(4,1,'integer',['unsigned','big']), + #<0>(64,1,'integer',['unsigned','big']), + #<1>(8,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<1345227264>(32,1,'integer',['unsigned','big']), + #<1428305289>(32,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<0>(56,1,'integer',['unsigned','big']), + #<4294967295>(32,1,'integer',['unsigned','big'])}# + in let <_cor143> = + #{#<4>(4,1,'integer',['unsigned','big']), + #<5>(4,1,'integer',['unsigned','big']), + #<0>(64,1,'integer',['unsigned','big']), + #<6>(8,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<1345227236>(32,1,'integer',['unsigned','big']), + #<3169685504>(32,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<0>(56,1,'integer',['unsigned','big']), + #<512>(32,1,'integer',['unsigned','big'])}# + in let <_cor144> = + #{#<4>(4,1,'integer',['unsigned','big']), + #<5>(4,1,'integer',['unsigned','big']), + #<0>(64,1,'integer',['unsigned','big']), + #<6>(8,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<1345227196>(32,1,'integer',['unsigned','big']), + #<4244263768>(32,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<1490>(16,1,'integer',['unsigned','big']), + #<0>(56,1,'integer',['unsigned','big']), + #<0>(32,1,'integer',['unsigned','big'])}# + in let <_cor145> = + #{#<4>(4,1,'integer',['unsigned','big']), + #<5>(4,1,'integer',['unsigned','big']), + #<0>(64,1,'integer',['unsigned','big']), + #<6>(8,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<1345227226>(32,1,'integer',['unsigned','big']), + #<3240345599>(32,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<1724>(16,1,'integer',['unsigned','big']), + #<0>(56,1,'integer',['unsigned','big']), + #<0>(32,1,'integer',['unsigned','big'])}# + in let <_cor146> = + #{#<4>(4,1,'integer',['unsigned','big']), + #<5>(4,1,'integer',['unsigned','big']), + #<0>(64,1,'integer',['unsigned','big']), + #<6>(8,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<1345227223>(32,1,'integer',['unsigned','big']), + #<3240343552>(32,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<65535>(16,1,'integer',['unsigned','big']), + #<0>(56,1,'integer',['unsigned','big']), + #<0>(32,1,'integer',['unsigned','big'])}# + in let <_cor147> = + #{#<4>(4,1,'integer',['unsigned','big']), + #<5>(4,1,'integer',['unsigned','big']), + #<0>(64,1,'integer',['unsigned','big']), + #<6>(8,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<1345227234>(32,1,'integer',['unsigned','big']), + #<3117867571>(32,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<1521>(16,1,'integer',['unsigned','big']), + #<0>(56,1,'integer',['unsigned','big']), + #<4294967295>(32,1,'integer',['unsigned','big'])}# + in let <_cor148> = + #{#<4>(4,1,'integer',['unsigned','big']), + #<5>(4,1,'integer',['unsigned','big']), + #<0>(64,1,'integer',['unsigned','big']), + #<6>(8,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<1345227248>(32,1,'integer',['unsigned','big']), + #<3191877255>(32,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<1708>(16,1,'integer',['unsigned','big']), + #<0>(56,1,'integer',['unsigned','big']), + #<4294967295>(32,1,'integer',['unsigned','big'])}# + in let <_cor149> = + #{#<4>(4,1,'integer',['unsigned','big']), + #<5>(4,1,'integer',['unsigned','big']), + #<0>(64,1,'integer',['unsigned','big']), + #<6>(8,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<1345227187>(32,1,'integer',['unsigned','big']), + #<4047451439>(32,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<5632>(16,1,'integer',['unsigned','big']), + #<0>(56,1,'integer',['unsigned','big']), + #<0>(32,1,'integer',['unsigned','big'])}# + in let <_cor150> = + #{#<4>(4,1,'integer',['unsigned','big']), + #<5>(4,1,'integer',['unsigned','big']), + #<0>(64,1,'integer',['unsigned','big']), + #<6>(8,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<1345227204>(32,1,'integer',['unsigned','big']), + #<3056020112>(32,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<1521>(16,1,'integer',['unsigned','big']), + #<0>(56,1,'integer',['unsigned','big']), + #<4294967295>(32,1,'integer',['unsigned','big'])}# + in let <_cor151> = + #{#<4>(4,1,'integer',['unsigned','big']), + #<5>(4,1,'integer',['unsigned','big']), + #<0>(64,1,'integer',['unsigned','big']), + #<6>(8,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<1345227247>(32,1,'integer',['unsigned','big']), + #<3109569994>(32,1,'integer',['unsigned','big']), + #<65535>(16,1,'integer',['unsigned','big']), + #<1525>(16,1,'integer',['unsigned','big']), + #<0>(56,1,'integer',['unsigned','big']), + #<4294967295>(32,1,'integer',['unsigned','big'])}# + in let <_cor152> = + #{#<4>(4,1,'integer',['unsigned','big']), + #<5>(4,1,'integer',['unsigned','big']), + #<0>(64,1,'integer',['unsigned','big']), + #<6>(8,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<1345227236>(32,1,'integer',['unsigned','big']), + #<3180210507>(32,1,'integer',['unsigned','big']), + #<65535>(16,1,'integer',['unsigned','big']), + #<5540>(16,1,'integer',['unsigned','big']), + #<0>(56,1,'integer',['unsigned','big']), + #<4294967295>(32,1,'integer',['unsigned','big'])}# + in let <_cor153> = + #{#<4>(4,1,'integer',['unsigned','big']), + #<5>(4,1,'integer',['unsigned','big']), + #<0>(64,1,'integer',['unsigned','big']), + #<0>(8,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<1345226752>(32,1,'integer',['unsigned','big']), + #<3192258559>(32,1,'integer',['unsigned','big']), + #<65535>(16,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<0>(56,1,'integer',['unsigned','big']), + #<0>(32,1,'integer',['unsigned','big'])}# + in let <_cor154> = + #{#<4>(4,1,'integer',['unsigned','big']), + #<5>(4,1,'integer',['unsigned','big']), + #<0>(64,1,'integer',['unsigned','big']), + #<6>(8,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<1345227245>(32,1,'integer',['unsigned','big']), + #<3056017066>(32,1,'integer',['unsigned','big']), + #<65535>(16,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<0>(56,1,'integer',['unsigned','big']), + #<4294967295>(32,1,'integer',['unsigned','big'])}# + in let <_cor155> = + #{#<4>(4,1,'integer',['unsigned','big']), + #<5>(4,1,'integer',['unsigned','big']), + #<0>(64,1,'integer',['unsigned','big']), + #<6>(8,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<1345226752>(32,1,'integer',['unsigned','big']), + #<3281059621>(32,1,'integer',['unsigned','big']), + #<65535>(16,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<0>(56,1,'integer',['unsigned','big']), + #<0>(32,1,'integer',['unsigned','big'])}# + in let <_cor156> = + #{#<4>(4,1,'integer',['unsigned','big']), + #<5>(4,1,'integer',['unsigned','big']), + #<0>(64,1,'integer',['unsigned','big']), + #<6>(8,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<1345227251>(32,1,'integer',['unsigned','big']), + #<3192296352>(32,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<0>(56,1,'integer',['unsigned','big']), + #<4294967295>(32,1,'integer',['unsigned','big'])}# + in let <_cor157> = + #{#<4>(4,1,'integer',['unsigned','big']), + #<5>(4,1,'integer',['unsigned','big']), + #<0>(64,1,'integer',['unsigned','big']), + #<6>(8,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<1345227251>(32,1,'integer',['unsigned','big']), + #<3191877255>(32,1,'integer',['unsigned','big']), + #<65535>(16,1,'integer',['unsigned','big']), + #<2115>(16,1,'integer',['unsigned','big']), + #<0>(56,1,'integer',['unsigned','big']), + #<512>(32,1,'integer',['unsigned','big'])}# + in let <_cor158> = + #{#<4>(4,1,'integer',['unsigned','big']), + #<5>(4,1,'integer',['unsigned','big']), + #<0>(64,1,'integer',['unsigned','big']), + #<6>(8,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<1345227227>(32,1,'integer',['unsigned','big']), + #<1036523944>(32,1,'integer',['unsigned','big']), + #<65535>(16,1,'integer',['unsigned','big']), + #<1525>(16,1,'integer',['unsigned','big']), + #<0>(56,1,'integer',['unsigned','big']), + #<4294967295>(32,1,'integer',['unsigned','big'])}# + in let <_cor159> = + #{#<4>(4,1,'integer',['unsigned','big']), + #<5>(4,1,'integer',['unsigned','big']), + #<0>(64,1,'integer',['unsigned','big']), + #<6>(8,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<1345226752>(32,1,'integer',['unsigned','big']), + #<3192368255>(32,1,'integer',['unsigned','big']), + #<65535>(16,1,'integer',['unsigned','big']), + #<1704>(16,1,'integer',['unsigned','big']), + #<0>(56,1,'integer',['unsigned','big']), + #<4294967295>(32,1,'integer',['unsigned','big'])}# + in let <_cor160> = + #{#<4>(4,1,'integer',['unsigned','big']), + #<5>(4,1,'integer',['unsigned','big']), + #<0>(64,1,'integer',['unsigned','big']), + #<6>(8,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<1345227248>(32,1,'integer',['unsigned','big']), + #<3192223000>(32,1,'integer',['unsigned','big']), + #<65535>(16,1,'integer',['unsigned','big']), + #<1300>(16,1,'integer',['unsigned','big']), + #<0>(56,1,'integer',['unsigned','big']), + #<4294967295>(32,1,'integer',['unsigned','big'])}# + in let <_cor161> = + #{#<4>(4,1,'integer',['unsigned','big']), + #<5>(4,1,'integer',['unsigned','big']), + #<0>(64,1,'integer',['unsigned','big']), + #<0>(8,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<1345226752>(32,1,'integer',['unsigned','big']), + #<3192258559>(32,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<0>(56,1,'integer',['unsigned','big']), + #<4294967295>(32,1,'integer',['unsigned','big'])}# + in let <_cor162> = + #{#<4>(4,1,'integer',['unsigned','big']), + #<5>(4,1,'integer',['unsigned','big']), + #<0>(64,1,'integer',['unsigned','big']), + #<6>(8,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<1345227204>(32,1,'integer',['unsigned','big']), + #<3055802373>(32,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<1700>(16,1,'integer',['unsigned','big']), + #<0>(56,1,'integer',['unsigned','big']), + #<0>(32,1,'integer',['unsigned','big'])}# + in let <_cor163> = + #{#<4>(4,1,'integer',['unsigned','big']), + #<5>(4,1,'integer',['unsigned','big']), + #<0>(64,1,'integer',['unsigned','big']), + #<6>(8,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<1345227236>(32,1,'integer',['unsigned','big']), + #<3169685504>(32,1,'integer',['unsigned','big']), + #<65535>(16,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<0>(56,1,'integer',['unsigned','big']), + #<512>(32,1,'integer',['unsigned','big'])}# + in let <_cor164> = + #{#<4>(4,1,'integer',['unsigned','big']), + #<5>(4,1,'integer',['unsigned','big']), + #<0>(64,1,'integer',['unsigned','big']), + #<6>(8,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<1345227226>(32,1,'integer',['unsigned','big']), + #<3240343552>(32,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<1724>(16,1,'integer',['unsigned','big']), + #<0>(56,1,'integer',['unsigned','big']), + #<0>(32,1,'integer',['unsigned','big'])}# + in let <_cor165> = + #{#<4>(4,1,'integer',['unsigned','big']), + #<5>(4,1,'integer',['unsigned','big']), + #<0>(64,1,'integer',['unsigned','big']), + #<6>(8,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<1345227248>(32,1,'integer',['unsigned','big']), + #<3192223003>(32,1,'integer',['unsigned','big']), + #<65535>(16,1,'integer',['unsigned','big']), + #<14753>(16,1,'integer',['unsigned','big']), + #<0>(56,1,'integer',['unsigned','big']), + #<268439552>(32,1,'integer',['unsigned','big'])}# + in let <_cor166> = + #{#<4>(4,1,'integer',['unsigned','big']), + #<5>(4,1,'integer',['unsigned','big']), + #<0>(64,1,'integer',['unsigned','big']), + #<1>(8,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<1345227250>(32,1,'integer',['unsigned','big']), + #<3192222976>(32,1,'integer',['unsigned','big']), + #<65535>(16,1,'integer',['unsigned','big']), + #<65535>(16,1,'integer',['unsigned','big']), + #<0>(56,1,'integer',['unsigned','big']), + #<0>(32,1,'integer',['unsigned','big'])}# + in let <_cor167> = + #{#<4>(4,1,'integer',['unsigned','big']), + #<5>(4,1,'integer',['unsigned','big']), + #<0>(64,1,'integer',['unsigned','big']), + #<6>(8,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<1345227248>(32,1,'integer',['unsigned','big']), + #<3191877255>(32,1,'integer',['unsigned','big']), + #<65535>(16,1,'integer',['unsigned','big']), + #<1708>(16,1,'integer',['unsigned','big']), + #<0>(56,1,'integer',['unsigned','big']), + #<4294967295>(32,1,'integer',['unsigned','big'])}# + in let <_cor168> = + #{#<4>(4,1,'integer',['unsigned','big']), + #<5>(4,1,'integer',['unsigned','big']), + #<0>(64,1,'integer',['unsigned','big']), + #<6>(8,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<1345227212>(32,1,'integer',['unsigned','big']), + #<1345228028>(32,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<1715>(16,1,'integer',['unsigned','big']), + #<0>(56,1,'integer',['unsigned','big']), + #<512>(32,1,'integer',['unsigned','big'])}# + in let <_cor169> = + #{#<4>(4,1,'integer',['unsigned','big']), + #<5>(4,1,'integer',['unsigned','big']), + #<0>(64,1,'integer',['unsigned','big']), + #<6>(8,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<1345227226>(32,1,'integer',['unsigned','big']), + #<2154273893>(32,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<1521>(16,1,'integer',['unsigned','big']), + #<0>(56,1,'integer',['unsigned','big']), + #<4294967295>(32,1,'integer',['unsigned','big'])}# + in let <_cor170> = + #{#<4>(4,1,'integer',['unsigned','big']), + #<5>(4,1,'integer',['unsigned','big']), + #<0>(64,1,'integer',['unsigned','big']), + #<6>(8,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<1345227245>(32,1,'integer',['unsigned','big']), + #<3056017066>(32,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<65535>(16,1,'integer',['unsigned','big']), + #<0>(56,1,'integer',['unsigned','big']), + #<0>(32,1,'integer',['unsigned','big'])}# + in let <_cor171> = + #{#<4>(4,1,'integer',['unsigned','big']), + #<5>(4,1,'integer',['unsigned','big']), + #<0>(64,1,'integer',['unsigned','big']), + #<6>(8,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<1345227246>(32,1,'integer',['unsigned','big']), + #<3117736694>(32,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<1221>(16,1,'integer',['unsigned','big']), + #<0>(56,1,'integer',['unsigned','big']), + #<0>(32,1,'integer',['unsigned','big'])}# + in let <_cor172> = + #{#<4>(4,1,'integer',['unsigned','big']), + #<5>(4,1,'integer',['unsigned','big']), + #<0>(64,1,'integer',['unsigned','big']), + #<6>(8,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<1345227205>(32,1,'integer',['unsigned','big']), + #<3056020112>(32,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<1521>(16,1,'integer',['unsigned','big']), + #<0>(56,1,'integer',['unsigned','big']), + #<4294967295>(32,1,'integer',['unsigned','big'])}# + in let <_cor173> = + #{#<4>(4,1,'integer',['unsigned','big']), + #<5>(4,1,'integer',['unsigned','big']), + #<0>(64,1,'integer',['unsigned','big']), + #<6>(8,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<1345227245>(32,1,'integer',['unsigned','big']), + #<3056017064>(32,1,'integer',['unsigned','big']), + #<65535>(16,1,'integer',['unsigned','big']), + #<1433>(16,1,'integer',['unsigned','big']), + #<0>(56,1,'integer',['unsigned','big']), + #<512>(32,1,'integer',['unsigned','big'])}# + in let <_cor174> = + #{#<4>(4,1,'integer',['unsigned','big']), + #<5>(4,1,'integer',['unsigned','big']), + #<0>(64,1,'integer',['unsigned','big']), + #<6>(8,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<1345227248>(32,1,'integer',['unsigned','big']), + #<3191877255>(32,1,'integer',['unsigned','big']), + #<65535>(16,1,'integer',['unsigned','big']), + #<1708>(16,1,'integer',['unsigned','big']), + #<0>(56,1,'integer',['unsigned','big']), + #<4294967295>(32,1,'integer',['unsigned','big'])}# + in let <_cor175> = + #{#<4>(4,1,'integer',['unsigned','big']), + #<5>(4,1,'integer',['unsigned','big']), + #<0>(64,1,'integer',['unsigned','big']), + #<6>(8,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<1345227206>(32,1,'integer',['unsigned','big']), + #<3056020118>(32,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<65535>(16,1,'integer',['unsigned','big']), + #<0>(56,1,'integer',['unsigned','big']), + #<0>(32,1,'integer',['unsigned','big'])}# + in let <_cor176> = + #{#<4>(4,1,'integer',['unsigned','big']), + #<5>(4,1,'integer',['unsigned','big']), + #<0>(64,1,'integer',['unsigned','big']), + #<6>(8,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<1345226752>(32,1,'integer',['unsigned','big']), + #<3342062546>(32,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<8100>(16,1,'integer',['unsigned','big']), + #<0>(56,1,'integer',['unsigned','big']), + #<0>(32,1,'integer',['unsigned','big'])}# + in let <_cor177> = + #{#<4>(4,1,'integer',['unsigned','big']), + #<5>(4,1,'integer',['unsigned','big']), + #<0>(64,1,'integer',['unsigned','big']), + #<6>(8,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<3468369046>(32,1,'integer',['unsigned','big']), + #<3192223003>(32,1,'integer',['unsigned','big']), + #<65535>(16,1,'integer',['unsigned','big']), + #<1521>(16,1,'integer',['unsigned','big']), + #<0>(56,1,'integer',['unsigned','big']), + #<512>(32,1,'integer',['unsigned','big'])}# + in let <_cor178> = + #{#<4>(4,1,'integer',['unsigned','big']), + #<5>(4,1,'integer',['unsigned','big']), + #<0>(64,1,'integer',['unsigned','big']), + #<6>(8,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<1345227232>(32,1,'integer',['unsigned','big']), + #<3117867794>(32,1,'integer',['unsigned','big']), + #<65535>(16,1,'integer',['unsigned','big']), + #<1433>(16,1,'integer',['unsigned','big']), + #<0>(56,1,'integer',['unsigned','big']), + #<4294967295>(32,1,'integer',['unsigned','big'])}# + in let <_cor179> = + #{#<4>(4,1,'integer',['unsigned','big']), + #<5>(4,1,'integer',['unsigned','big']), + #<0>(64,1,'integer',['unsigned','big']), + #<6>(8,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<1345227187>(32,1,'integer',['unsigned','big']), + #<4047451439>(32,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<5632>(16,1,'integer',['unsigned','big']), + #<0>(56,1,'integer',['unsigned','big']), + #<0>(32,1,'integer',['unsigned','big'])}# + in let <_cor180> = + #{#<4>(4,1,'integer',['unsigned','big']), + #<5>(4,1,'integer',['unsigned','big']), + #<0>(64,1,'integer',['unsigned','big']), + #<6>(8,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<1345227206>(32,1,'integer',['unsigned','big']), + #<3041262554>(32,1,'integer',['unsigned','big']), + #<65535>(16,1,'integer',['unsigned','big']), + #<62009>(16,1,'integer',['unsigned','big']), + #<0>(56,1,'integer',['unsigned','big']), + #<0>(32,1,'integer',['unsigned','big'])}# + in let <_cor181> = + #{#<4>(4,1,'integer',['unsigned','big']), + #<5>(4,1,'integer',['unsigned','big']), + #<0>(64,1,'integer',['unsigned','big']), + #<6>(8,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<1345226752>(32,1,'integer',['unsigned','big']), + #<3376152576>(32,1,'integer',['unsigned','big']), + #<65535>(16,1,'integer',['unsigned','big']), + #<65535>(16,1,'integer',['unsigned','big']), + #<0>(56,1,'integer',['unsigned','big']), + #<4294967295>(32,1,'integer',['unsigned','big'])}# + in let <_cor182> = + #{#<4>(4,1,'integer',['unsigned','big']), + #<5>(4,1,'integer',['unsigned','big']), + #<0>(64,1,'integer',['unsigned','big']), + #<6>(8,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<1345227248>(32,1,'integer',['unsigned','big']), + #<3192223002>(32,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<1521>(16,1,'integer',['unsigned','big']), + #<0>(56,1,'integer',['unsigned','big']), + #<4294967295>(32,1,'integer',['unsigned','big'])}# + in let <_cor183> = + #{#<4>(4,1,'integer',['unsigned','big']), + #<5>(4,1,'integer',['unsigned','big']), + #<0>(64,1,'integer',['unsigned','big']), + #<6>(8,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<1345227248>(32,1,'integer',['unsigned','big']), + #<3191874853>(32,1,'integer',['unsigned','big']), + #<65535>(16,1,'integer',['unsigned','big']), + #<1521>(16,1,'integer',['unsigned','big']), + #<0>(56,1,'integer',['unsigned','big']), + #<0>(32,1,'integer',['unsigned','big'])}# + in let <_cor184> = + #{#<4>(4,1,'integer',['unsigned','big']), + #<5>(4,1,'integer',['unsigned','big']), + #<0>(64,1,'integer',['unsigned','big']), + #<6>(8,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<1345227250>(32,1,'integer',['unsigned','big']), + #<3169702822>(32,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<1432>(16,1,'integer',['unsigned','big']), + #<0>(56,1,'integer',['unsigned','big']), + #<4294967295>(32,1,'integer',['unsigned','big'])}# + in let <_cor185> = + #{#<4>(4,1,'integer',['unsigned','big']), + #<5>(4,1,'integer',['unsigned','big']), + #<0>(64,1,'integer',['unsigned','big']), + #<6>(8,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<1345227203>(32,1,'integer',['unsigned','big']), + #<639942762>(32,1,'integer',['unsigned','big']), + #<65535>(16,1,'integer',['unsigned','big']), + #<1521>(16,1,'integer',['unsigned','big']), + #<0>(56,1,'integer',['unsigned','big']), + #<268439552>(32,1,'integer',['unsigned','big'])}# + in let <_cor186> = + #{#<4>(4,1,'integer',['unsigned','big']), + #<5>(4,1,'integer',['unsigned','big']), + #<0>(64,1,'integer',['unsigned','big']), + #<6>(8,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<1345227236>(32,1,'integer',['unsigned','big']), + #<3169686634>(32,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<61100>(16,1,'integer',['unsigned','big']), + #<0>(56,1,'integer',['unsigned','big']), + #<4294967295>(32,1,'integer',['unsigned','big'])}# + in let <_cor187> = + #{#<4>(4,1,'integer',['unsigned','big']), + #<5>(4,1,'integer',['unsigned','big']), + #<0>(64,1,'integer',['unsigned','big']), + #<6>(8,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<1345227248>(32,1,'integer',['unsigned','big']), + #<3192296356>(32,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<1706>(16,1,'integer',['unsigned','big']), + #<0>(56,1,'integer',['unsigned','big']), + #<4294967295>(32,1,'integer',['unsigned','big'])}# + in let <_cor188> = + #{#<4>(4,1,'integer',['unsigned','big']), + #<5>(4,1,'integer',['unsigned','big']), + #<0>(64,1,'integer',['unsigned','big']), + #<6>(8,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<1345227236>(32,1,'integer',['unsigned','big']), + #<780719925>(32,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<7500>(16,1,'integer',['unsigned','big']), + #<0>(56,1,'integer',['unsigned','big']), + #<4294967295>(32,1,'integer',['unsigned','big'])}# + in let <_cor189> = + #{#<4>(4,1,'integer',['unsigned','big']), + #<5>(4,1,'integer',['unsigned','big']), + #<0>(64,1,'integer',['unsigned','big']), + #<6>(8,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<1345227775>(32,1,'integer',['unsigned','big']), + #<3375892261>(32,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<65535>(16,1,'integer',['unsigned','big']), + #<0>(56,1,'integer',['unsigned','big']), + #<4294967295>(32,1,'integer',['unsigned','big'])}# + in let <_cor190> = + #{#<4>(4,1,'integer',['unsigned','big']), + #<5>(4,1,'integer',['unsigned','big']), + #<0>(64,1,'integer',['unsigned','big']), + #<6>(8,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<1345227255>(32,1,'integer',['unsigned','big']), + #<3191875583>(32,1,'integer',['unsigned','big']), + #<65535>(16,1,'integer',['unsigned','big']), + #<65535>(16,1,'integer',['unsigned','big']), + #<0>(56,1,'integer',['unsigned','big']), + #<4294967295>(32,1,'integer',['unsigned','big'])}# + in let <_cor191> = + #{#<4>(4,1,'integer',['unsigned','big']), + #<5>(4,1,'integer',['unsigned','big']), + #<0>(64,1,'integer',['unsigned','big']), + #<6>(8,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<1345227255>(32,1,'integer',['unsigned','big']), + #<3191875583>(32,1,'integer',['unsigned','big']), + #<65535>(16,1,'integer',['unsigned','big']), + #<65535>(16,1,'integer',['unsigned','big']), + #<0>(56,1,'integer',['unsigned','big']), + #<4294967295>(32,1,'integer',['unsigned','big'])}# + in let <_cor192> = + #{#<4>(4,1,'integer',['unsigned','big']), + #<5>(4,1,'integer',['unsigned','big']), + #<0>(64,1,'integer',['unsigned','big']), + #<6>(8,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<1345227255>(32,1,'integer',['unsigned','big']), + #<3191875583>(32,1,'integer',['unsigned','big']), + #<65535>(16,1,'integer',['unsigned','big']), + #<65535>(16,1,'integer',['unsigned','big']), + #<0>(56,1,'integer',['unsigned','big']), + #<4294967295>(32,1,'integer',['unsigned','big'])}# + in let <_cor193> = + #{#<4>(4,1,'integer',['unsigned','big']), + #<5>(4,1,'integer',['unsigned','big']), + #<0>(64,1,'integer',['unsigned','big']), + #<6>(8,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<1345227255>(32,1,'integer',['unsigned','big']), + #<3191875583>(32,1,'integer',['unsigned','big']), + #<65535>(16,1,'integer',['unsigned','big']), + #<65535>(16,1,'integer',['unsigned','big']), + #<0>(56,1,'integer',['unsigned','big']), + #<4294967295>(32,1,'integer',['unsigned','big'])}# + in let <_cor194> = + #{#<4>(4,1,'integer',['unsigned','big']), + #<5>(4,1,'integer',['unsigned','big']), + #<0>(64,1,'integer',['unsigned','big']), + #<6>(8,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<1345227231>(32,1,'integer',['unsigned','big']), + #<2266514431>(32,1,'integer',['unsigned','big']), + #<65535>(16,1,'integer',['unsigned','big']), + #<1715>(16,1,'integer',['unsigned','big']), + #<0>(56,1,'integer',['unsigned','big']), + #<4294967295>(32,1,'integer',['unsigned','big'])}# + in let <_cor195> = + #{#<4>(4,1,'integer',['unsigned','big']), + #<5>(4,1,'integer',['unsigned','big']), + #<0>(64,1,'integer',['unsigned','big']), + #<6>(8,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<1345227227>(32,1,'integer',['unsigned','big']), + #<2154273893>(32,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<1521>(16,1,'integer',['unsigned','big']), + #<0>(56,1,'integer',['unsigned','big']), + #<0>(32,1,'integer',['unsigned','big'])}# + in let <_cor196> = + #{#<4>(4,1,'integer',['unsigned','big']), + #<5>(4,1,'integer',['unsigned','big']), + #<0>(64,1,'integer',['unsigned','big']), + #<6>(8,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<1345227196>(32,1,'integer',['unsigned','big']), + #<4244263771>(32,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<1490>(16,1,'integer',['unsigned','big']), + #<0>(56,1,'integer',['unsigned','big']), + #<0>(32,1,'integer',['unsigned','big'])}# + in let <_cor197> = + #{#<4>(4,1,'integer',['unsigned','big']), + #<5>(4,1,'integer',['unsigned','big']), + #<0>(64,1,'integer',['unsigned','big']), + #<6>(8,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<1345227153>(32,1,'integer',['unsigned','big']), + #<3240344271>(32,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<61800>(16,1,'integer',['unsigned','big']), + #<0>(56,1,'integer',['unsigned','big']), + #<0>(32,1,'integer',['unsigned','big'])}# + in let <_cor198> = + #{#<4>(4,1,'integer',['unsigned','big']), + #<5>(4,1,'integer',['unsigned','big']), + #<0>(64,1,'integer',['unsigned','big']), + #<6>(8,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<1345227775>(32,1,'integer',['unsigned','big']), + #<1345224704>(32,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<0>(56,1,'integer',['unsigned','big']), + #<4294967295>(32,1,'integer',['unsigned','big'])}# + in let <_cor199> = + #{#<4>(4,1,'integer',['unsigned','big']), + #<5>(4,1,'integer',['unsigned','big']), + #<0>(64,1,'integer',['unsigned','big']), + #<6>(8,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<1345227155>(32,1,'integer',['unsigned','big']), + #<3280067503>(32,1,'integer',['unsigned','big']), + #<65535>(16,1,'integer',['unsigned','big']), + #<1221>(16,1,'integer',['unsigned','big']), + #<0>(56,1,'integer',['unsigned','big']), + #<512>(32,1,'integer',['unsigned','big'])}# + in let <_cor200> = + #{#<4>(4,1,'integer',['unsigned','big']), + #<5>(4,1,'integer',['unsigned','big']), + #<0>(64,1,'integer',['unsigned','big']), + #<6>(8,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<1345227155>(32,1,'integer',['unsigned','big']), + #<3280067503>(32,1,'integer',['unsigned','big']), + #<65535>(16,1,'integer',['unsigned','big']), + #<1221>(16,1,'integer',['unsigned','big']), + #<0>(56,1,'integer',['unsigned','big']), + #<512>(32,1,'integer',['unsigned','big'])}# + in let <_cor201> = + #{#<4>(4,1,'integer',['unsigned','big']), + #<5>(4,1,'integer',['unsigned','big']), + #<0>(64,1,'integer',['unsigned','big']), + #<6>(8,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<1345227155>(32,1,'integer',['unsigned','big']), + #<3280067503>(32,1,'integer',['unsigned','big']), + #<65535>(16,1,'integer',['unsigned','big']), + #<1221>(16,1,'integer',['unsigned','big']), + #<0>(56,1,'integer',['unsigned','big']), + #<512>(32,1,'integer',['unsigned','big'])}# + in let <_cor202> = + #{#<4>(4,1,'integer',['unsigned','big']), + #<5>(4,1,'integer',['unsigned','big']), + #<0>(64,1,'integer',['unsigned','big']), + #<6>(8,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<1345227155>(32,1,'integer',['unsigned','big']), + #<3280067503>(32,1,'integer',['unsigned','big']), + #<65535>(16,1,'integer',['unsigned','big']), + #<1221>(16,1,'integer',['unsigned','big']), + #<0>(56,1,'integer',['unsigned','big']), + #<512>(32,1,'integer',['unsigned','big'])}# + in let <_cor203> = + #{#<4>(4,1,'integer',['unsigned','big']), + #<5>(4,1,'integer',['unsigned','big']), + #<0>(64,1,'integer',['unsigned','big']), + #<6>(8,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<1345227155>(32,1,'integer',['unsigned','big']), + #<3280067503>(32,1,'integer',['unsigned','big']), + #<65535>(16,1,'integer',['unsigned','big']), + #<1221>(16,1,'integer',['unsigned','big']), + #<0>(56,1,'integer',['unsigned','big']), + #<512>(32,1,'integer',['unsigned','big'])}# + in let <_cor204> = + #{#<4>(4,1,'integer',['unsigned','big']), + #<5>(4,1,'integer',['unsigned','big']), + #<0>(64,1,'integer',['unsigned','big']), + #<6>(8,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<1345227155>(32,1,'integer',['unsigned','big']), + #<3280067503>(32,1,'integer',['unsigned','big']), + #<65535>(16,1,'integer',['unsigned','big']), + #<1221>(16,1,'integer',['unsigned','big']), + #<0>(56,1,'integer',['unsigned','big']), + #<512>(32,1,'integer',['unsigned','big'])}# + in let <_cor205> = + #{#<4>(4,1,'integer',['unsigned','big']), + #<5>(4,1,'integer',['unsigned','big']), + #<0>(64,1,'integer',['unsigned','big']), + #<6>(8,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<1345227155>(32,1,'integer',['unsigned','big']), + #<3280067503>(32,1,'integer',['unsigned','big']), + #<65535>(16,1,'integer',['unsigned','big']), + #<1221>(16,1,'integer',['unsigned','big']), + #<0>(56,1,'integer',['unsigned','big']), + #<512>(32,1,'integer',['unsigned','big'])}# + in let <_cor206> = + #{#<4>(4,1,'integer',['unsigned','big']), + #<5>(4,1,'integer',['unsigned','big']), + #<0>(64,1,'integer',['unsigned','big']), + #<6>(8,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<1345227155>(32,1,'integer',['unsigned','big']), + #<3280067503>(32,1,'integer',['unsigned','big']), + #<65535>(16,1,'integer',['unsigned','big']), + #<1221>(16,1,'integer',['unsigned','big']), + #<0>(56,1,'integer',['unsigned','big']), + #<512>(32,1,'integer',['unsigned','big'])}# + in let <_cor207> = + #{#<4>(4,1,'integer',['unsigned','big']), + #<5>(4,1,'integer',['unsigned','big']), + #<0>(64,1,'integer',['unsigned','big']), + #<6>(8,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<1345227251>(32,1,'integer',['unsigned','big']), + #<770421281>(32,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<1717>(16,1,'integer',['unsigned','big']), + #<0>(56,1,'integer',['unsigned','big']), + #<0>(32,1,'integer',['unsigned','big'])}# + in let <_cor208> = + #{#<4>(4,1,'integer',['unsigned','big']), + #<5>(4,1,'integer',['unsigned','big']), + #<0>(64,1,'integer',['unsigned','big']), + #<6>(8,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<1345227231>(32,1,'integer',['unsigned','big']), + #<2266514431>(32,1,'integer',['unsigned','big']), + #<65535>(16,1,'integer',['unsigned','big']), + #<1715>(16,1,'integer',['unsigned','big']), + #<0>(56,1,'integer',['unsigned','big']), + #<0>(32,1,'integer',['unsigned','big'])}# + in let <_cor209> = + #{#<4>(4,1,'integer',['unsigned','big']), + #<5>(4,1,'integer',['unsigned','big']), + #<0>(64,1,'integer',['unsigned','big']), + #<6>(8,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<1345227212>(32,1,'integer',['unsigned','big']), + #<1345228029>(32,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<1715>(16,1,'integer',['unsigned','big']), + #<0>(56,1,'integer',['unsigned','big']), + #<512>(32,1,'integer',['unsigned','big'])}# + in let <_cor210> = + #{#<4>(4,1,'integer',['unsigned','big']), + #<5>(4,1,'integer',['unsigned','big']), + #<0>(64,1,'integer',['unsigned','big']), + #<6>(8,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<1345227212>(32,1,'integer',['unsigned','big']), + #<2348399657>(32,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<30210>(16,1,'integer',['unsigned','big']), + #<0>(56,1,'integer',['unsigned','big']), + #<0>(32,1,'integer',['unsigned','big'])}# + in let <_cor211> = + #{#<4>(4,1,'integer',['unsigned','big']), + #<5>(4,1,'integer',['unsigned','big']), + #<0>(64,1,'integer',['unsigned','big']), + #<6>(8,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<1345227192>(32,1,'integer',['unsigned','big']), + #<4235116544>(32,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<65535>(16,1,'integer',['unsigned','big']), + #<0>(56,1,'integer',['unsigned','big']), + #<4294967295>(32,1,'integer',['unsigned','big'])}# + in let <_cor212> = + #{#<4>(4,1,'integer',['unsigned','big']), + #<5>(4,1,'integer',['unsigned','big']), + #<0>(64,1,'integer',['unsigned','big']), + #<6>(8,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<1345227248>(32,1,'integer',['unsigned','big']), + #<3192223000>(32,1,'integer',['unsigned','big']), + #<65535>(16,1,'integer',['unsigned','big']), + #<1350>(16,1,'integer',['unsigned','big']), + #<0>(56,1,'integer',['unsigned','big']), + #<0>(32,1,'integer',['unsigned','big'])}# + in let <_cor213> = + #{#<4>(4,1,'integer',['unsigned','big']), + #<5>(4,1,'integer',['unsigned','big']), + #<0>(64,1,'integer',['unsigned','big']), + #<6>(8,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<1345227227>(32,1,'integer',['unsigned','big']), + #<2441875186>(32,1,'integer',['unsigned','big']), + #<65535>(16,1,'integer',['unsigned','big']), + #<1734>(16,1,'integer',['unsigned','big']), + #<0>(56,1,'integer',['unsigned','big']), + #<0>(32,1,'integer',['unsigned','big'])}# + in let <_cor214> = + #{#<4>(4,1,'integer',['unsigned','big']), + #<5>(4,1,'integer',['unsigned','big']), + #<0>(64,1,'integer',['unsigned','big']), + #<255>(8,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<1345226752>(32,1,'integer',['unsigned','big']), + #<3056017065>(32,1,'integer',['unsigned','big']), + #<65535>(16,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<0>(56,1,'integer',['unsigned','big']), + #<4294967295>(32,1,'integer',['unsigned','big'])}# + in let <_cor215> = + #{#<4>(4,1,'integer',['unsigned','big']), + #<5>(4,1,'integer',['unsigned','big']), + #<0>(64,1,'integer',['unsigned','big']), + #<6>(8,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<1345227227>(32,1,'integer',['unsigned','big']), + #<1036523944>(32,1,'integer',['unsigned','big']), + #<65535>(16,1,'integer',['unsigned','big']), + #<1525>(16,1,'integer',['unsigned','big']), + #<0>(56,1,'integer',['unsigned','big']), + #<0>(32,1,'integer',['unsigned','big'])}# + in let <_cor216> = + #{#<4>(4,1,'integer',['unsigned','big']), + #<5>(4,1,'integer',['unsigned','big']), + #<0>(64,1,'integer',['unsigned','big']), + #<6>(8,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<1345227227>(32,1,'integer',['unsigned','big']), + #<3240345599>(32,1,'integer',['unsigned','big']), + #<65535>(16,1,'integer',['unsigned','big']), + #<1724>(16,1,'integer',['unsigned','big']), + #<0>(56,1,'integer',['unsigned','big']), + #<4294967295>(32,1,'integer',['unsigned','big'])}# + in let <_cor217> = + #{#<4>(4,1,'integer',['unsigned','big']), + #<5>(4,1,'integer',['unsigned','big']), + #<0>(64,1,'integer',['unsigned','big']), + #<6>(8,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<1345227264>(32,1,'integer',['unsigned','big']), + #<3191877248>(32,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<1521>(16,1,'integer',['unsigned','big']), + #<0>(56,1,'integer',['unsigned','big']), + #<512>(32,1,'integer',['unsigned','big'])}# + in let <_cor218> = + #{#<4>(4,1,'integer',['unsigned','big']), + #<5>(4,1,'integer',['unsigned','big']), + #<0>(64,1,'integer',['unsigned','big']), + #<6>(8,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<1345227206>(32,1,'integer',['unsigned','big']), + #<3041502561>(32,1,'integer',['unsigned','big']), + #<65535>(16,1,'integer',['unsigned','big']), + #<5555>(16,1,'integer',['unsigned','big']), + #<0>(56,1,'integer',['unsigned','big']), + #<0>(32,1,'integer',['unsigned','big'])}# + in let <_cor219> = + #{#<4>(4,1,'integer',['unsigned','big']), + #<5>(4,1,'integer',['unsigned','big']), + #<0>(64,1,'integer',['unsigned','big']), + #<6>(8,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<1345227246>(32,1,'integer',['unsigned','big']), + #<3117736694>(32,1,'integer',['unsigned','big']), + #<65535>(16,1,'integer',['unsigned','big']), + #<1221>(16,1,'integer',['unsigned','big']), + #<0>(56,1,'integer',['unsigned','big']), + #<4294967295>(32,1,'integer',['unsigned','big'])}# + in let <_cor220> = + #{#<4>(4,1,'integer',['unsigned','big']), + #<5>(4,1,'integer',['unsigned','big']), + #<0>(64,1,'integer',['unsigned','big']), + #<6>(8,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<1345227236>(32,1,'integer',['unsigned','big']), + #<3169686634>(32,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<61119>(16,1,'integer',['unsigned','big']), + #<0>(56,1,'integer',['unsigned','big']), + #<4294967295>(32,1,'integer',['unsigned','big'])}# + in let <_cor221> = + #{#<4>(4,1,'integer',['unsigned','big']), + #<5>(4,1,'integer',['unsigned','big']), + #<0>(64,1,'integer',['unsigned','big']), + #<6>(8,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<1345227236>(32,1,'integer',['unsigned','big']), + #<3169686634>(32,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<61119>(16,1,'integer',['unsigned','big']), + #<0>(56,1,'integer',['unsigned','big']), + #<4294967295>(32,1,'integer',['unsigned','big'])}# + in let <_cor222> = + #{#<4>(4,1,'integer',['unsigned','big']), + #<5>(4,1,'integer',['unsigned','big']), + #<0>(64,1,'integer',['unsigned','big']), + #<6>(8,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<1345227236>(32,1,'integer',['unsigned','big']), + #<3180215030>(32,1,'integer',['unsigned','big']), + #<65535>(16,1,'integer',['unsigned','big']), + #<5540>(16,1,'integer',['unsigned','big']), + #<0>(56,1,'integer',['unsigned','big']), + #<4294967295>(32,1,'integer',['unsigned','big'])}# + in let <_cor223> = + #{#<4>(4,1,'integer',['unsigned','big']), + #<5>(4,1,'integer',['unsigned','big']), + #<0>(64,1,'integer',['unsigned','big']), + #<6>(8,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<1345227226>(32,1,'integer',['unsigned','big']), + #<2154273893>(32,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<1521>(16,1,'integer',['unsigned','big']), + #<0>(56,1,'integer',['unsigned','big']), + #<0>(32,1,'integer',['unsigned','big'])}# + in let <_cor224> = + #{#<4>(4,1,'integer',['unsigned','big']), + #<5>(4,1,'integer',['unsigned','big']), + #<0>(64,1,'integer',['unsigned','big']), + #<6>(8,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<1345227226>(32,1,'integer',['unsigned','big']), + #<2154273893>(32,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<1521>(16,1,'integer',['unsigned','big']), + #<0>(56,1,'integer',['unsigned','big']), + #<0>(32,1,'integer',['unsigned','big'])}# + in let <_cor225> = + #{#<4>(4,1,'integer',['unsigned','big']), + #<5>(4,1,'integer',['unsigned','big']), + #<0>(64,1,'integer',['unsigned','big']), + #<6>(8,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<1345227250>(32,1,'integer',['unsigned','big']), + #<3192296352>(32,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<65535>(16,1,'integer',['unsigned','big']), + #<0>(56,1,'integer',['unsigned','big']), + #<0>(32,1,'integer',['unsigned','big'])}# + in let <_cor226> = + #{#<4>(4,1,'integer',['unsigned','big']), + #<5>(4,1,'integer',['unsigned','big']), + #<0>(64,1,'integer',['unsigned','big']), + #<6>(8,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<1345227248>(32,1,'integer',['unsigned','big']), + #<3192223003>(32,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<1704>(16,1,'integer',['unsigned','big']), + #<0>(56,1,'integer',['unsigned','big']), + #<512>(32,1,'integer',['unsigned','big'])}# + in let <_cor227> = + #{#<4>(4,1,'integer',['unsigned','big']), + #<5>(4,1,'integer',['unsigned','big']), + #<0>(64,1,'integer',['unsigned','big']), + #<6>(8,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<1345227248>(32,1,'integer',['unsigned','big']), + #<3192223003>(32,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<1704>(16,1,'integer',['unsigned','big']), + #<0>(56,1,'integer',['unsigned','big']), + #<512>(32,1,'integer',['unsigned','big'])}# + in let <_cor228> = + #{#<4>(4,1,'integer',['unsigned','big']), + #<5>(4,1,'integer',['unsigned','big']), + #<0>(64,1,'integer',['unsigned','big']), + #<6>(8,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<1345227197>(32,1,'integer',['unsigned','big']), + #<4235087556>(32,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<65535>(16,1,'integer',['unsigned','big']), + #<0>(56,1,'integer',['unsigned','big']), + #<4294967295>(32,1,'integer',['unsigned','big'])}# + in let <_cor229> = + #{#<4>(4,1,'integer',['unsigned','big']), + #<5>(4,1,'integer',['unsigned','big']), + #<0>(64,1,'integer',['unsigned','big']), + #<6>(8,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<1345227248>(32,1,'integer',['unsigned','big']), + #<3192296356>(32,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<1706>(16,1,'integer',['unsigned','big']), + #<0>(56,1,'integer',['unsigned','big']), + #<0>(32,1,'integer',['unsigned','big'])}# + in let <_cor230> = + #{#<4>(4,1,'integer',['unsigned','big']), + #<5>(4,1,'integer',['unsigned','big']), + #<0>(64,1,'integer',['unsigned','big']), + #<6>(8,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<1345226752>(32,1,'integer',['unsigned','big']), + #<3056017066>(32,1,'integer',['unsigned','big']), + #<65535>(16,1,'integer',['unsigned','big']), + #<15126>(16,1,'integer',['unsigned','big']), + #<0>(56,1,'integer',['unsigned','big']), + #<4294967295>(32,1,'integer',['unsigned','big'])}# + in let <_cor231> = + #{#<4>(4,1,'integer',['unsigned','big']), + #<5>(4,1,'integer',['unsigned','big']), + #<0>(64,1,'integer',['unsigned','big']), + #<6>(8,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<1345226752>(32,1,'integer',['unsigned','big']), + #<3056017066>(32,1,'integer',['unsigned','big']), + #<65535>(16,1,'integer',['unsigned','big']), + #<15126>(16,1,'integer',['unsigned','big']), + #<0>(56,1,'integer',['unsigned','big']), + #<4294967295>(32,1,'integer',['unsigned','big'])}# + in let <_cor232> = + #{#<4>(4,1,'integer',['unsigned','big']), + #<5>(4,1,'integer',['unsigned','big']), + #<0>(64,1,'integer',['unsigned','big']), + #<6>(8,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<1345226752>(32,1,'integer',['unsigned','big']), + #<3056017066>(32,1,'integer',['unsigned','big']), + #<65535>(16,1,'integer',['unsigned','big']), + #<15126>(16,1,'integer',['unsigned','big']), + #<0>(56,1,'integer',['unsigned','big']), + #<4294967295>(32,1,'integer',['unsigned','big'])}# + in let <_cor233> = + #{#<4>(4,1,'integer',['unsigned','big']), + #<5>(4,1,'integer',['unsigned','big']), + #<0>(64,1,'integer',['unsigned','big']), + #<6>(8,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<1345226752>(32,1,'integer',['unsigned','big']), + #<3056017066>(32,1,'integer',['unsigned','big']), + #<65535>(16,1,'integer',['unsigned','big']), + #<15126>(16,1,'integer',['unsigned','big']), + #<0>(56,1,'integer',['unsigned','big']), + #<4294967295>(32,1,'integer',['unsigned','big'])}# + in let <_cor234> = + #{#<4>(4,1,'integer',['unsigned','big']), + #<5>(4,1,'integer',['unsigned','big']), + #<0>(64,1,'integer',['unsigned','big']), + #<6>(8,1,'integer',['unsigned','big']), + #<0>(16,1,'integer',['unsigned','big']), + #<1345226752>(32,1,'integer',['unsigned','big']), +