From evan.cheng at apple.com Mon Dec 19 01:19:03 2005 From: evan.cheng at apple.com (Evan Cheng) Date: Mon, 19 Dec 2005 01:19:03 -0600 Subject: [llvm-commits] CVS: llvm/utils/TableGen/DAGISelEmitter.cpp Message-ID: <200512190719.BAA29903@zion.cs.uiuc.edu> Changes in directory llvm/utils/TableGen: DAGISelEmitter.cpp updated: 1.103 -> 1.104 --- Log message: Fixes for a number of bugs: save flag results in CodeGenMap, folded chains may not all have ResNo == 0. --- Diffs of the changes: (+33 -23) DAGISelEmitter.cpp | 56 +++++++++++++++++++++++++++++++---------------------- 1 files changed, 33 insertions(+), 23 deletions(-) Index: llvm/utils/TableGen/DAGISelEmitter.cpp diff -u llvm/utils/TableGen/DAGISelEmitter.cpp:1.103 llvm/utils/TableGen/DAGISelEmitter.cpp:1.104 --- llvm/utils/TableGen/DAGISelEmitter.cpp:1.103 Sun Dec 18 15:05:44 2005 +++ llvm/utils/TableGen/DAGISelEmitter.cpp Mon Dec 19 01:18:51 2005 @@ -1761,7 +1761,7 @@ // Node to name mapping std::map VariableMap; // Names of all the folded nodes which produce chains. - std::vector FoldedChains; + std::vector > FoldedChains; bool FoundChain; bool InFlag; unsigned TmpNo; @@ -1856,8 +1856,10 @@ OS << " if (" << RootName << OpNo << ".getOpcode() != " << CInfo.getEnumName() << ") goto P" << PatternNo << "Fail;\n"; EmitMatchCode(Child, RootName + utostr(OpNo)); - if (NodeHasChain(Child, ISE)) - FoldedChains.push_back(RootName + utostr(OpNo)); + if (NodeHasChain(Child, ISE)) { + FoldedChains.push_back(std::make_pair(RootName + utostr(OpNo), + CInfo.getNumResults())); + } } else { // If this child has a name associated with it, capture it in VarMap. If // we already saw this in the pattern, emit code to verify dagness. @@ -2078,41 +2080,49 @@ OS << " Chain = Tmp" << LastOp << ".getValue(" << NumResults << ");\n"; } - } else if (II.hasCtrlDep) { - OS << " SDOperand Result = "; - OS << "CurDAG->getTargetNode(" + } else if (II.hasCtrlDep || NumImpResults > 0) { + OS << " SDOperand Result = CurDAG->getTargetNode(" << II.Namespace << "::" << II.TheDef->getName(); + + // Output order: results, chain, flags + // Result types. if (NumResults > 0) { // TODO: multiple results? if (N->getType() != MVT::isVoid) OS << ", MVT::" << getEnumName(N->getType()); } - OS << ", MVT::Other"; + if (II.hasCtrlDep) + OS << ", MVT::Other"; for (unsigned i = 0; i < NumImpResults; i++) { Record *ImpResult = Inst.getImpResult(i); MVT::ValueType RVT = getRegisterValueType(ImpResult, CGT); OS << ", MVT::" << getEnumName(RVT); } + + // Inputs. for (unsigned i = 0, e = Ops.size(); i != e; ++i) OS << ", Tmp" << Ops[i]; - OS << ", Chain"; - if (InFlag) - OS << ", InFlag"; + if (II.hasCtrlDep) OS << ", Chain"; + if (InFlag) OS << ", InFlag"; OS << ");\n"; - if (NumResults != 0) { - OS << " CodeGenMap[N.getValue(0)] = Result;\n"; + + unsigned ValNo = 0; + for (unsigned i = 0; i < NumResults; i++) + OS << " CodeGenMap[N.getValue(" << ValNo++ << ")] = Result;\n"; + if (II.hasCtrlDep) { + OS << " Chain "; + if (NodeHasChain(Pattern, ISE)) + OS << "= CodeGenMap[N.getValue(" << ValNo << ")] "; + for (unsigned j = 0, e = FoldedChains.size(); j < e; j++) + OS << "= CodeGenMap[" << FoldedChains[j].first << ".getValue(" + << FoldedChains[j].second << ")] "; + OS << "= Result.getValue(" << ValNo++ << ");\n"; + } + for (unsigned i = 0; i < NumImpResults; i++) { + OS << " CodeGenMap[N.getValue(" << ValNo << ")] = Result"; + OS << ".getValue(" << ValNo++ << ");\n"; } - OS << " Chain "; - if (NodeHasChain(Pattern, ISE)) - OS << "= CodeGenMap[N.getValue(" << NumResults << ")] "; - for (unsigned j = 0, e = FoldedChains.size(); j < e; j++) - OS << "= CodeGenMap[" << FoldedChains[j] << ".getValue(" - << NumResults << ")] "; - OS << "= Result.getValue(" << NumResults << ");\n"; - if (NumResults == 0 && NumImpResults == 0) - OS << " return Chain;\n"; - else - OS << " return (N.ResNo) ? Chain : Result.getValue(0);\n"; + OS << " return Result.getValue(N.ResNo);\n"; } else { // If this instruction is the root, and if there is only one use of it, // use SelectNodeTo instead of getTargetNode to avoid an allocation. From jlaskey at apple.com Mon Dec 19 10:30:24 2005 From: jlaskey at apple.com (Jim Laskey) Date: Mon, 19 Dec 2005 10:30:24 -0600 Subject: [llvm-commits] CVS: llvm/lib/CodeGen/SelectionDAG/ScheduleDAG.cpp Message-ID: <200512191630.KAA07769@zion.cs.uiuc.edu> Changes in directory llvm/lib/CodeGen/SelectionDAG: ScheduleDAG.cpp updated: 1.51 -> 1.52 --- Log message: Create a strong dependency for loads following stores. This will leave a latency period between the two. --- Diffs of the changes: (+6 -2) ScheduleDAG.cpp | 8 ++++++-- 1 files changed, 6 insertions(+), 2 deletions(-) Index: llvm/lib/CodeGen/SelectionDAG/ScheduleDAG.cpp diff -u llvm/lib/CodeGen/SelectionDAG/ScheduleDAG.cpp:1.51 llvm/lib/CodeGen/SelectionDAG/ScheduleDAG.cpp:1.52 --- llvm/lib/CodeGen/SelectionDAG/ScheduleDAG.cpp:1.51 Sun Dec 18 16:20:05 2005 +++ llvm/lib/CodeGen/SelectionDAG/ScheduleDAG.cpp Mon Dec 19 10:30:13 2005 @@ -281,7 +281,9 @@ InstrStage *StageBegin; // First stage in itinerary InstrStage *StageEnd; // Last+1 stage in itinerary unsigned Latency; // Total cycles to complete instruction - bool IsCall; // Is function call + bool IsCall : 1; // Is function call + bool IsLoad : 1; // Is memory load + bool IsStore : 1; // Is memory store unsigned Slot; // Node's time slot NodeGroup *Group; // Grouping information unsigned VRBase; // Virtual register base @@ -756,6 +758,8 @@ // Get machine opcode MachineOpCode TOpc = Node->getTargetOpcode(); NI->IsCall = TII.isCall(TOpc); + NI->IsLoad = TII.isLoad(TOpc); + NI->IsStore = TII.isStore(TOpc); if (TII.isLoad(TOpc)) NI->StageBegin = &LoadStage; else if (TII.isStore(TOpc)) NI->StageBegin = &StoreStage; @@ -857,7 +861,7 @@ /// I.E., B must wait for latency of A. bool SimpleSched::isStrongDependency(NodeInfo *A, NodeInfo *B) { // If A defines for B then it's a strong dependency - return isDefiner(A, B); + return isDefiner(A, B) || (A->IsStore && B->IsLoad); } /// isWeakDependency Return true if node A produces a result that will From jlaskey at apple.com Mon Dec 19 10:32:37 2005 From: jlaskey at apple.com (Jim Laskey) Date: Mon, 19 Dec 2005 10:32:37 -0600 Subject: [llvm-commits] CVS: llvm/lib/CodeGen/SelectionDAG/ScheduleDAG.cpp Message-ID: <200512191632.KAA07790@zion.cs.uiuc.edu> Changes in directory llvm/lib/CodeGen/SelectionDAG: ScheduleDAG.cpp updated: 1.52 -> 1.53 --- Log message: Amend comment. --- Diffs of the changes: (+2 -1) ScheduleDAG.cpp | 3 ++- 1 files changed, 2 insertions(+), 1 deletion(-) Index: llvm/lib/CodeGen/SelectionDAG/ScheduleDAG.cpp diff -u llvm/lib/CodeGen/SelectionDAG/ScheduleDAG.cpp:1.52 llvm/lib/CodeGen/SelectionDAG/ScheduleDAG.cpp:1.53 --- llvm/lib/CodeGen/SelectionDAG/ScheduleDAG.cpp:1.52 Mon Dec 19 10:30:13 2005 +++ llvm/lib/CodeGen/SelectionDAG/ScheduleDAG.cpp Mon Dec 19 10:32:26 2005 @@ -860,7 +860,8 @@ /// isStrongDependency - Return true if node A has results used by node B. /// I.E., B must wait for latency of A. bool SimpleSched::isStrongDependency(NodeInfo *A, NodeInfo *B) { - // If A defines for B then it's a strong dependency + // If A defines for B then it's a strong dependency or + // if a load follows a store (may be dependent but why take a chance.) return isDefiner(A, B) || (A->IsStore && B->IsLoad); } From criswell at cs.uiuc.edu Mon Dec 19 11:39:00 2005 From: criswell at cs.uiuc.edu (John Criswell) Date: Mon, 19 Dec 2005 11:39:00 -0600 Subject: [llvm-commits] CVS: llvm/lib/Analysis/DataStructure/Local.cpp Message-ID: <200512191739.LAA09069@choi.cs.uiuc.edu> Changes in directory llvm/lib/Analysis/DataStructure: Local.cpp updated: 1.135 -> 1.136 --- Log message: Added a command line option that allows the user to specify a list of functions that allocate memory. --- Diffs of the changes: (+19 -0) Local.cpp | 19 +++++++++++++++++++ 1 files changed, 19 insertions(+) Index: llvm/lib/Analysis/DataStructure/Local.cpp diff -u llvm/lib/Analysis/DataStructure/Local.cpp:1.135 llvm/lib/Analysis/DataStructure/Local.cpp:1.136 --- llvm/lib/Analysis/DataStructure/Local.cpp:1.135 Tue Dec 6 12:04:30 2005 +++ llvm/lib/Analysis/DataStructure/Local.cpp Mon Dec 19 11:38:39 2005 @@ -39,6 +39,12 @@ TrackIntegersAsPointers("dsa-track-integers", cl::Hidden, cl::desc("If this is set, track integers as potential pointers")); +static cl::list +AllocList("alloc-list", + cl::value_desc("list"), + cl::desc("List of functions that allocate memory from the heap"), + cl::CommaSeparated); + namespace llvm { namespace DS { // isPointerType - Return true if this type is big enough to hold a pointer. @@ -548,6 +554,19 @@ N->setModifiedMarker(); return; default: + // Determine if the called function is one of the specified heap + // allocation functions + for (cl::list::iterator AllocFunc = AllocList.begin(), + LastAllocFunc = AllocList.end(); + AllocFunc != LastAllocFunc; + ++AllocFunc) { + if (F->getName() == *(AllocFunc)) { + setDestTo(*CS.getInstruction(), + createNode()->setHeapNodeMarker()->setModifiedMarker()); + return; + } + } + if (F->getName() == "calloc" || F->getName() == "posix_memalign" || F->getName() == "memalign" || F->getName() == "valloc") { setDestTo(*CS.getInstruction(), From criswell at cs.uiuc.edu Mon Dec 19 13:54:44 2005 From: criswell at cs.uiuc.edu (John Criswell) Date: Mon, 19 Dec 2005 13:54:44 -0600 Subject: [llvm-commits] CVS: llvm/lib/Analysis/DataStructure/Local.cpp Message-ID: <200512191954.NAA18133@choi.cs.uiuc.edu> Changes in directory llvm/lib/Analysis/DataStructure: Local.cpp updated: 1.136 -> 1.137 --- Log message: Added an option to specify the names of heap freeing functions. --- Diffs of the changes: (+20 -0) Local.cpp | 20 ++++++++++++++++++++ 1 files changed, 20 insertions(+) Index: llvm/lib/Analysis/DataStructure/Local.cpp diff -u llvm/lib/Analysis/DataStructure/Local.cpp:1.136 llvm/lib/Analysis/DataStructure/Local.cpp:1.137 --- llvm/lib/Analysis/DataStructure/Local.cpp:1.136 Mon Dec 19 11:38:39 2005 +++ llvm/lib/Analysis/DataStructure/Local.cpp Mon Dec 19 13:54:23 2005 @@ -45,6 +45,12 @@ cl::desc("List of functions that allocate memory from the heap"), cl::CommaSeparated); +static cl::list +FreeList("free-list", + cl::value_desc("list"), + cl::desc("List of functions that free memory from the heap"), + cl::CommaSeparated); + namespace llvm { namespace DS { // isPointerType - Return true if this type is big enough to hold a pointer. @@ -567,6 +573,20 @@ } } + // Determine if the called function is one of the specified heap + // free functions + for (cl::list::iterator FreeFunc = FreeList.begin(), + LastFreeFunc = FreeList.end(); + FreeFunc != LastFreeFunc; + ++FreeFunc) { + if (F->getName() == *(FreeFunc)) { + // Mark that the node is written to... + if (DSNode *N = getValueDest(*(CS.getArgument(0))).getNode()) + N->setModifiedMarker()->setHeapNodeMarker(); + return; + } + } + if (F->getName() == "calloc" || F->getName() == "posix_memalign" || F->getName() == "memalign" || F->getName() == "valloc") { setDestTo(*CS.getInstruction(), From criswell at cs.uiuc.edu Mon Dec 19 14:14:58 2005 From: criswell at cs.uiuc.edu (John Criswell) Date: Mon, 19 Dec 2005 14:14:58 -0600 Subject: [llvm-commits] CVS: llvm/lib/Analysis/DataStructure/Local.cpp Message-ID: <200512192014.OAA19510@choi.cs.uiuc.edu> Changes in directory llvm/lib/Analysis/DataStructure: Local.cpp updated: 1.137 -> 1.138 --- Log message: Prefix DSA specific options with dsa. Make the dsa-alloc-list and dsa-free-list options hidden. --- Diffs of the changes: (+4 -4) Local.cpp | 8 ++++---- 1 files changed, 4 insertions(+), 4 deletions(-) Index: llvm/lib/Analysis/DataStructure/Local.cpp diff -u llvm/lib/Analysis/DataStructure/Local.cpp:1.137 llvm/lib/Analysis/DataStructure/Local.cpp:1.138 --- llvm/lib/Analysis/DataStructure/Local.cpp:1.137 Mon Dec 19 13:54:23 2005 +++ llvm/lib/Analysis/DataStructure/Local.cpp Mon Dec 19 14:14:38 2005 @@ -40,16 +40,16 @@ cl::desc("If this is set, track integers as potential pointers")); static cl::list -AllocList("alloc-list", +AllocList("dsa-alloc-list", cl::value_desc("list"), cl::desc("List of functions that allocate memory from the heap"), - cl::CommaSeparated); + cl::CommaSeparated, cl::Hidden); static cl::list -FreeList("free-list", +FreeList("dsa-free-list", cl::value_desc("list"), cl::desc("List of functions that free memory from the heap"), - cl::CommaSeparated); + cl::CommaSeparated, cl::Hidden); namespace llvm { namespace DS { From criswell at cs.uiuc.edu Mon Dec 19 14:27:43 2005 From: criswell at cs.uiuc.edu (John Criswell) Date: Mon, 19 Dec 2005 14:27:43 -0600 Subject: [llvm-commits] CVS: llvm/autoconf/configure.ac Message-ID: <200512192027.OAA19815@choi.cs.uiuc.edu> Changes in directory llvm/autoconf: configure.ac updated: 1.200 -> 1.201 --- Log message: Added the llvm-kernel project to the list of automatically configured projects. --- Diffs of the changes: (+1 -0) configure.ac | 1 + 1 files changed, 1 insertion(+) Index: llvm/autoconf/configure.ac diff -u llvm/autoconf/configure.ac:1.200 llvm/autoconf/configure.ac:1.201 --- llvm/autoconf/configure.ac:1.200 Mon Nov 14 01:24:01 2005 +++ llvm/autoconf/configure.ac Mon Dec 19 14:27:24 2005 @@ -75,6 +75,7 @@ "llvm-java") AC_CONFIG_SUBDIRS([projects/llvm-java]) ;; "llvm-tv") AC_CONFIG_SUBDIRS([projects/llvm-tv]) ;; "llvm-poolalloc") AC_CONFIG_SUBDIRS([projects/llvm-poolalloc]) ;; + "llvm-kernel") AC_CONFIG_SUBDIRS([projects/llvm-kernel]) ;; *) AC_MSG_WARN([Unknown project (${i}) won't be configured automatically]) ;; From criswell at cs.uiuc.edu Mon Dec 19 14:27:43 2005 From: criswell at cs.uiuc.edu (John Criswell) Date: Mon, 19 Dec 2005 14:27:43 -0600 Subject: [llvm-commits] CVS: llvm/configure Message-ID: <200512192027.OAA19814@choi.cs.uiuc.edu> Changes in directory llvm: configure updated: 1.203 -> 1.204 --- Log message: Added the llvm-kernel project to the list of automatically configured projects. --- Diffs of the changes: (+34 -29) configure | 63 +++++++++++++++++++++++++++++++++----------------------------- 1 files changed, 34 insertions(+), 29 deletions(-) Index: llvm/configure diff -u llvm/configure:1.203 llvm/configure:1.204 --- llvm/configure:1.203 Mon Nov 14 01:25:50 2005 +++ llvm/configure Mon Dec 19 14:27:22 2005 @@ -438,6 +438,7 @@ ac_subdirs_all="$ac_subdirs_all projects/llvm-java" ac_subdirs_all="$ac_subdirs_all projects/llvm-tv" ac_subdirs_all="$ac_subdirs_all projects/llvm-poolalloc" +ac_subdirs_all="$ac_subdirs_all projects/llvm-kernel" # Factoring default headers for most tests. ac_includes_default="\ #include @@ -1605,6 +1606,10 @@ subdirs="$subdirs projects/llvm-poolalloc" ;; + "llvm-kernel") + +subdirs="$subdirs projects/llvm-kernel" + ;; *) { echo "$as_me:$LINENO: WARNING: Unknown project (${i}) won't be configured automatically" >&5 echo "$as_me: WARNING: Unknown project (${i}) won't be configured automatically" >&2;} @@ -8356,7 +8361,7 @@ lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext < conftest.$ac_ext + echo '#line 10355 "configure"' > conftest.$ac_ext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? @@ -10832,7 +10837,7 @@ # Provide some information about the compiler. -echo "$as_me:10835:" \ +echo "$as_me:10840:" \ "checking for Fortran 77 compiler version" >&5 ac_compiler=`set X $ac_compile; echo $2` { (eval echo "$as_me:$LINENO: \"$ac_compiler --version &5\"") >&5 @@ -11889,11 +11894,11 @@ -e 's:.*FLAGS}? :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:11892: $lt_compile\"" >&5) + (eval echo "\"\$as_me:11897: $lt_compile\"" >&5) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&5 - echo "$as_me:11896: \$? = $ac_status" >&5 + echo "$as_me:11901: \$? = $ac_status" >&5 if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings @@ -12132,11 +12137,11 @@ -e 's:.*FLAGS}? :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:12135: $lt_compile\"" >&5) + (eval echo "\"\$as_me:12140: $lt_compile\"" >&5) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&5 - echo "$as_me:12139: \$? = $ac_status" >&5 + echo "$as_me:12144: \$? = $ac_status" >&5 if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings @@ -12192,11 +12197,11 @@ -e 's:.*FLAGS}? :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:12195: $lt_compile\"" >&5) + (eval echo "\"\$as_me:12200: $lt_compile\"" >&5) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&5 - echo "$as_me:12199: \$? = $ac_status" >&5 + echo "$as_me:12204: \$? = $ac_status" >&5 if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized @@ -14377,7 +14382,7 @@ lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext < conftest.$ac_ext <&5) + (eval echo "\"\$as_me:16676: $lt_compile\"" >&5) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&5 - echo "$as_me:16675: \$? = $ac_status" >&5 + echo "$as_me:16680: \$? = $ac_status" >&5 if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings @@ -16728,11 +16733,11 @@ -e 's:.*FLAGS}? :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:16731: $lt_compile\"" >&5) + (eval echo "\"\$as_me:16736: $lt_compile\"" >&5) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&5 - echo "$as_me:16735: \$? = $ac_status" >&5 + echo "$as_me:16740: \$? = $ac_status" >&5 if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized @@ -18089,7 +18094,7 @@ lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext < conftest.$ac_ext <&5) + (eval echo "\"\$as_me:19032: $lt_compile\"" >&5) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&5 - echo "$as_me:19031: \$? = $ac_status" >&5 + echo "$as_me:19036: \$? = $ac_status" >&5 if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings @@ -19084,11 +19089,11 @@ -e 's:.*FLAGS}? :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:19087: $lt_compile\"" >&5) + (eval echo "\"\$as_me:19092: $lt_compile\"" >&5) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&5 - echo "$as_me:19091: \$? = $ac_status" >&5 + echo "$as_me:19096: \$? = $ac_status" >&5 if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized @@ -21123,11 +21128,11 @@ -e 's:.*FLAGS}? :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:21126: $lt_compile\"" >&5) + (eval echo "\"\$as_me:21131: $lt_compile\"" >&5) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&5 - echo "$as_me:21130: \$? = $ac_status" >&5 + echo "$as_me:21135: \$? = $ac_status" >&5 if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings @@ -21366,11 +21371,11 @@ -e 's:.*FLAGS}? :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:21369: $lt_compile\"" >&5) + (eval echo "\"\$as_me:21374: $lt_compile\"" >&5) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&5 - echo "$as_me:21373: \$? = $ac_status" >&5 + echo "$as_me:21378: \$? = $ac_status" >&5 if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings @@ -21426,11 +21431,11 @@ -e 's:.*FLAGS}? :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:21429: $lt_compile\"" >&5) + (eval echo "\"\$as_me:21434: $lt_compile\"" >&5) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&5 - echo "$as_me:21433: \$? = $ac_status" >&5 + echo "$as_me:21438: \$? = $ac_status" >&5 if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized @@ -23611,7 +23616,7 @@ lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext < conftest.$ac_ext < Changes in directory llvm/lib/CodeGen/SelectionDAG: SelectionDAG.cpp updated: 1.225 -> 1.226 --- Log message: Fix a case where the DAG Combiner would accidentally CSE flag-producing nodes, creating graphs that cannot be scheduled. --- Diffs of the changes: (+6 -1) SelectionDAG.cpp | 7 ++++++- 1 files changed, 6 insertions(+), 1 deletion(-) Index: llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp diff -u llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp:1.225 llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp:1.226 --- llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp:1.225 Fri Dec 16 16:45:28 2005 +++ llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp Mon Dec 19 16:21:21 2005 @@ -389,9 +389,14 @@ assert(N->getNumOperands() && "This is a leaf node!"); if (N->getOpcode() == ISD::CALLSEQ_START || N->getOpcode() == ISD::CALLSEQ_END || - N->getOpcode() == ISD::HANDLENODE) + N->getOpcode() == ISD::HANDLENODE || N->getValueType(0) == MVT::Flag) return 0; // Never add these nodes. + // Check that remaining values produced are not flags. + for (unsigned i = 1, e = N->getNumValues(); i != e; ++i) + if (N->getValueType(i) == MVT::Flag) + return 0; // Never CSE anything that produces a flag. + if (N->getNumValues() == 1) { if (N->getNumOperands() == 1) { SDNode *&U = UnaryOps[std::make_pair(N->getOpcode(), From evan.cheng at apple.com Mon Dec 19 16:36:14 2005 From: evan.cheng at apple.com (Evan Cheng) Date: Mon, 19 Dec 2005 16:36:14 -0600 Subject: [llvm-commits] CVS: llvm/lib/Target/X86/X86ISelDAGToDAG.cpp Message-ID: <200512192236.QAA09419@zion.cs.uiuc.edu> Changes in directory llvm/lib/Target/X86: X86ISelDAGToDAG.cpp updated: 1.15 -> 1.16 --- Log message: It's essential we clear CodeGenMap after isel every basic block! --- Diffs of the changes: (+1 -0) X86ISelDAGToDAG.cpp | 1 + 1 files changed, 1 insertion(+) Index: llvm/lib/Target/X86/X86ISelDAGToDAG.cpp diff -u llvm/lib/Target/X86/X86ISelDAGToDAG.cpp:1.15 llvm/lib/Target/X86/X86ISelDAGToDAG.cpp:1.16 --- llvm/lib/Target/X86/X86ISelDAGToDAG.cpp:1.15 Sat Dec 17 03:13:43 2005 +++ llvm/lib/Target/X86/X86ISelDAGToDAG.cpp Mon Dec 19 16:36:02 2005 @@ -139,6 +139,7 @@ // Codegen the basic block. DAG.setRoot(Select(DAG.getRoot())); + CodeGenMap.clear(); DAG.RemoveDeadNodes(); // Emit machine code to BB. From evan.cheng at apple.com Mon Dec 19 16:40:15 2005 From: evan.cheng at apple.com (Evan Cheng) Date: Mon, 19 Dec 2005 16:40:15 -0600 Subject: [llvm-commits] CVS: llvm/utils/TableGen/DAGISelEmitter.cpp Message-ID: <200512192240.QAA09469@zion.cs.uiuc.edu> Changes in directory llvm/utils/TableGen: DAGISelEmitter.cpp updated: 1.104 -> 1.105 --- Log message: Fix another bug related to chain / flag. --- Diffs of the changes: (+20 -8) DAGISelEmitter.cpp | 28 ++++++++++++++++++++-------- 1 files changed, 20 insertions(+), 8 deletions(-) Index: llvm/utils/TableGen/DAGISelEmitter.cpp diff -u llvm/utils/TableGen/DAGISelEmitter.cpp:1.104 llvm/utils/TableGen/DAGISelEmitter.cpp:1.105 --- llvm/utils/TableGen/DAGISelEmitter.cpp:1.104 Mon Dec 19 01:18:51 2005 +++ llvm/utils/TableGen/DAGISelEmitter.cpp Mon Dec 19 16:40:04 2005 @@ -2107,21 +2107,33 @@ OS << ");\n"; unsigned ValNo = 0; - for (unsigned i = 0; i < NumResults; i++) - OS << " CodeGenMap[N.getValue(" << ValNo++ << ")] = Result;\n"; + for (unsigned i = 0; i < NumResults; i++) { + OS << " CodeGenMap[N.getValue(" << ValNo << ")] = Result" + << ".getValue(" << ValNo << ");\n"; + ValNo++; + } + if (II.hasCtrlDep) { OS << " Chain "; if (NodeHasChain(Pattern, ISE)) - OS << "= CodeGenMap[N.getValue(" << ValNo << ")] "; + OS << "= CodeGenMap[N.getValue(" << ValNo + NumImpResults << ")] "; for (unsigned j = 0, e = FoldedChains.size(); j < e; j++) OS << "= CodeGenMap[" << FoldedChains[j].first << ".getValue(" << FoldedChains[j].second << ")] "; - OS << "= Result.getValue(" << ValNo++ << ");\n"; - } - for (unsigned i = 0; i < NumImpResults; i++) { - OS << " CodeGenMap[N.getValue(" << ValNo << ")] = Result"; - OS << ".getValue(" << ValNo++ << ");\n"; + OS << "= Result.getValue(" << ValNo << ");\n"; + for (unsigned i = 0; i < NumImpResults; i++) { + OS << " CodeGenMap[N.getValue(" << ValNo << ")] = Result"; + OS << ".getValue(" << ValNo+1 << ");\n"; + ValNo++; + } + } else { + for (unsigned i = 0; i < NumImpResults; i++) { + OS << " CodeGenMap[N.getValue(" << ValNo << ")] = Result"; + OS << ".getValue(" << ValNo << ");\n"; + ValNo++; + } } + OS << " return Result.getValue(N.ResNo);\n"; } else { // If this instruction is the root, and if there is only one use of it, From evan.cheng at apple.com Mon Dec 19 17:12:01 2005 From: evan.cheng at apple.com (Evan Cheng) Date: Mon, 19 Dec 2005 17:12:01 -0600 Subject: [llvm-commits] CVS: llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp Message-ID: <200512192312.RAA09635@zion.cs.uiuc.edu> Changes in directory llvm/lib/CodeGen/SelectionDAG: SelectionDAG.cpp updated: 1.226 -> 1.227 --- Log message: Print out opcode number if it's an unknown target node. --- Diffs of the changes: (+6 -1) SelectionDAG.cpp | 7 ++++++- 1 files changed, 6 insertions(+), 1 deletion(-) Index: llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp diff -u llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp:1.226 llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp:1.227 --- llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp:1.226 Mon Dec 19 16:21:21 2005 +++ llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp Mon Dec 19 17:11:49 2005 @@ -21,6 +21,7 @@ #include "llvm/Target/TargetLowering.h" #include "llvm/Target/TargetInstrInfo.h" #include "llvm/Target/TargetMachine.h" +#include "llvm/ADT/StringExtras.h" #include #include #include @@ -1838,7 +1839,11 @@ if (const TargetInstrInfo *TII = G->getTarget().getInstrInfo()) if (getOpcode()-ISD::BUILTIN_OP_END < TII->getNumOpcodes()) return TII->getName(getOpcode()-ISD::BUILTIN_OP_END); - return "<>"; + + std::string Name + = "<>"; + return Name.c_str(); } case ISD::PCMARKER: return "PCMarker"; From evan.cheng at apple.com Mon Dec 19 17:12:50 2005 From: evan.cheng at apple.com (Evan Cheng) Date: Mon, 19 Dec 2005 17:12:50 -0600 Subject: [llvm-commits] CVS: llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp Message-ID: <200512192312.RAA09667@zion.cs.uiuc.edu> Changes in directory llvm/lib/CodeGen/SelectionDAG: LegalizeDAG.cpp updated: 1.234 -> 1.235 --- Log message: X86 conditional branch support. --- Diffs of the changes: (+10 -0) LegalizeDAG.cpp | 10 ++++++++++ 1 files changed, 10 insertions(+) Index: llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp diff -u llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp:1.234 llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp:1.235 --- llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp:1.234 Sun Dec 18 17:54:29 2005 +++ llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp Mon Dec 19 17:12:38 2005 @@ -883,6 +883,16 @@ } Result = LegalizeOp(Result); // Relegalize new nodes. break; + case TargetLowering::Custom: { + SDOperand Tmp = + TLI.LowerOperation(DAG.getNode(ISD::BRCOND, Node->getValueType(0), + Tmp1, Tmp2, Node->getOperand(2)), DAG); + if (Tmp.Val) { + Result = LegalizeOp(Tmp); + break; + } + // FALLTHROUGH if the target thinks it is legal. + } case TargetLowering::Legal: // Basic block destination (Op#2) is always legal. if (Tmp1 != Node->getOperand(0) || Tmp2 != Node->getOperand(1)) From evan.cheng at apple.com Mon Dec 19 17:12:51 2005 From: evan.cheng at apple.com (Evan Cheng) Date: Mon, 19 Dec 2005 17:12:51 -0600 Subject: [llvm-commits] CVS: llvm/lib/Target/X86/X86ISelLowering.cpp X86ISelLowering.h X86InstrInfo.td Message-ID: <200512192312.RAA09675@zion.cs.uiuc.edu> Changes in directory llvm/lib/Target/X86: X86ISelLowering.cpp updated: 1.9 -> 1.10 X86ISelLowering.h updated: 1.3 -> 1.4 X86InstrInfo.td updated: 1.172 -> 1.173 --- Log message: X86 conditional branch support. --- Diffs of the changes: (+53 -14) X86ISelLowering.cpp | 21 ++++++++++++++++++++- X86ISelLowering.h | 3 +++ X86InstrInfo.td | 43 ++++++++++++++++++++++++++++++------------- 3 files changed, 53 insertions(+), 14 deletions(-) Index: llvm/lib/Target/X86/X86ISelLowering.cpp diff -u llvm/lib/Target/X86/X86ISelLowering.cpp:1.9 llvm/lib/Target/X86/X86ISelLowering.cpp:1.10 --- llvm/lib/Target/X86/X86ISelLowering.cpp:1.9 Sat Dec 17 01:18:44 2005 +++ llvm/lib/Target/X86/X86ISelLowering.cpp Mon Dec 19 17:12:38 2005 @@ -31,7 +31,6 @@ X86TargetLowering::X86TargetLowering(TargetMachine &TM) : TargetLowering(TM) { - // Set up the TargetLowering object. // X86 is weird, it always uses i8 for shift amounts and setcc results. @@ -81,6 +80,9 @@ setOperationAction(ISD::FP_TO_SINT , MVT::i8 , Promote); setOperationAction(ISD::FP_TO_SINT , MVT::i16 , Promote); + if (X86DAGIsel) { + setOperationAction(ISD::BRCOND , MVT::Other, Custom); + } setOperationAction(ISD::BRCONDTWOWAY , MVT::Other, Expand); setOperationAction(ISD::BRTWOWAY_CC , MVT::Other, Expand); setOperationAction(ISD::MEMMOVE , MVT::Other, Expand); @@ -949,5 +951,22 @@ return DAG.getNode(X86ISD::CMOV, Op.getValueType(), Op.getOperand(1), Op.getOperand(2), CC, Cond); } + case ISD::BRCOND: { + SDOperand Chain = Op.getOperand(0); + SDOperand Cond = Op.getOperand(1); + SDOperand Dest = Op.getOperand(2); + SDOperand CC; + // TODO: handle Cond == OR / AND / XOR + if (Cond.getOpcode() == ISD::SETCC) { + CC = Cond.getOperand(2); + Cond = DAG.getNode(X86ISD::CMP, MVT::Flag, + Cond.getOperand(0), Cond.getOperand(1)); + } else { + CC = DAG.getCondCode(ISD::SETNE); + Cond = DAG.getNode(X86ISD::TEST, MVT::Flag, Cond, Cond); + } + return DAG.getNode(X86ISD::BRCOND, Op.getValueType(), + Op.getOperand(0), Op.getOperand(2), CC, Cond); + } } } Index: llvm/lib/Target/X86/X86ISelLowering.h diff -u llvm/lib/Target/X86/X86ISelLowering.h:1.3 llvm/lib/Target/X86/X86ISelLowering.h:1.4 --- llvm/lib/Target/X86/X86ISelLowering.h:1.3 Fri Dec 16 19:21:05 2005 +++ llvm/lib/Target/X86/X86ISelLowering.h Mon Dec 19 17:12:38 2005 @@ -72,6 +72,9 @@ /// X86 conditional moves. CMOV, + + /// X86 conditional branches. + BRCOND, }; } Index: llvm/lib/Target/X86/X86InstrInfo.td diff -u llvm/lib/Target/X86/X86InstrInfo.td:1.172 llvm/lib/Target/X86/X86InstrInfo.td:1.173 --- llvm/lib/Target/X86/X86InstrInfo.td:1.172 Sat Dec 17 13:47:05 2005 +++ llvm/lib/Target/X86/X86InstrInfo.td Mon Dec 19 17:12:38 2005 @@ -24,10 +24,15 @@ [SDTCisSameAs<0, 1>, SDTCisSameAs<1, 2>, SDTCisVT<3, OtherVT>, SDTCisVT<4, FlagVT>]>; -def X86cmp : SDNode<"X86ISD::CMP" , SDTX86CmpTest, []>; -def X86test : SDNode<"X86ISD::TEST", SDTX86CmpTest, []>; +def SDTX86BrCond : SDTypeProfile<0, 3, + [SDTCisVT<0, OtherVT>, + SDTCisVT<1, OtherVT>, SDTCisVT<2, FlagVT>]>; -def X86cmov : SDNode<"X86ISD::CMOV", SDTX86Cmov, []>; +def X86cmp : SDNode<"X86ISD::CMP" , SDTX86CmpTest, []>; +def X86test : SDNode<"X86ISD::TEST", SDTX86CmpTest, []>; + +def X86cmov : SDNode<"X86ISD::CMOV", SDTX86Cmov, []>; +def X86Brcond : SDNode<"X86ISD::BRCOND", SDTX86BrCond, [SDNPHasChain]>; //===----------------------------------------------------------------------===// // X86 Operand Definitions. @@ -268,21 +273,33 @@ let isBarrier = 1 in def JMP : IBr<0xE9, (ops brtarget:$dst), "jmp $dst", [(br bb:$dst)]>; + +def JE : IBr<0x84, (ops brtarget:$dst), "je $dst", + [(X86Brcond bb:$dst, SETEQ, STATUS)]>, Imp<[STATUS],[]>, TB; +def JNE : IBr<0x85, (ops brtarget:$dst), "jne $dst", + [(X86Brcond bb:$dst, SETNE, STATUS)]>, Imp<[STATUS],[]>, TB; +def JL : IBr<0x8C, (ops brtarget:$dst), "jl $dst", + [(X86Brcond bb:$dst, SETLT, STATUS)]>, Imp<[STATUS],[]>, TB; +def JLE : IBr<0x8E, (ops brtarget:$dst), "jle $dst", + [(X86Brcond bb:$dst, SETLE, STATUS)]>, Imp<[STATUS],[]>, TB; +def JG : IBr<0x8F, (ops brtarget:$dst), "jg $dst", + [(X86Brcond bb:$dst, SETGT, STATUS)]>, Imp<[STATUS],[]>, TB; +def JGE : IBr<0x8D, (ops brtarget:$dst), "jge $dst", + [(X86Brcond bb:$dst, SETGE, STATUS)]>, Imp<[STATUS],[]>, TB; + def JB : IBr<0x82, (ops brtarget:$dst), "jb $dst", - []>, TB; -def JAE : IBr<0x83, (ops brtarget:$dst), "jae $dst", []>, TB; -def JE : IBr<0x84, (ops brtarget:$dst), "je $dst", []>, TB; -def JNE : IBr<0x85, (ops brtarget:$dst), "jne $dst", []>, TB; -def JBE : IBr<0x86, (ops brtarget:$dst), "jbe $dst", []>, TB; -def JA : IBr<0x87, (ops brtarget:$dst), "ja $dst", []>, TB; + [(X86Brcond bb:$dst, SETULT, STATUS)]>, Imp<[STATUS],[]>, TB; +def JBE : IBr<0x86, (ops brtarget:$dst), "jbe $dst", + [(X86Brcond bb:$dst, SETULE, STATUS)]>, Imp<[STATUS],[]>, TB; +def JA : IBr<0x87, (ops brtarget:$dst), "ja $dst", + [(X86Brcond bb:$dst, SETUGT, STATUS)]>, Imp<[STATUS],[]>, TB; +def JAE : IBr<0x83, (ops brtarget:$dst), "jae $dst", + [(X86Brcond bb:$dst, SETUGE, STATUS)]>, Imp<[STATUS],[]>, TB; + def JS : IBr<0x88, (ops brtarget:$dst), "js $dst", []>, TB; def JNS : IBr<0x89, (ops brtarget:$dst), "jns $dst", []>, TB; def JP : IBr<0x8A, (ops brtarget:$dst), "jp $dst", []>, TB; def JNP : IBr<0x8B, (ops brtarget:$dst), "jnp $dst", []>, TB; -def JL : IBr<0x8C, (ops brtarget:$dst), "jl $dst", []>, TB; -def JGE : IBr<0x8D, (ops brtarget:$dst), "jge $dst", []>, TB; -def JLE : IBr<0x8E, (ops brtarget:$dst), "jle $dst", []>, TB; -def JG : IBr<0x8F, (ops brtarget:$dst), "jg $dst", []>, TB; //===----------------------------------------------------------------------===// // Call Instructions... From evan.cheng at apple.com Mon Dec 19 17:12:51 2005 From: evan.cheng at apple.com (Evan Cheng) Date: Mon, 19 Dec 2005 17:12:51 -0600 Subject: [llvm-commits] CVS: llvm/lib/Target/TargetSelectionDAG.td Message-ID: <200512192312.RAA09679@zion.cs.uiuc.edu> Changes in directory llvm/lib/Target: TargetSelectionDAG.td updated: 1.30 -> 1.31 --- Log message: X86 conditional branch support. --- Diffs of the changes: (+0 -5) TargetSelectionDAG.td | 5 ----- 1 files changed, 5 deletions(-) Index: llvm/lib/Target/TargetSelectionDAG.td diff -u llvm/lib/Target/TargetSelectionDAG.td:1.30 llvm/lib/Target/TargetSelectionDAG.td:1.31 --- llvm/lib/Target/TargetSelectionDAG.td:1.30 Sun Dec 18 01:05:21 2005 +++ llvm/lib/Target/TargetSelectionDAG.td Mon Dec 19 17:12:38 2005 @@ -131,10 +131,6 @@ SDTCisVT<0, OtherVT> ]>; -def SDTBrCond : SDTypeProfile<0, 2, [ // brcond - SDTCisInt<0>, SDTCisVT<1, OtherVT> -]>; - def SDTRet : SDTypeProfile<0, 0, []>; // ret def SDTWritePort : SDTypeProfile<0, 2, [ // writeport @@ -256,7 +252,6 @@ def selectcc : SDNode<"ISD::SELECT_CC" , SDTSelectCC>; def br : SDNode<"ISD::BR" , SDTBr, [SDNPHasChain]>; -def brcond : SDNode<"ISD::BRCOND" , SDTBrCond, [SDNPHasChain]>; def ret : SDNode<"ISD::RET" , SDTRet, [SDNPHasChain]>; def writeport : SDNode<"ISD::WRITEPORT" , SDTWritePort, [SDNPHasChain]>; From natebegeman at mac.com Mon Dec 19 17:25:21 2005 From: natebegeman at mac.com (Nate Begeman) Date: Mon, 19 Dec 2005 17:25:21 -0600 Subject: [llvm-commits] CVS: llvm/lib/Target/PowerPC/PPCAsmPrinter.cpp PPCISelDAGToDAG.cpp PPCISelLowering.cpp PPCInstrInfo.td Message-ID: <200512192325.RAA09742@zion.cs.uiuc.edu> Changes in directory llvm/lib/Target/PowerPC: PPCAsmPrinter.cpp updated: 1.129 -> 1.130 PPCISelDAGToDAG.cpp updated: 1.143 -> 1.144 PPCISelLowering.cpp updated: 1.50 -> 1.51 PPCInstrInfo.td updated: 1.161 -> 1.162 --- Log message: Convert load/store over to being pattern matched --- Diffs of the changes: (+205 -226) PPCAsmPrinter.cpp | 14 +++ PPCISelDAGToDAG.cpp | 222 +++++++++++++++++----------------------------------- PPCISelLowering.cpp | 1 PPCInstrInfo.td | 194 +++++++++++++++++++++++++++------------------ 4 files changed, 205 insertions(+), 226 deletions(-) Index: llvm/lib/Target/PowerPC/PPCAsmPrinter.cpp diff -u llvm/lib/Target/PowerPC/PPCAsmPrinter.cpp:1.129 llvm/lib/Target/PowerPC/PPCAsmPrinter.cpp:1.130 --- llvm/lib/Target/PowerPC/PPCAsmPrinter.cpp:1.129 Fri Dec 16 16:45:29 2005 +++ llvm/lib/Target/PowerPC/PPCAsmPrinter.cpp Mon Dec 19 17:25:09 2005 @@ -181,7 +181,19 @@ unsigned RegNo = enumRegToMachineReg(CCReg); O << (0x80 >> RegNo); } - + // The new addressing mode printers, currently empty + void printMemRegImm(const MachineInstr *MI, unsigned OpNo) { + printSymbolLo(MI, OpNo); + O << '('; + printOperand(MI, OpNo+1); + O << ')'; + } + void printMemRegReg(const MachineInstr *MI, unsigned OpNo) { + printOperand(MI, OpNo); + O << ", "; + printOperand(MI, OpNo+1); + } + virtual bool runOnMachineFunction(MachineFunction &F) = 0; virtual bool doFinalization(Module &M) = 0; }; Index: llvm/lib/Target/PowerPC/PPCISelDAGToDAG.cpp diff -u llvm/lib/Target/PowerPC/PPCISelDAGToDAG.cpp:1.143 llvm/lib/Target/PowerPC/PPCISelDAGToDAG.cpp:1.144 --- llvm/lib/Target/PowerPC/PPCISelDAGToDAG.cpp:1.143 Sun Dec 18 15:06:11 2005 +++ llvm/lib/Target/PowerPC/PPCISelDAGToDAG.cpp Mon Dec 19 17:25:09 2005 @@ -68,15 +68,18 @@ /// specified condition code, returning the CR# of the expression. SDOperand SelectCC(SDOperand LHS, SDOperand RHS, ISD::CondCode CC); - /// SelectAddr - Given the specified address, return the two operands for a - /// load/store instruction, and return true if it should be an indexed [r+r] - /// operation. - bool SelectAddr(SDOperand Addr, SDOperand &Op1, SDOperand &Op2); + /// SelectAddrImm - Returns true if the address N can be represented by + /// a base register plus a signed 16-bit displacement [r+imm]. + bool SelectAddrImm(SDOperand N, SDOperand &Disp, SDOperand &Base); + + /// SelectAddrIdx - Given the specified addressed, check to see if it can be + /// represented as an indexed [r+r] operation. Returns false if it can + /// be represented by [r+imm], which are preferred. + bool SelectAddrIdx(SDOperand N, SDOperand &Base, SDOperand &Index); - /// SelectAddrIndexed - Given the specified addressed, force it to be - /// represented as an indexed [r+r] operation, rather than possibly - /// returning [r+imm] as SelectAddr may. - void SelectAddrIndexed(SDOperand Addr, SDOperand &Op1, SDOperand &Op2); + /// SelectAddrIdxOnly - Given the specified addressed, force it to be + /// represented as an indexed [r+r] operation. + bool SelectAddrIdxOnly(SDOperand N, SDOperand &Base, SDOperand &Index); SDOperand BuildSDIVSequence(SDNode *N); SDOperand BuildUDIVSequence(SDNode *N); @@ -400,65 +403,77 @@ return 0; } -/// SelectAddr - Given the specified address, return the two operands for a -/// load/store instruction, and return true if it should be an indexed [r+r] -/// operation. -bool PPCDAGToDAGISel::SelectAddr(SDOperand Addr, SDOperand &Op1, - SDOperand &Op2) { - unsigned imm = 0; - if (Addr.getOpcode() == ISD::ADD) { - if (isIntImmediate(Addr.getOperand(1), imm) && isInt16(imm)) { - Op1 = getI32Imm(Lo16(imm)); - if (FrameIndexSDNode *FI = - dyn_cast(Addr.getOperand(0))) { - ++FrameOff; - Op2 = CurDAG->getTargetFrameIndex(FI->getIndex(), MVT::i32); +/// SelectAddrImm - Returns true if the address N can be represented by +/// a base register plus a signed 16-bit displacement [r+imm]. +bool PPCDAGToDAGISel::SelectAddrImm(SDOperand N, SDOperand &Disp, + SDOperand &Base) { + if (N.getOpcode() == ISD::ADD) { + unsigned imm = 0; + if (isIntImmediate(N.getOperand(1), imm) && isInt16(imm)) { + Disp = getI32Imm(Lo16(imm)); + if (FrameIndexSDNode *FI = dyn_cast(N.getOperand(0))) { + Base = CurDAG->getTargetFrameIndex(FI->getIndex(), MVT::i32); } else { - Op2 = Select(Addr.getOperand(0)); + Base = Select(N.getOperand(0)); } - return false; - } else if (Addr.getOperand(1).getOpcode() == PPCISD::Lo) { + return true; // [r+i] + } else if (N.getOperand(1).getOpcode() == PPCISD::Lo) { // Match LOAD (ADD (X, Lo(G))). - assert(!cast(Addr.getOperand(1).getOperand(1))->getValue() + assert(!cast(N.getOperand(1).getOperand(1))->getValue() && "Cannot handle constant offsets yet!"); - Op1 = Addr.getOperand(1).getOperand(0); // The global address. - assert(Op1.getOpcode() == ISD::TargetGlobalAddress || - Op1.getOpcode() == ISD::TargetConstantPool); - Op2 = Select(Addr.getOperand(0)); - return false; // [&g+r] - } else { - Op1 = Select(Addr.getOperand(0)); - Op2 = Select(Addr.getOperand(1)); - return true; // [r+r] - } - } - - if (FrameIndexSDNode *FI = dyn_cast(Addr)) - Op2 = CurDAG->getTargetFrameIndex(FI->getIndex(), MVT::i32); + Disp = N.getOperand(1).getOperand(0); // The global address. + assert(Disp.getOpcode() == ISD::TargetGlobalAddress || + Disp.getOpcode() == ISD::TargetConstantPool); + Base = Select(N.getOperand(0)); + return true; // [&g+r] + } + return false; // [r+r] + } + Disp = getI32Imm(0); + if (FrameIndexSDNode *FI = dyn_cast(N)) + Base = CurDAG->getTargetFrameIndex(FI->getIndex(), MVT::i32); else - Op2 = Select(Addr); - Op1 = getI32Imm(0); - return false; + Base = Select(N); + return true; // [r+0] } -/// SelectAddrIndexed - Given the specified addressed, force it to be -/// represented as an indexed [r+r] operation, rather than possibly -/// returning [r+imm] as SelectAddr may. -void PPCDAGToDAGISel::SelectAddrIndexed(SDOperand Addr, SDOperand &Op1, - SDOperand &Op2) { - if (Addr.getOpcode() == ISD::ADD) { - Op1 = Select(Addr.getOperand(0)); - Op2 = Select(Addr.getOperand(1)); - return; - } - - if (FrameIndexSDNode *FI = dyn_cast(Addr)) { - Op1 = CurDAG->getTargetNode(PPC::LI, MVT::i32, getI32Imm(0)); - Op2 = CurDAG->getTargetFrameIndex(FI->getIndex(), MVT::i32); - return; +/// SelectAddrIdx - Given the specified addressed, check to see if it can be +/// represented as an indexed [r+r] operation. Returns false if it can +/// be represented by [r+imm], which are preferred. +bool PPCDAGToDAGISel::SelectAddrIdx(SDOperand N, SDOperand &Base, + SDOperand &Index) { + // Check to see if we can represent this as an [r+imm] address instead, + // which will fail if the address is more profitably represented as an + // [r+r] address. + if (SelectAddrImm(N, Base, Index)) + return false; + + if (N.getOpcode() == ISD::ADD) { + Base = Select(N.getOperand(0)); + Index = Select(N.getOperand(1)); + return true; } - Op1 = CurDAG->getTargetNode(PPC::LI, MVT::i32, getI32Imm(0)); - Op2 = Select(Addr); + + // FIXME: This should be a CopyFromReg R0 rather than a load of 0. + Base = CurDAG->getTargetNode(PPC::LI, MVT::i32, getI32Imm(0)); + Index = Select(N); + return true; +} + +/// SelectAddrIdxOnly - Given the specified addressed, force it to be +/// represented as an indexed [r+r] operation. +bool PPCDAGToDAGISel::SelectAddrIdxOnly(SDOperand N, SDOperand &Base, + SDOperand &Index) { + if (N.getOpcode() == ISD::ADD) { + Base = Select(N.getOperand(0)); + Index = Select(N.getOperand(1)); + return true; + } + + // FIXME: This should be a CopyFromReg R0 rather than a load of 0. + Base = CurDAG->getTargetNode(PPC::LI, MVT::i32, getI32Imm(0)); + Index = Select(N); + return true; } /// SelectCC - Select a comparison of the specified values with the specified @@ -997,95 +1012,6 @@ // Other cases are autogenerated. break; } - case ISD::LOAD: - case ISD::EXTLOAD: - case ISD::ZEXTLOAD: - case ISD::SEXTLOAD: { - SDOperand Op1, Op2; - // If this is a vector load, then force this to be indexed addressing, since - // altivec does not have immediate offsets for loads. - bool isIdx = true; - if (N->getOpcode() == ISD::LOAD && MVT::isVector(N->getValueType(0))) { - SelectAddrIndexed(N->getOperand(1), Op1, Op2); - } else { - isIdx = SelectAddr(N->getOperand(1), Op1, Op2); - } - MVT::ValueType TypeBeingLoaded = (N->getOpcode() == ISD::LOAD) ? - N->getValueType(0) : cast(N->getOperand(3))->getVT(); - - unsigned Opc; - switch (TypeBeingLoaded) { - default: N->dump(); assert(0 && "Cannot load this type!"); - case MVT::i1: - case MVT::i8: Opc = isIdx ? PPC::LBZX : PPC::LBZ; break; - case MVT::i16: - if (N->getOpcode() == ISD::SEXTLOAD) { // SEXT load? - Opc = isIdx ? PPC::LHAX : PPC::LHA; - } else { - Opc = isIdx ? PPC::LHZX : PPC::LHZ; - } - break; - case MVT::i32: Opc = isIdx ? PPC::LWZX : PPC::LWZ; break; - case MVT::f32: Opc = isIdx ? PPC::LFSX : PPC::LFS; break; - case MVT::f64: Opc = isIdx ? PPC::LFDX : PPC::LFD; break; - case MVT::v4f32: Opc = PPC::LVX; break; - } - - // If this is an f32 -> f64 load, emit the f32 load, then use an 'extending - // copy'. - if (TypeBeingLoaded != MVT::f32 || N->getOpcode() == ISD::LOAD) { - return CurDAG->SelectNodeTo(N, Opc, N->getValueType(0), MVT::Other, - Op1, Op2, Select(N->getOperand(0))). - getValue(Op.ResNo); - } else { - std::vector Ops; - Ops.push_back(Op1); - Ops.push_back(Op2); - Ops.push_back(Select(N->getOperand(0))); - SDOperand Res = CurDAG->getTargetNode(Opc, MVT::f32, MVT::Other, Ops); - SDOperand Ext = CurDAG->getTargetNode(PPC::FMRSD, MVT::f64, Res); - CodeGenMap[Op.getValue(0)] = Ext; - CodeGenMap[Op.getValue(1)] = Res.getValue(1); - if (Op.ResNo) - return Res.getValue(1); - else - return Ext; - } - } - case ISD::TRUNCSTORE: - case ISD::STORE: { - SDOperand AddrOp1, AddrOp2; - // If this is a vector store, then force this to be indexed addressing, - // since altivec does not have immediate offsets for stores. - bool isIdx = true; - if (N->getOpcode() == ISD::STORE && - MVT::isVector(N->getOperand(1).getValueType())) { - SelectAddrIndexed(N->getOperand(2), AddrOp1, AddrOp2); - } else { - isIdx = SelectAddr(N->getOperand(2), AddrOp1, AddrOp2); - } - - unsigned Opc; - if (N->getOpcode() == ISD::STORE) { - switch (N->getOperand(1).getValueType()) { - default: assert(0 && "unknown Type in store"); - case MVT::i32: Opc = isIdx ? PPC::STWX : PPC::STW; break; - case MVT::f64: Opc = isIdx ? PPC::STFDX : PPC::STFD; break; - case MVT::f32: Opc = isIdx ? PPC::STFSX : PPC::STFS; break; - case MVT::v4f32: Opc = PPC::STVX; - } - } else { //ISD::TRUNCSTORE - switch(cast(N->getOperand(4))->getVT()) { - default: assert(0 && "unknown Type in store"); - case MVT::i8: Opc = isIdx ? PPC::STBX : PPC::STB; break; - case MVT::i16: Opc = isIdx ? PPC::STHX : PPC::STH; break; - } - } - - return CurDAG->SelectNodeTo(N, Opc, MVT::Other, Select(N->getOperand(1)), - AddrOp1, AddrOp2, Select(N->getOperand(0))); - } - case ISD::SELECT_CC: { ISD::CondCode CC = cast(N->getOperand(4))->get(); Index: llvm/lib/Target/PowerPC/PPCISelLowering.cpp diff -u llvm/lib/Target/PowerPC/PPCISelLowering.cpp:1.50 llvm/lib/Target/PowerPC/PPCISelLowering.cpp:1.51 --- llvm/lib/Target/PowerPC/PPCISelLowering.cpp:1.50 Fri Dec 9 20:36:00 2005 +++ llvm/lib/Target/PowerPC/PPCISelLowering.cpp Mon Dec 19 17:25:09 2005 @@ -126,6 +126,7 @@ // FIXME: AltiVec supports a wide variety of packed types. For now, we're // bringing up support with just v4f32. addRegisterClass(MVT::v4f32, PPC::VRRCRegisterClass); + addRegisterClass(MVT::v4i32, PPC::VRRCRegisterClass); } setSetCCResultContents(ZeroOrOneSetCCResult); Index: llvm/lib/Target/PowerPC/PPCInstrInfo.td diff -u llvm/lib/Target/PowerPC/PPCInstrInfo.td:1.161 llvm/lib/Target/PowerPC/PPCInstrInfo.td:1.162 --- llvm/lib/Target/PowerPC/PPCInstrInfo.td:1.161 Fri Dec 16 16:45:29 2005 +++ llvm/lib/Target/PowerPC/PPCInstrInfo.td Mon Dec 19 17:25:09 2005 @@ -165,6 +165,22 @@ def crbitm: Operand { let PrintMethod = "printcrbitm"; } +// Address operands +def memri : Operand { + let PrintMethod = "printMemRegImm"; + let NumMIOperands = 2; + let MIOperandInfo = (ops i32imm, GPRC); +} +def memrr : Operand { + let PrintMethod = "printMemRegReg"; + let NumMIOperands = 2; + let MIOperandInfo = (ops GPRC, GPRC); +} + +// Define X86 specific addressing mode. +def iaddr : ComplexPattern; +def xaddr : ComplexPattern; +def xoaddr : ComplexPattern; //===----------------------------------------------------------------------===// // PowerPC Instruction Predicate Definitions. @@ -258,21 +274,21 @@ // register and an immediate are of this type. // let isLoad = 1 in { -def LBZ : DForm_1<34, (ops GPRC:$rD, symbolLo:$disp, GPRC:$rA), - "lbz $rD, $disp($rA)", LdStGeneral, - []>; -def LHA : DForm_1<42, (ops GPRC:$rD, symbolLo:$disp, GPRC:$rA), - "lha $rD, $disp($rA)", LdStLHA, - []>; -def LHZ : DForm_1<40, (ops GPRC:$rD, symbolLo:$disp, GPRC:$rA), - "lhz $rD, $disp($rA)", LdStGeneral, - []>; +def LBZ : DForm_1<34, (ops GPRC:$rD, memri:$src), + "lbz $rD, $src", LdStGeneral, + [(set GPRC:$rD, (zextload iaddr:$src, i8))]>; +def LHA : DForm_1<42, (ops GPRC:$rD, memri:$src), + "lha $rD, $src", LdStLHA, + [(set GPRC:$rD, (sextload iaddr:$src, i16))]>; +def LHZ : DForm_1<40, (ops GPRC:$rD, memri:$src), + "lhz $rD, $src", LdStGeneral, + [(set GPRC:$rD, (zextload iaddr:$src, i16))]>; def LMW : DForm_1<46, (ops GPRC:$rD, s16imm:$disp, GPRC:$rA), "lmw $rD, $disp($rA)", LdStLMW, []>; -def LWZ : DForm_1<32, (ops GPRC:$rD, symbolLo:$disp, GPRC:$rA), - "lwz $rD, $disp($rA)", LdStGeneral, - []>; +def LWZ : DForm_1<32, (ops GPRC:$rD, memri:$src), + "lwz $rD, $src", LdStGeneral, + [(set GPRC:$rD, (load iaddr:$src))]>; def LWZU : DForm_1<35, (ops GPRC:$rD, s16imm:$disp, GPRC:$rA), "lwzu $rD, $disp($rA)", LdStGeneral, []>; @@ -309,15 +325,15 @@ def STMW : DForm_3<47, (ops GPRC:$rS, s16imm:$disp, GPRC:$rA), "stmw $rS, $disp($rA)", LdStLMW, []>; -def STB : DForm_3<38, (ops GPRC:$rS, symbolLo:$disp, GPRC:$rA), - "stb $rS, $disp($rA)", LdStGeneral, - []>; -def STH : DForm_3<44, (ops GPRC:$rS, symbolLo:$disp, GPRC:$rA), - "sth $rS, $disp($rA)", LdStGeneral, - []>; -def STW : DForm_3<36, (ops GPRC:$rS, symbolLo:$disp, GPRC:$rA), - "stw $rS, $disp($rA)", LdStGeneral, - []>; +def STB : DForm_3<38, (ops GPRC:$rS, memri:$src), + "stb $rS, $src", LdStGeneral, + [(truncstore GPRC:$rS, iaddr:$src, i8)]>; +def STH : DForm_3<44, (ops GPRC:$rS, memri:$src), + "sth $rS, $src", LdStGeneral, + [(truncstore GPRC:$rS, iaddr:$src, i16)]>; +def STW : DForm_3<36, (ops GPRC:$rS, memri:$src), + "stw $rS, $src", LdStGeneral, + [(store GPRC:$rS, iaddr:$src)]>; def STWU : DForm_3<37, (ops GPRC:$rS, s16imm:$disp, GPRC:$rA), "stwu $rS, $disp($rA)", LdStGeneral, []>; @@ -355,20 +371,20 @@ def CMPLDI : DForm_6_ext<10, (ops CRRC:$dst, GPRC:$src1, u16imm:$src2), "cmpldi $dst, $src1, $src2", IntCompare>, isPPC64; let isLoad = 1 in { -def LFS : DForm_8<48, (ops F4RC:$rD, symbolLo:$disp, GPRC:$rA), - "lfs $rD, $disp($rA)", LdStLFDU, - []>; -def LFD : DForm_8<50, (ops F8RC:$rD, symbolLo:$disp, GPRC:$rA), - "lfd $rD, $disp($rA)", LdStLFD, - []>; +def LFS : DForm_8<48, (ops F4RC:$rD, memri:$src), + "lfs $rD, $src", LdStLFDU, + [(set F4RC:$rD, (load iaddr:$src))]>; +def LFD : DForm_8<50, (ops F8RC:$rD, memri:$src), + "lfd $rD, $src", LdStLFD, + [(set F8RC:$rD, (load iaddr:$src))]>; } let isStore = 1 in { -def STFS : DForm_9<52, (ops F4RC:$rS, symbolLo:$disp, GPRC:$rA), - "stfs $rS, $disp($rA)", LdStUX, - []>; -def STFD : DForm_9<54, (ops F8RC:$rS, symbolLo:$disp, GPRC:$rA), - "stfd $rS, $disp($rA)", LdStUX, - []>; +def STFS : DForm_9<52, (ops F4RC:$rS, memri:$dst), + "stfs $rS, $dst", LdStUX, + [(store F4RC:$rS, iaddr:$dst)]>; +def STFD : DForm_9<54, (ops F8RC:$rS, memri:$dst), + "stfd $rS, $dst", LdStUX, + [(store F8RC:$rS, iaddr:$dst)]>; } // DS-Form instructions. Load/Store instructions available in PPC-64 @@ -394,24 +410,24 @@ // register and another register are of this type. // let isLoad = 1 in { -def LBZX : XForm_1<31, 87, (ops GPRC:$dst, GPRC:$base, GPRC:$index), - "lbzx $dst, $base, $index", LdStGeneral, - []>; -def LHAX : XForm_1<31, 343, (ops GPRC:$dst, GPRC:$base, GPRC:$index), - "lhax $dst, $base, $index", LdStLHA, - []>; -def LHZX : XForm_1<31, 279, (ops GPRC:$dst, GPRC:$base, GPRC:$index), - "lhzx $dst, $base, $index", LdStGeneral, - []>; -def LWAX : XForm_1<31, 341, (ops GPRC:$dst, GPRC:$base, GPRC:$index), - "lwax $dst, $base, $index", LdStLHA, - []>, isPPC64; -def LWZX : XForm_1<31, 23, (ops GPRC:$dst, GPRC:$base, GPRC:$index), - "lwzx $dst, $base, $index", LdStGeneral, - []>; -def LDX : XForm_1<31, 21, (ops GPRC:$dst, GPRC:$base, GPRC:$index), - "ldx $dst, $base, $index", LdStLD, - []>, isPPC64; +def LBZX : XForm_1<31, 87, (ops GPRC:$rD, memrr:$src), + "lbzx $rD, $src", LdStGeneral, + [(set GPRC:$rD, (zextload xaddr:$src, i8))]>; +def LHAX : XForm_1<31, 343, (ops GPRC:$rD, memrr:$src), + "lhax $rD, $src", LdStLHA, + [(set GPRC:$rD, (sextload xaddr:$src, i16))]>; +def LHZX : XForm_1<31, 279, (ops GPRC:$rD, memrr:$src), + "lhzx $rD, $src", LdStGeneral, + [(set GPRC:$rD, (zextload xaddr:$src, i16))]>; +def LWAX : XForm_1<31, 341, (ops G8RC:$rD, memrr:$src), + "lwax $rD, $src", LdStLHA, + [(set G8RC:$rD, (sextload xaddr:$src, i32))]>, isPPC64; +def LWZX : XForm_1<31, 23, (ops GPRC:$rD, memrr:$src), + "lwzx $rD, $src", LdStGeneral, + [(set GPRC:$rD, (load xaddr:$src))]>; +def LDX : XForm_1<31, 21, (ops G8RC:$rD, memrr:$src), + "ldx $rD, $src", LdStLD, + [(set G8RC:$rD, (load xaddr:$src))]>, isPPC64; def LVEBX: XForm_1<31, 7, (ops VRRC:$vD, GPRC:$base, GPRC:$rA), "lvebx $vD, $base, $rA", LdStGeneral, []>; @@ -421,9 +437,9 @@ def LVEWX: XForm_1<31, 71, (ops VRRC:$vD, GPRC:$base, GPRC:$rA), "lvewx $vD, $base, $rA", LdStGeneral, []>; -def LVX : XForm_1<31, 103, (ops VRRC:$vD, GPRC:$base, GPRC:$rA), - "lvx $vD, $base, $rA", LdStGeneral, - []>; +def LVX : XForm_1<31, 103, (ops VRRC:$vD, memrr:$src), + "lvx $vD, $src", LdStGeneral, + [(set VRRC:$vD, (load xoaddr:$src))]>; } def LVSL : XForm_1<31, 6, (ops VRRC:$vD, GPRC:$base, GPRC:$rA), "lvsl $vD, $base, $rA", LdStGeneral, @@ -489,15 +505,15 @@ "sraw $rA, $rS, $rB", IntShift, [(set GPRC:$rA, (PPCsra GPRC:$rS, GPRC:$rB))]>; let isStore = 1 in { -def STBX : XForm_8<31, 215, (ops GPRC:$rS, GPRC:$rA, GPRC:$rB), - "stbx $rS, $rA, $rB", LdStGeneral, - []>; -def STHX : XForm_8<31, 407, (ops GPRC:$rS, GPRC:$rA, GPRC:$rB), - "sthx $rS, $rA, $rB", LdStGeneral, - []>; -def STWX : XForm_8<31, 151, (ops GPRC:$rS, GPRC:$rA, GPRC:$rB), - "stwx $rS, $rA, $rB", LdStGeneral, - []>; +def STBX : XForm_8<31, 215, (ops GPRC:$rS, memrr:$dst), + "stbx $rS, $dst", LdStGeneral, + [(truncstore GPRC:$rS, xaddr:$dst, i8)]>; +def STHX : XForm_8<31, 407, (ops GPRC:$rS, memrr:$dst), + "sthx $rS, $dst", LdStGeneral, + [(truncstore GPRC:$rS, xaddr:$dst, i16)]>; +def STWX : XForm_8<31, 151, (ops GPRC:$rS, memrr:$dst), + "stwx $rS, $dst", LdStGeneral, + [(store GPRC:$rS, xaddr:$dst)]>; def STWUX : XForm_8<31, 183, (ops GPRC:$rS, GPRC:$rA, GPRC:$rB), "stwux $rS, $rA, $rB", LdStGeneral, []>; @@ -516,9 +532,9 @@ def STVEWX: XForm_8<31, 199, (ops VRRC:$rS, GPRC:$rA, GPRC:$rB), "stvewx $rS, $rA, $rB", LdStGeneral, []>; -def STVX : XForm_8<31, 231, (ops VRRC:$rS, GPRC:$rA, GPRC:$rB), - "stvx $rS, $rA, $rB", LdStGeneral, - []>; +def STVX : XForm_8<31, 231, (ops VRRC:$rS, memrr:$dst), + "stvx $rS, $dst", LdStGeneral, + [(store VRRC:$rS, xoaddr:$dst)]>; } def SRAWI : XForm_10<31, 824, (ops GPRC:$rA, GPRC:$rS, u5imm:$SH), "srawi $rA, $rS, $SH", IntShift, @@ -555,12 +571,12 @@ "fcmpu $crD, $fA, $fB", FPCompare>; let isLoad = 1 in { -def LFSX : XForm_25<31, 535, (ops F4RC:$dst, GPRC:$base, GPRC:$index), - "lfsx $dst, $base, $index", LdStLFDU, - []>; -def LFDX : XForm_25<31, 599, (ops F8RC:$dst, GPRC:$base, GPRC:$index), - "lfdx $dst, $base, $index", LdStLFDU, - []>; +def LFSX : XForm_25<31, 535, (ops F4RC:$frD, memrr:$src), + "lfsx $frD, $src", LdStLFDU, + [(set F4RC:$frD, (load xaddr:$src))]>; +def LFDX : XForm_25<31, 599, (ops F8RC:$frD, memrr:$src), + "lfdx $frD, $src", LdStLFDU, + [(set F8RC:$frD, (load xaddr:$src))]>; } def FCFID : XForm_26<63, 846, (ops F8RC:$frD, F8RC:$frB), "fcfid $frD, $frB", FPGeneral, @@ -614,12 +630,15 @@ let isStore = 1 in { -def STFSX : XForm_28<31, 663, (ops F4RC:$frS, GPRC:$rA, GPRC:$rB), - "stfsx $frS, $rA, $rB", LdStUX, - []>; -def STFDX : XForm_28<31, 727, (ops F8RC:$frS, GPRC:$rA, GPRC:$rB), - "stfdx $frS, $rA, $rB", LdStUX, +def STFIWX: XForm_28<31, 983, (ops F4RC:$frS, memrr:$dst), + "stfiwx $frS, $dst", LdStUX, []>; +def STFSX : XForm_28<31, 663, (ops F4RC:$frS, memrr:$dst), + "stfsx $frS, $dst", LdStUX, + [(store F4RC:$frS, xaddr:$dst)]>; +def STFDX : XForm_28<31, 727, (ops F8RC:$frS, memrr:$dst), + "stfdx $frS, $dst", LdStUX, + [(store F8RC:$frS, xaddr:$dst)]>; } // XL-Form instructions. condition register logical ops. @@ -1012,6 +1031,27 @@ def : Pat<(shl GPRC:$rS, GPRC:$rB), (SLW GPRC:$rS, GPRC:$rB)>; +def : Pat<(i32 (zextload iaddr:$src, i1)), + (LBZ iaddr:$src)>; +def : Pat<(i32 (zextload xaddr:$src, i1)), + (LBZX xaddr:$src)>; +def : Pat<(i32 (extload iaddr:$src, i1)), + (LBZ iaddr:$src)>; +def : Pat<(i32 (extload xaddr:$src, i1)), + (LBZX xaddr:$src)>; +def : Pat<(i32 (extload iaddr:$src, i8)), + (LBZ iaddr:$src)>; +def : Pat<(i32 (extload xaddr:$src, i8)), + (LBZX xaddr:$src)>; +def : Pat<(i32 (extload iaddr:$src, i16)), + (LHZ iaddr:$src)>; +def : Pat<(i32 (extload xaddr:$src, i16)), + (LHZX xaddr:$src)>; +def : Pat<(f64 (extload iaddr:$src, f32)), + (FMRSD (LFS iaddr:$src))>; +def : Pat<(f64 (extload xaddr:$src, f32)), + (FMRSD (LFSX xaddr:$src))>; + // Same as above, but using a temporary. FIXME: implement temporaries :) /* def : Pattern<(xor GPRC:$in, imm:$imm), From natebegeman at mac.com Mon Dec 19 17:40:54 2005 From: natebegeman at mac.com (Nate Begeman) Date: Mon, 19 Dec 2005 17:40:54 -0600 Subject: [llvm-commits] CVS: llvm/lib/Target/PowerPC/PPCAsmPrinter.cpp PPCISelDAGToDAG.cpp Message-ID: <200512192340.RAA09793@zion.cs.uiuc.edu> Changes in directory llvm/lib/Target/PowerPC: PPCAsmPrinter.cpp updated: 1.130 -> 1.131 PPCISelDAGToDAG.cpp updated: 1.144 -> 1.145 --- Log message: Fix a couple of the FIXMEs, thanks to suggestion from Chris. This allows us to load and store vectors directly at a pointer (offset of zero) by using r0 as the base register. This also requires some asm printer work to satisfy the darwin assembler. For void %foo(<4 x float> * %a) { entry: %tmp1 = load <4 x float> * %a; %tmp2 = add <4 x float> %tmp1, %tmp1 store <4 x float> %tmp2, <4 x float> *%a ret void } We now produce: _foo: lvx v0, 0, r3 vaddfp v0, v0, v0 stvx v0, 0, r3 blr Instead of: _foo: li r2, 0 lvx v0, r2, r3 vaddfp v0, v0, v0 stvx v0, r2, r3 blr --- Diffs of the changes: (+10 -5) PPCAsmPrinter.cpp | 9 ++++++++- PPCISelDAGToDAG.cpp | 6 ++---- 2 files changed, 10 insertions(+), 5 deletions(-) Index: llvm/lib/Target/PowerPC/PPCAsmPrinter.cpp diff -u llvm/lib/Target/PowerPC/PPCAsmPrinter.cpp:1.130 llvm/lib/Target/PowerPC/PPCAsmPrinter.cpp:1.131 --- llvm/lib/Target/PowerPC/PPCAsmPrinter.cpp:1.130 Mon Dec 19 17:25:09 2005 +++ llvm/lib/Target/PowerPC/PPCAsmPrinter.cpp Mon Dec 19 17:40:42 2005 @@ -189,7 +189,14 @@ O << ')'; } void printMemRegReg(const MachineInstr *MI, unsigned OpNo) { - printOperand(MI, OpNo); + // When used as the base register, r0 reads constant zero rather than + // the value contained in the register. For this reason, the darwin + // assembler requires that we print r0 as 0 (no r) when used as the base. + const MachineOperand &MO = MI->getOperand(OpNo); + if (MO.getReg() == PPC::R0) + O << '0'; + else + O << TM.getRegisterInfo()->get(MO.getReg()).Name; O << ", "; printOperand(MI, OpNo+1); } Index: llvm/lib/Target/PowerPC/PPCISelDAGToDAG.cpp diff -u llvm/lib/Target/PowerPC/PPCISelDAGToDAG.cpp:1.144 llvm/lib/Target/PowerPC/PPCISelDAGToDAG.cpp:1.145 --- llvm/lib/Target/PowerPC/PPCISelDAGToDAG.cpp:1.144 Mon Dec 19 17:25:09 2005 +++ llvm/lib/Target/PowerPC/PPCISelDAGToDAG.cpp Mon Dec 19 17:40:42 2005 @@ -454,8 +454,7 @@ return true; } - // FIXME: This should be a CopyFromReg R0 rather than a load of 0. - Base = CurDAG->getTargetNode(PPC::LI, MVT::i32, getI32Imm(0)); + Base = CurDAG->getRegister(PPC::R0, MVT::i32); Index = Select(N); return true; } @@ -470,8 +469,7 @@ return true; } - // FIXME: This should be a CopyFromReg R0 rather than a load of 0. - Base = CurDAG->getTargetNode(PPC::LI, MVT::i32, getI32Imm(0)); + Base = CurDAG->getRegister(PPC::R0, MVT::i32); Index = Select(N); return true; } From evan.cheng at apple.com Mon Dec 19 18:06:29 2005 From: evan.cheng at apple.com (Evan Cheng) Date: Mon, 19 Dec 2005 18:06:29 -0600 Subject: [llvm-commits] CVS: llvm/utils/TableGen/DAGISelEmitter.cpp Message-ID: <200512200006.SAA09902@zion.cs.uiuc.edu> Changes in directory llvm/utils/TableGen: DAGISelEmitter.cpp updated: 1.105 -> 1.106 --- Log message: Lefted out a fix in the previous check in. --- Diffs of the changes: (+7 -1) DAGISelEmitter.cpp | 8 +++++++- 1 files changed, 7 insertions(+), 1 deletion(-) Index: llvm/utils/TableGen/DAGISelEmitter.cpp diff -u llvm/utils/TableGen/DAGISelEmitter.cpp:1.105 llvm/utils/TableGen/DAGISelEmitter.cpp:1.106 --- llvm/utils/TableGen/DAGISelEmitter.cpp:1.105 Mon Dec 19 16:40:04 2005 +++ llvm/utils/TableGen/DAGISelEmitter.cpp Mon Dec 19 18:06:17 2005 @@ -2134,7 +2134,13 @@ } } - OS << " return Result.getValue(N.ResNo);\n"; + // FIXME: this only works because (for now) an instruction can either + // produce a single result or a single flag. + if (II.hasCtrlDep && NumImpResults > 0) + OS << " return (N.ResNo) ? Chain : Result.getValue(1);" + << " // Chain comes before flag.\n"; + else + OS << " return Result.getValue(N.ResNo);\n"; } else { // If this instruction is the root, and if there is only one use of it, // use SelectNodeTo instead of getTargetNode to avoid an allocation. From bpankaj2 at cs.uiuc.edu Mon Dec 19 18:16:54 2005 From: bpankaj2 at cs.uiuc.edu (Balpreet Pankaj) Date: Mon, 19 Dec 2005 18:16:54 -0600 Subject: [llvm-commits] CVS: llvm-www/pubs/2005-TR-DSAEvaluation.pdf 2005-TR-DSAEvaluation.ps Message-ID: <200512200016.SAA08164@apoc.cs.uiuc.edu> Changes in directory llvm-www/pubs: 2005-TR-DSAEvaluation.pdf updated: 1.1 -> 1.2 2005-TR-DSAEvaluation.ps updated: 1.1 -> 1.2 --- Log message: --- Diffs of the changes: (+7029 -10849) 2005-TR-DSAEvaluation.pdf | 0 2005-TR-DSAEvaluation.ps |17853 ++++++++++++++++++---------------------------- 2 files changed, 7029 insertions(+), 10824 deletions(-) Index: llvm-www/pubs/2005-TR-DSAEvaluation.pdf Index: llvm-www/pubs/2005-TR-DSAEvaluation.ps diff -u llvm-www/pubs/2005-TR-DSAEvaluation.ps:1.1 llvm-www/pubs/2005-TR-DSAEvaluation.ps:1.2 --- llvm-www/pubs/2005-TR-DSAEvaluation.ps:1.1 Fri Dec 16 11:44:27 2005 +++ llvm-www/pubs/2005-TR-DSAEvaluation.ps Mon Dec 19 18:16:30 2005 @@ -1,7 +1,7 @@ %!PS-Adobe-2.0 %%Creator: dvips(k) 5.90a Copyright 2002 Radical Eye Software %%Title: dsa-evaluation-tr.dvi -%%Pages: 25 +%%Pages: 24 %%PageOrder: Ascend %%BoundingBox: 0 0 612 792 %%DocumentFonts: CMR17 CMR12 CMTI12 CMSY10 CMTT12 CMBX10 CMR10 CMTI10 @@ -11,7 +11,7 @@ %DVIPSCommandLine: dvips -o dsa-evaluation-tr.ps dsa-evaluation-tr.dvi %+ -t letter %DVIPSParameters: dpi=1200, compressed -%DVIPSSource: TeX output 2005.12.16:1021 +%DVIPSSource: TeX output 2005.12.19:1802 %%BeginProcSet: texc.pro %! /TeXDict 300 dict def TeXDict begin/N{def}def/B{bind def}N/S{exch}N/X{S @@ -4093,12 +4093,12 @@ 134[81 4[55 68 2[85 1[93 136 42 76 1[51 2[51 76 85 76 1[85 97[{}14 166.044 /CMTI10 rf /Fm 133[74 88 88 120 88 92 65 65 65 88 92 83 92 138 46 88 51 46 92 83 51 74 -92 74 92 83 9[171 1[125 120 92 2[113 3[104 2[60 1[130 -108 1[127 120 118 125 6[46 83 83 83 83 83 83 83 83 83 -83 1[46 55 46 2[65 65 46 26[92 97 11[{}58 166.044 /CMR10 -rf /Fn 137[101 106 74 75 79 2[95 106 159 53 101 1[53 -106 2[88 106 85 106 93 13[106 3[143 149 1[115 150 1[72 -1[150 2[146 138 136 144 29[159 35[{}29 166.044 /CMBX10 +92 74 92 83 9[171 1[125 120 92 2[113 1[125 1[104 2[60 +1[130 108 1[127 120 118 125 6[46 83 83 83 83 83 83 83 +83 83 83 1[46 55 46 2[65 65 46 26[92 97 11[{}59 166.044 +/CMR10 rf /Fn 137[101 106 74 75 79 2[95 106 159 53 101 +1[53 106 2[88 106 85 106 93 13[106 3[143 149 1[115 150 +1[72 1[150 2[146 138 136 144 29[159 35[{}29 166.044 /CMBX10 rf /Fo 137[103 103 103 103 103 1[103 103 103 103 103 103 103 103 103 2[103 103 103 103 103 32[103 13[103 3[103 1[103 44[{}23 199.253 /CMTT12 rf /Fp 152[100 100 102[{}2 @@ -5404,9 +5404,9 @@ b(cal)59 b(data)h(structures)f(called)f(conditional)g(table)h(are)h (also)f(created)h(recursiv)-5 b(ely)58 b(in)i(this)f(function.)-240 1721 y(But)h(it)g(is)g(not)g(passed)g(on)g(to)h(the)f(recursiv)-5 -b(e)59 b(call)h(as)g(an)g(argumen)-5 b(t.)p 244 1962 -7313 7 v 244 4766 7 2804 v 300 4716 a @beginspecial 89 - at llx 563 @lly 507 @urx 720 @ury 4320 @rwi @setspecial +b(e)59 b(call)h(as)g(an)g(argumen)-5 b(t.)p 360 1962 +7080 7 v 360 4678 7 2717 v 417 4628 a @beginspecial 89 + at llx 563 @lly 507 @urx 720 @ury 4180 @rwi @setspecial %%BeginDocument: Figures/fpgrowth_cbu1.ps %!PS-Adobe-3.0 %%Pages: (atend) @@ -6016,49 +6016,49 @@ %%EOF %%EndDocument - @endspecial 7550 4766 V 244 4773 7313 7 v 1725 5108 + @endspecial 7433 4678 V 360 4685 7080 7 v 1725 5020 a(Figure)60 b(2:)80 b Fm(CBU)54 b(graphs)j(of)e(main)h(data)f -(structures)h(in)g(fpgro)-5 b(wth)42 5581 y Fj(The)80 +(structures)h(in)g(fpgro)-5 b(wth)42 5493 y Fj(The)80 b(part)g(of)f(CBU)h(graph)g(of)f(main)g(function)f(sho)-5 b(wing)79 b(the)g(parts)h(corresp)5 b(onding)79 b(to)g(the)g(imp)5 -b(ortan)-5 b(t)78 b(data)-240 5855 y(structures)c(is)g(sho)-5 +b(ortan)-5 b(t)78 b(data)-240 5767 y(structures)c(is)g(sho)-5 b(wn)75 b(in)f(Figure)h(2.)123 b(Fptree)74 b(data)h(structure)f(con)-5 -b(tains)73 b(tree)p 5332 5855 55 7 v 65 w(no)5 b(de)75 -b(structure)f(instances)f(forming)-240 6129 y(the)c(tree.)106 +b(tains)73 b(tree)p 5332 5767 55 7 v 65 w(no)5 b(de)75 +b(structure)f(instances)f(forming)-240 6041 y(the)c(tree.)106 b(The)70 b(\014gure)f(also)g(sho)-5 b(ws)69 b(header)g(arra)-5 b(y)-15 b(,)71 b(whic)-5 b(h)69 b(forms)f(a)i(link)-5 -b(ed)68 b(list)g(of)g(tree)p 6049 6129 V 65 w(no)5 b(de)70 -b(ha)-5 b(ving)68 b(same)h(lab)5 b(el.)-240 6403 y(This)63 +b(ed)68 b(list)g(of)g(tree)p 6049 6041 V 65 w(no)5 b(de)70 +b(ha)-5 b(ving)68 b(same)h(lab)5 b(el.)-240 6315 y(This)63 b(\014gure)h(also)f(sho)-5 b(ws)63 b(the)h(structure)f(of)g(the)h (large)f(item)f(table)h(in)g(main)g(function.)88 b(These)64 -b(data)f(structures)g(are)-240 6677 y(lo)5 b(cal)78 b(to)g(main.)135 +b(data)f(structures)g(are)-240 6589 y(lo)5 b(cal)78 b(to)g(main.)135 b(DSA)79 b(correctly)f(iden)-5 b(ti\014es)77 b(them)h(as)h(lo)5 b(cal,)82 b(as)d(eviden)-5 b(t)77 b(from)i(the)f(absence)g(of)h("G")f -(\015ag.)136 b(The)-240 6951 y(no)5 b(des)73 b(also)g(con)-5 +(\015ag.)136 b(The)-240 6863 y(no)5 b(des)73 b(also)g(con)-5 b(tain)72 b(accurate)h(t)-5 b(yp)5 b(e)73 b(information)e(without)i(b)5 b(eing)72 b(collapsed.)118 b(But)73 b(the)g(DSA)g(is)g(unable)g(to)g -(\014nd)-240 7224 y(disjoin)-5 b(t)55 b(instances)g(of)i(main)f(and)g +(\014nd)-240 7137 y(disjoin)-5 b(t)55 b(instances)g(of)i(main)f(and)g (lo)5 b(cal)56 b(fptree)g(data)h(structures)f(due)h(to)f(limited)f(con) -5 b(text)56 b(sensitivit)-5 b(y)54 b(in)i(recursion.)-240 -7498 y(This)74 b(is)g(also)g(the)h(case)f(with)g(large)g(item)g(table,) +7411 y(This)74 b(is)g(also)g(the)h(case)f(with)g(large)g(item)g(table,) i(as)f(it)f(is)g(also)g(a)h(recursiv)-5 b(e)73 b(argumen)-5 b(t)74 b(ob)10 b(ject)74 b(lik)-5 b(e)74 b(FPtree.)121 -b(But)-240 7772 y(DSA)59 b(iden)-5 b(ti\014es)57 b(disjoin)-5 +b(But)-240 7685 y(DSA)59 b(iden)-5 b(ti\014es)57 b(disjoin)-5 b(t)56 b(lo)5 b(cal)58 b(conditional)e(table)i(data)g(structures,)f(as) i(they)f(are)h(non-recursiv)-5 b(e)57 b(ob)10 b(jects)57 -b(\(i.e.)78 b(not)-240 8046 y(passed)60 b(as)g(argumen)-5 -b(t)60 b(to)g(recursiv)-5 b(e)59 b(calls\).)-240 8583 -y Fg(4.3)225 b(Metrics:)-240 8974 y Fj(The)61 b(v)-10 +b(\(i.e.)78 b(not)-240 7959 y(passed)60 b(as)g(argumen)-5 +b(t)60 b(to)g(recursiv)-5 b(e)59 b(calls\).)-240 8495 +y Fg(4.3)225 b(Metrics:)-240 8886 y Fj(The)61 b(v)-10 b(alues)59 b(of)h(the)g(describ)5 b(ed)60 b(metrics)f(for)h(fpgro)-5 -b(wth)60 b(are)h(-)-240 9248 y(N=3)-240 9522 y(Three)71 +b(wth)60 b(are)h(-)-240 9160 y(N=3)-240 9434 y(Three)71 b(SDSI)f(w)-5 b(ere)70 b(found)g(in)g(this)g(co)5 b(de.)109 b(The)71 b(data)f(structures)g(include)f(one)h(fptree,)h(one)g(large)f -(item)f(table)g(and)-240 9796 y(one)60 b(conditional)f(table)g(data)h -(structure.)-240 10070 y(G=0)-240 10344 y(No)h(SDSI)f(w)-5 -b(as)61 b(global)e(in)h(this)g(case.)-240 10617 y(L=3)-240 -10891 y(All)g(data)g(structures)g(w)-5 b(ere)60 b(correctly)g(pro)-5 +(item)f(table)g(and)-240 9708 y(one)60 b(conditional)f(table)g(data)h +(structure.)-240 9982 y(G=0)-240 10256 y(No)h(SDSI)f(w)-5 +b(as)61 b(global)e(in)h(this)g(case.)-240 10530 y(L=3)-240 +10804 y(All)g(data)g(structures)g(w)-5 b(ere)60 b(correctly)g(pro)-5 b(v)g(ed)60 b(to)h(b)5 b(e)60 b(lo)5 b(cal)59 b(b)-5 -b(y)61 b(DSA.)-240 11165 y(K=9)3855 11672 y(9)p eop end +b(y)61 b(DSA.)-240 11078 y(K=9)3855 11672 y(9)p eop end %%Page: 10 10 TeXDict begin 10 9 bop -240 77 a Fj(The)61 b(main)e(data)h(structures)g (consist)f(of)h(9)h(no)5 b(des.)-240 351 y(I=0)-240 625 @@ -6154,17 +6154,17 @@ b(t)p 7521 11092 V 64 w(struct)3809 11672 y(10)p eop end %%Page: 11 11 -TeXDict begin 11 10 bop -240 -99 8513 7 v -240 4060 7 -4160 v -184 4011 a @beginspecial 8 @llx 446 @lly 577 - at urx 721 @ury 5040 @rwi @setspecial +TeXDict begin 11 10 bop -240 -99 8580 7 v -240 4417 7 +4517 v -184 4367 a @beginspecial 89 @llx 455 @lly 597 + at urx 720 @ury 5080 @rwi @setspecial %%BeginDocument: Figures/espresso_cbu1.ps %!PS-Adobe-3.0 %%Pages: (atend) -%%BoundingBox: 8 446 577 721 -%%HiResBoundingBox: 8.949609 446.999609 576.050000 720.050000 -%..................................... +%%BoundingBox: 89 455 597 720 +%%HiResBoundingBox: 89.999219 455.999609 597.000000 720.000000 +%................................... %%Creator: AFPL Ghostscript 850 (pswrite) -%%CreationDate: 2005/12/02 01:46:05 +%%CreationDate: 2005/12/16 14:35:55 %%DocumentData: Clean7Bit %%LanguageLevel: 2 %%EndComments @@ -6227,10 +6227,10 @@ gsave mark Q q 0 0 6120 0 0 7920 ^ Y -q[5542.8 0 0 2730 179.995 4470]concat -739 364 8[739 0 0 -364 0 364][/Indexed /DeviceGray 255 -0Fzzzzzzz -zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz -zzzzzzzzzzzzzzzzzzzzz!!!!2&.fB]zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz -zzzzzzzzzzzzzzzzzzzzzzzzzz((_#mzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz -zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!!ZD&/P#R18/$3^D5!rrB.z!!!!*#R(2.z!!!!/#64o:$Om7>z!!!9.!!N]0!!ii1!!!-&$31&5 -"TST)"98E%zzz!!**#zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!z!!!32"9Ao2%KQP>#R(23$31&+z%06S3zz#7^_A#n$h:z!!!K0"98f7!!`N0!!!!* -!=f)>!<<*-#ljr*zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz -zzzzzzzzzzzz!!!$#zzz!!!!%!sAW5"pFu,!!EQ-zzzzz$46b5z!XJc+!!!!+"TSr3%KZn9z!"9/; -%0-A.z!!!<1!!!N1"TSN&z!!z!!N]0!!!!/!<<*1$315:z!!!3, -#nI"9z!!!E5%KHJ!"9;Dzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz -zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!*'"zzz!!!!,!=B5B!!!!-#QXr,!C!s/H.#64`(!"&`5%KHJ6"Tnf+"U>&%KQV3!WW3#zzzzzzzzzzzzzzzzzzzzzzzzz -zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!!!"zzzz!!!!'"TSW/%0Ze= -!!!01%h8RH$31,.!W`<&!=f,3!"'&7!5$O$P3!=/i:!"K#>$NU8/$315:z%KQP0!!!!&$31&+ -!!!'$!!<zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz -zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!!$"zzzz!"958!!#-%KQ\4z!!!B1zzz!!if0"p586 -$NL5/"TSl:!!!?0!!NW2zzzz!!!$"zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!!$"zzzz -!!!0,!!Nf9!rr]4!!!'$"TSN."TSu8"Utk?!!`T/#6>;@$31&+!!N]0!!!!/!<<*"!!!0/!!!K8 -!!s,8!!`c!"9,?zzzzzzzzzzzzzzzzzzzzzzzzzz -zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!*'"zzzz#n?q8#6>8B%KR"I -!"T86!"&u4#Qt,2!,/$k34B!"&`3!!!H:!!!91!=]G;$NU87!"/f:!=0/E!!"B5A$31&5!H!tPV=!!3E+z$3:/.#64f2z!!!<7 +!"K/4z!!!!-#64`(!<<*"z!!!!0#ltD6!"9;;%g<"A$31&5"Uke>zzzz!!!!"zzzzzzzzzzzzzzzzzz +zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz +zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!!!"zzzz!!!!'"TSW/%Kun>!!!02$P*4E$31,.!W`<& +!=o24!"'&7!zzzz!!!!"zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz +zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!!!"zzzz +!!!H:!!!**%Kun9!!!H1$ig87$igYD"9Sc,!!!93!!io7!sAT(!!3E+z$3^D0!!!'&!!!!-%0Zt: +!"T)5z!!!!-"TSN&zz!!!90!!WN7!"8i/!H.KBGKzzzzzzzzzzzzzzzzzzzzzzzzzzzz -!!C -!s/H.#64`("T]#3z!!`Z0!WWB/!=f)>! -$31/4!!*Q0!!3N.z!!!!&!=Sr.!!W`?&zzz!<<*"zzz!!**#zzzzzzzzzzzz -zzzzzzzzzzz!!**$!1"98E%zz!!!<+"TSN)!WWH1!"/l/%KR%>%KQP<#RUP3zz!!!$"zzz!!!$" -zzzzzzzzzzzzzzzzzzzzzz!!**$zzzzzzzzzz!!!$#!<<*"zzzzzzzz!!!!"!#6=i+z!!!0'"98E%zzz!!!K0!/3z!!`c0z!Y#/2!sJZ*!=/Z5 -$jm"9$46e7$31M9$NL/,zzz!!*'"zz!!!!"zz!!!!&!=9#4"T\W-!4%KQS2%KHJ/#R(29#lk#4z!!!6/%KR%>z!!!0'!F!tGP<$j-\D!s]&?!"'#4!XJc+!!!!)!!sS`*zzzz!!!$"zzzzzzzzz!!!!"zzzzzzzzzzzzzzzzzzzzzz!<<*"zz!!!$"zz -zzzzzzzzzzzzzzzzz!<<*"zz!!!$"zzzzz%LN1B%hAsH!=f)$O$n=!"Utk?!!!'+z!!iW+!!!!#!rr<$$Od1D!!!K0"98E%z$O$M1z!"K#0!!!?0!!!B,!W`H)$46b5 -$3^D5#Qt,-zzzz!!*'"zzzzzzzzz!!!$"zzz!!!!,!=Af,$k!%F!=/Z*zzzzzz!!!$*zzzzzzz!!!!" -zzz!!*'"zzzzz!W`B+!!!0,z!!!!,!=f)0zzzzzzzz!!!!"zzz!!*'"zzzz!!!!+%KHeG%g`4:"98E* -!!!!K0#QY84 -%LiF>"V(tB%06e;!s&K*#QXr+!!!$#zzz!!!!"zzz!!!B-$31&7$NL/,zzzzz!!NB("TSN&!!`l3zz -!!!$"zzz!!!$#zzz$NUS7!"958zzzzz!!!!"!=f)0!W`<,z!!iW+"T\r1!!!B-%1E4H#QY2 at zz!!**# -zzz!!**#zz!!!!#!zzzzzz!!!$"zzz!!**#zzz"9T,7$igVE!!!!&zzzzz$NL/,zzzz!!**#zzz!!*'"zz -!!!-(%KQt<$4[%9!!N?&zzzz!!!!"%KHJ8!!`c0zz"UY50#6Fl2#65)=!"0,6zz!!*'"zzz!%fcS0!!N?&zzzz!!!00!!!6*!!if0zzz!!!!"!<<*"zz!!!!"zzzzzzz!!!!,!!"TM=#mUG1zz!<<*"zz -!!!!"zzz!!rf9%fctG!!!!&$31&+zzzz!!N]0!!!!#%1W@"T]&@#6PA=!=fA>%KQ\A$4Hn7!=f)0z -%KQbD!s\l0"9f57!!!3/!"B8D!!`r5$4-\4zz!!!!"zzz!!*'"zzzzz!!!!/%h&^E#65#?!"B88 -!=&`.$ig89!=f;C#64`0"qCY:zzzz!!!!"zzz!!*'"zzzzzzzzzzzzzzzz!<<*"zz!!!!"zzz!!!!, -!=B5B!!!!-#QXr6!=Ai:#6>86#QY;6$NL/,!!!E6!tG;2!!30.zzz!<<*"zz!!!!"zzz!"/f7$jlt7 -!"9,6!=Jo8!=]87%0-Y7$NUV8z!!*Q0!!!9,!WW3#!"/f;!!!00!!!!(!=Jl-$k3:Bzz!!!!"zzz -!!!$"zzz!W`B+"TeZ(!!E<'!"T\W)#QOi)zz!!!$"zzz!<<*"zzzzz!!!B8 -"UtY$jZk=!!N]0"UGMD%1EOM!"'/8%gW.8!!!!&$31&+!"KGAz!XJc+zz!!*'"zzz!<<*"zz!!!!"z -zz!!*'"zzz!<<*"zz!!!!"zzz!!!$"zzz!<<*"zz!!!!"zzz!!!$"zzz!!*'"zz!!!!"zzzzzzzzzz -!<<*"zzz!!!E8!!!**%0Zt=$jHeB!s\f+!!3Q6$NL21z!!!K0!Y,;6!XJc2#QP,6"UG)0$jR.D%1E4: -zzz!!*'"zz!!!!"zzzzzz"U4r1%0cn7#R(2;"TSQ5%KR%H$NpJ?!!WE/!WrZ-zzzzz!!*'"zz!!!!"z -zz!!!$"zzz!!*'"zz!!!!"zzz!!!$"z!!!$"zzz!!**#zzz!!!!'"TSW/%0Ze=!!!$$!!*Q0!=fS? -%KHk?z!!!0+z"UY50zz!!!$"zzz!!*'"zzz!!WT,!sT2%KR%>$O$M1!!!!" -%KHJ/!!!97z!=f)0"UY50!!!!($31D:!!rr3zz!!*'"zzz!<<*"zzz!"02=%0cn7"UY55$NL>;!!N]0 -$46b7!<<*"!!!00z!!`i2!!!!##QOi)zz!<<*"zz!!!!"zzz!!!$"zzz!<<*"zz!!!!"zzz!!!$"zzz -!!*'"zz!!!!"zzz!!!$"zzz!!*'"zzz!<<*"zz!!!$"zzzzzzzzz!!!!"zzzz!!s,8!!`N6$igY9 -#Qau-!s&K*$4$Y;!!iZ0z!"K#8!=Af-!=Jo/$4?kF!=&r;!=&T4!!zzz -zzzzz!!!!"zzz!!*'"zzzzzzz!!!90zzzzzzzzzz!!!!"zzz!!*'"zzz!<<*"zz!!!!"zzz!!*'"zzz -!<<*"!!!$#zzzz!8B%KR"H!zzz -zzzzzzzz!!!!"!<<*"zzz!!!!"zzzzzzzz!"'&5zzzzzzz!!!!"zzzz!<<*"zz!!!!"zzz!!*'"zzz -!<<*"zz!!!!"zzz!!!$"zzz!<<*"zz!!!!"zzz!!!$"zzz!!*'"zz!!!!"zzzzzzzzzz!<<*"zzzzzz -zzzzzzzzzzzzzzz!!*'"zz!!!!"zzzzzzzzzzzzzzzzzzz!!*'"zz!!!!"zzz!!!$"zzz!!*'"zz -!!!!"zzz!!!$"!!!$#zzzzz!#eR -&.fBa&.fBa&.fBa&.fBa&.fBa&.fBa&.fBa&.fBa&.fBa&.fBa&.fBa&.fBa&.fBazzzzzzzzzzzzzz -zzzzzzzz!!**$!G!qz!!**$!bNzzzzzzzz!!";s!?qLD!0zzzz!!!$#zzzzzz!<<*"zzzz!<<*"zzzzzz -!!!--zzzzzzzz!!!63!!!!)!WW]D"TST- -#R:>0#QXr5$ig8-zzz!!**#zzzzzzzzzzzzzzzzzzz!!!!"zzzzzz#6k;3!sAf;#64`-$315=$igG< -!"&lD!sB)>%fctB!"0#?!<`T4z!!!34 -#64`-$31,0"98T4!"&l;5!"&l;$NL/,zzzzz!<<*"zzz -zz!!**#zzzzzzzzzzzzzzzzzzzzzzzzzzz!<<*"zzzzz!!`]2!!sAT*!sAT(!!W]/!Wri9"onW'z#7CM3!!iW+ -%LNCG!!s&>#64`0"p5#/zzzz!!*'"zzzzzzzzzzzzzzzzzzz!!!$"zzzzz!!!K9!!s/H#n@@K%fcb? -!!N]0!!N]0$3^J:z$O6Y3!!!-)#n-e;$P*^I"Ub;6$315:!"'&5!W`?'!!!01!"0#3$O6_=zz!"KDB -%fcb?!!3E+!!N]0$3^J:z"UY50z!!!9+!!!63!!!?9#7V"M#7(;0$3^nA"onW'zzzz!!!!"zzzzzz -!!*'"zzzzzzzzzzzzzzzzzzzzzzzzzz!!!!"zzzzz!!!!/$31AC%g`^S#7ge<$31,5!!!00!"&l2 -#QOi)!!N]0!!!!%$jd%:!WrZ4!!30$!XJc-#QP2=!!30&!<<*'$NLP>!!N]0!=f)0z!!!!%":5J< -#QOi*%KHP9!!`l3!=f)0!!N]0z!!!!)!WW3*$NL/6%L3FM%L37>!!`l3%1`F=zzzzz!<<*"zzzzz -!!!$"zzzz!!*'"zzz!!*Q>!<<*#%KHM>%KR%@#QOi)!!!0.!=f/:!!!'+!!!E7!=/Z*$O$h:z!!!!( -$NL/,#Qau9$31>8$31>:!!!9+"p5>8zzzz!<<*"zzzzzzzzzzzzzzzzzzz!!*'"zzzzz!"'29#nIOQ -!!WE/!X/l1"UY50"UPSC"V(P;!!N]0$4?hE$Od%>!"/r1 -$O6Y>#7^b>zz!!WE/!X/l1!XJc+"UPSC"V(P!=f/5z$4?t;%KZn9!!3E+!!i`3 -#QOi+!)2!2!/4!=Jl1!=/u4!X/T*$Od7@$3ph:!!!!) -!#-"9S`/#7:J@$jQe?!9zz -zzzzzzzzzz!!*'"zzzzzzzzzzzzzzzzzzz!!!$"zzzzzzzzzzzzzzz!!!B-!WW3#zzzzzzz!!!!, -!L -,6.]Dzzzzzz!!"5h!!!$#!<<*"zzzzzzzzzzzzzzzzzzzz!!!!"!<<*"zzzzzzzzzzzzzzzzzzzzzzz -zzzzz!%J!M-3+#Gzzzzzz!%9,n!!!$#!<<*"zzzzzzzzzzzzzzzzzzz!!**#zzzzzzzzzzzzzz!!**$ -!<<*"zzzzzzzzzzzzzzzzzzzzzz!%IsK!!**$zzzzzzzzzzzzzzzzzzzzz!!!$#zzzzzzzzzzzzzzzz -zzzzzzzzzzzzzzz-35Fnzzzzzzz,:k8E!Jzzzzzzzzzzzzzzzzzzzzz!$k!%8z!!!66zzzz"TSN&zzzzz%KR%>zz!XJc+zzz!!!$0z!"K#>zz!!*Q0zz!!!K6zzzz -#7^_6z!!`l3!!!9+!"K#:!!!!&!=&T)#Qau0!rr<$zzzzz!!*'"zzzzz!!!$#z!<<*#!<<*"zzzzz -!s/`4%LN19z!!!00zzzz#mUG1zzzzz!"'&5zz!"0#3zzz!!!B3z!!!?5zz!!N]0zz!!!00zzzz"UY50 -z!!!9+!!!63!!!?6%fcS7$O?_4#7CM7#R:>0zzzzz!!!$"zzzzz!!!!"z!zz!=f)0zz!!rl1zzz -!!!E5%KHJ/z#7CM3!!iW+%LW:G!!!B4#64`0!WWQ5zzzzzz!87 -!!EQ.#Qt,2$31)4!"9;;#S$h7z!XJc6!=fMD!so,3!$NL\C$j-VB#S-nC#65,:$ipJ8#QOi)z$O6Y3!"TD:$4?hE#R:e=$4-\9$31&+!!!!- -!sJZ)"UY52!sAT-$31D:$ipJ8#QP#8zz#Qau+#7CM3$4[LM!X/f7!!!63"To/5zzzzzz!:$jH_B$O$M<%0-P=!!3E+%g`4F#64`(!!!!##QOi*%L*@I!!!B3z!!!E0"TSN(#QOi* -#64f2!!`l3%0[4D%L!1>z!!!!)!WW3*$NL/6%LiXE"U>;5!!`l8!t5/0zzzzz!!!!"zzzzz!!!!" -!<<*"!<<*"zzzzzz#lk84$31MB$ig8.%KHkD!!!$0%KQP?#lkD>!XJc+!!!34#64`-$NLMB!!*65 -!=&`.%LrL@%Kcq>#lk,0$j$\7!!*Q6#Rh4Nz!!!!"%KHJ/%0m at D!Y,;;$4d+B"TSQ5z!!!N;"98E0 -#64o:$igY?!!iW1#Rh4N!!*Q0z!!!63!!!!)!WW];"pb28$j[(!"0#5#QOi)z!!!!,#64l5!=Af6$31,."T\W)#QP#8z -!!!!%":5J?$31,5!!!00!"&l2#QOi)!!N]0z!!!!)!WW3*$NL/6%L3FM%L37>!!`l3%1`F=zzzzz -!!!!"!<<*"zzzzz!!*'"!!*'"zzzzz!!!!,$j@(E!rrH4#m:;8!!!$0!!3E+#7CM4%KHJ/!XJc+ -!!!-%$3pP>!sT)4!!*-$!=f)1%L37>!!*-%!WW9&!!N]0!XJc6#64`(z!!!'+!!!$0%L`RQ!"0#3z -!!!-)#n-k@!!!$0!!3E+#7CM4%KHJ/"UY50z!!!9+!!!63!!!?9#7V"M#7(;0#7CM@%fcS0zzzzz -!!!$"zzzzz!!!!"!!!!"zzzzzz!!!N4"9Au5"9],>"98H4!"0#3!!*Q>!<1!%KR%>$O$nA!!!$$!XJc+!=f8?zz!!!$0!!`r6#7^bE!"/r9#R(P8#R:>0#Qb24%KHJ/zzzzz!!!$"zz -zzzz!<<*"!<<*#zzzzzz!!!?9!!s/H#lk/0#Qb/9!!N]0!!NZ;#R(\=#64`($O$M1!!!3'$3^D< -!t,)/"Ub;6$315:!"')6%grdH"TSo6!"0#3$O7.B#64`(z!!!B3%KQV;$31D@!"TG@%1E4:!!N]0z -!!!3'$3^S>!!3E+!!NZ;#R(\=#64`("UP//z!!!9+!!!63!!!?9$j-e9#7(;0#7CM7!=&T)zzzzz -!!!!"zzzzzz!<<*"!<<*"zzzzz!!NQ,"UtY!!!!#!rr<$!"K,A -!<<*'!#6PA=!t5VH!!N`1"UY52#QP2@$ig8-z!!3E+!!*Q0"ono1$O$M1z!!WE1 -"Tec+!!*Q0!WrE/$NLG>!!!!&#ljr*z!!iW+!!`l3!"'2E!snr4#QOi0$NL;1#64`(zzzzz!!*'"zzz -zz!!!$"!!!$"zzzzzz":kJ8!=f,5!Xo;A!!*3&$O6Y3!<`Q,!"'/D!!!'&z!!WE/!WWB)!WW3$!WW62 -!!*Q>!!<`B.#64`0!WWN9$ig8-zzzzz!!*'"zzzzz!!!!"!!!!" -!!!$"zzzzzz"U>#-"9S`/#7:J@$jQe=!!WW6%$4?k?!"/f0$31&+!!!!,!=/`-%16":>J9!!!6)!=Jl5!2#7^h:"TSN&zzzzz!<<*"zzzzz!!!$"!!!$"!!*'"zzzzzzzzzzzzzzzz!!!B,zzzzzzzz -zzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!*'"zzzzz!!!!"!!!$"zzzzzzzzzzzzzzzz!!``/zzzzzzzzz -zzzzzzzzzzzzzzzzzzzzzzzzz!!!!"zzzzzz!<<*"!<<*"zzzzzzzzzzzzzzzz#6t5/zzzzzzzzzzzz -zzzzzzzzzzzzzzzzzzzzzzzz!!!!"zzzzzz!!*'"!!*'"!<<*"zzzzzzzzzzzzzzz!!!!,!!zzzzzzzzzzzzzzzzz +zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz +zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz*?5%Zzz +zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz +zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz +zzzzzzzz+!^gdzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz +zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz +zzzzzz!!!iT+!=fVF!>8 +zzzz!!**#zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz +zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!!!"zzzz!!!N8 +!=&`2!!!!%!!"&`-#m:5.zzzz!!!$"zzzzzzzzzzzzzzzzzzz +zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz +zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!!!"zzzzz!!!<*#ltA5"UY5=!s/u@!"'29$O at 7F%gN1G +!sT8<#6t_=$4-\6#QOi)!!!9*!=/f.!XJc+z#n6kE"TSN&z!"9)4z!!!N1!!!!+"TSN2%06tC!X]87 +!"&l<$ig8-zzzz!!!$"zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz +zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!!!"zzz +zz!"/o4!=o26"UY50"UkbL!"'&5!W`?'!/3!"/u2!"&u4#Qt,2!!=98;!#eR&.fBa&.fBa&.fBa&.fBa&.fBa&.fBa&.fBa&.fBR +!zzzzzzz!!!!"!Jzzzzz!!"&f!c!/3zz"T\i.#7LS4zzzzzzzzzz!!iT+!XA`,$k*.Fz +"T\l6!0zzzz!!!$#zzzzzz!<<*"zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz +zz!=B&4"TSc.!!"9)6!=Af0#QY>6z!!!<+%Km%< +!=Su4!:!!=o/1!!!9*!5:"UG).#6=i8#64`(zzzz!!!!"zzzzz +z!zzzzz!!!$"zzzzz!!!!"!<<*"zzzzzzzzzzzzz +zzzzzzzzzzzzz!!!$"zzzzz!!!!("p=r/"9o>@!!!00!!36*!!N]0$3^k>"9o,3"UY50!!!K9%0-A: +"TSi/!W`E/!sAc5!"',7$O at 1D":kbG!"9)4"UY5>"V1\Gz!"B#6!!!'+!!!$)!!3E+#7LSB"V1\G +"UY50z!!!9+!!!64!!!?:%L3%=#7(;0#7Lb<%0-A.zzzz!!!!"zzzzzz!!*'"zzzzzzzzzzzzzzzzzz +zzzzzzzzzzzzzzzzzzzzzzzzzzzz"UY5:"Ter0!!!!-#64`(!!EE2%0-P?$P*4@$igGzzzzz!!!$"zzzzzz!<<*"zzzzzzzzzzzzzzzzzzzzzzzzzz!!!$"zzzzz!!!N:!!s#@ +#nIIM$NL>;!!3E+!!N]0$3^J:z"UY50!!!-2#m:50!s]&2!W`9&#QOo3!"'&5!W`?'!!!02!"9)4 +"UY51%fcS0z!!!-)#n6qA!!!$1!!3E+#7LS5%fcS0"UY50z!!!9+!!!64!!!?:#7_(O#7(;0#7LSB +$NL/,zzzz!!!!"zzzzzz!!*'"zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz"UPVD +"V1V=!!!!-"TSN&!!WE1"TSu6$ig82$igG +#64`("UP//!!!'0#7LS4$j-q=!W`9&#QOo3!"',7$OdIF"TSr7!"9)4"UY58$31&+z!!!3'$3^J5 +!!!$1!!36&#n-e>$31&+"UP//z!!!9+!!!64!!!?:%0Hn:#7(;0#7LS8!=&T)zzzz!!!!"zzzzzz +!!*'"zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz"9Ac7!7!=TD;z#7:JA%0ln@!$N^P6!=0#5!=Af:!=Sr.zzzz!!!$"zzzzzz!<<*"zzzzzzzzzzzzz +zzzzzzzzzzzzz!!!$"zzzzz!!NT-!!EB+":#87%LiXD$3:/9!!E<.#lt)2!/8$igV?!=&T) +"q(D2!/B!=o/1!!iT+!XA`,$k*.;%grFD!zzzzzzzz!!!$#!<<*"z +zzzzzzzzzzzzzzzz!!!!"!<<*"zzzzzzzzzzzzz!zzzzzzzz!zzzzzz+XeH5!zzzzzz!!"&f!0zzzzz +!!*'"zzzzz!!!$"!!!!"zzzzz!!!!&$jR7B$NpG0z!"B2Ezzz!!!!%#QOi)zzzzz%fm1 at zz!XJc+zzz +!!!$1z!"T)@zz!!*T1zz!!!<1zzz!!!!.#S-n8z!!`o4!!!9+!"TJ=%0-A:#R:>0#Qau5#QOi)zzzzz +!!**#zzzzz!!!!"z!!!!*!=fV@!C#QXr+!!!-&%LWUE!<:!!=o/1!!!9*!5:"UG).#6=i8#64`(zzzzz!!**#zzzzz!!!$"!!!!"zzzzz!!!!0#QY/5"TSN&!!NB5 +#71D3"T\u:!;7%fm(>$ig_H!"T\i8!0#QXr5%0-A.zzzzz!!!$"zzzzz!!!!"z!!!H1"TSN3!s/u@ +!!NW;$4[LO$31DA!"0&A!sB,?$NLS?!"9)A!<`T4z!!!!-#64`($OQk@$igY@#7^_@#lk,9z!!!H1 +"TSN+$31,0"98T4!"&l=!<`T4!!N]0z!!!!)!WW3*$ig87%h8gG"U>;5!!`o9!t>51zzzzz!!!!" +!<<*"zzzzz!!*'"!!*'"zzzzz!!!!0$Om at B#655@%0-G8!!!$)!!3E+#7LSB"V1\G!XJc+!!!B8 +"98E*$igVD!!*66!=&`.%gN1G"p#5C"TSr@!!N]0!XJc6#lkG?z!!!'+!!!$1"qCkF!!!$1!"927!!*T@!<0#R1A7zzzzzz!!!$"zzzzz +!!!!"!<<*"!!!!%":5M;"UkbL!!Nc2"UY55$31D?!!30&!<<*'$ig\@!"9)6#QOi)z!!!!-#64l5 +!=Af6$31,."T\W)#QP#8z!!!!%":5M@$31,5!!!00!"&l2#QOi)!!N]0z!!!!)!WW3*$ig87%gNRO +%gN@?!!`o4%LW7:zzzzz!!!!"!<<*"zzzzz!!*'"!!*'"zzzzz!!!!-%0[4G!rrH5#m:;8!!!$1 +!!3E+#7LS5%fcS0!XJc+!!!-%$3pP?!sT)4!!*-$!=o/2%gN@?!!*-%!WW9&!!N]0!XJc7#64`(z +!!!'+!!!$1%h/aO!"9)4z!!!-)#n6qA!!!$1!!3E+#7LS5%fcS0"UY50z!!!9+!!!64!!!?:#7_(O +#7(;0#7LSB$NL/,zzzzz!!!$"zzzzz!!!!"!!!!"zzzzzz!!!B0"9B#6"9]/?"98H5!"9)4!!*T@ +!<1!@zz!!!$1!!`u7 +#7ghG!"9#>!0 +#Qb24%fcS0zzzzz!!!$"zzzzzz!<<*"!!!!'!"&l0%0I"=!!Nc2"UY55$31DA!"02E!$igYD"V(tA!!!00z!!!!'!"&l5#lk#4!!!0/%1!+J!=&T)!!NZ/z +!!!!)!WW3*$ig87%h/UI!!`c0!!`o4"9A`-zzzzzz!<<*"zzzzz!!*'"!!*'"zzzzz!!!0,!!Ni: +!rrB3#7LY9!!!$1!!36&#n-e>$31&+!WrE&!!!N4%flY1"T\Z)!!*-$!=o/2%gN1G"p5;E$igG> +!!N]0!XJc5%LiC$31&+"UP//z!!!9+ +!!!64!!!?:%0Hn:#7(;0#7LS8!=&T)zzzzz!!!$"zzzzz!!!!"!!!!"zzzzzz!!EZ0"9B#6"9K#; +$ig;2!"9)4!!*3+!<$31&+!!*T1z!"T2C!<0#Qau4%LiC#6=i2#6=i2!"/f.zzzz +zz!<<*"zzzzz!!**#!!*'"zzzzz!!EW/!"BD=#65):!=',9%L`@=!"B27$NUD4!s&l5%fm.L!/B!=o/1!!iT+!XA`,$k*.;%grFD!!XB&5 +%LiCI%KHJ;!%LiRB! +zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz~> Q -255 G -3690 5580 2070 1620 re -f* -4410 5130 990 720 re -f* -89.9961 5400 180 630 re -f* -179.996 5470.8 990 668.398 re -f* -1080 5576.4 990 561.602 re -f* -1160.39 5540.4 195.602 78 re -f* -2049.6 5744.4 230.398 258 re -f* -5709.6 4694.4 21.5977 230.402 re -f* cleartomark end end pagesave restore showpage %%PageTrailer %%Trailer @@ -7557,53 +7266,50 @@ %%EOF %%EndDocument - @endspecial 8266 4060 V -240 4067 8513 7 v 1648 4402 + @endspecial 8333 4417 V -240 4424 8580 7 v 1648 4759 a Fj(Figure)59 b(3:)81 b Fm(CBU)54 b(graphs)i(of)g(link)-5 b(ed)55 b(list)h(of)f(link)-5 b(ed)56 b(lists)g(in)g(espresso)-240 -4953 y Fj(structures)k(etc.)-240 5226 y(G=8)-240 5500 -y(L=14)-240 5774 y(All)g(lo)5 b(cal)59 b(and)i(global)e(no)5 +5303 y Fj(structures)k(etc.)-240 5577 y(G=8)-240 5851 +y(L=14)-240 6125 y(All)g(lo)5 b(cal)59 b(and)i(global)e(no)5 b(des)60 b(w)-5 b(ere)61 b(iden)-5 b(ti\014ed)59 b(correctly)-240 -6048 y(K=148)-240 6322 y(There)i(w)-5 b(ere)60 b(large)g(n)-5 +6399 y(K=148)-240 6673 y(There)i(w)-5 b(ere)60 b(large)g(n)-5 b(um)g(b)5 b(er)61 b(of)f(heap)g(no)5 b(des)60 b(in)g(this)g(case)-240 -6596 y(I=67)-240 6870 y(Man)-5 b(y)61 b(disjoin)-5 b(t)60 +6947 y(I=67)-240 7221 y(Man)-5 b(y)61 b(disjoin)-5 b(t)60 b("`H"')h(no)5 b(des)61 b(w)-5 b(ere)62 b(found,)f(whic)-5 b(h)61 b(signi\014es)f(the)i(large)f(n)-5 b(um)g(b)5 b(er)61 b(of)g(disjoin)-5 b(t)60 b(data)h(structures)g(iden-)-240 -7144 y(ti\014ed)f(b)-5 b(y)60 b(DSA)h(algorithm.)-240 -7418 y(O=0)-240 7692 y(None)g(of)f(the)g(no)5 b(des)60 +7495 y(ti\014ed)f(b)-5 b(y)60 b(DSA)h(algorithm.)-240 +7768 y(O=0)-240 8042 y(None)g(of)f(the)g(no)5 b(des)60 b(w)-5 b(ere)61 b(collapsed)e(in)h(this)f(case.)-240 -7966 y(C=47)-240 8240 y(Large)78 b(n)-5 b(um)g(b)5 b(er)78 +8316 y(C=47)-240 8590 y(Large)78 b(n)-5 b(um)g(b)5 b(er)78 b(of)g(no)5 b(des)78 b(are)h(reac)-5 b(hable)77 b(from)h(a)g (collection.)132 b(This)78 b(pro)-5 b(vides)78 b(a)g(hin)-5 b(t)78 b(on)g(the)h(large)e(n)-5 b(um)g(b)5 b(er)79 b(of)-240 -8514 y(non-trivial)58 b(data)j(structures)e(found)h(b)-5 -b(y)61 b(DSA)g(in)f(espresso.)-240 9424 y Fk(6)269 b(Results)89 -b(for)i(300.t)-7 b(w)g(olf)-240 9886 y Fg(6.1)225 b(Summary:)-240 -10277 y Fj(This)55 b(is)g(a)h(part)g(of)f(the)h(SPEC)f(INT)h(2000)g +8864 y(non-trivial)58 b(data)j(structures)e(found)h(b)-5 +b(y)61 b(DSA)g(in)f(espresso.)-240 9773 y Fk(6)269 b(Results)89 +b(for)i(300.t)-7 b(w)g(olf)-240 10235 y Fg(6.1)225 b(Summary:)-240 +10627 y Fj(This)55 b(is)g(a)h(part)g(of)f(the)h(SPEC)f(INT)h(2000)g (Benc)-5 b(hmark)55 b(kno)-5 b(wn)56 b(as)f(Tim)-5 b(b)5 b(erW)-15 b(olfSC)54 b(placemen)-5 b(t)54 b(and)i(global)f(routing)-240 -10551 y(pac)-5 b(k)-10 b(age.)146 b(This)82 b(b)5 b(enc)-5 +10900 y(pac)-5 b(k)-10 b(age.)146 b(This)82 b(b)5 b(enc)-5 b(hmark)82 b(determines)f(the)h(placemen)-5 b(t)81 b(and)i(global)e -(connections)g(for)i(groups)f(of)h(transistors)-240 10825 +(connections)g(for)i(groups)f(of)h(transistors)-240 11174 y(whic)-5 b(h)82 b(constitute)d(a)j(micro)5 b(c)-5 b(hip.)143 b(The)82 b(placemen)-5 b(t)80 b(problem)h(is)g(a)h(p)5 -b(erm)-5 b(utation.)142 b(In)82 b(stead)f(of)g(a)h(simple)e(brute)-240 -11099 y(force)61 b(exploration)f(of)h(the)g(state)f(space,)g(the)h(Tim) --5 b(b)5 b(erW)-15 b(olfSC)60 b(program)h(uses)g(sim)-5 -b(ulated)59 b(annealing)h(as)h(a)h(heuristic)3809 11672 -y(11)p eop end +b(erm)-5 b(utation.)142 b(In)82 b(stead)f(of)g(a)h(simple)e(brute)3809 +11672 y(11)p eop end %%Page: 12 12 -TeXDict begin 12 11 bop -240 -99 8513 7 v -240 4209 7 -4308 v -184 4159 a @beginspecial 53 @llx 458 @lly 576 - at urx 720 @ury 5040 @rwi @setspecial +TeXDict begin 12 11 bop -240 -99 8497 7 v -240 4167 7 +4267 v -184 4117 a @beginspecial 35 @llx 470 @lly 538 + at urx 720 @ury 5030 @rwi @setspecial %%BeginDocument: Figures/espresso_cbu2.ps %!PS-Adobe-3.0 %%Pages: (atend) -%%BoundingBox: 53 458 576 720 -%%HiResBoundingBox: 53.999219 458.600000 575.400000 720.000000 +%%BoundingBox: 35 470 538 720 +%%HiResBoundingBox: 35.999219 470.999609 537.719141 720.000000 %................................... %%Creator: AFPL Ghostscript 850 (pswrite) -%%CreationDate: 2005/12/02 01:46:10 +%%CreationDate: 2005/12/16 14:19:12 %%DocumentData: Clean7Bit %%LanguageLevel: 2 %%EndComments @@ -7666,13 +7372,13 @@ gsave mark Q q 0 0 6120 0 0 7920 ^ Y -q[5214 0 0 2613.6 539.995 4586.4]concat -852 427 8[852 0 0 -427 0 427][/Indexed /DeviceGray 255 - ]setcolorspace[0 255]false @X IC @@ -7684,1753 +7390,1098 @@ zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz +zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!!!!,!WW3#zzzz$NgA/$Om(9zzzz!F!!!!("T\W7!=TD@"pk;3%KQkB!2!!!62"U>#-!!iT4zz +z!<<*"zzz!<<*"zzz"pG#1!"TG;!!!<+!7"98E%!!!!."98E%!!!'%z$3:D4zz +!!!$"zzz!!!$"zzz!!!B5!2"9ec*!X\o-!!iT4zzz!<<*"zz +z!"&c-zzz!<<*"zzz!<<*"zzz!!!!$#64`(!!EW/!"B88#mgt@%0-eG#7^b?z!"B&2!!!9*!=Sr. +!!!!+!WW3#zz!<<*"zzz!<<*"zzz!!!!%"98E%!!!H6!!EH2%KQ\?"U#26!WWN6z!!E`2z!"',7 +!!!!#$31&+zz!!*'"zzz!!*'"zzzz!!EE)!!!!(!<<*%#mUkB"pb57%KQh?"TeZ(!!<<'!!<<'!!!!+ +!WW3#zz!!!$"zzz!!!$"zzzz!!!*+z#6=f)!so2@"U555#7^b?#6b//!!!!)!,6!4$31&4!WW3#!!!H2z!"&`7z$3C2-zz!!*'"zzz +!!*'"zzz!!!!(!rrH)"U4r9#QOu:!!`N0!"B&2!=/Z8"TSN&!!!-2z!!!-(z!X\o-zz!!!$"zzz +!!!$"zzzz!!`T+"9AZ1#6=f)!s8N+%0-V6#7(>1!"9A9!=&l2!!!E&0%0QY5!rrZ0!"/f3z!"B&2!!!!,%0-A.!!!!"#QOi)zz!<<*"zzz!<<*"zzzz +$4@%A!<`B)!WW?4!!`N0!"B&2!=/Z8"TSN&!!!!/!rr<$!!!9*zzz!!*'"zzz!!*'"zzz!!!!(!rrH) +"U4r9#QOr/!!E`2#6>&8!<<*.%fcS0!!!-2!!!!#!=8o2z!X\o-zz!!!$"zzz!!!!+!WW3#zz!!!$"z +zz!!!$"zzz!!!!,$31;3"q:V:$31&8"98N+!!E`2!X\o-#m:5.!!!!."98E%!!!B-$NL/,!"&c-zz +!!!$"zzz!!!$#zzzz!s\f8!Wrr5%0uq:%0-V6#6529!!*?*%LiC9!=&l2!!!E0!!!!##ljr3!WW3#!"&c-zz!!!!" +!<<*"zzz!<<*"zzz!!!B6!!`N/%0?b8!!!*'!!E`2#6>&8!<<*.!rr<$!!!!,!=Jl-!!!?-zzz!2!!!!(%0lk5!!!E:zz +!!!!"!<<*"zzz!<<*"zzz!!!K1!!!H0!tPV;$NL\J!!3<("p"o6!#3#lk/1"onf.!"TS?$4d+<%0-A.!!!!."98E%!"T>8z$NUA1zz!!**# +zzz!!!$#zzzz#6Or+!tPM2!!!'(#QOi)!!!E:zz!!!!"zzzz!W`<)zz +!!!!"zzzz!!*'"zzz#Qau+!!<6.$O-V<$3:/7!!=/`- +!<`B&z!!!!"!<<*"zzz!!**#zzz$P*4;!!E<+"oo/7"9AN1!!!zzzzz'G)/_zzzzzz!!!!1&-)\1zzzzzzzzzz!"]\Qzzzzzzzzzz +!!!QA&.fBa&-)\1zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz +zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!"]\Q&.fBQzz&.fBQzzzzzzzzzzzz +$Q0m''bD)tzzzzz!!!]Lzzzzzzz&.egAzzzzzzzzzz!"]\Azzzzzzzzzz!"]\Q&.fBQzzzzzzzzzzzz +zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz +zzzzzzzzzzzzzzzzzzzzz!!!QA&.fBQ!!!!"!9!=&T6"98f3!=Af0$31;3#64`2!WWlF&.egAz!!!*-!WW3&!WWH+#65#1!!!$*%fu_2!!!*4 +&-)\1z!X\o-!!<<'!!3B.%0-\7!s8N'$3C\D!"]\Q!!!QA&-*sg&J,KR!!!!E&.fBa,QIfE!<<*"zzz +zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz +zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!!!"zzz!!!QA,nU+W!!!QA&-)\4&.fBa!tPA>!s&l:!<!!<<'":Y>2z!!E`2#6>&0%0Qn>$j$b9":>,6!=&T)$3C2R +&.g06zz":5A7!s/H-!=&T1!<<*##S.=D!!!QA&-)\1z!!3K-!!!*'!!!'*!!NE*!!<<'!"&c=&.fBQ +!"]\Q!!!!=&.fBQz,S1Lu)uos=!!*'"zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz +zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!<<*"zz!!!iI +&.fc\z!"]\Q!WW3J&.fBY!WWW;#6>24"V;4V&-E:H$3153!"/o7!=Jl-!!!?+%LE+=!WW`A!!3<(z +!!!'(!!WH.!!NE,%0-nG!!ET."p"r/!!r`C&.fC$.0'>Jz!s]27$Nge;"p"r/#QY/5!=/`1"oo2G +!t5/0z!!!'-!!!!$!rr<@f+#64i.!!!QA&-i@?&.fBQ!!!!:&.fBcz!$i*e&.8IcWz!<<*"zzzzzz +zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz +zzzzzzzzzzzzzzzzzzzzzzzzzzzz!!!!"zzzz)&3\jzz)\Q('"=7zzzzz!#,tj&.fBQzzzzzz!"]\Q!!!!9&.fBazz&JYiqzz,S1mpz!!*'"zzzz +zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz +zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!<<*"zzz!!!B>)uos=z!#m3q&.fBez!"]\Q&-)\1zz!"]\Q +&-)\1zzz!!!!#!#eR!#eR!,!lZ!!!!"z&.fBa!!!TG'EA+5!!!$"zzzz!!*'"zzzz!<<*"zzz!!!!" +!#,tU&.fg"$NL/,z!!!!"z((qPd&.fBaz!!!$8'bCoi,QIfEzz!!*'"zzzz!<<*"zzzzzzzzzzzzzzz zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz +zzzzzzzzzzzzzzzzzzz!!!!"zzzz!!*'"zzz!!!!:/H>bNz!!!!E&.fBa'+k3E!<<*"z&.fBk&.fKe +!!!!"zzzz!!!$"zzzz!!*'"zzzz!>H([',2#Yzzz!<<*"'GV/j&.egAz!!!!>'dXb1zzz!!!$"zzzz +!!*'"zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz +zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!<<*"zzz!!!$"zzzz!!*'"zz)\89"U"r1!Wi]/zzz!!33' -!sAl5"U>89%0Q_Czzzzzzzzzzzzzzzzzz!!*H1"U529"UtS@!WiE'zzz!9#Qk,.zzzzzzzzzzzzzzzzzzzzz -zzzzzz%fuk;&.f!J!s/H&zzzzzzz!!!!"!X&rB#7_1F!<<*"zzzzzzzzzzzzzzz!!!!#"9f>J"U"o/z -zzzzzzz!!*-(%1WUQ%0HV2zzzzzzzzzzzzzzzz$NpV<"q1V9$31&+zzzzzzz!J$jd7 at zzzzzzzzzzzzzzzz!XT8>#6bA>!Y582 -zzzzzzz!!!N2#m^\>"q1eFzzzzzzzzzzzzzzzz!!39,&.f!J$OQk6zzzzzzz!"T,;%1WUQ%0HV2zzzz -zzzzzzzzzzz!!!!0$O?n@"pG,;!WW3#zzzzzzz!!!?-":PbF%L<.;zzzzzzzzzz"q:q?zzzzzzzzzzz -zzz!"&i4#7_"I!<<*"zzzzzzzzzz!!393&-`RO%fcS0zzzzzzzzzzzzz!!!!+"9f#?#R^Y5zzzzzzzz -zz!!!!##n. at L%0I+ at zzzzzzzzzzzzzz!=8o7%LM?$31&+zzzzzzzzzzzzz -!!!B4"qV1L!WW3#zzzzzzzzz!!!!"!t>GG$j."?zzzzzzzzzzzzzz!=9/G"q:YAzzzzzzzzzzz$3L_A -&.AXAzzzzzzzzzzzzzz!"T/?&-`RG!<<*"zzzzzzzzz!!!!#":PM>#Qau+zzzzzzzzzzzzzz!XK8@ -"U#2Dzzzzzzzzzz!!!!0!X&Z3"pbS:zzzzzzzzz$4%+Q%1<.9zzzzzzzzzzzz!!!?3"pPME%fcS0zzz -zzzzzzzzz!"&i=#7L\Fzzzzzzzzzzzzz$4$hI%1<[Hzzzzzzzzzzzz!!!!+#n at 1K!tPA3zzzzzzzzzz -zz!!*B9&.J^Pzzzzzzzzzzzz!"TGH&-`C at zzzzzzzzzzzz!!!!,%1i^L!WW3#zzzzzzzzzzz!!!!" -#mCPB!tPA3zzzzzzzzzzzz!!*B9#7L\8zzzzzzzzzzzzz!=9/>%LE.9zzzzzzzzzzzz!!!N3"U>GB -!<<*"zzzzzzzzzzz!!!!##R1hL!WW3#zzzzzzzzzzzz!"05I"pbSIzzzzzzzzzzzzz!XK8I$j-J0zzz -zzzzz!!!!""9o&5!<<*"zzzzzzzzzz!!!!""9o&9$31&+zzzzzzzzzzzzzz!=95@%0?M0zzzzzzzzzz -z!"TA?&-rUCzzzzzzzzzzzzzz!!!N3"U>JJEzzzzzzzzzzzzzz!"05I -%Kc\2zzzzzzzzzzz%g3(@#RUP3zzzzzzzzzzzzz!!!N3%M0'Vzzzzzzzzzzz!!!N3%M0'Wzzzzzzzzz -zzzzz!!!!0!t5D?zzzzzzzzzzzzzz!!!!"#n at LU$31&+zzzzzzzz!!!'0#7U\6zzzzzzzzzz!"'/?$k!%8zz -zzzzzzzzzzzzz!!!!""9o&4zzzzzzzzzz!!!!"%0m:Lzzzzzzzzzzzzzzzz!!*3,"p5A9zzzzzzzzzz -!!.zzzzzzzz%g3FQ!<<*"zzzzzzzzzzzzzzzzz!!!!"$kNOAzz -zzzzzz!!!$'&-Dn4zzzzzzzzzzzzzzzzz!!*N?#ljr*zzzzzzzz!.zzzzzzzzzzzzzzzzzzz!tYVHzzzzzzz!!!!0#S7:Bzzzzzzzzzzzzzzzzzz!!!*4$kE=1zzzzzzzz!!!!+&.JU>zzzzzz!"'2E%fcS0zzzzzzzzzzzzzzzzzzz -z!!%M&O>zzzzzz%h&pTzzzzzzzzzzzzzz -zzzzzzz$3gq>zzzzzz!!!N>"V1S5zzzzzzzzzzzzzzzzzzz!!!Bzzzzzzzzzzzzzzzzzzzz!!!*+$NL/,zz -zzz!!!H<$31&+zzzzzzzzzzzzzzzzzzzz%1WmKzzzzz!!!!0%Ls!Lzzzzzzzzzzzzzzzzzzzzz!"TPK -zzzzzz!"TPKzzzzzzzzzzzzzzzzzzzz!!!!+&.&=:zzzzz!!!!+&-Dn4zzzzzzzzzzzzzzzzzzzzz -!"0>?zzzzzzzzz!"T8:zzzzz!!!!0"p=o+zzzzzzzzzzzzzzzzzzzzz!!!!+&-Dn4zzzzz!"TPKzzzz -zzzzzzzzzzzzzzzzzz!"'8>zzzzz!!!!0&-Dn4zzzzzzzzzzzzzzzzzzzz!!!!$&./C;zzzzz!!zzzzzzzzzzzzzzzzzzzzz!!!N>%0-A.zzzzz -!"KGzzzzz!!!?;!rr<$zzzzzzzzzzzzzzzzzzzzz!!!?;$NL/,zz -zzzzzz!!!?;!WW3#zzzz!!!!&%0-A.zzzzzzzzzzzzzzzzzzzzzz$3pnz(E!2Qzzz!!NK*zzzzz"U"f* -zzzz()[>uz!#-1Kzzzzzzz!!!Z;#8n?Yz!"oMKzzz!!!?2!<<*"zzzz!!*<3zzzz()[>uz!#-1Kzzzz -zzz!!!`M)%ciK!#PqG#6tJOz!"fGKzzz$4m48DQzzzzzzz!#l^S&el5azzzzz!!!!.%0-A.zzzz!"B&2zzzz'HRkl'*&"4*>8DQzzzzzzz -!!!uD#8$q9!#ugU!!!uZzzzzz!"BA;zzzz!!!!."98E%zzz!!!!6#87[S(]XO9'G^ZKzzzzzzz'bh8\ -!!!oVzzzzz!!!N@$31&+zzzz%hJaAzzz!!!!<#8e6q'`\4H'GUTJzzzzzzz!!!oB#8.":!#-IS(^D&] -zzzzz%hJdBzzzzzzzzz!t5/0zzzz!"08:zzzz&I0-c#87(;',(?G!!!!?zzzzzzz'*f-Mz!#>eVzzzz -z!!!*0zzzz!!!!,"onW'zzz!!!T9(_R&e!!!ZGz!$2+?zzzzzz!!!Z;&c_n3'c at _dzzzzzz!tG;2zzz -z!"&o1zzzz!!!f?!"fGQ!!!uSz'c[2Rzzzzz!!!!6)BAeX',hSczzzzz!!!0)zzzz!!!!.#ljr*zzz -!!!!3#87(T*WQ0U)uos=!!!ZLzzzzzzz!##S;zzzzz!!!!"&-)\1zzzz%gNUFzzz!!!!3#87(T*WQ0U -)uos=!!!ZLzzzzzz!!!!9#8$q9!#P\9!#6Chzzzzz!!*W2zzzz!!!N7!<<*"zzz!!!!2#8e'Y'*&"G -'*&"4!!"&?zzzzzz&eY0E!#QUhzzzzz!!!!)%0-A.zzzz#n-e6zzz!!!!8#65>@(]XOU('"=7!#6IRz -zzzzz!!!!4#8.":)[@,Y!$):Zzzzzz!!E`2zzzzzzzzz%gN(7zzzz!!i]-zzzz&I0-c#87(Q'EA+5 -!!!Z;zzzzzzz'*f-Mz!#lUPzzzzz!!!N7zzzz!!!!%#QOi)zzz!!!T9(_R&e!#?7Kz'*eL;zzzzzz -!!!Z;&c_n3'*ea[(DZuNzzzzz!!`K(zzzz!!EQ-zzzz!!!f?!"fGQ!#$@Qz*Zb:]zzzzz!!!!<#9*XC -(^Cu[zzzzz!!!<7zzzz!!!!1!<<*"zzz!!!!3#87(T*WQoh&c_n3!#PqXzzzzzzz!$*'[zzzzzz -%KZV1zzzz$O$M1zzz!!!!3#87(T*WQoh&c_n3!#PqXzzzzzz!!!!9#8$q9z!#lgVzzzzz!!!K1zzzz -!!!'(zzzz!!!!2#8e'Y'*&d^z!##S;zzzzzzz!$*$Zzzzzz!!!!+"onW'zzzz$j-J0zzz!!!!8#65>@ -(]Y3iz!$30]zzzzzz!!!!4#8.":'*f-M!#l.^zzzzz!"&o1zzzz!#6:T&c_n3zzz!"]/2zzzz!!NE(z -zzz&dK'^#8dFT&c_n3!##SB#8\$l)\`Mk&f_,]&HEI^',1Zh('"=7z'*f-Mz',hVdz!#?Olzzz!!!!' -$31&+zzz!!!!&$NL/,zzz!!!W:'+kHd!#-%G!!!!4#6tJM',hf(#8 at dj#6th@',_Gt#8n9Wz!!!Z; -&c_n3!!!ZK#9EjF!!!!7*#S_Vzzz!"K&1zzzz!"8r0zzzz!!!T9(`+)*&ek&dK'M!!!!7*#S_Vzzz!!!'(zzzz!!!!(zzzzz)'0Cq'*&gfz -(^C9N)%dPr(C(iq'*eaY!#QCd*X;o^zz(E*8Rz!#$4^zzzz$j-J0zzzz"9\])zzzz)'0Cq'*&gfz -(^C9N)%dPr(C(iq'*eaY!#QCd*X;o^z!!!!9#8$q9z!$!!Zz'c.)fzzz!!!92zzzz!!!--zzzz!!!!3 -#87[S(]Y6_z'*eaI(D@]+'F,Hf!#u4^(]Y?W!"fG@'GVPl'Gpff -)&iec'GVB%)#sX:z'*f-M!!!!8#6u._z!#,YUzzz!!!!&!WW3#zzz!!!!&!WW3#zzz!!!!2#6u%F -*>&8k#9"EZ(C'pP#6tqX)[@&o!#ZXn#6tqX()e%jz!!!Z;&c_n3z(C(ZT!!!!5#8mLAzzz!!NE(zzzz -!!NE(zzzz!!!!8#6th@'G;#m#8 at dN)'/bo#6u%F*=!Vu&dK3n#6u%F&I0*P!!!!4#8.":&dK'M!!!!5 -#8mLAzzz!!!'(zzzz!!!!(zzzzz()[>k'cRqh'*eaU!"fGQ&dJXZ((qN('*&gR('b'^()7Mg&c_n3 -!!!!:#6tqXz)[?T[zzzz"9\])zzzz"9\])zzzz()[>k'cRqh'*eaU!"fGQ&dJXZ((qN('*&gR('b'^ -()7Mg&c_n3!!!!9#8$q9z'cInhz*#52zzzz!!i]-zzzzz'bhA_(C'pP#8S*\!!!T9(]XO@(B=FO#65SG&HDeC#9*XCz -'*f-Mz!!!]Sz!!"&Xzzz!!!N7zzzz!!!!%#QOi)zzzz!!!`J'`]$T!"fGO(C'p?&I0-Q!!a;?!#Gk? -(^CWQ!"fGTz!!!Z;&c_n3z&dK$Lz*Z4qXzzz%gN(7zzzz!!EQ-zzzzz!!!cS!!!lX!#HOR)'/bX -(C'p?(^CWQ!#ZgX'*f-M!#GkT!!!!<#9*XC)[@;^z*Z4qXzzz!!!<7zzzz!!!!'$31&+zzzzz*#8Md -#8e'Y'+kHd!"oMM!!"&X!!!T9(]XdW!!!W:*<6'>z!#5_Pz!#PqQzzzz"pt>1zzzz$P!.:zzzzz -*#8Md#8e'Y'+kHd!"oMM!!"&X!!!T9(]XdW!!!W:*<6'>!!!!9#8$q9z*$#"Zz!##SMzzz!!!K1zzzz -!!!'1zzzzz!!!!6'GUTa#65>@()I2U!"fGQ!!!6?!!!f?!##SM!!!f?'`\46z)B/YVz!##SMzzz -!!!!#%KHJ/zzzz$j-J0zzzz!!!!7)uosV*WQup!#ZgX!"fGQ!!!6?!!!f?!##SM!!!f?'`\46!!!!4 -#8.":z'cIkgz!$3!Xzzz!"&o1zzzz!!!Z;&c_n3zzz#n-e6zzzz!"/u2zzzzz*#ekX(C'pP#8S*\ -!!!T9(]XO@(B=FO#65SG&HDeE#8R:>z'*f-Mz!!!uZz!!"&Xzzz!!!<6zzzz!!!!+"onW'zzzz!!!uX -!!!f?!"fGO(C'p?&I0-Q!!a;?!#Gk?(^CWQ!##SQz!!!Z;&c_n3z)\`8Pz*Z4qXzzz!t5/0zzzz -!"&o1zzzzz!#61\!!!lX!#HOR)'/bX(C'p?(^CWQ!#ZgX'*f-M!#umW!!!!6)BAeX*?#Xmz*Z4qXzzz -!!!K2zzzz!!!!."98E%zzzz!!!!4*<6'O#8e'Y'+kHd!"oMM!!"&X!!!T9(]XdW!!!c>'*&"4z!!!oV -z!#PqQzzz!!!!+&-)\1zzzz%gN+8zzzz!!!!4*<6'O#8e'Y'+kHd!"oMM!!"&X!!!T9(]XdW!!!c> -'*&"4!!!!9#8$q9!!!!6)AiGSz!##SMzzz!!*W2zzzz!!!!1!<<*"zzzz!!!!=)ZTjS#65>@()I2U -!"fGQ!!!6?!!!f?!##SM!!!uWz!!!!9)AN5Pz!##SMzzz!!!!)#QOi)zzzz!sJZ)zzzz!!!`J&c_nL -*WQup!#ZgX!"fGQ!!!6?!!!f?!##SM!!!uWz!!!!4#8.":z*Z5[mz!$3!Xzzz!!ii1zzzz!!!f? -('"=7zzz"p+c)zzzz!!!3*zzzz!!!!<*<6'>&I0-m)?:QY&f22d'*&aP)uosQ#8J'\*WQfj)uos=z -*=!>[z!"g+^z!!!lTzzz!!!3)zzzzz"p4i*zzzz!#lpY!!!T9(`XFo(C(Qh'*f0N'aG]Y!#,YQ(^D)^ -&fDYhz!!"#E('"=7*>/>h)&<2Pz)&`JTzzz"p4i*zzzz!!!3*zzzzz!$*!Y!!!fR&fDYh)&*o$*![5Z -)[@#V'aGEQ'*f0N(^C]Sz',hK!)A<)Nz)&`JTzzz!!3]3zzzz!!!!#&.\a at zzzz!!!WQ!!!!3#87aU -((gcj*#8c!!!!]O!!"#E)ZU*\&c`sj'`\46z!#H=Lz!"fGLzzz!!!!."98E%zzzz!"BA;zzzz!!!WQ -!!!!3#87aU((gcj*#8c!!!!]O!!"#E)ZU*\&c`sj'`\46!!!!<#87(;!!!!<)#sX:z!#GkUzzz!"B&2 -zzzz!!!!.%0-A.zzzz!!!rY!!!!2#8eF!!#GkQ(D@#e!#5_Y!!!]<'b^fc!#PqSz!!!!>(B=F8z -!#GkUzzz!!!N@!<<*"zzzz%hJdBzzzz!!"#Y!!!!8)A3o-!#ZIf',(Ta!#5_Y!!!]<'b^fc!#PqSz -!!!!>#8R:>!!!TF)%loLz!#Z[Tzzz%hJaAzzzz&f1cX#8.":zz!!!!%"TSN&zzzz!!!B2%fcS0zzz -!!!WGz!#GkY(]YBX)%d)Y#87=I#9Fok#6u(N*X;ok'`\gN&HDeP#6tJG!#l.J#94?V!!!lS!#Z"H -)#sX:zz!!EH*zzzzz!Y>kBzzzz&ek!#GkQ(C(0M&c_n3zz!Y>kBzzzz!!!!"#7:G2zzzz!"otGz(C(iq!#PqY&I/OG'*eaI*ZbOk -#87=`#6u7L!"fGJ!!!!;)ZTjA4zzzzz!"B)3zzzzzzzzzz -z(^CWQzzzzzzzzzz!!!?;$31&+zzzz!!!!-%0-A.zzzzzzzzzzz'*f-Mzzzzzzzzz":bD3zzzzz -!>#;4zzzzzzzzzzz!!!6?zzzzzzzzz!"T8?zzzzz!!!<0%fcS0zzzzzzzzzz!!!6?zzzzzzzzzz -!!!!0&.8I=zzzzz!!!Kzzzzz!!!!0%LiCzzzzz!!!!0"pb2/zzzzzzzzzzz*=!>[zz -zzzzzz!!!!$&-2b2zzzzz!!zzzzzzzzzzz!#5_Yzzzzzzzzz%h9$Kzzzzz!!!!.%M&O>zzzzzzzz -zz!#5_Yzzzzzzzzzz!!!N>%0-A.zzzzz!"989zzzzzzzzzzz!$):[zzzzzzzzz$4mRFzzzzz!!!N@ -!rr<$zzzzzzzzzz!$):[zzzzzzzzzz!!!*4$31&+zzzzzzzz$4mICzzzzzz%h9$Kzzzzzzzzzz!"fG@ -#87(;zzzzzzzzz!!!'3!rr<$zzzzz!!!N>%1`F=zzzzzzzzz!!!!2#6tJIzzzzzzzzzz$4m:>zzzzzz -$4mICzzzzzzzzzz!!!!8#6tJNzzzzzzzz!!!*4$31&+zzzzz!!!*4$31&+zzzzzzzzzz&dJXH*WQ0?z -zzzzzz!!!!0%LrI=zzzzzz%1WmKzzzzzzzzzz&dJXH*WQ0?zzzzzzzzz!!*Q=zzzzzz!"TPK%fcS0zz -zzzzzzzz(C(0M(]XO9zzzzzzz!!!!+&-Dn4zzzzz!!!!+&-r79zzzzzzzzzz(C(0M(]XO9zzzzzzzzz -!!zzzzzzzzzzzzzzzzzzzz!!!!*#6Or+zzzzzz!"&o>%fcS0zzzzzzzzzzzzzzzzzzz!!j,Czzzz -zz!!!!$&.8IV;z -zzzzz!!!N>%KQP0zzzzzzzzzzzzzzzzzzz!!!*+!rr<$zzzzzz$4[ITzzzzzzzzzzzzzzzzzzzzz -#S7=Czzzzzzzz!!!99!rr<$zzzzzz!!!N=&.8IH!<<*"zzzzzzzzzzzzzzzzz!!!!,"pGM;zzzzzzz!!!!*&.AR>zzzzzzzzzzzzz -zzzzzz%g3+?zzzzzzzz!!!$.&.&=:zzzzzzzz!"T2;%06G/zzzzzzzzzzzzzzzzzz!sSo1zzzzzzzz -!!!!0":#A:zzzzzzzzzzzzzzzzzz!!!**%KZV1zzzzzzzz!!*6-!rr<$zzzzzzzzzzzzzzzzz!sT5:z -zzzzzzz!!!!$&-WC at zzzzzzzzzzzzzzzzz!"T2;#S-n8zzzzzzzz!!tzzzzzzzzzz!!!!+#R1hL$P*4;zzzzzzzzzzz!!!!##R1hL$NL/,zzz -zzzzzzzzz!"T/?#7^kDzzzzzzzzzzzzz!X&u<$j."?zzzzzzzzzzzz!!!!,%1j!T!WW3#zzzzzzzzzz -z!!!N3%1i^H!<<*"zzzzzzzzz!!!!O!rr<$z!"&u9&.AXAzzzzzzzzzzzz!!!!0$OmXO#RUP3zzzzzz -zz%Km+=z!!!!G)^ZgU0,4Hezzzzzzzzzz!!*01&-`OL!WW3#zzzzzzzzzz!=K/C#7^kDzz!%&X3 -,U>#Xzzzzzzzzzz!!!!"!t5_P$jct8zzzzzzzzzz!!!$-#S%(L#Qau+z!!!!Q+s.OS,U>)hzzzzzzzz -zz%g*7P"q:kGzzzzzzzzzz!"&f;"qV1F!<<*"z1*Re?zzzzzzzzzzz!!!?4"U>MC$P*4;zzzzzzzzz -!!!!#":PM>#R^V4zzzzzzzzzzzzzz%grgN&-W1<%fcS0zzzzzzzzz!!!!0!X&Z3"pbS:zzzzzzzzzzz -zzz!!!B9"qV1L!WW3#zzzzzzzzz!!!$-#S%(C#lt#+zzzzzzzzzz!$Niu1DKlizz!=9/G"q:YAzzzzz -zzzzz!!!!"!sfAA"U#/4zzzzzzzzzzz!!!!U0E;(r.gRXZ'`\46zzzzzzzzzz!"'#A"pYVI"9Jo1zzz -zzzz!!!N2!sAc=&-W1<%fcS0zz!%T`'!$Niu2(o[Ezzzzzzzzzz!!!!+#n7 at L%LiOB$31&+zzzzzzz -%fuh9"V;4K":G_?zz!!!!B,6.]D!$a3B,VKl4zzzzzzzzzz$4.+F#6bA>!Y582zzzzzzz!Wr]3&.f6Q -!WW3#z!!!!D#W5?":GP:zzzzzzz!!*-(%1WUQ%0HV2zzzzzzzzzzzzzz -zz!$N^;.zzzzzzz!!!'.":PJ>"UG22zzzzzzzzzzzzzz!!"N'z!!*02%L3IQ"9JT(zzzzz -zz!!3N2"U528"9JQ'zzzzzzzzzz!!!`\,U>#X-7Aiozzz$4.+F#6bP>!W`9$zzzzzzz!"T,;#R(bN -"U"l,zzzzzzzzzzzz!!!!Q'`\46!$89$j6q=zzzz!&,,f!!!!@0ImDd0d$Grzzzzzzzzzzz!XT,9"pY>9$j6\8!WiE(zz -!!!'%!WiK-#R(A:#6bM=$NU5-zzzzzz+XdUQ0HU8pzzzzzzzzzz%fukC"U>89"U"r7!WiE(zz!"T,4 -!WrQ."U,,9%L`IJ!<<*"zz!!")u/hmV['`\46zzzzzzzzzzzz!!!?."9eu7"pGD<":G84!WW3#z -!!!!+!WiE+":YME#7q%E#m(),zzzzzzzzzzzzzzzzzz!"&f2"V(bK"U,#3#m(/0$31&+z!!!!+!WiE0 -"9\l3&-i[K"9Su2zzzzzzzzzzzzzzz!!"\uzz!!!',#R(bE%L!+@"9JW+$31&+z!!!N2!Wi`4":PGF -#7^n?$OQk6zzzzzzzzzzz+Y*gH+92BA+".*hzzzz%g!%C"V:nC"UtS;$N^A2%fcS0z!!!!#!WiE+ -":YME#6tDA"9JT(zzzzzzzzzzzzzzzz!$Na9+tG>^zzzzzzzzzzzz$3C;4":PG;"V:nD#6tJ=#6tJ= -"U,&5#Qt83!WW3#zzzzzzz!!!!B0dIqn0GOQfzzzzzzzzzzz!!!?-!sA`8"U,&@#6tJ=#6tJ=#6tD9 -"U,/7"9JW8zzzzzzzz!!")p1^GKQzzzzzzzzzzz!!!N2!X&W8"U,&6#6tJ=#6tJ=#7q%B"UtS;$N^h= -zzzz!!!`^!!!`^#VdD$zzzzzzzzzzzzzz!8;#6tJ=#6tJD"U,&8":5,2zzzzzzzzzzz -zzzzzzzzzz!!!!"!Xf,6%0Zn="pYA<#6tJ=#6tJD"U,&="9])6!<<*"zzzzzzzzzzzzzzzz!!"Z. -0E;(Qzzz!WiK-#R(A8"pYA<#6tJ=#6tJ;"U,;;"9S]+zzzzzzzzzzzz!#744,VL5>zzzzzzz!!!!+ -!WrQ.$j?e<&-iFF#6tJ=#6tJ;"U,&4":5,2zzzzzzzzzzzz!$O'Szzzzzz'e_'C2)-b8hzzzzzzzzzzzzzzzzzzzz!!")t2'W)$zzzzzzzzzzzzzzzz -zzz!&#Dozzzzzzzzzzzzzzzzzzzzzzz!$NOC'`\46zzzzzzzzzzzzzzzzzzzzz!$4zzzzzzzzzzzzzzzzzzzz!!"n_0)ttPzzzzzzzzzzzzzzzzzzzzz!!">O0cpAqzzzzzzzzz -zzzzzzzzzzzz+##Pr0bjZgzzzzzzzzzzzzzzzzzzzzzzzzz!!!!D-8Yuc0d-Mszzzzzzzzzzzzz -!!!!D0IS1P1bg-gzzzzzzzzzzzzzzzzzzzzzzzzzzz+=8rO1aX=Fzzz+5&g-o>,s1c,ID2)I$7+Wpabzzzzzz!!!!60-h_r,6.]Dzzzzzzzzzzzzzz -zzzzzzz!!!!@-6b8hzzzzzzzzzzzzzzzzzz!&Z)'zzzzzzzzzzzzzzzzzzz1aW2&zzzzzzzzzzzzzzz -zzzzz!!!!D1aF1Dzzzzzzzzzzzzzzzzzzzz!!")o,U=]Ozzzzzzzzzzzz!$`U/+-71&d-71&d-70lY+6+p\H31c-O+0-DA^zzzzzz!!!!@+Ybh[2)-d"zz -zzzzzzzzzzzzzz+O-6E3fzzzzzzzzzzzzzzzzzzzz+=ILG+TMKBzzzzzzzz!!"5d+<`'Y-7^o01a322#UD5`1c-p6 --71&_+5&g1c.#p#RD\41c-O+-86Pb+;FkVzzzzzzzzzz+!;m\,R?4] -0GOQfzzzzzzzzzzzzzzzzzzzzzzzzzzz,9\Ba2$bHa-86PBzzzzz!!!!D+)hzzzzzzzzzzzzzzzzzzzzz!!!!@0aK0Bzzzzzzzzzzzzzzzz!!!!6+s6jczzzz -zzzzzzzzzzzzz!#5bSzzzzzzzzzzzzzzzzzzzz!&,TI*rl9 at zzzzzzzzzzzzzzzzzzz'db1O0,4Hezz -z,9SWd.l8LW#W+ at m/jM'B/g_u'1c5OE#RE7D1c.$D-71&d-71&d+WqmM+zzzzzzzzzzzzzzzzz!&Q#&zzzzzzzzzzzzzzzzzzz!!!!61aF1Dzzzzzzzzzzzzzzzzzzz -!!"/m#Ugeqzz!$EF3-o<1T+uC\p5VGGN1c-H`#W+ at g-71Ag+61c-H`#RC\]1c.$G0d\4o-86Pb+O -0cpAqzzzzzzzzzzzzzzzzzz!!!!6-6sii*rl9@!!"5d-7C\p#W4Fc0/#O:.l7M;2)I$70H_S?zzzzzz -zzzzzz,9SP1bgX+'`\46zzzz!!!!D+qzzzzzzzzzzzzzzzz!!"5s.jQ;h0-C5pzz!!")p2'OFlzzzzzzzzzzzzzzz -zzzzzz!#6mf-ku^^zzzzzzzzzzzzzzz!$l#$zzzzzzzzzzzzzzzzzzz!$Niu-m/Ki'd4nS2$bB_0d\#+0/5:-#W4Fc0H_)1zzzzzzzzzzzz -,9SWd.l8FU,W%5&+X6sezzzzzzzzzzzz!$`U/+P1aXn!zzzzzzzzzzzzzzzz!!!`f-mT'K0-^Gszz!#6h+ -,V^MDzzzzzzzzzzzzzzzzzzzz!!!!6-jV4Czzzzzzzzzzzzzzz!!"/d'`\46zzzzzzzzzzzzzzz -!!!!G1]RLUzzzzzzzzzzzzzzzzzz!!")q+tiorzzzzzzzzzzzzzzzzzz!!!`\,U>$'0/59h+uD#- -+a.jcA`zzzzzzzzzzz!!!!A+>>,s1c,ID,W$nr0-Cu0zzzzzzzzzzzzzzzzzzzzzzzzzzzz -zzzzzzzzzzzzzzzzzzz!!"5d+>>,h0f1^D2$aHn#W4Fq1c-p6-71&d+WqmM+'`\46zzzzzzzzzzzzz -zzzzz!$NUE'`\46zzzzzzzzzzzzzzzzzz0ImDu2Dkac.jcAR'd4n\+sJij0I$Ptzzzzzzzzzz,9S*U --8@>6,R=Z51b0n"+55j#W*kO'`\46zzzzzzzz+!;[L-71,t1aE>4,W%>4-70iX,6.]Dzzzzzzzzzzzzzzzz -zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz,<.)42*M9O2%qf) --pf7;1c.$7#RC\[1c.$D-71Dh+>,j1aE>N1c-O++zzzzzzzzzzzzzzz+!Mj.z -zzzzzzzzzzzzzzzzz'f70Yzzzzzzzzzzzzzzzzz!$a-I*??U459Bk*+>G_Z2)-6rzzzzz!!!!6+<`'Y -.l9*h#U2)^-mg8a+>,s1c5OE2)H^.0H_S?!!!!@+:zzzzz'e_'C2(o[Ez!!"/j+uM"qzzzzzzzzzzzzzzzzzzz!!!!6-mBu[zzzz -zzzzzzzzz!!")b+TMKBzzzzzzzzzzzzz!!!!D+r((Xzzzzzzzzzzzzzzzzz!$F-V,6.]Dzzzzzzzzzz -zzzzz!!",r2$b]Z8g6,H,;:Vl,UafXzzz!!!!6+>5&u1^F at E1bg=#+;FkVzzzzzzzzzzzzzzzzzzzzz -zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz -'d+YH0f1]m#W4Fe-86PWz+!;^R-o;281aj[o,6.]Dzzz!!!!@0IS,&0,4Hez+##2N.ki%Fzzzzzzzzz -zzzzzzzzzz!#6n+-ku^^zzzzzzzzzzzz!!!!B+r((Xzzzzzzzzzzzzz!!!!U-3+#Gzzzzzzzzzzzzzz -zz!!!!@0d87Nzzzzzzzzzzzzzzz!!")a-mBok+YY_s-jh[d#V.PCzzz!$EsB.l at SV1aj\)+5H++p^%S-6O$'zzz!!!!B-mBok,6.]D -!!!!@0/Xq%+TMKBzzzzzzzzzzzzzzzzzz!!!!6-jV49zzzzzzzzzzzzz0f/k1zzzzzzzzzzzzz!!"Yt -zzzzzzzzzzzzzzzzz!!",e1_fujzzzzzzzzzzzzzz!!!!@0ImDd0-_2d+ql\"+s\ldzz!!!!D+XT#k -#UD5R0H_G;zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz -zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!$`U>-8[Ob#W4Fc0-Cu0!$<=:0f0.[1bg[/zzz -!!"/j+s\fVz!!!`\,U+rfzzzzzzzzzzzzzzzzzzz!#6mf-ku^^zzzzzzzzzzzz+#PAFzzzzzzzzzzzz -z!$t -zzzzzzzzzzzzzzzz!!!!B+tF`8zzzzzzzzzzzzzz!!",i+uM"g!$a3="A&kL0GOQfz!$EpC2$c&f --6OB1zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz -zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!!!@+>>,m2$bB_0eXXk+!;m\,R?4]+VatWzz -+Y*gT0HU8pz+XeNl0-:/ozzzzzzzzzzzzzzzzzz!#6mf-ku^^zzzzzzzzzzz!!"?'*rl9 at zzzzzzzzz -zzz+#b!$'bp]Kzzzzzzzzzz!!!`> -,6.]Dzzzzzzzzzzzzzzz!%%suzzzzzzzzzzzzzz'dt7V+92Bd2C^1I0,4He,;1Pk,Ub>]zzzzzzzzzz -zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz -zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!!!D+XT#i+uCW2/i3hk0d.V=!!!!B.gRXKz!!!!D -0dJ#!'`\46zzzzzzzzzzzzzzzzz!$]zzzzzzzzzzzzzzzzzz -zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz -zzzzzzzzzzzzzzzzzzzzzzzzzzzzz'd5:g#UCoc-o;2e0d-Ms!$,V^#6z!!"/j+uM"gzzzzzzzzz -zzzzzzzzz0I.ntzzzzzzzzzz!$=!&#UBBMzzzzzzzzzz!&,Z?zzzzzzzzzzzzzzz!$

0)ttPzzzzz -zzzzzzzz+>b8h*ro)).Omh/!$O'S#V.PQzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz -zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz -zzz!$a0G2$c&j/5$7*-6iKj+=JEj0E;(Qz!&,o/.ki%Fzzzzzzzzzzzzzzzzz!!"\u,VU;?zzzzzzzz -z'f?7&#RD.Fzzzzzzzzzz+!Mj.zzzzzzzzzzzzzzz+=&cYzzzzzzzzzzzzz!!!`j+snBR5B -#W4=Zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz -zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!$<=11a5I[7St?[0GPZ` -2'Oaiz!!!!@0Jj%c+TMKBzzzzzzzzzzzzzzzzz+>b8h*rl9 at zzzzzzzz,9dC!#RE'`zzzzzzzzzz --n>8tzzzzzzzzzzzzzz!!")h+tiorzzzzzzzzzzzzz'dt7Q+&>:".Rtd>2$b]d'`\46zzzzzzzzzzzz -zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz -zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!"5s.jQ,K8I.1.+99aD"Zzzzzzzz!!"5f#RC\Xzzzzzzzzz!!!!E0)ttPzzzzzzzzzzzzz!!!!@.j?,:zzzzzzzzzz -zzz!$NUE,t(L''1X6(-6iKjzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz -zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz -!!!`f-j0fP#Zzzzzzzzzzzzzz,:$"i.L6V?*rl9 at zzzzzzzzz -zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz -zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!"6B4pVE"8P]?!"TA?"q:k?!!"5u,U>)hzzz -zzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!!!L.f]PLzzzzzzzzzzzz!!"6$2'W)$zzzzzzzzzz!"'#A -"pP/0!$F]9:'`Etzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz -zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz -zzz1*&.V:01g2zz!$`m9,VKl4zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!",c*rl9 at zzzzzzzzzzzz -+!r0Yzzzzzzzzzzzz!!?Y=,!uVc8J<0Gzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz -zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz -zzzzzzzzzzzzzzzzzzzz!!"YX at nng9"!IXEzz+XeNl0-:/ozzzzzzzzzzzzzzzzzzzzzzzzzzzzzz -!$&L'J$#TYKF+TMKBz!!")p.gRXZ*rl9 at z -zzzzzzzzzzzzzzzzzzzzzzzzzzzz!&6;1zzzzzzzzzzzz!$

0)ttPzzzzzzzzzzz!$ -!!!`\,U>$'1a47g!!"\Y0E;(Q!!"/f*rl9@!!WN*zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz -zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz -zzzzzzzzzzzzzzzzzzzzzzzzzzz!!!01zzz!&+[4z!#7".-6F<`1a6[M'cA%m&KLiO!!"*8C^=N< -!$2 at M#87mY*X;oT#8.jY#87(P*!Z]_()$oX#8[@?!!!cP#88*X',hf(#8 at dj#6th at zz',hf(#8 at dj -#6th@(`@6zz!#GkS',Vbq#6tnY#9F*T#6tkY#6tnB'c[G` -'G_>e#6u&"=DAoXz'*eL;!!!!('*&"E',(T_!!!TK&dK'M!#PqX!#$7h&c_n3+Y*gH+6Vz!!!]H!#Q[f#6tqX)[@&o!#ZXSz!!!!2#6tqX)[@&o!#ZXS*#&Ai#87(L -#8e'Y#9EjF*%)A`Ai#8K'@+92BAz -'*eaI#6tJ='*&"E',;E"!!"&R&dK'M!#PqG#6u%[!#746,VL5^1a47g!!!!@2)QHU!!!!G#Y767 -+92BA!!*<)zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz -zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz -!!!6(zzz!!!!D+tt5e*rl9@!$F*D0E;(Q0Jjs_.0(5,('bKn)A<)N'epMD0d at J>!!!!4#8."L#87jX -)ZTj!!!31zzzzzzzzzzzzzz -zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz -zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!!6(zzzz,99,W0`V1R!!!!Q -,W-\E!!#SP,#VZ=!#Zah)$^Be!!!mG0d:.8'`\4I#8."L#87[S('"=7!!!f?z!!!i@#9"0S&I0-Q -!!a;?!#Gk?zz&I0-Q!!a;?!#Gk?(`FA+#87(L#8dFR#87(;!##SM!$hgU#UCJlzz!$2 at M*YeYm*WQ0V -#64`('*f-M&dK'^#8R:>!!"6S=!I\Fzz'*eL;!!!!('*&"E'*&XM*Zbsp&dK'M!#PqX'f/rg0HU90 --jV.A!!!!G#V@&Mz!!!!G#RC\A-ia5I!!!0(zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz -zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz -zzzzzzzzzzzzzzzzzzzzzzz!!!6(zzzz,:s0,#Sd=>z!&,TR,8Lsn!-<6W0m+H9!#Qa^'*&mk!!$,( -+uM#F#8R:P#87jX'*&"4!!!f?zz',1Ze&I0-Q!!a;?!#Gk?zz&I0-Q!!a;?!#Gk?)A`Ad#87(L#8dFR -#87(;!##SM'aP'N#REHkzz!!!WJ#93^]*WQ0V#64`('*f9Q&dK'c#87(;!%%tj#64`(zz'*eL;!!!!( -'*&"E'*&"K#6ttD&dK'M!#Ss)+t.+C&g&h6-ku^^!!")b#RE",z!!!!G#RC\['`\46!!!6)zzzzzzzz -zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz -zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!!6(zzzz1^F?m#V,lTz -!!")f+q8\q!!$D7<*1^T'*&ac'*&ma(_[ko!&,o/>m)5j#6tnV)AiGS*<6l\&f1NJ!!!uU!#PqV -'*f0N'aG]Y!#,YQzz'*f0N'aG]Y!#,YQ#9EjY#87jb#9+Wu#87(;!#GkU0*hgh#\b1mzz(`iYW*ZP.t -'GqK'#64`(&I/sL*X;o`'H.f52,5A4#8.gQzz(C(QQ!!!W:(B=FK(B=FN#8[@?('bj)0e-6-*rlpt -GUb*Vz!!"_Z#RC\mz!!!!G#RC\_z!!!6(zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz -zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz -zzzzzzzzzzzzzzzzzzzz!!!6(zzzz!&4`b#RDOQzz/Hd7E+!q83#C/!Q.XG)9'`\mP*Z#%d#64`K -HWLJECE3Bf'F+j](]YBX)%mMd&HEgl#6u7]#6tJI#6tJT*X;oTz!!!!2#6tJI#6tJT*X;oT'*fEp -)B'G*)$^`Y#6tnB(C(0M/I2Uf":#/:(]XO9z(_[Sg'G^Z^#9FZd#6t5/'bgle)[@A`&en[YH5HW! -#8n-e#8[@?!!!!(#6tJI!##SB#6u+O#6t5/*YJGh?&czzz!$a3D,V^MDzzzzzzzzzzzzzzzz!!!!Q#RDgYz -zzzzzz!!!!I#UUWJ+tiorzzzzzzz!!!!@0Jt%/'`\4f#RC\L,VT2uzz+:&61,6.]Dz!!!!G#UBBMz -!!!6(zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz -zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!!6(zzz -zz!&4a)zz!!!!U#RC\A#RE*az!&-5R-ku^^zzz+=JEk0,4Hezzzzz!!!!?#6tJ=#6tJTzzzzzzz -!!!!I#UfZQ!!!!9#6tJ=#6tJ=(]XO9zzz!!"DQ#RF9a'`\46zzzzzzz!$EZq1b\n0!!",I#RC\l -'`\46zz1^GKOzz!!!!G#Ts*Iz!!!6(zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz -zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz -zzzzzzzzzzzzzzzzz!!!6(zzzzz!!"/d-3+#Gz!!!!60d6l/#RC\\z!!!!6-mCK%z!$;1 at z!!!!B -.gRsc*rl9 at zzzzzzzzzzzzzz!!!!C-ia5Izzzzzzz!%8*Y#REd>zzzzzzz!!")o,U>)Zz!$`Zn#RC\A -2#mUVz!!!!Q+truszz!!!!G1]RLUz!!!6(zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz -zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz -zzzzzzzzzzzzzzzzzzzzz!!!6(zzzzz!!!!61`l\tzz!!"]0#RC\[,6.]Dz!$$2,:I96bWCBk(L#6tJ=#6tJ=,@@p`4@#6tJ=#6tK? -zz -!!")o+p\G[#Vc;Z!!!6(z!!!!D0dJ"k'efn!0`V1R!!!!(zzzzz!!!!(zzzzzz#64`(zzzzz#66.X -#RD\1+TMKBzzz!!`K(!!!!D2$aI^.gROGzz!!`K\#RDq(zzzz!!!6(zzzzz!!!6(zzzzzzzzzzzzzzz -zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz -zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!!6(zzzzz!!`K(zzzzz!#8Z;zz -!!!!@+p\G[#RE:&!!!6(zz!!"/j+>a?0#W3=s!!!!(zzzzz!!!!(zzzzzz#64`(zzzzz#:Kj80-^Gsz -zzz!!`K(!!"\s#RC]"0-:/ozz!!ant-5?L\zzzz!!!6(zzzzz!!!6(zzzzzzzzzzzzzzzzzzzzzzzzz -zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz -zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!!6(zzzzz!!`K(zzzzz!!!6(zz!!!!D1a322 -#RC\[+TM`Izzz'aP'N#RDUt!!!!(zzzzz!!!!(zzzzzz#64`(zzzzz%zzzzz!!!!(zzzzzz#64`(z -zzzz#64`(zzzzz!!b2%#RD\+-6OB1zzz!!`K(zzzzz!!!6(zzzzz!!!6(zzzzzzzzzzzzzzzzzzzzzz -zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz -zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!!6(zzzzz!!`K(zzzzz!!!6(zzzzz!!!6( -zzz!!!!6+!WW3#zz!!!6(zzzzz%hJdBzzzzzzzzzzzzzzzzzzzzzzzz -zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz -zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!!!%%KHJ/zzzz!!`K(zzzzz!!!6(zz!!*B0 -#7_%@z!!!6+"pP/0zzzz!!!!(zzzzz!!!!(zzzzzz#64`(zzzzz#64`(zzzzz!!`K(!!!!+!sf&8 -"q1V9%fcS0z!!`K(z%fukC"U>5?":G51z!!!6(zzzzz%0Z_3zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz -zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz -zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz"pk80zzzz!!`K(zzzzz!!!6(z!!!?3%M0$N%fcS0z -!!!Y582 -!!`K(zz!!!?."9f>J"UG2;!!!6(zzzz!!!!$&-2b2zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz -zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz -zzzzzzzzzzzzzzzzzzzzzzzzzzzzz$3pnMH#mUG1zzz!!!!" -!X&o9#6b>7$31&+zzz!!!*4$31&+zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz -zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz -zzzzzzzzzzzzzzzz!!zzzz!!`K(zzzzz!!!67!t5DE":>,/zz!!*67#lk23zzzzz!!!!(zzzzz -!!!!(zzzzzz#64`(zzzzz#64`(zzzzz!!`K(zzzz!!!',%0m+J#QkD6zzzz%futE"pY;;!s&B%zz -!!j,Czzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz -zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!!*4 -!rr<$zzz!!`K(zzzzz%g*%A"UP20zz!!!!0":#2C!!!68%06G/zzzz!!!!(zzzzz!!!!(zzzzzz -#64`(zzzzz#64`(zzzzz!!`K(zzzzz!!a#9":PJG"U#2Dzzz!!!6(!"T,6$kNsR":G_?!!!!#%LrgGz -zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz -zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!!!,&.AR>zz -z!!`K(zzzz!"T/8#7LhJzzz!!!')"UY50!!!67%1iXQzzzz!!!!(zzzzz!!!!(zzzzzz#64`(zzzzz -#64`(zzzzz!!`K(zzzzz!!`K(!!!!"$O?n@"q:kGzz!!!6(z!!!$-#R(G;%<-t3"98E%zzzzzzzzzzz -zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz -zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz%h/aP#m(G6zz!!`K(zzz -!!!N3$jR1C%fch7zzz%gW^Qz!!!6(!"&l@!rr<$zzz!!!!(zzzzz!!!!(zzzzzz#64`(zzzzz#64`(z -zzzz!!`K(zzzzz!!`K(zz$4..G#6b5<%fcS0!!!6(zz$3C<`)MX"P"U#2Dzzzzzzzzzzzzzzzzzzzzz -zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz -zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!?%06G/zzzzzzz!!!!$"pG&.zzzzzz -!tYP7zzzzzzz!"T2D%06G/zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!"TGC%L3.D$31&+z -zzz$4.+G"pbSIzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz -zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!!!0":u"C -zzzzzzzz!!3?/!WW3#zzzzz!!!!$&./C;zzzzzzz!!!!0%0m"Hzzzzzzzzzzzzzzzzzzzzzzzzzzzzz -zzzzzzzzzzzzz!!*02"qV1F!<<*"zzzz!XK8@"UPM9zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz -zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz -zzzzzzzzzzzzzzzzzz!"T2D"UY50zzzzzzz!!!!0$kN^Fzzzzzz!!!*4$31&+zzzzzzzz!!*67!rr<$ -zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!"'#@&-`CJ%fcS0zzz!!!!0!t>eG%1<[Hzzzz -zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz -zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!!!0":t_!!!!(#lt26$3:G6!W`T.!s/W,!seo.":"r7 +!!*3&!!!!)!<<*"":Y>2!Y,AA!"0;>!rr<.!WW<'%KHJ/zzzzz!!!$#zzzzzzzzzz!!*'"zzzzzz +!!*'"zz!!!$"zzzzzz!s&]9#Qau+!!!E.%0?q=!&0z!!!<+%1!7@!$OHh7#R(_G%0?M0 +!!!'(!8"pb5;":>,/!!!98!"9,&0%0QY5!rr<$!!!!'!<<*"!!;!!<<'!"&c;#ljr*z +zzzzz!!*'"zzzzzzzzz!!!$#zzzzzz!!!$"zz!!!!"zzzzzzz!"9&>#lt,.%1342!X\o5 +!<!"B&2!s8N'z"p#)3!!!*3!!!*'!"B&2z +!!!!#%1E4G#QOu:!!!'-!!iT*%h&F!!!',$jH\3z!!!9* +!!!!%%0-A0#64o/!WW<)!!!?-!"TJ#/#6>&7!=&T)z!"/l0%L3"7!"B&2!!*?*$3CD4$NL/,#6=f)zz!!s/=!<<63!!!6)#655C!X\u/ +!"',Azz!"&c-!!!H2!!!*$!X]GG#6>&0!!*?5%1W@%0-A0%0-J2!!3<.!!3-0%KHJ/z +!!!!$!t,P>!!NK*!"T/3#6>&2!<<*-!=8`+z!!!!)!<<*"":Y>2!XA],!=&T,!rr<.!WWH/!WW3#zzz +zz!!!!"zzzzzzzzzz!<<*"zzzzz!!!!"zzz!!*'"zzzzzz!!!?6!!EH1!!!!'0 +!!<6%!X/c.!WWZ>z!s]27$P*aJ!X/Q.!5!!!$& +"pG&."Tn`4":"r8zz!!`N0!W`9&%0-A4!=&T,!t,P>!!!K4!rr<$z!!!?-!!!!."98E(!"/r4!!`N0 +!!!$*!"KGDzzzzzz!!!$"zz!!!!"zzz!!!!"zzzzzzzzzzzzzzzzzzzzzzzzz!<<*"zzzzz!!!!) +!WW3#!s&]9!WiB/$O-V<$3:/4!!<6/$3:D6!86!"T)5!!=&T,!=B/7#RCS7 +%0m7M"U4r,z!!!!*!=Su1!!bNz!!**Vzzzzz!'^Jb!u!!"o;!3<0$Zzzzzzzzzzz +1HRAm!!"o;/OW#f59zzzz%LN19z!!!9*!!!!%%0-A6$4-\4!!ET;!!!'-!!!N=zzzzz!!**#zzz +zzz!2z!!`Z.%0m%;!=Ai6!2#Qt;:!!!N2%0-A0 +$3120$ig8-zzzz!!!!"zzzzzz!!!$"zzzz!!!!"!<<*"z!!*'"zz!!WT-"98r?z#ltJ@#lt&-!=8c. +!!=9,?!!Y#,0z!!ET9!XSi5 +!WWQ:!!E`2z!!!'%!!rW.$31&0!WWT/#QP/4#6b;;!=K#;zz#QXr,!2!W`<. +!WW3#zzzzz!<<*"zzzzz!!!!"zzzzz!<<*"z!!!$#zzz!!!-)z#S-nD#R:A1!!NE(!!r],$jltD +":GAC#6=f)!!!!&!"K&1%13(A#n$eDz!!!!$!rrZ:$NUG:%0HS4!rr<$z$3g_G!!<9&"p"u0%KQP; +!=/f7$N^V7!s/H&z!!!'$!,/%0QY2!=/Z4!Wi]/!!!!%$31&+z!!iT*!!!-2!!!9-#6>&3"p>A8!!3K4%0lk5zzzzz!!**#zzz +zzz!#/#6>&4%0-A.z!!Wr;#6YA6!"B&2!!*?*$3C88z +":>,/z!!!9*!!!!%%0-A6"98r@%fc_A!!!'-!!3H,zzzzz!!!!"zzzzzz!!!$"zzzz!!!$"zz!!*'"z +z!!!!$#6527!tPA>!s&l:!<<*/"98E/!WW9/"p#)3!!!6)z!!!'0$ig_>!!<<'":Y>2z!!Ni4!!!-* +!!!-2!!<<'z!!!!%#mgS6!WWH+#65#1!!!$*%h&Fz$31PB!!NE( +%hAXA"TSN&z!X/c.!WWZ:!!3K-!X/Q(z!!3E+#n@(E!!!0*!!!$&"pG&4!<`B."p>54z!!!!)!<<*" +":Y>2#Qt,5!<`B*%0-A0$31&4%fcS0zzzzz!<<*"zzzzz!!!!"zzzz!!!!"zz!!!$#zz!!!!/!WW30 +!Wrr=!WWW;#6>24"U"f*$3LYB$3153!"/o7!=Jl-!!!?+%LE+=!WW`A!!3<(z!!!N9$NL55!/1 +$3:/7!zzzzzzzzzz!!zzzzzzz!!!!."TSN&zzzzzzzzzzzzzz!"&l6!rr<$zzzzzzzzzzzzzzzzzz -zzzzzzzzzzzzzzzzzzzzzzzzzzz!!!!"#n at LU!WW3#zzzz$Od7K!rr<$zzzzzzzzzzzzzzzzzzzzzzz -zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz -zzzzzzzzzzzzzzzzzz!!!!""9o&4%fcS0zzzzzzzzz!!!!$&./C;zzzzzzz!!!B<%fcS0zzzzzzzzzz -zzzz!!!!,"pG&.zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!!?3"pP>6zzzz!!!N9 -%M/mHzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz -zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!"02?%0?M0zzzzzzzzzz!!!*4$31&+zzz -zzzz!"TVKzzzzzzzzzzzzzzzz!!EiB%fcS0zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz -zz!!3T@%LEXGzzzz!"'/H"Tn`)zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz -zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!!$&"pPAEzzzz -zzzzzzz!!zzzzzzzz!!NW.zzzzzzzzzzzzzzzz!!!$/&-Mt5zzzzzzzzzzzzzzzzzzzzzzzzzzzz -zzzzzzzzzzzzzzzzzzz!t5DD!WW3#zzz!!!!0!tGkF!<<*"zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz -zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz -zzzzzz!t5DD!WW3#zzzzzzzzzzz!tYe>zzzzzzzz#mLn?zzzzzzzzzzzzzzzzz!X/c9zzzzzzzzzzzz -zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!!$&"pPAEzzzz!!!'0#7V"?zzzzzzzzzzzzzzzzzzzz -zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz -zzzzzzzzzzzzzzzzz!"&uC%LEXGzzzzzzzzzzz!!!!+&-Dn4zzzzzzz!!!!"&-;h3zzzzzzzzzzzzzz -zzz!!!*4"T\T'zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!"02?%0?M0zzzz!<`r; -!WW3#zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz -zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!!$+%M/mQzzzzzzzzzzzz!!!$2!rr<$zzzzzzz -!!!!&#QOi)zzzzzzzzzzzzzzzzz!!!!0":#2Czzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz -zzzzz!!!!"":u%Fzzzz!!!N9"pP/0zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz -zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!!!0!t5DC$NL/,z -zzzzzzzzzzz!"TPKzzzzzzzz!!!<0%fcS0zzzzzzzzzzzzzzzzzz!!*K>!rr<$zzzzzzzzzzzzzzzzz -zzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!!*2"p>G:zzzz!!zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz -zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz$4$h?#RUP3zzzzz -zzzzzzzzz!!!N@!rr<$zzzzzzz!!!!"&-;h3zzzzzzzzzzzzzzzzzzzzz!Y,\Azzzzzzzzzzzzzzzzz -zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!!$/&-NLDzzzz%gW^Lzzzzzzzzzzzzzzzzzzzzzzzzzzzzz -zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz -!"&u9"pbP9zzzzzzzzzzzzzzz!!!03zzzzzzzz!!!!&#QOi)zzzzzzzzzzzzzzzzzzzzz!!!<:%1`F= -zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!zzzzzzzz -zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz -zzzzzzzzzzzzz!"0>Ez!"05?&.K!Xzzzzzzzzzzzzzzzzzz!!!?;!<<*"zzzzzzz!!!!"&-;h3zzzzz -zzzzzzzzzzzzzzzzzzz!!!(VM$F7pzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz -%gzzzzzzzzzzzzzzzzzzzzzzzzzz -zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!!B< -#6tKk"qV1F!<<*"zzzzzzzzzzzzzzzzzzz!!Ec3zzzzzzzz!!!<8%fcS0zzzzzzzzzzzzzzzzzzzzzz -zz!!!-,#6tJ=#7UY5zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!!!$&-Dn4zzzz -%1WmKzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz -zzzzzzzzzzzzzzzzzzzzzzzz%h&[J#6tJ=!WW3#zzzzzzzzzzzzzzzzzzzz!>#Szzzz!"BDKzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz -zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!!!,&-iFF#6tJ=!WW3#zzzzzzzzzzzzzzzzzzzz -"UG).zzzzzzzz!"K,3zzzzzzzzzzzzzzzzzzzzzzzzzz!"&uA#6tJCzzzzzzzzzzzzzzzzzzzzzzzzz -zzzzzzzzzzzzzzzzzzzzzzz!"'8>zzzz!!!03zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz -zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!"TJC#6tJ=%L!7D!<<*"zzzz -zzzzzzzzzzzzzzz!!!!,&.\a at zzzzzzzz":bD3zzzzzzzzzzzzzzzzzzzzzzzzzzz!=9/>%0-A.zzzz -zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!!?;!WW3#zzz!!!N@!rr<$zzzzzzzzzzzzz -zzzzzzzzzzzzzzzzzzzzz!!!?8"pYA<#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ= -#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ= -#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ= -#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ= -#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6t_J!WW3#zzzzzzzzz -zzzzzz!!!!'!rr<$zzzzzzz!!!!+#7:G2zzz!!!N9"U>8;#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ= -#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ= -#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ= -#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ= -#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ= -#6teK!tPA3zzz!!!!$&.\a at zzz!!!!#&.\a at zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!#;4zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!!H>!WW3#zzzzzzzzzzzzzzzzzzzzzz -zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!!?9"V1S5zzzzzzzzzzzzzz!!rf/zzzz -zzzz!"TVBzzz!!!?;%1`F=zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz -zzzzzzzzzzz!!!!)&./C;zzz!"/uAzzzz!!EH*zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!j,Czzz -zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!!!0%Ls!Lzzz -zzzzzzzzzzz!!WK)zzzzzzzz!!iu5zzz!"'8?zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz -zzzzzzzzzzzzzzzzzzzzzzzzzzzz!tYe>zzz!!!0*zzzz!"T8Azzzzzzzzzzzzzzzzzzzzzzzzzzzzz -zzzz!tYe>zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz -%h9$Kzzzzzzzzzzzzzz!tG;2zzzzzzzz!=&W*zzz%gEICzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz -zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!zzz!!!'3%fcS0zzz!!!**zzzzzzzzzzzzzzzzz -zzzzzzzzzzzzzzz!!!!"&.8I8DQzzzzzzzzzzzzzzzzzzzz*=!2Wzzzzzzz -zzzz!#cLNzzzzzzzzzzz!!!6/#6tnB'*eaI#8maO'*&"4!!!!4#6u+O#6tJ=#8A!Tzzzzzzz!"TVIzz -zzzzzzzzzzzz"p4i*zzzzzzzz"U"f*zzz$j?V2zzzzzzz&I/OSz&el&\zzzzzzzzzzzzzzzzzzzz -(_dbdzzzzzzzzzzz!#$7Nzzzzzzzzzzz!!!Z;#6tJ6!!``6#87=I)AN5P!!!!6)@$K\#6tJ=#6u7Lzz -zzzzz!!!97zzz!!!!&"98E%zzz!!!!'!rr<$zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!!!-%0-A.zz -zzzz!!!!>)AO,2!!!!<)uos=zzzzzzzzzzzzzzzzzzz!!!!4#6tkAzzzzzzzzzz!!!c>'-7f))uos=z -zzzzzzzzz!!!!8#8.":!"oMQ!!!Z;)AN5P!!!`P#9zzzzzzzzzz!!!!3#8[@?!!!f?&c`Xb#87(; -!!!!4#6ttD&dK'M'bglnzzzzzzz!!!!/"98E%zz!!!!#&-)\1zzz!!!!$"onW'zzzzzzzzzzzzzzzzz -zzzzzzzzzzzzzz!!!?;%fcS0zzzzzz!!!!:*WQu]!!!`J'`\46z!!!!9'*&"4zzzz!!!!6)uos=zzzz -zzzzzzz'*f-Mzzz!!!!?zzzzz!!!!4(]XOL*#]\2('"=7zzzzzzzzzz!!!!4#64`(!!!6;!!!TK -#87(;!!!TK#87(;'*eL;!#u4Uzzzzzzz!!!!.%0-A.zzzzzzzzzzzz!!!!."98E%zzzzzzz!!!!' -!rr<$zz!!!!&"98E%zzzzzz!!!!2#8e'Y'*&"G'*&"4zz*WQ0?zzzzz',U]Lzzzzzzzzzzz!!a;?zzz -!!!!4(]XO9zzzz!!!!9'*&"J(DIc/'*&"4zzzzzzzzzzz#87(;!!!Z;!!!!:)&a4i!!!!:)$^-A -!!a/;!#>eWzzzzzzz!!!!+#6=f)zzz%Kc\2zzzz"p4i*zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz -!!!H6zzzzzzz!!!!:*WQu]!!!uXzz!!!WL'*&"4zzzz!!!!?*WQ0?zzzzzzzzzzz'*f-Mzzz!!!Z;zz -zzz!!!i@(]XOL*Z>n4('"=7zzzzzzzzzz!!!!4#64`(!!!6;!!!TE)&WDS!!!lM#87(;'*eL;!#u4_z -zzzzzz!!!!"#6=f)zzzzzzzzzzzz!!!N7!<<*"zzzzzzz!!!**zzz!!!?;%fcS0zzzzzz!!!!2#8e'Y -'*&d^zz!!!!4#64`(zzzz!!!!9#8dF at zzzzzzzzzzz!!a;?zzz!!!i@(]XO9zzzz!!!WL'*&"J(E",4 -'*&"4zzzzzzzzzzz#87(;!!!Z;!!!!:&I/mJ!!!TK(C'p?!!a/;!#>eRzzzzzzzz%0uq6zzz#n-e6zz -zz!tG;2zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!!Q;zzzzzzz!!!!8)AO,2!"g4Oz'bglo*>04p -#6u"\#9F*k#8mLT#6u(G()-uY*Yf_$#6th@!!!!2#9"Np'c.)j)$_2q'F,Nlzz!#6IY#8 at pR!#GkF -)%ciK'*f-Mzz(C(Wf(_[,Z#8\$l*Xj*>f"d#8n9u)&*;\#8mLT#6u(G()-uY*YoUu#6tk])&"&) -#8R:>!!!!=#6tJI!"fnd)@%$!)&*;h'*eaI)up3K#87(N#6t5F#8.":z#87(;!!!Z;!!!!:'cIqi -!!!lK(C'p?!!a/;(_d2ozzzzzzzz$4m1;zzz!=',8zzzz!!WK)zzzzzzzzzzzzzzzzzzzzzzzzzzzzz -zz!"&o1zzzzzzz!!!!6'F,Kk&ek<_)$_2_*?G1n'EAaN'*&gR#8dF@'H$lN'*f?h)A`Am#8$qR*WQ0? -!!!`=(]Y3_(C(0]!$):c&eYEczz!$2gh&fMPd*#',&'F,BR'*f-Mz!!!!<)AN5n(]Y?W!"fG@'*&"O -#8$qN)BJkl)AW;e)#t6R(]XO9!#cLNz!!!uQ!#PqS(C(0^!"fG@'*&"G#8Isl)up`m*<6'V)uos=z -!!!!4#6tJ=#6tJI!!!TE'cIbd!$2dd#87(;'*eaI)A<)Nzzzzzzzz$O-S2zzzzzzzzzzzz!!!K:zzzz -zzzz!!EH*zzz!!!01zzzzzzzz&I/OW!$)XO*![B!'aGQU',(?^#65>@#87(;)[?rT'cJ+n',hVd -'H$l_#8dF@!!!!>*WQfe&dJXZ((qN('*&gR&c_n3z!#PqQ!$):W',hVd(C(TR!!a;?zz'GCH`)upQU -(]YEY)%loL'H$lN'*f?h)A`Am#8%RR'*&"4!#$7Nz!!!c>)ZUot&dJX_!!!lA)%loL)BAek#8S$g -'EA+J'GUTJzz#6tJ=#6tJ=!!!!:!##SV!#QUS(C'p?!!``6#9FW\zzzzzzzz!"KA:zzz!"KA:zzzz -!!E]1zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!"/r1zzzzzzzzz*Yn_n*Ynto*?#Rk!!!W:'*&"K -#64`(*Z4qX&I0-d#8I4=!!!!:*WQ0?!!!`=*YJGQ!#Gk?!#PqQ!!!oYzz('bcY!!!!7#87(;&dKBV -'*f-Mz!!!!<#8[@?!!!f?!!!T9(]XOQ#8$q9)'/br*<6'>!!!T9(]XO9zzz',_#g!#Gk?!!!T9(]XO9 -!"fnM*WQ0R#8."Q(]XO9z!!!!4#64`(!!!6;!!!TE!##SS(`F,%#87(;'*eLN#8$q9zzzzzzzz!!a#7 -zzzzzzzzzzzz!"'8;zzzzzzzz%hJdBzzz!!!Q2zzzzzzzzz(`WMf#8eF!'aGcm!!!!8#64`9#8dF@ -(^CWQ!#ZgX)BAeX!!!!2#8dF@!!!!>)A<)N!"oMM!!"&X!!!Z;(]XO9z!#u[Qz)B8_W!#Z[T!!a;?zz -'GMAa!!!T9(]XOR*WQ0?*Z4qX&I0-d#8I4=!!!W:'*&"4zzz(*!Pa!"oMM!!!!:*WQ0?!#6:T#8dFX -#8$qJ'*&"4zz#87(;!!!Z;!!!!:!#6Cn!$2dR(C'p?!!a/P)&WDSzzzzzzzz!!i]-zzz!!E`2zzzz -!"T;8zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!EN,zzzzzzzz!!!!4'*&XM'*&mi&fCoZ*<6]W'*&"K -#64`(*Z4qX&I0-h)?9a;!!!!:*WQ0?!!!!4#6tqY!#Gk?!#PqQ!!!lXzz&I0'O!!!!2#8$q9!#ZgX -'*f-Mzz*X;ok'`]$T!!!T9(]XOQ#8$q9)'0Cq'*&"4!!!T9(]XO9zz!!!iS*"`Dh!#Gk?!!!T9(]XOK -'GM2u*WQ0T)Aa,&zz!!!!4#64`(!!!6;!!!TE!"oMX*YSMd#87(;'*eL;'H.Sazzzzzzzz!!NE(zzzz -zzzzzzzz!!j#6zzzzzzzz"9ec*zzz!!!6(zzzzzzzz!!!!6'GUTa#65>@()$oX'G^Zb#64`9#8dF@ -(^CWQ!#Zgj#87(;!!!!2#8dF@!!!!3)$^Be!"oMM!!"&X!!!T9(]XO9z!#ZaV!!!!3#8[@?!#Gk? -!!a;?zz(^C9a&HECJ(]XOR*WQ0?*Z4qX&I0-h)?9a;!!!W:'*&"4zz!!!!?)''Lu!"oMM!!!!:*WQ0? -'*f"Y&I0-d#8R:>!!!!:*WQ0?z!$)sr!#Gk?!#PqQ!!!lXzz('bKQ!!!!7#8[@? -!#cXR'*f-Mzz!"p(Q)upc[!!!T9(]XOQ#87(;)'/br)uos=!!!T9(]XO9zz!!!oR!"oMM!#Gk?!!!T9 -(]XOU)#sXS*WQ0?*=!Aozz!!!!4#64`(!!!6;!!!TE!!!f?#8I4O#87(;'*eL;&fMGazzzzzzzz -!!`Q*zzzzzzzzzzzz!!Wf2zzzzzzz!!!!0&-2b2zzz!!!6(zzzzzzzz!!!!=)ZTjS#65>@('"=T -)B&Sl#64`9#8dF@(^C]S!#ZgX)B8_W!!!!2#8dF at z!#Qa^'+tN`!!"&X!!!T9(]XO9z!#umWz)ArMT -!#ujV!!a;?zz!!!ZH#8RmV(]XOR*WQ0?*Z>"Y&I0-d#8R:>!!!W:'*&"4zz!!!Z;&c`^Q!"oMM!!!!: -*WQ0U#8$qJ#8dF@)[@0!zzz#87(;!!!Z;!!!!:!!!W:#992.#64`((C(]g'F+jT)AEea'b^Qb'GqJ`!!!!5&c`R`!#u4Z!#l.V!#5_Qzz!#-=g!!"#> -*X<8W&I/pK*=!>[z!!!!9*WQ0])upc[&f22d(]XOK#93^W#6u:j#87(;'+tl^)]ShXzz!#5_[!##SN -(*!PZ!!!Z;(]XOM)AO)-*Yn_U&dK(B=FN#991gz -z!!"#E(_RMf&f(]c!!!!;*WQ0Z#87(Y#8e3V!#Z"Yzz!!!!3#8[@?!!!f?&c`Xb&c_nO#8.":*![2Y -&dKBV!!!]<'*&"4zzzzzzz!!!6(zzz!!!K1zzzz!!!!'$31&+zzzzzzzzzzzzzzzzzzzzzzzzzzzzzz -!!!6(zzzzzzzz!$)XO!!!!7)$_2_',)8h*YeYr#87mY#6t5/()dE!',_G`(`@i*<6]i -#8e<`#9EjF()dE!',_G`(`'Q#6tJI#6tJ=!!!c>#6u(Gzzzzzzz!!!6(zzz -!!!0)zzzz!!!!)#QOi)zzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!!6(zzzzzzzzzzzzzzzzzzzzzzzzz -zzzzzzzzzzzzzzzzzzzzzzzzzzz!#ugUzzzzzzzzzzzzzzzzzzz!!`K(zzzzzzzzzzzz%LW7:zzzzzz -z!!!H;zzzz!!!6(zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!#$"Gzzzzzzz -zzzzzzzzzzzz!!!6(zzz!!!-)zzzz!!!!+"onW'zzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!!6(zzzzz -zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz(*3GUzzzzzzzzzzzzzzzzzzz!!`K(zzz -zzzzzzzz!!!!0#7ge7zzzzzzz!!*<*zzzz!!!6(zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz -zzzzzzzzzzzz'bhA_zzzzzzzzzzzzzzzzzzz!!!6(zzz!!!-)zzzzz&./C;zzzzzzzzzzzzzzzzzzzz -zzzzzzzzzz!!!6(zzzzzzzzzzzzzzzzzzzzzzzzz*X;oT#6tJ=*WQ0?zzz!!!!(#6tJ=#6tJIzzzzzz -zzzzzzzzzzz!!!]<'G:BGzzzzzzzzzzzzzzzzzzz!!`K(zzzzzzzzzzz!!!!,"TSN&zzzzzzz!"BA;z -zzz!!!6(zzzzzzzzzzzzzzzzzzzzzzzzz(^C9N#6tJ=#8dF at zzz!!!!4#6tJ=#6tJ=zzzzzzzzzzzzz -zzzz!!"#E)&N>Rzzzzzzzzzzzzzzzzzzz!!!6(zzz!!!*1zzzzz%1*"7zzzzzzzzzzzzzzzzzzzzzzz -zzzzzzz!!!6(zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz -zzzzz!!`K(zzzzzzzzzzz!!!!."98E%zzzzzzz!=&W*zzzz!!!6(zzzzzzzzzzzzzzzzzzzzzzzzzzz -zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!!6(zzz!!!'(zzzzz!sJZ)zzzzzzzzzzz -zzzzzzzzzzzzzzzzzzz!!!6(zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz -zzzzzzzzzzzzzzzzz!!`K(zzzzzzzzzzz!!!!'!WW3#zzzzzzz":Y>2zzzz!!!6(zzzzzzzzzzzzzzz -zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!!6(zzz!!!'(zzzzz -%gN(7zzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!!6/#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ= -#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ= -#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ= -#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ= -#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ= -#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6t5/zzzzzzzzzzz!!!N7zzzzzzz!!!!0&-2b2zzzz!!!6/#6tJ= -#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ= -#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ= -#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ= -#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ= -#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ6zzz!!!'(zzzzz!"K&1z -zzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!!6(zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz -zzzzzzzzzzzzzzzzzzzzzzzzzzz!!`K(zzzzzzzzzzz!!!B1zzzzzzz!!!!%$ig8-zzzz!!!6(zzzzz -zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!!6(zzz -!!!*0zzzzz!"B57zzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!!6(zzzzzzzzzzzzzzzzzzzzzzzzzzzzz -zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!`K(zzzzzzzzzzz!!!9-zzzzzzz!!!N@ -!WW3#zzzz!!!6(zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz -zzzzzzz!!!6(zzz!!!-)zzzzz!!s)7zzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!!6(zzzzzzzzzzzzzz -zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!`K(zzzzzzzzzzz!!!01 -zzzzzzz!!!-*zzzzz!!!6(zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz -zzzzzzzzzzzzzzz!!!6(zzz!!!-)zzzzz!!3W1zzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!!6(zzzzzz -zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!`K(zzzzzzzz -zzz!!!67zzzzzzz!!!3)zzzzz!!!6(zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz -zzzzzzzzzzzzzzzzzzzzzzz!!!6(zzz!!!E0zzzzz!"T;7zzzzzzzzzzzzzzzzzzzzzzzzzzzzzz -!!!6(zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz -!!`K(zzzzzzzzzzz!"&o1zzzzzzz!!<]2zzzzz!!!6(zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz -zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!!6(zzz!!!0(zzzzz!!!Q2zzzzzzzzzzzzzzzzzzzz -zzzzzzzzzz!!!6(zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz -zzzzzzzz!!`K(zzzzzzzzzzz!!zzzzzzzzzzzzzz -zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!3]6zzz!!!<6zzzzzz -!!!0(zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!"TPL%fcS0zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz -zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!!!0"V)%Czzzzzzzzzzz!!!!"&-)\1zzzzz!!!!* -$ig8-zzzzzzz!!!*4!rr<$zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz -zzzzzzzzzzzz#mUP4zzz!!!32zzzzzz!!!31zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!!N=&-Dn4zz -zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!!<:$kE=kBzzzzzz!!G<%fcS0zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!!!%"98E%z -zzzz!!Wf2zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!!-,#ljr*zzzzzzzzzzzz -zzzzzzzzzzzzzzzzzzzz!!!!&"98E%zzzzzz%gN(7zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz -zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!*B9&.K!Izzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz -zzzzz!!!!)"98E%zzzzz$O-S2zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!!!+ -"q2"Bzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!!'3%fcS0zzzzzz$O$M1zzzzzzzzzzzzzzzzzzzzz -zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!=95I%0?M0zzzzzzzzzzzzz -zzzzzzzzzzzzzzzzzzzzzz!!!!&!WW3#zzzzz%0QY2zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz -zzzzzzzzzzzz%h0'Ozzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!!0*zzzzzzz%1*"7zzzzzzzzzzzzz -zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!!!+#R1J=$31&+ -zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!!!&!WW3#zzzz!!!!0#6=f)zzzzzzzzzzzzzzzzzzzzz -zzzzzzzzzzzzzzzzzzzzzzzzzzzz!!!B<#QOi)zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!zzzzzzzzzzzzzzzzzzzzzzzzz -zzzzzz%gECAzzzzzz!!!!,"onW'zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz -zzzzzzzzzzzzzzzzzzzzzzzzzzz!"05@"To88zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!!!& -!WW3#zzzz!!!!'$NL/,zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!EN5zzzzz -zzzzzzzzzzzzzzzzzzzzzzzzzz"9ec*zzzzzz!!!!.#QOi)zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz -zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!!!0!sJo=$NL/,zzzzzzzzzzzzzzzzz -zzzzzzzzzzzzzzz!!!!&!WW3#zzzz!!!?;zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz -zzzzzz!!!?1"V1S5zzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!!!+#6=f)zzzzzz!!!!1!<<*"zzzzzzzz -zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!!$+ -"qV4Nzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!!!&!WW3#zzzz!!!H6zzzzzzzzzzzzzzzzzzzzzzz -zzzzzzzzzzzzzzzzzzzzzzzzzzzz!!!!0%1imIzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!!!&"98E%zz -zzzz!!!*2zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz -zzzzzzzzzzzz!"&uC"pk;1zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!!!&!WW3#zzzz!!!Q2zzzzzzz -zzzzzzzzzzzzzzzzzz!!!?-!WiZ2"9\i1"9\i1!WiE1zzzzzzzzzzzzzzzzzzzzzz!"0>D%fcS0zzzz -zzzzzzzzzzzzzzzzzzzzzzzz!!!<0zzzzzzz!!!K2zzzzzzzzz%fue6$NpS8"9\i1"9\f.!Wi?%zzzz -zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz$Om=E!tPA3zzzz -zzzzzzzzzzzzzzzzzzzzzzzzzz!!!!&!WW3#zzzz!!<]2zzzzzzzzzzzzzzzzzzzzzzz!!*--":PG< -#6tG:"U,/7"9\i1"9\i5"U,&@#6tD9":5,0zzzzzzzzzzzzzzzzzzzz!!!$'%LN19zzzzzzzzzzzzzz -zzzzzzzzzzzzzz!!*W4zzzzzzz!!3]3zzzzzzz!Xf,:"U,,9#6b87$j6\9"9\i1"9],:"V(bB"pGG= -!W`9$zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!!N3 -"U>JEzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!!!&!WW3#zzzz!!NH)zzzzzzzzzzzzzzzzzzzzz -!!!!0!X&r9#6tD@"9S]4zzzzz!"T,=":PbF"q:kGzzzzzzzzzzzzzzzzzzzz":#55zzzzzzzzzzzzzz -zzzzzzzzzzzzzz!!NW.zzzzzzz!"B&2zzzzz!!!?."9eu7%Kut"V;4K":G_?zzz -zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!*3,"pb50zzzzz -zzzzzzzzzzzzzzzzzzzzzzzz!!!!&!WW3#zzzz!=',8zzzzzzzzzzzzzzzzzzzz!!!!##n."C"Utb> -%fcS0zzzzzzzz!XT;?&.AXAzzzzzzzzzzzzzzzzzzz!"&o6%fcS0zzzzzzzzzzzzzzzzzzzzzzzzzzz -#mLn?zzzzzzz!=',8zzzz!!*0-"U>58":GP:zzzzzzzz!!!$-#R(GC#RUP3zzzzzzzzzzzzzzzzzzzz -zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz$4ROV#nI"9zzzzzzzzzzzzzzzzzzzzzz -zzzzzz!!!!&!WW3#zzzz#n6k7zzzzzzzzzzzzzzzzzzz!!!N;#R(GC%0Hq;zzzzzzzzzzz!=9/> -%LE.9zzzzzzzzzzzzzzzzzz!!!N=&-;h3zzzzzzzzzzzzzzzzzzzzzzzzzz!!!!+&-;h3zzzzzzz -%1N:;zzz!"'#@&.f!J!Y582zzzzzzzzzz!!!N;#R1hL!WW3#zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz -zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!!!$$jR1Kzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!!!& -!WW3#zzzz"q(D2zzzzzzzzzzzzzzzzzz!!!N9Mh)+aN/`8i"U,&5$j6\>!X\o-zzzzzzzzz!!!!0 -!t5DC!rr<$zzzzzzzzzzzzzzzzzz$P3RDzzzzzzzzzzzzzzzzzzzzzzzzzz!!!!/"98E%zzzzzz -!!!!"&-2b2zz!0/(#J;92$'EnXD"U,&8"9])6%fcS0zzzzzzzzz!!!?3"pP22zzzzzzzzzzzzzzzzzz -zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!*B1&-rUCzzzzzzzzzzzzzzzzzzzz -zzzzzzz!!!!&!WW3#zzz!!!!+"onW'zzzzzzzzzzzzzzzzz!$31&+zzzzzzzzzzzzzzzzzzzzzz -zzz!!!97zzzzzzz!!!!&"98E%!!!!##mcNQ#Ek9nPQV*j!WiE)!WiE+"9\l3#7q%E$NU5-zzzzzzzzz -!!3T7$j$D/zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz -$4ROV#nI"9zzzzzzzzzzzzzzzzzzzzzzzzzz!!!!&!WW3#zzz!!!!.#QOi)zzzzzzzzzzzzzzzz -!X&Z=zzzzzzz!!!'3%fcV4%1WW0R"/t+!WW3#zzzz!!*H1 -"U>5;$NL/,zzzzzzzz!!!!0"9o&4zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz -zzzzzzzzzzzzzzzz!!!!$$jR1Kzzzzzzzzzzzzzzzzzzzzzzzzzz!!!!&!WW3#zzz!!!!1$31&+zzzz -zzzzzzzzzzz!X&Z3%Y^!V&.K!Izzzzzz!!!!"!t5_N#nI"9zzzzzzzz!!!!"%0m=Czzzzzzzzzzzzzz -zzzz!X9&Dzzzzzzzzzzzzzzzzzzzzzzzzz!>#V=zzzzzzz!!&F$%1j(t%"8Eb#lt#+zzzzzz!!!'+ -"qV4Nzzzzzzzzz!!!**"q(D2zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz -zzzzzzzzzzzz!!*B1&-rUCzzzzzzzzzzzzzzzzzzzzzzzzz!!!!&!WW3#zzz!!!B:zzzzzzzzzzzzzz -z%g*4O"pd\e"pP>?zzzzzzzz!!!!$$jR4Czzzzzzzzz!!*N6":kJ4zzzzzzzzzzzzzzzzz!"TJB -$31&+zzzzzzzzzzzzzzzzzzzzzzzz%L<%7zzzzzz!!!!##_<3h8L+]L$j."?zzzzzzzz!"&u9"p5A9z -zzzzzzzz!sSo1zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz -zz$4ROV!tPA3zzzzzzzzzzzzzzzzzzzzzzzz!!!!-!rr<$zzz!!!E6zzzzzzzzzzzzzz!!*B9#7Lno -"9oDC$31&+zzzzzzzzz!!*36"TeZ(zzzzzzzz!!!!""U5>7zzzzzzzzzzzzzzzzz!!!!*&-Mt5zzzzz -zzzzzzzzzzzzzzzzzz!!!!.%KHJ/zzzzzz$OmXOCmuFR#7L\Fzzzzzzzzzz!sK5=%fcS0zzzzzzzz -!!!-5%1`F=zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz -!!!!$$jR4Lzzzzzzzzzzzzzzzzzzzzzzzz!!!!%"98E%zzz!"T;8zzzzzzzzzzzzz!!!N3%L3CE -!?%g`H2Oe)OQzzzzzzzzzzzz!Y,D9zzzzzzzzz!"0>H%fcS0zzz -zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!Y#\E!tPA3zzzz -zzzzzzzzzzzzzzzzzz!!!!%"98E%zzz!"K)2zzzzzzzzzzzz!!*?:%LEXV#mLS>!<<*"zzzzzzzzzzz -z!!!!"$kNdHzzzzzzzzz!Y>eOzzzzzzzzzzzzzzzzz!!!!$&-r79zzzzzzzzzzzzzzzzzzzzzz%hJgC -zzzz!!!!0!sK5F!WW92#7M1U!WW3#zzzzzzzzzzzz!!!<:%1`F=zzzzzzzz!!!N<&-;h3zzzzzzzzzz -zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!!N3"V;+Ezzzzzzzzzzz -zzzzzzzzzzz!!!!%"98E%zzz!=',8zzzzzzzzzzz!!!!$"V;+M!"'/?$k!%8zzzzzzzzzzzzzz!"0>I -%fcS0zzzzzzzz!"T5C$31&+zzzzzzzzzzzzzzzzz!=fS?zzzzzzzzzzzzzzzzzzzzz!!!!0%LiC1zzzzzzzz -!!!!%&.8I%fcS0zzzzzzzzzzzzzzzzzzzzz -zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz$Od7K!rr<$zzzzzzzzzzzzzzzzzzzz -!!!!#"TSN&zzz"q(D2zzzzzzzzzz!!!$/#7LY6%g3FR!rr<$zzzzzzzzzzzzzzzz":tY8zzzzzzzzz -$P3UEzzzzzzzzzzzzzzzzz!!!!,&-r79zzzzzzzzzzzzzzzzzzzz!!!H<%fcS0zzz%g*"?#nI"D -"V:q?z$P3==zzzzzzzzzzzzzz!!!?9$kE=zzzzzzzzzzzzzzzzzzzzzzzzzz -zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!!N9%M/mQzzzzzzzzzzzzzzzzzzzz!!!!# -"TSN&zz!!!!+&-)\1zzzzzzzzzz!X0,@!<<-0#7U_7zzzzzzzzzzzzzzzzz!"0>Ezzzzzzzzz!"'8Hz -zzzzzzzzzzzzzzzzz!=fS?zzzzzzzzzzzzzzzzzzzz!!zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz -zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!"'/H%Kd4Azzzzzzzzzzzzzzzzzzz!"&cYT)o&ozz -%hAXG%0-A.zzzzzzzzz!!!'(&-NLD!X0,@!<<*"zzzzzzzzzzzzzzzzz!!!?;%0-A.zzzzzzzz!!!N> -%0-A.zzzzzzzzzzzzzzzzz!!!99!WW3#zzzzzzzzzzzzzzzzzzz!tYe>zzz!=05F!WW`6&-WFAz -!!!N>"98E%zzzzzzzzzzzzzzz!"BDFzzzzzzzzz!!Ei?zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz -zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!sJo=!WW3#zzzzzzzzzzzzzzzzzz!"9);#6tJ6zz -!XAq&PQD?qzzzzzzzzz!sJl2%fct@&-NLDzzzzzzzzzzzzzzzzzz!!!!"%LiC$31&+zzzzzzzz!!!*4$31&+zzzzzzzzzzzzzzzzzzzzzzzz -zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!!$&"pP22zzzzzzzzzzzzzzzzzz!"0#: -#6tD4zz!XAr8#6t>2zzzzzzzz!!!'1"p4i*!sSr3zzzzzzzzzzzzzzzzzzzz%h9$Kzzzzzzzzz%h9$K -zzzzzzzzzzzzzzzzzz$4[4Mzzzzzzzzzzzzzzzzz!!!!.!rrZ>!rr<$zz!=]8C!<<-0#7U\6z!!*W< -!"BDKzzzzzzzzzzzzzzzz!!!!.&./C;zzzzzzzz!!!!$&./C;zzzzzzzzzzzzzzzzzzzzzzzzzzzzzz -zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!"05@$j-J0zzzzzzzzzzzzzzzzz!!!3.#6tD4z -z!XAr8#7^_6zzzzzzzz!X/c1!!!**"p4i*zzzzzzzzzzzzzzzzzzzz!"TPKzzzzzzzzz!"TPKzzzzzz -zzzzzzzzzzzz!"TMM$31&8$NL/,zzzzzzzzzzzzzzz!!!?2#:'i_zz!!!N8#7U\6!=]8C!<<*"z -!"9)D6O"&$zzzzzzzzzzzzzzzzz%0d=Czzzzzzzzz!tYe>zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz -zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!!!0#n at LP$31&+zzzzzzzzzzzzzzzz!!!-,#6t\< -zz!XAr8#6Fl*zzzzzz!!!?8!!!(4Ta:]!!sSr3zzzzzzzzzzzzzzzzzzzzz!!!?;!rr<$zzzzzzzz -!!!N>%0-A.zzzzzzzzzzzzzzzzz!!!!*#6PD?&-2b2zzzzzzzzzzzzzzz!!!0-#7"B3z!!io3&#,U( -!<<-0&-NLDzz!XAr8TI0^>zzzzzzzzzzzzzzzzz!"BDKzzzzzzzzz!!EiDzzzzzzzzzzzzzzzzzzzzz -zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!!?8&.SdQz!!j)8zzzzzzzzzzzz -zz!!!$)#6tA3zz!XAr8"TSN&zzzzzz!"'8B#\g%=*<60G"p4i*zzzzzzzzzzzzzzzzzzzzz!!!!+ -&-Dn4zzzzzzzz!!!!"&-Dn4zzzzzzzzzzzzzzzzzz$C:u^_6zzzzzzzzzzzzzzz!!3B1#6tJ9z -%0m*'TEh(h!=]SC%fcS0zz"U>8;#7q4Bzzzzzzzzzzzzzzzzz!!!H;$R=2#S-n8zzzzzzzzzzzzz!!!!,#6t;1zz!XAr>zzzzzz!!!!+&-iFF#6tJ=#B9_Dzzz -zzzzzzzzzzzzzzzzzzzz!!Fzzzzzzzzzzzzzzzzz!!!!%#6tJ=#6tJAzzzzzzzz -zzzzzzz!s]&9#6tY#6tJF -!<<*"zzzzzzzzzzzzz!!!!0&-iFF"TeZ(!"B/<#6tJ=#6tJ=!<<*"zz!!!-,#6tJ:%fcS0zzzzzzzzz -zzzzzzzzz$4m7=zzzzzzzzz!>#>5zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz -zzzzzzzzzzzzzzzzzzzzzzzFU&-V#6tJ>%fcS0zzzzzzzzzzzzz":"r-zz!XAi.zzzzzz!"'8B#6tJ= -#6tJ=#6t80zzzzzzzzzzzzzzzzzzzzzzz!!!!/#QOi)zzzzzzzz!!!!-$ig8-zzzzzzzzzzzzzzzzz -!!!N9"pYA<%KHJ/zzzzzzzzzzzzz!!!!%#6tG8z%0m+C#6tJ=#6tJ=#QOi)zz!"TVG#7U\6zzzzzzzz -zzzzzzzzzzz!!A4$4?t:zz -zzzzzzzzzzzzzzz!!!!0#mLb;zzzzzzzzzzzzz!!!H6%fcS0!!!H<"@`q4%1*(9zzzz!2?#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ= -#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ= -#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ= -#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ= -#6tJ=#R(GC!rr<$zzzzzzzz!"989zzzzzzzzz!,R2t"pG5:#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ= -#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ= -#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ= -#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ= -#6tJ=#6tJB"qV4Ezzzzzzzz!!!!#&-2b2zzzzzzzz!!!!"&./C;zzzzzzzzzzzzzzzzzzzzzzzzzzzz -zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!"/u8!tPA3zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz -zzzzzzzzzzzzzzzzzz!!!N3"pP,/zzzzzzzz!"TVBzzzzzzzz!!!!0%0qV5zzzzzzzzzzzzzzzzzzzz -zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!"'/?":kJ4zzzzzzzz#R(2.zzzzzzzzz":bD3zzzzzzzz -zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz%1igGzzzzzzzzzzzzzzzzzzzz -zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!s2>zzzzzzzz!!!**zzzzzzzz!!!'3$ipD@%fcS0zzz -zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!!!+%LrL>zzzzzzzz%gECAzzzzzz -zzz!"K;8zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!!N>%KQP0 -zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!!?1%0-A.zzzzzzz!!!!& -"98E%zzzzzzz!!!!!!"#6=f)zzzzzzzzzzzzzzzzzzzzzzzzzzzz -zzzzzzzzzzzzzzzzzzzzzzzzzz!!!H>$31&+zzzzzzz!!!0*zzzzzzzzz!!!0*zzzzzzzzzzzzzzzzz -zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!"BDKzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz -zzzzzzzzzzzzzzzzzzzzzzzzzzz!>#P;zzzzzzzz"U"f*zzzzzz!!!!+#7CM3z%1N:;zzzzzzzzzzzz -zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!!!.%M&O>zzzzzzz!!!'3%fcS0zzzzzzzz -!!!$2%fcS0zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz$P3==zzzz -z!!!!6'F,Kgz*>8DQzzzzzzzzzzzzzzzzzzzz*=!2Wzzzzzzzzzzzz!!"&F#6u:M(^C9N#8maO*WQ0? -!!!!9#6tJI#6tJ=#6u7Lzzzzzz!"&rkBzzzzzz!!!!'"98E%z!=&W*zzz!!!T9#87(; -!!!WG'`\46zzzzzzzzzzzzzzzzzzz!!!iM(B=F8zzzzzzzzzzzz(^C9N#8dF^#6tJT#6tJNz!!"&F -#8maO#6tJ=*"i5Ozzzzzz"UG).zzzzzzz!!!!&#ljr*zzzzzzzz!!!!."98E%zzzzzzzzzzzzzzzzzz -zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz"p4i*zzzzz!!!!>)AO,2!!!!<)uos=zzzzzzz -zzzzzzzzzzzz!!!!4#6tkAzzzzzzzzzzzz!!!!2#8$q9!!!lS!!!i@#8dF@!!!!?#8 at .<&dK'M'bgln -zzzzzz!!!-*zzzzzzzz!!NZ/zzzzzz!!!-3zz!"B&2zzz!#5_P&I0-Q!!!]Kzzzzzzzzzzzzzzzzzzz -z!!!6/(B=F8zzzzzzzzzzzz!!!lSz&I/mJ!$2 at dz!#PqG)ZTjU*WQ0V#8 at .#;4zzzzzzz -!!!!#"onW'zzzzzzzz!!!!+&.\a at zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz -zzzzzzzz!!!!$%KHJ/zzzzz!!!!:*WQu]!!!`J'`\46z!!!!9'*&"4zzzz!!!!6)uos=zzzzzzzzzzz -'*f-Mzzz!!!!?zzzzz!!!!4(]XO9z!!!!9#8dF@!!"&]!!!WL#9EjF!!!WM)BJkY!!a/;!#>eWzzzzz -z!!!N6!rr<$zzzzzzz!"/u2zzzzzz!!!Q3zz!"'8;zzz!"fGQ&dK'M!#$"Gzz!!"&?zzzzz!!!ZLzzz -zzzzzzzz!!!!((B=F8zzz!#Q at Lzzzzz!#6IRzz!!"&]z(^ClX!#HLX(]XO9!#HLX(]XOW*WQ0?)@$lT -zzzzzz!!EH*zzzzzzzz"q(D2zzzzzzzzz"Tn`)zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz -zzzzzzzzzzzzzzzzzz!!!!/!rr<$zzzzz!!!!:*WQu]!!!uXzz!!!WL'*&"4zzzz!!!!?*WQ0?zzzzz -zzzzzz'*f-Mzzz!!!Z;zzzzz!!!i@(]XO9z!!!!9#8dF@!!"&]!!!WQ(C(QQ!!!fO)'/bX!!a/; -!#>eRzzzzzz!!!!$"TSN&zzzzzzz!!!3)zzzzzz!!<]2zz!!!K2zzz!"fGQ&dK'M()-`Kzz!##S;zzz -zz!#PqXzzzzzzzzzzz!!!!((B=F8zzz&fD>_zzzzz!$30]zz!!"&]z(^ClX!#H4P(B=F8&dK'T(]XOW -*WQ0?)@$uWzzzzzz!"TVJzzzzzzzz#n-e6zzzzzzzzz!tG;2zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz -zzzzzzzzzzzzzzzzzzzzzzzzzzzz!!!$)%fcS0zzzzz!!!!8)AO,2!"g4Oz'bglo*>04p#6u"\#9F*T -#6tkY#6tnB'c[G`'G__p#6th@!!!!2#9"Np!#$7i'F,-#6tJO!##SB(]Y%)A`Ak*WQ0?!!!`=(]Y3_ -&I/OT'cRAl(]YEkzz!$2gh&fMPd*#',&'F,BR'*f-Mz!!!!6#8dFS'*&gR!"fG@'*&"O#8$qN)BJkl -)AW;e)#t6R(]XO9z!!!!9#6tJ=#6tJT!!!WQ!$2@[!#$=P)'/bX!!``6#9FW\zzzzzzz%1*"7zzzzzz -z!!!$2zzzzzz!!Wc1zz!!!N7%fcS0zz!!!T9#8[@\&HEdU)Aj1o(]Y3_!#Gk?&dJX_!!!rC&HEOa -*WR#^&HEgV&eP?cz!$**\&ekr`#8n9i)B'7h(C(QQz!!!!9#8$qV#8.dW&HECJ)uosD(B=F8z!!!]H -!#Q[U&dK'M)$_#l!!!]N!!!Z;(_mr*!#l.T!#ZgXzz!!"&F#6tJ=#6u(G!#HIh#9!!!T9(]XO9z!!!!9#8dF@!!"&]!!!WQ!#PqS'cInh -)'/bX!!a/P)&WDSzzzzzzz#n-e6zzzzzzz!!!!'!WW3#zzzzz!!`K(zz!!!!&!rr<$zzz!!!iU!"fGQ -*#]Os*YJGQ!#Gk?!"oMM!!!i@&HDeK*WR/oz!"fGQz!$)sk!!!!3#87(;*Z4qX'*f?Sz!!!!='EA+5 -!!!uW!!!!8#8R:E(B=F8z!!!]I(]XO9&dK'M!#ZgX!!"&X!!!T9(_[,hz!#ZgXzz!!"&]z(^ClX -!#HIP*Z>b,*WQcW(]XOW*WR/b&c_n3zzzzzz!!!!(!<<*"zzzzzzz!!!!!!:*WQ0?!!!!4#6tqY!"fGQ!!!6?!!!f?zz&I0'O -!!!!2#8$q9!#ZgX'*f-Mzz'*eaV('#-U!!!T9(]XOQ#8$q9)'0Cq'*&"4!!!T9(]XO9z!!!!9#8dF@ -!!"&]!!!WQ!!!lT*?G1\)'/bX!!a/;)[@A`zzzzzzz!X/Q(zzzzzzz!!!!)#QOi)zzzzz!!`K(zz -!!!!*%0-A.zzz!#61_!#Gk?&I0'b#6tqY!#Gk?!"oMM!!!i@&HDeK*WR&tz!"fGQz!"p.S#9k#87(;*Z4qX&I0-Qz!!!!=)?9a;!!!uD&c_nF#8."A(B=F8zz',1Ze -&dK'M!#ZgX!!"&Y!!!T9(_[,iz!#ZgXzz!!"&]z(^ClX!#HIP!#Z"U!!!T9(]XOW*WQ0Z#992.#64`(&I/sL*X;o`'H.eg -!$)%W'GqJ`!!!!5&c`R`!##SN!#5_Y!!!]<'`\46z!#-=g!!"#>*X<8W&I/pK*=!>[zz'G:BZ)?:QY -&f22d(]XOK#93^W#6u:j#87(;'+tl^)]ShXz!!!!2#8$q9!!!lS!!!iR!!!!;)#sX:)AE/O&dKBV -!!!]<'*&"4zzzzzz!!`K(zzzzzzz!!!!0#64`(zzzzz!!`K(zzz#6=f)zzz)]\nY!"fGQ*#\ek&c`R` -!#GkQ(D[5h!!!W:)upWW#9Ffh*WQ0U&J56e)uos=!#$"G'cI`$#93^D'H-rO*=!M`z!!!!<#9EjF -((hAg'GV>s(B>0T)uos=z!!!uU!#PqV&dKEj()e4o!!!f?((q;d#8%jg&c`X[!#ZIf'*&"4z!!!lSz -&I/mJ!$2^P!##SL!!!Z;)ZTjU)?9a;*=!Q!zzzzzz!!!!(zzzzzzzz!!!H2zzzzzzzzz!!!-)zzzzzz -zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!!!(zzzzzzz!$)XO!!!!7 -)$_2_',)8h*YeYr#87mY#6t5/'bgle)[@A`&ekQU)AiGf#9EjW#8$qP*X#6u(Gzzzzzz!!`K(zzzzzzzz"p+c) -zzzzz!!`K(zzz"TeZ(zz!!!!3'EA+5!!!f?)AiGj*X2zzzzzzz!!!*2zzzzzz -!"B57zz!!!B2zzz!!!6(zzzzzzz#64`(zzzzzz!!!6(zzzzzzz#64`(zzzzzz!!`K(zzzzzz!!!!(zz -zzzzz!!`K(zzzzzz!!!N7%fcS0zzzzzzz!!Wc1zzzzzzzzz!"KA:zzzzzzzzzzzzzzzzzzzzzzzzzzz -zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!!!/$NL/,zzzzz!!!!(zzzzzzz!!!6(zzzzzzz#64`(zzz -zzz!!!6(zzzzzz!!!!(zzzzzzz!!`K(zzzzzz!!!!(zzzzzzz"q(D2zzzzzzz!!!0)zzzzzz!!<]2zz -!!!H2zzz!!!6(zzzzzzz#64`(zzzzzz!!!6(zzzzzzz#64`(zzzzzz!!`K(zzzzzz!!!!(zzzzzzz -!!`K(zzzzzz!!!*2zzzzzzzz$O-S2zzzzzzzzz$4m1;zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz -zzzzzzzzzzzzzzzzzzzzzzz!!!!*"TSN&zzzzz!!!!(zzzzzzz!!!6(zzzzzzz#64`(zzzzzz!!!6(z -zzzzz!!!!(zzzzzzz!!`K(zzzzzz!!!!(zzzzzz!!!!#"onW'zzzzzzz!!*<8zzzzzz!"TVJzz!"T;8 -zzz!!!6(zzzzzzz#64`(zzzzzz!!!6(zzzzzzz#64`(zzzzzz!!`K(zzzzzz!!!!(zzzzzzz!!`K(zz -zzzz!!!3*zzzzzzzz$j6P1zzzzzzzzz%0uq6zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz -zzzzzzzzzzzzzzzz!!!!0&-;h3zzzzz!!!!(zzzzzzz!!!6(zzzzzzz#64`(zzzzzz!!!6(zzzzzz -!!!!(zzzzzzz!!`K(zzzzzz!!!!(zzzzzz!!!N6!rr<$zzzzzzz!"BA;zzzzzz!!!-1zz!!E]1zzz -!!!6(zzzzzzz#64`(zzzzzz!!!6(zzzzzzz#64`(zzzzzz!!`K(zzzzzz!!!!(zzzzzzz!!`K(zzzzz -z!!ri0zzzzzzz!!!!"#7ge7zzzzzzzz!!!!0&-2b2zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz -zzzzzzzzzzzzzzzzzzzzzz":bD3zzzzz!!!!(zzzzzzz!!!6(zzzzzzz#64`(zzzzzz!!!6(zzzzzz -!!!!(zzzzzzz!!`K(zzzzzz!!!!(zzzzzz!!!H3zzzzzzzz%hJaAzzzzzz!!!N@$NL/,z%hJdBzzz -!!!6(zzzzzzz#64`(zzzzzz!!!6(zzzzzzz#64`(zzzzzz!!`K(zzzzzz!!!!(zzzzzzz!!`K(zzzzz -z$3pn2zzzzzz!!!!,&-2b2z"9ec*zzz -!!!6(zzzzzzz#64`(zzzzzz!!!6(zzzzzzz#64`(zzzzzz!!`K(zzzzzz!!!!(zzzzzzz!!`K(zzzzz -!!!!+&-Dn4zzzzzzz!!!$)!<<*"zzzzzzzz!!!N@!WW3#zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz -zzzzzzzzzzzzzzzzzzzzzzzzzz!!*W5zzzzz!!!!(zzzzzzz!!!6(zzzzzzz#64`(zzzzzz!!!6. -!rr<$zzzzz!!!!(zzzzzzz!!`K(zzzzzz!!!!(zzzzz!!!!0%0d.>zzzzzzz!!!!"&-2b2zzzzzzz -%1WmK!!!!0&-;h3zzz!!!6(zzzzzzz#64`(zzzzzz!!!6(zzzzzz!"T2:#64`(zzzzzz!!`K(zzzzzz -!!!!(zzzzzzz!!`K(zzzzz!!!Bzzzzzz -z!!!!.%0-A.zzzzzzz!"BDF!!!!)"TSN&zzz!!!6(zzzzzzz#64`(zzzzzz!!!6(zzzzz!!!!"%1i[E -#64`(zzzzzz!!`K(zzzzzz!!!!(zzzzzzz!!`K(zzzzz%gW^Kzzzzzzzz!!3]4zzzzzzzzz!!*<*zzz -zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!!!+%L!1>zzzz!!!!(zz -zzzzz!!!6(zzzzzzz#64`(zzzzzz!!!6(!!3Q?%06G/zzzz!!!!(%1iXQzzzzzz!!`K(zzzzzz!!!!( -zzzzz!=]SCzzzzzzzz!!!'3%fcS0zzzzzzz!!!99#lk;;!<<*"zzz!!!6(zzzzzzz#64`(zzzzzz -!=]86zzzzz!!3Q6%06G/#64`(zzzzzz!!`K(zzzzzz!!!!(zzzzzzz!!`K(zzzz!!!N3&-W(7zzzzzz -zz!"K,3zzzzzzzzz!!NW.zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz -zzzz%g3FP$P*4;zzz!!!!(zzzzzzz!!!6(zzzzzzz#64`(zzzzzz!!!6(!!!!"%0m:Czzzz!!!!( -!!*67":kJ4zzzzz!!`K(zzzzzz!!!!(zzzz!"'#B&.JX?zzzzzzzz!"T8?zzzzzzzz!!!!#"pUogzzz -z!!!6(zzzzzzz#64`(zzzzz!!!$/#7Un8;#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ= -#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ= -#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ= -#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ= -#6tJ=#6tJ=#6kS=%fcS0zzzzzzzz!!i`.zzzzzzzzz!,ibe#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ= -#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ= -#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ= -#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ= -#6tJ=#6tJ=#6tJ="U#/4zzzzzzzz!!!!"&-;h3zzzzzzzz!!!!0&.8IA4zzzzzzzzz$3pn?":kJ4zzzzzzzzzzz!!!!0&-Dn4zzzzzzzz!!!!0"pk80zzzzzzzzzzzzzz -zzz!!zzzzzz!"/u7!WW3#z -zzzzzzzzz!!!H<%fcS0zzzzzzzz!!!-3%fcS0zzzzzzzzzzzzzzzz!!3?/!rr<$zzzz!sSr3%fcS0zz -zzzzzzzzzzzzzzzzz!"&l6!rr<$zzzzz!!!!"%1iXBzzzzzzzzzzz$4mRFzzzzzzzzz!>#>5zzzzzzz -zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz -zzzzzzzzzz%g3FI$NL/,zzzz%h/aL%fcS0zzzz%gWCC%fcS0zzzzz!!!!%&.JX?zzzzzzzzzz!!zzzzzzzzzzzzzzzz!!!!#"U5&/zzzz!"T2D"Tn`)zzzzzzzzzzzzzzzzzzzz!!!!, -"pG&.zzzzzz!!3<.!rr<$zzzzzzzzz!!!!0&.&=:zzzzzzzz!!!!0%L<%7zzzzzzzzzzzzzzzzzzzzz -zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz -!!!N3"pP/0zzzz!!!$/&-NLDzzzz!!!$'&.&=:zzzzzz%h/aL%fcS0zzzzzzzzz!tYe>zzzzzzzzz -$3pV4zzzzzzzzzzzzzzzz!"&l@":kJ4zzz!!!!"%0m=Dzzzzzzzzzzzzzzzzzzzzzz!!EiA!<<*"zzz -zz!!!!$"qC\7zzzzzzzzz!!!N>%0-A.zzzzzzzz!!!N>%0-A.zzzzzzzzzzzzzzzzzzzzzzzzzzzzzz -zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!<]8":kJ4zz -zz!X0,;zzzzz!X/c1zzzzzz!!!$/&-NLDzzzzzzzz!!!!##6Fl*zzzzzzzz!!!!+&-Dn4zzzzzzzzzz -zzzzz!!!!"%1iXQzzzz!!3Q?%06G/zzzzzzzzzzzzzzzzzzzzzz!!!N8#7U\6zzzzzz!!s2?!WW3#zz -zzzzzz!"TPKzzzzzzzzz!!!H<%fcS0zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz -zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!!!#"V:q?zzzz!!!'1"p4i*zzzz -!!!**"p4i*zzzzzz!X0,<%fcS0zzzzzzz!!!?;!rr<$zzzzzzzz!!!?;!rr<$zzzzzzzzzzzzzzz -!!*N6#S-n8zzz!!!!$%M/aRzzzzzzzzzzzzzzzzzzzzzzzz!=]8>%fcS0zzzzz!!!N4&-W+8zzzzzzz -z%h9'Lzzzzzzzzz!"BDKzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz -zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!*N6%06G/zzzz!sSo1zzzzz!sSr3zzzzzz -!!!'(&-NLDzzzzzzz!"'8>zzzzzzzzz!"'8>zzzzzzzzzzzzzzz!!!!0":#A:zzzz%g`FE!rr<$zzzz -zzzzzzzzzzzzzzzzzzzz!!!$/&-N"6zzzzzz%g3FI!WW3#zzzzzz!!!!0%Ls!Lzzzzzzzzz%1WmKzzz -zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz -zzzzzzzzzzzzzzzzz!!!!"#S7. at zzzz!!!<:"TeZ(zzzz!!!**"p4i*zzzzzz!X0,<%fcS0zzzzzz -!tYP7zzzzzzzzz$4m:>zzzzzzzzzzzzzzz!"T2D$ip>.zzz!!!$*&-W+8zzzzzzzzzzzzzzzzzzzzzz -zzzz!=]8C!<<*"zzzzz!!!N4&-W+8zzzzzz!!!N>%M&O>zzzzzzzz!!!!.%M&O>zzzzzzzzzzzzzzzz -zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz -zzzzz!"T2D%Kc\2zzz!!!!0":u"Czzzzz!sSr9%fcS0zzzzz!!!'/&-r::zzzzz!!!!$#6Or+zzzzzz -zz!!!!+&-Dn4zzzzzzzzzzzzzzz#nR7Azzzz$4R4L$31&+zzzzzzzzzzzzzzzzzzzzzzzzzz!!!$/ -#7V"?zzzzzz%g3FI$NL/,zzzzz!"TPK%fcS0zzzzzzzz!!!H<%fcS0zzzzzzzzzzzzzzzzzzzzzzzzz -zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz -!sSr3%fcS0zzz!"TMD#S-n8zzzz!!!'(&-r::zzzzzz!=]8C!WW3#zzzz!!!-5!WW3#zzzzzzzz -!!!Bzzzzzzzzz%h9'[zzzzzzzzzzzzzzzzzzzzzzzzzzzzzz -zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!!B1 -&-NLDzzz!!!!"%1iXQzzzzz!=]SD$NL/,zzzzz!!!$&&.SdBzzzz%h&pTzzzzzzzzz!!s2=zzzzzzzz -zzzzzzz!sSr;zzzz".:()9*kn2#mgnE1&q:Szzzzzzzzzzzzzzzzzzzzzzzzzz!!!N3"pP22zzzzzz -!!6zzzzzz!!<]B#QXo*zz!!!!,&.B'Lzzzzzzzz!!!!0$jI%=zzzzzzzzz -zzzzz!!!'("p4i*zz!=>Y-R&Hth#7$$>LPLY?LPLY?WWrd0LMI&"1&q:Szzzzzzzzzzzzzzzzzzzzzz -zzz!!3T7$k!%8zzzzz!!!!+%0m%=zzz!"TJL!WW3#zzzzzzzz!!!B<"98E%zzzzzzzzzzzzzzzzzzzz -zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz -zzzz!!!$/#7U_7zzz!!!!#%L*"8zzzzz!!3T@%LE.9zzzzz!!!!+%1i[F%fcS0z!!*67$NL/,zzzzzz -zz!!!')$kE=CE`cZz!!!N4&-WFAzzzzzzzzz!!!!*CBnW1zzzzzzzzz1'n6nVZd5-"`&mK -LPLY?LPLY?LPM6#"U,&9#mgS3zzzzzzzzz$3L_I#6k>;":G84!<<*"%fue?":YhG%L$31&+zzzzzzzzzzzzzz!!B1# -Z)acXzz!!!'(&.JX?zzzzzzzzzzz!!!!SCBk"Dzzz!!*D0"`&mo#7$$>CBXkJ#q#]Qzzzzzzz!!!!" -#pKP?Ws>\@Y9s;Mzzzzzzzzzzzzzzz!!3H9"U>8B"UG56":G84$NpS8$j at 1I"UGJHzzzzzzzzzzzzzz -zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz -zzzzzzzzzzzzzzzzzz!"T2D"Tn`)zzz!X8i:zzzzzzzzzzzzzzzz!<"9])6zzzzzzz -zzzzzzzz!!!!TZEpp91&q:Szz!tGM<%fcS0zzzzzzzzzzzz!%3Q)+ohTC!!!$+Y6C;K#7$$>"U,2=zz -zzzzzzzzzz!!!>'R&[<)+ohTCzzzzzzzzzzzzzzz!!!N2!X&W/"9er4"U"r2!s/K'zzzzzzzzzzzzzz -zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz -zzzzzzzzzzzzzzzzzzzz!sSr3%fcS0zz!!!**"TeZ(zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz -!O]ABQR;b5zz!"T2:"p4i*zzzzzzzzzzzzz!!!#&Z&sNOLT1T7Qj'Z"!<<*"zzzzzzzzzzzzzz!!"AM -X/]qAzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz -zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!!*)&-NLDzz!!!!0 -":ttBzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!!<0#Ih)@zz!!!!"#S7. at zzzzzzzzzzzzz!!!$+ -"`&ku\@8uY#r2J\zzzzzzzzzzzzzzzzz!&=_\Y-.j+zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz -zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz -zzzzzzzzzzzzzzzzz!XoVL!<<*"zz!"T2;%06G/zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!!!" -Vn0LQC_$LGzz!"'/?%06G/zzzzzzzzzzzz!%4rRLT1T7CSqI>!!'4&"TSN&zzzzzzzzzzzzzzzzzz -,)<0%zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz -zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!!$/#7U_7zz!!!!" -%1iXQzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!%2Oe]a"uIzz!!!!,"V:e;zzzzzzzzzzzz$)_R> -#HjEt+u0,uz!!!!HX-`nfzzzzzzzzzzzzzzzzzz!!!=\Xs*iGzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz -zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz -zzzzzzzzzzzzzzzzzzzzzzzz%g3FI$NL/,zz!"&l@#ljr*zzzzzzzzzzzzzzzzzzzzzzzzzzzzz -!!!!CLT6`6%06G/zz!!S2zz!!!N4&-W.9zzzzzzzzzz!!"CM -CT@]@CSqI=zzzzz!!$f7-NF,Hzzzzzzzzzzzzzzzzzz!!/Ii-NF,Hzzzzzzzzzzzzzzzzzzzzzzzzzz -zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz -zzzzzzzzzzzzzzzzzzzzzzzzzzzz!!`%LBjuL"UP20zzzzzz!!!!&W[@cHzzzzzzzzzzzz -zzzzzz!!!"sWZhECzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz -zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!!!# -$kNjKzz!!!!*&-W(7zzzzzzzzzzzzzzzzzzzzzzzzzzz12@,1C'=eDzz!!!'/&.JX?zzzzzzzzz -!"#QjXp9^c+u0,uzzzzzzzzYGrrMzzzzzzzzzzzzzzzzzzzY6V62zzzzzzzzzzzzzzzzzzzzzzzzzzz -zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz -zzzzzzzzzzzzzzzzzzzzzzzzzzzz!!*N6%0?M0zz%g3FQ!<<*"zzzzzzzzzzzzzzzzzzzzzzzzz -!!"ci#AXDF&.&=:zz!tGM<%fcS0zzzzzzzz!?q]&#Hhj?-NF,Hzzzzzzzzz!3`CMzzzzzzzzzzzzzzz -zzzz!3ZX2zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz -zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!!!0":t_=zz -!!!$/#6YP;!!!N0zzzzzzzzzzzzzzzzzzzzzz!!"bSz9:2^_)\!>]%fcS0z!"T2:"p4i*zzzzzzzz -19YJo#D]B)!<<*"zzzzzzzzzz!!'4&-NF,Hzzzzzzzzzzzzzzzzzz!!'4&-NF,Hzzzzzzzzzzzzzzzz -zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz -zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!"T/9"p5A9zz!bj#Ght?!<<*"!!EK+ -!!3T7%06G/zzzzzzz-`8Q"V:e;zzzz!!"C%#ljr*z-`1zzzzzzzzzzzzzzzzzz!!!!"Ws8k7#6tJ=#6tJD":>,>"U>8;#6tJ<#QOi)zzz!3`C-#6tJ= -_/$50zzzzzzzzzzzzzzzzzz!!!#&WW<)"zzzzzzzzzzzzzzzzzz!!!!H#:BKOzzzzzzzzzzzzzzzzzz -zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz -zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!!E3#6tJ=#6tJD$31&+!!*B7#7q4Bzzzzzzzzzzz -zzzzzzz!!"dT#6tKhXCqhD$j-M1!!!'3#6tGA"9K)6zzz!!!!*Xp51:#6tJ=#6=f)zzzzzzzzzzzzzz -zzzzzCR>)%zzzzzzzzzzzzzzzzzzzVlg%#zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz -zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!!$+ -%0ZtA#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ= -#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ= -#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ= -#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ= -#6tJ=#6tJ=#6tJ=#6b5;zzzzzzzzz!Nr=#zzzzzzzzzzzzzzzzzzz!/IWUzzzzzzzzzzzzzzzzzzzzz -zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz -zzzzzzzzzzzzzzzzzz!tGkO#m(G6zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz -zzzzzzzzzzz!Xf8<"p4i*zzzzzzzz!"#Y+zzzzzzzzzzzzzzzzzzz!&CP\zzzzzzzzzzzzzzzzzzzzz -zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz -zzzzzzzzzzzzzzzzz!!!?0"p4i*zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz -zzzzzzzzzzzz!sSr2zzzzzzzz!!$f%zzzzzzzzzzzzzzzzzzz!!&ptzzzzzzzzzzzzzzzzzzzzzzzzz -zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz -zzzzzzzzzzzzz!"0>@zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz -zzzz!!!<1"98E%zzzzzzz!!!&"#ljr*zzzzzzzzzzzzzzzzzz!!!#"VZ6\szzzzzzzzzzzzzzzzzzzz -zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz -zzzzzzzzzzzzzzzzz!s\o.zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz -zzzzzzzz!!!!+"q:P4zzzzzzz!!!"sWrN,"zzzzzzzzzzzzzzzzzz!!!!*WW<)"zzzzzzzzzzzzzzzz -zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz -zzzzzzzzzzzzzzzzzzzz!!!!+#6Or+zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz -zzzzzzzzzzzzzzzzz%h9$KzzzzzzzzY-.g*zzzzzzzzzzzzzzzzzzzLBRYXzzzzzzzzzzzzzzzzzzzz -zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz -zzzzzzzzzzzzzzzz!!!N6#ljr*zzzzzz!!!f?#8dF@!!!rXzzzzzzzzzzzzzzzzzz!!!ZM&HDe2zzzz -zzzzzzzzzzzzzzzzz!!!i@#6tJN!$2 at M#9F*T#8dF at z*X;of#6tJ=#6u4]zzzzzzz!"TPFzzzzzzzz -YH at j*zzzzzzzzzzzzzzzzzzz19(?Tzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz -zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!!-*zzzzzzz -!#l.[(E+"g!"ot\zzzzzzzzzzzzzzzzzz!#PqG&HDe2zzzzzzzzzzzzzzzzzzzzzz)&WDS!!!T9 -&HDeP#9EjF!!!!9#6u1J!#ZgX!#GkSzzzzzzz!!!?;$NL/,zzzzzzz!3WL*zzzzzzzzzzzzzzzzzzz -!13oizzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz -zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!"TVBzzzzzzz!#Gk?&I0-Q!#uaSzz!#6IRzzzz -z!!"&?zzzzzzzzz!!!i@&HDe2zzzzzzzz!#$1Lzzz!!!!4(]XO9zzzz!!!!9'*&"4zz*Zb:]!!!i@ -(]XOP)$^uY!!!!8)$^uY!$30]!!!oB&c_n3zzzzzz!!!!,&.\a at zzzzzzz!3_.Xzzzzzzzzzzzzzzzz -zzz!"#Y*zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz -zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!j*>f"d#8n9u)&*;\ -#8mLT#6u(G()-uY*YoUu#6tkR#8$q9z*Zb:]!!!i@(]XOP(`inp!!!fO&I0-Q!$30]&fq8uzzzzzzzz -!=',8zzzzzzz!!$f9zzzzzzzzzzzzzzzzzzz!!'3izzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz -zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz -!"]/2zzzzzzz!!!f?#8$qM&eYl`'G;E-!"otG!#ZgX(C(0^!!"#E&c`aR'*''f'bVE$!#Gk?z!#-(H -(`X+m#8 at ml#8A!T)&WDSz!!!!4*WQoh)?:TZ&HEX^&c`^Q'*eaV'cRAl(]YEk!#QC_!#GkU#6tqY -&dKBV&I0-Qzz'GCH`)upQU(]YEY)%loL'H$lN'*f?h)A`Am#8%RR'*&"4zz*X;oT#6tJ=(]XOP(`3Ju -!#6Cf&I0-Q!$2 at M#8 at aMzzzzzzzz!"9/6zzzzzzz!!"CLzzzzzzzzzzzzzzzzzzz!!!$)1&q:Szzzzz -zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz -zzzzzzzzzzzzzzzzzzzzzzzzzzzzzz%gN(7zzzzzzzz!!!ZG!#HOd)&sY8'*&"4!#ZgX!#Gk?!!!Z; -&c`OL',Cflz!#Gk?z!#-+a!!!!2#8dF@#8[@?*!ZHDz!!!!;#6tJ=#8S-]&HEdU#6tJ='+kHd!!!6? -!!!uD!#u4K#6tJI&dK'M!#ZgX&I0-Qzz'GMAa!!!T9(]XOR*WQ0?*Z4qX&I0-d#8I4=!!!W:'*&"4zz -*Zb:]!!!i@(]XOP(]YTq'b_Vg&I0-Q!$30]*![)Vzzzzzzzz!!"Y&I0-d#8R:>!!!W:'*&"4zz*Zb:]!!!i@(]XOP(]XOR#8 at .<&I0-Q!$30]!#l.`zz -zzzzzz!!!6(zzzzzzz!!!!CWrN,"zzzzzzzzzzzzzzzzzz!!!!S#64`(zzzzzzzzzzzzzzzzzzzzzzz -zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz -zzzzzzzzzzzz!!`K(zzzzzzzz*?+tY!#HOd)&s;'!#6Cc!#ZIf'-%5W!!!T9'*''Y#87di(]XOV -!#GkQ(B=F8!#ugU(^Cfi#87(P#93^D'F,?Qz!!!!>#991gzz)&WDS -!!!T9&HDeP&HDeE#8$q9'*fHV!#Z[T!!"#E*#/GRzzzzzzz!!!6(zzzzzzz!!!!"#64`(zzzzzzzzzz -zzzzzzzzzXpG(.zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz -zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!`K(zzzzzzz!!!!<(B=F8!#61Q -'G;&m)@%;u!##SY(C(0M!!!`J#8A*^*<6]d#6u.a!#PqY&eP?\!$*'b#9=B]#6tnI#6u:k#6tJ6zz -(C(0Z((gcV#87(N)@%/m&I/OG'*eaI*ZbOk#65DU#9"0e#6tJI#6tJT&fCokzz*?>@i*<6]i#8e<` -#9EjF()dE!',_G`(`#52zzzzzzzzzzzzzz!)!=n +7NP8)3=n:Q!'E=D4#]>Z2?3^Wzz3\:@5!zz#RCD1zzz!!!!)#QOi)zzzzzz!!!!%%0-A.zzzzzz +!!ii1zz!!!!,!WW3#zzz!!!B.zz!X\o-!!<<'!!30+!!!!'!2zzzzzz!!!<2zz!!iQ)$j$D/zzz!!!!-!WW3#z!!3K-!!!*'!!!'-$ig8- +!so&0!"&c-!!NH)zzzzz!!!!"!<<*"zzzzz!!!$"zzzzzzzzzzzzzzz!!*'"zzzzzzzzzzzzzzzzzzz +zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!**#zzz +zz!!!B5!$ipA1!!!!-!=])@!=TD@"pk;3zz$3:;9 +!!E`2#71D;#7ghD%0ZqB!;%fl_8!#QPAB!!!E7!"K#0!s8N1$ig_Bz +"TT#6!"B88#mgt@%0-A.z!Y585%0-M?!"&c-%0HS>$31A=$N^b;$3C2:!rr?(!!r],%0uq6z!"&o8 +%fc\5!!WH0!"K#0$NUM9#n$e@!!<9&z!!!!#!/%0uq9 +!rr<&$31>4!!NW.!!!!.#QOi)!"B82z!"&`-!3%KHJ/!"B&2 +!s8N+%0-D=z%0uq@!WWZ8zz":5A7!s/H-!=&T1!<<*##S.=D!!!!$!WW3#z!!3K-!!!*'!!!'*!!NE* +!!<<'!"&c-%h&FJ9!t>86$3:/7!7zzzzzzzzzzzzzzzzzzzzzz -zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz -zzzzzzzzzzzzz!!Wc1zzzzzzzzz#64`(zzzzzzzzz#64`(zzzzzzzz!!!!(zzzzzzzzz!!!!(zzzzzz -zzz!!!6(zzzzzzzzz!!!6(zzzzzzzzz!!!6(zzzzzzz!!!#!1&q:Szzzzzzzzzzzzzzzzzz!!!#" -+ohTCzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz -zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!"B26zzzzzzzzz#64`(zzzzzzzzz#64`(zzzzzz -zz!!!!(zzzzzzzzz!!!!(zzzzzzzzz!!!6(zzzzzzzzz!!!6(zzzzzzzzz!"08:zzzzzzz!!'4'zzzz -zzzzzzzzzzzzzzz!!"dSzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz -zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!3]3zzzzzzzzz#64`(zzzz -zzzzz#64`(zzzzzzzz!!!!(zzzzzzzzz!!!!(zzzzzzzzz!!!6(zzzzzzzzz!!!6(zzzzzzzzz!"B26 -zzzzzzz!!&Cazzzzzzzzzzzzzzzzzzz!!'*9zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz -zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!!0*zz -zzzzzzz#64`(zzzzzzzzz#64`(zzzzzzzz!!!!(zzzzzzzzz!!!!(zzzzzzzzz!!!6(zzzzzzzzz -!!!6(zzzzzzzzz!=&W*zzzzzzz!&=c[zzzzzzzzzzzzzzzzzzz!!'#Hzzzzzzzzzzzzzzzzzzzzzzzz -zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz -zzzzzzzzzzzz!!!'3!<<*"zzzzzzzz#64`(zzzzzzzzz#64`(zzzzzzzz!!!!(zzzzzzzzz!!!!(zzz -zzzzzz!!!6(zzzzzzzzz!!!6(zzzzzzzzz$k31:zzzzzzz!,H?Mzzzzzzzzzzzzzzzzzzz!3_.Xzzzz -zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz -zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!!!)%M&O>zzzzzzzz#64`(zzzzzzzzz#64`(zzzzzzzz -!!!!(zzzzzzzzz!!!!(zzzzzzzzz!!!6(zzzzzzzzz!!!6(zzzzzzzz!!!!$&.\a at zzzzzzz1']Q7zz -zzzzzzzzzzzzzzzzz!3WL*zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz -zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz%L`=;zzzzzzzz#64`(zz -zzzzzzz#64`(zzzzzzzz!!!!(zzzzzzzzz!!!!(zzzzzzzzz!!!6(zzzzzzzzz!!!6(zzzzzzzz -!!!*+$31&+zzzzzzzCMNnMzzzzzzzzzzzzzzzzzzzYH at j*zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz -zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz -zzzz%h8aRzzzzzzzz#64`(zzzzzzzzz#64`(zzzzzzzz!!!!(zzzzzzzzz!!!!(zzzzzzzzz!!!6(zz -zzzzzzz!!!6(zzzzzzzz!!s2=zzzzzzz!!!!S#;Q8Zzzzzzzzzzzzzzzzzzz!!!!"WX/Y*zzzzzzzzz -zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz -zzzzzzzzzzzzzzzzzzzzzzzzzzzz!"TJB!WW3#zzzzzzz#64`(zzzzzzzzz#64`(zzzzzzzz!!!!(zz -zzzzzzz!!!!(zzzzzzzzz!!!6(zzzzzzzzz!!!6(zzzzzzz!!!!""U5;6zzzzzzz!!!"SX8i5#zzzzz -zzzzzzzzzzzzz!!!!&LB%;Szzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz -zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!!!*&.JX?zzzzzzz -#64`(zzzzzzzzz#64`(zzzzzzzz!!!!(zzzzzzzzz!!!!(zzzzzzzzz!!!6(zzzzzzzzz!!!6(zzzzz -zz!!3T7#S-n8zzzzzzz!!"4C!<<*"zzzzzzzzzzzzzzzzzz!!"AO1&q:Szzzzzzzzzzzzzzzzzzzzzz -zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz -zzzzzzzzzzzzzzzz!=]SM":GP:zzzzzz#64`(zzzzzzzzz#64`(zzzzzzzz!!!!(zzzzz!=o/1zzz -!!!!(zzzzz!!!N1zzz%fch7zzzzzzzzz!"T;7zzzzzz!WiK6"pP>6zzzzzzzz!!0)Dzzzzzzzzzzzzz -zzzzzz!!'&'zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz -zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!!N;"9f#8#6tJ=#6tJ=#6tJ= -#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ= -#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ= -#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ= -#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6tJ=#6bA> -$31&+zzzzzzzz!19,Rzzzzzzzzzzzzzzzzzzz!!TD'zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz -zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz -zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!"TGC%L3.?$P*4;zzzzzzzz$4.+F&-W1MC!s&B%zzzzzzzz%fuk;&-`OLE"E0Rzzzzzzzzz!"T2D"TeZ(zzzzzzzzzzzzz -!!!&#"TSN&zzzzzzzzzzzzzzzzzz!!!"SCB+>7zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz -zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz -zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!!''"V:kI#mpY4zzzzzzzz!"&f;%L31C_BAmZzzzzzzz -zz!sSo2zzzzzzzzzzzzz!!%eAzzzzzzzzzzzzzzzzzzz!!$f8!<<*"zzzzzzzzzzzzzzzzzzzzzzzzz -zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz -zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!!?4$jI7H"9K)6zzzzzzzz!"T,: -JZ=6I"9K)6zzzzzzzz!!!**"p4i*zzzzzzzzzzzz!,JV9zzzzzzzzzzzzzzzzzzz!3`CXzzzzzzzzzz -zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz -zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!!$%#S%(L -%0Hq;zzzzzzzz!"'F5Irtu+%1*@Azzzzzzzz!sSr9%fcS0zzzzzzzzzzzXKDR(zzzzzzzzzzzzzzzzz -zzYGrrMzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz -zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz -zzzzzzz!!!!#":PhQ"U"l;zzzzzzz!!!!#"V:eh#n."C"UG2;zzzzzzz!!!'(&-NLDzzzzzzzzzz -!!!#&W[@cHzzzzzzzzzzzzzzzzzz!!!#GA1zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz -zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz -zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!!!"!sf&8"q1e>zzzzzzz!!3<8":kJC!X&oC -#6bA@!<<*"zzzzzz!Y#AD!<<*"zzzzzzzzz!!'4&-NF,Hzzzzzzzzzzzzzzzzzz!!!<1Y5eP&zzzzzz -zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz -zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz -$4..O#7_1L!WW3#zzzzz!!!!#"V:eIz!=K#6&.f!J!t##.zzzzz!!!$*&-WFAzzzzzzzzz!3`CMzzzz -zzzzzzzzzzzzzzz!3ZX2zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz -zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz -zzzzzzzzzzzzzzzzzzzzzzzzz!!3H9%L3IQ#m(),zzzzz!!3T@%06G/z!!*H1"V:nB#QkD6zzzzz -%g`FE#nI"9zzzzzzzzH)`4lzzzzzzzzzzzzzzzzzzzY6V62zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz -zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz -zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!!',%1WUQ$j6VBzzzz!!!!" -%0m:Czz!!!$$":PJ>%Li^G%fcS0zzz!!!!,"V;+Dzzzzzzz!!!OFOs^50zzzzzzzzzzzzzzzzzz -!!!!-WZ;'>zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz -zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz -zzzzzzzzzzzzzzzzz!!!!##m^\>&-W1=!WW3#zzz!"T2D%Kd4Azz!!!!0!XT;>#6k>7$OQk6zzz -!!*N?"Tn`)zzzzzz!%s#)FoVLBzzzzzzzzzzzzzzzzzz!"X48-NF,Hzzzzzzzzzzzzzzzzzzzzzzzzz -zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz -zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!=K#="pYVH":GP:z -zz!sK5A!<<*"zzz!"&f2"U52A%0Q_5zz!!!!0!tGkJ!<<*"zzzz!!!!"'Vg9kzzzzzzzzzzzzzzzzzz -z"0dNOzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz -zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz -zzzzzzzzzzzzzzzzz!!!'&"9eu7%L`IB!WW3#z!!!?8&-W.Hzzzz!!!N2#m^\G#6bP>!W`9$z!!!?8 -&-W.Hzzzz!"/t$J/nUizzzzzzzzzzzzzzzzzz!!!(]Y\OaLzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz -zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz -zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!WrQ6%L3OK%0R%?z -%g*:Q%1<.9zzzzz!89%0Q_>z%g*:Q%0?M0zz!!!?3#+:(!!WW3#zzzzzzzzzzzzzzzzzz -!sP0e%0-A.zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz -zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz -zzzzzzzzzzzzzzzzzzzzzzzz!!!$$":,/8#7q%I"9S^c"9o&9$31&+zzzzz!!!N2#m^\=#7^n?#m(,. -#R1J=!<<*"!!!$-%0dAX%1idUzzzzzzzzzzzzzzzzzz!!*3,Ll`/Uzzzzzzzzzzzzzzzzzzzzzzzzzz -zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz -zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!*-- -":PGF#7qS]LPLrt!WW3#zzzzzz!!3N2$j?k@%L!58"UY50zzzzzzzzzzzzzzzzz -!!!$+%L3FL"pG#-zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz -zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz -zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!*-/"I*MKUB_$("U,;;"9\f.!WiE6zzz!!!!+!WiED -%=SM9#I+L=?B#5V%;#bFzzzzzzzzzzzzzzzzz!!!N;#R1hK"*P+b#ljr*zzzzzzzzzzzzzzzzzzzzzz -zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz -zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz -!=8o7CQ!0Q"9],:"U,&7#6tJ=#6tJ=#6tJ=#6tJD"U,&8":5,2!!!"j*LR-;]u1-["UkM:!WiB&zzzz -zzzzzzzzzz!"T,;%1WUH"9JQ6":u"Qzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz -zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz -zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!XK8@%LiLIzzzzzzz!"T/@ -&-b]<%1i_t#m1;9"U,GB#6b8>"9\f.!X\o-zzzzzzzzz!!!N2$Np_=&-i[S#m(),!"T2D"TeZ(zzzzz -zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz -zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz -zzzzzzzzzzzzzzzzzzz!X&o9#6bP>!Wi?%zzzz%g!%H"pY; +zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz~> Q cleartomark end end pagesave restore showpage %%PageTrailer @@ -9452,77 +8503,77 @@ %%EOF %%EndDocument - @endspecial 8266 4209 V -240 4216 8513 7 v 2021 4551 + @endspecial 8250 4167 V -240 4174 8497 7 v 2021 4509 a Fj(Figure)60 b(4:)80 b Fm(CBU)55 b(graphs)h(of)f(sparse)i(matrix)e -(in)g(espresso)-240 5101 y Fj(to)72 b(\014nd)h(go)5 b(o)g(d)72 -b(solutions.)114 b(This)72 b(b)5 b(enc)-5 b(hmark)72 -b(has)g(20459)g(lines)f(of)h(co)5 b(de,)75 b(19686)d(memory)f -(instructions)g(in)h(LL)-20 b(VM)-240 5375 y(represen)-5 -b(tation)59 b(and)h(1)h(non-trivial)d(strongly)i(connected)f(comp)5 -b(onen)-5 b(t)60 b(in)g(the)g(call)f(graph.)-240 5911 -y Fg(6.2)225 b(Data)74 b(Structures:)-240 6303 y Fj(There)79 -b(are)f(a)g(few)g(imp)5 b(ortan)-5 b(t)77 b(data)h(structures)f(in)h -(this)g(implemen)-5 b(tation.)130 b(First,)81 b(there)d(are)g(disjoin) --5 b(t)76 b(arra)-5 b(ys)79 b(of)-240 6577 y(blo)5 b(c)-5 +(in)g(espresso)-240 5059 y Fj(force)61 b(exploration)f(of)h(the)g +(state)f(space,)g(the)h(Tim)-5 b(b)5 b(erW)-15 b(olfSC)60 +b(program)h(uses)g(sim)-5 b(ulated)59 b(annealing)h(as)h(a)h(heuristic) +-240 5333 y(to)72 b(\014nd)h(go)5 b(o)g(d)72 b(solutions.)114 +b(This)72 b(b)5 b(enc)-5 b(hmark)72 b(has)g(20459)g(lines)f(of)h(co)5 +b(de,)75 b(19686)d(memory)f(instructions)g(in)h(LL)-20 +b(VM)-240 5607 y(represen)-5 b(tation)59 b(and)h(1)h(non-trivial)d +(strongly)i(connected)f(comp)5 b(onen)-5 b(t)60 b(in)g(the)g(call)f +(graph.)-240 6144 y Fg(6.2)225 b(Data)74 b(Structures:)-240 +6535 y Fj(There)79 b(are)f(a)g(few)g(imp)5 b(ortan)-5 +b(t)77 b(data)h(structures)f(in)h(this)g(implemen)-5 +b(tation.)130 b(First,)81 b(there)d(are)g(disjoin)-5 +b(t)76 b(arra)-5 b(ys)79 b(of)-240 6809 y(blo)5 b(c)-5 b(kb)5 b(o)-5 b(x)76 b(structure)h(created)f(in)h("con\014gure")f (function.)129 b(The)77 b(part)g(of)g(CBU)g(graph)h(sho)-5 -b(wing)76 b(the)h(parts)f(corre-)-240 6850 y(sp)5 b(onding)69 +b(wing)76 b(the)h(parts)f(corre-)-240 7083 y(sp)5 b(onding)69 b(to)g(this)f(data)h(structure)g(is)f(sho)-5 b(wn)70 b(in)f(Figure)f(5.)107 b(Tw)-5 b(o)70 b(p)5 b(oin)-5 b(ter)69 b(v)-10 b(ariables)68 b("barra)-5 b(y")69 b(and)h("oldbarra)-5 -b(y")-240 7124 y(p)5 b(oin)-5 b(ts)50 b(to)i(disjoin)-5 +b(y")-240 7357 y(p)5 b(oin)-5 b(ts)50 b(to)i(disjoin)-5 b(t)49 b(blo)5 b(c)-5 b(kb)5 b(o)-5 b(x)51 b(arra)-5 b(ys)51 b(in)g(some)f(parts)i(of)f(co)5 b(de,)52 b(but)f(in)g(the)g (cbu)h(graph)f(they)g(p)5 b(oin)-5 b(t)51 b(to)g(same)g(arra)-5 -b(y)51 b(as)-240 7398 y(oldbarra)-5 b(y)63 b(p)5 b(oin)-5 +b(y)51 b(as)-240 7631 y(oldbarra)-5 b(y)63 b(p)5 b(oin)-5 b(ts)62 b(to)g(barra)-5 b(y)64 b(at)f(one)f(place)h(in)f(the)h(co)5 b(de.)87 b(Flo)-5 b(w)63 b(sensitivit)-5 b(y)60 b(or)j(subset)g(based)f -(p)5 b(oin)-5 b(ter)62 b(analysis)g(is)-240 7672 y(required)55 +(p)5 b(oin)-5 b(ter)62 b(analysis)g(is)-240 7905 y(required)55 b(iden)-5 b(tify)54 b(to)i(disjoin)-5 b(t)54 b(no)5 b(des)55 b(in)g(this)g(case.)78 b(This)56 b(data)f(structure)g(is)g(global)g -(and)h(DSA)g(correctly)f(iden)-5 b(ti\014es)-240 7946 +(and)h(DSA)g(correctly)f(iden)-5 b(ti\014es)-240 8179 y(this)47 b(using)g(the)h(fact)f(that)h(the)g(arra)-5 b(ys)48 b(are)g(reac)-5 b(hable)47 b(from)g(no)5 b(des)48 b(mark)-5 b(ed)48 b(with)f("G")h(\015ag.)76 b(The)48 -b(no)5 b(des)48 b(also)f(con)-5 b(tain)-240 8220 y(accurate)60 +b(no)5 b(des)48 b(also)f(con)-5 b(tain)-240 8452 y(accurate)60 b(t)-5 b(yp)5 b(e)60 b(information)e(without)i(b)5 b(eing)60 -b(collapsed.)42 8494 y(Another)43 b(in)-5 b(teresting)41 +b(collapsed.)42 8726 y(Another)43 b(in)-5 b(teresting)41 b(data)i(structure)g(in)-5 b(v)g(olv)g(es)41 b(link)-5 b(ed)42 b(list)f(of)i(ib)5 b(o)-5 b(x)43 b(and)g(ipb)5 b(o)-5 b(x)42 b(structures)g(created)h(in)f(buildimp,)-240 -8768 y(build)p 176 8768 55 7 v 64 w(feed)p 559 8768 V +9000 y(build)p 176 9000 55 7 v 64 w(feed)p 559 9000 V 65 w(imp)64 b(functions.)90 b(The)64 b(part)h(of)f(CBU)g(graph)h(sho)-5 b(wing)64 b(the)g(parts)g(corresp)5 b(onding)63 b(to)h(these)g(data)g -(struc-)-240 9042 y(tures)k(is)g(sho)-5 b(wn)69 b(in)g(Figure)f(6.)105 +(struc-)-240 9274 y(tures)k(is)g(sho)-5 b(wn)69 b(in)g(Figure)f(6.)105 b(As)69 b(can)f(b)5 b(e)69 b(seen)f(from)h(the)f(\014gure,)i(this)e (data)h(structure)f(is)g(actually)f(a)i(link)-5 b(ed)68 -b(list)-240 9316 y(of)e(link)-5 b(ed)66 b(list.)98 b(These)66 +b(list)-240 9548 y(of)e(link)-5 b(ed)66 b(list.)98 b(These)66 b(are)h(global)f(data)g(structures)g(as)g(they)h(are)g(reac)-5 b(hable)66 b(from)g(no)5 b(des)66 b(mark)-5 b(ed)66 b("G".)99 -b(The)67 b(are)-240 9590 y(t)-5 b(w)g(o)71 b(distinct)e(instances)g(of) +b(The)67 b(are)-240 9822 y(t)-5 b(w)g(o)71 b(distinct)e(instances)g(of) i(ipb)5 b(o)-5 b(x)70 b(structure)h(in)f(build)p 3729 -9590 V 65 w(feed)p 4113 9590 V 64 w(imp)h(function.)110 +9822 V 65 w(feed)p 4113 9822 V 64 w(imp)h(function.)110 b(But)70 b(DSA)i(w)-5 b(as)71 b(unable)f(to)h(detect)f(it)-240 -9864 y(due)81 b(to)g(uni\014cation.)140 b(Eac)-5 b(h)81 +10096 y(due)81 b(to)g(uni\014cation.)140 b(Eac)-5 b(h)81 b(elemen)-5 b(t)79 b(of)i(impF)-15 b(eeds)79 b(arra)-5 b(y)81 b(p)5 b(oin)-5 b(ts)81 b(to)f(distinct)g(ib)5 b(o)-5 b(x)80 b(link)-5 b(ed)80 b(list)g(and)h(eac)-5 -b(h)81 b(ib)5 b(o)-5 b(x)-240 10138 y(instance)51 b(p)5 +b(h)81 b(ib)5 b(o)-5 b(x)-240 10370 y(instance)51 b(p)5 b(oin)-5 b(ts)51 b(to)h(distinct)f(ipb)5 b(o)-5 b(x)52 b(link)-5 b(ed)51 b(list.)76 b(DSA)53 b(is)e(also)h(unable)f(to)i(iden) -5 b(tify)50 b(this)h(feature)h(due)g(to)g(lac)-5 b(k)52 -b(of)g(\015o)-5 b(w)-240 10411 y(sensitivit)g(y)70 b(and)j(arra)-5 +b(of)g(\015o)-5 b(w)-240 10644 y(sensitivit)g(y)70 b(and)j(arra)-5 b(y)73 b(data\015o)-5 b(w)73 b(analysis)e(as)h(men)-5 b(tioned)71 b(earlier.)117 b(The)73 b(no)5 b(des)72 b(also)g(retain)g -(their)g(correct)h(t)-5 b(yp)5 b(es)-240 10685 y(without)60 -b(b)5 b(eing)60 b(collapsed.)42 10959 y(Third)g(in)-5 -b(teresting)57 b(data)h(structure)h(is)f(actually)f(a)j(part)f(of)f(a)h -(complex)f(data)h(structure)f(in)-5 b(v)g(olving)57 b(man)-5 -b(y)59 b(struc-)3809 11672 y(12)p eop end +(their)g(correct)h(t)-5 b(yp)5 b(es)-240 10918 y(without)60 +b(b)5 b(eing)60 b(collapsed.)3809 11672 y(12)p eop end %%Page: 13 13 -TeXDict begin 13 12 bop 844 -99 6113 7 v 844 2789 7 2889 -v 900 2739 a @beginspecial 89 @llx 530 @lly 500 @urx -721 @ury 3600 @rwi @setspecial +TeXDict begin 13 12 bop 419 -99 6963 7 v 419 3184 7 3283 +v 475 3134 a @beginspecial 89 @llx 530 @lly 500 @urx +721 @ury 4110 @rwi @setspecial %%BeginDocument: Figures/twolf_cbu1.ps %!PS-Adobe-3.0 %%Pages: (atend) @@ -10254,72 +9305,72 @@ %%EOF %%EndDocument - @endspecial 6950 2789 V 844 2796 6113 7 v 2088 3131 + @endspecial 7375 3184 V 419 3191 6963 7 v 2088 3526 a Fj(Figure)60 b(5:)80 b Fm(CBU)55 b(graphs)h(of)f(blo)5 b(c)-5 b(kb)5 b(o)-5 b(x)55 b(arra)-5 b(y)56 b(in)g(t)-5 -b(w)g(olf)-240 3674 y Fj(tures.)76 b(The)49 b(main)e(comp)5 +b(w)g(olf)42 4076 y Fj(Third)60 b(in)-5 b(teresting)57 +b(data)h(structure)h(is)f(actually)f(a)j(part)f(of)f(a)h(complex)f +(data)h(structure)f(in)-5 b(v)g(olving)57 b(man)-5 b(y)59 +b(struc-)-240 4350 y(tures.)76 b(The)49 b(main)e(comp)5 b(onen)-5 b(t)47 b(of)i(this)e(data)h(structure)g(consists)f(of)h(link) -5 b(ed)47 b(lists)g(of)h(term)-5 b(b)5 b(o)-5 b(x)48 -b(and)g(netb)5 b(o)-5 b(x.)76 b("carra)-5 b(y")-240 3948 +b(and)g(netb)5 b(o)-5 b(x.)76 b("carra)-5 b(y")-240 4624 y(and)64 b("tearra)-5 b(y")64 b(b)5 b(oth)64 b(p)5 b(oin)-5 b(ts)63 b(to)h(the)f(link)-5 b(ed)63 b(list)g(of)h(netb)5 b(o)-5 b(x.)90 b(The)65 b(CBU)f(graph)h(con)-5 b(taining)62 -b(the)i(relev)-10 b(an)-5 b(t)63 b(parts)h(is)-240 4222 +b(the)i(relev)-10 b(an)-5 b(t)63 b(parts)h(is)-240 4898 y(sho)-5 b(wn)69 b(in)f(Figure)g(7.)104 b(These)68 b(link)-5 b(ed)68 b(lists)f(are)h(also)g(global)f(data)h(structures)g(as)g(they)h -(are)f(accessible)e(from)i(global)-240 4496 y(v)-10 b(ariables.)99 +(are)f(accessible)e(from)i(global)-240 5172 y(v)-10 b(ariables.)99 b(As)67 b(b)5 b(efore)67 b(DSA)g(correctly)g(iden)-5 b(ti\014es)65 b(this.)99 b(Also,)68 b(all)f(the)f(no)5 b(des)67 b(ha)-5 b(v)g(e)67 b(b)5 b(een)67 b(assigned)f(correct)h(t)-5 -b(yp)5 b(es)-240 4770 y(without)60 b(an)-5 b(y)60 b(collapsed)f(no)5 -b(de.)42 5044 y(Another)59 b(signi\014can)-5 b(t)57 b(data)h(structure) +b(yp)5 b(es)-240 5446 y(without)60 b(an)-5 b(y)60 b(collapsed)f(no)5 +b(de.)42 5720 y(Another)59 b(signi\014can)-5 b(t)57 b(data)h(structure) g(is)g(also)f(a)i(part)f(of)g(complex)g(data)g(structure.)79 b(The)58 b(in)-5 b(teresting)57 b(asp)5 b(ect)58 b(of)-240 -5318 y(this)h(data)g(structure)h(in)-5 b(v)g(olv)g(es)58 +5994 y(this)h(data)g(structure)h(in)-5 b(v)g(olv)g(es)58 b(doubly)h(link)-5 b(ed)59 b(lists)f(of)h(c)-5 b(hangridb)5 b(o)-5 b(x)60 b(and)g(densit)-5 b(yb)5 b(o)-5 b(x)58 -b(data)i(structure.)79 b(They)60 b(also)-240 5592 y(con)-5 +b(data)i(structure.)79 b(They)60 b(also)-240 6267 y(con)-5 b(tain)66 b(a)h(p)5 b(oin)-5 b(ter)67 b(to)g(eac)-5 b(h)66 b(other.)101 b(Tgrid,)68 b(Sh)-5 b(u\017e,)68 b(aNetSeg)f(all)f(con)-5 b(tain)66 b(p)5 b(oin)-5 b(ter)66 b(to)h(the)g(doubly)g(link)-5 -b(ed)66 b(list)g(of)-240 5866 y(c)-5 b(hangrdb)5 b(o)-5 +b(ed)66 b(list)g(of)-240 6541 y(c)-5 b(hangrdb)5 b(o)-5 b(x.)80 b(The)61 b(corresp)5 b(onding)59 b(CBU)j(graph)e(is)g(sho)-5 b(wn)61 b(in)f(Figure)f(8.)81 b(DSA)61 b(correctly)e(detects)g(these)h -(as)g(global)-240 6139 y(data)g(structures.)79 b(All)60 +(as)g(global)-240 6815 y(data)g(structures.)79 b(All)60 b(the)g(no)5 b(des)61 b(also)e(ha)-5 b(v)g(e)60 b(correct)h(t)-5 b(yp)5 b(e)60 b(information)e(except)i(one)g(no)5 b(de,)60 -b(whic)-5 b(h)60 b(is)g(collapsed.)-240 6674 y Fg(6.3)225 -b(Metrics:)-240 7066 y Fj(The)61 b(v)-10 b(alues)59 b(of)h(the)g +b(whic)-5 b(h)60 b(is)g(collapsed.)-240 7352 y Fg(6.3)225 +b(Metrics:)-240 7743 y Fj(The)61 b(v)-10 b(alues)59 b(of)h(the)g (describ)5 b(ed)60 b(metrics)f(for)h(this)g(b)5 b(enc)-5 -b(hmark)59 b(are)i(-)f(N=23)-240 7339 y(The)77 b(main)g(SDSIs)f +b(hmark)59 b(are)i(-)f(N=23)-240 8017 y(The)77 b(main)g(SDSIs)f (include)g(arra)-5 b(ys)77 b(of)g(blo)5 b(c)-5 b(kb)5 b(o)-5 b(x)76 b(structure,)k(link)-5 b(ed)76 b(list)g(of)h(ib)5 b(o)-5 b(x)77 b(and)g(ipb)5 b(o)-5 b(x)76 b(structures,)k(link)-5 -b(ed)-240 7613 y(lists)54 b(of)g(term)-5 b(b)5 b(o)-5 +b(ed)-240 8291 y(lists)54 b(of)g(term)-5 b(b)5 b(o)-5 b(x)55 b(and)g(netb)5 b(o)-5 b(x,)55 b(doubly)g(link)-5 b(ed)54 b(lists)g(of)h(c)-5 b(hangridb)5 b(o)-5 b(x)54 b(and)h(densit)-5 b(yb)5 b(o)-5 b(x,)55 b(arra)-5 b(y)55 b(of)g(dim)-5 b(b)5 b(o)-5 b(x,)55 b(cellb)5 b(o)-5 b(x,)-240 -7887 y(segb)5 b(o)-5 b(x,)59 b(tgridb)5 b(o)-5 b(x,)60 +8565 y(segb)5 b(o)-5 b(x,)59 b(tgridb)5 b(o)-5 b(x,)60 b(densit)-5 b(yb)5 b(o)-5 b(x,)58 b(bin)-5 b(b)5 b(o)-5 b(x)60 b(and)h(ro)-5 b(wb)5 b(o)-5 b(x)61 b(structures,)e(a)h(hash)h -(table.)-240 8161 y(G=21)-240 8435 y(t)-5 b(w)g(en)g(t)g(y)60 +(table.)-240 8839 y(G=21)-240 9113 y(t)-5 b(w)g(en)g(t)g(y)60 b(one)g(global)g(no)5 b(des)60 b(w)-5 b(ere)60 b(iden)-5 -b(ti\014ed.)-240 8709 y(L=2)-240 8983 y(Both)60 b(the)g(lo)5 +b(ti\014ed.)-240 9387 y(L=2)-240 9660 y(Both)60 b(the)g(lo)5 b(cal)59 b(no)5 b(des)61 b(w)-5 b(ere)60 b(iden)-5 b(ti\014ed)59 -b(correctly)-15 b(.)-240 9257 y(K=)61 b(97)-240 9531 +b(correctly)-15 b(.)-240 9934 y(K=)61 b(97)-240 10208 y(The)g(co)5 b(de)60 b(had)g(lots)g(of)g(heap)g(allo)5 -b(cated)59 b(ob)10 b(jects.)-240 9805 y(I=6)-240 10079 +b(cated)59 b(ob)10 b(jects.)-240 10482 y(I=6)-240 10756 y(F)-15 b(ew)60 b(disjoin)-5 b(t)59 b("`H"')h(no)5 b(des)60 -b(w)-5 b(ere)60 b(found)g(b)-5 b(y)61 b(DSA.)-240 10353 -y(O=7)-240 10627 y(F)-15 b(ew)60 b(no)5 b(des)60 b(got)h(collapsed)d -(in)i(this)g(case.)-240 10900 y(C=29)-240 11174 y(All)g(these)g(no)5 -b(des)60 b(form)g(a)g(part)h(of)f(the)g(non-trivial)e(data)i -(structures)g(found.)3809 11672 y(13)p eop end +b(w)-5 b(ere)60 b(found)g(b)-5 b(y)61 b(DSA.)-240 11030 +y(O=7)3809 11672 y(13)p eop end %%Page: 14 14 -TeXDict begin 14 13 bop 244 -99 7313 7 v 244 4811 7 4910 -v 300 4761 a @beginspecial 53 @llx 401 @lly 532 @urx -721 @ury 4320 @rwi @setspecial +TeXDict begin 14 13 bop -148 -99 8097 7 v -148 5334 7 +5433 v -92 5284 a @beginspecial 53 @llx 401 @lly 532 + at urx 721 @ury 4790 @rwi @setspecial %%BeginDocument: Figures/twolf_cbu2.ps %!PS-Adobe-3.0 %%Pages: (atend) @@ -11556,48 +10607,41 @@ %%EOF %%EndDocument - @endspecial 7550 4811 V 244 4818 7313 7 v 1668 5153 + @endspecial 7941 5334 V -148 5341 8097 7 v 1668 5676 a Fj(Figure)60 b(6:)80 b Fm(CBU)55 b(graphs)h(of)f(ib)5 b(o)-5 b(x)55 b(and)h(ipb)5 b(o)-5 b(x)56 b(link)-5 b(ed)56 -b(lists)g(in)g(t)-5 b(w)g(olf)-240 6338 y Fk(7)269 b(Results)89 -b(for)i(181.mcf)-240 6792 y Ff(Summary:)42 7066 y Fj(The)73 -b(181.mcf)d(is)h(a)i(part)f(of)f(the)h(SPECIn)-5 b(t2000)71 -b(b)5 b(enc)-5 b(hmark.)115 b(It)71 b(is)h(a)g(b)5 b(enc)-5 -b(hmark)71 b(deriv)-5 b(ed)72 b(from)f(a)h(program)-240 -7339 y(used)56 b(for)h(single)e(dep)5 b(ot)56 b(v)-5 -b(ehicle)56 b(sc)-5 b(heduling)55 b(problem)h(in)g(public)g(mass)f -(transp)5 b(ortation.)78 b(The)57 b(co)5 b(de)56 b(is)g(written)g(in)h -(C)-240 7613 y(and)50 b(uses)f(almost)f(exclusiv)-5 b(ely)47 -b(in)-5 b(teger)49 b(arithmetic.181.mcf)c(has)k(a)h(ra)-5 -b(w)50 b(LOC)g(of)f(2412)h(with)f(a)h(total)e(of)i(991)f(memory)-240 -7887 y(instructions)58 b(in)j(LL)-20 b(VM)59 b(represen)-5 -b(tation.)42 8161 y Ff(Data)70 b(Structures:)42 8435 -y Fj(There)61 b(are)g(t)-5 b(w)g(o)60 b(ma)10 b(jor)60 +b(lists)g(in)g(t)-5 b(w)g(olf)-240 6226 y Fj(F)-15 b(ew)60 +b(no)5 b(des)60 b(got)h(collapsed)d(in)i(this)g(case.)-240 +6500 y(C=29)-240 6774 y(All)g(these)g(no)5 b(des)60 b(form)g(a)g(part)h +(of)f(the)g(non-trivial)e(data)i(structures)g(found.)-240 +7684 y Fk(7)269 b(Results)89 b(for)i(181.mcf)-240 8138 +y Ff(Summary:)42 8412 y Fj(The)73 b(181.mcf)d(is)h(a)i(part)f(of)f(the) +h(SPECIn)-5 b(t2000)71 b(b)5 b(enc)-5 b(hmark.)115 b(It)71 +b(is)h(a)g(b)5 b(enc)-5 b(hmark)71 b(deriv)-5 b(ed)72 +b(from)f(a)h(program)-240 8686 y(used)56 b(for)h(single)e(dep)5 +b(ot)56 b(v)-5 b(ehicle)56 b(sc)-5 b(heduling)55 b(problem)h(in)g +(public)g(mass)f(transp)5 b(ortation.)78 b(The)57 b(co)5 +b(de)56 b(is)g(written)g(in)h(C)-240 8960 y(and)50 b(uses)f(almost)f +(exclusiv)-5 b(ely)47 b(in)-5 b(teger)49 b(arithmetic.181.mcf)c(has)k +(a)h(ra)-5 b(w)50 b(LOC)g(of)f(2412)h(with)f(a)h(total)e(of)i(991)f +(memory)-240 9234 y(instructions)58 b(in)j(LL)-20 b(VM)59 +b(represen)-5 b(tation.)42 9508 y Ff(Data)70 b(Structures:)42 +9782 y Fj(There)61 b(are)g(t)-5 b(w)g(o)60 b(ma)10 b(jor)60 b(data)g(structures)f(created)h(in)g(the)h(b)5 b(enc)-5 -b(hmark:)-240 8709 y(i\).)80 b(Net)-5 b(w)g(ork)60 b(:)81 +b(hmark:)-240 10056 y(i\).)80 b(Net)-5 b(w)g(ork)60 b(:)81 b(Mo)5 b(dels)59 b(the)h(complete)f(\015o)-5 b(w)60 b(net)-5 -b(w)g(ork)-240 8983 y(ii\).)79 b(Bask)-5 b(et)59 b(:)81 +b(w)g(ork)-240 10330 y(ii\).)79 b(Bask)-5 b(et)59 b(:)81 b(Con)-5 b(tains)59 b(the)i(arra)-5 b(y)60 b(of)g(sorted)g(edges)42 -9531 y(Both)74 b(these)f(data)g(structures)g(are)h(global)f(and)h(ha)-5 -b(v)g(e)73 b(a)h(lifetime)d(throughout)i(the)h(co)5 b(de.)120 -b(The)74 b(net)-5 b(w)g(ork)73 b(data)-240 9805 y(structure)j(is)g -(initialized)e(in)i(the)g(function)f(readmin\(\))h(called)f(from)h -(main.)128 b(The)77 b(function)e(readmin\(\))g(reads)h(the)-240 -10079 y(complete)59 b(net)-5 b(w)g(ork)60 b(graph)h(from)f(an)g(input)g -(\014le)g(and)g(mo)5 b(dels)60 b(this)f(as)h(a)h(data)f(structure.)42 -10353 y(Figure)h(9)g(sho)-5 b(ws)61 b(the)f(cbu)h(\(complete)e(b)5 -b(ottom-up\))60 b(graph)h(for)g(the)g(main)f(function.)80 -b(The)62 b(net)-5 b(w)g(ork)61 b(and)g(bask)-5 b(et)-240 -10627 y(data)69 b(structures)g(are)g(clearly)f(sho)-5 -b(wn)70 b(with)f(their)g(sub)g(structures)f(in)h(the)g(\014gure.)108 -b(It)68 b(also)h(sho)-5 b(ws)69 b(all)g(the)g(link)-10 -b(ages)-240 10900 y(that)60 b(DSA)h(iden)-5 b(ti\014es)58 -b(amongst)i(the)g(substructures)f(in)h(the)g(b)5 b(enc)-5 -b(hmark.)3809 11672 y(14)p eop end +10878 y(Both)74 b(these)f(data)g(structures)g(are)h(global)f(and)h(ha) +-5 b(v)g(e)73 b(a)h(lifetime)d(throughout)i(the)h(co)5 +b(de.)120 b(The)74 b(net)-5 b(w)g(ork)73 b(data)-240 +11151 y(structure)j(is)g(initialized)e(in)i(the)g(function)f +(readmin\(\))h(called)f(from)h(main.)128 b(The)77 b(function)e +(readmin\(\))g(reads)h(the)3809 11672 y(14)p eop end %%Page: 15 15 -TeXDict begin 15 14 bop -56 -99 7913 7 v -56 5920 7 6020 -v 0 5870 a @beginspecial 62 @llx 336 @lly 568 @urx 720 - at ury 4680 @rwi @setspecial +TeXDict begin 15 14 bop -240 -99 8547 7 v -240 6401 7 +6500 v -184 6351 a @beginspecial 62 @llx 336 @lly 568 + at urx 720 @ury 5060 @rwi @setspecial %%BeginDocument: Figures/twolf_cbu3.ps %!PS-Adobe-3.0 %%Pages: (atend) @@ -13175,359 +12219,139 @@ 5220 4680 450 450 re f* cleartomark end end pagesave restore showpage -%%PageTrailer -%%Trailer -%%Pages: 1 -%%EOF - -%%EndDocument - @endspecial 7850 5920 V -56 5927 7913 7 v 1477 6262 -a Fj(Figure)59 b(7:)80 b Fm(CBU)55 b(graphs)h(of)f(term)-5 -b(b)5 b(o)-5 b(x)56 b(and)g(netb)5 b(o)-5 b(x)55 b(link)-5 -b(ed)55 b(lists)i(in)e(t)-5 b(w)g(olf)42 6812 y Fj(Both)62 -b(the)g(data)f(structures)h(iden)-5 b(ti\014ed)60 b(w)-5 -b(ere)62 b(global)f(in)h(nature)g(and)g(w)-5 b(ere)63 -b(recognised)d(as)i(global)f(b)-5 b(y)62 b(the)g(DSA,)-240 -7086 y(as)80 b(sho)-5 b(wn)81 b(b)-5 b(y)80 b(the)h(presence)e(of)h(G)h -(\015ags)f(in)g(the)g(\014gure.)141 b(There)80 b(w)-5 -b(ere)81 b(no)g(lo)5 b(cal)79 b(data)h(structures)g(in)g(the)g -(\014gure)-240 7360 y(and)64 b(righ)-5 b(tly)63 b(DSA)h(did)g(not)f -(iden)-5 b(tify)63 b(an)-5 b(y)-15 b(.)90 b(This)64 b(sho)-5 -b(ws)63 b(DSA's)h(strength)f(in)g(p)5 b(erforming)63 -b(escap)5 b(e)63 b(analysis)g(for)g(the)-240 7634 y(di\013eren)-5 -b(t)47 b(data)g(structures.)74 b(None)48 b(of)f(the)g(no)5 -b(des)47 b(in)g(this)g(b)5 b(enc)-5 b(hmark)46 b(got)h(collapsed.)74 -b(This)47 b(again)g(sho)-5 b(w)g(cases)47 b(DSA's)-240 -7908 y(strength)74 b(to)h(infer)g(t)-5 b(yp)5 b(e)74 -b(information,)j(i.e.)123 b(DSA)75 b(is)g(\014eld)f(sensitiv)-5 -b(e.)122 b(There)76 b(w)-5 b(ere)75 b(just)g(single)e(instances)h(of)g -(the)-240 8182 y(ab)5 b(o)-5 b(v)g(e)60 b(men)-5 b(tioned)59 -b(data)h(structures.)42 8456 y Ff(Metrics:)82 b Fj(N=2)-240 -8730 y(N)55 b(as)f(men)-5 b(tioned)52 b(earlier)i(is)f(the)h(total)f -(no)h(of)g(SDSI)g(found.)78 b(In)54 b(the)g(mcf)f(co)5 -b(de)54 b(there)g(are)g(are)g(t)-5 b(w)g(o)55 b(global)e(static)f(data) --240 9004 y(structure)j(instances)e(:)78 b(one)55 b(whic)-5 -b(h)55 b(corresp)5 b(onds)55 b(to)g(the)g(main)g(data)g(structure)f -(net)-5 b(w)g(ork)56 b(an)-5 b(t)55 b(the)g(other)g(whic)-5 -b(h)55 b(acts)-240 9278 y(lik)-5 b(e)71 b(a)h(bask)-5 -b(et)72 b(con)-5 b(taining)70 b(the)i(list)f(of)h(arcs.)115 -b(The)72 b(\014gure)h(also)e(sho)-5 b(ws)72 b(that)g(the)g("arc")g -(sub-structure)e(is)i(p)5 b(oin)-5 b(ted)-240 9552 y(to)67 -b(b)5 b(oth)68 b(b)-5 b(y)67 b(the)h(no)5 b(de)67 b(sub-structure)g -(and)g(the)h(net)-5 b(w)g(ork)67 b(data)g(structure.)101 -b(Though)68 b(this)f(example)f(sho)-5 b(ws)68 b(DSA's)-240 -9826 y(strength)60 b(of)h(b)5 b(eing)61 b(\014eld-sensitiv)-5 -b(e)58 b(it)i(also)h(presen)-5 b(ts)60 b(one)h(of)g(its)f(w)-5 -b(eaknesses.)82 b(Due)61 b(to)g(the)g("uni\014cation")e(prop)5 -b(ert)-5 b(y)-240 10099 y(of)53 b(the)g(DSA)h(t)-5 b(w)g(o)53 -b(distinct)f(instances)g(of)h(the)g("arc")g(structure)g(\(net)g -Fi(!)g Fj(arcs)g(and)h(net)f Fi(!)g Fj(dumm)-5 b(y-arcs\))52 -b(are)h(sho)-5 b(w)g(ed)-240 10373 y(as)60 b(one)h(no)5 -b(de)60 b(in)g(the)g(\014gure.)-240 10647 y(G=2)-240 -10921 y(Both)g(the)g(SDSIs)g(are)h(correctly)e(depicted)g(as)i(b)5 -b(eing)60 b(global.)3809 11672 y(15)p eop end -%%Page: 16 16 -TeXDict begin 16 15 bop -56 -99 7913 7 v -56 5527 7 5626 -v 0 5477 a @beginspecial 17 @llx 336 @lly 559 @urx 720 - at ury 4680 @rwi @setspecial -%%BeginDocument: Figures/twolf_cbu4.ps -%!PS-Adobe-3.0 -%%Pages: (atend) -%%BoundingBox: 17 336 559 720 -%%HiResBoundingBox: 17.999219 336.700000 558.719141 720.000000 -%................................... -%%Creator: AFPL Ghostscript 850 (pswrite) -%%CreationDate: 2005/11/29 13:05:04 -%%DocumentData: Clean7Bit -%%LanguageLevel: 2 -%%EndComments -%%BeginProlog -% This copyright applies to everything between here and the %%EndProlog: -% Copyright (C) 2004 artofcode LLC, Benicia, CA. All rights reserved. -%%BeginResource: procset GS_pswrite_2_0_1001 -/GS_pswrite_2_0_1001 80 dict dup begin -/PageSize 2 array def/setpagesize{ PageSize aload pop 3 index eq exch -4 index eq and{ pop pop pop}{ PageSize dup 1 -5 -1 roll put 0 4 -1 roll put dup null eq {false} {dup where} ifelse{ exch get exec} -{ pop/setpagedevice where -{ pop 1 dict dup /PageSize PageSize put setpagedevice} -{ /setpage where{ pop PageSize aload pop pageparams 3 {exch pop} repeat -setpage}if}ifelse}ifelse}ifelse} bind def -/!{bind def}bind def/#{load def}!/N/counttomark # -/rG{3{3 -1 roll 255 div}repeat setrgbcolor}!/G{255 div setgray}!/K{0 G}! -/r6{dup 3 -1 roll rG}!/r5{dup 3 1 roll rG}!/r3{dup rG}! -/w/setlinewidth #/J/setlinecap # -/j/setlinejoin #/M/setmiterlimit #/d/setdash #/i/setflat # -/m/moveto #/l/lineto #/c/rcurveto # -/p{N 2 idiv{N -2 roll rlineto}repeat}! -/P{N 0 gt{N -2 roll moveto p}if}! -/h{p closepath}!/H{P closepath}! -/lx{0 rlineto}!/ly{0 exch rlineto}!/v{0 0 6 2 roll c}!/y{2 copy c}! -/re{4 -2 roll m exch dup lx exch ly neg lx h}! -/^{3 index neg 3 index neg}! -/f{P fill}!/f*{P eofill}!/s{H stroke}!/S{P stroke}! -/q/gsave #/Q/grestore #/rf{re fill}! -/Y{P clip newpath}!/Y*{P eoclip newpath}!/rY{re Y}! -/|={pop exch 4 1 roll 1 array astore cvx 3 array astore cvx exch 1 index def exec}! -/|{exch string readstring |=}! -/+{dup type/nametype eq{2 index 7 add -3 bitshift 2 index mul}if}! -/@/currentfile #/${+ @ |}! -/B{{2 copy string{readstring pop}aload pop 4 array astore cvx -3 1 roll}repeat pop pop true}! -/Ix{[1 0 0 1 11 -2 roll exch neg exch neg]exch}! -/,{true exch Ix imagemask}!/If{false exch Ix imagemask}!/I{exch Ix image}! -/Ic{exch Ix false 3 colorimage}! -/F{/Columns counttomark 3 add -2 roll/Rows exch/K -1/BlackIs1 true>> -/CCITTFaxDecode filter}!/FX{< -]setcolorspace[0 255]false @X -IC -zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz -zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz -zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz -zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz -zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz -zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz -zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz -zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz -zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz -zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz -zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz -zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz -zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!**$!/2zz!!!!"!<<*"zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz -zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz -zzzzzzzzzzzzzzzzzzzzzzzzzzzz!!*'"zzzz!s&N)zz!!!!)#ljr*zzzzzzzzzzz$3^P4!!E<.zzz -!!**#zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz -zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz -!!**#zzzz!!!0*zz!!!!,$jcn6zzzzzzzzzzz"9Ar3!!!!*%0-A.zz!!!!"zzzzzzzzzzzzzzzzzzzz -zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz -zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!!$"zzz!"/l0":bD?"p4l. -$NU8/#7(>2!s&E0!"T)2"onW'!!!3(!=T2<$3L\;"9f,5%L)q7$jR+?!=8`,!=/l1z!"9#2zzzzz -!1":5&.z!!`N3zzzzz!!!$"zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz -zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz -zzzzzzzzzzzzzzzzzzzz!!!!"!<<*"zz!!!!%$jcn6!"8u1!"T/3#mC;6%fcS1#lkA7!2!=8`,"98E%z!!!-(!<`B0"onW/!=&T)!!EB)"98E4"pb\=zz"U,86!!!B-%KHJ/z -zz!,7 -"onu7!!NB-zz!!!!'$31&+zzzzzzz!!!!"zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz -zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz -zzzzzzzzzzzzzzzzzzzzzzzzzzzz!!!!"zzzzzzzzz!!!!0!Xf)2$31&+!!E]:!!!!+"onW(#ljr*zz -"pt>1zzzzzzzz!<<*"zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz -zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz -zzzzzzzzzzzz!<<*"zzzzzzzz!!!!*"98Q5$O$Y5!!!B6!=T56$3gJ1!=8`+zz!!Wc1zzzzzzzz -!!*'"zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz -zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz -!!*'"zzzzzzzz!!!!($31&1$31J=z!!`i7!"&o1!!*B+zz!!!31zzzzzzzz!!!$"zzzzzzzzzzzzzzz -zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz -zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!!$"zzzzzzzzz%gN(7 -":PYA"98E%#m:5;!<> +/CCITTFaxDecode filter}!/FX{< +]setcolorspace[0 255]false @X +IC zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz @@ -13546,1423 +12370,1185 @@ zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz -zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!!!" -!/!!!62"q(qKzzzzz#6>&0!!!!*$ig8-zz!!r`. -!=B8B#lt&2z!!`N*$3:/.!;":khAzz!!E<,!!!95"98].!=&T)!!!3("98E("oo#5!=/Z*zzzz!):!=&T-"98E%z!!!N6z -zzz!!!!%$ig8-!!!'$#64`(zzzz!!4zzzz!!!$"zzzzzzzzzzzzz!<<*"zzzz"pt>="oo#5$NL/,z!!E]1zzzz!!!'$ -#64`(zzzzz$Od=Az!!!9*#64`(!"TD:zzzz!!!!$!=Af,z!!!!,$j-J0!!!!0!!!33"Ub;1!!E]= -!!!-1!!!6)"onW'zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz -zzzzzzzzzzzzzzz!!!$#zzzz!"/r5"9ec1%fcS0!"/l0":bnB!#ljr9!=T&7!!Wc;!=T#0#6Ou-"98i2!=&W+#n$b:$j6S2%06SB -$46b>!=/Z*!!!3(!WW3#z#7:Y=$NL/0#lt>4!"&o1!Wri=zzzz!!!!"!<<*"zzzzzzzzzzzz!!=9)8$ipA0#m^P4#64l-!!=T26!=Af8 -!=/l$3:P:!!!N1!=Af2!&0 -!!!!*$ig8-z!!!!-!<<*"z!!`i:!=8`+!t,,9!!!?,!9!"&i/$NU\: -#n71A$ig8.#lk88#6Fo8#QY,0$3L84$j$YB$3184$O?b;!"T)8#mLA0!!`N0zz!!WH0zz"pbPE!!!<. -":P81"9AN(%fu_2zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz -zzzzzzzzzzzzzzzz!<<*"zzzzz"9\]/!=T29$jcn6!"&o1!!*B+!!Wi3!"9&>!=]#/!!!-1z!!iT1 -!"TD:!!*3&$3gJ1!!*B+"U"f*!sS`0$31&/!=]&2!!!*'!!3<+"98E%zzzzz$ip>.!!!$#!=T2? -!!,2#lt85%KHJ/!!iT1z":PS:!!!-(!!`N7!"TG;":P81!=8`.%KHJ/!!iT1!!Wi3"pt>1 -"9Al2"98E3!=K8;!tPA3zzz!!!3(#QOi)$3:/.#6kGC!=8`7$Npk)1!!!!%$ig8-!!!9*#652:!WiB.!"&o1!!!$+#6>,2 -!"&o1"pt>1#lt>5#64`.$ig81!=]#/zzzzz!"T)9z!s8N.$31A5#RUe:!=8`+$3gJ;"U>#-zzzz -!!!!"zzzzzzzzzzzz!!!!"zzzzzz"p+c3"pb52%KQS5!!E]1!"&o1!!`N2!!rZ2$j6P1!!!9*#64`( -!"0,7$jZh7!=K#@"TSl0!!E]1!!*B+$j6P1!!!9*#64l8!!Wc1!!rZ2!=8`+#lt82#QYD8zzz!!!!% -!<`B&!!!K0$NLA:!"92?"onc7!!!-1!!E<3zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz -zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!!$"zzzzz!"&r2#lt#1$ig84$3^D:"onW(#ljr0 -$ig89"q(G7z":P81!!!!)!=&T)$3:/1!!!?1!!!!"#n$b:!!!?:!!Wc1!!EH7!=8`+%hAXA%h8aEzzz -zz!!!H/$31&+!"'&5#7:G2"UknA!!*B+!"&o1#6bV#6>,@!!!-1!!!$+!!<`3 -!!!!)!=&T-$igJ=!!!-*$NUG3!!EH*$Ng\9#ljr*zzz#6b8=!!!!%!<<*(#QOu.$j$D3$ig81$ig80 -$k!%8zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz -zzzzz!!!!"zzzzz!!ET.!!iT1$4dFG!"Ar/$4d7@!<`B&%L!(D!!9#QY26!!!!*"98l3!!!K;%KHS7!WW31!=Jl.":bP8#lk>9%06M1 -"pFu2$j$YB"98W,#QOr0$NgV6%KQV2zzz!!!<+!snr-%KQP0%h/LH"UY50%L!4?%Kuh4!W`B)zzzzzz -zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!<<*" -zzzz!!3Z2!!!!'!=T#9"9AN0!!E<*! +zzzz!=],<"q(G@%06k;z!!!'1%fch:"oni.#64`($ipD0$NU51!tG;2zzz!!!$"zzzzzzzzzzz!!**# +zzz!"8l2%Kuh8#QOi)z!!WE'zzz!!!!'zzzzz!!WE'z!"B,4!!!-&$NL/,zzz#RCbC%0-A.z$k%KQS2!%KQS2!!!!!%!!!Wi>!<.!!!N8z#6=f0!=&u5":"r4!"/f-!Wi?%!=K);!!!?1!<`B2!=&T6!=&T)zzzz +!"Ar3!!!!'#QP&6%gi:=!!33%$NU50"TSN&zzzz!<<*"zzzzzzzzzz!<<*"zzzz!!s&:!s&H.!!!`N0!!W]/$NUY:"98E%%gW.8!!!6)!!!<+!Bzzzz!!!$"zzzzzzzzzz!!!$"zzzz!!!E6 +!"TPE!=T)4!!!`N0!!W]/$NU5;"TSN&%gW.8!!!!-%1WUJ!=T8:"p+c4!<D$NLME!!W]/"p4i*zzzzzzzzzzzz +zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!*'" +zzzz#Qt,<%L3"="onr9%g)e?!=&T/$31,.!"K&1":l"Fz#6=r4$31&+!"8l5!!NB."qD%F!=K)= +"9f8<$4$V9#QOo7#7^qI"p"u;%KQnA$ipG6!=K#;%L`gJ!I"p"u7!s&E1$ipG6!=K)9!1!!!!,!s&E'#lk;5 +!<7!"&`-#64`(z!"08;$4Qt8 zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz -zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!!$"zzzzzzzzzzzzzzzzz!!!B/!="oo#5$NL/3!WW3$"98E2zzzz!!!!.!=&T)zzzzzzzzzzz -zzzzz!!!$"zzzzzzzzzzzz!!!$"zzzzzzzzzzzzzzzz!!Wc1$jH\>!t,)/z!!!!)!s&o4!!!E-z -!!!!0"ono0!WW3."98E%zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz -zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!*'"zzzzzzzzzzzzzzzzz!!EH5"U"f8#QOi)z!<`B& -!!!K0!>5!!iu6%fln8zzzzzzzzzzzzzzzz!!!!"zzzzzzzzzzzz!!!!"zzzzzzzzzzz -zzzzz!!!-*$O$Y5%L<%7!!!3(!=T25#R1D4"98E1!!!95!=T#>!,7!=929#R:MCzzzzzzzzzzzzzzzzzzzzzzzz -zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!!!"zzzzzzzz -zzzzzzzzzz!!!!,!t,/6!<`B&!!!$&!!!!%!<<*,$312;!!!!+"onc0!!!H/#64`(zzzzzzzzzzzzzz -zz!!*'"zzzzzzzzzzzz!!*'"zzzzzzzzzzzzzzzzz$Ngb<"T\`+!!!!-"98]3!"02D$Od"A!!24!!rW*zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz +zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!!!"zzzzzzzzzzzzzzz"9SZ+!!Wf2z$NU5-!!!9*!!=!!W]/"p4i3!<<*"zzzzzzzzzzzzzz!<<*"zzzzzzzzzz +!<<*"zzzzzzzzzzzzzz!!3B*!!!!/$O$P2$O-S:!rrT,"q:P6$3pS3!!!H/$4?h>"onu3"V(Y=!<`B& +zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz +zzzzzzzzzzzzzzz!!!!"zzzzzzzzzzzzzzzz#QtPG!=o/1$NU5-!!`N0$NUA@$31&1#QP2B!"/f-zzz +zzzzzzzzzzz!!!$"zzzzzzzzzz!!!$"zzzzzzzzzzzzzz!!!0,!!30'"98W9!<#6=i+!$O-S2"T])5#RLJ2!!`N)z!"KM?"TSN&!!rZ,"onW'zzzzzzzzzzzzzzzzzz zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz -!!*'"zzzzzzzzzzzzzzzzzzzzzz!"9A$NU5-!!`i2!!!!'$31&4$31>6":5)/zzzzzzzzzzzzzz +!!!$"zzzzzzzzzz!!!$"zzzzzzzzzzzzzz!!s&6#6>5?"p"r5!<!<`W5!!!B- +$jZq?!!WZ8zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz +zzzzzzzzzzzzzzzzzzzzzzzzzzz!!*'"zzzzzzzzzzzzzzz%0QY2$jm"G!"T)2!=Jl4%KQS2"p"`+ +$NU80#7:J@!8C$j[:C!#7^b8!,nDzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz&HNIU&-)\1 zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz -zzzzzzzzzzz!!!QA!>#eSzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz -!!!!1&-3=Rzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz -zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!!!3!PS7zzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!!!"!b_9zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz -!!!Q2! -!<`o?!rr<$z!!!-&"onW/$j6P<"T\o0!!!!*!=Af,!sS`5!s&Z-zzzz!!!!"!<<*"zzzzzzzzzzzzzz -zzzzzzzzzzzzzzzz!!!!8)uos=zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz -zzzzz&/"sCzzzzzzzzzzzzzzzzzzz!!!-&%0-A.!!s)7#7LV9!!!!,!s&].!!*B+!!WH/zzzzz!!*'" -zzzz!!**#zzzz!!!!(!=/u4#64l0zz$Od=Azzzz!!!N6zz!!!!%$ig8-zzzzzzz!!!K;!"TD:zzzz -!!!!$!=Af,!"/f."98E%z!!!'$%KHJ/!!`u6!"98Cz$4I+=!"&o1!!rZ4zzzzz!!**#zzzzzzzzzzzz -zzzzzzzzzzzzzzzzzzz(`EASzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz -zzz!#ZdWzzzzzzzzzzzzzzzzzz#lt;3!!!!-"TSN&z!!`i8"Ub;1":5)8!!!$+!!rf>zzzzz!!!$#zz -zz!!!$"zzzzz$O$Y9"TSc#6!.z!!!!-$O$_7!!W]9"onW1!/3!!!9*!?$ig80"onf0!!iT2!!*B+!"TS?!"KD;"pt>1"9Ar4!WW3&!rrB+ -!sAT(zzzzz!"8l.!!!!"!2$3gJ1$3ge;"98E%zzzzz!!**#zzzzz!)1!!!!%$ig87 -"onW0$3:J6":P81$3gJ?!t,58$NL26!!!E3!!!-1!!Wc1!!rZ4!=&T)"q1J3"9Ar3zzzzz!!!N1 -#QOi)!!<<'!"8i4!<`N3!"&o1!"&o1$3^Y7zzzzz!!!!"zzzzz!%LN1:":be? -"98E3"U>>7!<`Q.$NL;;$4d7E!!!!+"TeZ0%1WOA!"9AC!=9,9$31P>!!!E/zz!!Wi3!!!!#!sAT(zzzzzzzzzzzzz!!!9*!/3"p"i-!=T;9!<`o6!2!!!!(!):!=&T-"98E%z!!!N6zzzz!!!!%$ig8-zzzzz!!E]1z!!!!%$ig8-!!!0*zzz -zzzzzzzzzzz!!!$+!!!!*!=&T2$ipV6!!!95zzzzzzzzzzzzzzz!<<*"zzz!!*'"zzzzzzzzzzzzzzz -zzzzzzz!!!!*$jZh5#R18/zzzzzzzzzzzzzzzzzzzzzzzzzz!<<*"zzz!!!$"zzzzz!!!9*!X]G< -%0QY2!!!<+$k#4 -!s&o5#lkA6!=T57!=')C%LrmMz!Xo)1"98]0$3:55"Tnc7!s&E0!!**$#7(>2 -#6=r-z":P81!!!E3!!!30!<`B&$NgM?!!!-1!"0,7!WW3#zzzzz!!**#zzzz!<<*"zzzzz!"/r5 -"9ec1%fcS0!"/l0":bnB!#9"p4l.$NLG@!!=0&8"98E/ -#64`(z!!E<'!!=8`/ -$ig83!rrH)$NpJ:$O%"?$j-kC!<`W.#lk;5#7CqK!!W`0!!!!,!=])2":kM8$N^>0#lk>6%0?P5 -!!rf:!!ic/zz!)1#mC;6%fcS0z!!!-1z$jH\3"pbY=#lkAA":P81 -":PM9$31&+zzzzzz!!=]#/ -!!!-1z!"T/5!!!!0%KHe9%0-_8!!*B+":P82z!!!!%$ig8- -!"9&3!!W]/$jm7E!!E]1!!E]1"9Ar3zzzzzz!!!$"zzz!!!$"zzzzzzz#7ge?!=&rB$OQnC#QP29 -!!!$+!!!33!!!E3#6>)1!!!!%$ig8-!!!'&!)1!!!!%$ig87 -"oo&7!!!33"q1J3!"9&3!!E<3z!!!!%!s&N)$3gJ1#QY/1!!!-(!<`B&":PYFzz!!!$+!!!!*!=&T2 -"98W0#6Or3zzzzzzzzzzzzzzz!<<*"zzz!!*'"zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz -zzzzzzzzzz!<<*"zzz!!*'"zzzzzz!!`i2!!Wc1$jH\3"9eo.!=8`3!=&T)$jH\:!=95>z!"&o1z -$3gJ1#6Ou1#QOi*#ljr2!='&7!WW3$"98i5!!!N?%KQe7!!NK*"9\f/$NL/,zz":PD>!<<*##ljr. -$ig8/! -#7:b;!!!!,!<`B&%06nG"To,8!#mLA7"V1S5zz!"9&3"p"]3!<`B&%Kuh4 -"q1J$31&9"Ub;?"TSN(!8!!rZ,"UG)2 -!<`B'"98Q*"98r5!<#QP86":5)0 -$ig8-#7LV;!t5M;!="oo#5$NL/,$4d+:!"Ju/!=8`+zz -!!!31!!!6)#QOi*"98E%zzzzzzzzzzzzzzzzzzz!!!!"zzzz!<<*"zzzzzzzzzzzzzzzzz!!!!+ -$NL/,$31&+zzzzzzzzzzzzzzzz!!!!-zzzzzzzzzzzzzzzz!!!$"zzz!!!$"zzzzzzzzzzzzzzzzzzz -zzzzzzzzzzzzzzzzzzz!!EE)zzzzzzzzzzzzzzzzzzzzzz!<<*"zzz!!*'"zzzzzzzzzzzzzzzzzzz -!!EH5"U"f8#QOi)!!WH6z!!*3)!=fA9!=&`.$ig\:!1#6>)1!!*3&$3U>3!=&T)zzzzzzzzzzzzzzzzzz!!*'"zzz!!!$"zzzzzzzzzzzzzzzzzz -$P*7=!=f)0zzzzzzzzzzzzzzzz!!!N1$31&+zzzzzzzzzzzzzzzz!<<*"zzz!<<*"zzzzzzzzzzzzzz -zzzzzzzzzzzzzzzzzzzzzzz!W`H1zzzzzzzzzzzzzzzzzzzzzz!!!$"zzz!!!!"zzzzzzzzzzzzzzzz -zzzz!!!!,!t,/6!<`B&!!E]2$31&,#lk84#71D9!!Wi3!!Wc1!!`N1!!!$=i+!"T\r1%g)e3!W``1 -$NU_;$3^\8#Rpb6zzzzzzzzzzzzzzzzzz!!*'"zzz!!!$"zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz -zzzzzzzzzzzzzzzzzzzzz!<<*"zzz!<<*"zzzzzz!<<*"zzzzzz!<<*"zzzzz!!!!"zzzzzzz!<<*"z -zzzz!!!!"zzzzzz!!!!"zzzzzzzzzzzzzzzzzzz!!!$"zzz!!!!"zzzzzzzzzzzzzzzzzzzz!"T,2 -!!!'/!S9(B=F8zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!!i: +!>GM6zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!#52zzzzzzzzzzzzzzzzz!!!K0zzzzzz!!!!,!=/c.$NL/,zzz!!!*)!!!!%!<`B&z!!!!- +!s&E3#mUJ3$NL/,!"/f.$3:/.!=]#/zzz!!!!"!<<*"zzz!!!!"!<<*"zzz!!EB)!WW3##n-e6zzzzz +zzz$ipV6zzzzzz!!!9*"T\l/zzzz"Tn`)!!!<3zz!!!3(!=Au7!W`Q,z#QY23!zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz +zzzzzz!!*f7zzzzzzzzzzzzzzzzzz$ip>.zzzzzz!!!3/"9Al1zzz!!!31!t>_?#RCbC%0-A.z$k8zzzzzz!!!!"$O-k:zzzz!s&o4!!E<'#64`(z$NUb>9!rrQ.!=fMJ!=o2< +":##0!_?%1!%A%0-Y8!!!!%!%1N=H$NUJ4!!!<+z!!!!'"V(Y8":YD6!!!$-"9T,=zzzz!!!$"zzzzz +!0"Tn`) +!!!<3zz#RUP3!!iT+!X8l8"oni%06\6zzzz!!!H/"98E%"pb25#7h.A!rrB(!!!$-#mgS3zzzz!!!!"zzzz!!**#zz +zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!**#zzzzz!"pY//!!*H-!s&l>!"TD:$ipS5"pb20$NL\E!Y#,0 +!Wi?0!s&f1zzzz!!!?9"98E%!=Jl/!!W]<":"r4!!ic/%1*"7zzzz!!!$#zzz!!*'"zzzzz"pFu. +%1`pK%g)n6$4?h8!WW3+"oni5"p4i*!!!?6!!!!-!<`B&!"T>8$NU50%1`I>!X8W/#QP)>!>@!=&`."V1Y7!!!!'$312= +!WW<.!!*9(!sT8:$NpeE$j$D8$3pP2zzzz$NU>!!WoA"T\u8$3UMB"9Jo8$k%fl_B!.!!!<2zzzzzzzzzzzz!!ic/!!!?: +!!WH/!!!!-!G!!EQ1zzzzzzzzzzzzzzzzzzzzzz!!*'"zzz +!<%fd%A!!!!&!5!"T)2!XSl."onW,!#Qau+!!!B- +!!!!0$31&-%0ce4"qL_>!!ic/!W`H)zzzzz!<<*"zz!!!!"zzzzz!!EB)!WWE4!!!!&!>9!rrN-!s&H'$j-M; +$jZk7%fl_3!!!6+!=fMD!zzzzzzzzzzzzzzzzzzzzzz!!*'"zz!!!!"zzzzzzzzzzzzzzzzzzzz%06J3$ig8-zzz +zzzzzzzzzzzzzzzzzz!!!!"zzz!!!$"zzzzz!!!!0%fcS0!!iu<%0-_C!"B26"9Al1!sSu?$k!(= +$4?h6!!!')!!ro2#m1/:#QOi1"ono8!!!sS`*$4?h8!WW3$$NLG:"pb2/!!!?6z +!X8W8$3184!!33%!!ic6!=&T/#QOl5!"TPM!rr<*$31J8!WW3#zz!!Wo6!!33%!!33%!!E?(#QP)1 +#6k>3z!!!B-!!!!0$31&-!"'5I"pY/6!!ic4!rr<$zzzzz!"onu@!!`N0!!N]6#R18: +!=oA7z!!!!)"onW'$4d+@#655<"on]+zzzzz!!!E.":bS8":+u-!!W]/!!!9)zz!!*H-zzzzzzzzzzz +zzzzzz!!!!"zzz!!*'"zzzzzzzzzzzzzzzz!!WN6!<`B2#ljr5!=Sr:!WWZ6zz!!!3/#7_"D"V(P>5%M&OJ!=&T+!X&i7!!!*2#64`(z!!ic/!!!?:!!WZ."p"r/ +!Wi?%zzzzz$ipSC%fcY9!!!!'#QOi)zz!!!!"$NL/,zzzzzzzzzzzzzzzzz!!*'"zz!!!!"zzzzzzzz +zzzzzzzz!!!!'$4Hq?!!iQ)!"TPB!!!<*!X8W)zz!Wi?%$4d+A!=&T)zzzzzzzzzzzzzzzz!!!!"zzz +!!!$"zzzzz":Y>2!"T)?$jHt!!3N.zzzzzzzzzzzzzz!"0)5zzzzzzzzzzzzz!!!!"zzz!!*'"zzzzzzzzzz +zzzzzzzzzzzzzzzzzzzzzz#Qt,-zzzzzzzzzzzz!!!<6"9SZ+!!W]/!!WE'$4?h>"p+i+!!*H-zzzzz +zzzzzzzzzzzz!!!!"zzz!!*'"zzzzzzzzzzzzzzzzz!!i]9%KR(?!!!N:!rrB,!!W]/!=Jl5"on]+ +!!!?:!!`N0#QXr,!<`B&zzzzzzzzzzzzzzz!!*'"zzz!<<*"zzzzzzzzzzzzzz!!!!'! +zzzzzzzzzzzz!!!!-#lkJG#6>5;#QOi)!!!?6!!ic!!r`-!=oSK"oo)A!!!K5!"8l:"qD"@"p=o+zzzzzzz +zzzzzzzz!!*'"zzz!<<*"zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!*'"zz!!!!"z +zzzz!!!$"zzzzz!!!$"zzzzz!!*'"zzzzz!!*'"zzzzz!<<*"zzzzz!<<*"zzzzzzzzz!!!32!!!-( +!cINz -zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!!lL!>6"V!!!!6'c-lNz -!#lXl!!*'"z!!!$#zzzzzzzzzz!!**#zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz -zzzzz!!!!"!,;3zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!**$!?2"=!"o;5 -!?;(>!!!!=!bb;zzzzzzzzzzz!!**$'*0*Rzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz -zzzzzzzzzzzzzzzzzzzz!GM6 -!!!W4!!'G1b_9zzzzzzzzzz!!!!9'*/+7!?<$Yzzzzzzzzzzzzzzzzzz -zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!#lUQ!?%Fzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz -zzzzzzzzzzzz!!!!>!>>G5zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz -!$2.\z!"o;Nz!$)(@)?9a;&JG0G!>64Lzzzzzzzzzzz!!!!9)A<,P!?D.?zzzzzzzzzzzzzzzzzzzzz -zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!#lpu!SIzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!!!" -'`\46!!!W4&HDe2!!!u>'`\46!#bk=*$,([zzzzzzzzzzzz!!!rS'EJ4Ozzzzzzzzzzzzzzzzzzzzzz -zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!$3$Z!>PS7zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz -zzzzzzzzz!!!rX)#sX:zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz'H$lN -!!!!3&-)\1!!"&@(B=F8!#P_M(B=F8zzzzzzzzzzzzz!!!iS'H7#Pzzzzzzzzzzzzzzzzzzzzzzzzzz -zzzzzzzzzzzzzzzzzzzzzzzzzzz)]]n9zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz -z(_?ZIzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!#5J6z()m5R!!!!6 -)#sX:!!!cG)ZTj#-zzzzzzz!!!33$P*REzzzz!!!!( -!=&T)zzzzzzzzz!!!9*!6":PM8 -"9AK&%KQP0!!`].#6>,2!!E<+#64`(z!"/f1!!!!%!"TSN&%gN(7z!!!B:zzzz!!!!,%KHJ/!!!!'zzzzz%flk:!<`B&zzzzzz -%Kuh4!!!05!"/r2#ljr*!!rZ5!!!K;!!!3("98E%zzzz!=!!rZ,!=/Z0$j6S7#65,=!4!!*B+#mCh>zzzzzz!!!!"zzzz -!!*'"zzzz!!NN+z!!!0)z!!<60#QY22z!"'&5z!!!!$$OR:B!!!!+$31&9!=/l1%KHJ/!!!-&!!!!' -!!!!"#ljr*!!<60"p"](z!=8`+!!rZ2!!rc:$31&+$4-_zzzz!!!!"!<<*"zzz!!!$#z -zzz!!!B1"9\l.#7ge7!!!'/!<`]=!!snr-%fm(@"oo&9!s&K3!!`T,!<`B2!"p55=!2"onW*%LW[P!!rf:!!ic/zz!9z!!!?5z!!!!#%fc_5!WW3#$4I.F"U,8A!s&f5!!!!% -!2!!!-/!!ic/$3gJ6!$igJ=!!!-&$NUA1!"K#;$NgJAzzzz$j6P;"onW'!=8`+!!!!'$31&7"98W-zz!!*B+!!!<+ -#64u9!!!rrZ4!!!-1#6>/3zzzzz!!!$"zzzzzzzzzzzz!!*'" -zzzzz!Y58;!!=]#/!!!-1z!"T/5!!!3(!,0#QY/1!!*B6"Tn`)zzzz!!!!"zzzz!!*'"zzzzz -!!a#7#QY/;%fuh6!s\f5"onW(#ljr0$ig89"pk;1z$3gJ1!!!!%$ig8;!t,58$NLM)1!!!!% -$ig8-!!!'&!)1!"9&?"onW.!=8`+!5$ig87"onW1!1 -"9f/6"onW+"TSo4#lt>4zz!!!B8%g!.B!"&o1!!!$+!!!N3#mL_:!"/r7"98E%z!!!!"#ljr*#lt82 -#7:G2"UknA!!*B+!!*B+%06S3zzzzzzz!<<*"zzz!<<*"zzzz!!WH0z%1!.=#QOi)#6>#/#QY22 -!!!B2!"'&5!!!!%!XK89!!!-&!WW3-$31&+!!!K:!!!!-"onc,z!!!!"#ljr*%06Y5zz!=8`+!!rZ2 -!!rc.!W`]4!!iT1!!!$+!"Ar3zzzzz!<<*"zzz!!!$"zzzzz!!!?2!!rZ+"q1J3#QkS;$3gJ1!=8`+ -"q1J3$jI.A!WW3#!"&o1z":P81#6Ou1#QOi3"onW'!=9,7"98E/%fd"@!!!N?%06b8!"TS?!Y5bE -!WW3#z!!!-1z$jH\3$ig8<"UkA2$3gJ1":P81!t5P;zzzzz!):!=&T0$3^D:"onW(#ljr3!=&T/$k!(=z":P81z!!iZ;%g<=@!!!!)"T\]1!!`N1!!!0*!t5/0 -!W`?&%h/[Hzz!!!$+!!!!*!=&T0$31&0$kE=&7$Ng_9 -%Kuh4$kE=@"onW'!!!*3!!!-&#n%.B!sT/8#7L_8"p"u0!sAu6#6557!WW3#z!!!!*!=&Z0"98N7 -!!!B-"98Z-#n$hB!!!!/!=&T)z!!!!,!<`B&!!E<(!!36&!!E<.!"/f1!"/f1!!!N1"98E%zzzzzz -!!*'"zzz!!*'"zzzz!!!B8"U"f*":kJ?!t552!WrN4!"ArA!"'5>!W`E(!"K/;#lt&0"To,4":GPI -":"o,!!EH,#mpt=z!tPA3$NU_;$3^J4!"T\r;"TeZ0%0Qh9#ljr*"pb2=$4$Y>!!!K:"U>#-!!!6)"onc0$OHh: -!"K>9"pk8=!<`B&z!!!B-"98E%"9AQ(!WrE&"9Ac.$NUA1$NUA1!"T)5$31&1!!s/i;!3!WW31!YY8!#?FQ +&J+pB!"^1l!zzzzzzzzzzzzzzzzzzzzzz +zzzzzzzzzzzzzzzzzzzzzzz!ke:zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!!!2!$:izzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!!!1*WZ9Vzz +zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!!$#!>b_9!!**$)#sX:!#>S9!?2"Z +!GM6zzzzzzzz +zzzzzzzzzzzzzzzzzzz!!!]6!>G5zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!#bk='*&"4zzzzzzzzzzzzzzzzzzz +zzzzzzzzzzzzzzzzzzzzzzzzzzz!!!]6)#sX:!!**>z'EJ4P&-*:C!zzzzzzzzzzzzzzzz +zzzzzzzzzzz)\rGT!!!+&>!!!!=!?;(>!#bk='G(6Ezzzzzzzzzzzzzzzzzzzzzzzzzzzzz*?,b8zzzzzz +zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!!fQ!?;(>zzzzzzzzzzzzzzzzzzzzzzzzzzzzzz +zzzzzzzzzz!#$4Mzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!$2+?!!!!7z!#?IQ +!!!!7'cd8Szzzzzzzzzzzz!!**$!!"9>Hzzzzz!!!$"zzz!!!!"!<<*"zzz"p"o.":,&/#RUe:"p#57"pt>1 +!!!!,!=&T)z"ptG4!!!!)"oni."V(_:!!<3$!=Jl-%hAX@$NLS;!=Sr.z!!W]/!!!'%!!!$$z%06\6 +#R18>!&0"p"r/!!!E.!WWT/!!EB6zzz!!!$#zzz +zz!"KMK!WW`Az!"/c3%KHJ/zzz!!`u6zz!"')6zzzzzz!!!B-!!ic/zzz!!!!%!!!!!#%KltCz +!"/f4z!!!H:!<`B&!!ic/!!*9)$NL/5!!!$-z!!*H-!!Ec;z!!!!'#QOi)!Wi?%#QY&.!!`T,#65#6 +!!!K1zzz!!!!"!<<*"zzz!#ljr*!WrK(!!*H-$ipk=zzz!!!!"zzzzzzzzzzz!!"T):zzzzz!!!!"zzz!!!!"zzz +!!!!&!=Sr.!!!!.!<<*"!"T)<"pt>1!!!!,!=&T)!!!!%!rrE-!!!!)#QP&0"UG,5z!=Jl1"onW( +$NL/,#lt#3!WW3#!!W]/!!!'%!!!'0"onW-%fln8#R181!!!E`4!WW3$$NpPA#64`(zzz!!**#zzzzzzzzzz!!!$# +zzz!!!'$!sAu9z!s&`>%KQS2!&0"pGJ>!!E`4!WWT/!"92:zzz!!!$"zzzzzz!!3B*!!!!/!!NQ3 +!<<*0"onf-!!E<1%g)q=!s\i,!!!!(%L`^G":>21$3gn>!!ro2!"T\`7!=Jl3!rrW. +!!j#6#n@(=$jR+@!!iZ8#QOi)#mgS3!!!!."p=r7"qCb9"qCb9%LWF@!"TD>!"Ao.z!"/f.!DF!!`N)!"'5:$NU5-!=K>@!!!!(!<<*"!!W]/!!!!+$NLG:!!E?( +#QP2>!!ic6!=&u5":"r4!"'5:$NU55"onl/"p4i*"pt>5$46b5zz!!!N3!=KDF!!!N:!!!!'%KQP0 +$4dOOz!!!!,!<<*"%gi::!WW9'#7UY?%fce>#7:\9zzzzzz!<<*"zz!!!$"zzz!!!!0!=Sr.!!!!. +!<<*"!"T)<"pt>1!!!!,!=&T)!!!!.!&0#R1G7zzzz!!!$#zzz!!!$"zzzz!!!!)":Pb@%fuh;!!!?6!!33% +!!ic/"pbD=z!X8W)!!!')!"TD:"p4i,!WW3)#QP2B!"/f-#R186!zzzz!!!$#zzzzzzzzzz!!!$"zzzz!!s&:!s&H.!.!!!N8z!WrW,"p"`*!&0"pYYG!!<3&!WWT/ +!!"onr1!>F!!!N:!!`c>"onW'z!!!!*!t,,;%gi:: +%gi::!t>bA!!!3*#n-e6z!"/f-!!!N:!!!'#$k!!33%!!W]/%M&OI!<$31G9!=Sr.z!!!9/!!!!+%fce= +!"K2;!!33%!!*H1$3^D0zzzz!!*'"zzzzzzzzzz!<<*"zzz!!!E6!"TPE!=T)4!!!`N0!!W]/ +$NUY:"98E%%gW.8!!!!0!s8`0z#7^b:#64c4!"TD<%0-A0!WWT1!=Sr.z!!!$-!!!6)#64r5!"K2; +!!33%$NU59%L2t6zz!!!!"zzzzzz!!s&6#6>5?"pb24!s\i0!"KM>$NUJC!=K)A$igJ:!<`B&!"8l= +!"02F%fc\<%gi:G#QOl9!!#/%0cq@"9ef6zz!"'5F!=K)= +!!!31!!`N0"p"]("9AT)z!!!!,!<<*"%gi::!WW3+$31&5%fce>!!!*1zzzzzz!<<*"zz!!!$"zzzz +#lt51!!ir4!t#G:"p"l-"qCV5!!WrA!=Sr.$OI"A!!!!'!rr<,"onW'#7(;0$NUY9!=Jl-$k31; +$NLS;!=Sr.z!!W]/!!!'%!!!'#":bJ5#6>&0#R186%L)n5zzz!!!!"zzz!!!$"zzzz!!`Q*!!3T? +%KZk6":5)/#Rpb?#R:A7 +!"B,@!WWN6#64`(z#R18/!"'5:"pY,4!=&T+!WW3$$NL>;$NL/,zzz!!!!"zzzzzzzzzz!!!$"zzzz +#Qt,<%L3"="onr9%g)e?!=&T/$31,.!"K&1":l"Fz!XAi/"T\f-$j?\Cz!MF!WWN6 +#64`(z!=Jl-#6>&0"pY,4!=&T+!WWT/!!!<-#64`(zz!!*'"zzzzz!!!B2!!!!#!8C$ipP4"p"`1#QXr3!I"p"u;%KQnA$ipG6!=K);!zzzzzzzzzzzzzzzzzzz!!!!"zzzzzzzzzz!!!$"zzzzzzzzzzz +zzzz!!!H/!GPK)ZTjGM6zzzzzz!!!!>+X-mdz!?IRzzzzzzzzzzzzzzz!#lXd!>J7!*F!!zzzzzzzzzzzz -zzzzzzz!&"?R!'dY%(!!!$#!B+e!>G5zzzzzzzzzzzz+TVTE.kD84zzzzz*%_0l!'`e=9!ke:zzzzzzzz +zzzzzzzzzzzzzzzzzzzzzzzzzz1]]Hl2`NcW3]d!5z$NU5-!"TD:!!3T6!!!36!=&T/#QPA9#ljr*zzzz +!6!!Wr7#65#6!!30)zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!!!" +zzzzz!!!6*z"pP&0!!3?)"qCb9!sS`3#R:hJ$NUA3"onW'!"'5>%L!@Q$kE@=%LWF@!!WoA"T\T* +"on`3!"K25":bS?%L*:A$jR7H#n6k=!=&f=$j[(&0#QXr3%fcS0zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!*'"zzzzz +#QtPG!=o\N!X&K)"oo/@!!!9/!!W]5#QOi)!!3?)!!!E.z%gW.C!<<*(%KQP?#QP55!!33%#RLJ< +%fd+I!!!9/$NU5-!Y#J?!!!K>!"Ar6zz$NU5-!"TD:!!3--%hAjL!=&T/#R:\Azzzzz!!*'"zzzzz +!!!$"zzzzzzzzzzzzzz!!**#zzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!<<*"zzzzz!!!<6"9SZ+%h8XD +!"T>8%gi::"pb2:!=Su/!!!!0#QOi)!"'5:$NUV9! +#65#6"Tn`)zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!!!"zzzzz!!WT,!Y#YM!"9;H#6G)0%gi:: +#R185#R1A2!!!!#"onW'$ipJ2!!!N8!"/f-!t>bA!"T>8$NU54%KQY:!"'5:"pt>1#R1Y;!!!'% +$3gJ1$4d+B!t>51z!!!B-!!!!0$31&-!!W]<":"r4!!W]/"p4i*zzzz!!!!"zzzzzz!<<*"zzzzzzzz +zzzzzz!<<*"zzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!!$"zzzzz!!!!-#lkJG#6>5A%1WUR#QPAB +!!!3/!"/f9!<`B&!"T>8!!!!/%fct<$NUA1!!!N8!"/f-!!Wc:!!*H-$4?h6#RLb:!!*H-%gi at I +!!!'%!"/l0$ig8-z!!!!$%1`I>!Wi?%!Wi?,%LE=F!!!92#QOi)z!!W]/!!!'%!!!'#"pbY@#6>&0 +#R18<#ljr*zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!*'"zzzz!!!6*!!!'0%h8dO!!6!=Su6"p"].$3151"9K)6!!!!/%fct<%gNRK$NUY@ +%LW=F#7M(F!Xo;D"onW'z$NU5-!"TD:!!3-'%KZV8!=&T/#QOi,%0-A.zzzz!!*'"zzzzz!!!$#zzzz +zzzzzzzzzz!!!$"zzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!<<*"zzzzz!!i]-%h8gF"q(D5"V1\8 +"pt>1"pt>3!<6!<`Z."Tnl.%fcq?!!!04!WW3$"on`0 +%fm%@$4 at 7D!!ru;zz#6>&6!<%fl\A#Qau+!"T)2!=&f0!$P!1E#7LV8"T\u9$3:S:!t,S>!tPD5#QXr3!X\r=#QXr2%06t>!"')6!"TP?!WW3% +!/u6,9m3izzz!!!$"zzzzzzzzzzzzzzzzz!<<*"zzzzzzzzzzzzzzzzzzzzzzzzzzzz -zzzzzzzzzz!4!!*B+#mCh>zzzzzzzzzzzzzz -zzzzz!!*'"zzzzz$NgD3$O at 4B!!!!#"UbPB!!E]1%flb?!!30-!!E<-#mCP8!=];8#64`(!!`N6 -$OdLF!!"T)1"T\]5"9Al>!=/o6%Kle9!WWT3"98c0#6t86!!E<.#mCA8$k*+=!=8u5 -$NL/,z!!!$#!8z"UG)8 -#7(>8"9AZ-!!!0,!!30-#6>8A$k<7<#ljr*!!!?5!!E,2!!WH*":P81$3gJ1 -#6>,2#lt85%fcS0!!iT1z%Kuh4!!!!"#lk53#6YG<#lt#+!=8`3!=&T-"T\r1!!E]1!"K/4!!iT, -#6>)1!!NK-$ig8/!,@"TSN&!!!$+z%06M1!!*35"Ub;1!!!$+!!iT1 -!!!62"TSZ6!!!$+!!!!+"pt>1#lt#+!W`?'"onW+"TSo4#lt>4zz!!!B8%g!.B!!E]1!!!$+!!!N3 -#mL_:!"/r7"98E%z!!!!"#ljr*#lt82#7:G2"UknA!!*B+!!*B+%06S3zzzzzzzzzzzzzzzzzzz -!!*'"zzzzz!!!B6!!!!+"pb52$31;7#Qt;4#m1\ke:z! -'*/^G!!!$#!,;3!?IRzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!%@pL!YY8 -!PS7zzzz)Z]s?!,;3z!!!$#!Z7Izzzzzzzzzzzzzzzzzzz +zzzzz-ij>p0.7h at zzzz&/>3H!'GV>`!>l at Jzzzzzzzzzzzzzzzzzzzzzzz +!%9E`)uos=zzzz!"fhE5X>DO!5tEzzzzzzzzzzzzzzzzzzzzz -zzzzzzz!%@pL+Z18?zzzzz!#QCN!#eX&ek?[*<6'>zzz -zzzzzzzzzzzzzzzzzzzzzzzz&N1jm-ia5Izzzzz!#H:L'K.oO!!t,)/z!!!'$#64`(zzz!!!!,$jcn6z -!!!B-#ljr*zzzz!!!!,$jcn6z!!!N:zzzzzz!!!9*#64`("q1J3#n-h?!!!!)$ipS5#QY/1!"989zzz -zz!2$jlt7!!!!)!=&T) -!!Wi3!!rc:$31&+$4-_,7"pk;=!!!$+!!3<0!"/l/"q1P<$jlt= -!t,A8"oo/7#71S7zz#QXr,!:#lkD8#6YGA!!!!%$ig8. -#ljr0%fcn=!!Wc1!!E<1!<`B&%KQqF!s9&6zz!!iT1!!!!'$ig86":G57!!Wlz!=8`3 -!=&u>!=T56":P81!=8`+!W`N5$NLA,2!!rZ2!!iT8zz!!!9*#64`("q1J3#m:54"U>,0 -#QY/1#QY/9!=f)0zzzzz!!!$"zzzzzz!!!!"zzzzzzzzzzzzzzzzz!!*'"zzzzzzzzzzzzzzzzzzzzz -zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz -zzzzzzzz!!*'"z!!!!"!<<*"zz!"BD8!!!-*!"/l8!=8`+z -!!!!)!=&T)!!Wi3!!rc.!W`]4!!iT1!!iT1!"K#2zzzzz!!!!"zzzzzzz!<<*"zzzzzzzzzzzzzzzz -!!!$#zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz -zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!!$"zz!!**#zz!"0,6!!!?1#QXu6#64i/#QY26%Kuh4 -$NU_F!s&E.!8#6>&0"pb2:!=Su/!!!!0#QOi)!"'5:$NUV9!59!W`H8#QP)1#64r6!"/f9!<`B&!"T>8!!!!/%fct<$NUA1!!!N8!"/f-!!Wc:!!*H-$4?h6 +#RLb:!!*H-%gi at I!!!'%!"/l0$ig8-z!!*H-!!`N0!!WZ.%L*+;!Wi?0!<3!<6!<`Z."Tnl.%fcq?!!!04 +!WW3$"on`0%fm%@$4 at 7D!!ru;z!!!!"$NL/3!=&T/#64r/#64f,!"/f-!!r`4zzzz!!!$"zzzzz +!!!!"!<<*"zzzzzzzzzzzzz!!!!"zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz +zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!!$"zz!<<*"z!!!32 +!!!-(!$P!1E#7LV8"T\u9$3:S:!t,S>!tPD5#QXr3!X\r=#QXr2 +%06t>!"')6!"TP?!WW3%! +zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz +!!!~> Q cleartomark end end pagesave restore showpage %%PageTrailer @@ -14990,30 +13577,36 @@ %%EOF %%EndDocument - @endspecial 7850 5527 V -56 5534 7913 7 v 821 5869 a -Fj(Figure)60 b(8:)80 b Fm(CBU)54 b(graphs)j(of)e(doubly)h(link)-5 + @endspecial 8466 4601 V -240 4608 8713 7 v 821 4943 +a Fj(Figure)60 b(8:)80 b Fm(CBU)54 b(graphs)j(of)e(doubly)h(link)-5 b(ed)56 b(lists)g(of)f(c)-5 b(hangridb)5 b(o)-5 b(x)56 b(and)g(densit)-5 b(yb)5 b(o)-5 b(x)56 b(in)g(t)-5 b(w)g(olf)-240 -6419 y Fj(L=0)-240 6693 y(No)61 b(lo)5 b(cal)59 b(SDSis)h(found.)-240 -6967 y(K=)h(5)-240 7241 y(The)g(net)-5 b(w)g(ork)60 b(SDSI)g(has)h(2)f -(no)5 b(des)60 b(whereas)h(the)f(bask)-5 b(et)59 b(SDSI)i(has)f(3)g(no) -5 b(des)60 b(in)h(it.)-240 7515 y(I=0)-240 7789 y(No)g(SDSIs)f(had)g +5493 y Fj(to)67 b(b)5 b(oth)68 b(b)-5 b(y)67 b(the)h(no)5 +b(de)67 b(sub-structure)g(and)g(the)h(net)-5 b(w)g(ork)67 +b(data)g(structure.)101 b(Though)68 b(this)f(example)f(sho)-5 +b(ws)68 b(DSA's)-240 5767 y(strength)60 b(of)h(b)5 b(eing)61 +b(\014eld-sensitiv)-5 b(e)58 b(it)i(also)h(presen)-5 +b(ts)60 b(one)h(of)g(its)f(w)-5 b(eaknesses.)82 b(Due)61 +b(to)g(the)g("uni\014cation")e(prop)5 b(ert)-5 b(y)-240 +6041 y(of)53 b(the)g(DSA)h(t)-5 b(w)g(o)53 b(distinct)f(instances)g(of) +h(the)g("arc")g(structure)g(\(net)g Fi(!)g Fj(arcs)g(and)h(net)f +Fi(!)g Fj(dumm)-5 b(y-arcs\))52 b(are)h(sho)-5 b(w)g(ed)-240 +6315 y(as)60 b(one)h(no)5 b(de)60 b(in)g(the)g(\014gure.)-240 +6588 y(G=2)-240 6862 y(Both)g(the)g(SDSIs)g(are)h(correctly)e(depicted) +g(as)i(b)5 b(eing)60 b(global.)-240 7136 y(L=0)-240 7410 +y(No)h(lo)5 b(cal)59 b(SDSis)h(found.)-240 7684 y(K=)h(5)-240 +7958 y(The)g(net)-5 b(w)g(ork)60 b(SDSI)g(has)h(2)f(no)5 +b(des)60 b(whereas)h(the)f(bask)-5 b(et)59 b(SDSI)i(has)f(3)g(no)5 +b(des)60 b(in)h(it.)-240 8232 y(I=0)-240 8506 y(No)g(SDSIs)f(had)g (greater)g(than)h(1)f(disjoin)-5 b(t)59 b(instances)g(in)h(the)g(same)f -(function.)-240 8062 y(O=0)-240 8336 y(No)i(Collapsed)e(no)5 -b(des.)-240 8610 y(C=)61 b(2)-240 8884 y(There)68 b(are)g(t)-5 +(function.)-240 8780 y(O=0)-240 9054 y(No)i(Collapsed)e(no)5 +b(des.)-240 9328 y(C=)61 b(2)-240 9602 y(There)68 b(are)g(t)-5 b(w)g(o)68 b(no)5 b(des)67 b(whic)-5 b(h)68 b(form)f(a)h(self)e(cycle)h (and)h(hence)g(are)g(a)f(part)h(of)g(t)-5 b(w)g(o)68 -b(distinct)d(collections.)100 b(Both)67 b(the)-240 9158 +b(distinct)d(collections.)100 b(Both)67 b(the)-240 9875 y(no)5 b(de)60 b(and)h(arc)f(structure)g(are)h(link)-5 b(ed)59 b(lists)g(and)h(hence)h(are)f(sho)-5 b(wn)61 -b(as)f(self)f(lo)5 b(ops)60 b(b)-5 b(y)60 b(the)g(DSA.)-240 -10069 y Fk(8)269 b(Results)89 b(for)i(197.parser-b)-240 -10523 y Ff(Summary:)42 10796 y Fj(197.parser)68 b(is)g(a)h(part)g(of)f -(SPEC)h(CPU2000)f(b)5 b(enc)-5 b(hmark.)105 b(This)68 -b(link)g(grammar)g(parser)g(is)g(a)h(syn)-5 b(tactic)67 -b(parser)-240 11070 y(of)i(English,)g(based)g(on)h(link)e(grammar,)i -(an)f(original)f(theory)h(of)g(English)f(syn)-5 b(tax.)106 -b(The)69 b(co)5 b(de)69 b(is)g(written)g(in)g(ANSI)3809 +b(as)f(self)f(lo)5 b(ops)60 b(b)-5 b(y)60 b(the)g(DSA.)3809 11672 y(16)p eop end %%Page: 17 17 TeXDict begin 17 16 bop 10 -99 7780 7 v 10 4967 7 5067 @@ -39122,67 +37715,61 @@ %%EndDocument @endspecial 7783 4967 V 10 4974 7780 7 v 1261 5309 a Fj(Figure)59 b(9:)80 b Fm(DSA)55 b(Graph)i(for)e(the)g(main)h(function) -f(after)g(complete)g(BU)f(analysis)-240 5859 y Fj(C.)60 -b(181.mcf)e(has)i(a)g(ra)-5 b(w)61 b(LOC)f(of)g(11391)g(with)g(a)g -(total)f(of)g(10086)h(memory)f(instructions)f(in)i(LL)-20 -b(VM)59 b(represen)-5 b(tation.)-240 6133 y(The)69 b(parser)f(b)5 +f(after)g(complete)g(BU)f(analysis)-240 5859 y Fk(8)269 +b(Results)89 b(for)i(197.parser-b)-240 6313 y Ff(Summary:)42 +6587 y Fj(197.parser)68 b(is)g(a)h(part)g(of)f(SPEC)h(CPU2000)f(b)5 +b(enc)-5 b(hmark.)105 b(This)68 b(link)g(grammar)g(parser)g(is)g(a)h +(syn)-5 b(tactic)67 b(parser)-240 6861 y(of)i(English,)g(based)g(on)h +(link)e(grammar,)i(an)f(original)f(theory)h(of)g(English)f(syn)-5 +b(tax.)106 b(The)69 b(co)5 b(de)69 b(is)g(written)g(in)g(ANSI)-240 +7135 y(C.)60 b(181.mcf)e(has)i(a)g(ra)-5 b(w)61 b(LOC)f(of)g(11391)g +(with)g(a)g(total)f(of)g(10086)h(memory)f(instructions)f(in)i(LL)-20 +b(VM)59 b(represen)-5 b(tation.)-240 7409 y(The)69 b(parser)f(b)5 b(enc)-5 b(hmark)68 b(used)g(a)h(custom)e(memory)g(allo)5 b(cator)68 b(to)g(handle)g(its)f(memory)h(op)5 b(erations)67 -b(\()h(mallo)5 b(c)67 b(and)-240 6407 y(free\).)79 b(These)61 +b(\()h(mallo)5 b(c)67 b(and)-240 7683 y(free\).)79 b(These)61 b(custom)e(memory)g(allo)5 b(cators)59 b(w)-5 b(ere)61 b(o)-5 b(v)g(erridden)60 b(so)g(that)g(mallo)5 b(c)59 -b(and)h(free)g(get)g(used.)42 6681 y Ff(Data)70 b(Structures:)42 -6955 y Fj(Some)60 b(of)g(the)g(imp)5 b(ortan)-5 b(t)59 +b(and)h(free)g(get)g(used.)42 7957 y Ff(Data)70 b(Structures:)42 +8231 y Fj(Some)60 b(of)g(the)g(imp)5 b(ortan)-5 b(t)59 b(structures)h(in)g(this)g(b)5 b(enc)-5 b(hmark:)-240 -7229 y(a\).)80 b(c)p 145 7229 55 7 v 65 w(list)p 455 -7229 V 64 w(struct**)60 b(:)80 b(This)60 b(structure)g(as)g(sho)-5 +8505 y(a\).)80 b(c)p 145 8505 55 7 v 65 w(list)p 455 +8505 V 64 w(struct**)60 b(:)80 b(This)60 b(structure)g(as)g(sho)-5 b(wn)61 b(in)f(Figure)g(10)g(is)g(an)h(arra)-5 b(y)60 b(of)h(p)5 b(oin)-5 b(ters)59 b(to)h(arra)-5 b(y)61 b(of)f(c)p -7160 7229 V 65 w(list)p 7470 7229 V 64 w(struct.)-240 -7503 y(The)66 b(c)p 231 7503 V 66 w(list)p 542 7503 V +7160 8505 V 65 w(list)p 7470 8505 V 64 w(struct.)-240 +8779 y(The)66 b(c)p 231 8779 V 66 w(list)p 542 8779 V 63 w(struct)g(is)f(also)g(clearly)g(iden)-5 b(ti\014ed)65 b(in)g(the)h(\014gure)g(as)g(b)5 b(eing)65 b(a)i(link)-5 b(ed)64 b(list)h(with)h(a)g(p)5 b(oin)-5 b(ter)65 b(to)h(a)g(connec-) --240 7777 y(tor)p 4 7777 V 65 w(struct.)76 b(Again)48 +-240 9053 y(tor)p 4 9053 V 65 w(struct.)76 b(Again)48 b(the)f(p)5 b(o)-5 b(w)g(er)49 b(that)e(DSA)i(has)f(due)g(to)g(its)f (inheren)-5 b(t)47 b(\014eld)h(sensitivit)-5 b(y)45 b(prop)5 b(ert)-5 b(y)48 b(helps)f(us)h(to)g(iden)-5 b(tify)-240 -8051 y(the)60 b(di\013ern)-5 b(t)60 b(p)5 b(oin)-5 b(ter)60 -b(\014elds)f(in)i(the)f(structure.)-240 8325 y(b\).)112 +9327 y(the)60 b(di\013ern)-5 b(t)60 b(p)5 b(oin)-5 b(ter)60 +b(\014elds)f(in)i(the)f(structure.)-240 9600 y(b\).)112 b(Disjunct)69 b(Struct)i(:)101 b(This)71 b(structure)f(as)h(sho)-5 b(wn)71 b(in)g(Figure)f(11)h(is)g(a)g(simple)e(link)-5 b(ed)70 b(list)g(with)h(p)5 b(oin)-5 b(ters)70 b(to)g(the)-240 -8599 y(Connector)60 b(Struct.)80 b(Again)60 b(DSA's)g(\014eld)g +9874 y(Connector)60 b(Struct.)80 b(Again)60 b(DSA's)g(\014eld)g (sensitivit)-5 b(y)58 b(comes)h(in)-5 b(to)60 b(picture.)-240 -8873 y(c\).)135 b(Matc)-5 b(h)p 615 8873 V 65 w(No)5 -b(de)p 1094 8873 V 65 w(struct)79 b(**)f(:)118 b(This)78 +10148 y(c\).)135 b(Matc)-5 b(h)p 615 10148 V 65 w(No)5 +b(de)p 1094 10148 V 65 w(struct)79 b(**)f(:)118 b(This)78 b(structure)g(as)h(sho)-5 b(wn)79 b(in)g(Figure)f(12)h(is)f(an)h(arra) -5 b(y)79 b(of)g(p)5 b(oin)-5 b(ters)78 b(to)g(arra)-5 -b(y)80 b(of)-240 9146 y(Matc)-5 b(h)p 277 9146 V 65 w(No)5 -b(de)p 756 9146 V 65 w(struct.)100 b(The)68 b(Matc)-5 -b(h)p 2326 9146 V 64 w(No)5 b(de)p 2804 9146 V 66 w(struct)67 +b(y)80 b(of)-240 10422 y(Matc)-5 b(h)p 277 10422 V 65 +w(No)5 b(de)p 756 10422 V 65 w(struct.)100 b(The)68 b(Matc)-5 +b(h)p 2326 10422 V 64 w(No)5 b(de)p 2804 10422 V 66 w(struct)67 b(is)f(also)h(clearly)f(iden)-5 b(ti\014ed)66 b(as)h(a)g(link)-5 -b(ed)66 b(list,)i(again)e(due)i(to)f(\014eld)-240 9420 -y(sensitiv)-5 b(e)58 b(DSA)j(algorithm.)-240 9694 y(d\))f(W)-15 -b(ord)p 438 9694 V 66 w(File)p 806 9694 V 64 w(Struct)60 +b(ed)66 b(list,)i(again)e(due)i(to)f(\014eld)-240 10696 +y(sensitiv)-5 b(e)58 b(DSA)j(algorithm.)-240 10970 y(d\))f(W)-15 +b(ord)p 438 10970 V 66 w(File)p 806 10970 V 64 w(Struct)60 b(:)80 b(This)60 b(is)g(a)g(Global)g(structure)f(and)i(is)f(clearly)f -(mark)-5 b(ed)60 b(G)g(in)g(the)h(Figure)e(11.)42 10242 -y(As)86 b(sho)-5 b(wn)85 b(in)g(all)g(\014gures)g(ab)5 -b(o)-5 b(v)g(e)85 b(the)g(DSA)h(algorithm)e(clearly)g(iden)-5 -b(ti\014es)83 b(the)i(lo)5 b(cal)85 b(and)g(the)g(global)f(data)-240 -10516 y(structures)45 b(in)g(the)h(b)5 b(enc)-5 b(hmark.)75 -b(This)45 b(b)5 b(enc)-5 b(hmark)46 b(had)g(a)f(go)5 -b(o)g(d)46 b(n)-5 b(um)g(b)5 b(er)46 b(of)f(b)5 b(oth)46 -b(global)f(and)h(lo)5 b(cal)45 b(data)g(structures)-240 -10790 y(and)72 b(DSA)h(comes)e(out)g(true)h(in)g(all)f(the)h(cases)f -(iden)-5 b(tifying)70 b(the)i(correct)f(scop)5 b(e)72 -b(of)g(all)f(the)h(data)f(structures.)114 b(This)-240 -11064 y(strength)60 b(of)g(DSA)h(is)e(due)i(to)f(its)g(strong)g(escap)5 -b(e)59 b(analysis)g(c)-5 b(haracteristic.)3809 11672 +(mark)-5 b(ed)60 b(G)g(in)g(the)h(Figure)e(11.)3809 11672 y(17)p eop end %%Page: 18 18 -TeXDict begin 18 17 bop -140 -99 8080 7 v -140 4967 7 -5067 v -83 4917 a @beginspecial 89 @llx 422 @lly 567 +TeXDict begin 18 17 bop -140 283 8080 7 v -140 5349 7 +5067 v -83 5299 a @beginspecial 89 @llx 422 @lly 567 @urx 720 @ury 4780 @rwi @setspecial %%BeginDocument: Figures/parser_fig7.ps %!PS-Adobe-3.0 @@ -56048,47 +54635,52 @@ %%EOF %%EndDocument - @endspecial 7933 4967 V -140 4974 8080 7 v 2165 5309 + @endspecial 7933 5349 V -140 5356 8080 7 v 2165 5691 a Fj(Figure)60 b(10:)80 b Fm(CBU)55 b(graph)h(for)f(one)g(of)g(the)g -(functions)42 5859 y Fj(As)65 b(sho)-5 b(wn)64 b(in)h(Figure)e(11)i -(and)f(Figure)g(13)g(the)h(DSA)f(correctly)g(iden)-5 -b(ti\014es)63 b(the)h(disjoin)-5 b(t)62 b(instances)h(of)h(the)g(Con-) --240 6133 y(nector)i(struct.)96 b(Also)66 b(w)-5 b(e)67 -b(see)e(in)h(Figure)f(12)i(disjoin)-5 b(t)64 b(instances)g(of)i(Matc)-5 -b(h)p 5139 6133 55 7 v 65 w(No)5 b(de)66 b(structure.)97 -b(These)66 b(all)f(sho)-5 b(w)g(case)-240 6407 y(one)58 -b(of)g(man)-5 b(y)57 b(DSA's)h(strength.)79 b(The)58 -b(reason)g(b)5 b(ehind)58 b(DSA)g(iden)-5 b(tifying)56 -b(these)h(disjoin)-5 b(t)57 b(structures)g(is)g(the)h(con)-5 -b(text)-240 6681 y(sensitivit)g(y)58 b(of)i(the)g(DSA)h(algorithm.)42 -6955 y(Figure)77 b(13)g(is)g(a)g(v)-5 b(ery)77 b(go)5 +(functions)42 6200 y Fj(As)86 b(sho)-5 b(wn)85 b(in)g(all)g(\014gures)g +(ab)5 b(o)-5 b(v)g(e)85 b(the)g(DSA)h(algorithm)e(clearly)g(iden)-5 +b(ti\014es)83 b(the)i(lo)5 b(cal)85 b(and)g(the)g(global)f(data)-240 +6474 y(structures)45 b(in)g(the)h(b)5 b(enc)-5 b(hmark.)75 +b(This)45 b(b)5 b(enc)-5 b(hmark)46 b(had)g(a)f(go)5 +b(o)g(d)46 b(n)-5 b(um)g(b)5 b(er)46 b(of)f(b)5 b(oth)46 +b(global)f(and)h(lo)5 b(cal)45 b(data)g(structures)-240 +6748 y(and)72 b(DSA)h(comes)e(out)g(true)h(in)g(all)f(the)h(cases)f +(iden)-5 b(tifying)70 b(the)i(correct)f(scop)5 b(e)72 +b(of)g(all)f(the)h(data)f(structures.)114 b(This)-240 +7022 y(strength)60 b(of)g(DSA)h(is)e(due)i(to)f(its)g(strong)g(escap)5 +b(e)59 b(analysis)g(c)-5 b(haracteristic.)42 7295 y(As)65 +b(sho)-5 b(wn)64 b(in)h(Figure)e(11)i(and)f(Figure)g(13)g(the)h(DSA)f +(correctly)g(iden)-5 b(ti\014es)63 b(the)h(disjoin)-5 +b(t)62 b(instances)h(of)h(the)g(Con-)-240 7569 y(nector)i(struct.)96 +b(Also)66 b(w)-5 b(e)67 b(see)e(in)h(Figure)f(12)i(disjoin)-5 +b(t)64 b(instances)g(of)i(Matc)-5 b(h)p 5139 7569 55 +7 v 65 w(No)5 b(de)66 b(structure.)97 b(These)66 b(all)f(sho)-5 +b(w)g(case)-240 7843 y(one)58 b(of)g(man)-5 b(y)57 b(DSA's)h(strength.) +79 b(The)58 b(reason)g(b)5 b(ehind)58 b(DSA)g(iden)-5 +b(tifying)56 b(these)h(disjoin)-5 b(t)57 b(structures)g(is)g(the)h(con) +-5 b(text)-240 8117 y(sensitivit)g(y)58 b(of)i(the)g(DSA)h(algorithm.) +42 8391 y(Figure)77 b(13)g(is)g(a)g(v)-5 b(ery)77 b(go)5 b(o)g(d)78 b(example)d(demonstrating)h(the)h(p)5 b(o)-5 b(w)g(er)77 b(of)g(DSA.)g(Not)h(only)f(do)5 b(es)76 b(it)h(iden)-5 -b(tify)75 b(the)-240 7229 y(correct)50 b(structure)g(hierarc)-5 +b(tify)75 b(the)-240 8665 y(correct)50 b(structure)g(hierarc)-5 b(h)g(y)50 b(but)h(it)f(also)f(iden)-5 b(ti\014es)49 b(the)h(distinct)f(instances)g(of)h(the)g(Connector)h(substructure.)76 -b(The)-240 7503 y(Disjunct)52 b(structure)i(and)g(its)f(substructure)g +b(The)-240 8939 y(Disjunct)52 b(structure)i(and)g(its)f(substructure)g (do)h(not)g(escap)5 b(e)53 b(out)h(of)f(this)g(function,)h(build)p -6066 7503 V 64 w(sen)-5 b(tence)p 6794 7503 V 64 w(disjuncts\(\))52 -b(and)-240 7777 y(this)60 b(is)f(correctly)h(depicted)f(b)-5 +6066 8939 V 64 w(sen)-5 b(tence)p 6794 8939 V 64 w(disjuncts\(\))52 +b(and)-240 9213 y(this)60 b(is)f(correctly)h(depicted)f(b)-5 b(y)61 b(the)f(absence)g(of)g(the)g('I')f(\(Incomplete\))f(\015ag)i(in) -g(the)g(no)5 b(des.)42 8325 y(197.parser)55 b(is)f(a)i(v)-5 +g(the)g(no)5 b(des.)42 9761 y(197.parser)55 b(is)f(a)i(v)-5 b(ery)55 b(go)5 b(o)g(d)55 b(b)5 b(enc)-5 b(hmark)55 b(to)g(sho)-5 b(w)g(case)54 b(the)h(actual)f(p)5 b(o)-5 b(w)g(er)56 b(of)f(DSA.)g(It)f(has)h(man)-5 b(y)55 b(distinct)e(data) --240 8599 y(structures)60 b(with)g(v)-10 b(arying)60 -b(lifetimes.)42 8873 y Ff(Metrics:)42 9146 y Fj(DSA)70 +-240 10035 y(structures)60 b(with)g(v)-10 b(arying)60 +b(lifetimes.)42 10309 y Ff(Metrics:)42 10582 y Fj(DSA)70 b(has)g(some)f(go)5 b(o)g(d)69 b(results)g(for)g(the)g(197.parser)g(b)5 b(enc)-5 b(hmark,)71 b(sp)5 b(ecially)68 b(b)5 b(ecause)69 b(it)g(has)g(large)g(n)-5 b(um)g(b)5 b(er)70 b(of)-240 -9420 y(data)60 b(structures)g(and)g(most)g(of)g(its)f(instances)g(turn) -i(out)f(to)g(b)5 b(e)61 b(disjoin)-5 b(t.)-240 9968 y(N=40)-240 -10242 y(Large)70 b(n)-5 b(um)g(b)5 b(er)69 b(of)h(data)g(structures)f -(are)h(presen)-5 b(t)69 b(in)h(the)g(co)5 b(de.)108 b(Some)69 -b(of)h(the)g(data)f(structures)h(w)-5 b(ere)70 b(men)-5 -b(tioned)-240 10516 y(ab)5 b(o)-5 b(v)g(e)-240 10790 -y(G=20)-240 11064 y(All)60 b(of)g(the)g(global)g(SDSIs)f(w)-5 -b(ere)61 b(allo)5 b(cated)59 b(in)h(the)g(main\(\))f(function.)3809 +10856 y(data)60 b(structures)g(and)g(most)g(of)g(its)f(instances)g +(turn)i(out)f(to)g(b)5 b(e)61 b(disjoin)-5 b(t.)3809 11672 y(18)p eop end %%Page: 19 19 TeXDict begin 19 18 bop 235 -99 7330 7 v 235 3417 7 3517 @@ -69450,52 +68042,37 @@ @endspecial 7558 3417 V 235 3424 7330 7 v 2007 3759 a Fj(Figure)60 b(11:)80 b Fm(CBU)55 b(graph)h(for)f(free)g(sen)-5 b(tence)p 4971 3759 50 7 v 59 w(disjuncts\(\))-240 4316 -y Fj(L=20)-240 4590 y(Half)47 b(of)g(the)h(SDSIs)f(w)-5 +y Fj(N=40)-240 4590 y(Large)70 b(n)-5 b(um)g(b)5 b(er)69 +b(of)h(data)g(structures)f(are)h(presen)-5 b(t)69 b(in)h(the)g(co)5 +b(de.)108 b(Some)69 b(of)h(the)g(data)f(structures)h(w)-5 +b(ere)70 b(men)-5 b(tioned)-240 4863 y(ab)5 b(o)-5 b(v)g(e)-240 +5137 y(G=20)-240 5411 y(All)60 b(of)g(the)g(global)g(SDSIs)f(w)-5 +b(ere)61 b(allo)5 b(cated)59 b(in)h(the)g(main\(\))f(function.)-240 +5685 y(L=20)-240 5959 y(Half)47 b(of)g(the)h(SDSIs)f(w)-5 b(ere)47 b(lo)5 b(cal)47 b(to)g(the)g(function)g(w)-5 b(ere)48 b(they)f(w)-5 b(ere)48 b(initialized.)72 b(All)47 b(of)h(the)f(data)g(structures)g(allo)5 b(cated)-240 -4863 y(outside)67 b(main\(\))g(are)h(lo)5 b(cal)67 b(and)h(DSA)g(sho)-5 +6233 y(outside)67 b(main\(\))g(are)h(lo)5 b(cal)67 b(and)h(DSA)g(sho)-5 b(ws)68 b(them)f(to)h(b)5 b(e)68 b(lo)5 b(cal.)102 b(Examples)67 b(of)g(suc)-5 b(h)68 b(kind)g(ha)-5 b(v)g(e)68 b(b)5 -b(een)68 b(discussed)-240 5137 y(ab)5 b(o)-5 b(v)g(e.)-240 -5411 y(K=105)-240 5685 y(197.parser)60 b(had)g(quite)g(a)g(large)g(no)h -(of)f(heap)g(allo)5 b(cated)59 b(no)5 b(des.)-240 5959 -y(I=)61 b(53)-240 6233 y(As)k(sho)-5 b(wn)65 b(in)g(Fig)f(5)i(,)f +b(een)68 b(discussed)-240 6507 y(ab)5 b(o)-5 b(v)g(e.)-240 +6781 y(K=105)-240 7055 y(197.parser)60 b(had)g(quite)g(a)g(large)g(no)h +(of)f(heap)g(allo)5 b(cated)59 b(no)5 b(des.)-240 7329 +y(I=)61 b(53)-240 7603 y(As)k(sho)-5 b(wn)65 b(in)g(Fig)f(5)i(,)f (there)g(w)-5 b(ere)65 b(in)g(total)f(53)h(disjoin)-5 b(t)63 b(data)i(structures)f(iden)-5 b(ti\014ed)64 b(in)g(the)h(co)5 -b(de.)94 b(Some)64 b(disjoin)-5 b(t)-240 6507 y(instances)59 +b(de.)94 b(Some)64 b(disjoin)-5 b(t)-240 7877 y(instances)59 b(ha)-5 b(v)g(e)60 b(b)5 b(een)60 b(discussed)f(ab)5 -b(o)-5 b(v)g(e.)-240 6781 y(O=)61 b(3)-240 7055 y(Though)50 +b(o)-5 b(v)g(e.)-240 8150 y(O=)61 b(3)-240 8424 y(Though)50 b(there)g(w)-5 b(ere)51 b(all)e(these)g(go)5 b(o)g(d)50 b(results,)h(DSA)f(could)g(not)g(iden)-5 b(tify)48 b(the)i(t)-5 b(yp)5 b(e)49 b(of)h(some)f(no)5 b(des)50 b(and)g(\014nally)f(there) --240 7329 y(w)-5 b(ere)61 b(also)e(3)i(collapsed)e(no)5 +-240 8698 y(w)-5 b(ere)61 b(also)e(3)i(collapsed)e(no)5 b(des)60 b(\014nally)-15 b(.)79 b(See)60 b(Figure)g(14.)42 -7877 y(C=)i(55)-240 8150 y(There)f(a)f(large)g(no)h(of)f(no)5 +9246 y(C=)i(55)-240 9520 y(There)f(a)f(large)g(no)h(of)f(no)5 b(des)60 b(whic)-5 b(h)60 b(form)g(a)g(completely)f(connected)g -(structure)h(or)h(is)e(a)i(part)f(of)g(self)g(cycle.)-240 -8787 y Fk(9)269 b(Results)89 b(for)i(eon)-240 9249 y -Fg(9.1)225 b(Summary:)-240 9640 y Fj(252.eon)75 b(is)h(a)g -(probabilistic)d(ra)-5 b(y)76 b(tracer,)k(and)c(is)f(part)h(of)g(SPEC)g -(In)-5 b(t)76 b(2000.)126 b(A)77 b(ra)-5 b(y)76 b(tracer)g(is)f(a)i -(program)e(whic)-5 b(h)-240 9914 y(renders)51 b(three)g(dimensional)e -(images)h(b)-5 b(y)51 b(dra)-5 b(wing)51 b(ra)-5 b(ys)51 -b(from)g(the)g("camera")f(and)h(computing)f(in)-5 b(tersections)49 -b(to)i(\014nd)-240 10188 y(the)68 b(sp)5 b(eci\014c)67 -b(color)h(to)h(mak)-5 b(e)67 b(eac)-5 b(h)68 b(giv)-5 -b(en)68 b(pixel)g(in)g(the)g(image.)103 b(A)69 b(probabilistic)d(ra)-5 -b(y)68 b(tracer)h(is)e(one)i(in)f(whic)-5 b(h)68 b(ra)-5 -b(y)-240 10462 y(direction)51 b(is)h(determined)f(randomly)-15 -b(.)77 b(The)53 b(implications)c(of)k(this,)f(for)h(this)f(particular)f -(b)5 b(enc)-5 b(hmark,)53 b(is)f(that)g(there)h(is)-240 -10736 y(less)58 b(memory)g(lo)5 b(calit)-5 b(y)57 b(b)5 -b(ecause)59 b(v)-10 b(astly)58 b(di\013eren)-5 b(t)58 -b(areas)h(of)g(the)g(scene)f(graph)h(\(the)g(structure)f(whic)-5 -b(h)59 b(organizes)f(the)-240 11010 y(ob)10 b(jects)63 -b(in)h(the)g(scene)f(and)h(pro)-5 b(vides)64 b(a)g(space)g(partition)f -(to)h(limit)e(the)h(n)-5 b(um)g(b)5 b(er)64 b(of)g(computed)f(in)-5 -b(tersections\))62 b(ma)-5 b(y)3809 11672 y(19)p eop -end +(structure)h(or)h(is)e(a)i(part)f(of)g(self)g(cycle.)3809 +11672 y(19)p eop end %%Page: 20 20 TeXDict begin 20 19 bop 2 -99 7797 7 v 2 6467 7 6567 v 58 6417 a @beginspecial 89 @llx 332 @lly 550 @urx 720 @@ -85720,44 +84297,41 @@ %%EndDocument @endspecial 7791 6467 V 2 6474 7797 7 v 2161 6809 a Fj(Figure)60 b(12:)80 b Fm(CBU)54 b(graph)i(for)f(conjunction)p -5044 6809 50 7 v 60 w(prune\(\))-240 7366 y Fj(b)5 b(e)54 +5044 6809 50 7 v 60 w(prune\(\))-240 7366 y Fk(9)269 +b(Results)89 b(for)i(eon)-240 7828 y Fg(9.1)225 b(Summary:)-240 +8219 y Fj(252.eon)75 b(is)h(a)g(probabilistic)d(ra)-5 +b(y)76 b(tracer,)k(and)c(is)f(part)h(of)g(SPEC)g(In)-5 +b(t)76 b(2000.)126 b(A)77 b(ra)-5 b(y)76 b(tracer)g(is)f(a)i(program)e +(whic)-5 b(h)-240 8493 y(renders)51 b(three)g(dimensional)e(images)h(b) +-5 b(y)51 b(dra)-5 b(wing)51 b(ra)-5 b(ys)51 b(from)g(the)g("camera")f +(and)h(computing)f(in)-5 b(tersections)49 b(to)i(\014nd)-240 +8767 y(the)68 b(sp)5 b(eci\014c)67 b(color)h(to)h(mak)-5 +b(e)67 b(eac)-5 b(h)68 b(giv)-5 b(en)68 b(pixel)g(in)g(the)g(image.)103 +b(A)69 b(probabilistic)d(ra)-5 b(y)68 b(tracer)h(is)e(one)i(in)f(whic) +-5 b(h)68 b(ra)-5 b(y)-240 9041 y(direction)51 b(is)h(determined)f +(randomly)-15 b(.)77 b(The)53 b(implications)c(of)k(this,)f(for)h(this) +f(particular)f(b)5 b(enc)-5 b(hmark,)53 b(is)f(that)g(there)h(is)-240 +9315 y(less)58 b(memory)g(lo)5 b(calit)-5 b(y)57 b(b)5 +b(ecause)59 b(v)-10 b(astly)58 b(di\013eren)-5 b(t)58 +b(areas)h(of)g(the)g(scene)f(graph)h(\(the)g(structure)f(whic)-5 +b(h)59 b(organizes)f(the)-240 9589 y(ob)10 b(jects)63 +b(in)h(the)g(scene)f(and)h(pro)-5 b(vides)64 b(a)g(space)g(partition)f +(to)h(limit)e(the)h(n)-5 b(um)g(b)5 b(er)64 b(of)g(computed)f(in)-5 +b(tersections\))62 b(ma)-5 b(y)-240 9862 y(b)5 b(e)54 b(accessed)f(near)i(eac)-5 b(h)53 b(other)h(temp)5 b(orally)-15 b(.)77 b(F)-15 b(or)54 b(example)f(in)g(a)i(normal)e(ra)-5 b(y)55 b(tracer)f(it)f(w)-5 b(ould)54 b(b)5 b(e)55 b(common)e(to)h(dra) --5 b(w)-240 7640 y(ra)g(ys)71 b(in)-5 b(to)71 b(one)h(particular)e +-5 b(w)-240 10136 y(ra)g(ys)71 b(in)-5 b(to)71 b(one)h(particular)e (division)g(of)h(the)g(scene)g(graph)h(m)-5 b(ultiple)69 b(times)h(in)h(succession,)h(but)f(with)g(the)g(random)-240 -7913 y(elemen)-5 b(t)65 b(there)h(is)f(a)i(high)f(lik)-5 +10410 y(elemen)-5 b(t)65 b(there)h(is)f(a)i(high)f(lik)-5 b(eliness)63 b(of)j(switc)-5 b(hing)65 b(b)5 b(et)-5 b(w)g(een)66 b(divisions)e(frequen)-5 b(tly)-15 b(.)96 -b(Eon)66 b(consists)f(of)h(23,653)f(lines)-240 8187 y(of)60 -b(C++)i(co)5 b(de,)60 b(not)g(including)f(commen)-5 b(ts)58 -b(or)j(blank)f(lines.)79 b(There)61 b(are)f(166)g(calls)f(to)i(new)f -(and)h(87)f(calls)f(to)i(delete.)-240 8724 y Fg(9.2)225 -b(Data)74 b(Structures:)-240 9115 y Fj(There)58 b(is)f(one)g(ma)10 -b(jor)57 b(data)g(structure)f(in)i(the)f(b)5 b(enc)-5 -b(hmark,)57 b(represen)-5 b(ting)56 b(the)h(scene)g(graph,)g(class)g -(mrScene,)f(whic)-5 b(h)-240 9389 y(is)55 b(wrapp)5 b(ed)55 -b(in)g(an)g(eonImageCalculator)e(class.)77 b(Figure)54 -b(15)h(sho)-5 b(ws)55 b(what)h(the)e(data)h(structure)g(graph)g(lo)5 -b(oks)54 b(lik)-5 b(e)54 b(for)-240 9663 y(an)61 b(eonImageCalculator)c -(at)k(an)f(incomplete)e(stage,)i(b)5 b(efore)60 b(it)f(is)h(collapsed.) -42 9937 y(W)-15 b(e)69 b(can)f(see)g(in)h(the)f(ab)5 -b(o)-5 b(v)g(e)68 b(\014gure)h(that)f(there)g(are)h(sev)-5 -b(eral)68 b(binary)g(searc)-5 b(h)68 b(trees)g(\(BSTNo)5 -b(de\))69 b(in)f(the)g(eonIm-)-240 10211 y(ageCalculator.)85 -b(The)63 b(mrScene)f(ob)10 b(ject)62 b(is)g(a)h(\014eld)f(of)g -(eonImageCalculator)e(and)j(it)f(is)g(the)g(source)g(of)h(all)e(the)i -(edges)-240 10485 y(connecting)e(to)h(the)g(BSTNo)5 b(des)63 -b(\(where)f(the)g(\014gure)h(sa)-5 b(ys)62 b(truncated\).)85 -b(This)62 b(data)g(structure)g(is)f(not)i(global)e(p)5 -b(er)62 b(se)-240 10759 y(\(from)i(the)h(program's)f(p)5 -b(ersp)g(ectiv)-5 b(e\),)64 b(but)g(has)h(lifetime)d(throughout)j(the)f -(running)h(of)g(the)f(program)h(b)5 b(ecause)64 b(it)h(is)-240 -11033 y(created)55 b(in)f(main.)78 b(All)54 b(of)h(the)g(elemen)-5 -b(ts)53 b(of)i(the)g(scene)f(to)h(b)5 b(e)55 b(rendered)g(are)g(con)-5 -b(tained)54 b(in)h(the)g(mrScene)f(\014eld)h(of)f(the)3809 -11672 y(20)p eop end +b(Eon)66 b(consists)f(of)h(23,653)f(lines)-240 10684 +y(of)60 b(C++)i(co)5 b(de,)60 b(not)g(including)f(commen)-5 +b(ts)58 b(or)j(blank)f(lines.)79 b(There)61 b(are)f(166)g(calls)f(to)i +(new)f(and)h(87)f(calls)f(to)i(delete.)3809 11672 y(20)p +eop end %%Page: 21 21 TeXDict begin 21 20 bop 235 -99 7330 7 v 235 4701 7 4800 v 292 4651 a @beginspecial 89 @llx 438 @lly 522 @urx @@ -99932,28 +98506,39 @@ @endspecial 7558 4701 V 235 4708 7330 7 v 1434 5043 a Fj(Figure)60 b(13:)80 b Fm(Distinct)55 b(instances)i(of)e(the)g (Connector)p 4902 5043 50 7 v 59 w(Struct)g(substructure)-240 -5593 y Fj(eonImageCalculator.)-240 6129 y Fg(9.3)225 -b(Metrics:)-240 6521 y Fj(N=1)-240 6794 y(The)61 b(only)f(true)g(SDSI)g -(is)g(eonImageCalculator,)e(a)i(\014eld)g(of)g(whic)-5 -b(h)60 b(is)g(a)h(mrScene)e(ob)10 b(ject.)-240 7068 y(G=1)-240 -7342 y(eonImageCalculator)58 b(is)i(global)f(b)5 b(ecause)60 +5593 y Fg(9.2)225 b(Data)74 b(Structures:)-240 5984 y +Fj(There)58 b(is)f(one)g(ma)10 b(jor)57 b(data)g(structure)f(in)i(the)f +(b)5 b(enc)-5 b(hmark,)57 b(represen)-5 b(ting)56 b(the)h(scene)g +(graph,)g(class)g(mrScene,)f(whic)-5 b(h)-240 6258 y(is)55 +b(wrapp)5 b(ed)55 b(in)g(an)g(eonImageCalculator)e(class.)77 +b(Figure)54 b(15)h(sho)-5 b(ws)55 b(what)h(the)e(data)h(structure)g +(graph)g(lo)5 b(oks)54 b(lik)-5 b(e)54 b(for)-240 6532 +y(an)61 b(eonImageCalculator)c(at)k(an)f(incomplete)e(stage,)i(b)5 +b(efore)60 b(it)f(is)h(collapsed.)42 6806 y(W)-15 b(e)69 +b(can)f(see)g(in)h(the)f(ab)5 b(o)-5 b(v)g(e)68 b(\014gure)h(that)f +(there)g(are)h(sev)-5 b(eral)68 b(binary)g(searc)-5 b(h)68 +b(trees)g(\(BSTNo)5 b(de\))69 b(in)f(the)g(eonIm-)-240 +7080 y(ageCalculator.)85 b(The)63 b(mrScene)f(ob)10 b(ject)62 +b(is)g(a)h(\014eld)f(of)g(eonImageCalculator)e(and)j(it)f(is)g(the)g +(source)g(of)h(all)e(the)i(edges)-240 7354 y(connecting)e(to)h(the)g +(BSTNo)5 b(des)63 b(\(where)f(the)g(\014gure)h(sa)-5 +b(ys)62 b(truncated\).)85 b(This)62 b(data)g(structure)g(is)f(not)i +(global)e(p)5 b(er)62 b(se)-240 7628 y(\(from)i(the)h(program's)f(p)5 +b(ersp)g(ectiv)-5 b(e\),)64 b(but)g(has)h(lifetime)d(throughout)j(the)f +(running)h(of)g(the)f(program)h(b)5 b(ecause)64 b(it)h(is)-240 +7902 y(created)55 b(in)f(main.)78 b(All)54 b(of)h(the)g(elemen)-5 +b(ts)53 b(of)i(the)g(scene)f(to)h(b)5 b(e)55 b(rendered)g(are)g(con)-5 +b(tained)54 b(in)h(the)g(mrScene)f(\014eld)h(of)f(the)-240 +8175 y(eonImageCalculator.)-240 8712 y Fg(9.3)225 b(Metrics:)-240 +9103 y Fj(N=1)-240 9377 y(The)61 b(only)f(true)g(SDSI)g(is)g +(eonImageCalculator,)e(a)i(\014eld)g(of)g(whic)-5 b(h)60 +b(is)g(a)h(mrScene)e(ob)10 b(ject.)-240 9651 y(G=1)-240 +9925 y(eonImageCalculator)58 b(is)i(global)f(b)5 b(ecause)60 b(it)g(is)f(collapsed)g(with)h(global)g(ob)10 b(jects.)-240 -7616 y(L=0)-240 7890 y(The)61 b(eonImageCalculator)d(is)h(global.)-240 -8164 y(K=)i(1)-240 8438 y(The)72 b(eonImageCalculator)d(SDSI)i(has)h(1) -f(no)5 b(de,)74 b(b)5 b(ecause)71 b(the)h(individual)d(no)5 -b(des)72 b(of)f(the)g(structure)g(are)h(collapsed)-240 -8712 y(in)-5 b(to)60 b(one)g(no)5 b(de)60 b(in)h(main.)-240 -8986 y(I=0)-240 9260 y(There)66 b(are)g(no)g(disjoin)-5 -b(t)64 b(SDSI's,)i(b)5 b(ecause)65 b(there)h(are)g(no)g(disjoin)-5 -b(t)64 b(instances)g(of)i(one)g(static)e(data)i(structure)f(in)g(the) --240 9534 y(program,)i(with)f(the)g(same)f(t)-5 b(yp)5 -b(e.)97 b(There)67 b(are)f(a)h(few)f(instances)e(of)i(trees)g(that)f -(are)i(disjoin)-5 b(t,)65 b(but)h(they)g(are)g(part)h(of)-240 -9808 y(mrScene,)59 b(and)i(are)f(templated)f(to)h(di\013eren)-5 -b(t)60 b(t)-5 b(yp)5 b(es.)-240 10081 y(O=1)61 b(eonImageCalculator)d -(is,)i(unfortunately)-15 b(,)58 b(collapsed)h(in)h(main.)-240 -10355 y(C=)h(1)-240 10629 y(Sev)-5 b(eral)60 b(collections)e(p)5 -b(oin)-5 b(t)59 b(to)i(the)f(collapsed)e(no)5 b(de.)3809 +10199 y(L=0)-240 10473 y(The)61 b(eonImageCalculator)d(is)h(global.) +-240 10747 y(K=)i(1)-240 11021 y(The)72 b(eonImageCalculator)d(SDSI)i +(has)h(1)f(no)5 b(de,)74 b(b)5 b(ecause)71 b(the)h(individual)d(no)5 +b(des)72 b(of)f(the)g(structure)g(are)h(collapsed)3809 11672 y(21)p eop end %%Page: 22 22 TeXDict begin 22 21 bop 235 -99 7330 7 v 235 2867 7 2967 @@ -120177,94 +118762,18 @@ @endspecial 7558 2867 V 235 2874 7330 7 v 1094 3209 a Fj(Figure)60 b(14:)80 b Fm(DSA)55 b(Graph)h(for)f(function)g(read)p 4126 3209 50 7 v 60 w(en)-5 b(try\(\))54 b(whic)-5 b(h)56 -b(has)h(a)e(collapsed)h(no)5 b(de)-240 3766 y Fk(10)270 -b(Conclusions)-240 4220 y Fj(Brie\015y)-15 b(,)69 b(w)-5 -b(e)68 b(summarize)f(the)h(conclusions)e(of)i(our)g(study)g(as)g(follo) --5 b(ws.)102 b(Please)67 b(refer)h(to)g(T)-15 b(able)68 -b(1)g(for)g(the)g(v)-10 b(alues)68 b(of)-240 4493 y(metrics)59 -b(referred)h(to)g(b)5 b(elo)-5 b(w:)p 1797 4699 4152 -7 v 1794 4899 7 200 v 2939 4899 V 2973 4899 V 3075 4839 -a Fn(Static)64 b(#LDS)p 4247 4899 V 4281 4899 V 233 w(Individual)g(No)5 -b(des)p 5912 4899 V 5946 4899 V 1794 5062 V 2939 5062 -V 2973 5062 V 3337 5062 V 3703 5062 V 4247 5062 V 4281 -5062 V 4728 5062 V 5094 5062 V 5436 5062 V 5945 5062 -V 1794 5226 V 1896 5166 a(Benc)-5 b(hmark)p 2939 5226 -V 2973 5226 V 248 w(N)p 3337 5226 V 215 w(G)p 3703 5226 -V 430 w(L)p 4247 5226 V 4281 5226 V 331 w(K)p 4728 5226 -V 293 w(I)p 5094 5226 V 200 w(O)p 5436 5226 V 371 w(C)p -5945 5226 V 1797 5232 4152 7 v 1797 5265 V 1794 5465 -7 200 v 1896 5405 a Fm(181.mcf)p 2939 5465 V 2973 5465 -V 704 w(2)p 3337 5465 V 282 w(2)p 3703 5465 V 462 w(0)p -4247 5465 V 4281 5465 V 398 w(5)p 4728 5465 V 282 w(0)p -5094 5465 V 260 w(0)p 5436 5465 V 425 w(2)p 5945 5465 -V 1794 5664 V 1896 5604 a(197.parser)p 2939 5664 V 2973 -5664 V 440 w(40)p 3337 5664 V 199 w(20)p 3703 5664 V -379 w(20)p 4247 5664 V 4281 5664 V 232 w(105)p 4728 5664 -V 199 w(53)p 5094 5664 V 260 w(3)p 5436 5664 V 342 w(55)p -5945 5664 V 1794 5863 V 1896 5803 a(300.t)g(w)g(olf)p -2939 5863 V 2973 5863 V 529 w(23)p 3337 5863 V 199 w(21)p -3703 5863 V 462 w(2)p 4247 5863 V 4281 5863 V 315 w(97)p -4728 5863 V 282 w(6)p 5094 5863 V 260 w(7)p 5436 5863 -V 342 w(29)p 5945 5863 V 1794 6063 V 1896 6003 a(espresso)p -2939 6063 V 2973 6063 V 596 w(33)p 3337 6063 V 282 w(7)p -3703 6063 V 379 w(26)p 4247 6063 V 4281 6063 V 232 w(148)p -4728 6063 V 199 w(67)p 5094 6063 V 260 w(0)p 5436 6063 -V 342 w(47)p 5945 6063 V 1794 6262 V 1896 6202 a(fpgro)g(wth)p -2939 6262 V 2973 6262 V 616 w(3)p 3337 6262 V 282 w(0)p -3703 6262 V 462 w(3)p 4247 6262 V 4281 6262 V 398 w(9)p -4728 6262 V 282 w(0)p 5094 6262 V 260 w(0)p 5436 6262 -V 425 w(2)p 5945 6262 V 1794 6461 V 1896 6401 a(eon)p -2939 6461 V 2973 6461 V 1013 w(1)p 3337 6461 V 282 w(1)p -3703 6461 V 462 w(0)p 4247 6461 V 4281 6461 V 398 w(1)p -4728 6461 V 282 w(0)p 5094 6461 V 260 w(1)p 5436 6461 -V 425 w(1)p 5945 6461 V 1797 6468 4152 7 v 1749 6777 -a Fj(T)-15 b(able)60 b(1:)81 b(Observ)-5 b(ed)60 b(statistics)e(for)i -(link)-5 b(ed)59 b(data)i(structures)-18 7449 y(1.)91 -b(In)75 b(all)f(but)h(one)g(\()p Fc(eon)p Fj(\))h(of)f(the)g(six)g -(programs,)j(DSA)d(successfully)e(distinguished)g(the)h(imp)5 -b(ortan)-5 b(t)74 b Fh(kinds)91 b Fj(of)215 7723 y(data)61 -b(structures)h(w)-5 b(e)62 b(ha)-5 b(v)g(e)62 b(man)-5 -b(ually)61 b(iden)-5 b(ti\014ed)61 b(as)h(non-trivial,)e(logically)g -(distinct)g(data)i(structures)g(in)f(the)215 7997 y(co)5 -b(des)68 b(\(column)f(N)i(sho)-5 b(ws)69 b(the)f(total)g(n)-5 -b(um)g(b)5 b(er)68 b(of)h(suc)-5 b(h)68 b(data)h(structures\).)103 -b(F)-15 b(or)69 b(example,)g(w)-5 b(e)69 b(iden)-5 b(ti\014ed)67 -b(23)215 8271 y(suc)-5 b(h)49 b(data)h(structures)f(in)g -Fc(twolf)p Fj(.)80 b(In)49 b Fc(eon)p Fj(,)k(ho)-5 b(w)g(ev)g(er,)52 -b(a)e(complex)f(data)g(structure)h(with)f(man)-5 b(y)50 -b(sub-structures)215 8545 y(b)5 b(ecame)59 b(merged)h(with)g(unrelated) -g(global)f(arra)-5 b(ys)60 b(\(and)h(b)5 b(ecame)59 b(collapsed\).)-18 -8968 y(2.)91 b(In)60 b(a)g(n)-5 b(um)g(b)5 b(er)60 b(of)f(cases)h -(\(column)e(I\),)i(DSA)g(iden)-5 b(ti\014ed)59 b(2)h(or)g(more)g -(disjoin)-5 b(t)58 b(instances)h(of)h(no)5 b(des)59 b(represen)-5 -b(ting)215 9242 y(recursiv)g(e)59 b(data)h(structures,)f(requiring)h(a) -h(con)-5 b(text-sensitiv)g(e)56 b(analysis.)-18 9665 -y(3.)91 b(In)66 b(a)h(n)-5 b(um)g(b)5 b(er)66 b(of)g(other)g(cases)g -(\(column)f(C\),)i(ho)-5 b(w)g(ev)g(er,)67 b(a)g(DS)f(no)5 -b(de)67 b(has)f(m)-5 b(ultiple)65 b(instances)g(\(e.g.,)h(a)g(list)g -(of)215 9939 y(lists\))f(and)j(DSA)h(is)e(unable)g(to)h(distinguish)e -(these)h(instances.)100 b(A)69 b(p)5 b(o)-5 b(w)g(erful,)69 -b(\015o)-5 b(w-sensitiv)g(e)65 b(analysis)h(w)-5 b(ould)215 -10213 y(ha)g(v)g(e)60 b(b)5 b(een)60 b(required)g(to)g(distinguish)f -(most)g(of)h(these)g(cases.)-18 10636 y(4.)91 b(Most)56 -b(DS)h(no)5 b(des)57 b(of)g(these)f(data)h(structures)f(\(K-O\))h(ha)-5 -b(v)g(e)57 b(accurate)f(t)-5 b(yp)5 b(e)57 b(information.)77 -b(The)58 b(exceptions)d(are)215 10910 y(usually)k(minor,)g(except)h -(for)g(the)g(collapsed)f(no)5 b(de)60 b(in)g(eon.)3809 -11672 y(22)p eop end -%%Page: 23 23 -TeXDict begin 23 22 bop -240 -99 18463 7 v -240 5767 -7 5867 v -184 5717 a @beginspecial 14 @llx 14 @lly 1115 - at urx 360 @ury 11010 @rwi @setspecial +b(has)h(a)e(collapsed)h(no)5 b(de)p 1300 3457 5201 7 +v 1300 6040 7 2583 v 1417 5990 a @beginspecial 14 @llx +14 @lly 312 @urx 163 @ury 2980 @rwi @setspecial %%BeginDocument: Figures/eon_fg1.eps %!PS-Adobe-3.0 EPSF-3.0 %%Creator: GIMP PostScript file plugin V 1.17 by Peter Kirchgessner %%Title: eon_fg1.eps -%%CreationDate: Wed Apr 06 21:37:43 2005 +%%CreationDate: Fri Dec 16 22:01:19 2005 %%DocumentData: Clean7Bit %%LanguageLevel: 2 %%Pages: 1 -%%BoundingBox: 14 14 1115 360 +%%BoundingBox: 14 14 312 163 %%EndComments %%BeginProlog % Use own dictionary to avoid conflicts @@ -120272,2334 +118781,1341 @@ %%EndProlog %%Page: 1 1 % Translate for offset -14.173228346456694 14.173228346456694 translate +14.173228346456693 14.173228346456693 translate % Translate to begin of first scanline -0 345 translate -1100.0000000000002 -345 scale +0 148.31999999999999 translate +297.79874999999998 -148.31999999999999 scale % Image geometry -1100 345 8 +514 256 8 % Transformation matrix -[ 1100 0 0 345 0 0 ] +[ 514 0 0 256 0 0 ] % Strings to hold RGB-samples per scanline -/rstr 1100 string def -/gstr 1100 string def -/bstr 1100 string def +/rstr 514 string def +/gstr 514 string def +/bstr 514 string def {currentfile /ASCII85Decode filter /RunLengthDecode filter rstr readstring pop} {currentfile /ASCII85Decode filter /RunLengthDecode filter gstr readstring pop} {currentfile /ASCII85Decode filter /RunLengthDecode filter bstr readstring pop} true 3 -%%BeginData: 137401 ASCII Bytes +%%BeginData: 66918 ASCII Bytes colorimage -JcC<$JcC<$JcC<$JcC<$[Jta~> -JcC<$JcC<$JcC<$JcC<$[Jta~> -JcC<$JcC<$JcC<$JcC<$[Jta~> -JcC<$JcC<$JcC<$JcC<$[Jta~> -JcC<$JcC<$JcC<$JcC<$[Jta~> -JcC<$JcC<$JcC<$JcC<$[Jta~> -JcC<$JcC<$JcC<$JcC<$[Jta~> -JcC<$JcC<$JcC<$JcC<$[Jta~> -JcC<$JcC<$JcC<$JcC<$[Jta~> -JcC<$JcC<$JcC<$JcC<$[Jta~> -JcC<$JcC<$JcC<$JcC<$[Jta~> -JcC<$JcC<$JcC<$JcC<$[Jta~> -JcC<$JcC<$JcC<$JcC<$[Jta~> -JcC<$JcC<$JcC<$JcC<$[Jta~> -JcC<$JcC<$JcC<$JcC<$[Jta~> -JcC<$JcC<$JcC<$JcC<$[Jta~> -JcC<$JcC<$JcC<$JcC<$[Jta~> -JcC<$JcC<$JcC<$JcC<$[Jta~> -JcC<$JcC<$JcC<$JcC<$[Jta~> -JcC<$JcC<$JcC<$JcC<$[Jta~> -JcC<$JcC<$JcC<$JcC<$[Jta~> -JcC<$JcC<$JcC<$JcC<$[Jta~> -JcC<$JcC<$JcC<$JcC<$[Jta~> -JcC<$JcC<$JcC<$JcC<$[Jta~> -JcC<$JcC<$JcC<$JcC<$[Jta~> -JcC<$JcC<$JcC<$JcC<$[Jta~> -JcC<$JcC<$JcC<$JcC<$[Jta~> -JcC<$JcC<$JcC<$JcC<$[Jta~> -JcC<$JcC<$JcC<$JcC<$[Jta~> -JcC<$JcC<$JcC<$JcC<$[Jta~> -JcC<$JcC<$JcC<$JcC<$[Jta~> -JcC<$JcC<$JcC<$JcC<$[Jta~> -JcC<$JcC<$JcC<$JcC<$[Jta~> -JcC<$JcC<$JcC<$JcC<$[Jta~> -JcC<$JcC<$JcC<$JcC<$[Jta~> -JcC<$JcC<$JcC<$JcC<$[Jta~> -JcC<$JcC<$JcC<$JcC<$[Jta~> -JcC<$JcC<$JcC<$JcC<$[Jta~> -JcC<$JcC<$JcC<$JcC<$[Jta~> -JcC<$JcC<$JcC<$JcC<$[Jta~> -JcC<$JcC<$JcC<$JcC<$[Jta~> -JcC<$JcC<$JcC<$JcC<$[Jta~> -JcC<$JcC<$JcC<$JcC<$[Jta~> -JcC<$JcC<$JcC<$JcC<$[Jta~> -JcC<$JcC<$JcC<$JcC<$[Jta~> -JcC<$JcC<$JcC<$JcC<$[Jta~> -JcC<$JcC<$JcC<$JcC<$[Jta~> -JcC<$JcC<$JcC<$JcC<$[Jta~> -JcC<$JcC<$JcC<$JcC<$[Jta~> -JcC<$JcC<$JcC<$JcC<$[Jta~> -JcC<$JcC<$JcC<$JcC<$[Jta~> -JcC<$JcC<$JcC<$JcC<$[Jta~> -JcC<$JcC<$JcC<$JcC<$[Jta~> -JcC<$JcC<$JcC<$JcC<$[Jta~> -JcC<$JcC<$JcC<$JcC<$[Jta~> -JcC<$JcC<$JcC<$JcC<$[Jta~> -JcC<$JcC<$JcC<$JcC<$[Jta~> -JcC<$JcC<$JcC<$JcC<$[Jta~> -JcC<$JcC<$JcC<$JcC<$[Jta~> -JcC<$JcC<$JcC<$JcC<$[Jta~> -JcC<$JcC<$JcC<$JcC<$[Jta~> -JcC<$JcC<$JcC<$JcC<$[Jta~> -JcC<$JcC<$JcC<$JcC<$[Jta~> -JcC<$JcC<$JcC<$JcC<$[Jta~> -JcC<$JcC<$JcC<$JcC<$[Jta~> -JcC<$JcC<$JcC<$JcC<$[Jta~> -JcC<$JcC<$JcC<$JcC<$[Jta~> -JcC<$JcC<$JcC<$JcC<$[Jta~> -JcC<$JcC<$JcC<$JcC<$[Jta~> -JcC<$JcC<$JcC<$JcC<$[Jta~> -JcC<$JcC<$JcC<$JcC<$[Jta~> -JcC<$JcC<$JcC<$JcC<$[Jta~> -JcC<$JcC<$JcC<$JcC<$[Jta~> -JcC<$JcC<$JcC<$JcC<$[Jta~> -JcC<$JcC<$JcC<$JcC<$[Jta~> -JcC<$JcC<$JcC<$JcC<$[Jta~> -JcC<$JcC<$JcC<$JcC<$[Jta~> -JcC<$JcC<$JcC<$JcC<$[Jta~> -JcC<$JcC<$JcC<$JcC<$[Jta~> -JcC<$JcC<$JcC<$JcC<$[Jta~> -JcC<$JcC<$JcC<$JcC<$[Jta~> -JcC<$JcC<$JcC<$JcC<$[Jta~> -JcC<$JcC<$JcC<$JcC<$[Jta~> -JcC<$JcC<$JcC<$JcC<$[Jta~> -JcC<$JcC<$JcC<$JcC<$[Jta~> -JcC<$JcC<$JcC<$JcC<$[Jta~> -JcC<$JcC<$JcC<$JcC<$[Jta~> -JcC<$JcC<$JcC<$JcC<$[Jta~> -JcC<$JcC<$JcC<$JcC<$[Jta~> -JcC<$JcC<$JcC<$JcC<$[Jta~> -JcC<$JcC<$JcC<$JcC<$[Jta~> -JcC<$JcC<$JcC<$JcC<$[Jta~> -JcC<$JcC<$JcC<$JcC<$[Jta~> -JcC<$JcC<$JcC<$JcC<$[Jta~> -JcC<$JcC<$JcC<$JcC<$[Jta~> -JcC<$JcC<$JcC<$JcC<$[Jta~> -JcC<$JcC<$JcC<$JcC<$[Jta~> -JcC<$JcC<$JcC<$JcC<$[Jta~> -JcC<$JcC<$JcC<$JcC<$[Jta~> -JcC<$JcC<$JcC<$JcC<$[Jta~> -JcC<$JcC<$JcC<$JcC<$[Jta~> -JcC<$JcC<$JcC<$JcC<$[Jta~> -JcC<$JcC<$JcC<$JcC<$[Jta~> -JcC<$JcC<$JcC<$JcC<$[Jta~> -JcC<$JcC<$JcC<$JcC<$[Jta~> -JcC<$JcC<$JcC<$JcC<$[Jta~> -JcC<$JcC<$JcC<$JcC<$[Jta~> -JcC<$JcC<$JcC<$JcC<$[Jta~> -JcC<$JcC<$JcC<$JcC<$[Jta~> -JcC<$JcC<$JcC<$JcC<$[Jta~> -JcC<$JcC<$JcC<$JcC<$[Jta~> -JcC<$JcC<$]`/?;lIsP)_oL$Rk4sT.JcC<$L&ZZ~> -JcC<$JcC<$]`/?;lIsP)_oL$Rk4sT.JcC<$L&ZZ~> -JcC<$JcC<$]`/?;lIsP)_oL$Rk4sT.JcC<$L&ZZ~> -JcC<$JcC<$_>b5Dae=)h93Q(VI"ZrqD-fq>Fd^&6JcC<$JcCW-J,~> -JcC<$JcC<$_>b5Dae=)h93Q(VI"ZrqD-fq>Fd^&6JcC<$JcCW-J,~> -JcC<$JcC<$_>b5Dae=)h93Q(VI"ZrqD-fq>Fd^&6JcC<$JcCW-J,~> -JcC<$JcC<$`;^,3Y]ENaT?$$kp\tK`d&2LmBVa[>s+13$s,I&/~> -JcC<$JcC<$`;^,3Y]ENaT?$$kp\tK`d&2LmBVa[>s+13$s,I&/~> -JcC<$JcC<$`;^,3Y]ENaT?$$kp\tK`d&2LmBVa[>s+13$s,I&/~> -JcC<$JcC<$`r?4nK2[ZPqX4 at erRdE>F2NS/JcC<$O8j_~> -JcC<$JcC<$`r?4nK2[ZPqX4 at erRdE>F2NS/JcC<$O8j_~> -JcC<$JcC<$`r?4nK2[ZPqX4 at erRdE>F2NS/JcC<$O8j_~> -JcC<$JcC<$aSuD"G[IcPkPkY$EG!CFs+13$s,m>3~> -JcC<$JcC<$aSuD"G[IcPkPkY$EG!CFs+13$s,m>3~> -JcC<$JcC<$aSuD"G[IcPkPkY$EG!CFs+13$s,m>3~> -JcC<$JcC<$b5VV at RT6iqj8T5&?@q]us+13$s-*J5~> -JcC<$JcC<$b5VV at RT6iqj8T5&?@q]us+13$s-*J5~> -JcC<$JcC<$b5VV at RT6iqj8T5&?@q]us+13$s-*J5~> -JcC<$JcC<$bPq\8D1h?9rr`+h>hai0JcC<$PlH7~> -JcC<$JcC<$bPq\8D1h?9rr`+h>hai0JcC<$PlH7~> -JcC<$JcC<$bPq\8D1h?9rr`+h>hai0JcC<$PlH7~> -JcC<$JcC<$bl7b;/ -JcC<$JcC<$bl7b;/ -JcC<$JcC<$bl7b;/ -JcC<$JcC<$c2Rk%ZV!lY9'JcC<$JcD&9J,~> -JcC<$JcC<$c2Rk%ZV!lY9'JcC<$JcD&9J,~> -JcC<$JcC<$c2Rk%ZV!lY9'JcC<$JcD&9J,~> -JcC<$JcC<$c2Rg(T\08GVel<_s+13$s-Nb9~> -JcC<$JcC<$c2Rg(T\08GVel<_s+13$s-Nb9~> -JcC<$JcC<$c2Rg(T\08GVel<_s+13$s-Nb9~> -JcC<$JcC<$cMmt#>5QqO!ID5+s+13$s-Nb9~> -JcC<$JcC<$cMmt#>5QqO!ID5+s+13$s-Nb9~> -JcC<$JcC<$cMmt#>5QqO!ID5+s+13$s-Nb9~> -JcC<$JcC<$cMmp&Y42Gkp\Xsjo)8Rgo(;q_dV".2JcC<$QiDR~> -JcC<$JcC<$cMmp&Y42Gko)/LgqtL*i!W2H[rrLP\JcC<$JcD):J,~> -JcC<$JcC<$cMmp&Y42Gkp\b$kp\k*mp\XU_!RbV3s+13$s-Nb9~> -JcC<$JcC<$cMmoJl1P&[mS at eaQnJ=:!H -JcC<$JcC<$cMmoJl1P&[dQqKG>`&FZ!q$'0rr3#.H1_+ -JcC<$JcC<$cMmoJl1P&[X'B8G!6G-=!n%):rr3"2aRoK6r`/E -JcC<$JcC<$cMml:o`#>)Z2^GYdf9@/R/bTkmf*<,e:IXNs+13;s*t~> -JcC<$JcC<$cMml:p&>Ku!:&"L:\Xnh]u^59c0kT4E7BI=JcC<$R/_[~> -JcC<$JcC<$cMml:p&>3N!<8n?B)_f5Om`6Fp[8%^E7BI=JcC<$R/_[~> -JcC<$JcC<$cMmlFp&>j*!<:-FH2mX=E%\iK6"Vb;[rDAPO\bQCrrIJiJcC<$JcD,;J,~> -JcC<$JcC<$cMmlFp&>fh0)qQEZ2a^u!*nHEAjL&/Oe;Z*T3V-j!IN"@s+13$s-Wh:~> -JcC<$JcC<$cMmlFp&>f.R/`e8jno)5!." -JcC<$JcC<$cMmo>qt9t)H"N\#_G>I*dY\"K:]H$`l9YFMfA,rlrrHfhJcC<$JcD,;J,~> -JcC<$JcC<$cMmo>qtC%*qa#21B#7>_nr_2sOdQ.Km_XSH!;jY-rrHfhJcC<$JcD,;J,~> -JcC<$JcC<$cMmo>qtC%*gd-4pM4\C:s%i4c6.50es+8>/>l2V:rrHfhJcC<$JcD,;J,~> -JcC<$JcC<$cMmofbOkfKpY^m5aSWj!K)a)Ps,k1h63#10B))B-mSs1:s+13$s-Wh:~> -JcC<$JcC<$cMmofbOb`IX0D[!fB%k1s,"hs61W9Ps.9:`q#:E`<;qIKJcC<$R/_[~> -JcC<$JcC<$cMmofbOtlMqu;8Q63"4e:[\6Yo(#TVM9,^%!6t<=!q'%eJcC<$JcD,;J,~> -JcC<$JcC<$cMmpUH1V%MB&s$mZ/!TUs3cN!Oi[8_s1SFu_YO34Ss4g+JcC<$QiDR~> -JcC<$JcC<$cMmpUH1_+OpKZKLs+:-)aT%CDs$?D-K'q(T!:osc!M5O,s+13$s-Nb9~> -JcC<$JcC<$cMmpUH1_+Nc)%&5s,m=Wmf-)RpJ:gOaO9Xr0)5GISs4g+JcC<$QiDR~> -JcC<$JcC<$cMmtB@*/*A'uHgIH#TV[g]3In!7tJ$[fFKFV/YPmrrVCak^ibbs+13:s*t~> -JcC<$JcC<$cMmtB@*/*A'S>-;6#b*KWrTM&B%I$`M#cN8Z"Eh3!pEYJJcC<$JcD):J,~> -JcC<$JcC<$cMmtB@*/*A'O:Oe:O2C.E%\g(V7-HC:M.OMT:#HS!pEYJJcC<$JcD):J,~> -JcC<$JcC<$c2Rjk/Eca,!;HKm!;lcq!;H6f!:osc!qgB3JcC<$JcD&9J,~> -JcC<$JcC<$c2Rjk/Eca,!:p-h!;lcq!;H9g!W2<\rrVk0Xb$M's+139s*t~> -JcC<$JcC<$c2Rjk/Eca,!;H?i!;lQk!W2H`rrVk0Xb$M's+139s*t~> -JcC<$JcC<$bl7aa:$CC4!r2hTJcC<$JcD#8J,~> -JcC<$JcC<$bl7aa:$CC4!r2hTJcC<$JcD#8J,~> -JcC<$JcC<$bl7aa:$CC4!r2hTJcC<$JcD#8J,~> -JcC<$JcC<$bPqXP=ju7-!pF<_JcC<$JcCu7J,~> -JcC<$JcC<$bPqXP=ju7-!pF<_JcC<$JcCu7J,~> -JcC<$JcC<$bPqXP=ju7-!pF<_JcC<$JcCu7J,~> -JcC<$JcC<$b5VRg=d8aArr`5$;m_,UJcC<$PQ-.~> -JcC<$JcC<$b5VRg=d8aArr`5$;m_,UJcC<$PQ-.~> -JcC<$JcC<$b5VRg=d8aArr`5$;m_,UJcC<$PQ-.~> -JcC<$JcC<$ao;M7O&rO[k5PS__I7]MJcC<$JcCo5J,~> -JcC<$JcC<$ao;M7O&rO[k5PS__I7]MJcC<$JcCo5J,~> -JcC<$JcC<$ao;M7O&rO[k5PS__I7]MJcC<$JcCo5J,~> -JcC<$JcC<$a8Z;"KMn;plMh"NW`jGhJcC<$JcCi3J,~> -JcC<$JcC<$a8Z;"KMn;plMh"NW`jGhJcC<$JcCi3J,~> -JcC<$JcC<$a8Z;"KMn;plMh"NW`jGhJcC<$JcCi3J,~> -JcC<$JcC<$`W$/-T3c&obOP0'#5?W?DcDnUJcC<$JcCc1J,~> -JcC<$JcC<$`W$/-T3c&obOP0'#5?W?DcDnUJcC<$JcCc1J,~> -JcC<$JcC<$`W$/-T3c&obOP0'#5?W?DcDnUJcC<$JcCc1J,~> -JcC<$JcC<$_Z(G,W-;'GH^LkGbKeYabeC6NJS%SoT$dLfs+13$s,?u.~> -JcC<$JcC<$_Z(G,W-;'GH^LkGbKeYabeC6NJS%SoT$dLfs+13$s,?u.~> -JcC<$JcC<$_Z(G,W-;'GH^LkGbKeYabeC6NJS%SoT$dLfs+13$s,?u.~> -JcC<$JcC<$^Ae`*a0(heI -JcC<$JcC<$^Ae`*a0(heI -JcC<$JcC<$^Ae`*a0(heI -JcC<$JcC<$JcC<$JcC<$[Jta~> -JcC<$JcC<$JcC<$JcC<$[Jta~> -JcC<$JcC<$JcC<$JcC<$[Jta~> -JcC<$JcC<$JcC<$JcC<$[Jta~> -JcC<$JcC<$JcC<$JcC<$[Jta~> -JcC<$JcC<$JcC<$JcC<$[Jta~> -JcC<$JcC<$\GlZsiSigJs+13$s+:9$~> -JcC<$JcC<$\GlZsiSigJs+13$s+:9$~> -JcC<$JcC<$\GlZsiSigJs+13$s+:9$~> -JcC<$JcC<$\GlZmaOAgns+13$s+:9$~> -JcC<$JcC<$\GlZmaOAgns+13$s+:9$~> -JcC<$JcC<$\GlZmaOAgns+13$s+:9$~> -JcC<$JcC<$\,QKSl[f(es+13$s*t~> -JcC<$JcC<$\,QKSl[f(es+13$s*t~> -JcC<$JcC<$\,QKSl[f(es+13$s*t~> -JcC<$JcC<$\,QKSl[f(es+13$s*t~> -JcC<$JcC<$\,QKSl[f(es+13$s*t~> -JcC<$JcC<$\,QKSl[f(es+13$s*t~> -JcC<$JcC<$\,QKSl[f(es+13$s*t~> -JcC<$JcC<$\,QKSl[f(es+13$s*t~> -JcC<$JcC<$\,QKSl[f(es+13$s*t~> -JcC<$JcC<$\,QKSl[f(es+13$s*t~> -JcC<$JcC<$\,QKSl[f(es+13$s*t~> -JcC<$JcC<$\,QKSl[f(es+13$s*t~> -JcC<$JcC<$\,QKSl[f(es+13$s*t~> -JcC<$JcC<$\,QKSl[f(es+13$s*t~> -JcC<$JcC<$\,QKSl[f(es+13$s*t~> -JcC<$JcC<$\,QKSl[f(es+13$s*t~> -JcC<$JcC<$\,QKSl[f(es+13$s*t~> -JcC<$JcC<$\,QKSl[f(es+13$s*t~> -JcC<$JcC<$\,QKTl[f(es+13$s*t~> -JcC<$JcC<$\,QKTl[f(es+13$s*t~> -JcC<$JcC<$\,QKTl[f(es+13$s*t~> -JcC<$JcC<$\,QKSl[f(es+13$s*t~> -JcC<$JcC<$\,QKSl[f(es+13$s*t~> -JcC<$JcC<$\,QKSl[f(es+13$s*t~> -JcC<$JcC<$\,QKSl[f(es+13$s*t~> -JcC<$JcC<$\,QKSl[f(es+13$s*t~> -JcC<$JcC<$\,QKSl[f(es+13$s*t~> -JcC<$JcC<$\,QKSl[f(es+13$s*t~> -JcC<$JcC<$\,QKSl[f(es+13$s*t~> -JcC<$JcC<$\,QKSl[f(es+13$s*t~> -JcC<$JcC<$\,QKSl[f(es+13$s*t~> -JcC<$JcC<$\,QKSl[f(es+13$s*t~> -JcC<$JcC<$\,QKSl[f(es+13$s*t~> -JcC<$JcC<$\,QKSl[f(es+13$s*t~> -JcC<$JcC<$\,QKSl[f(es+13$s*t~> -JcC<$JcC<$\,QKSl[f(es+13$s*t~> -JcC<$JcC<$\,QKSl[f(es+13$s*t~> -JcC<$JcC<$\,QKSl[f(es+13$s*t~> -JcC<$JcC<$\,QKSl[f(es+13$s*t~> -JcC<$JcC<$\,QKSl[f(es+13$s*t~> -JcC<$JcC<$\,QKSl[f(es+13$s*t~> -JcC<$JcC<$\,QKSl[f(es+13$s*t~> -JcC<$JcC<$\GlZ_Y.)E%s+13$s+:9$~> -JcC<$JcC<$\GlZ_Y.)E%s+13$s+:9$~> -JcC<$JcC<$\GlZ_Y.)E%s+13$s+:9$~> -JcC<$JcC<$\GlZ_TqTJWs+13$s+:9$~> -JcC<$JcC<$\GlZ_TqTJWs+13$s+:9$~> -JcC<$JcC<$\GlZ_TqTJWs+13$s+:9$~> -JcC<$JcC<$\GlZqTqUIss+13$s+:9$~> -JcC<$JcC<$\GlZqTqUIss+13$s+:9$~> -JcC<$JcC<$\GlZqTqUIss+13$s+:9$~> -JcC<$JcC<$\Gl[.U87[;s+13$s+:9$~> -JcC<$JcC<$\Gl[.U87[;s+13$s+:9$~> -JcC<$JcC<$\Gl[.U87[;s+13$s+:9$~> -JcC<$JcC<$\,QK6]n-37s+13$s*t~> -JcC<$JcC<$\,QK6]n-37s+13$s*t~> -JcC<$JcC<$\,QK6]n-37s+13$s*t~> -JcC<$JcC<$\,QKIfn'0Ss+13$s*t~> -JcC<$JcC<$\,QKIfn'0Ss+13$s*t~> -JcC<$JcC<$\,QKIfn'0Ss+13$s*t~> -JcC<$JcC<$\,QK\on!-os+13$s*t~> -JcC<$JcC<$\,QK\on!-os+13$s*t~> -JcC<$JcC<$\,QK\on!-os+13$s*t~> -JcG<@"TH;n>YouHJPLbkb>&%:JPLbkJPO?_"A`'?[.M$2J,~> -JcG<@"TH;n>YouHJPLbkb>&%:JPLbkJPO?_"A`'?[.M$2J,~> -JcG<@"TH;n>YouHJPLbkb>&%:JPLbkJPO?_"A`'?[.M$2J,~> -JcG?A"Oh(,\E\Y>JbO`iJbO`iJbP?%"o7Z3LK1Oks*t~> -JcG?A"Oh(,\E\Y>JbO`iJbO`iJbP?%"o7Z3LK1Oks*t~> -JcG?A"Oh(,\E\Y>JbO`iJbO`iJbP?%"o7Z3LK1Oks*t~> -JcGBB!m*C:JcC<$JcC<$JcC<$MuNk8E/_O2J,~> -JcGBB!m*C:JcC<$JcC<$JcC<$MuNk8E/_O2J,~> -JcGBB!m*C:JcC<$JcC<$JcC<$MuNk8E/_O2J,~> -JcGEC!l7CfJcC<$JcC<$JcC<$M>mYTBn=&!J,~> -JcGEC!l7CfJcC<$JcC<$JcC<$M>mYTBn=&!J,~> -JcGEC!l7CfJcC<$JcC<$JcC<$M>mYTBn=&!J,~> -JcGHD!o6o;JcC<$K`;&L]`8$&!WW&ps8VierrDJ -JcGHD!o6o;JcC<$L&V/I]Di!$p](-grrM]fpAY-`JcC<$JcF^/!rQ*"_#Jo~> -JcGHD!o6o;JcC<$L&V/D]`/$0o(i:cme6\\pOW?qs+14/rrW+!X2+ac~> -JcGHD!ICl!s+13+rrm[[H*IA;f`)&S!.""urrqL:H'eSorVlra!5eL1!M;"1rroG'H,K].rr38U -!-u6XAoL&fJcC<$M#RP9<:Rg)J,~> -JcGHD!ICl!s+13,rrqshE06LffDbo(!2&QV"i:8%JcNmjrrUFFo(W.bAqK at K"bH`HWrTF(rs54s -X.KBD>[6iNs+13+rrV1Zn\P6U~> -JcGHD!ICl!s+13,rrphHAuf1!f`)'A:B8)nrrncBT4S)krVlnj0),AIl2\olrs%me!4ma^i;W`] -AcTbp!.mM!JcC<$L]7G8<:Rg)J,~> -JcGKE!TdI8s+13+rroH8s,"FVqYpPIoD\jQR-stT0%0(c#4_c's8U]&r;Qeb_Y='2pHe]V!.sb@ -&2)E2!!)-\s%`X_s$=p0OY24bJcCN*!KX=us*t~> -JcGKE!TdI8s+13+rrl3's.>.rqu6]YR.L=Y]u][B!qu]lli.1@!9O7\V8E01!C?;NrrLQ"r;QfZ -R.C7\pAk*f!&"9N#QQLWqZ-Nn!/Z:,JcCN*!KX=us*t~> -JcGKE!TdI8s+13,rs&?#lI*OSp\Xsk^!60K!Klg=rrL2,lMh'\!;lfrE9dE%!V]C`rrJ8'r;Qf2 -c1:lHa?fjN!.t7Ng]3K:dR!p(!6p)pJcCN*!KX=us*t~> -JcGKE!Ml39s+13+ruQI6ntg=*p]'f0M3tOJR$`.OHY3:iTDuTM:WRK-^&J$[R!EZJgi.4hqfsei ->lXgiaO3 at n/ulM"nIH2m/KE+Zf8Jm?Bn!<)rti$;o[X8e=!s1N\RaGHPW0%0;Vs0m8Yd]ie> -np,glm_*4EE,`)\rt%K;s+4$us57Jho)D##s*7Cks+13*rrLVd_>f#~> -JcGKE!Ml39s+13+s%3:k_RFgjp]&isB$G9IZuD--EhDn&df5\k608/Pi;`iFJnCYT]m3kfl;(2. -R/cm\nuFB^0!S2Js57.-X8g7d>]AW+JktZ:K)Yctqs(Y9>hB!Ao)G)66/GDhblI=ZK)^[a:\&HW -^"dRGM>rrp0!534rr3T)!:o]+!5ecFGsVK)!;lcrV1JYts+gUTe8<&%J,~> -JcGKE!Ml39s+13,rrqL[s.uR$rr5e+Hu.o+^;0(Sa^H#VC9H2%@=dXk99s-SC6f>oRL -!6G2b62ud;AnIklOoMn9>hB"JJm:]L07H#V4upRc'tM9,F'M1YI% ->hlf6>d<^BM#b?lqu6U-bsDBSJcP*9M.W.TbsDBf!7uf%JcCN*!Rtu&s*t~> -JcGKE!JJ=@s+13+ruJ@?Jub_eH)o"^s2aq#s2"ctjt?\$M=*\0aK*aGrr4FP:WNOW!:'SM[uk;& -0(/a*aRT>dblId#V;-\&!:GujqZ-?j]n-6V0)YbLYp8?_s,k1d63#$,dXqKbaRVXsM<23upHeh2 -Z2^21l2]Gth!4k<&4+D;K$jYnM:)Cps%bo\E:/;WJcCN*!W#R-s*t~> -JcGKE!JJ=@s+13+s8R$WT7XpGH.%;:o%_ZMs+54Ob(BXGc,,>;Ok5`?rr4EZR'?YN!<;cnl7T at 4 -!<;cno%*mAM.Zbfgp+?M!<4\KaA:mtdOp,;Oo55*H0);_s$?4mM>r^iOi[P&o$)d`B)cJ[dY[u( -lMiKG_>r]caSYu:&bc:rm[0V!s(9[Zs7ZLu!2'.>s+13*rrMsk_>f#~> -JcGKE!JJ=@s+13,s%E)^E49eq>]B6df at TSUc20,ujb_(U!:GH`s*=02o)Jae!53sa]l="r!9sRG -]nud663!cns":SI!;D*,Z&/$;s+7)J>fZoZ!6tKB-22$KB#sC9s+8MqH1Fc%dR!niaP;XL!:Guo -l2^kT!9JfXjn$aqrt*F at s2)iQR-p*(OoNZ+:B87_s+13)rrMsk_>f#~> -JcGKE!I`.Bs+13*rtkG,E0u7WX8cc3c141#dOtRj63!((aEddb!R65qs!a),jm):7o)G)/Obs*6 -mf,Sos%iC;0)q;js-T0+m\O1D61QYijmo#Dr;R&nJtGj=Oi#1brr3bYM>ol_nj3<2H&7CK62rR^ -s3^o_2p+s+UIQ9#:OX~> -JcGKE!I`.Bs+13*rtkFfO\a'q_X7C(m`g@`Obs+_K)[IJK"_0`!K"nss!^7^i9o#Gs8O^m0$X8G -s7ZNapHehAM>o3Lnp-ins'2D0M9TYtjnDQ&r;R&XH&7CX61TW at rr3^iaSPu.c%>u/M-S-HK(8p9 -s-SDd!;c^,pAjdPOnSj-\(<84pAj:TT7R#ns+UIQ9#:OX~> -JcGKE!I`.Bs+13)rt_Z?!;Fq,a8fiPM9,]_c2WXFpAjVIlMgf9:[\8_nh/k^nr]=>pAj1QpW/3k -bsDBNOoI_lpAjX:Jr,Wa!7H/;OfRU/mf:6&rs6;p>fc>/s$>rLrtS?(bsDAdaT%Wp0(+S;a?fk+ -6-,1NqYq,O63"gHa8g2ER$%En:XT6kJcC<$L&V-F_>f#~> -JcGKE!IMq>s+13)s)XRU>i=P at ddFt)nj3<-0)tJBs+uTf!:'uqje$/blD4L4s,j.FM>pBB -s";b"62/t`s-Sqn>lQGIgg%PipAj"KTAfj[s8Vu*M6ZV;s-Um_!:'EqZ-BjlLOoR&2)E2H2k_]h#@BBs$>*5!.oe%JcCK)!(Xm*J,~> -JcGKE!IMq>s+13)s)MB4!<9+T\,V;AaFaGZOoNL7rrCr/-s478NqZ-ZS!53s`JcCK)!(Xm*J,~> -JcGKE!IMq>s+13*s)[aMdTlg/pV$Smc&'OA6.5di\+]mn>aYQ#ge[AaYQ#gd15H63!(lZ#K_/mYT$H -!;HLGgmFK/s5lU1Cs3a45WrV74s+13)rr>R*s*t~> -JcGKE!IMq>s+13*s)dO\;Rf -Z)[kM^Au-I!7tgff)TD8Ju&H"0&39'!4W![!+q'mi2Zis!38n-s+15'lK&"N:Pl=Vc"6rp!8%9V -h>jT]gp[9ms'22qrt;@4H*@:Ls)A"=!-u6XE:W)jM1P\Xs+gUS8&>4U~> -JcGKE!IMq>s+13*s)brNs);qRs,hni_V>-K:J^QC!*ib?l@!2$q) -f7F!iT)dYY>i5ULV#YH7[ncuV:\Sf.!9!m^!.ofApLXDE!5/B)nj*7\s1JDE0"m)AiW)bZ6.c1" -_>piGpPAn*qZ,7Irt9n`R$[m%jd?("!3;^lR/aVqZ%;q+s+gUS8&>4U~> -JcGKE!IMq>s+13*s)s"LpJ5bVs%fJ1jf8BR!/^`h!+mjsf)PfaV>f!4V]-Oa4X]!6C!m -hG4-bAnKfuR)f9KAcQECg]/r,M=)tr>ke8T!0M5mpAdub6*((2f)Pf -JcGKE!IMq>s+13*s8VurrrDrqrri5is8VunrrDflrrDfmrrDfkrrDWhrrN#^mf*[ls8Vt.o)I.# -s7cEhs8VB`rrVrpqu$Hop\t3mqtL*jqu6TrlMH/4JcC<$lMgiS_>f#~> -JcGKE!IMq>s+13*rrDfmrrDrqs8VinrrDfks8VuprrDfmrrDflrrN#frr3#imdC)^p](-UE<#s* -c2[A5rrW)Zo)AXjqu?QkrrDfmrrDferri)rs82)4s+13$s69O`8&>4U~> -JcGKE!IMq>s+13*rrDfirrDWhrrDfkrrDfkrrDfmrrDrprrMlkrr3#ep[8%gqu?]0X8i'/o)J:Z -rrVrVp\+Uep\t0mp\+Uip](9amXbChs+147rr>R*s*t~> -JcGKE!IMq>s+13$s2k9Eqa"#0E:SS[JcC<$_#FC)_>f#~> -JcGKE!IMq>s+13$s2k9DjT&nR*s*t~> -JcGKE!IMq>s+13$s2k9D[fC\mZ%;q+s+13brr>R*s*t~> -JcGKE!HNpGX+@=&X2h7AS=bA5JZF@&^8h5q_>f#~> -JcGKE!HNpGX+@=&X2q=CW19T5X+@=&X1kV742LrI~> -JcGKE!HNpGX+@=&X2q=CU7A05X+@=&X1kV742LrI~> -JcGKE!HEAXR/p90p6bq`E;#\#?#')$!Fo^7R/pu/p6bqu>P=HcE`Vn%!I%E7R/q\.p6br47eW5N -LI1[%!'KqB!&sS=!&=/7!&=/7!&jMe$>AX#$!FTR6R/po/p6bqs?1sZeE*2h%!Hh<6 -R/qV/p6br38G8GPKgYR%!K',7R/f8?R/f):R/el4R/f):R/f8?R/oO/p6bqKK_Cf78:U?$!D[t7 -R/p6/p6bq`E5e4F35PWF~> -JcGKE!HEAXR/p90p6bq`E;#\#?#')$!Fo^7R/pu/p6bqu>P=HcE`Vn%!I%E7R/q\.p6br47eW5N -LI1[%!'KqB!&sS=!&=/7!&=/7!&jMe$>AX#$!FTR6R/po/p6bqs?1sZeE*2h%!Hh<6 -R/qV/p6br38G8GPKgYR%!K',7R/f8?R/f):R/el4R/f):R/f8?R/oO/p6bqKK_Cf78:U?$!D[t7 -R/p6/p6bq`E5e4F35PWF~> -JcGKE!HEAXR/p90p6bq`E;#\#?#')$!Fo^7R/pu/p6bqu>P=HcE`Vn%!I%E7R/q\.p6br47eW5N -LI1[%!'KqB!&sS=!&=/7!&=/7!&jMe$>AX#$!FTR6R/po/p6bqs?1sZeE*2h%!Hh<6 -R/qV/p6br38G8GPKgYR%!K',7R/f8?R/f):R/el4R/f):R/f8?R/oO/p6bqKK_Cf78:U?$!D[t7 -R/p6/p6bq`E5e4F35PWF~> -JcGKE!IMr^rrIhgpAY/R\+]h&QEKr]!MH7^rrK*hpAY0!P4nnV]8?7]!Q9Q_rrLAgpAY0EDYF)2 -he)Q]!*o3s!)rRj!(uqa!(ce_!)`Fh!*f-r!Ft*^rrHrgpAY/:ch at A>I`D*]!JnD^rrJ7hpAY/] -X7lPoUS7D]!N_^_rrKKgpAY0-LA(WJa+!a^!RPr^rrLegpAY0QA+fj%=nVdp;"ahg8+ll^9D/;b -<;$7k?M4=!B&<7]!H6N^rrIDhpAY/E_tO*2Mn/Q]!L0k_rrJXgpAY/jT(`0bYEnn^!On'^rrKrh -pAY09HhRI?drG*]!ShD_rrM4hp&>"mp&>"ep&>"]p&>"ep&>"np&>&$jS&TSC"r@]!HQW^rrIJg -pAY/H_"Rd/NOQn,!(Xm*J,~> -JcGKE!IMr^rrIhgpAY/R\+]h&QEKr]!MH7^rrK*hpAY0!P4nnV]8?7]!Q9Q_rrLAgpAY0EDYF)2 -he)Q]!*o3s!)rRj!(uqa!(ce_!)`Fh!*f-r!Ft*^rrHrgpAY/:ch at A>I`D*]!JnD^rrJ7hpAY/] -X7lPoUS7D]!N_^_rrKKgpAY0-LA(WJa+!a^!RPr^rrLegpAY0QA+fj%=nVdp;"ahg8+ll^9D/;b -<;$7k?M4=!B&<7]!H6N^rrIDhpAY/E_tO*2Mn/Q]!L0k_rrJXgpAY/jT(`0bYEnn^!On'^rrKrh -pAY09HhRI?drG*]!ShD_rrM4hp&>"mp&>"ep&>"]p&>"ep&>"np&>&$jS&TSC"r@]!HQW^rrIJg -pAY/H_"Rd/NOQn,!(Xm*J,~> -JcGKE!IMr^rrIhgpAY/R\+]h&QEKr]!MH7^rrK*hpAY0!P4nnV]8?7]!Q9Q_rrLAgpAY0EDYF)2 -he)Q]!*o3s!)rRj!(uqa!(ce_!)`Fh!*f-r!Ft*^rrHrgpAY/:ch at A>I`D*]!JnD^rrJ7hpAY/] -X7lPoUS7D]!N_^_rrKKgpAY0-LA(WJa+!a^!RPr^rrLegpAY0QA+fj%=nVdp;"ahg8+ll^9D/;b -<;$7k?M4=!B&<7]!H6N^rrIDhpAY/E_tO*2Mn/Q]!L0k_rrJXgpAY/jT(`0bYEnn^!On'^rrKrh -pAY09HhRI?drG*]!ShD_rrM4hp&>"mp&>"ep&>"]p&>"ep&>"np&>&$jS&TSC"r@]!HQW^rrIJg -pAY/H_"Rd/NOQn,!(Xm*J,~> -JcGKE!IMr^rrIhgpAY/R\+]h&QEKr]!MH7^rrK*hpAY0!P4nnV]8?7]!Q9Q_rrLAgpAY0EDYF)2 -he)Q]!*o3s!)rRj!(uqa!(ce_!)`Fh!*f-r!Ft*^rrHrgpAY/:ch at A>I`D*]!JnD^rrJ7hpAY/] -X7lPoUS7D]!N_^_rrKKgpAY0-LA(WJa+!a^!RPr^rrLegpAY0QA+fj%=nVdp;"ahg8+ll^9D/;b -<;$7k?M4=!B&<7]!H6N^rrIDhpAY/E_tO*2Mn/Q]!L0k_rrJXgpAY/jT(`0bYEnn^!On'^rrKrh -pAY09HhRI?drG*]!ShD_rrM4hp&>"mp&>"ep&>"]p&>"ep&>"np&>&$jS&TSC"r@]!HQW^rrIJg -pAY/H_"Rd/NOQn,!(Xm*J,~> -JcGKE!IMr^rrIhgpAY/R\+]h&QEKr]!MH7^rrK*hpAY0!P4nnV]8?7]!Q9Q_rrLAgpAY0EDYF)2 -he)Q]!*o3s!)rRj!(uqa!(ce_!)`Fh!*f-r!Ft*^rrHrgpAY/:ch at A>I`D*]!JnD^rrJ7hpAY/] -X7lPoUS7D]!N_^_rrKKgpAY0-LA(WJa+!a^!RPr^rrLegpAY0QA+fj%=nVdp;"ahg8+ll^9D/;b -<;$7k?M4=!B&<7]!H6N^rrIDhpAY/E_tO*2Mn/Q]!L0k_rrJXgpAY/jT(`0bYEnn^!On'^rrKrh -pAY09HhRI?drG*]!ShD_rrM4hp&>"mp&>"ep&>"]p&>"ep&>"np&>&$jS&TSC"r@]!HQW^rrIJg -pAY/H_"Rd/NOQn,!(Xm*J,~> -JcGKE!IMr^rrIhgpAY/R\+]h&QEKr]!MH7^rrK*hpAY0!P4nnV]8?7]!Q9Q_rrLAgpAY0EDYF)2 -he)Q]!*o3s!)rRj!(uqa!(ce_!)`Fh!*f-r!Ft*^rrHrgpAY/:ch at A>I`D*]!JnD^rrJ7hpAY/] -X7lPoUS7D]!N_^_rrKKgpAY0-LA(WJa+!a^!RPr^rrLegpAY0QA+fj%=nVdp;"ahg8+ll^9D/;b -<;$7k?M4=!B&<7]!H6N^rrIDhpAY/E_tO*2Mn/Q]!L0k_rrJXgpAY/jT(`0bYEnn^!On'^rrKrh -pAY09HhRI?drG*]!ShD_rrM4hp&>"mp&>"ep&>"]p&>"ep&>"np&>&$jS&TSC"r@]!HQW^rrIJg -pAY/H_"Rd/NOQn,!(Xm*J,~> -JcGKE!IMr^rrIhgpAY/R\+]h&QEKr]!MH7^rrK*hpAY0!P4nnV]8?7]!Q9Q_rrLAgpAY0EDYF)2 -he)Q]!*o3s!)rRj!(uqa!(ce_!)`Fh!*f-r!Ft*^rrHrgpAY/:ch at A>I`D*]!JnD^rrJ7hpAY/] -X7lPoUS7D]!N_^_rrKKgpAY0-LA(WJa+!a^!RPr^rrLegpAY0QA+fj%=nVdp;"ahg8+ll^9D/;b -<;$7k?M4=!B&<7]!H6N^rrIDhpAY/E_tO*2Mn/Q]!L0k_rrJXgpAY/jT(`0bYEnn^!On'^rrKrh -pAY09HhRI?drG*]!ShD_rrM4hp&>"mp&>"ep&>"]p&>"ep&>"np&>&$jS&TSC"r@]!HQW^rrIJg -pAY/H_"Rd/NORL=!:o[[!(Xm*J,~> -JcGKE!IMr^rrIhgpAY/R\+]h&QEKr]!MH7^rrK*hpAY0!P4nnV]8?7]!Q9Q_rrLAgpAY0EDYF)2 -he)Q]!*o3s!)rRj!(uqa!(ce_!)`Fh!*f-r!Ft*^rrHrgpAY/:ch at A>I`D*]!JnD^rrJ7hpAY/] -X7lPoUS7D]!N_^_rrKKgpAY0-LA(WJa+!a^!RPr^rrLegpAY0QA+fj%=nVdp;"ahg8+ll^9D/;b -<;$7k?M4=!B&<7]!H6N^rrIDhpAY/E_tO*2Mn/Q]!L0k_rrJXgpAY/jT(`0bYEnn^!On'^rrKrh -pAY09HhRI?drG*]!ShD_rrM4hp&>"mp&>"ep&>"]p&>"ep&>"np&>&$jS&TSC"r@]!HQW^rrIJg -pAY/H_"Rd/NORL=!:o[[!(Xm*J,~> -JcGKE!IMr^rrIhgpAY/R\+]h&QEKr]!MH7^rrK*hpAY0!P4nnV]8?7]!Q9Q_rrLAgpAY0EDYF)2 -he)Q]!*o3s!)rRj!(uqa!(ce_!)`Fh!*f-r!Ft*^rrHrgpAY/:ch at A>I`D*]!JnD^rrJ7hpAY/] -X7lPoUS7D]!N_^_rrKKgpAY0-LA(WJa+!a^!RPr^rrLegpAY0QA+fj%=nVdp;"ahg8+ll^9D/;b -<;$7k?M4=!B&<7]!H6N^rrIDhpAY/E_tO*2Mn/Q]!L0k_rrJXgpAY/jT(`0bYEnn^!On'^rrKrh -pAY09HhRI?drG*]!ShD_rrM4hp&>"mp&>"ep&>"]p&>"ep&>"np&>&$jS&TSC"r@]!HQW^rrIJg -pAY/H_"Rd/NORO>!W2W]rr>R*s*t~> -JcGKE!IMr^rrIhgpAY/R\+]h&QEKr]!MH7^rrK*hpAY0!P4nnV]8?7]!Q9Q_rrLAgpAY0EDYF)2 -he)Q]!*o3s!)rRj!(uqa!(ce_!)`Fh!*f-r!Ft*^rrHrgpAY/:ch at A>I`D*]!JnD^rrJ7hpAY/] -X7lPoUS7D]!N_^_rrKKgpAY0-LA(WJa+!a^!RPr^rrLegpAY0QA+fj%=nVdp;"ahg8+ll^9D/;b -<;$7k?M4=!B&<7]!H6N^rrIDhpAY/E_tO*2Mn/Q]!L0k_rrJXgpAY/jT(`0bYEnn^!On'^rrKrh -pAY09HhRI?drG*]!ShD_rrM4hp&>"mp&>"ep&>"]p&>"ep&>"np&>&$jS&TSC"r@]!HQW^rrIJg -pAY/H_"Rd/NORO>!MqF=rr>R*s*t~> -JcGKE!IMr^rrIhgpAY/R\+]h&QEKr]!MH7^rrK*hpAY0!P4nnV]8?7]!Q9Q_rrLAgpAY0EDYF)2 -he)Q]!*o3s!)rRj!(uqa!(ce_!)`Fh!*f-r!Ft*^rrHrgpAY/:ch at A>I`D*]!JnD^rrJ7hpAY/] -X7lPoUS7D]!N_^_rrKKgpAY0-LA(WJa+!a^!RPr^rrLegpAY0QA+fj%=nVdp;"ahg8+ll^9D/;b -<;$7k?M4=!B&<7]!H6N^rrIDhpAY/E_tO*2Mn/Q]!L0k_rrJXgpAY/jT(`0bYEnn^!On'^rrKrh -pAY09HhRI?drG*]!ShD_rrM4hp&>"mp&>"ep&>"]p&>"ep&>"np&>&$jS&TSC"r@]!HQW^rrIJg -pAY/H_"Rd/NORO>!G72Yrr>R*s*t~> -JcGKE!IMr^rrIhgpAY/R\+]h&QEKr]!MH7^rrK*hpAY0!P4nnV]8?7]!Q9Q_rrLAgpAY0EDYF)2 -he)Q]!*o3s!)rRj!(uqa!(ce_!)`Fh!*f-r!Ft*^rrHrgpAY/:ch at A>I`D*]!JnD^rrJ7hpAY/] -X7lPoUS7D]!N_^_rrKKgpAY0-LA(WJa+!a^!RPr^rrLegpAY0QA+fj%=nVdp;"ahg8+ll^9D/;b -<;$7k?M4=!B&<7]!H6N^rrIDhpAY/E_tO*2Mn/Q]!L0k_rrJXgpAY/jT(`0bYEnn^!On'^rrKrh -pAY09HhRI?drG*]!ShD_rrM4hp&>"mp&>"ep&>"]p&>"ep&>"np&>&$jS&TSC"r@]!HQW^rrIJg -pAY/H_"Rd/NORR?!pTd,nc&SZ_>f#~> -JcGKE!I`/brrIhgpAY/R\+]h&QEKr]!MH7^rrK*hpAY0!P4nnV]8?7]!Q9Q_rrLAgpAY0EDYF)2 -he)Q]!*o3s!)rRj!(uqa!(ce_!)`Fh!*f-r!Ft*^rrHrgpAY/:ch at A>I`D*]!JnD^rrJ7hpAY/] -X7lPoUS7D]!N_^_rrKKgpAY0-LA(WJa+!a^!RPr^rrLegpAY0QA+fj%=nVdp;"ahg8+ll^9D/;b -<;$7k?M4=!B&<7]!H6N^rrIDhpAY/E_tO*2Mn/Q]!L0k_rrJXgpAY/jT(`0bYEnn^!On'^rrKrh -pAY09HhRI?drG*]!ShD_rrM4hp&>"mp&>"ep&>"]p&>"ep&>"np&>&$jS&TSC"r@]!HQW^rrIJg -pAY/H_"Rd/NOSca!Q)qBrr at ZHrrN!_nc&S\_>f#~> -JcGKE!I`/brrIhgpAY/R\+]h&QEKr]!MH7^rrK*hpAY0!P4nnV]8?7]!Q9Q_rrLAgpAY0EDYF)2 -he)Q]!*o3s!)rRj!(uqa!(ce_!)`Fh!*f-r!Ft*^rrHrgpAY/:ch at A>I`D*]!JnD^rrJ7hpAY/] -X7lPoUS7D]!N_^_rrKKgpAY0-LA(WJa+!a^!RPr^rrLegpAY0QA+fj%=nVdp;"ahg8+ll^9D/;b -<;$7k?M4=!B&<7]!H6N^rrIDhpAY/E_tO*2Mn/Q]!L0k_rrJXgpAY/jT(`0bYEnn^!On'^rrKrh -pAY09HhRI?drG*]!ShD_rrM4hp&>"mp&>"ep&>"]p&>"ep&>"np&>&$jS&TSC"r@]!HQW^rrIJg -pAY/H_"Rd/NOSca!KlsUKIK(8j at 8\tFW~> -JcGKE!I`/brrIhgpAY/R\+]h&QEKr]!MH7^rrK*hpAY0!P4nnV]8?7]!Q9Q_rrLAgpAY0EDYF)2 -he)Q]!*o3s!)rRj!(uqa!(ce_!)`Fh!*f-r!Ft*^rrHrgpAY/:ch at A>I`D*]!JnD^rrJ7hpAY/] -X7lPoUS7D]!N_^_rrKKgpAY0-LA(WJa+!a^!RPr^rrLegpAY0QA+fj%=nVdp;"ahg8+ll^9D/;b -<;$7k?M4=!B&<7]!H6N^rrIDhpAY/E_tO*2Mn/Q]!L0k_rrJXgpAY/jT(`0bYEnn^!On'^rrKrh -pAY09HhRI?drG*]!ShD_rrM4hp&>"mp&>"ep&>"]p&>"ep&>"np&>&$jS&TSC"r@]!HQW^rrIJg -pAY/H_"Rd/NOSfb!W.K5rrKgXq>UJ_aRT918\tFW~> -JcGKE!JA>arrIhgpAY/R\+]h&QEKr]!MH7^rrK*hpAY0!P4nnV]8?7]!Q9Q_rrLAgpAY0EDYF)2 -he)Q]!*o3s!)rRj!(uqa!(ce_!)`Fh!*f-r!Ft*^rrHrgpAY/:ch at A>I`D*]!JnD^rrJ7hpAY/] -X7lPoUS7D]!N_^_rrKKgpAY0-LA(WJa+!a^!RPr^rrLegpAY0QA+fj%=nVdp;"ahg8+ll^9D/;b -<;$7k?M4=!B&<7]!H6N^rrIDhpAY/E_tO*2Mn/Q]!L0k_rrJXgpAY/jT(`0bYEnn^!On'^rrKrh -pAY09HhRI?drG*]!ShD_rrM4hp&>"mp&>"ep&>"]p&>"ep&>"np&>&$jS&TSC"r@]!HQW^rrIJg -pAY/H_"Rd/NOSfb-2R[I\RpZuM4a2gd\QqK0'`1VJnG%lH!Je&!1<2+AtT+:E,\,6rrN!k_>f#~> -JcGKE!JA>arrIhgpAY/R\+]h&QEKr]!MH7^rrK*hpAY0!P4nnV]8?7]!Q9Q_rrLAgpAY0EDYF)2 -he)Q]!*o3s!)rRj!(uqa!(ce_!)`Fh!*f-r!Ft*^rrHrgpAY/:ch at A>I`D*]!JnD^rrJ7hpAY/] -X7lPoUS7D]!N_^_rrKKgpAY0-LA(WJa+!a^!RPr^rrLegpAY0QA+fj%=nVdp;"ahg8+ll^9D/;b -<;$7k?M4=!B&<7]!H6N^rrIDhpAY/E_tO*2Mn/Q]!L0k_rrJXgpAY/jT(`0bYEnn^!On'^rrKrh -pAY09HhRI?drG*]!ShD_rrM4hp&>"mp&>"ep&>"]p&>"ep&>"np&>&$jS&TSC"r@]!HQW^rrIJg -pAY/H_"Rd/NOSfb-/\cKZ"@T_:Y3hkmWgE\>lW`$AsiUTM,3\]0"okg:WWQuM*[9prrN!k_>f#~> -JcGKE!JA>arrIhgpAY/R\+]h&QEKr]!MH7^rrK*hpAY0!P4nnV]8?7]!Q9Q_rrLAgpAY0EDYF)2 -he)Q]!*o3s!)rRj!(uqa!(ce_!)`Fh!*f-r!Ft*^rrHrgpAY/:ch at A>I`D*]!JnD^rrJ7hpAY/] -X7lPoUS7D]!N_^_rrKKgpAY0-LA(WJa+!a^!RPr^rrLegpAY0QA+fj%=nVdp;"ahg8+ll^9D/;b -<;$7k?M4=!B&<7]!H6N^rrIDhpAY/E_tO*2Mn/Q]!L0k_rrJXgpAY/jT(`0bYEnn^!On'^rrKrh -pAY09HhRI?drG*]!ShD_rrM4hp&>"mp&>"ep&>"]p&>"ep&>"np&>&$jS&TSC"r@]!HQW^rrIJg -pAY/H_"Rd/NOSfb-*%$5R"?rU62.!`j\JZ)R/ajO6-/e4M1YI%>hlT9>ik^!OTf#~> -JcGKE!MH.[rrIhgpAY/R\+]h&QEKr]!MH7^rrK*hpAY0!P4nnV]8?7]!Q9Q_rrLAgpAY0EDYF)2 -he)Q]!*o3s!)rRj!(uqa!(ce_!)`Fh!*f-r!Ft*^rrHrgpAY/:ch at A>I`D*]!JnD^rrJ7hpAY/] -X7lPoUS7D]!N_^_rrKKgpAY0-LA(WJa+!a^!RPr^rrLegpAY0QA+fj%=nVdp;"ahg8+ll^9D/;b -<;$7k?M4=!B&<7]!H6N^rrIDhpAY/E_tO*2Mn/Q]!L0k_rrJXgpAY/jT(`0bYEnn^!On'^rrKrh -pAY09HhRI?drG*]!ShD_rrM4hp&>"mp&>"ep&>"]p&>"ep&>"np&>&$jS&TSC"r@]!HQW^rrIJg -q#:p)q0fO1i7ul/b/D'*Z`R]GqYqh'aSPtBjjJb\6-.:Ns+8+>aT$5MM<23upHegkR'?YJ!<;IQ -o)AaEBYj_!~> -JcGKE!MH.[rrIhgpAY/R\+]h&QEKr]!MH7^rrK*hpAY0!P4nnV]8?7]!Q9Q_rrLAgpAY0EDYF)2 -he)Q]!*o3s!)rRj!(uqa!(ce_!)`Fh!*f-r!Ft*^rrHrgpAY/:ch at A>I`D*]!JnD^rrJ7hpAY/] -X7lPoUS7D]!N_^_rrKKgpAY0-LA(WJa+!a^!RPr^rrLegpAY0QA+fj%=nVdp;"ahg8+ll^9D/;b -<;$7k?M4=!B&<7]!H6N^rrIDhpAY/E_tO*2Mn/Q]!L0k_rrJXgpAY/jT(`0bYEnn^!On'^rrKrh -pAY09HhRI?drG*]!ShD_rrM4hp&>"mp&>"ep&>"]p&>"ep&>"np&>&$jS&TSC"r@]!HQW^rrIJg -q#:p)q0fO1i7ul/b/D'*Z`R]GqYqg,pZ_b1jcRXa!:ktYrrDUBp[3"tB)cJ[dY[u(_L_d/E -JcGKE!MH.[rrIhgpAY/R\+]h&QEKr]!MH7^rrK*hpAY0!P4nnV]8?7]!Q9Q_rrLAgpAY0EDYF)2 -he)Q]!*o3s!)rRj!(uqa!(ce_!)`Fh!*f-r!Ft*^rrHrgpAY/:ch at A>I`D*]!JnD^rrJ7hpAY/] -X7lPoUS7D]!N_^_rrKKgpAY0-LA(WJa+!a^!RPr^rrLegpAY0QA+fj%=nVdp;"ahg8+ll^9D/;b -<;$7k?M4=!B&<7]!H6N^rrIDhpAY/E_tO*2Mn/Q]!L0k_rrJXgpAY/jT(`0bYEnn^!On'^rrKrh -pAY09HhRI?drG*]!ShD_rrM4hp&>"mp&>"ep&>"]p&>"ep&>"np&>&$jS&TSC"r@]!HQW^rrIJg -q#:p)q0fO1i7ul/b/D'*Z`R]Gqu7u5:]J*.jml4&J,~> -JcGKE!T%)TrrIhgpAY/R\,$%,p!'I5Y4hkrTVV;]!NDU_rrKEgpAY0*M>$rM`. at X^!R5i^rrL\g -pAY0NB(c0(>kS*s;t^.j9(i2a8G2u_;>'qh>P8!sA)[.]!GpE^rrI;hpAY/B`qKE5LqNH]!Kjb_ -rrJOgpAY/gU%\KeXI8e^!ORs^rrKigpAY06IeNdBcuf!]!SM8^rrM+hp&>"pp&>"gp&>"^p&>"b -p&>"kp&>"up&>&)hY-sMDq4R]!I;o_rrI\gpAY/O\b?%(Pd0r^!M$+^rrK!gpAY/sQM1=Z[uL+] -!PsH_rrL8hpAY0BEVBD5ghHK^!Td_^rr?*mrr>gerr>O]rr>gerr?-nrrHQhpAY/-g\q.*q"3t: -i7c[cVSg'UZ)adpR?W_f5 at J_TCLppW;bfkQ:F\\;A8H1,H\%$4OdB at _qYq.i_Z)pCs36E#6-.;' -s,k/amf*4sgj+a5nj3:AdbsQ -JcGKE!T%)TrrIhgpAY/R\,$%,p!'I5Y4hkrTVV;]!NDU_rrKEgpAY0*M>$rM`. at X^!R5i^rrL\g -pAY0NB(c0(>kS*s;t^.j9(i2a8G2u_;>'qh>P8!sA)[.]!GpE^rrI;hpAY/B`qKE5LqNH]!Kjb_ -rrJOgpAY/gU%\KeXI8e^!ORs^rrKigpAY06IeNdBcuf!]!SM8^rrM+hp&>"pp&>"gp&>"^p&>"b -p&>"kp&>"up&>&)hY-sMDq4R]!I;o_rrI\gpAY/O\b?%(Pd0r^!M$+^rrK!gpAY/sQM1=Z[uL+] -!PsH_rrL8hpAY0BEVBD5ghHK^!Td_^rr?*mrr>gerr>O]rr>gerr?-nrrHQhpAY/-g\q.*q"3t: -i7c[cVSg'UZ)adpR?W_f5 at J_TCLppW;bfkQ:F\\;A8H1,H\%$4OdB at _qYq*mo(N.Ys,"ho!:l8/ -s$>cIrVmDAM-S-HK(8p'jmn7[s36/drrJ@]_>f#~> -JcGKE!T%)TrrIhgpAY/R\,$%,p!'I5Y4hkrTVV;]!NDU_rrKEgpAY0*M>$rM`. at X^!R5i^rrL\g -pAY0NB(c0(>kS*s;t^.j9(i2a8G2u_;>'qh>P8!sA)[.]!GpE^rrI;hpAY/B`qKE5LqNH]!Kjb_ -rrJOgpAY/gU%\KeXI8e^!ORs^rrKigpAY06IeNdBcuf!]!SM8^rrM+hp&>"pp&>"gp&>"^p&>"b -p&>"kp&>"up&>&)hY-sMDq4R]!I;o_rrI\gpAY/O\b?%(Pd0r^!M$+^rrK!gpAY/sQM1=Z[uL+] -!PsH_rrL8hpAY0BEVBD5ghHK^!Td_^rr?*mrr>gerr>O]rr>gerr?-nrrHQhpAY/-g\q.*q"3t: -i7c[cVSg'UZ)adpR?W_f5 at J_TCLppW;bfkQ:F\\;A8H1,H\%$4OdB at _qu78r:]J[*s8PmhbsD at q -c1b#NK)P`LQjk\9M9*bWjlQ4haT%+ -JcGHD!HGaGrrIhgpAY/R\,QC6qphm)?r;!7F0>6:!MH7^rrK*hpAY0!P4nnV]8?7]!Q9Q_rrLAg -pAY0EDYF)2he)Q]!*o3s!)rRj!(uqa!(ce_!)`Fh!*f-r!Ft*^rrHrgpAY/:ch at A>I`D*]!JnD^ -rrJ7hpAY/]X7lPoUS7D]!N_^_rrKKgpAY0-LA(WJa+!a^!RPr^rrLegpAY0QA+fj%=nVdp;"ahg -8+ll^9D/;b<;$7k?M4=!B&<7]!H6N^rrIDhpAY/E_tO*2Mn/Q]!L0k_rrJXgpAY/jT(`0bYEnn^ -!On'^rrKrhpAY09HhRI?drG*]!ShD_rrM4hp&>"mp&>"ep&>"]p&>"ep&@?[r:]UEjk\P9b/D$) -6^X^BR?NVbJU2EUBIH\X:eF2N<*3I;C2c"BJV]>NR at pCWZ+%APS^,a=hra7pp\b'kKY[<]!KFSb -s"';Ls$=p0c#E\8aO2^@OiUdis1R1flGADK62s`]s2)#@qsm&QpZhe?s7bgUrrVIcmD8gQ~> -JcGHD!HGaGrrIhgpAY/R\,QC6qphm)?r;!7F0>6:!MH7^rrK*hpAY0!P4nnV]8?7]!Q9Q_rrLAg -pAY0EDYF)2he)Q]!*o3s!)rRj!(uqa!(ce_!)`Fh!*f-r!Ft*^rrHrgpAY/:ch at A>I`D*]!JnD^ -rrJ7hpAY/]X7lPoUS7D]!N_^_rrKKgpAY0-LA(WJa+!a^!RPr^rrLegpAY0QA+fj%=nVdp;"ahg -8+ll^9D/;b<;$7k?M4=!B&<7]!H6N^rrIDhpAY/E_tO*2Mn/Q]!L0k_rrJXgpAY/jT(`0bYEnn^ -!On'^rrKrhpAY09HhRI?drG*]!ShD_rrM4hp&>"mp&>"ep&>"]p&>"ep&@?[r:]UEjk\P9b/D$) -6^X^BR?NVbJU2EUBIH\X:eF2N<*3I;C2c"BJV]>NR at pCWZ+%APS^,a=hra7pp\b'kKY[<]!KFSb -s"#enqZ-BjM7 -JcGHD!HGaGrrIhgpAY/R\,QC6qphm)?r;!7F0>6:!MH7^rrK*hpAY0!P4nnV]8?7]!Q9Q_rrLAg -pAY0EDYF)2he)Q]!*o3s!)rRj!(uqa!(ce_!)`Fh!*f-r!Ft*^rrHrgpAY/:ch at A>I`D*]!JnD^ -rrJ7hpAY/]X7lPoUS7D]!N_^_rrKKgpAY0-LA(WJa+!a^!RPr^rrLegpAY0QA+fj%=nVdp;"ahg -8+ll^9D/;b<;$7k?M4=!B&<7]!H6N^rrIDhpAY/E_tO*2Mn/Q]!L0k_rrJXgpAY/jT(`0bYEnn^ -!On'^rrKrhpAY09HhRI?drG*]!ShD_rrM4hp&>"mp&>"ep&>"]p&>"ep&@?[r:]UEjk\P9b/D$) -6^X^BR?NVbJU2EUBIH\X:eF2N<*3I;C2c"BJV]>NR at pCWZ+%APS^,a=hra7pp\b'kKY[<]!KFSc -s"3Y7s3a45s$>qk62s7!qbPuIlM$pUE;r5lM9+*Fp]$@\X8ddms5j.Pmf2DGqu6`_ -JcGHD!nCE=q#:AK^\7[6NhX+LCJAT0]&EYg!LBn^rrJdgpAY/mSG)s`ZBFq]!P=3^rrL&hpAY0< -GP;%;eo(3]!T.M^rr?[arr>U_rr>phrr?9rrrHWgpAY/0f_5=GG0fm^!Ii&^rrIqg -pAY/U[.aM#RB-&]!Mc@^rrK3hpAY0#OS8\T^4u@]!QTZ_rrLJgpAY0HC\Ic/ia_Z]!*T!p!)W at g -!(Z_^!)*"b!*&Xk!+,?u!G:3^rrI&gpAY/=bkD&;J]%3]!K4M^rrJ at hpAY/`W:p5lVOmM]!O%g_ -rrKTgpAY00K_GEHb'Wj^!Rl&^rrLnhpAY0T at .jO"@V;`F*`@kO#MleV6$r5^;S1 at f%aQPn+HPQrrI/gpAY/?anG`8KY[<]!KFSb -s"(2NT)a`JjT&O]M4Xe":P.0u!1 -JcGHD!nCE=q#:AK^\7[6NhX+LCJAT0]&EYg!LBn^rrJdgpAY/mSG)s`ZBFq]!P=3^rrL&hpAY0< -GP;%;eo(3]!T.M^rr?[arr>U_rr>phrr?9rrrHWgpAY/0f_5=GG0fm^!Ii&^rrIqg -pAY/U[.aM#RB-&]!Mc@^rrK3hpAY0#OS8\T^4u@]!QTZ_rrLJgpAY0HC\Ic/ia_Z]!*T!p!)W at g -!(Z_^!)*"b!*&Xk!+,?u!G:3^rrI&gpAY/=bkD&;J]%3]!K4M^rrJ at hpAY/`W:p5lVOmM]!O%g_ -rrKTgpAY00K_GEHb'Wj^!Rl&^rrLnhpAY0T at .jO"@V;`F*`@kO#MleV6$r5^;S1 at f%aQPn+HPQrrI/gpAY/?anG`8KY[<]!KFSb -ruktST`DS%]`;Xs]j,1$!3rd/!6F^2:L$3aXFLpKX*_rrISA_#Jo~> -JcGHD!nCE=q#:AK^\7[6NhX+LCJAT0]&EYg!LBn^rrJdgpAY/mSG)s`ZBFq]!P=3^rrL&hpAY0< -GP;%;eo(3]!T.M^rr?[arr>U_rr>phrr?9rrrHWgpAY/0f_5=GG0fm^!Ii&^rrIqg -pAY/U[.aM#RB-&]!Mc@^rrK3hpAY0#OS8\T^4u@]!QTZ_rrLJgpAY0HC\Ic/ia_Z]!*T!p!)W at g -!(Z_^!)*"b!*&Xk!+,?u!G:3^rrI&gpAY/=bkD&;J]%3]!K4M^rrJ at hpAY/`W:p5lVOmM]!O%g_ -rrKTgpAY00K_GEHb'Wj^!Rl&^rrLnhpAY0T at .jO"@V;`F*`@kO#MleV6$r5^;S1 at f%aQPn+HPQrrI/gpAY/?anG`8KY[<]!KFSc -s"3sF>_N15s+p_p0$OBg[fG$3!&!Qb!+mj8WrThP!&!'Y!*fMLqZ,'F62pr5qu6\GTYUSX~> -JcGEC!l"a"q>UJL^\[s:p!':Y/jb;sf)5CE!LBn^rrJdgpAY/mSG)s`ZBFq]!P=3^rrL&hpAY0< -GP;%;eo(3]!T.M^rr?[arr>U_rr>phrr?9rrrHWgpAY/0f_5=GG0fm^!Ii&^rrIqg -pAY/U[.aM#RB-&]!Mc@^rrK3hpAY0#OS8\T^4u@]!QTZ_rrLJgpAY0HC\Ic/ia_Z]!*T!p!)W at g -!(Z_^!)*"b!*&Xk!+,?u!G:3^rrI&gpAY/=bkD&;J]%3]!K4M^rrJ at hpAY/`W:p5lVOmM]!O%g_ -rrKTgpAY00K_GEHb'Wj^!Rl&^rrLnhpAY0T@/9g^r:TOA9A7k=`kT$iX/)>QO=>g2G&M)(>?+Eg -92?@/@qfn*I>*Q?QCXg.YdqHcb0\bqj6Q4. -JcGEC!l"a"q>UJL^\[s:p!':Y/jb;sf)5CE!LBn^rrJdgpAY/mSG)s`ZBFq]!P=3^rrL&hpAY0< -GP;%;eo(3]!T.M^rr?[arr>U_rr>phrr?9rrrHWgpAY/0f_5=GG0fm^!Ii&^rrIqg -pAY/U[.aM#RB-&]!Mc@^rrK3hpAY0#OS8\T^4u@]!QTZ_rrLJgpAY0HC\Ic/ia_Z]!*T!p!)W at g -!(Z_^!)*"b!*&Xk!+,?u!G:3^rrI&gpAY/=bkD&;J]%3]!K4M^rrJ at hpAY/`W:p5lVOmM]!O%g_ -rrKTgpAY00K_GEHb'Wj^!Rl&^rrLnhpAY0T@/9g^r:TOA9A7k=`kT$iX/)>QO=>g2G&M)(>?+Eg -92?@/@qfn*I>*Q?QCXg.YdqHcb0\bqj6Q4. -JcGEC!l"a"q>UJL^\[s:p!':Y/jb;sf)5CE!LBn^rrJdgpAY/mSG)s`ZBFq]!P=3^rrL&hpAY0< -GP;%;eo(3]!T.M^rr?[arr>U_rr>phrr?9rrrHWgpAY/0f_5=GG0fm^!Ii&^rrIqg -pAY/U[.aM#RB-&]!Mc@^rrK3hpAY0#OS8\T^4u@]!QTZ_rrLJgpAY0HC\Ic/ia_Z]!*T!p!)W at g -!(Z_^!)*"b!*&Xk!+,?u!G:3^rrI&gpAY/=bkD&;J]%3]!K4M^rrJ at hpAY/`W:p5lVOmM]!O%g_ -rrKTgpAY00K_GEHb'Wj^!Rl&^rrLnhpAY0T@/9g^r:TOA9A7k=`kT$iX/)>QO=>g2G&M)(>?+Eg -92?@/@qfn*I>*Q?QCXg.YdqHcb0\bqj6Q4. -JcGBB!i]MSqYpSM^]+6>jgpRd:3N/IL:?mV!LBn^rrJdgpAY/mSG)s`ZBFq]!P=3^rrL&hpAY0< -GP;%;eo(3]!T.M^rr?[arr>U_rr>phrr?9rrrHWgpAY/0f_5=GG0fm^!Ii&^rrIqg -pAY/U[.aM#RB-&]!Mc@^rrK3hpAY0#OS8\T^4u@]!QTZ_rrLJgpAY0HC\Ic/ia_Z]!*T!p!)W at g -!(Z_^!)*"b!*&Xk!+,?u!G:3^rrI&gpAY/=bkD&;J]%3]!K4M^rrJ at hpAY/`W:p5lVOmM]!O%g_ -rrKTgpAY00K_GEHb'Wj^!Rl&bs#L&NmcVDhd`]SB\$)a(RZrbU07%VQ at pE&07n?HY>p4!'G^bC+ -Q'n;CY-^4+aj8Mmip#q*rVumep&>"ep&>"np&>&$jS&TSC"r@]!HQW^rrIJgpAY/H_"Rd/NOR(1 -"7'Q0rP/A_~> -JcGBB!i]MSqYpSM^]+6>jgpRd:3N/IL:?mV!LBn^rrJdgpAY/mSG)s`ZBFq]!P=3^rrL&hpAY0< -GP;%;eo(3]!T.M^rr?[arr>U_rr>phrr?9rrrHWgpAY/0f_5=GG0fm^!Ii&^rrIqg -pAY/U[.aM#RB-&]!Mc@^rrK3hpAY0#OS8\T^4u@]!QTZ_rrLJgpAY0HC\Ic/ia_Z]!*T!p!)W at g -!(Z_^!)*"b!*&Xk!+,?u!G:3^rrI&gpAY/=bkD&;J]%3]!K4M^rrJ at hpAY/`W:p5lVOmM]!O%g_ -rrKTgpAY00K_GEHb'Wj^!Rl&bs#L&NmcVDhd`]SB\$)a(RZrbU07%VQ at pE&07n?HY>p4!'G^bC+ -Q'n;CY-^4+aj8Mmip#q*rVumep&>"ep&>"np&>&$jS&TSC"r@]!HQW^rrIJgpAY/H_"Rd/NOR(1 -"7'Q0rP/A_~> -JcGBB!i]MSqYpSM^]+6>jgpRd:3N/IL:?mV!LBn^rrJdgpAY/mSG)s`ZBFq]!P=3^rrL&hpAY0< -GP;%;eo(3]!T.M^rr?[arr>U_rr>phrr?9rrrHWgpAY/0f_5=GG0fm^!Ii&^rrIqg -pAY/U[.aM#RB-&]!Mc@^rrK3hpAY0#OS8\T^4u@]!QTZ_rrLJgpAY0HC\Ic/ia_Z]!*T!p!)W at g -!(Z_^!)*"b!*&Xk!+,?u!G:3^rrI&gpAY/=bkD&;J]%3]!K4M^rrJ at hpAY/`W:p5lVOmM]!O%g_ -rrKTgpAY00K_GEHb'Wj^!Rl&bs#L&NmcVDhd`]SB\$)a(RZrbU07%VQ at pE&07n?HY>p4!'G^bC+ -Q'n;CY-^4+aj8Mmip#q*rVumep&>"ep&>"np&>&$jS&TSC"r@]!HQW^rrIJgpAY/H_"Rd/NOR(1 -"7'Q0rP/A_~> -JcG?A"N=T!anku9$%ekOJ6#m/ZJ,9VrrJ.hpAY/ZY4hkrTVV;]!NDU_rrKEgpAY0*M>$rM`. at X^ -!R5i^rrL\gpAY0NB(c0(>kS*s;t^.j9(i2a8G2u_;>'qh>P8!sA)[.]!GpE^rrI;hpAY/B`qKE5 -LqNH]!Kjb_rrJOgpAY/gU%\KeXI8e^!ORs^rrKigpAY06IeNdBcuf!]!SM8^rrM+hp&>"pp&>"g -p&>"^p&>"bp&>"kp&>"up&>&)hY-sMDq4R]!I;o_rrI\gpAY/O\b?%(Pd0r^!M$+^rrK!gpAY/s -QM1=Z[uL+]!PsHcs"s]ImcUffdEBD=[&g*qQ]R&?2KN\G?<0ln8l&Jo<\/9:JVTAQS>3*h\>r6I -eCrmFn+Q_Yrr?*mrr>gerr>O]rr>gerr?-nrrHQhpAY/-g\1XJEmj[]!IMr^rrIegq#:HR[oTu^ -rrh/G;P!g$s*t~> -JcG?A"N=T!anku9$%ekOJ6#m/ZJ,9VrrJ.hpAY/ZY4hkrTVV;]!NDU_rrKEgpAY0*M>$rM`. at X^ -!R5i^rrL\gpAY0NB(c0(>kS*s;t^.j9(i2a8G2u_;>'qh>P8!sA)[.]!GpE^rrI;hpAY/B`qKE5 -LqNH]!Kjb_rrJOgpAY/gU%\KeXI8e^!ORs^rrKigpAY06IeNdBcuf!]!SM8^rrM+hp&>"pp&>"g -p&>"^p&>"bp&>"kp&>"up&>&)hY-sMDq4R]!I;o_rrI\gpAY/O\b?%(Pd0r^!M$+^rrK!gpAY/s -QM1=Z[uL+]!PsHcs"s]ImcUffdEBD=[&g*qQ]R&?2KN\G?<0ln8l&Jo<\/9:JVTAQS>3*h\>r6I -eCrmFn+Q_Yrr?*mrr>gerr>O]rr>gerr?-nrrHQhpAY/-g\1XJEmj[]!IMr^rrIegq#:HR[oTu^ -rrh/G;P!g$s*t~> -JcG?A"N=T!anku9$%ekOJ6#m/ZJ,9VrrJ.hpAY/ZY4hkrTVV;]!NDU_rrKEgpAY0*M>$rM`. at X^ -!R5i^rrL\gpAY0NB(c0(>kS*s;t^.j9(i2a8G2u_;>'qh>P8!sA)[.]!GpE^rrI;hpAY/B`qKE5 -LqNH]!Kjb_rrJOgpAY/gU%\KeXI8e^!ORs^rrKigpAY06IeNdBcuf!]!SM8^rrM+hp&>"pp&>"g -p&>"^p&>"bp&>"kp&>"up&>&)hY-sMDq4R]!I;o_rrI\gpAY/O\b?%(Pd0r^!M$+^rrK!gpAY/s -QM1=Z[uL+]!PsHcs"s]ImcUffdEBD=[&g*qQ]R&?2KN\G?<0ln8l&Jo<\/9:JVTAQS>3*h\>r6I -eCrmFn+Q_Yrr?*mrr>gerr>O]rr>gerr?-nrrHQhpAY/-g\1XJEmj[]!IMr^rrIegq#:HR[oTu^ -rrh/G;P!g$s*t~> -JcGNF!Q'Hers\_/FA#:k0Hq)K/NQGu:'!FCp.bWN5k[qR5!Sa9!C&a@:'!XBp.bWT3qc;L6oam8 -!Cf$A:'!jCp.bWZ2"aTD1\FKC1%e9A0D/'?0D/'?1%e9A1A+BC1eIC9!B!C@:'!:Cp.bWJ7.s at V -3^WO8!BWU@:'!LCp.kWOp.bWR4SDMN5s+d8!CJpA:'!aBp.bWX2tfuI7lC!8!D,-@:&m'B:&m!@ -:&ls?:&m!@:&m$A:&m*C:'!1Bp.bWH8+o[Y2b!F8!BERA:'!CBp.bWN5k[qR4[8X8!C&dA:'!UB -q+`\>91V-#5sIIm3&WTJ0.\Rs)^?LJ*?,h2'c7i/)]'_G-RgT!0JYID3Ai9O6:=:68ko7Z!D#'@ -:'!pBohGKBohGK at ohGK>ohGK at ohGKBohGND8bPm[2+[F9!B*F@:'!=Cp.bWK6iBac8j+mS(`b%U -6I&=/:eG5llM^_g0*Vt34_U"uo#^o^~> -JcGNF!Q'Hers\_/FA#:k0Hq)K/NQGu:'!FCp.bWN5k[qR5!Sa9!C&a@:'!XBp.bWT3qc;L6oam8 -!Cf$A:'!jCp.bWZ2"aTD1\FKC1%e9A0D/'?0D/'?1%e9A1A+BC1eIC9!B!C@:'!:Cp.bWJ7.s at V -3^WO8!BWU@:'!LCp.kWOp.bWR4SDMN5s+d8!CJpA:'!aBp.bWX2tfuI7lC!8!D,-@:&m'B:&m!@ -:&ls?:&m!@:&m$A:&m*C:'!1Bp.bWH8+o[Y2b!F8!BERA:'!CBp.bWN5k[qR4[8X8!C&dA:'!UB -q+`\>91V-#5sIIm3&WTJ0.\Rs)^?LJ*?,h2'c7i/)]'_G-RgT!0JYID3Ai9O6:=:68ko7Z!D#'@ -:'!pBohGKBohGK at ohGK>ohGK at ohGKBohGND8bPm[2+[F9!B*F@:'!=Cp.bWK6iBac8j+mS(`b%U -6I&=/:eG5llM^_g0*Vt34_U"uo#^o^~> -JcGNF!Q'Hers\_/FA#:k0Hq)K/NQGu:'!FCp.bWN5k[qR5!Sa9!C&a@:'!XBp.bWT3qc;L6oam8 -!Cf$A:'!jCp.bWZ2"aTD1\FKC1%e9A0D/'?0D/'?1%e9A1A+BC1eIC9!B!C@:'!:Cp.bWJ7.s at V -3^WO8!BWU@:'!LCp.kWOp.bWR4SDMN5s+d8!CJpA:'!aBp.bWX2tfuI7lC!8!D,-@:&m'B:&m!@ -:&ls?:&m!@:&m$A:&m*C:'!1Bp.bWH8+o[Y2b!F8!BERA:'!CBp.bWN5k[qR4[8X8!C&dA:'!UB -q+`\>91V-#5sIIm3&WTJ0.\Rs)^?LJ*?,h2'c7i/)]'_G-RgT!0JYID3Ai9O6:=:68ko7Z!D#'@ -:'!pBohGKBohGK at ohGK>ohGK at ohGKBohGND8bPm[2+[F9!B*F@:'!=Cp.bWK6iBac8j+mS(`b%U -6I&=/:eG5llM^_g0*Vt34_U"uo#^o^~> -JcGTH"4(atf_tgUnA:Q,:3WDVpOW?qs+13$s1&(_qXWq3gsaKc]X4c9SX#7jIWfXB?s$5s7ob5?Mc;;E$4$e<#SSC?:i2K-dGaQm -ec1.~> -JcGTH"4(atf_tgUnA:Q,:3WDVpOW?qs+13$s1&(_qXWq3gsaKc]X4c9SX#7jIWfXB?s$5s7ob5?Mc;;E$4$e<#SSC?:i2K-dGaQm -ec1.~> -JcGTH"4(atf_tgUnA:Q,:3WDVpOW?qs+13$s1&(_qXWq3gsaKc]X4c9SX#7jIWfXB?s$5s7ob5?Mc;;E$4$e<#SSC?:i2K-dGaQm -ec1.~> -JcGZJ%c2D:_>jQ&^6)l$IB;&uJcC<$JcC<$bl9?qp[@;%f$MFN[]ZO"QB$]KG]%/$=&2=Y;HdLF -EI!+lOI2]=YIVEfcILb4m.C1+s1SF=nAh)A:1]Enhu:.c$2iVmN`n.Z*ubso%1j3i)CRUCBRGu; -Z+J'*hs:$ss*t~> -JcGZJ%c2D:_>jQ&^6)l$IB;&uJcC<$JcC<$bl9?qp[@;%f$MFN[]ZO"QB$]KG]%/$=&2=Y;HdLF -EI!+lOI2]=YIVEfcILb4m.C1+s1SF=nAh)A:1]Enhu:.c$2iVmN`n.Z*ubso%1j3i)CRUCBRGu; -Z+J'*hs:$ss*t~> -JcGZJ%c2D:_>jQ&^6)l$IB;&uJcC<$JcC<$bl9?qp[@;%f$MFN[]ZO"QB$]KG]%/$=&2=Y;HdLF -EI!+lOI2]=YIVEfcILb4m.C1+s1SF=nAh)A:1]Enhu:.c$2iVmN`n.Z*ubso%1j3i)CRUCBRGu; -Z+J'*hs:$ss*t~> -JcG`L%,656[-PAc?W2N]h>W!*JcC<$JcFU,/bnethq-2q^:(2ASX#1gHus7:>Z=Bd:0(\5DKpVb -Ng?96Y-u'acdpq6mIgF/s/Q)*rS"N4?;PpBbk8+<.e:ulO`3o]:JOJE/fkuO)'LOg5"8(56UXgY -Ble`[Q(=hX]#;nIiTg"3pA]X~> -JcG`L%,656[-PAc?W2N]h>W!*JcC<$JcFU,/bnethq-2q^:(2ASX#1gHus7:>Z=Bd:0(\5DKpVb -Ng?96Y-u'acdpq6mIgF/s/Q)*rS"N4?;PpBbk8+<.e:ulO`3o]:JOJE/fkuO)'LOg5"8(56UXgY -Ble`[Q(=hX]#;nIiTg"3pA]X~> -JcG`L%,656[-PAc?W2N]h>W!*JcC<$JcFU,/bnethq-2q^:(2ASX#1gHus7:>Z=Bd:0(\5DKpVb -Ng?96Y-u'acdpq6mIgF/s/Q)*rS"N4?;PpBbk8+<.e:ulO`3o]:JOJE/fkuO)'LOg5"8(56UXgY -Ble`[Q(=hX]#;nIiTg"3pA]X~> -Jc?)Wf6^DKNF>b;Z/C35JcC<$JcG3=/,/MphUToi]X+Z5R?<>WG]@A'<_c+X=-QCb"X -\%g#2g>M2apjrI2rs8)3RrV58O1XDGs"E``Xc@>e!`;HmaLFF8b#Pam7~> -Jc?)Wf6^DKNF>b;Z/C35JcC<$JcG3=/,/MphUToi]X+Z5R?<>WG]@A'<_c+X=-QCb"X -\%g#2g>M2apjrI2rs8)3RrV58O1XDGs"E``Xc@>e!`;HmaLFF8b#Pam7~> -Jc?)Wf6^DKNF>b;Z/C35JcC<$JcG3=/,/MphUToi]X+Z5R?<>WG]@A'<_c+X=-QCb"X -\%g#2g>M2apjrI2rs8)3RrV58O1XDGs"E``Xc@>e!`;HmaLFF8b#Pam7~> -K)Z(q>r5#HJ$7^[s+13$s+12#rUfF8g -K)Z(q>r5#HJ$7^[s+13$s+12#rUfF8g -K)Z(q>r5#HJ$7^[s+13$s+12#rUfF8g -LAqMTb&T!R=K1,-s+13$s,m=0p$LendE')2Xe_GKMLTeeAR&/,85NGuCNOuZNgHE -LAqMTb&T!R=K1,-s+13$s,m=0p$LendE')2Xe_GKMLTeeAR&/,85NGuCNOuZNgHE -LAqMTb&T!R=K1,-s+13$s,m=0p$LendE')2Xe_GKMLTeeAR&/,85NGuCNOuZNgHE -M>mh7Vf+@<9W7l?s+13$s.fTBrU]=4f?M7FZ)F=\N.cLsBO=e77Sd,pC3+cWNgHH=Zb=?'fAGf^ -qLSZts5O%brR\6,>>osId.`1m*W"[3V28t_=`TP'a6!9efYXbWKPag^=ClGrIY*0%~> -M>mh7Vf+@<9W7l?s+13$s.fTBrU]=4f?M7FZ)F=\N.cLsBO=e77Sd,pC3+cWNgHH=Zb=?'fAGf^ -qLSZts5O%brR\6,>>osId.`1m*W"[3V28t_=`TP'a6!9efYXbWKPag^=ClGrIY*0%~> -M>mh7Vf+@<9W7l?s+13$s.fTBrU]=4f?M7FZ)F=\N.cLsBO=e77Sd,pC3+cWNgHH=Zb=?'fAGf^ -qLSZts5O%brR\6,>>osId.`1m*W"[3V28t_=`TP'a6!9efYXbWKPag^=ClGrIY*0%~> -NW0:N\:mjY:Hs]nJcC<$JcE(V-M?]afZqOMZDjI^N.cLsB3nP185WT%DKgYhPan\U\A?>:gu\#! -JcC<$dJjL>_jPI=Bp$$hJcGKE(@KSWR!W76@==QPdHpo5rT_qKXI"NVJ,~> -NW0:N\:mjY:Hs]nJcC<$JcE(V-M?]afZqOMZDjI^N.cLsB3nP185WT%DKgYhPan\U\A?>:gu\#! -JcC<$dJjL>_jPI=Bp$$hJcGKE(@KSWR!W76@==QPdHpo5rT_qKXI"NVJ,~> -NW0:N\:mjY:Hs]nJcC<$JcE(V-M?]afZqOMZDjI^N.cLsB3nP185WT%DKgYhPan\U\A?>:gu\#! -JcC<$dJjL>_jPI=Bp$$hJcGKE(@KSWR!W76@==QPdHpo5rT_qKXI"NVJ,~> -OoGdbbEl^;IXYI2YOmDGJcC<$`W%:`o]b8abegooV4<^)IW]F7=AD=]=^u8kJVfP[V6 at DFb1,81 -nG7_9JcEUe$2iDZKj.K(VpP3is6]gqr8P_rOE+DsBnW4nfCJq at J,~> -OoGdbbEl^;IXYI2YOmDGJcC<$`W%:`o]b8abegooV4<^)IW]F7=AD=]=^u8kJVfP[V6 at DFb1,81 -nG7_9JcEUe$2iDZKj.K(VpP3is6]gqr8P_rOE+DsBnW4nfCJq at J,~> -OoGdbbEl^;IXYI2YOmDGJcC<$`W%:`o]b8abegooV4<^)IW]F7=AD=]=^u8kJVfP[V6 at DFb1,81 -nG7_9JcEUe$2iDZKj.K(VpP3is6]gqr8P_rOE+DsBnW4nfCJq at J,~> -PlD*PYBiraUnW34N75b9Li#cASudFN0^*8ZFn3'g>hSp -JcC<$ZMt3t_jPI;Bp60jJcF^/$23)fV2&k`;fRYE~> -PlD*PYBiraUnW34N75b9Li#cASudFN0^*8ZFn3'g>hSp -JcC<$ZMt3t_jPI;Bp60jJcF^/$23)fV2&k`;fRYE~> -PlD*PYBiraUnW34N75b9Li#cASudFN0^*8ZFn3'g>hSp -JcC<$ZMt3t_jPI;Bp60jJcF^/$23)fV2&k`;fRYE~> -R/[Tib*647NkW/`:j]qOJcC<$JcFg2,PCB\f$)"?XJ2)AK6_EH>#7[`=CQ&hJ;TS_W3X(Ud+[RK -pjrHrs.oZ$r7S9.?;l9Md.`+kf)Gg at e[^2~> -R/[Tib*647NkW/`:j]qOJcC<$JcFg2,PCB\f$)"?XJ2)AK6_EH>#7[`=CQ&hJ;TS_W3X(Ud+[RK -pjrHrs.oZ$r7S9.?;l9Md.`+kf)Gg at e[^2~> -R/[Tib*647NkW/`:j]qOJcC<$JcFg2,PCB\f$)"?XJ2)AK6_EH>#7[`=CQ&hJ;TS_W3X(Ud+[RK -pjrHrs.oZ$r7S9.?;l9Md.`+kf)Gg at e[^2~> -S,Wo^Z?o>iWR\P.:3X&6JcC<$JcG?A,PgcffZh:BY+h;DKR%HG>#.U`=_)DqK8u=nXLH'jfAPre -rdk*#s-EZjnALf99kTU"k(3QXs*t~> -S,Wo^Z?o>iWR\P.:3X&6JcC<$JcG?A,PgcffZh:BY+h;DKR%HG>#.U`=_)DqK8u=nXLH'jfAPre -rdk*#s-EZjnALf99kTU"k(3QXs*t~> -S,Wo^Z?o>iWR\P.:3X&6JcC<$JcG?A,PgcffZh:BY+h;DKR%HG>#.U`=_)DqK8u=nXLH'jfAPre -rdk*#s-EZjnALf99kTU"k(3QXs*t~> -TDoB"eXgAOMSR6&CJ]VroR[$ns+11nq -TDoB"eXgAOMSR6&CJ]VroR[$ns+11nq -TDoB"eXgAOMSR6&CJ]VroR[$ns+11nq -UAk\s_i%H+Q`6U":MulTrIP!"s,[1'q -UAk\s_i%H+Q`6U":MulTrIP!"s,[1'q -UAk\s_i%H+Q`6U":MulTrIP!"s,[1'q -V>gtn[s^kWG^F$tG+d%OJcC<$SGsc3o&ncR`42qCR#HT>CLC.693,J;GCkgAUTV/Gce at LLqgncu -s+14=rsAYZZ\`$cH)8dZJcERdJ,~> -V>gtn[s^kWG^F$tG+d%OJcC<$SGsc3o&ncR`42qCR#HT>CLC.693,J;GCkgAUTV/Gce at LLqgncu -s+14=rsAYZZ\`$cH)8dZJcERdJ,~> -V>gtn[s^kWG^F$tG+d%OJcC<$SGsc3o&ncR`42qCR#HT>CLC.693,J;GCkgAUTV/Gce at LLqgncu -s+14=rsAYZZ\`$cH)8dZJcERdJ,~> -WrEP-mD4r?rpo4*cbm5nTp:I`Eb8NO7oEZ-Fb,LNORkts1JA^~> -WrEP-mD4r?rpo4*cbm5nTp:I`Eb8NO7oEZ-Fb,LNORkts1JA^~> -WrEP-mD4r?rpo4*cbm5nTp:I`Eb8NO7oEZ-Fb,LNORkts1JA^~> -hu=,`o^(\sg==Tsccs\XrQ6Y7cHt"hf at es8hr<\XkN_F!ki_'fio&bJd`fbDYbdkJHYZM4+sop/ -[+"Jps+13TruUq$hpf]ZYG at MCIrf7,:InDjC3G/fR&$pta3ri0on!-os+14#rs7MjN+,S,U!!"Y -s1&)Z~> -hu=,`o^(\sg==Tsccs\XrQ6Y7cHt"hf at es8hr<\XkN_F!ki_'fio&bJd`fbDYbdkJHYZM4+sop/ -[+"Jps+13TruUq$hpf]ZYG at MCIrf7,:InDjC3G/fR&$pta3ri0on!-os+14#rs7MjN+,S,U!!"Y -s1&)Z~> -hu=,`o^(\sg==Tsccs\XrQ6Y7cHt"hf at es8hr<\XkN_F!ki_'fio&bJd`fbDYbdkJHYZM4+sop/ -[+"Jps+13TruUq$hpf]ZYG at MCIrf7,:InDjC3G/fR&$pta3ri0on!-os+14#rs7MjN+,S,U!!"Y -s1&)Z~> -li/I*grm7+Q\Tm(?r]ij:g7==C2\9O5_XguF!h -li/I*grm7+Q\Tm(?r]ij:g7==C2\9O5_XguF!h -li/I*grm7+Q\Tm(?r]ij:g7==C2\9O5_XguF!h -oD]L&jiFNfHXoiMB6fE*Z+\<3jn&>trrq/L?XB8TJcC<$`r@(RlJBt-\?)W^.bLbeCr.4m!s+13brs7YsO(M..T#^DQs0)HQ~> -oD]L&jiFNfHXoiMB6fE*Z+\<3jn&>trrq/L?XB8TJcC<$`r@(RlJBt-\?)W^.bLbeCr.4m!s+13brs7YsO(M..T#^DQs0)HQ~> -oD]L&jiFNfHXoiMB6fE*Z+\<3jn&>trrq/L?XB8TJcC<$`r@(RlJBt-\?)W^.bLbeCr.4m!s+13brs7YsO(M..T#^DQs0)HQ~> -q#:cea/">t8mZh0ZH1qsb5VY)Tj_<%gk#KVs3gofrpf($b.Y$SQAKs+A6)5r>%Vi+N1$NI^<>-h -nGRqrIP!Ls*t~> -q#:cea/">t8mZh0ZH1qsb5VY)Tj_<%gk#KVs3gofrpf($b.Y$SQAKs+A6)5r>%Vi+N1$NI^<>-h -nGRqrIP!Ls*t~> -q#:cea/">t8mZh0ZH1qsb5VY)Tj_<%gk#KVs3gofrpf($b.Y$SQAKs+A6)5r>%Vi+N1$NI^<>-h -nGRqrIP!Ls*t~> -rVm5l`LM'I=F6UThtk at m"mN""=IIins+14+ruCt*j4),[XIkZ0G\^V^7oNi5HA@`YYIr!.j6uns -s+13$s/Q))ke< -rVm5l`LM'I=F6UThtk at m"mN""=IIins+14+ruCt*j4),[XIkZ0G\^V^7oNi5HA@`YYIr!.j6uns -s+13$s/Q))ke< -rVm5l`LM'I=F6UThtk at m"mN""=IIins+14+ruCt*j4),[XIkZ0G\^V^7oNi5HA@`YYIr!.j6uns -s+13$s/Q))ke< -#i;e>>>omEc1/^O"nAj9<0>U[s+145ru1Iif?1b0Tp1:VC0aV+ -#i;e>>>omEc1/^O"nAj9<0>U[s+145ru1Iif?1b0Tp1:VC0aV+ -#i;e>>>omEc1/^O"nAj9<0>U[s+145ru1Iif?1b0Tp1:VC0aV+ -"(@8*k/I?#nc&OmqnmkZMp)'Ms+^OSq"!qS)Z&dTcbQoaQ\g*- at 8fZo?Yt.GQDCe#bhD7QJcC<$ -JcD5>%Gb%7s8VN*R;Yi8PeZI6s.01?~> -"(@8*k/I?#nc&OmqnmkZMp)'Ms+^OSq"!qS)Z&dTcbQoaQ\g*- at 8fZo?Yt.GQDCe#bhD7QJcC<$ -JcD5>%Gb%7s8VN*R;Yi8PeZI6s.01?~> -"(@8*k/I?#nc&OmqnmkZMp)'Ms+^OSq"!qS)Z&dTcbQoaQ\g*- at 8fZo?Yt.GQDCe#bhD7QJcC<$ -JcD5>%Gb%7s8VN*R;Yi8PeZI6s.01?~> -_Z'n<)#;aF;g,bHJcCH("5.`0]D_aJq!-YZ^TjMtL3RE:9hSW&G(c'OXh2[*jRN5#s+13$s,d6g -mW&L3FGO7%I&GBfJcD/ -_Z'n<)#;aF;g,bHJcCH("5.`0]D_aJq!-YZ^TjMtL3RE:9hSW&G(c'OXh2[*jRN5#s+13$s,d6g -mW&L3FGO7%I&GBfJcD/ -_Z'n<)#;aF;g,bHJcCH("5.`0]D_aJq!-YZ^TjMtL3RE:9hSW&G(c'OXh2[*jRN5#s+13$s,d6g -mW&L3FGO7%I&GBfJcD/ -`;^)*:B1AgA#JUCs+UISpng=U!"iU^BNe&&>A8;9PbPCsbhMFWJcC<$JcCE'!r7lirW!!b\Di)> -PlH7~> -`;^)*:B1AgA#JUCs+UISpng=U!"iU^BNe&&>A8;9PbPCsbhMFWJcC<$JcCE'!r7lirW!!b\Di)> -PlH7~> -`;^)*:B1AgA#JUCs+UISpng=U!"iU^BNe&&>A8;9PbPCsbhMFWJcC<$JcCE'!r7lirW!!b\Di)> -PlH7~> -`W#t7')hk2JFidCihU[*JR>!U"(QGJiV`]X_FY^MrW!([cJ7^\JcC<$_Z'`,Z[-57?b9YG=YBUq -!&;K#"(QPRk(3Q[s*t~> -`W#t7')hk2JFidCihU[*JR>!U"(QGJiV`]X_FY^MrW!([cJ7^\JcC<$_Z'`,Z[-57?b9YG=YBUq -!&;K#"(QPRk(3Q[s*t~> -`W#t7')hk2JFidCihU[*JR>!U"(QGJiV`]X_FY^MrW!([cJ7^\JcC<$_Z'`,Z[-57?b9YG=YBUq -!&;K#"(QPRk(3Q[s*t~> -qYpWjb.#s.%(OFQs8V7_+$!89L<0&f"RqLTQ-k0ES`L%9d["!qn,*+frTVY:kCNYas1nX -qYpWjb.#s.%(OFQs8V7_+$!89L<0&f"RqLTQ-k0ES`L%9d["!qn,*+frTVY:kCNYas1nX -qYpWjb.#s.%(OFQs8V7_+$!89L<0&f"RqLTQ-k0ES`L%9d["!qn,*+frTVY:kCNYas1nX -r;Qo[Jkp`TeWBu]:OqL"n,EL\7[Nt&s-Wfgqj^mQJcC<$\,QR/?[1shs+14 at rr`"[@IA^HeGk%~> -r;Qo[Jkp`TeWBu]:OqL"n,EL\7[Nt&s-Wfgqj^mQJcC<$\,QR/?[1shs+14 at rr`"[@IA^HeGk%~> -r;Qo[Jkp`TeWBu]:OqL"n,EL\7[Nt&s-Wfgqj^mQJcC<$\,QR/?[1shs+14 at rr`"[@IA^HeGk%~> -rVlu$ -rVlu$ -rVlu$ -rr3&$&F[pE!q0Wco)AddA?kG"!VcK at rrVW_qs+1]o'-/UqrRSOrrDflrrN#kg&D'CqYpWkqtnS: -!hj&rJcC<$])MecVW\!ZqZ-B at rr`/`s82-^!W2W=s8VZ_rrM]PcN!qA!;FP6!f_$nJcF=$J,~> -rr3&$&F[pE!q0Wco)AddA?kJ#s8)fjeGfU8s82*]!:oCS!r(gRrr2uhrVlomqqD&NqtKse!VcK6 -rrSm&p4<6ps1842L8O/6!r)Tdec5[?l2LbXd/O18p\X[a!TiaprrVrlpW*:8NGSKCs474#~> -rr3&$&F[pE!q0Wco)AddA?kJ#!r)Tdec,aKlMpbIrrN#kl2LePlM^__p\k*lo%F$Cp\OpiqZ-B5 -rrSm&p4<6ps1842L8O/6!r)Thec,^=p\X7U!:nM:!p][[pAY0OpWid?p\Xj.rrS0rqgndus*t~> -s8N/#@eItF!qm&$oD\ilI-U_6nkYCbhZ"M^:B65;R/d23E,[H0:N/TcGlWp+aT([?B(#Nq!MqF6 -rs6(dT3R!JblI22rrKf3/!+p19fBiM[tuJcE@^!nCHKkPkY*M-TK*ru&'AE,\V.s48lc!56e\GlW+UMJrR`s49Q!qYpWb -!5e.'"l)m>JhFP!rrfT&M#ci9rr_\$:TO0g#1 -s8N/#@eItF!qm&$oD\ilI-U_6aGE^`hZ"JA!)J2!^&RgmM,/`t!.k2_Aj1/6mf1lkOno"XAr5gQ -#Dl6Q0!YGK!<)ouE3&[3"ePdH>[6jerrVTgaSYu>nj/,Lr;R5o:B9#;:B8Xk!2%[>H2dgLf)U*0 -!+p19h!+h>J>[tuJcE@^!nCHKkPkU?[mAjM)1hj?>\5`:M'TY!6sO'!f=BPqu7,+!.t6U!-uum:Y^O%i;W`] ->QDij!/X!ujo5@$[t4S1s*t~> -s8N/#@eItF!qm&$oD\ilI-U_5M6Tk4ru%j;E,\V2s49Q!!5ct\GlW+UK0`cBs0jViqYpW^!6FL+ -#kD5GQnI"jAr6Kd!LJ -V*XJJ"ePdH>\ -"97:ZnB1b4nQ+Q?rrW.%jQcaImWk2Tr;QbKoD\jQR.L=pbqB%e!8$cAqu:s,V>lpFs/Y8^!9O7* -aSGi:qa(#W!V4k9rs@*Ro)J_cOoI`Ao)ArHs8PC0s,er#rr^l)fBW;6!bT-Hqu7Pc0)ttG!;HLG -df5[7^&S,/!5ec'OoNZ+o'65VkuR_5s+13_rrIY]k5PP)V0Vt:rrL!XoD\iYmdpGq0%0cV:]HQ6 -s5ejWjo5>Xqk)I?63$tWo(i:dR)8Xu!T<8;rrndPs31Q7q#:B3aS>c<0$XF*^%hU.X,6HJ#0l90 -!;lYcp\t5Fo`"shc2 at SDaJF1Zqu7Kcc2[g2OoNZYs8)dKs8Vrr0)teKp\uk.k5PM:@fCrYfDg@~> -"97:ZnB1b4nQ+Q?rrW.%jQcaHaJEkRrrM5KoD\j)aRfEKM37hZ!;F_-63$tI -p\Fgif7Net!Slu6rs4uXs8Vfnc1`j]rs7_Rs8)fnrr at oBrr\Y0aSYr9"7g`"i;_Kl(Z!KlsErr@?9rttJ1qu6YgrrCLI -Z+["6f)Yj&aHusas8R'5rrGFVq#:B>qtL*n0%0cV!;HKoOn/>J"nDZns)@8urrGpDoD]#ks478N -f?!ae!Tf^@rrME:r;QhT_Kl%Y)>=.*s8O_"s+um -"97:ZnB1b4nQ+Q?rrW.%jQcaHM7nN=rrKgXoD\iRmdpGp0%0cO:]H96s58aTlMCSUpSF5WM?!U- -q#:A^aS>c9deEJ8#XOjXs3^o8aH?&n#eeL_dR!p(!6sm1!aP$8r;Ql9X*OU>rtn&Hs8S4Ks2[M+ -pAciGs8)dKs7ZNfs"9GurrVFcr.4m!s1J at 4J@anC!cYELrVloqK(K!Cje)/E(s##CmJtl0!;leA -lDsrPR/a5P:B893nt5aX!V]CarrC= -!rm\VaSu:LI.dL?d;S:L)Z-eVlLK4WR'?XYR!CAOM#ao>6"XAu/s5RIM#_:Irr4n$ -!;fQ(!0R;DTDt:(E;SR4Asfh'R/]Iss*7E?mXf&Cs1N\RaRXV.>jdu)0!Udq6'8h\E97*!"fpFq -qZ,RRru''6s8VWio)D"ss.=Qhs8Q[saT%Wis0i"&l2Ld)b^oeFs1SF6p/(PHs(:B;V>mf_:[S3f -\RpZuM4a2gdeA$=B&!B3p](9jH%K:gqg!cuR/]Ihs*94rWrT4#o)Ja\!:KmeaK#;ds-W*BH%K;h -pMc5paT%WQE;T\8i*69;aDbC'grOG>E86hCs0i"&pJY[\H2k.3:[S3fgp)H9jd:$iH)ptYGu)NLJnCYTs7-0Xs8U]&>fb/BZ"C&A!18V8mOlr$AnH"eJm at 81!3uP' -"m+"*s5bm3rtn&Cs8SICs3`P"mVi0Cs0lr5s7-0aqZ*JSrrHZbJcF@%J,~> -!rm\VaSu:LI.dL?d;S:L1?HrVs4;j7c#>;BE01-j>lS'$s-SX/joAZEs8VtAJm=]CT7U="pQ:(- -YlOgZ!.t+Brr4N%c2[gbYlK(LOm`73JjJ#gOblAds,hSGqu?]X>QE#R>Yg3=!5d?"M#[Osrr4m5 -B(l:;!57f4c0g0qTDuTV6-+!t^%VO(rrAnqf7Hf>s-SX/lJ->tM=PVJ!82=R!6p?#On/MO"gPc/ -jT,2WrtplTs8ULIs7ZNas*7Cls57Jho)C>js):ctrrI/aJcC<$^&J0-;#'2Q)85.(s+6kJhuJ&- -AnGdRf?F>;E<"^4E/FVQ ->_rIOmXf&Crr5R7/j]B,Jm^d:V(ThAdVphG:Y3hknsG"]Z&s -!rm\VaSu:LI.dL?d;S:L:;Yqis/VM_joAYsAqDXbV=#tapN_%'fDp3ks8V2"E+Zf\H$NYes$=a+ -E/FUq!3?.js8VWimf3dma?\_aT%WZ6/hlLgs&.bhuMC/Z%?6BpN_%'qmUiUZ.ET>0&:,k!9R&W\,QC2i6n7t -Z#K[A(dZFHs,iHDbsDBtGlY_]Z#EM=nc8F]!2\oZ!HQD8s+13`rrVmjpu_SoX4PG`H&8/o!19.* -/sS`sT4\,:JjIIs0"q8a)8^Z(E8\TY>]AWG0)sN'lLt9SlMpb]s,iHCrtLbCn=H!I!4!;H?jV>n#M>hAOlM4^gKR-oQ -!q]:^aSu>9;"F>[!NqgOrtWUNs2aq#s2"ctmQpEq0()%*aK*aGrr3`(0)pNqs"=2n:]JiCJcIG# -s6;lMX8`,MObs,a<60/*k/qWMR!1mN7dK&]$ -dd at +n_Lf$ga8j:Ip[3>$63$s\5lblls(7Y'!8^$AaK'ots-RcB!9Le2s1O$as0jUmdes+Gc27M? -(t&D'E+T+ at s$=a+R+q\iaL>Eqs-NdP6/:](!M-6As+13`rrLbiiVsVmfA,qZaSPtBjjJb\6-+Z! -s)@O)p\t2BaEder7;0%^,!:M'UDs8T,"61Y'Unc87\s2`:C!3rBcK!G?CE/D((H-!6da8j<> -DudTOs"=2n:]E'EbtnA,!'rp+s4i5+!:Bj=h"$TKjT*OXK#.NLmf.k=H2l"OoM\k -jY#ses2_6QR'?YZs7-0\s8O,?]n-7aV#[.fpHei-K)\-Xl2]G]!6m-Js5eM+V=OTb!W1.?s8Pmp -E"jpes331rm[0h's(9M.s7-.c!2'/MrrJ.iJcF@%J,~> -!q]:^aSu>9;"F>[!NqgOrtU-Xo%_ZMs+54Oo.L'*M8G,LOk5`?rr3_XH2dlrnc8]AV>ln_GlX!, -s31NDfDbe$0$XFraN3HC\"E**B)g9ZaDh0mK!A+r!6F);!58F4>c[T!jiq'1!3t>[aSu3!QiQ[W -pW*@7H,sTbYlNc9s2_%bM?!;M>QCDnrrBof!5aTmOk0Tus":d4E92S_s)?'ZnsBE6jo,2[qp#*> -(mlppE*P^/pAjdaH-u]iK%C"ns$8pNE:2ri!M-6As+13`rrLbiir9ba!;jY5620XEfB&.9rrDUB -p[3"p62gftK#mfhpO^K`!;H3fGqK*^s8R?EH2dgEdK':HA!-Mp!8r/&!:'S:[fGjr!:j`hYlO at 9 -5sa-&nc8]AV=FWdJu/K55lblls09&p!:g-e_Z)prYtrUEaF\Bmqs$HIX8e='rrDW,!9NW$df4US -Z%BiLs,kn5_L_dfs3^oIru^>&dOp.O>V=;$dY\!daSu82_>r\p:X&m\s3a\/^&.d.!UA;9rttJ1 -AoM\hc2Wo_s2`8WOnX^)M>u!(:B88mrrJ.iJcF@%J,~> -!q]:^aSu>9;"F>[!NqgOrtR0dQbsDBpV4U'RE6(?Fnc2GcTDRjP!M-6As+13`rrLbiir9b1>l2V5:]J*.jml4:o62S`.s$?P'>lW%KJcJ+6s6;lMZ2Xe'OoGAjH2i-ii0`d0s7-0 at 0)t34qZ+<]!;E_u -H0YFHM>o3[_MS:FfCAo;!2'/gK&s7o_HcuZnk]9tR'?YV0!XO/rBW.Ocf\D*iiPe!6Fme:[\7Fc2UT1dR!nbH0&V)YlO4l[k;:Er;QfLmf*5'blD^% -AcV9!6-]Fsf)X79]hcoQQiKE -!QT`1rrI_hpAY/gUu_OdAcU*H63#@cs8PmcdOrUdrr3#DK)Yd-pAiWeaT#M;[u(.50)tqOR.C:W -WrUcOs,i0:M0VmaT%BbYlO at YrrK'kJcC<$^&J,YHK"l8blDAUOi%,aaT'MAs$=^lmf*4e:[\5^ -2:hii0(.ol_nc87\Obs,/JtGi[H2dgg -6.4]Zs8VWio)J85jlQ(5rrBb4nj3<#M>ol_nc87%B'SLPrr3%O!2]Gi(I?=Gs-SZCdOtRfOnSj- -\(<84nc7SJTB-"QR]_5AfDg@~> -!QT`1rrI_hpAY/gUuhUfmJm7Tc%>tXM?!-4s,i.i^&J$4M9,\r2;A2s!:ojadW!J2Ocf\*!7L04 -qfr2=s8O^rs8U0Ws2"a9nqi5'pAfess36.PX6&X@/ca/qrsXb*qZ-NA!<4[rrrC.>rssrunj3jE*VT+!N;ZBs+13`rrLDkiVsF\!2'9Wo(N.Ys,"ho!9O:\rrM[CrVmb3 ->i7pJV-MqEs7ZNjs*6p-p]&JpSD!<3"JOm`7$!($/Up]$V.!:p.Unj1^^mbe'FlMpnY!7Gi2 -pAiW\c2TEEE*WGCnp-ins.9:`s$?44X6&XDObs,/s8Snqgkj,L!:nP -!QT`1rrI_hpAY/gUuhUfa8fiPM9,]_c2YkIs$=mqlMgea:[\5^25Op::]K#Hj[&>76.5eB!:oRX -l7Q]Ks7-0Xs8S5Hs+p_Os";RrdOm/ns,"f_dcKoT!!)<`rsV]tbsDAlM=LZ;jT+`Jrsp`kaH?MD -0)n`,0&Yj^Oi%+t+,S)=btlafdf7C-jlQ5&lMpn*63$sNa?e)A!:Kk_mf*4fGlXo>rtduLs8S4D -s33k0m[3PFH+hWls7-0J!2\lY!N;ZBs+13`rrLDkiVsEn!6sq-s33k0s%iC66,J6QrrL2trVma? -V6Q0_>c"]fs33k0rrA\^s8SnqfDkl5OoGB.H2mn1!1:hns8PBU0)tK)pmf*4gf)PgFq#;2U63$uZ!:KkQc2WpsM,.a` -6-]FlT;qt_jSo7LY(?W)s*t~> -!OA$2rrJLjpAY/gU#luqjo9:rfDklOK#7QfbqB%r/s4#O -s8N)Is8SICs8VhMs8U=Dc0><+s";"cqsm&)!;HMUs6=P'Z2`(*s$=p0!:lM/s3^o(dTkBVs.s?-aFaH/!("m,rrM'Trr3he -0)ttG!;HLGdf5^*mJrmZ6,!;cOoKAQkl1[\Sq6oms1SF5c$/.HGeO,C_ND_86-]GSE;qQ3>`o'" -gd1B.pZhK=Z0MA`6*]_Ts";RrblI<>qu=>qs8Vrrp](9<_Z0Y'!:kE-s3b.WX8e$nT4\,gV>nt0 -0$XEsK#7QfX+J4gs-SrKE%_18>lQGI^&LC8Oi#]Mp]$B-0)t?Ys8Ps,lSu!0QjLrrD!Urtn&Hs8SIK -s331rpPJp%!<:XNs8)fnhuLIPrrJLgJcF@%J,~> -!OA$2rrJLjpAY/gU#l;^\,V;AaFaGZOoOtPs+6*.63#`LM9,_klME3=lMplrV:YbIM37i/!6p,N -s6]m]s8O_"s8U?\s8SGdo"@j!qZ*Hts2]eZB)h.ms3a15c2WXFrrDrJ0)mQKs-Q+Ps#B`Qc13Le -nc8]Ha?cm,_R0C/qj>HVs8)frhuLIb!8RUAUI"q8[fG4`M6!#+s%f]qK#m\Y!-%&srrD!Urtq,[ -s8UM"s7ZNjs)A"O!8RSSmf+ofrr at Z7rrK!gJcC<$^&J,XGN/WYmaCM'nh0M1!;HMM\,-0n!6G2- -lRr5;me>L4\,ZK`:UgB(pAk*jM#cs_s8R&*s8U[Nrr6Jjo)J_c0)kq,s,!ZSh#B"t6*(%&df6cV ->ikutV:YbIAu4,Zs";b"!.t6&Z1fm=dd@,+0(PBAs6?GJOoN;!s8N)IM7f)YRFM>qjg63##Xs,"5^!:n_os-REulD<*.!4Vk*!VbmYru(\6p](7G -df5/ds38F\!)NW^H2lIrs/Q.bjo5 at KXF^E's*t~> -!OA$2rrJLjpAY/gU#l;^^&LCCM9,]_df7C6s";Q$R/aYN:[\8NpX`ZZqu?CdZ0MAh0%0d@!:jb! -s1L_us7ZNfs8SJSs8Pk\s)=h7c":4]s+8aYQ#`W5c50&/b at pAj"K614#i!1s7ZNfnc8]8 -c!6Y9\$Z51s,m?]R$%FKQuN)eX7COJR/`#as$>qk63!=>$3*f+s2*3t!("m,rrMEUrr3h`63$uZ -!;HLGdf5^*l2[[\6,NYhR/_+XjSo7JXF^E's*t~> -!NqaVrrDWgrrN#ki;WhGX7lPoUS6fL9?g8/Oo#,`K`Ka)M#_KIi.:q]lJ)B%huN?K/c^b.>Q?B] -k>))7:M01Z!0MP=s8UkM0%0ce!6tQDR)8lc>b?lQGlV(LaD_,3h#@Vkt>hf=Aa8iqM:\+P! -/u;g0s8W(D.BEKnK(8mA:\V*o!5eU5>dj]Po&Tk.dJs9!s+15'lK&#H>hk/9fCCQn5lus?h"q$n -qZ,7Js8.BJZ2]X\V5jTAbs?XTK(m[n6-;thfDdI!mcsfQVOiA=JcEF`!R5iIs%?.aE94,#T)a`J -jT&O]M:V_-R/_+Xi3=oi!'pUog]0V?\#TL at JhFP4Jkr!kc2[g9!/^UDE'`dhs'5!R!39A[f)T%U -H1Cq8:\XkgB at ecW>Q?B]pKR\N>h)V9fDdI!aT,p*Jkr4^jf8BpDu_NGM#c0-/pWR3mc=FR:PlO\ -\*dKsm]->,!4RO[0'^jb!.t7NT)a`Fs.o\q\&^l8:J^if>i#Hc:PlO\\,UCI0$s["qtg=7g]7*K -s3^mCmahG)g.q^^QiPRrR/_a -!NqaVrrDKcrrDfNrrJOgpAY/gU#l;AOb/G,g]34-:\+NO6"Wp]5lb0iWrTi60&-Fm!4Vh*/c^aV -!)JG(OoMljT22*Zs1JD;mdb<_mf3;lme]eBH+3>sr]p\D!!#glrr5O@!5AN$blGVW!6"qps8RpO -V(T7Wq_""Cdf50FdJs9!s+15'lJ)B%T)b8Y[fE\0!!'M!5lb0i_>piGlVC=If)T%UE'T9JqYqYm -!;lfrmQgj)nkT81JcM1O!3?-3s/Q-F]`<$BjT(/%rrK!gJcC<$^&J,XGN/Wqnc5q,s(28)!4W!A -!+mjsYlFdFqZ'mu>aV>f/hZ(Y!%on^JcLCA6/;J?H''`Is71F8X8gs at H2mp8:]J93Z!@%(!+l5' -dJs9!rVpKC!:Bh>!/^RQ/c^aA!-%Mj!/[NPDud$@Z"F#J!7_&L:[_(To&Tk6E+]-`!+mjsM#c>_ -!/^_f!,qqg5lb0iV#UM)s71F8X8i3=!!(r>M>%"4g]3JM!+mjsM#c?%!!#g@!6G!9!Mr*]ru.p< -K)`(UH-u[gb]#l=Z-r2=!6BEc\,U^RfB3)6R&kl=fDg@~> -!NqaWrrN#krVllghu<_FX7lPoUS6fL8l):&jf8BR!/^a;!*i<^f)PfaV,`/hYr2!%n8\ -WrR*j0"q:1:S08as8S\kM>Q'oH2IX4>lWnd".:s7]cD -QnI1ogb+t+mf-)NV#UM)nj*7fql9_$GlYPXGlZH8!&!'Y!!&DdO_0uCf)U[-WrQ`3SH,_fqYpSm -:]CA4blCQ1f)SV#:B8(q!7Kets+16OT)b8Y[fE\trrK!gJcC<$^&J,XGN/WqaBY@)pAeHP!8RU2 -!,sRKJcIFgg]3K:!7G*P/mS-U!%qO>:B65IB(Fj[O`5:>s4gC&df6u\X8i4EOoLPUR$%Do!*fNF -V#UM)rr6X*Qqu<6/c`B4!%n8\T)b8Y[fE[F!+l57>b at DX!*m\I!/];-M>t$bT22*ZM#_KId8+$< -[fE]-!)HBVci='5s)7rjh#H/*0%0df/c]/N:X.,a_Q*[MM#_KId8+$i>jgbS!LTs>s4@:$~> -!NqaWrs/E$mf3=T!5e[6%IR!lddgWCb(9VcdK"RlrrUdPH27I at RB-&]!Mc at Lrri5is8VunrrDfl -rrDfmrrDfmrsHW>s8-EbB)hn'aSGi:p[7PN!V5[XrrDflrrDWVrrW)_p\k*to(W1adWtlmo)A[h -qu?ZrqtU0lqssad!;HHl!UBRZrrDf,rrK!gJcC<$^&J,XGMrK$o)AXhp\b'kqu-Npp\t0mqu6U% -Oja9t>`mJ7mTfVg"8i,dqsaUdlMLS\!;HHl!:p!d$L27's.?c4s8S_4qYpQmrVllgrr3)ps8VZe -s8Vrrmf*7dqtL*op](-js7cNm!W2H_rrMlkqYp]qs8VunqYpQd])MeuXF^E's*t~> -!NqaWrrM$Xrr3&E!:p'f%FP5Po%*k-g.q^^WrTF(rrSemX82brRB-&]!Mc at Ls8VinrrDfjrrDfl -rrDfmrrDfmrsFV7s7/t!TE"prp\Fgio(VYR!UfOXrrDflrrDWVrrVr[qu-Npmf*4hOi%.qo)AXh -p\t0mp\=dgp\t0mp\t0nqs+(Y!W2W)rrK!gJcC<$^&J,XGN&Q&qsOI`!;l]o!;HHls82ir!;l`p -$"ic.dZJ/4s3d&+s8VrrmdU5Wqs+1\!VcKjrrN#fqYpo9TE"pr\"E^#>ke*p"o&&os826`rr`/u -s76$d!Vc$]rrDferrr<"qu?]jrr<#mq#:?bq>UQks8VihrrDW$rrJLgJcF@%J,~> -!NqaWrrJsQrr3"q62UZkWrRbOYlK'q!)M7!!9!kV!bMG\q>UJ`X7lPoUS6cK!:p-h!;HEk!;l]o -!;HKm!;lcq$#oJ8c'X at 9s6aLqrr`/umecMR"mZ!bs82QirrN#fm/I+SlMUY^mf*4h:[\8Wqu6Tq -p\t0mp\=ago)8Rgp\t0no'ZDT!VcK)rrK!gJcC<$^&J,XGN&Q)qssdeqtpBnp\k*lp\t0mp\t1" -ja$n+R(.GAs-V(,rrMlbnG`O[mf*4dp\k*mp\Xge$&R+1mUh=(s6aLprrDrqrs8Mms8Vurs82B` -rrM]brr2umnc&U`rr2uhp\t6aq>UQks8ViirrN#f])MeuXF^E's*t~> -!NqaQrrJM(qu7:rM?!V(0)tYGp\t3njo>?V!:K[_!L^"^rrJmgbl8!Y!-rOajT&ns4@:$~> -!NqaQrrGFVqu7'Wc2[g+OoNZYs8)dKrr3!!0)5GIRB-&]!Mc at 4rs=90H"P[;!-rOa]`/)Y/mRh1 -rrK!gJcC<$^&J,XGKBdj/l.(2nh*^iB(FFN$+Bn[E3$GJH#Tg8s5X+[R&kl=fDg@~> -!NqaRrrMjiqu7<'!:p0i6.5diR/bD2K)bl+!0R'V!L^"^rrJmgbl7u8:P*QVJhD=\f=_+bO_/Qt -rrK!gJcC<$^&J,XGKKjkhuIA7M;SAGH&9uL$%adTB%MVeH"PZZs5X+[R&kl=fDg@~> -!NqaartCM\o"B#BR"A,cf3IbUJ`X7lPoUNXhn -#I:G>]Y(eVZF[[LYH4#%!IC>gs+13`rrLAOa1MGVXT#j5YH6*`#J$qA]Y(eVZ at T[J]E*)TJcF@% +VuHkbiSigJs+13$s5!^*~> +VuHkbiSigJs+13$s5!^*~> +VuHkbiSigJs+13$s5!^*~> +VuHk\aOAgns+13$s5!^*~> +VuHk\aOAgns+13$s5!^*~> +VuHk\aOAgns+13$s5!^*~> +VZ-\Bl[f(es+14*s*t~> +VZ-\Bl[f(es+14*s*t~> +VZ-\Bl[f(es+14*s*t~> +VZ-\Bl[f(es+14*s*t~> +VZ-\Bl[f(es+14*s*t~> +VZ-\Bl[f(es+14*s*t~> +VZ-\Bl[f(es+14*s*t~> +VZ-\Bl[f(es+14*s*t~> +VZ-\Bl[f(es+14*s*t~> +VZ-\Bl[f(es+14*s*t~> +VZ-\Bl[f(es+14*s*t~> +VZ-\Bl[f(es+14*s*t~> +VZ-\Bl[f(es+14*s*t~> +VZ-\Bl[f(es+14*s*t~> +VZ-\Bl[f(es+14*s*t~> +VZ-\Bl[f(es+14*s*t~> +VZ-\Bl[f(es+14*s*t~> +VZ-\Bl[f(es+14*s*t~> +VZ-\Cl[f(es+14*s*t~> +VZ-\Cl[f(es+14*s*t~> +VZ-\Cl[f(es+14*s*t~> +VZ-\Bl[f(es+14*s*t~> +VZ-\Bl[f(es+14*s*t~> +VZ-\Bl[f(es+14*s*t~> +VZ-\Bl[f(es+14*s*t~> +VZ-\Bl[f(es+14*s*t~> +VZ-\Bl[f(es+14*s*t~> +VZ-\Bl[f(es+14*s*t~> +VZ-\Bl[f(es+14*s*t~> +VZ-\Bl[f(es+14*s*t~> +VZ-\Bl[f(es+14*s*t~> +VZ-\Bl[f(es+14*s*t~> +VZ-\Bl[f(es+14*s*t~> +VZ-\Bl[f(es+14*s*t~> +VZ-\Bl[f(es+14*s*t~> +VZ-\Bl[f(es+14*s*t~> +VZ-\Bl[f(es+14*s*t~> +VZ-\Bl[f(es+14*s*t~> +VZ-\Bl[f(es+14*s*t~> +VZ-\Bl[f(es+14*s*t~> +VZ-\Bl[f(es+14*s*t~> +VZ-\Bl[f(es+14*s*t~> +VuHkNY.)E%s+13$s5!^*~> +VuHkNY.)E%s+13$s5!^*~> +VuHkNY.)E%s+13$s5!^*~> +VuHkNTqTJWs+13$s5!^*~> +VuHkNTqTJWs+13$s5!^*~> +VuHkNTqTJWs+13$s5!^*~> +VuHk`TqUIss+13$s5!^*~> +VuHk`TqUIss+13$s5!^*~> +VuHk`TqUIss+13$s5!^*~> +VuHkrU87[;s+13$s5!^*~> +VuHkrU87[;s+13$s5!^*~> +VuHkrU87[;s+13$s5!^*~> +VZ-\%]n-37s+14*s*t~> +VZ-\%]n-37s+14*s*t~> +VZ-\%]n-37s+14*s*t~> +VZ-\8fn'0Ss+14*s*t~> +VZ-\8fn'0Ss+14*s*t~> +VZ-\8fn'0Ss+14*s*t~> +VZ-\Kon!-os+14*s*t~> +VZ-\Kon!-os+14*s*t~> +VZ-\Kon!-os+14*s*t~> +VG7+jJPLbkJPOrpJ,~> +VG7+jJPLbkJPOrpJ,~> +VG7+jJPLbkJPOrpJ,~> +JbO`iJbO`is7_$~> +JbO`iJbO`is7_$~> +JbO`iJbO`is7_$~> +JcC<$JcC<$s8RT~> +JcC<$JcC<$s8RT~> +JcC<$JcC<$s8RT~> +JcC<$JcC<$s8RT~> +JcC<$JcC<$s8RT~> +JcC<$JcC<$s8RT~> +jo5>X]`8$&!WW&ps8VierrDJ +k5PGU]Di!$p](-grrM]fpAY-`JcC<$JcGNFJ,~> +k5PGP]`/$0o(i:cme6\\pOW?qs+14Fs*t~> +lMh$5ApLW]mb%OAWrRG5li..M/pWfaOo>:]l2\]qrrJ`Eli.-h!-uK_H2dgLf)U*0!+p19f7EsQ +s.KCB~> +li..Z:N2G`!8%5PJcMG.rrp7>Ob*SSrVlrD!:oma!G6rLrrmuST;qssrr37r!3;^lJm;ROJcC<$ +T`9N~> +li..::M-Y4OkB[9mS +li.-hB)d_$R/6g_K(K!Cjd>K9!A;gdrs&#o\,ZK[K)GWLR)8Ut!V\nWrr at Z@rt$g2rr<&\s8Pjp +mf,Sts,epbs+13Cs*t~> +li.,aZ2^GQdej%Fjd>Z>!PQSCrrVopqs47df)Xq4s/!U1rrGFVp\t9BK)GWLjd>W="nr#oqZ&8J +rs/TWs8)fnrr at n,s+13Cs*t~> +m/I:e!:&"L>ke-q!PQbLrrJ8Mn,EF060eIST)ecgs)@9%rrMjipAY/UaSc&=^!6-J&]d9 +li/#Oddj5Rs7cQaH&7on!19.!/ph41AtT+:Gu)M#0"q8a.%#:!qqQ.0M>MQN:L*r"6-.J?E%[u+ +0'`1CM0]-dE,]F&f7I8KV#^Jos55/7H)pt-_Z.;p:WSBbmOlrY63"E>>gfkWR.>NS>jf:;AoM^o +rVmEpaT$ifK)ab@!:p.Uc2W&bJcC<$T`9N~> +li0QWs2)6js7cQFJnE8H0!oS[!-4_&!7Ln7M*^8(>i>Y^mXf&Cs1N\_Z0G+\/su\5!:m0CE%\Ck +:]K?XH)ptdH!G=HZ%>d:>_;tT-i<2tPM,3\]0"p%ZE/FU^JhF2+ +i;W`gpAjdTGlY_][s::>pAk*j!2Y8HJcDDCJ,~> +m/I7N:]I8f\,QCoX-c]F!*m'HJh'UJa=d&XH$OA]!.">=s3cKpaT%WZ:Y3Z?>QDkFbsDAd:M+48 +/s61CH!Ju$T7U="pR$5Oo)QZ,s!R7/M2>L.mSElWH$OAX62.!`s,"hkAr2-6!*n +li/!1:P,XDE-\M*:]JN163"e%jlS2qR#15ss2_7hM>mN(YtrF at a8kN*6+;tgs"6-/Tsgs#j! +M5B!ZrrDJLaSPu3!53saT.^'As03g10)q'NmQploX3uV"6-/U_s,#jHK(hS2K!G?CE9[GTjkT/" +rt%K;s+8Z!pPI;uo)DKO!-%@Ws+13Cs*t~> +li7!()kV`!6$^n1TCUdcM>r0HjiW2T0$V7is,koqc2R_lAsfh'iW0#Q!9u2Anc8^a!:n_As+t at f +!8OigjT,<5qoDRp!7EKO6';*F-$eUWK)\.-_MS;Tf9+/S!:nBdqe#k?_U=;@!:'S:\&&.,m`>;) +rt4u*o'Vm;0)oP3!<;cn>QCDnJcC<$T`9N~> +m/K`Q:N3d^[p3nC0%\_GOj3bUZ/ph`qZ-&9c2W([:\+PcqZ+<]!53 at OblI#/jh6NNbsDB+B)aKg +nc8E9jfs[562uP5X'E^G^&ZFVs!@DOqe!q;:]H$ks*=02o$Ti(M9+J/qZ-&Hc0> +lMh[pqf%pSs/Z03!6t(#s3`P"nj3;H2dgZc&)HdaRVXsgj+a5nj3:.c2Z2lnc87WrsqE: +s*=VsH%Pnno)D##E*RtoJcDABJ,~> +lMh[pi/pgVqnhb$!:J*`s,i0sJc%Kdp]$V4dK'.D&GH1q +mZI5DK"'>as7ZNT!2"iBJcDABJ,~> +l2MO"YlOOHlGrs;s,"hs6-]Fdc1_5+60eIL/l1p8s7.f#jmnP$s7ZNQ!;FQks33k0aH?Kgc1_5+ +gk(BFpAiWec&o'glL+_ir;R&9M-S-i:]E`Grr3^/pWZ#(M9,^aQnIf`aN-[Is$=_gOo#(hbsDBH +c,]m(lBm_6btlafdXhFLs.B=A~> +l2PgldTk_gX4$FQ0(M=.f.R*o!<7n4g]6X6R*C6_s5fkbs6?E\fDgu0R#1i=o)C>js$?D20)q<$ +c!:9$o%[K`qtC*Gs.A9N\,ZL*[u%B\63!=ng]6X6R*BUM0$*cQrrD?$M=Nt4H(Y,b>l+Nqs6B1R +rt$g2s*=X]!8RSSmf,T$rr at Y%s+13Cs*t~> +l2Pd/mK!9fgpdom9X$Qd@[u%Tk!:nQpjT,="c,bM:!8RU2X4K!(s5 +lMkqrE7/"kM>+^`6-Y8-s$>*5M7<3Znm%R^\(jdIs6f=Uh#F"L>lXNuo)S[4OoNKgs2^?&6.5W1 +nh04 at OoKBmfDh4Ws5g; +lMktkB)eoDM>tgrV31WT>_N10qa!M[>lTBU0'_3lOl-6*!!#gh_Ci**pKV=^!3rR)H+s?rV#]+Z +>h8sf/qTo"/hYqU!!'M.f)TE>>i;X_Ducq7B)dG_0'_Nu>Yg3]!6o*UDueMj>i#I]>hldg\,T^* +rr3V3!-tdKX8d/=WrRFY!-%Mj!/Z:,JcDGDJ,~> +lMkt>V>kLRV>l[0M8J$JMGI%=jT&O]M=Nq4>lUi)]rNd6!!%WNO^+N8mJrlm!7uf&R%FB6AmF6o +R&'e%!4P`(/l24\!!(sWYlKB-E;*rEDudQOTCP8J>lVJ;AhLcR!9*uS>X@!BOhq+'>ka'Th"q*' +rr3U_!19,RdcHkrJcMjD!1 +lMl$Zh"OT`df3+>E94,#T)a`J]`;Xs^"35aR/_+Xi*;YG!!'M&>`j +s8Nc#:B7V<61V;/mS +lMpn]s8N)rrr3,uo)Jaequ6ZjrVlllrr2umr;Qcfrr3#rlL+Z[qu?]nB(GuMOoP1QrVuo_rr3&o +s82`o!;HKms82Qj!;lcq!UBQ5s+13's*t~> +lMgkYrr2uqrr<#ms8N)nr;ZforVlllrr2umrVloqo)AXio'YrG$MXStl>Ze'R*G[%rVlrrjmrEN +!rN#pr;Qckrr2umpAY9is8Vu]JcC<$KE$H~> +lMgkYqYpQdrr2umr;Qckr;Qckrr2uqrVlomqu6Trme?/L$N'l']rV21B(GumrVlrnjnJKK!;HKm +!;H3e"S_rro'V)/JcCB&J,~> +XT&J$5u3)Onq$gls+14(s*t~> +XT&Fb!+pM.JcC<$JcFF'J,~> +XT&F4!-rOgJcC<$JcFF'J,~> +WiH/jT7O%oX+@>(X+1~> +X/c<#S>(S8JZF@&fW0N~> +X/c;rS>_">JZF@&fW0N~> +q3_8*<;)^\Gu+.%!IdW6R/qq/p6br;5kUNF3q\m at 2YEI<0_Lh61\I.92t`R=4nY3D6AG3%!Cq_7 +R/p!/p6bqYGP7F*=)mr%!F'C6R/p].p6bqn at eQ2jCL-Y%!H;07R/qG.p6br-:A1(VJ4TC%!JNo7 +R/r10opGe?opGe:opGe4opGe:opGe?opGhFM>!><6\P0$!D%_6R/p'/p6bq[FnV4(=E*/cJ,~> +q3_8*<;)^\Gu+.%!IdW6R/qq/p6br;5kUNF3q\m at 2YEI<0_Lh61\I.92t`R=4nY3D6AG3%!Cq_7 +R/p!/p6bqYGP7F*=)mr%!F'C6R/p].p6bqn at eQ2jCL-Y%!H;07R/qG.p6br-:A1(VJ4TC%!JNo7 +R/r10opGe?opGe:opGe4opGe:opGe?opGhFM>!><6\P0$!D%_6R/p'/p6bq[FnV4(=E*/cJ,~> +q3_8*<;)^\Gu+.%!IdW6R/qq/p6br;5kUNF3q\m at 2YEI<0_Lh61\I.92t`R=4nY3D6AG3%!Cq_7 +R/p!/p6bqYGP7F*=)mr%!F'C6R/p].p6bqn at eQ2jCL-Y%!H;07R/qG.p6br-:A1(VJ4TC%!JNo7 +R/r10opGe?opGe:opGe4opGe:opGe?opGhFM>!><6\P0$!D%_6R/p'/p6bq[FnV4(=E*/cJ,~> +q>UK0LA(WJa+!a^!RPr^rrLegpAY0QA+fj%=nVdp;"ahg8+ll^9D/;b<;$7k?M4=!B&<7]!H6N^ +rrIDhpAY/E_tO*2Mn/Q]!L0k_rrJXgpAY/jT(`0bYEnn^!On'^rrKrhpAY09HhRI?drG*]!ShD_ +rrM4hp&>"mp&>"ep&>"]p&>"ep&>"np&>&$jS&TSC"r@]!HQW^rrIJgpAY/H_"Rd/NORgFJ,~> +q>UK0LA(WJa+!a^!RPr^rrLegpAY0QA+fj%=nVdp;"ahg8+ll^9D/;b<;$7k?M4=!B&<7]!H6N^ +rrIDhpAY/E_tO*2Mn/Q]!L0k_rrJXgpAY/jT(`0bYEnn^!On'^rrKrhpAY09HhRI?drG*]!ShD_ +rrM4hp&>"mp&>"ep&>"]p&>"ep&>"np&>&$jS&TSC"r@]!HQW^rrIJgpAY/H_"Rd/NORgFJ,~> +q>UK0LA(WJa+!a^!RPr^rrLegpAY0QA+fj%=nVdp;"ahg8+ll^9D/;b<;$7k?M4=!B&<7]!H6N^ +rrIDhpAY/E_tO*2Mn/Q]!L0k_rrJXgpAY/jT(`0bYEnn^!On'^rrKrhpAY09HhRI?drG*]!ShD_ +rrM4hp&>"mp&>"ep&>"]p&>"ep&>"np&>&$jS&TSC"r@]!HQW^rrIJgpAY/H_"Rd/NORgFJ,~> +q>UK0LA(WJa+!a^!RPr^rrLegpAY0QA+fj%=nVdp;"ahg8+ll^9D/;b<;$7k?M4=!B&<7]!H6N^ +rrIDhpAY/E_tO*2Mn/Q]!L0k_rrJXgpAY/jT(`0bYEnn^!On'^rrKrhpAY09HhRI?drG*]!ShD_ +rrM4hp&>"mp&>"ep&>"]p&>"ep&>"np&>&$jS&TSC"r@]!HQW^rrIJgpAY/H_"Rd/NORgFJ,~> +q>UK0LA(WJa+!a^!RPr^rrLegpAY0QA+fj%=nVdp;"ahg8+ll^9D/;b<;$7k?M4=!B&<7]!H6N^ +rrIDhpAY/E_tO*2Mn/Q]!L0k_rrJXgpAY/jT(`0bYEnn^!On'^rrKrhpAY09HhRI?drG*]!ShD_ +rrM4hp&>"mp&>"ep&>"]p&>"ep&>"np&>&$jS&TSC"r@]!HQW^rrIJgpAY/H_"Rd/NORgFJ,~> +q>UK0LA(WJa+!a^!RPr^rrLegpAY0QA+fj%=nVdp;"ahg8+ll^9D/;b<;$7k?M4=!B&<7]!H6N^ +rrIDhpAY/E_tO*2Mn/Q]!L0k_rrJXgpAY/jT(`0bYEnn^!On'^rrKrhpAY09HhRI?drG*]!ShD_ +rrM4hp&>"mp&>"ep&>"]p&>"ep&>"np&>&$jS&TSC"r@]!HQW^rrIJgpAY/H_"Rd/NORgFJ,~> +q>UK0LA(WJa+!a^!RPr^rrLegpAY0QA+fj%=nVdp;"ahg8+ll^9D/;b<;$7k?M4=!B&<7]!H6N^ +rrIDhpAY/E_tO*2Mn/Q]!L0k_rrJXgpAY/jT(`0bYEnn^!On'^rrKrhpAY09HhRI?drG*]!ShD_ +rrM4hp&>"mp&>"ep&>"]p&>"ep&>"np&>&$jS&TSC"r@]!HQW^rrIJgpAY/H_"Rd/NORgFJ,~> +q>UK0LA(WJa+!a^!RPr^rrLegpAY0QA+fj%=nVdp;"ahg8+ll^9D/;b<;$7k?M4=!B&<7]!H6N^ +rrIDhpAY/E_tO*2Mn/Q]!L0k_rrJXgpAY/jT(`0bYEnn^!On'^rrKrhpAY09HhRI?drG*]!ShD_ +rrM4hp&>"mp&>"ep&>"]p&>"ep&>"np&>&$jS&TSC"r@]!HQW^rrIJgpAY/H_"Rd/NORgFJ,~> +q>UK0LA(WJa+!a^!RPr^rrLegpAY0QA+fj%=nVdp;"ahg8+ll^9D/;b<;$7k?M4=!B&<7]!H6N^ +rrIDhpAY/E_tO*2Mn/Q]!L0k_rrJXgpAY/jT(`0bYEnn^!On'^rrKrhpAY09HhRI?drG*]!ShD_ +rrM4hp&>"mp&>"ep&>"]p&>"ep&>"np&>&$jS&TSC"r@]!HQW^rrIJgpAY/H_"Rd/NORgFJ,~> +q>UK0LA(WJa+!a^!RPr^rrLegpAY0QA+fj%=nVdp;"ahg8+ll^9D/;b<;$7k?M4=!B&<7]!H6N^ +rrIDhpAY/E_tO*2Mn/Q]!L0k_rrJXgpAY/jT(`0bYEnn^!On'^rrKrhpAY09HhRI?drG*]!ShD_ +rrM4hp&>"mp&>"ep&>"]p&>"ep&>"np&>&$jS&TSC"r@]!HQW^rrIJgpAY/H_"Rd/NORgFJ,~> +q>UK0LA(WJa+!a^!RPr^rrLegpAY0QA+fj%=nVdp;"ahg8+ll^9D/;b<;$7k?M4=!B&<7]!H6N^ +rrIDhpAY/E_tO*2Mn/Q]!L0k_rrJXgpAY/jT(`0bYEnn^!On'^rrKrhpAY09HhRI?drG*]!ShD_ +rrM4hp&>"mp&>"ep&>"]p&>"ep&>"np&>&$jS&TSC"r@]!HQW^rrIJgpAY/H_"Rd/NORgFJ,~> +q>UK0LA(WJa+!a^!RPr^rrLegpAY0QA+fj%=nVdp;"ahg8+ll^9D/;b<;$7k?M4=!B&<7]!H6N^ +rrIDhpAY/E_tO*2Mn/Q]!L0k_rrJXgpAY/jT(`0bYEnn^!On'^rrKrhpAY09HhRI?drG*]!ShD_ +rrM4hp&>"mp&>"ep&>"]p&>"ep&>"np&>&$jS&TSC"r@]!HQW^rrIJgpAY/H_"Rd/NORgFJ,~> +q>UK0LA(WJa+!a^!RPr^rrLegpAY0QA+fj%=nVdp;"ahg8+ll^9D/;b<;$7k?M4=!B&<7]!H6N^ +rrIDhpAY/E_tO*2Mn/Q]!L0k_rrJXgpAY/jT(`0bYEnn^!On'^rrKrhpAY09HhRI?drG*]!ShD_ +rrM4hp&>"mp&>"ep&>"]p&>"ep&>"np&>&$jS&TSC"r@]!HQW^rrIJgpAY/H_"Rd/NOSca!Q)qB +rr at Y$~> +q>UK0LA(WJa+!a^!RPr^rrLegpAY0QA+fj%=nVdp;"ahg8+ll^9D/;b<;$7k?M4=!B&<7]!H6N^ +rrIDhpAY/E_tO*2Mn/Q]!L0k_rrJXgpAY/jT(`0bYEnn^!On'^rrKrhpAY09HhRI?drG*]!ShD_ +rrM4hp&>"mp&>"ep&>"]p&>"ep&>"np&>&$jS&TSC"r@]!HQW^rrIJgpAY/H_"Rd/NOSca!Kls< +rrM5KJ,~> +q>UK0LA(WJa+!a^!RPr^rrLegpAY0QA+fj%=nVdp;"ahg8+ll^9D/;b<;$7k?M4=!B&<7]!H6N^ +rrIDhpAY/E_tO*2Mn/Q]!L0k_rrJXgpAY/jT(`0bYEnn^!On'^rrKrhpAY09HhRI?drG*]!ShD_ +rrM4hp&>"mp&>"ep&>"]p&>"ep&>"np&>&$jS&TSC"r@]!HQW^rrIJgpAY/H_"Rd/NOSfb!W.K5 +rrKgXJ,~> +q>UK0LA(WJa+!a^!RPr^rrLegpAY0QA+fj%=nVdp;"ahg8+ll^9D/;b<;$7k?M4=!B&<7]!H6N^ +rrIDhpAY/E_tO*2Mn/Q]!L0k_rrJXgpAY/jT(`0bYEnn^!On'^rrKrhpAY09HhRI?drG*]!ShD_ +rrM4hp&>"mp&>"ep&>"]p&>"ep&>"np&>&$jS&TSC"r@]!HQW^rrIJgpAY/H_"Rd/NOSfb)uBV? +\RpZuM4a2gd\QqK0'`1VJnG%lH!Je&!.Y~> +q>UK0LA(WJa+!a^!RPr^rrLegpAY0QA+fj%=nVdp;"ahg8+ll^9D/;b<;$7k?M4=!B&<7]!H6N^ +rrIDhpAY/E_tO*2Mn/Q]!L0k_rrJXgpAY/jT(`0bYEnn^!On'^rrKrhpAY09HhRI?drG*]!ShD_ +rrM4hp&>"mp&>"ep&>"]p&>"ep&>"np&>&$jS&TSC"r@]!HQW^rrIJgpAY/H_"Rd/NOSfb)rL^A +Z"@T_:Y3hkmWgE\>lW`$AsiUTM,3\]/q<~> +q>UK0LA(WJa+!a^!RPr^rrLegpAY0QA+fj%=nVdp;"ahg8+ll^9D/;b<;$7k?M4=!B&<7]!H6N^ +rrIDhpAY/E_tO*2Mn/Q]!L0k_rrJXgpAY/jT(`0bYEnn^!On'^rrKrhpAY09HhRI?drG*]!ShD_ +rrM4hp&>"mp&>"ep&>"]p&>"ep&>"np&>&$jS&TSC"r@]!HQW^rrIJgpAY/H_"Rd/NOSfb)lit+ +R"?rU62.!`j\JZ)R/ajO6-/e4M1YI%>^u~> +q>UK0LA(WJa+!a^!RPr^rrLegpAY0QA+fj%=nVdp;"ahg8+ll^9D/;b<;$7k?M4=!B&<7]!H6N^ +rrIDhpAY/E_tO*2Mn/Q]!L0k_rrJXgpAY/jT(`0bYEnn^!On'^rrKrhpAY09HhRI?drG*]!ShD_ +rrM4hp&>"mp&>"ep&>"]p&>"ep&>"np&>&$jS&TSC"r@]!HQW^rrIJgq#:p)q0fO1i7ul/b/D'* +Z`R]GqYqIraSPtBjjJb\6-.:Ns+8+>aT$5MM<23upHa<~> +q>UK0LA(WJa+!a^!RPr^rrLegpAY0QA+fj%=nVdp;"ahg8+ll^9D/;b<;$7k?M4=!B&<7]!H6N^ +rrIDhpAY/E_tO*2Mn/Q]!L0k_rrJXgpAY/jT(`0bYEnn^!On'^rrKrhpAY09HhRI?drG*]!ShD_ +rrM4hp&>"mp&>"ep&>"]p&>"ep&>"np&>&$jS&TSC"r@]!HQW^rrIJgq#:p)q0fO1i7ul/b/D'* +Z`R]GqYqI"pZ_b1jcRXa!:ktYrrDUBp[3"tB)cJ[dYWJ~> +q>UK0LA(WJa+!a^!RPr^rrLegpAY0QA+fj%=nVdp;"ahg8+ll^9D/;b<;$7k?M4=!B&<7]!H6N^ +rrIDhpAY/E_tO*2Mn/Q]!L0k_rrJXgpAY/jT(`0bYEnn^!On'^rrKrhpAY09HhRI?drG*]!ShD_ +rrM4hp&>"mp&>"ep&>"]p&>"ep&>"np&>&$jS&TSC"r@]!HQW^rrIJgq#:p)q0fO1i7ul/b/D'* +Z`R]Gqu7W+:]J*.jml4 +q>UK0LA(WJa+!a^!RPr^rrLegpAY0QA+fj%=nVdp;"ahg8+ll^9D/;b<;$7k?M4=!B&<7]!H6N^ +rrIDhpAY/E_tO*2Mn/Q]!L0k_rrJXgpAY/jT(`0bYEnn^!On'^rrKrhpAY09HhRI?drG*]!ShD_ +rrM4hp&>"mp&>"ep&>"]p&>"ep&>"np&>&$jS&TSC"rUd0DP2,kMY(D>c,EO\$ +q>UK0LA(WJa+!a^!RPr^rrLegpAY0QA+fj%=nVdp;"ahg8+ll^9D/;b<;$7k?M4=!B&<7]!H6N^ +rrIDhpAY/E_tO*2Mn/Q]!L0k_rrJXgpAY/jT(`0bYEnn^!On'^rrKrhpAY09HhRI?drG*]!ShD_ +rrM4hp&>"mp&>"ep&>"]p&>"ep&>"np&>&$jS&TSC"rUd0DP2,kMY(D>c,EO\$om(!<)p$]np"8c%:H~> +q>UK0LA(WJa+!a^!RPr^rrLegpAY0QA+fj%=nVdp;"ahg8+ll^9D/;b<;$7k?M4=!B&<7]!H6N^ +rrIDhpAY/E_tO*2Mn/Q]!L0k_rrJXgpAY/jT(`0bYEnn^!On'^rrKrhpAY09HhRI?drG*]!ShD_ +rrM4hp&>"mp&>"ep&>"]p&>"ep&>"np&>&$jS&TSC"rUd0DP2,kMY(D>c,EO\$ +q>UK0LA(WJa+!a^!RPr^rrLegpAY0QA+fj%=nVdp;"ahg8+ll^9D/;b<;$7k?M4=!B&<7]!H6N^ +rrIDhpAY/E_tO*2Mn/Q]!L0k_rrJXgpAY/jT(`0bYEnn^!On'^rrKrhpAY09HhRI?drG*]!ShD_ +rrM4hp&>"mp&>"ep&>"]p&>"ep&@?[r:]UEjk\P9b/D$)6^X^BR?NVbJU2EUBIH\X:eF2N<*3I; +C2c"BJV]>NR at pCWZ+%APS^,a=hra7pp\b'kKY[<]!KFSbru.$:s$=p0c#E\8aO2^@OiUdis1R1f +lGADK6%A~> +q>UK0LA(WJa+!a^!RPr^rrLegpAY0QA+fj%=nVdp;"ahg8+ll^9D/;b<;$7k?M4=!B&<7]!H6N^ +rrIDhpAY/E_tO*2Mn/Q]!L0k_rrJXgpAY/jT(`0bYEnn^!On'^rrKrhpAY09HhRI?drG*]!ShD_ +rrM4hp&>"mp&>"ep&>"]p&>"ep&@?[r:]UEjk\P9b/D$)6^X^BR?NVbJU2EUBIH\X:eF2N<*3I; +C2c"BJV]>NR at pCWZ+%APS^,a=hra7pp\b'kKY[<]!KFSbru*N\qZ-BjM7 +q>UK0LA(WJa+!a^!RPr^rrLegpAY0QA+fj%=nVdp;"ahg8+ll^9D/;b<;$7k?M4=!B&<7]!H6N^ +rrIDhpAY/E_tO*2Mn/Q]!L0k_rrJXgpAY/jT(`0bYEnn^!On'^rrKrhpAY09HhRI?drG*]!ShD_ +rrM4hp&>"mp&>"ep&>"]p&>"ep&@?[r:]UEjk\P9b/D$)6^X^BR?NVbJU2EUBIH\X:eF2N<*3I; +C2c"BJV]>NR at pCWZ+%APS^,a=hra7pp\b'kKY[<]!KFScru:B%s3a45s$>qk62s7!qbPuIlM$pU +E;r5lM9(2~> +q>UK0LA(WJa+!a^!RPr^rrLegpAY0QA+fj%=nVdp;"ahg8+ll^9D/;b<;$7k?M4=!B&<7]!H6N^ +rrIDhpAY/E_tO*2Mn/Q]!L0k_rrJXgpAY/jT(`0bYEnn^!On'^rrKrhpAY09HhRI?drG*]!ShD_ +rrM4hp&>"mp&>"ep]!;Qog.g$gXONh_Rd+WVkGc.Ne`14FDbc#>uXQ985 +q>UK0LA(WJa+!a^!RPr^rrLegpAY0QA+fj%=nVdp;"ahg8+ll^9D/;b<;$7k?M4=!B&<7]!H6N^ +rrIDhpAY/E_tO*2Mn/Q]!L0k_rrJXgpAY/jT(`0bYEnn^!On'^rrKrhpAY09HhRI?drG*]!ShD_ +rrM4hp&>"mp&>"ep]!;Qog.g$gXONh_Rd+WVkGc.Ne`14FDbc#>uXQ985\;RfZ*=9/aRT=, +>X@!BJ,~> +q>UK0LA(WJa+!a^!RPr^rrLegpAY0QA+fj%=nVdp;"ahg8+ll^9D/;b<;$7k?M4=!B&<7]!H6N^ +rrIDhpAY/E_tO*2Mn/Q]!L0k_rrJXgpAY/jT(`0bYEnn^!On'^rrKrhpAY09HhRI?drG*]!ShD_ +rrM4hp&>"mp&>"ep]!;Qog.g$gXONh_Rd+WVkGc.Ne`14FDbc#>uXQ985;K`Kp.M#_KIblFBF!7uf&0'^jb +AhJ\9!.Y~> +q>UK0LA(WJa+!a^!RPr^rrLegpAY0QA+fj%=nVdp;"ahg8+ll^9D/;b<;$7k?M4=!B&<7]!H6N^ +rrIDhpAY/E_tO*2Mn/Q]!L0k_rrJXgpAY/jT(`0bYEnn^!On'^rrKrhpAY09HhRI?drG*]!ShD_ +rrM4hq>WGPp$_':g=+9c^UUVNUn3m6.>*(mDeWZb&$jS&TSC"r@]!HQW^rrIJgpAY/H_"Rd/NOS``!;HEks82Tk!;H?i!;h9~> +q>UK0LA(WJa+!a^!RPr^rrLegpAY0QA+fj%=nVdp;"ahg8+ll^9D/;b<;$7k?M4=!B&<7]!H6N^ +rrIDhpAY/E_tO*2Mn/Q]!L0k_rrJXgpAY/jT(`0bYEnn^!On'^rrKrhpAY09HhRI?drG*]!ShD_ +rrM4hq>WGPp$_':g=+9c^UUVNUn3m6.>*(mDeWZb&$jS&TSC"r@]!HQW^rrIJgpAY/H_"Rd/NOS``!;l]o!;H9gs82Zm!;D!~> +q>UK0LA(WJa+!a^!RPr^rrLegpAY0QA+fj%=nVdp;"ahg8+ll^9D/;b<;$7k?M4=!B&<7]!H6N^ +rrIDhpAY/E_tO*2Mn/Q]!L0k_rrJXgpAY/jT(`0bYEnn^!On'^rrKrhpAY09HhRI?drG*]!ShD_ +rrM4hq>WGPp$_':g=+9c^UUVNUn3m6.>*(mDeWZb&$jS&TSC"r@]!HQW^rrIJgpAY/H_"Rd/NOSca!;lZn!;H9g!;H +q>UK0LA(WJa+!a^!RPr^rrLegpAY0QA+fj%=nVdp;"ahg8+ll^9D/;b<;$7k?M4=!B&<7]!H6N^ +rrIDhpAY/E_tO*2Mn/Q]!L0k_rrJXgpAY/jT(`0bYEnn^!On'^rrKrhpAY09HhRI?drG6a3W8X= +kJ:ZOTi85NDo+_u(BIYNfHR at pI\ZoQ"Fcdgh1l0n?Es8PR]rr>ge +rr?-nrrHQhpAY/-g\1XJEmj[]!IMr^rrIegpAY/Q\)749~> +q>UK0LA(WJa+!a^!RPr^rrLegpAY0QA+fj%=nVdp;"ahg8+ll^9D/;b<;$7k?M4=!B&<7]!H6N^ +rrIDhpAY/E_tO*2Mn/Q]!L0k_rrJXgpAY/jT(`0bYEnn^!On'^rrKrhpAY09HhRI?drG6a3W8X= +kJ:ZOTi85NDo+_u(BIYNfHR at pI\ZoQ"Fcdgh1l0n?Es8PR]rr>ge +rr?-nrrHQhpAY/-g\1XJEmj[]!IMr^rrIegpAY/Q\)749~> +q>UK0LA(WJa+!a^!RPr^rrLegpAY0QA+fj%=nVdp;"ahg8+ll^9D/;b<;$7k?M4=!B&<7]!H6N^ +rrIDhpAY/E_tO*2Mn/Q]!L0k_rrJXgpAY/jT(`0bYEnn^!On'^rrKrhpAY09HhRI?drG6a3W8X= +kJ:ZOTi85NDo+_u(BIYNfHR at pI\ZoQ"Fcdgh1l0n?Es8PR]rr>ge +rr?-nrrHQhpAY/-g\1XJEmj[]!IMr^rrIegpAY/Q\)749~> +q>UK0LA(WJa+!a^!RPr^rrLegpAY0QA+fj%=nVdp;"ahg8+ll^9D/;b<;$7k?M4=!B&<7]!H6N^ +rrIDhpAY/E_tO*2Mn/Q]!L0k_rrJXgpAY/jT(`0bYEnn^!On'^rrKrhqYrDNp$V"IB[P#?]"ep&>"]p&>"ep&>"n +p&>&$jS&TSC"r@]!HQW^rrIJgpAY/H_"dp3hmZXqhuA3~> +q>UK0LA(WJa+!a^!RPr^rrLegpAY0QA+fj%=nVdp;"ahg8+ll^9D/;b<;$7k?M4=!B&<7]!H6N^ +rrIDhpAY/E_tO*2Mn/Q]!L0k_rrJXgpAY/jT(`0bYEnn^!On'^rrKrhqYrDNp$V"IB[P#?]"ep&>"]p&>"ep&>"n +p&>&$jS&TSC"r@]!HQW^rrIJgpAY/H_"dp3hmZXqhuA3~> +q>UK0LA(WJa+!a^!RPr^rrLegpAY0QA+fj%=nVdp;"ahg8+ll^9D/;b<;$7k?M4=!B&<7]!H6N^ +rrIDhpAY/E_tO*2Mn/Q]!L0k_rrJXgpAY/jT(`0bYEnn^!On'^rrKrhqYrDNp$V"IB[P#?]"ep&>"]p&>"ep&>"n +p&>&$jS&TSC"r@]!HQW^rrIJgpAY/H_"dp3hmZXqhuA3~> +q+^rX3qc;L6oam8!Cf$A:'!jBp.bW[2"aTD1A+BB0_J0 at 0D/'?0_J0 at 1%e9A1\FKD1e@=8!B*IA +:'!:Bp.bWK7.s at V3^WO8!B`X@:'!LBp.bWQ55%_P5Wnj;1/1D44#9/e4?>G[1bgX7.O#fV+Wh^D +(`!i')B9\4,:4ce/1rV31cIEP.R6!&4(@!&F4B +!Ad=@:'!4Cp.bWH7eTRX3( +q+^rX3qc;L6oam8!Cf$A:'!jBp.bW[2"aTD1A+BB0_J0 at 0D/'?0_J0 at 1%e9A1\FKD1e@=8!B*IA +:'!:Bp.bWK7.s at V3^WO8!B`X@:'!LBp.bWQ55%_P5Wnj;1/1D44#9/e4?>G[1bgX7.O#fV+Wh^D +(`!i')B9\4,:4ce/1rV31cIEP.R6!&4(@!&F4B +!Ad=@:'!4Cp.bWH7eTRX3( +q+^rX3qc;L6oam8!Cf$A:'!jBp.bW[2"aTD1A+BB0_J0 at 0D/'?0_J0 at 1%e9A1\FKD1e@=8!B*IA +:'!:Bp.bWK7.s at V3^WO8!B`X@:'!LBp.bWQ55%_P5Wnj;1/1D44#9/e4?>G[1bgX7.O#fV+Wh^D +(`!i')B9\4,:4ce/1rV31cIEP.R6!&4(@!&F4B +!Ad=@:'!4Cp.bWH7eTRX3( +JcCf20`(A*j4r,-`4WIYUn*d3L44;aB4+h<8OlW[?Y42!I>*WESYN3i\\Q;4fA>WWo_X4>df0XP +hQr)J:3NARo%X1p~> +JcCf20`(A*j4r,-`4WIYUn*d3L44;aB4+h<8OlW[?Y42!I>*WESYN3i\\Q;4fA>WWo_X4>df0XP +hQr)J:3NARo%X1p~> +JcCf20`(A*j4r,-`4WIYUn*d3L44;aB4+h<8OlW[?Y42!I>*WESYN3i\\Q;4fA>WWo_X4>df0XP +hQr)J:3NARo%X1p~> +JcDYJ0E1_7kMFe:`kJmaVk037L44AbB4"_97nQZ_@;Kq/JVfJUTVo!(^W+RLh<""qqgnd\rsA28 +STIV +JcDYJ0E1_7kMFe:`kJmaVk037L44AbB4"_97nQZ_@;Kq/JVfJUTVo!(^W+RLh<""qqgnd\rsA28 +STIV +JcDYJ0E1_7kMFe:`kJmaVk037L44AbB4"_97nQZ_@;Kq/JVfJUTVo!(^W+RLh<""qqgnd\rsA28 +STIV +JcEF`/bnethq-2q^:(2ASX#1gHus7:>Z=Bd:0(\5DKpVbNg?96Y-u'acdpq6mIgF/s/Q)*rS"N4 +?;PpBbk9EaJ,~> +JcEF`/bnethq-2q^:(2ASX#1gHus7:>Z=Bd:0(\5DKpVbNg?96Y-u'acdpq6mIgF/s/Q)*rS"N4 +?;PpBbk9EaJ,~> +JcEF`/bnethq-2q^:(2ASX#1gHus7:>Z=Bd:0(\5DKpVbNg?96Y-u'acdpq6mIgF/s/Q)*rS"N4 +?;PpBbk9EaJ,~> +JcF4!/,/MphUToi]X+Z5R?<>WG]@A'<_c+X=-QCb"X\%g#2g>M2apjrI2rs8)3RrV58 +O1XDrs*t~> +JcF4!/,/MphUToi]X+Z5R?<>WG]@A'<_c+X=-QCb"X\%g#2g>M2apjrI2rs8)3RrV58 +O1XDrs*t~> +JcF4!/,/MphUToi]X+Z5R?<>WG]@A'<_c+X=-QCb"X\%g#2g>M2apjrI2rs8)3RrV58 +O1XDrs*t~> +JcG!7/,f,+inDc"^UC8?S +JcG!7/,f,+inDc"^UC8?S +JcG!7/,f,+inDc"^UC8?S +JcG]K..uufg +JcG]K..uufg +JcG]K..uufg +P5cs/oBP8cc, at 2uW1]E7KR.WO?WKlj:KV%?F*r_&Q_CCb]uA:KhrsV,JcC<$ir9>`f<9m4;gkOi +pV?fZ~> +P5cs/oBP8cc, at 2uW1]E7KR.WO?WKlj:KV%?F*r_&Q_CCb]uA:KhrsV,JcC<$ir9>`f<9m4;gkOi +pV?fZ~> +P5cs/oBP8cc, at 2uW1]E7KR.WO?WKlj:KV%?F*r_&Q_CCb]uA:KhrsV,JcC<$ir9>`f<9m4;gkOi +pV?fZ~> +V>hn8lf-RBa1S^WT9bFhH?!S(<(fbZ>@_VqJVo\^W3<_Ib1#/-n+VD5JcF-t#joNtE)(,0]B-[) +J,~> +V>hn8lf-RBa1S^WT9bFhH?!S(<(fbZ>@_VqJVo\^W3<_Ib1#/-n+VD5JcF-t#joNtE)(,0]B-[) J,~> -!NqabrtP?8E;t3gpMb^hm^Hg.i*;*=o!*K=rt-m.s8S4q#:A_X7lPoUNXhn -!O&U(]E5C?[^s*PW3V]$!IC>gs+13`rrLAOa1VGRrk/94d(BUhXL>dSZE1Kc]]-R)F0'rmfDg@~> -!NqabrtOQIV>ij:gi.4hqiRNN]m4Qms)>[Nrt=l&mf3;Qc2Wogs36,qlMl]QR/$[^RB-&]!Mah] -]E,+;rk&98XLc%F\YYP'!IC>gs+13`rrLAOaLhbgXKoLO\ZE*`]E,4;rk&98XF\%C]E*)TJcF@% +V>hn8lf-RBa1S^WT9bFhH?!S(<(fbZ>@_VqJVo\^W3<_Ib1#/-n+VD5JcF-t#joNtE)(,0]B-[) J,~> -!NqaartG,,o!d5fB)g9Zs$?(0\,U`pqp#*>&srZUJ`X7lPoUK, -!NqaartEuas*=Ke\,VS0l7W):mf*:XlIZ"7s%iZ6%5*eCdK'=8R%H#2B$p\SrrJOgpAY/g -!NqaartCc^s,$b.lMj/Z]nu/0s6 -!Nqa`rt($SM>r^#s7ZN]:[TjVs,k1qrt:HNs8UM"s7-0\s*=VsH%Pnno(i:dRB-&]!Mc at .rrJ.g -`W#p-`W#p?`W#t9Sq6oms1SF5c$-i#!):**!*6c4!Ka\$rrJLgJcF@%J,~> -!Nqa`rt#1>R/[07s3^o<0(K#5s$?5Qrt-m3s8S4aq#:A_X7lPoUS5^-!KOV- -rr>O-rr?0?rrK!gJcC<$^&J,XGJ*qU9tUE*s4@:$~> -!Nqaart+GqX3L&4o)Fi/aH=Ors7/t_rt=l&p](7Zc2Wogs2*%%!-%4jOneqWRB-&]!Mc at .rrJ.g -`W#p-`W#p?`W#t9Sq6oms1SF5c$-i#!):**!*6c4!Ka\$rrJLgJcF@%J,~> -!Nqa`rt=Dn\,X-;s7ZNj:\%bks,"Vmi;NZgR#1kCdOtRo!;HM=s2"ckrrDK_rrJOgpAY/gTuR*5 -Njcq,!(Os-!*I5?!N)H>s+13`rrLAg]`.t+]Dhk3]`/"o[(QD>R&kl=fDg@~> -!Nqa`rt;d at lMkgqs3b0L0)GY(s"d*rr?*4rrJ4g]`/#"XF^E's*t~> -!Nqa`rt98Ns8N)Ns,!f$M:Vb)nk];No)AY%pAjdas$>*5M4"=aaT!kts-SE5rrJOgpAY/gTuR*5 -Njcq,!(Os-!*I5?!N)H>s+13`rrLAg]`.t+]Dhk3]`/"o[(QD>R&kl=fDg@~> -!Nqa_s!VLRs8-&`K"'>3R+D=C!.!?"p](9]:B8i6>QDou!1:G"X8d/=WrRG at rrJOgpAY/gTuR*5 -Njcq,!(Os-!*I5?!N)H>s+13`rrLAg]`.t+]Dhk3]`/"o[(QD>R&kl=fDg@~> -!Nqa`rt>'UJ`X7lPoUS5^- -!KOV-rr>O-rr?0?rrK!gJcC<$^&J,XGJ*qU9tUE*s4@:$~> -!Nqa`rtQDiMTDnj(WrRbOYlK'q!)L^U61V;/mSUJ`X7lPoUS5^- -!KOV-rr>O-rr?0?rrK!gJcC<$^&J,XGJ*qU9tUE*s4@:$~> -!O.p]rrMQYqu6ZjhZ!VGXnMbqUS5^-!KOV-rr>O-rr?0?rrK!gJcC<$^&J,XGJ*qU9tUE*s4@:$~> -!O.p]rrME^r;Qflqqh>RS#uDa!Mc at .rrJ.g`W#p-`W#p?`W#t9Sq6oms1SF5c$-i#!):**!*6c4 -!Ka\$rrJLgJcF@%J,~> -!O.p^rrN#^qu6Zjh>[MFXnMbqUS5^-!KOV-rr>O-rr?0?rrK!gJcC<$^&J,XGJ*qU9tUE*s4@:$~> -!PORB1u> -fDg@~> -!PORB1u> -fDg@~> -!PORB1u> -fDg@~> -!p<_ca8Z0EjS&TSWLh-0!KOV-rr>O-rr?0?rrJjjJcC<$^&J,_F1hMQ9tUE* -!p<_ca8Z0EjS&TSWLh-0!KOV-rr>O-rr?0?rrJjjJcC<$^&J,_F1hMQ9tUE* -!p<_ca8Z0EjS&TSWLh-0!KOV-rr>O-rr?0?rrJjjJcC<$^&J,_F1hMQ9tUE* -!rm&]aSu=hBE%W)!Q'?+rrJ.g`W#p-`W#p?`W#sk^OcE9s1SF5m8gn"!):**!*6c4!Ka\$rrI5c -JcF@%J,~> -!rm&]aSu=hBE%W)!Q'?+rrJ.g`W#p-`W#p?`W#sk^OcE9s1SF5m8gn"!):**!*6c4!Ka\$rrI5c -JcF@%J,~> -!rm&]aSu=hBE%W)!Q'?+rrJ.g`W#p-`W#p?`W#sk^OcE9s1SF5m8gn"!):**!*6c4!Ka\$rrI5c -JcF@%J,~> -"96GPr6#$@rF -"96GPr6#$@rF -"96GPr6#$@rF -s8N+L?HW9KL48ao!K<\lrrJ.g`W#p-`W#p?`r?(7M1P\Xs1A:3[roCa!):**!*6c4!Ka\%rrJCP -JcF=$J,~> -s8N+L?HW9KL48ao!K<\lrrJ.g`W#p-`W#p?`r?(7M1P\Xs1A:3[roCa!):**!*6c4!Ka\%rrJCP -JcF=$J,~> -s8N+L?HW9KL48ao!K<\lrrJ.g`W#p-`W#p?`r?(7M1P\Xs1A:3[roCa!):**!*6c4!Ka\%rrJCP -JcF=$J,~> -s8N/u8W1gms$m(`oD\mVO-rr?0ArrV1[k^ibbs1A:4qe3+Grr>d*rr?*4rrJ4g -^Ae8ef)L7~> -s8N/u8W1gms$m(`oD\mVO-rr?0ArrV1[k^ibbs1A:4qe3+Grr>d*rr?*4rrJ4g -^Ae8ef)L7~> -s8N/u8W1gms$m(`oD\mVO-rr?0ArrV1[k^ibbs1A:4qe3+Grr>d*rr?*4rrJ4g -^Ae8ef)L7~> -rr3)qG]`&orr_D6GQ%(3!mCZ&cMn+Ik0(#q9X_q?!(Os-!*I>B!ocqmJcC<$\c2`p"i7tR!):** -!*6c4!Ka\'rrUhId"25Is*t~> -rr3)qG]`&orr_D6GQ%(3!mCZ&cMn+Ik0(#q9X_q?!(Os-!*I>B!ocqmJcC<$\c2`p"i7tR!):** -!*6c4!Ka\'rrUhId"25Is*t~> -rr3)qG]`&orr_D6GQ%(3!mCZ&cMn+Ik0(#q9X_q?!(Os-!*I>B!ocqmJcC<$\c2`p"i7tR!):** -!*6c4!Ka\'rrUhId"25Is*t~> -rVm$!Z;u"MeAVQqF&oUFn,EI0O-rr?0CrrUL``e"/@s0r"0 -kuP7.rr>d*rr?*4rrJ4g_#FJR&_2I4eGk%~> -rVm$!Z;u"MeAVQqF&oUFn,EI0O-rr?0CrrUL``e"/@s0r"0 -kuP7.rr>d*rr?*4rrJ4g_#FJR&_2I4eGk%~> -rVm$!Z;u"MeAVQqF&oUFn,EI0O-rr?0CrrUL``e"/@s0r"0 -kuP7.rr>d*rr?*4rrJ4g_#FJR&_2I4eGk%~> -qu6cna-D>/Ifk7da8#$$"41D/b2<4/qV]ApO`t/)@!\0CalE9srrJ.g`W#p-`W#p?bPq[fLgSGY -s+13XrrhP*DS,_^rr>d*rr?*4rrJ4g_uBl<`d_ROJcF4!J,~> -qu6cna-D>/Ifk7da8#$$"41D/b2<4/qV]ApO`t/)@!\0CalE9srrJ.g`W#p-`W#p?bPq[fLgSGY -s+13XrrhP*DS,_^rr>d*rr?*4rrJ4g_uBl<`d_ROJcF4!J,~> -qu6cna-D>/Ifk7da8#$$"41D/b2<4/qV]ApO`t/)@!\0CalE9srrJ.g`W#p-`W#p?bPq[fLgSGY -s+13XrrhP*DS,_^rr>d*rr?*4rrJ4g_uBl<`d_ROJcF4!J,~> -]`/01h86"FD#OA9r3('7k?\X%;+Ni,.NocW/iQ'h -]`/01h86"FD#OA9r3('7k?\X%;+Ni,.NocW/iQ'h -]`/01h86"FD#OA9r3('7k?\X%;+Ni,.NocW/iQ'h -_uC/DjiXclG?[aQJY'I)qYpTlkjRXCg;0eQI:Q&@>]kt"]$deE#1]Pn7pqG#Qf\>3q18Qss1eRA -nBnP*FB)1XOKZt-qu6]pm'c$[jKNMoMqsrd"0ba?_6N,'l2#u2ci8L~> -_uC/DjiXclG?[aQJY'I)qYpTlkjRXCg;0eQI:Q&@>]kt"]$deE#1]Pn7pqG#Qf\>3q18Qss1eRA -nBnP*FB)1XOKZt-qu6]pm'c$[jKNMoMqsrd"0ba?_6N,'l2#u2ci8L~> -_uC/DjiXclG?[aQJY'I)qYpTlkjRXCg;0eQI:Q&@>]kt"]$deE#1]Pn7pqG#Qf\>3q18Qss1eRA -nBnP*FB)1XOKZt-qu6]pm'c$[jKNMoMqsrd"0ba?_6N,'l2#u2ci8L~> -b5VtNl-?])I:>iUH'GPWkPj]F%IDNQSqLoV;/:oZ]@?5Lrs/PSTkRDZ^@?dSJcC<$f)H-Dbcd.M -<`3q!YKlO8rrqec=E2+QRf -b5VtNl-?])I:>iUH'GPWkPj]F%IDNQSqLoV;/:oZ]@?5Lrs/PSTkRDZ^@?dSJcC<$f)H-Dbcd.M -<`3q!YKlO8rrqec=E2+QRf -b5VtNl-?])I:>iUH'GPWkPj]F%IDNQSqLoV;/:oZ]@?5Lrs/PSTkRDZ^@?dSJcC<$f)H-Dbcd.M -<`3q!YKlO8rrqec=E2+QRf -dJj^TkKpQ'IUc#SFc`WCiVMg=%fPS7ZC$)O9il=mV8(dUW;d+s_i%N,T[`pks+13$s4[J]rTD5# -Mel-iG*K8Xn#$*fdtCS_i0F -dJj^TkKpQ'IUc#SFc`WCiVMg=%fPS7ZC$)O9il=mV8(dUW;d+s_i%N,T[`pks+13$s4[J]rTD5# -Mel-iG*K8Xn#$*fdtCS_i0F -dJj^TkKpQ'IUc#SFc`WCiVMg=%fPS7ZC$)O9il=mV8(dUW;d+s_i%N,T[`pks+13$s4[J]rTD5# -Mel-iG*K8Xn#$*fdtCS_i0F -f`)HWilA3dH=9EMGEAiDhtlU;%f,#'XHIj88mce)X2NolV#LYbZ?]2lZ0?i>JcC<$h#@fUf=IQ) - at nL*TRCCc?U]1MnZt3gRp6#@XqQ3bQkCNYcs*t~> -f`)HWilA3dH=9EMGEAiDhtlU;%f,#'XHIj88mce)X2NolV#LYbZ?]2lZ0?i>JcC<$h#@fUf=IQ) - at nL*TRCCc?U]1MnZt3gRp6#@XqQ3bQkCNYcs*t~> -f`)HWilA3dH=9EMGEAiDhtlU;%f,#'XHIj88mce)X2NolV#LYbZ?]2lZ0?i>JcC<$h#@fUf=IQ) - at nL*TRCCc?U]1MnZt3gRp6#@XqQ3bQkCNYcs*t~> -hu=2Rf"@c7EEGkDH^1eViqr!?%eJAgVi5Xu94NF;Z-)2+T`55OU2*\b_tS`^JcC<$hu=,Jb-$kJ -<_[@cUr)$cTDo&UQ;iF^N;j%TVGrWCJcCH(J,~> -hu=2Rf"@c7EEGkDH^1eViqr!?%eJAgVi5Xu94NF;Z-)2+T`55OU2*\b_tS`^JcC<$hu=,Jb-$kJ -<_[@cUr)$cTDo&UQ;iF^N;j%TVGrWCJcCH(J,~> -hu=2Rf"@c7EEGkDH^1eViqr!?%eJAgVi5Xu94NF;Z-)2+T`55OU2*\b_tS`^JcC<$hu=,Jb-$kJ -<_[@cUr)$cTDo&UQ;iF^N;j%TVGrWCJcCH(J,~> -kPl%_h8?:WHXf]LE/1*sdd-,s%IMTST8.2[:hkZT\'aK2rs/MLQ!7U`ec(."JcC<$j8TP^g:a25 -AkQ?QPd/R$Rf -kPl%_h8?:WHXf]LE/1*sdd-,s%IMTST8.2[:hkZT\'aK2rs/MLQ!7U`ec(."JcC<$j8TP^g:a25 -AkQ?QPd/R$Rf -kPl%_h8?:WHXf]LE/1*sdd-,s%IMTST8.2[:hkZT\'aK2rs/MLQ!7U`ec(."JcC<$j8TP^g:a25 -AkQ?QPd/R$Rf -n,Epefu0qUHt?&MC4M\UaPcjXrso"ibd*XeAP6'DMPS#=nX0=\pqqqdDPuEDs+13$s5s=jro_M0 -Q?HD(BSE.ph"[69"nf$*CV9LsrrhbR;l'/=s,$c+~> -n,Epefu0qUHt?&MC4M\UaPcjXrso"ibd*XeAP6'DMPS#=nX0=\pqqqdDPuEDs+13$s5s=jro_M0 -Q?HD(BSE.ph"[69"nf$*CV9LsrrhbR;l'/=s,$c+~> -n,Epefu0qUHt?&MC4M\UaPcjXrso"ibd*XeAP6'DMPS#=nX0=\pqqqdDPuEDs+13$s5s=jro_M0 -Q?HD(BSE.ph"[69"nf$*CV9LsrrhbR;l'/=s,$c+~> -q#:p%jj1K7Nd"o)<,7)QYK,Mmkl2.gho;a\H!j6MGEJoEhY397#4]6Q:jKD7JcC<$JcG!7%.2HN -RX\g?>Bc:8bit;j"QGSCL=UqUs8N5bMH6tZJcCZ.J,~> -q#:p%jj1K7Nd"o)<,7)QYK,Mmkl2.gho;a\H!j6MGEJoEhY397#4]6Q:jKD7JcC<$JcG!7%.2HN -RX\g?>Bc:8bit;j"QGSCL=UqUs8N5bMH6tZJcCZ.J,~> -q#:p%jj1K7Nd"o)<,7)QYK,Mmkl2.gho;a\H!j6MGEJoEhY397#4]6Q:jKD7JcC<$JcG!7%.2HN -RX\g?>Bc:8bit;j"QGSCL=UqUs8N5bMH6tZJcCZ.J,~> -&c1Y;]Vq'GC/mo6FGca"bi8H]rsnVQ^SQm0=A*.PQa+]pr/gp_lEG>+K>.&1s+13$s6]gqo%1LH -KP=.]EfI':htiE6"ocSf=/,/7s82fuhg8VBJcC]/J,~> -&c1Y;]Vq'GC/mo6FGca"bi8H]rsnVQ^SQm0=A*.PQa+]pr/gp_lEG>+K>.&1s+13$s6]gqo%1LH -KP=.]EfI':htiE6"ocSf=/,/7s82fuhg8VBJcC]/J,~> -&c1Y;]Vq'GC/mo6FGca"bi8H]rsnVQ^SQm0=A*.PQa+]pr/gp_lEG>+K>.&1s+13$s6]gqo%1LH -KP=.]EfI':htiE6"ocSf=/,/7s82fuhg8VBJcC]/J,~> -#YJEELRbTgg at +/'%IDNQSqUrY:hkZT\'aN"rs%GYC/^/6qLSZts+14?rseeZ_53!+;c%:dUVGOV -MZ3kQXBo_UqgneArr^_fB?Pl+NrOV~> -#YJEELRbTgg at +/'%IDNQSqUrY:hkZT\'aN"rs%GYC/^/6qLSZts+14?rseeZ_53!+;c%:dUVGOV -MZ3kQXBo_UqgneArr^_fB?Pl+NrOV~> -#YJEELRbTgg at +/'%IDNQSqUrY:hkZT\'aN"rs%GYC/^/6qLSZts+14?rseeZ_53!+;c%:dUVGOV -MZ3kQXBo_UqgneArr^_fB?Pl+NrOV~> -jSo_gkKL2uIUl)QEJpX,f^jmu#1oAS>F*_:JcC<$mf+F/n))O0[Af^[LjjPfCLps^?=$uIASZ=3 -KTVk.^XVNIWW*G!ftXAAEE5eHJtBO&n:glFifR,pf>mn%rTr at d^pBr/Ob\C/DeW`jra$"@@:j:r -H\dlZYJSoYbl7daATZUVs,d82~> -jSo_gkKL2uIUl)QEJpX,f^jmu#1oAS>F*_:JcC<$mf+F/n))O0[Af^[LjjPfCLps^?=$uIASZ=3 -KTVk.^XVNIWW*G!ftXAAEE5eHJtBO&n:glFifR,pf>mn%rTr at d^pBr/Ob\C/DeW`jra$"@@:j:r -H\dlZYJSoYbl7daATZUVs,d82~> -jSo_gkKL2uIUl)QEJpX,f^jmu#1oAS>F*_:JcC<$mf+F/n))O0[Af^[LjjPfCLps^?=$uIASZ=3 -KTVk.^XVNIWW*G!ftXAAEE5eHJtBO&n:glFifR,pf>mn%rTr at d^pBr/Ob\C/DeW`jra$"@@:j:r -H\dlZYJSoYbl7daATZUVs,d82~> -li.Iiho2[ZG[=!MGEJrEhtVm)#5ul4=Ce&YJcC<$p&?`Aldr\@N-f8B9Kk6t9Nl4_P,>P"`m*#g -hr$ -B3.\g1IFoCD1e+P[)'f.e_fb.t9XQ[rsV94rpUbjs0]"TGl5KB7[aP5g%~> -li.Iiho2[ZG[=!MGEJrEhtVm)#5ul4=Ce&YJcC<$p&?`Aldr\@N-f8B9Kk6t9Nl4_P,>P"`m*#g -hr$ -B3.\g1IFoCD1e+P[)'f.e_fb.t9XQ[rsV94rpUbjs0]"TGl5KB7[aP5g%~> -li.Iiho2[ZG[=!MGEJrEhtVm)#5ul4=Ce&YJcC<$p&?`Aldr\@N-f8B9Kk6t9Nl4_P,>P"`m*#g -hr$ -B3.\g1IFoCD1e+P[)'f.e_fb.t9XQ[rsV94rpUbjs0]"TGl5KB7[aP5g%~> -o)B3kg:sJCE`btFI[@=_jns]0#QOY at Mc4JkjFR>^s8;m at n_D0jSpb$?3%#gi*\B?@E$;f_#Fl0d^Pd"BhhTELn_Q5n:CW;rrr(s?#I at Rf`*/`g;L1_ -G[3it-6O -o)B3kg:sJCE`btFI[@=_jns]0#QOY at Mc4JkjFR>^s8;m at n_D0jSpb$?3%#gi*\B?@E$;f_#Fl0d^Pd"BhhTELn_Q5n:CW;rrr(s?#I at Rf`*/`g;L1_ -G[3it-6O -o)B3kg:sJCE`btFI[@=_jns]0#QOY at Mc4JkjFR>^s8;m at n_D0jSpb$?3%#gi*\B?@E$;f_#Fl0d^Pd"BhhTELn_Q5n:CW;rrr(s?#I at Rf`*/`g;L1_ -G[3it-6O -q>Uoke%)-+Cf4)GKV#[#l[f*5rs&/3JkpNom",1frtGFsca9*h?pHh>4ub5_?$DUCeEuf+$N95> -\!_P=?]W/!mJdCQZ%,\t](jJK%f5/*YEjWL93?1mVSLpYJcGKE"Q5D at M:p_b'E.%9Ya0W?5!;+n -2_mj2H^_S!naZVdqrZ>5P]]`4QHK'krs%>[H;B43rRCiMnsWINpOW at 1s*t~> -q>Uoke%)-+Cf4)GKV#[#l[f*5rs&/3JkpNom",1frtGFsca9*h?pHh>4ub5_?$DUCeEuf+$N95> -\!_P=?]W/!mJdCQZ%,\t](jJK%f5/*YEjWL93?1mVSLpYJcGKE"Q5D at M:p_b'E.%9Ya0W?5!;+n -2_mj2H^_S!naZVdqrZ>5P]]`4QHK'krs%>[H;B43rRCiMnsWINpOW at 1s*t~> -q>Uoke%)-+Cf4)GKV#[#l[f*5rs&/3JkpNom",1frtGFsca9*h?pHh>4ub5_?$DUCeEuf+$N95> -\!_P=?]W/!mJdCQZ%,\t](jJK%f5/*YEjWL93?1mVSLpYJcGKE"Q5D at M:p_b'E.%9Ya0W?5!;+n -2_mj2H^_S!naZVdqrZ>5P]]`4QHK'krs%>[H;B43rRCiMnsWINpOW at 1s*t~> -%fPS:[$lMW9NH+hUV5:LJcGKE#4AjD:OfqGJcCE'')q"3V1rSQ8l/AY6:>LCV8D-fj8T;CYC03! -bO#64q7qP[S*\Z)%dql[UPa%n94E74XMs,mJcG?A"oZA^=/>^hPbQnN7I:p"nT3I=f1f?rrhSC -%fPS:[$lMW9NH+hUV5:LJcGKE#4AjD:OfqGJcCE'')q"3V1rSQ8l/AY6:>LCV8D-fj8T;CYC03! -bO#64q7qP[S*\Z)%dql[UPa%n94E74XMs,mJcG?A"oZA^=/>^hPbQnN7I:p"nT3I=f1f?rrhSC -%fPS:[$lMW9NH+hUV5:LJcGKE#4AjD:OfqGJcCE'')q"3V1rSQ8l/AY6:>LCV8D-fj8T;CYC03! -bO#64q7qP[S*\Z)%dql[UPa%n94E74XMs,mJcG?A"oZA^=/>^hPbQnN7I:p"nT3I=f1f?rrhSC -#>/3EO/^%PpOWA9rs%VcDc)>-pOW@!rt+hMXG^da:g77/929JhZd8!krrr&(Ch1-Vm/I4PR8f^K -hZ",_ilSEkIUu2QDMOmqdd$g_s6fmjo;Pr5^]!6n&F[iAL1EhQ>[CK';K\;8e*u&j"R`L#Cru#C -"Q#5=WVY-E"5S61`. at rVs*t~> -#>/3EO/^%PpOWA9rs%VcDc)>-pOW@!rt+hMXG^da:g77/929JhZd8!krrr&(Ch1-Vm/I4PR8f^K -hZ",_ilSEkIUu2QDMOmqdd$g_s6fmjo;Pr5^]!6n&F[iAL1EhQ>[CK';K\;8e*u&j"R`L#Cru#C -"Q#5=WVY-E"5S61`. at rVs*t~> -#>/3EO/^%PpOWA9rs%VcDc)>-pOW@!rt+hMXG^da:g77/929JhZd8!krrr&(Ch1-Vm/I4PR8f^K -hZ",_ilSEkIUu2QDMOmqdd$g_s6fmjo;Pr5^]!6n&F[iAL1EhQ>[CK';K\;8e*u&j"R`L#Cru#C -"Q#5=WVY-E"5S61`. at rVs*t~> -!;h?In,EUKTk7>fbl!%lM#S"Sb,'Yq8m>e8<(^eZWQFGPrr^biB\D_O"7D4PaQNR6rp%qCU5F%q -8n!%0XMs&jJcFs6"P\l5N83Rq&*_'+Hrs'J at pr;.CQ,C at n'M(:aCB>Sli.(JJRR6\rr^P\DUa7; -S,\!~> -!;h?In,EUKTk7>fbl!%lM#S"Sb,'Yq8m>e8<(^eZWQFGPrr^biB\D_O"7D4PaQNR6rp%qCU5F%q -8n!%0XMs&jJcFs6"P\l5N83Rq&*_'+Hrs'J at pr;.CQ,C at n'M(:aCB>Sli.(JJRR6\rr^P\DUa7; -S,\!~> -!;h?In,EUKTk7>fbl!%lM#S"Sb,'Yq8m>e8<(^eZWQFGPrr^biB\D_O"7D4PaQNR6rp%qCU5F%q -8n!%0XMs&jJcFs6"P\l5N83Rq&*_'+Hrs'J at pr;.CQ,C at n'M(:aCB>Sli.(JJRR6\rr^P\DUa7; -S,\!~> -JcG<@#5ul5>@F#PJcCT,&,4MPK3M#VA7/81F-aDorQ5'@`Dr\urr^n[MZ*&E&+A2eW/u738m$(i -Tt/V:rdk+1rrr;5DHj+3l2M7bbbTYf:LRa?:K)M.^Z -JcG<@#5ul5>@F#PJcCT,&,4MPK3M#VA7/81F-aDorQ5'@`Dr\urr^n[MZ*&E&+A2eW/u738m$(i -Tt/V:rdk+1rrr;5DHj+3l2M7bbbTYf:LRa?:K)M.^Z -JcG<@#5ul5>@F#PJcCT,&,4MPK3M#VA7/81F-aDorQ5'@`Dr\urr^n[MZ*&E&+A2eW/u738m$(i -Tt/V:rdk+1rrr;5DHj+3l2M7bbbTYf:LRa?:K)M.^Z -JcGEC#5>uk;Ji>jJcCW-%HFsZAk6$3>u"LJT#0X,rrVS/MX(3DpO.Gfq>Uuqg;9nSHXoiLD1e=a -bN&GMs5*bZl^q4&a8YH*%fY:iM.&tZ at 9lK1J"t'L_Z'\s@\N)e!q0fbdf0IHX&P8NJcDABJ,~> -JcGEC#5>uk;Ji>jJcCW-%HFsZAk6$3>u"LJT#0X,rrVS/MX(3DpO.Gfq>Uuqg;9nSHXoiLD1e=a -bN&GMs5*bZl^q4&a8YH*%fY:iM.&tZ at 9lK1J"t'L_Z'\s@\N)e!q0fbdf0IHX&P8NJcDABJ,~> -JcGEC#5>uk;Ji>jJcCW-%HFsZAk6$3>u"LJT#0X,rrVS/MX(3DpO.Gfq>Uuqg;9nSHXoiLD1e=a -bN&GMs5*bZl^q4&a8YH*%fY:iM.&tZ at 9lK1J"t'L_Z'\s@\N)e!q0fbdf0IHX&P8NJcDABJ,~> -JcGNF#4]-L:3j25JcC]/%JnPQISWXA>u4=?SAXX)rrW",L[+mPrH;uEg;9nTI:uARBn;YUa5?TA -s4I>Sc[o&\jR)sVp -JcGNF#4]-L:3j25JcC]/%JnPQISWXA>u4=?SAXX)rrW",L[+mPrH;uEg;9nTI:uARBn;YUa5?TA -s4I>Sc[o&\jR)sVp -JcGNF#4]-L:3j25JcC]/%JnPQISWXA>u4=?SAXX)rrW",L[+mPrH;uEg;9nTI:uARBn;YUa5?TA -s4I>Sc[o&\jR)sVp -JcGWI#2lCt;MMsZJcC`0%/.i7DadH%:I]>i]]6I#!r?5enGa$df>4GKHX\$GBn;\Ua5?Q at s4@8W -rosI_oWDV8[J0.i%.V9%BgY`u9M0Jt_W\H.!q0?qlMgqZ>b'1@#3^eC\,GmjJcDSHJ,~> -JcGWI#2lCt;MMsZJcC`0%/.i7DadH%:I]>i]]6I#!r?5enGa$df>4GKHX\$GBn;\Ua5?Q at s4@8W -rosI_oWDV8[J0.i%.V9%BgY`u9M0Jt_W\H.!q0?qlMgqZ>b'1@#3^eC\,GmjJcDSHJ,~> -JcGWI#2lCt;MMsZJcC`0%/.i7DadH%:I]>i]]6I#!r?5enGa$df>4GKHX\$GBn;\Ua5?Q at s4@8W -rosI_oWDV8[J0.i%.V9%BgY`u9M0Jt_W\H.!q0?qlMgqZ>b'1@#3^eC\,GmjJcDSHJ,~> -KDu>.g]."X:>_]H7qm$/&phlc$rt>:mcafd/G$djCD2"Ibal)i= -PC`b^rs/@(?J:B8Lt2"p%.:ln?9V"U6=Gh\hYse[!q'C+lMgqZBrTGY"kn$-H8Xr -KDu>.g]."X:>_]H7qm$/&phlc$rt>:mcafd/G$djCD2"Ibal)i= -PC`b^rs/@(?J:B8Lt2"p%.:ln?9V"U6=Gh\hYse[!q'C+lMgqZBrTGY"kn$-H8Xr -KDu>.g]."X:>_]H7qm$/&phlc$rt>:mcafd/G$djCD2"Ibal)i= -PC`b^rs/@(?J:B8Lt2"p%.:ln?9V"U6=Gh\hYse[!q'C+lMgqZBrTGY"kn$-H8Xr -L&VJVKEdOPL/Dichgtfkrt,*rT)">EadHKt6pj4]S]:--rrDfert4a$W5Ys.KPjmc??D+!\'F+3 -q>UNjA[I$geGfaA5QCshWU]`_&GCgfn9;^cP#a\75t$$obk.t9!od25lMgqQ=3Sti"MG9F+kVAG -VuM8~> -L&VJVKEdOPL/Dichgtfkrt,*rT)">EadHKt6pj4]S]:--rrDfert4a$W5Ys.KPjmc??D+!\'F+3 -q>UNjA[I$geGfaA5QCshWU]`_&GCgfn9;^cP#a\75t$$obk.t9!od25lMgqQ=3Sti"MG9F+kVAG -VuM8~> -L&VJVKEdOPL/Dichgtfkrt,*rT)">EadHKt6pj4]S]:--rrDfert4a$W5Ys.KPjmc??D+!\'F+3 -q>UNjA[I$geGfaA5QCshWU]`_&GCgfn9;^cP#a\75t$$obk.t9!od25lMgqQ=3Sti"MG9F+kVAG -VuM8~> -LAqM,1&q;)I^ecss,m5'EAn23D"k,g&8AZ"8Sl^FT2:OqW,u5UlKe39h$=FPcDOMm-jrU -k#Kr_s472Ni at Fm-!0R$U%K<(B!':Pg*BZ8XM6u0:rrU/DnEU#Te5b\Xrrp+Z!!!YKJcD\KJ,~> -LAqM,1&q;)I^ecss,m5'EAn23D"k,g&8AZ"8Sl^FT2:OqW,u5UlKe39h$=FPcDOMm-jrU -k#Kr_s472Ni at Fm-!0R$U%K<(B!':Pg*BZ8XM6u0:rrU/DnEU#Te5b\Xrrp+Z!!!YKJcD\KJ,~> -LAqM,1&q;)I^ecss,m5'EAn23D"k,g&8AZ"8Sl^FT2:OqW,u5UlKe39h$=FPcDOMm-jrU -k#Kr_s472Ni at Fm-!0R$U%K<(B!':Pg*BZ8XM6u0:rrU/DnEU#Te5b\Xrrp+Z!!!YKJcD\KJ,~> -M#RPRK*M;T!&&p'OT, at .7/Hrc+hd*GrtX71'`\5#IqhqT@!.C#[a!e*s1`(>lMgq4>4R7Ef`)0$ -)#t79G/*hP!P^De!!5-un"B[]V0M8)!k2qBcMn$rLH5d at JcD_LJ,~> -M#RPRK*M;T!&&p'OT, at .7/Hrc+hd*GrtX71'`\5#IqhqT@!.C#[a!e*s1`(>lMgq4>4R7Ef`)0$ -)#t79G/*hP!P^De!!5-un"B[]V0M8)!k2qBcMn$rLH5d at JcD_LJ,~> -M#RPRK*M;T!&&p'OT, at .7/Hrc+hd*GrtX71'`\5#IqhqT@!.C#[a!e*s1`(>lMgq4>4R7Ef`)0$ -)#t79G/*hP!P^De!!5-un"B[]V0M8)!k2qBcMn$rLH5d at JcD_LJ,~> -M/`c;4Yf2m<+'M'Er*L)\*)X#ot$=\8_UkH'd+JrrW.6\* -M/`c;4Yf2m<+'M'Er*L)\*)X#ot$=\8_UkH'd+JrrW.6\* -M/`c;4Yf2m<+'M'Er*L)\*)X#ot$=\8_UkH'd+JrrW.6\* -J^if2"kCo&CLY9Nrrht_;i&;Ae:H-Ee-spTZ#*g`s8VWA^SSj>rrV[jf^&P at l\?R(`moXiJ^jMF -"kCkt at r0QZrrV+WlKeHRhf0]pb1;-nhUD\HO]@M3mf*I:Ch'Kif!X"X~> -J^if2"kCo&CLY9Nrrht_;i&;Ae:H-Ee-spTZ#*g`s8VWA^SSj>rrV[jf^&P at l\?R(`moXiJ^jMF -"kCkt at r0QZrrV+WlKeHRhf0]pb1;-nhUD\HO]@M3mf*I:Ch'Kif!X"X~> -J^if2"kCo&CLY9Nrrht_;i&;Ae:H-Ee-spTZ#*g`s8VWA^SSj>rrV[jf^&P at l\?R(`moXiJ^jMF -"kCkt at r0QZrrV+WlKeHRhf0]pb1;-nhUD\HO]@M3mf*I:Ch'Kif!X"X~> -JcF^/!mP/EnG`Ua>E/?-s+14 at rrUY\QL+VP^M`E<"mT$Vc -JcF^/!mP/EnG`Ua>E/?-s+14 at rrUY\QL+VP^M`E<"mT$Vc -JcF^/!mP/EnG`Ua>E/?-s+14 at rrUY\QL+VP^M`E<"mT$Vc -JcF[.!r-/go)AdU8?@CBJcG3=!rHSdm/I*#_X at F.fKR@Us*Lu$s+14ArrV[fYO2>kpK-/dF`b(9TGrrTS0mdgAZUegTds*t~> -JcF[.!r-/go)AdU8?@CBJcG3=!rHSdm/I*#_X at F.fKR@Us*Lu$s+14ArrV[fYO2>kpK-/dF`b(9TGrrTS0mdgAZUegTds*t~> -JcF[.!r-/go)AdU8?@CBJcG3=!rHSdm/I*#_X at F.fKR@Us*Lu$s+14ArrV[fYO2>kpK-/dF`b(9TGrrTS0mdgAZUegTds*t~> -s8W,r!;G7J!p][[qYpTno'cVYo(`4bo&]oOqZ-B>rrVpYZLn.uph$Jfs8VrrpXTaH9i`GpBrrVrlqpk`Ho'-/Tp\WA -s8N/pqtJnG"8hB`qtgUH_jo5DVqtJS>!r"mao`#!fAuOnm!r)Thec,^=p\X7U -!:nM:!p]g_pAY0OpWid?p\Xj/rrW!^WpTffdpW.DrrVRi_>aH9i`GpBrrMlkeGfUUHcn,ELelMpbX -rrMlkjo5AUqpPKGW*JiarrU&Emd:#Up\Xj -s8N/pqto1Ks7-0eq>UHcmf*@Rqtp6i!W2WQrrVrlqpYQHpHGnTrrVt-W9=3\pXK3ElMLJDrrDW; -rr`/`s82Qj!W1g"s8Vi6rrW!^WpTffdpW.DrrVRi_>aH9i`GpCs8VrrpXK3ElMLJDrrDW;s8VWi -qtC$jqr#d"s8)fja8Z513lC at b!P!FDrrV"Vf`(mOb%LPMs8)fjg]%??qtp3h!:oUYs7-0eq>UHc -jo>AX!;FqA!iTAno`#!0?gd=]s7b%C!q,g[p&BO~> -s8N2BM-TK*rri'^M,/a"rrKTSnG`Wr:Pf):qu6`p!:KU]"hanJE'`+Lrr^?!>jhOi%FP5PmahG) -g.q^[JcOa.rs*-9aE[cB6&G.3!od/Lp&>&lIcgY3OfLe)ru1cd!.nHpp]%KoM#ch.:M'TY!3AIk -s8TP.\,-++blI2!rrp(9AoL&fm/I05E,[H(rr^>f!9!PM#+/1u!.k3lir9(BX$QX_%BBJ\s02QL -dK!(lJcOa.rs*-9aE[cB6&Fb(!p]BH;Ytp2V -l;)@b6$WI:!1`fi:[*S:N/TcGl[EprrQ!$ -K)GWdqgngQs+p`PdK!(b:G2PEs7ZLhbtgWW0":!C!n(ULlZ%Cg3 -"L1aZ!:'F\!F3M3rri'^M,/a"rrKTSp\tEfGlW[eM=plM:U,NLru(]c!3uQ\!2Z^rH/;=Lqu?]j -!)Lj86%U_unc&WOQhC@[q-2>7rrS=`6/MVXqgng">]BH;f.N0c]pMT-!.k3P6!XHiJ,~> -s8N.W[mAjM"PbVl!5eU4!G94&lIcgY36*Y^lru1<$!/X"(s8R at iE%_/dE'Zd8!4)Zms8S36 -fD>LJV#]l^"ePdH>[6jerri'^M,/`trrSRM!;-9q:N/TcGl[EprrPKkH2IUMGlY,LM#aBQ!.!Es -!<3!(pAdM(5s^)T\*!\lk>Ud8rrI#XnG`NMR/HsbJ at 4hF"7ea7_VY;2mS6';3IH$O?]pAfdF -AnF>r!6G3.AnLK-rrJqrmJd@\GlW[eMMJ!:o[["PbVl!5eU4!G94Crrq1D6%U_upAY6c6&EJVrseBl!8$d;!6p)qT@*^brr38U!-u6X -AoL&knc&WOQhC@[q-2>7rrPKkH/AQ;mS6';3IX&"QPl;)@b6$WI:!1 -s8N-rX,5[4"KPda!:'F\!6e!-nQVAl%Fd"7f]K_YjECl;%E3nlu1> -JcMFh!."SD#gr^)\c?>]6/:W&!p)U\U]JjI*MnkY*< -M9Q$G!-pkjDuf>+f0PPrqu6`pAr5pT"l)m>JhFP!rrfB-M#ci8rrR.bE:s58blE"hGsRhWrr^,p -:[\/\%F"lKo%*k;l at K#.W;sF,rs54sX.KBD>\\*h>LW!>"7f]K_VY;/dK!'p6,! -s8N2BV0Vt:rrL!XoD\iYme$MablIeD>lV[^lMh&@c2Y8djd>N:"@:<4OY6A-"3@s^k5PLF]n61^!LWrrHBmq#:?=pAY7]c2WnYp\t8]meQkdnc8ReH0Y2)!F3n at rs#P(f.R*T -_YF-3jd>]?!UA;7rrS=rK)>QcqZ-Bjs$=p0M37hi!.t7NhuJW6f.R*o!6F=&!M5eJrrKcXnc&[W -;u- at k!R>?FrrQfGX8MttK(ApAK(K!ZpAk*j!2'9Dc2Y8dV>lpFs/YE\!58F,OneqW>jhCe!6t9< -"oA;os"9H.rr at ZGrrgRHs8Q?urrHBLoD]#ks-SrKX6TK[!Q)qMrrLa:r;Qh1]rV&1):pM at s7ZNf -s+umZ>"tn1# -\%VfnlMh+6!<<((s2)kHrrq",s7-02pAY2+]rV&1):pM at s7ZNfs";b"QiOi"s.o_4s-SrKblI>* -rrVmlnb2t`["RcF!g10Jr;QebmdpGYK(K!XpAk*j!2':RM>u[hX8gd(s4>,[!/^`+~> -s8N.W_Kl(Z!KlsErr@?9s8RoZs5eP+On.i<#P%lps)@8:aRK35qZ-Nn!/^FL!f=d>qu7Q.!;HNn -0%0cVOoLdK^&S,/!6G2-OoNZ+o'u_\Q_X9S!r>s^k5PKf]rV)2!."29!Tf^?rts!5s7-0Anc8^i -E9a(qR$%ELmQgiis7_ZOrrN!_q#:BcfD#:KqZ-Nn!/^IM!."A>"O-rHs%iCh!W`,po`#,fs-SrK -X7#c_!PQSHrrLa:r;Qh']rV&1):nlgs8)fnrrCLIQiOi"s.o_:s-SrKblI=srrJ^\mJd4"H1Cn9 -lr3`XrrLDXmf*C[H'.%`rrM5KoD\jQR.L=pbqB%e!8$cAs8R&l^&K_5s,$UQ!:'U/aSGi:qa(#W -!V4k:rrq!Ss7-0.#NOn//E!Qb0:rr_h;Ol6-: -(mp0[s3`P"rrCLI/cb2:s$6YQs";b"M#cZ;!J at fIrrJjXnc&X?Ac)K.["8)R"7g`"i;NZVjd>Z> -!PQSHrs/)ps8R''jd>?5s+ppZja$lgo'lY_R$%En!:oma"7g`"i; +\c4#To]b8abegooV4<^)IW]F7=AD=]=^u8kJVfP[V6 at DFb1,81nG7_9JcEUe$2iDZKj.K(VpP4J +s*t~> +\c4#To]b8abegooV4<^)IW]F7=AD=]=^u8kJVfP[V6 at DFb1,81nG7_9JcEUe$2iDZKj.K(VpP4J s*t~> -s8N.>Z*F9-!W.K?rrM5RoD]!pdf6Shqh",5#KSOts(;:nmdU5[dR!p(!6t6;!cYELqu7MX0)ttG -!;HLGdf2T5jo>?H!:KkQdf5.VnG`NUU\=]hqGukDrr_\@Ol63*5OnShUjoUKDM>7)Oh!4Y6"k#^:nc6r0rrM5Rq#:JROoO?rq#:HO63$iTrs%c* -s$>*5On\kVOm_lA!R:N?rr_\@Ol6-:(mpHcs33k0nc8Fa5lg$Hs$6YQs$>*5M([oi!M5eJrrKcX -nc&[W;u- at k!R>?Grr^-=H2IR?!PQbLrrKgXoD]YaR/b#'pW+ues(9@;qZ-BbV:#?0s8SJWq>UKD +bPrj^mGcgF`4E4OS5b9Li#cASudFN0^*8ZFn3'g>hSpJcC<$ZMt3t_jPI;Bp60jZN#F~> +bPrj^mGcgF`4E4OS5b9Li#cASudFN0^*8ZFn3'g>hSpJcC<$ZMt3t_jPI;Bp60jZN#F~> +bPrj^mGcgF`4E4OS5b9Li#cASudFN0^*8ZFn3'g>hSpJcC<$ZMt3t_jPI;Bp60jZN#F~> +h>\_mlep@<_RHV at R#Q`DE+E-K7S[&pCNb5cPb+hZ]Z/=PjR2eos+13GrsAVVYD-@^IAbHdY5a"~> +h>\_mlep@<_RHV at R#Q`DE+E-K7S[&pCNb5cPb+hZ]Z/=PjR2eos+13GrsAVVYD-@^IAbHdY5a"~> +h>\_mlep@<_RHV at R#Q`DE+E-K7S[&pCNb5cPb+hZ]Z/=PjR2eos+13GrsAVVYD-@^IAbHdY5a"~> +n,FX.mc2sE_RH\BR#ZiFDIcpH7Sd/tDL$kpR%g[k_T^WilLk.-s+139rs8,4RrM/8Oh0\Ss*t~> +n,FX.mc2sE_RH\BR#ZiFDIcpH7Sd/tDL$kpR%g[k_T^WilLk.-s+139rs8,4RrM/8Oh0\Ss*t~> +n,FX.mc2sE_RH\BR#ZiFDIcpH7Sd/tDL$kpR%g[k_T^WilLk.-s+139rs8,4RrM/8Oh0\Ss*t~> +,6.K,j4MVn\#c9hN.H.f?rTZi +,6.K,j4MVn\#c9hN.H.f?rTZi +,6.K,j4MVn\#c9hN.H.f?rTZi +&P5Vr@;L.>NL6KD\\uhJjm`2!s+13$s82g%nAh,A9kKKtj.QF&~> +&P5Vr@;L.>NL6KD\\uhJjm`2!s+13$s82g%nAh,A9kKKtj.QF&~> +&P5Vr@;L.>NL6KD\\uhJjm`2!s+13$s82g%nAh,A9kKKtj.QF&~> +!;h?IJcC<$n,E^mgp;iE:jJn^p72/5~> +!;h?IJcC<$n,E^mgp;iE:jJn^p72/5~> +!;h?IJcC<$n,E^mgp;iE:jJn^p72/5~> +JcC<$JcG<@#kH*0G"uP,\)E\RJ,~> +JcC<$JcG<@#kH*0G"uP,\)E\RJ,~> +JcC<$JcG<@#kH*0G"uP,\)E\RJ,~> +JcC<$JcGHD#iE(L at S_3Ab4LntJ,~> +JcC<$JcGHD#iE(L at S_3Ab4LntJ,~> +JcC<$JcGHD#iE(L at S_3Ab4LntJ,~> +JcC<$JcGWI$2)N:GuA(.[,1eCs*t~> +JcC<$JcGWI$2)N:GuA(.[,1eCs*t~> +JcC<$JcGWI$2)N:GuA(.[,1eCs*t~> +JcC<$JcGcM#iiOXAkmE=a7>,fJ,~> +JcC<$JcGcM#iiOXAkmE=a7>,fJ,~> +JcC<$JcGcM#iiOXAkmE=a7>,fJ,~> +JcC<$K`;ARd&27h?&5c>rJ(?&~> +JcC<$K`;ARd&27h?&5c>rJ(?&~> +JcC<$K`;ARd&27h?&5c>rJ(?&~> +JcC<$M#RbE^6NG,E1+Z4JcC6~> +JcC<$M#RbE^6NG,E1+Z4JcC6~> +JcC<$M#RbE^6NG,E1+Z4JcC6~> +JcC<$NW0=_euXF(=G![+qgneGs*t~> +JcC<$NW0=_euXF(=G![+qgneGs*t~> +JcC<$NW0=_euXF(=G![+qgneGs*t~> +JcC<$QN%EM +JcC<$QN%EM +JcC<$QN%EM +JcC<$R/[Q^EWuMcLgF#-VpYA~> +JcC<$R/[Q^EWuMcLgF#-VpYA~> +JcC<$R/[Q^EWuMcLgF#-VpYA~> +JcC<$Rf +JcC<$Rf +JcC<$Rf +JcFj3"7NRBAq==$?NF:^r#l%p`a8gXGGsZ*s*t~> +JcFj3"7NRBAq==$?NF:^r#l%p`a8gXGGsZ*s*t~> +JcFj3"7NRBAq==$?NF:^r#l%p`a8gXGGsZ*s*t~> +JcFp5"oY/oL +JcFp5"oY/oL +JcFp5"oY/oL +JcFs6"8uSOm=G:gs760lpQT+SYQ'+~> +JcFs6"8uSOm=G:gs760lpQT+SYQ'+~> +JcFs6"8uSOm=G:gs760lpQT+SYQ'+~> +JcG!7!r6P_JcC<$mf*?i*;-Q9J,~> +JcG!7!r6P_JcC<$mf*?i*;-Q9J,~> +JcG!7!r6P_JcC<$mf*?i*;-Q9J,~> +JcG!7!J[K7s8VrrpXT9Gqs+4Yli."_pX0$@o(E"`o&\0ss8)fja8Z4#D#:L;J,~> +JcG!7!J[K7rrVrlpXT +JcG!7!J[K7rrVrlqpk]Jme?VDrrDW:rrVK_qtC$ji:kOs!r)Tha8Z4#D#:L;J,~> +JcG$8!nCHKkPkY*M-TK*ru&'AE,\V.s48lc!56e\GlW+UMJrR`s49Q!qYpWb!5e.'"l)m>JhFP! +rrfT&M#ci9rr_\$:TO0g#1s`~> +JcG$8!nCHKkPkU?[mAjM)1hj?>\5`:M'TY!6sO'!f=BPqu7,+!.t6U!-uum:Y^O%i;W`]>QDij!/X!ujo5@$ +\$>s`~> +JcG$8!nCHKkPkTZX,5^5)X^BRM*[O/s*8m/62s`"5u2b+YQ1'jqiO1rqYpSm61"UTT)aIJB(G?h +"S,?F:PniG".4oFqt9sn:N/TqGl[9lrrPusM>R;iJcN(UM#aTW!.!9o0)P\Knc2J1:I0Rb\)mVj +EOW4QJ,~> +JcG$8!J%cDrr^?=H2IR?!Q)qLrrJMToD]X[df5/"s,i0UJ__YF-3 +i9L(:"dkGPblI>0rrL!Xq#:ILc2Y8dq#:AqM=^`Oc/ns*qtm#[rr at ZCrrN#Ar;Ql?V0Vt8rtmB5 +s8SIKs331rqZ&8Ks8)dKs8)fjs"9GrrrUn`rj)QS~> +JcG$8!J%cDrrS%oH2R[COn/,D!."29)#"%-rrA\k!7LnP]qtb\!<:ZlQiN!Cs)@c5!C?;OrrLCA +p\t at Kdf5.(p\t8Vo(i:hnc8^iE9d5u!Dh/8rs#>"f)Yj&aS>c9jd>]?!UA;7rrS%oH2IUZpAjsf +s";b"M37hi!.t7NhuJW6f)YjA!7L$0!nq,_ZN#F~> +JcG$8!J%cDrrR/EZ2O\'qh"G>!TfsFrtrgCs6]m=nc8ReH0VI1R$doSl;%Dss72fXrrMjip\t6< +p\tEk!;HLGOneqWqh"VC"NW4qs(;'+"8`)mqt0mmX8eQSs/YG[rrKgXo`"sDlMUY`E3Z\Fru''6 +s8Vfnp\ukos-Nf"s8SnqaT%Wps2Y32k5PM:@fE\5J,~> +JcG'9!qoIck5T&Tc)(HFO\bBF>e+I'!/[?90%0K>JnEdaYOW_Z+n5s/Q.# +s763inc8+Xs2_5 at H2j8snp,glme:[_!6G2-H#WZ\s57,^grOG>E88NR>]AJcOoMljp\.TuM0]-+ +O\bBF>hlT9>ih>u0!T!gc2[?kTC+>[]k1kd!!'(XApLHW]m3DpmXf&Cs8VWimf3==Jm?CA0!T#h +YlL/JTC+>[]k1kqZ%?6>:B7[!rrqN/V>oX0rVm^#aT):-M>u!Vs6ah+_Z.)a63$KUp\Orejo5?l +gTpj0~> +JcG'9!qoIck5Q=4je)R)T3U:SH*LsnC/_;]&df48^s57.-X8ddD +>i5U-pQ9`?mr4Bhg]1.8s6ib8blI=%JhDZU6-Zla>hB"CM*^FYJksJfs31QCru84p:[4c/a=bn[ +0!nF+blI=%JhF +JcG'9!qoIck5Q="f?!N.M4^gKR$`IXPsP/:B)fPr6-+!t^&J$L_KfC*i50bEE8\tns4789pAe"S +s82irOcfYC'T&Xdi:<98[s;5`s1N\s:]Jjp:WWP88ZMiCqg!HlTDNnZ>bCQep\Ores0m8YfCF3D +T;qsZmXf&Cf4KUefDpO#pX__*T4[M:M#`#*E9`::>k7W7H#WYcJm at F;s,iHCru7>NH2Dl!Z!?Dk +>e*/pT4[M:M#bqTAtQa:E97*!"fp7rs)>[Nru''Is8VWimf,Sts.=6_s8-b$c2Wons02Rujo5?l +gTpj0~> +JcG'9!SD;KrtPOch"$TKqZ*n_dXqKbaF_M5E:Qg!rr7JhH2fMKaEder]cs+15rs3cN!6-/s%iZ6'J>OJbqB%aR&)G8B$Dt.nc2GcTDRaM!KO[qs*t~> +JcG'9!SD;LrtY))qniA!pZ_b1jcRXa!:hc:mVqndrVmR`aSPu3K#mfhp\+Z5/cb2:s*4Tirr3#I +!<3".OnZ&lMiKG!:Kjenn+8o!:n2s6.c/-!<7YInc8]AV>ihI!-%B+Z+&fpnc8R(s$?Ca +:X&m\JoKiKl9PENs,kD&!:mu,jmFbLs*<_2K#3BEOk0TMJcPiNdK'=I+6r^Z +rrDW,!9L(RblGibdSE0Bqu-NqlIZ%8)#"#BE,Yg%s,i0pPGN!s3^mC!5dgs!KO[qs*t~> +JcG'9!SD;LrtWCUqoJ>(s1JEonk\i)60_8G_Q1qDrVmQtqoE%B62S`.s31Oq!($M^l9PETrr<"\ +rr6JRs*4V&R-F\Onc75ns6o3[nc2GcTDSY?jfsZZ>l2V5:]G$o +YlO&AZ/u#1!!(XN:\)q"s+5OXo)SOZB)?2]K$F=@eH!iHM?!Urr3h[!,umh!:KkQc2X0_!7J`t:X/p,!'rp+jSo7@\?c-b~> +JcG'9!R?#Mrt*ETB)e"1s$=a+c&)Hda?f7nrrGp`rr4k-!9Gj$f)Xnbmf,T$s1JF,mf2Q)>lXip +!:p0iaMRto!!)F>c2Z2l0$+'T_NC\VlM!REaSu3#>bAK^s'22*M>r^#YlO at ps-T0+m`b`Ds,k1> +B'SLPdOtRsp]&Ju!Vs6c$D!.q]30)tJBhuKD1rrJRkZN#F~> +JcG'9!R?#Mrst_%TDq4JpAjsfM9,PojoGD\!V.lAru%Y>i7pJpAk*jGsV?%s31P?s8ULI +rr7J1mf.k=61P$Ms-S06o)D#H6.4]ZhuEcBs8VfndW!J*!7Gi2s";`=>lXipH(RD&T)bM`61Tl5 +jm)`*M?!/Hs.o_NM9,Poo$ROtZ +JcG'9!R?#Mrsr?7c0eC-bsDC0:\W+"_Lhde!Q^,rru#(pSNJr,Wi>QE%::]E`/ +jmN.7c2[53qfr29:\W+"s,iHDnc8+X]np"860eLMaDg8&p](8UOoPHDX6&XDs.o_qs,"hs:\W+" +s,iHD6.4l_rr3)P!!)cgrts!Hs8Vfnmf,Sts,ll/:M0Vmc2WouWrV_OrrJRkZN#F~> +JcG'9!R5iIs*26W6,Jc$s$=p0c#E\8aBXl-^"bpAs7bgQ6*]_TpHc(Ls8O^rs31Q7>l4Q763$u^ +!;HNnc,0M\QiQ]&TE!>E>c[m]_OkH?lD=O/5q^F^X+J4gs/Uags8SIKs)9Ujc!:9$o"G&h_ND^e +!;HMUf.R*kE<#r&H'-?js";Ci!;HM\OoL9Cnj2%2lM$ZAX8g&]s8)fjs7ZNKs.AkYQiQ^J63#2K +s";Ci!;G(Fp]$B at JcLr(qu6ZSrVm^#c2[g2OoNZYs7_BMJcPi&!<;orqqqIfjo5 at KXKqkV~> +JcG'9!R5iJs"j)kmJuf1o(rF]s,"5^!:Bj.s-W+)s8VN]geYEZs4gDZs8Vfnqu;KQmVr4+E1$\* +f)YgMA!-?^s%b9I!8RU2VuYWQ0(M +JcG'9!R5iJs"i*o_Ck7Ps3a45s$>qk6/2J*pRfN`s8V3XV2<(hs.tRhs8U/+s8O^6]s7V;!7LoI +R$%CJGBs5gmJrX9!;HLG\H)Nt:\OkEs.AlVQiN!6pJ8'Zs7] +JcG'9!R5iIs%?.aE94,#T)a`JjT&O]M:V_-R/_+Xi3=oi!'pUog]0V?\#TL at JhFP4Jkr!kc2[g9 +!/^UDE'`dhs'5!R!39A[f)T%UH1Cq8:\XkgB at ecW>Q?B]pKR\N>h)V9fDdI!aT,p*Jkr4^jf8Bp +Du_NGM#c0-/pWR3mc=FR:PlO\\*dKsm]->,!4RO[0'^jb!.t7NT)a`Fs.o\q\&^l8:J^if>i#Hc +:PlO\\,UCI0$s["qtg=7g]7*Ks3^mCmahG)g.q^^QiPRrR/_a +JcG'9!R5iJs%Dn_Z"F#J!20D%s1JDE0"nLi!6G$;>l.cnV#W,#i2$E+0&V<]JoF$2rr@>,0(/c1 +GlXoFgd-5cs7/tc_>piGpT":+!2%[>!.t1LB"\34!%n8.qZ&5KM7in.o&Tk.V#YH7XoP_=s(28] +!!#g`:J^QC!0M54s1JDE0"m)Agt)O_s(27M!7a at 8>lUW#!4W"!GlXoFs)7rUJl62pm&WrRbOYlK't!)LgX61V;/nkT8,GlY>RGlZIYrrJLgZN#F~> +JcG'9!R5iJs%CF_N15s+p_p0&V<]0'_3lOoGF0>Q?B]pKR\N>j"l_M,.aShuJmYE<#sn +:G1)q]`>,5s36]+O_0uCs*4TL!6Cu:!4Vt-BD7chf)RE'\(:U4!4SR#R/aVqZ"k5?(Z1e5o:I3>-!1>k_%=blGV]!543h +E%]O6>k6;C!/[(Jh"gsN>bD#q)M.sos+p`PWrRFi6$`K^pX0%;b"k=Yq^u.Ak5PILXKqkV~> +JcG'9!R5iHrrDWhrrDfks8VuprrDfmrrDrqrs=h9s6a-Sdf8`?qYpZps6fdRrrME^rr2umrVllg +qYpofB)hn'[q>[?T?-m/!;l`p!:p-h"8Diqo)&IeqZ-'`s8Vujrrr/squ?]jrr3#ro(`4cp\Xge +"T/6!qtp6i!:m`$!LTsos*t~> +JcG'9!R5iIrrN#brr2uqr;QckrVuops8N)rrVm19o)I.#B(GuMOo#+XqZ-'RrrN#^rr3#nqu6Tr +qssU`$GE)3s'3%*s8Q?uqYp`ns82inmf*4gqu?]eqYpTjmf*4dp\+Ujqu?Qns7cNms7c +JcG'9!R5iIrri5is8VunrrDflrrDfmrrDfmrsIk5s8SIrH2mo3c2%A?p[[hR!V5[XrrDflrrMlk +qYpkYdf8`IM:2FlB)2H,qu6U$qssdequ?]no(r at eo(W.`!;H$`!;HKm!:oma!:osc"8Diqp\Omj +qsq>u!LTsos*t~> +JcG'9!R5i0rs=90H"PKV/pV'We,Ka9!+pM5jT&n +JcG'9!R5i0rs:;RJnFR+:P*3Le,K``!-rOa[fC\mX+C<2rrJLgZN#F~> +JcG'9!R5i1rs at T`ApK6k!+pM5df0W*/pV'\JhD=\f7Et^rrJLgZN#F~> +JcG'9!R4ul]E,4;rk&98XO+Tb\ZE*L]Xb,LJ\:!T!HY?Js*t~> +JcG'9!R4ul]`5)4]`5([]EbaD[_08YXL<\mik,;5XKqkV~> +JcG'9!R4um]Ec!KZFmi\XKp3c!O&U(]E,4;J\9sS!HY?Js*t~> +JcG'9!R4 +JcG'9!R4 +JcG'9!R4 +JcG'9!R5i$rr>d*rr?*4rrJ4g]`/#"XKqkV~> +JcG'9!R5i$rr>d*rr?*4rrJ4g]`/#"XKqkV~> +JcG'9!R5i$rr>d*rr?*4rrJ4g]`/#"XKqkV~> +JcG'9!R5i$rr>d*rr?*4rrJ4g]`/#"XKqkV~> +JcG'9!R5i$rr>d*rr?*4rrJ4g]`/#"XKqkV~> +JcG'9!R5i$rr>d*rr?*4rrJ4g]`/#"XKqkV~> +JcG'9!R5i$rr>d*rr?*4rrJ4g]`/#"XKqkV~> +JcG'9!R5i$rr>d*rr?*4rrJ4g]`/#"XKqkV~> +JcG'9!R5i$rr>d*rr?*4rrJ4g]`/#"XKqkV~> +JcG'9!R5i$rr>d*rr?*4rrJ4g]`/#"XKqkV~> +JcG'9!R5i$rr>d*rr?*4rrJ4g]`/#"XKqkV~> +JcG'9!R5i$rr>d*rr?*4rrJ4g]`/#"XKqkV~> +JcG'9!RH#'rr>d*rr?*4rrJ4g]`/##XKqkV~> +JcG'9!RH#'rr>d*rr?*4rrJ4g]`/##XKqkV~> +JcG'9!RH#'rr>d*rr?*4rrJ4g]`/##XKqkV~> +JcG'9!Ru2'rr>d*rr?*4rrJ4g]`/"sZa0U]~> +JcG'9!Ru2'rr>d*rr?*4rrJ4g]`/"sZa0U]~> +JcG'9!Ru2'rr>d*rr?*4rrJ4g]`/"sZa0U]~> +JcG'9!UWq#rr>d*rr?*4rrJ4g]`/"Sbd.8!~> +JcG'9!UWq#rr>d*rr?*4rrJ4g]`/"Sbd.8!~> +JcG'9!UWq#rr>d*rr?*4rrJ4g]`/"Sbd.8!~> +JcG$8!H-)orr>d*rr?*4rrJ4g^&J0!;uEs$J,~> +JcG$8!H-)orr>d*rr?*4rrJ4g^&J0!;uEs$J,~> +JcG$8!H-)orr>d*rr?*4rrJ4g^&J0!;uEs$J,~> +JcG$8!Om3brr>d*rr?*4rrJ4g^&J+uR'H[A~> +JcG$8!Om3brr>d*rr?*4rrJ4g^&J+uR'H[A~> +JcG$8!Om3brr>d*rr?*4rrJ4g^&J+uR'H[A~> +JcG$8!rHZ5^Ae1-]Dhk3]`/"o[(cPAfN.IGs*t~> +JcG$8!rHZ5^Ae1-]Dhk3]`/"o[(cPAfN.IGs*t~> +JcG$8!rHZ5^Ae1-]Dhk3]`/"o[(cPAfN.IGs*t~> +JcG!7!pBg(^]+:.]Dhk3]`/"o[(lVBfM0_ss*t~> +JcG!7!pBg(^]+:.]Dhk3]`/"o[(lVBfM0_ss*t~> +JcG!7!pBg(^]+:.]Dhk3]`/"o[(lVBfM0_ss*t~> +JcFs6!pNao_#FC/]Dhk3]`/"o[(u\C_\(G&s*t~> +JcFs6!pNao_#FC/]Dhk3]`/"o[(u\C_\(G&s*t~> +JcFs6!pNao_#FC/]Dhk3]`/"o[(u\C_\(G&s*t~> +JcFp5"R'iC]D9AE!):**!*6c4!Ka\+rri;?Iq at 67s*t~> +JcFp5"R'iC]D9AE!):**!*6c4!Ka\+rri;?Iq at 67s*t~> +JcFp5"R'iC]D9AE!):**!*6c4!Ka\+rri;?Iq at 67s*t~> +JcG3="nC$HP]YXYrr`5:ISRde!&X4P!`_6Lc<^K/d9Zi0:$u +JcG3="nC$HP]YXYrr`5:ISRde!&X4P!`_6Lc<^K/d9Zi0:$u +JcG3="nC$HP]YXYrr`5:ISRde!&X4P!`_6Lc<^K/d9Zi0:$u +JcGEC$h2QLPB9f%EKIBLr;6Kpr9UlS"lun*8rMMrjo_heCVd: +JcGEC$h2QLPB9f%EKIBLr;6Kpr9UlS"lun*8rMMrjo_heCVd: +JcGEC$h2QLPB9f%EKIBLr;6Kpr9UlS"lun*8rMMrjo_heCVd: +JcGWI$gZ$?O`OQ$EKIBLmAg0imA*j(^\aK""T>o9HeO&NgAc[~> +JcGWI$gZ$?O`OQ$EKIBLmAg0imA*j(^\aK""T>o9HeO&NgAc[~> +JcGWI$gZ$?O`OQ$EKIBLmAg0imA*j(^\aK""T>o9HeO&NgAc[~> +K)Z8XkJsQ[Cee&TPd/R'VZ-eJKMdulQ2_!b[TJ( +K)Z8XkJsQ[Cee&TPd/R'VZ-eJKMdulQ2_!b[TJ( +K)Z8XkJsQ[Cee&TPd/R'VZ-eJKMdulQ2_!b[TJ( +M#RnVf=IQ)@nL*TRCCc?U]1MnZt3gRp6#@XqQ3bQkCNZis*t~> +M#RnVf=IQ)@nL*TRCCc?U]1MnZt3gRp6#@XqQ3bQkCNZis*t~> +M#RnVf=IQ)@nL*TRCCc?U]1MnZt3gRp6#@XqQ3bQkCNZis*t~> +NrKONb-$kJ<_[@cUr)$cTDo&UQ;iF^N;j%TVGrWCJcF[.J,~> +NrKONb-$kJ<_[@cUr)$cTDo&UQ;iF^N;j%TVGrWCJcF[.J,~> +NrKONb-$kJ<_[@cUr)$cTDo&UQ;iF^N;j%TVGrWCJcF[.J,~> +Q2_9eg:a25AkQ?QPd/R$Rf +Q2_9eg:a25AkQ?QPd/R$Rf +Q2_9eg:a25AkQ?QPd/R$Rf +SGs&tkKL/rG$.IOKqZ9:pm;!aor_Y;]_[<]"R_IPV"]H?jSs`~> +SGs&tkKL/rG$.IOKqZ9:pm;!aor_Y;]_[<]"R_IPV"]H?jSs`~> +SGs&tkKL/rG$.IOKqZ9:pm;!aor_Y;]_[<]"R_IPV"]H?jSs`~> +UAkYhdC,Kn at nU$MPH`9qP5b[EP#I+dJcGcM"QtYCYl'(Pk5Tr~> +UAkYhdC,Kn at nU$MPH`9qP5b[EP#I+dJcGcM"QtYCYl'(Pk5Tr~> +UAkYhdC,Kn at nU$MPH`9qP5b[EP#I+dJcGcM"QtYCYl'(Pk5Tr~> +WW*Fuf=R]/Bh_WKNN'kRqN(X[rlB=cU at 3[5qu6cUHX+:9s6'E4~> +WW*Fuf=R]/Bh_WKNN'kRqN(X[rlB=cU at 3[5qu6cUHX+:9s6'E4~> +WW*Fuf=R]/Bh_WKNN'kRqN(X[rlB=cU at 3[5qu6cUHX+:9s6'E4~> +Yl>1.gqfhDDGsAJLnh`=p58kRorMJ9]_d9[p\t?EDJ..Ds69Q6~> +Yl>1.gqfhDDGsAJLnh`=p58kRorMJ9]_d9[p\t?EDJ..Ds69Q6~> +Yl>1.gqfhDDGsAJLnh`=p58kRorMJ9]_d9[p\t?EDJ..Ds69Q6~> +\,Qp/ftXAAEE5eHJtBO&n:glFifR,pf>mn%rTr at d^pBr/Ob\C/DeW`jra$"@@:j:rH\dlZYJSoY +bl7daATZUVs6K]8~> +\,Qp/ftXAAEE5eHJtBO&n:glFifR,pf>mn%rTr at d^pBr/Ob\C/DeW`jra$"@@:j:rH\dlZYJSoY +bl7daATZUVs6K]8~> +\,Qp/ftXAAEE5eHJtBO&n:glFifR,pf>mn%rTr at d^pBr/Ob\C/DeW`jra$"@@:j:rH\dlZYJSoY +bl7daATZUVs6K]8~> +^AeZ2e[qN0D,X8GKV#^%m=G9 at rl94`U[ZY10_ah\[@`>$B3.\g1IFoCD1e+P[)'f.e_fb.t9XQ[rsV94rpUbjs0]"TGl5KB7[amJh\~> +^AeZ2e[qN0D,X8GKV#^%m=G9 at rl94`U[ZY10_ah\[@`>$B3.\g1IFoCD1e+P[)'f.e_fb.t9XQ[rsV94rpUbjs0]"TGl5KB7[amJh\~> +^AeZ2e[qN0D,X8GKV#^%m=G9 at rl94`U[ZY10_ah\[@`>$B3.\g1IFoCD1e+P[)'f.e_fb.t9XQ[rsV94rpUbjs0]"TGl5KB7[amJh\~> +`W$D5d^Pd"BhhTELn_Q5n:CW;rrr(s?#I at Rf`*/`g;L1_G[3it-6O +`W$D5d^Pd"BhhTELn_Q5n:CW;rrr(s?#I at Rf`*/`g;L1_G[3it-6O +`W$D5d^Pd"BhhTELn_Q5n:CW;rrr(s?#I at Rf`*/`g;L1_G[3it-6O +c2S:MiQ/3gIV)5TEK$d1g@^$sp\tBSO].+ih>\/ejialoHWrZs5~> +c2S:MiQ/3gIV)5TEK$d1g@^$sp\tBSO].+ih>\/ejialoHWrZs5~> +c2S:MiQ/3gIV)5TEK$d1g@^$sp\tBSO].+ih>\/ejialoHWrZs5~> +eGg$He\%Z7EEGkCH^(VNi:qm'oD]!m`-#.Wn)=9Yr8>DbJRV&@:f0kN7r=3a`oH+Z#6!DWF\n%I +m/I7\[s(uPo at 3dCl%rHHrIP"?s*t~> +eGg$He\%Z7EEGkCH^(VNi:qm'oD]!m`-#.Wn)=9Yr8>DbJRV&@:f0kN7r=3a`oH+Z#6!DWF\n%I +m/I7\[s(uPo at 3dCl%rHHrIP"?s*t~> +eGg$He\%Z7EEGkCH^(VNi:qm'oD]!m`-#.Wn)=9Yr8>DbJRV&@:f0kN7r=3a`oH+Z#6!DWF\n%I +m/I7\[s(uPo at 3dCl%rHHrIP"?s*t~> +!M&f=rt"tcafq+\AP?*ALS23+lMcA7mf*I^WEX>VrT*tin'%_bA4TU'?<9]rFdBPdnCdgEm]^#6 +am8s0hN1[8qUGNIh0EDHJcGBBJ,~> +!M&f=rt"tcafq+\AP?*ALS23+lMcA7mf*I^WEX>VrT*tin'%_bA4TU'?<9]rFdBPdnCdgEm]^#6 +am8s0hN1[8qUGNIh0EDHJcGBBJ,~> +!M&f=rt"tcafq+\AP?*ALS23+lMcA7mf*I^WEX>VrT*tin'%_bA4TU'?<9]rFdBPdnCdgEm]^#6 +am8s0hN1[8qUGNIh0EDHJcGBBJ,~> +!fpI)kPl(llI*85 at G0-0"3tUue:IYns*t~> +!fpI)kPl(llI*85 at G0-0"3tUue:IYns*t~> +!fpI)kPl(llI*85 at G0-0"3tUue:IYns*t~> +"TR+\MZ*&E&+A2eW/u738m$(iTt/V:rdk+1rrr;5DHj+3l2M7bbbTYf:LRa?:K)M.^Zj~> +"TR+\MZ*&E&+A2eW/u738m$(iTt/V:rdk+1rrr;5DHj+3l2M7bbbTYf:LRa?:K)M.^Zj~> +"TR+\MZ*&E&+A2eW/u738m$(iTt/V:rdk+1rrr;5DHj+3l2M7bbbTYf:LRa?:K)M.^Zj~> +s8N2qI=2"hrt"YR_Q/lIA5-!>K:B3jj8+?,hZ!cFT2p3Wrp9XprnXl:@7aX2>tS at OUW;Z:rrV1h +U$DXZmq at j3rri2!<0H^$s8)bG~> +s8N2qI=2"hrt"YR_Q/lIA5-!>K:B3jj8+?,hZ!cFT2p3Wrp9XprnXl:@7aX2>tS at OUW;Z:rrV1h +U$DXZmq at j3rri2!<0H^$s8)bG~> +s8N2qI=2"hrt"YR_Q/lIA5-!>K:B3jj8+?,hZ!cFT2p3Wrp9XprnXl:@7aX2>tS at OUW;Z:rrV1h +U$DXZmq at j3rri2!<0H^$s8)bG~> +rr3W0G&-O"_Q/oLBMMH>JXE[^htDX$f`)*#Jl7oqmJdXhc(]GU:L%.!;gY4Zn%AZ%m8'nMrrVn# +PgTL6o:&XRpjrJCs*t~> +rr3W0G&-O"_Q/oLBMMH>JXE[^htDX$f`)*#Jl7oqmJdXhc(]GU:L%.!;gY4Zn%AZ%m8'nMrrVn# +PgTL6o:&XRpjrJCs*t~> +rr3W0G&-O"_Q/oLBMMH>JXE[^htDX$f`)*#Jl7oqmJdXhc(]GU:L%.!;gY4Zn%AZ%m8'nMrrVn# +PgTL6o:&XRpjrJCs*t~> +%Df$+HX\$GBn;\Ua5?Q at s4@8WrosI_oWDV8[J0.i%.V9%BgY`u9M0Jt_W\H.!q0?qlMgqZ>b'1@ +#3^eC\,GmjJc>`MJ,~> +%Df$+HX\$GBn;\Ua5?Q at s4@8WrosI_oWDV8[J0.i%.V9%BgY`u9M0Jt_W\H.!q0?qlMgqZ>b'1@ +#3^eC\,GmjJc>`MJ,~> +%Df$+HX\$GBn;\Ua5?Q at s4@8WrosI_oWDV8[J0.i%.V9%BgY`u9M0Jt_W\H.!q0?qlMgqZ>b'1@ +#3^eC\,GmjJc>`MJ,~> +#DJYQal)i=PC`b^rs/@(?J:B8Lt2"p%.:ln?9V"U6=Gh\hYse[!q'C+lMgqZBrTGY"kn$-H8Xr< +s*t~> +#DJYQal)i=PC`b^rs/@(?J:B8Lt2"p%.:ln?9V"U6=Gh\hYse[!q'C+lMgqZBrTGY"kn$-H8Xr< +s*t~> +#DJYQal)i=PC`b^rs/@(?J:B8Lt2"p%.:ln?9V"U6=Gh\hYse[!q'C+lMgqZBrTGY"kn$-H8Xr< +s*t~> +qu6`lA[I$geGfaA5QCshWU]`_&GCgfn9;^cP#a\75t$$obk.t9!od25lMgqQ=3Sti"MG9F+kVDH +J,~> +qu6`lA[I$geGfaA5QCshWU]`_&GCgfn9;^cP#a\75t$$obk.t9!od25lMgqQ=3Sti"MG9F+kVDH +J,~> +qu6`lA[I$geGfaA5QCshWU]`_&GCgfn9;^cP#a\75t$$obk.t9!od25lMgqQ=3Sti"MG9F+kVDH +J,~> +qYpWZ +qYpWZ +qYpWZ +q>UNC>4R7Ef`)0$)#t79G/*hP!P^De!!5-un"B[]V0M8)!k2qBcMn$rLH5d at K`?Q~> +q>UNC>4R7Ef`)0$)#t79G/*hP!P^De!!5-un"B[]V0M8)!k2qBcMn$rLH5d at K`?Q~> +q>UNC>4R7Ef`)0$)#t79G/*hP!P^De!!5-un"B[]V0M8)!k2qBcMn$rLH5d at K`?Q~> +q#:J]I&VX:JT9Ib"(sYe at J4[JDEo3]%L34F*??cBE`o!7pqU% +"*9$pkOnk*~> +q#:J]I&VX:JT9Ib"(sYe at J4[JDEo3]%L34F*??cBE`o!7pqU% +"*9$pkOnk*~> +q#:J]I&VX:JT9Ib"(sYe at J4[JDEo3]%L34F*??cBE`o!7pqU% +"*9$pkOnk*~> +q>UWaLECWXeUc5$eG7Ste]k+(CshVL!oR#Bli..GE?:"[eq)?-e-*^P +q>UWaLECWXeUc5$eG7Ste]k+(CshVL!oR#Bli..GE?:"[eq)?-e-*^P +q>UWaLECWXeUc5$eG7Ste]k+(CshVL!oR#Bli..GE?:"[eq)?-e-*^P +qYp`a;k2-?rIP!"s7H +qYp`a;k2-?rIP!"s7H +qYp`a;k2-?rIP!"s7H +qu6lQ50*^'Ha&)$JcG?A!q9*kmJd7^=5<6D#/ia^s8?HMJcFF'!jr*tq>Ys~> +qu6lQ50*^'Ha&)$JcG?A!q9*kmJd7^=5<6D#/ia^s8?HMJcFF'!jr*tq>Ys~> +qu6lQ50*^'Ha&)$JcG?A!q9*kmJd7^=5<6D#/ia^s8?HMJcFF'!jr*tq>Ys~> +r;Qic=Mb":!od;VmJd7^qtnqDs75FS!VcK=rrVK_qtC$jjmLFo!r)ThaSu>23lC at b!P!FDrrV"V +f`(mOb%LML!r)Thh#IEFq#:BhqsXOdlMLJTrrN#fjo5DVqtnkB!iTAnqYu'~> +r;Qic=Mb":!od;VmJd4]qpbWIme?VDrrDW;rr`/`s82Ni!T<^trrMlka8Z513lC at b!P!FDrrV"V +f`(mOb%LML!VcKGrrVW_qt^6lo'cS\qs+4YqYpTjqrRhYp\WD=!iTAnqYu'~> +r;Qic=Mb":!od;Vmf3=a!;G"C!p][[lMgkTdJs7;!;lKi!W1g#s8VrrpW*:8n2eJSrrKWTn,EIF + +r;QeYR/HsbJ at 4eE!`-(QhZ"MkJcLC-E;0C;:Pf)::N/TcGlY/NR/d&G6.bu5!mL`5mJd?^!.nHf +o'QG[pHaX3K(o9IaE[dDp&>4lE'Zd8!:o.L!`-(Qr;RZ3JcN(UM#aC#!)L^40)P\KpAe"6:I0Rb +\*!\ldTcS9rrW+"ipcsKFgCrF!G0XRrrQ!$K&-G0Ytp2VlMCM]>f-%2"SY3=:P/HC!Om at Krrqt= +!/X!up&>(hZ%DoR)>f!cZ2]X\V5jTAhG5d$s8Vfn:X)[$JhFP&rrJ4JqYu'~> +r;QeYR/HsbJ at 4hF"7ea7_VY;2mS6';3IH$O?]pAfdFAnF>r!6G3.AnLK-rrJqrmJd@\GlW[e +MMJ!:o[["PbVl!5eU4!G94Crrq1D +6%U_upAY6c6&EJVrseBl!8$d;!6p)qT@*^brr38U!-u6XAoL&knc&WOQhp`4~> +r;QeYR/HsbJ at 4hF"2]mjmb[s^dK!'p6,!6@!-nQi6($[3"2]mjmem(oblCQ1f)SV3JcMFB!4Vt-#bM*tT)aIJ +B(G*a!n(_rIGqYpQrme?_b +]`;Y`6/;26"2]mjmem(oblCQ1f)SV#:B8)/!4Vt-#bM*tT)aIJB(GKl!K`ZEs*t~> +rVlrc;u- at k!R>?FrrQfGX8MttK(ApAK(K!ZpAk*j!2'9Dc2Y8dV>lpFs/YE\!58F,OneqW>jhCe +!6t9<"oA;os"9H.rr at ZGrrgRHs8Q?urrHBLoD]#ks-SrKX6TK[!Q)qMrrLa:r;Qh1]rV&1):pM@ +s7ZNfs+umZ> +"tn1#\%VfnlMh+6!<<((s2)kHrrq",s7-02pAY2+]rV&1):pM at s7ZNfs";b"QiOi"s.o_4s-SrK +blI>*rrVmlnb`?:~> +rVlrc;u- at k!R>?Grr_h;Ol63I8QlMo,Mq>UKm +62:H\o%3X9"kNbSnc7,5rrM5Kq#CAN!rqA-p\t9pqtp'd#4B2)0%0cVp\t8Vo(;q_aSYr9"7g`" +i;df5.(nc&[a;XsYaJ,~> +rVlrc;u- at k!R>?Grr^-=H2IR?!PQbLrrKgXoD]YaR/b#'pW+ues(9@;qZ-BbV:#?0s8SJWq>UKD M>7)Oh!4Y6s-Noga8kf+rrKgXq#:Hsdf6Shq#:HO63$iTrs$R0qZ-BbV>1&kqh"J?!W1.>rr^-= H2IL=(dZFHs,i]Knc8FY!&"rtn&Hs8S4Ks2[M+pAciG -s8)dKs7ZNfs"9H(rrVmlnb2t`["RfG"7Cc'i;NZVje)/E!PQbLrt^HYs2"d1nc8ReH.Kk46.5dq -pAb3Ts*t~> -s8R3&c)(HFO\bBF>e+I'!/[?90%0K>JnEdU]S^&*),>aX:HK)><>!*m'HM#`[1qfsei ->lX).E+ZemH2k@!s(28Us71+]]pO'tQ!Eau/mJCts.=mJK(hRUs*7E?mXf&Cf3En-H2m!NV>n#M -rVm^#aT):-M>u!Vs35fhlMl]QOoNZYs53n/nc&XDAG6$(b&lbF)8b=.s,!+Tg]2W/AnGa^d`jE8 -i,E:qYlL0jru(*@E+ZfKE,]F&nc7tG!5ebJ!6tQ7s8U=rrr3\)]`>>;H2lZ=E/FVQAr-NYf7I8K -rr5Qp!.t)nJm=]CT7U="pHd((Gu+IuApLHWM3qo1!."=+H#W%oM#c<2:[7uF>ggkLnsF\TK)e3^ -[s;6,s-SC(lIUVmaT):b0)kkiR!EZFH!IgSmVje_>ggkLid$@\i0\e/h#Kacrr3/=i2-HmZ2Xb@ -nc87\s$=a+R#1jfGl[.0M.VnMbqB%S!8$B5!TIDPrrW1#l14iTY`AS[!G:!Pru%lm_Z,I[B!D?' -]k1k_62.!`s1N\RaKY`4rr3kWE*RA;aDbC'h!tI1nc6Q,AcU*Uo)J`PM>mMhJu\n0nr`scH!IWS -i+ at fGo%/IuaSu32YlKCQH%K:gqg!cuR.:7OqZ*Jm[s;6,s,!+TYlL0kR!EZ9H&2O;!.t+BmTe2b -0&h/5!2]`^c&%9^o(RE]B)f,f>il"cObs);)jknipN^#Q:[.pbc!8]A0&h/5!7?C1T=k5Djo58` -X5(SlE3]EB)9jf6s7-0\s-SZCT6W'hs(4RTk`!LB\]rrW'qn,!&% -X5(S_H&7on!19.!/sS`sT4\,:Gu)M#0"q8a=3,>cE88NR>]AJ1!6tQ7YlL/YGqPq4c,_MB!6G24 -Jme+I'!0NoNGqMlts6=QBB"cGAs53n/s07/\jcOLe!7LnJgqrpgi;W`o -bqB%rnc87\6-0(uGqT-sAjONi2-IYO\a=(H-g/[!*mss0(Rq> -Asfh'R/[+'l>U]S^$9QUB"da8lLFqls/Q.#s763ibqB"q"/!7,Z%)~> -s8NtMje)R)T3U:SH*LsnC/]AV?^&N&bqZ'FWs7ZLueSpWNTk==s!*fNlqg!cuR.gUXrrAnqf7Hf>[p41YX8flpTDrlD -rr3l1!:p0i0$XEYM>s2n!<<((6-]FlOoMljqsj[eg19pW!QoNGru%ZgaS0Y1R'?XYR"?rU0)(`< -s1O"MaD`cFrr3kWH!G=HaE_$0i6hW*g]6d>!)Mn[qu?\YM>mNjH)gr'pPJp`H!IWS]l7pVs07/O -lMpnTM#b$MAoM at qqg!cuR.gUXrrAnq[s;61pMbtVYlL0ZJnCY,Ar-N?!.t+Bf.Qfb>k2ir!.Ouf -lA:?no(RE]B)f,f:[7u[Obs,eMcaQsA6TM#cgmAtQa:E97*!"f:"qqZ,RR -ru'5bs8Vfno)C>es.=Q:s8Q=ic2Wogs0i"*k5PJA?1%Xnr`8:SrrK?aqYpS.f^AbWZ+]T"E/Bs$ -0"mX(/pgk'>bD%`M*^EG0"q8aI\23sK(kmh>_;^u!<:gSmeZu[lMpb]s";Rrs6c"p!<:-Ws,hn! -fDiO'E'aN/Jkt\3s72!H\*@REB"dJAE+Zf30)si0h#E4f:\+7!M3r67^$^JaT@[\3!3#t!s74bo -pR#4;Ar-MK!-%(4M0]-ZE+YL;Oa1pCs8O^rs8O),JnCY?6'7:]huJ&L0)(`dt1B:M#`\/ -rr3/,^$bati;W`nObs,;BE01-j>lS'$s-SX/joAZErr6&lJmFjT,1Y!3?.jhuJ&-AnGahc0A)#/su[[H!G=HOcf[Q!;leYH#W%fJhB@[s099*jT,2W -rtplTs8ULIs7ZNas*7Cls57Jho)C>js):d'rrIkapAY/9aQrjDV;0/lJtH;Q!1:6-AmR+aQsB[) -JjIIs0"q8a)9@).E8\f_>]AWL!<:gSmf-l!c2[A7s,i0;rr[PI!8rA~> -s8Nt;f?!N.M4^gKR$`IXPsP/:B)fPr6-+!t^&J%5T7U="pVM2\E8Y=.c2[O=!19.*/sT]0a=^]t -aT%la>_;]&jo6spg]2s'pY5aoct7k^O.ZGt/l-*Zj`#0N^!/kChuMC/Z%?6BO`4P*fDho'aT!mS -rr3h[63$uU!:KkQc2WAkM>uLQ!:p.Udf48knG`OCAG6$(b&leG)Z."WlIUl)c#>;>H&2NkE;O7D -s-SC(iW*6=rr3\)JmQE^!H!G=Hj`#0N^!/kChuMC/M2>L.f84+aE%\iPJksIsE+XBr!3?.jZ#KSPV:T=2/7eg< -o4Ei2s4hm3TDt:(H2IXA6-]H0-.7B at aNZ?HAuj\eH)tu^Au2tUApMgV:WS at mR.C:WqmX9(g]76N -s8S5]rtN^Ds7-0Xs+4%'s57hro)D#(s);6)rrM+bmJd7eg7PN!-4q(0%0K>H#W?T>hoAZqg!HlTDNnZ>bD%YM>shHs4dU+qtL-jnc8+Xs2_GFH2j#lnp,h! -mf/E+/su[+H$T;es57,^i50bEE8\TY>]AV`R/aDkp\.TuM1YcZM.Xa->hmbZ:WU"aApItgc2[OC -E;O7D[r>r%AcR\?AoOgN]n/PkmXf&Cs8VWimf3=8JksJ40"5GnWrSNlE;O7D[r>r)Z%?6::B7m' -rs%E0TE![Hqu6U46-]H0Ocf\7!:K9#!5ec at E)6N)!;H?jV<.^Xa*6qN!qB.ao)A`VW;HSrqbln[ -s)d2ITDtsZ:Z_X^\RpFGJ#2QcdeA$4E7b/9p](9jH$NYeqg!HlTA0EuqtKgb>e+Hu0!oTtGqMm) -s5e3=B"bHgs06PCAcU*UpT":]R"?rU>jfZc>QDkFT7U="pHd7-E*WG2JnCY,>_2s-s5;=ts06PA -rtn&Hs8S4Ds33k0mWefLs06N=s7-0aqZ*J^rrIkapAY/9aR&pFqmX9(np-(aE%\hkJhDChqdu]) -R"@W`!*n=Yrudqc>_;^BJm -qu7B2fA,qZaSPtBjjJb\6-+Z!s)@O)p\t1iOi[D"pW.X[0%^-J!!(XNOi[D"Z/riSs,gpn0(+kC -qZ-BUfDk-fs8RZNH2lr^TqZ-2DE9aW&a8j<]dSE0Bqu-Nqh!4n=)"IZ=E,Yfus,i0< -aML`8nqj3"s3^mC!5dgs!EJXVrrJ"_o)A`J]__X/S=o3J(%MA!aS/"#l2]Gt61WV[mQploX7npY -rtI*_btn?lqoqq:nc3V]!9O7\JcL)qrrJ7=rr6JRs*4V+OmW5Lnc7c(lMiL)!53sapTX^;lMnqN -s";pEH2fMKnc2GcTDSYFjgTj4!;FS/63"2ca8j;F!!(XNOi$tqnqh>Nqa&L(B)?PaK#mt2 -f`98LK)bk5M?!SsYtrF at aS,[1mf/Ejs,k1q!:ktcl=H?f!:Klr/nWQ0rrLp?rr3h`!,umh!:p/P -M>rsu!7Jrt>fcr4!'rp+jo5AT;!e2_E6RnQ!H?ZerrI__p\tuL:]JN163"e%jmGG*f.QJWs2_7h -M>dHN0)Nmhs"=2n:]LHH!."V=63"e%jmI`;mJu@^K(:PoJtN(fqu=qEqs-NdP6/:u0 -!Oe*`rrGmhkPl4rfA,pmp\OrqjcRFW!:iGMmWnOmrVmataSPu3Oi[D"p[S<'/cb#5s/Q,co)Ja7 -0)kkQR.@]dJ,~> -r;RN&!;jY5620XEfB&.9rrDUBp[3"p62gg\0)N^cs+8>h!;HMo!&!jB620XEfB%V*s":SI!<4\K -aA;iflMoK$s6;lMX8e=,s+54Ojt?\Y!<7#Zc$Bd_`[nc2X.25q^s]rr>jgrrJpiir9b<:]J<+63"e%jmGG/f)Y4ks2_%bM>dGg -0)N^cs"=2i:]JiCJcIG#s6;lMX8`,"Obs);D/fN#!9K at 2!<;cnh>mTD0'*)]/qWMR!1QCDns*<_2K$@*k_Y6 at rAsfh'nc5rVs31NDfDe/2f)Yi&E96foqtk"*B#8ir][0)q&j_MS;Tf@#NT -rtY))s+7*0s3^ojT*^]K'na$R/?o8 -aSPu3K#mfhpX0%;!5ed5B)cJ[btnAVdY\!9R'?Y^!3tYcWrOdCs$?D2!<3&(jnf&Ti-G>&nh0\) -E3W3`!6G3?0$XFrAsfh'o%*k\s8Nd!p]!PRf)YgNZ/ku&JcPiAQiN!)r;Qf=qu6U4QnE>s>XADi -0$XEAdK'/rf)YCA5sYKimcFHLp/(,U!H?9RrrI)jqYpSJ](c4>JtMVhdY\!UE96[Ds,i/TM>r^i -Oj3n*;=X_eJu/#s*4Tp~> -r;RMK>l2V5:]J*.jml4ijYaB\cBJcL)rnk];!!9Nc;md:):]nu;G -s+7*Ic27Ocqu=n@!8%6Ho(t&Ejh6NNM/`JImYT3_!:nA7:B893huM"SM76:\X&&Zn!R:N at rtru\ -E,]Chmf,Sts,"espPI;umf-'K!."#$rr>jgrrJpiir9aMV=*-`OoL#Yjmu:JOcd>>s,koqc2R_X -nj3;-V=HqPJu/L7!-nR,s8U=D!8%5MGsT^Ts6c9S!-uZ,]l="r!5EgZ[um^ra8j<>DudTOs$?P' ->lTZ*pAjd/!)EU3s7^.&B#oh*mbH'LqZ+<]!9F44lMmmb61XbGs,iH at 0!XNd63#_sqZ-%Mp[3X6 ->fZods8PC0s8)f0JcPhI!2]_q:\+6Us,iEQjT*op!53sas72NWM<4^9!Vak;rtq+UE,\TKs7-0X -s,"espPI;umf-'K!.""nrrH-hmJd3EZL\"rMS/fc!M#hKrtUBembErLs+5OX`/4L[aF_\:H1I*B -rr6TIM>o3[_MS:FfDh3lU/k5sa<+gkkn.mYRe.gl]kY!53sajT*otqgnfns7]=hOc_Zc!8$Ma63"4!i'HX( -s2(gKR'?YZs7-0Xs8)f0JcPhI!2]_d:]L/bs,iH*!8#Krbq=kQj`pj&o)8RhpW`[:s%iZ6'J>dQ -nc8+CV4U'RE6(?Fnc2GcTDRaM!VT at VrrI)_o)A`0fD>LJK"C^V'e\+inr_2o0!XNZM>ol_K$F=@ -nk\iUs&$Xis";p?M>o3[s31NDfDguXq_#/8l;.G:E;qQYM9Ybpo'5$1lJ2F:JcL)rnk];!!9Nc; -md:):]nu;Gs+7*I:I+u+mf-mdYlO2Edeln_GlX!,s6;lM -Z2Xb/6-]H0m[4"SH%5~> -qu75P!+u7n_Z)pCs36E#6-)@[rr3!pmf*50V-MeAs47840(/0-qfr29Oi%,aaT'M:s,i0<:[Y&a -gd1i;.Jrl>blFTbK)a7Os8Pm_nc8F/K(f8nH-$"Oc#?qfs$>)kmf-)Rs%gN+rtduGs8SICs3`P" -aN2U+E93IDs33j]!7L?9!*f0s!LL"Krst_%TDq^Tnc87\Oi[7sk!B"H!V/PTru%YhhXF -nc8FaJjK;.s31P?s8U=rrr5l`lMl\@:\"MVs-S06o)DMF0'23c[fC%;s8U[NjY#uq!7H/6s$=nK ->lXipJtGj=T)bM`:[X at Ajm)`1M?!/Hs/Q.OOi[7so$T/js$=a+gj/mU/\V2anh0%co)Ja70)ts6 -V<.">s/Q/"s36/qOi[7snsG:6Oeq1)qu?]a/caMurtt;,p](7ZaT%Was2`:+!-%%eM>tgdf)X7[ -rrHZkmJd4(HLh(:I`hNe!RtfJrst_%TCP;Jnc87\:\)pdaEddb!V/PTru#(6[u(,iT=9[Wnc8Fa -JjK;.s31P?s8S4 -s/Q/"s,k1uOi[7snsG:66.4]Zrr3)P!!)cgrts!5s8Vrro)G)6s-WA>:M0VmaT%BbYlO at Urr>XW -rrK'_o)A`#jSJlW\q9YU%qYgdnj3<(0)trIo$T/3H2dgEc%>oo+^CYKM>phQ[u("Vs31P?nj3<( -0)ts6_X[^$c%>ZidWrq2s![=8qfr29Oi%,aaT'M:s,i0<:[Y&agd1tb6.Z+bs2\g;jnI#Vs478F -rts!5s8Vrro)D"ss-WA>:M0VmaT%BbYlO at arrKujpAY+ck5Pt:!+u7,mf,Sos,kCs!9QTHrrM[V -rVmb3>hhXFV-MeAs7-0as+3Q:mf2Q)>lXiK0)kkQR-O^.J,~> -qu72!!2'9Wo(N.Ys,"ho!9O:\rrM[CrVn$GV72<]V-MqEs6fpP/mSEBo(N.Ys,"hs0$X8Gs'2D0 -M>R<%o)J`d!8NFPs,i0o(N.G!2';^!9N>5nj3QE%>0)n5ci9pUtc2[)/qfr2=62/e-s,i0c"?8&p](8UM?!TA -dbsQns%e7Hs,"hs62/e-s";Rr6.4]Zrr3)P!!)cgrts!5s8Vrro)C>es,m&4:M0VZc2WonYlO at U -rrHZkmJd4(HLh(:I`hNe!RtfJrsr?7c-:k?dK'=<63!((K"_0`!R65qs#'NNdW!J*!7Gi2s3`P" -rrAGWs8Snqh#IC,c2[h3M>ui@!6C"Rs7ZN1!<;dGc"?8&pOWC;rr5$U>i7pJV-MqEs33jb!7LoI -]np"8s',QKc%>s]dbsQn0$XFas6;4As$?D-!<4[rs7ZNas-TE2joGD\,DiJ_lMLV]0$XFr6.4]Z -s8PlHs8PCUs$?D-!<4[rnc7e5o)AXjYlJD1s8S5]rtEuas8O^rs)@ujH%Q%ro)C>jE*VH'!(lPW -!N;7RrrHWjqYpT-K(o9VmJm7Tc%>tXM?!-4s,i.i^&J$4M9,\r,52)cE6\+WdW!J%s8Snqgs(HN -Obs,<61WGVs,"hP!9sRTqu8)4s6;4As$?5M!;HMMaT!m;q_%nRV72<]OdNBRo)FQIjm)`"c2XDf -p](8Us8Nba!<;cno)E\//pW'K!:p.BdVrI[rrKujpAY+ck5Psa!2&g7s7ZNfs$?D-!6ofgrrLAr -rVma?V72<]>c"ods3`P"rrAG`p]&JpRXM>mMWE<#qjJ,~> -qu713!6sq-s33k0s%iC66,J6QrrL2trr42:!7H/;s'2D*Oo+nQblFg4:]J[*s8Pm_nc8F*M>%"u -H-Q6d..7-4Gl[S7mf,Sts2^?&OcfZ>m\OOI:]J[8dK%_qaDg8&pW/Ksf.Qgt(X58Gs7ZN]s$=p0 -H2g0UM>%#@s$=nKB(#[!>PA'tQ`oEK%-dfmm`:7bOcf\3:]LEV!5ea8!K"nss#'NNdWs+3!7H/; -s,i]KjT*`ss8.'Ap](7Zc2[h3R/c7J!6pXns7ZMDM>tYROfRU/q`t5'rr5#aV6Q0_V.S=Ts34?f -!7LoI]np"8l2UhPaGKI?i8sP#!:p0Xs6;4KmSEkFOoI_ls33k0s-T0+hEh/@,E]%glMLV]6-]H# -0&Yj^s8N)9s8Pm_mSEkFOn&MCnh/k^o)AXjYlJb;s8S5]rtEgHs7-0Xs*=W1H&;7qo)D##E+\/1 -!G(9YrrKu_o)A`>b52,=e7e1J&F'5qmYT$bOcf[bOoI_l60eIL!K"nss#&C.j[&=d!9HN7s,i]K -jT*`ss8.'Ap]'damf3=(_Z.:L!:DJas3`NVM>tYROfRU/q`t5'rr5#aV6Q0_>c"]fs,iqS!:p0i -R$]Mol2UhPM9,6?i8sP#!:p$]s31PEmSEkFOn&MCs33k0nq*K0_Lhde,=0c>mf3=X!:KmX0&Yj^ -s8N)9s6`\_mSEkFOn&MCaDg8&p\t0oGlXo>rtduLs8S4Ds7-0Xm[3PFH+hWls7-0J!2\`U!(lPW -!N;7RrrHWjqYpT-K(o9Va8fiPM9,]_c2YkIs$=mqlMgea:[\5^+kH_U613>)j[&>&s8.'ApPHuk -6-]Gt:]HQ>s%i'ZB%KiUs!dj>s31PEmSEl-63$s\md^APaGKWkdWs+;6-X@\s8PC5jmN.Eo)DM, -p\u$qdf9?0OoNZls6c9F!-u9+63$KUhuKVBrrKujpAY+ck5Pfo!6rTAs33k0mSEl^OT<8trrItt -rr4/9!7H/;pAiWec2Wons5a7/o)J`d!8%8N6-]H0m[4%9!.Y~> -qu:EEs$=Ma_Z)pHs35N_0$%:[s1R2Rmf2_Lgg%Pis7\galMl^rs6]mXOi%,ac2Z4Ds-SZC:\*:G -^&.j(lMpVDmVr4+H'-@'s48n's%i4[!;k3$s)=gds8PC5rr at ZN:TON4btmd-0'3'3!VbmXrtn&H -s8SIKs331rc,0K5:]Hf-s48n'WrV8Nrr?3qrrJFgir:h&dcpi#614UMp]$)ZpAjU]aT%mu63$uH -s4gkmqu>GV^&.j(!;HMU0(*]Ys*9b,s48n&s'qGas8PkIrrC[NOeMj2s$>cIh#F#;pQtr;o(PGT -lMpm'V:YbI6.5c5K)^\4nj2]ll2^6aF)s8PC0s,iHD -c,0K5:]Hf-s48n'WrV8CrrHQgmJd4\;"FVeI)u-`!DiCTs"j)kl2]g0s8)fjs$>qp0&-HlpR(M; -s8V3\X+J4gs/Uags8Vfnp]$@.mVr4+H'/.,R#1hB at sS+SmJrC7!;ldKfDs_,6081&s.AlVQiN!6 -pHc(Ls7\galMp_]qqqIfrrD?$M=/gW!9-lmHqu6]^o)AY+f.R+'pAjsf -Ocf[2o'QLMs$=?uR$%Df0'*$48*p6Vgh63X!Fk'brrMOgp]#!Vm_UUI63#Ohs8PCMbq at cOlM$[j -K)bl4s/Uags8T-O_Z0%Cs8RA,nj3<-0)ts=_Y4'-dY\!CV:YbIi;8#s/Q.]f)YRFOj/1OaCbAM!T -r;UO"dd@,+0(Sl>p]$)ZqZ-$aaT%Xn0)tt5s.t=as8UkM\,ZJ(s8Tbbs"!;HMUaT!m at s$?[] -K#7QflLOu?o"qI-rrCK(aT%Wis8+GKf.R)cc20,ulMp_]s53mjpAj"KR-$%$pAk-k!UB7TrttV5 -p](7Gdf5/ds,lm?!2]]J_Z-!cs(29"rr?3qrrJFgir:g_o"kCt0)sNUs8O_>blHN!lMHsiK)bl4 -s.t=as8SpI_Z0Y\0)tqOOi"1!rrCLIs-SZBs(QHPs6]lLl2^_]!5S[8nh/Mop]$*Ml>Qa.s4gDZ -s8VsKZ0MAd!<:sW^&J*#_MQ_3_>s-Zs$<^c_U:']s+9&+mJuu6m`bb3R$%FG!;GRTs)?4fOoMo$ -!;HMMs8SICs8PBcs2*44(Pr.:s,"hs0(-sas";Rr6*(%&d_YuMc27M at i;NZmf)YjNqZ-Nn!7Ln0 -o'QLSs";1gR$%D\!9F.\@H6bT!VT@\rrIMgq>UIkp$D^'ddk6TaFaHD0)tJBs+6*.63#`LaFaHl -jo8qhfDkk_V:YbIbqB%r!0P.!s8N)Is8O_"s8VhMs8U=Dc+QpQqZ,COs7.eo!;HMMs6=P'Z2`TT -\,ZK`:UgB(f)YiO!:&YGs)?62o"kCJK)\-;s2*2:c2UT>s$+1Ls"<`a!<4[rs8)fjc!:8KmJt?. -R$2.^lD=O\0%0e"6*(%&daEsPc2TEes"<`a!<4[rpAj"KR-L:DE96us!9!hU(mp0[s3`P"rrCLI -EYrrHTgqYpTap]$Ass";b" -63!d5_Z0Y'OoK"ns-REulD9?Ss+7`XrrD!Urtq,[s8UM"s7ZNjs)A"O!8RSSmf+ofrr at Z?rrKrh -pAY+`kPm at +dd@+t0)teKp\ul6blHN!lMHsiK)bl4s.t=as8SpI_Z0Y\0)tqOOm[2gs)=A*s-SZB -rr[6?s6bC~> -r;UN[o"m$I:]Jj/s8PCMa?eS]lM$plM?!V;s)=U^s8SpP_Z/nHs8R&*mSEl263$s\me6_Yc&r$F -T at a,Ci;o%.-Uqu>)1s/Q.]dK'%AOiW.SaEd^`!Trs1s6_N>M34W1s4k)?aT)#& -s)=U^s8R&1fDkl-R/c^Wc&(6UmJuhXs$>*5s72QWs2Y2b[p8t-!2F0+_MOY!s5g<]dQoM1s.tRh -s8U\U\,63R63!tcjmiEOH-O&&M2=sJM>%#*s.AQVo)E>!s1L_d0)pcjs$>*5dR!oUIkp$D\Z^&S(gA'"\;R/b6Qs";Q$R/aYNM9,_k -me9M^lMpTSZ0MAhM4">6!6pAUs6]mXs7ZNfs8U0]s8SGdno1H*c"!;H&O -s+17NdK'=A!;kOO^#]1n8*p6Vgh63X!Fk'brrMOgp]#!As$=ndaT"QSs2]Kc0$RXgs0pcZmf2_L -pJ8'Zs7]u!is6_N>M34W1s4k)?aT);%s)=U^s8R&1fDkl-R/c^Wc+UC^rrCLIs$>*5 -s72QWs2]]~> -qu:A+V/YOs!1s7Js5a5c:Pm['!1rD4lM7in.o&Tk.dJs9!s%d6GR/HsbX$Qab)U\U] -mahG)g.q^UE'a'"c14X1_g)6ks+17!nc&SlpAY/ZY2]ISnh.1ds)9Ta!4W!A!+mjsYlFd at qZ'mm -!7I\D/hYqU!%onVJcLCA6/;JmH''`Is71F8X8gs at H2IX4:]J9aZ"Ea2!+l5'V#UM)rr6X*QpKL- -5leCk!%n8.]`<$BjT(.-R]`;XsZqjKgnc/Ycb5fWZrrHAsrr3n;!.t6U!-uum:X!cD -o!-I1:B8:X!4Vu[!7L$0!Fb$TrrH?doD\i=aSGi:DUe%Q9Ca^?E;KW?YlM95M#_KIi.:q]lMCQd -o)R3D!%qON>Q?B]o7?soE'`:Z/pWR3mf2'<0%0d5!3?/"c&)I_>b?lQWrQ`3T;;Mf\,QD?pR"8% -!'pUog]0V?\"VOATE"rgJcN(UM#aC#!)L-k -H2iKjdJuSU:I3V4/l1otrr>RUrrW$irU^$i at cI4`!E8I^s(]eSV31WT>_N10s+p_p0&V<]0'_3l -Ol-66>Q?B]pKR\N>k]jrOY6)!!*k3XfBumKblGhI61+_*!/^RQfD>R"]`=[#TDtqlT)a`JM#cgG -B%I$fV#W,#daV>f/hYqU!%onVJcLCA6/;Kl:S08a -s71F8X8gs at H2IVl~> -r;UO&!3p/9AcSM)\,X,AAhLd%!!(+;!*oC$dSBiq:\U[c/hZ(-:S.X3s(28)!4VMp>j_Ta]`?Y[ -!%q(A:S7Y_TB-'8E+]-N!45Nto!\V?QiPo;K%p>l!4SR#R/aVqZ)%F#\+]lZ:WWJ6!Df?eru.p< -K)`(UH-u[g\NtN at H2#_e6-W1kfDdI!md^;W=n_jrQEK6I9?g8/Oo#,`LB--0JcKaBjamIblJ)B% -huNLI!%q(A:B3"Ck>))7:M0 at _!0M54s8UkM!7Ln\!3?/"c&)I_>b?lQGlV(LaD_+Zi;Wahl=Q0T -!%on^g]0V?\"NYPW!IVuarrI#em/K`':Sj3/!0N*o)LBCM>I9*!/^,>!/XK`pZ2C;E+].M]`;=*s-Nf7s8SJ'qbN?"\,U^R>QDia!!(sVs(CV/ -Oei%10&WQ+/hY\"!4VuR!6bF=>X?M.V30O5OjX40K%C!Zs*7D4!6tOq!,sR,!/^`b!3t,UAhJ\? -!!(+2!!#gls1JD;mf1]8!.sJ9pQ5I at AcUb@!,sR,!/^`P!!'JoM=16?+8Z&is8VLQ!8$d;!6qPE -H*@:Ls(;;3!-u6XE:W)jM<4a;8*p6WqFgeYrrHTgq>UIon+cosOb/G,g]34-:\+NO6"Wp]5lb0i -WrTi60)GW$!/^RQ/c^ai!0M54s4dU3:J^Q5!19,RgeWOW!'pUog]76,!;h%;T)d.9AcSM)\+3=" -mJrlm!7t!H/l1"n6.c,h:Z;?S:]$M3M.Z\c+5?kns8VLQ!8$d;!6p)qR(WL#s(;;3!-u6XE:W)j -M=LTH_1_O^!(c;Q3q<9UB);R5ZiIT8JcKaBjamIblJ)B%rrCJC!%q(A:B3"Ck>))7:M0A$!-s\Z -mf2' -r;UNQ>b at DX!*k3Xh#E32E%^(#!&!Ql!0Q%:mJnj>M>pf\/mS!#H'(D\pAeHP!8Q0+T?%#RM,3C: -/c^b.!8%5Nf=(aP:S7Z+0"h7As+pa@>\;CaZ(D"K0$SYA^&N?Xf5L^Bgs#hU:[7lX!-H:L*Jf5s]*flTkM_ql9_1 -X$QU_/c^b*!%n8.dK!("6';2V!2!&Zs8Tb4>jD?V!6tQDR)o#,Oa4Y2/jV*Ug+EA1p\t2*f.PgNJ-s+pa-dK!l3K!>:U -aR1Y\>ke93!*nghV#UM)_En2t>l/Imgd+5<>c[q7s.o\q[nhkKqYq\n!;HNnl;%E3nlu1>JcMFS -!3?!Bs/Q-O\c?^?huJW2k5PHjj6ZdH>NYPW!IVuarrI#em/K_ at M1WUF!3f7(o&TjV:Qa6/!1k_J'/mQq&6/;>i>f6VS/qT4BK#4Pg]qk]/\$5qBq_!/V614V96"XB'!4Vub!8"%IDudA! -!&!Qb!!%lUs.9:JquUIon+cos:Si$lWrSalM>uZ;>YgL6!!&Dd -E%^'RR+Dp@`E1d(.!MrTkru0,^:\**;:YJSE]pJfJi1L%$!3;^lR/aVq -Z17hp_1_O^!(c;Q3lkQuR+q\(M#c?.5s]*flTkM_ql9_1g]6aB/c^b*!%n8.dK!("6';3*!0M5> -s8Tb4>jD?V!6tQDJ,~> -qYpQdrr2umr;ZforVlllrr3T-s8Vt.o)I.#Oja9t>lXipp\t0mp\+Ujqe#F!dZOG,s8)farr2um -p&>34V>pF)o(r at jqssde:[[u#rr?3qrrJFgiVrrUmf*4dqu$Hop\k-lqu?Zrqu6U&qe#F!dZ8#2 -s3d&+s8VrrmdU5Wqs+1\!VcKjrrMlkqYpnbdf8`?_PR;0B(Gfu"o&&os826`rr`/us76$d!Vc$] -rrDf`rrDfmrrMlkq#:?bq>UQks8VihrrDW$rrHQgm/I*:`:O!0I)u-`!KseTrri5es8VunrrDfl -rrDfmrrDrqrsJ%'s8S_#B)hn'aSPr:qZ-'RrrM]Yrr3#nqu6Trp\Xge$'E[9mTbn&s6a.brri5e -s8VuqrrDWdrrM]brr2umnc&U`rr2uhp\t6aq>UQks8ViirrN#f])Mb#li-utht-jK at cI4`!I)c^ -rri5is8VunrrDflrrDfmrrDfmrse7*s8S_#B)hn'aSYl&rr2uqp&>34V>pF)o(r at eo(W.`!;H3e -"oDp&s3d&*rrhoms36DCrrKrhpAY+`jo5>Orr2uqr;QckrVuops8N)rrr3?&B(GuMO(Rt_dZOD+ -"8i,dqt9u>~> -qu6]omf*4dqu$Hop\k-lqu?Zrqu6U*l>Ze'R*B76s3d&,s6fd`rrDrirrq\,s8SJ2qYpTjmf*4d -p\"OhM:_du:\k%jpB:Nj63$]&rr?3qrrJFgiVs&Xo)Jaequ6ZjrVlllrr2umrr3>jE<#s*]Q!oN -R*GI,!Vc$OrrM]Yrr2umrVllgq>Ub5o)I.#M:_du:\k#!qu?Qnqssdequ?]no(r at eo(W.`!;H$` -!;HKm!:opb!W2H`rr`#qs7cBi!W2H!rrHQgm/I*:`:O!0I)u-`!KseTrri5is8VijrrDflrrDfm -rrDfmrsHH3s8Q?5TE"prp\Fgip[7PN!UfOXrrDflrrDWcrs<<.s3d$Ao)I.#p&>UQos8Viis8Vi)rr>RTrrH`hoD\i#iq`TTGKfg]s7cQn -!;HBj!;HHl!;HKm!;HKm%DAD6s'3%*s8Q?us7bs\rrDfdrre21s7/t_rr`/umed"`!;lKi"mU(, -s-V(,rrquns,"hkbPqUZK_GEG8ETpTqsOLaqtpBnp\k*lp\t0mp\t1"l>Ze'R(RD -qu6fro)Jaequ6ZjrVlllrr2umrr3G at X8i'/fm3VtR*G[.mf*4dqt9sm]rV21B(Gfu!V6!arrDrh -rrd<3s36r,rrquns36]'b5VHEpAY/ZY2TE\p](6np\Xsjp\k*lp\t0mp\t1"]rV21B!\QRTrrH`hoD\i#iq`TTGKfg]!:p-h!;HEk -!;l]o!;HKm!;lcq%>iO5mUh=(s6aM!s75p`rrDfdrrd<3s36r-rrN#brr2uqp&>3/X8i'/o(r at j -qssde:[[u#rrKrhpAY+`k5PS]o)Jaaqu6ZjrVlllrr2umrr3>=X8i'/Z`F-'B(Gct!Vc0Ws*t~> -j8TJ`5u3)Onq&K>B%$,I"oCS]JoL;Errfe2H#ThXrrVHcT?@06=n_jrQEJ at 0$N!+bJoL-D:P*QV -e,K`+/pV'W[fC\mX+C<2rrHQgm/I*K[.F:uI)u-`!Mc@;rs at ceApK6p!+pM5df0W*/pV'WJhD=\ -dXhGYrr>RTrrI;goD\i#iq`TTM7haG$0;/!H&:V_ApK7#rrfe2H#ThJrrr9c:P*QVpAY2d!9ME( -!PsH_rr>U8rsJWh:P*QR5u3)Oo'67*~> -j8TJJ!+pM.s"7*!B(GBi"Q]VqH%P5Z"G/7OB%QbV!ltA_b5VHEpAY/ZY0$\MjT&nUJjU!s#J[fC\mX1&(SE3%Fe#qf#*B(@QMJnFS) -s5X+Z8*g0UG0]^Z!Fk'arrIthhu="l!-rOa[fC\mX6ooiJhD=\fBE5;jT&n -j8TFp!-rOghuIA7M=(ok;JoL:3s5X+[@H6_S!Kjb\rrIMgq>UJjU!s#JJhD=\f7GW#B%PN3$/beqH&:GZApK5a -s5O%Y8*g0UG0]^Z!Fk'arrIthhu="7/pV'\JhD=\fBrS at 5u3)Oo'$)V[fC\mZ1e2!jT(pqrrKrh -pAY+`cMn3[!-rOg[fC\mZ0D:=~> -iQ_J;_#DU[^qK$Y!PQ;1c2tnsa7[^[^qI8#bK^)_pAY/XN5s3E]tjWm!PQ:qc2k_orltS_]uP]L -im%R(j6ZdHS>l,[!I(75c2ilLd`r*?]u/. at b.Y^>c2k_orltP[]n+Jfc2^,qrrI\goD\hq[e\2L -GE1P*#Kj`tcHaSG_s>SL_nF+Pc2kVooZdNJ]tMV7!LnW5rr>=.c2kVorltPX_!''o~> -im%VJ]u0ips1RaD!m83ojj!nB^%BSO\@oDpc2^W5rrJ at CaNb%5]u/. at b.Y^>cMtTWc2k_oJ^36" -!EA+GrrJXhoD\i8U%ut7N-Wjs#K+6qcHa>@a3`-3^&H=W]n+Jfc2^,qrrI\goD\hq[e\2LGE1P* -#K+6qcHa>@a6V"O^qJjT!m83op!*Z[\@BT&c2jDbpAY+Xc-?R:]u/. at b.Y^Vc@>~> -im%eH]unXGb.Y^Yc2tnsb2pnL]tj9cs0r'Eb0Bu^pAY/XN6'9L_nF4;q9B#"H.'t=^qK`m!PlCqc3MM*_p6QM]u,EHiQ_Egli.!:_t3m/>IO at Q -!I'R\c2k_orltP[^$~> -eTLt+6cO9L2o^"@4SJdUO\i`7!G+[3Foc8C]QO9;]643>j6ZdHWLi_]!H)0 -eTLt+6cO9L2o^"@4SJdUO\i`7!G+[3Foc8C]QO9;]643>j6ZdHWLi_]!H)0 -eTLt+6cO9L2o^"@4SJdUO\i`7!G+[3Foc8C]QO9;]643>j6ZdHWLi_]!H)0 -ec,[$DT;\V:<*;6=n_jrQEIq$!RYu$rrLeg]`.t8]Dhn?j6ZdHS>l,[!IVuarrK9ga8Z1MN4f/k -^kBB#!(sm'!(ZAT!J//[rrHTgq>UJ[Z-iRPJ],V/!MQ=0rrKrhpAY+`aSu:_HftEZ~> -ec,[$DT;\V:<*;6=n_jrQEIq$!RYu$rrLeg]`.t8]Dhn?j6ZdHS>l,[!IVuarrK9ga8Z1MN4f/k -^kBB#!(sm'!(ZAT!J//[rrHTgq>UJ[Z-iRPJ],V/!MQ=0rrKrhpAY+`aSu:_HftEZ~> -ec,[$DT;\V:<*;6=n_jrQEIq$!RYu$rrLeg]`.t8]Dhn?j6ZdHS>l,[!IVuarrK9ga8Z1MN4f/k -^kBB#!(sm'!(ZAT!J//[rrHTgq>UJ[Z-iRPJ],V/!MQ=0rrKrhpAY+`aSu:_HftEZ~> -ec,[$DT;\V:<*;6=n_jrQEIq$!RYu$rrLeg]`.t8]Dhn?j6ZdHOgO`[!IVuarrJmga8Z1MN4f/k -^kBB#!(sm'!(ZAT!Huc[rrHTgq>UJP][?`[J],V/!MQ=0rrKrhpAY+`aSu:_HftEZ~> -ec,[$DT;\V:<*;6=n_jrQEIq$!RYu$rrLeg]`.t8]Dhn?j6ZdHOgO`[!IVuarrJmga8Z1MN4f/k -^kBB#!(sm'!(ZAT!Huc[rrHTgq>UJP][?`[J],V/!MQ=0rrKrhpAY+`aSu:_HftEZ~> -ec,[$DT;\V:<*;6=n_jrQEIq$!RYu$rrLeg]`.t8]Dhn?j6ZdHOgO`[!IVuarrJmga8Z1MN4f/k -^kBB#!(sm'!(ZAT!Huc[rrHTgq>UJP][?`[J],V/!MQ=0rrKrhpAY+`aSu:_HftEZ~> -ec,[$DT;\V:<*;6=n_jrQEIq$!RYu$rrLeg]`.t8]Dhn?j6ZdHJAq-[!IVuarrJ:ha8Z1MN4f/k -^kBB#!(sm'!(ZAT!G:6\rrHTgq>UJ>c-cOlJ],V/!MQ=0rrKrhpAY+`aSu:_HftEZ~> -ec,[$DT;\V:<*;6=n_jrQEIq$!RYu$rrLeg]`.t8]Dhn?j6ZdHJAq-[!IVuarrJ:ha8Z1MN4f/k -^kBB#!(sm'!(ZAT!G:6\rrHTgq>UJ>c-cOlJ],V/!MQ=0rrKrhpAY+`aSu:_HftEZ~> -ec,[$DT;\V:<*;6=n_jrQEIq$!RYu$rrLeg]`.t8]Dhn?j6ZdHJAq-[!IVuarrJ:ha8Z1MN4f/k -^kBB#!(sm'!(ZAT!G:6\rrHTgq>UJ>c-cOlJ],V/!MQ=0rrKrhpAY+`aSu:_HftEZ~> -ec,[$DT;\V:<*;6=n_jrQEIq$!RYu$rrLeg]`.t8]Dhn?j6ZdH>NbVX!IVuarrHuda8Z1MN4f/k -^kBB#!(sm'!(ZDU!r5LfoD\i#iq`TT;X`$5!J/20rrJgha8Z1VK_GEG8BCf3aa<4NJ,~> -ec,[$DT;\V:<*;6=n_jrQEIq$!RYu$rrLeg]`.t8]Dhn?j6ZdH>NbVX!IVuarrHuda8Z1MN4f/k -^kBB#!(sm'!(ZDU!r5LfoD\i#iq`TT;X`$5!J/20rrJgha8Z1VK_GEG8BCf3aa<4NJ,~> -ec,[$DT;\V:<*;6=n_jrQEIq$!RYu$rrLeg]`.t8]Dhn?j6ZdH>NbVX!IVuarrHuda8Z1MN4f/k -^kBB#!(sm'!(ZDU!r5LfoD\i#iq`TT;X`$5!J/20rrJgha8Z1VK_GEG8BCf3aa<4NJ,~> -ec,[$DT;\V:<*;6=n_jrQEIq$!RYu$rrLeg]`.t8]Dhn?j6cjIohb5Z!IVuarrGsha8Z1MN4f/k -^kBB#!(sm'!(ZDU!S_;YrrHTgqYpT`=4$sJJ],V/!MQ=0rrKrhpAY+`aSu:_HftEZ~> -ec,[$DT;\V:<*;6=n_jrQEIq$!RYu$rrLeg]`.t8]Dhn?j6cjIohb5Z!IVuarrGsha8Z1MN4f/k -^kBB#!(sm'!(ZDU!S_;YrrHTgqYpT`=4$sJJ],V/!MQ=0rrKrhpAY+`aSu:_HftEZ~> -ec,[$DT;\V:<*;6=n_jrQEIq$!RYu$rrLeg]`.t8]Dhn?j6cjIohb5Z!IVuarrGsha8Z1MN4f/k -^kBB#!(sm'!(ZDU!S_;YrrHTgqYpT`=4$sJJ],V/!MQ=0rrKrhpAY+`aSu:_HftEZ~> -ec,[$DT;\V:<*;6l0\KO^jP_Q!JADgrrLP_`r?(LN4f/k -^kBB#!(sp(!WGaYrrK!_o)A`)iqiZU\:i6/!J/20rrJgha8Z1TMY@&M9$%#5aa<4NJ,~> -ec,[$DT;\V:<*;6l0\KO^jP_Q!JADgrrLP_`r?(LN4f/k -^kBB#!(sp(!WGaYrrK!_o)A`)iqiZU\:i6/!J/20rrJgha8Z1TMY@&M9$%#5aa<4NJ,~> -ec,[$DT;\V:<*;6l0\KO^jP_Q!JADgrrLP_`r?(LN4f/k -^kBB#!(sp(!WGaYrrK!_o)A`)iqiZU\:i6/!J/20rrJgha8Z1TMY@&M9$%#5aa<4NJ,~> -ec,[$DT;\V:<3A8oMP>^!OIg"rrLMg]`/#cCV9ZI>.jk:qG-qTrrIn_o)A`XWVZVqRA7e%!P"*$ -rrKog]`.t(]`/#m?gRdnD9qeQ!Ir#`rrIV_d/O,t`5hlYTqoa/!Mc:\rrHHfao;C`HftEZ~> -ec,[$DT;\V:<3A8oMP>^!OIg"rrLMg]`/#cCV9ZI>.jk:qG-qTrrIn_o)A`XWVZVqRA7e%!P"*$ -rrKog]`.t(]`/#m?gRdnD9qeQ!Ir#`rrIV_d/O,t`5hlYTqoa/!Mc:\rrHHfao;C`HftEZ~> -ec,[$DT;\V:<3A8oMP>^!OIg"rrLMg]`/#cCV9ZI>.jk:qG-qTrrIn_o)A`XWVZVqRA7e%!P"*$ -rrKog]`.t(]`/#m?gRdnD9qeQ!Ir#`rrIV_d/O,t`5hlYTqoa/!Mc:\rrHHfao;C`HftEZ~> -ec,[$DT;\V:<3A8Z\J2R!pih^^Ae5]F1hMRfk\8#!*[&8!P -ec,[$DT;\V:<3A8Z\J2R!pih^^Ae5]F1hMRfk\8#!*[&8!P -ec,[$DT;\V:<3A8Z\J2R!pih^^Ae5]F1hMRfk\8#!*[&8!P -ec,[$DT;\V:<R^Ae5]F1hMRfk\8#!*[)9!rd#TmJd3oJFWX at rEn"NrrL/X`W#tK -N4f/k^kBB#!(ss)!r#jRmJm3Tnc&[^<9X8[!N_+'rrI\ha8Z16Ur`Q;b%L_IrrUt[pr`U;aa<4N +s8)dKs7ZNfs"9H(rrVmlnb`?:~> +rVlo&Nr&bVB%ZPO)6;Q0s,!+TYlL0)AnG at 8pRc't]m3DpYlL0jru&ms>]AK>E*RA;nc7tG!5ebJ +!6tQ7s8S4d==eAr-NYf7I8Krr5Qp!.t)nJm=]?H%K:gnc8F]!2]_)H!Jet +M3qn[!1<1>ggkLid$@\V>rp,M2>L.pN_@&s07/\jo>@CM>mMoR!EZFH!IgS +l2Y)6>ggkLid$@\d=Pu&]`<$5rr3/&gqs)1Z2Xb at bqB%rnc87\R#1j8GqT-sAjON +E85%*c2[@>!19.!/u_;PIi;3N4g]2s'p\Oqq\RpZuOe;Mr/l,aPl>U]S^!/20 +huMC/Z%?6BO`4P*df6B'_YX>krr3k\0)ttB!:p.UaT%lX0)tr`6-0(nOoMljp[S7aL:I-\J,~> +rVlo&Nr&bVB%ZPO)6pmCpMbtVE%\hkJhDCTs'22rR#+,oE%\j's*gSl>_;^BJmd:s8VYH!4V6*E+ZfKAoM at qdOtRX!8RU2M,3^: +E/Bs$0"p\)AtR[eM#aLTX8hbB0)(`NrX.]Ar1g5i,E:qs,hSGqu?[Kc2[e`mXf&Cl9UPp +K&?WScn>'[>h +rVlo&Nr&bVB%ZSPB&M+0s4<*>`W08gH&2NAV=#tapN_%'o)N%Ns8VtAH!I!=H$NYes,i0QE^!H!G=H_KfC*i/sE,YlOOm;eCl< +s4<*>`W09!dXk99[r>r)AcU*UpT\]7Au2tUAp%\cM:cEZX8fkb6-/JGAtT,'nc8+Xs3cKpaNZ?H +Auhs4R'CW-Au2tUApLY5>hr0U\,QC3i6n7tg]76Nrtn&Hs8S4Ds7-0XmWefLs06N=s7-0aqZ*JS +rrL/amJd7X;>Tk`!LB\]rrW'qn,*-,i6n7tX-c]F!*m'HJhDPLmOlr^H$OA]!.">=s8.(e>bCn= +H!Hus!.t+BpAeI/AqDYBE;t29:M0XgE,]F&Z#K`JE;sMMc2[O=!19.*/sT]0a=^]taT%la>_;]9 +df48ks6bJNT@[>"!.t7/d\$QEE;feR6-]H0Ocf[g63$@u!5ec at E)6N)!;H?jV==KcL:I-\J,~> +rVlnU]__X/S=o3J(%MA!aS/"#l2]Gt61WV[mQploX7npYrtI*_btn?lqoqq:nc3V]!9O7\JcL)q +rrJ7=rr6JRs*4V+OmW5Lnc7c(lMiL)!53sapTX^;lMnqNs";pEH2fMKnc2GcTDSYFjgTj4!;FS/ +63"2ca8j;F!!(XNOi$tqnqh>Nqa&L(B)?PaK#mt2f`98LK)bk5M?!SsYtrF at aS,[1mf/Ej +s,k1q!:ktcl=H?f!:Klr/nWQ0rrLp?rr3h`!,umh!:p/PM>rsu!7Jrt>fcr4!'rp+jo5AT;!e2_ +E6RnQ!H?ZerrI__p\tuL:]JN163"e%jmGG*f.QJWs2_7hM>dHN0)Nmhs"=2n:]LHH!."V=63"e% +jmI`;mJu@^K(:PoJtN(fqu=qEqs-NdP6/:u0!Oe*es*t~> +rVlnU]__X/S=o3J(!TPS_U=;@_>r][0)q&j_MS;Tf@#NTrtY))s+7*0s3^ojT*^]K'na$R/?o8aSPu3K#mfhpX0%;!5ed5B)cJ[btnAV +dY\!9R'?Y^!3tYcWrOdCs$?D2!<3&(jnf&Ti-G>&nh0\)E3W3`!6G3?0$XFrAsfh'o%*k\s8Nd! +p]!PRf)YgNZ/ku&JcPiAQiN!)r;Qf=qu6U4QnE>s>XADi0$XEAdK'/rf)YCA5sYKimcFHLp/(,U +!H?9RrrI)jqYpSJ](c4>JtMVhdY\!UE96[Ds,i/TM>r^iOj3n*;=X_eJu/# +rVlnU]__X/S=o3J'oAdTgl]k]JpHIrM>ol_K$F=@nr_2rs(9-)s";p?M>o3[s-Ne3!0R<]bl at aq +s8VWimf3=(c/8T2TB^^2s,hTDH2k at 9X'E^GaP_";^&S*uqoE%B62S`.s-NdP6/;LqM>I;@M5BXq +Oj3b']n-7G!8$N5JcL)rpJ:gOOZDM'fBUdMs09&k60_8G_Q.:9YlO4lnc8+XqZ+<]!<8kqV>p*^ +s7]=hOce`*f?OB@/rBViGlX]3rVlomc2I\B:]GAJ/su\0!:K-KT0`Kra?fjs!)ETeqrRhYp/(,U +!H?9RrrI)jqYpSJ](c4>0%\_GOj3bUZ/s&`s$=_Xc2W([:\+Mb;8S1i0%[sss";q'bl at aqs,kS' +0!XO':]H8js"<_rc1_5/lJ2F)h#I8'!."V8:]J*.jmk_*mJu@^M=Nt4Ju/KC5lc2us(7Y'!:DJf +pAihDrrME?rVumns)8Z)R/bDss6?GQ62toF63$KU:B7$anG`NtOSf'.~> +rVlnIb52,=e7e.I&"`ionj3phQ[u(.U!;HMF62UEVblFU? +s,i0;s*T+ls$6XIbqB%r6+?pcs%hW,jlQ'B!+u-.s47840(.lMHs*s6fpaGl[T$aS,]*R#1kC6-0)>M.Xgpmf3=.B'SLPs8S4bAK^s'22*M>R&IblFU263#@cs8S4unc8F/ +K(f8nH-#m_..7-4Gl[T$_Z)pCs36/qObs*6m\O1D63#1qf)X8!aCa`!pW\Qpf)YRF(sO]5s8)fe +s$=a+R.?A8B)b0 +rVlnIb52,=e7e.I%pT+Zc%>uD!<;UUs,i.i^&J$4c%>rp2>7+!E6\+WdW!J2dOtS"!1>i7pJbsC+bdf9?\M-S.%>QE$n +K)\-bi9pUtc2[53l7Q?A62/e-s";RrpAjdaR%H"n!<3!CM6#b'qu?[Kc2[f0dbsQns%e7Hs$?5U +62/e-s";Re!9N>5rr3&)!+u!*s,m?]'A!6as";RrE;qP9K)YiAs";`=>iYha8aQHXW0HlQ!Ft3e +rrK]_p\tfm!!)H3K)^sis7/JUObn\'rr3"UaSu2`pAiW\c1_4dE6[tRs.o_Nc%>tXM?!TAo$T/j +M9+HPl2^DPs![=8l7Q?A61XaMp]$)ks";Rn0)o1Q[u(-IR'?Y^s,!fjE*Vl3!Q'Qfs*t~> +rVlnIb52,=e7e1J&F'5qmYT$bOcf[bOoI_l60eIL!K"nss#&C.j[&=d!9HN7s,i]KjT*`ss8.'A +p]'damf3=(_Z.:L!:DJas3`NVM>tYROfRU/q`t5'rr5#aV6Q0_>c"]fs,iqS!:p0iR$]Mol2UhP +M9,6?i8sP#!:p$]s31PEmSEkFOn&MCs33k0nq*K0_Lhde,=0c>mf3=X!:KmX0&Yj^s8N)9s6`\_ +mSEkFOn&MCaDg8&p\t0oGlXo>rtduLs8S4Ds7-0Xm[3PFH+hWls7-0J!2\`U!(lPW!N;7RrrHWj +qYpT-K(o9Va8fiPM9,]_c2YkIs$=mqlMgea:[\5^+kH_U613>)j[&>&s8.'ApPHuk6-]Gt:]HQ> +s%i'ZB%KiUs!dj>s31PEmSEl-63$s\md^APaGKWkdWs+;6-X@\s8PC5jmN.Eo)DM,p\u$qdf9?0 +OoNZls6c9F!-u9+63$KUhuKVBrrKujqu;0~> +rVlnGaSGi::\F)S1[`]V!9-mNbH2mp4!0QOHqu8;$!8RT?joF3:TCV`D!/^:@6*]_TpHc(Ls8)fnhuLIj!:%FXmaCA# +i^*U:B)h.mR"G?ph#HdBnqjjM!:lM/s8PC0nc8]8aBXl-]t".;s,m?]R#1kC*M6sDlD=&sE0:0_ +_Z,J%pAjcOK)\WIs2*$t!("m,rrMEUrr3he0)ttG!;HMUOoLg>mJrmZ6,!;cOoKAQjSo3Mm/I+A +BCc''@cI7a!Ua"_s(^!M_CkCFs48n's$>qp0&-HlpR'3Ws8V3\X+J4gs/Uags6ak+s*9at63#Oh +s8SJ'pAk*=M>qOkfDkm/qu>UOM;8.!!:l8hs$=p0dXqLdM>pBBgg%Pis48n'WrV85!;HMUc$B?1 +B)MZ0i; +rVlnGaSGi::\F)SGgc0"!6Bclf.R*o!<7Y-X$Qd@\&a1$s5j8mV:YbIAu4,Zs331rrrA1uX8i2" +df9>"df9 at AM?!V#!6r2Qs8)fO!<;UBf)YRFM>uj[!3uRZ:UgB(geYEZs478NWrVGH!<7#_ddk6T +aFaFXX8g&b0$XDls8PRUrrLnf +o)A`"iqiZUmT0)^C:F5"M9(;KR$%F>!<7Y-X$Qd@[u&3+pZhcjV:YbIAu4,Z_Q3_:!7Jr?s-SrK +s$?5-0)q'Yq_#/=s8V$Ws5!;HMUaT!m at s$?[]K#7QfR$%D\!<8Eus6?G;_Z,4s +r;QcTrVm_%M?!V(0)tYGqu:X8]`?jf!:Kk>df0 +rVlnGaSGi::\F)S!PSO4M.=X,R$dopH2fMA>aYQ#gkj,Pp[7cOZ0MA`:U03bs,!-Cnc6pkh#HdB +o)JFap](97aT):-!:k**s35/PB)f`)QuN)eX8gU60$XEmM8K;mV2<(hs-T2RE%_0qE;r5l^&S(g +9ZZr.h#F#3!:oE#s8R&*mOnNrOnSkHs3a45K"(/Dg]6X6T22`l_UAJY!;HNf!8RUHnt29Lo'TY +rrHTgqYpTas%i4;>dsV1o'68GlKWZps)=@n:]Jj/s8Pm_pAk*8OoKBmfDkk:df0<(s%fp"_U;6Js" +rVlnGaSGi:DUe%Q9Ca^?E;KW?YlM95M#_KIi.:q]lMCQdo)R3D!%qON>Q?B]o7?soE'`:Z/pWR3 +mf2'<0%0d5!3?/"c&)I_>b?lQWrQ`3T;;Mf\,QD?pR"8%!'pUog]0V?\"VOATE"rgJcN(UM#aC#!)L-kH2iKjdJuSU:I3V4/l1otrr>RUrrW$i +rU^$i at cI4`!E8I^s(]eSV31WT>_N10s+p_p0&V<]0'_3lOl-66>Q?B]pKR\N>k]jrOY6)!!*k3X +fBumKblGhI61+_*!/^RQfD>R"]`=[#TDtqlT)a`JM#cgGB%I$fV#W,#d +rVlnGaSGi:DUe%Q9?g8/Ok]r!M#c?25s]*Ymm-qYs4dU:huN?K/c^b*!%n8.mS:M0 at _!0M54 +s8Tb4>jhWZ!7LoIR)8_rOa4G9GlV(LaD_+Zi;Wahl=Q0T!%on^V#W,#eTh/(s*4Ug!)Hicb"njr +g]3Jb!!%W&!/^`$:S.X3s+15i0#7OEs0i!5f)TD8K!>:UaRT<2:](1*!*nsldJs9!l2^R@!:".r +i.:rJ0#7OEs.o\q[m>l=qYqZ7!8%8NmQgj)nkT81WrRFL!3?-3s/Q-F]`<$BjT(/!rr>RUrrW$i +rU^$i at cI4`!E8I^s(RUIM8J$JMGI%=s$8q_:[^RL>lUi)]rNd_!%n8.qZ&5KM<+`"E+].*!/aQJ +o%*l/QiPo;K%p>l!4U_`qqM2KGu(%4c2VAUT`DRm:L*;fT=k6V:B3"CePAK_s"7+,!!#glQnF5- +r;Rko!;lfrmQgj)nkT81JcM1O!3?-3s/Q-F]`<$BjT(/-rrKrhqu;0~> +rVlnGaSGi:DUe%Q99G'__Q*[@:L*JP!*i<^f)Pf;/c`B4!%n8\dK!("6';2V!2!&Z +s8S\kM>Q^[60eLMB("b5X'FTR/jV*Ug+EA1p\t2*f.PQ?B]ePAKdq^u-l!+mj8Obn\, +WrTi0!!'L5!4VhXH'(D\qa!M[>c[q7s+pa-V#YH7[t4T4lI#Y4M?!UJ!/^UQV#UM)_En2t>k7r# +o0GZS>c[q7s)7rjd/^6EqYqYm!;HNnblCQ1f)SV3JcMF/!7Kets+16OT)b8Y[fE\prr>RUrrW$i +rU^$i at cI4`!E8I^s(P9*E94,#T)a`JjT&O]Ok0R5R/_+Xi*;Z$!%n8\f)RE'\$l at 0:S7Zf!1s7J +s02RF>\;CaZ(D"K0&3:!s.rNg/pWRFme6]dK`Ko[!2%=4aGE^X!%n8.]`<$BhuJV[!!%lU:M+R< +r;Qeo:]CA4blCQ1f)SV#:B8(q!7Kets+16OT)b8Y[fE]'rrKrhqu;0~> +rVlnGaSGi:P-aKS"T.Wes82]n!;HHl!;HKm!;lcq$L27's.?c4s8S_4qZ$Tm!:K at V!V5[XrrMlk +rr3#nqtg=!Oja9t>`mJ7mTfGb"T.Wes82fq!:p!d!V6!arrDf`rrDfmrrDWarrDWcrr`#qs7cBi +!W2H!rr>RTrrH`hoD\i#iq`TTGKfg]"T.cis82]n!;HHl!;HKm!;HKm%I.R*s.?c4s8S_4qtog\ +rrDrhrrp99s8-F!qYpTep\t0mp\+Ujqe#F!dZOA*"S2Tmc&'UC!PsHds*t~> +rVlnGaSGi:P-aKS"T.cis7cEj!;HHl!;HKm!;HKm$GE)3s'3%*s8Q?uq>UKimdU5WmdgAW!;HHl +!:osc$"ic.dZJ/4s3d&&rs8Mms8Vins82Bbrr`/umed"`!;H'as82fq!:opb!W2H`rr`/us7cBi +s7a,)!(ZAT!G:6\rrHTgq>UJ>bkM/;p](6np\Xsjp\k*lp\t0mp\t1%]q>?)>dp@*s'5Ze'R*GI,"nM]nM9,G7rrKrhqu;0~> +rVlnGaSGi:P-aKSs7cQn!;HEk!;l]o!;HKm!;HKm$&R+1mUh=(s6aLorrM]bnG`OSqu6Tqp\k*l +o(r at nja$n+R(.GAs-V((s8Vinrri)rs7cEfrrN#brVlllo)A^arr3#ro(`4cp\Xge!;lcq!;H?i +!:m]#!(ZAT!G:6\rrHTgq>UJ>bkM,;o)AXhp\b$kqu$Hop\t0mqu6U)M:2FlAr4t9mUlM!o(W.` +!;H0d"E +rVlnGaSGi:US60:$0;/!H&:V_ApK6]rs=90H"PKV/pV'WJcFd1!(ZAT!Huc[rrHTgq>UJP]\i_q +jT&n +rVlnGaSGi:US60:$+Bn[E3$GJH#Th4rs:;RJnFR+:P*3LJcFd1!(ZAT!Huc[rrHTgq>UJP]\i_q +[fC\mX1&(SE3&C+"G/7OB%Q8H"Q]VqH%Pbi"8bl!qof!?_1_^cJ,~> +rVlnGaSGi:US60:$%adTB%MVeH"P[Wrs at T`ApK6k!+pM5JcFa0!(ZAT!Huc[rrHTgq>UJP]\i_q +JhD=\f7GW#B%QGM"@5h8E:W5m"LeAVE3]-:!p'ESb5VLYK_te"~> +rVlnBU%ut7N-Wjs#Kj`tcHaSG_pH[0^qK`m!PlC"cJd%K5jSFNJ]%*Z!F*#.c2i-LhTcAK]u/.@ +b.Y^Yc2tnsa5tSI]tj9c!k>qWbK^-XJG]@s~> +rVlnBU%ut7N-Wjs#K+6qcHa>@a3`-3^&H=W]n+Jfc2^,qrrI\goD\hq[e\2LGE1P*#K+6qcHa>@ +a6V"O^qJjT!m83op!*Z[\@BT&c2jDbqu;0~> +rVlnBU%ut7N-Wjs!PlDJc2k_od*;m=]u/. at b.Y]DcJd%K5jSFNJ]%*Z!F*#.c2i-LhTc/;^&H:X +^qK$Y!PQ;1c2tnsb4X$^^qI+tbK^-XJG]@s~> +rVln9>krOD<^FcL!F8F4FobrB]QO95]6401li.!G\b#h%:h]ZJ!D6)6Fob0Ca*%J_ +rVln9>krOD<^FcL!F8F4FobrB]QO95]6401li.!G\b#h%:h]ZJ!D6)6Fob0Ca*%J_ +rVln9>krOD<^FcL!F8F4FobrB]QO95]6401li.!G\b#h%:h]ZJ!D6)6Fob0Ca*%J_ +rVlnGaSGi:Y*R-.!P"*$rrKog]`.t(]Dhk$li.!:_t3m/@cI4`!L0k:rrI\ha8Z16UrWK9_1_^c +J,~> +rVlnGaSGi:Y*R-.!P"*$rrKog]`.t(]Dhk$li.!:_t3m/@cI4`!L0k:rrI\ha8Z16UrWK9_1_^c +J,~> +rVlnGaSGi:Y*R-.!P"*$rrKog]`.t(]Dhk$li.!:_t3m/@cI4`!L0k:rrI\ha8Z16UrWK9_1_^c +J,~> +rVlnGaSGi:US5a.!P"*$rrKog]`.t(]Dhk$li.!/cL_&:@cI4`!K"J:rrI\ha8Z16UrWK9_1_^c +J,~> +rVlnGaSGi:US5a.!P"*$rrKog]`.t(]Dhk$li.!/cL_&:@cI4`!K"J:rrI\ha8Z16UrWK9_1_^c +J,~> +rVlnGaSGi:US5a.!P"*$rrKog]`.t(]Dhk$li.!/cL_&:@cI4`!K"J:rrI\ha8Z16UrWK9_1_^c +J,~> +rVlnGaSGi:P-`4/!P"*$rrKog]`.t(]Dhk$li-utht-jK at cI4`!I)f9rrI\ha8Z16UrWK9_1_^c +J,~> +rVlnGaSGi:P-`4/!P"*$rrKog]`.t(]Dhk$li-utht-jK at cI4`!I)f9rrI\ha8Z16UrWK9_1_^c +J,~> +rVlnGaSGi:P-`4/!P"*$rrKog]`.t(]Dhk$li-utht-jK at cI4`!I)f9rrI\ha8Z16UrWK9_1_^c +J,~> +rVlnGaSGi:D:HW+!P"*$rrKog]`.t(]Dhk$m/I._9E"J^!Fk'arrH$ddJj5u`5hlYTqoa/!PsHd +s*t~> +rVlnGaSGi:D:HW+!P"*$rrKog]`.t(]Dhk$m/I._9E"J^!Fk'arrH$ddJj5u`5hlYTqoa/!PsHd +s*t~> +rVlnGaSGi:D:HW+!P"*$rrKog]`.t(]Dhk$m/I._9E"J^!Fk'arrH$ddJj5u`5hlYTqoa/!PsHd +s*t~> +rVlnGaSGi:;"_m/!P"*$rrKog]`.t(]Dhk$m/I+ at B_)0(@cI7a!UWt8rrI\ha8Z16UrWK9_1_^c +J,~> +rVlnGaSGi:;"_m/!P"*$rrKog]`.t(]Dhk$m/I+ at B_)0(@cI7a!UWt8rrI\ha8Z16UrWK9_1_^c +J,~> +rVlnGaSGi:;"_m/!P"*$rrKog]`.t(]Dhk$m/I+ at B_)0(@cI7a!UWt8rrI\ha8Z16UrWK9_1_^c +J,~> +rVlnN`qo]9dV?f%!P"*$rrKog]`.t(]`/$39C2ZZVO$fQ!GUQirrKW_d/O,t`5hlYTqoa/!PaNh +s*t~> +rVlnN`qo]9dV?f%!P"*$rrKog]`.t(]`/$39C2ZZVO$fQ!GUQirrKW_d/O,t`5hlYTqoa/!PaNh +s*t~> +rVlnN`qo]9dV?f%!P"*$rrKog]`.t(]`/$39C2ZZVO$fQ!GUQirrKW_d/O,t`5hlYTqoa/!PaNh +s*t~> +rVlncWVZVqRA7e%!P"*$rrKog]`.t(]`/#m?gRdnD9qeQ!Ir#`rrIV_d/O,t`5hlYTqoa/!Mc:a +s*t~> +rVlncWVZVqRA7e%!P"*$rrKog]`.t(]`/#m?gRdnD9qeQ!Ir#`rrIV_d/O,t`5hlYTqoa/!Mc:a +s*t~> +rVlncWVZVqRA7e%!P"*$rrKog]`.t(]`/#m?gRdnD9qeQ!Ir#`rrIV_d/O,t`5hlYTqoa/!Mc:a +s*t~> +rVloIB);N.@,/d%!P"*$rrKog]`.t(]`/#+RI1"Um8X#SrrKZ]qu6`m;Y&37!J/20rrJgha8Z0I +gACo#~> +rVloIB);N.@,/d%!P"*$rrKog]`.t(]`/#+RI1"Um8X#SrrKZ]qu6`m;Y&37!J/20rrJgha8Z0I +gACo#~> +rVloIB);N.@,/d%!P"*$rrKog]`.t(]`/#+RI1"Um8X#SrrKZ]qu6`m;Y&37!J/20rrJgha8Z0I +gACo#~> +rVlrt?delP!QT)srrKWg]`/#JKY7>s8SPXrrVdkkktG]XGG4&!J/20rrJghaSu=a +BE%f.J,~> +rVlrt?delP!QT)srrKWg]`/#JKY7>s8SPXrrVdkkktG]XGG4&!J/20rrJghaSu=a +BE%f.J,~> +rVlrt?delP!QT)srrKWg]`/#JKY7>s8SPXrrVdkkktG]XGG4&!J/20rrJghaSu=a +BE%f.J,~> +r;Qi:AGc?*!Hu2rrrKWg]`/#JKY7ra"4'rrI\ha8Z16UriW< +q-M;As*t~> +r;Qi:AGc?*!Hu2rrrKWg]`/#JKY7ra"4'rrI\ha8Z16UriW< +q-M;As*t~> +r;Qi:AGc?*!Hu2rrrKWg]`/#JKY7ra"4'rrI\ha8Z16UriW< +q-M;As*t~> +qu6nc"8`&temA6mrrKWg]`/#JKY7 +qu6nc"8`&temA6mrrKWg]`/#JKY7 +qu6nc"8`&temA6mrrKWg]`/#JKY7 +qYp_QFR9$A_8Q?S\;\*#!PjB$rr>[,rr`1T/G8E1!q'"Nmf*LjEf'J`=5(t"!J/20rrJghbPqY. +19^KQJ,~> +qYp_QFR9$A_8Q?S\;\*#!PjB$rr>[,rr`1T/G8E1!q'"Nmf*LjEf'J`=5(t"!J/20rrJghbPqY. +19^KQJ,~> +qYp_QFR9$A_8Q?S\;\*#!PjB$rr>[,rr`1T/G8E1!q'"Nmf*LjEf'J`=5(t"!J/20rrJghbPqY. +19^KQJ,~> +q>UPk;gW)nrrKWg]`/#JKY7J8"T49\EIlC7!J/20rrJghc2Rn/Uf4;f +s*t~> +q>UPk;gW)nrrKWg]`/#JKY7J8"T49\EIlC7!J/20rrJghc2Rn/Uf4;f +s*t~> +q>UPk;gW)nrrKWg]`/#JKY7J8"T49\EIlC7!J/20rrJghc2Rn/Uf4;f +s*t~> +q#:KG/k]\o`Gbi\9C?a'90>X==^u:%E!8Br>&7G7i,A^-B&@P-2T0P +q#:KG/k]\o`Gbi\9C?a'90>X==^u:%E!8Br>&7G7i,A^-B&@P-2T0P +q#:KG/k]\o`Gbi\9C?a'90>X==^u:%E!8Br>&7G7i,A^-B&@P-2T0P +q>UWtF0#9"eZdO5^70q%@o,?Z=DN;ETsMf!e-Mn#>sM>3Q+#-$e,b#YU!s.oh"U+6!q97 at lMh%^ +?cDp"eUc6-e,n4^rq-5@~> +q>UWtF0#9"eZdO5^70q%@o,?Z=DN;ETsMf!e-Mn#>sM>3Q+#-$e,b#YU!s.oh"U+6!q97 at lMh%^ +?cDp"eUc6-e,n4^rq-5@~> +q>UWtF0#9"eZdO5^70q%@o,?Z=DN;ETsMf!e-Mn#>sM>3Q+#-$e,b#YU!s.oh"U+6!q97 at lMh%^ +?cDp"eUc6-e,n4^rq-5@~> +q>UMjFoA3;&FnGkXd=TS=%cnCMkIN'iV2R9$2rYfNFkn'R(_SDrrJRkM#RPTGb=7#!JcYcs3(Fm~> +q>UMjFoA3;&FnGkXd=TS=%cnCMkIN'iV2R9$2rYfNFkn'R(_SDrrJRkM#RPTGb=7#!JcYcs3(Fm~> +q>UMjFoA3;&FnGkXd=TS=%cnCMkIN'iV2R9$2rYfNFkn'R(_SDrrJRkM#RPTGb=7#!JcYcs3(Fm~> +qYpW0?LjZe&c1V8\YP73 at nfd3H]Y):cfFlfrsAGJXFskUG+?M7m/I*RXGHlWNdg6m!hjQ0JcEpn J,~> -ec,[$DT;\V:<R^Ae5]F1hMRfk\8#!*[)9!rd#TmJd3oJFWX at rEn"NrrL/X`W#tK -N4f/k^kBB#!(ss)!r#jRmJm3Tnc&[^<9X8[!N_+'rrI\ha8Z16Ur`Q;b%L_IrrUt[pr`U;aa<4N +qYpW0?LjZe&c1V8\YP73 at nfd3H]Y):cfFlfrsAGJXFskUG+?M7m/I*RXGHlWNdg6m!hjQ0JcEpn J,~> -ec,[$DT;\V:<R^Ae5]F1hMRfk\8#!*[)9!rd#TmJd3oJFWX at rEn"NrrL/X`W#tK -N4f/k^kBB#!(ss)!r#jRmJm3Tnc&[^<9X8[!N_+'rrI\ha8Z16Ur`Q;b%L_IrrUt[pr`U;aa<4N +qYpW0?LjZe&c1V8\YP73 at nfd3H]Y):cfFlfrsAGJXFskUG+?M7m/I*RXGHlWNdg6m!hjQ0JcEpn J,~> -ec,[$DT;\V:<[)rrJIEmJd7_;sEfO!N:&;rrW1*g!B[!J],V/!MQ=2rrW"&bk1o9M2TOV!Qf]O +qu6`K -ec,[$DT;\V:<[)rrJIEmJd7_;sEfO!N:&;rrW1*g!B[!J],V/!MQ=2rrW"&bk1o9M2TOV!Qf]O +qu6`K -ec,[$DT;\V:<[)rrJIEmJd7_;sEfO!N:&;rrW1*g!B[!J],V/!MQ=2rrW"&bk1o9M2TOV!Qf]O +qu6`K -ec,[$DT;\V:es8UYVqo/R9 -\;\*#!PjB$rr>[*rrSp+p$Mb[W.sd@!rckXrr3#2F3addJ],V/!MQ=3rrW",Sb)j_oeE,_rrL5g -kPp&~> -ec,[$DT;\V:es8UYVqo/R9 -\;\*#!PjB$rr>[*rrSp+p$Mb[W.sd@!rckXrr3#2F3addJ],V/!MQ=3rrW",Sb)j_oeE,_rrL5g -kPp&~> -ec,[$DT;\V:es8UYVqo/R9 -\;\*#!PjB$rr>[*rrSp+p$Mb[W.sd@!rckXrr3#2F3addJ],V/!MQ=3rrW",Sb)j_oeE,_rrL5g -kPp&~> -ec,[$DT;\V: -ec,[$DT;\V: -ec,[$DT;\V: -ec,[$DT;\V:"TH>YD!UHf!NLY8rr\uoHY(+p -!P"*$rrKog]`.t(_Z'c9]4$'[m/I*JRI'qVr/OftJ^+2qJ],V/!MQ=6rr_G[;l] -ec,[$DT;\V:"TH>YD!UHf!NLY8rr\uoHY(+p -!P"*$rrKog]`.t(_Z'c9]4$'[m/I*JRI'qVr/OftJ^+2qJ],V/!MQ=6rr_G[;l] -ec,[$DT;\V:"TH>YD!UHf!NLY8rr\uoHY(+p -!P"*$rrKog]`.t(_Z'c9]4$'[m/I*JRI'qVr/OftJ^+2qJ],V/!MQ=6rr_G[;l] -eSkP!6,mjD2pZFHEbnQs_>Wd$"S%ma?ua/)!F\@`E!B6%6r$imCt`h36:Y-mA3o-m!G>p"Du_u< -E!:<#;0BSNm/I.BY*dl!G#g"Du_f7E!:8s -:4CIem/I.-?MEab"M$*WB62C -eSkP!6,mjD2pZFHEbnQs_>Wd$"S%ma?ua/)!F\@`E!B6%6r$imCt`h36:Y-mA3o-m!G>p"Du_u< -E!:<#;0BSNm/I.BY*dl!G#g"Du_f7E!:8s -:4CIem/I.-?MEab"M$*WB62C -eSkP!6,mjD2pZFHEbnQs_>Wd$"S%ma?ua/)!F\@`E!B6%6r$imCt`h36:Y-mA3o-m!G>p"Du_u< -E!:<#;0BSNm/I.BY*dl!G#g"Du_f7E!:8s -:4CIem/I.-?MEab"M$*WB62C -J^if2!nH&skPkSGf!*X7`LVp3AlCr_V$rc>.=j41B`%_eEgG%4?47p'PSNhNf"im\71IpG< -J^if2!nH&skPkSGf!*X7`LVp3AlCr_V$rc>.=j41B`%_eEgG%4?47p'PSNhNf"im\71IpG< -J^if2!nH&skPkSGf!*X7`LVp3AlCr_V$rc>.=j41B`%_eEgG%4?47p'PSNhNf"im\71IpG< -JcC<$mf*jigrHXfKPk!c>]PUjZc_.rkPkkJ]96r'Bp-!_rTO7^[ZQ at F!KVs!rrSp;rMKT+n_(g^ -Q[rpR94)h"TXN,(pZVV`rS4i at Akd32^#\AV!Lg0IrrW.DTBZ at VLQ-lbLAqSI_jPL=ArjO^rq6;A~> -JcC<$mf*jigrHXfKPk!c>]PUjZc_.rkPkkJ]96r'Bp-!_rTO7^[ZQ at F!KVs!rrSp;rMKT+n_(g^ -Q[rpR94)h"TXN,(pZVV`rS4i at Akd32^#\AV!Lg0IrrW.DTBZ at VLQ-lbLAqSI_jPL=ArjO^rq6;A~> -JcC<$mf*jigrHXfKPk!c>]PUjZc_.rkPkkJ]96r'Bp-!_rTO7^[ZQ at F!KVs!rrSp;rMKT+n_(g^ -Q[rpR94)h"TXN,(pZVV`rS4i at Akd32^#\AV!Lg0IrrW.DTBZ at VLQ-lbLAqSI_jPL=ArjO^rq6;A~> -JcC<$k5Q%kkL.#@OaUh<9k/F-U:AG+p?_ecqU`$0 at ngs0^>nS[!ORrErrT06qYs~> -JcC<$k5Q%kkL.#@OaUh<9k/F-U:AG+p?_ecqU`$0 at ngs0^>nS[!ORrErrT06qYs~> -JcC<$k5Q%kkL.#@OaUh<9k/F-U:AG+p?_ecqU`$0 at ngs0^>nS[!ORrErrT06qYs~> -JcC<$h>\)]iQSd)Nd,&/:Lna1UUSD'oC2bdp<]dm?;>R0^ZP(d!Oe/JrrU8GlK\BNelC[mrt4kZ -ag at XtF^Rj?B7#f<\]s.-nG`gbbG9Yj;gFtQm.()VRBDDH!j?81lMgq&?13 at EJcGZJ$1l?9HW4*s -VTeZ2s*t~> -JcC<$h>\)]iQSd)Nd,&/:Lna1UUSD'oC2bdp<]dm?;>R0^ZP(d!Oe/JrrU8GlK\BNelC[mrt4kZ -ag at XtF^Rj?B7#f<\]s.-nG`gbbG9Yj;gFtQm.()VRBDDH!j?81lMgq&?13 at EJcGZJ$1l?9HW4*s -VTeZ2s*t~> -JcC<$h>\)]iQSd)Nd,&/:Lna1UUSD'oC2bdp<]dm?;>R0^ZP(d!Oe/JrrU8GlK\BNelC[mrt4kZ -ag at XtF^Rj?B7#f<\]s.-nG`gbbG9Yj;gFtQm.()VRBDDH!j?81lMgq&?13 at EJcGZJ$1l?9HW4*s -VTeZ2s*t~> -JcC<$eGg0ShoiL(NHo)39OW(#S?To_lM^DU$1lE>JmM8pRD%VRrrKKgMZ3aun4Z -grQmpMfrQ):Le[/T(Y2~> -JcC<$eGg0ShoiL(NHo)39OW(#S?To_lM^DU$1lE>JmM8pRD%VRrrKKgMZ3aun4Z -grQmpMfrQ):Le[/T(Y2~> -JcC<$eGg0ShoiL(NHo)39OW(#S?To_lM^DU$1lE>JmM8pRD%VRrrKKgMZ3aun4Z -grQmpMfrQ):Le[/T(Y2~> -JcC<$bPr4Lj3YE9P_![S86K\UOJB8+h!k.>$M)KAKO at SpPdfBDr;Qf+P)K>A_H#=TrrUMGc at Q#q -rt>"_cFB[4IVMnS>A\nSVRaq.oD/CnmDu)Q>>fU3]\i\crrJOkMuNjY>O(MR!kVLjJcC<$nG`RM -]U"'~> -JcC<$bPr4Lj3YE9P_![S86K\UOJB8+h!k.>$M)KAKO at SpPdfBDr;Qf+P)K>A_H#=TrrUMGc at Q#q -rt>"_cFB[4IVMnS>A\nSVRaq.oD/CnmDu)Q>>fU3]\i\crrJOkMuNjY>O(MR!kVLjJcC<$nG`RM -]U"'~> -JcC<$bPr4Lj3YE9P_![S86K\UOJB8+h!k.>$M)KAKO at SpPdfBDr;Qf+P)K>A_H#=TrrUMGc at Q#q -rt>"_cFB[4IVMnS>A\nSVRaq.oD/CnmDu)Q>>fU3]\i\crrJOkMuNjY>O(MR!kVLjJcC<$nG`RM -]U"'~> -JcC<$_Z(k[mb5^gToOJ5=%HG/I?(#,`7F/Ks8Vf at Y)6jbB8it=o!FL;rrS\rip-OF]E$W9s7QC: -rT`"QZ(?kuAQ26*D1@\C[E$tcr;Zffbc->+9PfireFo92N;is&.IQL$!h0kcJcC<$m/MS~> -JcC<$_Z(k[mb5^gToOJ5=%HG/I?(#,`7F/Ks8Vf at Y)6jbB8it=o!FL;rrS\rip-OF]E$W9s7QC: -rT`"QZ(?kuAQ26*D1@\C[E$tcr;Zffbc->+9PfireFo92N;is&.IQL$!h0kcJcC<$m/MS~> -JcC<$_Z(k[mb5^gToOJ5=%HG/I?(#,`7F/Ks8Vf at Y)6jbB8it=o!FL;rrS\rip-OF]E$W9s7QC: -rT`"QZ(?kuAQ26*D1@\C[E$tcr;Zffbc->+9PfireFo92N;is&.IQL$!h0kcJcC<$m/MS~> -JcC<$\GmTIle0=dUQL%D>=h\%FbcBe]?%XcP&a>_7\@HSrK at 0_iIPV+lMgq& -JcC<$\GmTIle0=dUQL%D>=h\%FbcBe]?%XcP&a>_7\@HSrK at 0_iIPV+lMgq& -JcC<$\GmTIle0=dUQL%D>=h\%FbcBe]?%XcP&a>_7\@HSrK at 0_iIPV+lMgq& -JcC<$XoB4.i6T':RYc9&=%H5!8NC-V6oe=qV9\Isrrr8 -JcC<$XoB4.i6T':RYc9&=%H5!8NC-V6oe=qV9\Isrrr8 -JcC<$XoB4.i6T':RYc9&=%H5!8NC-V6oe=qV9\Isrrr8 -JcC<$UAl&#iKJ)^TT=J,6S9Q(+Z2r,L9&2uZ3)FFLZ,G)JmJNs`#QEG\Gu9+4rp'Lc_-3<(JcC<$l2Q8~> -JcC<$UAl&#iKJ)^TT=J,6S9Q(+Z2r,L9&2uZ3)FFLZ,G)JmJNs`#QEG\Gu9+4rp'Lc_-3<(JcC<$l2Q8~> -JcC<$UAl&#iKJ)^TT=J,6S9Q(+Z2r,L9&2uZ3)FFLZ,G)JmJNs`#QEG\Gu9+4rp'Lc_-3<(JcC<$l2Q8~> -JcC<$T`5&$P5>1tqWcD)K4 at A(.l9:L4@`UjFb5XDW3sLhg?%l'^&JE0f=RGp;IGKuo'-/VkCHp[ -JcF$q!Lg1fru:^rae=/i6S'cG4$>Yt?#+Y;Oe&M]`6mB'o)69%$1HBNQ#KN2PK!:\rr^tqC"7e7 -JcFp5J,~> -JcC<$T`5&$P5>1tqWcD)K4 at A(.l9:L4@`UjFb5XDW3sLhg?%l'^&JE0f=RGp;IGKuo'-/VkCHp[ -JcF$q!Lg1fru:^rae=/i6S'cG4$>Yt?#+Y;Oe&M]`6mB'o)69%$1HBNQ#KN2PK!:\rr^tqC"7e7 -JcFp5J,~> -JcC<$T`5&$P5>1tqWcD)K4 at A(.l9:L4@`UjFb5XDW3sLhg?%l'^&JE0f=RGp;IGKuo'-/VkCHp[ -JcF$q!Lg1fru:^rae=/i6S'cG4$>Yt?#+Y;Oe&M]`6mB'o)69%$1HBNQ#KN2PK!:\rr^tqC"7e7 -JcFp5J,~> -JcC<$T`5&"ORiDuma&/%FAke;D1%/%Q]HcBCL:"29iu"FH%V*BTrYZ:`m<8okjnN'rt,/#jOVG^ -W02^F;,D(eWQk"srrh55 -JcC<$T`5&"ORiDuma&/%FAke;D1%/%Q]HcBCL:"29iu"FH%V*BTrYZ:`m<8okjnN'rt,/#jOVG^ -W02^F;,D(eWQk"srrh55 -JcC<$T`5&"ORiDuma&/%FAke;D1%/%Q]HcBCL:"29iu"FH%V*BTrYZ:`m<8okjnN'rt,/#jOVG^ -W02^F;,D(eWQk"srrh55 -JcC<$T`5&$P3i3+p"-jLKP4(^FHETEjSei>imu>j\#uNpObS=.D.QsQ9L_ZP=C,WTDf^/NJV]/@ -NK93dQ^.Q7(mC2EMhct9IWTC;?<9fk<+0ZnNM*Prg[jM+"o#ZK>cd[Ns3(ECR]c#W2=K&)S:G-C ->^2L:bif$!lJU17^p^>=R#m&NFDPGk<(f\R;HR:?CN+B at I=d<4N/j!_Pa7U6PSfUKNf/XEIslBR - at pE).8QTDAIug;1aklaPrrqu"ARr=KJcC<$jSs`~> -JcC<$T`5&$P3i3+p"-jLKP4(^FHETEjSei>imu>j\#uNpObS=.D.QsQ9L_ZP=C,WTDf^/NJV]/@ -NK93dQ^.Q7(mC2EMhct9IWTC;?<9fk<+0ZnNM*Prg[jM+"o#ZK>cd[Ns3(ECR]c#W2=K&)S:G-C ->^2L:bif$!lJU17^p^>=R#m&NFDPGk<(f\R;HR:?CN+B at I=d<4N/j!_Pa7U6PSfUKNf/XEIslBR - at pE).8QTDAIug;1aklaPrrqu"ARr=KJcC<$jSs`~> -JcC<$T`5&$P3i3+p"-jLKP4(^FHETEjSei>imu>j\#uNpObS=.D.QsQ9L_ZP=C,WTDf^/NJV]/@ -NK93dQ^.Q7(mC2EMhct9IWTC;?<9fk<+0ZnNM*Prg[jM+"o#ZK>cd[Ns3(ECR]c#W2=K&)S:G-C ->^2L:bif$!lJU17^p^>=R#m&NFDPGk<(f\R;HR:?CN+B at I=d<4N/j!_Pa7U6PSfUKNf/XEIslBR - at pE).8QTDAIug;1aklaPrrqu"ARr=KJcC<$jSs`~> -JcC<$T`5&"OQHKOld)o(HXBBSG`\l>f^SP5,l7-"k2G%EdEK\L^q at 4e[Bm-CYHY79Z*^sM]tqY0 -d+I7=nG(f=#5#Wc:k-I`JcEjl!LTtNrso%kbHI.S>>/ORPcVgYp%880q= -JcC<$T`5&"OQHKOld)o(HXBBSG`\l>f^SP5,l7-"k2G%EdEK\L^q at 4e[Bm-CYHY79Z*^sM]tqY0 -d+I7=nG(f=#5#Wc:k-I`JcEjl!LTtNrso%kbHI.S>>/ORPcVgYp%880q= -JcC<$T`5&"OQHKOld)o(HXBBSG`\l>f^SP5,l7-"k2G%EdEK\L^q at 4e[Bm-CYHY79Z*^sM]tqY0 -d+I7=nG(f=#5#Wc:k-I`JcEjl!LTtNrso%kbHI.S>>/ORPcVgYp%880q= -JcC<$T`5&"OPg'Kr8c&-RtGKT:1es at YK,Pp[f6U0euWpfI^nlus2P'>R&o3F&,Y;+YEs`O:/P_V -R^1)sq6p;.ps>mR;22j[JcC<$huA3~> -JcC<$T`5&"OPg'Kr8c&-RtGKT:1es at YK,Pp[f6U0euWpfI^nlus2P'>R&o3F&,Y;+YEs`O:/P_V -R^1)sq6p;.ps>mR;22j[JcC<$huA3~> -JcC<$T`5&"OPg'Kr8c&-RtGKT:1es at YK,Pp[f6U0euWpfI^nlus2P'>R&o3F&,Y;+YEs`O:/P_V -R^1)sq6p;.ps>mR;22j[JcC<$huA3~> -JcC<$T`5&"OOsLDp"[KeP^I"::hG$7Uq=k.n\kG6rSk\cED:25angSg_uBb)XOmI`o%Ls[Oa1G0 -;e^ZCVnLF9oYgb9qVAoPCJAc;dJ\XrJcFO*J,~> -JcC<$T`5&"OOsLDp"[KeP^I"::hG$7Uq=k.n\kG6rSk\cED:25angSg_uBb)XOmI`o%Ls[Oa1G0 -;e^ZCVnLF9oYgb9qVAoPCJAc;dJ\XrJcFO*J,~> -JcC<$T`5&"OOsLDp"[KeP^I"::hG$7Uq=k.n\kG6rSk\cED:25angSg_uBb)XOmI`o%Ls[Oa1G0 -;e^ZCVnLF9oYgb9qVAoPCJAc;dJ\XrJcFO*J,~> -JcC<$T`5&"OO*q at oA7WsTT")+;b:22Jrub3_9h*0rR_&XrTDP -JcC<$T`5&"OO*q at oA7WsTT")+;b:22Jrub3_9h*0rR_&XrTDP -JcC<$T`5&"OO*q at oA7WsTT")+;b:22Jrub3_9h*0rR_&XrTDP -JcC<$T`5&.TuR*qqWQMLZ_Nb -JcC<$T`5&.TuR*qqWQMLZ_Nb -JcC<$T`5&.TuR*qqWQMLZ_Nb -JcC<$U&P,KrfdEJ]`0JSl.jV&\?;WsP)4a7F)>T"?!:90<)Z[m;cd10 at V9S&JVoY`XLud4mJVV9 -[/U-OrfdEY]`0JRkM"4u\#c?mOb\I2EboAs>Zk*-<)Z[m<*3 at 3@q]e+JrGqfYJ8B>mf%e;JcEso +r;QiJ<7-R&'(Xi![@W;"@ST^/H&SB$`nKhZp&>?ca.dr`<-b(PkP"oVR&l2F!jQ(tlMgq$=Q4o3 +ao?k~> +r;QiJ<7-R&'(Xi![@W;"@ST^/H&SB$`nKhZp&>?ca.dr`<-b(PkP"oVR&l2F!jQ(tlMgq$=Q4o3 +ao?k~> +r;QiJ<7-R&'(Xi![@W;"@ST^/H&SB$`nKhZp&>?ca.dr`<-b(PkP"oVR&l2F!jQ(tlMgq$=Q4o3 +ao?k~> +rVlrF<6g'ps8N`)i6Jj.Oa_%G86]q]PGYn7ht-[D$LPp1Ip5fnRCqGUr;QecYD`D^Wa"cRrrTf5 +hgtgKs*t~> +rVlrF<6g'ps8N`)i6Jj.Oa_%G86]q]PGYn7ht-[D$LPp1Ip5fnRCqGUr;QecYD`D^Wa"cRrrTf5 +hgtgKs*t~> +rVlrF<6g'ps8N`)i6Jj.Oa_%G86]q]PGYn7ht-[D$LPp1Ip5fnRCqGUr;QecYD`D^Wa"cRrrTf5 +hgtgKs*t~> +rr3&4!82r'p&?98lIWtZSr7i)<(U;2J!$M6a4]bUs8VZ6WJ4kUClu!Pp6_q?rrR?mmcsfRRhOq8 +s2Y.i~> +rr3&4!82r'p&?98lIWtZSr7i)<(U;2J!$M6a4]bUs8VZ6WJ4kUClu!Pp6_q?rrR?mmcsfRRhOq8 +s2Y.i~> +rr3&4!82r'p&?98lIWtZSr7i)<(U;2J!$M6a4]bUs8VZ6WJ4kUClu!Pp6_q?rrR?mmcsfRRhOq8 +s2Y.i~> +s8N/; +s8N/; +s8N/; +"9"EihLY^`rtk.\bdsa?L3 at 0/7oX"^6s`_W4Bm?:e+&n,"noQK@(ZF(rr_qFD +"9"EihLY^`rtk.\bdsa?L3 at 0/7oX"^6s`_W4Bm?:e+&n,"noQK@(ZF(rr_qFD +"9"EihLY^`rtk.\bdsa?L3 at 0/7oX"^6s`_W4Bm?:e+&n,"noQK@(ZF(rr_qFD +!b7&YJcF4!)#j!]H[r8jNHeVl.j>uZ3)FFLZ,G)JmJNs`#QEG\Gu9+4rp'Lc_-3<(JcE[gJ,~> +!b7&YJcF4!)#j!]H[r8jNHeVl.j>uZ3)FFLZ,G)JmJNs`#QEG\Gu9+4rp'Lc_-3<(JcE[gJ,~> +!b7&YJcF4!)#j!]H[r8jNHeVl.j>uZ3)FFLZ,G)JmJNs`#QEG\Gu9+4rp'Lc_-3<(JcE[gJ,~> +!6B`kcMmp6Y58/;pZT_mIU5Am/2]LP4%`doGD)*LWjfpogun8,^&JE-e?kK[:M,g0pZ_\[g2^oX +JcEUeJ,~> +!6B`kcMmp6Y58/;pZT_mIU5Am/2]LP4%`doGD)*LWjfpogun8,^&JE-e?kK[:M,g0pZ_\[g2^oX +JcEUeJ,~> +!6B`kcMmp6Y58/;pZT_mIU5Am/2]LP4%`doGD)*LWjfpogun8,^&JE-e?kK[:M,g0pZ_\[g2^oX +JcEUeJ,~> +JcF!p!LTtZs!I$SXc at Bt94)UdM3=0bJTba6;FjSeB5i0MNgQQB\A-)2f\u)dq:ko\qsi[r`3c>% +IUu;SEK76MpZMPZds5--rdk*cs*t~> +JcF!p!LTtZs!I$SXc at Bt94)UdM3=0bJTba6;FjSeB5i0MNgQQB\A-)2f\u)dq:ko\qsi[r`3c>% +IUu;SEK76MpZMPZds5--rdk*cs*t~> +JcF!p!LTtZs!I$SXc at Bt94)UdM3=0bJTba6;FjSeB5i0MNgQQB\A-)2f\u)dq:ko\qsi[r`3c>% +IUu;SEK76MpZMPZds5--rdk*cs*t~> +JcF!p!Lg1Xs#'8p\=A([93c_+YKZ20p$1Jbb.tHeU6q$sI<9:8>?"6b92\l!Bkq[0H$t:$M2[IV +P*D8trfe7`P`CZVK7A;jCL^UN91`2pEIX%C[)q1ujSoDSZXm[Wr.4m_s*t~> +JcF!p!Lg1Xs#'8p\=A([93c_+YKZ20p$1Jbb.tHeU6q$sI<9:8>?"6b92\l!Bkq[0H$t:$M2[IV +P*D8trfe7`P`CZVK7A;jCL^UN91`2pEIX%C[)q1ujSoDSZXm[Wr.4m_s*t~> +JcF!p!Lg1Xs#'8p\=A([93c_+YKZ20p$1Jbb.tHeU6q$sI<9:8>?"6b92\l!Bkq[0H$t:$M2[IV +P*D8trfe7`P`CZVK7A;jCL^UN91`2pEIX%C[)q1ujSoDSZXm[Wr.4m_s*t~> +JcF!p!LTtNrso%kbHI.S>>/ORPcVgYp%880q= +JcF!p!LTtNrso%kbHI.S>>/ORPcVgYp%880q= +JcF!p!LTtNrso%kbHI.S>>/ORPcVgYp%880q= +JcF!p!LTtGrt#"baKLq[B22< +JcF!p!LTtGrt#"baKLq[B22< +JcF!p!LTtGrt#"baKLq[B22< +JcF!p!LTt?rt+bT_PrZC at nTa7I?LMAcf4T8rsAPX^QrY0E1>8RJcE4ZJ,~> +JcF!p!LTt?rt+bT_PrZC at nTa7I?LMAcf4T8rsAPX^QrY0E1>8RJcE4ZJ,~> +JcF!p!LTt?rt+bT_PrZC at nTa7I?LMAcf4T8rsAPX^QrY0E1>8RJcE4ZJ,~> +JcF!p!LTt7rtOtWa0D1mFCJ'>??([`UpIteiq*0$rs\edc*j3s at nUBgWRUcqs0M`U~> +JcF!p!LTt7rtOtWa0D1mFCJ'>??([`UpIteiq*0$rs\edc*j3s at nUBgWRUcqs0M`U~> +JcF!p!LTt7rtOtWa0D1mFCJ'>??([`UpIteiq*0$rs\edc*j3s at nUBgWRUcqs0M`U~> +JcF!p!N +JcF!p!N +JcF!p!N +JcF$q!7(S.!;X;-.eMoXcGI&lUR at 7"J9Q$MB45%J<`N*t;GpIr>@1lRDg?qnPbG:qcJJ!gJcDYJ J,~> -JcC<$U&P,KrfdEJ]`0JSl.jV&\?;WsP)4a7F)>T"?!:90<)Z[m;cd10 at V9S&JVoY`XLud4mJVV9 -[/U-OrfdEY]`0JRkM"4u\#c?mOb\I2EboAs>Zk*-<)Z[m<*3 at 3@q]e+JrGqfYJ8B>mf%e;JcEso +JcF$q!7(S.!;X;-.eMoXcGI&lUR at 7"J9Q$MB45%J<`N*t;GpIr>@1lRDg?qnPbG:qcJJ!gJcDYJ J,~> -JcC<$U&P,KrfdEJ]`0JSl.jV&\?;WsP)4a7F)>T"?!:90<)Z[m;cd10 at V9S&JVoY`XLud4mJVV9 -[/U-OrfdEY]`0JRkM"4u\#c?mOb\I2EboAs>Zk*-<)Z[m<*3 at 3@q]e+JrGqfYJ8B>mf%e;JcEso +JcF$q!7(S.!;X;-.eMoXcGI&lUR at 7"J9Q$MB45%J<`N*t;GpIr>@1lRDg?qnPbG:qcJJ!gJcDYJ J,~> -JcC<$U&P8D!!!E$JcC<$`;]qA!!"Bts+13$s4dR(~> -JcC<$U&P8D!!!E$JcC<$`;]qA!!"Bts+13$s4dR(~> -JcC<$U&P8D!!!E$JcC<$`;]qA!!"Bts+13$s4dR(~> -JcC<$U&P5m#lmbPs+13frr_0Z!-EelJcC<$g])d~> -JcC<$U&P5m#lmbPs+13frr_0Z!-EelJcC<$g])d~> -JcC<$U&P5m#lmbPs+13frr_0Z!-EelJcC<$g])d~> -JcC<$T`5'R!1\W?JcEUe!YbXNJcC<$JcFL)J,~> -JcC<$T`5'R!1\W?JcEUe!YbXNJcC<$JcFL)J,~> -JcC<$T`5'R!1\W?JcEUe!YbXNJcC<$JcFL)J,~> -JcC<$T`5(0!U#%6JcEUe!_3k#JcC<$JcFL)J,~> -JcC<$T`5(0!U#%6JcEUe!_3k#JcC<$JcFL)J,~> -JcC<$T`5(0!U#%6JcEUe!_3k#JcC<$JcFL)J,~> -JcC<$T`5%c21bdYs2"^9H -JcC<$T`5%c21bdYs2"^9H -JcC<$T`5%c21bdYs2"^9H -JcC<$T`5&AJq -JcC<$T`5&AJq -JcC<$T`5&AJq -JcC<$o`#$le=;1\Z% -JcC<$o`#$le=;1\Z% -JcC<$o`#$le=;1\Z% -JcC<$p&>04?Y-+NJ\p9\"Mg^;B[),.mJd at h[o[LK_1BJ\_?IlkRTF[dJcC<$ao;P6Q;NIG`9tKm~> -JcC<$p&>04?Y-+NJ\p9\"Mg^;B[),.mJd at h[o[LK_1BJ\_?IlkRTF[dJcC<$ao;P6Q;NIG`9tKm~> -JcC<$p&>04?Y-+NJ\p9\"Mg^;B[),.mJd at h[o[LK_1BJ\_?IlkRTF[dJcC<$ao;P6Q;NIG`9tKm~> -JcC<$pAY2UACH,0f`)#n?(Z]Jn,ELhHu\+rs4RDSrj>h:JcC<$bPq\3>ES[Gs*t~> -JcC<$pAY2UACH,0f`)#n?(Z]Jn,ELhHu\+rs4RDSrj>h:JcC<$bPq\3>ES[Gs*t~> -JcC<$pAY2UACH,0f`)#n?(Z]Jn,ELhHu\+rs4RDSrj>h:JcC<$bPq\3>ES[Gs*t~> -JcC<$p\t;A&c at 4[f)GgG@?Z9Bnc&[e;*BL1ec,^;:UboTJcF!p!o -JcC<$p\t;A&c at 4[f)GgG@?Z9Bnc&[e;*BL1ec,^;:UboTJcF!p!o -JcC<$p\t;A&c at 4[f)GgG@?Z9Bnc&[e;*BL1ec,^;:UboTJcF!p!o -JcC<$q#:DcEr>S0s8)fjg]%??qtp3h!:oUYs75sb!VcKRs8VrrpXB-DpG/q's760jJqimss8)fj -g]%??qtp6i!W2HVs8VZbrrDWOs8VrrpXB-Dln-8/s+13rrrVUm[e'M#p\Xj`s*t~> -JcC<$q#:DcEr>S0!r)Tdh#@KRlMpbXrrN#fn,EIWp\Xdd!:o7O!r)Tde,KLD19Z9/o)A`BL at bEH -p\XjCrr`/`s82Zm!VcK[rrVW_qt^6lmcFHMp\Xj:rrVO=a+=8As3L]HmT[-krrMlkq#>j~> -JcC<$q#:DcEr>S0!r)Thh#IEF!;lTl!VcK[rrVK_qt^6lo&]lQp\Xj:rrVpMYCZ`ErrI_+oDejb -g]. -JcC<$q>UNU;tBP["3?=(mb[sHpHaX3K)5KJjT+fM"L1aZ!:'F\!F3M9rrp(9AoL&fpAY69M-TKH -rsdBV:[Zg76/#*7]rM.[WP6&ABhqYpT* -H1:h:Ytp2VlMLS_qZ-'Yrrp(9AoL&fpAY2VX$QX_%BBJ\s02QLmS -JcC<$q>UNU;tBP[!f=BPh>[W5/s-.NqYpT*H1:k6Gl_k:q>UHqo(W.fT)aIJ>k7Ug!f=BPqu7,+ -!.t6U!-uum:Y^O%i;W`]>QDij!/X!unc&[R;XT,9o`#!:?i9Nq!^X):h>[W5/s-.NqYpS._XRU* -Gl_k:qYpTS!;?ErT)aIJ>k7Ug!^X):qu7(M!3uQ\!2\*D:X)Z8rr38u!("jq6%U_unc&[=>P`pN -JcF*s!K`Z>rr_gXM8K)gJ,~> -JcC<$q>UNU;tBP[!`,kRh>[VY>_rIGqYpS.aRT95nkY*I5Qgb/@$"n$X9JjGOlrrPusM>R;i -JcN(UM#aTW!.!9o0)P\Knc2J1:I0Rb\+0J"k>L`!s7HQE$L!-uK_H2dgLdK"m1!+p19h!tCG -dTcR!s+13srrJ4JoD\p0M,3R8s*t~> -JcC<$q>UJKZL\"taJF1ZrVlo8aRfE4R-sVH#L*8Ks'5T at aQid00$XF*^&N]QrrbX4s,er-rr^?= -H2IL=(bX)5s-SrKbqB%n!&"QcqZ-Bjs$=p0bqB%J!.t7NhuJW6f.R*o -!6F^1!Jdq2s+13trrVFaqssagB"b8CrrRfPs*t~> -JcC<$q>UJKZL\"sM8FQ9rrJ8QoD\f9oDeiI"om\0s,lmQ;"oA;srr at oLrrS%o -H2IUZpAjsfs";b"M37hi!.t7NhuJW6f)YjA!7LE;!MGa0s7Hr;Qe[o(2k]H1V(9 -M$3k?H2i0Trs/)ps8R'']u]^C"oA;srr at oLrrQH=X8Do7f)YjNqZ-NnM37h*!58F4V#\U:R$%En -!:o[[!Jdq2s+13trrVFaqt'ginp-AUrVlu]R/d2:~> -JcC<$q>UJKZL\"sE3Z\HrrN"KoD\jQTC`'e!7LnP_Y\rMrs-Uts8Q^2^!6'H"k#^:nc6r.rrR/E -Z2=P=bqB%rpAjsf0%0ce!58F4V#\U:R$dop!:o[[!MGa0s7H!TfsF -rrrJOs09H&TBcF]a=dMmB)e"]nG`[?63$KUc1h5?mXgSZqu7M#OoPI+63$s;df2T5jo>?H!:KkQ -df5.VnG`NEZ%;q+s3^iJku at QOrr^-=H2IR?"22tZs*t~> -JcC<$qYpWm;=a;XFQLcDs07\^mJpM:H&2NHTC+>[pN_@&g]2Wos8VtAJm=]?H%K:gg]2s'p\Oqq -\RpZu[rD4i/l,aPl>U]S^#^mH[sA!c!6tQ7YlL/YGqPq4c,_MB!6G24Jmmf_ -:[S3f\RpZu>ggkLo(RE]B&!B3p](9YE,]F&qg!cuR+q[nqtJkGH-g/[!0No8:JWU1s6=QBB"b[! -s)>7CAcU*Uno-4pR!CjeEg>V>=AT7U="pHd((Gu+J.JnCY,>_2s$s2*]js0m:Qru(A-o)J_U -aT'[@s35fhlMl]QOoNZYs53n/nc&X3FFjICs3^iIXH;uP$EMt!s,!+TYlL0)J,~> -JcC<$qYpWm;=a;X)85.(s+6kJhuJ&LAr-L_f?Fot8AtR[[ -JcL)r^#bmdE4u8N)>=.%s8O^rs,i0>lW`$Asfh'R/[+eaE_$0i9FonB"b5FX8haq!1:6-Anbl%a=^]taT'>,>]AV? -^&%ffqZ'FWs7ZLueSpWNTk=1I/l,aPqg!cuR.gUXrrAnqf7Hf>[p41YX8f$OaT$4mrr3ka!<<)n -!:p/PM>s2n!<<((6-]FlOoMljqsj[ea`N+6JcF-t!N_CQrsH$Eme:[WQuF[kR",~> -JcC<$qYpWm;=a;X)6;B1np-(aWrSNrE+W]JpRc't]n/PkE%\j's&['_>]AWQDkFT7U="pMdhG0'1jgK)><:!*m'HJhFELs*64mB)gt3E+Zf.63#jCfDj9N:WU"M -Ducs=X4PGm0'3*4)9kJIs7-0Xs$=p0T5ZF_qf"jGs,i]KYlOOgrrM1`JcGEC!pE_aoD]a+\%V(t -H&8/o!19.*/phR7Au5O at JjIIs0"q8a=.b(LK(m-->]AV5!6tQVMjo5;[OoPFq -bsDC06-]F]:Po,0DufJ/6.5dP>k%aoa`N+6JcF-t!N_CRrsRc5TE!N"B#XgUc$=g~> -JcC<$qYpTIDXIH=!8$#sOi[QZE9bc$s$=_XaT$5M:\Xkg;94%_0%\0is";q'bl at aqs,kD"!3tYN -63!'Zs"<`%aSPu3qp#0+fDkl&!."V=63"e%jmI`;mJu@^K(:PoJtN'=5lblls05A@!6C"as(7Ys -rrME:rVumns)8Z)OoNZYs6c8N0)oP.0)tJB:B7$anG`Mok^id-rrKljmJdn$fA,qZaSPtBjcRFW -!:k`_s)@O)p\t1iOi[D"pW.X[0%^-J!!(XN:\X_dZ/riSs":SE0)q'TqZ-BUfDjXks8RZNH2lu!(:B89$rrMsjJcC<$dJj6"_X at F/nc8F*pHeiEJ,~> -JcC<$qYpTIDXRN>nc8R(s$?DZ!3tXJaSu820)+dQpHecX;1cmd!;D)dqZ-BjWrOdCs$?DE!8$>L -K)[I.nc8\BqoDS5lIZ'flMp-8!3?.JM>r0Hjng\$blIc_aN]#1!8$rF>QCDns(7Y'!:hbjqZ,7H -rrLa:rr3i0!+p1h!6tP+M>tZ<:QbC.T8ETr!)EU3n,EDnk^id-rrKljmf+$m!;jY5620XEfB#h!;HMo!&!j:63$3MfB%V*nc7dgK)[J#aA;iflMns&s6;lMX8e=, -s+54Ojt?[jB)_l%c$Bd_`[n -c2X.25q^s^rrMsjJcC<$dJj6"_X at F/btnAVdY\"@J,~> -JcC<$qYpTIDXRN>_HcuZnk];I!8$L3o$Thh:]J;4c&qu);*k*#>lR+eaB\cBJcL)rnk];!!9Nd' -aR0&i]nu;Gs+7*IfC&[`qu=n@!8%75c20,ujm#YAM/`JImYT3_!:nA7:B893qZ+<]!9sRTg]7*I -rrLCArr3h[!,umh!:KkQc2X0_!7J`t:X/p,!'rp+n,EDnk^id-rrKljmf+$=>l2V5:]J*.jm#YA -Ocep)s2(h]OoGAXnj3;-V>ijYaB\cBJcL)rc&r%>!9Nc;m`5D.H-#PBs+7*Ic277[s8U=D!8%6H -o(t&Ejh6NN0":+3s,#"p!:nA7:B893huM"SM76:\X&&Zn!R:N at rtq+UE,\TKs8PC0s,"espPI;u -mf-'K!."#%rrMsjJcC<$dJj6"_X at F/M5BXqOj3oXJ,~> -JcC<$qYpT;J*m7IblDAUOi%-cM>thWs$=^lmf*4e:[\5^+kH_U0(.m6-0)s -63!((s%i'Z>hhXBs!dj>s31P?nj3<(0)ts6_X[^$c%>ZidWrq66-X at Rs8S4Xjm)`*aT&)gp\u$q -c2[g2M>u!Vs6c$D!.q]30)tJBhuKDhhXFf)XnbmdC,PGl[S7mf,Sos36/q6-]-is.ruU62U[2qtL-8!2[qls3`P"s%i(-0)q'N -pAiWeaT"QNE*WGC6.4]Zs%i4c:Vuo,)"I\$s8PC+s3`P"aN2U+E93IDs33j]!7L?9!)nIKJcF-t -!HliXrs#(qTCP;Jnpg~> -JcC<$qYpT;J*m7HT)bM`61Y%.c2WXAqZ,aYrr3#i0)benV-MqEs.ruY63$BQl7Q?A61XaMp]&Ki -s";Rn0)o1Q[u("^.J!N=V#];qK)^sis8PCUdOtQVaP6d\!:ojajT(qQs$>)kmf,TDs$=a$rttJ1 -p](7Gc2Wo_s2`:+!-%4jM>tgdg]5dkrrHrjJcGHD!O.sYrst_%TDq4JpAjsf62/e-nc8[h!V.lA -rukXD[u(-]>i7pJmf2Q)>k0NIpAjsfM9,DkpW\c"odqu8,9s8Snqgkj,PObs,/0)q&js$?52 -!9sRTpAj:TTE"H^jlQ((63$f^o(`5%bqB%rqZ-3eObs+#pPD[Xs";RrOdNBRo'cSY;h=t"s3^iI -Fjf[W#$_/Qc%>uDJ,~> -JcC<$qYpT;J*m7H>QE%::]Ktco)DM[bsB3urr3#?M>dGt>c"]fs'2D*Oo+nQblFg4:]J[*s8Rqs -nc8F*M>%"uH-Q6d.IR65Gl[SqaT"QNs6`\_OcfZ>m\OOI:]J[8dK%_qnh/k^o'T_Lhde!Q^,s -s!%1;dWs+;>c"]fqtL-8!3=1ts33k0s%i(-62ue_pAiWec27Mhmf300!;B:Ws$=p0aH?Kgc1b$6 -V.S=Ts34?f!7LngE963UaH?MS0),DGOoPFpdR!p56-]FTs$:pepAjda6-X@\mf*8cJcC<$dJj5i -ddI,?l2UhPM9,^ZJ,~> -JcC<$qYpT:II7&L^&LC8Oi%-cK)a)7s";AtOoN,M614dIlM!TLlMpTEZ0M at Gh#HdBnr^fh6-]H( -63!=/s%i4@>eU%7s5qOkfDkk:df0 -JcC<$qYpT:II@,NmaCM'nh0M50$XEQ\,-0n!6G2-lRr5;me>L4\,ZK`:UgB(:]LI.0)mQpqZ-Bj -dXqKOdf2W5V1QSas7bgYlLMfms8N)IaFaGZOoPGIo%,MoOj3bUZ0MAd!<:sW^&LC!s2*2:o)A^T -rVlo`o)AY,qZ-Bjs";b"M37h__Z'U3s-S*3f)YiO!:'(R!GgA>s7ZHnYEnVVC at 9O -JcC<$qYpT:II@,Mddk7-mSElW!:p.UlGu9H!:' -M36QnlM$plM?!V;s)=U^s8SpP_Z/nHs8R&*aGKrF63$s\ma=E$Oj3oFT at a,Ci;)1s/Q.]dK'%AOiW.SaEd^`!T0s8O_"s*=XX!8RGO -lMj/urr at oErr>oIs+13trrI2hmf*=$s8IiVaT%WX~> -JcC<$qYpT:II7&L:Si$lWrTM&:\*TI>Yg4.!!&DdE%^(R0&-Fm!4U_`5leC-!2!&Zs/Q-l!/^`b -!6ADWf)W(P!%onZg]7)L62rQ_OY6)!!*k3XfBumKblGhI61+_*!/\AhE:W)jM=LWH:\U5/M.ZY` -rrK/drr3nb!)N%7!(#=7!54a"dcHkrJcMjD!1s7ZHnYEnSUBhtREjf8BR!/^`h -!+mjsf)PfaV>f/hYr7!'pUo]`=[#TDrj_]`bD$KH''`I -g]3In!8#g&R%FB1:P/HD/c^aA!-%Mj!/],(!.t5HAoO.8rrK/drr3n;!.t6U!."!.!46]2o!-I1 -:B8:X!4Vu[!7LE;!)\=IJcF-t!HZ]Wrs/*IZ#KR?>d8e~> -JcC<$qYpT:II@,Mnc5q,s(28E!/^`h!+mjsYlFdFqZ'mu>aV>f/hZ(Y!%on^Gu(%4c2VAUT`DS% -M#cB4T=k6V:B3"CpSC1U:S6_KO`4q4g]34-:\**;R$[m/:P.@%5leBd!1s7ZHnYEnVVC at VA0B)cHCT`DS% -JcKaBjfndcaSPsBqZ,&?!%q(AV#W,#i-A+j!6tB@>dOL?nkWN8!6C9gnkT6<:\RYWqZ,70!0M54 -s/Q.,:J^Pj!6ADWf)W)2!'pUoT)b8Y[fE\0!!'M&!/XLmr;QdnTDnj/GlY,LM#aC#!)L-kH2i0a -dJuSX:I3V4/l1p*rr>oIs+13trrI2hmf*O::Sj3/!0N+g~> -JcC<$qYpT:II@,MaBY@)pAeI"!4Vub!,sRKJcIFgg]3K:!7G*P/mS-U!%qOJ/pWRFme6]dK`Kor -:M.NFaGE^X!%n8.s'22r!8"[[T22*ZWrSalM>sg\aBW?*!3r-r/hYCo!58DX!8"%I!4VM!JksJc -rrE,Orr3mg!3uQ\!2Z^rH-JX#s+:!n!)La56/;>i>jh.^!GgA>s7ZHnYEnVVC<0YPR.gScK`Kp* -5s]*fpOWAtlJ)B%g]6aB/c^b.>Q?B]o.GmS-g]7)X!2!&Z -s)9U(!/^`4!7h.B[fG$P!%onKGlYPXGlZH8!&!'O!/XM:r;Ri=fDkm9:B9#;>QE$L!-tdKX8 at 2B -WrRa_!-%Me!/^UCrr>oIs+13trrI2hmf*NSM1WUF!3f7L~> -JcC<$qYpT:II-t6o)AXhp\b'kqu-Npp\t0mqu6U)Oja9t>`mJ7mTfelo(W.`!;H3e"oDp&s3d&, -s8Vrrmf*4dqt9sm_PR;0B(Gct"nM]nOi[:?rrHogJcGHD!O%gUrrDWhrrDfkrrDfkrrDfmrt5/. -s8-F!s3d$ldf8`?s8VZarr2uqpAY -JcC<$qYpT:II7%8qsOI`!;l]o!;HHls82ir!;l`p%;,22dZJ/4s3d&,s6fd`rrDrirrq\,s8SJ2 -qYpTjmf*4dp\"OhM:_du:\k"pqssde61XcnrrHogJcGHD!O%gVrrN#brr2uqr;QckrVuops8N)r -rr3SqE<#s*c"?PHdZOG,med%aqt9sml>Ze'R*GL-!Vc$]rrDfdrre21s7/t]s8Vfrs7\hZpWNR: -;1\aus3^iIF40IU#5duks7cQnJ,~> -JcC<$qYpT:II7%;qssdeqtpBnp\k*lp\t0mp\t1%ja$n+R(.GAs-V(2qsOI`!;lHh"hgu:qe#Eq -rrM]brr2ump&>/6o)Ht%q>UZnqu?4lqtnS:!GgA>s7ZHnYEnSU"T.cis82]n!;HHl!;HKm!;HKm% -DAhBqe"N,s8SJ2s826`rrDfdrrp*:s8-F!qYpTep\t0mqt9slE:X%RR/-aco)Ja7Oo*<$!)\=IJ -cF-t!HZ]Vs8VinrrVrps*t~> -JcC<$qYpT:IFS9'JhD=\dXj)sB%$,I"oCS]JoL;Errfe2H#ThXrr`.'>kcGA!GgA>s7ZHnYEm`= -$N!+bJoL:4/pV'Wmf*If5u3)Oo'$)V[fC\mX7lPpl2[I!rr>oIs+13trrI2hk5Tr~> -JcC<$qYpT:IFS9'/l.(2nh*^iB(GBi"Q]VqH%P5Z"G/7OB%QbV!pTcXb5VKXfn'1srrK -JcC<$qYpT:IF\?(huIA7M;SAGH&:qg"LeAVE3\U+"@5h8E:W`&!ltA_b5VKXfn'1srrKoIs+13trrI2hk5Tr~> -JcC<$qYpT:E7<\Fd*2LH!RT'UhZ:sJjkg-gbh2UG"5(]9fZW.Q at G-53pAY/sK[\fZbg?@H!RT'U -hZ:sJjkg-gbh2UG"4595gWSIS97d+os3^iIDn"ldJ,~> -JcC<$qYpT:E7<_Ebl6N"bj4-fgW\..hZ;*Jo\T_sbeqT\!FaZ4s7ZHnYCtE_!o(rJrnmb"le_cu -bgY\2!RT'_hZCmCaNEB?97d+os3^iIDn"ldJ,~> -JcC<$qYpT:E7EbMgW\.(hqQB(le_cmbhM7:!R/p_hZCmCaNEB@@G-53pAY/sK[elae'-S(hqQB( -le_cmbhM7:!R/p_huCatd)t5G97d+os3^iIDn"ldJ,~> -JcC<$qYpT:6,mL:3lYb32TB>051tMepAY/s6H<[==@'r=!'/&2!&]?-JcF-t!F\siAq0~> -JcC<$qYpT:6,mL:3lYb32TB>051tMepAY/s6H<[==@'r=!'/&2!&]?-JcF-t!F\siAq0~> -JcC<$qYpT:6,mL:3lYb32TB>051tMepAY/s6H<[==@'r=!'/&2!&]?-JcF-t!F\siAq0~> -JcC<$qYpT:IE)9e?,lmE9?-u4CY=:=pAY/sQH0"+c$.2-!*I8@!)\=IJcF-t!HZ]Os*t~> -JcC<$qYpT:IE)9e?,lmE9?-u4CY=:=pAY/sQH0"+c$.2-!*I8@!)\=IJcF-t!HZ]Os*t~> -JcC<$qYpT:IE)9e?,lmE9?-u4CY=:=pAY/sQH0"+c$.2-!*I8@!)\=IJcF-t!HZ]Os*t~> -JcC<$qYpT:IE)9e?,lmE9?-u4CY=:=pAY/sQH0"+c$.2-!*I8@!)\=IJcF-t!HZ]Os*t~> -JcC<$qYpT:IE)9e?,lmE9?-u4CY=:=pAY/sQH0"+c$.2-!*I8@!)\=IJcF-t!HZ]Os*t~> -JcC<$qYpT:IE)9e?,lmE9?-u4CY=:=pAY/sQH0"+c$.2-!*I8@!)\=IJcF-t!HZ]Os*t~> -JcC<$qYpT:IE)9e?,lmE9?-u4CY=:=pAY/sQH0"+c$.2-!*I8@!)\=IJcF-t!HZ]Os*t~> -JcC<$qYpT:IE)9e?,lmE9?-u4CY=:=pAY/sQH0"+c$.2-!*I8@!)\=IJcF-t!HZ]Os*t~> -JcC<$qYpT:IE)9e?,lmE9?-u4CY=:=pAY/sQH0"+c$.2-!*I8@!)\=IJcF-t!HZ]Os*t~> -JcC<$qYpT:IE)9e?,lmE9?-u4CY=:=pAY/sQH0"+c$.2-!*I8@!)\=IJcF-t!HZ]Os*t~> -JcC<$qYpT:IE)9e?,lmE9?-u4CY=:=pAY/sQH0"+c$.2-!*I8@!)\=IJcF-t!HZ]Os*t~> -JcC<$qYpT:IE)9e?,lmE9?-u4CY=:=pAY/sQH0"+c$.2-!*I8@!)\=IJcF-t!HZ]Os*t~> -JcC<$qYpT:IE)9e?,lmE9?-u4CY=:=pAY/sQH0"+c$.2-!*I8@!)\=IJcF-t!HZ]Os*t~> -JcC<$qYpT:IE)9e?,lmE9?-u4CY=:=pAY/sQH0"+c$.2-!*I8@!)\=IJcF-t!HZ]Os*t~> -JcC<$qYpT:IE)9e?,lmE9?-u4CY=:=pAY/sQH0"+c$.2-!*I8@!)\=IJcF-t!HZ]Os*t~> -JcC<$qYpT at I)c0d?,lmE9?-u4C>XUBpAY0$PfNe)c$.2-!*I8@!)S7HJcF-t!I)oQs*t~> -JcC<$qYpT at I)c0d?,lmE9?-u4C>XUBpAY0$PfNe)c$.2-!*I8@!)S7HJcF-t!I)oQs*t~> -JcC<$qYpT at I)c0d?,lmE9?-u4C>XUBpAY0$PfNe)c$.2-!*I8@!)S7HJcF-t!I)oQs*t~> -JcC<$qYpTS@`JEJ?,lmE9?-u4;"B2;pAY06HcQ-ec$.2-!*I;A!Uis -JcC<$qYpTS@`JEJ?,lmE9?-u4;"B2;pAY06HcQ-ec$.2-!*I;A!Uis -JcC<$qYpTS@`JEJ?,lmE9?-u4;"B2;pAY06HcQ-ec$.2-!*I;A!Uis -JcC<$q>UJ#h8fNq?,lmE9?7&5b&;k2p&>*f:\)U,!R5i.rr?0ArrK?\JcC<$dJj6bG38gT~> -JcC<$q>UJ#h8fNq?,lmE9?7&5b&;k2p&>*f:\)U,!R5i.rr?0ArrK?\JcC<$dJj6bG38gT~> -JcC<$q>UJ#h8fNq?,lmE9?7&5b&;k2p&>*f:\)U,!R5i.rr?0ArrK?\JcC<$dJj6bG38gT~> -JcC<$q>UJfOiRJ%?,lmE9?7&5J$OY*o`"rHX2t;Ac$.2-!*I>B!rZcUJcC<$dJj:B -JcC<$q>UJfOiRJ%?,lmE9?7&5J$OY*o`"rHX2t;Ac$.2-!*I>B!rZcUJcC<$dJj:B -JcC<$q>UJfOiRJ%?,lmE9?7&5J$OY*o`"rHX2t;Ac$.2-!*I>B!rZcUJcC<$dJj:B -JcC<$q>UNg=ObFl!+!VE!)(E5!lngIJcGBB!p3JGao;CdGK0X_=NLLDY'L"ts+13srrKBFkPp&~> -JcC<$q>UNg=ObFl!+!VE!)(E5!lngIJcGBB!p3JGao;CdGK0X_=NLLDY'L"ts+13srrKBFkPp&~> -JcC<$q>UNg=ObFl!+!VE!)(E5!lngIJcGBB!p3JGao;CdGK0X_=NLLDY'L"ts+13srrKBFkPp&~> -JcC<$q#:E@!9)'"!+!VE!)(H6!n:0(JcG<@!k/0ub5VLeGK0X_=NURE]NFKNs+13rrrW1DGj,0X~> -JcC<$q#:E@!9)'"!+!VE!)(H6!n:0(JcG<@!k/0ub5VLeGK0X_=NURE]NFKNs+13rrrW1DGj,0X~> -JcC<$q#:E@!9)'"!+!VE!)(H6!n:0(JcG<@!k/0ub5VLeGK0X_=NURE]NFKNs+13rrrW1DGj,0X~> -JcC<$p\t<>;VB4m!+!VE!)(K7!lP)oJcG6>!j>eibPqUfGK0X_=N^XFW!_d?s+13orrQtgpZhd/~> -JcC<$p\t<>;VB4m!+!VE!)(K7!lP)oJcG6>!j>eibPqUfGK0X_=N^XFW!_d?s+13orrQtgpZhd/~> -JcC<$p\t<>;VB4m!+!VE!)(K7!lP)oJcG6>!j>eibPqUfGK0X_=N^XFW!_d?s+13orrQtgpZhd/~> -JcC<$pAY6>=Hh[err??Err>^9rr^u2?J9u1mf*C# -JcC<$pAY6>=Hh[err??Err>^9rr^u2?J9u1mf*C# -JcC<$pAY6>=Hh[err??Err>^9rr^u2?J9u1mf*C# -JcC<$p&>0dS6BNTc at GsY`dn+Jc at H+K@:5u,JcG*:"7D7MCX.J3Ce2Qs!'AMX"bV5-C:3nhs+13k -rrgr";K[Z\JUd~> -JcC<$p&>0dS6BNTc at GsY`dn+Jc at H+K@:5u,JcG*:"7D7MCX.J3Ce2Qs!'AMX"bV5-C:3nhs+13k -rrgr";K[Z\JUd~> -JcC<$p&>0dS6BNTc at GsY`dn+Jc at H+K@:5u,JcG*:"7D7MCX.J3Ce2Qs!'AMX"bV5-C:3nhs+13k -rrgr";K[Z\JUd~> -JcC<$o)AaHaFV7c_Z at m;JcFp5!r^flJ]$B_!lW7EJcC<$_uBf0d)>@iJ,~> -JcC<$o)AaHaFV7c_Z at m;JcFp5!r^flJ]$B_!lW7EJcC<$_uBf0d)>@iJ,~> -JcC<$o)AaHaFV7c_Z at m;JcFp5!r^flJ]$B_!lW7EJcC<$_uBf0d)>@iJ,~> -JcC<$JcC<$JcC<$JcC<$[Jta~> -JcC<$JcC<$JcC<$JcC<$[Jta~> -JcC<$JcC<$JcC<$JcC<$[Jta~> -JcC<$JcC<$JcC<$JcC<$[Jta~> -JcC<$JcC<$JcC<$JcC<$[Jta~> -JcC<$JcC<$JcC<$JcC<$[Jta~> -JcC<$JcC<$JcC<$JcC<$[Jta~> -JcC<$JcC<$JcC<$JcC<$[Jta~> -JcC<$JcC<$JcC<$JcC<$[Jta~> -JcC<$JcC<$JcC<$JcC<$[Jta~> -JcC<$JcC<$JcC<$JcC<$[Jta~> -JcC<$JcC<$JcC<$JcC<$[Jta~> -JcC<$JcC<$JcC<$JcC<$[Jta~> -JcC<$JcC<$JcC<$JcC<$[Jta~> -JcC<$JcC<$JcC<$JcC<$[Jta~> -JcC<$JcC<$JcC<$JcC<$[Jta~> -JcC<$JcC<$JcC<$JcC<$[Jta~> -JcC<$JcC<$JcC<$JcC<$[Jta~> -JcC<$JcC<$JcC<$JcC<$[Jta~> -JcC<$JcC<$JcC<$JcC<$[Jta~> -JcC<$JcC<$JcC<$JcC<$[Jta~> -JcC<$JcC<$JcC<$JcC<$[Jta~> -JcC<$JcC<$JcC<$JcC<$[Jta~> -JcC<$JcC<$JcC<$JcC<$[Jta~> -JcC<$JcC<$JcC<$JcC<$[Jta~> -JcC<$JcC<$JcC<$JcC<$[Jta~> -JcC<$JcC<$JcC<$JcC<$[Jta~> -JcC<$JcC<$JcC<$JcC<$[Jta~> -JcC<$JcC<$JcC<$JcC<$[Jta~> -JcC<$JcC<$JcC<$JcC<$[Jta~> -JcC<$JcC<$JcC<$JcC<$[Jta~> -JcC<$JcC<$JcC<$JcC<$[Jta~> -JcC<$JcC<$JcC<$JcC<$[Jta~> -JcC<$JcC<$JcC<$JcC<$[Jta~> -JcC<$JcC<$JcC<$JcC<$[Jta~> -JcC<$JcC<$JcC<$JcC<$[Jta~> -JcC<$JcC<$JcC<$JcC<$[Jta~> -JcC<$JcC<$JcC<$JcC<$[Jta~> -JcC<$JcC<$JcC<$JcC<$[Jta~> -JcC<$JcC<$JcC<$JcC<$[Jta~> -JcC<$JcC<$JcC<$JcC<$[Jta~> -JcC<$JcC<$JcC<$JcC<$[Jta~> -JcC<$JcC<$JcC<$JcC<$[Jta~> -JcC<$JcC<$JcC<$JcC<$[Jta~> -JcC<$JcC<$JcC<$JcC<$[Jta~> -JcC<$JcC<$JcC<$JcC<$[Jta~> -JcC<$JcC<$JcC<$JcC<$[Jta~> -JcC<$JcC<$JcC<$JcC<$[Jta~> -JcC<$JcC<$JcC<$JcC<$[Jta~> -JcC<$JcC<$JcC<$JcC<$[Jta~> -JcC<$JcC<$JcC<$JcC<$[Jta~> -JcC<$JcC<$JcC<$JcC<$[Jta~> -JcC<$JcC<$JcC<$JcC<$[Jta~> -JcC<$JcC<$JcC<$JcC<$[Jta~> -JcC<$JcC<$JcC<$JcC<$[Jta~> -JcC<$JcC<$JcC<$JcC<$[Jta~> -JcC<$JcC<$JcC<$JcC<$[Jta~> -JcC<$JcC<$JcC<$JcC<$[Jta~> -JcC<$JcC<$JcC<$JcC<$[Jta~> -JcC<$JcC<$JcC<$JcC<$[Jta~> -JcC<$JcC<$JcC<$JcC<$[Jta~> -JcC<$JcC<$JcC<$JcC<$[Jta~> -JcC<$JcC<$JcC<$JcC<$[Jta~> -JcC<$JcC<$JcC<$JcC<$[Jta~> -JcC<$JcC<$JcC<$JcC<$[Jta~> -JcC<$JcC<$JcC<$JcC<$[Jta~> -JcC<$JcC<$JcC<$JcC<$[Jta~> -JcC<$JcC<$JcC<$JcC<$[Jta~> -JcC<$JcC<$JcC<$JcC<$[Jta~> -JcC<$JcC<$JcC<$JcC<$[Jta~> -JcC<$JcC<$JcC<$JcC<$[Jta~> -JcC<$JcC<$JcC<$JcC<$[Jta~> -JcC<$JcC<$JcC<$JcC<$[Jta~> -JcC<$JcC<$JcC<$JcC<$[Jta~> -JcC<$JcC<$JcC<$JcC<$[Jta~> -JcC<$JcC<$JcC<$JcC<$[Jta~> -JcC<$JcC<$JcC<$JcC<$[Jta~> -JcC<$JcC<$JcC<$JcC<$[Jta~> -JcC<$JcC<$JcC<$JcC<$[Jta~> -JcC<$JcC<$JcC<$JcC<$[Jta~> -JcC<$JcC<$JcC<$JcC<$[Jta~> -JcC<$JcC<$JcC<$JcC<$[Jta~> -JcC<$JcC<$JcC<$JcC<$[Jta~> -JcC<$JcC<$JcC<$JcC<$[Jta~> -JcC<$JcC<$JcC<$JcC<$[Jta~> -JcC<$JcC<$JcC<$JcC<$[Jta~> -JcC<$JcC<$JcC<$JcC<$[Jta~> -JcC<$JcC<$JcC<$JcC<$[Jta~> -JcC<$JcC<$JcC<$JcC<$[Jta~> -JcC<$JcC<$JcC<$JcC<$[Jta~> -JcC<$JcC<$JcC<$JcC<$[Jta~> -JcC<$JcC<$JcC<$JcC<$[Jta~> -JcC<$JcC<$JcC<$JcC<$[Jta~> -JcC<$JcC<$JcC<$JcC<$[Jta~> -JcC<$JcC<$JcC<$JcC<$[Jta~> -JcC<$JcC<$JcC<$JcC<$[Jta~> -JcC<$JcC<$JcC<$JcC<$[Jta~> -JcC<$JcC<$JcC<$JcC<$[Jta~> -JcC<$JcC<$JcC<$JcC<$[Jta~> -JcC<$JcC<$JcC<$JcC<$[Jta~> -JcC<$JcC<$JcC<$JcC<$[Jta~> -JcC<$JcC<$JcC<$JcC<$[Jta~> -JcC<$JcC<$JcC<$JcC<$[Jta~> -JcC<$JcC<$JcC<$JcC<$[Jta~> -JcC<$JcC<$JcC<$JcC<$[Jta~> -JcC<$JcC<$JcC<$JcC<$[Jta~> -JcC<$JcC<$JcC<$JcC<$[Jta~> -JcC<$JcC<$JcC<$JcC<$[Jta~> -JcC<$JcC<$JcC<$JcC<$[Jta~> -JcC<$JcC<$JcC<$JcC<$[Jta~> -JcC<$JcC<$JcC<$JcC<$[Jta~> -JcC<$JcC<$JcC<$JcC<$[Jta~> -JcC<$JcC<$JcC<$JcC<$[Jta~> -JcC<$JcC<$JcC<$JcC<$[Jta~> -JcC<$JcC<$JcC<$JcC<$[Jta~> -JcC<$JcC<$JcC<$JcC<$[Jta~> -JcC<$JcC<$JcC<$JcC<$[Jta~> -JcC<$JcC<$JcC<$JcC<$[Jta~> -JcC<$JcC<$JcC<$JcC<$[Jta~> -JcC<$JcC<$JcC<$JcC<$[Jta~> -JcC<$JcC<$JcC<$JcC<$[Jta~> -JcC<$JcC<$JcC<$JcC<$[Jta~> -JcC<$JcC<$JcC<$JcC<$[Jta~> -JcC<$JcC<$JcC<$JcC<$[Jta~> -JcC<$JcC<$JcC<$JcC<$[Jta~> -JcC<$JcC<$JcC<$JcC<$[Jta~> -JcC<$JcC<$JcC<$JcC<$[Jta~> -JcC<$JcC<$JcC<$JcC<$[Jta~> -JcC<$JcC<$JcC<$JcC<$[Jta~> -JcC<$JcC<$JcC<$JcC<$[Jta~> -JcC<$JcC<$JcC<$JcC<$[Jta~> -JcC<$JcC<$JcC<$JcC<$[Jta~> -JcC<$JcC<$JcC<$JcC<$[Jta~> -JcC<$JcC<$JcC<$JcC<$[Jta~> -JcC<$JcC<$JcC<$JcC<$[Jta~> -JcC<$JcC<$JcC<$JcC<$[Jta~> -JcC<$JcC<$JcC<$JcC<$[Jta~> -JcC<$JcC<$JcC<$JcC<$[Jta~> -JcC<$JcC<$JcC<$JcC<$[Jta~> -JcC<$JcC<$JcC<$JcC<$[Jta~> -JcC<$JcC<$JcC<$JcC<$[Jta~> -JcC<$JcC<$JcC<$JcC<$[Jta~> -JcC<$JcC<$JcC<$JcC<$[Jta~> -JcC<$JcC<$JcC<$JcC<$[Jta~> -JcC<$JcC<$JcC<$JcC<$[Jta~> -JcC<$JcC<$JcC<$JcC<$[Jta~> -JcC<$JcC<$JcC<$JcC<$[Jta~> -JcC<$JcC<$JcC<$JcC<$[Jta~> -JcC<$JcC<$JcC<$JcC<$[Jta~> -JcC<$JcC<$JcC<$JcC<$[Jta~> -JcC<$JcC<$JcC<$JcC<$[Jta~> -JcC<$JcC<$JcC<$JcC<$[Jta~> -JcC<$JcC<$JcC<$JcC<$[Jta~> -JcC<$JcC<$JcC<$JcC<$[Jta~> -JcC<$JcC<$JcC<$JcC<$[Jta~> -JcC<$JcC<$JcC<$JcC<$[Jta~> -JcC<$JcC<$JcC<$JcC<$[Jta~> -JcC<$JcC<$JcC<$JcC<$[Jta~> -JcC<$JcC<$JcC<$JcC<$[Jta~> -JcC<$JcC<$JcC<$JcC<$[Jta~> -JcC<$JcC<$JcC<$JcC<$[Jta~> -JcC<$JcC<$JcC<$JcC<$[Jta~> -JcC<$JcC<$JcC<$JcC<$[Jta~> -JcC<$JcC<$JcC<$JcC<$[Jta~> -JcC<$JcC<$JcC<$JcC<$[Jta~> -JcC<$JcC<$JcC<$JcC<$[Jta~> -JcC<$JcC<$JcC<$JcC<$[Jta~> -JcC<$JcC<$JcC<$JcC<$[Jta~> -JcC<$JcC<$JcC<$JcC<$[Jta~> -JcC<$JcC<$JcC<$JcC<$[Jta~> -JcC<$JcC<$JcC<$JcC<$[Jta~> -JcC<$JcC<$JcC<$JcC<$[Jta~> -JcC<$JcC<$JcC<$JcC<$[Jta~> -JcC<$JcC<$JcC<$JcC<$[Jta~> -JcC<$JcC<$JcC<$JcC<$[Jta~> -JcC<$JcC<$JcC<$JcC<$[Jta~> -JcC<$JcC<$JcC<$JcC<$[Jta~> +JcF$q"0DP'-\;;Ks0hrX~> +JcF$q"0DP'-\;;Ks0hrX~> +JcF$q"0DP'-\;;Ks0hrX~> +JcF$q"5j.ZFFjICs0hrX~> +JcF$q"5j.ZFFjICs0hrX~> +JcF$q"5j.ZFFjICs0hrX~> +JcF!p!YbXNJcC<$[f:j~> +JcF!p!YbXNJcC<$[f:j~> +JcF!p!YbXNJcC<$[f:j~> +JcF!p!_3k#JcC<$[f:j~> +JcF!p!_3k#JcC<$[f:j~> +JcF!p!_3k#JcC<$[f:j~> +JcF!p!I at q#s+13Xs*t~> +JcF!p!I at q#s+13Xs*t~> +JcF!p!I at q#s+13Xs*t~> +JcF!p!Ni8Ns+13Xs*t~> +JcF!p!Ni8Ns+13Xs*t~> +JcF!p!Ni8Ns+13Xs*t~> +U&P5kb*[shJcTq +U&P5kb*[shJcTq +U&P5kb*[shJcTq +U]1Ms[o[LK_1BJ\_?IlkRTF[dJcCZ.J,~> +U]1Ms[o[LK_1BJ\_?IlkRTF[dJcCZ.J,~> +U]1Ms[o[LK_1BJ\_?IlkRTF[dJcCZ.J,~> +V#LPrHu\+rs4RDSrj>h:JcC]/J,~> +V#LPrHu\+rs4RDSrj>h:JcC]/J,~> +V#LPrHu\+rs4RDSrj>h:JcC]/J,~> +V>gVn;*BL1ec,^;:UboTNW4M~> +V>gVn;*BL1ec,^;:UboTNW4M~> +V>gVn;*BL1ec,^;:UboTNW4M~> +V>gRJL at bHFqZ-BFrrVK_qtg +V>gRJL at bEHp\XjCrr`/`s82Zm!VcK[rrVW_qt^6lmcFHMp\Xj:rrVO=a+=8Ns*t~> +V>gRJL at bHFpY5`Jnc8R_rrDWXrrVK_qtg +VZ-_A?i9Nq!g0NLh>[WP6&ABhqYpT*H1:h:Ytp2VlMLS_qZ-'Yrrp(9AoL&fpAY2VX$QX_%BBJ\ +s02QLmS +VZ-_A?i9Nq!^X):h>[W5/s-.NqYpS._XRU*Gl_k:qYpTS!;?ErT)aIJ>k7Ug!^X):qu7(M!3uQ\ +!2\*D:X)Z8rr38u!("jq6%U_unc&[=>P`pNO8j_~> +VZ-_A?i9Qr"7f]K_VP4pX'CJ]lMCM]!:KCW"S,?F:PnrJ!MtYIrrqh9!.mM!pAY6c>_9ijrse6h +!8$dH!6qPEH,K].rr38P!.qc^AoL&knc&[=>P`pNO8j_~> +VZ-[5bOYZ7OhHAErrL!XoD\iYme$MablIeD>lU2ZlMh&@c2Y8djd>N:"@:<4OY6A-!g10Jqu7Q2 +!;HNn6-]GS0)sN'K)bl/!/^a-0)tJBaRT92LTuF1O8j_~> +VZ-[5bOYZ7>eR39rrJ8QoD\f9oDeiI"TRS/s*qu7Pc +!<<)r!;leQOoLdK^&S,/!6G2-OoNZ+o'u_\LTuF1O8j_~> +VZ-[5bOb`9mXgSZrVloqK(K!Cje)/E"p!*OZ,5UplMh+10)tr`s,la=rrph:s7-07p\t?`Js#!g +rtq,cs8U>0s8O_"s$6YHs8P at bmf,T$s+rAtrrIn[JcCf2J,~> +VuHh^=8h^iFMct4s07\^mJpM&Ar-Lmd`jE8pN_@&g]2Wos8VA'E+Zf\H%K:gg]2s'pY5aoct8+7 +Oe:`2:G/%7l>U]S]si:eE3]FT!6tQ7E%\hkGqP at em\Kng0'`J/Jm +VuHh^=8h^i)5Z-0s+6kJhuJ&-AnG@%pR#4ci,E:qYlL0js&[9e>]AWdAoM at qWrT4#o!&1^[q95d +B$JCL>QDkFaE_$0i,HC,!9!_S:[7uS!*n&nOT;(eqfsei>lX\HJm=];!;lcrV>o/!:WU"MGlXoF +V;0/lE4u8N):ANbs7ZNas,i0 +VuHh^=8haj)Z."WlLK4WT;qsZR"?r;E;O7Ds1O"MaD`cFrr6&lJm +VuHe4M!b3W!8$#sOi[D"Z/q+bqZ-2=aT$5M:\Xkg;3Ars!;FQ[s";q'bl at aqs%iCd!3tY&K)[I. +mOnO%aSPu3lIZ'klMpm9!."UmM>tEmjmGG&blIcq_X]>ZJtN'=5lblls(7Y'!:Bj3qZ,(CrrME: +rr3i+!+p1h!6G2b0)s#0:Qb4)V2>6#!)EU3nG`Oc9nE>*s*t~> +VuHe4M!k9Xnc8R(s$?DE!8$m +_Lhe?qoDS5fBWCWqu>qI!3?-^c2WB7jlS2qM.Zbfo$)I[!8$rF>QCDnrrBof!9sRYg]7*IrrLa: +rr3h`!,umh!:p/PM>r^r!7J`t:X/p,!'r6mnG`Oc9nE>*s*t~> +VuHe4M!k9X_HcuZnk];!!9NKAs,iH/:]J;4c&r#*;=[$QJu/K5qoE%Bqgnfns36]+]`@0b612eo +s*;]V62uP5s3:H8c2[gg!!(XN:\+B8Z/rZUs":eG62uedpAjd/!)EU3s53n%/r@&5s/SrnrrLCA +rr3h&/oYc*:]LG\c2WXA!;D>u!:Kk_5lc2unG`Oc9nE>*s*t~> +VuHe%R-jnbblDAUOi%,aaT%CDpAjbMmf*4e:[\5^+f/H!63#O:jY#uhs8.'ApJ:5W6-0)NK)\-] +pHehU>hhXBs!dj>s31P?c%>uD0)trIm`dBaOi$hmdWrq66-X at Rs8PC5i9pV@o)DM&q#;3%!;HNn +6-0)S0)s#6blD_ER#1jf6.Z+bn,EAdJcCf2J,~> +VuHe%R-jnaT)bM`61XaMp]!PRdK&hc"ods.ruY63$BQl7Q?40)tYGp]$)kpAjs4 +K)])P[u("^.J!N=V#];-aT%BZs7.fBObs*(o%X61!:ojajT(qQnc7e5o(#*HqZ-3^rts!5s8Vrr +o)Fi/s,m&4:M0VZc2WonYlO@`rr>uKs,[21~> +VuHe%R-jna>QE%::]J[*s6`\_OcdM4rr3#?M>mN!pAiWec2V%FZ'"qXs31PEaGKrA63$s\m`e&t +M9,DkdWs+7s![=8qfr29:[\6Kc2YkIs$=p(:]I8'f2)Fk:XT6ks2]0 at jnHiYs48mts8S5]rtEgH +s8PC0s*=W1H&;7qo)D##E+\P +VuHe$QL4]e^&LC8Oi%,ac2WX0pAjbhOoN,M614d at pY9#equ?CVZ0M at Gh#HdBnj2^D6-]GXK)\-] +s$?\?>eU%7pZheDo'UJss*9aOK)aFTs8PmcdOtQ^aT$4UfDkk:df0 +VuHe$QL=cfmaCM'nh0M1!;HLGm`bb/!6G2-lRr5;jo;0/_Z0Yk:UgB(:]LI.0(LXpqZ-BjOi[D" +qpL?$V1QSas6B1Ti;^Zps8N)IM9,^aOoP;2s-SZC6217/Z0MAd!<:sW^%VN^s-Vq$s7ZNkrrMEU +rr3he!<<)r!;leQOoLR7mJs*`0#IXUOoK"nn,EAbJcCf2J,~> +VuHe$QL=cfddk7-mSEl263$@*s+uln!:'*1:]K$O\,63R63!tcjjF/'s,kBSs2]K`rrM'T +rr3h&OoPI+63$s;df4Um]`?jb!:'SMdf0<(n,EAbJcCf2J,~> +VuHe$QL4]d:Si$lWrSalM>t6hAhLdK!!&DdE%^'RR&'d80&54^5leC-!2!&Zs)9U(!/^`4!87FF +]`?Z\!%onZX$QbjTDpNhOY6(W!0N*%Z-Di8!5j'^\,V$[ddd>;;1\b.s*t~> +VuHe$QL=cfnc5q,s(28)!4Vu[!,sRPYlFdFqZ'mu!7FXC/l25 +VuHe$QL=cfaBY@)pAeHP!8RH;6"XBrJcIFgg]3Jl!:Bh>!/^_\!%qOJ/pWRFmb at f)M#c>_!2#VY +f2%"q!%n8.rrC[+!;Er&T22*ZE%\g(M>rD4ec;>O!8!hC/hYCo!58DX!7u/i0&4\OM,3F7ruV6m +s8V@[!8$dH!6qPEH*@:Lqg&4B!.qc^E:VoeM>QiC!)\=IO8j_~> +VuHe$QL+VOo)AXhp\b$kp\b$kp\t1)qu?]nB(GuMOce)lmTfelo(W.`!;lKi"oDp&s3d&,s8Vrr +mf*4dp\"Oi_PR;0B(Gfu#5duks%i(WbPqQ>JcCf2J,~> +VuHe$QL4\QqsOI`!;l]o!;HHls82ir!;lcq&aF?8s-V&Co)I.#qu?*]s8Vuhrrq\,s8SJ2qYpTj +mf*4dp\"OhM:_du:\k%jpB:Nj63$]&rr>oIs,[21~> +VuHe$QL4\TqssdeqtpBnp\k*lp\t0mp\t1%]rV21B%_J0s-V(2qsOI`!;H0d"hgu:qe#EqrrM]b +rr2uqp&>/6o)Ht%q>UWhs8U?+qo\p=;1\b.s*t~> +VuHe$QIZ!Bqa"#0E:ST5H"PLmrrr9c:P*QVkl1dp!-rOapAY3Z!2%F6!)\=IO8j_~> +VuHe$QIZ!BjT&n +VuHe$QIZ!A[fC\mZ/>UoH&:qg"LeAVE3\U+"@5h8E:W`&!giuLb5VH=JcCf2J,~> +VuHe$K[\fZbg?@H!RT'UhZ:sJjkg-gbh2UG"4595gWSIS97d,(s*t~> +VuHe$K[el\gW\.GhuCpdhZDQVe)fHfd*2.>!m&U,b231lJcCf2J,~> +VuHe$K[elae'-S(hqQB(le_cmbhM7:!R/p_huCatd)t5G97d,(s*t~> +VuHe$6H<[==@'r=!'/&2!&]?-O8j_~> +VuHe$6H<[==@'r=!'/&2!&]?-O8j_~> +VuHe$6H<[==@'r=!'/&2!&]?-O8j_~> +VuHe$QH0"+c$.2-!*I8@!)\=IO8j_~> +VuHe$QH0"+c$.2-!*I8@!)\=IO8j_~> +VuHe$QH0"+c$.2-!*I8@!)\=IO8j_~> +VuHe$QH0"+c$.2-!*I8@!)\=IO8j_~> +VuHe$QH0"+c$.2-!*I8@!)\=IO8j_~> +VuHe$QH0"+c$.2-!*I8@!)\=IO8j_~> +VuHe$QH0"+c$.2-!*I8@!)\=IO8j_~> +VuHe$QH0"+c$.2-!*I8@!)\=IO8j_~> +VuHe$QH0"+c$.2-!*I8@!)\=IO8j_~> +VuHe$QH0"+c$.2-!*I8@!)\=IO8j_~> +VuHe$QH0"+c$.2-!*I8@!)\=IO8j_~> +VuHe$QH0"+c$.2-!*I8@!)\=IO8j_~> +VuHe$QH0"+c$.2-!*I8@!)\=IO8j_~> +VuHe$QH0"+c$.2-!*I8@!)\=IO8j_~> +VuHe$QH0"+c$.2-!*I8@!)\=IO8j_~> +VuHe*PfNe)c$.2-!*I8@!)S7HO8j_~> +VuHe*PfNe)c$.2-!*I8@!)S7HO8j_~> +VuHe*PfNe)c$.2-!*I8@!)S7HO8j_~> +VuHe +VuHe +VuHe +VuHhm:\)U,!R5i.rr?0ArrK?\JcCf2J,~> +VuHhm:\)U,!R5i.rr?0ArrK?\JcCf2J,~> +VuHhm:\)U,!R5i.rr?0ArrK?\JcCf2J,~> +VZ-[OX2t;Ac$.2-!*I>B!rZcUJcCf2J,~> +VZ-[OX2t;Ac$.2-!*I>B!rZcUJcCf2J,~> +VZ-[OX2t;Ac$.2-!*I>B!rZcUJcCf2J,~> +VZ-_[<9VI(!R5i.rr?0BrrT?Krdk*1s*t~> +VZ-_[<9VI(!R5i.rr?0BrrT?Krdk*1s*t~> +VZ-_[<9VI(!R5i.rr?0BrrT?Krdk*1s*t~> +V>gV+!:S)1!R5i.rr?0CrrTi8l[f(rs*t~> +V>gV+!:S)1!R5i.rr?0CrrTi8l[f(rs*t~> +V>gV+!:S)1!R5i.rr?0CrrTi8l[f(rs*t~> +V#LM">3=$.!R5i.rr?0DrrT,+l%/kos*t~> +V#LM">3=$.!R5i.rr?0DrrT,+l%/kos*t~> +V#LM">3=$.!R5i.rr?0DrrT,+l%/kos*t~> +U]1G- +U]1G- +U]1G- +UAk>`OAp#@JH9RX`dn+Oc[c7PI9UHoqLS[)s*t~> +UAk>`OAp#@JH9RX`dn+Oc[c7PI9UHoqLS[)s*t~> +UAk>`OAp#@JH9RX`dn+Oc[c7PI9UHoqLS[)s*t~> +T`5)lfuAT\hnoN6b3+?UM#Vu~> +T`5)lfuAT\hnoN6b3+?UM#Vu~> +T`5)lfuAT\hnoN6b3+?UM#Vu~> +JcC<$JcC<$s8RT~> +JcC<$JcC<$s8RT~> +JcC<$JcC<$s8RT~> +JcC<$JcC<$s8RT~> +JcC<$JcC<$s8RT~> +JcC<$JcC<$s8RT~> +JcC<$JcC<$s8RT~> +JcC<$JcC<$s8RT~> +JcC<$JcC<$s8RT~> +JcC<$JcC<$s8RT~> +JcC<$JcC<$s8RT~> +JcC<$JcC<$s8RT~> +JcC<$JcC<$s8RT~> +JcC<$JcC<$s8RT~> +JcC<$JcC<$s8RT~> +JcC<$JcC<$s8RT~> +JcC<$JcC<$s8RT~> +JcC<$JcC<$s8RT~> +JcC<$JcC<$s8RT~> +JcC<$JcC<$s8RT~> +JcC<$JcC<$s8RT~> +JcC<$JcC<$s8RT~> +JcC<$JcC<$s8RT~> +JcC<$JcC<$s8RT~> +JcC<$JcC<$s8RT~> +JcC<$JcC<$s8RT~> +JcC<$JcC<$s8RT~> +JcC<$JcC<$s8RT~> +JcC<$JcC<$s8RT~> +JcC<$JcC<$s8RT~> +JcC<$JcC<$s8RT~> +JcC<$JcC<$s8RT~> +JcC<$JcC<$s8RT~> +JcC<$JcC<$s8RT~> +JcC<$JcC<$s8RT~> +JcC<$JcC<$s8RT~> +JcC<$JcC<$s8RT~> +JcC<$JcC<$s8RT~> +JcC<$JcC<$s8RT~> +JcC<$JcC<$s8RT~> +JcC<$JcC<$s8RT~> +JcC<$JcC<$s8RT~> +JcC<$JcC<$s8RT~> +JcC<$JcC<$s8RT~> +JcC<$JcC<$s8RT~> +JcC<$JcC<$s8RT~> +JcC<$JcC<$s8RT~> +JcC<$JcC<$s8RT~> +JcC<$JcC<$s8RT~> +JcC<$JcC<$s8RT~> +JcC<$JcC<$s8RT~> +JcC<$JcC<$s8RT~> +JcC<$JcC<$s8RT~> +JcC<$JcC<$s8RT~> +JcC<$JcC<$s8RT~> +JcC<$JcC<$s8RT~> +JcC<$JcC<$s8RT~> +JcC<$JcC<$s8RT~> +JcC<$JcC<$s8RT~> +JcC<$JcC<$s8RT~> +JcC<$JcC<$s8RT~> +JcC<$JcC<$s8RT~> +JcC<$JcC<$s8RT~> +JcC<$JcC<$s8RT~> +JcC<$JcC<$s8RT~> +JcC<$JcC<$s8RT~> +JcC<$JcC<$s8RT~> +JcC<$JcC<$s8RT~> +JcC<$JcC<$s8RT~> +JcC<$JcC<$s8RT~> +JcC<$JcC<$s8RT~> +JcC<$JcC<$s8RT~> +JcC<$JcC<$s8RT~> +JcC<$JcC<$s8RT~> +JcC<$JcC<$s8RT~> +JcC<$JcC<$s8RT~> +JcC<$JcC<$s8RT~> +JcC<$JcC<$s8RT~> +JcC<$JcC<$s8RT~> +JcC<$JcC<$s8RT~> +JcC<$JcC<$s8RT~> +JcC<$JcC<$s8RT~> +JcC<$JcC<$s8RT~> +JcC<$JcC<$s8RT~> +JcC<$JcC<$s8RT~> +JcC<$JcC<$s8RT~> +JcC<$JcC<$s8RT~> +JcC<$JcC<$s8RT~> +JcC<$JcC<$s8RT~> +JcC<$JcC<$s8RT~> +JcC<$JcC<$s8RT~> +JcC<$JcC<$s8RT~> +JcC<$JcC<$s8RT~> +JcC<$JcC<$s8RT~> +JcC<$JcC<$s8RT~> +JcC<$JcC<$s8RT~> +JcC<$JcC<$s8RT~> +JcC<$JcC<$s8RT~> +JcC<$JcC<$s8RT~> +JcC<$JcC<$s8RT~> +JcC<$JcC<$s8RT~> +JcC<$JcC<$s8RT~> +JcC<$JcC<$s8RT~> +JcC<$JcC<$s8RT~> +JcC<$JcC<$s8RT~> +JcC<$JcC<$s8RT~> +JcC<$JcC<$s8RT~> +JcC<$JcC<$s8RT~> +JcC<$JcC<$s8RT~> +JcC<$JcC<$s8RT~> +JcC<$JcC<$s8RT~> %%EndData showpage %%Trailer @@ -122607,3575 +120123,2239 @@ %%EOF %%EndDocument - @endspecial 18216 5767 V -240 5774 18463 7 v -240 6083 + @endspecial 6494 6040 V 1300 6047 5201 7 v -240 6355 a Fj(Figure)78 b(15:)117 b Fm(This)73 b(is)g(part)f(of)g(the)g(graph)h (for)f(the)g(eonImageCalculator)g(constructor,)77 b(unfortunately)71 -b(there)h(is)h(no)f(graph)-240 6282 y(mark)-5 b(ed)56 +b(there)h(is)h(no)f(graph)-240 6554 y(mark)-5 b(ed)56 b(complete)f(for)g(this)h(data)f(structure,)g(it)g(is)h(collapsed)h(in) -e(main)-18 6829 y Fj(5.)91 b(DSA)70 b(accurately)f(iden)-5 -b(ti\014ed)69 b(the)h(lifetimes)d(\(lo)5 b(cal,)71 b(L,)f(or)g(global,) -h(G\))f(of)g(all)g(the)g(data)g(structures)f(w)-5 b(e)70 -b(ha)-5 b(v)g(e)215 7103 y(examined)59 b(so)h(far,)g(except)f(an)i(imp) -5 b(ortan)-5 b(t)59 b(case)h(in)g Fc(fpgrowth)p Fj(,)k(discussed)59 -b(next.)-18 7526 y(6.)91 b(In)59 b Fc(fpgrowth)p Fj(,)k(a)d(recursiv)-5 -b(e)58 b(function)g(creates)h(a)h(new)g(tree)f(and)g(a)h(new)g(\\item)e -(table",)g(plus)h(three)h(other)f(new)215 7800 y(ob)10 -b(jects)65 b(on)i(eac)-5 b(h)66 b(recursiv)-5 b(e)66 -b(call.)98 b(DSA)67 b(w)-5 b(as)67 b(unable)f(to)g(pro)-5 +e(main.)75 b(The)55 b(BSTNo)5 b(de)55 b(no)5 b(des)55 +b(form)h(a)f(recursiv)-5 b(e)56 b(tree.)-240 7101 y Fj(in)-5 +b(to)60 b(one)g(no)5 b(de)60 b(in)h(main.)-240 7375 y(I=0)-240 +7649 y(There)66 b(are)g(no)g(disjoin)-5 b(t)64 b(SDSI's,)i(b)5 +b(ecause)65 b(there)h(are)g(no)g(disjoin)-5 b(t)64 b(instances)g(of)i +(one)g(static)e(data)i(structure)f(in)g(the)-240 7923 +y(program,)i(with)f(the)g(same)f(t)-5 b(yp)5 b(e.)97 +b(There)67 b(are)f(a)h(few)f(instances)e(of)i(trees)g(that)f(are)i +(disjoin)-5 b(t,)65 b(but)h(they)g(are)g(part)h(of)-240 +8197 y(mrScene,)59 b(and)i(are)f(templated)f(to)h(di\013eren)-5 +b(t)60 b(t)-5 b(yp)5 b(es.)-240 8471 y(O=1)61 b(eonImageCalculator)d +(is,)i(unfortunately)-15 b(,)58 b(collapsed)h(in)h(main.)-240 +8745 y(C=)h(1)-240 9019 y(Sev)-5 b(eral)60 b(collections)e(p)5 +b(oin)-5 b(t)59 b(to)i(the)f(collapsed)e(no)5 b(de.)-240 +9929 y Fk(10)270 b(Conclusions)-240 10383 y Fj(Brie\015y)-15 +b(,)69 b(w)-5 b(e)68 b(summarize)f(the)h(conclusions)e(of)i(our)g +(study)g(as)g(follo)-5 b(ws.)102 b(Please)67 b(refer)h(to)g(T)-15 +b(able)68 b(1)g(for)g(the)g(v)-10 b(alues)68 b(of)-240 +10657 y(metrics)59 b(referred)h(to)g(b)5 b(elo)-5 b(w:)-18 +11130 y(1.)91 b(In)75 b(all)f(but)h(one)g(\()p Fc(eon)p +Fj(\))h(of)f(the)g(six)g(programs,)j(DSA)d(successfully)e +(distinguished)g(the)h(imp)5 b(ortan)-5 b(t)74 b Fh(kinds)91 +b Fj(of)3809 11672 y(22)p eop end +%%Page: 23 23 +TeXDict begin 23 22 bop 1452 -99 4897 7 v 1452 3367 7 +3467 v 1508 3317 a @beginspecial 14 @llx 14 @lly 301 + at urx 216 @ury 2870 @rwi @setspecial +%%BeginDocument: Figures/eon_fg2.eps +%!PS-Adobe-3.0 EPSF-3.0 +%%Creator: GIMP PostScript file plugin V 1.17 by Peter Kirchgessner +%%Title: eon_fg2.eps +%%CreationDate: Fri Dec 16 22:29:47 2005 +%%DocumentData: Clean7Bit +%%LanguageLevel: 2 +%%Pages: 1 +%%BoundingBox: 14 14 301 216 +%%EndComments +%%BeginProlog +% Use own dictionary to avoid conflicts +10 dict begin +%%EndProlog +%%Page: 1 1 +% Translate for offset +14.173228346456693 14.173228346456693 translate +% Translate to begin of first scanline +0 200.88 translate +286.78263157894736 -200.88 scale +% Image geometry +651 456 8 +% Transformation matrix +[ 651 0 0 456 0 0 ] +% Strings to hold RGB-samples per scanline +/rstr 651 string def +/gstr 651 string def +/bstr 651 string def +{currentfile /ASCII85Decode filter /RunLengthDecode filter rstr readstring pop} +{currentfile /ASCII85Decode filter /RunLengthDecode filter gstr readstring pop} +{currentfile /ASCII85Decode filter /RunLengthDecode filter bstr readstring pop} +true 3 +%%BeginData: 93728 ASCII Bytes +colorimage +JcFR+rO7 at XUAt5%JcC<$!<7Q~> +JcFR+rLe`AUAt4cJcC<$!<7Q~> +JcFR+rLe`AUAt4cJcC<$!<7Q~> +JcFO*rjRIYU]:>&JcC<$s8RT~> +JcFO*rh+iBU]:=dJcC<$s8RT~> +JcFO*rh+iBU]:=dJcC<$s8RT~> +JcFO*rO7 at XV#UG'JcC<$s8RT~> +JcFO*rLe`AV#UFeJcC<$s8RT~> +JcFO*rLe`AV#UFeJcC<$s8RT~> +JcFL)rO7 at XV>pP(JcC<$s8RT~> +JcFL)rLe`AV>pOfJcC<$s8RT~> +JcFL)rLe`AV>pOfJcC<$s8RT~> +JcFI(rjRIYVZ6Y)JcC<$rr7K~> +JcFI(rh+iBVZ6XgJcC<$rr7K~> +JcFI(rh+iBVZ6XgJcC<$rr7K~> +JcFI(rO7 at XVuQb*JcC<$rr7K~> +JcFI(rLe`AVuQahJcC<$rr7K~> +JcFI(rLe`AVuQahJcC<$rr7K~> +JcFF'rO7 at XW;lk+JcC<$rr7K~> +JcFF'rLe`AW;ljiJcC<$rr7K~> +JcFF'rLe`AW;ljiJcC<$rr7K~> +JcFC&rjRIYWW2t,JcC<$rVqB~> +JcFC&rh+iBWW2sjJcC<$rVqB~> +JcFC&rh+iBWW2sjJcC<$rVqB~> +JcFC&rO7 at XWrN(-JcC<$rVqB~> +JcFC&rLe`AWrN'kJcC<$rVqB~> +JcFC&rLe`AWrN'kJcC<$rVqB~> +JcF@%rO7 at XX8i1.JcC<$rVqB~> +JcF@%rLe`AX8i0lJcC<$rVqB~> +JcF@%rLe`AX8i0lJcC<$rVqB~> +JcF=$rjRIYXT/7.JcC<$rVqB~> +JcF=$rh+iBXT/6lJcC<$rVqB~> +JcF=$rh+iBXT/6lJcC<$rVqB~> +JcF=$rO7 at XXoJC0JcC<$r;V9~> +JcF=$rLe`AXoJBnJcC<$r;V9~> +JcF=$rLe`AXoJBnJcC<$r;V9~> +JcF:#rO7 at XY5eL1JcC<$r;V9~> +JcF:#rLe`AY5eKoJcC<$r;V9~> +JcF:#rLe`AY5eKoJcC<$r;V9~> +JcF7"rjRIYYQ+R1JcC<$r;V9~> +JcF7"rh+iBYQ+QoJcC<$r;V9~> +JcF7"rh+iBYQ+QoJcC<$r;V9~> +JcF7"rO7 at XYlF^3JcC<$qu;0~> +JcF7"rLe`AYlF]qJcC<$qu;0~> +JcF7"rLe`AYlF]qJcC<$qu;0~> +JcF4!rO7 at XZ2ag4JcC<$qu;0~> +JcF4!rLe`AZ2afrJcC<$qu;0~> +JcF4!rLe`AZ2afrJcC<$qu;0~> +JcF4!rO7 at XZN'm4JcC<$qu;0~> +JcF4!rLe`AZN'lrJcC<$qu;0~> +JcF4!rLe`AZN'lrJcC<$qu;0~> +JcF0urO7 at XZiC$6JcC<$qYu'~> +JcF0urLe`AZiC#tJcC<$qYu'~> +JcF0urLe`AZiC#tJcC<$qYu'~> +JcF-trjRIYZiC$6JcC<$qYu'~> +JcF-trh+iBZiC#tJcC<$qYu'~> +JcF-trh+iBZiC#tJcC<$qYu'~> +JcF-trO7 at X[K$37JcC<$qYu'~> +JcF-trLe`A[K$2uJcC<$qYu'~> +JcF-trLe`A[K$2uJcC<$qYu'~> +JcF*srO7 at X[f??9JcC<$q>Ys~> +JcF*srLe`A[f??"JcC<$q>Ys~> +JcF*srLe`A[f??"JcC<$q>Ys~> +JcF'rrjRIY[f??9JcC<$q>Ys~> +JcF'rrh+iB[f??"JcC<$q>Ys~> +JcF'rrh+iB[f??"JcC<$q>Ys~> +JcF'rrO7 at X\,ZH:JcC<$q>Ys~> +JcF'rrLe`A\,ZH#JcC<$q>Ys~> +JcF'rrLe`A\,ZH#JcC<$q>Ys~> +JcF$qrO7 at X\c;Zj~> +JcF$qrLe`A\c;Z%JcC<$q#>j~> +JcF$qrLe`A\c;Z%JcC<$q#>j~> +JcF!prjRIY\c;Zj~> +JcF!prh+iB\c;Z%JcC<$q#>j~> +JcF!prh+iB\c;Z%JcC<$q#>j~> +JcF!prO7 at X])Vc=JcC<$q#>j~> +JcF!prLe`A])Vc&JcC<$q#>j~> +JcF!prLe`A])Vc&JcC<$q#>j~> +JcEsorO7 at X]`7u?JcC<$p]#a~> +JcEsorLe`A]`7u(JcC<$p]#a~> +JcEsorLe`A]`7u(JcC<$p]#a~> +!4ROZbl@[OJcEC_rjRIYJcGKEJ,~> +!2+oCbl@[8JcEC_rh+iBJcGKEJ,~> +!2+oCbl@[8JcEC_rh+iBJcGKEJ,~> +rjRIYcN!jPJcEF`rjRIYJcGKEJ,~> +rh+iBcN!j9JcEF`rh+iBJcGKEJ,~> +rh+iBcN!j9JcEF`rh+iBJcGKEJ,~> +rO7 at XcN!jPJcELbrjRIYJcGHDJ,~> +rLe`AcN!j9JcELbrh+iBJcGHDJ,~> +rLe`AcN!j9JcELbrh+iBJcGHDJ,~> +qmV.Vci=!RJcELbrjRIYJcGHDJ,~> +qk/N?ci=!;JcELbrh+iBJcGHDJ,~> +qk/N?ci=!;JcELbrh+iBJcGHDJ,~> +s8W#+JcF*srO7 at X_#ODCJcC<$pA]X~> +s8W"iJcF*srLe`A_#OD,JcC<$pA]X~> +s8W"iJcF*srLe`A_#OD,JcC<$pA]X~> +rr;l)JcF-trO7 at X_Z0VEJcC<$p&BO~> +rr;kgJcF-trLe`A_Z0V.JcC<$p&BO~> +rr;kgJcF-trLe`A_Z0V.JcC<$p&BO~> +r;Z](JcF-trjRIY_Z0VEJcC<$p&BO~> +r;Z\fJcF-trh+iB_Z0V.JcC<$p&BO~> +r;Z\fJcF-trh+iB_Z0V.JcC<$p&BO~> +qu?Q&JcF4!rO7 at X_uK_FJcC<$p&BO~> +qu?PdJcF4!rLe`A_uK_/JcC<$p&BO~> +qu?PdJcF4!rLe`A_uK_/JcC<$p&BO~> +q>^B%JcF4!rO7 at X`W,qHJcC<$o`'F~> +q>^AcJcF4!rLe`A`W,q1JcC<$o`'F~> +q>^AcJcF4!rLe`A`W,q1JcC<$o`'F~> +q#C6#JcF7"rjRIY`W,qHJcC<$o`'F~> +q#C5aJcF7"rh+iB`W,q1JcC<$o`'F~> +q#C5aJcF7"rh+iB`W,q1JcC<$o`'F~> +pAb'"JcF:#rO7 at X`rH%IJcC<$o`'F~> +pAb&`JcF:#rLe`A`rH%2JcC<$o`'F~> +pAb&`JcF:#rLe`A`rH%2JcC<$o`'F~> +p&FouJcF=$rO7 at XaT)4JJcC<$o`'F~> +p&Fo^JcF=$rLe`AaT)43JcC<$o`'F~> +p&Fo^JcF=$rLe`AaT)43JcC<$o`'F~> +oDe]sJcFC&rO7 at XaT)7KJcC<$oDa=~> +oDe]\JcFC&rLe`AaT)74JcC<$oDa=~> +oDe]\JcFC&rLe`AaT)74JcC<$oDa=~> +o)JTrJcFC&rO7 at XaoD@LJcC<$oDa=~> +o)JT[JcFC&rLe`AaoD at 5JcC<$oDa=~> +o)JT[JcFC&rLe`AaoD at 5JcC<$oDa=~> +nGiBpJcFF'rjRIYb5_FLJcC<$oDa=~> +nGiBYJcFF'rh+iBb5_F5JcC<$oDa=~> +nGiBYJcFF'rh+iBb5_F5JcC<$oDa=~> +n,N9oJcFI(rO7 at XbQ%RNJcC<$o)F4~> +n,N9XJcFI(rLe`AbQ%R7JcC<$o)F4~> +n,N9XJcFI(rLe`AbQ%R7JcC<$o)F4~> +mJm'mJcFL)rO7 at Xbl@[OJcC<$o)F4~> +mJm'VJcFL)rLe`Abl@[8JcC<$o)F4~> +mJm'VJcFL)rLe`Abl@[8JcC<$o)F4~> +li6mlJcFL)rjRIYc2[aOJcC<$o)F4~> +li6mUJcFL)rh+iBc2[a8JcC<$o)F4~> +li6mUJcFL)rh+iBc2[a8JcC<$o)F4~> +lMpajJcFR+rO7 at XcN!mQJcC<$nc++~> +lMpaSJcFR+rLe`AcN!m:JcC<$nc++~> +lMpaSJcFR+rLe`AcN!m:JcC<$nc++~> +kl:RiJcFR+rO7 at Xci=!RJcC<$nc++~> +kl:RRJcFR+rLe`Aci=!;JcC<$nc++~> +kl:RRJcFR+rLe`Aci=!;JcC<$nc++~> +kPtFgJcFU,rjRIYci=!RJcC<$nc++~> +kPtFPJcFU,rh+iBci=!;JcC<$nc++~> +kPtFPJcFU,rh+iBci=!;JcC<$nc++~> +jo>7fJcFX-rO7 at XdJs3TJcC<$nGe"~> +jo>7OJcFX-rLe`AdJs3=JcC<$nGe"~> +jo>7OJcFX-rLe`AdJs3=JcC<$nGe"~> +jT#+dJcF[.rO7 at Xdf9 +jT#+MJcF[.rLe`Adf9<>JcC<$nGe"~> +jT#+MJcF[.rLe`Adf9<>JcC<$nGe"~> +irAqcJcF[.rjRIYdf9 +irAqLJcF[.rh+iBdf9<>JcC<$nGe"~> +irAqLJcF[.rh+iBdf9<>JcC<$nGe"~> +iW&eaJcFa0rO7 at XeGoNWJcC<$n,In~> +iW&eJJcFa0rLe`AeGoN at JcC<$n,In~> +iW&eJJcFa0rLe`AeGoN at JcC<$n,In~> +huEV`JcFa0rO7 at Xec5WXJcC<$n,In~> +huEVIJcFa0rLe`Aec5WAJcC<$n,In~> +huEVIJcFa0rLe`Aec5WAJcC<$n,In~> +hZ*J^JcFd1rjRIYec5WXJcC<$n,In~> +hZ*JGJcFd1rh+iBec5WAJcC<$n,In~> +hZ*JGJcFd1rh+iBec5WAJcC<$n,In~> +h#I8\JcFj3rO7 at XfDkiZJcC<$mf.e~> +h#I8EJcFj3rLe`AfDkiCJcC<$mf.e~> +h#I8EJcFj3rLe`AfDkiCJcC<$mf.e~> +g]./[JcFj3rO7 at Xf`1r[JcC<$mf.e~> +g]./DJcFj3rLe`Af`1rDJcC<$mf.e~> +g]./DJcFj3rLe`Af`1rDJcC<$mf.e~> +g&LrYJcFm4rjRIYf`1r[JcC<$mf.e~> +g&LrBJcFm4rh+iBf`1rDJcC<$mf.e~> +g&LrBJcFm4rh+iBf`1rDJcC<$mf.e~> +f`1iXJcFp5rO7 at XgAh/]JcC<$mJh\~> +f`1iAJcFp5rLe`AgAh/FJcC<$mJh\~> +f`1iAJcFp5rLe`AgAh/FJcC<$mJh\~> +f)PWVJcFs6rO7 at Xg].8^JcC<$mJh\~> +f)PW?JcFs6rLe`Ag].8GJcC<$mJh\~> +f)PW?JcFs6rLe`Ag].8GJcC<$mJh\~> +eGoHUJcG!7rO7 at Xg].8^JcC<$mJh\~> +eGoH>JcG!7rLe`Ag].8GJcC<$mJh\~> +eGoH>JcG!7rLe`Ag].8GJcC<$mJh\~> +e,TdJ`JcC<$m/MS~> +e,T<dJIJcC<$m/MS~> +e,T<dJIJcC<$m/MS~> +dJs-RJcG$8rjRIYh>dJ`JcC<$m/MS~> +dJs-;JcG$8rh+iBh>dJIJcC<$m/MS~> +dJs-;JcG$8rh+iBh>dJIJcC<$m/MS~> +d/X!PJcG*:rO7 at XhZ*SaJcC<$m/MS~> +d/X!9JcG*:rLe`AhZ*SJJcC<$m/MS~> +d/X!9JcG*:rLe`AhZ*SJJcC<$m/MS~> +cN!gOJcG*:rO7 at Xi;`bbJcC<$m/MS~> +cN!g8JcG*:rLe`Ai;`bKJcC<$m/MS~> +cN!g8JcG*:rLe`Ai;`bKJcC<$m/MS~> +c2[[MJcG-;rjRIYi;`ecJcC<$li2J~> +c2[[6JcG-;rh+iBi;`eLJcC<$li2J~> +c2[[6JcG-;rh+iBi;`eLJcC<$li2J~> +bQ%LLJcG0 +bQ%L5JcG0 +bQ%L5JcG0 +b5_ at JJcG3=rO7 at Xj8](eJcC<$li2J~> +b5_ at 3JcG3=rLe`Aj8](NJcC<$li2J~> +b5_ at 3JcG3=rLe`Aj8](NJcC<$li2J~> +aT)1IJcG3=rjRIYj8]+fJcC<$lMlA~> +aT)12JcG3=rh+iBj8]+OJcC<$lMlA~> +aT)12JcG3=rh+iBj8]+OJcC<$lMlA~> +a8c%GJcG9?rO7 at XjT#4gJcC<$lMlA~> +a8c%0JcG9?rLe`AjT#4PJcC<$lMlA~> +a8c%0JcG9?rLe`AjT#4PJcC<$lMlA~> +`W,hEJcG<@rO7 at Xk5YChJcC<$lMlA~> +`W,h.JcG<@rLe`Ak5YCQJcC<$lMlA~> +`W,h.JcG<@rLe`Ak5YCQJcC<$lMlA~> +`;f_DJcG<@rjRIYk5YFiJcC<$l2Q8~> +`;f_-JcG<@rh+iBk5YFRJcC<$l2Q8~> +`;f_-JcG<@rh+iBk5YFRJcC<$l2Q8~> +_Z0MBJcGBBrO7 at XkPtOjJcC<$l2Q8~> +_Z0M+JcGBBrLe`AkPtOSJcC<$l2Q8~> +_Z0M+JcGBBrLe`AkPtOSJcC<$l2Q8~> +_>jDAJcGBBrO7 at Xkl:XkJcC<$l2Q8~> +_>jD*JcGBBrLe`Akl:XTJcC<$l2Q8~> +_>jD*JcGBBrLe`Akl:XTJcC<$l2Q8~> +^]42?JcGECrjRIYl2UalJcC<$kl6/~> +^]42(JcGECrh+iBl2UaUJcC<$kl6/~> +^]42(JcGECrh+iBl2UaUJcC<$kl6/~> +^&S#>JcGHDrO7 at XlMpjmJcC<$kl6/~> +^&S#'JcGHDrLe`AlMpjVJcC<$kl6/~> +^&S#'JcGHDrLe`AlMpjVJcC<$kl6/~> +]`7l +]`7l%JcGKErLe`Ali6sWJcC<$kl6/~> +]`7l%JcGKErLe`Ali6sWJcC<$kl6/~> +])V];JcGKErjRIYm/R'oJcC<$kPp&~> +])V]$JcGKErh+iBm/R'XJcC<$kPp&~> +])V]$JcGKErh+iBm/R'XJcC<$kPp&~> +\c;Q9JcGQGrO7 at XmJm0pJcC<$kPp&~> +\c;Q"JcGQGrLe`AmJm0YJcC<$kPp&~> +\c;Q"JcGQGrLe`AmJm0YJcC<$kPp&~> +\,ZB8JcGQGrO7 at Xmf39qJcC<$kPp&~> +\,ZB!JcGQGrLe`Amf39ZJcC<$kPp&~> +\,ZB!JcGQGrLe`Amf39ZJcC<$kPp&~> +[f?66JcGTHrjRIYn,NBrJcC<$kPkOkJ,~> +[f?5tJcGTHrh+iBn,NB[JcC<$kPkOTJ,~> +[f?5tJcGTHrh+iBn,NB[JcC<$kPkOTJ,~> +[/^'5JcGWIrO7 at XnGiKsJcC<$l2UalJ,~> +[/^&sJcGWIrLe`AnGiK\JcC<$l2UaUJ,~> +[/^&sJcGWIrLe`AnGiK\JcC<$l2UaUJ,~> +ZiBp3JcGZJrO7 at Xnc/TtJcC<$li6mlJ,~> +ZiBoqJcGZJrLe`Anc/T]JcC<$li6mUJ,~> +ZiBoqJcGZJrLe`Anc/T]JcC<$li6mUJ,~> +Z2aa2JcG]KrO7 at Xo)J]uJcC<$m/QpkJ,~> +Z2a`pJcG]KrLe`Ao)J]^JcC<$m/QpTJ,~> +Z2a`pJcG]KrLe`Ao)J]^JcC<$m/QpTJ,~> +YlFU0JcG`LrO7 at XoDeg!JcC<$mf3-ms8RT~> +YlFTnJcG`LrLe`AoDef_JcC<$mf3-Vs8RT~> +YlFTnJcG`LrLe`AoDef_JcC<$mf3-Vs8RT~> +Y5eC.JcGcMrjRIYoDeg!JcC<$nGi?orVqB~> +Y5eBlJcGcMrh+iBoDef_JcC<$nGi?XrVqB~> +Y5eBlJcGcMrh+iBoDef_JcC<$nGi?XrVqB~> +XoJ:-Jc>`MrO7 at Xp&G$#JcC<$o)JNpqu;0~> +XoJ9kJc>`MrLe`Ap&G#aJcC<$o)JNYqu;0~> +XoJ9kJc>`MrLe`Ap&G#aJcC<$o)JNYqu;0~> +X8i(+JcG\XJcGHDrjRIYJcGBBq7$2"J,~> +X8i'iJcG\AJcGHDrh+iBJcGBBq4RQ`J,~> +X8i'iJcG\AJcGHDrh+iBJcGBBq4RQ`J,~> +WrMt*JcG_YJcGHDrjRIYJcGHDqR?1uJ,~> +WrMshJcG_BJcGHDrh+iBJcGHDqOmQ^J,~> +WrMshJcG_BJcGHDrh+iBJcGHDqOmQ^J,~> +W;lb(KE(nZJcGNFrO7 at XJcGNFqR?+sJ,~> +W;lafKE(nCJcGNFrLe`AJcGNFqOmK\J,~> +W;lafKE(nCJcGNFrLe`AJcGNFqOmK\J,~> +VZ6S'KE(nZJcGQGrjRIYJcGQGqR?%qJ,~> +VZ6ReKE(nCJcGQGrh+iBJcGQGqOmEZJ,~> +VZ6ReKE(nCJcGQGrh+iBJcGQGqOmEZJ,~> +V>pG%K`D%\JcGQGrjRIYJcGWIqR>toJ,~> +V>pFcK`D%EJcGQGrh+iBJcGWIqOm?XJ,~> +V>pFcK`D%EJcGQGrh+iBJcGWIqOm?XJ,~> +U]:8$L&_+\JcGcM!4Vt-rO7 at XJcG`Lq7#elJ,~> +U]:7bL&_+EJcGcM!20>krLe`AJcG`Lq4R0UJ,~> +U]:7bL&_+EJcGcM!20>krLe`AJcG`Lq4R0UJ,~> +UAt,"LB%4]JcGPTJcC<$s8Vo(m/MS~> +UAt+`LB%4FJcGP=JcC<$s8Vnfm/MS~> +UAt+`LB%4FJcGP=JcC<$s8Vnfm/MS~> +T`=r!LB%7^rVuo,L]@1ZJcC<$qR>_hJ,~> +T`=q_LB%7GrVunjL]@1CJcC<$qOm*QJ,~> +T`=q_LB%7GrVunjL]@1CJcC<$qOm*QJ,~> +TE"etM#[F_!<;u+M#[1XJcCK)qR>YfJ,~> +TE"e]M#[FH!<;tiM#[1AJcCK)qOm$OJ,~> +TE"e]M#[FH!<;tiM#[1AJcCK)qOm$OJ,~> +ScAVsM#[7ZM#[.WJcCT,qR>SdJ,~> +ScAV\M#[7CM#[. at JcCT,qOlsMJ,~> +ScAV\M#[7CM#[. at JcCT,qOlsMJ,~> +SH&JqMZMbJ,~> +SH&JZMZ +SH&JZMZ +RfE;pqZ$Q(QiHcgM#[.WJcCc1q7#>_J,~> +RfE;YqZ$PfQiHcPM#[. at JcCc1q4Q^HJ,~> +RfE;YqZ$PfQiHcPM#[. at JcCc1q4Q^HJ,~> +RK*/nrVuf)RfDugM?!7XJcCi3q7#8]J,~> +RK*/WrVuegRfDuPM?!7AJcCi3q4QXFJ,~> +RK*/WrVuegRfDuPM?!7AJcCi3q4QXFJ,~> +QiHrl!<;o)S,`)hM?!:YJcCl4qR>8[J,~> +QiHrU!<;ngS,`)QM?!:BJcCl4qOlXDJ,~> +QiHrU!<;ngS,`)QM?!:BJcCl4qOlXDJ,~> +QN-QcSH&2iM?!=ZJcCo5qR>2YJ,~> +QN-QLSH&2RM?!=CJcCo5qOlRBJ,~> +QN-QLSH&2RM?!=CJcCo5qOlRBJ,~> +PlLEcS,`,iM?!=ZJcCu7qR>,WJ,~> +PlLELS,`,RM?!=CJcCu7qOlL at J,~> +PlLELS,`,RM?!=CJcCu7qOlL at J,~> +PQ1&UJ,~> +PQ1J,~> +PQ1J,~> +PQ19aS,`/jMZ +PQ19JS,`/SMZ +PQ19JS,`/SMZ +PlL<`S,`2kMZ +PlL +PlL +PlL<`RfE,kMZ +PlL +PlL +PlL9_RK*)lMZqR=`LJ,~> +PlL9HRK*)UMZqOl+5J,~> +PlL9HRK*)UMZqOl+5J,~> +PlL6^RK*,mMZ +PlL6GRK*,VMZ +PlL6GRK*,VMZ +P5k']RK*,mMuW^aJcD>AqR=THJ,~> +P5k'FRK*,VMuW^JJcD>AqOkt1J,~> +P5k'FRK*,VMuW^JJcD>AqOkt1J,~> +NrSd]R/d&mMuWabJcDABqR=NFJ,~> +NrSdFR/d&VMuWaKJcDABqOkn/J,~> +NrSdFR/d&VMuWaKJcDABqOkn/J,~> +MuWO\nc,Nfr3qRarO7=XrW&epq7"?CJ,~> +MuWOEnc,Nfr1JrJrLe]ArW&epq4P_,J,~> +MuWOEnc,Nfr1JrJrLe]ArW&epq4P_,J,~> +M#[=\p&CcerO7[brjRFYq#IJqqR=?AJ,~> +M#[=Ep&CcerLf&Krh+fBq#IJqqOk_*J,~> +M#[=Ep&CcerLf&Krh+fBq#IJqqOk_*J,~> +K`D(]p]$ics0mgb!4RLZp&M;rqR=9?J,~> +K`D(Fp]$ics.G2K!2+lCp&M;rqOkY(J,~> +K`D(Fp]$ics.G2K!2+lCp&M;rqOkY(J,~> +JcGQGq>c*HJcDSHq#Ic$qR=3=J,~> +JcGQGq>c*HJcDSHq#Ic$qOkS&J,~> +JcGQGq>c*HJcDSHq#Ic$qOkS&J,~> +JcGWIqZ)3IJcDABqZ+))qR=-;J,~> +JcGWIqZ)3IJcDABqZ+))qOkM$J,~> +JcGWIqZ)3IJcDABqZ+))qOkM$J,~> +JcGZJquDqZ+5-qR='9J,~> +JcGZJquDqZ+5-qOkG"J,~> +JcGZJquDqZ+5-qOkG"J,~> +JcG]KquD +JcG]KquD +JcG]KquD +JcG`LquD +JcG`LquD +JcG`LquD +JcGcMr;_EKJcCr6quF\8qR +JcGcMr;_EKJcCr6quF\8qOk1pJ,~> +JcGcMr;_EKJcCr6quF\8qOk1pJ,~> +Jc>`Mr;_EKJcCl4quFe;qR +Jc>`Mr;_EKJcCl4quFe;qOk+nJ,~> +Jc>`Mr;_EKJcCl4quFe;qOk+nJ,~> +Jc>`Mr;_EKJcCi3r;at>qR<[.J,~> +Jc>`Mr;_EKJcCi3r;at>qOk%lJ,~> +Jc>`Mr;_EKJcCi3r;at>qOk%lJ,~> +JcGZKJcC<$NrT%Xbl at OKXoEn~> +JcGZKJcC<$NrT%Xbl at O4XoEn~> +JcGZKJcC<$NrT%Xbl at O4XoEn~> +JcG]LJcC<$N;rhVd/WpNX8d\~> +JcG]LJcC<$N;rhVd/Wp7X8d\~> +JcG]LJcC<$N;rhVd/Wp7X8d\~> +K)bcLJcC<$MuWbVdf90QW;hA~> +K)bcLJcC<$MuWbVdf90:W;hA~> +K)bcLJcC<$MuWbVdf90:W;hA~> +K)bfMJcC<$MZ +K)bfMJcC<$MZ +K)bfMJcC<$MZ +K)bfM`W$82Vg<$&HAfT3Mu3MZf8F'5CrVm,SZoJ*d;ma@:rs./_3<0%X[(u84!,23.$J219 +!!#rD;eW)qr;QrnVg%V!)p8kZtKF>3OIE) +Zr6r)_"[j?^]4 at J[-ZDB3<0%XH?qSt^qp'M!8%8I\"s%S~> +K)bfM`W$82Vg<$&HAfT3Mu3MZf8F'5CrVm,SZoJ*d;ma@:rs./_3<0%X[(u84!,23.$J219 +!!#rD;eW)qr;QrnVg%V!)p8kZtKF>3OIE) +Zr6r)_"[j?^]4 at J[-ZDB3<0%XH?qSt^qp'M!8%8ITVVU<~> +K)bfM`W$82Vg<$&HAfT3Mu3MZf8F'5CrVm,SZoJ*d;ma@:rs./_3<0%X[(u84!,23.$J219 +!!#rD;eW)qr;QrnVg%V!)p8kZtKF>3OIE) +Zr6r)_"[j?^]4 at J[-ZDB3<0%XH?qSt^qp'M!8%8ITVVU<~> +KE(oN`W$% +KE(oN`W$% +KE(oN`W$% +KE(oN`r?+.!4;V&#f$Gls8Vb*!9*hT!jhrqrVlrN!!)]l!nRDPnG`Q9!,20-!nRDPrVm,0!!)Bc +s-Zg`rrVjl[/L%)!!(XJrrAJbs8N'!fDPXNok4>=nG`NW;uHXsoi&6rs8N'!fDGRLf)PgJrrSSg +Vu$Dp^] +KE(oN`r?+.!4;V&#f$Gls8Vb*!9*hT!jhrqrVlrN!!)]l!nRDPnG`Q9!,20-!nRDPrVm,0!!)Bc +s-Zg`rrVjl[/L%)!!(XJrrAJbs8N'!fDPXNok4>=nG`NW;uHXsoi&6rs8N'!fDGRLf)PgJrrSSg +Vu$Dp^] +KE(oN`r?+.!4;V&#f$Gls8Vb*!9*hT!jhrqrVlrN!!)]l!nRDPnG`Q9!,20-!nRDPrVm,0!!)Bc +s-Zg`rrVjl[/L%)!!(XJrrAJbs8N'!fDPXNok4>=nG`NW;uHXsoi&6rs8N'!fDGRLf)PgJrrSSg +Vu$Dp^] +KE(oNa8Z4J!.+G?#("o$s*=[5q>ULp!5SU6!nRDPp&>*F!!)Qh!:9[b!8%&H!nRDPrVm,h!!'D+ +s&3V.rrKpBrVult!8%,J!6kB at rr<&Nqu6cW!!'CrrrH&3qu6]4[/L%)!!(XJrrUdP!;uiubQ)>O +rrJP>rr3&O!!)fo!!)rsrr<&Nr;Qj!R/g1]rrZr4!!)rs!nRDPr;QhE!)pc7rW(jUq6usqJ,~> +KE(oNa8Z4J!.+G?#("o$s*=[5q>ULp!5SU6!nRDPp&>*F!!)Qh!:9[b!8%&H!nRDPrVm,h!!'D+ +s&3V.rrKpBrVult!8%,J!6kB at rr<&Nqu6cW!!'CrrrH&3qu6]4[/L%)!!(XJrrUdP!;uiubQ)>O +rrJP>rr3&O!!)fo!!)rsrr<&Nr;Qj!R/g1]rrZr4!!)rs!nRDPr;QhE!)pc7rW(jUq4O>ZJ,~> +KE(oNa8Z4J!.+G?#("o$s*=[5q>ULp!5SU6!nRDPp&>*F!!)Qh!:9[b!8%&H!nRDPrVm,h!!'D+ +s&3V.rrKpBrVult!8%,J!6kB at rr<&Nqu6cW!!'CrrrH&3qu6]4[/L%)!!(XJrrUdP!;uiubQ)>O +rrJP>rr3&O!!)fo!!)rsrr<&Nr;Qj!R/g1]rrZr4!!)rs!nRDPr;QhE!)pc7rW(jUq4O>ZJ,~> +KE(oNaSuA/!!(7LLMZ>d1o)Abi!5SO4!UR2ls8N'!fDGRLf)PgLrr_pS!5SC0 +!TCinrrUdP!;QQo!;uls!!(XKrr`>g!!(XJrrgqPf)PgKrrUdP!;uiuH2mr]s8E#Xs8'3os*t~> +KE(oNaSuA/!!(7LLMZ>d1o)Abi!5SO4!UR2ls8N'!fDGRLf)PgLrr_pS!5SC0 +!TCinrrUdP!;QQo!;uls!!(XKrr`>g!!(XJrrgqPf)PgKrrUdP!;uiuH2mr]s8E#Xs8&CXs*t~> +KE(oNaSuA/!!(7LLMZ>d1o)Abi!5SO4!UR2ls8N'!fDGRLf)PgLrr_pS!5SC0 +!TCinrrUdP!;QQo!;uls!!(XKrr`>g!!(XJrrgqPf)PgKrrUdP!;uiuH2mr]s8E#Xs8&CXs*t~> +KE(rOa8Z4J!!)`m"SMe_!'0iS#hK%Vbl@^p!!)]l!nRDPo)Ape;t[Kt!;63g!nRDPrVm2j!!&qs +s-Wie[/Bq(m/?ta!!(XLrrMf"qu?Zr!8%)I#g<8K_#OGd3N)WO".9,h[/Bq(m/?ta!!(XJrrUdP +!<)p!^]4B*rrUdP!;QQo!;uls!!(XKrr`?%R/hR1rrdY`f)PgKrrUdP!;uiu;ZLLIs8E#Zs8'3m +s*t~> +KE(rOa8Z4J!!)`m"SMe_!'0iS#hK%Vbl@^p!!)]l!nRDPo)Ape;t[Kt!;63g!nRDPrVm2j!!&qs +s-Wie[/Bq(m/?ta!!(XLrrMf"qu?Zr!8%)I#g<8K_#OGd3N)WO".9,h[/Bq(m/?ta!!(XJrrUdP +!<)p!^]4B*rrUdP!;QQo!;uls!!(XKrr`?%R/hR1rrdY`f)PgKrrUdP!;uiu;ZLLIs8E#Zs8&CV +s*t~> +KE(rOa8Z4J!!)`m"SMe_!'0iS#hK%Vbl@^p!!)]l!nRDPo)Ape;t[Kt!;63g!nRDPrVm2j!!&qs +s-Wie[/Bq(m/?ta!!(XLrrMf"qu?Zr!8%)I#g<8K_#OGd3N)WO".9,h[/Bq(m/?ta!!(XJrrUdP +!<)p!^]4B*rrUdP!;QQo!;uls!!(XKrr`?%R/hR1rrdY`f)PgKrrUdP!;uiu;ZLLIs8E#Zs8&CV +s*t~> +KE(rOa8Z3e!,2$)!`K)Fq#:Wm!!'D+s475Np&>*F!!)Ti#.1<.of3#ZqYpWK!!)ut$a]m6fDkmD +;ZHerfD5IH!!(XLs8TJ's8N'!fD>LQli7$`s8TG+;tp:qohthj;qLjFrr<&Nqu6`L!!)ut!fI%l +o)AdC!!)fo!!)rsrr<&Nr;Qp#s5 +KE(rOa8Z3e!,2$)!`K)Fq#:Wm!!'D+s475Np&>*F!!)Ti#.1<.of3#ZqYpWK!!)ut$a]m6fDkmD +;ZHerfD5IH!!(XLs8TJ's8N'!fD>LQli7$`s8TG+;tp:qohthj;qLjFrr<&Nqu6`L!!)ut!fI%l +o)AdC!!)fo!!)rsrr<&Nr;Qp#s5 +KE(rOa8Z3e!,2$)!`K)Fq#:Wm!!'D+s475Np&>*F!!)Ti#.1<.of3#ZqYpWK!!)ut$a]m6fDkmD +;ZHerfD5IH!!(XLs8TJ's8N'!fD>LQli7$`s8TG+;tp:qohthj;qLjFrr<&Nqu6`L!!)ut!fI%l +o)AdC!!)fo!!)rsrr<&Nr;Qp#s5 +KE(rOa8c/>!.+;;rr<%Fp](6n"cNE\f)PgDrrUdP!:p-o;saPaR/g1^rrUdP!<3!#iAgn9rVlok +B`7u4HL1P/rr<%4rd"WE!4;Y'rr<&Nq>^Hp"a^4KosE]OrrMe+rVutFm/-h_!!$^0H3.a[!<)rt +!!%?BrrDE_[/^.-f)PgGrr<&ss8N'!fDPXP!<<(F!/pgU"duatf)PgKrs at 9W!<<)NR/f7__#OB6 +kl:LgQ2c@~> +KE(rOa8c/>!.+;;rr<%Fp](6n"cNE\f)PgDrrUdP!:p-o;saPaR/g1^rrUdP!<3!#iAgn9rVlok +B`7u4HL1P/rr<%4rd"WE!4;Y'rr<&Nq>^Hp"a^4KosE]OrrMe+rVutFm/-h_!!$^0H3.a[!<)rt +!!%?BrrDE_[/^.-f)PgGrr<&ss8N'!fDPXP!<<(F!/pgU"duatf)PgKrs at 9W!<<)NR/f7__#OB6 +kl:LPQ2c@~> +KE(rOa8c/>!.+;;rr<%Fp](6n"cNE\f)PgDrrUdP!:p-o;saPaR/g1^rrUdP!<3!#iAgn9rVlok +B`7u4HL1P/rr<%4rd"WE!4;Y'rr<&Nq>^Hp"a^4KosE]OrrMe+rVutFm/-h_!!$^0H3.a[!<)rt +!!%?BrrDE_[/^.-f)PgGrr<&ss8N'!fDPXP!<<(F!/pgU"duatf)PgKrs at 9W!<<)NR/f7__#OB6 +kl:LPQ2c@~> +KE(rOa8c/>!.+;;rr<%Fp](6n"cNE\f)PgDrrUdP!;$3k^l/3l"7-!fbkqDGf)Pes[!GZ/fD>LN +ZoJ*d3PbRmrr<&NrVlnd[/9n'!!(XHs8N'!MspZLZoJ*d3PbRmrr<&Nqu6`L!!)utrr<%Fq>UQ( +!!&GdrrUdP!;QQo!;uls!!(XKrso,0s475Nm/R+P3VEF(!!)rs#hK%VH>!9Y[.V36rW)ZlrjV\& +qR;[gJ,~> +KE(rOa8c/>!.+;;rr<%Fp](6n"cNE\f)PgDrrUdP!;$3k^l/3l"7-!fbkqDGf)Pes[!GZ/fD>LN +ZoJ*d3PbRmrr<&NrVlnd[/9n'!!(XHs8N'!MspZLZoJ*d3PbRmrr<&Nqu6`L!!)utrr<%Fq>UQ( +!!&GdrrUdP!;QQo!;uls!!(XKrso,0s475Nm/R+P3VEF(!!)rs#hK%VH>!9Y[.V36rW)Zlrh0&d +qOj&PJ,~> +KE(rOa8c/>!.+;;rr<%Fp](6n"cNE\f)PgDrrUdP!;$3k^l/3l"7-!fbkqDGf)Pes[!GZ/fD>LN +ZoJ*d3PbRmrr<&NrVlnd[/9n'!!(XHs8N'!MspZLZoJ*d3PbRmrr<&Nqu6`L!!)utrr<%Fq>UQ( +!!&GdrrUdP!;QQo!;uls!!(XKrso,0s475Nm/R+P3VEF(!!)rs#hK%VH>!9Y[.V36rW)Zlrh0&d +qOj&PJ,~> +KE(rOa8Z3$!.+;;!`K)Fq#:Wm!!'D+s475Np&>*F!!)Wj!IEArrrRKHHMd^Df)PgBrrMe\rVurM +rVult!8%2L!UR2js8N'!fD>LLli7$mmf*=\RJm0dfDYaL!!(XJrrUdP!<)p!3<3afs8N'!fDbdO +f)PgGrr<&ss8N'!fDPXK!<3!+BE4J#s-]ebs475Nr;R#R!!*'!H2qWms8E#ns89A's7s-ds*t~> +KE(rOa8Z3$!.+;;!`K)Fq#:Wm!!'D+s475Np&>*F!!)Wj!IEArrrRKHHMd^Df)PgBrrMe\rVurM +rVult!8%2L!UR2js8N'!fD>LLli7$mmf*=\RJm0dfDYaL!!(XJrrUdP!<)p!3<3afs8N'!fDbdO +f)PgGrr<&ss8N'!fDPXK!<3!+BE4J#s-]ebs475Nr;R#R!!*'!H2qWms8E#ns88Pes7r=Ms*t~> +KE(rOa8Z3$!.+;;!`K)Fq#:Wm!!'D+s475Np&>*F!!)Wj!IEArrrRKHHMd^Df)PgBrrMe\rVurM +rVult!8%2L!UR2js8N'!fD>LLli7$mmf*=\RJm0dfDYaL!!(XJrrUdP!<)p!3<3afs8N'!fDbdO +f)PgGrr<&ss8N'!fDPXK!<3!+BE4J#s-]ebs475Nr;R#R!!*'!H2qWms8E#ns88Pes7r=Ms*t~> +KE(rOa8Z4!!'0]O!gs$Kq#:WO!!(7Cs475Np&>*F!!)Zk!T?uSHN*sFm/6kbf)PgFrrDE`rr^k5 +!,2?2rr<&Nr;QcKqu?Zr!8%)I"3^`Fbjtc6m/6kcf/WhErVult!8%,J!nRDPrVlqW!!)forr<&N +rr3&O!!)fo!!)rsrr<&Nr;Q`srr3AA!!)BY3UHeGf)PgKrs73V!<<)l3<5tls8E#os8'5(s8'3b +s*t~> +KE(rOa8Z4!!'0]O!gs$Kq#:WO!!(7Cs475Np&>*F!!)Zk!T?uSHN*sFm/6kbf)PgFrrDE`rr^k5 +!,2?2rr<&Nr;QcKqu?Zr!8%)I"3^`Fbjtc6m/6kcf/WhErVult!8%,J!nRDPrVlqW!!)forr<&N +rr3&O!!)fo!!)rsrr<&Nr;Q`srr3AA!!)BY3UHeGf)PgKrs73V!<<)l3<5tls8E#os8&Dfs8&CK +s*t~> +KE(rOa8Z4!!'0]O!gs$Kq#:WO!!(7Cs475Np&>*F!!)Zk!T?uSHN*sFm/6kbf)PgFrrDE`rr^k5 +!,2?2rr<&Nr;QcKqu?Zr!8%)I"3^`Fbjtc6m/6kcf/WhErVult!8%,J!nRDPrVlqW!!)forr<&N +rr3&O!!)fo!!)rsrr<&Nr;Q`srr3AA!!)BY3UHeGf)PgKrs73V!<<)l3<5tls8E#os8&Dfs8&CK +s*t~> +KE(rOa8Z7W!!)!Nrr^jQ!9*bR!jhr+rr3&O!!)ip#42$_s475Nq>UK^p&=slRDA_"!dXj7r;QiM +!!)cn!2o_o!mCWErVult!8$oDrr<&NqYpVT!)rFf!2o_o!mCWErVult!8%,J!nRDPrVluO!!'h1 +s8N'!fDbdPi;`lNqYpT_3W/pW!!(XKrr<&trrc7#VmMlkrrUdP!;uiuf)PgMrr^jQ!6i7YrW)fp +q6pA(qR;F`J,~> +KE(rOa8Z7W!!)!Nrr^jQ!9*bR!jhr+rr3&O!!)ip#42$_s475Nq>UK^p&=slRDA_"!dXj7r;QiM +!!)cn!2o_o!mCWErVult!8$oDrr<&NqYpVT!)rFf!2o_o!mCWErVult!8%,J!nRDPrVluO!!'h1 +s8N'!fDbdPi;`lNqYpT_3W/pW!!(XKrr<&trrc7#VmMlkrrUdP!;uiuf)PgMrr^jQ!6i7YrW)fp +q4I`fqOifIJ,~> +KE(rOa8Z7W!!)!Nrr^jQ!9*bR!jhr+rr3&O!!)ip#42$_s475Nq>UK^p&=slRDA_"!dXj7r;QiM +!!)cn!2o_o!mCWErVult!8$oDrr<&NqYpVT!)rFf!2o_o!mCWErVult!8%,J!nRDPrVluO!!'h1 +s8N'!fDbdPi;`lNqYpT_3W/pW!!(XKrr<&trrc7#VmMlkrrUdP!;uiuf)PgMrr^jQ!6i7YrW)fp +q4I`fqOifIJ,~> +KE(rO`r?*=!.+G?#5,A's*=[5q>ULp!5SU6!nRDPq>UH%rr3&O!!)ip!4;b*!VKCfrr^%:3VE at N +!nRDPp\t4lqYpQr3W9!X!!(XIrrK%jrr;uu!8%,J"4mMQbjk]5;u6Lp!'1#Xrr<&Nqu6`L!!)rs +"*srGp%n^g!!(XLrrP1\fD>LJ^l/-jrr<&Nr;Q`srVm#9!'*(+rr3&O!!)rs!nRDPrVlu,!'0D^ +s8E#qs73XVs*t~> +KE(rO`r?*=!.+G?#5,A's*=[5q>ULp!5SU6!nRDPq>UH%rr3&O!!)ip!4;b*!VKCfrr^%:3VE at N +!nRDPp\t4lqYpQr3W9!X!!(XIrrK%jrr;uu!8%,J"4mMQbjk]5;u6Lp!'1#Xrr<&Nqu6`L!!)rs +"*srGp%n^g!!(XLrrP1\fD>LJ^l/-jrr<&Nr;Q`srVm#9!'*(+rr3&O!!)rs!nRDPrVlu,!'0D^ +s8E#qs72h?s*t~> +KE(rO`r?*=!.+G?#5,A's*=[5q>ULp!5SU6!nRDPq>UH%rr3&O!!)ip!4;b*!VKCfrr^%:3VE at N +!nRDPp\t4lqYpQr3W9!X!!(XIrrK%jrr;uu!8%,J"4mMQbjk]5;u6Lp!'1#Xrr<&Nqu6`L!!)rs +"*srGp%n^g!!(XLrrP1\fD>LJ^l/-jrr<&Nr;Q`srVm#9!'*(+rr3&O!!)rs!nRDPrVlu,!'0D^ +s8E#qs72h?s*t~> +KE(rO`r?/"3<6kkrs8:cp&G'bBE7#grrTP-RJm-ef)PgIrrM)Vrr3&O!!)lq!TBsUs8TJ%rrP1\ +[/L"+f)PgFrrE,8r;Qib!1Efcrr<&Nqu6]URJm0c!!(XKrr_q-!1Efc!qiqZp\t6o_#436li +KE(rO`r?/"3<6kkrs8:cp&G'bBE7#grrTP-RJm-ef)PgIrrM)Vrr3&O!!)lq!TBsUs8TJ%rrP1\ +[/L"+f)PgFrrE,8r;Qib!1Efcrr<&Nqu6]URJm0c!!(XKrr_q-!1Efc!qiqZp\t6o_#436li +KE(rO`r?/"3<6kkrs8:cp&G'bBE7#grrTP-RJm-ef)PgIrrM)Vrr3&O!!)lq!TBsUs8TJ%rrP1\ +[/L"+f)PgFrrE,8r;Qib!1Efcrr<&Nqu6]URJm0c!!(XKrr_q-!1Efc!qiqZp\t6o_#436li +KE(rO`W$)"BE3tWrVlrCRJ$OY"8-t#bl7VEos=^sr;QlC!!)]irrV.miVriZbQ%Y9r;R#\B]9!k +i;hL*rr[QI3VECO"3^`Fp%\Re!!'D*rr_qPB_DB)"8)Wobl%JBiAo-]rr_oo!8%2L"2HoW[/Bq* +ZiF&!s8N'![/U(-oo!MVrr3)n!!'h3rr^%:!;69i"SJ/_HIr,q"3^`FiVicZom-VFp&=smf4_tt +rr_oo!6kEA!qcQdrVlr+!8%2L"3^`Fp&4mmbQ%Y9rVm#n3<3ac_uK]9rVuN!LAuc~> +KE(rO`W$)"BE3tWrVlrCRJ$OY"8-t#bl7VEos=^sr;QlC!!)]irrV.miVriZbQ%Y9r;R#\B]9!k +i;hL*rr[QI3VECO"3^`Fp%\Re!!'D*rr_qPB_DB)"8)Wobl%JBiAo-]rr_oo!8%2L"2HoW[/Bq* +ZiF&!s8N'![/U(-oo!MVrr3)n!!'h3rr^%:!;69i"SJ/_HIr,q"3^`FiVicZom-VFp&=smf4_tt +rr_oo!6kEA!qcQdrVlr+!8%2L"3^`Fp&4mmbQ%Y9rVm#n3<3ac_uK]9rVuM_LAuc~> +KE(rO`W$)"BE3tWrVlrCRJ$OY"8-t#bl7VEos=^sr;QlC!!)]irrV.miVriZbQ%Y9r;R#\B]9!k +i;hL*rr[QI3VECO"3^`Fp%\Re!!'D*rr_qPB_DB)"8)Wobl%JBiAo-]rr_oo!8%2L"2HoW[/Bq* +ZiF&!s8N'![/U(-oo!MVrr3)n!!'h3rr^%:!;69i"SJ/_HIr,q"3^`FiVicZom-VFp&=smf4_tt +rr_oo!6kEA!qcQdrVlr+!8%2L"3^`Fp&4mmbQ%Y9rVm#n3<3ac_uK]9rVuM_LAuc~> +KE(rO_uBtWR8[%1R at 1kdrrL`0rd"WZVsOB^"kU+A!!#srH4"'\Ys8VGmBE/#mrH\]^!'1)Zm'LI*!![+_H;f-s +p&"ajf/]c'ru?s at VeCC&BXII4s6R++!!#$WfDkm&V`=_WBXI.(rsA&!H>%VNBT'7jqYpf9M`H*0 +BURKNrt=\*BE/#m[+FZO;ZLL[dh!<3#i +[tap5~> +KE(rO_uBtWR8[%1R at 1kdrrL`0rd"WZVsOB^"kU+A!!#srH4"'\Ys8VGmBE/#mrH\]^!'1)Zm'LI*!![+_H;f-s +p&"ajf/]c'ru?s at VeCC&BXII4s6R++!!#$WfDkm&V`=_WBXI.(rsA&!H>%VNBT'7jqYpf9M`H*0 +BURKNrt=\*BE/#m[+FZO;ZLL[dh!<3#i +TSEJs~> +KE(rO_uBtWR8[%1R at 1kdrrL`0rd"WZVsOB^"kU+A!!#srH4"'\Ys8VGmBE/#mrH\]^!'1)Zm'LI*!![+_H;f-s +p&"ajf/]c'ru?s at VeCC&BXII4s6R++!!#$WfDkm&V`=_WBXI.(rsA&!H>%VNBT'7jqYpf9M`H*0 +BURKNrt=\*BE/#m[+FZO;ZLL[dh!<3#i +TSEJs~> +KE(rOJcC<$L&_,P!<;PtL];l~> +KE(rOJcC<$L&_,P!<;P]L];l~> +KE(rOJcC<$L&_,P!<;P]L];l~> +KE(rOJcC<$L&_,Pn$e)PJ,~> +KE(rOJcC<$L&_,Pn">I9J,~> +KE(rOJcC<$L&_,Pn">I9J,~> +KE(rOJcC<$L&_/QmC.oOJ,~> +KE(rOJcC<$L&_/Qm@]:8J,~> +KE(rOJcC<$L&_/Qm@]:8J,~> +KE(rOJcC<$L&V,Qm'hfNJ,~> +KE(rOJcC<$L&V,Qm%B17J,~> +KE(rOJcC<$L&V,Qm%B17J,~> +KE(rOJcC<$L&V,QmC.lNJ,~> +KE(rOJcC<$L&V,Qm@]77J,~> +KE(rOJcC<$L&V,Qm@]77J,~> +KE(rOJcC<$L&V,QpU>_RrVqB~> +KE(rOJcC<$L&V,QpRm*;rVqB~> +KE(rOJcC<$L&V,QpRm*;rVqB~> +KE(rOJcC<$L&_,PJcGECJ,~> +KE(rOJcC<$L&_,PJcGECJ,~> +KE(rOJcC<$L&_,PJcGECJ,~> +KE(rOJcC<$L&_,PJcGECJ,~> +KE(rOJcC<$L&_,PJcGECJ,~> +KE(rOJcC<$L&_,PJcGECJ,~> +KE(rOJcC<$L&_,PJcGECJ,~> +KE(rOJcC<$L&_,PJcGECJ,~> +KE(rOJcC<$L&_,PJcGECJ,~> +KE(rOJcC<$L&_,PJcGECJ,~> +KE(rOJcC<$L&_,PJcGECJ,~> +KE(rOJcC<$L&_,PJcGECJ,~> +KE(rOJcC<$L&_,PJcGECJ,~> +KE(rOJcC<$L&_,PJcGECJ,~> +KE(rOJcC<$L&_,PJcGECJ,~> +KE(rOSc8i:HF/"MqYpT'Mp;8&R/ls\!LWrHrrpW7H>&`*r;QbTq>^d]s8Vb[3<3a.p\tBJV`=_W +r-AEX!.+MA$1+'nH?tLIiRbH.s8E"Ls7QDB~> +KE(rOSc8i:HF/"MqYpT'Mp;8&R/ls\!LWrHrrpW7H>&`*r;QbTq>^d]s8Vb[3<3a.p\tBJV`=_W +r-AEX!.+MA$1+'nH?tLIiRbH.s8E"Ls7QDB~> +KE(rOSc8i:HF/"MqYpT'Mp;8&R/ls\!LWrHrrpW7H>&`*r;QbTq>^d]s8Vb[3<3a.p\tBJV`=_W +r-AEX!.+MA$1+'nH?tLIiRbH.s8E"Ls7QDB~> +KE(rOT)T#H!6kJY3T9o9!pikYli-t:jo5Ct!!)cn!l+d9ir98!B_DDuR5s7*rrDE]!"#(nof8GI +H2mrPpAY3 +KE(rOT)T#H!6kJY3T9o9!pikYli-t:jo5Ct!!)cn!l+d9ir98!B_DDuR5s7*rrDE]!"#(nof8GI +H2mrPpAY3 +KE(rOT)T#H!6kJY3T9o9!pikYli-t:jo5Ct!!)cn!l+d9ir98!B_DDuR5s7*rrDE]!"#(nof8GI +H2mrPpAY3 +KE(rOT)T"Q!<<)c!1Ecb!IDuTrr?![rr_Ud!!)fo"7/qd!:p-iHLq. +KE(rOT)T"Q!<<)c!1Ecb!IDuTrr?![rr_Ud!!)fo"7/qd!:p-iHLq. +KE(rOT)T"Q!<<)c!1Ecb!IDuTrr?![rr_Ud!!)fo"7/qd!:p-iHLq. +KE(rOT)SgO!<3!!!)rjr!ORdMrrKJ,k5PNsf)PgGrrZrd!!)Ti!!)Wj!LWrcrrnej_#OGAqu6f7 +3WK- +KE(rOT)SgO!<3!!!)rjr!ORdMrrKJ,k5PNsf)PgGrrZrd!!)Ti!!)Wj!LWrcrrnej_#OGAqu6f7 +3WK- +KE(rOT)SgO!<3!!!)rjr!ORdMrrKJ,k5PNsf)PgGrrZrd!!)Ti!!)Wj!LWrcrrnej_#OGAqu6f7 +3WK- +KE(rOT)\fjrr;uurr3&d;t]JV!l+d9kPk[_[/U++q>USq[/U++o)A[ioD\hO!;uiu^]8]UrrJ%G +q>UHqRJ-X^f)PgErr_Tf!6k6 +KE(rOT)\fjrr;uurr3&d;t]JV!l+d9kPk[_[/U++q>USq[/U++o)A[ioD\hO!;uiu^]8]UrrJ%G +q>UHqRJ-X^f)PgErr_Tf!6k6 +KE(rOT)\fjrr;uurr3&d;t]JV!l+d9kPk[_[/U++q>USq[/U++o)A[ioD\hO!;uiu^]8]UrrJ%G +q>UHqRJ-X^f)PgErr_Tf!6k6 +KE(rOT)Sgi!<3!!!,2B3!IDu\rrBG*H4cQYs0R(P!.&t,s4UNh!6k<>!nUBDpAY3G!!)rs!VNhurrTP-!;HKnoq)3_!.k1Cs*t~> +KE(rOT)Sgi!<3!!!,2B3!IDu\rrBG*H4cQYs0R(P!.&t,s4UNh!6k<>!nUBDpAY3G!!)rs!VNhurrTP-!;HKnoq)3_!.k1Cs*t~> +KE(rOT)Sgi!<3!!!,2B3!IDu\rrBG*H4cQYs0R(P!.&t,s4UNh!6k<>!nUBDpAY3G!!)rs!VNhurrTP-!;HKnoq)3_!.k1Cs*t~> +KE(rOT)T/)!:9a;!4;e+[&MZ6h;saPa!!)or#5(p] +s8N'!o)A[ioD\kj!6kEA!nRDPq>UK23VraWltEd!rrUdP!;uls[/L"+H2qWBs8E"Ls7QDB~> +KE(rOT)T/)!:9a;!4;e+[&MZ6h;saPa!!)or#5(p] +s8N'!o)A[ioD\kj!6kEA!nRDPq>UK23VraWltEd!rrUdP!;uls[/L"+H2qWBs8E"Ls7QDB~> +KE(rOT)T/)!:9a;!4;e+[&MZ6h;saPa!!)or#5(p] +s8N'!o)A[ioD\kj!6kEA!nRDPq>UK23VraWltEd!rrUdP!;uls[/L"+H2qWBs8E"Ls7QDB~> +KE(rOT)T/jBXIf-B_DDaB_Crr!BI(Vrr?a3s8N)ss8N'$[/\ano`"r +KE(rOT)T/jBXIf-B_DDaB_Crr!BI(Vrr?a3s8N)ss8N'$[/\ano`"r +KE(rOT)T/jBXIf-B_DDaB_Crr!BI(Vrr?a3s8N)ss8N'$[/\ano`"r +KE(rOSGrZ+[(u\@#\_iis4<[:Mq at b(!WY6rrr2uMrr;uur;Zcsnc&WsVu?Yq!;uit[& +KE(rOSGrZ+[(u\@#\_iis4<[:Mq at b(!WY6rrr2uMrr;uur;Zcsnc&WsVu?Yq!;uit[& +KE(rOSGrZ+[(u\@#\_iis4<[:Mq at b(!WY6rrr2uMrr;uur;Zcsnc&WsVu?Yq!;uit[& +KE(rOQi at E"VuQeU!5SWY!8%&H"K)5";o&>2rrDusrrDWi!T at _is8N)trrM(lr;Zcso)A[io)B!S +MZ +KE(rOQi at E"VuQeU!5SWY!8%&H"K)5";o&>2rrDusrrDWi!T at _is8N)trrM(lr;Zcso)A[io)B!S +MZ +KE(rOQi at E"VuQeU!5SWY!8%&H"K)5";o&>2rrDusrrDWi!T at _is8N)trrM(lr;Zcso)A[io)B!S +MZ +KE(rOR/[QQ;t^1jMZEGMrr at uPrrpVF!!#%'rr;uur;Zcso)A]9pAb9Hs*FD>!8$oD!!)Ed!nRE4 +q>UJAVt^2mo`,!drrUdP!;lcrfDY^NMZ?\>s7u_Hs7u\F~> +KE(rOR/[QQ;t^1jMZEGMrr at uPrrpVF!!#%'rr;uur;Zcso)A]9pAb9Hs*FD>!8$oD!!)Ed!nRE4 +q>UJAVt^2mo`,!drrUdP!;lcrfDY^NMZ?\>s7u_Hs7u\F~> +KE(rOR/[QQ;t^1jMZEGMrr at uPrrpVF!!#%'rr;uur;Zcso)A]9pAb9Hs*FD>!8$oD!!)Ed!nRE4 +q>UJAVt^2mo`,!drrUdP!;lcrfDY^NMZ?\>s7u_Hs7u\F~> +KE(rOR/[2#fDbdN3<9'YrrDcm#f'@=!6kKC!!)rsrrDWi!2o^?rrE(F!oa0Wqg/8Bs*=\(p&>!l +mJd66!6k<>!pfpGpAY/>3VWOTf)PgErr^%:!9'1Bp],mFqu;0~> +KE(rOR/[2#fDbdN3<9'YrrDcm#f'@=!6kKC!!)rsrrDWi!2o^?rrE(F!oa0Wqg/8Bs*=\(p&>!l +mJd66!6k<>!pfpGpAY/>3VWOTf)PgErr^%:!9'1Bp],mFqu;0~> +KE(rOR/[2#fDbdN3<9'YrrDcm#f'@=!6kKC!!)rsrrDWi!2o^?rrE(F!oa0Wqg/8Bs*=\(p&>!l +mJd66!6k<>!pfpGpAY/>3VWOTf)PgErr^%:!9'1Bp],mFqu;0~> +KE(rORK!;pVu?Vr3<9'YrrDlp!2oeq#+5ILs8N'!r;Zcsli6tbpAb-mo)A[imf*@(!1EZ_!OPeu +rrHf$p\t +KE(rORK!;pVu?Vr3<9'YrrDlp!2oeq#+5ILs8N'!r;Zcsli6tbpAb-mo)A[imf*@(!1EZ_!OPeu +rrHf$p\t +KE(rORK!;pVu?Vr3<9'YrrDlp!2oeq#+5ILs8N'!r;Zcsli6tbpAb-mo)A[imf*@(!1EZ_!OPeu +rrHf$p\t +KE(rORf +KE(rORf +KE(rORf +KE(rORf +KE(rORf +KE(rORf +KE(rOS,WMrVu$Drb^-XBbl.PLV`EB/s*C)HH?tM.rr3>W;`V5b^j5t\BXI1,rrDcmrrD*Z"MhC& +[.X1n!OPf&rs#B"!!%>Pp%SIif +KE(rOS,WMrVu$Drb^-XBbl.PLV`EB/s*C)HH?tM.rr3>W;`V5b^j5t\BXI1,rrDcmrrD*Z"MhC& +[.X1n!OPf&rs#B"!!%>Pp%SIif +KE(rOS,WMrVu$Drb^-XBbl.PLV`EB/s*C)HH?tM.rr3>W;`V5b^j5t\BXI1,rrDcmrrD*Z"MhC& +[.X1n!OPf&rs#B"!!%>Pp%SIif +KE(rOJcC<$L&_,P!<;TiL&ZZ~> +KE(rOJcC<$L&_,P!<;TiL&ZZ~> +KE(rOJcC<$L&_,P!<;TiL&ZZ~> +KE(rOJcG0 +KE(rOJcG0 +KE(rOJcG0 +KE(rOJcG0 +KE(rOJcG0 +KE(rOJcG0 +KE(rOJcC<$L&_,Ps8VWiLAuc~> +KE(rOJcC<$L&_,Ps8VWiLAuc~> +KE(rOJcC<$L&_,Ps8VWiLAuc~> +KE(rOJcC<$L&_,Prr;TjL&ZZ~> +KE(rOJcC<$L&_,Prr;TjL&ZZ~> +KE(rOJcC<$L&_,Prr;TjL&ZZ~> +KE(rOJcC<$L&_,Prr;WkK`?Q~> +KE(rOJcC<$L&_,Prr;WkK`?Q~> +KE(rOJcC<$L&_,Prr;WkK`?Q~> +KE(rOJcC<$L&_,PrVuTlKE$H~> +KE(rOJcC<$L&_,PrVuTlKE$H~> +KE(rOJcC<$L&_,PrVuTlKE$H~> +KE(rOJcC<$L&_,PrVuTlKE$H~> +KE(rOJcC<$L&_,PrVuTlKE$H~> +KE(rOJcC<$L&_,PrVuTlKE$H~> +KE(rOJcC<$L&_,Pr;ZKkK`?Q~> +KE(rOJcC<$L&_,Pr;ZKkK`?Q~> +KE(rOJcC<$L&_,Pr;ZKkK`?Q~> +KE(rOJcC<$L&_,Pr;ZWo!<;utL&ZZ~> +KE(rOJcC<$L&_,Pr;ZWo!<;utL&ZZ~> +KE(rOJcC<$L&_,Pr;ZWo!<;utL&ZZ~> +KE(rOJcC<$L&_,Pqu?Tps8W#tL&ZZ~> +KE(rOJcC<$L&_,Pqu?Tps8W#tL&ZZ~> +KE(rOJcC<$L&_,Pqu?Tps8W#tL&ZZ~> +KE(rOJcC<$L&_,PqZ$QqrVufrLAuc~> +KE(rOJcC<$L&_,PqZ$QqrVufrLAuc~> +KE(rOJcC<$L&_,PqZ$QqrVufrLAuc~> +KE(rOhuUK&RIL7V!;h'K;ZHg)s0QG>!2o_o#4/^1!,/b+rr3/GR +KE(rOhuUK&RIL7V!;h'K;ZHg)s0QG>!2o_o#4/^1!,/b+rr3/GR +KE(rOhuUK&RIL7V!;h'K;ZHg)s0QG>!2o_o#4/^1!,/b+rr3/GR +KE(rOi;X#?!5SWM!9*hT!o[hcnG`Mfm/6kcof3"crVltf!!'h2rrVinp&4mq^hEE at opIi!PQ(m' +B_DDuR5s61rrC[5rr_oo!8%/K!R,lHs8E#is8;qQs*t~> +KE(rOi;X#?!5SWM!9*hT!o[hcnG`Mfm/6kcof3"crVltf!!'h2rrVinp&4mq^hEE at opIi!PQ(m' +B_DDuR5s61rrC[5rr_oo!8%/K!R,lHs8E#is8;qQs*t~> +KE(rOi;X#?!5SWM!9*hT!o[hcnG`Mfm/6kcof3"crVltf!!'h2rrVinp&4mq^hEE at opIi!PQ(m' +B_DDuR5s61rrC[5rr_oo!8%/K!R,lHs8E#is8;qQs*t~> +KE(rOi;X"L!:9aP!1Ecb!qg6cnG`O@[/9k*H2otar;Z`r!9*eS!!)ut!nRFrrr3&m3E)1B!nRFr +rr3&m3E*0^!)r"Zrr<&Nqu6YahZ*QTo)J[hL];l~> +KE(rOi;X"L!:9aP!1Ecb!qg6cnG`O@[/9k*H2otar;Z`r!9*eS!!)ut!nRFrrr3&m3E)1B!nRFr +rr3&m3E*0^!)r"Zrr<&Nqu6YahZ*QTo)J[hL];l~> +KE(rOi;X"L!:9aP!1Ecb!qg6cnG`O@[/9k*H2otar;Z`r!9*eS!!)ut!nRFrrr3&m3E)1B!nRFr +rr3&m3E*0^!)r"Zrr<&Nqu6YahZ*QTo)J[hL];l~> +KE(rOi;WgV!<3!!!)rgq!K4b^s8U^Krr]V.!4;Y'"9<*83UHYC!!)ut!LWrcrrSSg^m4p#R/m0b +!gs&(ZMss4!9O7\!!(XJrrC:"s8E#hs8;qRs*t~> +KE(rOi;WgV!<3!!!)rgq!K4b^s8U^Krr]V.!4;Y'"9<*83UHYC!!)ut!LWrcrrSSg^m4p#R/m0b +!gs&(ZMss4!9O7\!!(XJrrC:"s8E#hs8;qRs*t~> +KE(rOi;WgV!<3!!!)rgq!K4b^s8U^Krr]V.!4;Y'"9<*83UHYC!!)ut!LWrcrrSSg^m4p#R/m0b +!gs&(ZMss4!9O7\!!(XJrrC:"s8E#hs8;qRs*t~> +KE(rOi;`fWrr;uurVlo*Ms10Clo>&lqYp^!lo>&Zp&+gi!<)ou3<9!W!l+e^Q2^kF!;uiu^]8\e +rrTt9!9O7\!!(X&s8E#gs8E"Ss*t~> +KE(rOi;`fWrr;uurVlo*Ms10Clo>&lqYp^!lo>&Zp&+gi!<)ou3<9!W!l+e^Q2^kF!;uiu^]8\e +rrTt9!9O7\!!(X&s8E#gs8E"Ss*t~> +KE(rOi;`fWrr;uurVlo*Ms10Clo>&lqYp^!lo>&Zp&+gi!<)ou3<9!W!l+e^Q2^kF!;uiu^]8\e +rrTt9!9O7\!!(X&s8E#gs8E"Ss*t~> +KE(rOi;Wgk!<3!!!,2B3!o[hckl1a2!'0EBrriE&i;`k(r;Q`srVultr;QiM!'03A"mhYaR:shC +rtOgf3WJc?;`UcUs1ip\!<<)NMZ +KE(rOi;Wgk!<3!!!,2B3!o[hckl1a2!'0EBrriE&i;`k(r;Q`srVultr;QiM!'03A"mhYaR:shC +rtOgf3WJc?;`UcUs1ip\!<<)NMZ +KE(rOi;Wgk!<3!!!,2B3!o[hckl1a2!'0EBrriE&i;`k(r;Q`srVultr;QiM!'03A"mhYaR:shC +rtOgf3WJc?;`UcUs1ip\!<<)NMZ +KE(rOi;X1l!8%8&!4;e+ok<=Jrr]V.!5SF1"p"]'^]4A&rVlitrVlpt!6kEA!nRDPkPl7T3OJhd +R/g03Mnk5N!9%UuZoJ,nrr;uurVultnc&j03T:#srr;uu!8%2Ls0UV^rW)HfrW%fTJ,~> +KE(rOi;X1l!8%8&!4;e+ok<=Jrr]V.!5SF1"p"]'^]4A&rVlitrVlpt!6kEA!nRDPkPl7T3OJhd +R/g03Mnk5N!9%UuZoJ,nrr;uurVultnc&j03T:#srr;uu!8%2Ls0UV^rW)HfrW%fTJ,~> +KE(rOi;X1l!8%8&!4;e+ok<=Jrr]V.!5SF1"p"]'^]4A&rVlitrVlpt!6kEA!nRDPkPl7T3OJhd +R/g03Mnk5N!9%UuZoJ,nrr;uurVultnc&j03T:#srr;uu!8%2Ls0UV^rW)HfrW%fTJ,~> +KE(rOi;X/WBUSmgB_DE*RC)2X"5u6?Mtm;P!<3!#VZ6_4rr2rurVlqe!1Efc!l+e7kPkdF!;6Bl +i;ef7s8N'!VuH\tbQ)>Us8N)ts8N)irrVNe_#F?8ZiGFOrs&-V!8$mBiV`][of3$(oi'iJrrSSg +RJm-p^]7=5s7H?l_#OH$!)rjrrrE#trrE&u$2"8u_#OH$!!'D*rrUdPB_)0.MZEGMs5 +KE(rOi;X/WBUSmgB_DE*RC)2X"5u6?Mtm;P!<3!#VZ6_4rr2rurVlqe!1Efc!l+e7kPkdF!;6Bl +i;ef7s8N'!VuH\tbQ)>Us8N)ts8N)irrVNe_#F?8ZiGFOrs&-V!8$mBiV`][of3$(oi'iJrrSSg +RJm-p^]7=5s7H?l_#OH$!)rjrrrE#trrE&u$2"8u_#OH$!!'D*rrUdPB_)0.MZEGMs5 +KE(rOi;X/WBUSmgB_DE*RC)2X"5u6?Mtm;P!<3!#VZ6_4rr2rurVlqe!1Efc!l+e7kPkdF!;6Bl +i;ef7s8N'!VuH\tbQ)>Us8N)ts8N)irrVNe_#F?8ZiGFOrs&-V!8$mBiV`][of3$(oi'iJrrSSg +RJm-p^]7=5s7H?l_#OH$!)rjrrrE#trrE&u$2"8u_#OH$!!'D*rrUdPB_)0.MZEGMs5 +KE(rOhZ!Ym[(u\@!R,lhrrgr3R at 2[qrrZp73VE1I!!)ut#+5GkfDkjNrVm2j3<6Gds1hP5Ms(-? +!<)rt!<)rt!;uls!<3#u!<)rt!:p-kR/lpYrrKporVm#E!)nfkqYp]B!)nfkr;R)i3<6Gds1hP5 +MuNbV!<)rt!<)rt!<)rt!<)rt!<)rt!;uls!:p0i!<)rt!<3!!M`L`^##bL%s8N'!nc&WX!<)p! +ot]qns8N'!fDY^MRC(fMrW)EerW%iUJ,~> +KE(rOhZ!Ym[(u\@!R,lhrrgr3R at 2[qrrZp73VE1I!!)ut#+5GkfDkjNrVm2j3<6Gds1hP5Ms(-? +!<)rt!<)rt!;uls!<3#u!<)rt!:p-kR/lpYrrKporVm#E!)nfkqYp]B!)nfkr;R)i3<6Gds1hP5 +MuNbV!<)rt!<)rt!<)rt!<)rt!<)rt!;uls!:p0i!<)rt!<3!!M`L`^##bL%s8N'!nc&WX!<)p! +ot]qns8N'!fDY^MRC(fMrW)EerW%iUJ,~> +KE(rOhZ!Ym[(u\@!R,lhrrgr3R at 2[qrrZp73VE1I!!)ut#+5GkfDkjNrVm2j3<6Gds1hP5Ms(-? +!<)rt!<)rt!;uls!<3#u!<)rt!:p-kR/lpYrrKporVm#E!)nfkqYp]B!)nfkr;R)i3<6Gds1hP5 +MuNbV!<)rt!<)rt!<)rt!<)rt!<)rt!;uls!:p0i!<)rt!<3!!M`L`^##bL%s8N'!nc&WX!<)p! +ot]qns8N'!fDY^MRC(fMrW)EerW%iUJ,~> +KE(rOg&DHH;t^1jf)X%p^].ZrrE+Gq#C?onc&VM!;HNn!!(XLrrMJnh>dHSn,N=dMuS;~> +KE(rOg&DHH;t^1jf)X%p^].ZrrE+Gq#C?onc&VM!;HNn!!(XLrrMJnh>dHSn,N=dMuS;~> +KE(rOg&DHH;t^1jf)X%p^].ZrrE+Gq#C?onc&VM!;HNn!!(XLrrMJnh>dHSn,N=dMuS;~> +KE(rOg&D(dfDbdSMZEeWli;t7rr_3[!1EQ\!!)rs"nakUB_;B"rrUdP3Tg>HR/kJ2s6K`RrVult +r;Zcsrr;uurVulto)J^i!;6'c"8)WofD5FKo`,!DpAY3G!'1#XrrE#trrE#trrE#trrE#trrE#t +rrDusrrDWi#FPS9s8VEcRK!3e!,20-rrDThrrDfnrr<&Nr;QcKh>dHSmf37dMuS;~> +KE(rOg&D(dfDbdSMZEeWli;t7rr_3[!1EQ\!!)rs"nakUB_;B"rrUdP3Tg>HR/kJ2s6K`RrVult +r;Zcsrr;uurVulto)J^i!;6'c"8)WofD5FKo`,!DpAY3G!'1#XrrE#trrE#trrE#trrE#trrE#t +rrDusrrDWi#FPS9s8VEcRK!3e!,20-rrDThrrDfnrr<&Nr;QcKh>dHSmf37dMuS;~> +KE(rOg&D(dfDbdSMZEeWli;t7rr_3[!1EQ\!!)rs"nakUB_;B"rrUdP3Tg>HR/kJ2s6K`RrVult +r;Zcsrr;uurVulto)J^i!;6'c"8)WofD5FKo`,!DpAY3G!'1#XrrE#trrE#trrE#trrE#trrE#t +rrDusrrDWi#FPS9s8VEcRK!3e!,20-rrDThrrDfnrr<&Nr;QcKh>dHSmf37dMuS;~> +KE(rOgAh2[rVultrr3!!3V*1PBE2!(pAY*mqu6fX3<4@*p\t;@!6jU*#PDbDm/NJep&4pj!;uls +!<3#u!<)rt!:p-k;ZOW2rrMKZrVm"gZiF%tqYp\dZiF%tp\t;@!6kEArrE#trrE#trrE#trrE#t +rrE#trrDusrrDWi#PDbDm/NJep&=sm3<8FDrrh<\rr<&hrrP1\bl%JFm.LDY!!(X&s8E#ds8E"V +s*t~> +KE(rOgAh2[rVultrr3!!3V*1PBE2!(pAY*mqu6fX3<4@*p\t;@!6jU*#PDbDm/NJep&4pj!;uls +!<3#u!<)rt!:p-k;ZOW2rrMKZrVm"gZiF%tqYp\dZiF%tp\t;@!6kEArrE#trrE#trrE#trrE#t +rrE#trrDusrrDWi#PDbDm/NJep&=sm3<8FDrrh<\rr<&hrrP1\bl%JFm.LDY!!(X&s8E#ds8E"V +s*t~> +KE(rOgAh2[rVultrr3!!3V*1PBE2!(pAY*mqu6fX3<4@*p\t;@!6jU*#PDbDm/NJep&4pj!;uls +!<3#u!<)rt!:p-k;ZOW2rrMKZrVm"gZiF%tqYp\dZiF%tp\t;@!6kEArrE#trrE#trrE#trrE#t +rrE#trrDusrrDWi#PDbDm/NJep&=sm3<8FDrrh<\rr<&hrrP1\bl%JFm.LDY!!(X&s8E#ds8E"V +s*t~> +KE(rOg]%<+B`.o1!<3!!!'0ZN"/c,!fD>LI[/L")!;c]q_#=?/rrTt9RH4DHZiJ>Is8N)ss8N)u +s8N)ts8N)irrSSgHMmdCRJm0cZig>d!2o_os0Mn.MZB[MrrTt9RJd*b!<)rt!<)rt!<)rt!<)rt +!<)rt!;uls!:g*fZiJ>JrrS)YMuEYZoo&kM!!)Qh!fI&)r;Qbbrr;uu!8%)I!N5VKs8E#cs8E"W +s*t~> +KE(rOg]%<+B`.o1!<3!!!'0ZN"/c,!fD>LI[/L")!;c]q_#=?/rrTt9RH4DHZiJ>Is8N)ss8N)u +s8N)ts8N)irrSSgHMmdCRJm0cZig>d!2o_os0Mn.MZB[MrrTt9RJd*b!<)rt!<)rt!<)rt!<)rt +!<)rt!;uls!:g*fZiJ>JrrS)YMuEYZoo&kM!!)Qh!fI&)r;Qbbrr;uu!8%)I!N5VKs8E#cs8E"W +s*t~> +KE(rOg]%<+B`.o1!<3!!!'0ZN"/c,!fD>LI[/L")!;c]q_#=?/rrTt9RH4DHZiJ>Is8N)ss8N)u +s8N)ts8N)irrSSgHMmdCRJm0cZig>d!2o_os0Mn.MZB[MrrTt9RJd*b!<)rt!<)rt!<)rt!<)rt +!<)rt!;uls!:g*fZiJ>JrrS)YMuEYZoo&kM!!)Qh!fI&)r;Qbbrr;uu!8%)I!N5VKs8E#cs8E"W +s*t~> +KE(rOh#@HK;saG^#)`K]s7HAMo`#$F!!&qnrrMJ4rVlitq>UN'!!)ip!oZ/-jSo7YRJ6a]!;uls +!<3!'BE7#ks1eU7o)AgD!!&Gds8TJ*rs-c+s8VaP!6kEA#L&,+s7JAPbkh>@iAm>'s8N)ts8N)t +rs)I&m/R+$!!)utrrE#trrDusrrDWi!N2@\rt!]]!1E3Rm#/[Zrr<'!s6TCX"4mMQVuH\sVmQI' +rr<&Nqu6]URG\&D!:Bgc!0$r.~> +KE(rOh#@HK;saG^#)`K]s7HAMo`#$F!!&qnrrMJ4rVlitq>UN'!!)ip!oZ/-jSo7YRJ6a]!;uls +!<3!'BE7#ks1eU7o)AgD!!&Gds8TJ*rs-c+s8VaP!6kEA#L&,+s7JAPbkh>@iAm>'s8N)ts8N)t +rs)I&m/R+$!!)utrrE#trrDusrrDWi!N2@\rt!]]!1E3Rm#/[Zrr<'!s6TCX"4mMQVuH\sVmQI' +rr<&Nqu6]URG\&D!:Bgc!0$r.~> +KE(rOh#@HK;saG^#)`K]s7HAMo`#$F!!&qnrrMJ4rVlitq>UN'!!)ip!oZ/-jSo7YRJ6a]!;uls +!<3!'BE7#ks1eU7o)AgD!!&Gds8TJ*rs-c+s8VaP!6kEA#L&,+s7JAPbkh>@iAm>'s8N)ts8N)t +rs)I&m/R+$!!)utrrE#trrDusrrDWi!N2@\rt!]]!1E3Rm#/[Zrr<'!s6TCX"4mMQVuH\sVmQI' +rr<&Nqu6]URG\&D!:Bgc!0$r.~> +KE(rOh#@D$bkqDEf)X%pbQ-8frri!n!,2'&rrVk,[/U(,o`4[\rrJMfqYpW(;mbTb!]^6ZrH\LB +fDbgM!!)]krrVin!<3!)ZiF%3HGBL\Mnnra%&X(*;gMAUp&G'N3VECO#f$F#p&G'N3VECO"2Fms +p&+gkZr=@/rrVin!<)rt!!)]krsbk+BXE*$!!%qms7H?lrVult!;6?k!qcNno)AbO!)riB!N4QK +rrAJb!!&Gdrrd!8[(s'?rs"kk!)n2(B`A#6o`,!9r;QiW3R$C\rW)?cr;_iWJ,~> +KE(rOh#@D$bkqDEf)X%pbQ-8frri!n!,2'&rrVk,[/U(,o`4[\rrJMfqYpW(;mbTb!]^6ZrH\LB +fDbgM!!)]krrVin!<3!)ZiF%3HGBL\Mnnra%&X(*;gMAUp&G'N3VECO#f$F#p&G'N3VECO"2Fms +p&+gkZr=@/rrVin!<)rt!!)]krsbk+BXE*$!!%qms7H?lrVult!;6?k!qcNno)AbO!)riB!N4QK +rrAJb!!&Gdrrd!8[(s'?rs"kk!)n2(B`A#6o`,!9r;QiW3R$C\rW)?cr;_iWJ,~> +KE(rOh#@D$bkqDEf)X%pbQ-8frri!n!,2'&rrVk,[/U(,o`4[\rrJMfqYpW(;mbTb!]^6ZrH\LB +fDbgM!!)]krrVin!<3!)ZiF%3HGBL\Mnnra%&X(*;gMAUp&G'N3VECO#f$F#p&G'N3VECO"2Fms +p&+gkZr=@/rrVin!<)rt!!)]krsbk+BXE*$!!%qms7H?lrVult!;6?k!qcNno)AbO!)riB!N4QK +rrAJb!!&Gdrrd!8[(s'?rs"kk!)n2(B`A#6o`,!9r;QiW3R$C\rW)?cr;_iWJ,~> +KE(rOh>[M_Vtp>qb^-XBbk1o;VZ6]qqKi/A#gE>8ZtKG<[-[\i!VL.)rrg-EMmW0:rrC[H!#N#o +H2mqk_#Lcf!!%>ss8SJe;p>8%RGm]9-,=0o3N)QMs4972VuQe`MZ<`U^t1RHVuQe`MZ<`U_#M3W +MmW0Ss!kg1!!%r/f8BV/HGKR\opGenfDdk!iW$]>!!%r/f8BV/HGKQrH2mqkfC](CfD,CH[/U(. +^h<^H[/L",iDVbDnc'$5BE1u +KE(rOh>[M_Vtp>qb^-XBbk1o;VZ6]qqKi/A#gE>8ZtKG<[-[\i!VL.)rrg-EMmW0:rrC[H!#N#o +H2mqk_#Lcf!!%>ss8SJe;p>8%RGm]9-,=0o3N)QMs4972VuQe`MZ<`U^t1RHVuQe`MZ<`U_#M3W +MmW0Ss!kg1!!%r/f8BV/HGKR\opGenfDdk!iW$]>!!%r/f8BV/HGKQrH2mqkfC](CfD,CH[/U(. +^h<^H[/L",iDVbDnc'$5BE1u +KE(rOh>[M_Vtp>qb^-XBbk1o;VZ6]qqKi/A#gE>8ZtKG<[-[\i!VL.)rrg-EMmW0:rrC[H!#N#o +H2mqk_#Lcf!!%>ss8SJe;p>8%RGm]9-,=0o3N)QMs4972VuQe`MZ<`U^t1RHVuQe`MZ<`U_#M3W +MmW0Ss!kg1!!%r/f8BV/HGKR\opGenfDdk!iW$]>!!%r/f8BV/HGKQrH2mqkfC](CfD,CH[/U(. +^h<^H[/L",iDVbDnc'$5BE1u +KE(rOJcGWI!L^b#rrKKQJcGHD!L^b#rrKKQWrN%um/R%bNW4M~> +KE(rOJcGWI!L^b#rrKKQJcGHD!L^b#rrKKQWrN%um/R%bNW4M~> +KE(rOJcGWI!L^b#rrKKQJcGHD!L^b#rrKKQWrN%um/R%bNW4M~> +KE(rOc2[Ig!:889p"'2ZpX]K5ZtT:8!/p+Ap"'31WW2YC!pm:-q>UGQnGi15!:7f,rW) +KE(rOc2[Ig!:889p"'2ZpX]K5ZtT:8!/p+Ap"'31WW2YC!pm:-q>UGQnGi15!:7f,rW) +KE(rOc2[Ig!:889p"'2ZpX]K5ZtT:8!/p+Ap"'31WW2YC!pm:-q>UGQnGi15!:7f,rW) +KE(rOc2[G:!4:;Vl2Upn3B?'rrrVk]iT^C8!!'C*s7H?oZoL/*r;QikRGmZ8o`,!!aT)5>li6qa +NrOV~> +KE(rOc2[G:!4:;Vl2Upn3B?'rrrVk]iT^C8!!'C*s7H?oZoL/*r;QikRGmZ8o`,!!aT)5>li6qa +NrOV~> +KE(rOc2[G:!4:;Vl2Upn3B?'rrrVk]iT^C8!!'C*s7H?oZoL/*r;QikRGmZ8o`,!!aT)5>li6qa +NrOV~> +KE(rOJcGZJ".9,hHN(8QR8_=\s7ZHpR/d55rj2`p;p;6 at rW)9arW%uYJ,~> +KE(rOJcGZJ".9,hHN(8QR8_=\s7ZHpR/d55rj2`p;p;6 at rW)9arW%uYJ,~> +KE(rOJcGZJ".9,hHN(8QR8_=\s7ZHpR/d55rj2`p;p;6 at rW)9arW%uYJ,~> +KE(rOJcGWI#L&TL!!%>Pon!/8rs-c9BE/$Y[.UBtrW)9arW%uYJ,~> +KE(rOJcGWI#L&TL!!%>Pon!/8rs-c9BE/$Y[.UBtrW)9arW%uYJ,~> +KE(rOJcGWI#L&TL!!%>Pon!/8rs-c9BE/$Y[.UBtrW)9arW%uYJ,~> +KE(rOJcC<$L&_,PlMph`O8j_~> +KE(rOJcC<$L&_,PlMph`O8j_~> +KE(rOJcC<$L&_,PlMph`O8j_~> +KE(rOJcC<$L&_,PlMph`O8j_~> +KE(rOJcC<$L&_,PlMph`O8j_~> +KE(rOJcC<$L&_,PlMph`O8j_~> +KE(rOJcC<$L&_,PlMph`O8j_~> +KE(rOJcC<$L&_,PlMph`O8j_~> +KE(rOJcC<$L&_,PlMph`O8j_~> +KE(rOJcC<$L&_,PlMph`O8j_~> +KE(rOJcC<$L&_,PlMph`O8j_~> +KE(rOJcC<$L&_,PlMph`O8j_~> +KE(rOJcC<$L&_,Pl2U__OT0h~> +KE(rOJcC<$L&_,Pl2U__OT0h~> +KE(rOJcC<$L&_,Pl2U__OT0h~> +KE(rOJcC<$L&_,Pl2U__OT0h~> +KE(rOJcC<$L&_,Pl2U__OT0h~> +KE(rOJcC<$L&_,Pl2U__OT0h~> +KE(rOhuUK&RIL7V!;h'K;ZHg)s0QG>!2o_o#4/^1!,/b+rr3/GR +KE(rOhuUK&RIL7V!;h'K;ZHg)s0QG>!2o_o#4/^1!,/b+rr3/GR +KE(rOhuUK&RIL7V!;h'K;ZHg)s0QG>!2o_o#4/^1!,/b+rr3/GR +KE(rOi;X#?!5SWM!9*hT!o[hcnG`Mfm/6kcof3"crVltf!!'h2rrVinp&4mq^hEE at opIi!PQ(m' +B_DDuR5s6/rrC[5rr_oo!8%/K!R,lJs8E#_s8E"[s*t~> +KE(rOi;X#?!5SWM!9*hT!o[hcnG`Mfm/6kcof3"crVltf!!'h2rrVinp&4mq^hEE at opIi!PQ(m' +B_DDuR5s6/rrC[5rr_oo!8%/K!R,lJs8E#_s8E"[s*t~> +KE(rOi;X#?!5SWM!9*hT!o[hcnG`Mfm/6kcof3"crVltf!!'h2rrVinp&4mq^hEE at opIi!PQ(m' +B_DDuR5s6/rrC[5rr_oo!8%/K!R,lJs8E#_s8E"[s*t~> +KE(rOi;X"L!:9aP!1Ecb!qg6cnG`O@[/9k*H2otar;Z`r!9*eS!!)ut!nRFrrr3&m3E)1B!nRFr +rr3&m3E**\!)r"Zrr<&Nqu6Yai;`cVl2U__OT0h~> +KE(rOi;X"L!:9aP!1Ecb!qg6cnG`O@[/9k*H2otar;Z`r!9*eS!!)ut!nRFrrr3&m3E)1B!nRFr +rr3&m3E**\!)r"Zrr<&Nqu6Yai;`cVl2U__OT0h~> +KE(rOi;X"L!:9aP!1Ecb!qg6cnG`O@[/9k*H2otar;Z`r!9*eS!!)ut!nRFrrr3&m3E)1B!nRFr +rr3&m3E**\!)r"Zrr<&Nqu6Yai;`cVl2U__OT0h~> +KE(rOi;WgV!<3!!!)rgq!K4b^s8U^Krr]V.!4;Y'"9<*83UHYC!!)ut!LWrcrrSSg^m4p#R/m0b +!gs&(Yl=a2!9O7\!!(XJrrC:$s8E#^s8N(\s*t~> +KE(rOi;WgV!<3!!!)rgq!K4b^s8U^Krr]V.!4;Y'"9<*83UHYC!!)ut!LWrcrrSSg^m4p#R/m0b +!gs&(Yl=a2!9O7\!!(XJrrC:$s8E#^s8N(\s*t~> +KE(rOi;WgV!<3!!!)rgq!K4b^s8U^Krr]V.!4;Y'"9<*83UHYC!!)ut!LWrcrrSSg^m4p#R/m0b +!gs&(Yl=a2!9O7\!!(XJrrC:$s8E#^s8N(\s*t~> +KE(rOi;`fWrr;uurVlo*Ms10Clo>&lqYp^!lo>&Zp&+gi!<)ou3<9!W!l+e^Q2^kF!;uiu^]8\c +rrTt9!9O7\!!(X(s8E#^s8E"\s*t~> +KE(rOi;`fWrr;uurVlo*Ms10Clo>&lqYp^!lo>&Zp&+gi!<)ou3<9!W!l+e^Q2^kF!;uiu^]8\c +rrTt9!9O7\!!(X(s8E#^s8E"\s*t~> +KE(rOi;`fWrr;uurVlo*Ms10Clo>&lqYp^!lo>&Zp&+gi!<)ou3<9!W!l+e^Q2^kF!;uiu^]8\c +rrTt9!9O7\!!(X(s8E#^s8E"\s*t~> +KE(rOi;Wgk!<3!!!,2B3!o[hckl1a2!'0EBrriE&i;`k(r;Q`srVultr;QiM!'03A"mhYaR:shC +rtOgf3WJc?;`UcUs1ip\!<<)NMZ +KE(rOi;Wgk!<3!!!,2B3!o[hckl1a2!'0EBrriE&i;`k(r;Q`srVultr;QiM!'03A"mhYaR:shC +rtOgf3WJc?;`UcUs1ip\!<<)NMZ +KE(rOi;Wgk!<3!!!,2B3!o[hckl1a2!'0EBrriE&i;`k(r;Q`srVultr;QiM!'03A"mhYaR:shC +rtOgf3WJc?;`UcUs1ip\!<<)NMZ +KE(rOi;X1l!8%8&!4;e+ok<=Jrr]V.!5SF1"p"]'^]4A&rVlitrVlpt!6kEA!nRDPkPl7T3OJhd +R/g03Mnk5N!9%UuZoJ,nrr;uurVultnc&j03T:# +KE(rOi;X1l!8%8&!4;e+ok<=Jrr]V.!5SF1"p"]'^]4A&rVlitrVlpt!6kEA!nRDPkPl7T3OJhd +R/g03Mnk5N!9%UuZoJ,nrr;uurVultnc&j03T:# +KE(rOi;X1l!8%8&!4;e+ok<=Jrr]V.!5SF1"p"]'^]4A&rVlitrVlpt!6kEA!nRDPkPl7T3OJhd +R/g03Mnk5N!9%UuZoJ,nrr;uurVultnc&j03T:# +KE(rOi;X/WBUSmgB_DE*RC)2X"5u6?Mtm;P!<3!#VZ6_4rr2rurVlqe!1Efc!l+e7kPkdF!;6Bl +i;ef7s8N'!VuH\tbQ)>Us8N)ts8N)irrVNe_#F?8ZiGFOrs&-V!8$mBiV`][of3$(oi'iJrrSSg +RJm-p^]7=5s7H?l_#OH$!)rjrrrE#trrE&u$2"8u_#OH$!!'D*rrUdPB_)3'!!]A$s5>s<[/U+* +!<)rt!<)rt!:g'jf)WVcrrTP-HN*sE!!$^3H3."F[,:o_!9jI^!0R;3~> +KE(rOi;X/WBUSmgB_DE*RC)2X"5u6?Mtm;P!<3!#VZ6_4rr2rurVlqe!1Efc!l+e7kPkdF!;6Bl +i;ef7s8N'!VuH\tbQ)>Us8N)ts8N)irrVNe_#F?8ZiGFOrs&-V!8$mBiV`][of3$(oi'iJrrSSg +RJm-p^]7=5s7H?l_#OH$!)rjrrrE#trrE&u$2"8u_#OH$!!'D*rrUdPB_)3'!!]A$s5>s<[/U+* +!<)rt!<)rt!:g'jf)WVcrrTP-HN*sE!!$^3H3."F[,:o_!9jI^!0R;3~> +KE(rOi;X/WBUSmgB_DE*RC)2X"5u6?Mtm;P!<3!#VZ6_4rr2rurVlqe!1Efc!l+e7kPkdF!;6Bl +i;ef7s8N'!VuH\tbQ)>Us8N)ts8N)irrVNe_#F?8ZiGFOrs&-V!8$mBiV`][of3$(oi'iJrrSSg +RJm-p^]7=5s7H?l_#OH$!)rjrrrE#trrE&u$2"8u_#OH$!!'D*rrUdPB_)3'!!]A$s5>s<[/U+* +!<)rt!<)rt!:g'jf)WVcrrTP-HN*sE!!$^3H3."F[,:o_!9jI^!0R;3~> +KE(rOhZ!Ym[(u\@!R,lhrrgr3R at 2[qrrZp73VE1I!!)ut#+5GkfDkjNrVm2j3<6Gds1hP5Ms(-? +!<)rt!<)rt!;uls!<3#u!<)rt!:p-kR/lpYrrKporVm#E!)nfkqYp]B!)nfkr;R)i3<6Gds1hP5 +MuNbV!<)rt!<)rt!<)rt!<)rt!<)rt!;uls!:p0i!<)p!ZiGFOs8N)ts8N)ts8N)hrrJMfrVlrl +_!M(#rr<&NrVlnd[,:o_!9jI^!0R;3~> +KE(rOhZ!Ym[(u\@!R,lhrrgr3R at 2[qrrZp73VE1I!!)ut#+5GkfDkjNrVm2j3<6Gds1hP5Ms(-? +!<)rt!<)rt!;uls!<3#u!<)rt!:p-kR/lpYrrKporVm#E!)nfkqYp]B!)nfkr;R)i3<6Gds1hP5 +MuNbV!<)rt!<)rt!<)rt!<)rt!<)rt!;uls!:p0i!<)p!ZiGFOs8N)ts8N)ts8N)hrrJMfrVlrl +_!M(#rr<&NrVlnd[,:o_!9jI^!0R;3~> +KE(rOhZ!Ym[(u\@!R,lhrrgr3R at 2[qrrZp73VE1I!!)ut#+5GkfDkjNrVm2j3<6Gds1hP5Ms(-? +!<)rt!<)rt!;uls!<3#u!<)rt!:p-kR/lpYrrKporVm#E!)nfkqYp]B!)nfkr;R)i3<6Gds1hP5 +MuNbV!<)rt!<)rt!<)rt!<)rt!<)rt!;uls!:p0i!<)p!ZiGFOs8N)ts8N)ts8N)hrrJMfrVlrl +_!M(#rr<&NrVlnd[,:o_!9jI^!0R;3~> +KE(rOg&DHH;t^1jf)X%p^] +KE(rOg&DHH;t^1jf)X%p^] +KE(rOg&DHH;t^1jf)X%p^] +KE(rOg&D(dfDbdSMZEeWli;t7rr_3[!1EQ\!!)rs"nakUB_;B"rrUdP3Tg>HR/kJ2s6K`RrVult +r;Zcsrr;uurVulto)J^i!;6'c"8)WofD5FKo`,!DpAY3G!'1#XrrE#trrE#trrE#trrE#trrE#t +rrDusrrDWirrDusrrE&urrE#trrE#trrDThrrDfnrr<&Nr;QcKhuEZUkPtP^OoKq~> +KE(rOg&D(dfDbdSMZEeWli;t7rr_3[!1EQ\!!)rs"nakUB_;B"rrUdP3Tg>HR/kJ2s6K`RrVult +r;Zcsrr;uurVulto)J^i!;6'c"8)WofD5FKo`,!DpAY3G!'1#XrrE#trrE#trrE#trrE#trrE#t +rrDusrrDWirrDusrrE&urrE#trrE#trrDThrrDfnrr<&Nr;QcKhuEZUkPtP^OoKq~> +KE(rOg&D(dfDbdSMZEeWli;t7rr_3[!1EQ\!!)rs"nakUB_;B"rrUdP3Tg>HR/kJ2s6K`RrVult +r;Zcsrr;uurVulto)J^i!;6'c"8)WofD5FKo`,!DpAY3G!'1#XrrE#trrE#trrE#trrE#trrE#t +rrDusrrDWirrDusrrE&urrE#trrE#trrDThrrDfnrr<&Nr;QcKhuEZUkPtP^OoKq~> +KE(rOgAh2[rVultrr3!!3V*1PBE2!(pAY*mqu6fX3<4@*p\t;@!6jU*#PDbDm/NJep&4pj!;uls +!<3#u!<)rt!:p-k;ZOW2rrMKZrVm"gZiF%tqYp\dZiF%tp\t;@!6kEArrE#trrE#trrE#trrE#t +rrE#trrDusrrDWirrDus! +KE(rOgAh2[rVultrr3!!3V*1PBE2!(pAY*mqu6fX3<4@*p\t;@!6jU*#PDbDm/NJep&4pj!;uls +!<3#u!<)rt!:p-k;ZOW2rrMKZrVm"gZiF%tqYp\dZiF%tp\t;@!6kEArrE#trrE#trrE#trrE#t +rrE#trrDusrrDWirrDus! +KE(rOgAh2[rVultrr3!!3V*1PBE2!(pAY*mqu6fX3<4@*p\t;@!6jU*#PDbDm/NJep&4pj!;uls +!<3#u!<)rt!:p-k;ZOW2rrMKZrVm"gZiF%tqYp\dZiF%tp\t;@!6kEArrE#trrE#trrE#trrE#t +rrE#trrDusrrDWirrDus! +KE(rOg]%<+B`.o1!<3!!!'0ZN"/c,!fD>LI[/L")!;c]q_#=?/rrTt9RH4DHZiJ>Is8N)ss8N)u +s8N)ts8N)irrSSgHMmdCRJm0cZig>d!2o_os0Mn.MZB[MrrTt9RJd*b!<)rt!<)rt!<)rt!<)rt +!<)rt!;uls!:p0i!<)p!o`1EZs8N)ts8N)ts8N)hrrS)YHMmdCRK!6d!!(XIrrK%jirAuXkPtM] +P5g%~> +KE(rOg]%<+B`.o1!<3!!!'0ZN"/c,!fD>LI[/L")!;c]q_#=?/rrTt9RH4DHZiJ>Is8N)ss8N)u +s8N)ts8N)irrSSgHMmdCRJm0cZig>d!2o_os0Mn.MZB[MrrTt9RJd*b!<)rt!<)rt!<)rt!<)rt +!<)rt!;uls!:p0i!<)p!o`1EZs8N)ts8N)ts8N)hrrS)YHMmdCRK!6d!!(XIrrK%jirAuXkPtM] +P5g%~> +KE(rOg]%<+B`.o1!<3!!!'0ZN"/c,!fD>LI[/L")!;c]q_#=?/rrTt9RH4DHZiJ>Is8N)ss8N)u +s8N)ts8N)irrSSgHMmdCRJm0cZig>d!2o_os0Mn.MZB[MrrTt9RJd*b!<)rt!<)rt!<)rt!<)rt +!<)rt!;uls!:p0i!<)p!o`1EZs8N)ts8N)ts8N)hrrS)YHMmdCRK!6d!!(XIrrK%jirAuXkPtM] +P5g%~> +KE(rOh#@HK;saG^#)`K]s7HAMo`#$F!!&qnrrMJ4rVlitq>UN'!!)ip!oZ/-jSo7YRJ6a]!;uls +!<3!'BE7#ks1eU7o)AgD!!&Gds8TJ*rs-c+s8VaP!6kEA#L&,+s7JAPbkh>@iAm>'s8N)ts8N)t +rs)I&m/R+$!!)utrrE#trrDusrrDWirr<&lrr3&8!9*qW#A=+rs8Tk7!<)rt!<<'!m.C;[f)PfK +rr3"s[/U+*!!(XJrrM)HiW&lWkPtM]P5g%~> +KE(rOh#@HK;saG^#)`K]s7HAMo`#$F!!&qnrrMJ4rVlitq>UN'!!)ip!oZ/-jSo7YRJ6a]!;uls +!<3!'BE7#ks1eU7o)AgD!!&Gds8TJ*rs-c+s8VaP!6kEA#L&,+s7JAPbkh>@iAm>'s8N)ts8N)t +rs)I&m/R+$!!)utrrE#trrDusrrDWirr<&lrr3&8!9*qW#A=+rs8Tk7!<)rt!<<'!m.C;[f)PfK +rr3"s[/U+*!!(XJrrM)HiW&lWkPtM]P5g%~> +KE(rOh#@HK;saG^#)`K]s7HAMo`#$F!!&qnrrMJ4rVlitq>UN'!!)ip!oZ/-jSo7YRJ6a]!;uls +!<3!'BE7#ks1eU7o)AgD!!&Gds8TJ*rs-c+s8VaP!6kEA#L&,+s7JAPbkh>@iAm>'s8N)ts8N)t +rs)I&m/R+$!!)utrrE#trrDusrrDWirr<&lrr3&8!9*qW#A=+rs8Tk7!<)rt!<<'!m.C;[f)PfK +rr3"s[/U+*!!(XJrrM)HiW&lWkPtM]P5g%~> +KE(rOh#@D$bkqDEf)X%pbQ-8frri!n!,2'&rrVk,[/U(,o`4[\rrJMfqYpW(;mbTb!]^6ZrH\LB +fDbgM!!)]krrVin!<3!)ZiF%3HGBL\Mnnra%&X(*;gMAUp&G'N3VECO#f$F#p&G'N3VECO"2Fms +p&+gkZr=@/rrVin!<)rt!!)]krsbk+BXE*$!!%qms7H?lrVult!;6?k!qcNno)J^i"e#Djoi&6r +rt)O;;m^kd!!%qms8Qa4[(s'?rs"kk!)n2(B`A#6o`,!9r;QiW3R$I^rW)-]rW&,]J,~> +KE(rOh#@D$bkqDEf)X%pbQ-8frri!n!,2'&rrVk,[/U(,o`4[\rrJMfqYpW(;mbTb!]^6ZrH\LB +fDbgM!!)]krrVin!<3!)ZiF%3HGBL\Mnnra%&X(*;gMAUp&G'N3VECO#f$F#p&G'N3VECO"2Fms +p&+gkZr=@/rrVin!<)rt!!)]krsbk+BXE*$!!%qms7H?lrVult!;6?k!qcNno)J^i"e#Djoi&6r +rt)O;;m^kd!!%qms8Qa4[(s'?rs"kk!)n2(B`A#6o`,!9r;QiW3R$I^rW)-]rW&,]J,~> +KE(rOh#@D$bkqDEf)X%pbQ-8frri!n!,2'&rrVk,[/U(,o`4[\rrJMfqYpW(;mbTb!]^6ZrH\LB +fDbgM!!)]krrVin!<3!)ZiF%3HGBL\Mnnra%&X(*;gMAUp&G'N3VECO#f$F#p&G'N3VECO"2Fms +p&+gkZr=@/rrVin!<)rt!!)]krsbk+BXE*$!!%qms7H?lrVult!;6?k!qcNno)J^i"e#Djoi&6r +rt)O;;m^kd!!%qms8Qa4[(s'?rs"kk!)n2(B`A#6o`,!9r;QiW3R$I^rW)-]rW&,]J,~> +KE(rOh>[M_Vtp>qb^-XBbk1o;VZ6]qqKi/A#gE>8ZtKG<[-[\i!VL.)rrg-EMmW0:rrC[H!#N#o +H2mqk_#Lcf!!%>ss8SJe;p>8%RGm]9-,=0o3N)QMs4972VuQe`MZ<`U^t1RHVuQe`MZ<`U_#M3W +MmW0Ss!kg1!!%r/f8BV/HGKR\opGenfDdk!iW$]>!!%r/f8BV/HGKQrH2mqkfC]+C!!'D*H2u1d +rs+ql;p>8%RGn/F"6!0=[.4/)^h<^H[.XIcZtKF>3W47*BE1'Ns8E#]s8E"]s*t~> +KE(rOh>[M_Vtp>qb^-XBbk1o;VZ6]qqKi/A#gE>8ZtKG<[-[\i!VL.)rrg-EMmW0:rrC[H!#N#o +H2mqk_#Lcf!!%>ss8SJe;p>8%RGm]9-,=0o3N)QMs4972VuQe`MZ<`U^t1RHVuQe`MZ<`U_#M3W +MmW0Ss!kg1!!%r/f8BV/HGKR\opGenfDdk!iW$]>!!%r/f8BV/HGKQrH2mqkfC]+C!!'D*H2u1d +rs+ql;p>8%RGn/F"6!0=[.4/)^h<^H[.XIcZtKF>3W47*BE1'Ns8E#]s8E"]s*t~> +KE(rOh>[M_Vtp>qb^-XBbk1o;VZ6]qqKi/A#gE>8ZtKG<[-[\i!VL.)rrg-EMmW0:rrC[H!#N#o +H2mqk_#Lcf!!%>ss8SJe;p>8%RGm]9-,=0o3N)QMs4972VuQe`MZ<`U^t1RHVuQe`MZ<`U_#M3W +MmW0Ss!kg1!!%r/f8BV/HGKR\opGenfDdk!iW$]>!!%r/f8BV/HGKQrH2mqkfC]+C!!'D*H2u1d +rs+ql;p>8%RGn/F"6!0=[.4/)^h<^H[.XIcZtKF>3W47*BE1'Ns8E#]s8E"]s*t~> +KE(rOJcGWI!L^b#rrKKQJcGHDrrAenrW)-]rW&,]J,~> +KE(rOJcGWI!L^b#rrKKQJcGHDrrAenrW)-]rW&,]J,~> +KE(rOJcGWI!L^b#rrKKQJcGHDrrAenrW)-]rW&,]J,~> +KE(rOc2[Ig!:889p"'2ZpX]K5ZtT:8!/p+Ap"'31WW2YC"76$f!9X=Sf)Y0[s8E#]s8E"]s*t~> +KE(rOc2[Ig!:889p"'2ZpX]K5ZtT:8!/p+Ap"'31WW2YC"76$f!9X=Sf)Y0[s8E#]s8E"]s*t~> +KE(rOc2[Ig!:889p"'2ZpX]K5ZtT:8!/p+Ap"'31WW2YC"76$f!9X=Sf)Y0[s8E#]s8E"]s*t~> +KE(rOc2[G:!4:;Vl2Upn3B?'rrrVk]iT^C8!!'C*s7H?o[/U++k5Y)S!49oKrW)-]rW&,]J,~> +KE(rOc2[G:!4:;Vl2Upn3B?'rrrVk]iT^C8!!'C*s7H?o[/U++k5Y)S!49oKrW)-]rW&,]J,~> +KE(rOc2[G:!4:;Vl2Upn3B?'rrrVk]iT^C8!!'C*s7H?o[/U++k5Y)S!49oKrW)-]rW&,]J,~> +KE(rOJcGZJ".9,hHN(8QR8_=\s7ZHoo`+uds8E#]s8E"]s*t~> +KE(rOJcGZJ".9,hHN(8QR8_=\s7ZHoo`+uds8E#]s8E"]s*t~> +KE(rOJcGZJ".9,hHN(8QR8_=\s7ZHoo`+uds8E#]s8E"]s*t~> +KE(rOJcGWI#L&TL!!%>Pon!/:rrp2a!!%>\V#UDokPtM]P5g%~> +KE(rOJcGWI#L&TL!!%>Pon!/:rrp2a!!%>\V#UDokPtM]P5g%~> +KE(rOJcGWI#L&TL!!%>Pon!/:rrp2a!!%>\V#UDokPtM]P5g%~> +KE(rOJcC<$L&_,PkPtM]P5g%~> +KE(rOJcC<$L&_,PkPtM]P5g%~> +KE(rOJcC<$L&_,PkPtM]P5g%~> +KE(rOJcC<$L&_,PkPtM]P5g%~> +KE(rOJcC<$L&_,PkPtM]P5g%~> +KE(rOJcC<$L&_,PkPtM]P5g%~> +KE(rOJcC<$L&_,PkPtM]P5g%~> +KE(rOJcC<$L&_,PkPtM]P5g%~> +KE(rOJcC<$L&_,PkPtM]P5g%~> +KE(rOJcC<$L&_,PkPtM]P5g%~> +KE(rOJcC<$L&_,PkPtM]P5g%~> +KE(rOJcC<$L&_,PkPtM]P5g%~> +PlLa`o)J^iJcC<$L&_,PkPtM]P5g%~> +PlLa`o)J^iJcC<$L&_,PkPtM]P5g%~> +PlLa`o)J^iJcC<$L&_,PkPtM]P5g%~> +Q2g^]p&G$lJcC<$L&_,Pk5YG]P5g%~> +Q2g^]p&G$lJcC<$L&_,Pk5YG]P5g%~> +Q2g^]p&G$lJcC<$L&_,Pk5YG]P5g%~> +Q2gX[p](6nJcC<$L&_,Pk5YG]P5g%~> +Q2gX[p](6nJcC<$L&_,Pk5YG]P5g%~> +Q2gX[p](6nJcC<$L&_,Pk5YG]P5g%~> +Q2gOXqZ$Qqmf*F6HF/"MqYpT'Msp]G!;h'K;ZHg)m'LF+!4;Y'%d^Q$!,/b+s8U]/H;faROT,CT +ZoS!_!qio\JcG]K"miU0!!$^2H3.a[HLCh4!9X=]!0[A4~> +Q2gOXqZ$Qqmf*F6HF/"MqYpT'Msp]G!;h'K;ZHg)m'LF+!4;Y'%d^Q$!,/b+s8U]/H;faROT,CT +ZoS!_!qio\JcG]K"miU0!!$^2H3.a[HLCh4!9X=]!0[A4~> +Q2gOXqZ$Qqmf*F6HF/"MqYpT'Msp]G!;h'K;ZHg)m'LF+!4;Y'%d^Q$!,/b+s8U]/H;faROT,CT +ZoS!_!qio\JcG]K"miU0!!$^2H3.a[HLCh4!9X=]!0[A4~> +Q2gIVr;Zcsn,EUD!6kJY3T9o9!pikYn,EDem/6kcof3"crVltf!!'h2rrVinp&=sr^f0V"s0MdA +PQ(dYZoJ*dr;QomZoJ*dQi@';k5PPV!!(XKrrL>imf37dk5YG]P5g%~> +Q2gIVr;Zcsn,EUD!6kJY3T9o9!pikYn,EDem/6kcof3"crVltf!!'h2rrVinp&=sr^f0V"s0MdA +PQ(dYZoJ*dr;QomZoJ*dQi@';k5PPV!!(XKrrL>imf37dk5YG]P5g%~> +Q2gIVr;Zcsn,EUD!6kJY3T9o9!pikYn,EDem/6kcof3"crVltf!!'h2rrVinp&=sr^f0V"s0MdA +PQ(dYZoJ*dr;QomZoJ*dQi@';k5PPV!!(XKrrL>imf37dk5YG]P5g%~> +Q2g at Ss8W*!n,ETM!<<)c!1Ecb!IDuYrrL`Yqu6bE!'0$9s8N'"3T9i7!!*#u!pfp&rVlqF!:5sM +s7HH[!!)rss7HH[!!&Ac!)r"Zrr<&Nqu6Yamf37dkPtM]P5g%~> +Q2g at Ss8W*!n,ETM!<<)c!1Ecb!IDuYrrL`Yqu6bE!'0$9s8N'"3T9i7!!*#u!pfp&rVlqF!:5sM +s7HH[!!)rss7HH[!!&Ac!)r"Zrr<&Nqu6Yamf37dkPtM]P5g%~> +Q2g at Ss8W*!n,ETM!<<)c!1Ecb!IDuYrrL`Yqu6bE!'0$9s8N'"3T9i7!!*#u!pfp&rVlqF!:5sM +s7HH[!!)rss7HH[!!&Ac!)r"Zrr<&Nqu6Yamf37dkPtM]P5g%~> +Q2g4On,EDK!<3!!!)rjr!ORdQs8U^Krr]V.!4;Y'"9<*83VE:L!!*#u!gs&]rVlr7!1AuLrrDlp +rrAGd!OMjgs8N'!fDGRJbjPN1!9aC]!0[A4~> +Q2g4On,EDK!<3!!!)rjr!ORdQs8U^Krr]V.!4;Y'"9<*83VE:L!!*#u!gs&]rVlr7!1AuLrrDlp +rrAGd!OMjgs8N'!fDGRJbjPN1!9aC]!0[A4~> +Q2g4On,EDK!<3!!!)rjr!ORdQs8U^Krr]V.!4;Y'"9<*83VE:L!!*#u!gs&]rVlr7!1AuLrrDlp +rrAGd!OMjgs8N'!fDGRJbjPN1!9aC]!0[A4~> +WW1WOn,NCfrr;uurr3&d;t]AS"7/#JHM[XF!9#p +WW1WOn,NCfrr;uurr3&d;t]AS"7/#JHM[XF!9#p +WW1WOn,NCfrr;uurr3&d;t]AS"7/#JHM[XF!9#p +df6NOn,EDe!<3!!!,2B3!IDuQrr[QI3UHVB"T\SS!!%rTrr<&us8N'!p&+ji!!)!?rrqA>Vi-u9 +rVmSjR5t;kBE4Ins8Tl\!!*'!f8BV/nGaN\Mi1MI_#N#"!!#%2s1gVpVuP@^!!#%2s1gVpVu-Mo +!;ZZp!;ld,m$Tm6opIg#VuQe@;ZN6Yr;QrPRA]iW$92!!%=k_".L/f8GPcBYaTHrr<&NrVlok[-dnm!9aC] +!0[A4~> +df6NOn,EDe!<3!!!,2B3!IDuQrr[QI3UHVB"T\SS!!%rTrr<&us8N'!p&+ji!!)!?rrqA>Vi-u9 +rVmSjR5t;kBE4Ins8Tl\!!*'!f8BV/nGaN\Mi1MI_#N#"!!#%2s1gVpVuP@^!!#%2s1gVpVu-Mo +!;ZZp!;ld,m$Tm6opIg#VuQe@;ZN6Yr;QrPRA]iW$92!!%=k_".L/f8GPcBYaTHrr<&NrVlok[-dnm!9aC] +!0[A4~> +df6NOn,EDe!<3!!!,2B3!IDuQrr[QI3UHVB"T\SS!!%rTrr<&us8N'!p&+ji!!)!?rrqA>Vi-u9 +rVmSjR5t;kBE4Ins8Tl\!!*'!f8BV/nGaN\Mi1MI_#N#"!!#%2s1gVpVuP@^!!#%2s1gVpVu-Mo +!;ZZp!;ld,m$Tm6opIg#VuQe@;ZN6Yr;QrPRA]iW$92!!%=k_".L/f8GPcBYaTHrr<&NrVlok[-dnm!9aC] +!0[A4~> +qu;EOn,Ea%!:9a;!4;e+[&<*e"1/%._"n!7!<<)7!!&qqrr<&urrQ+!bl%M@!!(X6rtF?O[/^/a +!)n4D^l&0m^js*=ZYs8VaPbl.PHH2qXYs7JCrqZ$Qq +q>^Hpr;R>DMZ +qu;EOn,Ea%!:9a;!4;e+[&<*e"1/%._"n!7!<<)7!!&qqrr<&urrQ+!bl%M@!!(X6rtF?O[/^/a +!)n4D^l&0m^js*=ZYs8VaPbl.PHH2qXYs7JCrqZ$Qq +q>^Hpr;R>DMZ +qu;EOn,Ea%!:9a;!4;e+[&<*e"1/%._"n!7!<<)7!!&qqrr<&urrQ+!bl%M@!!(X6rtF?O[/^/a +!)n4D^l&0m^js*=ZYs8VaPbl.PHH2qXYs7JCrqZ$Qq +q>^Hpr;R>DMZ +ZiK+cn,NOi!!)Kf$MA)>s-[Qns5 at Yakl1bD3<5!4rr<&urr\Yh!5SU6!!*#u!iH$ErVlud!!)!@ +rrJ#Xrr3&O!/pjV#k\/t_#OH$!)rjrrrE#trrDWi!nRFfrr3A5!.+\Fof3#Zs-^7lrs&-V!4;co +[/'b%!;ZZp!;c`q!!'D*rs73V3Pb[pli9u`rrUCEbl.PNH2t>Ps7H?l_#OH$!)rms!PhY4rs,G% +MuWg'!5SR5!GL*Vrs+G^p&G'N!/pjV!PhY4rs#A$MuWeW!:g'jf)WVcrrTP-HN*sE!!$^3H3."F +[-dnm!9aC]!0[A4~> +ZiK+cn,NOi!!)Kf$MA)>s-[Qns5 at Yakl1bD3<5!4rr<&urr\Yh!5SU6!!*#u!iH$ErVlud!!)!@ +rrJ#Xrr3&O!/pjV#k\/t_#OH$!)rjrrrE#trrDWi!nRFfrr3A5!.+\Fof3#Zs-^7lrs&-V!4;co +[/'b%!;ZZp!;c`q!!'D*rs73V3Pb[pli9u`rrUCEbl.PNH2t>Ps7H?l_#OH$!)rms!PhY4rs,G% +MuWg'!5SR5!GL*Vrs+G^p&G'N!/pjV!PhY4rs#A$MuWeW!:g'jf)WVcrrTP-HN*sE!!$^3H3."F +[-dnm!9aC]!0[A4~> +ZiK+cn,NOi!!)Kf$MA)>s-[Qns5 at Yakl1bD3<5!4rr<&urr\Yh!5SU6!!*#u!iH$ErVlud!!)!@ +rrJ#Xrr3&O!/pjV#k\/t_#OH$!)rjrrrE#trrDWi!nRFfrr3A5!.+\Fof3#Zs-^7lrs&-V!4;co +[/'b%!;ZZp!;c`q!!'D*rs73V3Pb[pli9u`rrUCEbl.PNH2t>Ps7H?l_#OH$!)rms!PhY4rs,G% +MuWg'!5SR5!GL*Vrs+G^p&G'N!/pjV!PhY4rs#A$MuWeW!:g'jf)WVcrrTP-HN*sE!!$^3H3."F +[-dnm!9aC]!0[A4~> +h#P"coDnghrrDHd!l21Yrr37;fDkm&RAYtpmf*B&!'0`Irr<&trs"A]!9*tX!<3!)of3#?p&E6^ +!'03ArrE#t!<>.Ys8N)ts8N)ts8N)ts8N)irrJMfrVlrl_!M(#"O$iG[#=e\"O$iG[#=_ZrrDlp +rrDoqrrDusrrE#trrE&u!E0!rrrTt93WB'Y!<)rt!<3!!M`L`^#?(U&s8U[N;uZdtiD]=IrrE#t +rrE&u!K/u:H3R:J!<<'!!:g'iR/m3c!qj at qrr;uu!8%2L!L^=^s8E#]s8E"]s*t~> +h#P"coDnghrrDHd!l21Yrr37;fDkm&RAYtpmf*B&!'0`Irr<&trs"A]!9*tX!<3!)of3#?p&E6^ +!'03ArrE#t!<>.Ys8N)ts8N)ts8N)ts8N)irrJMfrVlrl_!M(#"O$iG[#=e\"O$iG[#=_ZrrDlp +rrDoqrrDusrrE#trrE&u!E0!rrrTt93WB'Y!<)rt!<3!!M`L`^#?(U&s8U[N;uZdtiD]=IrrE#t +rrE&u!K/u:H3R:J!<<'!!:g'iR/m3c!qj at qrr;uu!8%2L!L^=^s8E#]s8E"]s*t~> +h#P"coDnghrrDHd!l21Yrr37;fDkm&RAYtpmf*B&!'0`Irr<&trs"A]!9*tX!<3!)of3#?p&E6^ +!'03ArrE#t!<>.Ys8N)ts8N)ts8N)ts8N)irrJMfrVlrl_!M(#"O$iG[#=e\"O$iG[#=_ZrrDlp +rrDoqrrDusrrE#trrE&u!E0!rrrTt93WB'Y!<)rt!<3!!M`L`^#?(U&s8U[N;uZdtiD]=IrrE#t +rrE&u!K/u:H3R:J!<<'!!:g'iR/m3c!qj at qrr;uu!8%2L!L^=^s8E#]s8E"]s*t~> +Q2gRYq>^Hpkl2!sVuQeU!5SWY!8$`?"1/%.bkM,;!<)p%ok4=cm/I(ars7tL!!$]>MZB1-s8N)t +rrE*[rVultrVultrVultrVulto)A_N!;?EpVZ6_iq>UPp!!)]es8N)ps8N)qs8N)ss8N)ts8N*! +rrVNe!;uj%li7%Es8N'!rVultrr3!!HM at FDH2tb\s-^[ns8N)trrE*[rr3!!HMIO?!:g'i3<8gR +rr<&NrVlob[-dnm!9aC]!0[A4~> +Q2gRYq>^Hpkl2!sVuQeU!5SWY!8$`?"1/%.bkM,;!<)p%ok4=cm/I(ars7tL!!$]>MZB1-s8N)t +rrE*[rVultrVultrVultrVulto)A_N!;?EpVZ6_iq>UPp!!)]es8N)ps8N)qs8N)ss8N)ts8N*! +rrVNe!;uj%li7%Es8N'!rVultrr3!!HM at FDH2tb\s-^[ns8N)trrE*[rr3!!HMIO?!:g'i3<8gR +rr<&NrVlob[-dnm!9aC]!0[A4~> +Q2gRYq>^Hpkl2!sVuQeU!5SWY!8$`?"1/%.bkM,;!<)p%ok4=cm/I(ars7tL!!$]>MZB1-s8N)t +rrE*[rVultrVultrVultrVulto)A_N!;?EpVZ6_iq>UPp!!)]es8N)ps8N)qs8N)ss8N)ts8N*! +rrVNe!;uj%li7%Es8N'!rVultrr3!!HM at FDH2tb\s-^[ns8N)trrE*[rr3!!HMIO?!:g'i3<8gR +rr<&NrVlob[-dnm!9aC]!0[A4~> +Q2g[\pAb-ml2M.M;t^1jMZEGMrr at uIrr_3[!1EQ\!!)rs"me5LB_;B#rr_pS!9*)?#FPS9s8V$X +Vu?Yq!<)rt!<)rt!<)rt!:p0i!;?Epo`+uiq>UQi!!&qls8N)ps8N)qs8N)ss8N)ts8N*!rrUdP +!;lfr!!LpRrr<&ts8N)urrE+5p\tHL!,2E*;t]_]#FPS9s8VEcRK!3e!,20-rrDThrrDfnrr<&N +r;QcKmJm.ckPtM]P5g%~> +Q2g[\pAb-ml2M.M;t^1jMZEGMrr at uIrr_3[!1EQ\!!)rs"me5LB_;B#rr_pS!9*)?#FPS9s8V$X +Vu?Yq!<)rt!<)rt!<)rt!:p0i!;?Epo`+uiq>UQi!!&qls8N)ps8N)qs8N)ss8N)ts8N*!rrUdP +!;lfr!!LpRrr<&ts8N)urrE+5p\tHL!,2E*;t]_]#FPS9s8VEcRK!3e!,20-rrDThrrDfnrr<&N +r;QcKmJm.ckPtM]P5g%~> +Q2g[\pAb-ml2M.M;t^1jMZEGMrr at uIrr_3[!1EQ\!!)rs"me5LB_;B#rr_pS!9*)?#FPS9s8V$X +Vu?Yq!<)rt!<)rt!<)rt!:p0i!;?Epo`+uiq>UQi!!&qls8N)ps8N)qs8N)ss8N)ts8N*!rrUdP +!;lfr!!LpRrr<&ts8N)urrE+5p\tHL!,2E*;t]_]#FPS9s8VEcRK!3e!,20-rrDThrrDfnrr<&N +r;QcKmJm.ckPtM]P5g%~> +PlLa`o)J^il2LctfDbdN3<9'YrrDTh")%[5p%JCc!;ld!i;`k9!;QQqZiI#crs/41B^GbWMtR&K +rrE#trrE#trrE#trrDWi!]^8)r;Qfap&=soMmPJEfD>LMMmPJEfD5IH!;ZZp!;c`q!;uls!<)rt +!<<'$i;`l:r;Zcs"SMfp!!)utrrE&u!]^8Ir;QcUrVm"H!8##Snc&jeBP?c4R:u9mrrP1\m/6kd +iW&oX!:g'j3<7;$rs%i_s8N'!fB<25!9aC]!0[A4~> +PlLa`o)J^il2LctfDbdN3<9'YrrDTh")%[5p%JCc!;ld!i;`k9!;QQqZiI#crs/41B^GbWMtR&K +rrE#trrE#trrE#trrDWi!]^8)r;Qfap&=soMmPJEfD>LMMmPJEfD5IH!;ZZp!;c`q!;uls!<)rt +!<<'$i;`l:r;Zcs"SMfp!!)utrrE&u!]^8Ir;QcUrVm"H!8##Snc&jeBP?c4R:u9mrrP1\m/6kd +iW&oX!:g'j3<7;$rs%i_s8N'!fB<25!9aC]!0[A4~> +PlLa`o)J^il2LctfDbdN3<9'YrrDTh")%[5p%JCc!;ld!i;`k9!;QQqZiI#crs/41B^GbWMtR&K +rrE#trrE#trrE#trrDWi!]^8)r;Qfap&=soMmPJEfD>LMMmPJEfD5IH!;ZZp!;c`q!;uls!<)rt +!<<'$i;`l:r;Zcs"SMfp!!)utrrE&u!]^8Ir;QcUrVm"H!8##Snc&jeBP?c4R:u9mrrP1\m/6kd +iW&oX!:g'j3<7;$rs%i_s8N'!fB<25!9aC]!0[A4~> +KE(rOlMgmlVu?Vr3<9'YrrDWi"/c,!fD>LI[/L")!;c]q_#=?0rr_3[B_CKe!US&0ZiK(^s8N)t +s8N)ts8N)ts8N)irrS)YHMmdCRK!6dZipEE!'0`Ms8TG/s1eUpp%n^g!;ZZp!;c`q!;uls!<)rt +!<3!";ZO3'rrVinB`A&3!<)rt!<3!"MZA\6rrMeNrVm#9!.&>;nGiHo!6kB@!fI&:rVm&oMuWeW +!:g'jMZA)$rrAJds8N'!fD>LJVtKQZrW)-]rW&,]J,~> +KE(rOlMgmlVu?Vr3<9'YrrDWi"/c,!fD>LI[/L")!;c]q_#=?0rr_3[B_CKe!US&0ZiK(^s8N)t +s8N)ts8N)ts8N)irrS)YHMmdCRK!6dZipEE!'0`Ms8TG/s1eUpp%n^g!;ZZp!;c`q!;uls!<)rt +!<3!";ZO3'rrVinB`A&3!<)rt!<3!"MZA\6rrMeNrVm#9!.&>;nGiHo!6kB@!fI&:rVm&oMuWeW +!:g'jMZA)$rrAJds8N'!fD>LJVtKQZrW)-]rW&,]J,~> +KE(rOlMgmlVu?Vr3<9'YrrDWi"/c,!fD>LI[/L")!;c]q_#=?0rr_3[B_CKe!US&0ZiK(^s8N)t +s8N)ts8N)ts8N)irrS)YHMmdCRK!6dZipEE!'0`Ms8TG/s1eUpp%n^g!;ZZp!;c`q!;uls!<)rt +!<3!";ZO3'rrVinB`A&3!<)rt!<3!"MZA\6rrMeNrVm#9!.&>;nGiHo!6kB@!fI&:rVm&oMuWeW +!:g'jMZA)$rrAJds8N'!fD>LJVtKQZrW)-]rW&,]J,~> +KE(rOli.%F;t^+h#)`KJs8N(WoD\pE!!&qnrrMJ4rVlitq>UMo!!)lq"5u7Rp#Z2SiApW3rrE#t +rrE#t#?(Whs8Tk7!:p-lf)PfKrr3/"[/^0MMuN_XMZA\6rrL?%rr3%X!/p^RrrDlprrDoqrrDus +rrE#trrE&u!jhr+rVlrC!6kHBrrE#trrE&u#hK%VRI't?Mno8j!`K)4nG`NeRJ?dmf)Pf=m/QF1 +_#OE7!<<)co`#$F!!&qrrrK%)rr;uu!8%,J!TBI8s8E#]s8E"]s*t~> +KE(rOli.%F;t^+h#)`KJs8N(WoD\pE!!&qnrrMJ4rVlitq>UMo!!)lq"5u7Rp#Z2SiApW3rrE#t +rrE#t#?(Whs8Tk7!:p-lf)PfKrr3/"[/^0MMuN_XMZA\6rrL?%rr3%X!/p^RrrDlprrDoqrrDus +rrE#trrE&u!jhr+rVlrC!6kHBrrE#trrE&u#hK%VRI't?Mno8j!`K)4nG`NeRJ?dmf)Pf=m/QF1 +_#OE7!<<)co`#$F!!&qrrrK%)rr;uu!8%,J!TBI8s8E#]s8E"]s*t~> +KE(rOli.%F;t^+h#)`KJs8N(WoD\pE!!&qnrrMJ4rVlitq>UMo!!)lq"5u7Rp#Z2SiApW3rrE#t +rrE#t#?(Whs8Tk7!:p-lf)PfKrr3/"[/^0MMuN_XMZA\6rrL?%rr3%X!/p^RrrDlprrDoqrrDus +rrE#trrE&u!jhr+rVlrC!6kHBrrE#trrE&u#hK%VRI't?Mno8j!`K)4nG`NeRJ?dmf)Pf=m/QF1 +_#OE7!<<)co`#$F!!&qrrrK%)rr;uu!8%,J!TBI8s8E#]s8E"]s*t~> +KE(rOli.!!fDPXQf)X%pbQ-8erri!n!,2'&rrVk,[/U(,li?_SrrJMfqu6c63N)Q2rrTP-3W47) +RDAh%!qcNnrVult!;6?k$)[c:[!KLf!/nYarsP4p!)n2(B`J+k3VECO#k\/t_#OGn3VECO"8)Wo +_#+03!!)B^s8N'!m/-h_!!)]krrVin!<)rt!!)]krs+qlRK*<[BUSl"!qcNnrVult!;6?k!1E`b +!1E`a!l+fOnG`PM!)riB!N4QKrrAJb!!&Gdrrd!8[(s'?rs"kk!)n2(B`A#6o`,!9r;QiW3R$sl +rW)-]rW&,]J,~> +KE(rOli.!!fDPXQf)X%pbQ-8erri!n!,2'&rrVk,[/U(,li?_SrrJMfqu6c63N)Q2rrTP-3W47) +RDAh%!qcNnrVult!;6?k$)[c:[!KLf!/nYarsP4p!)n2(B`J+k3VECO#k\/t_#OGn3VECO"8)Wo +_#+03!!)B^s8N'!m/-h_!!)]krrVin!<)rt!!)]krs+qlRK*<[BUSl"!qcNnrVult!;6?k!1E`b +!1E`a!l+fOnG`PM!)riB!N4QKrrAJb!!&Gdrrd!8[(s'?rs"kk!)n2(B`A#6o`,!9r;QiW3R$sl +rW)-]rW&,]J,~> +KE(rOli.!!fDPXQf)X%pbQ-8erri!n!,2'&rrVk,[/U(,li?_SrrJMfqu6c63N)Q2rrTP-3W47) +RDAh%!qcNnrVult!;6?k$)[c:[!KLf!/nYarsP4p!)n2(B`J+k3VECO#k\/t_#OGn3VECO"8)Wo +_#+03!!)B^s8N'!m/-h_!!)]krrVin!<)rt!!)]krs+qlRK*<[BUSl"!qcNnrVult!;6?k!1E`b +!1E`a!l+fOnG`PM!)riB!N4QKrrAJb!!&Gdrrd!8[(s'?rs"kk!)n2(B`A#6o`,!9r;QiW3R$sl +rW)-]rW&,]J,~> +KE(rOm/I*nVu$Drb^-XBbk(i:VZ6]qqKi/A#gE>8Zr6s<[-[\i!VL.*rrg-8RA]E2rrMeNq>_A1 +s1ip\!/oI\MZrr3V_H2mqk_#M2r!!%r/f8BV/HGKO["i+eMMj_fgrsQVg!!%r/f8BV/ +HGKO["Me[N;mcE$!VJJArrC[H!!'D*rrg,N!)p9'rr_4Y3OJ>V%)?NV;mc5tm'LF+!'1"(!b_Qo +mf37dkPtM]P5g%~> +KE(rOm/I*nVu$Drb^-XBbk(i:VZ6]qqKi/A#gE>8Zr6s<[-[\i!VL.*rrg-8RA]E2rrMeNq>_A1 +s1ip\!/oI\MZrr3V_H2mqk_#M2r!!%r/f8BV/HGKO["i+eMMj_fgrsQVg!!%r/f8BV/ +HGKO["Me[N;mcE$!VJJArrC[H!!'D*rrg,N!)p9'rr_4Y3OJ>V%)?NV;mc5tm'LF+!'1"(!b_Qo +mf37dkPtM]P5g%~> +KE(rOm/I*nVu$Drb^-XBbk(i:VZ6]qqKi/A#gE>8Zr6s<[-[\i!VL.*rrg-8RA]E2rrMeNq>_A1 +s1ip\!/oI\MZrr3V_H2mqk_#M2r!!%r/f8BV/HGKO["i+eMMj_fgrsQVg!!%r/f8BV/ +HGKO["Me[N;mcE$!VJJArrC[H!!'D*rrg,N!)p9'rr_4Y3OJ>V%)?NV;mc5tm'LF+!'1"(!b_Qo +mf37dkPtM]P5g%~> +KE(rOMZ3^8bl%JAf2I8#lMgn#VsjWdRDA_"!OR0as8E#]s8N(]s*t~> +KE(rOMZ3^8bl%JAf2I8#lMgn#VsjWdRDA_"!OR0as8E#]s8N(]s*t~> +KE(rOMZ3^8bl%JAf2I8#lMgn#VsjWdRDA_"!OR0as8E#]s8N(]s*t~> +KE(rOh#I'!!:8;:p"'2Zp=BB4ZtT=9!1E'Np"'31OT,>[m/6nVf)`6lq>UGQnGi15!:8A +KE(rOh#I'!!:8;:p"'2Zp=BB4ZtT=9!1E'Np"'31OT,>[m/6nVf)`6lq>UGQnGi15!:8A +KE(rOh#I'!!:8;:p"'2Zp=BB4ZtT=9!1E'Np"'31OT,>[m/6nVf)`6lq>UGQnGi15!:8A +KE(rOh#I$I!4:>Wkl:gm3B?'rrrKLNkl:;U!48!j"O+[S[!MWLoDenPiV`]WopOe.s7H?l[+PEX +!9jI^!0R;3~> +KE(rOh#I$I!4:>Wkl:gm3B?'rrrKLNkl:;U!48!j"O+[S[!MWLoDenPiV`]WopOe.s7H?l[+PEX +!9jI^!0R;3~> +KE(rOh#I$I!4:>Wkl:gm3B?'rrrKLNkl:;U!48!j"O+[S[!MWLoDenPiV`]WopOe.s7H?l[+PEX +!9jI^!0R;3~> +KE(rOMuO'N!!%qa[&7TEJcG0 +KE(rOMuO'N!!%qa[&7TEJcG0 +KE(rOMuO'N!!%qa[&7TEJcG0 +KE(rOMZ3mrMc0USRFd#im/I0G!/p42rs-c9BE/$Y[.Us/rW)0^rW&)\J,~> +KE(rOMZ3mrMc0USRFd#im/I0G!/p42rs-c9BE/$Y[.Us/rW)0^rW&)\J,~> +KE(rOMZ3mrMc0USRFd#im/I0G!/p42rs-c9BE/$Y[.Us/rW)0^rW&)\J,~> +KE(rOJcC<$L&_,Pkl:V^OoKq~> +KE(rOJcC<$L&_,Pkl:V^OoKq~> +KE(rOJcC<$L&_,Pkl:V^OoKq~> +KE(rOJcC<$L&_,Pkl:V^OoKq~> +KE(rOJcC<$L&_,Pkl:V^OoKq~> +KE(rOJcC<$L&_,Pkl:V^OoKq~> +KE(rOJcC<$L&_,Pkl:V^OoKq~> +KE(rOJcC<$L&_,Pkl:V^OoKq~> +KE(rOJcC<$L&_,Pkl:V^OoKq~> +KE(rOJcC<$L&_,Pl2U__OT0h~> +KE(rOJcC<$L&_,Pl2U__OT0h~> +KE(rOJcC<$L&_,Pl2U__OT0h~> +KE(rOJcC<$L&_,Pl2U__OT0h~> +KE(rOJcC<$L&_,Pl2U__OT0h~> +KE(rOJcC<$L&_,Pl2U__OT0h~> +KE(rOJcC<$L&_,Pl2U__OT0h~> +KE(rOJcC<$L&_,Pl2U__OT0h~> +KE(rOJcC<$L&_,Pl2U__OT0h~> +KE(rOJcC<$L&_,Pl2U__OT0h~> +KE(rOJcC<$L&_,Pl2U__OT0h~> +KE(rOJcC<$L&_,Pl2U__OT0h~> +KE(rOJcC<$L&_,Pl2U__OT0h~> +KE(rOJcC<$L&_,Pl2U__OT0h~> +KE(rOJcC<$L&_,Pl2U__OT0h~> +KE(rOJcC<$L&_,PlMph`O8j_~> +KE(rOJcC<$L&_,PlMph`O8j_~> +KE(rOJcC<$L&_,PlMph`O8j_~> +KE(rOJcC<$L&_,PlMph`O8j_~> +KE(rOJcC<$L&_,PlMph`O8j_~> +KE(rOJcC<$L&_,PlMph`O8j_~> +KE(rOJcC<$L&_,PlMph`O8j_~> +KE(rOJcC<$L&_,PlMph`O8j_~> +KE(rOJcC<$L&_,PlMph`O8j_~> +KE(rOJcC<$L&_,PlMph`O8j_~> +KE(rOJcC<$L&_,PlMph`O8j_~> +KE(rOJcC<$L&_,PlMph`O8j_~> +KE(rOJcC<$L&_,Pli6qaNrOV~> +KE(rOJcC<$L&_,Pli6qaNrOV~> +KE(rOJcC<$L&_,Pli6qaNrOV~> +KE(rOJcC<$L&_,Pli6qaNrOV~> +KE(rOJcC<$L&_,Pli6qaNrOV~> +KE(rOJcC<$L&_,Pli6qaNrOV~> +KE(rOJcC<$L&_,Pli6qaNrOV~> +KE(rOJcC<$L&_,Pli6qaNrOV~> +KE(rOJcC<$L&_,Pli6qaNrOV~> +KE(rOJcC<$L&_,Pli6qaNrOV~> +KE(rOJcC<$L&_,Pli6qaNrOV~> +KE(rOJcC<$L&_,Pli6qaNrOV~> +KE(rOJcC<$L&_,Pm/R%bNW4M~> +KE(rOJcC<$L&_,Pm/R%bNW4M~> +KE(rOJcC<$L&_,Pm/R%bNW4M~> +KE(rOJcC<$L&_,Po`+p"r;Z`rNW4M~> +KE(rOJcC<$L&_,Po`+o`r;Z`rNW4M~> +KE(rOJcC<$L&_,Po`+o`r;Z`rNW4M~> +KE(rOJcC<$L&_,Prr;T!rVuisNW4M~> +KE(rOJcC<$L&_,Prr;S_rVuisNW4M~> +KE(rOJcC<$L&_,Prr;S_rVuisNW4M~> +KE(rOJcF*s!o^NZrr3&Y[.XFu!o^NZrr3&Y[.T"MbPqPBm^N2qrW%oWJ,~> +KE(rOJcF*s!o^NZrr3&Y[.XFu!o^NZrr3&Y[.T"MbPqPBm\'RZrW%oWJ,~> +KE(rOJcF*s!o^NZrr3&Y[.XFu!o^NZrr3&Y[.T"MbPqPBm\'RZrW%oWJ,~> +KE(rOJcF*s!`K*+rr3$u!4;b*!`K*+rr3$u!47=WbPqPBm^N2qrW%oWJ,~> +KE(rOJcF*s!`K*+rr3$u!4;b*!`K*+rr3$u!47=WbPqPBm\'RZrW%oWJ,~> +KE(rOJcF*s!`K*+rr3$u!4;b*!`K*+rr3$u!47=WbPqPBm\'RZrW%oWJ,~> +KE(rOJcF*s!iJ'1rr3%t3S491!iJ'1rr3%t3S/i^bPqPBm^N5rr;_fVJ,~> +KE(rOJcF*s!iJ'1rr3%t3S491!iJ'1rr3%t3S/i^bPqPBm\'U[r;_fVJ,~> +KE(rOJcF*s!iJ'1rr3%t3S491!iJ'1rr3%t3S/i^bPqPBm\'U[r;_fVJ,~> +KE(rOJcC<$L&_/Qn$i>srW%lVJ,~> +KE(rOJcC<$L&_/Qn"B^\rW%lVJ,~> +KE(rOJcC<$L&_/Qn"B^\rW%lVJ,~> +KE(rOJcC<$L&_,P!<;Gq!!%rWJ,~> +KE(rOJcC<$L&_,P!<;GZ!!%rWJ,~> +KE(rOJcC<$L&_,P!<;GZ!!%rWJ,~> +KE(rOJcC<$L&_,Prr;8mO8j_~> +KE(rOJcC<$L&_,Prr;8VO8j_~> +KE(rOJcC<$L&_,Prr;8VO8j_~> +KE(rOJcC<$L&_,Pr;ZK"!<;Z"PlH7~> +KE(rOJcC<$L&_,Pr;ZJ`!<;Y`PlH7~> +KE(rOJcC<$L&_,Pr;ZJ`!<;Y`PlH7~> +KE(rOJcC<$L&_,PqZ$?"!<;ut!<;Z"RK%d~> +KE(rOJcC<$L&_,PqZ$>`!<;ut!<;Y`RK%d~> +KE(rOJcC<$L&_,PqZ$>`!<;ut!<;Y`RK%d~> +KE(rOJcC<$L&_,Pq>^9"!<<#uqu?8sSc=3~> +KE(rOJcC<$L&_,Pq>^8`!<<#uqu?8\Sc=3~> +KE(rOJcC<$L&_,Pq>^8`!<<#uqu?8\Sc=3~> +KE(rOJcC<$L&_,Pp](-"r;cQko=(IoJ,~> +KE(rOJcC<$L&_,Pp](,`r;cQko:ViXJ,~> +KE(rOJcC<$L&_,Pp](,`r;cQko:ViXJ,~> +KE(rOJcC<$L&_,Pp&G!"rW)Hfo=(XtJ,~> +KE(rOJcC<$L&_,Pp&Fu`rW)Hfo:W#]J,~> +KE(rOJcC<$L&_,Pp&Fu`rW)Hfo:W#]J,~> +KE(rOJcC<$L&_,Po)JXgm/Q[dX8d\~> +KE(rOJcC<$L&_,Po)JXgm/Q[MX8d\~> +KE(rOJcC<$L&_,Po)JXgm/Q[MX8d\~> +KE(rOJcC<$L&_,Po)J[hk5Y%^YlB4~> +KE(rOJcC<$L&_,Po)J[hk5Y%GYlB4~> +KE(rOJcC<$L&_,Po)J[hk5Y%GYlB4~> +KE(rOJcC<$L&_,PoDeahiW&MY[Jta~> +KE(rOJcC<$L&_,PoDeahiW&MB[Jta~> +KE(rOJcC<$L&_,PoDeahiW&MB[Jta~> +KE(rOV>gS3f<,&Sm&)l!rs8:qR5nrrMc9;grrVPooqqcg!;$6i!8IPF\%;Ti~> +KE(rOV>gS3f<,&Sm&)l!rs8:qR5nrrMc9;grrVPooqqcg!;$6i!8IPFTXt/R~> +KE(rOV>gS3f<,&Sm&)l!rs8:qR5nrrMc9;grrVPooqqcg!;$6i!8IPFTXt/R~> +KE(rOVuHhkVr=cX"3bEY!8[Y]ok;/@iAgm:!:7])!qhuJVuQ_ro`+jifDkHO^Ai]~> +KE(rOVuHhkVr=cX"3bEY!8[Y]ok;/@iAgm:!:7])!qhuJVuQ_ro`+jifDkH8^Ai]~> +KE(rOVuHhkVr=cX"3bEY!8[Y]ok;/@iAgm:!:7])!qhuJVuQ_ro`+jifDkH8^Ai]~> +KE(rOVuHdDfDY^Lf>[aifBiP;!;?EmfBN;9ZiL+*"2JU/m/6k`f?+$ooi(O^s8E#ks8;rFs7<_; +s*t~> +KE(rOVuHdDfDY^Lf>[aifBiP;!;?EmfBN;9ZiL+*"2JU/m/6k`f?+$ooi(O^s8E#ks8;rFs7;o$ +s*t~> +KE(rOVuHdDfDY^Lf>[aifBiP;!;?EmfBN;9ZiL+*"2JU/m/6k`f?+$ooi(O^s8E#ks8;rFs7;o$ +s*t~> +KE(rOW;cmrMu +KE(rOW;cmrMu +KE(rOW;cmrMu +KE(rOWW*%O!8%2L!OMjHrrKJ,m/R(cp\t9$!9sO`!;?EnZiJ/H!BINds8E#ls8;r +KE(rOWW*%O!8%2L!OMjHrrKJ,m/R(cp\t9$!9sO`!;?EnZiJ/H!BINds8E#ls8;r +KE(rOWW*%O!8%2L!OMjHrrKJ,m/R(cp\t9$!9sO`!;?EnZiJ/H!BINds8E#ls8;r +KE(rOWW*!F;uQ^t^]4ATrrTt9!:9ac!;QQq^]4B!s8N)nrrTt9!6>*@R5sr?s8E#ms8;r6s7<_I +s*t~> +KE(rOWW*!F;uQ^t^]4ATrrTt9!:9ac!;QQq^]4B!s8N)nrrTt9!6>*@R5sr?s8E#ms8;r6s7;o2 +s*t~> +KE(rOWW*!F;uQ^t^]4ATrrTt9!:9ac!;QQq^]4B!s8N)nrrTt9!6>*@R5sr?s8E#ms8;r6s7;o2 +s*t~> +KE(rOWrE.Z!1Eid(pnSh!.&t,s4s7MdY3N)fT"lYl-;eWuF +rtin*H>$6Fp&G'!H2mqkHGKR\^l*L=MrFU6#1ncZHF*YPq>UZ+H2mqkHGKO["kT/g;gQ7Rs8REF +!<7?SVuP_D3WK,dH2mqkHGKCW#iV13s3+D%RJ$OY#0_C>BK;LRr;QrZMl2K$p&+gn^l*L=MrFR5 +!l+fCWrN%uq#C9m]DqK3f)L7~> +KE(rOWrE.Z!1Eid(pnSh!.&t,s4s7MdY3N)fT"lYl-;eWuF +rtin*H>$6Fp&G'!H2mqkHGKR\^l*L=MrFU6#1ncZHF*YPq>UZ+H2mqkHGKO["kT/g;gQ7Rs8REF +!<7?SVuP_D3WK,dH2mqkHGKCW#iV13s3+D%RJ$OY#0_C>BK;LRr;QrZMl2K$p&+gn^l*L=MrFR5 +!l+fCWrN%uq#C9m]DqJqf)L7~> +KE(rOWrE.Z!1Eid(pnSh!.&t,s4s7MdY3N)fT"lYl-;eWuF +rtin*H>$6Fp&G'!H2mqkHGKR\^l*L=MrFU6#1ncZHF*YPq>UZ+H2mqkHGKO["kT/g;gQ7Rs8REF +!<7?SVuP_D3WK,dH2mqkHGKCW#iV13s3+D%RJ$OY#0_C>BK;LRr;QrZMl2K$p&+gn^l*L=MrFR5 +!l+fCWrN%uq#C9m]DqJqf)L7~> +KE(rOWrE.-!4;\(rrE&u$c%Z#!2l4b!9*qX!<)rt!<<'+^l&0miFoU*3<6Gcrt3%,iW&q(!2oks +ZiK(bs0McorVultrVm+j[/^0b3<8%;rs->"iW&S/!!)cnrrDus#FT8us8SJeRJ-[\!<3!#^l&0m +rVultq#;&DMZs.g])d~> +KE(rOWrE.-!4;\(rrE&u$c%Z#!2l4b!9*qX!<)rt!<<'+^l&0miFoU*3<6Gcrt3%,iW&q(!2oks +ZiK(bs0McorVultrVm+j[/^0b3<8%;rs->"iW&S/!!)cnrrDus#FT8us8SJeRJ-[\!<3!#^l&0m +rVultq#;&DMZrlg])d~> +KE(rOWrE.-!4;\(rrE&u$c%Z#!2l4b!9*qX!<)rt!<<'+^l&0miFoU*3<6Gcrt3%,iW&q(!2oks +ZiK(bs0McorVultrVm+j[/^0b3<8%;rs->"iW&S/!!)cnrrDus#FT8us8SJeRJ-[\!<3!#^l&0m +rVultq#;&DMZrlg])d~> +KE(rOWrE-H!6kB at rrDusrr<;2s4>'drr<&ts8N)ts8N'!VuH]$bQ)>Vs6Ka$rr320!.+\F3<9'Y +!qcNnrVultrr3#7;uQ_$VZ;YTs5 +KE(rOWrE-H!6kB at rrDusrr<;2s4>'drr<&ts8N)ts8N'!VuH]$bQ)>Vs6Ka$rr320!.+\F3<9'Y +!qcNnrVultrr3#7;uQ_$VZ;YTs5 +KE(rOWrE-H!6kB at rrDusrr<;2s4>'drr<&ts8N)ts8N'!VuH]$bQ)>Vs6Ka$rr320!.+\F3<9'Y +!qcNnrVultrr3#7;uQ_$VZ;YTs5 +KE(rOWrE,\!8%/KrrDusrrDrrrrE#trrE#trrDusrrE*!!gs&]rVm&:iW&qb[/L%)!<)rt!<3!! +M`L`^#?(U&s8RuWm/?ta!;HNn!<)ou;ZQaq!l+drp](6nr;ZcsrVultpAb-mrVm)/!.+\F[']f3 +rrE#trrE#t"TUR_s,/o9H3."F!;lfr!!(uYs8E#ps8;qus7<_\s*t~> +KE(rOWrE,\!8%/KrrDusrrDrrrrE#trrE#trrDusrrE*!!gs&]rVm&:iW&qb[/L%)!<)rt!<3!! +M`L`^#?(U&s8RuWm/?ta!;HNn!<)ou;ZQaq!l+drp](6nr;ZcsrVultpAb-mrVm)/!.+\F[']f3 +rrE#trrE#t"TUR_s,/o9H3."F!;lfr!!(uYs8E#ps8;qus7;oEs*t~> +KE(rOWrE,\!8%/KrrDusrrDrrrrE#trrE#trrDusrrE*!!gs&]rVm&:iW&qb[/L%)!<)rt!<3!! +M`L`^#?(U&s8RuWm/?ta!;HNn!<)ou;ZQaq!l+drp](6nr;ZcsrVultpAb-mrVm)/!.+\F[']f3 +rrE#trrE#t"TUR_s,/o9H3."F!;lfr!!(uYs8E#ps8;qus7;oEs*t~> +KE(rOWrN)!!8%/KrrDusrrDrrrrE#trrE#trrDusrrE*!!GDK+rri#%MZUNh +!!)rsrrDfnrrE&u!pfmer;Qlc!!)!Qs8N)ss8N)ts8N)ms8N)trrVNe!;uj"osBVW!<)rt!<)p$ +!'1)Z!.+;;rr<&NX8i/!qu?TpV>p.rl2Q8~> +KE(rOWrN)!!8%/KrrDusrrDrrrrE#trrE#trrDusrrE*!!GDK+rri#%MZUNh +!!)rsrrDfnrrE&u!pfmer;Qlc!!)!Qs8N)ss8N)ts8N)ms8N)trrVNe!;uj"osBVW!<)rt!<)p$ +!'1)Z!.+;;rr<&NX8i/!qu?TpV>p.[l2Q8~> +KE(rOWrN)!!8%/KrrDusrrDrrrrE#trrE#trrDusrrE*!!GDK+rri#%MZUNh +!!)rsrrDfnrrE&u!pfmer;Qlc!!)!Qs8N)ss8N)ts8N)ms8N)trrVNe!;uj"osBVW!<)rt!<)p$ +!'1)Z!.+;;rr<&NX8i/!qu?TpV>p.[l2Q8~> +KE(rOWrN)!!8%/KrrDusrrDrrrrE#trrE#trrDusrrE*!rr<&lq#:QkR>]\s!!)utrrE&u! +KE(rOWrN)!!8%/KrrDusrrDrrrrE#trrE#trrDusrrE*!rr<&lq#:QkR>]\s!!)utrrE&u! +KE(rOWrN)!!8%/KrrDusrrDrrrrE#trrE#trrDusrrE*!rr<&lq#:QkR>]\s!!)utrrE&u! +KE(rOWrE,\!8%/KrrDusrrDrrrrE#trrE#trrDusrrE*!!`K*7r;Qrep&Eu2RK!6d!<)rt!<3!" +3<8FDrrqB]f)Pg;rVultp](6nrr3)Z!!)!Us8N'!p%\Re!;uls!<)rt!;?Hm!;uj$!)rptiAm>* +s8N)trs\R6B^GbWMtR,M3<8FDrrD$Ts8N'!iN*"X!<)rq!1X#[\+9QL~> +KE(rOWrE,\!8%/KrrDusrrDrrrrE#trrE#trrDusrrE*!!`K*7r;Qrep&Eu2RK!6d!<)rt!<3!" +3<8FDrrqB]f)Pg;rVultp](6nrr3)Z!!)!Us8N'!p%\Re!;uls!<)rt!;?Hm!;uj$!)rptiAm>* +s8N)trs\R6B^GbWMtR,M3<8FDrrD$Ts8N'!iN*"X!<)rq!1X#[T^r,5~> +KE(rOWrE,\!8%/KrrDusrrDrrrrE#trrE#trrDusrrE*!!`K*7r;Qrep&Eu2RK!6d!<)rt!<3!" +3<8FDrrqB]f)Pg;rVultp](6nrr3)Z!!)!Us8N'!p%\Re!;uls!<)rt!;?Hm!;uj$!)rptiAm>* +s8N)trs\R6B^GbWMtR,M3<8FDrrD$Ts8N'!iN*"X!<)rq!1X#[T^r,5~> +KE(rOWrE-H!6kB at rrDusrrDrrrrE#trrE#trrDusrrE*!!gs%7r;Qnfs8Qa4rVultrVultrr3%X +!/pgU#5*oSrr<&7rVultp](6nrVlpt!4;_)!qcP,p](6nr;ZcsrVultpAb-mrVm,q!1EleH3!X; +s8N)trrMK1rj2[arVlqW!/pgU!VMBKrrVin!36(u!<3#r!1!TU\+foQ~> +KE(rOWrE-H!6kB at rrDusrrDrrrrE#trrE#trrDusrrE*!!gs%7r;Qnfs8Qa4rVultrVultrr3%X +!/pgU#5*oSrr<&7rVultp](6nrVlpt!4;_)!qcP,p](6nr;ZcsrVultpAb-mrVm,q!1EleH3!X; +s8N)trrMK1rj2[arVlqW!/pgU!VMBKrrVin!36(u!<3#r!1!TUT_JJ:~> +KE(rOWrE-H!6kB at rrDusrrDrrrrE#trrE#trrDusrrE*!!gs%7r;Qnfs8Qa4rVultrVultrr3%X +!/pgU#5*oSrr<&7rVultp](6nrVlpt!4;_)!qcP,p](6nr;ZcsrVultpAb-mrVm,q!1EleH3!X; +s8N)trrMK1rj2[arVlqW!/pgU!VMBKrrVin!36(u!<3#r!1!TUT_JJ:~> +KE(rOWrE.-!4;\(rrE*!"RQ0g!!)or#A=+rs8Tk7!<)rt!;uls!<<'$f)Pf=rr<#*s8W*!*VKI4 +o`,!lm/R(c!<<)cf)Pf=m/QF1_#OG&!)rRis8N)ns8N*!rrh]gZiF&'rrUCEbkM/;!;uls!<)rt +!<<'!m.p\]!!)]krt3$HiW&oX!:9aco`,!lm/Q$)q#:WO!!&GRs6PZZr;QiM!.([FrW)uuquDfX +o=+YtJ,~> +KE(rOWrE.-!4;\(rrE*!"RQ0g!!)or#A=+rs8Tk7!<)rt!;uls!<<'$f)Pf=rr<#*s8W*!*VKI4 +o`,!lm/R(c!<<)cf)Pf=m/QF1_#OG&!)rRis8N)ns8N*!rrh]gZiF&'rrUCEbkM/;!;uls!<)rt +!<<'!m.p\]!!)]krt3$HiW&oX!:9aco`,!lm/Q$)q#:WO!!&GRs6PZZr;QiM!.([FrW)uuquDfX +o:Z$]J,~> +KE(rOWrE.-!4;\(rrE*!"RQ0g!!)or#A=+rs8Tk7!<)rt!;uls!<<'$f)Pf=rr<#*s8W*!*VKI4 +o`,!lm/R(c!<<)cf)Pf=m/QF1_#OG&!)rRis8N)ns8N*!rrh]gZiF&'rrUCEbkM/;!;uls!<)rt +!<<'!m.p\]!!)]krt3$HiW&oX!:9aco`,!lm/Q$)q#:WO!!&GRs6PZZr;QiM!.([FrW)uuquDfX +o:Z$]J,~> +KE(rOWrE.Z!1Ecb$"s=G^pO.7!!)]irslC9;m^kd!!%qms8N'!p&=smo`,!kru at p:!)n2BB_DE* +H2qX1[#4naVmQL(;ZO2?_#Ki#!!&GdrsJEt!,0U#MZ^Hp"e#Djoi&6srsakdB\1%X!!&Fbs0MbdrH\L4_#F?6RJ[$bRJ[!c +^]:aAs8Duus82kSs7<]"s*t~> +KE(rOWrE.Z!1Ecb$"s=G^pO.7!!)]irslC9;m^kd!!%qms8N'!p&=smo`,!kru at p:!)n2BB_DE* +H2qX1[#4naVmQL(;ZO2?_#Ki#!!&GdrsJEt!,0U#MZ^Hp"e#Djoi&6srsakdB\1%X!!&Fbs0MbdrH\L4_#F?6RJ[$bRJ[!c +^]:aAs8Duus82kSs7;l`s*t~> +KE(rOWrE.Z!1Ecb$"s=G^pO.7!!)]irslC9;m^kd!!%qms8N'!p&=smo`,!kru at p:!)n2BB_DE* +H2qX1[#4naVmQL(;ZO2?_#Ki#!!&GdrsJEt!,0U#MZ^Hp"e#Djoi&6srsakdB\1%X!!&Fbs0MbdrH\L4_#F?6RJ[$bRJ[!c +^]:aAs8Duus82kSs7;l`s*t~> +KE(rOWW*!F;uHY&iDVbDs1ip\!,/b;ruIL-;p>8%RGn1tH2mqk_#Lcf!!%>ss8TlJ!'-tMrr38_ +H2qWos-Wkbrr3)P;`V5arrg,N!)p9&rs8:c!!&GR3LSLorr^kO3OJbb"i+eMMj_f`rt;\P!!$]> +s4;Ps!.)H\s5?m:[.s\$!!'D*H2u1frs\7?!)p]5VZ +KE(rOWW*!F;uHY&iDVbDs1ip\!,/b;ruIL-;p>8%RGn1tH2mqk_#Lcf!!%>ss8TlJ!'-tMrr38_ +H2qWos-Wkbrr3)P;`V5arrg,N!)p9&rs8:c!!&GR3LSLorr^kO3OJbb"i+eMMj_f`rt;\P!!$]> +s4;Ps!.)H\s5?m:[.s\$!!'D*H2u1frs\7?!)p]5VZ +KE(rOWW*!F;uHY&iDVbDs1ip\!,/b;ruIL-;p>8%RGn1tH2mqk_#Lcf!!%>ss8TlJ!'-tMrr38_ +H2qWos-Wkbrr3)P;`V5arrg,N!)p9&rs8:c!!&GR3LSLorr^kO3OJbb"i+eMMj_f`rt;\P!!$]> +s4;Ps!.)H\s5?m:[.s\$!!'D*H2u1frs\7?!)p]5VZ +KE(rOWW*%O!7uf%l2Ub`m/I*Ebl%JAf2M8?!BINds7u_Hs8N&r[t"~> +KE(rOWW*%O!7uf%l2Ub`m/I*Ebl%JAf2M8?!BINds7u_Hs8N&rTR[~> +KE(rOWW*%O!7uf%l2Ub`m/I*Ebl%JAf2M8?!BINds7u_Hs8N&rTR[~> +KE(rOW;cmrMh1oms8N)drrKK?qYpP`oD\iuBW1t.!.k1Fs*t~> +KE(rOW;cmrMh1oms8N)drrKK?qYpP`oD\iuBW1t.!.k1Fs*t~> +KE(rOW;cmrMh1oms8N)drrKK?qYpP`oD\iuBW1t.!.k1Fs*t~> +KE(rOVuHdDf7Etes8N)ds8P(ZiV`]V[*81B!qfLbW;lbqJcGKEJ,~> +KE(rOVuHdDf7Etes8N)ds8P(ZiV`]V[*81B!qfLbW;lbqJcGKEJ,~> +KE(rOVuHdDf7Etes8N)ds8P(ZiV`]V[*81B!qfLbW;lbqJcGKEJ,~> +KE(rOVuHhkVr<4,m/I.[!!)Ed#akYmMmTjhBXIF3!qhuJVuQ\qJcGHDJ,~> +KE(rOVuHhkVr<4,m/I.[!!)Ed#akYmMmTjhBXIF3!qhuJVuQ\qJcGHDJ,~> +KE(rOVuHhkVr<4,m/I.[!!)Ed#akYmMmTjhBXIF3!qhuJVuQ\qJcGHDJ,~> +KE(rOV>gS3f7Etirrp2a!!%>\mf*L,Mc0USRFh*2!pm;eVZ6VqJcGECJ,~> +KE(rOV>gS3f7Etirrp2a!!%>\mf*L,Mc0USRFh*2!pm;eVZ6VqJcGECJ,~> +KE(rOV>gS3f7Etirrp2a!!%>\mf*L,Mc0USRFh*2!pm;eVZ6VqJcGECJ,~> +KE(rOJcC<$L&_,PJcGECJ,~> +KE(rOJcC<$L&_,PJcGECJ,~> +KE(rOJcC<$L&_,PJcGECJ,~> +KE(rOJcC<$L&_,PJcGECJ,~> +KE(rOJcC<$L&_,PJcGECJ,~> +KE(rOJcC<$L&_,PJcGECJ,~> +KE(rOJcC<$L&_,PJcGECJ,~> +KE(rOJcC<$L&_,PJcGECJ,~> +KE(rOJcC<$L&_,PJcGECJ,~> +KE(rOJcC<$L&_,PJcGECJ,~> +KE(rOJcC<$L&_,PJcGECJ,~> +KE(rOJcC<$L&_,PJcGECJ,~> +KE(rOJcC<$L&_,PJcGECJ,~> +KE(rOJcC<$L&_,PJcGECJ,~> +KE(rOJcC<$L&_,PJcGECJ,~> +KE$K&JH16$!!%TMp&BO~> +KE$K&JH16$!!%TMp&BO~> +KE$K&JH16$!!%TMp&BO~> +KE$K&JH16$!!%TMp&BO~> +KE$K&JH16$!!%TMp&BO~> +KE$K&JH16$!!%TMp&BO~> +KE$K&JH16$!!%TMp&BO~> +KE$K&JH16$!!%TMp&BO~> +KE$K&JH16$!!%TMp&BO~> +KE(rOJcC<$L&_,PJcGECJ,~> +KE(rOJcC<$L&_,PJcGECJ,~> +KE(rOJcC<$L&_,PJcGECJ,~> +KE(rOJcC<$L&_,PJcGECJ,~> +KE(rOJcC<$L&_,PJcGECJ,~> +KE(rOJcC<$L&_,PJcGECJ,~> +KE(rOJcC<$L&_,PJcGECJ,~> +KE(rOJcC<$L&_,PJcGECJ,~> +KE(rOJcC<$L&_,PJcGECJ,~> +KE(rOJcC<$L&_,PJcGECJ,~> +KE(rOJcC<$L&_,PJcGECJ,~> +KE(rOJcC<$L&_,PJcGECJ,~> +KE(rOJcC<$L&_,PJcGECJ,~> +KE(rOJcC<$L&_,PJcGECJ,~> +KE(rOJcC<$L&_,PJcGECJ,~> +KE(rOJcC<$L&_,PJcGECJ,~> +KE(rOJcC<$L&_,PJcGECJ,~> +KE(rOJcC<$L&_,PJcGECJ,~> +KE(rOJcC<$L&_,PJcGECJ,~> +KE(rOJcC<$L&_,PJcGECJ,~> +KE(rOJcC<$L&_,PJcGECJ,~> +KE(rOJcC<$L&_,PJcGECJ,~> +KE(rOJcC<$L&_,PJcGECJ,~> +KE(rOJcC<$L&_,PJcGECJ,~> +KE(rOJcC<$L&_,PJcGECJ,~> +KE(rOJcC<$L&_,PJcGECJ,~> +KE(rOJcC<$L&_,PJcGECJ,~> +KE(rOJcC<$L&_,PJcGECJ,~> +KE(rOJcC<$L&_,PJcGECJ,~> +KE(rOJcC<$L&_,PJcGECJ,~> +KE(rOJcC<$L&_,PJcGECJ,~> +KE(rOJcC<$L&_,PJcGECJ,~> +KE(rOJcC<$L&_,PJcGECJ,~> +KE(rOJcC<$L&_,PJcGECJ,~> +KE(rOJcC<$L&_,PJcGECJ,~> +KE(rOJcC<$L&_,PJcGECJ,~> +KE(rOJcC<$L&_,PJcGECJ,~> +KE(rOJcC<$L&_,PJcGECJ,~> +KE(rOJcC<$L&_,PJcGECJ,~> +KE(rOJcC<$L&_,PJcGECJ,~> +KE(rOJcC<$L&_,PJcGECJ,~> +KE(rOJcC<$L&_,PJcGECJ,~> +KE(rOJcC<$L&_,PJcGECJ,~> +KE(rOJcC<$L&_,PJcGECJ,~> +KE(rOJcC<$L&_,PJcGECJ,~> +KE(rOJcC<$L&_,PJcGECJ,~> +KE(rOJcC<$L&_,PJcGECJ,~> +KE(rOJcC<$L&_,PJcGECJ,~> +KE(rOJcC<$L&_,PJcGECJ,~> +KE(rOJcC<$L&_,PJcGECJ,~> +KE(rOJcC<$L&_,PJcGECJ,~> +KE(rOJcC<$L&_,PJcGECJ,~> +KE(rOJcC<$L&_,PJcGECJ,~> +KE(rOJcC<$L&_,PJcGECJ,~> +KE(rOJcC<$L&_,PJcGECJ,~> +KE(rOJcC<$L&_,PJcGECJ,~> +KE(rOJcC<$L&_,PJcGECJ,~> +KE(rOJcC<$L&_,PJcGECJ,~> +KE(rOJcC<$L&_,PJcGECJ,~> +KE(rOJcC<$L&_,PJcGECJ,~> +KE(rOJcC<$L&_,PJcGECJ,~> +KE(rOJcC<$L&_,PJcGECJ,~> +KE(rOJcC<$L&_,PJcGECJ,~> +KE(rOJcC<$L&_,PJcGECJ,~> +KE(rOJcC<$L&_,PJcGECJ,~> +KE(rOJcC<$L&_,PJcGECJ,~> +KE(oNJcC<$LB%5QJcGECJ,~> +KE(oNJcC<$LB%5QJcGECJ,~> +KE(oNJcC<$LB%5QJcGECJ,~> +KE(oNJcC<$LB%5QJcGECJ,~> +KE(oNJcC<$LB%5QJcGECJ,~> +KE(oNJcC<$LB%5QJcGECJ,~> +KE(oNJcC<$LB%5QJcGECJ,~> +KE(oNJcC<$LB%5QJcGECJ,~> +KE(oNJcC<$LB%5QJcGECJ,~> +KE(oNJcC<$L]@;QJcGECJ,~> +KE(oNJcC<$L]@;QJcGECJ,~> +KE(oNJcC<$L]@;QJcGECJ,~> +K)bfMJcC<$M#[GSJcGBBJ,~> +K)bfMJcC<$M#[GSJcGBBJ,~> +K)bfMJcC<$M#[GSJcGBBJ,~> +K)bfMJcC<$M#[GSJcGBBJ,~> +K)bfMJcC<$M#[GSJcGBBJ,~> +K)bfMJcC<$M#[GSJcGBBJ,~> +K)bcLJcC<$MZ +K)bcLJcC<$MZ +K)bcLJcC<$MZ +JcGZKJcC<$N;rhVJcG?AJ,~> +JcGZKJcC<$N;rhVJcG?AJ,~> +JcGZKJcC<$N;rhVJcG?AJ,~> +Jc>`MrW%NLJcC]/rW%NLo)F4~> +Jc>`MrW%NLJcC]/rW%NLo)F4~> +Jc>`MrW%NLJcC]/rW%NLo)F4~> +Jc>`Mr;_EKJcCc1r;_EKo)F4~> +Jc>`Mr;_EKJcCc1r;_EKo)F4~> +Jc>`Mr;_EKJcCc1r;_EKo)F4~> +JcGcMr;_EKJcCi3r;_EKnc++~> +JcGcMr;_EKJcCi3r;_EKnc++~> +JcGcMr;_EKJcCi3r;_EKnc++~> +JcG`Lr;_EKJcCr6quD +JcG`Lr;_EKJcCr6quD +JcG`Lr;_EKJcCr6quD +JcG]Kr;_EKJcD#8quD +JcG]Kr;_EKJcD#8quD +JcG]Kr;_EKJcD#8quD +JcGZJquD +JcGZJquD +JcGZJquD +JcGWIqZ)3IJcD;@q>c*HmJh\~> +JcGWIqZ)3IJcD;@q>c*HmJh\~> +JcGWIqZ)3IJcD;@q>c*HmJh\~> +JcGTHq>c*HJcDGDq>c*Hli2J~> +JcGTHq>c*HJcDGDq>c*Hli2J~> +JcGTHq>c*HJcDGDq>c*Hli2J~> +JcGZJ!!*#uJH16$QN2U:l2Q8~> +JcGZJ!!*#uJH16$QN2U:l2Q8~> +JcGZJ!!*#uJH16$QN2U:l2Q8~> +JcGcMquH]qJH2bOrjRFYo)O at AkPp&~> +JcGcMquH]qJH2bOrh+fBo)O at AkPp&~> +JcGcMquH]qJH2bOrh+fBo)O at AkPp&~> +KE(]HqYu*HY5nO1JH5EEJcFg2J,~> +KE(]HqYu*HY5nNoJH5EEJcFg2J,~> +KE(]HqYu*HY5nNoJH5EEJcFg2J,~> +LB$rIR/d$`QN-llJcC<$g])d~> +LB$rIR/d$`QN-lUJcC<$g])d~> +LB$rIR/d$`QN-lUJcC<$g])d~> +M?!/IRK**`QN-llJcC<$g])d~> +M?!/IRK**`QN-lUJcC<$g])d~> +M?!/IRK**`QN-lUJcC<$g])d~> +NW8JJRK**`Q2g`jJcC<$h#Dm~> +NW8JJRK**`Q2g`SJcC<$h#Dm~> +NW8JJRK**`Q2g`SJcC<$h#Dm~> +NW8MKRK*'_Q2g]iJcC<$h>`!~> +NW8MKRK*'_Q2g]RJcC<$h>`!~> +NW8MKRK*'_Q2g]RJcC<$h>`!~> +NrSVLRK*$^Q2g]iJcC<$h>`!~> +NrSVLRK*$^Q2g]RJcC<$h>`!~> +NrSVLRK*$^Q2g]RJcC<$h>`!~> +NW8PLRfE*^Q2gZhJcC<$hZ&*~> +NW8PLRfE*^Q2gZQJcC<$hZ&*~> +NW8PLRfE*^Q2gZQJcC<$hZ&*~> +N;rMMS,`-]Q2gWgJcC<$huA3~> +N;rMMS,`-]Q2gWPJcC<$huA3~> +N;rMMS,`-]Q2gWPJcC<$huA3~> +N;rPNS,`-]PlLNfJcC<$huA3~> +N;rPNS,`-]PlLNOJcC<$huA3~> +N;rPNS,`-]PlLNOJcC<$huA3~> +NW8YOS,`*\PlLKeJcC<$i;\<~> +NW8YOS,`*\PlLKNJcC<$i;\<~> +NW8YOS,`*\PlLKNJcC<$i;\<~> +NrS_OSH&0\PlLHdJcC<$iW"E~> +NrS_OSH&0\PlLHMJcC<$iW"E~> +NrS_OSH&0\PlLHMJcC<$iW"E~> +OT51X!<;lqS,`'[PlLHdJcC<$iW"E~> +OT51X!<;lqS,`'[PlLHMJcC<$iW"E~> +OT51X!<;lqS,`'[PlLHMJcC<$iW"E~> +OoP=ZrVucqRfDsZPlLEcJcC<$ir=N~> +OoP=ZrVucqRfDsZPlLELJcC<$ir=N~> +OoP=ZrVucqRfDsZPlLELJcC<$ir=N~> +PQ1L[r;Z]qR/cgZPQ19aJcC<$j8XW~> +PQ1L[r;Z]qR/cgZPQ19JJcC<$j8XW~> +PQ1L[r;Z]qR/cgZPQ19JJcC<$j8XW~> +PlLU\qZ$NpQN-[ZPQ19aJcC<$j8XW~> +PlLU\qZ$NpQN-[ZPQ19JJcC<$j8XW~> +PlLU\qZ$NpQN-[ZPQ19JJcC<$j8XW~> +Q2ga^M?!>NPQ19aJcC<$j8XW~> +Q2ga^M?!>NPQ19JJcC<$j8XW~> +Q2ga^M?!>NPQ19JJcC<$j8XW~> +QiHp_M#[5MPQ19aJcC<$j8XW~> +QiHp_M#[5MPQ19JJcC<$j8XW~> +QiHp_M#[5MPQ19JJcC<$j8XW~> +R/d'aL]@>Rrr;osPQ1BdJcC<$i;\<~> +R/d'aL]@>Rrr;osPQ1BMJcC<$i;\<~> +R/d'aL]@>Rrr;osPQ1BMJcC<$i;\<~> +RfE6bL]@;QN;r[^JcC<$huA3~> +RfE6bL]@;QN;r[GJcC<$huA3~> +RfE6bL]@;QN;r[GJcC<$huA3~> +S,`BdL&_,PMZ<[bs8W)-JcC<$huA3~> +S,`BdL&_,PMZ<[Ks8W(kJcC<$huA3~> +S,`BdL&_,PMZ<[Ks8W(kJcC<$huA3~> +ScAQeL&_)OL&_.]JcC<$huA3~> +ScAQeL&_)OL&_.FJcC<$huA3~> +ScAQeL&_)OL&_.FJcC<$huA3~> +T)\]gKE(oNK`D%\JcC<$huA3~> +T)\]gKE(oNK`D%EJcC<$huA3~> +T)\]gKE(oNK`D%EJcC<$huA3~> +T`=lhKE(lMKE(q[JcC<$i;\<~> +T`=lhKE(lMKE(qDJcC<$i;\<~> +T`=lhKE(lMKE(qDJcC<$i;\<~> +U&Y#jK)bcLK)bhZJcC<$i;\<~> +U&Y#jK)bcLK)bhCJcC<$i;\<~> +U&Y#jK)bcLK)bhCJcC<$i;\<~> +U]:2kJcG]LJcG_YJcC<$i;\<~> +U]:2kJcG]LJcG_BJcC<$i;\<~> +U]:2kJcG]LJcG_BJcC<$i;\<~> +V#U>mJc>`Mr;_EKrjRIYJcF[.J,~> +V#U>mJc>`Mr;_EKrh+iBJcF[.J,~> +V#U>mJc>`Mr;_EKrh+iBJcF[.J,~> +VZ6MnJcGcMrW%NLs8W)-JcC<$iW"E~> +VZ6MnJcGcMrW%NLs8W(kJcC<$iW"E~> +VZ6MnJcGcMrW%NLs8W(kJcC<$iW"E~> +VuQYpJcG`Lr;_EKs8W)-JcC<$iW"E~> +VuQYpJcG`Lr;_EKs8W(kJcC<$iW"E~> +VuQYpJcG`Lr;_EKs8W(kJcC<$iW"E~> +WW2hqJcG]KrW%NLrr;u,JcC<$iW"E~> +WW2hqJcG]KrW%NLrr;tjJcC<$iW"E~> +WW2hqJcG]KrW%NLrr;tjJcC<$iW"E~> +WrMtsJcGZJr;_EKrr;r+JcC<$ir=N~> +WrMtsJcGZJr;_EKrr;qiJcC<$ir=N~> +WrMtsJcGZJr;_EKrr;qiJcC<$ir=N~> +XT/.tJcGZJr;_EKr;Zc*JcC<$ir=N~> +XT/.tJcGZJr;_EKr;ZbhJcC<$ir=N~> +XT/.tJcGZJr;_EKr;ZbhJcC<$ir=N~> +XoJ;!JcGTHrW%NLqu?Z)JcC<$ir=N~> +XoJ;!JcGTHrW%NLqu?YgJcC<$ir=N~> +XoJ;!JcGTHrW%NLqu?YgJcC<$ir=N~> +YQ+J"JcGTHr;_EKqu?Z)JcC<$ir=N~> +YQ+J"JcGTHr;_EKqu?YgJcC<$ir=N~> +YQ+J"JcGTHr;_EKqu?YgJcC<$ir=N~> +YlFV$JcGNFrW%NLq>^H'JcC<$j8XW~> +YlFV$JcGNFrW%NLq>^GeJcC<$j8XW~> +YlFV$JcGNFrW%NLq>^GeJcC<$j8XW~> +ZN'e%JcGNFr;_EKq>^H'JcC<$j8XW~> +ZN'e%JcGNFr;_EKq>^GeJcC<$j8XW~> +ZN'e%JcGNFr;_EKq>^GeJcC<$j8XW~> +ZiBq'JcGKEr;_EKq#C?&JcC<$j8XW~> +ZiBq'JcGKEr;_EKq#C>dJcC<$j8XW~> +ZiBq'JcGKEr;_EKq#C>dJcC<$j8XW~> +[K$+(JcGHDrW%NLp](6%JcC<$j8XW~> +[K$+(JcGHDrW%NLp](5cJcC<$j8XW~> +[K$+(JcGHDrW%NLp](5cJcC<$j8XW~> +[f?7*JcGECr;_EKpAb-$JcC<$jSs`~> +[f?7*JcGECr;_EKpAb,bJcC<$jSs`~> +[f?7*JcGECr;_EKpAb,bJcC<$jSs`~> +\GuF+JcGBBrW%NLp&G$#JcC<$jSs`~> +\GuF+JcGBBrW%NLp&G#aJcC<$jSs`~> +\GuF+JcGBBrW%NLp&G#aJcC<$jSs`~> +\c;O,JcGBBr;_EKp&G$#JcC<$jSs`~> +\c;O,JcGBBr;_EKp&G#aJcC<$jSs`~> +\c;O,JcGBBr;_EKp&G#aJcC<$jSs`~> +]Dqa.JcG<@rW%NLo`+m!JcC<$jo9i~> +]Dqa.JcG<@rW%NLo`+l_JcC<$jo9i~> +]Dqa.JcG<@rW%NLo`+l_JcC<$jo9i~> +]`7j/JcG<@rW%NLo)J]uJcC<$jo9i~> +]`7j/JcG<@rW%NLo)J]^JcC<$jo9i~> +]`7j/JcG<@rW%NLo)J]^JcC<$jo9i~> +^&S!1JcG9?r;_EKo)J]uJcC<$jo9i~> +^&S!1JcG9?r;_EKo)J]^JcC<$jo9i~> +^&S!1JcG9?r;_EKo)J]^JcC<$jo9i~> +^]402JcG6>rW%NLnc/TtJcC<$jo9i~> +^]402JcG6>rW%NLnc/T]JcC<$jo9i~> +^]402JcG6>rW%NLnc/T]JcC<$jo9i~> +_#O<4JcG3=r;_EKnGiKsJcC<$k5Tr~> +_#O<4JcG3=r;_EKnGiK\JcC<$k5Tr~> +_#O<4JcG3=r;_EKnGiK\JcC<$k5Tr~> +_Z0K5JcG0 +_Z0K5JcG0 +_Z0K5JcG0 +_uKW7JcG-;r;_EKn,NBrJcC<$k5Tr~> +_uKW7JcG-;r;_EKn,NB[JcC<$k5Tr~> +_uKW7JcG-;r;_EKn,NB[JcC<$k5Tr~> +`W,f8JcG-;r;_EKmf39qJcC<$k5Tr~> +`W,f8JcG-;r;_EKmf39ZJcC<$k5Tr~> +`W,f8JcG-;r;_EKmf39ZJcC<$k5Tr~> +`rGr:JcG'9rW%NLm/R'oJcC<$kPp&~> +`rGr:JcG'9rW%NLm/R'XJcC<$kPp&~> +`rGr:JcG'9rW%NLm/R'XJcC<$kPp&~> +aT),;JcG'9r;_EKm/R'oJcC<$kPp&~> +aT),;JcG'9r;_EKm/R'XJcC<$kPp&~> +aT),;JcG'9r;_EKm/R'XJcC<$kPp&~> +aoD8=JcG!7rW%NLli6snJcC<$kPp&~> +aoD8=JcG!7rW%NLli6sWJcC<$kPp&~> +aoD8=JcG!7rW%NLli6sWJcC<$kPp&~> +bQ%G>JcG!7r;_EKli6pmJcC<$kl6/~> +bQ%G>JcG!7r;_EKli6pVJcC<$kl6/~> +bQ%G>JcG!7r;_EKli6pVJcC<$kl6/~> +bl at S@JcFs6r;_EKl2UalJcC<$kl6/~> +bl at S@JcFs6r;_EKl2UaUJcC<$kl6/~> +bl at S@JcFs6r;_EKl2UaUJcC<$kl6/~> +cN!bAJcFp5rW%NLkl:XkJcC<$kl6/~> +cN!bAJcFp5rW%NLkl:XTJcC<$kl6/~> +cN!bAJcFp5rW%NLkl:XTJcC<$kl6/~> +ci +ci +ci +dJs(DJcFj3rW%NLk5YFiJcC<$l2Q8~> +dJs(DJcFj3rW%NLk5YFRJcC<$l2Q8~> +dJs(DJcFj3rW%NLk5YFRJcC<$l2Q8~> +df94FJcFg2r;_EKk5YFiJcC<$l2Q8~> +df94FJcFg2r;_EKk5YFRJcC<$l2Q8~> +df94FJcFg2r;_EKk5YFRJcC<$l2Q8~> +eGoCGJcFd1rW%NLjo>=hJcC<$l2Q8~> +eGoCGJcFd1rW%NLjo>=QJcC<$l2Q8~> +eGoCGJcFd1rW%NLjo>=QJcC<$l2Q8~> +ec5OIJcFa0r;_EKjo>=hJcC<$l2Q8~> +ec5OIJcFa0r;_EKjo>=QJcC<$l2Q8~> +ec5OIJcFa0r;_EKjo>=QJcC<$l2Q8~> +fDk^JJcFa0r;_EKj8]+fJcC<$lMlA~> +fDk^JJcFa0r;_EKj8]+OJcC<$lMlA~> +fDk^JJcFa0r;_EKj8]+OJcC<$lMlA~> +f`1jLJcF[.rW%NLirB"eJcC<$lMlA~> +f`1jLJcF[.rW%NLirB"NJcC<$lMlA~> +f`1jLJcF[.rW%NLirB"NJcC<$lMlA~> +gAh$MJcF[.r;_EKirB"eJcC<$lMlA~> +gAh$MJcF[.r;_EKirB"NJcC<$lMlA~> +gAh$MJcF[.r;_EKirB"NJcC<$lMlA~> +g].0OJcFU,rW%NLiW&kcJcC<$li2J~> +g].0OJcFU,rW%NLiW&kLJcC<$li2J~> +g].0OJcFU,rW%NLiW&kLJcC<$li2J~> +h>d?PJcFU,r;_EKi;`ecJcC<$li2J~> +h>d?PJcFU,r;_EKi;`eLJcC<$li2J~> +h>d?PJcFU,r;_EKi;`eLJcC<$li2J~> +hZ*KRJcFR+r;_EKhuE\bJcC<$li2J~> +hZ*KRJcFR+r;_EKhuE\KJcC<$li2J~> +hZ*KRJcFR+r;_EKhuE\KJcC<$li2J~> +i;`ZSJcFO*rW%NLhZ*SaJcC<$li2J~> +i;`ZSJcFO*rW%NLhZ*SJJcC<$li2J~> +i;`ZSJcFO*rW%NLhZ*SJJcC<$li2J~> +iW&cTJcFO*r;_EKh>dJ`JcC<$m/MS~> +iW&cTJcFO*r;_EKh>dJIJcC<$m/MS~> +iW&cTJcFO*r;_EKh>dJIJcC<$m/MS~> +irAoVJcFI(rW%NLh#IA_JcC<$m/MS~> +irAoVJcFI(rW%NLh#IAHJcC<$m/MS~> +irAoVJcFI(rW%NLh#IAHJcC<$m/MS~> +jT#)WJcFI(r;_EKh#IA_JcC<$m/MS~> +jT#)WJcFI(r;_EKh#IAHJcC<$m/MS~> +jT#)WJcFI(r;_EKh#IAHJcC<$m/MS~> +jo>5YJcFC&rW%NLg].8^JcC<$m/MS~> +jo>5YJcFC&rW%NLg].8GJcC<$m/MS~> +jo>5YJcFC&rW%NLg].8GJcC<$m/MS~> +kPtDZJcFC&r;_EKgAh/]JcC<$mJh\~> +kPtDZJcFC&r;_EKgAh/FJcC<$mJh\~> +kPtDZJcFC&r;_EKgAh/FJcC<$mJh\~> +kl:P\JcF@%r;_EKg&M&\JcC<$mJh\~> +kl:P\JcF@%r;_EKg&M&EJcC<$mJh\~> +kl:P\JcF@%r;_EKg&M&EJcC<$mJh\~> +lMp_]JcF=$rW%NLf`1r[JcC<$mJh\~> +lMp_]JcF=$rW%NLf`1rDJcC<$mJh\~> +lMp_]JcF=$rW%NLf`1rDJcC<$mJh\~> +li6k_JcF:#r;_EKf`1oZJcC<$mf.e~> +li6k_JcF:#r;_EKf`1oCJcC<$mf.e~> +li6k_JcF:#r;_EKf`1oCJcC<$mf.e~> +mJm%`JcF7"rW%NLf)P`YJcC<$mf.e~> +mJm%`JcF7"rW%NLf)P`BJcC<$mf.e~> +mJm%`JcF7"rW%NLf)P`BJcC<$mf.e~> +mf31bJcF4!r;_EKf)P`YJcC<$mf.e~> +mf31bJcF4!r;_EKf)P`BJcC<$mf.e~> +mf31bJcF4!r;_EKf)P`BJcC<$mf.e~> +nGi at cJcF4!r;_EKec5WXJcC<$mf.e~> +nGi at cJcF4!r;_EKec5WAJcC<$mf.e~> +nGi at cJcF4!r;_EKec5WAJcC<$mf.e~> +nc/LeJcF-trW%NLe,TEVJcC<$n,In~> +nc/LeJcF-trW%NLe,TE?JcC<$n,In~> +nc/LeJcF-trW%NLe,TE?JcC<$n,In~> +oDe[fJcF-tr;_EKe,TEVJcC<$n,In~> +oDe[fJcF-tr;_EKe,TE?JcC<$n,In~> +oDe[fJcF-tr;_EKe,TE?JcC<$n,In~> +o`+ghJcF'rrW%NLdf9 +o`+ghJcF'rrW%NLdf9<>JcC<$n,In~> +o`+ghJcF'rrW%NLdf9<>JcC<$n,In~> +pAb!iJcF'rr;_EKdf9 +pAb!iJcF'rr;_EKdf9<>JcC<$n,In~> +pAb!iJcF'rr;_EKdf9<>JcC<$n,In~> +p](-kJcF$qr;_EKd/X*SJcC<$nGe"~> +p](-kJcF$qr;_EKd/X* +p](-kJcF$qr;_EKd/X* +q>^ +q>^ +q>^ +qZ$HnJcEsor;_EKci=!RJcC<$nGe"~> +qZ$HnJcEsor;_EKci=!;JcC<$nGe"~> +qZ$HnJcEsor;_EKci=!;JcC<$nGe"~> +r;ZWoJcEpnrW%NLc2[dPJcC<$nc++~> +r;ZWoJcEpnrW%NLc2[d9JcC<$nc++~> +r;ZWoJcEpnrW%NLc2[d9JcC<$nc++~> +rVucqJcEmmr;_EKc2[dPJcC<$nc++~> +rVucqJcEmmr;_EKc2[d9JcC<$nc++~> +rVucqJcEmmr;_EKc2[d9JcC<$nc++~> +s8VrrJcEjlrW%NLbl@[OJcC<$nc++~> +s8VrrJcEjlrW%NLbl@[8JcC<$nc++~> +s8VrrJcEjlrW%NLbl@[8JcC<$nc++~> +!<;rsJcEgkr;_EKbl@[OJcC<$nc++~> +!<;rsJcEgkr;_EKbl@[8JcC<$nc++~> +!<;rsJcEgkr;_EKbl@[8JcC<$nc++~> +quD +quD +quD +r;_EKa8c,=JcEjlrjRIYJcG<@J,~> +r;_EKa8c,=JcEjlrh+iBJcG<@J,~> +r;_EKa8c,=JcEjlrh+iBJcG<@J,~> +rr at WM`rGu;JcEjlrjRIYJcG<@J,~> +rr at WM`rGu;JcEjlrh+iBJcG<@J,~> +rr at WM`rGu;JcEjlrh+iBJcG<@J,~> +!!%TM`W,o;JcEgkrO7 at XJcG?AJ,~> +!!%TM`W,o;JcEgkrLe`AJcG?AJ,~> +!!%TM`W,o;JcEgkrLe`AJcG?AJ,~> +JcE^hr;_EKa8c.JJcC<$oDa=~> +JcE^hr;_EKa8c.3JcC<$oDa=~> +JcE^hr;_EKa8c.3JcC<$oDa=~> +JcEair;_EK`rH%IJcC<$oDa=~> +JcEair;_EK`rH%2JcC<$oDa=~> +JcEair;_EK`rH%2JcC<$oDa=~> +JcEairW%NL`W,qHJcC<$oDa=~> +JcEairW%NL`W,q1JcC<$oDa=~> +JcEairW%NL`W,q1JcC<$oDa=~> +JcEdjr;_EK`;fhGJcC<$o`'F~> +JcEdjr;_EK`;fh0JcC<$o`'F~> +JcEdjr;_EK`;fh0JcC<$o`'F~> +JcEdjrW%NL_uK_FJcC<$o`'F~> +JcEdjrW%NL_uK_/JcC<$o`'F~> +JcEdjrW%NL_uK_/JcC<$o`'F~> +%%EndData +showpage +%%Trailer +end +%%EOF + +%%EndDocument + @endspecial 6341 3367 V 1452 3374 4897 7 v -240 3683 +a Fj(Figure)62 b(16:)84 b Fm(This)57 b(is)h(the)f(collapsed)h(no)5 +b(de)57 b(from)g(main)h(that)e(represen)-5 b(ts)58 b(the)f +(eonImageCalculator.)79 b(It)57 b(actually)f(has)i(around)-240 +3882 y(200)d(no)5 b(des)56 b(p)5 b(oin)-5 b(ting)56 b(to)f(it,)g(it)g +(has)h(b)5 b(een)55 b(pared)h(do)-5 b(wn)56 b(to)f(\014t)g(the)g(page.) +p 1797 4105 4152 7 v 1794 4304 7 200 v 2939 4304 V 2973 +4304 V 3075 4245 a Fn(Static)64 b(#LDS)p 4247 4304 V +4281 4304 V 233 w(Individual)g(No)5 b(des)p 5912 4304 +V 5946 4304 V 1794 4468 V 2939 4468 V 2973 4468 V 3337 +4468 V 3703 4468 V 4247 4468 V 4281 4468 V 4728 4468 +V 5094 4468 V 5436 4468 V 5945 4468 V 1794 4631 V 1896 +4572 a(Benc)-5 b(hmark)p 2939 4631 V 2973 4631 V 248 +w(N)p 3337 4631 V 215 w(G)p 3703 4631 V 430 w(L)p 4247 +4631 V 4281 4631 V 331 w(K)p 4728 4631 V 293 w(I)p 5094 +4631 V 200 w(O)p 5436 4631 V 371 w(C)p 5945 4631 V 1797 +4638 4152 7 v 1797 4671 V 1794 4871 7 200 v 1896 4811 +a Fm(181.mcf)p 2939 4871 V 2973 4871 V 704 w(2)p 3337 +4871 V 282 w(2)p 3703 4871 V 462 w(0)p 4247 4871 V 4281 +4871 V 398 w(5)p 4728 4871 V 282 w(0)p 5094 4871 V 260 +w(0)p 5436 4871 V 425 w(2)p 5945 4871 V 1794 5070 V 1896 +5010 a(197.parser)p 2939 5070 V 2973 5070 V 440 w(40)p +3337 5070 V 199 w(20)p 3703 5070 V 379 w(20)p 4247 5070 +V 4281 5070 V 232 w(105)p 4728 5070 V 199 w(53)p 5094 +5070 V 260 w(3)p 5436 5070 V 342 w(55)p 5945 5070 V 1794 +5269 V 1896 5209 a(300.t)g(w)g(olf)p 2939 5269 V 2973 +5269 V 529 w(23)p 3337 5269 V 199 w(21)p 3703 5269 V +462 w(2)p 4247 5269 V 4281 5269 V 315 w(97)p 4728 5269 +V 282 w(6)p 5094 5269 V 260 w(7)p 5436 5269 V 342 w(29)p +5945 5269 V 1794 5468 V 1896 5409 a(espresso)p 2939 5468 +V 2973 5468 V 596 w(33)p 3337 5468 V 282 w(7)p 3703 5468 +V 379 w(26)p 4247 5468 V 4281 5468 V 232 w(148)p 4728 +5468 V 199 w(67)p 5094 5468 V 260 w(0)p 5436 5468 V 342 +w(47)p 5945 5468 V 1794 5668 V 1896 5608 a(fpgro)g(wth)p +2939 5668 V 2973 5668 V 616 w(3)p 3337 5668 V 282 w(0)p +3703 5668 V 462 w(3)p 4247 5668 V 4281 5668 V 398 w(9)p +4728 5668 V 282 w(0)p 5094 5668 V 260 w(0)p 5436 5668 +V 425 w(2)p 5945 5668 V 1794 5867 V 1896 5807 a(eon)p +2939 5867 V 2973 5867 V 1013 w(1)p 3337 5867 V 282 w(1)p +3703 5867 V 462 w(0)p 4247 5867 V 4281 5867 V 398 w(1)p +4728 5867 V 282 w(0)p 5094 5867 V 260 w(1)p 5436 5867 +V 425 w(1)p 5945 5867 V 1797 5874 4152 7 v 1749 6182 +a Fj(T)-15 b(able)60 b(1:)81 b(Observ)-5 b(ed)60 b(statistics)e(for)i +(link)-5 b(ed)59 b(data)i(structures)215 6667 y(data)g(structures)h(w) +-5 b(e)62 b(ha)-5 b(v)g(e)62 b(man)-5 b(ually)61 b(iden)-5 +b(ti\014ed)61 b(as)h(non-trivial,)e(logically)g(distinct)g(data)i +(structures)g(in)f(the)215 6941 y(co)5 b(des)68 b(\(column)f(N)i(sho)-5 +b(ws)69 b(the)f(total)g(n)-5 b(um)g(b)5 b(er)68 b(of)h(suc)-5 +b(h)68 b(data)h(structures\).)103 b(F)-15 b(or)69 b(example,)g(w)-5 +b(e)69 b(iden)-5 b(ti\014ed)67 b(23)215 7215 y(suc)-5 +b(h)49 b(data)h(structures)f(in)g Fc(twolf)p Fj(.)80 +b(In)49 b Fc(eon)p Fj(,)k(ho)-5 b(w)g(ev)g(er,)52 b(a)e(complex)f(data) +g(structure)h(with)f(man)-5 b(y)50 b(sub-structures)215 +7489 y(b)5 b(ecame)59 b(merged)h(with)g(unrelated)g(global)f(arra)-5 +b(ys)60 b(\(and)h(b)5 b(ecame)59 b(collapsed\).)-18 7897 +y(2.)91 b(In)60 b(a)g(n)-5 b(um)g(b)5 b(er)60 b(of)f(cases)h(\(column)e +(I\),)i(DSA)g(iden)-5 b(ti\014ed)59 b(2)h(or)g(more)g(disjoin)-5 +b(t)58 b(instances)h(of)h(no)5 b(des)59 b(represen)-5 +b(ting)215 8171 y(recursiv)g(e)59 b(data)h(structures,)f(requiring)h(a) +h(con)-5 b(text-sensitiv)g(e)56 b(analysis.)-18 8580 +y(3.)91 b(In)66 b(a)h(n)-5 b(um)g(b)5 b(er)66 b(of)g(other)g(cases)g +(\(column)f(C\),)i(ho)-5 b(w)g(ev)g(er,)67 b(a)g(DS)f(no)5 +b(de)67 b(has)f(m)-5 b(ultiple)65 b(instances)g(\(e.g.,)h(a)g(list)g +(of)215 8854 y(lists\))f(and)j(DSA)h(is)e(unable)g(to)h(distinguish)e +(these)h(instances.)100 b(A)69 b(p)5 b(o)-5 b(w)g(erful,)69 +b(\015o)-5 b(w-sensitiv)g(e)65 b(analysis)h(w)-5 b(ould)215 +9127 y(ha)g(v)g(e)60 b(b)5 b(een)60 b(required)g(to)g(distinguish)f +(most)g(of)h(these)g(cases.)-18 9536 y(4.)91 b(Most)56 +b(DS)h(no)5 b(des)57 b(of)g(these)f(data)h(structures)f(\(K-O\))h(ha)-5 +b(v)g(e)57 b(accurate)f(t)-5 b(yp)5 b(e)57 b(information.)77 +b(The)58 b(exceptions)d(are)215 9810 y(usually)k(minor,)g(except)h(for) +g(the)g(collapsed)f(no)5 b(de)60 b(in)g(eon.)-18 10218 +y(5.)91 b(DSA)70 b(accurately)f(iden)-5 b(ti\014ed)69 +b(the)h(lifetimes)d(\(lo)5 b(cal,)71 b(L,)f(or)g(global,)h(G\))f(of)g +(all)g(the)g(data)g(structures)f(w)-5 b(e)70 b(ha)-5 +b(v)g(e)215 10492 y(examined)59 b(so)h(far,)g(except)f(an)i(imp)5 +b(ortan)-5 b(t)59 b(case)h(in)g Fc(fpgrowth)p Fj(,)k(discussed)59 +b(next.)-18 10900 y(6.)91 b(In)59 b Fc(fpgrowth)p Fj(,)k(a)d(recursiv) +-5 b(e)58 b(function)g(creates)h(a)h(new)g(tree)f(and)g(a)h(new)g +(\\item)e(table",)g(plus)h(three)h(other)f(new)215 11174 +y(ob)10 b(jects)65 b(on)i(eac)-5 b(h)66 b(recursiv)-5 +b(e)66 b(call.)98 b(DSA)67 b(w)-5 b(as)67 b(unable)f(to)g(pro)-5 b(v)g(e)67 b(the)g(new)g(tree)f(and)h(item)e(table)h(are)h(lo)5 -b(cal)65 b(to)215 8074 y(the)e(function)f(\(b)5 b(ecause)62 -b(they)h(are)g(passed)g(to)g(the)g(next)g(recursiv)-5 +b(cal)65 b(to)3809 11672 y(23)p eop end +%%Page: 24 24 +TeXDict begin 24 23 bop 215 77 a Fj(the)63 b(function)f(\(b)5 +b(ecause)62 b(they)h(are)g(passed)g(to)g(the)g(next)g(recursiv)-5 b(e)62 b(call\))g(but)h(is)g(able)g(to)g(do)g(so)g(for)g(the)g(other) -215 8348 y(three)c(ob)10 b(jects)59 b(\(whic)-5 b(h)59 +215 351 y(three)c(ob)10 b(jects)59 b(\(whic)-5 b(h)59 b(are)h(not\).)80 b(The)60 b(recursiv)-5 b(e)59 b(p)5 b(olymorphism)58 b(of)h(Chin)h(et)g(al.)f([1)o(])h(ma)-5 -b(y)59 b(con\014ne)h(the)f(lo)5 b(cal)215 8622 y(tree)60 -b(as)g(w)-5 b(ell.)42 9095 y(Ov)g(erall,)44 b(on)c(the)h(p)5 +b(y)59 b(con\014ne)h(the)f(lo)5 b(cal)215 625 y(tree)60 +b(as)g(w)-5 b(ell.)42 1098 y(Ov)g(erall,)44 b(on)c(the)h(p)5 b(ositiv)-5 b(e)39 b(side,)k(our)e(insp)5 b(ection)38 b(has)j(sho)-5 b(wn)40 b(that)g(DSA)h(is)f(successful)f(at)h -(distinguishing)e(di\013eren)-5 b(t)-240 9369 y(kinds)43 +(distinguishing)e(di\013eren)-5 b(t)-240 1372 y(kinds)43 b(of)h(data)f(structures,)j(their)d(t)-5 b(yp)5 b(e)44 b(and)g(lifetimes,)f(and)h(in)g(man)-5 b(y)43 b(cases,)j(is)e -(successful)d(at)j(distinguishing)d(distinct)-240 9643 +(successful)d(at)j(distinguishing)d(distinct)-240 1646 y(instances)i(of)h(suc)-5 b(h)45 b(structures)e(via)h(con)-5 b(text-sensitivit)g(y)-15 b(.)71 b(W)-15 b(e)44 b(found)h(only)f(t)-5 b(w)g(o)44 b(signi\014can)-5 b(t)43 b(cases)h(\(in)g -Fc(mcf)91 b Fj(and)45 b Fc(twolf)-240 9917 y Fj(\))74 +Fc(mcf)91 b Fj(and)45 b Fc(twolf)-240 1920 y Fj(\))74 b(where)h(uni\014cation)e(caused)h(unrelated)g(data)g(structures)g(to)g (b)5 b(e)74 b(merged.)122 b(W)-15 b(e)74 b(consider)g(this)g(a)g(p)5 -b(ositiv)-5 b(e)73 b(result)-240 10191 y(b)5 b(ecause)58 +b(ositiv)-5 b(e)73 b(result)-240 2194 y(b)5 b(ecause)58 b(uni\014cation)f(is)h(a)h(crucial)f(factor)g(in)g(ac)-5 b(hieving)57 b(a)i(v)-5 b(ery)59 b(fast)f(analysis.)78 b(W)-15 b(e)58 b(b)5 b(eliev)-5 b(e)57 b(this)h(result)g(is)g(ac)-5 -b(hiev)g(ed)-240 10465 y(b)5 b(ecause)81 b(of)g(our)h(fo)5 +b(hiev)g(ed)-240 2468 y(b)5 b(ecause)81 b(of)g(our)h(fo)5 b(cus)81 b(on)g(heap-allo)5 b(cated)80 b(data)h(structures)f(\(whic)-5 b(h)81 b(are)h(di\016cult)e(to)h(trac)-5 b(k)82 b(precisely)e(with)h -(or)-240 10739 y(without)56 b(uni\014cation\))f(and)h(b)5 +(or)-240 2742 y(without)56 b(uni\014cation\))f(and)h(b)5 b(ecause)56 b(con)-5 b(text-sensitivit)g(y)53 b(eliminates)g(some)j(of) g(the)h(k)-5 b(ey)56 b(w)-5 b(eaknesses)55 b(of)i(uni\014cation)-240 -11013 y(\(for)j(function)f(parameters\).)3809 11672 y(23)p -eop end -%%Page: 24 24 -TeXDict begin 24 23 bop 42 77 a Fj(On)98 b(the)f(other)g(hand,)106 -b(DSA)98 b(is)e(unable)h(to)g(distinguish)e(instances)g(within)i(a)g -(collection)e(\(requiring)h(\015o)-5 b(w-)-240 351 y(sensitivit)g(y\)) -74 b(or)k(instances)e(requiring)g(con)-5 b(text-sensitivit)g(y)73 -b(within)k(a)g(recursiv)-5 b(e)77 b(computation.)129 -b(W)-15 b(e)77 b(b)5 b(eliev)-5 b(e)76 b(lac)-5 b(k)-240 -625 y(of)61 b(\015o)-5 b(w-sensitivit)g(y)59 b(is)i(b)-5 -b(y)62 b(far)f(the)g(greatest)g(limitation,)d(but)k(also)e(w)-5 -b(ould)62 b(b)5 b(e)62 b(a)f(particularly)f(exp)5 b(ensiv)-5 -b(e)61 b(feature)f(to)-240 899 y(add)h(to)f(an)g(in)-5 +3015 y(\(for)j(function)f(parameters\).)42 3289 y(On)98 +b(the)f(other)g(hand,)106 b(DSA)98 b(is)e(unable)h(to)g(distinguish)e +(instances)g(within)i(a)g(collection)e(\(requiring)h(\015o)-5 +b(w-)-240 3563 y(sensitivit)g(y\))74 b(or)k(instances)e(requiring)g +(con)-5 b(text-sensitivit)g(y)73 b(within)k(a)g(recursiv)-5 +b(e)77 b(computation.)129 b(W)-15 b(e)77 b(b)5 b(eliev)-5 +b(e)76 b(lac)-5 b(k)-240 3837 y(of)61 b(\015o)-5 b(w-sensitivit)g(y)59 +b(is)i(b)-5 b(y)62 b(far)f(the)g(greatest)g(limitation,)d(but)k(also)e +(w)-5 b(ould)62 b(b)5 b(e)62 b(a)f(particularly)f(exp)5 +b(ensiv)-5 b(e)61 b(feature)f(to)-240 4111 y(add)h(to)f(an)g(in)-5 b(ter-pro)5 b(cedural)59 b(algorithm)g(lik)-5 b(e)59 -b(DSA.)-240 1486 y Fk(References)-240 1856 y Fb([1])90 +b(DSA.)-240 4699 y Fk(References)-240 5068 y Fb([1])90 b(W.-N.)42 b(Chin,)i(F.)e(Craciun,)i(S.)e(Qin,)i(and)e(M.)g(Rinard.)53 b(Region)42 b(inference)i(for)e(an)g(ob)9 b(ject-orien)l(ted)42 b(language.)53 b(In)43 b Fa(PLDI)p Fb(,)f(W)-13 b(ashington,)13 -2078 y(DC,)51 b(June)h(2004.)-240 2366 y([2])90 b(B.)58 +5290 y(DC,)51 b(June)h(2004.)-240 5578 y([2])90 b(B.)58 b(Hac)l(k)l(ett)f(and)i(R.)f(Rugina.)89 b(Region-based)58 b(shap)t(e)h(analysis)e(with)h(trac)l(k)l(ed)g(lo)t(cations.)87 b(In)59 b Fa(POPL)p Fb(,)f(pages)g(310{323,)g(New)h(Y)-13 -b(ork,)13 2587 y(NY,)51 b(USA,)h(2005.)-240 2875 y([3])90 +b(ork,)13 5799 y(NY,)51 b(USA,)h(2005.)-240 6087 y([3])90 b(J.)47 b(Han,)h(J.)e(P)l(ei,)h(and)g(Y.)g(Yin.)61 b(Mining)47 b(frequen)l(t)h(patterns)f(without)f(candidate)i(generation.)61 b(In)48 b Fa(Pr)-8 b(o)g(c.)51 b(A)l(CM)g(SIGMOD)f(Int'l)h(Conf.)13 -3097 y(on)56 b(Management)e(of)i(Data)f(\(SIGMOD\))p -Fb(,)50 b(pages)h(1{12,)f(2000.)-240 3385 y([4])90 b(C.)62 +6309 y(on)56 b(Management)e(of)i(Data)f(\(SIGMOD\))p +Fb(,)50 b(pages)h(1{12,)f(2000.)-240 6597 y([4])90 b(C.)62 b(Lattner.)102 b Fa(Macr)-8 b(osc)g(opic)65 b(Data)h(Structur)-8 b(e)65 b(A)l(nalysis)i(and)f(Optimization)p Fb(.)104 b(PhD)63 b(thesis,)h(Comp.)e(Sci.)h(Dept.,)j(Univ.)c(of)h(Illinois,)13 -3606 y(Urbana,)51 b(IL,)h(Ma)l(y)e(2005.)-240 3894 y([5])90 +6819 y(Urbana,)51 b(IL,)h(Ma)l(y)e(2005.)-240 7106 y([5])90 b(C.)49 b(Lattner)g(and)h(V.)f(Adv)l(e.)66 b(Automatic)49 b(p)t(o)t(ol)g(allo)t(cation:)66 b(Impro)l(ving)50 b(p)t(erformance)g (b)l(y)g(con)l(trolling)e(data)h(structure)h(la)l(y)l(out)e(in)i(the)13 -4116 y(heap.)63 b(In)48 b Fa(Pr)-8 b(o)g(c.)51 b(A)l(CM)g(SIGPLAN)h +7328 y(heap.)63 b(In)48 b Fa(Pr)-8 b(o)g(c.)51 b(A)l(CM)g(SIGPLAN)h (Conf.)g(on)g(Pr)-8 b(o)g(gr)g(amming)53 b(L)-8 b(anguage)52 b(Design)e(and)j(Implementation)h(\(PLDI\))p Fb(,)46 -b(Chicago,)i(IL,)f(Jun)13 4337 y(2005.)-240 4625 y([6])90 +b(Chicago,)i(IL,)f(Jun)13 7550 y(2005.)-240 7838 y([6])90 b(C.)46 b(Lattner)g(and)h(V.)f(Adv)l(e.)60 b(Data)46 b(structure)g(analysis:)64 b(A)46 b(fast,)g(\015o)l(w-insensitiv)l(e)f (algorithm)g(for)h(analyzing)g(link)l(ed)g(data)g(structures.)13 -4847 y(T)-13 b(ec)l(hnical)52 b(rep)t(ort,)f(2006.)-240 -5135 y([7])90 b(M.)45 b(Sagiv,)i(T.)e(Reps,)i(and)g(R.)f(Wilhelm.)58 +8059 y(Submitted)52 b(for)f(publication,)g(No)l(v.)f(2005.)-240 +8347 y([7])90 b(M.)45 b(Sagiv,)i(T.)e(Reps,)i(and)g(R.)f(Wilhelm.)58 b(Solving)46 b(shap)t(e-analysis)f(problems)h(in)g(languages)g(with)f (destructiv)l(e)i(up)t(dating.)59 b Fa(TOPLAS)p Fb(,)13 -5356 y(20\(1\),)50 b(Jan.)h(1998.)3809 11672 y Fj(24)p -eop end -%%Page: 25 25 -TeXDict begin 25 24 bop -240 -99 12963 7 v -240 11201 -7 11300 v -184 11151 a @beginspecial 0 @llx 0 @lly 771 - at urx 672 @ury 7710 @rwi @setspecial -%%BeginDocument: Figures/eon_fg2.eps -%!PS-Adobe-3.0 EPSF-3.0 -%%Creator: GraphicConverter V5.4.1 X -%%Title: eon_fg2.eps -%%CreationDate: 2005-12-06 -%%Pages: 1 -%%BoundingBox: 0 0 771 672 -%%DocumentData: Clean7Bit -%%EndComments -%%BeginProlog -%%EndProlog -%%Page: 1 1 -%ImageData: 1608 1400 8 3 0 4824 2 } exec -/languagelevel where {pop languagelevel 2 lt} {true} ifelse { - (JPEG picture requires Postscript level 2 -) dup print flush - /Helvetica findfont 20 scalefont setfont 100 100 moveto show showpage stop -} if -save -/RawData currentfile /ASCIIHexDecode filter def -/Data RawData << >> /DCTDecode filter def -771.00 672.00 scale -/DeviceRGB setcolorspace -{ << /ImageType 1 - /Width 1608 - /Height 1400 - /ImageMatrix [ 1608 0 0 -1400 0 1400 ] - /DataSource Data - /BitsPerComponent 8 - /Decode [0 1 0 1 0 1] - >> image - Data closefile - RawData flushfile - showpage - restore -} exec -FFD8FFE000104A46494600010101004800480000FFFE000C4170706C654D61 -726B0AFFDB00840007050506050507060606080707080A110B0A09090A140F -0F0C1118151919171517171A1D25201A1C231C1717212C212327282A2A2A19 -1F2E312D293125292A28010708080A090A130B0B13281B171B282828282828 -28282828282828282828282828282828282828282828282828282828282828 -28282828282828282828282828FFC401A20000010501010101010100000000 -000000000102030405060708090A0B01000301010101010101010100000000 -00000102030405060708090A0B100002010303020403050504040000017D01 -020300041105122131410613516107227114328191A1082342B1C11552D1F0 -2433627282090A161718191A25262728292A3435363738393A434445464748 -494A535455565758595A636465666768696A737475767778797A8384858687 -88898A92939495969798999AA2A3A4A5A6A7A8A9AAB2B3B4B5B6B7B8B9BAC2 -C3C4C5C6C7C8C9CAD2D3D4D5D6D7D8D9DAE1E2E3E4E5E6E7E8E9EAF1F2F3F4 -F5F6F7F8F9FA11000201020404030407050404000102770001020311040521 -31061241510761711322328108144291A1B1C109233352F0156272D10A1624 -34E125F11718191A262728292A35363738393A434445464748494A53545556 -5758595A636465666768696A737475767778797A82838485868788898A9293 -9495969798999AA2A3A4A5A6A7A8A9AAB2B3B4B5B6B7B8B9BAC2C3C4C5C6C7 -C8C9CAD2D3D4D5D6D7D8D9DAE2E3E4E5E6E7E8E9EAF2F3F4F5F6F7F8F9FAFF -C00011080578064803012200021101031101FFDA000C03010002110311003F -00FA468A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A002 -8A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0 -028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28 -A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A -28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A002 -8A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0 -028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28 -A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A -28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A002 -8A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0 -028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28 -A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A -28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A002 -8A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0 -028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28 -A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A -28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A002 -8A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0 -028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28 -A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A -28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A002 -8A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0 -028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28 -A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A -28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A002 -8A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0 -028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28 -A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A -28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A002 -8A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0 -028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28 -A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A -28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A002 -8A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0 -028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28 -A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A -28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A002 -8A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0 -028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28 -A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A -28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A002 -8A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0 -028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28 -A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A -28A0028A28A0028A28A003349939E9C52F4A4C29E6800E683C77C518F4A3D8 -9E68010303D0E6973F8535E4441972147BD566D4ECA2CEEB841F8D005BC8F5 -A4DC3D6B325F12E8F0FF00ACD4615FA9AACFE35F0EA75D62D80FA9FF000A00 -DEE7D28AE624F889E104386D7AD01F4DC7FC2987E24F85BFE59EAD6F27D18F -F850075541AE49BE23E867FD5CCB2FFBAD4CFF008589627FD5DAC8FF004614 -01D7E7DE8CD71E7E20A9FF0057A3DD49FEEBAD31BC7B7A4623F0AEA121F457 -4A00ECF9FA519C7535C57FC277ABFF000F827553F474A3FE136D79B81E07D5 -867BEF8F8A00ED73EF4B9AE20F8B3C48FF0077C27A8A7D76534F883C56FD34 -1BC4FAAA50077391466B853AC78BDFEEE97709F544A437BE356E90BA7D625A -00EEE8E7D2B83F3BC6CDD32BF5856936F8EDBA5F469F5B75A00EF68AE0BECF -E3E3D352857DCDB2FF008521D3FE21B74D7ED13EB683FC2803BEA2B80FEC9F -88A7FE666B2FFC031FE141D1BE239FF999EC7FF00C7F850077F464579FFF00 -617C4A3C8F1669EA3D0D90FF000A5FEC0F891DFC5BA7FF00E010FF000A00EF -F39E94645701FF0008EFC443D7C57607E9663FC297FE11CF885FF43558FF00 -E01FFF005A803BEC8A322B81FF00846BC7C7EF78A2C49FFAF4FF00EB51FF00 -08CF8F3FE867B2FF00C05FFEB50077D9149915C17FC233E3BEFE27B2FF00C0 -5FFEB51FF08CF8EFFE867B2FFC05FF00EB50077D914645703FF08CF8EFB789 -ECBFF017FF00AD47FC233E3CFF00A19ECBFF00017FFAD401DF6451915C0FFC -235E3E1F77C51620FF00D7A7FF005A8FF8473E217FD0D563FF00807FFD6A00 -EFA8C8AE03FE11DF8883EEF8AEC01FFAF31FE147F607C49FFA1B74FF00FC02 -1FE1401DFD15C07F60FC491D7C59A791E9F621FE147F637C471FF333D8FF00 -E018FF000A00EFE8E7D2B80FECAF88C3FE665B23FF006E63FC29DF60F8849D -75BB67FA5A0FF0A00EF6933EF5C1F93E3C5EB7D1BFB8B75A36F8F17ADE46DF -4B75A00EF39F5A5E6B83FB478DD7AE5FE90AD1F6EF1A2F5B691BE912D00779 -CFA5264FA570C359F16A7DED26E5FE8894BFF09178A97AF87EF5BE812803B8 -C9F4A4CB67EEFEB5C48F16788D3EF78475293E8528FF0084DB5D5386F026AE -D8FE20E98FE7401DC0CFA62815C50F1DEA83EFF833544FABA528F1F5D8FBFE -18BF4FABA5007694571C3E20A7FCB5D1EEA2FF0079D69C3E2269E3EFC0F1FF -00BCC2803AFA2B921F11F421FEB6E922FF0079A9DFF0B27C27FF002D759B64 -3DB2C7FC2803ABA2B9A8FE2178524FBBADDAFF00DF47FC2A78FC6DE1C90E17 -58B66FA13FE1401BD4873EB8ACB8FC4BA34FFEAF5085FE84D5A8F51B397FD5 -CCADF434016B3F8D19FC298B207FB8E29F86F5A0028E7D294F4A4005002D14 -51400514514005145140051451400514514005145140051451400514514005 -14514005145140051451400514514005145140051451400514514005145140 -05145140051451400514514005145140051451400514514005145140051451 -40051451400514514005145140051451400514514005145140051451400514 -51400514514005145140051451400514514005145140051451400514514005 -14514005145140051451400514514005145140051451400514514005145140 -05145140051451400514514005145140051451400514514005145140051451 -40051451400514514005145140051451400514514005145140084E28CF38C1 -A1B18E46681CF5E2800CE3AE2979EF51C8EB1A97764403BB1C563DEF8BB46B -30717D0DC38FF9650CAACDF9668036C923FF00AD49B8E7A8C570F2FC46F3DF -CBB2D0B562D9C076B5F90FE20F4A1752F1C6A3CD85AE99021FF9FB4955BF4A -4C0EE777B54725C4717323041EAC6B8C3E1CF14EA1FF00211D596D89EBF609 -DD71F98A58FE1DB3F371E24D6A4F6FB5E47F2A6BCC1F91D24FE23D22D9B136 -A76B1FFBD20159EDE3CF0E6ED91EB167231ECB329FEB50C5E02D2E31FBC696 -E8FADC1563FCAACAF857C3568A19B49D3931FC66041FAE28B0754536F883A7 -758619AE3FEB96D3FD6AB37C44909221F0C6B32FA1484107F5AE8A2D174A84 -0F274EB541FECC4A2ADC704517DC8E351DB68C530FB4721FF099EB571FEA3C -35A8C3FF005DADFF00C0D0358F18DC67C9B2862CF4F3616E3F5AECC75A5C8E -9823DC52637B9C56DF88939F967D1635F478A4CD21D1BC6F7073717FA5827A -F942415DB818EE4FD68FCE811C2B78335A9FFE3E35351EBE548E29A7E1B89B -89F55BF1FF005CEE587F4AEF7349F534741753834F84DA5E7736ADACB1FF00 -AFC38FE556E2F869A547C7DBB5261FED5C67FA576238EF454A7D467331780F -4A8BF8EE5FFDF707FA55A1E13D2A2E90EEF6214FF4ADB273D2A29255030AE9 -B875C9E94DE8C6B56538F41D2E31FF001E16C7DDA153FD2A54D274D078D3ED -3F0857FC2ACA488EA76BAB8EF839A5565DDB4119C74EF544AD887FB36C1471 -636C3E912FF85396CAD074B4807D231539E948292D81F42216D08518B7881F -F7053C471F68D07D145399B0BB89007BD246CAEA191832B742A72282BA0EC0 -1D147E54BF4A4EF4BC504A1371CE3BF5A5CF38C535D95406242FB9340218F5 -EBC823D2818A189246318F5EF413D7BE3D293BE33834C132B4AC808DCBD41E -F48649BBB526EFA034D92448807760A07A9A6BCC9185321032783DA86F5132 -50734161D38CD344898DC1976FAE68DCA7EE90734D80E078CE2941E3A5373C -9EA31F95323943654302CBD4E78A48094671CE33ED4B4C8A459103236E07BE -69F4D8084F38A42C7381C7726A39278A3601DD173D3279A68BA849E2546F5F -98645004CC4E3E5C6693731C1C617B83D6A2FB5439C2CF193D7EF0E94EFB44 -0431132103A9DC38A0091989195C7D6A332367000F7A74724720C23A363FBA -78A8D2446042C88CFEC697713DAC3C48DD70314BBCF1C715124C9212B1C91B -63A853934E2E03042CA38E99E68E65A0EDA93649A5ED4C5E30334EED4C05ED -4CDF8E3A9F414AC70A7AFE14CDC130D2601EEDD850263F71F6CFA526F63D05 -42B7703676CF1311D70C0E2A5570C383D4672286AE877D6C2E4F714B93481B -B75C528345B40BEB60C9A5E69AC69DDA8B590AFA8134D0F919041C1E6949DA -B935089E20C40923C1ED91D7DE82898B7191CD1938A8CCA918064745C9F979 -C669F9046681751D938A696C0CF14BDA98E42A9278F734217DA02548FBAA48 -ED8A4F2E26EB127FDF22A31710EDDE254DA7F8B70C52C73C6E70AEA7E87AD2 -5A5C25A4AC38DAC04E4C1095C77414D363687ADA407FED98A979DC189C0C63 -1EF4F028B94553A658375B1B63F5857FC2A37D234E238D3AD09F5302FF0085 -5EA8A76448C9790463FBC4E3143626507F0FE972F3F618147FB3128FE9559F -C23A54ABCC3B79FE1551FD2B6B3951B7907BD3C7A537B01CC4BE01D266FF00 -969729FEE381FD2A9CBF0C749978FB76A69FEE5CE3FA57682929203836F84B -A5FDE4D5B5907FEBF0FF008527FC2B830F106AB7C7D0C972C7FA577B487A70 -7F3A6070ABE0ED6E1C1B5D4D48FF00A6B239A7AE91E39B61FE8F7FA492391E -62C86BB48E48E600C522B27AA9CD3B7646707D293038ADFF0010E25DCF368D -2E0F2228A4A53AD78BEDC8F3AC2298639F2606FF001AEC978E00EBC9A49245 -8D4B3B0451D4B1C53E83FB471DFF0009AEB16E0F9FE1BD46523B43075FCCD3 -E3F886E789BC35AC407D24840FEB5D5C52A4E372323A9FBACA73435BC32E4C -B146EDDC95068FB24FDA39E4F881A59655995ED8B74F3881FD6ACC7E3AF0E4 -A768D62CD5BD0CCB5767D1B4695C2CBA7D93B9FBA1E2524D5697C19E1E90E7 -FB22CD1BD52041FD285BA432CC1E21D2EE798351B6907FB32035A093A4A328 -C1B8CF15CBCDE02D2E4CAC32DC5A7391E4154FE95524F87B221DD6FE24D651 -87F09BBC2E3F2A56B680769BF039C0CF40693CC2382466B86FECAF13D9B6CD -3B57B4BA71D05ECEEC7F1C50758F19E9ED8D42D74CB9DBF7859248C47E749A -765EA33BB0C48CE314A0D70F07C46556F2AEF44D5A261D64FB3613F326BA0B -1F14E917DB4477F6EAE7FE59BCAA1FF2CD3B34EC23609EC08CFBD229CF5209 -F6A6ABABAEE1F30A70E99518FAD30141CD2D20A5A0028A28A0028A28A0028A -28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A002 -8A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0 -028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28 -A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A -28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A002 -8A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0 -028A28A0028A28A0028A28A0028A28A004660A326A86AFAA45A4E9D35F4FC2 -4638E33D7A55E704AF0718E6AA5FD8DB6AD6325ADCC2B34520C146E9401E7B -E1EB5F10F8FA0FED4D4EFDEC34F979812C27E1C720EE073DC0FCCD75D67E0A -D02D30E9A65B4930EB34910DE7F1AE674FD235FF000147F67D2E0FED4D3138 -58DE51108875E0724E493F956ADBFC47D2598437A65B4B8EE8B13B0FCF1401 -D6470C5026D89022AF651815CB6B1F11347D17ED0D706E1D2D8334A6084B85 -0B9CF4EFC56FDAEAF61791078274208FE23B4FE46BC2B54F13683A3EB5AD69 -375A95CC76B7C2659561B57914176209E07350FE2487D2E7A9FF00C2CCF0FC -9650DDC72CFB66805CAAB444318C8CE7158BE2CF8B36BA7F8563D6B445174C -D347194910E1431EE01C835C8CD77A0F87759D1B52D46D5AEB416D156D63B8 -10B16393F28280123E519F6A5F1A2E912FC3EB8BAF0D6942CECEEB508260D1 -46C1A6519F98A9E41F6AD66B950E9FBC7A5B7C40D2ED6D606BA6944F229263 -58892B8F51D45725F123C536FAE7C387D7741BFB8823FE068CEC6E240A723B -7435827C59A0E9BE247D5B588669B4FD53E6B798DB48C542AED3F2819193EB -563C743488FE1ADDDBE8DA5FF67D8DC01F6710C6C4B62405B2BD4739EB4449 -5F19E8F75E31D3345B5822BD999AE0408E551771C10393552E7E28F876D749 -8F5466BA92DDA736FF00B9B72E438192302B82D52FF4BF0E78C24D6BC476CF -26997BA7DBDB42C22690974196E141238F5AD0BFD4BC3D69A058CDA6E97F63 -B0BCD4B28B1C4FF3BB2E77118C8C8C75A520B7BE7469F17BC3D25D2DB2C5A8 -F98F079EAA6C9F256B42C3E25F87EFEC6E6ED269634B59960944B1EC60E7A0 -C1AE51B57B083C7FA5FC92163A4222FEE9B03E7F5C579EDDC4F3DCF8BCADAB -CEABE228EE1E36420145625987AE054C55E56096923DBEC3E21E8BA85EDC58 -C2F28B88319468C8278CF1EBC562DAFC6FF0ADEF96D0A6A42172479D2593AA -0C71F7BA75AA1A0EBBE0FD72F9F54D17490F75046CB35D3C3246E84A903018 -73900D70DE7C6FF033EC8249FCE05F2BE4B647FA467D2A9AFDE728E4AC8F49 -7F8927FE139B8F0F0B7668238E2759044C49DEA0F27A77A61F8DBE17F32E11 -61D55FECB9F3596C1CA8C7079AE7ADB55874CF88E6EAED254B7BDB7B786DDD -6366DEEB18C8381C7E359DE16F10D85959F8874DB992592E2E1A668D044C41 -DC46390302B393B56512E51FDD39763AFD6FE2A476F77A3AE9D034D06A3E53 -EE789B72A39F63C363B1AB97BF17FC37A7EAA9A54916A525D336DDB1593B80 -738EDDAB83BB8BFE11D4D1AEB5132982E2EE19232B196280F21703D315BDE1 -FD42CAEFE24B4D0AC84BC5295768986727DC556D5F956DA9CD193747DA753D -1B58D72DB4DD1DF51918C71E0052C31C9381FAD707AB3EA8BF0EAFB55B9BD9 -ED750B829B8C0FFEAB1280369EBC8EB5D0FC4BD2E6D5FC293DAC71091CC91B -EC27A05704FF002AC5F125D4375F0BA79A194CC84A6198609FDE81D297F379 -58D968E3E773AAB7B88742D0BED3348D2BF941B07E667FA0EA7AD79EFC38D6 -7C4179F12757B6D72E64C7D87CC8AD4485A3552EBB5B07A1C1AE9F5DF07EA5 -E20FEC4BCD3F5B9B4F161973146808932A06324F1D2B85F0878775FB4F8BF7 -ED7BABDCC8C9648CF3320FDEA6F5F90FB56AB622FA33D8B5FD7ED7C3BA74B7 -F7A9318A2058F9319738009E83E9591A1FC43D1BC43776D69A7FDA24927B6F -B46E3090A8338DAC7B373D0F357BC5DA8DAD8E8D2457219CDD036F1A04277B -B29C038E80FAD79A7C3FB81E05F105D68D7B6CD1C5AB96D4239514B08CB10A -23E33E9D4D422A5F0A67AB6BD7B6F65A64F3DD3CC90A0F99A15CB0FA0AE2E0 -F89DE19F0DF8774895A6D4AEEDEF449F67716C6491F6B7CDB80E9D6BAEF14C -B143E1FBB7973B36638524FE55E1DA15E45068FE0047599446B77BBF74DDC9 -C678E28652D51EB5A77C46D275A8AF8D8ADC896CD51A48E681918063C7079A -83E1A78D2E7C65A65CDCDDDB88668AE658804460A555B00E4F7F5AE7342B98 -A5F89BE2C11C2F89ADED0479420310873CD5AF82BA8449A25EE9B2197ED71E -A57323078C8015A438E7A1AB4B433EA6DF8875C96FBC4B6DE16B290C770112 -EA665F9711162A707D7DABAFB78C410A441D9FCB509BDBA9C579D49692DB7C -60FED0938B5934C581643DDFCDCEDAECAE3C45636BACC7A39DFF0069962F37 -0236DA4671D718A92D9AC064E4E38E87BD721E39B8B9D12287C436B2B2AD9F -12425B092EF2146E1DF19E2B4AD3C5BA6DD5CEA904665F334C97CA98189800 -76E7838E7F0AE63C75ADDAF887E1B4F7B69B9D2ECA1891D4AB1C4A01E0F3DA -A4A8981F133C63E20B19D63D0A0FB423E379983045E14F047E35D1D85FDDEB -7E03B8BD9E6B9827C328272AEA411C8CF35D2D868D0CDA3C56B7F02484AFCC -ADCE79CD2F895638F40BBF2D02ED8F031DBA5454D1489A5EF729C4EB3AE6A5 -A4F81A39ED1A6B8BB32144272D93B38DC47419A6FC2AF12EBFAD4AD1EB9098 -670A4A88F718F6FCBDCF7E4F15D6F84E18AE74311CC8191D882A7BE40ADCB4 -B1B6B1531DB42B12F5DAB5B296AD117DBD4E67E26EB57DA278763974F25669 -AEA1819F2414476C31C8EE05727AB5BCD6569159D9789B5392E13EF4BE703B -F273D475C0AF50D52C2CB52B468350816E2DC7CC63719191D2BC9FC5DA6DC8 -D3AFEEB44B116A2CA48D2D16338F31188DFD7A639A9459E91E135B6B3D2A1B -18F543A83C59CCCF2ABB3E493D475C74FC2B74B71CF7F4AF3EF08E9BA5235A -FF00615B8B4B3B4C9908429B8B67B1F7CD778258F3C4CA076E450C0E6757D1 -F6EA771AE5FEA77305A416B8302483CA1B4E7760F7C5709E17B2D57C65AF6A -BA9DB6A77D6FA44492DA40AB26C0F206055F07AE41FBC28F8A3E2C3A9EB561 -E138659E1B59E4437AD1C6CCB2C2DB9590F18C7E35D369FE2DD0F40B7D3743 -D26392420C76E63F21D1557EEEEC91EC2844F539BF885A7DDF86B44D3244D6 -2FD256BBB68649124E4EE7C1191D8D766FE0DB881AF9A2D56F5A3B905B6B48 -311900E02F1EB5CA7C6CD46D841A669EDE6F9A6F6DA50891330DA25E4E40AF -56B69E3BA89658D894233C8C66A994799FC22D5EEE0B5D4742D6AEA59B54D2 -F679CD3B6E2779665E4F5E3157345D3351D5B4C9EE23D42F21FED16688B07D -AD6FB588DC9E84D63F8F7C35ABC7E36B2BCD0B745FDABBBEDB2A100FEED004 -CE7AF7AEFF0055D5AD7C29E1E96FA60C22B58B7B2A21627A678193DE92EE4B -DD1E7D7DA4EABE14F17691FD9FADEA17EB7571141756F713655233C97C0EFC -77F5AD3BC92F2D7E284111D4EE9ED1EC0379064CA0632F5C7D38AC5F0C7C46 -F0DEA3ACA4EF2DD5C6B1792791124967228009F97E72303B5686A37F00F8AB -6619640C74E45388C950DE6FAD4256E4F2637F6FC91D46B5F11F44F0FEAC9A -55E477CF74D0198086D59C6D071D47BD52FF0085BFE1D3692DD2C5A8BA42C1 -2455B372C84FA8ED54F51D4ED17E26DAAB890B2E96C09F2DB1FEB3D71591A0 -EA968352F1DC6B1491196FB2AC236F9FF7639E957141D51D46B5F16BC35A1D -A585D4ED772C77E18C1F67B73216DA46781F5AE4B54F1BCFF10758D3744D0A -7BFD36CAE19C5DCC63682E230172A541F523B8E95CAE8773670E95E0186559 -83DBADD863E437727AF1C576BE378AEFC31E2FB0F18C5134DA7FFCBE85EA8A -102AF0325B93D850C724749ABF81649F4D892C358BFB7B8B71B8347285339C -7490E391533F8C74FD1604B1B83717175696A249CC5119061461B91D4E474A -75BFC41D12F22856D1E769EEB0B146607505CF6248E3EB5C8F872F8F863C45 -AA5A6B903ECB9596E84E14BE15987C981F4353BBE513D23CC760FE3ED1574A -83528DE7923B89920558E22CEB230C80CA395F7CF4A483E20E8F2C3A83B7DA -3769D288AE15612486233C0EE315E52925EF8574ED4AFE6B678ACF54F1209A -DDE3CB3081FA3ED1C8C01D0D3FC3BAC5BD9EB5E25F367B9963BF99A5864681 -8191766324638AA8EB2E434714A9FB4EA779A67C66F0C6A96F25D44BA825B2 -103CE92CD910E78EA78EB5D25AF8C34E992EDA53242966AAD2C92465530DD3 -04F06BCDFC37FD96BF052D60D5E377B445C4FBA162C0998EDF947279C562B6 -9BE26B9D13C55E1C1753EB96EB141F67B8B8C445F2C18FCBDB1D3F0A1E8F94 -84938A9773D52DFE216897D7F069BE6CA935C36C8C98F018FD6BCFBC3FE65E -EB3E268AF7C497B0C486E0443ED0018FE7E0A83E9DAAF7877C47E09D7AE2CA -3B6D27CED4AC5B3892DE44F28E31B831183DEB2FC0563A1EBFE33D6D352D3F -CF90492A812C4D803CC18C1FC6908B3E1AF15AAE85247E21BED4C4706BA2CE -CEE823349300004DC4FF0009E49238AEF6FF00E20E89A35DC1A75DBDC2CB24 -2D2A48D11D8CABD7E6E993D877AC3F8A90D869DA06956B0C063862D4E0DA91 -C648503231C56278E23B6F18E9B63A4D842ED716B10BC12B46576F94776C19 -F5C54B5EF46FB5CA477D078F3479B488B53669A2865FBAB2C455CF38FBA79A -A89E33D2BC5167AA58585CCF0DCDA2A79BF26C65DDC8C67D857995CF8AA1D5 -F47D1B58BCD35CC5A5A491DF5A9562119DB098E32DD33C5761A36A7E18D423 -D4359F0FE98019153ED5726278DF8CAAF0C39EE38AB82F7DDF6B92F499C959 -DCEA57FF000BAC2E5F58BB867175700CCB2E1980720027D2B4F5FBF96C2FBC -2BFD85AE5D5EDD4D770C7736F14C1E3D841C97DBD39C6735CDDB6A36569F0A -2CE0B88E697FD2AE4BA185BE606427D2B4FF00B1ED7E1FEADA7F8CF42B0DBA -55CC11DBDEC31A15F2C7DF7931C963C018C525F6AFDC53F8CF56D53C65A768 -8B1C57EE7ED2B009E48E35DC42F7207D4567DE7C55F0E596869AD33DCB5A34 -891FC901660CDD0103A1AE1356F106890F8CE1F11EAF692368F7DA508E39BC -87762CCFB82950323E5CF5A6F8D24D20F82A16D1F4DFB1D9DC6AF6B70A228D -B320DE3E62A4641C5549248A47A1685F13742F106A0D616A2EE19F04AADD5B -345B80049C67AF02B91F8ADE3686EBC197F2E957375179663C5C42A40E645E -8C38F51557C5320BFF00881E1C92D3CD422D6F0022338E53A13DAB90D4BC49 -676BF0867F08DCC1341AC42CBBED921765E67DE3E7031F779A124E171C55E5 -63DA0F8D74ED1AC6186EE6792E522567545DE46402338F5AAF7FF167C35A7E -910EAB2497325BCD31813C980BB190039181F4AF3A5D6348F0F78AB50D4BC4 -16B20D3B52B6B68EDE5585E424A261F2AA323A8EB573C4CDA2DB691E1E6D3B -481636075713011231C92092C463233D693D89FB563BBB0F8A9A0EA1A7FDBA -35BC893CDF2824F6CD1C84E3390A7923DE9DFF000B4FC39FD9B73A887BA686 -D6E3ECF2AAC04B07C67A7A5727E32BEB3D0B5AD1F5ED52D5A7D1E4B48A00C1 -198C6E496DDB40CF0A0D43A9EA1E1A9341B8BDD06C0C3697771BE7B8585D5D -E42BDD48CF231CD242A9A1DDF84BE20697E330EFA6437AB1A36375C5AB441B -8CF19EA2BA4B8952282477242A8E4A8E6B8AD2BC51A7786FE1F69FA84E645B -6892342444D9CB360718CF7AEB5EEA19F4F6B85E6164247152D951382D1FE2 -3785B44F0A36B0975A94FA72336659ADC97077E0E47D4D6B695F14741D66ED -AD2D96F6393CB5917CFB668C3EEE9827AD78DDCDC4337C25D52C95674624E6 -210B73FBECFA5767757D6EDE23F0BC41657658AD400626C03B477C715695D0 -A5B9D4F80BC773F8B2E754867B7F24D9DE4D02B223052A8C00C93DF9AA7E34 -D4AE6FBC69A4F86A3BB96DA06852F5CC2D86900936943D8A91D6B3FE13EAB6 -F0DFF8834999658EEDF56B99844636DA50B801B7631F855FF1869ADA678DF4 -CF14C819ED92DD6C4AAAE705A4DD9E39E8285D1BDAC52F884B0D42E341F892 -BE1E4B99A6B5D4E192E96395B220D981B531C01CD7A38030490327AE2BCDAD -6D97C43F11A1F11D93BFD974BB696DA5DC8572CD861D793D3B5757E1FF0017 -69DE24B9BCB6B0672F66CAB3EE465DA4824751CF4A9826A9C6E4FDB33357D7 -F4783C5B616971777D1DE876F2A248FF007721D99393DF8ACD4F8E3E14944A -CA9A9EC8490F21B17DAB838E4F4ACCF1B5D403E26F850E65DD6D34E64DB112 -0661E39AE4F4FBA8BFE158789E3D9334EEB2E50C4C38F3063B734E1AD35265 -58EEFC67F12E5D166F0E369F009EDB54BA803BBA312237E78C1EB8ED5DD5D3 -CD7FA593664C724F17CA4FCACB91D7D8D78B788AE953C3DF0FEE312AC56F79 -66D2111925404E78C57B3C9AB5AC1A3B6AA599AD9203316D877150B9E9D7A7 -6A98B6E8F33DF50B1E5BE35F0FEA5E17834DD66D35ED4E5BD3750C52DB79D9 -470EE031C01938AEA7C43AA5CF862F6DB5596761A74E0FDAF73728DC2A6D1E -E4D7196BF15FC35AC6BAD71A835D8314861B384D9CA564DC786276FCB838EB -5B3F15E39FC43E0F874DB7216FAE5D1D622C0642C809E4FB0AA8EAA37EE23D -39E282EE30B2C6B2211D1864562DE781B42B905A1B186D263FF2DA08D55C7E -38ABC757B1B0B54F3AE53E5419C1C9FD2B02E7E24696EC6DF4D596EAEBA043 -13A027EA4628D7503275B3ABFC3E44D49750B9D434A89F75D7DAA4DCE918E5 -B628C6700702BBBD2353875AD2ED354B5DFE45D42B326F5DA76B0C8C8FC6B8 -5BAD07C4BE35BAB77D5DDB49D321903CB688EB2ADD20EA8DD08041FD2BD02D -6D21B2B382D2D944504081111470140C01408B0B82323BD2D353A74C7A53A8 -00A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A -2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A2 -8A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800 -A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A28 -00A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A -2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A2 -8A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A6EC19CF -7A7514008541209EDD2AB5D69D6D7A85268C329EBDAAD51401C7DEFC31F0E5 -D39992D0C53F5593CC7383EB8DD5C9D97C2FF13E8FF6A8B4BF1608A29A6794 -03608DB771E9C9E7B57AE5373EA3029595EE3BE963CF2CB42F16E8509549C6 -A6CCDB9C948E3DCDFD3A7EB565BC43E2CB45092F848483BB7DB631FA62BBAC -8E80D2F1FC58AA6DCB712D34470DFF0009DF92A06A5A58B623A8F337FF0021 -5247F14BC2727CAF7DB3DBC890FF00ECB5D8B4113726246FAA8A89F4FB5917 -0F6F111EC80520EB73120F197872FB062BD0F8E9985C7F315AD0DF59DCE0A4 -AACA4640DB54EE3C2BA3DD7FADB623FDD723F9566CDF0CFC353E4B5B5C64FA -5D483FAD01D6E7501633C82A78A3CA8CF4DBCD71BFF0ABF4688E6D9A787FDE -9DDBFAD1FF00082DDC6716DAC79607DD0632D8FD6807AEA76290469F7401F4 -14185400140DBDC62B8EFF00845FC5D0FF00C7AF8A618C7FB5641BF99A4FEC -CF1DC1F7FC490CF8FEED8A8CD0F57707A9D8C907CA4A805F1C715C6F827C17 -77E18B9BE69AEC5D2DCCAF201E585DBB883EA73D29AD73E34B6E4A3DD63FBB -0AAE6987C45E2F8464F87AE66F61B467F4A5CA9CB9BA8DB6D72BD8EE5A0570 -A1803B4E4714AB1A2B12A00CF5E2B831E36F13C5F7FC097EDFED79EA3FA54A -BE3ED687FAEF07DDC27FDA987F851657B896876ED0ABAB03FC6306B9AB9F03 -DB4FA4DDE8EB3ECB09B6F970ED27CBC36E3CE72726A9AFC4271FEBF48920FF -007A51FE1520F88DA62FFAE2917A6E7FFEB5305A3B9BFA469B73A75B8867BC -FB4E0614F9617157C46339EFEB8AE557E25786FF00E5AEA3047F573FE15227 -C48F08C87035DB407FDE3FE140AC74BE5A8FA75C63BD2F96B9C8033EB8AC14 -F1DF8624FB9ADDB37D09FF000AB09E2DD064FBBAA40DF426819AE6307AD344 -4880000003A715413C45A449F72FE26FA1353AEAB62FF76E10FE340163629E -7827D7148B1041800007AE2916EE07FBB229A9010C323F3A7703335AD0ADB5 -A861594ED92DA513DBBF3FBB9173B5B19E719E86AF410324112CCE2695546E -936E371EE71DAA61F5A3BF4A4026D19E839EBC5635EF86E2D46FE2B9BA93CC -8E2CEC8B6E3191EA0D6DD34FFBA7F3A069B43042A71CF4E959DAFE913EB164 -6D61BCFB287E1CF961B70F4AD5CFBD0429A4D292B308BE5B5BA19DA36969A4 -D925A897CC2BD5B6E327007F4ABE13AF39A76294D3EB726C86ECC8C1E69BE5 -E170081F853F8F5A5A0656BDB24BEB592DD8E164001C0F7AC17F055ABFDE98 -F1F7783C7EB5D31201EB4647AD0053B1D3A2B1B710A1070739C559F2D4E338 -38F6A9334501618C88DC100FD4505060719C538920E319F7A4DBCE68010460 -0E9D3A530DB863F31CE3A7152F7F4A3F1A3C83AA6304283F857F2A416EA0E7 -8FCAA4CFBD2E4502B6962330AF538FCA811A818181F8549451719188D0761C -74E3A52901CE09047A114FA4C1F5A01EA471DB451021140079A1A08DF1900E -2A4E73D6968019E52E31818FA537C85C9271EDC74A7F1EB4EA03CC8F6C606D -E31E98A44B74452A07CBD85498F7A5A008563441F3609F5DB8A7AA283B8280 -71D69D83EB498F6A0019030E71D73C8A4312E380067DA9D8F4A3140EE33CA4 -0BB768C7A629A96E88BB51405F4A949F7C52640193F9D2B74175B8DF2576ED -DA31E98A5110C638C7A62A27BAB64FBF2AAFE35136AB631F5B941F8D37AEE0 -F5772D1894F6181DB1486253D001F85507F116931FDFBE897EA4D42FE2ED02 -3E1F54817EA4D26AFB81AC2240DBB68CFAD30DAC672768C9EBC562BF8F3C2F -1FDFD6AD97EA4FF85576F893E0F8C80DE20B319E9963FE14D68AC80E8DA057 -20900E3A71D29DE529EA07E55CB37C49F0D37FA8D4ADE6FF0075CFF8544DF1 -134E3FEAD164FA49FF00D6A03ADCEB8C4A782011E8453442918380003DB15C -6BFC4273FF001EFA34B3FF00BB28FF000A88F8F75B6E20F075E4A7DA75FF00 -0A01EBB9D6EA7A645AA5A1B6931B0904F1E87353C5670C1088635DB18E8335 -C41F1C78A5F85F015F8FF6BCF5FF000A55D7FC5F71F7740B9B5CF76DAD8FD2 -958168776224C63683F85218579C818FA5710B3F8D6E38566B7FF7A0534F1A -5F8EA7E9E218A0CF76B1538FD6983D4ED163551C607BE293CB5008E39E4D71 -BFF08AF8BA6E2EFC550CA3B85B20BFC8D1FF000804F2FF00C7CEA665CF5DAA -573F91A4D5D580EC76C68A40655AC5B78F49D22E6EAE4CA04F76435C3807E7 -2A303E9C7A5648F85DA2B9CDC19E4FA4F22FF5AB70FC36F0DC03E4B69FF1B9 -73FD69875B935D78E7C3B66375C5F6D23BF92E7F90ACD7F8A3E14E90DE79A7 -D3C871FF00B2D6EDB785748B3398AD7FEFA72DFCEB492C6D50616DE203FDC1 -45B4B05CE35FC786F00FECFD27ED983941E6ECCFA75148BAF78C6E81587C29 -F6756FE3FB6C6DFA62BB610A0FBB1A263D1453C118C6413474B05CE1869FE3 -4BE1837ABA713CE7C98A4DB54CFC31BFD43514BFD7BC43FDA3346088FF00D1 -447B41183F74F3DABD17AF7FC29411DA85A01C9DA7C34F0DDBB895ACCC9377 -7F35C67F0CD74B6D6305A4623810228E83AD5814536EE026DC91CF4A4D9C96 -CF3D334EA29000A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800 -A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A28 -00A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A -2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A2 -8A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800 -A28A2800A28A2800A28A2800A28A4233DF1400B9A29BC0EE4D2F5F51400B9A -2907D696800A28A4233DE80141A3348063B9347E1400B45145001451450014 -51450014514500145145001451450014514500145145001451450014514500 -1451450014514500263D29714514008464734B8A28A004238E294514500146 -05145000466900A5A2800C5260D2D14008403D69A628DBAA29FA8A7D14010B -59DB37DEB788FD50530E9B62DD6CEDCFD625FF000AB34500533A469ADD74FB -53FF006C57FC2A37D074A71CE9D6A3E90A8FE95A14500643F85F4893FE5CE3 -5FF7540FE9503F833476FF00962C3E8D8ADEA28039B7F0268CFF00C338FF00 -76622A07F875A238C7997C3E974C2BABA28038E6F863A1B7FCBC6A63E97AE2 -A23F0AB42EA2F35707FEC212576D4500711FF0AC34D5FF00577BA97E37CE69 -0FC388D7EE5FDE7E376F5DC51401C2FF00C2BE9D7EE6A33FE372F47FC20FA9 -AFDCD48FE333D7754500709FF0876BCBF77538FF00177A3FE114F138FBBAA5 -BFE25FFC2BBBA280383FF8463C5E3EEEAB67F8EFFF000A4FF847BC70BF7756 -D3FF00156FF0AEF68A00E07FB0FE200FBBABE97F8C6DFE147F637C451D358D -27F189BFC2BBEA280381FECBF896BC2EB1A2E3DE06FF000A4FECEF8A23A6B3 -A1FF00E03B7F8577F450079FFF00677C52FF00A0D685FF0080EDFE14E1A7FC -51EFACE87FF80EDFE15DF51401C17D83E26FF1EB3A263DA06FF0AA17BAFF00 -8CEC19ADE59ECDE55E0BAC1F2D7A5919ED59DA94568B03CF2C0A48E3254679 -E2803CCC78B7C6B205D9A969918EE6486B72D13E23DEC4258759D1194FA40D -FE15B90F84EC66B345954A1E79000EFF004ADBB1B4874E816087715F5A00E3 -FEC3F137FE82FA2FFDF86FF0A3EC1F137FE831A27FDF86FF000AEE80C52D00 -7066C3E2776D6344FF00BF0DFE14D3A7FC51EDACE87FF80EDFE15DF51401E7 -FF00D9DF14BFE835A1FF00E03B7F852FF66FC4F3D759D13F081BFC2BBFA280 -380FECAF8947EF6B3A37E10B7F852FF637C453D758D27F089BFC2BBEA28038 -2FEC3F8807AEAFA5FE11B7F851FF0008F78E4FDED5F4FF00C15BFC2BBDA280 -383FF8467C5E7EF6AB67F86FFF000A3FE113F131FBDAA5BFE0CFFE15DE5140 -1C20F06EBA7EF6A69F848F47FC20DA9B7DFD49BDF133D777450070C3E1F4AD -FEB350B83F4B9714BFF0AE226FBF7F7BF85DBD77145007123E18698FFEB2F7 -533FEEDF38A07C2AD0B39379ABE7FEC212576D450071E9F0CB434E93EA47FD -EBD7352AFC39D117F8EF8FD6E9ABABA28039B4F01E8B1F45B86FF7A626A74F -06E8E9FF002C18FF00BCD9ADDA2803253C31A427FCB9C6DFEF283FD2A65D07 -4A5E9A75A1FF007A053FD2B428A00A6BA469CBD34FB51F4857FC29E34DB15E -96700FFB64BFE15668A00856D2D97EEDBC43E8829E228C74451F414FA28013 -18E94B45140051451400518A28A004C52D14500205028232307F4A5A280003 -14607A51450018A00A28A0028A28A0028A28A0028A28A0028A28A0028A28A0 -028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28 -A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A -28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A002 -8A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0 -028A28A0028A28A00282718A2909F7E9DA8017349914C0DF2E4FCA3DA86923 -8D7748CAABEE714012519AE6357F1DE89A3B98A6B87794F0AA91338CF38E40 -F6AC86F1578AF5220E95A1DBC96AFD2579B637E47DA803BD240193D2A092FE -D22FF59750A7FBD201FD6B8C8FC3FE29D48EEBDD6EEF4D07AC703230FA5598 -FE1E5A487FD3EEE5BE1EB328E7F2A00DDB9F12E956C0E6F22908ED1C8AC7F9 -D63DCFC45D26DC736D7B2FFD738777F5AB107807C2F6E43C1A2DA87FEF60E7 -F9D6A41A1E9B6D83159C687A702803927F8B1A6EEDB1691ABB1F5FB19C7F3A -51F1165986E834ABBFA496EC3FAD77491AC4308A00F6A5C739C500CE1478DB -5893FD569607FBD138A77FC259E226E9A6C1F8A3D773463BE6803853E2CF11 -2FDED3603F447A3FE132D6D797D3131DF6C6F5DD668C8A57407067E20DD43C -CFA5DC91FF004CE063FD6907C57B08C859748D5F3EAB6648FE75DEF27B5211 -90411C1A62D4E42DFE25E93707FE3CF518BFEBA5BEDFEB5B36DE2AD26E467E -D4917B48EABFD6ADCFA4D8DD0C4D6E920FF685655C780FC3172774BA25AC87 -D483FE352AE366CC7A9594BFEAEEE063E82453FD6AC2B86E41C8AE424F879A -6463164C6C4F67854647E7555BC27E21D3FE7B3F14EA177E91481156A80EE7 -3CD04E0D79F8D7BC6BA4922F745B796D94F331B8CB11EB81ED5A7A5FC42D1A -FA516D2CD245747868DA170A0F4EA463AD0075B914B9C54304F14C3313A303 -CFCAD9A94F5E0FE1400BD68A45000C01814B40051451400514514005145140 -05145140051451400514514005145140051451400514514005145140051451 -40051451400514514005145140051451400514514005145140051451400514 -51400514514005145140051451400514514005145140051451400514514008 -6B2F58FDF08ED57ACA73F9106B54F1D6B22DCFDAB55949E56DC951F88A00D5 -0A36EDC52E318C014A28A0031CD14514005145140051451400514514005145 -14005145140051451400514514005145140051451400514514005145140051 -45140051451400514514005145140051451400514514005145140051451400 -51451400514514005145140051451400514514005145140051451400514514 -00514514005145140051451400514514005145140051451400514514005145 -14005145140051451400514514005145140051451400514514005145140051 -45140051451400514514005145140051451400514514005145140051451400 -51451400514514005145140051451400514514005145140051451400514514 -005318E0962BF77A1CD3EB96F1B6B33D85AC761603FD3EF81109E0E36E09E0 -F1D28019AEF8CE2D3AEFFB36C23FB7EA8C405B7076609191F3118ACD4F0AEB -7AF9F3B5EBE68ED0F26C4A2B0FFBE94E7A1C56D7857C2D6BE1FB4053F7B3CA -0F992127B9CF7AE848190738340195A3F86B49D12302C6D563C8C939273D3D -4FB56B6540DC38FC2AB6A57D169765737B31C436F1348DF8024FF2AE26D7C7 -5ABDD583EAF168524FA7B1DD062751E621190DD33F9D0077E4ED1966C8FA52 -10AA471835CCF843C43A9788D2E6EAF34D6D3A052BE46F915FCC0739E9F4EF -5D24A578473C1A04F61F9047D690A9FE13B6985C7CA03605366B88E1864926 -3B5114963E83D68B94D595C94EDC804E4D00824807A56668DAED96B90CD2D9 -48258E198C2C467A8FAFD6B40B00E141E719C517262EE49919C51C0E6A3660 -BC8F977725AB36FBC45A769BA859E9F71308EE6F37FD9A320FEF368CB76E30 -3D696A51AFF8D21FAD70A9E32BDD5FC51A9E89A6DB9DDA5244ED2E41137983 -20004718C55AD0FC69E768736A5ACC074F9A29A58CC4CDBB2A8783903BD3B2 -06B43B0C7BE6930B9E9CD56B5BA8AF2D22B88DB74732875F7C8C8AB01828C1 -F948E949E8EC4C5DD5C7E7B527CABD3BD44C78DDBF0477C501F7AA90DB81EA -714E5A2B8E3A9200AA700734B9CF438A6170405C6ECF5ED48B22B0CA9DC9FC -A8B02D49319E3359FA9E8BA7EAD1982F6D965523B923F9551F17EBF3786F43 -B9D4E2B06BE16F1B4851640980AA4F7FA54FE1AD64EBDA0D8EA862309BB852 -7F2C9CECDCA0E33DFAD1607A1CEDCF81EF34ACCDE1AD40D8ECEB02C61B7FB6 -58F1C715369DE359ACAE61D37C456E6C6E64076485F7F998E4FDD181DABB16 -0AD863CFA1ACBF10F876C3C51A749A7EA711785C838562A41072391CF51401 -ACACBB0107E5A5DC319AE23C0F777DA75CDE787351984EF605424A142EFDF9 -6E9EDC0AED8603673D6801C083D28A05140051451400514514005145140051 -45140051451400514514005145140051451400514514005145140051451400 -51451400514514005145140051451400514514005145140051451400514514 -005145140051451400514514005145140051451400514679C51D78A0086EA4 -11C2E49C7CA71F5AA3A3444406671869F0C6935A72D1A5B467F78CEAD8FF00 -673CD69471AC48AABD14605003872334B480F2452D00145145001451450014 -51450014514500145145001451450014514500145145001451450014514500 -14514500145145001451450014514500145145001451450014514500145145 -00145145001451450014514500145145001451450014514500145145001451 -45001451450014514500145145001451450014514500145145001451450014 -51450014514500145145001451450014514500145145001451450014514500 -14514500145145001451450014514500145145001451450014514500145145 -00145145001451450014514500145145001451450014514500145145001451 -4500145145001451450015C37C4247B5BBD2B5BDA4C3A6991A423A0DD80335 -DCD56BB820BC8DEDEE21596271864750437E07AD0036C2E61BEB68EE6DE549 -2161F2943919EF560E7201E41F4AF388347D5BE1EDDBBD835D6A5A34878B72 -5A6997BB607007278F6AEB749F16695AA0545B98E1B8CE3C895D4483F0CD00 -5ED674D5D5F4ABBD398ED17103C7BBD37291FD6BCC352D2B50F0EE9B068EFA -94171359DB830430A907ECE9D770EE783CD7AD921B8DC30C38C1E6B264F0ED -9CB732DD4A1A495E368B7C841215BA8071D39A00E07C2FABEBCFA52EB09716 -FF00609155ACED561F9CA1C83CF46C549A2C11F8D358F10C3A8DDCE8D18871 -0C1318DA2F949E71D33815D768FE0BD3746922FB3C974D142A563865706351 -ECB8C0A82E7C0DA6CBAA5CEA705C5DDA4975B7CF36D2EC0FB460741CD00791 -DB6ABA8DEA7843ED57D21912FEE543A39559406C004679C015B37619FE24F8 -8AC4DDDC7907C3F1B6C3336D5248C9C76AEFAFFE1BE877DA343A41F3E1584B -B453C0C1658CB1C921B1C1F7AA9A2FC28D1347D526D556F754BABA9ADC5B48 -6EEE049B9011C74F6A9B15295D58F3E83C3D6F1F81AF447717B116D41FE68E -E1949F93AE451ABE8ADE12D2F40D6349B9D46E2EEED21B79A396E5E4F91CFC -CD827DBAD747E2BF0441E1DF0EDF45A64DA9DE35FDC3B344253218B7A9C940 -07CB8C0C7A56E782FC17631695A5DDDCCB7F732C76691986F24DE10F07EE91 -C11551D1A66718D8E2F467696C7C7B6F3DD5D18ADB558910F9EDB97E50700F -619A86E74F4D4B5BF877F6B9A6732ADE9665908270BEBF8576BA9FC1ED0F54 -BCD46E5B51D5AD7FB427134F15B5D7968CC318E31ED56AFBE17E8F7B1E9A86 -EB5387FB2C388248A7DAE37F5E715A4A572968739E26F02BEABAAB78B7C1FA -A0B6D59401229669237C008328BC1C0CD60DF6B2BE36F044126A30BC13DBDD -CF049E41F283B27CA4E07A9AF455F86F6305D5C4B6DAA6AB08B9555744BADA -ABB7FBA00E0FAD4DFF000AF3457F0FC9A246674B791A4632A3012867FBC776 -3AFBD7372BBDEE36EEAC79CF883C2D05EDCF86EC45EDFC104D1DB24822BA74 -2548C1C63BD5E3A1DCEA5AE5CF872CB5796DA3B7B19218566999A4F94ED572 -7393EF5D7C5F0C34949EC266D4754924B1F2FCADF739CECE99E2A6F127C37D -33C477915EBDE6A1A7DC449B3CDD3E7F25DC649E481939CD6D2D5DCCA0B955 -8E356CE5D06C6CF42D4B5B1AB5F5BC5B7C9B395965201E49C9C9C66A969F2D -C6ADA4F8B74ABA92EE186DE5B758D44ACB2A82727E6EB5DAEA3F0AB45D4ADA -CA392F3538A6B44D8B7714E16790673F3BE3249A60F84DA2AA6A68BA96ACAD -A8B46D3B8BAF9814E9838E2A67EF2B1AC128BB9C74DE0CB7B3BEF0B08F51D4 -479D24E26DD78E4380BC77ADBF08DA9D1BE286B5A45A5C5C49669A741285B8 -95A4C3331CE335D2DDFC3BD36ECE98CF7DA8A9D359DA0DB7182C5860EEE39A -B16DE08D3AD3C473F8896E6F3EDB710240EBE6FC8553A718EB55712D04F1E9 -43E08D7CAFCE058CF9C7383B0D27C3B057C11A19EB9B187181D06C14D97C03 -652691A8696FA8EA525BEA32CB24C64B9CB289061954E3851D856AF8774387 -C37A641A5DACB24B6F02048CCAFB9F68000C9FA0A2E0F535401C7AE29ADFC5 -B8FCBD73E959BAAF88B4DD1C7FA55DC28D8FF55BC0763EC09AE42EAF75AF1B -CDF63B18EE74ED23FE5ACEE1A299FB8D8C32319041A4059D0E5FED9F19EA37 -D011F6584C7E5CABF766CA1070475C115DD701BFCF159FA468F69A259A5B5A -270B9F988049E73C9FC6B47A76E4D0028A2803145001451450014514500145 -14500145145001451450014514500145145001451450014514500145145001 -45145001451450014514500145145001451450014514500145145001451450 -014514500145145001451450014514500145145001451450027439A4CF04F7 -ED4E23231515C38860924FEE213F90A00CC8C1B9D63CEEA912346DE80D6B81 -B47AD676911E6179C8FF005EDE67E62B4A800EF45145001451450014514500 -14514500145145001451450014514500145145001451450014514500145145 -00145145001451450014514500145145001451450014514500145145001451 -45001451450014514500145145001451450014514500145145001451450014 -51450014514500145145001451450014514500145145001451450014514500 -14514500145145001451450014514500145145001451450014514500145145 -00145145001451450014514500145145001451450014514500145145001451 -45001451450014514500145145001451450014514500145145001451450014 -514500145145001451450014C650C7A9CFAFA53E8A00615C9E99FAF4AE7F57 -F05699AA297813FB3EE739FB45AAAA49F9E3D79AE8E8A00E0C691E2EF0F71A -5DC41A9C23AB6A333B381ED8FA0FCCD49178EEEACDC43AA68B7C65FE27B7B6 -668C7D0935DC5472A24A0C722EE047434018369E32D16E64C3DE0B56FEEDC3 -AA7F335AB0EA7A74C988AF2DE55F44915AB32F3C11E1CBE25EE349B7690FF1 -9073FCEB35FE1EC119FF0041D467B01DBC941FD6803AE0D9390386E8452804 -67A1F735C51F09F88AD0EE8FC59A84E3B248100FE54BE4F8E2D8FEE92DEE87 -6F36E31FD2803B27B74931B914FAF140448FEE0DA3A6D51C5718756F1FDBFF -00ACD0F4B751DFED873FCA93FE12EF10C5FF001F3A3DAA1EFB2563401DA857 -0546148C724F5A14609C1638FEF57127C75A827FACD3507D0B1A4FF858AEBF -7EC1BF056A00EE31CEE038F43DA91100C95240F4AE23FE162BB7DCB027EAAD -487C7F7ADF734D527B6775007718FEF000F6229D8C8C67A7715E7D3F8FB564 -7555D2EDDC704EE9181153DB6B3E2ABB469F4EB2B79D98FF00AB9E628AA0FA -1C76A00EE48CBE7278EDDA82140248FAFBD7163FE13BBA1FBDB7B4B5F78AE7 -3FCC520F0CF89AEF99BC4B796DED11523F950075D2DF59DB8CCD731478FF00 -9E8E05655CF8AF43B6057FB4A19DFD229559BF0E6B2D3C005CEFBFD76F3501 -DD6645E7F2ABB6DE01F0D5B9F3A3D26DDA5FEF32907F9D00675C78FC48C60D -3F49D4A67ECEF6C4A1FC41A89A1F18EBB8327D9F4FB475DA1A091D2651F4F5 -C1AED2D6D20B48C2431AC600C003B54FDA80393D2BC076564E25BF9A5D5E63 -CEEBEC49B7E848AEA2382385162854451AF4541802A51D28A004031D062819 -1D79A5A2800031451450014514500145145001451450014514500145145001 -45145001451450014514500145145001451450014514500145145001451450 -01451450014514500145145001451450014514500145145001451450014514 -50014514500145145001451450006B335994AC31C69C99640A40F439AD33EB -590F8BAD5D631F7238F71FF781A00D2B58BC9B78A3FEEA8152D028A0028A28 -A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A -28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A002 -8A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0 -028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28 -A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A -28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A002 -8A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0 -028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A00290FD -714B450020007D693041397EBED4EA280106477CD1DF34B450018A4C03D79A -5A280136AFA0A0A8C7403F0A5A2801B81E80FE1556F7CF16B29B68419B69D9 -C8EBDAAE507A5007176FE1BBABE325D5FB9F379F9303F9835D169332C91792 -A817C8FDDF5EE2B43A73DAB26F236B1B95BB8BEE31C3FD09E69580D7C9F4A0 -FD7151452A4D1870D947E56A41918CFE34C031DC3607D2978238E6968A0040 -4FA51F5E94B450014514500145145001451450014514500145145001451450 -01451450014514500145145001451450014514500145145001451450014514 -50014514500145145001451450014514500145145001451450014514500145 -145001451450014514500145145001451450014514500473C9E4C4F21E8AA4 -D67E8F1E56695BEF4929607D8E2A5D624C5AF93DE73E58FC454D650F93690C -67AAA8FE5401668A28A0028A28A0028A28A0028A28A0028A28A0028A28A002 -8A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0 -028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28 -A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A -28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A002 -8A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0 -028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28 -A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A -28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A002 -8A28A006804820D327896584C67A118352D1C50063D9482CA67B39CE149CC2 -7D5456B9EC0F7AA1A9D989D5665E1D38047A53F4EBAFB5DB82DC483EF0F4A0 -0BB4521A5A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028 -A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A00 -28A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A -0028A28A0028A28A0028A28A0028A28A0028A28A0028347E34C73B4EE270BD -F3DA80336EC1B8D521847FCB2DB2FEB5A9D0D64E901AE5A5B97FBC1CA027D0 -56B753400B4500E68A0028A28A0028A28A0028A28A0028A28A0028A28A0028 -A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A00 -28A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A -0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A2 -8A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028 -A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A00 -28A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A -0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A2 -8A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028 -A28A00283C8A28A006E3B1FBB591701F4DBCF3D78824FBFE83B0AD9EB515C4 -2B3C663750CA7A83D2801EAE1C6453AB274D9DA076B49D8974E8C7AB679AD4 -1C0C649F7A0075145140051451400514514005145140051451400514514005 -14514005145140051451400514514005145140051451400514514005145140 -05145140051451400514514005145140051451400514514005145140051451 -400514514005145140051451400514514005145140098EBEF59FACCCC960E8 -84F99202AB8F5AD03D73E959174C6E7558A11F76060EC3B608A00D0B288436 -E8AA319009FAD58A40001C52D00028A28A0028A28A0028A28A0028A28A0028 -A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A00 -28A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A -0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A2 -8A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028 -A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A00 -28A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A -0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A2 -8A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028 -A28A0028A28A0028A28A0028A28A0028A28A00CBD5AD8ED5BA8BFD643CFD73 -C55BB4B91711823AF7A9F8C60F38AC9206957A98FF005139DBFEE9EA4D006C -514818150C0E41A33D0FAD002D145140051451400514514005145140051451 -40051451400514514005145140051451400514514005145140051451400514 -51400514514005145140051451400514514005145140051451400514514005 -14514005145140051451400514514005145140051451400D660A093D2B2B4A -4335C4D7ADCF9A36FE46AD6AB3982CE420E188E3F314FB087ECF6A91743C9F -CE802D0A281D28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28 -A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A -28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A002 -8A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0 -028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28 -A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A -28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A002 -8A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0 -028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28 -A0028A28A0028A28A0028A28A006E703D48AAF7B6C2E6DDE1E8586149EC6AC -ED1B8B7393481005DB927EB4019DA65C140D6B31C321DA33DC74AD2C607D2B -2F53B66475BC8BAC58671EAA39FCEAEDB5C25CC293A9FBC071E9EC6802C514 -51400514514005145140051451400514514005145140051451400514514005 -14514005145140051451400514514005145140051451400514514005145140 -05145140051451400514514005145140051451400514514005145140051451 -4005145140051484F6EF4849DB9E3340195A89FB4EA36B6E39505B7FE5915A -A062B2B4EC5DDE5C5D8FB8DB769FA0C1AD5EAA09EA2801D4520E94B4005145 -14005145140051451400514514005145140051451400514514005145140051 -45140051451400514514005145140051451400514514005145140051451400 -51451400514514005145140051451400514514005145140051451400514514 -00514514005145140051451400514514005145140051451400514514005145 -14005145140051451400514514005145140051451400514514005145140051 -45140051451400514514005145140051451400514514005145140051451400 -51451400514514005145140051451400514514005145140051451400514514 -00514514005145140051451400514514005145140051451400514514005145 -14005145140051451400514514005145140051451400514514005145140051 -45140051451400C74120287953D41EF5928CDA65EF92C336F29DCBFEC92781 -5B1D8D56BEB61716E463E61C83E86802D039191CD159DA65DB3A1864FBD0FC -873D4D6867F2A005A281CD1400514514005145140051451400514514005145 -14005145140051451400514514005145140051451400514514005145140051 -45140051451400514514005145140051451400514514005145140051451400 -514514005145140051451400847CD9F4AA7AA5D7D8EC9A6500904003EA6AE1 -18CE3BD64EA9FE91730DA7556C96FC39A00B7A6DB0B2B348BBF273F8E6AD91 -C60500703DA968001D28A28A0028A28A0028A28A0028A28A0028A28A0028A2 -8A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028 -A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A00 -28A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A -0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A2 -8A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028 -A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A00 -28A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A -0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A2 -8A0028A28A0028A28A0028A28A0028A28A0028A28A00338A4E73ED4A062930 -7D680327528DAD664BE847DD3B5D477C9E4D68C12C7710ABC47E46E869EEAA -E0A1EE306B26061A5DD9B73C5B9FB83FBBC7F8D006CD149BB903AE6827AE39 -23B5002D140A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A28 -00A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A -2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A2 -8A2801ACDB4163DAB2EC879FA9DCCF9F95080BF88AB9A8CFF67B577FEF7CA3 -EA6A1D26DCC363186E5DB963F8D00685145140051451400514514005145140 -05145140051451400514514005145140051451400514514005145140051451 -40051451400514514005145140051451400514514005145140051451400514 -51400514514005145140051451400514514005145140051451400514514005 -14514005145140051451400514514005145140051451400514514005145140 -05145140051451400514514005145140051451400514514005145140051451 -40051451400514514005145140051451400514514005145140051451400514 -514005145140051484E314B9A0028A01C8F4A2800A28A2800A28A2800A28A2 -800A28A2800A28A2800A28A2800A28A2800A28A4CF38A005A2827DA8A0028A -28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A002 -8A28A0028A28A0028A28A0028A28A00423BF7AA97D682EE1DA7871D0D5B229 -086DA391BBD6802869778D730B46FC4D17DEFC7A55FF00F6BF3ACAD411ACA7 -FB640A707FD681F90AD28E559115D4E55BB8ED40128A281450014514500145 -14500145145001451450014514500145145001451450014514500145145001 -45145001451450014514500145145001451450014514500145145001451450 -0145145001451450014514500145145001452138CFD28C8C67B75A00CAD589 -9E782D17F88890FE06B5000A323A564D99FB56A934DFC30964E7BE7D2B581E -33DA801D4520C81CD2D0014514500145145001451450014514500145145001 -45145001451450014514500145145001451450014514500145145001451450 -01451450014514500145145001451450014514500145145001451450014514 -50014514500145145001451450014514500145145001451450014514500145 -14500145145001451450014514500145145001451450014514500145145001 -45145001451450014514500145145001451450014514500145145001451450 -014514500145145001451450014514500145145001451450014514500358E3 -B66ABDDDE5AD94624BAB8481739CBB8519F4E6AC91935C4FC4CCFD874B5EAB -36A5144E0F7520E6803A11E29D07FE83165F8DC2FF008D1FF094E81FF419B1 -FF00C085FF001ACC83C07A03C28C6C62248CE4C6BFE1527FC203E1FF00F9F0 -87FEFDAFF85005FF00F84A740FFA0CD8FF00E042FF008D1FF094E81FF419B1 -FF00C085FF001AA1FF00080F87FF00E7C21FFBF6BFE147FC203E1FFF009F08 -7FEFDAFF0085005FFF0084A740FF00A0CD8FFE042FF8D1FF00094E81FF0041 -9B1FFC085FF1AA1FF080F87FFE7C21FF00BF6BFE147FC203E1FF00F9F087FE -FDAFF85005FF00F84A740FFA0CD8FF00E042FF008D1FF094E81FF419B1FF00 -C085FF001AA07C05E1F1FF002E10FF00DFB5FF000A41E03F0F9FF97087FEFD -AFF8500687FC253A07FD066C7FF0217FC68FF84A740FFA0CD8FF00E042FF00 -8D67FF00C207E1ECE3EC10FF00DFB5FF000A45F027879BFE5C22FC635FF0A3 -70D8D1FF0084A740FF00A0CD8FFE042FF8D1FF00094E81FF00419B1FFC085F -F1ACE1E05F0F1C7FA045C9C7FAA5FF000A77FC203E1FFF009F087FEFDAFF00 -85005FFF0084A740FF00A0CD8FFE042FF8D1FF00094E81FF00419B1FFC085F -F1AA1FF080F87FFE7C21FF00BF6BFE147FC203E1FF00F9F087FEFDAFF85005 -FF00F84A740FFA0CD8FF00E042FF008D1FF094E81FF419B1FF00C085FF001A -A1FF00080F87FF00E7C21FFBF6BFE147FC203E1FFF009F087FEFDAFF008500 -5FFF0084A740FF00A0CD8FFE042FF8D27FC253A086C9D66C30781FE90BFE35 -47FE101F0FFF00CF843FF7ED7FC29078074018FF00897C0DCE798D7FC28035 -6D359D32FDDA3B4D42DEE24196D914A18E3E82B414E4038233EB5E7161A5DB -E8FF001592CEC904503E90D2945000DDE663A0FA57A4500145145001451450 -01451450014514500145145001451450014514500145145001451450014514 -500145145001451450014514500324456565600EEEC6B26C256B09CD94BCC2 -7FD5B9EE4F2466B5CE4B71DBAD53D4AD7CFB62D180244E50FA1A00BA3A52D5 -2D36F45CC38390E876907DBBD5DCD001451450014514500145145001451450 -01451450014514500145145001451450014514500145145001451450014514 -50014514500145145001451450014514500145145001451450014514500145 -14500145145002557BE97C9B490F7DA40FAE2AC73BBDB1597AB49E6490DB2E -771752DFEEE7068026D260D96AB21FBD280C7F2ABAC30B814469E5A2A0FBAA -3029DDE800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A -2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A2 -8A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800 -A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A28 -00A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A -2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A2 -8A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800AE27E267 -FC79E8DFF61687FAD76C4E39AE23E25F365A363FE82B09FE7401D95AFF00C7 -BC7FEE8A96A1B439B78FFDD153500145145001451450035F18E699BD5B0474 -AAFABDDFD874DB9BA032618DA4C7AE149C7E95E7569FF09578B7C396FAF695 -AF3D8C979B258ED8428FE4A6EF99771C678079A16AEC37A24FCCF4CC12DCFE -06B0B5DF1659683A969F633B1F3AFD99631B491F28C9E4571FE2BD6B55B19F -5529AC3406268FECB1AC41B1D3773FE359DAEEAEFACCDE12BD9170CF35C023 -39E8B8A993E57608AE6E6BF4B9DEE97E2FB3D57C4375A2444ADD5AC293C836 -91F2B1C0E4F15D3D797E8458FC5DD5C16C81A4DA1E9EF5EA15A495AC445DD0 -514515250514514005145213DA8038593FE4B0C3FF006043FF00A36BBBAE12 -5E3E30424F4FEC423FF2257774005145140051451400514514005145140051 -45140051451400514514005145140051451400514514005145140051451400 -514514009C0E6838C60F4A3AE73D2968031AF90E9F791DD463F76F84907A0E -A4D6AC4EB222BA9C86191F4A49E21346D1B7DD71B6B32CA536970D64EDC0F9 -D0E3B67005006C5148BC0CFAF34A0E6800A28A2800A28A2800A28A2800A28A -2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A2 -8A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800 -A28A28013F8B1ED5916FFE95AAC939E522062FC41AD0BC97C9B599FA1552C3 -F2AADA44256D7791FEB9BCDCFB9028034474A28A2800A28A2800A28A2800A2 -8A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800 -A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A28 -00A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A -2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A2 -8A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800 -A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A28 -00A28A2800A28A2800A28A28013BE71CE2B89F89809B3D18EEC0FED487B7D6 -BB62715C17C58B816BA6691318DA423538BE55FA35007716841B68B9CFCA2A -5C8AE22DFE20848950E8B76768C6411527FC2C45FF00A025E7E62803B3E297 -8AE2FF00E1620E9FD8979F98A43F1195412745BC0075E4500769C51915C35A -FC4FB6BD88CB6DA55CCD1862BB9181191D454DFF000B107FD012F3F31401D5 -DF5B25EDA4D6CFF726428C3D88C1FE75E77A4FC38D7F47B936769E24897C3E -ADF269E6D017403A0F309C9E6B63FE16203C0D16EF3F514D6F882080ADA35E -1CF52A451B6A3DF431AEFE18EAAFE21D5B51D3FC4115AD9EAC50CB6CF6BE61 -3B17030C4F1CF3C54307C2DD722B4D1EDDFC47133E9724B279BF64C07DFDB1 -9E315D07FC2C2CF2346BB0ABDB232693FE1612A9651A2DE10BDF239A56E7D5 -8AFC97B75134BF056A565E309FC452EB11C8B716D0DBB402DF07087AE73DEB -B7C8AE2FFE1610CE3FB1EEB8E7A8FCA97FE1622FFD016EFF003154DDC49591 -D9F14BC5715FF0B157FE80B77F98A3FE162AFF00D016F3F3148676BC526457 -0B1FC50B696E25B68F4AB979A1204918719424646454FF00F0B117FE80B79F -98A00ECF228E3A1AE33FE1622FFD016F3F314DFF008588BB4B0D12F323DC50 -04321DBF1762C264FF00631EFF00F4D2BBC1D2BCBF47D706B7F15A273692DB -B7F631E1CFFD34FF00EBD7A80A0028A28A0028A28A0028A28A0028A28A0028 -A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A00 -28A28A0028A28A0043C7359FAA5A196112C7C4919DFF005C5681A695E318CF -7FFEB50055D3AE7ED302B9FBEA30C3DEAE03919C562CD1BE9F7BF681910C9C -91D8127A56C46E255571C0C74A007D148296800A28A2800A28A2800A28A280 -0A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2 -800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28 -A28032F5872CD6F029E5E50187FB26AFC518863541D0702B363FF4AD55DBEF -222E33D8106B588C803D280168A28A0028A28A0028A28A0028A28A0028A28A -0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A2 -8A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028 -A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A00 -28A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A -0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A2 -8A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028 -A28A0028A28A0043D7A7E35C47C4E447B1D195C6E0756878EBEB5DC5711F12 -F8B3D1B1FF0041687AFE3401D4DAE9F662043F6688E403F320A97EC167FF00 -3EB07FDF029F6B9FB3C79C7DD1506A1ABE9DA4C624D42F6DECD0FF0014F2AA -0FCC9A6049F60B3FF9F587FEFD8AAF7B6368B69330B683EEFF0070549A76AF -A76AF19934FBDB7BC8C756825571F983ED525F8FF42980FEED20392F86F656 -CFE1E94B5B407FD367FE01FDEAEB7EC169FF003EB07FDF02B98F86A31E1D94 -71FF001FD3FF00E855D4DDDE5AD840D3DDCF15BC2A32D24AE1547E26801BF6 -0B3FF9F583FEF81482C2CC7FCBB43FF7C0ACE8BC61E1C9E458A2D734E767FB -A16E9096FA7356AEF5AD36C98ADC5F5B4241C1124AAB83F89A4EFD064FF60B -3FF9F683FEF814BFD9F65FF3EB0FFDF02A9DEF89743D3B67DB757B1B6DF9DB -E75C226EC7A64D41278C7C3514492C9AF69A91BE42BB5D460363AE0E68B3BD -8469FF0067D9FF00CFAC3FF7C0A4FB0597FCFAC1FF007C0AACBAFE90D18917 -52B4656FBA44CB83FAD2BF883478ED0DE49A9D9A5B86286569942860338CE7 -19A35B8742C7D82CFF00E7D60FFBF628FECFB3FF009F583FEF8150699AEE97 -AC863A76A16B7814E0982557C7E46AF914D8A2707A059DB9F1C78907D9E1C7 -9B17F00FF9E75DAFF67DA7FCFAC1FF007EC5721E1E3FF15D7893FEBAC5FF00 -A2EBB7FCA9B0EA57FECFB4FF009F583FEFD8A4FB059F23EC917E118AB3B867 -1919F4A3A13CF6E94867022082DFE2F42B1C6133A29FBA00FF009695DFD709 -2E3FE16FC278FF009021EBFF005D2BBBA0028A28A0028A28A0028A28A0028A -28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A002 -8A28A0028A28A0028A28A0028A28A008AE605B985A3600E4719F5ACED32E5E -191AC673F3A7084FF17AFD6B5581238EB59DAA5999556E21F9668FA638CE7A -D0068A82060F5A5AAD6378B7716F1C1EEA7823EA2ACE6800A28A2800A28A28 -00A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A -2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A2 -8A28013A73DAA0BA9BECF14B29E15573539FEED666AEE64586D94FFAE6DA71 -F4A0076911111C92B0FF0058C587E35A3DB9A8E08FCB8238C71B140FC85484 -671400B4514500145145001451450014514500145145001451450014514500 -14514500145145001451450014514500145145001451450014514500145145 -00145145001451450014514500145145001451450014514500145145001451 -45001451450014514500145145001451450014514500145145001451450014 -51450014514500145145001451450014514500145145001451450014514500 -14514500145145001451450014514500145145001451450014514500145145 -001451450014514500145145001451450014514500145145001451450015C4 -FC4CFF008F3D1BFEC2D0FF005AEDAB88F899FF001E7A37FD85A1FEB401D85B -1FDC4433FC02BCC7E3CD85BDDF8510CCAAD89A25C9EB8322E6BD36DF2608BD -360E6B2B5BF0BE91E27458357B05B88A3398C1761D0839E08EE053024F0DF8 -6F45F0E5A793A2E9F0D942E065221807A9FEA6B46FBFE3CE5FF76A48225863 -11AF45A8EFBFE3CE5FF76901CB7C3923FE11D946482D7D380476F9AA6F88F6 -D1DCF81B5C4963594258CCCBBBFBC233CD45F0DF9F0ECC3B7DB67CFF00DF55 -77C756D3DE784F55B3B587ED13DCD9C914716EDB962840E6803C52FF00C2BA -1E9FF0DFC2DAAD8D9C11EAF2CB6BBE68B97E4648EBD32056C68BA343E31B9F -155AEB9AB4B15D437CA10B85FDD00A1884CF515D6FC39F0269F69E1EB07D4B -47583528224593F7A5B0C00CF438EB5B7ADFC34F09F88AFD751D4F4A4B8BA0 -73E6191D79FA020552928EE33CCB5BF0EE83A9F88BC09A6DE336AD6EE2EC4D -25E26D6970A08DC07A1FE5563C5BE03F0D2F8D7C23A2C7A5DA8D3DE69FCDB7 -FE161E5E7D7D6BD42EFC15A05EDDDA5EDCE988F7367BBECEDBD86CDC30DD0F -A5497DE10D0F51D4EDF54B9B0596F6D4931C85D86DC8C7AE3A50A56D0479DE -85A7696BF13758D167B58D74BB7D3EDDAD6DD862357248247BE2B9FD474B8C -5A6AFA49027D30DE4D2A2C9C0490E4607B015ECBAA784B48D6AE21B9BDB459 -26830626DC46D23A74351CBE0AD06E74E6D3A6B057B6690CACBB9B972304F5 -A893BB41D0A7E00F0B68BE1ED0AC5F4BD3E0B5927811E678BF8D8A8C93F957 -5A7A553B0B0B6D32D61B2B588470C281510127000C0EB573B553222711E1EF -F91EFC4BFF005D62FF00D175DAF3C9EA0D715E1EFF0091EFC4BFF5D62FFD17 -5DA8E31FC24F6A4599D796B74931B982662001F213814EB3BF5B97313FC92A -0E7D0FE357FA8CF426AB5D5845767F789F30190FE868038E9463E2E42E7AFF -006290AA3A7FACAEF173819E0F702BCF09FECDF8991B5C4E5F1A510015E89B -FDABBE82E639D15E339461907DA8026A28A050014514500145145001451450 -01451450014514500145145001451450014514500145145001451450014514 -50014514500145145001451450014846722971CE6909C50063483FB32F0487 -FD54BF7F1EC38AD7C86195FAD47776CB770344FDEA8E9970E87EC721FDEC67 -E6FA1E9401A83A52D277F6A5A0028A28A0028A28A0028A28A0028A28A0028A -28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A002 -8A28A0028A28A0028A28A0028A28A0028A28A004EF592B8BAD61C0FB90A2B2 -FD6B46E1FC9864933DAB3F458F36E676FBC5883F4CD006B514514005145140 -05145140051451400514514005145140051451400514514005145140051451 -40051451400514514005145140051451400514514005145140051451400514 -51400514514005145140051451400514514005145140051451400514514005 -14514005145140051451400514514005145140051451400514514005145140 -05145140051451400514514005145140051451400514514005145140051451 -40051451400514514005145140051451400514514005145140051451400514 -5140051451400514514005145140051451400514514001AE67C6DA04FAEE9F -6A96A712DB5D2DCAF1DD41FF001AE948A6E4B0E08183CD0070D1C9E368D768 -46751D08118E29FE7F8DBFE783FF00E43AEE07D6978A00E11A6F1B1527CB75 -FC23A64EDE349220A55BE6E0F11D77A7D28C8F5FA500799787B4CF1968362F -691A330699E5E027F11CD6A79FE36FF9E0FF00F90EBB95CFF175A5E280385F -3FC6DFF3C1FF00F21D2F9FE36FF9E0FF00F90EBB9E28E280386F3FC6DFF3C1 -FF00F21D1E7F8DBFE783FF00E43AEE78A38A00E1BCFF001B7FCF07FF00C874 -79FE36FF009E0FFF0090EBB9E28E280385F3FC6DFF003C5C7E11D026F1AE40 -2ADC8FEEC75DD5263907D2803CB74FD1FC6367AD6A1A961B37ACAC7E54FE15 -C56D79FE36FF009E0FFF0090EBB8079F6ED4BC50070DE7F8DBFE783FFE43A4 -33F8D80FF52FF9475DD714CFB9C05272680386D1740D666F172EBDAB1E9626 -D7690BFDECF6FC6BA69F4C6818CF62DE5B13961D73F9D6A724E72303B51EF4 -019B6BAA82DE55CAF9728EE4E73F95689CE09CE3DFD6A0BAB48EE54065C9F5 -1C55056BBD2860A1B887FD81D3F13F5A00D620039C7E34E19C7273505BDE45 -723744C18F751D454EB8C71400B45145001451450014514500145145001451 -45001451450014514500145145001451450014514500145145001451450014 -5145001451450021F5C648E959BA9DAB8CDDC23F7B18C8AD238EA7B51D063A -D0057B2B85B9815D0E7B1FAF7AB038EB58C33A5DE123FE3DE53819FEF1E4D6 -B83BD55877E6801FDE8A28A0028A28A0028A28A0028A28A0028A28A0028A28 -A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A -28A0028A28A0028A28A0028A28A00CBD6981885B8FBD71C0FC306AFC09E5C2 -ABE82B318FDB35754ED6C727F115AFD45002D1451400514514005145140051 -45140051451400514514005145140051451400514514005145140051451400 -51451400514514005145140051451400514514005145140051451400514514 -00514514005145140051451400514514005145140051451400514514005145 -14005145140051451400514514005145140051451400514514005145140051 -45140051451400514514005145140051451400514514005145140051451400 -51451400514514005145140051451400514514005145140051451400514514 -00514514005145140051451400514514005181E9451400514514005181E945 -14005145140051451400514514005145140051451400628A28A0028A28A002 -8A28A0029ACA0E430054F6C53A908E49FD2803327D30C6C66B67643FDD0783 -F9516DA93AB79374A227ECCC30A47F8D69F5AAF736B15CA112A827B1039140 -13860EA08391EA3BD28391D6B1F17BA63657335B1F5CB30FF22B42DEF60B80 -361E4F507A8FAD0058E8296900C77A5EF40051451400514514005145140051 -45140051451400514514005145140051451400514514005145140051451400 -514514005145140105E5AADD4263381E87D3DC552D2AEDD9A4B69F89222428 -3C6E51C035A86B2F53B731BA5EC3C3A63763BAF5A00D319A5AAF6771F69844 -9DCF6F4AB14005145140051451400514514005145140051451400514514005 -14514005145140051451400514514005145140051451400514514005145140 -051451400DEA48E69B238552C4E02D3FF9D676B1294B431A9F9DF1FCC50037 -464DD1B5D30F9A4EA4F5382456981C5430422185625E02D4DDE80168A28A00 -28A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A -0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A2 -8A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028 -A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A00 -28A28A0028A28A0028A28A0028A0D140051451400514514005145140051451 -40051451400514514005145140051451400514514005145140051451400514 -51400514514005145140051451400514514005145140051451400514514005 -14514005145140051451400514514005145140051451400514514005145140 -0514514005145140051451400518E73451400100820F20D65DE69D897CCB43 -E5C98CED5E158FA935A9484678238A00CBB6D4DA26F22F50A4838C8C95FCEB -4D59587CAD907B83515CDB457686295770ACD2B73A51CA9DF6E3F87818FF00 -24D006B938A5155AD2F22BB4DD11E475078AB001DDB8FA74A0075145140051 -45140051451400514514005145140051451400514514005145140051451400 -5145140051451400514514008DD33DA9922ABA956E558629ED8C60F7E29A46 -4EDC741C5006524874CBD31393E4C832A7B673C0AD504F53D3BFB556BEB35B -C87CB6FBC9F329F71D2A1D2EE5E58DE29B89203B1FFDA3401A0B9C907A0E87 -D69D48A31C7A52D00145145001451450014514500145145001451450014514 -50014514500145145001451450014514500145145001451450014514500145 -141E9400D271CD64CC4DDEAC8A394B7C871D8E4715AB23048CB1EC2B374752 -ED3DD375B8208FC38A00D5C0F4A31451400514514005145140051451400514 -51400514514005145140051451400514514005145140051451400514514005 -14514005145140051451400514514005145140051451400514514005145140 -05145140051451400514514005145140051451400514514005145140051451 -40051451400514514005145140051451400514514005145140051451400514 -5140087B714B45140051451400514514005145140051451400514514005145 -14005145140051451400514514005145140051451400514514005145140051 -45140051451400514514005145140051451400514514005145140051451400 -51451400514514005145140051451400514514005145140051451400514514 -00514514005145140051451400521E9D29690FAD00675D692B2379F6E7CA9C -720F5A8ADF536B7710DE0C39E15CFF0011F4C0AD503B9EB51CF0A4F1B23A65 -48C11DE8024470E01073919A5C9DD8C718EB58EF6D73A6B6F80EF83AB44065 -BF33ED576D75086E4050DB1FBA13C8A00B7923A8A5A4248A5C720D00145145 -00145145001451450014514500145145001451450014514500145145001451 -45001451450018CD18068A28011871C5656A70B41225F44398C60AFAE4D6B1 -A8CE1B20FCC1BA50025BCCB3C4B2A9CAB54873D8D63DB96D36F5A07E2093EE -1EC3039AD85C6320F14006734B49D296800A28A2800A28A2800A28A2800A28 -A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A -28A2800A0F438A28A00CCD62778AD0056F9CB0078AB56702DBDBC71A8C6D1C -0AA3743ED7AAC510E5114EEFAD6B63383E9400B45145001451450014514500 -14514500145145001451450014514500145145001451450014514500145145 -00145145001451450014514500145145001451450014514500145145001451 -45001451450014514500145145001451450014514500145145001451450014 -51450014514500145145001451450014514500145145001451450014514500 -14514500145145001451450014514500145145001451450014514500145145 -00145145001451450014514500145145001451450014514500145145001451 -45001451450014514500145145001451450014514500145145001451450014 -51450014514500145145001451450014514500145145001451450014514500 -145145001451450014514500145145001451450018A314514009B4631D7EB5 -42F34C49BF79192927A83815A148DD2803262D426B43E55E46760E9328F93F -335A91CA92A86460CA7A107834D9218E58CA488AEBFDD23359725ADCE9B97B -766953FB84938FA01401AFBBAF18FAD2839F7FA552B6D422BA1B58EC7EE09C -55CC74DBC0CD003A8A28A0028A28A0028A28A0028A28A0028A28A0028A28A0 -028A28A0028A28A0028A28A0028A28A002902819F7A5A2802A6A1682EA0239 -0C3A1150E97746580C52F12A751F8F15A358F7E86CE517F102157EFA8EFDA8 -035FBFB52D4504CB346B20E770FCAA5A0028A28A0028A28A0028A28A0028A2 -8A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028 -A28A0040739A6C926C8D9FB2824D38F0323BD51D566315BF96BD65F93F3A00 -874A1E6CF7773D9E4CA9F6C56A0FD2AAE9D07D9AD618B1C85E4D5A03000A00 -5A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2 -800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28 -A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A -28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A280 -0A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2 -800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28 -A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A -28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A280 -0A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2 -800A28A2800A08CD1450026D1FFD7A31C52D0464628033EE74B8A701D07932 -8FE24E3355E0BEB8B37115E81B73857193F9D6B919A8A6862990ACC81D7D0D -003A3956450CAC0A9EE0D3B78F7EB8AC892CAE2C9BCDB5632C3D7C8FBA07BD -5BB2D422B81B724483865231B4FA7BD005DDDCE2973499F6A3DC5002D14514 -00514514005145140051451400514514005145140051451400514514005145 -14001E9C545246B2828C0321EA0F4A94F4A6E3A81C5006459CADA7DDB5ACAC -7CA63FBB27D49AD704907A67B552D46CFED7064712C792A7DE8D3AEBCF87CB -6E258FE53EF8A00BC0E473D7BD2D20E383D7AD2D0014514500145145001451 -45001451450014514500145145001451450014514500145145001451450014 -51450027F2ACABB3F69D42283F8570FC7B1AD32422927A673599A58F3AE6E6 -E1BF864645FA5006AE052D1450014514500145145001451450014514500145 -14500145145001451450014514500145145001451450014514500145145001 -45145001451450014514500145145001451450014514500145145001451450 -01451450014514500145145001451450014514500145145001451450014514 -50014514500145145001451450014514500145145001451450014514500145 -14500145145001451450014514500145145001451450014514500145145001 -45145001451450014514500145145001451450014514500145145001451450 -01451450014514500145145001451450014514500145145001451450014514 -50014514500145145001451450014514500145145001451450014514500145 -1450014514500145145001451450014514500145145001475A28A0042B9EBC -D183D8E2968A00403154EF34D8AE7E7FB920E437A1ABB41A00C65BDB8D370B -7637C5DA5E067F015A914A93A0913946E8694AAB8219411EFDEB2E4D364B57 -3359B95FFA658CE7F3A00D70D9E7B7AD19FCBD6B3ECF538E73E54F88A63FF2 -CC9E6AEEEC71DFB2D00494503A7A5140051451400514514005145140051451 -40051451400514514005145140053429098DDCFAE29D4500211DFD2B22F233 -6572B751FDC246F1E83A935B1513C6B2C6E245E0823EA28016295664475E77 -2EE1F4A93F0AC8B1736174D6921CAC84BC64F61D00AD6C907DA80168A4C739 -A5A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A002 -8A28A0028A28A0028A28270280296A9379564E07DE70507B1229DA7C5E55A4 -3EACA0B7D7154F50633DF416A070ACB29FCEB5546D180381C0A00751451400 -51451400514514005145140051451400514514005145140051451400514514 -00514514005145140051451400514514005145140051451400514514005145 -14005145140051451400514514005145140051451400514514005145140051 -45140051451400514514005145140051451400514514005145140051451400 -51451400514514005145140051451400514514005145140051451400514514 -00514514005145140051451400514514005145140051451400514514005145 -14005145140051451400514514005145140051451400514514005145140051 -45140051451400514514005145140051451400514514005145140051451400 -51451400514514005145140051451400514514005145140051451400514514 -00514514005145140051451400514514005068A2801319183FA5214C8C76FD -69D450053BBD3E1B95E9B5FB3038354125BAD3CEC9D4C917AA8E7F335B39EC -7AD23AAB8DAE01A0065BDCC57081A370DC7233C8FAD4D9ACA9F4D78DFCFB47 -28E39D84E14FE02A4B5D503B79374BE4CA3FBC300FD33401A3466901047073 -471E9400B4503A514005145140051451400514514005145140051451400514 -5140011918A6EDF5EDD29D450051D4AD0CB0F989F7E33BFDF8ED4BA6DD7DA2 -1C37DF5E181EA0D5D3C8AC7BA56D3AEFED5164C4FF00EB14763DA803581CAF -3C1A75471C8B2A8910828DDEA4A0028A28A0028A28A0028A28A0028A28A002 -8A28A0028A28A0028A28A0028A28A00283C514500148481D7A500F19355752 -9BCAB39707E62876E3D68029E9CA6E2EE7B93D8B4633EC6B579DE07B555D32 -2F2AD1091CB80C7F11573DE800A28A2800A28A2800A28A2800A28A2800A28A -2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A2 -8A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800 -A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A28 -00A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A -2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A2 -8A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800 -A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A28 -00A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A -2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A2 -8A2800A28A2800A28A28010823A609F7A36F7EF4B4500201EB55EEAC62BA19 -6501FB3E3915668A00C533DD69AFB65265881C295CB1C7BD69DBDD47728190 -83EDDE9E631F30E81BA8F5ACEB8D30C2C66B363037754E8680354519ACBB4D -50B1F2AE879528EA064FEB5A79C8C83400B4520CE39A5A0028A28A0028A28A -0028A28A0028A28A0028A28A0028A28A002A19615954A32821B939A9A933FA -50064D84A6D27361212557846F5EE735AC582827AE3B0ACFD4AD3CE8FCE8B8 -917A1152585C8B8804C7863F787A76A00B9914B4C0BB57AE69E3A0A0028A28 -A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028270334507 -A500348F9702B2B52633DE5BDB2F6605FE86B5BB609E6B26C7FD2F519AE48F -9400A3EA0D006A85DA8157B0C0A500F1F4A5A2800A28A2800A28A2800A28A2 -800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28 -A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A -28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A280 -0A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2 -800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28 -A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A -28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A280 -0A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2 -800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28 -A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2801393ED4107 -B1C52D14015AEACA1BB0564419ECD59EAD77A5B6D606E21F5C85DB5B3CD359 -438DAC38340105A5DC5731EE4937F38E98C7B559ACBBAD2F1279F66FE55C01 -DC6723D31496FAA14905B5EAEC97B1FEF76CF1401AB9145315B2320E47A50A -14925793400F073452039ED8A5A0028A28A0028A28A0028A28A0028A28A002 -900C13EF4B45002018AC6B81FD9779E7AFFAA9F861FDDC0ADAA867896E2328 -C3AF4A007821F690781CD3EB234A99A091ECE63F32FCC0FAE6B5BAD002D145 -14005145140051451400514514005145140051451400514514005145140153 -50B916B692CF9C6D031F9D334985A0B4008C1762FF0081E6ABEA789AEADACC -7472777E59AD38D7622AFA0C5003E8A28A0028A28A0028A28A0028A28A0028 -A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A00 -28A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A -0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A2 -8A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028 -A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A00 -28A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A -0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A2 -8A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028 -A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A00 -28A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0029314B -45002633C11F8D41716715CAED75FA30EBF9D58A28031992EB4C6DC9BA6887 -600923F1ABD6B7B0DD0051807EE99E4559719182322B3EEF4DDE37DA911C9E -C71FCA803441C8CE314B5936FA8BDBFEE6ED4A9FEF9181F8935A61D6450E8C -194F7073400FA29A99FC3DFAD3A800A28A2800A28A2800A28A2800A28A2800 -A69E3E6C1FA53A8140199AA5AB155B9841F363E703AB7B559B2BA1710A9C8C -81861E87B8AB2CB9AC87274CBCE07EEA63DBB313D4D006C679C77A298A4150 -41CF7C83FE78A783919A0028A28A0028A28A0028A28A0028A28A0028A28A00 -28A2909C5002E47AD07A534F7183CFA543773AC10BC8D90050051B41F6AD4E -698F2A806D3DBA56A839ACED1A1682CD3CCCEF24E73F5E2B4BBD0014514500 -14514500145145001451450014514500145145001451450014514500145145 -00145145001451450014514500145145001451450014514500145145001451 -45001451450014514500145145001451450014514500145145001451450014 -51450014514500145145001451450014514500145145001451450014514500 -14514500145145001451450014514500145145001451450014514500145145 -00145145001451450014514500145145001451450014514500145145001451 -45001451450014514500145145001451450014514500145145001451450014 -51450014514500145145001451450014514500145145001451450014514500 -14514500145145001451450014514500145145001451450014514500145145 -00145145001451450014514500145145001451450014514500145145001451 -45001451450014514500145145001451450021CF6A31E839A5A280209EDA2B -84225453F866B34C175A612D0169A1EEAE4923E8056CF714D39CE0F20D0056 -B4BF82E70036D93BAB707F2A9CDC421FCB32A073FC3B866B2B55B7B7B38DAF -5331C8833951D715C1DC6BB707504BC2EC155C03F4CE6803D5723D68ACDD23 -511A95A4732807E51924F39ABE324641E7D2801F453473EC475A5FC680168A -28A0028A28A0028A28A002AADEC692C0EB2945041C3138C7B8F7AB555352B3 -FB6DB3C418A920E31F4A00E7C78A20D3F368C44CE9D1D7E605471D73D6BA5B -3B85BBB58675E0488180AF2BD574C9B4ABA757C9049E7F1AEFFC3173E7E951 -73B8C48AA3F2A00DBA29A32C01CE33DA954E4645002D145140051451400514 -51400514514005230C8A5A0F2280192310A59707009E6BCFEF7C593CAD2DAC -E8AB19239E73C73EB5DF49F2C657FD93CD79645A7B5FEA86DCFCE33D4F6E33 -401E8FA4EA29A95B79AB1B281D88C5680EBD6AA69F68B616A2350322ADF1C7 -1400B45145001451450014514500145145001451450014514500145213CFF4 -A4C1CE73F85003A8A414B40051451400514514005145140051451400514514 -00514514005145140051451400514514005145140051451400514514005145 -14005145140051451400514514005145140051451400514514005145140051 -45140051451400514514005145140051451400514514005145140051451400 -51451400514514005145140051451400514514005145140051451400514514 -00514514005145140051451400514514005145140051451400514514005145 -14005145140051451400514514005145140051451400514514005145140051 -45140051451400514514005145140051451400514514005145140051451400 -51451400514514005145140051451400514514005145140051451400514514 -00514514005145140051451400514514005145140051451400514514005145 -1400514514005212476A5A280229E149D36489B95B8619ED58579E0FD3AE77 -792A20DDD48C9E7F3AE889C51D280397D2FC3F77A2DD130C86688F18200AD5 -D5759B3D1A1FB4DECC22007DDC139EDDAACEA37D1E9D672DCCBF7514903D48 -04E3F4AE0B41D03FE12DD4A3F166B20B22E7EC119247971B0E47CA4679EE45 -005A1E33D7B5325B41F0FADE40DFF2D8DC843F930FAD3BFB6BC79FF42C2FFE -06475DBA00A400A100EC3BD49401C27F6D78F3FE8585FF00C0C8E8FED9F1DF -FD0B4BFF0081895DDD1401C27F6CF8EFFE85A5FF00C0C4A3FB67C77FF42D2F -FE06257767A5479CF53903AD00711FDB3E3BFF00A1697FF03128FED9F1DFFD -0B4BFF0081895DC86C3105BAF414DC100679CF56A00E23FB67C77FF42D2FFE -062537FB67C76739F0CA86EDFE9895DC16191C67F1A5C850493C819FC2803C -F6FAE7C67A8C062B8F0B26EEC7ED8951E97FF099E8F0B241E1F5632104AFDA -938AF452C5802BDFF95282376D2DC9E40A00E1FF00B67C760863E195E3FE9F -1281ACF8EF1FF22CA8F6FB6257727A1DD46E01BA727A7BD2B81C3FF6CF8EFF -00E85A5FFC0C4A3FB67C77FF0042D2FF00E062576E4ED3CF27B9F4A370DC15 -5B07A91EB4C0E23FB67C77FF0042D2FF00E06251FDB3E3BFFA1697FF000312 -BB838193EBDA9A1C28C96C2F4C7A52B81C4FF6CF8EFF00E85A5FFC0C4A3FB6 -7C77FF0042D2FF00E062576DB82F0CDCF6A46242827E53DDBD2981C57F6CF8 -EFFE85A5FF00C0C4A3FB67C77FF42D2FFE062576C3E7C153C7F3A529818071 -4C4DDAE711FDB3E3BFFA1697FF00031283ACF8EFFE85A5FF00C0C4AED54E5B -EFF0072314A48033BB1486711FDB1E3AE55BC34BB58633F6C4ACDD3E2F1869 -5349345E1A5666C73F6B418FF39AF484933F313C1FD2959B6F03F3F4A00E1C -EB3E3D07FE45A5C7FD7DC74A359F1E7FD0B4BFF8191D76E093CE307B8A45DA -9C1E067A6685A8EC715FDB3E3BFF00A1697FF03128FED9F1DFFD0B4BFF0081 -895DB6E3B4E7D78F614E18C039CFBD0C0E1FFB67C77FF42D2FFE064747F6CF -8EFF00E85A5FFC0C4AED641D3B8A701EF82695F611C47F6CF8EFFE85A5FF00 -C0C4A3FB67C77FF42D2FFE062576CA7A6E3B8AF7A3248E98FE9437605A9C4F -F6CF8EFF00E85A5FFC0C4A3FB67C77FF0042D2FF00E062576DCB1C1E71D1A9 -4AB7077608EA71DA9F4175388FED9F1DFF00D0B4BFF818947F6CF8EFFE85A5 -FF00C0C4AEEC1046474A2819C27F6CF8EFFE85A5FF00C0C4A3FB67C77FF42D -2FFE062577745007067C55E2EB0F9F51F0CA476C3969FED6AC40EFC0ADFD07 -C53A6EBC0A5ACD8B85199232A460F19EA07735B6E32318EB5C8F8B3C243500 -351D31841AA5BFCCB2019F336E484C6703271CD0075C854E71D41E7EB4EAE6 -7C23E229359B26B7BA5316A368FE4DC21C13BC01BBA0C7E55D28EA680168A2 -8A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028 -A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A00 -28A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A -0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A2 -8A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028 -A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A00 -28A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A -0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A2 -8A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028 -A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A000D2639A5 -A4FF001A00E1BE28DD4C9A5D84307DE7D42156FF0074920D761696E9696C96 -E8842C436AFB8AE2FE27F10E998E3FD3A1FF00D08D77A7A500341C3F0339EA -7D29F4628A0028A28A000F435C4FC44F1B3F84EC624B684CD7D72CA228C632 -013824E7D2BB6AF28F8C5637F14961ADDB5AB5E476C446D1C71976C16CE71E -D8A00DA4F0FF008B1B475924D5ACFF00B69865AE0407CA1CFF00733FDDE3EB -585078AFC41A9EA567E1B81A286F21661A933C790011B9303B576B61E36F0F -DF58ADDC5A9DB1523EE99D093DBD6BCF6394F87FE244FAEDEC32C5A7EB0514 -5C38C4707971E32EC78009E0511FE247E629FF000A56DF436BC552EB3E038E -0D56D6EA27D251B37D1BA6E7DB8E70C7A738ACBF13F8CB568F58F0C4DA55D4 -11D8EAB2DBABC7247B98ABF2707E95A5F15755B6D6BC3AFA0E9B3477B77A8A -98916060FE5F4219C0E71C571BE2648346BDF0358DD5CC092DB4B66B2066C6 -D2A307AF4E952BF894EDDD8DFF000E6FAD8F75219ED993A394C67D78EB5E6F -F0EFC45AD6ADE2DF10E9F77710B5AE9D78F6F12AC786DA3A64F7AEAEFBC6BA -1DA3C1026A16D733C8CA9E54332B3A83C6F233F747735E73F0CF56D3AD7C71 -E327B9D42D6357D4E4656328008C1E6ABED312BF2ABEE7B5E06E24822BCC3C -57E3FD4B4AF1CE97670C43FB1E067FB7CE54100140539EA3935D2DE7C42D0A -117662BB8EE23B52124962955950B74C9CF15C46A5E12D73C41E0EBA0F7BA7 -017432D7037798007E3E6FC3152523BFF1AEA17169E13D4B51B16549E0B7F3 -219186573C751DEBCF0F893C5965E0B7F12B6A762F25B48CD320B7FF005912 -AE762FA37BD5BB6F1A5AF893E135FCB73730C5751C3247246CE0150AFB4123 -3D0E2A0F86DE0FD2B5ED0565B8D46EAE512E4B1B75B80D0B0C0E19718239AB -E825B90AFC479B54F1168F657F7D0699637FA345751F9C9CB5C3B6000476C1 -E9ED5D316F11D8F873599EF2E60792191E5B39962C29882E46477391D6AA6B -FA5F837C452BE8DA82C5A5DE69E87ECF2031C4EA8990A54F5DB93DBD2B07C3 -7A9DF5BF84BC51677F7A2E2C2D279ADAD6E2572C64411FCA771E0E7DA90D9B -5E0FD5F54D77C1761AF5FEAB6904B7112B484C4400C4E00C0AABE34D5BC45A -347A1470DEDB092ECCDF68631641DB8DB8F4EB591E04D27C357DF0D34C8AFF -00C4125B1686379116F553695390307A549F107C45A5EA29E1BBD82E14420C -E1433AFCFF007471EB479194AE74DE28B9F167862CFF00B7AD2FAD26D36D63 -12DCDA79199655C0E1589C03935D2D978CB499EC34FB9B9B94B76D41961863 -73CBCA46760C77AE67E20F8A2D26F075E69DA5C91EA3A8DC5B6C8EDEDD848C -0F18CA839E6AEF87F4ED3341D1345B7D78DA9B992647B713EDCACCC3202EEE -430E7A734CBADF64EB359BB96C348BBBA813CC962859D147720645799E89AA -6ADE2982E27D2F57B44D561B9CCD6ED116288002C98E9BB24735E97ACDEC5A -76957377246658A38D9DC019F94024FE15E31E2ED3342B8B6B5F14787B5C3A -5DFCB2A17B782EC44B213962ACABD589C0A6B72A7F0A3A3F887E20D7F48D3F -4EBDB4961B5B970A2649A3DDC97C1E3E95A9F13356D4B40F083EABA5DCC51C -F6E506644DC0EE755E9F89AE27E26EA2FA9F83748935373697B3AC4D2293B1 -81F346783CD5FF008B7A3E9DA7780AEA5FED4BC91898BCA492E7224FDE2678 -EF8ACE16E45FE313DDFA1B3AEF89B5A17163E18D12E201AA5C67CDBB78F7C7 -0F01812BD791915A9A8683E25B2B0864D3351B6172A375C09222DE6F1C851D -B9CD727A9CCBE1EF1B69DE2197F7DA65D00B2DD47CC506D8F1966E8324E3EB -5BDF12358D3B50F0B4D2E9DAE14BA685CDBA595D00F23EDE0000E49FA539FF -001341F45E857F1DEB7ADE88FE1A6B79A28E5BFBBB6B2B90F1E40DF9DD8F4E -95D86B82F068D1ADBCF1C53215CC8EB956C03D0579C78C6C6EA3F0C7822FE6 -FB448B6D7D67717724F92635084BB393D00EE4D777A9788B4BBED36DA3B5BD -82E5EE5904690C8AC70C386C03D289ECFD495BC7D0E5BC4FA8EBDA641A4CB6 -77700695079A5A3C8625B1C7A7150FC43F146BDE07D634BBEB5559F4970FF6 -DF9012A7809C9E9C9A5F885736B609A3DADC5D471CC8A0152E01FBDE95D078 -8EE343D76FA1D06E2686792E11B11875272A3774FC29C8986F3F91A9E26F11 -49A7787A4BFD38ADC5CC880DB46A325CE46EEBF8D79EF867C55AFEB3F0DF52 -F10DE4D10D46069563DB1E1576B00323BF06A1F87526B13FFC4BFC471C96E9 -E1EDCE269D59526F34B7196EB8E3D2B3FC17A9DA45F07B5B0678F709EE0956 -619C798318A995D2ABF2B1AD3DE16FF87372EB5BF14E97E0D8FC47FDAD6293 -A2F9B22BDB9224409BB628ECC7D6BD2FC2DAA49AD78774BD4E51892EED2399 -8631CB2827F9D7825D688C9A3697E28D3AFEF356D3EDA547BFB01319A308AB -B9C6C1C0E38E6BDDBC27AEE97AF68B6777A5189616853104657F71F283B081 -C0232062B592D1192D97AB3A01D05140A2A0B0A28A2801ADE9D8F1498C76E7 -A0A7D1401E7FAA46746F1ED9DE21DB04D6CC251EAECC466BD0074E6B84F1C6 -E1AC58365428D99CFF00BF5DDD001451450014514500145145001451450014 -51450014514500145145001451450014514500145145001451450014514500 -14514500145145001451450014514500145145001451450014514500145145 -00145145001451450014514500145145001451450014514500145145001451 -45001451450014514500145145001451450014514500145145001451450014 -51450014514500145145001451450014514500145145001451450014514500 -14514500145145001451450014514500145145001451450014514500145145 -00145145001451450014514500145145001451450014514500145145001451 -45001451450014514500145145001451450014514500145145001451450014 -51450014514500145145001451450014514500145145001451450014514500 -145145001451450014514500149FE34B49FE3401C17C4FFF0053A67FD7F43F -FA11AEF8F4AE07E27FFA9D33FEBFA1FF00D08D77A7A52B80B45145300A28A2 -800A8668629D0C5346B2A37F0B8CAD4D4605006147E0ED020CA45A3D8C51FF -000A240A07E58AD0BBD2B4FBF80DB5DD9C17107FCF29630CBF91ABB8A4C52B -81930787749B5B8171169F6C9300007589410074E714DBFF000CE89AA4A971 -7FA4D95CCF1B064792056618E9C915B181E94D38078C71CD3F303193C2BA0A -DC7DA868D62B3EDD9BC5BAE71E99C50BE11F0EC2F24B1685A72C92B6E9185B -202E7D4F1CD73DAB78C35797C433695A4D8432DBDBDB34EF3CB2143BD49053 -D31D2A2D3FC4FE23D535AD3EC9EC2D22B4781A49E786E0B14718C2FA73493B -B06BB9D38F0AF87D229E28F44B254B92AD320B6501CAF4DDC738AD016D6D14 -02DA3B78C5B8E0C4106D3F415379815779C95A825D42CEDC9135C44AC9F781 -71F2E7D7D28B01417C27A0456F2DBC5A269EB14C312C7F67501C6738231CF3 -5734ED234FD22030E9D656F6919E764118419FA0ACC7F1968E9AF368AD738B -C50A581FBA030C8E6AF45AF69334C218B53B3790B6D1189D0B13E80669AD49 -6EDA8CB8F0EE8F77766F6E74DB69AE0C7B1A4785598AE738C91EBDA9E9A069 -3F647B5FECCB4FB2C877343E4AED27DC63157D8F71D2B07C61E2BB7F0A68D3 -DFC8AF348ABF2451A96624838C81CE32393DAA6F6762FA5C997C21E1D8EDC4 -31687A7A43DA3FB32051F8629F27847C3D2C70C52687A73C56F9F250DB2111 -E7AE0638CD67F817C4737893C2D65ACDEA2C125CC22478D589543E809AC2D3 -FE214FAAF8EA5D06DED88B48718B86DC3CCCA6EE3B1C118ABB5A6A04C9DA0E -67616FE1DD16D67F3E1D2AD23986312AC0A1BDB9C558BCD32C6FDA06BCB2B7 -B86B79049099230C6371D1867A1F7AB249E07AF7AAD15FDBBDE3D90726655D -C411D0503B392B93CB0C5710BC12C6B244EA51E37190CA7A8C5659F0978748 -55FEC4B02A8C1829B74C061D0F4EB5A534CB02C8ED9FDDA16271D857030F89 -35FD523D5F52B58214834CBA78C209C81246A371623FBD8ED42D449DCECB51 -F0E68FAB041A86996B7423FB825855B6F39EE3D69750D0B49D4EDD6DAFB4EB -6BA857EEC72C2AEABDF8047B571D0F8C3C4DE26D3B4CD47C37A65ACD697907 -9933DC4ED1346D9380A3B8E2AAE8BE2BF185D6A1ADE98DA55A35C69E62111F -B4B15937024E4FB0A9DF41B3BC9F45D36E2C8D8CF616B3589EB03C4AC879CF -DDE9D6AB47E13D022652348B43E57CD18302FC87DB8E2B99F0FF0088F588FC -5971A1DFC31490610C72A4A5D812A49DC3B7B5749E2DBFB9D2B40BED42D46E -9AD2179950920310320134DAB6E099A77361697B6C6D2E6DA29ADD976B4322 -02A5718C107DAA85A786B45B49565B6D36DE26886D8C08540403A638E00AE3 -FC3DE21F11EBFE1E7D54476D14C01F2E3FB490ACC1410A49E839ABFAEF8E6E -7C3DA1D8B5C5AC526B17A63862B78DCB2191C607CC39DBBB8CD263D8E96FFC -3FA3EA922CDA869769752A7469615723F314F4D0B48176B7C34CB55B94FB93 -08577AE460E0E33D2B9627C6F1690B7E2D2D5F5293065B33747CA8FD76B753 -5D2F86EEEEAFF45B6B8BC8FCA9DC1DCB93C727D69F2BBFA13B1724D3ACE659 -0496D13F9C00903203BB1D33EB59D1784F40B7B692D23D16C12DE5CEF852DD -42367AE462B7703D29303D2931AD0CAB6D034BB3B396C2D34DB4B7B49410F0 -C50AAA302307200C1E2A5D3748D374984C3A7D8C367196C958630809F5E2B4 -7028C0F4AA6EE2B001800514514861451450014514500703E3B4F3756B38F2 -46E4500FBEE35DF5709E37CFF6D69FD3184EA7FDBAEE46EE3279A007504E29 -B924F14B8C1E0FE14000CE79C6296907BF5A5A0028A28A0028A28A0028A28A -0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A2 -8A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028 -A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A00 -28A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A -0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A2 -8A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028 -A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A00 -28A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A -0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A2 -8A0028A28A0028A28A00293FC69693FC680382F89FFEA74CFF00AFE87FF423 -5DE9E95C17C4FF00F53A67FD7F43FF00A11AEF8F4A0028A293391C75A005A2 -918903A64D3779C82391D08F4A007D14DCF049E0521638CA8DC0F4A007D151 -82C18063FF00D7A76E07BFD2801D51142A4B85DCE78EBDA9FB864AE791CD35 -CE38E99E8D40CE235FF0FC9613DC6A30EAAF6E9386DD6A22044AED938DDDB3 -D2B93D253525D57EC765786C2196179E721436C751C28CF5FAD7ABEA3A4DB6 -AB1C09769E608255954E48F997A74AA97DE14D1B52BB8EF2EAD37CF17DD612 -30C739E80D0912D5C6787B5194E8705C5FCBBB821A56C0CF2474AF32F1EFDB -342D5F57D656CD356D1E6F28DEC6F308FECC000170072D927B74C57AA6B5E1 -AD2BC43A53693A95B19ACD8A9318765E41C8E4107A8AA13F807C3D7171753B -D8967BC08272657C36D185E33C7E14151563CDB4FB1D2B57F8A7A8DC490078 -DED6DF69662B8F90545F07BC0BA06A2D7BADDCD82C97967ABCA209CC8D95DA -415E338EF5E9BA8F807C37AC5F41A85DE9FE65CC0C0A3895D718181C03CF14 -695E0BD2FC2B6B723C3B6C6CA49999DBE767DCC7AFDE27D05098E6D38D8E87 -00648E07715E55E279BC4E2E358BDB8F0E432DAC50CD15BCA6F172D115387C -763ED5D8795E27248FB49FAF969C56DC76AD73A7FD96FF00F78D247B651D37 -6460F4E953356921743C5BC0FAAF8B6F3E19D8DB691A246E523884721BA55F -35777248238E334FB3D5359B3F88F67A78F0EC56B0C5BB685BA0D8CC7935EC -9A4E9363A1E9F15869D07936D028458F71381F53492689A79D45753783FD29 -3389371E3231D3A74AB6FF0078A5EA296B4DC435393508AC247B0844F73B32 -A85C2F3F535E6F05DF8C57C6574EBA4C666368B94FB4AE3191DEBD5C617193 -927A5555D32D52FE4D4163C5CC9188D9F2795F4C74A13BB638E91B11DAA5CD -D69DB2FE210CB2A6D650DBB191CF22BCAFC47637DF0FF4BD5C47A835C41ACD -E3F969B0028D229509DCE38EA6BD89812854719E33589FF089690DA97F69CB -6DE65DE31E6176C019CF4CE3AD4C1EE84958C4F00D8CFE1BF879A6DBDF7EEA -EE2B4C48BC1C373C6454BF0FE273E1F5D5AF5160BDBE19B8F9B382ACC073D3 -A574BA9D9DBEA16E6DAEE2DF6EC413C91C8391D2AA6AFE18D1F5BD21B48D42 -D4CB64D8CC62465CE08239041EA053D983EC706BA15F787BE24E9F7F6FAA35 -D41ACB18EE6231A808238CEDE7EA7DABB5F1ABA8F09EB00B601B4938FC2AC6 -97E1AD2F47732595B796E40049766FE66AC6ADA458EB965358EA51F9D6D2A1 -478F715C83C1E4734E5A891E5DE00F0CDCDEF83A641AB98D5E7770362F751F -2F5AA7E2FBAB6B2D63C3B76E4CF6D652416124B83C4A1FD3FAF4AEEA3F859E -1182C5AC62D2D85B499CA8B993B8C7F7B35B2BE12D15344FEC45B3CD86CF2F -CA2ED9C6DDBF7B39E9EF48668C37B6D2DB8B85914C4C321B3D4516F3C5736E -B3C0C4447EE9C7BD7316FF000CBC2D630C714762C90478DA9E7C871E9CEEAE -B624485422F4EC29DC0968A6EEC0F9BE5A5E7A67E86900B453724704F346EE -7AD003A8A6B3ED233D3FBD4D0CC78EDFDEA00928A6EF1D7B7AFA526FE09E8A -07DEA007D140391450078EFC72B8D4AC16DAFB4D98A4B0046D800E40624F26 -B1BC19FB46D9DD3C76BE22B7FB23818332B34858E0F60BF4AEF3C7D6E2EF53 -B5B7917F772C4119BEAC462BE5BF8ABE0C97C25E29BB8E281A3B49256F21B3 -9C818F727BD007DA7A5EB365AC5AC5756571E6C526769C609C1C74FC2AE8C3 -37B8AF9BFF00674F0BEA4EEFAA4D76F1C116310950739DE3AE6BE9000E338E -7D2801CA73CE296917A74C52D0014514500145145001451450014514500145 -14500145145001451450014514500145145001451450014514500145145001 -45145001451450014514500145145001451450014514500145145001451450 -01451450014514500145145001451450014514500145145001451450014514 -50014514500145145001451450014514500145145001451450014514500145 -14500145145001451450014514500145145001451450014514500145145001 -45145001451450014514500145145001451450014514500145145001451450 -01451450014514500145145001451450014514500145145001451450014514 -50014514500145145001451450014514500145145001451450014514500145 -14500145145001451450014514500145145001451450014514500145145001 -4514500149FE34B49FE3401C17C50FF53A67FD7F43FF00A11AEF4F4AE0BE28 -7FA9D33FEBFA1FFD08D77A7A5002D263029693149819DAEEB16DA0E9377A8D -D7FA9B689A4719C64019AE4D7C7F7A9A6BEA4DE1FBD6B5F24DC44C193E74C6 -463EA2BA5F12E8EFAD69575671950F2C4C8BBFEEE48C73ED5E69AFFF006869 -11AC5772453DC69F6819E2B5CF96D020FBA14FF171F4AA8343B1E8FE16D5EE -35CD35750B9B396D04D868E39719DA4023A7D6B5DC647CC3764E428EB5C378 -5357D6E54B092EDACC5BDD4092DB5B44844A913631BC74C8EF8AEF777201EB -8A72D09B9CDEADAEEA116AF069F61A65C5CABEEF32E23DBB60C0C8DD9E79AE -73FE161DE7FC258BE194B29AEAE54E2E0C7B408014DCA587BD6DF8E7C5B6FE -14D35DD5565D4671FB8B58C032CDC804A8CF380726B27E1E7854785B4D9758 -D7665FED3BB19B995CFCAA031DB8C8C8E08159ABB4D97B6E2C3F136DEDBC5C -3C37AADACB652BAAB4334AC36C85B3F28039C802B6B58F105CD86A96D0C703 -BC136DFDF0C6D009AC0F197842DBC6C2F6DADA5487518E056B7981C1527804 -9009C63D2B97F0A788F50D47531E0ED6ACE68350D3E31189D936A4B129081C -1272493939C52D79AC267629E37BF9EDF51D456CA65B3D36E5E0954EDCB2A7 -26407B2E2BAFD1B56B7D6F4BB5D46D8FEEAE6259579CF0466BC97558F59F04 -786BC43A75DF933C5AADC4E2D5D5492DE629544C9C65B8ED5DF7C36B09EC7C -13A243751BC53A59441E37182A76F208AD6DA5C86DF43AA5A4C90E067834A0 -523608F9B8F7A96CA57EA34BAE42ED393D7DA825491FA1F7AF20F10C97D7FE -38D774BBE376B662DA2FB19B362ACCE40CF3DFF0AC0D63C2575A778674DB0B -9D435389AF357C6E69C8902B2FAD4CB4572D24F63DF4B2B820F553434980A0 -1033D18D78B693A61F0DF8BA6D160BFBEB8826F0E35C319E62EDBCBEDE0FE1 -506A13CE9E06977DECE862D5E08D5FCC21B191C134EAFBB62609CDE87B964A -F27F1F7A09DBDB22A8E8CC5F4F849C91B7AB7535CCFC4BD63FB3344C19C5BC -7311BA766DA130CBD4F6CF4A72D1EA4C5F36A8EC448840DA770EE7D2978C1D -CC0FAFD2B88B4F09D9596A6978BAC4FF00E9EA83CA92E33BB03F8063AF35E7 -5A7412E99E3D8F41BED5A73A3ADC0B8B5B9F3CE659D9BFD5163C10013F2E3B -52A7E63EA7BE861C7CDF2E300573FE31F165AF84F4F8AEAE636637170B6B18 -040F99B383FA579F7C5BB0B9D1A5B0D634ABE9D9D9920B98BCD25520F999A4 -C0E98C0E6AD6ADE0E93C5FE07D21B4BBDF3274B982F4BDC39656DA09C0C0EF -C5118B4EE5753A3B7F19CDA7EBD61A16AB6D207BD8DA48E6380AA141E08FC2 -BB2DEABD58002BC475ABDD53C47E3FD1AC64802F916B32DCC9121062700903 -3DBB573D7DE1C9FF00B23C49A926ADA899A17B7F2505C9C0CB007228F8A4ED -D35226D45A4FABFC4FA400E0AB1C9A5420F1D71DEBC82FEEEED7C71E0A65BA -931752CEB32873B182C5C71550C524B67E2B816FAEB6ADAC8C8E25395624F4 -3DAAB77CBE5709FEED734BD0F6967DA4A971B88E062955F2073B9870715E17 -7BE115D2F4AF0BDDC3AB6A5E76A1796D6F379D72482AEB93B78EB5BBE15B49 -7C37F1364D12DAEAEA7B3B9B192E9FED721761279817E5F45C516BCACBB0DA -E58F333D60F19DDC8CD35E408705802DF74529EE0835E61E2F9EE65F1AE9F6 -5782E96D67597CA92D8ED55C267E63F5E959ABDE31EA36ED1E667A88C22E31 -803B9AA9AA6A767A4DA497D7F32C16F00DCD239C002BC2F4BB3D6F43B4F0CE -917173750CDACCB70973F6C76DCA10965DBE9DAAD78ABC31AA691E17F120D4 -35A82E6CDAC87931ACAC6456DC325B3C63D2B5E5638C5C9D91EDD637D06A36 -B1DD5B482682550C8EBD082320D58270718C719CD729F0DACA2B0F08E94B1C -923892D6272646CF2517A7B56978AEFE4D33C3DA95DA101E3B791949E80852 -466A56A67CCAD734DE41B5844E031EE79AE0D7C7D7F3F8AEEBC33058CDF68B -72019B0BB4FCBBBA75AA5A46856DADF87B46D764D5E686E6748657FF0048C4 -458E09007BF6AC9169A84DF182EDEC648542E449E667AF9431D287A0D3B9E8 -BA36B3A95CEA379697DA64F6D1C1B365C49B764B9049C63D3A56FF000704F1 -9EC6B93F0E5BDDE95A9DD26B17B049717857C98D18FCDB41CE01F6C5754AE7 -19C63FDEED405C914E472314B483A52D03384F1A8C6BB60C1493B507FE3F5A -FE21F04E8DE289ED26D4AD7CC6B6CECF988C671E9D7A56478D47FC4F34FF00 -A27FE875DD63241A00F3DD6EDA3F077882DF5AB788A58CD917814F1C2854FA -727B577F137990AB86CEF1906A8EBBA545AB6972D9C8321F1F5E083FD2B13C -01A8CD75A51B3BA61F6CB666DE3D0163B7DFA0A00EAD7838272D4EA4029680 -0A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2 -800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28 -A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A -28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A280 -0A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2 -800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28 -A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A -28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A280 -0A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2 -800A28A2800A28A2800A28A2800A28A2800A28A2800A4FF1A5A4FF001A00E0 -BE27FF00A9D33FEBFA1FFD08D77C7A5703F13FFD4E99FF005FD0FF00E846BB -E3D2800A0D1480E46452601D6B9E9BC25A7DC417D0CEF348F78AEAD33905D5 -5BF854E3803B0AD7D4750B7D2EC67BCBB7D90C285DCFA015CA37C48D29227B -C78AF0DA4685F70B662481CE47A8C528EFE626CD1D23C2B0787A02D6F7135D -4B0C26387ED2FB8AA81C28E381C74A80EA9E2153F3DAC057B1547CD687877C -410F88AC8DFC3148B0BB01179919562A4020907EB5AF9C9C6381D689BD7DF1 -D8E0750F8776FE30D4ECB5BD62F75082F2D436C8A0902C6BB860E01048E82B -46E7C010DE4D04936BDABB45113981AE731C9C7F10C7357755F15C5A76A36F -A72433CB34E1B05616655C0CF2474AC77F893631EBF0E872452B5E4848DA90 -B304F9777CDE9C7AD6966AC97526F7DCD6D13C1F6DA16A336A11EA57F7124E -82329753065001E30315627F0C69B36B435AF2CA5E0411964006541CF3C671 -9ACAB1F1FE9973AFBE8374CD0DEAA2BA8910A86DDD304F535A1AA78963D335 -282CDE363E76D01D5090013EB592DAEBE45CBCFE64773E0DB6D43535BED42E -EE2E63460F1DACAE1A15607218291C30F5A9EFEF357B5629696F118D4E1728 -DD3F0ACA3E3FB59BED33C314AD636570D6F7123C2C195D7EF11EA31DEBABD3 -AFA0D4ACA1BCB5732433A07463DC1E95A5DEC4BD8C1FED5F10ED18B583FEF8 -7A69D57C44C0816B6C0FFB51BF35D49C8148C06771FE1A86523C1B58D38F88 -FC67A84FA93F8A34F91228CAB69BFBB8C9C01F2922BADD1BC1035FD26DA2D4 -B50D67CBB3BDF3E07BA97F7E580C00491F7706BD25E088B077442DD99BAD3C -E318A6D5D0276393FF00857960DAEC7ADBDF5E9B88EC85885F306D68C36EE7 -8EB9AC5BCF839A4DE9B849358D64433DE0BB308B85F2D5C1C8006DE95E8ACD -C8039F526909C7248DBDB269CB5DC98BE57A1CCB4BAC697FE89630A4B043F2 -AB4AAC588F7C5417FA34BE32B19F4AD76DA34B67DBF3448430C1CF1BB23A81 -5D7018DC739CF6A6EE60006E18FA52BDD6A3578BB44E5341F87D6BA1C53236 -B1AAEA0CE008E4BDB81235BE3BC671F2FA7E1556FBE17E8D7D636F6725DDF2 -C96D746EE3BA575F3779CF1BB1D066BB4273B76E083D693A0F5C734EEB5274 -4D35BF43996F0169F7172D3DDDEDFDDAB58FD88C37120742BFDFC11F7BDE9D -A3F81E1D074FB8B1B3D5350314D2174124DFEA148C6D4C0F940EC2BA7DDC64 -7A564EBFE25B0F0E59A5D5FB95496410C785C92ED9C0FD29395CA9377572BE -8FE11B0D184A51A5B9B8933BEEAE4869892319DD8AC53F0B34B7D3AFECBFB4 -75211DF94323195772ED3918F96AFD878DAD64D62DF47BE5786EEE959E0050 -85655193927E95D5EE0476A6B47CCB7B5BE44DAFA3EF7386D4FE1A69FA88D3 -41D4352824D319DA19E1942C997183CE299A7FC29D36C34DD42C5356D5261A -846D1CD2CD386914375DA76F5E6BBB2DCE334D3D3E523F3A5F0EA53F7F47B7 -EA71F79F0E74FBFB2D2ACA5D4F5409A54D14D03098659A3185CF14B378322B -2D6C788ED2EEEE6D422B7300499F28549DDD00CF5F7AEC78206474A4272D91 -8C62AA2EDEF0A4EEAC731FDABE221B4BDADB90C3A2A3F1F5AF36F11DACBE26 -F144F16B07C45606D4E20974DCC71302A09C139CF4ED5EE0BDFF005A8CC30C -C14BA2BE3A6F1C8A8D9DFB152D534799E91E043E22D245B5F5FEB0B0C23FD0 -EF2EE4C5F4449F98EE238CE31C76ADB8BE18D847A15EE9177AA6A7A8C77685 -1E6BB98492819CF048F6AED830E48E7D293383B7393D49354E5661195B538C -D2744BEF06D98B0D2E7B9BFB645CA1BE63232718DAB8000000181571E4D575 -489ACF52B481AD6E50C6E046D9DADC1EBC7426BA382F2DEE839B79D25D8C51 -B6303861D47153138C7AE3AD3DB5212E8707A57C2CB0D1B50F3A3D675996D8 -67CBB192E01B78876DA9B7031DBD29EDF0BEC46BF3EB916B5AC25D4C72C16E -004FBBB7D33D2BB7DF86DA4F24647A5725AFF8F6CFC3DACDA693751C9F68BC -0E6111C459582804E48FAD27A948B1A4782E0D33549B526D4EFB5095CA9885 -E4C245870083B38E33DEBA6207D6B9B87C521755B3D3E6B6911AE8B046589B -68C0C9C9ED5D282060F63D29F427A8E5E94B48BD29691470BE35FF0090E69F -F44FFD0EBBAAE17C6BFF0021CD3FE89FFA1D7754008DD33DC5705131D03C7B -709F761D57CA8E251C005579FE75DF5709E3D88C5AC683A88C8FB24CEE4F63 -C0EB401DD0A5A8EDDFCC8237FEFA06FCC54940051451400514514005145140 -05145140051451400514514005145140051451400514514005145140051451 -40051451400514514005145140051451400514514005145140051451400514 -51400514514005145140051451400514514005145140051451400514514005 -14514005145140051451400514514005145140051451400514514005145140 -05145140051451400514514005145140051451400514514005145140051451 -40051451400514514005145140051451400514514005145140051451400514 -51400514514005145140051451400514514005145140051451400514514005 -14514005145140051451400514514005145140051451400514514005145140 -05145140051451400514514005145140051451400514514005145140051451 -4005145140051451400527F8D2D2500705F13FFD4E99FF005FD0FF00E846BB -E3D2B80F89C730E9BDB17F08FD4D77E7A50004E0526076A3775E29A0EE0476 -F5A4061F8C348975AD0EF2CE241334D0B2794C400F91D335E7BABDE6A3A558 -4505F402CE3B3B358E6B58E40EBE42AE0B647B0E95EBB91D33CD72D79E0E4D -417526BDBAF32EEF2292DD26D98F2E36E8B807071EB424EE1A14BC25E21BFB -882C965D2A3B4B09215FB24AB3EE32C640DAC57195C8EC7A576D901B9E588E -2B96D1BC3336816F11B9BDFED06B3B6F2E14F2FCBC2A8E0707DA9FFF000955 -DEEC7F65E33DFCE1FE14E56F512B9278AFC4363E11D2AE358BA011C01B9172 -59C921474E7B8AE63E19F85AEE07B8F15EBE436ADA901E60908262084AAFCD -9E72B8A4D7BC07A878EB56B0D6A5D53EC115987D96BE48933B863EF647A66B -6351F08788B5230452F8A3FD1533E6C1F634FDE0EDCE723079A4AF6D46EDA5 -8E7FC77E097F11CF73A8695B575CB38964B49C60316E80649E3033CD66F85B -C66DE2AB88F42B9DF1EB7A72086E5181E7610A64DC40072D9E95DDF87BC35A -8E9DAA5CEA177AE7F6847344B108BECC23D9B4F5C83CD3E6F0558BF897FE12 -3B63E5DDF92B03F07E650DBB1D71D7DA8FB5E43679F4F7BA9F85BC27E2BB1D -5ECC137971726D5CC80EE464C29E3A1E0F15DDFC2E8E54F02E85E682A4D8C5 -F29EDF28A4D57C1975E23BE85F58BFF3B4DB795668AC7CA0B8914E55B7820F -00E315A177AD4BA548B690587991A0201F3318C741D2AEEAC49BE3A73499E4 -81D6B99FF84AAF194E74AC11FF004D87F852B78AAF00561A56477FDF0E3F4A -8B5F61A38CD77C45A9DEF8CB5FD113519EC20B2B58A4B79517765980CE076A -C2BF93C676FE18B143E2ABD8EEAE355317DA368DDE595E0633D2A1D6EEE7F1 -0F8EB51583C5874168E2898C1F60F3FF00840FBDFAD74D61E1BD67C65A5588 -BAF10F9B269B7FE725DFD9157CC0A301368231D739A52BEC8A8DBA94F47BBF -10E97E279B45BDF10DCEA292680D7AAF2285D9216DBD3FAD32F75DD6DBC1D2 -4ABAA4A2E61D4E187CDCF3B72323F1AEADFE1EDDCBE274D765D6777FC4B069 -EF0FD9C0DEBBB7139CF19AC2D47E0F6A97F6D73627C53E5E9F25F2DE25B7D8 -94ECDA410BBB764F4EB4EA3BB4A22A56BAE63D23489E4974F85E425E5DA371 -27AD62F8F35A9B4AD30476D31B79A6FBB30382B8233FCE9B16A97BA3462C85 -97DA443F289BCC0BBBDF1DAA87887491F1074BB8D2AEEDFEC2E76EC9F7EFDB -C83D063FBB4E76D9110BDBDED07D8685AF43A9BCEDAFCD3D9CEA9E5C6C0010 -903E6239E726B85D2F58F142F8D4F856EF5EB854B6945D9BB241F3919B88B1 -F43EBDABBCD0FC1DAE5846DFDAFE25FED49A303ECB27D9162F23DF00FCDC63 -AFA566EA3F0AE7BEB7B068F5AF2750B2BFFB6ADE7D9F3BBAE176EEC719EB42 -496E57C8CBF89FA8F88BC2773A7EAF63AC4ED6772D1D9C96C30A14B16265F5 -E8314CF16F86B5CF13F82F49B9B2B93A9DC0BD82F9C48CA9B514124649AEA6 -FF00C0977ACDD4A756D67ED76F269E6D4C1F67098909FF005B907DCF14EF0E -F84B56F0CE912E9906B5F6851262DFFD1D57C88F180BD4EEC7A9A6947740F7 -D4E0BC43ABCDAEFC40F0F5BC768209FEC7312EAD9F2880C715917579E338B4 -DF105F8F16DE87B1783CA8B68C0DCD83CE6BD7748F044563752DFDE5C7DB75 -19727ED5B36609183F2838AC193E16DFCBA4EA9A7B78879BF319127D947EEF -6367A6EE735305EF34F6B5D7A933BFBAE3DF5F4295E788B574F19F84A14BA9 -12DB5092559E00DF2FCB1E47D79AAADAA6B9259789963D627F32D6DA492DE4 -EF1B64E31F4ADBD57E1B5F5FC9A25DDAF883ECF77A5BC8DE7FD943799B863A -1381815169DF0C756B3D3F5682E3C51F68B8D4617884DF6355F2F39C1C03CE -334D7C577B5BFA6556F87DCEE737790F8C34ED33C397A7C637B39D4EEEDEDE -546403607192D9CF35B9E19BED6B49F888FE1CBED627D5A09ECE4BB124A36F -9643850A077FAD69EA1F0FB51D434CD12CE4F107CDA55D4371E67D947EF4C6 -318C678CD3A5F09DFE9FE275F140D47ED4D1DAB5BFD97CA0BBB2DBB3BB3ED8 -E94D35CDAEC392E687BBB9DC8C720707D6BC9B5E8FC4DA8FC408F4FB2F13DD -69F66DBB11C6A08FF579F5F5AED3FE129BC3C7F657CDDD7CE1C7E95E7F793D -EEA9F12ACE2B6D40E9B29F30797E50933FBBF535293F6893F3266ED4DC8C6D -53C59E26D1344D7B4D935AB99750D0D626175DE6F31C1FA0C038EF5DB6A5A8 -EA87C59A7411EAD3476F750C41A0038076E49FC6AD6A3F0BA3D47C2FA8696F -A87FC4C2FD544D7DE575DAF91F2671D062A1D3FE1BEB517882D756D4BC53F6 -F4B755020FB12C7C28C7506B49D9BD01AFDDB4B7287C1AB19E293C4572F7AF -2C7FDAF7518848E010C3E6CD7A83B7968CECE768ED8AE0F45F0A6A1E05BAD4 -2EA1D4FEDB67A85D4938B2F2426C773B89DF924F0315B43C4B74C423697856 -3B4FEF871FA54D4D5680DFBFA1CD69F79AD78CAF35E8AD357974E1A6DE1862 -58F0DBC7272738C5733E338F57B4F13F82A292437BA82417619D9C0DFD3BF4 -E95D42FC34D52DF54B8D53C3DE22FEC6875294CF7B6DF651379CC4F3F331E3 -8E38A9F57F8657B7DABE95A8DA7883EC6DA6A48889F650F9DF8CF24D2EC3DA -E6A59BEB93EB9BB54B55B7B318F27F7C1B3F2FCDC76E715D72856032323B57 -1CFE11D76E754B4B8BBF1379F65113E6DA7D8D57CD0471F30391CF35D7AAEC -40BD1476A3A7CC5D57A13018A2901FCA9739A0670BE35FF90E69FF0044FF00 -D0EBBAAE17C6BFF21CD3FE89FF00A1D7754001F5AE4FE24C5FF149EA17207C -F6F0B32FE62BAB61918F5AC0F1D279DE10D550F01A023F51401A7A3BF99A55 -93E724DBC79FFBE455DAC8F0BCBE6E8B6A718DA817F202B5E800A28A2800A2 -8A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800 -A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A28 -00A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A -2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A2 -8A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800 -A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A28 -00A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A -2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A2 -8A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800 -A28A2800A28A2800A28A2800A28A2800A43D0529E9498C8E680388F89F1AFF -0066E9AFDFFB4A01FA9AEDEB87F8A91B3E8FA6042011AA41D7EA6BB8EDCD00 -35C0DA73D2B9DB8F1B68515D496EDA84398403236E3FBBCF4CF15BF708CF04 -8AA7E62A40AF1AF0EC3A8786FC2BF62D474A97ED31BBB4F713C39F394B92A1 -49E780690CF4DD23C59A46BD7F7169A65F4376F046AEE233F74138ADA2411C -0DDDABCBBC1BE22B4D3C4F159E933C817324F7D0C4A62DA4FDDDDEABDEBD3A -DA75B9B78E7418591430CFA119AA24CED6B5EB2D09626BDB88E313308E3463 -82CC7A0AC8D4BC7BA1E8E88DAA4D0D9ABB054F31BEF678F4AD8D5A2D36DA29 -750BE5468EDD0CA5A5C155DBCF7E95E63A1587FC2CAF17CDAF4F0A9D12C0B4 -36A1970B386C3075C70C01079A828EFAFBC71A0E9D7F069F7B7B0DBBDCE4C5 -B9B1BF03271C55ED675FB1D0211757D22C503FDE776C05E98FE75CCF8FFC1F -A7F8B1ECEC258FCB976BF96F19D8C98C1EA39ED5C669DE3366D26FFC21E27D -91EB76C14069942ACD96DC3603C9C2E33C569624F50B9F1758DBBFD9F72497 -2143B401B0CAA7A374EF57B47D6ECB5C81AE2CAE5258D18C4EA9CEC71D413E -A335E7169F69D0FE24EA17DA8D8CD2585CE9D6F143304FDDEE192793C54FF0 -7AF16EE7D7DED9592D7FB52E3E47EBBB70C91ED45867A8055CEE2A4103D68D -A1B258039E9C52951BF7739C63DA90E770E7B54BD8626D51FC2A48EA3146C4 -DDF7073D462B8CF17F8A6F34AF10E8FA2D9BA452EA11CCE65914145D801E7F -3AE47FE12BF1CDA689E21BC9AF74F9FEC02236CF143C1DCD86EDCD4C58EC7A -BCBA659DC3AC92411BB83F782E0D588D0458458C28F618AF23B0F13F8E74DD -43C36BAFDEE9F716FACDD98192D61DAC0004F70315A67C5FAE1F146B1A22CD -015B7D28DDC2767DD6DFB464D5475909AD0F4CE1413D0679A4C6E5FEF2F518 -AE67C0BACDF6B5A4CB2EA0F1BCD0CE622C8B852001FE35BBA9DE269DA7DCDD -1CE238D9C63B900918A6D6A4A2C850F876400F706818C120020FA0C579D59E -A5E31D6749B4D734F96DD62BA01C42F112EA09C7200C563F897C65E32D07C4 -FF00D88D7166ADA963FB3A530FC91EC50D26FE39CE78C6695AEEC33D701C0D -A79F7A42DB0163C7F415C0F8EF58F15F873438359B39AD5EDECD1A5D413CAD -CF22F1809C70724D69781B57D4FC43609A95E4B09B6917E48D570E1B8EB445 -DD8376F2352CBC61A2EA3ABCBA359EA30CF7D146647890FCCA01DA78C7AD3A -4F156909AA8D23FB421FED0285CDBE7E6DA0E09FCEB84D2A18EDBE36DC08E3 -442FA23310140CFEFF00AD4FE218157E275832C6A0BE9C58B05E4FEF7D689F -BB5231EE5A4B95B3D2F209520E5314EE339C72DD79AF3AF186B3E2FB5F16E9 -9A5E87736515B5DC323B79D16EC119C738F6AC6835DF8877B71AE69C2FB4D5 -B9D2CC5994C07636EE78E3D0514D3949A334CF5ECE572DF28EE29AACAB903E -E9E95E53A5FC4FBED76CBC396F6BB63BED6A69E10F220D8A62E7903D855ABA -F17788344D5B50D2352684B7D995ED2758F11B48D9E327AE3D2849B93885F5 -3D2B712776D23B7E1EB4AC37631C8F4AF138BC67E3D82D6C353BDBAB17B597 -595B278E3830E63EA7B7A77ADFD47C6FAEEA72DE0F0FDAC92FD92270544418 -B48BD863F0A9BDF40F85B7D0F4D0A147FAB073DB1D2AB1D2AC85C8B9F2809C -F46EF5E5CBE3AF15698BA1DEEBEB1E9F633DB1FB625C43E5BACC5B0A327A71 -DABB9F0FDFEADA86B3ABFDA26825D36378FEC4D1AF3B4AFCD93DF9AD2D7770 -4AFBEC74BB80CFCD4D5600E00E3B1F5A380CDC827D2BCBBC43E35D6C6B7AE6 -95A64D6F6CDA758C77319B84CE598E3F1A9344B43D48AAE3EEE467273DAA36 -D89F33ED543C0C8EA6BCAAC7C6BE2B961B7D3A5F26E75570B3B1821F97CA23 -00E3AF5AC8F10EBFE30BED002EA1049A75D2EB8B04324B118D5E2EC47A8273 -CD0425A9EE08500F94F5A5C903279ACBF0FA5D47A3DA2DE48924A2250593B9 -C553F19F88E2F0A787E7D52604AC6C8BC63AB3003AFD6A1BDBD471F7A5636A -69FC989A42BD3AD735A7FC41D13552F1E9D7315DBC79F31637E50671CF1EB5 -99B7C669A969B2497169269D36F378AB11DD8DBF2E0E38E6B83F867773D8EA -1AC456FA54D7112A651A38431625CE79EF5A25EFB5E44CDF2D3BFF007AC7B3 -E83E22D3FC436EF3D84E932472189CA1CE186323F5AD51815CDF831A6974E9 -65B9B35B47370DF22C423E38E481DFDEBA3DC33C027DC54A29EE70FE34FF00 -90E69FF44FFD0EBBAAE13C6873AE587FC03FF43AEEE98843C7358BE3219F0B -EA63FE989FE62B69FEE9AC3F19384F0C6A65BA084FF31400BE1039D160FA56 -E562784D0C7A2C00F719ADBA0028A28A0028A28A0028A28A0028A28A0028A2 -8A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028 -A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A00 -28A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A -0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A2 -8A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028 -A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A00 -28A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A -0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A2 -8A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028 -A28A0028A33484E28038CF89DFF209D37FEC2707F335D99E95C67C4E3FF129 -D37FEC2707F335D99E94008DC8EFF85606A5A1DCEADAC59DC4F247F61B5248 -8949FDE6570778C60E0F4AE80AE46338FA526DE47603B0EF48679FF877C15A -AE86B2E9FE75ABD83DCC9331DCC5CABB64A9E3181E95D0B789AD6CBFD1BECB -73FBA3E5801072071C735BFB739E064D40FA7DABBEF6B78D9FD4AF35449E7B -E39B0D77C79610586852C5651A5C24938B96643220CEE53B739041E86ADDAE -89E33D1742834DD1A3D0613100877091571DF1B475AEE63B58A16DD1448848 -E4818A9195B008C67D3B54947043C3DE2D4D6745992F2C64B4B35944C5E490 -C926E1C76C1C1A9BC71F0E6CFC517965A9C6B15BDFD9B33798005F37200F9C -E0938038AEE360E3000C74F6A4D871B4E197B93D6AAE49CB78974BD6B55B71 -A7598B2485902BCD2EE0E38FE023BD2693A759780F4C4B68609257964DF332 -2824B90371EDE95D5ECC9C9FC3DA992DBC7300248D1F07F8852B8CC16F185B -007FD02F8FFBB10FF1A44F175B6322C6FBA672D18E3F5ADBFECFB6030204E4 -FA522E9D6AA08F25083EAB401E47F10753BBD775AD1D7439B4DB3BB092E0EA -CC50F6CEDDBCF4073F854D6D67E25F10F86B57F0F48743FB63AC6239EC37F9 -27E6DC771EBD07A75AF45BFF0008689A85C4375369D6ED3C0088E4318CA83D -706AED869163A6022CED628377DE28A06688E83B9C26ABE0BF115EBF84E749 -74F12E8F7AD3CF967DACA5481B78EBF5C553D7FC0BE296F13DF6B1A1CDA6A8 -BCD2C5930BB67186DC5891B47D2BD4F69C1FE5DA9367CC0939F6A1692B89EA -705E1286FBC13A5B596B518B8B89A4F399AD016404800FDEC7A1AD6BDD66D7 -5BB49F4D16D75199E368C314031918CFEB5D14B6B14C732C6B27FBC334D161 -6CAC19604561D085E452BB6C563CDBC37E12F1CE8889A1497BA7B68100DB1C -AB2CBF6C21795E71B7AF5F6A3C57F0F75CF155AEA33CB776D15FBF97F60911 -D87938237F382572076EB5E9E38393939FD29AA0606338F7ED4DEE36EC70B7 -5A078B356B6D26CB53934C7B35664D45622E7CC8F8C6DC8C13C77A4F04784F -C45E12BCB9B26BAB39F456DCF0067769D5D9B383C05DA07A577BD0E001B7B6 -294019E7AD3DB51F43CFEC7C25AF43F1124F134D2591B56B3369B016DF8F33 -774C63A7BD3F5BF0B7882F7C696DADD9CB62B6915BF925662DBFEFEEE3031D -2BBDC1390D8F6A00E8BD71EB52FDE6A4FA02764D238AD7BC3BE20BFF001869 -5ABD94960B67690C91C892970E4B67180063BD51D3BC25E26B4F107892FCCD -A79B6D54C5E52B33E576A9073C60735E89839278A6846049CE73D8F41551F7 -5DD091E3FA5FC2BD7B4CD1B43D97162356D1269E685833792FE69EE76E4E01 -F6AE8AE7C23AB6B975757FA835B0985B2A5BA296C095475208E9EE39AF4029 -C63348549208E31FAD0B4771347964DE02F133E8569629369A678755178C5D -9F6EC03A0E3AD20F0678CF40D585E7872E34A686E949BB4BC790E2463F3140 -A3A6318CD7A9B47BB1CE3073C77A5D9E95315AB1CB54A2799F8B2DF4BBAD03 -FB1F5ED4AD66D5A7915DADE29959948E328ADCE0645749E1BB21E0EF0A5ADA -CDF69BA68148790FCF23658E3278CF5ABF73E11D1AF7534D52EB4EB696F114 -AACAD182DCF5E6B59A012218E40194F634D37CA2D9A8AD8C23E2EB51C8B2BB -07BEE8C67F9D794EAF3EAFADF8BEF753D02EBC3D6D135B471C916AEECB21DB -EA17B67A57B7B69B6847FC7BC64FBAD654BE0AD064B86B8FECCB6591C00E56 -21961E8682D3B23CECE85E2AD752D75DD1A4D2ADF55B4758251975B691139F -9768C904FE95B1AD783BC4FE24D0E13A9DDD8C7AAC370B3C4B0C8E2DF2A320 -10413D4FE55E836BA7DBD942B05AC290C439DA83033563602304679C8CF6A0 -857B9C9E99ADDE693676D63AC40B25EA4403BDA2931640E719E7E9553C4715 -AFC40D1A6D04C37301999583BA851953B873CFA5760F636F2BEE9208D8FA95 -E69D1D9C10B6E8E1446EC40A4D15B3BA381F0FE89E3C411C5AE5DE96D1DBE4 -406CE494EF0739F33775ED8ACDF08783BC6DE19BABB944BA33898600DD21C7 -CD9F415EA863F94A838CFA76A361CF007BD35BDC4F55CAFBDCE5FC2DA6F88E -19E7BAF11CF65E6B12B1C560CFE5EDC82090DFC5D735D47DE5E3E5E7E94BB7 -9E40E9D7BD291D280385F198C6B7A78F64FF00D0EBBBAE13C69C6BBA7FD13F -F43AEE77019F6A007572FF001166D9E0AD5C03F3BDB90B8EFC8AE9C9039F4A -E2FE224C1E1B3D379CDE978C0EC7A1A00E93418BCAD1EC87736E84FF00DF22 -B46ABD82795656F1F748957F202AC500145145001451450014514500145145 -00145145001451450014514500145145001451450014514500145145001451 -45001451450014514500145145001451450014514500145145001451450014 -51450014514500145145001451450014514500145145001451450014514500 -14514500145145001451450014514500145145001451450014514500145145 -00145145001451450014514500145145001451450014514500145145001451 -45001451450014514500145145001451450014514500145145001451450014 -51450014514500145145001451450014514500145145001451450014514500 -14514500145145001451450014514500145145001451450014514500145145 -00145145001451450014514500145145001451450014514500145145001451 -45001451450021ED475CD29A4EF401C1FC4E73F66D313B7DBE13FA9AEF4F4A -E07E27FF00A9D33FEBFA1FE66BBE3D2800A28A2800A28A2800A28A2800A28A -40E0E39EBD280168A338A2800A290B01D4F7C5048032680168A32290306191 -400B487AD008346E07A76A00283E946691B91D692DC2E263246188C75A41F7 -8907834BF7860F5AC2B6BFD6DB54D4E19B48D9670F97F639BED0A7CFC8F9F8 -EAB83EBD686F507B1BAC42E001C1A45C64E47CDFD2B988F54F131D1A29E4D0 -31A83B3892DFED49F2007E53BBA1C8E6AE477DAEB6B02DDB49D9602047FB4F -9EA72E71B976F5E39E7DA98EDA1BB8CD28EB4D04E012307BD3A8B1285A290B -01D4D2E45030A29339A33CD002D1464019A4C83400B4500839F6A320500145 -191923D28A0028A28A0028A28A0028A28A0028A28A00E17C6F8FEDAD3C6486 -F93FF43AEE71CFD6B83F1C165D66CD91B0DE58DA3DF71C557BCF12EB56ACF0 -BBB46EA71FC27FA5007A19C0F987FF00AEB83D7436B3E37D2ED97E65D2E512 -4A3D9D463F953743F125DCB7D1FDB6E4B4233B89038E0FA0A97C0B9BCBDD47 -5DB83CDE6D419FF6091FE78A00EE540EDF4A7520607A118A5A0028A28A0028 -A28A0028A28A0028A3228A0028A28A0028A28A0028A28A0028A28A0028A28A -0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A2 -8A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028 -A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A00 -28A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A -0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A2 -8A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028 -A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A00 -28A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A -0028A28A0028A28A0028A28A0028A28A00293FC69693FC680382F89FFEA74C -FF00AFE87FF4235DF1E95C0FC4FF00F53A67FD7F43FF00A11AEF8F4A0028A2 -8A0028A28A0028A28A0029B8F9B27A0E94EA6EEE7A8C5002050A33D4D46654 -6728461F1F773D6B33C55ADFFC23DA05FEADB771B68B785F5E4571171AAEA1 -A2F81AF7C496E24B8BEBB8649E2EACB1064DEB91E80D007A621C0C3364F618 -E9ED4A000738FC2BCA57E2EDDE93E1FD1E7BCF0D6A17F7B796F09260000777 -5EA063D6B7AD7E23C926A7A769B79A15E59CF7F6AD70166C031E3F848C75A0 -0EE1F91F39C2F7143FDD393C0EA3D6B866F8951FDA35B80E9174F71A33C692 -2023F79BC64607B0ACBD1FE32A6A97BA4413F87AFACA3D4DA4549A72028D99 -CF6E7A501B9E9A4E07BF73E94A49E81B07AE715C5EA9F100D97DBA4B1D22EB -5382CE3126FB6C3097D403EA0D4F77E3436D0C4EBA5DCB196212320EA808EF -F4A1EC0B53ADCE481D78CE690E17E73D7A0AF32F147C4A9E1F0FDA5F68F6CF -248FA8AD9C8A30E54952483EFD2B464F891058DBDB41716AEF786CFED12441 -8061807231F8528EA0D1DDE495F9873E9507DAE213FD9FCE1E69E8B8FC6B90 -B0F89BA7EA3E1DB7D62DADDE49665522C55C197938FD3AD73DA7DF4F79F159 -CCB6F756A171812B1D8F98BB0F6A5F6D21CF48367AB3E5D48C671D47AD2A15 -3D383D2B8BF8A1E25D47C33E16BBBBD362325DAC4C5240BB96323182C3F1A7 -5BF8E8C5A6E99E769F34D7D74B187823C061B941DF8F427F9D6811D51D983F -DDF9B9C1A466081A46180A0F3ED5CB7867C6D0EBB7D75A7CF652E9F7D03311 -6D3901DE2040F300FEEE4E335CE7C68F10DE68DA4E9AB690CE44D7F0AB3C67 -A82482B53ADC123BFB7D62C2F09586E049FDE2011CD5C1D49DDF418E95E5D7 -773A5E87796CD368FAA2CB7BFBC66F3C85439C6318ABBA7F8DF56BAF8857FA -1B58C8D6168CA11D53A663DDC9EFCD1B833D230A0E4753412472066B9AF1B7 -8B93C17A14DAB49672DE4708CB088818E40FEB5CBE9DF17DAE353B0B7BEF0C -EA3A6C3A8324705C5C90118B7A71CF5A3CC9D4F4CC12413DB9CD19CF057183 -EB5C4DC7C4216E7CC7D3A75B7FB69B5DE48C139FBD9F4AB5ABF8EADF4FBB86 -CEDADA4BDBB96CFED8B0C2C0B18F38E9FD6819D612319CD31DD2DD3246157B -D79EDAFC5CB69ECAEE7BDD1AEAC4DB4EB0F9733005891D47157F40F1DD8F8A -F52D4B41781EDE7B5655DCCE079995DD91F4C5007682407E63D3B1F5A7F19E -7AD70DE09D7251AF6B3E13B97133E8EB1379DFDEF3016FAD77009E32339EF4 -00FA28A2800A28A2800A28A2800A28A280383F1C1035AD3F8E7E4E7FE075D7 -5F69B6FA9218EE23CE3A10715C978DFF00E437A793F7709C77FBF5D6EA7A8D -BE956525D5C4A91220C65CE393C01F9D0079EF8A34A364C346B59809F54FF5 -636FDDD9863FA576969E1CB082CE384C4CB85E4EF3D7BD61783AC2E356BE9F -C47A9C4EB2CB8F222718F2F00A9E3DF02BB81CF5E9E94019234828736D3EC0 -38C119A7797A9C1F7641281D82815A786CF518FA507AF4340198353BA8B89A -CD80FEF6F14E5D72D33892511B7A104D689404FCC011E98A8DED20907CD12F -FDF2280121BB867C796E1CF6E2A6271D4E2B3E4D1ADDFBC8A3FD8722A2FECC -BB83FE3D6E401FF4D32D401A98079A5E4F43592D2EA9072E04C179C2478CD3 -9357973FBDB39631FED0C5006AF3EB45534D52CDB01A7446F42C2ACA4D1C9F -71D5BE86801F45145001451450014514500145145001451450014514500145 -14500145145001451450014514500145145001451450014514500145145001 -45145001451450014514500145145001451450014514500145145001451450 -01451450014514500145145001451450014514500145145001451450014514 -50014514500145145001451450014514500145145001451450014514500145 -14500145145001451450014514500145145001451450014514500145145001 -45145001451450014514500145145001451450014514500145145001451450 -01451450014514500145145001451450014514500145145001451450014514 -50014514500145145001451450014514500145145001451450014514500145 -145001451450014514500149FE34B49FE3401C17C4FF00F53A67FD7F43FF00 -A11AEF8F4AE03E28B05834C2C4002FA1E4FD4D76C751B2209177071FF4D050 -059A2ABFF6859FFCFD43FF007F051FDA167FF3F50FFDFC1401628AAFFDA167 -FF003F50FF00DFC147F6859FFCFD43FF007F050058A2ABFF006859FF00CFD4 -3FF7F051FDA167FF003F50FF00DFC140162A31D48C7151FF006859FF00CFD4 -3FF7F0531AFED0F4BA87FEFE0A5D509EC60FC41D327D6BC1BAB585B83E74D0 -155033D723D2B999E29351F8593D8D82BDC4D6962D6B24710DCE6458B05401 -DF3DABD0DAFACDC01F69871DC17159D6969A5E9F7724D6B751431CA4B3C31B -AAA331392C40EE7D6AA3A5CB93BA48F28B79AFAE60F0AC4FE1ED6A31651DAC -326FB5230CBD58FB7BD745E3F17D65E26D1F5D8B4CBDBFB582068A48ACE132 -4A0B30C1C7A0EFCD7A37DB6C8647DAE239E79907149F6DB307FE3EA13FF031 -512D9214746DF91E31A6CBAA5C6A5E33D49B40D56386FE7B66B7592D5848C1 -5307EBCFA536E2CAFF006783245D0F52FF00446BA332FD98FEEF71E370ED9A -F6A17D683FE5EA01EC2418A68BEB30403751107D5C554B5560A6ED73C9741D -5B5AF076A373A25F787752D42DE551E4DC5B5A3491E58EE3BD8E3819C55CF1 -5DDEB71EBB691CFA45E4FA6CF1200DA6DBB174724E439E8140AF4F37B69C9F -B5C5CF6F3071F4A77DBECF6FFC7D43FF007D8A6BE1B136B3B9E07169BAC8F0 -F5DC5168BA9E61F10B5EAA35BB6F7882F6F526B51753BED2F5CB4D52E7C27A -9DF595C5A1F3235B1324F1B37F09CF007A8AF65FB6DA138FB540AA47690673 -4BF6DB151FF1F309ED9DE326A29AE5772AA4AE8F25D6ACB5164D3FC49A6E85 -25B5B5A82134E82D4A4A55C81F34638247D78AB3A6EAF75ACFC42B7BA1E1DD -66CE04CEE9AEAD4A27FABC75FC2BD445EDA0047DAA1C76FDE0A417D6981BAE -A0CFB38AADAA2919BD69389CA7C58B1BABFF0004EA90D9DB4D732BDBB0115B -A1676E47000EF5C8C56FA8DBEA7A3788A1D3352D9E5C16B3DACB0B178C228C -B6DEDD3AD7AD2DF5A6D2AD770FD448293ED967823ED509FAC82A6FEF17F65A -387D1F4EBAD57E23C9E261653D958A6966CF64F19491E4F337671D0AE0FAD5 -4F8D10DEDF691A55B58E99797AF1EA904EDF6684BED452739C74AF4417B681 -71F6B87FEFE0A3EDD66467ED710F501C568DEA98A2CF3BF1EC9757DFD9CF06 -93A8CC85413E4C04B27CDDF1D2AB589D4749F8957F7171A55F4B6BA8329866 -8202638F6C7CEF3D0649E2BD37EDD69838BA847A7EF0521BEB30B9FB54471F -ED8ACA9E916BCD8DBB37E8711F1A54B7C36D6B181FBB4C67B7EF16B9D75BBF -185B78520B2D2AFAD934D9629669AEE02AACBB547C8467D2BB8F1AE8D67E2F -D06E7466D45618AE4012324A0118208C7E55A5A2ADAE93A6DBD99BE8E430A0 -8D4B480F000033F9553FE135E6546564BD0F1BD41F5BBA8751B4BAD0B58696 -D6F2592236F6CDE5491AE4291EAC6A5D7753369ABE857B1687AEDC5E8D1920 -923B4B7DD22293F3061D4106BDC05FDA0FF979B704F53BC571FAAF84ADAF35 -D1AD5B788EE6DA531989A28EE42A60B649FAD286849C16A25B53D11AF749D0 -F541710CE9F68B3BFB7CCCE7A921075C0F5AEEFC2FA9AEBDA87F6859F8624D -1513FD7BEA162219A43B480548EB8C7EB5B9A269DA7E92929FED43732CAC19 -A59E552DD3D6AF5FCB657B6B241F6F10671F3C5200C39ED56C0E2BC196725C -F8F7C4FAEA98E4B3BD4B7114B0F21F6A953CF43CD7A37F1727AF61DAB2F4D1 -A56956C20B57B68615FBAA854139393903EB5705FDA1C83750E7D7CC1480B7 -45571A859FFCFDC3FF007F051FDA167FF3F50FFDFC1401628AAFFDA167FF00 -3F50FF00DFC147F6859FFCFD43FF007F050058A2ABFF006859FF00CFD43FF7 -F051FDA167FF003F50FF00DFC1401628AAFF00DA167FF3F50FFDFC147F6859 -FF00CFD43FF7F050070DF106EA2B1D52CEE676C471AA93EFF31A86D9351F1E -EA667BA89EDF4489B31232943283C827A86C1029BF1012CF54D5B4F80CE922 -E63255181CE1FD3D2BD0A3B78EDE258608D2345185441851F85003E18E3890 -246A1547F0818C5494D5EA4FAD3A800A28A2800A28A2800A28A2800A6B46AE -30CA0FD453A93F3A00ACFA7DABE730A83EBB47155DF4688F2B34E87FD87C56 -95275F51401926CB5083FE3DE7461FF4D989A3ED9A8C1FEBA0F307FD32426B -5883EC7EB498F76A00CE5D663E92DBCF11FF006971565351B57C6274CFA161 -533C31C83E68D5BFDE19AACDA5DABE488950FAAA814016964471F2383F434E -EDFE3598FA43E7F77732A0FF0065B14D16DAA41FEAE44940E9E639E6803501 -24F55A5ACAFB7DEDB9FF0048B5047FD31526A48F5889BEF433463D644C5006 -9515025F5ABF49E3CFA6F152A3AB8CAB023D8D003A8A28A0028A28A0028A28 -A0028A28CD0014514500145145001451450014514500145145001451450014 -51450014514500145145001451450014514500145145001451450014514500 -14514500145145001451450014514500145145001451450014514500145145 -00145145001451450014514500145145001451450014514500145145001451 -45001451450014514500145145001451450014514500145145001451450014 -51450014514500145145001451450014514500145145001451450014514500 -14514500145145001451450014514500145145001451450014514500145145 -00145145001451450014514500145145001451450014514500145145001451 -450014514500149FE34B49FE3401E77F172DBED765A743E6B45BAF61F99473 -D4D699F00651C7F6B5CA6E39E156A9FC5004C3A663FE7FA1FF00D08D77870D -401C7FFC2BFE147F6D5D71FEC2D1FF000AF87FD06AEFFEF85AEC39070071EB -4EE7D68038DFF857C3FE83577FF7C2D1FF000AF87FD06AEFFEF85AECB9F5A3 -9F5A00E37FE15F0FFA0D5DFF00DF0B47FC2BE1FF0041ABBFFBE16BB2E7D68E -7D68038DFF00857C3FE83577FF007C2D27FC201FF51ABAFF00BE16BB3E7D69 -8D4A5B07538F3F0FFF00EA3577FF007C2D1FF0807FD46AEFFEF85AEC5BA520 -A5276B093D4E3FFE100FFA8D5DFF00DF0B47FC201FF51ABBFF00BE16BAFEF4 -556EC49DCE43FE15FF00FD46AEFF00EF85A3FE100FFA8D5D7FDF0B5D7F7A5E -F4C6F4671FFF000807FD46AEFF00EF85A5FF00857FFF0051ABBFFBE16BAF22 -9452BD86F5671FFF000AFBFEA3577FF7C2D1FF000AFF00FEA3577FF7C2D763 -F8D073EB45EC1B9C77FC2BE1FF0041ABBFFBE1693FE15FFF00D46AEFFEF85A -EC864F7A4345EE1E471DFF000807FD46AEFF00EF85A4FF008403FEA3575FF7 -C2D7634DA39457D8E447803FEA3577FF007C2D1FF0AFFF00EA3577FF007C2D -761DA9474A2E1638FF00F857FF00F51ABBFF00BE1693FE15FF00FD46AEFF00 -EF85AECB9A39C5087B9C77FC2BFF00FA8D5DFF00DF0B47FC2BFF00FA8D5DFF -00DF0B5D8F38A39F5A3C82C71BFF000AFF00FEA3577FF7C2D1FF000AFF00FE -A3575FF7C2D7658F7A4C7BD4EA338EFF00857FFF0051ABBFFBE168FF00857F -FF0051ABBFFBE16BB2C7BD18F7A6AE071DFF000AF87FD06AEFFEF85A3FE15F -0FFA0D5DFF00DF0B5D973EB473EB4C471BFF000AF87FD06AEFFEF85A3FE15F -0FFA0D5DFF00DF0B5D973EB473EB401C6FFC2BE1FF0041ABBFFBE168FF0085 -7C3FE83577FF007C2D765CFAD1CFAD0071BFF0AF87FD06AEFF00EF85A3FE15 -F0FF00A0D5DFFDF0B5D973EB473EB401C6FF00C2BE1FF41ABBFF00BE168FF8 -57C3FE83577FF7C2D765CFAD1CFAD00793EB5E173A4F88AC1C5FCB7030BCB8 -03F8BA57AB0EA6B85F1B8075BD3FB9C27FE875DD72001D280153EE8E314B4D -418C8CE69D4005145140051451400514514005145140051451400514514005 -1451400514514005452DB43367CD40E0F6352D21FAE28033DB46B26398E211 -37AA8A8CE973C67315FCCA3FB800C569E323D685047F0E3F1A00CBDDA9C1C6 -1651EACD41D5678BFD7C0A3FDDC9AD4DA7FBD9F6C5007AAE3F1A00A10EB56D -29DA77A9F75AB82443C8947E74D96D219862440C2AA1D0ECD4E614F298F520 -939FD680340107BE697359674FBE8BFD4DFB63FBBB0534CBAAC1CFD9BCFF00 -525C0A00D6C77C9A4DCB9F7ACBFEDB11717317927D896FE42A78755B69B1B2 -5DC7D0A914017B8A5A62C8AEB90453874A005A28A2800A28A2800A28A2800A -28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A280 -0A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2 -800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28 -A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A -28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A280 -0A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2 -800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28 -A2800A28A2800A28A2800A28A28003CD1D3141E8693B0A00E07E282B2DA69A -E0E3FE2610FF00335DE6E1C377EC2B9EF1C68C759D21421F9ED655B95F7280 -9C54BE11D7935FD252E38FB52002E107F037A7E5401BC060939EB4B4D18CE4 -7F153A800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2 -800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28 -A2800A28A2800A28A2800A28A2800A28A28010E3F2E6901EE695875F5C5358 -80996E368C9A00E1FC683FE277618E984E3FE075DC00075E83A57011BB789B -C78B7317363611BDBCA47FCF40723F9D77E3BEEE83A5003877F5EF4B48A3B9 -EA7AD2D0014514500145145001451450014514500145145001451450014514 -500145145001451450014514500145145001451450014514868010853C102A -BCF6304C3E78F70F407156A9A4291CF4A00CC7D0ADB3BA35319FA93FD69BF6 -1D461E63BF1B07F0F962B5BEEF404D19E338A00CA173A9C1F7AD5A71EA1956 -9C35954FF8F880C38EB96CE3F2AD238F4A4D8A7F841FA8A00AB0EAB693E3CA -9037E756BCC538C38AAF71A75BDC7FAC047FBA71553FB0E3439864653DB731 -3401ABB87AD2D657D9754887EEEEA1C7A18F349F6DD421E26B579FDE300500 -6A0CE3AEEA51F4C5672EB318FF005F1B41FEF9A9E3D4ACA4FF00573AB1F6A0 -0B239C8A0671F7BA7B50AC1C67B5626BBE20FEC89238D62690BE3A63BE6803 -7474A2A1B39CDCDAC33152A6440D83DAA6A0028A28A0028A28A0028A28A002 -93AF6A46655EA40A61B8857AC8050048063B52D573796C3ACAA29A750B31D6 -75A00B468AA6753B25FF009794149FDAD65FF3F51D005DA4C8AA5FDAF63FF3 -F71D28D5AC8FFCBD474017322979F4AA7FDA967FF3F294A351B43D265A00B5 -CFA52E2AB8BDB63D25534E1731374614013514D1229E869D40051451400514 -51400514514005145140051451400514514005145140051451400514514005 -14514005145140051451400514514005145140051451400514514005145140 -05145140051451400514514005145140051451400514514005145140051451 -40051451400514514005145140051451400514514005145140051451400514 -51400514514005145140051451400514514005145140051451400514514005 -1451400514514005145140051451400514514008FF0074E7A5379E391B31F8 -D39803D7A57987C62F17F893C25A47DA74982DDE363B4B1572CBC31EC47A0A -00F48B99E08232D712C71C64609908031F8D79B5C359DA6BB25DF83F58B4BA -9A462D716514E241BB1D0227B57CCD75F103C65E29BE5B7FED4BEDF2B81E4C -5349B464E3A64FAD7D3DF087E1EC5E13D1D6F6EE369355BCC4B2C92E0B46D8 -2080480471401B761F106DE42C9A869F75A7B2753728231FA9FF0039ABDFF0 -9D687FF3F917FDFD5FF1AD49B49D3EF403736514FEA668C313F5CD43FF0008 -C685FF00406B2FFC075FF0A00A3FF09D685FF3FB0FFDFD5FF1A5FF0084EB41 -FF009FF83FEFF2FF008D5CFF00845B41FF00A03D8FFE03AFF8527FC22BA0FF -00D01AC3FF0001D7FC2802A7FC275A0FFCFF00C1FF007F97FC68FF0084EB41 -FF009FF83FEFF2FF008D5BFF00845741FF00A03587FE03AFF851FF0008AE83 -FF00406B0FFC075FF0A00A9FF09D683FF3FF0007FDFE5FF1A3FE13AD07FE7F -E0FF00BFCBFE356FFE115D07FE80D61FF80EBFE147FC22BA0FFD01AC3FF01D -7FC2802A7FC275A0FF00CFFC1FF7F97FC693FE13AD0D8E12FA0CF7FDEAFF00 -8D5CFF00845741FF00A03587FE03AFF851FF0008BE84A0EDD1AC01FF00AF75 -FF000A00A5FF0009C68841DBA85BF1D7332FF8D31FC79A0471B4DFDA56FE5A -0F9BF7E9C7EB4ED574CF0A68B6525DDEE9BA7431A292C4C2833C67BFD2BE63 -F897F10AC35CBF1A4787F4FB4B6B669B6192084216F9B0395383C5007D3169 -F10BC3D790A4B16A1018DBA379C9CFEB530F1D6858FF008FE83F1997FC6B9F -F869E0ED26D3C13A54777A65A4D2846DEF2C4ACC7E76EE45759FF08B6827FE -60D61FF80EBFE140153FE13AD07FE7FE0FFBFCBFE347FC275A0FFCFF00C1FF -007F97FC6ADFFC22BA0FFD01AC3FF01D7FC28FF845741FFA03587FE03AFF00 -850054FF0084EB41FF009FF83FEFF2FF008D1FF09D683FF3FF0007FDFE5FF1 -AB7FF08AE83FF406B0FF00C075FF000A3FE115D07FE80D61FF0080EBFE1401 -53FE13AD07FE7FE0FF00BFCBFE347FC275A0FF00CFFC1FF7F97FC6ADFF00C2 -2BA0FF00D01AC3FF0001D7FC28FF00845741FF00A03587FE03AFF850054FF8 -4EB41FF9FF0083FEFF002FF8D1FF0009D683FF003FF07FDFE5FF001AB7FF00 -08AE83FF00406B0FFC075FF0A3FE115D07FE80D61FF80EBFE140153FE13AD0 -7FE7FE0FFBFCBFE3487C75A174FB7C1CFF00D365FF001AB9FF0008AE83FF00 -406B0FFC075FF0A0F85742EDA2D87FE03AFF008500548FC65A3CB26D4BD889 -50727CD5C7F3A6AF8EB426248BF806DEA0CCBFE354BC4DA1E9563A73CD6DA7 -DAC526472B128EFF004A8FC31A7E81A95A847D22C3CE51F36E8172DD7F3A00 -D3FF0084EB41FF009FF83FEFF2FF008D1FF09D683FF3FF0007FDFE5FF1AB7F -F08AE83FF406B0FF00C075FF000A3FE115D07FE80D61FF0080EBFE140153FE -13AD07FE7FE0FF00BFCBFE347FC275A0FF00CFFC1FF7F97FC6ADFF00C22BA0 -FF00D01AC3FF0001D7FC28FF00845741FF00A03587FE03AFF850054FF84EB4 -1FF9FF0083FEFF002FF8D1FF0009D683FF003FF07FDFE5FF001AB7FF0008AE -83FF00406B0FFC075FF0A3FE115D07FE80D61FF80EBFE140153FE13AD07FE7 -FE0FFBFCBFE347FC275A0FFCFF00C1FF007F97FC6ADFFC22BA0FFD01AC3FF0 -1D7FC28FF845741FFA03587FE03AFF00850054FF0084EB41FF009FF83FEFF2 -FF008D1FF09D683FF3FF0007FDFE5FF1AB7FF08AE83FF406B0FF00C075FF00 -0A3FE115D07FE80D61FF0080EBFE140153FE13AD07FE7FE0FF00BFCBFE347F -C275A0FF00CFFC1FF7F97FC6ADFF00C22BA0FF00D01AC3FF0001D7FC28FF00 -845741FF00A03587FE03AFF850053FF84EB42FF9FD87FEFEAFF8D1FF0009D6 -87FF003FB0FF00DFD5FF001ABBFF0008AE83FF00407B1FC2DD7FC28FF845B4 -1FFA03D97FDF85FF000A00CBBAF1F6951C79B70D78E78096ECACDF966B0AEE -FBC51E32912D74E85B48B10C3CF6BC8DE395E3E8DB08EF83C7B8AED61F0FE8 -F6CC1E1D32D226EC561507F955DDA10855503B74E83D28029689A259E8766B -6D6CA5B18DF23E0BBB631963DCFBD6975A45EFC52D00145145001451450014 -51450014514500145145001451450014514500145145001451450014514500 -14514500145145001451450014873DB14B41A006E31CF27DA8C8F4C7D694E7 -A8C7BE6A95D6ADA6DA1C5D5F5BC247679557F99A00BA4E3B81F5A42D820609 -CF715CE5DF8E746B7CF96EF798ED6A0499FC8D65BFC407BA6DB63A2EAA1FB1 -9AD182FE383401DC727FFAF49D0F7AE14EABE3DBF3FE8365A6C487FE7E5645 -342E8FE35BC23ED9796D083D7ECB3B8C7D33401DD9200C9E07BD559753B1B7 -CF9B790478FEF48057243C017573CDDF8975A8CFA417840FD455983E1E58C5 -FEB751D46EBD4DC4A1B3FA5006BCDE2BD021FF0059AD58467FDBB851FD6AAC -9E38D05788B51B6B9F786656FEB491781B405E65D36DAE7FEBB44ADFD2ADC7 -E15F0FC431168B651FFB96EA3FA50062CDE38D2DBA69B35CFB222B7F5ACDB8 -F1A5B37FAAF0A6BADEF05B0AEDA3D1F4E8BEE58DB29FF6631569218E3FB91A -A7FBA31401E6C3C4DA94A47D9B42D762CF413C2702AA5E6A5A86A37711781D -658F0BB24439C83E95EAC783EC057347C304EB46F848C549DFB4B700EECF4C -50066477BE35F2D52DE2B244030BE640F903DE9E17E22CDF76E34441FED452 -0AED474C118FA50063F889FC680389FECEF88127FADD474704F5D8B20A5FF8 -47BC5B27FAED52D87FD73690576C39ED4B401C47FC225AEC9CC9AC383FECCC -E290F823517FF59AE5D8FF0076E5C576FF0099A08F61401C40F87D33F2FAFE -A9FF0000BC6FF0A5FF00856D137FACF10EB83FDDBF61FD2BB6031FFD6A0FE1 -F8D007143E1959FF00D0C1AFB7D6FC9FE94E1F0D2C47FCC6B5C3F5BD3FE15D -981F41F4A31EF401C6AFC37B007FE42DAC9FF7AECFF853C7C39B01FF00314D -54FD6EBFFAD5D7F3473ED401C8FF00C2BAD3BBEA3A9FFE04FF00F5A947C3BD -347FCC4352FF00C08FFEB575BCFB51CFB500727FF0AF74D231F6FD47FF0002 -3FFAD49FF0AEB4DFFA086A5FF811FF00D6AEB71F4A39F6A00E4BFE15D69DFF -00411D4FFF00027FFAD487E1D69DFF00414D547D2EBFFAD5D7D263D850071E -7E1CD81FF98BEAE3E977FF00D6A61F86D647FE635AE0FA5E9FF0AED303D051 -401C49F867667FE63DAF8FA5F1FF000A4FF85696EBF77C45AF1FADFB7F8576 -DF8D18F61401C57FC2BC75FBBAF6AC7FDEBC6FF0A4FF008416F93FD5EB77C7 -FDFBA63FD2BB63F8D203F5A00E2BFE112D763FF57AC311FEDCCE68FF008477 -C529FEAF548491FDE7722BB63F87E3463DCD00713FD97E3B8BFD4EA3A591FF -004D04868F23E2447D2F341651FF004CA526BB6FCCD19F63401C47DB7C750F -FAD5D3A4FF00AE70C9487C43E2A87FD6E9C25FFAE56EFF00E35DC11EC3F1A4 -E47F76803863E3AD5ADFFD7F86F539BFEB8DA9FF001A55F89527493C27AF27 -BB5B63FAD773FE78A6B46B27DE407EA2803938BE21D9BFFADD36FADFFEBB20 -5FEB56E2F1D688F9F36F6183D3CD95467F5AD9974AB09BFD6D95BBFF00BD18 -35564F0BE852FF00ACD1AC5FEB6EA7FA500323F17787A5FB9AD5813E9F684F -F1AB716B1A7CC7F777D6D27FBB20359B2F823C3F27DDD2ED613EB1C280FF00 -2AA5278034E7C88AEAF6DFDE170BFD2803AA5915D77290C3FD9E68383C9245 -714FF0EDE33BEDFC4DAE861D11AF30BFCAA36D03C5D65C58DFC772074FB5CE -EDFCA803B9DDCE307EB41C1E33F9570BF6BF887667F7D6DA44918EA53CC66A -78F1D5DD9FCBA868BA831EE6D2D19BFAD0076F93F41EF4B907A1AE62D7C7BA -55D0FDE477167EBF6B411FF335AD6DAF6937607D9F50B690FF007525527F43 -401A3EF9A5A6821D4329E297B0C5002D145140051451400514514005145140 -05145140051451400514514005145140051451400514514005145140051451 -40051451400514514005145140051451400514514005145140051451400514 -51400514514005145140051451400514514005145140051451400514514005 -1451400514514005145140051451400514514005252D14008C714D62411CD4 -775730DAC4679880A9DEB869BC47AB78B276B6F0C1305903B5EFF80C9EA763 -0E70411401B3AE78D2CF4C1E45B06BBBB76D891C6A586EED9C741EF58F6DE1 -5D4BC49E75C788E5DB0CF1948EC83F991A83C87C1E8DC915B7A0784ECB456F -B46C1717AE3E7B96C82C739E99C75AE83680DB82FCFB7FC8A00F28F07FC0FD -3FC39E28BCD625D97113B3F9313A2ED5048208F42315EB40607348A73D7838 -E452E680168A28A0028A28A0028A28A0028A28A0029BB7A83D29D4C390DC9F -948C62803CE3E30F842EFC51E1F9CC1A94B6890217288E00936AB71CFAE6BE -64D13C05ACDBEBDA6AB584CF04B3249E679648DA187B57D55E2ABB9B5CD66D -BC376276852B733BFAA062ACBCD75F6FA75B5B4105BA4636C28150FA014005 -85AC76F6115B20DAA8BC0C62ADAE71C8C1A42B950A4F3EB4E1C8A0028A28A0 -028A28A0028A28A0028A28A002834521A00E73C663FE256C39EDC0FAD71DA0 -3DF417E5ADE362233C8E46720D7A6DE59C37B17973AEE5ACA86D62B0D59560 -40A93E7F41401B31B175566F94FA5381258822838273DC53BAF5A0028A28A0 -028A28A0028A28A0028A28A0028A28A0028A28A000807A8A28A2800A28A280 -0A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2 -800A28A2800A28A2800A28A2800A28A2800A6B1C0F6A75364C63919A008DE6 -112192475489792EED803EB5CADFF8FED84A6D74AB79AF2EB38198DBCBFF00 -BE87BD65FC4BD59D350D07C3AF33456FADCCF04CC173C000FF009E4575DA2E -89A6E916891D8C2A8AAB82C32727B9E6803977D3BC5FE21FF8FB9BFB1A16E8 -D67704B63DC1FAFE9572CFE1E5A46A3FB4EF25D58F526ED4366BAF04E3FBC3 -D6AB6A378965637174CB95823673F8027FA51B0D6ACA76DE1BD1AC86FB4D2A -D2263C8DB185AD35554002FCA0F61D2BCC2EFE27EB4BA4D96B361E1F8AF6D6 -F155D59AEC21505B1D319A35DF8B73E950EA125AE922E45818C3AF9A467791 -EDEF425CC4C9F2B3D4371FE22013EF4A4F3815E54FE33D7B57F18E96BA7401 -F497277AB385DDF27A119EB52EA1F1745BDBCD7B6763F6AB4B7674918B15C3 -270C318C9A1E9A156B9E84757B25BFFECE370BF6ADBBFCBC8CE338FE7574E7 -A927E95E41F6EB6BBF89163AD887CB59F468666393F282FBB18ABFAA7C5E7B -197CC834FF00B4DB8BF5B363BC8DA09E5FA761DA95ECEC09687A864E30B8CF -719A0BF19E707A62BCE6FBE21EAF17886CB4DD37C3F1DD47A85B497314AD73 -B0B0538E411C5565F895E287B0BE78FC2907DA74F645B887EDC30BB8F1CE39 -E39A725CBAB1247A6866040FCE9FBB7742462B81BAF895098B4D5B5B6F32E6 -F8B855C91B0AF5E7158117C68BEBCF0FB6A36DA129BC8657592D5A72A0A838 -07715EF4DAE5DC9524F53D6C1627A0EBCE6856C93D0F3D8D79B691F12358BD -D54E9BA8E871D83CBA72DDC2C973E664B1C01D38ACCF0CF8DFC4B6BA3789F5 -3BAB45BF8EC350B8081A554DAA8A084E07EB4E2B9B62ADCBB9EBFB8E40A639 -C82376DF4C75AF2A4F8ABAFC161A56B5A9786A1B3D275244DB32DE073BE420 -20DA0679CD49E1FF0014F89AEBC5DE26B77805C5B583C42184C8A02068F279 -C734AC08F520CD8CB707D0524B22411B4B2C81235192CC700579BF80FC7DE2 -CF19CD6776FE1482D747959C3DE0BE0CCA0647DCC03D462AFF008FF56737DA -1684A3FD1756BB36F73CF54DB9FE745819D636B567122BCB32A076DA9C8CB1 -F6F5A96E354B4B58526B8B88E147C6DF3182E73F5AE2FC55A75AA6ABE1CB71 -08758EF22C0C91B7008CD3FE27E976979A340B347BDA1955E339236E15B159 -CE5C8AFE6115CC7710CCB3C6B2C4C1A37190D9EB4F2C40E7F4AC7F0AB1FF00 -846F4E1D48B7419FC2B9FF001E78DEFBC12B6F74F60B71A6BE44D7265C188E -405014024E49FC2AE6B964287EF12B753B7CEDC0CE7DCD2072D93C823B76AC -2F0C6B775AFE9E6F2E6C56D606FF0054564DFBF920FD3A552F15F8D57C3BAB -695A60B6133EA52346A4B150B800FA7BD3B59D813BC6E74377A95B59B42B3C -EB19B8904518620658F6156B79E8BC9C77AF2EF1F5CDC5DE9FE1FBB9EC13ED -D1EACA6DE112E43300DB7E61C0CD452FC4EF12695757161AAF86E2B69E3B26 -B9802DD87F37070A09038CF352F7296C7AB2B139FAF39A3702586EE41AE093 -E206A337866C35587468E5BA9EE22826B6FB46047B8649CE39C565DCF89FC4 -F6DE3EF25ED946971AC8593CD5F9B0A483D3354D6849EA25BB9C81DB1555B5 -5B4178B6467549DFEEAB100B719E3D6BCD8FC6784258DF0B2326997A5B13E5 -B29838FBBB727278AD2F155B41278EBC19708BB1DA69CAC809C9FDD7A5090C -EE6E751B5B6789259D55A46DAA370E4D581206190C08033C1CD787FC43D3BC -5B27896C24B4260B569D45BC4AC844AFDC12795CD7AF787E2B9874B805FC22 -2B8118F3006DDCE06791EF4B60EA5AB9D52CECD9567B98A3661908CE0363D7 -1E9EF501D774F0EA8B790C8F272889206623D700D79AEB51D8CFE2DBA9F5B6 -692636B2DBDAC3B4ED285BE53B874E7D6A968C9E1CD2F5DB6BDBDB7FB2DD59 -42D0C4A9BE4F314F24F1D29475091ECDBF03E6EB4FDC33F5AA1A6EA36DAB59 -C57D6AC65898128C415279C743F4AE4FFE13BB8BAD7F57D22C2C1246D2C465 -F74BB7CCDE323A8EDED55603B80F862A48C76E79A773918E7D8D797DB788FC -4B27C4CD4B4B5B75B8B4B7B0826F28CAAA222C4E4838E69DE1DF887E2EF126 -AB2C76DE12B75D3ADAFDACE6BBFB78DCBB5B0C7611CF1CD1603D37919C1DDC -F7EC29B2CF1C31B4B2384451924F000A53D7767B6315C2F8FAFAEB55D3EF34 -8D36E45AB0B791E69C6095DA0E5307D477A434AE767697F05FC0B3DB4AB2C2 -FF0071E36C83F9521D4AD96E45B1B888CDDE30E0B0EFD3AD79BFC2CD4EDF40 -F85BA6CD7538011586EEA726461FD6B2F47D36F2DFE27AEA37B72249EEDC16 -872311ED8F0391D722821EE7B217006EE7155EE750B7B3781277DAD3B88E3F -763D0558238C9EBEB5C4F8EF5A5D3353F0F432E9297B1DC6A31C71CCD31430 -B907E60075C7A51B1A4753B60DC9E7DB146EC7538FC6BCDB56F88BAE5AF89A -E342D3BC3D15DC90D835D891AEC2654315C608ACBF13FC41D6EE7C1905FE9B -6E2C6F5750B782E55640DB18B0DC99230473D4516BA4FB931F7F547AF64900 -E7159777E24D2EC659239EED43478F330C088F3D3773C67DE886EAE0E8C679 -C7973085988073CE0D795F80F4DB3F17F85352D4B51B712CFAAECFB43163FB -CF2DD82F4C63181D293972B6BB154D73A3D99250EAAC0E4374239144B20863 -695DB0AA324D715F09359BBD6BC156D757921966F3A68F27038591947E82BA -4D7EE5AD748BB98C227091313116C06E3A668A8F92EDF4260F9ED6EA5EB5BB -8AF10C90B6E507152927B1E7D2BCAE4F88375A2F86E3BDD33418E49A7D405A -ADB1B9DA325739DC47B0157B48F1F6B979ABFF0064EABA0C561732698F7D13 -25D093A1C01C0C75A737ECD5D843DED8F44127519C91D40ED505F5FDB69F0E -FB99428ECA4F2DF41DEB85F86DAEEB9AB4BA8CDAC205027013E70768DBD381 -EB547C5775F6FF0089DE18D2AE2666B66373BEDF6F0D88811CFD79A6E3D7CA -E28BE6BF91D9CD078775285E5B8B6B59D53970EAA587D476ACF9BC0BA55D03 -2E98CBA76E1F2BDA228C1F5FAD737A6C305BFC49D734D396B5BB8A05F2B9C0 -C213D6B57C19AB9B5D7F51F0AC970D3BD9A8BAF30AE3E576385FC31EB4B77C -BE57096DCC3BFE11CF14E86DE6E9DAACDAAE3FE595ECFB17F4FA7EB53D9F8F -26B5B816BE20B07B398B6DDD6E8CF1E7A72DD3AE6BB3214AF2BDF8F7AAFA86 -9B6DA95B35B5D442485D70C84E3B63AD0324B5BC82F23F32DA55957D54E454 -A1B05B926BCD3C3465F0FF008DAE742B2BA69B4B937388F6802D8A80020EA5 -BAE739AF4BCB0C90B9C7DDE7AD003E8A28A0028A28A0028A28A0028A28A002 -8A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0 -028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28 -A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A -28A0028A28A0028A28A006B3118C0CFAD009EBD7DBD2865C9FA722ABDD5EDB -5A4124D752AC70A03BDDBA0E39A009CC800C9E06715CF788BC6367A1288B22 -6BD9388EDC120B74CF38C719AC2BCF126A9E2591AC7C351BC56BF70EA0CA1E -223B8F5E41ADBF0DF836CB425F31D7CEBD700CB333160C79E403D28031ED3C -37AAF89E64BBF12EE48067CBB238FDDF63F32919CE01AEDACED62B38FC8823 -09128F940A9768E46781DA94E4E31D28005190734E000E9483838A5A004000 -CE3BD2D145001451450014514500145145001480E46452D27BF6A000127B62 -B2BC41AC47A26977172CC0CA236F253FBEF8240FD2B51B3CE4E0579FDC86F1 -8F8A92088E74FD31D652DFC26546C15E3D8F4E9401A9E08D21ADED1F56BA05 -AF35090DCF3C796AE01DBE8707BD75C31DBBD4614468AA3E5038C549400605 -145140051451400514514005145140051451400514521A000E01CD65EB2A62 -0977DE13F29F4CE056AF5AAD7D07DA6D5E223AE3F43401329089D7A75A51D7 -39E0F4154B499BED562ACDC92483F9D5EEF8EC280168A28A0028A28A0028A2 -8A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028 -A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A00 -28A28A0028A28A002918E39270075A5A461DF19C50064EBBA0DB6BD632D9DD -A643A950FCFCB9FA1AE551BC55E11023589B5BB25E011B21F2D7D7B9380315 -DFE41CF7F6A455032BDBD0D0072BA77C43D0EEE4582E6E16DAEFA188866C1F -AE31D6B5759BDB69B43BC704488F6EE14671BC95381ED9AB17DA2586A5198E -E6DD483FDDF94FE62B94D57E15E89790CAB6EB2C523A919371211C8F4CD27A -8D6E79A786A6F105969F6A971E0191B4D550B1DC7F682E114F4E3A9E6BA4B0 -6F16F86F5ABE8B4DF0EB6B3A6DE14F226F392311051CF0724E493D7D2A283E -116BBA4A5BC76BABC6F6F00C245B589FCCD754BAFF008A34D005C787AF7510 -BD7C8545CFF9FE95517CA889AE691957FA5F89ECFC51A46A49A5B6A4AAEE67 -915D23110D981C77F4ACBD0E1F1A783AE67D1AD3C2EFA9595DCEF3FDBBCF8D -042646C91B4E49DBFAD7649F10510E2F749B9B053D1A675C7E95622F889E17 -62AB2EAF6F0B93808EC739FCA93D5DCBF851C85F787FC4977E3886F65D29E4 -B5974F4B792E048A0447773C679C533456F1B683A85EE8EBE196BEB2B8BB66 -8B52F3A3510213B41D9C96C0E6BD160F1268F7C42C17B1CAB8CEE526B46195 -251BA37053A022A5C79A5CC34F438096C3C449E37D32E5B4B6BAB5B5B29629 -2F43AA0662411F2F6CD51B5D3BC4B241E27597407885CC909B55F3D4F9A07D -EFA63DEBD44FCC08079CD35C01B987CA47F11E95551F3AB0933C5E1D1FC5DE -1DB6D1F55B1F0F3DE5CC4F29BBD3FCE4520745F9CE7D73C56A6BD6BE2ED7F4 -68E77F0FB432B3B0FECF12C64C58FE3DFC673E95EA9800FDE03D053BEEF539 -3DCD39BE6328C2CB94F2C8B44F10FF00C257617874575B65D2E0B7793CD5F9 -5C1E463DAB223D3B5DD0FC3DE35B4BED11EDEDAF27BCB98AE4CCA43064C0E0 -7AE335ED2594107D78ACED7B47835DD3E5D3EE0FEEA50430C91904107A7D6A -A0F94D25EF5BC8F27D1F4AD7BC5DE05F0C684DA635959C315B4FF6FF00315C -308F040DBC119FD2B574DD2BC49A178DBC49241A03DE69FA934663BBF3D502 -ED8B1D3A9C9AF43D0B478F41D360D36D9808A045489724E140C77AD161952A -C327DBBD26F504709F0974DD5F42F0A41A76B3A6B595D44CE551A456DD9763 -DBD88A6FC40D2F6EB9E1AD72438B7D3AF8CD33768D76633EF5DEF392554F1F -AD327B786EE0786540F1B8C11EB45C19C6F8A2749F58D06443F235D44FBBD4 -7352FC45B4D46FB488A2D334E6BF7F3436D59026060F3CFE15B571E16D26EA -28A29A072B149E627EF1810DF9D69456D1C112C280854002E4E78AC2B479A3 -F34107CB7665F85A2BB8B42B182F2D4DBCB1C2A1D0B03B481D38AE7FC71A6E -A3E29B9B7D05B4D2DA4CCAED7175E60C46CB868F8E09C91DABB80360E7A505 -14E06338AD6A7BD2F5151FDDA4BB1C2FC378BC47A35A4FA3EBB64C2DED31E4 -DF165027DC589F9474C640A778FB499F5D96CF4F93406D52C246659DD6E3CB -F21481CF1C9CFB57727D8671DA97201DA067D47A55395E571455A291E536DE -15F1158F8774D49226B99B4FD49AE63B73B41318CED5CE7D30335B50E95A97 -88F5DB7BCD5B4E3A7DB410A911B387DCE1B3D463B135DD0203150C318E9E95 -9FAE68D6FAEE9D3585CEEF2A552ADB5CA9C1041E473DEA1EE68B6380F0A784 -CD9F8EB57BBB7BBF3B4C96595E4B7D980931618E739E07E14DF10687E215F1 -98B9B2D1DEF6CA749375C09554444A900609C9AEF3C39E1CB1F0CE9C963A7A -9484019DEE5C938C67279ED5A8A831F39E578CD537A10793F84C78E749B6B5 -F0C4FE1865B6B7C81AC99A2206496FF57F8EDEBEF5BFE27523C73E1025B730 -9A7DC7D3F775DDAA903E6F989EA45660F0EE9BF6F8B5030B7DA2124A317271 -918E94458CD0654621C80D83D7D29E0FCDC771D693E6E70C083C0E3A5286CF -0082475C527A875313C5297B25925BDA5B79C2E24114CE081B636C863CD71E -DE17BFF0F6B76573A7E94DA9C315BBC224F34208831E9824E7D6BD2D7BF18E -73CD1925B38C01C7D69434148E5AE4EB3E1CF0E4634CD39B54BF41FEA15D63 -2F96E793C0C024FE15C678B3C31AC788AF6EA74D05ED753B708D63A909C1DC -C40DFF00BBC81C018E6BD65810FD31E87D29E0283E615209EB9ED57728F2DF -ECDF14E91F1126D560D11F52B3BCB182DA49C4C91888A0249C753CD5EF8676 -1AA787ADF5C7D6EC1AC239B52B8BA46670D9462083C7B035E8BFC47D3D2992 -C492AB23AEE571B587B52B88CBFF00849F466C32DDA9078CED6FF0AE5756F8 -69E1CD5A1D4F50B3B567B9BE8E494B895FE69194E382D8EB5D8FF615811830 -F03A0C9ABD144B046B1A0C228C05A069D8F23F037C1ED353C15069BAFE9CFF -00689FE6B8CCCC3055C95FBADE98E94ADF09ADADFC7B69ABDB5A3FD8E26CB4 -9E63607C98EED9EB5EB79600951FFD7A730CE3039F5F4A427A9C959F89B523 -E2EB9D166D28C161124661BB32861292391B71918ACCF891A66B1AB5FF0086 -DB4ED2DAEA3B1D523B999C48A36A007279FAD7702DA049DA400798C06F3ED5 -2E781F295C9C0CD0F55608E8797368DAF9F1F5D6B0BA13FD9A5D15AD565F39 -71BCC99C63E9591AAF853C4F77E0FBAB48B467FB60D621BA487CD4CBA21049 -CE703A57B5638C03D3A9A1B000214B7D284ED14BB053F71346369725EEA3A5 -0FED1D3CD84D2478784C81F693EE2B88D3F48D6BC23657DA3699A3B5FD98D9 -F66904AA9BF272DC1C9E093D6BD40A8FC7D69A47193D07515328F3393EE3A5 -EE5CF3D916FF00E19F83561D274E6D4443E64D201208F6166DDDF39E49FCAB -A9D464BBD43C32D3456C5EE27B50C20DC3EF15CE335AB25AA4C50C803053D2 -9EDE5C69D42C63F4A2AAE74D772692E4B3EC78D3F87FC512E836B047A1BB4F -1EB4B72F1F9A9C461793D6B566D1BC432F8E2C753FEC4716A9A2B5A48FE72E -1642F9C7E55E852EBDA55AEE325EC5185EB935973FC43F0AC4C53FB6ED7CC1 -FC3B8E7E9D29D55ED2360A5EE5CC3F01DB6B7A4EABAA5ADF690D0DA34F98EE -8CAA4380BC1DA39EBC54FE2BD02FBFE122D23C4D61019E5D3BCDDF68081E6E -F50A3E6278C75E9568F8FAD6405AC2CE5BE2DC81130E7F3A825F14788AFC94 -B4F0C5FD911FF2D65D8CA6ADCBA7958505CBCCBBDC340D0EFE4F126A3E22D4 -EDCDA35CA46B1DB921BCBDA0827703CE7E954BC21670DD78AB56F1624C1609 -E31698C7431B1C9CFE3E94B77A078DF5E89E1B9D620B7B471830B5BE18FE23 -E9562C3E1B59B85FED29BED3B7A792EF18CFE06A5693BBED61CB48289B3A8F -8F340D38989EFD7ED03EEC7B1BE63E99C7158ADAC789FC505A1B2B06D32CDF -E5FB56F4937A9EF8382320D755A7786B4CD2940B5B6031FDF25CFEB5A5B02A -E140419F4A0673DE15F0859F8563B978DBCDBCBD712DCCC73FBC70319C6481 -C7A5744CA0B8E29471C05E05073B700E1A801D451450014514500145145001 -45145001451450014514500145145001451450014514500145145001451450 -01451450014514500145145001451450014514500145145001451450014514 -50014514500145145001451450014514500145145001451450014514500145 -14500145145001451450035DF6903079EFD8501B9DA48CD4175730DA46F2CF -324283AB4AC157F5AE26EBC55A9F88A73A7F87AD8C684E1EF2E1182E3FD975 -279CD006FEBDE2DB2D1C1855BED37AC3F776D0905CFA719F5AE7E2D0754F16 -CC97FAD96B4B4520C76F1E637C751BC1C83C120D6BE85E0CB3D31BCFBB7935 -0BD2777DA2E0890A77C2B119001E95D28008D8338031CF434010D8D95B595B -A436D1AA46A001B4019F7AB58E734D41B571C7D07414EA00314638C5145002 -018A5A28A0028A28A0028A28A0028A28A0028A28A00298DB8E076EF8A7D433 -4D1C1134B3388D00E598E00A00E77C6BACBE9F62B6D6CC0DEDD931DBAFFB58 -CF23AF4F4AB7E13D1C693A626E07CFB8FDF4C4FF007D80DD8F6CD737E1B8A4 -F186B2DE20BC464B580EDB6858636BA9C16C1C8E47706BD0074C0E94009B46 -4F5E69C060628E945001451450014514500145145001451450014514500145 -1450018A46FBA714B450064E9AA2DAF6E6D01F910295CF5E7935AB597703EC -FAAC32F413121BF015A60E466801D451450014514500145145001451450014 -51450014514500145145001451450014514500145145001451450014514500 -14514500145145001451450014514500145145001451450014514500145145 -0014119A28A003028C514500148466968A004DA067DE8DA318A5A280207B2B -697FD6411BFF00BCA0D549BC3FA54DBB758C00918C88D723F4AD2A280DCE66 -EBC07A4DD7F1DC43FF005C9C2FF4AC997E15E9DE69963D535656C703ED5F2F -E58AEF31450B40382FF840B50B6C0B4D51CE3FE7ACAC7FA549FD8DE37B539B -5BED2987A4CB23577031ED467EB401C367E20424199F48931DA2864A55D6BC -576E313699E6FBC7037F8D7718CF5029327D4500711FF098EB107FADF0CEA7 -37FD72B7FF00EBD397E204C3FD678475D4F76800FEB5DB718EBF9534C6AE3E -650DFEF0CD00B43904F1FC1FC7A2EA71FF00BE8A31FAD4C9E3ED33399219E2 -3FEDED1FD6BA26B0B47FBF6D01F5CA0A89F43D2A4E5B4EB66FAC4BFE14018E -3C79A0920BDE471E3B348A3FAD489E3AF0BE496D6ECA3F6699455E3E19D09F -EF68F667EB02FF008544DE0EF0DB7DED0B4F3F5B64FF000A008E3F1AF861C7 -C9AED8B8CF513A9A953C53E1F6FBBAC5A3679FF5C2A06F04F875BEEE8F6910 -F448100FE551B7813433F76D553FDD451FD2802F8F11688E38D4ED8FD25152 -0D6B4A720AEA101FA482B27FE102D27F87CC5FA6DFF0A6378034D3D2E6E93F -DD703FA5006E1D5B4EFF009FD87FEFB14F5D46C5BEEDD444FB30AE74FC3DB0 -3FF310BF1FF6D47F8534FC3BB3EDAB6A8BFEECE3FC28D80E9C5E5B13C4B1FD -734BF69B7FF9EC9F9D72A7E1D5BF6D77591F4B91FE1487E1CC1DBC41AD7FE0 -50FF000A00EB05C407A4ABF9D289A1C6048BF9D723FF000AE22FFA1875B1F4 -BAFF00EB527FC2B88BFE864D77FF0002FF00FAD401D7F9D1FF00CF45FCE812 -C43FE5A2FE75C87FC2B78FFE864D7BFF0002FF00FAD47FC2B88FFE864D77FF -0002FF00FAD401D779D081FEB57F3A43716D8FF5A83F1AE4BFE15C45FF0043 -1EBBF8DDFF00F5A97FE15CC3DFC41AD7FE057FF5A803ACFB55BA8FF5C9F9D3 -3EDD66B926741F5615CB8F87507FD07F5AFF00C0A1FE14E1F0F2D7BEB5AB37 -D6E01FE9401D19D574F079BC847D5C530EB7A5A8C1BFB7C7BC82B087C3EB2E -FA8DFB7D651FE14E1F0FF4D1D6EAEDBEAE3FC28035BFE122D163183AA5A8FA -CA298DE29D0573BB57B31FF6D45501E03D2475F31BFDEDA7FA53C781B441D6 -D837D514FF004A009DBC65E1A8F86D72C87D665A8DBC79E161C0D7AC58FA09 -D6947823C3C3EF6976CDFEF4287FA548BE0DF0DAFF00CC074ECFA9B64C9FD2 -802AB78F7C3D905350864C7F76453FD6A33E3ED278F2C49281D0A1539FD6B5 -17C2BA027DDD16C07D2DD7FC2A45D07488CE134BB65C7A42BFE140182DE3FB -51FEAF48BF97DD114E7F5A89BE20C87FD5F85F5A947AAC20FF005AEAD34DB2 -4FB9670AFD2302A548624E16241FEEAD007167C6FAA4FC43E15D5E3F792DF8 -FE74BFDBFE289C7EE74A687DA580FF008D76DCFF00FAA85FA1FC680388F3FC -7D39FDD0D3221FF4DA19283A5F8F6E1F3737BA3807B46920AEE3069680383F -F842357B8CFDAF53C6EEBE4C8C3F2E284F85965236E9F56D509F44BAE3F957 -7740FC280396B7F87BA4DB907CEBB93031FBC901CFE95AD6FE1CD26DD768B2 -85FF00DA78D49FE55A94500568F4FB38B1E5DB4498FEEA01539418C741ED4E -A2801368A4D83B714EA28DC04C7B9A02814B45002119F5A5C5145001451450 -01451450014514500145145001451450014514500145145001451450014514 -50014514500145145001451450014514500145145001451450014514500145 -14500145145001451450014514500145145001451450014514500145145001 -45145001451450014514500216C1C5216C75FD2948CF7A86E6E62B488C9338 -44039340130279CE07A561EBFE2CB1D0A3C3B99A76FBB142BBDBF1039EF583 -A8F8BAEF5A99F4DF0EC0D34818AC97058C7B3D719183C7357FC3FE0D8B4B7F -B6DFB8BBD45BEF5CBAFCC3B7AFA5006459E8BACF8BE6379AEC8D6D64DF72DA -27F918743B95BDC035DBD9585AE9F6C21B5B78E0897A246B81560F1F7CF07B -5397078038A00028C0C71EC297140CF718A5A0000C51451400514514005145 -14005145140051451400514514005231207029690938C819A0040F9DC0755E -B9AE2BC71A849A94D6DE1AB073E75EB159990E0C6000C39ED9C77AEA355D4A -DF4AB29AEAE5F6C7181B9BDCF03F535CB781F4B9A4FB47892FD7FD36FB1B94 -F253692A39EF918A00EB2C2C21D3AD52DA08C46A832428C027BD5C1D29A4E3 -1CE734EA0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A2 -8A00283D28A2803375A4FF0046F397EF45C8FC71572DA4F3208D863A0CD13C -42784C6C3EFF005AA7A2484DAB231F996461F8668034A8A28A0028A28A0028 -A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A00 -28A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A -0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A2 -8A003028A28A0029303D2968A004C01DA968A2801303D2968A2800A4C7B9A5 -A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A -28A2800A31451400628A28A0028A28A0028A28A0028C5145001498F734B450 -02018EF4B8A28A00319A0003B5145001451450014514500145145001451450 -01451450014514500145145001451450014514500145145001451450014514 -50014514500145145001451450014514500145145001451450014514500145 -14500145145001451450014514500145145001451450014514500145145001 -451450014514500145145001451450037CC19C1E1BD29776738E4D452CC96F -1996521631D49ED5C56ABE2EBCD56E8699E1B4FB496E1AFA3C32C59F55239C -1A00DEF10F8A2C3C3D12B5CB6667F9628867E66E703201C74AE721D1F5BF17 -C82EB557FB1E9AFF0032DAE15F7A750770C119048AD5F0F7836DEC6537BA84 -9F6CD41FE6690E401C838DB9C75CD74EA029C0E00E8B401069DA6DA6996D1D -B59C5E5C51A85519270074E4D5ADA376EC734A3A51400806381D28C71CF34B -4500028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A002 -9B8C7CCBDFA8A71E95CE78C35E1A0694D2A7CD3CAC11533C9CF19A00C0D799 -FC5FE234D0A1FF008F0B4256F4FB90193D0F51DABBF58F620553800607B573 -BE0BD0FF00B1F4B8CCE09BC9866673D4904E3F435D2D0034205E94EA28A002 -8A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A00283D28A -2801B939635976C7ECDAACD1FF000B2023EA6B54F51591AA298AE6D271DE50 -1BE828035F3C74A5A6AB0650C3A1A5CFCD8A005A28A2800A28A2800A28A280 -0A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2 -800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28 -A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A -28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A280 -0A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2 -800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28 -A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A -28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A280 -0A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2 -800A28A2800A28A2801030C64F1F5A0302334DFBDB8E0F1FDEE951C93A5B44 -D2DC491C71A8C9627000FC680262D819C13EC2B235AF13E9BA1A7FA4DC279A -7EEC4186E6FA03F5AC2D57C61737F31B0F0DC02EA4FE2BADA5A05F62CA7AFA -54DA1F8316DDCDE6B0FF006EBD7397131F32243D3E4DC3238C7E3401969A76 -B9E35B912EA1E6596960E440C1A3948E9D47B8CD76BA769367A5C022B68563 -51DF1C9FA9AB60284032140FEEF4A7127EA28010AEE3ED8EDD68DA780318A7 -5140001818A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A -2800A28A2800A4DDCE294F4A693D08EBDE8012599218A49642152352CC4F40 -057056111F1878AA6BF9016D3F4F2D0C40FDD9738218763F5ABBE37D55E410 -E87624B5D5DBAAC9B3F86224AB1E39ADFF000F68F1E87A55BD8A72D126D67E -EC7D49EF401A3B410474FE94FA603F2EEEFE94FA0028A28A0028A28A0028A2 -8A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A002A9EA70F99 -672918DCAA4AFD6AE535D03A321E8462802A69D279B6719EE9807F01570724 -1F6ACBD21F679F6EDC112311F4AD3CF03D8E2801D451450014514500145145 -00145145001451450014514500145145001451450014514500145145001451 -45001451450014514500145145001451450014514500145145001451450014 -51450014514500145145001451450014514500145145001451450014514500 -14514500145145001451450014514500145145001451450014514500145145 -00145145001451450014514500145145001451450014514500145145001451 -45001451450014514500145145001451450014514500145145001451450014 -51450014514500145145001451450014514500145145001451450014514500 -14514500145145001451450014514500145145001451450014514500145145 -00145145001451450014514500145145001451450014514500145145001451 -4500145148E32A7048F71400B9A43E94C665419721547726B8DD6FC6B2CB72 -74DF0F402EEF0FCAECD95099E0107A75A00DED77C4167A1DB34D3C85D8748A -320BB707F873ED5CB416FAD78E5C4D752369FA483F2C711649241D40653918 -20F35A1A3F82D7CF4D4F5C95AFAFDB0479D83E51E08008EC0E6BAD002B2A0E -C385F6A00A3A4E8765A2C1E4595BC712F72AA017F738EF5A2573D7F2A5A280 -1BB4600C023DE971E94B450014514500145145001451450014514500145145 -0014514500145145001451450014514500154755D463D2F4FB8BC93EEC48CC -4773819E2AF5705E26BA97C41AFDB7876CD8B246C97172C38CC792ACA73C77 -E9D68025F07E9D36A7793F88AFB0CD2B116A0F3889B0C339E86BB70081EBEF -505A5AC7656D15B42008E2508A0760062AC5003406041C0E7AD3A8A2800A28 -A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A -28A2800A0F4E28A280319F36DACABF48E440BC7F789AD71D4FD6B37578F647 -14C072928627D866B42193CC86371FC6A0D004945145001451450014514500 -14514500145145001451450014514500145145001451450014514500145145 -00145145001451450014514500145145001451450014514500145145001451 -45001451450014514500145145001451450014514500145145001451450014 -51450014514500145145001451450014514500145145001451450014514500 -14514500145145001451450014514500145145001451450014514500145145 -00145145001451450014514500145145001451450014514500145145001451 -45001451450014514500145145001451450014514500145145001451450014 -51450014514500145145001451450014514500145145001451450014514500 -14514500145145001451450014514500145145001451450014138A29AEA0E3 -3D8F1400EC8C668CD30609E4EE6149900B3E36E3A9A009322B335BF1069FA0 -5B1B8BE9BCB5EC029627903B03EB5CF6AFE39F32F1F4AD0A2FB6DE03B5CA9D -BE51F70C39E39A344F04BA5EFF0069EB971F6FD43A8755F2C7420FCA0E3A62 -8033DE2D77C6F2F2CDA6E927EF2FCB279DFC88C115D8E8FA159689682DACA2 -1120E4E3272DDCF3EB5A0102AE17E51E94E041E0738A0031C0CF5F5A4DBF36 -71938EB4EA2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800 -A28A2800A28A2800A28A2800A28A2800A32338A4392383834C192011C63B7A -D0065789B5C8B44D2A69F77EFD918409FDF70381ED599E08D19ACF4F7BF9F9 -BBBC91A7663D407C1DBF9F7AC88E1FF84DFC4A25DD8D3B4B904910FEF4A0E1 -86783F9D77EA9B405030AA381F4A0055C0E8393D453E81CF4A2800A28A2800 -A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A28 -00A28A2800A0F4A28A00AD7B1F9B6B32753E59C7E5516932F996A173CC5843 -ED8157301893DB18ACBD349B7BEB8B76FE366917E99C5006B5145140051451 -40051451400514514005145140051451400514514005145140051451400514 -51400514514005145140051451400514514005145140051451400514514005 -14514005145140051451400514514005145140051451400514514005145140 -05145140051451400514514005145140051451400514514005145140051451 -40051451400514514005145140051451400514514005145140051451400514 -51400514514005145140051451400514514005145140051451400514514005 -14514005145140051451400514514005145140051451400514514005145140 -05145140051451400514514005145140051451400514514005145140051451 -40051451400514514005145140051451400514514005145140051452374EFF -0085002D3588E9FE4537794CF98401EA3B7D6B93D67C6691C8DA7E891B5F5E -B7CAAE8A248D09FEF60E4007AD006E6ABAD5968F6ED3DE4F1C6541288CC15A -43D80FAE2B8F126BBE3995BCB5934CD301E92210D28F5561D88357B48F07CF -772AEA1E239FED375BB7AC08E5A251D7EEB0EB9C8AECA18D225548A358E351 -80AA318A00CED1FC3D61A25BAC169083B7FE5A49F339FAB7535A9D3B74A5A2 -801A140E79A5C7A52D14005145140051451400514514005145140051451400 -51451400514514005145140051451400514514005145373C9E0FD680158023 -07BD721E3AD62786D23D2F4E70350BDCAC58E482B8278EBD335D35D5CC3616 -CD3CD26D8D472EC781F8D719E11B797C43A9CBE25BE8CAA3605B230C796572 -AC707A67D8D00749E1AD1A2D134D8E041FBD71BE427AEE3C9FD6B639C73CF3 -4714B400D39C803A53A8A2800A28A2800A28A2800A28A2800A28A2800A28A2 -800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2801B80011EB599 -7DFE8F7F6F38E01022FCCD6A63F9550D5E2DF6A1C758983FE5401A14556B09 -FED3690CA7AB2E4D5807233400B45145001451450014514500145145001451 -45001451450014514500145145001451450014514500145145001451450014 -51450014514500145145001451450014514500145145001451450014514500 -14514500145145001451450014514500145145001451450014514500145145 -00145145001451450014514500145145001451450014514500145145001451 -45001451450014514500145145001451450014514500145145001451450014 -51450014514500145145001451450014514500145145001451450014514500 -14514500145145001451450014514500145145001451450014514500145145 -00145145001451450014514500145145001451450014514500145145001451 -450014514D3C9A007668A610C1B800FB9A616259B070A3AB1F5A009AB3B56D -6ECB4783CDB999031FB91EE1BDFD7033CF5AC1D7BC710D8CBFD9F6117DA753 -62424641F2F8EB961ED55F4DF06DDEA732EA3E259CCD73FF002CEDB21920EC -769EBC8C134014DE5D7BC6ADE5DBF9BA66959C3CB968AE083D71D8F238AEAB -44F0E5868B0A8B6855A5E8D348837B7D4815A91471C0AB146A1547402A5A00 -61041C803DFD695739F6F7EB4EA2800A28A2800A28A2800A28A2800A28A280 -0A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2 -80034D271E98A71E9595AEEAF0E8BA5CB7931C2AE1401CF24E07EB401CC78B -6F25D7F508FC3360C46F27ED0C87FD560061BB1D338EF5D9DA5A45656EB043 -1848D47DD51815CC781346923824D72F47FC4C751C35C1EBCAE40E7E95D850 -020073ED4B4514005145140051451400514514005145140051451400514514 -0051451400514514005145140051451400514514005145140083AFE151CC9E -6C32C647DE522A5A28032F487F2D26B73FF2C58281F8569F418AC95FF45D5C -A1FBB700C87EA38AD5C9C8F7EB400EA28A2800A28A2800A28A2800A28A2800 -A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A28 -00A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A -2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A2 -8A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800 -A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A28 -00A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A -2800A28A2800A29A40391DCD34FCAB9E9818CFA7BD004945717A9F8D8BDDBE -9BA1C26FAEE36292B2305F2D81E7EF0C1AAC347F1DDD1F34F89D6C14FF00CB -26B347C7E3401DED15C17FC237E3EEDE388CFF00DC3928FF008467C7FF00C5 -E368FF00F05E9401DED15C17FC237E3C3D3C6F1E3FEC1E947FC233E3DFFA1D -E3FF00C17A51D6C077B45705FF0008CF8F7FE8778FFF0005E947FC235E3DFF -00A1DE3FFC17A52FB560E973BDA2B82FF846BC7DFF0043BC7FF82F4A5FF846 -BC7DFF0043BC7FF82F4A6077945707FF0008DF8F87FCCED19FFB87A527FC23 -5E3FFF00A1DA3FFC17A50077B457047C35E3C3FF0033A479FF00B07A528F0C -F8FBBF8DA33EDFD9E9401DE515C1FF00C237E3F3CFFC26B18F6FECF4A41E1A -F1F0FF0099D63FFC17A50077B45705FF0008D78FF9FF008ADA3FFC17A520F0 -D78F7FE8768FFF0005E9532765703BEA2B82FF00846FC7D9FF0091DA3FFC17 -A51FF08D78FB3FF23AC7FF0082F4A6F45711DED15C18F0D78FB3FF0023B47F -F82F4A69F0D78FB69FF8ADE3C8FF00A87A537A2B8CEFA8AE08786BC7DCFF00 -C56F1F4FFA07A507C35E3C0303C6D1E7FEC1E9475B01DED15C17FC233E3EC7 -FC8EF1FF00E0BD294F86BC7A463FE1368F8FFA87A524EE0779457043C33E3E -1FF33B47FF0082F4A0F86FC7ABD7C6B19CF6FECF4A6077B4C7EA31C63AFD2B -853A0F8EE04DE7C5F1CC47F08B1419AC2BDF8AD7DA04E74ABDB07B9BC2B913 -07550074CE00C751401E95A9EAB65A4DB35D5DCFE5C43D89C9C67B73DAB8C6 -D475DF1A48D0E9A5AC74A2706E976B161E9B5B07906A4D1BC33278864835CD -7A5FB68902CB6F101B3C9CE19412A467193D6BBB86210AEC180A3A003A0A00 -C8D03C2FA7F87E2DB6B08F3481E64993973EB8278EB5B4063B52D140099F6A -5A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0 -028A28A0028A28A0028A28A0028A28A0028A28A0028A46EDF5A685182178CF -5A0071214127A0AF3CD415FC6BE2B168A73A669CCD15C28E8EFF00794F63F9 -56CF8DFC40DA4D8A5ADBE5AEAE9C421475DAD91BB91EB577C25A28D0747860 -939B82A3ED0FFDE6F5A00DB518C007814FA62800E0F6E94FA0028A28A0028A -28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A002 -8A28A0028A28A0028A28A0028A28A0028A28A00C7D717CB0974BF7A3213F33 -5AA8E1D437AD57BC84CF04898E87350E91279BA7C20FDE20E7F33401A34514 -50014514500145145001451450014514500145145001451450014514500145 -14500145145001451450014514500145145001451450014514500145145001 -45145001451450014514500145145001451450014514500145145001451450 -01451450014514500145145001451450014514500145145001451450014514 -50014514500145145001451450014514500145145001451450014514500145 -14500145145001451450014514500145145001451450014514500145145001 -451450014514500145145001451450014514500275E09E6B94F1BEAF35B5AC -7A7D98CDD5EBAC0DC676A3E416AEACF1F9D70BA87FA4FC51B5B56E5574C136 -D3D32243CE280373C31E1BB6F0FD9244A0B5C3A832B939DCD8E48AD8F31118 -C41C799EF516A73B5AD85CCD121692389D94019E4038AF20D398EABA65CEA5 -7FAC5E47A95F1576B782E4AFD9B69C636F55C819F7A571D8F66F3A2F30A6E1 -B876A90920D79B781AE34DB19AF751B9D667696EF66EB7BDBA0C6DF6E47DD3 -F77775F7ADCD4FC7B6767A9DE69704135D5D5944B2C91C58662AC011819CF7 -AA11D6938A4EC6BCEB55F1FEA169E34B5D163D3A792DA5B48AE199222594B3 -104139AA83E33C53EA9369B69E17D76E3C89CC134D15B864420E09241E3153 -F6ADD4767CBCDD0F4E0D9A0B7B57116DF12EC6E74ABFBF86C2ED96C2F459CB -1ED52FBB8C9EBD066AF4FE35B430599B7B6B8BA7BB8DA4448006650BD8F3D6 -9A5EFB8F513D24AFB33AC539A5AF28F177C53BFB2F074BABE97A45DD9DD290 -3CBBF87FD5FCE17E600F1919C57A2E8B7D26A5A5DB5DC90CB0C8EB928E3073 -F4F4A7E8257B6A691F6A824BA8213FBC9029F7A7E723939CF1F2F6AF3EF8B5 -0B7D874568AEA7B72DAA428C6090A16186C838EA2931AD4EFF00ED3118CC9B -C6CF5A8ADEFED2ED888265771C605792DCCD75E27F18E99E15177796DA6DBE -9E2E9E5B694A48F2A3E30CC3A820F2315ADF12B449743D253C47A3DEDCDBDE -D9148D6232910C819C062EA3A9C138A10DAB1E9A327A9E6992CF1C5F7DC0FA -D67E81A9B6AFA45B5FFCA1A65248FA123FA560FC51490F82B53960B8920955 -1763C4E5587CEBD08A047526FED381E7AE6837D6A3FE5B2D7917846E74ABEF -06A4377A95F35C5C49242241723CC07D89E6A51A79B6F88F61669A85EBC0BA -642DE5493921BE7C658773EA6A64AF11A3D616F6DDD80595493C0A99E44886 -5D80AF23D084CBF176E2137B7125B8B49585BB4A4A03E68C10BD38AF4ED691 -64D32E32CCA446C430383D0D27F045F7113B6A1698E665153248AEA1C1E0D7 -89FC34D52C3FE10B69B59D4EE6495386924B81BB9760305BF0AEB35292F344 -F04C074637B7D347BCC65D8CAED97FE2C75EA6AE5B31B3BF86549977A9E338 -A90F4AF21F847AC7886EDA74D6239A64049596256F2F3BBA64F715E8FA06BA -DAEC576E74EBCB0FB3DCBDBE2EE3DA64DBFC6BEAA7B1A4FE2B08D57758D4BB -9C0155A3D4AD2762A93A961D45799F8BB54BFF00117C42B3F06C17335AD925 -A2DF4B2DBB94918AC854AEE1FC2476C56DF8ABC3DA45BD85A7DA35D974A304 -B1ED99EEC45E6E1BA31EF9E9EF4441E8AE768D796F19C34AA2AA6A1AFE99A6 -C0D35DDEC70A01C3366BC8BE22EBF12F88F425D2AFA6BC2F1CDE6C36336EC9 -E31900D655F58F99E32B69BC5FAD2DADAB9FF50B70638B1B3BAB71E9F8D35A -A7E41B5977FD4F421AB6B5E328CDBE9701B0D3989124F3A87F357A6148E41C -D741A7F81F48B0D367B211BBADCA9133BBEE6F9873827A579F7C3B6B887C77 -AB45A54D7577E1C30442DA76732405BF8F6B0F9720E738AF651D29BD9093D5 -AEDA1E7BE1DFB4783BC413685752092C2E019AD64FEEE582AA127A9C0AF421 -8ED5C47C488808F46B98FE491353854BAF04A8C9C67D2BB4B7904B0A38FE21 -9A4324A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800 -A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A280118E071 -D7B543777115ADA4B7170C1238D0B393D801CD4CDD39AE27C677F2DFDE5A78 -72C4B33CEEAF72579C424956E9D3F1E28021F0F5B49E23D7EE75F9C66DEDF7 -5B5AAE3EFA6432BD7740923A647AD55D274E834AB086CA05012140B9EE703B -FBD5DC76A00404EE39FC2968A2800A28A2800A28A2800A28A2800A28A2800A -28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A280 -0A28A2800A0F4A28A004C6463D456569A7ECF7B756FDB70DBF956A679EFC71 -59779FB8D56DE4FBAAFBB71E99E28035A8A4CD2F4A0028A28A0028A28A0028 -A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A00 -28A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A -0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A2 -8A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028 -A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A00 -28A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A -0028A28A0028A28A002B83954FFC2E285BB7F6211FF912BBB3FD2B8693FE4A -EC3FF6043FFA32803B5650C1958020F047B5713E21D0E2B9BFB7D32C34D8AD -E3BA5769EEA28B6B02A015F980EFD39AEEB03D3AD1B47A0A562AE78F787B47 -9E6B6BBD3AF74A906B174544B70D01F206D24AED7233F77AFBD43E3DD35EF7 -52D47FB36CF55B3D6ACADE374BBB384A47767680119C0CB81E9DABDA303D29 -0804E48E954992CF1CB89757D2BC65A65FEA1A75D5CC13D8416FBED6167292 -6724BFA0F7ABFF000EE398EAFE23F334EBCB769EEAE248DA780A46EA48C1C9 -EA6BD50A83D451B40E302A7ED733DD157F7794F9EE3D42FB42B6F14E992683 -AA4D3DE6B6D344F6F66CD1143819CFE15AB15D6B1E11BAD07549349B9BAB06 -864F3E2B7B769278C9E1405E31C9E735EDE114701473486343D547E54D6927 -3EAC97ACD3E88F20F886F7BE28F005FDD5A69373141398F641F6765BA38917 -3B979F4CFD2BB1B6F17ADBE9FA316D2B531F6BCC440B5398B68032FCFCA0F6 -AEBB62FF0074524882452B9C669E8B44257B5994C6A961B037DAE153D76F98 -01CFA63D6B83F8A57BF68B2D1D6CADAEB50D9A9C52C86D6332EC501B39C74A -EAE4F09D93C8D210064E7851D6AFE9DA6C3A642D1467876DD9C62A5EA35A1E -657567A8E89E24D3BC5D67633CB66F622D25B75899A50CCFBB7141E8075CD5 -8F1FEAF7BE30B18FC35A4E99A847717A56459EE2DD96145460C43B0CE0900E -2BD4432EDF94AB6DE18E6914A000C78DBEAB4D68549DF532F494B2D12C22D3 -9EEA08CC03183200C3273FD6B9FF00895A8C52F83B508AC6292FE795542456 -CBE6370CBD8735BD77E1CB3BAB896E26F99E42339506A5D3B43B7D365DF11C -9F5DA066912721F0CB46B2BAF0B43F6AD1DAD67595DB1736C11D4FA8C8CD65 -EA7712C3F14E1923D27507B78EC122FB42DB12991274DDD2BD559D01C1700F -D79A4470DC654F38E0E6804CF17B0D467B3F8A771A99D175536C2D258BCC16 -8D8663267AD75D378DAE755B8B9B6B7D13528ECE385D2569ECD959A4C7CBB3 -9C15AEF30A4E314EC54D9A8462FA219E21F0CE4B1D33C1C969ACF85B519A75 -1FBC5974FDC58EE623AF5ED5E95E0ED464D63484BA934E7B2B66CF956F3C26 -39570C41DCA7A74E2BA52071C520CE3381BAADEB7F313772A5B59DB69D6E52 -D6DD20404B6C8902E49F6154BC3DAE0D6E3BB6163756820B97848B984C65F6 -9FBCB9EA0F635B276F538E2B9AF1078CECB463F67855EF2F5FE58E28D4BAEE -39C6E23A0CF7A4D5E57038BF1E69D75E17F17DBF8DED191A34B75B59E27392 -C85CBB6D518CB6071CD737E3DF12DEFC49D36D34FD2340BD5B69268A479AE2 -CD959406CFCA4646315E8163E16D4BC473A6A3E219D9232C1D34F0DE6458EA -339E87922BB8B6B3B7B48962B78238514602A0C0142D2C3E8D1E1D7FE1E1E1 -7D6FC36B6FA5DFDD98E29C5C5C476E5C827A6580F7EF5A3E218E1D5FE20D8D -ADDF86EE6EEC9C90F2CB625E35FDD8EE781CD7B36D03B52E07A50B44FCC4F5 -69F63C77C1F1EA9F0E75D1E1B934FB8B9D0E67C5A4F042D218DD8EF6F30F0A -AA3381C57B021CA86231919A5DA3D051DF1ED54DDD2F212566DF738CF893C6 -9DA5E3BEA51FF235D5E9C31636F9EBE58AE57E24FF00C83F4BFF00B08C5FC8 -D757A7FF00C7941FEE0A432C51451400514514005145140051451400514514 -00514514005145140051451400514514005145140051451400514514005145 -1400514878E69016E3207BD0050D7B558F46D2EE2F643CC485957BB9033803 -BD737E07D26E099F5DBFF9AEEED98C3BB9D90B6182F3C8C1EDD2A96A771278 -C3C4F0E976E4FD82C9D6791FF864C1C321EDDEBBD8A248A258A350AA8A1570 -3A01400E4E49E31EBEE69F4D0082075E29D400514514005145140051451400 -51451400514514005145140051451400514514005145140051451400514514 -005145140051451400514514005068A2801879181D475C550D6E03259B3A7F -AC4C6D23EA2B44003381D7AD23A8742A46411D0D00476D32CF1861E95283DE -B2F45622DFC824F991E771F5C938AD303E63E9E9400EA28A2800A28A2800A2 -8A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800 -A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A28 -00A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A -2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A2 -8A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800 -A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A28 -00A28A2800A28A28010F7FA570D27FC95D87FEC087FF0046577072718F5E6B -8695BFE2EF443A7FC490FF00E8CA00EEE8A40463AD2E450014519146450014 -519146450014519146450014848146452E450034E00C8EF5C6FC44F10DEE8D -67A65AD8FEEA7D4EFA3B213020F921C11BF0460E31D2BB27C32E3D7B7AD65E -BBA4697ACD8FD9F5387CDB784F9846E236E0119C8E7B9A00F3AD566D6ACBCB -B3B3F14CCD36F10DC1FB320DEC782FFF00EAAF40D2645D1B448A1BDBCFB435 -AA0592E368CB9F5C0AF28F155BCD0589BCD2ED9ADED61BD5D3C2EEDDE65B9C -92F93C8E3F1ADFB5D2346B6D393FB3E1234BB74F2DD77B9DE4F46C93918AA5 -B0FA1D5FFC275A4C96B34F048D2F9432B98D86EFD2B13C1FF13EC35CF081F1 -06A4A6CD226612C6A19F0039518E39AE53C3F26ABA4DD8D2EDEFBFB7347B95 -6F29C42B0FD942824FBB6E27BF4C5733A26B115AF81B47BC8EEFCEB5D2A7B8 -7BF5F2F1B55DF099E3D7D334816C771A8F8C5AEBC7F690596A120B22B03B42 -62C0DA7BE48CF35BDA278C344B7B3D63503AC4B770DA4F379ECD6CCBE485E5 -940C7CD8FD6B8DBEF18E81ABF8D746FB15E2BB2FD9CB623618E07A8AA7A76A -5A7BF877C791452004FDBCE369E4E2A65F120825667A0E93F17BC25AD5FDBD -8D95FCB2493A829BADDD4364803923DEBBAAF02D5AEEC9FC1DE0010CA37C77 -5A7EFC210460722BDE126122865E43723DEB49248CD37725355AEAEE0D3ED9 -AE2E58471A72D8E6B17C45E30B2D09443BC4D7CFFEAED46417E99E71818073 -58767E1AD4FC4F3ADFF8919A3B51CAD8103E5EDF7D4827A035922C26F126A5 -E2C98D9786F30D9F496F780C9EB8461CE0D6E787FC2567A3399DDBED37F20C -C970C304E707A671D6B6ED6D23B58C450C62341F740E7156000063F3AA019B -48E3A739CFAD4949914B9140051464519140051DE8C8A4C827DE8038EF893F -F20FD2FF00EC2317F235D569FF00F1E307FB82B94F891B8D8E9600E3FB462F -E46BABD3FF00E3CA01E882802C514514005145140051451400514514005145 -14005145140051451400514514005145140051451400514514005145140051 -47B52738C679A00463D00FBDDAB9BF18788DB44D3F6DB92F7972196DD7A7CC -31EDEFDEBA291C4686466C28EFE95C0E848DE2EF10CBAEC89FE8968CA6D173 -C161956F4F4EE2803A1F08682BA2E94013BAE272D33BFBBF247E75BFCE00FC -E917AE36E075FC69F8EDEB400838E296800018145001451450014514500145 -14500145145001451450014514500145145001451450014514500145145001 -4514500145145001451450014514500145145001451450064C03ECBABCA3F8 -67C01F80AD61D39ACAD5FF00752DB5D0E911258FD462B4C36EC1F6CD003A8A -28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A002 -8A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0 -028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28 -A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A -28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A002 -8A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0 -028A28A0028A28A0028A28A0028A28A0069F53C015C34C76FC5B85B230DA39 -FF00D195DD7A8ED5E5FE24D11B5AF8A9042279210346C831BED3FEB0FF008D -007A8D15C10F8793607FC4DAE87D676FF0A3FE15E4DFF416B9FF00BFEDFE14 -01DED15C17FC2BC9BFE82D73FF007FDBFC28FF00857937FD05AE7FEFFB7F85 -0077B45705FF000AF26FFA0B5CFF00DFF6FF000A3FE15E4DFF00416B9FFBFE -DFE1401DED15C17FC2BC9BFE82D73FF7FDBFC28FF857937FD05AE7FEFF00B7 -F850077B45705FF0AF26FF00A0B5CFFDFF006FF0A3FE15E4DFF416B9FF00BF -EDFE1401DE3600C9EDCD47261D0A919561CFB8F4AE1FFE15E4DFF416B9FF00 -BFEDFE147FC2BC9B3FF216B9FF00BFE7FC2803B5FB3C42211F94BB7FBA4528 -82348FCA48D42FA638AE2BFE15ECD9CFF6B5CF4C7FAF6FF0A41F0F2619FF00 -89B5CF3FF4DCFF008501D0ED1208533E5C6887B8DB489656B1A18D6088467A -AEC1835C60F879300A3FB56E3E5FFA6E79FD281F0EE619FF0089B5CF3FF4DC -FF008503E8762B656E1B22DA1561FC42314F5B5B750FFE8F18DD9046C1F357 -15FF000AEE6C01FDAD73C1CFFAF3FE14EFF857B3E30355B9EB9FF5E7FC28EA -4AB9D65D1B0B280CF76B0C71C43765946100E73F857217BE24D4BC473359F8 -662616E0FCD7FB43C47DB1D791556FFE1536A1188E6D5AEB66FDC40B83CFB7 -4E952DAFC30165108ADF519A351D966233FA50EE35637BC3BE11B2D150CCE9 -E75EBF3248CC48279E80F4E0D748A072477AE10FC3C98907FB5AE78FFA6E7F -C283F0F26273FDAD73FF007FDBFC2811DC7099F94807A9CD483A0C1AE0CFC3 -C989CFF6B5CFD3CF3FE147FC2BC9BFE82D73FF007FDBFC2819DED15C17FC2B -C9BFE82D73FF007FDBFC28FF00857937FD05AE7FEFFB7F850077B45705FF00 -0AF26FFA0B5CFF00DFF6FF000A3FE15E4DFF00416B9FFBFEDFE1401DED21CF -63CD707FF0AF26FF00A0B5CFFDFF006FF0A51F0F6719FF0089ADD1FF00B6ED -FE140163E24E0D8E943393FDA3171F81AEAF4FFF008F2878C7C82BCABC5FE0 -F934B874B94DF4F2FF00C4C62E1E52477F6F6AF56D3FFE3CA019CE1050058A -28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A280 -0A28A2800A28A2800A28A2800A28A280109E76D1D3DF34D7201CF53D302A9E -A7A941A4D84B753C8A91C631B98F73C0FD680396F1DDECF7A20F0D69CC7ED5 -799DCC39D9B70DCFD466BAAD334F834DB18ADA24D8B18C91EE7AD72FE05B09 -EFE49FC497E8C9717B8DB1B0C797B72BD0F4C8F7AEDB1400D5FD29D4639CD1 -40051451400514514005145140051451400514514005145140051451400514 -51400514514005145140051451400514514005145140051451400514514005 -1451400514514014F5384DC584B18EAC07F3A4D32E3ED36A1BB8257F2AB679 -C7A5656900DB4F35A9EAA37E0FB9A00D71D28A28A0028A28A0028A28A0028A -28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A002 -8A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0 -028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28 -A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A -28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A002 -8A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0 -028A28A004E7273D2B8693FE4AF43CFF00CC14FF00E8CAEE4FFF005AB8499C -2FC5C87D7FB14F5FFAE9401DDE3D8518F61481B38C771DE8DC42E48E7DA801 -71EC28C7B0A5A280131EC28C7B0A5A280131EC28C7B0A5A280131EC28C7B0A -5A280131EC28C7B0A5A280131EC28C7B0A5A280131EC28C7B0A5A280131EC2 -8E07A52D14009F9518F614B4500263D8518F614B4500263D8518F614B45002 -63D8518F614B4500263D8518F614B4500263D851D3FF00AD4B4D6619DBDFAD -0071BF1247FA0E9479FF00908C5FC8D757A7FF00C7941FEE0AE53E247363A5 -02D8CEA3101CF53835D658022CE10782100E6802C514514005145140051451 -40051451400514514005145140051451400514514005145140051451400514 -51400514138A697C718E7B50023F5C8C67DFD2B81D727FF84BFC411E836C58 -595B330BD23FBC30C9D323B77AE87C59AEAE91A53B2106E25611228EB96E01 -1DFAF7A87C1BA01D1EC0DC5C8CDF5D856B97EA59867BF7EB401D1410A5BC62 -38D151474551802A4A45181D73EF4B40051451400514514005145140051451 -40051451400514514005145140051451400514514005145140051451400514 -5140051451400514514005145140051451400514514005145140083A91D874 -AC9BBCDB6AB0CE38139119FC056B7E359DACA136BE763E6872CB8F5A00D207 -2334541672192D62738C9419FAE2A6CF38F6A005A28A2800A28A2800A28A28 -00A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A -2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A2 -8A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800 -A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A28 -00A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A -2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A2 -8A2801A4F2477ED5C278D626D235AD3FC44178CC767211FC2A58926BBB78C3 -E33DB91EC6AAEA7A5DBEADA75C585D2EF86E2368DC723208C1E9F5A0092D2E -63BB823B889C4913A82AE3F881EF53E79F506BCDED25BEF870BF629E033E84 -A42C326E03C841C2AE0659B8EF5D0DAFC41F0DDC442486F8B45D9BCA71FA62 -803A81D28AC15F19E878F9AF307FEB9B7F852FFC269A17FCFEFF00E436FF00 -0A00DDA2B0BFE134D0BFE7F7FF0021B7F851FF0009A685FF003FBFF90DBFC2 -803768AC2FF84D342FF9FDFF00C86DFE147FC269A17FCFEFFE436FF0A00DDA -2B0BFE134D0BFE7F7FF21B7F851FF09A685FF3FBFF0090DBFC2803768AC2FF -0084D342FF009FDFFC86DFE147FC269A17FCFEFF00E436FF000A00DDA2B0BF -E134D0BFE7F7FF0021B7F851FF0009A685FF003FBFF90DBFC2803768AC2FF8 -4D342FF9FDFF00C86DFE147FC269A17FCFEFFE436FF0A00DDA2B0BFE134D0B -FE7F7FF21B7F851FF09A685FF3FBFF0090DBFC2803768AC2FF0084D342FF00 -9FDFFC86DFE147FC269A17FCFEFF00E436FF000A00DDA2B0BFE134D0BFE7F7 -FF0021B7F851FF0009A685FF003FBFF90DBFC2803768AC2FF84D342FF9FDFF -00C86DFE147FC269A17FCFEFFE436FF0A00DDA2B0BFE134D0BFE7F7FF21B7F -851FF09A685FF3FBFF0090DBFC2803768AC2FF0084D342FF009FDFFC86DFE1 -41F1A68407FC7EFF00E436FF000A00DDA6B019CB741CFD2B066F1BE8304664 -7BDE07FD336FF0AE7353F155FF008AE27B0F0A828B3031B6A1C7EE49E09D8E -0671906801FE2063E28F13D9E9901DF0583A5E3B760C8E411FAD77EA415047 -43581E14F0E47E1CD3BCAF33CFBA93F79753E31E6CA40DCD8C9C648E838ADF -5E541F5A005A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28 -A2800A28A2800A28A2800A28A2800A28A2801AD8C8CFE14C9A510C6F23F0A8 -0963E8BEB4F719E3AFF4AE3FC73ABCCA2DF43B03BAE6F195251FDD85B2A5B9 -FE5D6803374F824F17F8AA4D4DD73A7D8335BA21E439072AFF00AD7A18181C -9CD66E85A445A369705947C98902337F78818CD6905DA30BC5000BE9E94B46 -28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A002 -8A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0 -028A28A0028A28A0028A28A004EA41A8EE231710BC47F885498E94639CD006 -6E8EFBA392263F3472B003D8568839C9F435971E2DB59913F85E2CFE24D6A1 -381C0EA79A0070E94514500145145001451450014514500145145001451450 -01451450014514500145145001451450014514500145145001451450014514 -50014514500145145001451450014514500145145001451450014514500145 -14500145145001451450014514500145145001451450014514500145145001 -45145001451450014514500145145001451450014514500145145001451450 -01451450014514500145145001451450014514500145145001451450014514 -50014514500145145001451450014514500145145001451450044F10972ACA -A57B8619CD664DE19D2AE642EF6E01EE14915AF8A0A83401863C23A330CFD9 -C9F7F30D2FFC21FA37FCFB37FDFC35B98C5140187FF087E8DFF3ECDFF7F0D1 -FF00087E8DFF003ECDFF007F0D6E5140187FF087E8DFF3ECDFF7F0D1FF0008 -7E8DFF003ECDFF007F0D6E5140187FF087E8DFF3ECDFF7F0D1FF00087E8DFF -003ECDFF007F0D6E5140187FF087E8DFF3ECDFF7F0D1FF00087E8DFF003ECD -FF007F0D6E5140187FF087E8DFF3ECDFF7F0D1FF00087E8DFF003ECDFF007F -0D6E5140187FF087E8DFF3ECDFF7F0D1FF00087E8DFF003ECDFF007F0D6E51 -40187FF087E8DFF3ECDFF7F0D1FF00087E8DFF003ECDFF007F0D6E5140187F -F087E8DFF3ECDFF7F0D1FF00087E8DFF003ECDFF007F0D6E5140187FF087E8 -DFF3ECDFF7F0D1FF00087E8DFF003ECDFF007F0D6E5140187FF087E8DFF3EC -DFF7F0D1FF00087E8DFF003ECDFF007F0D6E5140187FF087E8DFF3ECDFF7F0 -D1FF00087E8DFF003ECDFF007F0D6E5140187FF087E8DFF3ECDFF7F0D20F07 -E8D93FE8E7E9E61ADDA42B9C83DFD28031A1F09E8F6EE1D2D4EEF7726B4E3B -68A0044312C671C102A603031FCE90A648E781C8A00401B6800E0E727DE9E2 -9BB32724F3ED4E031400514514005145140051451400514514005145140051 -451400514514005145140051451400514514005149919C5206CF623D8D0054 -D5AFE3D2AC27BE9480902176C9C64019AE53C19632EA57D75E26BC52649D99 -2D811C7904865C763F5A8FC4B74FE23D76CF43B17DD6F13ACD7920E51E3C95 -64047F17D6BB3B6B58ECEDE2B78976C5180A83D00E9401607233EB4B480629 -6800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A2 -8A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800 -A28A2800A28A2800A28A2800A28A2800A28A28032758531CD6B3AFFCF550DF -4AD3460E9B8743C8AAFA8C5E6DACA31CAA12BF5C5269B3092CE2EB95011BEB -8A00B83A514514005145140051451400514514005145140051451400514514 -00514514005145140051451400514514005145140051451400514514005145 -14005145140051451400514514005145140051451400514514005145140051 -45140051451400514514005145140051451400514514005145140051451400 -51451400514514005145140051451400514514005145140051451400514514 -00514514005145140051451400514514005145140051451400514514005145 -14005145140051451400514514005145140051451400514514005145140051 -45140051451400514514005145140051451400514514005145140051451400 -51451400514514005145140051451400514514005145140051451400514514 -00514514005145140051451400514514005145140051451400514514005148 -58038A5A006B0CF1DCF4AC5F156BABA0E952CE006B9652218C7576F4033935 -B2EE10827A1EFE95E7D6864F1978A1A693E6D2EC0AC9003FF2D1B1B581EA31 -F4A00DAF04F87DB4AB37BBBA3BEE6E9CCB96E4A86C1C7233C575079C508A15 -428E00E8076A71E94008BDFEB4B40E94500145145001451450014514500145 -14500145145001451450014514500145145001451450014514500145145001 -45145001451450014514500145145001451450014514500145145001451450 -01451450035806254F422B2F4A7315CDCDB37FCF4675FA56A907208C7BD64D -C836DAAA4C38475087DC93401AF4503A514005145140051451400514514005 -14514005145140051451400514514005145140051451400514514005145140 -05145140051451400514514005145140051451400514514005145140051451 -40051451400514514005145140051451400514514005145140051451400514 -51400514514005145140051451400514514005145140051451400514514005 -14514005145140051451400514514005145140051451400514514005145140 -05145140051451400514514005145140051451400514514005145140051451 -40051451400514514005145140051451400514514005145140051451400514 -51400514514005145140051451400514514005145140051451400514514005 -14514005145140051451400514514005145140051451400514514005145140 -05145140051451400D270091C9A33D0375346739C75CF355EF2E63B2864B89 -5B0A9401CBF8FB59B9B5B68B4AD3DCFDB751CAC454F29B48279E838CF5ADCF -0FE8B0E85A5C5650280A996CFF00B44E4FEA6B98F07594BAF5FDCF89AED729 -395FB283FC1B72ADF9E3B8AEEF0781D00FD680140C0A5A0514005145140051 -45140051451400514514005145140051451400514514005145140051451400 -51451400514514005145140051451400514514005145140051451400514514 -00514514005145140051451400514514009EB59FABC45ADE391473148B21FA -0E6B4307767DAA2B98CCB0488064BA15FCC5002DBCA2E208E65E8EA185480E -6B37489408DEDC1C8B73E5B7B115A408CF1DE801474A28EB45001451450014 -51450014514500145145001451450014514500145145001451450014514500 -14514500145145001451450014514500145145001451450014514500145145 -00145145001451450014514500145145001451450014514500145145001451 -45001451450014514500145145001451450014514500145145001451450014 -51450014514500145145001451450014514500145145001451450014514500 -14514500145145001451450014514500145145001451450014514500145145 -00145145001451450014514500145145001451450014514500145145001451 -45001451450014514500145145001451450014514500145145001451450014 -51450014514500145145001451450014514500145145001451450014514500 -14514500145145001451918CE7A5191EB400C232DE8474F7AE13C633CBE23D -4E1F0D5A36D46C9BA7C7FAB2B8651F8FB574DE26D65345D2E49D88DEFF00BB -8C6792CDC0FD6B1FC0FA3CD6D6736A57EACD7F7A434C1860A9190300F4E280 -3AAB4B68ED2DD208976A20E054D483A734B400514514005145140051451400 -51451400514514005145140051451400514514005145140051451400514514 -00514514005145140051451400514514005145140051451400514514005145 -140051451400514514005145140051451401910FFA2EACD17F0DC6E90D6B60 -7E5597AC8F25A1BA1D558267EA6B4C302010720F7A00751451400514514005 -14514005145140051451400514514005145140051451400514514005145140 -05145140051451400514514005145140051451400514514005145140051451 -40051451400514514005145140051451400514514005145140051451400514 -51400514514005145140051451400514514005145140051451400514514005 -14514005145140051451400514514005145140051451400514514005145140 -05145140051451400514514005145140051451400514514005145140051451 -40051451400514514005145140051451400514514005145140051451400514 -51400514514005145140051451400514514005145140051451400514514005 -14514005145140051451400514514005145140051451400514514005145140 -051451400514514009C1CF1ED4C76541F310AAA3258F000A5FE22D9E00C62B -96F1B6B4D6B6A9A6DA9DF777CC21509CB2ABE57771C800F7A00C9691FC67E2 -9F2802DA669CCC8E7F859C1CA9EE0D7A000AA0ED00563F863424D074C8EDB8 -33B2A99DC7F1B818273DEB608C8C0E2801C28A07228A0028A28A0028A28A00 -28A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A -0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A2 -8A0028A28A0028A28A0028A28A0028A28A0028A28A00A9A943E7DABAE3EEFC -DF88A8F4898CF631331F9803B87E26AE38CA32FF007B8ACDD34FD9EF2E6DBA -0046DFCB3401AA0E4514514005145140051451400514514005145140051451 -40051451400514514005145140051451400514514005145140051451400514 -51400514514005145140051451400514514005145140051451400514514005 -14514005145140051451400514514005145140051451400514514005145140 -05145140051451400514514005145140051451400514514005145140051451 -40051451400514514005145140051451400514514005145140051451400514 -51400514514005145140051451400514514005145140051451400514514005 -14514005145140051451400514514005145140051451400514514005145140 -05145140051451400514514005145140051451400514514005145140051451 -4005145140051451400514514005145140051451400514514015EF2E16CEDE -5B890FEEA352CFECA064D713E16B593C45AF5D7886EC66185DEDED50F42808 -656FAF35278CEFE7D4B53B5F0D58B732B2BDDE3FE78B12ADD7FA1CD75DA758 -45A6D9416908C25BC6235F70062802E51403919A2800A28A2800A28A2800A2 -8A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800 -A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A28 -00A28A2800A28A2800A28A2800A28A2800A28A2800A28A280108CD655D116B -AADBCBFC3206DDF9715ABC67359BAE45BEC99C7DE52307F1A00D31D28A8ADA -51342AE3BD4B40051451400514514005145140051451400514514005145140 -05145140051451400514514005145140051451400514514005145140051451 -40051451400514514005145140051451400514514005145140051451400514 -51400514514005145140051451400514514005145140051451400514514005 -14514005145140051451400514514005145140051451400514514005145140 -05145140051451400514514005145140051451400514514005145140051451 -40051451400514514005145140051451400514514005145140051451400514 -51400514514005145140051451400514514005145140051451400514514005 -14514005145140051451400514514005145140051451400514514005145140 -051451400514514005145140051451400DEB95538C56578875A8741D2A7D42 -5E5914955FEF11DAB518E707B77AE0AEE46F1978A20B64E74FD34ACC48FE32 -7208CD005FF046972A24DAD5E266E6F9CBC64FF0C4D8651E95D791D81C6793 -51C71AC50AC483E551B463B0A9070A07A5003A8A28A0028A28A0028A28A002 -8A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0 -028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28 -A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0043C53254DC8 -C3B9A7FAFD683F787A50066688FB2D3C83F7A2EA3EA4D6963A62B2A226D358 -917F86E08C7E02B5470E4F6A007514806296800A28A2800A28A2800A28A280 -0A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2 -800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28 -A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A -28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A280 -0A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2 -800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28 -A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A -28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A427047 -069691B9E338A00427D0807DE9475CFB7E1556EEF2DEC23F32E678A241CEE9 -5C0FE75CDDD7C44D3EDD8AC361A8DF2838DD676FE60FCC1A00EBE8AE23FE16 -75AFFD0BDE20FF00C17B7F8D1FF0B3AD7FE85EF107FE0BDBFC6803B7A2B88F -F859D6BFF42F7883FF0005EDFE347FC2CEB5FF00A17BC41FF82F6FF1A00EDE -8AE23FE1675AFF00D0BDE20FFC17B7F8D1FF000B3AD7FE85EF107FE0BDBFC6 -803B7A2B88FF00859D6BFF0042F7883FF05EDFE341F89D6BFF0042F7883FF0 -5E7FC6803B6CE38140CE39AE23FE1675A819FF00847B5FFF00C179FF001A6C -BF146CA08CC92683AFA8F7B13FE3401A3E35D7A5D274AF26CD0B5FDCFCB6E8 -064E4119E073D3D2AD7857408F41D396304C92CA4BBC8796E79C66BCCB4CF1 -C26B5E23975DB8D135D9ECA320DA2AD9330076ED6E338EA3B57669F136D002 -ABE1EF100C74CE9E7FC6803B8C5277C122B8EB6F891612B05974AD5ED013CB -DD5A9451F8935D2D9EA769A94624B3B8865047F0B8247E54017A8A07414500 -14514500145145001451450014514500145145001451450014514500145145 -00145145001451450014514500145145001451450014514500145145001451 -45001451450014514500145145001451450014514500145145001451450014 -5145001451450064EB20C52DBDD0E91673F8E056A03B947B8AADA9C1F69B47 -87BB0E3F3A4D327FB45B2C99CF51F91C5005C14520A5A0028A28A0028A28A0 -028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28 -A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A -28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A002 -8A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0 -028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28 -A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A -28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A002 -8A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A00290D2D1 -DE80139154F54D46DF4AB37BCBA7D90C78DCDE99381573A9AE23C7A5B55D47 -49F0D9E6DF52F33CDFF8000C3F51EB40146C749BFF001C5E0D5F5391EDF4E5 -6FDD59E72926383B94F41C035DC69FA6D9E99188ACEDA3857FD850B5343024 -11242830A8A0114E92648BEFB81E828192127BE073484E3AE7F0AE4E4F12DE -47E364D124B441686C85C898CA3AEFDBD3E95D31BA89D4B2DC2801B19C8FCA -8026FE1C64FD697A9CE78A81E75452E640000580F5159DA2788AC35E81E5B0 -977226371208C75F5FA54BDC4D1B00E6909008A860B88AE32C8C187AE79FCA -BCE6FF00E30E99A7F88BFB0DF26E4B0509B5B0727039C62985CF4C19E99CD2 -8391CF6AAD6B771CD0432B611A550C1739EA299AADC496FA7DCCF0F32451B3 -AAF4C9009C50DF2822DB1207033EC6B8AF1CEA735D4B6FE1BD3DDBEDB7D93E -6A1E62DA431048E9919EB58B6FE3CD765D0753D49EC5125B39D6254F387CC0 -8CE738A8FE116AA9E2C86F7C4975C5ECCCA594FF00CB3FBCBED9C81E94D7BC -0CF48D36C61D32C62B38144688380A303939356771247B75AF30BBF89B7B2F -C424F08DA69EA612C01BBF37047EEF7FDD239F4EB5A11F8B75DBAF175E787A -DEC948B3B68EE1A7F3402DBCE318C76A5B252EE369EBE477575676D7C863BB -B78E6888FBAE339AE1F59F0F5EF86EE86B3A1362DA36CCF66A76204CE58803 -A9C0031537847C7573ADEB97DA06A164B69A85A06942AC9BC3441B686C818C -93DABB368C4C1A2917746CA437BD54A2D3B3279B6F32B689AD5B6B9629776C -C70CA0B29182A48E8476AD0E49233F8D707E1D47D03C5B79A667F757EF25C4 -6BFDD55E315DE63236FEB4863A8A28A0028A28A0028A28A0028A28A0028A28 -A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A -28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A002 -8A28A0028A28A0028A28A0028A28A0028A28A006B2E581F4AC9D28F91733DA -740832076E4D6BF4359370BF66D5639BB4CC14FE028035E8A4072296800A28 -A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A -28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A280 -0A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2 -800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28 -A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A -28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A280 -0A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2 -800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28 -A2800A3BD1450002B88D6CFF00C57FE1C4EDFBFF00FD162BB71D2B87D7067E -2078747AF9FF00FA2C50076A580F9B7702BC6FC6A97FA378A6EF5F685B55D2 -9EDD629E20E2216A8396973D5B18C631DEBD8C9C92A3823BD73979E06D1AFA -FE7BE9E07696E23F2A63E6B6D64F4C6702819C3DDE93A478BFC5BA6C170A66 -B197438E4100765E0B75DC083D0D73A7E1FDA79BABE9BA76FF00B1D8DDBDE4 -681D8EC68C70992D93F5AF5DBFF06E8FA8B5B19AD9D4DB46B144CB2B2FC8BD -0706B335790782F4E78B44D06EF5137526D9042E0956618C9DDF414D02392F -0ACD69F10BECBAE4F0B25C6936B25BDCC7BCFCAEEA4F3D07E86B97D3D61D0F -E165C5EE9D3FD92698C7BAE397C7EFB1F74FD48AF6AF0A6902CB480F35A9B7 -B8BB5DD7111E0EEE9CFE159F6DF0CBC3168D7823B19025E6DF354CEE54E3A6 -0678FC2A3AFF005FD5824EE62695E0F5D33C4D6DAC26BBB63BA003DB7939F3 -B6A6319CFCB8CE6AFCDF0BB4493556BBF2F6C4E436CCB1CB67279CD687867E -1C7873C25712DC6996D3A3CB8DCD2DCBC838CF40C4E3AD754A38EBB8F623B5 -5326C614BE1BD1FEDD6733478B8B654588EF6E02F418CD686ADBC69D7A0FDD -F21CEEF4E0F155EF7C39A6EA3A9C3A95C23B5CC1B76159580CA9C8E01C1ACE -F1DDEDBDB6872DAC99F36FB36D1A86C1DCE081FAD297BC34792E9E1F5EBABD -D2A46C6969386B87F4900CA8F5FCAA5BFBE97E1878BC4FA7446E74FF001012 -FB01DA13CB5DBD4E49E4FB5767E13F84BA35A7878417D0486E2E4ACB71899C -12E3F1E2BB0B6F0C68F15BDB411DB6E8AD81109772D8C9C9E4D387BBB833CC -AEB4E1A5F8EBC176B110F3473DC34E7A120C791FCEA1D76D35DB9F895E22FF -00846B52FB25FA6956E540855F772703E6E2BD12FBE1EF87350D6E2D72E2D6 -56D423394713B800EDDBD01C74A5B5F87FE1FB7D7BFB762B5953500AAA6433 -B9042F4E338A96AF18AED729BF8BCCE3BE114D612CBA83CEC0F88926922BB6 -3905C023271F747CD9E95EA6A595BE6E335853781B439B5D5D78DABADFAA84 -DE92B282036E195071D6BA0E83D3B0CD6B395E5732B6C7177591F1334A1EB6 -13E7F315DC1518C76AE1EEF3FF000B3749C9C9FB04F9FCC577350585145140 -05145140051451400514514005145140051451400514514005145140051451 -40051451400514514005145140051451400514514005145140051451400514 -51400514514005145140051451400514514005145140051451400514514005 -145140084641159FACA816BF69C7307CE2B43A1FAD453C42785A2619571834 -00B6CDBE046273900D4B595A1CCC6192293EF2C84007D2B57DA800A28A2800 -A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A28 -00A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A -2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A2 -8A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800 -A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A28 -00A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A -2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A2 -8A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800 -A28A28001D2BCD7C71FDA7FF00099681FD96F02CFF00BFC79C091F707A7E35 -E943A570FAD807E20F873233FEBFFF00458A0040BF10CED2D368C3E9149463 -E21963FBDD1F18C7FA992BB6046371A729245007118F887C7EF747E3FE98C9 -415F8827ABE8A79CF30C95DC51401C391F10C907CED1F8FF00A6325007C431 -FF002D747FFBF325771450070E47C43247EF747E3FE98C94BFF170FF00E7AE -8DFF007E64AEDE8A00E1C7FC2C339FDEE8DFF7E64AC6BDF0F78EF53D560D42 -E67D28BDBA8544F2E4D9C1C838F5AF51E2900E680388C7C43FF9EBA37FDF99 -2902FC4207225D1FE9E4C95DCD1401C391F10CE3F7BA3F1FF4C64A08F88648 -3E768FC7FD3192BB8A280387FF008B879CF9BA3FFDF9928C7C43CFFADD1BFE -FCC95DC51401E5DA69D7FF00E166699FDB86D73F619F69B74650791EB5E9E5 -B032457137A08F8A1A4EE6C836171819E9C8AEDB24B10471DA801D45228C0E -B9A5A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0 -028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28 -A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A -28A0028A28A0031920FA5211918A5A2803240106AE53A46D102BEED9AD43B8 -60F7CE2B3756431C96D70BFC328DC7DAB46371222B8E8C01A007818A28A280 -0A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2 -800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28 -A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A -28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A280 -0A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2 -800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28 -A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A -28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A280 -0A28A280101EBED5C46B791E3FF0DB7427ED1C7FDB315DC570BE3A234CD6F4 -3D764245B58F9DE6903A6F50A3F5A00EDD0875E071EE2954E4E474E94C865F -3A357E30E011839A7AF5E3A5003A8A28A0028A28A0028A28A0028A28A0028A -28A0028A28A00463B413E94D572DCF41D7DE95B3F88E6A29A68E0469A4C0DA -8598FA2F7A00E3AF194FC4FD27824FD827EA3A722BB7E793F95705E1B91F5E -F165D6ABB330D9192085CFF12B739AEF31B71CF02801C39145145001451450 -01451450014514500145145001451450014514500145145001451450014514 -50014514500145145001451450014514500145145001451450014514500145 -14500145145001451450014514500145145001451450014514500145145001 -451450055D4A2F36CA651D761C7D699A5CA5ECD17BC6021FA8157080C306B2 -F4B630DD5D40DFC523483E99A00D51D28A074A2800A28A2800A28A2800A28A -2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A2 -8A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800 -A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A28 -00A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A -2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A2 -8A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800 -A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A28 -00A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800ACFD6748B6D7 -34F96C2ED37C32E370C91D0823A7B8AD0A4601860F43401E75E1FD6EEBC1EE -741F125C994EEFF44BDD8079D924EDDAB9DBB410324F35E8105C47322BA382 -AC322A0BFD36D35481E1BC883C6C3047423F1AE5DBE1A6928E45ABCD121E76 -999DBFAD00769BD7FBC3F3A37AFF00787E75C57FC2B7B3FF009F897FEFE3FF -008D1FF0ADECFF00E7E25FFBF8FF00E3401DAEF5FEF0FCE8DEBFDE1F9D715F -F0ADACFF00E7E25FFBF8FF00E347FC2B6B3FF9F897FEFE3FF8D0076BBD7FBC -3F3A37AFF787E75C57FC2B6B3FF9F897FEFE3FF8D1FF000ADACFFE7E25FF00 -BF8FFE3401DAEF5FEF0FCE8DEBFDE1F9D715FF000ADACFFE7E25FF00BF8FFE -347FC2B6B3FF009F897FEFE3FF008D0076BBD7FBC3F3A37AFF00787E75C57F -C2B6B3FF009F897FEFE3FF008D1FF0ADACFF00E7E25FFBF8FF00E3401DAEF5 -FEF0FCE8DEBFDE1F9D715FF0ADECFF00E7E25FFBF8FF00E347FC2B7B3FF9F8 -97FEFE3FF8D007517FAAD9E9F0BCD753858D5493C13D3E95C25C6BBAAF8E2F -CE99A3C260D140FDFEA19077E0E1A2D8C030CA90770ADAB6F875A2C13ADC4A -259665C60999F1C74E338AE9A1B58ADE3548D151063000C73EB4010E91A4DB -68D6315A5A2ED4450B9C939C0F7ABA57208CF27BD3874A2800A28A2800A28A -2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A2 -8A2800A28A2800A28A2800A334521CD002D19A69E7F8685E074C5003A8E7D2 -9319ED4605002D048148463A0CD264FA6DA007519C5276EB9A4E0741400EA4 -DC338CF34873FDEC7E148645419661400FCD155DEFADA3FBF3A8FAD40FAD69 -AA3E6BC8FF003A00BF49B85661F11E911FDEBE887E26A26F16684A0EED4A01 -F89A00D9A2B04F8CFC3A9F7B55B71F563FE14C6F1EF85D7AEB76A3F13FE140 -1D0E68AE67FE162784875D7ED3F33FE14C6F891E0E1D75FB4FFBE8FF008500 -75345729FF000B33C207EEEBB68C7D98FF008521F891E193F7753B76FA39FF -000A00EB28AE47FE164787FF00E7F61FFBEFFF00AD49FF000B1F413D2EE1FF -00BEFF00FAD401D76E14B9AE43FE16368FFC32C647AEFF00FEB534FC46D2BB -489FF7DFFF005A803B1A2B8DFF00858BA71E422B0F5127FF005A8FF858B61F -F3C47FDFCFFEB500762738E2B2AEC9B7D4E29BB3A88C8F726B9DB9F8850490 -48B6F1059369DA77E79FCAB9BBCF11DD5F2EE9EE94007206D039A00F5833C6 -AC10B618F4152120578F59EABE4DC2DC17240EA0B75AEB23F88768A814C192 -3BF99FFD6A00ED68CD7183E225A7FCF0FF00C89FFD6A5FF858B65DE0FF00C8 -9FFD6A00ECB20D15C69F88B63DE30BF593FF00AD4A3E22E9DDC2FF00DFCFFE -B5007639A2B8FF00F858DA5FF13228F5327FF5A8FF00858FA3779A3FFBEFFF -00AD401D8515C80F88DA2779E21FF03FFEB53BFE16478747DFBE813EAE7FC2 -803ADA2B931F133C29FC5ACDAAFF00C08FF85387C4AF081EBAEDA0FF00811F -F0A00EAA9370F5AE63FE164783BFE83F699FF78FF85397E217851BA6BF687F -13FE1401D3519AE7C78EBC30C38D66D8FE27FC29EBE33F0EB74D62DCFE27FC -2803768AC71E2BD09BA6A501FC4D4ABE22D25FEEDF447F13401A7466A92EAD -64FF0076E11BE86A55BEB76E932D0058A3F0A6AB249CA9CD28005000580EA6 -8041E941FAD27E19A007514981DC51C5001B852D3727FBB4B81E940067D680 -C09C034B8A3140099E6973484E3B5283400514514005145140051451400514 -51400514514005145140051451400514514005145140051451400514514005 -14514005145140051451400514514005145140051451400514514005145140 -05145140051451400514514005145140051451400514514005145140051451 -40051451400514514005145140051451400514514005145140051451400514 -51400514514005145140051451400514514005145140051451400514514005 -14514005145140051451400514514005145140051451400518A28A0066D241 -C919A7014B4500145145001451450014514500145145001451450014514500 -20502936F3B8F5A75140051451400514514005145140051451400514514005 -14514001207538A4CFB50718E4669A3DB3F8D003E8CFE350CB71140BBA5951 -00EA59B005665CF8B340B52565D5ACD5BD3CF5CFF3A00D8C8C64F1F5A5C823 -239AE4AE3E2069B0E7C8B6BCBFF4FB2A0933F4E6AA378F2F2E78B4F0DEAF19 -3D0CD6840FD0D0076F91DF8FAD191EB5C4AEA9E36BC1FE8965A7C20F4FB547 -203F8E290E9FE3DBAE2EA7D2231FF4EED283401DC66992CD1C23323051EA4D -70E7C11AA5CF375ADDEC64F5105CB01FCA962F8636E0EE93C45AEC83FBAF77 -9FE9401D5C9AEE9717DFBF817EAE2A9CBE32F0DC3FEB35BB14C7F7A602B3A2 -F87FA647CB5CDE4BED2383FD2AF45E0ED163C17B0B697FEBAC4A73FA50042F -E3FF000E67116A96D39FFA672A9FEB5037C40D3413E5C13CBE9B369CFEB5AE -9E1BD0E3FF0057A458AFFBB6E83FA54E9A469C98DB636E31E912FF00850073 -6FF10D47FAAF0FEAD3FF00D73881FEB50B78FAF6427CBF08EBA3D09B718FE7 -5D8A5B5BC7F72045FA201520C0E0600F4A00E20F8AFC4137FA9D0EFA2FFAEB -6F49FDAFE309FF00D55AF97FEFC15DCF1ED47E42803842FF0010263FBAB8B1 -8BFEBA407FC293EC3F12E4E7FB5B4755F430B67FF41AEEF93E94A33DE80383 -FEC1F1DCBFF1F1AB69C7FDC561FD297FE113F12BFF00ADD52DCFFBACE3FA57 -7941E39A00E14781F5293FD76A44FF00B9338A5FF857424E25D42EBFE0374E -2BB7E7AD28E79A00E1FF00E15769AFFEB6FB523FEEDEC83FAD3D7E15E88BCF -DB3553F5BE93FC6BB6A0D0071E9F0D3454FF00978D40FF00BD76E7FAD4CBF0 -FB475FE2BA3F59DABA9E3D28E73ED401CDAF813475ED39FACA4D4CBE0CD217 -1FBA63F56ADFA2803117C25A42FF00CBB03F5C54ABE18D257FE5CE23F541FE -15AD4500668F0F6923FE61F6C7FED92FF8548343D287FCC36D3FEFC2FF0085 -5EA280288D174B1FF30DB3FF00BF0BFE14BFD8DA67FD03ED47D215FF000ABB -4500531A569A3FE5C2DBFEFCAFF852FF0065E9FF00F3E16DFF007E57FC2AD7 -0793DA8CE79ED40157FB36C074B1B6FC225FF0A5FECDB1FF009F2B6FFBF4BF -E156463B51F5E7E94015C69D638E2CE01FF6C97FC28FECFB2FF9F383FEFD2F -F85581C8C818FAD2D0056FECFB3EA2D20FFBF63FC293FB3ACFFE7D60EB9FF5 -63AFE5568514015BFB3AD0F5B587F08C7F851FD9F663A5A41FF7EC7F8559A2 -802BFF0067D9FF00CFA41FF7EC7F8527F67597FCFA41FF007ED7FC2ACD1401 -5BFB3AC475B483FEFDAFF851FD9D6247FC79DBFF00DFA5FF000AB2693383ED -40158E9B63FF003E56E7FED92FF85074CD3C7FCB8DB7FDFA5FF0AB3FAD1D68 -02AFF6569E7FE5C6DBFEFD2FF8537FB274DC73616C7D8C2BFE1573391C5213 -FC5CD0054FEC7D30FF00CC36D3F1817FC293FB1B4B3C7F66D9FF00DF85FF00 -0AB849EB8A518EB8A00A0742D28FFCC3AD7FEFC2FF008531BC3BA49FF970B7 -1F4897FC2B4B27B0A3A7AD00649F0BE92DFF002E718FA28FF0A88F847486FF -00976C7D315B7D7D68CF38E680300F82F476FF00964E3E8D513780F477CF13 -8FA4A457498C7AD19CFA8A00E51FE1C68CFF00F2D6F47D2E58542DF0C7443F -F2F1A88FA5DBFF008D76271D09A4C638E4E68038A6F859A3B1E2F3541F4BE9 -3FC69A3E1858C63115FEA2076DD7B21FEB5DB8F9463926957A75CD0070DFF0 -AF658FFD4EA371FF0002B9734D3E09D5A3FF0055A97FDF52B9AEF28EF401C1 -FF00C233E2C8BFD46AB683FEBA163FD290E8DF1063188B57D287FBD1B1FE95 -DE63B9A3AF6A00E04D9FC4B8793AA69122FA2C2D9FE54E13F8F22C798D6B21 -FF006203FE15DE12071484671C9FC2803871ADF8B22389AC24931DE38294F8 -C35A88FEF7C3BAA4A07FCF2B71FE35DC7B526483D38F6A00E2D7E20DD2F12F -8475D5FF0068DB8C7F3A993E21407FD6E8FA8C3FF5D1147F5AEB982B0F9803 -EC6A17B1B493EFDB42DF54068039E4F881A4FF00CB6DF07FD742A3FAD4E9E3 -DF0C370DAD59A1F46997FC6B51F45D2E4FBFA75ABFD6153FD2ABBF85F427EB -A358E7D7ECC99FE5400D8BC5BE1F9FFD56B166FF0049455C8F58D3A5C7977B -0B67A61C564CDE08D164FB96CB0FFD72455FE954A5F875A7499DB7FA845FF5 -CE5031FA50075AB22B8DC8430F514ECD708DF0D7636E87C47AC81D81BC38FE -54A3C29E21B4FF008F3D59A503A7DA6773FC8500775466B865B5F8856A330C -9A2C8BFF004D4CA4D27F6FF8BAD06DBED322988EF670C847EA6803BA240EBC -526EC7D3D6B8A5F884D19D971E1AD714F77369F27E64D5EB7F1DE8F2102EA4 -365FF5F05507EA6803A7DC07538A5C823239ACBB6F10E8F7A716FA9D9DC7A0 -8A656FEB5A4A55C0653C7B500381A4DC338CF34D032C7EF7E3D294E33D3F1C -500385140E9D73450014514500145145001451450014514500145145001451 -45001451450014514500145145001451450014514500145145001451450014 -51450014514500145145001451450014514500145145001451450014514500 -14514500145145001451450014514500145145001451450014514500145145 -00145145001451450014514500145145001451450014514500145145001451 -45001451450014514500145145001451450014514500145145001451450014 -51450014514500145145001451450014514500145145001451450014514500 -145145001451450019C526E00E286E9EDDEA365CE47452BC9A00C4F11F8BB4 -EF0FAAACED24B3B91B61B7019FBF38CE719EF5869AAF8BF5E05AC2DACADAD5 -BA34A5D25C573E40D0BC7F71A8F882C564B7911D2D6F082EE885FE54017A0E -09E6BD42D6FACEEA05920991D187033CFE5401CAC5E05BCBB6F3350F106A44 -FF00142930287F315A16FE04F0FC6374F610DD37F7EE23527F957483006ECE -45711E30D66F23D7F45D02DEE1ADD351791659D4FCC815430C0EF401D45AE8 -9A559EDFB3585BC58E8638C0C55E564C6148C7B57093E9BAEE8F65AC799AFD -CC907D909826664DD137F780AE3EC7C51AE5BF8ADF4BB4BF9AF564D14491AC -A4286B8240DDF8FAD348695CF6B3228CFCC38E4927A5456D7D6F76D2AC122C -8626DAFB581C1FC2BC9344F16A6AF79A8E9973ACDDC1AB43692C735A7947CB -0470CE1C8C120F03079AD6F849A64B6BFDB1236A53DC86B952778033F2D04B -D19DF6ABAC5B68F66F7773BB6263E55C6E3938E07E358DA8F8D2D74AB3B496 -E6290DCDD9611431AE58E3AF19CF4AE6FC75732CFF00103C25A56E2D677697 -26688FDD7DAA0AE7E86B47C59A0EA32EBDA56B3A6E9D0DE4B62EED89240BB7 -2817D6868D1A561975F152C2D4DB40DA7DF9B9BA731C58B725738CF3CD76D6 -B71F68B586661B4C881B6B718C8E95E3B3EBD756DAADA08D3EDD3492E2C239 -4E019B1F30CF6E3BD755A8EB9E219340B976B38A1BD8519D963941D985EC7B -9CD1632BBB9DD4B7115BC6D24AEB1A2824B120003EB443750DC429342E248D -D432B290411EB9AF1C9B5D8FC4DE06D5026B77525C436B2ADCC7247B4AB88F -E65191C8E7AD64F93AF5A782FC291697E25BEB317569003E56D1B41C0E323D -294B4B58B76516CF7CDCA7A31FC0D26547A1F7AF27BE1AE786BC41E1AD30F8 -8EF6F44B0CE666976833100104E076CD53BFF18EADE1FD5BC72CD7B25E43A6 -ADA1B78243F2A6F5F9B18F5CE69A574C5F6A2BB9ECA2418CF4C5416D7F6D7A -18DBCB1CBB58A9D8C0E08FA570EFA1EB9732693791789AF44064DF731E5312 -211F74F1C8CD61FC0BB4916D759B87BB924FF8994F1F96C063AAF3F5A2C396 -89DBA3B1EB99E3D3E94A38CF24FD69990DD0F4346430383839A4C438B80334 -85D770191F8D34821810319EB5E4DE2CF15DE68DE28D42CF57BF9F4DB09CC7 -FD9D3C0A64E8A0C99C03B792073D73537292BA3D0AFF005E367ABDAD87D9E6 -7FB4BED0E884AAF19E4F6ADA571B73D2BCAFC55AE6AFA778EFC256D69AA4ED -63A95C6C9E0046C2A101FD735EA38CA818C83D6ADAD22FB9287EF1587E2BF1 -247E1BD392F1E392553284C46BB88CE7DFDAB13C43AB5D4FE23B5F0FDBDE3D -83322CFE647D586E2BB79E2B1F5CD2B55D2B46BF5D43549EF924BC3245E695 -251369C018A8836E0DB07A1E83A36A89ABE996D7EAA563B84DEA186081EF57 -C118C83C5796A5FDCDAE91E1F78B5196DAD0D8B178E3C12ED93838EB5976BE -29F124BE0AD4BEC57125D5FD9F97FBC7601B0CFCFE99A1303D904AA5770FCA -943A9E841AF2CB7F135D6B3E16D56FBC2FA9CFA85FA227951DC2F92636DD83 -F780EBCD5EF879E28B7D7EF2E546A57125CC512ACF69246555181C31048E72 -735A580F45DE2A01A8DAB5C7D9D664336376C0C09C7D29EDD381C62BC8F4CD -16E65F887A9C91EAB70923C13842A07EEC17E00FA5669DEAA8F4B3627B37E6 -7AF79CBEF4EDE2BC8348F10EAFA64DAFE95AA6A334B731DF225948E41668F6 -F278E9C9AA9AEFFC2490F8EFC3BE1B8BC59A8C70DEA4E66601724AA6E1DAAA -3AC92E8C6F4949763DA8B8033D7E94A181E86BC1D3C59E26F0FDFEBBE18FED -29B54BCB358BECD7572E15C96F98E48E07071F85761A05BF8D6DFC5865BB99 -A7D126863004932E15FAB617AD3B01E907F4AC59F5A78B5D4D2C4129DD179B -E6043B00DD8C67D7DAB59D7A7CE579EDE95E73AD6A7ACC1F146D74F8B529D3 -4F974E0E6DC11B779908DDF5C54B6348F48322AFB564F883C410683646E240 -4924003F1C7AFBD78F5B4BE26D5EFBC6137FC25DA8DBC5A45FBAC512052B85 -0582F4E9C62A2D5AEB53F15F83BC3DAADDEA53C0D22C9E6C698225224C027E -98A27EEB8F9B484FE26BCAE7B1681AE3EA4B2A5C44F14B0E37165214E738C1 -3D6B68C809C735E5BA1DEEA9E21F126BDA47F6A4F1C5A42C1E5B0C65FCC4C9 -CE7D315A9F0D7C41A96A36D2E9DAC3192FED4B33C84EE254B9DBC8E3A62AE6 -B96AF22ED733E67CA9F99E81B851BD738CF354F50DCF61702295A190A10B22 -F5538EA2BC4F4AFF0084AF55D0FC4FABAF8B75049346D4AE42202989238977 -043C743526B63DE0B01D4E290B80327A5787BF8EF584FF00847B52D52E66B5 -D2AEF4C469E484193F7ED9DBC004FE35BBA9789358B8BDD0748D1EE8DCA5EC -1333DCB385662A01079AB51259EA7BD7D68DEB923D2BC3B5EBCF1F681E02D6 -6E753BC92D2F6D4C3F66B88E74676DD200D9C74E0815ABE27F126ABA678B7C -1C91EA330B5D466DB790F66508A7F1E4D4A4DC9A1BF86E7A3789B5F83C3BA2 -DDEA93ABB456D1B48E1065B00678152E8FAAA6AFA4DAEA1182B1DC42B32EE1 -83B594119F7E6BC96FAF352F167C3CF126AD73A8CD0844BA812D9082842120 -1F5E40AB7A0EAFA96A175A07862DEF1ECA08F4682EE49A32373E30A5707B1A -1A69D8BB2E5B9EB525CA43099589C05CD73BA778EF4BD42F26B58A5DD2C4FB -0A646738F4CD733A25EEA7078AB52F08DFDFCD7CB750CB776F34B8DD0C7908 -14638C0EBCF359DE18F8452E8FE23BAD4DE675612931DC65774A0AE327D289 -26A56324FDDB9EBAD2AA2339E001939AE2E0F897A6DCC9E65BDB5ECB6F9C6E -48720E3AE3071D6BAABD81AEEC9E24EAC300D794DBD86BBE1CD160D285A47A -53C4EED68B6F286F38B365B3C9C633FAD22E1AAD4EF3C27E35B5F1779F2D9D -BDCC30C6C53FD222D8720E0F7AE9B702718E95E5DE0FF126A53DB2C9A6E9B0 -3694266492E5A4DAE6407F78369E783F9D7A6C328921573C6E5048AA6ACAE4 -A7A98DE24F12A683F675304D2B4F22C6A224DD8249193ED5CEF887E285B785 -9EDE3BFB4B8924B8FB89045B988CE338CF4AEA75BBCB1D22C67D56F36ECB78 -9983375E013803F0AF3BF0669D3F8EB5F9FC65AA216B28B31E971BF4685802 -4E0F2B823A1A98EAB51B3A29BE24C5136A21B4FBB1FD9C504A4C070DB871B7 -9E6A3B2F89B0DEC9A608F4FBBC6A4CEB13180E17675DC73C74AD8F162C5FF0 -8FDE4B10015F6E5D7BE18556F012249E16B29241B997CCDADDC7CC6A68BE6E -6E6E9626A36A514BADC8742F8896BAE5D5DC31DBCD1FD9103C8658F6F19C71 -CD555F89714B693EA11D9DC35ADBDCBDBBE2225B2BD4F5E9EF597E0F8A09F5 -AD7219B0B1B5B28763E9BAB9BBF8BC49F0D350B9942FF6BF85AF999E7F3E40 -042AE72D855E4E14538EAC72768DD1EC767AED95E416B2F988AF730ACE91B1 -01C29EE466B9C7F88904B3EA26D2D677834BB8FB35CB346796F55C1E5703AD -7031C11EB7F1434B6B0BF96282E3C3AB34288B80B197E1467B60D5C826D63C -1B61E2DB7D52D5045793486CDCB83E647B08C9C743ED4E3F134CAB688EDE3F -887A7DC6A5A45A5B45349FDAF1CB24326CCAA88FAEE20F15D80214002BE79F -09D85FDFE8DE0AB686EA6D3A5960BA2B2478DD1E1CE719F5AEA34F9FC49E19 -D6B52D1EFF00C4175A9C72F97F66BAB8650C985CB74E075C73E943DC0F5E0E -A4E01C91591E26D7E1F0EE8D73AA4EAED15B2348E1065B0067815E6B078BEE -EC3C47A3DB2EA5717305E5CF95219148C8C13E954EF350D4FC5BF0FF00C55A -BDD6A32C496BF69B716E84152A8320FAF7A6D6823D7340D622D7B47B4D4E25 -658AEA2595030C10180233EFCD6967DEB95F873B0782343018906C61C923FD -85AD7D725920D32792294C4421018755E0F23DE94B402FBCAAAAC570C5413C -5719A6FC45B6D4E4D6E28EDE659349F2BCC531E09DFD31CFB5727A3F89EFED -FC57E1AD2E3D4EE2FA2D42DEE1E76986DDE517209E2A5F0A6E1E35F1FE221C -8B3C827FE999A7256A329F5FF82077FE0FF145BF8B7458F54B757585DDD06F -1839562A7B9F4ADD0770C6E2315F3D782FC4577A7E85E10D06CAE1EDD355D4 -6EE29265E1940909E2BA5F10F8A35DF01EAFA8B5C5FCDA859AD906B71311CC -9C1E83A77E69D78FB39A4BA8CF60DEA4EDC8247AD2492AC4A59C85503249E8 -0579E59E9DAEEAD65A36B367AFDD033CD0DC5C43B942F9646E68B9EABCE3D6 -BAAF15C324FE1DBF5590C38B590929DFE43C5292B31A577635ADAF20BB8FCC -82459633D1D082A7E8454BB94F439FA5786785F53BED07E18E91F62BE93CEB -98A3284903CA1BF04035D4EA37BABF857C65A25B9D4A7BDB4D57CDF3239480 -23D89918C7B9A3A0A4ACEC8F4ADD8CFB5647897C410F87B49B8D4E58DE58A0 -8D9D844BB8F03278ACDF1F5DEB165E16BC9B4305AFC28F2CEE0A73B8773ED9 -AE24EBEBAEF8275EFB2EA335C4A9A7BABC52AEC2928186C640EFDE9475607A -9695A826ABA65A5F2828B730A4CAA46080C01191F8D5D240C018CD786CF6BE -27F0F699E17D56DBC4D7D730DE496D6B3D94854471A32E588E32718C569E9D -E20D4F4DD5356D1755D6EE8DEDF4734FA6B3807CA43F2A05206060F4079AA6 -926163D62E2FADADCAACD32A3B7442C013F4153EE03032327B135E1BAC697A -B4BAEF85E2D4357B992E174F90CD336DDCCC1EB4EEF50F17788B51D7ECB489 -DA17D3E4896DA44954330600B673D3A1A9969B058F49F10EB963A2DA896F76 -EC6CF2F8C76EB935CF7DABC31AD69F7376BA4DADF08177362157079C6060F2 -6B2B5CF07EB1E37F06D943AD9F2EFE3DFE75B248AE9265B8CB7D0035ABF0F3 -C089E0CB59218A56F2241FEA38DAA73924629D84165E14D0357B35B9D2CB69 -F93B58D985528D8E41F42286F0A6BDA636ED2F5EBBBB61C84BD9CEDFD07D2A -A78224165E26D674BB78C25AB3CB7254743233E09AEFC90006DAA38C649C51 -603873E31D6B40758FC43631BC64ED1258ABC98ED924D75DA66AD69AADB0B8 -B5944887A8C8247D7154B5ED6F4AD334F98EA0E8D19523CB505F771D3039AE -33E1669F74DA86B7ABC711B2D26FA48DAC2DD7EE855521B83C8F9BD6901E9E -0628A051400514514005145140051451400514514005145140051451400514 -51400514514005145140051451400514514005145140051451400514514005 -14514005145140051451400514514005145140051451400514514005145140 -05145140051451400514514005145140051451400514514005145140051451 -40051451400514514005145140051451400514514005145140051451400514 -51400514514005145140051451400514514005145140051451400514514005 -14514005145140051451400514514005145140051451400514514005145140 -0514514008D9C6075F5F4A4DBD33C9F5A7514015EEACA0BC88C53C62446EAA -6B94BAF875691C8D368B3FF65CCDCEF543273F427D2BB3A280384161E36D23 -EEDF3EB20762B1C59FF3FD2B93F1A47AEF880DA5DCBA49D0352B22CD05F2CC -B398CB0009DA383C71F8D7B31E9D7149856E0E1BF0A00F1282EB4C9FC3F7FA -5F883C5325CEAB7B0B41F6C6B170501E17E55E0E299A778245E4F6D77078E4 -C9730DB25AACA74FDA7CB5C61704D7B54B6704AA55E15208C1AC4BEF02E83A -8E7ED16AED9FEECACBFC8D304F530A2F037DB27827D47585BEF26010A83104 -FF0081707F4AB9E15F075F787754D42E0EB9F68B3BA937C76BE485118C631B -B249A8E4F859A02736D14B1B76266738FD6917C0B7F6A3161ABADB1FF6A1DF -FCCD4DC5225F196853DCCD67AE5A5BFDA2FF004E0C2DE0DC17872037CC4E3A -64D6EDC16D6F477163766D64914059B66ED873CF07E84573A741F1C5BF09E2 -88245F4FB028FEB48BFF00099DA8D9813A8ECA88B9AA2EFA126ABF0F92ED74 -B6B1BDFB04DA7DC34E8E23DF962304F26AF49E139C582C306A261BBF34CAF7 -3E5677311E99C75E6B3CF88FC5F6E7FE4559AEC0EEB731AD3878DB5C8FFE3E -7C253C1EB9BA438FC850458AD2FC34172D793DCDF7997B736725B7DA7CAC60 -30EBB41C75E6B360F857ACA5AE996D278A99E3D3822C63EC8A32AA41C7DEF6 -ADD1F116DE3FF8FAB26B73DC19338FC8503E29785D0E26D41216EE0AB1C7E9 -53BB43DD5BB8DF187816EBC4C6D27B2D58E99A85982B0DD884485436377CA4 -81C818AC6D37E114E93EB72EB3AE7F6B0D60442756B7F2FF00D58C0E8DF4FC -ABA383E257852E4E23D5E363FF005CDFFC2AF47E31D0E51F25FA9CFF00B2DF -E14D5ECC3AA7D8E6BC31E00D7B46B90354F1436AB6519CC16C6D56311F3EA0 -E4F1C53BC27F0F354F0AB6A31C1E2366B4BC79254B716A008DD88F9B3939E0 -62BAF8759B19C8F2E70DF81AB8934720CA3E4517D84DE9EBA9CB24FAAE82AD -15CB36B04BEF57388B60F4C77C63F5A79F145F0C37F649627B79C38FD2BA9F -95BAE0D2ED1E807E140FA1CC7FC24F7AC76FF651C1FF00A6C3FC2B1B56F036 -A1E278F525BCD588B2D43CBFF443083E56CC7F1641392335DF9453D545038E -36D2B149E8705AB7C3AB8BAD7745D56DF5736F6FA4C9E62DAF901B77CA01F9 -B3C74CD6BB7892F2391A23A596DBC6EF3873FA574D8C76A4DBC9CE3F2A77D9 -76216E79FF00887C2B77E3A482F6DAE8E83A9DA4AAD15C04131DAB9238C81D -4E7F0A9E4F00EAF77A27D8EF7C4AD3EA0640CD7A6D402463046D071C9E6BBA -51814A067B524ACAC3679A5FFC2AD4AE26D16EED7C4CD6B79A55B35B8985A8 -6F303139382D81C1C52E9FF0BF59D2FF00B44D9F8B1A27BB3198D859A9F2B6 -F5EA79CD7A5F4A4CF3D73ED4203843F0EA7DDABDE5BEADF66D53538E28CDD8 -84129B3A1DB9C1E38A5B5F09C9A1EB13EBD713FF00685D35B4717DCF2FEE77 -E0E39AEEFA76A46C355A6072E3C4D7AD8C6927278CF9C3FC2B1DFC3171A76B -CDE2C1AB9B1B24B6692EAD841BF3CEF639CE7A0C702BBED8A78C0CD2346AE8 -6361952304566B4939035A58F30D3DB40F885E31B7D77467FB443A7C2F04D2 -98DD30CC411C363B0F4ACEF1CC72DDFC55F0B45697CD693225C8DE22DDB7F7 -62BD720B686DC623884607031DEA37D3AD5A7373E5FEF4FF0017E9571D251F -2BFE20F7670D3FC2686F74FD4BED7A879BABEA4A826D44C582769F97E50D8E -00C54FA378535FD140BAD7FC44FE2136DF35AC2D6EB0F96DD3AA9E78E39AEF -8722908C8C119A06730FE28BC1F29D20B13C63CE1FE159571E0ED435BF12DA -F8963D5CD818ADD6136BE487E376EFBD9F7C74AEEC28F6FCA97A77E3E95360 -3CF34FF8697B60DE22235F2E35AB869C8FB301E5E4118EBCF5F6AA89F0A752 -8B42D37498FC4A42D88601FECA3E6CB6EE9BB8AF4EC7346294B56976D44F7B -9C349E00BBB7D75B5AD33573693DC63EDCA210DF6ADABB53249F971CF4AB3A -769CDE0EB548E287EDF3BB37993676704E7A73EB5D7907D714150DD45549DE -5CCFD09E5D2C72D3789AE8C322C9A618A3DA4B3F9A0ED1EB8C579C7807C3D7 -9E22B5F11C706B2D058CFAEDC79F6E60CF9A840DCB924119071915EDB24292 -A1460369183EE2A0B6B2B6B590F909E5B91923AE4532CE4E4F00DCC4B0D969 -DAB7D8F4A8AD4DB7D8C40186304677139E95997DF090AD86911E8BAB7F65DF -69313450DDAC3E6121B19F94B63A0C57A58CF73467DE8B88F3F9FE1BDD6ABE -15BDD235CD60EA57D79B3CDBD680213B5F23E5071D001F8563C7F08B5E9FC4 -5A4EB3AAF8C9AFC6972EF8616B255C718C6437A015EB19F7A33EF4B99A770E -963CA2EBE10EAC2DB52D3B4DF15358E9BA82C824B61681865CE58E4B679AD2 -1F0BA7863D2AE2D757F2B53D3A38A0FB58832658507FABDB9C0C9E73D6BD17 -23B9A3229F337A8EFA58E6743F0ACB61A94DAADF5DFDB2F24DCAB214DA510E -0EDE0E0F35D26DC8C11C52F1EB4BDA93777726DA58400E3D2B0EE3C37F6CD6 -1AFEE6E3CD4403ECF115C794718639CF39ADDEBDA8C0A4F71AD0E2B45F00B6 -8D2E1F51F3ED23B86B98E0F2B68566393CE735A33788EF2095E25D30954621 -4F9A3E61DBB5749F8534A81C85CD36EE24B53CE7C57E18D4BE23C36F6E6F8E -8F05B4E9398FCB12F98573EE31D6AF49E0AF11A6950E9F61E2F7B458B00116 -6ADF2F71C9EF5DC00ABCE304D2E7DE85A0499CAEB1E10BABDF0BFF006158EA -86C1B007DA0441FF008837427F0AB1E17F0E5DF87F445D324D4CDCBA02166F -282E32C4F4CFBD742D8F5A318E94256BF98495DA679D695F0CAFED0EA4B79E -2137B15F47E5B21B60981BB3D41A7C9F0FB5C9B4C3A45CF89DA7D3DD8AB446 -D540F248C7959CE7A719EB5E84B41FAD09585BC0F3C93E18CF06BFA5EADA3E -B3FD9ABA7D94765E4AC1BFCC8D5B24649E33C0AD4D5FC1B77E23B98D756D4C -CBA6C52093EC662186753956DC083C575E38A507DE9977395F10F83A5D564B -0974FBFF00ECE9AC95D639445BF01B19E09AA179F0E3FB56C7548F51D43CEB -BD416306E0C5829B4FA03CF00577749919EB52079741F0A75C6974796F7C5C -D71FD9970660A6CD46F0410070DC71504FF077548EDB50D3F49F15369BA6EA -0AFE75B2D9870CEFF79B25B3C8C57AC127D293F0E6988E27474BFF00056936 -BA3153AAAC11AC7E7E445C0017A73E99FC6A5D425BBF1459C9A5B5B9D3D645 -256E7707DA40E3E5E2BB12AA4E48E680837671CD26EE07975B7C28D6D2EB46 -BC9FC5AD2CFA54524719FB1A8C87183FC55A9A67C3DD474FD4B5CBF3E20324 -BAB08727ECC0797E58C7AF39AEFBBF5A4041E869CAFC9CA0798DA7C227B6D1 -6C2D1B59F3351D325966B2BFFB3E0C2EED9242EEC1F4E6B61BE1FBEA771713 -EB77DF6E59ED45BB46D1EDE463E6C83DFD3DEBB09AEE0B7FF59205FC2A9C9E -23D2A0E64BC51FF013FE14E6DC9A6C671BE1DF86FAD68F7E7ED5E296BCD212 -4DF069C6D5504582368DE0E4E1462BB8D42C3ED9A65C58ABF96B344D1038CE -D0548FEB59B378EBC396FF00EB75345FF8037F855197E28783E3FBDACC639F -F9E6FF00E149BBEA08E7ECBE124F1F850F876FF5A37D044C9F6526DF6792AA -738E1B9E7D4D6E59F82AEDB54B0D4756D50EA0F61BFC80D084D9B860F43F4A -43F13FC3F27FC7ADD2DC7A6030FE629A7E203C9FF1EDA4BCEDD80980CFE629 -F4137766E788F48BCD634E7B5B1D44E9D391F25C08C3EDE4763F4AE68FC345 -99B559E7BDCDE6A362B66F3F95D3008DD8CE3BF4A98F8CFC4331C41E0E9E51 -EA2ED052FF006E78C271C787A4B407BB4D1B6DF7A98832BC5E05B8482C7FB6 -75937F69A4B24B0C460DBB5A31C1E0E7A66B2EEDFC37F10FC536C2CFFD2A5D -26505DD91D3CB78DF38E719C66B69A2F1ADE018BC4B41EAD023D431784FC58 -449E7F89ADD96562C42D82A9E7DC1A1EE1727F1AF8225F13DF59DFD86B034A -BDB55D8B308849942724609039AC1D57E1FEA967AACFA9E89E32FEC77BC21A -F0ADA2C9E715002E7278C0CF4F5ADB1E0192E176DFDFFDA47FB2853F91A7C3 -F0AFC3109DF25BCCCDEBE7BFF8D5CB6027B6F147877C376896F26A0709DC42 -E72739EC0FAD53BEF8A7A2C313369EAD7C54642ED74C9FC56BA3B3F0AE9362 -0182DCE47AB93FCEB51618B69530AA8FA0A4079378665F1609EEAF63F0E191 -EF256952E7ED680A46C72176FB57447C37E2CD5DB75EEBEF6901E4DAF908FF -00F8F03EF8AEED5420C2AE076A5EDCD0072BA6FC3FD1EC6E12EA4B759EF147 -FC7C12C39EFC671CD752ABB06D038F5A7514804501540031ED4B4514005145 -14005145140051451400514514005145140051451400514514005145140051 -45140051451400514514005145140051451400514514005145140051451400 -51451400514514005145140051451400514514005145140051451400514514 -00514514005145140051451400514514005145140051451400514514005145 -140051451400514514005145140051451400514506800A334534FDEFE74201 -D91EB46475CD452004F2703D8D2A9E335307CD7F21D87E47AD2E699C13C74A -55CF3FA551371D464520A438A063B2077EB464533A0C1E4D281CE73493B80E -A2929284EE03A8A6D2F6A49DDD805A293B51DA9DC032338CD2E699DB38E694 -74A3501D9A334981484668B831D918CE68C8F5A8F8DA093D3D3A520214119C -9F4A571D89370CE33CD0083DE9BEF800D2119E9C0CFE754C95AB24C8F5A323 -D6999078C75A3183CD2B9487D14D030314B4C9EA2E40EF4991EB4D3D681C0E -681F5B0FC8F5A4240EA6A26CE47385FD6948C003A8F53493BA4C16F625C8F5 -A3351A6E0B96C13ED4A318183B87E74021F907BD19CD30AE0EE1F9529C7D33 -4C07646714535401EFEF4EA000D273ED4B450021CE0D21191839FC29D45003 -02E06066971ED4EA29581EA260F7A391D466968A60274E0531A18E4FBC8A7E -A2A4A2802BB585A3FDEB585BEB18350B68FA6B75D3ED4FD615FF000ABD4520 -3224F0D69329E6C624FF0072351FD2AB49E0CD224CFEE641FEEBE2BA0A2981 -C9C9F0EF4594F2F7CBFEE5CB0AACFF000B74366DC2EB5507DAF9F15DAD140A -C7107E1B5A47FEA2FEFD7FDFBA73487C05748C0C5AA4C00FEF4AE7FAD77145 -033873E12D7E33FB8D5D17FDF0C7FAD34F877C669FEAB5CB21FEF404FF005A -EEA8A016870C74AF8871FDCD774C23D0D993FD6816FF001063FBFAA69EFF00 -EED99FF1AEE68A56038433F8E623F3CB04BFEE5A9A0EABE2E8CFCD68CFFEED -BD7774537A83D4E13FE122F14C7F7B48B87FA414D3E2EF11AFDEF0E5F37FBB -0D77B4500703FF0009CEBD1FDEF096A8FF00EEC5FF00D6A43F113574EBE07D -65BE89FF00D6AEFE8A00E087C45D448DC7C19ABA7D57FF00AD522FC43BB6FB -DE17D493EA3FFAD5DB9453D554FE14C30427AC287FE022819C60F882E721BC -3DA828F53FFEAA5FF858233B9B46BB18E8323FC2BB0FB2407AC109FF00800A -69D3ED0F5B580FFDB314211CB0F883093CE9B70BF561527FC2C0B4CF36728F -F810AE90E99627AD9C1FF7EC534E93A71EB656FF00F7ED7FC281DCE77FE160 -D867981C7D5C5387C40D34F55C7D5C56FF00F63E9BFF0040FB63FF006C97FC -290E89A59EBA75AFFDF95FF0A0460FFC27FA4F7751FF006D052FFC27DA3779 -D07FDB515B7FD87A4FFD032D3FEFC2FF00851FD83A41FF00985DA7FDF85FF0 -A1818C3C7DA211837510FACA297FE13FD0F3FF001F900FACA2B5FF00B0347F -FA0559FF00E03AFF008527FC23DA31FF00984D9FFE03AFF850064FFC27BA09 -207DBEDC7BF9A293FE13ED018F37D6F90719F3456B7FC239A2FF00D026CFFF -0001D3FC28FF00847345FF00A04D9FFE03A7F85080CC1E3ED039FF008985BF -FDFE147FC27DA07FCFFDBFFDFD15A7FF0008E68BFF00409B3FFC074FF0A3FE -11CD17FE81367FF80E9FE140199FF09F681FF3FF006FFF007F4521F1F685DA -FADFFEFE8AD4FF00847345FF00A04D9FFE03A7F852FF00C23DA30FF984D9FF -00E03AFF00850064FF00C27DA1FF00CFE41FF7F4521F1FE8BDAEA13FF6D456 -BFFC23DA31FF00984D98FF00B775FF000A5FF847F471FF0030AB3FFBF0BFE1 -4EE0629F1F691FF3DE33F490521F1FE93D981FFB682B6FFB07481FF30BB41F -4817FC294687A48E9A65AFFDF85FF0A40617FC2C0D3874427E8E29A7E20D8F -6B773F4715D08D174BFF00A075A8FF00B62BFE14BFD8FA68E9616DFF007E97 -FC287A8339B3F10AD7B594A7E8C293FE16142785D2EE4FFC08574DFD9561FF -003E36C3FED90FF0A70D36C474B483FEFD8A00E4CFC42EC343BC6FA11FE14D -3F10A6FE1F0E6A0DF4FF00F55761F61B51D2DA1FFBE05385ADB8E9020FF800 -A1EA26AE7167E225E76F09EA8DF41FFD6A8DBE22EA43EEF827596FA2FF00F5 -ABBA10443A46A3F014E0AABD00A0AB9C10F881AB3FFCC91AD2FD53FF00AD4B -FF0009B6BCFF0077C29A9A0EDBA2FF00EB577DD68A1EA4A56563821E2AF123 -F4D02F53EB0D28D7BC58FF00774C9501E9BADFA57794503EB7384FED1F1949 -D2109FEF5B52893C752729716D18F46B4391FAD775453B81C37D8FE214BF77 -57D3A3FF007ACCFF008D0346F880C7326BDA61FA5A11FD6BB9A2901C31F0D7 -8B66FF005FAD5A9FF72161FD6947837597FF005DAB027FD9DC3FAD771452B0 -1C3FFC2BF964FF005DA9DC1FF76671FD694FC2ED2E720DCDF6A648E9E5DEBA -D76F453038E8BE18E87174B8D4DBFDFBD7356A3F0068D11C8FB537FBF3935D -3D1474030E1F0869117FCBBEEFF7F9AB71E81A547D34FB63FEF42A7FA568D1 -4AC0535D2B4F4FBB616CBF48547F4A9459DB28F96DE21F4402A7A298AC4623 -55FBAAABF853883ED4EA285A0D8CC1E80526DEE41CF4A928A05619B6971C53 -A8A1EA31303DE8393D2968A004E68E41CE334B450014514500145145001451 -45001451450014514500145145001451450014514500145145001451450014 -51450014514500145145001451450014514500145145001451450014514500 -14514500145145001451450014514500145145001451450014514500145145 -00145145001451450014514500145145001451450014514500145145001451 -4500145145001451450014514500145145001451450015196E4E01E3AD3E98 -58AB818FBDDE920399F1B78C20F06E9EB7F756F2CD0B1231147B88C0EFC8A6 -2F8B6516F6D75F60B868AE02918849C0233935CFFC728E593C173AC2DFBCDA -D839FA55CD397C492E9FA3C6D1C4969E544242B264EDDA33C62952F824FCCA -477304EB2DBC5363689541C1E319A9B2077AF1CD3B5BD665F0BF8C256D5AE1 -A6D3753BB5B6724663444F9507B0ACC9351F14EBD3784A087C4F7BA77DB748 -8EE27780A92EF9392723BD696252D4F7604633918A6BB03C02335E1F078DF5 -CF0CFF00C2636D757F36A834BBEB7B6825B8382039C13C7D7F4AEEC787B5B8 -350D3EE53C4D7735BA2C86E237DA04995F97EB8A5D424F9753A1BCD7EDD34F -B9BAB165BE68173B6022424FA706AED9DC1B8B549DD0C7B9412186315E17A1 -C1A9697E01D7B52B0D6EEA2B9895D97685C02243DEBA993C4BAB5C41A069CB -76E92DCCD10B89B3CBAB2F23DEA20555FDCFC5D4F520C08C8208F6A5DD9AF2 -1D6B59D73C35ACEADA48D5AE2E226D1E5BA8256C6E8A4DC428007618EB5CCC -9A8F8AF46F0D693AFBF8BB52BB92F35082192DE5DA102BF27040CF6A705776 -09C5C2CDF53E85E319A0B01DC55594BCB69232398C142558755E2BC56683C5 -71785B51D4C78D354792168FCB2C133CBE0F6A515EF08F75C8E99E6919D570 -0B004F4C9AF28BAB9D7740F16F8584DAFDE5E5BEA724AB35BC9B76FC91E474 -F7355FC4DE23BFD356F6E1356B9927B6469442003181DBE6A6B59581EC7A65 -CEAB243A8C76AB6F23A38199150951938EB5A5B828C93D4D7955E6B3ACCBA9 -F876687539E082FE0B632C0846DDCFCB37D6B9A827F155EC5E2CD564F186A5 -1C3A36A370B0DBA052AC231B829E32076A726A2F9498EAAE7BD9C523BAA296 -24000649AE13C292EABE2DF0B683ADB6AD716B2CD6BBA58531B64249E493F4 -AE8BC4EF731683726DCED9F68C60F4E467F4A8A8BD9AE61C5DD98969F1022D -67509AD345B39AE238319B931130BE47F0B038382083EF573C3DE308B5FD62 -F34B163776B2DAC4B233DC4250364E3E524F3583F03A2B64F87FA7496F83E6 -34BB81E08C4AF5ABE3BD41344D26EAFEC4086FA78FCBFB403865C74AD65049 -E80B63B00CA4119C91C1F5AE420F1E473EA7A9587D92506C6395FF00D59F98 -21EDCF35CD6B3A86B9E1D87C33AB45AACD771EA73C10DCC3210155586E6618 -EA6934C9167F14EAF3A162AF6539E460F26B0AB3715A0E1B9D9F84FC529E27 -B7B89962687C970B865DA7919F5AE8958301821BDC735E45A05C4B6DA06AD2 -43792591FB7C60CB1E3711DC73EB4969E23D467D66FB4DB7D5EF1616E62959 -4064C2E4E07B9ADE4BDD465077933D7D5B8E48CD2EE00804819E9EF5F3DDAE -A1E2D83E1B5AF8E1FC5BA84F2C06432DABEDD927EF7CB1938CF4E6B7F52F18 -6AB65E27921D62FAE2CAC2EA188583DB0DE04A5416DD9FBA3AF35315A16F73 -D91D80C73DE933CFB62BCAF55D73C43ADF8866D1F45BA312A696B3C726FDA5 -A42719A8DB59F1669B65A7E97ACDD2C17735F4718B8865DECC84639E3AE727 -14ACECC3AA3AE4F1B5BBF8C93C2C6093ED0F0BCCAE53E4DAA71D73D7F0ABFE -2CF110F0BE9126A6F6B2DC45111B9208CBB7240E0579BD85BCBA6FC71B2B59 -AEE4BD3269B33F9D300197E63C0C76AF4DF12C4B369334520051994107A633 -492FDD47D0A5F114FC33E34D3BC5DA10D5B4862CAD9CC2F81226188F994138 -CE0D4DE14F112F88AC9AF92DE4B787715512A6D390483C7E15E5DA8DAC9F07 -3593AB69E84F876FBFE3E2D94710ED5C2ED0393966C9CD167E349668FC29A6 -693712C16BAD5DCD13CD8C3260E7207D6B44AF27612D8F6C5248C93C839E3D -2B1BC51E258BC3360979344F287902008BBB1C13EBED5C06ADE26D67C07E23 -BCFB6DECBA9699F635F2BCC3F3090F24E07B0AA9AFC3A8EB3E1387549F5BB9 -2925E89D611B4AEC28488CFA0E71514FDE60CF5BD2B508F52D36D6F946C5B8 -8D6401B8C6455DAF1EB0D4BC41AC9B6D37489C5B470E9C42A87C7EF0700F3F -515DCF8122F10C1A0C76FE249927D461015E5126F2E7B93EF4203A8041E473 -45317048DA480BDBD69F4C028A28A0028A28A0028A28A0028A28A0028A28A0 -028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28 -A004FCE968A2800A39F6A28A004E7DA8E7D2968A004E6968A2800A4C7D6968 -A0031498F734B45002018F5A5FCE8A2800FCE8FCE8A2800A3145140098F734 -7E74B4500145145001CD1451400628A28A0039A28A28013F3A383DA968A004 -E9D2968A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A2 -8A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800 -A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A28 -00A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A -2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A2 -8A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800 -A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A4A5A4A002931C -8E7F0A5349DC52EA338FF1E78266F1A698BA7C7AABE9899249488499C8F722 -BA0D2AC9F4ED3A1B49AE0CFE4C6A9BCAE320003A0FA55E6EB4D7FB8DF4A8A6 -F492F31A3CCF52F8497F72FA9A69BE299AC6CB549A49A7B65B55605A4FBC72 -4E7A7156ADBE14C96973A2CC9AF49B749B15B454FB38F9C03F7BAF15E8B1FF -00AB5FA507BD6C9896E79C7FC2A98A6BCD7E4BDD55EE2DF5A9D27780C2000C -9F74E41CF079ABDE16F026AFA3B29D5BC4D36AF0C79F2A092D96311E739E54 -F39C8FCABB36EA9539EB53D42493DCF348BE13DCDB69BAB6976BE2396DEC6F -D36A402D94884E724824E4E49AD1B9F871E7E95A6DBB6A6ED79A64EB710DCF -9433B9460719C57707A1A5FF000A881553F79F11C44FE017BE92F2E6F75379 -750BAB07B1F3CC40148DB9E80E0E0F359B7DF0A67BFF000EE9FA2B788A5096 -17314E1FECCBF318C70319AF46FF0096FF00F01A17F8FF00DEA707A849F359 -3E84220916C4C124E4B94DA65DBDFD715C49F86F7CDE1CB9D1A4F114AD2DC6 -C26EFECCB91B5B77DDCE3DABBD97FD59FA8A79EB4D3F78470D7BF0FEF351BF -D0EF65D7A42FA3BC8EA7C85FDEEF5C63AF18AC86F84778B69A8D941E27992C -6F55F36FF65521598E58E49CF35E9D1FDC142FDC34BED89EC700BF0DAF7769 -8DFF00091CA134E589553ECCBF36CF7CD32C3E184F6365AFDBC7AF484EB371 -2CEEFF00675FDDF98304633CE2BD087DC6FA509F76B47ABBB261F01C6695E0 -AD4B47D274CD36DFC45294B08BCA63F6751E6F39CF5E2BB1923DE81186E041 -04D03A9FAD3CF6A53F7959914F73CF6CBE1BDE787B51965F0F6BD2E9F61211 -9B24815957FE04C49EA49FC6B4EFBC08DACE9179A76B5A93EA2D771F966678 -821419F4079AEB9BF8A9E2A1C9B66870B17C3E9A44D32DAF7547B8B5D2A549 -2DA3310017670BD0E7A7AD2C3E02BAB7D66FB515D6E40B771491AA790BFBBD -E7239CF38AEE0F53F4A6BFDD5FA8AA924D6A11DCF36B8F8537371A25D694FE -2497CC9EF23BB59FECCB9429C818CF3505FF0080EFF4B9D35DBFF13CB74604 -75950DAAAF9A58601241E315E9FF00F2D07D2B0BC6BFF22E5DFF00C07F9D5A -229EECF32F865E119FC4BE00D36DAEF597974791A6F3F4E3080B20F35881BB -208E4678AECF54F87D3EA51DFD94DAC39D2AF20587EC9E48C4606327767273 -8AA3F027FE49DE9DFEF4BFFA35EBD19FEE1A72D342E7B9E7DABFC34B97BFB7 -D4740D7A5D12F12D52D1A68EDD642D1AF418638EB83F853F52F862352D2EDA -2935471AA5BCEB73FDA3E50DCF228EBB738193CD77CDFC34A2A5B0EA8F37D1 -3E18EA963E2D83C4DAA78A66D4AE2285A108F6A89C373D41FE95D578BFC3F7 -5E23D30D8DBEA8FA796756DEB107E8C0F43F4ADD6E83EB4ADD4524F44817C4 -CC99B428750D25B4CD4CFDB237003B30DBBF0723A74C715CA37C2BB28749D3 -6D6D6E4C777A54B2CD6574139899CE4903383F8D7A0D254536D498E3B1C8C3 -E0759EEE6BBD5AEDB50696DC4263740BD3BE41AE6A5F851AAB5B4F636BE2F9 -EDAC25BA69FC81688C173C6CC939E9C66BD4FF0088FD2A24E87FDFA541EAC4 -CF3B9BE176A114F6573A4F8AA6D32F6DAD45BB4C96AAE645CE4F04E0678AED -3C3FA2C9A2D932CD726F2F2621AE2E1942995BA670381C7A5691FF005A3E95 -30EA688F512100C1C7A53A907534B5630A28A2800A28A2800A28A2800A28A2 -800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28 -A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A -28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A280 -0A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2 -800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28 -A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A -28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A280 -0A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2 -803FFFD9> -%%EOF - -%%EndDocument - @endspecial 12716 11201 V -240 11208 12963 7 v -240 -11516 a Fj(Figure)62 b(16:)84 b Fm(This)57 b(is)h(the)f(collapsed)h(no) -5 b(de)57 b(from)g(main)h(that)e(represen)-5 b(ts)58 -b(the)f(eonImageCalculator.)79 b(It)57 b(actually)f(has)i(around)-240 -11715 y(200)d(no)5 b(des)56 b(p)5 b(oin)-5 b(ting)56 -b(to)f(it,)g(it)g(has)h(b)5 b(een)55 b(paired)h(do)-5 -b(wn)56 b(to)f(\014t)h(the)f(page.)3809 11672 y Fj(25)p +8569 y(20\(1\),)50 b(Jan.)h(1998.)3809 11672 y Fj(24)p eop end %%Trailer From natebegeman at mac.com Mon Dec 19 18:26:12 2005 From: natebegeman at mac.com (Nate Begeman) Date: Mon, 19 Dec 2005 18:26:12 -0600 Subject: [llvm-commits] CVS: llvm/lib/Target/PowerPC/PPCISelDAGToDAG.cpp PPCISelLowering.cpp PPCISelLowering.h PPCInstrFormats.td PPCInstrInfo.td PPCRegisterInfo.td Message-ID: <200512200026.SAA10031@zion.cs.uiuc.edu> Changes in directory llvm/lib/Target/PowerPC: PPCISelDAGToDAG.cpp updated: 1.145 -> 1.146 PPCISelLowering.cpp updated: 1.51 -> 1.52 PPCISelLowering.h updated: 1.12 -> 1.13 PPCInstrFormats.td updated: 1.62 -> 1.63 PPCInstrInfo.td updated: 1.162 -> 1.163 PPCRegisterInfo.td updated: 1.27 -> 1.28 --- Log message: Pattern-match return. Includes gross hack! --- Diffs of the changes: (+45 -39) PPCISelDAGToDAG.cpp | 23 ----------------------- PPCISelLowering.cpp | 27 +++++++++++++++++++-------- PPCISelLowering.h | 6 ++++-- PPCInstrFormats.td | 8 +++++--- PPCInstrInfo.td | 12 +++++++++--- PPCRegisterInfo.td | 8 ++++++++ 6 files changed, 45 insertions(+), 39 deletions(-) Index: llvm/lib/Target/PowerPC/PPCISelDAGToDAG.cpp diff -u llvm/lib/Target/PowerPC/PPCISelDAGToDAG.cpp:1.145 llvm/lib/Target/PowerPC/PPCISelDAGToDAG.cpp:1.146 --- llvm/lib/Target/PowerPC/PPCISelDAGToDAG.cpp:1.145 Mon Dec 19 17:40:42 2005 +++ llvm/lib/Target/PowerPC/PPCISelDAGToDAG.cpp Mon Dec 19 18:26:01 2005 @@ -1043,29 +1043,6 @@ Select(N->getOperand(3)), getI32Imm(BROpc)); } - - case ISD::RET: { - SDOperand Chain = Select(N->getOperand(0)); // Token chain. - - if (N->getNumOperands() == 2) { - SDOperand Val = Select(N->getOperand(1)); - if (N->getOperand(1).getValueType() == MVT::i32) { - Chain = CurDAG->getCopyToReg(Chain, PPC::R3, Val); - } else { - assert(MVT::isFloatingPoint(N->getOperand(1).getValueType())); - Chain = CurDAG->getCopyToReg(Chain, PPC::F1, Val); - } - } else if (N->getNumOperands() > 1) { - assert(N->getOperand(1).getValueType() == MVT::i32 && - N->getOperand(2).getValueType() == MVT::i32 && - N->getNumOperands() == 3 && "Unknown two-register ret value!"); - Chain = CurDAG->getCopyToReg(Chain, PPC::R4, Select(N->getOperand(1))); - Chain = CurDAG->getCopyToReg(Chain, PPC::R3, Select(N->getOperand(2))); - } - - // Finally, select this to a blr (return) instruction. - return CurDAG->SelectNodeTo(N, PPC::BLR, MVT::Other, Chain); - } case ISD::BR_CC: case ISD::BRTWOWAY_CC: { SDOperand Chain = Select(N->getOperand(0)); Index: llvm/lib/Target/PowerPC/PPCISelLowering.cpp diff -u llvm/lib/Target/PowerPC/PPCISelLowering.cpp:1.51 llvm/lib/Target/PowerPC/PPCISelLowering.cpp:1.52 --- llvm/lib/Target/PowerPC/PPCISelLowering.cpp:1.51 Mon Dec 19 17:25:09 2005 +++ llvm/lib/Target/PowerPC/PPCISelLowering.cpp Mon Dec 19 18:26:01 2005 @@ -793,15 +793,26 @@ SDOperand PPCTargetLowering::LowerReturnTo(SDOperand Chain, SDOperand Op, SelectionDAG &DAG) { - if (Op.getValueType() == MVT::i64) { - SDOperand Hi = DAG.getNode(ISD::EXTRACT_ELEMENT, MVT::i32, Op, - DAG.getConstant(1, MVT::i32)); - SDOperand Lo = DAG.getNode(ISD::EXTRACT_ELEMENT, MVT::i32, Op, - DAG.getConstant(0, MVT::i32)); - return DAG.getNode(ISD::RET, MVT::Other, Chain, Lo, Hi); - } else { - return DAG.getNode(ISD::RET, MVT::Other, Chain, Op); + SDOperand Copy; + switch (Op.getValueType()) { + default: assert(0 && "Unknown type to return!"); + case MVT::i32: + Copy = DAG.getCopyToReg(Chain, PPC::R3, Op, SDOperand()); + break; + case MVT::f32: + case MVT::f64: + Copy = DAG.getCopyToReg(Chain, PPC::F1, Op, SDOperand()); + break; + case MVT::i64: + SDOperand Hi = DAG.getNode(ISD::EXTRACT_ELEMENT, MVT::i32, Op, + DAG.getConstant(1, MVT::i32)); + SDOperand Lo = DAG.getNode(ISD::EXTRACT_ELEMENT, MVT::i32, Op, + DAG.getConstant(0, MVT::i32)); + Copy = DAG.getCopyToReg(Chain, PPC::R3, Hi, SDOperand()); + Copy = DAG.getCopyToReg(Copy, PPC::R4, Lo, Copy.getValue(1)); + break; } + return DAG.getNode(PPCISD::RET_FLAG, MVT::Other, Copy, Copy.getValue(1)); } SDOperand PPCTargetLowering::LowerVAStart(SDOperand Chain, SDOperand VAListP, Index: llvm/lib/Target/PowerPC/PPCISelLowering.h diff -u llvm/lib/Target/PowerPC/PPCISelLowering.h:1.12 llvm/lib/Target/PowerPC/PPCISelLowering.h:1.13 --- llvm/lib/Target/PowerPC/PPCISelLowering.h:1.12 Tue Dec 13 16:55:21 2005 +++ llvm/lib/Target/PowerPC/PPCISelLowering.h Mon Dec 19 18:26:01 2005 @@ -54,12 +54,14 @@ /// at function entry, used for PIC code. GlobalBaseReg, - /// These nodes represent the 32-bit PPC shifts that operate on 6-bit /// shift amounts. These nodes are generated by the multi-precision shift /// code. SRL, SRA, SHL, - }; + + /// Return with a flag operand, matched by 'blr' + RET_FLAG, +}; } class PPCTargetLowering : public TargetLowering { Index: llvm/lib/Target/PowerPC/PPCInstrFormats.td diff -u llvm/lib/Target/PowerPC/PPCInstrFormats.td:1.62 llvm/lib/Target/PowerPC/PPCInstrFormats.td:1.63 --- llvm/lib/Target/PowerPC/PPCInstrFormats.td:1.62 Tue Dec 13 18:34:09 2005 +++ llvm/lib/Target/PowerPC/PPCInstrFormats.td Mon Dec 19 18:26:01 2005 @@ -328,12 +328,14 @@ } class XLForm_2 opcode, bits<10> xo, bit lk, dag OL, string asmstr, - InstrItinClass itin> + InstrItinClass itin, list pattern> : I { bits<5> BO; bits<5> BI; bits<2> BH; + let Pattern = pattern; + let Inst{6-10} = BO; let Inst{11-15} = BI; let Inst{16-18} = 0; @@ -343,8 +345,8 @@ } class XLForm_2_ext opcode, bits<10> xo, bits<5> bo, bits<5> bi, bit lk, - dag OL, string asmstr, InstrItinClass itin> - : XLForm_2 { + dag OL, string asmstr, InstrItinClass itin, list pattern> + : XLForm_2 { let BO = bo; let BI = bi; let BH = 0; Index: llvm/lib/Target/PowerPC/PPCInstrInfo.td diff -u llvm/lib/Target/PowerPC/PPCInstrInfo.td:1.162 llvm/lib/Target/PowerPC/PPCInstrInfo.td:1.163 --- llvm/lib/Target/PowerPC/PPCInstrInfo.td:1.162 Mon Dec 19 17:25:09 2005 +++ llvm/lib/Target/PowerPC/PPCInstrInfo.td Mon Dec 19 18:26:01 2005 @@ -46,6 +46,9 @@ def callseq_start : SDNode<"ISD::CALLSEQ_START", SDT_PPCCallSeq,[SDNPHasChain]>; def callseq_end : SDNode<"ISD::CALLSEQ_END", SDT_PPCCallSeq,[SDNPHasChain]>; +def SDT_PPCRetFlag : SDTypeProfile<0, 1, [ SDTCisVT<0, FlagVT>]>; +def retflag : SDNode<"PPCISD::RET_FLAG", SDT_PPCRetFlag, [SDNPHasChain]>; + //===----------------------------------------------------------------------===// // PowerPC specific transformation functions and pattern fragments. // @@ -221,8 +224,8 @@ let isTerminator = 1 in { let isReturn = 1 in - def BLR : XLForm_2_ext<19, 16, 20, 0, 0, (ops), "blr", BrB>; - def BCTR : XLForm_2_ext<19, 528, 20, 0, 0, (ops), "bctr", BrB>; + def BLR : XLForm_2_ext<19, 16, 20, 0, 0, (ops), "blr", BrB, [(ret)]>; + def BCTR : XLForm_2_ext<19, 528, 20, 0, 0, (ops), "bctr", BrB, []>; } let Defs = [LR] in @@ -267,7 +270,8 @@ "bl $func", BrB, []>; def BLA : IForm<18, 1, 1, (ops aaddr:$func, variable_ops), "bla $func", BrB, []>; - def BCTRL : XLForm_2_ext<19, 528, 20, 0, 1, (ops variable_ops), "bctrl", BrB>; + def BCTRL : XLForm_2_ext<19, 528, 20, 0, 1, (ops variable_ops), "bctrl", BrB, + []>; } // D-Form instructions. Most instructions that perform an operation on a @@ -1052,6 +1056,8 @@ def : Pat<(f64 (extload xaddr:$src, f32)), (FMRSD (LFSX xaddr:$src))>; +def : Pat<(retflag FLAG), (BLR)>; + // Same as above, but using a temporary. FIXME: implement temporaries :) /* def : Pattern<(xor GPRC:$in, imm:$imm), Index: llvm/lib/Target/PowerPC/PPCRegisterInfo.td diff -u llvm/lib/Target/PowerPC/PPCRegisterInfo.td:1.27 llvm/lib/Target/PowerPC/PPCRegisterInfo.td:1.28 --- llvm/lib/Target/PowerPC/PPCRegisterInfo.td:1.27 Fri Dec 16 03:19:13 2005 +++ llvm/lib/Target/PowerPC/PPCRegisterInfo.td Mon Dec 19 18:26:01 2005 @@ -132,6 +132,14 @@ // VRsave register def VRSAVE: SPR<256, "VRsave">; +// FIXME: +// HACKTROCITY: define a flags reg class for things that need to take a flag. +// this should really be handled by tablgen. +def FLAG: SPR<1023, "Flag">; +def FLAGRC : RegisterClass<"PPC", [FlagVT], 32, [FLAG]> { + let Size = 32; +} + /// Register classes // Allocate volatiles first // then nonvolatiles in reverse order since stmw/lmw save from rN to r31 From lattner at cs.uiuc.edu Mon Dec 19 18:54:06 2005 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Mon, 19 Dec 2005 18:54:06 -0600 Subject: [llvm-commits] CVS: llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp Message-ID: <200512200054.SAA10262@zion.cs.uiuc.edu> Changes in directory llvm/lib/CodeGen/SelectionDAG: LegalizeDAG.cpp updated: 1.235 -> 1.236 --- Log message: Fix a nasty latent bug in the legalizer that was triggered by my patch last night, breaking crafty and twolf. Make sure that the newly found legal nodes are themselves not re-legalized until the next iteration. Also, since this functionality exists now, we can reduce number of legalizer iterations by depending on this behavior instead of having to misuse 'do another iteration' to get the same effect. --- Diffs of the changes: (+30 -22) LegalizeDAG.cpp | 52 ++++++++++++++++++++++++++++++---------------------- 1 files changed, 30 insertions(+), 22 deletions(-) Index: llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp diff -u llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp:1.235 llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp:1.236 --- llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp:1.235 Mon Dec 19 17:12:38 2005 +++ llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp Mon Dec 19 18:53:54 2005 @@ -77,12 +77,16 @@ std::map > ExpandedNodes; void AddLegalizedOperand(SDOperand From, SDOperand To) { - bool isNew = LegalizedNodes.insert(std::make_pair(From, To)).second; - assert(isNew && "Got into the map somehow?"); + LegalizedNodes.insert(std::make_pair(From, To)); + // If someone requests legalization of the new node, return itself. + if (From != To) + LegalizedNodes.insert(std::make_pair(To, To)); } void AddPromotedOperand(SDOperand From, SDOperand To) { bool isNew = PromotedNodes.insert(std::make_pair(From, To)).second; assert(isNew && "Got into the map somehow?"); + // If someone requests legalization of the new node, return itself. + LegalizedNodes.insert(std::make_pair(To, To)); } public: @@ -228,8 +232,7 @@ // if f32 then cast to f32 Result = DAG.getNode(ISD::FP_ROUND, MVT::f32, Sub); } - NeedsAnotherIteration = true; - return Result; + return LegalizeOp(Result); } assert(!isSigned && "Legalize cannot Expand SINT_TO_FP for i64 yet"); SDOperand Tmp1 = DAG.getNode(ISD::SINT_TO_FP, DestVT, Op0); @@ -268,8 +271,7 @@ DAG.getSrcValue(NULL), MVT::f32)); } - NeedsAnotherIteration = true; - return DAG.getNode(ISD::FADD, DestVT, Tmp1, FudgeInReg); + return LegalizeOp(DAG.getNode(ISD::FADD, DestVT, Tmp1, FudgeInReg)); } /// PromoteLegalINT_TO_FP - This function is responsible for legalizing a @@ -320,14 +322,13 @@ // Otherwise, try a larger type. } - // Make sure to legalize any nodes we create here in the next pass. - NeedsAnotherIteration = true; - // Okay, we found the operation and type to use. Zero extend our input to the // desired type then run the operation on it. - return DAG.getNode(OpToUse, DestVT, + SDOperand N = DAG.getNode(OpToUse, DestVT, DAG.getNode(isSigned ? ISD::SIGN_EXTEND : ISD::ZERO_EXTEND, NewInTy, LegalOp)); + // Make sure to legalize any nodes we create here. + return LegalizeOp(N); } /// PromoteLegalFP_TO_INT - This function is responsible for legalizing a @@ -377,13 +378,12 @@ // Otherwise, try a larger type. } - // Make sure to legalize any nodes we create here in the next pass. - NeedsAnotherIteration = true; - // Okay, we found the operation and type to use. Truncate the result of the // extended FP_TO_*INT operation to the desired size. - return DAG.getNode(ISD::TRUNCATE, DestVT, - DAG.getNode(OpToUse, NewOutTy, LegalOp)); + SDOperand N = DAG.getNode(ISD::TRUNCATE, DestVT, + DAG.getNode(OpToUse, NewOutTy, LegalOp)); + // Make sure to legalize any nodes we create here in the next pass. + return LegalizeOp(N); } /// ComputeTopDownOrdering - Add the specified node to the Order list if it has @@ -1091,11 +1091,14 @@ AddLegalizedOperand(SDOperand(Node, 1), Result.getValue(1)); return Result.getValue(Op.ResNo); case TargetLowering::Expand: - //f64 = EXTLOAD f32 should expand to LOAD, FP_EXTEND + // f64 = EXTLOAD f32 should expand to LOAD, FP_EXTEND if (SrcVT == MVT::f32 && Node->getValueType(0) == MVT::f64) { SDOperand Load = DAG.getLoad(SrcVT, Tmp1, Tmp2, Node->getOperand(2)); Result = DAG.getNode(ISD::FP_EXTEND, Node->getValueType(0), Load); Result = LegalizeOp(Result); // Relegalize new nodes. + Load = LegalizeOp(Load); + AddLegalizedOperand(SDOperand(Node, 0), Result); + AddLegalizedOperand(SDOperand(Node, 1), Load.getValue(1)); if (Op.ResNo) return Load.getValue(1); return Result; @@ -1112,10 +1115,10 @@ Result, DAG.getValueType(SrcVT)); else ValRes = DAG.getZeroExtendInReg(Result, SrcVT); - AddLegalizedOperand(SDOperand(Node, 0), ValRes); - AddLegalizedOperand(SDOperand(Node, 1), Result.getValue(1)); Result = LegalizeOp(Result); // Relegalize new nodes. ValRes = LegalizeOp(ValRes); // Relegalize new nodes. + AddLegalizedOperand(SDOperand(Node, 0), ValRes); + AddLegalizedOperand(SDOperand(Node, 1), Result.getValue(1)); if (Op.ResNo) return Result.getValue(1); return ValRes; @@ -1578,6 +1581,7 @@ Result = DAG.getSetCC(Node->getValueType(0), LHSHi, RHSHi, ISD::SETEQ); Result = LegalizeOp(DAG.getNode(ISD::SELECT, Tmp1.getValueType(), Result, Tmp1, Tmp2)); + AddLegalizedOperand(SDOperand(Node, 0), Result); return Result; } } @@ -1732,8 +1736,7 @@ std::pair CallResult = TLI.LowerCallTo(Tmp1, Type::VoidTy, false, CallingConv::C, false, DAG.getExternalSymbol(FnName, IntPtr), Args, DAG); - Result = CallResult.second; - NeedsAnotherIteration = true; + Result = LegalizeOp(CallResult.second); break; } } @@ -2137,8 +2140,8 @@ DAG.getNode(Node->getOpcode(), Node->getValueType(0), Tmp1); Tmp = TLI.LowerOperation(Tmp, DAG); if (Tmp.Val) { + Tmp = LegalizeOp(Tmp); // Relegalize input. AddLegalizedOperand(Op, Tmp); - NeedsAnotherIteration = true; return Tmp; } else { assert(0 && "Target Must Lower this"); @@ -2215,6 +2218,7 @@ False = DAG.getNode(ISD::XOR, NVT, False, DAG.getConstant(1ULL << ShiftAmt, NVT)); Result = LegalizeOp(DAG.getNode(ISD::SELECT, NVT, Tmp3, True, False)); + AddLegalizedOperand(SDOperand(Node, 0), Result); return Result; } else { assert(0 && "Do not know how to expand FP_TO_SINT yet!"); @@ -2230,8 +2234,8 @@ DAG.getNode(Node->getOpcode(), Node->getValueType(0), Tmp1); Tmp = TLI.LowerOperation(Tmp, DAG); if (Tmp.Val) { + Tmp = LegalizeOp(Tmp); AddLegalizedOperand(Op, Tmp); - NeedsAnotherIteration = true; return Tmp; } else { // The target thinks this is legal afterall. @@ -3822,6 +3826,10 @@ bool isNew = ExpandedNodes.insert(std::make_pair(Op, std::make_pair(Lo, Hi))).second; assert(isNew && "Value already expanded?!?"); + + // Make sure the resultant values have been legalized themselves. + Lo = LegalizeOp(Lo); + Hi = LegalizeOp(Hi); } From pmeredit at cs.uiuc.edu Mon Dec 19 20:03:35 2005 From: pmeredit at cs.uiuc.edu (Patrick Meredith) Date: Mon, 19 Dec 2005 20:03:35 -0600 Subject: [llvm-commits] CVS: llvm/utils/DSAextract.py Message-ID: <200512200203.UAA10604@zion.cs.uiuc.edu> Changes in directory llvm/utils: DSAextract.py updated: 1.1 -> 1.2 --- Log message: Added a break that I meant to include originally, for efficiency. Basically it keeps it from trying to add the same node to the node set over and over if it matches multiple given patterns. Also in cases where there are a lot of patterns to be matched, and it matches an early one, this will make the script run slightly faster. It's more there because it logically should be, than anything else, I mean, Python is never going to be fast ;-) --- Diffs of the changes: (+1 -0) DSAextract.py | 1 + 1 files changed, 1 insertion(+) Index: llvm/utils/DSAextract.py diff -u llvm/utils/DSAextract.py:1.1 llvm/utils/DSAextract.py:1.2 --- llvm/utils/DSAextract.py:1.1 Sun Dec 18 19:23:31 2005 +++ llvm/utils/DSAextract.py Mon Dec 19 20:03:23 2005 @@ -66,6 +66,7 @@ #for the node (it will be Node(hex number)) to our set of nodes if regexp.search(buffer): node_set |= set([re.split('\s+',buffer,2)[1]]) + break buffer = input.readline() From evan.cheng at apple.com Tue Dec 20 00:22:16 2005 From: evan.cheng at apple.com (Evan Cheng) Date: Tue, 20 Dec 2005 00:22:16 -0600 Subject: [llvm-commits] CVS: llvm/lib/Target/X86/X86ISelLowering.cpp X86ISelLowering.h Message-ID: <200512200622.AAA30819@zion.cs.uiuc.edu> Changes in directory llvm/lib/Target/X86: X86ISelLowering.cpp updated: 1.10 -> 1.11 X86ISelLowering.h updated: 1.4 -> 1.5 --- Log message: Added a hook to print out names of target specific DAG nodes. --- Diffs of the changes: (+21 -0) X86ISelLowering.cpp | 17 +++++++++++++++++ X86ISelLowering.h | 4 ++++ 2 files changed, 21 insertions(+) Index: llvm/lib/Target/X86/X86ISelLowering.cpp diff -u llvm/lib/Target/X86/X86ISelLowering.cpp:1.10 llvm/lib/Target/X86/X86ISelLowering.cpp:1.11 --- llvm/lib/Target/X86/X86ISelLowering.cpp:1.10 Mon Dec 19 17:12:38 2005 +++ llvm/lib/Target/X86/X86ISelLowering.cpp Tue Dec 20 00:22:03 2005 @@ -970,3 +970,20 @@ } } } + +const char *X86TargetLowering::getTargetNodeName(unsigned Opcode) const { + switch (Opcode) { + default: return NULL; + case X86ISD::FILD64m: return "X86ISD::FILD64m"; + case X86ISD::FP_TO_INT16_IN_MEM: return "X86ISD::FP_TO_INT16_IN_MEM"; + case X86ISD::FP_TO_INT32_IN_MEM: return "X86ISD::FP_TO_INT32_IN_MEM"; + case X86ISD::FP_TO_INT64_IN_MEM: return "X86ISD::FP_TO_INT64_IN_MEM"; + case X86ISD::CALL: return "X86ISD::CALL"; + case X86ISD::TAILCALL: return "X86ISD::TAILCALL"; + case X86ISD::RDTSC_DAG: return "X86ISD::RDTSC_DAG"; + case X86ISD::CMP: return "X86ISD::CMP"; + case X86ISD::TEST: return "X86ISD::TEST"; + case X86ISD::CMOV: return "X86ISD::CMOV"; + case X86ISD::BRCOND: return "X86ISD::BRCOND"; + } +} Index: llvm/lib/Target/X86/X86ISelLowering.h diff -u llvm/lib/Target/X86/X86ISelLowering.h:1.4 llvm/lib/Target/X86/X86ISelLowering.h:1.5 --- llvm/lib/Target/X86/X86ISelLowering.h:1.4 Mon Dec 19 17:12:38 2005 +++ llvm/lib/Target/X86/X86ISelLowering.h Tue Dec 20 00:22:03 2005 @@ -123,6 +123,10 @@ LowerFrameReturnAddress(bool isFrameAddr, SDOperand Chain, unsigned Depth, SelectionDAG &DAG); + /// getTargetNodeName - This method returns the name of a target specific + /// DAG node. + virtual const char *getTargetNodeName(unsigned Opcode) const; + SDOperand getReturnAddressFrameIndex(SelectionDAG &DAG); private: From evan.cheng at apple.com Tue Dec 20 00:22:16 2005 From: evan.cheng at apple.com (Evan Cheng) Date: Tue, 20 Dec 2005 00:22:16 -0600 Subject: [llvm-commits] CVS: llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp Message-ID: <200512200622.AAA30813@zion.cs.uiuc.edu> Changes in directory llvm/lib/CodeGen/SelectionDAG: SelectionDAG.cpp updated: 1.227 -> 1.228 --- Log message: Added a hook to print out names of target specific DAG nodes. --- Diffs of the changes: (+8 -5) SelectionDAG.cpp | 13 ++++++++----- 1 files changed, 8 insertions(+), 5 deletions(-) Index: llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp diff -u llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp:1.227 llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp:1.228 --- llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp:1.227 Mon Dec 19 17:11:49 2005 +++ llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp Tue Dec 20 00:22:03 2005 @@ -1835,15 +1835,18 @@ if (getOpcode() < ISD::BUILTIN_OP_END) return "<>"; else { - if (G) + if (G) { if (const TargetInstrInfo *TII = G->getTarget().getInstrInfo()) if (getOpcode()-ISD::BUILTIN_OP_END < TII->getNumOpcodes()) return TII->getName(getOpcode()-ISD::BUILTIN_OP_END); - std::string Name - = "<>"; - return Name.c_str(); + TargetLowering &TLI = G->getTargetLoweringInfo(); + const char *Name = + TLI.getTargetNodeName(getOpcode()); + if (Name) return Name; + } + + return "<>"; } case ISD::PCMARKER: return "PCMarker"; From evan.cheng at apple.com Tue Dec 20 00:22:16 2005 From: evan.cheng at apple.com (Evan Cheng) Date: Tue, 20 Dec 2005 00:22:16 -0600 Subject: [llvm-commits] CVS: llvm/include/llvm/Target/TargetLowering.h Message-ID: <200512200622.AAA30821@zion.cs.uiuc.edu> Changes in directory llvm/include/llvm/Target: TargetLowering.h updated: 1.29 -> 1.30 --- Log message: Added a hook to print out names of target specific DAG nodes. --- Diffs of the changes: (+4 -0) TargetLowering.h | 4 ++++ 1 files changed, 4 insertions(+) Index: llvm/include/llvm/Target/TargetLowering.h diff -u llvm/include/llvm/Target/TargetLowering.h:1.29 llvm/include/llvm/Target/TargetLowering.h:1.30 --- llvm/include/llvm/Target/TargetLowering.h:1.29 Mon Nov 28 23:45:28 2005 +++ llvm/include/llvm/Target/TargetLowering.h Tue Dec 20 00:22:03 2005 @@ -375,6 +375,10 @@ /// implement this. The default implementation of this aborts. virtual SDOperand LowerOperation(SDOperand Op, SelectionDAG &DAG); + // getTargetNodeName() - This method returns the name of a target specific + // DAG node. + virtual const char *getTargetNodeName(unsigned Opcode) const; + //===--------------------------------------------------------------------===// // Scheduler hooks // From evan.cheng at apple.com Tue Dec 20 00:22:16 2005 From: evan.cheng at apple.com (Evan Cheng) Date: Tue, 20 Dec 2005 00:22:16 -0600 Subject: [llvm-commits] CVS: llvm/lib/Target/TargetLowering.cpp Message-ID: <200512200622.AAA30827@zion.cs.uiuc.edu> Changes in directory llvm/lib/Target: TargetLowering.cpp updated: 1.15 -> 1.16 --- Log message: Added a hook to print out names of target specific DAG nodes. --- Diffs of the changes: (+3 -0) TargetLowering.cpp | 3 +++ 1 files changed, 3 insertions(+) Index: llvm/lib/Target/TargetLowering.cpp diff -u llvm/lib/Target/TargetLowering.cpp:1.15 llvm/lib/Target/TargetLowering.cpp:1.16 --- llvm/lib/Target/TargetLowering.cpp:1.15 Mon Nov 28 23:45:29 2005 +++ llvm/lib/Target/TargetLowering.cpp Tue Dec 20 00:22:03 2005 @@ -122,3 +122,6 @@ TransformToType[MVT::f64] = MVT::f64; } +const char *TargetLowering::getTargetNodeName(unsigned Opcode) const { + return NULL; +} From evan.cheng at apple.com Tue Dec 20 01:37:53 2005 From: evan.cheng at apple.com (Evan Cheng) Date: Tue, 20 Dec 2005 01:37:53 -0600 Subject: [llvm-commits] CVS: llvm/utils/TableGen/DAGISelEmitter.cpp Message-ID: <200512200737.BAA31062@zion.cs.uiuc.edu> Changes in directory llvm/utils/TableGen: DAGISelEmitter.cpp updated: 1.106 -> 1.107 --- Log message: Now support instructions with implicit write to non-flag registers. --- Diffs of the changes: (+91 -51) DAGISelEmitter.cpp | 142 +++++++++++++++++++++++++++++++++-------------------- 1 files changed, 91 insertions(+), 51 deletions(-) Index: llvm/utils/TableGen/DAGISelEmitter.cpp diff -u llvm/utils/TableGen/DAGISelEmitter.cpp:1.106 llvm/utils/TableGen/DAGISelEmitter.cpp:1.107 --- llvm/utils/TableGen/DAGISelEmitter.cpp:1.106 Mon Dec 19 18:06:17 2005 +++ llvm/utils/TableGen/DAGISelEmitter.cpp Tue Dec 20 01:37:41 2005 @@ -1763,7 +1763,6 @@ // Names of all the folded nodes which produce chains. std::vector > FoldedChains; bool FoundChain; - bool InFlag; unsigned TmpNo; public: @@ -1771,7 +1770,7 @@ TreePatternNode *pattern, TreePatternNode *instr, unsigned PatNum, std::ostream &os) : ISE(ise), Predicates(preds), Pattern(pattern), Instruction(instr), - PatternNo(PatNum), OS(os), FoundChain(false), InFlag(false), TmpNo(0) {}; + PatternNo(PatNum), OS(os), FoundChain(false), TmpNo(0) {}; /// EmitMatchCode - Emit a matcher for N, going to the label for PatternNo /// if the match fails. At this point, we already know that the opcode for N @@ -1884,10 +1883,6 @@ if (LeafRec->isSubClassOf("RegisterClass")) { // Handle register references. Nothing to do here. } else if (LeafRec->isSubClassOf("Register")) { - if (!InFlag) { - OS << " SDOperand InFlag = SDOperand(0,0);\n"; - InFlag = true; - } } else if (LeafRec->isSubClassOf("ComplexPattern")) { // Handle complex pattern. Nothing to do here. } else if (LeafRec->getName() == "srcvalue") { @@ -2015,6 +2010,16 @@ Record *Op = N->getOperator(); if (Op->isSubClassOf("Instruction")) { + const DAGInstruction &Inst = ISE.getInstruction(Op); + unsigned NumImpResults = Inst.getNumImpResults(); + unsigned NumImpOperands = Inst.getNumImpOperands(); + bool InFlag = NumImpOperands > 0; + bool OutFlag = NumImpResults > 0; + bool IsCopyFromReg = false; + + if (InFlag || OutFlag) + OS << " SDOperand InFlag = SDOperand(0,0);\n"; + // Determine operand emission order. Complex pattern first. std::vector > EmitOrder; std::vector >::iterator OI; @@ -2052,10 +2057,9 @@ // Emit all the chain and CopyToReg stuff. if (II.hasCtrlDep) OS << " Chain = Select(Chain);\n"; - EmitCopyToRegs(Pattern, "N", II.hasCtrlDep); + if (InFlag) + EmitCopyToRegs(Pattern, "N", II.hasCtrlDep); - const DAGInstruction &Inst = ISE.getInstruction(Op); - unsigned NumImpResults = Inst.getNumImpResults(); unsigned NumResults = Inst.getNumResults(); unsigned ResNo = TmpNo++; if (!isRoot) { @@ -2063,11 +2067,8 @@ << II.Namespace << "::" << II.TheDef->getName(); if (N->getType() != MVT::isVoid) OS << ", MVT::" << getEnumName(N->getType()); - for (unsigned i = 0; i < NumImpResults; i++) { - Record *ImpResult = Inst.getImpResult(i); - MVT::ValueType RVT = getRegisterValueType(ImpResult, CGT); - OS << ", MVT::" << getEnumName(RVT); - } + if (OutFlag) + OS << ", MVT::Flag"; unsigned LastOp = 0; for (unsigned i = 0, e = Ops.size(); i != e; ++i) { @@ -2080,7 +2081,7 @@ OS << " Chain = Tmp" << LastOp << ".getValue(" << NumResults << ");\n"; } - } else if (II.hasCtrlDep || NumImpResults > 0) { + } else if (II.hasCtrlDep || OutFlag) { OS << " SDOperand Result = CurDAG->getTargetNode(" << II.Namespace << "::" << II.TheDef->getName(); @@ -2093,11 +2094,8 @@ } if (II.hasCtrlDep) OS << ", MVT::Other"; - for (unsigned i = 0; i < NumImpResults; i++) { - Record *ImpResult = Inst.getImpResult(i); - MVT::ValueType RVT = getRegisterValueType(ImpResult, CGT); - OS << ", MVT::" << getEnumName(RVT); - } + if (OutFlag) + OS << ", MVT::Flag"; // Inputs. for (unsigned i = 0, e = Ops.size(); i != e; ++i) @@ -2114,33 +2112,43 @@ } if (II.hasCtrlDep) { - OS << " Chain "; - if (NodeHasChain(Pattern, ISE)) - OS << "= CodeGenMap[N.getValue(" << ValNo + NumImpResults << ")] "; + OS << " Chain = Result.getValue(" << ValNo << ");\n"; + if (OutFlag) + OS << " InFlag = Result.getValue(" << ValNo+1 << ");\n"; + } else if (OutFlag) + OS << " InFlag = Result.getValue(" << ValNo << ");\n"; + + if (OutFlag) + IsCopyFromReg = EmitCopyFromRegs(N, II.hasCtrlDep); + if (IsCopyFromReg) + OS << " CodeGenMap[N.getValue(" << ValNo++ << ")] = Result;\n"; + + if (OutFlag) + OS << " CodeGenMap[N.getValue(" << ValNo++ << ")] = InFlag;\n"; + + if (IsCopyFromReg || II.hasCtrlDep) { + OS << " "; + if (IsCopyFromReg || NodeHasChain(Pattern, ISE)) + OS << "CodeGenMap[N.getValue(" << ValNo << ")] = "; for (unsigned j = 0, e = FoldedChains.size(); j < e; j++) - OS << "= CodeGenMap[" << FoldedChains[j].first << ".getValue(" - << FoldedChains[j].second << ")] "; - OS << "= Result.getValue(" << ValNo << ");\n"; - for (unsigned i = 0; i < NumImpResults; i++) { - OS << " CodeGenMap[N.getValue(" << ValNo << ")] = Result"; - OS << ".getValue(" << ValNo+1 << ");\n"; - ValNo++; - } - } else { - for (unsigned i = 0; i < NumImpResults; i++) { - OS << " CodeGenMap[N.getValue(" << ValNo << ")] = Result"; - OS << ".getValue(" << ValNo << ");\n"; - ValNo++; - } + OS << "CodeGenMap[" << FoldedChains[j].first << ".getValue(" + << FoldedChains[j].second << ")] = "; + OS << "Chain;\n"; } // FIXME: this only works because (for now) an instruction can either // produce a single result or a single flag. - if (II.hasCtrlDep && NumImpResults > 0) - OS << " return (N.ResNo) ? Chain : Result.getValue(1);" - << " // Chain comes before flag.\n"; - else + if (II.hasCtrlDep && OutFlag) { + if (IsCopyFromReg) + OS << " return (N.ResNo == 0) ? Result : " + << "((N.ResNo == 2) ? Chain : InFlag);" + << " // Chain comes before flag.\n"; + else + OS << " return (N.ResNo) ? Chain : InFlag;" + << " // Chain comes before flag.\n"; + } else { OS << " return Result.getValue(N.ResNo);\n"; + } } else { // If this instruction is the root, and if there is only one use of it, // use SelectNodeTo instead of getTargetNode to avoid an allocation. @@ -2149,11 +2157,8 @@ << II.Namespace << "::" << II.TheDef->getName(); if (N->getType() != MVT::isVoid) OS << ", MVT::" << getEnumName(N->getType()); - for (unsigned i = 0; i < NumImpResults; i++) { - Record *ImpResult = Inst.getImpResult(i); - MVT::ValueType RVT = getRegisterValueType(ImpResult, CGT); - OS << ", MVT::" << getEnumName(RVT); - } + if (OutFlag) + OS << ", MVT::Flag"; for (unsigned i = 0, e = Ops.size(); i != e; ++i) OS << ", Tmp" << Ops[i]; if (InFlag) @@ -2164,11 +2169,8 @@ << II.Namespace << "::" << II.TheDef->getName(); if (N->getType() != MVT::isVoid) OS << ", MVT::" << getEnumName(N->getType()); - for (unsigned i = 0; i < NumImpResults; i++) { - Record *ImpResult = Inst.getImpResult(i); - MVT::ValueType RVT = getRegisterValueType(ImpResult, CGT); - OS << ", MVT::" << getEnumName(RVT); - } + if (OutFlag) + OS << ", MVT::Flag"; for (unsigned i = 0, e = Ops.size(); i != e; ++i) OS << ", Tmp" << Ops[i]; if (InFlag) @@ -2176,6 +2178,7 @@ OS << ");\n"; OS << " }\n"; } + return std::make_pair(1, ResNo); } else if (Op->isSubClassOf("SDNodeXForm")) { assert(N->getNumChildren() == 1 && "node xform should have one child!"); @@ -2259,6 +2262,43 @@ } } } + + /// EmitCopyFromRegs - Emit code to copy result to physical registers + /// as specified by the instruction. + bool EmitCopyFromRegs(TreePatternNode *N, bool HasCtrlDep) { + bool RetVal = false; + Record *Op = N->getOperator(); + if (Op->isSubClassOf("Instruction")) { + const DAGInstruction &Inst = ISE.getInstruction(Op); + const CodeGenTarget &CGT = ISE.getTargetInfo(); + CodeGenInstruction &II = CGT.getInstruction(Op->getName()); + unsigned NumImpResults = Inst.getNumImpResults(); + for (unsigned i = 0; i < NumImpResults; i++) { + Record *RR = Inst.getImpResult(i); + if (RR->isSubClassOf("Register")) { + MVT::ValueType RVT = getRegisterValueType(RR, CGT); + if (RVT != MVT::Flag) { + if (HasCtrlDep) { + OS << " Result = CurDAG->getCopyFromReg(Chain, " + << ISE.getQualifiedName(RR) + << ", MVT::" << getEnumName(RVT) << ", InFlag);\n"; + OS << " Chain = Result.getValue(1);\n"; + OS << " InFlag = Result.getValue(2);\n"; + } else { + OS << " SDOperand Chain;\n"; + OS << " Result = CurDAG->getCopyFromReg(" + << "CurDAG->getEntryNode(), ISE.getQualifiedName(RR)" + << ", MVT::" << getEnumName(RVT) << ", InFlag);\n"; + OS << " Chain = Result.getValue(1);\n"; + OS << " InFlag = Result.getValue(2);\n"; + } + RetVal = true; + } + } + } + } + return RetVal; + } }; /// EmitCodeForPattern - Given a pattern to match, emit code to the specified From evan.cheng at apple.com Tue Dec 20 01:38:49 2005 From: evan.cheng at apple.com (Evan Cheng) Date: Tue, 20 Dec 2005 01:38:49 -0600 Subject: [llvm-commits] CVS: llvm/lib/Target/TargetSelectionDAG.td Message-ID: <200512200738.BAA31081@zion.cs.uiuc.edu> Changes in directory llvm/lib/Target: TargetSelectionDAG.td updated: 1.31 -> 1.32 --- Log message: Added X86 readport patterns. --- Diffs of the changes: (+5 -0) TargetSelectionDAG.td | 5 +++++ 1 files changed, 5 insertions(+) Index: llvm/lib/Target/TargetSelectionDAG.td diff -u llvm/lib/Target/TargetSelectionDAG.td:1.31 llvm/lib/Target/TargetSelectionDAG.td:1.32 --- llvm/lib/Target/TargetSelectionDAG.td:1.31 Mon Dec 19 17:12:38 2005 +++ llvm/lib/Target/TargetSelectionDAG.td Tue Dec 20 01:38:38 2005 @@ -133,6 +133,10 @@ def SDTRet : SDTypeProfile<0, 0, []>; // ret +def SDTReadPort : SDTypeProfile<1, 1, [ // readport + SDTCisInt<0>, SDTCisInt<1> +]>; + def SDTWritePort : SDTypeProfile<0, 2, [ // writeport SDTCisInt<0>, SDTCisInt<1> ]>; @@ -254,6 +258,7 @@ def br : SDNode<"ISD::BR" , SDTBr, [SDNPHasChain]>; def ret : SDNode<"ISD::RET" , SDTRet, [SDNPHasChain]>; +def readport : SDNode<"ISD::READPORT" , SDTReadPort, [SDNPHasChain]>; def writeport : SDNode<"ISD::WRITEPORT" , SDTWritePort, [SDNPHasChain]>; def load : SDNode<"ISD::LOAD" , SDTLoad, [SDNPHasChain]>; From evan.cheng at apple.com Tue Dec 20 01:38:50 2005 From: evan.cheng at apple.com (Evan Cheng) Date: Tue, 20 Dec 2005 01:38:50 -0600 Subject: [llvm-commits] CVS: llvm/lib/Target/X86/X86InstrInfo.td Message-ID: <200512200738.BAA31087@zion.cs.uiuc.edu> Changes in directory llvm/lib/Target/X86: X86InstrInfo.td updated: 1.173 -> 1.174 --- Log message: Added X86 readport patterns. --- Diffs of the changes: (+21 -12) X86InstrInfo.td | 33 +++++++++++++++++++++------------ 1 files changed, 21 insertions(+), 12 deletions(-) Index: llvm/lib/Target/X86/X86InstrInfo.td diff -u llvm/lib/Target/X86/X86InstrInfo.td:1.173 llvm/lib/Target/X86/X86InstrInfo.td:1.174 --- llvm/lib/Target/X86/X86InstrInfo.td:1.173 Mon Dec 19 17:12:38 2005 +++ llvm/lib/Target/X86/X86InstrInfo.td Tue Dec 20 01:38:38 2005 @@ -399,18 +399,27 @@ // Input/Output Instructions... // def IN8rr : I<0xEC, RawFrm, (ops), - "in{b} {%dx, %al|%AL, %DX}", []>, Imp<[DX], [AL]>; + "in{b} {%dx, %al|%AL, %DX}", + [(set AL, (readport DX))]>, Imp<[DX], [AL]>; def IN16rr : I<0xED, RawFrm, (ops), - "in{w} {%dx, %ax|%AX, %DX}", []>, Imp<[DX], [AX]>, OpSize; + "in{w} {%dx, %ax|%AX, %DX}", + [(set AX, (readport DX))]>, Imp<[DX], [AX]>, OpSize; def IN32rr : I<0xED, RawFrm, (ops), - "in{l} {%dx, %eax|%EAX, %DX}", []>, Imp<[DX],[EAX]>; + "in{l} {%dx, %eax|%EAX, %DX}", + [(set EAX, (readport DX))]>, Imp<[DX],[EAX]>; -def IN8ri : Ii8<0xE4, RawFrm, (ops i8imm:$port), - "in{b} {$port, %al|%AL, $port}", []>, Imp<[], [AL]>; -def IN16ri : Ii8<0xE5, RawFrm, (ops i8imm:$port), - "in{w} {$port, %ax|%AX, $port}", []>, Imp<[], [AX]>, OpSize; -def IN32ri : Ii8<0xE5, RawFrm, (ops i8imm:$port), - "in{l} {$port, %eax|%EAX, $port}", []>, Imp<[],[EAX]>; +def IN8ri : Ii8<0xE4, RawFrm, (ops i16i8imm:$port), + "in{b} {$port, %al|%AL, $port}", + [(set AL, (readport i16immZExt8:$port))]>, + Imp<[], [AL]>; +def IN16ri : Ii8<0xE5, RawFrm, (ops i16i8imm:$port), + "in{w} {$port, %ax|%AX, $port}", + [(set AX, (readport i16immZExt8:$port))]>, + Imp<[], [AX]>, OpSize; +def IN32ri : Ii8<0xE5, RawFrm, (ops i16i8imm:$port), + "in{l} {$port, %eax|%EAX, $port}", + [(set EAX, (readport i16immZExt8:$port))]>, + Imp<[],[EAX]>; def OUT8rr : I<0xEE, RawFrm, (ops), "out{b} {%al, %dx|%DX, %AL}", @@ -425,15 +434,15 @@ def OUT8ir : Ii8<0xE6, RawFrm, (ops i16i8imm:$port), "out{b} {%al, $port|$port, %AL}", [(writeport AL, i16immZExt8:$port)]>, - Imp<[AL], []>; + Imp<[AL], []>; def OUT16ir : Ii8<0xE7, RawFrm, (ops i16i8imm:$port), "out{w} {%ax, $port|$port, %AX}", [(writeport AX, i16immZExt8:$port)]>, - Imp<[AX], []>, OpSize; + Imp<[AX], []>, OpSize; def OUT32ir : Ii8<0xE7, RawFrm, (ops i16i8imm:$port), "out{l} {%eax, $port|$port, %EAX}", [(writeport EAX, i16immZExt8:$port)]>, - Imp<[EAX], []>; + Imp<[EAX], []>; //===----------------------------------------------------------------------===// // Move Instructions... From lattner at cs.uiuc.edu Tue Dec 20 01:56:42 2005 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Tue, 20 Dec 2005 01:56:42 -0600 Subject: [llvm-commits] CVS: llvm/lib/Target/SparcV8/SparcV8RegisterInfo.cpp SparcV8RegisterInfo.td Message-ID: <200512200756.BAA31190@zion.cs.uiuc.edu> Changes in directory llvm/lib/Target/SparcV8: SparcV8RegisterInfo.cpp updated: 1.30 -> 1.31 SparcV8RegisterInfo.td updated: 1.26 -> 1.27 --- Log message: Reserve G1 for frame offset stuff and use it to handle large stack frames. For example, instead of emitting this: test: save -40112, %o6, %o6 ;; imm too large add %i6, -40016, %o0 ;; imm too large call caller nop restore %g0, %g0, %g0 retl nop emit this: test: sethi 4194264, %g1 or %g1, 848, %g1 save %o6, %g1, %o6 sethi 4194264, %g1 add %g1, %i6, %g1 add %i1, 944, %o0 call caller nop restore %g0, %g0, %g0 retl nop which doesn't cause the assembler to barf. --- Diffs of the changes: (+42 -9) SparcV8RegisterInfo.cpp | 44 +++++++++++++++++++++++++++++++++++++------- SparcV8RegisterInfo.td | 7 +++++-- 2 files changed, 42 insertions(+), 9 deletions(-) Index: llvm/lib/Target/SparcV8/SparcV8RegisterInfo.cpp diff -u llvm/lib/Target/SparcV8/SparcV8RegisterInfo.cpp:1.30 llvm/lib/Target/SparcV8/SparcV8RegisterInfo.cpp:1.31 --- llvm/lib/Target/SparcV8/SparcV8RegisterInfo.cpp:1.30 Sun Dec 18 20:51:12 2005 +++ llvm/lib/Target/SparcV8/SparcV8RegisterInfo.cpp Tue Dec 20 01:56:31 2005 @@ -96,15 +96,30 @@ int FrameIndex = MI.getOperand(i).getFrameIndex(); - // Replace frame index with a frame pointer reference - MI.SetMachineOperandReg (i, V8::I6); - // Addressable stack objects are accessed using neg. offsets from %fp MachineFunction &MF = *MI.getParent()->getParent(); int Offset = MF.getFrameInfo()->getObjectOffset(FrameIndex) + MI.getOperand(i+1).getImmedValue(); - // note: Offset < 0 - MI.SetMachineOperandConst (i+1, MachineOperand::MO_SignExtendedImmed, Offset); + + // Replace frame index with a frame pointer reference. + if (Offset >= -4096 && Offset <= 4095) { + // If the offset is small enough to fit in the immediate field, directly + // encode it. + MI.SetMachineOperandReg(i, V8::I6); + MI.SetMachineOperandConst(i+1, MachineOperand::MO_SignExtendedImmed,Offset); + } else { + // Otherwise, emit a G1 = SETHI %hi(offset). FIXME: it would be better to + // scavenge a register here instead of reserving G1 all of the time. + unsigned OffHi = (unsigned)Offset >> 10U; + BuildMI(*MI.getParent(), II, V8::SETHIi, 1, V8::G1).addImm(OffHi); + // Emit G1 = G1 + I6 + BuildMI(*MI.getParent(), II, V8::ADDrr, 2, + V8::G1).addReg(V8::G1).addReg(V8::I6); + // Insert: G1+%lo(offset) into the user. + MI.SetMachineOperandReg(i, V8::I1); + MI.SetMachineOperandConst(i+1, MachineOperand::MO_SignExtendedImmed, + Offset & ((1 << 10)-1)); + } } void SparcV8RegisterInfo:: @@ -128,8 +143,23 @@ // Round up to next doubleword boundary -- a double-word boundary // is required by the ABI. NumBytes = (NumBytes + 7) & ~7; - BuildMI(MBB, MBB.begin(), V8::SAVEri, 2, - V8::O6).addImm(-NumBytes).addReg(V8::O6); + NumBytes = -NumBytes; + + if (NumBytes >= -4096) { + BuildMI(MBB, MBB.begin(), V8::SAVEri, 2, + V8::O6).addImm(NumBytes).addReg(V8::O6); + } else { + MachineBasicBlock::iterator InsertPt = MBB.begin(); + // Emit this the hard way. This clobbers G1 which we always know is + // available here. + unsigned OffHi = (unsigned)NumBytes >> 10U; + BuildMI(MBB, InsertPt, V8::SETHIi, 1, V8::G1).addImm(OffHi); + // Emit G1 = G1 + I6 + BuildMI(MBB, InsertPt, V8::ORri, 2, V8::G1) + .addReg(V8::G1).addImm(NumBytes & ((1 << 10)-1)); + BuildMI(MBB, InsertPt, V8::SAVErr, 2, + V8::O6).addReg(V8::O6).addReg(V8::G1); + } } void SparcV8RegisterInfo::emitEpilogue(MachineFunction &MF, Index: llvm/lib/Target/SparcV8/SparcV8RegisterInfo.td diff -u llvm/lib/Target/SparcV8/SparcV8RegisterInfo.td:1.26 llvm/lib/Target/SparcV8/SparcV8RegisterInfo.td:1.27 --- llvm/lib/Target/SparcV8/SparcV8RegisterInfo.td:1.26 Sun Dec 18 18:06:52 2005 +++ llvm/lib/Target/SparcV8/SparcV8RegisterInfo.td Tue Dec 20 01:56:31 2005 @@ -84,8 +84,10 @@ // def IntRegs : RegisterClass<"V8", [i32], 32, [L0, L1, L2, L3, L4, L5, L6, L7, I0, I1, I2, I3, I4, I5, - G1, O0, O1, O2, O3, O4, O5, O7, + + // FIXME: G1 reserved for now for large imm generation by frame code. + G1, // Non-allocatable regs: G2, G3, G4, // FIXME: OK for use only in // applications, not libraries. @@ -102,7 +104,8 @@ IntRegsClass::iterator IntRegsClass::allocation_order_end(MachineFunction &MF) const { // FIXME: These special regs should be taken out of the regclass! - return end()-10; // Don't allocate special registers + return end()-10 // Don't allocate special registers + -1; // FIXME: G1 reserved for large imm generation by frame code. } }]; } From lattner at cs.uiuc.edu Tue Dec 20 02:00:22 2005 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Tue, 20 Dec 2005 02:00:22 -0600 Subject: [llvm-commits] CVS: llvm/lib/Target/SparcV8/SparcV8TargetMachine.cpp Message-ID: <200512200800.CAA31295@zion.cs.uiuc.edu> Changes in directory llvm/lib/Target/SparcV8: SparcV8TargetMachine.cpp updated: 1.33 -> 1.34 --- Log message: Run lower-switch after lower-invoke. Only run lower-allocations and lower-select for the simple isel --- Diffs of the changes: (+10 -12) SparcV8TargetMachine.cpp | 22 ++++++++++------------ 1 files changed, 10 insertions(+), 12 deletions(-) Index: llvm/lib/Target/SparcV8/SparcV8TargetMachine.cpp diff -u llvm/lib/Target/SparcV8/SparcV8TargetMachine.cpp:1.33 llvm/lib/Target/SparcV8/SparcV8TargetMachine.cpp:1.34 --- llvm/lib/Target/SparcV8/SparcV8TargetMachine.cpp:1.33 Sat Dec 17 01:47:01 2005 +++ llvm/lib/Target/SparcV8/SparcV8TargetMachine.cpp Tue Dec 20 02:00:11 2005 @@ -73,28 +73,25 @@ // FIXME: Implement efficient support for garbage collection intrinsics. PM.add(createLowerGCPass()); - // Replace malloc and free instructions with library calls. - PM.add(createLowerAllocationsPass()); - - // FIXME: implement the switch instruction in the instruction selector. - PM.add(createLowerSwitchPass()); + // Make sure that no unreachable blocks are instruction selected. + PM.add(createUnreachableBlockEliminationPass()); // FIXME: implement the invoke/unwind instructions! PM.add(createLowerInvokePass()); - // Make sure that no unreachable blocks are instruction selected. - PM.add(createUnreachableBlockEliminationPass()); - - // FIXME: implement the select instruction in the instruction selector. - PM.add(createLowerSelectPass()); + // FIXME: implement the switch instruction in the instruction selector. + PM.add(createLowerSwitchPass()); // Print LLVM code input to instruction selector: if (PrintMachineCode) PM.add(new PrintFunctionPass()); - if (DisableV8DAGDAG) + if (DisableV8DAGDAG) { + // Replace malloc and free instructions with library calls. + PM.add(createLowerAllocationsPass()); + PM.add(createLowerSelectPass()); PM.add(createSparcV8SimpleInstructionSelector(*this)); - else + } else PM.add(createSparcV8ISelDag(*this)); // Print machine instructions as they were initially generated. @@ -110,6 +107,7 @@ PM.add(createMachineFunctionPrinterPass(&std::cerr)); PM.add(createSparcV8FPMoverPass(*this)); + PM.add(createSparcV8DelaySlotFillerPass(*this)); // Print machine instructions after filling delay slots. From lattner at cs.uiuc.edu Tue Dec 20 13:41:14 2005 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Tue, 20 Dec 2005 13:41:14 -0600 Subject: [llvm-commits] CVS: llvm/utils/TableGen/DAGISelEmitter.cpp Message-ID: <200512201941.NAA13306@zion.cs.uiuc.edu> Changes in directory llvm/utils/TableGen: DAGISelEmitter.cpp updated: 1.107 -> 1.108 --- Log message: This ugly patch works around a GCC bug where it is compiling SelectCode to use too much stack space, overflowing the stack for large functions. Instead of emitting new SDOperands in each match block, we emit some common ones at the top of SelectCode then reuse them when possible. This reduces the stack size of SelectCode from 28K to 21K. Note that GCC compiles it to 512 bytes :-/ I've filed GCC PR 25505: http://llvm.cs.uiuc.edu/PR25505 to track this. --- Diffs of the changes: (+56 -22) DAGISelEmitter.cpp | 78 ++++++++++++++++++++++++++++++++++++++--------------- 1 files changed, 56 insertions(+), 22 deletions(-) Index: llvm/utils/TableGen/DAGISelEmitter.cpp diff -u llvm/utils/TableGen/DAGISelEmitter.cpp:1.107 llvm/utils/TableGen/DAGISelEmitter.cpp:1.108 --- llvm/utils/TableGen/DAGISelEmitter.cpp:1.107 Tue Dec 20 01:37:41 2005 +++ llvm/utils/TableGen/DAGISelEmitter.cpp Tue Dec 20 13:41:03 2005 @@ -1772,6 +1772,21 @@ ISE(ise), Predicates(preds), Pattern(pattern), Instruction(instr), PatternNo(PatNum), OS(os), FoundChain(false), TmpNo(0) {}; + /// DeclareSDOperand - Emit "SDOperand " or "". This works + /// around an ugly GCC bug where SelectCode is using too much stack space + void DeclareSDOperand(const std::string &OpName) const { + // If it's one of the common cases declared at the top of SelectCode, just + // use the existing declaration. + if (OpName == "N0" || OpName == "N1" || OpName == "N2" || + OpName == "N00" || OpName == "N01" || + OpName == "N10" || OpName == "N11" || + OpName == "Tmp0" || OpName == "Tmp1" || + OpName == "Tmp2" || OpName == "Tmp3") + OS << OpName; + else + OS << "SDOperand " << OpName; + } + /// EmitMatchCode - Emit a matcher for N, going to the label for PatternNo /// if the match fails. At this point, we already know that the opcode for N /// matches, and the SDNode for the result has the RootName specified name. @@ -1845,8 +1860,9 @@ } for (unsigned i = 0, e = N->getNumChildren(); i != e; ++i, ++OpNo) { - OS << " SDOperand " << RootName << OpNo <<" = " << RootName - << ".getOperand(" << OpNo << ");\n"; + OS << " "; + DeclareSDOperand(RootName+utostr(OpNo)); + OS << " = " << RootName << ".getOperand(" << OpNo << ");\n"; TreePatternNode *Child = N->getChild(i); if (!Child->isLeaf()) { @@ -1915,7 +1931,7 @@ if (HasChain) { if (!FoundChain) { - OS << " SDOperand Chain = " << RootName << ".getOperand(0);\n"; + OS << " Chain = " << RootName << ".getOperand(0);\n"; FoundChain = true; } } @@ -1954,28 +1970,35 @@ case MVT::i64: OS << " uint64_t Tmp"; break; } OS << ResNo << "C = cast(" << Val << ")->getValue();\n"; - OS << " SDOperand Tmp" << ResNo << " = CurDAG->getTargetConstant(Tmp" + OS << " "; + DeclareSDOperand("Tmp"+utostr(ResNo)); + OS << " = CurDAG->getTargetConstant(Tmp" << ResNo << "C, MVT::" << getEnumName(N->getType()) << ");\n"; } else if (!N->isLeaf() && N->getOperator()->getName() == "tglobaladdr") { - OS << " SDOperand Tmp" << ResNo << " = " << Val << ";\n"; + OS << " "; + DeclareSDOperand("Tmp"+utostr(ResNo)); + OS << " = " << Val << ";\n"; } else if (!N->isLeaf() && N->getOperator()->getName() == "tconstpool") { - OS << " SDOperand Tmp" << ResNo << " = " << Val << ";\n"; + OS << " "; + DeclareSDOperand("Tmp"+utostr(ResNo)); + OS << " = " << Val << ";\n"; } else if (N->isLeaf() && (CP = NodeGetComplexPattern(N, ISE))) { std::string Fn = CP->getSelectFunc(); NumRes = CP->getNumOperands(); - OS << " SDOperand "; - for (unsigned i = 0; i < NumRes; i++) { - if (i != 0) OS << ", "; - OS << "Tmp" << i + ResNo; + for (unsigned i = 0; i != NumRes; ++i) { + OS << " "; + DeclareSDOperand("Tmp" + utostr(i+ResNo)); + OS << ";\n"; } - OS << ";\n"; OS << " if (!" << Fn << "(" << Val; for (unsigned i = 0; i < NumRes; i++) OS << ", Tmp" << i + ResNo; OS << ")) goto P" << PatternNo << "Fail;\n"; TmpNo = ResNo + NumRes; } else { - OS << " SDOperand Tmp" << ResNo << " = Select(" << Val << ");\n"; + OS << " "; + DeclareSDOperand("Tmp"+utostr(ResNo)); + OS << " = Select(" << Val << ");\n"; } // Add Tmp to VariableMap, so that we don't multiply select this // value if used multiple times by this pattern result. @@ -1988,7 +2011,9 @@ if (DefInit *DI = dynamic_cast(N->getLeafValue())) { unsigned ResNo = TmpNo++; if (DI->getDef()->isSubClassOf("Register")) { - OS << " SDOperand Tmp" << ResNo << " = CurDAG->getRegister(" + OS << " "; + DeclareSDOperand("Tmp"+utostr(ResNo)); + OS << " = CurDAG->getRegister(" << ISE.getQualifiedName(DI->getDef()) << ", MVT::" << getEnumName(N->getType()) << ");\n"; @@ -1996,7 +2021,9 @@ } } else if (IntInit *II = dynamic_cast(N->getLeafValue())) { unsigned ResNo = TmpNo++; - OS << " SDOperand Tmp" << ResNo << " = CurDAG->getTargetConstant(" + OS << " "; + DeclareSDOperand("Tmp"+utostr(ResNo)); + OS << " = CurDAG->getTargetConstant(" << II->getValue() << ", MVT::" << getEnumName(N->getType()) << ");\n"; @@ -2018,7 +2045,7 @@ bool IsCopyFromReg = false; if (InFlag || OutFlag) - OS << " SDOperand InFlag = SDOperand(0,0);\n"; + OS << " InFlag = SDOperand(0, 0);\n"; // Determine operand emission order. Complex pattern first. std::vector > EmitOrder; @@ -2063,7 +2090,9 @@ unsigned NumResults = Inst.getNumResults(); unsigned ResNo = TmpNo++; if (!isRoot) { - OS << " SDOperand Tmp" << ResNo << " = CurDAG->getTargetNode(" + OS << " "; + DeclareSDOperand("Tmp"+utostr(ResNo)); + OS << " = CurDAG->getTargetNode(" << II.Namespace << "::" << II.TheDef->getName(); if (N->getType() != MVT::isVoid) OS << ", MVT::" << getEnumName(N->getType()); @@ -2082,7 +2111,7 @@ << NumResults << ");\n"; } } else if (II.hasCtrlDep || OutFlag) { - OS << " SDOperand Result = CurDAG->getTargetNode(" + OS << " Result = CurDAG->getTargetNode(" << II.Namespace << "::" << II.TheDef->getName(); // Output order: results, chain, flags @@ -2184,7 +2213,9 @@ assert(N->getNumChildren() == 1 && "node xform should have one child!"); unsigned OpVal = EmitResultCode(N->getChild(0)).second; unsigned ResNo = TmpNo++; - OS << " SDOperand Tmp" << ResNo << " = Transform_" << Op->getName() + OS << " "; + DeclareSDOperand("Tmp"+utostr(ResNo)); + OS << " = Transform_" << Op->getName() << "(Tmp" << OpVal << ".Val);\n"; if (isRoot) { OS << " CodeGenMap[N] = Tmp" << ResNo << ";\n"; @@ -2285,7 +2316,7 @@ OS << " Chain = Result.getValue(1);\n"; OS << " InFlag = Result.getValue(2);\n"; } else { - OS << " SDOperand Chain;\n"; + OS << " Chain;\n"; OS << " Result = CurDAG->getCopyFromReg(" << "CurDAG->getEntryNode(), ISE.getQualifiedName(RR)" << ", MVT::" << getEnumName(RVT) << ", InFlag);\n"; @@ -2394,6 +2425,9 @@ << " return N; // Already selected.\n\n" << " std::map::iterator CGMI = CodeGenMap.find(N);\n" << " if (CGMI != CodeGenMap.end()) return CGMI->second;\n" + << " // Work arounds for GCC stack overflow bugs.\n" + << " SDOperand N0, N1, N2, N00, N01, N10, N11, Tmp0, Tmp1, Tmp2, Tmp3;\n" + << " SDOperand Chain, InFlag, Result;\n" << " switch (N.getOpcode()) {\n" << " default: break;\n" << " case ISD::EntryToken: // These leaves remain the same.\n" @@ -2419,7 +2453,7 @@ << " CurDAG->getNode(ISD::TokenFactor, MVT::Other, Ops);\n" << " }\n" << " case ISD::CopyFromReg: {\n" - << " SDOperand Chain = Select(N.getOperand(0));\n" + << " Chain = Select(N.getOperand(0));\n" << " unsigned Reg = cast(N.getOperand(1))->getReg();\n" << " MVT::ValueType VT = N.Val->getValueType(0);\n" << " if (N.Val->getNumValues() == 2) {\n" @@ -2442,10 +2476,10 @@ << " }\n" << " }\n" << " case ISD::CopyToReg: {\n" - << " SDOperand Chain = Select(N.getOperand(0));\n" + << " Chain = Select(N.getOperand(0));\n" << " unsigned Reg = cast(N.getOperand(1))->getReg();\n" << " SDOperand Val = Select(N.getOperand(2));\n" - << " SDOperand Result = N;\n" + << " Result = N;\n" << " if (N.Val->getNumValues() == 1) {\n" << " if (Chain != N.getOperand(0) || Val != N.getOperand(2))\n" << " Result = CurDAG->getCopyToReg(Chain, Reg, Val);\n" From evan.cheng at apple.com Tue Dec 20 14:08:13 2005 From: evan.cheng at apple.com (Evan Cheng) Date: Tue, 20 Dec 2005 14:08:13 -0600 Subject: [llvm-commits] CVS: llvm/utils/TableGen/DAGISelEmitter.cpp Message-ID: <200512202008.OAA14593@zion.cs.uiuc.edu> Changes in directory llvm/utils/TableGen: DAGISelEmitter.cpp updated: 1.108 -> 1.109 --- Log message: Fix the semantic of Requires<[cond]> to mean if (!cond) goto PXXFail; --- Diffs of the changes: (+1 -1) DAGISelEmitter.cpp | 2 +- 1 files changed, 1 insertion(+), 1 deletion(-) Index: llvm/utils/TableGen/DAGISelEmitter.cpp diff -u llvm/utils/TableGen/DAGISelEmitter.cpp:1.108 llvm/utils/TableGen/DAGISelEmitter.cpp:1.109 --- llvm/utils/TableGen/DAGISelEmitter.cpp:1.108 Tue Dec 20 13:41:03 2005 +++ llvm/utils/TableGen/DAGISelEmitter.cpp Tue Dec 20 14:08:01 2005 @@ -1803,7 +1803,7 @@ OS << " if ("; else OS << " && "; - OS << "(" << Def->getValueAsString("CondString") << ")"; + OS << "!(" << Def->getValueAsString("CondString") << ")"; if (i == e-1) OS << ") goto P" << PatternNo << "Fail;\n"; } else { From evan.cheng at apple.com Tue Dec 20 14:09:04 2005 From: evan.cheng at apple.com (Evan Cheng) Date: Tue, 20 Dec 2005 14:09:04 -0600 Subject: [llvm-commits] CVS: llvm/lib/Target/PowerPC/PPCInstrInfo.td Message-ID: <200512202009.OAA14746@zion.cs.uiuc.edu> Changes in directory llvm/lib/Target/PowerPC: PPCInstrInfo.td updated: 1.163 -> 1.164 --- Log message: Flip the meaning of FPContractions to reflect Requires<[]> change. --- Diffs of the changes: (+1 -1) PPCInstrInfo.td | 2 +- 1 files changed, 1 insertion(+), 1 deletion(-) Index: llvm/lib/Target/PowerPC/PPCInstrInfo.td diff -u llvm/lib/Target/PowerPC/PPCInstrInfo.td:1.163 llvm/lib/Target/PowerPC/PPCInstrInfo.td:1.164 --- llvm/lib/Target/PowerPC/PPCInstrInfo.td:1.163 Mon Dec 19 18:26:01 2005 +++ llvm/lib/Target/PowerPC/PPCInstrInfo.td Tue Dec 20 14:08:53 2005 @@ -187,7 +187,7 @@ //===----------------------------------------------------------------------===// // PowerPC Instruction Predicate Definitions. -def FPContractions : Predicate<"NoExcessFPPrecision">; +def FPContractions : Predicate<"!NoExcessFPPrecision">; //===----------------------------------------------------------------------===// // PowerPC Instruction Definitions. From criswell at cs.uiuc.edu Tue Dec 20 14:13:08 2005 From: criswell at cs.uiuc.edu (John Criswell) Date: Tue, 20 Dec 2005 14:13:08 -0600 Subject: [llvm-commits] CVS: llvm-poolalloc/runtime/README.txt Message-ID: <200512202013.OAA22693@choi.cs.uiuc.edu> Changes in directory llvm-poolalloc/runtime: README.txt updated: 1.3 -> 1.4 --- Log message: Fixed minor typo. --- Diffs of the changes: (+1 -1) README.txt | 2 +- 1 files changed, 1 insertion(+), 1 deletion(-) Index: llvm-poolalloc/runtime/README.txt diff -u llvm-poolalloc/runtime/README.txt:1.3 llvm-poolalloc/runtime/README.txt:1.4 --- llvm-poolalloc/runtime/README.txt:1.3 Wed May 18 14:56:29 2005 +++ llvm-poolalloc/runtime/README.txt Tue Dec 20 14:12:48 2005 @@ -5,7 +5,7 @@ directory. This supports the pool allocator, the bump pointer optimization, and the pointer compression runtime. -The implementation is the FreeListAllocator directory is much slower than +The implementation in the FreeListAllocator directory is much slower than the FL2Allocator and has not been updated. The implementation in the PoolAllocator directory is also probably out of date, From evan.cheng at apple.com Tue Dec 20 17:00:03 2005 From: evan.cheng at apple.com (Evan Cheng) Date: Tue, 20 Dec 2005 17:00:03 -0600 Subject: [llvm-commits] CVS: llvm/lib/Target/X86/X86InstrInfo.td X86RegisterInfo.td X86TargetMachine.cpp Message-ID: <200512202300.RAA10444@zion.cs.uiuc.edu> Changes in directory llvm/lib/Target/X86: X86InstrInfo.td updated: 1.174 -> 1.175 X86RegisterInfo.td updated: 1.24 -> 1.25 X86TargetMachine.cpp updated: 1.91 -> 1.92 --- Log message: SSE2 floating point load / store patterns. SSE2 fp to int conversion patterns. --- Diffs of the changes: (+188 -140) X86InstrInfo.td | 316 ++++++++++++++++++++++++++++----------------------- X86RegisterInfo.td | 9 + X86TargetMachine.cpp | 3 3 files changed, 188 insertions(+), 140 deletions(-) Index: llvm/lib/Target/X86/X86InstrInfo.td diff -u llvm/lib/Target/X86/X86InstrInfo.td:1.174 llvm/lib/Target/X86/X86InstrInfo.td:1.175 --- llvm/lib/Target/X86/X86InstrInfo.td:1.174 Tue Dec 20 01:38:38 2005 +++ llvm/lib/Target/X86/X86InstrInfo.td Tue Dec 20 16:59:50 2005 @@ -104,6 +104,12 @@ def MRM6m : Format<30>; def MRM7m : Format<31>; //===----------------------------------------------------------------------===// +// X86 Instruction Predicate Definitions. +def HasSSE1 : Predicate<"X86Vector >= SSE">; +def HasSSE2 : Predicate<"X86Vector >= SSE2">; +def HasSSE3 : Predicate<"X86Vector >= SSE3">; + +//===----------------------------------------------------------------------===// // X86 specific pattern fragments. // @@ -204,6 +210,8 @@ def loadi8 : PatFrag<(ops node:$ptr), (i8 (load node:$ptr))>; def loadi16 : PatFrag<(ops node:$ptr), (i16 (load node:$ptr))>; def loadi32 : PatFrag<(ops node:$ptr), (i32 (load node:$ptr))>; +def loadf32 : PatFrag<(ops node:$ptr), (f32 (load node:$ptr))>; +def loadf64 : PatFrag<(ops node:$ptr), (f64 (load node:$ptr))>; def sextloadi16i1 : PatFrag<(ops node:$ptr), (i16 (sextload node:$ptr, i1))>; def sextloadi32i1 : PatFrag<(ops node:$ptr), (i32 (sextload node:$ptr, i1))>; @@ -1967,150 +1975,176 @@ // XMM Floating point support (requires SSE2) //===----------------------------------------------------------------------===// -def MOVSSrr : I<0x10, MRMSrcReg, (ops V4F4:$dst, V4F4:$src), - "movss {$src, $dst|$dst, $src}", []>, XS; -def MOVSSrm : I<0x10, MRMSrcMem, (ops V4F4:$dst, f32mem:$src), - "movss {$src, $dst|$dst, $src}", []>, XS; -def MOVSSmr : I<0x11, MRMDestMem, (ops f32mem:$dst, V4F4:$src), +def MOVSSrr : I<0x10, MRMSrcReg, (ops FR32:$dst, FR32:$src), "movss {$src, $dst|$dst, $src}", []>, XS; -def MOVSDrr : I<0x10, MRMSrcReg, (ops V2F8:$dst, V2F8:$src), - "movsd {$src, $dst|$dst, $src}", []>, XD; -def MOVSDrm : I<0x10, MRMSrcMem, (ops V2F8:$dst, f64mem:$src), - "movsd {$src, $dst|$dst, $src}", []>, XD; -def MOVSDmr : I<0x11, MRMDestMem, (ops f64mem:$dst, V2F8:$src), +def MOVSDrr : I<0x10, MRMSrcReg, (ops FR64:$dst, FR64:$src), "movsd {$src, $dst|$dst, $src}", []>, XD; -def CVTTSD2SIrr: I<0x2C, MRMSrcReg, (ops R32:$dst, V2F8:$src), +def MOVSSrm : I<0x10, MRMSrcMem, (ops FR32:$dst, f32mem:$src), + "movss {$src, $dst|$dst, $src}", + [(set FR32:$dst, (loadf32 addr:$src))]>, + Requires<[HasSSE2]>, XS; +def MOVSSmr : I<0x11, MRMDestMem, (ops f32mem:$dst, FR32:$src), + "movss {$src, $dst|$dst, $src}", + [(store FR32:$src, addr:$dst)]>, XS; +def MOVSDrm : I<0x10, MRMSrcMem, (ops FR64:$dst, f64mem:$src), + "movsd {$src, $dst|$dst, $src}", + [(set FR64:$dst, (loadf64 addr:$src))]>, + Requires<[HasSSE2]>, XD; +def MOVSDmr : I<0x11, MRMDestMem, (ops f64mem:$dst, FR64:$src), + "movsd {$src, $dst|$dst, $src}", + [(store FR64:$src, addr:$dst)]>, + Requires<[HasSSE2]>, XD; + +def CVTTSD2SIrr: I<0x2C, MRMSrcReg, (ops R32:$dst, FR64:$src), "cvttsd2si {$src, $dst|$dst, $src}", - [(set R32:$dst, (fp_to_sint V2F8:$src))]>, XD; + [(set R32:$dst, (fp_to_sint FR64:$src))]>, + Requires<[HasSSE2]>, XD; def CVTTSD2SIrm: I<0x2C, MRMSrcMem, (ops R32:$dst, f64mem:$src), - "cvttsd2si {$src, $dst|$dst, $src}", []>, XD; -def CVTTSS2SIrr: I<0x2C, MRMSrcReg, (ops R32:$dst, V4F4:$src), + "cvttsd2si {$src, $dst|$dst, $src}", + [(set R32:$dst, (fp_to_sint (loadf64 addr:$src)))]>, + Requires<[HasSSE2]>, XD; +def CVTTSS2SIrr: I<0x2C, MRMSrcReg, (ops R32:$dst, FR32:$src), "cvttss2si {$src, $dst|$dst, $src}", - [(set R32:$dst, (fp_to_sint V4F4:$src))]>, XS; + [(set R32:$dst, (fp_to_sint FR32:$src))]>, + Requires<[HasSSE2]>, XS; def CVTTSS2SIrm: I<0x2C, MRMSrcMem, (ops R32:$dst, f32mem:$src), - "cvttss2si {$src, $dst|$dst, $src}", []>, XS; -def CVTSD2SSrr: I<0x5A, MRMSrcReg, (ops V4F4:$dst, V2F8:$src), + "cvttss2si {$src, $dst|$dst, $src}", + [(set R32:$dst, (fp_to_sint (loadf32 addr:$src)))]>, + Requires<[HasSSE2]>, XS; +def CVTSD2SSrr: I<0x5A, MRMSrcReg, (ops FR32:$dst, FR64:$src), "cvtsd2ss {$src, $dst|$dst, $src}", - [(set V4F4:$dst, (fround V2F8:$src))]>, XS; -def CVTSD2SSrm: I<0x5A, MRMSrcMem, (ops V4F4:$dst, f64mem:$src), - "cvtsd2ss {$src, $dst|$dst, $src}", []>, XS; -def CVTSS2SDrr: I<0x5A, MRMSrcReg, (ops V2F8:$dst, V4F4:$src), + [(set FR32:$dst, (fround FR64:$src))]>, + Requires<[HasSSE2]>, XS; +def CVTSD2SSrm: I<0x5A, MRMSrcMem, (ops FR32:$dst, f64mem:$src), + "cvtsd2ss {$src, $dst|$dst, $src}", + [(set FR32:$dst, (fround (loadf64 addr:$src)))]>, + Requires<[HasSSE2]>, XS; +def CVTSS2SDrr: I<0x5A, MRMSrcReg, (ops FR64:$dst, FR32:$src), + "cvtss2sd {$src, $dst|$dst, $src}", + [(set FR64:$dst, (fextend FR32:$src))]>, + Requires<[HasSSE2]>, XD; +def CVTSS2SDrm: I<0x5A, MRMSrcMem, (ops FR64:$dst, f32mem:$src), "cvtss2sd {$src, $dst|$dst, $src}", - [(set V2F8:$dst, (fextend V4F4:$src))]>, XD; -def CVTSS2SDrm: I<0x5A, MRMSrcMem, (ops V2F8:$dst, f32mem:$src), - "cvtss2sd {$src, $dst|$dst, $src}", []>, XD; -def CVTSI2SSrr: I<0x2A, MRMSrcReg, (ops V4F4:$dst, R32:$src), + [(set FR64:$dst, (fextend (loadf32 addr:$src)))]>, + Requires<[HasSSE2]>, XD; +def CVTSI2SSrr: I<0x2A, MRMSrcReg, (ops FR32:$dst, R32:$src), "cvtsi2ss {$src, $dst|$dst, $src}", - [(set V4F4:$dst, (sint_to_fp R32:$src))]>, XS; -def CVTSI2SSrm: I<0x2A, MRMSrcMem, (ops V4F4:$dst, i32mem:$src), - "cvtsi2ss {$src, $dst|$dst, $src}", []>, XS; -def CVTSI2SDrr: I<0x2A, MRMSrcReg, (ops V2F8:$dst, R32:$src), + [(set FR32:$dst, (sint_to_fp R32:$src))]>, + Requires<[HasSSE2]>, XS; +def CVTSI2SSrm: I<0x2A, MRMSrcMem, (ops FR32:$dst, i32mem:$src), + "cvtsi2ss {$src, $dst|$dst, $src}", + [(set FR32:$dst, (sint_to_fp (loadi32 addr:$src)))]>, + Requires<[HasSSE2]>, XS; +def CVTSI2SDrr: I<0x2A, MRMSrcReg, (ops FR64:$dst, R32:$src), + "cvtsi2sd {$src, $dst|$dst, $src}", + [(set FR64:$dst, (sint_to_fp R32:$src))]>, + Requires<[HasSSE2]>, XD; +def CVTSI2SDrm: I<0x2A, MRMSrcMem, (ops FR64:$dst, i32mem:$src), "cvtsi2sd {$src, $dst|$dst, $src}", - [(set V2F8:$dst, (sint_to_fp R32:$src))]>, XD; -def CVTSI2SDrm: I<0x2A, MRMSrcMem, (ops V2F8:$dst, i32mem:$src), - "cvtsi2sd {$src, $dst|$dst, $src}", []>, XD; + [(set FR64:$dst, (sint_to_fp (loadi32 addr:$src)))]>, + Requires<[HasSSE2]>, XD; -def SQRTSSrm : I<0x51, MRMSrcMem, (ops V4F4:$dst, f32mem:$src), +def SQRTSSrm : I<0x51, MRMSrcMem, (ops FR32:$dst, f32mem:$src), "sqrtss {$src, $dst|$dst, $src}", []>, XS; -def SQRTSSrr : I<0x51, MRMSrcReg, (ops V4F4:$dst, V4F4:$src), +def SQRTSSrr : I<0x51, MRMSrcReg, (ops FR32:$dst, FR32:$src), "sqrtss {$src, $dst|$dst, $src}", - [(set V4F4:$dst, (fsqrt V4F4:$src))]>, XS; -def SQRTSDrm : I<0x51, MRMSrcMem, (ops V2F8:$dst, f64mem:$src), + [(set FR32:$dst, (fsqrt FR32:$src))]>, XS; +def SQRTSDrm : I<0x51, MRMSrcMem, (ops FR64:$dst, f64mem:$src), "sqrtsd {$src, $dst|$dst, $src}", []>, XD; -def SQRTSDrr : I<0x51, MRMSrcReg, (ops V2F8:$dst, V2F8:$src), +def SQRTSDrr : I<0x51, MRMSrcReg, (ops FR64:$dst, FR64:$src), "sqrtsd {$src, $dst|$dst, $src}", - [(set V2F8:$dst, (fsqrt V2F8:$src))]>, XD; + [(set FR64:$dst, (fsqrt FR64:$src))]>, XD; -def UCOMISDrr: I<0x2E, MRMSrcReg, (ops V2F8:$dst, V2F8:$src), +def UCOMISDrr: I<0x2E, MRMSrcReg, (ops FR64:$dst, FR64:$src), "ucomisd {$src, $dst|$dst, $src}", []>, TB, OpSize; -def UCOMISDrm: I<0x2E, MRMSrcMem, (ops V2F8:$dst, f64mem:$src), +def UCOMISDrm: I<0x2E, MRMSrcMem, (ops FR64:$dst, f64mem:$src), "ucomisd {$src, $dst|$dst, $src}", []>, TB, OpSize; -def UCOMISSrr: I<0x2E, MRMSrcReg, (ops V4F4:$dst, V4F4:$src), +def UCOMISSrr: I<0x2E, MRMSrcReg, (ops FR32:$dst, FR32:$src), "ucomiss {$src, $dst|$dst, $src}", []>, TB; -def UCOMISSrm: I<0x2E, MRMSrcMem, (ops V4F4:$dst, f32mem:$src), +def UCOMISSrm: I<0x2E, MRMSrcMem, (ops FR32:$dst, f32mem:$src), "ucomiss {$src, $dst|$dst, $src}", []>, TB; // Pseudo-instructions that map fld0 to xorps/xorpd for sse. // FIXME: remove when we can teach regalloc that xor reg, reg is ok. -def FLD0SS : I<0x57, MRMSrcReg, (ops V4F4:$dst), +def FLD0SS : I<0x57, MRMSrcReg, (ops FR32:$dst), "xorps $dst, $dst", []>, TB; -def FLD0SD : I<0x57, MRMSrcReg, (ops V2F8:$dst), +def FLD0SD : I<0x57, MRMSrcReg, (ops FR64:$dst), "xorpd $dst, $dst", []>, TB, OpSize; let isTwoAddress = 1 in { let isCommutable = 1 in { -def ADDSSrr : I<0x58, MRMSrcReg, (ops V4F4:$dst, V4F4:$src1, V4F4:$src2), +def ADDSSrr : I<0x58, MRMSrcReg, (ops FR32:$dst, FR32:$src1, FR32:$src2), "addss {$src2, $dst|$dst, $src2}", - [(set V4F4:$dst, (fadd V4F4:$src1, V4F4:$src2))]>, XS; -def ADDSDrr : I<0x58, MRMSrcReg, (ops V2F8:$dst, V2F8:$src1, V2F8:$src2), + [(set FR32:$dst, (fadd FR32:$src1, FR32:$src2))]>, XS; +def ADDSDrr : I<0x58, MRMSrcReg, (ops FR64:$dst, FR64:$src1, FR64:$src2), "addsd {$src2, $dst|$dst, $src2}", - [(set V2F8:$dst, (fadd V2F8:$src1, V2F8:$src2))]>, XD; -def ANDPSrr : I<0x54, MRMSrcReg, (ops V4F4:$dst, V4F4:$src1, V4F4:$src2), + [(set FR64:$dst, (fadd FR64:$src1, FR64:$src2))]>, XD; +def ANDPSrr : I<0x54, MRMSrcReg, (ops FR32:$dst, FR32:$src1, FR32:$src2), "andps {$src2, $dst|$dst, $src2}", []>, TB; -def ANDPDrr : I<0x54, MRMSrcReg, (ops V2F8:$dst, V2F8:$src1, V2F8:$src2), +def ANDPDrr : I<0x54, MRMSrcReg, (ops FR64:$dst, FR64:$src1, FR64:$src2), "andpd {$src2, $dst|$dst, $src2}", []>, TB, OpSize; -def MULSSrr : I<0x59, MRMSrcReg, (ops V4F4:$dst, V4F4:$src1, V4F4:$src2), +def MULSSrr : I<0x59, MRMSrcReg, (ops FR32:$dst, FR32:$src1, FR32:$src2), "mulss {$src2, $dst|$dst, $src2}", - [(set V4F4:$dst, (fmul V4F4:$src1, V4F4:$src2))]>, XS; -def MULSDrr : I<0x59, MRMSrcReg, (ops V2F8:$dst, V2F8:$src1, V2F8:$src2), + [(set FR32:$dst, (fmul FR32:$src1, FR32:$src2))]>, XS; +def MULSDrr : I<0x59, MRMSrcReg, (ops FR64:$dst, FR64:$src1, FR64:$src2), "mulsd {$src2, $dst|$dst, $src2}", - [(set V2F8:$dst, (fmul V2F8:$src1, V2F8:$src2))]>, XD; -def ORPSrr : I<0x56, MRMSrcReg, (ops V4F4:$dst, V4F4:$src1, V4F4:$src2), + [(set FR64:$dst, (fmul FR64:$src1, FR64:$src2))]>, XD; +def ORPSrr : I<0x56, MRMSrcReg, (ops FR32:$dst, FR32:$src1, FR32:$src2), "orps {$src2, $dst|$dst, $src2}", []>, TB; -def ORPDrr : I<0x56, MRMSrcReg, (ops V2F8:$dst, V2F8:$src1, V2F8:$src2), +def ORPDrr : I<0x56, MRMSrcReg, (ops FR64:$dst, FR64:$src1, FR64:$src2), "orpd {$src2, $dst|$dst, $src2}", []>, TB, OpSize; -def XORPSrr : I<0x57, MRMSrcReg, (ops V4F4:$dst, V4F4:$src1, V4F4:$src2), +def XORPSrr : I<0x57, MRMSrcReg, (ops FR32:$dst, FR32:$src1, FR32:$src2), "xorps {$src2, $dst|$dst, $src2}", []>, TB; -def XORPDrr : I<0x57, MRMSrcReg, (ops V2F8:$dst, V2F8:$src1, V2F8:$src2), +def XORPDrr : I<0x57, MRMSrcReg, (ops FR64:$dst, FR64:$src1, FR64:$src2), "xorpd {$src2, $dst|$dst, $src2}", []>, TB, OpSize; } -def ANDNPSrr : I<0x55, MRMSrcReg, (ops V4F4:$dst, V4F4:$src1, V4F4:$src2), +def ANDNPSrr : I<0x55, MRMSrcReg, (ops FR32:$dst, FR32:$src1, FR32:$src2), "andnps {$src2, $dst|$dst, $src2}", []>, TB; -def ANDNPDrr : I<0x55, MRMSrcReg, (ops V2F8:$dst, V2F8:$src1, V2F8:$src2), +def ANDNPDrr : I<0x55, MRMSrcReg, (ops FR64:$dst, FR64:$src1, FR64:$src2), "andnpd {$src2, $dst|$dst, $src2}", []>, TB, OpSize; -def ADDSSrm : I<0x58, MRMSrcMem, (ops V4F4:$dst, V4F4:$src1, f32mem:$src2), +def ADDSSrm : I<0x58, MRMSrcMem, (ops FR32:$dst, FR32:$src1, f32mem:$src2), "addss {$src2, $dst|$dst, $src2}", []>, XS; -def ADDSDrm : I<0x58, MRMSrcMem, (ops V2F8:$dst, V2F8:$src1, f64mem:$src2), +def ADDSDrm : I<0x58, MRMSrcMem, (ops FR64:$dst, FR64:$src1, f64mem:$src2), "addsd {$src2, $dst|$dst, $src2}", []>, XD; -def MULSSrm : I<0x59, MRMSrcMem, (ops V4F4:$dst, V4F4:$src1, f32mem:$src2), +def MULSSrm : I<0x59, MRMSrcMem, (ops FR32:$dst, FR32:$src1, f32mem:$src2), "mulss {$src2, $dst|$dst, $src2}", []>, XS; -def MULSDrm : I<0x59, MRMSrcMem, (ops V2F8:$dst, V2F8:$src1, f64mem:$src2), +def MULSDrm : I<0x59, MRMSrcMem, (ops FR64:$dst, FR64:$src1, f64mem:$src2), "mulsd {$src2, $dst|$dst, $src2}", []>, XD; -def DIVSSrm : I<0x5E, MRMSrcMem, (ops V4F4:$dst, V4F4:$src1, f32mem:$src2), +def DIVSSrm : I<0x5E, MRMSrcMem, (ops FR32:$dst, FR32:$src1, f32mem:$src2), "divss {$src2, $dst|$dst, $src2}", []>, XS; -def DIVSSrr : I<0x5E, MRMSrcReg, (ops V4F4:$dst, V4F4:$src1, V4F4:$src2), +def DIVSSrr : I<0x5E, MRMSrcReg, (ops FR32:$dst, FR32:$src1, FR32:$src2), "divss {$src2, $dst|$dst, $src2}", - [(set V4F4:$dst, (fdiv V4F4:$src1, V4F4:$src2))]>, XS; -def DIVSDrm : I<0x5E, MRMSrcMem, (ops V2F8:$dst, V2F8:$src1, f64mem:$src2), + [(set FR32:$dst, (fdiv FR32:$src1, FR32:$src2))]>, XS; +def DIVSDrm : I<0x5E, MRMSrcMem, (ops FR64:$dst, FR64:$src1, f64mem:$src2), "divsd {$src2, $dst|$dst, $src2}", []>, XD; -def DIVSDrr : I<0x5E, MRMSrcReg, (ops V2F8:$dst, V2F8:$src1, V2F8:$src2), +def DIVSDrr : I<0x5E, MRMSrcReg, (ops FR64:$dst, FR64:$src1, FR64:$src2), "divsd {$src2, $dst|$dst, $src2}", - [(set V2F8:$dst, (fdiv V2F8:$src1, V2F8:$src2))]>, XD; + [(set FR64:$dst, (fdiv FR64:$src1, FR64:$src2))]>, XD; -def SUBSSrm : I<0x5C, MRMSrcMem, (ops V4F4:$dst, V4F4:$src1, f32mem:$src2), +def SUBSSrm : I<0x5C, MRMSrcMem, (ops FR32:$dst, FR32:$src1, f32mem:$src2), "subss {$src2, $dst|$dst, $src2}", []>, XS; -def SUBSSrr : I<0x5C, MRMSrcReg, (ops V4F4:$dst, V4F4:$src1, V4F4:$src2), +def SUBSSrr : I<0x5C, MRMSrcReg, (ops FR32:$dst, FR32:$src1, FR32:$src2), "subss {$src2, $dst|$dst, $src2}", - [(set V4F4:$dst, (fsub V4F4:$src1, V4F4:$src2))]>, XS; -def SUBSDrm : I<0x5C, MRMSrcMem, (ops V2F8:$dst, V2F8:$src1, f64mem:$src2), + [(set FR32:$dst, (fsub FR32:$src1, FR32:$src2))]>, XS; +def SUBSDrm : I<0x5C, MRMSrcMem, (ops FR64:$dst, FR64:$src1, f64mem:$src2), "subsd {$src2, $dst|$dst, $src2}", []>, XD; -def SUBSDrr : I<0x5C, MRMSrcReg, (ops V2F8:$dst, V2F8:$src1, V2F8:$src2), +def SUBSDrr : I<0x5C, MRMSrcReg, (ops FR64:$dst, FR64:$src1, FR64:$src2), "subsd {$src2, $dst|$dst, $src2}", - [(set V2F8:$dst, (fsub V2F8:$src1, V2F8:$src2))]>, XD; + [(set FR64:$dst, (fsub FR64:$src1, FR64:$src2))]>, XD; def CMPSSrr : I<0xC2, MRMSrcReg, - (ops V4F4:$dst, V4F4:$src1, V4F4:$src, SSECC:$cc), + (ops FR32:$dst, FR32:$src1, FR32:$src, SSECC:$cc), "cmp${cc}ss {$src, $dst|$dst, $src}", []>, XS; def CMPSSrm : I<0xC2, MRMSrcMem, - (ops V4F4:$dst, V4F4:$src1, f32mem:$src, SSECC:$cc), + (ops FR32:$dst, FR32:$src1, f32mem:$src, SSECC:$cc), "cmp${cc}ss {$src, $dst|$dst, $src}", []>, XS; def CMPSDrr : I<0xC2, MRMSrcReg, - (ops V2F8:$dst, V2F8:$src1, V2F8:$src, SSECC:$cc), + (ops FR64:$dst, FR64:$src1, FR64:$src, SSECC:$cc), "cmp${cc}sd {$src, $dst|$dst, $src}", []>, XD; def CMPSDrm : I<0xC2, MRMSrcMem, - (ops V2F8:$dst, V2F8:$src1, f64mem:$src, SSECC:$cc), + (ops FR64:$dst, FR64:$src1, f64mem:$src, SSECC:$cc), "cmp${cc}sd {$src, $dst|$dst, $src}", []>, XD; } @@ -2128,9 +2162,11 @@ // FIXME: These need to indicate mod/ref sets for FP regs... & FP 'TOP' // Floating point instruction template -class FPI o, Format F, FPFormat fp, dag ops, string asm> +class FPI o, Format F, FPFormat fp, dag ops, string asm, + list pattern> : X86Inst { let FPForm = fp; let FPFormBits = FPForm.Value; + let Pattern = pattern; } // Pseudo instructions for floating point. We use these pseudo instructions @@ -2138,30 +2174,34 @@ // forms of instructions for doing these operations. Until the stackifier runs, // we prefer to be abstract. def FpMOV : FPI<0, Pseudo, SpecialFP, - (ops RFP:$dst, RFP:$src), "">; // f1 = fmov f2 + (ops RFP:$dst, RFP:$src), "", []>; // f1 = fmov f2 def FpADD : FPI<0, Pseudo, TwoArgFP , - (ops RFP:$dst, RFP:$src1, RFP:$src2), "">; // f1 = fadd f2, f3 + (ops RFP:$dst, RFP:$src1, RFP:$src2), "", + []>; // f1 = fadd f2, f3 def FpSUB : FPI<0, Pseudo, TwoArgFP , - (ops RFP:$dst, RFP:$src1, RFP:$src2), "">; // f1 = fsub f2, f3 + (ops RFP:$dst, RFP:$src1, RFP:$src2), "", + []>; // f1 = fsub f2, f3 def FpMUL : FPI<0, Pseudo, TwoArgFP , - (ops RFP:$dst, RFP:$src1, RFP:$src2), "">; // f1 = fmul f2, f3 + (ops RFP:$dst, RFP:$src1, RFP:$src2), "", + []>; // f1 = fmul f2, f3 def FpDIV : FPI<0, Pseudo, TwoArgFP , - (ops RFP:$dst, RFP:$src1, RFP:$src2), "">; // f1 = fdiv f2, f3 + (ops RFP:$dst, RFP:$src1, RFP:$src2), "", + []>; // f1 = fdiv f2, f3 -def FpGETRESULT : FPI<0, Pseudo, SpecialFP, (ops RFP:$dst), "">, +def FpGETRESULT : FPI<0, Pseudo, SpecialFP, (ops RFP:$dst), "", []>, Imp<[ST0], []>; // FPR = ST(0) -def FpSETRESULT : FPI<0, Pseudo, SpecialFP, (ops RFP:$src), "">, +def FpSETRESULT : FPI<0, Pseudo, SpecialFP, (ops RFP:$src), "", []>, Imp<[], [ST0]>; // ST(0) = FPR // FADD reg, mem: Before stackification, these are represented by: // R1 = FADD* R2, [mem] def FADD32m : FPI<0xD8, MRM0m, OneArgFPRW, // ST(0) = ST(0) + [mem32real] (ops f32mem:$src, variable_ops), - "fadd{s} $src">; + "fadd{s} $src", []>; def FADD64m : FPI<0xDC, MRM0m, OneArgFPRW, // ST(0) = ST(0) + [mem64real] (ops f64mem:$src, variable_ops), - "fadd{l} $src">; + "fadd{l} $src", []>; //def FIADD16m : FPI<0xDE, MRM0m, OneArgFPRW>; // ST(0) = ST(0) + [mem16int] //def FIADD32m : FPI<0xDA, MRM0m, OneArgFPRW>; // ST(0) = ST(0) + [mem32int] @@ -2169,10 +2209,10 @@ // R1 = FMUL* R2, [mem] def FMUL32m : FPI<0xD8, MRM1m, OneArgFPRW, // ST(0) = ST(0) * [mem32real] (ops f32mem:$src, variable_ops), - "fmul{s} $src">; + "fmul{s} $src", []>; def FMUL64m : FPI<0xDC, MRM1m, OneArgFPRW, // ST(0) = ST(0) * [mem64real] (ops f64mem:$src, variable_ops), - "fmul{l} $src">; + "fmul{l} $src", []>; // ST(0) = ST(0) * [mem16int] //def FIMUL16m : FPI16m<"fimul", 0xDE, MRM1m, OneArgFPRW>; // ST(0) = ST(0) * [mem32int] @@ -2182,10 +2222,10 @@ // R1 = FSUB* R2, [mem] def FSUB32m : FPI<0xD8, MRM4m, OneArgFPRW, // ST(0) = ST(0) - [mem32real] (ops f32mem:$src, variable_ops), - "fsub{s} $src">; + "fsub{s} $src", []>; def FSUB64m : FPI<0xDC, MRM4m, OneArgFPRW, // ST(0) = ST(0) - [mem64real] (ops f64mem:$src, variable_ops), - "fsub{l} $src">; + "fsub{l} $src", []>; // ST(0) = ST(0) - [mem16int] //def FISUB16m : FPI16m<"fisub", 0xDE, MRM4m, OneArgFPRW>; // ST(0) = ST(0) - [mem32int] @@ -2198,10 +2238,10 @@ // performed. def FSUBR32m : FPI<0xD8, MRM5m, OneArgFPRW, // ST(0) = [mem32real] - ST(0) (ops f32mem:$src, variable_ops), - "fsubr{s} $src">; + "fsubr{s} $src", []>; def FSUBR64m : FPI<0xDC, MRM5m, OneArgFPRW, // ST(0) = [mem64real] - ST(0) (ops f64mem:$src, variable_ops), - "fsubr{l} $src">; + "fsubr{l} $src", []>; // ST(0) = [mem16int] - ST(0) //def FISUBR16m : FPI16m<"fisubr", 0xDE, MRM5m, OneArgFPRW>; // ST(0) = [mem32int] - ST(0) @@ -2211,10 +2251,10 @@ // R1 = FDIV* R2, [mem] def FDIV32m : FPI<0xD8, MRM6m, OneArgFPRW, // ST(0) = ST(0) / [mem32real] (ops f32mem:$src, variable_ops), - "fdiv{s} $src">; + "fdiv{s} $src", []>; def FDIV64m : FPI<0xDC, MRM6m, OneArgFPRW, // ST(0) = ST(0) / [mem64real] (ops f64mem:$src, variable_ops), - "fdiv{l} $src">; + "fdiv{l} $src", []>; // ST(0) = ST(0) / [mem16int] //def FIDIV16m : FPI16m<"fidiv", 0xDE, MRM6m, OneArgFPRW>; // ST(0) = ST(0) / [mem32int] @@ -2226,10 +2266,10 @@ // performed. def FDIVR32m : FPI<0xD8, MRM7m, OneArgFPRW, // ST(0) = [mem32real] / ST(0) (ops f32mem:$src, variable_ops), - "fdivr{s} $src">; + "fdivr{s} $src", []>; def FDIVR64m : FPI<0xDC, MRM7m, OneArgFPRW, // ST(0) = [mem64real] / ST(0) (ops f64mem:$src, variable_ops), - "fdivr{l} $src">; + "fdivr{l} $src", []>; // ST(0) = [mem16int] / ST(0) //def FIDIVR16m : FPI16m<"fidivr", 0xDE, MRM7m, OneArgFPRW>; // ST(0) = [mem32int] / ST(0) @@ -2240,28 +2280,28 @@ let isTwoAddress = 1, Uses = [ST0], Defs = [ST0] in { def FCMOVB : FPI<0xC0, AddRegFrm, CondMovFP, (ops RST:$op, variable_ops), - "fcmovb {$op, %ST(0)|%ST(0), $op}">, DA; + "fcmovb {$op, %ST(0)|%ST(0), $op}", []>, DA; def FCMOVBE : FPI<0xD0, AddRegFrm, CondMovFP, (ops RST:$op, variable_ops), - "fcmovbe {$op, %ST(0)|%ST(0), $op}">, DA; + "fcmovbe {$op, %ST(0)|%ST(0), $op}", []>, DA; def FCMOVE : FPI<0xC8, AddRegFrm, CondMovFP, (ops RST:$op, variable_ops), - "fcmove {$op, %ST(0)|%ST(0), $op}">, DA; + "fcmove {$op, %ST(0)|%ST(0), $op}", []>, DA; def FCMOVP : FPI<0xD8, AddRegFrm, CondMovFP, (ops RST:$op, variable_ops), - "fcmovu {$op, %ST(0)|%ST(0), $op}">, DA; + "fcmovu {$op, %ST(0)|%ST(0), $op}", []>, DA; def FCMOVAE : FPI<0xC0, AddRegFrm, CondMovFP, (ops RST:$op, variable_ops), - "fcmovae {$op, %ST(0)|%ST(0), $op}">, DB; + "fcmovae {$op, %ST(0)|%ST(0), $op}", []>, DB; def FCMOVA : FPI<0xD0, AddRegFrm, CondMovFP, (ops RST:$op, variable_ops), - "fcmova {$op, %ST(0)|%ST(0), $op}">, DB; + "fcmova {$op, %ST(0)|%ST(0), $op}", []>, DB; def FCMOVNE : FPI<0xC8, AddRegFrm, CondMovFP, (ops RST:$op, variable_ops), - "fcmovne {$op, %ST(0)|%ST(0), $op}">, DB; + "fcmovne {$op, %ST(0)|%ST(0), $op}", []>, DB; def FCMOVNP : FPI<0xD8, AddRegFrm, CondMovFP, (ops RST:$op, variable_ops), - "fcmovnu {$op, %ST(0)|%ST(0), $op}">, DB; + "fcmovnu {$op, %ST(0)|%ST(0), $op}", []>, DB; } // Floating point loads & stores... @@ -2270,91 +2310,91 @@ // selector (not the fp stackifier) need more accurate operand accounting. def FLDrr : FPI<0xC0, AddRegFrm, NotFP, (ops RST:$src, variable_ops), - "fld $src">, D9; + "fld $src", []>, D9; def FLD32m : FPI<0xD9, MRM0m, ZeroArgFP, (ops f32mem:$src, variable_ops), - "fld{s} $src">; + "fld{s} $src", []>; def FLD64m : FPI<0xDD, MRM0m, ZeroArgFP, (ops f64mem:$src, variable_ops), - "fld{l} $src">; + "fld{l} $src", []>; def FLD80m : FPI<0xDB, MRM5m, ZeroArgFP, (ops f80mem:$src, variable_ops), - "fld{t} $src">; + "fld{t} $src", []>; def FILD16m : FPI<0xDF, MRM0m, ZeroArgFP, (ops i16mem:$src, variable_ops), - "fild{s} $src">; + "fild{s} $src", []>; def FILD32m : FPI<0xDB, MRM0m, ZeroArgFP, (ops i32mem:$src, variable_ops), - "fild{l} $src">; + "fild{l} $src", []>; def FILD64m : FPI<0xDF, MRM5m, ZeroArgFP, (ops i64mem:$src, variable_ops), - "fild{ll} $src">; + "fild{ll} $src", []>; def FSTrr : FPI<0xD0, AddRegFrm, NotFP, (ops RST:$op, variable_ops), - "fst $op">, DD; + "fst $op", []>, DD; def FSTPrr : FPI<0xD8, AddRegFrm, NotFP, (ops RST:$op, variable_ops), - "fstp $op">, DD; + "fstp $op", []>, DD; def FST32m : FPI<0xD9, MRM2m, OneArgFP, (ops f32mem:$op, variable_ops), - "fst{s} $op">; + "fst{s} $op", []>; def FST64m : FPI<0xDD, MRM2m, OneArgFP, (ops f64mem:$op, variable_ops), - "fst{l} $op">; + "fst{l} $op", []>; def FSTP32m : FPI<0xD9, MRM3m, OneArgFP, (ops f32mem:$op, variable_ops), - "fstp{s} $op">; + "fstp{s} $op", []>; def FSTP64m : FPI<0xDD, MRM3m, OneArgFP, (ops f64mem:$op, variable_ops), - "fstp{l} $op">; + "fstp{l} $op", []>; def FSTP80m : FPI<0xDB, MRM7m, OneArgFP, (ops f80mem:$op, variable_ops), - "fstp{t} $op">; + "fstp{t} $op", []>; def FIST16m : FPI<0xDF, MRM2m , OneArgFP, (ops i16mem:$op, variable_ops), - "fist{s} $op">; + "fist{s} $op", []>; def FIST32m : FPI<0xDB, MRM2m , OneArgFP, (ops i32mem:$op, variable_ops), - "fist{l} $op">; + "fist{l} $op", []>; def FISTP16m : FPI<0xDF, MRM3m , NotFP , (ops i16mem:$op, variable_ops), - "fistp{s} $op">; + "fistp{s} $op", []>; def FISTP32m : FPI<0xDB, MRM3m , NotFP , (ops i32mem:$op, variable_ops), - "fistp{l} $op">; + "fistp{l} $op", []>; def FISTP64m : FPI<0xDF, MRM7m , OneArgFP, (ops i64mem:$op, variable_ops), - "fistp{ll} $op">; + "fistp{ll} $op", []>; def FXCH : FPI<0xC8, AddRegFrm, NotFP, - (ops RST:$op), "fxch $op">, D9; // fxch ST(i), ST(0) + (ops RST:$op), "fxch $op", []>, D9; // fxch ST(i), ST(0) // Floating point constant loads... -def FLD0 : FPI<0xEE, RawFrm, ZeroArgFP, (ops variable_ops), "fldz">, D9; -def FLD1 : FPI<0xE8, RawFrm, ZeroArgFP, (ops variable_ops), "fld1">, D9; +def FLD0 : FPI<0xEE, RawFrm, ZeroArgFP, (ops variable_ops), "fldz", []>, D9; +def FLD1 : FPI<0xE8, RawFrm, ZeroArgFP, (ops variable_ops), "fld1", []>, D9; // Unary operations... def FCHS : FPI<0xE0, RawFrm, OneArgFPRW, // f1 = fchs f2 (ops variable_ops), - "fchs">, D9; + "fchs", []>, D9; def FABS : FPI<0xE1, RawFrm, OneArgFPRW, // f1 = fabs f2 (ops variable_ops), - "fabs">, D9; + "fabs", []>, D9; def FSQRT : FPI<0xFA, RawFrm, OneArgFPRW, // fsqrt ST(0) (ops variable_ops), - "fsqrt">, D9; + "fsqrt", []>, D9; def FSIN : FPI<0xFE, RawFrm, OneArgFPRW, // fsin ST(0) (ops variable_ops), - "fsin">, D9; + "fsin", []>, D9; def FCOS : FPI<0xFF, RawFrm, OneArgFPRW, // fcos ST(0) (ops variable_ops), - "fcos">, D9; + "fcos", []>, D9; def FTST : FPI<0xE4, RawFrm, OneArgFP , // ftst ST(0) (ops variable_ops), - "ftst">, D9; + "ftst", []>, D9; // Binary arithmetic operations... class FPST0rInst o, dag ops, string asm> @@ -2419,7 +2459,7 @@ // Floating point compares def FUCOMr : FPI<0xE0, AddRegFrm, CompareFP, // FPSW = cmp ST(0) with ST(i) (ops RST:$reg, variable_ops), - "fucom $reg">, DD, Imp<[ST0],[]>; + "fucom $reg", []>, DD, Imp<[ST0],[]>; def FUCOMPr : I<0xE8, AddRegFrm, // FPSW = cmp ST(0) with ST(i), pop (ops RST:$reg, variable_ops), "fucomp $reg", []>, DD, Imp<[ST0],[]>; @@ -2429,7 +2469,7 @@ def FUCOMIr : FPI<0xE8, AddRegFrm, CompareFP, // CC = cmp ST(0) with ST(i) (ops RST:$reg, variable_ops), - "fucomi {$reg, %ST(0)|%ST(0), $reg}">, DB, Imp<[ST0],[]>; + "fucomi {$reg, %ST(0)|%ST(0), $reg}", []>, DB, Imp<[ST0],[]>; def FUCOMIPr : I<0xE8, AddRegFrm, // CC = cmp ST(0) with ST(i), pop (ops RST:$reg, variable_ops), "fucomip {$reg, %ST(0)|%ST(0), $reg}", []>, DF, Imp<[ST0],[]>; Index: llvm/lib/Target/X86/X86RegisterInfo.td diff -u llvm/lib/Target/X86/X86RegisterInfo.td:1.24 llvm/lib/Target/X86/X86RegisterInfo.td:1.25 --- llvm/lib/Target/X86/X86RegisterInfo.td:1.24 Fri Dec 16 19:24:02 2005 +++ llvm/lib/Target/X86/X86RegisterInfo.td Tue Dec 20 16:59:51 2005 @@ -106,8 +106,13 @@ }]; } -// V4F4, the 4 x f32 class, and V2F8, the 2 x f64 class, which we will use for -// Scalar SSE2 floating point support. +// Scalar SSE2 floating point registers. +def FR32 : RegisterClass<"X86", [f32], 32, + [XMM0, XMM1, XMM2, XMM3, XMM4, XMM5, XMM6, XMM7]>; +def FR64 : RegisterClass<"X86", [f64], 64, + [XMM0, XMM1, XMM2, XMM3, XMM4, XMM5, XMM6, XMM7]>; +// Vector floating point registers: V4F4, the 4 x f32 class, and V2F8, +// the 2 x f64 class. def V4F4 : RegisterClass<"X86", [f32], 32, [XMM0, XMM1, XMM2, XMM3, XMM4, XMM5, XMM6, XMM7]>; def V2F8 : RegisterClass<"X86", [f64], 64, Index: llvm/lib/Target/X86/X86TargetMachine.cpp diff -u llvm/lib/Target/X86/X86TargetMachine.cpp:1.91 llvm/lib/Target/X86/X86TargetMachine.cpp:1.92 --- llvm/lib/Target/X86/X86TargetMachine.cpp:1.91 Fri Dec 16 19:22:13 2005 +++ llvm/lib/Target/X86/X86TargetMachine.cpp Tue Dec 20 16:59:51 2005 @@ -103,6 +103,9 @@ JITInfo(*this) { // Scalar SSE FP requires at least SSE2 X86ScalarSSE &= X86Vector >= SSE2; + + // Ignore -enable-sse-scalar-fp if -enable-x86-dag-isel. + X86ScalarSSE |= (X86DAGIsel && X86Vector >= SSE2); } From lattner at cs.uiuc.edu Tue Dec 20 19:17:49 2005 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Tue, 20 Dec 2005 19:17:49 -0600 Subject: [llvm-commits] CVS: llvm/lib/CodeGen/AsmPrinter.cpp Message-ID: <200512210117.TAA30932@zion.cs.uiuc.edu> Changes in directory llvm/lib/CodeGen: AsmPrinter.cpp updated: 1.32 -> 1.33 --- Log message: Don't emit a null terminator, nor anything after it, to the ctor/dtor list --- Diffs of the changes: (+4 -1) AsmPrinter.cpp | 5 ++++- 1 files changed, 4 insertions(+), 1 deletion(-) Index: llvm/lib/CodeGen/AsmPrinter.cpp diff -u llvm/lib/CodeGen/AsmPrinter.cpp:1.32 llvm/lib/CodeGen/AsmPrinter.cpp:1.33 --- llvm/lib/CodeGen/AsmPrinter.cpp:1.32 Tue Dec 13 00:32:10 2005 +++ llvm/lib/CodeGen/AsmPrinter.cpp Tue Dec 20 19:17:37 2005 @@ -146,7 +146,10 @@ for (unsigned i = 0, e = InitList->getNumOperands(); i != e; ++i) if (ConstantStruct *CS = dyn_cast(InitList->getOperand(i))){ if (CS->getNumOperands() != 2) return; // Not array of 2-element structs. - // Emit the function pointer. + + if (CS->getOperand(1)->isNullValue()) + return; // Found a null terminator, exit printing. + // Emit the function pointer. EmitGlobalConstant(CS->getOperand(1)); } } From evan.cheng at apple.com Tue Dec 20 20:39:33 2005 From: evan.cheng at apple.com (Evan Cheng) Date: Tue, 20 Dec 2005 20:39:33 -0600 Subject: [llvm-commits] CVS: llvm/lib/Target/X86/X86ISelDAGToDAG.cpp X86ISelLowering.cpp X86ISelLowering.h X86InstrInfo.td X86RegisterInfo.td Message-ID: <200512210239.UAA10068@zion.cs.uiuc.edu> Changes in directory llvm/lib/Target/X86: X86ISelDAGToDAG.cpp updated: 1.16 -> 1.17 X86ISelLowering.cpp updated: 1.11 -> 1.12 X86ISelLowering.h updated: 1.5 -> 1.6 X86InstrInfo.td updated: 1.175 -> 1.176 X86RegisterInfo.td updated: 1.25 -> 1.26 --- Log message: * Added lowering hook for external weak global address. It inserts a load for Darwin. * Added lowering hook for ISD::RET. It inserts CopyToRegs for the return value (or store / fld / copy to ST(0) for floating point value). This eliminate the need to write C++ code to handle RET with variable number of operands. --- Diffs of the changes: (+135 -22) X86ISelDAGToDAG.cpp | 17 ----------- X86ISelLowering.cpp | 79 ++++++++++++++++++++++++++++++++++++++++++++++++++++ X86ISelLowering.h | 17 +++++++++++ X86InstrInfo.td | 37 +++++++++++++++++++++--- X86RegisterInfo.td | 7 +++- 5 files changed, 135 insertions(+), 22 deletions(-) Index: llvm/lib/Target/X86/X86ISelDAGToDAG.cpp diff -u llvm/lib/Target/X86/X86ISelDAGToDAG.cpp:1.16 llvm/lib/Target/X86/X86ISelDAGToDAG.cpp:1.17 --- llvm/lib/Target/X86/X86ISelDAGToDAG.cpp:1.16 Mon Dec 19 16:36:02 2005 +++ llvm/lib/Target/X86/X86ISelDAGToDAG.cpp Tue Dec 20 20:39:21 2005 @@ -173,22 +173,7 @@ case ISD::GlobalAddress: if (AM.GV == 0) { - GlobalValue *GV = cast(N)->getGlobal(); - // For Darwin, external and weak symbols are indirect, so we want to load - // the value at address GV, not the value of GV itself. This means that - // the GlobalAddress must be in the base or index register of the address, - // not the GV offset field. - if (Subtarget->getIndirectExternAndWeakGlobals() && - (GV->hasWeakLinkage() || GV->isExternal())) { - AM.Base.Reg = - CurDAG->getTargetNode(X86::MOV32rm, MVT::i32, MVT::Other, - CurDAG->getRegister(0, MVT::i32), - getI8Imm(1), CurDAG->getRegister(0, MVT::i32), - CurDAG->getTargetGlobalAddress(GV, MVT::i32), - CurDAG->getEntryNode()); - } else { - AM.GV = GV; - } + AM.GV = cast(N)->getGlobal(); return false; } break; Index: llvm/lib/Target/X86/X86ISelLowering.cpp diff -u llvm/lib/Target/X86/X86ISelLowering.cpp:1.11 llvm/lib/Target/X86/X86ISelLowering.cpp:1.12 --- llvm/lib/Target/X86/X86ISelLowering.cpp:1.11 Tue Dec 20 00:22:03 2005 +++ llvm/lib/Target/X86/X86ISelLowering.cpp Tue Dec 20 20:39:21 2005 @@ -197,6 +197,68 @@ return LowerCCCCallTo(Chain, RetTy, isVarArg, isTailCall, Callee, Args, DAG); } +SDOperand X86TargetLowering::LowerReturnTo(SDOperand Chain, SDOperand Op, + SelectionDAG &DAG) { + if (!X86DAGIsel) + return DAG.getNode(ISD::RET, MVT::Other, Chain, Op); + + SDOperand Copy; + MVT::ValueType OpVT = Op.getValueType(); + switch (OpVT) { + default: assert(0 && "Unknown type to return!"); + case MVT::i32: + Copy = DAG.getCopyToReg(Chain, X86::EAX, Op, SDOperand()); + break; + case MVT::i64: { + SDOperand Hi = DAG.getNode(ISD::EXTRACT_ELEMENT, MVT::i32, Op, + DAG.getConstant(1, MVT::i32)); + SDOperand Lo = DAG.getNode(ISD::EXTRACT_ELEMENT, MVT::i32, Op, + DAG.getConstant(0, MVT::i32)); + Copy = DAG.getCopyToReg(Chain, X86::EAX, Hi, SDOperand()); + Copy = DAG.getCopyToReg(Copy, X86::EDX, Lo, Copy.getValue(1)); + break; + } + case MVT::f32: + assert(X86ScalarSSE && "MVT::f32 only legal with scalar sse fp"); + // Fallthrough intended + case MVT::f64: + if (!X86ScalarSSE) { + std::vector Tys; + Tys.push_back(MVT::Other); + Tys.push_back(MVT::Flag); + std::vector Ops; + Ops.push_back(Chain); + Ops.push_back(Op); + Copy = DAG.getNode(X86ISD::FP_SET_RESULT, Tys, Ops); + } else { + // Spill the value to memory and reload it into top of stack. + unsigned Size = MVT::getSizeInBits(OpVT)/8; + MachineFunction &MF = DAG.getMachineFunction(); + int SSFI = MF.getFrameInfo()->CreateStackObject(Size, Size); + SDOperand StackSlot = DAG.getFrameIndex(SSFI, getPointerTy()); + Chain = DAG.getNode(ISD::STORE, MVT::Other, Chain, Op, + StackSlot, DAG.getSrcValue(NULL)); + std::vector Tys; + Tys.push_back(MVT::f64); + Tys.push_back(MVT::Other); + std::vector Ops; + Ops.push_back(Chain); + Ops.push_back(StackSlot); + Ops.push_back(DAG.getValueType(OpVT)); + Copy = DAG.getNode(X86ISD::FLD, Tys, Ops); + Tys.clear(); + Tys.push_back(MVT::Other); + Tys.push_back(MVT::Flag); + Ops.clear(); + Ops.push_back(Copy.getValue(1)); + Ops.push_back(Copy); + Copy = DAG.getNode(X86ISD::FP_SET_RESULT, Tys, Ops); + } + break; + } + return DAG.getNode(X86ISD::RET_FLAG, MVT::Other, Copy, Copy.getValue(1)); +} + //===----------------------------------------------------------------------===// // C Calling Convention implementation //===----------------------------------------------------------------------===// @@ -968,6 +1030,20 @@ return DAG.getNode(X86ISD::BRCOND, Op.getValueType(), Op.getOperand(0), Op.getOperand(2), CC, Cond); } + case ISD::GlobalAddress: + GlobalValue *GV = cast(Op)->getGlobal(); + // For Darwin, external and weak symbols are indirect, so we want to load + // the value at address GV, not the value of GV itself. This means that + // the GlobalAddress must be in the base or index register of the address, + // not the GV offset field. + if (getTargetMachine(). + getSubtarget().getIndirectExternAndWeakGlobals() && + (GV->hasWeakLinkage() || GV->isExternal())) + return DAG.getLoad(MVT::i32, DAG.getEntryNode(), Op, + DAG.getSrcValue(NULL)); + else + return Op; + break; } } @@ -978,6 +1054,8 @@ case X86ISD::FP_TO_INT16_IN_MEM: return "X86ISD::FP_TO_INT16_IN_MEM"; case X86ISD::FP_TO_INT32_IN_MEM: return "X86ISD::FP_TO_INT32_IN_MEM"; case X86ISD::FP_TO_INT64_IN_MEM: return "X86ISD::FP_TO_INT64_IN_MEM"; + case X86ISD::FLD: return "X86ISD::FLD"; + case X86ISD::FP_SET_RESULT: return "X86ISD::FP_SET_RESULT"; case X86ISD::CALL: return "X86ISD::CALL"; case X86ISD::TAILCALL: return "X86ISD::TAILCALL"; case X86ISD::RDTSC_DAG: return "X86ISD::RDTSC_DAG"; @@ -985,5 +1063,6 @@ case X86ISD::TEST: return "X86ISD::TEST"; case X86ISD::CMOV: return "X86ISD::CMOV"; case X86ISD::BRCOND: return "X86ISD::BRCOND"; + case X86ISD::RET_FLAG: return "X86ISD::RET_FLAG"; } } Index: llvm/lib/Target/X86/X86ISelLowering.h diff -u llvm/lib/Target/X86/X86ISelLowering.h:1.5 llvm/lib/Target/X86/X86ISelLowering.h:1.6 --- llvm/lib/Target/X86/X86ISelLowering.h:1.5 Tue Dec 20 00:22:03 2005 +++ llvm/lib/Target/X86/X86ISelLowering.h Tue Dec 20 20:39:21 2005 @@ -40,6 +40,17 @@ FP_TO_INT32_IN_MEM, FP_TO_INT64_IN_MEM, + /// FLD - This instruction implements an extending load to FP stack slots. + /// This corresponds to the X86::FLD32m / X86::FLD64m. It takes a chain + /// operand, ptr to load from, and a VALUETYPE node indicating the type + /// to load. + FLD, + + /// FP_SET_RESULT - This corresponds to FpSETRESULT pseudo instrcuction + /// which copies the source operand to ST(0). It takes a chain and writes + /// a chain and a flag. + FP_SET_RESULT, + /// CALL/TAILCALL - These operations represent an abstract X86 call /// instruction, which includes a bunch of information. In particular the /// operands of these node are: @@ -75,6 +86,9 @@ /// X86 conditional branches. BRCOND, + + // Return with a flag operand. + RET_FLAG, }; } @@ -113,6 +127,9 @@ bool isTailCall, SDOperand Callee, ArgListTy &Args, SelectionDAG &DAG); + virtual SDOperand LowerReturnTo(SDOperand Chain, SDOperand Op, + SelectionDAG &DAG); + virtual SDOperand LowerVAStart(SDOperand Chain, SDOperand VAListP, Value *VAListV, SelectionDAG &DAG); virtual std::pair Index: llvm/lib/Target/X86/X86InstrInfo.td diff -u llvm/lib/Target/X86/X86InstrInfo.td:1.175 llvm/lib/Target/X86/X86InstrInfo.td:1.176 --- llvm/lib/Target/X86/X86InstrInfo.td:1.175 Tue Dec 20 16:59:50 2005 +++ llvm/lib/Target/X86/X86InstrInfo.td Tue Dec 20 20:39:21 2005 @@ -28,11 +28,25 @@ [SDTCisVT<0, OtherVT>, SDTCisVT<1, OtherVT>, SDTCisVT<2, FlagVT>]>; -def X86cmp : SDNode<"X86ISD::CMP" , SDTX86CmpTest, []>; -def X86test : SDNode<"X86ISD::TEST", SDTX86CmpTest, []>; +def SDTX86RetFlag : SDTypeProfile<0, 1, [SDTCisVT<0, FlagVT>]>; -def X86cmov : SDNode<"X86ISD::CMOV", SDTX86Cmov, []>; -def X86Brcond : SDNode<"X86ISD::BRCOND", SDTX86BrCond, [SDNPHasChain]>; +def SDTX86Fld : SDTypeProfile<1, 2, [SDTCisFP<0>, + SDTCisPtrTy<1>, SDTCisVT<2, OtherVT>]>; + +def SDTX86FpSet : SDTypeProfile<0, 1, [SDTCisFP<0>]>; + +def X86cmp : SDNode<"X86ISD::CMP" , SDTX86CmpTest, []>; +def X86test : SDNode<"X86ISD::TEST", SDTX86CmpTest, []>; + +def X86cmov : SDNode<"X86ISD::CMOV", SDTX86Cmov, []>; +def X86Brcond : SDNode<"X86ISD::BRCOND", SDTX86BrCond, [SDNPHasChain]>; + +def X86retflag: SDNode<"X86ISD::RET_FLAG", SDTX86RetFlag, [SDNPHasChain]>; + +def X86fld : SDNode<"X86ISD::FLD", SDTX86Fld, [SDNPHasChain]>; + +def X86fpset : SDNode<"X86ISD::FP_SET_RESULT", + SDTX86FpSet, [SDNPHasChain]>; //===----------------------------------------------------------------------===// // X86 Operand Definitions. @@ -274,6 +288,8 @@ let isTerminator = 1, isReturn = 1, isBarrier = 1 in def RETI : Ii16<0xC2, RawFrm, (ops i16imm:$amt), "ret $amt", []>; +def : Pat<(X86retflag FLAG), (RET)>; + // All branches are RawFrm, Void, Branch, and Terminators let isBranch = 1, isTerminator = 1 in class IBr opcode, dag ops, string asm, list pattern> : @@ -2188,10 +2204,21 @@ (ops RFP:$dst, RFP:$src1, RFP:$src2), "", []>; // f1 = fdiv f2, f3 +def FpLD32m : FPI<0xD9, MRM0m, ZeroArgFP, + (ops RFP:$dst, f32mem:$src), + "fld{s} $src", + [(set RFP:$dst, (X86fld addr:$src, f32))]>; + +def FpLD64m : FPI<0xDD, MRM0m, ZeroArgFP, + (ops RFP:$dst, f64mem:$src), + "fld{l} $src", + [(set RFP:$dst, (X86fld addr:$src, f64))]>; + def FpGETRESULT : FPI<0, Pseudo, SpecialFP, (ops RFP:$dst), "", []>, Imp<[ST0], []>; // FPR = ST(0) -def FpSETRESULT : FPI<0, Pseudo, SpecialFP, (ops RFP:$src), "", []>, +def FpSETRESULT : FPI<0, Pseudo, SpecialFP, (ops RFP:$src), "", + [(X86fpset RFP:$src)]>, Imp<[], [ST0]>; // ST(0) = FPR // FADD reg, mem: Before stackification, these are represented by: Index: llvm/lib/Target/X86/X86RegisterInfo.td diff -u llvm/lib/Target/X86/X86RegisterInfo.td:1.25 llvm/lib/Target/X86/X86RegisterInfo.td:1.26 --- llvm/lib/Target/X86/X86RegisterInfo.td:1.25 Tue Dec 20 16:59:51 2005 +++ llvm/lib/Target/X86/X86RegisterInfo.td Tue Dec 20 20:39:21 2005 @@ -142,6 +142,11 @@ }]; } -def FLAGS_REGS : RegisterClass<"X86", [FlagVT], 32, [STATUS]> { +// FIXME: +// HACKTROCITY: define a flags reg class for things that need to take a flag. +// this should really be handled by tablgen. +let Namespace = "X86" in + def FLAG : Register<"FLAG">; +def FLAGS_REGS : RegisterClass<"X86", [FlagVT], 32, [STATUS, FLAG]> { let Size = 32; } From evan.cheng at apple.com Tue Dec 20 20:42:09 2005 From: evan.cheng at apple.com (Evan Cheng) Date: Tue, 20 Dec 2005 20:42:09 -0600 Subject: [llvm-commits] CVS: llvm/lib/Target/X86/X86ISelDAGToDAG.cpp Message-ID: <200512210242.UAA10236@zion.cs.uiuc.edu> Changes in directory llvm/lib/Target/X86: X86ISelDAGToDAG.cpp updated: 1.17 -> 1.18 --- Log message: Remove ISD::RET select code. Now tblgen'd. --- Diffs of the changes: (+0 -41) X86ISelDAGToDAG.cpp | 41 ----------------------------------------- 1 files changed, 41 deletions(-) Index: llvm/lib/Target/X86/X86ISelDAGToDAG.cpp diff -u llvm/lib/Target/X86/X86ISelDAGToDAG.cpp:1.17 llvm/lib/Target/X86/X86ISelDAGToDAG.cpp:1.18 --- llvm/lib/Target/X86/X86ISelDAGToDAG.cpp:1.17 Tue Dec 20 20:39:21 2005 +++ llvm/lib/Target/X86/X86ISelDAGToDAG.cpp Tue Dec 20 20:41:57 2005 @@ -409,47 +409,6 @@ return CodeGenMap[N] = CurDAG->getTargetNode(Opc, VT, Result); break; } - - case ISD::RET: { - SDOperand Chain = Node->getOperand(0); // Token chain. - unsigned NumOps = Node->getNumOperands(); - - // Note: A bit of a hack / optimization... Try to delay chain selection - // as much as possible. So it's more likely it has already been selected - // for a real use. - switch (NumOps) { - default: - assert(0 && "Unknown return instruction!"); - case 3: - Chain = Select(Chain); - assert(0 && "Not yet handled return instruction!"); - break; - case 2: { - SDOperand Val = Select(Node->getOperand(1)); - Chain = Select(Chain); - switch (Node->getOperand(1).getValueType()) { - default: - assert(0 && "All other types should have been promoted!!"); - case MVT::i32: - Chain = CurDAG->getCopyToReg(Chain, X86::EAX, Val); - break; - case MVT::f32: - case MVT::f64: - assert(0 && "Not yet handled return instruction!"); - break; - } - } - case 1: - Chain = Select(Chain); - break; - } - if (X86Lowering.getBytesToPopOnReturn() == 0) - return CurDAG->SelectNodeTo(Node, X86::RET, MVT::Other, Chain); - else - return CurDAG->SelectNodeTo(Node, X86::RET, MVT::Other, - getI16Imm(X86Lowering.getBytesToPopOnReturn()), - Chain); - } } return SelectCode(N); From lattner at cs.uiuc.edu Tue Dec 20 20:43:38 2005 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Tue, 20 Dec 2005 20:43:38 -0600 Subject: [llvm-commits] CVS: llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp Message-ID: <200512210243.UAA10451@zion.cs.uiuc.edu> Changes in directory llvm/lib/CodeGen/SelectionDAG: SelectionDAGISel.cpp updated: 1.117 -> 1.118 --- Log message: Lower ConstantAggregateZero into zeros --- Diffs of the changes: (+20 -7) SelectionDAGISel.cpp | 27 ++++++++++++++++++++------- 1 files changed, 20 insertions(+), 7 deletions(-) Index: llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp diff -u llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.117 llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.118 --- llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.117 Fri Dec 16 16:45:28 2005 +++ llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp Tue Dec 20 20:43:26 2005 @@ -306,16 +306,29 @@ // Constant or ConstantFP node onto the ops list for each element of // the packed constant. std::vector Ops; - for (unsigned i = 0; i < NumElements; ++i) { - const Constant *CEl = C->getOperand(i); + if (ConstantPacked *CP = dyn_cast(C)) { + if (MVT::isFloatingPoint(PVT)) { + for (unsigned i = 0; i != NumElements; ++i) { + const ConstantFP *El = cast(CP->getOperand(i)); + Ops.push_back(DAG.getConstantFP(El->getValue(), PVT)); + } + } else { + for (unsigned i = 0; i != NumElements; ++i) { + const ConstantIntegral *El = + cast(CP->getOperand(i)); + Ops.push_back(DAG.getConstant(El->getRawValue(), PVT)); + } + } + } else { + assert(isa(C) && "Unknown packed constant!"); + SDOperand Op; if (MVT::isFloatingPoint(PVT)) - Ops.push_back(DAG.getConstantFP(cast(CEl)->getValue(), - PVT)); + Op = DAG.getConstantFP(0, PVT); else - Ops.push_back( - DAG.getConstant(cast(CEl)->getRawValue(), - PVT)); + Op = DAG.getConstant(0, PVT); + Ops.assign(NumElements, Op); } + // Handle the case where we have a 1-element vector, in which // case we want to immediately turn it into a scalar constant. if (Ops.size() == 1) { From reid at x10sys.com Tue Dec 20 21:32:05 2005 From: reid at x10sys.com (Reid Spencer) Date: Tue, 20 Dec 2005 21:32:05 -0600 Subject: [llvm-commits] CVS: llvm/autoconf/configure.ac Message-ID: <200512210332.VAA17239@zion.cs.uiuc.edu> Changes in directory llvm/autoconf: configure.ac updated: 1.201 -> 1.202 --- Log message: Implement fix for PR471: http://llvm.cs.uiuc.edu/PR471 : * Add --enable-debug-runtime option, defaults to disabled * Pass the new config var, DEBUG_RUNTIME, to Makefiles * Don't use -Wa,-strip-debug if debug-runtime is enabled --- Diffs of the changes: (+9 -0) configure.ac | 9 +++++++++ 1 files changed, 9 insertions(+) Index: llvm/autoconf/configure.ac diff -u llvm/autoconf/configure.ac:1.201 llvm/autoconf/configure.ac:1.202 --- llvm/autoconf/configure.ac:1.201 Mon Dec 19 14:27:24 2005 +++ llvm/autoconf/configure.ac Tue Dec 20 21:31:53 2005 @@ -199,6 +199,15 @@ AC_SUBST(ENABLE_OPTIMIZED,[[ENABLE_OPTIMIZED=1]]) fi +dnl --enable-debug-runtime : should runtime libraries have debug symbols? +AC_ARG_ENABLE(debug-runtime, + AS_HELP_STRING([--enable-debug-runtime,Build runtime libs with debug symbols (default is NO)]),,enableval=no) +if test ${enableval} = "no" ; then + AC_SUBST(DEBUG_RUNTIME,[[]]) +else + AC_SUBST(DEBUG_RUNTIME,[[DEBUG_RUNTIME=1]]) +fi + dnl --enable-jit: check whether they want to enable the jit AC_ARG_ENABLE(jit, AS_HELP_STRING(--enable-jit, From reid at x10sys.com Tue Dec 20 21:32:05 2005 From: reid at x10sys.com (Reid Spencer) Date: Tue, 20 Dec 2005 21:32:05 -0600 Subject: [llvm-commits] CVS: llvm/Makefile.config.in Makefile.rules configure Message-ID: <200512210332.VAA17234@zion.cs.uiuc.edu> Changes in directory llvm: Makefile.config.in updated: 1.51 -> 1.52 Makefile.rules updated: 1.335 -> 1.336 configure updated: 1.204 -> 1.205 --- Log message: Implement fix for PR471: http://llvm.cs.uiuc.edu/PR471 : * Add --enable-debug-runtime option, defaults to disabled * Pass the new config var, DEBUG_RUNTIME, to Makefiles * Don't use -Wa,-strip-debug if debug-runtime is enabled --- Diffs of the changes: (+54 -30) Makefile.config.in | 5 +++ Makefile.rules | 2 + configure | 77 ++++++++++++++++++++++++++++++++--------------------- 3 files changed, 54 insertions(+), 30 deletions(-) Index: llvm/Makefile.config.in diff -u llvm/Makefile.config.in:1.51 llvm/Makefile.config.in:1.52 --- llvm/Makefile.config.in:1.51 Fri Apr 22 12:14:14 2005 +++ llvm/Makefile.config.in Tue Dec 20 21:31:52 2005 @@ -178,6 +178,11 @@ #ENABLE_OPTIMIZED = 1 @ENABLE_OPTIMIZED@ +# When DEBUG_RUNTIME is enabled, the runtime libraries will retain debug +# symbols. +#DEBUG_RUNTIME = 1 + at DEBUG_RUNTIME@ + # When ENABLE_PROFILING is enabled, the llvm source base is built with profile # information to allow gprof to be used to get execution frequencies. #ENABLE_PROFILING = 1 Index: llvm/Makefile.rules diff -u llvm/Makefile.rules:1.335 llvm/Makefile.rules:1.336 --- llvm/Makefile.rules:1.335 Thu Oct 27 10:54:28 2005 +++ llvm/Makefile.rules Tue Dec 20 21:31:52 2005 @@ -769,8 +769,10 @@ else # make the C and C++ compilers strip debug info out of bytecode libraries. +ifndef DEBUG_RUNTIME BCCompile.C += -Wa,-strip-debug BCCompile.CXX += -Wa,-strip-debug +endif all-local:: $(LibName.BCA) Index: llvm/configure diff -u llvm/configure:1.204 llvm/configure:1.205 --- llvm/configure:1.204 Mon Dec 19 14:27:22 2005 +++ llvm/configure Tue Dec 20 21:31:52 2005 @@ -476,7 +476,7 @@ # include #endif" -ac_subst_vars='SHELL PATH_SEPARATOR PACKAGE_NAME PACKAGE_TARNAME PACKAGE_VERSION PACKAGE_STRING PACKAGE_BUGREPORT exec_prefix prefix program_transform_name bindir sbindir libexecdir datadir sysconfdir sharedstatedir localstatedir libdir includedir oldincludedir infodir mandir build_alias host_alias target_alias DEFS ECHO_C ECHO_N ECHO_T LIBS LLVM_COPYRIGHT subdirs build build_cpu build_vendor build_os host host_cpu host_vendor host_os target target_cpu target_vendor target_os OS LLVM_ON_UNIX LLVM_ON_WIN32 ARCH ENDIAN CC CFLAGS LDFLAGS CPPFLAGS ac_ct_CC EXEEXT OBJEXT ENABLE_OPTIMIZED JIT ENABLE_DOXYGEN ENABLE_THREADS TARGETS_TO_BUILD CPP CXX CXXFLAGS ac_ct_CXX LEX LEXLIB LEX_OUTPUT_ROOT FLEX YACC BISON ifGNUmake LN_S CMP CP DATE FIND GREP MKDIR MV RANLIB ac_ct_RANLIB RM SED TAR GRAPHVIZ GV INSTALL_PROGRAM INSTALL_SCRIPT INSTALL_DATA BZIP2 DOT DOXYGEN ETAGS GROFF GZIP POD2HTML POD2MAN RUNTEST TCLSH ZIP EGREP INSTALL_LTDL_TRUE INSTALL_LTDL_FALSE CONVENIENCE_LTDL_TRUE CONVENIEN! CE_LTDL_FALSE LIBADD_DL ECHO AR ac_ct_AR STRIP ac_ct_STRIP CXXCPP F77 FFLAGS ac_ct_F77 LIBTOOL ETAGSFLAGS LLVMGCC LLVMGXX ALLOCA MMAP_FILE LLVMCC1 LLVMCC1PLUS LLVMGCCDIR SHLIBEXT LLVM_PREFIX LLVM_BINDIR LLVM_LIBDIR LLVM_DATADIR LLVM_DOCSDIR LLVM_ETCDIR LLVM_INCLUDEDIR LLVM_INFODIR LLVM_MANDIR LLVM_CONFIGTIME LIBOBJS LTLIBOBJS' +ac_subst_vars='SHELL PATH_SEPARATOR PACKAGE_NAME PACKAGE_TARNAME PACKAGE_VERSION PACKAGE_STRING PACKAGE_BUGREPORT exec_prefix prefix program_transform_name bindir sbindir libexecdir datadir sysconfdir sharedstatedir localstatedir libdir includedir oldincludedir infodir mandir build_alias host_alias target_alias DEFS ECHO_C ECHO_N ECHO_T LIBS LLVM_COPYRIGHT subdirs build build_cpu build_vendor build_os host host_cpu host_vendor host_os target target_cpu target_vendor target_os OS LLVM_ON_UNIX LLVM_ON_WIN32 ARCH ENDIAN CC CFLAGS LDFLAGS CPPFLAGS ac_ct_CC EXEEXT OBJEXT ENABLE_OPTIMIZED DEBUG_RUNTIME JIT ENABLE_DOXYGEN ENABLE_THREADS TARGETS_TO_BUILD CPP CXX CXXFLAGS ac_ct_CXX LEX LEXLIB LEX_OUTPUT_ROOT FLEX YACC BISON ifGNUmake LN_S CMP CP DATE FIND GREP MKDIR MV RANLIB ac_ct_RANLIB RM SED TAR GRAPHVIZ GV INSTALL_PROGRAM INSTALL_SCRIPT INSTALL_DATA BZIP2 DOT DOXYGEN ETAGS GROFF GZIP POD2HTML POD2MAN RUNTEST TCLSH ZIP EGREP INSTALL_LTDL_TRUE INSTALL_LTDL_FALSE CONVENIENCE_LTDL_! TRUE CONVENIENCE_LTDL_FALSE LIBADD_DL ECHO AR ac_ct_AR STRIP ac_ct_STRIP CXXCPP F77 FFLAGS ac_ct_F77 LIBTOOL ETAGSFLAGS LLVMGCC LLVMGXX ALLOCA MMAP_FILE LLVMCC1 LLVMCC1PLUS LLVMGCCDIR SHLIBEXT LLVM_PREFIX LLVM_BINDIR LLVM_LIBDIR LLVM_DATADIR LLVM_DOCSDIR LLVM_ETCDIR LLVM_INCLUDEDIR LLVM_INFODIR LLVM_MANDIR LLVM_CONFIGTIME LIBOBJS LTLIBOBJS' ac_subst_files='' # Initialize some variables set by options. @@ -1035,6 +1035,7 @@ --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) --enable-FEATURE[=ARG] include FEATURE [ARG=yes] --enable-optimized + --enable-debug-runtime --enable-jit Enable Just In Time Compiling (default is YES) --enable-doxygen Build doxygen documentation (default is NO) --enable-threads Use threads if available (default is YES) @@ -2982,6 +2983,21 @@ fi +# Check whether --enable-debug-runtime or --disable-debug-runtime was given. +if test "${enable_debug_runtime+set}" = set; then + enableval="$enable_debug_runtime" + +else + enableval=no +fi; +if test ${enableval} = "no" ; then + DEBUG_RUNTIME= + +else + DEBUG_RUNTIME=DEBUG_RUNTIME=1 + +fi + # Check whether --enable-jit or --disable-jit was given. if test "${enable_jit+set}" = set; then enableval="$enable_jit" @@ -8361,7 +8377,7 @@ lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext < conftest.$ac_ext + echo '#line 10371 "configure"' > conftest.$ac_ext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? @@ -10837,7 +10853,7 @@ # Provide some information about the compiler. -echo "$as_me:10840:" \ +echo "$as_me:10856:" \ "checking for Fortran 77 compiler version" >&5 ac_compiler=`set X $ac_compile; echo $2` { (eval echo "$as_me:$LINENO: \"$ac_compiler --version &5\"") >&5 @@ -11894,11 +11910,11 @@ -e 's:.*FLAGS}? :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:11897: $lt_compile\"" >&5) + (eval echo "\"\$as_me:11913: $lt_compile\"" >&5) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&5 - echo "$as_me:11901: \$? = $ac_status" >&5 + echo "$as_me:11917: \$? = $ac_status" >&5 if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings @@ -12137,11 +12153,11 @@ -e 's:.*FLAGS}? :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:12140: $lt_compile\"" >&5) + (eval echo "\"\$as_me:12156: $lt_compile\"" >&5) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&5 - echo "$as_me:12144: \$? = $ac_status" >&5 + echo "$as_me:12160: \$? = $ac_status" >&5 if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings @@ -12197,11 +12213,11 @@ -e 's:.*FLAGS}? :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:12200: $lt_compile\"" >&5) + (eval echo "\"\$as_me:12216: $lt_compile\"" >&5) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&5 - echo "$as_me:12204: \$? = $ac_status" >&5 + echo "$as_me:12220: \$? = $ac_status" >&5 if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized @@ -14382,7 +14398,7 @@ lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext < conftest.$ac_ext <&5) + (eval echo "\"\$as_me:16692: $lt_compile\"" >&5) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&5 - echo "$as_me:16680: \$? = $ac_status" >&5 + echo "$as_me:16696: \$? = $ac_status" >&5 if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings @@ -16733,11 +16749,11 @@ -e 's:.*FLAGS}? :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:16736: $lt_compile\"" >&5) + (eval echo "\"\$as_me:16752: $lt_compile\"" >&5) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&5 - echo "$as_me:16740: \$? = $ac_status" >&5 + echo "$as_me:16756: \$? = $ac_status" >&5 if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized @@ -18094,7 +18110,7 @@ lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext < conftest.$ac_ext <&5) + (eval echo "\"\$as_me:19048: $lt_compile\"" >&5) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&5 - echo "$as_me:19036: \$? = $ac_status" >&5 + echo "$as_me:19052: \$? = $ac_status" >&5 if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings @@ -19089,11 +19105,11 @@ -e 's:.*FLAGS}? :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:19092: $lt_compile\"" >&5) + (eval echo "\"\$as_me:19108: $lt_compile\"" >&5) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&5 - echo "$as_me:19096: \$? = $ac_status" >&5 + echo "$as_me:19112: \$? = $ac_status" >&5 if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized @@ -21128,11 +21144,11 @@ -e 's:.*FLAGS}? :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:21131: $lt_compile\"" >&5) + (eval echo "\"\$as_me:21147: $lt_compile\"" >&5) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&5 - echo "$as_me:21135: \$? = $ac_status" >&5 + echo "$as_me:21151: \$? = $ac_status" >&5 if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings @@ -21371,11 +21387,11 @@ -e 's:.*FLAGS}? :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:21374: $lt_compile\"" >&5) + (eval echo "\"\$as_me:21390: $lt_compile\"" >&5) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&5 - echo "$as_me:21378: \$? = $ac_status" >&5 + echo "$as_me:21394: \$? = $ac_status" >&5 if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings @@ -21431,11 +21447,11 @@ -e 's:.*FLAGS}? :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:21434: $lt_compile\"" >&5) + (eval echo "\"\$as_me:21450: $lt_compile\"" >&5) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&5 - echo "$as_me:21438: \$? = $ac_status" >&5 + echo "$as_me:21454: \$? = $ac_status" >&5 if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized @@ -23616,7 +23632,7 @@ lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext < conftest.$ac_ext < Changes in directory llvm/docs: GettingStarted.html updated: 1.123 -> 1.124 --- Log message: Document the new --enable-debug-runtime configure option. --- Diffs of the changes: (+6 -1) GettingStarted.html | 7 ++++++- 1 files changed, 6 insertions(+), 1 deletion(-) Index: llvm/docs/GettingStarted.html diff -u llvm/docs/GettingStarted.html:1.123 llvm/docs/GettingStarted.html:1.124 --- llvm/docs/GettingStarted.html:1.123 Tue Nov 8 15:11:31 2005 +++ llvm/docs/GettingStarted.html Tue Dec 20 21:46:45 2005 @@ -811,6 +811,11 @@ unoptimized build (also known as a debug build).

+
--enable-debug-runtime
+
+ Enables debug symbols in the runtime libraries. The default is to strip + debug symbols from the runtime libraries. +
--enable-jit
Compile the Just In Time (JIT) compiler functionality. This is not @@ -1541,7 +1546,7 @@ Chris Lattner
Reid Spencer
The LLVM Compiler Infrastructure
- Last modified: $Date: 2005/11/08 21:11:31 $ + Last modified: $Date: 2005/12/21 03:46:45 $ From reid at x10sys.com Tue Dec 20 23:03:34 2005 From: reid at x10sys.com (Reid Spencer) Date: Tue, 20 Dec 2005 23:03:34 -0600 Subject: [llvm-commits] CVS: llvm/tools/llvm-ld/llvm-ld.cpp Message-ID: <200512210503.XAA26748@zion.cs.uiuc.edu> Changes in directory llvm/tools/llvm-ld: llvm-ld.cpp updated: 1.27 -> 1.28 --- Log message: Implement PR512: http://llvm.cs.uiuc.edu/PR512 : This patch adds a -post-link-opts option to llvm-ld which allows an arbitrary program to optimize bytecode after linking. The program is passed two file names. The first is the input (linked bytecode) the second is where it must place its output (presumably after optimizing). If the output file is bytecode, it is used as a substitute for the input. This will allow things like poolalloc to be written as a separate program instead of a loadable module or built into LLVM. --- Diffs of the changes: (+39 -0) llvm-ld.cpp | 39 +++++++++++++++++++++++++++++++++++++++ 1 files changed, 39 insertions(+) Index: llvm/tools/llvm-ld/llvm-ld.cpp diff -u llvm/tools/llvm-ld/llvm-ld.cpp:1.27 llvm/tools/llvm-ld/llvm-ld.cpp:1.28 --- llvm/tools/llvm-ld/llvm-ld.cpp:1.27 Tue Dec 13 14:00:37 2005 +++ llvm/tools/llvm-ld/llvm-ld.cpp Tue Dec 20 23:03:23 2005 @@ -76,6 +76,10 @@ static cl::optDisableCompression("disable-compression",cl::init(false), cl::desc("Disable writing of compressed bytecode files")); +static cl::list PostLinkOpts("post-link-opts", + cl::value_desc("path to post-link optimization programs"), + cl::desc("Run one or more optimization programs after linking")); + // Compatibility options that are ignored but supported by LD static cl::opt CO3("soname", cl::Hidden, cl::desc("Compatibility option: ignored")); @@ -450,6 +454,41 @@ // If we are not linking a library, generate either a native executable // or a JIT shell script, depending upon what the user wants. if (!LinkAsLibrary) { + // If the user wants to run a post-link optimization, run it now. + if (!PostLinkOpts.empty()) { + std::vector opts = PostLinkOpts; + for (std::vector::iterator I = opts.begin(), + E = opts.end(); I != E; ++I) { + sys::Path prog(*I); + if (!prog.canExecute()) { + prog = sys::Program::FindProgramByName(*I); + if (prog.isEmpty()) + return PrintAndReturn(std::string("Optimization program '") + *I + + "' is not found or not executable."); + } + // Get the program arguments + sys::Path tmp_output("opt_result"); + if (!tmp_output.createTemporaryFileOnDisk()) { + return PrintAndReturn( + "Can't create temporary file for post-link optimization"); + } + const char* args[4]; + args[0] = I->c_str(); + args[1] = RealBytecodeOutput.c_str(); + args[2] = tmp_output.c_str(); + args[3] = 0; + if (0 == sys::Program::ExecuteAndWait(prog, args)) { + if (tmp_output.isBytecodeFile()) { + sys::Path target(RealBytecodeOutput); + target.eraseFromDisk(); + tmp_output.renamePathOnDisk(target); + } else + return PrintAndReturn( + "Post-link optimization output is not bytecode"); + } + } + } + // If the user wants to generate a native executable, compile it from the // bytecode file. // From lattner at cs.uiuc.edu Tue Dec 20 23:10:09 2005 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Tue, 20 Dec 2005 23:10:09 -0600 Subject: [llvm-commits] CVS: llvm/test/Regression/CodeGen/Generic/DebugStuff.ll Message-ID: <200512210510.XAA27567@zion.cs.uiuc.edu> Changes in directory llvm/test/Regression/CodeGen/Generic: DebugStuff.ll added (r1.1) --- Log message: new testcase, fails on X86 and probably others --- Diffs of the changes: (+125 -0) DebugStuff.ll | 125 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 125 insertions(+) Index: llvm/test/Regression/CodeGen/Generic/DebugStuff.ll diff -c /dev/null llvm/test/Regression/CodeGen/Generic/DebugStuff.ll:1.1 *** /dev/null Tue Dec 20 23:10:07 2005 --- llvm/test/Regression/CodeGen/Generic/DebugStuff.ll Tue Dec 20 23:09:57 2005 *************** *** 0 **** --- 1,125 ---- + ; Verify debugger intrinsics are ignored or accepted. + ; RUN: llvm-as < %s | llc + + ;; Debugger type declarations + %lldb.compile_unit = type { uint, ushort, ushort, sbyte*, sbyte*, sbyte*, {}* } + %lldb.global = type { uint, %lldb.compile_unit*, sbyte*, {}*, sbyte*, bool, bool } + %lldb.local = type { uint, %lldb.global*, sbyte*, sbyte*, bool, bool } + + + ;; Debugger intrinsic declarations... + declare {}* %llvm.dbg.stoppoint({}*, uint, uint, %lldb.compile_unit*) + declare {}* %llvm.dbg.func.start(%lldb.global*) + declare {}* %llvm.dbg.region.start({}*) + declare {}* %llvm.dbg.region.end({}*) + declare {}* %llvm.dbg.declare({}*, ...) + + ;; Global object anchors + %llvm.dbg.translation_units = linkonce global {} {} + %llvm.dbg.globals = linkonce global {} {} + + + %.str_1 = internal constant [11 x sbyte] c"funccall.c\00" + %.str_2 = internal constant [12 x sbyte] c"/home/sabre\00" + %.str_3 = internal constant [14 x sbyte] c"llvmgcc 3.4.x\00" + + %d.compile_unit = internal constant %lldb.compile_unit { + uint 17, ;; DW_TAG_compile_unit + ushort 0, ;; LLVM Debug version # + ushort 1, ;; Language: DW_LANG_C89 + sbyte* getelementptr ([11 x sbyte]* %.str_1, long 0, long 0), ;; Source filename + sbyte* getelementptr ([12 x sbyte]* %.str_2, long 0, long 0), ;; Working directory + sbyte* getelementptr ([14 x sbyte]* %.str_3, long 0, long 0), ;; producer + {}* %llvm.dbg.translation_units ;; Anchor + } + + + %.str_5 = internal global [5 x sbyte] c"main\00" + %.str_6 = internal global [4 x sbyte] c"foo\00" + %.str_7 = internal global [2 x sbyte] c"q\00" + %.str_8 = internal global [2 x sbyte] c"t\00" + + %d.main = global %lldb.global { + uint 46, ;; DW_TAG_subprogram + %lldb.compile_unit* %d.compile_unit, ;; context pointer + sbyte* getelementptr ([5 x sbyte]* %.str_5, long 0, long 0), ;; name + {}* %llvm.dbg.globals, ;; anchor + sbyte* null, ;; EVENTUALLY the type + bool true, ;; non-static linkage? + bool false ;; definition, not declaration + } + + %d.foo = global %lldb.global { + uint 46, ;; DW_TAG_subprogram + %lldb.compile_unit* %d.compile_unit, ;; context pointer + sbyte* getelementptr ([4 x sbyte]* %.str_6, long 0, long 0), ;; name + {}* %llvm.dbg.globals, ;; anchor + sbyte* null, ;; EVENTUALLY the type + bool true, ;; non-static linkage + bool false ;; definition, not declaration + } + + %d.q = internal global %lldb.global { + uint 52, ;; DW_TAG_variable + %lldb.compile_unit* %d.compile_unit, ;; context pointer + sbyte* getelementptr ([2 x sbyte]* %.str_7, long 0, long 0), ;; name + {}* %llvm.dbg.globals, ;; anchor + sbyte* null, ;; EVENTUALLY the type + bool false, ;; static linkage + bool false ;; definition, not declaration + } + + + %d.t = internal global %lldb.local { + uint 52, ;; DW_TAG_variable + %lldb.global* %d.foo, ;; context pointer + sbyte* getelementptr ([2 x sbyte]* %.str_8, long 0, long 0), ;; name + sbyte* null, ;; EVENTUALLY the type + bool false, ;; local variable + bool false ;; definition, not declaratation + } + + + + %q = internal global int 0 + + implementation ; Functions: + + void %foo() { + entry: + %t = alloca int + %.1 = call {}* %llvm.dbg.func.start(%lldb.global* %d.foo) + %.2 = call {}* %llvm.dbg.stoppoint({}* %.1, uint 5, uint 2, %lldb.compile_unit* %d.compile_unit) + + %.3 = call {}*({}*, ...)* %llvm.dbg.declare({}* %.2, %lldb.local* %d.t, int* %t) + %tmp.0 = load int* %q + store int %tmp.0, int* %t + %.4 = call {}* %llvm.dbg.stoppoint({}* %.3, uint 6, uint 2, %lldb.compile_unit* %d.compile_unit) + %tmp.01 = load int* %t + %tmp.1 = add int %tmp.01, 1 + store int %tmp.1, int* %q + %.5 = call {}* %llvm.dbg.stoppoint({}* %.4, uint 7, uint 1, %lldb.compile_unit* %d.compile_unit) + call {}* %llvm.dbg.region.end({}* %.5) + ret void + } + + int %main() { + entry: + %.1 = call {}* %llvm.dbg.func.start(%lldb.global* %d.main) + %result = alloca int + %.2 = call {}* %llvm.dbg.stoppoint({}* %.1, uint 9, uint 2, %lldb.compile_unit* %d.compile_unit) + store int 0, int* %q + %.3 = call {}* %llvm.dbg.stoppoint({}* %.2, uint 10, uint 2, %lldb.compile_unit* %d.compile_unit) + call void %foo() + %.4 = call {}* %llvm.dbg.stoppoint({}* %.3, uint 11, uint 2, %lldb.compile_unit* %d.compile_unit) + %tmp.2 = load int* %q + %tmp.3 = sub int %tmp.2, 1 + store int %tmp.3, int* %q + %.5 = call {}* %llvm.dbg.stoppoint({}* %.4, uint 13, uint 2, %lldb.compile_unit* %d.compile_unit) + %tmp.4 = load int* %q + store int %tmp.4, int* %result + %tmp.5 = load int* %result + %.6 = call {}* %llvm.dbg.stoppoint({}* %.5, uint 14, uint 1, %lldb.compile_unit* %d.compile_unit) + call {}* %llvm.dbg.region.end({}* %.6) + ret int %tmp.5 + } From reid at x10sys.com Tue Dec 20 23:13:18 2005 From: reid at x10sys.com (Reid Spencer) Date: Tue, 20 Dec 2005 23:13:18 -0600 Subject: [llvm-commits] CVS: llvm/docs/CommandGuide/llvm-ld.pod Message-ID: <200512210513.XAA27920@zion.cs.uiuc.edu> Changes in directory llvm/docs/CommandGuide: llvm-ld.pod updated: 1.2 -> 1.3 --- Log message: Document the new -post-link-opts option. --- Diffs of the changes: (+15 -0) llvm-ld.pod | 15 +++++++++++++++ 1 files changed, 15 insertions(+) Index: llvm/docs/CommandGuide/llvm-ld.pod diff -u llvm/docs/CommandGuide/llvm-ld.pod:1.2 llvm/docs/CommandGuide/llvm-ld.pod:1.3 --- llvm/docs/CommandGuide/llvm-ld.pod:1.2 Sun Nov 28 21:43:29 2004 +++ llvm/docs/CommandGuide/llvm-ld.pod Tue Dec 20 23:13:06 2005 @@ -136,6 +136,21 @@ B<-On> option). This function may add passes to the PassManager that should be run. This feature allows the optimization passes of B to be extended. +=item B<-post-link-opt>F + +Run post-link optimization program. After linking is completed a bytecode file +will be generated. It will be passed to the program specified by F as the +first argument. The second argument to the program will be the name of a +temporary file into which the program should place its optimized output. For +example, the "no-op optimization" would be a simple shell script: + +=over + +#!/bin/bash +cp $1 $2 + +=back + =back =head2 Miscellaneous Options From lattner at cs.uiuc.edu Tue Dec 20 23:28:03 2005 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Tue, 20 Dec 2005 23:28:03 -0600 Subject: [llvm-commits] CVS: llvm/lib/Target/SparcV8/SparcV8ISelDAGToDAG.cpp Message-ID: <200512210528.XAA29640@zion.cs.uiuc.edu> Changes in directory llvm/lib/Target/SparcV8: SparcV8ISelDAGToDAG.cpp updated: 1.29 -> 1.30 --- Log message: remove dead code --- Diffs of the changes: (+0 -4) SparcV8ISelDAGToDAG.cpp | 4 ---- 1 files changed, 4 deletions(-) Index: llvm/lib/Target/SparcV8/SparcV8ISelDAGToDAG.cpp diff -u llvm/lib/Target/SparcV8/SparcV8ISelDAGToDAG.cpp:1.29 llvm/lib/Target/SparcV8/SparcV8ISelDAGToDAG.cpp:1.30 --- llvm/lib/Target/SparcV8/SparcV8ISelDAGToDAG.cpp:1.29 Mon Dec 19 01:57:53 2005 +++ llvm/lib/Target/SparcV8/SparcV8ISelDAGToDAG.cpp Tue Dec 20 23:27:51 2005 @@ -552,10 +552,6 @@ Chain = DAG.getNode(ISD::CALLSEQ_END, MVT::Other, Chain, DAG.getConstant(ArgsSize, getPointerTy())); - MVT::ValueType ActualRetTyVT = RetTyVT; - if (RetTyVT >= MVT::i1 && RetTyVT <= MVT::i16) - ActualRetTyVT = MVT::i32; // Promote result to i32. - return std::make_pair(RetVal, Chain); } From lattner at cs.uiuc.edu Tue Dec 20 23:31:17 2005 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Tue, 20 Dec 2005 23:31:17 -0600 Subject: [llvm-commits] CVS: llvm/utils/TableGen/DAGISelEmitter.cpp Message-ID: <200512210531.XAA30033@zion.cs.uiuc.edu> Changes in directory llvm/utils/TableGen: DAGISelEmitter.cpp updated: 1.109 -> 1.110 --- Log message: Eliminate some GCC warnings from the generated code --- Diffs of the changes: (+17 -9) DAGISelEmitter.cpp | 26 +++++++++++++++++--------- 1 files changed, 17 insertions(+), 9 deletions(-) Index: llvm/utils/TableGen/DAGISelEmitter.cpp diff -u llvm/utils/TableGen/DAGISelEmitter.cpp:1.109 llvm/utils/TableGen/DAGISelEmitter.cpp:1.110 --- llvm/utils/TableGen/DAGISelEmitter.cpp:1.109 Tue Dec 20 14:08:01 2005 +++ llvm/utils/TableGen/DAGISelEmitter.cpp Tue Dec 20 23:31:05 2005 @@ -1770,18 +1770,24 @@ TreePatternNode *pattern, TreePatternNode *instr, unsigned PatNum, std::ostream &os) : ISE(ise), Predicates(preds), Pattern(pattern), Instruction(instr), - PatternNo(PatNum), OS(os), FoundChain(false), TmpNo(0) {}; + PatternNo(PatNum), OS(os), FoundChain(false), TmpNo(0) {} + /// isPredeclaredSDOperand - Return true if this is one of the predeclared + /// SDOperands. + bool isPredeclaredSDOperand(const std::string &OpName) const { + return OpName == "N0" || OpName == "N1" || OpName == "N2" || + OpName == "N00" || OpName == "N01" || + OpName == "N10" || OpName == "N11" || + OpName == "Tmp0" || OpName == "Tmp1" || + OpName == "Tmp2" || OpName == "Tmp3"; + } + /// DeclareSDOperand - Emit "SDOperand " or "". This works /// around an ugly GCC bug where SelectCode is using too much stack space void DeclareSDOperand(const std::string &OpName) const { // If it's one of the common cases declared at the top of SelectCode, just // use the existing declaration. - if (OpName == "N0" || OpName == "N1" || OpName == "N2" || - OpName == "N00" || OpName == "N01" || - OpName == "N10" || OpName == "N11" || - OpName == "Tmp0" || OpName == "Tmp1" || - OpName == "Tmp2" || OpName == "Tmp3") + if (isPredeclaredSDOperand(OpName)) OS << OpName; else OS << "SDOperand " << OpName; @@ -1986,9 +1992,11 @@ std::string Fn = CP->getSelectFunc(); NumRes = CP->getNumOperands(); for (unsigned i = 0; i != NumRes; ++i) { - OS << " "; - DeclareSDOperand("Tmp" + utostr(i+ResNo)); - OS << ";\n"; + if (!isPredeclaredSDOperand("Tmp" + utostr(i+ResNo))) { + OS << " "; + DeclareSDOperand("Tmp" + utostr(i+ResNo)); + OS << ";\n"; + } } OS << " if (!" << Fn << "(" << Val; for (unsigned i = 0; i < NumRes; i++) From lattner at cs.uiuc.edu Tue Dec 20 23:35:09 2005 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Tue, 20 Dec 2005 23:35:09 -0600 Subject: [llvm-commits] CVS: llvm/lib/Target/X86/X86InstrInfo.td Message-ID: <200512210535.XAA30485@zion.cs.uiuc.edu> Changes in directory llvm/lib/Target/X86: X86InstrInfo.td updated: 1.176 -> 1.177 --- Log message: Wrap some long lines: no functionality change --- Diffs of the changes: (+56 -28) X86InstrInfo.td | 84 +++++++++++++++++++++++++++++++++++++------------------- 1 files changed, 56 insertions(+), 28 deletions(-) Index: llvm/lib/Target/X86/X86InstrInfo.td diff -u llvm/lib/Target/X86/X86InstrInfo.td:1.176 llvm/lib/Target/X86/X86InstrInfo.td:1.177 --- llvm/lib/Target/X86/X86InstrInfo.td:1.176 Tue Dec 20 20:39:21 2005 +++ llvm/lib/Target/X86/X86InstrInfo.td Tue Dec 20 23:34:58 2005 @@ -1801,61 +1801,89 @@ def LAHF : I<0x9F, RawFrm, (ops), "lahf", []>, Imp<[],[AH]>; // AH = flags def SETBr : I<0x92, MRM0r, - (ops R8 :$dst), "setb $dst", []>, TB; // R8 = < unsign + (ops R8 :$dst), + "setb $dst", []>, TB; // R8 = < unsign def SETBm : I<0x92, MRM0m, - (ops i8mem:$dst), "setb $dst", []>, TB; // [mem8] = < unsign + (ops i8mem:$dst), + "setb $dst", []>, TB; // [mem8] = < unsign def SETAEr : I<0x93, MRM0r, - (ops R8 :$dst), "setae $dst", []>, TB; // R8 = >= unsign + (ops R8 :$dst), + "setae $dst", []>, TB; // R8 = >= unsign def SETAEm : I<0x93, MRM0m, - (ops i8mem:$dst), "setae $dst", []>, TB; // [mem8] = >= unsign + (ops i8mem:$dst), + "setae $dst", []>, TB; // [mem8] = >= unsign def SETEr : I<0x94, MRM0r, - (ops R8 :$dst), "sete $dst", []>, TB; // R8 = == + (ops R8 :$dst), + "sete $dst", []>, TB; // R8 = == def SETEm : I<0x94, MRM0m, - (ops i8mem:$dst), "sete $dst", []>, TB; // [mem8] = == + (ops i8mem:$dst), + "sete $dst", []>, TB; // [mem8] = == def SETNEr : I<0x95, MRM0r, - (ops R8 :$dst), "setne $dst", []>, TB; // R8 = != + (ops R8 :$dst), + "setne $dst", []>, TB; // R8 = != def SETNEm : I<0x95, MRM0m, - (ops i8mem:$dst), "setne $dst", []>, TB; // [mem8] = != + (ops i8mem:$dst), + "setne $dst", []>, TB; // [mem8] = != def SETBEr : I<0x96, MRM0r, - (ops R8 :$dst), "setbe $dst", []>, TB; // R8 = <= unsign + (ops R8 :$dst), + "setbe $dst", []>, TB; // R8 = <= unsign def SETBEm : I<0x96, MRM0m, - (ops i8mem:$dst), "setbe $dst", []>, TB; // [mem8] = <= unsign + (ops i8mem:$dst), + "setbe $dst", []>, TB; // [mem8] = <= unsign def SETAr : I<0x97, MRM0r, - (ops R8 :$dst), "seta $dst", []>, TB; // R8 = > signed + (ops R8 :$dst), + "seta $dst", []>, TB; // R8 = > signed def SETAm : I<0x97, MRM0m, - (ops i8mem:$dst), "seta $dst", []>, TB; // [mem8] = > signed + (ops i8mem:$dst), + "seta $dst", []>, TB; // [mem8] = > signed def SETSr : I<0x98, MRM0r, - (ops R8 :$dst), "sets $dst", []>, TB; // R8 = + (ops R8 :$dst), + "sets $dst", []>, TB; // R8 = def SETSm : I<0x98, MRM0m, - (ops i8mem:$dst), "sets $dst", []>, TB; // [mem8] = + (ops i8mem:$dst), + "sets $dst", []>, TB; // [mem8] = def SETNSr : I<0x99, MRM0r, - (ops R8 :$dst), "setns $dst", []>, TB; // R8 = ! + (ops R8 :$dst), + "setns $dst", []>, TB; // R8 = ! def SETNSm : I<0x99, MRM0m, - (ops i8mem:$dst), "setns $dst", []>, TB; // [mem8] = ! + (ops i8mem:$dst), + "setns $dst", []>, TB; // [mem8] = ! def SETPr : I<0x9A, MRM0r, - (ops R8 :$dst), "setp $dst", []>, TB; // R8 = parity + (ops R8 :$dst), + "setp $dst", []>, TB; // R8 = parity def SETPm : I<0x9A, MRM0m, - (ops i8mem:$dst), "setp $dst", []>, TB; // [mem8] = parity + (ops i8mem:$dst), + "setp $dst", []>, TB; // [mem8] = parity def SETNPr : I<0x9B, MRM0r, - (ops R8 :$dst), "setnp $dst", []>, TB; // R8 = not parity + (ops R8 :$dst), + "setnp $dst", []>, TB; // R8 = not parity def SETNPm : I<0x9B, MRM0m, - (ops i8mem:$dst), "setnp $dst", []>, TB; // [mem8] = not parity + (ops i8mem:$dst), + "setnp $dst", []>, TB; // [mem8] = not parity def SETLr : I<0x9C, MRM0r, - (ops R8 :$dst), "setl $dst", []>, TB; // R8 = < signed + (ops R8 :$dst), + "setl $dst", []>, TB; // R8 = < signed def SETLm : I<0x9C, MRM0m, - (ops i8mem:$dst), "setl $dst", []>, TB; // [mem8] = < signed + (ops i8mem:$dst), + "setl $dst", []>, TB; // [mem8] = < signed def SETGEr : I<0x9D, MRM0r, - (ops R8 :$dst), "setge $dst", []>, TB; // R8 = >= signed + (ops R8 :$dst), + "setge $dst", []>, TB; // R8 = >= signed def SETGEm : I<0x9D, MRM0m, - (ops i8mem:$dst), "setge $dst", []>, TB; // [mem8] = >= signed + (ops i8mem:$dst), + "setge $dst", []>, TB; // [mem8] = >= signed def SETLEr : I<0x9E, MRM0r, - (ops R8 :$dst), "setle $dst", []>, TB; // R8 = <= signed + (ops R8 :$dst), + "setle $dst", []>, TB; // R8 = <= signed def SETLEm : I<0x9E, MRM0m, - (ops i8mem:$dst), "setle $dst", []>, TB; // [mem8] = <= signed + (ops i8mem:$dst), + "setle $dst", []>, TB; // [mem8] = <= signed def SETGr : I<0x9F, MRM0r, - (ops R8 :$dst), "setg $dst", []>, TB; // R8 = < signed + (ops R8 :$dst), + "setg $dst", []>, TB; // R8 = < signed def SETGm : I<0x9F, MRM0m, - (ops i8mem:$dst), "setg $dst", []>, TB; // [mem8] = < signed + (ops i8mem:$dst), + "setg $dst", []>, TB; // [mem8] = < signed // Integer comparisons def CMP8rr : I<0x38, MRMDestReg, From lattner at cs.uiuc.edu Wed Dec 21 01:47:17 2005 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Wed, 21 Dec 2005 01:47:17 -0600 Subject: [llvm-commits] CVS: llvm/lib/Target/X86/X86FloatingPoint.cpp X86ISelPattern.cpp X86InstrInfo.td X86RegisterInfo.cpp Message-ID: <200512210747.BAA08433@zion.cs.uiuc.edu> Changes in directory llvm/lib/Target/X86: X86FloatingPoint.cpp updated: 1.44 -> 1.45 X86ISelPattern.cpp updated: 1.189 -> 1.190 X86InstrInfo.td updated: 1.177 -> 1.178 X86RegisterInfo.cpp updated: 1.112 -> 1.113 --- Log message: Rewrite FP stackifier support in the X86InstrInfo.td file, splitting patterns that were overloaded to work before and after the stackifier runs. With the new clean world, it is possible to write patterns for these instructions: woo! This also adds a few simple patterns here and there, though there are a lot still missing. These should be easy to add though. :) See the comments under "Floating Point Stack Support" for more details on the new world order. This patch as absolutely no effect on the generated code, woo! --- Diffs of the changes: (+354 -364) X86FloatingPoint.cpp | 83 +++++++ X86ISelPattern.cpp | 76 +++---- X86InstrInfo.td | 552 +++++++++++++++++++++------------------------------ X86RegisterInfo.cpp | 7 4 files changed, 354 insertions(+), 364 deletions(-) Index: llvm/lib/Target/X86/X86FloatingPoint.cpp diff -u llvm/lib/Target/X86/X86FloatingPoint.cpp:1.44 llvm/lib/Target/X86/X86FloatingPoint.cpp:1.45 --- llvm/lib/Target/X86/X86FloatingPoint.cpp:1.44 Tue Aug 23 18:41:14 2005 +++ llvm/lib/Target/X86/X86FloatingPoint.cpp Wed Dec 21 01:47:04 2005 @@ -311,6 +311,63 @@ } #endif +//===----------------------------------------------------------------------===// +// Register File -> Register Stack Mapping Methods +//===----------------------------------------------------------------------===// + +// OpcodeTable - Sorted map of register instructions to their stack version. +// The first element is an register file pseudo instruction, the second is the +// concrete X86 instruction which uses the register stack. +// +static const TableEntry OpcodeTable[] = { + { X86::FpABS , X86::FABS }, + { X86::FpADD32m , X86::FADD32m }, + { X86::FpADD64m , X86::FADD64m }, + { X86::FpCHS , X86::FCHS }, + { X86::FpCMOVA , X86::FCMOVA }, + { X86::FpCMOVAE , X86::FCMOVAE }, + { X86::FpCMOVB , X86::FCMOVB }, + { X86::FpCMOVBE , X86::FCMOVBE }, + { X86::FpCMOVE , X86::FCMOVE }, + { X86::FpCMOVNE , X86::FCMOVNE }, + { X86::FpCMOVNP , X86::FCMOVNP }, + { X86::FpCMOVP , X86::FCMOVP }, + { X86::FpCOS , X86::FCOS }, + { X86::FpDIV32m , X86::FDIV32m }, + { X86::FpDIV64m , X86::FDIV64m }, + { X86::FpDIVR32m, X86::FDIVR32m }, + { X86::FpDIVR64m, X86::FDIVR64m }, + { X86::FpILD16m , X86::FILD16m }, + { X86::FpILD32m , X86::FILD32m }, + { X86::FpILD64m , X86::FILD64m }, + { X86::FpIST16m , X86::FIST16m }, + { X86::FpIST32m , X86::FIST32m }, + { X86::FpIST64m , X86::FISTP64m }, + { X86::FpLD0 , X86::FLD0 }, + { X86::FpLD1 , X86::FLD1 }, + { X86::FpLD32m , X86::FLD32m }, + { X86::FpLD64m , X86::FLD64m }, + { X86::FpMUL32m , X86::FMUL32m }, + { X86::FpMUL64m , X86::FMUL64m }, + { X86::FpSIN , X86::FSIN }, + { X86::FpSQRT , X86::FSQRT }, + { X86::FpST32m , X86::FST32m }, + { X86::FpST64m , X86::FST64m }, + { X86::FpSUB32m , X86::FSUB32m }, + { X86::FpSUB64m , X86::FSUB64m }, + { X86::FpSUBR32m, X86::FSUBR32m }, + { X86::FpSUBR64m, X86::FSUBR64m }, + { X86::FpTST , X86::FTST }, + { X86::FpUCOMIr , X86::FUCOMIr }, + { X86::FpUCOMr , X86::FUCOMr }, +}; + +static unsigned getConcreteOpcode(unsigned Opcode) { + ASSERT_SORTED(OpcodeTable); + int Opc = Lookup(OpcodeTable, ARRAY_SIZE(OpcodeTable), Opcode); + assert(Opc != -1 && "FP Stack instruction not in OpcodeTable!"); + return Opc; +} //===----------------------------------------------------------------------===// // Helper Methods @@ -407,9 +464,12 @@ void FPS::handleZeroArgFP(MachineBasicBlock::iterator &I) { MachineInstr *MI = I; unsigned DestReg = getFPReg(MI->getOperand(0)); - MI->RemoveOperand(0); // Remove the explicit ST(0) operand - // Result gets pushed on the stack... + // Change from the pseudo instruction to the concrete instruction. + MI->RemoveOperand(0); // Remove the explicit ST(0) operand + MI->setOpcode(getConcreteOpcode(MI->getOpcode())); + + // Result gets pushed on the stack. pushReg(DestReg); } @@ -424,20 +484,22 @@ unsigned Reg = getFPReg(MI->getOperand(MI->getNumOperands()-1)); bool KillsSrc = LV->KillsRegister(MI, X86::FP0+Reg); - // FSTP80r and FISTP64r are strange because there are no non-popping versions. + // FISTP64r is strange because there isn't a non-popping versions. // If we have one _and_ we don't want to pop the operand, duplicate the value // on the stack instead of moving it. This ensure that popping the value is // always ok. // - if ((MI->getOpcode() == X86::FSTP80m || - MI->getOpcode() == X86::FISTP64m) && !KillsSrc) { + if (MI->getOpcode() == X86::FpIST64m && !KillsSrc) { duplicateToTop(Reg, 7 /*temp register*/, I); } else { moveToTop(Reg, I); // Move to the top of the stack... } + + // Convert from the pseudo instruction to the concrete instruction. MI->RemoveOperand(MI->getNumOperands()-1); // Remove explicit ST(0) operand + MI->setOpcode(getConcreteOpcode(MI->getOpcode())); - if (MI->getOpcode() == X86::FSTP80m || MI->getOpcode() == X86::FISTP64m) { + if (MI->getOpcode() == X86::FISTP64m) { assert(StackTop > 0 && "Stack empty??"); --StackTop; } else if (KillsSrc) { // Last use of operand? @@ -475,8 +537,10 @@ duplicateToTop(Reg, getFPReg(MI->getOperand(0)), I); } + // Change from the pseudo instruction to the concrete instruction. MI->RemoveOperand(1); // Drop the source operand. MI->RemoveOperand(0); // Drop the destination operand. + MI->setOpcode(getConcreteOpcode(MI->getOpcode())); } @@ -638,8 +702,10 @@ // anywhere. moveToTop(Op0, I); + // Change from the pseudo instruction to the concrete instruction. MI->getOperand(0).setReg(getSTReg(Op1)); MI->RemoveOperand(1); + MI->setOpcode(getConcreteOpcode(MI->getOpcode())); // If any of the operands are killed by this instruction, free them. if (KillsOp0) freeStackSlotAfter(I, Op0); @@ -660,9 +726,12 @@ moveToTop(Op0, I); // Change the second operand to the stack register that the operand is in. + // Change from the pseudo instruction to the concrete instruction. MI->RemoveOperand(0); MI->getOperand(0).setReg(getSTReg(Op1)); - + MI->setOpcode(getConcreteOpcode(MI->getOpcode())); + + // If we kill the second operand, make sure to pop it from the stack. if (Op0 != Op1 && LV->KillsRegister(MI, X86::FP0+Op1)) { // Get this value off of the register stack. Index: llvm/lib/Target/X86/X86ISelPattern.cpp diff -u llvm/lib/Target/X86/X86ISelPattern.cpp:1.189 llvm/lib/Target/X86/X86ISelPattern.cpp:1.190 --- llvm/lib/Target/X86/X86ISelPattern.cpp:1.189 Wed Dec 14 16:28:18 2005 +++ llvm/lib/Target/X86/X86ISelPattern.cpp Wed Dec 21 01:47:04 2005 @@ -757,9 +757,9 @@ X86::CMOVA32rr, X86::CMOVAE32rr, X86::CMOVP32rr, X86::CMOVNP32rr, }; static const unsigned CMOVTABFP[] = { - X86::FCMOVE , X86::FCMOVNE, /*missing*/0, /*missing*/0, - /*missing*/0, /*missing*/0, X86::FCMOVB , X86::FCMOVBE, - X86::FCMOVA , X86::FCMOVAE, X86::FCMOVP , X86::FCMOVNP + X86::FpCMOVE, X86::FpCMOVNE, /*missing*/0, /*missing*/0, + /*missing*/0, /*missing*/ 0, X86::FpCMOVB, X86::FpCMOVBE, + X86::FpCMOVA, X86::FpCMOVAE, X86::FpCMOVP, X86::FpCMOVNP }; static const int SSE_CMOVTAB[] = { /*CMPEQ*/ 0, /*CMPNEQ*/ 4, /*missing*/ 0, /*missing*/ 0, @@ -944,7 +944,7 @@ default: assert(0 && "Cannot select this type!"); case MVT::i16: Opc = X86::CMOVE16rr; break; case MVT::i32: Opc = X86::CMOVE32rr; break; - case MVT::f64: Opc = X86::FCMOVE; break; + case MVT::f64: Opc = X86::FpCMOVE; break; } } else { // FIXME: CMP R, 0 -> TEST R, R @@ -990,7 +990,7 @@ if (!X86ScalarSSE && (CN->isExactlyValue(+0.0) || CN->isExactlyValue(-0.0))) { unsigned Reg = SelectExpr(LHS); - BuildMI(BB, X86::FTST, 1).addReg(Reg); + BuildMI(BB, X86::FpTST, 1).addReg(Reg); BuildMI(BB, X86::FNSTSW8r, 0); BuildMI(BB, X86::SAHF, 1); return; @@ -1022,7 +1022,7 @@ case MVT::i16: Opc = X86::CMP16rr; break; case MVT::i32: Opc = X86::CMP32rr; break; case MVT::f32: Opc = X86::UCOMISSrr; break; - case MVT::f64: Opc = X86ScalarSSE ? X86::UCOMISDrr : X86::FUCOMIr; break; + case MVT::f64: Opc = X86ScalarSSE ? X86::UCOMISDrr : X86::FpUCOMIr; break; } unsigned Tmp1, Tmp2; if (getRegPressure(LHS) > getRegPressure(RHS)) { @@ -1325,14 +1325,14 @@ if (cast(N)->isExactlyValue(+0.0) || cast(N)->isExactlyValue(-0.0)) - BuildMI(BB, X86::FLD0, 0, Tmp1); + BuildMI(BB, X86::FpLD0, 0, Tmp1); else if (cast(N)->isExactlyValue(+1.0) || cast(N)->isExactlyValue(-1.0)) - BuildMI(BB, X86::FLD1, 0, Tmp1); + BuildMI(BB, X86::FpLD1, 0, Tmp1); else assert(0 && "Unexpected constant!"); if (Tmp1 != Result) - BuildMI(BB, X86::FCHS, 1, Result).addReg(Tmp1); + BuildMI(BB, X86::FpCHS, 1, Result).addReg(Tmp1); return Result; case ISD::Constant: switch (N.getValueType()) { @@ -1347,7 +1347,7 @@ case ISD::UNDEF: if (Node->getValueType(0) == MVT::f64) { // FIXME: SHOULD TEACH STACKIFIER ABOUT UNDEF VALUES! - BuildMI(BB, X86::FLD0, 0, Result); + BuildMI(BB, X86::FpLD0, 0, Result); } else { BuildMI(BB, X86::IMPLICIT_DEF, 0, Result); } @@ -1471,11 +1471,11 @@ switch (SrcTy) { case MVT::i32: addFrameReference(BuildMI(BB, X86::MOV32mr, 5), FrameIdx).addReg(Tmp1); - addFrameReference(BuildMI(BB, X86::FILD32m, 5, Result), FrameIdx); + addFrameReference(BuildMI(BB, X86::FpILD32m, 5, Result), FrameIdx); break; case MVT::i16: addFrameReference(BuildMI(BB, X86::MOV16mr, 5), FrameIdx).addReg(Tmp1); - addFrameReference(BuildMI(BB, X86::FILD16m, 5, Result), FrameIdx); + addFrameReference(BuildMI(BB, X86::FpILD16m, 5, Result), FrameIdx); break; default: break; // No promotion required. } @@ -1523,7 +1523,7 @@ assert(Op1.getOpcode() == ISD::LOAD && "SSE load not promoted"); Opc = X86::ADDSDrm; } else { - Opc = Op1.getOpcode() == ISD::LOAD ? X86::FADD64m : X86::FADD32m; + Opc = Op1.getOpcode() == ISD::LOAD ? X86::FpADD64m : X86::FpADD32m; } break; } @@ -1616,7 +1616,7 @@ Opc = (N.getValueType() == MVT::f32) ? X86::SQRTSSrr : X86::SQRTSDrr; BuildMI(BB, Opc, 1, Result).addReg(Tmp1); } else { - BuildMI(BB, X86::FSQRT, 1, Result).addReg(Tmp1); + BuildMI(BB, X86::FpSQRT, 1, Result).addReg(Tmp1); } return Result; @@ -1631,10 +1631,10 @@ Tmp1 = SelectExpr(Node->getOperand(0)); switch (N.getOpcode()) { default: assert(0 && "Unreachable!"); - case ISD::FABS: BuildMI(BB, X86::FABS, 1, Result).addReg(Tmp1); break; - case ISD::FNEG: BuildMI(BB, X86::FCHS, 1, Result).addReg(Tmp1); break; - case ISD::FSIN: BuildMI(BB, X86::FSIN, 1, Result).addReg(Tmp1); break; - case ISD::FCOS: BuildMI(BB, X86::FCOS, 1, Result).addReg(Tmp1); break; + case ISD::FABS: BuildMI(BB, X86::FpABS, 1, Result).addReg(Tmp1); break; + case ISD::FNEG: BuildMI(BB, X86::FpCHS, 1, Result).addReg(Tmp1); break; + case ISD::FSIN: BuildMI(BB, X86::FpSIN, 1, Result).addReg(Tmp1); break; + case ISD::FCOS: BuildMI(BB, X86::FpCOS, 1, Result).addReg(Tmp1); break; } return Result; @@ -1698,7 +1698,7 @@ case ISD::XOR: { static const unsigned SUBTab[] = { X86::SUB8ri, X86::SUB16ri, X86::SUB32ri, 0, 0, - X86::SUB8rm, X86::SUB16rm, X86::SUB32rm, X86::FSUB32m, X86::FSUB64m, + X86::SUB8rm, X86::SUB16rm, X86::SUB32rm, X86::FpSUB32m, X86::FpSUB64m, X86::SUB8rr, X86::SUB16rr, X86::SUB32rr, X86::FpSUB , X86::FpSUB, }; static const unsigned SSE_SUBTab[] = { @@ -1708,7 +1708,7 @@ }; static const unsigned MULTab[] = { 0, X86::IMUL16rri, X86::IMUL32rri, 0, 0, - 0, X86::IMUL16rm , X86::IMUL32rm, X86::FMUL32m, X86::FMUL64m, + 0, X86::IMUL16rm , X86::IMUL32rm, X86::FpMUL32m, X86::FpMUL64m, 0, X86::IMUL16rr , X86::IMUL32rr, X86::FpMUL , X86::FpMUL, }; static const unsigned SSE_MULTab[] = { @@ -1821,9 +1821,9 @@ // For FP, emit 'reverse' subract, with a memory operand. if (N.getValueType() == MVT::f64 && !X86ScalarSSE) { if (Op0.getOpcode() == ISD::EXTLOAD) - Opc = X86::FSUBR32m; + Opc = X86::FpSUBR32m; else - Opc = X86::FSUBR64m; + Opc = X86::FpSUBR64m; X86AddressMode AM; EmitFoldedLoad(Op0, AM); @@ -2015,9 +2015,9 @@ // Check for reversed and unreversed DIV. if (isFoldableLoad(N.getOperand(0), N.getOperand(1), true)) { if (N.getOperand(0).getOpcode() == ISD::EXTLOAD) - Opc = X86::FDIVR32m; + Opc = X86::FpDIVR32m; else - Opc = X86::FDIVR64m; + Opc = X86::FpDIVR64m; X86AddressMode AM; EmitFoldedLoad(N.getOperand(0), AM); Tmp1 = SelectExpr(N.getOperand(1)); @@ -2026,9 +2026,9 @@ } else if (isFoldableLoad(N.getOperand(1), N.getOperand(0), true) && N.getOperand(1).getOpcode() == ISD::LOAD) { if (N.getOperand(1).getOpcode() == ISD::EXTLOAD) - Opc = X86::FDIV32m; + Opc = X86::FpDIV32m; else - Opc = X86::FDIV64m; + Opc = X86::FpDIV64m; X86AddressMode AM; EmitFoldedLoad(N.getOperand(1), AM); Tmp1 = SelectExpr(N.getOperand(0)); @@ -2230,7 +2230,7 @@ if (X86ScalarSSE) { Opc = X86::MOVSDrm; } else { - Opc = X86::FLD64m; + Opc = X86::FpLD64m; ContainsFPCode = true; } break; @@ -2276,7 +2276,7 @@ Select(Chain); } - addFullAddress(BuildMI(BB, X86::FILD64m, 4, Result), AM); + addFullAddress(BuildMI(BB, X86::FpILD64m, 4, Result), AM); } return Result; @@ -2295,7 +2295,7 @@ unsigned CPIdx = BB->getParent()->getConstantPool()-> getConstantPoolIndex(CP->get()); - addConstantPoolReference(BuildMI(BB, X86::FLD32m, 4, Result), CPIdx); + addConstantPoolReference(BuildMI(BB, X86::FpLD32m, 4, Result), CPIdx); return Result; } @@ -2314,7 +2314,7 @@ case MVT::f64: assert(cast(Node->getOperand(3))->getVT() == MVT::f32 && "Bad EXTLOAD!"); - addFullAddress(BuildMI(BB, X86::FLD32m, 5, Result), AM); + addFullAddress(BuildMI(BB, X86::FpLD32m, 5, Result), AM); break; case MVT::i32: switch (cast(Node->getOperand(3))->getVT()) { @@ -2521,7 +2521,7 @@ unsigned Size = MVT::getSizeInBits(MVT::f64)/8; MachineFunction *F = BB->getParent(); int FrameIdx = F->getFrameInfo()->CreateStackObject(Size, Size); - addFrameReference(BuildMI(BB, X86::FST64m, 5), FrameIdx).addReg(X86::FP0); + addFrameReference(BuildMI(BB, X86::FpST64m, 5), FrameIdx).addReg(X86::FP0); addFrameReference(BuildMI(BB, X86::MOVSDrm, 4, Result), FrameIdx); break; } else { @@ -3197,7 +3197,7 @@ MachineFunction *F = BB->getParent(); int FrameIdx = F->getFrameInfo()->CreateStackObject(Size, Size); addFrameReference(BuildMI(BB, X86::MOVSSmr, 5), FrameIdx).addReg(Tmp1); - addFrameReference(BuildMI(BB, X86::FLD32m, 4, X86::FP0), FrameIdx); + addFrameReference(BuildMI(BB, X86::FpLD32m, 4, X86::FP0), FrameIdx); BuildMI(BB, X86::FpSETRESULT, 1).addReg(X86::FP0); ContainsFPCode = true; } else { @@ -3212,7 +3212,7 @@ MachineFunction *F = BB->getParent(); int FrameIdx = F->getFrameInfo()->CreateStackObject(Size, Size); addFrameReference(BuildMI(BB, X86::MOVSDmr, 5), FrameIdx).addReg(Tmp1); - addFrameReference(BuildMI(BB, X86::FLD64m, 4, X86::FP0), FrameIdx); + addFrameReference(BuildMI(BB, X86::FpLD64m, 4, X86::FP0), FrameIdx); BuildMI(BB, X86::FpSETRESULT, 1).addReg(X86::FP0); ContainsFPCode = true; } else { @@ -3342,9 +3342,9 @@ // Get the X86 opcode to use. switch (N.getOpcode()) { - case X86ISD::FP_TO_INT16_IN_MEM: Tmp1 = X86::FIST16m; break; - case X86ISD::FP_TO_INT32_IN_MEM: Tmp1 = X86::FIST32m; break; - case X86ISD::FP_TO_INT64_IN_MEM: Tmp1 = X86::FISTP64m; break; + case X86ISD::FP_TO_INT16_IN_MEM: Tmp1 = X86::FpIST16m; break; + case X86ISD::FP_TO_INT32_IN_MEM: Tmp1 = X86::FpIST32m; break; + case X86ISD::FP_TO_INT64_IN_MEM: Tmp1 = X86::FpIST64m; break; } addFullAddress(BuildMI(BB, Tmp1, 5), AM).addReg(ValReg); @@ -3393,7 +3393,7 @@ case MVT::i1: Opc = X86::MOV8mr; break; case MVT::f32: assert(!X86ScalarSSE && "Cannot truncstore scalar SSE regs"); - Opc = X86::FST32m; break; + Opc = X86::FpST32m; break; } std::vector > RP; @@ -3474,7 +3474,7 @@ case MVT::i16: Opc = X86::MOV16mr; break; case MVT::i32: Opc = X86::MOV32mr; break; case MVT::f32: Opc = X86::MOVSSmr; break; - case MVT::f64: Opc = X86ScalarSSE ? X86::MOVSDmr : X86::FST64m; break; + case MVT::f64: Opc = X86ScalarSSE ? X86::MOVSDmr : X86::FpST64m; break; } std::vector > RP; Index: llvm/lib/Target/X86/X86InstrInfo.td diff -u llvm/lib/Target/X86/X86InstrInfo.td:1.177 llvm/lib/Target/X86/X86InstrInfo.td:1.178 --- llvm/lib/Target/X86/X86InstrInfo.td:1.177 Tue Dec 20 23:34:58 2005 +++ llvm/lib/Target/X86/X86InstrInfo.td Wed Dec 21 01:47:04 2005 @@ -2203,334 +2203,256 @@ // Stack-based Floating point support //===----------------------------------------------------------------------===// -// FIXME: These need to indicate mod/ref sets for FP regs... & FP 'TOP' - -// Floating point instruction template -class FPI o, Format F, FPFormat fp, dag ops, string asm, - list pattern> - : X86Inst { +// Floating point support. All FP Stack operations are represented with two +// instructions here. The first instruction, generated by the instruction +// selector, uses "RFP" registers: a traditional register file to reference +// floating point values. These instructions are all psuedo instructions and +// use the "Fp" prefix. The second instruction is defined with FPI, which is +// the actual instruction emitted by the assembler. The FP stackifier pass +// converts one to the other after register allocation occurs. +// +// Note that the FpI instruction should have instruction selection info (e.g. +// a pattern) and the FPI instruction should have emission info (e.g. opcode +// encoding and asm printing info). + +// FPI - Floating Point Instruction template. +class FPI o, Format F, dag ops, string asm> : I {} + +// FpI - Floating Point Psuedo Instruction template. +class FpI pattern> + : X86Inst<0, Pseudo, NoImm, ops, ""> { let FPForm = fp; let FPFormBits = FPForm.Value; let Pattern = pattern; } -// Pseudo instructions for floating point. We use these pseudo instructions -// because they can be expanded by the fp spackifier into one of many different -// forms of instructions for doing these operations. Until the stackifier runs, -// we prefer to be abstract. -def FpMOV : FPI<0, Pseudo, SpecialFP, - (ops RFP:$dst, RFP:$src), "", []>; // f1 = fmov f2 -def FpADD : FPI<0, Pseudo, TwoArgFP , - (ops RFP:$dst, RFP:$src1, RFP:$src2), "", - []>; // f1 = fadd f2, f3 -def FpSUB : FPI<0, Pseudo, TwoArgFP , - (ops RFP:$dst, RFP:$src1, RFP:$src2), "", - []>; // f1 = fsub f2, f3 -def FpMUL : FPI<0, Pseudo, TwoArgFP , - (ops RFP:$dst, RFP:$src1, RFP:$src2), "", - []>; // f1 = fmul f2, f3 -def FpDIV : FPI<0, Pseudo, TwoArgFP , - (ops RFP:$dst, RFP:$src1, RFP:$src2), "", - []>; // f1 = fdiv f2, f3 - -def FpLD32m : FPI<0xD9, MRM0m, ZeroArgFP, - (ops RFP:$dst, f32mem:$src), - "fld{s} $src", - [(set RFP:$dst, (X86fld addr:$src, f32))]>; - -def FpLD64m : FPI<0xDD, MRM0m, ZeroArgFP, - (ops RFP:$dst, f64mem:$src), - "fld{l} $src", - [(set RFP:$dst, (X86fld addr:$src, f64))]>; - -def FpGETRESULT : FPI<0, Pseudo, SpecialFP, (ops RFP:$dst), "", []>, - Imp<[ST0], []>; // FPR = ST(0) - -def FpSETRESULT : FPI<0, Pseudo, SpecialFP, (ops RFP:$src), "", - [(X86fpset RFP:$src)]>, - Imp<[], [ST0]>; // ST(0) = FPR - -// FADD reg, mem: Before stackification, these are represented by: -// R1 = FADD* R2, [mem] -def FADD32m : FPI<0xD8, MRM0m, OneArgFPRW, // ST(0) = ST(0) + [mem32real] - (ops f32mem:$src, variable_ops), - "fadd{s} $src", []>; -def FADD64m : FPI<0xDC, MRM0m, OneArgFPRW, // ST(0) = ST(0) + [mem64real] - (ops f64mem:$src, variable_ops), - "fadd{l} $src", []>; -//def FIADD16m : FPI<0xDE, MRM0m, OneArgFPRW>; // ST(0) = ST(0) + [mem16int] -//def FIADD32m : FPI<0xDA, MRM0m, OneArgFPRW>; // ST(0) = ST(0) + [mem32int] - -// FMUL reg, mem: Before stackification, these are represented by: -// R1 = FMUL* R2, [mem] -def FMUL32m : FPI<0xD8, MRM1m, OneArgFPRW, // ST(0) = ST(0) * [mem32real] - (ops f32mem:$src, variable_ops), - "fmul{s} $src", []>; -def FMUL64m : FPI<0xDC, MRM1m, OneArgFPRW, // ST(0) = ST(0) * [mem64real] - (ops f64mem:$src, variable_ops), - "fmul{l} $src", []>; -// ST(0) = ST(0) * [mem16int] -//def FIMUL16m : FPI16m<"fimul", 0xDE, MRM1m, OneArgFPRW>; -// ST(0) = ST(0) * [mem32int] -//def FIMUL32m : FPI32m<"fimul", 0xDA, MRM1m, OneArgFPRW>; - -// FSUB reg, mem: Before stackification, these are represented by: -// R1 = FSUB* R2, [mem] -def FSUB32m : FPI<0xD8, MRM4m, OneArgFPRW, // ST(0) = ST(0) - [mem32real] - (ops f32mem:$src, variable_ops), - "fsub{s} $src", []>; -def FSUB64m : FPI<0xDC, MRM4m, OneArgFPRW, // ST(0) = ST(0) - [mem64real] - (ops f64mem:$src, variable_ops), - "fsub{l} $src", []>; -// ST(0) = ST(0) - [mem16int] -//def FISUB16m : FPI16m<"fisub", 0xDE, MRM4m, OneArgFPRW>; -// ST(0) = ST(0) - [mem32int] -//def FISUB32m : FPI32m<"fisub", 0xDA, MRM4m, OneArgFPRW>; - -// FSUBR reg, mem: Before stackification, these are represented by: -// R1 = FSUBR* R2, [mem] - -// Note that the order of operands does not reflect the operation being -// performed. -def FSUBR32m : FPI<0xD8, MRM5m, OneArgFPRW, // ST(0) = [mem32real] - ST(0) - (ops f32mem:$src, variable_ops), - "fsubr{s} $src", []>; -def FSUBR64m : FPI<0xDC, MRM5m, OneArgFPRW, // ST(0) = [mem64real] - ST(0) - (ops f64mem:$src, variable_ops), - "fsubr{l} $src", []>; -// ST(0) = [mem16int] - ST(0) -//def FISUBR16m : FPI16m<"fisubr", 0xDE, MRM5m, OneArgFPRW>; -// ST(0) = [mem32int] - ST(0) -//def FISUBR32m : FPI32m<"fisubr", 0xDA, MRM5m, OneArgFPRW>; - -// FDIV reg, mem: Before stackification, these are represented by: -// R1 = FDIV* R2, [mem] -def FDIV32m : FPI<0xD8, MRM6m, OneArgFPRW, // ST(0) = ST(0) / [mem32real] - (ops f32mem:$src, variable_ops), - "fdiv{s} $src", []>; -def FDIV64m : FPI<0xDC, MRM6m, OneArgFPRW, // ST(0) = ST(0) / [mem64real] - (ops f64mem:$src, variable_ops), - "fdiv{l} $src", []>; -// ST(0) = ST(0) / [mem16int] -//def FIDIV16m : FPI16m<"fidiv", 0xDE, MRM6m, OneArgFPRW>; -// ST(0) = ST(0) / [mem32int] -//def FIDIV32m : FPI32m<"fidiv", 0xDA, MRM6m, OneArgFPRW>; - -// FDIVR reg, mem: Before stackification, these are represented by: -// R1 = FDIVR* R2, [mem] -// Note that the order of operands does not reflect the operation being -// performed. -def FDIVR32m : FPI<0xD8, MRM7m, OneArgFPRW, // ST(0) = [mem32real] / ST(0) - (ops f32mem:$src, variable_ops), - "fdivr{s} $src", []>; -def FDIVR64m : FPI<0xDC, MRM7m, OneArgFPRW, // ST(0) = [mem64real] / ST(0) - (ops f64mem:$src, variable_ops), - "fdivr{l} $src", []>; -// ST(0) = [mem16int] / ST(0) -//def FIDIVR16m : FPI16m<"fidivr", 0xDE, MRM7m, OneArgFPRW>; -// ST(0) = [mem32int] / ST(0) -//def FIDIVR32m : FPI32m<"fidivr", 0xDA, MRM7m, OneArgFPRW>; - - -// Floating point cmovs... -let isTwoAddress = 1, Uses = [ST0], Defs = [ST0] in { - def FCMOVB : FPI<0xC0, AddRegFrm, CondMovFP, - (ops RST:$op, variable_ops), - "fcmovb {$op, %ST(0)|%ST(0), $op}", []>, DA; - def FCMOVBE : FPI<0xD0, AddRegFrm, CondMovFP, - (ops RST:$op, variable_ops), - "fcmovbe {$op, %ST(0)|%ST(0), $op}", []>, DA; - def FCMOVE : FPI<0xC8, AddRegFrm, CondMovFP, - (ops RST:$op, variable_ops), - "fcmove {$op, %ST(0)|%ST(0), $op}", []>, DA; - def FCMOVP : FPI<0xD8, AddRegFrm, CondMovFP, - (ops RST:$op, variable_ops), - "fcmovu {$op, %ST(0)|%ST(0), $op}", []>, DA; - def FCMOVAE : FPI<0xC0, AddRegFrm, CondMovFP, - (ops RST:$op, variable_ops), - "fcmovae {$op, %ST(0)|%ST(0), $op}", []>, DB; - def FCMOVA : FPI<0xD0, AddRegFrm, CondMovFP, - (ops RST:$op, variable_ops), - "fcmova {$op, %ST(0)|%ST(0), $op}", []>, DB; - def FCMOVNE : FPI<0xC8, AddRegFrm, CondMovFP, - (ops RST:$op, variable_ops), - "fcmovne {$op, %ST(0)|%ST(0), $op}", []>, DB; - def FCMOVNP : FPI<0xD8, AddRegFrm, CondMovFP, - (ops RST:$op, variable_ops), - "fcmovnu {$op, %ST(0)|%ST(0), $op}", []>, DB; +// Random Pseudo Instructions. +def FpGETRESULT : FpI<(ops RFP:$dst), SpecialFP, // FPR = ST(0) + []>; +def FpSETRESULT : FpI<(ops RFP:$src), SpecialFP, + [(X86fpset RFP:$src)]>, Imp<[], [ST0]>; // ST(0) = FPR +def FpMOV : FpI<(ops RFP:$dst, RFP:$src), SpecialFP, + []>; // f1 = fmov f2 + +// Binary Ops with a memory source. +def FpADD32m : FpI<(ops RFP:$dst, RFP:$src1, f32mem:$src2), OneArgFPRW, + []>; // ST(0) = ST(0) + [mem32] +def FpADD64m : FpI<(ops RFP:$dst, RFP:$src1, f32mem:$src2), OneArgFPRW, + []>; // ST(0) = ST(0) + [mem32] +def FpMUL32m : FpI<(ops RFP:$dst, RFP:$src1, f32mem:$src2), OneArgFPRW, + []>; // ST(0) = ST(0) * [mem32] +def FpMUL64m : FpI<(ops RFP:$dst, RFP:$src1, f32mem:$src2), OneArgFPRW, + []>; // ST(0) = ST(0) * [mem32] +def FpSUB32m : FpI<(ops RFP:$dst, RFP:$src1, f32mem:$src2), OneArgFPRW, + []>; // ST(0) = ST(0) - [mem32] +def FpSUB64m : FpI<(ops RFP:$dst, RFP:$src1, f32mem:$src2), OneArgFPRW, + []>; // ST(0) = ST(0) - [mem32] +def FpSUBR32m : FpI<(ops RFP:$dst, RFP:$src1, f32mem:$src2), OneArgFPRW, + []>; // ST(0) = [mem32] - ST(0) +def FpSUBR64m : FpI<(ops RFP:$dst, RFP:$src1, f32mem:$src2), OneArgFPRW, + []>; // ST(0) = [mem32] - ST(0) +def FpDIV32m : FpI<(ops RFP:$dst, RFP:$src1, f32mem:$src2), OneArgFPRW, + []>; // ST(0) = ST(0) / [mem32] +def FpDIV64m : FpI<(ops RFP:$dst, RFP:$src1, f32mem:$src2), OneArgFPRW, + []>; // ST(0) = ST(0) / [mem32] +def FpDIVR32m : FpI<(ops RFP:$dst, RFP:$src1, f32mem:$src2), OneArgFPRW, + []>; // ST(0) = [mem32] / ST(0) +def FpDIVR64m : FpI<(ops RFP:$dst, RFP:$src1, f32mem:$src2), OneArgFPRW, + []>; // ST(0) = [mem32] / ST(0) + + +def FADD32m : FPI<0xD8, MRM0m, (ops f32mem:$src), "fadd{s} $src">; +def FADD64m : FPI<0xDC, MRM0m, (ops f64mem:$src), "fadd{l} $src">; +def FMUL32m : FPI<0xD8, MRM1m, (ops f32mem:$src), "fmul{s} $src">; +def FMUL64m : FPI<0xDC, MRM1m, (ops f64mem:$src), "fmul{l} $src">; +def FSUB32m : FPI<0xD8, MRM4m, (ops f32mem:$src), "fsub{s} $src">; +def FSUB64m : FPI<0xDC, MRM4m, (ops f64mem:$src), "fsub{l} $src">; +def FSUBR32m : FPI<0xD8, MRM5m, (ops f32mem:$src), "fsubr{s} $src">; +def FSUBR64m : FPI<0xDC, MRM5m, (ops f64mem:$src), "fsubr{l} $src">; +def FDIV32m : FPI<0xD8, MRM6m, (ops f32mem:$src), "fdiv{s} $src">; +def FDIV64m : FPI<0xDC, MRM6m, (ops f64mem:$src), "fdiv{l} $src">; +def FDIVR32m : FPI<0xD8, MRM7m, (ops f32mem:$src), "fdivr{s} $src">; +def FDIVR64m : FPI<0xDC, MRM7m, (ops f64mem:$src), "fdivr{l} $src">; + +// FIXME: Implement these when we have a dag-dag isel! +//def FIADD16m : FPI<0xDE, MRM0m>; // ST(0) = ST(0) + [mem16int] +//def FIADD32m : FPI<0xDA, MRM0m>; // ST(0) = ST(0) + [mem32int] +//def FIMUL16m : FPI<0xDE, MRM1m>; // ST(0) = ST(0) * [mem16] +//def FIMUL32m : FPI<0xDA, MRM1m>; // ST(0) = ST(0) * [mem32] +//def FISUB16m : FPI<0xDE, MRM4m>; // ST(0) = ST(0) - [mem16int] +//def FISUB32m : FPI<0xDA, MRM4m>; // ST(0) = ST(0) - [mem32int] +//def FISUBR16m : FPI<0xDE, MRM5m>; // ST(0) = [mem16int] - ST(0) +//def FISUBR32m : FPI<0xDA, MRM5m>; // ST(0) = [mem32int] - ST(0) +//def FIDIV16m : FPI<0xDE, MRM6m>; // ST(0) = ST(0) / [mem16int] +//def FIDIV32m : FPI<0xDA, MRM6m>; // ST(0) = ST(0) / [mem32int] +//def FIDIVR16m : FPI<0xDE, MRM7m>; // ST(0) = [mem16int] / ST(0) +//def FIDIVR32m : FPI<0xDA, MRM7m>; // ST(0) = [mem32int] / ST(0) + + +// Floating point cmovs. +let isTwoAddress = 1 in { + def FpCMOVB : FpI<(ops RST:$dst, RFP:$src1, RFP:$src2), CondMovFP, []>; + def FpCMOVBE : FpI<(ops RST:$dst, RFP:$src1, RFP:$src2), CondMovFP, []>; + def FpCMOVE : FpI<(ops RST:$dst, RFP:$src1, RFP:$src2), CondMovFP, []>; + def FpCMOVP : FpI<(ops RST:$dst, RFP:$src1, RFP:$src2), CondMovFP, []>; + def FpCMOVAE : FpI<(ops RST:$dst, RFP:$src1, RFP:$src2), CondMovFP, []>; + def FpCMOVA : FpI<(ops RST:$dst, RFP:$src1, RFP:$src2), CondMovFP, []>; + def FpCMOVNE : FpI<(ops RST:$dst, RFP:$src1, RFP:$src2), CondMovFP, []>; + def FpCMOVNP : FpI<(ops RST:$dst, RFP:$src1, RFP:$src2), CondMovFP, []>; } -// Floating point loads & stores... -// FIXME: these are all marked variable_ops because they have an implicit -// destination. Instructions like FILD* that are generated by the instruction -// selector (not the fp stackifier) need more accurate operand accounting. -def FLDrr : FPI<0xC0, AddRegFrm, NotFP, - (ops RST:$src, variable_ops), - "fld $src", []>, D9; -def FLD32m : FPI<0xD9, MRM0m, ZeroArgFP, - (ops f32mem:$src, variable_ops), - "fld{s} $src", []>; -def FLD64m : FPI<0xDD, MRM0m, ZeroArgFP, - (ops f64mem:$src, variable_ops), - "fld{l} $src", []>; -def FLD80m : FPI<0xDB, MRM5m, ZeroArgFP, - (ops f80mem:$src, variable_ops), - "fld{t} $src", []>; -def FILD16m : FPI<0xDF, MRM0m, ZeroArgFP, - (ops i16mem:$src, variable_ops), - "fild{s} $src", []>; -def FILD32m : FPI<0xDB, MRM0m, ZeroArgFP, - (ops i32mem:$src, variable_ops), - "fild{l} $src", []>; -def FILD64m : FPI<0xDF, MRM5m, ZeroArgFP, - (ops i64mem:$src, variable_ops), - "fild{ll} $src", []>; - -def FSTrr : FPI<0xD0, AddRegFrm, NotFP, - (ops RST:$op, variable_ops), - "fst $op", []>, DD; -def FSTPrr : FPI<0xD8, AddRegFrm, NotFP, - (ops RST:$op, variable_ops), - "fstp $op", []>, DD; -def FST32m : FPI<0xD9, MRM2m, OneArgFP, - (ops f32mem:$op, variable_ops), - "fst{s} $op", []>; -def FST64m : FPI<0xDD, MRM2m, OneArgFP, - (ops f64mem:$op, variable_ops), - "fst{l} $op", []>; -def FSTP32m : FPI<0xD9, MRM3m, OneArgFP, - (ops f32mem:$op, variable_ops), - "fstp{s} $op", []>; -def FSTP64m : FPI<0xDD, MRM3m, OneArgFP, - (ops f64mem:$op, variable_ops), - "fstp{l} $op", []>; -def FSTP80m : FPI<0xDB, MRM7m, OneArgFP, - (ops f80mem:$op, variable_ops), - "fstp{t} $op", []>; - -def FIST16m : FPI<0xDF, MRM2m , OneArgFP, - (ops i16mem:$op, variable_ops), - "fist{s} $op", []>; -def FIST32m : FPI<0xDB, MRM2m , OneArgFP, - (ops i32mem:$op, variable_ops), - "fist{l} $op", []>; -def FISTP16m : FPI<0xDF, MRM3m , NotFP , - (ops i16mem:$op, variable_ops), - "fistp{s} $op", []>; -def FISTP32m : FPI<0xDB, MRM3m , NotFP , - (ops i32mem:$op, variable_ops), - "fistp{l} $op", []>; -def FISTP64m : FPI<0xDF, MRM7m , OneArgFP, - (ops i64mem:$op, variable_ops), - "fistp{ll} $op", []>; - -def FXCH : FPI<0xC8, AddRegFrm, NotFP, - (ops RST:$op), "fxch $op", []>, D9; // fxch ST(i), ST(0) - -// Floating point constant loads... -def FLD0 : FPI<0xEE, RawFrm, ZeroArgFP, (ops variable_ops), "fldz", []>, D9; -def FLD1 : FPI<0xE8, RawFrm, ZeroArgFP, (ops variable_ops), "fld1", []>, D9; - - -// Unary operations... -def FCHS : FPI<0xE0, RawFrm, OneArgFPRW, // f1 = fchs f2 - (ops variable_ops), - "fchs", []>, D9; -def FABS : FPI<0xE1, RawFrm, OneArgFPRW, // f1 = fabs f2 - (ops variable_ops), - "fabs", []>, D9; -def FSQRT : FPI<0xFA, RawFrm, OneArgFPRW, // fsqrt ST(0) - (ops variable_ops), - "fsqrt", []>, D9; -def FSIN : FPI<0xFE, RawFrm, OneArgFPRW, // fsin ST(0) - (ops variable_ops), - "fsin", []>, D9; -def FCOS : FPI<0xFF, RawFrm, OneArgFPRW, // fcos ST(0) - (ops variable_ops), - "fcos", []>, D9; -def FTST : FPI<0xE4, RawFrm, OneArgFP , // ftst ST(0) - (ops variable_ops), - "ftst", []>, D9; - -// Binary arithmetic operations... -class FPST0rInst o, dag ops, string asm> - : I, D8 { - list Uses = [ST0]; - list Defs = [ST0]; -} -class FPrST0Inst o, dag ops, string asm> - : I, DC { - list Uses = [ST0]; -} -class FPrST0PInst o, dag ops, string asm> - : I, DE { - list Uses = [ST0]; -} +def FCMOVB : FPI<0xC0, AddRegFrm, (ops RST:$op), + "fcmovb {$op, %ST(0)|%ST(0), $op}">, DA; +def FCMOVBE : FPI<0xD0, AddRegFrm, (ops RST:$op), + "fcmovbe {$op, %ST(0)|%ST(0), $op}">, DA; +def FCMOVE : FPI<0xC8, AddRegFrm, (ops RST:$op), + "fcmove {$op, %ST(0)|%ST(0), $op}">, DA; +def FCMOVP : FPI<0xD8, AddRegFrm, (ops RST:$op), + "fcmovu {$op, %ST(0)|%ST(0), $op}">, DA; +def FCMOVAE : FPI<0xC0, AddRegFrm, (ops RST:$op), + "fcmovae {$op, %ST(0)|%ST(0), $op}">, DB; +def FCMOVA : FPI<0xD0, AddRegFrm, (ops RST:$op), + "fcmova {$op, %ST(0)|%ST(0), $op}">, DB; +def FCMOVNE : FPI<0xC8, AddRegFrm, (ops RST:$op), + "fcmovne {$op, %ST(0)|%ST(0), $op}">, DB; +def FCMOVNP : FPI<0xD8, AddRegFrm, (ops RST:$op), + "fcmovnu {$op, %ST(0)|%ST(0), $op}">, DB; -def FADDST0r : FPST0rInst <0xC0, (ops RST:$op), - "fadd $op">; -def FADDrST0 : FPrST0Inst <0xC0, (ops RST:$op), - "fadd {%ST(0), $op|$op, %ST(0)}">; -def FADDPrST0 : FPrST0PInst<0xC0, (ops RST:$op), - "faddp $op">; +// Floating point loads & stores. +def FpLD32m : FpI<(ops RFP:$dst, f32mem:$src), ZeroArgFP, + [(set RFP:$dst, (X86fld addr:$src, f32))]>; +def FpLD64m : FpI<(ops RFP:$dst, f64mem:$src), ZeroArgFP, + [(set RFP:$dst, (X86fld addr:$src, f64))]>; +def FpILD16m : FpI<(ops RFP:$dst, i16mem:$src), ZeroArgFP, + []>; +def FpILD32m : FpI<(ops RFP:$dst, i32mem:$src), ZeroArgFP, + []>; +def FpILD64m : FpI<(ops RFP:$dst, i64mem:$src), ZeroArgFP, + []>; + +def FpST32m : FpI<(ops f32mem:$op, RFP:$src), OneArgFP, []>; +def FpST64m : FpI<(ops f64mem:$op, RFP:$src), OneArgFP, []>; +def FpSTP32m : FpI<(ops f32mem:$op, RFP:$src), OneArgFP, []>; +def FpSTP64m : FpI<(ops f64mem:$op, RFP:$src), OneArgFP, []>; +def FpIST16m : FpI<(ops i16mem:$op, RFP:$src), OneArgFP, []>; +def FpIST32m : FpI<(ops i32mem:$op, RFP:$src), OneArgFP, []>; +def FpIST64m : FpI<(ops i64mem:$op, RFP:$src), OneArgFP, []>; + +def FLD32m : FPI<0xD9, MRM0m, (ops f32mem:$src), "fld{s} $src">; +def FLD64m : FPI<0xDD, MRM0m, (ops f64mem:$src), "fld{l} $src">; +def FILD16m : FPI<0xDF, MRM0m, (ops i16mem:$src), "fild{s} $src">; +def FILD32m : FPI<0xDB, MRM0m, (ops i32mem:$src), "fild{l} $src">; +def FILD64m : FPI<0xDF, MRM5m, (ops i64mem:$src), "fild{ll} $src">; +def FST32m : FPI<0xD9, MRM2m, (ops f32mem:$dst), "fst{s} $dst">; +def FST64m : FPI<0xDD, MRM2m, (ops f64mem:$dst), "fst{l} $dst">; +def FSTP32m : FPI<0xD9, MRM3m, (ops f32mem:$dst), "fstp{s} $dst">; +def FSTP64m : FPI<0xDD, MRM3m, (ops f64mem:$dst), "fstp{l} $dst">; +def FIST16m : FPI<0xDF, MRM2m, (ops i16mem:$dst), "fist{s} $dst">; +def FIST32m : FPI<0xDB, MRM2m, (ops i32mem:$dst), "fist{l} $dst">; +def FISTP16m : FPI<0xDF, MRM3m, (ops i16mem:$dst), "fistp{s} $dst">; +def FISTP32m : FPI<0xDB, MRM3m, (ops i32mem:$dst), "fistp{l} $dst">; +def FISTP64m : FPI<0xDF, MRM7m, (ops i64mem:$dst), "fistp{ll} $dst">; + +// FP Stack manipulation instructions. +def FLDrr : FPI<0xC0, AddRegFrm, (ops RST:$op), "fld $op">, D9; +def FSTrr : FPI<0xD0, AddRegFrm, (ops RST:$op), "fst $op">, DD; +def FSTPrr : FPI<0xD8, AddRegFrm, (ops RST:$op), "fstp $op">, DD; +def FXCH : FPI<0xC8, AddRegFrm, (ops RST:$op), "fxch $op">, D9; + +// Floating point constant loads. +def FpLD0 : FpI<(ops RFP:$dst), ZeroArgFP, []>; +def FpLD1 : FpI<(ops RFP:$dst), ZeroArgFP, []>; + +def FLD0 : FPI<0xEE, RawFrm, (ops), "fldz">, D9; +def FLD1 : FPI<0xE8, RawFrm, (ops), "fld1">, D9; + + +// Unary operations. +def FpCHS : FpI<(ops RFP:$dst, RFP:$src), OneArgFPRW, + [(set RFP:$dst, (fneg RFP:$src))]>; +def FpABS : FpI<(ops RFP:$dst, RFP:$src), OneArgFPRW, + [(set RFP:$dst, (fabs RFP:$src))]>; +def FpSQRT : FpI<(ops RFP:$dst, RFP:$src), OneArgFPRW, + [(set RFP:$dst, (fsqrt RFP:$src))]>; +def FpSIN : FpI<(ops RFP:$dst, RFP:$src), OneArgFPRW, + [(set RFP:$dst, (fsin RFP:$src))]>; +def FpCOS : FpI<(ops RFP:$dst, RFP:$src), OneArgFPRW, + [(set RFP:$dst, (fcos RFP:$src))]>; +def FpTST : FpI<(ops RFP:$src), OneArgFP, + []>; + +def FCHS : FPI<0xE0, RawFrm, (ops), "fchs">, D9; +def FABS : FPI<0xE1, RawFrm, (ops), "fabs">, D9; +def FSQRT : FPI<0xFA, RawFrm, (ops), "fsqrt">, D9; +def FSIN : FPI<0xFE, RawFrm, (ops), "fsin">, D9; +def FCOS : FPI<0xFF, RawFrm, (ops), "fcos">, D9; +def FTST : FPI<0xE4, RawFrm, (ops), "ftst">, D9; + + + +// Add, Sub, Mul, Div. +def FpADD : FpI<(ops RFP:$dst, RFP:$src1, RFP:$src2), TwoArgFP, + [(set RFP:$dst, (fadd RFP:$src1, RFP:$src2))]>; +def FpSUB : FpI<(ops RFP:$dst, RFP:$src1, RFP:$src2), TwoArgFP, + [(set RFP:$dst, (fsub RFP:$src1, RFP:$src2))]>; +def FpMUL : FpI<(ops RFP:$dst, RFP:$src1, RFP:$src2), TwoArgFP, + [(set RFP:$dst, (fmul RFP:$src1, RFP:$src2))]>; +def FpDIV : FpI<(ops RFP:$dst, RFP:$src1, RFP:$src2), TwoArgFP, + [(set RFP:$dst, (fdiv RFP:$src1, RFP:$src2))]>; + +class FPST0rInst o, string asm> + : FPI, D8; +class FPrST0Inst o, string asm> + : FPI, DC; +class FPrST0PInst o, string asm> + : FPI, DE; // NOTE: GAS and apparently all other AT&T style assemblers have a broken notion // of some of the 'reverse' forms of the fsub and fdiv instructions. As such, // we have to put some 'r's in and take them out of weird places. -def FSUBRST0r : FPST0rInst <0xE8, (ops RST:$op), - "fsubr $op">; -def FSUBrST0 : FPrST0Inst <0xE8, (ops RST:$op), - "fsub{r} {%ST(0), $op|$op, %ST(0)}">; -def FSUBPrST0 : FPrST0PInst<0xE8, (ops RST:$op), - "fsub{r}p $op">; - -def FSUBST0r : FPST0rInst <0xE0, (ops RST:$op), - "fsub $op">; -def FSUBRrST0 : FPrST0Inst <0xE0, (ops RST:$op), - "fsub{|r} {%ST(0), $op|$op, %ST(0)}">; -def FSUBRPrST0 : FPrST0PInst<0xE0, (ops RST:$op), - "fsub{|r}p $op">; - -def FMULST0r : FPST0rInst <0xC8, (ops RST:$op), - "fmul $op">; -def FMULrST0 : FPrST0Inst <0xC8, (ops RST:$op), - "fmul {%ST(0), $op|$op, %ST(0)}">; -def FMULPrST0 : FPrST0PInst<0xC8, (ops RST:$op), - "fmulp $op">; - -def FDIVRST0r : FPST0rInst <0xF8, (ops RST:$op), - "fdivr $op">; -def FDIVrST0 : FPrST0Inst <0xF8, (ops RST:$op), - "fdiv{r} {%ST(0), $op|$op, %ST(0)}">; -def FDIVPrST0 : FPrST0PInst<0xF8, (ops RST:$op), - "fdiv{r}p $op">; - -def FDIVST0r : FPST0rInst <0xF0, (ops RST:$op), // ST(0) = ST(0) / ST(i) - "fdiv $op">; -def FDIVRrST0 : FPrST0Inst <0xF0, (ops RST:$op), // ST(i) = ST(0) / ST(i) - "fdiv{|r} {%ST(0), $op|$op, %ST(0)}">; -def FDIVRPrST0 : FPrST0PInst<0xF0, (ops RST:$op), // ST(i) = ST(0) / ST(i), pop - "fdiv{|r}p $op">; - -// Floating point compares -def FUCOMr : FPI<0xE0, AddRegFrm, CompareFP, // FPSW = cmp ST(0) with ST(i) - (ops RST:$reg, variable_ops), - "fucom $reg", []>, DD, Imp<[ST0],[]>; -def FUCOMPr : I<0xE8, AddRegFrm, // FPSW = cmp ST(0) with ST(i), pop - (ops RST:$reg, variable_ops), - "fucomp $reg", []>, DD, Imp<[ST0],[]>; -def FUCOMPPr : I<0xE9, RawFrm, // cmp ST(0) with ST(1), pop, pop - (ops variable_ops), - "fucompp", []>, DA, Imp<[ST0],[]>; - -def FUCOMIr : FPI<0xE8, AddRegFrm, CompareFP, // CC = cmp ST(0) with ST(i) - (ops RST:$reg, variable_ops), - "fucomi {$reg, %ST(0)|%ST(0), $reg}", []>, DB, Imp<[ST0],[]>; -def FUCOMIPr : I<0xE8, AddRegFrm, // CC = cmp ST(0) with ST(i), pop - (ops RST:$reg, variable_ops), - "fucomip {$reg, %ST(0)|%ST(0), $reg}", []>, DF, Imp<[ST0],[]>; +def FADDST0r : FPST0rInst <0xC0, "fadd $op">; +def FADDrST0 : FPrST0Inst <0xC0, "fadd {%ST(0), $op|$op, %ST(0)}">; +def FADDPrST0 : FPrST0PInst<0xC0, "faddp $op">; +def FSUBRST0r : FPST0rInst <0xE8, "fsubr $op">; +def FSUBrST0 : FPrST0Inst <0xE8, "fsub{r} {%ST(0), $op|$op, %ST(0)}">; +def FSUBPrST0 : FPrST0PInst<0xE8, "fsub{r}p $op">; +def FSUBST0r : FPST0rInst <0xE0, "fsub $op">; +def FSUBRrST0 : FPrST0Inst <0xE0, "fsub{|r} {%ST(0), $op|$op, %ST(0)}">; +def FSUBRPrST0 : FPrST0PInst<0xE0, "fsub{|r}p $op">; +def FMULST0r : FPST0rInst <0xC8, "fmul $op">; +def FMULrST0 : FPrST0Inst <0xC8, "fmul {%ST(0), $op|$op, %ST(0)}">; +def FMULPrST0 : FPrST0PInst<0xC8, "fmulp $op">; +def FDIVRST0r : FPST0rInst <0xF8, "fdivr $op">; +def FDIVrST0 : FPrST0Inst <0xF8, "fdiv{r} {%ST(0), $op|$op, %ST(0)}">; +def FDIVPrST0 : FPrST0PInst<0xF8, "fdiv{r}p $op">; +def FDIVST0r : FPST0rInst <0xF0, "fdiv $op">; +def FDIVRrST0 : FPrST0Inst <0xF0, "fdiv{|r} {%ST(0), $op|$op, %ST(0)}">; +def FDIVRPrST0 : FPrST0PInst<0xF0, "fdiv{|r}p $op">; + +// Floating point compares. +def FpUCOMr : FpI<(ops RST:$lhs, RST:$rhs), CompareFP, + []>; // FPSW = cmp ST(0) with ST(i) +def FpUCOMIr : FpI<(ops RST:$lhs, RST:$rhs), CompareFP, + []>; // CC = cmp ST(0) with ST(i) + +def FUCOMr : FPI<0xE0, AddRegFrm, // FPSW = cmp ST(0) with ST(i) + (ops RST:$reg), + "fucom $reg">, DD, Imp<[ST0],[]>; +def FUCOMPr : FPI<0xE8, AddRegFrm, // FPSW = cmp ST(0) with ST(i), pop + (ops RST:$reg), + "fucomp $reg">, DD, Imp<[ST0],[]>; +def FUCOMPPr : FPI<0xE9, RawFrm, // cmp ST(0) with ST(1), pop, pop + (ops), + "fucompp">, DA, Imp<[ST0],[]>; + +def FUCOMIr : FPI<0xE8, AddRegFrm, // CC = cmp ST(0) with ST(i) + (ops RST:$reg), + "fucomi {$reg, %ST(0)|%ST(0), $reg}">, DB, Imp<[ST0],[]>; +def FUCOMIPr : FPI<0xE8, AddRegFrm, // CC = cmp ST(0) with ST(i), pop + (ops RST:$reg), + "fucomip {$reg, %ST(0)|%ST(0), $reg}">, DF, Imp<[ST0],[]>; -// Floating point flag ops +// Floating point flag ops. def FNSTSW8r : I<0xE0, RawFrm, // AX = fp flags (ops), "fnstsw", []>, DF, Imp<[],[AX]>; Index: llvm/lib/Target/X86/X86RegisterInfo.cpp diff -u llvm/lib/Target/X86/X86RegisterInfo.cpp:1.112 llvm/lib/Target/X86/X86RegisterInfo.cpp:1.113 --- llvm/lib/Target/X86/X86RegisterInfo.cpp:1.112 Fri Oct 14 17:06:00 2005 +++ llvm/lib/Target/X86/X86RegisterInfo.cpp Wed Dec 21 01:47:04 2005 @@ -56,7 +56,7 @@ } else if (RC == &X86::R16RegClass) { Opc = X86::MOV16mr; } else if (RC == &X86::RFPRegClass || RC == &X86::RSTRegClass) { - Opc = X86::FST64m; + Opc = X86::FpST64m; } else if (RC == &X86::V4F4RegClass) { Opc = X86::MOVSSmr; } else if (RC == &X86::V2F8RegClass) { @@ -80,7 +80,7 @@ } else if (RC == &X86::R16RegClass) { Opc = X86::MOV16rm; } else if (RC == &X86::RFPRegClass || RC == &X86::RSTRegClass) { - Opc = X86::FLD64m; + Opc = X86::FpLD64m; } else if (RC == &X86::V4F4RegClass) { Opc = X86::MOVSSrm; } else if (RC == &X86::V2F8RegClass) { @@ -123,8 +123,7 @@ case X86::MOV8rm: case X86::MOV16rm: case X86::MOV32rm: - case X86::FLD64m: - case X86::FLD80m: + case X86::FpLD64m: case X86::MOVSSrm: case X86::MOVSDrm: if (MI->getOperand(1).isFrameIndex() && MI->getOperand(2).isImmediate() && From lattner at cs.uiuc.edu Wed Dec 21 01:50:37 2005 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Wed, 21 Dec 2005 01:50:37 -0600 Subject: [llvm-commits] CVS: llvm/lib/Target/X86/X86InstrInfo.td Message-ID: <200512210750.BAA08970@zion.cs.uiuc.edu> Changes in directory llvm/lib/Target/X86: X86InstrInfo.td updated: 1.178 -> 1.179 --- Log message: This was meant to go in --- Diffs of the changes: (+1 -1) X86InstrInfo.td | 2 +- 1 files changed, 1 insertion(+), 1 deletion(-) Index: llvm/lib/Target/X86/X86InstrInfo.td diff -u llvm/lib/Target/X86/X86InstrInfo.td:1.178 llvm/lib/Target/X86/X86InstrInfo.td:1.179 --- llvm/lib/Target/X86/X86InstrInfo.td:1.178 Wed Dec 21 01:47:04 2005 +++ llvm/lib/Target/X86/X86InstrInfo.td Wed Dec 21 01:50:26 2005 @@ -2200,7 +2200,7 @@ //===----------------------------------------------------------------------===// -// Stack-based Floating point support +// Floating Point Stack Support //===----------------------------------------------------------------------===// // Floating point support. All FP Stack operations are represented with two From lattner at cs.uiuc.edu Wed Dec 21 10:22:58 2005 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Wed, 21 Dec 2005 10:22:58 -0600 Subject: [llvm-commits] CVS: llvm/lib/Target/TargetSelectionDAG.td Message-ID: <200512211622.KAA08233@zion.cs.uiuc.edu> Changes in directory llvm/lib/Target: TargetSelectionDAG.td updated: 1.32 -> 1.33 --- Log message: add some nodes, forgot to commit this last night :( --- Diffs of the changes: (+2 -0) TargetSelectionDAG.td | 2 ++ 1 files changed, 2 insertions(+) Index: llvm/lib/Target/TargetSelectionDAG.td diff -u llvm/lib/Target/TargetSelectionDAG.td:1.32 llvm/lib/Target/TargetSelectionDAG.td:1.33 --- llvm/lib/Target/TargetSelectionDAG.td:1.32 Tue Dec 20 01:38:38 2005 +++ llvm/lib/Target/TargetSelectionDAG.td Wed Dec 21 10:22:46 2005 @@ -242,6 +242,8 @@ def fabs : SDNode<"ISD::FABS" , SDTFPUnaryOp>; def fneg : SDNode<"ISD::FNEG" , SDTFPUnaryOp>; def fsqrt : SDNode<"ISD::FSQRT" , SDTFPUnaryOp>; +def fsin : SDNode<"ISD::FSIN" , SDTFPUnaryOp>; +def fcos : SDNode<"ISD::FCOS" , SDTFPUnaryOp>; def fround : SDNode<"ISD::FP_ROUND" , SDTFPRoundOp>; def fextend : SDNode<"ISD::FP_EXTEND" , SDTFPExtendOp>; From lattner at cs.uiuc.edu Wed Dec 21 11:52:55 2005 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Wed, 21 Dec 2005 11:52:55 -0600 Subject: [llvm-commits] CVS: llvm/test/Regression/Assembler/2005-12-21-ZeroInitVector.ll Message-ID: <200512211752.LAA05932@zion.cs.uiuc.edu> Changes in directory llvm/test/Regression/Assembler: 2005-12-21-ZeroInitVector.ll added (r1.1) --- Log message: new testcase --- Diffs of the changes: (+5 -0) 2005-12-21-ZeroInitVector.ll | 5 +++++ 1 files changed, 5 insertions(+) Index: llvm/test/Regression/Assembler/2005-12-21-ZeroInitVector.ll diff -c /dev/null llvm/test/Regression/Assembler/2005-12-21-ZeroInitVector.ll:1.1 *** /dev/null Wed Dec 21 11:52:53 2005 --- llvm/test/Regression/Assembler/2005-12-21-ZeroInitVector.ll Wed Dec 21 11:52:42 2005 *************** *** 0 **** --- 1,5 ---- + ; RUN: llvm-as < %s > /dev/null + + < 4 x int> %foo() { + ret <4 x int> zeroinitializer + } From lattner at cs.uiuc.edu Wed Dec 21 11:53:14 2005 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Wed, 21 Dec 2005 11:53:14 -0600 Subject: [llvm-commits] CVS: llvm/lib/AsmParser/llvmAsmParser.y ParserInternals.h Message-ID: <200512211753.LAA05979@zion.cs.uiuc.edu> Changes in directory llvm/lib/AsmParser: llvmAsmParser.y updated: 1.239 -> 1.240 ParserInternals.h updated: 1.41 -> 1.42 --- Log message: Implement Regression/Assembler/2005-12-21-ZeroInitVector.ll --- Diffs of the changes: (+13 -1) ParserInternals.h | 8 +++++++- llvmAsmParser.y | 6 ++++++ 2 files changed, 13 insertions(+), 1 deletion(-) Index: llvm/lib/AsmParser/llvmAsmParser.y diff -u llvm/lib/AsmParser/llvmAsmParser.y:1.239 llvm/lib/AsmParser/llvmAsmParser.y:1.240 --- llvm/lib/AsmParser/llvmAsmParser.y:1.239 Sat Nov 12 12:21:21 2005 +++ llvm/lib/AsmParser/llvmAsmParser.y Wed Dec 21 11:53:02 2005 @@ -303,6 +303,9 @@ case ValID::ConstUndefVal: // Is it an undef value? return UndefValue::get(Ty); + case ValID::ConstZeroVal: // Is it a zero value? + return Constant::getNullValue(Ty); + case ValID::ConstantVal: // Fully resolved constant? if (D.ConstantValue->getType() != Ty) ThrowException("Constant expression type different from required type!"); @@ -1816,6 +1819,9 @@ | UNDEF { $$ = ValID::createUndef(); } + | ZEROINITIALIZER { // A vector zero constant. + $$ = ValID::createZeroInit(); + } | '<' ConstVector '>' { // Nonempty unsized packed vector const Type *ETy = (*$2)[0]->getType(); int NumElements = $2->size(); Index: llvm/lib/AsmParser/ParserInternals.h diff -u llvm/lib/AsmParser/ParserInternals.h:1.41 llvm/lib/AsmParser/ParserInternals.h:1.42 --- llvm/lib/AsmParser/ParserInternals.h:1.41 Thu May 19 22:25:47 2005 +++ llvm/lib/AsmParser/ParserInternals.h Wed Dec 21 11:53:02 2005 @@ -82,7 +82,7 @@ struct ValID { enum { NumberVal, NameVal, ConstSIntVal, ConstUIntVal, ConstFPVal, ConstNullVal, - ConstUndefVal, ConstantVal, + ConstUndefVal, ConstZeroVal, ConstantVal, } Type; union { @@ -122,6 +122,10 @@ ValID D; D.Type = ConstUndefVal; return D; } + static ValID createZeroInit() { + ValID D; D.Type = ConstZeroVal; return D; + } + static ValID create(Constant *Val) { ValID D; D.Type = ConstantVal; D.ConstantValue = Val; return D; } @@ -145,6 +149,7 @@ case ConstFPVal : return ftostr(ConstPoolFP); case ConstNullVal : return "null"; case ConstUndefVal : return "undef"; + case ConstZeroVal : return "zeroinitializer"; case ConstUIntVal : case ConstSIntVal : return std::string("%") + itostr(ConstPool64); case ConstantVal: @@ -168,6 +173,7 @@ case ConstFPVal: return ConstPoolFP < V.ConstPoolFP; case ConstNullVal: return false; case ConstUndefVal: return false; + case ConstZeroVal: return false; case ConstantVal: return ConstantValue < V.ConstantValue; default: assert(0 && "Unknown value type!"); return false; } From lattner at cs.uiuc.edu Wed Dec 21 11:53:36 2005 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Wed, 21 Dec 2005 11:53:36 -0600 Subject: [llvm-commits] CVS: llvm/lib/AsmParser/llvmAsmParser.cpp Message-ID: <200512211753.LAA06027@zion.cs.uiuc.edu> Changes in directory llvm/lib/AsmParser: llvmAsmParser.cpp updated: 1.25 -> 1.26 --- Log message: regenerate --- Diffs of the changes: (+632 -620) llvmAsmParser.cpp | 1235 +++++++++++++++++++++++++++--------------------------- 1 files changed, 632 insertions(+), 603 deletions(-) Index: llvm/lib/AsmParser/llvmAsmParser.cpp diff -u llvm/lib/AsmParser/llvmAsmParser.cpp:1.25 llvm/lib/AsmParser/llvmAsmParser.cpp:1.26 --- llvm/lib/AsmParser/llvmAsmParser.cpp:1.25 Sat Nov 12 12:22:38 2005 +++ llvm/lib/AsmParser/llvmAsmParser.cpp Wed Dec 21 11:53:23 2005 @@ -1,5 +1,5 @@ -/* A Bison parser, made from /Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y +/* A Bison parser, made from /Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y by GNU Bison version 1.28 */ #define YYBISON 1 /* Identify Bison output. */ @@ -105,7 +105,7 @@ #define VAARG_old 348 #define VANEXT_old 349 -#line 14 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +#line 14 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" #include "ParserInternals.h" #include "llvm/CallingConv.h" @@ -398,6 +398,9 @@ case ValID::ConstUndefVal: // Is it an undef value? return UndefValue::get(Ty); + case ValID::ConstZeroVal: // Is it a zero value? + return Constant::getNullValue(Ty); + case ValID::ConstantVal: // Fully resolved constant? if (D.ConstantValue->getType() != Ty) ThrowException("Constant expression type different from required type!"); @@ -961,7 +964,7 @@ } -#line 870 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +#line 873 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" typedef union { llvm::Module *ModuleVal; llvm::Function *FunctionVal; @@ -1011,7 +1014,7 @@ -#define YYFINAL 443 +#define YYFINAL 444 #define YYFLAG -32768 #define YYNTBASE 110 @@ -1073,13 +1076,13 @@ 365, 367, 369, 373, 377, 381, 385, 389, 391, 392, 394, 396, 398, 399, 402, 406, 408, 410, 414, 416, 417, 426, 428, 430, 434, 436, 438, 441, 442, 446, - 448, 450, 452, 454, 456, 458, 460, 464, 466, 468, - 470, 472, 474, 477, 480, 483, 487, 490, 491, 493, - 496, 499, 503, 513, 523, 532, 546, 548, 550, 557, - 563, 566, 573, 581, 583, 587, 589, 590, 593, 595, - 601, 607, 613, 616, 621, 626, 633, 638, 643, 648, - 651, 659, 661, 664, 665, 667, 668, 672, 679, 683, - 690, 693, 698, 705 + 448, 450, 452, 454, 456, 458, 460, 462, 466, 468, + 470, 472, 474, 476, 479, 482, 485, 489, 492, 493, + 495, 498, 501, 505, 515, 525, 534, 548, 550, 552, + 559, 565, 568, 575, 583, 585, 589, 591, 592, 595, + 597, 603, 609, 615, 618, 623, 628, 635, 640, 645, + 650, 653, 661, 663, 666, 667, 669, 670, 674, 681, + 685, 692, 695, 700, 707 }; static const short yyrhs[] = { 5, @@ -1128,61 +1131,62 @@ 153, 100, 126, 123, 0, 29, 0, 106, 0, 121, 154, 155, 0, 30, 0, 107, 0, 165, 157, 0, 0, 31, 160, 154, 0, 3, 0, 4, 0, 7, - 0, 27, 0, 28, 0, 38, 0, 39, 0, 104, - 138, 105, 0, 137, 0, 110, 0, 149, 0, 162, - 0, 161, 0, 131, 163, 0, 165, 166, 0, 156, - 166, 0, 167, 120, 168, 0, 167, 170, 0, 0, - 23, 0, 62, 164, 0, 62, 8, 0, 63, 21, - 163, 0, 63, 9, 163, 97, 21, 163, 97, 21, - 163, 0, 64, 118, 163, 97, 21, 163, 101, 169, - 103, 0, 64, 118, 163, 97, 21, 163, 101, 103, - 0, 65, 122, 129, 163, 99, 173, 100, 36, 21, - 163, 66, 21, 163, 0, 66, 0, 67, 0, 169, - 118, 161, 97, 21, 163, 0, 118, 161, 97, 21, - 163, 0, 120, 175, 0, 131, 101, 163, 97, 163, - 103, 0, 171, 97, 101, 163, 97, 163, 103, 0, - 164, 0, 172, 97, 164, 0, 172, 0, 0, 57, - 56, 0, 56, 0, 112, 131, 163, 97, 163, 0, - 113, 131, 163, 97, 163, 0, 114, 131, 163, 97, - 163, 0, 46, 164, 0, 115, 164, 97, 164, 0, - 89, 164, 36, 131, 0, 90, 164, 97, 164, 97, - 164, 0, 93, 164, 97, 131, 0, 94, 164, 97, - 131, 0, 95, 164, 97, 131, 0, 88, 171, 0, - 174, 122, 129, 163, 99, 173, 100, 0, 178, 0, - 97, 172, 0, 0, 35, 0, 0, 82, 131, 124, - 0, 82, 131, 97, 15, 163, 124, 0, 83, 131, - 124, 0, 83, 131, 97, 15, 163, 124, 0, 84, - 164, 0, 177, 85, 131, 163, 0, 177, 86, 164, - 97, 131, 163, 0, 87, 131, 163, 176, 0 + 0, 27, 0, 28, 0, 38, 0, 39, 0, 26, + 0, 104, 138, 105, 0, 137, 0, 110, 0, 149, + 0, 162, 0, 161, 0, 131, 163, 0, 165, 166, + 0, 156, 166, 0, 167, 120, 168, 0, 167, 170, + 0, 0, 23, 0, 62, 164, 0, 62, 8, 0, + 63, 21, 163, 0, 63, 9, 163, 97, 21, 163, + 97, 21, 163, 0, 64, 118, 163, 97, 21, 163, + 101, 169, 103, 0, 64, 118, 163, 97, 21, 163, + 101, 103, 0, 65, 122, 129, 163, 99, 173, 100, + 36, 21, 163, 66, 21, 163, 0, 66, 0, 67, + 0, 169, 118, 161, 97, 21, 163, 0, 118, 161, + 97, 21, 163, 0, 120, 175, 0, 131, 101, 163, + 97, 163, 103, 0, 171, 97, 101, 163, 97, 163, + 103, 0, 164, 0, 172, 97, 164, 0, 172, 0, + 0, 57, 56, 0, 56, 0, 112, 131, 163, 97, + 163, 0, 113, 131, 163, 97, 163, 0, 114, 131, + 163, 97, 163, 0, 46, 164, 0, 115, 164, 97, + 164, 0, 89, 164, 36, 131, 0, 90, 164, 97, + 164, 97, 164, 0, 93, 164, 97, 131, 0, 94, + 164, 97, 131, 0, 95, 164, 97, 131, 0, 88, + 171, 0, 174, 122, 129, 163, 99, 173, 100, 0, + 178, 0, 97, 172, 0, 0, 35, 0, 0, 82, + 131, 124, 0, 82, 131, 97, 15, 163, 124, 0, + 83, 131, 124, 0, 83, 131, 97, 15, 163, 124, + 0, 84, 164, 0, 177, 85, 131, 163, 0, 177, + 86, 164, 97, 131, 163, 0, 87, 131, 163, 176, + 0 }; #endif #if YYDEBUG != 0 static const short yyrline[] = { 0, - 988, 989, 996, 997, 1006, 1006, 1006, 1006, 1006, 1007, - 1007, 1007, 1008, 1008, 1008, 1008, 1008, 1008, 1010, 1010, - 1014, 1014, 1014, 1014, 1015, 1015, 1015, 1015, 1016, 1016, - 1017, 1017, 1020, 1023, 1027, 1027, 1028, 1029, 1030, 1033, - 1033, 1034, 1035, 1036, 1045, 1045, 1051, 1051, 1059, 1066, - 1066, 1072, 1072, 1074, 1078, 1089, 1089, 1090, 1090, 1092, - 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1102, 1102, 1102, - 1102, 1102, 1102, 1103, 1106, 1109, 1115, 1122, 1134, 1138, - 1149, 1158, 1161, 1169, 1173, 1178, 1179, 1182, 1185, 1195, - 1220, 1233, 1261, 1286, 1306, 1318, 1327, 1331, 1390, 1396, - 1404, 1409, 1414, 1417, 1420, 1427, 1437, 1468, 1475, 1496, - 1503, 1508, 1518, 1521, 1528, 1528, 1538, 1545, 1549, 1552, - 1555, 1568, 1588, 1590, 1593, 1596, 1600, 1603, 1605, 1607, - 1612, 1613, 1615, 1618, 1626, 1631, 1633, 1637, 1641, 1649, - 1649, 1650, 1650, 1652, 1658, 1663, 1669, 1672, 1677, 1681, - 1685, 1771, 1771, 1773, 1781, 1781, 1783, 1787, 1787, 1796, - 1799, 1802, 1805, 1808, 1811, 1814, 1817, 1841, 1848, 1851, - 1856, 1856, 1862, 1866, 1869, 1877, 1886, 1890, 1900, 1911, - 1914, 1917, 1920, 1923, 1937, 1941, 1994, 1997, 2003, 2011, - 2021, 2028, 2033, 2040, 2044, 2050, 2050, 2052, 2055, 2061, - 2073, 2081, 2091, 2103, 2110, 2117, 2124, 2129, 2148, 2170, - 2184, 2241, 2247, 2249, 2253, 2256, 2262, 2266, 2270, 2274, - 2278, 2285, 2295, 2308 + 991, 992, 999, 1000, 1009, 1009, 1009, 1009, 1009, 1010, + 1010, 1010, 1011, 1011, 1011, 1011, 1011, 1011, 1013, 1013, + 1017, 1017, 1017, 1017, 1018, 1018, 1018, 1018, 1019, 1019, + 1020, 1020, 1023, 1026, 1030, 1030, 1031, 1032, 1033, 1036, + 1036, 1037, 1038, 1039, 1048, 1048, 1054, 1054, 1062, 1069, + 1069, 1075, 1075, 1077, 1081, 1094, 1094, 1095, 1095, 1097, + 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1107, 1107, 1107, + 1107, 1107, 1107, 1108, 1111, 1114, 1120, 1127, 1139, 1143, + 1154, 1163, 1166, 1174, 1178, 1183, 1184, 1187, 1190, 1200, + 1225, 1238, 1266, 1291, 1311, 1323, 1332, 1336, 1395, 1401, + 1409, 1414, 1419, 1422, 1425, 1432, 1442, 1473, 1480, 1501, + 1508, 1513, 1523, 1526, 1533, 1533, 1543, 1550, 1554, 1557, + 1560, 1573, 1593, 1595, 1598, 1601, 1605, 1608, 1610, 1612, + 1617, 1618, 1620, 1623, 1631, 1636, 1638, 1642, 1646, 1654, + 1654, 1655, 1655, 1657, 1663, 1668, 1674, 1677, 1682, 1686, + 1690, 1776, 1776, 1778, 1786, 1786, 1788, 1792, 1792, 1801, + 1804, 1807, 1810, 1813, 1816, 1819, 1822, 1825, 1849, 1856, + 1859, 1864, 1864, 1870, 1874, 1877, 1885, 1894, 1898, 1908, + 1919, 1922, 1925, 1928, 1931, 1945, 1949, 2002, 2005, 2011, + 2019, 2029, 2036, 2041, 2048, 2052, 2058, 2058, 2060, 2063, + 2069, 2081, 2089, 2099, 2111, 2118, 2125, 2132, 2137, 2156, + 2178, 2192, 2249, 2255, 2257, 2261, 2264, 2270, 2274, 2278, + 2282, 2286, 2293, 2303, 2316 }; #endif @@ -1233,13 +1237,13 @@ 145, 145, 146, 146, 146, 147, 148, 148, 148, 149, 149, 150, 150, 151, 152, 152, 153, 153, 153, 153, 154, 155, 155, 156, 157, 157, 158, 160, 159, 161, - 161, 161, 161, 161, 161, 161, 161, 161, 162, 162, - 163, 163, 164, 165, 165, 166, 167, 167, 167, 168, - 168, 168, 168, 168, 168, 168, 168, 168, 169, 169, - 170, 171, 171, 172, 172, 173, 173, 174, 174, 175, + 161, 161, 161, 161, 161, 161, 161, 161, 161, 162, + 162, 163, 163, 164, 165, 165, 166, 167, 167, 167, + 168, 168, 168, 168, 168, 168, 168, 168, 168, 169, + 169, 170, 171, 171, 172, 172, 173, 173, 174, 174, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, - 175, 175, 176, 176, 177, 177, 178, 178, 178, 178, - 178, 178, 178, 178 + 175, 175, 175, 176, 176, 177, 177, 178, 178, 178, + 178, 178, 178, 178, 178 }; static const short yyr2[] = { 0, @@ -1259,385 +1263,385 @@ 1, 1, 3, 3, 3, 3, 3, 1, 0, 1, 1, 1, 0, 2, 3, 1, 1, 3, 1, 0, 8, 1, 1, 3, 1, 1, 2, 0, 3, 1, - 1, 1, 1, 1, 1, 1, 3, 1, 1, 1, - 1, 1, 2, 2, 2, 3, 2, 0, 1, 2, - 2, 3, 9, 9, 8, 13, 1, 1, 6, 5, - 2, 6, 7, 1, 3, 1, 0, 2, 1, 5, - 5, 5, 2, 4, 4, 6, 4, 4, 4, 2, - 7, 1, 2, 0, 1, 0, 3, 6, 3, 6, - 2, 4, 6, 4 + 1, 1, 1, 1, 1, 1, 1, 3, 1, 1, + 1, 1, 1, 2, 2, 2, 3, 2, 0, 1, + 2, 2, 3, 9, 9, 8, 13, 1, 1, 6, + 5, 2, 6, 7, 1, 3, 1, 0, 2, 1, + 5, 5, 5, 2, 4, 4, 6, 4, 4, 4, + 2, 7, 1, 2, 0, 1, 0, 3, 6, 3, + 6, 2, 4, 6, 4 }; static const short yydefact[] = { 130, - 39, 121, 120, 158, 35, 36, 37, 38, 40, 178, - 118, 119, 178, 140, 141, 0, 0, 39, 0, 123, - 40, 0, 41, 42, 43, 0, 0, 179, 175, 34, - 155, 156, 157, 174, 0, 0, 0, 128, 0, 0, + 39, 121, 120, 158, 35, 36, 37, 38, 40, 179, + 118, 119, 179, 140, 141, 0, 0, 39, 0, 123, + 40, 0, 41, 42, 43, 0, 0, 180, 176, 34, + 155, 156, 157, 175, 0, 0, 0, 128, 0, 0, 0, 0, 33, 159, 44, 1, 2, 57, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, - 73, 74, 0, 0, 0, 0, 169, 0, 0, 56, - 75, 60, 170, 76, 152, 153, 154, 216, 177, 0, + 73, 74, 0, 0, 0, 0, 170, 0, 0, 56, + 75, 60, 171, 76, 152, 153, 154, 217, 178, 0, 0, 0, 139, 129, 122, 115, 116, 0, 0, 77, - 0, 0, 59, 82, 84, 0, 0, 89, 83, 215, - 0, 199, 0, 0, 0, 0, 40, 187, 188, 5, + 0, 0, 59, 82, 84, 0, 0, 89, 83, 216, + 0, 200, 0, 0, 0, 0, 40, 188, 189, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 0, 0, 0, 0, 0, 0, 0, - 19, 20, 0, 0, 0, 0, 0, 0, 0, 176, - 40, 191, 0, 212, 135, 132, 131, 133, 134, 138, + 19, 20, 0, 0, 0, 0, 0, 0, 0, 177, + 40, 192, 0, 213, 135, 132, 131, 133, 134, 138, 0, 126, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 0, 0, 0, 0, 124, 0, 0, - 0, 81, 150, 88, 86, 0, 0, 203, 198, 181, - 180, 0, 0, 24, 28, 23, 27, 22, 26, 21, - 25, 29, 30, 0, 0, 47, 47, 221, 0, 0, - 210, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 81, 150, 88, 86, 0, 0, 204, 199, 182, + 181, 0, 0, 24, 28, 23, 27, 22, 26, 21, + 25, 29, 30, 0, 0, 47, 47, 222, 0, 0, + 211, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 136, 52, 103, 104, 3, 4, 101, 102, 105, 100, 96, 97, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 99, 98, 52, 58, 58, 85, 149, 143, 146, 147, 0, 0, 78, - 160, 161, 162, 163, 164, 165, 166, 0, 168, 172, - 171, 173, 0, 182, 0, 0, 0, 217, 0, 219, - 214, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 137, 0, 127, 0, 0, - 0, 91, 114, 0, 0, 95, 0, 92, 0, 0, - 0, 0, 125, 79, 80, 142, 144, 0, 50, 87, - 0, 0, 0, 0, 0, 0, 0, 0, 224, 0, - 0, 205, 0, 207, 208, 209, 0, 0, 0, 204, - 0, 222, 0, 0, 0, 54, 52, 214, 0, 0, - 0, 90, 93, 94, 0, 0, 0, 0, 148, 145, - 51, 45, 167, 0, 0, 197, 47, 48, 47, 194, - 213, 0, 0, 0, 200, 201, 202, 197, 0, 49, - 55, 53, 0, 0, 0, 113, 0, 0, 0, 0, - 0, 151, 0, 0, 196, 0, 0, 218, 220, 0, - 0, 0, 206, 0, 223, 107, 0, 0, 0, 0, - 0, 0, 46, 0, 0, 0, 195, 192, 0, 211, - 106, 0, 109, 110, 111, 112, 0, 185, 0, 0, - 0, 193, 0, 183, 0, 184, 0, 0, 108, 0, - 0, 0, 0, 0, 0, 190, 0, 0, 189, 186, - 0, 0, 0 + 160, 161, 162, 167, 163, 164, 165, 166, 0, 169, + 173, 172, 174, 0, 183, 0, 0, 0, 218, 0, + 220, 215, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 137, 0, 127, 0, + 0, 0, 91, 114, 0, 0, 95, 0, 92, 0, + 0, 0, 0, 125, 79, 80, 142, 144, 0, 50, + 87, 0, 0, 0, 0, 0, 0, 0, 0, 225, + 0, 0, 206, 0, 208, 209, 210, 0, 0, 0, + 205, 0, 223, 0, 0, 0, 54, 52, 215, 0, + 0, 0, 90, 93, 94, 0, 0, 0, 0, 148, + 145, 51, 45, 168, 0, 0, 198, 47, 48, 47, + 195, 214, 0, 0, 0, 201, 202, 203, 198, 0, + 49, 55, 53, 0, 0, 0, 113, 0, 0, 0, + 0, 0, 151, 0, 0, 197, 0, 0, 219, 221, + 0, 0, 0, 207, 0, 224, 107, 0, 0, 0, + 0, 0, 0, 46, 0, 0, 0, 196, 193, 0, + 212, 106, 0, 109, 110, 111, 112, 0, 186, 0, + 0, 0, 194, 0, 184, 0, 185, 0, 0, 108, + 0, 0, 0, 0, 0, 0, 191, 0, 0, 190, + 187, 0, 0, 0 }; static const short yydefgoto[] = { 67, 221, 234, 235, 236, 237, 164, 165, 194, 166, 18, - 9, 26, 382, 268, 336, 352, 288, 337, 68, 69, - 167, 71, 72, 96, 176, 293, 259, 294, 88, 441, - 1, 2, 240, 216, 148, 38, 84, 151, 73, 307, + 9, 26, 383, 269, 337, 353, 289, 338, 68, 69, + 167, 71, 72, 96, 176, 294, 260, 295, 88, 442, + 1, 2, 240, 216, 148, 38, 84, 151, 73, 308, 246, 247, 248, 27, 77, 10, 33, 11, 12, 21, - 260, 74, 262, 360, 13, 29, 30, 140, 420, 79, - 201, 385, 386, 141, 142, 319, 143, 144 + 261, 74, 263, 361, 13, 29, 30, 140, 421, 79, + 201, 386, 387, 141, 142, 320, 143, 144 }; static const short yypact[] = {-32768, - 43, 303,-32768,-32768,-32768,-32768,-32768,-32768, 71, -3, --32768,-32768, 34,-32768,-32768, 86, -30, 47, -19,-32768, - 71, 76,-32768,-32768,-32768, 994, -25,-32768,-32768, -6, --32768,-32768,-32768,-32768, -14, 26, 37,-32768, 49, 994, - -1, -1,-32768,-32768,-32768,-32768,-32768, -4,-32768,-32768, + 43, 304,-32768,-32768,-32768,-32768,-32768,-32768, 94, -17, +-32768,-32768, -11,-32768,-32768, 72, -58, 47, -35,-32768, + 94, 66,-32768,-32768,-32768, 995, -25,-32768,-32768, 111, +-32768,-32768,-32768,-32768, -3, 10, 23,-32768, 35, 995, + 112, 112,-32768,-32768,-32768,-32768,-32768, 42,-32768,-32768, -32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768, --32768,-32768, 134, 153, 157, 511,-32768, -6, 63,-32768, --32768, -16,-32768,-32768,-32768,-32768,-32768, 1109,-32768, 139, - -5, 163, 144,-32768,-32768,-32768,-32768, 1014, 1058,-32768, - 68, 69,-32768,-32768, -16, -90, 73, 751,-32768,-32768, - 1014,-32768, 120, 1116, 51, 186, 71,-32768,-32768,-32768, +-32768,-32768, 134, 142, 146, 512,-32768, 111, 58,-32768, +-32768, -39,-32768,-32768,-32768,-32768,-32768, 1110,-32768, 139, + 27, 163, 149,-32768,-32768,-32768,-32768, 1015, 1059,-32768, + 79, 80,-32768,-32768, -39, -87, 85, 752,-32768,-32768, + 1015,-32768, 133, 1117, 50, 115, 94,-32768,-32768,-32768, -32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768, --32768,-32768,-32768, 1014, 1014, 1014, 1014, 1014, 1014, 1014, --32768,-32768, 1014, 1014, 1014, 1014, 1014, 1014, 1014,-32768, - 71,-32768, -15,-32768,-32768,-32768,-32768,-32768,-32768,-32768, - 22,-32768, 116, 142, 173, 145, 174, 149, 175, 151, - 176, 177, 181, 156, 179, 183, 409,-32768, 1014, 1014, - 1014,-32768, 789,-32768, 84, 91, 575,-32768,-32768, -4, --32768, 575, 575,-32768,-32768,-32768,-32768,-32768,-32768,-32768, --32768,-32768,-32768, 575, 994, 95, 96,-32768, 575, 93, - 107, 172, 112, 113, 114, 115, 575, 575, 575, 117, - 994, 1014, 1014, 189,-32768, 122,-32768,-32768,-32768,-32768, --32768,-32768,-32768,-32768,-32768,-32768, 123, 125, 126, 853, - 1058, 531, 202, 128, 129, 131, 132,-32768,-32768, 122, - 20, -12, -16,-32768, -6,-32768, 136, 135, 891,-32768, --32768,-32768,-32768,-32768,-32768,-32768,-32768, 1058,-32768,-32768, --32768,-32768, 137,-32768, 141, 575, -9,-32768, 4,-32768, - 146, 575, 138, 1014, 1014, 1014, 1014, 1014, 147, 158, - 161, 1014, 575, 575, 162,-32768, 5,-32768, 1058, 1058, - 1058,-32768,-32768, 24, -32,-32768, -28,-32768, 1058, 1058, - 1058, 1058,-32768,-32768,-32768,-32768,-32768, 956, 208,-32768, - 0, 215, 233, 164, 575, 256, 575, 1014,-32768, 165, - 575,-32768, 167,-32768,-32768,-32768, 575, 575, 575,-32768, - 166,-32768, 1014, 237, 262,-32768, 122, 146, 231, 171, - 1058,-32768,-32768,-32768, 178, 180, 182, 184,-32768,-32768, --32768, 216,-32768, 575, 575, 1014, 190,-32768, 190,-32768, - 191, 575, 192, 1014,-32768,-32768,-32768, 1014, 575,-32768, --32768,-32768, 169, 1014, 1058,-32768, 1058, 1058, 1058, 1058, - 269,-32768, 193, 197, 191, 199, 222,-32768,-32768, 1014, - 200, 575,-32768, 205,-32768,-32768, 206, 211, 209, 213, - 214, 217,-32768, 259, 11, 247,-32768,-32768, 221,-32768, --32768, 1058,-32768,-32768,-32768,-32768, 575,-32768, 654, 39, - 281,-32768, 218,-32768, 223,-32768, 654, 575,-32768, 308, - 234, 266, 575, 312, 316,-32768, 575, 575,-32768,-32768, - 339, 340,-32768 +-32768,-32768,-32768, 1015, 1015, 1015, 1015, 1015, 1015, 1015, +-32768,-32768, 1015, 1015, 1015, 1015, 1015, 1015, 1015,-32768, + 94,-32768, 63,-32768,-32768,-32768,-32768,-32768,-32768,-32768, + -20,-32768, 132, 158, 184, 168, 187, 172, 188, 174, + 189, 190, 191, 176, 195, 193, 410,-32768, 1015, 1015, + 1015,-32768, 790,-32768, 97, 95, 576,-32768,-32768, 42, +-32768, 576, 576,-32768,-32768,-32768,-32768,-32768,-32768,-32768, +-32768,-32768,-32768, 576, 995, 104, 105,-32768, 576, 102, + 107, 169, 113, 114, 116, 117, 576, 576, 576, 118, + 995, 1015, 1015, 185,-32768, 125,-32768,-32768,-32768,-32768, +-32768,-32768,-32768,-32768,-32768,-32768, 124, 126, 127, 854, + 1059, 532, 203, 129, 130, 135, 136,-32768,-32768, 125, + -69, -13, -39,-32768, 111,-32768, 141, 131, 892,-32768, +-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768, 1059,-32768, +-32768,-32768,-32768, 143,-32768, 147, 576, -6,-32768, 3, +-32768, 151, 576, 138, 1015, 1015, 1015, 1015, 1015, 157, + 159, 164, 1015, 576, 576, 165,-32768, -19,-32768, 1059, + 1059, 1059,-32768,-32768, 40, -33,-32768, -31,-32768, 1059, + 1059, 1059, 1059,-32768,-32768,-32768,-32768,-32768, 957, 178, +-32768, -32, 212, 215, 144, 576, 251, 576, 1015,-32768, + 166, 576,-32768, 167,-32768,-32768,-32768, 576, 576, 576, +-32768, 161,-32768, 1015, 241, 262,-32768, 125, 151, 231, + 171, 1059,-32768,-32768,-32768, 173, 177, 179, 180,-32768, +-32768,-32768, 217,-32768, 576, 576, 1015, 181,-32768, 181, +-32768, 183, 576, 192, 1015,-32768,-32768,-32768, 1015, 576, +-32768,-32768,-32768, 182, 1015, 1059,-32768, 1059, 1059, 1059, + 1059, 265,-32768, 194, 198, 183, 200, 227,-32768,-32768, + 1015, 201, 576,-32768, 206,-32768,-32768, 207, 213, 209, + 214, 218, 219,-32768, 263, 11, 252,-32768,-32768, 222, +-32768,-32768, 1059,-32768,-32768,-32768,-32768, 576,-32768, 655, + 39, 269,-32768, 221,-32768, 233,-32768, 655, 576,-32768, + 282, 235, 249, 576, 312, 313,-32768, 576, 576,-32768, +-32768, 338, 340,-32768 }; static const short yypgoto[] = {-32768, --32768, 263, 265, 274, 276, -105, -104, -390,-32768, 326, - 342, -78,-32768, -184, 48,-32768, -231,-32768, -37,-32768, - -26,-32768, -54, 264,-32768, -84, 194, -197, 321,-32768, --32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768, 8,-32768, - 60,-32768,-32768, 348,-32768,-32768,-32768,-32768, 368,-32768, - -301, -43, 38, -93,-32768, 358,-32768,-32768,-32768,-32768, --32768, 54, 7,-32768,-32768, 35,-32768,-32768 +-32768, 264, 266, 275, 277, -105, -104, -374,-32768, 311, + 339, -78,-32768, -190, 48,-32768, -223,-32768, -37,-32768, + -26,-32768, -53, 271,-32768, -84, 196, -201, 319,-32768, +-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768, 14,-32768, + 53,-32768,-32768, 343,-32768,-32768,-32768,-32768, 368,-32768, + -323, -43, 38, -93,-32768, 358,-32768,-32768,-32768,-32768, +-32768, 54, 5,-32768,-32768, 33,-32768,-32768 }; -#define YYLAST 1222 +#define YYLAST 1223 static const short yytable[] = { 70, - 192, 193, 85, 75, 168, 315, 171, 178, 303, 19, - 181, 95, 270, 70, 419, 14, 172, 15, 317, 28, - 184, 185, 186, 187, 188, 189, 190, 191, 195, 427, - 86, 87, 198, 295, 297, 202, 203, 19, 334, 204, - 205, 206, -117, 95, 316, 210, 146, 147, 184, 185, - 186, 187, 188, 189, 190, 191, 28, 316, 335, 182, - 311, 152, 211, 31, 341, 39, 40, 3, 341, 212, - 213, 183, 343, 4, 177, 97, 43, 177, 344, 45, - 76, 80, -58, 5, 6, 7, 8, 5, 6, 7, - 8, 99, 305, 41, -59, 99, 341, 196, 197, 177, - 199, 200, 177, 177, 353, 372, 177, 177, 177, 207, - 208, 209, 177, 418, 241, 242, 243, 425, 214, 285, - 341, 81, 304, 239, 215, 431, 342, 99, 22, 23, - 24, 25, 82, 261, 35, 36, 37, 90, 261, 261, - 32, 426, 217, 218, -24, -24, 245, -23, -23, 83, - 261, -22, -22, -21, -21, 261, 91, 266, 219, 220, - 92, 98, 145, 261, 261, 261, 149, 150, 70, 169, - 170, 173, 388, 283, 389, 179, -28, -27, -26, -25, - 249, 323, 222, -31, 70, 284, 177, -32, 330, 223, - 250, 267, 269, 272, 243, 184, 185, 186, 187, 188, - 189, 190, 191, 273, 338, 339, 340, 274, 275, 276, - 277, 278, 286, 282, 345, 346, 347, 348, 287, 263, - 264, 289, 261, 290, 291, 298, 299, 300, 261, 301, - 302, 265, 308, 312, 309, 354, 271, 313, 321, 261, - 261, 334, 318, 327, 279, 280, 281, 322, 177, 324, - 325, 326, 306, 355, 328, 177, 376, 329, 333, 358, - 370, 362, 356, 364, 368, 371, 374, 375, 396, 381, - 393, 261, 403, 261, 377, 316, 378, 261, 379, 417, - 380, 245, 421, 261, 261, 261, 387, 390, 392, 404, - 398, 177, 399, 400, 401, 402, 407, 405, 406, 192, - 193, 428, 408, 314, 410, 411, 369, 412, 413, 320, - 261, 261, 414, 415, 192, 193, 416, 429, 261, 430, - 331, 332, -34, 422, 14, 261, 15, 423, 433, 177, - 434, 435, 437, 4, -34, -34, 438, 177, 442, 443, - 136, 177, 137, -34, -34, -34, -34, 397, 261, -34, - 16, 138, 357, 139, 359, 78, 351, 17, 363, 42, - 238, 175, 89, 177, 365, 366, 367, 350, 44, 20, - 34, 361, 373, 261, 394, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 261, 0, 0, 0, 0, 261, - 0, 383, 384, 261, 261, 0, 0, 0, 0, 391, - 0, 0, 0, 0, 0, 0, 395, 0, 0, 0, - 0, 0, 0, 46, 47, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 409, - 14, 0, 15, 0, 224, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 225, 226, 0, 0, - 0, 0, 0, 0, 424, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 432, 0, 0, 0, 0, - 436, 0, 0, 0, 439, 440, 110, 111, 112, 113, - 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, - 0, 0, 0, 0, 0, 227, 0, 228, 229, 131, - 132, 0, 0, 0, 0, 0, 0, 0, 0, 230, - 0, 0, 231, 0, 232, 46, 47, 233, 93, 49, - 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, - 60, 61, 14, 0, 15, 46, 47, 0, 93, 153, - 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, - 60, 61, 14, 0, 15, 62, 0, 0, 0, 0, + 192, 193, 85, 75, 168, 28, 271, 178, 316, 171, + 181, 28, 95, 70, 335, 19, 304, 318, 31, 172, + 184, 185, 186, 187, 188, 189, 190, 191, 195, 296, + 298, 420, 198, 305, 336, 202, 203, 39, 99, 204, + 205, 206, -117, 19, 95, 210, 428, 317, 184, 185, + 186, 187, 188, 189, 190, 191, 317, 312, 182, -58, + 43, 152, 211, 342, 342, 342, 40, 3, 99, 45, + 183, 344, 354, 4, 177, 345, 214, 177, 146, 147, + 76, 97, 215, 5, 6, 7, 8, 5, 6, 7, + 8, 306, 80, 41, 99, 32, 426, 196, 197, 177, + 199, 200, 177, 177, 432, 81, 177, 177, 177, 207, + 208, 209, 177, 419, 373, 241, 242, 243, 82, 286, + 35, 36, 37, 239, 184, 185, 186, 187, 188, 189, + 190, 191, 14, 262, 15, 83, 342, 90, 262, 262, + -59, 427, 343, 86, 87, 91, 245, 212, 213, 92, + 262, 22, 23, 24, 25, 262, 98, 267, 217, 218, + -24, -24, 145, 262, 262, 262, 149, 389, 70, 390, + -23, -23, 150, 284, -22, -22, -21, -21, 219, 220, + 169, 170, 324, 173, 70, 285, 177, -28, 179, 331, + -27, -26, -25, 249, 250, 243, -31, -32, 222, 223, + 268, 270, 273, 274, 275, 339, 340, 341, 287, 276, + 277, 335, 278, 279, 283, 346, 347, 348, 349, 264, + 265, 288, 290, 262, 291, 292, 299, 300, 301, 262, + 310, 266, 355, 302, 303, 356, 272, 309, 322, 313, + 262, 262, 357, 314, 280, 281, 282, 319, 323, 177, + 325, 326, 327, 328, 359, 329, 177, 377, 307, 369, + 330, 334, 363, 365, 371, 372, 375, 376, 404, 378, + 382, 394, 262, 379, 262, 380, 381, 388, 262, 391, + 317, 397, 245, 418, 262, 262, 262, 422, 393, 429, + 405, 399, 177, 400, 401, 402, 403, 408, 406, 407, + 192, 193, 434, 409, 315, 411, 412, 370, 414, 413, + 321, 262, 262, 415, 436, 192, 193, 416, 417, 262, + 430, 332, 333, -34, 423, 14, 262, 15, 424, 431, + 177, 435, 438, 439, 4, -34, -34, 443, 177, 444, + 78, 136, 177, 137, -34, -34, -34, -34, 398, 262, + -34, 16, 138, 358, 139, 360, 42, 352, 17, 364, + 89, 351, 238, 44, 177, 366, 367, 368, 175, 20, + 34, 374, 362, 395, 262, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 262, 0, 0, 0, 0, + 262, 0, 384, 385, 262, 262, 0, 0, 0, 0, + 392, 0, 0, 0, 0, 0, 0, 396, 0, 0, + 0, 0, 0, 0, 46, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 62, 0, 251, 252, 46, - 47, 253, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 14, 0, 15, 0, - 0, 254, 255, 0, 0, 0, 0, 0, 63, 0, - 0, 64, 256, 257, 65, 0, 66, 94, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, - 0, 64, 0, 0, 65, 0, 66, 296, 0, 0, - 0, 0, 110, 111, 112, 113, 114, 115, 116, 117, - 118, 119, 120, 121, 122, 123, 251, 252, 0, 0, - 253, 227, 0, 228, 229, 131, 132, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 258, 0, - 254, 255, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 256, 257, 0, 0, 0, 0, 0, 0, 0, + 410, 14, 0, 15, 0, 224, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 225, 226, 0, + 0, 0, 0, 0, 0, 425, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 433, 0, 0, 0, + 0, 437, 0, 0, 0, 440, 441, 110, 111, 112, + 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, + 123, 0, 0, 0, 0, 0, 227, 0, 228, 229, + 131, 132, 0, 0, 0, 0, 0, 0, 0, 0, + 230, 0, 0, 231, 0, 232, 46, 47, 233, 93, + 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, + 59, 60, 61, 14, 0, 15, 46, 47, 0, 93, + 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, + 163, 60, 61, 14, 0, 15, 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 62, 0, 251, 252, + 46, 47, 253, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 14, 0, 15, + 0, 254, 255, 256, 0, 0, 0, 0, 0, 63, + 0, 0, 64, 257, 258, 65, 0, 66, 94, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, + 0, 0, 64, 0, 0, 65, 0, 66, 297, 0, + 0, 0, 0, 110, 111, 112, 113, 114, 115, 116, + 117, 118, 119, 120, 121, 122, 123, 251, 252, 0, + 0, 253, 227, 0, 228, 229, 131, 132, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 259, + 254, 255, 256, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 257, 258, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 110, 111, 112, 113, 114, 115, 116, 117, 118, - 119, 120, 121, 122, 123, 0, 0, 0, 0, 0, - 227, 0, 228, 229, 131, 132, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 46, 47, 258, 93, 49, - 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, - 60, 61, 14, 0, 15, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 174, 0, 0, - 0, 0, 0, 46, 47, 62, 93, 49, 50, 51, - 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, - 14, 0, 15, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 244, 0, 0, 0, 0, - 0, 0, 0, 62, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, - 0, 64, 0, 0, 65, 0, 66, 46, 47, 0, - 93, 153, 154, 155, 156, 157, 158, 159, 160, 161, - 162, 163, 60, 61, 14, 0, 15, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 63, 0, 0, 64, - 0, 0, 65, 0, 66, 46, 47, 62, 93, 49, - 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, - 60, 61, 14, 0, 15, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 310, 0, 0, - 0, 0, 0, 0, 0, 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 63, 0, 0, 64, 0, 292, 65, 0, 66, 0, - 46, 47, 0, 93, 49, 50, 51, 52, 53, 54, - 55, 56, 57, 58, 59, 60, 61, 14, 0, 15, - 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, - 0, 64, 349, 0, 65, 0, 66, 0, 46, 47, - 62, 48, 49, 50, 51, 52, 53, 54, 55, 56, - 57, 58, 59, 60, 61, 14, 0, 15, 46, 47, - 0, 93, 49, 50, 51, 52, 53, 54, 55, 56, - 57, 58, 59, 60, 61, 14, 0, 15, 62, 0, + 0, 0, 110, 111, 112, 113, 114, 115, 116, 117, + 118, 119, 120, 121, 122, 123, 0, 0, 0, 0, + 0, 227, 0, 228, 229, 131, 132, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 46, 47, 259, 93, + 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, + 59, 60, 61, 14, 0, 15, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 174, 0, + 0, 0, 0, 0, 46, 47, 62, 93, 49, 50, + 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, + 61, 14, 0, 15, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 244, 0, 0, 0, + 0, 0, 0, 0, 62, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, + 0, 0, 64, 0, 0, 65, 0, 66, 46, 47, + 0, 93, 153, 154, 155, 156, 157, 158, 159, 160, + 161, 162, 163, 60, 61, 14, 0, 15, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, + 64, 0, 0, 65, 0, 66, 46, 47, 62, 93, + 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, + 59, 60, 61, 14, 0, 15, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 311, 0, + 0, 0, 0, 0, 0, 0, 62, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 63, 0, 0, 64, 0, 293, 65, 0, 66, + 0, 46, 47, 0, 93, 49, 50, 51, 52, 53, + 54, 55, 56, 57, 58, 59, 60, 61, 14, 0, + 15, 0, 0, 0, 0, 0, 0, 0, 0, 63, + 0, 0, 64, 350, 0, 65, 0, 66, 0, 46, + 47, 62, 48, 49, 50, 51, 52, 53, 54, 55, + 56, 57, 58, 59, 60, 61, 14, 0, 15, 46, + 47, 0, 93, 49, 50, 51, 52, 53, 54, 55, + 56, 57, 58, 59, 60, 61, 14, 0, 15, 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 63, 0, 0, 64, 0, 62, 65, - 0, 66, 46, 47, 0, 93, 153, 154, 155, 156, - 157, 158, 159, 160, 161, 162, 163, 60, 61, 14, - 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 63, 0, 0, 64, 0, 0, 65, 0, 66, - 0, 0, 62, 0, 0, 0, 0, 0, 0, 0, - 0, 63, 0, 0, 64, 0, 0, 65, 0, 66, - 46, 47, 0, 180, 49, 50, 51, 52, 53, 54, - 55, 56, 57, 58, 59, 60, 61, 14, 0, 15, - 0, 0, 0, 100, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 101, 63, 0, 0, 64, 0, - 62, 65, 0, 66, 102, 103, 0, 0, 0, 0, - 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, - 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, - 124, 125, 126, 0, 0, 127, 128, 129, 130, 131, - 132, 133, 134, 135, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 63, 0, 0, 64, 0, 0, 65, - 0, 66 + 0, 0, 0, 0, 63, 0, 0, 64, 0, 62, + 65, 0, 66, 46, 47, 0, 93, 153, 154, 155, + 156, 157, 158, 159, 160, 161, 162, 163, 60, 61, + 14, 0, 15, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 63, 0, 0, 64, 0, 0, 65, 0, + 66, 0, 0, 62, 0, 0, 0, 0, 0, 0, + 0, 0, 63, 0, 0, 64, 0, 0, 65, 0, + 66, 46, 47, 0, 180, 49, 50, 51, 52, 53, + 54, 55, 56, 57, 58, 59, 60, 61, 14, 0, + 15, 0, 0, 0, 100, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 101, 63, 0, 0, 64, + 0, 62, 65, 0, 66, 102, 103, 0, 0, 0, + 0, 104, 105, 106, 107, 108, 109, 110, 111, 112, + 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, + 123, 124, 125, 126, 0, 0, 127, 128, 129, 130, + 131, 132, 133, 134, 135, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 63, 0, 0, 64, 0, 0, + 65, 0, 66 }; static const short yycheck[] = { 26, - 106, 106, 40, 29, 89, 15, 97, 101, 240, 2, - 104, 66, 197, 40, 405, 22, 107, 24, 15, 23, - 10, 11, 12, 13, 14, 15, 16, 17, 107, 420, - 32, 33, 126, 231, 232, 129, 130, 30, 34, 133, - 134, 135, 0, 98, 54, 139, 52, 53, 10, 11, - 12, 13, 14, 15, 16, 17, 23, 54, 54, 9, - 258, 88, 141, 30, 97, 96, 20, 25, 97, 85, - 86, 21, 105, 31, 101, 68, 96, 104, 107, 4, - 106, 96, 99, 41, 42, 43, 44, 41, 42, 43, - 44, 108, 105, 47, 99, 108, 97, 124, 125, 126, - 127, 128, 129, 130, 105, 337, 133, 134, 135, 136, - 137, 138, 139, 103, 169, 170, 171, 419, 97, 213, - 97, 96, 103, 167, 103, 427, 103, 108, 58, 59, - 60, 61, 96, 177, 49, 50, 51, 4, 182, 183, - 107, 103, 27, 28, 3, 4, 173, 3, 4, 101, - 194, 3, 4, 3, 4, 199, 4, 195, 3, 4, - 4, 99, 24, 207, 208, 209, 4, 24, 195, 102, - 102, 99, 357, 211, 359, 56, 4, 4, 4, 4, - 97, 275, 4, 7, 211, 212, 213, 7, 282, 7, - 100, 97, 97, 101, 249, 10, 11, 12, 13, 14, - 15, 16, 17, 97, 289, 290, 291, 36, 97, 97, - 97, 97, 24, 97, 299, 300, 301, 302, 97, 182, - 183, 99, 266, 99, 99, 24, 99, 99, 272, 99, - 99, 194, 97, 97, 100, 21, 199, 97, 101, 283, - 284, 34, 97, 97, 207, 208, 209, 274, 275, 276, - 277, 278, 245, 21, 97, 282, 341, 97, 97, 4, - 24, 97, 99, 97, 99, 4, 36, 97, 100, 54, - 364, 315, 4, 317, 97, 54, 97, 321, 97, 21, - 97, 308, 36, 327, 328, 329, 97, 97, 97, 97, - 375, 318, 377, 378, 379, 380, 390, 101, 100, 405, - 405, 21, 103, 266, 100, 100, 333, 97, 100, 272, - 354, 355, 100, 100, 420, 420, 100, 100, 362, 97, - 283, 284, 20, 103, 22, 369, 24, 412, 21, 356, - 97, 66, 21, 31, 32, 33, 21, 364, 0, 0, - 78, 368, 78, 41, 42, 43, 44, 374, 392, 47, - 48, 78, 315, 78, 317, 30, 309, 55, 321, 18, - 167, 98, 42, 390, 327, 328, 329, 308, 21, 2, - 13, 318, 338, 417, 368, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 428, -1, -1, -1, -1, 433, - -1, 354, 355, 437, 438, -1, -1, -1, -1, 362, - -1, -1, -1, -1, -1, -1, 369, -1, -1, -1, - -1, -1, -1, 5, 6, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 392, - 22, -1, 24, -1, 26, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 38, 39, -1, -1, - -1, -1, -1, -1, 417, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 428, -1, -1, -1, -1, - 433, -1, -1, -1, 437, 438, 68, 69, 70, 71, - 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, - -1, -1, -1, -1, -1, 87, -1, 89, 90, 91, - 92, -1, -1, -1, -1, -1, -1, -1, -1, 101, - -1, -1, 104, -1, 106, 5, 6, 109, 8, 9, - 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, - 20, 21, 22, -1, 24, 5, 6, -1, 8, 9, - 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, - 20, 21, 22, -1, 24, 45, -1, -1, -1, -1, + 106, 106, 40, 29, 89, 23, 197, 101, 15, 97, + 104, 23, 66, 40, 34, 2, 240, 15, 30, 107, + 10, 11, 12, 13, 14, 15, 16, 17, 107, 231, + 232, 406, 126, 103, 54, 129, 130, 96, 108, 133, + 134, 135, 0, 30, 98, 139, 421, 54, 10, 11, + 12, 13, 14, 15, 16, 17, 54, 259, 9, 99, + 96, 88, 141, 97, 97, 97, 20, 25, 108, 4, + 21, 105, 105, 31, 101, 107, 97, 104, 52, 53, + 106, 68, 103, 41, 42, 43, 44, 41, 42, 43, + 44, 105, 96, 47, 108, 107, 420, 124, 125, 126, + 127, 128, 129, 130, 428, 96, 133, 134, 135, 136, + 137, 138, 139, 103, 338, 169, 170, 171, 96, 213, + 49, 50, 51, 167, 10, 11, 12, 13, 14, 15, + 16, 17, 22, 177, 24, 101, 97, 4, 182, 183, + 99, 103, 103, 32, 33, 4, 173, 85, 86, 4, + 194, 58, 59, 60, 61, 199, 99, 195, 27, 28, + 3, 4, 24, 207, 208, 209, 4, 358, 195, 360, + 3, 4, 24, 211, 3, 4, 3, 4, 3, 4, + 102, 102, 276, 99, 211, 212, 213, 4, 56, 283, + 4, 4, 4, 97, 100, 249, 7, 7, 4, 7, + 97, 97, 101, 97, 36, 290, 291, 292, 24, 97, + 97, 34, 97, 97, 97, 300, 301, 302, 303, 182, + 183, 97, 99, 267, 99, 99, 24, 99, 99, 273, + 100, 194, 21, 99, 99, 21, 199, 97, 101, 97, + 284, 285, 99, 97, 207, 208, 209, 97, 275, 276, + 277, 278, 279, 97, 4, 97, 283, 342, 245, 99, + 97, 97, 97, 97, 24, 4, 36, 97, 4, 97, + 54, 365, 316, 97, 318, 97, 97, 97, 322, 97, + 54, 100, 309, 21, 328, 329, 330, 36, 97, 21, + 97, 376, 319, 378, 379, 380, 381, 391, 101, 100, + 406, 406, 21, 103, 267, 100, 100, 334, 100, 97, + 273, 355, 356, 100, 66, 421, 421, 100, 100, 363, + 100, 284, 285, 20, 103, 22, 370, 24, 413, 97, + 357, 97, 21, 21, 31, 32, 33, 0, 365, 0, + 30, 78, 369, 78, 41, 42, 43, 44, 375, 393, + 47, 48, 78, 316, 78, 318, 18, 310, 55, 322, + 42, 309, 167, 21, 391, 328, 329, 330, 98, 2, + 13, 339, 319, 369, 418, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 429, -1, -1, -1, -1, + 434, -1, 355, 356, 438, 439, -1, -1, -1, -1, + 363, -1, -1, -1, -1, -1, -1, 370, -1, -1, + -1, -1, -1, -1, 5, 6, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 45, -1, 3, 4, 5, - 6, 7, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 22, -1, 24, -1, - -1, 27, 28, -1, -1, -1, -1, -1, 98, -1, - -1, 101, 38, 39, 104, -1, 106, 107, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 98, -1, - -1, 101, -1, -1, 104, -1, 106, 107, -1, -1, - -1, -1, 68, 69, 70, 71, 72, 73, 74, 75, - 76, 77, 78, 79, 80, 81, 3, 4, -1, -1, - 7, 87, -1, 89, 90, 91, 92, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 104, -1, - 27, 28, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 38, 39, -1, -1, -1, -1, -1, -1, -1, + 393, 22, -1, 24, -1, 26, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 38, 39, -1, + -1, -1, -1, -1, -1, 418, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 429, -1, -1, -1, + -1, 434, -1, -1, -1, 438, 439, 68, 69, 70, + 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, + 81, -1, -1, -1, -1, -1, 87, -1, 89, 90, + 91, 92, -1, -1, -1, -1, -1, -1, -1, -1, + 101, -1, -1, 104, -1, 106, 5, 6, 109, 8, + 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, + 19, 20, 21, 22, -1, 24, 5, 6, -1, 8, + 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, + 19, 20, 21, 22, -1, 24, 45, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 45, -1, 3, 4, + 5, 6, 7, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 22, -1, 24, + -1, 26, 27, 28, -1, -1, -1, -1, -1, 98, + -1, -1, 101, 38, 39, 104, -1, 106, 107, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 98, + -1, -1, 101, -1, -1, 104, -1, 106, 107, -1, + -1, -1, -1, 68, 69, 70, 71, 72, 73, 74, + 75, 76, 77, 78, 79, 80, 81, 3, 4, -1, + -1, 7, 87, -1, 89, 90, 91, 92, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 104, + 26, 27, 28, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 38, 39, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 68, 69, 70, 71, 72, 73, 74, 75, 76, - 77, 78, 79, 80, 81, -1, -1, -1, -1, -1, - 87, -1, 89, 90, 91, 92, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 5, 6, 104, 8, 9, - 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, - 20, 21, 22, -1, 24, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 37, -1, -1, - -1, -1, -1, 5, 6, 45, 8, 9, 10, 11, - 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, - 22, -1, 24, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 37, -1, -1, -1, -1, - -1, -1, -1, 45, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 98, -1, - -1, 101, -1, -1, 104, -1, 106, 5, 6, -1, - 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, - 18, 19, 20, 21, 22, -1, 24, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 98, -1, -1, 101, - -1, -1, 104, -1, 106, 5, 6, 45, 8, 9, - 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, - 20, 21, 22, -1, 24, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 37, -1, -1, - -1, -1, -1, -1, -1, 45, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 98, -1, -1, 101, -1, 103, 104, -1, 106, -1, - 5, 6, -1, 8, 9, 10, 11, 12, 13, 14, - 15, 16, 17, 18, 19, 20, 21, 22, -1, 24, - -1, -1, -1, -1, -1, -1, -1, -1, 98, -1, - -1, 101, 37, -1, 104, -1, 106, -1, 5, 6, - 45, 8, 9, 10, 11, 12, 13, 14, 15, 16, - 17, 18, 19, 20, 21, 22, -1, 24, 5, 6, + -1, -1, 68, 69, 70, 71, 72, 73, 74, 75, + 76, 77, 78, 79, 80, 81, -1, -1, -1, -1, + -1, 87, -1, 89, 90, 91, 92, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 5, 6, 104, 8, + 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, + 19, 20, 21, 22, -1, 24, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 37, -1, + -1, -1, -1, -1, 5, 6, 45, 8, 9, 10, + 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, + 21, 22, -1, 24, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 37, -1, -1, -1, + -1, -1, -1, -1, 45, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 98, + -1, -1, 101, -1, -1, 104, -1, 106, 5, 6, -1, 8, 9, 10, 11, 12, 13, 14, 15, 16, - 17, 18, 19, 20, 21, 22, -1, 24, 45, -1, + 17, 18, 19, 20, 21, 22, -1, 24, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 98, -1, -1, + 101, -1, -1, 104, -1, 106, 5, 6, 45, 8, + 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, + 19, 20, 21, 22, -1, 24, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 37, -1, + -1, -1, -1, -1, -1, -1, 45, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 98, -1, -1, 101, -1, 45, 104, - -1, 106, 5, 6, -1, 8, 9, 10, 11, 12, - 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, - -1, 24, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 98, -1, -1, 101, -1, -1, 104, -1, 106, - -1, -1, 45, -1, -1, -1, -1, -1, -1, -1, - -1, 98, -1, -1, 101, -1, -1, 104, -1, 106, - 5, 6, -1, 8, 9, 10, 11, 12, 13, 14, - 15, 16, 17, 18, 19, 20, 21, 22, -1, 24, - -1, -1, -1, 35, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 46, 98, -1, -1, 101, -1, - 45, 104, -1, 106, 56, 57, -1, -1, -1, -1, - 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, - 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, - 82, 83, 84, -1, -1, 87, 88, 89, 90, 91, - 92, 93, 94, 95, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 98, -1, -1, 101, -1, -1, 104, - -1, 106 + -1, 98, -1, -1, 101, -1, 103, 104, -1, 106, + -1, 5, 6, -1, 8, 9, 10, 11, 12, 13, + 14, 15, 16, 17, 18, 19, 20, 21, 22, -1, + 24, -1, -1, -1, -1, -1, -1, -1, -1, 98, + -1, -1, 101, 37, -1, 104, -1, 106, -1, 5, + 6, 45, 8, 9, 10, 11, 12, 13, 14, 15, + 16, 17, 18, 19, 20, 21, 22, -1, 24, 5, + 6, -1, 8, 9, 10, 11, 12, 13, 14, 15, + 16, 17, 18, 19, 20, 21, 22, -1, 24, 45, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 98, -1, -1, 101, -1, 45, + 104, -1, 106, 5, 6, -1, 8, 9, 10, 11, + 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, + 22, -1, 24, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 98, -1, -1, 101, -1, -1, 104, -1, + 106, -1, -1, 45, -1, -1, -1, -1, -1, -1, + -1, -1, 98, -1, -1, 101, -1, -1, 104, -1, + 106, 5, 6, -1, 8, 9, 10, 11, 12, 13, + 14, 15, 16, 17, 18, 19, 20, 21, 22, -1, + 24, -1, -1, -1, 35, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 46, 98, -1, -1, 101, + -1, 45, 104, -1, 106, 56, 57, -1, -1, -1, + -1, 62, 63, 64, 65, 66, 67, 68, 69, 70, + 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, + 81, 82, 83, 84, -1, -1, 87, 88, 89, 90, + 91, 92, 93, 94, 95, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 98, -1, -1, 101, -1, -1, + 104, -1, 106 }; /* -*-C-*- Note some compilers choke on comments on `#line' lines. */ #line 3 "/usr/share/bison.simple" @@ -2183,7 +2187,7 @@ switch (yyn) { case 2: -#line 989 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +#line 992 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" { if (yyvsp[0].UIntVal > (uint32_t)INT32_MAX) // Outside of my range! ThrowException("Value too large for type!"); @@ -2191,7 +2195,7 @@ ; break;} case 4: -#line 997 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +#line 1000 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" { if (yyvsp[0].UInt64Val > (uint64_t)INT64_MAX) // Outside of my range! ThrowException("Value too large for type!"); @@ -2199,55 +2203,55 @@ ; break;} case 33: -#line 1020 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +#line 1023 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" { yyval.StrVal = yyvsp[-1].StrVal; ; break;} case 34: -#line 1023 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +#line 1026 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" { yyval.StrVal = 0; ; break;} case 35: -#line 1027 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +#line 1030 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" { yyval.Linkage = GlobalValue::InternalLinkage; ; break;} case 36: -#line 1028 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +#line 1031 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" { yyval.Linkage = GlobalValue::LinkOnceLinkage; ; break;} case 37: -#line 1029 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +#line 1032 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" { yyval.Linkage = GlobalValue::WeakLinkage; ; break;} case 38: -#line 1030 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +#line 1033 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" { yyval.Linkage = GlobalValue::AppendingLinkage; ; break;} case 39: -#line 1031 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +#line 1034 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" { yyval.Linkage = GlobalValue::ExternalLinkage; ; break;} case 40: -#line 1033 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +#line 1036 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" { yyval.UIntVal = CallingConv::C; ; break;} case 41: -#line 1034 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +#line 1037 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" { yyval.UIntVal = CallingConv::C; ; break;} case 42: -#line 1035 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +#line 1038 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" { yyval.UIntVal = CallingConv::Fast; ; break;} case 43: -#line 1036 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +#line 1039 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" { yyval.UIntVal = CallingConv::Cold; ; break;} case 44: -#line 1037 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +#line 1040 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" { if ((unsigned)yyvsp[0].UInt64Val != yyvsp[0].UInt64Val) ThrowException("Calling conv too large!"); @@ -2255,11 +2259,11 @@ ; break;} case 45: -#line 1045 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +#line 1048 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" { yyval.UIntVal = 0; ; break;} case 46: -#line 1046 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +#line 1049 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" { yyval.UIntVal = yyvsp[0].UInt64Val; if (yyval.UIntVal != 0 && !isPowerOf2_32(yyval.UIntVal)) @@ -2267,11 +2271,11 @@ ; break;} case 47: -#line 1051 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +#line 1054 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" { yyval.UIntVal = 0; ; break;} case 48: -#line 1052 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +#line 1055 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" { yyval.UIntVal = yyvsp[0].UInt64Val; if (yyval.UIntVal != 0 && !isPowerOf2_32(yyval.UIntVal)) @@ -2279,7 +2283,7 @@ ; break;} case 49: -#line 1059 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +#line 1062 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" { for (unsigned i = 0, e = strlen(yyvsp[0].StrVal); i != e; ++i) if (yyvsp[0].StrVal[i] == '"' || yyvsp[0].StrVal[i] == '\\') @@ -2288,44 +2292,46 @@ ; break;} case 50: -#line 1066 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +#line 1069 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" { yyval.StrVal = 0; ; break;} case 51: -#line 1067 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +#line 1070 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" { yyval.StrVal = yyvsp[0].StrVal; ; break;} case 52: -#line 1072 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +#line 1075 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" {; break;} case 53: -#line 1073 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +#line 1076 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" {; break;} case 54: -#line 1074 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +#line 1077 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" { CurGV->setSection(yyvsp[0].StrVal); free(yyvsp[0].StrVal); ; break;} case 55: -#line 1078 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +#line 1081 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" { + if (yyvsp[0].UInt64Val != 0 && !isPowerOf2_32(yyvsp[0].UInt64Val)) + ThrowException("Alignment must be a power of two!"); CurGV->setAlignment(yyvsp[0].UInt64Val); ; break;} case 57: -#line 1089 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +#line 1094 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" { yyval.TypeVal = new PATypeHolder(yyvsp[0].PrimType); ; break;} case 59: -#line 1090 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +#line 1095 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" { yyval.TypeVal = new PATypeHolder(yyvsp[0].PrimType); ; break;} case 60: -#line 1092 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +#line 1097 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" { if (!UpRefs.empty()) ThrowException("Invalid upreference in type: " + (*yyvsp[0].TypeVal)->getDescription()); @@ -2333,25 +2339,25 @@ ; break;} case 74: -#line 1103 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +#line 1108 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" { yyval.TypeVal = new PATypeHolder(OpaqueType::get()); ; break;} case 75: -#line 1106 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +#line 1111 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" { yyval.TypeVal = new PATypeHolder(yyvsp[0].PrimType); ; break;} case 76: -#line 1109 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +#line 1114 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" { // Named types are also simple types... yyval.TypeVal = new PATypeHolder(getTypeVal(yyvsp[0].ValIDVal)); ; break;} case 77: -#line 1115 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +#line 1120 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" { // Type UpReference if (yyvsp[0].UInt64Val > (uint64_t)~0U) ThrowException("Value out of range!"); OpaqueType *OT = OpaqueType::get(); // Use temporary placeholder @@ -2361,7 +2367,7 @@ ; break;} case 78: -#line 1122 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +#line 1127 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" { // Function derived type? std::vector Params; for (std::list::iterator I = yyvsp[-1].TypeList->begin(), @@ -2376,14 +2382,14 @@ ; break;} case 79: -#line 1134 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +#line 1139 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" { // Sized array type? yyval.TypeVal = new PATypeHolder(HandleUpRefs(ArrayType::get(*yyvsp[-1].TypeVal, (unsigned)yyvsp[-3].UInt64Val))); delete yyvsp[-1].TypeVal; ; break;} case 80: -#line 1138 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +#line 1143 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" { // Packed array type? const llvm::Type* ElemTy = yyvsp[-1].TypeVal->get(); if ((unsigned)yyvsp[-3].UInt64Val != yyvsp[-3].UInt64Val) @@ -2397,7 +2403,7 @@ ; break;} case 81: -#line 1149 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +#line 1154 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" { // Structure type? std::vector Elements; for (std::list::iterator I = yyvsp[-1].TypeList->begin(), @@ -2409,51 +2415,51 @@ ; break;} case 82: -#line 1158 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +#line 1163 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" { // Empty structure type? yyval.TypeVal = new PATypeHolder(StructType::get(std::vector())); ; break;} case 83: -#line 1161 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +#line 1166 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" { // Pointer type? yyval.TypeVal = new PATypeHolder(HandleUpRefs(PointerType::get(*yyvsp[-1].TypeVal))); delete yyvsp[-1].TypeVal; ; break;} case 84: -#line 1169 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +#line 1174 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" { yyval.TypeList = new std::list(); yyval.TypeList->push_back(*yyvsp[0].TypeVal); delete yyvsp[0].TypeVal; ; break;} case 85: -#line 1173 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +#line 1178 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" { (yyval.TypeList=yyvsp[-2].TypeList)->push_back(*yyvsp[0].TypeVal); delete yyvsp[0].TypeVal; ; break;} case 87: -#line 1179 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +#line 1184 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" { (yyval.TypeList=yyvsp[-2].TypeList)->push_back(Type::VoidTy); ; break;} case 88: -#line 1182 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +#line 1187 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" { (yyval.TypeList = new std::list())->push_back(Type::VoidTy); ; break;} case 89: -#line 1185 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +#line 1190 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" { yyval.TypeList = new std::list(); ; break;} case 90: -#line 1195 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +#line 1200 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" { // Nonempty unsized arr const ArrayType *ATy = dyn_cast(yyvsp[-3].TypeVal->get()); if (ATy == 0) @@ -2481,7 +2487,7 @@ ; break;} case 91: -#line 1220 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +#line 1225 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" { const ArrayType *ATy = dyn_cast(yyvsp[-2].TypeVal->get()); if (ATy == 0) @@ -2497,7 +2503,7 @@ ; break;} case 92: -#line 1233 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +#line 1238 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" { const ArrayType *ATy = dyn_cast(yyvsp[-2].TypeVal->get()); if (ATy == 0) @@ -2528,7 +2534,7 @@ ; break;} case 93: -#line 1261 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +#line 1266 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" { // Nonempty unsized arr const PackedType *PTy = dyn_cast(yyvsp[-3].TypeVal->get()); if (PTy == 0) @@ -2556,7 +2562,7 @@ ; break;} case 94: -#line 1286 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +#line 1291 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" { const StructType *STy = dyn_cast(yyvsp[-3].TypeVal->get()); if (STy == 0) @@ -2579,7 +2585,7 @@ ; break;} case 95: -#line 1306 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +#line 1311 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" { const StructType *STy = dyn_cast(yyvsp[-2].TypeVal->get()); if (STy == 0) @@ -2594,7 +2600,7 @@ ; break;} case 96: -#line 1318 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +#line 1323 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" { const PointerType *PTy = dyn_cast(yyvsp[-1].TypeVal->get()); if (PTy == 0) @@ -2606,14 +2612,14 @@ ; break;} case 97: -#line 1327 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +#line 1332 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" { yyval.ConstVal = UndefValue::get(yyvsp[-1].TypeVal->get()); delete yyvsp[-1].TypeVal; ; break;} case 98: -#line 1331 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +#line 1336 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" { const PointerType *Ty = dyn_cast(yyvsp[-1].TypeVal->get()); if (Ty == 0) @@ -2675,7 +2681,7 @@ ; break;} case 99: -#line 1390 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +#line 1395 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" { if (yyvsp[-1].TypeVal->get() != yyvsp[0].ConstVal->getType()) ThrowException("Mismatched types for constant expression!"); @@ -2684,7 +2690,7 @@ ; break;} case 100: -#line 1396 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +#line 1401 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" { const Type *Ty = yyvsp[-1].TypeVal->get(); if (isa(Ty) || Ty == Type::LabelTy || isa(Ty)) @@ -2694,7 +2700,7 @@ ; break;} case 101: -#line 1404 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +#line 1409 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" { // integral constants if (!ConstantSInt::isValueValidForType(yyvsp[-1].PrimType, yyvsp[0].SInt64Val)) ThrowException("Constant value doesn't fit in type!"); @@ -2702,7 +2708,7 @@ ; break;} case 102: -#line 1409 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +#line 1414 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" { // integral constants if (!ConstantUInt::isValueValidForType(yyvsp[-1].PrimType, yyvsp[0].UInt64Val)) ThrowException("Constant value doesn't fit in type!"); @@ -2710,19 +2716,19 @@ ; break;} case 103: -#line 1414 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +#line 1419 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" { // Boolean constants yyval.ConstVal = ConstantBool::True; ; break;} case 104: -#line 1417 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +#line 1422 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" { // Boolean constants yyval.ConstVal = ConstantBool::False; ; break;} case 105: -#line 1420 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +#line 1425 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" { // Float & Double constants if (!ConstantFP::isValueValidForType(yyvsp[-1].PrimType, yyvsp[0].FPVal)) ThrowException("Floating point constant invalid for type!!"); @@ -2730,7 +2736,7 @@ ; break;} case 106: -#line 1427 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +#line 1432 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" { if (!yyvsp[-3].ConstVal->getType()->isFirstClassType()) ThrowException("cast constant expression from a non-primitive type: '" + @@ -2743,7 +2749,7 @@ ; break;} case 107: -#line 1437 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +#line 1442 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" { if (!isa(yyvsp[-2].ConstVal->getType())) ThrowException("GetElementPtr requires a pointer operand!"); @@ -2777,7 +2783,7 @@ ; break;} case 108: -#line 1468 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +#line 1473 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" { if (yyvsp[-5].ConstVal->getType() != Type::BoolTy) ThrowException("Select condition must be of boolean type!"); @@ -2787,7 +2793,7 @@ ; break;} case 109: -#line 1475 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +#line 1480 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" { if (yyvsp[-3].ConstVal->getType() != yyvsp[-1].ConstVal->getType()) ThrowException("Binary operator types must match!"); @@ -2811,7 +2817,7 @@ ; break;} case 110: -#line 1496 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +#line 1501 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" { if (yyvsp[-3].ConstVal->getType() != yyvsp[-1].ConstVal->getType()) ThrowException("Logical operator types must match!"); @@ -2821,7 +2827,7 @@ ; break;} case 111: -#line 1503 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +#line 1508 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" { if (yyvsp[-3].ConstVal->getType() != yyvsp[-1].ConstVal->getType()) ThrowException("setcc operand types must match!"); @@ -2829,7 +2835,7 @@ ; break;} case 112: -#line 1508 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +#line 1513 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" { if (yyvsp[-1].ConstVal->getType() != Type::UByteTy) ThrowException("Shift count for shift constant must be unsigned byte!"); @@ -2839,54 +2845,54 @@ ; break;} case 113: -#line 1518 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +#line 1523 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" { (yyval.ConstVector = yyvsp[-2].ConstVector)->push_back(yyvsp[0].ConstVal); ; break;} case 114: -#line 1521 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +#line 1526 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" { yyval.ConstVector = new std::vector(); yyval.ConstVector->push_back(yyvsp[0].ConstVal); ; break;} case 115: -#line 1528 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +#line 1533 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" { yyval.BoolVal = false; ; break;} case 116: -#line 1528 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +#line 1533 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" { yyval.BoolVal = true; ; break;} case 117: -#line 1538 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +#line 1543 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" { yyval.ModuleVal = ParserResult = yyvsp[0].ModuleVal; CurModule.ModuleDone(); ; break;} case 118: -#line 1545 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +#line 1550 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" { yyval.ModuleVal = yyvsp[-1].ModuleVal; CurFun.FunctionDone(); ; break;} case 119: -#line 1549 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +#line 1554 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" { yyval.ModuleVal = yyvsp[-1].ModuleVal; ; break;} case 120: -#line 1552 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +#line 1557 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" { yyval.ModuleVal = yyvsp[-1].ModuleVal; ; break;} case 121: -#line 1555 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +#line 1560 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" { yyval.ModuleVal = CurModule.CurrentModule; // Emit an error if there are any unresolved types left. @@ -2900,7 +2906,7 @@ ; break;} case 122: -#line 1568 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +#line 1573 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" { // Eagerly resolve types. This is not an optimization, this is a // requirement that is due to the fact that we could have this: @@ -2923,25 +2929,25 @@ ; break;} case 123: -#line 1588 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +#line 1593 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" { // Function prototypes can be in const pool ; break;} case 124: -#line 1590 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +#line 1595 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" { if (yyvsp[0].ConstVal == 0) ThrowException("Global value initializer is not a constant!"); CurGV = ParseGlobalVariable(yyvsp[-3].StrVal, yyvsp[-2].Linkage, yyvsp[-1].BoolVal, yyvsp[0].ConstVal->getType(), yyvsp[0].ConstVal); ; break;} case 125: -#line 1593 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +#line 1598 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" { CurGV = 0; ; break;} case 126: -#line 1596 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +#line 1601 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" { CurGV = ParseGlobalVariable(yyvsp[-3].StrVal, GlobalValue::ExternalLinkage, yyvsp[-1].BoolVal, *yyvsp[0].TypeVal, 0); @@ -2949,42 +2955,42 @@ ; break;} case 127: -#line 1600 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +#line 1605 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" { CurGV = 0; ; break;} case 128: -#line 1603 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +#line 1608 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" { ; break;} case 129: -#line 1605 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +#line 1610 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" { ; break;} case 130: -#line 1607 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +#line 1612 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" { ; break;} case 131: -#line 1612 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +#line 1617 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" { yyval.Endianness = Module::BigEndian; ; break;} case 132: -#line 1613 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +#line 1618 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" { yyval.Endianness = Module::LittleEndian; ; break;} case 133: -#line 1615 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +#line 1620 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" { CurModule.CurrentModule->setEndianness(yyvsp[0].Endianness); ; break;} case 134: -#line 1618 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +#line 1623 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" { if (yyvsp[0].UInt64Val == 32) CurModule.CurrentModule->setPointerSize(Module::Pointer32); @@ -2995,37 +3001,37 @@ ; break;} case 135: -#line 1626 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +#line 1631 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" { CurModule.CurrentModule->setTargetTriple(yyvsp[0].StrVal); free(yyvsp[0].StrVal); ; break;} case 137: -#line 1633 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +#line 1638 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" { CurModule.CurrentModule->addLibrary(yyvsp[0].StrVal); free(yyvsp[0].StrVal); ; break;} case 138: -#line 1637 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +#line 1642 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" { CurModule.CurrentModule->addLibrary(yyvsp[0].StrVal); free(yyvsp[0].StrVal); ; break;} case 139: -#line 1641 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +#line 1646 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" { ; break;} case 143: -#line 1650 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +#line 1655 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" { yyval.StrVal = 0; ; break;} case 144: -#line 1652 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +#line 1657 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" { if (*yyvsp[-1].TypeVal == Type::VoidTy) ThrowException("void typed arguments are invalid!"); @@ -3033,7 +3039,7 @@ ; break;} case 145: -#line 1658 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +#line 1663 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" { yyval.ArgList = yyvsp[-2].ArgList; yyvsp[-2].ArgList->push_back(*yyvsp[0].ArgVal); @@ -3041,7 +3047,7 @@ ; break;} case 146: -#line 1663 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +#line 1668 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" { yyval.ArgList = new std::vector >(); yyval.ArgList->push_back(*yyvsp[0].ArgVal); @@ -3049,13 +3055,13 @@ ; break;} case 147: -#line 1669 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +#line 1674 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" { yyval.ArgList = yyvsp[0].ArgList; ; break;} case 148: -#line 1672 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +#line 1677 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" { yyval.ArgList = yyvsp[-2].ArgList; yyval.ArgList->push_back(std::pair >(); yyval.ArgList->push_back(std::make_pair(new PATypeHolder(Type::VoidTy), (char*)0)); ; break;} case 150: -#line 1681 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +#line 1686 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" { yyval.ArgList = 0; ; break;} case 151: -#line 1686 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +#line 1691 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" { UnEscapeLexed(yyvsp[-5].StrVal); std::string FunctionName(yyvsp[-5].StrVal); @@ -3163,7 +3169,7 @@ ; break;} case 154: -#line 1773 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +#line 1778 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" { yyval.FunctionVal = CurFun.CurrentFunction; @@ -3173,66 +3179,72 @@ ; break;} case 157: -#line 1783 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +#line 1788 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" { yyval.FunctionVal = yyvsp[-1].FunctionVal; ; break;} case 158: -#line 1787 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +#line 1792 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" { CurFun.isDeclare = true; ; break;} case 159: -#line 1787 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +#line 1792 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" { yyval.FunctionVal = CurFun.CurrentFunction; CurFun.FunctionDone(); ; break;} case 160: -#line 1796 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +#line 1801 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" { // A reference to a direct constant yyval.ValIDVal = ValID::create(yyvsp[0].SInt64Val); ; break;} case 161: -#line 1799 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +#line 1804 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" { yyval.ValIDVal = ValID::create(yyvsp[0].UInt64Val); ; break;} case 162: -#line 1802 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +#line 1807 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" { // Perhaps it's an FP constant? yyval.ValIDVal = ValID::create(yyvsp[0].FPVal); ; break;} case 163: -#line 1805 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +#line 1810 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" { yyval.ValIDVal = ValID::create(ConstantBool::True); ; break;} case 164: -#line 1808 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +#line 1813 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" { yyval.ValIDVal = ValID::create(ConstantBool::False); ; break;} case 165: -#line 1811 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +#line 1816 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" { yyval.ValIDVal = ValID::createNull(); ; break;} case 166: -#line 1814 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +#line 1819 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" { yyval.ValIDVal = ValID::createUndef(); ; break;} case 167: -#line 1817 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +#line 1822 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +{ // A vector zero constant. + yyval.ValIDVal = ValID::createZeroInit(); + ; + break;} +case 168: +#line 1825 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" { // Nonempty unsized packed vector const Type *ETy = (*yyvsp[-1].ConstVector)[0]->getType(); int NumElements = yyvsp[-1].ConstVector->size(); @@ -3258,44 +3270,44 @@ delete PTy; delete yyvsp[-1].ConstVector; ; break;} -case 168: -#line 1841 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +case 169: +#line 1849 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" { yyval.ValIDVal = ValID::create(yyvsp[0].ConstVal); ; break;} -case 169: -#line 1848 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +case 170: +#line 1856 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" { // Is it an integer reference...? yyval.ValIDVal = ValID::create(yyvsp[0].SIntVal); ; break;} -case 170: -#line 1851 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +case 171: +#line 1859 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" { // Is it a named reference...? yyval.ValIDVal = ValID::create(yyvsp[0].StrVal); ; break;} -case 173: -#line 1862 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +case 174: +#line 1870 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" { yyval.ValueVal = getVal(*yyvsp[-1].TypeVal, yyvsp[0].ValIDVal); delete yyvsp[-1].TypeVal; ; break;} -case 174: -#line 1866 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +case 175: +#line 1874 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" { yyval.FunctionVal = yyvsp[-1].FunctionVal; ; break;} -case 175: -#line 1869 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +case 176: +#line 1877 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" { // Do not allow functions with 0 basic blocks yyval.FunctionVal = yyvsp[-1].FunctionVal; ; break;} -case 176: -#line 1877 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +case 177: +#line 1885 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" { setValueName(yyvsp[0].TermInstVal, yyvsp[-1].StrVal); InsertValue(yyvsp[0].TermInstVal); @@ -3305,15 +3317,15 @@ yyval.BasicBlockVal = yyvsp[-2].BasicBlockVal; ; break;} -case 177: -#line 1886 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +case 178: +#line 1894 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" { yyvsp[-1].BasicBlockVal->getInstList().push_back(yyvsp[0].InstVal); yyval.BasicBlockVal = yyvsp[-1].BasicBlockVal; ; break;} -case 178: -#line 1890 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +case 179: +#line 1898 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" { yyval.BasicBlockVal = CurBB = getBBVal(ValID::create((int)CurFun.NextBBNum++), true); @@ -3325,8 +3337,8 @@ BBL.splice(BBL.end(), BBL, yyval.BasicBlockVal); ; break;} -case 179: -#line 1900 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +case 180: +#line 1908 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" { yyval.BasicBlockVal = CurBB = getBBVal(ValID::create(yyvsp[0].StrVal), true); @@ -3338,32 +3350,32 @@ BBL.splice(BBL.end(), BBL, yyval.BasicBlockVal); ; break;} -case 180: -#line 1911 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +case 181: +#line 1919 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" { // Return with a result... yyval.TermInstVal = new ReturnInst(yyvsp[0].ValueVal); ; break;} -case 181: -#line 1914 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +case 182: +#line 1922 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" { // Return with no result... yyval.TermInstVal = new ReturnInst(); ; break;} -case 182: -#line 1917 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +case 183: +#line 1925 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" { // Unconditional Branch... yyval.TermInstVal = new BranchInst(getBBVal(yyvsp[0].ValIDVal)); ; break;} -case 183: -#line 1920 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +case 184: +#line 1928 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" { yyval.TermInstVal = new BranchInst(getBBVal(yyvsp[-3].ValIDVal), getBBVal(yyvsp[0].ValIDVal), getVal(Type::BoolTy, yyvsp[-6].ValIDVal)); ; break;} -case 184: -#line 1923 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +case 185: +#line 1931 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" { SwitchInst *S = new SwitchInst(getVal(yyvsp[-7].PrimType, yyvsp[-6].ValIDVal), getBBVal(yyvsp[-3].ValIDVal), yyvsp[-1].JumpTable->size()); yyval.TermInstVal = S; @@ -3379,15 +3391,15 @@ delete yyvsp[-1].JumpTable; ; break;} -case 185: -#line 1937 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +case 186: +#line 1945 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" { SwitchInst *S = new SwitchInst(getVal(yyvsp[-6].PrimType, yyvsp[-5].ValIDVal), getBBVal(yyvsp[-2].ValIDVal), 0); yyval.TermInstVal = S; ; break;} -case 186: -#line 1942 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +case 187: +#line 1950 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" { const PointerType *PFTy; const FunctionType *Ty; @@ -3441,20 +3453,20 @@ delete yyvsp[-7].ValueList; ; break;} -case 187: -#line 1994 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +case 188: +#line 2002 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" { yyval.TermInstVal = new UnwindInst(); ; break;} -case 188: -#line 1997 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +case 189: +#line 2005 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" { yyval.TermInstVal = new UnreachableInst(); ; break;} -case 189: -#line 2003 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +case 190: +#line 2011 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" { yyval.JumpTable = yyvsp[-5].JumpTable; Constant *V = cast(getValNonImprovising(yyvsp[-4].PrimType, yyvsp[-3].ValIDVal)); @@ -3464,8 +3476,8 @@ yyval.JumpTable->push_back(std::make_pair(V, getBBVal(yyvsp[0].ValIDVal))); ; break;} -case 190: -#line 2011 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +case 191: +#line 2019 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" { yyval.JumpTable = new std::vector >(); Constant *V = cast(getValNonImprovising(yyvsp[-4].PrimType, yyvsp[-3].ValIDVal)); @@ -3476,8 +3488,8 @@ yyval.JumpTable->push_back(std::make_pair(V, getBBVal(yyvsp[0].ValIDVal))); ; break;} -case 191: -#line 2021 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +case 192: +#line 2029 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" { // Is this definition named?? if so, assign the name... setValueName(yyvsp[0].InstVal, yyvsp[-1].StrVal); @@ -3485,54 +3497,54 @@ yyval.InstVal = yyvsp[0].InstVal; ; break;} -case 192: -#line 2028 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +case 193: +#line 2036 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" { // Used for PHI nodes yyval.PHIList = new std::list >(); yyval.PHIList->push_back(std::make_pair(getVal(*yyvsp[-5].TypeVal, yyvsp[-3].ValIDVal), getBBVal(yyvsp[-1].ValIDVal))); delete yyvsp[-5].TypeVal; ; break;} -case 193: -#line 2033 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +case 194: +#line 2041 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" { yyval.PHIList = yyvsp[-6].PHIList; yyvsp[-6].PHIList->push_back(std::make_pair(getVal(yyvsp[-6].PHIList->front().first->getType(), yyvsp[-3].ValIDVal), getBBVal(yyvsp[-1].ValIDVal))); ; break;} -case 194: -#line 2040 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +case 195: +#line 2048 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" { // Used for call statements, and memory insts... yyval.ValueList = new std::vector(); yyval.ValueList->push_back(yyvsp[0].ValueVal); ; break;} -case 195: -#line 2044 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +case 196: +#line 2052 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" { yyval.ValueList = yyvsp[-2].ValueList; yyvsp[-2].ValueList->push_back(yyvsp[0].ValueVal); ; break;} -case 197: -#line 2050 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +case 198: +#line 2058 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" { yyval.ValueList = 0; ; break;} -case 198: -#line 2052 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +case 199: +#line 2060 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" { yyval.BoolVal = true; ; break;} -case 199: -#line 2055 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +case 200: +#line 2063 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" { yyval.BoolVal = false; ; break;} -case 200: -#line 2061 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +case 201: +#line 2069 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" { if (!(*yyvsp[-3].TypeVal)->isInteger() && !(*yyvsp[-3].TypeVal)->isFloatingPoint() && !isa((*yyvsp[-3].TypeVal).get())) @@ -3546,8 +3558,8 @@ delete yyvsp[-3].TypeVal; ; break;} -case 201: -#line 2073 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +case 202: +#line 2081 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" { if (!(*yyvsp[-3].TypeVal)->isIntegral()) ThrowException("Logical operator requires integral operands!"); @@ -3557,8 +3569,8 @@ delete yyvsp[-3].TypeVal; ; break;} -case 202: -#line 2081 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +case 203: +#line 2089 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" { if(isa((*yyvsp[-3].TypeVal).get())) { ThrowException( @@ -3570,8 +3582,8 @@ delete yyvsp[-3].TypeVal; ; break;} -case 203: -#line 2091 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +case 204: +#line 2099 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" { std::cerr << "WARNING: Use of eliminated 'not' instruction:" << " Replacing with 'xor'.\n"; @@ -3585,8 +3597,8 @@ ThrowException("Could not create a xor instruction!"); ; break;} -case 204: -#line 2103 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +case 205: +#line 2111 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" { if (yyvsp[0].ValueVal->getType() != Type::UByteTy) ThrowException("Shift amount must be ubyte!"); @@ -3595,8 +3607,8 @@ yyval.InstVal = new ShiftInst(yyvsp[-3].OtherOpVal, yyvsp[-2].ValueVal, yyvsp[0].ValueVal); ; break;} -case 205: -#line 2110 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +case 206: +#line 2118 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" { if (!yyvsp[0].TypeVal->get()->isFirstClassType()) ThrowException("cast instruction to a non-primitive type: '" + @@ -3605,8 +3617,8 @@ delete yyvsp[0].TypeVal; ; break;} -case 206: -#line 2117 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +case 207: +#line 2125 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" { if (yyvsp[-4].ValueVal->getType() != Type::BoolTy) ThrowException("select condition must be boolean!"); @@ -3615,16 +3627,16 @@ yyval.InstVal = new SelectInst(yyvsp[-4].ValueVal, yyvsp[-2].ValueVal, yyvsp[0].ValueVal); ; break;} -case 207: -#line 2124 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +case 208: +#line 2132 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" { NewVarArgs = true; yyval.InstVal = new VAArgInst(yyvsp[-2].ValueVal, *yyvsp[0].TypeVal); delete yyvsp[0].TypeVal; ; break;} -case 208: -#line 2129 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +case 209: +#line 2137 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" { ObsoleteVarArgs = true; const Type* ArgTy = yyvsp[-2].ValueVal->getType(); @@ -3645,8 +3657,8 @@ delete yyvsp[0].TypeVal; ; break;} -case 209: -#line 2148 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +case 210: +#line 2156 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" { ObsoleteVarArgs = true; const Type* ArgTy = yyvsp[-2].ValueVal->getType(); @@ -3670,8 +3682,8 @@ delete yyvsp[0].TypeVal; ; break;} -case 210: -#line 2170 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +case 211: +#line 2178 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" { const Type *Ty = yyvsp[0].PHIList->front().first->getType(); if (!Ty->isFirstClassType()) @@ -3687,8 +3699,8 @@ delete yyvsp[0].PHIList; // Free the list... ; break;} -case 211: -#line 2184 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +case 212: +#line 2192 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" { const PointerType *PFTy; const FunctionType *Ty; @@ -3747,66 +3759,66 @@ delete yyvsp[-1].ValueList; ; break;} -case 212: -#line 2241 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +case 213: +#line 2249 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" { yyval.InstVal = yyvsp[0].InstVal; ; break;} -case 213: -#line 2247 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +case 214: +#line 2255 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" { yyval.ValueList = yyvsp[0].ValueList; ; break;} -case 214: -#line 2249 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +case 215: +#line 2257 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" { yyval.ValueList = new std::vector(); ; break;} -case 215: -#line 2253 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +case 216: +#line 2261 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" { yyval.BoolVal = true; ; break;} -case 216: -#line 2256 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +case 217: +#line 2264 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" { yyval.BoolVal = false; ; break;} -case 217: -#line 2262 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +case 218: +#line 2270 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" { yyval.InstVal = new MallocInst(*yyvsp[-1].TypeVal, 0, yyvsp[0].UIntVal); delete yyvsp[-1].TypeVal; ; break;} -case 218: -#line 2266 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +case 219: +#line 2274 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" { yyval.InstVal = new MallocInst(*yyvsp[-4].TypeVal, getVal(yyvsp[-2].PrimType, yyvsp[-1].ValIDVal), yyvsp[0].UIntVal); delete yyvsp[-4].TypeVal; ; break;} -case 219: -#line 2270 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +case 220: +#line 2278 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" { yyval.InstVal = new AllocaInst(*yyvsp[-1].TypeVal, 0, yyvsp[0].UIntVal); delete yyvsp[-1].TypeVal; ; break;} -case 220: -#line 2274 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +case 221: +#line 2282 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" { yyval.InstVal = new AllocaInst(*yyvsp[-4].TypeVal, getVal(yyvsp[-2].PrimType, yyvsp[-1].ValIDVal), yyvsp[0].UIntVal); delete yyvsp[-4].TypeVal; ; break;} -case 221: -#line 2278 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +case 222: +#line 2286 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" { if (!isa(yyvsp[0].ValueVal->getType())) ThrowException("Trying to free nonpointer type " + @@ -3814,8 +3826,8 @@ yyval.InstVal = new FreeInst(yyvsp[0].ValueVal); ; break;} -case 222: -#line 2285 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +case 223: +#line 2293 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" { if (!isa(yyvsp[-1].TypeVal->get())) ThrowException("Can't load from nonpointer type: " + @@ -3827,8 +3839,8 @@ delete yyvsp[-1].TypeVal; ; break;} -case 223: -#line 2295 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +case 224: +#line 2303 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" { const PointerType *PT = dyn_cast(yyvsp[-1].TypeVal->get()); if (!PT) @@ -3843,8 +3855,8 @@ delete yyvsp[-1].TypeVal; ; break;} -case 224: -#line 2308 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +case 225: +#line 2316 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" { if (!isa(yyvsp[-2].TypeVal->get())) ThrowException("getelementptr insn requires pointer operand!"); @@ -4089,7 +4101,7 @@ } return 1; } -#line 2331 "/Users/sabre/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +#line 2339 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" int yyerror(const char *ErrorMsg) { std::string where From lattner at cs.uiuc.edu Wed Dec 21 12:03:04 2005 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Wed, 21 Dec 2005 12:03:04 -0600 Subject: [llvm-commits] CVS: llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp Message-ID: <200512211803.MAA09738@zion.cs.uiuc.edu> Changes in directory llvm/lib/CodeGen/SelectionDAG: LegalizeDAG.cpp updated: 1.236 -> 1.237 --- Log message: fix a bug I introduced that broke recursive expansion of nodes (e.g. scalarizing vectors) --- Diffs of the changes: (+6 -3) LegalizeDAG.cpp | 9 ++++++--- 1 files changed, 6 insertions(+), 3 deletions(-) Index: llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp diff -u llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp:1.236 llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp:1.237 --- llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp:1.236 Mon Dec 19 18:53:54 2005 +++ llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp Wed Dec 21 12:02:52 2005 @@ -3827,9 +3827,12 @@ std::make_pair(Lo, Hi))).second; assert(isNew && "Value already expanded?!?"); - // Make sure the resultant values have been legalized themselves. - Lo = LegalizeOp(Lo); - Hi = LegalizeOp(Hi); + // Make sure the resultant values have been legalized themselves, unless this + // is a type that requires multi-step expansion. + if (getTypeAction(NVT) != Expand && NVT != MVT::isVoid) { + Lo = LegalizeOp(Lo); + Hi = LegalizeOp(Hi); + } } From lattner at cs.uiuc.edu Wed Dec 21 12:22:32 2005 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Wed, 21 Dec 2005 12:22:32 -0600 Subject: [llvm-commits] CVS: llvm/lib/VMCore/Instructions.cpp Verifier.cpp Message-ID: <200512211822.MAA15781@zion.cs.uiuc.edu> Changes in directory llvm/lib/VMCore: Instructions.cpp updated: 1.28 -> 1.29 Verifier.cpp updated: 1.135 -> 1.136 --- Log message: Get logical operations to like packed types, allow BinOp::getNot to create the right vector of -1's as its operand. --- Diffs of the changes: (+19 -7) Instructions.cpp | 22 ++++++++++++++++------ Verifier.cpp | 4 +++- 2 files changed, 19 insertions(+), 7 deletions(-) Index: llvm/lib/VMCore/Instructions.cpp diff -u llvm/lib/VMCore/Instructions.cpp:1.28 llvm/lib/VMCore/Instructions.cpp:1.29 --- llvm/lib/VMCore/Instructions.cpp:1.28 Sat Nov 5 15:57:54 2005 +++ llvm/lib/VMCore/Instructions.cpp Wed Dec 21 12:22:19 2005 @@ -811,16 +811,17 @@ case Rem: assert(getType() == LHS->getType() && "Arithmetic operation should return same type as operands!"); - assert((getType()->isInteger() || - getType()->isFloatingPoint() || - isa(getType()) ) && + assert((getType()->isInteger() || getType()->isFloatingPoint() || + isa(getType())) && "Tried to create an arithmetic operation on a non-arithmetic type!"); break; case And: case Or: case Xor: assert(getType() == LHS->getType() && "Logical operation should return same type as operands!"); - assert(getType()->isIntegral() && + assert((getType()->isIntegral() || + (isa(getType()) && + cast(getType())->getElementType()->isIntegral())) && "Tried to create a logical operation on a non-integral type!"); break; case SetLT: case SetGT: case SetLE: @@ -889,8 +890,17 @@ BinaryOperator *BinaryOperator::createNot(Value *Op, const std::string &Name, BasicBlock *InsertAtEnd) { - return new BinaryOperator(Instruction::Xor, Op, - ConstantIntegral::getAllOnesValue(Op->getType()), + Constant *AllOnes; + if (const PackedType *PTy = dyn_cast(Op->getType())) { + // Create a vector of all ones values. + Constant *Elt = ConstantIntegral::getAllOnesValue(PTy->getElementType()); + AllOnes = + ConstantPacked::get(std::vector(PTy->getNumElements(), Elt)); + } else { + AllOnes = ConstantIntegral::getAllOnesValue(Op->getType()); + } + + return new BinaryOperator(Instruction::Xor, Op, AllOnes, Op->getType(), Name, InsertAtEnd); } Index: llvm/lib/VMCore/Verifier.cpp diff -u llvm/lib/VMCore/Verifier.cpp:1.135 llvm/lib/VMCore/Verifier.cpp:1.136 --- llvm/lib/VMCore/Verifier.cpp:1.135 Fri Nov 11 10:46:18 2005 +++ llvm/lib/VMCore/Verifier.cpp Wed Dec 21 12:22:19 2005 @@ -498,7 +498,9 @@ // Check that logical operators are only used with integral operands. if (B.getOpcode() == Instruction::And || B.getOpcode() == Instruction::Or || B.getOpcode() == Instruction::Xor) { - Assert1(B.getType()->isIntegral(), + Assert1(B.getType()->isIntegral() || + (isa(B.getType()) && + cast(B.getType())->getElementType()->isIntegral()), "Logical operators only work with integral types!", &B); Assert1(B.getType() == B.getOperand(0)->getType(), "Logical operators must have same type for operands and result!", From lattner at cs.uiuc.edu Wed Dec 21 12:31:41 2005 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Wed, 21 Dec 2005 12:31:41 -0600 Subject: [llvm-commits] CVS: llvm/lib/AsmParser/llvmAsmParser.y Message-ID: <200512211831.MAA20680@zion.cs.uiuc.edu> Changes in directory llvm/lib/AsmParser: llvmAsmParser.y updated: 1.240 -> 1.241 --- Log message: allow logical operators on packed integral types --- Diffs of the changes: (+10 -4) llvmAsmParser.y | 14 ++++++++++---- 1 files changed, 10 insertions(+), 4 deletions(-) Index: llvm/lib/AsmParser/llvmAsmParser.y diff -u llvm/lib/AsmParser/llvmAsmParser.y:1.240 llvm/lib/AsmParser/llvmAsmParser.y:1.241 --- llvm/lib/AsmParser/llvmAsmParser.y:1.240 Wed Dec 21 11:53:02 2005 +++ llvm/lib/AsmParser/llvmAsmParser.y Wed Dec 21 12:31:29 2005 @@ -1501,8 +1501,11 @@ | LogicalOps '(' ConstVal ',' ConstVal ')' { if ($3->getType() != $5->getType()) ThrowException("Logical operator types must match!"); - if (!$3->getType()->isIntegral()) - ThrowException("Logical operands must have integral types!"); + if (!$3->getType()->isIntegral()) { + if (!isa($3->getType()) || + !cast($3->getType())->getElementType()->isIntegral()) + ThrowException("Logical operator requires integral operands!"); + } $$ = ConstantExpr::get($1, $3, $5); } | SetCondOps '(' ConstVal ',' ConstVal ')' { @@ -2079,8 +2082,11 @@ delete $2; } | LogicalOps Types ValueRef ',' ValueRef { - if (!(*$2)->isIntegral()) - ThrowException("Logical operator requires integral operands!"); + if (!(*$2)->isIntegral()) { + if (!isa($2->get()) || + !cast($2->get())->getElementType()->isIntegral()) + ThrowException("Logical operator requires integral operands!"); + } $$ = BinaryOperator::create($1, getVal(*$2, $3), getVal(*$2, $5)); if ($$ == 0) ThrowException("binary operator returned null!"); From lattner at cs.uiuc.edu Wed Dec 21 12:32:03 2005 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Wed, 21 Dec 2005 12:32:03 -0600 Subject: [llvm-commits] CVS: llvm/lib/AsmParser/llvmAsmParser.cpp Message-ID: <200512211832.MAA20737@zion.cs.uiuc.edu> Changes in directory llvm/lib/AsmParser: llvmAsmParser.cpp updated: 1.26 -> 1.27 --- Log message: Regenerate --- Diffs of the changes: (+127 -121) llvmAsmParser.cpp | 248 +++++++++++++++++++++++++++--------------------------- 1 files changed, 127 insertions(+), 121 deletions(-) Index: llvm/lib/AsmParser/llvmAsmParser.cpp diff -u llvm/lib/AsmParser/llvmAsmParser.cpp:1.26 llvm/lib/AsmParser/llvmAsmParser.cpp:1.27 --- llvm/lib/AsmParser/llvmAsmParser.cpp:1.26 Wed Dec 21 11:53:23 2005 +++ llvm/lib/AsmParser/llvmAsmParser.cpp Wed Dec 21 12:31:50 2005 @@ -1175,18 +1175,18 @@ 1154, 1163, 1166, 1174, 1178, 1183, 1184, 1187, 1190, 1200, 1225, 1238, 1266, 1291, 1311, 1323, 1332, 1336, 1395, 1401, 1409, 1414, 1419, 1422, 1425, 1432, 1442, 1473, 1480, 1501, - 1508, 1513, 1523, 1526, 1533, 1533, 1543, 1550, 1554, 1557, - 1560, 1573, 1593, 1595, 1598, 1601, 1605, 1608, 1610, 1612, - 1617, 1618, 1620, 1623, 1631, 1636, 1638, 1642, 1646, 1654, - 1654, 1655, 1655, 1657, 1663, 1668, 1674, 1677, 1682, 1686, - 1690, 1776, 1776, 1778, 1786, 1786, 1788, 1792, 1792, 1801, - 1804, 1807, 1810, 1813, 1816, 1819, 1822, 1825, 1849, 1856, - 1859, 1864, 1864, 1870, 1874, 1877, 1885, 1894, 1898, 1908, - 1919, 1922, 1925, 1928, 1931, 1945, 1949, 2002, 2005, 2011, - 2019, 2029, 2036, 2041, 2048, 2052, 2058, 2058, 2060, 2063, - 2069, 2081, 2089, 2099, 2111, 2118, 2125, 2132, 2137, 2156, - 2178, 2192, 2249, 2255, 2257, 2261, 2264, 2270, 2274, 2278, - 2282, 2286, 2293, 2303, 2316 + 1511, 1516, 1526, 1529, 1536, 1536, 1546, 1553, 1557, 1560, + 1563, 1576, 1596, 1598, 1601, 1604, 1608, 1611, 1613, 1615, + 1620, 1621, 1623, 1626, 1634, 1639, 1641, 1645, 1649, 1657, + 1657, 1658, 1658, 1660, 1666, 1671, 1677, 1680, 1685, 1689, + 1693, 1779, 1779, 1781, 1789, 1789, 1791, 1795, 1795, 1804, + 1807, 1810, 1813, 1816, 1819, 1822, 1825, 1828, 1852, 1859, + 1862, 1867, 1867, 1873, 1877, 1880, 1888, 1897, 1901, 1911, + 1922, 1925, 1928, 1931, 1934, 1948, 1952, 2005, 2008, 2014, + 2022, 2032, 2039, 2044, 2051, 2055, 2061, 2061, 2063, 2066, + 2072, 2084, 2095, 2105, 2117, 2124, 2131, 2138, 2143, 2162, + 2184, 2198, 2255, 2261, 2263, 2267, 2270, 2276, 2280, 2284, + 2288, 2292, 2299, 2309, 2322 }; #endif @@ -2821,13 +2821,16 @@ { if (yyvsp[-3].ConstVal->getType() != yyvsp[-1].ConstVal->getType()) ThrowException("Logical operator types must match!"); - if (!yyvsp[-3].ConstVal->getType()->isIntegral()) - ThrowException("Logical operands must have integral types!"); + if (!yyvsp[-3].ConstVal->getType()->isIntegral()) { + if (!isa(yyvsp[-3].ConstVal->getType()) || + !cast(yyvsp[-3].ConstVal->getType())->getElementType()->isIntegral()) + ThrowException("Logical operator requires integral operands!"); + } yyval.ConstVal = ConstantExpr::get(yyvsp[-5].BinaryOpVal, yyvsp[-3].ConstVal, yyvsp[-1].ConstVal); ; break;} case 111: -#line 1508 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +#line 1511 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" { if (yyvsp[-3].ConstVal->getType() != yyvsp[-1].ConstVal->getType()) ThrowException("setcc operand types must match!"); @@ -2835,7 +2838,7 @@ ; break;} case 112: -#line 1513 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +#line 1516 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" { if (yyvsp[-1].ConstVal->getType() != Type::UByteTy) ThrowException("Shift count for shift constant must be unsigned byte!"); @@ -2845,54 +2848,54 @@ ; break;} case 113: -#line 1523 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +#line 1526 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" { (yyval.ConstVector = yyvsp[-2].ConstVector)->push_back(yyvsp[0].ConstVal); ; break;} case 114: -#line 1526 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +#line 1529 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" { yyval.ConstVector = new std::vector(); yyval.ConstVector->push_back(yyvsp[0].ConstVal); ; break;} case 115: -#line 1533 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +#line 1536 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" { yyval.BoolVal = false; ; break;} case 116: -#line 1533 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +#line 1536 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" { yyval.BoolVal = true; ; break;} case 117: -#line 1543 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +#line 1546 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" { yyval.ModuleVal = ParserResult = yyvsp[0].ModuleVal; CurModule.ModuleDone(); ; break;} case 118: -#line 1550 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +#line 1553 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" { yyval.ModuleVal = yyvsp[-1].ModuleVal; CurFun.FunctionDone(); ; break;} case 119: -#line 1554 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +#line 1557 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" { yyval.ModuleVal = yyvsp[-1].ModuleVal; ; break;} case 120: -#line 1557 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +#line 1560 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" { yyval.ModuleVal = yyvsp[-1].ModuleVal; ; break;} case 121: -#line 1560 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +#line 1563 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" { yyval.ModuleVal = CurModule.CurrentModule; // Emit an error if there are any unresolved types left. @@ -2906,7 +2909,7 @@ ; break;} case 122: -#line 1573 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +#line 1576 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" { // Eagerly resolve types. This is not an optimization, this is a // requirement that is due to the fact that we could have this: @@ -2929,25 +2932,25 @@ ; break;} case 123: -#line 1593 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +#line 1596 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" { // Function prototypes can be in const pool ; break;} case 124: -#line 1595 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +#line 1598 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" { if (yyvsp[0].ConstVal == 0) ThrowException("Global value initializer is not a constant!"); CurGV = ParseGlobalVariable(yyvsp[-3].StrVal, yyvsp[-2].Linkage, yyvsp[-1].BoolVal, yyvsp[0].ConstVal->getType(), yyvsp[0].ConstVal); ; break;} case 125: -#line 1598 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +#line 1601 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" { CurGV = 0; ; break;} case 126: -#line 1601 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +#line 1604 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" { CurGV = ParseGlobalVariable(yyvsp[-3].StrVal, GlobalValue::ExternalLinkage, yyvsp[-1].BoolVal, *yyvsp[0].TypeVal, 0); @@ -2955,42 +2958,42 @@ ; break;} case 127: -#line 1605 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +#line 1608 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" { CurGV = 0; ; break;} case 128: -#line 1608 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +#line 1611 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" { ; break;} case 129: -#line 1610 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +#line 1613 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" { ; break;} case 130: -#line 1612 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +#line 1615 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" { ; break;} case 131: -#line 1617 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +#line 1620 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" { yyval.Endianness = Module::BigEndian; ; break;} case 132: -#line 1618 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +#line 1621 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" { yyval.Endianness = Module::LittleEndian; ; break;} case 133: -#line 1620 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +#line 1623 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" { CurModule.CurrentModule->setEndianness(yyvsp[0].Endianness); ; break;} case 134: -#line 1623 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +#line 1626 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" { if (yyvsp[0].UInt64Val == 32) CurModule.CurrentModule->setPointerSize(Module::Pointer32); @@ -3001,37 +3004,37 @@ ; break;} case 135: -#line 1631 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +#line 1634 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" { CurModule.CurrentModule->setTargetTriple(yyvsp[0].StrVal); free(yyvsp[0].StrVal); ; break;} case 137: -#line 1638 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +#line 1641 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" { CurModule.CurrentModule->addLibrary(yyvsp[0].StrVal); free(yyvsp[0].StrVal); ; break;} case 138: -#line 1642 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +#line 1645 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" { CurModule.CurrentModule->addLibrary(yyvsp[0].StrVal); free(yyvsp[0].StrVal); ; break;} case 139: -#line 1646 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +#line 1649 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" { ; break;} case 143: -#line 1655 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +#line 1658 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" { yyval.StrVal = 0; ; break;} case 144: -#line 1657 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +#line 1660 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" { if (*yyvsp[-1].TypeVal == Type::VoidTy) ThrowException("void typed arguments are invalid!"); @@ -3039,7 +3042,7 @@ ; break;} case 145: -#line 1663 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +#line 1666 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" { yyval.ArgList = yyvsp[-2].ArgList; yyvsp[-2].ArgList->push_back(*yyvsp[0].ArgVal); @@ -3047,7 +3050,7 @@ ; break;} case 146: -#line 1668 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +#line 1671 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" { yyval.ArgList = new std::vector >(); yyval.ArgList->push_back(*yyvsp[0].ArgVal); @@ -3055,13 +3058,13 @@ ; break;} case 147: -#line 1674 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +#line 1677 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" { yyval.ArgList = yyvsp[0].ArgList; ; break;} case 148: -#line 1677 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +#line 1680 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" { yyval.ArgList = yyvsp[-2].ArgList; yyval.ArgList->push_back(std::pair >(); yyval.ArgList->push_back(std::make_pair(new PATypeHolder(Type::VoidTy), (char*)0)); ; break;} case 150: -#line 1686 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +#line 1689 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" { yyval.ArgList = 0; ; break;} case 151: -#line 1691 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +#line 1694 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" { UnEscapeLexed(yyvsp[-5].StrVal); std::string FunctionName(yyvsp[-5].StrVal); @@ -3169,7 +3172,7 @@ ; break;} case 154: -#line 1778 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +#line 1781 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" { yyval.FunctionVal = CurFun.CurrentFunction; @@ -3179,72 +3182,72 @@ ; break;} case 157: -#line 1788 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +#line 1791 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" { yyval.FunctionVal = yyvsp[-1].FunctionVal; ; break;} case 158: -#line 1792 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +#line 1795 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" { CurFun.isDeclare = true; ; break;} case 159: -#line 1792 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +#line 1795 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" { yyval.FunctionVal = CurFun.CurrentFunction; CurFun.FunctionDone(); ; break;} case 160: -#line 1801 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +#line 1804 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" { // A reference to a direct constant yyval.ValIDVal = ValID::create(yyvsp[0].SInt64Val); ; break;} case 161: -#line 1804 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +#line 1807 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" { yyval.ValIDVal = ValID::create(yyvsp[0].UInt64Val); ; break;} case 162: -#line 1807 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +#line 1810 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" { // Perhaps it's an FP constant? yyval.ValIDVal = ValID::create(yyvsp[0].FPVal); ; break;} case 163: -#line 1810 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +#line 1813 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" { yyval.ValIDVal = ValID::create(ConstantBool::True); ; break;} case 164: -#line 1813 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +#line 1816 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" { yyval.ValIDVal = ValID::create(ConstantBool::False); ; break;} case 165: -#line 1816 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +#line 1819 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" { yyval.ValIDVal = ValID::createNull(); ; break;} case 166: -#line 1819 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +#line 1822 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" { yyval.ValIDVal = ValID::createUndef(); ; break;} case 167: -#line 1822 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +#line 1825 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" { // A vector zero constant. yyval.ValIDVal = ValID::createZeroInit(); ; break;} case 168: -#line 1825 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +#line 1828 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" { // Nonempty unsized packed vector const Type *ETy = (*yyvsp[-1].ConstVector)[0]->getType(); int NumElements = yyvsp[-1].ConstVector->size(); @@ -3271,43 +3274,43 @@ ; break;} case 169: -#line 1849 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +#line 1852 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" { yyval.ValIDVal = ValID::create(yyvsp[0].ConstVal); ; break;} case 170: -#line 1856 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +#line 1859 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" { // Is it an integer reference...? yyval.ValIDVal = ValID::create(yyvsp[0].SIntVal); ; break;} case 171: -#line 1859 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +#line 1862 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" { // Is it a named reference...? yyval.ValIDVal = ValID::create(yyvsp[0].StrVal); ; break;} case 174: -#line 1870 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +#line 1873 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" { yyval.ValueVal = getVal(*yyvsp[-1].TypeVal, yyvsp[0].ValIDVal); delete yyvsp[-1].TypeVal; ; break;} case 175: -#line 1874 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +#line 1877 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" { yyval.FunctionVal = yyvsp[-1].FunctionVal; ; break;} case 176: -#line 1877 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +#line 1880 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" { // Do not allow functions with 0 basic blocks yyval.FunctionVal = yyvsp[-1].FunctionVal; ; break;} case 177: -#line 1885 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +#line 1888 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" { setValueName(yyvsp[0].TermInstVal, yyvsp[-1].StrVal); InsertValue(yyvsp[0].TermInstVal); @@ -3318,14 +3321,14 @@ ; break;} case 178: -#line 1894 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +#line 1897 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" { yyvsp[-1].BasicBlockVal->getInstList().push_back(yyvsp[0].InstVal); yyval.BasicBlockVal = yyvsp[-1].BasicBlockVal; ; break;} case 179: -#line 1898 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +#line 1901 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" { yyval.BasicBlockVal = CurBB = getBBVal(ValID::create((int)CurFun.NextBBNum++), true); @@ -3338,7 +3341,7 @@ ; break;} case 180: -#line 1908 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +#line 1911 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" { yyval.BasicBlockVal = CurBB = getBBVal(ValID::create(yyvsp[0].StrVal), true); @@ -3351,31 +3354,31 @@ ; break;} case 181: -#line 1919 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +#line 1922 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" { // Return with a result... yyval.TermInstVal = new ReturnInst(yyvsp[0].ValueVal); ; break;} case 182: -#line 1922 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +#line 1925 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" { // Return with no result... yyval.TermInstVal = new ReturnInst(); ; break;} case 183: -#line 1925 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +#line 1928 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" { // Unconditional Branch... yyval.TermInstVal = new BranchInst(getBBVal(yyvsp[0].ValIDVal)); ; break;} case 184: -#line 1928 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +#line 1931 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" { yyval.TermInstVal = new BranchInst(getBBVal(yyvsp[-3].ValIDVal), getBBVal(yyvsp[0].ValIDVal), getVal(Type::BoolTy, yyvsp[-6].ValIDVal)); ; break;} case 185: -#line 1931 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +#line 1934 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" { SwitchInst *S = new SwitchInst(getVal(yyvsp[-7].PrimType, yyvsp[-6].ValIDVal), getBBVal(yyvsp[-3].ValIDVal), yyvsp[-1].JumpTable->size()); yyval.TermInstVal = S; @@ -3392,14 +3395,14 @@ ; break;} case 186: -#line 1945 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +#line 1948 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" { SwitchInst *S = new SwitchInst(getVal(yyvsp[-6].PrimType, yyvsp[-5].ValIDVal), getBBVal(yyvsp[-2].ValIDVal), 0); yyval.TermInstVal = S; ; break;} case 187: -#line 1950 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +#line 1953 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" { const PointerType *PFTy; const FunctionType *Ty; @@ -3454,19 +3457,19 @@ ; break;} case 188: -#line 2002 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +#line 2005 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" { yyval.TermInstVal = new UnwindInst(); ; break;} case 189: -#line 2005 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +#line 2008 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" { yyval.TermInstVal = new UnreachableInst(); ; break;} case 190: -#line 2011 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +#line 2014 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" { yyval.JumpTable = yyvsp[-5].JumpTable; Constant *V = cast(getValNonImprovising(yyvsp[-4].PrimType, yyvsp[-3].ValIDVal)); @@ -3477,7 +3480,7 @@ ; break;} case 191: -#line 2019 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +#line 2022 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" { yyval.JumpTable = new std::vector >(); Constant *V = cast(getValNonImprovising(yyvsp[-4].PrimType, yyvsp[-3].ValIDVal)); @@ -3489,7 +3492,7 @@ ; break;} case 192: -#line 2029 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +#line 2032 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" { // Is this definition named?? if so, assign the name... setValueName(yyvsp[0].InstVal, yyvsp[-1].StrVal); @@ -3498,7 +3501,7 @@ ; break;} case 193: -#line 2036 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +#line 2039 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" { // Used for PHI nodes yyval.PHIList = new std::list >(); yyval.PHIList->push_back(std::make_pair(getVal(*yyvsp[-5].TypeVal, yyvsp[-3].ValIDVal), getBBVal(yyvsp[-1].ValIDVal))); @@ -3506,7 +3509,7 @@ ; break;} case 194: -#line 2041 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +#line 2044 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" { yyval.PHIList = yyvsp[-6].PHIList; yyvsp[-6].PHIList->push_back(std::make_pair(getVal(yyvsp[-6].PHIList->front().first->getType(), yyvsp[-3].ValIDVal), @@ -3514,37 +3517,37 @@ ; break;} case 195: -#line 2048 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +#line 2051 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" { // Used for call statements, and memory insts... yyval.ValueList = new std::vector(); yyval.ValueList->push_back(yyvsp[0].ValueVal); ; break;} case 196: -#line 2052 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +#line 2055 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" { yyval.ValueList = yyvsp[-2].ValueList; yyvsp[-2].ValueList->push_back(yyvsp[0].ValueVal); ; break;} case 198: -#line 2058 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +#line 2061 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" { yyval.ValueList = 0; ; break;} case 199: -#line 2060 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +#line 2063 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" { yyval.BoolVal = true; ; break;} case 200: -#line 2063 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +#line 2066 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" { yyval.BoolVal = false; ; break;} case 201: -#line 2069 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +#line 2072 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" { if (!(*yyvsp[-3].TypeVal)->isInteger() && !(*yyvsp[-3].TypeVal)->isFloatingPoint() && !isa((*yyvsp[-3].TypeVal).get())) @@ -3559,10 +3562,13 @@ ; break;} case 202: -#line 2081 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +#line 2084 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" { - if (!(*yyvsp[-3].TypeVal)->isIntegral()) - ThrowException("Logical operator requires integral operands!"); + if (!(*yyvsp[-3].TypeVal)->isIntegral()) { + if (!isa(yyvsp[-3].TypeVal->get()) || + !cast(yyvsp[-3].TypeVal->get())->getElementType()->isIntegral()) + ThrowException("Logical operator requires integral operands!"); + } yyval.InstVal = BinaryOperator::create(yyvsp[-4].BinaryOpVal, getVal(*yyvsp[-3].TypeVal, yyvsp[-2].ValIDVal), getVal(*yyvsp[-3].TypeVal, yyvsp[0].ValIDVal)); if (yyval.InstVal == 0) ThrowException("binary operator returned null!"); @@ -3570,7 +3576,7 @@ ; break;} case 203: -#line 2089 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +#line 2095 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" { if(isa((*yyvsp[-3].TypeVal).get())) { ThrowException( @@ -3583,7 +3589,7 @@ ; break;} case 204: -#line 2099 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +#line 2105 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" { std::cerr << "WARNING: Use of eliminated 'not' instruction:" << " Replacing with 'xor'.\n"; @@ -3598,7 +3604,7 @@ ; break;} case 205: -#line 2111 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +#line 2117 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" { if (yyvsp[0].ValueVal->getType() != Type::UByteTy) ThrowException("Shift amount must be ubyte!"); @@ -3608,7 +3614,7 @@ ; break;} case 206: -#line 2118 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +#line 2124 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" { if (!yyvsp[0].TypeVal->get()->isFirstClassType()) ThrowException("cast instruction to a non-primitive type: '" + @@ -3618,7 +3624,7 @@ ; break;} case 207: -#line 2125 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +#line 2131 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" { if (yyvsp[-4].ValueVal->getType() != Type::BoolTy) ThrowException("select condition must be boolean!"); @@ -3628,7 +3634,7 @@ ; break;} case 208: -#line 2132 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +#line 2138 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" { NewVarArgs = true; yyval.InstVal = new VAArgInst(yyvsp[-2].ValueVal, *yyvsp[0].TypeVal); @@ -3636,7 +3642,7 @@ ; break;} case 209: -#line 2137 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +#line 2143 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" { ObsoleteVarArgs = true; const Type* ArgTy = yyvsp[-2].ValueVal->getType(); @@ -3658,7 +3664,7 @@ ; break;} case 210: -#line 2156 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +#line 2162 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" { ObsoleteVarArgs = true; const Type* ArgTy = yyvsp[-2].ValueVal->getType(); @@ -3683,7 +3689,7 @@ ; break;} case 211: -#line 2178 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +#line 2184 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" { const Type *Ty = yyvsp[0].PHIList->front().first->getType(); if (!Ty->isFirstClassType()) @@ -3700,7 +3706,7 @@ ; break;} case 212: -#line 2192 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +#line 2198 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" { const PointerType *PFTy; const FunctionType *Ty; @@ -3760,65 +3766,65 @@ ; break;} case 213: -#line 2249 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +#line 2255 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" { yyval.InstVal = yyvsp[0].InstVal; ; break;} case 214: -#line 2255 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +#line 2261 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" { yyval.ValueList = yyvsp[0].ValueList; ; break;} case 215: -#line 2257 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +#line 2263 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" { yyval.ValueList = new std::vector(); ; break;} case 216: -#line 2261 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +#line 2267 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" { yyval.BoolVal = true; ; break;} case 217: -#line 2264 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +#line 2270 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" { yyval.BoolVal = false; ; break;} case 218: -#line 2270 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +#line 2276 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" { yyval.InstVal = new MallocInst(*yyvsp[-1].TypeVal, 0, yyvsp[0].UIntVal); delete yyvsp[-1].TypeVal; ; break;} case 219: -#line 2274 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +#line 2280 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" { yyval.InstVal = new MallocInst(*yyvsp[-4].TypeVal, getVal(yyvsp[-2].PrimType, yyvsp[-1].ValIDVal), yyvsp[0].UIntVal); delete yyvsp[-4].TypeVal; ; break;} case 220: -#line 2278 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +#line 2284 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" { yyval.InstVal = new AllocaInst(*yyvsp[-1].TypeVal, 0, yyvsp[0].UIntVal); delete yyvsp[-1].TypeVal; ; break;} case 221: -#line 2282 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +#line 2288 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" { yyval.InstVal = new AllocaInst(*yyvsp[-4].TypeVal, getVal(yyvsp[-2].PrimType, yyvsp[-1].ValIDVal), yyvsp[0].UIntVal); delete yyvsp[-4].TypeVal; ; break;} case 222: -#line 2286 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +#line 2292 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" { if (!isa(yyvsp[0].ValueVal->getType())) ThrowException("Trying to free nonpointer type " + @@ -3827,7 +3833,7 @@ ; break;} case 223: -#line 2293 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +#line 2299 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" { if (!isa(yyvsp[-1].TypeVal->get())) ThrowException("Can't load from nonpointer type: " + @@ -3840,7 +3846,7 @@ ; break;} case 224: -#line 2303 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +#line 2309 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" { const PointerType *PT = dyn_cast(yyvsp[-1].TypeVal->get()); if (!PT) @@ -3856,7 +3862,7 @@ ; break;} case 225: -#line 2316 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +#line 2322 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" { if (!isa(yyvsp[-2].TypeVal->get())) ThrowException("getelementptr insn requires pointer operand!"); @@ -4101,7 +4107,7 @@ } return 1; } -#line 2339 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" +#line 2345 "/Volumes/ProjectsDisk/cvs/llvm/lib/AsmParser/llvmAsmParser.y" int yyerror(const char *ErrorMsg) { std::string where From lattner at cs.uiuc.edu Wed Dec 21 13:35:17 2005 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Wed, 21 Dec 2005 13:35:17 -0600 Subject: [llvm-commits] CVS: llvm-test/Makefile.programs Message-ID: <200512211935.NAA28579@zion.cs.uiuc.edu> Changes in directory llvm-test: Makefile.programs updated: 1.181 -> 1.182 --- Log message: Change beta options back --- Diffs of the changes: (+2 -4) Makefile.programs | 6 ++---- 1 files changed, 2 insertions(+), 4 deletions(-) Index: llvm-test/Makefile.programs diff -u llvm-test/Makefile.programs:1.181 llvm-test/Makefile.programs:1.182 --- llvm-test/Makefile.programs:1.181 Mon Dec 5 01:04:22 2005 +++ llvm-test/Makefile.programs Wed Dec 21 13:35:05 2005 @@ -187,8 +187,7 @@ endif#DISABLE_DIFFS ifeq ($(ARCH),PowerPC) -LLCBETAOPTION := -enable-gep-isel-opt -#-sched=simple +LLCBETAOPTION := -sched=simple endif ifeq ($(ARCH),Alpha) LLCBETAOPTION := -enable-dag-isel-for-alpha @@ -198,8 +197,7 @@ LLCBETAOPTION := -enable-ia64-dag-isel endif ifeq ($(ARCH),x86) -LLCBETAOPTION := -enable-gep-isel-opt -#-enable-x86-fastcc +LLCBETAOPTION := -enable-x86-fastcc endif # Given a version of the entire program linked together into a single unit of From lattner at cs.uiuc.edu Wed Dec 21 13:36:48 2005 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Wed, 21 Dec 2005 13:36:48 -0600 Subject: [llvm-commits] CVS: llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp Message-ID: <200512211936.NAA28644@zion.cs.uiuc.edu> Changes in directory llvm/lib/CodeGen/SelectionDAG: SelectionDAGISel.cpp updated: 1.118 -> 1.119 --- Log message: enable the gep isel opt --- Diffs of the changes: (+0 -6) SelectionDAGISel.cpp | 6 ------ 1 files changed, 6 deletions(-) Index: llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp diff -u llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.118 llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.119 --- llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.118 Tue Dec 20 20:43:26 2005 +++ llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp Wed Dec 21 13:36:36 2005 @@ -40,10 +40,6 @@ #include using namespace llvm; -static cl::opt -GEPISelTest("enable-gep-isel-opt", cl::Hidden, - cl::desc("temporary for testing")); - #ifndef NDEBUG static cl::opt ViewDAGs("view-isel-dags", cl::Hidden, @@ -1315,8 +1311,6 @@ /// indices into blocks that use it. static void OptimizeGEPExpression(GetElementPtrInst *GEPI, const TargetData &TD) { - if (!GEPISelTest) return; - // If this GEP is only used inside the block it is defined in, there is no // need to rewrite it. bool isUsedOutsideDefBB = false; From lattner at cs.uiuc.edu Wed Dec 21 13:40:55 2005 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Wed, 21 Dec 2005 13:40:55 -0600 Subject: [llvm-commits] CVS: llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp Message-ID: <200512211940.NAA28936@zion.cs.uiuc.edu> Changes in directory llvm/lib/CodeGen/SelectionDAG: LegalizeDAG.cpp updated: 1.237 -> 1.238 --- Log message: make sure to relegalize all cases --- Diffs of the changes: (+1 -1) LegalizeDAG.cpp | 2 +- 1 files changed, 1 insertion(+), 1 deletion(-) Index: llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp diff -u llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp:1.237 llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp:1.238 --- llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp:1.237 Wed Dec 21 12:02:52 2005 +++ llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp Wed Dec 21 13:40:42 2005 @@ -1036,9 +1036,9 @@ Result = DAG.getNode(ISD::BRCOND, MVT::Other, Tmp1, Tmp2, Node->getOperand(4)); Result = DAG.getNode(ISD::BR, MVT::Other, Result, Node->getOperand(5)); - Result = LegalizeOp(Result); // Relegalize new nodes. break; } + Result = LegalizeOp(Result); // Relegalize new nodes. } break; case ISD::LOAD: From jlaskey at apple.com Wed Dec 21 13:44:52 2005 From: jlaskey at apple.com (Jim Laskey) Date: Wed, 21 Dec 2005 13:44:52 -0600 Subject: [llvm-commits] CVS: llvm/include/llvm/CodeGen/DwarfWriter.h Message-ID: <200512211944.NAA29219@zion.cs.uiuc.edu> Changes in directory llvm/include/llvm/CodeGen: DwarfWriter.h added (r1.1) --- Log message: Start of Dwarf framework code. --- Diffs of the changes: (+424 -0) DwarfWriter.h | 424 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 424 insertions(+) Index: llvm/include/llvm/CodeGen/DwarfWriter.h diff -c /dev/null llvm/include/llvm/CodeGen/DwarfWriter.h:1.1 *** /dev/null Wed Dec 21 13:44:50 2005 --- llvm/include/llvm/CodeGen/DwarfWriter.h Wed Dec 21 13:44:40 2005 *************** *** 0 **** --- 1,424 ---- + //===-- llvm/CodeGen/DwarfWriter.h - Dwarf Framework ------------*- C++ -*-===// + // + // The LLVM Compiler Infrastructure + // + // This file was developed by James M. Laskey and is distributed under the + // University of Illinois Open Source License. See LICENSE.TXT for details. + // + //===----------------------------------------------------------------------===// + // + // This file contains support for writing dwarf debug info into asm files. + // + //===----------------------------------------------------------------------===// + + #ifndef LLVM_CODEGEN_DWARFPRINTER_H + #define LLVM_CODEGEN_DWARFPRINTER_H + + //===----------------------------------------------------------------------===// + // Dwarf constants as gleaned from the DWARF Debugging Information Format V.3 + // reference manual http://dwarf.freestandards.org. + // + enum dwarf_constants { + // Tags + DW_TAG_array_type = 0x01, + DW_TAG_class_type = 0x02, + DW_TAG_entry_point = 0x03, + DW_TAG_enumeration_type = 0x04, + DW_TAG_formal_parameter = 0x05, + DW_TAG_imported_declaration = 0x08, + DW_TAG_label = 0x0a, + DW_TAG_lexical_block = 0x0b, + DW_TAG_member = 0x0d, + DW_TAG_pointer_type = 0x0f, + DW_TAG_reference_type = 0x10, + DW_TAG_compile_unit = 0x11, + DW_TAG_string_type = 0x12, + DW_TAG_structure_type = 0x13, + DW_TAG_subroutine_type = 0x15, + DW_TAG_typedef = 0x16, + DW_TAG_union_type = 0x17, + DW_TAG_unspecified_parameters = 0x18, + DW_TAG_variant = 0x19, + DW_TAG_common_block = 0x1a, + DW_TAG_common_inclusion = 0x1b, + DW_TAG_inheritance = 0x1c, + DW_TAG_inlined_subroutine = 0x1d, + DW_TAG_module = 0x1e, + DW_TAG_ptr_to_member_type = 0x1f, + DW_TAG_set_type = 0x20, + DW_TAG_subrange_type = 0x21, + DW_TAG_with_stmt = 0x22, + DW_TAG_access_declaration = 0x23, + DW_TAG_base_type = 0x24, + DW_TAG_catch_block = 0x25, + DW_TAG_const_type = 0x26, + DW_TAG_constant = 0x27, + DW_TAG_enumerator = 0x28, + DW_TAG_file_type = 0x29, + DW_TAG_friend = 0x2a, + DW_TAG_namelist = 0x2b, + DW_TAG_namelist_item = 0x2c, + DW_TAG_packed_type = 0x2d, + DW_TAG_subprogram = 0x2e, + DW_TAG_template_type_parameter = 0x2f, + DW_TAG_template_value_parameter = 0x30, + DW_TAG_thrown_type = 0x31, + DW_TAG_try_block = 0x32, + DW_TAG_variant_part = 0x33, + DW_TAG_variable = 0x34, + DW_TAG_volatile_type = 0x35, + DW_TAG_dwarf_procedure = 0x36, + DW_TAG_restrict_type = 0x37, + DW_TAG_interface_type = 0x38, + DW_TAG_namespace = 0x39, + DW_TAG_imported_module = 0x3a, + DW_TAG_unspecified_type = 0x3b, + DW_TAG_partial_unit = 0x3c, + DW_TAG_imported_unit = 0x3d, + DW_TAG_condition = 0x3f, + DW_TAG_shared_type = 0x40, + DW_TAG_lo_user = 0x4080, + DW_TAG_hi_user = 0xffff, + + // Children flag + DW_CHILDREN_no = 0x00, + DW_CHILDREN_yes = 0x01, + + // Attributes + DW_AT_sibling = 0x01, + DW_AT_location = 0x02, + DW_AT_name = 0x03, + DW_AT_ordering = 0x09, + DW_AT_byte_size = 0x0b, + DW_AT_bit_offset = 0x0c, + DW_AT_bit_size = 0x0d, + DW_AT_stmt_list = 0x10, + DW_AT_low_pc = 0x11, + DW_AT_high_pc = 0x12, + DW_AT_language = 0x13, + DW_AT_discr = 0x15, + DW_AT_discr_value = 0x16, + DW_AT_visibility = 0x17, + DW_AT_import = 0x18, + DW_AT_string_length = 0x19, + DW_AT_common_reference = 0x1a, + DW_AT_comp_dir = 0x1b, + DW_AT_const_value = 0x1c, + DW_AT_containing_type = 0x1d, + DW_AT_default_value = 0x1e, + DW_AT_inline = 0x20, + DW_AT_is_optional = 0x21, + DW_AT_lower_bound = 0x22, + DW_AT_producer = 0x25, + DW_AT_prototyped = 0x27, + DW_AT_return_addr = 0x2a, + DW_AT_start_scope = 0x2c, + DW_AT_bit_stride = 0x2e, + DW_AT_upper_bound = 0x2f, + DW_AT_abstract_origin = 0x31, + DW_AT_accessibility = 0x32, + DW_AT_address_class = 0x33, + DW_AT_artificial = 0x34, + DW_AT_base_types = 0x35, + DW_AT_calling_convention = 0x36, + DW_AT_count = 0x37, + DW_AT_data_member_location = 0x38, + DW_AT_decl_column = 0x39, + DW_AT_decl_file = 0x3a, + DW_AT_decl_line = 0x3b, + DW_AT_declaration = 0x3c, + DW_AT_discr_list = 0x3d, + DW_AT_encoding = 0x3e, + DW_AT_external = 0x3f, + DW_AT_frame_base = 0x40, + DW_AT_friend = 0x41, + DW_AT_identifier_case = 0x42, + DW_AT_macro_info = 0x43, + DW_AT_namelist_item = 0x44, + DW_AT_priority = 0x45, + DW_AT_segment = 0x46, + DW_AT_specification = 0x47, + DW_AT_static_link = 0x48, + DW_AT_type = 0x49, + DW_AT_use_location = 0x4a, + DW_AT_variable_parameter = 0x4b, + DW_AT_virtuality = 0x4c, + DW_AT_vtable_elem_location = 0x4d, + DW_AT_allocated = 0x4e, + DW_AT_associated = 0x4f, + DW_AT_data_location = 0x50, + DW_AT_byte_stride = 0x51, + DW_AT_entry_pc = 0x52, + DW_AT_use_UTF8 = 0x53, + DW_AT_extension = 0x54, + DW_AT_ranges = 0x55, + DW_AT_trampoline = 0x56, + DW_AT_call_column = 0x57, + DW_AT_call_file = 0x58, + DW_AT_call_line = 0x59, + DW_AT_description = 0x5a, + DW_AT_binary_scale = 0x5b, + DW_AT_decimal_scale = 0x5c, + DW_AT_small = 0x5d, + DW_AT_decimal_sign = 0x5e, + DW_AT_digit_count = 0x5f, + DW_AT_picture_string = 0x60, + DW_AT_mutable = 0x61, + DW_AT_threads_scaled = 0x62, + DW_AT_explicit = 0x63, + DW_AT_object_pointer = 0x64, + DW_AT_endianity = 0x65, + DW_AT_elemental = 0x66, + DW_AT_pure = 0x67, + DW_AT_recursive = 0x68, + DW_AT_lo_user = 0x2000, + DW_AT_hi_user = 0x3fff, + + // Attribute form encodings + DW_FORM_addr = 0x01, + DW_FORM_block2 = 0x03, + DW_FORM_block4 = 0x04, + DW_FORM_data2 = 0x05, + DW_FORM_data4 = 0x06, + DW_FORM_data8 = 0x07, + DW_FORM_string = 0x08, + DW_FORM_block = 0x09, + DW_FORM_block1 = 0x0a, + DW_FORM_data1 = 0x0b, + DW_FORM_flag = 0x0c, + DW_FORM_sdata = 0x0d, + DW_FORM_strp = 0x0e, + DW_FORM_udata = 0x0f, + DW_FORM_ref_addr = 0x10, + DW_FORM_ref1 = 0x11, + DW_FORM_ref2 = 0x12, + DW_FORM_ref4 = 0x13, + DW_FORM_ref8 = 0x14, + DW_FORM_ref_udata = 0x15, + DW_FORM_indirect = 0x16, + + // Operation encodings + DW_OP_addr = 0x03, + DW_OP_deref = 0x06, + DW_OP_const1u = 0x08, + DW_OP_const1s = 0x09, + DW_OP_const2u = 0x0a, + DW_OP_const2s = 0x0b, + DW_OP_const4u = 0x0c, + DW_OP_const4s = 0x0d, + DW_OP_const8u = 0x0e, + DW_OP_const8s = 0x0f, + DW_OP_constu = 0x10, + DW_OP_consts = 0x11, + DW_OP_dup = 0x12, + DW_OP_drop = 0x13, + DW_OP_over = 0x14, + DW_OP_pick = 0x15, + DW_OP_swap = 0x16, + DW_OP_rot = 0x17, + DW_OP_xderef = 0x18, + DW_OP_abs = 0x19, + DW_OP_and = 0x1a, + DW_OP_div = 0x1b, + DW_OP_minus = 0x1c, + DW_OP_mod = 0x1d, + DW_OP_mul = 0x1e, + DW_OP_neg = 0x1f, + DW_OP_not = 0x20, + DW_OP_or = 0x21, + DW_OP_plus = 0x22, + DW_OP_plus_uconst = 0x23, + DW_OP_shl = 0x24, + DW_OP_shr = 0x25, + DW_OP_shra = 0x26, + DW_OP_xor = 0x27, + DW_OP_skip = 0x2f, + DW_OP_bra = 0x28, + DW_OP_eq = 0x29, + DW_OP_ge = 0x2a, + DW_OP_gt = 0x2b, + DW_OP_le = 0x2c, + DW_OP_lt = 0x2d, + DW_OP_ne = 0x2e, + DW_OP_lit0 = 0x30, + DW_OP_lit1 = 0x31, + DW_OP_lit31 = 0x4f, + DW_OP_reg0 = 0x50, + DW_OP_reg1 = 0x51, + DW_OP_reg31 = 0x6f, + DW_OP_breg0 = 0x70, + DW_OP_breg1 = 0x71, + DW_OP_breg31 = 0x8f, + DW_OP_regx = 0x90, + DW_OP_fbreg = 0x91, + DW_OP_bregx = 0x92, + DW_OP_piece = 0x93, + DW_OP_deref_size = 0x94, + DW_OP_xderef_size = 0x95, + DW_OP_nop = 0x96, + DW_OP_push_object_address = 0x97, + DW_OP_call2 = 0x98, + DW_OP_call4 = 0x99, + DW_OP_call_ref = 0x9a, + DW_OP_form_tls_address = 0x9b, + DW_OP_call_frame_cfa = 0x9c, + DW_OP_lo_user = 0xe0, + DW_OP_hi_user = 0xff, + + // Encoding attribute values + DW_ATE_address = 0x01, + DW_ATE_boolean = 0x02, + DW_ATE_complex_float = 0x03, + DW_ATE_float = 0x04, + DW_ATE_signed = 0x05, + DW_ATE_signed_char = 0x06, + DW_ATE_unsigned = 0x07, + DW_ATE_unsigned_char = 0x08, + DW_ATE_imaginary_float = 0x09, + DW_ATE_packed_decimal = 0x0a, + DW_ATE_numeric_string = 0x0b, + DW_ATE_edited = 0x0c, + DW_ATE_signed_fixed = 0x0d, + DW_ATE_unsigned_fixed = 0x0e, + DW_ATE_decimal_float = 0x0f, + DW_ATE_lo_user = 0x80, + DW_ATE_hi_user = 0xff, + + // Decimal sign attribute values + DW_DS_unsigned = 0x01, + DW_DS_leading_overpunch = 0x02, + DW_DS_trailing_overpunch = 0x03, + DW_DS_leading_separate = 0x04, + DW_DS_trailing_separate = 0x05, + + // Endianity attribute values + DW_END_default = 0x00, + DW_END_big = 0x01, + DW_END_little = 0x02, + DW_END_lo_user = 0x40, + DW_END_hi_user = 0xff, + + // Accessibility codes + DW_ACCESS_public = 0x01, + DW_ACCESS_protected = 0x02, + DW_ACCESS_private = 0x03, + + // Visibility codes + DW_VIS_local = 0x01, + DW_VIS_exported = 0x02, + DW_VIS_qualified = 0x03, + + // Virtuality codes + DW_VIRTUALITY_none = 0x00, + DW_VIRTUALITY_virtual = 0x01, + DW_VIRTUALITY_pure_virtual = 0x02, + + // Language names + DW_LANG_C89 = 0x0001, + DW_LANG_C = 0x0002, + DW_LANG_Ada83 = 0x0003, + DW_LANG_C_plus_plus = 0x0004, + DW_LANG_Cobol74 = 0x0005, + DW_LANG_Cobol85 = 0x0006, + DW_LANG_Fortran77 = 0x0007, + DW_LANG_Fortran90 = 0x0008, + DW_LANG_Pascal83 = 0x0009, + DW_LANG_Modula2 = 0x000a, + DW_LANG_Java = 0x000b, + DW_LANG_C99 = 0x000c, + DW_LANG_Ada95 = 0x000d, + DW_LANG_Fortran95 = 0x000e, + DW_LANG_PLI = 0x000f, + DW_LANG_ObjC = 0x0010, + DW_LANG_ObjC_plus_plus = 0x0011, + DW_LANG_UPC = 0x0012, + DW_LANG_D = 0x0013, + DW_LANG_lo_user = 0x8000, + DW_LANG_hi_user = 0xffff, + + // Identifier case codes + DW_ID_case_sensitive = 0x00, + DW_ID_up_case = 0x01, + DW_ID_down_case = 0x02, + DW_ID_case_insensitive = 0x03, + + // Calling convention codes + DW_CC_normal = 0x01, + DW_CC_program = 0x02, + DW_CC_nocall = 0x03, + DW_CC_lo_user = 0x40, + DW_CC_hi_user = 0xff, + + // Inline codes + DW_INL_not_inlined = 0x00, + DW_INL_inlined = 0x01, + DW_INL_declared_not_inlined = 0x02, + DW_INL_declared_inlined = 0x03, + + // Array ordering + DW_ORD_row_major = 0x00, + DW_ORD_col_major = 0x01, + + // Discriminant descriptor values + DW_DSC_label = 0x00, + DW_DSC_range = 0x01, + + // Line Number Standard Opcode Encodings + DW_LNS_copy = 0x01, + DW_LNS_advance_pc = 0x02, + DW_LNS_advance_line = 0x03, + DW_LNS_set_file = 0x04, + DW_LNS_set_column = 0x05, + DW_LNS_negate_stmt = 0x06, + DW_LNS_set_basic_block = 0x07, + DW_LNS_const_add_pc = 0x08, + DW_LNS_fixed_advance_pc = 0x09, + DW_LNS_set_prologue_end = 0x0a, + DW_LNS_set_epilogue_begin = 0x0b, + DW_LNS_set_isa = 0x0c, + + // Line Number Extended Opcode Encodings + DW_LNE_end_sequence = 0x01, + DW_LNE_set_address = 0x02, + DW_LNE_define_file = 0x03, + DW_LNE_lo_user = 0x80, + DW_LNE_hi_user = 0xff, + + // Macinfo Type Encodings + DW_MACINFO_define = 0x01, + DW_MACINFO_undef = 0x02, + DW_MACINFO_start_file = 0x03, + DW_MACINFO_end_file = 0x04, + DW_MACINFO_vendor_ext = 0xff, + + // Call frame instruction encodings + DW_CFA_advance_loc = 0x40, + DW_CFA_offset = 0x80, + DW_CFA_restore = 0xc0, + DW_CFA_set_loc = 0x01, + DW_CFA_advance_loc1 = 0x02, + DW_CFA_advance_loc2 = 0x03, + DW_CFA_advance_loc4 = 0x04, + DW_CFA_offset_extended = 0x05, + DW_CFA_restore_extended = 0x06, + DW_CFA_undefined = 0x07, + DW_CFA_same_value = 0x08, + DW_CFA_register = 0x09, + DW_CFA_remember_state = 0x0a, + DW_CFA_restore_state = 0x0b, + DW_CFA_def_cfa = 0x0c, + DW_CFA_def_cfa_register = 0x0d, + DW_CFA_def_cfa_offset = 0x0e, + DW_CFA_def_cfa_expression = 0x0f, + DW_CFA_expression = 0x10, + DW_CFA_offset_extended_sf = 0x11, + DW_CFA_def_cfa_sf = 0x12, + DW_CFA_def_cfa_offset_sf = 0x13, + DW_CFA_val_offset = 0x14, + DW_CFA_val_offset_sf = 0x15, + DW_CFA_val_expression = 0x16, + DW_CFA_lo_user = 0x1c, + DW_CFA_hi_user = 0x3f + }; + + #endif \ No newline at end of file From jlaskey at apple.com Wed Dec 21 13:46:45 2005 From: jlaskey at apple.com (Jim Laskey) Date: Wed, 21 Dec 2005 13:46:45 -0600 Subject: [llvm-commits] CVS: llvm/include/llvm/CodeGen/DwarfWriter.h Message-ID: <200512211946.NAA29434@zion.cs.uiuc.edu> Changes in directory llvm/include/llvm/CodeGen: DwarfWriter.h updated: 1.1 -> 1.2 --- Log message: Oops llvm namespace. --- Diffs of the changes: (+410 -406) DwarfWriter.h | 816 +++++++++++++++++++++++++++++----------------------------- 1 files changed, 410 insertions(+), 406 deletions(-) Index: llvm/include/llvm/CodeGen/DwarfWriter.h diff -u llvm/include/llvm/CodeGen/DwarfWriter.h:1.1 llvm/include/llvm/CodeGen/DwarfWriter.h:1.2 --- llvm/include/llvm/CodeGen/DwarfWriter.h:1.1 Wed Dec 21 13:44:40 2005 +++ llvm/include/llvm/CodeGen/DwarfWriter.h Wed Dec 21 13:46:32 2005 @@ -14,411 +14,415 @@ #ifndef LLVM_CODEGEN_DWARFPRINTER_H #define LLVM_CODEGEN_DWARFPRINTER_H -//===----------------------------------------------------------------------===// -// Dwarf constants as gleaned from the DWARF Debugging Information Format V.3 -// reference manual http://dwarf.freestandards.org. -// -enum dwarf_constants { - // Tags - DW_TAG_array_type = 0x01, - DW_TAG_class_type = 0x02, - DW_TAG_entry_point = 0x03, - DW_TAG_enumeration_type = 0x04, - DW_TAG_formal_parameter = 0x05, - DW_TAG_imported_declaration = 0x08, - DW_TAG_label = 0x0a, - DW_TAG_lexical_block = 0x0b, - DW_TAG_member = 0x0d, - DW_TAG_pointer_type = 0x0f, - DW_TAG_reference_type = 0x10, - DW_TAG_compile_unit = 0x11, - DW_TAG_string_type = 0x12, - DW_TAG_structure_type = 0x13, - DW_TAG_subroutine_type = 0x15, - DW_TAG_typedef = 0x16, - DW_TAG_union_type = 0x17, - DW_TAG_unspecified_parameters = 0x18, - DW_TAG_variant = 0x19, - DW_TAG_common_block = 0x1a, - DW_TAG_common_inclusion = 0x1b, - DW_TAG_inheritance = 0x1c, - DW_TAG_inlined_subroutine = 0x1d, - DW_TAG_module = 0x1e, - DW_TAG_ptr_to_member_type = 0x1f, - DW_TAG_set_type = 0x20, - DW_TAG_subrange_type = 0x21, - DW_TAG_with_stmt = 0x22, - DW_TAG_access_declaration = 0x23, - DW_TAG_base_type = 0x24, - DW_TAG_catch_block = 0x25, - DW_TAG_const_type = 0x26, - DW_TAG_constant = 0x27, - DW_TAG_enumerator = 0x28, - DW_TAG_file_type = 0x29, - DW_TAG_friend = 0x2a, - DW_TAG_namelist = 0x2b, - DW_TAG_namelist_item = 0x2c, - DW_TAG_packed_type = 0x2d, - DW_TAG_subprogram = 0x2e, - DW_TAG_template_type_parameter = 0x2f, - DW_TAG_template_value_parameter = 0x30, - DW_TAG_thrown_type = 0x31, - DW_TAG_try_block = 0x32, - DW_TAG_variant_part = 0x33, - DW_TAG_variable = 0x34, - DW_TAG_volatile_type = 0x35, - DW_TAG_dwarf_procedure = 0x36, - DW_TAG_restrict_type = 0x37, - DW_TAG_interface_type = 0x38, - DW_TAG_namespace = 0x39, - DW_TAG_imported_module = 0x3a, - DW_TAG_unspecified_type = 0x3b, - DW_TAG_partial_unit = 0x3c, - DW_TAG_imported_unit = 0x3d, - DW_TAG_condition = 0x3f, - DW_TAG_shared_type = 0x40, - DW_TAG_lo_user = 0x4080, - DW_TAG_hi_user = 0xffff, - - // Children flag - DW_CHILDREN_no = 0x00, - DW_CHILDREN_yes = 0x01, - - // Attributes - DW_AT_sibling = 0x01, - DW_AT_location = 0x02, - DW_AT_name = 0x03, - DW_AT_ordering = 0x09, - DW_AT_byte_size = 0x0b, - DW_AT_bit_offset = 0x0c, - DW_AT_bit_size = 0x0d, - DW_AT_stmt_list = 0x10, - DW_AT_low_pc = 0x11, - DW_AT_high_pc = 0x12, - DW_AT_language = 0x13, - DW_AT_discr = 0x15, - DW_AT_discr_value = 0x16, - DW_AT_visibility = 0x17, - DW_AT_import = 0x18, - DW_AT_string_length = 0x19, - DW_AT_common_reference = 0x1a, - DW_AT_comp_dir = 0x1b, - DW_AT_const_value = 0x1c, - DW_AT_containing_type = 0x1d, - DW_AT_default_value = 0x1e, - DW_AT_inline = 0x20, - DW_AT_is_optional = 0x21, - DW_AT_lower_bound = 0x22, - DW_AT_producer = 0x25, - DW_AT_prototyped = 0x27, - DW_AT_return_addr = 0x2a, - DW_AT_start_scope = 0x2c, - DW_AT_bit_stride = 0x2e, - DW_AT_upper_bound = 0x2f, - DW_AT_abstract_origin = 0x31, - DW_AT_accessibility = 0x32, - DW_AT_address_class = 0x33, - DW_AT_artificial = 0x34, - DW_AT_base_types = 0x35, - DW_AT_calling_convention = 0x36, - DW_AT_count = 0x37, - DW_AT_data_member_location = 0x38, - DW_AT_decl_column = 0x39, - DW_AT_decl_file = 0x3a, - DW_AT_decl_line = 0x3b, - DW_AT_declaration = 0x3c, - DW_AT_discr_list = 0x3d, - DW_AT_encoding = 0x3e, - DW_AT_external = 0x3f, - DW_AT_frame_base = 0x40, - DW_AT_friend = 0x41, - DW_AT_identifier_case = 0x42, - DW_AT_macro_info = 0x43, - DW_AT_namelist_item = 0x44, - DW_AT_priority = 0x45, - DW_AT_segment = 0x46, - DW_AT_specification = 0x47, - DW_AT_static_link = 0x48, - DW_AT_type = 0x49, - DW_AT_use_location = 0x4a, - DW_AT_variable_parameter = 0x4b, - DW_AT_virtuality = 0x4c, - DW_AT_vtable_elem_location = 0x4d, - DW_AT_allocated = 0x4e, - DW_AT_associated = 0x4f, - DW_AT_data_location = 0x50, - DW_AT_byte_stride = 0x51, - DW_AT_entry_pc = 0x52, - DW_AT_use_UTF8 = 0x53, - DW_AT_extension = 0x54, - DW_AT_ranges = 0x55, - DW_AT_trampoline = 0x56, - DW_AT_call_column = 0x57, - DW_AT_call_file = 0x58, - DW_AT_call_line = 0x59, - DW_AT_description = 0x5a, - DW_AT_binary_scale = 0x5b, - DW_AT_decimal_scale = 0x5c, - DW_AT_small = 0x5d, - DW_AT_decimal_sign = 0x5e, - DW_AT_digit_count = 0x5f, - DW_AT_picture_string = 0x60, - DW_AT_mutable = 0x61, - DW_AT_threads_scaled = 0x62, - DW_AT_explicit = 0x63, - DW_AT_object_pointer = 0x64, - DW_AT_endianity = 0x65, - DW_AT_elemental = 0x66, - DW_AT_pure = 0x67, - DW_AT_recursive = 0x68, - DW_AT_lo_user = 0x2000, - DW_AT_hi_user = 0x3fff, - - // Attribute form encodings - DW_FORM_addr = 0x01, - DW_FORM_block2 = 0x03, - DW_FORM_block4 = 0x04, - DW_FORM_data2 = 0x05, - DW_FORM_data4 = 0x06, - DW_FORM_data8 = 0x07, - DW_FORM_string = 0x08, - DW_FORM_block = 0x09, - DW_FORM_block1 = 0x0a, - DW_FORM_data1 = 0x0b, - DW_FORM_flag = 0x0c, - DW_FORM_sdata = 0x0d, - DW_FORM_strp = 0x0e, - DW_FORM_udata = 0x0f, - DW_FORM_ref_addr = 0x10, - DW_FORM_ref1 = 0x11, - DW_FORM_ref2 = 0x12, - DW_FORM_ref4 = 0x13, - DW_FORM_ref8 = 0x14, - DW_FORM_ref_udata = 0x15, - DW_FORM_indirect = 0x16, - - // Operation encodings - DW_OP_addr = 0x03, - DW_OP_deref = 0x06, - DW_OP_const1u = 0x08, - DW_OP_const1s = 0x09, - DW_OP_const2u = 0x0a, - DW_OP_const2s = 0x0b, - DW_OP_const4u = 0x0c, - DW_OP_const4s = 0x0d, - DW_OP_const8u = 0x0e, - DW_OP_const8s = 0x0f, - DW_OP_constu = 0x10, - DW_OP_consts = 0x11, - DW_OP_dup = 0x12, - DW_OP_drop = 0x13, - DW_OP_over = 0x14, - DW_OP_pick = 0x15, - DW_OP_swap = 0x16, - DW_OP_rot = 0x17, - DW_OP_xderef = 0x18, - DW_OP_abs = 0x19, - DW_OP_and = 0x1a, - DW_OP_div = 0x1b, - DW_OP_minus = 0x1c, - DW_OP_mod = 0x1d, - DW_OP_mul = 0x1e, - DW_OP_neg = 0x1f, - DW_OP_not = 0x20, - DW_OP_or = 0x21, - DW_OP_plus = 0x22, - DW_OP_plus_uconst = 0x23, - DW_OP_shl = 0x24, - DW_OP_shr = 0x25, - DW_OP_shra = 0x26, - DW_OP_xor = 0x27, - DW_OP_skip = 0x2f, - DW_OP_bra = 0x28, - DW_OP_eq = 0x29, - DW_OP_ge = 0x2a, - DW_OP_gt = 0x2b, - DW_OP_le = 0x2c, - DW_OP_lt = 0x2d, - DW_OP_ne = 0x2e, - DW_OP_lit0 = 0x30, - DW_OP_lit1 = 0x31, - DW_OP_lit31 = 0x4f, - DW_OP_reg0 = 0x50, - DW_OP_reg1 = 0x51, - DW_OP_reg31 = 0x6f, - DW_OP_breg0 = 0x70, - DW_OP_breg1 = 0x71, - DW_OP_breg31 = 0x8f, - DW_OP_regx = 0x90, - DW_OP_fbreg = 0x91, - DW_OP_bregx = 0x92, - DW_OP_piece = 0x93, - DW_OP_deref_size = 0x94, - DW_OP_xderef_size = 0x95, - DW_OP_nop = 0x96, - DW_OP_push_object_address = 0x97, - DW_OP_call2 = 0x98, - DW_OP_call4 = 0x99, - DW_OP_call_ref = 0x9a, - DW_OP_form_tls_address = 0x9b, - DW_OP_call_frame_cfa = 0x9c, - DW_OP_lo_user = 0xe0, - DW_OP_hi_user = 0xff, - - // Encoding attribute values - DW_ATE_address = 0x01, - DW_ATE_boolean = 0x02, - DW_ATE_complex_float = 0x03, - DW_ATE_float = 0x04, - DW_ATE_signed = 0x05, - DW_ATE_signed_char = 0x06, - DW_ATE_unsigned = 0x07, - DW_ATE_unsigned_char = 0x08, - DW_ATE_imaginary_float = 0x09, - DW_ATE_packed_decimal = 0x0a, - DW_ATE_numeric_string = 0x0b, - DW_ATE_edited = 0x0c, - DW_ATE_signed_fixed = 0x0d, - DW_ATE_unsigned_fixed = 0x0e, - DW_ATE_decimal_float = 0x0f, - DW_ATE_lo_user = 0x80, - DW_ATE_hi_user = 0xff, - - // Decimal sign attribute values - DW_DS_unsigned = 0x01, - DW_DS_leading_overpunch = 0x02, - DW_DS_trailing_overpunch = 0x03, - DW_DS_leading_separate = 0x04, - DW_DS_trailing_separate = 0x05, - - // Endianity attribute values - DW_END_default = 0x00, - DW_END_big = 0x01, - DW_END_little = 0x02, - DW_END_lo_user = 0x40, - DW_END_hi_user = 0xff, - - // Accessibility codes - DW_ACCESS_public = 0x01, - DW_ACCESS_protected = 0x02, - DW_ACCESS_private = 0x03, - - // Visibility codes - DW_VIS_local = 0x01, - DW_VIS_exported = 0x02, - DW_VIS_qualified = 0x03, - - // Virtuality codes - DW_VIRTUALITY_none = 0x00, - DW_VIRTUALITY_virtual = 0x01, - DW_VIRTUALITY_pure_virtual = 0x02, - - // Language names - DW_LANG_C89 = 0x0001, - DW_LANG_C = 0x0002, - DW_LANG_Ada83 = 0x0003, - DW_LANG_C_plus_plus = 0x0004, - DW_LANG_Cobol74 = 0x0005, - DW_LANG_Cobol85 = 0x0006, - DW_LANG_Fortran77 = 0x0007, - DW_LANG_Fortran90 = 0x0008, - DW_LANG_Pascal83 = 0x0009, - DW_LANG_Modula2 = 0x000a, - DW_LANG_Java = 0x000b, - DW_LANG_C99 = 0x000c, - DW_LANG_Ada95 = 0x000d, - DW_LANG_Fortran95 = 0x000e, - DW_LANG_PLI = 0x000f, - DW_LANG_ObjC = 0x0010, - DW_LANG_ObjC_plus_plus = 0x0011, - DW_LANG_UPC = 0x0012, - DW_LANG_D = 0x0013, - DW_LANG_lo_user = 0x8000, - DW_LANG_hi_user = 0xffff, - - // Identifier case codes - DW_ID_case_sensitive = 0x00, - DW_ID_up_case = 0x01, - DW_ID_down_case = 0x02, - DW_ID_case_insensitive = 0x03, - - // Calling convention codes - DW_CC_normal = 0x01, - DW_CC_program = 0x02, - DW_CC_nocall = 0x03, - DW_CC_lo_user = 0x40, - DW_CC_hi_user = 0xff, - - // Inline codes - DW_INL_not_inlined = 0x00, - DW_INL_inlined = 0x01, - DW_INL_declared_not_inlined = 0x02, - DW_INL_declared_inlined = 0x03, - - // Array ordering - DW_ORD_row_major = 0x00, - DW_ORD_col_major = 0x01, - - // Discriminant descriptor values - DW_DSC_label = 0x00, - DW_DSC_range = 0x01, - - // Line Number Standard Opcode Encodings - DW_LNS_copy = 0x01, - DW_LNS_advance_pc = 0x02, - DW_LNS_advance_line = 0x03, - DW_LNS_set_file = 0x04, - DW_LNS_set_column = 0x05, - DW_LNS_negate_stmt = 0x06, - DW_LNS_set_basic_block = 0x07, - DW_LNS_const_add_pc = 0x08, - DW_LNS_fixed_advance_pc = 0x09, - DW_LNS_set_prologue_end = 0x0a, - DW_LNS_set_epilogue_begin = 0x0b, - DW_LNS_set_isa = 0x0c, - - // Line Number Extended Opcode Encodings - DW_LNE_end_sequence = 0x01, - DW_LNE_set_address = 0x02, - DW_LNE_define_file = 0x03, - DW_LNE_lo_user = 0x80, - DW_LNE_hi_user = 0xff, - - // Macinfo Type Encodings - DW_MACINFO_define = 0x01, - DW_MACINFO_undef = 0x02, - DW_MACINFO_start_file = 0x03, - DW_MACINFO_end_file = 0x04, - DW_MACINFO_vendor_ext = 0xff, - - // Call frame instruction encodings - DW_CFA_advance_loc = 0x40, - DW_CFA_offset = 0x80, - DW_CFA_restore = 0xc0, - DW_CFA_set_loc = 0x01, - DW_CFA_advance_loc1 = 0x02, - DW_CFA_advance_loc2 = 0x03, - DW_CFA_advance_loc4 = 0x04, - DW_CFA_offset_extended = 0x05, - DW_CFA_restore_extended = 0x06, - DW_CFA_undefined = 0x07, - DW_CFA_same_value = 0x08, - DW_CFA_register = 0x09, - DW_CFA_remember_state = 0x0a, - DW_CFA_restore_state = 0x0b, - DW_CFA_def_cfa = 0x0c, - DW_CFA_def_cfa_register = 0x0d, - DW_CFA_def_cfa_offset = 0x0e, - DW_CFA_def_cfa_expression = 0x0f, - DW_CFA_expression = 0x10, - DW_CFA_offset_extended_sf = 0x11, - DW_CFA_def_cfa_sf = 0x12, - DW_CFA_def_cfa_offset_sf = 0x13, - DW_CFA_val_offset = 0x14, - DW_CFA_val_offset_sf = 0x15, - DW_CFA_val_expression = 0x16, - DW_CFA_lo_user = 0x1c, - DW_CFA_hi_user = 0x3f -}; +namespace llvm { + + //===----------------------------------------------------------------------===// + // Dwarf constants as gleaned from the DWARF Debugging Information Format V.3 + // reference manual http://dwarf.freestandards.org. + // + enum dwarf_constants { + // Tags + DW_TAG_array_type = 0x01, + DW_TAG_class_type = 0x02, + DW_TAG_entry_point = 0x03, + DW_TAG_enumeration_type = 0x04, + DW_TAG_formal_parameter = 0x05, + DW_TAG_imported_declaration = 0x08, + DW_TAG_label = 0x0a, + DW_TAG_lexical_block = 0x0b, + DW_TAG_member = 0x0d, + DW_TAG_pointer_type = 0x0f, + DW_TAG_reference_type = 0x10, + DW_TAG_compile_unit = 0x11, + DW_TAG_string_type = 0x12, + DW_TAG_structure_type = 0x13, + DW_TAG_subroutine_type = 0x15, + DW_TAG_typedef = 0x16, + DW_TAG_union_type = 0x17, + DW_TAG_unspecified_parameters = 0x18, + DW_TAG_variant = 0x19, + DW_TAG_common_block = 0x1a, + DW_TAG_common_inclusion = 0x1b, + DW_TAG_inheritance = 0x1c, + DW_TAG_inlined_subroutine = 0x1d, + DW_TAG_module = 0x1e, + DW_TAG_ptr_to_member_type = 0x1f, + DW_TAG_set_type = 0x20, + DW_TAG_subrange_type = 0x21, + DW_TAG_with_stmt = 0x22, + DW_TAG_access_declaration = 0x23, + DW_TAG_base_type = 0x24, + DW_TAG_catch_block = 0x25, + DW_TAG_const_type = 0x26, + DW_TAG_constant = 0x27, + DW_TAG_enumerator = 0x28, + DW_TAG_file_type = 0x29, + DW_TAG_friend = 0x2a, + DW_TAG_namelist = 0x2b, + DW_TAG_namelist_item = 0x2c, + DW_TAG_packed_type = 0x2d, + DW_TAG_subprogram = 0x2e, + DW_TAG_template_type_parameter = 0x2f, + DW_TAG_template_value_parameter = 0x30, + DW_TAG_thrown_type = 0x31, + DW_TAG_try_block = 0x32, + DW_TAG_variant_part = 0x33, + DW_TAG_variable = 0x34, + DW_TAG_volatile_type = 0x35, + DW_TAG_dwarf_procedure = 0x36, + DW_TAG_restrict_type = 0x37, + DW_TAG_interface_type = 0x38, + DW_TAG_namespace = 0x39, + DW_TAG_imported_module = 0x3a, + DW_TAG_unspecified_type = 0x3b, + DW_TAG_partial_unit = 0x3c, + DW_TAG_imported_unit = 0x3d, + DW_TAG_condition = 0x3f, + DW_TAG_shared_type = 0x40, + DW_TAG_lo_user = 0x4080, + DW_TAG_hi_user = 0xffff, + + // Children flag + DW_CHILDREN_no = 0x00, + DW_CHILDREN_yes = 0x01, + + // Attributes + DW_AT_sibling = 0x01, + DW_AT_location = 0x02, + DW_AT_name = 0x03, + DW_AT_ordering = 0x09, + DW_AT_byte_size = 0x0b, + DW_AT_bit_offset = 0x0c, + DW_AT_bit_size = 0x0d, + DW_AT_stmt_list = 0x10, + DW_AT_low_pc = 0x11, + DW_AT_high_pc = 0x12, + DW_AT_language = 0x13, + DW_AT_discr = 0x15, + DW_AT_discr_value = 0x16, + DW_AT_visibility = 0x17, + DW_AT_import = 0x18, + DW_AT_string_length = 0x19, + DW_AT_common_reference = 0x1a, + DW_AT_comp_dir = 0x1b, + DW_AT_const_value = 0x1c, + DW_AT_containing_type = 0x1d, + DW_AT_default_value = 0x1e, + DW_AT_inline = 0x20, + DW_AT_is_optional = 0x21, + DW_AT_lower_bound = 0x22, + DW_AT_producer = 0x25, + DW_AT_prototyped = 0x27, + DW_AT_return_addr = 0x2a, + DW_AT_start_scope = 0x2c, + DW_AT_bit_stride = 0x2e, + DW_AT_upper_bound = 0x2f, + DW_AT_abstract_origin = 0x31, + DW_AT_accessibility = 0x32, + DW_AT_address_class = 0x33, + DW_AT_artificial = 0x34, + DW_AT_base_types = 0x35, + DW_AT_calling_convention = 0x36, + DW_AT_count = 0x37, + DW_AT_data_member_location = 0x38, + DW_AT_decl_column = 0x39, + DW_AT_decl_file = 0x3a, + DW_AT_decl_line = 0x3b, + DW_AT_declaration = 0x3c, + DW_AT_discr_list = 0x3d, + DW_AT_encoding = 0x3e, + DW_AT_external = 0x3f, + DW_AT_frame_base = 0x40, + DW_AT_friend = 0x41, + DW_AT_identifier_case = 0x42, + DW_AT_macro_info = 0x43, + DW_AT_namelist_item = 0x44, + DW_AT_priority = 0x45, + DW_AT_segment = 0x46, + DW_AT_specification = 0x47, + DW_AT_static_link = 0x48, + DW_AT_type = 0x49, + DW_AT_use_location = 0x4a, + DW_AT_variable_parameter = 0x4b, + DW_AT_virtuality = 0x4c, + DW_AT_vtable_elem_location = 0x4d, + DW_AT_allocated = 0x4e, + DW_AT_associated = 0x4f, + DW_AT_data_location = 0x50, + DW_AT_byte_stride = 0x51, + DW_AT_entry_pc = 0x52, + DW_AT_use_UTF8 = 0x53, + DW_AT_extension = 0x54, + DW_AT_ranges = 0x55, + DW_AT_trampoline = 0x56, + DW_AT_call_column = 0x57, + DW_AT_call_file = 0x58, + DW_AT_call_line = 0x59, + DW_AT_description = 0x5a, + DW_AT_binary_scale = 0x5b, + DW_AT_decimal_scale = 0x5c, + DW_AT_small = 0x5d, + DW_AT_decimal_sign = 0x5e, + DW_AT_digit_count = 0x5f, + DW_AT_picture_string = 0x60, + DW_AT_mutable = 0x61, + DW_AT_threads_scaled = 0x62, + DW_AT_explicit = 0x63, + DW_AT_object_pointer = 0x64, + DW_AT_endianity = 0x65, + DW_AT_elemental = 0x66, + DW_AT_pure = 0x67, + DW_AT_recursive = 0x68, + DW_AT_lo_user = 0x2000, + DW_AT_hi_user = 0x3fff, + + // Attribute form encodings + DW_FORM_addr = 0x01, + DW_FORM_block2 = 0x03, + DW_FORM_block4 = 0x04, + DW_FORM_data2 = 0x05, + DW_FORM_data4 = 0x06, + DW_FORM_data8 = 0x07, + DW_FORM_string = 0x08, + DW_FORM_block = 0x09, + DW_FORM_block1 = 0x0a, + DW_FORM_data1 = 0x0b, + DW_FORM_flag = 0x0c, + DW_FORM_sdata = 0x0d, + DW_FORM_strp = 0x0e, + DW_FORM_udata = 0x0f, + DW_FORM_ref_addr = 0x10, + DW_FORM_ref1 = 0x11, + DW_FORM_ref2 = 0x12, + DW_FORM_ref4 = 0x13, + DW_FORM_ref8 = 0x14, + DW_FORM_ref_udata = 0x15, + DW_FORM_indirect = 0x16, + + // Operation encodings + DW_OP_addr = 0x03, + DW_OP_deref = 0x06, + DW_OP_const1u = 0x08, + DW_OP_const1s = 0x09, + DW_OP_const2u = 0x0a, + DW_OP_const2s = 0x0b, + DW_OP_const4u = 0x0c, + DW_OP_const4s = 0x0d, + DW_OP_const8u = 0x0e, + DW_OP_const8s = 0x0f, + DW_OP_constu = 0x10, + DW_OP_consts = 0x11, + DW_OP_dup = 0x12, + DW_OP_drop = 0x13, + DW_OP_over = 0x14, + DW_OP_pick = 0x15, + DW_OP_swap = 0x16, + DW_OP_rot = 0x17, + DW_OP_xderef = 0x18, + DW_OP_abs = 0x19, + DW_OP_and = 0x1a, + DW_OP_div = 0x1b, + DW_OP_minus = 0x1c, + DW_OP_mod = 0x1d, + DW_OP_mul = 0x1e, + DW_OP_neg = 0x1f, + DW_OP_not = 0x20, + DW_OP_or = 0x21, + DW_OP_plus = 0x22, + DW_OP_plus_uconst = 0x23, + DW_OP_shl = 0x24, + DW_OP_shr = 0x25, + DW_OP_shra = 0x26, + DW_OP_xor = 0x27, + DW_OP_skip = 0x2f, + DW_OP_bra = 0x28, + DW_OP_eq = 0x29, + DW_OP_ge = 0x2a, + DW_OP_gt = 0x2b, + DW_OP_le = 0x2c, + DW_OP_lt = 0x2d, + DW_OP_ne = 0x2e, + DW_OP_lit0 = 0x30, + DW_OP_lit1 = 0x31, + DW_OP_lit31 = 0x4f, + DW_OP_reg0 = 0x50, + DW_OP_reg1 = 0x51, + DW_OP_reg31 = 0x6f, + DW_OP_breg0 = 0x70, + DW_OP_breg1 = 0x71, + DW_OP_breg31 = 0x8f, + DW_OP_regx = 0x90, + DW_OP_fbreg = 0x91, + DW_OP_bregx = 0x92, + DW_OP_piece = 0x93, + DW_OP_deref_size = 0x94, + DW_OP_xderef_size = 0x95, + DW_OP_nop = 0x96, + DW_OP_push_object_address = 0x97, + DW_OP_call2 = 0x98, + DW_OP_call4 = 0x99, + DW_OP_call_ref = 0x9a, + DW_OP_form_tls_address = 0x9b, + DW_OP_call_frame_cfa = 0x9c, + DW_OP_lo_user = 0xe0, + DW_OP_hi_user = 0xff, + + // Encoding attribute values + DW_ATE_address = 0x01, + DW_ATE_boolean = 0x02, + DW_ATE_complex_float = 0x03, + DW_ATE_float = 0x04, + DW_ATE_signed = 0x05, + DW_ATE_signed_char = 0x06, + DW_ATE_unsigned = 0x07, + DW_ATE_unsigned_char = 0x08, + DW_ATE_imaginary_float = 0x09, + DW_ATE_packed_decimal = 0x0a, + DW_ATE_numeric_string = 0x0b, + DW_ATE_edited = 0x0c, + DW_ATE_signed_fixed = 0x0d, + DW_ATE_unsigned_fixed = 0x0e, + DW_ATE_decimal_float = 0x0f, + DW_ATE_lo_user = 0x80, + DW_ATE_hi_user = 0xff, + + // Decimal sign attribute values + DW_DS_unsigned = 0x01, + DW_DS_leading_overpunch = 0x02, + DW_DS_trailing_overpunch = 0x03, + DW_DS_leading_separate = 0x04, + DW_DS_trailing_separate = 0x05, + + // Endianity attribute values + DW_END_default = 0x00, + DW_END_big = 0x01, + DW_END_little = 0x02, + DW_END_lo_user = 0x40, + DW_END_hi_user = 0xff, + + // Accessibility codes + DW_ACCESS_public = 0x01, + DW_ACCESS_protected = 0x02, + DW_ACCESS_private = 0x03, + + // Visibility codes + DW_VIS_local = 0x01, + DW_VIS_exported = 0x02, + DW_VIS_qualified = 0x03, + + // Virtuality codes + DW_VIRTUALITY_none = 0x00, + DW_VIRTUALITY_virtual = 0x01, + DW_VIRTUALITY_pure_virtual = 0x02, + + // Language names + DW_LANG_C89 = 0x0001, + DW_LANG_C = 0x0002, + DW_LANG_Ada83 = 0x0003, + DW_LANG_C_plus_plus = 0x0004, + DW_LANG_Cobol74 = 0x0005, + DW_LANG_Cobol85 = 0x0006, + DW_LANG_Fortran77 = 0x0007, + DW_LANG_Fortran90 = 0x0008, + DW_LANG_Pascal83 = 0x0009, + DW_LANG_Modula2 = 0x000a, + DW_LANG_Java = 0x000b, + DW_LANG_C99 = 0x000c, + DW_LANG_Ada95 = 0x000d, + DW_LANG_Fortran95 = 0x000e, + DW_LANG_PLI = 0x000f, + DW_LANG_ObjC = 0x0010, + DW_LANG_ObjC_plus_plus = 0x0011, + DW_LANG_UPC = 0x0012, + DW_LANG_D = 0x0013, + DW_LANG_lo_user = 0x8000, + DW_LANG_hi_user = 0xffff, + + // Identifier case codes + DW_ID_case_sensitive = 0x00, + DW_ID_up_case = 0x01, + DW_ID_down_case = 0x02, + DW_ID_case_insensitive = 0x03, + + // Calling convention codes + DW_CC_normal = 0x01, + DW_CC_program = 0x02, + DW_CC_nocall = 0x03, + DW_CC_lo_user = 0x40, + DW_CC_hi_user = 0xff, + + // Inline codes + DW_INL_not_inlined = 0x00, + DW_INL_inlined = 0x01, + DW_INL_declared_not_inlined = 0x02, + DW_INL_declared_inlined = 0x03, + + // Array ordering + DW_ORD_row_major = 0x00, + DW_ORD_col_major = 0x01, + + // Discriminant descriptor values + DW_DSC_label = 0x00, + DW_DSC_range = 0x01, + + // Line Number Standard Opcode Encodings + DW_LNS_copy = 0x01, + DW_LNS_advance_pc = 0x02, + DW_LNS_advance_line = 0x03, + DW_LNS_set_file = 0x04, + DW_LNS_set_column = 0x05, + DW_LNS_negate_stmt = 0x06, + DW_LNS_set_basic_block = 0x07, + DW_LNS_const_add_pc = 0x08, + DW_LNS_fixed_advance_pc = 0x09, + DW_LNS_set_prologue_end = 0x0a, + DW_LNS_set_epilogue_begin = 0x0b, + DW_LNS_set_isa = 0x0c, + + // Line Number Extended Opcode Encodings + DW_LNE_end_sequence = 0x01, + DW_LNE_set_address = 0x02, + DW_LNE_define_file = 0x03, + DW_LNE_lo_user = 0x80, + DW_LNE_hi_user = 0xff, + + // Macinfo Type Encodings + DW_MACINFO_define = 0x01, + DW_MACINFO_undef = 0x02, + DW_MACINFO_start_file = 0x03, + DW_MACINFO_end_file = 0x04, + DW_MACINFO_vendor_ext = 0xff, + + // Call frame instruction encodings + DW_CFA_advance_loc = 0x40, + DW_CFA_offset = 0x80, + DW_CFA_restore = 0xc0, + DW_CFA_set_loc = 0x01, + DW_CFA_advance_loc1 = 0x02, + DW_CFA_advance_loc2 = 0x03, + DW_CFA_advance_loc4 = 0x04, + DW_CFA_offset_extended = 0x05, + DW_CFA_restore_extended = 0x06, + DW_CFA_undefined = 0x07, + DW_CFA_same_value = 0x08, + DW_CFA_register = 0x09, + DW_CFA_remember_state = 0x0a, + DW_CFA_restore_state = 0x0b, + DW_CFA_def_cfa = 0x0c, + DW_CFA_def_cfa_register = 0x0d, + DW_CFA_def_cfa_offset = 0x0e, + DW_CFA_def_cfa_expression = 0x0f, + DW_CFA_expression = 0x10, + DW_CFA_offset_extended_sf = 0x11, + DW_CFA_def_cfa_sf = 0x12, + DW_CFA_def_cfa_offset_sf = 0x13, + DW_CFA_val_offset = 0x14, + DW_CFA_val_offset_sf = 0x15, + DW_CFA_val_expression = 0x16, + DW_CFA_lo_user = 0x1c, + DW_CFA_hi_user = 0x3f + }; + +} // end llvm namespace #endif \ No newline at end of file From jlaskey at apple.com Wed Dec 21 13:48:28 2005 From: jlaskey at apple.com (Jim Laskey) Date: Wed, 21 Dec 2005 13:48:28 -0600 Subject: [llvm-commits] CVS: llvm/lib/CodeGen/DwarfWriter.cpp Message-ID: <200512211948.NAA29730@zion.cs.uiuc.edu> Changes in directory llvm/lib/CodeGen: DwarfWriter.cpp added (r1.1) --- Log message: Start of Dwarf framework. --- Diffs of the changes: (+15 -0) DwarfWriter.cpp | 15 +++++++++++++++ 1 files changed, 15 insertions(+) Index: llvm/lib/CodeGen/DwarfWriter.cpp diff -c /dev/null llvm/lib/CodeGen/DwarfWriter.cpp:1.1 *** /dev/null Wed Dec 21 13:48:26 2005 --- llvm/lib/CodeGen/DwarfWriter.cpp Wed Dec 21 13:48:16 2005 *************** *** 0 **** --- 1,15 ---- + //===-- llvm/CodeGen/DwarfWriter.cpp - Dwarf Framework ----------*- C++ -*-===// + // + // The LLVM Compiler Infrastructure + // + // This file was developed by James M. Laskey and is distributed under the + // University of Illinois Open Source License. See LICENSE.TXT for details. + // + //===----------------------------------------------------------------------===// + // + // This file contains support for writing dwarf debug info into asm files. + // + //===----------------------------------------------------------------------===// + + + #include "llvm/CodeGen/DwarfWriter.h" \ No newline at end of file From lattner at cs.uiuc.edu Wed Dec 21 13:51:36 2005 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Wed, 21 Dec 2005 13:51:36 -0600 Subject: [llvm-commits] CVS: llvm/Xcode/LLVM.xcodeproj/project.pbxproj Message-ID: <200512211951.NAA30206@zion.cs.uiuc.edu> Changes in directory llvm/Xcode/LLVM.xcodeproj: project.pbxproj updated: 1.13 -> 1.14 --- Log message: add dwarfwriter to the xcode project --- Diffs of the changes: (+4 -0) project.pbxproj | 4 ++++ 1 files changed, 4 insertions(+) Index: llvm/Xcode/LLVM.xcodeproj/project.pbxproj diff -u llvm/Xcode/LLVM.xcodeproj/project.pbxproj:1.13 llvm/Xcode/LLVM.xcodeproj/project.pbxproj:1.14 --- llvm/Xcode/LLVM.xcodeproj/project.pbxproj:1.13 Sat Oct 29 00:34:40 2005 +++ llvm/Xcode/LLVM.xcodeproj/project.pbxproj Wed Dec 21 13:51:24 2005 @@ -898,6 +898,8 @@ DE8170AA08CFB44D0093BDEF /* TableGen.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = TableGen.cpp; sourceTree = ""; }; DE8170AB08CFB44D0093BDEF /* TableGenBackend.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = TableGenBackend.cpp; sourceTree = ""; }; DE8170AC08CFB44D0093BDEF /* TableGenBackend.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = TableGenBackend.h; sourceTree = ""; }; + DEFAB19C0959E97F00E0AB42 /* DwarfWriter.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = DwarfWriter.cpp; path = ../lib/CodeGen/DwarfWriter.cpp; sourceTree = SOURCE_ROOT; }; + DEFAB19D0959E9A100E0AB42 /* DwarfWriter.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = DwarfWriter.h; path = ../include/llvm/CodeGen/DwarfWriter.h; sourceTree = SOURCE_ROOT; }; /* End PBXFileReference section */ /* Begin PBXGroup section */ @@ -1079,6 +1081,7 @@ DE66ED8308ABEC2B00323D32 /* SelectionDAG */, DE66ED3F08ABEC2A00323D32 /* AsmPrinter.cpp */, DE66ED4008ABEC2A00323D32 /* BranchFolding.cpp */, + DEFAB19C0959E97F00E0AB42 /* DwarfWriter.cpp */, DE66ED6F08ABEC2B00323D32 /* ELFWriter.cpp */, DE66ED7008ABEC2B00323D32 /* IntrinsicLowering.cpp */, DE66ED7108ABEC2B00323D32 /* LiveInterval.cpp */, @@ -1881,6 +1884,7 @@ isa = PBXGroup; children = ( DE66F23608ABF03100323D32 /* AsmPrinter.h */, + DEFAB19D0959E9A100E0AB42 /* DwarfWriter.h */, DE66F23708ABF03100323D32 /* ELFWriter.h */, DE66F23808ABF03100323D32 /* InstrScheduling.h */, DE66F23908ABF03100323D32 /* IntrinsicLowering.h */, From evan.cheng at apple.com Wed Dec 21 14:21:02 2005 From: evan.cheng at apple.com (Evan Cheng) Date: Wed, 21 Dec 2005 14:21:02 -0600 Subject: [llvm-commits] CVS: llvm/utils/TableGen/DAGISelEmitter.cpp Message-ID: <200512212021.OAA02542@zion.cs.uiuc.edu> Changes in directory llvm/utils/TableGen: DAGISelEmitter.cpp updated: 1.110 -> 1.111 --- Log message: Allows instructions which no explicit operands. e.g. X86 RET which has but an implicit flag operand. --- Diffs of the changes: (+5 -6) DAGISelEmitter.cpp | 11 +++++------ 1 files changed, 5 insertions(+), 6 deletions(-) Index: llvm/utils/TableGen/DAGISelEmitter.cpp diff -u llvm/utils/TableGen/DAGISelEmitter.cpp:1.110 llvm/utils/TableGen/DAGISelEmitter.cpp:1.111 --- llvm/utils/TableGen/DAGISelEmitter.cpp:1.110 Tue Dec 20 23:31:05 2005 +++ llvm/utils/TableGen/DAGISelEmitter.cpp Wed Dec 21 14:20:49 2005 @@ -1124,23 +1124,22 @@ std::vector Operands; CodeGenInstruction &InstInfo =Target.getInstruction(Instrs[i]->getName()); - - // Doesn't even define a result? - if (InstInfo.OperandList.size() == 0) - continue; + // Note: Removed if (InstInfo.OperandList.size() == 0) continue; + // It's possible for some instruction, e.g. RET for X86 that only has an + // implicit flag operand. // FIXME: temporary hack... if (InstInfo.isReturn || InstInfo.isBranch || InstInfo.isCall || InstInfo.isStore) { // These produce no results - for (unsigned j = 0, e = InstInfo.OperandList.size(); j != e; ++j) + for (unsigned j = 0, e = InstInfo.OperandList.size(); j < e; ++j) Operands.push_back(InstInfo.OperandList[j].Rec); } else { // Assume the first operand is the result. Results.push_back(InstInfo.OperandList[0].Rec); // The rest are inputs. - for (unsigned j = 1, e = InstInfo.OperandList.size(); j != e; ++j) + for (unsigned j = 1, e = InstInfo.OperandList.size(); j < e; ++j) Operands.push_back(InstInfo.OperandList[j].Rec); } From evan.cheng at apple.com Wed Dec 21 14:22:04 2005 From: evan.cheng at apple.com (Evan Cheng) Date: Wed, 21 Dec 2005 14:22:04 -0600 Subject: [llvm-commits] CVS: llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp Message-ID: <200512212022.OAA03094@zion.cs.uiuc.edu> Changes in directory llvm/lib/CodeGen/SelectionDAG: LegalizeDAG.cpp updated: 1.238 -> 1.239 --- Log message: * Added support for X86 RET with an additional operand to specify number of bytes to pop off stack. * Added support for X86 SETCC. --- Diffs of the changes: (+10 -0) LegalizeDAG.cpp | 10 ++++++++++ 1 files changed, 10 insertions(+) Index: llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp diff -u llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp:1.238 llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp:1.239 --- llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp:1.238 Wed Dec 21 13:40:42 2005 +++ llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp Wed Dec 21 14:21:51 2005 @@ -1621,6 +1621,16 @@ Node->getOperand(2)); break; } + case TargetLowering::Custom: { + SDOperand Tmp = + TLI.LowerOperation(DAG.getNode(ISD::SETCC, Node->getValueType(0), + Tmp1, Tmp2, Node->getOperand(2)), DAG); + if (Tmp.Val) { + Result = LegalizeOp(Tmp); + break; + } + // FALLTHROUGH if the target thinks it is legal. + } case TargetLowering::Legal: if (Tmp1 != Node->getOperand(0) || Tmp2 != Node->getOperand(1)) Result = DAG.getNode(ISD::SETCC, Node->getValueType(0), Tmp1, Tmp2, From evan.cheng at apple.com Wed Dec 21 14:22:04 2005 From: evan.cheng at apple.com (Evan Cheng) Date: Wed, 21 Dec 2005 14:22:04 -0600 Subject: [llvm-commits] CVS: llvm/lib/Target/X86/X86ISelLowering.cpp X86ISelLowering.h X86InstrInfo.td Message-ID: <200512212022.OAA03102@zion.cs.uiuc.edu> Changes in directory llvm/lib/Target/X86: X86ISelLowering.cpp updated: 1.12 -> 1.13 X86ISelLowering.h updated: 1.6 -> 1.7 X86InstrInfo.td updated: 1.179 -> 1.180 --- Log message: * Added support for X86 RET with an additional operand to specify number of bytes to pop off stack. * Added support for X86 SETCC. --- Diffs of the changes: (+122 -64) X86ISelLowering.cpp | 27 ++++++++- X86ISelLowering.h | 17 +++++- X86InstrInfo.td | 142 +++++++++++++++++++++++++++++++--------------------- 3 files changed, 122 insertions(+), 64 deletions(-) Index: llvm/lib/Target/X86/X86ISelLowering.cpp diff -u llvm/lib/Target/X86/X86ISelLowering.cpp:1.12 llvm/lib/Target/X86/X86ISelLowering.cpp:1.13 --- llvm/lib/Target/X86/X86ISelLowering.cpp:1.12 Tue Dec 20 20:39:21 2005 +++ llvm/lib/Target/X86/X86ISelLowering.cpp Wed Dec 21 14:21:51 2005 @@ -119,6 +119,9 @@ if (X86DAGIsel) { setOperationAction(ISD::SELECT , MVT::i16 , Custom); setOperationAction(ISD::SELECT , MVT::i32 , Custom); + setOperationAction(ISD::SETCC , MVT::i8 , Custom); + setOperationAction(ISD::SETCC , MVT::i16 , Custom); + setOperationAction(ISD::SETCC , MVT::i32 , Custom); } // We don't have line number support yet. @@ -256,7 +259,10 @@ } break; } - return DAG.getNode(X86ISD::RET_FLAG, MVT::Other, Copy, Copy.getValue(1)); + + return DAG.getNode(X86ISD::RET_FLAG, MVT::Other, + Copy, DAG.getConstant(getBytesToPopOnReturn(), MVT::i16), + Copy.getValue(1)); } //===----------------------------------------------------------------------===// @@ -999,10 +1005,20 @@ Tys.push_back(MVT::Other); return DAG.getNode(ISD::MERGE_VALUES, Tys, Ops); } + case ISD::SETCC: { + assert(Op.getValueType() == MVT::i8 && "SetCC type must be 8-bit integer"); + SDOperand CC = Op.getOperand(2); + SDOperand Cond = DAG.getNode(X86ISD::CMP, MVT::Flag, + Op.getOperand(0), Op.getOperand(1)); + return DAG.getNode(X86ISD::SETCC, MVT::i8, CC, Cond); + } case ISD::SELECT: { SDOperand Cond = Op.getOperand(0); SDOperand CC; - if (Cond.getOpcode() == ISD::SETCC) { + if (Cond.getOpcode() == X86ISD::SETCC) { + CC = Cond.getOperand(0); + Cond = Cond.getOperand(1); + } else if (Cond.getOpcode() == ISD::SETCC) { CC = Cond.getOperand(2); Cond = DAG.getNode(X86ISD::CMP, MVT::Flag, Cond.getOperand(0), Cond.getOperand(1)); @@ -1014,12 +1030,14 @@ Op.getOperand(1), Op.getOperand(2), CC, Cond); } case ISD::BRCOND: { - SDOperand Chain = Op.getOperand(0); SDOperand Cond = Op.getOperand(1); SDOperand Dest = Op.getOperand(2); SDOperand CC; // TODO: handle Cond == OR / AND / XOR - if (Cond.getOpcode() == ISD::SETCC) { + if (Cond.getOpcode() == X86ISD::SETCC) { + CC = Cond.getOperand(0); + Cond = Cond.getOperand(1); + } else if (Cond.getOpcode() == ISD::SETCC) { CC = Cond.getOperand(2); Cond = DAG.getNode(X86ISD::CMP, MVT::Flag, Cond.getOperand(0), Cond.getOperand(1)); @@ -1061,6 +1079,7 @@ case X86ISD::RDTSC_DAG: return "X86ISD::RDTSC_DAG"; case X86ISD::CMP: return "X86ISD::CMP"; case X86ISD::TEST: return "X86ISD::TEST"; + case X86ISD::SETCC: return "X86ISD::SETCC"; case X86ISD::CMOV: return "X86ISD::CMOV"; case X86ISD::BRCOND: return "X86ISD::BRCOND"; case X86ISD::RET_FLAG: return "X86ISD::RET_FLAG"; Index: llvm/lib/Target/X86/X86ISelLowering.h diff -u llvm/lib/Target/X86/X86ISelLowering.h:1.6 llvm/lib/Target/X86/X86ISelLowering.h:1.7 --- llvm/lib/Target/X86/X86ISelLowering.h:1.6 Tue Dec 20 20:39:21 2005 +++ llvm/lib/Target/X86/X86ISelLowering.h Wed Dec 21 14:21:51 2005 @@ -81,13 +81,24 @@ /// X86 compare and logical compare instructions. CMP, TEST, - /// X86 conditional moves. + /// X86 SetCC. Operand 1 is condition code, and operand 2 is the flag + /// operand produced by a CMP instruction. + SETCC, + + /// X86 conditional moves. Operand 1 and operand 2 are the two values + /// to select from (operand 1 is a R/W operand). Operand 3 is the condition + /// code, and operand 4 is the flag operand produced by a CMP or TEST + /// instruction. CMOV, - /// X86 conditional branches. + /// X86 conditional branches. Operand 1 is the chain operand, operand 2 + /// is the block to branch if condition is true, operand 3 is the + /// condition code, and operand 4 is the flag operand produced by a CMP + /// or TEST instruction. BRCOND, - // Return with a flag operand. + /// Return with a flag operand. Operand 1 is the number of bytes of stack + /// to pop, operand 2 is the chain and operand 3 is a flag operand. RET_FLAG, }; } Index: llvm/lib/Target/X86/X86InstrInfo.td diff -u llvm/lib/Target/X86/X86InstrInfo.td:1.179 llvm/lib/Target/X86/X86InstrInfo.td:1.180 --- llvm/lib/Target/X86/X86InstrInfo.td:1.179 Wed Dec 21 01:50:26 2005 +++ llvm/lib/Target/X86/X86InstrInfo.td Wed Dec 21 14:21:51 2005 @@ -28,25 +28,31 @@ [SDTCisVT<0, OtherVT>, SDTCisVT<1, OtherVT>, SDTCisVT<2, FlagVT>]>; -def SDTX86RetFlag : SDTypeProfile<0, 1, [SDTCisVT<0, FlagVT>]>; +def SDTX86SetCC : SDTypeProfile<1, 2, + [SDTCisVT<0, i8>, SDTCisVT<1, OtherVT>, + SDTCisVT<2, FlagVT>]>; + +def SDTX86RetFlag : SDTypeProfile<0, 2, [SDTCisVT<0, i16>, + SDTCisVT<1, FlagVT>]>; def SDTX86Fld : SDTypeProfile<1, 2, [SDTCisFP<0>, SDTCisPtrTy<1>, SDTCisVT<2, OtherVT>]>; def SDTX86FpSet : SDTypeProfile<0, 1, [SDTCisFP<0>]>; -def X86cmp : SDNode<"X86ISD::CMP" , SDTX86CmpTest, []>; -def X86test : SDNode<"X86ISD::TEST", SDTX86CmpTest, []>; +def X86cmp : SDNode<"X86ISD::CMP" , SDTX86CmpTest, []>; +def X86test : SDNode<"X86ISD::TEST", SDTX86CmpTest, []>; -def X86cmov : SDNode<"X86ISD::CMOV", SDTX86Cmov, []>; -def X86Brcond : SDNode<"X86ISD::BRCOND", SDTX86BrCond, [SDNPHasChain]>; +def X86cmov : SDNode<"X86ISD::CMOV", SDTX86Cmov, []>; +def X86Brcond : SDNode<"X86ISD::BRCOND", SDTX86BrCond, [SDNPHasChain]>; +def X86SetCC : SDNode<"X86ISD::SETCC", SDTX86SetCC, []>; -def X86retflag: SDNode<"X86ISD::RET_FLAG", SDTX86RetFlag, [SDNPHasChain]>; +def X86retflag : SDNode<"X86ISD::RET_FLAG", SDTX86RetFlag, [SDNPHasChain]>; -def X86fld : SDNode<"X86ISD::FLD", SDTX86Fld, [SDNPHasChain]>; +def X86fld : SDNode<"X86ISD::FLD", SDTX86Fld, [SDNPHasChain]>; -def X86fpset : SDNode<"X86ISD::FP_SET_RESULT", - SDTX86FpSet, [SDNPHasChain]>; +def X86fpset : SDNode<"X86ISD::FP_SET_RESULT", + SDTX86FpSet, [SDNPHasChain]>; //===----------------------------------------------------------------------===// // X86 Operand Definitions. @@ -283,12 +289,13 @@ // // Return instructions. -let isTerminator = 1, isReturn = 1, isBarrier = 1 in - def RET : I<0xC3, RawFrm, (ops), "ret", [(ret)]>; -let isTerminator = 1, isReturn = 1, isBarrier = 1 in +let isTerminator = 1, isReturn = 1, isBarrier = 1, hasCtrlDep = 1 in + def RET : I<0xC3, RawFrm, (ops), "ret", []>; +let isTerminator = 1, isReturn = 1, isBarrier = 1, hasCtrlDep = 1 in def RETI : Ii16<0xC2, RawFrm, (ops i16imm:$amt), "ret $amt", []>; -def : Pat<(X86retflag FLAG), (RET)>; +def : Pat<(X86retflag 0, FLAG), (RET)>; +def : Pat<(X86retflag imm:$amt, FLAG), (RETI imm:$amt)>; // All branches are RawFrm, Void, Branch, and Terminators let isBranch = 1, isTerminator = 1 in @@ -1800,42 +1807,87 @@ def SAHF : I<0x9E, RawFrm, (ops), "sahf", []>, Imp<[AH],[]>; // flags = AH def LAHF : I<0x9F, RawFrm, (ops), "lahf", []>, Imp<[],[AH]>; // AH = flags -def SETBr : I<0x92, MRM0r, - (ops R8 :$dst), - "setb $dst", []>, TB; // R8 = < unsign -def SETBm : I<0x92, MRM0m, - (ops i8mem:$dst), - "setb $dst", []>, TB; // [mem8] = < unsign -def SETAEr : I<0x93, MRM0r, - (ops R8 :$dst), - "setae $dst", []>, TB; // R8 = >= unsign -def SETAEm : I<0x93, MRM0m, - (ops i8mem:$dst), - "setae $dst", []>, TB; // [mem8] = >= unsign def SETEr : I<0x94, MRM0r, (ops R8 :$dst), - "sete $dst", []>, TB; // R8 = == + "sete $dst", [(set R8:$dst, (X86SetCC SETEQ, STATUS))]>, + TB; // R8 = == def SETEm : I<0x94, MRM0m, (ops i8mem:$dst), - "sete $dst", []>, TB; // [mem8] = == + "sete $dst", [(store (X86SetCC SETEQ, STATUS), addr:$dst)]>, + TB; // [mem8] = == def SETNEr : I<0x95, MRM0r, (ops R8 :$dst), - "setne $dst", []>, TB; // R8 = != + "setne $dst", [(set R8:$dst, (X86SetCC SETNE, STATUS))]>, + TB; // R8 = != def SETNEm : I<0x95, MRM0m, (ops i8mem:$dst), - "setne $dst", []>, TB; // [mem8] = != + "setne $dst", [(store (X86SetCC SETNE, STATUS), addr:$dst)]>, + TB; // [mem8] = != +def SETLr : I<0x9C, MRM0r, + (ops R8 :$dst), + "setl $dst", [(set R8:$dst, (X86SetCC SETLT, STATUS))]>, + TB; // R8 = < signed +def SETLm : I<0x9C, MRM0m, + (ops i8mem:$dst), + "setl $dst", [(store (X86SetCC SETLT, STATUS), addr:$dst)]>, + TB; // [mem8] = < signed +def SETGEr : I<0x9D, MRM0r, + (ops R8 :$dst), + "setge $dst", [(set R8:$dst, (X86SetCC SETGE, STATUS))]>, + TB; // R8 = >= signed +def SETGEm : I<0x9D, MRM0m, + (ops i8mem:$dst), + "setge $dst", [(store (X86SetCC SETGE, STATUS), addr:$dst)]>, + TB; // [mem8] = >= signed +def SETLEr : I<0x9E, MRM0r, + (ops R8 :$dst), + "setle $dst", [(set R8:$dst, (X86SetCC SETLE, STATUS))]>, + TB; // R8 = <= signed +def SETLEm : I<0x9E, MRM0m, + (ops i8mem:$dst), + "setle $dst", [(store (X86SetCC SETLE, STATUS), addr:$dst)]>, + TB; // [mem8] = <= signed +def SETGr : I<0x9F, MRM0r, + (ops R8 :$dst), + "setg $dst", [(set R8:$dst, (X86SetCC SETGT, STATUS))]>, + TB; // R8 = > signed +def SETGm : I<0x9F, MRM0m, + (ops i8mem:$dst), + "setg $dst", [(store (X86SetCC SETGT, STATUS), addr:$dst)]>, + TB; // [mem8] = > signed + +def SETBr : I<0x92, MRM0r, + (ops R8 :$dst), + "setb $dst", [(set R8:$dst, (X86SetCC SETULT, STATUS))]>, + TB; // R8 = < unsign +def SETBm : I<0x92, MRM0m, + (ops i8mem:$dst), + "setb $dst", [(store (X86SetCC SETULT, STATUS), addr:$dst)]>, + TB; // [mem8] = < unsign +def SETAEr : I<0x93, MRM0r, + (ops R8 :$dst), + "setae $dst", [(set R8:$dst, (X86SetCC SETUGE, STATUS))]>, + TB; // R8 = >= unsign +def SETAEm : I<0x93, MRM0m, + (ops i8mem:$dst), + "setae $dst", [(store (X86SetCC SETUGE, STATUS), addr:$dst)]>, + TB; // [mem8] = >= unsign def SETBEr : I<0x96, MRM0r, (ops R8 :$dst), - "setbe $dst", []>, TB; // R8 = <= unsign + "setbe $dst", [(set R8:$dst, (X86SetCC SETULE, STATUS))]>, + TB; // R8 = <= unsign def SETBEm : I<0x96, MRM0m, (ops i8mem:$dst), - "setbe $dst", []>, TB; // [mem8] = <= unsign + "setbe $dst", [(store (X86SetCC SETULE, STATUS), addr:$dst)]>, + TB; // [mem8] = <= unsign def SETAr : I<0x97, MRM0r, (ops R8 :$dst), - "seta $dst", []>, TB; // R8 = > signed + "seta $dst", [(set R8:$dst, (X86SetCC SETUGT, STATUS))]>, + TB; // R8 = > signed def SETAm : I<0x97, MRM0m, (ops i8mem:$dst), - "seta $dst", []>, TB; // [mem8] = > signed + "seta $dst", [(store (X86SetCC SETUGT, STATUS), addr:$dst)]>, + TB; // [mem8] = > signed def SETSr : I<0x98, MRM0r, (ops R8 :$dst), "sets $dst", []>, TB; // R8 = @@ -1860,30 +1912,6 @@ def SETNPm : I<0x9B, MRM0m, (ops i8mem:$dst), "setnp $dst", []>, TB; // [mem8] = not parity -def SETLr : I<0x9C, MRM0r, - (ops R8 :$dst), - "setl $dst", []>, TB; // R8 = < signed -def SETLm : I<0x9C, MRM0m, - (ops i8mem:$dst), - "setl $dst", []>, TB; // [mem8] = < signed -def SETGEr : I<0x9D, MRM0r, - (ops R8 :$dst), - "setge $dst", []>, TB; // R8 = >= signed -def SETGEm : I<0x9D, MRM0m, - (ops i8mem:$dst), - "setge $dst", []>, TB; // [mem8] = >= signed -def SETLEr : I<0x9E, MRM0r, - (ops R8 :$dst), - "setle $dst", []>, TB; // R8 = <= signed -def SETLEm : I<0x9E, MRM0m, - (ops i8mem:$dst), - "setle $dst", []>, TB; // [mem8] = <= signed -def SETGr : I<0x9F, MRM0r, - (ops R8 :$dst), - "setg $dst", []>, TB; // R8 = < signed -def SETGm : I<0x9F, MRM0m, - (ops i8mem:$dst), - "setg $dst", []>, TB; // [mem8] = < signed // Integer comparisons def CMP8rr : I<0x38, MRMDestReg, From jlaskey at apple.com Wed Dec 21 14:47:47 2005 From: jlaskey at apple.com (Jim Laskey) Date: Wed, 21 Dec 2005 14:47:47 -0600 Subject: [llvm-commits] CVS: llvm/Xcode/LLVM.xcodeproj/project.pbxproj Message-ID: <200512212047.OAA06385@zion.cs.uiuc.edu> Changes in directory llvm/Xcode/LLVM.xcodeproj: project.pbxproj updated: 1.14 -> 1.15 --- Log message: Sync up the project with my tweaks. --- Diffs of the changes: (+199 -11) project.pbxproj | 210 +++++++++++++++++++++++++++++++++++++++++++++++++++++--- 1 files changed, 199 insertions(+), 11 deletions(-) Index: llvm/Xcode/LLVM.xcodeproj/project.pbxproj diff -u llvm/Xcode/LLVM.xcodeproj/project.pbxproj:1.14 llvm/Xcode/LLVM.xcodeproj/project.pbxproj:1.15 --- llvm/Xcode/LLVM.xcodeproj/project.pbxproj:1.14 Wed Dec 21 13:51:24 2005 +++ llvm/Xcode/LLVM.xcodeproj/project.pbxproj Wed Dec 21 14:47:34 2005 @@ -78,8 +78,57 @@ /* End PBXContainerItemProxy section */ /* Begin PBXFileReference section */ + CF26835B09178F5500C5F253 /* TargetInstrItineraries.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TargetInstrItineraries.h; sourceTree = ""; }; + CF490CD50903C9260072DB1C /* PPC.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PPC.h; sourceTree = ""; }; + CF490CD60903C9260072DB1C /* PPCAsmPrinter.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = PPCAsmPrinter.cpp; sourceTree = ""; }; + CF490CD70903C9260072DB1C /* PPCBranchSelector.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = PPCBranchSelector.cpp; sourceTree = ""; }; + CF490CD80903C9260072DB1C /* PPCCodeEmitter.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = PPCCodeEmitter.cpp; sourceTree = ""; }; + CF490CD90903C9260072DB1C /* PPCFrameInfo.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PPCFrameInfo.h; sourceTree = ""; }; + CF490CDA0903C9260072DB1C /* PPCInstrBuilder.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PPCInstrBuilder.h; sourceTree = ""; }; + CF490CDB0903C9260072DB1C /* PPCInstrFormats.td */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = PPCInstrFormats.td; sourceTree = ""; }; + CF490CDC0903C9260072DB1C /* PPCInstrInfo.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = PPCInstrInfo.cpp; sourceTree = ""; }; + CF490CDD0903C9260072DB1C /* PPCInstrInfo.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PPCInstrInfo.h; sourceTree = ""; }; + CF490CDE0903C9260072DB1C /* PPCInstrInfo.td */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = PPCInstrInfo.td; sourceTree = ""; }; + CF490CDF0903C9260072DB1C /* PPCISelDAGToDAG.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = PPCISelDAGToDAG.cpp; sourceTree = ""; }; + CF490CE00903C9260072DB1C /* PPCISelLowering.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = PPCISelLowering.cpp; sourceTree = ""; }; + CF490CE10903C9260072DB1C /* PPCISelLowering.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PPCISelLowering.h; sourceTree = ""; }; + CF490CE20903C9260072DB1C /* PPCISelPattern.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = PPCISelPattern.cpp; sourceTree = ""; }; + CF490CE30903C9260072DB1C /* PPCJITInfo.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = PPCJITInfo.cpp; sourceTree = ""; }; + CF490CE40903C9260072DB1C /* PPCJITInfo.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PPCJITInfo.h; sourceTree = ""; }; + CF490CE50903C9260072DB1C /* PPCRegisterInfo.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = PPCRegisterInfo.cpp; sourceTree = ""; }; + CF490CE60903C9260072DB1C /* PPCRegisterInfo.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PPCRegisterInfo.h; sourceTree = ""; }; + CF490CE70903C9260072DB1C /* PPCRegisterInfo.td */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = PPCRegisterInfo.td; sourceTree = ""; }; + CF490CE80903C9260072DB1C /* PPCRelocations.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PPCRelocations.h; sourceTree = ""; }; + CF490CE90903C9260072DB1C /* PPCSubtarget.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = PPCSubtarget.cpp; sourceTree = ""; }; + CF490CEA0903C9260072DB1C /* PPCSubtarget.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PPCSubtarget.h; sourceTree = ""; }; + CF490CEB0903C9260072DB1C /* PPCTargetMachine.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = PPCTargetMachine.cpp; sourceTree = ""; }; + CF490CEC0903C9260072DB1C /* PPCTargetMachine.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PPCTargetMachine.h; sourceTree = ""; }; + CF490D0E090541A30072DB1C /* PPCSchedule.td */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = PPCSchedule.td; sourceTree = ""; }; + CF490D0F090541A30072DB1C /* PPCScheduleG3.td */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = PPCScheduleG3.td; sourceTree = ""; }; + CF490D10090541A30072DB1C /* PPCScheduleG4.td */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = PPCScheduleG4.td; sourceTree = ""; }; + CF490D11090541A30072DB1C /* PPCScheduleG4Plus.td */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = PPCScheduleG4Plus.td; sourceTree = ""; }; + CF490D12090541A30072DB1C /* PPCScheduleG5.td */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = PPCScheduleG5.td; sourceTree = ""; }; + CF490D14090541D30072DB1C /* TargetSchedule.td */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = TargetSchedule.td; sourceTree = ""; }; + CF490D15090541D30072DB1C /* TargetSelectionDAG.td */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = TargetSelectionDAG.td; sourceTree = ""; }; + CF490D890906A78C0072DB1C /* PPC.td */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = PPC.td; sourceTree = ""; }; + CF490E2F0907BBF80072DB1C /* SubtargetEmitter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SubtargetEmitter.h; sourceTree = ""; }; + CF490E300907BBF80072DB1C /* SubtargetEmitter.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = SubtargetEmitter.cpp; sourceTree = ""; }; + CF6F487109505E1500BC9E82 /* MachineDebugInfo.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MachineDebugInfo.h; sourceTree = ""; }; CF9BCD0808C74DE0001E7011 /* SubtargetFeature.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SubtargetFeature.h; sourceTree = ""; }; CF9BCD1508C75070001E7011 /* SubtargetFeature.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = SubtargetFeature.cpp; sourceTree = ""; }; + CFBD8B1A090E76540020B107 /* AlphaISelDAGToDAG.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = AlphaISelDAGToDAG.cpp; sourceTree = ""; }; + CFBD8B1B090E76540020B107 /* AlphaISelLowering.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = AlphaISelLowering.cpp; sourceTree = ""; }; + CFBD8B1C090E76540020B107 /* AlphaISelLowering.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AlphaISelLowering.h; sourceTree = ""; }; + CFBD8B1D090E76540020B107 /* AlphaSubtarget.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = AlphaSubtarget.cpp; sourceTree = ""; }; + CFBD8B1E090E76540020B107 /* AlphaSubtarget.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AlphaSubtarget.h; sourceTree = ""; }; + CFC244570959DEF2009F8C47 /* DwarfWriter.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = DwarfWriter.cpp; sourceTree = ""; }; + CFC244BB0959F24C009F8C47 /* X86ISelDAGToDAG.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = X86ISelDAGToDAG.cpp; sourceTree = ""; }; + CFC244BC0959F24C009F8C47 /* X86ISelLowering.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = X86ISelLowering.cpp; sourceTree = ""; }; + CFC244BD0959F24C009F8C47 /* X86ISelLowering.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = X86ISelLowering.h; sourceTree = ""; }; + CFC244BE0959F284009F8C47 /* SparcV8ISelDAGToDAG.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = SparcV8ISelDAGToDAG.cpp; sourceTree = ""; }; + CFC244BF0959F2E3009F8C47 /* IA64ISelDAGToDAG.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = IA64ISelDAGToDAG.cpp; sourceTree = ""; }; + CFC244C00959F2E3009F8C47 /* IA64ISelLowering.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = IA64ISelLowering.cpp; sourceTree = ""; }; + CFC244C10959F2E3009F8C47 /* IA64ISelLowering.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = IA64ISelLowering.h; sourceTree = ""; }; DE4DA0390911476D0012D44B /* LoopSimplify.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = LoopSimplify.cpp; path = ../lib/Transforms/Utils/LoopSimplify.cpp; sourceTree = SOURCE_ROOT; }; DE4DA03C091147920012D44B /* LiveInterval.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = LiveInterval.h; path = ../include/llvm/CodeGen/LiveInterval.h; sourceTree = SOURCE_ROOT; }; DE4DA03D091147920012D44B /* LiveIntervalAnalysis.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = LiveIntervalAnalysis.h; path = ../include/llvm/CodeGen/LiveIntervalAnalysis.h; sourceTree = SOURCE_ROOT; }; @@ -206,7 +255,6 @@ DE66ED7C08ABEC2B00323D32 /* PHIElimination.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = PHIElimination.cpp; sourceTree = ""; }; DE66ED7D08ABEC2B00323D32 /* PhysRegTracker.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = PhysRegTracker.h; sourceTree = ""; }; DE66ED7E08ABEC2B00323D32 /* PrologEpilogInserter.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = PrologEpilogInserter.cpp; sourceTree = ""; }; - DE66ED7F08ABEC2B00323D32 /* RegAllocIterativeScan.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = RegAllocIterativeScan.cpp; sourceTree = ""; }; DE66ED8008ABEC2B00323D32 /* RegAllocLinearScan.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = RegAllocLinearScan.cpp; sourceTree = ""; }; DE66ED8108ABEC2B00323D32 /* RegAllocLocal.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = RegAllocLocal.cpp; sourceTree = ""; }; DE66ED8208ABEC2B00323D32 /* RegAllocSimple.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = RegAllocSimple.cpp; sourceTree = ""; }; @@ -364,13 +412,11 @@ DE66EFB308ABEE5F00323D32 /* SparcV8.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = SparcV8.h; sourceTree = ""; }; DE66EFB408ABEE5F00323D32 /* SparcV8.td */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = text; path = SparcV8.td; sourceTree = ""; }; DE66EFB508ABEE5F00323D32 /* SparcV8AsmPrinter.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = SparcV8AsmPrinter.cpp; sourceTree = ""; }; - DE66EFB608ABEE5F00323D32 /* SparcV8CodeEmitter.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = SparcV8CodeEmitter.cpp; sourceTree = ""; }; DE66EFBD08ABEE5F00323D32 /* SparcV8InstrFormats.td */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = text; path = SparcV8InstrFormats.td; sourceTree = ""; }; DE66EFBE08ABEE5F00323D32 /* SparcV8InstrInfo.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = SparcV8InstrInfo.cpp; sourceTree = ""; }; DE66EFBF08ABEE5F00323D32 /* SparcV8InstrInfo.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = SparcV8InstrInfo.h; sourceTree = ""; }; DE66EFC008ABEE5F00323D32 /* SparcV8InstrInfo.td */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = text; path = SparcV8InstrInfo.td; sourceTree = ""; }; DE66EFC208ABEE5F00323D32 /* SparcV8ISelSimple.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = SparcV8ISelSimple.cpp; sourceTree = ""; }; - DE66EFC308ABEE5F00323D32 /* SparcV8JITInfo.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = SparcV8JITInfo.h; sourceTree = ""; }; DE66EFC408ABEE5F00323D32 /* SparcV8RegisterInfo.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = SparcV8RegisterInfo.cpp; sourceTree = ""; }; DE66EFC508ABEE5F00323D32 /* SparcV8RegisterInfo.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = SparcV8RegisterInfo.h; sourceTree = ""; }; DE66EFC608ABEE5F00323D32 /* SparcV8RegisterInfo.td */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = text; path = SparcV8RegisterInfo.td; sourceTree = ""; }; @@ -1080,6 +1126,7 @@ children = ( DE66ED8308ABEC2B00323D32 /* SelectionDAG */, DE66ED3F08ABEC2A00323D32 /* AsmPrinter.cpp */, + CFC244570959DEF2009F8C47 /* DwarfWriter.cpp */, DE66ED4008ABEC2A00323D32 /* BranchFolding.cpp */, DEFAB19C0959E97F00E0AB42 /* DwarfWriter.cpp */, DE66ED6F08ABEC2B00323D32 /* ELFWriter.cpp */, @@ -1095,7 +1142,6 @@ DE66ED7C08ABEC2B00323D32 /* PHIElimination.cpp */, DE66ED7D08ABEC2B00323D32 /* PhysRegTracker.h */, DE66ED7E08ABEC2B00323D32 /* PrologEpilogInserter.cpp */, - DE66ED7F08ABEC2B00323D32 /* RegAllocIterativeScan.cpp */, DE66ED8008ABEC2B00323D32 /* RegAllocLinearScan.cpp */, DE66ED8108ABEC2B00323D32 /* RegAllocLocal.cpp */, DE66ED8208ABEC2B00323D32 /* RegAllocSimple.cpp */, @@ -1112,8 +1158,8 @@ DE66ED8308ABEC2B00323D32 /* SelectionDAG */ = { isa = PBXGroup; children = ( - DE694D9F08B51E0C0039C106 /* ScheduleDAG.cpp */, DE66ED9008ABEC2B00323D32 /* LegalizeDAG.cpp */, + DE694D9F08B51E0C0039C106 /* ScheduleDAG.cpp */, DE66ED9208ABEC2B00323D32 /* SelectionDAG.cpp */, DE66ED9308ABEC2B00323D32 /* SelectionDAGISel.cpp */, DE66ED9408ABEC2B00323D32 /* SelectionDAGPrinter.cpp */, @@ -1318,6 +1364,8 @@ DE66F08F08ABEE6000323D32 /* TargetMachine.cpp */, DE66F09008ABEE6000323D32 /* TargetMachineRegistry.cpp */, DE66F09108ABEE6000323D32 /* TargetSchedInfo.cpp */, + CF490D14090541D30072DB1C /* TargetSchedule.td */, + CF490D15090541D30072DB1C /* TargetSelectionDAG.td */, DE66F09208ABEE6000323D32 /* TargetSubtarget.cpp */, ); name = lib/Target; @@ -1328,6 +1376,11 @@ isa = PBXGroup; children = ( DE66EE9808ABEE5E00323D32 /* Alpha.h */, + CFBD8B1A090E76540020B107 /* AlphaISelDAGToDAG.cpp */, + CFBD8B1B090E76540020B107 /* AlphaISelLowering.cpp */, + CFBD8B1C090E76540020B107 /* AlphaISelLowering.h */, + CFBD8B1D090E76540020B107 /* AlphaSubtarget.cpp */, + CFBD8B1E090E76540020B107 /* AlphaSubtarget.h */, DE66EE9908ABEE5E00323D32 /* Alpha.td */, DE66EE9A08ABEE5E00323D32 /* AlphaAsmPrinter.cpp */, DE66EE9B08ABEE5E00323D32 /* AlphaCodeEmitter.cpp */, @@ -1368,6 +1421,9 @@ DE66EF0308ABEE5E00323D32 /* IA64InstrInfo.cpp */, DE66EF0408ABEE5E00323D32 /* IA64InstrInfo.h */, DE66EF0508ABEE5E00323D32 /* IA64InstrInfo.td */, + CFC244BF0959F2E3009F8C47 /* IA64ISelDAGToDAG.cpp */, + CFC244C00959F2E3009F8C47 /* IA64ISelLowering.cpp */, + CFC244C10959F2E3009F8C47 /* IA64ISelLowering.h */, DE66EF0608ABEE5E00323D32 /* IA64ISelPattern.cpp */, DE66EF0708ABEE5E00323D32 /* IA64MachineFunctionInfo.h */, DE66EF0808ABEE5E00323D32 /* IA64RegisterInfo.cpp */, @@ -1383,6 +1439,36 @@ DE66EF1108ABEE5E00323D32 /* PowerPC */ = { isa = PBXGroup; children = ( + CF490D890906A78C0072DB1C /* PPC.td */, + CF490CD50903C9260072DB1C /* PPC.h */, + CF490CD60903C9260072DB1C /* PPCAsmPrinter.cpp */, + CF490CD70903C9260072DB1C /* PPCBranchSelector.cpp */, + CF490CD80903C9260072DB1C /* PPCCodeEmitter.cpp */, + CF490CD90903C9260072DB1C /* PPCFrameInfo.h */, + CF490CDA0903C9260072DB1C /* PPCInstrBuilder.h */, + CF490CDB0903C9260072DB1C /* PPCInstrFormats.td */, + CF490CDC0903C9260072DB1C /* PPCInstrInfo.cpp */, + CF490CDD0903C9260072DB1C /* PPCInstrInfo.h */, + CF490CDE0903C9260072DB1C /* PPCInstrInfo.td */, + CF490CDF0903C9260072DB1C /* PPCISelDAGToDAG.cpp */, + CF490CE00903C9260072DB1C /* PPCISelLowering.cpp */, + CF490CE10903C9260072DB1C /* PPCISelLowering.h */, + CF490CE20903C9260072DB1C /* PPCISelPattern.cpp */, + CF490CE30903C9260072DB1C /* PPCJITInfo.cpp */, + CF490CE40903C9260072DB1C /* PPCJITInfo.h */, + CF490CE50903C9260072DB1C /* PPCRegisterInfo.cpp */, + CF490CE60903C9260072DB1C /* PPCRegisterInfo.h */, + CF490CE70903C9260072DB1C /* PPCRegisterInfo.td */, + CF490CE80903C9260072DB1C /* PPCRelocations.h */, + CF490D0E090541A30072DB1C /* PPCSchedule.td */, + CF490D0F090541A30072DB1C /* PPCScheduleG3.td */, + CF490D10090541A30072DB1C /* PPCScheduleG4.td */, + CF490D11090541A30072DB1C /* PPCScheduleG4Plus.td */, + CF490D12090541A30072DB1C /* PPCScheduleG5.td */, + CF490CE90903C9260072DB1C /* PPCSubtarget.cpp */, + CF490CEA0903C9260072DB1C /* PPCSubtarget.h */, + CF490CEB0903C9260072DB1C /* PPCTargetMachine.cpp */, + CF490CEC0903C9260072DB1C /* PPCTargetMachine.h */, DE66EF3D08ABEE5F00323D32 /* LICENSE.TXT */, DE4DA03F091147DD0012D44B /* PPC.h */, DE4DA040091147DD0012D44B /* PPC.td */, @@ -1448,16 +1534,15 @@ DE66EFB308ABEE5F00323D32 /* SparcV8.h */, DE66EFB408ABEE5F00323D32 /* SparcV8.td */, DE66EFB508ABEE5F00323D32 /* SparcV8AsmPrinter.cpp */, - DE66EFB608ABEE5F00323D32 /* SparcV8CodeEmitter.cpp */, DE66EFBD08ABEE5F00323D32 /* SparcV8InstrFormats.td */, DE66EFBE08ABEE5F00323D32 /* SparcV8InstrInfo.cpp */, DE66EFBF08ABEE5F00323D32 /* SparcV8InstrInfo.h */, DE66EFC008ABEE5F00323D32 /* SparcV8InstrInfo.td */, DE66EFC208ABEE5F00323D32 /* SparcV8ISelSimple.cpp */, - DE66EFC308ABEE5F00323D32 /* SparcV8JITInfo.h */, DE66EFC408ABEE5F00323D32 /* SparcV8RegisterInfo.cpp */, DE66EFC508ABEE5F00323D32 /* SparcV8RegisterInfo.h */, DE66EFC608ABEE5F00323D32 /* SparcV8RegisterInfo.td */, + CFC244BE0959F284009F8C47 /* SparcV8ISelDAGToDAG.cpp */, DE66EFC708ABEE5F00323D32 /* SparcV8TargetMachine.cpp */, DE66EFC808ABEE5F00323D32 /* SparcV8TargetMachine.h */, ); @@ -1614,6 +1699,9 @@ DE66F0D908ABEE6100323D32 /* X86RegisterInfo.h */, DE66F0DA08ABEE6100323D32 /* X86RegisterInfo.td */, DE66F0DB08ABEE6100323D32 /* X86Relocations.h */, + CFC244BB0959F24C009F8C47 /* X86ISelDAGToDAG.cpp */, + CFC244BC0959F24C009F8C47 /* X86ISelLowering.cpp */, + CFC244BD0959F24C009F8C47 /* X86ISelLowering.h */, DE66F0DC08ABEE6100323D32 /* X86Subtarget.cpp */, DE66F0DD08ABEE6100323D32 /* X86Subtarget.h */, DE66F0DE08ABEE6100323D32 /* X86TargetMachine.cpp */, @@ -1894,6 +1982,7 @@ DE66F23B08ABF03100323D32 /* MachineBasicBlock.h */, DE66F23C08ABF03100323D32 /* MachineCodeEmitter.h */, DE66F23D08ABF03100323D32 /* MachineConstantPool.h */, + CF6F487109505E1500BC9E82 /* MachineDebugInfo.h */, DE66F23E08ABF03100323D32 /* MachineFrameInfo.h */, DE66F23F08ABF03100323D32 /* MachineFunction.h */, DE66F24008ABF03100323D32 /* MachineFunctionPass.h */, @@ -2007,6 +2096,7 @@ DE66F2A108ABF03200323D32 /* TargetData.h */, DE66F2A208ABF03200323D32 /* TargetFrameInfo.h */, DE66F2A308ABF03200323D32 /* TargetInstrInfo.h */, + CF26835B09178F5500C5F253 /* TargetInstrItineraries.h */, DE66F2A408ABF03200323D32 /* TargetJITInfo.h */, DE66F2A508ABF03200323D32 /* TargetLowering.h */, DE66F2A608ABF03200323D32 /* TargetMachine.h */, @@ -2289,6 +2379,8 @@ DE8170AA08CFB44D0093BDEF /* TableGen.cpp */, DE8170AB08CFB44D0093BDEF /* TableGenBackend.cpp */, DE8170AC08CFB44D0093BDEF /* TableGenBackend.h */, + CF490E300907BBF80072DB1C /* SubtargetEmitter.cpp */, + CF490E2F0907BBF80072DB1C /* SubtargetEmitter.h */, ); path = TableGen; sourceTree = ""; @@ -2298,7 +2390,7 @@ /* Begin PBXLegacyTarget section */ CF0329B608D1BE110030FD33 /* LLVM lib */ = { isa = PBXLegacyTarget; - buildArgumentsString = "$(ACTION) -j 4 "; + buildArgumentsString = "$(ACTION) -j 4"; buildConfigurationList = CF0329B708D1BE530030FD33 /* Build configuration list for PBXLegacyTarget "LLVM lib" */; buildPhases = ( ); @@ -2316,7 +2408,7 @@ ); }; buildToolPath = /usr/bin/make; - buildWorkingDirectory = ../../obj/lib; + buildWorkingDirectory = /Volumes/Big2/llvm/llvm/lib; dependencies = ( ); name = "LLVM lib"; @@ -2343,13 +2435,40 @@ ); }; buildToolPath = /usr/bin/make; - buildWorkingDirectory = ../../obj/tools/llc; + buildWorkingDirectory = /Volumes/Big2/llvm/llvm/tools/llc; dependencies = ( ); name = "LLVM llc"; passBuildSettingsInEnvironment = 0; productName = "LLVM llc"; }; + CF490E830907CDAB0072DB1C /* LLVM TableGen */ = { + isa = PBXLegacyTarget; + buildArgumentsString = "$(ACTION) -j 4 "; + buildConfigurationList = CF490E840907CDAB0072DB1C /* Build configuration list for PBXLegacyTarget "LLVM TableGen" */; + buildPhases = ( + ); + buildSettings = { + OPTIMIZATION_CFLAGS = ""; + OTHER_CFLAGS = ""; + OTHER_LDFLAGS = ""; + OTHER_REZFLAGS = ""; + PRODUCT_NAME = "LLVM llc"; + SECTORDER_FLAGS = ""; + WARNING_CFLAGS = ( + "-Wmost", + "-Wno-four-char-constants", + "-Wno-unknown-pragmas", + ); + }; + buildToolPath = /usr/bin/make; + buildWorkingDirectory = /llvm/llvm/utils/TableGen; + dependencies = ( + ); + name = "LLVM TableGen"; + passBuildSettingsInEnvironment = 0; + productName = "LLVM llc"; + }; D28A88AD04BDD90700651E21 /* LLVM */ = { isa = PBXLegacyTarget; buildArgumentsString = "$(ACTION) -j 4 "; @@ -2362,7 +2481,7 @@ PRODUCT_NAME = LLVM; }; buildToolPath = /usr/bin/make; - buildWorkingDirectory = ../../obj; + buildWorkingDirectory = /Volumes/Big2/llvm/llvm; dependencies = ( ); name = LLVM; @@ -2389,6 +2508,7 @@ CF0329B608D1BE110030FD33 /* LLVM lib */, CF0329BB08D1BE5D0030FD33 /* LLVM llc */, CF0329BC08D1BE8E0030FD33 /* LLVM full llc */, + CF490E830907CDAB0072DB1C /* LLVM TableGen */, ); }; /* End PBXProject section */ @@ -2572,6 +2692,61 @@ }; name = Default; }; + CF490E850907CDAB0072DB1C /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + COPY_PHASE_STRIP = NO; + GCC_GENERATE_DEBUGGING_SYMBOLS = YES; + OPTIMIZATION_CFLAGS = "-O0"; + OTHER_CFLAGS = ""; + OTHER_LDFLAGS = ""; + OTHER_REZFLAGS = ""; + PRODUCT_NAME = "LLVM TableGen"; + SECTORDER_FLAGS = ""; + WARNING_CFLAGS = ( + "-Wmost", + "-Wno-four-char-constants", + "-Wno-unknown-pragmas", + ); + }; + name = Debug; + }; + CF490E860907CDAB0072DB1C /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + COPY_PHASE_STRIP = YES; + GCC_GENERATE_DEBUGGING_SYMBOLS = NO; + OPTIMIZATION_CFLAGS = "-O0"; + OTHER_CFLAGS = ""; + OTHER_LDFLAGS = ""; + OTHER_REZFLAGS = ""; + PRODUCT_NAME = "LLVM llc"; + SECTORDER_FLAGS = ""; + WARNING_CFLAGS = ( + "-Wmost", + "-Wno-four-char-constants", + "-Wno-unknown-pragmas", + ); + }; + name = Release; + }; + CF490E870907CDAB0072DB1C /* Default */ = { + isa = XCBuildConfiguration; + buildSettings = { + OPTIMIZATION_CFLAGS = "-O0"; + OTHER_CFLAGS = ""; + OTHER_LDFLAGS = ""; + OTHER_REZFLAGS = ""; + PRODUCT_NAME = "LLVM llc"; + SECTORDER_FLAGS = ""; + WARNING_CFLAGS = ( + "-Wmost", + "-Wno-four-char-constants", + "-Wno-unknown-pragmas", + ); + }; + name = Default; + }; DE66EC4D08ABE78900323D32 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { @@ -2640,6 +2815,7 @@ CF0329BA08D1BE530030FD33 /* Default */, ); defaultConfigurationIsVisible = 0; + defaultConfigurationName = Default; }; CF0329C308D1BEC40030FD33 /* Build configuration list for PBXLegacyTarget "LLVM llc" */ = { isa = XCConfigurationList; @@ -2649,6 +2825,7 @@ CF0329C608D1BEC40030FD33 /* Default */, ); defaultConfigurationIsVisible = 0; + defaultConfigurationName = Default; }; CF0329C708D1BEC40030FD33 /* Build configuration list for PBXAggregateTarget "LLVM full llc" */ = { isa = XCConfigurationList; @@ -2658,6 +2835,17 @@ CF0329CA08D1BEC40030FD33 /* Default */, ); defaultConfigurationIsVisible = 0; + defaultConfigurationName = Default; + }; + CF490E840907CDAB0072DB1C /* Build configuration list for PBXLegacyTarget "LLVM TableGen" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + CF490E850907CDAB0072DB1C /* Debug */, + CF490E860907CDAB0072DB1C /* Release */, + CF490E870907CDAB0072DB1C /* Default */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Default; }; DE66EC4C08ABE78900323D32 /* Build configuration list for PBXLegacyTarget "LLVM" */ = { isa = XCConfigurationList; From jlaskey at apple.com Wed Dec 21 14:51:50 2005 From: jlaskey at apple.com (Jim Laskey) Date: Wed, 21 Dec 2005 14:51:50 -0600 Subject: [llvm-commits] CVS: llvm/lib/Target/IA64/IA64ISelLowering.cpp IA64ISelPattern.cpp Message-ID: <200512212051.OAA07037@zion.cs.uiuc.edu> Changes in directory llvm/lib/Target/IA64: IA64ISelLowering.cpp updated: 1.4 -> 1.5 IA64ISelPattern.cpp updated: 1.69 -> 1.70 --- Log message: Disengage DEBUG_LOC from non-PPC targets. --- Diffs of the changes: (+2 -0) IA64ISelLowering.cpp | 1 + IA64ISelPattern.cpp | 1 + 2 files changed, 2 insertions(+) Index: llvm/lib/Target/IA64/IA64ISelLowering.cpp diff -u llvm/lib/Target/IA64/IA64ISelLowering.cpp:1.4 llvm/lib/Target/IA64/IA64ISelLowering.cpp:1.5 --- llvm/lib/Target/IA64/IA64ISelLowering.cpp:1.4 Tue Nov 29 00:16:21 2005 +++ llvm/lib/Target/IA64/IA64ISelLowering.cpp Wed Dec 21 14:51:36 2005 @@ -74,6 +74,7 @@ // We don't have line number support yet. setOperationAction(ISD::LOCATION, MVT::Other, Expand); + setOperationAction(ISD::DEBUG_LOC, MVT::Other, Expand); //IA64 has these, but they are not implemented setOperationAction(ISD::CTTZ , MVT::i64 , Expand); Index: llvm/lib/Target/IA64/IA64ISelPattern.cpp diff -u llvm/lib/Target/IA64/IA64ISelPattern.cpp:1.69 llvm/lib/Target/IA64/IA64ISelPattern.cpp:1.70 --- llvm/lib/Target/IA64/IA64ISelPattern.cpp:1.69 Thu Dec 1 12:19:53 2005 +++ llvm/lib/Target/IA64/IA64ISelPattern.cpp Wed Dec 21 14:51:36 2005 @@ -102,6 +102,7 @@ // We don't have line number support yet. setOperationAction(ISD::LOCATION, MVT::Other, Expand); + setOperationAction(ISD::DEBUG_LOC, MVT::Other, Expand); computeRegisterProperties(); From jlaskey at apple.com Wed Dec 21 14:51:51 2005 From: jlaskey at apple.com (Jim Laskey) Date: Wed, 21 Dec 2005 14:51:51 -0600 Subject: [llvm-commits] CVS: llvm/lib/Target/Alpha/AlphaISelLowering.cpp Message-ID: <200512212051.OAA07041@zion.cs.uiuc.edu> Changes in directory llvm/lib/Target/Alpha: AlphaISelLowering.cpp updated: 1.12 -> 1.13 --- Log message: Disengage DEBUG_LOC from non-PPC targets. --- Diffs of the changes: (+1 -0) AlphaISelLowering.cpp | 1 + 1 files changed, 1 insertion(+) Index: llvm/lib/Target/Alpha/AlphaISelLowering.cpp diff -u llvm/lib/Target/Alpha/AlphaISelLowering.cpp:1.12 llvm/lib/Target/Alpha/AlphaISelLowering.cpp:1.13 --- llvm/lib/Target/Alpha/AlphaISelLowering.cpp:1.12 Wed Nov 30 11:11:20 2005 +++ llvm/lib/Target/Alpha/AlphaISelLowering.cpp Wed Dec 21 14:51:36 2005 @@ -102,6 +102,7 @@ // We don't have line number support yet. setOperationAction(ISD::LOCATION, MVT::Other, Expand); + setOperationAction(ISD::DEBUG_LOC, MVT::Other, Expand); addLegalFPImmediate(+0.0); //F31 addLegalFPImmediate(-0.0); //-F31 From jlaskey at apple.com Wed Dec 21 14:51:51 2005 From: jlaskey at apple.com (Jim Laskey) Date: Wed, 21 Dec 2005 14:51:51 -0600 Subject: [llvm-commits] CVS: llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp ScheduleDAG.cpp Message-ID: <200512212051.OAA07056@zion.cs.uiuc.edu> Changes in directory llvm/lib/CodeGen/SelectionDAG: LegalizeDAG.cpp updated: 1.239 -> 1.240 ScheduleDAG.cpp updated: 1.53 -> 1.54 --- Log message: Disengage DEBUG_LOC from non-PPC targets. --- Diffs of the changes: (+17 -13) LegalizeDAG.cpp | 28 ++++++++++++++++------------ ScheduleDAG.cpp | 2 +- 2 files changed, 17 insertions(+), 13 deletions(-) Index: llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp diff -u llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp:1.239 llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp:1.240 --- llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp:1.239 Wed Dec 21 14:21:51 2005 +++ llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp Wed Dec 21 14:51:36 2005 @@ -622,18 +622,22 @@ case TargetLowering::Promote: default: assert(0 && "This action is not supported yet!"); case TargetLowering::Expand: { - MachineDebugInfo &DebugInfo = DAG.getMachineFunction().getDebugInfo(); - std::vector Ops; - Ops.push_back(Tmp1); // chain - Ops.push_back(Node->getOperand(1)); // line # - Ops.push_back(Node->getOperand(2)); // col # - const std::string &fname = - cast(Node->getOperand(3))->getValue(); - const std::string &dirname = - cast(Node->getOperand(4))->getValue(); - unsigned id = DebugInfo.RecordSource(fname, dirname); - Ops.push_back(DAG.getConstant(id, MVT::i32)); // source file id - Result = DAG.getNode(ISD::DEBUG_LOC, MVT::Other, Ops); + if (TLI.isOperationLegal(ISD::DEBUG_LOC, MVT::Other)) { + MachineDebugInfo &DebugInfo = DAG.getMachineFunction().getDebugInfo(); + std::vector Ops; + Ops.push_back(Tmp1); // chain + Ops.push_back(Node->getOperand(1)); // line # + Ops.push_back(Node->getOperand(2)); // col # + const std::string &fname = + cast(Node->getOperand(3))->getValue(); + const std::string &dirname = + cast(Node->getOperand(4))->getValue(); + unsigned id = DebugInfo.RecordSource(fname, dirname); + Ops.push_back(DAG.getConstant(id, MVT::i32)); // source file id + Result = DAG.getNode(ISD::DEBUG_LOC, MVT::Other, Ops); + } else { + Result = Tmp1; // chain + } Result = LegalizeOp(Result); // Relegalize new nodes. break; } Index: llvm/lib/CodeGen/SelectionDAG/ScheduleDAG.cpp diff -u llvm/lib/CodeGen/SelectionDAG/ScheduleDAG.cpp:1.53 llvm/lib/CodeGen/SelectionDAG/ScheduleDAG.cpp:1.54 --- llvm/lib/CodeGen/SelectionDAG/ScheduleDAG.cpp:1.53 Mon Dec 19 10:32:26 2005 +++ llvm/lib/CodeGen/SelectionDAG/ScheduleDAG.cpp Wed Dec 21 14:51:36 2005 @@ -691,7 +691,7 @@ } else { Ordering.push_back(NI); } - + // Iterate through all nodes that have been added for (unsigned i = 0; i < Ordering.size(); i++) { // note: size() varies // Visit all operands From jlaskey at apple.com Wed Dec 21 14:51:51 2005 From: jlaskey at apple.com (Jim Laskey) Date: Wed, 21 Dec 2005 14:51:51 -0600 Subject: [llvm-commits] CVS: llvm/lib/Target/SparcV8/SparcV8ISelDAGToDAG.cpp Message-ID: <200512212051.OAA07064@zion.cs.uiuc.edu> Changes in directory llvm/lib/Target/SparcV8: SparcV8ISelDAGToDAG.cpp updated: 1.30 -> 1.31 --- Log message: Disengage DEBUG_LOC from non-PPC targets. --- Diffs of the changes: (+5 -0) SparcV8ISelDAGToDAG.cpp | 5 +++++ 1 files changed, 5 insertions(+) Index: llvm/lib/Target/SparcV8/SparcV8ISelDAGToDAG.cpp diff -u llvm/lib/Target/SparcV8/SparcV8ISelDAGToDAG.cpp:1.30 llvm/lib/Target/SparcV8/SparcV8ISelDAGToDAG.cpp:1.31 --- llvm/lib/Target/SparcV8/SparcV8ISelDAGToDAG.cpp:1.30 Tue Dec 20 23:27:51 2005 +++ llvm/lib/Target/SparcV8/SparcV8ISelDAGToDAG.cpp Wed Dec 21 14:51:37 2005 @@ -147,6 +147,11 @@ setOperationAction(ISD::SHL_PARTS, MVT::i32, Expand); setOperationAction(ISD::SRA_PARTS, MVT::i32, Expand); setOperationAction(ISD::SRL_PARTS, MVT::i32, Expand); + + // We don't have line number support yet. + setOperationAction(ISD::LOCATION, MVT::Other, Expand); + setOperationAction(ISD::DEBUG_LOC, MVT::Other, Expand); + computeRegisterProperties(); } From jlaskey at apple.com Wed Dec 21 14:51:51 2005 From: jlaskey at apple.com (Jim Laskey) Date: Wed, 21 Dec 2005 14:51:51 -0600 Subject: [llvm-commits] CVS: llvm/lib/Target/X86/X86ISelLowering.cpp Message-ID: <200512212051.OAA07058@zion.cs.uiuc.edu> Changes in directory llvm/lib/Target/X86: X86ISelLowering.cpp updated: 1.13 -> 1.14 --- Log message: Disengage DEBUG_LOC from non-PPC targets. --- Diffs of the changes: (+1 -0) X86ISelLowering.cpp | 1 + 1 files changed, 1 insertion(+) Index: llvm/lib/Target/X86/X86ISelLowering.cpp diff -u llvm/lib/Target/X86/X86ISelLowering.cpp:1.13 llvm/lib/Target/X86/X86ISelLowering.cpp:1.14 --- llvm/lib/Target/X86/X86ISelLowering.cpp:1.13 Wed Dec 21 14:21:51 2005 +++ llvm/lib/Target/X86/X86ISelLowering.cpp Wed Dec 21 14:51:37 2005 @@ -126,6 +126,7 @@ // We don't have line number support yet. setOperationAction(ISD::LOCATION, MVT::Other, Expand); + setOperationAction(ISD::DEBUG_LOC, MVT::Other, Expand); if (X86ScalarSSE) { // Set up the FP register classes. From evan.cheng at apple.com Wed Dec 21 16:22:27 2005 From: evan.cheng at apple.com (Evan Cheng) Date: Wed, 21 Dec 2005 16:22:27 -0600 Subject: [llvm-commits] CVS: llvm/lib/Target/X86/X86InstrInfo.td Message-ID: <200512212222.QAA09225@zion.cs.uiuc.edu> Changes in directory llvm/lib/Target/X86: X86InstrInfo.td updated: 1.180 -> 1.181 --- Log message: Oops. Accidentally deleted RET pattern. It's still needed for return void; --- Diffs of the changes: (+1 -1) X86InstrInfo.td | 2 +- 1 files changed, 1 insertion(+), 1 deletion(-) Index: llvm/lib/Target/X86/X86InstrInfo.td diff -u llvm/lib/Target/X86/X86InstrInfo.td:1.180 llvm/lib/Target/X86/X86InstrInfo.td:1.181 --- llvm/lib/Target/X86/X86InstrInfo.td:1.180 Wed Dec 21 14:21:51 2005 +++ llvm/lib/Target/X86/X86InstrInfo.td Wed Dec 21 16:22:16 2005 @@ -290,7 +290,7 @@ // Return instructions. let isTerminator = 1, isReturn = 1, isBarrier = 1, hasCtrlDep = 1 in - def RET : I<0xC3, RawFrm, (ops), "ret", []>; + def RET : I<0xC3, RawFrm, (ops), "ret", [(ret)]>; let isTerminator = 1, isReturn = 1, isBarrier = 1, hasCtrlDep = 1 in def RETI : Ii16<0xC2, RawFrm, (ops i16imm:$amt), "ret $amt", []>; From evan.cheng at apple.com Wed Dec 21 17:05:51 2005 From: evan.cheng at apple.com (Evan Cheng) Date: Wed, 21 Dec 2005 17:05:51 -0600 Subject: [llvm-commits] CVS: llvm/lib/Target/TargetLowering.cpp Message-ID: <200512212305.RAA09406@zion.cs.uiuc.edu> Changes in directory llvm/lib/Target: TargetLowering.cpp updated: 1.16 -> 1.17 --- Log message: * Fix a GlobalAddress lowering bug. * Teach DAG combiner about X86ISD::SETCC by adding a TargetLowering hook. --- Diffs of the changes: (+5 -0) TargetLowering.cpp | 5 +++++ 1 files changed, 5 insertions(+) Index: llvm/lib/Target/TargetLowering.cpp diff -u llvm/lib/Target/TargetLowering.cpp:1.16 llvm/lib/Target/TargetLowering.cpp:1.17 --- llvm/lib/Target/TargetLowering.cpp:1.16 Tue Dec 20 00:22:03 2005 +++ llvm/lib/Target/TargetLowering.cpp Wed Dec 21 17:05:39 2005 @@ -125,3 +125,8 @@ const char *TargetLowering::getTargetNodeName(unsigned Opcode) const { return NULL; } + +bool isMaskedValueZeroForTargetNode(const SDOperand &Op, + uint64_t Mask) const { + return false; +} From evan.cheng at apple.com Wed Dec 21 17:05:52 2005 From: evan.cheng at apple.com (Evan Cheng) Date: Wed, 21 Dec 2005 17:05:52 -0600 Subject: [llvm-commits] CVS: llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp Message-ID: <200512212305.RAA09410@zion.cs.uiuc.edu> Changes in directory llvm/lib/CodeGen/SelectionDAG: DAGCombiner.cpp updated: 1.69 -> 1.70 --- Log message: * Fix a GlobalAddress lowering bug. * Teach DAG combiner about X86ISD::SETCC by adding a TargetLowering hook. --- Diffs of the changes: (+4 -1) DAGCombiner.cpp | 5 ++++- 1 files changed, 4 insertions(+), 1 deletion(-) Index: llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp diff -u llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp:1.69 llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp:1.70 --- llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp:1.69 Thu Dec 15 13:02:38 2005 +++ llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp Wed Dec 21 17:05:39 2005 @@ -455,7 +455,10 @@ // Bit counting instructions can not set the high bits of the result // register. The max number of bits sets depends on the input. return (Mask & (MVT::getSizeInBits(Op.getValueType())*2-1)) == 0; - default: break; + default: + if (Op.getOpcode() >= ISD::BUILTIN_OP_END) + return TLI.isMaskedValueZeroForTargetNode(Op, Mask); + break; } return false; } From evan.cheng at apple.com Wed Dec 21 17:05:52 2005 From: evan.cheng at apple.com (Evan Cheng) Date: Wed, 21 Dec 2005 17:05:52 -0600 Subject: [llvm-commits] CVS: llvm/lib/Target/X86/X86ISelDAGToDAG.cpp X86ISelLowering.cpp X86ISelLowering.h X86InstrInfo.td Message-ID: <200512212305.RAA09420@zion.cs.uiuc.edu> Changes in directory llvm/lib/Target/X86: X86ISelDAGToDAG.cpp updated: 1.18 -> 1.19 X86ISelLowering.cpp updated: 1.14 -> 1.15 X86ISelLowering.h updated: 1.7 -> 1.8 X86InstrInfo.td updated: 1.181 -> 1.182 --- Log message: * Fix a GlobalAddress lowering bug. * Teach DAG combiner about X86ISD::SETCC by adding a TargetLowering hook. --- Diffs of the changes: (+29 -5) X86ISelDAGToDAG.cpp | 1 + X86ISelLowering.cpp | 23 ++++++++++++++++++++--- X86ISelLowering.h | 6 ++++++ X86InstrInfo.td | 4 ++-- 4 files changed, 29 insertions(+), 5 deletions(-) Index: llvm/lib/Target/X86/X86ISelDAGToDAG.cpp diff -u llvm/lib/Target/X86/X86ISelDAGToDAG.cpp:1.18 llvm/lib/Target/X86/X86ISelDAGToDAG.cpp:1.19 --- llvm/lib/Target/X86/X86ISelDAGToDAG.cpp:1.18 Tue Dec 20 20:41:57 2005 +++ llvm/lib/Target/X86/X86ISelDAGToDAG.cpp Wed Dec 21 17:05:39 2005 @@ -172,6 +172,7 @@ break; case ISD::GlobalAddress: + case ISD::TargetGlobalAddress: if (AM.GV == 0) { AM.GV = cast(N)->getGlobal(); return false; Index: llvm/lib/Target/X86/X86ISelLowering.cpp diff -u llvm/lib/Target/X86/X86ISelLowering.cpp:1.14 llvm/lib/Target/X86/X86ISelLowering.cpp:1.15 --- llvm/lib/Target/X86/X86ISelLowering.cpp:1.14 Wed Dec 21 14:51:37 2005 +++ llvm/lib/Target/X86/X86ISelLowering.cpp Wed Dec 21 17:05:39 2005 @@ -122,6 +122,7 @@ setOperationAction(ISD::SETCC , MVT::i8 , Custom); setOperationAction(ISD::SETCC , MVT::i16 , Custom); setOperationAction(ISD::SETCC , MVT::i32 , Custom); + setOperationAction(ISD::GlobalAddress , MVT::i32 , Custom); } // We don't have line number support yet. @@ -1051,6 +1052,7 @@ } case ISD::GlobalAddress: GlobalValue *GV = cast(Op)->getGlobal(); + SDOperand GVOp = DAG.getTargetGlobalAddress(GV, getPointerTy()); // For Darwin, external and weak symbols are indirect, so we want to load // the value at address GV, not the value of GV itself. This means that // the GlobalAddress must be in the base or index register of the address, @@ -1058,10 +1060,10 @@ if (getTargetMachine(). getSubtarget().getIndirectExternAndWeakGlobals() && (GV->hasWeakLinkage() || GV->isExternal())) - return DAG.getLoad(MVT::i32, DAG.getEntryNode(), Op, - DAG.getSrcValue(NULL)); + return DAG.getLoad(MVT::i32, DAG.getEntryNode(), + GVOp, DAG.getSrcValue(NULL)); else - return Op; + return GVOp; break; } } @@ -1086,3 +1088,18 @@ case X86ISD::RET_FLAG: return "X86ISD::RET_FLAG"; } } + +bool X86TargetLowering::isMaskedValueZeroForTargetNode(const SDOperand &Op, + uint64_t Mask) const { + + unsigned Opc = Op.getOpcode(); + + switch (Opc) { + default: + assert(Opc >= ISD::BUILTIN_OP_END && "Expected a target specific node"); + break; + case X86ISD::SETCC: return (Mask & 1) == 0; + } + + return false; +} Index: llvm/lib/Target/X86/X86ISelLowering.h diff -u llvm/lib/Target/X86/X86ISelLowering.h:1.7 llvm/lib/Target/X86/X86ISelLowering.h:1.8 --- llvm/lib/Target/X86/X86ISelLowering.h:1.7 Wed Dec 21 14:21:51 2005 +++ llvm/lib/Target/X86/X86ISelLowering.h Wed Dec 21 17:05:39 2005 @@ -155,6 +155,12 @@ /// DAG node. virtual const char *getTargetNodeName(unsigned Opcode) const; + /// isMaskedValueZeroForTargetNode - Return true if 'Op & Mask' is known to + /// be zero. Op is expected to be a target specific node. Used by DAG + /// combiner. + virtual bool isMaskedValueZeroForTargetNode(const SDOperand &Op, + uint64_t Mask) const; + SDOperand getReturnAddressFrameIndex(SelectionDAG &DAG); private: Index: llvm/lib/Target/X86/X86InstrInfo.td diff -u llvm/lib/Target/X86/X86InstrInfo.td:1.181 llvm/lib/Target/X86/X86InstrInfo.td:1.182 --- llvm/lib/Target/X86/X86InstrInfo.td:1.181 Wed Dec 21 16:22:16 2005 +++ llvm/lib/Target/X86/X86InstrInfo.td Wed Dec 21 17:05:39 2005 @@ -98,8 +98,8 @@ // Define X86 specific addressing mode. def addr : ComplexPattern; def leaaddr : ComplexPattern; + [add, frameindex, constpool, + globaladdr, tglobaladdr, externalsym]>; //===----------------------------------------------------------------------===// // X86 Instruction Format Definitions. From evan.cheng at apple.com Wed Dec 21 17:15:05 2005 From: evan.cheng at apple.com (Evan Cheng) Date: Wed, 21 Dec 2005 17:15:05 -0600 Subject: [llvm-commits] CVS: llvm/lib/Target/TargetLowering.cpp Message-ID: <200512212315.RAA09465@zion.cs.uiuc.edu> Changes in directory llvm/lib/Target: TargetLowering.cpp updated: 1.17 -> 1.18 --- Log message: Lefted out TargetLowering:: --- Diffs of the changes: (+2 -2) TargetLowering.cpp | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-) Index: llvm/lib/Target/TargetLowering.cpp diff -u llvm/lib/Target/TargetLowering.cpp:1.17 llvm/lib/Target/TargetLowering.cpp:1.18 --- llvm/lib/Target/TargetLowering.cpp:1.17 Wed Dec 21 17:05:39 2005 +++ llvm/lib/Target/TargetLowering.cpp Wed Dec 21 17:14:54 2005 @@ -126,7 +126,7 @@ return NULL; } -bool isMaskedValueZeroForTargetNode(const SDOperand &Op, - uint64_t Mask) const { +bool TargetLowering::isMaskedValueZeroForTargetNode(const SDOperand &Op, + uint64_t Mask) const { return false; } From evan.cheng at apple.com Wed Dec 21 17:15:52 2005 From: evan.cheng at apple.com (Evan Cheng) Date: Wed, 21 Dec 2005 17:15:52 -0600 Subject: [llvm-commits] CVS: llvm/include/llvm/Target/TargetLowering.h Message-ID: <200512212315.RAA09479@zion.cs.uiuc.edu> Changes in directory llvm/include/llvm/Target: TargetLowering.h updated: 1.30 -> 1.31 --- Log message: Added TargetLowering::isMaskedValueZeroForTargetNode() declaration. --- Diffs of the changes: (+8 -2) TargetLowering.h | 10 ++++++++-- 1 files changed, 8 insertions(+), 2 deletions(-) Index: llvm/include/llvm/Target/TargetLowering.h diff -u llvm/include/llvm/Target/TargetLowering.h:1.30 llvm/include/llvm/Target/TargetLowering.h:1.31 --- llvm/include/llvm/Target/TargetLowering.h:1.30 Tue Dec 20 00:22:03 2005 +++ llvm/include/llvm/Target/TargetLowering.h Wed Dec 21 17:15:41 2005 @@ -375,10 +375,16 @@ /// implement this. The default implementation of this aborts. virtual SDOperand LowerOperation(SDOperand Op, SelectionDAG &DAG); - // getTargetNodeName() - This method returns the name of a target specific - // DAG node. + /// getTargetNodeName() - This method returns the name of a target specific + /// DAG node. virtual const char *getTargetNodeName(unsigned Opcode) const; + /// isMaskedValueZeroForTargetNode - Return true if 'Op & Mask' is known to + /// be zero. Op is expected to be a target specific node. Used by DAG + /// combiner. + virtual bool isMaskedValueZeroForTargetNode(const SDOperand &Op, + uint64_t Mask) const; + //===--------------------------------------------------------------------===// // Scheduler hooks // From reid at x10sys.com Wed Dec 21 17:17:18 2005 From: reid at x10sys.com (Reid Spencer) Date: Wed, 21 Dec 2005 17:17:18 -0600 Subject: [llvm-commits] CVS: llvm/Makefile.rules Message-ID: <200512212317.RAA09490@zion.cs.uiuc.edu> Changes in directory llvm: Makefile.rules updated: 1.336 -> 1.337 --- Log message: Some simple cleanups: 1. When srcdir == objdir have "spotless" say that it isn't supported in that mode rather than just let make say "no such target" 2. Minor doc cleanups 3. Fix the double rebuild problem with yacc files. A missing dependency caused parallel builds to skip building the .cpp file after the .cpp file was regenerated by bison. --- Diffs of the changes: (+12 -6) Makefile.rules | 18 ++++++++++++------ 1 files changed, 12 insertions(+), 6 deletions(-) Index: llvm/Makefile.rules diff -u llvm/Makefile.rules:1.336 llvm/Makefile.rules:1.337 --- llvm/Makefile.rules:1.336 Tue Dec 20 21:31:52 2005 +++ llvm/Makefile.rules Wed Dec 21 17:17:06 2005 @@ -108,6 +108,9 @@ else \ $(EchoCmd) "make spotless" can only be run from $(PROJ_OBJ_ROOT); \ fi +else +spotless: + $(EchoCmd) "spotless target not supported for objdir == srcdir" endif $(BUILT_SOURCES) : $(ObjMakefiles) @@ -475,9 +478,9 @@ done endif -#--------------------------------------------------------- +#----------------------------------------------------------- # Handle the PARALLEL_DIRS options for parallel construction -#--------------------------------------------------------- +#----------------------------------------------------------- ifdef PARALLEL_DIRS SubDirs += $(PARALLEL_DIRS) @@ -1219,7 +1222,6 @@ clean-local:: -$(Verb) $(RM) -f $(LexOutput) - $(Verb) $(RM) -f $(LexOutput) endif @@ -1230,7 +1232,6 @@ YaccFiles := $(filter %.y,$(Sources)) ifneq ($(YaccFiles),) -YaccOutput := $(addprefix $(patsubst %.y,%,$(YaccFiles)),.output) .PRECIOUS: $(YaccOutput) @@ -1239,7 +1240,7 @@ %.cpp: %.y %.h: %.y -# Rule for building the bison parsers... +# Rule for building the bison based parsers... $(PROJ_SRC_DIR)/%.cpp $(PROJ_SRC_DIR)/%.h : $(PROJ_SRC_DIR)/%.y $(Echo) "Bisoning $*.y" $(Verb) $(BISON) -v -d -p $( Changes in directory llvm/include/llvm/CodeGen: DwarfWriter.h updated: 1.2 -> 1.3 --- Log message: Add an eol at the end to shut gcc up. --- Diffs of the changes: (+1 -1) DwarfWriter.h | 2 +- 1 files changed, 1 insertion(+), 1 deletion(-) Index: llvm/include/llvm/CodeGen/DwarfWriter.h diff -u llvm/include/llvm/CodeGen/DwarfWriter.h:1.2 llvm/include/llvm/CodeGen/DwarfWriter.h:1.3 --- llvm/include/llvm/CodeGen/DwarfWriter.h:1.2 Wed Dec 21 13:46:32 2005 +++ llvm/include/llvm/CodeGen/DwarfWriter.h Wed Dec 21 19:40:06 2005 @@ -425,4 +425,4 @@ } // end llvm namespace -#endif \ No newline at end of file +#endif From reid at x10sys.com Wed Dec 21 19:41:12 2005 From: reid at x10sys.com (Reid Spencer) Date: Wed, 21 Dec 2005 19:41:12 -0600 Subject: [llvm-commits] CVS: llvm/lib/CodeGen/DwarfWriter.cpp Message-ID: <200512220141.TAA29592@zion.cs.uiuc.edu> Changes in directory llvm/lib/CodeGen: DwarfWriter.cpp updated: 1.1 -> 1.2 --- Log message: Add an eol at the end to shut gcc sup. --- Diffs of the changes: (+1 -1) DwarfWriter.cpp | 2 +- 1 files changed, 1 insertion(+), 1 deletion(-) Index: llvm/lib/CodeGen/DwarfWriter.cpp diff -u llvm/lib/CodeGen/DwarfWriter.cpp:1.1 llvm/lib/CodeGen/DwarfWriter.cpp:1.2 --- llvm/lib/CodeGen/DwarfWriter.cpp:1.1 Wed Dec 21 13:48:16 2005 +++ llvm/lib/CodeGen/DwarfWriter.cpp Wed Dec 21 19:41:00 2005 @@ -12,4 +12,4 @@ //===----------------------------------------------------------------------===// -#include "llvm/CodeGen/DwarfWriter.h" \ No newline at end of file +#include "llvm/CodeGen/DwarfWriter.h" From jeffc at jolt-lang.org Wed Dec 21 19:45:03 2005 From: jeffc at jolt-lang.org (Jeff Cohen) Date: Wed, 21 Dec 2005 19:45:03 -0600 Subject: [llvm-commits] CVS: llvm/include/llvm/Target/TargetLowering.h Message-ID: <200512220145.TAA29614@zion.cs.uiuc.edu> Changes in directory llvm/include/llvm/Target: TargetLowering.h updated: 1.31 -> 1.32 --- Log message: Make it compile with VC++. --- Diffs of the changes: (+1 -0) TargetLowering.h | 1 + 1 files changed, 1 insertion(+) Index: llvm/include/llvm/Target/TargetLowering.h diff -u llvm/include/llvm/Target/TargetLowering.h:1.31 llvm/include/llvm/Target/TargetLowering.h:1.32 --- llvm/include/llvm/Target/TargetLowering.h:1.31 Wed Dec 21 17:15:41 2005 +++ llvm/include/llvm/Target/TargetLowering.h Wed Dec 21 19:44:51 2005 @@ -24,6 +24,7 @@ #include "llvm/Type.h" #include "llvm/CodeGen/ValueTypes.h" +#include "llvm/support/DataTypes.h" #include namespace llvm { From jeffc at jolt-lang.org Wed Dec 21 19:47:10 2005 From: jeffc at jolt-lang.org (Jeff Cohen) Date: Wed, 21 Dec 2005 19:47:10 -0600 Subject: [llvm-commits] CVS: llvm/include/llvm/Target/TargetLowering.h Message-ID: <200512220147.TAA29627@zion.cs.uiuc.edu> Changes in directory llvm/include/llvm/Target: TargetLowering.h updated: 1.32 -> 1.33 --- Log message: Oh oh... Unix is case sensitive. --- Diffs of the changes: (+1 -1) TargetLowering.h | 2 +- 1 files changed, 1 insertion(+), 1 deletion(-) Index: llvm/include/llvm/Target/TargetLowering.h diff -u llvm/include/llvm/Target/TargetLowering.h:1.32 llvm/include/llvm/Target/TargetLowering.h:1.33 --- llvm/include/llvm/Target/TargetLowering.h:1.32 Wed Dec 21 19:44:51 2005 +++ llvm/include/llvm/Target/TargetLowering.h Wed Dec 21 19:46:59 2005 @@ -24,7 +24,7 @@ #include "llvm/Type.h" #include "llvm/CodeGen/ValueTypes.h" -#include "llvm/support/DataTypes.h" +#include "llvm/Support/DataTypes.h" #include namespace llvm { From jeffc at jolt-lang.org Wed Dec 21 19:50:23 2005 From: jeffc at jolt-lang.org (Jeff Cohen) Date: Wed, 21 Dec 2005 19:50:23 -0600 Subject: [llvm-commits] CVS: llvm/win32/CodeGen/CodeGen.vcproj Message-ID: <200512220150.TAA29659@zion.cs.uiuc.edu> Changes in directory llvm/win32/CodeGen: CodeGen.vcproj updated: 1.16 -> 1.17 --- Log message: Add new files to Visual Studio. --- Diffs of the changes: (+6 -0) CodeGen.vcproj | 6 ++++++ 1 files changed, 6 insertions(+) Index: llvm/win32/CodeGen/CodeGen.vcproj diff -u llvm/win32/CodeGen/CodeGen.vcproj:1.16 llvm/win32/CodeGen/CodeGen.vcproj:1.17 --- llvm/win32/CodeGen/CodeGen.vcproj:1.16 Fri Dec 16 18:14:46 2005 +++ llvm/win32/CodeGen/CodeGen.vcproj Wed Dec 21 19:50:11 2005 @@ -115,6 +115,9 @@ RelativePath="..\..\lib\CodeGen\BranchFolding.cpp"> + + + + Changes in directory llvm/tools/gccld: GenerateCode.cpp updated: 1.55 -> 1.56 gccld.cpp updated: 1.106 -> 1.107 gccld.h updated: 1.17 -> 1.18 --- Log message: Implement PR679: http://llvm.cs.uiuc.edu/PR679 : * Changed the -rpath option from cl::opt to cl::list * Changed the interface to GenerateNative to take a std::vector instead of just a std::string * Changed GenerateNative to generate multiple -Wl,-rpath, options to be passed to gcc. --- Diffs of the changes: (+15 -7) GenerateCode.cpp | 13 ++++++++----- gccld.cpp | 7 ++++++- gccld.h | 2 +- 3 files changed, 15 insertions(+), 7 deletions(-) Index: llvm/tools/gccld/GenerateCode.cpp diff -u llvm/tools/gccld/GenerateCode.cpp:1.55 llvm/tools/gccld/GenerateCode.cpp:1.56 --- llvm/tools/gccld/GenerateCode.cpp:1.55 Thu Nov 3 01:17:51 2005 +++ llvm/tools/gccld/GenerateCode.cpp Wed Dec 21 19:50:56 2005 @@ -352,7 +352,7 @@ const sys::Path &gcc, char ** const envp, bool Shared, bool ExportAllAsDynamic, - const std::string &RPath, + const std::vector &RPaths, const std::string &SOName, bool Verbose) { // Remove these environment variables from the environment of the @@ -394,10 +394,13 @@ if (Shared) args.push_back("-shared"); if (ExportAllAsDynamic) args.push_back("-export-dynamic"); - if (!RPath.empty()) { - std::string rp = "-Wl,-rpath," + RPath; - StringsToDelete.push_back(strdup(rp.c_str())); - args.push_back(StringsToDelete.back()); + if (!RPaths.empty()) { + for (std::vector::const_iterator I = RPaths.begin(), + E = RPaths.end(); I != E; I++) { + std::string rp = "-Wl,-rpath," + *I; + StringsToDelete.push_back(strdup(rp.c_str())); + args.push_back(StringsToDelete.back()); + } } if (!SOName.empty()) { std::string so = "-Wl,-soname," + SOName; Index: llvm/tools/gccld/gccld.cpp diff -u llvm/tools/gccld/gccld.cpp:1.106 llvm/tools/gccld/gccld.cpp:1.107 --- llvm/tools/gccld/gccld.cpp:1.106 Wed Dec 14 13:08:51 2005 +++ llvm/tools/gccld/gccld.cpp Wed Dec 21 19:50:56 2005 @@ -88,7 +88,7 @@ SaveTemps("save-temps", cl::desc("Do not delete temporary files")); - cl::opt + cl::list RPath("rpath", cl::desc("Set runtime shared library search path (requires -native or" " -native-cbe)"), @@ -107,6 +107,11 @@ CO5("eh-frame-hdr", cl::Hidden, cl::desc("Compatibility option: ignored")); cl::opt CO6("h", cl::Hidden, cl::desc("Compatibility option: ignored")); + cl::opt + CO7("start-group", cl::Hidden, cl::desc("Compatibility option: ignored")); + cl::opt + CO8("end-group", cl::Hidden, cl::desc("Compatibility option: ignored")); + cl::alias A0("s", cl::desc("Alias for --strip-all"), cl::aliasopt(Strip)); cl::alias A1("S", cl::desc("Alias for --strip-debug"), Index: llvm/tools/gccld/gccld.h diff -u llvm/tools/gccld/gccld.h:1.17 llvm/tools/gccld/gccld.h:1.18 --- llvm/tools/gccld/gccld.h:1.17 Tue Aug 2 17:07:38 2005 +++ llvm/tools/gccld/gccld.h Wed Dec 21 19:50:56 2005 @@ -46,7 +46,7 @@ char ** const envp, bool Shared, bool ExportAllAsDynamic, - const std::string &RPath, + const std::vector &RPath, const std::string &SOName, bool Verbose=false); From reid at x10sys.com Wed Dec 21 20:08:42 2005 From: reid at x10sys.com (Reid Spencer) Date: Wed, 21 Dec 2005 20:08:42 -0600 Subject: [llvm-commits] CVS: llvm/autoconf/m4/sanity_check.m4 Message-ID: <200512220208.UAA29867@zion.cs.uiuc.edu> Changes in directory llvm/autoconf/m4: sanity_check.m4 updated: 1.1 -> 1.2 --- Log message: For PR678: http://llvm.cs.uiuc.edu/PR678 : * Make it possible to pass a fourth argument to the CHECK_PROGRAM_SANITY macro that controls whether a non-sane program generates an error or a warning. --- Diffs of the changes: (+8 -2) sanity_check.m4 | 10 ++++++++-- 1 files changed, 8 insertions(+), 2 deletions(-) Index: llvm/autoconf/m4/sanity_check.m4 diff -u llvm/autoconf/m4/sanity_check.m4:1.1 llvm/autoconf/m4/sanity_check.m4:1.2 --- llvm/autoconf/m4/sanity_check.m4:1.1 Sat Jul 16 19:50:40 2005 +++ llvm/autoconf/m4/sanity_check.m4 Wed Dec 21 20:08:30 2005 @@ -5,6 +5,7 @@ dnl $1 - Name or full path of the program to run dnl $2 - Argument to pass to print out identification string dnl $3 - grep RE to match identification string +dnl $4 - set to 1 to make errors only a warning AC_DEFUN([CHECK_PROGRAM_SANITY], [ AC_MSG_CHECKING([sanity for program ]$1) @@ -13,9 +14,14 @@ sanity=`$1 $2 2>&1 | grep "$3"` if test -z "$sanity" ; then AC_MSG_RESULT([no]) - AC_MSG_ERROR([Program ]$1[ failed to pass sanity check.]) + if test "$4" -eq 1 ; then + AC_MSG_WARN([Program ]$1[ failed to pass sanity check.]) + else + AC_MSG_ERROR([Program ]$1[ failed to pass sanity check.]) + fi + else + AC_MSG_RESULT([yes]) fi - AC_MSG_RESULT([yes]) else AC_MSG_RESULT([not found]) fi From reid at x10sys.com Wed Dec 21 20:10:38 2005 From: reid at x10sys.com (Reid Spencer) Date: Wed, 21 Dec 2005 20:10:38 -0600 Subject: [llvm-commits] CVS: llvm-test/configure Message-ID: <200512220210.UAA29928@zion.cs.uiuc.edu> Changes in directory llvm-test: configure updated: 1.30 -> 1.31 --- Log message: Fix PR678: http://llvm.cs.uiuc.edu/PR678 : Use the 4th argument to CHECK_PROGRAM_SANITY in order to turn a failed sanity check into a warning instead of an error. --- Diffs of the changes: (+9 -3) configure | 12 +++++++++--- 1 files changed, 9 insertions(+), 3 deletions(-) Index: llvm-test/configure diff -u llvm-test/configure:1.30 llvm-test/configure:1.31 --- llvm-test/configure:1.30 Tue Nov 8 15:13:45 2005 +++ llvm-test/configure Wed Dec 21 20:10:25 2005 @@ -19287,12 +19287,18 @@ if test -z "$sanity" ; then echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 - { { echo "$as_me:$LINENO: error: Program f95 failed to pass sanity check." >&5 + if test "1" -eq 1 ; then + { echo "$as_me:$LINENO: WARNING: Program f95 failed to pass sanity check." >&5 +echo "$as_me: WARNING: Program f95 failed to pass sanity check." >&2;} + else + { { echo "$as_me:$LINENO: error: Program f95 failed to pass sanity check." >&5 echo "$as_me: error: Program f95 failed to pass sanity check." >&2;} { (exit 1); exit 1; }; } - fi - echo "$as_me:$LINENO: result: yes" >&5 + fi + else + echo "$as_me:$LINENO: result: yes" >&5 echo "${ECHO_T}yes" >&6 + fi else echo "$as_me:$LINENO: result: not found" >&5 echo "${ECHO_T}not found" >&6 From reid at x10sys.com Wed Dec 21 20:10:38 2005 From: reid at x10sys.com (Reid Spencer) Date: Wed, 21 Dec 2005 20:10:38 -0600 Subject: [llvm-commits] CVS: llvm-test/autoconf/configure.ac Message-ID: <200512220210.UAA29929@zion.cs.uiuc.edu> Changes in directory llvm-test/autoconf: configure.ac updated: 1.29 -> 1.30 --- Log message: Fix PR678: http://llvm.cs.uiuc.edu/PR678 : Use the 4th argument to CHECK_PROGRAM_SANITY in order to turn a failed sanity check into a warning instead of an error. --- Diffs of the changes: (+1 -1) configure.ac | 2 +- 1 files changed, 1 insertion(+), 1 deletion(-) Index: llvm-test/autoconf/configure.ac diff -u llvm-test/autoconf/configure.ac:1.29 llvm-test/autoconf/configure.ac:1.30 --- llvm-test/autoconf/configure.ac:1.29 Tue Nov 8 15:13:47 2005 +++ llvm-test/autoconf/configure.ac Wed Dec 21 20:10:25 2005 @@ -93,7 +93,7 @@ FIND_STD_PROGRAM(f2c,f2c.h,libf2c.a) dnl Check for the NAG f95 FORTRAN -> C translator FIND_STD_PROGRAM(f95,,libf97.dylib,[nag fortran]) -CHECK_PROGRAM_SANITY([f95],[-V],[NAGWare Fortran 95]) +CHECK_PROGRAM_SANITY([f95],[-V],[NAGWare Fortran 95],1) dnl Checks for header files. dnl We don't check for ancient stuff or things that are guaranteed to be there From evan.cheng at apple.com Wed Dec 21 20:25:02 2005 From: evan.cheng at apple.com (Evan Cheng) Date: Wed, 21 Dec 2005 20:25:02 -0600 Subject: [llvm-commits] CVS: llvm/utils/TableGen/DAGISelEmitter.cpp DAGISelEmitter.h Message-ID: <200512220225.UAA30038@zion.cs.uiuc.edu> Changes in directory llvm/utils/TableGen: DAGISelEmitter.cpp updated: 1.111 -> 1.112 DAGISelEmitter.h updated: 1.46 -> 1.47 --- Log message: * Added support for FLAG - a special nameless flag register. Can be used as either an operand or a result. * Fixed some more flag / chain bugs. --- Diffs of the changes: (+68 -65) DAGISelEmitter.cpp | 120 +++++++++++++++++++++++++++++------------------------ DAGISelEmitter.h | 13 ----- 2 files changed, 68 insertions(+), 65 deletions(-) Index: llvm/utils/TableGen/DAGISelEmitter.cpp diff -u llvm/utils/TableGen/DAGISelEmitter.cpp:1.111 llvm/utils/TableGen/DAGISelEmitter.cpp:1.112 --- llvm/utils/TableGen/DAGISelEmitter.cpp:1.111 Wed Dec 21 14:20:49 2005 +++ llvm/utils/TableGen/DAGISelEmitter.cpp Wed Dec 21 20:24:50 2005 @@ -489,6 +489,9 @@ } else if (R->getName() == "node" || R->getName() == "srcvalue") { // Placeholder. return MVT::isUnknown; + } else if (R->getName() == "FLAG") { + // Some pseudo flag operand. + return MVT::Flag; } TP.error("Unknown node flavor used in pattern: " + R->getName()); @@ -952,17 +955,13 @@ /// HandleUse - Given "Pat" a leaf in the pattern, check to see if it is an /// instruction input. Return true if this is a real use. static bool HandleUse(TreePattern *I, TreePatternNode *Pat, - std::map &InstInputs, - std::vector &InstImpInputs) { + std::map &InstInputs) { // No name -> not interesting. if (Pat->getName().empty()) { if (Pat->isLeaf()) { DefInit *DI = dynamic_cast(Pat->getLeafValue()); if (DI && DI->getDef()->isSubClassOf("RegisterClass")) I->error("Input " + DI->getDef()->getName() + " must be named!"); - else if (DI && DI->getDef()->isSubClassOf("Register")) { - InstImpInputs.push_back(DI->getDef()); - } } return false; } @@ -1009,10 +1008,9 @@ FindPatternInputsAndOutputs(TreePattern *I, TreePatternNode *Pat, std::map &InstInputs, std::map &InstResults, - std::vector &InstImpInputs, std::vector &InstImpResults) { if (Pat->isLeaf()) { - bool isUse = HandleUse(I, Pat, InstInputs, InstImpInputs); + bool isUse = HandleUse(I, Pat, InstInputs); if (!isUse && Pat->getTransformFn()) I->error("Cannot specify a transform function for a non-input value!"); return; @@ -1023,14 +1021,14 @@ if (Pat->getChild(i)->getExtType() == MVT::isVoid) I->error("Cannot have void nodes inside of patterns!"); FindPatternInputsAndOutputs(I, Pat->getChild(i), InstInputs, InstResults, - InstImpInputs, InstImpResults); + InstImpResults); } // If this is a non-leaf node with no children, treat it basically as if // it were a leaf. This handles nodes like (imm). bool isUse = false; if (Pat->getNumChildren() == 0) - isUse = HandleUse(I, Pat, InstInputs, InstImpInputs); + isUse = HandleUse(I, Pat, InstInputs); if (!isUse && Pat->getTransformFn()) I->error("Cannot specify a transform function for a non-input value!"); @@ -1063,7 +1061,8 @@ if (InstResults.count(Dest->getName())) I->error("cannot set '" + Dest->getName() +"' multiple times"); InstResults[Dest->getName()] = Val->getDef(); - } else if (Val->getDef()->isSubClassOf("Register")) { + } else if (Val->getDef()->isSubClassOf("Register") || + Val->getDef()->getName() == "FLAG") { InstImpResults.push_back(Val->getDef()); } else { I->error("set destination should be a register!"); @@ -1071,7 +1070,7 @@ // Verify and collect info from the computation. FindPatternInputsAndOutputs(I, Pat->getChild(i+NumValues), - InstInputs, InstResults, InstImpInputs, InstImpResults); + InstInputs, InstResults, InstImpResults); } } @@ -1147,8 +1146,7 @@ std::vector ImpResults; std::vector ImpOperands; Instructions.insert(std::make_pair(Instrs[i], - DAGInstruction(0, Results, Operands, - ImpResults, ImpOperands))); + DAGInstruction(0, Results, Operands, ImpResults))); continue; // no pattern. } @@ -1169,8 +1167,6 @@ // InstResults - Keep track of all the virtual registers that are 'set' // in the instruction, including what reg class they are. std::map InstResults; - - std::vector InstImpInputs; std::vector InstImpResults; // Verify that the top-level forms in the instruction are of void type, and @@ -1183,7 +1179,7 @@ // Find inputs and outputs, and verify the structure of the uses/defs. FindPatternInputsAndOutputs(I, Pat, InstInputs, InstResults, - InstImpInputs, InstImpResults); + InstImpResults); } // Now that we have inputs and outputs of the pattern, inspect the operands @@ -1272,7 +1268,7 @@ new TreePatternNode(I->getRecord(), ResultNodeOperands); // Create and insert the instruction. - DAGInstruction TheInst(I, Results, Operands, InstImpResults, InstImpInputs); + DAGInstruction TheInst(I, Results, Operands, InstImpResults); Instructions.insert(std::make_pair(I->getRecord(), TheInst)); // Use a temporary tree pattern to infer all types and make sure that the @@ -1346,11 +1342,10 @@ { std::map InstInputs; std::map InstResults; - std::vector InstImpInputs; std::vector InstImpResults; FindPatternInputsAndOutputs(Pattern, Pattern->getOnlyTree(), InstInputs, InstResults, - InstImpInputs, InstImpResults); + InstImpResults); } ListInit *LI = Patterns[i]->getValueAsListInit("ResultInstrs"); @@ -1763,13 +1758,15 @@ std::vector > FoldedChains; bool FoundChain; unsigned TmpNo; + unsigned NumImpInputs; public: PatternCodeEmitter(DAGISelEmitter &ise, ListInit *preds, TreePatternNode *pattern, TreePatternNode *instr, unsigned PatNum, std::ostream &os) : ISE(ise), Predicates(preds), Pattern(pattern), Instruction(instr), - PatternNo(PatNum), OS(os), FoundChain(false), TmpNo(0) {} + PatternNo(PatNum), OS(os), FoundChain(false), TmpNo(0), + NumImpInputs(0) {} /// isPredeclaredSDOperand - Return true if this is one of the predeclared /// SDOperands. @@ -1904,8 +1901,13 @@ if (LeafRec->isSubClassOf("RegisterClass")) { // Handle register references. Nothing to do here. } else if (LeafRec->isSubClassOf("Register")) { + // Handle register references. + NumImpInputs++; } else if (LeafRec->isSubClassOf("ComplexPattern")) { // Handle complex pattern. Nothing to do here. + } else if (LeafRec->getName() == "FLAG") { + // Handle pseudo FLAG register nodes. + NumImpInputs++; } else if (LeafRec->getName() == "srcvalue") { // Place holder for SRCVALUE nodes. Nothing to do here. } else if (LeafRec->isSubClassOf("ValueType")) { @@ -1920,6 +1922,7 @@ << ") goto P" << PatternNo << "Fail;\n"; } else { Child->dump(); + std::cerr << " "; assert(0 && "Unknown leaf type!"); } } else if (IntInit *II = dynamic_cast(Child->getLeafValue())) { @@ -2045,11 +2048,8 @@ Record *Op = N->getOperator(); if (Op->isSubClassOf("Instruction")) { const DAGInstruction &Inst = ISE.getInstruction(Op); - unsigned NumImpResults = Inst.getNumImpResults(); - unsigned NumImpOperands = Inst.getNumImpOperands(); - bool InFlag = NumImpOperands > 0; - bool OutFlag = NumImpResults > 0; - bool IsCopyFromReg = false; + bool InFlag = NumImpInputs > 0; + bool OutFlag = Inst.getNumImpResults() > 0; if (InFlag || OutFlag) OS << " InFlag = SDOperand(0, 0);\n"; @@ -2147,41 +2147,50 @@ ValNo++; } - if (II.hasCtrlDep) { + if (II.hasCtrlDep) OS << " Chain = Result.getValue(" << ValNo << ");\n"; - if (OutFlag) - OS << " InFlag = Result.getValue(" << ValNo+1 << ");\n"; - } else if (OutFlag) - OS << " InFlag = Result.getValue(" << ValNo << ");\n"; if (OutFlag) - IsCopyFromReg = EmitCopyFromRegs(N, II.hasCtrlDep); - if (IsCopyFromReg) - OS << " CodeGenMap[N.getValue(" << ValNo++ << ")] = Result;\n"; + OS << " InFlag = Result.getValue(" + << ValNo + (unsigned)II.hasCtrlDep << ");\n"; - if (OutFlag) - OS << " CodeGenMap[N.getValue(" << ValNo++ << ")] = InFlag;\n"; + unsigned NumCopies = 0; + if (OutFlag) { + NumCopies = EmitCopyFromRegs(N, II.hasCtrlDep); + for (unsigned i = 0; i < NumCopies; i++) { + OS << " CodeGenMap[N.getValue(" << ValNo << ")] = " + << "Result.getValue(" << ValNo << ");\n"; + ValNo++; + } + } + + // User does not expect that I produce a chain! + bool AddedChain = + !NodeHasChain(Pattern, ISE) && (II.hasCtrlDep || NumCopies > 0); - if (IsCopyFromReg || II.hasCtrlDep) { + if (NodeHasChain(Pattern, ISE)) + OS << " CodeGenMap[N.getValue(" << ValNo++ << ")] = Chain;\n"; + + if (FoldedChains.size() > 0) { OS << " "; - if (IsCopyFromReg || NodeHasChain(Pattern, ISE)) - OS << "CodeGenMap[N.getValue(" << ValNo << ")] = "; for (unsigned j = 0, e = FoldedChains.size(); j < e; j++) OS << "CodeGenMap[" << FoldedChains[j].first << ".getValue(" << FoldedChains[j].second << ")] = "; OS << "Chain;\n"; } - // FIXME: this only works because (for now) an instruction can either - // produce a single result or a single flag. - if (II.hasCtrlDep && OutFlag) { - if (IsCopyFromReg) - OS << " return (N.ResNo == 0) ? Result : " - << "((N.ResNo == 2) ? Chain : InFlag);" - << " // Chain comes before flag.\n"; - else - OS << " return (N.ResNo) ? Chain : InFlag;" - << " // Chain comes before flag.\n"; + if (OutFlag) + OS << " CodeGenMap[N.getValue(" << ValNo << ")] = InFlag;\n"; + + if (AddedChain && OutFlag) { + if (NumResults == 0) { + OS << " return Result.getValue(N.ResNo+1);\n"; + } else { + OS << " if (N.ResNo < " << NumResults << ")\n"; + OS << " return Result.getValue(N.ResNo);\n"; + OS << " else\n"; + OS << " return Result.getValue(N.ResNo+1);\n"; + } } else { OS << " return Result.getValue(N.ResNo);\n"; } @@ -2295,6 +2304,8 @@ << ", Select(" << RootName << OpNo << "), InFlag).getValue(1);\n"; } + } else if (RR->getName() == "FLAG") { + OS << " InFlag = Select(" << RootName << OpNo << ");\n"; } } } @@ -2302,9 +2313,10 @@ } /// EmitCopyFromRegs - Emit code to copy result to physical registers - /// as specified by the instruction. - bool EmitCopyFromRegs(TreePatternNode *N, bool HasCtrlDep) { - bool RetVal = false; + /// as specified by the instruction. It returns the number of + /// CopyFromRegs emitted. + unsigned EmitCopyFromRegs(TreePatternNode *N, bool HasCtrlDep) { + unsigned NumCopies = 0; Record *Op = N->getOperator(); if (Op->isSubClassOf("Instruction")) { const DAGInstruction &Inst = ISE.getInstruction(Op); @@ -2330,12 +2342,12 @@ OS << " Chain = Result.getValue(1);\n"; OS << " InFlag = Result.getValue(2);\n"; } - RetVal = true; + NumCopies++; } } } } - return RetVal; + return NumCopies; } }; @@ -2555,7 +2567,7 @@ OS << " } // end of big switch.\n\n" << " std::cerr << \"Cannot yet select: \";\n" - << " N.Val->dump();\n" + << " N.Val->dump(CurDAG);\n" << " std::cerr << '\\n';\n" << " abort();\n" << "}\n"; Index: llvm/utils/TableGen/DAGISelEmitter.h diff -u llvm/utils/TableGen/DAGISelEmitter.h:1.46 llvm/utils/TableGen/DAGISelEmitter.h:1.47 --- llvm/utils/TableGen/DAGISelEmitter.h:1.46 Fri Dec 16 19:19:28 2005 +++ llvm/utils/TableGen/DAGISelEmitter.h Wed Dec 21 20:24:50 2005 @@ -328,23 +328,19 @@ std::vector Results; std::vector Operands; std::vector ImpResults; - std::vector ImpOperands; TreePatternNode *ResultPattern; public: DAGInstruction(TreePattern *TP, const std::vector &results, const std::vector &operands, - const std::vector &impresults, - const std::vector &impoperands) + const std::vector &impresults) : Pattern(TP), Results(results), Operands(operands), - ImpResults(impresults), ImpOperands(impoperands), - ResultPattern(0) {} + ImpResults(impresults), ResultPattern(0) {} TreePattern *getPattern() const { return Pattern; } unsigned getNumResults() const { return Results.size(); } unsigned getNumOperands() const { return Operands.size(); } unsigned getNumImpResults() const { return ImpResults.size(); } - unsigned getNumImpOperands() const { return ImpOperands.size(); } void setResultPattern(TreePatternNode *R) { ResultPattern = R; } @@ -363,10 +359,6 @@ return ImpResults[RN]; } - Record *getImpOperand(unsigned ON) const { - assert(ON < ImpOperands.size()); - return ImpOperands[ON]; - } TreePatternNode *getResultPattern() const { return ResultPattern; } }; @@ -452,7 +444,6 @@ std::map &InstInputs, std::map &InstResults, - std::vector &InstImpInputs, std::vector &InstImpResults); void EmitCodeForPattern(PatternToMatch &Pattern, std::ostream &OS); void EmitInstructionSelector(std::ostream &OS); From evan.cheng at apple.com Wed Dec 21 20:25:26 2005 From: evan.cheng at apple.com (Evan Cheng) Date: Wed, 21 Dec 2005 20:25:26 -0600 Subject: [llvm-commits] CVS: llvm/lib/Target/TargetSelectionDAG.td Message-ID: <200512220225.UAA30050@zion.cs.uiuc.edu> Changes in directory llvm/lib/Target: TargetSelectionDAG.td updated: 1.33 -> 1.34 --- Log message: Added special flag node FLAG. --- Diffs of the changes: (+1 -0) TargetSelectionDAG.td | 1 + 1 files changed, 1 insertion(+) Index: llvm/lib/Target/TargetSelectionDAG.td diff -u llvm/lib/Target/TargetSelectionDAG.td:1.33 llvm/lib/Target/TargetSelectionDAG.td:1.34 --- llvm/lib/Target/TargetSelectionDAG.td:1.33 Wed Dec 21 10:22:46 2005 +++ llvm/lib/Target/TargetSelectionDAG.td Wed Dec 21 20:25:14 2005 @@ -184,6 +184,7 @@ def set; def node; def srcvalue; +def FLAG; def imm : SDNode<"ISD::Constant" , SDTIntLeaf , [], "ConstantSDNode">; def vt : SDNode<"ISD::VALUETYPE" , SDTOther , [], "VTSDNode">; From evan.cheng at apple.com Wed Dec 21 20:25:53 2005 From: evan.cheng at apple.com (Evan Cheng) Date: Wed, 21 Dec 2005 20:25:53 -0600 Subject: [llvm-commits] CVS: llvm/lib/Target/X86/X86InstrInfo.td X86RegisterInfo.td Message-ID: <200512220225.UAA30070@zion.cs.uiuc.edu> Changes in directory llvm/lib/Target/X86: X86InstrInfo.td updated: 1.182 -> 1.183 X86RegisterInfo.td updated: 1.26 -> 1.27 --- Log message: Bye bye HACKTROCITY. --- Diffs of the changes: (+4 -8) X86InstrInfo.td | 5 +++-- X86RegisterInfo.td | 7 +------ 2 files changed, 4 insertions(+), 8 deletions(-) Index: llvm/lib/Target/X86/X86InstrInfo.td diff -u llvm/lib/Target/X86/X86InstrInfo.td:1.182 llvm/lib/Target/X86/X86InstrInfo.td:1.183 --- llvm/lib/Target/X86/X86InstrInfo.td:1.182 Wed Dec 21 17:05:39 2005 +++ llvm/lib/Target/X86/X86InstrInfo.td Wed Dec 21 20:25:42 2005 @@ -38,7 +38,7 @@ def SDTX86Fld : SDTypeProfile<1, 2, [SDTCisFP<0>, SDTCisPtrTy<1>, SDTCisVT<2, OtherVT>]>; -def SDTX86FpSet : SDTypeProfile<0, 1, [SDTCisFP<0>]>; +def SDTX86FpSet : SDTypeProfile<1, 1, [SDTCisVT<0, FlagVT>, SDTCisFP<1>]>; def X86cmp : SDNode<"X86ISD::CMP" , SDTX86CmpTest, []>; def X86test : SDNode<"X86ISD::TEST", SDTX86CmpTest, []>; @@ -2257,7 +2257,8 @@ def FpGETRESULT : FpI<(ops RFP:$dst), SpecialFP, // FPR = ST(0) []>; def FpSETRESULT : FpI<(ops RFP:$src), SpecialFP, - [(X86fpset RFP:$src)]>, Imp<[], [ST0]>; // ST(0) = FPR + [(set FLAG, (X86fpset RFP:$src))]>, + Imp<[], [ST0]>; // ST(0) = FPR def FpMOV : FpI<(ops RFP:$dst, RFP:$src), SpecialFP, []>; // f1 = fmov f2 Index: llvm/lib/Target/X86/X86RegisterInfo.td diff -u llvm/lib/Target/X86/X86RegisterInfo.td:1.26 llvm/lib/Target/X86/X86RegisterInfo.td:1.27 --- llvm/lib/Target/X86/X86RegisterInfo.td:1.26 Tue Dec 20 20:39:21 2005 +++ llvm/lib/Target/X86/X86RegisterInfo.td Wed Dec 21 20:25:42 2005 @@ -142,11 +142,6 @@ }]; } -// FIXME: -// HACKTROCITY: define a flags reg class for things that need to take a flag. -// this should really be handled by tablgen. -let Namespace = "X86" in - def FLAG : Register<"FLAG">; -def FLAGS_REGS : RegisterClass<"X86", [FlagVT], 32, [STATUS, FLAG]> { +def FLAGS_REGS : RegisterClass<"X86", [FlagVT], 32, [STATUS]> { let Size = 32; } From evan.cheng at apple.com Wed Dec 21 20:26:32 2005 From: evan.cheng at apple.com (Evan Cheng) Date: Wed, 21 Dec 2005 20:26:32 -0600 Subject: [llvm-commits] CVS: llvm/lib/Target/PowerPC/PPCRegisterInfo.td Message-ID: <200512220226.UAA30088@zion.cs.uiuc.edu> Changes in directory llvm/lib/Target/PowerPC: PPCRegisterInfo.td updated: 1.28 -> 1.29 --- Log message: Bye bye HACKTROCITY. --- Diffs of the changes: (+0 -8) PPCRegisterInfo.td | 8 -------- 1 files changed, 8 deletions(-) Index: llvm/lib/Target/PowerPC/PPCRegisterInfo.td diff -u llvm/lib/Target/PowerPC/PPCRegisterInfo.td:1.28 llvm/lib/Target/PowerPC/PPCRegisterInfo.td:1.29 --- llvm/lib/Target/PowerPC/PPCRegisterInfo.td:1.28 Mon Dec 19 18:26:01 2005 +++ llvm/lib/Target/PowerPC/PPCRegisterInfo.td Wed Dec 21 20:26:21 2005 @@ -132,14 +132,6 @@ // VRsave register def VRSAVE: SPR<256, "VRsave">; -// FIXME: -// HACKTROCITY: define a flags reg class for things that need to take a flag. -// this should really be handled by tablgen. -def FLAG: SPR<1023, "Flag">; -def FLAGRC : RegisterClass<"PPC", [FlagVT], 32, [FLAG]> { - let Size = 32; -} - /// Register classes // Allocate volatiles first // then nonvolatiles in reverse order since stmw/lmw save from rN to r31 From evan.cheng at apple.com Wed Dec 21 20:35:33 2005 From: evan.cheng at apple.com (Evan Cheng) Date: Wed, 21 Dec 2005 20:35:33 -0600 Subject: [llvm-commits] CVS: llvm/utils/TableGen/DAGISelEmitter.cpp Message-ID: <200512220235.UAA30183@zion.cs.uiuc.edu> Changes in directory llvm/utils/TableGen: DAGISelEmitter.cpp updated: 1.112 -> 1.113 --- Log message: Attempt to fix a crash on WIN32. --- Diffs of the changes: (+16 -15) DAGISelEmitter.cpp | 31 ++++++++++++++++--------------- 1 files changed, 16 insertions(+), 15 deletions(-) Index: llvm/utils/TableGen/DAGISelEmitter.cpp diff -u llvm/utils/TableGen/DAGISelEmitter.cpp:1.112 llvm/utils/TableGen/DAGISelEmitter.cpp:1.113 --- llvm/utils/TableGen/DAGISelEmitter.cpp:1.112 Wed Dec 21 20:24:50 2005 +++ llvm/utils/TableGen/DAGISelEmitter.cpp Wed Dec 21 20:35:21 2005 @@ -1124,22 +1124,23 @@ CodeGenInstruction &InstInfo =Target.getInstruction(Instrs[i]->getName()); - // Note: Removed if (InstInfo.OperandList.size() == 0) continue; - // It's possible for some instruction, e.g. RET for X86 that only has an - // implicit flag operand. - // FIXME: temporary hack... - if (InstInfo.isReturn || InstInfo.isBranch || InstInfo.isCall || - InstInfo.isStore) { - // These produce no results - for (unsigned j = 0, e = InstInfo.OperandList.size(); j < e; ++j) - Operands.push_back(InstInfo.OperandList[j].Rec); - } else { - // Assume the first operand is the result. - Results.push_back(InstInfo.OperandList[0].Rec); + if (InstInfo.OperandList.size() != 0) { + // It's possible for some instruction, e.g. RET for X86 that only has an + // implicit flag operand. + // FIXME: temporary hack... + if (InstInfo.isReturn || InstInfo.isBranch || InstInfo.isCall || + InstInfo.isStore) { + // These produce no results + for (unsigned j = 0, e = InstInfo.OperandList.size(); j < e; ++j) + Operands.push_back(InstInfo.OperandList[j].Rec); + } else { + // Assume the first operand is the result. + Results.push_back(InstInfo.OperandList[0].Rec); - // The rest are inputs. - for (unsigned j = 1, e = InstInfo.OperandList.size(); j < e; ++j) - Operands.push_back(InstInfo.OperandList[j].Rec); + // The rest are inputs. + for (unsigned j = 1, e = InstInfo.OperandList.size(); j < e; ++j) + Operands.push_back(InstInfo.OperandList[j].Rec); + } } // Create and insert the instruction. From reid at x10sys.com Wed Dec 21 21:23:59 2005 From: reid at x10sys.com (Reid Spencer) Date: Wed, 21 Dec 2005 21:23:59 -0600 Subject: [llvm-commits] CVS: llvm/lib/System/Alarm.cpp Message-ID: <200512220323.VAA30434@zion.cs.uiuc.edu> Changes in directory llvm/lib/System: Alarm.cpp added (r1.1) --- Log message: Implement a generic polled Alarm function. This merely removes the system dependent portion of the lib/Support/SlowOperationTimer code into the lib/System implementation where it can be ported to different platforms. --- Diffs of the changes: (+34 -0) Alarm.cpp | 34 ++++++++++++++++++++++++++++++++++ 1 files changed, 34 insertions(+) Index: llvm/lib/System/Alarm.cpp diff -c /dev/null llvm/lib/System/Alarm.cpp:1.1 *** /dev/null Wed Dec 21 21:23:56 2005 --- llvm/lib/System/Alarm.cpp Wed Dec 21 21:23:46 2005 *************** *** 0 **** --- 1,34 ---- + //===- Alarm.cpp - Alarm Generation Support ---------------------*- C++ -*-===// + // + // The LLVM Compiler Infrastructure + // + // This file was developed by the Reid Spencer and is distributed under the + // University of Illinois Open Source License. See LICENSE.TXT for details. + // + //===----------------------------------------------------------------------===// + // + // This file implements the Alarm functionality + // + //===----------------------------------------------------------------------===// + + #include "llvm/System/Alarm.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/Alarm.inc" + #endif + #ifdef LLVM_ON_WIN32 + #include "Win32/Alarm.inc" + #endif + From reid at x10sys.com Wed Dec 21 21:24:00 2005 From: reid at x10sys.com (Reid Spencer) Date: Wed, 21 Dec 2005 21:24:00 -0600 Subject: [llvm-commits] CVS: llvm/include/llvm/System/Alarm.h Message-ID: <200512220324.VAA30446@zion.cs.uiuc.edu> Changes in directory llvm/include/llvm/System: Alarm.h added (r1.1) --- Log message: Implement a generic polled Alarm function. This merely removes the system dependent portion of the lib/Support/SlowOperationTimer code into the lib/System implementation where it can be ported to different platforms. --- Diffs of the changes: (+42 -0) Alarm.h | 42 ++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 42 insertions(+) Index: llvm/include/llvm/System/Alarm.h diff -c /dev/null llvm/include/llvm/System/Alarm.h:1.1 *** /dev/null Wed Dec 21 21:23:56 2005 --- llvm/include/llvm/System/Alarm.h Wed Dec 21 21:23:46 2005 *************** *** 0 **** --- 1,42 ---- + //===- llvm/System/Alarm.h - Alarm Generation support ----------*- C++ -*-===// + // + // The LLVM Compiler Infrastructure + // + // This file was developed by Reid Spencer and is distributed under the + // University of Illinois Open Source License. See LICENSE.TXT for details. + // + //===----------------------------------------------------------------------===// + // + // This file provides an operating system independent interface to alarm(2) + // type functionality. The Alarm class allows a one-shot alarm to be set up + // at some number of seconds in the future. When the alarm triggers, a method + // is called to process the event + // + //===----------------------------------------------------------------------===// + + #ifndef LLVM_SYSTEM_ALARM_H + #define LLVM_SYSTEM_ALARM_H + + namespace llvm { + namespace sys { + + /// This function registers an alarm to trigger some number of \p seconds in + /// the future. When that time arrives, the \p callback is called. You can + /// only call this once. Each time + /// @returns nothing + void SetupAlarm( + unsigned seconds ///< Number of seconds in future when alarm arrives + ); + + /// This function terminates the alarm previously set up + /// @returns nothing + void TerminateAlarm(); + + /// This function acquires the status of the alarm. + /// @returns -1=cancelled, 0=untriggered, 1=triggered + int AlarmStatus(); + + } // End sys namespace + } // End llvm namespace + + #endif From reid at x10sys.com Wed Dec 21 21:24:00 2005 From: reid at x10sys.com (Reid Spencer) Date: Wed, 21 Dec 2005 21:24:00 -0600 Subject: [llvm-commits] CVS: llvm/lib/System/Unix/Alarm.inc Message-ID: <200512220324.VAA30442@zion.cs.uiuc.edu> Changes in directory llvm/lib/System/Unix: Alarm.inc added (r1.1) --- Log message: Implement a generic polled Alarm function. This merely removes the system dependent portion of the lib/Support/SlowOperationTimer code into the lib/System implementation where it can be ported to different platforms. --- Diffs of the changes: (+68 -0) Alarm.inc | 68 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 68 insertions(+) Index: llvm/lib/System/Unix/Alarm.inc diff -c /dev/null llvm/lib/System/Unix/Alarm.inc:1.1 *** /dev/null Wed Dec 21 21:23:56 2005 --- llvm/lib/System/Unix/Alarm.inc Wed Dec 21 21:23:46 2005 *************** *** 0 **** --- 1,68 ---- + //===-- Alarm.inc - Implement Unix Alarm Support --------------------------===// + // + // The LLVM Compiler Infrastructure + // + // This file was developed by the Reid Spencer and is distributed under the + // University of Illinois Open Source License. See LICENSE.TXT for details. + // + //===----------------------------------------------------------------------===// + // + // This file implements the UNIX Alarm support. + // + //===----------------------------------------------------------------------===// + + #include + #include + #include + using namespace llvm; + + /// AlarmCancelled - This flag is set by the SIGINT signal handler if the + /// user presses CTRL-C. + static volatile bool AlarmCancelled = false; + + /// AlarmTriggered - This flag is set by the SIGALRM signal handler if the + /// alarm was triggered. + static volatile bool AlarmTriggered = false; + + /// NestedSOI - Sanity check. Alarms cannot be nested or run in parallel. + /// This ensures that they never do. + static bool NestedSOI = false; + + static RETSIGTYPE SigIntHandler(int Sig) { + AlarmCancelled = true; + signal(SIGINT, SigIntHandler); + } + + static RETSIGTYPE SigAlarmHandler(int Sig) { + AlarmTriggered = true; + } + + static void (*OldSigIntHandler) (int); + + void sys::SetupAlarm(unsigned seconds) { + assert(!NestedSOI && "sys::SetupAlarm calls cannot be nested!"); + NestedSOI = true; + AlarmCancelled = false; + AlarmTriggered = false; + ::signal(SIGALRM, SigAlarmHandler); + OldSigIntHandler = ::signal(SIGINT, SigIntHandler); + ::alarm(seconds); + } + + void sys::TerminateAlarm() { + assert(NestedSOI && "sys::TerminateAlarm called without sys::SetupAlarm!"); + ::alarm(0); + ::signal(SIGALRM, SIG_DFL); + ::signal(SIGINT, OldSigIntHandler); + AlarmCancelled = false; + AlarmTriggered = false; + NestedSOI = false; + } + + int sys::AlarmStatus() { + if (AlarmCancelled) + return -1; + if (AlarmTriggered) + return 1; + return 0; + } From reid at x10sys.com Wed Dec 21 21:24:00 2005 From: reid at x10sys.com (Reid Spencer) Date: Wed, 21 Dec 2005 21:24:00 -0600 Subject: [llvm-commits] CVS: llvm/lib/System/Win32/Alarm.inc Message-ID: <200512220324.VAA30438@zion.cs.uiuc.edu> Changes in directory llvm/lib/System/Win32: Alarm.inc added (r1.1) --- Log message: Implement a generic polled Alarm function. This merely removes the system dependent portion of the lib/Support/SlowOperationTimer code into the lib/System implementation where it can be ported to different platforms. --- Diffs of the changes: (+36 -0) Alarm.inc | 36 ++++++++++++++++++++++++++++++++++++ 1 files changed, 36 insertions(+) Index: llvm/lib/System/Win32/Alarm.inc diff -c /dev/null llvm/lib/System/Win32/Alarm.inc:1.1 *** /dev/null Wed Dec 21 21:23:56 2005 --- llvm/lib/System/Win32/Alarm.inc Wed Dec 21 21:23:46 2005 *************** *** 0 **** --- 1,36 ---- + //===-- Alarm.inc - Implement Win32 Alarm Support -------------------------===// + // + // The LLVM Compiler Infrastructure + // + // This file was developed by the Reid Spencer and is distributed under the + // University of Illinois Open Source License. See LICENSE.TXT for details. + // + //===----------------------------------------------------------------------===// + // + // This file implements the Win32 Alarm support. + // + //===----------------------------------------------------------------------===// + + #include + using namespace llvm; + + /// NestedSOI - Sanity check. Alarms cannot be nested or run in parallel. + /// This ensures that they never do. + static bool NestedSOI = false; + + void sys::SetupAlarm(unsigned seconds) { + assert(!NestedSOI && "sys::SetupAlarm calls cannot be nested!"); + NestedSOI = true; + // FIXME: Implement for Win32 + } + + void sys::TerminateAlarm() { + assert(NestedSOI && "sys::TerminateAlarm called without sys::SetupAlarm!"); + // FIXME: Implement for Win32 + NestedSOI = false; + } + + int sys::AlarmStatus() { + // FIXME: Implement for Win32 + return 0; + } From reid at x10sys.com Wed Dec 21 21:31:37 2005 From: reid at x10sys.com (Reid Spencer) Date: Wed, 21 Dec 2005 21:31:37 -0600 Subject: [llvm-commits] CVS: llvm/lib/Support/SlowOperationInformer.cpp Message-ID: <200512220331.VAA30482@zion.cs.uiuc.edu> Changes in directory llvm/lib/Support: SlowOperationInformer.cpp updated: 1.6 -> 1.7 --- Log message: For PR351: http://llvm.cs.uiuc.edu/PR351 : Move the system dependent portion to lib/System/*/Alarm.inc. This makes the SlowOperationInformer platform independent. --- Diffs of the changes: (+6 -43) SlowOperationInformer.cpp | 49 +++++----------------------------------------- 1 files changed, 6 insertions(+), 43 deletions(-) Index: llvm/lib/Support/SlowOperationInformer.cpp diff -u llvm/lib/Support/SlowOperationInformer.cpp:1.6 llvm/lib/Support/SlowOperationInformer.cpp:1.7 --- llvm/lib/Support/SlowOperationInformer.cpp:1.6 Thu Apr 21 17:52:05 2005 +++ llvm/lib/Support/SlowOperationInformer.cpp Wed Dec 21 21:31:26 2005 @@ -12,63 +12,25 @@ //===----------------------------------------------------------------------===// #include "llvm/Support/SlowOperationInformer.h" -#include "llvm/Config/config.h" // Get the signal handler return type +#include "llvm/System/Alarm.h" #include #include -#include -#include #include using namespace llvm; -/// OperationCancelled - This flag is set by the SIGINT signal handler if the -/// user presses CTRL-C. -static volatile bool OperationCancelled; - -/// ShouldShowStatus - This flag gets set if the operation takes a long time. -/// -static volatile bool ShouldShowStatus; - -/// NestedSOI - Sanity check. SlowOperationInformers cannot be nested or run in -/// parallel. This ensures that they never do. -static bool NestedSOI = false; - -static RETSIGTYPE SigIntHandler(int Sig) { - OperationCancelled = true; - signal(SIGINT, SigIntHandler); -} - -static RETSIGTYPE SigAlarmHandler(int Sig) { - ShouldShowStatus = true; -} - -static void (*OldSigIntHandler) (int); - - SlowOperationInformer::SlowOperationInformer(const std::string &Name) : OperationName(Name), LastPrintAmount(0) { - assert(!NestedSOI && "SlowerOperationInformer objects cannot be nested!"); - NestedSOI = true; - - OperationCancelled = 0; - ShouldShowStatus = 0; - - signal(SIGALRM, SigAlarmHandler); - OldSigIntHandler = signal(SIGINT, SigIntHandler); - alarm(1); + sys::SetupAlarm(1); } SlowOperationInformer::~SlowOperationInformer() { - NestedSOI = false; + sys::TerminateAlarm(); if (LastPrintAmount) { // If we have printed something, make _sure_ we print the 100% amount, and // also print a newline. std::cout << std::string(LastPrintAmount, '\b') << "Progress " << OperationName << ": 100% \n"; } - - alarm(0); - signal(SIGALRM, SIG_DFL); - signal(SIGINT, OldSigIntHandler); } /// progress - Clients should periodically call this method when they are in @@ -76,7 +38,8 @@ /// along the operation is, given in 1/10ths of a percent (in other words, /// Amount should range from 0 to 1000). void SlowOperationInformer::progress(unsigned Amount) { - if (OperationCancelled) { + int status = sys::AlarmStatus(); + if (status == -1) { std::cout << "\n"; LastPrintAmount = 0; throw "While " + OperationName + ", operation cancelled."; @@ -84,7 +47,7 @@ // If we haven't spent enough time in this operation to warrant displaying the // progress bar, don't do so yet. - if (!ShouldShowStatus) + if (status == 0) return; // Delete whatever we printed last time. From duraid at octopus.com.au Wed Dec 21 21:56:15 2005 From: duraid at octopus.com.au (Duraid Madina) Date: Wed, 21 Dec 2005 21:56:15 -0600 Subject: [llvm-commits] CVS: llvm/lib/Target/IA64/IA64.td IA64InstrInfo.td IA64RegisterInfo.td Message-ID: <200512220356.VAA30554@zion.cs.uiuc.edu> Changes in directory llvm/lib/Target/IA64: IA64.td updated: 1.3 -> 1.4 IA64InstrInfo.td updated: 1.30 -> 1.31 IA64RegisterInfo.td updated: 1.11 -> 1.12 --- Log message: update tablegen files - nothing to see here --- Diffs of the changes: (+18 -6) IA64.td | 1 + IA64InstrInfo.td | 19 +++++++++++++++---- IA64RegisterInfo.td | 4 ++-- 3 files changed, 18 insertions(+), 6 deletions(-) Index: llvm/lib/Target/IA64/IA64.td diff -u llvm/lib/Target/IA64/IA64.td:1.3 llvm/lib/Target/IA64/IA64.td:1.4 --- llvm/lib/Target/IA64/IA64.td:1.3 Fri Sep 30 01:42:24 2005 +++ llvm/lib/Target/IA64/IA64.td Wed Dec 21 21:56:03 2005 @@ -47,6 +47,7 @@ // r1, // global data pointer (GP) - XXX NOT callee saved, we do it ourselves // r12, // memory stack pointer (SP)- XXX NOT callee saved, we do it ourselves +// rp, // return branch register (rp/b0) - we do this ourselves // **** r13 (thread pointer) we do not touch, ever. it's not here. ****// //r15, // our frame pointer (FP) Index: llvm/lib/Target/IA64/IA64InstrInfo.td diff -u llvm/lib/Target/IA64/IA64InstrInfo.td:1.30 llvm/lib/Target/IA64/IA64InstrInfo.td:1.31 --- llvm/lib/Target/IA64/IA64InstrInfo.td:1.30 Sun Dec 4 20:34:29 2005 +++ llvm/lib/Target/IA64/IA64InstrInfo.td Wed Dec 21 21:56:03 2005 @@ -23,7 +23,7 @@ def s14imm : Operand { let PrintMethod = "printS14ImmOperand"; } -def s22imm : Operand { +def s22imm : Operand { let PrintMethod = "printS22ImmOperand"; } def u64imm : Operand { @@ -116,7 +116,12 @@ def ADDL_GA : AForm_DAG<0x03, 0x0b, (ops GR:$dst, GR:$src1, globaladdress:$imm), "addl $dst = $imm, $src1;;", []>; - + +// hmm +def ADDL_EA : AForm_DAG<0x03, 0x0b, (ops GR:$dst, GR:$src1, calltarget:$imm), + "addl $dst = $imm, $src1;;", + []>; + def SUB : AForm_DAG<0x03, 0x0b, (ops GR:$dst, GR:$src1, GR:$src2), "sub $dst = $src1, $src2;;", [(set GR:$dst, (sub GR:$src1, GR:$src2))]>; @@ -639,7 +644,7 @@ "($qp) br.cond.sptk $dst;;">; } -let isCall = 1, isTerminator = 1, isBranch = 1, +let isCall = 1, /* isTerminator = 1, isBranch = 1, */ Uses = [out0,out1,out2,out3,out4,out5,out6,out7], // all calls clobber non-callee-saved registers, and for now, they are these: Defs = [r2,r3,r8,r9,r10,r11,r14,r15,r16,r17,r18,r19,r20,r21,r22,r23,r24, @@ -659,8 +664,14 @@ def BRCALL: RawForm<0x03, 0xb0, (ops calltarget:$dst), "br.call.sptk rp = $dst;;">; // FIXME: teach llvm about branch regs? // new daggy stuff! - def BRCALL_IPREL : RawForm<0x03, 0xb0, (ops calltarget:$dst, variable_ops), + +// calls a globaladdress + def BRCALL_IPREL_GA : RawForm<0x03, 0xb0, (ops calltarget:$dst, variable_ops), + "br.call.sptk rp = $dst;;">; // FIXME: teach llvm about branch regs? +// calls an externalsymbol + def BRCALL_IPREL_ES : RawForm<0x03, 0xb0, (ops calltarget:$dst, variable_ops), "br.call.sptk rp = $dst;;">; // FIXME: teach llvm about branch regs? +// calls through a function descriptor def BRCALL_INDIRECT : RawForm<0x03, 0xb0, (ops GR:$branchreg, variable_ops), "br.call.sptk rp = $branchreg;;">; // FIXME: teach llvm about branch regs? def BRLCOND_CALL : RawForm<0x03, 0xb0, (ops PR:$qp, i64imm:$dst), Index: llvm/lib/Target/IA64/IA64RegisterInfo.td diff -u llvm/lib/Target/IA64/IA64RegisterInfo.td:1.11 llvm/lib/Target/IA64/IA64RegisterInfo.td:1.12 --- llvm/lib/Target/IA64/IA64RegisterInfo.td:1.11 Wed Nov 30 22:51:06 2005 +++ llvm/lib/Target/IA64/IA64RegisterInfo.td Wed Dec 21 21:56:03 2005 @@ -235,8 +235,8 @@ def GR : RegisterClass<"IA64", [i64], 64, [ -//FIXME!: for readability, we don't want the out registers to be the first -// ones allocated +//FIXME!: for both readability and performance, we don't want the out +// registers to be the first ones allocated out7, out6, out5, out4, out3, out2, out1, out0, r3, r8, r9, r10, r11, r14, From reid at x10sys.com Wed Dec 21 21:57:27 2005 From: reid at x10sys.com (Reid Spencer) Date: Wed, 21 Dec 2005 21:57:27 -0600 Subject: [llvm-commits] CVS: llvm/include/llvm/System/Alarm.h Message-ID: <200512220357.VAA30568@zion.cs.uiuc.edu> Changes in directory llvm/include/llvm/System: Alarm.h updated: 1.1 -> 1.2 --- Log message: Fix documentation for the AlarmSetup function. --- Diffs of the changes: (+5 -2) Alarm.h | 7 +++++-- 1 files changed, 5 insertions(+), 2 deletions(-) Index: llvm/include/llvm/System/Alarm.h diff -u llvm/include/llvm/System/Alarm.h:1.1 llvm/include/llvm/System/Alarm.h:1.2 --- llvm/include/llvm/System/Alarm.h:1.1 Wed Dec 21 21:23:46 2005 +++ llvm/include/llvm/System/Alarm.h Wed Dec 21 21:57:15 2005 @@ -21,8 +21,11 @@ namespace sys { /// This function registers an alarm to trigger some number of \p seconds in - /// the future. When that time arrives, the \p callback is called. You can - /// only call this once. Each time + /// the future. When that time arrives, the AlarmStatus function will begin + /// to return 1 instead of 0. The user must poll the status of the alarm by + /// making occasional calls to AlarmStatus. If the user sends an interrupt + /// signal, AlarmStatus will begin returning -1, even if the alarm event + /// occurred. /// @returns nothing void SetupAlarm( unsigned seconds ///< Number of seconds in future when alarm arrives From duraid at octopus.com.au Wed Dec 21 21:58:29 2005 From: duraid at octopus.com.au (Duraid Madina) Date: Wed, 21 Dec 2005 21:58:29 -0600 Subject: [llvm-commits] CVS: llvm/lib/Target/IA64/IA64ISelDAGToDAG.cpp Message-ID: <200512220358.VAA30580@zion.cs.uiuc.edu> Changes in directory llvm/lib/Target/IA64: IA64ISelDAGToDAG.cpp updated: 1.13 -> 1.14 --- Log message: kill SelectCALL() in the DAG isel, we handle this in lowering now, like SPARCv8. (we copy sparcv8's workaround for tablegen not being nice about ISD::CALL/TAILCALL) --- Diffs of the changes: (+47 -189) IA64ISelDAGToDAG.cpp | 236 ++++++++++----------------------------------------- 1 files changed, 47 insertions(+), 189 deletions(-) Index: llvm/lib/Target/IA64/IA64ISelDAGToDAG.cpp diff -u llvm/lib/Target/IA64/IA64ISelDAGToDAG.cpp:1.13 llvm/lib/Target/IA64/IA64ISelDAGToDAG.cpp:1.14 --- llvm/lib/Target/IA64/IA64ISelDAGToDAG.cpp:1.13 Wed Nov 30 17:02:08 2005 +++ llvm/lib/Target/IA64/IA64ISelDAGToDAG.cpp Wed Dec 21 21:58:17 2005 @@ -94,7 +94,6 @@ private: SDOperand SelectDIV(SDOperand Op); - SDOperand SelectCALL(SDOperand Op); }; } @@ -327,191 +326,6 @@ return Result; } - -SDOperand IA64DAGToDAGISel::SelectCALL(SDOperand Op) { - SDNode *N = Op.Val; - SDOperand Chain = Select(N->getOperand(0)); - - unsigned CallOpcode; - std::vector CallOperands; - - // save the current GP, SP and RP : FIXME: do we need to do all 3 always? - SDOperand GPBeforeCall = CurDAG->getCopyFromReg(Chain, IA64::r1, MVT::i64); - Chain = GPBeforeCall.getValue(1); - SDOperand SPBeforeCall = CurDAG->getCopyFromReg(Chain, IA64::r12, MVT::i64); - Chain = SPBeforeCall.getValue(1); - SDOperand RPBeforeCall = CurDAG->getCopyFromReg(Chain, IA64::rp, MVT::i64); - Chain = RPBeforeCall.getValue(1); - - // if we can call directly, do so - if (GlobalAddressSDNode *GASD = - dyn_cast(N->getOperand(1))) { - CallOpcode = IA64::BRCALL_IPREL; - CallOperands.push_back(CurDAG->getTargetGlobalAddress(GASD->getGlobal(), - MVT::i64)); - } else if (ExternalSymbolSDNode *ESSDN = // FIXME: we currently NEED this - // case for correctness, to avoid - // "non-pic code with imm reloc.n - // against dynamic symbol" errors - dyn_cast(N->getOperand(1))) { - CallOpcode = IA64::BRCALL_IPREL; - CallOperands.push_back(N->getOperand(1)); - } else { - // otherwise we need to load the function descriptor, - // load the branch target (function)'s entry point and GP, - // branch (call) then restore the GP - - SDOperand FnDescriptor = Select(N->getOperand(1)); - - // load the branch target's entry point [mem] and - // GP value [mem+8] - SDOperand targetEntryPoint=CurDAG->getTargetNode(IA64::LD8, MVT::i64, - FnDescriptor); - Chain = targetEntryPoint.getValue(1); - SDOperand targetGPAddr=CurDAG->getTargetNode(IA64::ADDS, MVT::i64, - FnDescriptor, CurDAG->getConstant(8, MVT::i64)); - Chain = targetGPAddr.getValue(1); - SDOperand targetGP=CurDAG->getTargetNode(IA64::LD8, MVT::i64, - targetGPAddr); - Chain = targetGP.getValue(1); - -/* FIXME? (methcall still fails) - SDOperand targetEntryPoint=CurDAG->getLoad(MVT::i64, Chain, FnDescriptor, - CurDAG->getSrcValue(0)); - SDOperand targetGPAddr=CurDAG->getNode(ISD::ADD, MVT::i64, FnDescriptor, - CurDAG->getConstant(8, MVT::i64)); - SDOperand targetGP=CurDAG->getLoad(MVT::i64, Chain, targetGPAddr, - CurDAG->getSrcValue(0)); - */ - - /* this is just the long way of writing the two lines below? - // Copy the callee GP into r1 - SDOperand r1 = CurDAG->getRegister(IA64::r1, MVT::i64); - Chain = CurDAG->getNode(ISD::CopyToReg, MVT::i64, Chain, r1, - targetGP); - - - // Copy the callee address into the b6 branch register - SDOperand B6 = CurDAG->getRegister(IA64::B6, MVT::i64); - Chain = CurDAG->getNode(ISD::CopyToReg, MVT::i64, Chain, B6, - targetEntryPoint); - */ - - Chain = CurDAG->getCopyToReg(Chain, IA64::r1, targetGP); - Chain = CurDAG->getCopyToReg(Chain, IA64::B6, targetEntryPoint); - - CallOperands.push_back(CurDAG->getRegister(IA64::B6, MVT::i64)); - CallOpcode = IA64::BRCALL_INDIRECT; - } - - // see section 8.5.8 of "Itanium Software Conventions and - // Runtime Architecture Guide to see some examples of what's going - // on here. (in short: int args get mapped 1:1 'slot-wise' to out0->out7, - // while FP args get mapped to F8->F15 as needed) - - // TODO: support in-memory arguments - - unsigned used_FPArgs=0; // how many FP args have been used so far? - - unsigned intArgs[] = {IA64::out0, IA64::out1, IA64::out2, IA64::out3, - IA64::out4, IA64::out5, IA64::out6, IA64::out7 }; - unsigned FPArgs[] = {IA64::F8, IA64::F9, IA64::F10, IA64::F11, - IA64::F12, IA64::F13, IA64::F14, IA64::F15 }; - - SDOperand InFlag; // Null incoming flag value. - - for (unsigned i = 2, e = N->getNumOperands(); i != e; ++i) { - unsigned DestReg = 0; - MVT::ValueType RegTy = N->getOperand(i).getValueType(); - if (RegTy == MVT::i64) { - assert((i-2) < 8 && "Too many int args"); - DestReg = intArgs[i-2]; - } else { - assert(MVT::isFloatingPoint(N->getOperand(i).getValueType()) && - "Unpromoted integer arg?"); - assert(used_FPArgs < 8 && "Too many fp args"); - DestReg = FPArgs[used_FPArgs++]; - } - - if (N->getOperand(i).getOpcode() != ISD::UNDEF) { - SDOperand Val = Select(N->getOperand(i)); - if(MVT::isInteger(N->getOperand(i).getValueType())) { - Chain = CurDAG->getCopyToReg(Chain, DestReg, Val, InFlag); - InFlag = Chain.getValue(1); - CallOperands.push_back(CurDAG->getRegister(DestReg, RegTy)); - } - // some functions (e.g. printf) want floating point arguments - // *also* passed as in-memory representations in integer registers - // this is FORTRAN legacy junk which we don't _always_ need - // to do, but to be on the safe side, we do. - else if(MVT::isFloatingPoint(N->getOperand(i).getValueType())) { - assert((i-2) < 8 && "FP args alone would fit, but no int regs left"); - // first copy into the appropriate FP reg - Chain = CurDAG->getCopyToReg(Chain, DestReg, Val); - // then copy into the appropriate integer reg - DestReg = intArgs[i-2]; - // GETFD takes an FP reg and writes a GP reg - Chain = CurDAG->getTargetNode(IA64::GETFD, MVT::i64, Val); - // FIXME: this next line is a bit unfortunate - Chain = CurDAG->getCopyToReg(Chain, DestReg, Chain, InFlag); - InFlag = Chain.getValue(1); - CallOperands.push_back(CurDAG->getRegister(DestReg, MVT::i64)); - } - } - } - - // Finally, once everything is in registers to pass to the call, emit the - // call itself. - if (InFlag.Val) - CallOperands.push_back(InFlag); // Strong dep on register copies. - else - CallOperands.push_back(Chain); // Weak dep on whatever occurs before - Chain = CurDAG->getTargetNode(CallOpcode, MVT::Other, MVT::Flag, - CallOperands); - - std::vector CallResults; - - // If the call has results, copy the values out of the ret val registers. - switch (N->getValueType(0)) { - default: assert(0 && "Unexpected ret value!"); - case MVT::Other: break; - case MVT::i1: { - // bools are returned as bytes 0/1 in r8 - SDOperand byteval = CurDAG->getCopyFromReg(Chain, IA64::r8, MVT::i64, - Chain.getValue(1)); - Chain = byteval.getValue(1); - Chain = CurDAG->getTargetNode(IA64::CMPNE, MVT::i1, MVT::Other, - byteval, CurDAG->getRegister(IA64::r0, MVT::i64)).getValue(1); - CallResults.push_back(Chain.getValue(0)); - break; - } - case MVT::i64: - Chain = CurDAG->getCopyFromReg(Chain, IA64::r8, MVT::i64, - Chain.getValue(1)).getValue(1); - CallResults.push_back(Chain.getValue(0)); - break; - case MVT::f64: - Chain = CurDAG->getCopyFromReg(Chain, IA64::F8, N->getValueType(0), - Chain.getValue(1)).getValue(1); - CallResults.push_back(Chain.getValue(0)); - break; - } - - // restore GP, SP and RP - FIXME: this doesn't quite work (e.g. - // methcall / objinst both segfault on exit) and it *really* - // doesn't work unless you have -sched=none - Chain = CurDAG->getCopyToReg(Chain, IA64::r1, GPBeforeCall); - Chain = CurDAG->getCopyToReg(Chain, IA64::r12, SPBeforeCall); - Chain = CurDAG->getCopyToReg(Chain, IA64::rp, RPBeforeCall); - CallResults.push_back(Chain); // llc segfaults w/o this, - // ary3(e.g.) SIGILLs with 3 - - for (unsigned i = 0, e = CallResults.size(); i != e; ++i) - CodeGenMap[Op.getValue(i)] = CallResults[i]; - - return CallResults[Op.ResNo]; -} - // Select - Convert the specified operand from a target-independent to a // target-specific node if it hasn't already been changed. SDOperand IA64DAGToDAGISel::Select(SDOperand Op) { @@ -527,8 +341,37 @@ switch (N->getOpcode()) { default: break; + case ISD::Register: return Op; // XXX: this is a hack, tblgen one day? + case ISD::CALL: - case ISD::TAILCALL: return SelectCALL(Op); + case ISD::TAILCALL: { { + // FIXME: This is a workaround for a bug in tblgen. + // Pattern #47: (call:Flag (tglobaladdr:i32):$dst, ICC:Flag) + // Emits: (CALL:void (tglobaladdr:i32):$dst) + // Pattern complexity = 2 cost = 1 + SDOperand N1 = N->getOperand(1); + if (N1.getOpcode() != ISD::TargetGlobalAddress && + N1.getOpcode() != ISD::ExternalSymbol) goto P47Fail; + SDOperand InFlag = SDOperand(0, 0); + SDOperand Chain = N->getOperand(0); + SDOperand Tmp0 = N1; + Chain = Select(Chain); + SDOperand Result; + if (N->getNumOperands() == 3) { + InFlag = Select(N->getOperand(2)); + Result = CurDAG->getTargetNode(IA64::BRCALL, MVT::Other, MVT::Flag, Tmp0, + Chain, InFlag); + } else { + Result = CurDAG->getTargetNode(IA64::BRCALL, MVT::Other, MVT::Flag, Tmp0, + Chain); + } + Chain = CodeGenMap[SDOperand(N, 0)] = Result.getValue(0); + CodeGenMap[SDOperand(N, 1)] = Result.getValue(1); + return Result.getValue(Op.ResNo); + } + P47Fail:; + + } case ISD::FDIV: case ISD::SDIV: @@ -601,7 +444,16 @@ CurDAG->getRegister(IA64::r1, MVT::i64), GA); return CurDAG->getTargetNode(IA64::LD8, MVT::i64, Tmp); } - + +/* XXX case ISD::ExternalSymbol: { + SDOperand EA = CurDAG->getTargetExternalSymbol(cast(N)->getSymbol(), + MVT::i64); + SDOperand Tmp = CurDAG->getTargetNode(IA64::ADDL_EA, MVT::i64, + CurDAG->getRegister(IA64::r1, MVT::i64), EA); + return CurDAG->getTargetNode(IA64::LD8, MVT::i64, Tmp); + } +*/ + case ISD::LOAD: case ISD::EXTLOAD: case ISD::ZEXTLOAD: { @@ -615,10 +467,13 @@ default: N->dump(); assert(0 && "Cannot load this type!"); case MVT::i1: { // this is a bool Opc = IA64::LD1; // first we load a byte, then compare for != 0 - return CurDAG->SelectNodeTo(N, IA64::CMPNE, MVT::i1, MVT::Other, + if(N->getValueType(0) == MVT::i1) // XXX: early exit! + return CurDAG->SelectNodeTo(N, IA64::CMPNE, MVT::i1, MVT::Other, CurDAG->getTargetNode(Opc, MVT::i64, Address), CurDAG->getRegister(IA64::r0, MVT::i64), Chain).getValue(Op.ResNo); + /* otherwise, we want to load a bool into something bigger: LD1 + will do that for us, so we just fall through */ } case MVT::i8: Opc = IA64::LD1; break; case MVT::i16: Opc = IA64::LD2; break; @@ -690,6 +545,7 @@ case ISD::RET: { SDOperand Chain = Select(N->getOperand(0)); // Token chain. + SDOperand InFlag; switch (N->getNumOperands()) { default: @@ -707,11 +563,13 @@ // we mark r8 as live on exit up above in LowerArguments() // BuildMI(BB, IA64::MOV, 1, IA64::r8).addReg(Tmp1); Chain = CurDAG->getCopyToReg(Chain, IA64::r8, RetVal); + InFlag = Chain.getValue(1); break; case MVT::f64: // we mark F8 as live on exit up above in LowerArguments() // BuildMI(BB, IA64::FMOV, 1, IA64::F8).addReg(Tmp1); Chain = CurDAG->getCopyToReg(Chain, IA64::F8, RetVal); + InFlag = Chain.getValue(1); break; } break; From duraid at octopus.com.au Wed Dec 21 22:07:52 2005 From: duraid at octopus.com.au (Duraid Madina) Date: Wed, 21 Dec 2005 22:07:52 -0600 Subject: [llvm-commits] CVS: llvm/lib/Target/IA64/IA64ISelLowering.cpp Message-ID: <200512220407.WAA30642@zion.cs.uiuc.edu> Changes in directory llvm/lib/Target/IA64: IA64ISelLowering.cpp updated: 1.5 -> 1.6 --- Log message: I shoulda done this a *long* time ago (tm): implement calls properly, i.e. r1/r12/rp are saved/restored regardless of scheduling/luck TODO: calls to external symbols, indirect (function descriptor) calls, performance (we're being paranoid right now) BUG: the code for handling calls to vararg functions breaks if FP args are passed (this will make printf() go haywire so a bunch of tests will fail) BUG: this seems to trigger some legalize nastiness --- Diffs of the changes: (+158 -16) IA64ISelLowering.cpp | 174 ++++++++++++++++++++++++++++++++++++++++++++++----- 1 files changed, 158 insertions(+), 16 deletions(-) Index: llvm/lib/Target/IA64/IA64ISelLowering.cpp diff -u llvm/lib/Target/IA64/IA64ISelLowering.cpp:1.5 llvm/lib/Target/IA64/IA64ISelLowering.cpp:1.6 --- llvm/lib/Target/IA64/IA64ISelLowering.cpp:1.5 Wed Dec 21 14:51:36 2005 +++ llvm/lib/Target/IA64/IA64ISelLowering.cpp Wed Dec 21 22:07:40 2005 @@ -282,13 +282,25 @@ MF.getInfo()->outRegsUsed= std::max(outRegsUsed, MF.getInfo()->outRegsUsed); + // keep stack frame 16-byte aligned + //assert(NumBytes==((NumBytes+15) & ~15) && "stack frame not 16-byte aligned!"); + NumBytes = (NumBytes+15) & ~15; + Chain = DAG.getNode(ISD::CALLSEQ_START, MVT::Other, Chain, DAG.getConstant(NumBytes, getPointerTy())); - std::vector args_to_use; + SDOperand StackPtr, NullSV; + std::vector Stores; + std::vector RegValuesToPass; + unsigned ArgOffset = 16; + for (unsigned i = 0, e = Args.size(); i != e; ++i) { - switch (getValueType(Args[i].second)) { + SDOperand Val = Args[i].first; + MVT::ValueType ObjectVT = Val.getValueType(); + SDOperand ValToStore; + unsigned ObjSize=8; + switch (ObjectVT) { default: assert(0 && "unexpected argument type!"); case MVT::i1: case MVT::i8: @@ -297,34 +309,164 @@ //promote to 64-bits, sign/zero extending based on type //of the argument if(Args[i].second->isSigned()) - Args[i].first = DAG.getNode(ISD::SIGN_EXTEND, MVT::i64, - Args[i].first); + Val = DAG.getNode(ISD::SIGN_EXTEND, MVT::i64, Val); else - Args[i].first = DAG.getNode(ISD::ZERO_EXTEND, MVT::i64, - Args[i].first); + Val = DAG.getNode(ISD::ZERO_EXTEND, MVT::i64, Val); + // XXX: fall through + case MVT::i64: + //ObjSize = 8; + if(RegValuesToPass.size() >= 8) { + ValToStore = Val; + } else { + RegValuesToPass.push_back(Val); + } break; case MVT::f32: //promote to 64-bits - Args[i].first = DAG.getNode(ISD::FP_EXTEND, MVT::f64, Args[i].first); + Val = DAG.getNode(ISD::FP_EXTEND, MVT::f64, Val); + // XXX: fall through case MVT::f64: - case MVT::i64: + if(RegValuesToPass.size() >= 8) { + ValToStore = Val; + } else { + RegValuesToPass.push_back(Val); + } break; } - args_to_use.push_back(Args[i].first); + + if(ValToStore.Val) { + if(!StackPtr.Val) { + StackPtr = DAG.getRegister(IA64::r12, MVT::i64); + NullSV = DAG.getSrcValue(NULL); + } + SDOperand PtrOff = DAG.getConstant(ArgOffset, getPointerTy()); + PtrOff = DAG.getNode(ISD::ADD, MVT::i64, StackPtr, PtrOff); + Stores.push_back(DAG.getNode(ISD::STORE, MVT::Other, Chain, + ValToStore, PtrOff, NullSV)); + } + ArgOffset += ObjSize; } + // Emit all stores, make sure they occur before any copies into physregs. + if (!Stores.empty()) + Chain = DAG.getNode(ISD::TokenFactor, MVT::Other, Stores); + + static const unsigned IntArgRegs[] = { + IA64::out0, IA64::out1, IA64::out2, IA64::out3, + IA64::out4, IA64::out5, IA64::out6, IA64::out7 + }; + + static const unsigned FPArgRegs[] = { + IA64::F8, IA64::F9, IA64::F10, IA64::F11, + IA64::F12, IA64::F13, IA64::F14, IA64::F15 + }; + + SDOperand InFlag; + + // save the current GP, SP and RP : FIXME: do we need to do all 3 always? + SDOperand GPBeforeCall = DAG.getCopyFromReg(Chain, IA64::r1, MVT::i64, InFlag); + Chain = GPBeforeCall; + InFlag = Chain.getValue(1); + SDOperand SPBeforeCall = DAG.getCopyFromReg(Chain, IA64::r12, MVT::i64, InFlag); + Chain = SPBeforeCall; + InFlag = Chain.getValue(1); + SDOperand RPBeforeCall = DAG.getCopyFromReg(Chain, IA64::rp, MVT::i64, InFlag); + Chain = RPBeforeCall; + InFlag = Chain.getValue(1); + + // Build a sequence of copy-to-reg nodes chained together with token chain + // and flag operands which copy the outgoing integer args into regs out[0-7] + // mapped 1:1 and the FP args into regs F8-F15 "lazily" + // TODO: for performance, we should only copy FP args into int regs when we + // know this is required (i.e. for varardic or external (unknown) functions) + unsigned usedFPArgs = 0; + for (unsigned i = 0, e = RegValuesToPass.size(); i != e; ++i) { + Chain = DAG.getCopyToReg(Chain, + MVT::isInteger(RegValuesToPass[i].getValueType()) ? + IntArgRegs[i] : FPArgRegs[usedFPArgs++], + RegValuesToPass[i], InFlag); + InFlag = Chain.getValue(1); + + //FIXME: for performance, only do the following when required + + // if we have just copied an FP arg, copy its in-memory representation + // to the appropriate integer register +/* if(MVT::isFloatingPoint(RegValuesToPass[i].getValueType())) { + Chain = DAG.getTargetNode(IA64::GETFD, MVT::i64, RegValuesToPass[i], Chain, InFlag); + InFlag = Chain.getValue(0); // XXX + Chain = DAG.getCopyToReg(Chain, IntArgRegs[i], Chain, InFlag); // ...thrice! + InFlag = Chain.getValue(1); + } */ + + } + std::vector RetVals; - MVT::ValueType RetTyVT = getValueType(RetTy); - if (RetTyVT != MVT::isVoid) - RetVals.push_back(RetTyVT); RetVals.push_back(MVT::Other); + RetVals.push_back(MVT::Flag); - SDOperand TheCall = SDOperand(DAG.getCall(RetVals, Chain, - Callee, args_to_use), 0); - Chain = TheCall.getValue(RetTyVT != MVT::isVoid); + // If the callee is a GlobalAddress node (quite common, every direct call is) + // turn it into a TargetGlobalAddress node so that legalize doesn't hack it. + if (GlobalAddressSDNode *G = dyn_cast(Callee)) + Callee = DAG.getTargetGlobalAddress(G->getGlobal(), MVT::i64); + + std::vector NodeTys; + NodeTys.push_back(MVT::Other); // Returns a chain + NodeTys.push_back(MVT::Flag); // Returns a flag for retval copy to use. + if (InFlag.Val) + Chain = SDOperand(DAG.getCall(NodeTys, Chain, Callee, InFlag), 0); + else + Chain = SDOperand(DAG.getCall(NodeTys, Chain, Callee), 0); + InFlag = Chain.getValue(1); + + // restore the GP, SP and RP after the call + Chain = DAG.getCopyToReg(Chain, IA64::r1, GPBeforeCall, InFlag); + InFlag = Chain.getValue(1); + Chain = DAG.getCopyToReg(Chain, IA64::r12, SPBeforeCall, InFlag); + InFlag = Chain.getValue(1); + Chain = DAG.getCopyToReg(Chain, IA64::rp, RPBeforeCall, InFlag); + InFlag = Chain.getValue(1); + + MVT::ValueType RetTyVT = getValueType(RetTy); + SDOperand RetVal; + if (RetTyVT != MVT::isVoid) { + switch (RetTyVT) { + default: assert(0 && "Unknown value type to return!"); + case MVT::i1:/* { // bools are just like other integers (returned in r8) + SDOperand boolInR8 = DAG.getCopyFromReg(Chain, IA64::r8, MVT::i64, InFlag); + RetVal = DAG.getTargetNode(IA64::CMPNE, MVT::i1, // FIXME: is this flagged correctly? + DAG.getRegister(IA64::r0, MVT::i64), boolInR8, Chain, InFlag); + Chain = RetVal.getValue(1); + // Add a note to keep track of whether it is sign or zero extended - TODO: bools + RetVal = DAG.getNode(RetTy->isSigned() ? ISD::AssertSext :ISD::AssertZext, + MVT::i64, RetVal, DAG.getValueType(RetTyVT)); + RetVal = DAG.getNode(ISD::TRUNCATE, RetTyVT, RetVal); + break; + }*/ + case MVT::i8: + case MVT::i16: + case MVT::i32: + RetVal = DAG.getCopyFromReg(Chain, IA64::r8, MVT::i64, InFlag); + Chain = RetVal.getValue(1); + + // Add a note to keep track of whether it is sign or zero extended - TODO: bools + RetVal = DAG.getNode(RetTy->isSigned() ? ISD::AssertSext :ISD::AssertZext, + MVT::i64, RetVal, DAG.getValueType(RetTyVT)); + RetVal = DAG.getNode(ISD::TRUNCATE, RetTyVT, RetVal); + case MVT::i64: + RetVal = DAG.getCopyFromReg(Chain, IA64::r8, MVT::i64, InFlag); + Chain = RetVal.getValue(1); + break; + case MVT::f64: + RetVal = DAG.getCopyFromReg(Chain, IA64::F8, MVT::f64, InFlag); + Chain = RetVal.getValue(1); + break; + } + } + Chain = DAG.getNode(ISD::CALLSEQ_END, MVT::Other, Chain, DAG.getConstant(NumBytes, getPointerTy())); - return std::make_pair(TheCall, Chain); + + return std::make_pair(RetVal, Chain); } SDOperand From lattner at cs.uiuc.edu Wed Dec 21 23:23:58 2005 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Wed, 21 Dec 2005 23:23:58 -0600 Subject: [llvm-commits] CVS: llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp Message-ID: <200512220523.XAA31040@zion.cs.uiuc.edu> Changes in directory llvm/lib/CodeGen/SelectionDAG: LegalizeDAG.cpp updated: 1.240 -> 1.241 --- Log message: The 81st column doesn't like code in it. --- Diffs of the changes: (+4 -3) LegalizeDAG.cpp | 7 ++++--- 1 files changed, 4 insertions(+), 3 deletions(-) Index: llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp diff -u llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp:1.240 llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp:1.241 --- llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp:1.240 Wed Dec 21 14:51:36 2005 +++ llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp Wed Dec 21 23:23:45 2005 @@ -1454,7 +1454,7 @@ Tmp2 = LegalizeOp(Node->getOperand(1)); // RHS if (Tmp1 != Node->getOperand(0) || Tmp2 != Node->getOperand(1) || Tmp3 != Node->getOperand(2) || Tmp4 != Node->getOperand(3)) { - Result = DAG.getNode(ISD::SELECT_CC, Node->getValueType(0), Tmp1, Tmp2, + Result = DAG.getNode(ISD::SELECT_CC, Node->getValueType(0), Tmp1,Tmp2, Tmp3, Tmp4, Node->getOperand(4)); } break; @@ -1590,7 +1590,8 @@ } } - switch(TLI.getOperationAction(ISD::SETCC, Node->getOperand(0).getValueType())) { + switch(TLI.getOperationAction(ISD::SETCC, + Node->getOperand(0).getValueType())) { default: assert(0 && "Cannot handle this action for SETCC yet!"); break; @@ -1611,7 +1612,7 @@ "Fell off of the edge of the floating point world"); // If the target supports SETCC of this type, use it. - if (TLI.getOperationAction(ISD::SETCC, NewInTy) == TargetLowering::Legal) + if (TLI.isOperationLegal(ISD::SETCC, NewInTy)) break; } if (MVT::isInteger(NewInTy)) From lattner at cs.uiuc.edu Thu Dec 22 00:08:04 2005 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Thu, 22 Dec 2005 00:08:04 -0600 Subject: [llvm-commits] CVS: llvm/lib/Analysis/IPA/CallGraph.cpp Message-ID: <200512220608.AAA31205@zion.cs.uiuc.edu> Changes in directory llvm/lib/Analysis/IPA: CallGraph.cpp updated: 1.48 -> 1.49 --- Log message: Separate the call graph implementation from its interface. This implements the rough idea sketched out in http://nondot.org/sabre/LLVMNotes/CallGraphClass.txt, allowing new spiffy implementations of the callgraph interface to be built. Many thanks to Saem Ghani for contributing this! --- Diffs of the changes: (+179 -106) CallGraph.cpp | 285 ++++++++++++++++++++++++++++++++++++---------------------- 1 files changed, 179 insertions(+), 106 deletions(-) Index: llvm/lib/Analysis/IPA/CallGraph.cpp diff -u llvm/lib/Analysis/IPA/CallGraph.cpp:1.48 llvm/lib/Analysis/IPA/CallGraph.cpp:1.49 --- llvm/lib/Analysis/IPA/CallGraph.cpp:1.48 Thu Apr 21 16:08:44 2005 +++ llvm/lib/Analysis/IPA/CallGraph.cpp Thu Dec 22 00:07:52 2005 @@ -7,7 +7,8 @@ // //===----------------------------------------------------------------------===// // -// This file implements the CallGraph class. +// This file implements the CallGraph class and provides the BasicCallGraph +// default implementation. // //===----------------------------------------------------------------------===// @@ -15,22 +16,10 @@ #include "llvm/Module.h" #include "llvm/Instructions.h" #include "llvm/Support/CallSite.h" -#include "llvm/ADT/STLExtras.h" #include using namespace llvm; -static RegisterAnalysis X("callgraph", "Call Graph Construction"); - -// getNodeFor - Return the node for the specified function or create one if it -// does not already exist. -// -CallGraphNode *CallGraph::getNodeFor(Function *F) { - CallGraphNode *&CGN = FunctionMap[F]; - if (CGN) return CGN; - - assert((!F || F->getParent() == Mod) && "Function not in current module!"); - return CGN = new CallGraphNode(F); -} +void llvm::BasicCallGraphStub() {} static bool isOnlyADirectCall(Function *F, CallSite CS) { if (!CS.getInstruction()) return false; @@ -39,125 +28,194 @@ return true; } -// addToCallGraph - Add a function to the call graph, and link the node to all -// of the functions that it calls. +namespace { + +//===----------------------------------------------------------------------===// +// BasicCallGraph class definition // -void CallGraph::addToCallGraph(Function *F) { - CallGraphNode *Node = getNodeFor(F); +class BasicCallGraph : public CallGraph, public ModulePass { + // Root is root of the call graph, or the external node if a 'main' function + // couldn't be found. + // + CallGraphNode *Root; - // If this function has external linkage, anything could call it... - if (!F->hasInternalLinkage()) { - ExternalCallingNode->addCalledFunction(Node); - - // Found the entry point? - if (F->getName() == "main") { - if (Root) // Found multiple external mains? Don't pick one. - Root = ExternalCallingNode; - else - Root = Node; // Found a main, keep track of it! - } + // ExternalCallingNode - This node has edges to all external functions and + // those internal functions that have their address taken. + CallGraphNode *ExternalCallingNode; + + // CallsExternalNode - This node has edges to it from all functions making + // indirect calls or calling an external function. + CallGraphNode *CallsExternalNode; + +public: + BasicCallGraph() : Root(0), ExternalCallingNode(0), CallsExternalNode(0) {} + ~BasicCallGraph() { destroy(); } + + // runOnModule - Compute the call graph for the specified module. + virtual bool runOnModule(Module &M) { + destroy(); + CallGraph::initialize(M); + + ExternalCallingNode = getNodeFor(0); + CallsExternalNode = new CallGraphNode(0); + Root = 0; + + // Add every function to the call graph... + for (Module::iterator I = M.begin(), E = M.end(); I != E; ++I) + addToCallGraph(I); + + // If we didn't find a main function, use the external call graph node + if (Root == 0) Root = ExternalCallingNode; + + return false; } - // If this function is not defined in this translation unit, it could call - // anything. - if (F->isExternal() && !F->getIntrinsicID()) - Node->addCalledFunction(CallsExternalNode); - - // Loop over all of the users of the function... looking for callers... - // - bool isUsedExternally = false; - for (Value::use_iterator I = F->use_begin(), E = F->use_end(); I != E; ++I) { - if (Instruction *Inst = dyn_cast(*I)) { - if (isOnlyADirectCall(F, CallSite::get(Inst))) - getNodeFor(Inst->getParent()->getParent())->addCalledFunction(Node); - else - isUsedExternally = true; - } else if (GlobalValue *GV = dyn_cast(*I)) { - for (Value::use_iterator I = GV->use_begin(), E = GV->use_end(); - I != E; ++I) - if (Instruction *Inst = dyn_cast(*I)) { + virtual void getAnalysisUsage(AnalysisUsage &AU) const { + AU.setPreservesAll(); + } + + virtual void print(std::ostream &o, const Module *M) const { + o << "CallGraph Root is: "; + if (Function *F = getRoot()->getFunction()) + o << F->getName() << "\n"; + else + o << "<>\n"; + + CallGraph::print(o, M); + } + + virtual void releaseMemory() { + destroy(); + } + + /// dump - Print out this call graph. + /// + inline void dump() const { + print(std::cerr, Mod); + } + + CallGraphNode* getExternalCallingNode() const { return ExternalCallingNode; } + CallGraphNode* getCallsExternalNode() const { return CallsExternalNode; } + + // getRoot - Return the root of the call graph, which is either main, or if + // main cannot be found, the external node. + // + CallGraphNode *getRoot() { return Root; } + const CallGraphNode *getRoot() const { return Root; } + +private: + //===--------------------------------------------------------------------- + // Implementation of CallGraph construction + // + // getNodeFor - Return the node for the specified function or create one if it + // does not already exist. + // + + CallGraphNode *getNodeFor(Function *F) { + CallGraphNode *&CGN = FunctionMap[F]; + if (CGN) return CGN; + + assert((!F || F->getParent() == Mod) && "Function not in current module!"); + return CGN = new CallGraphNode(F); + } + + // + // addToCallGraph - Add a function to the call graph, and link the node to all + // of the functions that it calls. + // + void addToCallGraph(Function *F) { + CallGraphNode *Node = getNodeFor(F); + + // If this function has external linkage, anything could call it... + if (!F->hasInternalLinkage()) { + ExternalCallingNode->addCalledFunction(Node); + + // Found the entry point? + if (F->getName() == "main") { + if (Root) // Found multiple external mains? Don't pick one. + Root = ExternalCallingNode; + else + Root = Node; // Found a main, keep track of it! + } + } + + // If this function is not defined in this translation unit, it could call + // anything. + if (F->isExternal() && !F->getIntrinsicID()) + Node->addCalledFunction(CallsExternalNode); + + // Loop over all of the users of the function... looking for callers... + // + bool isUsedExternally = false; + for (Value::use_iterator I = F->use_begin(), E = F->use_end(); I != E; ++I){ + if (Instruction *Inst = dyn_cast(*I)) { + if (isOnlyADirectCall(F, CallSite::get(Inst))) + getNodeFor(Inst->getParent()->getParent())->addCalledFunction(Node); + else + isUsedExternally = true; + } else if (GlobalValue *GV = dyn_cast(*I)) { + for (Value::use_iterator I = GV->use_begin(), E = GV->use_end(); + I != E; ++I) + if (Instruction *Inst = dyn_cast(*I)) { if (isOnlyADirectCall(F, CallSite::get(Inst))) getNodeFor(Inst->getParent()->getParent())->addCalledFunction(Node); else isUsedExternally = true; - } else { - isUsedExternally = true; - } - } else { // Can't classify the user! - isUsedExternally = true; + } else { + isUsedExternally = true; + } + } else { // Can't classify the user! + isUsedExternally = true; + } } - } - if (isUsedExternally) - ExternalCallingNode->addCalledFunction(Node); + if (isUsedExternally) + ExternalCallingNode->addCalledFunction(Node); // Look for an indirect function call... - for (Function::iterator BB = F->begin(), BBE = F->end(); BB != BBE; ++BB) - for (BasicBlock::iterator II = BB->begin(), IE = BB->end(); II != IE; ++II){ + for (Function::iterator BB = F->begin(), BBE = F->end(); BB != BBE; ++BB) + for (BasicBlock::iterator II = BB->begin(), IE = BB->end(); + II != IE; ++II) { CallSite CS = CallSite::get(II); if (CS.getInstruction() && !CS.getCalledFunction()) Node->addCalledFunction(CallsExternalNode); - } -} + } + } -bool CallGraph::runOnModule(Module &M) { - destroy(); + // + // destroy - Release memory for the call graph + virtual void destroy() { + if (!CallsExternalNode) { + delete CallsExternalNode; + CallsExternalNode = 0; + } + } +}; - Mod = &M; - ExternalCallingNode = getNodeFor(0); - CallsExternalNode = new CallGraphNode(0); - Root = 0; - - // Add every function to the call graph... - for (Module::iterator I = M.begin(), E = M.end(); I != E; ++I) - addToCallGraph(I); +RegisterAnalysisGroup X("Call Graph"); +RegisterOpt Y("basiccg", "Basic CallGraph Construction"); +RegisterAnalysisGroup Z; - // If we didn't find a main function, use the external call graph node - if (Root == 0) Root = ExternalCallingNode; +} //End anonymous namespace - return false; +void CallGraph::initialize(Module &M) { + destroy(); + Mod = &M; } void CallGraph::destroy() { - for (FunctionMapTy::iterator I = FunctionMap.begin(), E = FunctionMap.end(); - I != E; ++I) - delete I->second; - FunctionMap.clear(); - delete CallsExternalNode; - CallsExternalNode = 0; -} - -void CallGraphNode::print(std::ostream &OS) const { - if (Function *F = getFunction()) - OS << "Call graph node for function: '" << F->getName() <<"'\n"; - else - OS << "Call graph node <>:\n"; - - for (const_iterator I = begin(), E = end(); I != E; ++I) - if ((*I)->getFunction()) - OS << " Calls function '" << (*I)->getFunction()->getName() << "'\n"; - else - OS << " Calls external node\n"; - OS << "\n"; + if(!FunctionMap.size()) { + for (FunctionMapTy::iterator I = FunctionMap.begin(), E = FunctionMap.end(); + I != E; ++I) + delete I->second; + FunctionMap.clear(); + } } -void CallGraphNode::dump() const { print(std::cerr); } - void CallGraph::print(std::ostream &OS, const Module *M) const { - OS << "CallGraph Root is: "; - if (Function *F = getRoot()->getFunction()) - OS << F->getName() << "\n"; - else - OS << "<>\n"; - for (CallGraph::const_iterator I = begin(), E = end(); I != E; ++I) I->second->print(OS); } -void CallGraph::dump() const { - print(std::cerr, 0); -} - - //===----------------------------------------------------------------------===// // Implementations of public modification methods // @@ -193,9 +251,24 @@ FunctionMap.erase(I); } - void CallGraph::stub() {} +void CallGraphNode::print(std::ostream &OS) const { + if (Function *F = getFunction()) + OS << "Call graph node for function: '" << F->getName() <<"'\n"; + else + OS << "Call graph node <>:\n"; + + for (const_iterator I = begin(), E = end(); I != E; ++I) + if ((*I)->getFunction()) + OS << " Calls function '" << (*I)->getFunction()->getName() << "'\n"; + else + OS << " Calls external node\n"; + OS << "\n"; +} + +void CallGraphNode::dump() const { print(std::cerr); } + void CallGraphNode::removeCallEdgeTo(CallGraphNode *Callee) { for (unsigned i = CalledFunctions.size(); ; --i) { assert(i && "Cannot find callee to remove!"); From lattner at cs.uiuc.edu Thu Dec 22 00:08:05 2005 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Thu, 22 Dec 2005 00:08:05 -0600 Subject: [llvm-commits] CVS: llvm/include/llvm/Analysis/CallGraph.h LinkAllAnalyses.h Message-ID: <200512220608.AAA31211@zion.cs.uiuc.edu> Changes in directory llvm/include/llvm/Analysis: CallGraph.h updated: 1.43 -> 1.44 LinkAllAnalyses.h updated: 1.2 -> 1.3 --- Log message: Separate the call graph implementation from its interface. This implements the rough idea sketched out in http://nondot.org/sabre/LLVMNotes/CallGraphClass.txt, allowing new spiffy implementations of the callgraph interface to be built. Many thanks to Saem Ghani for contributing this! --- Diffs of the changes: (+28 -68) CallGraph.h | 94 ++++++++++++++++-------------------------------------- LinkAllAnalyses.h | 2 - 2 files changed, 28 insertions(+), 68 deletions(-) Index: llvm/include/llvm/Analysis/CallGraph.h diff -u llvm/include/llvm/Analysis/CallGraph.h:1.43 llvm/include/llvm/Analysis/CallGraph.h:1.44 --- llvm/include/llvm/Analysis/CallGraph.h:1.43 Thu Apr 21 15:16:31 2005 +++ llvm/include/llvm/Analysis/CallGraph.h Thu Dec 22 00:07:52 2005 @@ -64,25 +64,13 @@ //===----------------------------------------------------------------------===// // CallGraph class definition // -class CallGraph : public ModulePass { +class CallGraph { +protected: Module *Mod; // The module this call graph represents typedef std::map FunctionMapTy; FunctionMapTy FunctionMap; // Map from a function to its node - // Root is root of the call graph, or the external node if a 'main' function - // couldn't be found. - // - CallGraphNode *Root; - - // ExternalCallingNode - This node has edges to all external functions and - // those internal functions that have their address taken. - CallGraphNode *ExternalCallingNode; - - // CallsExternalNode - This node has edges to it from all functions making - // indirect calls or calling an external function. - CallGraphNode *CallsExternalNode; - public: //===--------------------------------------------------------------------- // Accessors... @@ -90,15 +78,6 @@ typedef FunctionMapTy::iterator iterator; typedef FunctionMapTy::const_iterator const_iterator; - CallGraphNode *getExternalCallingNode() const { return ExternalCallingNode; } - CallGraphNode *getCallsExternalNode() const { return CallsExternalNode; } - - // getRoot - Return the root of the call graph, which is either main, or if - // main cannot be found, the external node. - // - CallGraphNode *getRoot() { return Root; } - const CallGraphNode *getRoot() const { return Root; } - /// getModule - Return the module the call graph corresponds to. /// Module &getModule() const { return *Mod; } @@ -108,7 +87,6 @@ inline const_iterator begin() const { return FunctionMap.begin(); } inline const_iterator end() const { return FunctionMap.end(); } - // Subscripting operators, return the call graph node for the provided // function inline const CallGraphNode *operator[](const Function *F) const { @@ -122,6 +100,16 @@ return I->second; } + //Returns the CallGraphNode which is used to represent undetermined calls + // into the callgraph. Override this if you want behavioural inheritance. + virtual CallGraphNode* getExternalCallingNode() const { return 0; } + + //Return the root/main method in the module, or some other root node, such + // as the externalcallingnode. Overload these if you behavioural + // inheritance. + virtual CallGraphNode* getRoot() { return 0; } + virtual const CallGraphNode* getRoot() const { return 0; } + //===--------------------------------------------------------------------- // Functions to keep a call graph up to date with a function that has been // modified. @@ -147,54 +135,27 @@ //===--------------------------------------------------------------------- // Pass infrastructure interface glue code... // - CallGraph() : Root(0), CallsExternalNode(0) {} - ~CallGraph() { destroy(); } - - // runOnModule - Compute the call graph for the specified module. - virtual bool runOnModule(Module &M); - - // getAnalysisUsage - This obviously provides a call graph - virtual void getAnalysisUsage(AnalysisUsage &AU) const { - AU.setPreservesAll(); - } - - // releaseMemory - Data structures can be large, so free memory aggressively. - virtual void releaseMemory() { - destroy(); - } +protected: + CallGraph() {} + +public: + virtual ~CallGraph() { destroy(); } - /// Print the types found in the module. If the optional Module parameter is - /// passed in, then the types are printed symbolically if possible, using the - /// symbol table from the module. + /// initialize - Call this method before calling other methods, + /// re/initializes the state of the CallGraph. /// - void print(std::ostream &o, const Module *M) const; + void initialize(Module &M); - /// dump - Print out this call graph. - /// - void dump() const; + virtual void print(std::ostream &o, const Module *M) const; // stub - dummy function, just ignore it static void stub(); -private: - //===--------------------------------------------------------------------- - // Implementation of CallGraph construction - // - - // getNodeFor - Return the node for the specified function or create one if it - // does not already exist. - // - CallGraphNode *getNodeFor(Function *F); - - // addToCallGraph - Add a function to the call graph, and link the node to all - // of the functions that it calls. - // - void addToCallGraph(Function *F); +protected: // destroy - Release memory for the call graph - void destroy(); + virtual void destroy(); }; - //===----------------------------------------------------------------------===// // CallGraphNode class definition // @@ -256,15 +217,12 @@ /// removeCallEdgeTo, so it should not be used unless necessary. void removeAnyCallEdgeTo(CallGraphNode *Callee); -private: // Stuff to construct the node, used by CallGraph friend class CallGraph; // CallGraphNode ctor - Create a node for the specified function... inline CallGraphNode(Function *f) : F(f) {} }; - - //===----------------------------------------------------------------------===// // GraphTraits specializations for call graphs so that they can be treated as // graphs by the generic graph algorithms... @@ -311,6 +269,7 @@ return *P.second; } }; + template<> struct GraphTraits : public GraphTraits { static NodeType *getEntryNode(const CallGraph *CGN) { @@ -322,10 +281,13 @@ static nodes_iterator nodes_end (const CallGraph *CG) { return CG->end(); } }; -// Make sure that any clients of this file link in PostDominators.cpp +// Make sure that any clients of this file link in CallGraph.cpp static IncludeFile CALLGRAPH_INCLUDE_FILE((void*)&CallGraph::stub); +extern void BasicCallGraphStub(); +static IncludeFile HDR_INCLUDE_CALLGRAPH_CPP((void*)&BasicCallGraphStub); + } // End llvm namespace #endif Index: llvm/include/llvm/Analysis/LinkAllAnalyses.h diff -u llvm/include/llvm/Analysis/LinkAllAnalyses.h:1.2 llvm/include/llvm/Analysis/LinkAllAnalyses.h:1.3 --- llvm/include/llvm/Analysis/LinkAllAnalyses.h:1.2 Sun Oct 23 21:35:25 2005 +++ llvm/include/llvm/Analysis/LinkAllAnalyses.h Thu Dec 22 00:07:52 2005 @@ -16,7 +16,6 @@ #define LLVM_ANALYSIS_LINKALLANALYSES_H #include "llvm/Analysis/AliasSetTracker.h" -#include "llvm/Analysis/CallGraph.h" #include "llvm/Analysis/FindUsedTypes.h" #include "llvm/Analysis/IntervalPartition.h" #include "llvm/Analysis/PostDominators.h" @@ -49,7 +48,6 @@ (void)new llvm::IntervalPartition(); (void)new llvm::ImmediateDominators(); (void)new llvm::PostDominatorSet(); - (void)new llvm::CallGraph(); (void)new llvm::FindUsedTypes(); (void)new llvm::ScalarEvolution(); ((llvm::Function*)0)->viewCFGOnly(); From lattner at cs.uiuc.edu Thu Dec 22 00:09:20 2005 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Thu, 22 Dec 2005 00:09:20 -0600 Subject: [llvm-commits] CVS: llvm/CREDITS.TXT Message-ID: <200512220609.AAA31251@zion.cs.uiuc.edu> Changes in directory llvm: CREDITS.TXT updated: 1.43 -> 1.44 --- Log message: credit where credit is due --- Diffs of the changes: (+5 -1) CREDITS.TXT | 6 +++++- 1 files changed, 5 insertions(+), 1 deletion(-) Index: llvm/CREDITS.TXT diff -u llvm/CREDITS.TXT:1.43 llvm/CREDITS.TXT:1.44 --- llvm/CREDITS.TXT:1.43 Mon Nov 28 18:57:06 2005 +++ llvm/CREDITS.TXT Thu Dec 22 00:09:08 2005 @@ -54,13 +54,17 @@ N: Brian Gaeke E: gaeke at uiuc.edu W: http://www.students.uiuc.edu/~gaeke/ -D: Portions of X86 static and JIT compilers; SparcV8 backend +D: Portions of X86 static and JIT compilers; initial SparcV8 backend D: Dynamic trace optimizer D: FreeBSD/X86 compatibility fixes, the llvm-nm tool N: Louis Gerbarg D: Portions of the PowerPC backend +N: Saem Ghani +E: saemghani at gmail.com +D: Callgraph class cleanups + N: Paolo Invernizzi E: arathorn at fastwebnet.it D: Visual C++ compatibility fixes From duraid at octopus.com.au Thu Dec 22 00:38:49 2005 From: duraid at octopus.com.au (Duraid Madina) Date: Thu, 22 Dec 2005 00:38:49 -0600 Subject: [llvm-commits] CVS: llvm/lib/Target/IA64/IA64InstrInfo.td Message-ID: <200512220638.AAA31358@zion.cs.uiuc.edu> Changes in directory llvm/lib/Target/IA64: IA64InstrInfo.td updated: 1.31 -> 1.32 --- Log message: we need to emit the getf.d instruction in lowering, so add it to IA64ISD --- Diffs of the changes: (+11 -2) IA64InstrInfo.td | 13 +++++++++++-- 1 files changed, 11 insertions(+), 2 deletions(-) Index: llvm/lib/Target/IA64/IA64InstrInfo.td diff -u llvm/lib/Target/IA64/IA64InstrInfo.td:1.31 llvm/lib/Target/IA64/IA64InstrInfo.td:1.32 --- llvm/lib/Target/IA64/IA64InstrInfo.td:1.31 Wed Dec 21 21:56:03 2005 +++ llvm/lib/Target/IA64/IA64InstrInfo.td Thu Dec 22 00:38:38 2005 @@ -15,6 +15,14 @@ include "IA64InstrFormats.td" +//===----------------------------------------------------------------------===// +// IA-64 specific DAG Nodes. +// + +def IA64getfd : SDNode<"IA64ISD::GETFD", SDTFPToIntOp, []>; + +//===--------- + def u2imm : Operand; def u6imm : Operand; def s8imm : Operand { @@ -614,8 +622,9 @@ def FNORMD : AForm<0x03, 0x0b, (ops FP:$dst, FP:$src), "fnorm.d $dst = $src;;">; -def GETFD : AForm<0x03, 0x0b, (ops GR:$dst, FP:$src), - "getf.d $dst = $src;;">; +def GETFD : AForm_DAG<0x03, 0x0b, (ops GR:$dst, FP:$src), + "getf.d $dst = $src;;", + [(set GR:$dst, (IA64getfd FP:$src))]>; def SETFD : AForm<0x03, 0x0b, (ops FP:$dst, GR:$src), "setf.d $dst = $src;;">; From duraid at octopus.com.au Thu Dec 22 00:40:09 2005 From: duraid at octopus.com.au (Duraid Madina) Date: Thu, 22 Dec 2005 00:40:09 -0600 Subject: [llvm-commits] CVS: llvm/lib/Target/IA64/IA64ISelLowering.cpp Message-ID: <200512220640.AAA31378@zion.cs.uiuc.edu> Changes in directory llvm/lib/Target/IA64: IA64ISelLowering.cpp updated: 1.6 -> 1.7 --- Log message: this should take care of calls to varadic functions, but it doesn.,t BUG: calling printf(string, float) will load the float into the wrong register, completely forget about loading the string, etce --- Diffs of the changes: (+14 -7) IA64ISelLowering.cpp | 21 ++++++++++++++------- 1 files changed, 14 insertions(+), 7 deletions(-) Index: llvm/lib/Target/IA64/IA64ISelLowering.cpp diff -u llvm/lib/Target/IA64/IA64ISelLowering.cpp:1.6 llvm/lib/Target/IA64/IA64ISelLowering.cpp:1.7 --- llvm/lib/Target/IA64/IA64ISelLowering.cpp:1.6 Wed Dec 21 22:07:40 2005 +++ llvm/lib/Target/IA64/IA64ISelLowering.cpp Thu Dec 22 00:39:57 2005 @@ -388,16 +388,22 @@ InFlag = Chain.getValue(1); //FIXME: for performance, only do the following when required - + // if we have just copied an FP arg, copy its in-memory representation // to the appropriate integer register -/* if(MVT::isFloatingPoint(RegValuesToPass[i].getValueType())) { - Chain = DAG.getTargetNode(IA64::GETFD, MVT::i64, RegValuesToPass[i], Chain, InFlag); - InFlag = Chain.getValue(0); // XXX - Chain = DAG.getCopyToReg(Chain, IntArgRegs[i], Chain, InFlag); // ...thrice! + if(MVT::isFloatingPoint(RegValuesToPass[i].getValueType())) { + std::vector GETFDRetTypes; + std::vector GETFDOperands; + GETFDRetTypes.push_back(MVT::i64); + GETFDRetTypes.push_back(MVT::Flag); + GETFDOperands.push_back(RegValuesToPass[i]); + GETFDOperands.push_back(Chain); + GETFDOperands.push_back(InFlag); + + Chain = DAG.getNode(IA64ISD::GETFD, GETFDRetTypes, GETFDOperands); + Chain = DAG.getCopyToReg(Chain, IntArgRegs[i], Chain.getValue(0), Chain.getValue(1)); // ...thrice! InFlag = Chain.getValue(1); - } */ - + } } std::vector RetVals; @@ -452,6 +458,7 @@ RetVal = DAG.getNode(RetTy->isSigned() ? ISD::AssertSext :ISD::AssertZext, MVT::i64, RetVal, DAG.getValueType(RetTyVT)); RetVal = DAG.getNode(ISD::TRUNCATE, RetTyVT, RetVal); + break; case MVT::i64: RetVal = DAG.getCopyFromReg(Chain, IA64::r8, MVT::i64, InFlag); Chain = RetVal.getValue(1); From duraid at octopus.com.au Thu Dec 22 00:41:51 2005 From: duraid at octopus.com.au (Duraid Madina) Date: Thu, 22 Dec 2005 00:41:51 -0600 Subject: [llvm-commits] CVS: llvm/lib/Target/IA64/IA64ISelLowering.h Message-ID: <200512220641.AAA31392@zion.cs.uiuc.edu> Changes in directory llvm/lib/Target/IA64: IA64ISelLowering.h updated: 1.1 -> 1.2 --- Log message: we can't all have brains now, can we --- Diffs of the changes: (+4 -0) IA64ISelLowering.h | 4 ++++ 1 files changed, 4 insertions(+) Index: llvm/lib/Target/IA64/IA64ISelLowering.h diff -u llvm/lib/Target/IA64/IA64ISelLowering.h:1.1 llvm/lib/Target/IA64/IA64ISelLowering.h:1.2 --- llvm/lib/Target/IA64/IA64ISelLowering.h:1.1 Fri Oct 28 12:46:36 2005 +++ llvm/lib/Target/IA64/IA64ISelLowering.h Thu Dec 22 00:41:39 2005 @@ -38,6 +38,10 @@ /// operand, producing an f64 value containing the integer representation /// of that FP value. FCTIDZ, FCTIWZ, + + /// GETFD - the getf.d instruction takes a floating point operand and + /// returns its 64-bit memory representation as an i64 + GETFD }; } From duraid at octopus.com.au Thu Dec 22 01:03:03 2005 From: duraid at octopus.com.au (Duraid Madina) Date: Thu, 22 Dec 2005 01:03:03 -0600 Subject: [llvm-commits] CVS: llvm/include/llvm/CodeGen/SelectionDAG.h Message-ID: <200512220703.BAA31513@zion.cs.uiuc.edu> Changes in directory llvm/include/llvm/CodeGen: SelectionDAG.h updated: 1.80 -> 1.81 --- Log message: i need to do this to take over the earth when I take over the earth, sabre will be happy because i'll stop asking him silly questions!!!!!! --- Diffs of the changes: (+9 -0) SelectionDAG.h | 9 +++++++++ 1 files changed, 9 insertions(+) Index: llvm/include/llvm/CodeGen/SelectionDAG.h diff -u llvm/include/llvm/CodeGen/SelectionDAG.h:1.80 llvm/include/llvm/CodeGen/SelectionDAG.h:1.81 --- llvm/include/llvm/CodeGen/SelectionDAG.h:1.80 Sun Dec 18 15:00:53 2005 +++ llvm/include/llvm/CodeGen/SelectionDAG.h Thu Dec 22 01:02:51 2005 @@ -364,6 +364,15 @@ return getNode(ISD::BUILTIN_OP_END+Opcode, VT, Ops); } SDOperand getTargetNode(unsigned Opcode, MVT::ValueType VT1, + MVT::ValueType VT2, SDOperand Op1) { + std::vector ResultTys; + ResultTys.push_back(VT1); + ResultTys.push_back(VT2); + std::vector Ops; + Ops.push_back(Op1); + return getNode(ISD::BUILTIN_OP_END+Opcode, ResultTys, Ops); + } + SDOperand getTargetNode(unsigned Opcode, MVT::ValueType VT1, MVT::ValueType VT2, SDOperand Op1, SDOperand Op2) { std::vector ResultTys; ResultTys.push_back(VT1); From duraid at octopus.com.au Thu Dec 22 01:14:02 2005 From: duraid at octopus.com.au (Duraid Madina) Date: Thu, 22 Dec 2005 01:14:02 -0600 Subject: [llvm-commits] CVS: llvm/lib/Target/IA64/IA64InstrInfo.td Message-ID: <200512220714.BAA31570@zion.cs.uiuc.edu> Changes in directory llvm/lib/Target/IA64: IA64InstrInfo.td updated: 1.32 -> 1.33 --- Log message: oops, back this out --- Diffs of the changes: (+2 -3) IA64InstrInfo.td | 5 ++--- 1 files changed, 2 insertions(+), 3 deletions(-) Index: llvm/lib/Target/IA64/IA64InstrInfo.td diff -u llvm/lib/Target/IA64/IA64InstrInfo.td:1.32 llvm/lib/Target/IA64/IA64InstrInfo.td:1.33 --- llvm/lib/Target/IA64/IA64InstrInfo.td:1.32 Thu Dec 22 00:38:38 2005 +++ llvm/lib/Target/IA64/IA64InstrInfo.td Thu Dec 22 01:13:51 2005 @@ -622,9 +622,8 @@ def FNORMD : AForm<0x03, 0x0b, (ops FP:$dst, FP:$src), "fnorm.d $dst = $src;;">; -def GETFD : AForm_DAG<0x03, 0x0b, (ops GR:$dst, FP:$src), - "getf.d $dst = $src;;", - [(set GR:$dst, (IA64getfd FP:$src))]>; +def GETFD : AForm<0x03, 0x0b, (ops GR:$dst, FP:$src), + "getf.d $dst = $src;;">; def SETFD : AForm<0x03, 0x0b, (ops FP:$dst, GR:$src), "setf.d $dst = $src;;">; From duraid at octopus.com.au Thu Dec 22 01:14:57 2005 From: duraid at octopus.com.au (Duraid Madina) Date: Thu, 22 Dec 2005 01:14:57 -0600 Subject: [llvm-commits] CVS: llvm/lib/Target/IA64/IA64ISelDAGToDAG.cpp Message-ID: <200512220714.BAA31583@zion.cs.uiuc.edu> Changes in directory llvm/lib/Target/IA64: IA64ISelDAGToDAG.cpp updated: 1.14 -> 1.15 --- Log message: we can't do this directly in lowering, so we need this case --- Diffs of the changes: (+8 -0) IA64ISelDAGToDAG.cpp | 8 ++++++++ 1 files changed, 8 insertions(+) Index: llvm/lib/Target/IA64/IA64ISelDAGToDAG.cpp diff -u llvm/lib/Target/IA64/IA64ISelDAGToDAG.cpp:1.14 llvm/lib/Target/IA64/IA64ISelDAGToDAG.cpp:1.15 --- llvm/lib/Target/IA64/IA64ISelDAGToDAG.cpp:1.14 Wed Dec 21 21:58:17 2005 +++ llvm/lib/Target/IA64/IA64ISelDAGToDAG.cpp Thu Dec 22 01:14:45 2005 @@ -343,6 +343,14 @@ case ISD::Register: return Op; // XXX: this is a hack, tblgen one day? + case IA64ISD::GETFD: { + SDOperand Input = Select(N->getOperand(0)); + SDOperand Result = CurDAG->getTargetNode(IA64::GETFD, MVT::i64, MVT::Flag, Input); + CodeGenMap[Op.getValue(0)] = Result; + CodeGenMap[Op.getValue(1)] = Result.getValue(1); + return Result.getValue(Op.ResNo); + } + case ISD::CALL: case ISD::TAILCALL: { { // FIXME: This is a workaround for a bug in tblgen. From duraid at octopus.com.au Thu Dec 22 07:29:35 2005 From: duraid at octopus.com.au (Duraid Madina) Date: Thu, 22 Dec 2005 07:29:35 -0600 Subject: [llvm-commits] CVS: llvm/lib/Target/IA64/IA64ISelLowering.cpp IA64ISelLowering.h IA64ISelDAGToDAG.cpp Message-ID: <200512221329.HAA07846@zion.cs.uiuc.edu> Changes in directory llvm/lib/Target/IA64: IA64ISelLowering.cpp updated: 1.7 -> 1.8 IA64ISelLowering.h updated: 1.2 -> 1.3 IA64ISelDAGToDAG.cpp updated: 1.15 -> 1.16 --- Log message: this is a hack, which may or may not hang around. In short: whimper out of doing things the Right Way, and hack up a generic 'BRCALL' instruction, that gets generated when calls are lowered. This gets selected by hand in the DAG isel, where it gets turned into real (i.e. in tablegen) br.call instructions. BUG: this dies on void calls, but seems to work otherwise? --- Diffs of the changes: (+112 -27) IA64ISelDAGToDAG.cpp | 67 +++++++++++++++++++++++++++++++++++++++++++++++++++ IA64ISelLowering.cpp | 65 ++++++++++++++++++++++++++++++------------------- IA64ISelLowering.h | 7 +++-- 3 files changed, 112 insertions(+), 27 deletions(-) Index: llvm/lib/Target/IA64/IA64ISelLowering.cpp diff -u llvm/lib/Target/IA64/IA64ISelLowering.cpp:1.7 llvm/lib/Target/IA64/IA64ISelLowering.cpp:1.8 --- llvm/lib/Target/IA64/IA64ISelLowering.cpp:1.7 Thu Dec 22 00:39:57 2005 +++ llvm/lib/Target/IA64/IA64ISelLowering.cpp Thu Dec 22 07:29:14 2005 @@ -291,6 +291,7 @@ SDOperand StackPtr, NullSV; std::vector Stores; + std::vector Converts; std::vector RegValuesToPass; unsigned ArgOffset = 16; @@ -298,7 +299,7 @@ { SDOperand Val = Args[i].first; MVT::ValueType ObjectVT = Val.getValueType(); - SDOperand ValToStore; + SDOperand ValToStore, ValToConvert; unsigned ObjSize=8; switch (ObjectVT) { default: assert(0 && "unexpected argument type!"); @@ -330,6 +331,9 @@ ValToStore = Val; } else { RegValuesToPass.push_back(Val); + if(1 /* TODO: if(calling external or varadic function)*/ ) { + ValToConvert = Val; // additionally pass this FP value as an int + } } break; } @@ -344,6 +348,10 @@ Stores.push_back(DAG.getNode(ISD::STORE, MVT::Other, Chain, ValToStore, PtrOff, NullSV)); } + + if(ValToConvert.Val) { + Converts.push_back(DAG.getNode(IA64ISD::GETFD, MVT::i64, ValToConvert)); + } ArgOffset += ObjSize; } @@ -379,6 +387,17 @@ // mapped 1:1 and the FP args into regs F8-F15 "lazily" // TODO: for performance, we should only copy FP args into int regs when we // know this is required (i.e. for varardic or external (unknown) functions) + + // first to the FP->(integer representation) conversions, these are + // free-floating + unsigned seenConverts = 0; + for (unsigned i = 0, e = RegValuesToPass.size(); i != e; ++i) { + if(MVT::isFloatingPoint(RegValuesToPass[i].getValueType())) { + Chain = DAG.getCopyToReg(Chain, IntArgRegs[i], Converts[seenConverts++]); + } + } + + // next copy args into the usual places unsigned usedFPArgs = 0; for (unsigned i = 0, e = RegValuesToPass.size(); i != e; ++i) { Chain = DAG.getCopyToReg(Chain, @@ -386,42 +405,34 @@ IntArgRegs[i] : FPArgRegs[usedFPArgs++], RegValuesToPass[i], InFlag); InFlag = Chain.getValue(1); - - //FIXME: for performance, only do the following when required - - // if we have just copied an FP arg, copy its in-memory representation - // to the appropriate integer register - if(MVT::isFloatingPoint(RegValuesToPass[i].getValueType())) { - std::vector GETFDRetTypes; - std::vector GETFDOperands; - GETFDRetTypes.push_back(MVT::i64); - GETFDRetTypes.push_back(MVT::Flag); - GETFDOperands.push_back(RegValuesToPass[i]); - GETFDOperands.push_back(Chain); - GETFDOperands.push_back(InFlag); - - Chain = DAG.getNode(IA64ISD::GETFD, GETFDRetTypes, GETFDOperands); - Chain = DAG.getCopyToReg(Chain, IntArgRegs[i], Chain.getValue(0), Chain.getValue(1)); // ...thrice! - InFlag = Chain.getValue(1); - } } - std::vector RetVals; - RetVals.push_back(MVT::Other); - RetVals.push_back(MVT::Flag); - // If the callee is a GlobalAddress node (quite common, every direct call is) // turn it into a TargetGlobalAddress node so that legalize doesn't hack it. - if (GlobalAddressSDNode *G = dyn_cast(Callee)) +/* + if (GlobalAddressSDNode *G = dyn_cast(Callee)) { Callee = DAG.getTargetGlobalAddress(G->getGlobal(), MVT::i64); + } +*/ std::vector NodeTys; + std::vector CallOperands; NodeTys.push_back(MVT::Other); // Returns a chain NodeTys.push_back(MVT::Flag); // Returns a flag for retval copy to use. + CallOperands.push_back(Chain); + CallOperands.push_back(Callee); + + // emit the call itself if (InFlag.Val) + CallOperands.push_back(InFlag); + +/* out with the old... Chain = SDOperand(DAG.getCall(NodeTys, Chain, Callee, InFlag), 0); else Chain = SDOperand(DAG.getCall(NodeTys, Chain, Callee), 0); +*/ + // to make way for a hack: + Chain = DAG.getNode(IA64ISD::BRCALL, NodeTys, CallOperands); InFlag = Chain.getValue(1); // restore the GP, SP and RP after the call @@ -431,7 +442,11 @@ InFlag = Chain.getValue(1); Chain = DAG.getCopyToReg(Chain, IA64::rp, RPBeforeCall, InFlag); InFlag = Chain.getValue(1); - + + std::vector RetVals; + RetVals.push_back(MVT::Other); + RetVals.push_back(MVT::Flag); + MVT::ValueType RetTyVT = getValueType(RetTy); SDOperand RetVal; if (RetTyVT != MVT::isVoid) { Index: llvm/lib/Target/IA64/IA64ISelLowering.h diff -u llvm/lib/Target/IA64/IA64ISelLowering.h:1.2 llvm/lib/Target/IA64/IA64ISelLowering.h:1.3 --- llvm/lib/Target/IA64/IA64ISelLowering.h:1.2 Thu Dec 22 00:41:39 2005 +++ llvm/lib/Target/IA64/IA64ISelLowering.h Thu Dec 22 07:29:14 2005 @@ -38,10 +38,13 @@ /// operand, producing an f64 value containing the integer representation /// of that FP value. FCTIDZ, FCTIWZ, - + /// GETFD - the getf.d instruction takes a floating point operand and /// returns its 64-bit memory representation as an i64 - GETFD + GETFD, + + // TODO: explain this hack + BRCALL }; } Index: llvm/lib/Target/IA64/IA64ISelDAGToDAG.cpp diff -u llvm/lib/Target/IA64/IA64ISelDAGToDAG.cpp:1.15 llvm/lib/Target/IA64/IA64ISelDAGToDAG.cpp:1.16 --- llvm/lib/Target/IA64/IA64ISelDAGToDAG.cpp:1.15 Thu Dec 22 01:14:45 2005 +++ llvm/lib/Target/IA64/IA64ISelDAGToDAG.cpp Thu Dec 22 07:29:14 2005 @@ -342,6 +342,73 @@ default: break; case ISD::Register: return Op; // XXX: this is a hack, tblgen one day? + + case IA64ISD::BRCALL: { // XXX: this is also a hack! + SDOperand Chain = Select(N->getOperand(0)); + SDOperand InFlag; // Null incoming flag value. + + if(N->getNumOperands()==3) // we have an incoming chain, callee and flag + InFlag = Select(N->getOperand(2)); + + unsigned CallOpcode; + SDOperand CallOperand; + std::vector TypeOperands; + + // if we can call directly, do so + if (GlobalAddressSDNode *GASD = + dyn_cast(N->getOperand(1))) { + CallOpcode = IA64::BRCALL_IPREL_GA; + CallOperand = CurDAG->getTargetGlobalAddress(GASD->getGlobal(), MVT::i64); + } else if (ExternalSymbolSDNode *ESSDN = // FIXME: we currently NEED this + // case for correctness, to avoid + // "non-pic code with imm reloc.n + // against dynamic symbol" errors + dyn_cast(N->getOperand(1))) { + CallOpcode = IA64::BRCALL_IPREL_ES; + CallOperand = N->getOperand(1); + } else { + // otherwise we need to load the function descriptor, + // load the branch target (function)'s entry point and GP, + // branch (call) then restore the GP + SDOperand FnDescriptor = Select(N->getOperand(1)); + + // load the branch target's entry point [mem] and + // GP value [mem+8] + SDOperand targetEntryPoint=CurDAG->getTargetNode(IA64::LD8, MVT::i64, + FnDescriptor); + Chain = targetEntryPoint.getValue(1); + SDOperand targetGPAddr=CurDAG->getTargetNode(IA64::ADDS, MVT::i64, + FnDescriptor, CurDAG->getConstant(8, MVT::i64)); + Chain = targetGPAddr.getValue(1); + SDOperand targetGP=CurDAG->getTargetNode(IA64::LD8, MVT::i64, + targetGPAddr); + Chain = targetGP.getValue(1); + + Chain = CurDAG->getCopyToReg(Chain, IA64::r1, targetGP, InFlag); + InFlag = Chain.getValue(1); + Chain = CurDAG->getCopyToReg(Chain, IA64::B6, targetEntryPoint, InFlag); // FLAG these? + InFlag = Chain.getValue(1); + + CallOperand = CurDAG->getRegister(IA64::B6, MVT::i64); + CallOpcode = IA64::BRCALL_INDIRECT; + } + + // Finally, once everything is setup, emit the call itself + if(InFlag.Val) + Chain = CurDAG->getTargetNode(CallOpcode, MVT::Other, MVT::Flag, CallOperand, Chain, InFlag); + else // there might be no arguments + Chain = CurDAG->getTargetNode(CallOpcode, MVT::Other, MVT::Flag, CallOperand, Chain); + InFlag = Chain.getValue(1); + + std::vector CallResults; + + CallResults.push_back(Chain); + CallResults.push_back(InFlag); + + for (unsigned i = 0, e = CallResults.size(); i != e; ++i) + CodeGenMap[Op.getValue(i)] = CallResults[i]; + return CallResults[Op.ResNo]; + } case IA64ISD::GETFD: { SDOperand Input = Select(N->getOperand(0)); From dhurjati at cs.uiuc.edu Thu Dec 22 10:32:33 2005 From: dhurjati at cs.uiuc.edu (Dinakar Dhurjati) Date: Thu, 22 Dec 2005 10:32:33 -0600 Subject: [llvm-commits] CVS: llvm-poolalloc/lib/PoolAllocate/PoolAllocate.h Message-ID: <200512221632.KAA13413@zion.cs.uiuc.edu> Changes in directory llvm-poolalloc/lib/PoolAllocate: PoolAllocate.h updated: 1.47 -> 1.48 --- Log message: Extra book keeping for SAFECode --- Diffs of the changes: (+35 -4) PoolAllocate.h | 39 +++++++++++++++++++++++++++++++++++---- 1 files changed, 35 insertions(+), 4 deletions(-) Index: llvm-poolalloc/lib/PoolAllocate/PoolAllocate.h diff -u llvm-poolalloc/lib/PoolAllocate/PoolAllocate.h:1.47 llvm-poolalloc/lib/PoolAllocate/PoolAllocate.h:1.48 --- llvm-poolalloc/lib/PoolAllocate/PoolAllocate.h:1.47 Wed May 18 14:56:28 2005 +++ llvm-poolalloc/lib/PoolAllocate/PoolAllocate.h Thu Dec 22 10:32:21 2005 @@ -16,17 +16,28 @@ #ifndef POOLALLOCATE_H #define POOLALLOCATE_H - +//#define SAFECODE 1 +//#define BOUNDS_CHECK 1 +//comment the above two for normal poolallocation #include "llvm/Pass.h" #include "llvm/DerivedTypes.h" #include "llvm/Support/CallSite.h" #include "llvm/ADT/EquivalenceClasses.h" #include "llvm/ADT/VectorExtras.h" #include "llvm/ADT/hash_set" + +#ifdef SAFECODE +//FIXME : make this use some configuration options +#include "/home/vadve/dhurjati/llvm/projects/safecode.typesafe/include/ConvertUnsafeAllocas.h" +#endif + + #include namespace llvm { - +#ifdef SAFECODE + using namespace CUA; +#endif class DSNode; class DSGraph; class Type; @@ -73,6 +84,12 @@ /// function. std::map PoolDescriptors; +#ifdef SAFECODE + //This is a map from Old to New Value Map reverse of the one above + //Useful in SAFECode for check insertion + std::map ValueMap; +#endif + /// NewToOldValueMap - When and if a function needs to be cloned, this map /// contains a mapping from all of the values in the new function back to /// the values they correspond to in the old function. @@ -105,13 +122,23 @@ Module *CurModule; EquivClassGraphs *ECGraphs; - + std::map FunctionInfo; std::map CloneToOrigMap; public: +#ifdef SAFECODE + ConvertUnsafeAllocas *CUAPass; +#endif Function *PoolInit, *PoolDestroy, *PoolAlloc, *PoolRealloc, *PoolMemAlign; Function *PoolFree; +#ifdef SAFECODE + Function *PoolRegister; +#endif +#ifdef BOUNDS_CHECK + Function *PoolRegister; +#endif + static const Type *PoolDescPtrTy; PA::Heuristic *CurHeuristic; @@ -122,9 +149,13 @@ std::map GlobalNodes; public: +#ifdef SAFECODE + PoolAllocate(bool passAllArguments = true) + : PassAllArguments(passAllArguments) {} +#else PoolAllocate(bool passAllArguments = false) : PassAllArguments(passAllArguments) {} - +#endif bool runOnModule(Module &M); virtual void getAnalysisUsage(AnalysisUsage &AU) const; From dhurjati at cs.uiuc.edu Thu Dec 22 10:33:06 2005 From: dhurjati at cs.uiuc.edu (Dinakar Dhurjati) Date: Thu, 22 Dec 2005 10:33:06 -0600 Subject: [llvm-commits] CVS: llvm-poolalloc/lib/PoolAllocate/PoolAllocate.cpp Message-ID: <200512221633.KAA13433@zion.cs.uiuc.edu> Changes in directory llvm-poolalloc/lib/PoolAllocate: PoolAllocate.cpp updated: 1.120 -> 1.121 --- Log message: Extra book keeping for SAFECode --- Diffs of the changes: (+58 -6) PoolAllocate.cpp | 64 +++++++++++++++++++++++++++++++++++++++++++++++++------ 1 files changed, 58 insertions(+), 6 deletions(-) Index: llvm-poolalloc/lib/PoolAllocate/PoolAllocate.cpp diff -u llvm-poolalloc/lib/PoolAllocate/PoolAllocate.cpp:1.120 llvm-poolalloc/lib/PoolAllocate/PoolAllocate.cpp:1.121 --- llvm-poolalloc/lib/PoolAllocate/PoolAllocate.cpp:1.120 Wed May 18 14:56:28 2005 +++ llvm-poolalloc/lib/PoolAllocate/PoolAllocate.cpp Thu Dec 22 10:32:54 2005 @@ -34,6 +34,9 @@ #include "llvm/Support/Timer.h" using namespace llvm; using namespace PA; +#ifdef SAFECODE +using namespace CUA; +#endif const Type *PoolAllocate::PoolDescPtrTy = 0; @@ -73,13 +76,27 @@ } void PoolAllocate::getAnalysisUsage(AnalysisUsage &AU) const { +#ifdef SAFECODE + AU.addRequired(); +#endif AU.addRequired(); AU.addPreserved(); +#ifdef SAFECODE + //Dinakar for preserving the pool information across passes + AU.setPreservesAll(); +#endif +#ifdef BOUNDS_CHECK + //Dinakar hack for preserving the pool information across passes + AU.setPreservesAll(); +#endif AU.addRequired(); } bool PoolAllocate::runOnModule(Module &M) { if (M.begin() == M.end()) return false; +#ifdef SAFECODE + CUAPass = &getAnalysis(); +#endif CurModule = &M; ECGraphs = &getAnalysis(); // folded inlined CBU graphs @@ -149,7 +166,11 @@ if (VoidPtrTy == 0) { // NOTE: If these are changed, make sure to update PoolOptimize.cpp as well! VoidPtrTy = PointerType::get(Type::SByteTy); +#ifdef SAFECODE + PoolDescType = ArrayType::get(VoidPtrTy, 50); +#else PoolDescType = ArrayType::get(VoidPtrTy, 16); +#endif PoolDescPtrTy = PointerType::get(PoolDescType); } @@ -180,7 +201,16 @@ // Get the poolfree function. PoolFree = CurModule->getOrInsertFunction("poolfree", Type::VoidTy, - PoolDescPtrTy, VoidPtrTy, 0); + PoolDescPtrTy, VoidPtrTy, 0); +#ifdef SAFECODE + //Get the poolregister function + PoolRegister = CurModule->getOrInsertFunction("poolregister", Type::VoidTy, + PoolDescPtrTy, Type::UIntTy, VoidPtrTy, 0); +#endif +#ifdef BOUNDS_CHECK + PoolRegister = CurModule->getOrInsertFunction("poolregister", Type::VoidTy, + PoolDescPtrTy, VoidPtrTy, Type::UIntTy, 0); +#endif } static void getCallsOf(Function *F, std::vector &Calls) { @@ -270,7 +300,7 @@ for (hash_set::iterator I = MarkedNodes.begin(), E = MarkedNodes.end(); I != E; ) { const DSNode *N = *I++; - if ((!N->isHeapNode() && !PassAllArguments) || NodesFromGlobals.count(N)) + if ((!(1 || N->isHeapNode()) && !PassAllArguments) || NodesFromGlobals.count(N)) MarkedNodes.erase(N); } } @@ -343,7 +373,11 @@ // Map the existing arguments of the old function to the corresponding // arguments of the new function, and copy over the names. +#ifdef SAFECODE + std::map &ValueMap = FI.ValueMap; +#else std::map ValueMap; +#endif for (Function::arg_iterator I = F.arg_begin(); NI != New->arg_end(); ++I, ++NI) { ValueMap[I] = NI; @@ -387,7 +421,15 @@ for (hash_set::iterator I = GlobalHeapNodes.begin(), E = GlobalHeapNodes.end(); I != E; ) { hash_set::iterator Last = I++; - if (!(*Last)->isHeapNode()) +#ifndef SAFECODE +#ifndef BOUNDS_CHECK + // if (!(*Last)->isHeapNode()); + // GlobalHeapNodes.erase(Last); +#endif +#endif + const DSNode *tmp = *Last; + // std::cerr << "test \n"; + if (!(tmp->isHeapNode() || tmp->isArray())) GlobalHeapNodes.erase(Last); } @@ -409,8 +451,11 @@ CurHeuristic->AssignToPools(NodesToPA, 0, GG, ResultPools); BasicBlock::iterator InsertPt = MainFunc->getEntryBlock().begin(); +#ifndef SAFECODE +#ifndef BOUNDS_CHECK while (isa(InsertPt)) ++InsertPt; - +#endif +#endif // Perform all global assignments as specified. for (unsigned i = 0, e = ResultPools.size(); i != e; ++i) { Heuristic::OnePool &Pool = ResultPools[i]; @@ -490,8 +535,11 @@ std::set UnallocatedNodes(NodesToPA.begin(), NodesToPA.end()); BasicBlock::iterator InsertPoint = F.front().begin(); +#ifndef SAFECODE +#ifndef BOUNDS_CHECK while (isa(InsertPoint)) ++InsertPoint; - +#endif +#endif // Is this main? If so, make the pool descriptors globals, not automatic // vars. bool IsMain = F.getName() == "main" && F.hasExternalLinkage(); @@ -562,7 +610,11 @@ for (DSGraph::node_iterator I = G.node_begin(), E = G.node_end(); I != E;++I){ // We only need to make a pool if there is a heap object in it... DSNode *N = I; - if (N->isHeapNode()) + if ( +#ifdef BOUNDS_CHECK + (N->isArray() || +#endif + (N->isHeapNode())) if (GlobalsGraphNodeMapping.count(N)) { // If it is a global pool, set up the pool descriptor appropriately. DSNode *GGN = GlobalsGraphNodeMapping[N].getNode(); From dhurjati at cs.uiuc.edu Thu Dec 22 10:33:41 2005 From: dhurjati at cs.uiuc.edu (Dinakar Dhurjati) Date: Thu, 22 Dec 2005 10:33:41 -0600 Subject: [llvm-commits] CVS: llvm-poolalloc/lib/PoolAllocate/TransformFunctionBody.cpp Message-ID: <200512221633.KAA13445@zion.cs.uiuc.edu> Changes in directory llvm-poolalloc/lib/PoolAllocate: TransformFunctionBody.cpp updated: 1.47 -> 1.48 --- Log message: Changes for SAFECode --- Diffs of the changes: (+75 -4) TransformFunctionBody.cpp | 79 +++++++++++++++++++++++++++++++++++++++++++--- 1 files changed, 75 insertions(+), 4 deletions(-) Index: llvm-poolalloc/lib/PoolAllocate/TransformFunctionBody.cpp diff -u llvm-poolalloc/lib/PoolAllocate/TransformFunctionBody.cpp:1.47 llvm-poolalloc/lib/PoolAllocate/TransformFunctionBody.cpp:1.48 --- llvm-poolalloc/lib/PoolAllocate/TransformFunctionBody.cpp:1.47 Tue Dec 6 12:06:43 2005 +++ llvm-poolalloc/lib/PoolAllocate/TransformFunctionBody.cpp Thu Dec 22 10:33:29 2005 @@ -60,6 +60,7 @@ void visitInstruction(Instruction &I); void visitMallocInst(MallocInst &MI); + void visitAllocaInst(AllocaInst &MI); void visitCallocCall(CallSite CS); void visitReallocCall(CallSite CS); void visitMemAlignCall(CallSite CS); @@ -149,6 +150,7 @@ // Insert a call to poolalloc Value *PH = getPoolHandle(I); + Instruction *V = new CallInst(PAInfo.PoolAlloc, make_vector(PH, Size, 0), Name, I); @@ -187,6 +189,7 @@ void FuncTransform::visitMallocInst(MallocInst &MI) { // Get the pool handle for the node that this contributes to... Value *PH = getPoolHandle(&MI); + if (PH == 0 || isa(PH)) return; TargetData &TD = PAInfo.getAnalysis(); @@ -196,8 +199,57 @@ if (MI.isArrayAllocation()) AllocSize = BinaryOperator::create(Instruction::Mul, AllocSize, MI.getOperand(0), "sizetmp", &MI); +#ifdef SAFECODE + const MallocInst *originalMalloc = &MI; + if (FI.NewToOldValueMap.count(&MI)) { + originalMalloc = cast(FI.NewToOldValueMap[&MI]); + } + //Dinakar to test stack safety & array safety + if (PAInfo.CUAPass->ArrayMallocs.find(originalMalloc) == + PAInfo.CUAPass->ArrayMallocs.end()) { + TransformAllocationInstr(&MI, AllocSize); + } else { + AllocaInst *AI = new AllocaInst(MI.getType()->getElementType(), MI.getArraySize(), MI.getName(), MI.getNext()); + MI.replaceAllUsesWith(AI); + MI.getParent()->getInstList().erase(&MI); + Value *Casted = AI; + Instruction *aiNext = AI->getNext(); + if (AI->getType() != PointerType::get(Type::SByteTy)) + Casted = new CastInst(AI, PointerType::get(Type::SByteTy), + AI->getName()+".casted",aiNext); + + Instruction *V = new CallInst(PAInfo.PoolRegister, + make_vector(PH, AllocSize, Casted, 0), "", aiNext); + AddPoolUse(*V, PH, PoolUses); + } +#else + TransformAllocationInstr(&MI, AllocSize); +#endif +} - TransformAllocationInstr(&MI, AllocSize); +void FuncTransform::visitAllocaInst(AllocaInst &MI) { +#ifdef BOUNDS_CHECK + // Get the pool handle for the node that this contributes to... + DSNode *Node = getDSNodeHFor(&MI).getNode(); + if (Node->isArray()) { + Value *PH = getPoolHandle(&MI); + if (PH == 0 || isa(PH)) return; + TargetData &TD = PAInfo.getAnalysis(); + Value *AllocSize = + ConstantUInt::get(Type::UIntTy, TD.getTypeSize(MI.getAllocatedType())); + + if (MI.isArrayAllocation()) + AllocSize = BinaryOperator::create(Instruction::Mul, AllocSize, + MI.getOperand(0), "sizetmp", &MI); + + // TransformAllocationInstr(&MI, AllocSize); + Instruction *Casted = new CastInst(&MI, PointerType::get(Type::SByteTy), + MI.getName()+".casted", MI.getNext()); + Instruction *V = new CallInst(PAInfo.PoolRegister, + make_vector(PH, Casted, AllocSize, 0), "", Casted->getNext()); + AddPoolUse(*V, PH, PoolUses); + } +#endif } @@ -536,10 +588,29 @@ if (DSNode *LocalNode = NodeMapping[ArgNodes[i]].getNode()) if (FI.PoolDescriptors.count(LocalNode)) ArgVal = FI.PoolDescriptors.find(LocalNode)->second; -#if 0 - if (isa(ArgVal) && cast(ArgVal)->isNullValue()) - std::cerr << "WARNING: NULL POOL ARGUMENTS ARE PASSED IN!\n"; + if (isa(ArgVal) && cast(ArgVal)->isNullValue()) { +#ifdef BOUNDS_CHECK + if (ArgNodes[i]->isArray()) { #endif + if (1) { + //Dinakar we need pooldescriptors for allocas in the callee if it escapes + BasicBlock::iterator InsertPt = TheCall->getParent()->getParent()->front().begin(); + Type *VoidPtrTy = PointerType::get(Type::SByteTy); + ArgVal = new AllocaInst(ArrayType::get(VoidPtrTy, 16), 0, "PD", InsertPt); + Value *ElSize = ConstantUInt::get(Type::UIntTy,0); + Value *Align = ConstantUInt::get(Type::UIntTy,0); + new CallInst(PAInfo.PoolInit, make_vector(ArgVal, ElSize, Align, 0),"", TheCall); + //UGLY HACK this won't release some memory + if (!isa(TheCall)) + new CallInst(PAInfo.PoolDestroy, make_vector(ArgVal, 0), "", + TheCall->getNext()); + } + //probably need to update DSG + // std::cerr << "WARNING: NULL POOL ARGUMENTS ARE PASSED IN!\n"; +#ifdef BOUNDS_CHECK + } +#endif + } Args.push_back(ArgVal); } From dhurjati at cs.uiuc.edu Thu Dec 22 10:34:32 2005 From: dhurjati at cs.uiuc.edu (Dinakar Dhurjati) Date: Thu, 22 Dec 2005 10:34:32 -0600 Subject: [llvm-commits] CVS: llvm-poolalloc/runtime/SafePoolAllocator/ Message-ID: <200512221634.KAA13473@zion.cs.uiuc.edu> Changes in directory llvm-poolalloc/runtime/SafePoolAllocator: --- Log message: Directory /home/vadve/shared/PublicCVS/llvm-poolalloc/runtime/SafePoolAllocator added to the repository --- Diffs of the changes: (+0 -0) 0 files changed From dhurjati at cs.uiuc.edu Thu Dec 22 10:38:08 2005 From: dhurjati at cs.uiuc.edu (Dinakar Dhurjati) Date: Thu, 22 Dec 2005 10:38:08 -0600 Subject: [llvm-commits] CVS: llvm-poolalloc/runtime/BoundsCheckAllocator/ Message-ID: <200512221638.KAA13668@zion.cs.uiuc.edu> Changes in directory llvm-poolalloc/runtime/BoundsCheckAllocator: --- Log message: Directory /home/vadve/shared/PublicCVS/llvm-poolalloc/runtime/BoundsCheckAllocator added to the repository --- Diffs of the changes: (+0 -0) 0 files changed From dhurjati at cs.uiuc.edu Thu Dec 22 10:40:56 2005 From: dhurjati at cs.uiuc.edu (Dinakar Dhurjati) Date: Thu, 22 Dec 2005 10:40:56 -0600 Subject: [llvm-commits] CVS: llvm-poolalloc/runtime/BoundsCheckAllocator/PoolAllocator.h Message-ID: <200512221640.KAA13766@zion.cs.uiuc.edu> Changes in directory llvm-poolalloc/runtime/BoundsCheckAllocator: PoolAllocator.h added (r1.1) --- Log message: *** empty log message *** --- Diffs of the changes: (+235 -0) PoolAllocator.h | 235 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 235 insertions(+) Index: llvm-poolalloc/runtime/BoundsCheckAllocator/PoolAllocator.h diff -c /dev/null llvm-poolalloc/runtime/BoundsCheckAllocator/PoolAllocator.h:1.1 *** /dev/null Thu Dec 22 10:40:54 2005 --- llvm-poolalloc/runtime/BoundsCheckAllocator/PoolAllocator.h Thu Dec 22 10:40:44 2005 *************** *** 0 **** --- 1,235 ---- + //===- PoolAllocator.h - Pool allocator runtime interface file --*- C++ -*-===// + // + // The LLVM Compiler Infrastructure + // + // This file was developed by the LLVM research group and is distributed under + // the University of Illinois Open Source License. See LICENSE.TXT for details. + // + //===----------------------------------------------------------------------===// + // + // This file defines the interface which is implemented by the LLVM pool + // allocator runtime library. + // + // Note: this version uses splay data structure to note object sizes and + // uses it to do bounds checking like Jones-Kelley + // + //===----------------------------------------------------------------------===// + + #ifndef POOLALLOCATOR_RUNTIME_H + #define POOLALLOCATOR_RUNTIME_H + + #include + #include "splay.h" + #include + #include + + template + struct PoolSlab; + template + struct FreedNodeHeader; + + // NormalPoolTraits - This describes normal pool allocation pools, which can + // address the entire heap, and are made out of multiple chunks of memory. The + // object header is a full machine word, and pointers into the heap are native + // pointers. + struct NormalPoolTraits { + typedef unsigned long NodeHeaderType; + enum { + UseLargeArrayObjects = 1, + CanGrowPool = 1, + }; + + // Pointers are just pointers. + typedef FreedNodeHeader* FreeNodeHeaderPtrTy; + + static const char *getSuffix() { return ""; } + + /// DerefFNHPtr - Given an index into the pool, return a pointer to the + /// FreeNodeHeader object. + static FreedNodeHeader* + IndexToFNHPtr(FreeNodeHeaderPtrTy P, void *PoolBase) { + return P; + } + + static FreeNodeHeaderPtrTy + FNHPtrToIndex(FreedNodeHeader* FNHP, void *PoolBase) { + return FNHP; + } + }; + + + // CompressedPoolTraits - This describes a statically pointer compressed pool, + // which is known to be <= 2^32 bytes in size (even on a 64-bit machine), and is + // made out of a single contiguous block. The meta-data to represent the pool + // uses 32-bit indexes from the start of the pool instead of full pointers to + // decrease the minimum object size. + struct CompressedPoolTraits { + typedef unsigned NodeHeaderType; + + enum { + UseLargeArrayObjects = 0, + CanGrowPool = 0, + }; + + // Represent pointers with indexes from the pool base. + typedef unsigned FreeNodeHeaderPtrTy; + + static const char *getSuffix() { return "_pc"; } + + /// DerefFNHPtr - Given an index into the pool, return a pointer to the + /// FreeNodeHeader object. + static FreedNodeHeader* + IndexToFNHPtr(FreeNodeHeaderPtrTy P, void *PoolBase) { + return (FreedNodeHeader*)((char*)PoolBase + P); + } + + static FreeNodeHeaderPtrTy + FNHPtrToIndex(FreedNodeHeader* FNHP, void *PoolBase) { + assert(FNHP && PoolBase && "Can't handle null FHNP!"); + return (char*)FNHP - (char*)PoolBase; + } + }; + + + // NodeHeader - Each block of memory is preceeded in the the pool by one of + // these headers. + template + struct NodeHeader { + typename PoolTraits::NodeHeaderType Size; + }; + + + // When objects are on the free list, we pretend they have this header. + template + struct FreedNodeHeader { + // NormalHeader - This is the normal node header that is on allocated or free + // blocks. + NodeHeader Header; + + // Next - The next object in the free list. + typename PoolTraits::FreeNodeHeaderPtrTy Next; + + // Prev - The node that points to this node on the free list. This is null + // if it is the first node in one of the two free lists. + typename PoolTraits::FreeNodeHeaderPtrTy Prev; + }; + + + // Large Arrays are passed on to directly malloc, and are not necessarily page + // aligned. These arrays are marked by setting the object size preheader to ~1. + // LargeArrays are on their own list to allow for efficient deletion. + struct LargeArrayHeader { + LargeArrayHeader **Prev, *Next; + + // Size - This contains the size of the object. + unsigned long Size; + + // Marker: this is the ObjectSize marker which MUST BE THE LAST ELEMENT of + // this header! + unsigned long Marker; + + void UnlinkFromList() { + *Prev = Next; + if (Next) + Next->Prev = Prev; + } + + void LinkIntoList(LargeArrayHeader **List) { + Next = *List; + if (Next) + Next->Prev = &Next; + *List = this; + Prev = List; + } + }; + + + template + struct PoolTy { + // Slabs - the list of slabs in this pool. NOTE: This must remain the first + // memory of this structure for the pointer compression pass. + PoolSlab *Slabs; + + // The free node lists for objects of various sizes. + typename PoolTraits::FreeNodeHeaderPtrTy ObjFreeList; + typename PoolTraits::FreeNodeHeaderPtrTy OtherFreeList; + + // Alignment - The required alignment of allocations the pool in bytes. + unsigned Alignment; + + // The declared size of the pool, just kept for the record. + unsigned DeclaredSize; + + // LargeArrays - A doubly linked list of large array chunks, dynamically + // allocated with malloc. + LargeArrayHeader *LargeArrays; + + // The size to allocate for the next slab. + unsigned AllocSize; + + // NumObjects - the number of poolallocs for this pool. + unsigned NumObjects; + + // BytesAllocated - The total number of bytes ever allocated from this pool. + // Together with NumObjects, allows us to calculate average object size. + unsigned BytesAllocated; + + Splay *splay; + }; + + extern "C" { + void poolinit(PoolTy *Pool, + unsigned DeclaredSize, unsigned ObjAlignment); + void poolmakeunfreeable(PoolTy *Pool); + void pooldestroy(PoolTy *Pool); + void *poolalloc(PoolTy *Pool, unsigned NumBytes); + void *poolrealloc(PoolTy *Pool, + void *Node, unsigned NumBytes); + void *poolmemalign(PoolTy *Pool, + unsigned Alignment, unsigned NumBytes); + void poolfree(PoolTy *Pool, void *Node); + void poolregister(PoolTy *Pool, void *Node, unsigned size); + + /// poolobjsize - Return the size of the object at the specified address, in + /// the specified pool. Note that this cannot be used in normal cases, as it + /// is completely broken if things land in the system heap. Perhaps in the + /// future. :( + /// + unsigned poolobjsize(PoolTy *Pool, void *Node); + + // Bump pointer pool library. This is a pool implementation that does not + // support frees or reallocs to the pool. As such, it can be much more + // efficient and simpler than a general pool implementation. + void poolinit_bp(PoolTy *Pool, unsigned ObjAlignment); + void *poolalloc_bp(PoolTy *Pool, unsigned NumBytes); + void pooldestroy_bp(PoolTy *Pool); + + + // Pointer Compression runtime library. Most of these are just wrappers + // around the normal pool routines. + void *poolinit_pc(PoolTy *Pool, unsigned NodeSize, + unsigned ObjAlignment); + void pooldestroy_pc(PoolTy *Pool); + unsigned long long poolalloc_pc(PoolTy *Pool, + unsigned NumBytes); + void poolfree_pc(PoolTy *Pool, unsigned long long Node); + //void *poolmemalign_pc(PoolTy *Pool, unsigned Alignment, unsigned NumBytes); + + + // Access tracing runtime library support. + void poolaccesstraceinit(void); + void poolaccesstrace(void *Ptr, void *PD); + + //Dinakar for run-time bounds checking + void* poolcheckslow(PoolTy *A, void *B, void *C); + + // bool poolcheck1(Splay *splay, void *Node); + void *getreferrent(PoolTy *Pool, void *base) __attribute__ ((const)); + // void poolcheck(PoolTy *Pool, void *Ptr, void *referrent); + + extern void * pCache1, *pCache2; + extern int turn; + } + + #endif + From dhurjati at cs.uiuc.edu Thu Dec 22 10:43:05 2005 From: dhurjati at cs.uiuc.edu (Dinakar Dhurjati) Date: Thu, 22 Dec 2005 10:43:05 -0600 Subject: [llvm-commits] CVS: llvm-poolalloc/runtime/BoundsCheckAllocator/Makefile Message-ID: <200512221643.KAA13825@zion.cs.uiuc.edu> Changes in directory llvm-poolalloc/runtime/BoundsCheckAllocator: Makefile added (r1.1) --- Log message: *** empty log message *** --- Diffs of the changes: (+8 -0) Makefile | 8 ++++++++ 1 files changed, 8 insertions(+) Index: llvm-poolalloc/runtime/BoundsCheckAllocator/Makefile diff -c /dev/null llvm-poolalloc/runtime/BoundsCheckAllocator/Makefile:1.1 *** /dev/null Thu Dec 22 10:43:04 2005 --- llvm-poolalloc/runtime/BoundsCheckAllocator/Makefile Thu Dec 22 10:42:54 2005 *************** *** 0 **** --- 1,8 ---- + LEVEL = ../.. + SHARED_LIBRARY=1 + LIBRARYNAME=poolalloc_splay_rt + + CXXFLAGS += -fno-exceptions + + include $(LEVEL)/Makefile.common + From dhurjati at cs.uiuc.edu Thu Dec 22 10:46:58 2005 From: dhurjati at cs.uiuc.edu (Dinakar Dhurjati) Date: Thu, 22 Dec 2005 10:46:58 -0600 Subject: [llvm-commits] CVS: llvm-poolalloc/runtime/BoundsCheckAllocator/splay.h Message-ID: <200512221646.KAA13857@zion.cs.uiuc.edu> Changes in directory llvm-poolalloc/runtime/BoundsCheckAllocator: splay.h added (r1.1) --- Log message: *** empty log message *** --- Diffs of the changes: (+48 -0) splay.h | 48 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 48 insertions(+) Index: llvm-poolalloc/runtime/BoundsCheckAllocator/splay.h diff -c /dev/null llvm-poolalloc/runtime/BoundsCheckAllocator/splay.h:1.1 *** /dev/null Thu Dec 22 10:46:56 2005 --- llvm-poolalloc/runtime/BoundsCheckAllocator/splay.h Thu Dec 22 10:46:46 2005 *************** *** 0 **** --- 1,48 ---- + // Note: This file is obtained from + // http://www.cs.utk.edu/~cs140/spring-2005/notes/Splay/ + // FIXME: This may not be the most efficient version of splay implementation + // This may be updated with a different splay implementation in near future + #ifndef _SPLAY_ + #define SPLAY + + typedef unsigned long Jval ; + + /* Node identities */ + + #define SPLAY_SENTINEL 0 + #define SPLAY_OTHER 1 + + typedef struct splay { + Jval key; + Jval val; + int is_sentinel; + struct splay *left; + struct splay *right; + struct splay *flink; + struct splay *blink; + struct splay *parent; + } Splay; + + extern "C" { + Splay *new_splay(); + void free_splay(Splay *); + Splay *splay_insert_ptr(Splay *tree, unsigned long key, Jval val); + Splay *splay_find_ptr(Splay *tree, unsigned long key); + Splay *splay_find_gte_ptr(Splay *tree, unsigned long key, int *found); + + Splay *splay_root(Splay *tree); + Splay *splay_first(Splay *tree); + Splay *splay_last(Splay *tree); + Splay *splay_next(Splay *node); + Splay *splay_prev(Splay *node); + Splay *splay_nil(Splay *tree); + + void splay_delete_node(Splay *node); + }; + + #define splay_traverse(ptr, list) \ + for (ptr = splay_first(list); ptr != splay_nil(list); ptr = splay_next(ptr)) + #define splay_rtraverse(ptr, list) \ + for (ptr = splay_last(list); ptr != splay_nil(list); ptr = splay_prev(ptr)) + + #endif From dhurjati at cs.uiuc.edu Thu Dec 22 10:47:33 2005 From: dhurjati at cs.uiuc.edu (Dinakar Dhurjati) Date: Thu, 22 Dec 2005 10:47:33 -0600 Subject: [llvm-commits] CVS: llvm-poolalloc/runtime/BoundsCheckAllocator/splay.cpp Message-ID: <200512221647.KAA13868@zion.cs.uiuc.edu> Changes in directory llvm-poolalloc/runtime/BoundsCheckAllocator: splay.cpp added (r1.1) --- Log message: *** empty log message *** --- Diffs of the changes: (+322 -0) splay.cpp | 322 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 322 insertions(+) Index: llvm-poolalloc/runtime/BoundsCheckAllocator/splay.cpp diff -c /dev/null llvm-poolalloc/runtime/BoundsCheckAllocator/splay.cpp:1.1 *** /dev/null Thu Dec 22 10:47:32 2005 --- llvm-poolalloc/runtime/BoundsCheckAllocator/splay.cpp Thu Dec 22 10:47:21 2005 *************** *** 0 **** --- 1,322 ---- + // Note: This file is obtained from + // http://www.cs.utk.edu/~cs140/spring-2005/notes/Splay/ + // FIXME: This may not be the most efficient version of splay implementation + // This may be updated with a different splay implementation in near future + #include + #include "splay.h" + #include + void rotate(Splay *node) + { + Splay *parent, *grandparent; + + if (node->parent->is_sentinel) return; + + parent = node->parent; + grandparent = parent->parent; + + if (parent->left == node) { + parent->left = node->right; + if (parent->left != NULL) parent->left->parent = parent; + node->right = parent; + } else if (parent->right == node) { + parent->right = node->left; + if (parent->right != NULL) parent->right->parent = parent; + node->left = parent; + } else { + fprintf(stderr, "rotate: error: parent's children are not right\n"); + exit(1); + } + + parent->parent = node; + node->parent = grandparent; + + if (grandparent->is_sentinel) { + grandparent->parent = node; + } else if (grandparent->left == parent) { + grandparent->left = node; + } else if (grandparent->right == parent) { + grandparent->right = node; + } else { + fprintf(stderr, "rotate: error: grandparent's children are not right\n"); + exit(1); + } + } + + void splay(Splay *node) + { + Splay *parent, *grandparent; + + if (node->is_sentinel) return; + + while(1) { + if (node->parent->is_sentinel) return; + + parent = node->parent; + grandparent = parent->parent; + + /* If the node's parent is the root of the tree, do one rotation */ + + if (grandparent->is_sentinel) { + rotate(node); + + /* If we have a zig-zig, then rotate my parent, then rotate me */ + + } else if ((parent->left == node && grandparent->left == parent) || + (parent->right == node && grandparent->right == parent)) { + rotate(parent); + rotate(node); + + /* If we have a zig-zag, then rotate me twice */ + + } else { + rotate(node); + rotate(node); + } + } + } + + Splay *new_splay() + { + Splay *tree; + + tree = (Splay *) malloc(sizeof(struct splay)); + tree->key = 0; + tree->val = 0; + tree->is_sentinel = 1; + tree->flink = tree; + tree->blink = tree; + tree->left = NULL; + tree->right = NULL; + tree->parent = NULL; + return tree; + } + + Splay *splay_root(Splay *tree) + { + return tree->parent; + } + + Splay *splay_first(Splay *tree) + { + return tree->flink; + } + + Splay *splay_last(Splay *tree) + { + return tree->blink; + } + + Splay *splay_next(Splay *node) + { + return node->flink; + } + + Splay *splay_prev(Splay *node) + { + return node->blink; + } + + Splay *splay_nil(Splay *tree) + { + return tree; + } + + void free_splay(Splay *tree) + { + Splay *ptr; + + while (1) { + ptr = splay_first(tree); + if (!ptr->is_sentinel) { + splay_delete_node(ptr); + } else { + free(ptr); + return; + } + } + } + + Splay *splay_find_nearest_ptr(Splay *tree, unsigned long key, int *cmpval) + { + Splay *s, *last; + int cmp; + + last = tree; + s = splay_root(tree); + cmp = 1; + + while(s != NULL) { + last = s; + if (key == s->key) { + *cmpval = 0; + return s; + } else if (key < (s->key)) { + s = s->left; + cmp = -1; + } else { + if (key < (s->val + s->key)) { + *cmpval = 0; + return s; + } + s = s->right; + cmp = 1; + } + } + + *cmpval = cmp; + return last; + } + + + Splay *splay_find_ptr(Splay *tree, unsigned long key) + { + int cmpval; + Splay *s; + + s = splay_find_nearest_ptr(tree, key, &cmpval); + splay(s); + if (cmpval == 0) return s; else return NULL; + } + + + Splay *splay_insert(Splay *tree, Jval key, Jval val, Splay *parent, int cmpval) + { + Splay *s; + + s = (Splay *) malloc(sizeof(struct splay)); + s->is_sentinel = 0; + s->parent = parent; + s->left = NULL; + s->right = NULL; + s->key = key; + s->val = val; + + /* Set the parent's correct child pointer. The only + subtle case here is when the key is already in + the tree -- then we need to find a leaf node + to use as a parent */ + + /* When we're done here, parent should point to the + new node's successor in the linked list */ + + if (parent->is_sentinel) { + parent->parent = s; + } else { + if (cmpval == 0) { /* If the key is already in the + tree, try to insert a new one as the + node's right child. If the node already + has a right child, then try to insert the + new one as a left child. If there is already + a left child, then go to parent-flink and + insert the node as its left child. */ + if (parent->right == NULL) { + cmpval = 1; + } else if (parent->left == NULL) { + cmpval = -1; + } else { + parent = parent->flink; + s->parent = parent; + cmpval = -1; + } + } + if (cmpval > 0) { /* Insert as right child */ + if (parent->right != NULL) { + fprintf(stderr, "splay_insert error: parent->right != NULL"); + exit(1); + } + parent->right = s; + parent = parent->flink; + } else { + if (parent->left != NULL) { + fprintf(stderr, "splay_insert error: parent->left != NULL"); + exit(1); + } + parent->left = s; + } + } + + s->flink = parent; + s->blink = parent->blink; + s->flink->blink = s; + s->blink->flink = s; + splay(s); + return s; + } + + Splay *splay_insert_ptr(Splay *tree, unsigned long key, Jval val) + { + Splay *parent, *s; + int cmpval; + + parent = splay_find_nearest_ptr(tree, key, &cmpval); + return splay_insert(tree, key, val, parent, cmpval); + } + + extern void splay_delete_node(Splay *node) + { + Splay *left, *right, *tree, *newroot; + + splay(node); + + tree = node->parent; + + left = node->left; + right = node->right; + newroot = node->flink; + + node->flink->blink = node->blink; + node->blink->flink = node->flink; + + free(node); + + if (right == NULL && left == NULL) { + tree->parent = NULL; + } else if (right == NULL) { + tree->parent = left; + left->parent = tree; + } else if (left == NULL) { + tree->parent = right; + right->parent = tree; + } else { + tree->parent = right; + right->parent = tree; + splay(newroot); + newroot->left = left; + left->parent = newroot; + } + } + Splay *finish_gte(int cmpval, Splay *s, int *found) + { + + if (cmpval == 0) { + *found = 1; + return s; + } else if (cmpval < 0) { + *found = 0; + return s; + } else { + *found = 1; + return s->flink; + } + } + /* + Splay *splay_find_gte_str(Splay *tree, char *key, int *found) + { + int cmpval; + Splay *s; + + s = splay_find_nearest_str(tree, key, &cmpval); + return finish_gte(cmpval, s, found); + } + */ + + Splay *splay_find_gte_ptr(Splay *tree, unsigned long key, int *found) + { + int cmpval; + Splay *s; + + s = splay_find_nearest_ptr(tree, key, &cmpval); + return finish_gte(cmpval, s, found); + } + + From dhurjati at cs.uiuc.edu Thu Dec 22 10:49:04 2005 From: dhurjati at cs.uiuc.edu (Dinakar Dhurjati) Date: Thu, 22 Dec 2005 10:49:04 -0600 Subject: [llvm-commits] CVS: llvm-poolalloc/runtime/BoundsCheckAllocator/PoolAllocator.cpp Message-ID: <200512221649.KAA13931@zion.cs.uiuc.edu> Changes in directory llvm-poolalloc/runtime/BoundsCheckAllocator: PoolAllocator.cpp added (r1.1) --- Log message: *** empty log message *** --- Diffs of the changes: (+1093 -0) PoolAllocator.cpp | 1093 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 1093 insertions(+) Index: llvm-poolalloc/runtime/BoundsCheckAllocator/PoolAllocator.cpp diff -c /dev/null llvm-poolalloc/runtime/BoundsCheckAllocator/PoolAllocator.cpp:1.1 *** /dev/null Thu Dec 22 10:49:02 2005 --- llvm-poolalloc/runtime/BoundsCheckAllocator/PoolAllocator.cpp Thu Dec 22 10:48:52 2005 *************** *** 0 **** --- 1,1093 ---- + //===- PoolAllocator.cpp - Simple free-list based pool allocator ----------===// + // + // The LLVM Compiler Infrastructure + // + // This file was developed by the LLVM research group and is distributed under + // the University of Illinois Open Source License. See LICENSE.TXT for details. + // + //===----------------------------------------------------------------------===// + // + // This file is one possible implementation of the LLVM pool allocator runtime + // library. + // + // FIXME: + // The pointer compression functions are not thread safe. + //===----------------------------------------------------------------------===// + + #include "PoolAllocator.h" + #include "poolalloc/MMAPSupport.h" + #include + #include + #include + + typedef long intptr_t; + typedef unsigned long uintptr_t; + + // Performance tweaking macros. + #define INITIAL_SLAB_SIZE 4096 + #define LARGE_SLAB_SIZE 4096 + + #ifndef NDEBUG + // Configuration macros. Define up to one of these. + #define PRINT_NUM_POOLS // Print use dynamic # pools info + //#define PRINT_POOLDESTROY_STATS // When pools are destroyed, print stats + //#define PRINT_POOL_TRACE // Print a full trace + #define ENABLE_POOL_IDS // PID for access/pool traces + + + // ALWAYS_USE_MALLOC_FREE - Make poolalloc/free always call malloc/free. Note + // that if the poolfree optimization is in use that this will cause memory + // leaks! + //#define ALWAYS_USE_MALLOC_FREE + #endif + + //===----------------------------------------------------------------------===// + // Pool Debugging stuff. + //===----------------------------------------------------------------------===// + + #if defined(ALWAYS_USE_MALLOC_FREE) + #define DO_IF_FORCE_MALLOCFREE(x) x + #else + #define DO_IF_FORCE_MALLOCFREE(x) + #endif + + + #if !defined(PRINT_POOL_TRACE) + #define DO_IF_TRACE(X) + #else + #define ENABLE_POOL_IDS + #define DO_IF_TRACE(X) X + #define PRINT_POOLDESTROY_STATS + #endif + + #if defined(ENABLE_POOL_IDS) + struct PoolID { + void *PD; + unsigned ID; + }; + + struct PoolID *PoolIDs = 0; + static unsigned NumLivePools = 0; + static unsigned NumPoolIDsAllocated = 0; + static unsigned CurPoolID = 0; + + static unsigned addPoolNumber(void *PD) { + if (NumLivePools == NumPoolIDsAllocated) { + NumPoolIDsAllocated = (10+NumPoolIDsAllocated)*2; + PoolIDs = (PoolID*)realloc(PoolIDs, sizeof(PoolID)*NumPoolIDsAllocated); + } + + PoolIDs[NumLivePools].PD = PD; + PoolIDs[NumLivePools].ID = ++CurPoolID; + NumLivePools++; + return CurPoolID; + } + + static unsigned getPoolNumber(void *PD) { + if (PD == 0) return ~0; + for (unsigned i = 0; i != NumLivePools; ++i) + if (PoolIDs[i].PD == PD) + return PoolIDs[i].ID; + fprintf(stderr, "INVALID/UNKNOWN POOL DESCRIPTOR: 0x%lX\n",(unsigned long)PD); + return 0; + } + + static unsigned removePoolNumber(void *PD) { + for (unsigned i = 0; i != NumLivePools; ++i) + if (PoolIDs[i].PD == PD) { + unsigned PN = PoolIDs[i].ID; + memmove(&PoolIDs[i], &PoolIDs[i+1], sizeof(PoolID)*(NumLivePools-i-1)); + --NumLivePools; + return PN; + } + fprintf(stderr, "INVALID/UNKNOWN POOL DESCRIPTOR: 0x%lX\n",(unsigned long)PD); + return 0; + } + + static void PrintPoolStats(void *Pool); + template + static void PrintLivePoolInfo() { + for (unsigned i = 0; i != NumLivePools; ++i) { + fprintf(stderr, "[%d] pool at exit ", PoolIDs[i].ID); + PrintPoolStats((PoolTy*)PoolIDs[i].PD); + } + } + #endif + + #ifdef PRINT_POOLDESTROY_STATS + #define DO_IF_POOLDESTROY_STATS(X) X + #define PRINT_NUM_POOLS + + template + static void PrintPoolStats(PoolTy *Pool) { + fprintf(stderr, + "(0x%X) BytesAlloc=%d NumObjs=%d" + " AvgObjSize=%d NextAllocSize=%d DeclaredSize=%d\n", + Pool, Pool->BytesAllocated, Pool->NumObjects, + Pool->NumObjects ? Pool->BytesAllocated/Pool->NumObjects : 0, + Pool->AllocSize, Pool->DeclaredSize); + } + + #else + #define DO_IF_POOLDESTROY_STATS(X) + #endif + + #ifdef PRINT_NUM_POOLS + static unsigned PoolCounter = 0; + static unsigned PoolsInited = 0; + + // MaxHeapSize - The maximum size of the heap ever. + static unsigned MaxHeapSize = 0; + + // CurHeapSize - The current size of the heap. + static unsigned CurHeapSize = 0; + + template + static void PoolCountPrinter() { + DO_IF_TRACE(PrintLivePoolInfo()); + fprintf(stderr, "\n\n" + "*** %d DYNAMIC POOLS INITIALIZED ***\n\n" + "*** %d DYNAMIC POOLS ALLOCATED FROM ***\n\n", + PoolsInited, PoolCounter); + fprintf(stderr, "MaxHeapSize = %fKB HeapSizeAtExit = %fKB " + "NOTE: only valid if using Heuristic=AllPools and no " + "bumpptr/realloc!\n", MaxHeapSize/1024.0, CurHeapSize/1024.0); + } + + template + static void InitPrintNumPools() { + static bool Initialized = 0; + if (!Initialized) { + Initialized = 1; + atexit(PoolCountPrinter); + } + } + + #define DO_IF_PNP(X) X + #else + #define DO_IF_PNP(X) + #endif + + //===----------------------------------------------------------------------===// + // PoolSlab implementation + //===----------------------------------------------------------------------===// + + + template + static void AddNodeToFreeList(PoolTy *Pool, + FreedNodeHeader *FreeNode) { + typename PoolTraits::FreeNodeHeaderPtrTy *FreeList; + if (FreeNode->Header.Size == Pool->DeclaredSize) + FreeList = &Pool->ObjFreeList; + else + FreeList = &Pool->OtherFreeList; + + void *PoolBase = Pool->Slabs; + + typename PoolTraits::FreeNodeHeaderPtrTy FreeNodeIdx = + PoolTraits::FNHPtrToIndex(FreeNode, PoolBase); + + FreeNode->Prev = 0; // First on the list. + FreeNode->Next = *FreeList; + *FreeList = FreeNodeIdx; + if (FreeNode->Next) + PoolTraits::IndexToFNHPtr(FreeNode->Next, PoolBase)->Prev = FreeNodeIdx; + } + + template + static void UnlinkFreeNode(PoolTy *Pool, + FreedNodeHeader *FNH) { + void *PoolBase = Pool->Slabs; + + // Make the predecessor point to our next node. + if (FNH->Prev) + PoolTraits::IndexToFNHPtr(FNH->Prev, PoolBase)->Next = FNH->Next; + else { + typename PoolTraits::FreeNodeHeaderPtrTy NodeIdx = + PoolTraits::FNHPtrToIndex(FNH, PoolBase); + + if (Pool->ObjFreeList == NodeIdx) + Pool->ObjFreeList = FNH->Next; + else { + assert(Pool->OtherFreeList == NodeIdx && + "Prev Ptr is null but not at head of free list?"); + Pool->OtherFreeList = FNH->Next; + } + } + + if (FNH->Next) + PoolTraits::IndexToFNHPtr(FNH->Next, PoolBase)->Prev = FNH->Prev; + } + + + // PoolSlab Structure - Hold multiple objects of the current node type. + // Invariants: FirstUnused <= UsedEnd + // + template + struct PoolSlab { + // Next - This link is used when we need to traverse the list of slabs in a + // pool, for example, to destroy them all. + PoolSlab *Next; + + public: + static void create(PoolTy *Pool, unsigned SizeHint); + static void *create_for_bp(PoolTy *Pool); + static void create_for_ptrcomp(PoolTy *Pool, + void *Mem, unsigned Size); + void destroy(); + + PoolSlab *getNext() const { return Next; } + }; + + // create - Create a new (empty) slab and add it to the end of the Pools list. + template + void PoolSlab::create(PoolTy *Pool, unsigned SizeHint) { + if (Pool->DeclaredSize == 0) { + unsigned Align = Pool->Alignment; + if (SizeHint < sizeof(FreedNodeHeader) - + sizeof(NodeHeader)) + SizeHint = sizeof(FreedNodeHeader) - + sizeof(NodeHeader); + SizeHint = SizeHint+sizeof(FreedNodeHeader)+(Align-1); + SizeHint = (SizeHint & ~(Align-1))-sizeof(FreedNodeHeader); + // Pool->DeclaredSize = SizeHint; + } + + unsigned Size = Pool->AllocSize; + Pool->AllocSize <<= 1; + Size = (Size+SizeHint-1) / SizeHint * SizeHint; + PoolSlab *PS = (PoolSlab*)malloc(Size+sizeof(PoolSlab) + + sizeof(NodeHeader) + + sizeof(FreedNodeHeader)); + char *PoolBody = (char*)(PS+1); + + // If the Alignment is greater than the size of the FreedNodeHeader, skip over + // some space so that the a "free pointer + sizeof(FreedNodeHeader)" is always + // aligned. + unsigned Alignment = Pool->Alignment; + if (Alignment > sizeof(FreedNodeHeader)) { + PoolBody += Alignment-sizeof(FreedNodeHeader); + Size -= Alignment-sizeof(FreedNodeHeader); + } + + // Add the body of the slab to the free list. + FreedNodeHeader *SlabBody =(FreedNodeHeader*)PoolBody; + SlabBody->Header.Size = Size; + AddNodeToFreeList(Pool, SlabBody); + + // Make sure to add a marker at the end of the slab to prevent the coallescer + // from trying to merge off the end of the page. + FreedNodeHeader *End = + (FreedNodeHeader*)(PoolBody + sizeof(NodeHeader)+ + Size); + End->Header.Size = ~0; // Looks like an allocated chunk + + // Add the slab to the list... + PS->Next = Pool->Slabs; + Pool->Slabs = PS; + } + + /// create_for_bp - This creates a slab for a bump-pointer pool. + template + void *PoolSlab::create_for_bp(PoolTy *Pool) { + unsigned Size = Pool->AllocSize; + Pool->AllocSize <<= 1; + PoolSlab *PS = (PoolSlab*)malloc(Size+sizeof(PoolSlab)); + char *PoolBody = (char*)(PS+1); + if (sizeof(PoolSlab) == 4) + PoolBody += 4; // No reason to start out unaligned. + + // Update the end pointer. + Pool->OtherFreeList = (FreedNodeHeader*)((char*)(PS+1)+Size); + + // Add the slab to the list... + PS->Next = Pool->Slabs; + Pool->Slabs = PS; + return PoolBody; + } + + /// create_for_ptrcomp - Initialize a chunk of memory 'Mem' of size 'Size' for + /// pointer compression. + template + void PoolSlab::create_for_ptrcomp(PoolTy *Pool, + void *SMem, unsigned Size) { + if (Pool->DeclaredSize == 0) { + unsigned Align = Pool->Alignment; + unsigned SizeHint = sizeof(FreedNodeHeader) - + sizeof(NodeHeader); + SizeHint = SizeHint+sizeof(FreedNodeHeader)+(Align-1); + SizeHint = (SizeHint & ~(Align-1))-sizeof(FreedNodeHeader); + Pool->DeclaredSize = SizeHint; + } + + Size -= sizeof(PoolSlab) + sizeof(NodeHeader) + + sizeof(FreedNodeHeader); + PoolSlab *PS = (PoolSlab*)SMem; + char *PoolBody = (char*)(PS+1); + + // If the Alignment is greater than the size of the NodeHeader, skip over some + // space so that the a "free pointer + sizeof(NodeHeader)" is always aligned + // for user data. + unsigned Alignment = Pool->Alignment; + if (Alignment > sizeof(NodeHeader)) { + PoolBody += Alignment-sizeof(NodeHeader); + Size -= Alignment-sizeof(NodeHeader); + } + + // Add the body of the slab to the free list. + FreedNodeHeader *SlabBody =(FreedNodeHeader*)PoolBody; + SlabBody->Header.Size = Size; + AddNodeToFreeList(Pool, SlabBody); + + // Make sure to add a marker at the end of the slab to prevent the coallescer + // from trying to merge off the end of the page. + FreedNodeHeader *End = + (FreedNodeHeader*)(PoolBody + sizeof(NodeHeader) + + Size); + End->Header.Size = ~0; // Looks like an allocated chunk + PS->Next = 0; + } + + + template + void PoolSlab::destroy() { + free(this); + } + + //===----------------------------------------------------------------------===// + // + // Bump-pointer pool allocator library implementation + // + //===----------------------------------------------------------------------===// + + void poolinit_bp(PoolTy *Pool, unsigned ObjAlignment) { + DO_IF_PNP(memset(Pool, 0, sizeof(PoolTy))); + Pool->Slabs = 0; + if (ObjAlignment < 4) ObjAlignment = __alignof(double); + Pool->AllocSize = INITIAL_SLAB_SIZE; + Pool->Alignment = ObjAlignment; + Pool->LargeArrays = 0; + Pool->ObjFreeList = 0; // This is our bump pointer. + Pool->OtherFreeList = 0; // This is our end pointer. + + unsigned PID; + #ifdef ENABLE_POOL_IDS + PID = addPoolNumber(Pool); + #endif + + DO_IF_TRACE(fprintf(stderr, "[%d] poolinit_bp(0x%X, %d)\n", + PID, Pool, ObjAlignment)); + DO_IF_PNP(++PoolsInited); // Track # pools initialized + DO_IF_PNP(InitPrintNumPools()); + } + + void *poolalloc_bp(PoolTy *Pool, unsigned NumBytes) { + DO_IF_FORCE_MALLOCFREE(return malloc(NumBytes)); + assert(Pool && "Bump pointer pool does not support null PD!"); + DO_IF_TRACE(fprintf(stderr, "[%d] poolalloc_bp(%d) -> ", + getPoolNumber(Pool), NumBytes)); + DO_IF_PNP(if (Pool->NumObjects == 0) ++PoolCounter); // Track # pools. + + if (NumBytes >= LARGE_SLAB_SIZE) + goto LargeObject; + + DO_IF_PNP(++Pool->NumObjects); + DO_IF_PNP(Pool->BytesAllocated += NumBytes); + + if (NumBytes < 1) NumBytes = 1; + + uintptr_t Alignment; + char *BumpPtr, *EndPtr; + Alignment = Pool->Alignment-1; + BumpPtr = (char*)Pool->ObjFreeList; // Get our bump pointer. + EndPtr = (char*)Pool->OtherFreeList; // Get our end pointer. + + TryAgain: + // Align the bump pointer to the required boundary. + BumpPtr = (char*)(intptr_t((BumpPtr+Alignment)) & ~Alignment); + + if (BumpPtr + NumBytes < EndPtr) { + void *Result = BumpPtr; + // Update bump ptr. + Pool->ObjFreeList = (FreedNodeHeader*)(BumpPtr+NumBytes); + DO_IF_TRACE(fprintf(stderr, "%p\n", Result)); + return Result; + } + + BumpPtr = (char*)PoolSlab::create_for_bp(Pool); + EndPtr = (char*)Pool->OtherFreeList; // Get our updated end pointer. + goto TryAgain; + + LargeObject: + // Otherwise, the allocation is a large array. Since we're not going to be + // able to help much for this allocation, simply pass it on to malloc. + LargeArrayHeader *LAH = (LargeArrayHeader*)malloc(sizeof(LargeArrayHeader) + + NumBytes); + LAH->Size = NumBytes; + LAH->Marker = ~0U; + LAH->LinkIntoList(&Pool->LargeArrays); + DO_IF_TRACE(fprintf(stderr, "%p [large]\n", LAH+1)); + return LAH+1; + } + + void pooldestroy_bp(PoolTy *Pool) { + assert(Pool && "Null pool pointer passed in to pooldestroy!\n"); + + unsigned PID; + #ifdef ENABLE_POOL_IDS + PID = removePoolNumber(Pool); + #endif + DO_IF_TRACE(fprintf(stderr, "[%d] pooldestroy_bp", PID)); + DO_IF_POOLDESTROY_STATS(PrintPoolStats(Pool)); + + // Free all allocated slabs. + PoolSlab *PS = Pool->Slabs; + while (PS) { + PoolSlab *Next = PS->getNext(); + PS->destroy(); + PS = Next; + } + + // Free all of the large arrays. + LargeArrayHeader *LAH = Pool->LargeArrays; + while (LAH) { + LargeArrayHeader *Next = LAH->Next; + free(LAH); + LAH = Next; + } + } + + + + //===----------------------------------------------------------------------===// + // + // Pool allocator library implementation + // + //===----------------------------------------------------------------------===// + + // poolinit - Initialize a pool descriptor to empty + // + template + static void poolinit_internal(PoolTy *Pool, + unsigned DeclaredSize, unsigned ObjAlignment) { + assert(Pool && "Null pool pointer passed into poolinit!\n"); + memset(Pool, 0, sizeof(PoolTy)); + Pool->splay = new_splay(); + Pool->AllocSize = INITIAL_SLAB_SIZE; + + if (ObjAlignment < 4) ObjAlignment = __alignof(double); + Pool->Alignment = ObjAlignment; + + // Round the declared size up to an alignment boundary-header size, just like + // we have to do for objects. + if (DeclaredSize) { + if (DeclaredSize < sizeof(FreedNodeHeader) - + sizeof(NodeHeader)) + DeclaredSize = sizeof(FreedNodeHeader) - + sizeof(NodeHeader); + DeclaredSize = DeclaredSize+sizeof(FreedNodeHeader) + + (ObjAlignment-1); + DeclaredSize = (DeclaredSize & ~(ObjAlignment-1)) - + sizeof(FreedNodeHeader); + } + + Pool->DeclaredSize = DeclaredSize; + + unsigned PID; + #ifdef ENABLE_POOL_IDS + PID = addPoolNumber(Pool); + #endif + DO_IF_TRACE(fprintf(stderr, "[%d] poolinit%s(0x%X, %d, %d)\n", + PID, PoolTraits::getSuffix(), + Pool, DeclaredSize, ObjAlignment)); + DO_IF_PNP(++PoolsInited); // Track # pools initialized + DO_IF_PNP(InitPrintNumPools()); + } + + void poolinit(PoolTy *Pool, + unsigned DeclaredSize, unsigned ObjAlignment) { + poolinit_internal(Pool, DeclaredSize, ObjAlignment); + } + + // pooldestroy - Release all memory allocated for a pool + // + void pooldestroy(PoolTy *Pool) { + assert(Pool && "Null pool pointer passed in to pooldestroy!\n"); + free_splay(Pool->splay); + unsigned PID; + #ifdef ENABLE_POOL_IDS + PID = removePoolNumber(Pool); + #endif + DO_IF_TRACE(fprintf(stderr, "[%d] pooldestroy", PID)); + DO_IF_POOLDESTROY_STATS(PrintPoolStats(Pool)); + + // Free all allocated slabs. + PoolSlab *PS = Pool->Slabs; + while (PS) { + PoolSlab *Next = PS->getNext(); + PS->destroy(); + PS = Next; + } + + // Free all of the large arrays. + LargeArrayHeader *LAH = Pool->LargeArrays; + while (LAH) { + LargeArrayHeader *Next = LAH->Next; + free(LAH); + LAH = Next; + } + } + + template + static void *poolalloc_internal(PoolTy *Pool, unsigned NumBytes) { + DO_IF_TRACE(fprintf(stderr, "[%d] poolalloc%s(%d) -> ", + getPoolNumber(Pool), PoolTraits::getSuffix(), NumBytes)); + + // If a null pool descriptor is passed in, this is not a pool allocated data + // structure. Hand off to the system malloc. + if (Pool == 0) { + // std::cerr << "Null descriptor is passed in "; + abort(); + void *Result = malloc(NumBytes); + DO_IF_TRACE(fprintf(stderr, "0x%X [malloc]\n", Result)); + return Result; + } + DO_IF_PNP(if (Pool->NumObjects == 0) ++PoolCounter); // Track # pools. + + // Objects must be at least 8 bytes to hold the FreedNodeHeader object when + // they are freed. This also handles allocations of 0 bytes. + if (NumBytes < (sizeof(FreedNodeHeader) - + sizeof(NodeHeader))) + NumBytes = sizeof(FreedNodeHeader) - + sizeof(NodeHeader); + + // Adjust the size so that memory allocated from the pool is always on the + // proper alignment boundary. + unsigned Alignment = Pool->Alignment; + NumBytes = NumBytes+sizeof(FreedNodeHeader) + + (Alignment-1); // Round up + NumBytes = (NumBytes & ~(Alignment-1)) - + sizeof(FreedNodeHeader); // Truncate + + DO_IF_PNP(CurHeapSize += (NumBytes + sizeof(NodeHeader))); + DO_IF_PNP(if (CurHeapSize > MaxHeapSize) MaxHeapSize = CurHeapSize); + + DO_IF_PNP(++Pool->NumObjects); + DO_IF_PNP(Pool->BytesAllocated += NumBytes); + + // Fast path - allocate objects off the object list. + if (NumBytes == Pool->DeclaredSize && Pool->ObjFreeList != 0) { + typename PoolTraits::FreeNodeHeaderPtrTy NodeIdx = Pool->ObjFreeList; + void *PoolBase = Pool->Slabs; + FreedNodeHeader *Node = + PoolTraits::IndexToFNHPtr(NodeIdx, PoolBase); + UnlinkFreeNode(Pool, Node); + assert(NumBytes == Node->Header.Size); + + Node->Header.Size = NumBytes|1; // Mark as allocated + //store it in the splay tree + if (NumBytes != Pool->DeclaredSize) + splay_insert_ptr(Pool->splay, (unsigned long)(&Node->Header+1), NumBytes); + DO_IF_TRACE(fprintf(stderr, "0x%X\n", &Node->Header+1)); + return &Node->Header+1; + } + + if (PoolTraits::UseLargeArrayObjects && + NumBytes >= LARGE_SLAB_SIZE-sizeof(PoolSlab) - + sizeof(NodeHeader)) + goto LargeObject; + + // Fast path. In the common case, we can allocate a portion of the node at + // the front of the free list. + do { + void *PoolBase = Pool->Slabs; + FreedNodeHeader *FirstNode = + PoolTraits::IndexToFNHPtr(Pool->OtherFreeList, PoolBase); + if (FirstNode) { + unsigned FirstNodeSize = FirstNode->Header.Size; + if (FirstNodeSize >= NumBytes) { + if (FirstNodeSize >= 2*NumBytes+sizeof(NodeHeader)) { + // Put the remainder back on the list... + FreedNodeHeader *NextNodes = + (FreedNodeHeader*)((char*)FirstNode + + sizeof(NodeHeader) +NumBytes); + + // Remove from list + UnlinkFreeNode(Pool, FirstNode); + + NextNodes->Header.Size = FirstNodeSize-NumBytes - + sizeof(NodeHeader); + AddNodeToFreeList(Pool, NextNodes); + + } else { + UnlinkFreeNode(Pool, FirstNode); + NumBytes = FirstNodeSize; + } + FirstNode->Header.Size = NumBytes|1; // Mark as allocated + DO_IF_TRACE(fprintf(stderr, "0x%X\n", &FirstNode->Header+1)); + //Store it in the splay tree.... + // Pool->splay = + if (NumBytes != Pool->DeclaredSize) + splay_insert_ptr(Pool->splay, (unsigned long) (&FirstNode->Header+1), NumBytes); + return &FirstNode->Header+1; + } + + // Perform a search of the free list, taking the front of the first free + // chunk that is big enough. + typename PoolTraits::FreeNodeHeaderPtrTy *FN = &Pool->OtherFreeList; + FreedNodeHeader *FNN = FirstNode; + + // Search the list for the first-fit. + while (FNN && FNN->Header.Size < NumBytes) { + // Advance FN to point to the Next field of FNN. + FN = &FNN->Next; + + // Advance FNN to point to whatever the next node points to (null or the + // next node in the free list). + FNN = PoolTraits::IndexToFNHPtr(*FN, PoolBase); + } + + if (FNN) { + // We found a slab big enough. If it's a perfect fit, just unlink + // from the free list, otherwise, slice a little bit off and adjust + // the free list. + if (FNN->Header.Size > 2*NumBytes+sizeof(NodeHeader)) { + UnlinkFreeNode(Pool, FNN); + + // Put the remainder back on the list... + FreedNodeHeader *NextNodes = + (FreedNodeHeader*)((char*)FNN + + sizeof(NodeHeader) + + NumBytes); + NextNodes->Header.Size = FNN->Header.Size-NumBytes - + sizeof(NodeHeader); + AddNodeToFreeList(Pool, NextNodes); + } else { + UnlinkFreeNode(Pool, FNN); + NumBytes = FNN->Header.Size; + } + FNN->Header.Size = NumBytes|1; // Mark as allocated + DO_IF_TRACE(fprintf(stderr, "0x%X\n", &FNN->Header+1)); + //Store it in the splay tree.... + // Pool->splay = + if (NumBytes != Pool->DeclaredSize) + splay_insert_ptr(Pool->splay, (unsigned long) (&FNN->Header+1), NumBytes); + return &FNN->Header+1; + } + } + + // If we are not allowed to grow this pool, don't. + if (!PoolTraits::CanGrowPool) { + abort(); + return 0; + } + + // Oops, we didn't find anything on the free list big enough! Allocate + // another slab and try again. + PoolSlab::create(Pool, NumBytes); + } while (1); + + LargeObject: + // Otherwise, the allocation is a large array. Since we're not going to be + // able to help much for this allocation, simply pass it on to malloc. + LargeArrayHeader *LAH = (LargeArrayHeader*)malloc(sizeof(LargeArrayHeader) + + NumBytes); + LAH->Size = NumBytes; + LAH->Marker = ~0U; + LAH->LinkIntoList(&Pool->LargeArrays); + DO_IF_TRACE(fprintf(stderr, "0x%X [large]\n", LAH+1)); + //Store it in the splay tree.... + //Pool->splay = + if (NumBytes != Pool->DeclaredSize) + splay_insert_ptr(Pool->splay, (unsigned long) (LAH+1), NumBytes); + return LAH+1; + } + + template + static void poolfree_internal(PoolTy *Pool, void *Node) { + if (Node == 0) return; + DO_IF_TRACE(fprintf(stderr, "[%d] poolfree%s(%p) ", + getPoolNumber(Pool), PoolTraits::getSuffix(), Node)); + + // If a null pool descriptor is passed in, this is not a pool allocated data + // structure. Hand off to the system free. + if (Pool == 0) { + abort(); + free(Node); + DO_IF_TRACE(fprintf(stderr, "[free]\n")); + return; + } + Splay *splay = splay_find_ptr(Pool->splay, (unsigned long)Node); + splay_delete_node(splay); + // Check to see how many elements were allocated to this node... + FreedNodeHeader *FNH = + (FreedNodeHeader*)((char*)Node-sizeof(NodeHeader)); + assert((FNH->Header.Size & 1) && "Node not allocated!"); + unsigned Size = FNH->Header.Size & ~1; + + if (Size == ~1U) goto LargeArrayCase; + DO_IF_TRACE(fprintf(stderr, "%d bytes\n", Size)); + + DO_IF_PNP(CurHeapSize -= (Size + sizeof(NodeHeader))); + + // If the node immediately after this one is also free, merge it into node. + FreedNodeHeader *NextFNH; + NextFNH = (FreedNodeHeader*)((char*)Node+Size); + while ((NextFNH->Header.Size & 1) == 0) { + // Unlink NextFNH from the freelist that it is in. + UnlinkFreeNode(Pool, NextFNH); + Size += sizeof(NodeHeader)+NextFNH->Header.Size; + NextFNH = (FreedNodeHeader*)((char*)Node+Size); + } + + // If there are already nodes on the freelist, see if these blocks can be + // coallesced into one of the early blocks on the front of the list. This is + // a simple check that prevents many horrible forms of fragmentation, + // particularly when freeing objects in allocation order. + // + if (Pool->ObjFreeList) { + void *PoolBase = Pool->Slabs; + FreedNodeHeader *ObjFNH = + PoolTraits::IndexToFNHPtr(Pool->ObjFreeList, PoolBase); + + if ((char*)ObjFNH + sizeof(NodeHeader) + + ObjFNH->Header.Size == (char*)FNH) { + // Merge this with a node that is already on the object size free list. + // Because the object is growing, we will never be able to find it if we + // leave it on the object freelist. + UnlinkFreeNode(Pool, ObjFNH); + ObjFNH->Header.Size += Size+sizeof(NodeHeader); + AddNodeToFreeList(Pool, ObjFNH); + return; + } + } + + if (Pool->OtherFreeList) { + void *PoolBase = Pool->Slabs; + FreedNodeHeader *OFNH = + PoolTraits::IndexToFNHPtr(Pool->OtherFreeList, PoolBase); + + if ((char*)OFNH + sizeof(NodeHeader) + + OFNH->Header.Size == (char*)FNH) { + // Merge this with a node that is already on the object size free list. + OFNH->Header.Size += Size+sizeof(NodeHeader); + return; + } + } + + FNH->Header.Size = Size; + AddNodeToFreeList(Pool, FNH); + return; + + LargeArrayCase: + LargeArrayHeader *LAH = ((LargeArrayHeader*)Node)-1; + DO_IF_TRACE(fprintf(stderr, "%d bytes [large]\n", LAH->Size)); + DO_IF_PNP(CurHeapSize -= LAH->Size); + + // Unlink it from the list of large arrays and free it. + LAH->UnlinkFromList(); + free(LAH); + } + + template + static void *poolrealloc_internal(PoolTy *Pool, void *Node, + unsigned NumBytes) { + DO_IF_TRACE(fprintf(stderr, "[%d] poolrealloc%s(0x%X, %d) -> ", + getPoolNumber(Pool), PoolTraits::getSuffix(), + Node, NumBytes)); + + // If a null pool descriptor is passed in, this is not a pool allocated data + // structure. Hand off to the system realloc. + if (Pool == 0) { + void *Result = realloc(Node, NumBytes); + DO_IF_TRACE(fprintf(stderr, "0x%X (system realloc)\n", Result)); + return Result; + } + if (Node == 0) return poolalloc(Pool, NumBytes); + if (NumBytes == 0) { + poolfree(Pool, Node); + DO_IF_TRACE(fprintf(stderr, "freed\n")); + return 0; + } + + FreedNodeHeader *FNH = + (FreedNodeHeader*)((char*)Node-sizeof(NodeHeader)); + assert((FNH->Header.Size & 1) && "Node not allocated!"); + unsigned Size = FNH->Header.Size & ~1; + if (Size != ~1U) { + // FIXME: This is obviously much worse than it could be. In particular, we + // never try to expand something in a pool. This might hurt some programs! + void *New = poolalloc(Pool, NumBytes); + assert(New != 0 && "Our poolalloc doesn't ever return null for failure!"); + + // Copy the min of the new and old sizes over. + memcpy(New, Node, Size < NumBytes ? Size : NumBytes); + poolfree(Pool, Node); + DO_IF_TRACE(fprintf(stderr, "0x%X (moved)\n", New)); + return New; + } + + // Otherwise, we have a large array. Perform the realloc using the system + // realloc function. This case is actually quite common as many large blocks + // end up being realloc'd it seems. + LargeArrayHeader *LAH = ((LargeArrayHeader*)Node)-1; + LAH->UnlinkFromList(); + + LargeArrayHeader *NewLAH = + (LargeArrayHeader*)realloc(LAH, sizeof(LargeArrayHeader)+NumBytes); + + DO_IF_TRACE(if (LAH == NewLAH) + fprintf(stderr, "resized in place (system realloc)\n"); + else + fprintf(stderr, "0x%X (moved by system realloc)\n", NewLAH+1)); + NewLAH->LinkIntoList(&Pool->LargeArrays); + return NewLAH+1; + } + + unsigned poolobjsize(PoolTy *Pool, void *Node) { + if (Node == 0) return 0; + + // If a null pool descriptor is passed in, this is not a pool allocated data + // structure. We don't really have any way to service this!! + if (Pool == 0) { + fprintf(stderr, "ERROR: Cannot call poolobjsize on a pool that is getting" + " memory from the heap. Sorry!\n"); + abort(); + } + + // Check to see how many bytes were allocated to this node. + FreedNodeHeader *FNH = + (FreedNodeHeader*)((char*)Node - + sizeof(NodeHeader)); + assert((FNH->Header.Size & 1) && "Node not allocated!"); + unsigned Size = FNH->Header.Size & ~1; + if (Size != ~1U) return Size; + + // Otherwise, we have a large array. + LargeArrayHeader *LAH = ((LargeArrayHeader*)Node)-1; + return LAH->Size; + } + + + void *poolalloc(PoolTy *Pool, unsigned NumBytes) { + DO_IF_FORCE_MALLOCFREE(return malloc(NumBytes)); + void *ret = poolalloc_internal(Pool, NumBytes); + // printf("Allocated in pool %x num bytes %d ret val %x\n",Pool, NumBytes, ret); + return ret; + } + + + void poolfree(PoolTy *Pool, void *Node) { + DO_IF_FORCE_MALLOCFREE(free(Node); return); + poolfree_internal(Pool, Node); + } + /* + void poolcheck(PoolTy *Pool, void *referrent, void *Node) { + Splay *splay = splay_find_ptr(Pool->splay, (unsigned long) referrent); + if (((unsigned long) referrent) + splay->val < (unsigned long) Node) { + printf("Bounds check failure"); + abort(); + } + } + */ + void *getreferrent(PoolTy *Pool, void *referrent) { + return splay_find_ptr(Pool->splay, (unsigned long) referrent); + } + + bool poolcheck4(Splay *splay, void *Node) { + if( ((unsigned long) splay->key) > ((unsigned long)Node)) + return false; + if (((unsigned long) splay->key) + splay->val < (unsigned long) Node) { + return false; + }; + return true; + } + + void* poolcheckslow(PoolTy *A, void *B, void *C) { + void *r = getreferrent(A, B); + + if (turn == 1) { + pCache1 = r; + turn = 2; + } else { + pCache2 = r; + turn = 1; + } + if (!poolcheck4((Splay *)r, C)) { + printf("Bounds error \n"); + abort(); + } + return r; + } + + + + void poolregister(PoolTy *Pool, void *referrent, unsigned size) { + if (Pool) + splay_insert_ptr(Pool->splay, (unsigned long) referrent, size); + } + + void *poolrealloc(PoolTy *Pool, void *Node, + unsigned NumBytes) { + DO_IF_FORCE_MALLOCFREE(return realloc(Node, NumBytes)); + return poolrealloc_internal(Pool, Node, NumBytes); + } + + + + //===----------------------------------------------------------------------===// + // Pointer Compression runtime library. Most of these are just wrappers + // around the normal pool routines. + //===----------------------------------------------------------------------===// + + // For now, use address space reservation of 256MB. + #define POOLSIZE (256*1024*1024) + + // Pools - When we are done with a pool, don't munmap it, keep it around for + // next time. + static PoolSlab *Pools[4] = { 0, 0, 0, 0 }; + + + void *poolinit_pc(PoolTy *Pool, + unsigned DeclaredSize, unsigned ObjAlignment) { + poolinit_internal(Pool, DeclaredSize, ObjAlignment); + + // The number of nodes to stagger in the mmap'ed pool + static unsigned stagger=0; + + // Create the pool. We have to do this eagerly (instead of on the first + // allocation), because code may want to eagerly copy the pool base into a + // register. + + // If we already have a pool mapped, reuse it. + for (unsigned i = 0; i != 4; ++i) + if (Pools[i]) { + Pool->Slabs = Pools[i]; + Pools[i] = 0; + break; + } + + // + // Wrap the stagger value back to zero if we're past the size of the pool. + // This way, we always reserve less than 2*POOLSIZE of the virtual address + // space. + // + if ((stagger * DeclaredSize) >= POOLSIZE) + stagger = 0; + + if (Pool->Slabs == 0) { + // + // Didn't find an existing pool, create one. + // + // To create a pool, we stagger the beginning of the pool so that pools + // do not end up starting on the same page boundary (creating extra cache + // conflicts). + // + Pool->Slabs = (PoolSlab*) + AllocateSpaceWithMMAP(POOLSIZE + (DeclaredSize * stagger), true); + Pool->Slabs += (DeclaredSize * stagger); + + // Increase the stagger amount by one node. + stagger++; + DO_IF_TRACE(fprintf(stderr, "RESERVED ADDR SPACE: %p -> %p\n", + Pool->Slabs, (char*)Pool->Slabs+POOLSIZE)); + } + PoolSlab::create_for_ptrcomp(Pool, Pool->Slabs, + POOLSIZE); + return Pool->Slabs; + } + + void pooldestroy_pc(PoolTy *Pool) { + assert(Pool && "Null pool pointer passed in to pooldestroy!\n"); + if (Pool->Slabs == 0) + return; // no memory allocated from this pool. + + unsigned PID; + #ifdef ENABLE_POOL_IDS + PID = removePoolNumber(Pool); + #endif + DO_IF_TRACE(fprintf(stderr, "[%d] pooldestroy_pc", PID)); + DO_IF_POOLDESTROY_STATS(PrintPoolStats(Pool)); + + // If there is space to remember this pool, do so. + for (unsigned i = 0; i != 4; ++i) + if (Pools[i] == 0) { + Pools[i] = Pool->Slabs; + return; + } + + // Otherwise, just munmap it. + DO_IF_TRACE(fprintf(stderr, "UNMAPPING ADDR SPACE: %p -> %p\n", + Pool->Slabs, (char*)Pool->Slabs+POOLSIZE)); + munmap(Pool->Slabs, POOLSIZE); + } + + unsigned long long poolalloc_pc(PoolTy *Pool, + unsigned NumBytes) { + void *Result = poolalloc_internal(Pool, NumBytes); + return (char*)Result-(char*)Pool->Slabs; + } + + void poolfree_pc(PoolTy *Pool, unsigned long long Node) { + poolfree_internal(Pool, (char*)Pool->Slabs+Node); + } + + + //===----------------------------------------------------------------------===// + // Access Tracing Runtime Library Support + //===----------------------------------------------------------------------===// + + static FILE *FD = 0; + void poolaccesstraceinit() { + #ifdef ALWAYS_USE_MALLOC_FREE + FD = fopen("trace.malloc.csv", "w"); + #else + FD = fopen("trace.pa.csv", "w"); + #endif + } + + #define NUMLRU 2 + static void *LRUWindow[NUMLRU]; + + void poolaccesstrace(void *Ptr, void *PD) { + static unsigned Time = ~0U; + static void *LastPtr = 0; + + // Not pool memory? + if (PD == 0) return; + + // Filter out stuff that is not to the heap. + ++Time; + if ((uintptr_t)Ptr > 1000000000UL) + return; + + Ptr = (void*)((intptr_t)Ptr & ~31L); + + #if 1 + // Drop duplicate points. + for (unsigned i = 0; i != NUMLRU; ++i) + if (Ptr == LRUWindow[i]) { + memmove(LRUWindow+1, LRUWindow, sizeof(void*)*i); + LRUWindow[0] = Ptr; + return; + } + + // Rotate LRU window. + memmove(LRUWindow+1, LRUWindow, sizeof(void*)*(NUMLRU-1)); + LRUWindow[0] = Ptr; + #endif + + // Delete many points to reduce data. + static unsigned int Ctr; + if ((++Ctr & 31)) return; + + + fprintf(FD, "%d", Time); + #if defined(ENABLE_POOL_IDS) + for (unsigned PID = getPoolNumber(PD)+1; PID; --PID) + fprintf(FD,"\t?"); + #else + fprintf(FD, "\t%p ", PD); + #endif + fprintf(FD, "\t%lu\n", (intptr_t)Ptr); + } From dhurjati at cs.uiuc.edu Thu Dec 22 10:49:43 2005 From: dhurjati at cs.uiuc.edu (Dinakar Dhurjati) Date: Thu, 22 Dec 2005 10:49:43 -0600 Subject: [llvm-commits] CVS: llvm-poolalloc/runtime/SafePoolAllocator/Makefile Message-ID: <200512221649.KAA14002@zion.cs.uiuc.edu> Changes in directory llvm-poolalloc/runtime/SafePoolAllocator: Makefile added (r1.1) --- Log message: *** empty log message *** --- Diffs of the changes: (+9 -0) Makefile | 9 +++++++++ 1 files changed, 9 insertions(+) Index: llvm-poolalloc/runtime/SafePoolAllocator/Makefile diff -c /dev/null llvm-poolalloc/runtime/SafePoolAllocator/Makefile:1.1 *** /dev/null Thu Dec 22 10:49:41 2005 --- llvm-poolalloc/runtime/SafePoolAllocator/Makefile Thu Dec 22 10:49:31 2005 *************** *** 0 **** --- 1,9 ---- + LEVEL = ../.. + BYTECODE_LIBRARY=1 + SHARED_LIBRARY=1 + LIBRARYNAME=poolalloc_safe_rt + + include $(LEVEL)/Makefile.common + + # Always build optimized and debug versions + all:: $(LIBNAME_OBJO) $(LIBNAME_OBJG) From dhurjati at cs.uiuc.edu Thu Dec 22 10:50:07 2005 From: dhurjati at cs.uiuc.edu (Dinakar Dhurjati) Date: Thu, 22 Dec 2005 10:50:07 -0600 Subject: [llvm-commits] CVS: llvm-poolalloc/runtime/SafePoolAllocator/PoolAllocator.h Message-ID: <200512221650.KAA14019@zion.cs.uiuc.edu> Changes in directory llvm-poolalloc/runtime/SafePoolAllocator: PoolAllocator.h added (r1.1) --- Log message: *** empty log message *** --- Diffs of the changes: (+79 -0) PoolAllocator.h | 79 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 79 insertions(+) Index: llvm-poolalloc/runtime/SafePoolAllocator/PoolAllocator.h diff -c /dev/null llvm-poolalloc/runtime/SafePoolAllocator/PoolAllocator.h:1.1 *** /dev/null Thu Dec 22 10:50:05 2005 --- llvm-poolalloc/runtime/SafePoolAllocator/PoolAllocator.h Thu Dec 22 10:49:55 2005 *************** *** 0 **** --- 1,79 ---- + //===- PoolAllocator.h - Pool allocator runtime interface file --*- C++ -*-===// + // + // The LLVM Compiler Infrastructure + // + // This file was developed by the LLVM research group and is distributed under + // the University of Illinois Open Source License. See LICENSE.TXT for details. + // + //===----------------------------------------------------------------------===// + // + // This file defines the interface which is implemented by the LLVM pool + // allocator runtime library. + // + //===----------------------------------------------------------------------===// + + #ifndef POOLALLOCATOR_RUNTIME_H + #define POOLALLOCATOR_RUNTIME_H + #include "Support/hash_set" + + #define AddrArrSize 2 + unsigned poolmemusage = 0; + unsigned PCheckPassed = 1; + typedef struct PoolTy { + // Ptr1, Ptr2 - Implementation specified data pointers. + void *Ptr1, *Ptr2; + + // NodeSize - Keep track of the object size tracked by this pool + unsigned short NodeSize; + + // FreeablePool - Set to false if the memory from this pool cannot be freed + // before destroy. + // + // unsigned short FreeablePool; + + // Use the hash_set only if the number of Slabs exceeds AddrArrSize + hash_set *Slabs; + + // The array containing the initial address of slabs (as long as there are + // fewer than a certain number of them) + unsigned SlabAddressArray[AddrArrSize]; + + // The number of slabs allocated. Large arrays are not counted + unsigned NumSlabs; + + // Large arrays. In SAFECode, these are currently not freed or reused. + // A better implementation could split them up into single slabs for reuse, + // upon being freed. + void *LargeArrays; + + void *prevPage[4]; + unsigned short lastUsed; + + short AllocadPool; + void *allocaptr; + + } PoolTy; + + extern "C" { + void exactcheck(int a, int b) { + if ((0 > a) || (a >= b)) { + fprintf(stderr, "exact check failed\n"); + exit(-1); + } + } + void poolinit(PoolTy *Pool, unsigned NodeSize); + void poolmakeunfreeable(PoolTy *Pool); + void pooldestroy(PoolTy *Pool); + void *poolalloc(PoolTy *Pool, unsigned NumBytes); + void poolregister(PoolTy *Pool, unsigned NumBytes, void *allocaptr); + void poolfree(PoolTy *Pool, void *Node); + void poolcheck(PoolTy *Pool, void *Node); + void poolcheckoptim(PoolTy *Pool, void *Node); + void poolstats() { + fprintf(stderr, "pool mem usage %d\n",poolmemusage); + } + void poolcheckalign(PoolTy *Pool, void *Node, unsigned StartOffset, + unsigned EndOffset); + } + + #endif From dhurjati at cs.uiuc.edu Thu Dec 22 10:50:36 2005 From: dhurjati at cs.uiuc.edu (Dinakar Dhurjati) Date: Thu, 22 Dec 2005 10:50:36 -0600 Subject: [llvm-commits] CVS: llvm-poolalloc/runtime/SafePoolAllocator/PoolAllocatorBitMask.cpp Message-ID: <200512221650.KAA14043@zion.cs.uiuc.edu> Changes in directory llvm-poolalloc/runtime/SafePoolAllocator: PoolAllocatorBitMask.cpp added (r1.1) --- Log message: *** empty log message *** --- Diffs of the changes: (+1220 -0) PoolAllocatorBitMask.cpp | 1220 +++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 1220 insertions(+) Index: llvm-poolalloc/runtime/SafePoolAllocator/PoolAllocatorBitMask.cpp diff -c /dev/null llvm-poolalloc/runtime/SafePoolAllocator/PoolAllocatorBitMask.cpp:1.1 *** /dev/null Thu Dec 22 10:50:34 2005 --- llvm-poolalloc/runtime/SafePoolAllocator/PoolAllocatorBitMask.cpp Thu Dec 22 10:50:24 2005 *************** *** 0 **** --- 1,1220 ---- + //===- PoolAllocatorBitMask.cpp - Implementation of poolallocator runtime -===// + // + // The LLVM Compiler Infrastructure + // + // This file was developed by the LLVM research group and is distributed under + // the University of Illinois Open Source License. See LICENSE.TXT for details. + // + //===----------------------------------------------------------------------===// + // + // This file is one possible implementation of the LLVM pool allocator runtime + // library. + // + // This uses the 'Ptr1' field to maintain a linked list of slabs that are either + // empty or are partially allocated from. The 'Ptr2' field of the PoolTy is + // used to track a linked list of slabs which are full, ie, all elements have + // been allocated from them. + // + //===----------------------------------------------------------------------===// + + #include "PoolAllocator.h" + #include "PageManager.h" + #include + #include + #include + #include + #define DEBUG(x) + //===----------------------------------------------------------------------===// + // + // PoolSlab implementation + // + //===----------------------------------------------------------------------===// + + + // PoolSlab Structure - Hold multiple objects of the current node type. + // Invariants: FirstUnused <= UsedEnd + // + struct PoolSlab { + PoolSlab **PrevPtr, *Next; + bool isSingleArray; // If this slab is used for exactly one array + + private: + // FirstUnused - First empty node in slab + unsigned short FirstUnused; + + // UsedBegin - The first node in the slab that is used. + unsigned short UsedBegin; + + // UsedEnd - 1 past the last allocated node in slab. 0 if slab is empty + unsigned short UsedEnd; + + // NumNodesInSlab - This contains the number of nodes in this slab, which + // effects the size of the NodeFlags vector, and indicates the number of nodes + // which are in the slab. + unsigned int NumNodesInSlab; + + // NodeFlagsVector - This array contains two bits for each node in this pool + // slab. The first (low address) bit indicates whether this node has been + // allocated, and the second (next higher) bit indicates whether this is the + // start of an allocation. + // + // This is a variable sized array, which has 2*NumNodesInSlab bits (rounded up + // to 4 bytes). + unsigned NodeFlagsVector[]; + + bool isNodeAllocated(unsigned NodeNum) { + return NodeFlagsVector[NodeNum/16] & (1 << (NodeNum & 15)); + } + + void markNodeAllocated(unsigned NodeNum) { + NodeFlagsVector[NodeNum/16] |= 1 << (NodeNum & 15); + } + + void markNodeFree(unsigned NodeNum) { + NodeFlagsVector[NodeNum/16] &= ~(1 << (NodeNum & 15)); + } + + void setStartBit(unsigned NodeNum) { + NodeFlagsVector[NodeNum/16] |= 1 << ((NodeNum & 15)+16); + } + + bool isStartOfAllocation(unsigned NodeNum) { + return NodeFlagsVector[NodeNum/16] & (1 << ((NodeNum & 15)+16)); + } + + void clearStartBit(unsigned NodeNum) { + NodeFlagsVector[NodeNum/16] &= ~(1 << ((NodeNum & 15)+16)); + } + + public: + // create - Create a new (empty) slab and add it to the end of the Pools list. + static PoolSlab *create(PoolTy *Pool); + + // createSingleArray - Create a slab for a large singlearray with NumNodes + // entries in it, returning the pointer into the pool directly. + static void *createSingleArray(PoolTy *Pool, unsigned NumNodes); + + // getSlabSize - Return the number of nodes that each slab should contain. + static unsigned getSlabSize(PoolTy *Pool) { + // We need space for the header... + unsigned NumNodes = PageSize-sizeof(PoolSlab); + + // We need space for the NodeFlags... + unsigned NodeFlagsBytes = NumNodes/Pool->NodeSize * 2 / 8; + NumNodes -= (NodeFlagsBytes+3) & ~3; // Round up to int boundaries. + + // Divide the remainder among the nodes! + return NumNodes / Pool->NodeSize; + } + + void addToList(PoolSlab **PrevPtrPtr) { + PoolSlab *InsertBefore = *PrevPtrPtr; + *PrevPtrPtr = this; + PrevPtr = PrevPtrPtr; + Next = InsertBefore; + if (InsertBefore) InsertBefore->PrevPtr = &Next; + } + + void unlinkFromList() { + *PrevPtr = Next; + if (Next) Next->PrevPtr = PrevPtr; + } + + unsigned getSlabSize() const { + return NumNodesInSlab; + } + + // destroy - Release the memory for the current object. + void destroy(); + + // isEmpty - This is a quick check to see if this slab is completely empty or + // not. + bool isEmpty() const { return UsedEnd == 0; } + + // isFull - This is a quick check to see if the slab is completely allocated. + // + bool isFull() const { return isSingleArray || FirstUnused == getSlabSize(); } + + // allocateSingle - Allocate a single element from this pool, returning -1 if + // there is no space. + int allocateSingle(); + + // allocateMultiple - Allocate multiple contiguous elements from this pool, + // returning -1 if there is no space. + int allocateMultiple(unsigned Num); + + // getElementAddress - Return the address of the specified element. + void *getElementAddress(unsigned ElementNum, unsigned ElementSize) { + char *Data = (char*)&NodeFlagsVector[((unsigned)NumNodesInSlab+15)/16]; + return &Data[ElementNum*ElementSize]; + } + const void *getElementAddress(unsigned ElementNum, unsigned ElementSize)const{ + const char *Data = + (const char *)&NodeFlagsVector[(unsigned)(NumNodesInSlab+15)/16]; + return &Data[ElementNum*ElementSize]; + } + + // containsElement - Return the element number of the specified address in + // this slab. If the address is not in slab, return -1. + int containsElement(void *Ptr, unsigned ElementSize) const; + + // freeElement - Free the single node, small array, or entire array indicated. + void freeElement(unsigned short ElementIdx); + + // lastNodeAllocated - Return one past the last node in the pool which is + // before ScanIdx, that is allocated. If there are no allocated nodes in this + // slab before ScanIdx, return 0. + unsigned lastNodeAllocated(unsigned ScanIdx); + }; + + // create - Create a new (empty) slab and add it to the end of the Pools list. + PoolSlab *PoolSlab::create(PoolTy *Pool) { + unsigned NodesPerSlab = getSlabSize(Pool); + + unsigned Size = sizeof(PoolSlab) + 4*((NodesPerSlab+15)/16) + + Pool->NodeSize*getSlabSize(Pool); + assert(Size <= PageSize && "Trying to allocate a slab larger than a page!"); + PoolSlab *PS = (PoolSlab*)AllocatePage(); + + PS->NumNodesInSlab = NodesPerSlab; + PS->isSingleArray = 0; // Not a single array! + PS->FirstUnused = 0; // Nothing allocated. + PS->UsedBegin = 0; // Nothing allocated. + PS->UsedEnd = 0; // Nothing allocated. + + // Add the slab to the list... + PS->addToList((PoolSlab**)&Pool->Ptr1); + // printf(" creating a slab %x\n", PS); + return PS; + } + + void *PoolSlab::createSingleArray(PoolTy *Pool, unsigned NumNodes) { + // FIXME: This wastes memory by allocating space for the NodeFlagsVector + unsigned NodesPerSlab = getSlabSize(Pool); + assert(NumNodes > NodesPerSlab && "No need to create a single array!"); + + unsigned NumPages = (NumNodes+NodesPerSlab-1)/NodesPerSlab; + PoolSlab *PS = (PoolSlab*)AllocateNPages(NumPages); + + assert(PS && "poolalloc: Could not allocate memory!"); + + if (Pool->NumSlabs > AddrArrSize) + Pool->Slabs->insert((void*)PS); + else if (Pool->NumSlabs == AddrArrSize) { + // Create the hash_set + Pool->Slabs = new hash_set; + Pool->Slabs->insert((void *)PS); + for (unsigned i = 0; i < AddrArrSize; ++i) + Pool->Slabs->insert((void *) Pool->SlabAddressArray[i]); + } else { + // Insert it in the array + Pool->SlabAddressArray[Pool->NumSlabs] = (unsigned) PS; + } + Pool->NumSlabs++; + + PS->addToList((PoolSlab**)&Pool->LargeArrays); + + PS->isSingleArray = 1; + PS->NumNodesInSlab = NumPages * PageSize; + *(unsigned*)&PS->FirstUnused = NumPages; + return PS->getElementAddress(0, 0); + } + + void PoolSlab::destroy() { + if (isSingleArray) + for (unsigned NumPages = *(unsigned*)&FirstUnused; NumPages != 1;--NumPages) + FreePage((char*)this + (NumPages-1)*PageSize); + + FreePage(this); + } + + // allocateSingle - Allocate a single element from this pool, returning -1 if + // there is no space. + int PoolSlab::allocateSingle() { + // If the slab is a single array, go on to the next slab. Don't allocate + // single nodes in a SingleArray slab. + if (isSingleArray) return -1; + + unsigned SlabSize = getSlabSize(); + + // Check to see if there are empty entries at the end of the slab... + if (UsedEnd < SlabSize) { + // Mark the returned entry used + unsigned short UE = UsedEnd; + markNodeAllocated(UE); + setStartBit(UE); + + // If we are allocating out the first unused field, bump its index also + if (FirstUnused == UE) + FirstUnused++; + + // Return the entry, increment UsedEnd field. + return UsedEnd++; + } + + // If not, check to see if this node has a declared "FirstUnused" value that + // is less than the number of nodes allocated... + // + if (FirstUnused < SlabSize) { + // Successfully allocate out the first unused node + unsigned Idx = FirstUnused; + markNodeAllocated(Idx); + setStartBit(Idx); + + // Increment FirstUnused to point to the new first unused value... + // FIXME: this should be optimized + unsigned short FU = FirstUnused; + do { + ++FU; + } while (FU != SlabSize && isNodeAllocated(FU)); + FirstUnused = FU; + + return Idx; + } + + return -1; + } + + // allocateMultiple - Allocate multiple contiguous elements from this pool, + // returning -1 if there is no space. + int PoolSlab::allocateMultiple(unsigned Size) { + // Do not allocate small arrays in SingleArray slabs + if (isSingleArray) return -1; + + // For small array allocation, check to see if there are empty entries at the + // end of the slab... + if (UsedEnd+Size <= getSlabSize()) { + // Mark the returned entry used and set the start bit + unsigned UE = UsedEnd; + setStartBit(UE); + for (unsigned i = UE; i != UE+Size; ++i) + markNodeAllocated(i); + + // If we are allocating out the first unused field, bump its index also + if (FirstUnused == UE) + FirstUnused += Size; + + // Increment UsedEnd + UsedEnd += Size; + + // Return the entry + return UE; + } + + // If not, check to see if this node has a declared "FirstUnused" value + // starting which Size nodes can be allocated + // + unsigned Idx = FirstUnused; + while (Idx+Size <= getSlabSize()) { + assert(!isNodeAllocated(Idx) && "FirstUsed is not accurate!"); + + // Check if there is a continuous array of Size nodes starting FirstUnused + unsigned LastUnused = Idx+1; + for (; LastUnused != Idx+Size && !isNodeAllocated(LastUnused); ++LastUnused) + /*empty*/; + + // If we found an unused section of this pool which is large enough, USE IT! + if (LastUnused == Idx+Size) { + setStartBit(Idx); + // FIXME: this loop can be made more efficient! + for (unsigned i = Idx; i != Idx + Size; ++i) + markNodeAllocated(i); + + // This should not be allocating on the end of the pool, so we don't need + // to bump the UsedEnd pointer. + assert(Idx != UsedEnd && "Shouldn't allocate at end of pool!"); + + // If we are allocating out the first unused field, bump its index also. + if (Idx == FirstUnused) + FirstUnused += Size; + + // Return the entry + return Idx; + } + + // Otherwise, try later in the pool. Find the next unused entry. + Idx = LastUnused; + while (Idx+Size <= getSlabSize() && isNodeAllocated(Idx)) + ++Idx; + } + + return -1; + } + + + // containsElement - Return the element number of the specified address in + // this slab. If the address is not in slab, return -1. + int PoolSlab::containsElement(void *Ptr, unsigned ElementSize) const { + const void *FirstElement = getElementAddress(0, 0); + if (FirstElement <= Ptr) { + unsigned Delta = (char*)Ptr-(char*)FirstElement; + if (isSingleArray) + if (Delta < NumNodesInSlab) return Delta/ElementSize; + unsigned Index = Delta/ElementSize; + if (Index < getSlabSize()) { + if (Delta % ElementSize != 0) { + printf("Freeing pointer into the middle of an element!"); + abort(); + } + + return Index; + } + } + return -1; + } + + + // freeElement - Free the single node, small array, or entire array indicated. + void PoolSlab::freeElement(unsigned short ElementIdx) { + if (!isNodeAllocated(ElementIdx)) return; + // assert(isNodeAllocated(ElementIdx) && + // "poolfree: Attempt to free node that is already freed\n"); + assert(!isSingleArray && "Cannot free an element from a single array!"); + + // Mark this element as being free! + markNodeFree(ElementIdx); + + // If this slab is not a SingleArray + assert(isStartOfAllocation(ElementIdx) && + "poolfree: Attempt to free middle of allocated array\n"); + + // Free the first cell + clearStartBit(ElementIdx); + markNodeFree(ElementIdx); + + // Free all nodes if this was a small array allocation. + unsigned short ElementEndIdx = ElementIdx + 1; + + // FIXME: This should use manual strength reduction to produce decent code. + unsigned short UE = UsedEnd; + while (ElementEndIdx != UE && + !isStartOfAllocation(ElementEndIdx) && + isNodeAllocated(ElementEndIdx)) { + markNodeFree(ElementEndIdx); + ++ElementEndIdx; + } + + // Update the first free field if this node is below the free node line + if (ElementIdx < FirstUnused) FirstUnused = ElementIdx; + + // Update the first used field if this node was the first used. + if (ElementIdx == UsedBegin) UsedBegin = ElementEndIdx; + + // If we are freeing the last element in a slab, shrink the UsedEnd marker + // down to the last used node. + if (ElementEndIdx == UE) { + #if 0 + printf("FU: %d, UB: %d, UE: %d FREED: [%d-%d)", + FirstUnused, UsedBegin, UsedEnd, ElementIdx, ElementEndIdx); + #endif + + // If the user is freeing the slab entirely in-order, it's quite possible + // that all nodes are free in the slab. If this is the case, simply reset + // our pointers. + if (UsedBegin == UE) { + //printf(": SLAB EMPTY\n"); + FirstUnused = 0; + UsedBegin = 0; + UsedEnd = 0; + } else if (FirstUnused == ElementIdx) { + // Freed the last node(s) in this slab. + FirstUnused = ElementIdx; + UsedEnd = ElementIdx; + } else { + UsedEnd = lastNodeAllocated(ElementIdx); + assert(FirstUnused <= UsedEnd+1 && + "FirstUnused field was out of date!"); + } + } + } + + unsigned PoolSlab::lastNodeAllocated(unsigned ScanIdx) { + // Check the last few nodes in the current word of flags... + unsigned CurWord = ScanIdx/16; + unsigned short Flags = NodeFlagsVector[CurWord] & 0xFFFF; + if (Flags) { + // Mask off nodes above this one + Flags &= (1 << ((ScanIdx & 15)+1))-1; + if (Flags) { + // If there is still something in the flags vector, then there is a node + // allocated in this part. The goto is a hack to get the uncommonly + // executed code away from the common code path. + //printf("A: "); + goto ContainsAllocatedNode; + } + } + + // Ok, the top word doesn't contain anything, scan the whole flag words now. + --CurWord; + while (CurWord != ~0U) { + Flags = NodeFlagsVector[CurWord] & 0xFFFF; + if (Flags) { + // There must be a node allocated in this word! + //printf("B: "); + goto ContainsAllocatedNode; + } + CurWord--; + } + return 0; + + ContainsAllocatedNode: + // Figure out exactly which node is allocated in this word now. The node + // allocated is the one with the highest bit set in 'Flags'. + // + // This should use __builtin_clz to get the value, but this builtin is only + // available with GCC 3.4 and above. :( + assert(Flags && "Should have allocated node!"); + + unsigned short MSB; + #if GCC3_4_EVENTUALLY + MSB = 16 - ::__builtin_clz(Flags); + #else + for (MSB = 15; (Flags & (1U << MSB)) == 0; --MSB) + /*empty*/; + #endif + + assert((1U << MSB) & Flags); // The bit should be set + assert((~(1U << MSB) & Flags) < Flags);// Removing it should make flag smaller + ScanIdx = CurWord*16 + MSB; + assert(isNodeAllocated(ScanIdx)); + return ScanIdx; + } + + + //===----------------------------------------------------------------------===// + // + // Pool allocator library implementation + // + //===----------------------------------------------------------------------===// + + // poolinit - Initialize a pool descriptor to empty + // + void poolinit(PoolTy *Pool, unsigned NodeSize) { + assert(Pool && "Null pool pointer passed into poolinit!\n"); + DEBUG(printf("pool init %x, %d\n", Pool, NodeSize);) + + // Ensure the page manager is initialized + InitializePageManager(); + + // We must alway return unique pointers, even if they asked for 0 bytes + Pool->NodeSize = NodeSize ? NodeSize : 1; + Pool->Ptr1 = Pool->Ptr2 = 0; + Pool->LargeArrays = 0; + // For SAFECode, we set FreeablePool to 0 always + // Pool->FreeablePool = 0; + Pool->AllocadPool = -1; + Pool->lastUsed = 0; + Pool->prevPage[0] = 0; + Pool->prevPage[1] = 0; + // Initialize the SlabAddressArray to zero + for (int i = 0; i < AddrArrSize; ++i) { + Pool->SlabAddressArray[i] = 0; + } + + Pool->NumSlabs = 0; + + /// Pool->Slabs = new hash_set; + // Call hash_set constructor explicitly + // void *SlabPtr = &Pool->Slabs; + // new (SlabPtr) hash_set; + } + + void poolmakeunfreeable(PoolTy *Pool) { + assert(Pool && "Null pool pointer passed in to poolmakeunfreeable!\n"); + // Pool->FreeablePool = 0; + } + + // pooldestroy - Release all memory allocated for a pool + // + void pooldestroy(PoolTy *Pool) { + assert(Pool && "Null pool pointer passed in to pooldestroy!\n"); + if (Pool->AllocadPool) return; + + if (Pool->NumSlabs > AddrArrSize) { + Pool->Slabs->clear(); + delete Pool->Slabs; + } + + // Free any partially allocated slabs + PoolSlab *PS = (PoolSlab*)Pool->Ptr1; + while (PS) { + PoolSlab *Next = PS->Next; + PS->destroy(); + PS = Next; + } + + // Free the completely allocated slabs + PS = (PoolSlab*)Pool->Ptr2; + while (PS) { + PoolSlab *Next = PS->Next; + PS->destroy(); + PS = Next; + } + + // Free the large arrays + PS = (PoolSlab*)Pool->LargeArrays; + while (PS) { + PoolSlab *Next = PS->Next; + PS->destroy(); + PS = Next; + } + + } + + + // poolallocarray - a helper function used to implement poolalloc, when the + // number of nodes to allocate is not 1. + static void *poolallocarray(PoolTy* Pool, unsigned Size) { + assert(Pool && "Null pool pointer passed into poolallocarray!\n"); + if (Size > PoolSlab::getSlabSize(Pool)) + return PoolSlab::createSingleArray(Pool, Size); + + PoolSlab *PS = (PoolSlab*)Pool->Ptr1; + + // Loop through all of the slabs looking for one with an opening + for (; PS; PS = PS->Next) { + int Element = PS->allocateMultiple(Size); + if (Element != -1) { + // We allocated an element. Check to see if this slab has been completely + // filled up. If so, move it to the Ptr2 list. + if (PS->isFull()) { + PS->unlinkFromList(); + PS->addToList((PoolSlab**)&Pool->Ptr2); + } + return PS->getElementAddress(Element, Pool->NodeSize); + } + } + + PoolSlab *New = PoolSlab::create(Pool); + // printf("new slab created %x \n", New); + if (Pool->NumSlabs > AddrArrSize) + Pool->Slabs->insert((void *)New); + else if (Pool->NumSlabs == AddrArrSize) { + // Create the hash_set + Pool->Slabs = new hash_set; + Pool->Slabs->insert((void *)New); + for (unsigned i = 0; i < AddrArrSize; ++i) + Pool->Slabs->insert((void *)Pool->SlabAddressArray[i]); + } else { + // Insert it in the array + Pool->SlabAddressArray[Pool->NumSlabs] = (unsigned) New; + } + Pool->NumSlabs++; + + int Idx = New->allocateMultiple(Size); + assert(Idx == 0 && "New allocation didn't return zero'th node?"); + return New->getElementAddress(0, 0); + } + + void poolregister(PoolTy *Pool, unsigned NumBytes, void * allocaptr) { + if (!Pool) { + abort(); + printf("Null pool pointer passed in to poolalloc!\n"); + exit(-1); + } + if (Pool->AllocadPool != -1) { + if (Pool->AllocadPool == 0) { + printf(" Handle this case later\n"); + exit(-1); + } else { + printf(" An allocad pool, you can only allocate once \n"); + exit(-1); + } + } else { + Pool->AllocadPool = NumBytes; + Pool->allocaptr = allocaptr; + } + } + + //Pool->AllocadPool -1 : unused so far + //Pool->AllocadPool 0 : used only for mallocs + //Pool->AllocadPool >0 : used for only allocas indicating the size + void *poolalloc(PoolTy *Pool, unsigned NumBytes) { + void *retAddress = NULL; + if (!Pool) { + printf("Null pool pointer passed in to poolalloc!, FAILING\n"); + exit(-1); + } + if (Pool->AllocadPool != -1) { + if (Pool->AllocadPool != 0) { + printf(" Did not Handle this case, an alloa and malloc point to"); + printf("same DSNode, Will happen in stack safety \n"); + exit(-1); + } + } else { + Pool->AllocadPool = 0; + } + + unsigned NodeSize = Pool->NodeSize; + unsigned NodesToAllocate = (NumBytes+NodeSize-1)/NodeSize; + if (NodesToAllocate > 1) { + retAddress = poolallocarray(Pool, NodesToAllocate); + return retAddress; + } + + // Special case the most common situation, where a single node is being + // allocated. + PoolSlab *PS = (PoolSlab*)Pool->Ptr1; + + if (__builtin_expect(PS != 0, 1)) { + int Element = PS->allocateSingle(); + if (__builtin_expect(Element != -1, 1)) { + // We allocated an element. Check to see if this slab has been + // completely filled up. If so, move it to the Ptr2 list. + if (__builtin_expect(PS->isFull(), false)) { + PS->unlinkFromList(); + PS->addToList((PoolSlab**)&Pool->Ptr2); + } + retAddress = PS->getElementAddress(Element, NodeSize); + // printf(" returning the address %x",retAddress); + return retAddress; + } + + // Loop through all of the slabs looking for one with an opening + for (PS = PS->Next; PS; PS = PS->Next) { + int Element = PS->allocateSingle(); + if (Element != -1) { + // We allocated an element. Check to see if this slab has been + // completely filled up. If so, move it to the Ptr2 list. + if (PS->isFull()) { + PS->unlinkFromList(); + PS->addToList((PoolSlab**)&Pool->Ptr2); + } + + retAddress = PS->getElementAddress(Element, NodeSize); + // printf(" returning the address %x",retAddress); + return retAddress; + } + } + } + + // Otherwise we must allocate a new slab and add it to the list + PoolSlab *New = PoolSlab::create(Pool); + + if (Pool->NumSlabs > AddrArrSize) + Pool->Slabs->insert((void *)New); + else if (Pool->NumSlabs == AddrArrSize) { + // Create the hash_set + Pool->Slabs = new hash_set; + Pool->Slabs->insert((void *)New); + for (unsigned i = 0; i < AddrArrSize; ++i) + Pool->Slabs->insert((void *)Pool->SlabAddressArray[i]); + } else { + // Insert it in the array + Pool->SlabAddressArray[Pool->NumSlabs] = (unsigned) New; + } + Pool->NumSlabs++; + + int Idx = New->allocateSingle(); + assert(Idx == 0 && "New allocation didn't return zero'th node?"); + retAddress = New->getElementAddress(0, 0); + // printf(" returning the address %x",retAddress); + return retAddress; + } + + /* + // SearchForContainingSlab - This implementation uses the hash_set as well + // as the array to search the list of allocated slabs for the node in question + static PoolSlab *SearchForContainingSlab(PoolTy *Pool, void *Node, + unsigned &TheIndex) { + // printf("in pool check for pool %x, node %x\n",Pool,Node); + unsigned NodeSize = Pool->NodeSize; + void *PS; + if (!Pool) { + printf("Empty Pool in pool check FAILING \n"); + exit(-1); + } + assert (Pool->AllocadPool <= 0 && "SearchForContainingSlab not to be called" + " for alloca'ed pools"); + + PS = (void*)((long)Node & ~(PageSize-1)); + if (Pool->NumSlabs > AddrArrSize) { + hash_set &theSlabs = *Pool->Slabs; + if (theSlabs.find(PS) == theSlabs.end()) { + // Check the LargeArrays + if (Pool->LargeArrays) { + PoolSlab *PSlab = (PoolSlab*) Pool->LargeArrays; + unsigned Idx = -1; + while (PSlab) { + assert(PSlab && "poolcheck: node being free'd not found in " + "allocation pool specified!\n"); + Idx = PSlab->containsElement(Node, NodeSize); + if (Idx != -1) break; + PSlab = PSlab->Next; + } + if (Idx == -1) { + printf("poolcheck: node being checked not found in pool \n"); + abort(); + } + TheIndex = Idx; + return PSlab; + } else { + printf("poolcheck: node being checked not found in pool \n"); + abort(); + } + } else { + // Check that Node does not point to PoolSlab meta-data + if ((PoolSlab *)PS->getElementAddress(0,0) > (long) Node) { + printf("poolcheck: node being checked points to meta-data \n"); + abort(); + } + TheIndex = PS->containsElement(Node, NodeSize); + return (PoolSlab *)PS; + } + } else { + bool found; + for (unsigned i = 0; i < AddrArrSize && !found; ++i) { + if (Pool->SlabAddressArray[i] == (unsigned) PS) + found = true; + } + + if (found) { + // Check that Node does not point to PoolSlab meta-data + if ((PoolSlab *)PS->getElementAddress(0,0) > (long) Node) { + printf("poolcheck: node being checked points to meta-data \n"); + abort(); + } + TheIndex = PS->containsElement(Node, NodeSize); + return (PoolSlab *)PS; + } else { + // Check the LargeArrays + if (Pool->LargeArrays) { + PoolSlab *PSlab = (PoolSlab*) Pool->LargeArrays; + unsigned Idx = -1; + while (PSlab) { + assert(PSlab && "poolcheck: node being free'd not found in " + "allocation pool specified!\n"); + Idx = PSlab->containsElement(Node, NodeSize); + if (Idx != -1) break; + PSlab = PSlab->Next; + } + if (Idx == -1) { + printf("poolcheck: node being checked not found in pool \n"); + abort(); + } + TheIndex = Idx; + return PSlab; + } + printf("poolcheck: node being checked not found in pool \n"); + abort(); + } + } + } + */ + + // SearchForContainingSlab - Do a brute force search through the list of + // allocated slabs for the node in question. + // + static PoolSlab *SearchForContainingSlab(PoolTy *Pool, void *Node, + unsigned &TheIndex) { + PoolSlab *PS = (PoolSlab*)Pool->Ptr1; + unsigned NodeSize = Pool->NodeSize; + + // Search the partially allocated slab list for the slab that contains this + // node. + int Idx = -1; + if (PS) { // Pool->Ptr1 could be null if Ptr2 isn't + for (; PS; PS = PS->Next) { + Idx = PS->containsElement(Node, NodeSize); + if (Idx != -1) break; + } + } + + // If the partially allocated slab list doesn't contain it, maybe the + // completely allocated list does. + if (PS == 0) { + PS = (PoolSlab*)Pool->Ptr2; + assert(Idx == -1 && "Found node but don't have PS?"); + + while (PS) { + assert(PS && "poolfree: node being free'd not found in allocation " + " pool specified!\n"); + Idx = PS->containsElement(Node, NodeSize); + if (Idx != -1) break; + PS = PS->Next; + } + } + + // Otherwise, maybe its a block within LargeArrays + if(PS == 0) { + PS = (PoolSlab*)Pool->LargeArrays; + assert(Idx == -1 && "Found node but don't have PS?"); + + while (PS) { + assert(PS && "poolfree: node being free'd not found in allocation " + " pool specified!\n"); + Idx = PS->containsElement(Node, NodeSize); + if (Idx != -1) break; + PS = PS->Next; + } + } + + TheIndex = Idx; + return PS; + } + + void poolcheckoptim(PoolTy *Pool, void *Node) { + if (Pool->AllocadPool > 0) { + if (Pool->allocaptr <= Node) { + unsigned diffPtr = (unsigned)Node - (unsigned)Pool->allocaptr; + unsigned offset = diffPtr % Pool->NodeSize; + if ((diffPtr < Pool->AllocadPool ) && (offset >= 0)) + return; + } + PCheckPassed = 0; + abort(); + } + + PoolSlab *PS = (PoolSlab*)((long)Node & ~(PageSize-1)); + + if (Pool->NumSlabs > AddrArrSize) { + hash_set &theSlabs = *Pool->Slabs; + if (theSlabs.find((void*)PS) == theSlabs.end()) { + // Check the LargeArrays + if (Pool->LargeArrays) { + PoolSlab *PSlab = (PoolSlab*) Pool->LargeArrays; + int Idx = -1; + while (PSlab) { + assert(PSlab && "poolcheck: node being free'd not found in " + "allocation pool specified!\n"); + Idx = PSlab->containsElement(Node, Pool->NodeSize); + if (Idx != -1) { + Pool->prevPage[Pool->lastUsed] = PS; + Pool->lastUsed = (Pool->lastUsed + 1) % 4; + break; + } + PSlab = PSlab->Next; + } + + if (Idx == -1) { + printf("poolcheck1: node being checked not found in pool with right" + " alignment\n"); + PCheckPassed = 0; + abort(); + exit(-1); + } else { + //exit(-1); + } + } else { + printf("poolcheck2: node being checked not found in pool with right" + " alignment\n"); + abort(); + exit(-1); + } + } else { + unsigned long startaddr = (unsigned long)PS->getElementAddress(0,0); + if (startaddr > (unsigned long) Node) { + printf("poolcheck: node being checked points to meta-data \n"); + abort(); + } + unsigned long offset = ((unsigned long) Node - (unsigned long) startaddr) % Pool->NodeSize; + if (offset != 0) { + printf("poolcheck3: node being checked does not have right alignment\n"); + abort(); + } + Pool->prevPage[Pool->lastUsed] = PS; + Pool->lastUsed = (Pool->lastUsed + 1) % 4; + } + } else { + bool found = false; + for (unsigned i = 0; i < AddrArrSize && !found; ++i) { + if ((unsigned)Pool->SlabAddressArray[i] == (unsigned) PS) { + found = true; + Pool->prevPage[Pool->lastUsed] = PS; + Pool->lastUsed = (Pool->lastUsed + 1) % 4; + } + } + + if (found) { + // Check that Node does not point to PoolSlab meta-data + unsigned long startaddr = (unsigned long)PS->getElementAddress(0,0); + if (startaddr > (unsigned long) Node) { + printf("poolcheck: node being checked points to meta-data \n"); + exit(-1); + } + unsigned long offset = ((unsigned long) Node - (unsigned long) startaddr) % Pool->NodeSize; + if (offset != 0) { + printf("poolcheck4: node being checked does not have right alignment\n"); + abort(); + } + } else { + // Check the LargeArrays + if (Pool->LargeArrays) { + PoolSlab *PSlab = (PoolSlab*) Pool->LargeArrays; + int Idx = -1; + while (PSlab) { + assert(PSlab && "poolcheck: node being free'd not found in " + "allocation pool specified!\n"); + Idx = PSlab->containsElement(Node, Pool->NodeSize); + if (Idx != -1) { + Pool->prevPage[Pool->lastUsed] = PS; + Pool->lastUsed = (Pool->lastUsed + 1) % 4; + break; + } + PSlab = PSlab->Next; + } + if (Idx == -1) { + printf("poolcheck6: node being checked not found in pool with right" + " alignment\n"); + abort(); + } + } else { + printf("poolcheck5: node being checked not found in pool with right" + " alignment %x %x\n",Pool,Node); + abort(); + } + } + } + } + + void poolcheck(PoolTy *Pool, void *Node) { + PoolSlab *PS; + PS = (PoolSlab*)((long)Node & ~(PageSize-1)); + if (Pool->prevPage[0] == PS) { + return; + } + if (Pool->prevPage[1] == PS) { + return; + } + if (Pool->prevPage[2] == PS) { + return; + } + if (Pool->prevPage[3] == PS) { + return; + } + poolcheckoptim(Pool, Node); + } + + + + // Check that Node falls within the pool and within start and (including) + // end offset + void poolcheckalign(PoolTy *Pool, void *Node, unsigned StartOffset, + unsigned EndOffset) { + PoolSlab *PS; + if (StartOffset >= Pool->NodeSize || EndOffset >= Pool->NodeSize) { + printf("Error: Offset specified exceeded node size"); + exit(-1); + } + + if (Pool->AllocadPool > 0) { + if (Pool->allocaptr <= Node) { + unsigned diffPtr = (unsigned)Node - (unsigned)Pool->allocaptr; + unsigned offset = diffPtr % Pool->NodeSize; + if ((diffPtr < Pool->AllocadPool ) && (offset >= StartOffset) && + (offset <= EndOffset)) + return; + } + assert(0 && "poolcheckalign failure FAILING \n"); + exit(-1); + } + + PS = (PoolSlab*)((long)Node & ~(PageSize-1)); + + if (Pool->NumSlabs > AddrArrSize) { + hash_set &theSlabs = *Pool->Slabs; + if (theSlabs.find((void*)PS) == theSlabs.end()) { + // Check the LargeArrays + if (Pool->LargeArrays) { + PoolSlab *PSlab = (PoolSlab*) Pool->LargeArrays; + int Idx = -1; + while (PSlab) { + assert(PSlab && "poolcheck: node being free'd not found in " + "allocation pool specified!\n"); + Idx = PSlab->containsElement(Node, Pool->NodeSize); + if (Idx != -1) { + Pool->prevPage[Pool->lastUsed] = PS; + Pool->lastUsed = (Pool->lastUsed + 1) % 4; + break; + } + PSlab = PSlab->Next; + } + + if (Idx == -1) { + printf("poolcheck1: node being checked not found in pool with right" + " alignment\n"); + abort(); + exit(-1); + } else { + //exit(-1); + } + } else { + printf("poolcheck2: node being checked not found in pool with right" + " alignment\n"); + abort(); + exit(-1); + } + } else { + unsigned long startaddr = (unsigned long)PS->getElementAddress(0,0); + if (startaddr > (unsigned long) Node) { + printf("poolcheck: node being checked points to meta-data \n"); + abort(); + exit(-1); + } + unsigned long offset = ((unsigned long) Node - (unsigned long) startaddr) % Pool->NodeSize; + if ((offset < StartOffset) || (offset > EndOffset)) { + printf("poolcheck3: node being checked does not have right alignment\n"); + abort(); + exit(-1); + } + Pool->prevPage[Pool->lastUsed] = PS; + Pool->lastUsed = (Pool->lastUsed + 1) % 4; + } + } else { + bool found = false; + for (unsigned i = 0; i < AddrArrSize && !found; ++i) { + if ((unsigned)Pool->SlabAddressArray[i] == (unsigned) PS) { + found = true; + Pool->prevPage[Pool->lastUsed] = PS; + Pool->lastUsed = (Pool->lastUsed + 1) % 4; + } + } + + if (found) { + // Check that Node does not point to PoolSlab meta-data + unsigned long startaddr = (unsigned long)PS->getElementAddress(0,0); + if (startaddr > (unsigned long) Node) { + printf("poolcheck: node being checked points to meta-data \n"); + exit(-1); + } + unsigned long offset = ((unsigned long) Node - (unsigned long) startaddr) % Pool->NodeSize; + if ((offset < StartOffset) || (offset > EndOffset)) { + printf("poolcheck4: node being checked does not have right alignment\n"); + abort(); + exit(-1); + } + } else { + // Check the LargeArrays + if (Pool->LargeArrays) { + PoolSlab *PSlab = (PoolSlab*) Pool->LargeArrays; + int Idx = -1; + while (PSlab) { + assert(PSlab && "poolcheck: node being free'd not found in " + "allocation pool specified!\n"); + Idx = PSlab->containsElement(Node, Pool->NodeSize); + if (Idx != -1) { + Pool->prevPage[Pool->lastUsed] = PS; + Pool->lastUsed = (Pool->lastUsed + 1) % 4; + break; + } + PSlab = PSlab->Next; + } + if (Idx == -1) { + printf("poolcheck6: node being checked not found in pool with right" + " alignment\n"); + abort(); + exit(-1); + } + } else { + printf("poolcheck5: node being checked not found in pool with right" + " alignment %x %x\n",Pool,Node); + abort(); + } + } + } + + } + + + /* + void poolcheck(PoolTy *Pool, void *Node) { + PoolSlab *PS = (PoolSlab*)Pool->Ptr1; + unsigned NodeSize = Pool->NodeSize; + + // Search the partially allocated slab list for the slab that contains this + // node. + int Idx = -1; + if (PS) { // Pool->Ptr1 could be null if Ptr2 isn't + for (; PS; PS = PS->Next) { + Idx = PS->containsElement(Node, NodeSize); + if (Idx != -1) break; + } + } + + // If the partially allocated slab list doesn't contain it, maybe the + // completely allocated list does. + if (PS == 0) { + PS = (PoolSlab*)Pool->Ptr2; + while (1) { + assert(PS && "poolcheck: node being checked not found in pool " + " specified!\n"); + Idx = PS->containsElement(Node, NodeSize); + if (Idx != -1) break; + PS = PS->Next; + } + } + } + */ + + void poolfree(PoolTy *Pool, void *Node) { + assert(Pool && "Null pool pointer passed in to poolfree!\n"); + DEBUG(printf("poolfree %x %x \n",Pool,Node);) + PoolSlab *PS; + int Idx; + if (1) { // THIS SHOULD BE SET FOR SAFECODE! + unsigned TheIndex; + PS = SearchForContainingSlab(Pool, Node, TheIndex); + Idx = TheIndex; + } else { + // Since it is undefined behavior to free a node which has not been + // allocated, we know that the pointer coming in has to be a valid node + // pointer in the pool. Mask off some bits of the address to find the base + // of the pool. + assert((PageSize & PageSize-1) == 0 && "Page size is not a power of 2??"); + PS = (PoolSlab*)((long)Node & ~(PageSize-1)); + + if (PS->isSingleArray) { + PS->unlinkFromList(); + PS->destroy(); + return; + } + + Idx = PS->containsElement(Node, Pool->NodeSize); + assert((int)Idx != -1 && "Node not contained in slab??"); + } + + // If PS was full, it must have been in list #2. Unlink it and move it to + // list #1. + if (PS->isFull()) { + // Now that we found the node, we are about to free an element from it. + // This will make the slab no longer completely full, so we must move it to + // the other list! + PS->unlinkFromList(); // Remove it from the Ptr2 list. + + PoolSlab **InsertPosPtr = (PoolSlab**)&Pool->Ptr1; + + // If the partially full list has an empty node sitting at the front of the + // list, insert right after it. + if ((*InsertPosPtr)->isEmpty()) + InsertPosPtr = &(*InsertPosPtr)->Next; + + PS->addToList(InsertPosPtr); // Insert it now in the Ptr1 list. + } + + // Free the actual element now! + PS->freeElement(Idx); + + // Ok, if this slab is empty, we unlink it from the of slabs and either move + // it to the head of the list, or free it, depending on whether or not there + // is already an empty slab at the head of the list. + // + if (PS->isEmpty()) { + PS->unlinkFromList(); // Unlink from the list of slabs... + + // If we can free this pool, check to see if there are any empty slabs at + // the start of this list. If so, delete the FirstSlab! + PoolSlab *FirstSlab = (PoolSlab*)Pool->Ptr1; + if (0 && FirstSlab && FirstSlab->isEmpty()) { + // Here we choose to delete FirstSlab instead of the pool we just freed + // from because the pool we just freed from is more likely to be in the + // processor cache. + FirstSlab->unlinkFromList(); + FirstSlab->destroy(); + // Pool->Slabs.erase((void *)FirstSlab); + } + + // Link our slab onto the head of the list so that allocations will find it + // efficiently. + PS->addToList((PoolSlab**)&Pool->Ptr1); + } + } From dhurjati at cs.uiuc.edu Thu Dec 22 10:50:56 2005 From: dhurjati at cs.uiuc.edu (Dinakar Dhurjati) Date: Thu, 22 Dec 2005 10:50:56 -0600 Subject: [llvm-commits] CVS: llvm-poolalloc/runtime/SafePoolAllocator/PageManager.cpp Message-ID: <200512221650.KAA14054@zion.cs.uiuc.edu> Changes in directory llvm-poolalloc/runtime/SafePoolAllocator: PageManager.cpp added (r1.1) --- Log message: *** empty log message *** --- Diffs of the changes: (+128 -0) PageManager.cpp | 128 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 128 insertions(+) Index: llvm-poolalloc/runtime/SafePoolAllocator/PageManager.cpp diff -c /dev/null llvm-poolalloc/runtime/SafePoolAllocator/PageManager.cpp:1.1 *** /dev/null Thu Dec 22 10:50:54 2005 --- llvm-poolalloc/runtime/SafePoolAllocator/PageManager.cpp Thu Dec 22 10:50:44 2005 *************** *** 0 **** --- 1,128 ---- + //===- PageManager.cpp - Implementation of the page allocator -------------===// + // + // The LLVM Compiler Infrastructure + // + // This file was developed by the LLVM research group and is distributed under + // the University of Illinois Open Source License. See LICENSE.TXT for details. + // + //===----------------------------------------------------------------------===// + // + // This file implements the PageManager.h interface. + // + //===----------------------------------------------------------------------===// + + #include "PageManager.h" + #ifndef _POSIX_MAPPED_FILES + #define _POSIX_MAPPED_FILES + #endif + #include + #include "poolalloc/Support/MallocAllocator.h" + #include "poolalloc/MMAPSupport.h" + #include + #include + #include + // Define this if we want to use memalign instead of mmap to get pages. + // Empirically, this slows down the pool allocator a LOT. + #define USE_MEMALIGN 0 + extern "C" { + unsigned PageSize = 0; + } + extern unsigned poolmemusage; + void InitializePageManager() { + if (!PageSize) { + PageSize = 32 * sysconf(_SC_PAGESIZE) ; + } + } + + #if !USE_MEMALIGN + static void *GetPages(unsigned NumPages) { + #if defined(i386) || defined(__i386__) || defined(__x86__) + /* Linux and *BSD tend to have these flags named differently. */ + #if defined(MAP_ANON) && !defined(MAP_ANONYMOUS) + # define MAP_ANONYMOUS MAP_ANON + #endif /* defined(MAP_ANON) && !defined(MAP_ANONYMOUS) */ + #elif defined(sparc) || defined(__sparc__) || defined(__sparcv9) + /* nothing */ + #else + std::cerr << "This architecture is not supported by the pool allocator!\n"; + abort(); + #endif + + #if defined(__linux__) + #define fd 0 + #else + #define fd -1 + #endif + void *Addr; + //MMAP DOESNOT WORK !!!!!!!! + // Addr = mmap(0, NumPages*PageSize, PROT_READ|PROT_WRITE, + // MAP_SHARED|MAP_ANONYMOUS, fd, 0); + // void *pa = malloc(NumPages * PageSize); + // assert(Addr != MAP_FAILED && "MMAP FAILED!"); + if (posix_memalign(&Addr, PageSize, NumPages*PageSize) != 0){ + assert(1 && "memalign failed \n"); + } + poolmemusage += NumPages * PageSize; + memset(Addr, 0xcc, NumPages *PageSize); + return Addr; + } + #endif + + // Explicitly use the malloc allocator here, to avoid depending on the C++ + // runtime library. + typedef std::vector > FreePagesListType; + + static FreePagesListType &getFreePageList() { + static FreePagesListType *FreePages = 0; + + if (!FreePages) { + // Avoid using operator new! + FreePages = (FreePagesListType*)malloc(sizeof(FreePagesListType)); + // Use placement new now. + // new (FreePages) std::vector >(); + } + return *FreePages; + } + + /// AllocatePage - This function returns a chunk of memory with size and + /// alignment specified by PageSize. + void *AllocatePage() { + + FreePagesListType &FPL = getFreePageList(); + + if (!FPL.empty()) { + void *Result = FPL.back(); + FPL.pop_back(); + return Result; + } + + // Allocate several pages, and put the extras on the freelist... + unsigned NumToAllocate = 8; + char *Ptr = (char*)GetPages(NumToAllocate); + + for (unsigned i = 1; i != NumToAllocate; ++i) + FPL.push_back(Ptr+i*PageSize); + return Ptr; + } + + void *AllocateNPages(unsigned Num) { + if (Num <= 1) return AllocatePage(); + return GetPages(Num); + } + + /// FreePage - This function returns the specified page to the pagemanager for + /// future allocation. + #define THRESHOLD 5 + void FreePage(void *Page) { + FreePagesListType &FPL = getFreePageList(); + FPL.push_back(Page); + //munmap(Page, 1); + /* + if (FPL.size() > THRESHOLD) { + // printf( "pool allocator : reached a threshold \n"); + // exit(-1); + munmap(Page, PageSize); + poolmemusage -= PageSize; + } + */ + } From dhurjati at cs.uiuc.edu Thu Dec 22 10:51:21 2005 From: dhurjati at cs.uiuc.edu (Dinakar Dhurjati) Date: Thu, 22 Dec 2005 10:51:21 -0600 Subject: [llvm-commits] CVS: llvm-poolalloc/runtime/SafePoolAllocator/PageManager.h Message-ID: <200512221651.KAA14096@zion.cs.uiuc.edu> Changes in directory llvm-poolalloc/runtime/SafePoolAllocator: PageManager.h added (r1.1) --- Log message: *** empty log message *** --- Diffs of the changes: (+40 -0) PageManager.h | 40 ++++++++++++++++++++++++++++++++++++++++ 1 files changed, 40 insertions(+) Index: llvm-poolalloc/runtime/SafePoolAllocator/PageManager.h diff -c /dev/null llvm-poolalloc/runtime/SafePoolAllocator/PageManager.h:1.1 *** /dev/null Thu Dec 22 10:51:19 2005 --- llvm-poolalloc/runtime/SafePoolAllocator/PageManager.h Thu Dec 22 10:51:09 2005 *************** *** 0 **** --- 1,40 ---- + //===- PageManager.h - Allocates memory on page boundaries ------*- C++ -*-===// + // + // The LLVM Compiler Infrastructure + // + // This file was developed by the LLVM research group and is distributed under + // the University of Illinois Open Source License. See LICENSE.TXT for details. + // + //===----------------------------------------------------------------------===// + // + // This file defines the interface used by the pool allocator to allocate memory + // on large alignment boundaries. + // + //===----------------------------------------------------------------------===// + + #ifndef PAGEMANAGER_H + #define PAGEMANAGER_H + + /// InitializePageManager - This function must be called before any other page + /// manager accesses are performed. It may be called multiple times. + /// + void InitializePageManager(); + + /// PageSize - Contains the size of the unit of memory allocated by + /// AllocatePage. This is a value that is typically several kilobytes in size, + /// and is guaranteed to be a power of two. + /// + extern unsigned PageSize; + + /// AllocatePage - This function returns a chunk of memory with size and + /// alignment specified by getPageSize(). + void *AllocatePage(); + + /// AllocateNPages - + void *AllocateNPages(unsigned Num); + + /// FreePage - This function returns the specified page to the pagemanager for + /// future allocation. + void FreePage(void *Page); + + #endif From dhurjati at cs.uiuc.edu Thu Dec 22 10:52:11 2005 From: dhurjati at cs.uiuc.edu (Dinakar Dhurjati) Date: Thu, 22 Dec 2005 10:52:11 -0600 Subject: [llvm-commits] CVS: llvm-poolalloc/runtime/Makefile Message-ID: <200512221652.KAA14157@zion.cs.uiuc.edu> Changes in directory llvm-poolalloc/runtime: Makefile updated: 1.8 -> 1.9 --- Log message: added safecode runtime --- Diffs of the changes: (+1 -1) Makefile | 2 +- 1 files changed, 1 insertion(+), 1 deletion(-) Index: llvm-poolalloc/runtime/Makefile diff -u llvm-poolalloc/runtime/Makefile:1.8 llvm-poolalloc/runtime/Makefile:1.9 --- llvm-poolalloc/runtime/Makefile:1.8 Wed May 18 14:56:29 2005 +++ llvm-poolalloc/runtime/Makefile Thu Dec 22 10:51:59 2005 @@ -6,6 +6,6 @@ # # List all of the subdirectories that we will compile. # -DIRS=PoolAllocator FreeListAllocator FL2Allocator +DIRS=SafePoolAllocator PoolAllocator FreeListAllocator FL2Allocator include $(LEVEL)/Makefile.common From lattner at cs.uiuc.edu Thu Dec 22 11:19:40 2005 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Thu, 22 Dec 2005 11:19:40 -0600 Subject: [llvm-commits] CVS: llvm/lib/Target/PowerPC/README.txt Message-ID: <200512221719.LAA14544@zion.cs.uiuc.edu> Changes in directory llvm/lib/Target/PowerPC: README.txt updated: 1.40 -> 1.41 --- Log message: move some random notes out of my email into someplace useful --- Diffs of the changes: (+32 -0) README.txt | 32 ++++++++++++++++++++++++++++++++ 1 files changed, 32 insertions(+) Index: llvm/lib/Target/PowerPC/README.txt diff -u llvm/lib/Target/PowerPC/README.txt:1.40 llvm/lib/Target/PowerPC/README.txt:1.41 --- llvm/lib/Target/PowerPC/README.txt:1.40 Thu Dec 8 01:13:28 2005 +++ llvm/lib/Target/PowerPC/README.txt Thu Dec 22 11:19:28 2005 @@ -241,3 +241,35 @@ --> important for C++. +===-------------------------------------------------------------------------=== + +int test3(int a, int b) { return (a < 0) ? a : 0; } + +should be branch free code. LLVM is turning it into < 1 because of the RHS. + +===-------------------------------------------------------------------------=== + +For this testcase: +int f1(int a, int b) { return (a&0xF)|(b&0xF0); } + +We currently emit: +_f1: + rlwinm r2, r4, 0, 24, 27 + rlwimi r2, r3, 0, 28, 31 + or r3, r2, r2 + blr + +We could emit: +_f1: + rlwinm r4, r4, 0, 24, 27 + rlwimi r3, r4, 0, 0, 27 + blr + +===-------------------------------------------------------------------------=== + +No loads or stores of the constants should be needed: + +struct foo { double X, Y; }; +void xxx(struct foo F); +void bar() { struct foo R = { 1.0, 2.0 }; xxx(R); } + From dhurjati at cs.uiuc.edu Thu Dec 22 11:49:45 2005 From: dhurjati at cs.uiuc.edu (Dinakar Dhurjati) Date: Thu, 22 Dec 2005 11:49:45 -0600 Subject: [llvm-commits] CVS: llvm-poolalloc/lib/PoolAllocate/TransformFunctionBody.cpp Message-ID: <200512221749.LAA14934@zion.cs.uiuc.edu> Changes in directory llvm-poolalloc/lib/PoolAllocate: TransformFunctionBody.cpp updated: 1.48 -> 1.49 --- Log message: *** empty log message *** --- Diffs of the changes: (+2 -4) TransformFunctionBody.cpp | 6 ++---- 1 files changed, 2 insertions(+), 4 deletions(-) Index: llvm-poolalloc/lib/PoolAllocate/TransformFunctionBody.cpp diff -u llvm-poolalloc/lib/PoolAllocate/TransformFunctionBody.cpp:1.48 llvm-poolalloc/lib/PoolAllocate/TransformFunctionBody.cpp:1.49 --- llvm-poolalloc/lib/PoolAllocate/TransformFunctionBody.cpp:1.48 Thu Dec 22 10:33:29 2005 +++ llvm-poolalloc/lib/PoolAllocate/TransformFunctionBody.cpp Thu Dec 22 11:49:34 2005 @@ -592,16 +592,14 @@ #ifdef BOUNDS_CHECK if (ArgNodes[i]->isArray()) { #endif - if (1) { - //Dinakar we need pooldescriptors for allocas in the callee if it escapes + if (!isa(TheCall)) { + //Dinakar we need pooldescriptors for allocas in the callee if it escapes BasicBlock::iterator InsertPt = TheCall->getParent()->getParent()->front().begin(); Type *VoidPtrTy = PointerType::get(Type::SByteTy); ArgVal = new AllocaInst(ArrayType::get(VoidPtrTy, 16), 0, "PD", InsertPt); Value *ElSize = ConstantUInt::get(Type::UIntTy,0); Value *Align = ConstantUInt::get(Type::UIntTy,0); new CallInst(PAInfo.PoolInit, make_vector(ArgVal, ElSize, Align, 0),"", TheCall); - //UGLY HACK this won't release some memory - if (!isa(TheCall)) new CallInst(PAInfo.PoolDestroy, make_vector(ArgVal, 0), "", TheCall->getNext()); } From criswell at cs.uiuc.edu Thu Dec 22 12:04:46 2005 From: criswell at cs.uiuc.edu (John Criswell) Date: Thu, 22 Dec 2005 12:04:46 -0600 Subject: [llvm-commits] CVS: llvm-poolalloc/runtime/Makefile Message-ID: <200512221804.MAA23290@choi.cs.uiuc.edu> Changes in directory llvm-poolalloc/runtime: Makefile updated: 1.9 -> 1.10 --- Log message: Removed the SAFECode pool allocator runtime. --- Diffs of the changes: (+1 -1) Makefile | 2 +- 1 files changed, 1 insertion(+), 1 deletion(-) Index: llvm-poolalloc/runtime/Makefile diff -u llvm-poolalloc/runtime/Makefile:1.9 llvm-poolalloc/runtime/Makefile:1.10 --- llvm-poolalloc/runtime/Makefile:1.9 Thu Dec 22 10:51:59 2005 +++ llvm-poolalloc/runtime/Makefile Thu Dec 22 12:04:25 2005 @@ -6,6 +6,6 @@ # # List all of the subdirectories that we will compile. # -DIRS=SafePoolAllocator PoolAllocator FreeListAllocator FL2Allocator +DIRS=PoolAllocator FreeListAllocator FL2Allocator include $(LEVEL)/Makefile.common From lattner at cs.uiuc.edu Thu Dec 22 13:26:18 2005 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Thu, 22 Dec 2005 13:26:18 -0600 Subject: [llvm-commits] CVS: llvm/tools/analyze/AnalysisWrappers.cpp Message-ID: <200512221926.NAA17686@zion.cs.uiuc.edu> Changes in directory llvm/tools/analyze: AnalysisWrappers.cpp updated: 1.16 -> 1.17 --- Log message: Fix test/Regression/Other/2002-01-31-CallGraph.ll after the recent callgraph rework. --- Diffs of the changes: (+17 -3) AnalysisWrappers.cpp | 20 +++++++++++++++++--- 1 files changed, 17 insertions(+), 3 deletions(-) Index: llvm/tools/analyze/AnalysisWrappers.cpp diff -u llvm/tools/analyze/AnalysisWrappers.cpp:1.16 llvm/tools/analyze/AnalysisWrappers.cpp:1.17 --- llvm/tools/analyze/AnalysisWrappers.cpp:1.16 Thu Apr 21 18:59:21 2005 +++ llvm/tools/analyze/AnalysisWrappers.cpp Thu Dec 22 13:26:06 2005 @@ -20,6 +20,7 @@ #include "llvm/Module.h" #include "llvm/Pass.h" #include "llvm/Support/CallSite.h" +#include "llvm/Analysis/CallGraph.h" #include using namespace llvm; @@ -55,13 +56,26 @@ return false; } - void print(std::ostream &OS) const {} - virtual void getAnalysisUsage(AnalysisUsage &AU) const { AU.setPreservesAll(); } }; RegisterAnalysis - P2("externalfnconstants", "Print external fn callsites passed constants"); + P1("externalfnconstants", "Print external fn callsites passed constants"); + + struct CallGraphPrinter : public ModulePass { + virtual void getAnalysisUsage(AnalysisUsage &AU) const { + AU.setPreservesAll(); + AU.addRequired(); + } + virtual bool runOnModule(Module &M) { return false; } + + void print(std::ostream &OS, Module *M) const { + getAnalysis().print(OS, M); + } + }; + + RegisterAnalysis + P2("callgraph", "Print a call graph"); } From reid at x10sys.com Thu Dec 22 14:00:27 2005 From: reid at x10sys.com (Reid Spencer) Date: Thu, 22 Dec 2005 14:00:27 -0600 Subject: [llvm-commits] CVS: llvm/lib/System/Unix/Program.inc Message-ID: <200512222000.OAA17966@zion.cs.uiuc.edu> Changes in directory llvm/lib/System/Unix: Program.inc updated: 1.15 -> 1.16 --- Log message: For PR351: http://llvm.cs.uiuc.edu/PR351 : * Allow the ExecuteAndWait to return negative values if a signal is detected as the reason for the child termination. This is needed to support bugpoint detecting bad things in its child processes. --- Diffs of the changes: (+12 -7) Program.inc | 19 ++++++++++++------- 1 files changed, 12 insertions(+), 7 deletions(-) Index: llvm/lib/System/Unix/Program.inc diff -u llvm/lib/System/Unix/Program.inc:1.15 llvm/lib/System/Unix/Program.inc:1.16 --- llvm/lib/System/Unix/Program.inc:1.15 Thu Jul 7 18:21:43 2005 +++ llvm/lib/System/Unix/Program.inc Thu Dec 22 14:00:16 2005 @@ -209,17 +209,22 @@ sigaction(SIGALRM, &Old, 0); } - // If the program exited normally with a zero exit status, return success! + // Return the proper exit status. 0=success, >0 is programs' exit status, + // <0 means a signal was returned, -9999999 means the program dumped core. + int result = 0; if (WIFEXITED (status)) - return WEXITSTATUS(status); + result = WEXITSTATUS(status); else if (WIFSIGNALED(status)) - return 1; - + result = 0 - WTERMSIG(status); +#ifdef WCOREDUMP + if (WCOREDUMP(status)) + result |= 0x01000000; +#endif + return result; #else - throw std::string( - "Program::ExecuteAndWait not implemented on this platform!\n"); + return -99; #endif - return 0; + } } From reid at x10sys.com Thu Dec 22 14:03:07 2005 From: reid at x10sys.com (Reid Spencer) Date: Thu, 22 Dec 2005 14:03:07 -0600 Subject: [llvm-commits] CVS: llvm/tools/bugpoint/BugDriver.cpp BugDriver.h OptimizerDriver.cpp bugpoint.cpp Message-ID: <200512222003.OAA17993@zion.cs.uiuc.edu> Changes in directory llvm/tools/bugpoint: BugDriver.cpp updated: 1.42 -> 1.43 BugDriver.h updated: 1.41 -> 1.42 OptimizerDriver.cpp updated: 1.33 -> 1.34 bugpoint.cpp updated: 1.26 -> 1.27 --- Log message: For PR351: http://llvm.cs.uiuc.edu/PR351 : Generally, remove use of fork/exec from bugpoint in favor of the portable sys::Program::ExecuteAndWait method. This change requires two new options to bugpoint to tell it that it is running in "child" mode. In this mode, it reads its input and runs the passes. The result code signals to the parent instance of bugpoint what happened (success, fail, crash). This change should make bugpoint usable on Win32 systems. --- Diffs of the changes: (+97 -65) BugDriver.cpp | 34 ++++++++++------ BugDriver.h | 9 +++- OptimizerDriver.cpp | 110 +++++++++++++++++++++++++++------------------------- bugpoint.cpp | 9 +++- 4 files changed, 97 insertions(+), 65 deletions(-) Index: llvm/tools/bugpoint/BugDriver.cpp diff -u llvm/tools/bugpoint/BugDriver.cpp:1.42 llvm/tools/bugpoint/BugDriver.cpp:1.43 --- llvm/tools/bugpoint/BugDriver.cpp:1.42 Thu Apr 21 18:59:23 2005 +++ llvm/tools/bugpoint/BugDriver.cpp Thu Dec 22 14:02:55 2005 @@ -62,9 +62,9 @@ return Result; } -BugDriver::BugDriver(const char *toolname) +BugDriver::BugDriver(const char *toolname, bool as_child) : ToolName(toolname), ReferenceOutputFile(OutputFile), - Program(0), Interpreter(0), cbe(0), gcc(0) {} + Program(0), Interpreter(0), cbe(0), gcc(0), run_as_child(as_child) {} /// ParseInputFile - Given a bytecode or assembly input filename, parse and @@ -97,13 +97,15 @@ // Load the first input file... Program = ParseInputFile(Filenames[0]); if (Program == 0) return true; - std::cout << "Read input file : '" << Filenames[0] << "'\n"; + if (!run_as_child) + std::cout << "Read input file : '" << Filenames[0] << "'\n"; for (unsigned i = 1, e = Filenames.size(); i != e; ++i) { std::auto_ptr M(ParseInputFile(Filenames[i])); if (M.get() == 0) return true; - std::cout << "Linking in input file: '" << Filenames[i] << "'\n"; + if (!run_as_child) + std::cout << "Linking in input file: '" << Filenames[i] << "'\n"; std::string ErrorMessage; if (Linker::LinkModules(Program, M.get(), &ErrorMessage)) { std::cerr << ToolName << ": error linking in '" << Filenames[i] << "': " @@ -112,7 +114,8 @@ } } - std::cout << "*** All input ok\n"; + if (!run_as_child) + std::cout << "*** All input ok\n"; // All input files read successfully! return false; @@ -124,12 +127,21 @@ /// variables are set up from command line arguments. /// bool BugDriver::run() { - // The first thing that we must do is determine what the problem is. Does the - // optimization series crash the compiler, or does it produce illegal code? - // We make the top-level decision by trying to run all of the passes on the - // the input program, which should generate a bytecode file. If it does - // generate a bytecode file, then we know the compiler didn't crash, so try - // to diagnose a miscompilation. + // The first thing to do is determine if we're running as a child. If we are, + // then what to do is very narrow. This form of invocation is only called + // from the runPasses method to actually run those passes in a child process. + if (run_as_child) { + // Execute the passes + return runPassesAsChild(PassesToRun); + } + + // If we're not running as a child, the first thing that we must do is + // determine what the problem is. Does the optimization series crash the + // compiler, or does it produce illegal code? We make the top-level + // decision by trying to run all of the passes on the the input program, + // which should generate a bytecode file. If it does generate a bytecode + // file, then we know the compiler didn't crash, so try to diagnose a + // miscompilation. if (!PassesToRun.empty()) { std::cout << "Running selected passes on program to test for crash: "; if (runPasses(PassesToRun)) Index: llvm/tools/bugpoint/BugDriver.h diff -u llvm/tools/bugpoint/BugDriver.h:1.41 llvm/tools/bugpoint/BugDriver.h:1.42 --- llvm/tools/bugpoint/BugDriver.h:1.41 Mon Aug 1 21:16:17 2005 +++ llvm/tools/bugpoint/BugDriver.h Thu Dec 22 14:02:55 2005 @@ -47,13 +47,14 @@ AbstractInterpreter *Interpreter; // How to run the program CBE *cbe; GCC *gcc; + bool run_as_child; // FIXME: sort out public/private distinctions... friend class ReducePassList; friend class ReduceMisCodegenFunctions; public: - BugDriver(const char *toolname); + BugDriver(const char *toolname, bool as_child); const std::string &getToolName() const { return ToolName; } @@ -71,7 +72,8 @@ } /// run - The top level method that is invoked after all of the instance - /// variables are set up from command line arguments. + /// variables are set up from command line arguments. The \p as_child argument + /// indicates whether the driver is to run in parent mode or child mode. /// bool run(); @@ -249,6 +251,9 @@ return runPasses(PassesToRun, Filename, DeleteOutput); } + /// runAsChild - The actual "runPasses" guts that runs in a child process. + int runPassesAsChild(const std::vector &PassesToRun); + /// initializeExecutionEnvironment - This method is used to set up the /// environment for executing LLVM programs. /// Index: llvm/tools/bugpoint/OptimizerDriver.cpp diff -u llvm/tools/bugpoint/OptimizerDriver.cpp:1.33 llvm/tools/bugpoint/OptimizerDriver.cpp:1.34 --- llvm/tools/bugpoint/OptimizerDriver.cpp:1.33 Thu Jul 7 22:08:58 2005 +++ llvm/tools/bugpoint/OptimizerDriver.cpp Thu Dec 22 14:02:55 2005 @@ -19,10 +19,6 @@ // independent code co-exist via conditional compilation until it is verified // that the new code works correctly on Unix. -#ifdef _MSC_VER -#define PLATFORMINDEPENDENT -#endif - #include "BugDriver.h" #include "llvm/Module.h" #include "llvm/PassManager.h" @@ -30,15 +26,18 @@ #include "llvm/Bytecode/WriteBytecodePass.h" #include "llvm/Target/TargetData.h" #include "llvm/Support/FileUtilities.h" +#include "llvm/Support/CommandLine.h" #include "llvm/System/Path.h" +#include "llvm/System/Program.h" #include -#ifndef PLATFORMINDEPENDENT -#include -#include -#include -#endif using namespace llvm; +namespace { + // ChildOutput - This option captures the name of the child output file that + // is set up by the parent bugpoint process + cl::opt ChildOutput("child-output", cl::ReallyHidden); +} + /// writeProgramToFile - This writes the current "Program" to the named bytecode /// file. If an error occurs, true is returned. /// @@ -86,14 +85,14 @@ std::cout << getPassesString(PassesToRun) << "\n"; } -static void RunChild(Module *Program,const std::vector &Passes, - const std::string &OutFilename) { +int BugDriver::runPassesAsChild(const std::vector &Passes) { + std::ios::openmode io_mode = std::ios::out | std::ios::trunc | std::ios::binary; - std::ofstream OutFile(OutFilename.c_str(), io_mode); + std::ofstream OutFile(ChildOutput.c_str(), io_mode); if (!OutFile.good()) { - std::cerr << "Error opening bytecode file: " << OutFilename << "\n"; - exit(1); + std::cerr << "Error opening bytecode file: " << ChildOutput << "\n"; + return 1; } PassManager PM; @@ -115,6 +114,8 @@ // Run all queued passes. PM.run(*Program); + + return 0; } /// runPasses - Run the specified passes on Program, outputting a bytecode file @@ -128,60 +129,67 @@ bool BugDriver::runPasses(const std::vector &Passes, std::string &OutputFilename, bool DeleteOutput, bool Quiet) const{ + // setup the output file name std::cout << std::flush; sys::Path uniqueFilename("bugpoint-output.bc"); uniqueFilename.makeUnique(); OutputFilename = uniqueFilename.toString(); -#ifndef PLATFORMINDEPENDENT - pid_t child_pid; - switch (child_pid = fork()) { - case -1: // Error occurred - std::cerr << ToolName << ": Error forking!\n"; - exit(1); - case 0: // Child process runs passes. - RunChild(Program, Passes, OutputFilename); - exit(0); // If we finish successfully, return 0! - default: // Parent continues... - break; - } - - // Wait for the child process to get done. - int Status; - if (wait(&Status) != child_pid) { - std::cerr << "Error waiting for child process!\n"; - exit(1); - } + // set up the input file name + sys::Path inputFilename("bugpoint-input.bc"); + inputFilename.makeUnique(); + std::ios::openmode io_mode = std::ios::out | std::ios::trunc | + std::ios::binary; + std::ofstream InFile(inputFilename.c_str(), io_mode); + if (!InFile.good()) { + std::cerr << "Error opening bytecode file: " << inputFilename << "\n"; + return(1); + } + WriteBytecodeToFile(Program,InFile,false); + InFile.close(); + + // setup the child process' arguments + const char** args = (const char**) + alloca(sizeof(const char*)*(Passes.size()+10)); + int n = 0; + args[n++] = ToolName.c_str(); + args[n++] = "-as-child"; + args[n++] = "-child-output"; + args[n++] = OutputFilename.c_str(); + std::vector pass_args; + for (std::vector::const_iterator I = Passes.begin(), + E = Passes.end(); I != E; ++I ) + pass_args.push_back( std::string("-") + (*I)->getPassArgument() ); + for (std::vector::const_iterator I = pass_args.begin(), + E = pass_args.end(); I != E; ++I ) + args[n++] = I->c_str(); + args[n++] = inputFilename.c_str(); + args[n++] = 0; - bool ExitedOK = WIFEXITED(Status) && WEXITSTATUS(Status) == 0; -#else - bool ExitedOK = false; -#endif + sys::Path prog(sys::Program::FindProgramByName(ToolName)); + int result = sys::Program::ExecuteAndWait(prog,args); // If we are supposed to delete the bytecode file or if the passes crashed, // remove it now. This may fail if the file was never created, but that's ok. - if (DeleteOutput || !ExitedOK) + if (DeleteOutput || result != 0) sys::Path(OutputFilename).eraseFromDisk(); -#ifndef PLATFORMINDEPENDENT + // Remove the temporary input file as well + inputFilename.eraseFromDisk(); + if (!Quiet) { - if (ExitedOK) + if (result == 0) std::cout << "Success!\n"; - else if (WIFEXITED(Status)) - std::cout << "Exited with error code '" << WEXITSTATUS(Status) << "'\n"; - else if (WIFSIGNALED(Status)) - std::cout << "Crashed with signal #" << WTERMSIG(Status) << "\n"; -#ifdef WCOREDUMP - else if (WCOREDUMP(Status)) + else if (result > 0) + std::cout << "Exited with error code '" << result << "'\n"; + else if (result < 0) + std::cout << "Crashed with signal #" << abs(result) << "\n"; + if (result & 0x01000000) std::cout << "Dumped core\n"; -#endif - else - std::cout << "Failed for unknown reason!\n"; } -#endif // Was the child successful? - return !ExitedOK; + return result != 0; } Index: llvm/tools/bugpoint/bugpoint.cpp diff -u llvm/tools/bugpoint/bugpoint.cpp:1.26 llvm/tools/bugpoint/bugpoint.cpp:1.27 --- llvm/tools/bugpoint/bugpoint.cpp:1.26 Sun Oct 23 20:05:53 2005 +++ llvm/tools/bugpoint/bugpoint.cpp Thu Dec 22 14:02:55 2005 @@ -24,6 +24,13 @@ #include "llvm/System/Signals.h" using namespace llvm; +// AsChild - Specifies that this invocation of bugpoint is being generated +// from a parent process. It is not intended to be used by users so the +// option is hidden. +static cl::opt + AsChild("as-child", cl::desc("Run bugpoint as child process"), + cl::ReallyHidden); + static cl::list InputFilenames(cl::Positional, cl::OneOrMore, cl::desc("")); @@ -49,7 +56,7 @@ sys::PrintStackTraceOnErrorSignal(); sys::SetInterruptFunction(BugpointInterruptFunction); - BugDriver D(argv[0]); + BugDriver D(argv[0],AsChild); if (D.addSources(InputFilenames)) return 1; D.addPasses(PassList.begin(), PassList.end()); From lattner at cs.uiuc.edu Thu Dec 22 14:37:47 2005 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Thu, 22 Dec 2005 14:37:47 -0600 Subject: [llvm-commits] CVS: llvm/utils/TableGen/DAGISelEmitter.cpp Message-ID: <200512222037.OAA18156@zion.cs.uiuc.edu> Changes in directory llvm/utils/TableGen: DAGISelEmitter.cpp updated: 1.113 -> 1.114 --- Log message: silence some bogus gcc warnings --- Diffs of the changes: (+2 -2) DAGISelEmitter.cpp | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-) Index: llvm/utils/TableGen/DAGISelEmitter.cpp diff -u llvm/utils/TableGen/DAGISelEmitter.cpp:1.113 llvm/utils/TableGen/DAGISelEmitter.cpp:1.114 --- llvm/utils/TableGen/DAGISelEmitter.cpp:1.113 Wed Dec 21 20:35:21 2005 +++ llvm/utils/TableGen/DAGISelEmitter.cpp Thu Dec 22 14:37:36 2005 @@ -2483,7 +2483,7 @@ << " CodeGenMap[N.getValue(1)] = New.getValue(1);\n" << " return New.getValue(N.ResNo);\n" << " } else {\n" - << " SDOperand Flag;\n" + << " SDOperand Flag(0, 0);\n" << " if (N.getNumOperands() == 3) Flag = Select(N.getOperand(2));\n" << " if (Chain == N.getOperand(0) &&\n" << " (N.getNumOperands() == 2 || Flag == N.getOperand(2)))\n" @@ -2505,7 +2505,7 @@ << " Result = CurDAG->getCopyToReg(Chain, Reg, Val);\n" << " return CodeGenMap[N] = Result;\n" << " } else {\n" - << " SDOperand Flag;\n" + << " SDOperand Flag(0, 0);\n" << " if (N.getNumOperands() == 4) Flag = Select(N.getOperand(3));\n" << " if (Chain != N.getOperand(0) || Val != N.getOperand(2) ||\n" << " (N.getNumOperands() == 4 && Flag != N.getOperand(3)))\n" From reid at x10sys.com Thu Dec 22 15:07:41 2005 From: reid at x10sys.com (Reid Spencer) Date: Thu, 22 Dec 2005 15:07:41 -0600 Subject: [llvm-commits] CVS: llvm/lib/VMCore/Constants.cpp Message-ID: <200512222107.PAA18311@zion.cs.uiuc.edu> Changes in directory llvm/lib/VMCore: Constants.cpp updated: 1.139 -> 1.140 --- Log message: Fix PR409: http://llvm.cs.uiuc.edu/PR409 : Implement the suggested check to ensure that out-of-range float constants don't get accepted by LLVM accidentally. Adjust the supporting test cases as well. --- Diffs of the changes: (+3 -0) Constants.cpp | 3 +++ 1 files changed, 3 insertions(+) Index: llvm/lib/VMCore/Constants.cpp diff -u llvm/lib/VMCore/Constants.cpp:1.139 llvm/lib/VMCore/Constants.cpp:1.140 --- llvm/lib/VMCore/Constants.cpp:1.139 Fri Oct 7 00:23:36 2005 +++ llvm/lib/VMCore/Constants.cpp Thu Dec 22 15:07:29 2005 @@ -482,6 +482,9 @@ // TODO: Figure out how to test if a double can be cast to a float! case Type::FloatTyID: + float FV = float(Val); + double DV = double(FV); + return IsNAN(Val) || Val == DV; case Type::DoubleTyID: return true; // This is the largest type... } From reid at x10sys.com Thu Dec 22 15:07:42 2005 From: reid at x10sys.com (Reid Spencer) Date: Thu, 22 Dec 2005 15:07:42 -0600 Subject: [llvm-commits] CVS: llvm/test/Regression/Assembler/2004-12-06-ConstantFloatRange.ll 2004-01-22-FloatNormalization.ll Message-ID: <200512222107.PAA18315@zion.cs.uiuc.edu> Changes in directory llvm/test/Regression/Assembler: 2004-12-06-ConstantFloatRange.ll updated: 1.2 -> 1.3 2004-01-22-FloatNormalization.ll (r1.2) removed --- Log message: Fix PR409: http://llvm.cs.uiuc.edu/PR409 : Implement the suggested check to ensure that out-of-range float constants don't get accepted by LLVM accidentally. Adjust the supporting test cases as well. --- Diffs of the changes: (+0 -1) 2004-12-06-ConstantFloatRange.ll | 1 - 1 files changed, 1 deletion(-) Index: llvm/test/Regression/Assembler/2004-12-06-ConstantFloatRange.ll diff -u llvm/test/Regression/Assembler/2004-12-06-ConstantFloatRange.ll:1.2 llvm/test/Regression/Assembler/2004-12-06-ConstantFloatRange.ll:1.3 --- llvm/test/Regression/Assembler/2004-12-06-ConstantFloatRange.ll:1.2 Tue Dec 7 20:25:32 2004 +++ llvm/test/Regression/Assembler/2004-12-06-ConstantFloatRange.ll Thu Dec 22 15:07:29 2005 @@ -1,5 +1,4 @@ ; RUN: llvm-as %s -o /dev/null 2>&1 | grep "constant invalid for type" -; XFAIL: * ;; This is a testcase for PR409 From reid at x10sys.com Thu Dec 22 15:07:42 2005 From: reid at x10sys.com (Reid Spencer) Date: Thu, 22 Dec 2005 15:07:42 -0600 Subject: [llvm-commits] CVS: llvm/test/Regression/Verifier/2004-01-22-FloatNormalization.ll Message-ID: <200512222107.PAA18319@zion.cs.uiuc.edu> Changes in directory llvm/test/Regression/Verifier: 2004-01-22-FloatNormalization.ll added (r1.1) --- Log message: Fix PR409: http://llvm.cs.uiuc.edu/PR409 : Implement the suggested check to ensure that out-of-range float constants don't get accepted by LLVM accidentally. Adjust the supporting test cases as well. --- Diffs of the changes: (+6 -0) 2004-01-22-FloatNormalization.ll | 6 ++++++ 1 files changed, 6 insertions(+) Index: llvm/test/Regression/Verifier/2004-01-22-FloatNormalization.ll diff -c /dev/null llvm/test/Regression/Verifier/2004-01-22-FloatNormalization.ll:1.1 *** /dev/null Thu Dec 22 15:07:39 2005 --- llvm/test/Regression/Verifier/2004-01-22-FloatNormalization.ll Thu Dec 22 15:07:29 2005 *************** *** 0 **** --- 1,6 ---- + ; RUN: llvm-as < %s -o /dev/null -f + ; XFAIL: * + + ; make sure that invalid 'float' values are caught. + + global float 0x1 From lattner at cs.uiuc.edu Thu Dec 22 15:15:09 2005 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Thu, 22 Dec 2005 15:15:09 -0600 Subject: [llvm-commits] CVS: llvm/lib/Target/PowerPC/PPCISelPattern.cpp Message-ID: <200512222115.PAA18428@zion.cs.uiuc.edu> Changes in directory llvm/lib/Target/PowerPC: PPCISelPattern.cpp updated: 1.193 -> 1.194 --- Log message: remove dead code --- Diffs of the changes: (+0 -10) PPCISelPattern.cpp | 10 ---------- 1 files changed, 10 deletions(-) Index: llvm/lib/Target/PowerPC/PPCISelPattern.cpp diff -u llvm/lib/Target/PowerPC/PPCISelPattern.cpp:1.193 llvm/lib/Target/PowerPC/PPCISelPattern.cpp:1.194 --- llvm/lib/Target/PowerPC/PPCISelPattern.cpp:1.193 Mon Nov 28 22:59:46 2005 +++ llvm/lib/Target/PowerPC/PPCISelPattern.cpp Thu Dec 22 15:14:57 2005 @@ -1601,16 +1601,6 @@ BuildMI(BB, PPC::OR4, 2, Tmp2).addReg(Tmp1).addReg(Tmp1); } return; - case ISD::ImplicitDef: - Select(N.getOperand(0)); - Tmp1 = cast(N.getOperand(1))->getReg(); - if (N.getOperand(1).getValueType() == MVT::i32) - BuildMI(BB, PPC::IMPLICIT_DEF_GPR, 0, Tmp1); - else if (N.getOperand(1).getValueType() == MVT::f32) - BuildMI(BB, PPC::IMPLICIT_DEF_F4, 0, Tmp1); - else - BuildMI(BB, PPC::IMPLICIT_DEF_F8, 0, Tmp1); - return; case ISD::RET: switch (N.getNumOperands()) { default: From lattner at cs.uiuc.edu Thu Dec 22 15:15:29 2005 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Thu, 22 Dec 2005 15:15:29 -0600 Subject: [llvm-commits] CVS: llvm/lib/Target/PowerPC/PPCAsmPrinter.cpp Message-ID: <200512222115.PAA18461@zion.cs.uiuc.edu> Changes in directory llvm/lib/Target/PowerPC: PPCAsmPrinter.cpp updated: 1.131 -> 1.132 --- Log message: fix handling of weak linkage --- Diffs of the changes: (+2 -3) PPCAsmPrinter.cpp | 5 ++--- 1 files changed, 2 insertions(+), 3 deletions(-) Index: llvm/lib/Target/PowerPC/PPCAsmPrinter.cpp diff -u llvm/lib/Target/PowerPC/PPCAsmPrinter.cpp:1.131 llvm/lib/Target/PowerPC/PPCAsmPrinter.cpp:1.132 --- llvm/lib/Target/PowerPC/PPCAsmPrinter.cpp:1.131 Mon Dec 19 17:40:42 2005 +++ llvm/lib/Target/PowerPC/PPCAsmPrinter.cpp Thu Dec 22 15:15:17 2005 @@ -495,9 +495,8 @@ switch (I->getLinkage()) { case GlobalValue::LinkOnceLinkage: case GlobalValue::WeakLinkage: - O << ".globl " << name << '\n' - << ".weak_definition " << name << '\n' - << ".private_extern " << name << '\n'; + O << "\t.globl " << name << '\n' + << "\t.weak_definition " << name << '\n'; SwitchSection(".section __DATA,__datacoal_nt,coalesced", I); break; case GlobalValue::AppendingLinkage: From lattner at cs.uiuc.edu Thu Dec 22 15:15:53 2005 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Thu, 22 Dec 2005 15:15:53 -0600 Subject: [llvm-commits] CVS: llvm/lib/Target/Alpha/AlphaISelPattern.cpp Message-ID: <200512222115.PAA18524@zion.cs.uiuc.edu> Changes in directory llvm/lib/Target/Alpha: AlphaISelPattern.cpp updated: 1.193 -> 1.194 --- Log message: remove dead code --- Diffs of the changes: (+0 -13) AlphaISelPattern.cpp | 13 ------------- 1 files changed, 13 deletions(-) Index: llvm/lib/Target/Alpha/AlphaISelPattern.cpp diff -u llvm/lib/Target/Alpha/AlphaISelPattern.cpp:1.193 llvm/lib/Target/Alpha/AlphaISelPattern.cpp:1.194 --- llvm/lib/Target/Alpha/AlphaISelPattern.cpp:1.193 Thu Dec 1 11:48:51 2005 +++ llvm/lib/Target/Alpha/AlphaISelPattern.cpp Thu Dec 22 15:15:41 2005 @@ -1600,19 +1600,6 @@ return; } - case ISD::ImplicitDef: - ++count_ins; - Select(N.getOperand(0)); - switch(N.getValueType()) { - case MVT::f32: Opc = Alpha::IDEF_F32; break; - case MVT::f64: Opc = Alpha::IDEF_F64; break; - case MVT::i64: Opc = Alpha::IDEF_I; break; - default: assert(0 && "should have been legalized"); - }; - BuildMI(BB, Opc, 0, - cast(N.getOperand(1))->getReg()); - return; - case ISD::EntryToken: return; // Noop case ISD::TokenFactor: From lattner at cs.uiuc.edu Thu Dec 22 15:15:53 2005 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Thu, 22 Dec 2005 15:15:53 -0600 Subject: [llvm-commits] CVS: llvm/lib/Target/IA64/IA64ISelPattern.cpp Message-ID: <200512222115.PAA18528@zion.cs.uiuc.edu> Changes in directory llvm/lib/Target/IA64: IA64ISelPattern.cpp updated: 1.70 -> 1.71 --- Log message: remove dead code --- Diffs of the changes: (+0 -7) IA64ISelPattern.cpp | 7 ------- 1 files changed, 7 deletions(-) Index: llvm/lib/Target/IA64/IA64ISelPattern.cpp diff -u llvm/lib/Target/IA64/IA64ISelPattern.cpp:1.70 llvm/lib/Target/IA64/IA64ISelPattern.cpp:1.71 --- llvm/lib/Target/IA64/IA64ISelPattern.cpp:1.70 Wed Dec 21 14:51:36 2005 +++ llvm/lib/Target/IA64/IA64ISelPattern.cpp Thu Dec 22 15:15:41 2005 @@ -2281,13 +2281,6 @@ return; } - case ISD::ImplicitDef: { - Select(N.getOperand(0)); - BuildMI(BB, IA64::IDEF, 0, - cast(N.getOperand(1))->getReg()); - return; - } - case ISD::BRCOND: { MachineBasicBlock *Dest = cast(N.getOperand(2))->getBasicBlock(); From lattner at cs.uiuc.edu Thu Dec 22 15:16:19 2005 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Thu, 22 Dec 2005 15:16:19 -0600 Subject: [llvm-commits] CVS: llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp SelectionDAG.cpp Message-ID: <200512222116.PAA18587@zion.cs.uiuc.edu> Changes in directory llvm/lib/CodeGen/SelectionDAG: LegalizeDAG.cpp updated: 1.241 -> 1.242 SelectionDAG.cpp updated: 1.228 -> 1.229 --- Log message: remove dead code --- Diffs of the changes: (+0 -7) LegalizeDAG.cpp | 6 ------ SelectionDAG.cpp | 1 - 2 files changed, 7 deletions(-) Index: llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp diff -u llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp:1.241 llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp:1.242 --- llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp:1.241 Wed Dec 21 23:23:45 2005 +++ llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp Thu Dec 22 15:16:08 2005 @@ -589,12 +589,6 @@ AddLegalizedOperand(Op.getValue(0), Result); AddLegalizedOperand(Op.getValue(1), Result.getValue(1)); return Result.getValue(Op.ResNo); - case ISD::ImplicitDef: - Tmp1 = LegalizeOp(Node->getOperand(0)); - if (Tmp1 != Node->getOperand(0)) - Result = DAG.getNode(ISD::ImplicitDef, MVT::Other, - Tmp1, Node->getOperand(1)); - break; case ISD::UNDEF: { MVT::ValueType VT = Op.getValueType(); switch (TLI.getOperationAction(ISD::UNDEF, VT)) { Index: llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp diff -u llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp:1.228 llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp:1.229 --- llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp:1.228 Tue Dec 20 00:22:03 2005 +++ llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp Thu Dec 22 15:16:08 2005 @@ -1874,7 +1874,6 @@ case ISD::TargetConstantPool: return "TargetConstantPool"; case ISD::CopyToReg: return "CopyToReg"; case ISD::CopyFromReg: return "CopyFromReg"; - case ISD::ImplicitDef: return "ImplicitDef"; case ISD::UNDEF: return "undef"; // Unary operators From lattner at cs.uiuc.edu Thu Dec 22 15:16:47 2005 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Thu, 22 Dec 2005 15:16:47 -0600 Subject: [llvm-commits] CVS: llvm/include/llvm/CodeGen/SelectionDAG.h SelectionDAGNodes.h Message-ID: <200512222116.PAA18646@zion.cs.uiuc.edu> Changes in directory llvm/include/llvm/CodeGen: SelectionDAG.h updated: 1.81 -> 1.82 SelectionDAGNodes.h updated: 1.82 -> 1.83 --- Log message: remove a dead node --- Diffs of the changes: (+0 -10) SelectionDAG.h | 4 ---- SelectionDAGNodes.h | 6 ------ 2 files changed, 10 deletions(-) Index: llvm/include/llvm/CodeGen/SelectionDAG.h diff -u llvm/include/llvm/CodeGen/SelectionDAG.h:1.81 llvm/include/llvm/CodeGen/SelectionDAG.h:1.82 --- llvm/include/llvm/CodeGen/SelectionDAG.h:1.81 Thu Dec 22 01:02:51 2005 +++ llvm/include/llvm/CodeGen/SelectionDAG.h Thu Dec 22 15:16:35 2005 @@ -184,10 +184,6 @@ return getNode(ISD::CopyFromReg, ResultTys, Ops); } - SDOperand getImplicitDef(SDOperand Chain, unsigned Reg, MVT::ValueType VT) { - return getNode(ISD::ImplicitDef, MVT::Other, Chain, getRegister(Reg, VT)); - } - /// getCall - Note that this destroys the vector of RetVals passed in. /// SDNode *getCall(std::vector &RetVals, SDOperand Chain, Index: llvm/include/llvm/CodeGen/SelectionDAGNodes.h diff -u llvm/include/llvm/CodeGen/SelectionDAGNodes.h:1.82 llvm/include/llvm/CodeGen/SelectionDAGNodes.h:1.83 --- llvm/include/llvm/CodeGen/SelectionDAGNodes.h:1.82 Fri Dec 16 16:45:28 2005 +++ llvm/include/llvm/CodeGen/SelectionDAGNodes.h Thu Dec 22 15:16:35 2005 @@ -92,12 +92,6 @@ // SelectionDAG. The register is available from the RegSDNode object. CopyFromReg, - // ImplicitDef - This node indicates that the specified register is - // implicitly defined by some operation (e.g. its a live-in argument). The - // two operands to this are the token chain coming in and the register. - // The only result is the token chain going out. - ImplicitDef, - // UNDEF - An undefined node UNDEF, From lattner at cs.uiuc.edu Thu Dec 22 15:18:50 2005 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Thu, 22 Dec 2005 15:18:50 -0600 Subject: [llvm-commits] CVS: llvm/lib/Target/SparcV8/SparcV8InstrInfo.td Message-ID: <200512222118.PAA18833@zion.cs.uiuc.edu> Changes in directory llvm/lib/Target/SparcV8: SparcV8InstrInfo.td updated: 1.93 -> 1.94 --- Log message: clean up .td file by using evan's new FLAG thing --- Diffs of the changes: (+4 -4) SparcV8InstrInfo.td | 8 ++++---- 1 files changed, 4 insertions(+), 4 deletions(-) Index: llvm/lib/Target/SparcV8/SparcV8InstrInfo.td diff -u llvm/lib/Target/SparcV8/SparcV8InstrInfo.td:1.93 llvm/lib/Target/SparcV8/SparcV8InstrInfo.td:1.94 --- llvm/lib/Target/SparcV8/SparcV8InstrInfo.td:1.93 Sun Dec 18 20:06:50 2005 +++ llvm/lib/Target/SparcV8/SparcV8InstrInfo.td Thu Dec 22 15:18:39 2005 @@ -561,7 +561,7 @@ // pc-relative call: def CALL : InstV8<(ops calltarget:$dst), "call $dst", - [(set ICC/*bogus*/, (call tglobaladdr:$dst, ICC/*bogus*/))]> { + [(set FLAG, (call tglobaladdr:$dst, FLAG))]> { bits<30> disp; let op = 1; let Inst{29-0} = disp; @@ -571,11 +571,11 @@ def JMPLrr : F3_1<2, 0b111000, (ops MEMrr:$ptr), "call $ptr", - [(set ICC/*bogus*/, (call ADDRrr:$ptr, ICC/*bogus*/))]>; + [(set FLAG, (call ADDRrr:$ptr, FLAG))]>; def JMPLri : F3_2<2, 0b111000, (ops MEMri:$ptr), "call $ptr", - [(set ICC/*bogus*/, (call ADDRri:$ptr, ICC/*bogus*/))]>; + [(set FLAG, (call ADDRri:$ptr, FLAG))]>; } // Section B.28 - Read State Register Instructions @@ -720,7 +720,7 @@ def : Pat<(V8lo tconstpool:$in), (ORri G0, tconstpool:$in)>; // Return of a value, which has an input flag. -def : Pat<(retflag ICC/*HACK*/), (RETL)>; +def : Pat<(retflag FLAG), (RETL)>; // Map integer extload's to zextloads. def : Pat<(i32 (extload ADDRrr:$src, i1)), (LDUBrr ADDRrr:$src)>; From reid at x10sys.com Thu Dec 22 15:46:49 2005 From: reid at x10sys.com (Reid Spencer) Date: Thu, 22 Dec 2005 15:46:49 -0600 Subject: [llvm-commits] CVS: llvm/lib/VMCore/Constants.cpp Message-ID: <200512222146.PAA19088@zion.cs.uiuc.edu> Changes in directory llvm/lib/VMCore: Constants.cpp updated: 1.140 -> 1.141 --- Log message: Revert previous patch. Additional tests fail. --- Diffs of the changes: (+0 -3) Constants.cpp | 3 --- 1 files changed, 3 deletions(-) Index: llvm/lib/VMCore/Constants.cpp diff -u llvm/lib/VMCore/Constants.cpp:1.140 llvm/lib/VMCore/Constants.cpp:1.141 --- llvm/lib/VMCore/Constants.cpp:1.140 Thu Dec 22 15:07:29 2005 +++ llvm/lib/VMCore/Constants.cpp Thu Dec 22 15:46:37 2005 @@ -482,9 +482,6 @@ // TODO: Figure out how to test if a double can be cast to a float! case Type::FloatTyID: - float FV = float(Val); - double DV = double(FV); - return IsNAN(Val) || Val == DV; case Type::DoubleTyID: return true; // This is the largest type... } From lattner at cs.uiuc.edu Thu Dec 22 18:16:11 2005 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Thu, 22 Dec 2005 18:16:11 -0600 Subject: [llvm-commits] CVS: llvm/include/llvm/CodeGen/SelectionDAGNodes.h Message-ID: <200512230016.SAA19903@zion.cs.uiuc.edu> Changes in directory llvm/include/llvm/CodeGen: SelectionDAGNodes.h updated: 1.83 -> 1.84 --- Log message: add a new node --- Diffs of the changes: (+7 -0) SelectionDAGNodes.h | 7 +++++++ 1 files changed, 7 insertions(+) Index: llvm/include/llvm/CodeGen/SelectionDAGNodes.h diff -u llvm/include/llvm/CodeGen/SelectionDAGNodes.h:1.83 llvm/include/llvm/CodeGen/SelectionDAGNodes.h:1.84 --- llvm/include/llvm/CodeGen/SelectionDAGNodes.h:1.83 Thu Dec 22 15:16:35 2005 +++ llvm/include/llvm/CodeGen/SelectionDAGNodes.h Thu Dec 22 18:15:59 2005 @@ -214,6 +214,13 @@ // FP_EXTEND - Extend a smaller FP type into a larger FP type. FP_EXTEND, + // BIT_CONVERT - Theis operator converts between integer and FP values, as + // if one was stored to memory as integer and the other was loaded from the + // same address. The source and result are required to have the same bit + // size (e.g. f32 <-> i32). This can also be used for int-to-int or + // fp-to-fp conversions, but that is a noop, deleted by getNode(). + BIT_CONVERT, + // FNEG, FABS, FSQRT, FSIN, FCOS - Perform unary floating point negation, // absolute value, square root, sine and cosine operations. FNEG, FABS, FSQRT, FSIN, FCOS, From lattner at cs.uiuc.edu Thu Dec 22 18:16:45 2005 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Thu, 22 Dec 2005 18:16:45 -0600 Subject: [llvm-commits] CVS: llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp SelectionDAG.cpp Message-ID: <200512230016.SAA19962@zion.cs.uiuc.edu> Changes in directory llvm/lib/CodeGen/SelectionDAG: LegalizeDAG.cpp updated: 1.242 -> 1.243 SelectionDAG.cpp updated: 1.229 -> 1.230 --- Log message: add very simple support for the BIT_CONVERT node --- Diffs of the changes: (+57 -2) LegalizeDAG.cpp | 52 ++++++++++++++++++++++++++++++++++++++++++++++++++-- SelectionDAG.cpp | 7 +++++++ 2 files changed, 57 insertions(+), 2 deletions(-) Index: llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp diff -u llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp:1.242 llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp:1.243 --- llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp:1.242 Thu Dec 22 15:16:08 2005 +++ llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp Thu Dec 22 18:16:34 2005 @@ -130,6 +130,7 @@ SDOperand ExpandIntToFP(bool isSigned, MVT::ValueType DestTy, SDOperand Source); + SDOperand ExpandBIT_CONVERT(MVT::ValueType DestVT, SDOperand SrcOp); SDOperand ExpandLegalINT_TO_FP(bool isSigned, SDOperand LegalOp, MVT::ValueType DestVT); @@ -2119,7 +2120,25 @@ break; } break; - + + case ISD::BIT_CONVERT: + if (!isTypeLegal(Node->getOperand(0).getValueType())) + Result = ExpandBIT_CONVERT(Node->getValueType(0), Node->getOperand(0)); + else { + switch (TLI.getOperationAction(ISD::BIT_CONVERT, + Node->getOperand(0).getValueType())) { + default: assert(0 && "Unknown operation action!"); + case TargetLowering::Expand: + Result = ExpandBIT_CONVERT(Node->getValueType(0), Node->getOperand(0)); + break; + case TargetLowering::Legal: + Tmp1 = LegalizeOp(Node->getOperand(0)); + if (Tmp1 != Node->getOperand(0)) + Result = DAG.getNode(ISD::BIT_CONVERT, Node->getValueType(0), Tmp1); + break; + } + } + break; // Conversion operators. The source and destination have different types. case ISD::SINT_TO_FP: case ISD::UINT_TO_FP: { @@ -2472,7 +2491,11 @@ break; } break; - + case ISD::BIT_CONVERT: + Result = ExpandBIT_CONVERT(Node->getValueType(0), Node->getOperand(0)); + Result = PromoteOp(Result); + break; + case ISD::FP_EXTEND: assert(0 && "Case not implemented. Dynamically dead with 2 FP types!"); case ISD::FP_ROUND: @@ -2769,6 +2792,24 @@ return Result; } +/// ExpandBIT_CONVERT - Expand a BIT_CONVERT node into a store/load combination. +/// The resultant code need not be legal. +SDOperand SelectionDAGLegalize::ExpandBIT_CONVERT(MVT::ValueType DestVT, + SDOperand SrcOp) { + // Create the stack frame object. + MachineFrameInfo *FrameInfo = DAG.getMachineFunction().getFrameInfo(); + unsigned ByteSize = MVT::getSizeInBits(DestVT)/8; + int FrameIdx = FrameInfo->CreateFixedObject(ByteSize, ByteSize); + SDOperand FIPtr = DAG.getFrameIndex(FrameIdx, TLI.getPointerTy()); + + // Emit a store to the stack slot. + SDOperand Store = DAG.getNode(ISD::STORE, MVT::Other, DAG.getEntryNode(), + SrcOp.getOperand(0), FIPtr, + DAG.getSrcValue(NULL)); + // Result is a load from the stack slot. + return DAG.getLoad(DestVT, Store, FIPtr, DAG.getSrcValue(0)); +} + /// ExpandAddSub - Find a clever way to expand this add operation into /// subcomponents. void SelectionDAGLegalize:: @@ -3638,6 +3679,13 @@ Hi = DAG.getConstant(0, NVT); break; } + + case ISD::BIT_CONVERT: { + SDOperand Tmp = ExpandBIT_CONVERT(Node->getValueType(0), + Node->getOperand(0)); + ExpandOp(Tmp, Lo, Hi); + break; + } case ISD::READCYCLECOUNTER: { assert(TLI.getOperationAction(ISD::READCYCLECOUNTER, VT) == Index: llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp diff -u llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp:1.229 llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp:1.230 --- llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp:1.229 Thu Dec 22 15:16:08 2005 +++ llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp Thu Dec 22 18:16:34 2005 @@ -889,6 +889,12 @@ return Operand.Val->getOperand(0); } break; + case ISD::BIT_CONVERT: + // Basic sanity checking. + assert(MVT::getSizeInBits(VT)==MVT::getSizeInBits(Operand.getValueType()) && + "Cannot BIT_CONVERT between two different types!"); + if (VT == Operand.getValueType()) return Operand; // noop conversion. + break; case ISD::FNEG: if (OpOpcode == ISD::FSUB) // -(X-Y) -> (Y-X) return getNode(ISD::FSUB, VT, Operand.Val->getOperand(1), @@ -1931,6 +1937,7 @@ case ISD::UINT_TO_FP: return "uint_to_fp"; case ISD::FP_TO_SINT: return "fp_to_sint"; case ISD::FP_TO_UINT: return "fp_to_uint"; + case ISD::BIT_CONVERT: return "bit_convert"; // Control flow instructions case ISD::BR: return "br"; From lattner at cs.uiuc.edu Thu Dec 22 18:46:22 2005 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Thu, 22 Dec 2005 18:46:22 -0600 Subject: [llvm-commits] CVS: llvm/include/llvm/CodeGen/SelectionDAGNodes.h Message-ID: <200512230046.SAA20096@zion.cs.uiuc.edu> Changes in directory llvm/include/llvm/CodeGen: SelectionDAGNodes.h updated: 1.84 -> 1.85 --- Log message: improve comment: mention vectors --- Diffs of the changes: (+4 -3) SelectionDAGNodes.h | 7 ++++--- 1 files changed, 4 insertions(+), 3 deletions(-) Index: llvm/include/llvm/CodeGen/SelectionDAGNodes.h diff -u llvm/include/llvm/CodeGen/SelectionDAGNodes.h:1.84 llvm/include/llvm/CodeGen/SelectionDAGNodes.h:1.85 --- llvm/include/llvm/CodeGen/SelectionDAGNodes.h:1.84 Thu Dec 22 18:15:59 2005 +++ llvm/include/llvm/CodeGen/SelectionDAGNodes.h Thu Dec 22 18:46:10 2005 @@ -216,9 +216,10 @@ // BIT_CONVERT - Theis operator converts between integer and FP values, as // if one was stored to memory as integer and the other was loaded from the - // same address. The source and result are required to have the same bit - // size (e.g. f32 <-> i32). This can also be used for int-to-int or - // fp-to-fp conversions, but that is a noop, deleted by getNode(). + // same address (or equivalently for vector format conversions, etc). The + // source and result are required to have the same bit size (e.g. + // f32 <-> i32). This can also be used for int-to-int or fp-to-fp + // conversions, but that is a noop, deleted by getNode(). BIT_CONVERT, // FNEG, FABS, FSQRT, FSIN, FCOS - Perform unary floating point negation, From lattner at cs.uiuc.edu Thu Dec 22 18:50:36 2005 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Thu, 22 Dec 2005 18:50:36 -0600 Subject: [llvm-commits] CVS: llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp Message-ID: <200512230050.SAA20168@zion.cs.uiuc.edu> Changes in directory llvm/lib/CodeGen/SelectionDAG: LegalizeDAG.cpp updated: 1.243 -> 1.244 --- Log message: fix a thinko in the bit_convert handling code --- Diffs of the changes: (+1 -2) LegalizeDAG.cpp | 3 +-- 1 files changed, 1 insertion(+), 2 deletions(-) Index: llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp diff -u llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp:1.243 llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp:1.244 --- llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp:1.243 Thu Dec 22 18:16:34 2005 +++ llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp Thu Dec 22 18:50:25 2005 @@ -2804,8 +2804,7 @@ // Emit a store to the stack slot. SDOperand Store = DAG.getNode(ISD::STORE, MVT::Other, DAG.getEntryNode(), - SrcOp.getOperand(0), FIPtr, - DAG.getSrcValue(NULL)); + SrcOp, FIPtr, DAG.getSrcValue(NULL)); // Result is a load from the stack slot. return DAG.getLoad(DestVT, Store, FIPtr, DAG.getSrcValue(0)); } From lattner at cs.uiuc.edu Thu Dec 22 18:52:42 2005 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Thu, 22 Dec 2005 18:52:42 -0600 Subject: [llvm-commits] CVS: llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp Message-ID: <200512230052.SAA20253@zion.cs.uiuc.edu> Changes in directory llvm/lib/CodeGen/SelectionDAG: LegalizeDAG.cpp updated: 1.244 -> 1.245 --- Log message: Fix a pasto --- Diffs of the changes: (+3 -2) LegalizeDAG.cpp | 5 +++-- 1 files changed, 3 insertions(+), 2 deletions(-) Index: llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp diff -u llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp:1.244 llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp:1.245 --- llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp:1.244 Thu Dec 22 18:50:25 2005 +++ llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp Thu Dec 22 18:52:30 2005 @@ -2793,13 +2793,14 @@ } /// ExpandBIT_CONVERT - Expand a BIT_CONVERT node into a store/load combination. -/// The resultant code need not be legal. +/// The resultant code need not be legal. Note that SrcOp is the input operand +/// to the BIT_CONVERT, not the BIT_CONVERT node itself. SDOperand SelectionDAGLegalize::ExpandBIT_CONVERT(MVT::ValueType DestVT, SDOperand SrcOp) { // Create the stack frame object. MachineFrameInfo *FrameInfo = DAG.getMachineFunction().getFrameInfo(); unsigned ByteSize = MVT::getSizeInBits(DestVT)/8; - int FrameIdx = FrameInfo->CreateFixedObject(ByteSize, ByteSize); + int FrameIdx = FrameInfo->CreateStackObject(ByteSize, ByteSize); SDOperand FIPtr = DAG.getFrameIndex(FrameIdx, TLI.getPointerTy()); // Emit a store to the stack slot. From lattner at cs.uiuc.edu Thu Dec 22 19:00:11 2005 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Thu, 22 Dec 2005 19:00:11 -0600 Subject: [llvm-commits] CVS: llvm/lib/Target/PowerPC/PPCISelLowering.cpp Message-ID: <200512230100.TAA20392@zion.cs.uiuc.edu> Changes in directory llvm/lib/Target/PowerPC: PPCISelLowering.cpp updated: 1.52 -> 1.53 --- Log message: Simplify some code by using BIT_CONVERT --- Diffs of the changes: (+10 -21) PPCISelLowering.cpp | 31 ++++++++++--------------------- 1 files changed, 10 insertions(+), 21 deletions(-) Index: llvm/lib/Target/PowerPC/PPCISelLowering.cpp diff -u llvm/lib/Target/PowerPC/PPCISelLowering.cpp:1.52 llvm/lib/Target/PowerPC/PPCISelLowering.cpp:1.53 --- llvm/lib/Target/PowerPC/PPCISelLowering.cpp:1.52 Mon Dec 19 18:26:01 2005 +++ llvm/lib/Target/PowerPC/PPCISelLowering.cpp Thu Dec 22 18:59:59 2005 @@ -158,39 +158,28 @@ if (Src.getValueType() == MVT::f32) Src = DAG.getNode(ISD::FP_EXTEND, MVT::f64, Src); + SDOperand Tmp; switch (Op.getValueType()) { default: assert(0 && "Unhandled FP_TO_SINT type in custom expander!"); case MVT::i32: - Op = DAG.getNode(PPCISD::FCTIWZ, MVT::f64, Src); + Tmp = DAG.getNode(PPCISD::FCTIWZ, MVT::f64, Src); break; case MVT::i64: - Op = DAG.getNode(PPCISD::FCTIDZ, MVT::f64, Src); + Tmp = DAG.getNode(PPCISD::FCTIDZ, MVT::f64, Src); break; } - int FrameIdx = - DAG.getMachineFunction().getFrameInfo()->CreateStackObject(8, 8); - SDOperand FI = DAG.getFrameIndex(FrameIdx, MVT::i32); - SDOperand ST = DAG.getNode(ISD::STORE, MVT::Other, DAG.getEntryNode(), - Op, FI, DAG.getSrcValue(0)); - if (Op.getOpcode() == PPCISD::FCTIDZ) { - Op = DAG.getLoad(MVT::i64, ST, FI, DAG.getSrcValue(0)); - } else { - FI = DAG.getNode(ISD::ADD, MVT::i32, FI, DAG.getConstant(4, MVT::i32)); - Op = DAG.getLoad(MVT::i32, ST, FI, DAG.getSrcValue(0)); - } - return Op; + // Convert the FP value to an int value through memory. + SDOperand Bits = DAG.getNode(ISD::BIT_CONVERT, MVT::i64, Tmp); + if (Op.getValueType() == MVT::i32) + Bits = DAG.getNode(ISD::TRUNCATE, MVT::i32, Bits); + return Bits; } case ISD::SINT_TO_FP: { assert(MVT::i64 == Op.getOperand(0).getValueType() && "Unhandled SINT_TO_FP type in custom expander!"); - int FrameIdx = - DAG.getMachineFunction().getFrameInfo()->CreateStackObject(8, 8); - SDOperand FI = DAG.getFrameIndex(FrameIdx, MVT::i32); - SDOperand ST = DAG.getNode(ISD::STORE, MVT::Other, DAG.getEntryNode(), - Op.getOperand(0), FI, DAG.getSrcValue(0)); - SDOperand LD = DAG.getLoad(MVT::f64, ST, FI, DAG.getSrcValue(0)); - SDOperand FP = DAG.getNode(PPCISD::FCFID, MVT::f64, LD); + SDOperand Bits = DAG.getNode(ISD::BIT_CONVERT, MVT::f64, Op.getOperand(0)); + SDOperand FP = DAG.getNode(PPCISD::FCFID, MVT::f64, Bits); if (MVT::f32 == Op.getValueType()) FP = DAG.getNode(ISD::FP_ROUND, MVT::f32, FP); return FP; From lattner at cs.uiuc.edu Thu Dec 22 20:31:51 2005 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Thu, 22 Dec 2005 20:31:51 -0600 Subject: [llvm-commits] CVS: llvm/lib/Target/SparcV8/SparcV8ISelDAGToDAG.cpp Message-ID: <200512230231.UAA21225@zion.cs.uiuc.edu> Changes in directory llvm/lib/Target/SparcV8: SparcV8ISelDAGToDAG.cpp updated: 1.31 -> 1.32 --- Log message: Use BIT_CONVERT to simplify this code --- Diffs of the changes: (+11 -36) SparcV8ISelDAGToDAG.cpp | 47 +++++++++++------------------------------------ 1 files changed, 11 insertions(+), 36 deletions(-) Index: llvm/lib/Target/SparcV8/SparcV8ISelDAGToDAG.cpp diff -u llvm/lib/Target/SparcV8/SparcV8ISelDAGToDAG.cpp:1.31 llvm/lib/Target/SparcV8/SparcV8ISelDAGToDAG.cpp:1.32 --- llvm/lib/Target/SparcV8/SparcV8ISelDAGToDAG.cpp:1.31 Wed Dec 21 14:51:37 2005 +++ llvm/lib/Target/SparcV8/SparcV8ISelDAGToDAG.cpp Thu Dec 22 20:31:39 2005 @@ -226,14 +226,8 @@ MF.addLiveIn(*CurArgReg++, VReg); SDOperand Arg = DAG.getCopyFromReg(Root, VReg, MVT::i32); - // We use the stack space that is already reserved for this reg. - int FrameIdx = MF.getFrameInfo()->CreateFixedObject(4, ArgOffset); - SDOperand FIPtr = DAG.getFrameIndex(FrameIdx, MVT::i32); - - SDOperand SV = DAG.getSrcValue(0); - SDOperand Store = DAG.getNode(ISD::STORE, MVT::Other, Root, - Arg, FIPtr, SV); - ArgValues.push_back(DAG.getLoad(MVT::f32, Store, FIPtr, SV)); + Arg = DAG.getNode(ISD::BIT_CONVERT, MVT::f32, Arg); + ArgValues.push_back(Arg); } ArgOffset += 4; break; @@ -280,20 +274,12 @@ // Compose the two halves together into an i64 unit. SDOperand WholeValue = DAG.getNode(ISD::BUILD_PAIR, MVT::i64, LoVal, HiVal); - - if (ObjectVT == MVT::i64) { - // If we are emitting an i64, this is what we want. - ArgValues.push_back(WholeValue); - } else { - assert(ObjectVT == MVT::f64); - // Otherwise, emit a store to the stack and reload into FPR. - int FrameIdx = MF.getFrameInfo()->CreateStackObject(8, 8); - SDOperand FIPtr = DAG.getFrameIndex(FrameIdx, MVT::i32); - SDOperand SV = DAG.getSrcValue(0); - SDOperand Store = DAG.getNode(ISD::STORE, MVT::Other, Root, - WholeValue, FIPtr, SV); - ArgValues.push_back(DAG.getLoad(MVT::f64, Store, FIPtr, SV)); - } + + // If we want a double, do a bit convert. + if (ObjectVT == MVT::f64) + WholeValue = DAG.getNode(ISD::BIT_CONVERT, MVT::f64, WholeValue); + + ArgValues.push_back(WholeValue); } ArgOffset += 8; break; @@ -418,16 +404,11 @@ ValToStore = Val; } else { // Convert this to a FP value in an int reg. - int FrameIdx = MF.getFrameInfo()->CreateStackObject(4, 4); - SDOperand FIPtr = DAG.getFrameIndex(FrameIdx, MVT::i32); - SDOperand SV = DAG.getSrcValue(0); - SDOperand Store = DAG.getNode(ISD::STORE, MVT::Other, Chain, - Val, FIPtr, SV); - Val = DAG.getLoad(MVT::i32, Store, FIPtr, SV); + Val = DAG.getNode(ISD::BIT_CONVERT, MVT::i32, Val); RegValuesToPass.push_back(Val); } break; - case MVT::f64: { + case MVT::f64: ObjSize = 8; // If we can store this directly into the outgoing slot, do so. We can // do this when all ArgRegs are used and if the outgoing slot is aligned. @@ -437,13 +418,7 @@ } // Otherwise, convert this to a FP value in int regs. - int FrameIdx = MF.getFrameInfo()->CreateStackObject(8, 8); - SDOperand FIPtr = DAG.getFrameIndex(FrameIdx, MVT::i32); - SDOperand SV = DAG.getSrcValue(0); - SDOperand Store = DAG.getNode(ISD::STORE, MVT::Other, Chain, - Val, FIPtr, SV); - Val = DAG.getLoad(MVT::i64, Store, FIPtr, SV); - } + Val = DAG.getNode(ISD::BIT_CONVERT, MVT::i64, Val); // FALL THROUGH case MVT::i64: ObjSize = 8; From lattner at cs.uiuc.edu Thu Dec 22 23:00:28 2005 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Thu, 22 Dec 2005 23:00:28 -0600 Subject: [llvm-commits] CVS: llvm/lib/Target/SparcV8/SparcV8ISelDAGToDAG.cpp SparcV8InstrInfo.td Message-ID: <200512230500.XAA22005@zion.cs.uiuc.edu> Changes in directory llvm/lib/Target/SparcV8: SparcV8ISelDAGToDAG.cpp updated: 1.32 -> 1.33 SparcV8InstrInfo.td updated: 1.94 -> 1.95 --- Log message: fix the int<->fp instructions, which apparently take a single float register to represent the int part (because it's always 32-bits) --- Diffs of the changes: (+16 -26) SparcV8ISelDAGToDAG.cpp | 26 ++++++-------------------- SparcV8InstrInfo.td | 16 ++++++++++------ 2 files changed, 16 insertions(+), 26 deletions(-) Index: llvm/lib/Target/SparcV8/SparcV8ISelDAGToDAG.cpp diff -u llvm/lib/Target/SparcV8/SparcV8ISelDAGToDAG.cpp:1.32 llvm/lib/Target/SparcV8/SparcV8ISelDAGToDAG.cpp:1.33 --- llvm/lib/Target/SparcV8/SparcV8ISelDAGToDAG.cpp:1.32 Thu Dec 22 20:31:39 2005 +++ llvm/lib/Target/SparcV8/SparcV8ISelDAGToDAG.cpp Thu Dec 22 23:00:16 2005 @@ -601,28 +601,14 @@ SDOperand Lo = DAG.getNode(V8ISD::Lo, MVT::i32, CP); return DAG.getNode(ISD::ADD, MVT::i32, Lo, Hi); } - case ISD::FP_TO_SINT: { + case ISD::FP_TO_SINT: // Convert the fp value to integer in an FP register. - Op = DAG.getNode(V8ISD::FTOI, Op.getOperand(0).getValueType(), - Op.getOperand(0)); - int Size = Op.getOperand(0).getValueType() == MVT::f32 ? 4 : 8; - int FrameIdx = - DAG.getMachineFunction().getFrameInfo()->CreateStackObject(Size, Size); - SDOperand FI = DAG.getFrameIndex(FrameIdx, MVT::i32); - SDOperand ST = DAG.getNode(ISD::STORE, MVT::Other, DAG.getEntryNode(), - Op, FI, DAG.getSrcValue(0)); - return DAG.getLoad(MVT::i32, ST, FI, DAG.getSrcValue(0)); - } + assert(Op.getValueType() == MVT::i32); + Op = DAG.getNode(V8ISD::FTOI, MVT::f32, Op.getOperand(0)); + return DAG.getNode(ISD::BIT_CONVERT, MVT::i32, Op); case ISD::SINT_TO_FP: { - int Size = Op.getOperand(0).getValueType() == MVT::f32 ? 4 : 8; - int FrameIdx = - DAG.getMachineFunction().getFrameInfo()->CreateStackObject(Size, Size); - SDOperand FI = DAG.getFrameIndex(FrameIdx, MVT::i32); - SDOperand ST = DAG.getNode(ISD::STORE, MVT::Other, DAG.getEntryNode(), - Op.getOperand(0), FI, DAG.getSrcValue(0)); - - Op = DAG.getLoad(Op.getValueType(), ST, FI, DAG.getSrcValue(0)); - + assert(Op.getOperand(0).getValueType() == MVT::i32); + Op = DAG.getNode(ISD::BIT_CONVERT, MVT::f32, Op); // Convert the int value to FP in an FP register. return DAG.getNode(V8ISD::ITOF, Op.getValueType(), Op); } Index: llvm/lib/Target/SparcV8/SparcV8InstrInfo.td diff -u llvm/lib/Target/SparcV8/SparcV8InstrInfo.td:1.94 llvm/lib/Target/SparcV8/SparcV8InstrInfo.td:1.95 --- llvm/lib/Target/SparcV8/SparcV8InstrInfo.td:1.94 Thu Dec 22 15:18:39 2005 +++ llvm/lib/Target/SparcV8/SparcV8InstrInfo.td Thu Dec 22 23:00:16 2005 @@ -69,6 +69,10 @@ def SDTV8selectcc : SDTypeProfile<1, 4, [SDTCisSameAs<0, 1>, SDTCisSameAs<1, 2>, SDTCisVT<3, i32>, SDTCisVT<4, FlagVT>]>; +def SDTV8FTOI : +SDTypeProfile<1, 1, [SDTCisVT<0, f32>, SDTCisFP<1>]>; +def SDTV8ITOF : +SDTypeProfile<1, 1, [SDTCisFP<0>, SDTCisVT<1, f32>]>; def V8cmpicc : SDNode<"V8ISD::CMPICC", SDTV8cmpicc>; def V8cmpfcc : SDNode<"V8ISD::CMPFCC", SDTV8cmpfcc>; @@ -78,8 +82,8 @@ def V8hi : SDNode<"V8ISD::Hi", SDTIntUnaryOp>; def V8lo : SDNode<"V8ISD::Lo", SDTIntUnaryOp>; -def V8ftoi : SDNode<"V8ISD::FTOI", SDTFPUnaryOp>; -def V8itof : SDNode<"V8ISD::ITOF", SDTFPUnaryOp>; +def V8ftoi : SDNode<"V8ISD::FTOI", SDTV8FTOI>; +def V8itof : SDNode<"V8ISD::ITOF", SDTV8ITOF>; def V8selecticc : SDNode<"V8ISD::SELECT_ICC", SDTV8selectcc>; def V8selectfcc : SDNode<"V8ISD::SELECT_FCC", SDTV8selectcc>; @@ -597,9 +601,9 @@ "fitos $src, $dst", [(set FPRegs:$dst, (V8itof FPRegs:$src))]>; def FITOD : F3_3<2, 0b110100, 0b011001000, - (ops DFPRegs:$dst, DFPRegs:$src), + (ops DFPRegs:$dst, FPRegs:$src), "fitod $src, $dst", - [(set DFPRegs:$dst, (V8itof DFPRegs:$src))]>; + [(set DFPRegs:$dst, (V8itof FPRegs:$src))]>; // Convert Floating-point to Integer Instructions, p. 142 def FSTOI : F3_3<2, 0b110100, 0b011010001, @@ -607,9 +611,9 @@ "fstoi $src, $dst", [(set FPRegs:$dst, (V8ftoi FPRegs:$src))]>; def FDTOI : F3_3<2, 0b110100, 0b011010010, - (ops DFPRegs:$dst, DFPRegs:$src), + (ops FPRegs:$dst, DFPRegs:$src), "fdtoi $src, $dst", - [(set DFPRegs:$dst, (V8ftoi DFPRegs:$src))]>; + [(set FPRegs:$dst, (V8ftoi DFPRegs:$src))]>; // Convert between Floating-point Formats Instructions, p. 143 def FSTOD : F3_3<2, 0b110100, 0b011001001, From jeffc at jolt-lang.org Thu Dec 22 23:00:50 2005 From: jeffc at jolt-lang.org (Jeff Cohen) Date: Thu, 22 Dec 2005 23:00:50 -0600 Subject: [llvm-commits] CVS: llvm/tools/bugpoint/OptimizerDriver.cpp Message-ID: <200512230500.XAA22017@zion.cs.uiuc.edu> Changes in directory llvm/tools/bugpoint: OptimizerDriver.cpp updated: 1.34 -> 1.35 --- Log message: Get bugpoint building with VC++ again. --- Diffs of the changes: (+1 -0) OptimizerDriver.cpp | 1 + 1 files changed, 1 insertion(+) Index: llvm/tools/bugpoint/OptimizerDriver.cpp diff -u llvm/tools/bugpoint/Opti