Skip to content

Instantly share code, notes, and snippets.

@drpventura
Created April 11, 2017 20:27
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save drpventura/46a73013f9179ce75a2150a1b9460463 to your computer and use it in GitHub Desktop.
Save drpventura/46a73013f9179ce75a2150a1b9460463 to your computer and use it in GitHub Desktop.
TurtleKeyListener
# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio and Webstorm
# Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839
# User-specific stuff:
.idea/**/workspace.xml
.idea/**/tasks.xml
.idea/dictionaries
# Sensitive or high-churn files:
.idea/**/dataSources/
.idea/**/dataSources.ids
.idea/**/dataSources.xml
.idea/**/dataSources.local.xml
.idea/**/sqlDataSources.xml
.idea/**/dynamic.xml
.idea/**/uiDesigner.xml
# Gradle:
.idea/**/gradle.xml
.idea/**/libraries
# Mongo Explorer plugin:
.idea/**/mongoSettings.xml
## File-based project format:
*.iws
## Plugin-specific files:
# IntelliJ
/out/
# mpeltonen/sbt-idea plugin
.idea_modules/
# JIRA plugin
atlassian-ide-plugin.xml
# Crashlytics plugin (for Android Studio and IntelliJ)
com_crashlytics_export_strings.xml
crashlytics.properties
crashlytics-build.properties
fabric.properties
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="Encoding">
<file url="PROJECT" charset="UTF-8" />
</component>
</project>
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="KotlinCommonCompilerArguments">
<option name="languageVersion" value="1.1" />
<option name="apiVersion" value="1.1" />
</component>
</project>
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectRootManager" version="2" languageLevel="JDK_1_8" default="true" project-jdk-name="1.8" project-jdk-type="JavaSDK">
<output url="file://$PROJECT_DIR$/out" />
</component>
</project>
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectModuleManager">
<modules>
<module fileurl="file://$PROJECT_DIR$/TurtleListener.iml" filepath="$PROJECT_DIR$/TurtleListener.iml" />
</modules>
</component>
</project>
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="Palette2">
<group name="Swing">
<item class="com.intellij.uiDesigner.HSpacer" tooltip-text="Horizontal Spacer" icon="/com/intellij/uiDesigner/icons/hspacer.png" removable="false" auto-create-binding="false" can-attach-label="false">
<default-constraints vsize-policy="1" hsize-policy="6" anchor="0" fill="1" />
</item>
<item class="com.intellij.uiDesigner.VSpacer" tooltip-text="Vertical Spacer" icon="/com/intellij/uiDesigner/icons/vspacer.png" removable="false" auto-create-binding="false" can-attach-label="false">
<default-constraints vsize-policy="6" hsize-policy="1" anchor="0" fill="2" />
</item>
<item class="javax.swing.JPanel" icon="/com/intellij/uiDesigner/icons/panel.png" removable="false" auto-create-binding="false" can-attach-label="false">
<default-constraints vsize-policy="3" hsize-policy="3" anchor="0" fill="3" />
</item>
<item class="javax.swing.JScrollPane" icon="/com/intellij/uiDesigner/icons/scrollPane.png" removable="false" auto-create-binding="false" can-attach-label="true">
<default-constraints vsize-policy="7" hsize-policy="7" anchor="0" fill="3" />
</item>
<item class="javax.swing.JButton" icon="/com/intellij/uiDesigner/icons/button.png" removable="false" auto-create-binding="true" can-attach-label="false">
<default-constraints vsize-policy="0" hsize-policy="3" anchor="0" fill="1" />
<initial-values>
<property name="text" value="Button" />
</initial-values>
</item>
<item class="javax.swing.JRadioButton" icon="/com/intellij/uiDesigner/icons/radioButton.png" removable="false" auto-create-binding="true" can-attach-label="false">
<default-constraints vsize-policy="0" hsize-policy="3" anchor="8" fill="0" />
<initial-values>
<property name="text" value="RadioButton" />
</initial-values>
</item>
<item class="javax.swing.JCheckBox" icon="/com/intellij/uiDesigner/icons/checkBox.png" removable="false" auto-create-binding="true" can-attach-label="false">
<default-constraints vsize-policy="0" hsize-policy="3" anchor="8" fill="0" />
<initial-values>
<property name="text" value="CheckBox" />
</initial-values>
</item>
<item class="javax.swing.JLabel" icon="/com/intellij/uiDesigner/icons/label.png" removable="false" auto-create-binding="false" can-attach-label="false">
<default-constraints vsize-policy="0" hsize-policy="0" anchor="8" fill="0" />
<initial-values>
<property name="text" value="Label" />
</initial-values>
</item>
<item class="javax.swing.JTextField" icon="/com/intellij/uiDesigner/icons/textField.png" removable="false" auto-create-binding="true" can-attach-label="true">
<default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1">
<preferred-size width="150" height="-1" />
</default-constraints>
</item>
<item class="javax.swing.JPasswordField" icon="/com/intellij/uiDesigner/icons/passwordField.png" removable="false" auto-create-binding="true" can-attach-label="true">
<default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1">
<preferred-size width="150" height="-1" />
</default-constraints>
</item>
<item class="javax.swing.JFormattedTextField" icon="/com/intellij/uiDesigner/icons/formattedTextField.png" removable="false" auto-create-binding="true" can-attach-label="true">
<default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1">
<preferred-size width="150" height="-1" />
</default-constraints>
</item>
<item class="javax.swing.JTextArea" icon="/com/intellij/uiDesigner/icons/textArea.png" removable="false" auto-create-binding="true" can-attach-label="true">
<default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3">
<preferred-size width="150" height="50" />
</default-constraints>
</item>
<item class="javax.swing.JTextPane" icon="/com/intellij/uiDesigner/icons/textPane.png" removable="false" auto-create-binding="true" can-attach-label="true">
<default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3">
<preferred-size width="150" height="50" />
</default-constraints>
</item>
<item class="javax.swing.JEditorPane" icon="/com/intellij/uiDesigner/icons/editorPane.png" removable="false" auto-create-binding="true" can-attach-label="true">
<default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3">
<preferred-size width="150" height="50" />
</default-constraints>
</item>
<item class="javax.swing.JComboBox" icon="/com/intellij/uiDesigner/icons/comboBox.png" removable="false" auto-create-binding="true" can-attach-label="true">
<default-constraints vsize-policy="0" hsize-policy="2" anchor="8" fill="1" />
</item>
<item class="javax.swing.JTable" icon="/com/intellij/uiDesigner/icons/table.png" removable="false" auto-create-binding="true" can-attach-label="false">
<default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3">
<preferred-size width="150" height="50" />
</default-constraints>
</item>
<item class="javax.swing.JList" icon="/com/intellij/uiDesigner/icons/list.png" removable="false" auto-create-binding="true" can-attach-label="false">
<default-constraints vsize-policy="6" hsize-policy="2" anchor="0" fill="3">
<preferred-size width="150" height="50" />
</default-constraints>
</item>
<item class="javax.swing.JTree" icon="/com/intellij/uiDesigner/icons/tree.png" removable="false" auto-create-binding="true" can-attach-label="false">
<default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3">
<preferred-size width="150" height="50" />
</default-constraints>
</item>
<item class="javax.swing.JTabbedPane" icon="/com/intellij/uiDesigner/icons/tabbedPane.png" removable="false" auto-create-binding="true" can-attach-label="false">
<default-constraints vsize-policy="3" hsize-policy="3" anchor="0" fill="3">
<preferred-size width="200" height="200" />
</default-constraints>
</item>
<item class="javax.swing.JSplitPane" icon="/com/intellij/uiDesigner/icons/splitPane.png" removable="false" auto-create-binding="false" can-attach-label="false">
<default-constraints vsize-policy="3" hsize-policy="3" anchor="0" fill="3">
<preferred-size width="200" height="200" />
</default-constraints>
</item>
<item class="javax.swing.JSpinner" icon="/com/intellij/uiDesigner/icons/spinner.png" removable="false" auto-create-binding="true" can-attach-label="true">
<default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1" />
</item>
<item class="javax.swing.JSlider" icon="/com/intellij/uiDesigner/icons/slider.png" removable="false" auto-create-binding="true" can-attach-label="false">
<default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1" />
</item>
<item class="javax.swing.JSeparator" icon="/com/intellij/uiDesigner/icons/separator.png" removable="false" auto-create-binding="false" can-attach-label="false">
<default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3" />
</item>
<item class="javax.swing.JProgressBar" icon="/com/intellij/uiDesigner/icons/progressbar.png" removable="false" auto-create-binding="true" can-attach-label="false">
<default-constraints vsize-policy="0" hsize-policy="6" anchor="0" fill="1" />
</item>
<item class="javax.swing.JToolBar" icon="/com/intellij/uiDesigner/icons/toolbar.png" removable="false" auto-create-binding="false" can-attach-label="false">
<default-constraints vsize-policy="0" hsize-policy="6" anchor="0" fill="1">
<preferred-size width="-1" height="20" />
</default-constraints>
</item>
<item class="javax.swing.JToolBar$Separator" icon="/com/intellij/uiDesigner/icons/toolbarSeparator.png" removable="false" auto-create-binding="false" can-attach-label="false">
<default-constraints vsize-policy="0" hsize-policy="0" anchor="0" fill="1" />
</item>
<item class="javax.swing.JScrollBar" icon="/com/intellij/uiDesigner/icons/scrollbar.png" removable="false" auto-create-binding="true" can-attach-label="false">
<default-constraints vsize-policy="6" hsize-policy="0" anchor="0" fill="2" />
</item>
</group>
</component>
</project>
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="VcsDirectoryMappings">
<mapping directory="$PROJECT_DIR$" vcs="Git" />
</component>
</project>
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<diagram program="umlet" version="14.2">
<zoom_level>10</zoom_level>
<element>
<id>UMLClass</id>
<coordinates>
<x>60</x>
<y>300</y>
<w>260</w>
<h>110</h>
</coordinates>
<panel_attributes>cop2513.turtlelistener::Main
--
--
+main(String[] args): void
</panel_attributes>
<additional_attributes/>
</element>
<element>
<id>UMLClass</id>
<coordinates>
<x>490</x>
<y>560</y>
<w>300</w>
<h>30</h>
</coordinates>
<panel_attributes>edu.support::AnimatedTurtle</panel_attributes>
<additional_attributes/>
</element>
<element>
<id>UMLClass</id>
<coordinates>
<x>40</x>
<y>470</y>
<w>230</w>
<h>30</h>
</coordinates>
<panel_attributes>edu.support::EndWorld</panel_attributes>
<additional_attributes/>
</element>
<element>
<id>Relation</id>
<coordinates>
<x>310</x>
<y>340</y>
<w>170</w>
<h>170</h>
</coordinates>
<panel_attributes>lt=&lt;.</panel_attributes>
<additional_attributes>150.0;150.0;110.0;150.0;80.0;80.0;10.0;10.0</additional_attributes>
</element>
<element>
<id>Relation</id>
<coordinates>
<x>260</x>
<y>340</y>
<w>100</w>
<h>170</h>
</coordinates>
<panel_attributes>lt=&lt;.</panel_attributes>
<additional_attributes>10.0;150.0;80.0;150.0;60.0;10.0</additional_attributes>
</element>
<element>
<id>UMLNote</id>
<coordinates>
<x>70</x>
<y>550</y>
<w>300</w>
<h>80</h>
</coordinates>
<panel_attributes>Main also "uses"
AnimatedTurtle and EndWorld</panel_attributes>
<additional_attributes/>
</element>
<element>
<id>UMLClass</id>
<coordinates>
<x>460</x>
<y>470</y>
<w>320</w>
<h>30</h>
</coordinates>
<panel_attributes>edu.gatech.mediacomp::Turtle</panel_attributes>
<additional_attributes/>
</element>
<element>
<id>Relation</id>
<coordinates>
<x>620</x>
<y>490</y>
<w>30</w>
<h>90</h>
</coordinates>
<panel_attributes>lt=&lt;&lt;-</panel_attributes>
<additional_attributes>10.0;10.0;10.0;70.0</additional_attributes>
</element>
<element>
<id>UMLNote</id>
<coordinates>
<x>350</x>
<y>680</y>
<w>270</w>
<h>50</h>
</coordinates>
<panel_attributes>AnimatedTurtle "is a" Turtle</panel_attributes>
<additional_attributes/>
</element>
<element>
<id>UMLClass</id>
<coordinates>
<x>820</x>
<y>40</y>
<w>350</w>
<h>140</h>
</coordinates>
<panel_attributes>&lt;&lt;Interface&gt;&gt;
java.awt.event::KeyListener
--
/+keyTyped(KeyEvent e): void/
/+keyPressed(KeyEvent e): void/
/+keyReleased(KeyEvent e): void/</panel_attributes>
<additional_attributes/>
</element>
<element>
<id>UMLClass</id>
<coordinates>
<x>800</x>
<y>620</y>
<w>430</w>
<h>170</h>
</coordinates>
<panel_attributes>cop2513.turtlelistener::TurtleKeyListener
--
-_turtle: Turtle
--
+TurtleKeyListener(Turtle t): ctor
+keyTyped(KeyEvent e): void
+keyPressed(KeyEvent e): void
+keyReleased(KeyEvent e): void
</panel_attributes>
<additional_attributes/>
</element>
<element>
<id>Relation</id>
<coordinates>
<x>740</x>
<y>470</y>
<w>170</w>
<h>210</h>
</coordinates>
<panel_attributes>lt=&lt;-</panel_attributes>
<additional_attributes>40.0;10.0;150.0;10.0;10.0;190.0;60.0;190.0</additional_attributes>
</element>
<element>
<id>UMLClass</id>
<coordinates>
<x>840</x>
<y>260</y>
<w>340</w>
<h>160</h>
</coordinates>
<panel_attributes>java.awt.event::KeyAdapter
--
--
+keyTyped(KeyEvent e): void
+keyPressed(KeyEvent e): void
+keyReleased(KeyEvent e): void</panel_attributes>
<additional_attributes/>
</element>
<element>
<id>Relation</id>
<coordinates>
<x>990</x>
<y>410</y>
<w>50</w>
<h>230</h>
</coordinates>
<panel_attributes>lt=&lt;&lt;-</panel_attributes>
<additional_attributes>10.0;10.0;30.0;210.0</additional_attributes>
</element>
<element>
<id>Relation</id>
<coordinates>
<x>990</x>
<y>170</y>
<w>30</w>
<h>110</h>
</coordinates>
<panel_attributes>lt=&lt;&lt;.</panel_attributes>
<additional_attributes>10.0;10.0;10.0;90.0</additional_attributes>
</element>
</diagram>
<?xml version="1.0" encoding="UTF-8"?>
<classpath>
<classpathentry kind="src" path=""/>
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
<classpathentry kind="lib" path="C:/intro-prog-java/bookClasses/javazoom.jar"/>
<classpathentry kind="lib" path="C:/intro-prog-java/bookClasses/jmf.jar"/>
<classpathentry kind="lib" path="C:/intro-prog-java/bookClasses/sound.jar"/>
<classpathentry kind="output" path=""/>
</classpath>
<?xml version="1.0" encoding="UTF-8"?>
<projectDescription>
<name>media</name>
<comment></comment>
<projects>
</projects>
<buildSpec>
<buildCommand>
<name>org.eclipse.jdt.core.javabuilder</name>
<arguments>
</arguments>
</buildCommand>
</buildSpec>
<natures>
<nature>org.eclipse.jdt.core.javanature</nature>
</natures>
</projectDescription>
<head><title>Popular Baby Names</title>
<meta name="dc.language" scheme="ISO639-2" content="eng">
<meta name="dc.creator" content="OACT">
<meta name="lead_content_manager" content="JeffK">
<meta name="coder" content="JeffK">
<meta name="dc.date.reviewed" scheme="ISO8601" content="2005-12-30">
<link rel="stylesheet" href="../OACT/templatefiles/master.css" type="text/css" media="screen">
<link rel="stylesheet" href="../OACT/templatefiles/custom.css" type="text/css" media="screen">
<link rel="stylesheet" href="../OACT/templatefiles/print.css" type="text/css" media="print">
</head>
<body bgcolor="#ffffff" text="#000000" topmargin="1" leftmargin="0">
<table width="100%" border="0" cellspacing="0" cellpadding="4">
<tbody>
<tr>
<td class="sstop" valign="bottom" align="left" width="25%">
Social Security Online
</td>
<td valign="bottom" class="titletext">
<!-- sitetitle -->Popular Baby Names
</td>
</tr>
<tr bgcolor="#333366"><td colspan="2" height="2"></td></tr>
<tr>
<td class="graystars" width="25%" valign="top">
<a href="../OACT/babynames/">Popular Baby Names</a></td>
<td valign="top">
<a href="http://www.ssa.gov/"><img src="/templateimages/tinylogo.gif"
width="52" height="47" align="left"
alt="SSA logo: link to Social Security home page" border="0"></a><a name="content"></a>
<h1>Popular Names by Birth Year</h1>August 27, 2006</td>
</tr>
<tr bgcolor="#333366"><td colspan="2" height="1"></td></tr>
</tbody></table>
<table width="100%" border="0" cellspacing="0" cellpadding="4" summary="formatting">
<tr valign="top">
<td width="25%" class="greycell">
<a href="../OACT/babynames/background.html">Background information</a>
<p><br />
&nbsp; Select another <label for="yob">year of birth</label>?<br />
<form method="post" action="/cgi-bin/popularnames.cgi">
&nbsp; <input type="text" name="year" id="yob" size="4" value="1961">
<input type="hidden" name="top" value="1000">
<input type="hidden" name="number" value="">
&nbsp; <input type="submit" value=" Go "></form>
</td>
<td>
<h3 align="center">Popularity in 1961</h3>
<p align="center">
<table width="48%" border="1" bordercolor="#aaabbb"
cellpadding="2" cellspacing="0" summary="Popularity for top 1000">
<tr align="center" valign="bottom">
<th scope="col" width="12%" bgcolor="#efefef">Rank</th>
<th scope="col" width="41%" bgcolor="#99ccff">Male name</th>
<th scope="col" bgcolor="pink" width="41%">Female name</th></tr>
<tr align="right">
<td>1</td><td>Michael</td>
<td>Mary</td>
<tr align="right">
<td>2</td><td>David</td>
<td>Lisa</td>
<tr align="right">
<td>3</td><td>John</td>
<td>Susan</td>
<tr align="right">
<td>4</td><td>James</td>
<td>Linda</td>
<tr align="right">
<td>5</td><td>Robert</td>
<td>Karen</td>
<tr align="right">
<td>6</td><td>Mark</td>
<td>Patricia</td>
<tr align="right">
<td>7</td><td>William</td>
<td>Donna</td>
<tr align="right">
<td>8</td><td>Richard</td>
<td>Cynthia</td>
<tr align="right">
<td>9</td><td>Thomas</td>
<td>Sandra</td>
<tr align="right">
<td>10</td><td>Steven</td>
<td>Deborah</td>
<tr align="right">
<td>11</td><td>Jeffrey</td>
<td>Brenda</td>
<tr align="right">
<td>12</td><td>Joseph</td>
<td>Barbara</td>
<tr align="right">
<td>13</td><td>Charles</td>
<td>Debra</td>
<tr align="right">
<td>14</td><td>Kevin</td>
<td>Lori</td>
<tr align="right">
<td>15</td><td>Timothy</td>
<td>Pamela</td>
<tr align="right">
<td>16</td><td>Kenneth</td>
<td>Nancy</td>
<tr align="right">
<td>17</td><td>Daniel</td>
<td>Sharon</td>
<tr align="right">
<td>18</td><td>Paul</td>
<td>Teresa</td>
<tr align="right">
<td>19</td><td>Scott</td>
<td>Elizabeth</td>
<tr align="right">
<td>20</td><td>Brian</td>
<td>Cheryl</td>
<tr align="right">
<td>21</td><td>Gary</td>
<td>Laura</td>
<tr align="right">
<td>22</td><td>Donald</td>
<td>Kimberly</td>
<tr align="right">
<td>23</td><td>Gregory</td>
<td>Julie</td>
<tr align="right">
<td>24</td><td>Ronald</td>
<td>Carol</td>
<tr align="right">
<td>25</td><td>Anthony</td>
<td>Kathy</td>
<tr align="right">
<td>26</td><td>Christopher</td>
<td>Diane</td>
<tr align="right">
<td>27</td><td>Stephen</td>
<td>Robin</td>
<tr align="right">
<td>28</td><td>Douglas</td>
<td>Tammy</td>
<tr align="right">
<td>29</td><td>Edward</td>
<td>Kathleen</td>
<tr align="right">
<td>30</td><td>Larry</td>
<td>Denise</td>
<tr align="right">
<td>31</td><td>George</td>
<td>Debbie</td>
<tr align="right">
<td>32</td><td>Terry</td>
<td>Janet</td>
<tr align="right">
<td>33</td><td>Randy</td>
<td>Cindy</td>
<tr align="right">
<td>34</td><td>Dennis</td>
<td>Michelle</td>
<tr align="right">
<td>35</td><td>Keith</td>
<td>Theresa</td>
<tr align="right">
<td>36</td><td>Mike</td>
<td>Kim</td>
<tr align="right">
<td>37</td><td>Jerry</td>
<td>Jacqueline</td>
<tr align="right">
<td>38</td><td>Eric</td>
<td>Angela</td>
<tr align="right">
<td>39</td><td>Patrick</td>
<td>Christine</td>
<tr align="right">
<td>40</td><td>Bruce</td>
<td>Margaret</td>
<tr align="right">
<td>41</td><td>Frank</td>
<td>Tina</td>
<tr align="right">
<td>42</td><td>Peter</td>
<td>Carolyn</td>
<tr align="right">
<td>43</td><td>Craig</td>
<td>Laurie</td>
<tr align="right">
<td>44</td><td>Ricky</td>
<td>Rebecca</td>
<tr align="right">
<td>45</td><td>Steve</td>
<td>Kelly</td>
<tr align="right">
<td>46</td><td>Todd</td>
<td>Rhonda</td>
<tr align="right">
<td>47</td><td>Roger</td>
<td>Jennifer</td>
<tr align="right">
<td>48</td><td>Raymond</td>
<td>Catherine</td>
<tr align="right">
<td>49</td><td>Jeff</td>
<td>Dawn</td>
<tr align="right">
<td>50</td><td>Jeffery</td>
<td>Connie</td>
<tr align="right">
<td>51</td><td>Alan</td>
<td>Terri</td>
<tr align="right">
<td>52</td><td>Andrew</td>
<td>Janice</td>
<tr align="right">
<td>53</td><td>Tony</td>
<td>Sherry</td>
<tr align="right">
<td>54</td><td>Danny</td>
<td>Ann</td>
<tr align="right">
<td>55</td><td>Russell</td>
<td>Cathy</td>
<tr align="right">
<td>56</td><td>Carl</td>
<td>Diana</td>
<tr align="right">
<td>57</td><td>Chris</td>
<td>Judy</td>
<tr align="right">
<td>58</td><td>Dale</td>
<td>Maria</td>
<tr align="right">
<td>59</td><td>Matthew</td>
<td>Sheila</td>
<tr align="right">
<td>60</td><td>Joe</td>
<td>Paula</td>
<tr align="right">
<td>61</td><td>Wayne</td>
<td>Wendy</td>
<tr align="right">
<td>62</td><td>Gerald</td>
<td>Joyce</td>
<tr align="right">
<td>63</td><td>Randall</td>
<td>Michele</td>
<tr align="right">
<td>64</td><td>Glenn</td>
<td>Tracy</td>
<tr align="right">
<td>65</td><td>Tim</td>
<td>Beth</td>
<tr align="right">
<td>66</td><td>Barry</td>
<td>Beverly</td>
<tr align="right">
<td>67</td><td>Lawrence</td>
<td>Valerie</td>
<tr align="right">
<td>68</td><td>Billy</td>
<td>Amy</td>
<tr align="right">
<td>69</td><td>Phillip</td>
<td>Suzanne</td>
<tr align="right">
<td>70</td><td>Johnny</td>
<td>Wanda</td>
<tr align="right">
<td>71</td><td>Jimmy</td>
<td>Lynn</td>
<tr align="right">
<td>72</td><td>Rodney</td>
<td>Jane</td>
<tr align="right">
<td>73</td><td>Martin</td>
<td>Annette</td>
<tr align="right">
<td>74</td><td>Walter</td>
<td>Jill</td>
<tr align="right">
<td>75</td><td>Curtis</td>
<td>Bonnie</td>
<tr align="right">
<td>76</td><td>Bobby</td>
<td>Vicki</td>
<tr align="right">
<td>77</td><td>Greg</td>
<td>Carla</td>
<tr align="right">
<td>78</td><td>Jim</td>
<td>Stephanie</td>
<tr align="right">
<td>79</td><td>Philip</td>
<td>Renee</td>
<tr align="right">
<td>80</td><td>Darryl</td>
<td>Darlene</td>
<tr align="right">
<td>81</td><td>Jay</td>
<td>Martha</td>
<tr align="right">
<td>82</td><td>Bryan</td>
<td>Judith</td>
<tr align="right">
<td>83</td><td>Roy</td>
<td>Gloria</td>
<tr align="right">
<td>84</td><td>Dean</td>
<td>Leslie</td>
<tr align="right">
<td>85</td><td>Arthur</td>
<td>Katherine</td>
<tr align="right">
<td>86</td><td>Willie</td>
<td>Shirley</td>
<tr align="right">
<td>87</td><td>Bradley</td>
<td>Betty</td>
<tr align="right">
<td>88</td><td>Tom</td>
<td>Peggy</td>
<tr align="right">
<td>89</td><td>Samuel</td>
<td>Joan</td>
<tr align="right">
<td>90</td><td>Jack</td>
<td>Anne</td>
<tr align="right">
<td>91</td><td>Henry</td>
<td>Anita</td>
<tr align="right">
<td>92</td><td>Jon</td>
<td>Jean</td>
<tr align="right">
<td>93</td><td>Ronnie</td>
<td>Kathryn</td>
<tr align="right">
<td>94</td><td>Harold</td>
<td>Gail</td>
<tr align="right">
<td>95</td><td>Ralph</td>
<td>Melissa</td>
<tr align="right">
<td>96</td><td>Allen</td>
<td>Ruth</td>
<tr align="right">
<td>97</td><td>Albert</td>
<td>Ellen</td>
<tr align="right">
<td>98</td><td>Vincent</td>
<td>Regina</td>
<tr align="right">
<td>99</td><td>Victor</td>
<td>Dorothy</td>
<tr align="right">
<td>100</td><td>Troy</td>
<td>Anna</td>
<tr align="right">
<td>101</td><td>Darrell</td>
<td>Penny</td>
<tr align="right">
<td>102</td><td>Eddie</td>
<td>Joanne</td>
<tr align="right">
<td>103</td><td>Micheal</td>
<td>Virginia</td>
<tr align="right">
<td>104</td><td>Bill</td>
<td>Maureen</td>
<tr align="right">
<td>105</td><td>Louis</td>
<td>Rita</td>
<tr align="right">
<td>106</td><td>Stanley</td>
<td>Colleen</td>
<tr align="right">
<td>107</td><td>Jose</td>
<td>Vickie</td>
<tr align="right">
<td>108</td><td>Rick</td>
<td>Terry</td>
<tr align="right">
<td>109</td><td>Howard</td>
<td>Marie</td>
<tr align="right">
<td>110</td><td>Joel</td>
<td>Andrea</td>
<tr align="right">
<td>111</td><td>Jonathan</td>
<td>Rose</td>
<tr align="right">
<td>112</td><td>Dwayne</td>
<td>Jackie</td>
<tr align="right">
<td>113</td><td>Eugene</td>
<td>Sarah</td>
<tr align="right">
<td>114</td><td>Leonard</td>
<td>Victoria</td>
<tr align="right">
<td>115</td><td>Dan</td>
<td>Becky</td>
<tr align="right">
<td>116</td><td>Tommy</td>
<td>Julia</td>
<tr align="right">
<td>117</td><td>Frederick</td>
<td>Gina</td>
<tr align="right">
<td>118</td><td>Mitchell</td>
<td>Elaine</td>
<tr align="right">
<td>119</td><td>Tracy</td>
<td>Helen</td>
<tr align="right">
<td>120</td><td>Marvin</td>
<td>Phyllis</td>
<tr align="right">
<td>121</td><td>Don</td>
<td>Sherri</td>
<tr align="right">
<td>122</td><td>Lee</td>
<td>Marilyn</td>
<tr align="right">
<td>123</td><td>Ernest</td>
<td>Melanie</td>
<tr align="right">
<td>124</td><td>Fred</td>
<td>Sylvia</td>
<tr align="right">
<td>125</td><td>Kelly</td>
<td>Tamara</td>
<tr align="right">
<td>126</td><td>Ray</td>
<td>Alice</td>
<tr align="right">
<td>127</td><td>Calvin</td>
<td>Yvonne</td>
<tr align="right">
<td>128</td><td>Melvin</td>
<td>Dana</td>
<tr align="right">
<td>129</td><td>Kurt</td>
<td>Melinda</td>
<tr align="right">
<td>130</td><td>Dave</td>
<td>Sue</td>
<tr align="right">
<td>131</td><td>Harry</td>
<td>Eileen</td>
<tr align="right">
<td>132</td><td>Duane</td>
<td>Christina</td>
<tr align="right">
<td>133</td><td>Marc</td>
<td>Sally</td>
<tr align="right">
<td>134</td><td>Glen</td>
<td>Sandy</td>
<tr align="right">
<td>135</td><td>Norman</td>
<td>Frances</td>
<tr align="right">
<td>136</td><td>Jerome</td>
<td>Monica</td>
<tr align="right">
<td>137</td><td>Brent</td>
<td>Joann</td>
<tr align="right">
<td>138</td><td>Karl</td>
<td>Jeanne</td>
<tr align="right">
<td>139</td><td>Earl</td>
<td>Carrie</td>
<tr align="right">
<td>140</td><td>Kirk</td>
<td>Sheryl</td>
<tr align="right">
<td>141</td><td>Bob</td>
<td>Shari</td>
<tr align="right">
<td>142</td><td>Brad</td>
<td>Belinda</td>
<tr align="right">
<td>143</td><td>Shawn</td>
<td>Lorraine</td>
<tr align="right">
<td>144</td><td>Reginald</td>
<td>Pam</td>
<tr align="right">
<td>145</td><td>Edwin</td>
<td>Shelly</td>
<tr align="right">
<td>146</td><td>Benjamin</td>
<td>Evelyn</td>
<tr align="right">
<td>147</td><td>Kent</td>
<td>Charlotte</td>
<tr align="right">
<td>148</td><td>Francis</td>
<td>Loretta</td>
<tr align="right">
<td>149</td><td>Clifford</td>
<td>Toni</td>
<tr align="right">
<td>150</td><td>Jesse</td>
<td>Charlene</td>
<tr align="right">
<td>151</td><td>Theodore</td>
<td>Tracey</td>
<tr align="right">
<td>152</td><td>Alfred</td>
<td>Jo</td>
<tr align="right">
<td>153</td><td>Rickey</td>
<td>Vanessa</td>
<tr align="right">
<td>154</td><td>Perry</td>
<td>Veronica</td>
<tr align="right">
<td>155</td><td>Clarence</td>
<td>Deanna</td>
<tr align="right">
<td>156</td><td>Bernard</td>
<td>Marcia</td>
<tr align="right">
<td>157</td><td>Warren</td>
<td>Patty</td>
<tr align="right">
<td>158</td><td>Nicholas</td>
<td>Joy</td>
<tr align="right">
<td>159</td><td>Brett</td>
<td>Glenda</td>
<tr align="right">
<td>160</td><td>Juan</td>
<td>Holly</td>
<tr align="right">
<td>161</td><td>Kerry</td>
<td>Doris</td>
<tr align="right">
<td>162</td><td>Guy</td>
<td>Roberta</td>
<tr align="right">
<td>163</td><td>Wesley</td>
<td>Jeanette</td>
<tr align="right">
<td>164</td><td>Carlos</td>
<td>Norma</td>
<tr align="right">
<td>165</td><td>Gordon</td>
<td>Gwendolyn</td>
<tr align="right">
<td>166</td><td>Stuart</td>
<td>Heidi</td>
<tr align="right">
<td>167</td><td>Aaron</td>
<td>Yolanda</td>
<tr align="right">
<td>168</td><td>Alvin</td>
<td>Sheri</td>
<tr align="right">
<td>169</td><td>Robin</td>
<td>Lynne</td>
<tr align="right">
<td>170</td><td>Ron</td>
<td>Carmen</td>
<tr align="right">
<td>171</td><td>Leroy</td>
<td>Jamie</td>
<tr align="right">
<td>172</td><td>Doug</td>
<td>Melody</td>
<tr align="right">
<td>173</td><td>Lance</td>
<td>Teri</td>
<tr align="right">
<td>174</td><td>Darren</td>
<td>Tami</td>
<tr align="right">
<td>175</td><td>Vernon</td>
<td>Vicky</td>
<tr align="right">
<td>176</td><td>Gregg</td>
<td>Sara</td>
<tr align="right">
<td>177</td><td>Sean</td>
<td>Caroline</td>
<tr align="right">
<td>178</td><td>Gilbert</td>
<td>Dianne</td>
<tr align="right">
<td>179</td><td>Kenny</td>
<td>Marsha</td>
<tr align="right">
<td>180</td><td>Dana</td>
<td>Shelley</td>
<tr align="right">
<td>181</td><td>Lloyd</td>
<td>Rosemary</td>
<tr align="right">
<td>182</td><td>Herbert</td>
<td>Crystal</td>
<tr align="right">
<td>183</td><td>Daryl</td>
<td>Lois</td>
<tr align="right">
<td>184</td><td>Ted</td>
<td>Audrey</td>
<tr align="right">
<td>185</td><td>Gene</td>
<td>Patti</td>
<tr align="right">
<td>186</td><td>Manuel</td>
<td>Rachel</td>
<tr align="right">
<td>187</td><td>Ken</td>
<td>Lynda</td>
<tr align="right">
<td>188</td><td>Dwight</td>
<td>Jan</td>
<tr align="right">
<td>189</td><td>Tyrone</td>
<td>Shelia</td>
<tr align="right">
<td>190</td><td>Leslie</td>
<td>Juanita</td>
<tr align="right">
<td>191</td><td>Lonnie</td>
<td>Tammie</td>
<tr align="right">
<td>192</td><td>Antonio</td>
<td>Kay</td>
<tr align="right">
<td>193</td><td>Adam</td>
<td>Irene</td>
<tr align="right">
<td>194</td><td>Leon</td>
<td>Vivian</td>
<tr align="right">
<td>195</td><td>Franklin</td>
<td>Karla</td>
<tr align="right">
<td>196</td><td>Neil</td>
<td>Jodi</td>
<tr align="right">
<td>197</td><td>Derrick</td>
<td>Doreen</td>
<tr align="right">
<td>198</td><td>Andre</td>
<td>Yvette</td>
<tr align="right">
<td>199</td><td>Nathan</td>
<td>Tonya</td>
<tr align="right">
<td>200</td><td>Timmy</td>
<td>Jody</td>
<tr align="right">
<td>201</td><td>Marty</td>
<td>April</td>
<tr align="right">
<td>202</td><td>Maurice</td>
<td>Roxanne</td>
<tr align="right">
<td>203</td><td>Floyd</td>
<td>Darla</td>
<tr align="right">
<td>204</td><td>Luis</td>
<td>Constance</td>
<tr align="right">
<td>205</td><td>Derek</td>
<td>Carole</td>
<tr align="right">
<td>206</td><td>Donnie</td>
<td>Stacy</td>
<tr align="right">
<td>207</td><td>Ruben</td>
<td>Alicia</td>
<tr align="right">
<td>208</td><td>Andy</td>
<td>Marianne</td>
<tr align="right">
<td>209</td><td>Kelvin</td>
<td>Tanya</td>
<tr align="right">
<td>210</td><td>Clyde</td>
<td>Rosa</td>
<tr align="right">
<td>211</td><td>Allan</td>
<td>Marlene</td>
<tr align="right">
<td>212</td><td>Lewis</td>
<td>Ramona</td>
<tr align="right">
<td>213</td><td>Jackie</td>
<td>Natalie</td>
<tr align="right">
<td>214</td><td>Gerard</td>
<td>Lydia</td>
<tr align="right">
<td>215</td><td>Marcus</td>
<td>Chris</td>
<tr align="right">
<td>216</td><td>Mario</td>
<td>Arlene</td>
<tr align="right">
<td>217</td><td>Lester</td>
<td>Sonya</td>
<tr align="right">
<td>218</td><td>Chuck</td>
<td>Louise</td>
<tr align="right">
<td>219</td><td>Rex</td>
<td>Robyn</td>
<tr align="right">
<td>220</td><td>Joey</td>
<td>Eva</td>
<tr align="right">
<td>221</td><td>Ricardo</td>
<td>Dianna</td>
<tr align="right">
<td>222</td><td>Wade</td>
<td>Lee</td>
<tr align="right">
<td>223</td><td>Alexander</td>
<td>Ronda</td>
<tr align="right">
<td>224</td><td>Byron</td>
<td>June</td>
<tr align="right">
<td>225</td><td>Jimmie</td>
<td>Felicia</td>
<tr align="right">
<td>226</td><td>Wendell</td>
<td>Jana</td>
<tr align="right">
<td>227</td><td>Charlie</td>
<td>Stacey</td>
<tr align="right">
<td>228</td><td>Alex</td>
<td>Cassandra</td>
<tr align="right">
<td>229</td><td>Sam</td>
<td>Gayle</td>
<tr align="right">
<td>230</td><td>Leo</td>
<td>Grace</td>
<tr align="right">
<td>231</td><td>Clayton</td>
<td>Alison</td>
<tr align="right">
<td>232</td><td>Kyle</td>
<td>Jacquelyn</td>
<tr align="right">
<td>233</td><td>Arnold</td>
<td>Debora</td>
<tr align="right">
<td>234</td><td>Randal</td>
<td>Sherrie</td>
<tr align="right">
<td>235</td><td>Freddie</td>
<td>Dolores</td>
<tr align="right">
<td>236</td><td>Roland</td>
<td>Lora</td>
<tr align="right">
<td>237</td><td>Neal</td>
<td>Cheri</td>
<tr align="right">
<td>238</td><td>Garry</td>
<td>Lillian</td>
<tr align="right">
<td>239</td><td>Kim</td>
<td>Esther</td>
<tr align="right">
<td>240</td><td>Milton</td>
<td>Marjorie</td>
<tr align="right">
<td>241</td><td>Randolph</td>
<td>Annie</td>
<tr align="right">
<td>242</td><td>Jason</td>
<td>Janine</td>
<tr align="right">
<td>243</td><td>Johnnie</td>
<td>Geraldine</td>
<tr align="right">
<td>244</td><td>Nathaniel</td>
<td>Maryann</td>
<tr align="right">
<td>245</td><td>Oscar</td>
<td>Ruby</td>
<tr align="right">
<td>246</td><td>Ross</td>
<td>Lynette</td>
<tr align="right">
<td>247</td><td>Herman</td>
<td>Joni</td>
<tr align="right">
<td>248</td><td>Terrence</td>
<td>Lauren</td>
<tr align="right">
<td>249</td><td>Clinton</td>
<td>Jenny</td>
<tr align="right">
<td>250</td><td>Jesus</td>
<td>Kelley</td>
<tr align="right">
<td>251</td><td>Cecil</td>
<td>Nina</td>
<tr align="right">
<td>252</td><td>Harvey</td>
<td>Shannon</td>
<tr align="right">
<td>253</td><td>Nelson</td>
<td>Lorie</td>
<tr align="right">
<td>254</td><td>Jessie</td>
<td>Kimberley</td>
<tr align="right">
<td>255</td><td>Roberto</td>
<td>Bridget</td>
<tr align="right">
<td>256</td><td>Ben</td>
<td>Bernadette</td>
<tr align="right">
<td>257</td><td>Nick</td>
<td>Kristi</td>
<tr align="right">
<td>258</td><td>Pat</td>
<td>Josephine</td>
<tr align="right">
<td>259</td><td>Roderick</td>
<td>Delores</td>
<tr align="right">
<td>260</td><td>Marshall</td>
<td>Allison</td>
<tr align="right">
<td>261</td><td>Clay</td>
<td>Kristine</td>
<tr align="right">
<td>262</td><td>Fredrick</td>
<td>Christy</td>
<tr align="right">
<td>263</td><td>Lynn</td>
<td>Claudia</td>
<tr align="right">
<td>264</td><td>Matt</td>
<td>Edith</td>
<tr align="right">
<td>265</td><td>Chester</td>
<td>Emily</td>
<tr align="right">
<td>266</td><td>Hector</td>
<td>Margie</td>
<tr align="right">
<td>267</td><td>Raul</td>
<td>Pauline</td>
<tr align="right">
<td>268</td><td>Clark</td>
<td>Marla</td>
<tr align="right">
<td>269</td><td>Clifton</td>
<td>Erin</td>
<tr align="right">
<td>270</td><td>Hugh</td>
<td>Betsy</td>
<tr align="right">
<td>271</td><td>Sidney</td>
<td>Susie</td>
<tr align="right">
<td>272</td><td>Jody</td>
<td>Angie</td>
<tr align="right">
<td>273</td><td>Geoffrey</td>
<td>Nora</td>
<tr align="right">
<td>274</td><td>Miguel</td>
<td>Terrie</td>
<tr align="right">
<td>275</td><td>Grant</td>
<td>Kelli</td>
<tr align="right">
<td>276</td><td>Frankie</td>
<td>Heather</td>
<tr align="right">
<td>277</td><td>Claude</td>
<td>Mona</td>
<tr align="right">
<td>278</td><td>Rudy</td>
<td>Priscilla</td>
<tr align="right">
<td>279</td><td>Sammy</td>
<td>Ginger</td>
<tr align="right">
<td>280</td><td>Carlton</td>
<td>Lucy</td>
<tr align="right">
<td>281</td><td>Angelo</td>
<td>Therese</td>
<tr align="right">
<td>282</td><td>Terrance</td>
<td>Amanda</td>
<tr align="right">
<td>283</td><td>Bart</td>
<td>Lorrie</td>
<tr align="right">
<td>284</td><td>Bret</td>
<td>Janie</td>
<tr align="right">
<td>285</td><td>Jamie</td>
<td>Gretchen</td>
<tr align="right">
<td>286</td><td>Rocky</td>
<td>Edna</td>
<tr align="right">
<td>287</td><td>Francisco</td>
<td>Kerry</td>
<tr align="right">
<td>288</td><td>Terence</td>
<td>Myra</td>
<tr align="right">
<td>289</td><td>Wallace</td>
<td>Rochelle</td>
<tr align="right">
<td>290</td><td>Benny</td>
<td>Georgia</td>
<tr align="right">
<td>291</td><td>Ramon</td>
<td>Patsy</td>
<tr align="right">
<td>292</td><td>Rene</td>
<td>Antoinette</td>
<tr align="right">
<td>293</td><td>Pete</td>
<td>Mildred</td>
<tr align="right">
<td>294</td><td>Everett</td>
<td>Jayne</td>
<tr align="right">
<td>295</td><td>Edgar</td>
<td>Sonia</td>
<tr align="right">
<td>296</td><td>Robbie</td>
<td>Rosemarie</td>
<tr align="right">
<td>297</td><td>Ivan</td>
<td>Cecilia</td>
<tr align="right">
<td>298</td><td>Angel</td>
<td>Nadine</td>
<tr align="right">
<td>299</td><td>Morris</td>
<td>Miriam</td>
<tr align="right">
<td>300</td><td>Myron</td>
<td>Francine</td>
<tr align="right">
<td>301</td><td>Curt</td>
<td>Tara</td>
<tr align="right">
<td>302</td><td>Jaime</td>
<td>Cathleen</td>
<tr align="right">
<td>303</td><td>Lyle</td>
<td>Bonita</td>
<tr align="right">
<td>304</td><td>Max</td>
<td>Marian</td>
<tr align="right">
<td>305</td><td>Darrel</td>
<td>Shawn</td>
<tr align="right">
<td>306</td><td>Loren</td>
<td>Bobbie</td>
<tr align="right">
<td>307</td><td>Cedric</td>
<td>Emma</td>
<tr align="right">
<td>308</td><td>Stewart</td>
<td>Gwen</td>
<tr align="right">
<td>309</td><td>Lorenzo</td>
<td>Patrice</td>
<tr align="right">
<td>310</td><td>Mickey</td>
<td>Jeannie</td>
<tr align="right">
<td>311</td><td>Dewayne</td>
<td>Kari</td>
<tr align="right">
<td>312</td><td>Phil</td>
<td>Kellie</td>
<tr align="right">
<td>313</td><td>Adrian</td>
<td>Traci</td>
<tr align="right">
<td>314</td><td>Cary</td>
<td>Sabrina</td>
<tr align="right">
<td>315</td><td>Virgil</td>
<td>Katrina</td>
<tr align="right">
<td>316</td><td>Pedro</td>
<td>Clara</td>
<tr align="right">
<td>317</td><td>Teddy</td>
<td>Jeannette</td>
<tr align="right">
<td>318</td><td>Christian</td>
<td>Leticia</td>
<tr align="right">
<td>319</td><td>Ed</td>
<td>Sonja</td>
<tr align="right">
<td>320</td><td>Fernando</td>
<td>Dora</td>
<tr align="right">
<td>321</td><td>Orlando</td>
<td>Joanna</td>
<tr align="right">
<td>322</td><td>Armando</td>
<td>Vera</td>
<tr align="right">
<td>323</td><td>Felix</td>
<td>Rene</td>
<tr align="right">
<td>324</td><td>Travis</td>
<td>Celeste</td>
<tr align="right">
<td>325</td><td>Bradford</td>
<td>Irma</td>
<tr align="right">
<td>326</td><td>Shane</td>
<td>Leigh</td>
<tr align="right">
<td>327</td><td>Rafael</td>
<td>Kristin</td>
<tr align="right">
<td>328</td><td>Rusty</td>
<td>Gladys</td>
<tr align="right">
<td>329</td><td>Drew</td>
<td>Lana</td>
<tr align="right">
<td>330</td><td>Monte</td>
<td>Claire</td>
<tr align="right">
<td>331</td><td>Marion</td>
<td>Lucinda</td>
<tr align="right">
<td>332</td><td>Salvatore</td>
<td>Leah</td>
<tr align="right">
<td>333</td><td>Gabriel</td>
<td>Deirdre</td>
<tr align="right">
<td>334</td><td>Ira</td>
<td>Alma</td>
<tr align="right">
<td>335</td><td>Otis</td>
<td>Faith</td>
<tr align="right">
<td>336</td><td>Jorge</td>
<td>Candy</td>
<tr align="right">
<td>337</td><td>Laurence</td>
<td>Molly</td>
<tr align="right">
<td>338</td><td>Monty</td>
<td>Thelma</td>
<tr align="right">
<td>339</td><td>Alberto</td>
<td>Paulette</td>
<tr align="right">
<td>340</td><td>Alton</td>
<td>Dena</td>
<tr align="right">
<td>341</td><td>Javier</td>
<td>Trina</td>
<tr align="right">
<td>342</td><td>Julian</td>
<td>Bernice</td>
<tr align="right">
<td>343</td><td>Van</td>
<td>Beatrice</td>
<tr align="right">
<td>344</td><td>Earnest</td>
<td>Lesa</td>
<tr align="right">
<td>345</td><td>Edmund</td>
<td>Laurel</td>
<tr align="right">
<td>346</td><td>Malcolm</td>
<td>Nanette</td>
<tr align="right">
<td>347</td><td>Erik</td>
<td>Eleanor</td>
<tr align="right">
<td>348</td><td>Bennie</td>
<td>Marion</td>
<tr align="right">
<td>349</td><td>Sylvester</td>
<td>Candace</td>
<tr align="right">
<td>350</td><td>Blake</td>
<td>Bertha</td>
<tr align="right">
<td>351</td><td>Jacob</td>
<td>Dina</td>
<tr align="right">
<td>352</td><td>Willard</td>
<td>Billie</td>
<tr align="right">
<td>353</td><td>Tod</td>
<td>Luann</td>
<tr align="right">
<td>354</td><td>Rory</td>
<td>Karin</td>
<tr align="right">
<td>355</td><td>Kris</td>
<td>Lauri</td>
<tr align="right">
<td>356</td><td>Jeffry</td>
<td>Wilma</td>
<tr align="right">
<td>357</td><td>Sherman</td>
<td>Jeri</td>
<tr align="right">
<td>358</td><td>Arturo</td>
<td>Ella</td>
<tr align="right">
<td>359</td><td>Isaac</td>
<td>Janis</td>
<tr align="right">
<td>360</td><td>Justin</td>
<td>Iris</td>
<tr align="right">
<td>361</td><td>Evan</td>
<td>Tracie</td>
<tr align="right">
<td>362</td><td>Luther</td>
<td>Ida</td>
<tr align="right">
<td>363</td><td>Elmer</td>
<td>Adrienne</td>
<tr align="right">
<td>364</td><td>Alonzo</td>
<td>Jeanine</td>
<tr align="right">
<td>365</td><td>Delbert</td>
<td>Jennie</td>
<tr align="right">
<td>366</td><td>Rodger</td>
<td>Marcella</td>
<tr align="right">
<td>367</td><td>Damon</td>
<td>Trudy</td>
<tr align="right">
<td>368</td><td>Vance</td>
<td>Lorri</td>
<tr align="right">
<td>369</td><td>Scot</td>
<td>Rosie</td>
<tr align="right">
<td>370</td><td>Alfredo</td>
<td>Naomi</td>
<tr align="right">
<td>371</td><td>Rickie</td>
<td>Daphne</td>
<tr align="right">
<td>372</td><td>Preston</td>
<td>Jessica</td>
<tr align="right">
<td>373</td><td>Dominic</td>
<td>Leanne</td>
<tr align="right">
<td>374</td><td>Cory</td>
<td>Danielle</td>
<tr align="right">
<td>375</td><td>Jerald</td>
<td>Liz</td>
<tr align="right">
<td>376</td><td>Rob</td>
<td>Polly</td>
<tr align="right">
<td>377</td><td>Clint</td>
<td>Faye</td>
<tr align="right">
<td>378</td><td>Darin</td>
<td>Jolene</td>
<tr align="right">
<td>379</td><td>Stephan</td>
<td>Ana</td>
<tr align="right">
<td>380</td><td>Leland</td>
<td>Florence</td>
<tr align="right">
<td>381</td><td>Forrest</td>
<td>Lucille</td>
<tr align="right">
<td>382</td><td>Noel</td>
<td>Ethel</td>
<tr align="right">
<td>383</td><td>Ernie</td>
<td>Maxine</td>
<tr align="right">
<td>384</td><td>Julius</td>
<td>Cherie</td>
<tr align="right">
<td>385</td><td>Roosevelt</td>
<td>Rosalind</td>
<tr align="right">
<td>386</td><td>Blaine</td>
<td>Dee</td>
<tr align="right">
<td>387</td><td>Bryant</td>
<td>Angelia</td>
<tr align="right">
<td>388</td><td>Dexter</td>
<td>Kris</td>
<tr align="right">
<td>389</td><td>Lionel</td>
<td>Della</td>
<tr align="right">
<td>390</td><td>Rod</td>
<td>Pat</td>
<tr align="right">
<td>391</td><td>Kendall</td>
<td>Jeannine</td>
<tr align="right">
<td>392</td><td>Luke</td>
<td>Tammi</td>
<tr align="right">
<td>393</td><td>Rudolph</td>
<td>Alisa</td>
<tr align="right">
<td>394</td><td>Sheldon</td>
<td>Stella</td>
<tr align="right">
<td>395</td><td>Corey</td>
<td>Gay</td>
<tr align="right">
<td>396</td><td>Alfonso</td>
<td>Katie</td>
<tr align="right">
<td>397</td><td>Mitch</td>
<td>Angel</td>
<tr align="right">
<td>398</td><td>Spencer</td>
<td>Lorna</td>
<tr align="right">
<td>399</td><td>Archie</td>
<td>Susanne</td>
<tr align="right">
<td>400</td><td>Ryan</td>
<td>Debby</td>
<tr align="right">
<td>401</td><td>Lowell</td>
<td>Noreen</td>
<tr align="right">
<td>402</td><td>Tommie</td>
<td>Tamera</td>
<tr align="right">
<td>403</td><td>Doyle</td>
<td>Darcy</td>
<tr align="right">
<td>404</td><td>Horace</td>
<td>Kristy</td>
<tr align="right">
<td>405</td><td>Dirk</td>
<td>Janette</td>
<tr align="right">
<td>406</td><td>Buddy</td>
<td>Corinne</td>
<tr align="right">
<td>407</td><td>Gerry</td>
<td>Amelia</td>
<tr align="right">
<td>408</td><td>Darwin</td>
<td>Madeline</td>
<tr align="right">
<td>409</td><td>Enrique</td>
<td>Lena</td>
<tr align="right">
<td>410</td><td>Eduardo</td>
<td>Cecelia</td>
<tr align="right">
<td>411</td><td>Dino</td>
<td>Kristina</td>
<tr align="right">
<td>412</td><td>Hubert</td>
<td>Desiree</td>
<tr align="right">
<td>413</td><td>Wilbert</td>
<td>Jodie</td>
<tr align="right">
<td>414</td><td>Zachary</td>
<td>Leann</td>
<tr align="right">
<td>415</td><td>Chad</td>
<td>Olga</td>
<tr align="right">
<td>416</td><td>Stevie</td>
<td>Jerri</td>
<tr align="right">
<td>417</td><td>Al</td>
<td>Monique</td>
<tr align="right">
<td>418</td><td>Willis</td>
<td>Marcy</td>
<tr align="right">
<td>419</td><td>Casey</td>
<td>Margarita</td>
<tr align="right">
<td>420</td><td>Owen</td>
<td>Camille</td>
<tr align="right">
<td>421</td><td>Boyd</td>
<td>Elisa</td>
<tr align="right">
<td>422</td><td>Colin</td>
<td>Valarie</td>
<tr align="right">
<td>423</td><td>Darnell</td>
<td>Kristen</td>
<tr align="right">
<td>424</td><td>Joshua</td>
<td>Mindy</td>
<tr align="right">
<td>425</td><td>Oliver</td>
<td>Kathi</td>
<tr align="right">
<td>426</td><td>Jan</td>
<td>Celia</td>
<tr align="right">
<td>427</td><td>Mathew</td>
<td>Christie</td>
<tr align="right">
<td>428</td><td>Salvador</td>
<td>Velma</td>
<tr align="right">
<td>429</td><td>Russ</td>
<td>Rena</td>
<tr align="right">
<td>430</td><td>Dallas</td>
<td>Suzette</td>
<tr align="right">
<td>431</td><td>Ward</td>
<td>Sondra</td>
<tr align="right">
<td>432</td><td>Cornelius</td>
<td>Deanne</td>
<tr align="right">
<td>433</td><td>Hal</td>
<td>Hazel</td>
<tr align="right">
<td>434</td><td>Grady</td>
<td>Ladonna</td>
<tr align="right">
<td>435</td><td>Julio</td>
<td>Hope</td>
<tr align="right">
<td>436</td><td>Shannon</td>
<td>Kerri</td>
<tr align="right">
<td>437</td><td>Stan</td>
<td>Lillie</td>
<tr align="right">
<td>438</td><td>Freddy</td>
<td>Rosalie</td>
<tr align="right">
<td>439</td><td>Carey</td>
<td>Marguerite</td>
<tr align="right">
<td>440</td><td>Trent</td>
<td>Willie</td>
<tr align="right">
<td>441</td><td>Louie</td>
<td>Tamra</td>
<tr align="right">
<td>442</td><td>Rufus</td>
<td>Johnna</td>
<tr align="right">
<td>443</td><td>Seth</td>
<td>Marybeth</td>
<tr align="right">
<td>444</td><td>Ellis</td>
<td>Colette</td>
<tr align="right">
<td>445</td><td>Ervin</td>
<td>Benita</td>
<tr align="right">
<td>446</td><td>Vince</td>
<td>Gale</td>
<tr align="right">
<td>447</td><td>Miles</td>
<td>Lou</td>
<tr align="right">
<td>448</td><td>Ronny</td>
<td>Robbin</td>
<tr align="right">
<td>449</td><td>Homer</td>
<td>Jessie</td>
<tr align="right">
<td>450</td><td>Ty</td>
<td>Robbie</td>
<tr align="right">
<td>451</td><td>Stacy</td>
<td>Deana</td>
<tr align="right">
<td>452</td><td>Bert</td>
<td>Delia</td>
<tr align="right">
<td>453</td><td>Cameron</td>
<td>Mitzi</td>
<tr align="right">
<td>454</td><td>Elliott</td>
<td>Verna</td>
<tr align="right">
<td>455</td><td>Robby</td>
<td>Gayla</td>
<tr align="right">
<td>456</td><td>Donny</td>
<td>Margo</td>
<tr align="right">
<td>457</td><td>Stacey</td>
<td>Lynnette</td>
<tr align="right">
<td>458</td><td>Dominick</td>
<td>Deidre</td>
<tr align="right">
<td>459</td><td>Mack</td>
<td>Barb</td>
<tr align="right">
<td>460</td><td>Denis</td>
<td>Laverne</td>
<tr align="right">
<td>461</td><td>Wilbur</td>
<td>Lenora</td>
<tr align="right">
<td>462</td><td>Scotty</td>
<td>Danette</td>
<tr align="right">
<td>463</td><td>Bryon</td>
<td>Dale</td>
<tr align="right">
<td>464</td><td>Marlon</td>
<td>Kimberlee</td>
<tr align="right">
<td>465</td><td>Toby</td>
<td>Freda</td>
<tr align="right">
<td>466</td><td>Dewey</td>
<td>Judi</td>
<tr align="right">
<td>467</td><td>Rodolfo</td>
<td>Harriet</td>
<tr align="right">
<td>468</td><td>Dane</td>
<td>Olivia</td>
<tr align="right">
<td>469</td><td>Randell</td>
<td>Janelle</td>
<tr align="right">
<td>470</td><td>Jess</td>
<td>Randi</td>
<tr align="right">
<td>471</td><td>Sergio</td>
<td>Leona</td>
<tr align="right">
<td>472</td><td>Alphonso</td>
<td>Geneva</td>
<tr align="right">
<td>473</td><td>Garland</td>
<td>Hilda</td>
<tr align="right">
<td>474</td><td>Kirby</td>
<td>Ingrid</td>
<tr align="right">
<td>475</td><td>Shaun</td>
<td>Cora</td>
<tr align="right">
<td>476</td><td>Ernesto</td>
<td>Maryellen</td>
<tr align="right">
<td>477</td><td>Abel</td>
<td>Viola</td>
<tr align="right">
<td>478</td><td>Cliff</td>
<td>Daisy</td>
<tr align="right">
<td>479</td><td>Abraham</td>
<td>Guadalupe</td>
<tr align="right">
<td>480</td><td>Joesph</td>
<td>Coleen</td>
<tr align="right">
<td>481</td><td>Conrad</td>
<td>Annmarie</td>
<tr align="right">
<td>482</td><td>Royce</td>
<td>Elise</td>
<tr align="right">
<td>483</td><td>Lamont</td>
<td>Julianne</td>
<tr align="right">
<td>484</td><td>Sammie</td>
<td>Lea</td>
<tr align="right">
<td>485</td><td>Wilson</td>
<td>Megan</td>
<tr align="right">
<td>486</td><td>Carroll</td>
<td>Cindi</td>
<tr align="right">
<td>487</td><td>Lane</td>
<td>Elena</td>
<tr align="right">
<td>488</td><td>Lamar</td>
<td>Lola</td>
<tr align="right">
<td>489</td><td>Aubrey</td>
<td>Kathie</td>
<tr align="right">
<td>490</td><td>Gilberto</td>
<td>Agnes</td>
<tr align="right">
<td>491</td><td>Denny</td>
<td>Bobbi</td>
<tr align="right">
<td>492</td><td>Guadalupe</td>
<td>Felecia</td>
<tr align="right">
<td>493</td><td>Reggie</td>
<td>Roseann</td>
<tr align="right">
<td>494</td><td>Amos</td>
<td>Shelby</td>
<tr align="right">
<td>495</td><td>Elbert</td>
<td>Ernestine</td>
<tr align="right">
<td>496</td><td>Irvin</td>
<td>Dixie</td>
<tr align="right">
<td>497</td><td>Rolando</td>
<td>Helene</td>
<tr align="right">
<td>498</td><td>Pablo</td>
<td>Alesia</td>
<tr align="right">
<td>499</td><td>Michel</td>
<td>Deann</td>
<tr align="right">
<td>500</td><td>Cleveland</td>
<td>Tamela</td>
<tr align="right">
<td>501</td><td>Moses</td>
<td>Kristie</td>
<tr align="right">
<td>502</td><td>Reynaldo</td>
<td>Bridgette</td>
<tr align="right">
<td>503</td><td>Norris</td>
<td>Johanna</td>
<tr align="right">
<td>504</td><td>Percy</td>
<td>Rachelle</td>
<tr align="right">
<td>505</td><td>Sandy</td>
<td>Deloris</td>
<tr align="right">
<td>506</td><td>Sterling</td>
<td>Tonia</td>
<tr align="right">
<td>507</td><td>Ian</td>
<td>Luanne</td>
<tr align="right">
<td>508</td><td>Alejandro</td>
<td>Maryanne</td>
<tr align="right">
<td>509</td><td>Edmond</td>
<td>Elisabeth</td>
<tr align="right">
<td>510</td><td>Marlin</td>
<td>Maura</td>
<tr align="right">
<td>511</td><td>Brendan</td>
<td>Isabel</td>
<tr align="right">
<td>512</td><td>Eddy</td>
<td>Stacie</td>
<tr align="right">
<td>513</td><td>Gerardo</td>
<td>Jeanie</td>
<tr align="right">
<td>514</td><td>Pierre</td>
<td>Sallie</td>
<tr align="right">
<td>515</td><td>Blair</td>
<td>Christi</td>
<tr align="right">
<td>516</td><td>Emmett</td>
<td>Greta</td>
<tr align="right">
<td>517</td><td>Dion</td>
<td>Mae</td>
<tr align="right">
<td>518</td><td>Kurtis</td>
<td>Sandi</td>
<tr align="right">
<td>519</td><td>Tracey</td>
<td>Deena</td>
<tr align="right">
<td>520</td><td>Rich</td>
<td>Kendra</td>
<tr align="right">
<td>521</td><td>Wilfred</td>
<td>Marta</td>
<tr align="right">
<td>522</td><td>Darrin</td>
<td>Pearl</td>
<tr align="right">
<td>523</td><td>Israel</td>
<td>Mari</td>
<tr align="right">
<td>524</td><td>Felipe</td>
<td>Krista</td>
<tr align="right">
<td>525</td><td>Simon</td>
<td>Myrna</td>
<tr align="right">
<td>526</td><td>Harlan</td>
<td>Paige</td>
<tr align="right">
<td>527</td><td>Galen</td>
<td>Ada</td>
<tr align="right">
<td>528</td><td>Murray</td>
<td>Elsie</td>
<tr align="right">
<td>529</td><td>Barney</td>
<td>Rosanne</td>
<tr align="right">
<td>530</td><td>Reuben</td>
<td>Johnnie</td>
<tr align="right">
<td>531</td><td>Thaddeus</td>
<td>Rosalyn</td>
<tr align="right">
<td>532</td><td>Will</td>
<td>Cara</td>
<tr align="right">
<td>533</td><td>Nicky</td>
<td>Saundra</td>
<tr align="right">
<td>534</td><td>Jefferson</td>
<td>Clare</td>
<tr align="right">
<td>535</td><td>Carmen</td>
<td>Jacquline</td>
<tr align="right">
<td>536</td><td>Emanuel</td>
<td>Amber</td>
<tr align="right">
<td>537</td><td>Ramiro</td>
<td>Denice</td>
<tr align="right">
<td>538</td><td>Garrett</td>
<td>Nellie</td>
<tr align="right">
<td>539</td><td>Marco</td>
<td>Eunice</td>
<tr align="right">
<td>540</td><td>Mitchel</td>
<td>Renae</td>
<tr align="right">
<td>541</td><td>Bernie</td>
<td>Leeann</td>
<tr align="right">
<td>542</td><td>Woodrow</td>
<td>Velvet</td>
<tr align="right">
<td>543</td><td>Garth</td>
<td>Eugenia</td>
<tr align="right">
<td>544</td><td>Vaughn</td>
<td>Katharine</td>
<tr align="right">
<td>545</td><td>Kennith</td>
<td>Malinda</td>
<tr align="right">
<td>546</td><td>Barton</td>
<td>Leisa</td>
<tr align="right">
<td>547</td><td>Donnell</td>
<td>Michael</td>
<tr align="right">
<td>548</td><td>Elton</td>
<td>Sophia</td>
<tr align="right">
<td>549</td><td>Lyndon</td>
<td>Geri</td>
<tr align="right">
<td>550</td><td>Austin</td>
<td>Genevieve</td>
<tr align="right">
<td>551</td><td>Terrell</td>
<td>Kara</td>
<tr align="right">
<td>552</td><td>Winston</td>
<td>Laureen</td>
<tr align="right">
<td>553</td><td>Hans</td>
<td>Minnie</td>
<tr align="right">
<td>554</td><td>Morgan</td>
<td>Roxann</td>
<tr align="right">
<td>555</td><td>Andres</td>
<td>Violet</td>
<tr align="right">
<td>556</td><td>Irving</td>
<td>Mattie</td>
<tr align="right">
<td>557</td><td>Tomas</td>
<td>Alberta</td>
<tr align="right">
<td>558</td><td>Tyler</td>
<td>Sharron</td>
<tr align="right">
<td>559</td><td>Lenny</td>
<td>Tena</td>
<tr align="right">
<td>560</td><td>Lonny</td>
<td>Bessie</td>
<tr align="right">
<td>561</td><td>Ned</td>
<td>Kaye</td>
<tr align="right">
<td>562</td><td>Lon</td>
<td>Danita</td>
<tr align="right">
<td>563</td><td>Brandon</td>
<td>Caryn</td>
<tr align="right">
<td>564</td><td>Danial</td>
<td>Janna</td>
<tr align="right">
<td>565</td><td>Elijah</td>
<td>Penelope</td>
<tr align="right">
<td>566</td><td>Bennett</td>
<td>Dorothea</td>
<tr align="right">
<td>567</td><td>Russel</td>
<td>Juli</td>
<tr align="right">
<td>568</td><td>Daren</td>
<td>Lorene</td>
<tr align="right">
<td>569</td><td>Elias</td>
<td>Marcie</td>
<tr align="right">
<td>570</td><td>Junior</td>
<td>Roslyn</td>
<tr align="right">
<td>571</td><td>Elvin</td>
<td>Maggie</td>
<tr align="right">
<td>572</td><td>Art</td>
<td>Reba</td>
<tr align="right">
<td>573</td><td>Elvis</td>
<td>Diann</td>
<tr align="right">
<td>574</td><td>Dwain</td>
<td>Eve</td>
<tr align="right">
<td>575</td><td>Jordan</td>
<td>Claudette</td>
<tr align="right">
<td>576</td><td>Rocco</td>
<td>Tricia</td>
<tr align="right">
<td>577</td><td>Elliot</td>
<td>Marylou</td>
<tr align="right">
<td>578</td><td>Gustavo</td>
<td>Renita</td>
<tr align="right">
<td>579</td><td>Jeremy</td>
<td>Carlene</td>
<tr align="right">
<td>580</td><td>Toney</td>
<td>Charmaine</td>
<tr align="right">
<td>581</td><td>Dick</td>
<td>Letitia</td>
<tr align="right">
<td>582</td><td>Kermit</td>
<td>Lorena</td>
<tr align="right">
<td>583</td><td>Kraig</td>
<td>Marisa</td>
<tr align="right">
<td>584</td><td>Burton</td>
<td>Nikki</td>
<tr align="right">
<td>585</td><td>Jed</td>
<td>Flora</td>
<tr align="right">
<td>586</td><td>Les</td>
<td>Lourdes</td>
<tr align="right">
<td>587</td><td>Avery</td>
<td>Edwina</td>
<tr align="right">
<td>588</td><td>Gus</td>
<td>Marci</td>
<tr align="right">
<td>589</td><td>Reed</td>
<td>Frankie</td>
<tr align="right">
<td>590</td><td>Ismael</td>
<td>Maryjo</td>
<tr align="right">
<td>591</td><td>Erich</td>
<td>Dona</td>
<tr align="right">
<td>592</td><td>Kennedy</td>
<td>Robert</td>
<tr align="right">
<td>593</td><td>Sanford</td>
<td>Jenifer</td>
<tr align="right">
<td>594</td><td>Marcos</td>
<td>Arleen</td>
<tr align="right">
<td>595</td><td>Merle</td>
<td>Blanca</td>
<tr align="right">
<td>596</td><td>Quintin</td>
<td>Geralyn</td>
<tr align="right">
<td>597</td><td>Xavier</td>
<td>James</td>
<tr align="right">
<td>598</td><td>Loyd</td>
<td>Caren</td>
<tr align="right">
<td>599</td><td>Dannie</td>
<td>Elsa</td>
<tr align="right">
<td>600</td><td>Domingo</td>
<td>Lucia</td>
<tr align="right">
<td>601</td><td>Grover</td>
<td>Simone</td>
<tr align="right">
<td>602</td><td>Gino</td>
<td>Luz</td>
<tr align="right">
<td>603</td><td>Lanny</td>
<td>Shawna</td>
<tr align="right">
<td>604</td><td>Jonathon</td>
<td>Estella</td>
<tr align="right">
<td>605</td><td>Kip</td>
<td>Brigitte</td>
<tr align="right">
<td>606</td><td>Saul</td>
<td>Lesley</td>
<tr align="right">
<td>607</td><td>Wilfredo</td>
<td>Allyson</td>
<tr align="right">
<td>608</td><td>Guillermo</td>
<td>John</td>
<tr align="right">
<td>609</td><td>Billie</td>
<td>Nita</td>
<tr align="right">
<td>610</td><td>Cornell</td>
<td>Adele</td>
<tr align="right">
<td>611</td><td>Levi</td>
<td>Antonia</td>
<tr align="right">
<td>612</td><td>Orville</td>
<td>Rosalinda</td>
<tr align="right">
<td>613</td><td>Unknown</td>
<td>Janell</td>
<tr align="right">
<td>614</td><td>Mary</td>
<td>Lesia</td>
<tr align="right">
<td>615</td><td>Harley</td>
<td>Nicole</td>
<tr align="right">
<td>616</td><td>Jake</td>
<td>Roxanna</td>
<tr align="right">
<td>617</td><td>Thurman</td>
<td>Gena</td>
<tr align="right">
<td>618</td><td>Nolan</td>
<td>Lupe</td>
<tr align="right">
<td>619</td><td>Chip</td>
<td>Rae</td>
<tr align="right">
<td>620</td><td>Eldon</td>
<td>Gracie</td>
<tr align="right">
<td>621</td><td>Erwin</td>
<td>Corina</td>
<tr align="right">
<td>622</td><td>Bryce</td>
<td>Merry</td>
<tr align="right">
<td>623</td><td>Linwood</td>
<td>Patrica</td>
<tr align="right">
<td>624</td><td>August</td>
<td>Misty</td>
<tr align="right">
<td>625</td><td>Wally</td>
<td>Terese</td>
<tr align="right">
<td>626</td><td>Zane</td>
<td>Gigi</td>
<tr align="right">
<td>627</td><td>Bobbie</td>
<td>Rosetta</td>
<tr align="right">
<td>628</td><td>Chet</td>
<td>Silvia</td>
<tr align="right">
<td>629</td><td>Fabian</td>
<td>Ava</td>
<tr align="right">
<td>630</td><td>Antoine</td>
<td>Lila</td>
<tr align="right">
<td>631</td><td>Jean</td>
<td>Marina</td>
<tr align="right">
<td>632</td><td>Stefan</td>
<td>Pamala</td>
<tr align="right">
<td>633</td><td>Cesar</td>
<td>Glenna</td>
<tr align="right">
<td>634</td><td>Hank</td>
<td>Selena</td>
<tr align="right">
<td>635</td><td>Jasper</td>
<td>Karyn</td>
<tr align="right">
<td>636</td><td>Roman</td>
<td>Libby</td>
<tr align="right">
<td>637</td><td>Norbert</td>
<td>Meredith</td>
<tr align="right">
<td>638</td><td>Ulysses</td>
<td>Deidra</td>
<tr align="right">
<td>639</td><td>Efrain</td>
<td>Josie</td>
<tr align="right">
<td>640</td><td>Rogelio</td>
<td>Sheree</td>
<tr align="right">
<td>641</td><td>Eli</td>
<td>Twila</td>
<tr align="right">
<td>642</td><td>Emil</td>
<td>Wendi</td>
<tr align="right">
<td>643</td><td>Leonardo</td>
<td>Annemarie</td>
<tr align="right">
<td>644</td><td>Santos</td>
<td>Debi</td>
<tr align="right">
<td>645</td><td>Vern</td>
<td>Keri</td>
<tr align="right">
<td>646</td><td>Emilio</td>
<td>Pattie</td>
<tr align="right">
<td>647</td><td>Quentin</td>
<td>Corrine</td>
<tr align="right">
<td>648</td><td>Santiago</td>
<td>Jami</td>
<tr align="right">
<td>649</td><td>Vito</td>
<td>Vickey</td>
<tr align="right">
<td>650</td><td>Kelley</td>
<td>Maritza</td>
<tr align="right">
<td>651</td><td>Reid</td>
<td>Fran</td>
<tr align="right">
<td>652</td><td>Duncan</td>
<td>Aileen</td>
<tr align="right">
<td>653</td><td>Lindsey</td>
<td>Mamie</td>
<tr align="right">
<td>654</td><td>Solomon</td>
<td>Erma</td>
<tr align="right">
<td>655</td><td>Brady</td>
<td>Fay</td>
<tr align="right">
<td>656</td><td>Frederic</td>
<td>Georgette</td>
<tr align="right">
<td>657</td><td>Theron</td>
<td>Shellie</td>
<tr align="right">
<td>658</td><td>Damian</td>
<td>Teressa</td>
<tr align="right">
<td>659</td><td>Davis</td>
<td>Alfreda</td>
<tr align="right">
<td>660</td><td>Erick</td>
<td>Suzan</td>
<tr align="right">
<td>661</td><td>Harrison</td>
<td>Bridgett</td>
<tr align="right">
<td>662</td><td>Shelton</td>
<td>Erica</td>
<tr align="right">
<td>663</td><td>Courtney</td>
<td>Candice</td>
<tr align="right">
<td>664</td><td>Otto</td>
<td>Hattie</td>
<tr align="right">
<td>665</td><td>Scottie</td>
<td>Henrietta</td>
<tr align="right">
<td>666</td><td>Sonny</td>
<td>Nannette</td>
<tr align="right">
<td>667</td><td>Brook</td>
<td>Kirsten</td>
<tr align="right">
<td>668</td><td>Timmie</td>
<td>Helena</td>
<tr align="right">
<td>669</td><td>Brooks</td>
<td>Angelina</td>
<tr align="right">
<td>670</td><td>Kenton</td>
<td>Clarissa</td>
<tr align="right">
<td>671</td><td>Johnathan</td>
<td>Dinah</td>
<tr align="right">
<td>672</td><td>Mikel</td>
<td>Melba</td>
<tr align="right">
<td>673</td><td>Dudley</td>
<td>Cathryn</td>
<tr align="right">
<td>674</td><td>Carter</td>
<td>Lenore</td>
<tr align="right">
<td>675</td><td>Josh</td>
<td>Abby</td>
<tr align="right">
<td>676</td><td>Roscoe</td>
<td>David</td>
<tr align="right">
<td>677</td><td>Wes</td>
<td>Graciela</td>
<tr align="right">
<td>678</td><td>Errol</td>
<td>Shauna</td>
<tr align="right">
<td>679</td><td>Shelby</td>
<td>Jewel</td>
<tr align="right">
<td>680</td><td>Emmanuel</td>
<td>Ruthie</td>
<tr align="right">
<td>681</td><td>Jeremiah</td>
<td>Abigail</td>
<tr align="right">
<td>682</td><td>Ashley</td>
<td>Kitty</td>
<tr align="right">
<td>683</td><td>Devin</td>
<td>Lisha</td>
<tr align="right">
<td>684</td><td>Noah</td>
<td>Roxane</td>
<tr align="right">
<td>685</td><td>Lindsay</td>
<td>Ilene</td>
<tr align="right">
<td>686</td><td>Richie</td>
<td>Shelli</td>
<tr align="right">
<td>687</td><td>Jacques</td>
<td>Gaye</td>
<tr align="right">
<td>688</td><td>Dante</td>
<td>Melodie</td>
<tr align="right">
<td>689</td><td>Winfred</td>
<td>Migdalia</td>
<tr align="right">
<td>690</td><td>Carmine</td>
<td>Loraine</td>
<tr align="right">
<td>691</td><td>Emory</td>
<td>Valorie</td>
<tr align="right">
<td>692</td><td>Odell</td>
<td>Bernadine</td>
<tr align="right">
<td>693</td><td>Tad</td>
<td>Bethany</td>
<tr align="right">
<td>694</td><td>Emery</td>
<td>Inez</td>
<tr align="right">
<td>695</td><td>Gil</td>
<td>Justine</td>
<tr align="right">
<td>696</td><td>Kristopher</td>
<td>Raquel</td>
<tr align="right">
<td>697</td><td>Raynard</td>
<td>Sharlene</td>
<tr align="right">
<td>698</td><td>Jerold</td>
<td>Dorene</td>
<tr align="right">
<td>699</td><td>Lincoln</td>
<td>Karol</td>
<tr align="right">
<td>700</td><td>Donovan</td>
<td>Kyle</td>
<tr align="right">
<td>701</td><td>Humberto</td>
<td>Nelda</td>
<tr align="right">
<td>702</td><td>Ivory</td>
<td>Antionette</td>
<tr align="right">
<td>703</td><td>Bradly</td>
<td>Jocelyn</td>
<tr align="right">
<td>704</td><td>Quinton</td>
<td>Tana</td>
<tr align="right">
<td>705</td><td>Wiley</td>
<td>Kate</td>
<tr align="right">
<td>706</td><td>Butch</td>
<td>Carmela</td>
<tr align="right">
<td>707</td><td>Derwin</td>
<td>Avis</td>
<tr align="right">
<td>708</td><td>Fidel</td>
<td>Juliana</td>
<tr align="right">
<td>709</td><td>Greggory</td>
<td>Minerva</td>
<tr align="right">
<td>710</td><td>Ignacio</td>
<td>Alexandra</td>
<tr align="right">
<td>711</td><td>Myles</td>
<td>Lyn</td>
<tr align="right">
<td>712</td><td>Omar</td>
<td>Pennie</td>
<tr align="right">
<td>713</td><td>Anton</td>
<td>Rhoda</td>
<tr align="right">
<td>714</td><td>Marcel</td>
<td>Dori</td>
<tr align="right">
<td>715</td><td>Randel</td>
<td>Lawanda</td>
<tr align="right">
<td>716</td><td>Donn</td>
<td>Christa</td>
<tr align="right">
<td>717</td><td>Gavin</td>
<td>Ginny</td>
<tr align="right">
<td>718</td><td>Cody</td>
<td>Liza</td>
<tr align="right">
<td>719</td><td>Hiram</td>
<td>Ivy</td>
<tr align="right">
<td>720</td><td>Noe</td>
<td>Vonda</td>
<tr align="right">
<td>721</td><td>Raphael</td>
<td>Etta</td>
<tr align="right">
<td>722</td><td>Thad</td>
<td>Hilary</td>
<tr align="right">
<td>723</td><td>Weldon</td>
<td>Lula</td>
<tr align="right">
<td>724</td><td>Basil</td>
<td>Louann</td>
<tr align="right">
<td>725</td><td>Carlo</td>
<td>Maribeth</td>
<tr align="right">
<td>726</td><td>Ethan</td>
<td>Fannie</td>
<tr align="right">
<td>727</td><td>Kimberly</td>
<td>Selina</td>
<tr align="right">
<td>728</td><td>Shayne</td>
<td>Valeria</td>
<tr align="right">
<td>729</td><td>Clement</td>
<td>William</td>
<tr align="right">
<td>730</td><td>Jerrold</td>
<td>Francis</td>
<tr align="right">
<td>731</td><td>Mervin</td>
<td>Kathrine</td>
<tr align="right">
<td>732</td><td>Timmothy</td>
<td>Susanna</td>
<tr align="right">
<td>733</td><td>Coy</td>
<td>Gerri</td>
<tr align="right">
<td>734</td><td>Graham</td>
<td>Venus</td>
<tr align="right">
<td>735</td><td>Keven</td>
<td>Elvira</td>
<tr align="right">
<td>736</td><td>Merlin</td>
<td>Mariann</td>
<tr align="right">
<td>737</td><td>Nicolas</td>
<td>Venita</td>
<tr align="right">
<td>738</td><td>Benito</td>
<td>Erika</td>
<tr align="right">
<td>739</td><td>Everette</td>
<td>Leesa</td>
<tr align="right">
<td>740</td><td>Len</td>
<td>Cherri</td>
<tr align="right">
<td>741</td><td>Hollis</td>
<td>Ivette</td>
<tr align="right">
<td>742</td><td>Lars</td>
<td>Loriann</td>
<tr align="right">
<td>743</td><td>Layne</td>
<td>Juliet</td>
<tr align="right">
<td>744</td><td>Ollie</td>
<td>Tamie</td>
<tr align="right">
<td>745</td><td>Faron</td>
<td>Tonja</td>
<tr align="right">
<td>746</td><td>Jefferey</td>
<td>Cari</td>
<tr align="right">
<td>747</td><td>Carson</td>
<td>Danna</td>
<tr align="right">
<td>748</td><td>Curtiss</td>
<td>Lela</td>
<tr align="right">
<td>749</td><td>Adolfo</td>
<td>Starla</td>
<tr align="right">
<td>750</td><td>Elwood</td>
<td>Annamarie</td>
<tr align="right">
<td>751</td><td>Rhett</td>
<td>Missy</td>
<tr align="right">
<td>752</td><td>Taylor</td>
<td>Tresa</td>
<tr align="right">
<td>753</td><td>Bruno</td>
<td>Leila</td>
<tr align="right">
<td>754</td><td>Cris</td>
<td>Tori</td>
<tr align="right">
<td>755</td><td>Sebastian</td>
<td>Kandy</td>
<tr align="right">
<td>756</td><td>Stanford</td>
<td>Madonna</td>
<tr align="right">
<td>757</td><td>Armand</td>
<td>Rachael</td>
<tr align="right">
<td>758</td><td>Denver</td>
<td>Vikki</td>
<tr align="right">
<td>759</td><td>Jacky</td>
<td>Chandra</td>
<tr align="right">
<td>760</td><td>Micah</td>
<td>Cristina</td>
<tr align="right">
<td>761</td><td>Stephon</td>
<td>Dottie</td>
<tr align="right">
<td>762</td><td>Adolph</td>
<td>Jacquelin</td>
<tr align="right">
<td>763</td><td>Edwardo</td>
<td>Rebekah</td>
<tr align="right">
<td>764</td><td>Fredric</td>
<td>Dolly</td>
<tr align="right">
<td>765</td><td>Jude</td>
<td>Gabrielle</td>
<tr align="right">
<td>766</td><td>Mel</td>
<td>Karon</td>
<tr align="right">
<td>767</td><td>Merrill</td>
<td>Marietta</td>
<tr align="right">
<td>768</td><td>Gale</td>
<td>Myrtle</td>
<tr align="right">
<td>769</td><td>Riley</td>
<td>Althea</td>
<tr align="right">
<td>770</td><td>Demetrius</td>
<td>Cathie</td>
<tr align="right">
<td>771</td><td>Lenard</td>
<td>Darleen</td>
<tr align="right">
<td>772</td><td>Charley</td>
<td>Mara</td>
<tr align="right">
<td>773</td><td>Darius</td>
<td>Cherry</td>
<tr align="right">
<td>774</td><td>Kirt</td>
<td>Cyndi</td>
<tr align="right">
<td>775</td><td>Augustine</td>
<td>Roseanne</td>
<tr align="right">
<td>776</td><td>Britt</td>
<td>Valencia</td>
<tr align="right">
<td>777</td><td>Cole</td>
<td>Cheryle</td>
<tr align="right">
<td>778</td><td>Derick</td>
<td>Susana</td>
<tr align="right">
<td>779</td><td>Sal</td>
<td>Ursula</td>
<tr align="right">
<td>780</td><td>Hugo</td>
<td>Mercedes</td>
<tr align="right">
<td>781</td><td>Audie</td>
<td>Blanche</td>
<tr align="right">
<td>782</td><td>Glynn</td>
<td>Teena</td>
<tr align="right">
<td>783</td><td>Anderson</td>
<td>Aida</td>
<tr align="right">
<td>784</td><td>Bud</td>
<td>Aimee</td>
<tr align="right">
<td>785</td><td>Jackson</td>
<td>Babette</td>
<tr align="right">
<td>786</td><td>Lemuel</td>
<td>Bambi</td>
<tr align="right">
<td>787</td><td>Brien</td>
<td>Lucretia</td>
<tr align="right">
<td>788</td><td>Darron</td>
<td>Dawna</td>
<tr align="right">
<td>789</td><td>Isaiah</td>
<td>Elva</td>
<tr align="right">
<td>790</td><td>Jarvis</td>
<td>Lavonne</td>
<tr align="right">
<td>791</td><td>Vicente</td>
<td>Eloise</td>
<tr align="right">
<td>792</td><td>Delmar</td>
<td>Dayna</td>
<tr align="right">
<td>793</td><td>Desmond</td>
<td>Georgina</td>
<tr align="right">
<td>794</td><td>Judson</td>
<td>Gertrude</td>
<tr align="right">
<td>795</td><td>Lorne</td>
<td>Lanette</td>
<tr align="right">
<td>796</td><td>Baron</td>
<td>Muriel</td>
<tr align="right">
<td>797</td><td>Blane</td>
<td>Tania</td>
<tr align="right">
<td>798</td><td>Burt</td>
<td>Karrie</td>
<tr align="right">
<td>799</td><td>Lupe</td>
<td>Katy</td>
<tr align="right">
<td>800</td><td>Mckinley</td>
<td>Charla</td>
<tr align="right">
<td>801</td><td>Royal</td>
<td>Esmeralda</td>
<tr align="right">
<td>802</td><td>Alec</td>
<td>Leanna</td>
<tr align="right">
<td>803</td><td>Antony</td>
<td>Letha</td>
<tr align="right">
<td>804</td><td>Cyrus</td>
<td>Magdalena</td>
<tr align="right">
<td>805</td><td>Fletcher</td>
<td>Mimi</td>
<tr align="right">
<td>806</td><td>Gregorio</td>
<td>Roxie</td>
<tr align="right">
<td>807</td><td>Del</td>
<td>Suzy</td>
<tr align="right">
<td>808</td><td>Douglass</td>
<td>Carleen</td>
<tr align="right">
<td>809</td><td>Elroy</td>
<td>Delphine</td>
<tr align="right">
<td>810</td><td>Mason</td>
<td>Joanie</td>
<tr align="right">
<td>811</td><td>Millard</td>
<td>Bettina</td>
<tr align="right">
<td>812</td><td>Eliot</td>
<td>Carolina</td>
<tr align="right">
<td>813</td><td>Irwin</td>
<td>Corinna</td>
<tr align="right">
<td>814</td><td>Lucas</td>
<td>Debbi</td>
<tr align="right">
<td>815</td><td>Rock</td>
<td>Jacki</td>
<tr align="right">
<td>816</td><td>Val</td>
<td>Jacklyn</td>
<tr align="right">
<td>817</td><td>Huey</td>
<td>Sherie</td>
<tr align="right">
<td>818</td><td>Joaquin</td>
<td>Zelda</td>
<tr align="right">
<td>819</td><td>Johnie</td>
<td>Marilee</td>
<tr align="right">
<td>820</td><td>Silas</td>
<td>Bonny</td>
<tr align="right">
<td>821</td><td>Susan</td>
<td>Fern</td>
<tr align="right">
<td>822</td><td>Von</td>
<td>Jacque</td>
<tr align="right">
<td>823</td><td>Benedict</td>
<td>Maryjane</td>
<tr align="right">
<td>824</td><td>Eloy</td>
<td>Portia</td>
<tr align="right">
<td>825</td><td>Fritz</td>
<td>Juliann</td>
<tr align="right">
<td>826</td><td>Harris</td>
<td>Cassie</td>
<tr align="right">
<td>827</td><td>Monroe</td>
<td>Cathi</td>
<tr align="right">
<td>828</td><td>Nickolas</td>
<td>Jeana</td>
<tr align="right">
<td>829</td><td>Rolland</td>
<td>Martina</td>
<tr align="right">
<td>830</td><td>Alden</td>
<td>Treva</td>
<tr align="right">
<td>831</td><td>Berry</td>
<td>Carey</td>
<tr align="right">
<td>832</td><td>Freeman</td>
<td>Madelyn</td>
<tr align="right">
<td>833</td><td>Linda</td>
<td>Suzie</td>
<tr align="right">
<td>834</td><td>Pasquale</td>
<td>Trena</td>
<tr align="right">
<td>835</td><td>Roddy</td>
<td>Mark</td>
<tr align="right">
<td>836</td><td>Barrett</td>
<td>Ora</td>
<tr align="right">
<td>837</td><td>Dwaine</td>
<td>Sherrill</td>
<tr align="right">
<td>838</td><td>Hershel</td>
<td>Camilla</td>
<tr align="right">
<td>839</td><td>Maynard</td>
<td>Donita</td>
<tr align="right">
<td>840</td><td>Micky</td>
<td>Melisa</td>
<tr align="right">
<td>841</td><td>Brock</td>
<td>Sharla</td>
<tr align="right">
<td>842</td><td>Cruz</td>
<td>Alana</td>
<tr align="right">
<td>843</td><td>Domenic</td>
<td>Lilly</td>
<tr align="right">
<td>844</td><td>Efrem</td>
<td>Rosanna</td>
<tr align="right">
<td>845</td><td>Jere</td>
<td>Deedee</td>
<tr align="right">
<td>846</td><td>Chauncey</td>
<td>Louisa</td>
<tr align="right">
<td>847</td><td>Dee</td>
<td>Nanci</td>
<tr align="right">
<td>848</td><td>Forest</td>
<td>Nola</td>
<tr align="right">
<td>849</td><td>Leigh</td>
<td>Rosario</td>
<tr align="right">
<td>850</td><td>Lisa</td>
<td>Winifred</td>
<tr align="right">
<td>851</td><td>Rogers</td>
<td>Collette</td>
<tr align="right">
<td>852</td><td>Rolf</td>
<td>Earnestine</td>
<tr align="right">
<td>853</td><td>Carol</td>
<td>Juana</td>
<tr align="right">
<td>854</td><td>Rodrick</td>
<td>Mavis</td>
<tr align="right">
<td>855</td><td>Woody</td>
<td>Sabra</td>
<tr align="right">
<td>856</td><td>Carmelo</td>
<td>Alexis</td>
<tr align="right">
<td>857</td><td>Karen</td>
<td>Cornelia</td>
<tr align="right">
<td>858</td><td>Moises</td>
<td>Estelle</td>
<tr align="right">
<td>859</td><td>Quincy</td>
<td>Lindy</td>
<tr align="right">
<td>860</td><td>Wyatt</td>
<td>Meg</td>
<tr align="right">
<td>861</td><td>Arlen</td>
<td>Millie</td>
<tr align="right">
<td>862</td><td>Aron</td>
<td>Twyla</td>
<tr align="right">
<td>863</td><td>Buford</td>
<td>Carmella</td>
<tr align="right">
<td>864</td><td>Heriberto</td>
<td>Dedra</td>
<tr align="right">
<td>865</td><td>Kennth</td>
<td>Edie</td>
<tr align="right">
<td>866</td><td>Parrish</td>
<td>Ina</td>
<tr align="right">
<td>867</td><td>Wilmer</td>
<td>Randy</td>
<tr align="right">
<td>868</td><td>Drake</td>
<td>Ruthann</td>
<tr align="right">
<td>869</td><td>Dwane</td>
<td>Sadie</td>
<tr align="right">
<td>870</td><td>Esteban</td>
<td>Marva</td>
<tr align="right">
<td>871</td><td>Isiah</td>
<td>Athena</td>
<tr align="right">
<td>872</td><td>Leif</td>
<td>Aurora</td>
<tr align="right">
<td>873</td><td>Raymundo</td>
<td>Cathrine</td>
<tr align="right">
<td>874</td><td>Vic</td>
<td>Dara</td>
<tr align="right">
<td>875</td><td>Alfonzo</td>
<td>Hannah</td>
<tr align="right">
<td>876</td><td>Connie</td>
<td>Katheryn</td>
<tr align="right">
<td>877</td><td>Donna</td>
<td>Mollie</td>
<tr align="right">
<td>878</td><td>Lesley</td>
<td>Adriana</td>
<tr align="right">
<td>879</td><td>Napoleon</td>
<td>Kerrie</td>
<tr align="right">
<td>880</td><td>Patricia</td>
<td>Alyson</td>
<tr align="right">
<td>881</td><td>Clair</td>
<td>Angelica</td>
<tr align="right">
<td>882</td><td>Derrell</td>
<td>Iva</td>
<tr align="right">
<td>883</td><td>Dickie</td>
<td>Latanya</td>
<tr align="right">
<td>884</td><td>Rubin</td>
<td>Lizabeth</td>
<tr align="right">
<td>885</td><td>Stanton</td>
<td>Nan</td>
<tr align="right">
<td>886</td><td>Dalton</td>
<td>Bette</td>
<tr align="right">
<td>887</td><td>Dusty</td>
<td>Jewell</td>
<tr align="right">
<td>888</td><td>Federico</td>
<td>Juliette</td>
<tr align="right">
<td>889</td><td>Foster</td>
<td>Lu</td>
<tr align="right">
<td>890</td><td>Gail</td>
<td>Mandy</td>
<tr align="right">
<td>891</td><td>Norberto</td>
<td>Nettie</td>
<tr align="right">
<td>892</td><td>Artie</td>
<td>Aleta</td>
<tr align="right">
<td>893</td><td>Cyril</td>
<td>Angelique</td>
<tr align="right">
<td>894</td><td>Darryle</td>
<td>Bettie</td>
<tr align="right">
<td>895</td><td>Emerson</td>
<td>Doretha</td>
<tr align="right">
<td>896</td><td>Jared</td>
<td>Dorinda</td>
<tr align="right">
<td>897</td><td>Lavern</td>
<td>Marnita</td>
<tr align="right">
<td>898</td><td>Lennie</td>
<td>Tommie</td>
<tr align="right">
<td>899</td><td>Brenda</td>
<td>Deb</td>
<tr align="right">
<td>900</td><td>Coleman</td>
<td>Debbra</td>
<tr align="right">
<td>901</td><td>Darell</td>
<td>Ester</td>
<tr align="right">
<td>902</td><td>Duwayne</td>
<td>Evangeline</td>
<tr align="right">
<td>903</td><td>Hunter</td>
<td>Janeen</td>
<tr align="right">
<td>904</td><td>Issac</td>
<td>Jonna</td>
<tr align="right">
<td>905</td><td>Jame</td>
<td>Debrah</td>
<tr align="right">
<td>906</td><td>Darrick</td>
<td>Fonda</td>
<tr align="right">
<td>907</td><td>Earle</td>
<td>Leisha</td>
<tr align="right">
<td>908</td><td>Herschel</td>
<td>Lise</td>
<tr align="right">
<td>909</td><td>Marcelino</td>
<td>Serena</td>
<tr align="right">
<td>910</td><td>Raleigh</td>
<td>Janel</td>
<tr align="right">
<td>911</td><td>Robbin</td>
<td>Jimmie</td>
<tr align="right">
<td>912</td><td>Duke</td>
<td>Annetta</td>
<tr align="right">
<td>913</td><td>Emmitt</td>
<td>Harriett</td>
<tr align="right">
<td>914</td><td>Felton</td>
<td>Beverley</td>
<tr align="right">
<td>915</td><td>Alexis</td>
<td>Mabel</td>
<tr align="right">
<td>916</td><td>Booker</td>
<td>Merri</td>
<tr align="right">
<td>917</td><td>Emile</td>
<td>Angelita</td>
<tr align="right">
<td>918</td><td>Laverne</td>
<td>Willa</td>
<tr align="right">
<td>919</td><td>Michal</td>
<td>Earlene</td>
<tr align="right">
<td>920</td><td>Rand</td>
<td>Candi</td>
<tr align="right">
<td>921</td><td>Rayford</td>
<td>Cecile</td>
<tr align="right">
<td>922</td><td>Whitney</td>
<td>Shiela</td>
<tr align="right">
<td>923</td><td>Artis</td>
<td>Joellen</td>
<tr align="right">
<td>924</td><td>Augustus</td>
<td>Machelle</td>
<tr align="right">
<td>925</td><td>Bernardo</td>
<td>Miranda</td>
<tr align="right">
<td>926</td><td>Kalvin</td>
<td>Chrystal</td>
<tr align="right">
<td>927</td><td>Milford</td>
<td>Clarice</td>
<tr align="right">
<td>928</td><td>Regan</td>
<td>Milagros</td>
<tr align="right">
<td>929</td><td>Wilford</td>
<td>Romona</td>
<tr align="right">
<td>930</td><td>Darcy</td>
<td>Barbie</td>
<tr align="right">
<td>931</td><td>Mariano</td>
<td>Daria</td>
<tr align="right">
<td>932</td><td>Odis</td>
<td>Esperanza</td>
<tr align="right">
<td>933</td><td>Pernell</td>
<td>Maribel</td>
<tr align="right">
<td>934</td><td>Skip</td>
<td>Nona</td>
<tr align="right">
<td>935</td><td>Broderick</td>
<td>Rona</td>
<tr align="right">
<td>936</td><td>Dell</td>
<td>Fawn</td>
<tr align="right">
<td>937</td><td>Devon</td>
<td>Loria</td>
<tr align="right">
<td>938</td><td>Jamey</td>
<td>Margot</td>
<tr align="right">
<td>939</td><td>Lorenza</td>
<td>Marty</td>
<tr align="right">
<td>940</td><td>Major</td>
<td>Ronna</td>
<tr align="right">
<td>941</td><td>Orrin</td>
<td>Deeann</td>
<tr align="right">
<td>942</td><td>Quinn</td>
<td>Delois</td>
<tr align="right">
<td>943</td><td>Sandra</td>
<td>Dorthy</td>
<tr align="right">
<td>944</td><td>Wilburn</td>
<td>Joleen</td>
<tr align="right">
<td>945</td><td>Willam</td>
<td>Laurene</td>
<tr align="right">
<td>946</td><td>Williams</td>
<td>Sharyl</td>
<tr align="right">
<td>947</td><td>Alva</td>
<td>Jaime</td>
<tr align="right">
<td>948</td><td>Bentley</td>
<td>Kandi</td>
<tr align="right">
<td>949</td><td>Dorian</td>
<td>Lorinda</td>
<tr align="right">
<td>950</td><td>Elizabeth</td>
<td>Richard</td>
<tr align="right">
<td>951</td><td>Kerwin</td>
<td>Leta</td>
<tr align="right">
<td>952</td><td>Sharon</td>
<td>Lily</td>
<tr align="right">
<td>953</td><td>Windell</td>
<td>Neva</td>
<tr align="right">
<td>954</td><td>Andrea</td>
<td>Penni</td>
<tr align="right">
<td>955</td><td>Cletus</td>
<td>Sybil</td>
<tr align="right">
<td>956</td><td>Dennie</td>
<td>Barbra</td>
<tr align="right">
<td>957</td><td>Garret</td>
<td>Germaine</td>
<tr align="right">
<td>958</td><td>Genaro</td>
<td>May</td>
<tr align="right">
<td>959</td><td>Hilton</td>
<td>Sydney</td>
<tr align="right">
<td>960</td><td>Kory</td>
<td>Jeanna</td>
<tr align="right">
<td>961</td><td>Loran</td>
<td>Jerry</td>
<tr align="right">
<td>962</td><td>Sid</td>
<td>Rowena</td>
<tr align="right">
<td>963</td><td>Thor</td>
<td>Catharine</td>
<tr align="right">
<td>964</td><td>Abe</td>
<td>Consuelo</td>
<tr align="right">
<td>965</td><td>Agustin</td>
<td>Gwyn</td>
<tr align="right">
<td>966</td><td>Alphonse</td>
<td>Mable</td>
<tr align="right">
<td>967</td><td>Anibal</td>
<td>Shanna</td>
<tr align="right">
<td>968</td><td>Carnell</td>
<td>Loreen</td>
<tr align="right">
<td>969</td><td>Markus</td>
<td>Monika</td>
<tr align="right">
<td>970</td><td>Osvaldo</td>
<td>Trisha</td>
<tr align="right">
<td>971</td><td>Trevor</td>
<td>Bobby</td>
<tr align="right">
<td>972</td><td>Warner</td>
<td>Krystal</td>
<tr align="right">
<td>973</td><td>Boris</td>
<td>Melva</td>
<tr align="right">
<td>974</td><td>Boyce</td>
<td>Zoe</td>
<tr align="right">
<td>975</td><td>Brice</td>
<td>Anthony</td>
<tr align="right">
<td>976</td><td>Daron</td>
<td>Gilda</td>
<tr align="right">
<td>977</td><td>Darry</td>
<td>Renea</td>
<tr align="right">
<td>978</td><td>Haywood</td>
<td>Suzanna</td>
<tr align="right">
<td>979</td><td>Kevan</td>
<td>Vernita</td>
<tr align="right">
<td>980</td><td>Kieth</td>
<td>Alecia</td>
<tr align="right">
<td>981</td><td>Leander</td>
<td>Cary</td>
<tr align="right">
<td>982</td><td>Mac</td>
<td>Evette</td>
<tr align="right">
<td>983</td><td>Michale</td>
<td>Latonya</td>
<tr align="right">
<td>984</td><td>Montgomery</td>
<td>Lolita</td>
<tr align="right">
<td>985</td><td>Otha</td>
<td>Retha</td>
<tr align="right">
<td>986</td><td>Paris</td>
<td>Sandie</td>
<tr align="right">
<td>987</td><td>Waymon</td>
<td>Alyce</td>
<tr align="right">
<td>988</td><td>Adan</td>
<td>Brooke</td>
<tr align="right">
<td>989</td><td>Bertram</td>
<td>Earline</td>
<tr align="right">
<td>990</td><td>Cordell</td>
<td>Janene</td>
<tr align="right">
<td>991</td><td>Donell</td>
<td>Reva</td>
<tr align="right">
<td>992</td><td>Ezra</td>
<td>Adrianne</td>
<tr align="right">
<td>993</td><td>Jules</td>
<td>Charles</td>
<tr align="right">
<td>994</td><td>Keenan</td>
<td>Freida</td>
<tr align="right">
<td>995</td><td>Lucius</td>
<td>Phoebe</td>
<tr align="right">
<td>996</td><td>Olin</td>
<td>Troy</td>
<tr align="right">
<td>997</td><td>Reinaldo</td>
<td>Callie</td>
<tr align="right">
<td>998</td><td>Ricki</td>
<td>Elissa</td>
<tr align="right">
<td>999</td><td>Titus</td>
<td>Sherryl</td>
<tr align="right">
<td>1000</td><td>Andra</td>
<td>Shirlene</td>
<tr><td colspan="3"><small>Note: Rank 1 is the most popular,
rank 2 is the next most popular, and so forth.
</table></p>
</td></tr></table>
<table class="printhide" width="100%" border="0" cellpadding="1" cellspacing="0">
<tr bgcolor="#333366"><td height="1" valign="top" height="1" colspan="3"></td></tr>
<tr>
<td width="26%" valign="middle">&nbsp;<a href="http://www.firstgov.gov"><img
src="/templateimages/firstgov3.gif" width="72" height="15"
alt="Link to FirstGov.gov: U.S. Government portal" border="0"></a></td>
<td valign="top" class="seventypercent">
<a href="http://www.ssa.gov/privacy.html">Privacy Policy</a>&nbsp;
| <a href="http://www.ssa.gov/websitepolicies.htm">Website Policies
&amp; Other Important Information</a>&nbsp;
| <a href="http://www.ssa.gov/sitemap.htm">Site Map</a></td>
</tr>
</table>
</body></html>
Shayna : 555 421-3938
Mom : 555 321-3928
Dad : 555 321-3927
Suz : 555 213-2399
package edu.gatech.mediacomp;
import java.awt.*;
/**
* Class AbstractShape: abstract class for shapes that can be represented
* with 2 points
* Copyright Georgia Institute of Technology 2007
* @author Barb Ericson ericson@cc.gatech.edu
*/
public abstract class AbstractShape extends Object
{
//////////////////// Public Attributes ///////////////////////////
public static final String RECTANGLE = "RectangleShape"; // constant for rectangle
public static final String OVAL = "OvalShape"; // constant for oval
///////////////// Protected Attributes /////////////////////////
/** the color of this shape */
protected Color color = Color.black; // color to draw shape in
/** the first point in the shape */
protected Point p1 = new Point(); // first point
/** the second point in the shape */
protected Point p2 = new Point(); // second point
///////////////////// Constructors /////////////////////////////
/** Constructor that takes no arguments */
public AbstractShape()
{
}
/**
* Constructor that takes the first and second point
* @param firstPoint the first point that defines the shape
* @param secondPoint the second point that defines the shape
*/
public AbstractShape (Point firstPoint, Point secondPoint)
{
p1.x = firstPoint.x;
p1.y = firstPoint.y;
p2.x = secondPoint.x;
p2.y = secondPoint.y;
}
/**
* Constructor that takes x1,y1,x2,y2
* @param x1 x value of the first point that defines the shape
* @param y1 y value of the first point that defines the shape
* @param x2 x value of the second point that defines the shape
* @param y2 y value of the second point that defines the shape
*/
public AbstractShape (int x1, int y1, int x2, int y2)
{
p1.x = x1;
p1.y = y1;
p2.x = x2;
p2.y = y2;
}
////////////////////// Public Methods //////////////////////////////////
/**
* Method to get minimum x value of the bounding rectangle
* @return the minimum x value of the two points that define the shape
*/
public int getMinX()
{
return Math.min(p1.x, p2.x);
}
/**
* Method to get the minimum y value of the bounding rectangle
* @return the minimum y value of the two points that define the shape
*/
public int getMinY()
{
return Math.min(p1.y,p2.y);
}
/**
* Method to get the width of the bounding rectangle
* @return the width of the bounding rectangle
*/
public int getWidth()
{
return Math.max(p1.x,p2.x) - getMinX() + 1;
}
/**
* Method to get the height of the bounding rectangle
* @return the height of the bounding rectangle
*/
public int getHeight()
{
return Math.max(p1.y,p2.y) - getMinY() + 1;
}
/**
* Method to set the point values for point1 that defines the shape
* @param newX the new x value for point 1
* @param newY the new y value for point 1
*/
public void setPoint1Values(int newX, int newY)
{
p1.x = newX;
p1.y = newY;
}
/**
* Method to set the point values for point2 that defines the shape
* @param newX the new x value for point 2
* @param newY the new y value for point 2
*/
public void setPoint2Values(int newX, int newY)
{
p2.x = newX;
p2.y = newY;
}
/** Abstract method to draw the shape given the graphics context
* @param g the graphics context to draw the shape on
*/
public abstract void draw(Graphics g);
}
package edu.gatech.mediacomp;
import javax.swing.*;
import java.util.List;
import java.awt.*;
import java.awt.image.*;
import java.io.*;
import java.util.*;
/**
* Class to show a frame-based animation
* Copyright Georgia Institute of Technology 2007
* @author Barb Ericson ericson@cc.gatech.edu
*/
public class AnimationPanel extends JComponent
{
/////////////// fields /////////////////////
/** list of image objects */
private List<Image> imageList = new ArrayList<Image>();
/** List of the file names */
private List<String> nameList = new ArrayList<String>();
/** index of currently displayed image */
private int currIndex = 0;
/** number of frames per second */
private int framesPerSec = 16;
////////////// constructors /////////////////
/**
* Constructor that takes no parameters
*/
public AnimationPanel()
{
this.setSize(new Dimension(100,100));
}
/**
* Constructor that takes a list of pictures
* @param pictList the list of pictures
*/
public AnimationPanel(List<Picture> pictList)
{
Image image = null;
Picture picture = null;
for (int i = 0; i < pictList.size(); i++)
{
picture = pictList.get(i);
nameList.add(picture.getFileName());
image = picture.getImage();
imageList.add(image);
}
BufferedImage bi = (BufferedImage) image;
int width = bi.getWidth();
int height = bi.getHeight();
this.setSize(new Dimension(width,height));
this.setMinimumSize(new Dimension(width,height));
this.setPreferredSize(new Dimension(width,height));
}
/**
* Constructor that takes the directory to read the frames from
* @param directory the directory to read from
*/
public AnimationPanel(String directory)
{
// get the list of files in the directory
File dirObj = new File(directory);
String[] fileArray = dirObj.list();
ImageIcon imageIcon = null;
Image image = null;
// loop through the files
for (int i = 0; i < fileArray.length; i++)
{
if (fileArray[i].indexOf(".jpg") >= 0)
{
imageIcon = new ImageIcon(directory + fileArray[i]);
nameList.add(directory + fileArray[i]);
imageList.add(imageIcon.getImage());
}
}
// set size of this panel
if (imageIcon != null)
{
image = (Image) imageList.get(0);
int width = image.getWidth(null);
int height = image.getHeight(null);
this.setSize(new Dimension(width,
height));
this.setMinimumSize(new Dimension(width,
height));
this.setPreferredSize(new Dimension(width,
height));
}
}
/**
* Constructor that takes the directory to
* read from and the number of frames per
* second
* @param directory the frame direcotry
* @param theFramesPerSec the number of frames
* per second
*/
public AnimationPanel(String directory,
int theFramesPerSec)
{
this(directory);
this.framesPerSec = theFramesPerSec;
}
////////////// methods /////////////////////////
/**
* Method to get the current index
* @return the current index
*/
public int getCurrIndex() { return currIndex;}
/**
* Method to set the frames per second to show the movie
* @param numFramesPerSec the number of frames to show per second
*/
public void setFramesPerSec(int numFramesPerSec)
{
this.framesPerSec = numFramesPerSec;
}
/**
* Method to get the frames per second
* @return the number of frames per second
*/
public int getFramesPerSec()
{ return this.framesPerSec;}
/**
* Method to add a picture
* @param picture the picture to add
*/
public void add(Picture picture)
{
Image image = picture.getImage();
imageList.add(image);
nameList.add(picture.getFileName());
}
/**
* Method to show just the next frame
*/
public void showNext()
{
this.currIndex++;
if (this.currIndex == imageList.size())
this.currIndex = 0;
draw(this.getGraphics());
}
/**
* Method to show the previous frame
*/
public void showPrev()
{
this.currIndex--;
if (this.currIndex < 0)
this.currIndex = imageList.size() - 1;
draw(this.getGraphics());
}
/**
* show all frames starting at 0
*/
public void showAll()
{
Graphics g = null;
long startTime = 0;
long endTime = 0;
int timeToSleep = 1000 / framesPerSec;
for (int i = 0; i < imageList.size(); i++)
{
startTime = System.currentTimeMillis();
this.currIndex = i;
g = this.getGraphics();
draw(g);
g.dispose();
endTime = System.currentTimeMillis();
// sleep
try {
if (endTime - startTime < timeToSleep)
Thread.sleep(timeToSleep-(endTime-startTime));
} catch (InterruptedException ex) {
}
// reset curr index
currIndex = imageList.size() - 1;
}
}
/**
* show animation from current index
*/
public void showAllFromCurrent()
{
Graphics g = null;
int timeToSleep = (int) (1000 / framesPerSec);
for (; currIndex < imageList.size(); currIndex++)
{
// draw current image
g = this.getGraphics();
draw(g);
g.dispose();
// sleep
try {
Thread.sleep(timeToSleep);
} catch (InterruptedException ex) {
}
}
// reset curr index
currIndex = imageList.size() - 1;
}
/**
* Method to remove all before current from
* list
*/
public void removeAllBefore()
{
File f = null;
boolean result = false;
for (int i = 0; i <= currIndex; i++)
{
f = new File(nameList.get(i));
result = f.delete();
if (result != true)
System.out.println("trouble deleting " +
nameList.get(i));
imageList.remove(0);
}
}
/**
* Method to remove all after the current index
*/
public void removeAllAfter()
{
int i = currIndex + 1;
int index = i;
File f = null;
boolean result = false;
while (i < imageList.size())
{
f = new File(nameList.get(index++));
result = f.delete();
if (result != true)
System.out.println("trouble deleting " +
nameList.get(index-1));
imageList.remove(i);
}
}
/**
* Method to paint the frames
* @param g the graphics context to draw to
*/
public void draw(Graphics g)
{
Image image = (Image) imageList.get(this.currIndex);
g.drawImage(image,0,0,this);
}
/**
* Method to paint the component
*/
public void paintComponent(Graphics g)
{
if (imageList.size() == 0)
g.drawString("No images yet!",20,20);
else
draw(g);
}
/**
* Method to test
*/
public static void main(String[] args)
{
JFrame frame = new JFrame();
AnimationPanel panel = new AnimationPanel("c:/intro-prog-java/mediasources/fish/");
frame.getContentPane().add(panel);
frame.pack();
frame.setVisible(true);
panel.showAll();
}
}
package edu.gatech.mediacomp;
/**
* Class ArraySorter has an array and can do
* different sorts on it
* @author Barb Ericson
*/
public class ArraySorter
{
/// fields ////////////
/** the array to sort */
private int[] a;
/**
* Constructor that takes the array to sort
* @param theArray the array to sort
*/
public ArraySorter(int[] theArray)
{
a = theArray;
}
/**
* Get the last valid index in a
*/
private int getLastIndex()
{
return (a.length - 1);
}
/**
* Method to swap the values at two indices
* in the array
* @param i an index in the array
* @param j another index in the array
* i may be equal to j
*/
private void swap(int i, int j)
{
if (i != j)
{
int temp = a[i];
a[i] = a[j];
a[j] = temp;
}
}
/**
* Method to do a selection sort on the array
*/
public void selectionSort()
{
int maxCompare = a.length - 1;
int smallestIndex = 0;
int numSteps = 0;
// loop from 0 to one before last item
for (int i = 0; i < maxCompare; i++)
{
// set smallest index to the one at i
smallestIndex = i;
numSteps = 0;
// loop from i+1 to end of the array
for (int j = i + 1; j < a.length; j++)
{
numSteps++;
if (a[j] < a[smallestIndex])
{
smallestIndex = j;
}
}
System.out.println("#steps:"+numSteps);
// swap the one at i with the one at smallest index
swap(i,smallestIndex);
this.printArray("after loop body when i = " + i);
}
}
/**
* Method to print out the array elements
* @param message the message to print first
*/
private void printArray(String message)
{
System.out.println(message);
for (int i : a)
System.out.print(i + " ");
System.out.println();
}
/**
* Method to test selection sort
*/
public static void testSelectionSort()
{
int[] testArray = {23, 14, 1, 89, 68, 32, 6};
ArraySorter sorter = new ArraySorter(testArray);
sorter.printArray("Before selection sort");
sorter.selectionSort();
sorter.printArray("After selection sort");
}
/**
* Method to do an insertion sort on the array
*/
public void insertionSort()
{
int temp = 0;
int pos = 0;
// loop from second element on
for (int i = 1; i < a.length; i++)
{
// save current value at i and set position to i
temp = a[i];
pos = i;
// shift right any larger elements
while (0 < pos && temp < a[pos - 1])
{
a[pos] = a[pos - 1];
pos--;
}
a[pos] = temp;
this.printArray("after loop body when i = " + i);
}
}
/**
* Method to test insertion sort
*/
public static void testInsertionSort()
{
int[] testArray = {23, 14, 1, 89, 68, 32, 6};
ArraySorter sorter = new ArraySorter(testArray);
sorter.printArray("Before insertion sort");
sorter.insertionSort();
sorter.printArray("After insertion sort");
}
/**
* Method to do a merge sort of the array
*/
public void mergeSort()
{
// check if there is only 1 element return
if (a.length == 1) return;
// otherwise create two new arrays
int[] left = new int[a.length / 2];
for (int i = 0; i < left.length; i++)
left[i] = a[i];
int[] right = new int[a.length - left.length];
for (int i = left.length, j=0;
i < a.length; i++, j++)
right[j] = a[i];
// create new ArraySorter objects
ArraySorter sorter1 = new ArraySorter(left);
sorter1.printArray("sorter1");
ArraySorter sorter2 = new ArraySorter(right);
sorter2.printArray("sorter2");
// do the recursive call with the new sorters
sorter1.mergeSort();
sorter2.mergeSort();
// merge the resulting arrays
merge(left,right);
this.printArray("After merge");
}
/**
* Method to merge two sorted arrays
* back into this object's array
* @param left sorted left array
* @param right the sorted right array
*/
private void merge(int[] left, int[] right)
{
int leftIndex = 0; // current left index
int rightIndex = 0; // current right index
int i = 0; // current index in a
// merge the left and right arrays into a
while (leftIndex < left.length &&
rightIndex < right.length)
{
if (left[leftIndex] < right[rightIndex])
{
a[i] = left[leftIndex];
leftIndex++;
}
else
{
a[i] = right[rightIndex];
rightIndex++;
}
i++;
}
// copy any remaining in left
for (int j = leftIndex; j < left.length; j++)
{
a[i] = left[j];
i++;
}
// copy any remaining in right
for (int j = rightIndex; j < right.length; j++)
{
a[i] = right[j];
i++;
}
}
public static void testMergeSort()
{
int[] testArray = {23, 14, 1, 89, 68, 32, 6};
ArraySorter sorter = new ArraySorter(testArray);
sorter.printArray("Before merge sort");
sorter.mergeSort();
sorter.printArray("After merge sort");
}
/**
* Do the quicsort on the array from the passed
* from to the passed to indicies
* @param from the index to start from
* @param to the index to stop at
*/
public void quicksort(int from, int to)
{
System.out.println(" from " + from + " to: " + to);
// if there are no elements to sort stop
if (from >= to) return;
// get the index of the pivot
int pivotIndex = partition(from, to);
// do the recursive call on the sub arrays
quicksort(from,pivotIndex-1);
quicksort(pivotIndex+1, to);
}
/**
* Method to partition the array around a pivot
* point.
* @param left the left index
* @param right the right index
* @return the index of the pivot point
* all element in the array with an index
* less than the returned index are less
* than the value at the pivot index and
* all values in the array with an index
* the pivot value are to the right of the
* pivot index
*/
public int partition(int left, int right)
{
System.out.println("left: " + left + " right: " +
right);
// start with pivot at from index
int pivotIndex = left;
int pivotValue = a[pivotIndex];
// put the pivot at the end on right
swap(pivotIndex,right);
int storedIndex = left;
for (int i = left; i <= right - 1; i++)
{
if (a[i] <= pivotValue)
{
swap(storedIndex,i);
storedIndex++;
}
}
swap(right,storedIndex);
return storedIndex;
}
public static void testQuicksort()
{
int[] testArray = {23, 14, 1, 89, 68, 32, 6};
ArraySorter sorter = new ArraySorter(testArray);
sorter.printArray("Before quicksort");
sorter.quicksort(0,sorter.getLastIndex());
sorter.printArray("After quicksort");
}
public static void main(String[] args)
{
testSelectionSort();
testInsertionSort();
testMergeSort();
testQuicksort();
}
}
package edu.gatech.mediacomp;
import javax.swing.*;
import java.awt.event.*;
import javax.swing.event.*;
/**
* Class that holds the buttons for the movie player
* @author Barb Ericson
*/
public class ButtonPanel extends JPanel
{
//////////////// fields ////////////////////////
/** list for the frame rate */
private JList frameRateList = null;
/** label for frame rate */
private JLabel frameRateLabel = null;
private JButton nextButton = new JButton("Next");
private JButton playButton = new JButton("Play Movie");
private JButton prevButton = new JButton("Prev");
private JButton delBeforeButton =
new JButton("Delete All Previous");
private JButton delAfterButton =
new JButton("Delete All After");
private JButton writeQuicktimeButton =
new JButton("Write Quicktime");
private JButton writeAVIButton = new JButton("Write AVI");
private MoviePlayer moviePlayer = null;
///////////////// Constructors /////////////////
/**
* Constructor that doesn't take any parameters
*/
public ButtonPanel(MoviePlayer player)
{
this.moviePlayer = player;
// add the previous and next buttons to this panel
this.add(prevButton);
this.add(nextButton);
// set up the frame rate list
frameRateLabel = new JLabel("Frames per Second: ");
this.add(frameRateLabel);
String[] rates = {"16","24","30"};
frameRateList = new JList(rates);
JScrollPane scrollPane = new JScrollPane(frameRateList);
frameRateList.setSelectedIndex(0);
frameRateList.setVisibleRowCount(1);
frameRateList.setToolTipText("The number of frames per second in the movie");
frameRateList.addListSelectionListener(new ListSelectionListener() {
public void valueChanged(ListSelectionEvent e) {
String rateS = (String) frameRateList.getSelectedValue();
int rate = Integer.parseInt(rateS);
moviePlayer.setFrameRate(rate);
}
});
this.add(scrollPane);
this.add(playButton);
this.add(delBeforeButton);
this.add(delAfterButton);
this.add(writeQuicktimeButton);
this.add(writeAVIButton);
// add the action listeners to the buttons
nextButton.setToolTipText("Click to see the next frame");
nextButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
moviePlayer.showNext();
}});
prevButton.setToolTipText("Click to see the previous frame");
prevButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
moviePlayer.showPrevious();
}});
playButton.setToolTipText("Click to play the movie");
playButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
moviePlayer.playMovie();
}});
delBeforeButton.setToolTipText("Click to delete all frames before the current one");
delBeforeButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
moviePlayer.delAllBefore();
}});
delAfterButton.setToolTipText("Click to delete all frames after the current one");
delAfterButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
moviePlayer.delAllAfter();
}});
writeQuicktimeButton.setToolTipText("Click to write out a Quicktime movie from the frames");
writeQuicktimeButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
moviePlayer.writeQuicktime();
}});
writeAVIButton.setToolTipText("Click to write out an AVI movie from the frames");
writeAVIButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
moviePlayer.writeAVI();
}});
}
}
package edu.gatech.mediacomp;
import java.awt.*;
import java.awt.event.*;
import java.util.*;
import javax.swing.*;
import javax.swing.event.*;
import java.awt.image.BufferedImage;
import java.net.*;
/**
* Class ButtonPanel: holds buttons for video capture
* Copyright Georgia Institute of Technology 2005
* @author Barb Ericson ericson@cc.gatech.edu
*/
public class CaptureButtonPanel extends JPanel
{
///////////////////// Public Attributes ////////////////////////
////////////////////// Private Attributes //////////////////////
/** help button */
private JButton helpButton;
/** button to capture the screen */
private JButton captureScreenButton; // screen capture button
/** button to start picking a region to capture */
private JButton pickRegionButton; // pick the region button
/** button to start the capture */
private JButton startButton; // start capture button
/** button to play the captured movie */
private JButton playButton; // play movie button
/** button to stop the video capture */
private JButton stopButton; // stop capture button
/** button to take a picture */
//private JButton pictureButton; // use to take a picture
/** model class that handles the video capture */
private VideoCapturer videoHandler = null; // the video capturer handler
/** model class that handles the screen display and region pick */
private RegionInterface regionHandler = null; // area to select region
/** thread for video capture */
private Thread t = null;
/** text field for the directory to write to */
private JTextField dirTextField = null;
/** list for the frame rate */
private JList frameRateList = null;
/** label for frame rate */
private JLabel frameRateLabel = null;
/** label for directory */
private JLabel directoryLabel = null;
//////////////////////// Constructors ////////////////////////////
/** A constructor that takes no arguments */
public CaptureButtonPanel ()
{
// initialize the panel
init();
}
/** A constructor that takes the object that handles the video
* capture and the object that handles the region selection
* @param theHandler the handler of the video capture
* @param regionIntHandler the handler of the region selection
*/
public CaptureButtonPanel (VideoCapturer theHandler,
RegionInterface regionIntHandler)
{
// set the handler
videoHandler = theHandler;
regionHandler = regionIntHandler;
// initialize the panel
init();
}
/////////////////// Private Methods ///////////////////////////////
/** Method to initialize the panel */
private void init()
{
this.setLayout(new BorderLayout());
JPanel buttonPanel = new JPanel();
JPanel infoPanel = new JPanel();
// set up info panel
directoryLabel = new JLabel("Directory: ");
FrameSequencer frameSequencer = videoHandler.getFrameSequencer();
String dir = frameSequencer.getDirectory();
dirTextField = new JTextField(dir,Math.max(20,dir.length()));
dirTextField.setToolTipText("Directory to write the movie frames to");
dirTextField.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
FrameSequencer frameSequencer = videoHandler.getFrameSequencer();
String dir = dirTextField.getText();
frameSequencer.setDirectory(dir);
}
});
infoPanel.add(directoryLabel);
infoPanel.add(dirTextField);
frameRateLabel = new JLabel("Frames per Second: ");
infoPanel.add(frameRateLabel);
String[] rates = {"16","24","30"};
frameRateList = new JList(rates);
JScrollPane scrollPane = new JScrollPane(frameRateList);
frameRateList.setSelectedIndex(0);
frameRateList.setVisibleRowCount(1);
frameRateList.setToolTipText("The number of frames per second in the movie");
frameRateList.addListSelectionListener(new ListSelectionListener() {
public void valueChanged(ListSelectionEvent e) {
String rate = (String) frameRateList.getSelectedValue();
videoHandler.setFramesPerSecond(Integer.parseInt(rate));
}
});
infoPanel.add(scrollPane);
// add help button
helpButton = new JButton("Help");
helpButton.setToolTipText("Click here to see help");
helpButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
showHelp();
}
});
infoPanel.add(helpButton);
//infoPanel.add(frameRateTextField);
// set up button panel
// create the capture screen button
captureScreenButton = new JButton("Capture Screen");
captureScreenButton.setToolTipText("Click here to capture the"+
" screen image and show it below");
buttonPanel.add(captureScreenButton);
captureScreenButton.addActionListener(new ActionListener() {
public void actionPerformed (ActionEvent e) {
if (videoHandler != null && regionHandler != null)
try {
regionHandler.setBackgroundImage(videoHandler.captureScreen());
pickRegionButton.setEnabled(true);
repaint();
} catch (Exception ex) {
}
}
});
// create the pick region button
pickRegionButton = new JButton("Pick Region");
pickRegionButton.setToolTipText("Click here to pick a region to capture."+
" Then click on the top left corner and "+
"drag the cursor to the bottom right of the region");
pickRegionButton.setEnabled(false);
buttonPanel.add(pickRegionButton);
pickRegionButton.addActionListener(new ActionListener() {
public void actionPerformed (ActionEvent e) {
if (regionHandler != null)
{
regionHandler.clearShapes();
startButton.setEnabled(true);
//pictureButton.setEnabled(true);
}
}
});
// JLabel label = new JLabel("Number of Seconds to Capture: ");
// secField = new JTextField("3",3);
// add(label);
// add(secField);
// create the start capture button
startButton = new JButton("Start Capture");
startButton.setToolTipText("Click here to start the video capture");
startButton.setEnabled(false);
buttonPanel.add(startButton);
startButton.addActionListener(new ActionListener() {
public void actionPerformed (ActionEvent e) {
if (videoHandler != null)
{
java.awt.Rectangle region = videoHandler.getRegion();
FrameSequencer frameSequencer = videoHandler.getFrameSequencer();
int framesPerSec = videoHandler.getFramesPerSecond();
t = new Thread(new StartMovieCapture(frameSequencer,
framesPerSec,
region));
startButton.setEnabled(false);
stopButton.setEnabled(true);
t.start();
}
}
});
// create the stop capture button
stopButton = new JButton("Stop Capture");
stopButton.setToolTipText("Click here to stop the video capture");
stopButton.setEnabled(false);
buttonPanel.add(stopButton);
stopButton.addActionListener(new ActionListener() {
public void actionPerformed (ActionEvent e) {
if (videoHandler != null && t != null)
{
t.stop();
t = null;
startButton.setEnabled(true);
stopButton.setEnabled(false);
playButton.setEnabled(true);
}
}
});
// create the take picture button
// pictureButton = new JButton("Take Picture");
// pictureButton.setToolTipText("Click here to take a picture");
// pictureButton.setEnabled(false);
// buttonPanel.add(pictureButton);
// pictureButton.addActionListener(new ActionListener() {
// public void actionPerformed (ActionEvent e) {
// BufferedImage image = null;
// if (videoHandler != null)
// {
// java.awt.Rectangle region = videoHandler.getRegion();
// if (region != null)
// {
// FrameSequencer frameSequencer = videoHandler.getFrameSequencer();
// try {
// image = new Robot().createScreenCapture(region);
// } catch (Exception ex) {
// ex.printStackTrace();
// System.out.println("caught exception while taking a picture");
// }
// Picture p = new Picture(image);
// frameSequencer.addFrame(p);
// }
// }
// }
// });
// create the play movie button
playButton = new JButton("Play Movie");
playButton.setToolTipText("Click here to play the captured video");
playButton.setEnabled(false);
buttonPanel.add(playButton);
playButton.addActionListener(new ActionListener() {
public void actionPerformed (ActionEvent e) {
if (videoHandler != null)
videoHandler.playMovie();
}
});
this.add(infoPanel,BorderLayout.NORTH);
this.add(buttonPanel,BorderLayout.SOUTH);
}
/**
* Method to show help
*/
public void showHelp()
{
String name = null;
try {
// get the URL for where we loaded this class
Class currClass = Class.forName("CaptureButtonPanel");
URL classURL = currClass.getResource("CaptureButtonPanel.class");
JFrame helpFrame = new JFrame("Help");
helpFrame.setAlwaysOnTop(true);
// name = classURL.getPath();
// int pos = name.lastIndexOf("/");
// name = "file:///" +
// name.substring(1,pos) +
// "/help/CaptureAliceMovie.html";
URL url = new URL(classURL,"help/CaptureAliceMovie.html");
JEditorPane pane =
new JEditorPane(url);
JScrollPane scrollPane = new JScrollPane(pane);
helpFrame.setSize(new Dimension(900,800));
helpFrame.getContentPane().add(scrollPane);
helpFrame.setVisible(true);
} catch (Exception ex) {
System.out.println("I am sorry " +
"but there was a problem with the help url: "+
name);
}
}
///////////////////// Main Method for Testing /////////////////////////
public static void main (String argv[])
{
// create a frame
JFrame frame = new JFrame();
// create a ButtonPanel
CaptureButtonPanel buttonPanel = new CaptureButtonPanel();
// add the buttonPanel to the frame
frame.getContentPane().add(buttonPanel);
frame.pack(); // shrink to fit preferred size
frame.setVisible(true); // show the frame
}
}
package edu.gatech.mediacomp;
import java.awt.*;
import java.awt.font.*;
import java.awt.geom.*;
/**
* Class to create a cartoon out of a picture
* @author Barb Ericson
*/
public class Cartoon
{
//////////// fields ///////////////////
private Picture picture;
/////////// constructor ///////////////
/**
* Constructor that takes the picture
* @param p the picture to use
*/
public Cartoon(Picture p) { this.picture = p; }
/////////// methods //////////////////
/**
* Method to add a word balloon that contians the message
* @param message the text to show
* @param xPos the top left for the word balloon
* @param yPos the top left for the word balloon
*/
public void addWordBalloon(String message,int xPos, int yPos)
{
// get the Graphics2D
Graphics g = this.picture.getGraphics();
Graphics2D g2 = (Graphics2D) g;
// get the font information for the message
Font font = new Font("Arial",Font.BOLD,24);
FontRenderContext frc = g2.getFontRenderContext();
Rectangle2D bounds = font.getStringBounds(message,frc);
LineMetrics metrics = font.getLineMetrics(message,frc);
float lineHeight = metrics.getHeight();
float ascent = metrics.getAscent();
// draw the ellipse for the word ballon
double ellipseWidth = bounds.getWidth() * 1.5;
double ellipseHeight = bounds.getHeight() * 2.0;
g2.setColor(Color.WHITE);
g2.fill(new Ellipse2D.Double(xPos,yPos,
ellipseWidth,
ellipseHeight));
// draw the message centered in the ellipse
float x0 = (float) ((ellipseWidth - bounds.getWidth()) / 2 +
xPos);
float y0 = (float) ((ellipseHeight - lineHeight) / 2 +
yPos + ascent);
g2.setColor(Color.BLACK);
g2.setFont(font);
g2.drawString(message,x0,y0);
}
public static void main(String[] args)
{
Picture picture =
new Picture(FileChooser.getMediaPath("horse.jpg"));
Cartoon cartoon = new Cartoon(picture);
cartoon.addWordBalloon("Just Horsing Around!",42,20);
picture.explore();
}
}
package edu.gatech.mediacomp;
import javax.swing.JColorChooser;
import javax.swing.JFrame;
import java.awt.Color;
/**
* A class to make working with a color chooser easier
* for students. It uses a JColorChooser to let the user
* pick a color and returns the choosen color object.
*
* Copyright Georgia Institute of Technology 2004
* @author Barb Ericson ericson@cc.gatech.edu
*/
public class ColorChooser
{
/**
* Method to let the user pick a color and return
* the color object.
* @return the picked color or red if no color was picked
*/
public static Color pickAColor()
{
Color color = Color.white;
// create a JFrame to be the parent of the color chooser open dialog
// if you don't do this then you may not see the dialog.
JFrame frame = new JFrame();
frame.setAlwaysOnTop(true);
// use the color chooser to pick the color
color = JColorChooser.showDialog(frame,"Pick a color",color);
return color;
}
}
package edu.gatech.mediacomp;
import javax.swing.*;
import java.awt.Color;
/**
* Class that demonstrates creating buttons with different
* colors in a panel
*
* @author Barb Ericson
*/
public class ColorSquares extends JPanel
{
Color[] colorArray = {Color.red, Color.green, Color.blue,
Color.black, Color.white, Color.yellow, Color.gray,
Color.orange, Color.pink, Color.cyan, Color.magenta};
/**
* Constructor that takes no arguments
*/
public ColorSquares()
{
init();
}
/**
* Method to initialize the panel
*/
public void init()
{
JButton button = null;
Color color = null;
// loop through the colors in the color array
for (int i=0; i < colorArray.length; i++)
{
color = colorArray[i];
button = new JButton(color.getRed() + ", " +
color.getGreen() + ", " +
color.getBlue());
if (color.equals(Color.black))
button.setForeground(Color.white);
button.setBackground(color);
this.add(button);
}
}
public static void main(String[] args)
{
JFrame frame = new JFrame("Colors");
frame.getContentPane().add(new ColorSquares());
frame.pack();
frame.setVisible(true);
}
}
package edu.gatech.mediacomp;
import java.util.List;
import java.util.ArrayList;
import java.util.Iterator;
import java.awt.*;
import javax.swing.*;
import javax.swing.border.*;
/**
* Class to create a comic panel. A comic panel
* will have a picture and can have one or more
* text balloons. It uses a JLabel to show the
* picture.
*
* @author Barb Ericson ericson@cc.gatech.edu
* Copyright 2005
*/
public class ComicPanel extends JPanel
{
////////////// fields //////////////////
/** the picture for the comic panel */
private Picture picture = null;
/** the list of text balloons */
private List<TextBalloon> textBalloonList =
new ArrayList<TextBalloon>();
// comment above and uncomment below for 1.4
//private List textBalloonList =
// new ArrayList();
/** the label used to display the picture */
private JLabel pictureLabel = new JLabel();
/** flag if line border for this panel */
private boolean lineBorder = true;
//////////////// constructors ////////////
/**
* Constructor that takes just the picture
* to use
* @param thePicture the picture to use
*/
public ComicPanel(Picture thePicture)
{
this.picture = thePicture;
init();
}
////////// methods //////////////////////////
/**
* Method to initialize this panel
*/
private void init()
{
if (lineBorder) {
Border border =
BorderFactory.createLineBorder(Color.BLACK);
this.setBorder(border);
}
updateLabel();
this.add(pictureLabel);
}
/**
* Method to update the label icon
*/
private void updateLabel()
{
Picture finalPicture = getFinalPicture();
Icon icon = new ImageIcon(finalPicture.getImage());
pictureLabel.setIcon(icon);
repaint();
}
/**
* Method to add a text balloon to the panel
*/
public void add(TextBalloon textBalloon)
{
textBalloonList.add(textBalloon);
updateLabel();
}
/**
* Method to remove a text balloon from the panel
* @param textBalloon the text balloon to remove
*/
public void remove(TextBalloon textBalloon)
{
textBalloonList.remove(textBalloon);
updateLabel();
}
public Picture getFinalPicture()
{
Picture finalPicture = new Picture(picture);
Graphics g = finalPicture.getGraphics();
// loop through text balloons
for (TextBalloon balloon: textBalloonList)
{
balloon.draw(g);
}
// comment out above and uncomment below for 1.4
// Iterator listIterator = textBalloonList.iterator();
// TextBalloon balloon = null;
// while (listIterator.hasNext())
// {
// balloon = (TextBalloon) listIterator.next();
// balloon.draw(g);
// }
return finalPicture;
}
/**
* Method to write out the comic panel
* @param fileName the full path name of the file
* to write. Be sure to include .jpg or .bmp
*/
public void write(String fileName)
{
Picture finalPicture = getFinalPicture();
finalPicture.write(fileName);
}
public static void main(String[] args)
{
Picture p = new Picture(FileChooser.getMediaPath("MattJennyCorn.jpg"));
ComicPanel panel = new ComicPanel(p);
SpeechBalloon sBalloon =
new SpeechBalloon(new Point(209,18),
100, new Point(218,149),
"It sure is corny in here!");
ThoughtBalloon tBalloon =
new ThoughtBalloon(new Point(14,60),100,new Point(167,226),
"Oh, that was corny!");
panel.add(sBalloon);
panel.add(tBalloon);
Picture finalPic = panel.getFinalPicture();
finalPic.explore();
}
}
package edu.gatech.mediacomp;
import java.awt.*;
import javax.swing.*;
/**
* Class to display a comic strip. A comic strip has
* 4 comic panels. Each comic panel has a picture and
* one or more text balloons. A comic strip has a name
* and an author.
* @author Barb Ericson ericson@cc.gatech.edu
*/
public class ComicStrip extends JPanel
{
////////////////// fields ///////////////////////
private String author;
private String name;
private ComicPanel[] panelArray = null;
private int width;
/////////////// constructors //////////////////////
/**
* Constructor that takes the name, author, and
* an array of panels
* @param theName the name of the strip
* @param theAuthor the author's name
* @param thePanelArray an array of panels
*/
public ComicStrip(String theName, String theAuthor,
ComicPanel[] thePanelArray)
{
this.name = theName;
this.author = theAuthor;
this.panelArray = thePanelArray;
init();
}
//////////////////// methods ////////////////////////
/**
* Set up the graphics to display the comic
* strip
*/
private void init()
{
this.setLayout(new BorderLayout());
JPanel topPanel = new JPanel();
topPanel.setLayout(new BorderLayout());
JLabel nameLabel = new JLabel(name);
topPanel.add(nameLabel,BorderLayout.WEST);
JLabel authorLabel = new JLabel(author);
topPanel.add(authorLabel,BorderLayout.EAST);
this.add(topPanel,BorderLayout.NORTH);
JPanel stripPanel = new JPanel();
stripPanel.setLayout(new BoxLayout(stripPanel,BoxLayout.X_AXIS));
ComicPanel comicPanel = null;
JLabel panelLabel = null;
Picture finalPicture = null;
for (int i = 0; i < panelArray.length; i++)
{
stripPanel.add(panelArray[i]);
if (i < panelArray.length - 1) {
stripPanel.add(Box.createRigidArea(new Dimension(3,0)));
}
}
this.add(stripPanel,BorderLayout.CENTER);
}
public static void main(String[] args)
{
JFrame frame = new JFrame("Comic Strip");
ComicPanel[] panelArray = new ComicPanel[4];
Picture p1 = new Picture("C:\\intro-prog-java\\Alice\\ComicStrip\\panel1.jpg");
//p1.grayscaleWithLuminance();
Picture p2 = new Picture("C:\\intro-prog-java\\Alice\\ComicStrip\\panel2.jpg");
//p2.grayscaleWithLuminance();
Picture p3 = new Picture("C:\\intro-prog-java\\Alice\\ComicStrip\\panel3.jpg");
//p3.grayscaleWithLuminance();
Picture p4 = new Picture("C:\\intro-prog-java\\Alice\\ComicStrip\\panel4.jpg");
//p4.grayscaleWithLuminance();
panelArray[0] = new ComicPanel(p1);
panelArray[1] = new ComicPanel(p2);
panelArray[2] = new ComicPanel(p3);
panelArray[3] = new ComicPanel(p4);
SpeechBalloon b0 = new SpeechBalloon(new Point(20,10),
100,new Point(97,54),
"Hey Baby!");
panelArray[0].add(b0);
SpeechBalloon b1 = new SpeechBalloon(new Point(102,7),
100,new Point(164,48),
"Yikes!");
panelArray[1].add(b1);
SpeechBalloon b3 = new SpeechBalloon(new Point(23,3),
150,new Point(108,75),
"I was just too hot for her!");
panelArray[3].add(b3);
ComicStrip strip = new ComicStrip("Snowman Love",
"Barb Ericson",
panelArray);
frame.getContentPane().add(strip);
frame.pack();
frame.setVisible(true);
}
}
package edu.gatech.mediacomp;
import java.sql.*;
import java.util.*;
/**
* Class that handles the connection with the database
*/
public class DatabaseManager
{
////////////// fields ////////////////////////////
private String driverName;
private String urlStr;
//////////// constructors /////////////////////
/**
* Constructor that takes the driver name and url
* @param driver the class that communicates with the
* database
* @param url the url of the database as a string
*/
public DatabaseManager(String driver, String url)
{
this.driverName = driver;
this.urlStr = url;
// try the following
try {
// load the driver class
Class.forName(driver);
} catch (ClassNotFoundException ex) {
SimpleOutput.showError("Can't find the driver class " +
driver + ", check the classpath");
}
}
/////////////// methods //////////////////////////
/**
* Method for testing the connection
*/
public void testConnection()
{
// try the following
try {
// open the connection to the database
Connection connection =
DriverManager.getConnection(this.urlStr);
// tell the user the connection was opened
System.out.println("Connection established");
// close the connection
connection.close();
// tell the user the connection was closed
System.out.println("The connection was closed");
} catch (SQLException ex) {
SimpleOutput.showError("Trouble with the " +
"database connection");
ex.printStackTrace();
}
}
/**
* Method to test a query and print the results
* @param query the query to execute
* @param numCols the number of columns in the result
*/
public void testQuery(String query, int numCols)
{
// try the following
try {
// open the connection to the database
Connection connection =
DriverManager.getConnection(this.urlStr);
// create a statement
Statement statement = connection.createStatement();
// execute the query
ResultSet rs = statement.executeQuery(query);
// print out the results
while (rs.next())
{
for (int i = 1; i <= numCols; i++)
{
System.out.print(rs.getString(i) + ", ");
}
System.out.println();
}
// close everything
rs.close();
statement.close();
connection.close();
} catch (SQLException ex) {
SimpleOutput.showError("Trouble with the database " +
urlStr);
ex.printStackTrace();
}
}
/**
* Method to execute a query and return a string of the
* first result
* @param query the query to execute
* @return the first result of the query, or null if none
*/
public String getStringForQuery(String query)
{
String result = null;
// try the following
try {
// open the connection to the database
Connection connection =
DriverManager.getConnection(this.urlStr);
// create a statement
Statement statement = connection.createStatement();
// execute the query
ResultSet rs = statement.executeQuery(query);
// print out the results
if (rs.next())
{
result = rs.getString(1);
}
// close everything
rs.close();
statement.close();
connection.close();
} catch (SQLException ex) {
SimpleOutput.showError("Trouble with the database " + urlStr);
ex.printStackTrace();
}
return result;
}
/**
* Method to execute a query and return a list of strings
* for the first returned row
* @param query the query to execute
* @return list of strings for the data in the first
* returned row, the list may be empty
*/
public List getListForQuery(String query)
{
List<String> resultList = new ArrayList<String>();
// try the following
try {
// open the connection to the database
Connection connection =
DriverManager.getConnection(this.urlStr);
// create a statement
Statement statement = connection.createStatement();
// execute the query
ResultSet rs = statement.executeQuery(query);
// find out how many columns are in the result
ResultSetMetaData rsmd = rs.getMetaData();
int numCols = rsmd.getColumnCount();
// print out the results
if (rs.next())
{
for (int i = 1; i <= numCols; i++)
resultList.add(rs.getString(i));
}
// close everything
rs.close();
statement.close();
connection.close();
} catch (SQLException ex) {
SimpleOutput.showError("Trouble with the database " + urlStr);
ex.printStackTrace();
}
return resultList;
}
/* main for testing */
public static void main(String[] args)
{
// create the database manager for an Access database
DatabaseManager dbManager =
new DatabaseManager("sun.jdbc.odbc.JdbcOdbcDriver",
"jdbc:odbc:person");
// create the database manager for a MySQL database
// new DatabaseManager("com.mysql.jdbc.Driver",
// "jdbc:mysql://localhost:3306/person");
// test a query
dbManager.testQuery("Select per.FirstName, " +
"pict.FileName From " +
"Picture as pict, Person as per, " +
"PicturePerson as pictPer " +
"Where per.FirstName = 'Jennifer' And " +
"pictPer.PersonID = per.PersonID And " +
"pict.PictureID = pictPer.PictureID", 2);
}
}
package edu.gatech.mediacomp;
import java.awt.Color;
import java.util.Random;
/**
* Class that represents a deer. The deer class
* tracks all living deer with a linked list.
*
* @author Barb Ericson ericson@cc.gatech.edu
*/
public class Deer extends Turtle
{
/////////////// fields //////////////////////
/** class constant for the color */
private static final Color DEER_COLOR = new Color(116,64,35);
/** class constant for probability of turning */
private static final double PROB_OF_TURN = 4.0/5;
/** class constant for top speed (max num steps can move in a timestep) */
private static final int maxSpeed = 50;
/** random number generator */
private static Random randNumGen = new Random();
/** class variable for the last created deer (head of linked list) */
private static Deer head = null;
/** object variable for the next deer in the linked list */
private Deer next = null;
////////////////////////////// Constructors ////////////////////////
/**
* Constructor that takes the model display (the original
* position will be randomally assigned
* @param modelDisplayer thing which will display the model
*/
public Deer (ModelDisplay modelDisplayer)
{
super(randNumGen.nextInt(modelDisplayer.getWidth()),
randNumGen.nextInt(modelDisplayer.getHeight()),
modelDisplayer);
init();
}
/** Constructor that takes the x and y and a model
* display to draw it on
* @param x the starting x position
* @param y the starting y position
* @param modelDisplayer the thing that displays the model
*/
public Deer (int x, int y, ModelDisplay modelDisplayer)
{
// let the parent constructor handle it
super(x,y,modelDisplayer);
init();
}
////////////////// methods ////////////////////////////////////////
/**
* Method to get the head of the linked list of deer
* @return the head of the linked list of deer (may be null)
*/
public static Deer getHead() { return head; }
/**
* Method to get the next Deer in the linked list
* @return the next deer in the linked list of deer
* or null
*/
public Deer getNext() { return this.next; }
/**
* Method to initialize the new deer object
*/
public void init()
{
// set the color of this deer
setColor(DEER_COLOR);
// add this deer to the linked list of deer
if (head == null)
head = this;
else
{
this.next = head;
head = this;
}
// turn some random direction
this.turn(randNumGen.nextInt(360));
}
/**
* Method to act during a time step
* pick a random direction and move some random amount up to top speed
*/
public void act()
{
// if the random number is <= prob of turning then turn
if (randNumGen.nextFloat() <= PROB_OF_TURN)
{
this.turn(randNumGen.nextInt(360));
}
// go forward some random amount
forward(randNumGen.nextInt(maxSpeed));
}
/**
* Method that handles when a deer dies
*/
public void die()
{
Deer prev = null;
Deer curr = null;
// remove this deer from the linked list of deer
if (head == this)
head = head.next;
else
{
prev = head;
curr = prev.next;
while (curr != null && curr != this)
{
prev = curr;
curr = prev.next;
}
if (curr != null)
prev.next = curr.next;
}
// ask the model display to remove this
getModelDisplay().remove(this);
}
/** main method for testing */
public static void main(String[] args)
{
World w = new World();
w.setAutoRepaint(false);
Deer[] deerArray = new Deer[20];
for (int i = 0; i < 20; i++)
{
deerArray[i] = new Deer(w);
}
// now loop to do simulation
for (int i = 0; i < 100; i++)
{
for (int d = 0; d < 20; d++)
deerArray[d].act();
w.repaint();
try {
Thread.sleep(1000);
} catch (Exception ex) {
}
}
}
}
package edu.gatech.mediacomp;
import java.awt.Image;
import java.awt.image.BufferedImage;
/**
* Interface to describe a digital picture. A digital picture can have a
* associated file name. It can have a title. It has pixels
* associated with it and you can get and set the pixels. You
* can get an Image from a picture or a BufferedImage. You can load
* it from a file name or image. You can show a picture. You can
* create a new image for it.
*
* Copyright Georgia Institute of Technology 2004
* @author Barb Ericson ericson@cc.gatech.edu
*/
public interface DigitalPicture
{
public String getFileName(); // get the file name that the picture came from
public String getTitle(); // get the title of the picture
public void setTitle(String title); // set the title of the picture
public int getWidth(); // get the width of the picture in pixels
public int getHeight(); // get the height of the picture in pixels
public Image getImage(); // get the image from the picture
public BufferedImage getBufferedImage(); // get the buffered image
public int getBasicPixel(int x, int y); // get the pixel information as an int
public void setBasicPixel(int x, int y, int rgb); // set the pixel information
public Pixel getPixel(int x, int y); // get the pixel information as an object
public void load(Image image); // load the image into the picture
public boolean load(String fileName); // load the picture from a file
public void show(); // show the picture
}
package edu.gatech.mediacomp;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import java.util.Properties;
import java.io.*;
import java.net.*;
/**
* A class to make working with a file chooser easier
* for students. It uses a JFileChooser to let the user
* pick a file and returns the choosen file name.
*
* Copyright Georgia Institute of Technology 2004
* @author Barb Ericson ericson@cc.gatech.edu
*/
public class FileChooser
{
///////////////////////////// class fields ///////////////////
/**
* Properities to use during execution
*/
private static Properties appProperties = null;
/**
* Property key for the media directory
*/
private static final String MEDIA_DIRECTORY = "mediaDirectory";
/**
* Name for property file
*/
private static final String PROPERTY_FILE_NAME =
"SimplePictureProperties.txt";
/////////////////////// methods /////////////////////////////
/**
* Method to pick an item using the file chooser
* @param fileChooser the file Chooser to use
* @return the path name
*/
public static String pickPath(JFileChooser fileChooser)
{
String path = null;
/* create a JFrame to be the parent of the file
* chooser open dialog if you don't do this then
* you may not see the dialog.
*/
JFrame frame = new JFrame();
frame.setAlwaysOnTop(true);
// get the return value from choosing a file
int returnVal = fileChooser.showOpenDialog(frame);
// if the return value says the user picked a file
if (returnVal == JFileChooser.APPROVE_OPTION)
path = fileChooser.getSelectedFile().getPath();
return path;
}
/**
* Method to let the user pick a file and return
* the full file name as a string. If the user didn't
* pick a file then the file name will be null.
* @return the full file name of the picked file or null
*/
public static String pickAFile()
{
JFileChooser fileChooser = null;
// start off the file name as null
String fileName = null;
// get the current media directory
String mediaDir = getMediaDirectory();
/* create a file for this and check that the directory exists
* and if it does set the file chooser to use it
*/
try {
File file = new File(mediaDir);
if (file.exists())
fileChooser = new JFileChooser(file);
} catch (Exception ex) {
}
// if no file chooser yet create one
if (fileChooser == null)
fileChooser = new JFileChooser();
// pick the file
fileName = pickPath(fileChooser);
return fileName;
}
/**
* Method to let the user pick a directory and return
* the full path name as a string.
* @return the full directory path
*/
public static String pickADirectory()
{
JFileChooser fileChooser = null;
String dirName = null;
// get the current media directory
String mediaDir = getMediaDirectory();
// if no file chooser yet create one
if (mediaDir != null)
fileChooser = new JFileChooser(mediaDir);
else
fileChooser = new JFileChooser();
// allow only directories to be picked
fileChooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
// pick the directory
dirName = pickPath(fileChooser);
return dirName + "/";
}
/**
* Method to get the full path for the passed file name
* @param fileName the name of a file
* @return the full path for the file
*/
public static String getMediaPath(String fileName)
{
String path = null;
String directory = getMediaDirectory();
boolean done = true;
// if the directory is null
if (directory == null)
{
// try to find the mediasources directory
try {
// get the URL for where we loaded this class
Class currClass = Class.forName("FileChooser");
URL classURL = currClass.getResource("FileChooser.class");
URL fileURL = new URL(classURL,"../mediasources/");
directory = fileURL.getPath();
File dirFile = new File(directory);
if (dirFile.exists()) {
setMediaPath(directory);
done = true;
}
} catch (Exception ex) {
}
if (!done)
{
SimpleOutput.showError("The media path (directory)" +
" has not been set yet! " +
"Please pick the directory " +
"that contains your media " +
"(usually called mediasources) " +
"with the following FileChooser. " +
"The directory name will be stored " +
"in a file and remain unchanged unless you use " +
"FileChooser.pickMediaPath() or " +
"FileChooser.setMediaPath(\"full path name\") " +
"(ex: FileChooser.setMediaPath(\"c:/intro-prog-java/mediasources/\")) " +
" to change it.");
pickMediaPath();
directory = getMediaDirectory();
}
}
// get the full path
path = directory + fileName;
return path;
}
/**
* Method to get the directory for the media
* @return the media directory
*/
public static String getMediaDirectory()
{
String directory = null;
boolean done = false;
// check if the application properties are null
if (appProperties == null)
{
appProperties = new Properties();
// load the properties from a file
try {
// get the URL for where we loaded this class
Class currClass = Class.forName("FileChooser");
URL classURL = currClass.getResource("FileChooser.class");
URL fileURL = new URL(classURL,PROPERTY_FILE_NAME);
String path = fileURL.getPath();
path = path.replace("%20"," ");
FileInputStream in = new FileInputStream(path);
appProperties.load(in);
in.close();
} catch (Exception ex) {
directory = null;
}
}
// get the media directory
if (appProperties != null)
directory = (String) appProperties.get(MEDIA_DIRECTORY);
File dirFile = null;
// check if the directory exists
if (directory != null)
dirFile = new File(directory);
if (directory == null || !dirFile.exists()) {
// try to find the mediasources directory
try {
// get the URL for where we loaded this class
Class currClass = Class.forName("FileChooser");
URL classURL = currClass.getResource("FileChooser.class");
URL fileURL = new URL(classURL,"../mediasources/");
directory = fileURL.getPath();
dirFile = new File(directory);
if (dirFile.exists()) {
setMediaPath(directory);
}
} catch (Exception ex) {
}
}
return directory;
}
/**
* Method to set the media path by setting the directory to use
* @param directory the directory to use for the media path
*/
public static void setMediaPath(String directory)
{
// check if the directory exists
File file = new File(directory);
if (!file.exists())
{
System.out.println("Sorry but " + directory +
" doesn't exist, try a different directory.");
FileChooser.pickMediaPath();
}
else {
/* check if there is an application properties object
* and if not create one
*/
if (appProperties == null)
appProperties = new Properties();
// set the media directory property
appProperties.put(MEDIA_DIRECTORY,directory);
// write out the application properties to a file
try {
// get the URL for where we loaded this class
Class currClass = Class.forName("FileChooser");
URL classURL = currClass.getResource("FileChooser.class");
URL fileURL = new URL(classURL,PROPERTY_FILE_NAME);
String path = fileURL.getPath();
path = path.replace("%20"," ");
FileOutputStream out =
new FileOutputStream(path);
appProperties.store(out,
"Properties for the Simple Picture class");
out.close();
System.out.println("The media directory is now " +
directory);
} catch (Exception ex) {
System.out.println("Couldn't save media path to a file");
}
}
}
/**
* Method to pick a media path using
* the file chooser and set it
*/
public static void pickMediaPath()
{
String dir = pickADirectory();
setMediaPath(dir);
}
}
package edu.gatech.mediacomp;
import java.util.*;
import java.text.*;
import java.io.*;
import java.awt.Image;
/**
* Class used to save frames in a movie to a directory and
* show frames from a movie. This
* class tracks the directory, base file name, current
* frame number, and whether this sequence is being shown.
*
* Copyright Georgia Institute of Technology 2005
* @author Barbara Ericson ericson@cc.gatech.edu
*/
public class FrameSequencer
{
//////////////////// Fields ///////////////////////////////////
/** stores the directory to write the frames to */
private String directory;
/** stores the base file name for each frame file */
private String baseName = "frame";
/** stores the current frame number */
private int frameNumber = 1;
/** true if this sequence is being shown */
private boolean shown = false;
/** the movie player used to show this sequence */
private MoviePlayer moviePlayer = null;
/** List of all the pictures so far */
private List<Picture> pictureList = new ArrayList<Picture>();
/** Use this to format the number for the frame */
private NumberFormat numberFormat =
NumberFormat.getIntegerInstance();
//////////////////// Constructors /////////////////////////////
/**
* Constructor that takes a directory name
* @param directory the directory to save the frames to
*/
public FrameSequencer(String directory)
{
this.directory = directory;
initFormatter();
validateDirectory();
}
/**
* Constructor that takes a directory name and a base file name
* @param directory the directory to save the frames to
* @param baseName the base file name to use for the frames
*/
public FrameSequencer(String directory, String baseName)
{
// use the other constructor to set the directory
this(directory);
// set the base file name
this.baseName = baseName;
}
///////////////////// Methods ////////////////////////////////
/**
* Method to get the directory to write the frames to
* @return the directory to write the frames to
*/
public String getDirectory() { return directory; }
/**
* Method to set the directory to write the frames to
* @param dir the directory to use
*/
public void setDirectory(String dir)
{
directory = dir;
initFormatter();
validateDirectory();
}
/**
* Method to get the base name
* @return the base file name for the movie frames
*/
public String getBaseName() { return baseName; }
/**
* Method to set the base name
* @param name the new base name to use
*/
public void setBaseName(String name) { baseName = name; }
/**
* Method to get the frame number
* @return the next frame number for the next picture
* added
*/
public int getFrameNumber() { return frameNumber; }
/**
* Method to check if the frame sequence is being shown
* @return true if shown and false otherwise
*/
public boolean isShown() { return shown; }
/**
* Method to set the shown flag
* @param value the value to use
*/
public void setShown(boolean value) { shown = value; }
/**
* Method to get the number of frames in this sequence
* @return the number of frames
*/
public int getNumFrames() { return pictureList.size(); }
/**
* Method to get the movie player to use to show this sequence
* @return the movie player used to show this (may be null)
*/
public MoviePlayer getMoviePlayer() { return moviePlayer; }
/**
* Method to initialize the number formatter to show 4 digits
* with no commas
*/
private void initFormatter()
{
numberFormat.setMinimumIntegerDigits(4);
numberFormat.setGroupingUsed(false);
}
/**
* Method to validate the directory (make
* sure it ends with a separator character
*/
private void validateDirectory()
{
char end = directory.charAt(directory.length() - 1);
if (end != '/' && end != '\\')
directory = directory + '/';
File directoryFile = new File(directory);
if (!directoryFile.exists())
directoryFile.mkdirs();
}
/**
* Method to add a picture to the frame sequence
* @param picture the picture to add
*/
public void addFrame(Picture picture)
{
// add this picture to the list
pictureList.add(picture);
// get the file name
String fileName = directory + baseName +
numberFormat.format(frameNumber) + ".jpg";
// set the file name
picture.setFileName(fileName);
// write out this frame
picture.write(fileName);
// if this sequence is being shown update the frame
if (shown)
{
if (moviePlayer != null)
moviePlayer.addPicture(picture);
else
moviePlayer = new MoviePlayer(pictureList);
}
// increment the frame number
frameNumber++;
}
/**
* Method to delete the last frame
*/
public void deleteLastFrame()
{
frameNumber--;
File f = new File(directory + baseName +
numberFormat.format(frameNumber) + ".jpg");
boolean result = f.delete();
if (result != true)
System.out.println("trouble removing last frame");
pictureList.remove(pictureList.size() - 1);
}
/**
* Method to show the frame sequence
*/
public void show()
{
if (shown != true)
{
// set it to true
shown = true;
// if there is a picture show the last one
if (pictureList.size() > 0)
{
int lastIndex = pictureList.size() - 1;
Picture lastPicture = (Picture) pictureList.get(lastIndex);
moviePlayer = new MoviePlayer(pictureList);
moviePlayer.setVisible(true);
}
else
System.out.println("There are no frames to show yet. " +
"When you add a frame it will be shown");
}
}
/**
* Method to play the frames (pictures) added so far
* @param framesPerSecond the number of frames to show per second
* between frames
*/
public void play(int framesPerSecond)
{
if (pictureList.size() > 0)
{
shown = true;
if (moviePlayer == null)
moviePlayer = new MoviePlayer(pictureList);
moviePlayer.playMovie(framesPerSecond);
}
}
public static void main(String[] args)
{
String dir = "c:/intro-prog-java/movies/rectangle/";
FrameSequencer frameSequencer =
new FrameSequencer(dir);
frameSequencer.play(1000/30);
//frameSequencer.play();
}
} // end of class
package edu.gatech.mediacomp;
import java.awt.*;
/**
* Class to hold methods for doing simple geometry
* All methods are static (class) methods. You
* do not need to create an object of the Geometry
* class to use these methods.
* @author Barb Ericson ericson@cc.gatech.edu
* Copyright 2005
*/
public class Geometry
{
/**
* Method to get the slope between two points
* @param x1 the x value for one of the points
* @param y1 the y value for one of the points
* @param x2 the x value for a second point
* @param y2 the y value for a second point
* @return the slope
*/
public static double getSlope(double x1, double y1,
double x2, double y2)
{
double slope = (y2 - y1) / (x2 - x1);
return slope;
}
/**
* Method to get the slope angle between 2 points
* The slope angle is the interior angle of the
* triange of the slope line with the y and x axis.
* So it is the angle from the x axis.
* @param x1 the x value for one of the points
* @param y1 the y value for one of the points
* @param x2 the x value for a second point
* @param y2 the y value for a second point
* @return the slope angle in degrees
*/
public static double getSlopeAngle(double x1, double y1,
double x2, double y2)
{
double slope = getSlope(x1,y1,x2,y2);
double angle = Math.atan(slope);
return Math.abs(Math.toDegrees(angle));
}
/**
* Method to return the heading for a turtle
* which uses 0 degrees as north
* @param x1 x from the first point
* @param y1 y from the first point
* @param x2 x from the second point
* @param y2 y from the second point
* @return the heading in degrees from north
*/
public static double getTurtleHeading(double x1,double y1,
double x2,double y2)
{
double heading = 0;
// don't allow a divide by zero
if (x1 == x2)
{
if (y2 > y1)
heading = 180;
else
heading = 0;
}
// calculate the heading from the slope angle
else {
double slopeAngle = getSlopeAngle(x1,y1,x2,y2);
heading = 180 - (90 - slopeAngle);
if (x2 < x1)
heading = heading * -1;
}
return heading;
}
/**
* Method to get a new point at a given distance
* from an old point along a heading (angle in degrees)
* @param x1 x of a point
* @param y1 y of a point
* @param heading the heading in degrees with north
* being 0 and south 180
* @param distance the distance for the returned point
* @return the point at the distance in the direction
* of the heading
*/
public static Point getPointAtDistance(int x1, int y1,
double heading,
double distance)
{
double radiansHeading = Math.toRadians(heading);
int x2 = x1 +
(int) (distance * Math.sin(radiansHeading));
int y2 = y1 +
(int) (distance * -Math.cos(radiansHeading));
Point p = new Point(x2,y2);
return p;
}
/**
* Method to get a new point at a given distance
* from an old point along a heading (angle in degrees)
* @param startPoint the point to get the distance
* from
* @param heading the heading in degrees with north
* being 0 and south 180
* @param distance the distance for the returned point
* @return the point at the distance in the direction
* of the heading
*/
public static Point getPointAtDistance(Point startPoint,
double heading,
double distance)
{
return getPointAtDistance(startPoint.x,startPoint.y,
heading,distance);
}
/**
* Method to get the distance between two points
* @param x1 x value of first point
* @param y1 y value of first point
* @param x2 x value of second point
* @param y2 y value of second point
* @return distance between the points
*/
public static double getDistance(double x1, double y1,
double x2, double y2)
{
double xDiff = x2 - x1;
double yDiff = y2 - y1;
return Math.sqrt((xDiff * xDiff) + (yDiff * yDiff));
}
} // end of class
package edu.gatech.mediacomp;
/**
* Class to show how to define a very simple class.
*
* Copyright Georgia Institute of Technology 2004
* @author Barb Ericson ericson@cc.gatech.edu
*/
public class Greeter
{
public static void main(String[] argv)
{
// show the string "Hello World" on the console
System.out.println("Hello World");
}
}
package edu.gatech.mediacomp;
import javax.swing.*;
import java.awt.*;
import java.awt.image.*;
/**
* Class to display an image and the current location with a + sign
*
* Copyright Georgia Institute of Technology 2004
* @author Barb Ericson ericson@cc.gatech.edu
*/
public class ImageDisplay extends JPanel implements Scrollable
{
/////////////////////////// fields (attributes ///////////////////////////
private Image image; // the image to draw
private Dimension prefSize; // the preferred size of the display
private int currentX = 0; // the current x index
private int currentY = 0; // the current y index
//////////////////////////// constructors /////////////////////////////////
/**
* Constructor that takes the image to display
* @param theImage the image to display
*/
public ImageDisplay(Image theImage)
{
image = theImage;
prefSize = new Dimension(image.getWidth(this),image.getHeight(this));
setPreferredSize(prefSize);
revalidate();
}
/**
* Constructor that takes the image and current x and y
* @param theImage the image to display
* @param x the current x value to use
* @param y the current y value to use
*/
public ImageDisplay(Image theImage, int x, int y)
{
this(theImage);
currentX = x;
currentY = y;
}
////////////////////// methods /////////////////////////////////////////////
/**
* Method to get the image
* @return the image
*/
public Image getImage() { return image; }
/**
* Method to get the current x
* @return the current x value
*/
public int getCurrentX() { return currentX; }
/**
* Method to get the current y
* @return the current y value
*/
public int getCurrentY() { return currentY; }
/**
* Method to set the current x
* @param x the x value to use
*/
public void setCurrentX(int x)
{
currentX = x;
repaint();
}
/**
* Method to set the current y
* @param y the y value to use
*/
public void setCurrentY(int y)
{
currentY = y;
repaint();
}
/**
* Method to set the image
* @param theImage the new image to use
*/
public void setImage(Image theImage)
{
image = theImage;
setPreferredSize(new Dimension(image.getWidth(this),image.getHeight(this)));
repaint();
}
/**
* Method to return the preferred size
* @return the preferred size of this component
*/
public Dimension getPreferredScrollableViewportSize()
{
return prefSize;
}
/**
* Method to return the unit increment for scrolling
* @param visibleRect the visible rectangle
* @param orientation vertical or horizontal
* @param direction neg is up or left and pos is right or down
* @return the unit increment for arrow clicks
*/
public int getScrollableUnitIncrement(Rectangle visibleRect,
int orientation,
int direction)
{ return 1; }
/**
* Method to return the block increment for scrolling
* @param visibleRect the visible rectangle
* @param orientation vertical or horizontal
* @param direction neg is up or left and pos is right or down
* @return the block increment for clicking in scroll area
*/
public int getScrollableBlockIncrement(Rectangle visibleRect,
int orientation,
int direction)
{
return 10;
}
/**
* Method to check if the viewport width is the source width
* @return true if viewport and source have same width
*/
public boolean getScrollableTracksViewportWidth()
{ return false; }
/**
* Method to check if the viewport height is the source height
* @return true if viewport and soure have same height
*/
public boolean getScrollableTracksViewportHeight()
{ return false; }
/**
* Method to handle displaying this object
* @param g the graphics object for drawing with
*/
public void paintComponent(Graphics g)
{
super.paintComponent(g);
int num = 3;
int xStart = currentX - num;
int xEnd = currentX + num;
int yStart = currentY - num;
int yEnd = currentY + num;
int width = image.getWidth(this);
int maxX = width - 1;
int height = image.getHeight(this);
int maxY = height - 1;
// draw the image
g.drawImage(image,0,0,this);
// check if the current index is in the image
if (currentX >= 0 && currentX < width &&
currentY >= 0 && currentY < height)
{
// check that the start and end values are visible
if (xStart < 0)
xStart = 0;
if (xEnd > maxX)
xEnd = maxX;
if (yStart < 0)
yStart = 0;
if (yEnd > maxY)
yEnd = maxY;
// draw a small cross at the current x and y in yellow
g.setColor(Color.yellow);
g.drawLine(xStart,currentY,xEnd,currentY);
g.drawLine(currentX,yStart,currentX,yEnd);
g.setColor(Color.black);
// outline the cross in black so that it shows up better
int leftX = currentX - 1;
int rightX = currentX + 1;
int upY = currentY - 1;
int downY = currentY + 1;
if (xStart <= leftX && upY >= 0)
g.drawLine(xStart,upY,leftX,upY);
if (yStart <= upY && leftX >= 0)
g.drawLine(leftX,yStart,leftX,upY);
if (yStart <= upY && rightX <= maxX)
g.drawLine(rightX,yStart,rightX,upY);
if (upY >= 0 && rightX <= xEnd)
g.drawLine(rightX,upY,xEnd,upY);
if (downY < height && rightX <= xEnd)
g.drawLine(rightX,downY,xEnd,downY);
if (downY <= yEnd && rightX < width)
g.drawLine(rightX,downY,rightX,yEnd);
if (xStart <= leftX && downY < height)
g.drawLine(xStart,downY,leftX,downY);
if (leftX >= 0 && downY <= yEnd)
g.drawLine(leftX,downY,leftX,yEnd);
}
}
}
package edu.gatech.mediacomp;
/*
* @(#)JpegImagesToMovie.java 1.3 01/03/13
*
* Copyright (c) 1999-2001 Sun Microsystems, Inc. All Rights Reserved.
*
* Sun grants you ("Licensee") a non-exclusive, royalty free, license to use,
* modify and redistribute this software in source and binary code form,
* provided that i) this copyright notice and license appear on all copies of
* the software; and ii) Licensee does not utilize the software in a manner
* which is disparaging to Sun.
*
* This software is provided "AS IS," without a warranty of any kind. ALL
* EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES, INCLUDING ANY
* IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR
* NON-INFRINGEMENT, ARE HEREBY EXCLUDED. SUN AND ITS LICENSORS SHALL NOT BE
* LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING
* OR DISTRIBUTING THE SOFTWARE OR ITS DERIVATIVES. IN NO EVENT WILL SUN OR ITS
* LICENSORS BE LIABLE FOR ANY LOST REVENUE, PROFIT OR DATA, OR FOR DIRECT,
* INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER
* CAUSED AND REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT OF THE USE OF
* OR INABILITY TO USE SOFTWARE, EVEN IF SUN HAS BEEN ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGES.
*
* This software is not designed or intended for use in on-line control of
* aircraft, air traffic, aircraft navigation or aircraft communications; or in
* the design, construction, operation or maintenance of any nuclear
* facility. Licensee represents and warrants that it will not use or
* redistribute the Software for such purposes.
*/
import java.io.*;
import java.util.*;
import java.awt.Dimension;
import javax.media.*;
import javax.media.control.*;
import javax.media.protocol.*;
import javax.media.protocol.DataSource;
import javax.media.datasink.*;
import javax.media.format.VideoFormat;
/**
* This program takes a list of JPEG image files and converts them into
* a QuickTime or AVI movie.
* @author Sun - orig
* @author Barb Ericson ericson@cc.gatech.edu
* modified to use List<String> instead of Vector
* and added methods for Quicktime and AVI
*/
public class JpegImagesToMovie implements ControllerListener,
DataSinkListener {
/** number of frames per second */
private int fRate = 16;
/**
* Method to write out a quicktime movie
* @param width the width of the resulting movie
* @param height the height of the resulting movie
* @param frameRate the number of frames per second
* @param inFiles string full path names of the frames
* @param outML the Media Locator
*/
public boolean doItQuicktime(int width, int height,
int frameRate,
List<String> inFiles,
MediaLocator outML) {
this.fRate = frameRate;
return doIt(width,height,frameRate,inFiles,outML,
FileTypeDescriptor.QUICKTIME);
}
/**
* Method to write out a quicktime movie
* @param width the width of the resulting movie
* @param height the height of the resulting movie
* @param frameRate the number of frames per second
* @param inFiles string full path names of the frames
* @param outputURL the output URL for the movie
*/
public boolean doItQuicktime(int width, int height,
int frameRate,
List<String> inFiles,
String outputURL)
{
this.fRate = frameRate;
MediaLocator oml = createMediaLocator(outputURL);
return doItQuicktime(width,height,frameRate,inFiles,oml);
}
/**
* Method to write out an AVI movie
* @param width the width of the resulting movie
* @param height the height of the resulting movie
* @param frameRate the number of frames per second
* @param inFiles string full path names of the frames
* @param outputURL the output URL for the movie
*/
public boolean doItAVI(int width, int height,
int frameRate, List<String> inFiles,
String outputURL)
{
this.fRate = frameRate;
MediaLocator oml = createMediaLocator(outputURL);
return doItAVI(width,height,frameRate,inFiles,oml);
}
/**
* Method to write out an AVI movie
* @param width the width of the resulting movie
* @param height the height of the resulting movie
* @param frameRate the number of frames per second
* @param inFiles string full path names of the frames
* @param outML the Media Locator
*/
public boolean doItAVI(int width, int height,
int frameRate,
List<String> inFiles,
MediaLocator outML) {
this.fRate = frameRate;
return doItAVI(width,height,frameRate,inFiles,outML,
FileTypeDescriptor.MSVIDEO);
}
/**
* Method to write out the movie for a given type
* @param width the width of the resulting movie
* @param height the height of the resulting movie
* @param frameRate the number of frames per second
* @param inFiles string full path names of the frames
* @param outML the Media Locator
* @param type the VideoFormat type
*/
public boolean doIt(int width, int height,
int frameRate, List<String> inFiles,
MediaLocator outML,
String type) {
this.fRate = frameRate;
ImageDataSource ids = new ImageDataSource(width, height,
frameRate, inFiles);
Processor p;
try {
//System.err.println("- create processor for the image datasource ...");
p = Manager.createProcessor(ids);
} catch (Exception e) {
System.err.println("Yikes! Cannot create a processor from the data source.");
return false;
}
p.addControllerListener(this);
// Put the Processor into configured state so we can set
// some processing options on the processor.
p.configure();
if (!waitForState(p, p.Configured)) {
System.err.println("Failed to configure the processor.");
return false;
}
// Set the output content descriptor to QuickTime.
p.setContentDescriptor(new ContentDescriptor(type));
// Query for the processor for supported formats.
// Then set it on the processor.
TrackControl tcs[] = p.getTrackControls();
Format f[] = tcs[0].getSupportedFormats();
if (f == null || f.length <= 0) {
System.err.println("The mux does not support the input format: " + tcs[0].getFormat());
return false;
}
tcs[0].setFormat(f[0]);
//System.err.println("Setting the track format to: " + f[0]);
// We are done with programming the processor. Let's just
// realize it.
p.realize();
if (!waitForState(p, p.Realized)) {
System.err.println("Failed to realize the processor.");
return false;
}
// Now, we'll need to create a DataSink.
DataSink dsink;
if ((dsink = createDataSink(p, outML)) == null) {
System.err.println("Failed to create a DataSink for the given output MediaLocator: " + outML);
return false;
}
dsink.addDataSinkListener(this);
fileDone = false;
System.err.println("start processing...");
// OK, we can now start the actual transcoding.
try {
p.start();
dsink.start();
} catch (IOException e) {
System.err.println("IO error during processing");
return false;
}
// Wait for EndOfStream event.
waitForFileDone();
// Cleanup.
try {
dsink.close();
} catch (Exception e) {}
p.removeControllerListener(this);
System.err.println("...done processing.");
return true;
}
/**
* Method to write out the movie for an AVI movie
* @param width the width of the resulting movie
* @param height the height of the resulting movie
* @param frameRate the number of frames per second
* @param inFiles string full path names of the frames
* @param outML the Media Locator
* @param type the VideoFormat type
*/
public boolean doItAVI(int width, int height,
int frameRate, List<String> inFiles,
MediaLocator outML,
String type) {
ImageDataSource ids = new ImageDataSource(width, height,
frameRate, inFiles);
Processor p;
try {
System.err.println("- create processor for the image datasource ...");
p = Manager.createProcessor(ids);
} catch (Exception e) {
System.err.println("Yikes! Cannot create a processor from the data source.");
return false;
}
p.addControllerListener(this);
// Put the Processor into configured state so we can set
// some processing options on the processor.
p.configure();
if (!waitForState(p, p.Configured)) {
System.err.println("Failed to configure the processor.");
return false;
}
// Set the output content descriptor to QuickTime.
p.setContentDescriptor(new ContentDescriptor(type));
// Query for the processor for supported formats.
// Then set it on the processor.
TrackControl tcs[] = p.getTrackControls();
Format format;
TrackControl [] arrTrackControls = p.getTrackControls();
for ( int i = 0; i < arrTrackControls.length; i++ ) {
format = arrTrackControls[i].getFormat ();
if ( format instanceof VideoFormat ){
arrTrackControls[i].setFormat(new VideoFormat(VideoFormat.CINEPAK));
}
//else if ( format instanceof AudioFormat ){
//arrTrackControls[i].setFormat(new AudioFormat(AudioFormat.GSM_MS));
//}
}
// We are done with programming the processor. Let's just
// realize it.
p.realize();
if (!waitForState(p, p.Realized)) {
System.err.println("Failed to realize the processor.");
return false;
}
// Now, we'll need to create a DataSink.
DataSink dsink;
if ((dsink = createDataSink(p, outML)) == null) {
System.err.println("Failed to create a DataSink for the given output MediaLocator: " + outML);
return false;
}
dsink.addDataSinkListener(this);
fileDone = false;
System.err.println("start processing...");
// OK, we can now start the actual transcoding.
try {
p.start();
dsink.start();
} catch (IOException e) {
System.err.println("IO error during processing");
return false;
}
// Wait for EndOfStream event.
waitForFileDone();
// Cleanup.
try {
dsink.close();
} catch (Exception e) {}
p.removeControllerListener(this);
System.err.println("...done processing.");
return true;
}
/**
* Create the DataSink.
*/
DataSink createDataSink(Processor p, MediaLocator outML) {
DataSource ds;
if ((ds = p.getDataOutput()) == null) {
System.err.println("Something is really wrong: the processor does not have an output DataSource");
return null;
}
DataSink dsink;
try {
System.err.println("- create DataSink for: " + outML);
dsink = Manager.createDataSink(ds, outML);
dsink.open();
} catch (Exception e) {
System.err.println("Cannot create the DataSink: " + e);
return null;
}
return dsink;
}
Object waitSync = new Object();
boolean stateTransitionOK = true;
/**
* Block until the processor has transitioned to the given state.
* Return false if the transition failed.
*/
boolean waitForState(Processor p, int state) {
synchronized (waitSync) {
try {
while (p.getState() < state && stateTransitionOK)
waitSync.wait();
} catch (Exception e) {}
}
return stateTransitionOK;
}
/**
* Controller Listener.
*/
public void controllerUpdate(ControllerEvent evt) {
if (evt instanceof ConfigureCompleteEvent ||
evt instanceof RealizeCompleteEvent ||
evt instanceof PrefetchCompleteEvent) {
synchronized (waitSync) {
stateTransitionOK = true;
waitSync.notifyAll();
}
} else if (evt instanceof ResourceUnavailableEvent) {
synchronized (waitSync) {
stateTransitionOK = false;
waitSync.notifyAll();
}
} else if (evt instanceof EndOfMediaEvent) {
evt.getSourceController().stop();
evt.getSourceController().close();
}
}
Object waitFileSync = new Object();
boolean fileDone = false;
boolean fileSuccess = true;
/**
* Block until file writing is done.
*/
boolean waitForFileDone() {
synchronized (waitFileSync) {
try {
while (!fileDone)
waitFileSync.wait();
} catch (Exception e) {}
}
return fileSuccess;
}
/**
* Event handler for the file writer.
*/
public void dataSinkUpdate(DataSinkEvent evt) {
if (evt instanceof EndOfStreamEvent) {
synchronized (waitFileSync) {
fileDone = true;
waitFileSync.notifyAll();
}
} else if (evt instanceof DataSinkErrorEvent) {
synchronized (waitFileSync) {
fileDone = true;
fileSuccess = false;
waitFileSync.notifyAll();
}
}
}
public static void main(String args[]) {
if (args.length == 0)
prUsage();
// Parse the arguments.
int i = 0;
int width = -1, height = -1, frameRate = 1;
List<String> inputFiles = new ArrayList<String>();
String outputURL = null;
while (i < args.length) {
if (args[i].equals("-w")) {
i++;
if (i >= args.length)
prUsage();
width = new Integer(args[i]).intValue();
} else if (args[i].equals("-h")) {
i++;
if (i >= args.length)
prUsage();
height = new Integer(args[i]).intValue();
} else if (args[i].equals("-f")) {
i++;
if (i >= args.length)
prUsage();
frameRate = new Integer(args[i]).intValue();
} else if (args[i].equals("-o")) {
i++;
if (i >= args.length)
prUsage();
outputURL = args[i];
} else {
inputFiles.add(args[i]);
}
i++;
}
if (outputURL == null || inputFiles.size() == 0)
prUsage();
// Check for output file extension.
if (!outputURL.endsWith(".mov") && !outputURL.endsWith(".MOV")) {
System.err.println("The output file extension should end with a .mov extension");
prUsage();
}
if (width < 0 || height < 0) {
System.err.println("Please specify the correct image size.");
prUsage();
}
// Check the frame rate.
if (frameRate < 1)
frameRate = 1;
// Generate the output media locators.
MediaLocator oml;
if ((oml = createMediaLocator(outputURL)) == null) {
System.err.println("Cannot build media locator from: " + outputURL);
System.exit(0);
}
JpegImagesToMovie imageToMovie = new JpegImagesToMovie();
imageToMovie.doItQuicktime(width, height, frameRate, inputFiles, oml);
System.exit(0);
}
static void prUsage() {
System.err.println("Usage: java JpegImagesToMovie -w <width> -h <height> -f <frame rate> -o <output URL> <input JPEG file 1> <input JPEG file 2> ...");
System.exit(-1);
}
/**
* Create a media locator from the given string.
*/
static MediaLocator createMediaLocator(String url) {
MediaLocator ml;
if (url.indexOf(":") > 0 && (ml = new MediaLocator(url)) != null)
return ml;
if (url.startsWith(File.separator)) {
if ((ml = new MediaLocator("file:" + url)) != null)
return ml;
} else {
String file = "file:" + System.getProperty("user.dir") + File.separator + url;
if ((ml = new MediaLocator(file)) != null)
return ml;
}
return null;
}
///////////////////////////////////////////////
//
// Inner classes.
///////////////////////////////////////////////
/**
* A DataSource to read from a list of JPEG image files and
* turn that into a stream of JMF buffers.
* The DataSource is not seekable or positionable.
*/
class ImageDataSource extends PullBufferDataSource {
ImageSourceStream streams[];
ImageDataSource(int width, int height, int frameRate,
List images) {
streams = new ImageSourceStream[1];
streams[0] = new ImageSourceStream(width, height,
frameRate, images);
}
public void setLocator(MediaLocator source) {
}
public MediaLocator getLocator() {
return null;
}
/**
* Content type is of RAW since we are sending buffers of video
* frames without a container format.
*/
public String getContentType() {
return ContentDescriptor.RAW;
}
public void connect() {
}
public void disconnect() {
}
public void start() {
}
public void stop() {
}
/**
* Return the ImageSourceStreams.
*/
public PullBufferStream[] getStreams() {
return streams;
}
/**
* We could have derived the duration from the number of
* frames and frame rate. But for the purpose of this program,
* it's not necessary.
*/
public Time getDuration() {
return DURATION_UNKNOWN;
}
public Object[] getControls() {
return new Object[0];
}
public Object getControl(String type) {
return null;
}
}
/**
* The source stream to go along with ImageDataSource.
*/
class ImageSourceStream implements PullBufferStream {
List images;
int width, height;
VideoFormat format;
long frame = 0;
int nextImage = 0; // index of the next image to be read.
boolean ended = false;
public ImageSourceStream(int width, int height,
int frameRate, List images) {
this.width = width;
this.height = height;
this.images = images;
format = new VideoFormat(
VideoFormat.JPEG,
new Dimension(width, height),
Format.NOT_SPECIFIED,
Format.byteArray,
(float)frameRate);
}
/**
* We should never need to block assuming data are read from files.
*/
public boolean willReadBlock() {
return false;
}
/**
* This is called from the Processor to read a frame worth
* of video data.
*/
public void read(Buffer buf) throws IOException {
// Check if we've finished all the frames.
if (nextImage >= images.size()) {
// We are done. Set EndOfMedia.
System.err.println("Done reading all images.");
buf.setEOM(true);
buf.setOffset(0);
buf.setLength(0);
ended = true;
return;
}
String imageFile = (String)images.get(nextImage);
nextImage++;
//System.err.println(" - reading image file: " + imageFile);
// Open a random access file for the next image.
RandomAccessFile raFile;
raFile = new RandomAccessFile(imageFile, "r");
byte data[] = null;
// Check the input buffer type & size.
if (buf.getData() instanceof byte[])
data = (byte[])buf.getData();
// Check to see the given buffer is big enough for the frame.
if (data == null || data.length < raFile.length()) {
data = new byte[(int)raFile.length()];
buf.setData(data);
}
// Read the entire JPEG image from the file.
raFile.readFully(data, 0, (int)raFile.length());
//System.err.println(" read " + raFile.length() + " bytes.");
buf.setOffset(0);
buf.setLength((int)raFile.length());
buf.setFormat(format);
buf.setFlags(buf.getFlags() | buf.FLAG_KEY_FRAME);
buf.setTimeStamp(frame++ * Time.ONE_SECOND/fRate); /*AVI*/
// Close the random access file.
raFile.close();
}
/**
* Return the format of each video frame. That will be JPEG.
*/
public Format getFormat() {
return format;
}
public ContentDescriptor getContentDescriptor() {
return new ContentDescriptor(ContentDescriptor.RAW);
}
public long getContentLength() {
return 0;
}
public boolean endOfStream() {
return ended;
}
public Object[] getControls() {
return new Object[0];
}
public Object getControl(String type) {
return null;
}
}
}
package edu.gatech.mediacomp;
import javax.sound.midi.*;
import java.io.*;
/**
* Class that knows how to play notes using the midi standard
* Copyright 2004 Georgia Institute of Technology
*
* @author unknown Georgia Tech Students
* @author Barbara Ericson
*/
public class MidiPlayer
{
////////////// fields //////////////////////////////////
///////////// constants ////////////////////////////////
public static final int PIANO = 0;
public static final int HARMONICA = 22;
public static final int MUSIC_BOX = 10;
public static final int XYLOPHONE = 11;
public static final int GUITAR = 24;
public static final int STEEL_GUITAR = 25;
public static final int JAZZ_GUITAR = 26;
public static final int BASS = 32;
public static final int VIOLIN = 40;
public static final int CELLO = 42;
public static final int HARP = 46;
public static final int TIMPANI = 47;
public static final int TRUMPET = 56;
public static final int TROMBONE = 57;
public static final int TUBA = 58;
public static final int FRENCH_HORN = 60;
public static final int ALTO_SAX = 65;
public static final int TENOR_SAX = 66;
public static final int OBOE = 68;
public static final int CLARINET = 71;
public static final int PICCOLO = 72;
public static final int FLUTE = 73;
public static final int WHISTLE = 78;
public static final int BIRD = 123;
public static final int TELEPHONE = 124;
public static final int HELICOPTER = 125;
public static final int APPLAUSE = 126;
public static final int ICE_CUBE = 343;
private Synthesizer synth; // the music synthesizer
private Soundbank soundbank; // the sound bank
private MidiChannel[] channels; // all the channels
private MidiChannel channel;
//////////// Constructors //////////////////////////////
/**
* Constructor that takes no arguments
*/
public MidiPlayer()
{
/* try to create a synthesizer and get an
* instrument and channel
*/
try{
synth = MidiSystem.getSynthesizer();
synth.open();
soundbank = synth.getDefaultSoundbank();
if (soundbank != null)
synth.loadAllInstruments(soundbank);
channels = synth.getChannels();
channel = channels[0];
}catch(Exception e){
System.out.println(e);
}
}
/////////////////// Methods //////////////////////////////////
/**
* Method to return the synthesizer
* @return the synthesizer
*/
public Synthesizer getSynthesizer() { return synth;}
/**
* Method to close the midi player
*/
public void close(){
synth.close();
}
/**
* Method to clean up the midi player
*/
public void cleanUp(){
MidiChannel c = null;
for (int i=0; i < channels.length; i++) {
c = channels[i];
if (c != null)
c.allNotesOff();
}
}
/**
* Method to play a note
* @param note the note to play (0 to 127, 60 is middle C)
* @param duration how long to play the note in milliseconds
* @param intensity how loud to play the note (how hard the key
* was struck on a piano)
*/
public void playNote(int note, int duration, int intensity)
{
try {
channel.noteOn(note, intensity);
Thread.currentThread().sleep(duration);
channel.noteOff(note, intensity);
} catch(InterruptedException e){}
}
/**
* Method to rest for a specified number of milliseconds
* @param duration the amount to rest in milliseconds
*/
public void rest(int duration)
{
try {
Thread.currentThread().sleep(duration);
} catch(InterruptedException e){}
}
/**
* Method to change the current channel
* @param index the index of the channel to use
*/
public void setChannel(int index)
{
channel = channels[index];
}
/**
* Method to set the instrument to play
* @param num a number from 0 to 127 that represents
* the instruments
*/
public void setInstrument(int num)
{
try {
channel.programChange(num);
} catch (Exception ex) {
System.out.println("Sorry instrument number " +
num + " is not available");
}
}
/**
* Method to get the map of index number to instrument names
*/
public void getInstrumentNames()
{
Instrument[] ia = synth.getLoadedInstruments();
for (int i = 0; i < ia.length; i++)
System.out.println("Index: " + i + " Name: " + ia[i].getName());
}
/**
* Method to play a note
* @param note the note to play
* @param duration how long to play the note
*/
public void playNote(int note, int duration){
playNote(note, duration, 64);
}
/**
* Method to play an array of notes with the given
* durations and intensities
* @param index the index of the channel to use
* @param notes the array of notes to play (0-127)
* @param durations the array of durations to
* use for playing the notes in milliseconds
* @param intensities the array of intensities (loudness)
*/
public void playNotesOnChannel(int index,
int [] notes,
int [] durations,
int [] intensities)
{
// set the channel based on the index
channel = channels[index];
// loop through the array of notes
for ( int i = 0; i < notes.length; i++ ) {
channel.noteOn( notes[ i ], intensities[ i ] );
try { Thread.sleep( durations[ i ] ); } catch
( InterruptedException e ) { }
}
// turn off the notes
for ( int i = 0; i < notes.length; i++ )
channel.noteOff( notes[ i ] );
}
/**
* Method to play the first 3 measures of Jingle Bells
*/
private void playJingleBellsM1To3()
{
// measure 1
playNote(52,250); // e eighth note
playNote(60,250); // c eighth note
playNote(58,250); // b flat eighth note
playNote(56,250); // a flat eighth note
// measure 2
playNote(52,500); // e quarter note
rest(250); // rest
playNote(52,125); // e sixteenth note
playNote(52,125); // e sixteenth note
// measure 3
playNote(52,500); // e eighth note
playNote(60,250); // c eighth note
playNote(58,250); // b flat eighth note
playNote(56,250); // a flat eighth note
}
/**
* Method to play measure 5 of Jingle Bells
*/
private void playJingleBellsM5()
{
// measure 5
playNote(53,250); // f eighth note
playNote(61,250); // d flat eighth note
playNote(60,250); // c eighth note
playNote(58,250); // b flat eighth note
}
/**
* Method to play measure 7 of Jingle Bells
*/
private void playJingleBellsM7()
{
// measure 7
playNote(55,250); // g eighth note
playNote(65,250); // f eighth note
playNote(63,250); // e flat eighth note
playNote(61,250); // d flat eighth note
}
/**
* Method to play measure 9 of Jingle Bells
*/
private void playJingleBellsM9()
{
// measure 9
playNote(52,250); // e eighth note
playNote(60,250); // c eighth note
playNote(58,250); // b flat eighth note
playNote(56,250); // a flat eighth note
}
/**
* Method to play measure 11 of Jingle Bells
*/
private void playJingleBellsM11()
{
// measure 11
playNote(52,250); // e eighth note
playNote(60,250); // c eighth note
playNote(58,250); // b flat eighth note
playNote(56,250); // a flat eighth note
}
/**
* Method to play measures 13-16 of Jingle Bells
*/
private void playJingleBellsM13To16()
{
// measure 13
playNote(53,250); // f eighth note
playNote(61,250); // d flat eighth note
playNote(60,250); // c eighth note
playNote(58,250); // b flat eighth note
// measure 14
playNote(55,250); // g eighth note
playNote(63,250); // e flat eighth note
playNote(62,250); // d eighth note
playNote(63,250); // e flat eighth note
// measure 15
playNote(65,250); // f eighth note
playNote(63,250); // e flat eighth note
playNote(61,250); // d flat eighth note
playNote(58,250); // b flat eighth note
// measure 16
playNote(56,1000); // a flat half note
}
/**
* Method to play the first verse of jingle bells
* with each measure taking 1000 milliseconds (1 second)
* It is in 2/4 time
*/
private void playJingleBellsV1()
{
// measure 1
playNote(52,250); // e eighth note
playNote(60,250); // c eighth note
playNote(58,250); // b flat eighth note
playNote(56,250); // a flat eighth note
// measure 2
playNote(52,500); // e quarter note
rest(250); // rest
playNote(52,125); // e sixteenth note
playNote(52,125); // e sixteenth note
// measure 3
playNote(52,500); // e eighth note
playNote(60,250); // c eighth note
playNote(58,250); // b flat eighth note
playNote(56,250); // a flat eighth note
// measure 4
playNote(53,1000); // f half note
// measure 5
playNote(53,250); // f eighth note
playNote(61,250); // d flat eighth note
playNote(60,250); // c eighth note
playNote(58,250); // b flat eighth note
// measure 6
playNote(55,1000); // g half note
// measure 7
playNote(55,250); // g eighth note
playNote(65,250); // f eighth note
playNote(63,250); // e flat eighth note
playNote(61,250); // d flat eighth note
// measure 8
playNote(60,1000); // c half note
// measure 9
playNote(52,250); // e eighth note
playNote(60,250); // c eighth note
playNote(58,250); // b flat eighth note
playNote(56,250); // a flat eighth note
// measure 10
playNote(52,1000); // e half note
// measure 11
playNote(52,250); // e eighth note
playNote(60,250); // c eighth note
playNote(58,250); // b flat eighth note
playNote(56,250); // a flat eighth note
// measure 12
playNote(53,1000); // f half note
// measure 13
playNote(53,250); // f eighth note
playNote(61,250); // d flat eighth note
playNote(60,250); // c eighth note
playNote(58,250); // b flat eighth note
// measure 14
playNote(55,250); // g eighth note
playNote(63,250); // e flat eighth note
playNote(62,250); // d eighth note
playNote(63,250); // e flat eighth note
// measure 15
playNote(65,250); // f eighth note
playNote(63,250); // e flat eighth note
playNote(61,250); // d flat eighth note
playNote(58,250); // b flat eighth note
// measure 16
playNote(56,1000); // a flat half note
}
/**
* Method to play the first verse of jingle bells
* with each measure taking 1000 milliseconds (1 second)
* It is in 2/4 time
*/
public void playJingleBellsV1V2()
{
// play measure 1 to 3
playJingleBellsM1To3();
// measure 4
playNote(53,1000); // f half note
// measure 5
playJingleBellsM5();
// measure 6
playNote(55,1000); // g half note
// measure 7
playJingleBellsM7();
// measure 8
playNote(60,1000); // c half note
// measure 9
playJingleBellsM9();
// measure 10
playNote(52,1000); // e half note
// measure 11
playJingleBellsM11();
// measure 12
playNote(53,1000); // f half note
// measures 13 - 16
playJingleBellsM13To16();
}
/**
* Method to play the second verse of jingle bells
* with each measure taking 1000 milliseconds (1 second)
* It is in 2/4 time
*/
private void playJingleBellsV2()
{
// measure 1
rest(750);
playNote(52,250); // e eighth note
// measure 2
playNote(52,250); // e eighth note
playNote(60,250); // c eighth note
playNote(58,250); // b flat eighth note
playNote(56,250); // a flat eighth note
// measure 3
playNote(52,500); // e quarter note
rest(250); // rest
playNote(52,125); // e sixteenth note
playNote(52,125); // e sixteenth note
// measure 4
playNote(52,500); // e eighth note
playNote(60,250); // c eighth note
playNote(58,250); // b flat eighth note
playNote(56,250); // a flat eighth note
// measure 5
playNote(53,750); // f dotted quarter note
playNote(53,250); // f eighth note
// measure 6
playNote(53,250); // f eighth note
playNote(61,250); // d flat eighth note
playNote(60,250); // c eighth note
playNote(58,250); // b flat eighth note
// measure 7
playNote(55,750); // g dotted quarter note
playNote(55,250); // g eighth note
// measure 8
playNote(55,250); // g eighth note
playNote(65,250); // f eighth note
playNote(63,250); // e flat eighth note
playNote(61,250); // d flat eighth note
// measure 9
playNote(60,750); // c dotted quarter note
playNote(52,250); // e eighth note
// measure 10
playNote(52,250); // e eighth note
playNote(60,250); // c eighth note
playNote(58,250); // b flat eighth note
playNote(56,250); // a flat eighth note
// measure 11
playNote(52,750); // e dotted quarter note
playNote(52,250); // e eighth note
// measure 12
playNote(52,250); // e eighth note
playNote(60,250); // c eighth note
playNote(58,250); // b flat eighth note
playNote(56,250); // a flat eighth note
// measure 13
playNote(53,750); // f dotted quarter note
playNote(53,250); // f eighth note
// measure 14
playNote(53,250); // f eighth note
playNote(61,250); // d flat eighth note
playNote(60,250); // c eighth note
playNote(58,250); // b flat eighth note
// measure 15
playNote(55,250); // g eighth note
playNote(63,250); // e flat eighth note
playNote(62,250); // d eighth note
playNote(63,250); // e flat eighth note
// measure 16
playNote(65,250); // f eighth note
playNote(63,250); // e flat eighth note
playNote(61,250); // d flat eighth note
playNote(58,250); // b flat eighth note
// measure 17
playNote(56,1000); // a flat half note
}
/**
* Method to play refrain of Jingle Bells
*/
private void playJingleBellsRefrain()
{
// measure 1
playNote(60,250); // c eighth note
playNote(60,250); // c eighth note
playNote(60,500); // c quarter note
// measure 2
playNote(63,250); // e flat eighth note
playNote(63,250); // e flat eighth note
playNote(63,500); // e flat quarter note
// measure 3
playNote(60,250); // c eighth note
playNote(60,250); // c eighth note
playNote(65,375); // f dotted eighth note
playNote(65,125); // f sixteenth note
// measure 4
playNote(64,1000); // e half note
// measure 5
playNote(65,250); // f eighth note
playNote(61,250); // d flat eighth note
playNote(56,250); // a flat eighth note
playNote(64,250); // f eighth note
// measure 6
playNote(63,250); // e flat eighth note
playNote(60,250); // c eighth note
playNote(56,250); // a flat eighth note
playNote(56,125); // a flat sixteenth note
playNote(58,125); // b flat sixteenth note
// measure 7
playNote(60,250); // c eighth note
playNote(58,250); // b flat eighth note
playNote(56,250); // a flat eighth note
playNote(58,250); // b flat eighth note
// measure 8
playNote(60,1000); // c half note
// measure 9
playNote(60,250); // c eighth note
playNote(60,250); // c eighth note
playNote(60,500); // c quarter note
// measure 10
playNote(63,250); // e flat eighth note
playNote(63,250); // e flat eighth note
playNote(63,500); // e flat quarter note
// measure 11
playNote(60,250); // c eighth note
playNote(60,250); // c eighth note
playNote(65,250); // f eighth note
playNote(65,250); // f eighth note
// measure 12
playNote(64,1000); // e half note
// measure 13
playNote(53,250); // f eighth note
playNote(61,250); // d flat eighth note
playNote(60,250); // c eighth note
playNote(58,250); // b flat eighth note
// measure 14
playNote(56,250); // a flat eighth note
playNote(63,250); // e flat eighth note
playNote(62,250); // d eighth note
playNote(63,125); // e flat sixteenth note
playNote(63,125); // e flat sixteenth note
// measure 16
playNote(65,250); // f eighth note
playNote(63,250); // e flat eighth note
playNote(61,250); // d flat eighth note
playNote(58,250); // b flat eighth note
// measure 17
playNote(56,500); // a flat quarter note
rest(500); // rest
}
/**
* Method to play Jingle Bells
*/
public void playJingleBells()
{
// play verse 1
playJingleBellsV1();
// play refrain
playJingleBellsRefrain();
// play verse 2
playJingleBellsV2();
// play refrain
playJingleBellsRefrain();
}
/**
* Method to play the first 4 measures of jingle bells
* with each measure taking 1000 milliseconds (1 second)
*/
public void playJingleBells4()
{
// measure 1
playNote(52,250); // e eighth note
playNote(60,250); // c eighth note
playNote(58,250); // b flat eighth note
playNote(56,250); // a flat eighth note
// measure 2
playNote(52,500); // e quarter note
rest(250); // rest
playNote(52,125); // e sixteenth note
playNote(52,125); // e sixteenth note
// measure 3
playNote(52,500); // e eighth note
playNote(60,250); // c eighth note
playNote(58,250); // b flat eighth note
playNote(56,250); // a flat eighth note
// measure 4
playNote(53,1000); // f half note
}
} // end of class (do not remove and put all method before this)
package edu.gatech.mediacomp;
import java.awt.Graphics;
/**
* Interface to used to communicate between a model
* and its display
*
* Copyright Georgia Institute of Technology 2004
* @author Barb Ericson ericson@cc.gatech.edu
*/
public interface ModelDisplay
{
/** method to notify the thing that displays that
* the model has changed */
public void modelChanged();
/** method to add the model to the world
* @param model the model object to add */
public void addModel(Object model);
/**
* Method to remove the model from the world
* @param model the model object to remove */
public void remove(Object model);
/**
* Method that returns the graphics context
* for this model display
* @return the graphics context
*/
public Graphics getGraphics();
/**
* Method to clear the background
*/
public void clearBackground();
/** Method to get the width of the display
* @return the width in pixels of the display
*/
public int getWidth();
/** Method to get the height of the display
* @return the height in pixels of the display
*/
public int getHeight();
}
package edu.gatech.mediacomp;
import java.awt.*;
import java.awt.event.*;
import java.util.*;
import javax.swing.*;
/**
* Class MovieCapturePanel: a panel used to capture a movie
* Copyright Georgia Institute of Technology 2007
* @author Barb Ericson ericson@cc.gatech.edu
*/
public class MovieCapturePanel extends JPanel
{
/////////////////////// Private Attributes /////////////////////
/** captured screen area and pick region area */
private ShapeComponent shapeComponent = new ShapeComponent(500,500);
/** panel with buttons to control capture */
private CaptureButtonPanel buttonPanel = null;
/** class that holds information on the capture */
private MovieCapturer movieCapturer = null;
////////////////////// Constructors /////////////////////////////
/** A constructor that takes a directory to write the
* frames to
* @param directory the directory to write to
*/
public MovieCapturePanel (String directory)
{
init(directory);
}
/**
* Constructor that takes no arguments
*/
public MovieCapturePanel()
{
String directory = SimpleInput.getString(
"Directory to write the movie frames to (use / or \\\\ in path).");
init(directory);
}
//////////////////// Private Methods /////////////////////////////////
/* Method to initialize the panel
* @param directory the directory to write to
*/
private void init(String directory)
{
/** set up the parts */
MovieCapturer movieCapturer = new MovieCapturer(directory);
buttonPanel = new CaptureButtonPanel(movieCapturer,shapeComponent);
shapeComponent.setVideoCapture(movieCapturer);
// use a border layout
setLayout(new BorderLayout());
// add the button panel to the north section of the border layout
add(buttonPanel,BorderLayout.NORTH);
// add the shape canvas to the center section of the border layout
add(shapeComponent, BorderLayout.CENTER);
}
////////////////////// Main Method for Testing ////////////////////////
public static void main (String argv[])
{
// create a frame (main application window)
JFrame frame = new JFrame("Frame-based Movie Capturer");
frame.setAlwaysOnTop(true);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
// create a Shape Panel
MovieCapturePanel panel = new MovieCapturePanel();
// add the shapePanel to the frame
frame.getContentPane().add(panel);
frame.pack(); // shrink to fit preferred size
frame.setVisible(true); // show the frame
}
}
package edu.gatech.mediacomp;
import java.awt.AWTException;
import java.awt.Robot;
import java.awt.Toolkit;
import java.awt.image.BufferedImage;
import java.io.*;
import javax.imageio.ImageIO;
/**
* Class that captures a movie to a series of jpg frames
* Copyright Georgia Institute of Technology 2007
* @author Barb Ericson ericson@cc.gatech.edu
*/
public class MovieCapturer implements VideoCapturer
{
////////////////// fields /////////////////////////////
/** frame sequencer for writing out frames */
private FrameSequencer frameSequencer = null;
/** the number of frames per second */
private int framesPerSec = 16;
/** rectangular region to capture */
private java.awt.Rectangle region = null;
////////////////// Constructors ////////////////////////
/** Constructor that takes the directory to write the
* frames to
* @param directory the directory to write to
*/
public MovieCapturer(String directory)
{
frameSequencer = new FrameSequencer(directory);
}
/**
* Constructor that takes the directory to write to and
* the base name to use for the files
* @param directory the directory to write to
* @param baseName the name to use for the files
*/
public MovieCapturer(String directory, String baseName)
{
frameSequencer = new FrameSequencer(directory,baseName);
}
////////////////////// Methods //////////////////////////
/**
* Method to get the current directory
* @return the directory name
*/
public FrameSequencer getFrameSequencer()
{ return this.frameSequencer; }
/** Method to get the number of frames per second
* @return the number of frames per second
*/
public int getFramesPerSecond()
{ return this.framesPerSec; }
/**
* Method to set the number of frames per second
* @param frameRate the number of frames per second
*/
public void setFramesPerSecond(int frameRate)
{
this.framesPerSec = frameRate;
}
/**
* Method to get the region to capture
* @return the rectangular region to capture
*/
public java.awt.Rectangle getRegion()
{ return this.region; }
/**
* Method to capture the entire screen
* @return the captured buffered image
*/
public BufferedImage captureScreen() throws Exception
{
// capture the whole screen
BufferedImage image = new Robot().createScreenCapture(
new java.awt.Rectangle(Toolkit.getDefaultToolkit().getScreenSize()));
return image;
}
/**
* Method to capture a part of the screen
* @param x1 the top left x
* @param y1 the top left y
* @param width the width of the rectangle to capture
* @param height the height of the rectangle to capture
* @return the captured buffered image
*/
public BufferedImage captureRegion(int x1, int y1,
int width, int height)
throws AWTException
{
// capture the whole screen
BufferedImage screen = new Robot().createScreenCapture(
new java.awt.Rectangle(x1,y1,width,height));
return screen;
}
/**
* Method to capture a region of the screen
* @return the region if there is one else the screen
*/
public BufferedImage captureRegion() throws Exception
{
if (region != null)
{
BufferedImage image =
new Robot().createScreenCapture(region);
return image;
}
else return captureScreen();
}
/**
* Method to capture a movie until the done
* flag is set to true
*/
public void captureMovie()
{
boolean done = false;
BufferedImage image = null;
long startTime = 0;
long endTime = 0;
int timeToSleep = (int) (1000 / framesPerSec);
while (!done)
{
try {
startTime = System.currentTimeMillis();
image = captureRegion();
frameSequencer.addFrame(new Picture(image));
endTime = System.currentTimeMillis();
Thread.sleep(timeToSleep - (endTime - startTime));
} catch (Exception ex) {
}
}
}
/**
* Method to run the captured movie
*/
public void run()
{
captureMovie();
}
/**
* Method to capture a movie for the passed
* number of seconds
* @param numSeconds the number of seconds to capture
*/
public void captureMovie(int numSeconds)
{
BufferedImage image = null;
int timeToSleep = (int) (1000 / framesPerSec);
long startTime = 0;
long endTime = 0;
for (int i = 0; i < framesPerSec * numSeconds; i++)
{
try {
startTime = System.currentTimeMillis();
image = captureRegion();
frameSequencer.addFrame(new Picture(image));
endTime = System.currentTimeMillis();
Thread.sleep(timeToSleep - (endTime - startTime));
} catch (Exception ex) {
}
}
}
/**
* Method to capture a movie until the done
* flag is set to true
* @param x1 the top left x value
* @param y1 the top left y value
* @param width the width of the region to capture
* @param height the height of the region to capture
*/
public void captureMovie(int x1, int y1,
int width, int height)
{
boolean done = false;
long startTime = 0;
long endTime = 0;
BufferedImage image = null;
int timeToSleep = (int) (1000 / framesPerSec);
while (!done)
{
try {
startTime = System.currentTimeMillis();
image = captureRegion(x1,y1,width,height);
frameSequencer.addFrame(new Picture(image));
endTime = System.currentTimeMillis();
Thread.sleep(timeToSleep - (endTime - startTime));
} catch (Exception ex) {
}
}
}
/**
* Method to capture a movie in a rectangular
* region for the passed number of seconds
* @param x1 the top left x value
* @param y1 the top left y value
* @param width the width of the region to capture
* @param height the height of the region to capture
* @param numSeconds the number of seconds to capture
*/
public void captureMovie(int x1, int y1,
int width, int height,
int numSeconds)
{
long startTime = 0;
long endTime = 0;
BufferedImage image = null;
int timeToSleep = (int) (1000 / framesPerSec);
for (int i = 0; i < numSeconds * framesPerSec; i++)
{
try {
startTime = System.currentTimeMillis();
image = captureRegion(x1,y1,width,height);
frameSequencer.addFrame(new Picture(image));
endTime = System.currentTimeMillis();
Thread.sleep(timeToSleep - (endTime - startTime));
} catch (Exception ex) {
}
}
}
/**
* Method to play the captured movie
*/
public void playMovie()
{
frameSequencer.play(framesPerSec);
}
/**
* Method to set the region to capture (makes
* sure that the width and height is a multiple of
* 4 for compression later
* @param theRegion a rectangle that encloses the region to capture
*/
public void setRegion(java.awt.Rectangle theRegion)
{
if (theRegion.getWidth() % 4 != 0 ||
theRegion.getHeight() % 4 != 0)
{
int width = (int) theRegion.getWidth() / 4 * 4;
int height = (int) theRegion.getHeight() / 4 * 4;
this.region = new java.awt.Rectangle((int) theRegion.getX(),
(int) theRegion.getY(),
width,height);
}
else
{
this.region = theRegion;
}
}
/**
* Method to start capturing the movie
*/
public void startCapture()
{
//this.done = false;
captureMovie();
}
/**
* Method to start captureing the movie and
* continue for the passed number of seconds
* @param numSeconds the number of seconds to capture
*/
public void startCapture(int numSeconds)
{
captureMovie(numSeconds);
}
/**
* Method to stop capturing the movie
*/
public void stopCapture()
{
// need a separate thread to stop the capture
//this.done = true;
}
public static void main(String args[])
{
MovieCapturer capturer = new MovieCapturer(
"c:/intro-prog-java/mediasources/aliceTest1/",
"alice1");
capturer.captureMovie(0,0,810,674,1);
capturer.playMovie();
}
}
package edu.gatech.mediacomp;
import java.awt.*;
public class MovieMaker
{
public void makeRectangleMovie(String directory)
{
int framesPerSec = 30;
Picture p = null;
Graphics g = null;
FrameSequencer frameSequencer =
new FrameSequencer(directory);
frameSequencer.setShown(true);
// loop through the first second
for (int i = 0; i < framesPerSec; i++)
{
// draw a filled rectangle
p = new Picture(640,480);
g = p.getGraphics();
g.setColor(Color.RED);
g.fillRect(i * 10, i * 5, 50,50);
// add frame to sequencer
frameSequencer.addFrame(p);
}
// play the movie
frameSequencer.play(framesPerSec);
}
public static void main(String[] args)
{
MovieMaker maker = new MovieMaker();
maker.makeRectangleMovie("c:/temp/rect/");
}
}
package edu.gatech.mediacomp;
import javax.swing.*;
import java.util.*;
import java.io.*;
import java.awt.Container;
import java.awt.BorderLayout;
import java.awt.Image;
import java.awt.event.*;
/**
* Class that can play movies from multiple frames
* Copyright Georgia Institute of Technology 2007
* @author Barb Ericson ericson@cc.gatech.edu
*/
public class MoviePlayer
{
///////////////// fields ///////////////////////////
private JFrame frame = new JFrame("Movie Player");
private JLabel frameLabel = new JLabel("No images yet!");
private AnimationPanel animationPanel = null;
private String dir = null;
//////////////////// constructors ////////////////////
/**
* Constructor that takes a list of pictures
* @param pictureList the list of pictures to show
*/
public MoviePlayer(List<Picture> pictureList)
{
animationPanel = new AnimationPanel(pictureList);
Picture p = pictureList.get(0);
String fileName = p.getFileName();
File f = new File(fileName);
dir = f.getParent() + "/";
init();
}
/**
* Constructor that takes a directory and shows a movie
* from it
* @param directory the directory with the frames
*/
public MoviePlayer(String directory)
{
animationPanel = new AnimationPanel(directory);
dir = directory;
init();
}
/**
* Constructor to create a movie player by asking
* the user to pick the directory that contains
* the JPEG frames
*/
public MoviePlayer()
{
SimpleOutput.showInformation("Please pick a " +
"directory that contains the JPEG frames");
String directory = FileChooser.pickADirectory();
dir = directory;
animationPanel = new AnimationPanel(directory);
init();
}
/////////////////////// methods ////////////////////////////
/**
* Method to show the next image
*/
public void showNext()
{
animationPanel.showNext();
frameLabel.setText("Frame Number " +
animationPanel.getCurrIndex());
frame.repaint();
}
/**
* Method to show the previous image
*/
public void showPrevious()
{
animationPanel.showPrev();
frameLabel.setText("Frame Number " +
animationPanel.getCurrIndex());
frame.repaint();
}
/**
* Method to play the movie from the beginning
*/
public void playMovie()
{
frameLabel.setText("Playing Movie");
frame.repaint();
animationPanel.showAll();
frameLabel.setText("Frame Number " +
animationPanel.getCurrIndex());
frame.repaint();
}
/**
* Method to play the movie from the beginning
* @param framesPerSecond the number of frames to show
* per second
*/
public void playMovie(int framesPerSecond)
{
animationPanel.setFramesPerSec(framesPerSecond);
playMovie();
}
public void setFrameRate(int rate)
{
animationPanel.setFramesPerSec(rate);
}
/**
* Method to delete all the frames before the
* current one
*/
public void delAllBefore()
{
animationPanel.removeAllBefore();
}
/**
* Method to delete all the frames after the
* current one
*/
public void delAllAfter()
{
animationPanel.removeAllAfter();
}
/**
* Method to write out the movie frames as a
* Quicktime movie
*/
public void writeQuicktime()
{
MovieWriter writer = new MovieWriter(animationPanel.getFramesPerSec(),
dir);
writer.writeQuicktime();
}
/**
* Method to write out the movie frames as a
* Quicktime movie
*/
public void writeAVI()
{
MovieWriter writer = new MovieWriter(animationPanel.getFramesPerSec(),
dir);
writer.writeAVI();
}
/**
* Method to add a picture to the movie
* @param picture the picture to add
*/
public void addPicture(Picture picture)
{
animationPanel.add(picture);
showNext();
}
/**
* Method to set up the gui
*/
private void init()
{
frame.setAlwaysOnTop(true);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Container container = frame.getContentPane();
container.setLayout(new BorderLayout());
JPanel buttonPanel = new JPanel();
// add the animation panel
container.add(animationPanel,BorderLayout.CENTER);
// add the frame label to the north
JPanel labelPanel = new JPanel();
labelPanel.add(frameLabel);
container.add(labelPanel,BorderLayout.NORTH);
// add the button panel to the south
container.add(new ButtonPanel(this),BorderLayout.SOUTH);
// set the size of the frame
frame.pack();
// show the frame
frame.setVisible(true);
}
/**
* Method to set the visibility of the frame
* @param flag the visibility of the frame
*/
public void setVisible(boolean flag)
{
frame.setVisible(flag);
}
public static void main(String[] args)
{
MoviePlayer moviePlayer =
new MoviePlayer();
//new MoviePlayer("c:/temp/movie4/");
moviePlayer.playMovie(16);
}
}
package edu.gatech.mediacomp;
import java.io.*;
import java.util.*;
import java.net.*;
import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import ch.randelshofer.media.avi.AVIOutputStream;
/**
* Class to write out an AVI or Quicktime movie from
* a series of JPEG (jpg) frames in a directory
* @author Barb Ericson ericson@cc.gatech.edu
*
* Depreciated File.toURL() replaced with File.toURI().toURL()
* by Buck Scharfnorth 22 May 2008
*
* Modified writeQuicktime() and writeAVI() to check
* for appropriate endings (".mov" and ".avi") before
* appending them to the destination path. Also modified
* getOutputURL to check for "%20" in destination path.
* by Brian O'Neill 11 Aug 2008
*
*/
public class MovieWriter
{
///////////////// fields ///////////////////////////
/** the directory to read the frames from */
private String framesDir = null;
/** the number of frames per second */
private int frameRate = 16;
/** the name of the movie file */
private String movieName = null;
/** the output url for the movie */
private String outputURL = null;
////////////////// constructors //////////////////////
/**
* Constructor that takes no arguments
*/
public MovieWriter()
{
framesDir = FileChooser.pickADirectory();
movieName = getMovieName();
outputURL = getOutputURL();
}
/**
* Constructor that takes the directory that
* has the frames
* @param dirPath the full path for the directory
* that has the movie frames
*/
public MovieWriter(String dirPath)
{
framesDir = dirPath;
if(!framesDir.endsWith(File.separator) &&
!framesDir.endsWith("/")) //Makes sure framesDir ends with the file separator
framesDir += File.separator;
movieName = getMovieName();
outputURL = getOutputURL();
}
/**
* Constructor that takes the frame rate
* @param theFrameRate the number of frames per second
*/
public MovieWriter(int theFrameRate)
{
framesDir = FileChooser.pickADirectory();
frameRate = theFrameRate;
movieName = getMovieName();
outputURL = getOutputURL();
}
/**
* Constructor that takes the frame rate and the
* directory that the frames are stored in
* @param theFrameRate the number of frames per second
* @param theFramesDir the directory where the frames are
*/
public MovieWriter(int theFrameRate,
String theFramesDir)
{
this.framesDir = theFramesDir;
if(!framesDir.endsWith(File.separator) &&
!framesDir.endsWith("/")) //Makes sure framesDir ends with the file separator
framesDir += File.separator;
this.frameRate = theFrameRate;
movieName = getMovieName();
outputURL = getOutputURL();
}
/**
* Constructor that takes the directory with the frames
* the frame rate, and the output url (dir,name,
* and extendsion)
* @param theFramesDir the directory that holds the frame
* @param theFrameRate the number of frames per second
* @param theOutputURL the complete path name for the output
* movie
*/
public MovieWriter(String theFramesDir,
int theFrameRate,
String theOutputURL)
{
this.framesDir = theFramesDir;
if(!framesDir.endsWith(File.separator) &&
!framesDir.endsWith("/")) //Makes sure framesDir ends with the file separator
framesDir += File.separator;
this.frameRate = theFrameRate;
this.outputURL = theOutputURL;
}
/////////////////// methods //////////////////////////
/**
* Method to get the movie name from the directory
* where the frames are stored
* @return the name of the movie (like movie1)
*/
private String getMovieName()
{
File dir = new File(framesDir);
return dir.getName();
}
/**
* Method to create the output URL from the directory
* the frames are stored in.
* @return the URL for the output movie file
*/
private String getOutputURL()
{
File dir = null;
URL myURL = null;
if (framesDir != null)
{
try {
dir = new File(framesDir + movieName);
myURL = dir.toURI().toURL();
} catch (Exception ex) {
}
}
//return myURL.toString();
return myURL.toString().replace("%20", " ");
}
/**
* Method to get the list of jpeg frames
* @return a list of full path names for the frames
* of the movie
*/
public List<String> getFrameNames()
{
File dir = new File(framesDir);
String[] filesArray = dir.list();
List<String> files = new ArrayList<String>();
long lenFirst = 0;
for (String fileName : filesArray)
{
// only continue if jpg picture
if (fileName.indexOf(".jpg") >= 0)
{
File f = new File(framesDir + fileName);
// check for imcomplete image
if (lenFirst == 0 ||
f.length() > (lenFirst / 2))
{
// image okay so far
try {
BufferedImage i = ImageIO.read(f);
files.add(framesDir + fileName);
} catch (Exception ex) {
// if problem reading don't add it
}
}
if (lenFirst == 0)
lenFirst = f.length();
}
}
return files;
}
/**
* Method to write the movie frames in AVI format
*/
public void writeAVI()
{
/* JMF Code no longer functioned for writing AVIs.
* Commented out and code below was written to use a
* different AVI writing library.
* BJD: 11-9-09
*
JpegImagesToMovie imageToMovie = new JpegImagesToMovie();
List<String> frameNames = getFrameNames();
Picture p = new Picture((String) frameNames.get(0));
if(!outputURL.endsWith(".avi"))
outputURL = outputURL + ".avi";
imageToMovie.doItAVI(p.getWidth(),p.getHeight(),
frameRate,frameNames,outputURL);
*/
// The code below utilizes Werner Randelshofer's AVIOutputStream
// object to write an AVI movie from the list of frames. His code
// is shared under the Creative Commons Attribution License
// (see http://creativecommons.org/licenses/by/3.0/). More
// information about that code can be found in the AVIDemo.jar
// archive in the jars folder or at http://www.randelshofer.ch
List<String> frameNames = getFrameNames();
if(!outputURL.endsWith(".avi"))
outputURL = outputURL + ".avi";
Picture p = new Picture((String) frameNames.get(0));
try
{
//Convert the URL into a filename
String filename = (new URL(outputURL)).getFile();
//Setup the output stream
AVIOutputStream AVIout = new AVIOutputStream(new File(filename), AVIOutputStream.VideoFormat.JPG);
AVIout.setVideoCompressionQuality(1);
AVIout.setFrameRate(frameRate);
AVIout.setVideoDimension(p.getWidth(), p.getHeight());
//Write each frame
for (int i = 0; i < frameNames.size(); i++)
{
AVIout.writeFrame(new File(frameNames.get(i)));
}
//Close the output stream so the AVI has proper format
AVIout.close();
}
catch(Exception e) { }
}
/**
* Method to write the movie frames as quicktime
*/
public void writeQuicktime()
{
JpegImagesToMovie imageToMovie = new JpegImagesToMovie();
List<String> frameNames = getFrameNames();
Picture p = new Picture((String) frameNames.get(0));
if(!outputURL.endsWith(".mov"))
outputURL = outputURL + ".mov";
imageToMovie.doItQuicktime(p.getWidth(),p.getHeight(),
frameRate,frameNames,outputURL);
}
public static void main(String[] args)
{
MovieWriter writer =
new MovieWriter("c:/Temp/testmovie/");
writer.writeQuicktime();
writer.writeAVI();
}
}
package edu.gatech.mediacomp;
import java.awt.*;
import java.awt.geom.*;
/**
* This class represents a displayable path segment
* it has a color, width, and a Line2D object
* Copyright Georgia Institute of Technology 2005
* @author Barb Ericson ericson@cc.gatech.edu
*/
public class PathSegment
{
//////////////// fields /////////////////////
private Color color;
private int width;
private Line2D.Float line;
//////////////// constructors ///////////////
/**
* Constructor that takes the color, width,
* and line
*/
public PathSegment (Color theColor, int theWidth,
Line2D.Float theLine)
{
this.color = theColor;
this.width = theWidth;
this.line = theLine;
}
//////////////// methods ////////////////////
/**
* Method to paint this path segment
* @param g the graphics context
*/
public void paintComponent(Graphics g)
{
Graphics2D g2 = (Graphics2D) g;
BasicStroke penStroke = new BasicStroke(this.width);
g2.setStroke(penStroke);
g2.setColor(this.color);
g2.draw(this.line);
}
} // end of class
package edu.gatech.mediacomp;
import java.awt.*;
import java.awt.geom.*;
import javax.swing.*;
import java.util.List;
import java.util.ArrayList;
import java.util.Iterator;
/**
* Class to represent a pen which has a color, width,
* and a list of path segments that it should draw.
* A pen also knows if it is up or down
*
* Copyright Georgia Institute of Technology 2004
* @author Barb Ericson ericson@cc.gatech.edu
*/
public class Pen
{
////////////////// fields //////////////////////
/** track if up or down */
private boolean penDown = true;
/** color of ink */
private Color color = Color.green;
/** width of stroke */
private int width = 1;
/** list of path segment objects to draw */
private List<PathSegment> pathSegmentList =
new ArrayList<PathSegment>();
//////////////// constructors ///////////////////
/**
* Constructor that takes no arguments
*/
public Pen() { }
/**
* Constructor that takes all the ink color, and width
* @param color the ink color
* @param width the width in pixels
*/
public Pen(Color color, int width)
{
this.color = color;
this.width = width;
}
/**
* Constructor that takes the ink color, width, and penDown flag
* @param color the ink color
* @param width the width in pixels
* @param penDown the flag if the pen is down
*/
public Pen(Color color, int width, boolean penDown)
{
// use the other constructor to set these
this(color,width);
// set the pen down flag
this.penDown = penDown;
}
////////////////// methods ///////////////////////
/**
* Method to get pen down status
* @return true if the pen is down else false
*/
public boolean isPenDown() { return penDown; }
/**
* Method to set the pen down value
* @param value the new value to use
*/
public void setPenDown(boolean value) { penDown = value; }
/**
* Method to get the pen (ink) color
* @return the ink color
*/
public Color getColor() { return color; }
/**
* Method to set the pen (ink) color
* @param color the color to use
*/
public void setColor(Color color) { this.color = color;}
/**
* Method to get the width of the pen
* @return the width in pixels
*/
public int getWidth() { return width; }
/**
* Method to set the width of the pen
* @param width the width to use in pixels
*/
public void setWidth(int width) { this.width = width; }
/**
* Method to add a path segment if the pen is down
* @param x1 the first x
* @param y1 the first y
* @param x2 the second x
* @param y2 the second y
*/
public synchronized void addMove(int x1, int y1, int x2, int y2)
{
if (penDown)
{
PathSegment pathSeg =
new PathSegment(this.color,this.width,
new Line2D.Float(x1,y1,x2,y2));
pathSegmentList.add(pathSeg);
}
}
/**
* Method to clear the path stored for this pen
*/
public void clearPath()
{
pathSegmentList.clear();
}
/**
* Metod to paint the pen path
* @param g the graphics context
*/
public synchronized void paintComponent(Graphics g)
{
Color oldcolor = g.getColor();
// loop through path segment list and
Iterator iterator = pathSegmentList.iterator();
PathSegment pathSeg = null;
// loop through path segments
while (iterator.hasNext())
{
pathSeg = (PathSegment) iterator.next();
pathSeg.paintComponent(g);
}
g.setColor(oldcolor);
}
} // end of class
package edu.gatech.mediacomp;
import java.awt.*;
import java.awt.font.*;
import java.awt.geom.*;
import java.awt.image.BufferedImage;
import java.text.*;
import java.util.*;
import java.util.List; // resolves problem with java.awt.List and java.util.List
/**
* A class that represents a picture. This class inherits from
* SimplePicture and allows the student to add functionality to
* the Picture class.
*
* Copyright Georgia Institute of Technology 2004-2005
* @author Barbara Ericson ericson@cc.gatech.edu
*/
public class Picture extends SimplePicture
{
///////////////////// constructors //////////////////////////////////
/**
* Constructor that takes no arguments
*/
public Picture ()
{
/* not needed but use it to show students the implicit call to super()
* child constructors always call a parent constructor
*/
super();
}
/**
* Constructor that takes a file name and creates the picture
* @param fileName the name of the file to create the picture from
*/
public Picture(String fileName)
{
// let the parent class handle this fileName
super(fileName);
}
/**
* Constructor that takes the width and height
* @param width the width of the desired picture
* @param height the height of the desired picture
*/
public Picture(int width, int height)
{
// let the parent class handle this width and height
super(width,height);
}
/**
* Constructor that takes a picture and creates a
* copy of that picture
*/
public Picture(Picture copyPicture)
{
// let the parent class do the copy
super(copyPicture);
}
/**
* Constructor that takes a buffered image
* @param image the buffered image to use
*/
public Picture(BufferedImage image)
{
super(image);
}
////////////////////// methods ///////////////////////////////////////
/**
* Method to return a string with information about this picture.
* @return a string with information about the picture such as fileName,
* height and width.
*/
public String toString()
{
String output = "Picture, filename " + getFileName() +
" height " + getHeight()
+ " width " + getWidth();
return output;
}
public static void main(String[] args)
{
String fileName = FileChooser.pickAFile();
Picture pictObj = new Picture(fileName);
pictObj.explore();
}
} // this } is the end of class Picture, put all new methods before this
package edu.gatech.mediacomp;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.awt.image.*;
import javax.swing.border.*;
/**
* Displays a picture and lets you explore the picture by displaying the x, y, red,
* green, and blue values of the pixel at the cursor when you click a mouse button or
* press and hold a mouse button while moving the cursor. It also lets you zoom in or
* out. You can also type in a x and y value to see the color at that location.
*
* Originally created for the Jython Environment for Students (JES).
* Modified to work with DrJava by Barbara Ericson
*
* Copyright Georgia Institute of Technology 2004
* @author Keith McDermottt, gte047w@cc.gatech.edu
* @author Barb Ericson ericson@cc.gatech.edu
*/
public class PictureExplorer implements MouseMotionListener, ActionListener, MouseListener
{
// current x and y index
private int xIndex = 0;
private int yIndex = 0;
//Main gui variables
private JFrame pictureFrame;
private JScrollPane scrollPane;
//information bar variables
private JLabel xLabel;
private JButton xPrevButton;
private JButton yPrevButton;
private JButton xNextButton;
private JButton yNextButton;
private JLabel yLabel;
private JTextField xValue;
private JTextField yValue;
private JLabel rValue;
private JLabel gValue;
private JLabel bValue;
private JLabel colorLabel;
private JPanel colorPanel;
// menu components
private JMenuBar menuBar;
private JMenu zoomMenu;
private JMenuItem twentyFive;
private JMenuItem fifty;
private JMenuItem seventyFive;
private JMenuItem hundred;
private JMenuItem hundredFifty;
private JMenuItem twoHundred;
private JMenuItem fiveHundred;
/** The picture being explored */
private DigitalPicture picture;
/** The image icon used to display the picture */
private ImageIcon scrollImageIcon;
/** The image display */
private ImageDisplay imageDisplay;
/** the zoom factor (amount to zoom) */
private double zoomFactor;
/** the number system to use, 0 means starting at 0, 1 means starting at 1 */
private int numberBase=0;
/**
* Public constructor
* @param picture the picture to explore
*/
public PictureExplorer(DigitalPicture picture)
{
// set the fields
this.picture=picture;
zoomFactor=1;
// create the window and set things up
createWindow();
}
/**
* Changes the number system to start at one
*/
public void changeToBaseOne()
{
numberBase=1;
}
/**
* Set the title of the frame
*@param title the title to use in the JFrame
*/
public void setTitle(String title)
{
pictureFrame.setTitle(title);
}
/**
* Method to create and initialize the picture frame
*/
private void createAndInitPictureFrame()
{
pictureFrame = new JFrame(); // create the JFrame
pictureFrame.setResizable(true); // allow the user to resize it
pictureFrame.getContentPane().setLayout(new BorderLayout()); // use border layout
pictureFrame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); // when close stop
pictureFrame.setTitle(picture.getTitle());
PictureExplorerFocusTraversalPolicy newPolicy = new PictureExplorerFocusTraversalPolicy();
pictureFrame.setFocusTraversalPolicy(newPolicy);
}
/**
* Method to create the menu bar, menus, and menu items
*/
private void setUpMenuBar()
{
//create menu
menuBar = new JMenuBar();
zoomMenu = new JMenu("Zoom");
twentyFive = new JMenuItem("25%");
fifty = new JMenuItem("50%");
seventyFive = new JMenuItem("75%");
hundred = new JMenuItem("100%");
hundred.setEnabled(false);
hundredFifty = new JMenuItem("150%");
twoHundred = new JMenuItem("200%");
fiveHundred = new JMenuItem("500%");
// add the action listeners
twentyFive.addActionListener(this);
fifty.addActionListener(this);
seventyFive.addActionListener(this);
hundred.addActionListener(this);
hundredFifty.addActionListener(this);
twoHundred.addActionListener(this);
fiveHundred.addActionListener(this);
// add the menu items to the menus
zoomMenu.add(twentyFive);
zoomMenu.add(fifty);
zoomMenu.add(seventyFive);
zoomMenu.add(hundred);
zoomMenu.add(hundredFifty);
zoomMenu.add(twoHundred);
zoomMenu.add(fiveHundred);
menuBar.add(zoomMenu);
// set the menu bar to this menu
pictureFrame.setJMenuBar(menuBar);
}
/**
* Create and initialize the scrolling image
*/
private void createAndInitScrollingImage()
{
scrollPane = new JScrollPane();
BufferedImage bimg = picture.getBufferedImage();
imageDisplay = new ImageDisplay(bimg);
imageDisplay.addMouseMotionListener(this);
imageDisplay.addMouseListener(this);
imageDisplay.setToolTipText("Click a mouse button on a pixel to see the pixel information");
scrollPane.setViewportView(imageDisplay);
pictureFrame.getContentPane().add(scrollPane, BorderLayout.CENTER);
}
/**
* Creates the JFrame and sets everything up
*/
private void createWindow()
{
// create the picture frame and initialize it
createAndInitPictureFrame();
// set up the menu bar
setUpMenuBar();
//create the information panel
createInfoPanel();
//creates the scrollpane for the picture
createAndInitScrollingImage();
// show the picture in the frame at the size it needs to be
pictureFrame.pack();
pictureFrame.setVisible(true);
}
/**
* Method to set up the next and previous buttons for the
* pixel location information
*/
private void setUpNextAndPreviousButtons()
{
// create the image icons for the buttons
Icon prevIcon = new ImageIcon(SoundExplorer.class.getResource("leftArrow.gif"),
"previous index");
Icon nextIcon = new ImageIcon(SoundExplorer.class.getResource("rightArrow.gif"),
"next index");
// create the arrow buttons
xPrevButton = new JButton(prevIcon);
xNextButton = new JButton(nextIcon);
yPrevButton = new JButton(prevIcon);
yNextButton = new JButton(nextIcon);
// set the tool tip text
xNextButton.setToolTipText("Click to go to the next x value");
xPrevButton.setToolTipText("Click to go to the previous x value");
yNextButton.setToolTipText("Click to go to the next y value");
yPrevButton.setToolTipText("Click to go to the previous y value");
// set the sizes of the buttons
int prevWidth = prevIcon.getIconWidth() + 2;
int nextWidth = nextIcon.getIconWidth() + 2;
int prevHeight = prevIcon.getIconHeight() + 2;
int nextHeight = nextIcon.getIconHeight() + 2;
Dimension prevDimension = new Dimension(prevWidth,prevHeight);
Dimension nextDimension = new Dimension(nextWidth, nextHeight);
xPrevButton.setPreferredSize(prevDimension);
yPrevButton.setPreferredSize(prevDimension);
xNextButton.setPreferredSize(nextDimension);
yNextButton.setPreferredSize(nextDimension);
// handle previous x button press
xPrevButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent evt) {
xIndex--;
if (xIndex < 0)
xIndex = 0;
displayPixelInformation(xIndex,yIndex);
}
});
// handle previous y button press
yPrevButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent evt) {
yIndex--;
if (yIndex < 0)
yIndex = 0;
displayPixelInformation(xIndex,yIndex);
}
});
// handle next x button press
xNextButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent evt) {
xIndex++;
if (xIndex >= picture.getWidth())
xIndex = picture.getWidth() - 1;
displayPixelInformation(xIndex,yIndex);
}
});
// handle next y button press
yNextButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent evt) {
yIndex++;
if (yIndex >= picture.getHeight())
yIndex = picture.getHeight() - 1;
displayPixelInformation(xIndex,yIndex);
}
});
}
/**
* Create the pixel location panel
* @param labelFont the font for the labels
* @return the location panel
*/
public JPanel createLocationPanel(Font labelFont) {
// create a location panel
JPanel locationPanel = new JPanel();
locationPanel.setLayout(new FlowLayout());
Box hBox = Box.createHorizontalBox();
// create the labels
xLabel = new JLabel("X:");
yLabel = new JLabel("Y:");
// create the text fields
xValue = new JTextField(Integer.toString(xIndex + numberBase),6);
xValue.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
displayPixelInformation(xValue.getText(),yValue.getText());
}
});
yValue = new JTextField(Integer.toString(yIndex + numberBase),6);
yValue.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
displayPixelInformation(xValue.getText(),yValue.getText());
}
});
// set up the next and previous buttons
setUpNextAndPreviousButtons();
// set up the font for the labels
xLabel.setFont(labelFont);
yLabel.setFont(labelFont);
xValue.setFont(labelFont);
yValue.setFont(labelFont);
// add the items to the vertical box and the box to the panel
hBox.add(Box.createHorizontalGlue());
hBox.add(xLabel);
hBox.add(xPrevButton);
hBox.add(xValue);
hBox.add(xNextButton);
hBox.add(Box.createHorizontalStrut(10));
hBox.add(yLabel);
hBox.add(yPrevButton);
hBox.add(yValue);
hBox.add(yNextButton);
locationPanel.add(hBox);
hBox.add(Box.createHorizontalGlue());
return locationPanel;
}
/**
* Create the color information panel
* @param labelFont the font to use for labels
* @return the color information panel
*/
private JPanel createColorInfoPanel(Font labelFont)
{
// create a color info panel
JPanel colorInfoPanel = new JPanel();
colorInfoPanel.setLayout(new FlowLayout());
// get the pixel at the x and y
Pixel pixel = new Pixel(picture,xIndex,yIndex);
// create the labels
rValue = new JLabel("R: " + pixel.getRed());
gValue = new JLabel("G: " + pixel.getGreen());
bValue = new JLabel("B: " + pixel.getBlue());
// create the sample color panel and label
colorLabel = new JLabel("Color at location: ");
colorPanel = new JPanel();
colorPanel.setBorder(new LineBorder(Color.black,1));
// set the color sample to the pixel color
colorPanel.setBackground(pixel.getColor());
// set the font
rValue.setFont(labelFont);
gValue.setFont(labelFont);
bValue.setFont(labelFont);
colorLabel.setFont(labelFont);
colorPanel.setPreferredSize(new Dimension(25,25));
// add items to the color information panel
colorInfoPanel.add(rValue);
colorInfoPanel.add(gValue);
colorInfoPanel.add(bValue);
colorInfoPanel.add(colorLabel);
colorInfoPanel.add(colorPanel);
return colorInfoPanel;
}
/**
* Creates the North JPanel with all the pixel location
* and color information
*/
private void createInfoPanel()
{
// create the info panel and set the layout
JPanel infoPanel = new JPanel();
infoPanel.setLayout(new BorderLayout());
// create the font
Font largerFont = new Font(infoPanel.getFont().getName(),
infoPanel.getFont().getStyle(),14);
// create the pixel location panel
JPanel locationPanel = createLocationPanel(largerFont);
// create the color informaiton panel
JPanel colorInfoPanel = createColorInfoPanel(largerFont);
// add the panels to the info panel
infoPanel.add(BorderLayout.NORTH,locationPanel);
infoPanel.add(BorderLayout.SOUTH,colorInfoPanel);
// add the info panel
pictureFrame.getContentPane().add(BorderLayout.NORTH,infoPanel);
}
/**
* Method to check that the current position is in the viewing area and if
* not scroll to center the current position if possible
*/
public void checkScroll()
{
// get the x and y position in pixels
int xPos = (int) (xIndex * zoomFactor);
int yPos = (int) (yIndex * zoomFactor);
// only do this if the image is larger than normal
if (zoomFactor > 1) {
// get the rectangle that defines the current view
JViewport viewport = scrollPane.getViewport();
Rectangle rect = viewport.getViewRect();
int rectMinX = (int) rect.getX();
int rectWidth = (int) rect.getWidth();
int rectMaxX = rectMinX + rectWidth - 1;
int rectMinY = (int) rect.getY();
int rectHeight = (int) rect.getHeight();
int rectMaxY = rectMinY + rectHeight - 1;
// get the maximum possible x and y index
int maxIndexX = (int) (picture.getWidth() * zoomFactor) - rectWidth - 1;
int maxIndexY = (int) (picture.getHeight() * zoomFactor) - rectHeight - 1;
// calculate how to position the current position in the middle of the viewing
// area
int viewX = xPos - (int) (rectWidth / 2);
int viewY = yPos - (int) (rectHeight / 2);
// reposition the viewX and viewY if outside allowed values
if (viewX < 0)
viewX = 0;
else if (viewX > maxIndexX)
viewX = maxIndexX;
if (viewY < 0)
viewY = 0;
else if (viewY > maxIndexY)
viewY = maxIndexY;
// move the viewport upper left point
viewport.scrollRectToVisible(new Rectangle(viewX,viewY,rectWidth,rectHeight));
}
}
/**
* Zooms in the on picture by scaling the image.
* It is extremely memory intensive.
* @param factor the amount to zoom by
*/
public void zoom(double factor)
{
// save the current zoom factor
zoomFactor = factor;
// calculate the new width and height and get an image that size
int width = (int) (picture.getWidth()*zoomFactor);
int height = (int) (picture.getHeight()*zoomFactor);
BufferedImage bimg = picture.getBufferedImage();
// set the scroll image icon to the new image
imageDisplay.setImage(bimg.getScaledInstance(width, height, Image.SCALE_DEFAULT));
imageDisplay.setCurrentX((int) (xIndex * zoomFactor));
imageDisplay.setCurrentY((int) (yIndex * zoomFactor));
imageDisplay.revalidate();
checkScroll(); // check if need to reposition scroll
}
/**
* Repaints the image on the scrollpane.
*/
public void repaint()
{
pictureFrame.repaint();
}
//****************************************//
// Event Listeners //
//****************************************//
/**
* Called when the mouse is dragged (button held down and moved)
* @param e the mouse event
*/
public void mouseDragged(MouseEvent e)
{
displayPixelInformation(e);
}
/**
* Method to check if the given x and y are in the picture
* @param x the horiztonal value
* @param y the vertical value
* @return true if the x and y are in the picture and false otherwise
*/
private boolean isLocationInPicture(int x, int y)
{
boolean result = false; // the default is false
if (x >= 0 && x < picture.getWidth() &&
y >= 0 && y < picture.getHeight())
result = true;
return result;
}
/**
* Method to display the pixel information from the passed x and y but
* also converts x and y from strings
* @param xString the x value as a string from the user
* @param yString the y value as a string from the user
*/
public void displayPixelInformation(String xString, String yString)
{
int x = -1;
int y = -1;
try {
x = Integer.parseInt(xString);
x = x - numberBase;
y = Integer.parseInt(yString);
y = y - numberBase;
} catch (Exception ex) {
}
if (x >= 0 && y >= 0) {
displayPixelInformation(x,y);
}
}
/**
* Method to display pixel information for the passed x and y
* @param pictureX the x value in the picture
* @param pictureY the y value in the picture
*/
private void displayPixelInformation(int pictureX, int pictureY)
{
// check that this x and y is in range
if (isLocationInPicture(pictureX, pictureY))
{
// save the current x and y index
xIndex = pictureX;
yIndex = pictureY;
// get the pixel at the x and y
Pixel pixel = new Pixel(picture,xIndex,yIndex);
// set the values based on the pixel
xValue.setText(Integer.toString(xIndex + numberBase));
yValue.setText(Integer.toString(yIndex + numberBase));
rValue.setText("R: " + pixel.getRed());
gValue.setText("G: " + pixel.getGreen());
bValue.setText("B: " + pixel.getBlue());
colorPanel.setBackground(new Color(pixel.getRed(), pixel.getGreen(), pixel.getBlue()));
}
else
{
clearInformation();
}
// notify the image display of the current x and y
imageDisplay.setCurrentX((int) (xIndex * zoomFactor));
imageDisplay.setCurrentY((int) (yIndex * zoomFactor));
}
/**
* Method to display pixel information based on a mouse event
* @param e a mouse event
*/
private void displayPixelInformation(MouseEvent e)
{
// get the cursor x and y
int cursorX = e.getX();
int cursorY = e.getY();
// get the x and y in the original (not scaled image)
int pictureX = (int) (cursorX / zoomFactor + numberBase);
int pictureY = (int) (cursorY / zoomFactor + numberBase);
// display the information for this x and y
displayPixelInformation(pictureX,pictureY);
}
/**
* Method to clear the labels and current color and reset the
* current index to -1
*/
private void clearInformation()
{
xValue.setText("N/A");
yValue.setText("N/A");
rValue.setText("R: N/A");
gValue.setText("G: N/A");
bValue.setText("B: N/A");
colorPanel.setBackground(Color.black);
xIndex = -1;
yIndex = -1;
}
/**
* Method called when the mouse is moved with no buttons down
* @param e the mouse event
*/
public void mouseMoved(MouseEvent e)
{}
/**
* Method called when the mouse is clicked
* @param e the mouse event
*/
public void mouseClicked(MouseEvent e)
{
displayPixelInformation(e);
}
/**
* Method called when the mouse button is pushed down
* @param e the mouse event
*/
public void mousePressed(MouseEvent e)
{
displayPixelInformation(e);
}
/**
* Method called when the mouse button is released
* @param e the mouse event
*/
public void mouseReleased(MouseEvent e)
{
}
/**
* Method called when the component is entered (mouse moves over it)
* @param e the mouse event
*/
public void mouseEntered(MouseEvent e)
{
}
/**
* Method called when the mouse moves over the component
* @param e the mouse event
*/
public void mouseExited(MouseEvent e)
{
}
/**
* Method to enable all menu commands
*/
private void enableZoomItems()
{
twentyFive.setEnabled(true);
fifty.setEnabled(true);
seventyFive.setEnabled(true);
hundred.setEnabled(true);
hundredFifty.setEnabled(true);
twoHundred.setEnabled(true);
fiveHundred.setEnabled(true);
}
/**
* Controls the zoom menu bar
*
* @param a the ActionEvent
*/
public void actionPerformed(ActionEvent a)
{
if(a.getActionCommand().equals("Update"))
{
this.repaint();
}
if(a.getActionCommand().equals("25%"))
{
this.zoom(.25);
enableZoomItems();
twentyFive.setEnabled(false);
}
if(a.getActionCommand().equals("50%"))
{
this.zoom(.50);
enableZoomItems();
fifty.setEnabled(false);
}
if(a.getActionCommand().equals("75%"))
{
this.zoom(.75);
enableZoomItems();
seventyFive.setEnabled(false);
}
if(a.getActionCommand().equals("100%"))
{
this.zoom(1.0);
enableZoomItems();
hundred.setEnabled(false);
}
if(a.getActionCommand().equals("150%"))
{
this.zoom(1.5);
enableZoomItems();
hundredFifty.setEnabled(false);
}
if(a.getActionCommand().equals("200%"))
{
this.zoom(2.0);
enableZoomItems();
twoHundred.setEnabled(false);
}
if(a.getActionCommand().equals("500%"))
{
this.zoom(5.0);
enableZoomItems();
fiveHundred.setEnabled(false);
}
}
/**
* Test Main. It will ask you to pick a file and then show it
*/
public static void main( String args[])
{
Picture p = new Picture(FileChooser.pickAFile());
PictureExplorer test = new PictureExplorer(p);
}
/**
* Class for establishing the focus for the textfields
*/
private class PictureExplorerFocusTraversalPolicy
extends FocusTraversalPolicy {
/**
* Method to get the next component for focus
*/
public Component getComponentAfter(Container focusCycleRoot,
Component aComponent) {
if (aComponent.equals(xValue))
return yValue;
else
return xValue;
}
/**
* Method to get the previous component for focus
*/
public Component getComponentBefore(Container focusCycleRoot,
Component aComponent) {
if (aComponent.equals(xValue))
return yValue;
else
return xValue;
}
public Component getDefaultComponent(Container focusCycleRoot) {
return xValue;
}
public Component getLastComponent(Container focusCycleRoot) {
return yValue;
}
public Component getFirstComponent(Container focusCycleRoot) {
return xValue;
}
}
}
package edu.gatech.mediacomp;
import javax.swing.*;
import java.awt.*;
/**
* Class that holds a digital picture and displays it.
*
* Copyright Georgia Institute of Technology 2004
* @author Barb Ericson
*/
public class PictureFrame
{
////////////////// fields ////////////////////////////
/**
* Main window used as the frame
*/
JFrame frame = new JFrame();
/**
* ImageIcon used to display the picture in the label
*/
ImageIcon imageIcon = new ImageIcon();
/**
* Label used to display the picture
*/
private JLabel label = new JLabel(imageIcon);
/**
* Digital Picture to display
*/
private DigitalPicture picture;
///////////////// constructors ////////////////////////
/**
* A constructor that takes no arguments. This is needed
* for subclasses of this class
*/
public PictureFrame()
{
// set up the frame
initFrame();
}
/**
* A constructor that takes a picture to display
* @param picture the digital picture to display in the
* picture frame
*/
public PictureFrame(DigitalPicture picture)
{
// set the current object's picture to the passed in picture
this.picture = picture;
// set up the frame
initFrame();
}
///////////////////////// methods ///////////////////////////////
/**
* Method to set the picture to show in this picture frame
* @param picture the new picture to use
*/
public void setPicture(Picture picture)
{
this.picture = picture;
imageIcon.setImage(picture.getImage());
frame.pack();
frame.repaint();
}
/**
* A method to update the picture frame image with the image
* in the picture
*/
public void updateImage()
{
// only do this if there is a picture
if (picture != null)
{
// set the image for the image icon from the picture
imageIcon.setImage(picture.getImage());
// set the title of the frame to the title of the picture
frame.setTitle(picture.getTitle());
}
}
/**
* A method to update the picture frame image with the image in
* the picture and show it
*/
public void updateImageAndShowIt()
{
// first update the image
updateImage();
// now make sure it is shown
frame.setVisible(true);
}
/**
* A method to make sure the frame is displayed
*/
public void displayImage()
{
frame.setVisible(true);
}
/**
* A method to hide the frame
*/
public void hide()
{
frame.setVisible(false);
}
/**
* A method to set the visible flag on the frame
* @param flag the flag to use
*/
public void setVisible(boolean flag)
{
frame.setVisible(flag);
}
/**
* A method to close a picture frame
*/
public void close()
{
frame.setVisible(false);
frame.dispose();
}
/**
* Method to set the title for the picture frame
* @param title the title to use
*/
public void setTitle(String title)
{
frame.setTitle(title);
}
/**
* Method to force the picture frame to repaint (redraw)
*/
public void repaint()
{
// make it visible
frame.setVisible(true);
// update the image from the picture
updateImage();
// tell the JFrame to handle the repaint
frame.repaint();
}
/**
* A method to initialize the picture frame
*/
private void initFrame()
{
// set the image for the picture frame
updateImage();
// add the label to the frame
frame.getContentPane().add(label);
// pack the frame (set the size to as big as it needs to be)
frame.pack();
// make the frame visible
frame.setVisible(true);
}
}
package edu.gatech.mediacomp;
import java.awt.Color;
/**
* Class that references a pixel in a picture. A pixel has an x and y
* location in a picture. A pixel knows how to get and set the red,
* green, blue, and alpha values in the picture. A pixel also knows
* how to get and set the color using a Color object.
*
* Copyright Georgia Institute of Technology 2004
* @author Barb Ericson ericson@cc.gatech.edu
*/
public class Pixel
{
////////////////////////// fields ///////////////////////////////////
/** the digital picture this pixel belongs to */
private DigitalPicture picture;
/** the x location of this pixel in the picture (0,0) is top left */
private int x;
/** the y location of this pixel in the picture (0,0) is top left */
private int y;
////////////////////// constructors /////////////////////////////////
/**
* A constructor that take the x and y location for the pixel and
* the picture the pixel is coming from
* @param picture the picture that the pixel is in
* @param x the x location of the pixel in the picture
* @param y the y location of the pixel in the picture
*/
public Pixel(DigitalPicture picture, int x, int y)
{
// set the picture
this.picture = picture;
// set the x location
this.x = x;
// set the y location
this.y = y;
}
///////////////////////// methods //////////////////////////////
/**
* Method to get the x location of this pixel.
* @return the x location of the pixel in the picture
*/
public int getX() { return x; }
/**
* Method to get the y location of this pixel.
* @return the y location of the pixel in the picture
*/
public int getY() { return y; }
/**
* Method to get the amount of alpha (transparency) at this pixel.
* It will be from 0-255.
* @return the amount of alpha (transparency)
*/
public int getAlpha() {
/* get the value at the location from the picture as a 32 bit int
* with alpha, red, green, blue each taking 8 bits from left to right
*/
int value = picture.getBasicPixel(x,y);
// get the alpha value (starts at 25 so shift right 24)
// then and it with all 1's for the first 8 bits to keep
// end up with from 0 to 255
int alpha = (value >> 24) & 0xff;
return alpha;
}
/**
* Method to get the amount of red at this pixel. It will be
* from 0-255 with 0 being no red and 255 being as much red as
* you can have.
* @return the amount of red from 0 for none to 255 for max
*/
public int getRed() {
/* get the value at the location from the picture as a 32 bit int
* with alpha, red, green, blue each taking 8 bits from left to right
*/
int value = picture.getBasicPixel(x,y);
// get the red value (starts at 17 so shift right 16)
// then and it with all 1's for the first 8 bits to keep
// end up with from 0 to 255
int red = (value >> 16) & 0xff;
return red;
}
/**
* Method to get the red value from a pixel represented as an int
* @param value the color value as an int
* @return the amount of red
*/
public static int getRed(int value)
{
int red = (value >> 16) & 0xff;
return red;
}
/**
* Method to get the amount of green at this pixel. It will be
* from 0-255 with 0 being no green and 255 being as much green as
* you can have.
* @return the amount of green from 0 for none to 255 for max
*/
public int getGreen() {
/* get the value at the location from the picture as a 32 bit int
* with alpha, red, green, blue each taking 8 bits from left to right
*/
int value = picture.getBasicPixel(x,y);
// get the green value (starts at 9 so shift right 8)
int green = (value >> 8) & 0xff;
return green;
}
/**
* Method to get the green value from a pixel represented as an int
* @param value the color value as an int
* @return the amount of green
*/
public static int getGreen(int value)
{
int green = (value >> 8) & 0xff;
return green;
}
/**
* Method to get the amount of blue at this pixel. It will be
* from 0-255 with 0 being no blue and 255 being as much blue as
* you can have.
* @return the amount of blue from 0 for none to 255 for max
*/
public int getBlue() {
/* get the value at the location from the picture as a 32 bit int
* with alpha, red, green, blue each taking 8 bits from left to right
*/
int value = picture.getBasicPixel(x,y);
// get the blue value (starts at 0 so no shift required)
int blue = value & 0xff;
return blue;
}
/**
* Method to get the blue value from a pixel represented as an int
* @param value the color value as an int
* @return the amount of blue
*/
public static int getBlue(int value)
{
int blue = value & 0xff;
return blue;
}
/**
* Method to get a color object that represents the color at this pixel.
* @return a color object that represents the pixel color
*/
public Color getColor()
{
/* get the value at the location from the picture as a 32 bit int
* with alpha, red, green, blue each taking 8 bits from left to right
*/
int value = picture.getBasicPixel(x,y);
// get the red value (starts at 17 so shift right 16)
// then and it with all 1's for the first 8 bits to keep
// end up with from 0 to 255
int red = (value >> 16) & 0xff;
// get the green value (starts at 9 so shift right 8)
int green = (value >> 8) & 0xff;
// get the blue value (starts at 0 so no shift required)
int blue = value & 0xff;
return new Color(red,green,blue);
}
/**
* Method to set the pixel color to the passed in color object.
* @param newColor the new color to use
*/
public void setColor(Color newColor)
{
// set the red, green, and blue values
int red = newColor.getRed();
int green = newColor.getGreen();
int blue = newColor.getBlue();
// update the associated picture
updatePicture(this.getAlpha(),red,green,blue);
}
/**
* Method to update the picture based on the passed color
* values for this pixel
* @param alpha the alpha (transparency) at this pixel
* @param red the red value for the color at this pixel
* @param green the green value for the color at this pixel
* @param blue the blue value for the color at this pixel
*/
public void updatePicture(int alpha, int red, int green, int blue)
{
// create a 32 bit int with alpha, red, green blue from left to right
int value = (alpha << 24) + (red << 16) + (green << 8) + blue;
// update the picture with the int value
picture.setBasicPixel(x,y,value);
}
/**
* Method to correct a color value to be within 0 and 255
* @param the value to use
* @return a value within 0 and 255
*/
private static int correctValue(int value)
{
if (value < 0)
value = 0;
if (value > 255)
value = 255;
return value;
}
/**
* Method to set the red to a new red value
* @param value the new value to use
*/
public void setRed(int value)
{
// set the red value to the corrected value
int red = correctValue(value);
// update the pixel value in the picture
updatePicture(getAlpha(), red, getGreen(), getBlue());
}
/**
* Method to set the green to a new green value
* @param value the value to use
*/
public void setGreen(int value)
{
// set the green value to the corrected value
int green = correctValue(value);
// update the pixel value in the picture
updatePicture(getAlpha(), getRed(), green, getBlue());
}
/**
* Method to set the blue to a new blue value
* @param value the new value to use
*/
public void setBlue(int value)
{
// set the blue value to the corrected value
int blue = correctValue(value);
// update the pixel value in the picture
updatePicture(getAlpha(), getRed(), getGreen(), blue);
}
/**
* Method to set the alpha (transparency) to a new alpha value
* @param value the new value to use
*/
public void setAlpha(int value)
{
// make sure that the alpha is from 0 to 255
int alpha = correctValue(value);
// update the associated picture
updatePicture(alpha, getRed(), getGreen(), getBlue());
}
/**
* Method to get the distance between this pixel's color and the passed color
* @param testColor the color to compare to
* @return the distance between this pixel's color and the passed color
*/
public double colorDistance(Color testColor)
{
double redDistance = this.getRed() - testColor.getRed();
double greenDistance = this.getGreen() - testColor.getGreen();
double blueDistance = this.getBlue() - testColor.getBlue();
double distance = Math.sqrt(redDistance * redDistance +
greenDistance * greenDistance +
blueDistance * blueDistance);
return distance;
}
/**
* Method to compute the color distances between two color objects
* @param color1 a color object
* @param color2 a color object
* @return the distance between the two colors
*/
public static double colorDistance(Color color1,Color color2)
{
double redDistance = color1.getRed() - color2.getRed();
double greenDistance = color1.getGreen() - color2.getGreen();
double blueDistance = color1.getBlue() - color2.getBlue();
double distance = Math.sqrt(redDistance * redDistance +
greenDistance * greenDistance +
blueDistance * blueDistance);
return distance;
}
/**
* Method to get the average of the colors of this pixel
* @return the average of the red, green, and blue values
*/
public double getAverage()
{
double average = (getRed() + getGreen() + getBlue()) / 3.0;
return average;
}
/**
* Method to return a string with information about this pixel
* @return a string with information about this pixel
*/
public String toString()
{
return "Pixel red=" + getRed() + " green=" + getGreen() +
" blue=" + getBlue();
}
}
package edu.gatech.mediacomp;
import javax.sound.sampled.*;
import java.io.*;
/**
* The class <code>Playback</code> extends from <code>Thread</code>
* and allows for playback of a simple sound. The thread doesn't die until
* the sound is finished playing, however it is not blocking either. It
* will simply play the sound in the "background."
*
* Copyright Georgia Institute of Technology 2004
* @author unknown undergrad
* @author Barb Ericson ericson@cc.gatech.edu
*/
public class Playback extends Thread
{
///////////////// fields ////////////////////////////////////
/**
* Constant that is the default buffer size.
* @see Sound#Sound()
* @see Playback#run()
*/
private static final int BUFFER_SIZE = 16384;
/**
* The source data line for the sound
*/
private SourceDataLine line;
/**
* flag that says is the sound currently being played
*/
private boolean playing = false;
/**
* The sound being played
*/
private SimpleSound sound;
////////////////// Constructors //////////////////////////////////////
/**
* Constructor that takes the simple sound to be played
* @param sound the simple sound to play
*/
public Playback(SimpleSound sound)
{
this.sound = sound;
}
/**
* Stop the playback
*/
private void shutDown(String message, Exception e)
{
if (message != null)
{
System.err.println(message);
e.printStackTrace();
}
playing = false;
}
/**
* Stops this thread by breaking the while loop in the run method.
* Used, for example, by the "stop" button in the SoundExplorer class.
*/
public void stopPlaying()
{
playing = false;
}
/**
* Method to return true if this playback thread is playing and
* false otherwise
* @return true if playing else false
*/
public boolean getPlaying()
{
return playing;
}
/**
* Starts this thread. Gets an AudioInputStream, and writes is out
* to a SourceDataLine. If a SoundExplorer exists, upon creation of
* the SourceDataLine, the soundExplorer is added as the LineListener.
* When the thread finishes the run method, it removes itself from the
* list of threads currently playing this sound.
* @throws JavaSoundException if there were problems playing the sound.
*/
public void run()
{
AudioFileFormat audioFileFormat = sound.getAudioFileFormat();
SoundExplorer soundExplorer = sound.getSoundExplorer();
//get something to play
AudioInputStream audioInputStream = sound.makeAIS();
if(audioInputStream == null)
{
shutDown("There is no input stream to play", null);
return;
}
//reset stream to the begining
try {
audioInputStream.reset();
} catch(Exception e) {
shutDown("Problems resetting the stream\n", e);
return;
}
/* define the required attributes for the line
make sure a compatible line is supported */
DataLine.Info info = new DataLine.Info(SourceDataLine.class,
audioFileFormat.getFormat());
if(!AudioSystem.isLineSupported(info))
{
shutDown("Line matching " + info + "not supported.", null);
return;
}
//get and open the source data line for playback
try {
line = (SourceDataLine) AudioSystem.getLine(info);
if(sound.getSoundExplorer() != null)
line.addLineListener(soundExplorer);
line.open(audioFileFormat.getFormat(), BUFFER_SIZE);
} catch(LineUnavailableException e) {
shutDown("Unable to open the line: ", e);
return;
}
//play back the captured data
int frameSizeInBytes = audioFileFormat.getFormat().getFrameSize();
int bufferLengthInBytes = line.getBufferSize();
int bufferLengthInFrames = bufferLengthInBytes / frameSizeInBytes;
byte[] data = new byte[bufferLengthInBytes];
int numBytesRead = 0;
//start the source data line and begin playing
line.start();
playing = true;
// the loop that actually writes the data out
while(playing)
{
try {
if((numBytesRead = audioInputStream.read(data))
== -1)
{
break;//end of audioInputStream
}
int numBytesRemaining = numBytesRead;
while(numBytesRemaining > 0)
{
numBytesRemaining -=
line.write(data, 0, numBytesRemaining);
}//while
} catch(Exception e) {
shutDown("Error during playback: ", e);
break;
}//catch
}//while
/* we reached the end of the stream or an error occurred.
if we were playing, then let the data play out, else, skip to
stopping and closing the line.
*/
if(playing)
line.drain();
line.stop();
line.close();
line = null;
shutDown(null, null);
if(sound.getDEBUG())
System.out.println("exiting run method");
/*
this thread is about to die. remove itself from the collection
of threads playing this sound
*/
sound.removePlayback(this);
}//run()
}//end class Playback
package edu.gatech.mediacomp;
import java.awt.*;
/**
* Class Rectangle: inherits from Shape and draws a rectangle
* Copyright Georgia Institute of Technology 2007
* @author Barb Ericson
*/
public class RectangleShape extends AbstractShape
{
///////////////////// Constructors /////////////////////////////
/** No argument constructor */
public RectangleShape ()
{
super(); // use parent's no arg constructor
}
/**
* Constructor that takes two points to define the shape
* @param firstPoint first point used in defining the shape
* @param lastPoint second point used in defining the shape
*/
public RectangleShape (Point firstPoint, Point lastPoint)
{
super(firstPoint,lastPoint); // use shape constructor
}
/**
* Constructor that takes x1,y1,x2,y2
* @param x1 x value of the first point that defines the shape
* @param y1 y value of the first point that defines the shape
* @param x2 x value of the second point that defines the shape
* @param y2 y value of the second point that defines the shape
*/
public RectangleShape (int x1, int y1, int x2, int y2)
{
super(x1,y1,x2,y2); // use shape constructor
}
/////////////////////// Public Methods //////////////////////////////
/** Draw the shape
* @param g the graphics context on which to draw
*/
public void draw(Graphics g)
{
// set the color
g.setColor(color);
// draw the rectangle given the top left point and width
// and height
g.drawRect(getMinX(),getMinY(),getWidth(),getHeight());
}
}
package edu.gatech.mediacomp;
import java.awt.image.BufferedImage;
/** Interface for working with getting a region of an image
* Copyright Georgia Institute of Technology 2007
* @author Barb Ericson ericson@cc.gatech.edu
*/
public interface RegionInterface
{
/** Method to set the background image to select the region from
* @param image the image to use
*/
public void setBackgroundImage(BufferedImage image);
/**
* Method to clear the picked region (a shape)
*/
public void clearShapes();
}
package edu.gatech.mediacomp;
/**
* Class that demonstrates search algorithms
* @author Mark Guzdial
* @author Barb Ericson
**/
public class Searcher
{
/**
* Implement a linear search through the list
**/
public static String linearFind(String target, String[] list)
{
for (int index=0; index < list.length; index++)
{
if (target.compareTo(list[index]) == 0)
{return("Found it!"); }
}
return("Not found");
}
/**
* Method to use a binary search to find a target string in a
* sorted array of strings
*/
public static String binaryFind(String target, String[] list)
{
int start = 0;
int end = list.length - 1;
int checkpoint = 0;
while (start <= end)
{ //While there are more to search
// find the middle
checkpoint = (int)((start+end)/2.0);
System.out.println("Checking at: "+
checkpoint+" start="+start+" end="+end);
if (target.compareTo(list[checkpoint]) == 0)
{
return "Found it!";
}
else if (target.compareTo(list[checkpoint]) > 0)
{
start=checkpoint + 1;
}
else if (target.compareTo(list[checkpoint]) < 0)
{
end=checkpoint - 1;
}
}
return "Not found";
}
/** main for testing linearFind */
/*
public static void main(String[] args)
{
String[] searchMe = {"apple","bear","cat","dog","elephant"};
System.out.println(linearFind("apple",searchMe));
System.out.println(linearFind("cat",searchMe));
System.out.println(linearFind("giraffe",searchMe));
}
*/
/**
* Main for testing binary find
*/
public static void main(String[] args)
{
String[] searchMe = {"apple","bear","cat","dog","elephant"};
System.out.println(binaryFind("apple",searchMe));
System.out.println(binaryFind("cat",searchMe));
System.out.println(binaryFind("giraffe",searchMe));
}
}
package edu.gatech.mediacomp;
import java.awt.*;
import java.awt.event.*;
import java.util.*;
import javax.swing.*;
import java.awt.image.BufferedImage;
/**
* Class ShapeCanvas: holds shapes in a custom drawn area and
* handles a region selection
* Copyright Georgia Institute of Technology 2007
* @author Barb Ericson ericson@cc.gatech.edu
*/
public class ShapeComponent extends JComponent implements RegionInterface
{
///////////////// Private Attributes /////////////////////////////
private java.util.List<AbstractShape> shapes = new ArrayList<AbstractShape>(); // a vector of shapes
private AbstractShape currentShape = null; // current shape being dragged
private String currShapeType = AbstractShape.RECTANGLE; // default shape type
private int width = 800;
private int height = 600;
private Color backgroundColor = Color.WHITE;
private BufferedImage backgroundImage = null;
//private Image backgroundBuffer = null; // background image for double buffering
private Graphics backgroundG = null; // graphics context of background image
private VideoCapturer videoHandler = null;
/////////////////// Constructors //////////////////////////////////
/** A constructor that uses the default size */
public ShapeComponent ()
{
init();
}
/**
* A constructor that takes the width and height
* @param width the width of the canvas
* @param height the height of the canvas
*/
public ShapeComponent(int width, int height)
{
// set the local variables
this.width = width;
this.height = height;
init();
}
/**
* A constructor that takes a buffered image for the background
*/
public ShapeComponent(BufferedImage image)
{
this.backgroundImage = image;
this.width = image.getWidth();
this.height = image.getHeight();
init();
}
////////////////////// Private Methods ////////////////////////////////
/* Method to initialize the shape component size and set the mouse listeners*/
private void init()
{
// set the size of the component to the current width and height
setSize(new Dimension(width,height));
setMinimumSize(new Dimension(width,height));
setPreferredSize(new Dimension(width,height));
// add the mouse listener and mouse motion listener
addMouseListener(new MyMouseAdapter());
addMouseMotionListener(new MyMouseMotionAdapter());
// add a component listener
addComponentListener(new ComponentAdapter() {
public void componentResized(ComponentEvent e)
{
//backgroundBuffer = null;
}
});
// set the background color
//setBackground(backgroundColor);
}
///////////////////////// Public Methods ///////////////////////////////
public void setVideoCapture(VideoCapturer handler)
{
this.videoHandler = handler;
}
public void setBackgroundImage(BufferedImage image)
{
Picture p = new Picture(image);
Picture p2 = p.scale(0.5,0.5);
backgroundImage = (BufferedImage) p2.getImage();
width = backgroundImage.getWidth();
height = backgroundImage.getHeight();
setSize(new Dimension(width,height));
setMinimumSize(new Dimension(width,height));
setPreferredSize(new Dimension(width,height));
repaint();
}
/**
* Method to add a shape to the shape vector
* @param shape the shape to add
*/
public void add(AbstractShape shape)
{
// add the shape to the vector of shapes
shapes.add(shape);
// force a repaint to show the new shape
repaint();
}
/**
* Method to remove a shape from the shape vector
* @param shape the shape to remove
*/
public void remove(Shape shape)
{
// remove the shape from the vector of shapes
shapes.remove(shape); // removes first one
// force a repaint to show that it is gone
repaint();
}
/**
* Method to remove a shape given the index
* @param index the index of the shape in the shape vector that you
* wish to remove
*/
public void remove(int index)
{
// remove the shape at the given index
shapes.remove(index);
// force a repaint to show it is gone
repaint();
}
/**
* Update normally clears the background and calls paint
* override it here to just call paint
* @param g the graphics context on which to draw
*/
public void update(Graphics g)
{
paint(g);
}
/**
* Method to paint the shape canvas and all objects in it
* @param g the graphic context on which to paint
*/
public void paintComponent (Graphics g)
{
AbstractShape currShape;
height = this.getHeight();
int width = this.getWidth();
if (backgroundImage == null)
{
g.setColor(backgroundColor);
g.clearRect(0, 0, width, height);
}
else
g.drawImage(backgroundImage,0,0,this);
// loop through the shape objects and draw each one
for (int i=0; i<shapes.size(); i++)
{
currShape = (AbstractShape) shapes.get(i);
currShape.draw(g);
}
// when drawing to background is done display background
// image
//g.drawImage(backgroundBuffer,0,0,this);
}
/**
* Set the type of the shape that will be created when the user
* clicks in the shape canvas.
* @param shapeType the name of the shape
*/
public void setShape(String shapeType)
{
currShapeType = shapeType;
}
/**
* Clear all shapes out of the shape vector
*/
public void clearShapes()
{
// remove all shapes from the shape vector
shapes.clear();
// repaint to show that they are gone
repaint();
}
/////////////////// Main Method for Testing ///////////////////////////
public static void main (String argv[])
{
// create a frame
JFrame frame = new JFrame();
// create a ShapeComponent
ShapeComponent shapeComponent = new ShapeComponent(500,500);
// create a rectangle shape
AbstractShape shape = new RectangleShape(50,50,60,60);
// add the shape to the shape canvas
shapeComponent.add(shape);
// add the shape canvas to the frame
frame.getContentPane().add(shapeComponent);
frame.pack(); // shrink to fit preferred size
frame.setVisible(true); // show the frame
}
/** An inner class for handling the mouse listener interface */
class MyMouseAdapter extends MouseAdapter
{
/** Method to handle when the user presses down the button */
public void mousePressed(MouseEvent e)
{
int currX = e.getX();
int currY = e.getY();
// create an object of the current shape type
try {
Class shapeClass = Class.forName(currShapeType);
currentShape = (AbstractShape) shapeClass.newInstance();
} catch (Exception ex)
{
System.err.println("Problem in creating a shape");
ex.printStackTrace();
System.exit(1);
}
// fill in point1 and point2 in the new shape
currentShape.setPoint1Values(currX,currY);
currentShape.setPoint2Values(currX + 1, currY + 1);
// add the shape to the vector of shapes
add(currentShape);
// repaint all
repaint();
}
/** Method to handle when the user releases the mouse */
public void mouseReleased(MouseEvent e)
{
int currX = e.getX();
int currY = e.getY();
// update the the point 2 values
currentShape.setPoint2Values(currX,currY);
if (videoHandler != null)
videoHandler.setRegion(new java.awt.Rectangle(currentShape.getMinX()*2,
currentShape.getMinY()*2,
currentShape.getWidth()*2,
currentShape.getHeight()*2));
// no current shape being dragged
currentShape = null;
// repaint
repaint();
}
}
/** Inner class for handling the mouse motion listener */
class MyMouseMotionAdapter extends MouseMotionAdapter
{
/** Method to handle the drag of a mouse */
public void mouseDragged(MouseEvent e)
{
int currX = e.getX();
int currY = e.getY();
// set the point 2 values
currentShape.setPoint2Values(currX, currY);
// repaint
repaint();
}
}
}
package edu.gatech.mediacomp;
import javax.swing.*;
/**
* Class to make it easy to get input
* from a user using JOptionPane
*
* Copyright Georgia Institute of Technology 2004
* @author Barb Ericson ericson@cc.gatech.edu
*/
public class SimpleInput
{
/**
* Method to allow the user to input a number.
* the dialog will keep appearing till a valid
* number is input.
* @param message the message to display to
* the user in the dialog
* @return the number as a double
*/
public static double getNumber(String message)
{
boolean okay = true; // start out okay
String answerString = null; // answer as a string
double answer = 0;
// Try to get a number using an input dialog
do
{
// get the user's answer as a string
answerString = JOptionPane.showInputDialog(message);
// try to convert to a number
try {
answer = Double.parseDouble(answerString);
okay = true;
} catch (Exception ex) {
/* not a number so set flag to false and
* change message
*/
okay = false;
message = "Try again. That wasn't a number!";
}
} while (!okay);
// return the answer as a number
return answer;
}
/**
* Method to allow the user to input an integer.
* The dialog will keep appearing till a valid
* number is input.
* @param message the message to display to
* the user in the dialog
* @return the number as an integer
*/
public static int getIntNumber(String message)
{
boolean okay = true; // start out okay
String answerString = null; // answer as a string
int answer = 0;
// Try to get a number using an input dialog
do
{
// get the user's answer as a string
answerString = JOptionPane.showInputDialog(message);
// try to convert to a number
try {
answer = Integer.parseInt(answerString);
okay = true;
} catch (Exception ex) {
/* not a number so set flag to false and
* change message
*/
okay = false;
message = "Try again. That wasn't an integer!";
}
} while (!okay);
// return the answer as a number
return answer;
}
/**
* Method to get an integer between a minimum
* and maximum (inclusive)
* @param message the message to display to
* @param min the minimum number
* @param max the maximum number
* @return the user entered integer
*/
public static int getIntNumber(String message,
int min,
int max)
{
boolean okay = true; // start out okay
String answerString = null; // answer as a string
String failMessage = "Try again. That wasn't an " +
"integer between " + min +
" and " + max + "!";
int answer = 0;
// Try to get a number using an input dialog
do
{
// get the user's answer as a string
answerString = JOptionPane.showInputDialog(message);
// try to convert to a number
try {
answer = Integer.parseInt(answerString);
/* check that the answer is in the
* allowed range
*/
if (answer >= min && answer <= max)
{
okay = true;
}
else
{
okay = false;
message = failMessage;
}
} catch (Exception ex) {
/* not a number so set flag to false and
* change message
*/
okay = false;
message = failMessage;
}
} while (!okay);
// return the answer as a number
return answer;
}
/**
* Method to get the name of a directory
* @param message the message to display to the user
* @return the pathname for a directory
*/
public static String getDirectory(String message)
{
String name = getString(message);
return name;
}
/**
* Method to get a string input by the user.
* The dialog will keep appearing till a
* string is entered.
* @param message the message to display to
* the user
* @return the input string
*/
public static String getString(String message)
{
boolean okay = true;
String answer = null;
do {
answer = JOptionPane.showInputDialog(message);
okay = true;
// if null try again
if (answer == null)
okay = false;
} while (!okay);
// return the answer
return answer;
}
} // end of SimpleInput class
package edu.gatech.mediacomp;
import javax.swing.*;
import java.text.*;
/**
* Class to make it easy to do output to the user
* using JOptionPane
*
* Copyright Georgia Institute of Technology 2004
* @author Barb Ericson ericson@cc.gatech.edu
*/
public class SimpleOutput
{
/**
* Method to show a warning to a user
* @param message the message to display
*/
public static void showWarning(String message)
{
message = addNewLines(message);
JOptionPane.showMessageDialog(null,message,"Warning Display",
JOptionPane.WARNING_MESSAGE);
}
/**
* Method to show an error to a user
* @param message the message to display
*/
public static void showError(String message)
{
message = addNewLines(message);
JOptionPane.showMessageDialog(null,message,"Error Display",
JOptionPane.ERROR_MESSAGE);
}
/**
* Method to show information to the user
* @param message the message to display
*/
public static void showInformation(String message)
{
message = addNewLines(message);
JOptionPane.showMessageDialog(null, message, "Information Display",
JOptionPane.INFORMATION_MESSAGE);
}
/**
* Method to add new line character if the message
* is too long
* @param message the input message
* @return the message with new lines added if needed
*/
public static String addNewLines(String message)
{
BreakIterator boundary =
BreakIterator.getLineInstance();
boundary.setText(message);
int start = boundary.first();
String result = "";
String currLine = "";
String temp = null;
// loop till no more possible line breaks
for (int end = boundary.next();
end != BreakIterator.DONE;
start = end, end = boundary.next())
{
// get string between start and end
temp = message.substring(start,end);
/* if adding that to the current line
* would make it too long then add current
* to result followed by a newline and
* reset current
*/
if (temp.length() + currLine.length() > 100)
{
result = result + currLine + "\n";
currLine = temp;
}
// else add the segment to the current line
else
currLine = currLine + temp;
}
// if no line breaks use the original message
if (result.length() == 0)
result = message;
// else add any leftover parts
else
result = result + currLine;
return result;
}
} // end of SimpleOutput class
package edu.gatech.mediacomp;
import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import javax.swing.ImageIcon;
import java.awt.*;
import java.io.*;
import java.awt.geom.*;
/**
* A class that represents a simple picture. A simple picture may have
* an associated file name and a title. A simple picture has pixels,
* width, and height. A simple picture uses a BufferedImage to
* hold the pixels. You can show a simple picture in a
* PictureFrame (a JFrame).
*
* Copyright Georgia Institute of Technology 2004
* @author Barb Ericson ericson@cc.gatech.edu
*/
public class SimplePicture implements DigitalPicture
{
/////////////////////// Fields /////////////////////////
/**
* the file name associated with the simple picture
*/
private String fileName;
/**
* the title of the simple picture
*/
private String title;
/**
* buffered image to hold pixels for the simple picture
*/
private BufferedImage bufferedImage;
/**
* frame used to display the simple picture
*/
private PictureFrame pictureFrame;
/**
* extension for this file (jpg or bmp)
*/
private String extension;
/////////////////////// Constructors /////////////////////////
/**
* A Constructor that takes no arguments. All fields will be null.
* A no-argument constructor must be given in order for a class to
* be able to be subclassed. By default all subclasses will implicitly
* call this in their parent's no argument constructor unless a
* different call to super() is explicitly made as the first line
* of code in a constructor.
*/
public SimplePicture()
{this(200,100);}
/**
* A Constructor that takes a file name and uses the file to create
* a picture
* @param fileName the file name to use in creating the picture
*/
public SimplePicture(String fileName)
{
// load the picture into the buffered image
load(fileName);
}
/**
* A constructor that takes the width and height desired for a picture and
* creates a buffered image of that size. This constructor doesn't
* show the picture.
* @param width the desired width
* @param height the desired height
*/
public SimplePicture(int width, int height)
{
bufferedImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
title = "None";
fileName = "None";
extension = "jpg";
setAllPixelsToAColor(Color.white);
}
/**
* A constructor that takes the width and height desired for a picture and
* creates a buffered image of that size. It also takes the
* color to use for the background of the picture.
* @param width the desired width
* @param height the desired height
* @param theColor the background color for the picture
*/
public SimplePicture(int width, int height, Color theColor)
{
this(width,height);
setAllPixelsToAColor(theColor);
}
/**
* A Constructor that takes a picture to copy information from
* @param copyPicture the picture to copy from
*/
public SimplePicture(SimplePicture copyPicture)
{
if (copyPicture.fileName != null)
{
this.fileName = new String(copyPicture.fileName);
this.extension = copyPicture.extension;
}
if (copyPicture.title != null)
this.title = new String(copyPicture.title);
if (copyPicture.bufferedImage != null)
{
this.bufferedImage = new BufferedImage(copyPicture.getWidth(),
copyPicture.getHeight(), BufferedImage.TYPE_INT_RGB);
this.copyPicture(copyPicture);
}
}
/**
* A constructor that takes a buffered image
* @param image the buffered image
*/
public SimplePicture(BufferedImage image)
{
this.bufferedImage = image;
title = "None";
fileName = "None";
extension = "jpg";
}
////////////////////////// Methods //////////////////////////////////
/**
* Method to get the extension for this picture
* @return the extendsion (jpg or bmp)
*/
public String getExtension() { return extension; }
/**
* Method that will copy all of the passed source picture into
* the current picture object
* @param sourcePicture the picture object to copy
*/
public void copyPicture(SimplePicture sourcePicture)
{
Pixel sourcePixel = null;
Pixel targetPixel = null;
// loop through the columns
for (int sourceX = 0, targetX = 0;
sourceX < sourcePicture.getWidth() &&
targetX < this.getWidth();
sourceX++, targetX++)
{
// loop through the rows
for (int sourceY = 0, targetY = 0;
sourceY < sourcePicture.getHeight() &&
targetY < this.getHeight();
sourceY++, targetY++)
{
sourcePixel = sourcePicture.getPixel(sourceX,sourceY);
targetPixel = this.getPixel(targetX,targetY);
targetPixel.setColor(sourcePixel.getColor());
}
}
}
/**
* Method to set the color in the picture to the passed color
* @param color the color to set to
*/
public void setAllPixelsToAColor(Color color)
{
// loop through all x
for (int x = 0; x < this.getWidth(); x++)
{
// loop through all y
for (int y = 0; y < this.getHeight(); y++)
{
getPixel(x,y).setColor(color);
}
}
}
/**
* Method to get the buffered image
* @return the buffered image
*/
public BufferedImage getBufferedImage()
{
return bufferedImage;
}
/**
* Method to get a graphics object for this picture to use to draw on
* @return a graphics object to use for drawing
*/
public Graphics getGraphics()
{
return bufferedImage.getGraphics();
}
/**
* Method to get a Graphics2D object for this picture which can
* be used to do 2D drawing on the picture
*/
public Graphics2D createGraphics()
{
return bufferedImage.createGraphics();
}
/**
* Method to get the file name associated with the picture
* @return the file name associated with the picture
*/
public String getFileName() { return fileName; }
/**
* Method to set the file name
* @param name the full pathname of the file
*/
public void setFileName(String name)
{
fileName = name;
}
/**
* Method to get the title of the picture
* @return the title of the picture
*/
public String getTitle()
{ return title; }
/**
* Method to set the title for the picture
* @param title the title to use for the picture
*/
public void setTitle(String title)
{
this.title = title;
if (pictureFrame != null)
pictureFrame.setTitle(title);
}
/**
* Method to get the width of the picture in pixels
* @return the width of the picture in pixels
*/
public int getWidth() { return bufferedImage.getWidth(); }
/**
* Method to get the height of the picture in pixels
* @return the height of the picture in pixels
*/
public int getHeight() { return bufferedImage.getHeight(); }
/**
* Method to get the picture frame for the picture
* @return the picture frame associated with this picture
* (it may be null)
*/
public PictureFrame getPictureFrame() { return pictureFrame; }
/**
* Method to set the picture frame for this picture
* @param pictureFrame the picture frame to use
*/
public void setPictureFrame(PictureFrame pictureFrame)
{
// set this picture objects' picture frame to the passed one
this.pictureFrame = pictureFrame;
}
/**
* Method to get an image from the picture
* @return the buffered image since it is an image
*/
public Image getImage()
{
return bufferedImage;
}
/**
* Method to return the pixel value as an int for the given x and y location
* @param x the x coordinate of the pixel
* @param y the y coordinate of the pixel
* @return the pixel value as an integer (alpha, red, green, blue)
*/
public int getBasicPixel(int x, int y)
{
return bufferedImage.getRGB(x,y);
}
/**
* Method to set the value of a pixel in the picture from an int
* @param x the x coordinate of the pixel
* @param y the y coordinate of the pixel
* @param rgb the new rgb value of the pixel (alpha, red, green, blue)
*/
public void setBasicPixel(int x, int y, int rgb)
{
bufferedImage.setRGB(x,y,rgb);
}
/**
* Method to get a pixel object for the given x and y location
* @param x the x location of the pixel in the picture
* @param y the y location of the pixel in the picture
* @return a Pixel object for this location
*/
public Pixel getPixel(int x, int y)
{
// create the pixel object for this picture and the given x and y location
Pixel pixel = new Pixel(this,x,y);
return pixel;
}
/**
* Method to get a one-dimensional array of Pixels for this simple picture
* @return a one-dimensional array of Pixel objects starting with y=0
* to y=height-1 and x=0 to x=width-1.
*/
public Pixel[] getPixels()
{
int width = getWidth();
int height = getHeight();
Pixel[] pixelArray = new Pixel[width * height];
// loop through height rows from top to bottom
for (int row = 0; row < height; row++)
for (int col = 0; col < width; col++)
pixelArray[row * width + col] = new Pixel(this,col,row);
return pixelArray;
}
/**
* Method to load the buffered image with the passed image
* @param image the image to use
*/
public void load(Image image)
{
// get a graphics context to use to draw on the buffered image
Graphics2D graphics2d = bufferedImage.createGraphics();
// draw the image on the buffered image starting at 0,0
graphics2d.drawImage(image,0,0,null);
// show the new image
show();
}
/**
* Method to show the picture in a picture frame
*/
public void show()
{
// if there is a current picture frame then use it
if (pictureFrame != null)
pictureFrame.updateImageAndShowIt();
// else create a new picture frame with this picture
else
pictureFrame = new PictureFrame(this);
}
/**
* Method to hide the picture
*/
public void hide()
{
if (pictureFrame != null)
pictureFrame.setVisible(false);
}
/**
* Method to make this picture visible or not
* @param flag true if you want it visible else false
*/
public void setVisible(boolean flag)
{
if (flag)
this.show();
else
this.hide();
}
/**
* Method to open a picture explorer on a copy of this simple picture
*/
public void explore()
{
// create a copy of the current picture and explore it
new PictureExplorer(new SimplePicture(this));
}
/**
* Method to force the picture to redraw itself. This is very
* useful after you have changed the pixels in a picture.
*/
public void repaint()
{
// if there is a picture frame tell it to repaint
if (pictureFrame != null)
pictureFrame.repaint();
// else create a new picture frame
else
pictureFrame = new PictureFrame(this);
}
/**
* Method to load the picture from the passed file name
* @param fileName the file name to use to load the picture from
*/
public void loadOrFail(String fileName) throws IOException
{
// set the current picture's file name
this.fileName = fileName;
// set the extension
int posDot = fileName.indexOf('.');
if (posDot >= 0)
this.extension = fileName.substring(posDot + 1);
// if the current title is null use the file name
if (title == null)
title = fileName;
File file = new File(this.fileName);
if (!file.canRead())
{
// try adding the media path
file = new File(FileChooser.getMediaPath(this.fileName));
if (!file.canRead())
{
throw new IOException(this.fileName +
" could not be opened. Check that you specified the path");
}
}
bufferedImage = ImageIO.read(file);
}
/**
* Method to write the contents of the picture to a file with
* the passed name without throwing errors
* @param fileName the name of the file to write the picture to
* @return true if success else false
*/
public boolean load(String fileName)
{
try {
this.loadOrFail(fileName);
return true;
} catch (Exception ex) {
System.out.println("There was an error trying to open " + fileName);
bufferedImage = new BufferedImage(600,200,
BufferedImage.TYPE_INT_RGB);
addMessage("Couldn't load " + fileName,5,100);
return false;
}
}
/**
* Method to load the picture from the passed file name
* this just calls load(fileName) and is for name compatibility
* @param fileName the file name to use to load the picture from
* @return true if success else false
*/
public boolean loadImage(String fileName)
{
return load(fileName);
}
/**
* Method to draw a message as a string on the buffered image
* @param message the message to draw on the buffered image
* @param xPos the leftmost point of the string in x
* @param yPos the bottom of the string in y
*/
public void addMessage(String message, int xPos, int yPos)
{
// get a graphics context to use to draw on the buffered image
Graphics2D graphics2d = bufferedImage.createGraphics();
// set the color to white
graphics2d.setPaint(Color.white);
// set the font to Helvetica bold style and size 16
graphics2d.setFont(new Font("Helvetica",Font.BOLD,16));
// draw the message
graphics2d.drawString(message,xPos,yPos);
}
/**
* Method to draw a string at the given location on the picture
* @param text the text to draw
* @param xPos the left x for the text
* @param yPos the top y for the text
*/
public void drawString(String text, int xPos, int yPos)
{
addMessage(text,xPos,yPos);
}
/**
* Method to create a new picture by scaling the current
* picture by the given x and y factors
* @param xFactor the amount to scale in x
* @param yFactor the amount to scale in y
* @return the resulting picture
*/
public Picture scale(double xFactor, double yFactor)
{
// set up the scale tranform
AffineTransform scaleTransform = new AffineTransform();
scaleTransform.scale(xFactor,yFactor);
// create a new picture object that is the right size
Picture result = new Picture((int) (getWidth() * xFactor),
(int) (getHeight() * yFactor));
// get the graphics 2d object to draw on the result
Graphics graphics = result.getGraphics();
Graphics2D g2 = (Graphics2D) graphics;
// draw the current image onto the result image scaled
g2.drawImage(this.getImage(),scaleTransform,null);
return result;
}
/**
* Method to create a new picture of the passed width.
* The aspect ratio of the width and height will stay
* the same.
* @param width the desired width
* @return the resulting picture
*/
public Picture getPictureWithWidth(int width)
{
// set up the scale tranform
double xFactor = (double) width / this.getWidth();
Picture result = scale(xFactor,xFactor);
return result;
}
/**
* Method to create a new picture of the passed height.
* The aspect ratio of the width and height will stay
* the same.
* @param height the desired height
* @return the resulting picture
*/
public Picture getPictureWithHeight(int height)
{
// set up the scale tranform
double yFactor = (double) height / this.getHeight();
Picture result = scale(yFactor,yFactor);
return result;
}
/**
* Method to load a picture from a file name and show it in a picture frame
* @param fileName the file name to load the picture from
* @return true if success else false
*/
public boolean loadPictureAndShowIt(String fileName)
{
boolean result = true; // the default is that it worked
// try to load the picture into the buffered image from the file name
result = load(fileName);
// show the picture in a picture frame
show();
return result;
}
/**
* Method to write the contents of the picture to a file with
* the passed name
* @param fileName the name of the file to write the picture to
*/
public void writeOrFail(String fileName) throws IOException
{
String extension = this.extension; // the default is current
// create the file object
File file = new File(fileName);
File fileLoc = file.getParentFile();
// canWrite is true only when the file exists already! (alexr)
if (!fileLoc.canWrite()) {
// System.err.println("can't write the file but trying anyway? ...");
throw new IOException(fileName +
" could not be opened. Check to see if you can write to the directory.");
}
// get the extension
int posDot = fileName.indexOf('.');
if (posDot >= 0)
extension = fileName.substring(posDot + 1);
// write the contents of the buffered image to the file as jpeg
ImageIO.write(bufferedImage, extension, file);
}
/**
* Method to write the contents of the picture to a file with
* the passed name without throwing errors
* @param fileName the name of the file to write the picture to
* @return true if success else false
*/
public boolean write(String fileName)
{
try {
this.writeOrFail(fileName);
return true;
} catch (Exception ex) {
System.out.println("There was an error trying to write " + fileName);
return false;
}
}
/**
* Method to set the media path by setting the directory to use
* @param directory the directory to use for the media path
*/
public static void setMediaPath(String directory) {
FileChooser.setMediaPath(directory);
}
/**
* Method to get the directory for the media
* @param fileName the base file name to use
* @return the full path name by appending
* the file name to the media directory
*/
public static String getMediaPath(String fileName) {
return FileChooser.getMediaPath(fileName);
}
/**
* Method to get the coordinates of the enclosing rectangle after this
* transformation is applied to the current picture
* @return the enclosing rectangle
*/
public Rectangle2D getTransformEnclosingRect(AffineTransform trans)
{
int width = getWidth();
int height = getHeight();
double maxX = width - 1;
double maxY = height - 1;
double minX, minY;
Point2D.Double p1 = new Point2D.Double(0,0);
Point2D.Double p2 = new Point2D.Double(maxX,0);
Point2D.Double p3 = new Point2D.Double(maxX,maxY);
Point2D.Double p4 = new Point2D.Double(0,maxY);
Point2D.Double result = new Point2D.Double(0,0);
Rectangle2D.Double rect = null;
// get the new points and min x and y and max x and y
trans.deltaTransform(p1,result);
minX = result.getX();
maxX = result.getX();
minY = result.getY();
maxY = result.getY();
trans.deltaTransform(p2,result);
minX = Math.min(minX,result.getX());
maxX = Math.max(maxX,result.getX());
minY = Math.min(minY,result.getY());
maxY = Math.max(maxY,result.getY());
trans.deltaTransform(p3,result);
minX = Math.min(minX,result.getX());
maxX = Math.max(maxX,result.getX());
minY = Math.min(minY,result.getY());
maxY = Math.max(maxY,result.getY());
trans.deltaTransform(p4,result);
minX = Math.min(minX,result.getX());
maxX = Math.max(maxX,result.getX());
minY = Math.min(minY,result.getY());
maxY = Math.max(maxY,result.getY());
// create the bounding rectangle to return
rect = new Rectangle2D.Double(minX,minY,maxX - minX + 1, maxY - minY + 1);
return rect;
}
/**
* Method to get the coordinates of the enclosing rectangle after this
* transformation is applied to the current picture
* @return the enclosing rectangle
*/
public Rectangle2D getTranslationEnclosingRect(AffineTransform trans)
{
return getTransformEnclosingRect(trans);
}
/**
* Method to return a string with information about this picture
* @return a string with information about the picture
*/
public String toString()
{
String output = "Simple Picture, filename " + fileName +
" height " + getHeight() + " width " + getWidth();
return output;
}
} // end of SimplePicture class
package edu.gatech.mediacomp;
import javax.sound.sampled.*;
import java.io.*;
import java.util.Vector;
import javazoom.jl.converter.*;
/**
* The <code>SimpleSound</code> class is an implementation of the
* Java Sound API specifically designed for use with students.
* http://java.sun.com/products/java-media/sound/index.html
* <p>
* This class allows for easy playback, and manipulation of AU,
* AIFF, and WAV files.
* <p>
*
* Code & ideas for this class related to playing and
* viewing the sound were borrowed from the Java Sound Demo:
* http://java.sun.com/products/java-media/sound/
* samples/JavaSoundDemo/
*
* Also, some code borrowed from Tritonus as noted.
*
* Copyright Georgia Institute of Technology 2004
* @author Ellie Harmon, ellie@cc.gatech.edu
* @author Barbara Ericson ericson@mindspring.com
*/
public class SimpleSound{
///////////////////////////// fields ////////////////////////
/**
* Constant for max negative value
*/
public static final int MAX_NEG = -32768;
/**
* Constant for max positive value
*/
public static final int MAX_POS = 32767;
/**
* Constant for the default sampling rate
*/
private static final int SAMPLE_RATE = 22050;
/**
* Constant for the default sample size in bits
* it is usual to have either 8 or 16
*/
private static final int NUM_BITS_PER_SAMPLE = 16;
/**
* Flag to tell if in debug mode or not
*/
private static final boolean DEBUG = false;
/**
* An array of bytes representing the sound.
*/
private byte[] buffer;
/**
* Contains information about this sound such as its length,
* format, and type.
* @see AudioFormat
*/
private AudioFileFormat audioFileFormat = null;
/**
* A collection of the threads that are playing this sound.
*/
private Vector<Playback> playbacks = new Vector<Playback>();
/**
* The explorer for this sound, if it exists. If it exists, this
* becomes the LineListener for output lines in the Playback class.
* @see Playback
*/
private SoundExplorer soundExplorer = null;
/**
* The name of the file from which this sound was created. Gets
* updated every time load from file is called.
* @see #loadFromFile
*/
private String fileName = null;
////////////////////////// constructors /////////////////////
/**
* Constructs a <code>SimpleSound</code> of 3 seconds long.
*/
public SimpleSound()
{
this(SAMPLE_RATE * 3);
}
/**
* Constructs a <code>SimpleSound</code> of the specified length.
* This sound will simply consist of an empty byte array, and an
* <code>AudioFileFormat</code> with the following values:
* <ul>
* <li><code>AudioFileFormat.Type.WAVE</code>
* <li>22.05K sampling rate
* <li>16 bit sample
* <li>1 channel
* <li>signed PCM encoding
* <li>small-endian byte order
* </ul>
* Note that no new sound file is created, we only represent the
* sound with a buffer and the AudioFileFormat. If a file is
* desired, then the method <code>writeToFile(String filename)
* </code> must be called on this newly created sound.
*
* @param numFrames the number of samples in the sound
* @see SimpleSound#write(String filename)
*/
public SimpleSound(int numFrames)
{
int numChannels = 1; // the number of channels in the sound
int bytesPerSample = NUM_BITS_PER_SAMPLE / 8;
/*
Make a new sound with the default sampling rate, 16 bits,
1 channel(==1 sample/frame), signed, smallEndian
*/
AudioFormat audioFormat =
new AudioFormat(SAMPLE_RATE, NUM_BITS_PER_SAMPLE,
numChannels, true, false);
/*
* The length in bytes is the number of channels
* times the number of frames and times the number of bytes per
* sample (2 bytes per sample)
*/
int lengthInFrames = numChannels * numFrames;
int lengthInBytes = lengthInFrames * bytesPerSample;
/*
Make a new WAV file format, with the AudioFormat described above
*/
audioFileFormat =
new AudioFileFormat(AudioFileFormat.Type.WAVE,
audioFormat, lengthInFrames);
// create the buffer
buffer = new byte[lengthInBytes];
}
/**
* Constructs a <code>SimpleSound</code> of the specified length.
* This sound will simply consist of an empty byte array, and an
* <code>AudioFileFormat</code> with the following values:
* <ul>
* <li><code>AudioFileFormat.Type.WAVE</code>
* <li>22.05K sampling rate
* <li>16 bit sample
* <li>1 channel
* <li>signed PCM encoding
* <li>small-endian byte order
* </ul>
* Note that no new sound file is created, we only represent the
* sound with a buffer and the AudioFileFormat. If a file is
* desired, then the method <code>writeToFile(String filename)
* </code> must be called on this newly created sound.
*
* @param numFrames the number of samples in the sound
* @see SimpleSound#write(String filename)
*/
public SimpleSound(int numFrames, int sampleRate)
{
int numChannels = 1; // the number of channels in the sound
int bytesPerSample = NUM_BITS_PER_SAMPLE / 8;
/*
Make a new sound with the default sampling rate, 16 bits,
1 channel(==1 sample/frame), signed, smallEndian
*/
AudioFormat audioFormat =
new AudioFormat(sampleRate, NUM_BITS_PER_SAMPLE,
numChannels, true, false);
/*
* The length in bytes is the number of channels
* times the number of frames and times the number of bytes per
* sample (2 bytes per sample)
*/
int lengthInFrames = numChannels * numFrames;
int lengthInBytes = lengthInFrames * bytesPerSample;
/*
Make a new WAV file format, with the AudioFormat described above
*/
audioFileFormat =
new AudioFileFormat(AudioFileFormat.Type.WAVE,
audioFormat, lengthInFrames);
// create the buffer
buffer = new byte[lengthInBytes];
}
/**
* Constructs a simple sound with the given sample size in bits and
* type of endian (big or little)
*/
public SimpleSound(int sampleSizeInBits, boolean isBigEndian)
{
// calculate the number of bytes in the sample
int numBytesInSample = sampleSizeInBits/8;
int numberOfChannels = 2;
boolean signedFlag = true;
// create the audio format
AudioFormat audioFormat =
new AudioFormat(SAMPLE_RATE, sampleSizeInBits,
numberOfChannels,
signedFlag, isBigEndian);
// compute the length of the byte array
int lengthInBytes =
SAMPLE_RATE*numberOfChannels*5*numBytesInSample;
// create the audio file format
audioFileFormat =
new AudioFileFormat(AudioFileFormat.Type.WAVE,
audioFormat,
lengthInBytes/
(numBytesInSample*numberOfChannels));
// create the buffer
buffer = new byte[lengthInBytes];
}
/**
* Constructs a new SimpleSound from the given file.
* @param fileName The File from which to create this sound.
* @see SimpleSound#loadFromFile(String filename)
*/
public SimpleSound(String fileName)
{
try {
// load the sound from the file
loadFromFile(fileName);
} catch (Exception ex) {
printError("Exception during load of file " + fileName);
}
}
/**
* Constructor that creates a new SimpleSound by copying a passed
* SimpleSound
* @param sound the sound to copy
*/
public SimpleSound(SimpleSound sound)
{
this.audioFileFormat = sound.audioFileFormat;
this.fileName = sound.fileName;
this.playbacks = new Vector<Playback>();
// copy the samples
if (sound.buffer != null)
{
this.buffer = new byte[sound.buffer.length];
for (int i = 0; i < sound.buffer.length; i++)
this.buffer[i] = sound.buffer[i];
}
}
///////////////////////// accessors ///////////////////////////
/**
* Method that returns the byte array representation of this
* simple sound.
* @return the sound represented as a byte array
*/
public byte[] getBuffer()
{
return buffer;
}
/**
* Method that returns the AudioFileFormat describing this
* simple sound.
* @return the AudioFileFormat describing this sound
* @see AudioFileFormat
*/
public AudioFileFormat getAudioFileFormat()
{
return audioFileFormat;
}
/**
* Method to get the sampling rate of this sound
* @return the sampling rate in number of samples per second
*/
public double getSamplingRate()
{
return audioFileFormat.getFormat().getSampleRate();
}
/**
* Method that returns the SoundExplorer
* @return the sound explorer
*/
public SoundExplorer getSoundExplorer()
{
return soundExplorer;
}
/**
* Method to return the byte array
* @return an array of bytes which represents the simple sound
* @see SimpleSound#getBuffer
*/
public byte[] asArray()
{
return getBuffer();
}
/**
* Method that returns the vector of playback threads currently
* active on this sound.
* @return the vector of playback threads for this simple sound
*/
public Vector getPlaybacks()
{
return playbacks;
}
/**
* Method that returns the name of the file this sound came from.
* If this sound did not originate with a file, this value will
* be null.
* @return the file name associated with this sound or null
* @see #loadFromFile(String fileName)
*/
public String getFileName()
{
return fileName;
}
/**
* Method to get the value of the debug flag
* @return true if in debug mode else false
*/
public boolean getDEBUG()
{
return DEBUG;
}
////////////////////////////// modifiers ////////////////////////
/**
* Changes the byte array that represents this sound.
* @param newBuffer a byte array representation of the new sound we
* want this to represent.
*/
public void setBuffer(byte[] newBuffer)
{
buffer = newBuffer;
}
/**
* Changes the AudioFileFormat of this sound.
* @param newAudioFileFormat the new audioFileFormat that describes
* this sound.
* @see AudioFileFormat
*/
public void setAudioFileFormat(AudioFileFormat newAudioFileFormat)
{
audioFileFormat = newAudioFileFormat;
}
/**
* Changes the explorer of this object.
* @param soundExplorer the new SoundExplorer to use
* @see SoundExplorer
*/
public void setSoundExplorer(SoundExplorer soundExplorer)
{
this.soundExplorer = soundExplorer;
}
///////////////////////// methods /////////////////////////////
/**
* Creates an <code>AudioInputStream</code> for this sound from the
* <code>buffer</code> and the <code>audioFileFormat</code>.
* @return an AudioInputStream representing this sound.
* @see AudioInputStream
*/
public AudioInputStream makeAIS()
{
AudioFileFormat.Type fileType = audioFileFormat.getType();
ByteArrayInputStream bais = new ByteArrayInputStream(buffer);
int frameSize = audioFileFormat.getFormat().getFrameSize();
AudioInputStream audioInputStream =
new AudioInputStream(bais, audioFileFormat.getFormat(),
buffer.length/frameSize);
return audioInputStream;
}
/**
* Invokes <code>printError(message, null)</code>
*
* @see SimpleSound#printError(String message, Exception e)
* @throws SoundException Will throw under every circumstance.
* This way we can catch the exception
* in JES.
*/
public void printError(String message) //throws SoundException
{
printError(message, null);
}
/**
* Prints the given String to the "standard" error output stream, then
* prints a stack trace on the exception, and then exits the program. If
* the String is null, then nothing happens, the method just returns. If
* the Exception is null, then it prints the String and then exits the
* program.
*
* @param message A description of the error
* @param e The exception, if any, that was caught regarding the error
* @throws SoundException Will throw under every circumstance.
* This way we can catch the exception
* in JES.
*/
public void printError(String message, Exception e) //throws SoundException
{
if(message != null)
{
SimpleOutput.showError(message);
System.err.println(message);
if(e != null)
{
e.printStackTrace();
}
//so we can catch the error
//throw(new SoundException(message));
}
}
/**
* Method to check if a sound is stereo (2 channels) or not
* @return true if in stereo else false
*/
public boolean isStereo()
{
if(audioFileFormat.getFormat().getChannels() == 1)
return false;
else
return true;
}
////////////////////////// File I/O ///////////////////////////////////
/**
* Method to write this sound to a file
* @param fileName the name of the file to write to
*/
public void write(String fileName)
{
try {
writeToFile(fileName);
}
catch (SoundException ex) {
printError("Couldn't write file to " + fileName);
}
}
/**
* Creates an audioInputStream from this sound, and then writes
* this stream out to the file with the specified name. If no
* file exists, one is created. If a file already exists, then it
* is overwritten. This does not check the extension of the
* fileName passed in to make sure it agrees with the
* <code>AudioFileFormat.Type</code> of this sound.
*
* @param outFileName The name of the file to write this sound to
* @throws SoundException if any error is encountered while
* writing to the file.
*/
public void writeToFile(String outFileName)
throws SoundException
{
/*
get an audioInputStream that represents this sound.
then, we will write from the stream to the file
*/
AudioInputStream audioInputStream = makeAIS();
AudioFileFormat.Type type = audioFileFormat.getType();
try {
audioInputStream.reset();
}//try reset audioInputStream
catch(Exception e)
{
printError("Unable to reset the Audio stream. Please "+
"try again.", e);
}//catch
//get the file to write to
File file = new File(outFileName);
if(!file.exists())
{
//if the file doesn't exist, make one
try
{
file.createNewFile();
}//try
catch(IOException e)
{
printError("That file does not already exist, and"+
"there were problems creating a new file" +
"of that name. Are you sure the path" +
"to: " + outFileName + "exists?", e);
}//catch
}//if
//write to the file
try
{
if(AudioSystem.write(audioInputStream, type, file) == -1)
{
printError("Problems writing to file. Please " +
"try again.");
}
// if the write was successful then set the file name to the
// new name
else
{
this.fileName = outFileName;
}
}//try
catch(FileNotFoundException e)
{
printError("The file you specified did not already exist " +
"so we tried to create a new one, but were unable"+
"to do so. Please try again. If problems "+
"persit see your TA.", e);
}
catch(Exception e)
{
printError("Problems writing to file: " + outFileName, e);
}//catch
//close the input stream, we're done writing
try
{
audioInputStream.close();
}//try
catch(Exception e)
{
printError("Unable to close the Audio stream.");
}//catch
}//writeToFile(String outFileName)
/**
* Resets the fields of this sound so that it now represents the
* sound in the specified file. If successful, the fileName
* ariable is updated such that it is equivalent to
* <code>inFileName</code>.
*
* @param inFileName the path and filename of the sound we want to
* represent.
* @throws SoundException if any problem is encountered while
* reading in from the file.
*/
public void loadFromFile(String inFileName) throws SoundException
{
// try to prevent a null pointer exception
if(inFileName == null)
{
printError("You must pass in a valid file name. Please try" +
"again.");
}
/* get the File object representing the file named inFileName
* and make sure it exists */
File file = new File(inFileName);
if(!file.exists())
{
// try adding the media path
file = new File(FileChooser.getMediaPath(inFileName));
if (!file.exists())
printError("The file: " + inFileName + " doesn't exist");
}
// create an audioInputStream from this file
AudioInputStream audioInputStream;
try {
audioInputStream = AudioSystem.getAudioInputStream(file);
} catch(Exception e) {
printError("Unable to read from file " +
inFileName + ". The file type is unsupported. " +
"Are you sure you're using a WAV, AU, or " +
"AIFF file (some .wav files are encoded " +
"using mp3)? Try using SimpleSound.convert(" +
"String oldName, String newName) and then " +
"try to read the new name.", e);
return;
}//catch
/* We need to make an array representing this sound, so the
* number of bytes we will be storing cannot be greater than
* Integer.MAX_VALUE. The JavaSound API also supports only
* integer length frame lengths.
* (See AudioFileFormat.getFrameLength(). I don't know why
* this is inconsistent with AudioInputStream.getFrameLength().)
*/
if((audioInputStream.getFrameLength() *
audioInputStream.getFormat().getFrameSize()) >
Integer.MAX_VALUE)
{
printError("The sound in file: " + inFileName +
" is too long."+
" Try using a shorter sound.");
}
int bufferSize = (int)audioInputStream.getFrameLength() *
audioInputStream.getFormat().getFrameSize();
buffer = new byte[bufferSize];
int numBytesRead = 0;
int offset = 0;
//read all the bytes into the buffer
while(true)
{
try {
numBytesRead =
audioInputStream.read(buffer, offset, bufferSize);
if(numBytesRead == -1)//no more data
break;
else
offset += numBytesRead;
} catch(Exception e) {
printError("Problems reading the input stream. "+
"You might want to try again using this "+
" file: " + inFileName + "or a different"+
" file. If problems persist, ask your TA."
, e);
}//catch
}//while
/* set the format of the file, assuming that the extension
* is correct
*/
if(inFileName.toLowerCase().endsWith(".wav"))
{
audioFileFormat =
new AudioFileFormat(AudioFileFormat.Type.WAVE,
audioInputStream.getFormat(),
(int)audioInputStream.getFrameLength());
}
else if(inFileName.toLowerCase().endsWith(".au"))
{
audioFileFormat =
new AudioFileFormat(AudioFileFormat.Type.AU,
audioInputStream.getFormat(),
(int)audioInputStream.getFrameLength());
}
else if (inFileName.toLowerCase().endsWith(".aif")||
inFileName.toLowerCase().endsWith(".aiff"))
{
audioFileFormat =
new AudioFileFormat(AudioFileFormat.Type.AIFF,
audioInputStream.getFormat(),
(int)audioInputStream.getFrameLength());
}
else
{
printError("Unsupported file type. Please try again with a "+
"file that ends in .wav, .au, .aif, or .aiff");
}
if(DEBUG)
{
System.out.println("New sound created from file: " + fileName);
System.out.println("\tendianness: " +
audioInputStream.getFormat().isBigEndian());
System.out.println("\tencoding: " +
audioInputStream.getFormat().getEncoding());
}
this.fileName = inFileName;
}//loadFromFile(String inFileName)
//////////////////////// Methods for playing the sound //////////
/**
* Creates a new Playback thread and starts it. The thread is
* guarranteed to finish playing the sound as long as the program
* doesn't exit before it is done. This method does not block,
* however. So, if you invoke <code>play()</code> multiple times
* in a row, sounds will simply play on
* top of eachother - "accidental mixing"
*
* @see Playback
*/
public void play()
{
// create the thread, add it to the Vector, and start it
Playback playback = new Playback(this);
playbacks.add(playback);
playback.start();
}
/**
* Creates a new Playback thread, starts it, then waits for the
* entire sound to finish playing before it returns. This method
* is guarranteed to play the entire sound, and does not allow for
* any "accidental mixing"
*
* @see Playback
*/
public void blockingPlayOld()
{
/* create the thread, add it to the Vector, start it, and wait
until its done playing to return */
Playback playback = new Playback(this);
playbacks.add(playback);
playback.start();
//wait until the sound is done playing
while(playback.isAlive()){;}
}
/**
* Plays the sound, then sleeps for how
* long the sound SHOULD last.
**/
public void blockingPlay()
{
this.play();
try {
double timeToSleep =
1000 *
(this.getLength()/this.getSamplingRate());
Thread.sleep((int) timeToSleep);
} catch (Exception ex) {
System.out.println("Exception occurred: "+ex);
}
}
/**
* Checks the value of durInFrames to make sure that it is not
* larger than Integer.MAX_VALUE to guarrantee safe casting.
* Also checks the value of rate to make sure that it is not
* larger than Float.MAX_VALUE before casting.
*
* @param rate a double representing the change in sampleRate
* (==frameRate) for playing back this sound
* @param durInFrames a double representing how much of this
* sound we want to play.
* @see SimpleSound#playAtRateInRange(float rate,
* int startFrame,
* int endFrame,
* boolean isBlocking)
* @throws SoundException if there are problems playing the sound.
*/
public void playAtRateDur(double rate, double durInFrames)
throws SoundException
{
if(durInFrames > getLengthInFrames())
{
printError("The given duration in frames, " + durInFrames +
" is out of the playable range. Try something " +
"between 1 and " + getLengthInFrames());
}
if(rate > Float.MAX_VALUE)
{
printError("The new sample rate, " + rate + "is out of the " +
"playable range. Try something between " +
"0 and " + Float.MAX_VALUE);
}
playAtRateInRange((float)rate, 0, (int)durInFrames-1, false);
}
/**
* First, checks the value of durInFrames to make sure that it is
* not larger than Integer.MAX_VALUE to guarrantee safe casting.
* Simmilarly, checks the value of rate to make sure that it is
* not larger than FLoat.MAX_VALUE before casting.
*
* @param rate a double representing the change in sampleRate
* (==frameRate) for playing back this sound
* @param durInFrames a double representing how much of this sound
* we want to play
* @see SimpleSound#playAtRateInRange(float range,
* int startFrame,
* int endFrame,
* boolean isBlocking)
* @throws SoundException if there are problems playing the sound.
*/
public void blockingPlayAtRateDur(double rate, double durInFrames)
throws SoundException
{
if(durInFrames > getLengthInFrames())
{
printError("The given duration in frames, " + durInFrames +
" is out of the playable range. Try something " +
"between 1 and " + getLengthInFrames());
}
if(rate > Float.MAX_VALUE)
{
printError("The new sample rate, " + rate + "is out of the " +
"playable range. Try something between " +
"0 and " + Float.MAX_VALUE);
}
playAtRateInRange((float)rate, 0, (int)durInFrames-1, true);
}
/**
* Calls <code>playAtRateInRange(rate, startFrame, endFrame,
* false) </code>.
*
* @param rate a float representing the change in sampleRate
* (==frameRate) for playing back this sound
* @param startFrame an int representing the frame at which we
* want to begin playing the sound
* @param endFrame an int representing the frame at which want
* to stop playing the sound
* @see SimpleSound#playAtRateInRange(float range,
* int startFrame,
* int endFrame,
* boolean isBlocking)
* @throws SoundException if there are problems playing the sound.
*/
public void playAtRateInRange(float rate, int startFrame,
int endFrame)
throws SoundException
{
playAtRateInRange(rate, startFrame, endFrame, false);
}
/**
* Calls <code>playAtRateInRange(rate, startFrame, endFrame, true)
* </code>.
*
* @param rate a float representing the change in sampleRate
* (==frameRate) for playing back this sound
* @param startFrame an int representing the frame at which we want
* to begin playing the sound
* @param endFrame an int representing the frame at which want
* to stop playing the sound
* @see SimpleSound#playAtRateInRange(float range,
* int startFrame,
* int endFrame,
* boolean isBlocking)
* @throws SoundException if there are problems playing the sound.
*/
public void blockingPlayAtRateInRange(float rate, int startFrame,
int endFrame)
throws SoundException
{
playAtRateInRange(rate, startFrame, endFrame, true);
}
/**
* Plays the specified segment of this sound at the given sample
* rate. Then it saves the old fields (buffer and audioFileFormat)
* of this sound into temporary variables, and setting the fields
* of this sound to modified values. Then it creates a Playback
* thread on this sound (with the modified values) and starts the
* thread. The values for buffer and audioFileFormat are restored
* to their original values before the method returns.
*
* @param rate The change in the sampleRate (==frameRate) for
* playing back this sound. The old SampleRate is multiplied by
* this value. So, if rate = 2, the sound will play twice as fast
* (half the length), and if rate = .5, the sound will play half as
* fast (twice the length).
* @param startFrame The index of the frame where we want to begin
* play
* @param endFrame The index of the frame where we want to end play
* @param isBlocking If true, this method waits until the thread is
* done playing the sound before returning. If false, it
* simply starts the thread and then returns.
* @throws SoundException if there are any problems playing the
* sound.
*/
public void playAtRateInRange(float rate, int startFrame,
int endFrame, boolean isBlocking)
throws SoundException
{
/*before we get started, lets try to check for some obvious
* errors. maybe we can avoid some of those pesky array out of
* bounds exceptions.
*/
if(endFrame >= getAudioFileFormat().getFrameLength())
{
printError("You are trying to play to index: " + (endFrame+1) +
". The sound only has " +
getAudioFileFormat().getFrameLength() +
" samples total.");
}
if(startFrame < 0)
{
printError("You cannot start playing at index " +
(startFrame+1) +
". Choose 1 to start at the begining.");
}
if(endFrame < startFrame)
{
printError("You cannot start playing at index " +
(startFrame+1) + " and stop playing at index " +
(endFrame+1) + ". The start index must be before" +
"the stop index.");
}
/*
we want to save the current buffer and audioFileFormat
so we can return to them when we're finished.
*/
byte[] oldBuffer = buffer;
AudioFileFormat oldAFF = getAudioFileFormat();
//just to make the code easier to read
int frameSize = getAudioFileFormat().getFormat().getFrameSize();
int durInFrames = (endFrame - startFrame) + 1;
if(DEBUG)
System.out.println("\tnew durInFrames = " + durInFrames);
//we want to make a new buffer, only as long as we need
int newBufferSize = durInFrames * frameSize;
byte[] newBuffer = new byte[newBufferSize];
for(int i = 0; i < newBufferSize; i++)
{
newBuffer[i] = oldBuffer[(startFrame*frameSize) + i];
}
//now we want to make a new audioFormat with the same information
//except a different rate
AudioFormat newAF =
new AudioFormat(oldAFF.getFormat().getEncoding(),
oldAFF.getFormat().getSampleRate() * rate,
oldAFF.getFormat().getSampleSizeInBits(),
oldAFF.getFormat().getChannels(),
oldAFF.getFormat().getFrameSize(),
oldAFF.getFormat().getFrameRate() * rate,
oldAFF.getFormat().isBigEndian());
//now put that new AudioFormat into a new AudioFileFormat with
//the changed duration in frames
AudioFileFormat newAFF =
new AudioFileFormat(oldAFF.getType(), newAF, durInFrames);
/*
change the values in this Sound
*/
setBuffer(newBuffer);
setAudioFileFormat(newAFF);
if(DEBUG)
{
System.out.println("playAtRateInRange(" + rate + ", " +
startFrame + ", " + endFrame + ", " +
isBlocking + ")");
System.out.println("\t(length of sound = " +
getAudioFileFormat().getFrameLength() + ")");
}
/*
play the modified sound
*/
Playback playback = new Playback(this);
playbacks.add(playback);
playback.start();
if(isBlocking)
while(playback.isAlive()){;}//wait until the thread exits
/*
we need to wait until the thread is done with the values
before we change them back. The playing flag is set to false
until the loop begins in which data is actually written out.
see Playback#run()
*/
while(!playback.getPlaying()){;}
setBuffer(oldBuffer);//restore the buffer
setAudioFileFormat(oldAFF);//restore the file format
}
/**
* Deletes the specified playback object from the Vector. This
* should only be called from within the run() method of an
* individual playback thread.
*
* @see Playback#run()
*/
public void removePlayback(Playback playbackToRemove)
{
if(playbacks.contains(playbackToRemove))
{
playbacks.remove(playbackToRemove);
playbackToRemove = null;
}
}
////////////////////// getting sound information /////////////////
/**
* Returns an array containing all of the bytes in the specified
* frame.
*
* @param frameNum the index of the frame to access
* @return the array containing all of the bytes in frame
* <code>frameNum</code>
* @throws SoundException if the frame number is invalid.
*/
public byte[] getFrame(int frameNum) throws SoundException
{
if(frameNum >= getAudioFileFormat().getFrameLength())
{
printError("That index "+ (frameNum) +", does not exist. "+
"The last valid index is "+
(getAudioFileFormat().getFrameLength() -1));
}
int frameSize = getAudioFileFormat().getFormat().getFrameSize();
byte[] theFrame = new byte[frameSize];
for (int i = 0; i < frameSize; i++)
{
theFrame[i] = buffer[frameNum*frameSize+i];
}
return theFrame;
}
/**
* Obtains the length of the audio data contained in the file,
* expressed in sample frames.
*
* @return the number of sample frames of audio data in the file
*/
public int getLengthInFrames()
{
return getAudioFileFormat().getFrameLength();
}
/**
* Returns the number of samples in this sound
* @return the number of sample frames
*/
public int getNumSamples()
{
return getAudioFileFormat().getFrameLength();
}
/**
* Method to create and return a SoundSample object for the given
* frame number
* @return a SoundSample object for this frame number
*/
public SoundSample getSample(int frameNum)
{
return new SoundSample(this,frameNum);
}
/**
* Method to create and return an array of SoundSample objects
* @return the array of SoundSample objects
*/
public SoundSample[] getSamples()
{
int numSamples = getLengthInFrames();
SoundSample[] samples = new SoundSample[numSamples];
for (int i=0; i < numSamples; i++)
samples[i] = new SoundSample(this,i);
return samples;
}
/**
* Method to report an index exception for this sound
*/
private void reportIndexException(int index, Exception ex)
{
System.out.println("The index " + index +
" isn't valid for this sound");
}
/**
* Method to get the sample at the passed index and handle
* any SoundExceptions
* @param index the desired index
* @return the sample value
*/
public int getSampleValueAt(int index)
{
int value = 0;
try {
value = getSampleValue(index);
} catch (Exception ex) {
reportIndexException(index, ex);
}
return value;
}
/**
* If this is a mono sound, obtains the single sample contained
* within this frame, else obtains the first (left) sample
* contained in the specified frame.
*
* @param frameNum the index of the frame to access
* @return an integer representation of the bytes contained within
* the specified frame
* @throws SoundException if the frame number is invalid.
*/
public int getSampleValue(int frameNum) throws SoundException
{
//Before we get started, lets make sure that frame exists
if(frameNum >= getAudioFileFormat().getFrameLength())
{
printError("You are trying to access the sample at index: "
+ (frameNum) + ", but the last valid index is at " +
(getAudioFileFormat().getFrameLength() - 1));
}
else if(frameNum < 0)
{
printError("You asked for the sample at index: " + (frameNum) +
". This number is less than zero. Please try" +
"again using an index in the range [0," +
(getAudioFileFormat().getFrameLength() - 1) +"]");
}
AudioFormat format = getAudioFileFormat().getFormat();
int sampleSizeInBits = format.getSampleSizeInBits();
boolean isBigEndian = format.isBigEndian();
byte[] theFrame = getFrame(frameNum);
if(format.getEncoding().equals(AudioFormat.Encoding.PCM_SIGNED))
{
//since we're always returning the left sample,
//we don't care if we're mono or stereo, left is
//always first in the frame
if(sampleSizeInBits == 8)//8 bits == 1 byte
return theFrame[0];
else if(sampleSizeInBits == 16)
return TConversionTool.bytesToInt16(theFrame, 0,
isBigEndian);
else if(sampleSizeInBits == 24)
return TConversionTool.bytesToInt24(theFrame, 0,
isBigEndian);
else if(sampleSizeInBits == 32)
return TConversionTool.bytesToInt32(theFrame, 0,
isBigEndian);
else
{
printError("Unsupported audio encoding. The sample "+
"size is not recognized as a standard "+
"format.");
return -1;
}
}
else if(format.getEncoding().equals(AudioFormat.Encoding.PCM_UNSIGNED))
{
if(sampleSizeInBits == 8)
return TConversionTool.unsignedByteToInt(theFrame[0])-
(int)Math.pow(2,7);
else if(sampleSizeInBits == 16)
return TConversionTool.unsignedByteToInt16(theFrame, 0,
isBigEndian)-
(int)Math.pow(2, 15);
else if(sampleSizeInBits == 24)
return TConversionTool.unsignedByteToInt24(theFrame, 0,
isBigEndian)-
(int)Math.pow(2, 23);
else if(sampleSizeInBits == 32)
return TConversionTool.unsignedByteToInt32(theFrame, 0,
isBigEndian)-
(int)Math.pow(2, 31);
else
{
printError("Unsupported audio encoding. The sample "+
"size is not recognized as a standard "+
"format.");
return -1;
}
}
else if(format.getEncoding().equals(AudioFormat.Encoding.ALAW))
{
return TConversionTool.alaw2linear(buffer[0]);
}
else if(format.getEncoding().equals(AudioFormat.Encoding.ULAW))
{
return TConversionTool.ulaw2linear(buffer[0]);
}
else
{
printError("unsupported audio encoding: " +
format.getEncoding() + ". Currently only PCM, " +
"ALAW and ULAW are supported. Please try again" +
"with a different file.");
return -1;
}
}//getSample(int)
/**
* Obtains the left sample of the audio data contained at the specified
* frame.
*
* @param frameNum the index of the frame to access
* @return an int representation of the bytes contained in the specified
* frame.
* @throws SoundException if the frameNumber is invalid
*/
public int getLeftSample(int frameNum) throws SoundException
{
//default is to getLeftSample
return getSampleValue(frameNum);
}
/**
* Obtains the right sample of the audio data contained at the specified
* frame.
*
* @param frameNum the index of the frame to access
* @return an int representation of the bytes contained in the specified
* frame.
* @throws SoundException if the frameNumber is invalid, or
* the encoding isn't supported.
*/
public int getRightSample(int frameNum) throws SoundException
{
//Before we get started, lets make sure that frame exists
if(frameNum >= getAudioFileFormat().getFrameLength())
{
printError("You are trying to access the sample at index: "
+ (frameNum) + ", but the last valid index is at " +
(getAudioFileFormat().getFrameLength() - 1));
}
else if(frameNum < 0)
{
printError("You asked for the sample at index: "+(frameNum+1) +
". This number is less than zero. Please try" +
" again using an index in the range [0," +
(getAudioFileFormat().getFrameLength()-1) + "].");
}
AudioFormat format = getAudioFileFormat().getFormat();
int channels;
if((channels = format.getChannels())==1)
{
printError("Only stereo sounds have different right and left" +
" samples. You are using a mono sound, try " +
"getSample("+(frameNum)+") instead");
return -1;
}
int sampleSizeInBits = format.getSampleSizeInBits();
boolean isBigEndian = format.isBigEndian();
byte[] theFrame = getFrame(frameNum);
if(format.getEncoding().equals(AudioFormat.Encoding.PCM_SIGNED))
{
if(sampleSizeInBits == 8)//8 bits == 1 byte
return theFrame[1];
else if(sampleSizeInBits == 16)
return TConversionTool.bytesToInt16(theFrame, 2, isBigEndian);
else if(sampleSizeInBits == 24)
return TConversionTool.bytesToInt24(theFrame, 3, isBigEndian);
else if(sampleSizeInBits == 32)
return TConversionTool.bytesToInt32(theFrame, 4, isBigEndian);
else
{
printError("Unsupported audio encoding. The sample"+
" size is not recognized as a standard"+
" format.");
return -1;
}
}
else if(format.getEncoding().equals(AudioFormat.Encoding.PCM_UNSIGNED))
{
if(sampleSizeInBits == 8)
return TConversionTool.unsignedByteToInt(theFrame[1]);
else if(sampleSizeInBits == 16)
return TConversionTool.unsignedByteToInt16(theFrame, 2, isBigEndian);
else if(sampleSizeInBits == 24)
return TConversionTool.unsignedByteToInt24(theFrame, 3, isBigEndian);
else if(sampleSizeInBits == 32)
return TConversionTool.unsignedByteToInt32(theFrame, 4, isBigEndian);
else
{
printError("Unsupported audio encoding. The sample"+
" size is not recognized as a standard" +
" format.");
return -1;
}
}
else if(format.getEncoding().equals(AudioFormat.Encoding.ALAW))
{
return TConversionTool.alaw2linear(buffer[1]);
}
else if(format.getEncoding().equals(AudioFormat.Encoding.ULAW))
{
return TConversionTool.ulaw2linear(buffer[1]);
}
else
{
printError("unsupported audio encoding: " +
format.getEncoding() + ". Currently only PCM, " +
"ALAW and ULAW are supported. Please try again" +
"with a different file.");
return -1;
}
}
/**
* Obtains the length of this sound in bytes. Note, that this number is not
* neccessarily the same as the length of this sound's file in bytes.
*
* @return the sound length in bytes
*/
public int getLengthInBytes()
{
return buffer.length;
}
/**
* Method to return the length of the sound as the number of samples
* @return the length of the sound as the number of samples
*/
public int getLength()
{
return getNumSamples();
}
/**
* Obtains the number of channels of this sound.
*
* @return the number of channels (1 for mono, 2 for stereo), or
* <code>AudioSystem.NOT_SPECIFIED</code>
* @see AudioSystem#NOT_SPECIFIED
*/
public int getChannels()
{
return getAudioFileFormat().getFormat().getChannels();
}
/**************************************************************************/
/************************** CHANGING THE SOUND ****************************/
/**************************************************************************/
/**
* Changes the value of each byte of the specified frame.
*
* @param frameNum the index of the frame to change
* @param theFrame the byte array that will be copied into this sound's
* buffer in place of the specified frame.
*@throws SoundException if the frameNumber is invalid.
*/
public void setFrame(int frameNum, byte[] theFrame) throws SoundException
{
if(frameNum >= getAudioFileFormat().getFrameLength())
{
printError("That frame, number "+frameNum+", does not exist. "+
"The last valid frame number is " +
(getAudioFileFormat().getFrameLength() - 1));
}
int frameSize = getAudioFileFormat().getFormat().getFrameSize();
if(frameSize != theFrame.length)
printError("Frame size doesn't match, line 383. This should" +
" never happen. Please report the problem to a TA.");
for(int i = 0; i < frameSize; i++)
{
buffer[frameNum*frameSize+i] = theFrame[i];
}
}
/**
* Method to set the sample value at the passed index to the passed value
* @param index the index
* @param value the new value
*/
public void setSampleValueAt(int index, int value)
{
try {
setSampleValue(index,value);
} catch (Exception ex) {
reportIndexException(index,ex);
}
}
/**
* Changes the value of the sample found at the specified frame. If this
* sound has more than one channel, then this defaults to setting only the
* first (left) sample.
*
* @param frameNum the index of the frame where the sample should be changed
* @param sample an int representation of the new sample to put in this
* sound's buffer at the specified frame
* @throws SoundException if the frameNumber is invalid, or
* another problem is encountered
*/
public void setSampleValue(int frameNum, int sample) throws SoundException
{
AudioFormat format = getAudioFileFormat().getFormat();
int sampleSizeInBits = format.getSampleSizeInBits();
boolean isBigEndian = format.isBigEndian();
byte[] theFrame = getFrame(frameNum);
if(format.getEncoding().equals(AudioFormat.Encoding.PCM_SIGNED))
{
if(sampleSizeInBits == 8)//8 bits = 1 byte = first cell in array
{
theFrame[0] = (byte)sample;
setFrame(frameNum, theFrame);
}
else if(sampleSizeInBits == 16)//2 bytes, first 2 cells in array
{
TConversionTool.intToBytes16(sample, theFrame, 0, isBigEndian);
setFrame(frameNum, theFrame);
}
else if(sampleSizeInBits == 24)
{
TConversionTool.intToBytes24(sample, theFrame, 0, isBigEndian);
setFrame(frameNum, theFrame);
}
else if(sampleSizeInBits == 32)
{
TConversionTool.intToBytes32(sample, theFrame, 0, isBigEndian);
setFrame(frameNum, theFrame);
}
else
{
printError("Unsupported audio encoding. The sample"+
"size is not recognized as a standard format");
}
}//if format == PCM_SIGNED
else if(format.getEncoding().equals(AudioFormat.Encoding.PCM_UNSIGNED))
{
if(sampleSizeInBits == 8)
{
theFrame[0] = TConversionTool.intToUnsignedByte(sample);
setFrame(frameNum, theFrame);
}
else if(sampleSizeInBits == 16)
{
TConversionTool.intToUnsignedBytes16(sample, theFrame, 0, isBigEndian);
setFrame(frameNum, theFrame);
}
else if(sampleSizeInBits == 24)
{
TConversionTool.intToUnsignedBytes24(sample, theFrame, 0, isBigEndian);
setFrame(frameNum, theFrame);
}
else if(sampleSizeInBits == 32)
{
TConversionTool.intToUnsignedBytes32(sample, theFrame, 0, isBigEndian);
setFrame(frameNum, theFrame);
}
else
{
printError("Unsupported audio encoding. The sample"+
" size is not recognized as a standard "+
"format.");
}
}
else if(format.getEncoding().equals(AudioFormat.Encoding.ALAW))
{
if((sample>Short.MAX_VALUE)||(sample<Short.MIN_VALUE))
printError("You are trying to set the sample value to: "+
sample + ", but the maximum value for a sample"+
" in this format is: "+Short.MAX_VALUE+
", and the minimum value is: "+Short.MIN_VALUE+
". Please choose a value in that range.");
theFrame[0] = TConversionTool.linear2alaw((short)sample);
setFrame(frameNum, theFrame);
}
else if(format.getEncoding().equals(AudioFormat.Encoding.ULAW))
{
if((sample>Short.MAX_VALUE)||(sample<Short.MIN_VALUE))
printError("You are trying to set the sample value to: "+
sample + ", but the maximum value for a sample"+
" in this format is: "+Short.MAX_VALUE+
", and the minimum value is: "+Short.MIN_VALUE+
". Please choose a value in that range.");
theFrame[0] = TConversionTool.linear2ulaw((short)sample);
setFrame(frameNum, theFrame);
}
else
{
printError("unsupported audio encoding: " +
format.getEncoding() + ". Currently only PCM, " +
"ALAW and ULAW are supported. Please try again" +
"with a different file.");
}
}//setSample(int, int)
public void setLeftSample(int frameNum, int sample) throws SoundException
{
setSampleValue(frameNum, sample);
}
public void setRightSample(int frameNum, int sample)
throws SoundException
{
AudioFormat format = getAudioFileFormat().getFormat();
int sampleSizeInBits = format.getSampleSizeInBits();
boolean isBigEndian = format.isBigEndian();
if(format.getChannels() == 1)
printError("this is a mono sound. only stereo sounds have" +
" different left and right samples.");
byte[] theFrame = getFrame(frameNum);
if(format.getEncoding().equals(AudioFormat.Encoding.PCM_SIGNED))
{
//right will always be the second in the frame
if(sampleSizeInBits == 8)
{
theFrame[1] = (byte)sample;
setFrame(frameNum, theFrame);
}
else if(sampleSizeInBits == 16)
{
TConversionTool.intToBytes16(sample, theFrame, 2, isBigEndian);
setFrame(frameNum, theFrame);
}
else if(sampleSizeInBits == 24)
{
TConversionTool.intToBytes24(sample, theFrame, 3, isBigEndian);
setFrame(frameNum, theFrame);
}
else if(sampleSizeInBits == 32)
{
TConversionTool.intToBytes32(sample, theFrame, 4, isBigEndian);
setFrame(frameNum, theFrame);
}
else
{
printError("Unsupported audio encoding. The sample"+
"size is not recognized as a standard format");
}
}//if format == PCM_SIGNED
else if(format.getEncoding().equals(AudioFormat.Encoding.PCM_UNSIGNED))
{
if(sampleSizeInBits == 8)
{
theFrame[1] = TConversionTool.intToUnsignedByte(sample);
setFrame(frameNum, theFrame);
}
else if(sampleSizeInBits == 16)
{
TConversionTool.intToUnsignedBytes16(sample, theFrame, 2, isBigEndian);
setFrame(frameNum, theFrame);
}
else if(sampleSizeInBits == 24)
{
TConversionTool.intToUnsignedBytes24(sample, theFrame, 3, isBigEndian);
setFrame(frameNum, theFrame);
}
else if(sampleSizeInBits == 32)
{
TConversionTool.intToUnsignedBytes32(sample, theFrame, 4, isBigEndian);
setFrame(frameNum, theFrame);
}
else
{
printError("Unsupported audio encoding. The sample"+
" size is not recognized as a standard"+
" format");
}
}
else if(format.getEncoding().equals(AudioFormat.Encoding.ALAW))
{
if((sample>Short.MAX_VALUE)||(sample<Short.MIN_VALUE))
printError("You are trying to set the sample value to: "+
sample + ", but the maximum value for a sample"+
" in this format is: "+Short.MAX_VALUE+
", and the minimum value is: "+Short.MIN_VALUE+
". Please choose a value in that range.");
theFrame[1] = TConversionTool.linear2alaw((short)sample);
setFrame(frameNum, theFrame);
}
else if(format.getEncoding().equals(AudioFormat.Encoding.ULAW))
{
if((sample>Short.MAX_VALUE)||(sample<Short.MIN_VALUE))
printError("You are trying to set the sample value to: "+
sample + ", but the maximum value for a sample"+
" in this format is: "+Short.MAX_VALUE+
", and the minimum value is: "+Short.MIN_VALUE+
". Please choose a value in that range.");
theFrame[1] = TConversionTool.linear2ulaw((short)sample);
setFrame(frameNum, theFrame);
}
else
{
printError("unsupported audio encoding: " +
format.getEncoding() + ". Currently only PCM, " +
"ALAW and ULAW are supported. Please try again" +
"with a different file.");
}
}//setRightSample(int, int)
/**
* Method to open a sound viewer on a copy of this sound
*/
public void explore()
{
SimpleSound sound = new SimpleSound(this);
new SoundExplorer(sound,this.isStereo());
}
/**
* Method to play a note using MIDI
* @param key the piano key to play
* @param duration how long to play the note
* @param intensity how hard to strike the note from (0-127)
*/
public static void playNote(int key, int duration, int intensity)
{
}
/**
* Method to convert a mp3 sound into a wav sound
* @param mp3File
* @param wavFile
*/
public static void convert(String mp3File, String wavFile)
{
try {
Converter converter = new Converter();
converter.convert(mp3File,wavFile);
} catch (Exception ex) {
SimpleOutput.showError("Couldn't covert the file " + mp3File);
}
}
////////////////////// String methods ///////////////////////////////
/**
* Obtains a string representation of this JavaSound.
* @return a String representation of this JavaSound.
*/
public String toString()
{
String output = "SimpleSound";
// if there is a file name then add that to the output
if (fileName != null)
output = output + " file: " + fileName;
// add the length
output = output + " length: " + getLengthInBytes();
return output;
}
} // end of SimpleSound class
package edu.gatech.mediacomp;
import javax.swing.*;
import java.awt.*;
import java.awt.font.*;
import java.awt.geom.*;
import java.util.Observer;
import java.util.Random;
/**
* Class that represents a Logo-style turtle. The turtle
* starts off facing north.
* A turtle can have a name, has a starting x and y position,
* has a heading, has a width, has a height, has a visible
* flag, has a body color, can have a shell color, and has a pen.
* The turtle will not go beyond the model display or picture
* boundaries.
*
* You can display this turtle in either a picture or in
* a class that implements ModelDisplay.
*
* Copyright Georgia Institute of Technology 2004
* @author Barb Ericson ericson@cc.gatech.edu
*/
public class SimpleTurtle
{
///////////////// fields ////////////////////////
/** count of the number of turtles created */
private static int numTurtles = 0;
/** array of colors to use for the turtles */
private static Color[] colorArray = { Color.green, Color.cyan, new Color(204,0,204), Color.gray};
/** who to notify about changes to this turtle */
private ModelDisplay modelDisplay = null;
/** picture to draw this turtle on */
private Picture picture = null;
/** width of turtle in pixels */
private int width = 15;
/** height of turtle in pixels */
private int height = 18;
/** current location in x (center) */
private int xPos = 0;
/** current location in y (center) */
private int yPos = 0;
/** heading angle */
private double heading = 0; // default is facing north
/** pen to use for this turtle */
private Pen pen = new Pen();
/** color to draw the body in */
private Color bodyColor = null;
/** color to draw the shell in */
private Color shellColor = null;
/** color of information string */
private Color infoColor = Color.black;
/** flag to say if this turtle is visible */
private boolean visible = true;
/** flag to say if should show turtle info */
private boolean showInfo = false;
/** the name of this turtle */
private String name = "No name";
////////////////// constructors ///////////////////
/**
* Constructor that takes the x and y position for the
* turtle
* @param x the x pos
* @param y the y pos
*/
public SimpleTurtle(int x, int y)
{
xPos = x;
yPos = y;
bodyColor = colorArray[numTurtles % colorArray.length];
setPenColor(bodyColor);
numTurtles++;
}
/**
* Constructor that takes the x and y position and the
* model displayer
* @param x the x pos
* @param y the y pos
* @param display the model display
*/
public SimpleTurtle(int x, int y, ModelDisplay display)
{
this(x,y); // invoke constructor that takes x and y
modelDisplay = display;
display.addModel(this);
}
/**
* Constructor that takes a model display and adds
* a turtle in the middle of it
* @param display the model display
*/
public SimpleTurtle(ModelDisplay display)
{
// invoke constructor that takes x and y
this((int) (display.getWidth() / 2),
(int) (display.getHeight() / 2));
modelDisplay = display;
display.addModel(this);
}
/**
* Constructor that takes the x and y position and the
* picture to draw on
* @param x the x pos
* @param y the y pos
* @param picture the picture to draw on
*/
public SimpleTurtle(int x, int y, Picture picture)
{
this(x,y); // invoke constructor that takes x and y
this.picture = picture;
this.visible = false; // default is not to see the turtle
}
/**
* Constructor that takes the
* picture to draw on and will appear in the middle
* @param picture the picture to draw on
*/
public SimpleTurtle(Picture picture)
{
// invoke constructor that takes x and y
this((int) (picture.getWidth() / 2),
(int) (picture.getHeight() / 2));
this.picture = picture;
this.visible = false; // default is not to see the turtle
}
//////////////////// methods /////////////////////////
/**
* Get the distance from the passed x and y location
* @param x the x location
* @param y the y location
*/
public double getDistance(int x, int y)
{
int xDiff = x - xPos;
int yDiff = y - yPos;
return (Math.sqrt((xDiff * xDiff) + (yDiff * yDiff)));
}
/**
* Method to turn to face another simple turtle
*/
public void turnToFace(SimpleTurtle turtle)
{
turnToFace(turtle.xPos,turtle.yPos);
}
/**
* Method to turn towards the given x and y
* @param x the x to turn towards
* @param y the y to turn towards
*/
public void turnToFace(int x, int y)
{
double dx = x - this.xPos;
double dy = y - this.yPos;
double arcTan = 0.0;
double angle = 0.0;
// avoid a divide by 0
if (dx == 0)
{
// if below the current turtle
if (dy > 0)
heading = 180;
// if above the current turtle
else if (dy < 0)
heading = 0;
}
// dx isn't 0 so can divide by it
else
{
arcTan = Math.toDegrees(Math.atan(dy / dx));
if (dx < 0)
heading = arcTan - 90;
else
heading = arcTan + 90;
}
// notify the display that we need to repaint
updateDisplay();
}
/**
* Method to get the picture for this simple turtle
* @return the picture for this turtle (may be null)
*/
public Picture getPicture() { return this.picture; }
/**
* Method to set the picture for this simple turtle
* @param pict the picture to use
*/
public void setPicture(Picture pict) { this.picture = pict; }
/**
* Method to get the model display for this simple turtle
* @return the model display if there is one else null
*/
public ModelDisplay getModelDisplay() { return this.modelDisplay; }
/**
* Method to set the model display for this simple turtle
* @param theModelDisplay the model display to use
*/
public void setModelDisplay(ModelDisplay theModelDisplay)
{ this.modelDisplay = theModelDisplay; }
/**
* Method to get value of show info
* @return true if should show info, else false
*/
public boolean getShowInfo() { return this.showInfo; }
/**
* Method to show the turtle information string
* @param value the value to set showInfo to
*/
public void setShowInfo(boolean value) { this.showInfo = value; }
/**
* Method to get the shell color
* @return the shell color
*/
public Color getShellColor()
{
Color color = null;
if (this.shellColor == null && this.bodyColor != null)
color = bodyColor.darker();
else color = this.shellColor;
return color;
}
/**
* Method to set the shell color
* @param color the color to use
*/
public void setShellColor(Color color) { this.shellColor = color; }
/**
* Method to get the body color
* @return the body color
*/
public Color getBodyColor() { return this.bodyColor; }
/**
* Method to set the body color which
* will also set the pen color
* @param color the color to use
*/
public void setBodyColor(Color color)
{
this.bodyColor = color;
setPenColor(this.bodyColor);
}
/**
* Method to set the color of the turtle.
* This will set the body color
* @param color the color to use
*/
public void setColor(Color color) { this.setBodyColor(color); }
/**
* Method to get the information color
* @return the color of the information string
*/
public Color getInfoColor() { return this.infoColor; }
/**
* Method to set the information color
* @param color the new color to use
*/
public void setInfoColor(Color color) { this.infoColor = color; }
/**
* Method to return the width of this object
* @return the width in pixels
*/
public int getWidth() { return this.width; }
/**
* Method to return the height of this object
* @return the height in pixels
*/
public int getHeight() { return this.height; }
/**
* Method to set the width of this object
* @param theWidth in width in pixels
*/
public void setWidth(int theWidth) { this.width = theWidth; }
/**
* Method to set the height of this object
* @param theHeight the height in pixels
*/
public void setHeight(int theHeight) { this.height = theHeight; }
/**
* Method to get the current x position
* @return the x position (in pixels)
*/
public int getXPos() { return this.xPos; }
/**
* Method to get the current y position
* @return the y position (in pixels)
*/
public int getYPos() { return this.yPos; }
/**
* Method to get the pen
* @return the pen
*/
public Pen getPen() { return this.pen; }
/**
* Method to set the pen
* @param thePen the new pen to use
*/
public void setPen(Pen thePen) { this.pen = thePen; }
/**
* Method to check if the pen is down
* @return true if down else false
*/
public boolean isPenDown() { return this.pen.isPenDown(); }
/**
* Method to set the pen down boolean variable
* @param value the value to set it to
*/
public void setPenDown(boolean value) { this.pen.setPenDown(value); }
/**
* Method to lift the pen up
*/
public void penUp() { this.pen.setPenDown(false);}
/**
* Method to set the pen down
*/
public void penDown() { this.pen.setPenDown(true);}
/**
* Method to get the pen color
* @return the pen color
*/
public Color getPenColor() { return this.pen.getColor(); }
/**
* Method to set the pen color
* @param color the color for the pen ink
*/
public void setPenColor(Color color) { this.pen.setColor(color); }
/**
* Method to set the pen width
* @param width the width to use in pixels
*/
public void setPenWidth(int width) { this.pen.setWidth(width); }
/**
* Method to get the pen width
* @return the width of the pen in pixels
*/
public int getPenWidth() { return this.pen.getWidth(); }
/**
* Method to clear the path (history of
* where the turtle has been)
*/
public void clearPath()
{
this.pen.clearPath();
}
/**
* Method to get the current heading
* @return the heading in degrees
*/
public double getHeading() { return this.heading; }
/**
* Method to set the heading
* @param heading the new heading to use
*/
public void setHeading(double heading)
{
this.heading = heading;
}
/**
* Method to get the name of the turtle
* @return the name of this turtle
*/
public String getName() { return this.name; }
/**
* Method to set the name of the turtle
* @param theName the new name to use
*/
public void setName(String theName)
{
this.name = theName;
}
/**
* Method to get the value of the visible flag
* @return true if visible else false
*/
public boolean isVisible() { return this.visible;}
/**
* Method to hide the turtle (stop showing it)
* This doesn't affect the pen status
*/
public void hide() { this.setVisible(false); }
/**
* Method to show the turtle (doesn't affect
* the pen status
*/
public void show() { this.setVisible(true); }
/**
* Method to set the visible flag
* @param value the value to set it to
*/
public void setVisible(boolean value)
{
// if the turtle wasn't visible and now is
if (visible == false && value == true)
{
// update the display
this.updateDisplay();
}
// set the visibile flag to the passed value
this.visible = value;
}
/**
* Method to update the display of this turtle and
* also check that the turtle is in the bounds
*/
public synchronized void updateDisplay()
{
// check that x and y are at least 0
if (xPos < 0)
xPos = 0;
if (yPos < 0)
yPos = 0;
// if picture
if (picture != null)
{
if (xPos >= picture.getWidth())
xPos = picture.getWidth() - 1;
if (yPos >= picture.getHeight())
yPos = picture.getHeight() - 1;
Graphics g = picture.getGraphics();
paintComponent(g);
}
else if (modelDisplay != null)
{
if (xPos >= modelDisplay.getWidth())
xPos = modelDisplay.getWidth() - 1;
if (yPos >= modelDisplay.getHeight())
yPos = modelDisplay.getHeight() - 1;
modelDisplay.modelChanged();
}
}
/**
* Method to move the turtle foward 100 pixels
*/
public void forward() { forward(100); }
/**
* Method to move the turtle forward the given number of pixels
* @param pixels the number of pixels to walk forward in the heading direction
*/
public void forward(int pixels)
{
int oldX = xPos;
int oldY = yPos;
// change the current position
xPos = oldX + (int) (pixels * Math.sin(Math.toRadians(heading)));
yPos = oldY + (int) (pixels * -Math.cos(Math.toRadians(heading)));
// add a move from the old position to the new position to the pen
pen.addMove(oldX,oldY,xPos,yPos);
// update the display to show the new line
updateDisplay();
}
/**
* Method to go backward by 100 pixels
*/
public void backward()
{
backward(100);
}
/**
* Method to go backward a given number of pixels
* @param pixels the number of pixels to walk backward
*/
public void backward(int pixels)
{
forward(-pixels);
}
/**
* Method to move to turtle to the given x and y location
* @param x the x value to move to
* @param y the y value to move to
*/
public void moveTo(int x, int y)
{
this.pen.addMove(xPos,yPos,x,y);
this.xPos = x;
this.yPos = y;
this.updateDisplay();
}
/**
* Method to turn left
*/
public void turnLeft()
{
this.turn(-90);
}
/**
* Method to turn right
*/
public void turnRight()
{
this.turn(90);
}
/**
* Method to turn the turtle the passed degrees
* use negative to turn left and pos to turn right
* @param degrees the amount to turn in degrees
*/
public void turn(double degrees)
{
this.heading = (heading + degrees) % 360;
this.updateDisplay();
}
/**
* Method to draw a passed picture at the current turtle
* location and rotation in a picture or model display
* @param dropPicture the picture to drop
*/
public synchronized void drop(Picture dropPicture)
{
Graphics2D g2 = null;
// only do this if drawing on a picture
if (picture != null)
g2 = (Graphics2D) picture.getGraphics();
else if (modelDisplay != null)
g2 = (Graphics2D) modelDisplay.getGraphics();
// if g2 isn't null
if (g2 != null)
{
// save the current tranform
AffineTransform oldTransform = g2.getTransform();
// rotate to turtle heading and translate to xPos and yPos
g2.rotate(Math.toRadians(heading),xPos,yPos);
// draw the passed picture
g2.drawImage(dropPicture.getImage(),xPos,yPos,null);
// reset the tranformation matrix
g2.setTransform(oldTransform);
// draw the pen
pen.paintComponent(g2);
}
}
/**
* Method to paint the turtle
* @param g the graphics context to paint on
*/
public synchronized void paintComponent(Graphics g)
{
// cast to 2d object
Graphics2D g2 = (Graphics2D) g;
// if the turtle is visible
if (visible)
{
// save the current tranform
AffineTransform oldTransform = g2.getTransform();
// rotate the turtle and translate to xPos and yPos
g2.rotate(Math.toRadians(heading),xPos,yPos);
// determine the half width and height of the shell
int halfWidth = (int) (width/2); // of shell
int halfHeight = (int) (height/2); // of shell
int quarterWidth = (int) (width/4); // of shell
int thirdHeight = (int) (height/3); // of shell
int thirdWidth = (int) (width/3); // of shell
// draw the body parts (head)
g2.setColor(bodyColor);
g2.fillOval(xPos - quarterWidth,
yPos - halfHeight - (int) (height/3),
halfWidth, thirdHeight);
g2.fillOval(xPos - (2 * thirdWidth),
yPos - thirdHeight,
thirdWidth,thirdHeight);
g2.fillOval(xPos - (int) (1.6 * thirdWidth),
yPos + thirdHeight,
thirdWidth,thirdHeight);
g2.fillOval(xPos + (int) (1.3 * thirdWidth),
yPos - thirdHeight,
thirdWidth,thirdHeight);
g2.fillOval(xPos + (int) (0.9 * thirdWidth),
yPos + thirdHeight,
thirdWidth,thirdHeight);
// draw the shell
g2.setColor(getShellColor());
g2.fillOval(xPos - halfWidth,
yPos - halfHeight, width, height);
// draw the info string if the flag is true
if (showInfo)
drawInfoString(g2);
// reset the tranformation matrix
g2.setTransform(oldTransform);
}
// draw the pen
pen.paintComponent(g);
}
/**
* Method to draw the information string
* @param g the graphics context
*/
public synchronized void drawInfoString(Graphics g)
{
g.setColor(infoColor);
g.drawString(this.toString(),xPos + (int) (width/2),yPos);
}
/**
* Method to return a string with informaiton
* about this turtle
* @return a string with information about this object
*/
public String toString()
{
return this.name + " turtle at " + this.xPos + ", " +
this.yPos + " heading " + this.heading + ".";
}
} // end of class
package edu.gatech.mediacomp;
/**
* Class that represents a sound. This class is used by the students
* to extend the capabilities of SimpleSound.
*
* Copyright Georgia Institute of Technology 2004
* @author Barbara Ericson ericson@cc.gatech.edu
*/
public class Sound extends SimpleSound
{
/////////////// consructors ////////////////////////////////////
/**
* Constructor that takes a file name
* @param fileName the name of the file to read the sound from
*/
public Sound(String fileName)
{
// let the parent class handle setting the file name
super(fileName);
}
/**
* Constructor that takes the number of samples in
* the sound
* @param numSamples the number of samples desired
*/
public Sound (int numSamples)
{
// let the parent class handle this
super(numSamples);
}
/**
* Constructor that takes the number of samples that this
* sound will have and the sample rate
* @param numSamples the number of samples desired
* @param sampleRate the number of samples per second
*/
public Sound (int numSamples, int sampleRate)
{
// let the parent class handle this
super(numSamples,sampleRate);
}
/**
* Constructor that takes a sound to copy
*/
public Sound (Sound copySound)
{
// let the parent class handle this
super(copySound);
}
////////////////// methods ////////////////////////////////////
/**
* Method to return the string representation of this sound
* @return a string with information about this sound
*/
public String toString()
{
String output = "Sound";
String fileName = getFileName();
// if there is a file name then add that to the output
if (fileName != null)
output = output + " file: " + fileName;
// add the length in frames
output = output + " number of samples: " + getLengthInFrames();
return output;
}
public static void main(String[] args)
{
Sound sound1 = new Sound(FileChooser.pickAFile());
sound1.explore();
}
} // this } is the end of class Sound, put all new methods before this
package edu.gatech.mediacomp;
/**
* Class to use to report a sound exception
*
* Copyright Georgia Institute of Technology 2004
* @author Unknown Undergraduate
* @author Barb Ericson ericson@cc.gatech.edu
*/
public class SoundException extends Exception
{
public SoundException(String message)
{
super(message);
}
} // end of SoundException class
package edu.gatech.mediacomp;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.util.Vector;
import javax.sound.sampled.*;
import java.lang.Math;
import java.awt.geom.*;
/**
* This class allows you to explore a Sound. You can see the line drawing
* of the sound samples and play all or part of a sound. You can zoom in to see
* all the samples in the sound or zoom out to see the entire sound. You
* can click on the sound wave to see the value at that index.
*
* Copyright Georgia Institute of Technology 2004
* @author Keith McDermottt, gte047w@cc.gatech.edu
* @author Barb Ericson ericson@cc.gatech.edu
*/
public class SoundExplorer implements MouseMotionListener, ActionListener,
MouseListener, LineListener
{
private static final String zoomInHint =
"Click to see all the samples (the number of samples between pixels is 1)";
/** set to true for debugging and false for normal */
private boolean DEBUG = false;
/////// main parts of the gui /////////////////////////////
/** the main window */
private JFrame soundFrame;
/** panel that contains the buttons to play all or part of a sound and show
* selection information */
private JPanel playPanel;
/** scroll pane that holds the sound panel */
private JScrollPane scrollSound;
/** The panel that shows the sound wave */
private JPanel soundPanel;
////////// general information ////////////////////////////
/** the sound displayed in this window */
private SimpleSound sound;
/**
* Whether to display the sound in stereo - NOT neccessarily
* whether or not the sound is in stereo
*/
private boolean inStereo;
/////////////////// parts of the play panel ////////////////
/** label that shows the start index for the selection */
private JLabel startIndexLabel;
/** label that shows the stop index for the selection */
private JLabel stopIndexLabel;
/** panel that holds the play buttons */
private JPanel buttonPanel;
/** button to play the entire sound */
private JButton playEntireButton;
/** button to play the current selection */
private JButton playSelectionButton;
/** button to play the sound before the current index (inclusive) */
private JButton playBeforeButton;
/** button to play the sound after the current index (inclusive) */
private JButton playAfterButton;
/** button to clear the selection */
private JButton clearSelectionButton;
/** button to stop playing the sound */
private JButton stopButton;
//info related to the play panel
private boolean selectionPrevState;
//////////////// parts of the sound panel /////////////
/** outer panel for left sound */
private JPanel leftSoundPanel;
/** outer panel for right sound (if stereo) */
private JPanel rightSoundPanel;
/** panel just used to center the left sample panel */
private JPanel leftSampleWrapper;
/** panel just used to center the right sample panel */
private JPanel rightSampleWrapper;
/** panel that displays the left sound wave */
private SamplingPanel leftSamplePanel;
/** panel that displays the right sound wave */
private SamplingPanel rightSamplePanel;
//////////////// parts of the information panel //////////////
/** the current index information panel */
private JPanel infoPanel;
/** the current index label */
private JLabel indexLabel;
/** the number of samples per pixel field */
private JTextField numSamplesPerPixelField;
/** text field to display the current index value */
private JTextField indexValue;
/** label for the left sample value */
private JLabel leftSampleLabel;
/** text field that shows the value for the left sample at the current index */
private JTextField leftSampleValue;
/** label for the right sample value */
private JLabel rightSampleLabel;
/** text field that shows the value for the right sample at the current index */
private JTextField rightSampleValue;
/** panel that holds the zoom button */
private JPanel zoomButtonPanel;
/** zoom in and out button */
private JButton zoomButton;
/** button to go to the previous index */
private JButton prevButton;
/** button to go to the next index */
private JButton nextButton;
/** button to go to the last index */
private JButton lastButton;
/** button to go to the first index */
private JButton firstButton;
//info related to the sound panel
/** width of the displayed sound in pixels when fully zoomed out */
private int zoomOutWidth;
/** width of the displayed sound in pixels when fully zoomed in (framesPerPixel = 1) */
private int zoomInWidth;
/** current width of the sound in pixels */
private int sampleWidth;
/** current height of the sound in pixels */
private int sampleHeight;
//private int labelHeight;
private int soundPanelHeight;
/** number of samples (frames) (amount to add to index to get to next pixel) */
private float framesPerPixel;
//private int cushion;
/** current position in pixels */
private int currentPixelPosition;
/** start at 0 or 1 base */
private int base = 0;
//info related to event handling
private int mousePressed;
private int mouseReleased;
private int mousePressedX;
private int mouseReleasedX;
private boolean mouseDragged;
private int startFrame;
private int stopFrame;
private int selectionStart;
private int selectionStop;
///CONSTANTS///
private static final String currentIndexText = "Current Index: ";
private static final String startIndexText = "Start Index: ";
private static final String stopIndexText = "Stop Index: ";
private static final Color selectionColor = Color.gray;
private static final Color backgroundColor = Color.black;
private static final Color waveColor = Color.white;
private static final Color barColor = Color.cyan;
///////////////////////// class fields ///////////////////////////
private static String leftSampleText = "Sample Value: ";
private static String rightSampleText = "Right (Bottom) Sample Value: ";
/**
* Constructor that takes a sound and a boolean flag
* @param sound the sound to view
* @param inStereo true if you want to show it in stereo
*/
public SoundExplorer(SimpleSound sound, boolean inStereo)
{
this.sound = sound;
this.inStereo = inStereo;
if(inStereo)
leftSampleText = "Left (Top) Sample Value: ";
//this causes the Sound class to add this SoundExplorer
//as the line listener for any SourceDataLines created so
//we can monitor starting and stopping to enable/disable
//play and stop buttons
sound.setSoundExplorer(this);
//used for determining difference between a mouse release
//after a click and a mouse release after a drag. upon dragging,
//we want to select a region, upon clicking, only move the
//vertical bar
mouseDragged = false;
selectionStart = -1;
selectionStop = -1;
//size of the sampling panel
zoomOutWidth = 640;
zoomInWidth = sound.getLengthInFrames();
sampleWidth = zoomOutWidth;
framesPerPixel = sound.getLengthInFrames() / sampleWidth;
sampleHeight = 201;
//labelHeight = 50;
//cushion so that the sampling panel isn't flush against the
//left side - we want a small border so it looks neater
//cushion = 10;
//the current pixel position
currentPixelPosition = 0;
//display everything
createWindow();
}
/**
* Method to print out exception information
* @param ex the exception object
*/
private void catchException(Exception ex)
{
System.err.println(ex.getMessage());
}
/**
* Method to set the title on the main window
* @param s the string to use as the title
*/
public void setTitle(String s)
{
soundFrame.setTitle(s);
}
/**
* Method to create the main window
*/
private void createWindow()
{
String fileName = sound.getFileName();
if(fileName==null)
fileName = "no file name";
soundFrame = new JFrame(fileName);
// if(inStereo)
// {
// soundFrame.
// setSize(new Dimension
// (zoomOutWidth+cushion,
// 2*(sampleHeight+cushion)+labelHeight+100));
// }
// else
// {
// soundFrame.
// setSize(new Dimension
// (zoomOutWidth+cushion,
// sampleHeight+cushion+labelHeight+100));
// }
// get the sound frame content pane and save it
Container frameContainer = soundFrame.getContentPane();
frameContainer.setLayout(new BorderLayout());
soundFrame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
//also on close we need to remove the soundView listener?
//creates the play panel
createPlayPanel();
frameContainer.add(playPanel, BorderLayout.NORTH);
//creates the sound panel
createSoundPanel();
//creates the scrollpane for the sound
scrollSound = new JScrollPane();
scrollSound.setViewportView(soundPanel);
frameContainer.add(scrollSound, BorderLayout.CENTER);
//scrollSound.setVerticalScrollBarPolicy
// (JScrollPane.VERTICAL_SCROLLBAR_NEVER);
//scrollSound.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS );
//creates the info panel - this displays the current index
//and sample values
createInfoPanel();
frameContainer.add(infoPanel, BorderLayout.SOUTH);
// set the size based on the size of the contents
soundFrame.pack();
soundFrame.setResizable(false);
soundFrame.setVisible(true);
}//createWindow()
/**
* Method to create the button and add it to the passed panel
* @param name the label for the button
* @param enabled if true set button enabled else disable it
* @param panel the panel to add the button to
*/
private JButton makeButton(String name, boolean enabled, JPanel panel)
{
JButton j = new JButton(name);
j.addActionListener(this);
j.setEnabled(enabled);
panel.add(j);
return j;
}
/**
* Method to clear the selection information
*/
private void clearSelection()
{
selectionStart = -1;
selectionStop = -1;
startIndexLabel.setText(startIndexText + "N/A");
stopIndexLabel.setText(stopIndexText + "N/A");
soundFrame.getContentPane().repaint();
playSelectionButton.setEnabled(false);
clearSelectionButton.setEnabled(false);
}
/**
* Method to create the panel that has the buttons for playing all or
* part of the sound. Also shows information about the selection (if one)
*/
private void createPlayPanel()
{
// set up the play panel
playPanel = new JPanel();
//playPanel.setPreferredSize(new Dimension(zoomOutWidth, 60));
playPanel.setLayout(new BorderLayout());
// create the selection panel items
JPanel selectionPanel = new JPanel();
startIndexLabel = new JLabel(startIndexText + "N/A");
stopIndexLabel = new JLabel(stopIndexText + "N/A");
playSelectionButton = makeButton("Play Selection", false, selectionPanel);
clearSelectionButton = makeButton("Clear Selection",false,selectionPanel);
clearSelectionButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
clearSelection();
}
});
selectionPanel.add(startIndexLabel);
selectionPanel.add(stopIndexLabel);
// set up the button panel
buttonPanel = new JPanel();
playEntireButton = makeButton("Play Entire Sound", true, buttonPanel);
selectionPrevState = false;
playBeforeButton = makeButton("Play Before", false, buttonPanel);
playAfterButton = makeButton("Play After", true, buttonPanel);
stopButton = makeButton("Stop", false, buttonPanel);
// add tool tip text
playBeforeButton.setToolTipText("Play sound up to the current index");
playAfterButton.setToolTipText("Play sound starting at the current index");
playEntireButton.setToolTipText("Play the entire sound");
playSelectionButton.setToolTipText("Play sound between start and stop index");
stopButton.setToolTipText("Stop playing the sound");
clearSelectionButton.setToolTipText("Click to clear (remove) the selection");
// add the button panel and selection panel to the play panel
playPanel.add(buttonPanel, BorderLayout.NORTH);
playPanel.add(selectionPanel,BorderLayout.SOUTH);
}//createPlayPanel()
/**
* Method to create the panel for displaying the sound wave(s)
*/
private void createSoundPanel()
{
//the main panel, we'll add everything to this at the end
soundPanel = new JPanel();
if(inStereo)
soundPanel.setLayout(new GridLayout(2,1));
else
soundPanel.setLayout(new GridLayout(1,1));
/*
do all the stuff to display the left channel. we'll only
make the stuff to display the right channel if neccessary.
everything will go into the leftSoundPanel, which is then
added to the main soundPanel
*/
leftSoundPanel = new JPanel();
leftSoundPanel.setLayout(new BorderLayout());
leftSoundPanel.setPreferredSize
//(new Dimension(sampleWidth, sampleHeight+cushion));
(new Dimension(sampleWidth, sampleHeight));
/*
the sampling panel - this is where the wave form displays.
we put it in a wrapper so that it looks centered within the
main soundPanel
*/
leftSampleWrapper = new JPanel();//so its centered
leftSamplePanel = new SamplingPanel(true);
leftSamplePanel.addMouseMotionListener(this);
leftSamplePanel.addMouseListener(this);
leftSampleWrapper.add(leftSamplePanel);
leftSampleWrapper.
//setPreferredSize(new Dimension(sampleWidth, sampleHeight+ cushion));
setPreferredSize(new Dimension(sampleWidth, sampleHeight));
/*
put all the pieces into the left sound panel:
the sample at the top, below it we want the
current index on the left
zoom button in the middle (unless its stereo - then the zoom button
goes in the right sound panel)
and current sample value on the right
*/
leftSoundPanel.add(leftSampleWrapper, BorderLayout.NORTH);
soundPanel.add(leftSoundPanel);
//soundPanelHeight = sampleHeight+cushion;
soundPanelHeight = sampleHeight;
if(inStereo)
{
rightSoundPanel = new JPanel();
rightSoundPanel.setLayout(new BorderLayout());
rightSoundPanel.setPreferredSize
//(new Dimension(sampleWidth, sampleHeight+cushion));
(new Dimension(sampleWidth, sampleHeight));
rightSampleWrapper = new JPanel();
rightSamplePanel = new SamplingPanel(false);
rightSamplePanel.addMouseMotionListener(this);
rightSamplePanel.addMouseListener(this);
rightSampleWrapper.add(rightSamplePanel);
rightSampleWrapper.setPreferredSize
//(new Dimension(sampleWidth, sampleHeight+cushion));
(new Dimension(sampleWidth, sampleHeight));
rightSoundPanel.add(rightSampleWrapper, BorderLayout.NORTH);
soundPanel.add(rightSoundPanel);
//soundPanelHeight = 2*(sampleHeight+cushion);
soundPanelHeight = 2*(sampleHeight);
}
soundPanel.setPreferredSize(new Dimension(zoomOutWidth,soundPanelHeight));
soundPanel.setSize(soundPanel.getPreferredSize());
}
/**
* Method to update the index values to the current index position
*/
private void updateIndexValues()
{
// calculate the current sample (frame) index
int curFrame = (int)(currentPixelPosition * framesPerPixel);
// update the display of the current sample (frame) index
indexValue.setText(Integer.toString(curFrame + base));
// update the number of samples per (between) pixels field
if (numSamplesPerPixelField != null)
numSamplesPerPixelField.setText(Integer.toString((int) framesPerPixel));
// try to update the value(s) at the current sample index
try
{
leftSampleValue.setText(Integer.toString(sound.getLeftSample(curFrame)));
if(inStereo)
rightSampleValue.setText(Integer.toString(sound.getRightSample(curFrame)));
}
catch(Exception ex)
{
catchException(ex);
}
}
/**
* Method to set up the index panel. This panel has buttons for going to
* the first index, previous index, the current index label, the current index
* value or values (if in stereo), next index button, and a last index button
* @param indexPanel the panel to set-up
*/
private void setUpIndexPanel(JPanel indexPanel)
{
JPanel topPanel = new JPanel();
Box vertBox = Box.createVerticalBox();
// create the image icons for the buttons
Icon prevIcon = new ImageIcon(SoundExplorer.class.getResource("leftArrow.gif"),
"previous index");
Icon nextIcon = new ImageIcon(SoundExplorer.class.getResource("rightArrow.gif"),
"next index");
Icon firstIcon = new ImageIcon(SoundExplorer.class.getResource("endLeft.gif"),
"first index");
Icon lastIcon = new ImageIcon(SoundExplorer.class.getResource("endRight.gif"),
"last index");
// create the arrow buttons
prevButton = new JButton(prevIcon);
firstButton = new JButton(firstIcon);
nextButton = new JButton(nextIcon);
lastButton = new JButton(lastIcon);
// set the tool tip text
prevButton.setToolTipText("Click to view previous index (sample at previous pixel)");
firstButton.setToolTipText("Click to view first index (sample at first pixel)");
nextButton.setToolTipText("Click to view next index (sample at next pixel)");
lastButton.setToolTipText("Click to view last index (sample at last pixel)");
// set the preferred sizes of the buttons
prevButton.setPreferredSize(new Dimension(prevIcon.getIconWidth() + 2,
prevIcon.getIconHeight() + 2));
firstButton.setPreferredSize(new Dimension(firstIcon.getIconWidth() + 2,
firstIcon.getIconHeight() + 2));
nextButton.setPreferredSize(new Dimension(nextIcon.getIconWidth() + 2,
nextIcon.getIconHeight() + 2));
lastButton.setPreferredSize(new Dimension(lastIcon.getIconWidth() + 2,
lastIcon.getIconHeight() + 2));
// handle previous button press
prevButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent evt) {
currentPixelPosition--;
if (currentPixelPosition < 0)
currentPixelPosition = 0;
updateIndexValues();
checkScroll();
soundFrame.getContentPane().repaint();
}
});
// handle next button press
nextButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent evt) {
currentPixelPosition++;
if (currentPixelPosition * framesPerPixel >= sound.getNumSamples())
currentPixelPosition = (int) ((sound.getNumSamples() - 1) / framesPerPixel);
updateIndexValues();
checkScroll();
soundFrame.getContentPane().repaint();
}
});
// handle first button press
firstButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent evt) {
currentPixelPosition = 0;
updateIndexValues();
checkScroll();
soundFrame.getContentPane().repaint();
}
});
// handle last button press
lastButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent evt) {
currentPixelPosition = (int) ((sound.getNumSamples() - 1) / framesPerPixel);
updateIndexValues();
checkScroll();
soundFrame.getContentPane().repaint();
}
});
// create the index value textfield
indexValue = new JTextField(Integer.toString(0),8);
indexValue.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
// zoom in around user entered value
handleZoomIn(Integer.parseInt(indexValue.getText()));
// update the values for the pixel at the current index
updateIndexValues();
}
});
// create the left sample value and right sample value textfields
leftSampleValue = new JTextField(8);
leftSampleValue.setEditable(false);
rightSampleValue = new JTextField(8);
rightSampleValue.setEditable(false);
// create the labels
indexLabel = new JLabel(currentIndexText);
leftSampleLabel = new JLabel(leftSampleText);
rightSampleLabel = new JLabel(rightSampleText);
updateIndexValues();
// add the buttons and label to the top panel
topPanel.add(firstButton);
topPanel.add(prevButton);
topPanel.add(indexLabel);
topPanel.add(indexValue);
topPanel.add(leftSampleLabel);
topPanel.add(leftSampleValue);
if (inStereo) {
topPanel.add(rightSampleLabel);
topPanel.add(rightSampleValue);
}
topPanel.add(nextButton);
topPanel.add(lastButton);
// create bottom panel
JPanel bottomPanel = new JPanel();
bottomPanel.add(new JLabel("The number of samples between pixels: "));
numSamplesPerPixelField = new JTextField(Integer.toString((int) framesPerPixel),8);
numSamplesPerPixelField.setToolTipText("Click here to zoom in (decrease) or out (increase))");
numSamplesPerPixelField.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
// zoom in around user entered value
handleFramesPerPixel(Integer.parseInt(numSamplesPerPixelField.getText()));
// update the values for the pixel at the current index
updateIndexValues();
}
});
bottomPanel.add(numSamplesPerPixelField);
// add the top panel to the box
vertBox.add(topPanel);
vertBox.add(bottomPanel);
// add the vertical box to the index panel
indexPanel.add(vertBox);
}
/**
* Method to create the information panel which holds the index information, the value
* for the current index, and the zoom button
*/
private void createInfoPanel()
{
// create the information panel and set the layout
infoPanel = new JPanel();
infoPanel.setLayout(new BorderLayout());
// create the index panel and set it up
JPanel indexPanel = new JPanel();
indexPanel.setLayout(new FlowLayout());
setUpIndexPanel(indexPanel);
// create a zoom panel with a zoom button
zoomButtonPanel = new JPanel();
zoomButton = makeButton("Zoom In", true, zoomButtonPanel);
zoomButton.setToolTipText(zoomInHint);
infoPanel.add(BorderLayout.NORTH,indexPanel);
infoPanel.add(BorderLayout.SOUTH,zoomButtonPanel);
}
/**
* Handle a mouse click event
* @param e the mouse event
*/
public void mouseClicked(MouseEvent e)
{
currentPixelPosition = e.getX();
if(currentPixelPosition==0)
{
playBeforeButton.setEnabled(false);
playAfterButton.setEnabled(true);
}
else if(currentPixelPosition < sampleWidth)
{
playBeforeButton.setEnabled(true);
playAfterButton.setEnabled(true);
}
else if(currentPixelPosition == sampleWidth)
{
playBeforeButton.setEnabled(true);
playAfterButton.setEnabled(false);
}
if(DEBUG)
System.out.println("mouse click: " + currentPixelPosition);
updateIndexValues();
soundPanel.repaint();
}
/**
* Method to handle a mouse press
* @param e the mouse event
*/
public void mousePressed(MouseEvent e)
{
mousePressedX = e.getX();
}
/**
* Method to handle a mouse release
* @param e the mouse event
*/
public void mouseReleased(MouseEvent e)
{
mouseReleasedX = e.getX();
if(mouseDragged)
{
mousePressed = mousePressedX;
mouseReleased = mouseReleasedX;
if (mousePressed > mouseReleased)//selected right to left
{
int temp = mousePressed;
mousePressed = mouseReleased;
mouseReleased = temp;
}
startFrame = (int)(mousePressed * framesPerPixel);
stopFrame = (int)(mouseReleased * framesPerPixel);
//stopped dragging outside the window.
if(stopFrame >= sound.getLengthInFrames())
stopFrame = sound.getLengthInFrames();
//stopped dragging outside the window
if(startFrame < 0)
startFrame = 0;
//new values for the labels
startIndexLabel.setText(startIndexText + (startFrame));
stopIndexLabel.setText(stopIndexText + (stopFrame));
//for highlighting the selection
selectionStart = mousePressed;
selectionStop = mouseReleased;
soundPanel.repaint();
playSelectionButton.setEnabled(true);
clearSelectionButton.setEnabled(true);
mouseDragged = false;
}
}
/**
* Method to handle a mouse entered event
* @param e the mouse event
*/
public void mouseEntered(MouseEvent e)
{}
/**
* Method to handle a mouse exited event
* @param e the mouse event
*/
public void mouseExited(MouseEvent e)
{}
/**
* Method to handle a mouse dragged event
* @param e the mouse event
*/
public void mouseDragged(MouseEvent e)
{
mouseDragged = true;
//highlight the selection as we drag by pretending
//that we're releasing the mouse at each point
mouseReleased(e);
}
/**
* Method to handle a mouse move event
* @param e the mouse event
*/
public void mouseMoved(MouseEvent e)
{}
/**
* Method to handle the line event update
* @param e the line event
*/
public void update(LineEvent e)
{
if(e.getType().equals(LineEvent.Type.OPEN))
{
playEntireButton.setEnabled(false);
playBeforeButton.setEnabled(false);
playAfterButton.setEnabled(false);
selectionPrevState = playSelectionButton.isEnabled();
playSelectionButton.setEnabled(false);
clearSelectionButton.setEnabled(false);
stopButton.setEnabled(true);
}
if(e.getType().equals(LineEvent.Type.CLOSE))
{
playEntireButton.setEnabled(true);
playSelectionButton.setEnabled(selectionPrevState);
clearSelectionButton.setEnabled(selectionPrevState);
stopButton.setEnabled(false);
if(currentPixelPosition==0)
{
playBeforeButton.setEnabled(false);
playAfterButton.setEnabled(true);
}
else if(currentPixelPosition < sampleWidth)
{
playBeforeButton.setEnabled(true);
playAfterButton.setEnabled(true);
}
else if(currentPixelPosition == sampleWidth)
{
playBeforeButton.setEnabled(true);
playAfterButton.setEnabled(false);
}
}
}
/**
* Method to handle an action event
* @param e the action event
*/
public void actionPerformed(ActionEvent e)
{
if(e.getActionCommand() == "Play Entire Sound")
{
try
{
sound.play();
}
catch(Exception ex)
{
catchException(ex);
}
}
else if(e.getActionCommand() == "Play Selection")
{
try
{
sound.playAtRateInRange(1, startFrame, stopFrame);
}
catch(Exception ex)
{
catchException(ex);
}
}
else if(e.getActionCommand().equals("Stop"))
{
//stop all playback threads related to this sound
for(int i = 0; i < sound.getPlaybacks().size(); i++)
{
((Playback)sound.getPlaybacks().elementAt(i))
.stopPlaying();
}
}
else if(e.getActionCommand().equals("Zoom In"))
{
handleZoomIn(true);
}
else if (e.getActionCommand().equals("Zoom Out"))
{
handleZoomOut();
}
else if(e.getActionCommand().equals("Play Before"))
{
try
{
sound.playAtRateInRange
(1, 0, (int)(currentPixelPosition * framesPerPixel));
}
catch(Exception ex)
{
catchException(ex);
}
}
else if(e.getActionCommand().equals("Play After"))
{
try
{
sound.playAtRateInRange
(1, (int)(currentPixelPosition*framesPerPixel),
sound.getLengthInFrames()-1);
}
catch(Exception ex)
{
catchException(ex);
}
}
else
{
// System.err.println("command not defined: " +
// e.getActionCommand());
}
}
/**
* Method to check that the current position is in the viewing area and if
* not scroll to center the current position if possible
*/
public void checkScroll()
{
// only do this if we are not zoomed out
if (sampleWidth != zoomOutWidth) {
// get the rectangle that defines the current view
JViewport viewport = scrollSound.getViewport();
Rectangle rect = viewport.getViewRect();
int rectMinX = (int) rect.getX();
int rectWidth = (int) rect.getWidth();
int rectMaxX = rectMinX + rectWidth - 1;
// get the maximum possible index
int maxIndex = sound.getLength() - rectWidth - 1;
// check if current position is outside viewing area
if (currentPixelPosition < rectMinX ||
currentPixelPosition > rectMaxX) {
// calculate how to position the current position in the middle of the viewing
// area
int barXPos = currentPixelPosition - (int) (rectWidth / 2);
int barYPos = (int) (sampleHeight - rect.getHeight()) / 2;
// check if the barPos is less than 0 or greater than max
if (barXPos < 0)
barXPos = 0;
else if (barXPos > maxIndex)
barXPos = maxIndex;
// move the viewport upper left point
viewport.setViewPosition(new Point(barXPos, barYPos));
}
}
}
/**
* Method to handle a zoom in
*/
private void handleZoomIn(boolean checkScrollFlag)
{
// change the zoom button to zoom out information
zoomButton.setText("Zoom Out");
zoomButton.setToolTipText("Click to zoom out (see the whole sound)");
// get the frame index current position, selection start and stop
currentPixelPosition = (int)(currentPixelPosition*framesPerPixel);
selectionStart = (int)(selectionStart*framesPerPixel);
selectionStop = (int)(selectionStop*framesPerPixel);
if(DEBUG)
System.out.println("Zoom In: currentPixelPosition = " +
currentPixelPosition);
sampleWidth = zoomInWidth;
framesPerPixel = sound.getLengthInFrames() / sampleWidth;
soundPanel.setPreferredSize(new Dimension(zoomInWidth,
soundPanel.getHeight()));
soundPanel.setSize(soundPanel.getPreferredSize());
leftSoundPanel.setPreferredSize(new Dimension(zoomInWidth,
leftSoundPanel.getHeight()));
leftSoundPanel.setSize(leftSoundPanel.getPreferredSize());
leftSampleWrapper.setPreferredSize(new Dimension(zoomInWidth,
leftSampleWrapper.getHeight()));
leftSampleWrapper.setSize(leftSampleWrapper.getPreferredSize());
leftSamplePanel.setPreferredSize(new Dimension(sampleWidth,
sampleHeight));
leftSamplePanel.setSize(leftSamplePanel.getPreferredSize());
leftSamplePanel.createWaveForm(true);
if(inStereo)
{
rightSoundPanel.setPreferredSize
(new Dimension(zoomInWidth,
rightSoundPanel.getHeight()));
rightSoundPanel.setSize
(rightSoundPanel.getPreferredSize());
rightSampleWrapper.setPreferredSize
(new Dimension(zoomInWidth,
rightSampleWrapper.getHeight()));
rightSampleWrapper.setSize
(rightSampleWrapper.getPreferredSize());
rightSamplePanel.setPreferredSize
(new Dimension(zoomInWidth,
rightSamplePanel.getHeight()));
rightSamplePanel.setSize
(rightSamplePanel.getPreferredSize());
rightSamplePanel.createWaveForm(false);
}
if(DEBUG)
{
System.out.println("ZOOM IN SIZES:");
System.out.println("\tleftSamplePanel: " +
leftSamplePanel.getSize());
System.out.println("\t\tpreferred: " +
leftSamplePanel.getPreferredSize());
System.out.println("\tleftSampleWrapper: " +
leftSampleWrapper.getSize());
System.out.println("\t\tpreferred: " +
leftSampleWrapper.getPreferredSize());
System.out.println("\tleftSoundPanel: " +
leftSoundPanel.getSize());
System.out.println("\t\tpreferred: " +
leftSoundPanel.getPreferredSize());
System.out.println("\tsoundPanel: " +
soundPanel.getSize());
System.out.println("\t\tpreferred: " +
soundPanel.getPreferredSize());
}
// revalidate to handle the new preferred sizes
scrollSound.revalidate();
// update the index values
updateIndexValues();
// check for the need to scroll
if (checkScrollFlag)
checkScroll();
}
/**
* Method to handle a zoom in to view all sample values
* @param index the index to use after the zoom in
*/
private void handleZoomIn(int index)
{
if (index % framesPerPixel != 0) {
// do normal zoom in on current position
handleZoomIn(false);
}
// change current position to the passed index
currentPixelPosition = (int) (index / framesPerPixel);
// now check the scroll
checkScroll();
// repaint
soundPanel.repaint();
}
/**
* Method to handle a zoom out to view the entire sound wave
*/
private void handleZoomOut()
{
zoomButton.setText("Zoom In");
zoomButton.setToolTipText(zoomInHint);
sampleWidth = zoomOutWidth;
framesPerPixel = sound.getLengthInFrames() / sampleWidth;
int divisor = (sound.getLengthInFrames()/sampleWidth);
currentPixelPosition = (int)(currentPixelPosition/divisor);
selectionStart = (int)(selectionStart/divisor);
selectionStop = (int)(selectionStop/divisor);
if(DEBUG)
System.out.println("Zoom Out: currentPixelPosition = " +
currentPixelPosition);
soundPanel.setPreferredSize
(new Dimension(zoomOutWidth,
soundPanel.getHeight()));
soundPanel.setSize(soundPanel.getPreferredSize());
leftSoundPanel.setPreferredSize
(new Dimension(zoomOutWidth,
leftSoundPanel.getHeight()));
leftSoundPanel.setSize(leftSoundPanel.getPreferredSize());
leftSampleWrapper.setPreferredSize
(new Dimension(zoomOutWidth,
leftSampleWrapper.getHeight()));
leftSampleWrapper.setSize
(leftSampleWrapper.getPreferredSize());
leftSamplePanel.setPreferredSize
(new Dimension(sampleWidth, sampleHeight));
leftSamplePanel.setSize(leftSamplePanel.getPreferredSize());
leftSamplePanel.createWaveForm(true);
if(inStereo)
{
rightSoundPanel.
setPreferredSize
(new Dimension(zoomOutWidth,
rightSoundPanel.getHeight()));
rightSoundPanel.setSize
(rightSoundPanel.getPreferredSize());
rightSampleWrapper.setPreferredSize
(new Dimension(zoomOutWidth,
rightSampleWrapper.getHeight()));
rightSampleWrapper.setSize
(rightSampleWrapper.getPreferredSize());
rightSamplePanel.setPreferredSize
(new Dimension(sampleWidth, sampleHeight));
rightSamplePanel.setSize
(rightSamplePanel.getPreferredSize());
rightSamplePanel.createWaveForm(false);
}
updateIndexValues();
soundPanel.repaint();
}
/**
* Method to handle an entry of the desired number of frames (samples)
* shown per pixel
* @param numFrames (the number of samples shown in a pixel)
*/
private void handleFramesPerPixel(int numFrames)
{
// get the current index from the pixel position and frames per pixel
int currIndex = (int) (currentPixelPosition * framesPerPixel);
sampleWidth = sound.getLengthInFrames() / numFrames;
framesPerPixel = numFrames;
int divisor = (sound.getLengthInFrames()/sampleWidth);
currentPixelPosition = (int)(currIndex/divisor); // new curr pixel
selectionStart = (int)(selectionStart/divisor);
selectionStop = (int)(selectionStop/divisor);
soundPanel.setPreferredSize
(new Dimension(sampleWidth,
soundPanel.getHeight()));
soundPanel.setSize(soundPanel.getPreferredSize());
leftSoundPanel.setPreferredSize
(new Dimension(sampleWidth,
leftSoundPanel.getHeight()));
leftSoundPanel.setSize(leftSoundPanel.getPreferredSize());
leftSampleWrapper.setPreferredSize
(new Dimension(sampleWidth,
leftSampleWrapper.getHeight()));
leftSampleWrapper.setSize
(leftSampleWrapper.getPreferredSize());
leftSamplePanel.setPreferredSize
(new Dimension(sampleWidth, sampleHeight));
leftSamplePanel.setSize(leftSamplePanel.getPreferredSize());
leftSamplePanel.createWaveForm(true);
if(inStereo)
{
rightSoundPanel.
setPreferredSize
(new Dimension(sampleWidth,
rightSoundPanel.getHeight()));
rightSoundPanel.setSize
(rightSoundPanel.getPreferredSize());
rightSampleWrapper.setPreferredSize
(new Dimension(sampleWidth,
rightSampleWrapper.getHeight()));
rightSampleWrapper.setSize
(rightSampleWrapper.getPreferredSize());
rightSamplePanel.setPreferredSize
(new Dimension(sampleWidth, sampleHeight));
rightSamplePanel.setSize
(rightSamplePanel.getPreferredSize());
rightSamplePanel.createWaveForm(false);
}
// revalidate to handle the new preferred sizes
scrollSound.revalidate();
// update the index values
updateIndexValues();
// check for the need to scroll
checkScroll();
soundPanel.repaint();
}
/**
* Method to set the base for the index. The default is a base of 0.
* @param base the new base to use (for example use setBase(1))
* to use base 1 instead of 0
*/
public void setBase(int base)
{
this.base = base;
}
/**
* Class to display the sound wave
*/
private class SamplingPanel extends JPanel
{
private boolean forLeftSample;
private Vector<Point2D.Float> points;
/**
* Constructor that takes a flag to tell if for left or right sample
* @param inputForLeftSample if true = left if false = right
*/
public SamplingPanel(boolean inputForLeftSample)
{
forLeftSample = inputForLeftSample;
if(DEBUG)
System.out.println("creating new sampling panel: " +
"\n\tfor left sample: "+forLeftSample +
"\n\tsampleWidth: " + sampleWidth +
"\n\tsampleHeight: " + sampleHeight);
setBackground(backgroundColor);
setPreferredSize(new Dimension(sampleWidth, sampleHeight));
setSize(getPreferredSize());
if(DEBUG)
System.out.println("\tSample panel preferred size: " +
getPreferredSize() + "\n\tSample panel size: " + getSize());
points = new Vector<Point2D.Float>();
createWaveForm(forLeftSample);
}//constructor(forLeftSample)
/**
* Method to create the sound wave
* @param forLeftSample if true create the left form, if false the right
*/
public void createWaveForm(boolean forLeftSample)
{
//get the max y value for a sound of this sample size
AudioFormat format = sound.getAudioFileFormat().getFormat();
float maxValue;
if(format.getSampleSizeInBits() == 8)
{
maxValue = (float)Math.pow(2,7);
}
else if(format.getSampleSizeInBits() == 16)
{
maxValue = (float)Math.pow(2, 15);
}
else if(format.getSampleSizeInBits() == 24)
{
maxValue = (float)Math.pow(2, 23);
}
else if(format.getSampleSizeInBits() == 32)
{
maxValue = (float)Math.pow(2, 31);
}
else
{
try
{
sound.printError("InvalidSampleSize");
}
catch(Exception ex)
{
catchException(ex);
}
return;
}
points.clear();
//framesPerPixel = sound.getLengthInFrames() / sampleWidth;
for(int pixel = 0; pixel<sampleWidth; pixel++)
{
float y;
float sampleValue;
if(forLeftSample)
{
try
{
sampleValue = sound.
getLeftSample((int)(pixel*framesPerPixel));
}
catch(Exception ex)
{
catchException(ex);
return;
}
}
else
{
try
{
sampleValue = sound.
getRightSample((int)(pixel*framesPerPixel));
}
catch(Exception ex)
{
catchException(ex);
return;
}
}
y = ((float)Math.floor(sampleHeight/2) -
(sampleValue * ((float)Math.floor(sampleHeight/2) /
maxValue)));
points.add(new Point2D.Float(pixel, y));
}//for - collecting points
if(DEBUG)
System.out.println("number of points: " + points.size());
repaint();
}//createWaveForm()
/**
* Method to draw the Sampling Panel
* @param g the graphics context
*/
public void paintComponent(Graphics g)
{
Rectangle rectToPaint = g.getClipBounds();
if(DEBUG)
{
System.out.println("Repainting: " + rectToPaint);
System.out.println("\tSampleWidth: " + sampleWidth);
System.out.println("\tframesPerPixel: " + framesPerPixel);
System.out.println("\tSample panel size: " + getSize());
System.out.println("\tSamplePanel Width: " + getWidth());
System.out.println("\tSamplePanel Height: " + getHeight());
}
//clear out the image
Graphics2D g2 = (Graphics2D)g;
g2.setBackground(backgroundColor);
g2.clearRect((int)rectToPaint.getX(), (int)rectToPaint.getY(),
(int)rectToPaint.getWidth(), (int)rectToPaint.getHeight());
//draw the selection if it exists
if(selectionStart!=-1 && selectionStop!=-1)
{
g2.setBackground(selectionColor);
g2.clearRect(selectionStart, 0,
selectionStop-selectionStart+1, sampleHeight);
}
//draw the lines
g2.setColor(waveColor);
for(int i = (int)rectToPaint.getX();
i < (rectToPaint.getX() + rectToPaint.getWidth() -1); i++)
{
g2.draw(new
Line2D.Float((Point2D.Float)points.elementAt(i),
(Point2D.Float)points.elementAt(i+1)));
}
//draw the center line
g2.setColor(barColor);
g2.setStroke(new BasicStroke(1));
g2.draw(new Line2D.Double(rectToPaint.getX(),
Math.floor(sampleHeight/2),
rectToPaint.getX()+rectToPaint.getWidth()-1,
Math.floor(sampleHeight/2)));
//draw the current position
if (rectToPaint.getX()<currentPixelPosition &&
currentPixelPosition<(rectToPaint.getX()+rectToPaint.getWidth()-1))
{
g2.setColor(barColor);
g2.setStroke(new BasicStroke(1));
g2.draw(new Line2D.Double(currentPixelPosition, 0,
currentPixelPosition, sampleHeight));
}
}//paint(g)
}//public class SamplingPanel
/*
public static void main(String args[])
{
try{
/*
Sound s = new Sound("/Users/ellie/mediacomp/ellie/really_long_sound.wav");
SoundExplorer test = new SoundExplorer(s, s.isStereo());
*/
//Sound s2 = new Sound("/Users/ellie/mediacomp/ellie/SoundDemo/audio/22-new.aif");
// SoundExplorer teststereo = new SoundExplorer(s2, true);
//SoundExplorer testmono = new SoundExplorer(s2, false);
/*
Sound windowsSound = new Sound("/Users/ellie/Desktop/sound2.wav");
SoundExplorer testWin = new SoundExplorer(windowsSound, false);
Sound shaggz =
new Sound("/Users/ellie/Desktop/audio2/SOUND1.WAV");
System.out.println(shaggz.getAudioFileFormat().getFormat());
shaggz.blockingPlay();
SoundExplorer shaggzView = new SoundExplorer(shaggz, false);
Sound shaggz2 =
new Sound("/Users/ellie/Desktop/audio2/SOUND1.WAV");
for(int i = 0; i < shaggz2.getLengthInFrames(); i++)
{
shaggz2.setSampleValue(i, shaggz2.getSampleValue(i));
}
SoundExplorer shaggzView2 = new SoundExplorer(shaggz2, false);
/*
Sound emptySound = new Sound(5);
SoundExplorer testempty = new SoundExplorer(emptySound, false);
*/
/*
Sound sStates = new Sound("Z:\\croak.wav");
SoundExplorer testStates = new SoundExplorer(sStates, sStates.isStereo());
*/
/* }
catch(Exception ex)
{
System.out.println(ex.getMessage());
}
} */
}//end class SoundExplorer
package edu.gatech.mediacomp;
/**
* Class that represents a sample of a sound. It knows what sound object
* it comes from and knows what frame number this sample is in the sound
* object.
*
* Copyright Georgia Institute of Technology 2004
* @author Barb Ericson ericson@cc.gatech.edu
*/
public class SoundSample
{
/** the sound that this element belongs to */
private SimpleSound sound = null;
/** the frame number of this sample in the buffer */
private int frameNumber = 0;
///////////////////// Constructors //////////////////////////////////
/**
* Constructor that takes a sound and valueArray
* @param sound the sound object this sample comes from
* @param frameNumber the frameNumber of this sample in the sound
*/
public SoundSample(SimpleSound sound, int frameNumber)
{
this.sound = sound;
this.frameNumber = frameNumber;
}
/////////////////// Methods /////////////////////////////////////////
/**
* Method to get the value of this sample as in int
* and handle the possible sound exception
* @return the value of this sample as an int
*/
public int getValue() {
int value = 0;
try {
value = sound.getSampleValue(frameNumber);
} catch (SoundException ex) {
}
return value;
}
/**
* Method to set the value of this sample and
* handle the sound exception
* @param value the value to use
*/
public void setValue(int value)
{
try {
sound.setSampleValue(frameNumber,value);
} catch (SoundException ex) {
}
}
/**
* Method to return a string with the information about
* this object
* @return a string with information about this object
*/
public String toString()
{
return "Sample at index " + frameNumber + " has value " + getValue();
}
} // end of SoundSample class
package edu.gatech.mediacomp;
import java.awt.Point;
import java.awt.font.*;
import java.awt.*;
import java.text.*;
import java.awt.geom.*;
import java.util.*;
/**
* SpeechBalloon: this is used to
* represent objects
* in comic strips which are used to show
* what a character is saying. The tip of
* tail points to the character who is
* talking
* @author Barb Ericson
*/
public class SpeechBalloon extends TextBalloon
{
///////////// constructors //////////////////
/**
* Constructor that takes the upper left, width,
* tail end, and message to display
* @param uLeft the upper left corner of a rectangle
* enclosing the balloon
* @param theWidth the width of the enclosing rectangle
* @param tEnd the point which is the end of the tail
* that shows who is speaking
* @param theMessage the message to display
*/
public SpeechBalloon (Point uLeft, int theWidth,
Point tEnd, String theMessage)
{
super(uLeft,theWidth,tEnd,theMessage);
}
//////////// methods ////////////////
/**
* method to draw the tail of the balloon
* @param ellipseHeight the height of the
* ellipse
* @param fillColor the color to bill the
* balloon with
* @param outlineColor the color to outline
* the balloon with
* @param g2 the 2d graphics context
*/
protected void drawTail(int ellipseHeight,
Color fillColor,
Color outlineColor,
Graphics2D g2)
{
Point tailEnd = getTailEnd();
Point upperLeft = getUpperLeft();
int margin = getMargin();
int halfWidth = getWidth() / 2;
int topY = upperLeft.y + ellipseHeight;
int startX = upperLeft.x + halfWidth - margin;
int endX = upperLeft.x + halfWidth + margin;
GeneralPath triangle =
new GeneralPath(GeneralPath.WIND_EVEN_ODD,3);
triangle.moveTo(startX,topY);
triangle.lineTo(endX,topY);
triangle.lineTo(tailEnd.x,tailEnd.y);
triangle.lineTo(startX,topY);
g2.setColor(fillColor);
g2.fill(triangle);
g2.setColor(outlineColor);
g2.draw(new Line2D.Double(tailEnd.x,tailEnd.y,
startX,topY));
g2.draw(new Line2D.Double(tailEnd.x,tailEnd.y,
endX,topY));
}
public static void main(String[] args)
{
Picture p = new Picture(FileChooser.getMediaPath("horse.jpg"));
Graphics g = p.getGraphics();
Point ul = new Point(68,24);
Point te = new Point(182,123);
String message = "This is a test." +
" Of a message with more than one line in it.";
SpeechBalloon balloon =
new SpeechBalloon(ul,200,te,message);
balloon.draw(g);
p.show();
}
} // end of SpeechBalloon class
package edu.gatech.mediacomp;
import java.awt.Rectangle;
import java.awt.image.BufferedImage;
import java.awt.Robot;
/**
* Class that is Runnable to start Movie Capture and
* stop it
* Copyright Georgia Institute of Technology 2007
* @author Barb Ericson ericson@cc.gatech.edu
*/
public class StartMovieCapture implements Runnable
{
/** the frame sequencer to use to write out the frames */
private FrameSequencer frameSequencer = null;
/** the number of frames per second to capture */
private int framesPerSecond = 16;
/** the region to capture */
private Rectangle region = null;
/** the active thread */
private Thread active = null;
/**
* Constructor that takes the frame sequencer, number of
* frames per second, and the region to capture
* @param sequencer the frame sequencer
* @param framesPerSec the number of frames per second
* @param area the region to capture
*/
public StartMovieCapture(FrameSequencer sequencer,
int framesPerSec,
Rectangle area)
{
frameSequencer = sequencer;
framesPerSecond = framesPerSec;
region = area;
}
/**
* Method to capture a picture
*/
public void capturePicture()
{
BufferedImage image = null;
try {
image = new Robot().createScreenCapture(region);
} catch (Exception ex) {
System.out.println("caught exception while taking a picture");
}
Picture p = new Picture(image);
frameSequencer.addFrame(p);
}
/**
* Method to capture a movie until the stop
* method is called and sets the active thread
* to null
*/
public void captureMovie()
{
boolean done = false;
BufferedImage image = null;
long startTime = 0;
long endTime = 0;
int timeToSleep = (int) (1000 / framesPerSecond);
int actualTime = timeToSleep;
int count = 0;
Thread current = Thread.currentThread();
while (current == active)
{
try {
startTime = System.currentTimeMillis();
image = new Robot().createScreenCapture(region);
frameSequencer.addFrame(new Picture(image));
endTime = System.currentTimeMillis();
if (endTime - startTime < timeToSleep)
Thread.sleep(timeToSleep-(endTime-startTime));
} catch (Exception ex) {
System.out.println("caught exception in StartMovieCapture");
done = true;
}
}
}
/**
* Method to start the thread
*/
public void run()
{
active = Thread.currentThread();
captureMovie();
}
/**
* Method to stop the thread
*/
public void stop()
{
active = null;
}
}
package edu.gatech.mediacomp;
/*
* conversion tools from tritonus (http://www.tritonus.org)
*/
/*
* TConversionTool.java
*/
/*
* Copyright (c) 1999,2000 by Florian Bomers <florian@bome.com>
* Copyright (c) 2000 by Matthias Pfisterer <matthias.pfisterer@gmx.de>
*
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU Library General Public License as
* published by the Free Software Foundation; either version 2 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Library General Public License for more details.
*
* You should have received a copy of the GNU Library General Public
* License along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*
*/
public class TConversionTool
{
/**
* Converts 2 successive bytes starting at <code>byteOffset</code> in
* <code>buffer</code> to a signed integer sample with 16bit range.
* <p>
* For little endian, buffer[byteOffset] is interpreted as low byte,
* whereas it is interpreted as high byte in big endian.
* <p> This is a reference function.
*/
public static int bytesToInt16( byte [] buffer, int byteOffset,
boolean bigEndian)
{
return bigEndian?
((buffer[byteOffset]<<8) | (buffer[byteOffset+1] & 0xFF)):
((buffer[byteOffset+1]<<8) | (buffer[byteOffset] & 0xFF));
}
/**
* Converts 3 successive bytes starting at <code>byteOffset</code> in
* <code>buffer</code> to a signed integer sample with 24bit range.
* <p>
* For little endian, buffer[byteOffset] is interpreted as lowest byte,
* whereas it is interpreted as highest byte in big endian.
* <p> This is a reference function.
*/
public static int bytesToInt24( byte [] buffer, int byteOffset,
boolean bigEndian)
{
return bigEndian?
((buffer[byteOffset]<<16) // let Java handle sign-bit
| ((buffer[byteOffset+1] & 0xFF)<<8) // inhibit sign-bit handling
| ((buffer[byteOffset+2] & 0xFF))):
((buffer[byteOffset+2]<<16) // let Java handle sign-bit
| ((buffer[byteOffset+1] & 0xFF)<<8) // inhibit sign-bit handling
| (buffer[byteOffset] & 0xFF));
}
/**
* Converts a 4 successive bytes starting at <code>byteOffset</code> in
* <code>buffer</code> to a signed 32bit integer sample.
* <p>
* For little endian, buffer[byteOffset] is interpreted as lowest byte,
* whereas it is interpreted as highest byte in big endian.
* <p> This is a reference function.
*/
public static int bytesToInt32( byte [] buffer, int byteOffset,
boolean bigEndian)
{
return bigEndian?
((buffer[byteOffset]<<24) // let Java handle sign-bit
| ((buffer[byteOffset+1] & 0xFF)<<16) // inhibit sign-bit handling
| ((buffer[byteOffset+2] & 0xFF)<<8) // inhibit sign-bit handling
| (buffer[byteOffset+3] & 0xFF)):
((buffer[byteOffset+3]<<24) // let Java handle sign-bit
| ((buffer[byteOffset+2] & 0xFF)<<16) // inhibit sign-bit handling
| ((buffer[byteOffset+1] & 0xFF)<<8) // inhibit sign-bit handling
| (buffer[byteOffset] & 0xFF));
}
/////////////////////// ULAW ///////////////////////////////////////////
private static final boolean ZEROTRAP=true;
private static final short BIAS=0x84;
private static final int CLIP=32635;
private static final int exp_lut1[] ={
0,0,1,1,2,2,2,2,3,3,3,3,3,3,3,3,
4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,
5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,
5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,
6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,
6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,
6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,
6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,
7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,
7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,
7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,
7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,
7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,
7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,
7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,
7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7
};
/* u-law to linear conversion table */
private static short [] u2l = {
-32124, -31100, -30076, -29052, -28028, -27004, -25980, -24956,
-23932, -22908, -21884, -20860, -19836, -18812, -17788, -16764,
-15996, -15484, -14972, -14460, -13948, -13436, -12924, -12412,
-11900, -11388, -10876, -10364, -9852, -9340, -8828, -8316,
-7932, -7676, -7420, -7164, -6908, -6652, -6396, -6140,
-5884, -5628, -5372, -5116, -4860, -4604, -4348, -4092,
-3900, -3772, -3644, -3516, -3388, -3260, -3132, -3004,
-2876, -2748, -2620, -2492, -2364, -2236, -2108, -1980,
-1884, -1820, -1756, -1692, -1628, -1564, -1500, -1436,
-1372, -1308, -1244, -1180, -1116, -1052, -988, -924,
-876, -844, -812, -780, -748, -716, -684, -652,
-620, -588, -556, -524, -492, -460, -428, -396,
-372, -356, -340, -324, -308, -292, -276, -260,
-244, -228, -212, -196, -180, -164, -148, -132,
-120, -112, -104, -96, -88, -80, -72, -64,
-56, -48, -40, -32, -24, -16, -8, 0,
32124, 31100, 30076, 29052, 28028, 27004, 25980, 24956,
23932, 22908, 21884, 20860, 19836, 18812, 17788, 16764,
15996, 15484, 14972, 14460, 13948, 13436, 12924, 12412,
11900, 11388, 10876, 10364, 9852, 9340, 8828, 8316,
7932, 7676, 7420, 7164, 6908, 6652, 6396, 6140,
5884, 5628, 5372, 5116, 4860, 4604, 4348, 4092,
3900, 3772, 3644, 3516, 3388, 3260, 3132, 3004,
2876, 2748, 2620, 2492, 2364, 2236, 2108, 1980,
1884, 1820, 1756, 1692, 1628, 1564, 1500, 1436,
1372, 1308, 1244, 1180, 1116, 1052, 988, 924,
876, 844, 812, 780, 748, 716, 684, 652,
620, 588, 556, 524, 492, 460, 428, 396,
372, 356, 340, 324, 308, 292, 276, 260,
244, 228, 212, 196, 180, 164, 148, 132,
120, 112, 104, 96, 88, 80, 72, 64,
56, 48, 40, 32, 24, 16, 8, 0
};
public static short ulaw2linear( byte ulawbyte)
{
return u2l[ulawbyte & 0xFF];
}
/**
* Converts a linear signed 16bit sample to a uLaw byte.
* Ported to Java by fb.
* <BR>Originally by:<BR>
* Craig Reese: IDA/Supercomputing Research Center <BR>
* Joe Campbell: Department of Defense <BR>
* 29 September 1989 <BR>
*/
public static byte linear2ulaw(int sample) {
int sign, exponent, mantissa, ulawbyte;
if (sample>32767) sample=32767;
else if (sample<-32768) sample=-32768;
/* Get the sample into sign-magnitude. */
sign = (sample >> 8) & 0x80; /* set aside the sign */
if (sign != 0) sample = -sample; /* get magnitude */
if (sample > CLIP) sample = CLIP; /* clip the magnitude */
/* Convert from 16 bit linear to ulaw. */
sample = sample + BIAS;
exponent = exp_lut1[(sample >> 7) & 0xFF];
mantissa = (sample >> (exponent + 3)) & 0x0F;
ulawbyte = ~(sign | (exponent << 4) | mantissa);
if (ZEROTRAP)
if (ulawbyte == 0) ulawbyte = 0x02; /* optional CCITT trap */
return((byte) ulawbyte);
}
/*
* This source code is a product of Sun Microsystems, Inc. and is provided
* for unrestricted use. Users may copy or modify this source code without
* charge.
*
* linear2alaw() - Convert a 16-bit linear PCM value to 8-bit A-law
*
* linear2alaw() accepts an 16-bit integer and encodes it as A-law data.
*
* Linear Input Code Compressed Code
* ------------------------ ---------------
* 0000000wxyza 000wxyz
* 0000001wxyza 001wxyz
* 000001wxyzab 010wxyz
* 00001wxyzabc 011wxyz
* 0001wxyzabcd 100wxyz
* 001wxyzabcde 101wxyz
* 01wxyzabcdef 110wxyz
* 1wxyzabcdefg 111wxyz
*
* For further information see John C. Bellamy's Digital Telephony, 1982,
* John Wiley & Sons, pps 98-111 and 472-476.
*/
private static final byte QUANT_MASK = 0xf; /* Quantization field mask. */
private static final byte SEG_SHIFT = 4; /* Left shift for segment number. */
private static final short[] seg_end = {
0xFF, 0x1FF, 0x3FF, 0x7FF, 0xFFF, 0x1FFF, 0x3FFF, 0x7FFF
};
/*
* conversion table alaw to linear
*/
private static short [] a2l = {
-5504, -5248, -6016, -5760, -4480, -4224, -4992, -4736,
-7552, -7296, -8064, -7808, -6528, -6272, -7040, -6784,
-2752, -2624, -3008, -2880, -2240, -2112, -2496, -2368,
-3776, -3648, -4032, -3904, -3264, -3136, -3520, -3392,
-22016, -20992, -24064, -23040, -17920, -16896, -19968, -18944,
-30208, -29184, -32256, -31232, -26112, -25088, -28160, -27136,
-11008, -10496, -12032, -11520, -8960, -8448, -9984, -9472,
-15104, -14592, -16128, -15616, -13056, -12544, -14080, -13568,
-344, -328, -376, -360, -280, -264, -312, -296,
-472, -456, -504, -488, -408, -392, -440, -424,
-88, -72, -120, -104, -24, -8, -56, -40,
-216, -200, -248, -232, -152, -136, -184, -168,
-1376, -1312, -1504, -1440, -1120, -1056, -1248, -1184,
-1888, -1824, -2016, -1952, -1632, -1568, -1760, -1696,
-688, -656, -752, -720, -560, -528, -624, -592,
-944, -912, -1008, -976, -816, -784, -880, -848,
5504, 5248, 6016, 5760, 4480, 4224, 4992, 4736,
7552, 7296, 8064, 7808, 6528, 6272, 7040, 6784,
2752, 2624, 3008, 2880, 2240, 2112, 2496, 2368,
3776, 3648, 4032, 3904, 3264, 3136, 3520, 3392,
22016, 20992, 24064, 23040, 17920, 16896, 19968, 18944,
30208, 29184, 32256, 31232, 26112, 25088, 28160, 27136,
11008, 10496, 12032, 11520, 8960, 8448, 9984, 9472,
15104, 14592, 16128, 15616, 13056, 12544, 14080, 13568,
344, 328, 376, 360, 280, 264, 312, 296,
472, 456, 504, 488, 408, 392, 440, 424,
88, 72, 120, 104, 24, 8, 56, 40,
216, 200, 248, 232, 152, 136, 184, 168,
1376, 1312, 1504, 1440, 1120, 1056, 1248, 1184,
1888, 1824, 2016, 1952, 1632, 1568, 1760, 1696,
688, 656, 752, 720, 560, 528, 624, 592,
944, 912, 1008, 976, 816, 784, 880, 848
};
public static short alaw2linear( byte ulawbyte)
{
return a2l[ulawbyte & 0xFF];
}
public static byte linear2alaw(short pcm_val)
/* 2's complement (16-bit range) */
{
byte mask;
byte seg=8;
byte aval;
if (pcm_val >= 0) {
mask = (byte) 0xD5; /* sign (7th) bit = 1 */
} else {
mask = 0x55; /* sign bit = 0 */
pcm_val = (short) (-pcm_val - 8);
}
/* Convert the scaled magnitude to segment number. */
for (int i = 0; i < 8; i++) {
if (pcm_val <= seg_end[i]) {
seg=(byte) i;
break;
}
}
/* Combine the sign, segment, and quantization bits. */
if (seg >= 8) /* out of range, return maximum value. */
return (byte) ((0x7F ^ mask) & 0xFF);
else {
aval = (byte) (seg << SEG_SHIFT);
if (seg < 2)
aval |= (pcm_val >> 4) & QUANT_MASK;
else
aval |= (pcm_val >> (seg + 3)) & QUANT_MASK;
return (byte) ((aval ^ mask) & 0xFF);
}
}
/**
* Converts a 16 bit sample of type <code>int</code> to 2 bytes in an array.
* <code>sample</code> is interpreted as signed (as Java does).
* <p>
* For little endian, buffer[byteOffset] is filled with low byte of sample,
* and buffer[byteOffset+1] is filled with high byte of sample + sign bit.
* <p> For big endian, this is reversed.
* <p> Before calling this function, it should be assured that
* <code>sample</code> is in the 16bit range - it will not be clipped.
* <p> This is a reference function.
*/
public static void intToBytes16( int sample, byte [] buffer, int byteOffset,
boolean bigEndian)
{
if (bigEndian)
{
buffer[byteOffset++]=( byte ) (sample >> 8);
buffer[byteOffset]=( byte ) (sample & 0xFF);
}
else
{
buffer[byteOffset++]=( byte ) (sample & 0xFF);
buffer[byteOffset]=( byte ) (sample >> 8);
}
}
/**
* Converts a 24 bit sample of type <code>int</code> to 3 bytes in an array.
* <code>sample</code> is interpreted as signed (as Java does).
* <p>
* For little endian, buffer[byteOffset] is filled with low byte of sample,
* and buffer[byteOffset+2] is filled with the high byte of sample +
* sign bit.
* <p> For big endian, this is reversed.
* <p> Before calling this function, it should be assured that
* <code>sample</code> is in the 24bit range - it will not be clipped.
* <p> This is a reference function.
*/
public static void intToBytes24( int sample, byte [] buffer,
int byteOffset, boolean bigEndian)
{
if (bigEndian)
{
buffer[byteOffset++]=( byte ) (sample >> 16);
buffer[byteOffset++]=( byte ) ((sample >>> 8) & 0xFF);
buffer[byteOffset]=( byte ) (sample & 0xFF);
}
else
{
buffer[byteOffset++]=( byte ) (sample & 0xFF);
buffer[byteOffset++]=( byte ) ((sample >>> 8) & 0xFF);
buffer[byteOffset]=( byte ) (sample >> 16);
}
}
/**
* Converts a 32 bit sample of type <code>int</code> to 4 bytes in an array.
* <code>sample</code> is interpreted as signed (as Java does).
* <p>
* For little endian, buffer[byteOffset] is filled with lowest byte of
* sample, and buffer[byteOffset+3] is filled with the high byte of
* sample + sign bit.
* <p> For big endian, this is reversed.
* <p> This is a reference function.
*/
public static void intToBytes32( int sample, byte [] buffer,
int byteOffset, boolean bigEndian)
{
if (bigEndian)
{
buffer[byteOffset++]=( byte ) (sample >> 24);
buffer[byteOffset++]=( byte ) ((sample >>> 16) & 0xFF);
buffer[byteOffset++]=( byte ) ((sample >>> 8) & 0xFF);
buffer[byteOffset]=( byte ) (sample & 0xFF);
}
else
{
buffer[byteOffset++]=( byte ) (sample & 0xFF);
buffer[byteOffset++]=( byte ) ((sample >>> 8) & 0xFF);
buffer[byteOffset++]=( byte ) ((sample >>> 16) & 0xFF);
buffer[byteOffset]=( byte ) (sample >> 24);
}
}
/*
* Byte<->Int conversions for unsigned pcm data were written
* by myself with help from Real's Java How-To:
* http://www.rgagnon.com/javadetails/java-0026.html
*/
public static int unsignedByteToInt(byte b)
{
/*
* & 0xFF while seemingly doing nothing to the individual bits,
* forces java to recognize the byte as unsigned. so, we return to
* the calling function a number between 0 and 256.
*/
return ((int) b & 0xFF);
}
public static int unsignedByteToInt16(byte[] buffer, int offset,
boolean isBigEndian)
{
/*
* here, we want to take the first byte and shift it left
* 8 bits then concatenate on the 8 bits in the second byte.
* now we have a 16 bit number that java will recognize as
* unsigned, so we return a number in the range [0, 65536]
*/
if(isBigEndian)
{
return ( (unsignedByteToInt(buffer[offset]) << 8) |
unsignedByteToInt(buffer[offset+1]) );
}
else
{
return( (unsignedByteToInt(buffer[offset+1]) << 8) |
unsignedByteToInt(buffer[offset]));
}
}
public static int unsignedByteToInt24(byte[] buffer, int offset,
boolean isBigEndian)
{
if(isBigEndian)
{
return ( (unsignedByteToInt(buffer[offset]) << 16) |
(unsignedByteToInt(buffer[offset+1]) << 8) |
unsignedByteToInt(buffer[offset+2]));
}
else
{
return ( (unsignedByteToInt(buffer[offset+2]) << 16) |
(unsignedByteToInt(buffer[offset+1]) << 8) |
unsignedByteToInt(buffer[offset]));
}
}
public static int unsignedByteToInt32(byte[] buffer, int offset,
boolean isBigEndian)
{
if(isBigEndian)
{
return( (unsignedByteToInt(buffer[offset]) << 24) |
(unsignedByteToInt(buffer[offset+1]) << 16) |
(unsignedByteToInt(buffer[offset+2]) << 8) |
unsignedByteToInt(buffer[offset+3]) );
}
else
{
return((unsignedByteToInt(buffer[offset+3]) << 24) |
(unsignedByteToInt(buffer[offset+2]) << 16) |
(unsignedByteToInt(buffer[offset+1]) << 8) |
unsignedByteToInt(buffer[offset]) );
}
}
public static byte intToUnsignedByte(int sample)
{
/*
* does the reverse of the function above
* we have an integer that is signed, so we're in the range
* [-128, 127], we want to convert to an unsigned number in
* the range [0,256], then put that into an unsigned byte
* all while java tries to treat everythign as signed.
*
* so.... say we want to set the sample value to -128
* in our unsigned byte, this translates to 0, so we want
* java's representation of -128: 10000000 to instead be stored
* as 0: 00000000 so, we simply xor with -128, flipping the sign bit
*
* another example we want to store the max value 127: 01111111
* translating into the unsigned range, the max is 256: 11111111
* again, you can see all we need to change is the sign bit.
*
* and lastly, for something in the middle:
* say we want to store the value 0: 00000000
* translating into the unsigned range, we have the middle
* value 128: 10000000
* again, we just want to flip the first bit
*
* something a little more tricky... say we want to store the value 32
* now this translates to 32--128 = 160 in unsigned representation
* so we start with 32 = 00100000 and we want to go to
* 160 = 10100000
*
* see, we just flip the sign bit, its the same as adding 128 which
* is how we translate between [-128,127] and [0,256].
*/
return((byte)(sample ^ -128));
}
public static void intToUnsignedBytes16(int sample, byte [] buffer,
int byteOffset, boolean bigEndian)
{
/*
* for this comment only, treat ^ not as XOR as we use it in java
* but as an exponent symbol like on a calculator, i thought 2^15
* would be clearer than 32768.
* the theory here is very simmilar to the 8 bit conversion we
* did above. only now we have 16 bits we want to write into.
* so, we're going from the range [-2^15, 2^15-1] into the range
* [0, 2^16]. again, to translate, we just need to add 2^15 to
* our number, so we get the first byte, by shifting right 8 bits,
* (note: >>> is unsigned shift), and then XOR with -128 to flip the
* sign bit. for the second byte, we just want the last 8 bits
* of our integer, so we & with 0xff to tell java to treat this
* as unsigned, and just copy over the bit values.
*/
if(bigEndian)
{
buffer[byteOffset] = (byte)(sample >>> 8 ^ -128);
buffer[byteOffset+1] = (byte)(sample & 0xff);
}
else
{
buffer[byteOffset+1] = (byte)(sample >>> 8 ^ -128);
buffer[byteOffset] = (byte)(sample & 0xff);
}
}
public static void intToUnsignedBytes24(int sample, byte [] buffer,
int byteOffset, boolean bigEndian)
{
if(bigEndian)
{
buffer[byteOffset] = (byte)(sample >>> 16 ^ -128);
buffer[byteOffset+1] = (byte)(sample >>> 8);
buffer[byteOffset +2] = (byte)(sample & 0xff);
}
else
{
buffer[byteOffset+2] = (byte)(sample >>> 16 ^ -128);
buffer[byteOffset+1] = (byte)(sample >>> 8);
buffer[byteOffset] = (byte)(sample & 0xff);
}
}
public static void intToUnsignedBytes32(int sample, byte [] buffer,
int byteOffset, boolean bigEndian)
{
if(bigEndian)
{
buffer[byteOffset] = (byte)(sample >>> 24 ^ -128);
buffer[byteOffset+1] = (byte)(sample >>> 16);
buffer[byteOffset+2] = (byte)(sample >>> 8);
buffer[byteOffset+3] = (byte)(sample & 0xff);
}
else
{
buffer[byteOffset+3] = (byte)(sample >>> 24 ^ -128);
buffer[byteOffset+2] = (byte)(sample >>> 16);
buffer[byteOffset+1] = (byte)(sample >>> 8);
buffer[byteOffset] = (byte)(sample & 0xff);
}
}
}
package edu.gatech.mediacomp;
/**
* Class for simple testing
*
* Copyright Georgia Institute of Technology 2004
* @author Barb Ericson ericson@cc.gatech.edu
*/
public class Test
{
public static void main (String[] args)
{
// replace the lines below to test something else
System.out.println(34 + 56);
System.out.println(26 - 3);
System.out.println(3 * 4);
System.out.println(4/2);
}
} // end of Test class
package edu.gatech.mediacomp;
import java.awt.Point;
import java.awt.font.*;
import java.awt.*;
import java.text.*;
import java.awt.geom.*;
import java.util.*;
/**
* TextBalloon: this is used to
* represent objects
* in comic strips which are used to show
* what a character is saying or thinking. The tip of
* tail points to the character who is
* talking or thinking the text
* @author Barb Ericson
*/
public abstract class TextBalloon
{
////////////// fields ////////////////
/** top left point of text balloon */
private Point upperLeft;
/** width of balloon showing text */
private int width;
/** Amount of space to leave at each end of the balloon */
private int margin = 5;
/** end of triangular tail pointing to speaker */
private Point tailEnd;
/** text in the balloon */
private String message;
/** font to draw the text with */
private Font font = new Font("Arial",Font.BOLD,14);
/** the number of lines of text in balloon */
private int numLines = 0;
///////////// constructors //////////////////
/**
* Constructor that takes the upper left, width,
* tail end, and message to display
* @param uLeft the upper left corner of a rectangle
* enclosing the balloon
* @param theWidth the width of the enclosing rectangle
* @param tEnd the point which is the end of the tail
* that shows who is speaking or thinking
* @param theMessage the message to display
*/
public TextBalloon (Point uLeft, int theWidth,
Point tEnd, String theMessage)
{
this.upperLeft = uLeft;
this.width = theWidth;
this.tailEnd = tEnd;
this.message = theMessage.toUpperCase();
}
//////////// methods ////////////////
/**
* Method to get the upper left point of
* the rectangle that encloses the balloon
* @return the upper left point
*/
public Point getUpperLeft()
{ return this.upperLeft;}
/**
* Method to set the upper left point of
* the rectangle that encloses the balloon
* @param p the upper left point to use
*/
public void setUpperLeft(Point p)
{ this.upperLeft = p; }
/**
* Method to get the width of the rectangle
* that encloses the balloon
* @return the width of the enclosing rectangle
*/
public int getWidth()
{ return this.width; }
/**
* Method to set the width of the rectangle
* that encloses the balloon
* @param theWidth the new width to use
*/
public void setWidth(int theWidth)
{ this.width = theWidth; }
/**
* Method to get the margin
* @return the margin in pixels
*/
public int getMargin()
{ return this.margin; }
/**
* Method to set the margin
* @param theMargin the new margin to use
*/
public void setMargin(int theMargin)
{ this.margin = theMargin; }
/**
* Method to get the point that is the end
* of the tail that indicates who is speaking
* @return the end point of the tail
*/
public Point getTailEnd()
{ return this.tailEnd; }
/**
* Method to set the end point of the tail
* which indicates who is speaking
* @param p the end point to use
*/
public void setTailEnd(Point p)
{ this.tailEnd = p; }
/**
* Method to get the message that is
* displayed in the balloon
* @return the message to display
*/
public String getMessage()
{ return this.message; }
/**
* Method to set the message that is
* displayed in the balloon
* @param theMessage the message to use
*/
public void setMessage(String theMessage)
{
this.message = theMessage;
}
/**
* Method to get the font used to display
* the message
* @return the font used
*/
public Font getFont()
{ return this.font; }
/**
* Method to set the font used to display
* the balloon
* @param theFont the font to use
*/
public void setFont(Font theFont)
{ this.font = theFont; }
/**
* Method to get the number of lines of text.
* This will be 0 until getHeight is called
* and then it will be set correctly.
* @return the number of lines of text
*/
public int getNumLines()
{ return this.numLines; }
/**
* Method to get the height of the balloon
* @param g2 the grahics 2d context to draw in
* @param attrCharIter the attributed character iterator
* that is used to display the text
* @return the height in pixels
*/
public int getHeight(Graphics2D g2,
AttributedCharacterIterator attrCharIter)
{
FontRenderContext frc = g2.getFontRenderContext();
LineBreakMeasurer measurer =
new LineBreakMeasurer(attrCharIter,frc);
TextLayout layout = null;
int height = 0;
Rectangle2D bounds = null;
int adWidth = this.width - (2 * this.margin);
while ((layout = measurer.nextLayout(adWidth)) !=
null)
{
numLines++;
height+=layout.getAscent() + layout.getDescent() +
layout.getLeading();
}
height+=(2 * margin);
return height;
}
/**
* Method to get the attributed character iterator
* used to display the text
* @return the attributed character iterator
*/
protected AttributedCharacterIterator getAttrIterator()
{
Hashtable<TextAttribute,Font> map =
new Hashtable<TextAttribute,Font>();
map.put(TextAttribute.FONT, this.font);
AttributedString attrString = new AttributedString(message,map);
return attrString.getIterator();
}
/**
* Method to draw the speech balloon
* @param ellipseHeight the height of the ellipse
* @param fillColor the color to fill with
* @param outlineColor the color to outline with
* @param g2 the 2d graphics context
*/
protected void drawBalloon(int ellipseHeight,
Color fillColor,
Color outlineColor,
Graphics2D g2)
{
// draw the background rounded rectangle
int margin = getMargin();
Point upperLeft = getUpperLeft();
int width = getWidth();
g2.setColor(fillColor);
float x = upperLeft.x + margin;
float y = upperLeft.y + margin;
RoundRectangle2D.Double rect =
new RoundRectangle2D.Double(upperLeft.x,
upperLeft.y,
width,
ellipseHeight,
10, 10);
g2.fill(rect);
g2.setColor(outlineColor);
g2.draw(rect);
}
/**
* Method to draw the text in the balloon
* @param measurer the line break measurer
* @param textColor the color to draw the text in
* @param g2 the 2d graphics context
*/
protected void drawText(LineBreakMeasurer measurer,
Color textColor,
Graphics2D g2)
{
int margin = getMargin();
int width = getWidth();
int halfWidth = width / 2;
Point upperLeft = getUpperLeft();
TextLayout layout = null;
int x = upperLeft.x + margin;
int y = upperLeft.y + margin;
// draw the text
g2.setColor(textColor);
Rectangle2D bounds = null;
int adWidth = width - (2 * margin);
while ((layout = measurer.nextLayout(adWidth)) != null)
{
// if only one line center text in balloon
if (getNumLines() == 1)
{
bounds = layout.getBounds();
x = upperLeft.x + halfWidth -(int)(bounds.getWidth() * 0.5);
}
y += layout.getAscent();
layout.draw(g2,x,y);
y += layout.getDescent() + layout.getLeading();
}
}
/**
* Method to draw the tail of the balloon
*/
protected abstract void drawTail(int ellipseHeight,
Color fillColor,
Color outlineColor,
Graphics2D g2);
/**
* Method to draw the text
* ballon using the passed graphics
* context
* @param g the graphics context to draw on
*/
public void draw(Graphics g)
{
// cast to graphics 2d and set colors
Graphics2D g2 = (Graphics2D) g;
Color fillColor = Color.WHITE;
Color outlineColor = Color.BLACK;
// get the font render context
FontRenderContext frc = g2.getFontRenderContext();
// get the attributed character iterator
AttributedCharacterIterator attrCharIter =
this.getAttrIterator();
// get the height of the ellipse
int ellipseHeight = this.getHeight(g2, attrCharIter);
// draw the balloon
drawBalloon(ellipseHeight,fillColor,
outlineColor,g2);
// draw the tail to the speaker
drawTail(ellipseHeight,fillColor,
outlineColor,g2);
// draw message
LineBreakMeasurer measurer =
new LineBreakMeasurer(attrCharIter,frc);
drawText(measurer,outlineColor,g2);
}
} // end of TextBalloon class
package edu.gatech.mediacomp;
import java.awt.Point;
import java.awt.font.*;
import java.awt.*;
import java.text.*;
import java.awt.geom.*;
import java.util.*;
/**
* ThoughtBalloon: this is used to
* represent objects
* in comic strips which are used to show
* what a character is thinking. The tip of
* tail points to the character who is
* doing the thinking
* @author Barb Ericson ericson@cc.gatech.edu
* Copyright 2005
*/
public class ThoughtBalloon extends TextBalloon
{
///////////// constructors //////////////////
/**
* Constructor that takes the upper left, width,
* tail end, and message to display
* @param uLeft the upper left corner of a rectangle
* enclosing the balloon
* @param theWidth the width of the enclosing rectangle
* @param tEnd the point which is the end of the tail
* that shows who is speaking
* @param theMessage the message to display
*/
public ThoughtBalloon (Point uLeft, int theWidth,
Point tEnd, String theMessage)
{
super(uLeft,theWidth,tEnd,theMessage);
}
//////////// methods ////////////////
/**
* Method to draw the passed ellipse
* @param g2 the 2d graphics context
* @param fillColor the color to fill with
* @param outlineColor the color to outline with
* @param ellipse the ellipse to draw
*/
private void drawEllipse(Graphics2D g2,
Color fillColor,
Color outlineColor,
Ellipse2D.Double ellipse)
{
g2.setColor(fillColor);
g2.fill(ellipse);
g2.setColor(outlineColor);
g2.draw(ellipse);
}
/**
* Method to draw a circle of a given width
* @param circleTop the top point on the circle
* @param heading the heading in degrees with 0
* being north
* @param width the width of the circle
* @param distance the distance from the start point
* @param startPoint the point to start the distance
* from
* @param g2 the 2d graphics context used for drawing
* @return a point on the circle at the given distance
* away from the start point
*/
public Point drawCircle(Point circleTop,
double heading,
double width,
double distance,
Point startPoint,
Color fillColor,
Color outlineColor,
Graphics2D g2)
{
Point p2 = Geometry.getPointAtDistance(startPoint,
heading,
distance);
Ellipse2D.Double circle =
new Ellipse2D.Double(circleTop.x - (width / 2),
circleTop.y,
width, width);
drawEllipse(g2,fillColor,outlineColor,circle);
return p2;
}
/**
* Method to draw the circles from the
* bottom of the text balloon to the tail
* end point
* @param g2 the 2d graphics context
* @param fillColor the color to fill the
* circle with
* @param outlineColor the color to outline
* the circle with
* @param height the height of the circles
*/
private void drawCircles(Graphics2D g2,
Color fillColor,
Color outlineColor,
int height)
{
Point upperLeft = getUpperLeft();
int startX = upperLeft.x + (getWidth() / 2);
int startY = height + upperLeft.y;
Point tailStart = new Point(startX,startY);
Point tailEnd = getTailEnd();
double totalDistance = 0;
double distance = Geometry.getDistance(startX,startY,
tailEnd.x,tailEnd.y);
double heading = Geometry.getTurtleHeading(startX,startY,
tailEnd.x,tailEnd.y);
Point nextPoint = null;
// if the distance is less than 3 do nothing
if (distance < 3) {
}
// if distance <= 6 draw 1 circle of distance width
else if (distance <= 6) {
drawCircle(tailStart, heading, distance,
distance,tailStart,fillColor,
outlineColor,g2);
// draw 2 circles
} else if (distance <= 10) {
// draw one of size 6
nextPoint = drawCircle(tailStart,heading,6,6,
tailStart,fillColor,
outlineColor,g2);
// and another of remaining size
distance = distance - 6;
totalDistance = 6 + distance;
drawCircle(nextPoint,heading,distance,
totalDistance,tailStart,
fillColor,outlineColor,g2);
} else {
// draw one of size 10
nextPoint = drawCircle(tailStart,heading,10,10,
tailStart,
fillColor,outlineColor,g2);
distance = distance - 10;
// if more room draw a size 6 one
if (distance >= 6) {
totalDistance = 10 + 6;
nextPoint = drawCircle(nextPoint,heading,6,
totalDistance,tailStart,
fillColor,outlineColor,g2);
distance = distance - 6;
}
// draw size 4 ones with space of 2 pixels between
while (distance >= 6)
{
totalDistance += 2;
distance = distance - 2;
nextPoint = Geometry.getPointAtDistance(tailStart,
heading,
totalDistance);
totalDistance = totalDistance + 4;
nextPoint = drawCircle(nextPoint,heading,4,
totalDistance,tailStart,
fillColor,outlineColor,g2);
distance = distance - 4;
}
}
}
/**
* Method to draw the thought
* ballon using the passed graphics
* context
* @param ellipseHeight the height of
* the ellipse
* @param fillColor the color to fill the tail
* with
* @param outlineColor the color to outline
* the tail with
* @param g2 the 2D graphics context
*/
protected void drawTail(int ellipseHeight,
Color fillColor,
Color outlineColor,
Graphics2D g2)
{
// draw the circles to the speaker
drawCircles(g2,fillColor,
outlineColor,ellipseHeight);
}
public static void main(String[] args)
{
Picture p = new Picture(FileChooser.getMediaPath("horse.jpg"));
Graphics g = p.getGraphics();
Point ul = new Point(68,24);
Point te = new Point(179,127);
String message = "This is a test." +
" Of a message with more than one line in it.";
ThoughtBalloon balloon = new ThoughtBalloon(ul,200,te,
message);
balloon.draw(g);
p.explore();
}
} // end of SpeechBalloon class
package edu.gatech.mediacomp;
public class TurlteDropTest
{
public static void main(String[] args)
{
World world = new World();
Turtle turtle = new Turtle(world);
Picture p =
new Picture(FileChooser.getMediaPath("flower1.jpg"));
turtle.penUp();
for (int i = 45; i < 360; i=i+45)
{
turtle.drop(p);
turtle.turn(i);
}
}
}
package edu.gatech.mediacomp;
import java.util.*;
import java.awt.*;
/**
* Class that represents a turtle which is similar to a Logo turtle.
* This class inherts from SimpleTurtle and is for students
* to add methods to.
*
* Copyright Georgia Institute of Technology 2004
* @author Barb Ericson ericson@cc.gatech.edu
*/
public class Turtle extends SimpleTurtle
{
////////////////// constructors ///////////////////////
/** Constructor that takes the x and y and a picture to
* draw on
* @param x the starting x position
* @param y the starting y position
* @param picture the picture to draw on
*/
public Turtle (int x, int y, Picture picture)
{
// let the parent constructor handle it
super(x,y,picture);
}
/** Constructor that takes the x and y and a model
* display to draw it on
* @param x the starting x position
* @param y the starting y position
* @param modelDisplayer the thing that displays the model
*/
public Turtle (int x, int y,
ModelDisplay modelDisplayer)
{
// let the parent constructor handle it
super(x,y,modelDisplayer);
}
/** Constructor that takes the model display
* @param modelDisplay the thing that displays the model
*/
public Turtle (ModelDisplay modelDisplay)
{
// let the parent constructor handle it
super(modelDisplay);
}
/**
* Constructor that takes a picture to draw on
* @param p the picture to draw on
*/
public Turtle (Picture p)
{
// let the parent constructor handle it
super(p);
}
/////////////////// methods ///////////////////////
public static void main(String[] args)
{
World earth = new World();
Turtle t1 = new Turtle(earth);
t1.forward();
}
} // this } is the end of class Turtle, put all new methods before this
package edu.gatech.mediacomp;
import java.util.*;
public class TurtleTest
{
public static void main(String[] args)
{
Random randNumGen = new Random();
World world = new World(false);
Turtle[] turtleArray = new Turtle[1000];
for (int i=0; i < 1000; i++)
turtleArray[i] = new Turtle(world);
for (int i=0; i < 1000; i++)
{
turtleArray[i].turn(randNumGen.nextInt(360));
turtleArray[i].forward(100);
}
world.setVisible(true);
}
}
package edu.gatech.mediacomp;
import java.awt.image.BufferedImage;
import java.awt.Rectangle;
/**
* Interface for working with video capture
* Copyright Georgia Institute of Technology 2007
* @author Barb Ericson ericson@cc.gatech.edu
*/
public interface VideoCapturer
{
/** Method that captures the screen */
public BufferedImage captureScreen() throws Exception;
/** Method that sets a region to capture
* @param region the rectangular region to capture */
public void setRegion(java.awt.Rectangle region);
/** Method to start the capture */
public void startCapture();
/** Method to start the capture and capture numSeconds of video
* @param numSeconds the number of seconds to capture
*/
public void startCapture(int numSeconds);
/**
* Method to stop the capture
*/
public void stopCapture();
/**
* Method to play the captured movie
*/
public void playMovie();
/**
* Method to get the frame sequencer
* @return the frame sequencer used in the capture
*/
public FrameSequencer getFrameSequencer();
/**
* Method to get the region to capture
* @return the region to capture
*/
public Rectangle getRegion();
/**
* Method to return the number of frames per second
* @return the number of frames per second being captured
*/
public int getFramesPerSecond();
/**
* Method to set the number of frames per second
*/
public void setFramesPerSecond(int frameRate);
}
package edu.gatech.mediacomp;
import java.awt.Color;
import java.util.Random;
import java.util.Iterator;
/**
* Class that represents a wolf. The wolf class
* tracks all the living wolves with a linked list.
*
* @author Barb Ericson ericson@cc.gatech.edu
*/
public class Wolf extends Turtle
{
/////////////// fields //////////////////////
/** class constant for the color */
private static final Color WOLF_COLOR = Color.RED;
/** class constant for probability of turning */
private static final double PROB_OF_TURN = 1.0/10;
/** class constant for top speed (max num steps can move in a timestep) */
private static final int maxSpeed = 60;
/** random number generator */
private static Random randNumGen = new Random();
/** class variable for the last created wolf (head of linked list) */
private static Wolf head = null;
/** object variable for the next wolf in the linked list */
private Wolf next = null;
////////////////////////////// Constructors ////////////////////////
/**
* Constructor that takes the model display (the original
* position will be randomly assigned)
* @param modelDisplayer thing that displays the model
*/
public Wolf (ModelDisplay modelDisplayer)
{
super(randNumGen.nextInt(modelDisplayer.getWidth()),
randNumGen.nextInt(modelDisplayer.getHeight()),
modelDisplayer);
init();
}
/** Constructor that takes the x and y and a model
* display to draw it on
* @param x the starting x position
* @param y the starting y position
* @param modelDisplayer the thing that displays the model
*/
public Wolf (int x, int y, ModelDisplay modelDisplayer)
{
// let the parent constructor handle it
super(x,y,modelDisplayer);
init();
}
////////////////// methods ////////////////////////////////////////
/**
* Method to get the head of the linked list of wolves
* @return the head of the linked list (may be null)
*/
public static Wolf getHead() { return head; }
/**
* Method to get the next Wolf in the linked list
* @return the next wolf in the linked list of wolves
* or null
*/
public Wolf getNext() { return this.next; }
/**
* Method to initialize the new wolf object
*/
public void init()
{
// set the color of this wolf
setColor(WOLF_COLOR);
// add this deer to the linked list of wolf
if (head == null)
head = this;
else
{
this.next = head;
head = this;
}
// turn some random direction
this.turn(randNumGen.nextInt(360));
}
/**
* Method to get the closest deer within the passed distance
* to this wolf
* @param distance the distance to look within
* @return the closest deer in the given distance or null
*/
public Deer getClosestDeer(double distance)
{
// get the head of the deer linked list
Deer head = Deer.getHead();
Deer curr = head;
Deer closest = null;
double closestDistance = 0;
double currDistance = 0;
// loop through the linked list looking for the closest deer
while (curr != null)
{
currDistance = curr.getDistance(this.getXPos(),this.getYPos());
if (currDistance < distance)
{
if (closest == null || currDistance < closestDistance)
{
closest = curr;
closestDistance = currDistance;
}
}
curr = curr.getNext();
}
return closest;
}
/**
* Method to act during a time step
* pick a random direction and move some random amount up to top speed
*/
public void act()
{
// get the closest deer in some specified distance
Deer closeDeer = getClosestDeer(30);
if (closeDeer != null)
{
this.moveTo(closeDeer.getXPos(),closeDeer.getYPos());
closeDeer.die();
}
else
{
// if the randome number is <= prob of turning then turn
if (randNumGen.nextFloat() <= PROB_OF_TURN)
{
this.turn(randNumGen.nextInt(360));
}
// go forward some random amount
forward(randNumGen.nextInt(maxSpeed));
}
}
/** main method for testing */
public static void main(String[] args)
{
World w = new World();
// create some deer
int numDeer = 20;
for (int i = 0; i < numDeer; i++)
{
new Deer(w);
}
// create some wolves
int numWolves = 5;
for (int i = 0; i < numWolves; i++)
{
new Wolf(w);
}
// declare a wolf and deer
Wolf wolf = null;
Deer deer = null;
// loop for a set number of timesteps
for (int t = 0; t < 100; t++)
{
// loop through all the wolves
wolf = Wolf.getHead();
while (wolf != null)
{
wolf.act();
wolf = wolf.getNext();
}
// loop through all the deer
deer = Deer.getHead();
while (deer != null)
{
deer.act();
deer = deer.getNext();
}
// wait a bit
try {
Thread.sleep(1000);
} catch (Exception ex) {
}
}
}
}
package edu.gatech.mediacomp;
import javax.swing.*;
import java.util.List;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.Observer;
import java.awt.*;
/**
* Class to represent a 2d world that can hold turtles and
* display them
*
* Copyright Georgia Institute of Technology 2004
* @author Barb Ericson ericson@cc.gatech.edu
*/
public class World extends JComponent implements ModelDisplay
{
////////////////// fields ///////////////////////
/** should automatically repaint when model changed */
private boolean autoRepaint = true;
/** the background color for the world */
private Color background = Color.white;
/** the width of the world */
private int width = 640;
/** the height of the world */
private int height = 480;
/** the list of turtles in the world */
private List<Turtle> turtleList = new ArrayList<Turtle>();
/** the JFrame to show this world in */
private JFrame frame = new JFrame("World");
/** background picture */
private Picture picture = null;
////////////////// the constructors ///////////////
/**
* Constructor that takes no arguments
*/
public World()
{
// set up the world and make it visible
initWorld(true);
}
/**
* Constructor that takes a boolean to
* say if this world should be visible
* or not
* @param visibleFlag if true will be visible
* else if false will not be visible
*/
public World(boolean visibleFlag)
{
initWorld(visibleFlag);
}
/**
* Constructor that takes a width and height for this
* world
* @param w the width for the world
* @param h the height for the world
*/
public World(int w, int h)
{
width = w;
height = h;
// set up the world and make it visible
initWorld(true);
}
///////////////// methods ///////////////////////////
/**
* Method to initialize the world
* @param visibleFlag the flag to make the world
* visible or not
*/
private void initWorld(boolean visibleFlag)
{
// set the preferred size
this.setPreferredSize(new Dimension(width,height));
// create the background picture
picture = new Picture(width,height);
// add this panel to the frame
frame.getContentPane().add(this);
// pack the frame
frame.pack();
// show this world
frame.setVisible(visibleFlag);
}
/**
* Method to get the graphics context for drawing on
* @return the graphics context of the background picture
*/
public Graphics getGraphics() { return picture.getGraphics(); }
/**
* Method to clear the background picture
*/
public void clearBackground() { picture = new Picture(width,height); }
/**
* Method to get the background picture
* @return the background picture
*/
public Picture getPicture() { return picture; }
/**
* Method to set the background picture
* @param pict the background picture to use
*/
public void setPicture(Picture pict) { picture = pict; }
/**
* Method to paint this component
* @param g the graphics context
*/
public synchronized void paintComponent(Graphics g)
{
Turtle turtle = null;
// draw the background image
g.drawImage(picture.getImage(),0,0,null);
// loop drawing each turtle on the background image
Iterator iterator = turtleList.iterator();
while (iterator.hasNext())
{
turtle = (Turtle) iterator.next();
turtle.paintComponent(g);
}
}
/**
* Metod to get the last turtle in this world
* @return the last turtle added to this world
*/
public Turtle getLastTurtle()
{
return (Turtle) turtleList.get(turtleList.size() - 1);
}
/**
* Method to add a model to this model displayer
* @param model the model object to add
*/
public void addModel(Object model)
{
turtleList.add((Turtle) model);
if (autoRepaint)
repaint();
}
/**
* Method to check if this world contains the passed
* turtle
* @return true if there else false
*/
public boolean containsTurtle(Turtle turtle)
{
return (turtleList.contains(turtle));
}
/**
* Method to remove the passed object from the world
* @param model the model object to remove
*/
public void remove(Object model)
{
turtleList.remove(model);
}
/**
* Method to get the width in pixels
* @return the width in pixels
*/
public int getWidth() { return width; }
/**
* Method to get the height in pixels
* @return the height in pixels
*/
public int getHeight() { return height; }
/**
* Method that allows the model to notify the display
*/
public void modelChanged()
{
if (autoRepaint)
repaint();
}
/**
* Method to set the automatically repaint flag
* @param value if true will auto repaint
*/
public void setAutoRepaint(boolean value) { autoRepaint = value; }
/**
* Method to hide the frame
*/
// public void hide()
// {
// frame.setVisible(false);
// }
/**
* Method to show the frame
*/
// public void show()
// {
// frame.setVisible(true);
// }
/**
* Method to set the visibility of the world
* @param value a boolean value to say if should show or hide
*/
public void setVisible(boolean value)
{
frame.setVisible(value);
}
/**
* Method to get the list of turtles in the world
* @return a list of turtles in the world
*/
public List getTurtleList()
{ return turtleList;}
/**
* Method to get an iterator on the list of turtles
* @return an iterator for the list of turtles
*/
public Iterator getTurtleIterator()
{ return turtleList.iterator();}
/**
* Method that returns information about this world
* in the form of a string
* @return a string of information about this world
*/
public String toString()
{
return "A " + getWidth() + " by " + getHeight() +
" world with " + turtleList.size() + " turtles in it.";
}
} // end of World class
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>Capture an Alice movie as a series of JPEG images in a directory</title>
<link rel=stylesheet href="/TeaParty/uploads/style.css" type="text/css">
<link rel="shortcut icon" href="/schemesAni/side/favicon.ico">
<h2>Capture an Alice movie as a series of JPEG images in a directory</h2>
To capture an Alice movie as a series of JPEG pictures start Alice, play the movie (click on the Play button), and then pause the movie (click on the Pause button).<br>
<br>
<img src="pause.jpg" width=636 height=621 border=0 title="pause.jpg: uploaded 29 September 2007 at 10:34 pm" alt="pause.jpg"><br>
<br>
Double Click on MovieCapture.bat in the bookClasses directory. This will ask you <br>
for the directory to write the JPEG pictures to. <br>
<br>
<img src="directoryPrompt.jpg" width=356 height=136 border=0 title="directoryPrompt.jpg: uploaded 10 September 2007 at 7:09 pm" alt="directoryPrompt.jpg"><br>
<br>
Enter the name of a new directory. Be sure to either use '/' or '\\' in the pathname since Java treats '\' as a special character. The directory will be created if it doesn't exist.<br>
<br>
<img src="dirWithFile.jpg" width=356 height=136 border=0 title="dirWithFile.jpg: uploaded 10 September 2007 at 7:12 pm" alt="dirWithFile.jpg"><br>
<br>
Click on the "OK" button. <br>
<br>
The frame-based movie capturer window will appear. <br>
<br>
<img src="frame-basedMovieCapturer.jpg" width=475 border=0 title="frame-basedMovieCapturer.jpg: uploaded 29 September 2007 at 10:36 pm" alt="frame-basedMovieCapturer.jpg"><br>
<br>
Position it so that you can see the Alice movie window on the left.<br>
<br>
<img src="beforeCapture.jpg" width=930 height=482 border=0 title="beforeCapture.jpg: uploaded 29 September 2007 at 10:53 pm" alt="beforeCapture.jpg"><br>
<br>
Click on the "Capture Screen" button to see a scaled image of the screen in the frame-based movie capturer window (on the right in the picture below).<br>
<br>
<img src="afterCap2small.jpg" width=800 height=600 border=0 title="afterCap2small.jpg: uploaded 10 September 2007 at 7:54 pm" alt="afterCap2small.jpg"><br>
<br>
Move the cursor to the top left corner of the area to capture and then click and drag the cursor down and to the right to define the bottom right corner of the area to capture. You will see the area outlined in a black rectangle. If the area isn't correct click the "Pick Region" button and try again.<br>
<img src="CaptureScreenAndRegion.jpg" width=593 height=663 border=0 title="CaptureScreenAndRegion.jpg: uploaded 29 September 2007 at 10:54 pm" alt="CaptureScreenAndRegion.jpg"><br>
<br>
Once the region that you want to capture has been picked click on the "Start Capture" button and then click on the Alice movie window and click "Restart". When the Alice movie is done (or at least the part you want to capture) then click on the "Stop Capture" button.<br>
<br>
<img src="stopCapture.jpg" width=600 height=662 border=0 title="stopCapture.jpg: uploaded 29 September 2007 at 10:48 pm" alt="stopCapture.jpg"><br>
<br>
Then click on the "Play Movie" button in the Movie Capture window to see what you have captured. <b>The movie will appear in a new window: the Movie Player window</b>. The movie will play one time.<br>
<br>
<img src="prev-next.jpg" width=600 border=0 title="prev-next.jpg: uploaded 10 September 2007 at 7:48 pm" alt="prev-next.jpg"><br>
<br>
Click on the "Prev" and "Next" buttons to see each of the frames. If you captured extra frames at the beginning then find the true start frame and click "Delete All Previous" to remove the extra frames at the beginning. If you captured extra frames at the end use the "Prev" and "Next" buttons to find the true end frame and click "Delete All After" to remove the extra frames at the end. <br>
<br>
To write out a Quicktime movie from the frames click on "Write Quicktime". To write out an AVI movie click on "Write AVI". The button will be grayed out while the movie is being written. <br>
<br>
<img src="gray.jpg" width=559 height=439 border=0 title="gray.jpg: uploaded 29 September 2007 at 10:59 pm" alt="gray.jpg"><br>
<br>
The button will look normal when it is finished (not grayed out).<br>
<br>
<img src="buttonNotGrey2.jpg" width=559 border=0 title="buttonNotGrey.jpg: uploaded 29 September 2007 at 10:56 pm" alt="buttonNotGrey.jpg"><br>
<br>
The movies are written to the same directory that the frames were saved to. Close the Movie Player and Movie Capture windows. You can play the movie again by double clicking on MoviePlayer.bat and selecting the directory where you stored the JPEG frames.<br>
<br>
<hr size=2 noshade>
Last modified <em>29 September 2007</em> at <em>11:00 pm</em> by <em>ericson<a class="external" href="mailto:ericson@cc.gatech.edu" title="ericson@cc.gatech.edu: from user-1121ejn.dsl.mindspring.com">@</a></em></div>
</body>
</html>
java -Xmx1024m -Xms128m -classpath ./;./sound.jar;./jmf.jar MovieCapturePanel
java -Xmx1024m -Xms128m -classpath ./;./sound.jar;./jmf.jar MoviePlayer
#Properties for the Simple Picture class
#Tue Mar 17 11:29:55 EDT 2009
mediaDirectory=C\:\\intro-prog-java\\mediasources/
<?xml version="1.0" encoding="UTF-8"?>
<module type="JAVA_MODULE" version="4">
<component name="NewModuleRootManager" inherit-compiler-output="true">
<exclude-output />
<content url="file://$MODULE_DIR$">
<sourceFolder url="file://$MODULE_DIR$/src" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/libs/gatechClasses" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/libs/edu" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/libs/supportClasses" isTestSource="false" />
<excludeFolder url="file://$MODULE_DIR$/libs/gatechClasses/help" />
</content>
<orderEntry type="inheritedJdk" />
<orderEntry type="sourceFolder" forTests="false" />
<orderEntry type="module-library">
<library>
<CLASSES>
<root url="jar://$MODULE_DIR$/libs/gatechClasses/AVIDemo.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES>
<root url="jar://$MODULE_DIR$/libs/gatechClasses/AVIDemo.jar!/" />
</SOURCES>
</library>
</orderEntry>
<orderEntry type="module-library">
<library>
<CLASSES>
<root url="jar://$MODULE_DIR$/libs/gatechClasses/javazoom.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES />
</library>
</orderEntry>
<orderEntry type="module-library">
<library>
<CLASSES>
<root url="jar://$MODULE_DIR$/libs/gatechClasses/jmf.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES />
</library>
</orderEntry>
</component>
</module>

%!PS-Adobe-3.0 EPSF-3.0 %%Creator: Mayura Draw, Version 4.3 %%Title: CaptureScreenAndRegion.md %%CreationDate: Fri Sep 28 16:22:05 2007 %%BoundingBox: 10 122 603 785 %%DocumentFonts: ArialMT %%Orientation: Portrait %%EndComments %%BeginProlog %%BeginResource: procset MayuraDraw_ops %%Version: 4.3 %%Copyright: (c) 1993-2003 Mayura Software /PDXDict 100 dict def PDXDict begin % width height matrix proc key cache % definepattern -> font /definepattern { %def 7 dict begin /FontDict 9 dict def FontDict begin /cache exch def /key exch def /proc exch cvx def /mtx exch matrix invertmatrix def /height exch def /width exch def /ctm matrix currentmatrix def /ptm matrix identmatrix def /str (xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx) def end /FontBBox [ %def 0 0 FontDict /width get FontDict /height get ] def /FontMatrix FontDict /mtx get def /Encoding StandardEncoding def /FontType 3 def /BuildChar { %def pop begin FontDict begin width 0 cache { %ifelse 0 0 width height setcachedevice }{ %else setcharwidth } ifelse 0 0 moveto width 0 lineto width height lineto 0 height lineto closepath clip newpath gsave proc grestore end end } def FontDict /key get currentdict definefont end } bind def

% dict patternpath - % dict matrix patternpath - /patternpath { %def dup type /dicttype eq { %ifelse begin FontDict /ctm get setmatrix }{ %else exch begin FontDict /ctm get setmatrix concat } ifelse currentdict setfont FontDict begin FontMatrix concat width 0 dtransform round width div exch round width div exch 0 height dtransform round height div exch round height div exch 0 0 transform round exch round exch ptm astore setmatrix

pathbbox
height div ceiling height mul 4 1 roll
width div ceiling width mul 4 1 roll
height div floor height mul 4 1 roll
width div floor width mul 4 1 roll

2 index sub height div ceiling cvi exch
3 index sub width div ceiling cvi exch
4 2 roll moveto

FontMatrix ptm invertmatrix pop
{ %repeat
  gsave
    ptm concat
    dup str length idiv { %repeat
      str show
    } repeat
    dup str length mod str exch
    0 exch getinterval show
  grestore
  0 height rmoveto
} repeat
pop

end end } bind def

% dict patternfill - % dict matrix patternfill - /patternfill { %def gsave eoclip patternpath grestore newpath } bind def

/img { %def gsave /imgh exch def /imgw exch def concat imgw imgh 8 [imgw 0 0 imgh neg 0 imgh] /colorstr 768 string def /colorimage where { pop { currentfile colorstr readhexstring pop } false 3 colorimage }{ /graystr 256 string def { currentfile colorstr readhexstring pop length 3 idiv dup 1 sub 0 1 3 -1 roll { graystr exch colorstr 1 index 3 mul get 30 mul colorstr 2 index 3 mul 1 add get 59 mul colorstr 3 index 3 mul 2 add get 11 mul add add 100 idiv put } for graystr 0 3 -1 roll getinterval } image } ifelse grestore } bind def

/arrowhead { gsave [] 0 setdash strokeC strokeM strokeY strokeK setcmykcolor 2 copy moveto 4 2 roll exch 4 -1 roll exch sub 3 1 roll sub exch atan rotate dup scale arrowtype dup 0 eq { -1 2 rlineto 7 -2 rlineto -7 -2 rlineto closepath fill } if dup 1 eq { 0 3 rlineto 9 -3 rlineto -9 -3 rlineto closepath fill } if dup 2 eq { -6 -6 rmoveto 6 6 rlineto -6 6 rlineto -1.4142 -1.4142 rlineto 4.5858 -4.5858 rlineto -4.5858 -4.5858 rlineto closepath fill } if dup 3 eq { -6 0 rmoveto -1 2 rlineto 7 -2 rlineto -7 -2 rlineto closepath fill } if dup 4 eq { -9 0 rmoveto 0 3 rlineto 9 -3 rlineto -9 -3 rlineto closepath fill } if dup 5 eq { currentpoint newpath 3 0 360 arc closepath fill } if dup 6 eq { 2.5 2.5 rmoveto 0 -5 rlineto -5 0 rlineto 0 5 rlineto closepath fill } if pop grestore } bind def

/setcmykcolor where { %ifelse pop }{ %else /setcmykcolor { /black exch def /yellow exch def /magenta exch def /cyan exch def cyan black add dup 1 gt { pop 1 } if 1 exch sub magenta black add dup 1 gt { pop 1 } if 1 exch sub yellow black add dup 1 gt { pop 1 } if 1 exch sub setrgbcolor } bind def } ifelse

/RE { %def findfont begin currentdict dup length dict begin { %forall 1 index /FID ne { def } { pop pop } ifelse } forall /FontName exch def dup length 0 ne { %if /Encoding Encoding 256 array copy def 0 exch { %forall dup type /nametype eq { %ifelse Encoding 2 index 2 index put pop 1 add }{ %else exch pop } ifelse } forall } if pop currentdict dup end end /FontName get exch definefont pop } bind def

/spacecount { %def 0 exch ( ) { %loop search { %ifelse pop 3 -1 roll 1 add 3 1 roll }{ pop exit } ifelse } loop } bind def

/WinAnsiEncoding [ 39/quotesingle 96/grave 130/quotesinglbase/florin/quotedblbase /ellipsis/dagger/daggerdbl/circumflex/perthousand /Scaron/guilsinglleft/OE 145/quoteleft/quoteright /quotedblleft/quotedblright/bullet/endash/emdash /tilde/trademark/scaron/guilsinglright/oe/dotlessi 159/Ydieresis 164/currency 166/brokenbar 168/dieresis/copyright /ordfeminine 172/logicalnot 174/registered/macron/ring 177/plusminus/twosuperior/threesuperior/acute/mu 183/periodcentered/cedilla/onesuperior/ordmasculine 188/onequarter/onehalf/threequarters 192/Agrave/Aacute /Acircumflex/Atilde/Adieresis/Aring/AE/Ccedilla /Egrave/Eacute/Ecircumflex/Edieresis/Igrave/Iacute /Icircumflex/Idieresis/Eth/Ntilde/Ograve/Oacute /Ocircumflex/Otilde/Odieresis/multiply/Oslash /Ugrave/Uacute/Ucircumflex/Udieresis/Yacute/Thorn /germandbls/agrave/aacute/acircumflex/atilde/adieresis /aring/ae/ccedilla/egrave/eacute/ecircumflex /edieresis/igrave/iacute/icircumflex/idieresis /eth/ntilde/ograve/oacute/ocircumflex/otilde /odieresis/divide/oslash/ugrave/uacute/ucircumflex /udieresis/yacute/thorn/ydieresis ] def

/SymbolEncoding [ 32/space/exclam/universal/numbersign/existential/percent /ampersand/suchthat/parenleft/parenright/asteriskmath/plus /comma/minus/period/slash/zero/one/two/three/four/five/six /seven/eight/nine/colon/semicolon/less/equal/greater/question /congruent/Alpha/Beta/Chi/Delta/Epsilon/Phi/Gamma/Eta/Iota /theta1/Kappa/Lambda/Mu/Nu/Omicron/Pi/Theta/Rho/Sigma/Tau /Upsilon/sigma1/Omega/Xi/Psi/Zeta/bracketleft/therefore /bracketright/perpendicular/underscore/radicalex/alpha /beta/chi/delta/epsilon/phi/gamma/eta/iota/phi1/kappa/lambda /mu/nu/omicron/pi/theta/rho/sigma/tau/upsilon/omega1/omega /xi/psi/zeta/braceleft/bar/braceright/similar 161/Upsilon1/minute/lessequal/fraction/infinity/florin/club /diamond/heart/spade/arrowboth/arrowleft/arrowup/arrowright /arrowdown/degree/plusminus/second/greaterequal/multiply /proportional/partialdiff/bullet/divide/notequal/equivalence /approxequal/ellipsis/arrowvertex/arrowhorizex/carriagereturn /aleph/Ifraktur/Rfraktur/weierstrass/circlemultiply /circleplus/emptyset/intersection/union/propersuperset /reflexsuperset/notsubset/propersubset/reflexsubset/element /notelement/angle/gradient/registerserif/copyrightserif /trademarkserif/product/radical/dotmath/logicalnot/logicaland /logicalor/arrowdblboth/arrowdblleft/arrowdblup/arrowdblright /arrowdbldown/lozenge/angleleft/registersans/copyrightsans /trademarksans/summation/parenlefttp/parenleftex/parenleftbt /bracketlefttp/bracketleftex/bracketleftbt/bracelefttp /braceleftmid/braceleftbt/braceex 241/angleright/integral/integraltp/integralex/integralbt /parenrighttp/parenrightex/parenrightbt/bracketrighttp /bracketrightex/bracketrightbt/bracerighttp/bracerightmid /bracerightbt ] def

/patarray [ /leftdiagonal /rightdiagonal /crossdiagonal /horizontal /vertical /crosshatch /fishscale /wave /brick ] def /arrowtype 0 def /fillC 0 def /fillM 0 def /fillY 0 def /fillK 0 def /strokeC 0 def /strokeM 0 def /strokeY 0 def /strokeK 1 def /pattern -1 def /mat matrix def /mat2 matrix def /nesting 0 def /deferred /N def /c /curveto load def /c2 { pop pop c } bind def /C /curveto load def /C2 { pop pop C } bind def /e { gsave concat 0 0 moveto } bind def /F { nesting 0 eq { %ifelse pattern -1 eq { %ifelse fillC fillM fillY fillK setcmykcolor eofill }{ %else gsave fillC fillM fillY fillK setcmykcolor eofill grestore 0 0 0 1 setcmykcolor patarray pattern get findfont patternfill } ifelse }{ %else /deferred /F def } ifelse } bind def /f { closepath F } bind def /K { /strokeK exch def /strokeY exch def /strokeM exch def /strokeC exch def } bind def /k { /fillK exch def /fillY exch def /fillM exch def /fillC exch def } bind def /opc { pop } bind def /Opc { pop } bind def /L /lineto load def /L2 { pop pop L } bind def /m /moveto load def /m2 { pop pop m } bind def /n /newpath load def /N { nesting 0 eq { %ifelse newpath }{ %else /deferred /N def } ifelse } def /S { nesting 0 eq { %ifelse strokeC strokeM strokeY strokeK setcmykcolor stroke }{ %else /deferred /S def } ifelse } bind def /s { closepath S } bind def /Tx { fillC fillM fillY fillK setcmykcolor show 0 leading neg translate 0 0 moveto } bind def /T { grestore } bind def /TX { pop } bind def /Ts { pop } bind def /tal { pop } bind def /tld { pop } bind def /tbx { pop exch pop sub /jwidth exch def } def /tpt { %def fillC fillM fillY fillK setcmykcolor moveto show } bind def /tpj { %def fillC fillM fillY fillK setcmykcolor moveto dup stringwidth pop 3 -1 roll exch sub 1 index spacecount dup 0 eq { %ifelse pop pop show }{ %else div 0 8#040 4 -1 roll widthshow } ifelse } bind def /u {} def /U {} def /*u { /nesting nesting 1 add def } def /*U { /nesting nesting 1 sub def nesting 0 eq { deferred cvx exec } if } def /w /setlinewidth load def /d /setdash load def /B { nesting 0 eq { %ifelse gsave F grestore S }{ %else /deferred /B def } ifelse } bind def /b { closepath B } bind def /z { /align exch def pop /leading exch def exch findfont exch scalefont setfont } bind def /tfn { exch findfont exch scalefont setfont } bind def /Pat { /pattern exch def } bind def /cm { 6 array astore concat } bind def /q { mat2 currentmatrix pop } bind def /Q { mat2 setmatrix } bind def /Ah { pop /arrowtype exch def currentlinewidth 5 1 roll arrowhead } bind def /Arc { mat currentmatrix pop translate scale 0 0 1 5 -2 roll arc mat setmatrix } bind def /Arc2 { pop pop Arc } bind def /Bx { mat currentmatrix pop concat /y1 exch def /x1 exch def /y2 exch def /x2 exch def x1 y1 moveto x1 y2 lineto x2 y2 lineto x2 y1 lineto mat setmatrix } bind def /Rr { mat currentmatrix pop concat /yrad exch def /xrad exch def 2 copy gt { exch } if /x2 exch def /x1 exch def 2 copy gt { exch } if /y2 exch def /y1 exch def x1 xrad add y2 moveto matrix currentmatrix x1 xrad add y2 yrad sub translate xrad yrad scale 0 0 1 90 -180 arc setmatrix matrix currentmatrix x1 xrad add y1 yrad add translate xrad yrad scale 0 0 1 180 270 arc setmatrix matrix currentmatrix x2 xrad sub y1 yrad add translate xrad yrad scale 0 0 1 270 0 arc setmatrix matrix currentmatrix x2 xrad sub y2 yrad sub translate xrad yrad scale 0 0 1 0 90 arc setmatrix closepath mat setmatrix } bind def /Ov { mat currentmatrix pop concat translate scale 1 0 moveto 0 0 1 0 360 arc closepath mat setmatrix } bind def end %%EndResource %%EndProlog %%BeginSetup %PDX g 3 3 0 0 %%IncludeFont: ArialMT PDXDict begin %%EndSetup %%Page: 1 1 %%BeginPageSetup /_PDX_savepage save def

15 15 [300 72 div 0 0 300 72 div 0 0] { %definepattern 2 setlinecap 7.5 0 moveto 15 7.5 lineto 0 7.5 moveto 7.5 15 lineto 2 setlinewidth stroke } bind /rightdiagonal true definepattern pop

15 15 [300 72 div 0 0 300 72 div 0 0] { %definepattern 2 setlinecap 7.5 0 moveto 0 7.5 lineto 15 7.5 moveto 7.5 15 lineto 2 setlinewidth stroke } bind /leftdiagonal true definepattern pop

15 15 [300 72 div 0 0 300 72 div 0 0] { %definepattern 2 setlinecap 0 7.5 moveto 15 7.5 lineto 2 setlinewidth stroke } bind /horizontal true definepattern pop

15 15 [300 72 div 0 0 300 72 div 0 0] { %definepattern 2 setlinecap 7.5 0 moveto 7.5 15 lineto 2 setlinewidth stroke } bind /vertical true definepattern pop

15 15 [300 72 div 0 0 300 72 div 0 0] { %definepattern 2 setlinecap 0 7.5 moveto 15 7.5 lineto 7.5 0 moveto 7.5 15 lineto 2 setlinewidth stroke } bind /crosshatch true definepattern pop

30 30 [300 72 div 0 0 300 72 div 0 0] { %definepattern 2 setlinecap 0 7.5 moveto 30 7.5 lineto 0 22.5 moveto 30 22.5 lineto 7.5 0 moveto 7.5 7.5 lineto 7.5 22.5 moveto 7.5 30 lineto 22.5 7.5 moveto 22.5 22.5 lineto 1 setlinewidth stroke } bind /brick true definepattern pop

30 30 [300 72 div 0 0 300 72 div 0 0] { %definepattern 2 2 scale 2 setlinecap 7.5 0 moveto 15 7.5 lineto 0 7.5 moveto 7.5 15 lineto 7.5 0 moveto 0 7.5 lineto 15 7.5 moveto 7.5 15 lineto 0.5 setlinewidth stroke } bind /crossdiagonal true definepattern pop

30 30 [300 72 div 0 0 300 72 div 0 0] { %definepattern 2 2 scale 1 setlinecap 0 7.5 moveto 0 15 7.5 270 360 arc 7.5 15 moveto 15 15 7.5 180 270 arc 0 7.5 moveto 7.5 7.5 7.5 180 360 arc 0.5 setlinewidth stroke } bind /fishscale true definepattern pop

30 30 [300 72 div 0 0 300 72 div 0 0] { %definepattern 1 setlinecap 0.5 setlinewidth 7.5 0 10.6 135 45 arcn 22.5 15 10.6 225 315 arc stroke 7.5 15 10.6 135 45 arcn 22.5 30 10.6 225 315 arc stroke } bind /wave true definepattern pop

WinAnsiEncoding /_ArialMT /ArialMT RE

newpath 2 setlinecap 0 setlinejoin 2 setmiterlimit [] 0 setdash 10 122 moveto 10 785 lineto 603 785 lineto 603 122 lineto closepath clip newpath %%EndPageSetup [574 0 0 613 19.95 132.1] 574 613 img fff9fffffffff4fdff3f52b15d7bdd7ca7de78a4d57fa3f786a7dd87a8de8baae18fade3 93aee396afe599b0e49ab1e597b6e597b6e597b6e597b6e597b6e598b7e698b7e698b7e6 9bb7e99ab6e89ab6e89ab6e899b5e799b5e799b5e798b4e69bb2e69bb2e69bb2e69bb2e6 9bb2e69bb2e69bb2e69bb2e69bb2e69bb2e69bb2e69bb2e69bb2e69bb2e69bb2e69bb2e6 9bb2e69bb2e69bb2e69bb2e69bb2e69bb2e69bb2e69bb2e69bb2e69bb2e69bb2e69bb2e6 9bb2e69bb2e69bb2e69bb2e69bb2e69bb2e69bb2e69bb2e69bb2e69bb2e69bb2e69bb2e6 9bb2e69bb2e69bb2e69bb2e69bb2e69bb2e69bb2e69bb2e69bb2e69bb2e69bb2e69bb2e6 9bb2e69bb2e69bb2e69bb2e69bb2e69bb2e69bb2e69bb2e69bb2e69bb2e69bb2e69bb2e6 9bb2e69bb2e69bb2e69bb2e69bb2e69bb2e69bb2e69bb2e69bb2e69bb2e69bb2e69bb2e6 9bb2e69bb2e69bb2e69bb2e69bb2e69bb2e69bb2e69bb2e69bb2e69bb2e69bb2e69bb2e6 9bb2e69bb2e69bb2e69bb2e69bb2e69bb2e69bb2e69bb2e69bb2e69bb2e69bb2e69bb2e6 9bb2e69bb2e69bb2e69bb2e69bb2e69bb2e69bb2e69bb2e69bb2e69bb2e69bb2e69bb2e6 9bb2e69bb2e69bb2e69bb2e69bb2e69bb2e69bb2e69bb2e69bb2e69bb2e69bb2e69bb2e6 9bb2e69bb2e69bb2e69bb2e69bb2e69bb2e69bb2e69bb2e69bb2e69bb2e69bb2e69bb2e6 9bb2e69bb2e69bb2e69bb2e69bb2e69bb2e69bb2e69bb2e69bb2e69bb2e69bb2e69bb2e6 9bb2e69bb2e69bb2e69bb2e69bb2e69bb2e69bb2e69bb2e69bb2e69bb2e69bb2e69bb2e6 9bb2e69bb2e69bb2e69bb2e69bb2e69bb2e69bb2e69bb2e69ab1e59ab1e59ab1e59ab1e5 9ab1e59ab1e59ab1e59ab1e59ab1e59ab1e59ab1e59ab1e59ab1e59ab1e59ab1e59ab1e5 9ab1e59ab1e59ab1e59ab1e59ab1e59ab1e59ab1e59ab1e59ab1e59ab1e59ab1e59ab1e5 9ab1e59ab1e59ab1e59ab1e59ab1e59ab1e59ab1e59ab1e59ab1e59ab1e59ab1e59ab1e5 9ab1e59ab1e59ab1e59ab1e59ab1e59ab1e59ab1e59ab1e59ab1e59ab1e59ab1e59ab1e5 9ab1e59ab1e59ab1e59ab1e59ab1e59ab1e59ab1e59ab1e59ab1e59ab1e59ab1e59ab1e5 9ab1e59ab1e59ab1e59ab1e59ab1e59ab1e59ab1e59ab1e59ab1e59ab1e59ab1e59ab1e5 9ab1e59ab1e59ab1e59ab1e59ab1e59ab1e59ab1e59ab1e59ab1e59ab1e59ab1e59ab1e5 9ab1e59ab1e59ab1e59ab1e59ab1e59ab1e59ab1e59ab1e59ab1e59ab1e59ab1e59ab1e5 9ab1e59ab1e59ab1e59ab1e59ab1e59ab1e59ab1e59ab1e59ab1e59ab1e59ab1e59ab1e5 9ab1e59ab1e59ab1e59ab1e59ab1e59ab1e59ab1e59ab1e59ab1e59ab1e59ab1e59ab1e5 9ab1e59ab1e59ab1e59ab1e59ab1e59ab1e59ab1e59ab1e59ab1e59ab1e59ab1e59ab1e5 9ab1e59ab1e59ab1e59ab1e59ab1e59ab1e59ab1e59ab1e59ab1e59ab1e59ab1e59ab1e5 9ab1e59ab1e59ab1e59ab1e59ab1e59ab1e59ab1e59ab1e59ab1e59ab1e59ab1e59ab1e5 9ab1e59ab1e59ab1e59ab1e59ab1e59ab1e59ab1e59ab1e59ab1e59ab1e59ab1e59ab1e5 9ab1e59ab1e59ab1e59ab1e59ab1e59ab1e59ab1e59ab1e59ab1e59ab1e59ab1e59ab1e5 9ab1e59ab1e59ab1e59ab1e59ab1e59ab1e59ab1e59ab1e59ab1e59ab1e59ab1e59ab1e5 9ab1e59ab1e59ab1e59ab1e59ab1e59ab1e59ab1e59ab1e59ab1e59ab1e59ab1e59ab1e5 9ab1e59ab1e59ab1e59ab1e59ab1e59ab1e59ab1e59ab1e59ab1e59ab1e59ab1e59ab1e5 9ab1e59ab1e59ab1e59ab1e59ab1e59ab1e59ab1e59ab1e59ab1e59ab1e59ab1e59ab1e5 9ab1e59ab1e59ab1e59ab1e59ab1e59ab1e59ab1e59ab1e59ab1e59ab1e59ab1e59ab1e5 9ab1e59ab1e59ab1e59ab1e59ab1e59ab1e59ab1e59ab1e59ab1e59ab1e59ab1e59ab1e5 9ab1e59ab1e59ab1e59ab1e59ab1e59ab1e59ab1e59ab1e59ab1e59ab1e59ab1e59ab1e5 9ab1e59ab1e59ab1e59ab1e592ade29bb6eb9eb9ee99b4e997b2e99bb6ed9ab5ec94afe6 99afe19ab0e29bb1e29cb2e19cb3df9cb3dd9cb3dc9bb2db99afe099afe09ab0e19ab0e1 9bb1e29bb1e29cb2e39cb2e398afd898afd898afd899b0d99ab1da9bb2db9db4dd9eb5de 9db7ea90aadd95afe29cb6e996b0e39cb6e9a1bbee92acdf98aedf9ab0e19cb2e39db3e4 9eb4e59eb4e59db3e49db3e499afe099afe09ab0e19ab0e19bb1e29bb1e29cb2e39cb2e3 99afdea0b7e1a0b8dc99b1d397afd19bb3d79db4de9bb1e092b7e395b7e495b5e493b1e3 97b0e69db3ec9fb4ed9eb1ec90aeec91afed94b0ef97b0f098b1f198b0f097afef99aeef 8eb0ef8eb0ef8eb0ef8dafee8dafee8caeed8caeed8caeed89a5d791afe398b7ed94b5eb 8babe486a6df87a8de8cabe2789ee95b7bd0324c99edffffeefef4fcfff1ede9e8fbfbff 485395849be7698ad781a7f27399e08ab0ef88abe58aade78eaee791b1ea95b4eb97b5eb 9bb6ed9bb6ed99b9ec99b9ec9abaed9abaed9abaed9abaed9abaed9abaed9bb9ef9bb9ef 9bb9ef9bb9ef9ab8ee9ab8ee9ab8ee99b7ed9ab5ec9ab5ec9ab5ec9ab5ec9ab5ec9ab5ec 9ab5ec9ab5ec9ab5ec9ab5ec9ab5ec9ab5ec9ab5ec9ab5ec9ab5ec9ab5ec9ab5ec9ab5ec 9ab5ec9ab5ec9ab5ec9ab5ec9ab5ec9ab5ec9ab5ec9ab5ec9ab5ec9ab5ec9ab5ec9ab5ec 9ab5ec9ab5ec9ab5ec9ab5ec9ab5ec9ab5ec9ab5ec9ab5ec9ab5ec9ab5ec9ab5ec9ab5ec 9ab5ec9ab5ec9ab5ec9ab5ec9ab5ec9ab5ec9ab5ec9ab5ec9ab5ec9ab5ec9ab5ec9ab5ec 9ab5ec9ab5ec9ab5ec9ab5ec9ab5ec9ab5ec9ab5ec9ab5ec9ab5ec9ab5ec9ab5ec9ab5ec 9ab5ec9ab5ec9ab5ec9ab5ec9ab5ec9ab5ec9ab5ec9ab5ec9ab5ec9ab5ec9ab5ec9ab5ec 9ab5ec9ab5ec9ab5ec9ab5ec9ab5ec9ab5ec9ab5ec9ab5ec9ab5ec9ab5ec9ab5ec9ab5ec 9ab5ec9ab5ec9ab5ec9ab5ec9ab5ec9ab5ec9ab5ec9ab5ec9ab5ec9ab5ec9ab5ec9ab5ec 9ab5ec9ab5ec9ab5ec9ab5ec9ab5ec9ab5ec9ab5ec9ab5ec9ab5ec9ab5ec9ab5ec9ab5ec 9ab5ec9ab5ec9ab5ec9ab5ec9ab5ec9ab5ec9ab5ec9ab5ec9ab5ec9ab5ec9ab5ec9ab5ec 9ab5ec9ab5ec9ab5ec9ab5ec9ab5ec9ab5ec9ab5ec9ab5ec9ab5ec9ab5ec9ab5ec9ab5ec 9ab5ec9ab5ec9ab5ec9ab5ec9ab5ec9ab5ec9ab5ec9ab5ec9ab5ec9ab5ec9ab5ec9ab5ec 9ab5ec9ab5ec9ab5ec9ab5ec9ab5ec9ab5ec9ab5ec9ab5ec9ab5ec9ab5ec9bb6ed9bb6ed 9bb6ed9bb6ed9bb6ed9bb6ed9bb6ed9bb6ed9ab5ec9ab5ec9ab5ec9ab5ec9ab5ec9ab5ec 9ab5ec9ab5ec9ab5ec9ab5ec9ab5ec9ab5ec9ab5ec9ab5ec9ab5ec9ab5ec9ab5ec9ab5ec 9ab5ec9ab5ec9ab5ec9ab5ec9ab5ec9ab5ec9ab5ec9ab5ec9ab5ec9ab5ec9ab5ec9ab5ec 9ab5ec9ab5ec9ab5ec9ab5ec9ab5ec9ab5ec9ab5ec9ab5ec9ab5ec9ab5ec9ab5ec9ab5ec 9ab5ec9ab5ec9ab5ec9ab5ec9ab5ec9ab5ec9ab5ec9ab5ec9ab5ec9ab5ec9ab5ec9ab5ec 9ab5ec9ab5ec9ab5ec9ab5ec9ab5ec9ab5ec9ab5ec9ab5ec9ab5ec9ab5ec9ab5ec9ab5ec 9ab5ec9ab5ec9ab5ec9ab5ec9ab5ec9ab5ec9ab5ec9ab5ec9ab5ec9ab5ec9ab5ec9ab5ec 9ab5ec9ab5ec9ab5ec9ab5ec9ab5ec9ab5ec9ab5ec9ab5ec9ab5ec9ab5ec9ab5ec9ab5ec 9ab5ec9ab5ec9ab5ec9ab5ec9ab5ec9ab5ec9ab5ec9ab5ec9ab5ec9ab5ec9ab5ec9ab5ec 9ab5ec9ab5ec9ab5ec9ab5ec9ab5ec9ab5ec9ab5ec9ab5ec9ab5ec9ab5ec9ab5ec9ab5ec 9ab5ec9ab5ec9ab5ec9ab5ec9ab5ec9ab5ec9ab5ec9ab5ec9ab5ec9ab5ec9ab5ec9ab5ec 9ab5ec9ab5ec9ab5ec9ab5ec9ab5ec9ab5ec9ab5ec9ab5ec9ab5ec9ab5ec9ab5ec9ab5ec 9ab5ec9ab5ec9ab5ec9ab5ec9ab5ec9ab5ec9ab5ec9ab5ec9ab5ec9ab5ec9ab5ec9ab5ec 9ab5ec9ab5ec9ab5ec9ab5ec9ab5ec9ab5ec9ab5ec9ab5ec9ab5ec9ab5ec9ab5ec9ab5ec 9ab5ec9ab5ec9ab5ec9ab5ec9ab5ec9ab5ec9ab5ec9ab5ec9ab5ec9ab5ec9ab5ec9ab5ec 9ab5ec9ab5ec9ab5ec9ab5ec9ab5ec9ab5ec9ab5ec9ab5ec9ab5ec9ab5ec9ab5ec9ab5ec 9ab5ec9ab5ec9ab5ec9ab5ec9ab5ec9ab5ec9ab5ec9ab5ec9ab5ec9ab5ec9ab5ec9ab5ec 9ab5ec9ab5ec9ab5ec9ab5ec9ab5ec9ab5ec9ab5ec9ab5ec9ab5ec9ab5ec9ab5ec9ab5ec 9ab5ec9ab5ec9ab5ec9ab5ec9ab5ec9ab5ec9ab5ec9ab5ec9ab5ec9ab5ec9ab5ec9ab5ec 9ab5ec9ab5ec9ab5ec9ab5ec9ab5ec9ab5ec9ab5ec9ab5ec9ab5ec9ab5ec9ab5ec9ab5ec 9ab5ec9ab5ec9ab5ec9ab5ec9ab5ec9ab5ec9ab5ec9ab5ec9ab5ec9ab5ec9ab5ec9ab5ec 9ab5ec9ab5ec9ab5ec9ab5ec9ab5ec9ab5ec9ab5ec9ab5ec9ab5ec9ab5ec9ab5ec9ab5ec 9ab5ec9ab5ec9ab5ec9ab5ec9ab5ec9ab5ec9ab5ec9ab5ec9ab5ec9ab5ec9ab5ec9ab5ec 9ab5ec9ab5ec9bb8f09ab7ef98b5ed95b2ea97b4ec9cb9f39dbaf49bb8f297b4f898b5f9 98b5f798b6f698b6f497b5f196b4f096b5ee99b7f799b7f799b7f79ab8f89ab8f89bb9f9 9bb9f99bb9f99bb8fa9ab7f99ab7f99ab7f99ab7f99bb8fa9bb8fa9cb9fb96b1e8a2bdf4 a3bef59bb6ed93aee58da8df92ade4a0bbf296b3f597b4f698b5f799b6f89ab7f999b6f8 98b5f797b4f699b7f799b7f799b7f79ab8f89ab8f89bb9f99bb9f99bb9f992aff597b4f8 97b5f593b1ed96b4f09dbbfba2bfffa1beff97bbed95b6e995b6eb9abbf19dbcf599b7f3 98b6f29cb8f798b9e299b9e29abae39cb9e39cb9e39bb6e19cb4e09bb3dfa3ade2a3ade2 a3ade2a3ade2a2ace1a2ace1a2ace1a1abe0a4bdfd97b0f08ca8e98ca8e98ca8e989a5e6 89a5e68fa8e87198cf86a5f5758ae75563aaecf7ffeff5e9f8ffff5d64a86c79d7718fcf 7ea2de82a4fe7090e784a8da7fa5e481a7e685a9e788ace88badea8db0ea90b0eb90b0e9 8eb1e98eb1e98eb1e98eb1e98eb1e98eb1e98eb1e98eb1e990b0eb90b0eb90b0eb90b0eb 8fafea8fafea8fafea8eaee98eace88eace88eace88eace88eace88eace88eace88eace8 8eace88eace88eace88eace88eace88eace88eace88eace88eace88eace88eace88eace8 8eace88eace88eace88eace88eace88eace88eace88eace88eace88eace88eace88eace8 8eace88eace88eace88eace88eace88eace88eace88eace88eace88eace88eace88eace8 8eace88eace88eace88eace88eace88eace88eace88eace88eace88eace88eace88eace8 8eace88eace88eace88eace88eace88eace88eace88eace88eace88eace88eace88eace8 8eace88eace88eace88eace88eace88eace88eace88eace88eace88eace88eace88eace8 8eace88eace88eace88eace88eace88eace88eace88eace88eace88eace88eace88eace8 8eace88eace88eace88eace88eace88eace88eace88eace88eace88eace88eace88eace8 8eace88eace88eace88eace88eace88eace88eace88eace88eace88eace88eace88eace8 8eace88eace88eace88eace88eace88eace88eace88eace88eace88eace88eace88eace8 8eace88eace88eace88eace88eace88eace88eace88eace88eace88eace88eace88eace8 8eace88eace88eace88eace88eace88eace88eace88eace88eace88eace88eace88eace8 8eace88eace88eace88eace88eace88eace88eace88eace88fade98fade98fade98fade9 8fade98fade98fade98fade98eace88eace88eace88eace88eace88eace88eace88eace8 8eace88eace88eace88eace88eace88eace88eace88eace88eace88eace88eace88eace8 8eace88eace88eace88eace88eace88eace88eace88eace88eace88eace88eace88eace8 8eace88eace88eace88eace88eace88eace88eace88eace88eace88eace88eace88eace8 8eace88eace88eace88eace88eace88eace88eace88eace88eace88eace88eace88eace8 8eace88eace88eace88eace88eace88eace88eace88eace88eace88eace88eace88eace8 8eace88eace88eace88eace88eace88eace88eace88eace88eace88eace88eace88eace8 8eace88eace88eace88eace88eace88eace88eace88eace88eace88eace88eace88eace8 8eace88eace88eace88eace88eace88eace88eace88eace88eace88eace88eace88eace8 8eace88eace88eace88eace88eace88eace88eace88eace88eace88eace88eace88eace8 8eace88eace88eace88eace88eace88eace88eace88eace88eace88eace88eace88eace8 8eace88eace88eace88eace88eace88eace88eace88eace88eace88eace88eace88eace8 8eace88eace88eace88eace88eace88eace88eace88eace88eace88eace88eace88eace8 8eace88eace88eace88eace88eace88eace88eace88eace88eace88eace88eace88eace8 8eace88eace88eace88eace88eace88eace88eace88eace88eace88eace88eace88eace8 8eace88eace88eace88eace88eace88eace88eace88eace88eace88eace88eace88eace8 8eace88eace88eace88eace88eace88eace88eace88eace88eace88eace88eace88eace8 8eace88eace88eace88eace88eace88eace88eace88eace88eace88eace88eace88eace8 8eace88eace88eace88eace88eace88eace88eace88eace88eace88eace88eace88eace8 8eace88eace88eace88eace88eace88eace88eace88eace88eace88eace88eace88eace8 8eace88eace88eace88eace88eace88eace88eace88eace88eace88eace88eace88eace8 8eace88eace88eace88eace88eace88eace88eace88eace88eace88eace88eace88eace8 8eace88eace88eace88eace88eace88eace88eace88eace88eace88eace88eace88eace8 93b3f08cace988a8e58babe88eaeeb8eaeeb8dadea8eaeeb88aeec87adeb87adeb86ade8 86ade885ace584abe484abe285ace585ace585ace585ace586ade686ade686ade686ade6 87acf087acf087acf086abef86abef85aaee85aaee85aaee85a3df91afeb87a5e185a3df 97b5f194b2ee8ba9e597b5f186acea87adeb87adeb88aeec87adeb86acea85abe985abe9 85ace585ace585ace585ace586ade686ade686ade686ade683a8ef89aef48db3f48fb5f4 8eb4f38bb1f282a7ed789de493b3ee89ace688aae78eb2f08cb2f183a9e87ea5e682a9ea 8daee18daee18dade08dade08caade8ca7dc8ba6db8aa5da7cabdf7cabdf7baade7baade 7baade7aa9dd7aa9dd7aa9dd7f9ae77b95e0829ce793abf598b0fa8da5ef8199e37d95df 82a8cf7994e17787f66970da555b97f9ffffdae9ff4d5daa7b8eed819eea7194d66a8bda 87a6f66e8ec9759cdf769de079a0e37ca2e37ea4e380a6e581a7e581a7e581a7e580a6e4 80a6e480a6e480a6e47fa5e37fa5e37fa5e381a4e481a4e481a4e480a3e380a3e380a3e3 7fa2e27fa2e27fa1e17fa1e17fa1e17fa1e17fa1e17fa1e17fa1e17fa1e17fa1e17fa1e1 7fa1e17fa1e17fa1e17fa1e17fa1e17fa1e17fa1e17fa1e17fa1e17fa1e17fa1e17fa1e1 7fa1e17fa1e17fa1e17fa1e17fa1e17fa1e17fa1e17fa1e17fa1e17fa1e17fa1e17fa1e1 7fa1e17fa1e17fa1e17fa1e17fa1e17fa1e17fa1e17fa1e17fa1e17fa1e17fa1e17fa1e1 7fa1e17fa1e17fa1e17fa1e17fa1e17fa1e17fa1e17fa1e17fa1e17fa1e17fa1e17fa1e1 7fa1e17fa1e17fa1e17fa1e17fa1e17fa1e17fa1e17fa1e17fa1e17fa1e17fa1e17fa1e1 7fa1e17fa1e17fa1e17fa1e17fa1e17fa1e17fa1e17fa1e17fa1e17fa1e17fa1e17fa1e1 7fa1e17fa1e17fa1e17fa1e17fa1e17fa1e17fa1e17fa1e17fa1e17fa1e17fa1e17fa1e1 7fa1e17fa1e17fa1e17fa1e17fa1e17fa1e17fa1e17fa1e17fa1e17fa1e17fa1e17fa1e1 7fa1e17fa1e17fa1e17fa1e17fa1e17fa1e17fa1e17fa1e17fa1e17fa1e17fa1e17fa1e1 7fa1e17fa1e17fa1e17fa1e17fa1e17fa1e17fa1e17fa1e17fa1e17fa1e17fa1e17fa1e1 7fa1e17fa1e17fa1e17fa1e17fa1e17fa1e17fa1e17fa1e17fa1e17fa1e17fa1e17fa1e1 7fa1e17fa1e17fa1e17fa1e17fa1e17fa1e17fa1e17fa1e17fa1e17fa1e17fa1e17fa1e1 7fa1e17fa1e17fa1e17fa1e17fa1e17fa1e180a2e280a2e280a2e280a2e280a2e280a2e2 80a2e280a2e27fa1e17fa1e17fa1e17fa1e17fa1e17fa1e17fa1e17fa1e17fa1e17fa1e1 7fa1e17fa1e17fa1e17fa1e17fa1e17fa1e17fa1e17fa1e17fa1e17fa1e17fa1e17fa1e1 7fa1e17fa1e17fa1e17fa1e17fa1e17fa1e17fa1e17fa1e17fa1e17fa1e17fa1e17fa1e1 7fa1e17fa1e17fa1e17fa1e17fa1e17fa1e17fa1e17fa1e17fa1e17fa1e17fa1e17fa1e1 7fa1e17fa1e17fa1e17fa1e17fa1e17fa1e17fa1e17fa1e17fa1e17fa1e17fa1e17fa1e1 7fa1e17fa1e17fa1e17fa1e17fa1e17fa1e17fa1e17fa1e17fa1e17fa1e17fa1e17fa1e1 7fa1e17fa1e17fa1e17fa1e17fa1e17fa1e17fa1e17fa1e17fa1e17fa1e17fa1e17fa1e1 7fa1e17fa1e17fa1e17fa1e17fa1e17fa1e17fa1e17fa1e17fa1e17fa1e17fa1e17fa1e1 7fa1e17fa1e17fa1e17fa1e17fa1e17fa1e17fa1e17fa1e17fa1e17fa1e17fa1e17fa1e1 7fa1e17fa1e17fa1e17fa1e17fa1e17fa1e17fa1e17fa1e17fa1e17fa1e17fa1e17fa1e1 7fa1e17fa1e17fa1e17fa1e17fa1e17fa1e17fa1e17fa1e17fa1e17fa1e17fa1e17fa1e1 7fa1e17fa1e17fa1e17fa1e17fa1e17fa1e17fa1e17fa1e17fa1e17fa1e17fa1e17fa1e1 7fa1e17fa1e17fa1e17fa1e17fa1e17fa1e17fa1e17fa1e17fa1e17fa1e17fa1e17fa1e1 7fa1e17fa1e17fa1e17fa1e17fa1e17fa1e17fa1e17fa1e17fa1e17fa1e17fa1e17fa1e1 7fa1e17fa1e17fa1e17fa1e17fa1e17fa1e17fa1e17fa1e17fa1e17fa1e17fa1e17fa1e1 7fa1e17fa1e17fa1e17fa1e17fa1e17fa1e17fa1e17fa1e17fa1e17fa1e17fa1e17fa1e1 7fa1e17fa1e17fa1e17fa1e17fa1e17fa1e17fa1e17fa1e17fa1e17fa1e17fa1e17fa1e1 7fa1e17fa1e17fa1e17fa1e17fa1e17fa1e17fa1e17fa1e17fa1e17fa1e17fa1e17fa1e1 7fa1e17fa1e17fa1e17fa1e17fa1e17fa1e17fa1e17fa1e17fa1e17fa1e17fa1e17fa1e1 7fa1e17fa1e17fa1e17fa1e17fa1e17fa1e17fa1e17fa1e17fa1e17fa1e17fa1e17fa1e1 7fa1e17fa1e17fa1e17fa1e17fa1e17fa1e17fa1e17fa1e17fa1e17fa1e17fa1e17fa1e1 7fa1e17fa1e17fa1e17fa1e17fa1e17fa1e17fa1e17fa1e17fa1e17fa1e17fa1e17fa1e1 7fa1e17fa1e17fa1e17fa1e17fa1e17fa1e17fa1e17fa1e17fa1e17fa1e180a1e67c9de2 7c9de082a3e681a3e37b9ddd789ada7c9edd82a6d882a6d881a5d781a5d580a4d480a4d4 80a4d480a4d47fa4d17fa4d17fa4d17fa4d17fa4d17fa4d180a5d280a5d27fa3d77fa3d7 80a4d880a4d87fa3d77fa3d77ea2d67ea2d689a8e884a3e37c9bdb7d9cdc87a6e686a5e5 7998d87190d081a5d981a5d981a5d981a5d981a5d981a5d981a5d981a5d97fa4d17fa4d1 7fa4d17fa4d17fa4d17fa4d180a5d280a5d285a8de80a3d9799dd17599cd7a9ed282a6da 89ace28baee4809fe27c9de07c9de07fa2e481a7e883aaeb81aaea7eaae97da0f17e9ff0 7e9ff07e9def7f9bee7d99ec7d97eb7c96ea8093f18093f18093f17f92f07f92f07f92f0 7e91ef7e91ef7998e87c99e77894de738bd56d85cf6c86d16e89d6718cd96886b87388d7 7480ec787eec6d6fc2f6f9ff6374c6889ce35e75c57b93f76f8ae16a8bc17999d27892e7 759ae1759ce1779ee379a0e37ba2e57da4e57da5e37ea6e47da4e57da4e57da4e57ca3e4 7ca3e47ba2e37ba2e37ba2e37ba0e47ba0e47ba0e47ba0e47a9fe37a9fe37a9fe3799ee2 7c9fe37c9fe37c9fe37c9fe37c9fe37c9fe37c9fe37c9fe37c9fe37c9fe37c9fe37c9fe3 7c9fe37c9fe37c9fe37c9fe37c9fe37c9fe37c9fe37c9fe37c9fe37c9fe37c9fe37c9fe3 7c9fe37c9fe37c9fe37c9fe37c9fe37c9fe37c9fe37c9fe37c9fe37c9fe37c9fe37c9fe3 7c9fe37c9fe37c9fe37c9fe37c9fe37c9fe37c9fe37c9fe37c9fe37c9fe37c9fe37c9fe3 7c9fe37c9fe37c9fe37c9fe37c9fe37c9fe37c9fe37c9fe37c9fe37c9fe37c9fe37c9fe3 7c9fe37c9fe37c9fe37c9fe37c9fe37c9fe37c9fe37c9fe37c9fe37c9fe37c9fe37c9fe3 7c9fe37c9fe37c9fe37c9fe37c9fe37c9fe37c9fe37c9fe37c9fe37c9fe37c9fe37c9fe3 7c9fe37c9fe37c9fe37c9fe37c9fe37c9fe37c9fe37c9fe37c9fe37c9fe37c9fe37c9fe3 7c9fe37c9fe37c9fe37c9fe37c9fe37c9fe37c9fe37c9fe37c9fe37c9fe37c9fe37c9fe3 7c9fe37c9fe37c9fe37c9fe37c9fe37c9fe37c9fe37c9fe37c9fe37c9fe37c9fe37c9fe3 7c9fe37c9fe37c9fe37c9fe37c9fe37c9fe37c9fe37c9fe37c9fe37c9fe37c9fe37c9fe3 7c9fe37c9fe37c9fe37c9fe37c9fe37c9fe37c9fe37c9fe37c9fe37c9fe37c9fe37c9fe3 7c9fe37c9fe37c9fe37c9fe37c9fe37c9fe37c9fe37c9fe37c9fe37c9fe37c9fe37c9fe3 7c9fe37c9fe37c9fe37c9fe37b9ee27b9ee27b9ee27b9ee27b9ee27b9ee27b9ee27b9ee2 7a9de17a9de17a9de17a9de17a9de17a9de17a9de17a9de17a9de17a9de17a9de17a9de1 7a9de17a9de17a9de17a9de17a9de17a9de17a9de17a9de17a9de17a9de17a9de17a9de1 7a9de17a9de17a9de17a9de17a9de17a9de17a9de17a9de17a9de17a9de17a9de17a9de1 7a9de17a9de17a9de17a9de17a9de17a9de17a9de17a9de17a9de17a9de17a9de17a9de1 7a9de17a9de17a9de17a9de17a9de17a9de17a9de17a9de17a9de17a9de17a9de17a9de1 7a9de17a9de17a9de17a9de17a9de17a9de17a9de17a9de17a9de17a9de17a9de17a9de1 7a9de17a9de17a9de17a9de17a9de17a9de17a9de17a9de17a9de17a9de17a9de17a9de1 7a9de17a9de17a9de17a9de17a9de17a9de17a9de17a9de17a9de17a9de17a9de17a9de1 7a9de17a9de17a9de17a9de17a9de17a9de17a9de17a9de17a9de17a9de17a9de17a9de1 7a9de17a9de17a9de17a9de17a9de17a9de17a9de17a9de17a9de17a9de17a9de17a9de1 7a9de17a9de17a9de17a9de17a9de17a9de17a9de17a9de17a9de17a9de17a9de17a9de1 7a9de17a9de17a9de17a9de17a9de17a9de17a9de17a9de17a9de17a9de17a9de17a9de1 7a9de17a9de17a9de17a9de17a9de17a9de17a9de17a9de17a9de17a9de17a9de17a9de1 7a9de17a9de17a9de17a9de17a9de17a9de17a9de17a9de17a9de17a9de17a9de17a9de1 7a9de17a9de17a9de17a9de17a9de17a9de17a9de17a9de17a9de17a9de17a9de17a9de1 7a9de17a9de17a9de17a9de17a9de17a9de17a9de17a9de17a9de17a9de17a9de17a9de1 7a9de17a9de17a9de17a9de17a9de17a9de17a9de17a9de17a9de17a9de17a9de17a9de1 7a9de17a9de17a9de17a9de17a9de17a9de17a9de17a9de17a9de17a9de17a9de17a9de1 7a9de17a9de17a9de17a9de17a9de17a9de17a9de17a9de17a9de17a9de17a9de17a9de1 7a9de17a9de17a9de17a9de17a9de17a9de17a9de17a9de17a9de17a9de17a9de17a9de1 7a9de17a9de17a9de17a9de17a9de17a9de17a9de17a9de17a9de17a9de17a9de17a9de1 7a9de17a9de17a9de17a9de17a9de17a9de17a9de17a9de17a9de17a9de17a9de17a9de1 7a9de17a9de17a9de17a9de17a9de17a9de17a9de17a9de17a9ae37a9ae37c9de47d9ee3 7b9cdf7899dc7d9fdf85a7e77f95eb7f95eb7e94ea7d93e97d93e97e94ea7f94ed8095ee 8197ec8197ec8197ec8096eb8096eb8096eb8096eb8096eb8096e98197ea8298eb8298eb 8298eb8298eb8197ea8096e97b9add7392d5809fe283a2e57291d47998db8baaed86a5e8 7d92eb7d92eb7d92eb7e93ec7e93ec7f94ed7f94ed8095ee8197ec8197ec8197ec8096eb 8096eb8096eb8096eb8096eb8197ea7f95e87f95ea8197ec8096eb7d93e8788ee1768cdf 809ee683a1e77c9bde728fd17391cf7b99d57897ce6c8bc27997df7896de7995de7894dd 7993dd7a92dc7a92dc7a92dc7e8de07e8de07d8cdf7d8cdf7d8cdf7c8bde7c8bde7c8bde 6e89cc7d94d77f93d27587c5768ac98198db7e9bdf708ed67586d48696eb7580dc5a61bc 797ed26566b6535fcb5d6fbb8699e66275de728ae484a3cf6282b3829afc7597df7799e0 779ce2799ee279a0e37aa1e27aa3e17aa3e17ca1e57ca1e57ba0e47ba0e47a9fe3799ee2 799ee2799ee27a9ce37a9ce37a9ce3799be2799be2799be2789ae1789ae17b9ce37b9ce3 7b9ce37b9ce37b9ce37b9ce37b9ce37b9ce37b9ce37b9ce37b9ce37b9ce37b9ce37b9ce3 7b9ce37b9ce37b9ce37b9ce37b9ce37b9ce37b9ce37b9ce37b9ce37b9ce37b9ce37b9ce3 7b9ce37b9ce37b9ce37b9ce37b9ce37b9ce37b9ce37b9ce37b9ce37b9ce37b9ce37b9ce3 7b9ce37b9ce37b9ce37b9ce37b9ce37b9ce37b9ce37b9ce37b9ce37b9ce37b9ce37b9ce3 7b9ce37b9ce37b9ce37b9ce37b9ce37b9ce37b9ce37b9ce37b9ce37b9ce37b9ce37b9ce3 7b9ce37b9ce37b9ce37b9ce37b9ce37b9ce37b9ce37b9ce37b9ce37b9ce37b9ce37b9ce3 7b9ce37b9ce37b9ce37b9ce37b9ce37b9ce37b9ce37b9ce37b9ce37b9ce37b9ce37b9ce3 7b9ce37b9ce37b9ce37b9ce37b9ce37b9ce37b9ce37b9ce37b9ce37b9ce37b9ce37b9ce3 7b9ce37b9ce37b9ce37b9ce37b9ce37b9ce37b9ce37b9ce37b9ce37b9ce37b9ce37b9ce3 7b9ce37b9ce37b9ce37b9ce37b9ce37b9ce37b9ce37b9ce37b9ce37b9ce37b9ce37b9ce3 7b9ce37b9ce37b9ce37b9ce37b9ce37b9ce37b9ce37b9ce37b9ce37b9ce37b9ce37b9ce3 7b9ce37b9ce37b9ce37b9ce37b9ce37b9ce37b9ce37b9ce37b9ce37b9ce37b9ce37b9ce3 7b9ce37b9ce37b9ce37b9ce37b9ce37b9ce37b9ce37b9ce37b9ce37b9ce37b9ce37b9ce3 7b9ce37b9ce3799ae1799ae1799ae1799ae1799ae1799ae1799ae1799ae17899e07899e0 7899e07899e07899e07899e07899e07899e07899e07899e07899e07899e07899e07899e0 7899e07899e07899e07899e07899e07899e07899e07899e07899e07899e07899e07899e0 7899e07899e07899e07899e07899e07899e07899e07899e07899e07899e07899e07899e0 7899e07899e07899e07899e07899e07899e07899e07899e07899e07899e07899e07899e0 7899e07899e07899e07899e07899e07899e07899e07899e07899e07899e07899e07899e0 7899e07899e07899e07899e07899e07899e07899e07899e07899e07899e07899e07899e0 7899e07899e07899e07899e07899e07899e07899e07899e07899e07899e07899e07899e0 7899e07899e07899e07899e07899e07899e07899e07899e07899e07899e07899e07899e0 7899e07899e07899e07899e07899e07899e07899e07899e07899e07899e07899e07899e0 7899e07899e07899e07899e07899e07899e07899e07899e07899e07899e07899e07899e0 7899e07899e07899e07899e07899e07899e07899e07899e07899e07899e07899e07899e0 7899e07899e07899e07899e07899e07899e07899e07899e07899e07899e07899e07899e0 7899e07899e07899e07899e07899e07899e07899e07899e07899e07899e07899e07899e0 7899e07899e07899e07899e07899e07899e07899e07899e07899e07899e07899e07899e0 7899e07899e07899e07899e07899e07899e07899e07899e07899e07899e07899e07899e0 7899e07899e07899e07899e07899e07899e07899e07899e07899e07899e07899e07899e0 7899e07899e07899e07899e07899e07899e07899e07899e07899e07899e07899e07899e0 7899e07899e07899e07899e07899e07899e07899e07899e07899e07899e07899e07899e0 7899e07899e07899e07899e07899e07899e07899e07899e07899e07899e07899e07899e0 7899e07899e07899e07899e07899e07899e07899e07899e07899e07899e07899e07899e0 7899e07899e07899e07899e07899e07899e07899e07899e07899e07899e07899e07899e0 7899e07899e07899e07899e07899e07899e07899e07899e07899e07899e07899e07899e0 7899e07899e07899e07899e07899e07899e07c99e57e9be77b99e27593db7796d983a2e3 8faeee96b5f5b6d4ecb4d2eab3d1ebb1cfe9b1cfebb2d0ecb3d0eeb4d1efb2cfedb2cfed b2cfedb1ceecb1ceecb1ceecb1ceecb0cdebb2d0e8b3d1e9b4d2eab4d2eab3d1e9b2d0e8 b0cee6afcde584a1e57693d77a97db7f9ce07c99dd8ca9ed9fbcff9cb9fdb3d0eeb3d0ee b2cfedb1ceecb2cfedb2cfedb3d0eeb3d0eeb2cfedb2cfedb2cfedb1ceecb1ceecb1ceec b1ceecb0cdebb0cfe4b3d1e9b9d7f1bddbf7b8d6f2accae4a2c0d8a0bfd46f8dd57893da 8198db8ca0dba3b3e7bfc9facad1fdc8cdf5c1cfeac2cde9c1cce8c2cbe8c3cae7c4cbe8 c5cae8c6cbe9b7cfe9b7cfe9b6cee8b6cee8b5cde7b5cde7b5cde7b5cde7c1c3f4cccaf9 cdc7f3c2bce8bdbbeab2b8ec8d9cd76579b87680e26b74cf6772c1868fda6066ba595bc2 636cd3656fd07481df8494eb6b7fc6829cd5748fd27791e87694dc7795dd7798dd789bdf 779dde789edd78a0de78a0dd7c9fe37c9fe37b9ee27a9de1799ce0789bdf789bdf779ade 7899e07899e07899e07798df7798df7697de7697de7697de7997df7997df7997df7997df 7997df7997df7997df7997df7997df7997df7997df7997df7997df7997df7997df7997df 7997df7997df7997df7997df7997df7997df7997df7997df7997df7997df7997df7997df 7997df7997df7997df7997df7997df7997df7997df7997df7997df7997df7997df7997df 7997df7997df7997df7997df7997df7997df7997df7997df7997df7997df7997df7997df 7997df7997df7997df7997df7997df7997df7997df7997df7997df7997df7997df7997df 7997df7997df7997df7997df7997df7997df7997df7997df7997df7997df7997df7997df 7997df7997df7997df7997df7997df7997df7997df7997df7997df7997df7997df7997df 7997df7997df7997df7997df7997df7997df7997df7997df7997df7997df7997df7997df 7997df7997df7997df7997df7997df7997df7997df7997df7997df7997df7997df7997df 7997df7997df7997df7997df7997df7997df7997df7997df7997df7997df7997df7997df 7997df7997df7997df7997df7997df7997df7997df7997df7997df7997df7997df7997df 7997df7997df7997df7997df7997df7997df7997df7997df7997df7997df7997df7997df 7997df7997df7997df7997df7997df7997df7997df7997df7997df7997df7997df7997df 7896de7896de7896de7896de7896de7896de7896de7896de7795dd7795dd7795dd7795dd 7795dd7795dd7795dd7795dd7795dd7795dd7795dd7795dd7795dd7795dd7795dd7795dd 7795dd7795dd7795dd7795dd7795dd7795dd7795dd7795dd7795dd7795dd7795dd7795dd 7795dd7795dd7795dd7795dd7795dd7795dd7795dd7795dd7795dd7795dd7795dd7795dd 7795dd7795dd7795dd7795dd7795dd7795dd7795dd7795dd7795dd7795dd7795dd7795dd 7795dd7795dd7795dd7795dd7795dd7795dd7795dd7795dd7795dd7795dd7795dd7795dd 7795dd7795dd7795dd7795dd7795dd7795dd7795dd7795dd7795dd7795dd7795dd7795dd 7795dd7795dd7795dd7795dd7795dd7795dd7795dd7795dd7795dd7795dd7795dd7795dd 7795dd7795dd7795dd7795dd7795dd7795dd7795dd7795dd7795dd7795dd7795dd7795dd 7795dd7795dd7795dd7795dd7795dd7795dd7795dd7795dd7795dd7795dd7795dd7795dd 7795dd7795dd7795dd7795dd7795dd7795dd7795dd7795dd7795dd7795dd7795dd7795dd 7795dd7795dd7795dd7795dd7795dd7795dd7795dd7795dd7795dd7795dd7795dd7795dd 7795dd7795dd7795dd7795dd7795dd7795dd7795dd7795dd7795dd7795dd7795dd7795dd 7795dd7795dd7795dd7795dd7795dd7795dd7795dd7795dd7795dd7795dd7795dd7795dd 7795dd7795dd7795dd7795dd7795dd7795dd7795dd7795dd7795dd7795dd7795dd7795dd 7795dd7795dd7795dd7795dd7795dd7795dd7795dd7795dd7795dd7795dd7795dd7795dd 7795dd7795dd7795dd7795dd7795dd7795dd7795dd7795dd7795dd7795dd7795dd7795dd 7795dd7795dd7795dd7795dd7795dd7795dd7795dd7795dd7795dd7795dd7795dd7795dd 7795dd7795dd7795dd7795dd7795dd7795dd7795dd7795dd7795dd7795dd7795dd7795dd 7795dd7795dd7795dd7795dd7795dd7795dd7795dd7795dd7795dd7795dd7795dd7795dd 7795dd7795dd7795dd7795dd7795dd7795dd7795dd7795dd7795dd7795dd7795dd7795dd 7795dd7795dd7795dd7795dd7795dd7795dd7795dd7795dd7795dd7795dd7795dd7795dd 7795dd7795dd7795dd7795dd7795dd7795dd7795dd7795dd7795dd7795dd7795dd7795dd 7795dd7795dd7795dd7795dd7a94e17e98e57a94de728dd47b96d98fabec95b1f08ca9e5 718aef6f88ed6c85ec6981eb677feb667eec677fed677eee637aec6279eb6279eb6279eb 6178ea6178ea6077e96077e96076ed6076ed6177ee6076ed5d73ea5a70e7566ce3546ae1 96aff299b2f58099dc7b94d799b2f596aff27f98db849de06e86f46d85f36b83f16880ee 677fed667eec667eec677fed637aec6279eb6279eb6279eb6178ea6178ea6077e96077e9 657cec5c73e55369e14e64de4e64de576de56d84f6839aff8ca9ef829bde8497d2959fd4 a1a0caa094b89f8ca8a38ca69e86949d85939d82919b808f9b7f8e9d7e8e9d7e8e9d7e8e aa768caa768caa768ca9758ba9758ba9758ba8748aa8748a9d78979b738e986d88966e88 9976969e85ada296c8a7a2da7478db757bd37279c7666dbb7176d15053be6068bd7678f1 7b81f36776b7869ccb788eda6e86de7f9ee17a95dc7a97dd7b9add7b9cdf7c9fdf7aa0de 7ba1df7aa2df7fa0e37fa0e37e9fe27d9ee17c9de07c9de07b9cdf7a9bde7c9ae07c9ae0 7b99df7b99df7b99df7a98de7a98de7a98de7b98de7b98de7b98de7b98de7b98de7b98de 7b98de7b98de7b98de7b98de7b98de7b98de7b98de7b98de7b98de7b98de7b98de7b98de 7b98de7b98de7b98de7b98de7b98de7b98de7b98de7b98de7b98de7b98de7b98de7b98de 7b98de7b98de7b98de7b98de7b98de7b98de7b98de7b98de7b98de7b98de7b98de7b98de 7b98de7b98de7b98de7b98de7b98de7b98de7b98de7b98de7b98de7b98de7b98de7b98de 7b98de7b98de7b98de7b98de7b98de7b98de7b98de7b98de7b98de7b98de7b98de7b98de 7b98de7b98de7b98de7b98de7b98de7b98de7b98de7b98de7b98de7b98de7b98de7b98de 7b98de7b98de7b98de7b98de7b98de7b98de7b98de7b98de7b98de7b98de7b98de7b98de 7b98de7b98de7b98de7b98de7b98de7b98de7b98de7b98de7b98de7b98de7b98de7b98de 7b98de7b98de7b98de7b98de7b98de7b98de7b98de7b98de7b98de7b98de7b98de7b98de 7b98de7b98de7b98de7b98de7b98de7b98de7b98de7b98de7b98de7b98de7b98de7b98de 7b98de7b98de7b98de7b98de7b98de7b98de7b98de7b98de7b98de7b98de7b98de7b98de 7b98de7b98de7b98de7b98de7b98de7b98de7b98de7b98de7b98de7b98de7b98de7b98de 7b98de7b98de7b98de7b98de7b98de7b98de7b98de7b98de7b98de7b98de7b98de7b98de 7b98de7b98de7b98de7b98de7b98de7b98de7a97dd7a97dd7a97dd7a97dd7a97dd7a97dd 7a97dd7a97dd7a97dd7a97dd7a97dd7a97dd7a97dd7a97dd7a97dd7a97dd7a97dd7a97dd 7a97dd7a97dd7a97dd7a97dd7a97dd7a97dd7a97dd7a97dd7a97dd7a97dd7a97dd7a97dd 7a97dd7a97dd7a97dd7a97dd7a97dd7a97dd7a97dd7a97dd7a97dd7a97dd7a97dd7a97dd 7a97dd7a97dd7a97dd7a97dd7a97dd7a97dd7a97dd7a97dd7a97dd7a97dd7a97dd7a97dd 7a97dd7a97dd7a97dd7a97dd7a97dd7a97dd7a97dd7a97dd7a97dd7a97dd7a97dd7a97dd 7a97dd7a97dd7a97dd7a97dd7a97dd7a97dd7a97dd7a97dd7a97dd7a97dd7a97dd7a97dd 7a97dd7a97dd7a97dd7a97dd7a97dd7a97dd7a97dd7a97dd7a97dd7a97dd7a97dd7a97dd 7a97dd7a97dd7a97dd7a97dd7a97dd7a97dd7a97dd7a97dd7a97dd7a97dd7a97dd7a97dd 7a97dd7a97dd7a97dd7a97dd7a97dd7a97dd7a97dd7a97dd7a97dd7a97dd7a97dd7a97dd 7a97dd7a97dd7a97dd7a97dd7a97dd7a97dd7a97dd7a97dd7a97dd7a97dd7a97dd7a97dd 7a97dd7a97dd7a97dd7a97dd7a97dd7a97dd7a97dd7a97dd7a97dd7a97dd7a97dd7a97dd 7a97dd7a97dd7a97dd7a97dd7a97dd7a97dd7a97dd7a97dd7a97dd7a97dd7a97dd7a97dd 7a97dd7a97dd7a97dd7a97dd7a97dd7a97dd7a97dd7a97dd7a97dd7a97dd7a97dd7a97dd 7a97dd7a97dd7a97dd7a97dd7a97dd7a97dd7a97dd7a97dd7a97dd7a97dd7a97dd7a97dd 7a97dd7a97dd7a97dd7a97dd7a97dd7a97dd7a97dd7a97dd7a97dd7a97dd7a97dd7a97dd 7a97dd7a97dd7a97dd7a97dd7a97dd7a97dd7a97dd7a97dd7a97dd7a97dd7a97dd7a97dd 7a97dd7a97dd7a97dd7a97dd7a97dd7a97dd7a97dd7a97dd7a97dd7a97dd7a97dd7a97dd 7a97dd7a97dd7a97dd7a97dd7a97dd7a97dd7a97dd7a97dd7a97dd7a97dd7a97dd7a97dd 7a97dd7a97dd7a97dd7a97dd7a97dd7a97dd7a97dd7a97dd7a97dd7a97dd7a97dd7a97dd 7a97dd7a97dd7a97dd7a97dd7a97dd7a97dd7a97dd7a97dd7a97dd7a97dd7a97dd7a97dd 7a97dd7a97dd7a97dd7a97dd7a97dd7a97dd7a97dd7a97dd7a97dd7a97dd7a97dd7a97dd 7a97dd7a97dd7a97dd7a97dd7a97dd7a97dd7a97dd7a97dd7a97dd7a97dd7a97dd7a97dd 7a97dd7a97dd7990de8299e57f97e17991d788a1e49cb5f592ace97791cc7ba3e978a0e6 749ce46f96e16c93e06a91e06a90e16a90e1698fe4698fe4688ee3688ee3678de2678de2 668ce1668ce16285e96285e96184e85f82e65b7ee25679dd5174d84e71d55c73b693aaed 8097da7990d3acc3ff96adf06e85c895acef789fee769dec7299e86f96e56c93e26a91e0 6990df6990df698fe4698fe4688ee3688ee3678de2678de2668ce1668ce16185e36387e8 688bf1688af55b7de84d70d64c70d15478d697b4f88199d98998d1afb1e1bfb3d7af97b1 ac899dbf96a6c289acc087aabf83a7bc80a4bb7da2bc7ca1bc7ca1bc7ca1b97e9eb97e9e b87d9db87d9db87d9db77c9cb77c9cb77c9cba7789b87183bd7485ba7587a2647d895a7c 9a79a6bea6da797dd87b80d47077c8757ad5686cd06368cc6267cb6d73d37580d97687d7 768cd77893da7996dc7795dd58a0db949ced5b86e595aaaf6da1f57c99ff7da2cf909fd8 7d9ee57d9ee57c9de47b9ce37b9ce37a9be2799ae1799ae18197e3799add779fdd799be3 768be47d90ef7b9aed6f9be27a92ec8098f07e97eb7e97e7839dea7e97e77891e37b94e8 7b94e68099eb829beb7e98e57690dd748ed97a94de819be57091d47c98e28498ee8292f1 8090ef8094ea7a96e07192d58496ea7e93e67c91e47a90e37891e17792e17895e37b98e6 7993de7892dd7690dd7c96e3829ce97891e1738cdc7f98e8809be2758fd9728cd77b95e2 839cec7f98ea7a93e57891e57293da7694dc7896de7b97e07b95df7d95df7e94df8194e0 7f96e47b92e2768fe17590e17792e37a93e58198e8859cea7a96e07a96e07a96e07a96e0 7a96e07a96e07a96e07a96e07393cc7997dd7b9aec7897e97393dc7492d87a94df7d96ea 7493d37a99dc7e9ae47e97e97d93e87d92e57c91e07d90dc7192df7596e37a9ae77c99e7 7a95e67a95e67f98ea849def7994d97a95da7996d87895d97795db7697de789ae27a9ce6 8092e87d91e77892e67493e57594e47a95e28197e28498e17c90d97b91da7d95dd7e98e2 7d99e27b99e17d9be37e9fe67994d97a95da7996d87895d97795db7697de789ae27a9ce6 7299da7799e07b98e67c92e77b8fe57c91e27d95df7c97de6f9ce06a8dcd7e9bd7748fd2 83a4f17296e4728cd68799db7a93e37c99df7897d87192d77592e27f97ed8399e57f92d6 769dea7399e47092d986a4ea7895db6e88d389a2f47890e67990de86a1ee7996e27797e2 7b9be47694da7e99de8099dc7e9de07997dd7692dc7790e0798fe2798ee17d92e58496ea 83a0ee7c99e77691e27790e07f96e4849ae68096df7d91d86a95da759be27c9ce77b95e2 7c93e17e98e57c99e57496e0778dd87997e07599e37292df798ee18196e77d9ae66e99de 7394e17495e27797e47996e47a95e67b96e77f98ea829bed7097dc7398dc7497d77395d4 7493d47996dc7e99e8819aee7995de7a96df7a97db7996d87996d87c99db7c99db7b98dc 7794ce7a96d77c99df7d98e77c97e87a97e57997e07997df7193d0769ad8769dde759be2 769ce77a9bec7995e8738ce07e99e67c97e47c96e37b95e07c96e17e95e17c93df7b92de 7f98ea7b94e67891e17993e07b95e27a94df7892dc7791db7a8dda7c92dd8096e18199e3 809ae5809bea7d9aea7995e87296e27691d48298d47c98d76d8fd76d90e17c97e88393e1 738fd97995df7c99e57797e47191de7390dc7c98e284a0ea7794e07999e67b9aea7495e6 6f90e17190e07898e57f9ce87691de7893e07b96e37b96e37a95e27994e17a95e27a95e2 7c96ed7d95eb7e94e77b92e27990de7990de7a94e17b96e37592d67693d77796d77798db 7798dd7698df7398df7397e17691de7893e07b96e37b96e37a95e27994e17a95e27a95e2 7698df7798df7697de7896de7995de7b95df7e96e07f97e17a96e07a96e07a96e07a96e0 7a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e0 7a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e0 7a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e0 7a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e0 7a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e0 7a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e0 7a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e0 7a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e0 7a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e0 788fd57995e97698e07796cd8290e8b4cce47086eb7da4e9849def8099eb7b95e97791e8 7691ea7391eb728feb708fec718be86f8ce86e8be96c8aea6b89e96889ea6789ea6688ea 6385e96284e86081e85f80e95e7fea5a7ae75575e45171e03a61c8c0b8e76995dc7a98d4 c4c5f56a8ee485a0f187a1ec769ee47493cc8595f47083ea7aa0e7658ff16488ff6e95e4 6f8ce86e8be76d8ae66c89e76a86e76985e66884e76783e66a87ef5987d55990e25a8bea 4f72d8657bf25066de4967c7bdb9de7596d9759be2cdc8f1ad8aa0b699b7b69ec0bc98b2 c08daeb17e9fb687a7bb8daaad809daf819eba8ca9b786a4a57390b88aa4af859da17a8f b2869dbb859db97993c47b98a17d89b06e8ab97294b07a92a76d83b166878e5b86b2b1db 717fd8717bd47378d37374d06a6bc85f5fc16267cb6d73d37580d97687d7768cd77893da 7996dc7795dd629edda290dc79a5ca6ba9fc9689ce60a5e87e97cf719ceb7d9ee57d9ee5 7c9de47b9ce37b9ce37a9be2799ae1799ae17d97e4799ce0749ddb7a9ddf8299e58497e6 7e99e079a0db7694d47795d37695ce7392c97392c97997d37d9bd97996d87995de7692db 7491d77794da7c99df7f9ce27d9ade7a97db799add7997dd7690db7489d8768bda7993de 7b99df799add7690db7791dc7993dd7a96df7996dc7794da7592d67392d57a97db7b98de 7b98de7b98de7b98de7996dc7794da7692db7b98da7c99db7e9bdf7d9ae07895db7490d9 7793dd7d99e37997df7997df7a96df7995de7a94de7c94de7e94df7f95e07690da7892dc 7b97e07e9ae47d99e37894dd748ed8718bd57a96e07a96e07a96e07a96e07a96e07a96e0 7a96e07a96e07a9ad77d9be37998ea7491df7794d6839dd8899edd8899df7799d67799d9 7795db7692dc7690dd7a92dc7c94da7e95d97d9cdf7c9bde7b99df7896dc7591da728ed7 708cd6708cd67b97e07a96df7a97dd7b98de7c9ae27b99e17896df7593dc7b90df7a94e1 7b98e47b9be47a9be27795db748fd4748bcf869ce58298e17d95df7993dd7793dd7591db 718eda708dd97b97e07a96df7a97dd7b98de7c9ae27b99e17896df7593dc6a91cc7094d2 7896dc7d97e28198e67e98e37896dc7294d47299d4809dd596abe4738bcb7898e37498e6 7995df8699dd758ede7895db7b9adb799adf7a97e77a93e77a90db7b8fce7696df7090d9 7492d87f9ce27592d87591db83a0ee7491e16f86ca7e96dc738fd87898e17e9ee77593db 7a97dd7e96dc6e8dcd7794d67b98dc7b98de7b97e07d97e27993de728cd76c8bce7491d7 7c99df7e9be17c99dd7a95da7a95d87b96d97098d67298d77695d67691d67893d87a97dd 7697dc7095d97a90db7b9add799dd97897d07d91cc8294d47a96d76d93d47f9ee17c9bde 7896dc7694da7591da7490d9718dd76f8bd5779ce3779ce2799cde7a9cdc7d9cdd7d9ae0 7995df768fdf7995de7996dc7a97dd7a97db7b98dc7c99df7b98de7996dc7296e27495e2 7395df7494df7794e07896df7b97e17d99e37c97dc7b98de7899e07297de7095dc7395dc 7b99df819ee26e8ad3708cd57390d67592d87794d87a95da7d98db7f9add7591da7692db 7895db7a97dd7b98de7b98de7b98dc7d9ade819ce17f9adf7994d77390d2728fd37592d6 7895db7997dd7c9ef5738edb768bce7793d2779ade7ea4ed82a0e6798cce7895d77794d8 7695d87997dd7c9ae07998db7390d46c89cb7391d77290d67192d97697de7c9de47c9de4 7896dc708ed47997df7795dd7694dc7694dc7896de7997df7997df7896de738fd9738fd8 7791db7a95dc7d98df7d98df7996dc7794da819fe77d9be37896dc7293d87293da7495dc 7898e17a9ce47997df7795dd7694dc7694dc7896de7997df7997df7896de7799e07798df 7798df7997df7995de7a94de7c94de7c94de7a96e07a96e07a96e07a96e07a96e07a96e0 7a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e0 7a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e0 7a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e0 7a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e0 7a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e0 7a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e0 7a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e0 7a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e0 7a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07990d67a96ea 7799e17796cd8290e9b4cce66f85eb7ba1e8819aec7c96ea7892e7748fe6738ee9708de9 6e8dea6d8ce96a86e76a86e76985e86684e66383e66282e76082e65f81e55e81e75d80e6 5c7fe75b7ee65a7ce75779e55375e34f71df3e65ccc4bbea6c96de7b99d5c3c3f5678be3 819ced819de7728ff38fa5ee919af7777fe4718acd6984db7286f6788bd76386ec6386ec 6285eb6184ec6082ed5f81ec5e80ec5e80ec6b74f36479e65c7de46a8bfc4d6ae2627af6 4e6ad84062b9bfbde27798db759be4c9c4eda68397ad90acae94b7b48da8ac869db794aa c19eb4b791aaa77f99ad7f9bb2809daa7393b987a29b6984ad7b96bd8ba4a47087a26c84 b27b92a56e85bba6abb17b93a96a89aa7a90ab7489a75c7d86537ec9c8f2717fd8727cd5 7378d37374d06a6bc85f5fc16267cb6d73d37580d97687d7768cd77893da7996dc7795dd 938ccf6294c98caef86497e6b398c37597df6cbbd97895fb7d9ee57d9ee57c9de47b9ce3 7b9ce37a9be2799ae1799ae17b98e6759be26997d56e95d08ba4dd8394ca7589bb7895bf 8197e07e95db859ce08198dc788fd5869ce88a9ff07286dc7e9ddd7b9adb7998d97c9bdc 809fe2809fe27b9add7694da789ae27596dd7794d87c98d9809cdd7e9bdf799ae17799e1 7495da7697dc799add7d9cdd7e9ddd7f9ddb7e9cda7d9bd77a99dc7a99dc7e9de07c9bdc 7594d57b9adb7e9dde7392d37a99d97f9ede809fe07a99da7594d77695d87b99df7d9be1 7c9ae27c98e17a96df7993dd7993dd7c94de7d95df7e96e07896dc7997dd7a99dc7a99dc 7b9add7c9bde7c9ae07b99df7a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e0 7897d87b9be67695e57492da8ca7dcafc5eebbc8f2b1b9e8799cdc7798db7596db7896de 7b99df7e9bdf809ede829edd7996d27995d47995d47a98d87e9bdd7f9ee1809ee47f9de3 7895e17693df7491dd7792df7b97e17e98e37c96e07993dd7f99e37c98e17798dd7598dc 7699db7899dc7e9bdd809bde7e96de7c94dc7a92dc7a94df7f99e6829dec829dec809ded 7895e17693df7491dd7792df7b97e17e98e37c96e07993dd7da2d97a9cd97998d97996dc 7b97e07a9be2789de177a0e09eb9e6b9ccf7c5d1ff8295d07591da7697e67a98e17b92d5 768fdf7592d87998d97d9ee57b98e8768fdf7f96da90a5de8a9fe2778ed27d95db7995de 7391d97b9ce3789ae17698df899ed58ba1db7790d27a98de819fe8728fdb7792df7c96e1 7694d47d9bdb7e9cdc7796d77796d77d9ee17d9ee37697dc7d9bd97f9ddb809edc7c9cd9 7796d67496d5799bdb7fa1e181a4dc7c9cd77997d37b97d67c9ada7a99da7598da749adb 89a3f06f8ece89aedacdecffd6e6ff98a5d2778cc58ba9e97a97d37894d37894d37a98d8 7f9cde81a0e3809ee47e9ce27698e27496de7495da7798db7d9cdd7d9ade7996dc7692db 7996dc7895db7995de7b97e07c98e27b97e17995df7793dd7297ef769beb799ee47e9edb 7d9ad27c95ce7b90cf7b8ed28596de7d91da7991db7997df7596db6f91d17393ce7d9cd3 7f9de5819fe7819fe57d9cdf7796d77392d27393d07595d27796d67b9adb7e9dde7c9bdc 7998db7796d97897da7a98de799bda799bdb7a9cdb7d9cdc7d9cdc7d9bd97d9bd97d9bd7 688ce47590df879cdf839cdc7194d67097da789ad97790c982a0e07c9ada7795d57896d4 7c9ad87f9ddd7e9cdc7c9ada7fa1e17b9adb7796d77998d87e9ddd809fe07f9edf7a9cdc 7c9de27899de7596db7596db7798dd799adf799adf7798dd7c9cd97b9ada7a99d97d9cdd 809fe0809fe07d9cdf7998d97393de7595e07797e27b98e47b99e27a98e17995de7894dd 7c9de27899de7596db7596db7798dd799adf799adf7798dd7798df7798df7997df7997df 7995de7993dd7892dc7791db7a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e0 7a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e0 7a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e0 7a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e0 7a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e0 7a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e0 7a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e0 7a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e0 7a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e0 7a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07b92d87b97eb7799e17897ce 8290e9b3cbe56d82eb779de67c96ea7993e8738ee5718ce56e8ce66c8be86b89e96987e7 6782e96681e86481e7627fe75e7de75b7ce55a7be6587ae5597ce4587ae55779e45779e5 5779e55577e55274e24f71df4267cfc7beed6e98e07c9ad8c2c2f46487e17b97ea7b96e3 7992d5daedfbf2f9fff9fefff5fff8f2fffff7fffff4f9f3fffef4fffef4fffdf3fffdf5 fffcf6fffcf6fffaf7fffaf7faffeef7fff6e4fbf5d4eeff627bd85771e84e6edd4e71d9 c1bfe67899de749ae3c7c0eaa47e93aa8ca8ab90b1b28aa4a19299e6d5ddfce8f3ccb4c2 a58497a67a93b17a99b37697ac7a95a66f8ca96d89b77694af738d9a667ca57c8eccacb9 f5f4f2dcb7c8aa7891946d7fa67183ac618085507ac8c6ee7280d9727cd57479d47475d1 6a6bc85f5fc16267cb6d73d37580d97687d7768cd77893da7996dc7795dd8c90cd6f97ef 5490d898a3e5818fd8b7978c81a4da76a1ef7d9ee57d9ee57c9de47b9ce37b9ce37a9be2 799ae1799ae17595e2739de772a2e289b2e6d1eaffd7e6ffd5e3ffe3f6ffd2e5f3cce0eb d9edf8daeef9ccdfeed8eaffcedffd9caccd7394d77798db7a9be07899e07394db7191da 7292dd7595e07392e57090dd7593d97c9bdb7c9bdb7694da7191de7493e67499e07698e0 7496dd7192d77392d57794d67996d87896d67595de6d8dd67494dd7899e07091d87394d9 799adf7293d87495da7596dd7394db6f90d77495dc7b9ce3799ae17192d97b97e07995de 7993dd7a94de7b95df7b95df7b95df7a94de7192df7494df7593db738fd87591da7896de 7999e47899e67a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07593d97999e6 7595e27796d69fbae5d6e7ffe4eaffcfcfeb7797e27494df7494df7898e37c9ae37997df 7593d97493d67d96d87d96d97d96d97a95da7895db7694dc7694dd7694dd7c99e57b98e6 7895e57893e47992e27c93df7f97e18098e07895e37693df7191da7091d87192d77495dc 7997e07c99e57994db7b96dd7b95df7892dd7892df7992e27691e0738edf7c99e57b98e6 7895e57893e47992e27c93df7f97e18098e0799add7897da7692db7591db7390dc6f93dd 759ce77ba7f0ccddfbe2ebffe2e7ff929dd57a92da7697e67895e17790d37e98e57592d8 7594d5799ae17794e27892df94aceab9cffeb0bbf38795d28699de7b95df7797e07b9de4 6f95d484ace7c4d3fcafc1f18197d17994d97d9ae6718edc7893e27d98e77894de7894dd 7693d97392d57192d77294db7496de7397e1819ee27b98da7491d37190d07294d47497db 7395dd6f93dd7a96d77490d1748fd27895d97895db7391d97193da7698e0738de482a3e6 a5c8f0c9e3fad0dcf6b3b8e28c9ad7768ed87c95d77c95d87c95d87a95da7895db7694dc 7593dc7593dc7a97e37795de7593db7694da7895d97895d97a97db7e9bdf7a97dd7894dd 7995df7b96e37b96e57994e17894de7995de7492db8aa8e6a9c5f4c1daf9cfe3fcd6e5ff dce5ffe0e7ffb2bdf395a4df7f92d47e96dc7e9ae37694da7594d57d9bdb7792e17693e1 7794e07795de7596dd7596db7497db7497d97495d87798db7697dc7293da7091d87292db 7393de7292dd6e93d77093d77395dc799ae17b99df7895d97694d47694d27399da94b1eb b3c7faa2b9ef7897d8698fd8789ae27f9adf7694dc7996dc7a95da7891d4758ed1748fd4 7996dc7e9ce47798df7997dd7b98dc7a95d8748fd2708dd17492d87a9be27696e17595e0 7595e07494df7494df7494df7494df7494df7a98d67796d67394d77193da7193db7495dc 7997df7b98de7395df7797e47a99e97e9beb7f9ae97d97e27993dd7691d87696e17595e0 7595e07494df7494df7494df7494df7494df7795dd7795dd7896de7a96df7a96df7995de 7894dd7793dc7a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e0 7a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e0 7a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e0 7a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e0 7a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e0 7a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e0 7a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e0 7a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e0 7a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e0 7a96e07a96e07a96e07a96e07a96e07a96e07d94da7c98eb7799e17897d0828febb3cae9 6b80ed7398e67993ea7590e7718ce56d8be56b8ae76a88e86687e86484e76682ed6581ec 6480ed607eec5c7ce95a7ae9587ae85778e95478e65377e55276e45377e55478e65377e5 5074e44e72e24568d0cabeee7199e17c9ad8c1c3f66186e17795eb7794e4838ff3f5ffff fffefffffbfff9fbeefbfff0fffcfffff2ebfefffffefffffefffffefffffefffffeffff fefefffefefff8eff0fffafffffdfff4fdff6779e94e6beb476dce4268c9c1bfe77899e0 7498e4c7c0eaa78095b18faab394b4bb8fa8d5d4d0fffffbfffefff7ecf2cfb7c4a78095 a36c89c283a2a5708aba7f9bb26d8ca8617fb0728baa7d91c2abb5fff9fef5fffbfff7ff e0b6cc9c7a8aa06d7cb56a898a557fbbb9e17381da737dd6757ad57475d16a6bc85f5fc1 6267cb6d73d37580d97687d7768cd77893da7996dc7795dd709fed6e95fc918bbb629df7 8aa2d2ce4703849aed8d9db67d9ee57d9ee57c9de47b9ce37b9ce37a9be2799ae1799ae1 7e9ee9749eea71a0e480aadad1ebffd4e2efd1d9ecd4ddfce0e3ffd5d8ffe0e3ffe3e6ff d9dbffe2e3ffd0d0ff9595d57895e17996e27a97e37a97e57a97e57b98e87e9beb809ded 8099f37d99ed7d9ae87b9ce37798df7592e07a96ea829bf57999e67d9dea7e9be97895e1 7794e07b96e37b96e37792df819df07793e67996e6819eec7f9cea7996e27b99e2809ee7 7a97e77e9be97f9cea7e9be97f9cea829fed7f9cea7a97e37892dc7791db7892dc7a94de 7d97e17d97e17995de7692db7497eb7c9bed819ceb8198e48198e47f9ae97998ea7093e7 7a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07995de7e9be97696e37999d6 a3bfe4daebfde2e5f6c5c0d4839df27e98ed7b97ea7f9cec7f9cec7a97e77895e57a97e7 7b92e07e95e38198e67e98e57b95e27a93e37c97e67f9ae97b98de7f9be5839cec819aec 7c95e77a91df7a92da7c94da7695e87b97ea7e9be9809ce67f9be57a97e57591e5708ee4 7491d77d9ae0839de77e98e27b95df7c96e07c96e07993dd7b98de7f9be5839cec819aec 7c95e77a91df7a92da7c94da738fe27893e48099eb859ef07e9beb7798e77aa1f083acfc d8e3f7dde2f8d8d8fa8f99ce7e94dd7596e77696e17c97da819be87592d87392d57798df 7693e17b95dfa3bcf2d4ecffd3d6ff979ed48594d77e95e17c9ce97499dd7097d0a1caf8 e6f1ffc6d4fb879bce788fd27d99e37592e27996e47a95e47e98ed7791e57994e182a0e8 819fe77693df7190e07897e9758fe37792e17b97e17e9ce4809ee67e9be77897e97493e6 788fdd7791de7a95e27e99e87a97e57693e17a95e4809bea728aea89a7f0b2d3ffdbf0ff dfe5ffbabced8c96de7086dc788fdd7c93e18097e57e98e57b95e27992e27a95e47d98e7 7f99e37d97e17e9ae37f9be47a96df7390d67693d77d9ade7c99df7995de7994e17b96e5 7994e37793dd7d9ade86a4e4b1c2edc6d6f8ddeeffe7f5fee3eef4dce3eddddef0e2e0f8 e3f2ffb2c4ec859ad17992d57d98e57d98e97d98e7829ce97e97eb7b94e87791e57993e7 7c99e97b9aea7899e87495e47b98e47d9ae67b98e47794e27996e4819eee83a0f07f9cec 80a0e97a9ae57996e67a96ea7995e87691e07793dd7c99dfabd2f1c5e0fdd3e4ffb2c3ef 839cdc7697e8809ef67f97ef7695e77c97e8839ae8879ae68598e47d94e27691e27190e2 7293e47693e37f99e4889ee9849ae57892dd7491e17596e77793e67c98eb809cef809cef 7c98eb7995e87a96e97c98eb7a92da7a96df7999e67497e87194e57594e47c97e4849be7 82a0e67f9de67c97e67893e47792e37993e07b96dd7c97dc7793e67c98eb809cef809cef 7c98eb7995e87a96e97c98eb7793dc7894dd7894dd7995de7a96df7997df7997df7997df 7a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e0 7a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e0 7a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e0 7a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e0 7a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e0 7a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e0 7a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e0 7a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e0 7a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e0 7a96e07a96e07a96e07a96e07e95d97c98eb7799e37897d08390eeb3caea697ded7095e6 7691ea748fe86e8ce66c89e76a88e86788e96484e76183e76581ef6280ee617fed5e7eed 5b7bec5879ea5579eb5478ea5377e95276e85175e75276e85377e75377e75175e54f73e3 4465cccabced7098e07d99dac1c2f86185e37595ec7493e67980eaf5fffffaf8e9fffaff fafaf8fbfff0fffdfffffbf8fcfffffcfffffcfffffcfffffcfffffcfffffcfffffcffff fffefffff2fff6ebe5f3f6ff596adc5376f64e7ad14162cbc0bde87698df7498e4c7c0ec a78095b28eaab694b5bd90a7fffefbfaf9f7f7f7f5fffefffffaffceafbea17489ae7691 b47e98aa6e88b4728eae6c87a36c83ceacbafff6f9fbffffe4f5ebfff8ffffdff3b993a2 a26d7db065838b597fbfbfe57482db747ed7757ad57576d26b6cc96060c26267cb6d73d3 7580d97687d7768cd77893da7996dc7795dd6a94e875a1e0989bff6b95d1e78f45854265 8a93ccd7a38b7d9ee57d9ee57c9de47b9ce37b9ce37a9be2799ae1799ae17693d9698edc 6d9be67da7d9d7f2ffe2eff7e4e9ffd4d7ffe4ecffd8e1f2d9e2f1dae3f2d8e1f2e2eaff d4dbf7abb1d17f99e67993e0738dda7690db7c96e07e99e07994db738ed5778dd97d94e0 7e99e67b98e67895e37994e17a91dd798fdb7087cd7a90d97e96e07b95e07e98e5839eef 819df07995e87992e47c95e5758fdc748ed97d97e17691d8708bd07c97da748edb7993e0 7f99e4809ae57892dc718bd5748fd67d98df7c94de7b93dd7a92dc7a94de7d97e17c98e1 7995de7492da7494e77b98e67d93de788ad2798bd37f95e07e9be97898eb7a96e07a96e0 7a96e07a96e07a96e07a96e07a96e07a96e07a94de7d9ae87697e4799dd9a2c2e8d5eafd dadff2c0bbd17a91e1748bd9748bd77892dd7993de7691e07d97eb87a3f77690e47892e6 7a93e57b95e27d94e07f95e08096df8498df7287c6778ed17e94df8198e87d96e87a94e1 7794da7794d67693e37792df7991d97990d47a91d77a91dd7892e67994eb7391da7d99e2 809de37b96db7893d67f98d8819bd87d97d47287c6778ed17e94df8198e87d96e87a94e1 7794da7794d67e99f27b95ea7b94e67c93e1758dd76e8ad37696df85aaf1dce8f6d6dbee cdcdef8f96cd8096e17495e67595de7f9bdc7c96e17693d97796d97a9be27895e17f9adf a5c0efd3edffdfe0fea7abd8808ecd7b92e07d9cec7295d97fa3d5bae0ffe1e7ffc9d2f3 8f9dce7b8ed07e98e37b96e57c99e57492da7f9bef7693e1738fd87893d67793d4758dd3 798fdb8297e87994ef7e9aee829dea7e99e07691d6758dd77c91e28397ed7e96ec829cf1 819df07a97e57592de7690db798fda798dd67e98ef6987cf8ba9dbd3e5ffd9deff999bd6 7686d389a7ff728ce07690e47b94e67c96e37d94e07d93de7e94dd8296dd768fd1758ed1 7b93db819be67e99e67692dc7492da7a98e07c98e17995df7994e37a95e47793dd7996d8 8baae1a0c0f1dae1f3dfe6f6e2e9f9dde4f6d4dbedd1d9eed6def5dee5ffc7dafaa3b9e2 8399d27893da7d98e97b96e7748ddd7188d48296df7f92de7b91dd7b92e07a95e47a96e9 7695e87392e57690dd7c96e37b95e2748ed9738dd77994db7a95dc7590d77c93d7788ed9 7b92e2829af0839bf37a94e87794e27c9ae3bbdfebd4ecf6dbe7f7adb7da7588c26a85d2 7892e9788ee47c9af07893e4768cd87d8dd88595e0859be77e99ea7694ea7c9cef7592e0 748cd67f91d98496de7e96e07a97e57b9bee728ad4768ed87991db7a92dc7890da768ed8 778fd97991db8294e08297e67f9bee7b9bee7697e87592de788ed77c8fd3738bc9758ed0 7991db7b94e47c97e87c97e47a98de7998d9728ad4768ed87991db7a92dc7890da768ed8 778fd97991db7b95df7b95df7a94de7995de7896de7997df7899e0799ae17a96e07a96e0 7a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e0 7a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e0 7a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e0 7a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e0 7a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e0 7a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e0 7a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e0 7a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e0 7a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e0 7a96e07a96e07e95d97b97ea7698e27796cf8491f1b4cbed697df06f93e77391eb708de9 6d8ae86b89e96889ea6686eb6283ea6081e85f7deb5f7deb5c7ce95a7ae95879ea5478e8 5276e85276e85277ec5176eb4f74e95075e85176e95176e85075e74e74e34464cbcbbbec 7197e27d99dac0c1f95e85e47193ed7191e67884d8f5ffe4feffdafefcfff7fffff2ffff f5fffffbfffffffef9fffdfafffcf9fffcfbfffbfcfffbfcfef9fdfef9fdf1fff1f4f4fc ffffd4f9ffe65670d1517bf4517ed14e66e2c0bfeb7799e17498e6c7beeba67c92af88a3 b08bacb7869cd6c2cdf7eaf3fffcfffefcfffffdfffff2fad3b5c19d7786ae748da76b85 a26880ab778dcea8b7fdeaf0fffffff2fdf9fbfffaffe7f2deaac0ab7c8ca46a79ac607c 88597dc1c5ea7583dc757fd8767bd67576d26b6cc96060c26267cb6d73d37580d97687d7 768cd77893da7996dc7795dd6987cdaca8db5199eee38a90cc561871aeefbe4b5ad5b1a3 7d9ee57d9ee57c9de47b9ce37b9ce37a9be2799ae1799ae18ea5e97899e881aafa83abdf cee9fcd3e0e8cccfee9d9cd68799e38395dd7f92d67e91d38295d78699de8092dc7385d1 778ed27d94d7849cdc879fdb849dd5819bce809bca819ccb8499c8869dd37c95d7708ad5 758fda87a0e28ca3d98297c68895ca8c9bd28598d2798ecd748dd07894dd7794e06e8edb 6e85c88fa7e78098d66b83bf849dd58aa3d97d97ca86a0d1869edc7890ce748cc88099d2 869fd88099d1819ad08aa3d9889ee98399e47c94de7993dd7a96df7b97e07997df7694dc 7495d8819ddc889dd68595c98494c8869bd47e9ad97192d57a96e07a96e07a96e07a96e0 7a96e07a96e07a96e07a96e07b91da7a95e47397e57ba3e1a2c8efd1ebffdae4fdcac7e6 8498d38297d0859cd2899fd88098d4738cce718bd57c95e57c9dea7797e27492da7994d7 829ad8889dd68697cd8090c492a2d58a9ad57f92d67a90dc7a93e37a97e37899e07497d9 7d99da809ad5849bd1879bce869acf8197d17c95d87892dc809de9809ee77895db6f8dcd 7390ca809bd0819bcc7994c392a2d58a9ad57f92d67a90dc7a93e37a97e37899e07497d9 7a96e9738edb768ed48096d28299cf8097cb84a0d28fade1ddeef8dbe4f5d2d5f88e97d0 7e95e17495e67494dd7d96d67993de7895db7a99dc7a9ae37996e2839fe0a9c5edd1ecff dfe0f4bdc3e78492cf788fdd7b9aec7394d794b4e3c4e5ffdadbf0d1d6f69ea8d98092d4 7d95df7b97e17e9ce47493d67192d77d9cdc809fd57d99c98199c98b9fd48d9bd88690d5 7694ea7693e17794d87d97d28399d28598d38492d3818bd27592e27797e47193db678acc 7290ce869eda8e9ed98693ca7795d5809fd686a3cf8597bf858bbb868fca7e96dc719be7 7a9be87898e37896de7d98db849cda889dd68596cc8191c5869fd87a92d0748cd27c93df 7f98e87994e57794e27b98e47b97e07994e17a95e47b96e57895db7f9ed79ebfeac0e2ff e9effbd6dcf2b7bfe49ca8da8b9ad58397d48099d2809bd0869cd58199d97c96e07996e6 7b98e67f9ce2859fda88a2d38092c48495c98499d08298d47b94d67792d97a96e07d9ae6 6e85c98097da8ba3e3849cd87d96ce7f99cc819ccb7f9ac98e9bcf8291ca7b8cd17e91de 7b92e2748fdc7795db7fa1e1b5d1e6d2e2f2e0e3f6bcbddb8c98c8869bda89a2e47c94d2 6f8fda7794da8297d88696d28292ce7c91d27693d97595e07499df7897d88199d5899cd6 8194ce728ac67392d37ca1e7879cd38297ce7e93ca7f94cb859ad1899ed5889dd4869bd2 8794da7d8fd7728cd66f8fd87697dc809dd9889dd28b9cca899bcd879ad48499dc8198e4 7e99e87b9be67b9de4799fe0879cd38297ce7e93ca7f94cb859ad1899ed5889dd4869bd2 849ce6829ae47d97e17995de7795dd7697de7798df789ae17a96e07a96e07a96e07a96e0 7a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e0 7a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e0 7a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e0 7a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e0 7a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e0 7a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e0 7a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e0 7a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e0 7a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e0 7d94d87a96e97597e17795d18491f1b5cbf0697cf26e92ea708de96e8be96b89e96788e9 6787ea6485ec6081ea5c7fe75d7ce85c7de85b7be8587ae65579e75478e85278e75177e6 5276f05074ee4e72ea4e73e84f74e75075e84f74e64d72e44565ccccbceb7298e37d99da c0c1fa5d83e46f90ed6c8ee7858fffedffffe7f2f68385ea6a77e96580d7657edb6c7ee0 567eed567eef557dee547cee537aef5279ee5178ef5178ef4e6be96f70fefaf8fff4ffff 5673f14877f94271b5485ccfbfbeea7799e37599e7c7beeba67a91ad85a0ad86a5b37f95 a27792e1c1d8fff6fff6f3faf2f3f7fffdfffff3f7c7b4b8b3748fb27b92a3768ac4a4b1 fff6fcfffdfff4f6f3fbfffdfff9f7d8a8b8a6647f996073a86879b36481895b7fb8c3e3 7583dc7680d9767bd67576d26b6cc96060c26267cb6d73d37580d97687d7768cd77893da 7996dc7795dd938ee05ba5cce5947fb93e365997ece39476c54717898dca7d9ee57d9ee5 7c9de47b9ce37b9ce37a9be2799ae1799ae18294d66b88d87fa5f883aae1cfeaffdae6f2 d5d7fd9592d77293e47899e87799e37698df7a9de17698df7294dc789ae48498d3a3b8ef c2d8ffc6ddffb6cef4afc7e9c0d9f7d5efffd6ebffc3dafc9ab3e97a93d688a1e4b5ceff d1e8ffd1e6fbdbe5ffd3dfffbac9f496aadc819ad27e9cda7b9cdf7497db97addfd2e8ff bed4ff9ab1ddbfd6ffd5edffc4dcfec7dfffd0e6ffa8beed95acd8afc6f0cde4ffd0e8ff c8e0ffc6deff94a7f3899fea7e96e07791db7793dc7997df7997df7697de9abbeeb7d2ff d2e5ffdae8ffd2e0ffbbcef894afde7091c47a96e07a96e07a96e07a96e07a96e07a96e0 7a96e07a96e08094db7b96e37397e57aa3e39fc6f1c8e5ffd3e0ffc9c8f0ccdfffcde0ff d0e6ffcee6ffb5cdf990a9df7e97d77f97dd759cdf7096d77698d591afe5b6cefed1e4ff d7e7ffd2e0ffd5e2ffb8c5f994a3e47d91da7791de7797e27499df7097d8a7c3f3b7d2fd cee4ffdbeeffd2e4ffb5caf592abe17c96d17999e67997e07593d97c9ad89ab8eebfdbff cde9ffcae3ffd5e2ffb8c5f994a3e47d91da7791de7797e27499df7097d87596dd7e9bdd 9bb4ecc3d9ffd7edffd1e8ffc4dcfebfd7f9d1e5f0dae5f7d3d9fd8a94cf7a91df7696e9 7898e17c96d37b95e07b98de7a99dc7696df7693df88a4e3b0ccf3d7f2ffdfe1eed3d9f9 8d9dd8788fdf7c98eb7897daa1c0eec4e2fee2e0f5e2e5ffb1b9ea8796d97890da7793dd 809fe27799d8789dd2a4c9f6c4e6ffc6e3ffcce3ffd8e8ffc0cbf9989fd57697e67596db 85a4ddacc7f6d0e5ffd4e2ffb1bbee8d94cb7597df799ee2759bd9769bd296b6e7c4dcff d5e4ffcbd4fd9dbceab7d8ffd1efffd9ebffcdd5ffb1bcf483a3e05e90cd739add7298d9 7d9fdc98b6ecbbd3ffd3e6ffd9e9ffd5e3ffb6cdff99afe97e95d97b92de7d96e87a94e8 7793e67a97e77a96e07994e17b96e57c97e47996d884a4d7accef1d5f9ffd7e0f1b9c3e6 939fdb7a8adf738beb7495f67199f16b98e97089dd7b95ec7e99f47492ea7592de8cabe2 b4d0f5cfebffd4e5ffd5e8ffcee2ffb6cbf896ade17c96d17591d07794d68ca0dbacc1f8 c6dcffc6ddffbfd7fdc3dbfdcbe4ffcfe9ffe5efffc3cff99daae18496d67990d47c99db 92b4f1add2ffcbe1ffdae3ffe5e1fadbd8f7d3dcffd7ecffbdd5ff8aa2c87498d69ebdf6 cbe1ffd1e2ffb1c2f08ba1d37796cf769ad8739ad399baefc8e0ffd5e8ffb3c6f189a1d1 7e9fd48cb3ecd0e7ffc3dafcb7cef0b9d0f2c6ddffcfe6ffcee5ffc8dfff9ea8e58c9cda 7a92d27d9cdc97b7f0b7d2ffcde1ffd5e4ffd3e2ffbcccff9baded7d93dc6e89d67193dd 7ea5ea8ab3f3d0e7ffc3dafcb7cef0b9d0f2c6ddffcfe6ffcee5ffc8dfff89a1eb869ee8 7f99e37995de7694dc7495dc7697de7698df7a96e07a96e07a96e07a96e07a96e07a96e0 7a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e0 7a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e0 7a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e0 7a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e0 7a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e0 7a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e0 7a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e0 7a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e0 7a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07c93d77995e8 7496e07795d18591f3b5cbf0697cf26e92ea6f8cea6c8be86987e76686e96486ea6283ea 5e81e95b7de85d7ee75c7de65c7de85a7ce7577ce7567ae8547ae7547ae95076f14e74ef 4b72eb4b72e94c73e84c74e64b73e44a72e34966cecebcec7399e47d98dbbfc0f95a82e4 6c8fed688ce47587ebeaffecf1fffa7580e96078f6618bed5b86ec5c81eb5c7de65b7ce5 5a7be4597ae55878e55676e35575e45575e44b80e6586de4f3ffffe5ffea4e72e04c80fa 4d79c05862e5bebceb7698e27599e7c9c0eda87c93af87a2af88a7b57f96b379a1a97c9d d0b7cdfffcfffcfffff4f8f7fbfaf8fffdfbdc9ab5af788fc49fb0fff1fafffefffafcfb f7fcf8fcfffdbca7a6aa6f83a55977af6e84b56e80b666818b5f82b3c2e17684dd7680d9 777cd77677d36b6cc96060c25867c47a80de7378d47382d77797e26c94d97298d97c9bde 6e84d084ace7785b31ff904afc837ab2451ae0a2797d97f685a0f1698fd879a6e77ba4e2 7695d6819ce183a3ec719be37c94d46f9ee47b92e279b1e2dee1ffd0edf3d3d1e791a1c2 7692db7790d37c90cf8595d38599d87c99df7499e9709df26f99e39abff3cee9ffcfdfee dce5f6d9dff9e4eeffdae9ffdee7eeb2bbe2909ee98498efb9d2ffc6dffdd6ede7d7ebd2 dcdeeddce2eed6dee9cccee3b8b3dc8d91d0768ddd7da6ff7ab0f6ccebffd7dbdce4dbf8 dbe0ffd3eaf8cbdfe6dbe2fccde4f4d1dfead9dde8e2e8f8d7e5ffd0e4ffddecffd8e0ed d6e2fabbc8d88695c08199f3759af55c8abc91b3d6cadaffd9def4d6dcf6d9dfffd7dfff d2dafedadffddcdef5cdcee08d94cb7f92d6789cea7aa0f1799ae77f9be47f9de66f93e1 7c95ef7e9cf67396ea769cdb9fc3e7c9e4f9dbe7fddde1fcdde7f0d9e3edd9e5f1d9e8ef d6e5ecd1ddf5b4b9f18889db7092e97ca1f16d8fceb9cff6e5ecfce2e7ebd0dde6d3eafc dbe6fadce6f2d1d7e7b2b5e08188d68297f06e99de9ad2ffd4dffddee9ffd9e4f6d4e1e7 dceaead5deefb0b4e49292dc7c9afc738ce88c9febc5d6ffd3e2f9cdddeadcecffd1e1ff d4e7f5d7e3efdde0f3cac5ed8f8acd9298ee7e94ea7899ea799cd4b4cffcd2e3ffd4dce9 e2e5eae5eaf0dbe3f0d9e4f8d4e2fddce5ead5daee8f96dc7e93ec779adc789bd57e95e3 7795d57994db88a1f36f90df74a0e18cb2e1cadffcdce1f5d6dbf1dce5ee9ba9cc859df5 6a90f180abdeb1d1e0dae7f8d5eaebd3d9e9c7c0ea8a8fd3819df16791e37496d693a7d9 d3e6eacddcf9d8e8ffd0e3dfd3e3e0e1e7ffd9dbffe2e6f1bfafde8993d1789de481aae2 d4eeffd6ddefd6d6fc898dcc71a0d87893ea7580e98598e5b3d8f5d2f7ffc8d2edb4a2de 88a9ded4e7ffc5f1fedfd8ead8ebfac4b4e57995d67a99ec6a8ce394a9ecc4cbf5d9dff7 d7e4f7d2e3f7d4e3f6dde6f5e3e7f2d5dfebbbcfe87e99c87893da758ede889fe57f94cd 7295d77f9be5758bde7995e87ba0e693b4e7d2e6ffdae0facccdf98d9cd37895d9789ae2 7d9ade7f96d9748fd27a9be27795dd7595e07493e384a1ef7b97d8b5cbfad2e6ffd6e8f6 e5dfe9e8eaf7dee7f6dce5f4d7dcf0a9b0da7e8fd57b99f37295e7a6d5ffd5e0f4c6edea e7ddf6cde7fee5e7ffcee7ece2f0f9d1dde9d7e2f8bdc6f1828dcb8a9fe27e9fd5c3efff cee4f1d8e3f7e2e2fcdde2f5d9ebf5def3ffc4d2f79597d28191e889c3e9d7e9fdd2e3f3 d7bbf573a0db7896df7d97e1749ed890b8fddddff4d1e8f8d9cddb7893ec7d95dd86c1ed d0e6f3cad7e8d7ddf3dce6ffd4e6fcdfefffe5e9ffd2c9e87a98fa728be78b9eeac5d6ff d4e3facedeebddedffd2e2ffd2e0ebddeef5ccd9e2c5c4e49b91ce8789d67894dd90c6ff d0e6f3cad7e8d7ddf3dce6ffd4e6fcdfefffe5e9ffd2c9e87a96e07a96e07a96e07a96e0 7a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e0 7a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07995df7995df7995df7995df 7995df7995df7995df7995df7995df7995df7995df7995df7995df7995df7995df7995df 7995df7995df7995df7995df7995df7995df7995df7995df7995df7995df7995df7995df 7995df7995df7995df7995df7995df7995df7995df7995df7995df7995df7995df7995df 7995df7995df7995df7995df7995df7995df7995df7995df7995df7995df7995df7995df 7995df7995df7995df7995df7995df7995df7995df7995df7995df7995df7995df7995df 7995df7995df7995df7995df7995df7995df7995df7995df7995df7995df7995df7995df 7995df7995df7995df7995df7995df7995df7995df7995df7995df7995df7995df7995df 7995df7995df7995df7995df7995df7995df7995df7995df7c94d07995e87495e47795d1 8395ebb2cee6637cf0668ef0698ce6698ce6688be96789ea6587eb6384ed6182ed6080ed 5d7dea5d7dea5c7ce9597be9567aea5579e95378ea5378ea5075e74d75e64a75e54876e5 4a78e74c77e74d75e64e73e54467cdc6bbe66c97db7c9cd5bdc3f55782e0698deb698ee9 668ae0fbfff8fffaff6e85e35586ed6084e2637aea5d81f15b7deb5b7deb587cea567aea 5479eb5179ea5078ea5078ea4b7ae64f73eefdfff2fff8fb4c72ed4a7df3556bd84469d3 c2baeb7297de6d9ce2c8c4e9ad7a8bb37e9aaf83a4b2829abb7e9fae7794a67c92caaebd fff1fbfffefff8faf7fbfffdfffafde0d5d9fff5f9fffeffeff3f2fffefffff7ffc79dab a0697cb56484bb6788aa6f81a66a76b26682915e87bdbce67482db747ed7757ad57475d1 6a6bc85f5fc15566c2767fdc7a7dda7a86dc7590dd6e93d97b9cdf7d95db91a4dc6c8ecd bea29fb45041e77e9fce725bcc9d6785a6d38798e88aa6ef7096d77a9edc7790d2879ee2 7795db7aa2e88299dc6f9ee47b92e27bb3e2dbdeffcdeaf0e5e3fbc0d0f2def7ffd6ebff d6e5ffd6dfffb9c5f78c9ede738dda7292e77198e397bbefcfe9ffd8e8f8e5edffd2dbfa d0deffc1d4f5d4deffacb9ed788bd07991d7a4bef7cbe3ffd2e4ffd7e5ffc6dfffd2efff ddf7ffe0eeffcbcdf69a9cd77486ce7394e57eb3f7d3f2ffe2e6e9e5deffcfd7ffc5e0fb c4dff4dce9ffd5ecfcddebf8e2e8f6dfe5fdc9d9fbc2d8fdd5eaffe0efffdae1fbd0d9ea 99a6d28094ed779bf37ba6d3afceead4e1ffd6e7f1d2e4f2d6ebfed9efffd8edffddf0fe d8eaeec6d6d6abace58796db708fdf7295e67591da7990d47e97da7997df738ace7993e0 7292df7b9edea7c8f1cee8ffdae7fad7dcf2d5e2ffcfddffd0e0ffd3e4ffd8ebfcdfeeff cbd3f7a4a8d87892dc7e9ee7799cdea4c2f6d8e8ffd1d7f9d5e1ffd9ebffc7e1ffd8eeff e0efffcacff99397de8896e183a0d8bde6ffcee1e8d7e7fed4e4ffd6e5ffdceeffc8dbff 9aabdf7789c96f95c684a5d2b1c9ebe5f8ffe2f4f8d1e2e9dbecffd0e0ffc7deffd4e4ff e8f1ffdadeffa6ade48899df6b89d17098dda7c6e2d2ecffe0f0ffd7dff6d8dffbd4ddfe cddcffd6e9ffd4e2fddce5ead5daee8f96dc7e93ec779adc789bd57e95e37896d67b95df 839cec7293e2749ddd94bae7cbe0fde0e2f7dbe1fbe0e9f2adbada7e93e67496f085aedc c3dfeddae5f7d5eef3dee5f7d1cbf18d91d17996e66c95e48db0eab7caf2d0dfe4dbe8ff d5e2ffd7eaf9d7eaf9d7e4ffdee7ffd3e0e9d9cef0a9b2eb7294dc7da3e1b4cef1dae5fb dadfffa7addf7a99da7591e47a93ed85a1e2c6e1fcd7edfac7cff39f9ada87a7e2c3d8ff c2edffe7dff6d8ebfcc1b0e47694d27493e576a5cfafd1ece1f3fde6f5fad4eaf5cfe8fc d1e7fed0e0f7d1d9f0dae5fbd1e0fda4b4e5899ae27d8fe58297e87c94dc7598da809ce6 798fe27b98e87aa0e1a6c8f6d3e8ffdde4f7b7b7e98391ce7591da7597e17996dc8097da 7792d57b9ce37b99e17c99e57b9aea6888d57794d8b1caffdaf1ffcadef6cadcffcae2ff c7e2ffd6ecffe4eeffc1c6ec8c98d4788ddc6d8cdea1ccf9d5ddf2cef1f3eadfffc6e0ff d9deffc6e2f8ccddf9d2e2f9deeaffd4deffa0ade28397d683a2dbacd2ffcce6f5dde9ff e6eaffd8def6c7d9efc9e1fdbdcdfe9ca4e58090e788c2e8d6e8fcd1e2f2d6baf4729fda 7896df7c96e0749ed890b8fddddff4d1e8f8d9cddb7893ec7d95dd86c1eddaeef7dbe7f7 e6ecffdee9ffc4d8f9c0d7f9c4cdf6b4b1de6d93c483a4d1b0c8eae5f8ffe3f5f9d2e3ea dcedffd1e1ffc9daffdaefffdef0ffd9e2ffb3b3e98792d46e94d27fbdf0daeef7dbe7f7 e6ecffdee9ffc4d8f9c0d7f9c4cdf6b4b1de7a96e07a96e07a96e07a96e07a96e07a96e0 7a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e0 7a96e07a96e07a96e07a96e07a96e07a96e07995df7995df7995df7995df7995df7995df 7995df7995df7995df7995df7995df7995df7995df7995df7995df7995df7995df7995df 7995df7995df7995df7995df7995df7995df7995df7995df7995df7995df7995df7995df 7995df7995df7995df7995df7995df7995df7995df7995df7995df7995df7995df7995df 7995df7995df7995df7995df7995df7995df7995df7995df7995df7995df7995df7995df 7995df7995df7995df7995df7995df7995df7995df7995df7995df7995df7995df7995df 7995df7995df7995df7995df7995df7995df7995df7995df7995df7995df7995df7995df 7995df7995df7995df7995df7995df7995df7995df7995df7995df7995df7995df7995df 7995df7995df7995df7995df7995df7995df7c94d07995e87495e47795d18395ebb2cee6 627bef668ef0698ce6688be7688be96789ea6587eb6384eb6182ed6081ec5d7ee95d7dea 5b7de95a7cea577be9557bea5479eb5378ea5176e84e76e74a75e54977e64a78e74c77e7 4d75e64d72e44467cdc7bbe96c97db7c9cd5bdc3f55681df698deb698ee9668ae0fbfff8 fffaff6e85e35586ed6084e2647beb5d81f15b7de95b7deb587cea577beb557aec527aeb 5179eb4f78ea4b7ae64f73eefdfff2fff9fc4c72ed4a7df3546cd84469d3c2baeb7297de 6d9ce2c8c4e9ad7a8bb37e9aae82a3b2829aaf7897bf8aa6b4849ca98295ceb2c0fff5f9 fffffdfafffbfffffffffdfffcf3f6fdfbfcfffffffdf2f6c7a3af9b6477a16b7bb2627f b46081a4697ba46874b36783926086bebde77482db757fd8767bd67576d26b6cc95f5fc1 586bc7727bd8797cd97d87de788fdd7896de7a92d85c6ab36166c48ea0f4b3a9a0e0a973 aa6b5a7d431ddec4a1768dd18d8fdc6573ba758ece1d37744456967788cd7b96d9749bdc 839add6f9ee47e95e580b8e7dbdeffc9e6eceeebffdcebffd0e4e3ccdbded8e2ebe2e8fe c8cdf5959fda7f8fda8a9ef4789ce698b8ebd0e5ffdce9fcdde4ffb3bfe99fb1e38aa4d5 8390d48697dd7089cc88a6e294b2e6aac3fc8a9ae78389e96e97d789b4e9aed5fccfe6ff d0d8ffa9ace18292d07d9ade75a8e9cce8fdd9dce1cbc6ee9aa6e085a6d189aad5a5b8fa c9e3f4d6e3f4d6dbf1bac0e490a5d484a2d699b8e6b6d0f5dadffce2e9fbafb8e37d8de4 7b9aeda0c6ebcfeafbdce4ffbccdffa0b3eb879dd77a92ce839cd4a9c1f1d0e6ffdcf0ff dddaff9fa8e97a92dc829ee78a9fde8596cc8195ca8099d191a0c98b9ed87893da7d9cdf a8c8f9d1e9ffd7e4f5d0d3e48297d08095d88b9fe69cb2ecb8cff1ddf0ffe4f0fcccd4e1 7e8ac67d96d880a7ec88aff0adc7ff8b9ad58792d47783cf93b9eab6d7f8d9efffd6e0ff a6a8e38d95d495a8d2d8f5ffdbf0e7c3d6e797a9db7b8ed37c93d97f9bda7c9cd97ea0df 7599d3a1c1f4cde2ffdeecffbbc4ed949ed3919be2808cde8da4e8a4baebd4e5ffd8e6ff c8d7fe8ea8db7195cf8fbcf5d3ece9e4f8ffd2e0fab0bbe89fabe58a9edd809cdd8fb2f2 d4e2fddce5ead5daee8f96dc7e93ec779adc789bd57e95e37897d87e98e27b94e47698e2 729bd9a3c8f4cfe3fee3e4f8d5deffe2ecf6c6d2ec7e8fd77e99ea96b8ded9effddae0f8 c7e2f5e4ecffdad6f7969bd27591da759de3a9cbfbd4eaffdfecf2d1dcff95a3e28499c6 829ac88fa4e5c7ddffd3eef7ebe7f6c8d4fe748fd67d9de691abded7e6ffdae4ffc3ceec 868fdc7592de729fe29ac1ecd0e0f7e1e1f9b4bbe98194d97091d89baee9add9f4e5dffb d0e5fabeb0e37a98d67796e695c3f4c4e4ffdaeaffb5c3e88ca0d5859ce2899ceb8591e3 b5c8e9d9e9ffe5efffced3fd9a9fe1828ee4758ae57492e87699dd7e99e67b91e47c99e7 749ad8bcdfffd0e6fbdde6efa3a2dc7d8ace7893e27596e57793dc8198dc7893d6799ae1 7996da7694dd82a1f16a89d97d9de68eabe7a6c1f08da5cb789cd67aa3d988b1dfb6d4f6 e5f3ffdde2ffaeb5e98e9de07b96e7a9cffcd7dcf2c8e9f2cdc0ec89a5d78c94d27999c8 9cb5edb9cff8d8eaffddebffc0ccf67d8dc8839add8ba8eab7d6eacfe1f9d7defbb5bedf 8da1c687a2d18a9fde7a88d37f8fe688c2e8d6e8fcd1e2f2d6baf4729fda7795de7c96e0 749ed890b8fddddff4d1e8f8d9cddb7893ec7e96de87c2eed0e1e9d5e1f1d6ddfab9c7ee 8ea9d882a0d48a9dd8858dce7498d2a0c0f3cce1ffdfedffbcc5ee959fd4929ce3808cde 8ea0e8a5bcf0cae3ffdaeaffcbd4fd91a2d87aa5da88c8f6d0e1e9d5e1f1d6ddfab9c7ee 8ea9d882a0d48a9dd8858dce7a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e0 7a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e0 7a96e07a96e07a96e07a96e07995df7995df7995df7995df7995df7995df7995df7995df 7995df7995df7995df7995df7995df7995df7995df7995df7995df7995df7995df7995df 7995df7995df7995df7995df7995df7995df7995df7995df7995df7995df7995df7995df 7995df7995df7995df7995df7995df7995df7995df7995df7995df7995df7995df7995df 7995df7995df7995df7995df7995df7995df7995df7995df7995df7995df7995df7995df 7995df7995df7995df7995df7995df7995df7995df7995df7995df7995df7995df7995df 7995df7995df7995df7995df7995df7995df7995df7995df7995df7995df7995df7995df 7995df7995df7995df7995df7995df7995df7995df7995df7995df7995df7995df7995df 7995df7995df7995df7995df7c94d07a96e97596e57896d28395ebb2cee6617aee648cee 688be7688be7688be96789ea6587eb6384eb6182eb6081ea5e7fea5d7fea5c7eea597ee9 577dea557bea537bea527ae95277e94e78e84b76e64878e64979e74c77e74c76e64d72e4 4467cdc7bbe96d98dd7c9cd7bdc3f75681e0688cec678be96589e1fbfffafff9ff6e85e3 5586ec6186e1647cea5e82f05a7fea5a7fea597deb577dea547ceb527aeb517beb507aea 4b7be74e74effdfff3fffafc4c72ed4a7df3546cd84368d2c3bbec7398df6d9ce2c7c3e8 ac798ab27d99ad81a2b18199b185a0ae7c97ae7892aa748cad8094cbb0b9f3eaebfefffd f9fffff5f7f6fefafbfffefff0eaecc3aeb5af7c8db46a83a77181b46481b3607ea36978 a46874b26680926086bfbee67583dc757fd8767bd67576d26b6cc95f5fc15f72ce6d76d3 7477d47f86de7e91e08098e27082ca323a856d69d78e8cffcabdffdcb8fee8b8fff1c7ff 9281b89fa7ff968cd515155b4351908191cf131e60303d817089cb7ba1df7c93d76f9ee4 8198e681bae7dcdffecae7efe4e1ffc2d0fdd6ecf9d3e6f5d8e7fed8e3ffb9c4f28b9ad5 7587cf7b8edd7b9de599b4e9d1e2ffdae5fbcfd5f993a0d47991cf6c8bcc758bd6869ded 7c97e67c9bde7796cd869fd78394d98f9aec7e9ddd92b3e6afd0f3d1e5ffdadeffb3b7e6 8598d37899dc7eb0edd2efffe0e3ecc6c3f28192d8688cc86b91cf7f99eecae5f8d8e7fc d7daf9a6acdc788ccb6a8bce79a0db9fc5f6d9ddfae7ecffbbc0ea7b8add809beab6d9f7 dcf3fbdce0f99aa5e58693d7798ad07589ce7a92d29ab0e9bdd2ffc9dcffded8ff959fd4 7c92cea6c0f9cce1ffd3e1ffd2e2ffd4e8ffccd4e9b1beea8499da7895dba4c2f8cfe6ff d4dff1c9cbd87391cd7290d97593e97e9beb98b3eac8ddf8e0eef7d6dee1a2a2de8699db 6c94da6191d37ea2de8298d1909edb8f9adc88a8d7aac5e3cfe2f3d7e0fdb2b8ec8995d1 8ca4d0bfe3fbdeebf1cdd9f1a6b3e08596ce798fc9708dc97290d87f9ef081a4e6b7d5ff d6e9ffcedaffa7ade1878ed28693e1798adc7d91d093a6d0c3d4e6cdddeadaeaff90a7d1 7493c9a9cdffd9e8e3d5e1efb3bce5929ddf8497e6708fdf6c96de82b5f4d4e2fddce5ea d5daee8f96dc7e93ec779adc789bd57e95e37a98de809ae5758fdc7a9ae3759dd8b2d5fd d5e5ffe3e1f6bccbf6ddeafad7e2f6939fdb859addadc7e8e2f3ffd8d9f7aac8eadbeaff dfddf5a7abd87992d57da2e6b6d8fed8eef9d9e2ebb2b9f0838fe1758dd56f8dd57591e4 9cbbf4bfe4ede6e7e9d8e1ff8699de7e99ea819cdfc2d9ffd1e3f9d0e0ef9b92e57996d8 69a4cebae8ffd3d8eedfcff3979cd66f93df698adb7e91d5a2cdefe7e0ffcbdff7bdafe2 7d9dd87c9deab4d9ffcfe6ffd2daffabafdf8590d27d8ede8090e57f89de8da9d0bed2ed d7dff2d7d6f59d9dd38990de738be17a9ef67496dd7b96e37a90e37a97e36e95cec9edff cbe2f0dbe5e79e9cdb818dd5809aee7999ec7793dd8299dd7994d97697de7b98dc6f8dd5 7999e67a9bea7f9fe86d8acc7691c87a94c57c96cf7899ce84a6d3acc5e4d4e0f6d0d5f2 a2addb7a8cca7a94e1a6cbf7dadaf2ceebf9cbbdf27a97d97a86d86d94d97594e68faae1 cfe4ffd7e7f7d5e0fe8a97cc8294dc7b92e2b6d8f3d1e6ffd9e2ffaeb7e0788bc36d8ace 7792df7188d87f8fe688c2e8d5e7fbd0e1f1d5b9f3719ed97795de7b95df759fd991b9fe dddff4d2e9f9d9cddb7994ed7e96de87c2eed9e8efdce4f7ccd2f69dade07290ce6c8ed5 7994e18192e480a3e5b6d4ffd6e9ffcfdbffa8aee2878ed28693e17889db808ed58fa4d3 bbd4e8d0e1f1d5defd93a1d27fa2da87bef4d9e8efdce4f7ccd2f69dade07290ce6c8ed5 7994e18192e47b97e17b97e17b97e17b97e17b97e17b97e17b97e17b97e17b97e17b97e1 7b97e17b97e17b97e17b97e17b97e17b97e17b97e17b97e17b97e17b97e17b97e17b97e1 7b97e17b97e17a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e0 7a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e0 7a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e0 7a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e0 7a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e0 7a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e0 7a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e0 7a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e0 7a96e07a96e07d95d17a96e97596e57896d28395ebb2cee66079ed638bed688be9688be9 6789ea6688ea6587eb6385e96283ea6182e95e81e95e81e95b80ea5a7fea587ee9557eea 547de9527cea527aeb4f79e94b79e84979e74a7ae84b79e84c76e64b73e44467cfc7bbeb 6d98dd7d9dd8bdc3f7557fe1668aea6589e76588e2fbfffbfff9ff6e85e55687ed6287e2 657de95f84ef5b80ea5b80eb597fea567feb557eea537deb527cec507beb4c7ce84e76f0 fefff4fffbfd4b73ed497df3516cd74269d2c4bced7499e06d9ce2c7c3e8ab7889b17c98 ac80a1b08098b48ca6a1718baf7490bd7e99a87188a88490dccdd0fffffdf5fffff5fbf9 fffefffffeffdacfd3987a84985d71c5728eab7583b86883b96684aa707ea66a74af647b 8f5d82bfbee67684dd7680d9777cd77576d26b6cc95f5fc15d70cc6f78d5787bd88188e0 7a8ddc7d95df7587cf3e46913b4662494689292b5e3637554f3d71302359414779222477 030039302e6f818acb919fe08f98dd37418689a1e17198d37a91d772a1e97f96e478b1dc dbdefdd2eef9d9d5f899a6da748ecb7a94d1829ad6879cdb839bdb7f97dd7c98e17c9ae3 7599e397b5e9d3e4ffdbe3fac8cdf38c98d47a94de779be77d9cdd809deb7d98f36b87db 839fde97b0d8bbd3efd6eaffd2d6ffcfdafad0ddf0dfe6f6e0e0fab7bbe8829ad86c96de 80b2efd1eeffe4e6f2ceccfe8999e67198dd759de57f9bfcc7e4f6d6e6fdd7dbffa3a8e0 7d91da7599e57aa5e9a7d1ffdadefbe1e7f7bdc2ea818ddf88a2edbcdef9d8edf2dbddf2 dae3f4d3e0f3d9e9ffdaeeffd0e7f9d0e8f2d7eff1d5ece6eae9ff9eabd5819ccbaecbf7 d7ebffdae9fed0e1f3c9def1e9eeffc1cdf7869bdc7493d6a3c2f8d2e9ffd6def3c7c4d5 80a4d480a3e57b9ff57597ee85a4e5b6cdf6dbe7ffdae0f0aba8eb8b99e06c91d57aa9df 92b9e0c0dbf9caddfdd0e2ffc7d5fad2dff2dbe4ebd8def4b9c3f67d94d7729ad789beea d1d5fbe0e5ffe1eaffd1e0f5bccee29baed68092dc7e8bf17ea5d0bbdef2daf3f0dbeae5 d1dbe5ceddf4dcf5ffd4f5ffceddffd0e0f9e4f1f7e1ecf2ebf7ff9caad97c90cdb8cfff e1e7f3d1d6f6a5abe58693e28199f17499e96ea2de82bfeed4e2fddce5ead5daee8f96dc 7e93ec779adc789bd57e95e37c9ae3809ae5748edb7c9de27ea5dcbedeffdae6ffddd8ec 96afe8cce1f6dce9fab1bbec8c9dd3c5daf5ddeafdcccaf295b7e7d4e5ffdbdceeb5b9de 7e93d482a5e9bedcffd5eaedd5dce69197d38b98f484a0f37ca0f4789bf77399d8b3ddeb d9e2dfdbe2fe9faaec7c90e6809be8a1bff1c5dff6d8ebf2b8acf6819ad082bad5cbf5ff dfe0fcbfafde8992d56c97e57c9cef8194d9a9d5faece6ffcae0f7bdb1e37a9dd77b9feb c9e6eadaeae9e7e9e8e4e5eadce5f6d8eaffd8eaffd6e6f5b6d6fdd8f0ffe3f0ffe0e5f9 a8abd68f9ada738dd8769be97395dc7b96e37b91e47b98e46d94cdc8ecffcae1efdbe5e7 a3a2de8491d7809bec7999ec7792df839ae07994db7696e17e9be17997df6d8dd67a9ae3 7694da83a0dc98b2e5c1d7ffdfe1ffd4ddffd2e2ffddecffe7eeffdbe1fbb2c0ef869ede 7792e1a4c9f5dadaf2d1edfbcebff87e9ae3808fea79a3f56e92f07493d3d1e9ffcfdfec e0eaffa3afe38292df7f95ebb4d8f8d0e8ffdbe6ffb4bde88093d77995e883a3f6809deb 8090e788c2e8d6e8fcd1e2f2d6baf4729fda7795de7c96e0759fd991b9fedee0f5d2e9f9 dacedc7994ed7e96de87c2eeddeaf2dfe5fbc4c9f390a0db6f90d76f96e57b9bf0839bf3 7ea5d0bbdef2daf3f0dcebe6d2dce6ceddf4dbf4ffd3f4ffd5dfffcfe0fce3f7ffe5f3fc e6e9ffa0a7de879ee189b2f4ddeaf2dfe5fbc4c9f390a0db6f90d76f96e57b9bf0839bf3 7b97e17b97e17b97e17b97e17b97e17b97e17b97e17b97e17b97e17b97e17b97e17b97e1 7b97e17b97e17b97e17b97e17b97e17b97e17b97e17b97e17b97e17b97e17b97e17b97e1 7a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e0 7a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e0 7a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e0 7a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e0 7a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e0 7a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e0 7a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e0 7a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e07a96e0 7d95d17b97ea7697e67997d38496ecb1cde55f78ec6189eb6789ea6789ea6789ea6688ea 6587e96486ea6284e86183e75e83eb5d82ea5c81e95a81ea5780ea567fe9547eea547eea 537ded507beb4b7be9487be8487be84a7ae84b76e64a74e44466d1c7bbeb6e98e07d9dda bdc2f9547ee06488e96387e76588e4fbfffbfffaff6f86e65687ed6287e0667ee86085ef 5c83ec5b82eb5881ea5780ea557feb537fea527eeb527eeb4b7ee94f77f1fcfff4fffcfd 4b75ee477ef3516cd74069d2c6beef7499e06d9ce2c6c2e7aa7788af7a96ab7fa0af7f97 a8809ab1819bbb839eb27891af7b91d7b6c1fbeff1f7f7f5edf8f4fefffffaf6f7f5eff1 fffcffd1b6bf9a6376b96b85a6707eb66681bb6884ae7482a66a72ab60778c5a7fc1c1e7 7785de7781da777cd77677d36b6cc95f5fc15366c2767fdc8386e3818be2738ad87391d9 849ce27583cc122256aea0efc7cbfae0f6f3fffdffc4c5fd8c9bf8a89cff7369a8393a7a 7f8dcc8695d8353f874a569e738cce7aa0de8096df75a4ec7b92e06fa8d3d9ddfad8f4ff d8d3fb8b98cf7796f17b99f37997ef7291e47493e37b9be67b9de57496dd739de59cbcef d7ebffdbe1f9c2c6ec8792d07c96e37da2f37198d36c8ed87a95ec849dedbed7ffc6def6 d8eff5dcf2f0eee8ffe1e3fad7dee8e0e3eae1dff4b6bde7849ddf6d98e67aacebc7e3f8 dddfebccc8fb8696e37499dd799ee57890f0bfe0efd0e2f8d4d8fe9b9dda7d8ddb7899ea 6e99dd9cc9ffdce3fddce3f3bdc6ed8594e58ba7f1bddffad2e5ecddddf5e5e9ffd9e0fd d6e3ffd4e4ffc6dafdc5daf7cee3f8d1e4f3cfd5f995a7d57f9ed4a4c6f6c9e2ffd8e9ff d7ebffd3ebffccd0f6adbaef7d96d97497d9a8cafad6edffd9ddf8cbc1dc7293c07296d4 7095e5678dde789bdbb2caf6ddeaffe1e5ff989ae48495db8babe6b7ddffc3e2f6e8feff d5e8f9d3e9ffecf2ffedf3ffe3e8ebd4daeabbc7f97892dc6d99e26da7e6a2a9edc1caff d4e1ffd6e7efd3e5e5becde29ea6e58e8ef07da3e4bedfffd9edf4d8e3e9d4daf2cdd9ff d0e9ffc4eaf7d3e5ffcfe1f9cedeedc8d4ead0dcff9fabe7889adac7dcffe4e8ffd2d7ff a1a9e87e8edc7a94e86f95de6497d073acd9d4e2fddce5ead5daee8f96dc7e93ec779adc 789bd57e95e37c9ce77d98e57791dc7c9bde8cb1e5c5e3ffdce6ffd4cbe07a9ce4b0cdeb d8e9f9c9d5fd9eacd9d2e6fecfdbf3b6b4e68ab2edcfe4ffd9dde8c3c7e48093d584a2eb c3dfffd7ebece2e6f2848ac68192ea6f90df698fe06e93ee658acebee7fbd9e4e8dde2ff afb3f27887da7d9cee81a8e3b8d7f6ddf0fed3d0ff94a8cdb6daf0cbe7fce1e7ff9392cb 8a9be17399e47c9ff07f94d7a9d7f8e7e2ffc7e0f6c0b6e8789bd57fa3efd3e9f6d9e1ec ddd9e7dad7ecd5dcf9d1e1ffd0e4fcd3e5f3c5e3ffcfe9ffcce2fac4d3f0a0aedd869ad9 748fd47598dc7598dc809be87e94e77e9be97298d6b8dbffcee4f9dee7f0b2b2e68694d3 7a96e07596e57894de839ae07a94de7999e6708ed784a4ed7394db7b9adb83a0dabad2ff cfe1ffebf9ffeae5ffdcdffed9e3fedce4f7daddeed1d5f0aebced7e97da7a9beaa8d2fc dbddf4cce8f3c6b5eb7491d77585dd6997e5749df96f93d1d1ebffcedce9dde7ffabb7eb 7d8fd98098eeaed1f7c9e1fbd5dff8afb6e27f8fda7792eb7b9eef7298d98191e889c3e9 d7e9fdd2e3f3d7bbf573a0db7896df7d97e1759fd991b9fedee0f5d3eafadacedc7994ed 7f97df88c3efd2dfe8d8def6b9bdec8796d77292db7299e87494e77790e47da3e4bfe0ff daeef5d9e4ead4daf2cdd9ffcfe8ffc3e9f6dae6ffcde1f9cae1efcbdbf4ccd0ffa1a6e8 8ca0e791b7f8d2dfe8d8def6b9bdec8796d77292db7299e87494e77790e47c98e27c98e2 7c98e27c98e27c98e27c98e27c98e27c98e27c98e27c98e27c98e27c98e27c98e27c98e2 7c98e27c98e27c98e27c98e27c98e27c98e27c98e27c98e27c98e27c98e27b97e17b97e1 7b97e17b97e17b97e17b97e17b97e17b97e17b97e17b97e17b97e17b97e17b97e17b97e1 7b97e17b97e17b97e17b97e17b97e17b97e17b97e17b97e17b97e17b97e17b97e17b97e1 7b97e17b97e17b97e17b97e17b97e17b97e17b97e17b97e17b97e17b97e17b97e17b97e1 7b97e17b97e17b97e17b97e17b97e17b97e17b97e17b97e17b97e17b97e17b97e17b97e1 7b97e17b97e17b97e17b97e17b97e17b97e17b97e17b97e17b97e17b97e17b97e17b97e1 7b97e17b97e17b97e17b97e17b97e17b97e17b97e17b97e17b97e17b97e17b97e17b97e1 7b97e17b97e17b97e17b97e17b97e17b97e17b97e17b97e17b97e17b97e17b97e17b97e1 7b97e17b97e17b97e17b97e17b97e17b97e17b97e17b97e17b97e17b97e17e96d27c98eb 7798e77a98d48496ecb1cde55e77eb5f87e96688ea6789eb6789eb6688ea6587e96486e8 6385e76284e65f85ea5d84e95d84eb5983e95881ea5681ea5480e95480e9557fef507eed 4d7deb487ce9487ce94a7ae84876e54973e34466d1c8bcee6e98e27d9cdcbdc2f9537de1 6386ea6185e66588e6fbfffdfffaff6f86e65788ee6388e06780e76186ee5d84eb5a84ea 5a83ec5782ea5581ea5480eb5180ea5180ec4b80ea4f79f2fbfff4fffdfe4b75ee477ef3 506cd74069d2c7bff0759ae16d9ce2c5c1e6a87586ae7995aa7e9faf7f97ad7c99b0809a ae7e96ad8397ceaebdfff4fafffcfdf5f5f3faf6f7fffcfffffbfffdf7f9fffefffff7fc dcb3c1b4768ba46e7bb1617ab6637dab717da66a72ab60758d5b7ec3c3e77886df7882db 787dd87677d36c6dca5f5fc15263bf7982df8285e27f8be17691de6e93d981a2e58aa2e8 2e52482f1d4d3f4078354c5e32293a4148741736653e39593636722d3774879cdb1d3176 5a68b39dadf888a3e87096d58399e474a3eb7c93df75afd7dbdffcd3effbd5cffb909bd9 7e9df07b9aec7998ea7897e77999e67a9ae57c9ae37b99e16f9fe79bc1f2d8edffd7def1 bfc1e78791ce7791dc7195e985acf17b9de5809fe0a5bff0d7efffdaefffcedef7cad7f9 cedcffccdfffd0e3f4e0edf6e4e6fbbabfe9859adb6e93e185b6f8cde9ffe4e6f2d3ccff 8995df7b9ada81a0e17a8ee7c4eaf7d8edffdee2ff9f9fdd848fde7f9cea6d94d59fc9fb dae6fcd8e4f0becbee8293e387a4f0bee1ffd1e5f0e0e1fd9297d9838cd18492dd8a9dec 869bec849be7869de38196d9a1ace27f97d76e93da779ce37e9ad98498cd869acf7e97cf 9ca1e38fa0e87593dc769edba6cdf6d3eaffdadbfad3c3e8859dd984a0e97c9ff0729ae0 82aadbb8d7f4dbecffd5dbf196a2ea8398d7aac6f5cde7ffd0e1ebdae3f2cedbfbd3e8ff bccffad4e4fbdae7edd1daebbfc9fa7e90da7a9ae7739ee26d8ace8ba7e8a2bbf1b9d0f2 daefffe2f1ffbec5ef989ad77fa1fbc5dfffd7e6ffc8ccf1b2aff29296ed8396e37797d2 829cd7859fd2829aca859cd28ba0e38199df7a97d3bbdbffd6dcf4cfd7fba6b3e78396da 829ce77fa1eb7da5ea8ebaf7d4e2fddce5ead5daee8f96dc7e93ec779adc789bd57e95e3 7d9dea7a95e47d97e27a99d999bfeec7e4ffdfe7fec8bcd06d9aed94b7ddd4e9fad0ddff b9c8efd6ebffc5d0ec9b9ad47da8ecc9e2ffdce1e7d5d9f28697dc829deec5ddffd8ebef dde1ed949ad48b9eeb7da0e075a0e4789ef3799addbde1fbd8e5f6dde0ffaeade77c87d6 7b9ced709cdda2c5edd3e7ffd7e6ffb8c6e0d9e4fad5e0feb9c7f67f91cf869ee47b96dd 7397e17a92cea7d6f2dfdcf9c7e0f4c5bbed7397d37ea4efcbe5ffd4e0ffc8c9f7a7a7e5 8792e17e94e7819be6849bde839ae07d96cf809ccc7d9bcf829de07892df7f99e4849fe4 7497d9839fe97e94e77e9beb779ddea0c2f0d0e5ffdee5f8cccef790a0d47895d97496de 7a96df8399e27993de7b9aec6d8cdc81a1ec7c9bde83a2dbb0c8f6d8ebffd7e1fad0d7ea d3e2ffc3d9ffc8e0ffd6e8ffdfe6f9e0e4ffbfc7f88294d67096e7a3d2fcdbe0f4ceebf1 cfbeeb86a2e18899e97aa6ed729cee7ea3dacbe3ffd5e2f3d8defe9eabe07c93d97999e6 b7daffd2e8ffdde4f7b7bae38692de7a93ed7b9fe96f97ca8292e98ac4ead8eafed3e4f4 d8bcf674a1dc7a98e17e98e276a0da92baffdee0f5d3eafadacedc7a95ee7f97df88c3ef d7e5f2e0e7ffbec2f28c9adb7d9be47da3ec7a9ae37f95de80a2fcc6e0ffd8e7ffc9cdf2 b2aff29195ec8295e27595d08399d2809fcd7899c4869fd58997de8292df7799d887b9ea d7e5f2e0e7ffbec2f28c9adb7d9be47da3ec7a9ae37f95de7c98e27c98e27c98e27c98e2 7c98e27c98e27c98e27c98e27c98e27c98e27c98e27c98e27c98e27c98e27c98e27c98e2 7c98e27c98e27c98e27c98e27c98e27c98e27c98e27c98e27b97e17b97e17b97e17b97e1 7b97e17b97e17b97e17b97e17b97e17b97e17b97e17b97e17b97e17b97e17b97e17b97e1 7b97e17b97e17b97e17b97e17b97e17b97e17b97e17b97e17b97e17b97e17b97e17b97e1 7b97e17b97e17b97e17b97e17b97e17b97e17b97e17b97e17b97e17b97e17b97e17b97e1 7b97e17b97e17b97e17b97e17b97e17b97e17b97e17b97e17b97e17b97e17b97e17b97e1 7b97e17b97e17b97e17b97e17b97e17b97e17b97e17b97e17b97e17b97e17b97e17b97e1 7b97e17b97e17b97e17b97e17b97e17b97e17b97e17b97e17b97e17b97e17b97e17b97e1 7b97e17b97e17b97e17b97e17b97e17b97e17b97e17b97e17b97e17b97e17b97e17b97e1 7b97e17b97e17b97e17b97e17b97e17b97e17b97e17b97e17e96d27c98eb7899e87b99d5 8496ecb1cde55d76ea5e86e86688ec6688ec6688ea6688ea6587e96486e86385e76284e6 5f87e95e85ea5b85e95a84ea5883eb5683ea5581ea5581ea5580f0517fee4c7fec497dea 487ce9487be84876e54873e34567d3c8bbf06f99e37e9dddbdc2fa537de16285e95f83e4 6587e8fbfffffffaff6f86e65788ee6489e16881e86187ec5c86ec5b85eb5984ea5883eb 5682eb5382ea5281eb5281eb4b80ea4f79f2fbfff4fffdfe4975ee467ff34e6dd73f6ad2 c8c0f1769be26d9ce2c4c0e5a87586ad7894a97d9eae7e96ba7f9fab7994ab859acfb9c6 faf0f8fffefffffffdfffffdfff9ffe9d4dbfff3f9fffdffebefeef8f8f8fff0f6c8a4b0 b5808ab8697fb25f79a76d79a76c72af64798e5d7dc1c1e57886df7882db797ed97778d4 6c6dca6060c25867c47a80de767bd77988dd7f9fea7199de7298d97897da7d95f54221a3 a39affadc1e2fff9ffc1c4ff869fff745ec2282e688f9fda5b74b4253d858495e3798bd7 7f9ce27da4e58197e271a0e88097e381bbe3e1e5ffcae6f2cec8f696a1e17f9cd67794d0 7896d6829fe3829fe57892dc7b91dc859be66397e093bdefd3ebffd7def1c4c7ea939cd7 8198e47396e86f93e97698e083a3d2c4e1f3d7f0f4cedff19fa6dd999bf07298d983abdc a2c7e2cbe2f4dce4fbbbc0ea8d9ddb7b98e47fb2f4c9e5fbe1e3efcfc9f9858fd67a97d1 84a1db7f90e2b9e1ebd1e8fadce0ff9c9bd7848ddc839dea7195d3a8cefbd6e5f8d6e7ef bfcdf07b8ddf7f9fecbfe1ffd1e7f5e1e1ffa9bbed8ba0d77a93d37997dd7597df789ae1 7b9ddd7496d3808ed57892e679a0fb79a0fb7493e67c92de8399e57e97e78189dc8294ea 7394e376a3dea0cbeecbe3ffd8d7f9d8c5f28394e47f98ec7a9aed759ede8cb6dcc4e5f4 e0f4fbd2dce58c9fe1829bd4d1eaffe4f5ffd9dde9aaaac48e95cb8698e27da0d8b1d0ef d5ebf6d7e4f7c9cfff848cd48595e07c95d770a2dd75a2e66c92dd7a97dbb5cdfde2f3ff cfdbf5a9b0cd789fd8c5e5fcdcf0efced4e0b3b3e78d92e37f95de7c9fd57194e8799ced 7495e27899ea6f8fe4779be7739cd0aedcfddde7f3dce8feb2c4ea869bd47b96db7794e2 7596e786a6f9d4e2fddce5ead5daee8f96dc7e93ec779adc789bd57e95e37d9cec7792e1 819be57897d7a2c7f4c6e3ffe0e6fec1b4c86e9ffb7fa9d3d2ecfbcddcfdcedeffd4e9fc bfcdea8888c86e9ae1c4ddfce0e5e9e8eaff8f9de48199f1c1d8ffd6e7efe0e3f2aab1e7 859ce2739bcf6d9ad3769beb92b1f4c5e4ffd1e1fbdadcffa9a4de848dd8789bec6a99dd 8eb2e2c5d8f8ceeaf8dbe4f5ded8f2e7e7ff8599ce82a4e47996da8192d7789fe2869fd7 b1e1f8e1dff7cbe5f6c8bef06c90cc789debb8e1e3d7f4fcd9e7ffacb8e87e96dc7396e7 759ae86f94da8d9df47a91dd7a9be06f95de7fa3f9708fe97e97eb8096e17194d6829ee8 7c92e57c98eb789de38cade0cfe3ffdbe1fbe5e8ff9daedc7b99d77799e07e9be18399e2 7791de7a99ec7fa0f17496e07493d485a0d5d1e7ffd8e6ffcbd1dfbbbbc3779fdc6c99d2 81abdba9c7e9cedaf2e5e6ffc6c8f8838bca6d97e9a4d5ffdae1f3cae8eacab9e3849fd6 8293db6c99da6d99e290b4e8c6defae2edffd9dfff93a0d7829de2789de4b0d1fccde1fa dae0f0b6b8df8790db7b94ee7fa4ea749fc98393ea8bc5ebd9ebffd4e5f5d9bdf775a2dd 7a98e17f99e376a0da92baffdfe1f6d3eafadbcfdd7a95ee7f97df88c3efd6e3f3e0e7ff b8bbee818fd07592d87a9ce37b98da8598da789fd8c6e6fddef2f1cfd5e1b3b3e78c91e2 7e94dd7a9dd37392e27aa0e96c97dc7da0f17690e77d9aea72a1d786c7e5d6e3f3e0e7ff b8bbee818fd07592d87a9ce37b98da8598da7c98e27c98e27c98e27c98e27c98e27c98e2 7c98e27c98e27c98e27c98e27c98e27c98e27c98e27c98e27c98e27c98e27c98e27c98e2 7c98e27c98e27c98e27c98e27c98e27c98e27b97e17b97e17b97e17b97e17b97e17b97e1 7b97e17b97e17b97e17b97e17b97e17b97e17b97e17b97e17b97e17b97e17b97e17b97e1 7b97e17b97e17b97e17b97e17b97e17b97e17b97e17b97e17b97e17b97e17b97e17b97e1 7b97e17b97e17b97e17b97e17b97e17b97e17b97e17b97e17b97e17b97e17b97e17b97e1 7b97e17b97e17b97e17b97e17b97e17b97e17b97e17b97e17b97e17b97e17b97e17b97e1 7b97e17b97e17b97e17b97e17b97e17b97e17b97e17b97e17b97e17b97e17b97e17b97e1 7b97e17b97e17b97e17b97e17b97e17b97e17b97e17b97e17b97e17b97e17b97e17b97e1 7b97e17b97e17b97e17b97e17b97e17b97e17b97e17b97e17b97e17b97e17b97e17b97e1 7b97e17b97e17b97e17b97e17b97e17b97e17e96d27c98eb7899e87b99d58597edb0cce4 5d76ea5d85e76688ec6688ec6688ec6688ea6587e96486e86385e66284e55f87e95f87e9 5c86ea5b85eb5984ea5683ea5582e95382ea5681f15280ef4c7fec4a7eeb497dea487be8 4876e54873e34567d3c8bbf06f99e57e9ddebdc2fa537de36184e85e81e56587e8fbffff fffaff6f86e65788ee6489e16881e66288ed5c86ea5c86ec5a85eb5885ec5784eb5382ea 5281eb5182eb4c81eb4e7af3fbfff4fffdfe4975ee467ff34e6dd73f6ad2c9c1f2769be2 6d9ce2c4c0e5a77485ad7894a97d9eae7e96ba779abf8aa6ccafc1f4edf5fbfffff9ffff edf2eefffffdccaeb8a3838ebca5adfbf5f7f9fffff8fffffffefffff8ffcc97a1c3748a b36178a66d76aa6f75b3687c8f5e7ebdbde17987e07983dc797ed97778d46c6dca6060c2 676dcd7685e06d86d86d8fd9789ae2809ce67d90df5a66ba9099e88b95dd626dab344176 212e631e2a64333e805b65ad96a8f4798bd75f75c07b93dd86a2eb7495dc7a9ce381a3ea 7d9ee37397eb7ca1fa88a6e6dae9ffdae1f3d9dcff969ae17c9de47c9de47c9de47c9de4 7c9de47c9de47c9de47c9de47398f19bbae8cee3e8e2e9f1c3c4f0919ae77992e27ba3e8 759ae17899dc87a6dcc6e3ffd1e7fcc8d7f69da3dd9492e57296ba8eaad1bcd0f3deeeff d7e7ffafc3e88aa1e47a95ee7eb7e2d1e6ffe9dceddbcdee7f8ecf7ea4f97399ea85a0e5 c0e1f2d5e7ffdbdfff9b9dd88393e085a1f47294dca6caffd3e3e3dce7fdc0c7fb899adf 7a99daa3c5f5cee3ffd9e2f1d0dcf2b8c7e88599cb8199d97992d58ca5debad2ff8ca3c5 7c9de47c9de47c9de47c9de47c9de47c9de47c9de47c9de47997d37997dd7799e382a5e5 a3c4edcbe1f8d9e5f3d5d7e67a95d8809ad3869eca97afcbbed3e6e0f1ffdce8fec1cbe4 7394e193b0eac2d6f7dceaf7cad3e2a2aacf8b94d58b95ea8fa7c9b9cdeedae9ffd6e2ff b3c4f2829ad66e90d87aa3f37a93e78098e28399d38da2cfb4c6ead9e7ffd5deffb7bee8 7aa2e8a2c6fad1ebffe2f3fdd2dae7b2b6d99a9edd9196e8879bda8fa4dbb3c9fb8ea4dd 7390d47fa5ee70a2e18ac3f8d1deefdce4f9d8ddfabcc2e698a4d4849dd683a9ea87b6fc dee1e8e4e7faccd1f79da8e08192d8849be785a2ee7a9ce67c9bdb7894e77f9af17d9cd5 b8d7e9d7ebf2dce2ffb4aff27d96e6819ee2b4d0ffd3e5fde3e9f7d6daf598a5dc8299e7 78a0e6afcff5dff3fad9dfefacacde909adfa4c2f8c5f4ffdbeafdcad7f7a6b2e28490cc 8191cc9fb4e1c0daf5d0ecfaebe3ffbfbeea94a1d8829edf7b9de57399e280a5ec9abbff d1e4e8e0e8f3e1e2febbc1f3899be57796e880a0ed829fe37897f17ea1e5b0d0f7daecff dce0fbb7b9ea8494df7d9bf5a5d2e9c3e9fedaf4ffcedff9acbadf91a1d28499d88098de 91a6d5a9bef392abeb7591da7c9ce77c9ae27693d588a6e27d9cdd7b99df7d9ae67e9be7 7b99df84a4dda7c9f6cdf1ffdeede8d2e0ebb8c6eb9baae58495dd7f93da87a0e091afe5 d9dadec9ccf78891e0889be7c9e1ffdff1ffc9ceebaea8d67d9dc3819bd6889ee7bfd4ff d2e9fbdbf1feb1beea979eec7b9fdbb1c8f4dee5ffd5dbf3afbcdf91a5da899adf8896df 95bad5bbd5ece3ebffe5e1fac1bde2969fd67d99e278a0f597d6e5c7e1f8e9e3ffc9c6e3 8ba4c27ca1cd97aaefa9a3fd759fdb95b9ebc6deffe1efffd2d7f5aaadd89397d49299e1 9dbcd8cae0f5dfebfbdee2fdc9cfff8aa2e26a97da87c3ffdfe2e7dce3f5b7c5ec8b9fda 7c96e07e9eeb7d9fe97c9ee678a0e6a0c4f8d1ebffe3f4fed2dae7b1b5d8999ddc8e93e5 859ed78da2d7b5c6fc97a5e47b8dd97e9be76e9ad98bc3f4dfe2e7dce3f5b7c5ec8b9fda 7c96e07e9eeb7d9fe97c9ee67e9ce47e9ce47e9ce47e9ce47e9ce47e9ce47e9ce47e9ce4 7e9ce47e9ce47e9ce47e9ce47e9ce47e9ce47e9ce47e9ce47e9ce47e9ce47e9ce47e9ce4 7e9ce47e9ce47e9ce47e9ce47e9ce47e9ce47e9ce47e9ce47e9ce47e9ce47e9ce47e9ce4 7e9ce47e9ce47e9ce47e9ce47e9ce47e9ce47e9ce47e9ce47e9ce47e9ce47e9ce47e9ce4 7e9ce47e9ce47e9ce47e9ce47e9ce47e9ce47e9ce47e9ce47e9ce47e9ce47e9ce47e9ce4 7e9ce47e9ce47e9ce47e9ce47e9ce47e9ce47e9ce47e9ce47e9ce47e9ce47e9ce47e9ce4 7e9ce47e9ce47e9ce47e9ce47e9ce47e9ce47e9ce47e9ce47e9ce47e9ce47e9ce47e9ce4 7e9ce47e9ce47e9ce47e9ce47e9ce47e9ce47e9ce47e9ce47e9ce47e9ce47e9ce47e9ce4 7e9ce47e9ce47e9ce47e9ce47e9ce47e9ce47e9ce47e9ce47e9ce47e9ce47e9ce47e9ce4 7e9ce47e9ce47e9ce47e9ce47e9ce47e9ce47e9ce47e9ce47e9ce47e9ce47e9ce47e9ce4 7e9ce47e9ce47e9ce47e9ce47b9bd67a9bec769ae47b9ad08798eab1cfe75b78f05786ee 5597f55688ff6487fd7791e8677bd17889fb657ff06488dc737ef46a81f35d7feb577bdc 5f81db7093f73f6be45085ff4f82ed4d81ee4982ed4882ee4781ed467eed4578eb4375e8 3c64d3c6bdf2739de782a0debec1f8507ae05f86ef5f88f15e83ebf4f4ecfff8fd6d75da 6a96ff618cda6382d4678cdc5e8aed5d89ec5c87ed5986eb5585eb5382ea5182e95081e8 5084f26268d6ffffecffffda5771df346af1558ada4c60e3c1beeb789ee579a3edd1c6f0 ad738bac7491a87c97af818ea47587dcbcc9fef5faf6fffef7fffffcfffff4e9efc5b0b9 b27c93a46d84ac768dd7abbcffebf4fffdfff5fffde2fef2f8f3f0d6b0bdad7389a56b7a ba697abb5a7b8b537abecbee7989d77887d87985d9777ed86b70ce5e60c45861c07382dd 7790e27d9de87ea0e87692dc6176c53645962633815563aa8494d299aae098a9dd8b9bd6 8b9adb99a7ee4f62ae314490203681556fb98aa6ef8daef584a6ed6d92d880a3dd749ae3 7aa1ee88a7ded7e9ffd6e0ecced7f88a94cf7d9ee57d9ee57d9ee57d9ee57d9ee57d9ee5 7d9ee57d9ee57a9ef49ebeedcae0ebd7e1edb5b9e88692de7691e080a7ec789ce8799be3 86a4e0bdd9ffd1ebfcdef1ffc9d7f2c8d1fccde6ffc9ddfed1defedfe7fed8e0f3b7c4e4 95a6de8495e576afdcc8dffee4dcf1d5cef07e90d07ba1f47299e885a0e5bde1edd3e8fb dbe1ff9da3d78396da83a4eb779ddbaed3ffd7e6edd9e3febcc3f98396db718fd594b7ed c4deffdae9ffd4ddecd9e4f8ceddfce2f4ffd9eaffd4e3ffdeebff9ea9c77d9ee57d9ee5 7d9ee57d9ee57d9ee57d9ee57d9ee57d9ee586a4e07d9ee37597e17ea1e1a2c3eecbe3fb dce9fad6dbefd5e9ffd6ebffd6eaffdaebffe2f1ffdfeaffc1c9f0a1a5d47297e78cabeb b8cff8deefffe6f2ffd9e4f8cedcffd2e0ffcddefad5e3fedde7ffdbe1ffbac6ee8a9ed1 84a0dfa4c6ffdcefffdaeeffd3e7ffd2e2fbdceaffe2edffc8cff9a7abdb6d94df8db0ea b8d2f5d6e7f7deebf4d8e3f5d0ddfdcddaffc6d6f8c6d5f4d8e7ffa8b9e58598da87a1ee 7296e086aef3cfe9ffdef2ffe8f4ffdfe5ffd0d5f3cbd6f6d4e4ffdaf0ffd7dde9dbe1f7 c3ccf397a3dd7d90d57f99e383a1ea7a9ce483a2e27c99e9829ef288a6e2c3e1f9daf0fd cdd7fb9b9adc809bea7997dd9bbbeccce1fedfeafec3c9e98e9fd77d98e77da3eaa3c4ed cfe5f3d6def5aeb1e68794da91b0e9b2deffd2deecdbe8fbdfeaffdae4ffd8e5ffdceaff d7e8facddfebcbcaf6a8b0e1889bd67c9bde779be57399e27d9fe78cadf2c8dfede1eeff dadfffa8b2e78096df7899ea7b9de77998d97b9ceb7ea2dcabceeecfe4f5d1d9eeb2b7e1 8496d67fa0ef89aedaacc9f1d0e4ffdfeaffdae4ffd7e2ffd6e6ffd7eaffc9d5ebd0dffe aabcea849ad6879fe7849be77990dc859be67c9bdc7a98de7c9ae37e9be77a98e07d9dda 95b6e9b2d5ffd9e3efdae5f9d9e4ffd4e0ffd0ddffd0e2ffdaefffe3f9ffe3eaf0d4ddff 90a1e7869fe2bad8fcd7f1ffdeebfed8daffcde3f8d1e4ffccdcffd5e3ffdaebf2deeced b7bddd8e8fcf789fe4acc6f7dfe8ffe8efffd9e8fdd0e5ffd1e7ffd5e6ffc6e1fed4e9ff dee9ffd0d4f9afb6e48d9dd87b97e0769beb97cceec9ddfff2e8ffe5dffbc9dbf1c8e6ff c8d5ffb3a9e66f97df88aae7b6cff8ddedffe5f0ffd7e1faccd9fbcfdcffcde5ffdeefff e0e6f4dddbf3c5c6f28999d47599d59ed1ffd8dfe9d4dff5b1c0e9859bd77793dc7b9be6 7b9de77c9ee56c93de8cafe9b8d2f5d7e8f8dfecf5d8e3f5cfdcfccbd8ffc3d4f2c4d3f0 dde7ffb1b8ec8894dc859cec769be294c2ffd8dfe9d4dff5b1c0e9859bd77793dc7b9be6 7b9de77c9ee57f9de57f9de57f9de57f9de57f9de57f9de57f9de57f9de57f9de57f9de5 7f9de57f9de57f9de57f9de57f9de57f9de57f9de57f9de57f9de57f9de57f9de57f9de5 7f9de57f9de57f9de57f9de57f9de57f9de57f9de57f9de57f9de57f9de57f9de57f9de5 7f9de57f9de57f9de57f9de57f9de57f9de57f9de57f9de57f9de57f9de57f9de57f9de5 7f9de57f9de57f9de57f9de57f9de57f9de57f9de57f9de57f9de57f9de57f9de57f9de5 7f9de57f9de57f9de57f9de57f9de57f9de57f9de57f9de57f9de57f9de57f9de57f9de5 7f9de57f9de57f9de57f9de57f9de57f9de57f9de57f9de57f9de57f9de57f9de57f9de5 7f9de57f9de57f9de57f9de57f9de57f9de57f9de57f9de57f9de57f9de57f9de57f9de5 7f9de57f9de57f9de57f9de57f9de57f9de57f9de57f9de57f9de57f9de57f9de57f9de5 7f9de57f9de57f9de57f9de57f9de57f9de57f9de57f9de57f9de57f9de57f9de57f9de5 7f9de57f9de57c9cd77b9ced779be57c9bd18799ebb1cfe75a77ef5685ed4986b55585c7 7d9dcedbf3f5edfff1f4fffff0ffffedffefeffbf7f1ffffedffffedfffbeeffffe0fdff 6490bd528dd15083ee4d81ee4982ed4882ee4781ed457dec4477ea4274e73d65d4c7bff2 759fe783a1dfbfc2f94f79df5e85ee5d86ef5c9aeff0fff4fcfffd6483dd4e8bf55086e6 5d85f75a89fd6787ee6686ed6584ee6384ed6082ed5e80ec5b80eb5b7fed2b8eff4c7ffc eaffffe9ffff507cf7336ef8487bca4053c9bfbce9759be2759fe9ccc1ebab7187b07591 b0829ebb8b99d5c0c9eee3e9fefffff9fffffefffffcedf4dcbac8b68598ae788fae788f ac778bb38496d0afbaf5e5e8fefffdf7fffdf9fffbfde6eed5aabba97b85a96270b85f7b 8f5d82b6c6e87989d77988d97a86da7680d96c71cf5e60c45b63c57584df768fe17999e2 7b9ce37896de728ad45568b55167b2364d912139751b346a1d366c263f77263e7c1b3275 3248914a62aa5e79c07b98de7d9be17192d781a4e888adf182a6da78a0de7da6e88fb1e1 d8eeffdbe8f8d3e0ff94a6d87da0e47da0e47da0e47da0e47da0e47da0e47da0e47da0e4 7ba0f1a2c3f6d2ebffe0efffbec8f98fa0e87a97e37da4e97da1eb7d9eeb819fe5a4c2f4 bfdbf1dcf8fcdef6fae4f8ffe4f8ffd6e3ffd2d8f8dee2fbe2e7facbd2eea2acdf8491d7 88bcebcfe9ffe6e7ffd7d6fe889bdd7fa4f4759ae885a2e6bee3f3cfe9fad6e1fd9ba8d4 7d95d1799cdc7299d0a3c8f5dfefffdde6ffbfc8ff8ea0e86f91d97ea6e3a3c3f2bdd3fa e5eeffe2eefecedbebd2e2f2cbd8ebd0daf3e9eeffc3c3e57da0e47da0e47da0e47da0e4 7da0e47da0e47da0e47da0e486a6e17d9ee37599e381a7e8a8caf8cee9ffdaebffd2ddfb c7d7e4c9dae4cfdfecd7e7f7d6e4ffc7cffdadb3ef999ee27ca6f286a9eda0bceec3d7fa d7e8fcd8e8f7d4e6f2d4e8f3daeaffd1ddf7d5dcf6e2e9ffcdd7fa97a8d488a1d7abc9ff ccdee0ccdee0cee0e2d4e5eddae9fcd5dfffbcc4f5a3a9e37ea5f08bacefa3bdeebdd1f2 d2e3f5dbedf9dbeff8d5eef5eaf6ffe1eef7e4f1ffb3c0e3929ddb8d9eee798fe4849fee 8db3d8a8c9eccadffcdde8fee4e7f8e5e4f2e1e3efdee2ede0ebffe0ebffc6d5ff9baee8 8198dc809ce581a1ea7b9de580a2e27b9be883a2f296b4f0cdecffe0f9ffc8d7ff929adb 87a7f47799e082a7dec2deffd7e8ffabb9e08ba1dd7e9fee7aa0e999bbebcbe3ffe5f2ff c7d0ff92a3eb81a0e091bce9d5e4f7d9e8fbd7e4f5cfdcecd0dcecd9e4f6dfe7fcdce4f9 a2afe490a3dd7e9adb7799e0779de6789ee77c9ee57fa0e3b3d2f1d7ebffc8d4fe94a3de 7e9ae47ea3f37aa0e7799ddb799ce083a8dcb4d9f6d9f3ffdce9fcbcc5ec889ed77a9fe3 8eadf0a7c1fcc4d6ffd5dfffd9e1f8d7e0f1d3dfedd0deebe9f0f6dfebfbb1c0e1899dd0 8ca0e5899eed7e92e88397ee7d9fde7b9cdf7d9de680a0eb7b9be67798dd81a3e090b3e9 cfd8ffd8e2ffe1ecffe0efffd8e9f3cfe1e5c9dbdbc7dad8daeafad0e3ff95aef081a1de 9fc3e7b8d9e8d1e8fadeebffd4e7eee0eeffe0eaffcad4edd9e4e6e5eff0d7dbf4aeabe0 75a3eea2c1f7cfddf8dde5f0d2e3ebcce4f0cbe5f4cde3f1e4f3ffd9e7ffc5d3ffabbcf0 93a7e4839cdf7c9ae07a9ce381afe3b3c7fce2dcffe4e0ffddecffe8ffffd9e3feb1a6ce 7da3f687a8efa2bcedc3d8f5d7e8f8d6e8f4d2e5f3cfe6f6cfe3fed6e3f6d7ddebdfdff7 cccdf98e9bd27491c997c0f4e1ecfedceaffb6cbf88ba5e27d9be37d9fe97b9de57c9ee5 7da4ef8cadf0a4beefbed2f3d3e4f6dceefadbeff8d5eef5e8f5fee3edf7ebf3ffb9c0ea 8f9adc879ced7d9cec96beffe1ecfedceaffb6cbf88ba5e27d9be37d9fe97b9de57c9ee5 7e9fe47e9fe47e9fe47e9fe47e9fe47e9fe47e9fe47e9fe47e9fe47e9fe47e9fe47e9fe4 7e9fe47e9fe47e9fe47e9fe47e9fe47e9fe47e9fe47e9fe47e9fe47e9fe47e9fe47e9fe4 7e9fe47e9fe47e9fe47e9fe47e9fe47e9fe47e9fe47e9fe47e9fe47e9fe47e9fe47e9fe4 7e9fe47e9fe47e9fe47e9fe47e9fe47e9fe47e9fe47e9fe47e9fe47e9fe47e9fe47e9fe4 7e9fe47e9fe47e9fe47e9fe47e9fe47e9fe47e9fe47e9fe47e9fe47e9fe47e9fe47e9fe4 7e9fe47e9fe47e9fe47e9fe47e9fe47e9fe47e9fe47e9fe47e9fe47e9fe47e9fe47e9fe4 7e9fe47e9fe47e9fe47e9fe47e9fe47e9fe47e9fe47e9fe47e9fe47e9fe47e9fe47e9fe4 7e9fe47e9fe47e9fe47e9fe47e9fe47e9fe47e9fe47e9fe47e9fe47e9fe47e9fe47e9fe4 7e9fe47e9fe47e9fe47e9fe47e9fe47e9fe47e9fe47e9fe47e9fe47e9fe47e9fe47e9fe4 7e9fe47e9fe47e9fe47e9fe47e9fe47e9fe47e9fe47e9fe47e9fe47e9fe47e9fe47e9fe4 7e9ed97a9dee799de77d9ed3899bedb1cfe75977ef5584ec658bff6a82ff7a86e8f8fdff fffefffffafff1edfbf8faecfffefbfffffdf9f8f6fcf6f6fdf6fff7fbff6580d95b8aff 5184ef4f83f04a83ee4882ee4781ed457dec4477ea4173e63d67d3c9c1f475a1e884a4e1 bec3fa4e79df5c82ed5a83ed4e7efaf1fffff0f0ff8097f55e8cec6788e97689ff6482fa 5b8ae6598ae75889e65789e85489e95388e85187e95187e94292db638de1def5fbeaffff 4e7af3407bff4c85d64f6ddbc1c0ea759de3739fe6cabfe9a96f85b07591b385a1c0909c fffffff6fafbf9fffffcfffffbeef5cfabb9b77c92bf738fb27e94b37e92ae778ca57283 ac828ecdafb7f8e8e9fffcfbe9fff3fffbffffe8f2bc9ca1a0646eb35f79926387b8c8e9 7a8bd97a89da7b87db7781da6c72d05f61c5606acb7786e1758bde7593dc7899de80a1e6 91aef4859fe983a1e77a99da86a6e38eafe584a5db89a9e291b1ec86a5e57b98de8daaf0 8caaf091aff58aabf07fa2e685aaee7ea3e782a5dd7da5e37ca8e78cb1e5c4dcffc7d7f8 c4d7ff92abe17fa2e67fa2e67fa2e67fa2e67fa2e67fa2e67fa2e67fa2e67ba1ea99bcf2 bfdcfecbe2ffb3c7fc90a7ed7d9de67ca3e880a6e57fa1e97c9ce989a6e89ebbe7b7d6eb c0dceac0dceac7deffbdd0f8c0cdf7d1deffddebffd0dfffafc0f496a7ec8cbcedbedbff cdd9ffc0ccfc88a1e183a7f3799fe882a3e8bce3ffcbe5ffcfdeffa5b7e98ba9e986adf0 82aae7a4c8fcc6d9f7c4d1fdb5bffc94aaf3799de7729edf7fa6e192ade4afc2eac3d7f8 cfe5fde4f9ffdeeeffd0ddfdcbd3ffa0a5dc7fa2e67fa2e67fa2e67fa2e67fa2e67fa2e6 7fa2e67fa2e67fa2dc7c9fe37ca0ea87adeea0c4f6b5d5fbb8d0f6aec1ebe3f5ffdbedff d2e6ffcbe0ffb7cdf69aafe4869bdc8094dd729fe0769dde87a7e4a5bef4c3d6ffd0e3ff d4e8ffd5ecfcc2d9fbbaceefc0d3f4d7e9ffd3e6ffa5bded8faee4a4c7ffdff2ffd9ecfa d3e9f7d0e6fdc3dafaaac1ed8fa5de7f94d56d94d77194d67e9bd796ade3b0c5f0c4dbfa cde8fbcdebf6c6d7f1bdcfe5bcd0e89db0d8899ddc8ba0ef7e97e786a2ec7ca5dd97bbef b8d3ffcee2ffd8e6ffd7e3fdcdd9f1c2cee4caddfdcbddffb8ccfe97b0e9839ee182a0e6 82a4eb7ca1e77ea1e17ea0e885a5f096b6f3b9d9ffc7e3ffb3c9fa8ea0e087a9f37ba1e8 749ddbaaceffbbd4fd93a8d789a7e77ea5f4779de68fb2eab8d4fccfe4ffbed0ff96acf5 7d9ee17ca4df8fa7d3aac2e8c9e1fdddf3ffdff4ffd0e1ffb3c0ea9ba5d687a3e284a3e4 7ea1e5799fe67ba3eb80a6ed81a4e87d9cdf93b9eab5d1ffa7b8ec8398d782a4ec7fabf6 76a1e581a8e17b9de481a8dfaad1f8c6e3ffcbdbfdb3c1f086a0db79a1e66b91da7d9ee1 98b2ebb3c8f5cadafcd8e8ffdcecffdbedffcad5ebbfceed9cafd98099d183a0e484a4ef 7f9ef082a1f483a5e480a2e281a2e984a4ef82a2ed7c9ce57c9de282a3e68fa4e39fb6ea b5cdf1c8e1f7d3ebf7d7edfadbeeffdceeff8aa1ca91abe47596dd749adb8db6e4a3cae9 c3e2ffd3ebffc9dff4d1e4ffd4e6ffb5c5e7c8d8efd0dff6d3dfffb4baf675aaeea2c6f8 d4e4fee4eefadaeaf7d2e8fdd1ebffd4ecffcbd3f8b9c6f39eb3ec87a4e87c9ee67c9ee6 80a1e484a3e37bace7a2c1fac9d5ffccd8ffc4d9f8cce5ffcbd9feb3b4e27a9ff07c9ee6 8daae2acc5eec6ddfcd1e9ffd3edffd4efffb5cef7bcd3f3c9d9f3d6e3ffccd9ff9eb2f1 84a4e194bdf3cbdcfac9dcffabc5f88aa8e880a2e97ea3ea7ba0e67fa2e66e95d87295d7 7f9cd897aee4b2c7f2c6ddfccee9fcceecf7c8d8efc2d3e7c4d4ee9fb0dc859add83a0ee 7ca4ec8abafacbdcfac9dcffabc5f88aa8e880a2e97ea3ea7ba0e67fa2e680a1e680a1e6 80a1e680a1e680a1e680a1e680a1e680a1e680a1e680a1e680a1e680a1e680a1e680a1e6 80a1e680a1e680a1e680a1e680a1e680a1e680a1e680a1e680a1e680a1e680a1e680a1e6 80a1e680a1e680a1e680a1e680a1e680a1e680a1e680a1e680a1e680a1e680a1e680a1e6 80a1e680a1e680a1e680a1e680a1e680a1e680a1e680a1e680a1e680a1e680a1e680a1e6 80a1e680a1e680a1e680a1e680a1e680a1e680a1e680a1e680a1e680a1e680a1e680a1e6 80a1e680a1e680a1e680a1e680a1e680a1e680a1e680a1e680a1e680a1e680a1e680a1e6 80a1e680a1e680a1e680a1e680a1e680a1e680a1e680a1e680a1e680a1e680a1e680a1e6 80a1e680a1e680a1e680a1e680a1e680a1e680a1e680a1e680a1e680a1e680a1e680a1e6 80a1e680a1e680a1e680a1e680a1e680a1e680a1e680a1e680a1e680a1e680a1e680a1e6 80a1e680a1e680a1e680a1e680a1e680a1e680a1e680a1e680a1e680a1e67ea1db7da0f1 7ba1ea80a1d6899eefb1d1e85676ed5283ea567cf7637cfb6777ccf5fefffffff3fffbfb fffcfdffffe8fffff4fffff4fffef0fffdf1fffcfdf8fdff5678c24982eb5386f15185f2 4c85f04983ef4882ee467eed4477ea4173e63c67d0c7c1f176a2e985a5e0bfc4fb4f7ae2 5a83ed5983ef657dd5fffef8fffde6f1fbfddefae4f4fce4fffffaebfde7fffefffffeff fffefffffffffffefffdfefffdfefffbfefffafff9fcecf9fffce8fffeff5772dd3970ee 2a6ac42a5dcac5c7f07ba3e877a3eaccc1e9a86f82ae728caf7f99ba8894e8e3e7fcf7fb fffdfffaeff5d1b7c2af8394b07088c17591b88598aa7589aa7386b47d90b07b8baf818c d5b0b8ffebf0f2fff7fffafdf6d7dfb89498a5666fb9617a975f84bcc2e67c8ddb7b8cdc 7b8add7782db6c72d05e62c55966c67685e07a90e37f9be47e9fe280a2e28caeee80a1e4 89aef27fa5e486acea88afe8789fd67da4dd89b0e982a9e491b2f591b2f57d9ee180a3e5 8baef08cb2f38cb2f3759bdc81a2e77fa7ed78a5e97ca4e299b3ee97aae498b0ec7897d8 7fa5e67fa5e67fa5e67fa5e67fa5e67fa5e67fa5e67fa5e680a5e986aae48fafe091addd 89a3de7f9cde7d9fe682a7ed80a8d981a4e47fa0ef7b9aea88a7e890afe594b2e48caae0 8cb0e085a6dc809eda83a1d788a7d587a7d682a2dd7d9de677a0d690b1e495afe094aae3 7c9ada81a6ec7ea3ea81a4e882a9e28aa8de92a5dd8098d87698e2769fee769ce587a9e9 94afda94a8db94a3e48da5ed80a8ee75a4e877a0e27f9edf89abf28dafee85a6d983a2ce 7f9bca859ed691a8ee889bea7fa5e67fa5e67fa5e67fa5e67fa5e67fa5e67fa5e67fa5e6 81a5df80a6e781a5ef82a7eb88ade28bb0dd88a8d9839dd686a3db819fd582a1d786aade 82a7dc789fd87ca4e287b0f07eade37ba5df7c9fe183a0e688a0e6859ddd8298d18097cb 85a9dd82a3d67d9ed185a6d989ace279a0d96f99d579a7e583a0d8819fd584a3d98aaee2 8bb0e582a9e27da5e37ea7e78eb5ee8aaeec86a5e886a1e888a3e88ca5e589a6de85a5d6 90aced8caae08dafdf80a3d97da0e485a7f17fa4e883aae57a9be2809fe283a2e284a2de 85a5de87abe585ace780aae694acda96b0e192ade484a2de7e9dde7fa2e480a5e97fa6e9 7fa5e683a8ec85a6eb8baaea8faee496b6e78daae2819ddc7e9fe47ea6ec709de08db5f0 95b3e77f9acf86a8e879a5f07ca1e887abe991b0e690abe28ba4e486a3e981a3ea7da2e6 799de77ca2e37fa4d97ea3d081a3d186a3db88a0e6869deb81a4e882a7ed80a6ed7ca4ea 7ea6ec85aaf085a8ea7ea0e079a5e491b1ec87a0d97e97d987acf37aa6ef6f9bdc85ace3 85a5f27aa1e488b1e98eaee192a7de90a4e37e9ce27fabf475a8e974a4e479a3df81a6dd 89a8df88a6dc83a1d5819cd394aae691aaea83a2e3769de078a3e77ca9ed7ca9ed7eabee 86aae882a5e580a3e783a5ec84a6ee82a4ec80a2e980a2e97ba3eb81a9e787afe28ab1da 88aed586a6d584a1dd849fe48ba7e893b1f97fa3f17ba5ef7ba7e6789fd683a4da809dd5 89a9dc87a6dd8dabe77996d088a6dc86a0d98fa8ea8198e47db8f0abd2fbd6e8ffd6def3 b3c0e090a6d78199d58199d7a0abd996a7dd86a2e37a9ee8769fee7ba3eb81a7e887aae4 679ed671a0d685a8de8babde82a3d884a4dd8ca5e8899be583a8ee80a3e580a0dd86a3db 88a6dc86a0d97e9bd77a98d67aa1dc82a6d885a6d384a4d783a2e37a9ce6749ce279a7e5 93aad698b2e389a8e1789bdb7ba0e67ea5ea7da2e682a5e78fb6ef8bafed87a6e987a2e9 89a4e98da6e68aa7df87a7d893ade88faadf8fade181a1dc7a9fe67fa9f378ace879b3e3 93aad698b2e389a8e1789bdb7ba0e67ea5ea7da2e682a5e781a4e681a4e681a4e681a4e6 81a4e681a4e681a4e681a4e681a4e681a4e681a4e681a4e681a4e681a4e681a4e681a4e6 81a4e681a4e681a4e681a4e681a4e681a4e681a4e681a4e681a4e681a4e681a4e681a4e6 81a4e681a4e681a4e681a4e681a4e681a4e681a4e681a4e681a4e681a4e681a4e681a4e6 81a4e681a4e681a4e681a4e681a4e681a4e681a4e681a4e681a4e681a4e681a4e681a4e6 81a4e681a4e681a4e681a4e681a4e681a4e681a4e681a4e681a4e681a4e681a4e681a4e6 81a4e681a4e681a4e681a4e681a4e681a4e681a4e681a4e681a4e681a4e681a4e681a4e6 81a4e681a4e681a4e681a4e681a4e681a4e681a4e681a4e681a4e681a4e681a4e681a4e6 81a4e681a4e681a4e681a4e681a4e681a4e681a4e681a4e681a4e681a4e681a4e681a4e6 81a4e681a4e681a4e681a4e681a4e681a4e681a4e681a4e681a4e681a4e681a4e681a4e6 81a4e681a4e681a4e681a4e681a4e681a4e681a4e681a4e67fa3dd7fa4f47da5ed81a5d9 8aa1f1afd2e85575ec4d81e75286dc6b96f57395d4e4ffffeefff4f2fcfff8fffff8ffff f1fafff4fffff7fffffbfffff7feffedffff6091c9579eee5487f25185f24c85f04a84f0 4882ee467eed4578eb4274e73a67cec5c2ef75a4e885a8e2c0c7fd4f7be45a84f05884f1 7f98f4f4f3fff3edeff1ffffeefff1ffffeffffefff1ffeffffefffffefffffffffffeff fefffffcfffffcfffffcfffffffff8fffafffef4fde2eaff6182eb4f86fd3a79da3b70da c5c9ef7ba7e879a8ecd1c7ecac7185ac7089aa7891b27e8ab2929ff7d9e5ffebf7c9abb7 9d7b89b18697be8b9eac7288b47f91a77083ab7285bb8092b57b8aa66d7cb6808dd9a5b1 fffdf8f0cbd3bc89989e6c75ae6570c15e7b96547ac1bde27e91de7d90df7c8ddf7984dd 6b74d15e64c65a68c97586e07c91e4819be57f9edf7b9fdd85abe97ba3e085aced7ba2e3 7ea6e489b1ee90b8f392baf589b1ec779fda749ad989afee87adec86aceb7da5e378a0de 87afed83abe981a1ec83abf177a7e97aa2e786a2eb8399e489a5ee769de280a8e680a8e6 80a8e680a8e680a8e680a8e680a8e680a8e680a6e47fa3e17ca0de7ca0de7ea2e080a3e3 82a5e982a7ed80a9d77fa5e387a8f57e9fee87a9f181a4e882a4ee7a9aed84b1ea82adf1 81a8f37ca4ea79a3df7aa5dc7fabec85affb7ca0da80a4e07da1df7da1df7c9ede86a9eb 82a7eb80a5eb82a8f186a5e88ba3e389a6ea84abfa82afff86adfa89aaef80a5dc819eda 839add85a2e681adee7daef07ea9ed83a4eb75a2f580a9f883a9f081a6ea82a5e980a5ec 7ea3f3799ff480a8e680a8e680a8e680a8e680a8e680a8e680a8e680a8e683aae181a8e9 7fa5ee7ca3e87aa3db7ba3d77da4df7fa4e87ea3f17ba1ec7ca4ec7faaee7dabe974a5e0 76a9e27fb2eb7ba4da7ca4df80a6e786a8f08aaaf78cabfb8dadfa8faffc7fa8ea85aef0 7da6e876a2e37faced7eaeee79a9eb7aabed83a7fb81a6f77fa6f57da7f17ba8ec76a6e8 78aae97caeeb7aa1da7aa0de7da0e47fa1eb82a3f285a6f788a9f88aabfa7ea2fa7ca3f0 7aa6e777a7e77aa9ef7eaaf180a9e781aade8ba6f38aa8f183a5ed79a1e774a3eb77a8f5 72a9fb6ea6fb7e9ed781a1da82a5df81a5e17fa5e480a6e581a8e981a8e97da4e585abea 82a5e587a6e67998d97ea0e07ca2e083abe87f9fdc84abee79a8ee7ea7e981a1dc809dd7 86a9e97da9f07ea4e586a9e982a6e4779bd7799dd986a9e989abf280a4ee81abff81aafa 7fa9f17eaaeb80a9eb82aaf285aafb86aaff81a8ed82a9ee80a7ec7ea5ea81a6ea84a9ed 84a7e980a3e578a9ee81a7e6839dda87a3e48cb3f87ba7ee749ddd8aafe687a7f47aa0e9 7eaaeb7b9ede819add88a0e87c9ee87faef680b4f07badea79a9e77eabec82adf184acf2 84aaf385abf67e9df07da0f17ca6f27aa9f178a9ec79abea7aace77bace685a8e882a5e5 7fa2e480a3e584a7eb85a8ec84a7eb83a6ea7aabf07bacee7babe97ba9e57aa6e57ca3ee 80a4fa82a5ff7898e57da1ed779ee97fa9f381abf37fa7ef8aaff585a6eb7ba2ed769ee6 7ba3eb7ca2eb85abf680a5f387acfc89aefe6ba5d59fc5ead4e4fedce1feb9c6f295aded 89a9f68fafff87a0d886a3df85a6e982a8f180a7f27fa7ed81a8e983aae584b8f175a8e1 77aae183b1ec84aded84aaf386abfc81a5fb7aa1dc7ca2e082a5e586a9eb8aacf38bacf9 8daeff8eaeff7ba7f07fabea7face579a5e479a3ef80aafc85b1fc80b0f27d9ad286a4e0 7fa3e1779ee17ea6eb82a9ec7fa5e684a7e77ba2db7ba1df7da0e47ea0ea81a2f185a6f7 89aaf98cadfc7a9ef27aa0eb79a1e677a2e77ca8f37faff77bafe872abd67d9ad286a4e0 7fa3e1779ee17ea6eb82a9ec7fa5e684a7e783a6e683a6e683a6e683a6e683a6e683a6e6 83a6e683a6e683a6e683a6e683a6e683a6e683a6e683a6e683a6e683a6e683a6e683a6e6 83a6e683a6e683a6e683a6e683a6e683a6e683a6e683a6e683a6e683a6e683a6e683a6e6 83a6e683a6e683a6e683a6e683a6e683a6e683a6e683a6e683a6e683a6e683a6e683a6e6 83a6e683a6e683a6e683a6e683a6e683a6e683a6e683a6e683a6e683a6e683a6e683a6e6 83a6e683a6e683a6e683a6e683a6e683a6e683a6e683a6e683a6e683a6e683a6e683a6e6 83a6e683a6e683a6e683a6e683a6e683a6e683a6e683a6e683a6e683a6e683a6e683a6e6 83a6e683a6e683a6e683a6e683a6e683a6e683a6e683a6e683a6e683a6e683a6e683a6e6 83a6e683a6e683a6e683a6e683a6e683a6e683a6e683a6e683a6e683a6e683a6e683a6e6 83a6e683a6e683a6e683a6e683a6e683a6e683a6e683a6e683a6e683a6e683a6e683a6e6 83a6e683a6e683a6e683a6e683a6e683a6e681a5df80a7f680a8f083a8dc8ca3f3b0d3e9 5275eb4b7fe5487df15581ff4f76ed7599e76b89d1667be46f83f36179d17486f46a82f0 6380e85f79da667ed87391f33f71e24687ff5184ef4f83f04a83ee4882ee4781ed457dec 4477ea4173e63969cdc6c3ee75a6e886aae4c1c8ff4d7ce45882f05681f14077f87292e9 607ad96493fb5585d76271e4636fff5080ee5688e75489e95388e85288ea5188ec5188ec 4f89ed4f89ed4082cc4880d34b7fd55a90f2336be23e79ed3b6fd54067ccc1c7eb78a5e6 7aaaecd0c8edad7284ae7089a9748eaf7a84ab768acc99acd3a2b5b48899a17586aa7f90 b08596a77c8db0798cb37d8db57c8db07685af7282b27483b37582b17380d2aeb2c28595 aa6779a96d77b96976b85470914f75cdccee7e94e07f92e17e8fe17886de6b76d25f65c7 5f6dce7687e1798ee17e98e27d9cdd7ba2dd8ab4ee83b0e97ca3e48bb2f38db4f583abe9 7ba3e178a0dd85ade89bc4fc88b1ef8db6f481aae887b0ee8ab2f084acea88b0ee7aa2e0 83a4e788b2ee79ace381adea87a7f087a2ef8eb0f780aeea81a9e781a9e781a9e781a9e7 81a9e781a9e781a9e781a9e780a7de82a8e784aaf186aef488b1f389b1ef84aaeb7fa4ea 84abe47fa5e688adf37fa5e689b2ea7ba3de82aaf07fa5f876a3de7ba6eb7fa8f87fabf6 7dabe97daae37ca8e77ca6ee8badea86adee7facf07ea9ed85abea89abea87aaec7fa6eb 81abf783a4e984a2e088aae97eaaf178a8f281a9ef7e9ddd7faff185aaee88a5e785a7e6 80ade880b1ec84adef86a7ee7ca6ee85adf58aaef887a9f189aef587aff57ba8ec7bacef 81a9e781a9e781a9e781a9e781a9e781a9e781a9e781a9e782abe180a7e87fa5ee7fa6eb 81a9e682ace683aef286affe81a7ee81a7ee81a9ef84acf284adef80aceb7eaae77eabe6 89aaed88abeb84aae97fa7e57aa3e375a1e2749fe4729ce6799ee583a9f081a7ee7ca4e9 82adf181adee79a5e478a4e383a9f285abf484acf27fa7ed7ea6eb7eaaeb81adea82aeeb 8caef58aaff388aff085aced80a9eb7da5eb7aa1ec7a9fed83a7fb82aaf27aa8e47cacea 7dacf27da7f184a9ed83a8df80a2e985a8ec86adee84aded83aff082aff37baaf274a2ef 86aced85abec85adeb87afed85adeb82aae880a9e781aae87ca5e783abe87fa3df8caeee 7d9de685a9f37da8ec87b5f189a7dd83a9e885b1f87da7ef81a3e38caae683a7e580adf0 81a8e384aae984abee84adeb87b1eb8ab2ed87acf080a4f082a7ee80a5ec80a5ec7fa5ec 7ea4eb7da5eb7da5eb7ea6ec84aaeb83a6e882a5e584a7e785a8e883a6e881a7e882a7eb 7eb0f783abe989a6e08daae688adf17faaef80a7e88aaae384a5e87da6e687b5f384aded 8aa9ec91aef27ea5e67aaeea81a8e97ba4e47aa3e57da6e87ca4e979a1e67ba3e882a9ec 83a7f17ea4eb82aaef83b0f17dabe980a9e783abe982a5e583a9ea82a8e77fa5e47fa5e3 82a8e684aae883a9e781a7e583afee82aeed81adee81a9ee80a8ee7fa7ed81a7f082a8f1 89aef589b0f181abe586b3ee7faaee79a0eb85abf47ca1e786abf984acf47fa8ea84acf1 7ca3ee7ba2ef759de276a2df7cb3e9aed1fbdeecffe1e6ffb9c6f08aa9e279a1e67ca8f1 7da9e881aaea86aced88abed87aaec83a9ea80a9e97fabea87a9f07aa3e577a7e57dabe7 7fa6e783a8ec82aaef76a3e787abe786acea84abec80a7ea7ca4e97aa2e878a0e5779ee3 7da4ef7ba4e67eabe682aeed7ea8f281a8f782a8ef7ca2e085a7e78db0f286adf07ea9ed 83aef284adef80a6e585a9e78daff68aaff387aeef83aaeb7ea7e97ca4ea7aa1ec7ba0ee 7ca3f281a9ef7ea7e77ea6eb81a8f583a8f685aced7ea6d985a7e78db0f286adf07ea9ed 83aef284adef80a6e585a9e782a8e782a8e782a8e782a8e782a8e782a8e782a8e782a8e7 82a8e782a8e782a8e782a8e782a8e782a8e782a8e782a8e782a8e782a8e782a8e782a8e7 82a8e782a8e782a8e782a8e782a8e782a8e782a8e782a8e782a8e782a8e782a8e782a8e7 82a8e782a8e782a8e782a8e782a8e782a8e782a8e782a8e782a8e782a8e782a8e782a8e7 82a8e782a8e782a8e782a8e782a8e782a8e782a8e782a8e782a8e782a8e782a8e782a8e7 82a8e782a8e782a8e782a8e782a8e782a8e782a8e782a8e782a8e782a8e782a8e782a8e7 82a8e782a8e782a8e782a8e782a8e782a8e782a8e782a8e782a8e782a8e782a8e782a8e7 82a8e782a8e782a8e782a8e782a8e782a8e782a8e782a8e782a8e782a8e782a8e782a8e7 82a8e782a8e782a8e782a8e782a8e782a8e782a8e782a8e782a8e782a8e782a8e782a8e7 82a8e782a8e782a8e782a8e782a8e782a8e782a8e782a8e782a8e782a8e782a8e782a8e7 82a8e782a8e782a8e782a8e781a8e182a9f880aaf285aade8ba4f4afd3e95174ea497ee4 578de75380f75781f7527ed7537fd8557cf3648cff5988e45b7ee4507fe95189f85086f2 5888ee547fe55888f44c83f74d80eb4a7eeb467fea447eea447eea427ae94174e73f71e4 3c6ccec8c7ef78a9eb88ace6c0c9ff4c7be3547fef4f7ded488eee598ad65280e24b8ef7 4886db627ef96381ff4e98fb5b80eb5b80eb5b7fed597fec577fee567eef557fef547def 3785ff408aff3b81ff4487ff3f80f4427ae9406ad84061c8c2c8ec77a7e578a9ebcfc8ea ab7082ac6e85a8728aae7681b27d91a46f83a66f84b57e93b37e92a26f82a06f82af8092 af7687b77e8fb57c8bab7180ac6f7eb47683b47482ab697798636bae6377b66b80b57880 b46b74af566c8a5776ccd7f58096e27e93e27e90e27888df6c77d35d65c75969c97485e1 7d92e587a2e986a5e57da4df85b0e779a8de85adeb8db4f582a9ea80a7e890b8f68cb4f1 7fa7e285aee683afec88b4f17fa8e685aeec84adeb7ea6e488b0ee83abe986a9e389b5e6 77acd680b0e184a7e983a1e983abe974a6d782aae882aae882aae882aae882aae882aae8 82aae882aae888ade285aced81a8f57aa6f179a6e97fa8e682a9ea84a6ed89aef47ea3ea 86abef7ba4d886b3da75a2c981afe385b0f586ade685acf182a7f581a8f383acea86afe5 83abe680a6e785a5e27da5ea79abf47aaaf285aced87a9e686a9e97fa7ed80aaf282a6e4 85a6db89b1e57cade877aae986b3ee86a7dd74aaf280adf189aaed83a7e37ca9e27cade7 83abe986a4ea81a9dd86a9e387a6e77e9bdf84a3e684aae877a6da7fb3e282aae882aae8 82aae882aae882aae882aae882aae882aae884afe481a8e981a7f084abf085aeec80ace9 77a6ec73a0f38aafe689ade786aae684a7e786a9eb88abef87a8eb81a2e588a3f488a6ef 82a8e67ea9dc7daddb7fb2e180b3e87fb2eb89a6ec8caaf084a5ea7fa2e686a9eb84a8e6 84a8e48fb2ec7fa5d487adde88ade283a7e182a6e287abe788aae783a5e280a0f37fa3ed 80a7e880aee283b1e383b2e683b0eb82aeed86a7ea84abe47aa6d77daae17faaef7fa3f1 8aa8f18aa5e87ea7e980a9e77faae17da7d981a7d88aabde8fade38faae181a9ef7ea6eb 7ea7e981aae880aae67da7e37ea7e581aae880aced85ade87fa3dd92b4f484a5f289aefe 75a1e876a8e38fabdd7b9fdd84b0f77ca6ee84a5e891afeb7a9edc7eaaeb8bb0e77ea6e4 7aa2e77daaeb7eade37ca7de7da4e786a7f68caade8ba8e08ba9e78cabec89abeb83aae5 81a9dd80aada88aaea82a4e382a4e38aa9e989abea83a6e680a6e785acef7aacf180a8e6 8ba8e086a3dd7c9fe17fa7ed86aced83a1dd87aae27ea9e081b2ea79a6df80a2df8cace9 7ea9e07cb1e38ba6ed88a5eb89a7ed89acee84aae87ea5de81a9dd8ab2e38db0e882a7dc 82aade86ade483a7e187a6e68da8ed8aa0e985abec85abea84aae882a9e484abe485ace3 84abe480a7e081a4de83a5e285a8e887aaec87abe985aae183a9d881a8d37ea6e47ea7db 7aa7d183b2e07ca9e47aa2e88cb3f884abec82a4ec8aaeec81a6dd8ab1ea7da3e48cb2f3 81aae083aed879aceba7c7f6d8e3ffdee2fbb9c9ea8eb1db7dadde80b5e776aff27bacee 80a8e686a6e187a5e186a8e782abeb7dadef889aee8aa7f38cb5f783ade97a9dd785a4db 88b0e37babd981a4e480a6e77fa6e97ca8e77eaae781b0e684b2e382b1dd93b3fc81a4e4 81a8e189b1ee83a8ef81a1ea89a6e88ea9e081a3ea85acf17fa7ed78a5e97eabee80a9e9 7ea4e384a8e681a1f47fa3ed7fa6e77eace080aee081b0e483b0eb82aeed80a6e489b0e7 83abdf83a7e581a1ee849ef290a8f28ea6e681a3ea85acf17fa7ed78a5e97eabee80a9e9 7ea4e384a8e683a9e883a9e883a9e883a9e883a9e883a9e883a9e883a9e883a9e883a9e8 83a9e883a9e883a9e883a9e883a9e883a9e883a9e883a9e883a9e883a9e883a9e883a9e8 83a9e883a9e883a9e883a9e883a9e883a9e883a9e883a9e883a9e883a9e883a9e883a9e8 83a9e883a9e883a9e883a9e883a9e883a9e883a9e883a9e883a9e883a9e883a9e883a9e8 83a9e883a9e883a9e883a9e883a9e883a9e883a9e883a9e883a9e883a9e883a9e883a9e8 83a9e883a9e883a9e883a9e883a9e883a9e883a9e883a9e883a9e883a9e883a9e883a9e8 83a9e883a9e883a9e883a9e883a9e883a9e883a9e883a9e883a9e883a9e883a9e883a9e8 83a9e883a9e883a9e883a9e883a9e883a9e883a9e883a9e883a9e883a9e883a9e883a9e8 83a9e883a9e883a9e883a9e883a9e883a9e883a9e883a9e883a9e883a9e883a9e883a9e8 83a9e883a9e883a9e883a9e883a9e883a9e883a9e883a9e883a9e883a9e883a9e883a9e8 83a9e883a9e881a8e181aaf981abf386abdf8ca5f5afd3e95075ea487de3507fcd436ddd 5e87fd4e7ad95a88e84f7df54e81f43d78c8517fcd417cd64088ee3d84ee4681e73868cc 5e89f14672df497ce7477be8437ce7417be7417be74078e73f72e53d6fe24070d2cccbf3 7bacee89ade7bfc8ff4a79e3507beb4a78e84d7cf25772db617dfb4e7ff64c79cc6975e3 5c70e93b80bb4f80e74f80e94c7fe84a7fe9497dea487eea477dea457dea5873e4597be7 446ce83d6ae94579df3f70d7466fe3496ee0c4ccf07aaae879aaeccdc6e8a86e7da86a81 a46e86ac727e9c7081a7788aac778baa6f85ab6d84b1738aaf748aa86d83ab7082a76c7e a86f7eae7483ab717fa76976a96977b3717dad747dbd7084af6478986167a36268b56679 8a637eb1cde58097e37f94e37f91e37989e06d78d45d65c75469d26982d47795d17e9edb 7c9ce985a5f884a9ef80a9dd87acf087acf088adf189aef28aaff38aaff38bb0f48cb1f5 87acf087acf087acf087acf087acf087acf087acf087acf084aaf384aaf383a9f283a9f2 82a8f182a8f182a8f182a8f182a8f182a8f182a8f182a8f182a8f182a8f182a8f182a8f1 82a8f182a8f182a8f182a8f182a8f182a8f182a8f182a8f182a8f182a8f182a8f182a8f1 82a8f182a8f182a8f182a8f182a8f182a8f182a8f182a8f182a8f182a8f182a8f182a8f1 82a8f182a8f182a8f182a8f182a8f182a8f182a8f182a8f182a8f182a8f182a8f182a8f1 82a8f182a8f182a8f182a8f182a8f182a8f182a8f182a8f182a8f182a8f182a8f182a8f1 82a8f182a8f182a8f182a8f182a8f182a8f182a8f182a8f182a8f182a8f182a8f182a8f1 82a8f182a8f182a8f182a8f182a8f182a8f182a8f182a8f182a8f182a8f182a8f182a8f1 82a8f182a8f182a8f182a8f182a8f182a8f182a8f182a8f182a8f182a8f182a8f182a8f1 82a8f182a8f182a8f182a8f182a8f182a8f182a8f182a8f182a8f182a8f182a8f182a8f1 82a8f182a8f182a8f182a8f182a8f182a8f182a8f182a8f182a8f182a8f182a8f182a8f1 82a8f182a8f182a8f182a8f182a8f182a8f182a8f182a8f182a8f182a8f182a8f182a8f1 82a8f182a8f182a8f182a8f182a8f182a8f182a8f182a8f182a8f182a8f182a8f182a8f1 82a8f182a8f182a8f182a8f182a8f182a8f182a8f182a8f182a8f182a8f182a8f182a8f1 82a8f182a8f182a8f182a8f182a8f182a8f182a8f182a8f181a7f081a7f081a7f081a7f0 81a7f081a7f081a7f081a7f081a7f081a7f081a7f081a7f081a7f081a7f081a7f081a7f0 81a7f081a7f081a7f081a7f081a7f081a7f081a7f081a7f081a7f081a7f081a7f081a7f0 81a7f081a7f081a7f081a7f081a7f081a7f081a7f081a7f081a7f081a7f081a7f081a7f0 81a7f081a7f081a7f081a7f081a7f081a7f081a7f081a7f081a7f081a7f081a7f081a7f0 81a7f081a7f081a7f081a7f081a7f081a7f081a7f081a7f081a7f081a7f081a7f081a7f0 81a7f081a7f081a7f081a7f081a7f081a7f081a7f081a7f081a7f081a7f081a7f081a7f0 81a7f081a7f081a7f081a7f081a7f081a7f081a7f081a7f081a7f081a7f081a7f081a7f0 85a8e0a5c3f7c9deffd3e1ffbeccfb9eb2e789a6e281a2e581a7f081a7f081a7f081a7f0 81a7f081a7f081a7f081a7f081a7f081a7f081a7f081a7f081a7f081a7f081a7f081a7f0 81a7f081a7f081a7f081a7f081a7f081a7f081a7f081a7f081a7f081a7f081a7f081a7f0 81a7f081a7f081a7f081a7f081a7f081a7f081a7f081a7f081a7f081a7f081a7f081a7f0 81a7f081a7f081a7f081a7f081a7f081a7f081a7f081a7f081a7f081a7f081a7f081a7f0 81a7f081a7f081a7f081a7f081a7f081a7f081a7f081a7f081a7f081a7f081a7f081a7f0 81a7f081a7f081a7f081a7f081a7f081a7f081a7f081a7f081a7f081a7f081a7f081a7f0 81a7f081a7f081a7f081a7f081a7f081a7f081a7f081a7f081a7f081a7f081a7f081a7f0 81a7f081a7f081a7f081a7f081a7f081a7f081a7f081a7f081a7f081a7f081a7f081a7f0 81a7f081a7f081a7f081a7f081a7f081a7f081a7f081a7f081a7f081a7f081a7f081a7f0 81a7f081a7f081a7f081a7f081a7f081a7f081a7f081a7f081a7f081a7f081a7f081a7f0 81a7f081a7f081a7f081a7f081a7f081a7f081a7f081a7f081a7f081a7f081a7f081a7f0 81a7f081a7f081a7f081a7f081a7f081a7f081a7f081a7f081a7f081a7f081a7f081a7f0 81a7f081a7f081a7f081a7f081a7f081a7f081a7f081a7f081a7f081a7f081a7f081a7f0 81a7f081a7f081a7f081a7f081a7f081a7f081a7f081a7f081a7f081a7f081a7f081a7f0 81a7f081a7f081a7f081a7f081a7f081a7f081a7f081a7f081a7f081a7f081a7f081a7f0 7ea4eb7ca2e97a9fe681a3eb8eaef794b2fb839fe96c88d24774c54774c54774c54774c5 4774c54774c54774c54774c54673c64673c64673c64673c64673c64673c64673c64673c6 4370c54370c54370c54370c54370c54370c54370c54370c5a3c0ff91aef484a1e789a6ec 95b2f88daaf06d8ad04e6bb14875c64875c64875c64875c64875c64875c64875c64875c6 4673c64673c64673c64673c64673c64673c64673c64673c6426fc24673c64875c84370c3 3865b83d6abd5d8add7facff80aaf47ca3e88aa8e6a3b4eaa9a7d69983aa91678b976183 8a697e8a697e8a697e8a697e8a697e8a697e8a697e8a697e95647a95647a95647a95647a 95647a95647a95647a95647a916a7f8f66788c60718d6276926e889c83aaa69accaca9e2 7e9be96f88d8889dec7b87db747bd55b5ebf5c6ed47388db819adc7f9ddd7e9be97f9ff4 7da1eb7da4df7ea7db7ea7db7fa8dc80a9dd81aade82abdf82abdf83ace080a9dd80a9dd 80a9dd80a9dd80a9dd80a9dd80a9dd80a9dd80a9d580a9d57fa8d47fa8d47fa8d47ea7d3 7ea7d37ea7d37ea7d37ea7d37ea7d37ea7d37ea7d37ea7d37ea7d37ea7d37ea7d37ea7d3 7ea7d37ea7d37ea7d37ea7d37ea7d37ea7d37ea7d37ea7d37ea7d37ea7d37ea7d37ea7d3 7ea7d37ea7d37ea7d37ea7d37ea7d37ea7d37ea7d37ea7d37ea7d37ea7d37ea7d37ea7d3 7ea7d37ea7d37ea7d37ea7d37ea7d37ea7d37ea7d37ea7d37ea7d37ea7d37ea7d37ea7d3 7ea7d37ea7d37ea7d37ea7d37ea7d37ea7d37ea7d37ea7d37ea7d37ea7d37ea7d37ea7d3 7ea7d37ea7d37ea7d37ea7d37ea7d37ea7d37ea7d37ea7d37ea7d37ea7d37ea7d37ea7d3 7ea7d37ea7d37ea7d37ea7d37ea7d37ea7d37ea7d37ea7d37ea7d37ea7d37ea7d37ea7d3 7ea7d37ea7d37ea7d37ea7d37ea7d37ea7d37ea7d37ea7d37ea7d37ea7d37ea7d37ea7d3 7ea7d37ea7d37ea7d37ea7d37ea7d37ea7d37ea7d37ea7d37ea7d37ea7d37ea7d37ea7d3 7ea7d37ea7d37ea7d37ea7d37ea7d37ea7d37ea7d37ea7d37ea7d37ea7d37ea7d37ea7d3 7ea7d37ea7d37ea7d37ea7d37ea7d37ea7d37ea7d37ea7d37ea7d37ea7d37ea7d37ea7d3 7ea7d37ea7d37ea7d37ea7d37ea7d37ea7d37ea7d37ea7d37ea7d37ea7d37ea7d37ea7d3 7ea7d37ea7d37ea7d37ea7d37ea7d37ea7d37ea7d37ea7d37ea7d37ea7d37ea7d37ea7d3 7ea7d37ea7d37ea7d37ea7d37ea7d37ea7d37da6d27da6d27da6d27da6d27da6d27da6d2 7da6d27da6d27da6d27da6d27da6d27da6d27da6d27da6d27da6d27da6d27da6d27da6d2 7da6d27da6d27da6d27da6d27da6d27da6d27da6d27da6d27da6d27da6d27da6d27da6d2 7da6d27da6d27da6d27da6d27da6d27da6d27da6d27da6d27da6d27da6d27da6d27da6d2 7da6d27da6d27da6d27da6d27da6d27da6d27da6d27da6d27da6d27da6d27da6d27da6d2 7da6d27da6d27da6d27da6d27da6d27da6d27da6d27da6d27da6d27da6d27da6d27da6d2 7da6d27da6d27da6d27da6d27da6d27da6d27da6d27da6d27da6d27da6d27da6d27da6d2 7da6d27da6d27da6d27da6d27da6d27da6d27da6d27da6d27da6d27da6d27ca7ec87adee 91afed90a8e4869edc7e9bdd7ca0ea80a9f87da6d27da6d27da6d27da6d27da6d27da6d2 7da6d27da6d27da6d27da6d27da6d27da6d27da6d27da6d27da6d27da6d27da6d27da6d2 7da6d27da6d27da6d27da6d27da6d27da6d27da6d27da6d27da6d27da6d27da6d27da6d2 7da6d27da6d27da6d27da6d27da6d27da6d27da6d27da6d27da6d27da6d27da6d27da6d2 7da6d27da6d27da6d27da6d27da6d27da6d27da6d27da6d27da6d27da6d27da6d27da6d2 7da6d27da6d27da6d27da6d27da6d27da6d27da6d27da6d27da6d27da6d27da6d27da6d2 7da6d27da6d27da6d27da6d27da6d27da6d27da6d27da6d27da6d27da6d27da6d27da6d2 7da6d27da6d27da6d27da6d27da6d27da6d27da6d27da6d27da6d27da6d27da6d27da6d2 7da6d27da6d27da6d27da6d27da6d27da6d27da6d27da6d27da6d27da6d27da6d27da6d2 7da6d27da6d27da6d27da6d27da6d27da6d27da6d27da6d27da6d27da6d27da6d27da6d2 7da6d27da6d27da6d27da6d27da6d27da6d27da6d27da6d27da6d27da6d27da6d27da6d2 7da6d27da6d27da6d27da6d27da6d27da6d27da6d27da6d27da6d27da6d27da6d27da6d2 7da6d27da6d27da6d27da6d27da6d27da6d27da6d27da6d27da6d27da6d27da6d27da6d2 7da6d27da6d27da6d27da6d27da6d27da6d27da6d27da6d27da6d27da6d27da6d27da6d2 7da6d27da6d27da6d27da6d27da6d27da6d27da6d27da6d27da6d27da6d27da6d27da6d2 7da6d27da6d27da6d27da6d27da6d27da6d27da6d27da6d27da6d27da6d283add788b2dc 88afda81a6d281a3d08dafdc9ebfeca7c8f5b9cfffb9cfffb9cfffb9cfffb9cfffb9cfff b9cfffb9cfffb8ceffb8ceffb8ceffb8ceffb8ceffb8ceffb8ceffb8ceffb6cbffb6cbff b6cbffb6cbffb6cbffb6cbffb6cbffb6cbff8baed886a9d382a5cf85a8d28fb2dc9ec1eb aacdf7b1d4febad0ffbad0ffbad0ffbad0ffbad0ffbad0ffbad0ffbad0ffb8ceffb8ceff b8ceffb8ceffb8ceffb8ceffb8ceffb8ceffb4cafcb0c6f8b2c8fab8ceffb7cdffafc5f7 a9bff1a8bef086a9df7fa3d582a4d193b1d5a3bbd7b1bdd3c2c5d8d2cfe0cccbebcccbeb cccbebcccbebcccbebcccbebcccbebcccbebc0cee9c0cee9c0cee9c0cee9c0cee9c0cee9 c0cee9c0cee9c6c0e4c9c2e4cec3e3ccc1e3c0b9e2acaedf97a3dd889bdd8099e9738ada 8496e87581d76b72cd5154b55e6ace7686db8397de7a92d87c95e57793e67696e3779adc 7fa4e87fa4e880a5e980a5e981a6ea82a7eb82a7eb82a7eb82a7eb82a7eb82a7eb82a7eb 82a7eb82a7eb82a7eb82a7eb83a1f983a1f982a0f882a0f8819ff7819ff7819ff7819ff7 819ff7819ff7819ff7819ff7819ff7819ff7819ff7819ff7819ff7819ff7819ff7819ff7 819ff7819ff7819ff7819ff7819ff7819ff7819ff7819ff7819ff7819ff7819ff7819ff7 819ff7819ff7819ff7819ff7819ff7819ff7819ff7819ff7819ff7819ff7819ff7819ff7 819ff7819ff7819ff7819ff7819ff7819ff7819ff7819ff7819ff7819ff7819ff7819ff7 819ff7819ff7819ff7819ff7819ff7819ff7819ff7819ff7819ff7819ff7819ff7819ff7 819ff7819ff7819ff7819ff7819ff7819ff7819ff7819ff7819ff7819ff7819ff7819ff7 819ff7819ff7819ff7819ff7819ff7819ff7819ff7819ff7819ff7819ff7819ff7819ff7 819ff7819ff7819ff7819ff7819ff7819ff7819ff7819ff7819ff7819ff7819ff7819ff7 819ff7819ff7819ff7819ff7819ff7819ff7819ff7819ff7819ff7819ff7819ff7819ff7 819ff7819ff7819ff7819ff7819ff7819ff7819ff7819ff7819ff7819ff7819ff7819ff7 819ff7819ff7819ff7819ff7819ff7819ff7819ff7819ff7819ff7819ff7819ff7819ff7 819ff7819ff7819ff7819ff7819ff7819ff7819ff7819ff7819ff7819ff7819ff7819ff7 819ff7819ff7819ff7819ff7819ff7819ff7819ff7819ff7819ff7819ff7819ff7819ff7 819ff7819ff7819ff7819ff7809ef6809ef6809ef6809ef6809ef6809ef6809ef6809ef6 809ef6809ef6809ef6809ef6809ef6809ef6809ef6809ef6809ef6809ef6809ef6809ef6 809ef6809ef6809ef6809ef6809ef6809ef6809ef6809ef6809ef6809ef6809ef6809ef6 809ef6809ef6809ef6809ef6809ef6809ef6809ef6809ef6809ef6809ef6809ef6809ef6 809ef6809ef6809ef6809ef6809ef6809ef6809ef6809ef6809ef6809ef6809ef6809ef6 809ef6809ef6809ef6809ef6809ef6809ef6809ef6809ef6809ef6809ef6809ef6809ef6 809ef6809ef6809ef6809ef6809ef6809ef6809ef6809ef6809ef6809ef6809ef6809ef6 809ef6809ef6809ef6809ef6809ef6809ef6809ef6809ef674a7d676a5d179a3cb7aa0c5 7aa0c779a2ce78a6d777a9de809ef6809ef6809ef6809ef6809ef6809ef6809ef6809ef6 809ef6809ef6809ef6809ef6809ef6809ef6809ef6809ef6809ef6809ef6809ef6809ef6 809ef6809ef6809ef6809ef6809ef6809ef6809ef6809ef6809ef6809ef6809ef6809ef6 809ef6809ef6809ef6809ef6809ef6809ef6809ef6809ef6809ef6809ef6809ef6809ef6 809ef6809ef6809ef6809ef6809ef6809ef6809ef6809ef6809ef6809ef6809ef6809ef6 809ef6809ef6809ef6809ef6809ef6809ef6809ef6809ef6809ef6809ef6809ef6809ef6 809ef6809ef6809ef6809ef6809ef6809ef6809ef6809ef6809ef6809ef6809ef6809ef6 809ef6809ef6809ef6809ef6809ef6809ef6809ef6809ef6809ef6809ef6809ef6809ef6 809ef6809ef6809ef6809ef6809ef6809ef6809ef6809ef6809ef6809ef6809ef6809ef6 809ef6809ef6809ef6809ef6809ef6809ef6809ef6809ef6809ef6809ef6809ef6809ef6 809ef6809ef6809ef6809ef6809ef6809ef6809ef6809ef6809ef6809ef6809ef6809ef6 809ef6809ef6809ef6809ef6809ef6809ef6809ef6809ef6809ef6809ef6809ef6809ef6 809ef6809ef6809ef6809ef6809ef6809ef6809ef6809ef6809ef6809ef6809ef6809ef6 809ef6809ef6809ef6809ef6809ef6809ef6809ef6809ef6809ef6809ef6809ef6809ef6 809ef6809ef6809ef6809ef6809ef6809ef6809ef6809ef6809ef6809ef6809ef6809ef6 809ef6809ef6809ef6809ef6809ef6809ef6809ef6809ef66c8ae07a95ec819cf37a94eb 708ae1758de5829af28ea6fe8996e58996e58996e58996e58996e58996e58996e58996e5 8995e78995e78995e78995e78995e78995e78995e78995e78894e88894e88894e88894e8 8894e88894e88894e88894e87b97eb7e9aee7e9aee7995e97591e57793e7809cf088a4f8 8a97e68a97e68a97e68a97e68a97e68a97e68a97e68a97e68995e78995e78995e78995e7 8995e78995e78995e78995e797a3f58d99eb8793e58d99eb939ff1909cee8692e47e8adc 8294fa7d93f67993f27796f0779bef7ba0f07ea2ee7fa3ed7c95f17c95f17c95f17c95f1 7c95f17c95f17c95f17c95f17f8fef7f8fef7f8fef7f8fef7f8fef7f8fef7f8fef7f8fef 7991f37f93f48897f68c99f78999f97e93fc718ffd6a8bfe7f95e17d90df8696eb808be5 767fde5c60c45660c1727dd77f8fdd7486d0849ae37c94de7d98df829de27593eb7593eb 7593eb7694ec7694ec7795ed7795ed7795ed7896ee7896ee7896ee7896ee7896ee7896ee 7896ee7896ee7991db7991db7991db7890da7890da7890da778fd9778fd97890da7890da 7890da7890da7890da7890da7890da7890da7890da7890da7890da7890da7890da7890da 7890da7890da7890da7890da7890da7890da7890da7890da7890da7890da7890da7890da 7890da7890da7890da7890da7890da7890da7890da7890da7890da7890da7890da7890da 7890da7890da7890da7890da7890da7890da7890da7890da7890da7890da7890da7890da 7890da7890da7890da7890da7890da7890da7890da7890da7890da7890da7890da7890da 7890da7890da7890da7890da7890da7890da7890da7890da7890da7890da7890da7890da 7890da7890da7890da7890da7890da7890da7890da7890da7890da7890da7890da7890da 7890da7890da7890da7890da7890da7890da7890da7890da7890da7890da7890da7890da 7890da7890da7890da7890da7890da7890da7890da7890da7890da7890da7890da7890da 7890da7890da7890da7890da7890da7890da7890da7890da7890da7890da7890da7890da 7890da7890da7890da7890da7890da7890da7890da7890da7890da7890da7890da7890da 7890da7890da7890da7890da7890da7890da7890da7890da7890da7890da7890da7890da 7890da7890da7890da7890da7890da7890da7890da7890da7890da7890da7890da7890da 7890da7890da778fd9778fd9778fd9778fd9778fd9778fd9778fd9778fd9778fd9778fd9 778fd9778fd9778fd9778fd9778fd9778fd9778fd9778fd9778fd9778fd9778fd9778fd9 778fd9778fd9778fd9778fd9778fd9778fd9778fd9778fd9778fd9778fd9778fd9778fd9 778fd9778fd9778fd9778fd9778fd9778fd9778fd9778fd9778fd9778fd9778fd9778fd9 778fd9778fd9778fd9778fd9778fd9778fd9778fd9778fd9778fd9778fd9778fd9778fd9 778fd9778fd9778fd9778fd9778fd9778fd9778fd9778fd9778fd9778fd9778fd9778fd9 778fd9778fd9778fd9778fd9778fd9778fd9778fd9778fd9778fd9778fd9778fd9778fd9 778fd9778fd9778fd9778fd9778fd9778fd96d8df2708ef07890f07c93f17d94f27a92f4 708df16989f0778fd9778fd9778fd9778fd9778fd9778fd9778fd9778fd9778fd9778fd9 778fd9778fd9778fd9778fd9778fd9778fd9778fd9778fd9778fd9778fd9778fd9778fd9 778fd9778fd9778fd9778fd9778fd9778fd9778fd9778fd9778fd9778fd9778fd9778fd9 778fd9778fd9778fd9778fd9778fd9778fd9778fd9778fd9778fd9778fd9778fd9778fd9 778fd9778fd9778fd9778fd9778fd9778fd9778fd9778fd9778fd9778fd9778fd9778fd9 778fd9778fd9778fd9778fd9778fd9778fd9778fd9778fd9778fd9778fd9778fd9778fd9 778fd9778fd9778fd9778fd9778fd9778fd9778fd9778fd9778fd9778fd9778fd9778fd9 778fd9778fd9778fd9778fd9778fd9778fd9778fd9778fd9778fd9778fd9778fd9778fd9 778fd9778fd9778fd9778fd9778fd9778fd9778fd9778fd9778fd9778fd9778fd9778fd9 778fd9778fd9778fd9778fd9778fd9778fd9778fd9778fd9778fd9778fd9778fd9778fd9 778fd9778fd9778fd9778fd9778fd9778fd9778fd9778fd9778fd9778fd9778fd9778fd9 778fd9778fd9778fd9778fd9778fd9778fd9778fd9778fd9778fd9778fd9778fd9778fd9 778fd9778fd9778fd9778fd9778fd9778fd9778fd9778fd9778fd9778fd9778fd9778fd9 778fd9778fd9778fd9778fd9778fd9778fd9778fd9778fd9778fd9778fd9778fd9778fd9 778fd9778fd9778fd9778fd9778fd9778fd9778fd9778fd9778fd9778fd9778fd9778fd9 778fd9778fd9778fd9778fd9778fd9778fd97c92db8197e0869ce5889ee7879de68399e2 7e92db778bd4749bd4749bd4749bd4749bd4749bd4749bd4749bd4749bd4739ad5739ad5 739ad5739ad5739ad5739ad5739ad5739ad5749ad8749ad8749ad8749ad8749ad8749ad8 749ad8749ad87f9adf7d98dd7d98dd809be0839ee37f9adf7691d66d88cd759cd5759cd5 759cd5759cd5759cd5759cd5759cd5759cd5739ad5739ad5739ad5739ad5739ad5739ad5 739ad5739ad56f96d16e95d06b92cd6990cb688fca6c93ce749bd67ba2dd798cd97f95e1 7f99e67898e37599e5759ce76a96df5e8ad57296d27296d27296d27296d27296d27296d2 7296d27296d27b8cd27b8cd27b8cd27b8cd27b8cd27b8cd27b8cd27b8cd26b90d46b8ed0 6c8aca6b87c66d89c86f8cce7192d97195df6c7bc07482cd7180d37481df707adc565bc1 626ccd7883df818de36c7ac38a9ad6798ac07687bd7788c08398d78398d78398d78398d7 8499d88499d88499d88499d88499d88499d88499d88499d88499d88499d88499d88499d8 8691ea8691ea8590e98590e98590e9848fe8848fe8848fe88590e98590e98590e98590e9 8590e98590e98590e98590e98590e98590e98590e98590e98590e98590e98590e98590e9 8590e98590e98590e98590e98590e98590e98590e98590e98590e98590e98590e98590e9 8590e98590e98590e98590e98590e98590e98590e98590e98590e98590e98590e98590e9 8590e98590e98590e98590e98590e98590e98590e98590e98590e98590e98590e98590e9 8590e98590e98590e98590e98590e98590e98590e98590e98590e98590e98590e98590e9 8590e98590e98590e98590e98590e98590e98590e98590e98590e98590e98590e98590e9 8590e98590e98590e98590e98590e98590e98590e98590e98590e98590e98590e98590e9 8590e98590e98590e98590e98590e98590e98590e98590e98590e98590e98590e98590e9 8590e98590e98590e98590e98590e98590e98590e98590e98590e98590e98590e98590e9 8590e98590e98590e98590e98590e98590e98590e98590e98590e98590e98590e98590e9 8590e98590e98590e98590e98590e98590e98590e98590e98590e98590e98590e98590e9 8590e98590e98590e98590e98590e98590e98590e98590e98590e98590e98590e98590e9 8590e98590e98590e98590e98590e98590e98590e98590e98590e98590e98590e98590e9 848fe8848fe8848fe8848fe8848fe8848fe8848fe8848fe8848fe8848fe8848fe8848fe8 848fe8848fe8848fe8848fe8848fe8848fe8848fe8848fe8848fe8848fe8848fe8848fe8 848fe8848fe8848fe8848fe8848fe8848fe8848fe8848fe8848fe8848fe8848fe8848fe8 848fe8848fe8848fe8848fe8848fe8848fe8848fe8848fe8848fe8848fe8848fe8848fe8 848fe8848fe8848fe8848fe8848fe8848fe8848fe8848fe8848fe8848fe8848fe8848fe8 848fe8848fe8848fe8848fe8848fe8848fe8848fe8848fe8848fe8848fe8848fe8848fe8 848fe8848fe8848fe8848fe8848fe8848fe8848fe8848fe8848fe8848fe8848fe8848fe8 848fe8848fe8848fe8848fe88996e58994e38992df8890db868ed9868fda8692de8895e3 848fe8848fe8848fe8848fe8848fe8848fe8848fe8848fe8848fe8848fe8848fe8848fe8 848fe8848fe8848fe8848fe8848fe8848fe8848fe8848fe8848fe8848fe8848fe8848fe8 848fe8848fe8848fe8848fe8848fe8848fe8848fe8848fe8848fe8848fe8848fe8848fe8 848fe8848fe8848fe8848fe8848fe8848fe8848fe8848fe8848fe8848fe8848fe8848fe8 848fe8848fe8848fe8848fe8848fe8848fe8848fe8848fe8848fe8848fe8848fe8848fe8 848fe8848fe8848fe8848fe8848fe8848fe8848fe8848fe8848fe8848fe8848fe8848fe8 848fe8848fe8848fe8848fe8848fe8848fe8848fe8848fe8848fe8848fe8848fe8848fe8 848fe8848fe8848fe8848fe8848fe8848fe8848fe8848fe8848fe8848fe8848fe8848fe8 848fe8848fe8848fe8848fe8848fe8848fe8848fe8848fe8848fe8848fe8848fe8848fe8 848fe8848fe8848fe8848fe8848fe8848fe8848fe8848fe8848fe8848fe8848fe8848fe8 848fe8848fe8848fe8848fe8848fe8848fe8848fe8848fe8848fe8848fe8848fe8848fe8 848fe8848fe8848fe8848fe8848fe8848fe8848fe8848fe8848fe8848fe8848fe8848fe8 848fe8848fe8848fe8848fe8848fe8848fe8848fe8848fe8848fe8848fe8848fe8848fe8 848fe8848fe8848fe8848fe8848fe8848fe8848fe8848fe8848fe8848fe8848fe8848fe8 848fe8848fe8848fe8848fe8848fe8848fe8848fe8848fe8848fe8848fe8848fe8848fe8 848fe8848fe8848fe8848fe88690e7808ae17c86dd7f89e0848ee58690e7838fe57f8be1 768fe1768fe1768fe1768fe1768fe1768fe1768fe1768fe1768fe3768fe3768fe3768fe3 768fe3768fe3768fe3768fe37790e47790e47790e47790e47790e47790e47790e47790e4 8594e97d8ce17786db7988dd8291e68897ec8695ea8190e57790e27790e27790e27790e2 7790e27790e27790e27790e2768fe3768fe3768fe3768fe3768fe3768fe3768fe3768fe3 758ee27d96ea849df1839cf07d96ea7a93e77b94e87e97eb798cd87f91dd7d8ede7685d8 7987df8592ee8796f3808fee7d8ad87d8ad87d8ad87d8ad87d8ad87d8ad87d8ad87d8ad8 718eda718eda718eda718eda718eda718eda718eda718eda8192e48291e2848fdf868ddd 848ad88186d77d84d57b81d58b95ca919bd9707bca6e7bd76672d84d54be4f5fbe6b79da 848fe98693d9d7e4ffe1edffedf7fff6fcffdff1f5dff1f5e0f2f6e0f2f6e0f2f6e0f2f6 e0f2f6e0f2f6dff1f5dff1f5dff1f5dff1f5dff1f5dff1f5dff1f5dff1f5e4f4eae4f4ea e4f4eae3f3e9e3f3e9e3f3e9e2f2e8e2f2e8e4f4eae4f4eae4f4eae4f4eae4f4eae4f4ea e4f4eae4f4eae4f4eae4f4eae4f4eae4f4eae4f4eae4f4eae4f4eae4f4eae4f4eae4f4ea e4f4eae4f4eae4f4eae4f4eae4f4eae4f4eae4f4eae4f4eae4f4eae4f4eae4f4eae4f4ea e4f4eae4f4eae4f4eae4f4eae4f4eae4f4eae4f4eae4f4eae4f4eae4f4eae4f4eae4f4ea e4f4eae4f4eae4f4eae4f4eae4f4eae4f4eae4f4eae4f4eae4f4eae4f4eae4f4eae4f4ea e4f4eae4f4eae4f4eae4f4eae4f4eae4f4eae4f4eae4f4eae4f4eae4f4eae4f4eae4f4ea e4f4eae4f4eae4f4eae4f4eae4f4eae4f4eae4f4eae4f4eae4f4eae4f4eae4f4eae4f4ea e4f4eae4f4eae4f4eae4f4eae4f4eae4f4eae4f4eae4f4eae4f4eae4f4eae4f4eae4f4ea e4f4eae4f4eae4f4eae4f4eae4f4eae4f4eae4f4eae4f4eae4f4eae4f4eae4f4eae4f4ea e4f4eae4f4eae4f4eae4f4eae4f4eae4f4eae4f4eae4f4eae4f4eae4f4eae4f4eae4f4ea e4f4eae4f4eae4f4eae4f4eae4f4eae4f4eae4f4eae4f4eae4f4eae4f4eae4f4eae4f4ea e4f4eae4f4eae4f4eae4f4eae4f4eae4f4eae4f4eae4f4eae4f4eae4f4eae4f4eae4f4ea e4f4eae4f4eae4f4eae4f4eae4f4eae4f4eae4f4eae4f4eae4f4eae4f4eae4f4eae4f4ea e4f4eae4f4eae4f4eae4f4eae4f4eae4f4eae4f4eae4f4eae4f4eae4f4eae3f3e9e3f3e9 e3f3e9e3f3e9e3f3e9e3f3e9e3f3e9e3f3e9e3f3e9e3f3e9e3f3e9e3f3e9e3f3e9e3f3e9 e3f3e9e3f3e9e3f3e9e3f3e9e3f3e9e3f3e9e3f3e9e3f3e9e3f3e9e3f3e9e3f3e9e3f3e9 e3f3e9e3f3e9e3f3e9e3f3e9e3f3e9e3f3e9e3f3e9e3f3e9e3f3e9e3f3e9e3f3e9e3f3e9 e3f3e9e3f3e9e3f3e9e3f3e9e3f3e9e3f3e9e3f3e9e3f3e9e3f3e9e3f3e9e3f3e9e3f3e9 e3f3e9e3f3e9e3f3e9e3f3e9e3f3e9e3f3e9e3f3e9e3f3e9e3f3e9e3f3e9e3f3e9e3f3e9 e3f3e9e3f3e9e3f3e9e3f3e9e3f3e9e3f3e9e3f3e9e3f3e9e3f3e9e3f3e9e3f3e9e3f3e9 e3f3e9e3f3e9e3f3e9e3f3e9e3f3e9e3f3e9e3f3e9e3f3e9e3f3e9e3f3e9e3f3e9e3f3e9 e3f3e9e3f3e9e5ebe7e7eee7e9f0e8e8ede6e6ece2e5ede2e9f1e6edf5eae3f3e9e3f3e9 e3f3e9e3f3e9e3f3e9e3f3e9e3f3e9e3f3e9e3f3e9e3f3e9e3f3e9e3f3e9e3f3e9e3f3e9 e3f3e9e3f3e9e3f3e9e3f3e9e3f3e9e3f3e9e3f3e9e3f3e9e3f3e9e3f3e9e3f3e9e3f3e9 e3f3e9e3f3e9e3f3e9e3f3e9e3f3e9e3f3e9e3f3e9e3f3e9e3f3e9e3f3e9e3f3e9e3f3e9 e3f3e9e3f3e9e3f3e9e3f3e9e3f3e9e3f3e9e3f3e9e3f3e9e3f3e9e3f3e9e3f3e9e3f3e9 e3f3e9e3f3e9e3f3e9e3f3e9e3f3e9e3f3e9e3f3e9e3f3e9e3f3e9e3f3e9e3f3e9e3f3e9 e3f3e9e3f3e9e3f3e9e3f3e9e3f3e9e3f3e9e3f3e9e3f3e9e3f3e9e3f3e9e3f3e9e3f3e9 e3f3e9e3f3e9e3f3e9e3f3e9e3f3e9e3f3e9e3f3e9e3f3e9e3f3e9e3f3e9e3f3e9e3f3e9 e3f3e9e3f3e9e3f3e9e3f3e9e3f3e9e3f3e9e3f3e9e3f3e9e3f3e9e3f3e9e3f3e9e3f3e9 e3f3e9e3f3e9e3f3e9e3f3e9e3f3e9e3f3e9e3f3e9e3f3e9e3f3e9e3f3e9e3f3e9e3f3e9 e3f3e9e3f3e9e3f3e9e3f3e9e3f3e9e3f3e9e3f3e9e3f3e9e3f3e9e3f3e9e3f3e9e3f3e9 e3f3e9e3f3e9e3f3e9e3f3e9e3f3e9e3f3e9e3f3e9e3f3e9e3f3e9e3f3e9e3f3e9e3f3e9 e3f3e9e3f3e9e3f3e9e3f3e9e3f3e9e3f3e9e3f3e9e3f3e9e3f3e9e3f3e9e3f3e9e3f3e9 e3f3e9e3f3e9e3f3e9e3f3e9e3f3e9e3f3e9e3f3e9e3f3e9e3f3e9e3f3e9e3f3e9e3f3e9 e3f3e9e3f3e9e3f3e9e3f3e9e3f3e9e3f3e9e3f3e9e3f3e9e3f3e9e3f3e9e3f3e9e3f3e9 e3f3e9e3f3e9e3f3e9e3f3e9e3f3e9e3f3e9e3f3e9e3f3e9e3f3e9e3f3e9e3f3e9e3f3e9 e3f3e9e3f3e9e8f4eae7f3e9e6f3e9e7f4eae2f2e7dfefe4e2f4e8e9fbeff1eff2f1eff2 f1eff2f1eff2f1eff2f1eff2f1eff2f1eff2f2f0f5f2f0f5f2f0f5f2f0f5f2f0f5f2f0f5 f2f0f5f2f0f5f3f1f4f3f1f4f3f1f4f3f1f4f3f1f4f3f1f4f3f1f4f3f1f4ecfcf2ecfcf2 ebfbf1e6f6ece1f1e7dfefe5e2f2e8e6f6ecf2f0f3f2f0f3f2f0f3f2f0f3f2f0f3f2f0f3 f2f0f3f2f0f3f2f0f5f2f0f5f2f0f5f2f0f5f2f0f5f2f0f5f2f0f5f2f0f5eceaefeeecf1 eeecf1edebf0efedf2f0eef3eae8ede2e0e5e5ffe6e9ffe9e8f9e6e3eedee5ebe1ecf1ea ecf1ebe6ebe5eef1f8eef1f8eef1f8eef1f8eef1f8eef1f8eef1f8eef1f8ecf3fbecf3fb ecf3fbecf3fbecf3fbecf3fbecf3fbecf3fbe4ebf3e7ebf4e9ecf5ededf5efeef6f1eef7 f1eef7f1eef7d9defed2daff8892d77886de6975db5058c35a71cf7082e67f8cea808bc9 dee9ffe5ebe9ebebe9eae7f0eef2e3eef2e3eef2e3edf1e2edf1e2edf1e2edf1e2edf1e2 edf1e2edf1e2edf1e2edf1e2edf1e2edf1e2edf1e2edf1e2f0f2f1eff1f0eff1f0eff1f0 eef0efeef0efeef0efedefeeeff1f0eff1f0eff1f0eff1f0eff1f0eff1f0eff1f0eff1f0 eff1f0eff1f0eff1f0eff1f0eff1f0eff1f0eff1f0eff1f0eff1f0eff1f0eff1f0eff1f0 eff1f0eff1f0eff1f0eff1f0eff1f0eff1f0eff1f0eff1f0eff1f0eff1f0eff1f0eff1f0 eff1f0eff1f0eff1f0eff1f0eff1f0eff1f0eff1f0eff1f0eff1f0eff1f0eff1f0eff1f0 eff1f0eff1f0eff1f0eff1f0eff1f0eff1f0eff1f0eff1f0eff1f0eff1f0eff1f0eff1f0 eff1f0eff1f0eff1f0eff1f0eff1f0eff1f0eff1f0eff1f0eff1f0eff1f0eff1f0eff1f0 eff1f0eff1f0eff1f0eff1f0eff1f0eff1f0eff1f0eff1f0eff1f0eff1f0eff1f0eff1f0 eff1f0eff1f0eff1f0eff1f0eff1f0eff1f0eff1f0eff1f0eff1f0eff1f0eff1f0eff1f0 eff1f0eff1f0eff1f0eff1f0eff1f0eff1f0eff1f0eff1f0eff1f0eff1f0eff1f0eff1f0 eff1f0eff1f0eff1f0eff1f0eff1f0eff1f0eff1f0eff1f0eff1f0eff1f0eff1f0eff1f0 eff1f0eff1f0eff1f0eff1f0eff1f0eff1f0eff1f0eff1f0eff1f0eff1f0eff1f0eff1f0 eff1f0eff1f0eff1f0eff1f0eff1f0eff1f0eff1f0eff1f0eff1f0eff1f0eff1f0eff1f0 eff1f0eff1f0eff1f0eff1f0eff1f0eff1f0eff1f0eff1f0eff1f0eff1f0eff1f0eff1f0 eff1f0eff1f0eff1f0eff1f0eff1f0eff1f0eff1f0eff1f0eef0efeef0efeef0efeef0ef eef0efeef0efeef0efeef0efeef0efeef0efeef0efeef0efeef0efeef0efeef0efeef0ef eef0efeef0efeef0efeef0efeef0efeef0efeef0efeef0efeef0efeef0efeef0efeef0ef eef0efeef0efeef0efeef0efeef0efeef0efeef0efeef0efeef0efeef0efeef0efeef0ef eef0efeef0efeef0efeef0efeef0efeef0efeef0efeef0efeef0efeef0efeef0efeef0ef eef0efeef0efeef0efeef0efeef0efeef0efeef0efeef0efeef0efeef0efeef0efeef0ef eef0efeef0efeef0efeef0efeef0efeef0efeef0efeef0efeef0efeef0efeef0efeef0ef eef0efeef0efeef0efeef0efeef0efeef0efeef0efeef0efeef0efeef0efeef0efeef0ef eae7f0edeaf3f1f0f6f5f4faf4f3f8f2f2f4f0eeefefeeeceef0efeef0efeef0efeef0ef eef0efeef0efeef0efeef0efeef0efeef0efeef0efeef0efeef0efeef0efeef0efeef0ef eef0efeef0efeef0efeef0efeef0efeef0efeef0efeef0efeef0efeef0efeef0efeef0ef eef0efeef0efeef0efeef0efeef0efeef0efeef0efeef0efeef0efeef0efeef0efeef0ef eef0efeef0efeef0efeef0efeef0efeef0efeef0efeef0efeef0efeef0efeef0efeef0ef eef0efeef0efeef0efeef0efeef0efeef0efeef0efeef0efeef0efeef0efeef0efeef0ef eef0efeef0efeef0efeef0efeef0efeef0efeef0efeef0efeef0efeef0efeef0efeef0ef eef0efeef0efeef0efeef0efeef0efeef0efeef0efeef0efeef0efeef0efeef0efeef0ef eef0efeef0efeef0efeef0efeef0efeef0efeef0efeef0efeef0efeef0efeef0efeef0ef eef0efeef0efeef0efeef0efeef0efeef0efeef0efeef0efeef0efeef0efeef0efeef0ef eef0efeef0efeef0efeef0efeef0efeef0efeef0efeef0efeef0efeef0efeef0efeef0ef eef0efeef0efeef0efeef0efeef0efeef0efeef0efeef0efeef0efeef0efeef0efeef0ef eef0efeef0efeef0efeef0efeef0efeef0efeef0efeef0efeef0efeef0efeef0efeef0ef eef0efeef0efeef0efeef0efeef0efeef0efeef0efeef0efeef0efeef0efeef0efeef0ef eef0efeef0efeef0efeef0efeef0efeef0efeef0efeef0efeef0efeef0efeef0efeef0ef eef0efeef0efeef0efeef0efeef0efeef0efeef0efeef0efeef0efeef0efeef0efeef0ef eeedebefeeecf3f3f1f5f7f4eef3efe4e9e5e1e7e3e6ece8f2e5ecf2e5ecf2e5ecf2e5ec f2e5ecf2e5ecf2e5ecf2e5ecf3e6eff3e6eff3e6eff3e6eff3e6eff3e6eff3e6eff3e6ef f3e7ebf3e7ebf3e7ebf3e7ebf3e7ebf3e7ebf3e7ebf3e7ebe1e1e1e9e9e9f2f2f2f3f3f3 efefefebebebecececeeeeeef3e6edf3e6edf3e6edf3e6edf3e6edf3e6edf3e6edf3e6ed f3e6eff3e6eff3e6eff3e6eff3e6eff3e6eff3e6eff3e6effceff8faedf6f3e6efefe2eb f4e7f0fceff8fdf0f9f8ebf4dfe9e1e4e9e3ecebe7f2edeaf4eeeef3efeeececeae6e8e5 ece8f6ece8f6ece8f6ece8f6ece8f6ece8f6ece8f6ece8f6fae1f4fae1f4fae1f4fae1f4 fae1f4fae1f4fae1f4fae1f4f8f7fff5f3fef0eef9eceaf7ebe9f6ece8f6f1ebf7f3ebf8 f5f7ffeaefff8590c87281d46370d64c54bf5872d1687ee47887e67c86c1eaf2fdf4f7e4 f8f5e2f6ede6f4eaf2f4eaf2f4eaf2f4eaf2f3e9f1f3e9f1f3e9f1f3e9f1f3e9f1f3e9f1 f3e9f1f3e9f1f3e9f1f3e9f1f3e9f1f3e9f1f1eaf1f1eaf1f1eaf1f1eaf1f0e9f0f0e9f0 efe8efefe8eff1eaf1f1eaf1f1eaf1f1eaf1f1eaf1f1eaf1f1eaf1f1eaf1f1eaf1f1eaf1 f1eaf1f1eaf1f1eaf1f1eaf1f1eaf1f1eaf1f1eaf1f1eaf1f1eaf1f1eaf1f1eaf1f1eaf1 f1eaf1f1eaf1f1eaf1f1eaf1f1eaf1f1eaf1f1eaf1f1eaf1f1eaf1f1eaf1f1eaf1f1eaf1 f1eaf1f1eaf1f1eaf1f1eaf1f1eaf1f1eaf1f1eaf1f1eaf1f1eaf1f1eaf1f1eaf1f1eaf1 f1eaf1f1eaf1f1eaf1f1eaf1f1eaf1f1eaf1f1eaf1f1eaf1f1eaf1f1eaf1f1eaf1f1eaf1 f1eaf1f1eaf1f1eaf1f1eaf1f1eaf1f1eaf1f1eaf1f1eaf1f1eaf1f1eaf1f1eaf1f1eaf1 f1eaf1f1eaf1f1eaf1f1eaf1f1eaf1f1eaf1f1eaf1f1eaf1f1eaf1f1eaf1f1eaf1f1eaf1 f1eaf1f1eaf1f1eaf1f1eaf1f1eaf1f1eaf1f1eaf1f1eaf1f1eaf1f1eaf1f1eaf1f1eaf1 f1eaf1f1eaf1f1eaf1f1eaf1f1eaf1f1eaf1f1eaf1f1eaf1f1eaf1f1eaf1f1eaf1f1eaf1 f1eaf1f1eaf1f1eaf1f1eaf1f1eaf1f1eaf1f1eaf1f1eaf1f1eaf1f1eaf1f1eaf1f1eaf1 f1eaf1f1eaf1f1eaf1f1eaf1f1eaf1f1eaf1f1eaf1f1eaf1f1eaf1f1eaf1f1eaf1f1eaf1 f1eaf1f1eaf1f1eaf1f1eaf1f1eaf1f1eaf1f1eaf1f1eaf1f1eaf1f1eaf1f1eaf1f1eaf1 f1eaf1f1eaf1f1eaf1f1eaf1f1eaf1f1eaf1f1eaf1f1eaf1f1eaf1f1eaf1f1eaf1f1eaf1 f1eaf1f1eaf1f1eaf1f1eaf1f1eaf1f1eaf1f0e9f0f0e9f0f0e9f0f0e9f0f0e9f0f0e9f0 f0e9f0f0e9f0f0e9f0f0e9f0f0e9f0f0e9f0f0e9f0f0e9f0f0e9f0f0e9f0f0e9f0f0e9f0 f0e9f0f0e9f0f0e9f0f0e9f0f0e9f0f0e9f0f0e9f0f0e9f0f0e9f0f0e9f0f0e9f0f0e9f0 f0e9f0f0e9f0f0e9f0f0e9f0f0e9f0f0e9f0f0e9f0f0e9f0f0e9f0f0e9f0f0e9f0f0e9f0 f0e9f0f0e9f0f0e9f0f0e9f0f0e9f0f0e9f0f0e9f0f0e9f0f0e9f0f0e9f0f0e9f0f0e9f0 f0e9f0f0e9f0f0e9f0f0e9f0f0e9f0f0e9f0f0e9f0f0e9f0f0e9f0f0e9f0f0e9f0f0e9f0 f0e9f0f0e9f0f0e9f0f0e9f0f0e9f0f0e9f0f0e9f0f0e9f0f0e9f0f0e9f0f0e9f0f0e9f0 f0e9f0f0e9f0f0e9f0f0e9f0f0e9f0f0e9f0f0e9f0f0e9f0f0e9f0f0e9f0f6f5f3f1f0ee ebebe9e9ebe8ebede8eff0e8f0f0e4eff0e2f0e9f0f0e9f0f0e9f0f0e9f0f0e9f0f0e9f0 f0e9f0f0e9f0f0e9f0f0e9f0f0e9f0f0e9f0f0e9f0f0e9f0f0e9f0f0e9f0f0e9f0f0e9f0 f0e9f0f0e9f0f0e9f0f0e9f0f0e9f0f0e9f0f0e9f0f0e9f0f0e9f0f0e9f0f0e9f0f0e9f0 f0e9f0f0e9f0f0e9f0f0e9f0f0e9f0f0e9f0f0e9f0f0e9f0f0e9f0f0e9f0f0e9f0f0e9f0 f0e9f0f0e9f0f0e9f0f0e9f0f0e9f0f0e9f0f0e9f0f0e9f0f0e9f0f0e9f0f0e9f0f0e9f0 f0e9f0f0e9f0f0e9f0f0e9f0f0e9f0f0e9f0f0e9f0f0e9f0f0e9f0f0e9f0f0e9f0f0e9f0 f0e9f0f0e9f0f0e9f0f0e9f0f0e9f0f0e9f0f0e9f0f0e9f0f0e9f0f0e9f0f0e9f0f0e9f0 f0e9f0f0e9f0f0e9f0f0e9f0f0e9f0f0e9f0f0e9f0f0e9f0f0e9f0f0e9f0f0e9f0f0e9f0 f0e9f0f0e9f0f0e9f0f0e9f0f0e9f0f0e9f0f0e9f0f0e9f0f0e9f0f0e9f0f0e9f0f0e9f0 f0e9f0f0e9f0f0e9f0f0e9f0f0e9f0f0e9f0f0e9f0f0e9f0f0e9f0f0e9f0f0e9f0f0e9f0 f0e9f0f0e9f0f0e9f0f0e9f0f0e9f0f0e9f0f0e9f0f0e9f0f0e9f0f0e9f0f0e9f0f0e9f0 f0e9f0f0e9f0f0e9f0f0e9f0f0e9f0f0e9f0f0e9f0f0e9f0f0e9f0f0e9f0f0e9f0f0e9f0 f0e9f0f0e9f0f0e9f0f0e9f0f0e9f0f0e9f0f0e9f0f0e9f0f0e9f0f0e9f0f0e9f0f0e9f0 f0e9f0f0e9f0f0e9f0f0e9f0f0e9f0f0e9f0f0e9f0f0e9f0f0e9f0f0e9f0f0e9f0f0e9f0 f0e9f0f0e9f0f0e9f0f0e9f0f0e9f0f0e9f0f0e9f0f0e9f0f0e9f0f0e9f0f0e9f0f0e9f0 f0e9f0f0e9f0f0e9f0f0e9f0f0e9f0f0e9f0f0e9f0f0e9f0f0e9f0f0e9f0fef3f7f2e9ec e9e3e5eeeaebf2f0f1f0f0f0eeeeeeeff1f0e8f3ede8f3ede8f3ede8f3ede8f3ede8f3ed e8f3ede8f3ede9f4f0e9f4f0e9f4f0e9f4f0e9f4f0e9f4f0e9f4f0e9f4f0e9f4ece9f4ec e9f4ece9f4ece9f4ece9f4ece9f4ece9f4ecfaf0f8f5ebf3f2e8f0f2e8f0f4eaf2f6ecf4 f4eaf2f1e7efe9f4eee9f4eee9f4eee9f4eee9f4eee9f4eee9f4eee9f4eee9f4f0e9f4f0 e9f4f0e9f4f0e9f4f0e9f4f0e9f4f0e9f4f0dfeae6e8f3efecf7f3e6f1ede1ece8e3eeea e5f0ece4efebfcf1fff8ecf8f6e8f5f8ebf5f7edf6efeef3e8f1f0e5f4f1edf0e5edf0e5 edf0e5edf0e5edf0e5edf0e5edf0e5edf0e5e5f6e3e5f6e3e5f6e3e5f6e3e5f6e3e5f6e3 e5f6e3e5f6e3e5ecdae7f0dfecf4e5edf8eaedf8eaedf5e8eaf0e4e9eddfeef0efe6ebfe 7d89b97282d06777d9515cc85f66ce6d80dc758fdc7988e7e5f2e0f1ecf2f2eceeedecea eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee9eee8ebf0eaeaefe9f4f6f3 e8eae9f6f8f7eaeaeceeeef0eeebf2eeebf2eeebf2eeebf2eeebf2eeebf2eeebf2eeebf2 eeebf2eeebf2eeebf2eeebf2eeebf2eeebf2eeebf2eeebf2eeebf2eeebf2eeebf2eeebf2 eeebf2eeebf2eeebf2eeebf2eeebf2eeebf2eeebf2eeebf2eeebf2eeebf2eeebf2eeebf2 eeebf2eeebf2eeebf2eeebf2eeebf2eeebf2eeebf2eeebf2eeebf2eeebf2eeebf2eeebf2 eeebf2eeebf2eeebf2eeebf2eeebf2eeebf2eeebf2eeebf2eeebf2eeebf2eeebf2eeebf2 eeebf2eeebf2eeebf2eeebf2eeebf2eeebf2eeebf2eeebf2eeebf2eeebf2eeebf2eeebf2 eeebf2eeebf2eeebf2eeebf2eeebf2eeebf2eeebf2eeebf2eeebf2eeebf2eeebf2eeebf2 eeebf2eeebf2eeebf2eeebf2eeebf2eeebf2eeebf2eeebf2eeebf2eeebf2eeebf2eeebf2 eeebf2eeebf2eeebf2eeebf2eeebf2eeebf2eeebf2eeebf2eeebf2eeebf2eeebf2eeebf2 eeebf2eeebf2eeebf2eeebf2eeebf2eeebf2eeebf2eeebf2eeebf2eeebf2eeebf2eeebf2 eeebf2eeebf2eeebf2eeebf2eeebf2eeebf2eeebf2eeebf2eeebf2eeebf2eeebf2eeebf2 eeebf2eeebf2eeebf2eeebf2eeebf2eeebf2eeebf2eeebf2eeebf2eeebf2eeebf2eeebf2 eeebf2eeebf2eeebf2eeebf2eeebf2eeebf2eeebf2eeebf2eeebf2eeebf2eeebf2eeebf2 eeebf2eeebf2eeebf2eeebf2eeebf2eeebf2eeebf2eeebf2eeebf2eeebf2eeebf2eeebf2 eeebf2eeebf2eeebf2eeebf2eeebf2eeebf2eeebf2eeebf2eeebf2eeebf2eeebf2eeebf2 eeebf2eeebf2eeebf2eeebf2eeebf2eeebf2eeebf2eeebf2eeebf2eeebf2eeebf2eeebf2 eeebf2eeebf2eeebf2eeebf2eeebf2eeebf2eeebf2eeebf2eeebf2eeebf2eeebf2eeebf2 eeebf2eeebf2eeebf2eeebf2eeebf2eeebf2eeebf2eeebf2eeebf2eeebf2eeebf2eeebf2 eeebf2eeebf2eeebf2eeebf2e7e6e4f3f2f0ecebe9f9f8f6e5e4e2f0efedf2f1efecebe9 eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee f0f0f0f4f4f4e4e4e4fafafae6e5e3ede9e6e8e3dff8f1ebecedf1ecedf1ecedf1ecedf1 ecedf1ecedf1ecedf1ecedf1ebe8efede8eef4eff5eee8eceee9efefecf3efeef6ededf5 efeeecefeeecefeeecefeeecefeeecefeeecefeeecefeeece5e4dff4f3eeeeede8eeede8 f1f0ebf0efeaeeede8f0efeaf3f7f6eceeede8eae9ecececf6f6f6e9e7e8f3f1f2efedee edeef0edeef0edeef0edeef0edeef0edeef0edeef0edeef0edeef0edeef0edeef0edeef0 edeef0edeef0edeef0edeef0edeef0edeef0edeef0edeef0edeef0edeef0edeef0edeef0 edeef0edeef0edeef0edeef0edeef0edeef0edeef0edeef0edeef0edeef0edeef0edeef0 edeef0edeef0edeef0edeef0edeef0edeef0edeef0edeef0edeef0edeef0edeef0edeef0 edeef0f5f6f8dfe0e2fafbfdecedefe8e9ebf8f9fbebeceeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeef2eaf7e7f4e37b87db7280e3 6e77c45450c85f66ce6d80dc758fdc7988e7e5f2e0f1ecf2f2eceeedeceaeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeef2f7f1f0f5efebedeae8eae7dbdddce8e9eb eff0f2f0f1f3ededebededebededebededebededebededebededebededebededebededeb ededebededebededebededebededebededebededebededebededebededebededebededeb ededebededebededebededebededebededebededebededebededebededebededebededeb ededebededebededebededebededebededebededebededebededebededebededebededeb ededebededebededebededebededebededebededebededebededebededebededebededeb ededebededebededebededebededebededebededebededebededebededebededebededeb ededebededebededebededebededebededebededebededebededebededebededebededeb ededebededebededebededebededebededebededebededebededebededebededebededeb ededebededebededebededebededebededebededebededebededebededebededebededeb ededebededebededebededebededebededebededebededebededebededebededebededeb ededebededebededebededebededebededebededebededebededebededebededebededeb ededebededebededebededebededebededebededebededebededebededebededebededeb ededebededebededebededebededebededebededebededebededebededebededebededeb ededebededebededebededebededebededebededebededebededebededebededebededeb ededebededebededebededebededebededebededebededebededebededebededebededeb ededebededebededebededebededebededebededebededebededebededebededebededeb ededebededebededebededebededebededebededebededebededebededebededebededeb ededebededebededebededebededebededebededebededebededebededebededebededeb ededebededebefefeff1f1f1e8e8e8f3f3f3f3f3f3f7f7f7efefefe6e6e6eeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6e6e6f1f1f1 e5e5e5f8f8f8efefeffaf9f7f6f2eff4f0edf5efeff5efeff5efeff5efeff5efeff5efef f5efeff5efeff0f0eeececeaf8f7f3f1f0ecedece8f5f5f3f4f4f4eff1f0ecececececec ececececececececececececececececececf4f4f2f9f9f7eaeae8eaeae8f1f1eff1f1ef f3f3f1f0f0eee0e2dfe5e7e6edefeef9fafce6e7ebe9ecf1f3f6fbedf0f7eaedf2eaedf2 eaedf2eaedf2eaedf2eaedf2eaedf2eaedf2eaedf2eaedf2eaedf2eaedf2eaedf2eaedf2 eaedf2eaedf2eaedf2eaedf2eaedf2eaedf2eaedf2eaedf2eaedf2eaedf2eaedf2eaedf2 eaedf2eaedf2eaedf2eaedf2eaedf2eaedf2eaedf2eaedf2eaedf2eaedf2eaedf2eaedf2 eaedf2eaedf2eaedf2eaedf2eaedf2eaedf2eaedf2eaedf2eaedf2eaedf2e7eaeff1f4f9 e4e7ecf5f8fde8ebf0e1e4e9dde0e5eff2f7eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeef2eaf7e7f4e37b87db7280e36e77c45450c8 5f66ce6d80dc758fdc7988e7e5f2e0f1ecf2f2eceeedeceaeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeedfe1dce9ebe8f5f7f4fafcfbf3f4f6f0f1f3f7f8fce5e6ea eff0e8eff0e8eff0e8eff0e8eff0e8eff0e8eff0e8eff0e8eff0e8eff0e8eff0e8eff0e8 eff0e8eff0e8eff0e8eff0e8eff0e8eff0e8eff0e8eff0e8eff0e8eff0e8eff0e8eff0e8 eff0e8eff0e8eff0e8eff0e8eff0e8eff0e8eff0e8eff0e8eff0e8eff0e8eff0e8eff0e8 eff0e8eff0e8eff0e8eff0e8eff0e8eff0e8eff0e8eff0e8eff0e8eff0e8eff0e8eff0e8 eff0e8eff0e8eff0e8eff0e8eff0e8eff0e8eff0e8eff0e8eff0e8eff0e8eff0e8eff0e8 eff0e8eff0e8eff0e8eff0e8eff0e8eff0e8eff0e8eff0e8eff0e8eff0e8eff0e8eff0e8 eff0e8eff0e8eff0e8eff0e8eff0e8eff0e8eff0e8eff0e8eff0e8eff0e8eff0e8eff0e8 eff0e8eff0e8eff0e8eff0e8eff0e8eff0e8eff0e8eff0e8eff0e8eff0e8eff0e8eff0e8 eff0e8eff0e8eff0e8eff0e8eff0e8eff0e8eff0e8eff0e8eff0e8eff0e8eff0e8eff0e8 eff0e8eff0e8eff0e8eff0e8eff0e8eff0e8eff0e8eff0e8eff0e8eff0e8eff0e8eff0e8 eff0e8eff0e8eff0e8eff0e8eff0e8eff0e8eff0e8eff0e8eff0e8eff0e8eff0e8eff0e8 eff0e8eff0e8eff0e8eff0e8eff0e8eff0e8eff0e8eff0e8eff0e8eff0e8eff0e8eff0e8 eff0e8eff0e8eff0e8eff0e8eff0e8eff0e8eff0e8eff0e8eff0e8eff0e8eff0e8eff0e8 eff0e8eff0e8eff0e8eff0e8eff0e8eff0e8eff0e8eff0e8eff0e8eff0e8eff0e8eff0e8 eff0e8eff0e8eff0e8eff0e8eff0e8eff0e8eff0e8eff0e8eff0e8eff0e8eff0e8eff0e8 eff0e8eff0e8eff0e8eff0e8eff0e8eff0e8eff0e8eff0e8eff0e8eff0e8eff0e8eff0e8 eff0e8eff0e8eff0e8eff0e8eff0e8eff0e8eff0e8eff0e8eff0e8eff0e8eff0e8eff0e8 eff0e8eff0e8eff0e8eff0e8eff0e8eff0e8eff0e8eff0e8eff0e8eff0e8eff0e8eff0e8 f4f4f4eeeeeee3e3e3dfdfdfedededeeeeeeefefeff7f7f7eeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeef1f1f1f9f9f9e6e6e6ebebeb e9e9e9edededf1f2f4e4e5e7f2eae7f2eae7f2eae7f2eae7f2eae7f2eae7f2eae7f2eae7 eaefe8e3e8e1f0f5eeecf1ebe1e6dff2f7f0ecefe8eaede6ebeff2ebeff2ebeff2ebeff2 ebeff2ebeff2ebeff2ebeff2dfe3e4eef2f3edf1f2eef2f3e9edeed8dcdde9edeeeaeeef f4f5f0f6f8f5edefeedfe4e781888e8e97a0858f99747e8a7f868c7f868c7f868c7f868c 7f868c7f868c7f868c7f868c7f868c7f868c7f868c7f868c7f868c7f868c7f868c7f868c 7f868c7f868c7f868c7f868c7f868c7f868c7f868c7f868c7f868c7f868c7f868c7f868c 7f868c7f868c7f868c7f868c7f868c7f868c7f868c7f868c7f868c7f868c7f868c7f868c 7f868c7f868c7f868c7f868c7f868c7f868c7f868c7f868c80878d81888e787f857d848a 848b91979ea48d949ae1e8eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeef2eaf7e7f4e37b87db7280e36e77c45450c85f66ce6d80dc 758fdc7988e7e5f2e0f1ecf2f2eceeedeceaeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeef5f5f3f1f1efeeeeeee5e7e6e6e7e9e3e7eaf0f4f7e5e8edeef0ebeef0eb eef0ebeef0ebeef0ebeef0ebeef0ebeef0ebeef0ebeef0ebeef0ebeef0ebeef0ebeef0eb eef0ebeef0ebeef0ebeef0ebeef0ebeef0ebeef0ebeef0ebeef0ebeef0ebeef0ebeef0eb eef0ebeef0ebeef0ebeef0ebeef0ebeef0ebeef0ebeef0ebeef0ebeef0ebeef0ebeef0eb eef0ebeef0ebeef0ebeef0ebeef0ebeef0ebeef0ebeef0ebeef0ebeef0ebeef0ebeef0eb eef0ebeef0ebeef0ebeef0ebeef0ebeef0ebeef0ebeef0ebeef0ebeef0ebeef0ebeef0eb eef0ebeef0ebeef0ebeef0ebeef0ebeef0ebeef0ebeef0ebeef0ebeef0ebeef0ebeef0eb eef0ebeef0ebeef0ebeef0ebeef0ebeef0ebeef0ebeef0ebeef0ebeef0ebeef0ebeef0eb eef0ebeef0ebeef0ebeef0ebeef0ebeef0ebeef0ebeef0ebeef0ebeef0ebeef0ebeef0eb eef0ebeef0ebeef0ebeef0ebeef0ebeef0ebeef0ebeef0ebeef0ebeef0ebeef0ebeef0eb eef0ebeef0ebeef0ebeef0ebeef0ebeef0ebeef0ebeef0ebeef0ebeef0ebeef0ebeef0eb eef0ebeef0ebeef0ebeef0ebeef0ebeef0ebeef0ebeef0ebeef0ebeef0ebeef0ebeef0eb eef0ebeef0ebeef0ebeef0ebeef0ebeef0ebeef0ebeef0ebeef0ebeef0ebeef0ebeef0eb eef0ebeef0ebeef0ebeef0ebeef0ebeef0ebeef0ebeef0ebeef0ebeef0ebeef0ebeef0eb eef0ebeef0ebeef0ebeef0ebeef0ebeef0ebeef0ebeef0ebeef0ebeef0ebeef0ebeef0eb eef0ebeef0ebeef0ebeef0ebeef0ebeef0ebeef0ebeef0ebeef0ebeef0ebeef0ebeef0eb eef0ebeef0ebeef0ebeef0ebeef0ebeef0ebeef0ebeef0ebeef0ebeef0ebeef0ebeef0eb eef0ebeef0ebeef0ebeef0ebeef0ebeef0ebeef0ebeef0ebeef0ebeef0ebeef0ebeef0eb eef0ebeef0ebeef0ebeef0ebeef0ebeef0ebeef0ebeef0ebeef0ebeef0ebe7e8eaeeeff1 fbfcfef4f5f7fbfcfeeeeff1e2e3e5eeeff1eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee8e9ebf0f0f0e9e9e9f6f6f6fafbfde1e5e8 eff6fce3edf6ecedf1ecedf1ecedf1ecedf1ecedf1ecedf1ecedf1ecedf1e9f2f1e0eaeb ecf7f9eaf5f7dce7e9f3fbfde2e8e6edf2eee9eef2e9eef2e9eef2e9eef2e9eef2e9eef2 e9eef2e9eef2f8fdffecf1f5dce1e5e5eaeef3f8fce5eaeefbffffeef3f7e5e4e0ededeb e9edeef0f5f9868f98d0dce8daeaf9d6e6f6e4edf6e4edf6e4edf6e4edf6e4edf6e4edf6 e4edf6e4edf6e4edf6e4edf6e4edf6e4edf6e4edf6e4edf6e4edf6e4edf6e4edf6e4edf6 e4edf6e4edf6e4edf6e4edf6e4edf6e4edf6e4edf6e4edf6e4edf6e4edf6e4edf6e4edf6 e4edf6e4edf6e4edf6e4edf6e4edf6e4edf6e4edf6e4edf6e4edf6e4edf6e4edf6e4edf6 e4edf6e4edf6e4edf6e4edf6e4edf6e4edf6e6eff8e8f1fae8f1fadee7f0dae3ecd1dae3 7f8891e4edf6eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeef2eaf7e7f4e37b87db7280e36e77c45450c85f66ce6d80dc758fdc7988e7 e5f2e0f1ecf2f2eceeedeceaeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeecedeae8e9ededededeef0f8fcfffcffffe8edf1eff4f8eaeaf2eaeaf2eaeaf2eaeaf2 eaeaf2eaeaf2eaeaf2eaeaf2eaeaf2eaeaf2eaeaf2eaeaf2eaeaf2eaeaf2eaeaf2eaeaf2 eaeaf2eaeaf2eaeaf2eaeaf2eaeaf2eaeaf2eaeaf2eaeaf2eaeaf2eaeaf2eaeaf2eaeaf2 eaeaf2eaeaf2eaeaf2eaeaf2eaeaf2eaeaf2eaeaf2eaeaf2eaeaf2eaeaf2eaeaf2eaeaf2 eaeaf2eaeaf2eaeaf2eaeaf2eaeaf2eaeaf2eaeaf2eaeaf2eaeaf2eaeaf2eaeaf2eaeaf2 eaeaf2eaeaf2eaeaf2eaeaf2eaeaf2eaeaf2eaeaf2eaeaf2eaeaf2eaeaf2eaeaf2eaeaf2 eaeaf2eaeaf2eaeaf2eaeaf2eaeaf2eaeaf2eaeaf2eaeaf2eaeaf2eaeaf2eaeaf2eaeaf2 eaeaf2eaeaf2eaeaf2eaeaf2eaeaf2eaeaf2eaeaf2eaeaf2eaeaf2eaeaf2eaeaf2eaeaf2 eaeaf2eaeaf2eaeaf2eaeaf2eaeaf2eaeaf2eaeaf2eaeaf2eaeaf2eaeaf2eaeaf2eaeaf2 eaeaf2eaeaf2eaeaf2eaeaf2eaeaf2eaeaf2eaeaf2eaeaf2eaeaf2eaeaf2eaeaf2eaeaf2 eaeaf2eaeaf2eaeaf2eaeaf2eaeaf2eaeaf2eaeaf2eaeaf2eaeaf2eaeaf2eaeaf2eaeaf2 eaeaf2eaeaf2eaeaf2eaeaf2eaeaf2eaeaf2eaeaf2eaeaf2eaeaf2eaeaf2eaeaf2eaeaf2 eaeaf2eaeaf2eaeaf2eaeaf2eaeaf2eaeaf2eaeaf2eaeaf2eaeaf2eaeaf2eaeaf2eaeaf2 eaeaf2eaeaf2eaeaf2eaeaf2eaeaf2eaeaf2eaeaf2eaeaf2eaeaf2eaeaf2eaeaf2eaeaf2 eaeaf2eaeaf2eaeaf2eaeaf2eaeaf2eaeaf2eaeaf2eaeaf2eaeaf2eaeaf2eaeaf2eaeaf2 eaeaf2eaeaf2eaeaf2eaeaf2eaeaf2eaeaf2eaeaf2eaeaf2eaeaf2eaeaf2eaeaf2eaeaf2 eaeaf2eaeaf2eaeaf2eaeaf2eaeaf2eaeaf2eaeaf2eaeaf2eaeaf2eaeaf2eaeaf2eaeaf2 eaeaf2eaeaf2eaeaf2eaeaf2eaeaf2eaeaf2eaeaf2eaeaf2eaeaf2eaeaf2eaeaf2eaeaf2 eaeaf2eaeaf2eaeaf2eaeaf2eaeaf2eaeaf2eaeaf2eaeaf2f1f2f4eaebedeff0f2e1e2e4 e3e4e6f1f2f4e9eaecf8f9fbeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeff1efefefeeedebf3f2f0e0e1e381888e85939e788a98 7a8b9b7a8b9b7a8b9b7a8b9b7a8b9b7a8b9b7a8b9b7a8b9b7f8b997885957f8ea17e8fa3 7281948793a16b717d93969f83888c83888c83888c83888c83888c83888c83888c83888c 80858b81868c81868c888d938c919780858bd1d6dcdfe4eaf2f1edf4f4f2e9edeef0f5f9 79828be1edf9e8f8ffe4f4ffe4edf6e4edf6e4edf6e4edf6e4edf6e4edf6e4edf6e4edf6 e4edf6e4edf6e4edf6e4edf6e4edf6e4edf6e4edf6e4edf6e4edf6e4edf6e4edf6e4edf6 e4edf6e4edf6e4edf6e4edf6e4edf6e4edf6e4edf6e4edf6e4edf6e4edf6e4edf6e4edf6 e4edf6e4edf6e4edf6e4edf6e4edf6e4edf6e4edf6e4edf6e4edf6e4edf6e4edf6e4edf6 e4edf6e4edf6e4edf6e4edf6dce5eee0e9f2e8f1fae7f0f9f1faffedf6ff7b848deff8ff eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee f2eaf7e7f4e37b87db7280e36e77c45450c85f66ce6d80dc758fdc7988e7e5f2e0f1ecf2 f2eceeedeceaeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeef3eff0f0ebef f5f3f6efeef3e6eaedd1d6da70777d8d949a878996878996878996878996878996878996 878996878996878996878996878996878996878996878996878996878996878996878996 878996878996878996878996878996878996878996878996878996878996878996878996 878996878996878996878996878996878996878996878996878996878996878996878996 878996878996878996878996878996878996878996878996878996878996878996878996 878996878996878996878996878996878996878996878996878996878996878996878996 878996878996878996878996878996878996878996878996878996878996878996878996 878996878996878996878996878996878996878996878996878996878996878996878996 878996878996878996878996878996878996878996878996878996878996878996878996 878996878996878996878996878996878996878996878996878996878996878996878996 878996878996878996878996878996878996878996878996878996878996878996878996 878996878996878996878996878996878996878996878996878996878996878996878996 878996878996878996878996878996878996878996878996878996878996878996878996 878996878996878996878996878996878996878996878996878996878996878996878996 878996878996878996878996878996878996878996878996878996878996878996878996 878996878996878996878996878996878996878996878996878996878996878996878996 878996878996878996878996878996878996878996878996878996878996878996878996 878996878996878996878996878996878996878996878996878996878996878996878996 878996878996878996878996878996878996868a8d75797c7d8184888c8f95999ce1e5e8 e7ebeef3f7faeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeaeef1e8e8e8edeceaf6f5f3eef2f5869099adc0cfb2cde2b5cfe6b5cfe6 b5cfe6b5cfe6b5cfe6b5cfe6b5cfe6b5cfe6bccbe0bacce4b7cce9b8cfeeb3c8e3c1d0e7 979eb0e6e8f5fcfffffcfffffcfffffcfffffcfffffcfffffcfffffcfffff4f7fcfcffff fcfffffcffffdadde2a2a5aaf3f6fbfcfffff0f1eceff1eee9ebeaedf2f57a8187ebf4fd e6f0fae3edf9e9f0f6e9f0f6e9f0f6e9f0f6e9f0f6e9f0f6e9f0f6e9f0f6e9f0f6e9f0f6 e9f0f6e9f0f6e9f0f6e9f0f6e9f0f6e9f0f6e9f0f6e9f0f6e9f0f6e9f0f6e9f0f6e9f0f6 e9f0f6e9f0f6e9f0f6e9f0f6e9f0f6e9f0f6e9f0f6e9f0f6e9f0f6e9f0f6e9f0f6e9f0f6 e9f0f6e9f0f6e9f0f6e9f0f6e9f0f6e9f0f6e9f0f6e9f0f6e9f0f6e9f0f6e9f0f6e9f0f6 e9f0f6e9f0f6f4fbfff0f7fde4ebf1dce3e9e4ebf1ecf3f9787f85f4fbffeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeef2eaf7e7f4e3 7b87db7280e36e77c45450c85f66ce6d80dc758fdc7988e7e5f2e0f1ecf2f2eceeedecea eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeef8f2f6efeaeeeeecf1e8e7ec e8ebf0f8fdff899297eef7fcf8fdfff8fdfff8fdfff8fdfff8fdfff8fdfff8fdfff8fdff f8fdfff8fdfff8fdfff8fdfff8fdfff8fdfff8fdfff8fdfff8fdfff8fdfff8fdfff8fdff f8fdfff8fdfff8fdfff8fdfff8fdfff8fdfff8fdfff8fdfff8fdfff8fdfff8fdfff8fdff f8fdfff8fdfff8fdfff8fdfff8fdfff8fdfff8fdfff8fdfff8fdfff8fdfff8fdfff8fdff f8fdfff8fdfff8fdfff8fdfff8fdfff8fdfff8fdfff8fdfff8fdfff8fdfff8fdfff8fdff f8fdfff8fdfff8fdfff8fdfff8fdfff8fdfff8fdfff8fdfff8fdfff8fdfff8fdfff8fdff f8fdfff8fdfff8fdfff8fdfff8fdfff8fdfff8fdfff8fdfff8fdfff8fdfff8fdfff8fdff f8fdfff8fdfff8fdfff8fdfff8fdfff8fdfff8fdfff8fdfff8fdfff8fdfff8fdfff8fdff f8fdfff8fdfff8fdfff8fdfff8fdfff8fdfff8fdfff8fdfff8fdfff8fdfff8fdfff8fdff f8fdfff8fdfff8fdfff8fdfff8fdfff8fdfff8fdfff8fdfff8fdfff8fdfff8fdfff8fdff f8fdfff8fdfff8fdfff8fdfff8fdfff8fdfff8fdfff8fdfff8fdfff8fdfff8fdfff8fdff f8fdfff8fdfff8fdfff8fdfff8fdfff8fdfff8fdfff8fdfff8fdfff8fdfff8fdfff8fdff f8fdfff8fdfff8fdfff8fdfff8fdfff8fdfff8fdfff8fdfff8fdfff8fdfff8fdfff8fdff f8fdfff8fdfff8fdfff8fdfff8fdfff8fdfff8fdfff8fdfff8fdfff8fdfff8fdfff8fdff f8fdfff8fdfff8fdfff8fdfff8fdfff8fdfff8fdfff8fdfff8fdfff8fdfff8fdfff8fdff f8fdfff8fdfff8fdfff8fdfff8fdfff8fdfff8fdfff8fdfff8fdfff8fdfff8fdfff8fdff f8fdfff8fdfff8fdfff8fdfff8fdfff8fdfff8fdfff8fdfff8fdfff8fdfff8fdfff8fdff f8fdfff8fdfff8fdfff8fdfff8fdfff8fdfff8fdfff8fdfff8fdfff8fdfff8fdfff8fdff f8fdfff8fdfff8fdfff8fdfffbfffff7fcfffbfffffbffffd2d7dbfbffffeef3f7dbe0e4 eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee f4f8fbf1f1f1efeeece7e6e4e5e9ec7b8994b8d1e5c0e0f9b8d1e7b8d1e7b8d1e7b8d1e7 b8d1e7b8d1e7b8d1e7b8d1e7bbcedfbdd3e8b0cce4b4d2ecb7d3e9bacdde838d97f8fdff eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeef9f8fde5e4e9e3e2e7faf9fe fffeffcfced3fffeffe6e5eae9ebe8eaecebe8eae9ecedef88898df6f9feeceff4f2f5fc f1f4f9f1f4f9f1f4f9f1f4f9f1f4f9f1f4f9f1f4f9f1f4f9f1f4f9f1f4f9f1f4f9f1f4f9 f1f4f9f1f4f9f1f4f9f1f4f9f1f4f9f1f4f9f1f4f9f1f4f9f1f4f9f1f4f9f1f4f9f1f4f9 f1f4f9f1f4f9f1f4f9f1f4f9f1f4f9f1f4f9f1f4f9f1f4f9f1f4f9f1f4f9f1f4f9f1f4f9 f1f4f9f1f4f9f1f4f9f1f4f9f1f4f9f1f4f9f1f4f9f1f4f9f1f4f9f1f4f9f1f4f9f1f4f9 e7eaeff5f8fdf3f6fbfcfffffcfffffcffff818489ebeef3eeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeef2eaf7e7f4e37b87db7280e3 6e77c45450c85f66ce6d80dc758fdc7988e7e5f2e0f1ecf2f2eceeedeceaeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeef5eff3f1ebeff2f0f5ebeaefe5e8edf8ffff 717a7ff7fffffbfffdfbfffdfbfffdfbfffdfbfffdfbfffdfbfffdfbfffdfbfffdfbfffd fbfffdfbfffdfbfffdfbfffdfbfffdfbfffdfbfffdfbfffdfbfffdfbfffdfbfffdfbfffd fbfffdfbfffdfbfffdfbfffdfbfffdfbfffdfbfffdfbfffdfbfffdfbfffdfbfffdfbfffd fbfffdfbfffdfbfffdfbfffdfbfffdfbfffdfbfffdfbfffdfbfffdfbfffdfbfffdfbfffd fbfffdfbfffdfbfffdfbfffdfbfffdfbfffdfbfffdfbfffdfbfffdfbfffdfbfffdfbfffd fbfffdfbfffdfbfffdfbfffdfbfffdfbfffdfbfffdfbfffdfbfffdfbfffdfbfffdfbfffd fbfffdfbfffdfbfffdfbfffdfbfffdfbfffdfbfffdfbfffdfbfffdfbfffdfbfffdfbfffd fbfffdfbfffdfbfffdfbfffdfbfffdfbfffdfbfffdfbfffdfbfffdfbfffdfbfffdfbfffd fbfffdfbfffdfbfffdfbfffdfbfffdfbfffdfbfffdfbfffdfbfffdfbfffdfbfffdfbfffd fbfffdfbfffdfbfffdfbfffdfbfffdfbfffdfbfffdfbfffdfbfffdfbfffdfbfffdfbfffd fbfffdfbfffdfbfffdfbfffdfbfffdfbfffdfbfffdfbfffdfbfffdfbfffdfbfffdfbfffd fbfffdfbfffdfbfffdfbfffdfbfffdfbfffdfbfffdfbfffdfbfffdfbfffdfbfffdfbfffd fbfffdfbfffdfbfffdfbfffdfbfffdfbfffdfbfffdfbfffdfbfffdfbfffdfbfffdfbfffd fbfffdfbfffdfbfffdfbfffdfbfffdfbfffdfbfffdfbfffdfbfffdfbfffdfbfffdfbfffd fbfffdfbfffdfbfffdfbfffdfbfffdfbfffdfbfffdfbfffdfbfffdfbfffdfbfffdfbfffd fbfffdfbfffdfbfffdfbfffdfbfffdfbfffdfbfffdfbfffdfbfffdfbfffdfbfffdfbfffd fbfffdfbfffdfbfffdfbfffdfbfffdfbfffdfbfffdfbfffdfbfffdfbfffdfbfffdfbfffd fbfffdfbfffdfbfffdfbfffdfbfffdfbfffdfbfffdfbfffdfbfffdfbfffdfbfffdfbfffd fbfffdfbfffdfbfffff5fafefbffffeef3f791969aedf2f6e8edf1eef3f7eeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee4e8ebeeeeee f6f5f3eae9e7ecf0f37d8b96b5d0e5a8cbe7bdcee0bdcee0bdcee0bdcee0bdcee0bdcee0 bdcee0bdcee0b6cdd5bdd8e3aacad9aed1e4b7d7e6b2c9d1738182fbfffdefeeecefeeec efeeecefeeecefeeecefeeecefeeecefeeecf0eef1eceaedf3f1f4f5f3f6dcdadd9c9a9d f6f4f7f1eff2f1f5f4f2f4f3eff1f0eaeaea8d8d8df8f6f7efedeefffdfef5f6f8f5f6f8 f5f6f8f5f6f8f5f6f8f5f6f8f5f6f8f5f6f8f5f6f8f5f6f8f5f6f8f5f6f8f5f6f8f5f6f8 f5f6f8f5f6f8f5f6f8f5f6f8f5f6f8f5f6f8f5f6f8f5f6f8f5f6f8f5f6f8f5f6f8f5f6f8 f5f6f8f5f6f8f5f6f8f5f6f8f5f6f8f5f6f8f5f6f8f5f6f8f5f6f8f5f6f8f5f6f8f5f6f8 f5f6f8f5f6f8f5f6f8f5f6f8f5f6f8f5f6f8f5f6f8f5f6f8f5f6f8f5f6f8f4f5f7feffff f4f5f7f7f8faeeeff1f4f5f7848587edeef0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeef2eaf7e7f4e37b87db7280e36e77c45450c8 5f66ce6d80dc758fdc7988e7e5f2e0f1ecf2f2eceeedeceaeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee e5e5e5f6f6f6e9e9e9e9e9e9f4f4f4efefefe4e4e4e7e7e7ececece7e7e7f7f7f7ebebeb f1f1f1ebebebefefeff0f0f0eaeaeae6e6e6fdfdfdd9d9d9f5f5f5f4f4f4dededef3f3f3 ececece9e9e9e9e9e9f9f9f9e4e4e4f2f2f2f8f8f8efefefe9e9e9ecececefefefeaeaea e4e4e4ecececfdfdfdebebebf3f3f3e5e5e5f6f6f6ebebebebebebf6f6f6e5e5e5f3f3f3 efefeff0f0f0f5f5f5e0e0e0ebebebfdfdfde1e1e1f4f4f4f1f1f1f2f2f2e4e4e4f1f1f1 f3f3f3eaeaeaf6f6f6e2e2e2edeceaf0f0f0ebebebf0f1f3eaebededf1f483888cfaffff fffffffffffff1f1f1fffffffefefefffffffdfdfdfafafaf5f5f5ffffffffffffffffff fffffffdfdfdf7f7f7fffffffffffffdfdfdfdfdfdfffffff5f5f5fffffffbfbfbffffff fffffffffffffffffffbfbfbfafafaffffffffffffffffffffffffffffffffffffffffff f6f6f6ffffffedededfffffffffffffffffff8f8f8ffffffffffffefefefffffffffffff f7f7f7fefefefffffff4f4f4fffffffcfcfcfffffffffffffffffff1f1f1fffffff7f7f7 fffffff7f7f7fffffffffffffdfdfdfffffffffffffefefef4f4f4fffffffafafafbfbfb fffffffefefefefefefffffffffffffdfdfdf8f8f8fffffffffffff4f4f4fbfbfbf8f8f8 fffffffffffffffffffafafaf4f4f4fffffff8f8f8f2f2f2fffffff4f4f4ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff fffffdfdfdfdfcfffffbffff84898dfcffffedededf0efede8e8e8ecececf3f3f3f1f1f1 f1f1f1efefefe3e3e3f5f5f5e7e7e7e8e8e8fbfbfbf5f5f5e2e2e2fafafae6e6e6f5f5f5 e8e8e8fbfbfbe5e5e5eeeeeeededede4e4e4f4f4f4eeeeeeefefefe7e7e7ecececf6f6f6 f4f4f4efefefeeeeeeecececf3f3f3dededeefefeff5f5f5e7e7e7f4f4f4f2f2f2e5e5e5 f5f5f5e5e5e5f7f7f7f0f0f0e9e9e9eeeeeeeeeeeef6f6f6e5e5e5efefeff7f7f7e1e1e1 fbfbfbecececfcfcfce5e5e5f7f7f7dfdfdff1f1f1eaeaeaffffffefefefddddddf6f6f6 efefeff3f3f3e4e4e4f4f4f4f5f5f5e4e4e4f4f4f4f5f5f5ebebebefefefe9e9e9efefef f4f4f4e5e5e5f0f0f0e6e6e6ececece9e9e9e9e9e9f9f9f9e4e4e4f2f2f2f8f8f8efefef eaeaeae6e6e6ffffffe3e3e3eaeaeaf2f2f2ecececeeeeeef9f9f9e1e1e1f8f8f8e5e5e5 e9e9e9f7f7f7f4f4f4eeeeeeebebebedededefefeff4f4f4ecececedededf3f3f3ededed e0e0e0f7f7f7e1e1e1fefefee8e8e8e5e5e5f9f9f9e5e5e5eaeeedf0f0eeeeede9efeeec ecf0f37c8894b8cde2b5d1e9b0cfebb8cee3c4d4e3b5c8d9afcbe3b8d7f3b8d1e7becedd aecedbaec6d2c9daeaafc1d9c6dffdbad2ee778391fefeffedededf5f5f5f2f2f2eaeaea f4f4f43131312d2d2df1f1f1edeaf1efefedebece4edefeaf0f0f8818390faffffe8eeea eeedebedededeef2f5e8edf184888bf6f7f9fffffdfef9f5fbfdfcfbfdfcfbfdfcfbfdfc fbfdfcfbfdfcfbfdfcfbfdfcfcffffe8ecebf9fdfceff1f0fdfdfffdfdfff7f5f8fffeff fcfdfff8f9fbfefffff0f1f3fbfcfefeffffdedfe1fefffffefffff8f9fbfbfcfeecedef fefffffefffff3f4f6fefffff6fcfcfbfffffcfffff6f7f9fafafcfffefffef9fdfdf8fc fbfdfcfbfdfcfbfdfcfbfdfcfbfdfcfbfdfcfbfdfcfbfdfcf7fcf5f6fbf5f9fefaf5f9fa fcfffff6f9ff868992e8eaf6eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeef2eaf7e7f4e37b87db7280e36e77c45450c85f66ce6d80dc 758fdc7988e7e5f2e0f1ecf2f2eceeedeceaeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeef3f3f3f3f3f3 ecececf4f4f4f1f1f1e6e6e6f2f2f2fefefef6f6f6e9e9e9dcdcdcffffffedededf2f2f2 f0f0f0ececececececffffffe6e6e6f4f4f4f0f0f0d8d8d8ffffffedededf6f6f6e0e0e0 fafafaebebebeaeaeaf2f2f2d8d8d8edededf7f7f7eaeaeaf1f1f1fbfbfbfafafaf1f1f1 e4e4e4efefefe9e9e9e9e9e9f5f5f5ececececececf5f5f5e9e9e9e9e9e9e6e6e6e7e7e7 e8e8e8ffffffebebebdfdfdfecececf5f5f5f1f1f1e0e0e0fafafaf9f9f9d5d5d5f2f2f2 eeeeeefcfcfcedeceaf0f0f0ebebebf0f1f3eaebededf1f483888cfafffff0f0f0ffffff fffffffffffffefefefffffffafafafffffffffffffffffffffffffafafaf9f9f9f6f6f6 ffffffeeeeeef2f2f2fffffff9f9f9fffffff5f5f5edededffffffeaeaeaf8f8f8ffffff fffffffffffffffffff7f7f7fffffff5f5f5f7f7f7fffffff3f3f3fafafafffffffdfdfd fffffffffffffefefefafafafffffff4f4f4fffffffffffff9f9f9f9f9f9fffffff8f8f8 fffffffffffff7f7f7f8f8f8fffffff5f5f5efefeffffffffffffffffffffdfdfdffffff fcfcfcfffffff9f9f9ffffffefefeffdfdfdfffffff3f3f3fffffffafafaeeeeeeffffff ffffffdededefffffff8f8f8fffffffffffff7f7f7ffffffffffffffffffffffffe8e8e8 fffffffffffffffffffbfbfbfffffffffffff5f5f5fcfcfcf6f6f6fbfbfbffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdfdfdfd fcfffffbffff84898dfcffffedededf0efedf4f4f4f4f4f4e0e0e0eaeaeae7e7e7f0f0f0 e5e5e5f5f5f5ffffffe6e6e6f1f1f1e4e4e4fefefed1d1d1f6f6f6f1f1f1f7f7f7e2e2e2 efefeff8f8f8fdfdfdf5f5f5e8e8e8eeeeeef5f5f5eaeaeaf8f8f8eaeaeae7e7e7e0e0e0 fbfbfbfbfbfbdcdcdcffffffe8e8e8dcdcdcfbfbfbdadadaedededf9f9f9eaeaeae2e2e2 eeeeeefdfdfde7e7e7fffffff6f6f6d6d6d6ffffffedededf3f3f3f2f2f2dfdfdfececec e3e3e3fbfbfbf0f0f0e4e4e4f7f7f7edededd7d7d7e0e0e0fbfbfbf2f2f2eeeeeef1f1f1 ebebebe8e8e8f7f7f7f8f8f8e8e8e8e3e3e3fdfdfde4e4e4f6f6f6ededede6e6e6fafafa e1e1e1fefefef6f6f6e0e0e0fafafaebebebeaeaeaf2f2f2d8d8d8edededf8f8f8ededed f3f3f3e6e6e6f3f3f3eeeeeedfdfdff6f6f6f2f2f2eaeaeaf1f1f1f7f7f7ffffffd5d5d5 e9e9e9e7e7e7eeeeeeeeeeeeedededeaeaeae0e0e0f9f9f9e6e6e6f1f1f1ffffffeeeeee dededefafafae6e6e6efefeff6f6f6eeeeeeeaeeedf0f0eeeeede9efeeececf0f37c8894 b8cde2b5d1e9b4cee5bbccdcc3cfdbbfcfdeb7cfe7b9d7f1adc3d8c5d5e4c4e1efb8cedb b8c8d7aec0d6b6cdecadc5df919dabf4f5f7fafafad3d3d3e3e3e3f5f5f53737372f2f2f 3f3f3f323232eeebf2f1f1efedeee6f1f3eef5f5fd888a97fbfffff1f7f3eeedebededed eef2f5e9eef284898df6f7f9fffffdfefaf7fdfffefdfffefdfffefdfffefdfffefdfffe fdfffefdfffef6fcfaf3f7f6fcfffffbfcfefffffffffffffffefff9f7faf8f9fbf5f6f8 dfe0e2fefffff9fafcfbfcfefefffff2f3f5f2f3f5fefffffdfefffefffffefffffeffff eaebedfeffffebf1f1fbfffff6fafbfafbfdfefefffcfcfefffefffffefffdfffefdfffe fdfffefdfffefdfffefdfffefdfffefdfffefafff9f9fefafcfffff7fbfcfcfffff8fbff 888b94ebedf9eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeef2eaf7e7f4e37b87db7280e36e77c45450c85f66ce6d80dc758fdc7988e7 e5f2e0f1ecf2f2eceeedeceaeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee7e7e7e3e3e3e8e8e8f2f2f2 ecececedededfafafad3d3d3ddddddfffffff9f9f9e5e5e5ddddddecececf9f9f9ededed e8e8e8e3e3e3e7e7e7fafafaf2f2f2f6f6f6f0f0f0dededeebebebebebebf0f0f0d3d3d3 fcfcfcf9f9f9ffffffecececececece1e1e1ececece3e3e3e3e3e3e7e7e7ffffffeaeaea f3f3f3f4f4f4e7e7e7f6f6f6f6f6f6e7e7e7f4f4f4f3f3f3edededffffffe1e1e1e4e4e4 fafafafcfcfce1e1e1ecececefefefe7e7e7f5f5f5ecececf0f0f0f4f4f4e1e1e1e6e6e6 edeceaf0f0f0ebebebf0f1f3eaebededf1f483888cfafffffffffffcfcfcffffffffffff e8e8e8ffffffe3e3e3fffffff4f4f4edededfffffffffffffbfbfbfffffffffffffdfdfd fffffff4f4f4f8f8f8fbfbfbffffffffffffffffffffffffffffffffffffeaeaeaffffff f7f7f7ffffffffffffffffffffffffefefeffffffffffffff5f5f5fcfcfcffffffffffff ffffffffffffffffffffffffefefefffffffffffffffffffffffffeeeeeef9f9f9fcfcfc ffffffffffffffffffffffffffffffffffffe3e3e3f3f3f3fffffff5f5f5f4f4f4fefefe fffffffffffff3f3f3fffffffffffff8f8f8f3f3f3fffffffffffffffffff9f9f9ffffff fffffffffffff2f2f2f3f3f3f4f4f4ffffffe5e5e5fffffffffffffffffff3f3f3ffffff ecececffffffffffffeeeeeefffffffffffffffffffbfbfbffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff fffffffffffffffffffffffffffffffffffffffffffffffffffffdfdfdfdfcfffffbffff 84898dfcffffedededf0efede3e3e3f0f0f0fafafae7e7e7f3f3f3fafafaf3f3f3f2f2f2 dcdcdcedededf9f9f9dcdcdcf0f0f0fefefeeaeaeaf0f0f0e7e7e7f8f8f8eeeeeeebebeb e1e1e1e7e7e7fefefee4e4e4e3e3e3fefefeecececededede4e4e4fefefee4e4e4dadada e2e2e2f0f0f0f0f0f0e5e5e5fffffff2f2f2f4f4f4e6e6e6f6f6f6f3f3f3e9e9e9e8e8e8 f3f3f3e0e0e0efefefffffffe0e0e0e0e0e0e1e1e1f4f4f4f9f9f9f2f2f2f3f3f3e7e7e7 f0f0f0eeeeeeefefeff5f5f5ecececf4f4f4f8f8f8dfdfdfe6e6e6ebebebf9f9f9eeeeee eaeaeaeeeeeeeaeaeafdfdfdd7d7d7f0f0f0e3e3e3fafafaeaeaeaf9f9f9e4e4e4e7e7e7 ebebebebebebf0f0f0d3d3d3fcfcfcf9f9f9ffffffececece1e1e1e6e6e6e8e8e8f0f0f0 fafafaffffffe7e7e7f5f5f5e4e4e4f3f3f3ededede8e8e8dededef7f7f7fefefef6f6f6 f9f9f9e3e3e3f1f1f1f7f7f7f1f1f1e2e2e2eaeaeaf8f8f8dadadaffffffeeeeeeebebeb f3f3f3f7f7f7dcdcdcf0f0f0eaeeedf0f0eeeeede9efeeececf0f37c8894b8cde2b5d1e9 c1d2e2c0cad42a2f35343e48c4d9ecabc5dcbacfe2bac8d50823341e313f2a3845d3e4f8 b2cae4b2cae27c8896feffffecececf8f8f8ffffffffffffdbdbdbeaeaeaf3f3f3efefef edeaf1efefedeaebe3ebede8eeeef67f818ef7fcffe5ebe7efeeececececedf1f4eaeff3 858a8ef4f8fbfefffffcfbf9fbfcfefbfcfefbfcfefbfcfefbfcfefbfcfefbfcfefbfcfe f0f6f6f5fbfbfcffffe9edeefdfefff6f6f8f7f7f9fefefffefffffefffffeffffe1e2e4 ebeceefefffff0f1f3fefffffefffff3f4f6f8f9fbeaebedfbfcfee8e9ebfefffff4f5f7 fbfffff4fafafcfffffcfffff3f4f6fcfcfef8f8faf9f9fbfbfcfefbfcfefbfcfefbfcfe fbfcfefbfcfefbfcfefbfcfef9fefaf8fcfbfbfffff6fafdfcfffff5f8ff878a93ebedf9 eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee f2eaf7e7f4e37b87db7280e36e77c45450c85f66ce6d80dc758fdc7988e7e5f2e0f1ecf2 f2eceeedeceaeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeef2f2f2f0f0f0f6f6f6eeeeeee9e9e9f4f4f4 dfdfdf4f4f4f4545451f1f1f2e2e2e404040ffffffdbdbdbffffff232323383838fdfdfd fbfbfbdededee7e7e7ebebebe5e5e5f6f6f6e9e9e9fbfbfbfbfbfbefefeff7f7f7cccccc f7f7f7e2e2e2f8f8f8f2f2f2e1e1e1ffffffecececefefef292929f1f1f1e3e3e3f4f4f4 eeeeeee7e7e7e7e7e7eeeeeef4f4f4e3e3e3f4f4f4eaeaeaf7f7f7edededd8d8d8f5f5f5 efefeff2f2f2dfdfdfffffffeeeeeedfdfdfffffffdededef3f3f3f2f2f2edeceaf0f0f0 ebebebf0f1f3eaebededf1f483888cfafffffffffff4f4f4fffffffefefeffffffffffff fffffffffffffffffffffffffefefe3939393030302727272c2c2c4444443333333b3b3b 353535ffffffebebebf7f7f7ffffffecececfffffffffffff7f7f7f7f7f7eaeaeaffffff f7f7f7fcfcfcf3f3f3f5f5f5ffffffecececffffffffffffeaeaeafffffff0f0f0ffffff edededfafafaffffffe0e0e02d2d2dfffffff5f5f5fffffffffffff8f8f8ffffffffffff f2f2f2f6f6f6f3f3f3ffffffffffffffffffffffffffffffffffffffffffedededffffff fffffffffffff8f8f8ffffffffffff2f2f2ffffffff2f2f2efefefffffffeaeaeaffffff fffffffffffffffffff3f3f3ffffff2a2a2afffffff1f1f1ffffffffffffffffff323232 fdfdfdfefefefffffff7f7f7f6f6f6ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff fffffffffffffffffffffffffffffffffffffffffdfdfdfdfcfffffbffff84898dfcffff edededf0efedfcfcfcededede8e8e8373737242424353535303030262626f9f9f9fbfbfb f2f2f2efefefe6e6e6fafafae3e3e3eeeeeee2e2e2f6f6f6e7e7e7f4f4f4e7e7e7f5f5f5 f5f5f5e6e6e6f4f4f4ddddddecececf4f4f4ffffffd7d7d7eaeaeaffffffffffffe4e4e4 ffffffecececdededeefefeff0f0f0f5f5f5e6e6e6e4e4e4ebebebe5e5e5ffffffdedede f2f2f2ecececeeeeeeffffffefefefe4e4e4e6e6e6e8e8e8f6f6f6e9e9e9efefeff3f3f3 e9e9e9e8e8e8f6f6f6f3f3f3d9d9d9f4f4f4f7f7f7e8e8e8edededffffffececece4e4e4 fafafae4e4e43d3d3d4343433c3c3c2d2d2d333333ebebebfbfbfbe9e9e9e9e9e9fbfbfb fbfbfbefefeff7f7f7ccccccf7f7f7e2e2e2f7f7f7f4f4f4f9f9f9ecececcececee7e7e7 f5f5f5e9e9e9eaeaeaf5f5f5efefefe9e9e9eaeaeaf3f3f3e4e4e4eeeeeee5e5e5e5e5e5 fcfcfcdfdfdfebebebf5f5f5fbfbfb252525373737dbdbdbf2f2f2edededf0f0f0f1f1f1 ecececf5f5f5eaeeedf0f0eeeeede9efeeececf0f37c8894b8cde2b5d1e9c9d5e120232a 343436373c42a2b3c3d0e6fbb0c1d33d4751c9e0f2bbcbda2935411e2e3eb0c9dfc0d6ed 7a8694f9fafef6f6f6e2e2e2f6f6f6ddddddffffffddddddf2f2f2eeeeeef1eef5f3f3f1 eeefe7f0f2edf3f3fb858794fbffffecf2eef0efedecececedf1f4e9f0f6848b91f1f6fa f9fdfff8f9fbf4f7fcf4f7fcf4f7fcf4f7fcf4f7fcf4f7fcf4f7fcf4f7fcf9ffffeaeff3 f2f7fbf9fdffe2e6e93b3c3e444446ebebedf5f6f8e3e4e6393a3c464749fbfcfeeff0f2 f2f3f5fafbfdfeffffedeef0fefffffeffff1516184c4d4ff9fafcecedeff8fcffe0e4e7 ebeff2f0f4f7f6fafdfcfffff4f5f9f7f8fcf4f7fcf4f7fcf4f7fcf4f7fcf4f7fcf4f7fc f4f7fcf4f7fcf4fafaf3f9f9f6fbfeeff4f8f6fbffeff4fa82868fe8ecf5eeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeef2eaf7e7f4e3 7b87db7280e36e77c45450c85f66ce6d80dc758fdc7988e7e5f2e0f1ecf2f2eceeedecea eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeef1f1f1ecececf4f4f4eeeeeeefefeffcfcfce2e2e2212121 2c2c2cfdfdfde7e7e73131312c2c2cf5f5f5f0f0f0f5f5f5f1f1f1dbdbdbdfdfdfffffff e9e9e9f6f6f6f1f1f1f1f1f1fcfcfcdededee2e2e2f0f0f0dededefefefeebebebffffff dbdbdbfcfcfce9e9e9e4e4e4e0e0e0383838343434f0f0f0f5f5f5e5e5e5f6f6f6eeeeee eeeeeef6f6f6e5e5e5f5f5f5ebebebebebebeaeaeaf8f8f8f8f8f8e4e4e4edededeaeaea fafafaf4f4f4e9e9e9e7e7e7e7e7e7e0e0e0f8f8f8ecececedeceaf0f0f0ebebebf0f1f3 eaebededf1f483888cfafffff6f6f6fffffffffffffcfcfcf5f5f5f4f4f4ffffffebebeb efefeffffffff6f6f6232323fbfbfbffffffffffff1b1b1bfdfdfdfcfcfcffffffebebeb fffffffffffff6f6f6fffffff2f2f2fbfbfbfffffff8f8f8ffffffffffffd9d9d9ffffff fffffffffffffffffff8f8f8f7f7f7eaeaeafffffffffffffefefefefefeffffffffffff ffffffffffff303030fffffff9f9f9fffffffffffff5f5f5fdfdfdf3f3f3fefefeffffff fffffff8f8f8fffffffffffff1f1f1fffffff9f9f9f2f2f2ffffffe1e1e1ffffffffffff fffffff4f4f4f9f9f9fefefefcfcfcfffffffffffff8f8f8fffffffefefef5f5f5ffffff f5f5f5ffffff272727282828ffffffffffffffffffeeeeeededede343434ffffffffffff fffffff5f5f5f1f1f1ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff fffffffffffffffffffffffffffffdfdfdfdfcfffffbffff84898dfcffffedededf0efed e4e4e4e2e2e2f9f9f92c2c2c414141e1e1e1efefeffffffff6f6f6d7d7d7e7e7e7f1f1f1 f1f1f1dcdcdcffffffe4e4e4f0f0f0f5f5f5e7e7e7f9f9f9f0f0f0edededcbcbcbffffff f1f1f1e8e8e8f3f3f3f7f7f7e8e8e8f3f3f3f8f8f8dededee9e9e9eaeaeadededef7f7f7 eeeeeeeeeeeeefefefe3e3e3f4f4f4fbfbfbe9e9e9ffffffe5e5e5fcfcfcefefefe6e6e6 f7f7f7d2d2d2fafafaddddddffffffffffffd7d7d7f8f8f8edededdadadaffffffefefef ddddddf8f8f8f0f0f0f6f6f6ebebebf9f9f9d9d9d9eeeeeee5e5e5f5f5f5efefef292929 404040d3d3d3e6e6e6f3f3f3282828404040e8e8e8e8e8e8fcfcfcdededee2e2e2f0f0f0 dededefefefeebebebfffffff0f0f0e1e1e1eeeeeee1e1e1ffffffe8e8e8f6f6f6efefef f2f2f2ededede1e1e1f4f4f4f6f6f6f7f7f7e4e4e4efefefffffffddddddffffffededed e7e7e7fbfbfbe5e5e53030303d3d3dffffffebebebeeeeeef4f4f4e6e6e6fefefee2e2e2 eaeeedf0f0eeeeede9efeeececf0f37c8894b8cde2b5d1e916202a3f42473331321f2227 cbd9e6b9ccdd1c2a37222931afc4d9c6d3e3c3cdd7bdcbd8cbe1f6b5cbe082909dfcfdff f0f0f0eaeaeaeeeeeef4f4f4e4e4e4f6f6f6fafafae8e8e8e7e4ebebebe9e8e9e1eceee9 f2f2fa858794fbffffeff5f1f3efecebebebecf0f3eaf1f7838c93ebf4fbf2f9fff2f7fb eff4faeff4faeff4faeff4faeff4faeff4faeff4faeff4faeaf1f9f0f7ffebf2f8f4f9fd fcffff2b2f30292a2cf9fbfaf8f9fbfbfcfe3031332d2e30edeef0fefffffafbfdecedef edeef0f8f9fbf2f3f5f7f8fa3f404227282adbdcdefeffffe9ecf1fcfffff8fbffe6e9ee f4f9fdeff4f8e7ecf0fbffffeff4faeff4faeff4faeff4faeff4faeff4faeff4faeff4fa edf5f8edf5f8f0f8fbe9f1f4f0f7fde9f0f67f868ee7eef6eeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeef2eaf7e7f4e37b87db7280e3 6e77c45450c85f66ce6d80dc758fdc7988e7e5f2e0f1ecf2f2eceeedeceaeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeedededdededee8e8e8ecececefefeff0f0f0f1f1f1424242383838f8f8f8 f2f2f2ebebeb3737373a3a3ae5e5e53232322d2d2df9f9f94242421818183838383a3a3a dfdfdfe8e8e82020204141413e3e3e2b2b2bffffffedededfafafa1e1e1e333333373737 373737fafafa3030304545451f1f1f353535eaeaeaf6f6f6242424303030303030242424 f6f6f6eaeaea2f2f2f3838383232323333332626263b3b3bf1f1f1efefefe3e3e3363636 2828284343433a3a3aefefeffefefeeaeaeaedeceaf0f0f0ebebebf0f1f3eaebededf1f4 83888cfaffffffffffe5e5e5343434383838fffffff9f9f9fdfdfd3f3f3fffffffffffff 3a3a3afffffffffffffffffff6f6f6454545fffffffdfdfdfffffff5f5f5fbfbfb393939 292929393939ffffffffffffeeeeee303030e9e9e9474747515151f1f1f1fbfbfb1c1c1c 323232fffffff7f7f7ffffff282828f1f1f13737372a2a2af4f4f4f4f4f4f4f4f4474747 fffffff3f3f3474747e0e0e04b4b4b414141edededffffff2e2e2e292929efefefffffff e5e5e5ffffff313131252525363636ffffffffffff393939fffffffcfcfcf6f6f6343434 ffffff383838ffffffebebebffffff3434342e2e2e3d3d3dfffffff2f2f2ffffff1e1e1e ffffff424242fffffff9f9f9f5f5f5ffffff515151f3f3f3fffffff4f4f4ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff fffffffffffffffffdfdfdfdfcfffffbffff84898dfcffffedededf0efedf0f0f0f1f1f1 f0f0f02e2e2e2b2b2bfdfdfddcdcdce6e6e6ededed2a2a2a4444443b3b3b2b2b2bfefefe e0e0e04444442727274444442d2d2dddddddfcfcfc2929294a4a4ae7e7e72f2f2f444444 e3e3e3d6d6d63f3f3f353535dfdfdfffffffeeeeee242424494949292929383838f1f1f1 fefefeececec373737242424393939232323fafafae9e9e9ebebebf6f6f6eeeeee2e2e2e 424242f8f8f8171717262626ffffffe9e9e9f8f8f83838383232322e2e2e4b4b4bdddddd f0f0f02828282929293d3d3d434343d9d9d9ffffffe8e8e8e9e9e93f3f3f1e1e1effffff f5f5f5f2f2f2dededef4f4f4e6e6e6f3f3f32020204141413e3e3e2b2b2bffffffededed fafafa1e1e1e343434383838262626fffffff3f3f3e0e0e03838382c2c2c292929454545 dfdfdff0f0f03a3a3a121212ffffff2d2d2d292929f3f3f3dbdbdbeeeeee323232242424 ffffff3d3d3d2e2e2edcdcdc3030303e3e3ee4e4e4ececececececf7f7f7eaeeedf0f0ee eeede9efeeececf0f37c8894b8cde2b5d1e930404fc8cfd717181c3a3f45cedce9b0c0d0 333d47494a4e33435a161f30323b44ccdae39eb5c5bcd3e576848ff3f6fbe5e5e5ffffff e8e8e8efefefeaeaeaf7f7f7ddddddf4f4f4f0edf4f1f1efecede5edefeaefeff77f818e f7fcffe5ebe7f5f1eeebebebecf0f3e9f2f9818b94e6f0f9ebf4fbecf3f9edf1faedf1fa edf1faedf1faedf1faedf1faedf1faedf1fae4edf6f8ffffe8eff7d1d8deecf1f5343839 333736e2e4e3e7e8eaf1f2f43536382b2c2ef4f5f7e2e3e53334363b3c3e27282a3f4042 ecedefe2e3e53a3b3d212224feffff1d1e203c3f44d2d5da35383d363b3fe8f0f3f5fdff eef8fadee8eaedf1faedf1faedf1faedf1faedf1faedf1faedf1faedf1faeaf1f7ebf2f8 eef5fbe7eef4eef5fbe9f0f680878feaf1f9eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeef2eaf7e7f4e37b87db7280e36e77c45450c8 5f66ce6d80dc758fdc7988e7e5f2e0f1ecf2f2eceeedeceaeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee fafafaf1f1f1f5f5f5ebebebe8e8e8dddddde5e5e5353535232323e9e9e9e0e0e0ffffff 292929252525fefefe303030393939e9e9e92e2e2e3e3e3ef1f1f1efefefe5e5e5434343 3f3f3fdbdbdbfafafa343434222222e9e9e9333333343434f2f2f2e1e1e1242424272727 f4f4f4323232454545e2e2e2e9e9e9353535404040f3f3f3f3f3f3404040353535e9e9e9 3535352f2f2fe7e7e7ececec525252212121f2f2f2edededf9f9f92f2f2f383838303030 303030eaeaeaf2f2f2ebebebedeceaf0f0f0ebebebf0f1f3eaebededf1f483888cfaffff f0f0f03f3f3ff5f5f5ffffff323232fffffff4f4f4fefefefefefeffffff2c2c2cffffff ffffffefefefffffff1e1e1efffffff2f2f2ffffffffffff262626f7f7f7fffffff5f5f5 313131fefefeffffff3939393b3b3bf6f6f6f8f8f82b2b2b2e2e2efffffffbfbfb3a3a3a fffffff6f6f63535353f3f3fffffffe2e2e23e3e3efffffffafafa1b1b1bffffffffffff 323232252525fcfcfcf5f5f54747472e2e2effffffffffff434343f0f0f0ffffff3e3e3e f2f2f2ffffffffffff222222ffffff262626fefefeffffffffffff2d2d2dffffff252525 fbfbfbffffff3d3d3deeeeeefffffff7f7f7353535fffffff2f2f2ffffffffffff2d2d2d fafafafffffffffffffcfcfc343434e6e6e6ffffffffffffedededfffffff5f5f5ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff fffffdfdfdfdfcfffffbffff84898dfcffffedededf0efedf2f2f2ececece6e6e63a3a3a 464646e4e4e4e9e9e9f7f7f7f4f4f4323232333333e0e0e0f1f1f1f0f0f0343434e3e3e3 f5f5f5e9e9e92b2b2b444444e6e6e63131313030302f2f2fe4e4e43e3e3e2c2c2c464646 f3f3f3191919434343e6e6e63939393d3d3ddcdcdcf7f7f7353535272727e4e4e4383838 2e2e2efdfdfdebebeb242424373737f3f3f3ededededededf9f9f93030302e2e2e292929 fcfcfc353535212121f5f5f52a2a2a2f2f2ff4f4f4e3e3e32323233e3e3ee8e8e8434343 3e3e3ee7e7e7edededecececedededeeeeeee7e7e73c3c3c3f3f3f272727252525f5f5f5 f4f4f4eeeeeee4e4e43737373f3f3fdbdbdbfafafa343434222222e9e9e9333333343434 f6f6f6e7e7e7393939252525e4e4e4515151202020f6f6f6fdfdfd212121393939fcfcfc 1b1b1b4646463e3e3ee8e8e82d2d2d454545f4f4f42a2a2a464646e4e4e4151515393939 434343f5f5f5383838343434ecececf3f3f3dadadaf3f3f3eaeeedf0f0eeeeede9efeeec ecf0f37c8894b8cde2b5d1e9b5cbe0beccd932373d373e46aab8c5ccdae7222931221e1f bdcbe5c5ccdc353c441f2c34bdd3e0c0d7e77a8893fcffffffffffeeeeeeffffffffffff fffffff3f3f3fffffffffffffffdfffffffdfdfef6fcfef9fbfbff888a97fbffffebf1ed f6f2efecebe9ebeff2e9f2f97e8b94e0edf6e5eff8e5eff8e8eff9e8eff9e8eff9e8eff9 e8eff9e8eff9e8eff9e8eff9e0e8f5d7dfeae6eff8f9fffff5fafe1d23233f4342f2f6f5 f3f4f6f0f1f31c1d1f38393beff0f23a3b3d2d2e30e7e8eaeaebed2a2b2d3a3b3de4e5e7 38393b333436f6f7f93c3d3f26262e4d5057d1d4db32373d20272dedf6fbdbe6eae6f1f5 e8eff9e8eff9e8eff9e8eff9e8eff9e8eff9e8eff9e8eff9e4edf4e5eef5e9f2f9e2ebf2 e9f2f9e5eef57f888deaf3f8eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeef2eaf7e7f4e37b87db7280e36e77c45450c85f66ce6d80dc 758fdc7988e7e5f2e0f1ecf2f2eceeedeceaeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee0e0e0f0f0f0 f7f7f7e4e4e4f1f1f1f6f6f6f8f8f82d2d2d3e3e3eefefeff2f2f2d9d9d93d3d3d434343 dddddd393939373737ebebeb363636313131eaeaeaf3f3f3f0f0f02c2c2c303030f8f8f8 e2e2e2292929424242f8f8f82626263d3d3deaeaeaf8f8f8f5f5f5f4f4f4e2e2e23c3c3c 252525f2f2f2f4f4f42d2d2d353535e9e9e9e9e9e93535352d2d2df4f4f43a3a3a2e2e2e efefeff1f1f1e6e6e6363636343434ececec2f2f2f3b3b3bebebebebebebf1f1f1f0f0f0 e7e7e7f2f2f2edeceaf0f0f0ebebebf0f1f3eaebededf1f483888cfaffffffffff313131 fffffffffffff0f0f0f7f7f7fffffff4f4f4fffffffcfcfc383838f0f0f0fffffffafafa f6f6f63e3e3efcfcfcfffffff1f1f1fefefe3f3f3ffbfbfbfbfbfbffffff2e2e2effffff ffffff2d2d2dfdfdfdfffffffdfdfd383838fffffff9f9f9fefefe313131fffffff6f6f6 404040f6f6f6fcfcfcffffff2e2e2efffffffdfdfd464646f8f8f8ffffff3d3d3df8f8f8 ffffffffffff2e2e2efbfbfbfffffff9f9f9242424fffffff6f6f62d2d2dfffffff7f7f7 ffffff343434ffffffffffff262626ffffff2c2c2cfbfbfbffffff323232fffffffefefe 303030fefefefffffffdfdfd313131fffffff8f8f8fffffff2f2f23a3a3afdfdfdffffff fffffff8f8f8272727fffffffffffff6f6f6fffffffffffffffffffcfcfcffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdfdfdfd fcfffffbffff84898dfcffffedededf0efedf3f3f3e6e6e6f5f5f52f2f2f2f2f2f2e2e2e 3f3f3f2c2c2ce4e4e4454545272727f8f8f8ebebebedededf3f3f3eeeeee353535222222 3e3e3e2c2c2cf0f0f03434342b2b2bf8f8f8efefef363636232323f9f9f9dfdfdf474747 333333e8e8e83131312e2e2efefefed7d7d73a3a3a3c3c3ceaeaea3434343232322d2d2d f2f2f2f5f5f5f2f2f2e0e0e0f4f4f4eeeeeedadada474747303030dfdfdfffffff2c2c2c 343434f1f1f13131313d3d3de5e5e5f0f0f04343432d2d2deeeeee2d2d2d313131e8e8e8 f5f5f5ebebebf5f5f5e7e7e7ffffffe3e3e32c2c2c3838382c2c2c3c3c3c2b2b2bdedede ffffff2a2a2a303030f8f8f8e2e2e2292929424242f8f8f82626263d3d3df1f1f1efefef efefeff9f9f9e5e5e5272727464646e3e3e3e0e0e04747472c2c2ce2e2e2424242333333 e4e4e4f0f0f0373737262626e6e6e63b3b3b323232e7e7e7fcfcfc2b2b2b2b2b2bf4f4f4 e9e9e9e7e7e7eeeeeef0f0f0ffffffe1e1e1eaeeedf0f0eeeeede9efeeececf0f37c8894 b8cde2b5d1e9b9d5edb2c5d6353e47222b34c4d2dfbdcbd8363b413c3734becae4cbd2e2 2c313728353bc0d6e3adc4d282909bf8fbffebebebf9f9f9f1f1f1e6e6e6f1f1f1f1f1f1 e9e9e9ecececefecf3f1f1efecede5eef0ebf1f1f9838592fbffffe9efebf8f3efecebe9 ebeff2e9f2f97d8a93ddeaf3e0edf6e2ecf5e3e9f5e3e9f5e3e9f5e3e9f5e3e9f5e3e9f5 e3e9f5e3e9f5ecf6ffdfe7f4e6eff8dce3ebdbe3e63a40402327262c302f2f30322b2c2e 3e3f41333436e3e4e62b2c2e48494bdfe0e2eff0f22f30322c2d2fedeef0393a3c28292b e2e3e53233352a2a32f1f4fbeef1f8252a3040474dd8e1e6e1ecf0e0eef1e3e9f5e3e9f5 e3e9f5e3e9f5e3e9f5e3e9f5e3e9f5e3e9f5dfe8f1e0e9f2e4edf6dee7eee5eef5e1eaf1 7c858ae9f2f7eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeef2eaf7e7f4e37b87db7280e36e77c45450c85f66ce6d80dc758fdc7988e7 e5f2e0f1ecf2f2eceeedeceaeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeef1f1f1e6e6e6ecececebebeb f5f5f5ebebebeeeeee2c2c2c383838dcdcdcf1f1f1f5f5f52e2e2e272727f9f9f92f2f2f 333333eaeaea323232343434ecececeaeaeaf3f3f33f3f3f353535353535454545282828 353535efefef4242422d2d2df2f2f2fafafae3e3e3f1f1f1e7e7e74343432e2e2eebebeb ebebeb333333303030f3f3f3f3f3f3303030333333ebebeb2d2d2d434343e3e3e3f7f7f7 ebebeb343434404040e6e6e63535352c2c2cf5f5f5efefeff2f2f2ecececf2f2f2e4e4e4 efeeececececefefefe8e9ebeeeff1e8ecef878c90fbfffffeffff303135fbfcfffeffff f7f8fcfafbfffefffffcfdfffefffffeffff35363af7f8fcfefffffefffff8f9fd343539 fafbfff7f8fcfefffff9fafe3a3b3f26272b3d3e422a2b2f36373bfbfcfffeffff222327 fefffffefffffdfeff3b3c40feffffebecf0feffff323337fdfefffeffff36373bfeffff fdfefff5f6fa2d2e32fefffffbfcff3f4044f8f9fdfeffff35363afcfdfffefffffbfcff 35363afefffffefffffbfcff36373bf2f3f7feffff35363aedeef2fefffffeffff333438 eff0f4feffff26272bf7f8fc3d3e42eff0f4feffff36373bf5f6fafdfeff3a3b3f27282c 2c2d313d3e42292a2efefffff9fafefafbfffeffff28292dfefffff9fafefdfefffeffff 2d2e32fefffffefffff3f4f8fbfcfffcfdfffefffffefffffefffffefffffefffffeffff fefffffefffffefffffefffffefffffefffffefffffefffffefffffefffffefffffeffff fefffffefffffefffffefffffefffffefffffefffffefffffefffffefffffefffffeffff fefffffefffffefffffefffffefffffefffffefffffefffffefffffefffffefffffeffff fefffffefffffefffffefffffefffffefffffefffffefffffefffffefffffefffffeffff fefffffefffffefffffefffffefffffefffffefffffefffffefffffefffffefffffeffff fefffffefffffefffffefffffefffffefffffefffffefffffefffffefffffefffffeffff fefffffefffffefffffefffffefffffefffffefffffefffffefffffefffffefffffeffff fefffffefffffefffffefffffefffffefffffefffffefffffefffffefffffefffffeffff fefffffefffffefffffefffffefffffefffffefffffefffffefffffefffffefffffeffff fefffffefffffefffffefffffefffffefffffefffffefffffffdfbfffdfff4f3f8fcffff 838790fbffffe6e9f0eff0f5f1f1f1efefefececec323232323232ecececefefeff1f1f1 e9e9e93d3d3d242424f4f4f4f4f4f4e2e2e2efefef3838382e2e2edbdbdb3d3d3d383838 e2e2e2383838313131ecececf0f0f0313131313131f0f0f0f0f0f0313131313131f0f0f0 3838383232322c2c2c3e3e3e343434353535efefeff0f0f02d2d2d383838353535202020 f2f2f2ebebebefefeff6f6f6e7e7e74848482d2d2de6e6e6fafafa2d2d2d313131f6f6f6 4242422525253939393e3e3e303030353535f9f9f92e2e2e393939eeeeeee6e6e6eeeeee e8e8e8f6f6f6efefeff0f0f0efefefe6e6e6363636323232393939333333f8f8f8323232 353535353535454545282828353535efefef4242422d2d2df2f2f2fafafae3e3e3f1f1f1 e7e7e74343432e2e2eebebebf6f6f63b3b3b1f1f1ff8f8f8252525313131fbfbfbe8e8e8 393939292929f3f3f33535352f2f2fefefefe4e4e43c3c3c343434ecececf0f0f0f8f8f8 efefefe5e5e5f7f7f7edededf0f0eeefeeeaf0f1ebf1f3eee4ecee75838ebdcfe5bcd4f0 b3cce0bdced82c3339323b40c5d3dcbeccd734393d302d28b7cbd2c9d7da252f30243139 bed4e2b4c9da848e98f9f9fbf2f4f1e5e7e4f4f6f3f0f2efeff1eee7e9e6f5f7f4edefec edefeef4f8fbe1e9eceff8fddfe8ed82878bfeffffe9e9e7ebf0eaecf1edebf1f1e7eff2 818a93dde7f3d9e5f5dee9fbdde7f3dde7f3dde7f3dde7f3dde7f3dde7f3dde7f3dde7f3 daeaf9d4e2efdde9f5e2ebf4dbe2ea3033383a3b3fe3e3e5d8e7eae1eff2333e421a2225 dadee14445493434362f2d303a4245242c2f363b3fd8dde0292d2e3b3c3ee2e4e3323232 303433d5d9daecf0f334393f2d343cdfe5f1d8e0ede2e9f9dde7f3dde7f3dde7f3dde7f3 dde7f3dde7f3dde7f3dde7f3dde8ecdce9f1dae8f3d9e9f6dce9f9d9e2f1878d99eceefa eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee f2eaf7e7f4e37b87db7280e36e77c45450c85f66ce6d80dc758fdc7988e7e5f2e0f1ecf2 f2eceeedeceaeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeefefeff3f3f3f9f9f9eaeaeaecececeaeaea f2f2f23d3d3d2c2c2cffffffe3e3e3f3f3f33d3d3d313131e2e2e23b3b3b323232f8f8f8 2f2f2f2f2f2feeeeeef5f5f5f4f4f4191919272727e2e2e2e0e0e0ffffffe4e4e4ececec 363636383838e8e8e8dededef4f4f4f0f0f0f9f9f91f1f1f333333fbfbfbf2f2f2242424 3d3d3de6e6e6e6e6e63d3d3d242424f2f2f23535351e1e1efbfbfbe7e7e7f4f4f42e2e2e 303030f1f1f13e3e3e373737dfdfdff5f5f5e0e0e0f7f7f7f7f7f7f7f7f7f1f0eeeeeeee f0f0f0e9eaeceeeff1e7ebee868b8ffafffff4f5f7393a3cfcfdfffefffffefffffeffff fdfefffefffff9fafcf5f6f828292bfefffff4f5f7fefffffeffff2d2e30fefffffeffff f1f2f4f9fafc2a2b2dfcfdfff9fafcfefffffdfefff3f4f6f4f5f74b4c4efbfcfeebecee feffff27282aedeef0fcfdfffeffff2c2d2ff9fafcfeffff292a2cf9fafcfefffff7f8fa 3c3d3ffdfeffe6e7e93b3c3ef9fafcf7f8fa2b2c2efefffffefffffcfdff2a2b2df8f9fb fbfcfefafbfd323335f4f5f7feffff323335fefffffefffff5f6f82e2f31feffffebecee 48494bf7f8fa363739fefffffeffff232426fefffffeffff2b2c2efefffffefffff2f3f5 fbfcfef8f9fbfefffffefffffeffff2e2f31f6f7f9fafbfdfefffffafbfd424345f0f1f3 fefffffefffffefffffefffffbfcfefefffffdfefffdfefffdfefffdfefffdfefffdfeff fdfefffdfefffdfefffdfefffdfefffdfefffdfefffdfefffdfefffdfefffdfefffdfeff fdfefffdfefffdfefffdfefffdfefffdfefffdfefffdfefffdfefffdfefffdfefffdfeff fdfefffdfefffdfefffdfefffdfefffdfefffdfefffdfefffdfefffdfefffdfefffdfeff fdfefffdfefffdfefffdfefffdfefffdfefffdfefffdfefffdfefffdfefffdfefffdfeff fdfefffdfefffdfefffdfefffdfefffdfefffdfefffdfefffdfefffdfefffdfefffdfeff fdfefffdfefffdfefffdfefffdfefffdfefffdfefffdfefffdfefffdfefffdfefffdfeff fdfefffdfefffdfefffdfefffdfefffdfefffdfefffdfefffdfefffdfefffdfefffdfeff fdfefffdfefffdfefffdfefffdfefffdfefffdfefffdfefffdfefffdfefffdfefffdfeff fdfefffdfefffdfefffdfefffdfefffdfefffdfefffdfefffdfefffdfefffdfefffdfeff fdfefffdfefffdfefffdfefffdfefffdfefffffdfafffefdfffffffcffff7a7f85f8fdff e0e3e8ecedf1efefefe9e9e9f5f5f5303030303030f5f5f5e9e9e9efefeff5f5f5313131 3b3b3beaeaeae7e7e7f2f2f23a3a3a2a2a2affffffe5e5e5353535333333fefefe222222 393939eeeeeee9e9e9333333333333e9e9e9e9e9e9333333333333e9e9e9292929343434 ededede3e3e3f6f6f6e3e3e3ececececececfafafae2e2e23f3f3f2d2d2d474747efefef e0e0e0dfdfdff2f2f2262626393939f0f0f0dadada393939414141d7d7d71f1f1f363636 ebebebe9e9e9eeeeeef6f6f6e2e2e23d3d3d2b2b2bf9f9f9e5e5e5fbfbfbf8f8f8dcdcdc dfdfdff2f2f2f8f8f8e5e5e5eaeaeaf5f5f53333332b2b2be4e4e4353535272727e2e2e2 e0e0e0ffffffe4e4e4ececec363636383838e8e8e8dededef4f4f4f0f0f0f9f9f91f1f1f 333333fbfbfbd9d9d9393939343434f8f8f84343432b2b2bd7d7d7f0f0f0343434313131 e9e9e93232323d3d3defefeff6f6f6313131343434e7e7e7f1f1f1e1e1e1edededf4f4f4 eaeaeaefefefe8e8e8f1f0eceff0ebebede8e7eff17e8c97bed0e6b7cfebb8d4e9bccedc 29343a27313ab6c8d4a9bbc9555e65282828bbcfdabecbd3262f3438454ec7dcefb4c9dc 747e8afffeffeaeae8fafaf8ededebe4e4e2f5f5f3f2f2f0e5e5e3efefedeae9e5ededed e4e8ebedf5f8e5ecf283888cfcfffff3f3f3ebf0eaecf1edebf1f1e7eff2818a93dde7f3 d8e4f4dce7f9dbe4f3dbe4f3dbe4f3dbe4f3dbe4f3dbe4f3dbe4f3dbe4f3d5e5f4e3f1fe dbe7f3d0dae4dde4ec3a3f4532353ad7d8dccedde2dce9ef2b363a2e373ce7ecf01b1f22 2a292ef8f7fcc5ccd2ebf2f8d4dcdfe0e5e9424649303435d4d5d74142442e3233f9fdff e2e7eb14191f424953dde5f0e6eefbd8e1f0dbe4f3dbe4f3dbe4f3dbe4f3dbe4f3dbe4f3 dbe4f3dbe4f3dbe6ecdae7efd7e5f0d6e6f5dae7f7d7e0ef858b97eaeef9eeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeef2eaf7e7f4e3 7b87db7280e36e77c45450c85f66ce6d80dc758fdc7988e7e5f2e0f1ecf2f2eceeedecea eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeefefeff1f1f1f0f0f0e6e6e6f3f3f3f2f2f2dfdfdf262626 313131d8d8d8efefef303030181818f5f5f5e6e6e63737372b2b2bf2f2f23030303b3b3b f5f5f5f3f3f3f2f2f23e3e3e4b4b4beeeeeeefefef2424243c3c3cededed3c3c3c232323 fdfdfddcdcdc444444252525e5e5e5505050161616eeeeeef3f3f3373737323232ebebeb ebebeb323232373737f3f3f32b2b2b444444fbfbfbe5e5e5f1f1f1e6e6e6292929484848 343434e4e4e4fbfbfb4040402d2d2de6e6e6efefefe0e0e0f1f0eeeeeeeef1f1f1e9eaec eeeff1e7ebee858a8ef8fdfff5f4f2555452ecebe9fffefc302f2dfffffdf4f3f1f5f4f2 fffffd42413ffffffdfefdfbfffffdfffffdfaf9f7373634f7f6f4fffffdfbfaf8fffffd 383735fffffdfffffdfaf9f742413ffbfaf8fffffd1e1d1bfffffdfffffdfffffd2d2c2a fffffdfffffdf9f8f6302f2dfffffdf4f3f1272624403f3df5f4f2fffffd282725fffffd 4b4a48f7f6f4fffffdfffffd3b3a38fbfaf8f9f8f6fffffd42413ffffffdfffffdfffffd 41403ef8f7f5fffffd1c1b19fdfcfafffffdfbfaf8383735fcfbf9fffffdf7f6f43e3d3b efeeecf8f7f5fcfbf9373634fffffdf2f1ef454442fffefce7e6e4fffffd32312ffffffd fefdfbfffffdfffffd1e1d1bfffffdfbfaf8f0efed373634e7e6e4fffffdfdfcfaf6f5f3 fefdfbfefdfbf9f8f6fffffdfffffdfffffdfffffdfffffdfffffdfffffdfffffdfffffd fffffdfffffdfffffdfffffdfffffdfffffdfffffdfffffdfffffdfffffdfffffdfffffd fffffdfffffdfffffdfffffdfffffdfffffdfffffdfffffdfffffdfffffdfffffdfffffd fffffdfffffdfffffdfffffdfffffdfffffdfffffdfffffdfffffdfffffdfffffdfffffd fffffdfffffdfffffdfffffdfffffdfffffdfffffdfffffdfffffdfffffdfffffdfffffd fffffdfffffdfffffdfffffdfffffdfffffdfffffdfffffdfffffdfffffdfffffdfffffd fffffdfffffdfffffdfffffdfffffdfffffdfffffdfffffdfffffdfffffdfffffdfffffd fffffdfffffdfffffdfffffdfffffdfffffdfffffdfffffdfffffdfffffdfffffdfffffd fffffdfffffdfffffdfffffdfffffdfffffdfffffdfffffdfffffdfffffdfffffdfffffd fffffdfffffdfffffdfffffdfffffdfffffdfffffdfffffdfffffdfffffdfffffdfffffd fffffdfffffdfffffdfffffdfcf9f4faf9f5fefffffbffff777f82faffffecf0f1f1f3f2 f6f6f6e2e2e2f4f4f4393939393939f4f4f4e2e2e2f6f6f6e5e5e53b3b3b272727eaeaea f5f5f5f0f0f03b3b3b2f2f2fe8e8e8dddddd3737372d2d2dededed3f3f3f292929eeeeee efefef343434343434efefefefefef343434343434efefef3c3c3c343434fafafaf8f8f8 252525383838ededed323232242424ffffffd6d6d6484848252525dfdfdfffffffffffff f9f9f92323233333333c3c3cffffff323232313131ffffff3b3b3b434343edededf9f9f9 2020202c2c2cf1f1f13434342c2c2cfafafaeaeaeae9e9e9eaeaeaffffffe4e4e43a3a3a 252525f4f4f4f0f0f0fdfdfd2a2a2a313131fcfcfc2e2e2e4b4b4beeeeeeefefef242424 3c3c3cededed3c3c3c232323fdfdfddcdcdc444444252525e5e5e5505050161616eeeeee ffffff333333424242cccccc2a2a2a424242f7f7f7eaeaea1a1a1a434343f9f9f9303030 303030e8e8e83131313333333a3a3aeeeeee3939393a3a3ae9e9e9f4f4f4f5f5f5efefef e5e5e5f6f5f3eeefeae7e9e6ebf3f582909bbbcde1b3cbe5c2e0f8abc0d12b384133414c c3d8e9c1d8ea9aa8b33a3f4325384926343f404853a4b1c1bcd0e8bacee68c98a8f0eff7 f8f7f3e1e0dcf0efebf6f5f13938342c2b273b3a36373632fcf3eef4efebf2f2f2f0f4f7 e9eef2797e82fafeffe9eaecedefeaeef0edecf0f1e7eff2808992d9e5f1d5e2f2d9e6f7 d6e2f0d6e2f0d6e2f0d6e2f0d6e2f0d6e2f0d6e2f0d6e2f0cdddecd7e7f6d5e3f0dce8f4 e1eaf3293038272c32eff4fadae8f1cedde42a373f333c43d3dae2484d53292c31cccfd4 f0f9ff2d363d2d363de3eaf0272c302c3135dce0e32d31342a2f33292e32d0d7dd3f464e 18202bd2dce8e6effecedae8d6e2f0d6e2f0d6e2f0d6e2f0d6e2f0d6e2f0d6e2f0d6e2f0 d6e3ebd7e4edd2e2efd3e3f2d5e5f4d3dfed838b96e8ecf7eeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeef2eaf7e7f4e37b87db7280e3 6e77c45450c85f66ce6d80dc758fdc7988e7e5f2e0f1ecf2f2eceeedeceaeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeefefefededede9e9e9e7e7e7f6f6f6f2f2f2dfdfdf5151513737373c3c3c 4242422e2e2effffffedededf7f7f72727273f3f3feeeeee3232322a2a2ae8e8e8dfdfdf ecececf0f0f02323232b2b2b3a3a3a2a2a2affffffebebebebebeb3f3f3f2f2f2f313131 303030f2f2f2e8e8e8e6e6e6484848313131e2e2e2efefef2e2e2e3939393939392e2e2e efefefe2e2e22d2d2d383838e8e8e8e3e3e3fcfcfcfdfdfd2f2f2f323232303030efefef dcdcdc3232323c3c3ceaeaeaefefeffefefeefeeecedededf0f0f0eaebedeff0f2e8ecef 868b8ff9fefffffffdeae9e737363431302efdfcfafffffdfffffd333230faf9f7333230 fbfaf8faf9f7f8f7f5fffffdf8f7f53c3b39fffffdf9f8f6fffffdf6f5f3f8f7f5302f2d 1b1a18343331e8e7e5fffffdfffffd22211ffffffdf1f0eefffffd3c3b39fdfcfaf7f6f4 f9f8f62b2a28fffffdfffffd3b3a38fffffd3b3a38353432f9f8f6f9f8f6363533fffffd f3f2f0fbfaf82c2b29fffffdfdfcfafffffd232220fffffdf1f0eefaf9f72e2d2bfffffd f7f6f4fffffd4948462c2b292b2a28fffffdfffffdeeedebfffffd2a2927fffffdfffffd f8f7f53e3d3bfffffdfffffdf9f8f62e2d2b42413f1b1a18fffffdfaf9f7fffefcfdfcfa fcfbf9464543fffffdfffffdfffffd3c3b39fffffdfffffdf6f5f3f6f5f3fffffdfffffd fbfaf8fefdfbfdfcfafdfcfafdfcfafdfcfafdfcfafdfcfafdfcfafdfcfafdfcfafdfcfa fdfcfafdfcfafdfcfafdfcfafdfcfafdfcfafdfcfafdfcfafdfcfafdfcfafdfcfafdfcfa fdfcfafdfcfafdfcfafdfcfafdfcfafdfcfafdfcfafdfcfafdfcfafdfcfafdfcfafdfcfa fdfcfafdfcfafdfcfafdfcfafdfcfafdfcfafdfcfafdfcfafdfcfafdfcfafdfcfafdfcfa fdfcfafdfcfafdfcfafdfcfafdfcfafdfcfafdfcfafdfcfafdfcfafdfcfafdfcfafdfcfa fdfcfafdfcfafdfcfafdfcfafdfcfafdfcfafdfcfafdfcfafdfcfafdfcfafdfcfafdfcfa fdfcfafdfcfafdfcfafdfcfafdfcfafdfcfafdfcfafdfcfafdfcfafdfcfafdfcfafdfcfa fdfcfafdfcfafdfcfafdfcfafdfcfafdfcfafdfcfafdfcfafdfcfafdfcfafdfcfafdfcfa fdfcfafdfcfafdfcfafdfcfafdfcfafdfcfafdfcfafdfcfafdfcfafdfcfafdfcfafdfcfa fdfcfafdfcfafdfcfafdfcfafdfcfafdfcfafdfcfafdfcfafdfcfafdfcfafdfcfafdfcfa fdfcfafdfcfafffffafcfef9fcfffff9ffff81898bfbfffff2f4f1e9eae5eaeaeaf8f8f8 ededed2d2d2d2d2d2dedededf8f8f8eaeaeaf8f8f83c3c3c313131e8e8e8e7e7e7eeeeee e9e9e93535353c3c3c3f3f3f343434292929ececec2e2e2e3d3d3debebebececec313131 313131ecececececec313131313131ecececdcdcdc353535353535262626454545efefef e7e7e7ededed343434393939343434343434edededfafafaedededd9d9d9e3e3e33b3b3b 373737ebebeb2f2f2f3a3a3ae7e7e7e6e6e6f9f9f91616163232322e2e2e3f3f3ff8f8f8 e9e9e93a3a3a2f2f2ff1f1f1eeeeeee7e7e7eeeeeeeaeaeae9e9e9e5e5e53b3b3b343434 363636161616414141f1f1f1e8e8e8e8e8e82323232b2b2b3a3a3a2a2a2affffffebebeb ebebeb3f3f3f2f2f2f313131303030f2f2f2e8e8e8e6e6e64848483131312e2e2e2c2c2c d6d6d6ffffff3333332c2c2ce0e0e0f9f9f9474747333333f3f3f3ebebeb2d2d2d3e3e3e dedede3c3c3c373737e0e0e02929293b3b3becececdfdfdff0f0f0f3f3f3ececeef8f6f7 efefedeaece9edf5f77c8a93b4c6dab7cfe798b7d3c8def3bcccd9b2c3d3b8d1e7a3bdd4 caddeec7d1dbaabed6cbd8e9c0c9d8c9d8ebb6cce4b9cee97a8597fefeffeae9e7ecebe9 f4f3f1dedddbf4f3f13332303b3a38e8e7e5f4e9e3eae2dff3f2f0f1f2f6eef3f781868c fcfffff3f4f8eeefeaeef0edecf0f1e6eef17f8891d7e3efd2dfefd3e3f3d3e0f0d3e0f0 d3e0f0d3e0f0d3e0f0d3e0f0d3e0f0d3e0f0d9e9f9d4e4f3d3e0f0d6e4f1c6d2de303a44 2e3740c4cdd6d7e5f2dbe9f428344016232ce8f2fbc9d2db333a423e454d0e1b24313b45 ced8e2dde6ef363f461d242ce2e7ed2b3036363d45d6dfe62f38412a343eeff9ffd2deea cddbe8d7e5f2d3e0f0d3e0f0d3e0f0d3e0f0d3e0f0d3e0f0d3e0f0d3e0f0d4e0ecd4e2ef d0e0efd0e1f1d3e3f3d2deec828a95e7eef6eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeef2eaf7e7f4e37b87db7280e36e77c45450c8 5f66ce6d80dc758fdc7988e7e5f2e0f1ecf2f2eceeedeceaeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeef2f2f2f2f2f2efefefebebebe5e5e5fdfdfdcfcfcfeaeaeaf0f0f0e4e4e4fafafa dededefafafadededef1f1f1dcdcdcf7f7f7e2e2e2f9f9f9f1f1f1e8e8e8ffffffdbdbdb fcfcfcf2f2f2f2f2f2f6f6f6d3d3d3fbfbfbededede5e5e5f8f8f8eeeeeef3f3f3eaeaea fdfdfde2e2e2e7e7e7ecececf9f9f9e6e6e6f5f5f5ebebebebebebf5f5f5e6e6e6f9f9f9 fafafadfdfdffdfdfdf9f9f9d9d9d9eaeaea2f2f2f272727eeeeeef2f2f2fefefef0f0f0 e0e0e0fcfcfcedededeaeaeaedeceaebebebefefefeaebedf0f1f3e9edf0878c90faffff f0efedfffffdfffffdf8f7f5fefdfbfaf9f7efeeecfffffdfdfcfafaf9f7faf9f7fffffd faf9f7f6f5f3fffffdefeeecfffffdfffffdf0efedfffffdfffefcfefdfbfffffdfffffd fffffdfffffdefeeecfffffdfcfbf9fffffdf9f8f6f2f1effffffdfffffdfffffdfffffd fffffde3e2e0363533fffffdecebe9fffffdfffffdf9f8f6f3f2f0fffffdfffffdfffffd fffffdebeae8fffffdfbfaf8fffffdf9f8f6fffffdfffffdf8f7f5fffffdeeedebfbfaf8 f7f6f4fffffdfffffdfffffdfffffdfffefcfffffdfffffde8e7e5fffffdfffffdeeedeb f7f6f4fffffdebeae8fffffdfffffdfffffdfffffdf9f8f6fbfaf8fffffdfbfaf8eae9e7 f9f8f6fffefcfffffdf8f7f5f4f3f1f2f1effffffdfffffdfffffdfffffdfffffdfffffd fffffdfffffdfffffdfffffdfffffdfffffdfffffdfffffdfffffdfffffdfffffdfffffd fffffdfffffdfffffdfffffdfffffdfffffdfffffdfffffdfffffdfffffdfffffdfffffd fffffdfffffdfffffdfffffdfffffdfffffdfffffdfffffdfffffdfffffdfffffdfffffd fffffdfffffdfffffdfffffdfffffdfffffdfffffdfffffdfffffdfffffdfffffdfffffd fffffdfffffdfffffdfffffdfffffdfffffdfffffdfffffdfffffdfffffdfffffdfffffd fffffdfffffdfffffdfffffdfffffdfffffdfffffdfffffdfffffdfffffdfffffdfffffd fffffdfffffdfffffdfffffdfffffdfffffdfffffdfffffdfffffdfffffdfffffdfffffd fffffdfffffdfffffdfffffdfffffdfffffdfffffdfffffdfffffdfffffdfffffdfffffd fffffdfffffdfffffdfffffdfffffdfffffdfffffdfffffdfffffdfffffdfffffdfffffd fffffdfffffdfffffdfffffdfffffdfffffdfffffdfffffdfffffdfffffdfffffdfffffd fbfdfaf0f4f3f3fbfdf1fbfd7e8889f9ffffeef0edeaebe6f5f5f5e0e0e0f2f2f2f4f4f4 f4f4f4f2f2f2e0e0e0f5f5f5e1e1e1e2e2e2f4f4f4f2f2f2ffffffe3e3e3f5f5f5f3f3f3 dcdcdcf4f4f4f8f8f8f0f0f0f0f0f0f5f5f5e6e6e6edededf0f0f0efefefefefeff0f0f0 f0f0f0efefefefefeff0f0f0f4f4f4fefefed8d8d8f1f1f1e8e8e8eaeaeae3e3e3fefefe f6f6f6e2e2e2efefefe3e3e3f3f3f3e6e6e6f9f9f9f1f1f1fdfdfd2c2c2c292929ededed e0e0e0f4f4f4f1f1f1f7f7f7e7e7e7ffffffefefeff1f1f1e6e6e6eaeaeaf4f4f4e6e6e6 f6f6f6e8e8e8e7e7e7fbfbfbe6e6e6e6e6e6edededfbfbfbf8f8f8e4e4e4ecececf1f1f1 eaeaeaeeeeeee3e3e3fbfbfbfcfcfcf2f2f2f2f2f2f6f6f6d3d3d3fbfbfbededede5e5e5 f8f8f8eeeeeef3f3f3eaeaeafdfdfde2e2e2e7e7e7ecececf8f8f8edededfefefeececec e4e4e4f0f0f0fbfbfbe0e0e0e3e3e3ebebebcfcfcfffffffe3e3e3ffffffededede5e5e5 eaeaeafffffffbfbfbe9e9e9f5f5f5f2f2f2eaeaeae6e6e6f1f0f5f2f0f3ededebf2f4f1 edf5f775848bb5c8d9c0d9efb9d8f4b4cadfbacad9c7d8eab5cfe6c0dbf6b9cee3bfcdda b0c5e0ccdbf0bac6d6bbcadfb6cee8c2daf4707d8ef7faffeff0f2feffffeff0f2f2f3f5 f3f4f6f0f1f3dcdddff6f7f9f7efecece6e6f3f3f5ebeef5e4e8f183888ef5f8fde8e9ed efeeeaefefedeeeff1e8edf17d8790d4e2edcdddeccfe0f0d1deeed1deeed1deeed1deee d1deeed1deeed1deeed1deeecadbebcbdcecd3e3f2cfdfeeddebf8cad8e5d1dfece2eefa d2e2f2d4e1f1d1deeed2e0edcad6e4d9e5f1cbd5dfc3cdd7e0edfde6f4ffc3cfddd4e0ec bec8d2e3ebf6dae3ec232c35232d37e1ebf7c2ccd8c4d0dcd4e2efc1cfdcdeeefdd5e5f4 d1deeed1deeed1deeed1deeed1deeed1deeed1deeed1deeed2e0edd1e1f0cddeeecee1f2 d1e2f2d1dfec828c96e8eff7eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeef2eaf7e7f4e37b87db7280e36e77c45450c85f66ce6d80dc 758fdc7988e7e5f2e0f1ecf2f2eceeedeceaeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeededed eaeaeaf1f1f1eeeeeee5e5e5fcfcfcfafafaf4f4f4f1f1f1e4e4e4fafafae7e7e7e1e1e1 f3f3f3f9f9f9e9e9e9fcfcfcf1f1f1e2e2e2e6e6e6f5f5f5e6e6e6fefefeececece7e7e7 ecececf3f3f3fafafaeeeeeee8e8e8f0f0f0e2e2e2ededede1e1e1f7f7f7efefeff5f5f5 e4e4e4f7f7f7eaeaeaeaeaeaf2f2f2eaeaeaeaeaeaf2f2f2eaeaeaeaeaeaeeeeeef4f4f4 d9d9d9f8f8f83c3c3c333333333333fffffff3f3f3e8e8e8ebebebeaeaeaecececf4f4f4 f4f4f4e3e3e3edeceaebebebf0f0f0ebeceef1f2f4e9edf0868b8ff9fefffeffffeff0f2 f4f5f7fafbfdfefffffefffff0f1f3fefffffefffffcfdfff9fafce0e1e3fefffffeffff fafbfdfefffffefffff1f2f4fcfdfff6f7f9fefffff8f9fbeeeff1feffffeff0f2feffff fafbfde9eaecfefffff9fafceff0f2fefffffefffff7f8fafefffffafbfdf8f9fbfeffff 393a3cf9fafcfeffffe6e7e9f8f9fbfdfefff9fafcfdfefffefffff7f8faf9fafcfeffff fefffffefffff0f1f3fdfefffefffff5f6f8fefffffefffffefffffefffffafbfdf4f5f7 fefffff1f2f4fdfefffeffffecedeff6f7f9fefffffeffffeff0f2fefffffefffffdfeff f8f9fbf2f3f5feffffe8e9ebfefffffefffff3f4f6fefffffefffffefffffefffff8f9fb f4f5f7fefffffefffffefffffefffff5f6f8f1f2f4f5f6f8fefffffefffffefffffeffff fefffffefffffefffffefffffefffffefffffefffffefffffefffffefffffefffffeffff fefffffefffffefffffefffffefffffefffffefffffefffffefffffefffffefffffeffff fefffffefffffefffffefffffefffffefffffefffffefffffefffffefffffefffffeffff fefffffefffffefffffefffffefffffefffffefffffefffffefffffefffffefffffeffff fefffffefffffefffffefffffefffffefffffefffffefffffefffffefffffefffffeffff fefffffefffffefffffefffffefffffefffffefffffefffffefffffefffffefffffeffff fefffffefffffefffffefffffefffffefffffefffffefffffefffffefffffefffffeffff fefffffefffffefffffefffffefffffefffffefffffefffffefffffefffffefffffeffff fefffffefffffefffffefffffefffffefffffefffffefffffefffffefffffefffffeffff fefffffefffffefffffefffffefffffefffffefffffefffffefffffefffffbfffff9ffff f8fffff3feff899297f6fbfee9ebeaf4f4f2e9e9e9f6f6f6ebebebe8e8e8e8e8e8ebebeb f6f6f6e9e9e9fcfcfceaeaeaf2f2f2eaeaeae9e9e9e9e9e9eeeeeeeaeaeaffffffd6d6d6 e8e8e8e8e8e8f8f8f8e2e2e2efefefefefefedededebebebebebebededededededebebeb ebebebedededdbdbdbfefefef0f0f0ddddddf6f6f6f4f4f4ffffffd5d5d5efefefededed e1e1e1fdfdfdebebebf1f1f1e2e2e2f2f2f2ececec2c2c2c353535fffffff5f5f5e6e6e6 e8e8e8ececece6e6e6f6f6f6dededefefefef3f3f3eaeaeaf4f4f4e8e8e8dfdfdffbfbfb fbfbfbd9d9d9f0f0f0ffffffdadadae6e6e6d2d2d2f6f6f6fbfbfbecececefefefe9e9e9 ffffffe3e3e3ececece7e7e7ecececf3f3f3fafafaeeeeeee8e8e8f0f0f0e2e2e2ededed e1e1e1f7f7f7efefeff5f5f5e4e4e4f7f7f7e1e1e1e9e9e9f0f0f0dfdfdff8f8f8f3f3f3 ecececf1f1f1ffffffecececfcfcfcf0f0f0ececece5e5e5f9f9f9f0f0f0f8f8f8d6d6d6 edededebebebeaeaeaf2f2f2fdfdfdf3f3f3f1f0f6e8e6ebebebebf6f8f5e9f2f178878e bfd2e1bbd4e8c1dcf7b0c2d6bdcadac6d5e8a7c1dabcd7f2a6bcd3c5d2e2c7dcf7b4c5d9 b8c4d4c7d8eaaac2dab5cde58b9ba8fcfffff1f6fccacfd5dbe0e6eff4faebf0f6e0e5eb f2f7fde9eef4f2f1f7e8ebf2e8ecf5e2eaf5d7dde9989ca5fefffff6f5faf1edeaf0efed eeeff1e8edf17c868fd3e1ecc9dbe9caddeccdddedcdddedcdddedcdddedcdddedcddded cdddedcdddedd5e6f6c8d9e9d0e1f1c9daeac2d3e3d0e1f1d8e9f9b6c7d7cbdaefc7d6e9 cddcefd9e9f9c7d7e6d6e6f5d5e5f2e1f1fed1e1f1bacadad6e6f6c7d4e4d9e5f3ccd8e6 d8e2ee2e3844263242d6e2f2d5e2f2d2dfefdbebfad4e6f4bdcfddc1d3e1cdddedcddded cdddedcdddedcdddedcdddedcdddedcdddedd0ddeecfdef1cadcf0ccdef2cee1f0cedeeb 828c95e7f0f7eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeef2eaf7e7f4e37b87db7280e36e77c45450c85f66ce6d80dc758fdc7988e7 e5f2e0f1ecf2f2eceeedeceaeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeedededececece1e1e1ededed f6f6f6ededede9e9e9e3e3e3e1e1e1ffffffdfdfdff4f4f4e8e8e8f0f0f0ffffffdedede eaeaeaeeeeeef3f3f3f3f3f3e9e9e9fbfbfbdddddde5e5e5e8e8e8ffffffe1e1e1e3e3e3 eaeaeaf1f1f1f7f7f7f5f5f5fffffff1f1f1f3f3f3f4f4f4e2e2e2e4e4e4f2f2f2f3f3f3 edededf0f0f0f7f7f7ebebebebebebf7f7f7f0f0f0edededefefeff3f3f3f3f3f3eeeeee eaeaeaeeeeeee6e6e6e7e7e7dcdcdcfdfdfdebebebebebebf8f8f8ededede6e6e6fbfbfb f0efedeeeeeef2f2f2ecedeff1f2f4e7ebee83888cf5fafeeef3f7fbfffff9fefffbffff fbffffeef3f7fbfffff3f8fce9eef2fbfffffbfffffbfffff5fafef3f8fcf8fdfff6fbff f6fbfff7fcfffbfffffbffffe1e6eafbfffffbfffff8fdfff6fbfffbfffffbfffffbffff fafffffbfffff7fcfff6fbfff2f7fbf8fdfffbfffff9fefff2f7fbfbfffff0f5f9faffff fafffffbfffff4f9fdfbfffff5fafefbfffffbfffff7fcfffbfffff6fbfff4f9fdfaffff fbfffffbfffffbfffff9fefffbffffeef3f7e9eef2fbfffffbfffffbfffffbfffff8fdff fafffffbfffffbfffffbfffff2f7fbf9fefffbfffff9fefffbfffff7fcfffbfffffbffff ecf1f5fbfffffbfffff9fefffbfffff1f6faf7fcffe5eaeefbfffffbfffffbfffff3f8fc fbffffeff4f8f5fafef5fafefbfffffbfffffbfffff2f7fbf9fefff9fefff9fefff9feff f9fefff9fefff9fefff9fefff9fefff9fefff9fefff9fefff9fefff9fefff9fefff9feff f9fefff9fefff9fefff9fefff9fefff9fefff9fefff9fefff9fefff9fefff9fefff9feff f9fefff9fefff9fefff9fefff9fefff9fefff9fefff9fefff9fefff9fefff9fefff9feff f9fefff9fefff9fefff9fefff9fefff9fefff9fefff9fefff9fefff9fefff9fefff9feff f9fefff9fefff9fefff9fefff9fefff9fefff9fefff9fefff9fefff9fefff9fefff9feff f9fefff9fefff9fefff9fefff9fefff9fefff9fefff9fefff9fefff9fefff9fefff9feff f9fefff9fefff9fefff9fefff9fefff9fefff9fefff9fefff9fefff9fefff9fefff9feff f9fefff9fefff9fefff9fefff9fefff9fefff9fefff9fefff9fefff9fefff9fefff9feff f9fefff9fefff9fefff9fefff9fefff9fefff9fefff9fefff9fefff9fefff9fefff9feff f9fefff9fefff9fefff9fefff9fefff9fefff9fefff9fefff6fdfff8fffff2fcffdfe9f3 949da6fbffffe3e4e8efedeef0f0f0f0f0f0eaeaeaf2f2f2f2f2f2eaeaeaf0f0f0f0f0f0 ecececf4f4f4dededee9e9e9f7f7f7e7e7e7efefefeeeeeee7e7e7ffffffe9e9e9ebebeb e2e2e2fcfcfcdfdfdff0f0f0f3f3f3ececececececf3f3f3f3f3f3ececececececf3f3f3 f8f8f8dcdcdcfdfdfdf3f3f3eeeeeed5d5d5f3f3f3f6f6f6e6e6e6fcfcfceeeeeee7e7e7 f7f7f7f0f0f0e2e2e2f8f8f8ffffffdededef4f4f4e6e6e6dfdfdfffffffe0e0e0fbfbfb efefeffafafaececece5e5e5edededefefefdededefffffffafafae0e0e0f3f3f3f1f1f1 e5e5e5f4f4f4f3f3f3eaeaeaf8f8f8fcfcfce8e8e8dbdbdbfbfbfbececece6e6e6e8e8e8 e8e8e8ffffffe1e1e1e3e3e3eaeaeaf1f1f1f7f7f7f5f5f5fffffff1f1f1f3f3f3f4f4f4 e2e2e2e4e4e4f2f2f2f3f3f3fcfcfce8e8e8efefeff1f1f1f3f3f3e9e9e9f1f1f1ececec e2e2e2efefefe2e2e2fefefee2e2e2f6f6f6f2f2f2eeeeeee5e5e5fefefef2f2f2f2f2f2 ffffffd5d5d5e8e8e8e5e5e5f1f0f8e5e3e8efefeff4f6f3e0e9e8829196c8dbe99fb9ca b3cbe5bbcaddc7d0dfc0cddeb3c9e1b3cee9b4c8e0cedaeaaac2dacddef0c0cedbb8c9d9 c2ddf2afcadd74858de9efef78828e909aa68b95a19ba5b1616b77808a967c8692848e9a 7d86957d89977a86968793a3868f9e7d818cebecf1eae8edf2edeaf2eeedefeff1e8edf1 7c868fcfe0eac6d9e7c6dceacad9eccad9eccad9eccad9eccad9eccad9eccad9eccad9ec cddeeebfd0e0caddeed6e9fac6d9eac1d4e5cde0f1d0e3f4d1e0f7bdcce3ccdbf0d7e8fc b2c3d5c7d8e8d4e5f5b6c7d7becfe3d2e3f7c8d9ebd5e4f7cddaebc8d5e5c8d4e4cdd9e7 c8d5e6d5e2f3c4d4e4c8d8e8c6d7e7cfe2f1daedfbc5d8e6cad9eccad9eccad9eccad9ec cad9eccad9eccad9eccad9ecccdbeecbdcf0c7d9efc7dcefcbdeefccdce97e8b93e6eff4 eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee f2eaf7e7f4e37b87db7280e36e77c45450c85f66ce6d80dc758fdc7988e7e5f2e0f1ecf2 f2eceeedeceaeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeecececf8f8f8eeeeeeececececececececec edededf4f4f4efefeff0f0f0eaeaeae7e7e7fbfbfbe9e9e9e4e4e4f3f3f3f9f9f9e6e6e6 e4e4e4fcfcfce4e4e4f0f0f0ecececf5f5f5f4f4f4e0e0e0fafafaf1f1f1efefefe9e9e9 eaeaeaedededececece9e9e9efefeff6f6f6e4e4e4fafafaf9f9f9dededef4f4f4eeeeee dcdcdcf9f9f9f9f9f9dcdcdceeeeeef4f4f4edededf2f2f2e8e8e8efefefe6e6e6f7f7f7 efefefeeeeeeefefeff4f4f4e2e2e2f9f9f9e4e4e4ecececf3f3f3e9e9e9f3f2f0f1f1f1 f4f4f4edeef0f0f1f3e5e9ec808589f2f7fb8b949b7079808c959c798289798289868f96 7d868d7d868d838c938992997e878e757e85858e95899299727b82858e95737c839da6ad 6b747b6e777ea0a9b0727b82838c937c858c8089907b848b8790977b848b7e878e828b92 838c937e878e848d947f888f798289848d947d868d818a918992997f888f7b848b838c93 7c858c798289868f967b848b7881888089907e878e838c93818a91848d947c858c818a91 7f888f838c937e878e8f989f8c959c778087767f86808990798289879097838c937c858c 7f888f8992997881888a939a757e85828b92818a918992996f787f808990848d94818a91 828b927c858c868f967b848b879097818a917c858c7f888f778087838c93858e95818a91 818a918089908c959c717a81858e957c858c818a91818a91818a91818a91818a91818a91 818a91818a91818a91818a91818a91818a91818a91818a91818a91818a91818a91818a91 818a91818a91818a91818a91818a91818a91818a91818a91818a91818a91818a91818a91 818a91818a91818a91818a91818a91818a91818a91818a91818a91818a91818a91818a91 818a91818a91818a91818a91818a91818a91818a91818a91818a91818a91818a91818a91 818a91818a91818a91818a91818a91818a91818a91818a91818a91818a91818a91818a91 818a91818a91818a91818a91818a91818a91818a91818a91818a91818a91818a91818a91 818a91818a91818a91818a91818a91818a91818a91818a91818a91818a91818a91818a91 818a91818a91818a91818a91818a91818a91818a91818a91818a91818a91818a91818a91 818a91818a91818a91818a91818a91818a91818a91818a91818a91818a91818a91818a91 818a91818a91818a91818a91818a91818a91808692848c977b859184909e79838ffbffff e7e8edf3f1f4eeeeeee9e9e9f3f3f3efefefefefeff3f3f3e9e9e9eeeeeef0f0f0e1e1e1 ffffffe6e6e6f5f5f5efefefefefeff0f0f0eeeeeee9e9e9eaeaeaf5f5f5ededede6e6e6 f0f0f0f0f0f0ecececefefefefefefececececececefefefefefefecececebebebf7f7f7 e3e3e3e9e9e9f6f6f6f3f3f3eaeaeaebebebefefefe2e2e2f5f5f5f6f6f6e2e2e2ebebeb fdfdfde9e9e9e6e6e6fcfcfcebebebe5e5e5ffffffddddddf9f9f9e4e4e4ebebebebebeb edededf3f3f3edededf2f2f2f1f1f1e9e9e9ebebebe8e8e8e9e9e9f2f2f2f3f3f3e7e7e7 f0f0f0f0f0f0f1f1f1e4e4e4eaeaeaf1f1f1efefefededededededf1f1f1f4f4f4e0e0e0 fafafaf1f1f1efefefe9e9e9eaeaeaedededececece9e9e9efefeff6f6f6e4e4e4fafafa f9f9f9dededee5e5e5fcfcfceaeaeae4e4e4fdfdfdebebebe1e1e1f6f6f6f4f4f4f5f5f5 eaeaeaeaeaeaf5f5f5eaeaeae8e8e8f4f4f4f6f6f6dbdbdbf4f4f4ddddddf0f0f0f9f9f9 f3f3f3f1f1f1f4f3fbe9e6edf6f6f6f1f3f0d8e1e08a999eccdfed809aab6c829a8592a3 818996717d8d8599b16f89a47e90a67581917c94ac7485977e8c99778a98698497849fb0 73848b838985818e9e7481917e8b9b6e7b8b8996a67986968390a07582927b8ca07f90a4 6f80947e8da0778393888e9af5f4faf8f3f7f2edeaf2eeedefeff1e8edf17b858ecfe0ea c5d8e6c4dae8c7d8eac7d8eac7d8eac7d8eac7d8eac7d8eac7d8eac7d8eac8d9ebcde0f1 c8dbecc5d8e9c5daedcadff2c5daedc4d9ecc4d2ecd5e3fdc0d0e7c2d3e7d5e6facee1f2 c3d6e7cfe2f1c7d9efcee0f4c5d6eab9c8dbceddf0cedbeccad7e7c9d5e5cddaedc3d2e5 d9e8fbc1d2e4c4d7e6c0d3e2c7ddebc3d9e6c7d8eac7d8eac7d8eac7d8eac7d8eac7d8ea c7d8eac7d8eac9d8edc8d8efc5d7edc4d9eec9dcedcadae77d8a92e3eef2eeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeef2eaf7e7f4e3 7b87db7280e36e77c45450c85f66ce6d80dc758fdc7988e7e5f2e0f1ecf2f2eceeedecea eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeebebebeaeaeaeaeaeaeaeaea edededf0f0f0f4f4f4f6f6f6fefefefefefefefefefefefefefefefefefefefefefefefe fefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefe fefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefe fefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefe fefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefe fefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefe fefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefe fefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefe fefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefe fefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefe fefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefe fefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefe fefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefe fefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefe fefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefe fefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefe fefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefe fefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefe fefefefefefefefefefefefefcfcfcfdfdfdfffffffffffffdfdfdf8f8f8f3f3f3f0f0f0 eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee f0f0f0efefefededededededefefeff4f4f4f9f9f9fcfcfcfefefefefefefefefefefefe fefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefe fefefefefefefefefefefefefefefefefefefefefefefefefcfcfcfdfdfdfefefefefefe fdfdfdfafafaf8f8f8f6f6f6f3eeebefebeaf5f6faedf4fc707c8acbdeefbbd1e6bcd4ec c3d3e2c3d3e2c3d3e2c3d3e2c3d3e2c3d3e2c3d3e2c3d3e2c3d3e2c3d3e2c3d3e2c3d3e2 c3d3e2c3d3e2c3d3e2c3d3e2c3d3e2c3d3e2c3d3e2c3d3e2c3d3e2c3d3e2c3d3e2c3d3e2 c3d3e2c3d3e2c3d3e2c3d3e2c3d3e2c3d3e2c3d3e2c3d3e2c3d3e2c3d3e2c3d3e2c3d3e2 c3d3e2c3d3e2c3d3e2c3d3e2c3d3e2c3d3e2c3d3e2c3d3e2c3d3e2c3d3e2c3d3e2c3d3e2 bdd8dfcbe6f1b9d4e5b6cfe5c0d7e9cbdde77f8d8ee8f3edeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeef2eaf7e7f4e37b87db7280e3 6e77c45450c85f66ce6d80dc758fdc7988e7e5f2e0f1ecf2f2eceeedeceaeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeedededecececebebebecececefefef f1f1f1f3f3f3efefefefefefefefefefefefefefefefefefefefefefefefefefefefefef efefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefef efefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefef efefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefef efefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefef efefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefef efefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefef efefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefef efefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefef efefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefef efefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefef efefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefef efefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefef efefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefef efefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefef efefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefef efefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefef efefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefef efefefefefefefefeff1f1f1f2f2f2f3f3f3f2f2f2efefefecececeaeaeaeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeef1f1f1efefef eeeeeeedededeeeeeef0f0f0f3f3f3f5f5f5efefefefefefefefefefefefefefefefefef efefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefef efefefefefefefefefefefefefefefefefeff0f0f0f1f1f1f2f2f2f3f3f3f2f2f2f0f0f0 eeeeeeecececefeae7eae6e7eff0f4e9f0f8737f8bc6d7e7bfd4e7cbe1f6c3d8edc3d8ed c3d8edc3d8edc3d8edc3d8edc3d8edc3d8edc3d8edc3d8edc3d8edc3d8edc3d8edc3d8ed c3d8edc3d8edc3d8edc3d8edc3d8edc3d8edc3d8edc3d8edc3d8edc3d8edc3d8edc3d8ed c3d8edc3d8edc3d8edc3d8edc3d8edc3d8edc3d8edc3d8edc3d8edc3d8edc3d8edc3d8ed c3d8edc3d8edc3d8edc3d8edc3d8edc3d8edc3d8edc3d8edc3d8edc3d8edb5cadbc2d8ed bfd7f1cbe0fdcee2fbc6d5e87d8791e5ecf2eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeef2eaf7e7f4e37b87db7280e36e77c45450c8 5f66ce6d80dc758fdc7988e7e5f2e0f1ecf2f2eceeedeceaeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeef1f1f1f0f0f0eeeeeeececececececedededeeeeeeefefef ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb ececececececedededeeeeeeefefefefefefeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeef0f0f0efefefeeeeeeededed ededededededeeeeeeeeeeeeebebebebebebebebebebebebebebebebebebebebebebebeb ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb ebebebebebebebebebebebebecececedededeeeeeeefefefefefefeeeeeeecececebebeb f5f1f0efedeef4f5f9f0f5fb86909abccad7b2c3d3c2d5e6b9d2e8b9d2e8b9d2e8b9d2e8 b9d2e8b9d2e8b9d2e8b9d2e8b9d2e8b9d2e8b9d2e8b9d2e8b9d2e8b9d2e8b9d2e8b9d2e8 b9d2e8b9d2e8b9d2e8b9d2e8b9d2e8b9d2e8b9d2e8b9d2e8b9d2e8b9d2e8b9d2e8b9d2e8 b9d2e8b9d2e8b9d2e8b9d2e8b9d2e8b9d2e8b9d2e8b9d2e8b9d2e8b9d2e8b9d2e8b9d2e8 b9d2e8b9d2e8b9d2e8b9d2e8b9d2e8b9d2e8b9d2e8b9d2e8c3d4e8c3d3ecbbcceabfcff0 bac9e6b1bbd4808799edf1fdeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeef2eaf7e7f4e37b87db7280e36e77c45450c85f66ce6d80dc 758fdc7988e7e5f2e0f1ecf2f2eceeedeceaeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeef1f1f1f0f0f0eeeeeeededededededededededededeeeeeef0f0f0f0f0f0 f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0efefefefefef efefefefefeff0f0f0f1f1f1f2f2f2f2f2f2eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeededed ecececebebebf0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 f0f0f0f0f0f0ededededededefefeff0f0f0f0f0f0f0f0f0f0f0f0efefeff9f5f6efedee ebeaefe2e5ea868d95949ca777838f7f8b99798b99798b99798b99798b99798b99798b99 798b99798b99798b99798b99798b99798b99798b99798b99798b99798b99798b99798b99 798b99798b99798b99798b99798b99798b99798b99798b99798b99798b99798b99798b99 798b99798b99798b99798b99798b99798b99798b99798b99798b99798b99798b99798b99 798b99798b99798b99798b99798b99798b99818a997d89997885987e8aa08592a5979eae 8a8e9ae9e9f3eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeef2eaf7e7f4e37b87db7280e36e77c45450c85f66ce6d80dc758fdc7988e7 e5f2e0f1ecf2f2eceeedeceaeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeedededeeeeeeeeeeeeefefefefefefeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeefefefefefefeeeeeeededed ededededededeeeeeeefefefeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeedededeeeeeeefefefefefeff0f0f0efefefeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eaeaeaebebebecececedededeeeeeeeeeeeeeeeeeeeeeeeee5e3e4e5e5e7ebebedfcfdff dcdfe4edf2f8e0e7efebf2faecf0f1ecf0f1ecf0f1ecf0f1ecf0f1ecf0f1ecf0f1ecf0f1 ecf0f1ecf0f1ecf0f1ecf0f1ecf0f1ecf0f1ecf0f1ecf0f1ecf0f1ecf0f1ecf0f1ecf0f1 ecf0f1ecf0f1ecf0f1ecf0f1ecf0f1ecf0f1ecf0f1ecf0f1ecf0f1ecf0f1ecf0f1ecf0f1 ecf0f1ecf0f1ecf0f1ecf0f1ecf0f1ecf0f1ecf0f1ecf0f1ecf0f1ecf0f1ecf0f1ecf0f1 ecf0f1ecf0f1ecf0f1ecf0f1ebeff0eef3f6e9f3f5e0eaecdee8eae8edf0d1d3d2f8f8f6 eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee f2eaf7e7f4e37b87db7280e36e77c45450c85f66ce6d80dc758fdc7988e7e5f2e0f1ecf2 f2eceeedeceaeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeecececececec edededeeeeeeeeeeeeefefefefefeff0f0f0edededededededededededededededededed edededededededededededededededededededededededededededededededededededed edededededededededededededededededededededededededededededededededededed edededededededededededededededededededededededededededededededededededed edededededededededededededededededededededededededededededededededededed edededededededededededededededededededededededededededededededededededed edededededededededededededededededededededededededededededededededededed edededededededededededededededededededededededededededededededededededed edededededededededededededededededededededededededededededededededededed edededededededededededededededededededededededededededededededededededed edededededededededededededededededededededededededededededededededededed edededededededededededededededededededededededededededededededededededed edededededededededededededededededededededededededededededededededededed edededededededededededededededededededededededededededededededededededed edededededededededededededededededededededededededededededededededededed edededededededededededededededededededededededededededededededededededed edededededededededededededededededededededededededededededededededededed edededededededededededededededededededededededededededededededededededed ededededededededededededededededededf1f1f1f0f0f0efefefeeeeeeedededededed ededededededeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeededededededeeeeeef0f0f0f0f0f0f0f0f0f0f0f0f0f0f0edededededed edededededededededededededededededededededededededededededededededededed ededededededededededededededededededededededededededededededecececececec ededededededeeeeeeeeeeeeefefefefefeffbfbfdfafafcf0f0f2f6f6f8f0eff4f3f4f8 ecedf1f2f3f7f0ebe5f0ebe5f0ebe5f0ebe5f0ebe5f0ebe5f0ebe5f0ebe5f0ebe5f0ebe5 f0ebe5f0ebe5f0ebe5f0ebe5f0ebe5f0ebe5f0ebe5f0ebe5f0ebe5f0ebe5f0ebe5f0ebe5 f0ebe5f0ebe5f0ebe5f0ebe5f0ebe5f0ebe5f0ebe5f0ebe5f0ebe5f0ebe5f0ebe5f0ebe5 f0ebe5f0ebe5f0ebe5f0ebe5f0ebe5f0ebe5f0ebe5f0ebe5f0ebe5f0ebe5f0ebe5f0ebe5 f0ebe5f0ebe5e5e4dfe9eae4eef3ece8efe8edf4ecfefffaf1f0ebf9f6f1eeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeef2eaf7e7f4e3 7b87db7280e36e77c45450c85f66ce6d80dc758fdc7988e7e5f2e0f1ecf2f2eceeedecea eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeededededededeeeeeeeeeeee efefefefefefefefefeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeef1f1f1f0f0f0f0f0f0f0f0f0f0f0f0efefefefefefefefef eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeefefefefefeff0f0f0f0f0f0eeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeef0f0f0f0f0f0f0f0f0f0f0f0 f0f0f0f0f0f0f1f1f1f1f1f1eaeaecf4f4f6e7e7e9e4e4e6f0eeefedebecede9eaf2eeed efeee9efeee9efeee9efeee9efeee9efeee9efeee9efeee9efeee9efeee9efeee9efeee9 efeee9efeee9efeee9efeee9efeee9efeee9efeee9efeee9efeee9efeee9efeee9efeee9 efeee9efeee9efeee9efeee9efeee9efeee9efeee9efeee9efeee9efeee9efeee9efeee9 efeee9efeee9efeee9efeee9efeee9efeee9efeee9efeee9efeee9efeee9efeee9efeee9 fff8f9f4eeeef2f1ede8eae5e5e7e2ececeaeae6e7e9e3e5eeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeef2eaf7e7f4e37b87db7280e3 6e77c45450c85f66ce6d80dc758fdc7988e7e5f2e0f1ecf2f2eceeedeceaeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeefefefefefefefefefeeeeee edededededededededededededededededededededededededededededededededededed edededededededededededededededededededededededededededededededededededed edededededededededededededededededededededededededededededededededededed edededededededededededededededededededededededededededededededededededed edededededededededededededededededededededededededededededededededededed edededededededededededededededededededededededededededededededededededed edededededededededededededededededededededededededededededededededededed edededededededededededededededededededededededededededededededededededed edededededededededededededededededededededededededededededededededededed edededededededededededededededededededededededededededededededededededed edededededededededededededededededededededededededededededededededededed edededededededededededededededededededededededededededededededededededed edededededededededededededededededededededededededededededededededededed edededededededededededededededededededededededededededededededededededed edededededededededededededededededededededededededededededededededededed edededededededededededededededededededededededededededededededededededed edededededededededededededededededededededededededededededededededededed edededededededededededededededededededededededededededededededededededed ededededededececececececedededeeeeeeeeeeeeeeeeeeededededededeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeef0f0f0efefef eeeeeeedededededededededeeeeeeeeeeeeedededededededededededededededededed edededededededededededededededededededededededededededededededededededed ededededededededededededededededededefefefefefefeeeeeeededededededeeeeee eeeeeeefefefe2e3e7f8f8faf1f1f3eae8e9fefafbf1edecf1ece9f2edeaebeff0ebeff0 ebeff0ebeff0ebeff0ebeff0ebeff0ebeff0ebeff0ebeff0ebeff0ebeff0ebeff0ebeff0 ebeff0ebeff0ebeff0ebeff0ebeff0ebeff0ebeff0ebeff0ebeff0ebeff0ebeff0ebeff0 ebeff0ebeff0ebeff0ebeff0ebeff0ebeff0ebeff0ebeff0ebeff0ebeff0ebeff0ebeff0 ebeff0ebeff0ebeff0ebeff0ebeff0ebeff0ebeff0ebeff0ebeff0ebeff0fcf0faeae0e8 f1ecf2f4f4f6f1f0f5efecf3f3ebf6f5ebf6eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeef2eaf7e7f4e37b87db7280e36e77c45450c8 5f66ce6d80dc758fdc7988e7e5f2e0f1ecf2f2eceeedeceaeff0f2e1e2e4e3e4e6f4f5f7 e7e8eafcfdffe5e6e8eaebedecedefecedefecedefecedefecedefecedefecedefecedef ecedefecedefecedefecedefecedefecedefecedefecedefecedefecedefecedefecedef ecedefecedefecedefecedefecedefecedefecedefecedefecedefecedefecedefecedef ecedefecedefecedefecedefecedefecedefecedefecedefecedefecedefecedefecedef ecedefecedefecedefecedefecedefecedefecedefecedefecedefecedefecedefecedef ecedefecedefecedefecedefecedefecedefecedefecedefecedefecedefecedefecedef ecedefecedefecedefecedefecedefecedefecedefecedefecedefecedefecedefecedef ecedefecedefecedefecedefecedefecedefecedefecedefecedefecedefecedefecedef ecedefecedefecedefecedefecedefecedefecedefecedefecedefecedefecedefecedef ecedefecedefecedefecedefecedefecedefecedefecedefeaebededeef0e7e8eaeaebed ebeff2eaeef1e7ebeef1f5f8eff0f2e1e2e4e3e4e6f4f5f7e7e8eafcfdffe5e6e8eaebed ecedefecedefecedefecedefecedefecedefecedefecedefecedefecedefecedefecedef ecedefecedefecedefecedefecedefecedefecedefecedefecedefecedefecedefecedef ecedefecedefecedefecedefecedefecedefecedefecedefecedefecedefecedefecedef ecedefecedefecedefecedefecedefecedefecedefecedefecedefecedefecedefecedef ecedefecedefecedefecedefecedefecedefecedefecedefecedefecedefecedefecedef ecedefecedefecedefecedefecedefecedefecedefecedefecedefecedefecedefecedef ecedefecedefecedefecedefecedefecedefecedefecedefecedefecedefecedefecedef ecedefecedefecedefecedefe7eae3e7e9e4eceee9eceeebf5f7f6e9eaecfeffffe7e8ec e7ebeef2f6f9e4e8ebe6eaedeff0f2f2f3f5f1f2f4edeef0ecedefecedefecedefecedef ecedefecedefecedefecedefecedefecedefecedefecedefecedefecedefecedefecedef ecedefecedefecedefecedefecedefecedefecedefecedefecedefecedefecedefecedef ecedefecedefecedefecedefecedefecedefecedefecedefecedefecedefecedefecedef ecedefecedefecedefecedefecedefecedefecedefecedefecedefecedefecedefecedef ecedefecedefecedefecedefecedefecedefecedefecedefecedefecedefecedefecedef ecedefecedefecedefecedefecedefecedefecedefecedefecedefecedefecedefecedef ecedefecedefecedefecedefecedefecedefecedefecedefecedefecedefecedefecedef ecedefecedefecedefecedefecedefecedefecedefecedefecedefecedefecedefecedef ecedefecedefecedefecedeff1f2ecf2f3eee8e8e6f4f4f2e7e7e9f0f0f2e9e8edeeedf3 edededededededededededededededededededededededededededededededededededed edededededededededededededededededededededededededededededededededededed edededededededededededededededededededededededededededededededededededed edededededededededededededededededededededededededededededededededededed edededededededededededededededededededededededededededededededededededed edededededededededededededededededededededededededededededededededededed edededededededededededededededededededededededededededededededededededed edededededededededededededededededededededededededededededededededededed edededededededededededededededededededededededededededeaeaeaf1f1f1e7e7e7 f3f3f3e8e8e8f3f3f3f5f5f5edededededededededededededededededededededededed edededededededededededededededededededededededededededededededededededed edededededededededededededededededededededededededededededededededededed edededededededededededededededededededededededededededededededededededed edededededededededededededededededededededededededededededededededededed edededededededededededededededededededededededededededededededededededed edededededededededededededededededededededededededededededededededededed edededededededededededededededededededededededede8e8e8ececece9e9e9f3f3f3 e4e4e4f6f6f6f3f3f3efefeff2eaf7e7f4e37b87db7280e36e77c45450c85f66ce6d80dc 758fdc7988e7e5f2e0f1ecf2f2eceeedeceaf1f1f1f8f8f8f5f5f5f8f8f8e1e1e1ebebeb e8e8e8fbfbfbedededededededededededededededededededededededededededededed edededededededededededededededededededededededededededededededededededed edededededededededededededededededededededededededededededededededededed edededededededededededededededededededededededededededededededededededed edededededededededededededededededededededededededededededededededededed edededededededededededededededededededededededededededededededededededed edededededededededededededededededededededededededededededededededededed edededededededededededededededededededededededededededededededededededed edededededededededededededededededededededededededededededededededededed ededededededededededededededededededecececedededf4f4f4eaeaeaf4f5f7f0f1f3 f4f5f7ebeceef1f1f1f8f8f8f5f5f5f8f8f8e1e1e1ebebebe8e8e8fbfbfbedededededed edededededededededededededededededededededededededededededededededededed edededededededededededededededededededededededededededededededededededed edededededededededededededededededededededededededededededededededededed edededededededededededededededededededededededededededededededededededed edededededededededededededededededededededededededededededededededededed edededededededededededededededededededededededededededededededededededed edededededededededededededededededededededededededededededededededededed ededededededfcfff8eff2ebeff1ecedefece8eae9dfe1e0edeef0e9eaeceaebedeff0f2 f4f5f7e9eaecececece0e0e0eeeeeeededededededededededededededededededededed edededededededededededededededededededededededededededededededededededed edededededededededededededededededededededededededededededededededededed edededededededededededededededededededededededededededededededededededed edededededededededededededededededededededededededededededededededededed edededededededededededededededededededededededededededededededededededed edededededededededededededededededededededededededededededededededededed edededededededededededededededededededededededededededededededededededed edededededededededededededededededededededededededededededededededededed edededededede7e8e3eaebe6f0f0eefcfcfcf3f3f3f5f5f7f0eff4edecf1f0f0f0f0f0f0 f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0e8e8e8ecececf2f2f2efefeff7f7f7ebebeb e6e6e6e4e4e4f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f6f6f6fafafaf5f5f5f4f4f4e9e9e9ececec e8e8e8eaeaeaf2eaf7e7f4e37b87db7280e36e77c45450c85f66ce6d80dc758fdc7988e7 e5f2e0f1ecf2f2eceeedeceadedddbf1f0eee8e7e5f5f4f2f5f4f2f5f4f2ecebe9e9e8e6 eeedebeeedebeeedebeeedebeeedebeeedebeeedebeeedebeeedebeeedebeeedebeeedeb eeedebeeedebeeedebeeedebeeedebeeedebeeedebeeedebeeedebeeedebeeedebeeedeb eeedebeeedebeeedebeeedebeeedebeeedebeeedebeeedebeeedebeeedebeeedebeeedeb eeedebeeedebeeedebeeedebeeedebeeedebeeedebeeedebeeedebeeedebeeedebeeedeb eeedebeeedebeeedebeeedebeeedebeeedebeeedebeeedebeeedebeeedebeeedebeeedeb eeedebeeedebeeedebeeedebeeedebeeedebeeedebeeedebeeedebeeedebeeedebeeedeb eeedebeeedebeeedebeeedebeeedebeeedebeeedebeeedebeeedebeeedebeeedebeeedeb eeedebeeedebeeedebeeedebeeedebeeedebeeedebeeedebeeedebeeedebeeedebeeedeb eeedebeeedebeeedebeeedebeeedebeeedebeeedebeeedebeeedebeeedebeeedebeeedeb eeedebeeedebeeedebeeedebefeeeceae9e7f7f6f4e5e4e2efeeececebe9f8f7f5e5e4e2 dedddbf1f0eee8e7e5f5f4f2f5f4f2f5f4f2ecebe9e9e8e6eeedebeeedebeeedebeeedeb eeedebeeedebeeedebeeedebeeedebeeedebeeedebeeedebeeedebeeedebeeedebeeedeb eeedebeeedebeeedebeeedebeeedebeeedebeeedebeeedebeeedebeeedebeeedebeeedeb eeedebeeedebeeedebeeedebeeedebeeedebeeedebeeedebeeedebeeedebeeedebeeedeb eeedebeeedebeeedebeeedebeeedebeeedebeeedebeeedebeeedebeeedebeeedebeeedeb eeedebeeedebeeedebeeedebeeedebeeedebeeedebeeedebeeedebeeedebeeedebeeedeb eeedebeeedebeeedebeeedebeeedebeeedebeeedebeeedebeeedebeeedebeeedebeeedeb eeedebeeedebeeedebeeedebeeedebeeedebeeedebeeedebeeedebeeedebeeedebeeedeb e6e5e0dcdbd6efeee9fcfbf7f5f4f2f4f3f1efedeef4f2f3f4f3f1ebeae8fcfbf9f0efed f3f2f0e4e3e1f4f3f1f0efedeeedebeeedebeeedebeeedebeeedebeeedebeeedebeeedeb eeedebeeedebeeedebeeedebeeedebeeedebeeedebeeedebeeedebeeedebeeedebeeedeb eeedebeeedebeeedebeeedebeeedebeeedebeeedebeeedebeeedebeeedebeeedebeeedeb eeedebeeedebeeedebeeedebeeedebeeedebeeedebeeedebeeedebeeedebeeedebeeedeb eeedebeeedebeeedebeeedebeeedebeeedebeeedebeeedebeeedebeeedebeeedebeeedeb eeedebeeedebeeedebeeedebeeedebeeedebeeedebeeedebeeedebeeedebeeedebeeedeb eeedebeeedebeeedebeeedebeeedebeeedebeeedebeeedebeeedebeeedebeeedebeeedeb eeedebeeedebeeedebeeedebeeedebeeedebeeedebeeedebeeedebeeedebeeedebeeedeb eeedebeeedebeeedebeeedebeeedebeeedebeeedebeeedebeeedebeeedebeeedebeeedeb f1f2ede9e9e7ececeae8e8e8e1e1e1e4e4e6f0f0f2edecf1ecececececececececececec ecececececececececececececececececececececececececececececececececececec ecececececececececececececececececececececececececececececececececececec ecececececececececececececececececececececececececececececececececececec ecececececececececececececececececececececececececececececececececececec ecececececececececececececececececececececececececececececececececececec ecececececececececececececececececececececececececececececececececececec ecececececececececececececececececececececececececececececececececececec ecececececececececececececececececececececececececececececececececececec ececececececececececececf1f1f1f6f6f6ececece9e9e9eeeeeef1f1f1eeeeeef7f7f7 ecececececececececececececececececececececececececececececececececececec ecececececececececececececececececececececececececececececececececececec ecececececececececececececececececececececececececececececececececececec ecececececececececececececececececececececececececececececececececececec ecececececececececececececececececececececececececececececececececececec ecececececececececececececececececececececececececececececececececececec ecececececececececececececececececececececececececececececececececececec ecececececececececececece4e4e4eaeaeaeaeaeae8e8e8f0f0f0ebebebedededf8f8f8 f2eaf7e7f4e37b87db7280e36e77c45450c85f66ce6d80dc758fdc7988e7e5f2e0f1ecf2 f2eceeedeceafaf9f7fffffde5e4e2e7e6e4f1f0eef0efedf1f0eeecebe9eeedebeeedeb eeedebeeedebeeedebeeedebeeedebeeedebeeedebeeedebeeedebeeedebeeedebeeedeb eeedebeeedebeeedebeeedebeeedebeeedebeeedebeeedebeeedebeeedebeeedebeeedeb eeedebeeedebeeedebeeedebeeedebeeedebeeedebeeedebeeedebeeedebeeedebeeedeb eeedebeeedebeeedebeeedebeeedebeeedebeeedebeeedebeeedebeeedebeeedebeeedeb eeedebeeedebeeedebeeedebeeedebeeedebeeedebeeedebeeedebeeedebeeedebeeedeb eeedebeeedebeeedebeeedebeeedebeeedebeeedebeeedebeeedebeeedebeeedebeeedeb eeedebeeedebeeedebeeedebeeedebeeedebeeedebeeedebeeedebeeedebeeedebeeedeb eeedebeeedebeeedebeeedebeeedebeeedebeeedebeeedebeeedebeeedebeeedebeeedeb eeedebeeedebeeedebeeedebeeedebeeedebeeedebeeedebeeedebeeedebeeedebeeedeb eeedebeeedebf7f7f7eeeeeef5f4f2f0efedece8e5ece8e5f7f3f0f1ece8faf9f7fffffd e5e4e2e7e6e4f1f0eef0efedf1f0eeecebe9eeedebeeedebeeedebeeedebeeedebeeedeb eeedebeeedebeeedebeeedebeeedebeeedebeeedebeeedebeeedebeeedebeeedebeeedeb eeedebeeedebeeedebeeedebeeedebeeedebeeedebeeedebeeedebeeedebeeedebeeedeb eeedebeeedebeeedebeeedebeeedebeeedebeeedebeeedebeeedebeeedebeeedebeeedeb eeedebeeedebeeedebeeedebeeedebeeedebeeedebeeedebeeedebeeedebeeedebeeedeb eeedebeeedebeeedebeeedebeeedebeeedebeeedebeeedebeeedebeeedebeeedebeeedeb eeedebeeedebeeedebeeedebeeedebeeedebeeedebeeedebeeedebeeedebeeedebeeedeb eeedebeeedebeeedebeeedebeeedebeeedebeeedebeeedebeeedebeeedebfaf9f5ebeae6 f1f0eceeede9e0dfdbefeeece8e7e5edeceaf5f0ece1dddaefebe8f0ece9f0efedf3f2f0 f1f1f1ebebebeeedebeeedebeeedebeeedebeeedebeeedebeeedebeeedebeeedebeeedeb eeedebeeedebeeedebeeedebeeedebeeedebeeedebeeedebeeedebeeedebeeedebeeedeb eeedebeeedebeeedebeeedebeeedebeeedebeeedebeeedebeeedebeeedebeeedebeeedeb eeedebeeedebeeedebeeedebeeedebeeedebeeedebeeedebeeedebeeedebeeedebeeedeb eeedebeeedebeeedebeeedebeeedebeeedebeeedebeeedebeeedebeeedebeeedebeeedeb eeedebeeedebeeedebeeedebeeedebeeedebeeedebeeedebeeedebeeedebeeedebeeedeb eeedebeeedebeeedebeeedebeeedebeeedebeeedebeeedebeeedebeeedebeeedebeeedeb eeedebeeedebeeedebeeedebeeedebeeedebeeedebeeedebeeedebeeedebeeedebeeedeb eeedebeeedebeeedebeeedebeeedebeeedebeeedebeeedebeeedebeeedebf1f1efeeeeee f7f7f7f4f4f4f6f6f6f2f2f2f4f4f4e9e9ebf0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 f0f0f0f0f0f0dfdfdfededededededf0f0f0edededeeeeeee5e5e5e8e8e8f0f0f0f0f0f0 f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 f0f0f0f0f0f0f4f4f4f5f5f5f1f1f1eaeaeaf6f6f6e9e9e9e5e5e5ebebebf2eaf7e7f4e3 7b87db7280e36e77c45450c85f66ce6d80dc758fdc7988e7e5f2e0f1ecf2f2eceeedecea dedfe1eaebededeef0eeeff1eeeff1e5e6e8eeeff1f5f6f8edeef0edeef0edeef0edeef0 edeef0edeef0edeef0edeef0edeef0edeef0edeef0edeef0edeef0edeef0edeef0edeef0 edeef0edeef0edeef0edeef0edeef0edeef0edeef0edeef0edeef0edeef0edeef0edeef0 edeef0edeef0edeef0edeef0edeef0edeef0edeef0edeef0edeef0edeef0edeef0edeef0 edeef0edeef0edeef0edeef0edeef0edeef0edeef0edeef0edeef0edeef0edeef0edeef0 edeef0edeef0edeef0edeef0edeef0edeef0edeef0edeef0edeef0edeef0edeef0edeef0 edeef0edeef0edeef0edeef0edeef0edeef0edeef0edeef0edeef0edeef0edeef0edeef0 edeef0edeef0edeef0edeef0edeef0edeef0edeef0edeef0edeef0edeef0edeef0edeef0 edeef0edeef0edeef0edeef0edeef0edeef0edeef0edeef0edeef0edeef0edeef0edeef0 edeef0edeef0edeef0edeef0edeef0edeef0edeef0edeef0edeef0edeef0edeef0edeef0 e6eaede5e6e8e6e7e9fbfbfbf0efedf3efecf3eeeafef9f5dedfe1eaebededeef0eeeff1 eeeff1e5e6e8eeeff1f5f6f8edeef0edeef0edeef0edeef0edeef0edeef0edeef0edeef0 edeef0edeef0edeef0edeef0edeef0edeef0edeef0edeef0edeef0edeef0edeef0edeef0 edeef0edeef0edeef0edeef0edeef0edeef0edeef0edeef0edeef0edeef0edeef0edeef0 edeef0edeef0edeef0edeef0edeef0edeef0edeef0edeef0edeef0edeef0edeef0edeef0 edeef0edeef0edeef0edeef0edeef0edeef0edeef0edeef0edeef0edeef0edeef0edeef0 edeef0edeef0edeef0edeef0edeef0edeef0edeef0edeef0edeef0edeef0edeef0edeef0 edeef0edeef0edeef0edeef0edeef0edeef0edeef0edeef0edeef0edeef0edeef0edeef0 edeef0edeef0edeef0edeef0edeef0edeef0edeef0edeef0eae8e9ebe9eaf8f6f7f2f0f1 eeecedfbfaf8faf9f7ecebe9faf5f1f2ede9f8f4f1f4f3f1e6e6e6f6f7f9e4e5e7e8ecef edeef0edeef0edeef0edeef0edeef0edeef0edeef0edeef0edeef0edeef0edeef0edeef0 edeef0edeef0edeef0edeef0edeef0edeef0edeef0edeef0edeef0edeef0edeef0edeef0 edeef0edeef0edeef0edeef0edeef0edeef0edeef0edeef0edeef0edeef0edeef0edeef0 edeef0edeef0edeef0edeef0edeef0edeef0edeef0edeef0edeef0edeef0edeef0edeef0 edeef0edeef0edeef0edeef0edeef0edeef0edeef0edeef0edeef0edeef0edeef0edeef0 edeef0edeef0edeef0edeef0edeef0edeef0edeef0edeef0edeef0edeef0edeef0edeef0 edeef0edeef0edeef0edeef0edeef0edeef0edeef0edeef0edeef0edeef0edeef0edeef0 edeef0edeef0edeef0edeef0edeef0edeef0edeef0edeef0edeef0edeef0edeef0edeef0 edeef0edeef0edeef0edeef0edeef0edeef0edeef0edeef0e9e9ebefefefe6e6e6e0e0e0 eaeaeaf1f1f1eeeeeef0f0eeebebebebebebebebebebebebebebebebebebebebebebebeb ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb f4f4f4f4f4f4f8f8f8f0f0f0e5e5e5eaeaeaf4f4f4efefefebebebebebebebebebebebeb ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb ebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebeb edededececece7e7e7e9e9e9f3f3f3f7f7f7f1f1f1eeeeeef2eaf7e7f4e37b87db7280e3 6e77c45450c85f66ce6d80dc758fdc7988e7e5f2e0f1ecf2f2eceeedeceafbffffdde2e6 f2f7fbf0f5f9f1f6faeaeff3e8edf1e9eef2ebf0f4ebf0f4ebf0f4ebf0f4ebf0f4ebf0f4 ebf0f4ebf0f4ebf0f4ebf0f4ebf0f4ebf0f4ebf0f4ebf0f4ebf0f4ebf0f4ebf0f4ebf0f4 ebf0f4ebf0f4ebf0f4ebf0f4ebf0f4ebf0f4ebf0f4ebf0f4ebf0f4ebf0f4ebf0f4ebf0f4 ebf0f4ebf0f4ebf0f4ebf0f4ebf0f4ebf0f4ebf0f4ebf0f4ebf0f4ebf0f4ebf0f4ebf0f4 ebf0f4ebf0f4ebf0f4ebf0f4ebf0f4ebf0f4ebf0f4ebf0f4ebf0f4ebf0f4ebf0f4ebf0f4 ebf0f4ebf0f4ebf0f4ebf0f4ebf0f4ebf0f4ebf0f4ebf0f4ebf0f4ebf0f4ebf0f4ebf0f4 ebf0f4ebf0f4ebf0f4ebf0f4ebf0f4ebf0f4ebf0f4ebf0f4ebf0f4ebf0f4ebf0f4ebf0f4 ebf0f4ebf0f4ebf0f4ebf0f4ebf0f4ebf0f4ebf0f4ebf0f4ebf0f4ebf0f4ebf0f4ebf0f4 ebf0f4ebf0f4ebf0f4ebf0f4ebf0f4ebf0f4ebf0f4ebf0f4ebf0f4ebf0f4ebf0f4ebf0f4 ebf0f4ebf0f4ebf0f4ebf0f4ebf0f4ebf0f4ebf0f4ebf0f4ebf0f4ebf0f4eaf1f7edf4fa e8edf1f0f4f7f9fafceeedebe0dcd9e9e5e2fbffffdde2e6f2f7fbf0f5f9f1f6faeaeff3 e8edf1e9eef2ebf0f4ebf0f4ebf0f4ebf0f4ebf0f4ebf0f4ebf0f4ebf0f4ebf0f4ebf0f4 ebf0f4ebf0f4ebf0f4ebf0f4ebf0f4ebf0f4ebf0f4ebf0f4ebf0f4ebf0f4ebf0f4ebf0f4 ebf0f4ebf0f4ebf0f4ebf0f4ebf0f4ebf0f4ebf0f4ebf0f4ebf0f4ebf0f4ebf0f4ebf0f4 ebf0f4ebf0f4ebf0f4ebf0f4ebf0f4ebf0f4ebf0f4ebf0f4ebf0f4ebf0f4ebf0f4ebf0f4 ebf0f4ebf0f4ebf0f4ebf0f4ebf0f4ebf0f4ebf0f4ebf0f4ebf0f4ebf0f4ebf0f4ebf0f4 ebf0f4ebf0f4ebf0f4ebf0f4ebf0f4ebf0f4ebf0f4ebf0f4ebf0f4ebf0f4ebf0f4ebf0f4 ebf0f4ebf0f4ebf0f4ebf0f4ebf0f4ebf0f4ebf0f4ebf0f4ebf0f4ebf0f4ebf0f4ebf0f4 ebf0f4ebf0f4ebf0f4ebf0f4ebf0f4ebf0f4e7e7efeeeef6f4f5fae6e7ece7e8ecd9dadc f6f7f9e1e2e4e4e0ddf1edeafdfcfae0e1e3dde1e4f2f7fbe4ebf1f9ffffebf0f4ebf0f4 ebf0f4ebf0f4ebf0f4ebf0f4ebf0f4ebf0f4ebf0f4ebf0f4ebf0f4ebf0f4ebf0f4ebf0f4 ebf0f4ebf0f4ebf0f4ebf0f4ebf0f4ebf0f4ebf0f4ebf0f4ebf0f4ebf0f4ebf0f4ebf0f4 ebf0f4ebf0f4ebf0f4ebf0f4ebf0f4ebf0f4ebf0f4ebf0f4ebf0f4ebf0f4ebf0f4ebf0f4 ebf0f4ebf0f4ebf0f4ebf0f4ebf0f4ebf0f4ebf0f4ebf0f4ebf0f4ebf0f4ebf0f4ebf0f4 ebf0f4ebf0f4ebf0f4ebf0f4ebf0f4ebf0f4ebf0f4ebf0f4ebf0f4ebf0f4ebf0f4ebf0f4 ebf0f4ebf0f4ebf0f4ebf0f4ebf0f4ebf0f4ebf0f4ebf0f4ebf0f4ebf0f4ebf0f4ebf0f4 ebf0f4ebf0f4ebf0f4ebf0f4ebf0f4ebf0f4ebf0f4ebf0f4ebf0f4ebf0f4ebf0f4ebf0f4 ebf0f4ebf0f4ebf0f4ebf0f4ebf0f4ebf0f4ebf0f4ebf0f4ebf0f4ebf0f4ebf0f4ebf0f4 ebf0f4ebf0f4ebf0f4ebf0f4ebf0f4ebf0f4e4e3e8fffffff2f2f4f0f0f0f5f5f5f9f9f7 dcdcdaeff0ebf0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0e6e6e6d4d4d4 f3f3f3ededede8e8e8eaeaeaffffffe0e0e0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f5f5f5f3f3f3 e7e7e7edededdbdbdbf9f9f9f4f4f4e6e6e6f2eaf7e7f4e37b87db7280e36e77c45450c8 5f66ce6d80dc758fdc7988e7e5f2e0f1ecf2f2eceeedeceae2ecf5808a938c969f77818a 757f88808a937c868f818b947d87907d87907d87907d87907d87907d87907d87907d8790 7d87907d87907d87907d87907d87907d87907d87907d87907d87907d87907d87907d8790 7d87907d87907d87907d87907d87907d87907d87907d87907d87907d87907d87907d8790 7d87907d87907d87907d87907d87907d87907d87907d87907d87907d87907d87907d8790 7d87907d87907d87907d87907d87907d87907d87907d87907d87907d87907d87907d8790 7d87907d87907d87907d87907d87907d87907d87907d87907d87907d87907d87907d8790 7d87907d87907d87907d87907d87907d87907d87907d87907d87907d87907d87907d8790 7d87907d87907d87907d87907d87907d87907d87907d87907d87907d87907d87907d8790 7d87907d87907d87907d87907d87907d87907d87907d87907d87907d87907d87907d8790 7d87907d87907d87907d87907d87907d87907d87907d8790717e87808d968b959e7f868c dbe0e4e6e7e9f7f7f7faf9f7e2ecf5808a938c969f77818a757f88808a937c868f818b94 7d87907d87907d87907d87907d87907d87907d87907d87907d87907d87907d87907d8790 7d87907d87907d87907d87907d87907d87907d87907d87907d87907d87907d87907d8790 7d87907d87907d87907d87907d87907d87907d87907d87907d87907d87907d87907d8790 7d87907d87907d87907d87907d87907d87907d87907d87907d87907d87907d87907d8790 7d87907d87907d87907d87907d87907d87907d87907d87907d87907d87907d87907d8790 7d87907d87907d87907d87907d87907d87907d87907d87907d87907d87907d87907d8790 7d87907d87907d87907d87907d87907d87907d87907d87907d87907d87907d87907d8790 7d87907d87907d87907d87908c909c898d998387927c808994999f7d8288e8edf1f7fcff f3f2f0efefefe9eaec82878b949ba1828c956b788176838c7d87907d87907d87907d8790 7d87907d87907d87907d87907d87907d87907d87907d87907d87907d87907d87907d8790 7d87907d87907d87907d87907d87907d87907d87907d87907d87907d87907d87907d8790 7d87907d87907d87907d87907d87907d87907d87907d87907d87907d87907d87907d8790 7d87907d87907d87907d87907d87907d87907d87907d87907d87907d87907d87907d8790 7d87907d87907d87907d87907d87907d87907d87907d87907d87907d87907d87907d8790 7d87907d87907d87907d87907d87907d87907d87907d87907d87907d87907d87907d8790 7d87907d87907d87907d87907d87907d87907d87907d87907d87907d87907d87907d8790 7d87907d87907d87907d87907d87907d87907d87907d87907d87907d87907d87907d8790 7d87907d87907d87907d879089888de7e6ebe2e2e4fafafaf3f3f3e3e3e192938eabaca7 989898989898989898989898989898989898989898989898989898989898989898989898 989898989898989898989898989898989898989898989898989898989898989898989898 989898989898989898989898989898989898989898989898989898989898989898989898 989898989898989898989898989898989898989898989898989898989898989898989898 989898989898989898989898989898989898989898989898989898989898989898989898 989898989898989898989898989898989898989898989898989898989898989898989898 989898989898989898989898989898989898989898989898989898989898989898989898 989898989898989898989898989898989898989898989898989898989898989898989898 989898989898989898989898989898989898989898989898afafaf969696e6e6e6f5f5f5 fcfcfce7e7e7efefef959595989898989898989898989898989898989898989898989898 989898989898989898989898989898989898989898989898989898989898989898989898 989898989898989898989898989898989898989898989898989898989898989898989898 989898989898989898989898989898989898989898989898989898989898989898989898 989898989898989898989898989898989898989898989898989898989898989898989898 989898989898989898989898989898989898989898989898989898989898989898989898 989898989898989898989898989898989898989898989898989898989898989898989898 9898989898989898989898989898989898989898989898989292929a9a9a989898b5b5b5 949494e4e4e4f8f8f8ecececf2eaf7e7f4e37b87db7280e36e77c45450c85f66ce6d80dc 758fdc7988e7e5f2e0f1ecf2f2eceeedeceadfedf88a98a3dae8f3e2f0fbdeecf7e6f4ff d7e5f0e0eef9deecf7deecf7deecf7deecf7deecf7deecf7deecf7deecf7deecf7deecf7 deecf7deecf7deecf7deecf7deecf7deecf7deecf7deecf7deecf7deecf7deecf7deecf7 deecf7deecf7deecf7deecf7deecf7deecf7deecf7deecf7deecf7deecf7deecf7deecf7 deecf7deecf7deecf7deecf7deecf7deecf7deecf7deecf7deecf7deecf7deecf7deecf7 deecf7deecf7deecf7deecf7deecf7deecf7deecf7deecf7deecf7deecf7deecf7deecf7 deecf7deecf7deecf7deecf7deecf7deecf7deecf7deecf7deecf7deecf7deecf7deecf7 deecf7deecf7deecf7deecf7deecf7deecf7deecf7deecf7deecf7deecf7deecf7deecf7 deecf7deecf7deecf7deecf7deecf7deecf7deecf7deecf7deecf7deecf7deecf7deecf7 deecf7deecf7deecf7deecf7deecf7deecf7deecf7deecf7deecf7deecf7deecf7deecf7 deecf7deecf7deecf7deecf7deecf7deecf7e2f2ffe1f1fed5e2eb818b94f3faffe6eaed fbfcfee3e4e6dfedf88a98a3dae8f3e2f0fbdeecf7e6f4ffd7e5f0e0eef9deecf7deecf7 deecf7deecf7deecf7deecf7deecf7deecf7deecf7deecf7deecf7deecf7deecf7deecf7 deecf7deecf7deecf7deecf7deecf7deecf7deecf7deecf7deecf7deecf7deecf7deecf7 deecf7deecf7deecf7deecf7deecf7deecf7deecf7deecf7deecf7deecf7deecf7deecf7 deecf7deecf7deecf7deecf7deecf7deecf7deecf7deecf7deecf7deecf7deecf7deecf7 deecf7deecf7deecf7deecf7deecf7deecf7deecf7deecf7deecf7deecf7deecf7deecf7 deecf7deecf7deecf7deecf7deecf7deecf7deecf7deecf7deecf7deecf7deecf7deecf7 deecf7deecf7deecf7deecf7deecf7deecf7deecf7deecf7deecf7deecf7deecf7deecf7 deecf7deecf7dee5f5e0e7f7e2eaf7dfe7f2e0e9f2808990e1eaefe3ecf1f3f4f6e5e6e8 edf1f47d848ae1ebf4dfecf5deeefbe0f0fddeecf7deecf7deecf7deecf7deecf7deecf7 deecf7deecf7deecf7deecf7deecf7deecf7deecf7deecf7deecf7deecf7deecf7deecf7 deecf7deecf7deecf7deecf7deecf7deecf7deecf7deecf7deecf7deecf7deecf7deecf7 deecf7deecf7deecf7deecf7deecf7deecf7deecf7deecf7deecf7deecf7deecf7deecf7 deecf7deecf7deecf7deecf7deecf7deecf7deecf7deecf7deecf7deecf7deecf7deecf7 deecf7deecf7deecf7deecf7deecf7deecf7deecf7deecf7deecf7deecf7deecf7deecf7 deecf7deecf7deecf7deecf7deecf7deecf7deecf7deecf7deecf7deecf7deecf7deecf7 deecf7deecf7deecf7deecf7deecf7deecf7deecf7deecf7deecf7deecf7deecf7deecf7 deecf7deecf7deecf7deecf7deecf7deecf7deecf7deecf7deecf7deecf7deecf7deecf7 deecf7deecf78d8c92f9f8fde1e1e3f3f3f5e8e8e6ebebe9a5a6a1e2e3ddecececececec ecececececececececececececececececececececececececececececececececececec ecececececececececececececececececececececececececececececececececececec ecececececececececececececececececececececececececececececececececececec ecececececececececececececececececececececececececececececececececececec ecececececececececececececececececececececececececececececececececececec ecececececececececececececececececececececececececececececececececececec ecececececececececececececececececececececececececececececececececececec ecececececececececececececececececececececececececececececececececececec ecececececececececececececececececece2e2e2a5a5a5eaeaeae6e6e6f1f1f1e2e2e2 ffffff989898ecececececececececececececececececececececececececececececec ecececececececececececececececececececececececececececececececececececec ecececececececececececececececececececececececececececececececececececec ecececececececececececececececececececececececececececececececececececec ecececececececececececececececececececececececececececececececececececec ecececececececececececececececececececececececececececececececececececec ecececececececececececececececececececececececececececececececececececec ececececececececececececececececececf2f2f2f6f6f6e2e2e2ebebeb999999e9e9e9 f7f7f7e3e3e3f2eaf7e7f4e37b87db7280e36e77c45450c85f66ce6d80dc758fdc7988e7 e5f2e0f1ecf2f2eceeedeceae6f1f57d868be5eef5e9f0f8e1e8f0e9edf8e9ebf7eaecf8 e7eef8e7eef8e7eef8e7eef8e7eef8e7eef8e7eef8e7eef8e1e8eee9f0f6e3eaf0dee5eb eef5fbe8eff5e2e9efeaf1f7e7eef8e7eef8e7eef8e7eef8e7eef8e7eef8e7eef8e7eef8 e7eef8e7eef8e7eef8e7eef8e7eef8e7eef8e7eef8e7eef8edf4fed6dde7ecf3fdf0f7ff dfe6f0e7eef8e2e9f3e4ebf5e7eef8e7eef8e7eef8e7eef8e7eef8e7eef8e7eef8e7eef8 e7eef8e7eef8e7eef8e7eef8e7eef8e7eef8e7eef8e7eef8e3eaf0f5fcffdbe2e8eef5fb e2e9efeaf1f7edf4fae0e7ede7eef8e7eef8e7eef8e7eef8e7eef8e7eef8e7eef8e7eef8 e7eef8e7eef8e7eef8e7eef8e7eef8e7eef8e7eef8e7eef8e7eef8e7eef8e7eef8e7eef8 e7eef8e7eef8e7eef8e7eef8e7eef8e7eef8e7eef8e7eef8e7eef8e7eef8e7eef8e7eef8 e7eef8e7eef8e7eef8e7eef8e7eef8e7eef8e7eef8e7eef8e7eef8e7eef8e7eef8e7eef8 e7eef8e7eef8e7eef8e7eef8e3edeeeaf4f6e6f1f57d868de6edf3f0f1f5f1edeef4ecea e6f1f57d868be5eef5e9f0f8e1e8f0e9edf8e9ebf7eaecf8e7eef8e7eef8e7eef8e7eef8 e7eef8e7eef8e7eef8e7eef8e2e9eff0f7fde3eaf0e6edf3e8eff5dfe6eceaf1f7edf4fa e4ebf1f2f9ffdbe2e8dee5ebecf3f9e3eaf0e4ebf1e7eef4e1e8eeecf3f9e4ebf1e8eff5 e2e9efdae1e7ebf2f8eaf1f7dce3e9eaf1f7e5ecf2e8eff5eaf1f7e1e8eee5ecf2e7eef4 e5ecf2ecf3f9e6edf3e5ecf2e6edf3e5ecf2e0e7ede6edf3e7eef8e7eef8e7eef8e7eef8 e7eef8e7eef8e7eef8e7eef8e1e8eeecf3f9e4ebf1e8eff5e2e9efdae1e7ebf2f8eaf1f7 e7eef8e7eef8e7eef8e7eef8e7eef8e7eef8e7eef8e7eef8e7eef8e7eef8e7eef8e7eef8 e7eef8e7eef8e7eef8e7eef8e7eef8e7eef8e7eef8e7eef8e7eef8e7eef8e7eef8e7eef8 e7eff1e4eef0e4eff5e2eff7ebf5fe7e828bedeef3f1eff4e7ece5ebf1ede6f0f17e898f e5eff9e8f0fbe8ecf8eef0fce7eef8e7eef8e7eef8e7eef8e7eef8e7eef8e7eef8e7eef8 eef5fbe1e8eee3eaf0ecf3f9e0e7edf3faffd8dfe5ebf2f8e3eaf0e4ebf1eef5fbe4ebf1 e8eff5e8eff5d5dce2f6fdffe7eef8e7eef8e7eef8e7eef8e7eef8e7eef8e7eef8e7eef8 eaf1fbe4ebf5dde4eee0e7f1f1f8ffdbe2ecf0f7ffe5ecf6eef5fbe1e8eee3eaf0ecf3f9 e0e7edf3faffd8dfe5ebf2f8e2e9f3e0e7f1ecf3fddbe2ece4ebf5f3faffe1e8f2ebf2fc e7eef8e7eef8e7eef8e7eef8e7eef8e7eef8e7eef8e7eef8dfe6f0edf4fedde4eef2f9ff dfe6f0dbe2ece6edf7f0f7ffe7eef8e7eef8e7eef8e7eef8e7eef8e7eef8e7eef8e7eef8 e7eef8e7eef8e7eef8e7eef8e7eef8e7eef8e7eef8e7eef8e7eef8e7eef8e7eef8e7eef8 e7eef8e7eef8e7eef8e7eef8e7eef8e7eef8e7eef8e7eef8e7eef8e7eef8e7eef8e7eef8 808990e9eef2ebeceef0efedeeedebefeeec969799ebeff2eeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee e8e8e8eeeeeeeeeeeee8e8e8e8e8e8f0f0f0f4f4f4f1f1f1eeeeeef2f2f2f1f1f1ededed efefeff4f4f4f0f0f0e6e6e6eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee efefefefefefeeeeeeecececebebebedededf1f1f1f4f4f4f2f2f2efefefecececebebeb ecececefefeff1f1f1f1f1f1eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee e9e9e9f9f9f9ebebebefefefe5e5e5f7f7f7ecececf4f4f4eeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeededed9b9b9befefefecececf2f2f2ebebebefefef9a9a9a eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeecececedededefefeff1f1f1f3f3f3f2f2f2eeeeeeebebeb f2f2f2efefefecececebebebecececefefeff1f1f1f1f1f1eeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeaeaeaf0f0f0f1f1f1ecececeaeaeaeeeeeeededede8e8e8 eeeeeeeaeaeaebebebeeeeeeececece7e7e7ebebebf5f5f5eeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeee6e6e6f0f0f0f2f2f2f1f1f1f3f3f3eeeeeeeaeaeaf1f1f1 eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeefefefe9e9e9f2f2f2ebebeb999999eeeeeef0f0f0ebebeb f2eaf7e7f4e37b87db7280e36e77c45450c85f66ce6d80dc758fdc7988e7e5f2e0f1ecf2 f2eceeedeceae8f1f67f888de8f1f8eef5fde7ebf4eef2fbedf0f9eef1faebf2faebf2fa ebf2faebf2faebf2faebf2faebf2faebf2fae6edf3ebf2f8ecf3f9f2f9ffdee5ebe5ecf2 e6edf3ebf2f8ebf2faebf2faebf2faebf2faebf2faebf2faebf2faebf2faebf2faebf2fa ebf2faebf2faebf2faebf2faebf2faebf2fae2e9f1f1f8ffe4ebf3dce3ebeef5fde5ecf4 f4fbffeaf1f9ebf2faebf2faebf2faebf2faebf2faebf2faebf2faebf2faebf2faebf2fa ebf2faebf2faebf2faebf2faebf2faebf2fae7eef4ebf2f8dbe2e8edf4faeaf1f7e0e7ed eef5fbeff6fcebf2faebf2faebf2faebf2faebf2faebf2faebf2faebf2faebf2faebf2fa ebf2faebf2faebf2faebf2faebf2faebf2faebf2faebf2faebf2faebf2faebf2faebf2fa ebf2faebf2faebf2faebf2faebf2faebf2faebf2faebf2faebf2faebf2faebf2faebf2fa ebf2faebf2faebf2faebf2faebf2faebf2faebf2faebf2faebf2faebf2faebf2faebf2fa ebf2faebf2fae6eef0edf7f9e8f1f67e878ee7eef4f0f1f5f0ecedf4eceae8f1f67f888d e8f1f8eef5fde7ebf4eef2fbedf0f9eef1faebf2faebf2faebf2faebf2faebf2faebf2fa ebf2faebf2fae6edf3e5ecf2e8eff5eaf1f7f7feffeef5fbecf3f9dfe6ecdee5ebe3eaf0 f8fffff9ffffe7eef4e2e9eff2f9ffebf2f8e8eff5f5fcffe3eaf0e5ecf2f9fffff7feff e0e7ede2e9eff7feffe7eef4e9f0f6dde4eaeaf1f7f0f7fdeff6fcf0f7fdecf3f9e3eaf0 e5ecf2e0e7edf1f8feecf3f9eef5fbe5ecf2ebf2faebf2faebf2faebf2faebf2faebf2fa ebf2faebf2fae8eff5f5fcffe3eaf0e5ecf2f9fffff7feffe0e7ede2e9efebf2faebf2fa ebf2faebf2faebf2faebf2faebf2faebf2faebf2faebf2faebf2faebf2faebf2faebf2fa ebf2faebf2faebf2faebf2faebf2faebf2faebf2faebf2faebf2faebf2fae9f1f3e6f0f2 e6f1f7e5eff8edf6ff7e828becedf2f0eef3e8ede7ecf2eee6f0f17f8a90e6f0fae8f0fb e8ecf7eef0fcebf2faebf2faebf2faebf2faebf2faebf2faebf2faebf2fae4ebf1e5ecf2 f3faffe9f0f6e6edf3f7feffe8eff5ecf3f9f7feffe2e9eff4fbffdfe6eceff6fcf7feff ebf2f8d9e0e6ebf2faebf2faebf2faebf2faebf2faebf2faebf2faebf2fae3eaf2e9f0f8 f5fcffecf3fbe0e7eff1f8ffe1e8f0e7eef6e4ebf1e5ecf2f3faffe9f0f6e6edf3f7feff e8eff5ecf3f9eff6fee6edf5f7fefff0f7ffe7eef6e3eaf2d7dee6eaf1f9ebf2faebf2fa ebf2faebf2faebf2faebf2faebf2faebf2fae7eef6e0e7eff0f7ffe0e7efecf3fbf6fdff e9f0f8e3eaf2ebf2faebf2faebf2faebf2faebf2faebf2faebf2faebf2faebf2faebf2fa ebf2faebf2faebf2faebf2faebf2faebf2faebf2faebf2faebf2faebf2faebf2faebf2fa ebf2faebf2faebf2faebf2faebf2faebf2faebf2faebf2faebf2faebf2fa808990e9eef2 ebeceef0efedeeedebefeeec969799ebeff2eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeef0f0f0f4f4f4 f5f5f5f2f2f2efefefededede9e9e9e5e5e5eaeaeaecececebebebe8e8e8e9e9e9eeeeee f2f2f2f2f2f2eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeedededededed efefeff1f1f1f2f2f2eeeeeee8e8e8e4e4e4e4e4e4e9e9e9eeeeeef2f2f2f1f1f1efefef edededecececeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee9e9e9ededed ecececefefefeeeeeef2f2f2ececece8e8e8eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeededed9b9b9befefefecececf2f2f2ebebebefefef9a9a9aeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeececece9e9e9e9e9e9ecececf2f2f2f6f6f6e4e4e4e9e9e9 eeeeeef2f2f2f1f1f1efefefedededecececeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeecececf2f2f2eeeeeef1f1f1e9e9e9f2f2f2f1f1f1f4f4f4efefefeaeaea eaeaeaf1f1f1f7f7f7f6f6f6f1f1f1edededeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeef7f7f7f0f0f0e7e7e7e5e5e5ebebebefefefeeeeeeebebebeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeefefefe9e9e9f2f2f2ebebeb999999eeeeeef0f0f0ebebebf2eaf7e7f4e3 7b87db7280e36e77c45450c85f66ce6d80dc758fdc7988e7e5f2e0f1ecf2f2eceeedecea e6eff67f888febf2f8f2f9ffecf1f7f3f6fdf0f3faf2f2faf1f6f9f1f6f9f1f6f9f1f6f9 f1f6f9f1f6f9f1f6f9f1f6f9faffffeff4f8ecf1f5fbffffe5eaeef7fcfff4f9fde9eef2 f1f6f9f1f6f9f1f6f9f1f6f9f1f6f9f1f6f9f1f6f9f1f6f9f1f6f9f1f6f9f1f6f9f1f6f9 f1f6f9f1f6f9f1f6f9f1f6f9f4f9fceef3f6f1f6f9e7eceff6fbfeebf0f3fbffffedf2f5 f1f6f9f1f6f9f1f6f9f1f6f9f1f6f9f1f6f9f1f6f9f1f6f9f1f6f9f1f6f9f1f6f9f1f6f9 f1f6f9f1f6f9f1f6f9f1f6f9eff4f8f7fcfff4f9fdf9fefff7fcffe9eef2f1f6faecf1f5 f1f6f9f1f6f9f1f6f9f1f6f9f1f6f9f1f6f9f1f6f9f1f6f9f1f6f9f1f6f9f1f6f9f1f6f9 f1f6f9f1f6f9f1f6f9f1f6f9f1f6f9f1f6f9f1f6f9f1f6f9f1f6f9f1f6f9f1f6f9f1f6f9 f1f6f9f1f6f9f1f6f9f1f6f9f1f6f9f1f6f9f1f6f9f1f6f9f1f6f9f1f6f9f1f6f9f1f6f9 f1f6f9f1f6f9f1f6f9f1f6f9f1f6f9f1f6f9f1f6f9f1f6f9f1f6f9f1f6f9f1f6f9f1f6f9 edf2f5f1f9fcebf4f9808990e7eef4f0f1f5eeecedf2edeae6eff67f888febf2f8f2f9ff ecf1f7f3f6fdf0f3faf2f2faf1f6f9f1f6f9f1f6f9f1f6f9f1f6f9f1f6f9f1f6f9f1f6f9 fbffffeaeff3f9feffe5eaeeeaeff3e6ebeff4f9fdf3f8fcfbffffe9eef2ebf0f4e8edf1 e5eaeef2f7fbf3f8fceaeff3ebf0f4f0f5f9f4f9fde8edf1e5eaeee9eef2ebf0f4fbffff eff4f8dfe4e8fbffffeff4f8f4f9fdeef3f7eaeff3e6ebefeff4f8e8edf1f9feffeef3f7 f5fafeeaeff3fbfffff4f9fdf1f6f9f1f6f9f1f6f9f1f6f9f1f6f9f1f6f9f1f6f9f1f6f9 ebf0f4f0f5f9f4f9fde8edf1e5eaeee9eef2ebf0f4fbfffff1f6f9f1f6f9f1f6f9f1f6f9 f1f6f9f1f6f9f1f6f9f1f6f9f1f6f9f1f6f9f1f6f9f1f6f9f1f6f9f1f6f9f1f6f9f1f6f9 f1f6f9f1f6f9f1f6f9f1f6f9f1f6f9f1f6f9f1f6f9f1f6f9eff5f5ebf3f5ebf4f9e8f3f9 eff8ff7f848aecedf1eeeef0eceee9eef2f1e8f0f2818a91e9f2fbecf3fdeceff8f2f2fa f1f6f9f1f6f9f1f6f9f1f6f9f1f6f9f1f6f9f1f6f9f1f6f9f4f9fdeff4f8f7fcffe9eef2 e6ebefecf1f5e9eef2f1f6faecf1f5e7ecf0eef3f7faffffd5dadef5fafef2f7fbf9feff f1f6f9f1f6f9f1f6f9f1f6f9f1f6f9f1f6f9f1f6f9f1f6f9f1f6f9edf2f5eff4f7eff4f7 f3f8fbfaffffeff4f7ebf0f3f4f9fdeff4f8f7fcffe9eef2e6ebefecf1f5e9eef2f1f6fa f6fbfee4e9ecedf2f5ecf1f4ebf0f3f7fcfff5fafdf8fdfff1f6f9f1f6f9f1f6f9f1f6f9 f1f6f9f1f6f9f1f6f9f1f6f9f1f6f9f1f6f9f7fcfff1f6f9f0f5f8f2f7faebf0f3ebf0f3 f1f6f9f1f6f9f1f6f9f1f6f9f1f6f9f1f6f9f1f6f9f1f6f9f1f6f9f1f6f9f1f6f9f1f6f9 f1f6f9f1f6f9f1f6f9f1f6f9f1f6f9f1f6f9f1f6f9f1f6f9f1f6f9f1f6f9f1f6f9f1f6f9 f1f6f9f1f6f9f1f6f9f1f6f9f1f6f9f1f6f9f1f6f9f1f6f9808990e9eef2ebeceef0efed eeedebefeeec969799ebeff2eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee3e3e3e3e3e3e7e7e7ededed f0f0f0efefefefefeff1f1f1f1f1f1efefefefefefefefefececece9e9e9edededf3f3f3 eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeef2f2f2efefefebebebebebeb eeeeeef0f0f0efefefedededefefeff0f0f0f1f1f1eeeeeeeaeaeaeaeaeaedededf0f0f0 eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeef2f2f2e8e8e8edededf2f2f2 f2f2f2efefeff1f1f1e9e9e9eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee ededed9b9b9befefefecececf2f2f2ebebebefefef9a9a9aeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eaeaeaedededf0f0f0f0f0f0ececece9e9e9eaeaeaebebebefefeff0f0f0f1f1f1eeeeee eaeaeaeaeaeaedededf0f0f0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee e4e4e4ebebebe6e6e6f8f8f8e9e9e9f1f1f1e6e6e6ededede6e6e6eeeeeef3f3f3efefef e9e9e9e8e8e8e9e9e9eaeaeaeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeebebebf2f2f2f4f4f4ebebebebebebefefefeaeaeaeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee efefefe9e9e9f2f2f2ebebeb999999eeeeeef0f0f0ebebebf2eaf7e7f4e37b87db7280e3 6e77c45450c85f66ce6d80dc758fdc7988e7e5f2e0f1ecf2f2eceeedeceae5ecf47f868e ecf3f9f6fbfff0f3f8f6f9fef4f5faf4f5faf3f9f7f3f9f7f3f9f7f3f9f7f3f9f7f3f9f7 f3f9f7f3f9f7ecf1f5eaeff3e9eef2f1f6faf0f5f9f8fdfff8fdfff5fafef3f9f7f3f9f7 f3f9f7f3f9f7f3f9f7f3f9f7f3f9f7f3f9f7f3f9f7f3f9f7f3f9f7f3f9f7f3f9f7f3f9f7 f3f9f7f3f9f7fbffffcfd5d3fbfffffbffffecf2f0f3f9f7f3f9f7f1f7f5f3f9f7f3f9f7 f3f9f7f3f9f7f3f9f7f3f9f7f3f9f7f3f9f7f3f9f7f3f9f7f3f9f7f3f9f7f3f9f7f3f9f7 f3f9f7f3f9f7e6ebeff9fefff2f7fbeff4f8e6ebeff8fdfff7fcffecf1f5f3f9f7f3f9f7 f3f9f7f3f9f7f3f9f7f3f9f7f3f9f7f3f9f7f3f9f7f3f9f7f3f9f7f3f9f7f3f9f7f3f9f7 f3f9f7f3f9f7f3f9f7f3f9f7f3f9f7f3f9f7f3f9f7f3f9f7f3f9f7f3f9f7f3f9f7f3f9f7 f3f9f7f3f9f7f3f9f7f3f9f7f3f9f7f3f9f7f3f9f7f3f9f7f3f9f7f3f9f7f3f9f7f3f9f7 f3f9f7f3f9f7f3f9f7f3f9f7f3f9f7f3f9f7f3f9f7f3f9f7f3f9f7f3f9f7f2f6f9f7fcff eff6fc818a91e8eff5eef2f5edebecf0ece9e5ecf47f868eecf3f9f6fbfff0f3f8f6f9fe f4f5faf4f5faf3f9f7f3f9f7f3f9f7f3f9f7f3f9f7f3f9f7f3f9f7f3f9f7eef3f7dee3e7 fbfffff1f6fafbfffff7fcfffbfffff6fbffeff4f8f7fcfffbfffff1f6fafbfffffbffff e5eaeef6fbfffaffffdee3e7fbfffffbffffebf0f4fafffffbffffebf0f4f5fafee6ebef f8fdffeaeff3f6fbffeff4f8fbfffffbfffff8fdfff1f6fafafffff5fafeecf1f5e7ecf0 f0f5f9e9eef2f3f9f7f3f9f7f3f9f7f3f9f7f3f9f7f3f9f7f3f9f7f3f9f7faffffdee3e7 fbfffffbffffebf0f4fafffffbffffebf0f4f3f9f7f3f9f7f3f9f7f3f9f7f3f9f7f3f9f7 f3f9f7f3f9f7f3f9f7f3f9f7f3f9f7f3f9f7f3f9f7f3f9f7f3f9f7f3f9f7f3f9f7f3f9f7 f3f9f7f3f9f7f3f9f7f3f9f7f3f9f7f3f9f7f8faf9f3f7faf1f9fceef7fef3fcff81868a edeef2eeeeeeedeee9eef2f1eaeff2838c91edf6fdf4f8fff2f5fcf8f7fdf3f9f7f3f9f7 f3f9f7f3f9f7f3f9f7f3f9f7f3f9f7f3f9f7f8fdffeef3f7edf2f6fbfffff6fbfff3f8fc ecf1f5fbfffffbfffff3f8fce6ebeffbfffff1f6faf9feffe7ecf0f5fafef3f9f7f3f9f7 f3f9f7f3f9f7f3f9f7f3f9f7f3f9f7f3f9f7fbfffff3f9f7e7edebeff5f3fbffffdce2e0 fbfffff2f8f6f8fdffeef3f7edf2f6fbfffff6fbfff3f8fcecf1f5fbfffff4faf8f4faf8 f9fffdeff5f3e9efedfbfffffbffffe7edebf3f9f7f3f9f7f3f9f7f3f9f7f3f9f7f3f9f7 f3f9f7f3f9f7f7fdfbfbffffdbe1dffbfffff0f6f4e8eeecf1f7f5f9fffdf3f9f7f3f9f7 f3f9f7f3f9f7f3f9f7f3f9f7f3f9f7f3f9f7f3f9f7f3f9f7f3f9f7f3f9f7f3f9f7f3f9f7 f3f9f7f3f9f7f3f9f7f3f9f7f3f9f7f3f9f7f3f9f7f3f9f7f3f9f7f3f9f7f3f9f7f3f9f7 f3f9f7f3f9f7f3f9f7f3f9f7f3f9f7f3f9f7808990e9eef2ebeceef0efedeeedebefeeec 969799ebeff2eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeef8f8f8f0f0f0edededefefeff0f0f0ececec edededf3f3f3f1f1f1eeeeeef0f0f0f5f5f5f3f3f3ebebebe9e9e9edededeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeef1f1f1efefefedededebebebebebebececec eeeeeeefefeff0f0f0efefefedededebebebebebebecececeeeeeeefefefeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeef7f7f7ececece9e9e9f6f6f6e7e7e7ededed f0f0f0f1f1f1eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeededed9b9b9b efefefecececf2f2f2ebebebefefef9a9a9aeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeefefeff1f1f1 f3f3f3f4f4f4f4f4f4f2f2f2f0f0f0eeeeeef0f0f0efefefedededebebebebebebececec eeeeeeefefefeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeef4f4f4f3f3f3 e5e5e5fafafaebebebf7f7f7eaeaeaf3f3f3efefeff6f6f6f7f7f7eeeeeee9e9e9ededed f3f3f3f3f3f3eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeececece6e6e6 efefeff4f4f4ecececeeeeeef2f2f2eaeaeaeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeefefefe9e9e9 f2f2f2ebebeb999999eeeeeef0f0f0ebebebf2eaf7e7f4e37b87db7280e36e77c45450c8 5f66ce6d80dc758fdc7988e7e5f2e0f1ecf2f2eceeedeceae7eef6838790f1f6fcfbfeff f5f8fdfcfdfffafafcf9f9fbf8fcfbf8fcfbf8fcfbf8fcfbf8fcfbf8fcfbf8fcfbf8fcfb f8fcfffcfffffcfffff4f8fbfcffffeef2f5eef2f5fcfffff8fcfbf8fcfbf8fcfbf8fcfb f8fcfbf8fcfbf8fcfbf8fcfbf8fcfbf8fcfbf8fcfbf8fcfbf8fcfbf8fcfbf8fcfbf8fcfb f6faf9edf1f0f6faf9fcfffff0f4f3f7fbfaf7fbfafbfffef8fcfbf8fcfbf8fcfbf8fcfb f8fcfbf8fcfbf8fcfbf8fcfbf8fcfbf8fcfbf8fcfbf8fcfbf8fcfbf8fcfbf8fcfbf8fcfb fcfffffcfffff4f8fbfbffffe6eaedfcfffff3f7faf8fcfff8fcfbf8fcfbf8fcfbf8fcfb f8fcfbf8fcfbf8fcfbf8fcfbf8fcfbf8fcfbf8fcfbf8fcfbf8fcfbf8fcfbf8fcfbf8fcfb f8fcfbf8fcfbf8fcfbf8fcfbf8fcfbf8fcfbf8fcfbf8fcfbf8fcfbf8fcfbf8fcfbf8fcfb f8fcfbf8fcfbf8fcfbf8fcfbf8fcfbf8fcfbf8fcfbf8fcfbf8fcfbf8fcfbf8fcfbf8fcfb f8fcfbf8fcfbf8fcfbf8fcfbf8fcfbf8fcfbf8fcfbf8fcfbf8f9fdfbfefff0f7fd828b92 e7eef4edf1f4ecececeeede9e7eef6838790f1f6fcfbfefff5f8fdfcfdfffafafcf9f9fb f8fcfbf8fcfbf8fcfbf8fcfbf8fcfbf8fcfbf8fcfbf8fcfbfcfffff5f9fcfbfffff0f4f7 fcfffffbfffffafeffedf1f4f6fafdf1f5f8f1f5f8f0f4f7f6fafdfbfffff5f9fcf6fafd fafeffedf1f4fcfffffcffffeaeef1f0f4f7f8fcfff2f6f9fcfffff9fdffedf1f4f1f5f8 fcffffedf1f4fcffffe3e7eafafefff4f8fbedf1f4fbfffffafefffcfffffcfffffbffff f8fcfbf8fcfbf8fcfbf8fcfbf8fcfbf8fcfbf8fcfbf8fcfbfafeffedf1f4fcfffffcffff eaeef1f0f4f7f8fcfff2f6f9f8fcfbf8fcfbf8fcfbf8fcfbf8fcfbf8fcfbf8fcfbf8fcfb f8fcfbf8fcfbf8fcfbf8fcfbf8fcfbf8fcfbf8fcfbf8fcfbf8fcfbf8fcfbf8fcfbf8fcfb f8fcfbf8fcfbf8fcfbf8fcfbfefcfdfafbfdf8fbfff3fafff7feff84898deeeff1efefef ececeaeff1f0e9eef1858c92f2f9fffafffffafbfffefefff8fcfbf8fcfbf8fcfbf8fcfb f8fcfbf8fcfbf8fcfbf8fcfbf6fafdfcffffecf0f3fcfffff4f8fbfafeffe7ebeeecf0f3 ebeff2f3f7faf7fbfeeff3f6fcffffeff3f6f0f4f7f7fbfef8fcfbf8fcfbf8fcfbf8fcfb f8fcfbf8fcfbf8fcfbf8fcfbf9fdfcfafefdfcfffffafefdf7fbfae6eae9f4f8f7fcffff f6fafdfcffffecf0f3fcfffff4f8fbfafeffe7ebeeecf0f3e8ecebf8fcfbfcfffffcffff f6faf9f4f8f7fafefdf4f8f7f8fcfbf8fcfbf8fcfbf8fcfbf8fcfbf8fcfbf8fcfbf8fcfb fbfffef5f9f8e8ecebf8fcfbf9fdfcfcfffff9fdfcfbfffef8fcfbf8fcfbf8fcfbf8fcfb f8fcfbf8fcfbf8fcfbf8fcfbf8fcfbf8fcfbf8fcfbf8fcfbf8fcfbf8fcfbf8fcfbf8fcfb f8fcfbf8fcfbf8fcfbf8fcfbf8fcfbf8fcfbf8fcfbf8fcfbf8fcfbf8fcfbf8fcfbf8fcfb f8fcfbf8fcfbf8fcfbf8fcfb808990e9eef2ebeceef0efedeeedebefeeec969799ebeff2 eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeef3f3f3ececece9e9e9ebebebecececebebebeaeaeaececec ececece9e9e9eaeaeaefefeff1f1f1efefefededededededeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeee7e7e7edededf4f4f4f4f4f4f0f0f0ebebebe8e8e8e8e8e8 e7e7e7e7e7e7eaeaeaf0f0f0f5f5f5f4f4f4eeeeeee8e8e8eeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeedededf1f1f1e6e6e6fafafadfdfdff0f0f0e7e7e7f4f4f4 eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeededed9b9b9befefefececec f2f2f2ebebebefefef9a9a9aeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeef0f0f0eaeaeae4e4e4e3e3e3 e8e8e8eeeeeef1f1f1f1f1f1e7e7e7e7e7e7eaeaeaf0f0f0f5f5f5f4f4f4eeeeeee8e8e8 eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeef8f8f8f0f0f0dfdfdfebebeb e5e5e5f2f2f2edededf4f4f4f0f0f0ededede7e7e7e6e6e6edededf4f4f4f2f2f2ebebeb eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeef9f9f9ebebebe3e3e3e4e4e4 ebebebf3f3f3f3f3f3ebebebeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeefefefe9e9e9f2f2f2ebebeb 999999eeeeeef0f0f0ebebebf2eaf7e7f4e37b87db7280e36e77c45450c85f66ce6d80dc 758fdc7988e7e5f2e0f1ecf2f2eceeedeceaedf1fc878b94f5f8fffcfffffafbffffffff fdfdfdfdfdfbfdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffef5f6f8fbfcfe f4f5f7f2f3f5fefffffefffffefffffefffffdfffefdfffefdfffefdfffefdfffefdfffe fdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffef3f5f4feffff f8faf9f6f8f7fefffff4f6f5fefffffcfefdfdfffefdfffefdfffefdfffefdfffefdfffe fdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffef6f7f9f0f1f3 f7f8fafefffffefffffefffff5f6f8fefffffdfffefdfffefdfffefdfffefdfffefdfffe fdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffe fdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffe fdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffe fdfffefdfffefdfffefdfffefdfffefdfffefaf9fefcfffff3f8fe828991e7eef4ecf1f4 ebedecedeee9edf1fc878b94f5f8fffcfffffafbfffffffffdfdfdfdfdfbfdfffefdfffe fdfffefdfffefdfffefdfffefdfffefdfffef3f4f6fefffff8f9fbfafbfdfcfdfff3f4f6 fefffffefffffefffffdfefffbfcfefefffff3f4f6f4f5f7fefffff4f5f7f7f8fafeffff f3f4f6f5f6f8fefffffcfdfffefffffeffffeff0f2fefffffefffffefffffefffff9fafc fcfdfffefffffdfefffefffffefffffdfefffcfdfff6f7f9eff0f2fbfcfefdfffefdfffe fdfffefdfffefdfffefdfffefdfffefdfffef7f8fafefffff3f4f6f5f6f8fefffffcfdff fefffffefffffdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffe fdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffe fdfffefdfffefffdfcfdfbfcfbfcfff6fbfff8ffff84898cecf0efeef0ededeceaefefef e9edf0878c90f6fbfffcfffffdfdfffffffdfdfffefdfffefdfffefdfffefdfffefdfffe fdfffefdfffef9fafcfefffff7f8fafefffff3f4f6fefffffefffffefffffefffffeffff fbfcfef8f9fbf9fafcfefffffefffffefffffdfffefdfffefdfffefdfffefdfffefdfffe fdfffefdfffef9fbfaf6f8f7fefffffdfffef1f3f2fefffff6f8f7fefffff9fafcfeffff f7f8fafefffff3f4f6fefffffefffffefffffefffffeffffedefeef9fbfafefffffafcfb fefffffefffffdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefefffff6f8f7 fefffff3f5f4fbfdfcfefffff6f8f7fefffffdfffefdfffefdfffefdfffefdfffefdfffe fdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffe fdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffefdfffe fdfffefdfffe808990e9eef2ebeceef0efedeeedebefeeec969799ebeff2eeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeefefeff0f0f0f0f0f0efefeff2f2f2f5f5f5f1f1f1eaeaeaf3f3f3f5f5f5 f3f3f3edededebebebeeeeeef0f0f0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeecececeeeeeeefefefefefefeeeeeef0f0f0f6f6f6fafafaf8f8f8f4f4f4 efefefeeeeeeefefeff0f0f0f0f0f0efefefeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeee5e5e5f9f9f9edededf4f4f4edededf8f8f8e8e8e8f4f4f4eeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeededed9b9b9befefefecececf2f2f2ebebeb efefef9a9a9aeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeef4f4f4f2f2f2f2f2f2f3f3f3f5f5f5f3f3f3 eeeeeeeaeaeaf8f8f8f4f4f4efefefeeeeeeefefeff0f0f0f0f0f0efefefeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee5e5e5e9e9e9efefefeeeeeef3f3f3f2f2f2 f0f0f0e9e9e9edededf0f0f0f5f5f5f5f5f5ededede4e4e4e6e6e6ecececeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee8e8e8f7f7f7f7f7f7f2f2f2f5f5f5ededed e9e9e9f5f5f5eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeefefefe9e9e9f2f2f2ebebeb999999eeeeee f0f0f0ebebebf2eaf7e7f4e37b87db7280e36e77c45450c85f66ce6d80dc758fdc7988e7 e5f2e0f1ecf2f2eceeedeceaedf1fc878a93f4f7fefefffff8f8fafffffffdfcfafdfcf8 fbfcfffbfcfffbfcfffbfcfffbfcfffbfcfffbfcfffbfcfffefffffefffff9fafcfeffff e4e5e7fefffffafbfdf4f5f7fbfcfffbfcfffbfcfffbfcfffbfcfffbfcfffbfcfffbfcff fbfcfffbfcfffbfcfffbfcfffbfcfffbfcfffbfcfffbfcfffafbffdddee2fdfeffeff0f4 fefffff3f4f8fefffff4f5f9fbfcfffbfcfffbfcfffbfcfffbfcfffbfcfffbfcfffbfcff fbfcfffbfcfffbfcfffbfcfffbfcfffbfcfffbfcfffbfcfffbfcfef9fafcfeffffeff0f2 f3f4f6f0f1f3f3f4f6f7f8fafbfcfffbfcfffbfcfffbfcfffbfcfffbfcfffbfcfffbfcff fbfcfffbfcfffbfcfffbfcfffbfcfffbfcfffbfcfffbfcfffbfcfffbfcfffbfcfffbfcff fbfcfffbfcfffbfcfffbfcfffbfcfffbfcfffbfcfffbfcfffbfcfffbfcfffbfcfffbfcff fbfcfffbfcfffbfcfffbfcfffbfcfffbfcfffbfcfffbfcfffbfcfffbfcfffbfcfffbfcff fbfcfffbfcfffbfcfffbfcfffaf9fefdfefff2f7fd828991e6edf3ebf0f3e9edececeee9 edf1fc878a93f4f7fefefffff8f8fafffffffdfcfafdfcf8fbfcfffbfcfffbfcfffbfcff fbfcfffbfcfffbfcfffbfcffeaebedfeffffe5e6e8fefffffefffff3f4f6f4f5f7feffff e6e7e9feffffe7e8eaf4f5f7fefffff0f1f3fefffffefffffefffffeffffedeef0feffff f8f9fbeaebedfeffffe6e7e9f5f6f8fefffffefffff4f5f7f5f6f8feffffdadbddfeffff f3f4f6fdfefffeffffe2e3e5fefffffafbfdfdfefffefffffbfcfffbfcfffbfcfffbfcff fbfcfffbfcfffbfcfffbfcfffefffffeffffedeef0fefffff8f9fbeaebedfeffffe6e7e9 fbfcfffbfcfffbfcfffbfcfffbfcfffbfcfffbfcfffbfcfffbfcfffbfcfffbfcfffbfcff fbfcfffbfcfffbfcfffbfcfffbfcfffbfcfffbfcfffbfcfffbfcfffbfcfffbfcfffbfcff fff8f9fdf9fafbfafff6f9fef9feff83888beaeeedeceeebedeceaeeeeeee7ebee858a8e f4f9fdfbfffffafaf8fcfbf7fbfcfffbfcfffbfcfffbfcfffbfcfffbfcfffbfcfffbfcff f6f7f9fbfcfefefffffafbfdfeffffdbdcdef5f6f8f2f3f5feffffeeeff1f3f4f6feffff f5f6f8e6e7e9feffffeaebedfbfcfffbfcfffbfcfffbfcfffbfcfffbfcfffbfcfffbfcff fafbfff5f6faf8f9fdf3f4f8fafbffe6e7ebfafbfffefffff6f7f9fbfcfefefffffafbfd feffffdbdcdef5f6f8f2f3f5e6e7ebfefffff3f4f8edeef2fefffff4f5f9f1f2f6f8f9fd fbfcfffbfcfffbfcfffbfcfffbfcfffbfcfffbfcfffbfcfffdfefffafbffe6e7ebfafbff f3f4f8f7f8fcf6f7fbfcfdfffbfcfffbfcfffbfcfffbfcfffbfcfffbfcfffbfcfffbfcff fbfcfffbfcfffbfcfffbfcfffbfcfffbfcfffbfcfffbfcfffbfcfffbfcfffbfcfffbfcff fbfcfffbfcfffbfcfffbfcfffbfcfffbfcfffbfcfffbfcfffbfcfffbfcfffbfcfffbfcff 808990e9eef2ebeceef0efedeeedebefeeec969799ebeff2eeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee edededf2f2f2ebebebe0e0e0e4e4e4f2f2f2f3f3f3e7e7e7dfdfdff3f3f3fcfcfcf1f1f1 e9e9e9eeeeeef0f0f0ebebebeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee f3f3f3eeeeeee9e9e9e9e9e9ebebebebebebe7e7e7e2e2e2e2e2e2e6e6e6ebebebebebeb e9e9e9eaeaeaefefeff4f4f4eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee e8e8e8fbfbfbf0f0f0d0d0d0fafafaf4f4f4efefeff3f3f3eeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeededed9b9b9befefefecececf2f2f2ebebebefefef9a9a9a eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeee1e1e1e6e6e6ebebebecececeaeaeaeaeaeaefefeff3f3f3 e2e2e2e6e6e6ebebebebebebe9e9e9eaeaeaefefeff4f4f4eeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeaeaeaf4f4f4ffffffe2e2e2eaeaeae1e1e1f7f7f7f1f1f1 f5f5f5e8e8e8e5e5e5efefeff1f1f1ebebebefefeffbfbfbeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeedcdcdcf4f4f4e8e8e8e0e0e0f5f5f5ededede0e0e0f8f8f8 eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeefefefe9e9e9f2f2f2ebebeb999999eeeeeef0f0f0ebebeb f2eaf7e7f4e37b87db7280e36e77c45450c85f66ce6d80dc758fdc7988e7e5f2e0f1ecf2 f2eceeedeceaebedf9848790eff2f9f9fafff3f3f5fafaf8f9f8f4f9f8f3f7f8fdf7f8fd f7f8fdf7f8fdf7f8fdf7f8fdf7f8fdf7f8fdf6f7f9f6f7f9eff0f2f5f6f8303133353638 2f30322f3032f7f8fdf7f8fdf7f8fdf7f8fdf7f8fdf7f8fdf7f8fdf7f8fdf7f8fdf7f8fd f7f8fdf7f8fdf7f8fdf7f8fdf7f8fdf7f8fdf6f7fc44454af9fafff1f2f7f8f9fef7f8fd f9fafff2f3f8f7f8fdf7f8fdf7f8fdf7f8fdf7f8fdf7f8fdf7f8fdf7f8fdf7f8fdf7f8fd f7f8fdf7f8fdf7f8fdf7f8fdf7f8fdf7f8fdfbfcfef0f1f3e7e8ea454648343537292a2c 4546482b2c2ef7f8fdf7f8fdf7f8fdf7f8fdf7f8fdf7f8fdf7f8fdf7f8fdf7f8fdf7f8fd f7f8fdf7f8fdf7f8fdf7f8fdf7f8fdf7f8fdf7f8fdf7f8fdf7f8fdf7f8fdf7f8fdf7f8fd f7f8fdf7f8fdf7f8fdf7f8fdf7f8fdf7f8fdf7f8fdf7f8fdf7f8fdf7f8fdf7f8fdf7f8fd f7f8fdf7f8fdf7f8fdf7f8fdf7f8fdf7f8fdf7f8fdf7f8fdf7f8fdf7f8fdf7f8fdf7f8fd f7f8fdf7f8fdfbf9fefdfefff1f6fc818890e5eef3e9f1f3e9edececeee9ebedf9848790 eff2f9f9fafff3f3f5fafaf8f9f8f4f9f8f3f7f8fdf7f8fdf7f8fdf7f8fdf7f8fdf7f8fd f7f8fdf7f8fdfafbfdecedef37383a2f303235363837383a3132342d2e30f6f7f9feffff 2f3032323335f8f9fbfeffffe3e4e6f7f8faf5f6f8eaebedfefffff0f1f33a3b3d333436 f9fafcf8f9fbfeffffeff0f2fafbfdeff0f2f6f7f9fafbfd343537323335343537252628 37383a38393bedeef0edeef0fefffff0f1f3f7f8fdf7f8fdf7f8fdf7f8fdf7f8fdf7f8fd f7f8fdf7f8fdf5f6f8eaebedfefffff0f1f33a3b3d333436f9fafcf8f9fbf7f8fdf7f8fd f7f8fdf7f8fdf7f8fdf7f8fdf7f8fdf7f8fdf7f8fdf7f8fdf7f8fdf7f8fdf7f8fdf7f8fd f7f8fdf7f8fdf7f8fdf7f8fdf7f8fdf7f8fdf7f8fdf7f8fdf7f8fdf7f8fdfff7f5fbf5f7 f9f9fbf4f7fcf7fcff818787e8ecebeaece7f0ecebeeeeeee8e9ed83888cf1f6f9f9fafc f5f5f3f9f6f1f7f8fdf7f8fdf7f8fdf7f8fdf7f8fdf7f8fdf7f8fdf7f8fdfeffffe5e6e8 fefffff7f8fae5e6e84344463b3c3e2f30323031332f3032feffffeff0f2edeef0414244 f1f2f4fefffff7f8fdf7f8fdf7f8fdf7f8fdf7f8fdf7f8fdf7f8fdf7f8fdf1f2f7feffff f6f7fceff0f5f9faff47484dedeef3f9fafffeffffe5e6e8fefffff7f8fae5e6e8434446 3b3c3e2f303244454adedfe4fefffff5f6fbf9fafff3f4f9f8f9fefcfdfff7f8fdf7f8fd f7f8fdf7f8fdf7f8fdf7f8fdf7f8fdf7f8fdfcfdffecedf244454af7f8fdf1f2f7f9faff feffffeeeff4f7f8fdf7f8fdf7f8fdf7f8fdf7f8fdf7f8fdf7f8fdf7f8fdf7f8fdf7f8fd f7f8fdf7f8fdf7f8fdf7f8fdf7f8fdf7f8fdf7f8fdf7f8fdf7f8fdf7f8fdf7f8fdf7f8fd f7f8fdf7f8fdf7f8fdf7f8fdf7f8fdf7f8fdf7f8fdf7f8fdf7f8fdf7f8fd808990e9eef2 ebeceef0efedeeedebefeeec969799ebeff2eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee9393939d9d9d 9b9b9b969696aeaeaedbdbdbf4f4f4f1f1f1adadadd7d7d7f5f5f5f1f1f1e9e9e9f0f0f0 f3f3f3ebebebeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeebebebebebeb efefeff5f5f5f2f2f2dadadab2b2b2939393949494b4b4b4dbdbdbf3f3f3f5f5f5eeeeee e9e9e9e9e9e9eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeebebebf4f4f4 e7e7e7a1a1a1f8f8f8e3e3e3f1f1f1efefefeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeededed9b9b9befefefecececf2f2f2ebebebefefef9a9a9aeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeee9f9f9f9f9f9f9b9b9b939393969696adadadd5d5d5f4f4f4949494b4b4b4 dbdbdbf3f3f3f5f5f5eeeeeee9e9e9e9e9e9eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeef1f1f1ededede8e8e89a9a9a9f9f9fa2a2a2e3e3e3f2f2f2e8e8e8ababab 878787aaaaaae3e3e3f9f9f9f0f0f0e5e5e5eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeef9f9f9e5e5e5a1a1a1999999e5e5e5fcfcfce4e4e4efefefeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeefefefe9e9e9f2f2f2ebebeb999999eeeeeef0f0f0ebebebf2eaf7e7f4e3 7b87db7280e36e77c45450c85f66ce6d80dc758fdc7988e7e5f2e0f1ecf2f2eceeedecea e3f2ef848f91ecf5fcf0f6ffeff3fff3f5ffedeffbf6f6ffeef6f9eef6f9eef6f9eef6f9 eef6f9eef6f9eef6f9eef6f9eaf1f9f5fafff9fafe3030323c3a3defeef3f1f4f9363b41 2d3738e8f2f4eaf2f5e7eff2fbffffeff2f9eff2f9f8fbffdde1e4fcffffedf1f4fcffff dadee1f6fafdfcffffedf1f4383830302e31f5f3fef2f1f9e7e9e6f3f8f2f1f5f8f0f2ff f1f7f7e6eaebfcffffdadedffeffffe7e8ecf7f8fcf8f9fde9efededf1f0f5f9faf0f4f5 fafbffeaebf0fcfdfff3f4f9e6e7e9fdfeff31323427282afcffffeff3f6e8ecef353a3e 3b484ed5e0e4f1fbfdf5fdffdae0e0fcffffeaece9fcfdf8e3e8ecf3f3f3ece8e5fcfdff f7ffffdfecf5fcfffff7f0eaedf1f4fcffffd9dde0fbfffffafeffecf0f3f5f9fcf5f9fc f3f7faf4f8fbeff3f6f0f4f7f3f7faf3f7faeff3f6ecf0f3f0f4f5f7fcffe2e9eff6ffff eaf3fce5e9f2fefefff6f5fbeef6f9eef6f9eef6f9eef6f9eef6f9eef6f9eef6f9eef6f9 edf1f4eff3f6eff3f6868a8de8e9ebf0f1f3f0f1f3e8e9ebe3f2ef848f91ecf5fcf0f6ff eff3fff3f5ffedeffbf6f6ffeef6f9eef6f9eef6f9eef6f9eef6f9eef6f9eef6f9eef6f9 e8f7fef7fbfc312829423c40f4f6ffe7effcf0f5f932332e232522fefffdf1f3f2eeeff1 feffffe3e4e9fefeffefeff7eeeeeef7f7f7edeef0f3f4f63236392e3235eef3f7eff4f8 e5edeff9fffff2f5faecedf2f7f6fbffffff1a1c1b3a3c39e9eaecfbfcfef9fafc2e2f31 363a3de0e4e7f6fafdf2f7fbeaeff2fbfffff3f8fbe6ebeef4f9fcf0f5f8ebf0f3f4f9fc e8eceff0f4f7fcfffff0f4f7e5e9ecfcffffe8eceff8fcfff3f7faeef2f5ecf0f3eff3f6 fafeffe9edf0eaeef1f3f7faf4faf8eaeeeff4f5f9fcfbffe3e3ebfbffffecf5fae8f6f7 eef6f9eef6f9eef6f9eef6f9eef6f9eef6f9eef6f9eef6f9efeff1f6f7fbebf0f6ebf4fd e5eef7858c94eaeff5eaedf2f0f0f0ecedefeaeff3848d94e7f0f7edf4faeff4f8eff0f2 eef6f9eef6f9eef6f9eef6f9eef6f9eef6f9eef6f9eef6f9f0f9ffdde4eaf4fbffe9eef2 35393c313538eaebedf9fafceff7f92931332e3336f1f5f83d3e42323136fefcfff5f3f8 ecf0f3f8fcffeff3f6eef2f5f1f5f8f7fbfee6eaedfcfffffbf7f4e8edf1eef8ffedf4fa 383735332e2aecedeff7fffff0f9feebf3f6eef2f3feffff292a2c33373aeaf1f7ecf5fe 353e45283138e8eff5eef5fbf8fdffecf0f3eef2f5f4f8fbf6fafdecf0f3f3f7fadfe3e6 f6fafdf4f8fbeef2f5eff3f6ecf1ed393e3a2f3332ebeff0fcffffeef1f6e4e7eefbfeff eefefddae6e4f7fffdf6fbf7e9ebeaf4f5f9fcfffff2f6fff6fdffeaeff3f1f2f4f2f2f2 edededf2f3f5f3f8fcf5fcffeef6f9eef6f9eef6f9eef6f9eef6f9eef6f9eef6f9eef6f9 eef6f9eef6f9eef6f9eef6f9eef6f9eef6f9eef6f9eef6f9808990e9eef2ebeceef0efed eeedebefeeec969799ebeff2eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee f4f4f4e9e9e9edededf6f6f6e5e5e5eeeeeee8e8e89a9a9a8d8d8df2f2f2fcfcfce3e3e3 989898a1a1a1f8f8f8909090999999e0e0e0fefefeebebebe9e9e9f1f1f1ececece7e7e7 ebebebfafafae7e7e7ebebebf2f2f2edededf1f1f1f4f4f4e7e7e7f0f0f0e5e5e5f6f6f6 e6e6e69b9b9ba1a1a1f3f3f3ecececa9a9a98f8f8fe2e2e2ffffffe0e0e0e9e9e9eeeeee edededf0f0f0e4e4e4eeeeeef0f0f0ecececf3f3f3eaeaeaeeeeeef5f5f5999999939393 efefeff7f7f7e5e5e5e7e7e7ededede8e8e8fbfbfbe6e6e6f8f8f8e2e2e2f5f5f5e4e4e4 f2f2f2e5e5e5f5f5f5e5e5e5e6e6e6e9e9e9ffffffe5e5e5eeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee ededed9b9b9befefefecececf2f2f2ebebebefefef9a9a9aeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee 9e9e9e959595f4f4f4ededede9e9e99e9e9e909090f2f2f2a0a0a08f8f8feaeaeaf5f5f5 f6f6f6e1e1e1efefefe8e8e8e7e7e7f6f6f6f1f1f1ebebebe8e8e8fcfcfcdbdbdbf2f2f2 e8e8e8f6f6f6e8e8e89b9b9b9c9c9c979797e8e8e8f5f5f5f2f2f2a0a0a09595959a9a9a f2f2f2ececece6e6e6f0f0f0e8e8e8f4f4f4ebebebefefefe6e6e6e5e5e5fafafae8e8e8 e6e6e6f5f5f5f2f2f2f0f0f0ebebebecececf1f1f1f0f0f0f7f7f7e0e0e0f5f5f5e4e4e4 fbfbfbf4f4f4e9e9e9f4f4f4eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee efefefe9e9e9f2f2f2ebebeb999999eeeeeef0f0f0ebebebf2eaf7e7f4e37b87db7280e3 6e77c45450c85f66ce6d80dc758fdc7988e7e5f2e0f1ecf2f2eceeedeceae4f0ee828d8f e9f2f9ebf3feeaf0feeff3ffeaecf8f1f4fdeaf1f7eaf1f7eaf1f7eaf1f7eaf1f7eaf1f7 eaf1f7eaf1f7e4e9eff4f7fc323337272729ededeff4f7fcedf4fcd9e2ebe7f1f3ecf6f8 f6feff333b3e24292d2e313831343be8ebf2fcffff2024272a2e31dfe3e6474b4e2f3336 e5e9ec2a2e3132322a39373a3b3944eeedf53f4140282d27f6fafdecf0fc393d3e1a1e1f eaeeef53575a1d21243b3e4334353ae6e7ecf8fcfb2428274d5152161a1d393d40ebeef3 dbdce1f1f1f9f0f1f3feffff24282b33373ae8ecefe5e9ecfbffffe6eaedd7e1e3f2fafd f3fbfe242c2e34393c232929424647e6eaebe7eef454545434302d17181a28353ee8f5fe d9dde03b342e3f43461d212444484bdfe3e6e5e9ece5e9ec363a3d31353835393c161a1d e6eaedfcffff171b1e272b2efcffff3c40432d2e30e4e9ecf9ffffcad3dcf1f9fff9ffff e3e6ededecf2eaf1f7eaf1f7eaf1f7eaf1f7eaf1f7eaf1f7eaf1f7eaf1f7eaeff3edf2f6 edf2f6868a8de6eaedeff0f2f0f1f3e9eaece4f0ee828d8fe9f2f9ebf3feeaf0feeff3ff eaecf8f1f4fdeaf1f7eaf1f7eaf1f7eaf1f7eaf1f7eaf1f7eaf1f7eaf1f7e3f2f9f0f4f7 332d2d352f33e9ebf7e2ecf8f5fcff373735414342e8eae9353638313234e7e8ecf9faff 34343c2a2a3231353823272af2f6f9dbdfe2393d403b3f42ecf0f3eff0f22b3335262e31 ebf0f6e9ecf3e9eaeff4f5f931333230322ff1f2f4f0f1f3dee2e53d41442b2f32f8fcff f5f9fc34383b373c3f212629353a3ddee3e6f9feffe3e8eb3f44472b3033f7fbfe34383b 24282be0e4e7393d40282c2ff6fafde2e6e92a2e31262a2d45494c303437ebeff2f3f7fa 3e4245303437e6ecec2a2e2f1f2024f3f4f9fefeffd5dae0e8f1f6e7f5f8eaf1f7eaf1f7 eaf1f7eaf1f7eaf1f7eaf1f7eaf1f7eaf1f7edecf1f3f6fbe8eff7eaf3fce4edf6858c94 eaeff5edeef3efefefecedefeaeff3838c93e6eff6eaf3faeef3f7ecf0f3eaf1f7eaf1f7 eaf1f7eaf1f7eaf1f7eaf1f7eaf1f7eaf1f7f1fafff1fafff0f7fdf9feff262b2f23272a fcffffeaebede3ebedeff7f9f5fafd2c30331b1c2038393d323136efeef3f9fdff191d20 4145482a2e312d3134ecf0f3e9edf02c3033403c39303539303a43242b312c2b293c3733 2e2f31e4eef7edf6fddfe7eaeaeef13435372e2f31f7fbfedfe6ecf3fcffd5dee5e5eef5 edf4fae9f0f6262b2f34383b363a3d2c3033e2e6e9f2f6f934383b414548edf1f42a2e31 373b3eeef2f5313534363a39373b3c2d3132f1f5f834373c34373eeceff6e4f4f32d3937 202926f3f8f4414342393a3e272a312b2f3ae1e8eee0e5e93e3f413b3b3b343434393a3c e5eaeee2e9efeaf1f7eaf1f7eaf1f7eaf1f7eaf1f7eaf1f7eaf1f7eaf1f7eaf1f7eaf1f7 eaf1f7eaf1f7eaf1f7eaf1f7eaf1f7eaf1f7808990e9eef2ebeceef0efedeeedebefeeec 969799ebeff2eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeedededededed eeeeeeededede7e7e7fffffff2f2f2919191a8a8a8f7f7f7dbdbdbeaeaeaffffffdfdfdf 959595a7a7a79e9e9e999999d9d9d9ecececa3a3a38f8f8fadadad9f9f9fe7e7e7e9e9e9 9f9f9f969696f4f4f4a1a1a18c8c8cedededeaeaeaedededfafafaeeeeee9f9f9f999999 e7e7e7e9e9e9e7e7e7dfdfdffafafaffffffe4e4e4a6a6a6929292aaaaaa9e9e9ee4e4e4 fefefe989898999999eeeeee888888a7a7a7e1e1e19696969e9e9e939393a4a4a4dadada a4a4a49f9f9fe7e7e7f9f9f9888888909090fafafa989898979797aaaaaa929292e8e8e8 eeeeeea6a6a6a1a1a1888888939393fbfbfbeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeededed9b9b9b efefefecececf2f2f2ebebebefefef9a9a9aeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee989898929292 eeeeeef6f6f6efefef989898949494f3f3f39f9f9f919191fcfcfce6e6e68e8e8eaaaaaa 9898989c9c9ce2e2e2a8a8a8868686f8f8f8f6f6f6ebebeb9c9c9ca3a3a3f1f1f1ededed e7e7e7a0a0a09b9b9b8c8c8caeaeaee6e6e69090908e8e8e9292929a9a9af5f5f5d6d6d6 afafaf9b9b9b999999a9a9a9d9d9d9aeaeaea0a0a0efefefebebebf3f3f3a9a9a9989898 8b8b8ba2a2a2ebebebe3e3e3a7a7a78d8d8d919191a7a7a7efefefffffffe8e8e8dfdfdf eaeaeae7e7e7eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeefefefe9e9e9 f2f2f2ebebeb999999eeeeeef0f0f0ebebebf2eaf7e7f4e37b87db7280e36e77c45450c8 5f66ce6d80dc758fdc7988e7e5f2e0f1ecf2f2eceeedeceae2eeee7f8a8ce3edf6e6eefb e5ebf9e9effde4e8f3ebeff8e5eef5e5eef5e5eef5e5eef5e5eef5e5eef5e5eef5e5eef5 f1f4f9ebecf0333335434345e3e4e8dde2e8eff9ffecf8ffd4dde2e9f2f7232b2ef6feff dee3e7eef1f6373a3f33363bebeff230343733373a3f4346dde1e4181c1f404447e9edf0 27282236353adad8e5ececf63a3e3d2c312de4e9ede6e9f8363a393e4243f3f7f8202427 32353af2f7fde0e5ebeff4fa323637222627e8ecedf4f8fb20232843484cebf0f6f3f8fe e7ecf0d4d9dd4045492b2f322c3033313538dce0e3f3f7faf2f6f7e7ebec2b3033292e31 f9ffffecf4f7242b312d363be1e8ee2122243e3d3bdee2e5f5ffffeaf8ff323639413a34 e2e6e9edf1f42f3336303437fcffff3135382f3336e7ebeeedf1f43c4043303437e3e7ea 3e42452c30332d3134d6dadd2526283e4245dee5ebf7ffffe0eaf4d1d9e4f3f7ffeaedf4 e5eef5e5eef5e5eef5e5eef5e5eef5e5eef5e5eef5e5eef5e6edf3e7eef4e9f0f6858a8e e7ebeeeff0f2eff0f2ebebebe2eeee7f8a8ce3edf6e6eefbe5ebf9e9effde4e8f3ebeff8 e5eef5e5eef5e5eef5e5eef5e5eef5e5eef5e5eef5e5eef5dbe9f4eaedf23e38383e393d e5e9f4e0eaf6e5ecf42a2c2b262729f4f5f72b2c302d2e32f2f3f847484d181820f4f4fc f1faff2b343b373e44f6fbff111518424345e5e5e52d2c2a272f31e5edf0f9ffffe1e5ee eaedf6fafeff2f31303a3b36e5eaeef9feffd9dee2363a3d323639e3e7ea3135381c2023 e1e6e9f5fafd2d3235252a2deef3f62b3033282d30eff4f72c30332c30333c4043f5f9fc 2b2f322d3134e8ecef3135382b2f32f2f6f9f4f8fb1115183a3e41e4e8eb21252834383b 384042e4e9ec464a4d303136d5d8dff2f9ffe3eef4effcffe5eef5e5eef5e5eef5e5eef5 e5eef5e5eef5e5eef5e5eef5e7eaefeff4fae4edf6e6f0fae1ebf5848b93eaedf4edeef2 f0efedecedefeaeff3838c93e3edf6e6f0f9e9f0f6e8edf1e5eef5e5eef5e5eef5e5eef5 e5eef5e5eef5e5eef5e5eef5d0d9e0e0e9f0ebf4fbe3eaf0363b3f383d41272b2e303437 e7eff1d9e1e3eef3f6f9feff3d414435393cf8f9fde4e5e92a2e31f4f8fbd6daddecf0f3 3c404343474ad8dcdf2f3336191816fbffffd9e6efeef7fe404040221e1bf7fbfee0eaf3 e5eff8e8eff7eaeff33637392e2f31e8edf1f9ffffc7d2d8f0f9ffe6eff6e0e7ed31383e f7fcffd7dbdee5e9ec363a3d313538eaeef1292d302c303325292cf3f7fa25292c323639 e7ebec2226272c3033f7fbfedee1e6282b3032353ceff2f9e0eeef283434373d3de1e5e4 2a2b2d292c31cdd1daf9ffffd8e1e851565a222629d9d9d9ffffff2c3033262b2ff8ffff e5eef5e5eef5e5eef5e5eef5e5eef5e5eef5e5eef5e5eef5e5eef5e5eef5e5eef5e5eef5 e5eef5e5eef5e5eef5e5eef5808990e9eef2ebeceef0efedeeedebefeeec969799ebeff2 eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeefefefeeeeeeeeeeeeefefef e5e5e5f4f4f4f0f0f0a6a6a68787879d9d9d9b9b9bfafafae3e3e3f4f4f4e7e7e7949494 9a9a9aeaeaeafdfdfdaaaaaa8f8f8fe3e3e3efefef8e8e8eb0b0b0f1f1f1949494a5a5a5 949494e9e9e9aaaaaa9c9c9ceeeeeef5f5f5f0f0f0e3e3e3989898939393f1f1f1f5f5f5 f1f1f1f6f6f6f1f1f1d4d4d4929292f4f4f4ebebebdcdcdc9292929e9e9ef0f0f0929292 9b9b9ba5a5a5ffffff8d8d8daaaaaae0e0e0a4a4a49d9d9de7e7e7f0f0f08a8a8aa0a0a0 f1f1f1ecececa6a6a6999999f0f0f09696968f8f8fe8e8e8ecececf7f7f79c9c9c848484 fbfbfbffffff888888989898eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeededed9b9b9befefefececec f2f2f2ebebebefefef9a9a9aeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeea1a1a19d9d9de9e9e9f8f8f8 eeeeee8f8f8f9b9b9bececec939393a0a0a0e9e9e9a9a9a9e2e2e2ffffffdcdcdc9d9d9d afafaf8e8e8e828282fdfdfdedededd5d5d5a7a7a78c8c8cf1f1f1ecececededed9b9b9b 999999a8a8a88e8e8eececec959595b3b3b39393939d9d9dedededa4a4a4a0a0a0dcdcdc e6e6e69c9c9c9c9c9c959595929292efefefececece8e8e8888888949494979797a5a5a5 e9e9e9a7a7a79a9a9af3f3f3f0f0f09595958f8f8fe3e3e3edededf2f2f2fffffff2f2f2 eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeefefefe9e9e9f2f2f2ebebeb 999999eeeeeef0f0f0ebebebf2eaf7e7f4e37b87db7280e36e77c45450c85f66ce6d80dc 758fdc7988e7e5f2e0f1ecf2f2eceeedeceae3eef07e898de0eaf3e2eaf7e0e7f7e4ecf9 dee6f1e4edf6e1eaf3e1eaf3e1eaf3e1eaf3e1eaf3e1eaf3e1eaf3e1eaf3e4e5eadfe0e4 3131332c2c2eeff2f7e8eff7dde9f5dcecfbf5feffd1dadfe9f0f6e9f0f634393d25282d 2d31342c3033dee1e633363b2c2f34dde0e5f3f6fb43464b303338e4e7ec3e3f392d2c31 f1f0fefcffff0c1011343a38e9eef4e1e7f7191d1c45494ad8dcdd282d302f343ad6dde5 f9ffffd9e0ea2b2f30414548d7dbdee5eaee3e43472b3238e3eaf2d9e0e8f0f7fde6edf3 dee5eb34393d363b3f3f4346393d4025292ce8e8e8f3f5f42d3132313639d7dee4cfd8df f0faffd8e5ede1eaf13536383b3a38eef3f7cedce7d0dee92f34382f2a26ebeef3dfe2e7 474a4f25282ddbdee32c2f3433363bdadde2d2d7db42474b373c40e5eaee24292d3d4246 dfe4e8f0f5f93e403f282c2fd0d7dde0eaf4e4f0fcd8e2eee7edf9ecf0fbe1eaf3e1eaf3 e1eaf3e1eaf3e1eaf3e1eaf3e1eaf3e1eaf3e1ebf4e1ebf4e5eef5838a90e8ecefeeeff1 eff0f2ececece3eef07e898de0eaf3e2eaf7e0e7f7e4ecf9dee6f1e4edf6e1eaf3e1eaf3 e1eaf3e1eaf3e1eaf3e1eaf3e1eaf3e1eaf3e3f3ffe0e5eb282423423e3fdee2ebebf7ff dbe4ed444549313439e2e5ea3a3d422b2e33f3f6fb16191e3c3f44e6e9f0d9e7f2d7e4ed dee8f1dce3e94d51541e1e1e36353346423ffbffffced6d9d4dde6e6eef9eaf1fbced3d9 292b2a31322d353c42131a20454c522f3438e0e5e9dce0e3383c3f43474ae3e8ecebf0f4 22272b3d4246f4f9fd282d31404549e2e7ebe9edf03d4144202427e4e8eb2e323535393c e4e8eb3034372b2f32e8ecefe1e5e8464a4d2d3134f4f8fb3135382a2e31d8e1e6eef6f9 1d202534383be2e5eaeff6fee8f5fdd0dee7e1eaf3e1eaf3e1eaf3e1eaf3e1eaf3e1eaf3 e1eaf3e1eaf3e2e7ede9f0f8dfe9f3e1edf9dfe9f3828991eaedf2edeef2f0efedecedef eaeff3818b94deebf4e0edf6e3edf6e2ebf2e1eaf3e1eaf3e1eaf3e1eaf3e1eaf3e1eaf3 e1eaf3e1eaf3f7ffffe3edf6dae3ead9e2e9e0e7ed32373b23282c33373a3c4447393e42 d5dadee1e6ea2a2f3314191ddee3e7eaeff3d3d7daf9fdff2b2f322d31343034371a1e21 e7ebee373b3e41403ee1e8eed8e6f1e2ecf52f2f2f3a3937e0e4e7e2eff8dee8f2e8f1fa e4e9ef282c2f373b3ed7dce0d7e0e5f1fcffdce5ecedf6fde3eaf0dbe2e8e5eaee2e3235 3236392f3336414548d1d5d83a3e41404447e1e5e8dce0e3383c3f2d3134ebf0f442474b 262b2feaeff3e2e7eb42474b262b2fe1e6ecd7e2e4394344323838dadbdd30313346494e f2f9ffdce4eff1faff2c3339272b2eedeef0e4e5e72f33363a4147d0d9e0e1eaf3e1eaf3 e1eaf3e1eaf3e1eaf3e1eaf3e1eaf3e1eaf3e1eaf3e1eaf3e1eaf3e1eaf3e1eaf3e1eaf3 e1eaf3e1eaf3808990e9eef2ebeceef0efedeeedebefeeec969799ebeff2eeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeef4f4f4e9e9e9ecececfcfcfce9e9e9e0e0e0 f2f2f2e2e2e2a4a4a49797979595959b9b9b939393f3f3f3e2e2e29f9f9f9c9c9cececec d9d9d9898989a4a4a4f5f5f5e7e7e79f9f9f979797dadada9b9b9b959595efefefe8e8e8 9a9a9a989898f0f0f0f1f1f1e9e9e9eaeaeaa3a3a3949494efefefedededf2f2f2e9e9e9 e9e9e9ffffffeaeaeae4e4e4a3a3a3a0a0a0a2a2a2969696dbdbdba6a6a6989898dfdfdf e8e8e8a1a1a18c8c8cfbfbfb989898a1a1a1e8e8e8f2f2f2a6a6a68f8f8ff1f1f1d4d4d4 a8a8a8939393e8e8e8aeaeae9f9f9ff3f3f3edededefefef9e9e9ea5a5a5e2e2e2eaeaea a2a2a2949494eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeededed9b9b9befefefecececf2f2f2ebebeb efefef9a9a9aeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee9090909a9a9ae1e1e1f4f4f4f1f1f19e9e9e acacacd8d8d8a3a3a3a5a5a5e0e0e0d6d6d6ffffff8d8d8dadadad9494948c8c8cf4f4f4 9f9f9f909090f3f3f3a8a8a89b9b9bf3f3f3e9e9e9f0f0f0f7f7f78f8f8f999999e3e3e3 9d9d9df9f9f99f9f9fd9d9d9959595a4a4a4f4f4f48d8d8d959595fdfdfde6e6e6a9a9a9 9d9d9de8e8e89b9b9b9c9c9cdfdfdfb2b2b2acacacdbdbdbababab9c9c9cededed8c8c8c 939393eeeeeef2f2f2a5a5a5929292fcfcfcf8f8f8dfdfdfe9e9e9ecececeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeefefefe9e9e9f2f2f2ebebeb999999eeeeee f0f0f0ebebebf2eaf7e7f4e37b87db7280e36e77c45450c85f66ce6d80dc758fdc7988e7 e5f2e0f1ecf2f2eceeedeceae6f0f27f8a90dee8f2dee7f6dde6f7e1eaf9dae4f0e0eaf4 dee8f2dee8f2dee8f2dee8f2dee8f2dee8f2dee8f2dee8f2f1f6fce7eaef343539303135 f0f3f8d6dde5effbffc6d3e3dbe4ede8f1f8e3eaf21d242a393e42e5e9ec363a3b2f3334 ebeef536394031343bdee1e8dee1e833363d1b1e25e7eaf1292b2635363bd7d9e6d7d9e5 3e434628312ee8eff5dbe1f14446452b2f2edbdfe03a3f433e454ddae3ecd7e1ebd9e3ef 2f30343d4144373a3f272c302c3339222b32dce7edf2fdffd3dde6cbd5dedce5ececf3f9 dce1e5303437393d402b2c2e303032e4e5e72e3235363b3fe4ebf1eaf3fcd2dce5e3f0f9 e1eaf135393c1e1e1edbe0e4dfedf8e1f1fe262d33383431292c3335383f24272e2c2f36 edf0f735383f31343b40434a363d431f262c2d343adde4ea272e3421282edbe2e8e2e9ef 2c2c2c44484beef5fdcad7e0e9f5ffe1edfbd2dce8e4ecf9dee8f2dee8f2dee8f2dee8f2 dee8f2dee8f2dee8f2dee8f2dbe9f4dbe8f1e1ebf4818a91e7ecf0eeeff1efefefeeeeee e6f0f27f8a90dee8f2dee7f6dde6f7e1eaf9dae4f0e0eaf4dee8f2dee8f2dee8f2dee8f2 dee8f2dee8f2dee8f2dee8f2c9daeaeef5fd3c38372422233a41491f2b372c343f1e2128 e9eef4dbe0e631363c363b41dce1e7303539282d31ecf1f5e4f4ffd3e1ecf2fcffd0d9e0 23282c393a3c3a3a3a262523202626dce4e7edf7ffcedae8ecf6ffedf4fc3a3c3b3f3e39 e4eef7e2ecf5141d2431383ee7ecf0e4e8eb33373a262729363b4123282e373c423c4147 cfd4da1d222830353bdbe0e6cfd3d62b2f3234383bdce0e33a3e412d3134d5d9dc3d4144 3b3f42cfd3d6e8ecef262a2d1f2326d8dcdf4246492c3033e6eff8e5ecf42c31353c4043 e2e7eae0e9f0d2dfe8d6e6f3dee8f2dee8f2dee8f2dee8f2dee8f2dee8f2dee8f2dee8f2 dbe4ede3edf7d9e5f1dde9f7dae6f2818892eaedf2efeef3efeeececedefeaeff3808a93 dae8f3dbe9f4ddeaf3dce9f2dee8f2dee8f2dee8f2dee8f2dee8f2dee8f2dee8f2dee8f2 d5e2ebdbe5eed4dee7f0f9ffdce3e9eef5fbd2d7db3d424624292f282d3330353be4ebf1 262d3351585ee8eff5dee5ebf3f7fa1b1f223a3e41edf1f424282b3c4043eaeef135393c 2c2c2cdde6edd2e0ebdfe9f22b2c2e353432e6ebefe1effacdd9e7e2ecf8dfe6ee33383c 212629dbe3e6eaf5f9dce9efdce5ecd9e2e9e7eef4dae1e7353a3e393d40dce0e335393c 23272aebeff2363a3d23272ad7dbdeeaeef13236392b2f32e2e9ef242b312a3137d8dfe5 edf4fa262e312c3437e3ebeeedf6fb1b23262e3235f9fafc3b3c40171c22ebf4fdcdd7e3 dbe5ee3c454c252a2e393d40383c3f202529363f46dee8f1dee8f2dee8f2dee8f2dee8f2 dee8f2dee8f2dee8f2dee8f2dee8f2dee8f2dee8f2dee8f2dee8f2dee8f2dee8f2dee8f2 808990e9eef2ebeceef0efedeeedebefeeec969799ebeff2eeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeefefefe8e8e8ebebebfefefef1f1f1e6e6e6fcfcfcfbfbfb edededf9f9f99191919e9e9e9999999d9d9df0f0f0a1a1a19d9d9df0f0f0f4f4f4a2a2a2 9e9e9ef1f1f1efefef9494949e9e9ee6e6e69e9e9ea0a0a0f0f0f0f4f4f49b9b9b969696 f1f1f1e2e2e2fcfcfcf6f6f6888888989898ffffffdddddddfdfdff5f5f5f4f4f4e7e7e7 f9f9f99292929e9e9ee2e2e2969696979797f6f6f69d9d9d9b9b9bf2f2f2ffffff828282 909090fcfcfc969696818181e6e6e6fafafa868686a0a0a0eaeaeaffffff8e8e8e929292 f7f7f7888888999999e7e7e7edededf1f1f19393939393939595959595959f9f9f9a9a9a eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeededed9b9b9befefefecececf2f2f2ebebebefefef9a9a9a eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeea1a1a1939393ababab959595a2a2a2969696d5d5d5ffffff 7f7f7fa8a8a8fffffff0f0f09494949d9d9df5f5f5979797a2a2a2e6e6e6989898929292 e8e8e88787879a9a9aecececebebebecececf5f5f59090909d9d9dfcfcfc9d9d9ddedede 969696f4f4f4999999919191ececec9e9e9e979797e1e1e1e9e9e99c9c9c858585f0f0f0 9f9f9f979797f9f9f9838383929292f2f2f2969696838383f4f4f49b9b9b959595a0a0a0 9595959a9a9a969696e4e4e4f9f9f9f8f8f8eeeeeee0e0e0eeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeefefefe9e9e9f2f2f2ebebeb999999eeeeeef0f0f0ebebeb f2eaf7e7f4e37b87db7280e36e77c45450c85f66ce6d80dc758fdc7988e7e5f2e0f1ecf2 f2eceeedeceae8f1f6808990dce6f2dbe4f3d8e4f4dde9f9d5e3eedbe9f2d9e5f3d9e5f3 d9e5f3d9e5f3d9e5f3d9e5f3d9e5f3d9e5f3cbd7e3c9d2db484f571d2025dcdfe4e9eef4 d1dae3f3fdffd1d9e4edf6ff20272f293036dce1e5dbdfe23a3e3f2e3231d4d7de33363d 282b32e5e8efe4e7ee272a3142454cd5d8df424441373a41e2e4f3e1e5f1323a3c343d3c c2cbd2e5ecfe1f211e2b2f2eeaeff2252d30202930d8e2ecdde9f7ddebf83b3c41282b30 d7dce0e7eef4dbe4ebd7e2e8eaf7ffc4d3daecfaffe8f5fed6e0e9dce5ecd7dee4d5dade d3d7da494a4c25282de1e4e9393e4423282ed8dfe7cfd6dee5ecf4d3dce5e1ebf41f2428 47484aeef5fbcbdbe8d6e8f62d343a35312edadde4e6e9f0e2e5ecd8dbe2dfe2e92d3037 22252cdadde4e3eaf0d3dae0eef5fbd0d7dd363d43363d43eaf1f7d6dde33e3e3c141819 e4edf4ebf7ffd1deeed1deeee4f0ffd4e0eed9e5f3d9e5f3d9e5f3d9e5f3d9e5f3d9e5f3 d9e5f3d9e5f3d6e6f3d4e4f1dce9f2818a91e8edf1ebeff2efefeff0efede8f1f6808990 dce6f2dbe4f3d8e4f4dde9f9d5e3eedbe9f2d9e5f3d9e5f3d9e5f3d9e5f3d9e5f3d9e5f3 d9e5f3d9e5f3dbecffe3eaf42a29274d4d4bc6cfd4dfedf8dee8f4e8ecf7dfe3eedadee9 333740252932e0e5eb3c4145393e42d8dde1cedbe4d8e5eedbe5eee3ecf330373d22272b ecf0f33233353d4140f0f8fbc5d1ddd9e9f9cad7e7d5dee7393b3a2d2c27cad8e3e8f5fe dfe9f2232c33444b51ced3d733373a3a3b3dd6dbe1e7ecf2dce1e7e0e5ebe9eef434393f 2a2f35f9fefff6fafd2c3033393d40e9edf02d3134272b2ef7fbfe191d203d4144ced2d5 f0f4f72a2e31363a3de7ebee1f23263d4144dbe5f1d1dae32d35382e3434d7dfe1e7f2f8 d5e3f0d5e5f5d9e5f3d9e5f3d9e5f3d9e5f3d9e5f3d9e5f3d9e5f3d9e5f3d5e1eddde9f5 d4e2efd9e7f4d8e4f07f8891eaedf2efeff1f0ece9ededede8eff57d8a93d5e5f2d5e5f2 d6e6f3d7e5f0d9e5f3d9e5f3d9e5f3d9e5f3d9e5f3d9e5f3d9e5f3d9e5f3d9e6efd1dee7 edf7ffd3dde6dae3eadae1e7e0e7edd2d9dfdde2e8393e442e3339e9f0f62e373c111a1f ecf7fbcfdade24282b43474ae9edf0caced12f3336363a3de7ebee161a1d38393be6eff6 d1e1eedae7f03e4245272727c7ccd0d7e5f0eaf7ffd4ddecdfe8f131363c32373bf0fafc c8d3d7d7e6e9dce5ece2ebf2e0e7ed20272d31363acaced1e6eaed2d31342e3235f1f5f8 23272a222629f5f9fcc9cdd04246492d3134d9e0ea29303a323941eff6fec6cdd32b3336 343c3fdbe3e6d8dfe734393f313538cdced23f42471b2026ecf6ffdde9f5d9e3ec202930 383d41ced2d5eef2f5dde2e6dfe8efdde7f0d9e5f3d9e5f3d9e5f3d9e5f3d9e5f3d9e5f3 d9e5f3d9e5f3d9e5f3d9e5f3d9e5f3d9e5f3d9e5f3d9e5f3d9e5f3d9e5f3808990e9eef2 ebeceef0efedeeedebefeeec969799ebeff2eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeecececf3f3f3ecececeeeeeeeeeeeef1f1f1f1f1f1cececef0f0f0dcdcdc f9f9f9f5f5f58e8e8e959595eeeeee9494949b9b9befefefe4e4e4949494a2a2a2e7e7e7 e0e0e0a5a5a59b9b9bf0f0f09c9c9c8b8b8bf8f8f8e2e2e2898989a7a7a7f0f0f0e9e9e9 f7f7f7ecececa3a3a3959595dadadaf9f9f9f6f6f6eeeeeee2e2e2e7e7e79e9e9e9a9a9a e8e8e8f7f7f78b8b8b9d9d9dffffff818181939393ffffffe1e1e1b2b2b29e9e9ee4e4e4 979797acacacf4f4f4eeeeeea6a6a6989898fcfcfce3e3e39f9f9fadadadf1f1f1878787 a1a1a1fefefee2e2e2f3f3f3999999a9a9a9edededf0f0f0edededeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeededed9b9b9befefefecececf2f2f2ebebebefefef9a9a9aeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeee989898a1a1a1e8e8e8dededef2f2f2e9e9e9f8f8f8f4f4f4b1b1b1838383 e1e1e1a9a9a98f8f8fdbdbdbf7f7f79191918f8f8fedededa1a1a1a4a4a4e7e7e7a3a3a3 9a9a9ae0e0e0f7f7f7e3e3e3ebebeb9e9e9e9e9e9ee9e9e9909090a7a7a7989898f1f1f1 9a9a9a959595e1e1e19c9c9c9f9f9ffbfbfbfcfcfc8e8e8e9e9e9eedededa2a2a28d8d8d e4e4e4aeaeae989898f1f1f19595959b9b9bf2f2f28f8f8faaaaaae5e5e5f3f3f3f7f7f7 e9e9e9f8f8f8f1f1f1e2e2e2e8e8e8ffffffeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeefefefe9e9e9f2f2f2ebebeb999999eeeeeef0f0f0ebebebf2eaf7e7f4e3 7b87db7280e36e77c45450c85f66ce6d80dc758fdc7988e7e5f2e0f1ecf2f2eceeedecea e9f2f77f8891dae4f0d6e2f2d4e1f2dae7f7d1e1eed6e7f1d7e3f3d7e3f3d7e3f3d7e3f3 d7e3f3d7e3f3d7e3f3d7e3f3cfe2f3dbebfad8e2ec373b44292c31eaedf2c8cdd32c3039 232b36dbe3ee323943363d43e6ebefd3d7d83a3e3d282d29ebeef7282b343437403c3f48 c6c9d22f323b31343ddfe2eb252a2621242bf2f5ffcdd1dd3b4346222c2be3ecf3333a4c 3c3e3b444645d3d8db2f363c39434ccbd7e3ddeafad0e0f0292a2f333439e1e6ece3eaf0 2530362a373fd2e1e8ddeef6c2d2dfcfdde82c39422d3740ced5dbfbffffdbdcde2b2c2e 374049d8dfe9171e283d444ce3e7f0dde2e83e41482f3239d7e4ed2e333727282acdd4da e8faffc5d7e52c353c353432e4e7f0e0e3ec191c2533363fedf0f934374032353ee1e4ed d3dce32b343b101920eaf3fa2e373e192229d5dee5dae3ea30302e2e3233d6dfe6c8d4e0 c8d8e7e0f0ffe1eeffcedbecd7e3f3d7e3f3d7e3f3d7e3f3d7e3f3d7e3f3d7e3f3d7e3f3 d2e5f4d0e2f0d8e6f1808a93e7eef4ebeff2eeeeeef1f0eee9f2f77f8891dae4f0d6e2f2 d4e1f2dae7f7d1e1eed6e7f1d7e3f3d7e3f3d7e3f3d7e3f3d7e3f3d7e3f3d7e3f3d7e3f3 d0e2fad4dce7262523353533e0e9eee5f3fecdd9e7d8dce8dae0ecdee4f0272e382d343c dbe2e81c23292e3639dde5e8dfe8ef363f461e272ed6dfe6293239313a41d9e0e6d1d8de 181c1b262e31edfbffd5e6f8e4f4ffd1dbe52d2f2e403d36d3e3f0d0dee9deebf4323c45 141b21fbffff32333527282ae2e6efe5e9f22d313a1a1e27dde1ea3b3f48232730ccd0d9 3a3e410f131633373ad4d8db3f4346313538cfd3d6484c4f282c2fe3e7eadfe3e624282b 35393cebeff224282b282c2fdde6f5dce5ee323a3d2e3736d7e0dfd3dee4d1dfece3f4ff d7e3f3d7e3f3d7e3f3d7e3f3d7e3f3d7e3f3d7e3f3d7e3f3d1dfecd9e6f6cfdfeed4e4f3 d6e2ee7e8790e9ecf1f0f0f2f0ece9ededede9f0f67c8992d3e3f0d1e3f1d2e4f2d2e4f2 d7e3f3d7e3f3d7e3f3d7e3f3d7e3f3d7e3f3d7e3f3d7e3f3d8e6f1d9e6efcbd8e1e7f1fa 27313a212a31ecf3f9dbe2e8e2e6ef262a33383f47cdd4dc2c353c3a454bd9e6ecd1dee4 383c3f202427dee2e5e7ebee323639363a3dcdd1d4424649252628d2dce5ecfcffcfdce5 1f2326353535f3faffd2e2efc9d6e9d2deeeebf3fec0c7cf333b3e273133cedcdddcebee 2932392c353cd5dce2333a40454a4edee2e5dee2e5262a2d34383bdde1e4282c2f424649 222629e9edf02a2e312b2f32dee6f12d35402d363fd3dce3d9e2e730393e2f393bced8da 33374030333a393a3febecf0202328343b43c4ced8e4f2ffdeebf4232d363e454bdee3e7 d4d9dd373e44252f38cfdce5d7e3f3d7e3f3d7e3f3d7e3f3d7e3f3d7e3f3d7e3f3d7e3f3 d7e3f3d7e3f3d7e3f3d7e3f3d7e3f3d7e3f3d7e3f3d7e3f3808990e9eef2ebeceef0efed eeedebefeeec969799ebeff2eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee edededf8f8f8ececece9e9e9ecececededede4e4e4bcbcbc9c9c9ceeeeeeeaeaeaededed a3a3a3a0a0a0e4e4e49c9c9c828282fffffffcfcfc898989959595f9f9f9f2f2f29a9a9a 969696efefef9e9e9ea1a1a18a8a8af1f1f1b2b2b28d8d8df0f0f0f5f5f5e8e8e8e1e1e1 e8e8e8b0b0b0949494eeeeeef5f5f58e8e8ea0a0a0eeeeee909090a3a3a3e9e9e9f1f1f1 adadad8c8c8cf3f3f38e8e8ea1a1a18f8f8fffffff888888939393f4f4f49e9e9e929292 ededede0e0e0a1a1a1929292e7e7e7a2a2a28b8b8b949494e1e1e1a8a8a89c9c9ce4e4e4 fbfbfbe4e4e49b9b9b8e8e8ee9e9e9e4e4e49f9f9f949494eeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee ededed9b9b9befefefecececf2f2f2ebebebefefef9a9a9aeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee 949494969696f5f5f5e9e9e9f9f9f9f2f2f2e9e9e9e0e0e0959595999999fdfdfd888888 a6a6a6f2f2f2f4f4f4a4a4a4a8a8a8e8e8e8d8d8d8a3a3a3909090a0a0a0f3f3f3f3f3f3 f8f8f8e5e5e5eaeaeaa3a3a3969696e0e0e0b0b0b08e8e8ea0a0a0dbdbdb979797acacac f1f1f1a8a8a8909090dededee7e7e77f7f7fa7a7a7ededede9e9e9a7a7a7a4a4a4858585 f0f0f0f6f6f68e8e8e9f9f9feeeeeea2a2a29b9b9be7e7e7dfdfdfa0a0a0a8a8a8d4d4d4 f9f9f9f4f4f4e9e9e9e6e6e6eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee efefefe9e9e9f2f2f2ebebeb999999eeeeeef0f0f0ebebebf2eaf7e7f4e37b87db7280e3 6e77c45450c85f66ce6d80dc758fdc7988e7e5f2e0f1ecf2f2eceeedeceae9f2f97e8790 d8e2eed4e0f0d2dff0d6e6f5cee0ecd3e5efd5e1f1d5e1f1d5e1f1d5e1f1d5e1f1d5e1f1 d5e1f1d5e1f1d4eaffc6d9ead3e1eed5dce4303338292a2e404145323338dae2efe0e8f3 cdd4de272e342c313535393a232726343935d5d8e12f323b33363fd8dbe4393c45393c45 cdd0d9e2e5eee4e8e733363f282b3ce4eaf6d0d8db242e2f343d46cfd7ea272926393b3a e3e8eb242b312c363fd3e1eecfdfeed2e2f2e8e9ee25252d363b412b323a273238d7e6ed d8e9f1d0e1e9dbebf8d6e6f3cedce7323c45272e3424292d3e3f41313234d0dce8dbe5f1 dee6f11e252f373c422f3237292a2ee0dfe4d7e4ed34393d343537dce5ecc4d6e4ddeffd d5dee53332302b2e372d30393a3d46e1e4edcacdd6dfe2eb33363f2f323b262f363c454c dce5ecd0d9e0252e35374047d5dee5d8e1e8333331313536d5dee5dde9f5d0e0f0cfe0f2 cfdef1d8e5f6d5e1f1d5e1f1d5e1f1d5e1f1d5e1f1d5e1f1d5e1f1d5e1f1d0e3f2cee0ee d5e5f2808a93e7eef4eaeef1eeeeeef1f0eee9f2f97e8790d8e2eed4e0f0d2dff0d6e6f5 cee0ecd3e5efd5e1f1d5e1f1d5e1f1d5e1f1d5e1f1d5e1f1d5e1f1d5e1f1c9dbf3dce4f1 40404023241fdde8eacdddeacad6e4e5e8f7d5dbe9e1e7f3252b372c333ddbe2eae4ebf1 232b2e30383a2c3339282f35e5ecf2d4dde42932392b353ecfd9e2d8e5ee434844232b2e d2e0edc7d9edcedff1d6e0ea353638333029ddedfaccdce9cddbe6e3edf6262d332e3337 dddee038393b282c352d313a2b2f38e4e8f1e2e6efc9cdd6373b44343841dde1e433373a 393d40dde1e421252835393ce9edf0caced130343735393c282c2f3e4245d3d7daced2d5 373b3e313538d0dcecd5dfe92b3336303938d6dfded4dfe5ddedfcc5d6ead5e1f1d5e1f1 d5e1f1d5e1f1d5e1f1d5e1f1d5e1f1d5e1f1cfdcecd5e5f4cddeeed3e3f2d5e1ef7d868f e9ecf1f0f0f2f0ece9eeeeeee9f0f67b8891d1e3f1cee1f0cfe2f1d0e2f0d5e1f1d5e1f1 d5e1f1d5e1f1d5e1f1d5e1f1d5e1f1d5e1f1d3e1ecd4e2edd1dee7d7e4edd4dee7323b42 303940282f35292c35363a43dbe2eadbe4ebd0dbe1303d430f1c22e6f5fad5d9dc404447 262a2d2f333634383b2b2f32e0e4e72b2f3237383adae4edc3d5e3dae8f3dbe0e43c3d3f 1f262cd2e2efd9e5fbd3def0d2dae7e7eef6d0d8db2f393b303e3f28373a2f383fd2dbe2 e6edf3d6dde323282c2e323530343734383b2f3336d6dadd363a3d23272ae8ecef313538 2a2e31e4e8ebd5ddeadbe3ee262e39303942dae3eadbe4e9263032353f40dce0e92c2f38 2e2f34d8d9de3a3d42272e36dee8f2cedce9dae7f0d7e1ea1e252b3d4246363b3f1d242a e0eaf3d5e2ebd5e1f1d5e1f1d5e1f1d5e1f1d5e1f1d5e1f1d5e1f1d5e1f1d5e1f1d5e1f1 d5e1f1d5e1f1d5e1f1d5e1f1d5e1f1d5e1f1808990e9eef2ebeceef0efedeeedebefeeec 969799ebeff2eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeecececf1f1f1 eaeaeaf5f5f5f5f5f5eaeaeaededede4e4e48e8e8eacacac9090909c9c9c9a9a9ae6e6e6 f2f2f2eaeaea9d9d9d979797e3e3e3f8f8f89f9f9f888888a7a7a78d8d8df6f6f6e3e3e3 a1a1a18d8d8dfefefe969696909090f2f2f2f1f1f1ecececf4f4f4e8e8e8fbfbfbe2e2e2 9393939e9e9ea1a1a18e8e8efefefee3e3e3f8f8f8919191959595979797929292a4a4a4 e8e8e8a5a5a5a1a1a1ebebeb929292a0a0a0fbfbfbdadadafbfbfb9b9b9b929292ffffff dcdcdc9c9c9ca0a0a0e9e9e9a1a1a1979797f8f8f8909090989898eeeeeef0f0f0e3e3e3 f0f0f09e9e9e9b9b9b9b9b9b9c9c9ce8e8e8eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeededed9b9b9b efefefecececf2f2f2ebebebefefef9a9a9aeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeea3a3a3929292 f5f5f5e3e3e3f0f0f0f3f3f3ecececf6f6f69b9b9b9b9b9befefefefefef969696959595 9f9f9f909090979797ecececffffff9090909d9d9d8e8e8eebebebecececefefeff0f0f0 f2f2f29d9d9d8c8c8cf0f0f0ececec9a9a9ae3e3e3fcfcfc989898949494f1f1f1dddddd a0a0a0a2a2a2949494adadade7e7e7eeeeeeebebeb9292929e9e9e9e9e9eecececebebeb 9a9a9a959595f0f0f0e5e5e5979797a0a0a0a0a0a0919191eaeaeaf7f7f7e7e7e7e7e7e7 f7f7f7edededeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeefefefe9e9e9 f2f2f2ebebeb999999eeeeeef0f0f0ebebebf2eaf7e7f4e37b87db7280e36e77c45450c8 5f66ce6d80dc758fdc7988e7e5f2e0f1ecf2f2eceeedeceae2eceb7d8a93ceddf4cee0f6 caddebc8dce5cedfefd1dff9d1deeed1deeed1deeed1deeed1deeed1deeed1deeed1deee d1deeed1deeed1deeed1deeed1deeed1deeed1deeed1deeed1deeed1deeed1deeed1deee d1deeed1deeed1deeed1deeecfd7da2f363c343d44ccd6e0d5e1edd0ddedd3e3f3d1e0f3 d1deeed1deeed1deeed1deeed1deeed1deeed1deeed1deeed1deeed1deeed1deeed1deee d1deeed1deeed1deeed1deeed1deeed1deeed1deeed1deeed1deeed1deeed1deeed1deee d1deeed1deeed1deeed1deeed1deeed1deeed1deeed1deeed1deeed1deeed1deeed1deee d1deeed1deeed1deeed1deeed1deeed1deeed1deeed1deeed1deeed1deeed1deeed1deee d1deeed1deeed1deeed1deeed1deeed1deeed1deeed1deeed1deeed1deeed1deeed1deee d1deeed1deeed1deeed1deeed1deeed1deeed1deeed1deeed1deeed1deeed1deeed1deee d1deeed1deeed1deeed1deeed1deeed1deeed1deeed1deeecde1eccbdceecedaf28790a1 f0f5f8e4e7e0edeceaefeaf1e2eceb7d8a93ceddf4cee0f6caddebc8dce5cedfefd1dff9 d1deeed1deeed1deeed1deeed1deeed1deeed1deeed1deeed1deeed1deeed1deeed1deee d1deeed1deeed1deeed1deeed1deeed1deeed1deeed1deeed1deeed1deeed1deeed1deee d1deeed1deeed1deeed1deeed1deeed1deeed1deeed1deeed1deeed1deeed1deeed1deee d1deeed1deeed1deeed1deeed1deeed1deeed1deeed1deeed1deeed1deeed1deeed1deee c4d5dde1f2fac5d3dccddae3dfe9f3222a35dde3efdae0ecdbe3e6232a303a434ab9c3cd e5f1fddbe8f8c1d1e1d6e5f8d1deeed1deeed1deeed1deeed1deeed1deeed1deeed1deee d1deeed1deeed1deeed1deeed1deeed1deeed1deeed1deeed1deeed1deeed1deeed1deee d1deeed1deeed1deeed1deeecfe2f0d1e4f5d1e6fbcadcf2c5d4e7838d99edf2f6edefee f0efebebedece0e9ee818f98c6d8e6d1e4f5cddef0cadbedd1deeed1deeed1deeed1deee d1deeed1deeed1deeed1deeed1deeed1deeed1deeed1deeed1deeed1deeed1deeed1deee d1deeed1deeed1deeed1deeed1deeed1deeed1deeed1deeed1deeed1deeed1deeed1deee d1deeed1deeed1deeed1deeed1deeed1deeed1deeed1deeed1deeed1deeed1deeed1deee d1deeed1deeed1deeed1deeed1deeed1deeed1deeed1deeed1deeed1deeed1deeed1deee d1deeed1deeed1deeed1deeeccd7dddee9ef27313a2c3640d5dfebdce5f4c8d1e2dce5f6 d1deeed1deeed1deeed1deeed1deeed1deeed1deeed1deeed1deeed1deeed1deeed1deee d1deeed1deeed1deeed1deeed1deeed1deeed1deeed1deeed1deeed1deeed1deeed1deee d1deeed1deeed1deeed1deeed1deeed1deeed1deeed1deeed1deeed1deeed1deeed1deee d1deeed1deeed1deeed1deee767f86eaeff3f1f2f4f2f1efecebe9f1f0ee9b9c9eedf1f4 eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeef4f4f4efefef9292929c9c9c ebebebf4f4f4f6f6f6f1f1f1eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeedededf0f0f0fafafa959595 959595fafafaf0f0f0edededeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeededed9e9e9eefefefe9e9e9 f2f2f2f1f1f1f0f0f0909090eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee ecececf0f0f0ebebeb9b9b9b9b9b9beaeaeaf0f0f0ecececeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeaeaeaeeeeeef5f5f5eaeaea 9b9b9bececececececf2f2f2f2eaf7e7f4e37b87db7280e36e77c45450c85f66ce6d80dc 758fdc7988e7e5f2e0f1ecf2f2eceeedeceae6f0ef7f8c95cfdef5d1e3f9cee1efcbdfe8 cbdcecc9d7f1cedeedcedeedcedeedcedeedcedeedcedeedcedeedcedeedcedeedcedeed cedeedcedeedcedeedcedeedcedeedcedeedcedeedcedeedcedeedcedeedcedeedcedeed cedeedcedeeddce7ed2a343d1f2c35c6d2dee5f2ffc8d8e8bfd0e2cedff3cedeedcedeed cedeedcedeedcedeedcedeedcedeedcedeedcedeedcedeedcedeedcedeedcedeedcedeed cedeedcedeedcedeedcedeedcedeedcedeedcedeedcedeedcedeedcedeedcedeedcedeed cedeedcedeedcedeedcedeedcedeedcedeedcedeedcedeedcedeedcedeedcedeedcedeed cedeedcedeedcedeedcedeedcedeedcedeedcedeedcedeedcedeedcedeedcedeedcedeed cedeedcedeedcedeedcedeedcedeedcedeedcedeedcedeedcedeedcedeedcedeedcedeed cedeedcedeedcedeedcedeedcedeedcedeedcedeedcedeedcedeedcedeedcedeedcedeed cedeedcedeedcedeedcedeedcedeedcedeedcde1eccddef0cdd9f1828b9cedf2f5e9ece5 f7f6f4f9f4fbe6f0ef7f8c95cfdef5d1e3f9cee1efcbdfe8cbdcecc9d7f1cedeedcedeed cedeedcedeedcedeedcedeedcedeedcedeedcedeedcedeedcedeedcedeedcedeedcedeed cedeedcedeedcedeedcedeedcedeedcedeedcedeedcedeedcedeedcedeedcedeedcedeed cedeedcedeedcedeedcedeedcedeedcedeedcedeedcedeedcedeedcedeedcedeedcedeed cedeedcedeedcedeedcedeedcedeedcedeedcedeedcedeedcedeedcedeeddff1fdb0c2ce ddedfaddebf8c3cfddcfdbe930394827303f212c3239434cbac7d0ebf7ffcad7e7cbdbeb c7d8eacadbefcedeedcedeedcedeedcedeedcedeedcedeedcedeedcedeedcedeedcedeed cedeedcedeedcedeedcedeedcedeedcedeedcedeedcedeedcedeedcedeedcedeedcedeed cedeedcedeedc5d8e6c7daebcde2f7cee0f6cbdaed858f9bedf2f6eef0eff0efebeef0ef e6eff484929bc6d8e6d0e3f4cedff1cedff1cedeedcedeedcedeedcedeedcedeedcedeed cedeedcedeedcedeedcedeedcedeedcedeedcedeedcedeedcedeedcedeedcedeedcedeed cedeedcedeedcedeedcedeedcedeedcedeedcedeedcedeedcedeedcedeedcedeedcedeed cedeedcedeedcedeedcedeedcedeedcedeedcedeedcedeedcedeedcedeedcedeedcedeed cedeedcedeedcedeedcedeedcedeedcedeedcedeedcedeedcedeedcedeedcedeedcedeed cedeedcedeeddfedf6c1cfd82c3a4535434eb7c5d2d6e3f3d0ddeec8d5e6cedeedcedeed cedeedcedeedcedeedcedeedcedeedcedeedcedeedcedeedcedeedcedeedcedeedcedeed cedeedcedeedcedeedcedeedcedeedcedeedcedeedcedeedcedeedcedeedcedeedcedeed cedeedcedeedcedeedcedeedcedeedcedeedcedeedcedeedcedeedcedeedcedeedcedeed cedeedcedeed828b92ecf1f5ebeceeecebe9e7e6e4ebeae8959698e9edf0edededededed edededededededededededededededededededededededededededededededededededed edededededededededededededededededededededededededededededededededededed edededededededededededededededededede7e7e7e9e9e9a4a4a4afafafe4e4e4e6e6e6 ececece6e6e6edededededededededededededededededededededededededededededed ededededededededededededededededededefefefe6e6e6e8e8e8a2a2a2a2a2a2e8e8e8 e6e6e6efefefedededededededededededededededededededededededededededededed edededededededededededededededededededededededededededededededededededed edededededededededededededededededededededededededededededededededededed edededededededededededededededededede9e9e9989898e9e9e9e4e4e4ecececebebeb f2f2f29c9c9cedededededededededededededededededededededededededededededed edededededededededededededededededededededededededededededededededededed ededededededededededededededededededededededededededededededebebeba0a0a0 959595a8a8a8dfdfdfffffffe7e7e7f0f0f0edededededededededededededededededed edededededededededededededededededededededededededededededededededededed edededededededededededededededededededededededededededededededededededed edededededededededededededededededededededededededededededededededededed ededededededededededededededededededf0f0f0f0f0f0f4f4f4e9e9e99c9c9ceeeeee ebebebedededf2eaf7e7f4e37b87db7280e36e77c45450c85f66ce6d80dc758fdc7988e7 e5f2e0f1ecf2f2eceeedeceae2eceb79868fc5d4ebc8daf0c9dceac8dce5cadbebc8d6f0 cadae9cadae9cadae9cadae9cadae9cadae9cadae9cadae9cadae9cadae9cadae9cadae9 cadae9cadae9cadae9cadae9cadae9cadae9cadae9cadae9cadae9cadae9cadae9cadae9 cbdce6bdced8cadae7d9eafabacbddccdef2d9ebffc5daefcadae9cadae9cadae9cadae9 cadae9cadae9cadae9cadae9cadae9cadae9cadae9cadae9cadae9cadae9cadae9cadae9 cadae9cadae9cadae9cadae9cadae9cadae9cadae9cadae9cadae9cadae9cadae9cadae9 cadae9cadae9cadae9cadae9cadae9cadae9cadae9cadae9cadae9cadae9cadae9cadae9 cadae9cadae9cadae9cadae9cadae9cadae9cadae9cadae9cadae9cadae9cadae9cadae9 cadae9cadae9cadae9cadae9cadae9cadae9cadae9cadae9cadae9cadae9cadae9cadae9 cadae9cadae9cadae9cadae9cadae9cadae9cadae9cadae9cadae9cadae9cadae9cadae9 cadae9cadae9cadae9cadae9c6dae5cadbedc9d5ed7a8394e6ebeee6e9e2f2f1efeee9f0 e2eceb79868fc5d4ebc8daf0c9dceac8dce5cadbebc8d6f0cadae9cadae9cadae9cadae9 cadae9cadae9cadae9cadae9cadae9cadae9cadae9cadae9cadae9cadae9cadae9cadae9 cadae9cadae9cadae9cadae9cadae9cadae9cadae9cadae9cadae9cadae9cadae9cadae9 cadae9cadae9cadae9cadae9cadae9cadae9cadae9cadae9cadae9cadae9cadae9cadae9 cadae9cadae9cadae9cadae9cadae9cadae9cadae9cadae9c2d8e6cee1f0bacddccadbeb bdcedee5f5ffcbdbebc4d4e4cddee8c3d4dee2f2ffc8d9e9b3c4d6d0e2f6cfe1f7c3d8ed cadae9cadae9cadae9cadae9cadae9cadae9cadae9cadae9cadae9cadae9cadae9cadae9 cadae9cadae9cadae9cadae9cadae9cadae9cadae9cadae9cadae9cadae9cadae9cadae9 c5d8e6c1d4e5c6dbf0cadcf2c8d7ea7e8894e5eaeeeaecebe7e6e2e7e9e8e1eaef7f8d96 bfd1dfc9dcedc9daecccddefcadae9cadae9cadae9cadae9cadae9cadae9cadae9cadae9 cadae9cadae9cadae9cadae9cadae9cadae9cadae9cadae9cadae9cadae9cadae9cadae9 cadae9cadae9cadae9cadae9cadae9cadae9cadae9cadae9cadae9cadae9cadae9cadae9 cadae9cadae9cadae9cadae9cadae9cadae9cadae9cadae9cadae9cadae9cadae9cadae9 cadae9cadae9cadae9cadae9cadae9cadae9cadae9cadae9cadae9cadae9cadae9cadae9 c1d3e1cddfedc0d2e0c8d9e9d0e1f1c9daecd2e3f5d0e1f5cadae9cadae9cadae9cadae9 cadae9cadae9cadae9cadae9cadae9cadae9cadae9cadae9cadae9cadae9cadae9cadae9 cadae9cadae9cadae9cadae9cadae9cadae9cadae9cadae9cadae9cadae9cadae9cadae9 cadae9cadae9cadae9cadae9cadae9cadae9cadae9cadae9cadae9cadae9cadae9cadae9 838c93e8edf1e7e8eaefeeeceeedebf0efed98999bf0f4f7efefefefefefefefefefefef efefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefef efefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefef efefefefefefefefefefefeff1f1f1fafafad6d6d6e1e1e1f5f5f5efefeffafafaf0f0f0 efefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefef efefefefefefefefefefefeff5f5f5eeeeeef3f3f3e2e2e2e2e2e2f3f3f3eeeeeef5f5f5 efefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefef efefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefef efefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefef efefefefefefefefefefefeff0f0f09c9c9ceeeeeeebebebefefefe6e6e6ededed9d9d9d efefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefef efefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefef efefefefefefefefefefefefefefefefefefefefefefefeff3f3f3d9d9d9ebebebececec edededeeeeeedfdfdffafafaefefefefefefefefefefefefefefefefefefefefefefefef efefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefef efefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefef efefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefef efefefefefefefefefefefefe6e6e6e6e6e6ebebebe4e4e49c9c9cf1f1f1f0f0f0f1f1f1 f2eaf7e7f4e37b87db7280e36e77c45450c85f66ce6d80dc758fdc7988e7e5f2e0f1ecf2 f2eceeedeceaebf5f4808d96cad9f0c8daf0c6d9e7c7dbe4ccddedcedcf6cadbebcadbeb cadbebcadbebcadbebcadbebcadbebcadbebcadbebcadbebcadbebcadbebcadbebcadbeb cadbebcadbebcadbebcadbebcadbebcadbebcadbebcadbebcadbebcadbebc0d3e2cde0ef d0e5f6c5daedb5caddc3d8edc9ddf5bcd0e8cadbebcadbebcadbebcadbebcadbebcadbeb cadbebcadbebcadbebcadbebcadbebcadbebcadbebcadbebcadbebcadbebcadbebcadbeb cadbebcadbebcadbebcadbebcadbebcadbebcadbebcadbebcadbebcadbebcadbebcadbeb cadbebcadbebcadbebcadbebcadbebcadbebcadbebcadbebcadbebcadbebcadbebcadbeb cadbebcadbebcadbebcadbebcadbebcadbebcadbebcadbebcadbebcadbebcadbebcadbeb cadbebcadbebcadbebcadbebcadbebcadbebcadbebcadbebcadbebcadbebcadbebcadbeb cadbebcadbebcadbebcadbebcadbebcadbebcadbebcadbebcadbebcadbebcadbebcadbeb cadbebcadbebc3d7e2cbdceecfdbf3818a9beff4f7eff2ebf7f6f4ede8efebf5f4808d96 cad9f0c8daf0c6d9e7c7dbe4ccddedcedcf6cadbebcadbebcadbebcadbebcadbebcadbeb cadbebcadbebcadbebcadbebcadbebcadbebcadbebcadbebcadbebcadbebcadbebcadbeb cadbebcadbebcadbebcadbebcadbebcadbebcadbebcadbebcadbebcadbebcadbebcadbeb cadbebcadbebcadbebcadbebcadbebcadbebcadbebcadbebcadbebcadbebcadbebcadbeb cadbebcadbebcadbebcadbebcadbebcadbebcce1f4c9def1cfe4f7c8ddf0d1e6f9b4c9dc c8daeec4d6eaccdfeeb5c8d7bdd2e3c1d6e9cadff2d4e9fec2d6eec0d4eccadbebcadbeb cadbebcadbebcadbebcadbebcadbebcadbebcadbebcadbebcadbebcadbebcadbebcadbeb cadbebcadbebcadbebcadbebcadbebcadbebcadbebcadbebcadbebcadbebcfe2f0c5d8e9 c5daefcbddf3cad9ec818b97ecf1f5f6f8f7f3f2eef1f3f2e8f1f685939cc5d7e5ccdff0 cadbedc9daeccadbebcadbebcadbebcadbebcadbebcadbebcadbebcadbebcadbebcadbeb cadbebcadbebcadbebcadbebcadbebcadbebcadbebcadbebcadbebcadbebcadbebcadbeb cadbebcadbebcadbebcadbebcadbebcadbebcadbebcadbebcadbebcadbebcadbebcadbeb cadbebcadbebcadbebcadbebcadbebcadbebcadbebcadbebcadbebcadbebcadbebcadbeb cadbebcadbebcadbebcadbebcadbebcadbebcadbebcadbebcadbebcadbebc4d9ecbfd4e7 d2e7fad1e6f9bdd2e5bdd2e5c0d5e8bcd1e6cadbebcadbebcadbebcadbebcadbebcadbeb cadbebcadbebcadbebcadbebcadbebcadbebcadbebcadbebcadbebcadbebcadbebcadbeb cadbebcadbebcadbebcadbebcadbebcadbebcadbebcadbebcadbebcadbebcadbebcadbeb cadbebcadbebcadbebcadbebcadbebcadbebcadbebcadbebcadbebcadbeb7d868de4e9ed e9eaecf6f5f3f4f3f1f0efed969799eff3f6ecececececececececececececececececec ecececececececececececececececececececececececececececececececececececec ecececececececececececececececececececececececececececececececececececec ececececececeaeaeaf0f0f0e7e7e7f2f2f2efefefe7e7e7f3f3f3e7e7e7ecececececec ecececececececececececececececececececececececececececececececececececec ecececececece8e8e8e8e8e8eaeaeaf7f7f7f7f7f7eaeaeae8e8e8e8e8e8ecececececec ecececececececececececececececececececececececececececececececececececec ecececececececececececececececececececececececececececececececececececec ecececececececececececececececececececececececececececececececececececec ececececececf0f0f09a9a9aefefeff1f1f1f6f6f6e8e8e8e9e9e9969696ecececececec ecececececececececececececececececececececececececececececececececececec ecececececececececececececececececececececececececececececececececececec ecececececececececececececececececececececf6f6f6ffffffe9e9e9e1e1e1f4f4f4 ebebebebebebecececececececececececececececececececececececececececececec ecececececececececececececececececececececececececececececececececececec ecececececececececececececececececececececececececececececececececececec ecececececececececececececececececececececececececececececececececececec ececececececf6f6f6f6f6f6f9f9f9ededed9f9f9fefefefecececedededf2eaf7e7f4e3 7b87db7280e36e77c45450c85f66ce6d80dc758fdc7988e7e5f2e0f1ecf2f2eceeedecea e4eeed7d8a93cad9f0c7d9efc1d4e2bdd1dac1d2e2c2d0eac2d3e5c2d3e5c2d3e5c2d3e5 c2d3e5c2d3e5c2d3e5c2d3e5c2d3e5c2d3e5c2d3e5c2d3e5c2d3e5c2d3e5c2d3e5c2d3e5 c2d3e5c2d3e5c2d3e5c2d3e5c2d3e5c2d3e5c2d3e5c2d3e5c9e0f2b9d0e2b1c8dabcd3e5 d0e5fac8ddf2c1d5edc4d8f0c2d3e5c2d3e5c2d3e5c2d3e5c2d3e5c2d3e5c2d3e5c2d3e5 c2d3e5c2d3e5c2d3e5c2d3e5c2d3e5c2d3e5c2d3e5c2d3e5c2d3e5c2d3e5c2d3e5c2d3e5 c2d3e5c2d3e5c2d3e5c2d3e5c2d3e5c2d3e5c2d3e5c2d3e5c2d3e5c2d3e5c2d3e5c2d3e5 c2d3e5c2d3e5c2d3e5c2d3e5c2d3e5c2d3e5c2d3e5c2d3e5c2d3e5c2d3e5c2d3e5c2d3e5 c2d3e5c2d3e5c2d3e5c2d3e5c2d3e5c2d3e5c2d3e5c2d3e5c2d3e5c2d3e5c2d3e5c2d3e5 c2d3e5c2d3e5c2d3e5c2d3e5c2d3e5c2d3e5c2d3e5c2d3e5c2d3e5c2d3e5c2d3e5c2d3e5 c2d3e5c2d3e5c2d3e5c2d3e5c2d3e5c2d3e5c2d3e5c2d3e5c2d3e5c2d3e5c2d3e5c2d3e5 bed2ddc4d5e7c6d2ea7b8495ebf0f3ecefe8f5f4f2ede8efe4eeed7d8a93cad9f0c7d9ef c1d4e2bdd1dac1d2e2c2d0eac2d3e5c2d3e5c2d3e5c2d3e5c2d3e5c2d3e5c2d3e5c2d3e5 c2d3e5c2d3e5c2d3e5c2d3e5c2d3e5c2d3e5c2d3e5c2d3e5c2d3e5c2d3e5c2d3e5c2d3e5 c2d3e5c2d3e5c2d3e5c2d3e5c2d3e5c2d3e5c2d3e5c2d3e5c2d3e5c2d3e5c2d3e5c2d3e5 c2d3e5c2d3e5c2d3e5c2d3e5c2d3e5c2d3e5c2d3e5c2d3e5c2d3e5c2d3e5c2d3e5c2d3e5 c2d3e5c2d3e5c2d3e5c2d3e5d0e5fab2c7dcbcd1e6bfd4e9b1c7dcc9dff4aec4d9d7edff c2d9ebcde4f6d2e9fbbcd3e5b1c6dbbacfe4bdd1e9c6daf2c2d3e5c2d3e5c2d3e5c2d3e5 c2d3e5c2d3e5c2d3e5c2d3e5c2d3e5c2d3e5c2d3e5c2d3e5c2d3e5c2d3e5c2d3e5c2d3e5 c2d3e5c2d3e5c2d3e5c2d3e5c2d3e5c2d3e5c2d3e5c2d3e5c5d8e6bdd0e1bed3e8c3d5eb c5d4e77f8995e9eef2f0f2f1f6f5f1f0f2f1e4edf2808e97c1d3e1c8dbecc3d4e6bfd0e2 c2d3e5c2d3e5c2d3e5c2d3e5c2d3e5c2d3e5c2d3e5c2d3e5c2d3e5c2d3e5c2d3e5c2d3e5 c2d3e5c2d3e5c2d3e5c2d3e5c2d3e5c2d3e5c2d3e5c2d3e5c2d3e5c2d3e5c2d3e5c2d3e5 c2d3e5c2d3e5c2d3e5c2d3e5c2d3e5c2d3e5c2d3e5c2d3e5c2d3e5c2d3e5c2d3e5c2d3e5 c2d3e5c2d3e5c2d3e5c2d3e5c2d3e5c2d3e5c2d3e5c2d3e5c2d3e5c2d3e5c2d3e5c2d3e5 c2d3e5c2d3e5c2d3e5c2d3e5c2d3e5c2d3e5c2d3e5c2d3e5d1e7fcbdd3e8b8cee3b1c7dc bed4e9cee5f7c1d8eac4dbedc2d3e5c2d3e5c2d3e5c2d3e5c2d3e5c2d3e5c2d3e5c2d3e5 c2d3e5c2d3e5c2d3e5c2d3e5c2d3e5c2d3e5c2d3e5c2d3e5c2d3e5c2d3e5c2d3e5c2d3e5 c2d3e5c2d3e5c2d3e5c2d3e5c2d3e5c2d3e5c2d3e5c2d3e5c2d3e5c2d3e5c2d3e5c2d3e5 c2d3e5c2d3e5c2d3e5c2d3e5c2d3e5c2d3e5c2d3e5c2d3e57f888fe9eef2edeef0f5f4f2 eeedebe9e8e6919294eaeef1f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2 f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2 f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2 eeeeeeeeeeeef0f0f0f8f8f8eeeeeeebebebf5f5f5e9e9e9f2f2f2f2f2f2f2f2f2f2f2f2 f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2 f3f3f3f5f5f5e7e7e7eeeeeeeeeeeee7e7e7f5f5f5f3f3f3f2f2f2f2f2f2f2f2f2f2f2f2 f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2 f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2 f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2 ececec959595e8e8e8ebebebf5f5f5ecececededed979797f2f2f2f2f2f2f2f2f2f2f2f2 f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2 f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2 f2f2f2f2f2f2f2f2f2f2f2f2f4f4f4e6e6e6e7e7e7e9e9e9f2f2f2f9f9f9f1f1f1f4f4f4 f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2 f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2 f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2 f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2 e6e6e6e9e9e9f0f0f0e6e6e6999999ececececececf1f1f1f2eaf7e7f4e37b87db7280e3 6e77c45450c85f66ce6d80dc758fdc7988e7e5f2e0f1ecf2f2eceeedeceadee8e778858e c8d7eecadcf2c8dbe9c6dae3c7d8e8c7d5efc7daebc7daebc7daebc7daebc7daebc7daeb c7daebc7daebc7daebc7daebc7daebc7daebc7daebc7daebc7daebc7daebc7daebc7daeb c7daebc7daebc7daebc7daebc7daebc7daebb2ccddd2e9fbd7eeffb5caddb9cee1c0d2e6 c5d7ebbccde1c7daebc7daebc7daebc7daebc7daebc7daebc7daebc7daebc7daebc7daeb c7daebc7daebc7daebc7daebc7daebc7daebc7daebc7daebc7daebc7daebc7daebc7daeb c7daebc7daebc7daebc7daebc7daebc7daebc7daebc7daebc7daebc7daebc7daebc7daeb c7daebc7daebc7daebc7daebc7daebc7daebc7daebc7daebc7daebc7daebc7daebc7daeb c7daebc7daebc7daebc7daebc7daebc7daebc7daebc7daebc7daebc7daebc7daebc7daeb c7daebc7daebc7daebc7daebc7daebc7daebc7daebc7daebc7daebc7daebc7daebc7daeb c7daebc7daebc7daebc7daebc7daebc7daebc7daebc7daebc7daebc7daebcce0ebc7d8ea c4d0e87b8495e9eef1e5e8e1efeeeceee9f0dee8e778858ec8d7eecadcf2c8dbe9c6dae3 c7d8e8c7d5efc7daebc7daebc7daebc7daebc7daebc7daebc7daebc7daebc7daebc7daeb c7daebc7daebc7daebc7daebc7daebc7daebc7daebc7daebc7daebc7daebc7daebc7daeb c7daebc7daebc7daebc7daebc7daebc7daebc7daebc7daebc7daebc7daebc7daebc7daeb c7daebc7daebc7daebc7daebc7daebc7daebc7daebc7daebc7daebc7daebc7daebc7daeb c7daebc7daebb1c2d6cadcf0c0d2e6d5eafdbcd1e4bfd6e8bbd2e4b9d3e4b2ccddb8cfe1 bdd4e6c2d7eac8ddf0cfe1f5c9dbefc1d2e6c7daebc7daebc7daebc7daebc7daebc7daeb c7daebc7daebc7daebc7daebc7daebc7daebc7daebc7daebc7daebc7daebc7daebc7daeb c7daebc7daebc7daebc7daebc7daebc7daebc6d9e7c4d7e8c6dbf0c7d9efc7d6e9838d99 e8edf1e4e6e5ebeae6e8eae9e0e9ee7e8c95c0d2e0caddeec8d9ebc7d8eac7daebc7daeb c7daebc7daebc7daebc7daebc7daebc7daebc7daebc7daebc7daebc7daebc7daebc7daeb c7daebc7daebc7daebc7daebc7daebc7daebc7daebc7daebc7daebc7daebc7daebc7daeb c7daebc7daebc7daebc7daebc7daebc7daebc7daebc7daebc7daebc7daebc7daebc7daeb c7daebc7daebc7daebc7daebc7daebc7daebc7daebc7daebc7daebc7daebc7daebc7daeb c7daebc7daebc7daebc7daebc7daebc7daebb2c6dec5daefcbe0f5c2d7eac9def1c2d7e8 b2c7d8c7dcedc7daebc7daebc7daebc7daebc7daebc7daebc7daebc7daebc7daebc7daeb c7daebc7daebc7daebc7daebc7daebc7daebc7daebc7daebc7daebc7daebc7daebc7daeb c7daebc7daebc7daebc7daebc7daebc7daebc7daebc7daebc7daebc7daebc7daebc7daeb c7daebc7daebc7daebc7daebc7daebc7daeb808990ecf1f5edeef0efeeececebe9f2f1ef 9c9d9ff1f5f8e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9 e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9 e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9eeeeeee9e9e9 edededf0f0f0ebebebedededf1f1f1eaeaeae9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9 e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9edededf2f2f2 eaeaeaebebebebebebeaeaeaf2f2f2ededede9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9 e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9 e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9 e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9f3f3f3a1a1a1 f1f1f1e9e9e9efefefebebebf1f1f1989898e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9 e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9 e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9 e9e9e9e9e9e9efefefeeeeeef3f3f3f5f5f5ededede3e3e3e3e3e3ececece9e9e9e9e9e9 e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9 e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9 e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9 e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9eaeaeaececec f2f2f2e8e8e89d9d9df0f0f0efefeff2f2f2f2eaf7e7f4e37b87db7280e36e77c45450c8 5f66ce6d80dc758fdc7988e7e5f2e0f1ecf2f2eceeedeceaf0faf97b8891bac9e0b7c9df b9ccdabed2dbc0d1e1bdcbe5bacfe2bacfe2bacfe2bacfe2bacfe2bacfe2bacfe2bacfe2 bacfe2bacfe2bacfe2bacfe2bacfe2bacfe2bacfe2bacfe2bacfe2bacfe2bacfe2bacfe2 bacfe2bacfe2bacfe2bacfe2bbd2e2b4cbdbb8cddeb4c7d8ccddefc1d0e3c4d4e4c5d2e3 bacfe2bacfe2bacfe2bacfe2bacfe2bacfe2bacfe2bacfe2bacfe2bacfe2bacfe2bacfe2 bacfe2bacfe2bacfe2bacfe2bacfe2bacfe2bacfe2bacfe2bacfe2bacfe2bacfe2bacfe2 bacfe2bacfe2bacfe2bacfe2bacfe2bacfe2bacfe2bacfe2bacfe2bacfe2bacfe2bacfe2 bacfe2bacfe2bacfe2bacfe2bacfe2bacfe2bacfe2bacfe2bacfe2bacfe2bacfe2bacfe2 bacfe2bacfe2bacfe2bacfe2bacfe2bacfe2bacfe2bacfe2bacfe2bacfe2bacfe2bacfe2 bacfe2bacfe2bacfe2bacfe2bacfe2bacfe2bacfe2bacfe2bacfe2bacfe2bacfe2bacfe2 bacfe2bacfe2bacfe2bacfe2bacfe2bacfe2bacfe2bacfe2c0d4dfb9cadcbecae2848d9e f8fdffedf0e9f4f3f1f8f3faf0faf97b8891bac9e0b7c9dfb9ccdabed2dbc0d1e1bdcbe5 bacfe2bacfe2bacfe2bacfe2bacfe2bacfe2bacfe2bacfe2bacfe2bacfe2bacfe2bacfe2 bacfe2bacfe2bacfe2bacfe2bacfe2bacfe2bacfe2bacfe2bacfe2bacfe2bacfe2bacfe2 bacfe2bacfe2bacfe2bacfe2bacfe2bacfe2bacfe2bacfe2bacfe2bacfe2bacfe2bacfe2 bacfe2bacfe2bacfe2bacfe2bacfe2bacfe2bacfe2bacfe2bacfe2bacfe2bacfe2bacfe2 d5e2f5bbcaddc8d7eaafc0d2c0d3e4d3e8f9bbd2e2b7cedecbe2f2b9d0e0b7ccddc4d7e8 bacbddb0bfd2becedec9d6e7bacfe2bacfe2bacfe2bacfe2bacfe2bacfe2bacfe2bacfe2 bacfe2bacfe2bacfe2bacfe2bacfe2bacfe2bacfe2bacfe2bacfe2bacfe2bacfe2bacfe2 bacfe2bacfe2bacfe2bacfe2bbcedcbed1e2bed3e8b7c9dfbdccdf89939ff5fafeeff1f0 f1f0ecf4f6f5edf6fb84929bb8cad8b9ccddb9cadcbecfe1bacfe2bacfe2bacfe2bacfe2 bacfe2bacfe2bacfe2bacfe2bacfe2bacfe2bacfe2bacfe2bacfe2bacfe2bacfe2bacfe2 bacfe2bacfe2bacfe2bacfe2bacfe2bacfe2bacfe2bacfe2bacfe2bacfe2bacfe2bacfe2 bacfe2bacfe2bacfe2bacfe2bacfe2bacfe2bacfe2bacfe2bacfe2bacfe2bacfe2bacfe2 bacfe2bacfe2bacfe2bacfe2bacfe2bacfe2bacfe2bacfe2bacfe2bacfe2bacfe2bacfe2 bacfe2bacfe2bacfe2bacfe2c6d8eeccdef4b9cbdfb4c7d8c0d3e2bccfdeb8cbd9bfd2e0 bacfe2bacfe2bacfe2bacfe2bacfe2bacfe2bacfe2bacfe2bacfe2bacfe2bacfe2bacfe2 bacfe2bacfe2bacfe2bacfe2bacfe2bacfe2bacfe2bacfe2bacfe2bacfe2bacfe2bacfe2 bacfe2bacfe2bacfe2bacfe2bacfe2bacfe2bacfe2bacfe2bacfe2bacfe2bacfe2bacfe2 bacfe2bacfe2bacfe2bacfe27e878eedf2f6edeef0ecebe9f0efedfbfaf89a9b9ddce0e3 efefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefef efefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefef efefefefefefefefefefefefefefefefefefefefefefefefefefefecececeeeeeeebebeb ecececefefefecececefefefefefefefefefefefefefefefefefefefefefefefefefefef efefefefefefefefefefefefefefefefefefefefefefefefe7e7e7eaeaeaf2f2f2f2f2f2 f2f2f2f2f2f2eaeaeae7e7e7efefefefefefefefefefefefefefefefefefefefefefefef efefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefef efefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefef efefefefefefefefefefefefefefefefefefefefefefefefdedede9f9f9ffbfbfbededed ecececebebebf1f1f1959595efefefefefefefefefefefefefefefefefefefefefefefef efefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefef efefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefef ebebebf2f2f2ececece9e9e9f2f2f2fcfcfcf8f8f8e2e2e2efefefefefefefefefefefef efefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefef efefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefef efefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefef efefefefefefefefefefefefefefefefefefefefefefefeff5f5f5eeeeeeededede5e5e5 9f9f9ff3f3f3ebebebe6e6e6f2eaf7e7f4e37b87db7280e36e77c45450c85f66ce6d80dc 758fdc7988e7e5f2e0f1ecf2f2eceeedeceaeff9f866737c8b9ab176889e7588967b8f98 7f90a07b89a3788da0788da0788da0788da0788da0788da0788da0788da0788da0788da0 788da0788da0788da0788da0788da0788da0788da0788da0788da0788da0788da0788da0 788da0788da07a8fa074899a7f92a17485958393a37380907d8a9a7c8898788da0788da0 788da0788da0788da0788da0788da0788da0788da0788da0788da0788da0788da0788da0 788da0788da0788da0788da0788da0788da0788da0788da0788da0788da0788da0788da0 788da0788da0788da0788da0788da0788da0788da0788da0788da0788da0788da0788da0 788da0788da0788da0788da0788da0788da0788da0788da0788da0788da0788da0788da0 788da0788da0788da0788da0788da0788da0788da0788da0788da0788da0788da0788da0 788da0788da0788da0788da0788da0788da0788da0788da0788da0788da0788da0788da0 788da0788da0788da0788da0788da0788da0778b9677889a8e9ab26c7586edf2f5e2e5de e7e6e4ede8efeff9f866737c8b9ab176889e7588967b8f987f90a07b89a3788da0788da0 788da0788da0788da0788da0788da0788da0788da0788da0788da0788da0788da0788da0 788da0788da0788da0788da0788da0788da0788da0788da0788da0788da0788da0788da0 788da0788da0788da0788da0788da0788da0788da0788da0788da0788da0788da0788da0 788da0788da0788da0788da0788da0788da0788da0788da0788da0788da07c87997d8a9b 7885968595a5738494788b9a6d83917b919f738899728798798c9b8192a27787977c8999 8996a6758191788da0788da0788da0788da0788da0788da0788da0788da0788da0788da0 788da0788da0788da0788da0788da0788da0788da0788da0788da0788da0788da0788da0 788da0788da0798c9a7e91a27c91a676889e8897aa6c7682ebf0f4ebedeceeede9f2f4f3 e5eef36c7a838a9caa7b8e9f7687997b8c9e788da0788da0788da0788da0788da0788da0 788da0788da0788da0788da0788da0788da0788da0788da0788da0788da0788da0788da0 788da0788da0788da0788da0788da0788da0788da0788da0788da0788da0788da0788da0 788da0788da0788da0788da0788da0788da0788da0788da0788da0788da0788da0788da0 788da0788da0788da0788da0788da0788da0788da0788da0788da0788da0788da0788da0 788da0788da07080977f90a4798a9c7f90a07a8c9a70828e7e909c7d8f99788da0788da0 788da0788da0788da0788da0788da0788da0788da0788da0788da0788da0788da0788da0 788da0788da0788da0788da0788da0788da0788da0788da0788da0788da0788da0788da0 788da0788da0788da0788da0788da0788da0788da0788da0788da0788da0788da0788da0 788da0788da07e878ef0f5f9eff0f2ecebe9efeeecf4f3f17e7f81aaaeb1989898989898 989898989898989898989898989898989898989898989898989898989898989898989898 989898989898989898989898989898989898989898989898989898989898989898989898 9898989898989898989898989898989898989a9a9a9a9a9a9c9c9c9494949999999c9c9c 9494949e9e9e989898989898989898989898989898989898989898989898989898989898 989898989898989898989898989898989898a0a0a09393939c9c9c9696969696969c9c9c 939393a0a0a0989898989898989898989898989898989898989898989898989898989898 989898989898989898989898989898989898989898989898989898989898989898989898 989898989898989898989898989898989898989898989898989898989898989898989898 989898989898989898989898989898989898acacac838383f3f3f3ececececececededed f3f3f3959595989898989898989898989898989898989898989898989898989898989898 989898989898989898989898989898989898989898989898989898989898989898989898 9898989898989898989898989898989898989898989898989898989898989797979e9e9e 9b9b9b9e9e9e9898989191919b9b9b9f9f9f989898989898989898989898989898989898 989898989898989898989898989898989898989898989898989898989898989898989898 989898989898989898989898989898989898989898989898989898989898989898989898 989898989898989898989898989898989898989898989898989898989898989898989898 9898989898989898989898989898989898989696969191919b9b9bababab848484f0f0f0 f3f3f3f0f0f0f2eaf7e7f4e37b87db7280e36e77c45450c86662c16e7be4748df2768bce eceffff7efe4f4f1eceaf2fdf1ede4f1ede4f1ede4f1ede4f1ede4f1ede4f1ede4f1ede4 f1ede4f1ede4f1ede4f1ede4f1ede4f1ede4f1ede4f1ede4efe8e2f7edecfdf0f9f9ebfa f5e6f9f3e6faf3e8f9f2e7f8ebe6ffe3ece9e5f8daeef6e9f0e3fdf4defff8e8f3f4f0d5 ede5e3f6ebe9feefeaffeee7f9eae5f5ebe9f3eef2f1f0f6f1ede4f1ede4f1ede4f1ede4 f1ede4f1ede4f1ede4f1ede4f1ede4f1ede4f1ede4f1ede4f1ede4f1ede4f1ede4f1ede4 f1ede4f1ede4f1ede4f1ede4f1ede4f1ede4f1ede4f1ede4f0ede8f1ece6f3ece4f5ebe1 f5ebdff7ebdff5ebdff5ebe1e8f6e9eefbe9dce6cdf6fadfecebd7ede8e2f0e8f3f6eaff f1ede4f1ede4f1ede4f1ede4f1ede4f1ede4f1ede4f1ede4e6ebe5edfedae4fad4e6f0e7 f9f4faf6ece3ebe5d9f3f1f4f1ede4f1ede4f1ede4f1ede4f1ede4f1ede4f1ede4f1ede4 f1ede4f1ede4f1ede4f1ede4f1ede4f1ede4f1ede4f1ede4f1ede4f1ede4f1ede4f1ede4 f1ede4f1ede4f1ede4f1ede4f1ede4f1ede4f1ede4f1ede4f1ede4f1ede4f1ede4f1ede4 ffebffeedee1fcf8ecf4f9f3e1e4f5eae5fff0e7fcfceff6e4f3f8e0f1e9d5ead9e5f7e9 e9f5f1eaeff3f8f6f9e6e1def1ede4f1ede4f1ede4f1ede4f1ede4f1ede4f1ede4f1ede4 f1ede4f1ede4f1ede4f1ede4f1ede4f1ede4f1ede4f1ede4f1ede4f1ede4f1ede4f1ede4 f1ede4f1ede4f1ede4f1ede4f1ede4f1ede4f1ede4f1ede4f1ede4f1ede4f1ede4f1ede4 f1ede4f1ede4f1ede4f1ede4f1ede4f1ede4f1ede4f1ede4f1ede4f1ede4f1ede4f1ede4 f1ede4f1ede4f1ede4f1ede4f1ede4f1ede4f1ede4f1ede4f1ede4f1ede4f1ede4f1ede4 f1ede4f1ede4f1ede4f1ede4f1ede4f1ede4f1ede4f1ede4f1ede4f1ede4f1ede4f1ede4 f1ede4f1ede4f1ede4f1ede4f1ede4f1ede4f1ede4f1ede4f1ede4f1ede4f1ede4f1ede4 f1ede4f1ede4f1ede4f1ede4f1ede4f1ede4f1ede4f1ede4f1ede4f1ede4f1ede4f1ede4 f1ede4f1ede4f1ede4f1ede4f3f3e9f5f1eef5eff3f5eaf8f3e6f8f4e7f9f6ebfcfaefff eaebededeef2edf0f5edf2f6edf2f6edf0f5edeef2eaebedf3ebfaf0ecfbebedfae9edf9 ececf6f7ecf2ffedf0ffeeeef1ede4f1ede4f1ede4f1ede4f1ede4f1ede4f1ede4f1ede4 f1ede4f1ede4f1ede4f1ede4f1ede4f1ede4f1ede4f1ede4f1ede4f1ede4f1ede4f1ede4 f1ede4f1ede4f1ede4f1ede4f1ede4f1ede4f1ede4f1ede4f1ede4f1ede4f1ede4f1ede4 ddeff3eaf6f6f2f4eff4f0e7efe8e0f7f2eef7f7f9e4e7ecf1eaf1f1eaf1f1eaf1f1eaf1 f1eaf1f1eaf1f1eaf1f1eaf1f8f1f8e3dce3ede6edfaf3faf9f2f9f8f1f8f3ecf3f5eef5 f1e7ddf0e6daf4e8dcf7ede1faf0e6f6efe7f1ece6efece7f1ede4f1ede4f1ede4f1ede4 f1ede4f1ede4f1ede4f1ede4f1ede4f1ede4f1ede4f1ede4f1ede4f1ede4f1ede4f1ede4 f1ede4f1ede4f1ede4f1ede4f1ede4f1ede4f1ede4f1ede4f1ede4f1ede4f1ede4f1ede4 f1ede4f1ede4f1ede4f1ede4f0eff4f0eff4dcdde2ebecf1f7f6fcebe9ecf4f0f1f9f3f3 dbe5eeeaf1f9f6f7fce4dfe3fdf4f5f1e5e7f7e9e9fbededf1ede4f1ede4f1ede4f1ede4 f1ede4f1ede4f1ede4f1ede4f1ede4f1ede4f1ede4f1ede4f1ede4f1ede4f1ede4f1ede4 f1ede4f1ede4f1ede4f1ede4f1ede4f1ede4f1ede4f1ede4f1ede4f1ede4f1ede4f1ede4 f1ede4f1ede4f1ede4f1ede4f6f1dbf6efddf5ebe2f4e9e7f7ebeffaeff3f8eff2f4ebec ebebf3e9e9f1ebe9ffeef9d1edf0f5eaeeefebedfff1fcdef3f3d7eee5fff3ecf4f4f3d7 ede6edf0e6fef4eef0ede6edf1ede4f1ede4f1ede4f1ede4f1ede4f1ede4f1ede4f1ede4 f1ede4f1ede4f1ede4f1ede4f1ede4f1ede4f1ede4f1ede4f1ede4f1ede4f1ede4f1ede4 f1ede4f1ede4f1ede4f1ede4f1ede4f1ede4f1ede4f1ede4f1ede4f1ede4f1ede4f1ede4 e6f5f2e6ebe4f3f1e5e8e7e2f1f4f9e6eaf3f5f0f7f3e7e9f2f3e5e0dee1efebfcfffaff eeebf4e5e4e0f1f0ebf4f3efebf7f7e9f1f3e7e8ede2dfeaf1eef9f0f1f6dce4e6edf9f9 e5f4f9e6ebeffbf7f6e3e2dde9efe5e1e8e0fcf8f7f7e6eef1ede4f1ede4f1ede4f1ede4 f1ede4f1ede4f1ede4f1ede4eeeeeeeeeeeeeceeededededeeeeeef2eeedf4eeeef7eeef f4e8f6f4e8f6f4e8f6f4e8f6f6eaf8f7ebf9f9edfbf9edfbeeebf6eeebf6eeebf6eeebf6 eeebf6eeebf6eeebf6eeebf6ececf6ececf6ececf6ececf6ececf6ececf6ececf6ececf6 ececf6ececf6ececf6ececf6ececf6ececf6ececf6ececf6ececf6ececf6ececf6ececf6 ececf6ececf6ececf6ececf6ececf6ececf6ececf6ececf6ececf6ececf6ececf6ececf6 f8f3eddbe5ff8094d97c86e56e66c96153b46767c77885ed8199fb7a8ecbedf0ffefe7dc f0ece3eef1f6e0f3ffe0f3ffe0f3ffe0f3ffe0f3ffe0f3ffe0f3ffe0f3ffe0f3ffe0f3ff e0f3ffe0f3ffe0f3ffe0f3ffe0f3ffe0f3ffe9fcf8ddf0ead5e8e2daeee5e0f5ece1f9ec dff9eee1fbf0fbf2f7ecece4e2e9d7e8eee2f8f5fcfff9fff5f4f9e8f0e3dff8f4e3f8f3 e5f6eee3f3e9e1f2e8e0f3eddff8f4defbf9e0f3ffe0f3ffe0f3ffe0f3ffe0f3ffe0f3ff e0f3ffe0f3ffe0f3ffe0f3ffe0f3ffe0f3ffe0f3ffe0f3ffe0f3ffe0f3ffe0f3ffe0f3ff e0f3ffe0f3ffe0f3ffe0f3ffe0f3ffe0f3ffe0f3ffe0f3ffe1f3ffe1f3ffe2f2ffe2f2ff e1f3ffe1f3ffeae8f5e9e7f5edeafdeeebfff6f3ffececf6f5f6f8f0f5efe0f3ffe0f3ff e0f3ffe0f3ffe0f3ffe0f3ffe0f3ffe0f3fff9f3f5edebffe2e2ffe8eaf7f2f1eceeebe6 eaebedf4fbffe0f3ffe0f3ffe0f3ffe0f3ffe0f3ffe0f3ffe0f3ffe0f3ffe0f3ffe0f3ff e0f3ffe0f3ffe0f3ffe0f3ffe0f3ffe0f3ffe0f3ffe0f3ffe0f3ffe0f3ffe0f3ffe0f3ff e0f3ffe0f3ffe0f3ffe0f3ffe0f3ffe0f3ffe0f3ffe0f3ffe0f3ffe0f3ffe0eaf4e3f2eb e1f5dadbf1cde7fadaf4ffeaedf3e7ebece4f5e6e9f5e6ebf7e7f1f9e8faf3e1f7f2e5ef fef5ecfef8dee0f3ffe0f3ffe0f3ffe0f3ffe0f3ffe0f3ffe0f3ffe0f3ffe0f3ffe0f3ff e0f3ffe0f3ffe0f3ffe0f3ffe0f3ffe0f3ffe0f3ffe0f3ffe0f3ffe0f3ffe0f3ffe0f3ff e0f3ffe0f3ffe0f3ffe0f3ffe0f3ffe0f3ffe0f3ffe0f3ffe0f3ffe0f3ffe0f3ffe0f3ff e0f3ffe0f3ffe0f3ffe0f3ffe0f3ffe0f3ffe0f3ffe0f3ffe0f3ffe0f3ffe0f3ffe0f3ff e0f3ffe0f3ffe0f3ffe0f3ffe0f3ffe0f3ffe0f3ffe0f3ffe0f3ffe0f3ffe0f3ffe0f3ff e0f3ffe0f3ffe0f3ffe0f3ffe0f3ffe0f3ffe0f3ffe0f3ffe0f3ffe0f3ffe0f3ffe0f3ff e0f3ffe0f3ffe0f3ffe0f3ffe0f3ffe0f3ffe0f3ffe0f3ffe0f3ffe0f3ffe0f3ffe0f3ff e0f3ffe0f3ffe0f3ffe0f3ffe0f3ffe0f3ffe0f3ffe0f3ffe0f3ffe0f3ffe0f3ffe0f3ff e0f3ffe0f3ffdce8e6dfebe9e4efebe7f2eee8f3ede8f3ede8f3ede7f4edefeeeaebece7 e9e9e7eaeae8eaeae8e9e9e7ebece7efeeeaebedeae9efebe8f3ede5f4ede2f3ede1f0eb e1edebe1ebeae0f3ffe0f3ffe0f3ffe0f3ffe0f3ffe0f3ffe0f3ffe0f3ffe0f3ffe0f3ff e0f3ffe0f3ffe0f3ffe0f3ffe0f3ffe0f3ffe0f3ffe0f3ffe0f3ffe0f3ffe0f3ffe0f3ff e0f3ffe0f3ffe0f3ffe0f3ffe0f3ffe0f3ffe0f3ffe0f3ffe0f3ffe0f3fff3fcfbf2f8f6 d5dad6f8f9f4f2f2f0ecececedeef2e8ebf0f1eff0f1eff0f1eff0f1eff0f1eff0f1eff0 f1eff0f1eff0e9e7e8fffeffefedeed5d3d4f2f0f1f6f4f5e3e1e2f8f6f7e3f5ffe2f4ff e2f2ffe0f0fddef0fcddeffddff2ffe3f6ffe0f3ffe0f3ffe0f3ffe0f3ffe0f3ffe0f3ff e0f3ffe0f3ffe0f3ffe0f3ffe0f3ffe0f3ffe0f3ffe0f3ffe0f3ffe0f3ffe0f3ffe0f3ff e0f3ffe0f3ffe0f3ffe0f3ffe0f3ffe0f3ffe0f3ffe0f3ffe0f3ffe0f3ffe0f3ffe0f3ff e0f3ffe0f3ffdee0ddf2f4f1f7fcf8f1f6f2eaefebe9ebe8e9ebe6e1e2ddf1ffffddf2eb e2f5efdcefe9eafdf7def3eee3f9f6d6eceae0f3ffe0f3ffe0f3ffe0f3ffe0f3ffe0f3ff e0f3ffe0f3ffe0f3ffe0f3ffe0f3ffe0f3ffe0f3ffe0f3ffe0f3ffe0f3ffe0f3ffe0f3ff e0f3ffe0f3ffe0f3ffe0f3ffe0f3ffe0f3ffe0f3ffe0f3ffe0f3ffe0f3ffe0f3ffe0f3ff e0f3ffe0f3ffd9e9f8dcecf9dff0fae0f1fbe0f3fadff3faddf4fadcf3f9f6f7f2f0f1ec eaebefe9eddce9eaefebecf1ededf7eff3e5ebf1e5e6e8f4edeef0f0f4e6ebebebefeef3 f5f4f0efeeece0f3ffe0f3ffe0f3ffe0f3ffe0f3ffe0f3ffe0f3ffe0f3ffe0f3ffe0f3ff e0f3ffe0f3ffe0f3ffe0f3ffe0f3ffe0f3ffe0f3ffe0f3ffe0f3ffe0f3ffe0f3ffe0f3ff e0f3ffe0f3ffe0f3ffe0f3ffe0f3ffe0f3ffe0f3ffe0f3ffe0f3ffe0f3ffe8eaf6ecebf0 fcf6f6f3f2f0e7ebecdfe5e5eff1ecf4f1e8e7eadffefffdedeef3dcdde2fafcfbfcfff8 e2e4dfe3e5e2d7daebfefffaf6f7e7efeae7f2edeaf4f5e5f6f9f2d9dcedeaf0f0ece8e7 f7edecfbf8f3f9fff9eaf6f2edf0f5f4eefae0f3ffe0f3ffe0f3ffe0f3ffe0f3ffe0f3ff e0f3ffe0f3ffe9eaece7ebece7ebece7ebece9ebeaeaecebecececedebece1f8dce1f8dc e1f8dce1f8dce1f8dce2f9dde2f9dde3fadeedf2dcedf2dcedf2dcedf2dcedf2dcedf2dc edf2dcedf2dcebf3dcebf3dcebf3dcebf3dcebf3dcebf3dcebf3dcebf3dcebf3dcebf3dc ebf3dcebf3dcebf3dcebf3dcebf3dcebf3dcebf3dcebf3dcebf3dcebf3dcebf3dcebf3dc ebf3dcebf3dcebf3dcebf3dcebf3dcebf3dcebf3dcebf3dcebf3dcebf3dcf3ebe0e0e6fc 7c90cf7887e47070d45a52b55b61bf6c7cde768ee86e81bbeaf2ffeae8dceeeadfedebec f8eadff8eadff8eadff8eadff8eadff8eadff8eadff8eadff8eadff8eadff8eadff8eadf f8eadff8eadff8eadff8eadfffeff6f9e5e4f5e5d8fdf2dcfffadefaf3d9f2ecd6f3ecda f1edd0faf5f1f8f2ffeeedf2ebf0dce2ecd1dee9e1e5f1fffaeffdf9ebf8f7e7f1f8e5eb f7e4eaf7e3ecf6e6f0f8e8f3f8eadff8eadff8eadff8eadff8eadff8eadff8eadff8eadf f8eadff8eadff8eadff8eadff8eadff8eadff8eadff8eadff8eadff8eadff8eadff8eadf f8eadff8eadff8eadff8eadffae9dff8eadff8eae1f7eae1f7eae2f7eae2f5ebe2f5ebe2 f9f4e0f6efe7f7f1fbebe8fde9e8faeaeff3e2eddde3f0d2f8eadff8eadff8eadff8eadf f8eadff8eadff8eadff8eadfe6ddd8f9f4f1fffefdf4f4f2e8ebe4f4faeef2fcf3dce7e3 f8eadff8eadff8eadff8eadff8eadff8eadff8eadff8eadff8eadff8eadff8eadff8eadf f8eadff8eadff8eadff8eadff8eadff8eadff8eadff8eadff8eadff8eadff8eadff8eadf f8eadff8eadff8eadff8eadff8eadff8eadff8eadff8eadfdefcd8f1fff3e4eeede7ebee fcfbf9f8f3f7f1eafcf1eafff4f0eff6eeebfff7f1fbf0ecf2e9eeebe8f9dfe4ffe1ebff f8eadff8eadff8eadff8eadff8eadff8eadff8eadff8eadff8eadff8eadff8eadff8eadf f8eadff8eadff8eadff8eadff8eadff8eadff8eadff8eadff8eadff8eadff8eadff8eadf f8eadff8eadff8eadff8eadff8eadff8eadff8eadff8eadff8eadff8eadff8eadff8eadf f8eadff8eadff8eadff8eadff8eadff8eadff8eadff8eadff8eadff8eadff8eadff8eadf f8eadff8eadff8eadff8eadff8eadff8eadff8eadff8eadff8eadff8eadff8eadff8eadf f8eadff8eadff8eadff8eadff8eadff8eadff8eadff8eadff8eadff8eadff8eadff8eadf f8eadff8eadff8eadff8eadff8eadff8eadff8eadff8eadff8eadff8eadff8eadff8eadf f8eadff8eadff8eadff8eadff8eadff8eadff8eadff8eadff8eadff8eadff8eadff8eadf ebeff0ebf0eaecf3e3edf7deeef9dbeef8ddebf5dde8f1dcf4f5f0efeeeaedece8f2f1ed f2f1ededece8efeeeaf4f5f0f0eddcf1eedbf3f1daf2f5daeff7dfeaf9e6e2f8ecddf8f1 f8eadff8eadff8eadff8eadff8eadff8eadff8eadff8eadff8eadff8eadff8eadff8eadf f8eadff8eadff8eadff8eadff8eadff8eadff8eadff8eadff8eadff8eadff8eadff8eadf f8eadff8eadff8eadff8eadff8eadff8eadff8eadff8eadfe9e6dde7e6e1fcffffd5dddf e7eef4eaf1f7e8edf1f7fbfeedf2eeedf2eeedf2eeedf2eeedf2eeedf2eeedf2eeedf2ee f0f5f1e2e7e3e7ece8f7fcf8f6fbf7e9eeeae6ebe7e6ebe7f4eae1f6ece3f8ebe3f5e8e0 f2e5dcf3e5dcf7e9defcebe1f8eadff8eadff8eadff8eadff8eadff8eadff8eadff8eadf f8eadff8eadff8eadff8eadff8eadff8eadff8eadff8eadff8eadff8eadff8eadff8eadf f8eadff8eadff8eadff8eadff8eadff8eadff8eadff8eadff8eadff8eadff8eadff8eadf edf2ebe4e9e2eff4edecf1eae3e8e1e9f0e8f3faf3f9fffbffe2e2efd2d4ffebeefff3f8 fcebf3ede0e9fff3fdfbeffbf8eadff8eadff8eadff8eadff8eadff8eadff8eadff8eadf f8eadff8eadff8eadff8eadff8eadff8eadff8eadff8eadff8eadff8eadff8eadff8eadf f8eadff8eadff8eadff8eadff8eadff8eadff8eadff8eadff8eadff8eadff8eadff8eadf feeaecffede9fff1e2fdf3daf7f0d3f4edd1f5efd7f8f1dee9edd2ebefd8edf0dbeeecfa f2f0fbf5f1fff0edf4eae5f9edf5ffe6f2e8eaf3eeeef3f9e8ede6ebefe0f0f1e9eaece1 f8eadff8eadff8eadff8eadff8eadff8eadff8eadff8eadff8eadff8eadff8eadff8eadf f8eadff8eadff8eadff8eadff8eadff8eadff8eadff8eadff8eadff8eadff8eadff8eadf f8eadff8eadff8eadff8eadff8eadff8eadff8eadff8eadff9eeffefe4f2ede6eef1eff2 eceeebf0f7efeef8ede4efdfedf3f3e6eceae8efe8e9f0e8e0e7dfe1e7e3f3f9f9fbffff fcfaffe2e4ccf8f7e2f3eafde9e0f3eeedd8e4e6cefcfaffebebe9f8eff0f3e5e5f0ebe8 e3ece7dfeeebdbe4e9ececf6f8eadff8eadff8eadff8eadff8eadff8eadff8eadff8eadf f0f1f3f0f1f3f0f1f3eff1f0eef0efeef0efebefeeebefeefae9effae9eff9e8eef9e8ee f9e8eef8e7edf8e7edf8e7edeceeedeceeedeceeedeceeedeceeedeceeedeceeedeceeed eaeeedeaeeedeaeeedeaeeedeaeeedeaeeedeaeeedeaeeedeaeeedeaeeedeaeeedeaeeed eaeeedeaeeedeaeeedeaeeedeaeeedeaeeedeaeeedeaeeedeaeeedeaeeedeaeeedeaeeed eaeeedeaeeedeaeeedeaeeedeaeeedeaeeedeaeeedeaeeedf2e8dce8ebfc7588c26d81da 6e77de4e50b76370ce7080df798ee17489c0edfcfff0fbf7f3f8f2eff0f4edeef3edeef3 edeef3edeef3edeef3edeef3edeef3edeef3edeef3edeef3edeef3edeef3edeef3edeef3 edeef3edeef3e9e2ffece8ffeef0fdedf5f8e8f2f4e3ecf5e3e8fce7e8ffe1e7fff0f2f1 efeed9eceadbf3f3fbf0f6ffedf3f1f5fae3e9f3f5e9f1f3edf3f3f0f4f3eff4f0edefec eceeebeef0ededeef3edeef3edeef3edeef3edeef3edeef3edeef3edeef3edeef3edeef3 edeef3edeef3edeef3edeef3edeef3edeef3edeef3edeef3edeef3edeef3edeef3edeef3 edeef3edeef3efedf0eeedf2ebeef5e8eff7e8eff9e8eff9e8eff7eaeef7f4f0e7f7f3f2 eeecf7f1efffddddf9fefbffece8fff9f4ffedeef3edeef3edeef3edeef3edeef3edeef3 edeef3edeef3fefbffe5e5cde4e1bef0e7f8e7e1ffe5e5ffefecfdede3ffedeef3edeef3 edeef3edeef3edeef3edeef3edeef3edeef3edeef3edeef3edeef3edeef3edeef3edeef3 edeef3edeef3edeef3edeef3edeef3edeef3edeef3edeef3edeef3edeef3edeef3edeef3 edeef3edeef3edeef3edeef3edeef3edeef3eefaccf5f2edeedcffffe7ffffe6ffe5d6db ebe5e5f5f4fae4eeefe1e5e8ede7e7ece2d8f5edd8f8f8dce3edd5e7f5e4edeef3edeef3 edeef3edeef3edeef3edeef3edeef3edeef3edeef3edeef3edeef3edeef3edeef3edeef3 edeef3edeef3edeef3edeef3edeef3edeef3edeef3edeef3edeef3edeef3edeef3edeef3 edeef3edeef3edeef3edeef3edeef3edeef3edeef3edeef3edeef3edeef3edeef3edeef3 edeef3edeef3edeef3edeef3edeef3edeef3edeef3edeef3edeef3edeef3edeef3edeef3 edeef3edeef3edeef3edeef3edeef3edeef3edeef3edeef3edeef3edeef3edeef3edeef3 edeef3edeef3edeef3edeef3edeef3edeef3edeef3edeef3edeef3edeef3edeef3edeef3 edeef3edeef3edeef3edeef3edeef3edeef3edeef3edeef3edeef3edeef3edeef3edeef3 edeef3edeef3edeef3edeef3edeef3edeef3edeef3edeef3edeef3edeef3fce7fff7e6ff f0e4faede5f4efe7f4f0e7fcf3e4fff2e2ffedf0f9e9e9f1ebeaf0f2f0f5f2f0f5ebeaf0 e9e9f1edf0f9f2e3fff3e2fff6dff9f7e0f2f8e3f6f4e8feefecffeaeeffedeef3edeef3 edeef3edeef3edeef3edeef3edeef3edeef3edeef3edeef3edeef3edeef3edeef3edeef3 edeef3edeef3edeef3edeef3edeef3edeef3edeef3edeef3edeef3edeef3edeef3edeef3 edeef3edeef3edeef3edeef3edeef3edeef3fbf1e8f7f2ecdddfdeebf3f6f1faffebf2f8 e3e7eaececece9edeee9edeee9edeee9edeee9edeee9edeee9edeee9edeee8ecede5e9ea f4f8f9f4f8f9d2d6d7dfe3e4fcfffff0f4f5e5e9f2e7eef6e9f0fae9f0faeaf1f9eef1f8 f0eff4edebeeedeef3edeef3edeef3edeef3edeef3edeef3edeef3edeef3edeef3edeef3 edeef3edeef3edeef3edeef3edeef3edeef3edeef3edeef3edeef3edeef3edeef3edeef3 edeef3edeef3edeef3edeef3edeef3edeef3edeef3edeef3edeef3edeef3f4faf8e6ebe7 f4f6f1f0f1ece7e9e4eff4f0e4eae8dbe4e3fffffbf1f1efe3e7e6e1e7e7e7f0efeaf3f0 eff6efeaefe8edeef3edeef3edeef3edeef3edeef3edeef3edeef3edeef3edeef3edeef3 edeef3edeef3edeef3edeef3edeef3edeef3edeef3edeef3edeef3edeef3edeef3edeef3 edeef3edeef3edeef3edeef3edeef3edeef3edeef3edeef3edeef3edeef3f2edffeeecf9 e9edeee5efe6e3efe5e1ece8e5ecf4edf0ffeae5ffeee9fff2eefff1e8fff4f0f1f6f4e5 f5f6ccf1efdaf0f2ffe9f0e0edf2ecf3f2ffedeee6edefdaf3f0e7f0eee2edeef3edeef3 edeef3edeef3edeef3edeef3edeef3edeef3edeef3edeef3edeef3edeef3edeef3edeef3 edeef3edeef3edeef3edeef3edeef3edeef3edeef3edeef3edeef3edeef3edeef3edeef3 edeef3edeef3edeef3edeef3edeef3edeef3ffeff5f1e7efe5e4ecefeef3eeedebf7f8f2 eaf3eeddebebebeefde6ebeef4fcf1eff7eadee5def3f8fcf6faffcaced7e6e8e7ebf0d2 e8e9e4faf1ffece3ffe1e2ddf9fee0e2e4e3dfe7eafcf9fffbf1f9e8e2e4e4e8e7edf6f1 f2f2f0f9f0f1edeef3edeef3edeef3edeef3edeef3edeef3edeef3edeef3f0ece9f0ece9 f0eaeaefe9e9ede9eae9e9e9e6eaebe5ebebecf3fdecf3fdecf3fdecf3fdecf3fdecf3fd ebf2fcebf2fcf1edfbf1edfbf1edfbf1edfbf1edfbf1edfbf1edfbf1edfbf0eefbf0eefb f0eefbf0eefbf0eefbf0eefbf0eefbf0eefbf0eefbf0eefbf0eefbf0eefbf0eefbf0eefb f0eefbf0eefbf0eefbf0eefbf0eefbf0eefbf0eefbf0eefbf0eefbf0eefbf0eefbf0eefb f0eefbf0eefbf0eefbf0eefbf0eefbf0eefbf6f6f8f1f9ff7b8ec66a80d56a7ce2424ab5 5464c36c7bd88091e17d96cfc8e7ffcdedfcd8f2ffe0f1fff1ecf0f1ecf0f1ecf0f1ecf0 f1ecf0f1ecf0f1ecf0f1ecf0f1ecf0f1ecf0f1ecf0f1ecf0f1ecf0f1ecf0f1ecf0f1ecf0 f6efdffaf7e4f5f7e1e7ecd6e6ead9f2f3ebfbf5f9f9effad9f2eef0f4fffbecfff5e5ef ece9d8eaedd2f2e9e0fce4f2e9e8e4e8e7e3edece8f4f3eff5f4f0f2efeaf0ebe5f2ede7 f1ecf0f1ecf0f1ecf0f1ecf0f1ecf0f1ecf0f1ecf0f1ecf0f1ecf0f1ecf0f1ecf0f1ecf0 f1ecf0f1ecf0f1ecf0f1ecf0f1ecf0f1ecf0f1ecf0f1ecf0f1ecf0f1ecf0f1ecf0f1ecf0 f5ebeaf4ebecefedf2ededf5ededf5eeedf3f1ecf0f4ebeceee8e8f0ede4edf0dbecf1d3 e6e9ccf4f2dbeee4d8f2e3def1ecf0f1ecf0f1ecf0f1ecf0f1ecf0f1ecf0f1ecf0f1ecf0 e1ecdcebe9d4fff7e4fff9ebe5e6d8e2e7d3fbf4e1fff1e3f1ecf0f1ecf0f1ecf0f1ecf0 f1ecf0f1ecf0f1ecf0f1ecf0f1ecf0f1ecf0f1ecf0f1ecf0f1ecf0f1ecf0f1ecf0f1ecf0 f1ecf0f1ecf0f1ecf0f1ecf0f1ecf0f1ecf0f1ecf0f1ecf0f1ecf0f1ecf0f1ecf0f1ecf0 f1ecf0f1ecf0f1ecf0f1ecf0e5efffdde1ffe8eafff6faffe1f0edd6f2d9deffe8d2fee7 e3ffd8e9feede9f1fee6e4fcf3edfbf5f1f2eae8e9f5f4f9f1ecf0f1ecf0f1ecf0f1ecf0 f1ecf0f1ecf0f1ecf0f1ecf0f1ecf0f1ecf0f1ecf0f1ecf0f1ecf0f1ecf0f1ecf0f1ecf0 f1ecf0f1ecf0f1ecf0f1ecf0f1ecf0f1ecf0f1ecf0f1ecf0f1ecf0f1ecf0f1ecf0f1ecf0 f1ecf0f1ecf0f1ecf0f1ecf0f1ecf0f1ecf0f1ecf0f1ecf0f1ecf0f1ecf0f1ecf0f1ecf0 f1ecf0f1ecf0f1ecf0f1ecf0f1ecf0f1ecf0f1ecf0f1ecf0f1ecf0f1ecf0f1ecf0f1ecf0 f1ecf0f1ecf0f1ecf0f1ecf0f1ecf0f1ecf0f1ecf0f1ecf0f1ecf0f1ecf0f1ecf0f1ecf0 f1ecf0f1ecf0f1ecf0f1ecf0f1ecf0f1ecf0f1ecf0f1ecf0f1ecf0f1ecf0f1ecf0f1ecf0 f1ecf0f1ecf0f1ecf0f1ecf0f1ecf0f1ecf0f1ecf0f1ecf0f1ecf0f1ecf0f1ecf0f1ecf0 f1ecf0f1ecf0f1ecf0f1ecf0f1ecf0f1ecf0f1ecf0f1ecf0e2f5e1def6deddf7dcdbf9dd defae4e3f9ede7f5f6eaf3faeeecf9edeaf3f0e6eef2e7edf2e7edf0e6eeedeaf3eeecf9 dbfdfcdcf9f5e0f6eae5f3e2e8f6dfe7f6dfe3f6e0def6e0f1ecf0f1ecf0f1ecf0f1ecf0 f1ecf0f1ecf0f1ecf0f1ecf0f1ecf0f1ecf0f1ecf0f1ecf0f1ecf0f1ecf0f1ecf0f1ecf0 f1ecf0f1ecf0f1ecf0f1ecf0f1ecf0f1ecf0f1ecf0f1ecf0f1ecf0f1ecf0f1ecf0f1ecf0 f1ecf0f1ecf0f1ecf0f1ecf0f3eae5ece4e1fffefadad5d2eee9e5fbf4eef1e8e1efe5dc f8eff2f8eff2f8eff2f8eff2f8eff2f8eff2f8eff2f8eff2fff7fafcf3f6e1d8dbf7eef1 fffcfff2e9eceae1e4ece3e6f5ecedf3eef2eeedf3eaeaf2eeeef6f6f4f9f8eff0f1e7e6 f1ecf0f1ecf0f1ecf0f1ecf0f1ecf0f1ecf0f1ecf0f1ecf0f1ecf0f1ecf0f1ecf0f1ecf0 f1ecf0f1ecf0f1ecf0f1ecf0f1ecf0f1ecf0f1ecf0f1ecf0f1ecf0f1ecf0f1ecf0f1ecf0 f1ecf0f1ecf0f1ecf0f1ecf0f1ecf0f1ecf0f1ecf0f1ecf0e7e7eff3f1f6fcf3f4ece1df ede2e0fffcfbfffdfff1ecf0d7d9d8eef2f3e9f1f3e8f0f2f5f9f8f6f6eeeae4d8f2e9d8 f1ecf0f1ecf0f1ecf0f1ecf0f1ecf0f1ecf0f1ecf0f1ecf0f1ecf0f1ecf0f1ecf0f1ecf0 f1ecf0f1ecf0f1ecf0f1ecf0f1ecf0f1ecf0f1ecf0f1ecf0f1ecf0f1ecf0f1ecf0f1ecf0 f1ecf0f1ecf0f1ecf0f1ecf0f1ecf0f1ecf0f1ecf0f1ecf0f6ebf1eee8eaebe9eaeef0ef f1f2f6efedfbf2e8fff7e9fff6f7e9f5f1f0f1ebf7ece4f1e9e1dfeae1dcf1e6ecfbecff f2eae7e9e0dbefe5e3f8eeecf3e9e7f3e9e7f9efedf8eeecf1ecf0f1ecf0f1ecf0f1ecf0 f1ecf0f1ecf0f1ecf0f1ecf0f1ecf0f1ecf0f1ecf0f1ecf0f1ecf0f1ecf0f1ecf0f1ecf0 f1ecf0f1ecf0f1ecf0f1ecf0f1ecf0f1ecf0f1ecf0f1ecf0f1ecf0f1ecf0f1ecf0f1ecf0 f1ecf0f1ecf0f1ecf0f1ecf0eee1d1f5f2edf0f5f9edeef2f4e9e5f2e1daeee5e8f3f5ff eee2fafdf4f9f1ebddede7d9fcf4f2eee4ede6dde2fffef8fffaffdfdcd3efeeeaefe8ff e6dffff3f2eef1eee5f9f2ffe2edf1edecf2f6ebf3ede4e7f5f4f0f4f4ecf8eee5f5e1d8 f1ecf0f1ecf0f1ecf0f1ecf0f1ecf0f1ecf0f1ecf0f1ecf0f2e9e4f3e8e4f6e8e8f7e8ed f6eaf4f5effbf2f4fff0f6ffe1ecdee2eddfe3eee0e5f0e2e6f1e3e6f1e3e6f1e3e5f0e2 ebebe1ebebe1ebebe1ebebe1ebebe1ebebe1ebebe1ebebe1ebebe1ebebe1ebebe1ebebe1 ebebe1ebebe1ebebe1ebebe1ebebe1ebebe1ebebe1ebebe1ebebe1ebebe1ebebe1ebebe1 ebebe1ebebe1ebebe1ebebe1ebebe1ebebe1ebebe1ebebe1ebebe1ebebe1ebebe1ebebe1 ebebe1ebebe1ebebe1ebebe1c8e4ffcee6ff7f94d37085d86e80e43e4ab65769cb7582de 7e8dde5a79ba2f6194144f791449711f4a74004d97004d97004d97004d97004d97004d97 004d97004d97004d97004d97004d97004d97004d97004d97004d97004d9702528f015595 005196004c96004d9d0451a104489900398900619500539a074da3054c9a00508a005f98 045fb00148b2145ab0034aa200419c0046a3004baa0049a60046a40049a5004d97004d97 004d97004d97004d97004d97004d97004d97004d97004d97004d97004d97004d97004d97 004d97004d97004d97004d97004d97004d97004d97004d97004d97004d97014b92004c96 004d99004e9d004e9b004d96024b8f054a8b0147a6004da20058a1005b99066fa800538c 0165a1005696004d97004d97004d97004d97004d97004d97004d97004d97005c8d0047b1 0a42bb035096005c7e006192005c9c004e85004d97004d97004d97004d97004d97004d97 004d97004d97004d97004d97004d97004d97004d97004d97004d97004d97004d97004d97 004d97004d97004d97004d97004d97004d97004d97004d97004d97004d97004d97004d97 004d97004d9716459d0b43801b5c7c0e5569034c6f155b99094da000379500317d0e50a4 034a9a08528f115c84014576053c96103cb9004d97004d97004d97004d97004d97004d97 004d97004d97004d97004d97004d97004d97004d97004d97004d97004d97004d97004d97 004d97004d97004d97004d97004d97004d97004d97004d97004d97004d97004d97004d97 004d97004d97004d97004d97004d97004d97004d97004d97004d97004d97004d97004d97 004d97004d97004d97004d97004d97004d97004d97004d97004d97004d97004d97004d97 004d97004d97004d97004d97004d97004d97004d97004d97004d97004d97004d97004d97 004d97004d97004d97004d97004d97004d97004d97004d97004d97004d97004d97004d97 004d97004d97004d97004d97004d97004d97004d97004d97004d97004d97004d97004d97 004d97004d97004d97004d97004d97004d9707488a074c9108509a0950a00a4ca20c459c 103f97133d93005098045499065192024a85024a85065192045499005098034694034697 05479b0a4aa1104ea1124d9b1048920d4389004d97004d97004d97004d97004d97004d97 004d97004d97004d97004d97004d97004d97004d97004d97004d97004d97004d97004d97 004d97004d97004d97004d97004d97004d97004d97004d97004d97004d97004d97004d97 004d97004d970054af004fa200509a0d5b9b0d55900e5993105e9c004f8e004994004994 004994004994004994004994004994004994004590014d9800459008549f00489300418c 1460ab06529d094e8f075094004d96004693004897004f9b014f9900488f004d97004d97 004d97004d97004d97004d97004d97004d97004d97004d97004d97004d97004d97004d97 004d97004d97004d97004d97004d97004d97004d97004d97004d97004d97004d97004d97 004d97004d97004d97004d97004d97004d97004ca50053a80048960f5ca4155ea3003b83 00418905539e0b509d135cab004ba0004aa5004aa6004da70042970d4fa3004d97004d97 004d97004d97004d97004d97004d97004d97004d97004d97004d97004d97004d97004d97 004d97004d97004d97004d97004d97004d97004d97004d97004d97004d97004d97004d97 004d97004d97004d97004d97004d97004d9704539600509600529d0158a80054aa00489e 004198054398005677004e90004ebb006a780163940057840049bb0054ae04647d004ab2 0052a20062840053a70049b80051a80050ad004d97004d97004d97004d97004d97004d97 004d97004d97004d97004d97004d97004d97004d97004d97004d97004d97004d97004d97 004d97004d97004d97004d97004d97004d97004d97004d97004d97004d97004d97004d97 004d97004d97005b9e0065b50059b40042961968ad10509000438e004da70b51b00a549d 024f87004c880952a10850a4024e8c0353780043a1004da4065e9d00547d00537c0c64a3 0454ab0039970264a5004f96004a99055aab004d9e004d9c004fa00052a5004d97004d97 004d97004d97004d97004d97004d97004d970053a80052ab0051b10054bc005acb0063d9 006ce80073ee2b8bff2d8dff2f8fff3191ff3393ff3393ff3292ff3292ff2897ff2897ff 2897ff2897ff2897ff2897ff2897ff2897ff2996ff2996ff2996ff2996ff2996ff2996ff 2996ff2996ff2996ff2996ff2996ff2996ff2996ff2996ff2996ff2996ff2996ff2996ff 2996ff2996ff2996ff2996ff2996ff2996ff2996ff2996ff2996ff2996ff2996ff2996ff 2996ff2996ff5497f06999eb6a84cf7281d26f7cda4550ba5466c87681dd8291e46b91da 054a8f004d92004c910b509502519c02519c02519c02519c02519c02519c02519c02519c 02519c02519c02519c02519c02519c02519c02519c02519c00469c0043a00046af004db9 0049ae004296104a8a265a8c254576788a60d2db6eafbc843552941c47c76e9ee6abd9cc 6dabd23c7faa0c5486004b8001538b05579104568e04558c02519c02519c02519c02519c 02519c02519c02519c02519c02519c02519c02519c02519c02519c02519c02519c02519c 02519c02519c02519c02519c02519c02519c02519c02519c06509703519b00529e0052a0 02519c094f94104e8b154c8451402e524b5219224d2d4899123ca2002d970c47ab0747a1 02519c02519c02519c02519c02519c02519c02519c02519c9b96d6675b5b37261e2b2b67 224bb7074dac0041951642ab02519c02519c02519c02519c02519c02519c02519c02519c 02519c02519c02519c02519c02519c02519c02519c02519c02519c02519c02519c02519c 02519c02519c02519c02519c02519c02519c02519c02519c02519c02519c02519c02519c 004cae004f8d02658e004987004ab70849cb00278d2f5fa10f429d2363cd003aab0051aa 006ea10057800062a10055b102519c02519c02519c02519c02519c02519c02519c02519c 02519c02519c02519c02519c02519c02519c02519c02519c02519c02519c02519c02519c 02519c02519c02519c02519c02519c02519c02519c02519c02519c02519c02519c02519c 02519c02519c02519c02519c02519c02519c02519c02519c02519c02519c02519c02519c 02519c02519c02519c02519c02519c02519c02519c02519c02519c02519c02519c02519c 02519c02519c02519c02519c02519c02519c02519c02519c02519c02519c02519c02519c 02519c02519c02519c02519c02519c02519c02519c02519c02519c02519c02519c02519c 02519c02519c02519c02519c02519c02519c02519c02519c02519c02519c02519c02519c 02519c02519c02519c02519c004c9b004fa60052b2004eb20047a60046940f4c851b517f 52584a6c6d5b7c765e786f52786f527c765e6c6d5b52584a1b4f7e0e4c85004995004aa7 004eb10050b0004ea6004a9c02519c02519c02519c02519c02519c02519c02519c02519c 02519c02519c02519c02519c02519c02519c02519c02519c02519c02519c02519c02519c 02519c02519c02519c02519c02519c02519c02519c02519c02519c02519c02519c02519c 0d51901d5181000520fbfffff6f1eee6e5e3f8ffffeffffff9fffff9fffff9fffff9ffff f9fffff9fffff9fffff9fffff7fefff9fffff9fffff9ffffeff6fff9ffffd9e0ea030a14 073e760f4d8a0e5499004f9a004d9b01539f06549e054f9602519c02519c02519c02519c 02519c02519c02519c02519c02519c02519c02519c02519c02519c02519c02519c02519c 02519c02519c02519c02519c02519c02519c02519c02519c02519c02519c02519c02519c 02519c02519c02519c02519c194165446382475c71a3adb9e0e3eab5b5bdb7bbc4c5cbd7 cfe8e27193942455641a597800437008558909568e024d8602519c02519c02519c02519c 02519c02519c02519c02519c02519c02519c02519c02519c02519c02519c02519c02519c 02519c02519c02519c02519c02519c02519c02519c02519c02519c02519c02519c02519c 02519c02519c02519c02519c035294004f980050a20051a7004a990044821250792b637e 1f4d7f153e902541c647891d51874d3c76102e56563469113e77262d4ca62c587d2d6f31 1e54821043ac0f4e810d4d8d02519c02519c02519c02519c02519c02519c02519c02519c 02519c02519c02519c02519c02519c02519c02519c02519c02519c02519c02519c02519c 02519c02519c02519c02519c02519c02519c02519c02519c02519c02519c02519c02519c 0c4475034a8800478b205685e2f2fffffcfbfffdfff4fffff5f7fffbfffffbfffae6ebef eff1fffbfeffdde6d1404f14818a5bf9fcffe9f0fff7ffecf7ffece6edfdeaedf6788152 e8f0e1fefffdf6fcffd8ecff305c8917568c0243830c488e02519c02519c02519c02519c 02519c02519c02519c02519c074b8809488d0c45940d45a20e4bb50f55c70e61d90f69e3 0064e50065e60168e90269ea036aeb0269ea0168e90067e80d5de60d5de60d5de60d5de6 0d5de60d5de60d5de60d5de6105ce6105ce6105ce6105ce6105ce6105ce6105ce6105ce6 105ce6105ce6105ce6105ce6105ce6105ce6105ce6105ce6105ce6105ce6105ce6105ce6 105ce6105ce6105ce6105ce6105ce6105ce6105ce6105ce6105ce6105ce6105ce6105ce6 005fed135bd1607fd97980d07074cd4e56bb5d6cd1737cd97786db719aea004596005cb0 0055ac004ca2004b95004b95004b95004b95004b95004b95004b95004b95004b95004b95 004b95004b95004b95004b95004b95004b9504548f00498e004f9f0657a6004c88084b66 49857d99cfafeeffd1f6f3acffffb6f6f7cd92bbcf79beff94daff86c1f9b5e6ff6ba1e1 1a59a0003f8d00489b0450a40350a2014c9f004b95004b95004b95004b95004b95004b95 004b95004b95004b95004b95004b95004b95004b95004b95004b95004b95004b95004b95 004b95004b95004b95004b95004b95004b95014991004a95004b98004c98004b93074888 11457e164476fff300ffff3468770e90b3ac134f8505559e004c8c005e8e004b95004b95 004b95004b95004b95004b95004b95004b95563c3beef000ffff096e7b460026ad005599 016d7a00459a004b95004b95004b95004b95004b95004b95004b95004b95004b95004b95 004b95004b95004b95004b95004b95004b95004b95004b95004b95004b95004b95004b95 004b95004b95004b95004b95004b95004b95004b95004b95004b95004b95014da5004c89 005f9500439a1554c5123d74092900b3d212f6fe00d6eb36375a44073d970a4fc8003a9e 14579d0b467e004b95004b95004b95004b95004b95004b95004b95004b95004b95004b95 004b95004b95004b95004b95004b95004b95004b95004b95004b95004b95004b95004b95 004b95004b95004b95004b95004b95004b95004b95004b95004b95004b95004b95004b95 004b95004b95004b95004b95004b95004b95004b95004b95004b95004b95004b95004b95 004b95004b95004b95004b95004b95004b95004b95004b95004b95004b95004b95004b95 004b95004b95004b95004b95004b95004b95004b95004b95004b95004b95004b95004b95 004b95004b95004b95004b95004b95004b95004b95004b95004b95004b95004b95004b95 004b95004b95004b95004b95004b95004b95004b95004b95004b95004b95004b95004b95 004b95004b95064f86065091054f9a034b970a4b852258724371665c8461908655baaa76 d9c387dcc07fdcc07fd9c387baaa769086556e785f506b66275a75055087004e95005097 015190085188004b95004b95004b95004b95004b95004b95004b95004b95004b95004b95 004b95004b95004b95004b95004b95004b95004b95004b95004b95004b95004b95004b95 004b95004b95004b95004b95004b95004b95004b95004b95004b95004b950456a200336b e2faffdbd5d5ffebe0f2e4dbdddee0d4e2ebe0dfdae0dfdae0dfdae0dfdae0dfdae0dfda e0dfdae0dfdadeddd8eae9e4d5d4cfe8e7e2e5e4dfdad9d4f5f4efdad9d400194b02366f 0f509006539b004e9a004d9a004c9700478f004b95004b95004b95004b95004b95004b95 004b95004b95004b95004b95004b95004b95004b95004b95004b95004b95004b95004b95 004b95004b95004b95004b95004b95004b95004b95004b95004b95004b95004b95004b95 004b95004b95719ab6b2d2e76f818b848a8adbd8d1f3efe4fffff8e4e3dec5af9a857b72 909caaa3c6ee265d9d003c8b034da6004caa004b95004b95004b95004b95004b95004b95 004b95004b95004b95004b95004b95004b95004b95004b95004b95004b95004b95004b95 004b95004b95004b95004b95004b95004b95004b95004b95004b95004b95004b95004b95 004b95004b95025194004d9a004fa5004ea5014c9016587b45807e75aa903e814e1d5759 173f9e3486003f7b312b680b2341872e5e34206c000f39a70f4b6f156c0b085082003ec0 005087005099004b95004b95004b95004b95004b95004b95004b95004b95004b95004b95 004b95004b95004b95004b95004b95004b95004b95004b95004b95004b95004b95004b95 004b95004b95004b95004b95004b95004b95004b95004b95004b95004b95064797004fa8 00489f114982f1fdfffffceafff8e2fafff4fffdfeffffeffbfbe1fffff8fffcffe1ddde acb07ea1ac4ceaf348837c50fff3fffffdfffffdfff3e4ff635c30e4ed42665328ead6bd fffcfdf1ffff0031660959a0004da50054b5004b95004b95004b95004b95004b95004b95 004b95004b950054a4004ea60048ad0043b80047cc0050df005bf20063fd0065f20067f4 0069f6016af70069f60068f50065f20064f1005eea005eea005eea005eea005eea005eea 005eea005eea005dea005dea005dea005dea005dea005dea005dea005dea005dea005dea 005dea005dea005dea005dea005dea005dea005dea005dea005dea005dea005dea005dea 005dea005dea005dea005dea005dea005dea005dea005dea005dea005dea0066ff0057e3 6f92f6878ad97371c55256b95665c46578d47997ed6996e70a43920045930453a2004fa0 004f98004f98004f98004f9800509900509900509900509900509b00509b00509b00509b 00509b00509b00509b00509b0459aa0e4b815b767ff2eec9ffefafffffbcfafbb9fdffce fdf4d3f5f5cffbffe1e6feeea0c4da86b5ed90c8ff8ac7ff85bbe79ed8ff001f52054c84 045493005398005ba500499600509b00509b00509b00509b00509b00509b00509b00509b 00509b00509b00509b00509b00509b00509b00509b00509b00509b00509b00509b00509b 00509b00509b00509b00509b00519b00529f0052a20052a200519d005092084d880e4c7f cfd100c3c921374200acc7d0104082004095005fac00599a00509400509900529f0052a2 00529f005096044e8b0a4c864c453fbbbe0fbec5004b5d45124aa90044730b768a00428e 00509b00509b00509b00509b00509b00509b00509b00509b00509b00509b00509b00509b 00509b00509b00509b00509b00509b00509b00509b00509b00509b00509b00509b00509b 00509b00509b00509b00509b00509b00509b00509b00509b0d4e9e004796005393055393 053695354286a8a441ffff07afaf4b998f1cedf83238428a0048700043e3006a7b005191 00509b00509b00509b00509b00509b00509b00509b00509b00509b00509b00509b00509b 00509b00509b00509b00509b00509b00509b00509b00509b00509b00509b00509b00509b 00519c00519c00519c00519c00519c00519c00519c00519c00519c00519c00519c00519c 00519c00519c00519c00519c005fb10036850966ac005090004c8803579700569a004f97 004e9d004e9d004e9d004e9d004e9d004e9d004e9d004e9d123c8e0837871d52a00a4891 0c559a004e9000519000589500519c00519c00519c00519c00519c00519c00519c00519c 00519c00519c00519c00519c00519c00519c00519c00519c00519c00519c00519c00519c 00519c00519c00519c00519c00519c00519c00519c00519c00519c00519c00519c00519c 0059a10054b1004cb10b46882c4f55656b47ab9269dcae94ebdba8fcecb9fdedbaeedeab edddaafaeab7f7e7b4e6d6a3d1a77da9925c6c6f403250500b417f0045a60055af0063a7 00519c00519c00519c00519c00519c00519c00519c00519c00519c00519c00519c00519c 00519c00519c00519c00519c00519c00519c00519c00519c00519c00519c00519c00519c 00519c00519c00519c00519c00519c00519c00519c00519c11427d000625dcdcdee1e3e0 cfe5f0cfe6f8dddae3f4d6cedde1e2d2dbdacedddad6e6e3dae4e3d9d9dbe1d4dbefdae3 cbd6d0e1ece6d8e1ded2d6d7e4e3e8dbd8dfd3cdd7eae2edc4f4fe104474003d940350aa 0050920060920044850a5eb800509c00509c00509c00509c00509c00509c00509c00509c 00509c00509c00509c00509c00509c00509c00509c00509c00509c00509c00509c00509c 00509c00509c00509c00509c00518c004a920056b00042a30c58ac104b831b445ac2e0e0 7d7779c9c3c5fffdfffffdfff9f3f5fef8fafff9fbf1ebedf7ffffe4e2effffafd927e7f aaa2af8698bc124481064b9800509c00509c00509c00509c00509c00509c00509c00509c 00509c00509c00509c00509c00509c00509c00509c00509c00509c00509c00509c00509c 00509c00509c00509c00509c00509c00509c00509c00509c00509c00509c00509c00509c 014f97004b9e0047a500489f0f528625625a3f742e4e80113d77072f6915256229226731 1a64310e56420d4c78154baf0d3aaf0d44970b4c86044b8b00479f0048a7005399006084 00509c00509c00509c00509c00509c00509c00509c00509c00509c00509c00509c00509c 00509c00509c00509c00509c00509c00509c00509c00509c00509c00509c00509c00509c 00509e004f9d004f9d0052a00154a20052a000509e00509e07598b005796004c9514528f e7fffff8f9fef5f7f2f7fffffafeedfafeedfbfff0fefff4fefff6fbfef5eff2e9e5e8e1 d0e3c3f8ffeff5fcf4fefffffffdfffef9ff7f7b7c9e9a97988e73fff8defffff4eaffff 023f6c004e960051a5005bb2004d8c005396005299004c96004e990a56a108559d004a93 065284004f960249b5001ca8043bc9005bda0062e3195bed006ee30052c11275ec0064ed 005ce90c4fb80060ff0053f10360c7004eff1658d0004be40454d10066db003deb116aae 004cd8005eeb0353de0044ff0062c30044e30060f5054beb0050f30064d30060c3064adb 005bd70451d50753f4005cce0963ef0055ef0054d30050db0279ff0054b70063dc2c31ff 0368d4003ee00a59e9006fed253de80057eb0263d8004def0059ff084fbb628ad2808de9 7174dd454aa65d69cb6b7bda728ce36389da174b970d4b96084d9a004895084a94084a94 084a94084a94084a94084a94084a94084a94084a96084a96084a96084a96084a96084a96 084a96084a96004281064771577f8be5f6e6f8fbdeffffe6f7ffeef2fff8fafde8ecf7d7 f1ffe0dcfae0a3cbca8ebed492caeb83c2e3a7d1ffb0dbff0c3d75164c8a09468701448b 1058a209529f084a96084a96084a96084a96084a96084a96084a96084a96084a96084a96 084a96084a96084a96084a96084a96084a96084a96084a96084a96084a96084a96084a96 084a96084a960a4a92074b96034c99034c9b064b980b4a8f14478619467f33351f383e3a f2ffff6d86be2d559d114996003b84105b9f0b4a8f084a94044b99034c9b044c980b4a91 124888164782cee1f2bbc5a0393b167e8db412449d1360b0002e7f1f4eba084a96084a96 084a96084a96084a96084a96084a96084a96084a96084a96084a96084a96084a96084a96 084a96084a96084a96084a96084a96084a96084a96084a96084a96084a96084a96084a96 084a96084a96084a96084a96084a96084a9606447d0a4e8d1b5ace0032b0003c1a88cb00 dfff029c9f0a4a6135585765616741a0ea0011528a1c798a0027811a4aae084a96084a96 084a96084a96084a96084a96084a96084a96084a96084a96084a96084a96084a96084a96 084a96084a96084a96084a96084a96084a96084a96084a96084a96084a96094b97094b97 094b97094b97094b97094b97094b97094b97094b97094b97094b97094b97094b97094b97 094b97094b9725274d5a5677f0e3fdfff7fffff4ffffeffffff5fffff8fffff9fffff9ff fff9fffff9fffff9fffff9fffff9fffff9ffe0ffefddfff8c3f8f2043d50013b6907468d 2c6cc4003296094b97094b97094b97094b97094b97094b97094b97094b97094b97094b97 094b97094b97094b97094b97094b97094b97094b97094b97094b97094b97094b97094b97 094b97094b97094b97094b97094b97094b97094b97094b97094b97094b97003b75003f8a 0c49992a618a57837290ae70cbd58ef1ebafb3b7a8ced2c3e6eadbecf0e1ebefe0e3e7d8 cacebfaeb2a3e9e6a1cbd38696b16e5c836e2b5c840b4491003f88004178094b97094b97 094b97094b97094b97094b97094b97094b97094b97094b97094b97094b97094b97094b97 094b97094b97094b97094b97094b97094b97094b97094b97094b97094b97094b97094b97 094b97094b97094b97094b97094b97094b97005165002323bfccbae5d9cde9d2dce1b0cd c76a85b73648be1745c43259d66a84eaa8b4e9d1cfd5ddd0c3decbbde3ccee1f57d91f50 b11940b64b65e9b1bcede4dfc4dfd0b1dec9a2c7da2950871b4aa4134ea8034a8c0b5489 003a7d03439b0b4a970b4a970b4a970b4a970b4a970b4a970b4a970b4a970b4a970b4a97 0b4a970b4a970b4a970b4a970b4a970b4a970b4a970b4a970b4a970b4a970b4a970b4a97 0b4a970b4a970d4d8b02468d00469b296fc700328227548fb3cff45f7185dfeee7edfcf5 f2fffae9f8f1e6f5eeeffef7f5fffdf5fffddaedebf8fffbe4e6d9fbfceee7f0eb68848f 95c6e40948710b4a970b4a970b4a970b4a970b4a970b4a970b4a970b4a970b4a970b4a97 0b4a970b4a970b4a970b4a970b4a970b4a970b4a970b4a970b4a970b4a970b4a970b4a97 0b4a970b4a970b4a970b4a970b4a970b4a970b4a970b4a970b4a970b4a970c518c094e8f 064c91094e851356672663413870194578014f8d043368341841790931a30a369f164a86 306a7e4a878881c86079c35466b250499169286a8d0f4ca7003ea7003c9d0b4a970b4a97 0b4a970b4a970b4a970b4a970b4a970b4a970b4a970b4a970b4a970b4a970b4a970b4a97 0b4a970b4a970b4a970b4a970b4a970b4a970b4a970b4a970b4a970b4a97044b8d02498b 00478901488a01488a01488a01488a02498b00399100409d00459b285e9cdcf7ffeef8f7 e0ecdedcf3e3f9fbfff9fbfff9fbfffcfefffcfefffcfefff9fbfff4f5fff4fdffe5edf8 e8eefe7c7f92f4f5fff8fafffcfefff3f6fde3f0f6f8ffffeaf7ffd4efff2e6091105193 02468d003b821655a20d4c990d4a9a1251a00b4d9b00418e00438e02509a04538c005098 064bb3001da50639c60055d8005be20854e80060ff136fff004bc6005df7007eff1e61d6 1554c5006cfa0054e4065ad40047c22657da0059ff055eec0060ff0042f90d5eee0a54f3 1459be0a53e00d61e70552ff0054c91c60e91545e50f4eeb004ff1125fff0051d8165ee6 114bf50940f30030f01962e50447c9263ffb073fff1360ee0065d50062eb0051d31967ff 0048e6005fed2d4efb0055e40049c41061ee004fee236bcf6088cd7987e06a6dd64b52ad 646dd27584e3798fe57493e35a82ca5c8dd2578cd2548dd4658fd7658fd7658fd7658fd7 658fd7658fd7658fd7658fd7648ed8648ed8648ed8648ed8648ed8648ed8648ed8648ed8 65a0ff5587f8577ce4869efe6a7ad97381e46a7be57182f48083ee727bd87b8bd97b90df 6782db6686e97094f5628ae9718ec889a7e35274b36c92d36991d65d87cf5f8ed65080ca 648ed8648ed8648ed8648ed8648ed8648ed8648ed8648ed8648ed8648ed8648ed8648ed8 648ed8648ed8648ed8648ed8648ed8648ed8648ed8648ed8648ed8648ed8648ed8648ed8 688dd1668ed4638fda6090dc618fda668ed46a8dcf6e8cca6b7cee7285eb7a93e76c8bce 6587c47ea1e17499e05378c6678ed3648ed6618fda6090dc618fda668ed46d8ccc6f8cc8 6195aa7b91e67c80ee768ad36795c95487da7a9aff707de6648ed8648ed8648ed8648ed8 648ed8648ed8648ed8648ed8648ed8648ed8648ed8648ed8648ed8648ed8648ed8648ed8 648ed8648ed8648ed8648ed8648ed8648ed8648ed8648ed8648ed8648ed8648ed8648ed8 648ed8648ed8648ed8648ed8619cba5886e4547fef5482c05d82b77c8ef48c8eff7b79dc 6e94df6e87bd737bdd91a9f36b96fc467aea6e89ff788bd8648ed8648ed8648ed8648ed8 648ed8648ed8648ed8648ed8648ed8648ed8648ed8648ed8648ed8648ed8648ed8648ed8 648ed8648ed8648ed8648ed8648ed8648ed8648ed8648ed8658fd9658fd9658fd9658fd9 658fd9658fd9658fd9658fd9658fd9658fd9658fd9658fd9658fd9658fd9658fd9658fd9 5c97f3427ad16b9aec618bd75f86d16892de6491e25f8fe16191d36191d36191d36191d3 6191d36191d36191d36191d37987ff6d7df78397ff6f87f37795f76589e1628bdb6691df 658fd9658fd9658fd9658fd9658fd9658fd9658fd9658fd9658fd9658fd9658fd9658fd9 658fd9658fd9658fd9658fd9658fd9658fd9658fd9658fd9658fd9658fd9658fd9658fd9 658fd9658fd9658fd9658fd9658fd9658fd9658fd9658fd97599d76e90e96587f56284f0 6486df6c87d87281e0757beb7384f07485f17283ef6e7feb6d7eea7081ed7182ee6f80ec 7279ed7280e16f85d86984df6480ee6583f16d90e4749bd6658fd9658fd9658fd9658fd9 658fd9658fd9658fd9658fd9658fd9658fd9658fd9658fd9658fd9658fd9658fd9658fd9 658fd9658fd9658fd9658fd9658fd9658fd9658fd9658fd9658fd9658fd9658fd9658fd9 658fd9658fd9658fd9658fd972a4ff476ac6829ae2678cd05391dc5ba3f55f9be4628ecd 7893e26d8edb648ed86494dc6092d95a8ad25c88d1658cd76385cf7494df6e8bd96982d2 768bde7282d76b79d17c87e08ea6ca6682c16686dd628ae26190d46fa0d86c97db6d93e6 678ed9678ed9678ed9678ed9678ed9678ed9678ed9678ed9678ed9678ed9678ed9678ed9 678ed9678ed9678ed9678ed9678ed9678ed9678ed9678ed9678ed9678ed9678ed9678ed9 648bce7ca7ec5989d34e7ec86890d67896d68394ca777fb08498f77387e6687cdb6b7fde 6f83e26d81e06e82e17488e78492ea7887dc7c88de7782db8190eb6379dc6986ee6282ef 678ed9678ed9678ed9678ed9678ed9678ed9678ed9678ed9678ed9678ed9678ed9678ed9 678ed9678ed9678ed9678ed9678ed9678ed9678ed9678ed9678ed9678ed9678ed9678ed9 678ed9678ed9678ed9678ed9678ed9678ed9678ed9678ed96192d55f90df5b8ceb5b8af6 608afa6a8bf4758eeb7d8ee67090cb6987dd6788f36e91f96d95ea6790df6b8eea7090ff 6279ed6481dd6688d06589d56588e6678bec6c95e4709fd7678ed9678ed9678ed9678ed9 678ed9678ed9678ed9678ed9678ed9678ed9678ed9678ed9678ed9678ed9678ed9678ed9 678ed9678ed9678ed9678ed9678ed9678ed9678ed9678ed96895f26794f16592ef6390ed 628fec6592ef6794f16895f26c93de6c9beb5f8fe4547acd8ea3f4838be0717bdd7181f0 658bd6658bd6658bd4658bd4678dd4688ed5698fd66a90d77598ea789deb6c94da5f8bca 6a98d35f8ec65586c06fa0da7292e7738ada6e81ce7a93e75f82e0577ee36b8def718be8 6484d95b7bd05c7fd3658bde5a89db3972c31a5caa0c53a1004f92004f98094aae011fa1 0f3cc90059e10060ed0459f21553e21272fd0044c81a6cec005eff0042f8084fcb0060d9 2d51e3e9ffe5f0fffffff0fefee5fbfff5e9d4fffd114ce80057d90054d30042d01a6aff 005cc0004ad40567ff003fdb0062f30055e6005ce5003bbd1b5afd004ff60064e2006bdd 0667ec0f5ed5005ff20758a9005bbd1c4cb20758ef005adc0347e80e4cdb1354e40066dc 0442cb0062e9003fe70763ff0059ea5ea5ff6991ce7e8ae0676ad15158b3565fc46f7cdc 7486dc768ddb819f

View raw

(Sorry about that, but we can’t show files that are this big right now.)

View raw

(Sorry about that, but we can’t show files that are this big right now.)

View raw

(Sorry about that, but we can’t show files that are this big right now.)

View raw

(Sorry about that, but we can’t show files that are this big right now.)

View raw

(Sorry about that, but we can’t show files that are this big right now.)

View raw

(Sorry about that, but we can’t show files that are this big right now.)

View raw

(Sorry about that, but we can’t show files that are this big right now.)

View raw

(Sorry about that, but we can’t show files that are this big right now.)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment