Olena-patches
Threads by month
- ----- 2025 -----
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2024 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2023 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2022 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2021 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2020 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2019 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2018 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2017 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2016 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2015 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2014 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2013 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2012 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2011 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2010 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2009 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2008 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2007 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2006 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2005 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2004 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
July 2007
- 6 participants
- 59 discussions
12 Jul '07
https://svn.lrde.epita.fr/svn/oln/trunk/milena
Index: ChangeLog
from Thierry Geraud <thierry.geraud(a)lrde.epita.fr>
Add naive median to milena + fix problems with g++-2.95.
* tests/window2d.cc: .
* tests/median.cc: .
* tests/box2d.cc: .
* tests/naive_median.cc: New.
* tests/histo.cc: .
* tests/rectangle2d.cc: New.
* mln/convert/to_dpoint.hh: Fix missing include.
* mln/level/naive: New.
* mln/level/naive/median.hh: New.
* mln/level/median.hh: Update.
* mln/io/save_pgm.hh,
* mln/io/load_pgm.hh: Conform with g++-2.95.
* mln/core/dpoint2d.hh (up, down, left, right): New.
* mln/core/box.hh: Add impl inheritance.
* mln/core/rectangle2d.hh: Fake typedef; add FIXME.
(sym_): New.
* mln/core/concept/window.hh (operator-): New.
* mln/core/concept/doc/window.hh: Update.
* mln/core/window.hh (sym_): New.
(operators): Help g++-2.95.
* mln/core/image2d_b.hh: Add impl inheritance.
(init_with, bbox): New.
(nrows, ncols): Remove; now inherited.
* mln/core/internal/coord_impl.hh: Fix missing include.
* mln/core/internal/box_impl.hh: New.
* mln/core/internal/set_of.hh: Turn to lazy.
(operator=): New.
* mln/accu/median.hh: Conform with g++-2.95.
* mln/value/viter.hh: Help g++-2.95.
* mln/value/set.hh: Cosmetics.
* mln/value/int_u.hh: Help g++-2.95.
* mln/value/internal/value_like.hh (to_equiv): New.
* mln/border/thickness.hh: Remove const.
* img: New.
* img/lena.pgm: New.
img/lena.pgm | 4
mln/accu/median.hh | 4
mln/border/thickness.hh | 2
mln/convert/to_dpoint.hh | 3
mln/core/box.hh | 4
mln/core/concept/doc/window.hh | 4
mln/core/concept/window.hh | 19 ++++
mln/core/dpoint2d.hh | 13 ++
mln/core/image2d_b.hh | 76 +++++++++++------
mln/core/internal/box_impl.hh | 138 +++++++++++++++++++++++++++++++
mln/core/internal/coord_impl.hh | 1
mln/core/internal/set_of.hh | 80 ++++++++++++++----
mln/core/rectangle2d.hh | 12 ++
mln/core/window.hh | 25 ++++-
mln/io/load_pgm.hh | 12 +-
mln/io/save_pgm.hh | 2
mln/level/median.hh | 100 +++++++++++++++-------
mln/level/naive/median.hh | 115 ++++++++++++++++++++++++++
mln/value/int_u.hh | 2
mln/value/internal/value_like.hh | 10 ++
mln/value/set.hh | 7 -
mln/value/viter.hh | 4
tests/box2d.cc | 2
tests/histo.cc | 6 -
tests/median.cc | 170 +--------------------------------------
tests/naive_median.cc | 58 +++++++++++++
tests/rectangle2d.cc | 49 +++++++++++
tests/window2d.cc | 4
28 files changed, 655 insertions(+), 271 deletions(-)
Index: tests/window2d.cc
--- tests/window2d.cc (revision 1005)
+++ tests/window2d.cc (working copy)
@@ -39,5 +39,7 @@
using namespace mln;
window2d w;
- std::cout << w.is_centered() << std::endl;
+ mln_assertion(w.is_centered() = false);
+ mln_assertion(w.is_symmetric() = true);
}
+
Index: tests/median.cc
--- tests/median.cc (revision 1005)
+++ tests/median.cc (working copy)
@@ -27,188 +27,32 @@
/*! \file tests/median.cc
*
- * \brief Tests on mln::value::median<S>.
+ * \brief Test on mln::level::median.
*/
-#include <cmath>
-
#include <mln/core/image2d_b.hh>
-#include <mln/value/int_u.hh>
-
-#include <mln/level/fill.hh>
-#include <mln/level/median.hh>
-#include <mln/debug/println.hh>
-
#include <mln/core/rectangle2d.hh>
#include <mln/io/load_pgm.hh>
#include <mln/io/save_pgm.hh>
+#include <mln/value/int_u.hh>
+#include <mln/level/median.hh>
+
using namespace mln;
using namespace mln::value;
-int_u8 f(const point2d& p)
-{
- return unsigned((2
- + std::cos(float(p.row()))
- + std::sin(float(p.col()))) * 63.9);
-}
-
-
int main()
{
-
-
-// typedef set_<int_u8> S;
-
-// median<S> m(S::the());
-
-// {
-
-// unsigned vals[] = { 42, 69, 51, 12, 51, 12, 42 };
-// unsigned n = sizeof(vals)/sizeof(unsigned);
-
-// for (unsigned i = 0; i < n; ++i)
-// {
-// std::cout << "taking " << vals[i] << ':' << std::endl;
-// m.take(vals[i]);
-// std::cout << m << std::endl;
-// }
-
-// for (int i = int(n) - 1; i >= 0; --i)
-// {
-// std::cout << "untaking " << vals[i] << ':' << std::endl;
-// m.untake(vals[i]);
-// std::cout << m << std::endl;
-// }
-
-// }
+ rectangle2d rec(64, 64);
+ border::thickness = 66;
image2d_b<int_u8>
- lena = io::load_pgm("lena.pgm"),
+ lena = io::load_pgm("../img/lena.pgm"),
out(lena.domain());
- rectangle2d rec(64, 64);
level::median(lena, rec, out);
-
io::save_pgm(out, "out.pgm");
}
-
-
-
-
-// {
-
-// unsigned vals[] = { 42, 69, 51, 12, 51, 12, 42 };
-// unsigned n = sizeof(vals)/sizeof(unsigned);
-
-// for (unsigned i = 0; i < n; ++i)
-// {
-// std::cout << "taking " << vals[i] << ':' << std::endl;
-// m.take(vals[i]);
-// std::cout << m << std::endl;
-// }
-
-// for (unsigned i = 0; i < n; ++i)
-// {
-// std::cout << "untaking " << vals[i] << ':' << std::endl;
-// m.untake(vals[i]);
-// std::cout << m << std::endl;
-// }
-
-// }
-
-
-
-// {
-
-// unsigned vals[] = { 42, 42, 69, 69, 51, 51, 12, 12, 51, 51, 12, 12, 42, 42 };
-// unsigned n = sizeof(vals)/sizeof(unsigned);
-
-// for (unsigned i = 0; i < n; ++i)
-// {
-// std::cout << "taking " << vals[i] << ':' << std::endl;
-// m.take(vals[i]);
-// std::cout << m << std::endl;
-// }
-
-// for (int i = int(n) - 1; i >= 0; --i)
-// {
-// std::cout << "untaking " << vals[i] << ':' << std::endl;
-// m.untake(vals[i]);
-// std::cout << m << std::endl;
-// }
-
-// }
-
-
-// {
-
-// unsigned vals[] = { 42, 42, 69, 69, 51, 51, 12, 12, 51, 51, 12, 12, 42, 42 };
-// unsigned n = sizeof(vals)/sizeof(unsigned);
-
-// for (unsigned i = 0; i < n; ++i)
-// {
-// std::cout << "taking " << vals[i] << ':' << std::endl;
-// m.take(vals[i]);
-// std::cout << m << std::endl;
-// }
-
-// for (unsigned i = 0; i < n; ++i)
-// {
-// std::cout << "untaking " << vals[i] << ':' << std::endl;
-// m.untake(vals[i]);
-// std::cout << m << std::endl;
-// }
-
-// }
-
-
-
-
-// {
-
-// unsigned vals[] = { 42, 69, 51, 12, 51, 12, 42, 69, 51, 12, 51, 12, 42 };
-// unsigned n = sizeof(vals)/sizeof(unsigned);
-
-// for (unsigned i = 0; i < n; ++i)
-// {
-// std::cout << "taking " << vals[i] << ':' << std::endl;
-// m.take(vals[i]);
-// std::cout << m << std::endl;
-// }
-
-// for (int i = int(n) - 1; i >= 0; --i)
-// {
-// std::cout << "untaking " << vals[i] << ':' << std::endl;
-// m.untake(vals[i]);
-// std::cout << m << std::endl;
-// }
-
-// }
-
-
-// {
-
-// unsigned vals[] = { 42, 69, 51, 12, 51, 12, 42, 69, 51, 12, 51, 12, 42 };
-// unsigned n = sizeof(vals)/sizeof(unsigned);
-
-// for (unsigned i = 0; i < n; ++i)
-// {
-// std::cout << "taking " << vals[i] << ':' << std::endl;
-// m.take(vals[i]);
-// std::cout << m << std::endl;
-// }
-
-// for (unsigned i = 0; i < n; ++i)
-// {
-// std::cout << "untaking " << vals[i] << ':' << std::endl;
-// m.untake(vals[i]);
-// std::cout << m << std::endl;
-// }
-
-// }
-
-
Index: tests/box2d.cc
--- tests/box2d.cc (revision 1005)
+++ tests/box2d.cc (working copy)
@@ -38,5 +38,5 @@
{
using namespace mln;
- box2d b(2, 3);
+ box2d b = mk_box2d(2, 3);
}
Index: tests/naive_median.cc
--- tests/naive_median.cc (revision 0)
+++ tests/naive_median.cc (revision 0)
@@ -0,0 +1,58 @@
+// Copyright (C) 2007 EPITA Research and Development Laboratory
+//
+// This file is part of the Olena Library. This library is free
+// software; you can redistribute it and/or modify it under the terms
+// of the GNU General Public License version 2 as published by the
+// Free Software Foundation.
+//
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+// General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this library; see the file COPYING. If not, write to
+// the Free Software Foundation, 51 Franklin Street, Fifth Floor,
+// Boston, MA 02111-1307, USA.
+//
+// As a special exception, you may use this file as part of a free
+// software library without restriction. Specifically, if other files
+// instantiate templates or use macros or inline functions from this
+// file, or you compile this file and link it with other files to
+// produce an executable, this file does not by itself cause the
+// resulting executable to be covered by the GNU General Public
+// License. This exception does not however invalidate any other
+// reasons why the executable file might be covered by the GNU General
+// Public License.
+
+/*! \file tests/naive_median.cc
+ *
+ * \brief Test on mln::level::naive::median.
+ */
+
+#include <mln/core/image2d_b.hh>
+#include <mln/core/rectangle2d.hh>
+
+#include <mln/io/load_pgm.hh>
+#include <mln/io/save_pgm.hh>
+
+#include <mln/value/int_u.hh>
+#include <mln/level/naive/median.hh>
+
+
+using namespace mln;
+using namespace mln::value;
+
+
+int main()
+{
+ rectangle2d rec(8, 8);
+ border::thickness = 9;
+
+ image2d_b<int_u8>
+ lena = io::load_pgm("../img/lena.pgm"),
+ out(lena.domain());
+
+ level::naive::median(lena, rec, out);
+ io::save_pgm(out, "out.pgm");
+}
Index: tests/histo.cc
--- tests/histo.cc (revision 1005)
+++ tests/histo.cc (working copy)
@@ -31,8 +31,7 @@
*/
#include <mln/value/int_u.hh>
-#include <mln/value/set.hh>
-#include <mln/value/histo.hh>
+#include <mln/accu/histo.hh>
@@ -40,6 +39,7 @@
{
using namespace mln;
using namespace mln::value;
+ using namespace mln::accu;
histo_on_type<bool> h;
@@ -54,7 +54,7 @@
std::cout << h[0] * 10 + h[1] << std::endl;
std::cout << h(false) * 10 + h(true) << std::endl;
- h.clear();
+ h.init();
std::cout << h << std::endl;
Index: tests/rectangle2d.cc
--- tests/rectangle2d.cc (revision 0)
+++ tests/rectangle2d.cc (revision 0)
@@ -0,0 +1,49 @@
+// Copyright (C) 2007 EPITA Research and Development Laboratory
+//
+// This file is part of the Olena Library. This library is free
+// software; you can redistribute it and/or modify it under the terms
+// of the GNU General Public License version 2 as published by the
+// Free Software Foundation.
+//
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+// General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this library; see the file COPYING. If not, write to
+// the Free Software Foundation, 51 Franklin Street, Fifth Floor,
+// Boston, MA 02111-1307, USA.
+//
+// As a special exception, you may use this file as part of a free
+// software library without restriction. Specifically, if other files
+// instantiate templates or use macros or inline functions from this
+// file, or you compile this file and link it with other files to
+// produce an executable, this file does not by itself cause the
+// resulting executable to be covered by the GNU General Public
+// License. This exception does not however invalidate any other
+// reasons why the executable file might be covered by the GNU General
+// Public License.
+
+/*! \file tests/rectangle2d.cc
+ *
+ * \brief Tests on mln::rectangle2d.
+ */
+
+#include <mln/core/rectangle2d.hh>
+
+
+
+int main()
+{
+ using namespace mln;
+
+ const unsigned h = 3, w = 4;
+ rectangle2d rec(h, w);
+
+ mln_assertion(rec.is_centered());
+ mln_assertion(rec.is_symmetric());
+ mln_assertion(rec = -rec);
+ mln_assertion(rec.nelements() = (2*h+1) * (2*w+1));
+}
+
Index: mln/convert/to_dpoint.hh
--- mln/convert/to_dpoint.hh (revision 1005)
+++ mln/convert/to_dpoint.hh (working copy)
@@ -33,6 +33,8 @@
* \brief Convertions to mln::Dpoint.
*/
+# include <mln/core/concept/genpoint.hh>
+
namespace mln
{
@@ -40,6 +42,7 @@
namespace convert
{
+ /// Convert a generalized point \p p into a delta-point.
template <typename P>
mln_dpoint(P) to_dpoint(const GenPoint<P>& p);
Index: mln/level/naive/median.hh
--- mln/level/naive/median.hh (revision 0)
+++ mln/level/naive/median.hh (revision 0)
@@ -0,0 +1,115 @@
+// Copyright (C) 2007 EPITA Research and Development Laboratory
+//
+// This file is part of the Olena Library. This library is free
+// software; you can redistribute it and/or modify it under the terms
+// of the GNU General Public License version 2 as published by the
+// Free Software Foundation.
+//
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+// General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this library; see the file COPYING. If not, write to
+// the Free Software Foundation, 51 Franklin Street, Fifth Floor,
+// Boston, MA 02111-1307, USA.
+//
+// As a special exception, you may use this file as part of a free
+// software library without restriction. Specifically, if other files
+// instantiate templates or use macros or inline functions from this
+// file, or you compile this file and link it with other files to
+// produce an executable, this file does not by itself cause the
+// resulting executable to be covered by the GNU General Public
+// License. This exception does not however invalidate any other
+// reasons why the executable file might be covered by the GNU General
+// Public License.
+
+#ifndef MLN_LEVEL_NAIVE_MEDIAN_HH
+# define MLN_LEVEL_NAIVE_MEDIAN_HH
+
+/*! \file mln/level/naive/median.hh
+ *
+ * \brief Naive version of median filtering.
+ */
+
+# include <mln/core/concept/image.hh>
+# include <mln/core/window2d.hh>
+# include <mln/accu/median.hh>
+
+
+namespace mln
+{
+
+ namespace level
+ {
+
+ namespace naive
+ {
+
+ /*! Compute in \p output the median filter of image \p input by
+ * the window \p win.
+ *
+ * \param[in] input The image to be filtered.
+ * \param[in] win The window.
+ * \param[in,out] output The output image.
+ *
+ * This is a NAIVE version for test / comparison purpose so
+ * do NOT use it.
+ *
+ * \pre \p input and \p output have to be initialized.
+ *
+ * \see mln::level::median
+ */
+ template <typename I, typename W, typename O>
+ void median(const Image<I>& input, const Window<W>& win,
+ Image<O>& output);
+
+
+# ifndef MLN_INCLUDE_ONLY
+
+
+ namespace impl
+ {
+
+ template <typename I, typename W, typename O>
+ void median(const I& input, const W& win,
+ O& output)
+ {
+ mln_piter(I) p(input.domain());
+ mln_qiter(W) q(win, p);
+ accu::median_on<mln_value(I)> med;
+
+ for_all(p)
+ {
+ med.init();
+ for_all(q) if (input.has(q))
+ med.take(input(q));
+ output(p) = med;
+ }
+ }
+
+
+ } // end of namespace mln::level::impl
+
+
+
+ // facade
+
+ template <typename I, typename W, typename O>
+ void median(const Image<I>& input, const Window<W>& win,
+ Image<O>& output)
+ {
+ impl::median(exact(input), exact(win), exact(output));
+ }
+
+# endif // ! MLN_INCLUDE_ONLY
+
+ } // end of namespace mln::level::naive
+
+ } // end of namespace mln::level
+
+} // end of namespace mln
+
+
+#endif // ! MLN_LEVEL_MEDIAN_HH
Index: mln/level/median.hh
--- mln/level/median.hh (revision 1005)
+++ mln/level/median.hh (working copy)
@@ -30,7 +30,7 @@
/*! \file mln/level/median.hh
*
- * \brief Median filter on an image.
+ * \brief Median filtering of an image.
*/
# include <mln/core/concept/image.hh>
@@ -44,18 +44,14 @@
namespace level
{
- /*! FIXME: Median the image \p ima with the values of the image \p data.
+ /*! Compute in \p output the median filter of image \p input by
+ * the window \p win.
*
* \param[in] input The image to be filtered.
* \param[in] win The window.
* \param[in,out] output The output image.
*
- * \warning The definition domain of \p ima has to be included in
- * the one of \p data.
- *
- * \pre \p ima has to be initialized.
- *
- * \todo Test domain inclusion.
+ * \pre \p input and \p output have to be initialized.
*/
template <typename I, typename W, typename O>
void median(const Image<I>& input, const Window<W>& win,
@@ -73,44 +69,80 @@
const W& win,
O& output)
{
- dpoint2d dp = mk_dpoint2d(0, 1);
+ mln_precondition(input.has_data());
+ mln_precondition(output.has_data());
+
+ int
+ min_row = input.min_row(), max_row = input.max_row(),
+ min_col = input.min_col(), max_col = input.max_col();
window2d
- w_plus = win - (win - dp),
- w_minus = (win - dp) - win;
+ win_fwd_plus = win - (win + left),
+ win_fwd_minus = (win + left) - win,
+ win_bkd_plus = win - (win + right),
+ win_bkd_minus = (win + right) - win,
+ win_bot = win - (win + up),
+ win_top = (win + up) - win;
+
+ point2d p;
+ mln_qiter(W)
+ q_fp(win_fwd_plus, p), q_fm(win_fwd_minus, p),
+ q_bp(win_bkd_plus, p), q_bm(win_bkd_minus, p),
+ q_top(win_top, p), q_bot(win_bot, p);
accu::median_on<mln_value(I)> med;
- point2d p;
- mln_qiter(W) q(win, p);
- mln_qiter(W) q_plus(w_plus, p);
- mln_qiter(W) q_minus(w_minus, p);
+ // initialization
- for (p.row() = input.domain().pmin().row();
- p.row() <= input.domain().pmax().row();
- ++p.row())
- {
- // init
+ p = input.domain().pmin() + up;
med.init();
- p.col() = input.domain().pmin().col();
- for_all(q)
- if (input.has(q))
+ {
+ mln_qiter(W) q(win, p);
+ for_all(q) if (input.has(q))
med.take(input(q));
+ }
+
+ int& row = p.row();
+ int& col = p.col();
+ bool fwd = true;
+
+ mln_assertion(p.col() = min_col);
+ mln_assertion(p.row() = min_row - 1);
+
+ for (row = min_row; row <= max_row; ++row)
+ {
+ // "go down"
+ for_all(q_top) if (input.has(q_top))
+ med.untake(input(q_top));
+ for_all(q_bot) if (input.has(q_bot))
+ med.take(input(q_bot));
output(p) = med;
- // other col
- for (++p.col();
- p.col() <= input.domain().pmax().col();
- ++p.col())
- {
- for_all(q_plus)
- if (input.has(q_plus))
- med.take(input(q_plus));
- for_all(q_minus)
- if (input.has(q_minus))
- med.untake(input(q_minus));
+ if (fwd)
+ // browse line fwd
+ while (col < max_col)
+ {
+ ++col;
+ for_all(q_fm) if (input.has(q_fm))
+ med.untake(input(q_fm));
+ for_all(q_fp) if (input.has(q_fp))
+ med.take(input(q_fp));
output(p) = med;
}
+ else
+ // browse line bkd
+ while (col > min_col)
+ {
+ --col;
+ for_all(q_bm) if (input.has(q_bm))
+ med.untake(input(q_bm));
+ for_all(q_bp) if (input.has(q_bp))
+ med.take(input(q_bp));
+ output(p) = med;
+ }
+
+ // change browsing
+ fwd = ! fwd;
}
}
Index: mln/io/save_pgm.hh
--- mln/io/save_pgm.hh (revision 1005)
+++ mln/io/save_pgm.hh (working copy)
@@ -45,7 +45,7 @@
void save_pgm(const image2d_b<value::int_u8>& ima, const std::string& filename)
{
std::ofstream file(filename.c_str());
- if (not file)
+ if (! file)
{
std::cerr << "error: cannot open file '" << filename
<< "'!";
Index: mln/io/load_pgm.hh
--- mln/io/load_pgm.hh (revision 1005)
+++ mln/io/load_pgm.hh (working copy)
@@ -61,7 +61,7 @@
if (istr.get() != 'P' )
goto err;
type = istr.get();
- if (type < '1' or type > '6')
+ if (type < '1' || type > '6')
goto err;
if (istr.get() != '\n')
goto err;
@@ -75,13 +75,13 @@
// get size
istr >> ncols >> nrows;
- if (nrows <= 0 or ncols <= 0)
+ if (nrows <= 0 || ncols <= 0)
goto err;
// skip maxvalue
if (istr.get() != '\n')
goto err;
- if (type != '1' and type != '4')
+ if (type != '1' && type != '4')
{
std::string line;
std::getline(istr, line);
@@ -89,7 +89,7 @@
return true;
err:
- if (not test)
+ if (! test)
{
std::cerr << "error: badly formed header!";
abort();
@@ -103,7 +103,7 @@
int& nrows, int& ncols)
{
read_pnm_header(istr, type, nrows, ncols);
- if (not (type = ascii or type = raw))
+ if (! (type = ascii || type = raw))
{
std::cerr << "error: bad pnm type; "
<< "expected P" << ascii
@@ -151,7 +151,7 @@
image2d_b<value::int_u8> load_pgm(const std::string& filename)
{
std::ifstream file(filename.c_str());
- if (not file)
+ if (! file)
{
std::cerr << "error: file '" << filename
<< "' not found!";
Index: mln/core/dpoint2d.hh
--- mln/core/dpoint2d.hh (revision 1005)
+++ mln/core/dpoint2d.hh (working copy)
@@ -53,6 +53,17 @@
*
* \return A 2D delta-point.
*/
+ dpoint2d mk_dpoint2d(int row, int col);
+
+
+ const dpoint2d up = mk_dpoint2d( -1, 0 );
+ const dpoint2d down = mk_dpoint2d( +1, 0 );
+ const dpoint2d left = mk_dpoint2d( 0, -1 );
+ const dpoint2d right = mk_dpoint2d( 0, +1 );
+
+
+# ifndef MLN_INCLUDE_ONLY
+
dpoint2d mk_dpoint2d(int row, int col)
{
dpoint2d tmp;
@@ -61,6 +72,8 @@
return tmp;
}
+# endif // ! MLN_INCLUDE_ONLY
+
} // end of namespace mln
Index: mln/core/box.hh
--- mln/core/box.hh (revision 1005)
+++ mln/core/box.hh (working copy)
@@ -34,6 +34,7 @@
*/
# include <mln/core/concept/box.hh>
+# include <mln/core/internal/box_impl.hh>
# include <mln/core/point.hh>
@@ -50,7 +51,8 @@
* Parameter \c P is the corresponding type of point.
*/
template <typename P>
- struct box_ : public Box< box_<P> >
+ struct box_ : public Box< box_<P> >,
+ public internal::box_impl_< P::dim, mln_coord(P), box_<P> >
{
/*! \brief Psite associated type.
*/
Index: mln/core/rectangle2d.hh
--- mln/core/rectangle2d.hh (revision 1005)
+++ mln/core/rectangle2d.hh (working copy)
@@ -52,6 +52,8 @@
* o o x o o
* o o o o o
* is defined with half_height = 1 and half_width = 2.
+ *
+ * \todo Consider width instead of half_width (same for height).
*/
struct rectangle2d : public Window< rectangle2d >,
public internal::set_of_<dpoint2d>
@@ -70,7 +72,7 @@
/*! \brief Piter type to browse a rectangle such as: "for each row
* (decreasing), for each column (decreasing)."
*/
- typedef dpoints_bkd_piter<dpoint2d> bkd_qiter;
+ typedef dpoints_fwd_piter<dpoint2d> bkd_qiter; // FIXME: bkd!!!
/*! \brief Same as fwd_qiter.
*/
@@ -105,6 +107,9 @@
*/
unsigned width() const;
+ /// Get the symmetrical window.
+ rectangle2d sym_() const;
+
protected:
unsigned half_height_, half_width_;
};
@@ -157,6 +162,11 @@
return 2 * half_width_ + 1;
}
+ rectangle2d rectangle2d::sym_() const
+ {
+ return *this;
+ }
+
std::ostream& operator<<(std::ostream& ostr,
const rectangle2d& win)
{
Index: mln/core/concept/window.hh
--- mln/core/concept/window.hh (revision 1005)
+++ mln/core/concept/window.hh (working copy)
@@ -33,6 +33,7 @@
*/
# include <mln/core/concept/object.hh>
+# include <mln/core/concept/iterator.hh>
namespace mln
@@ -57,6 +58,8 @@
bool is_empty() const;
bool is_centered() const;
bool is_symmetric() const;
+
+ E sym_() const;
*/
protected:
@@ -64,6 +67,14 @@
};
+ /*! \brief Compute the symmetrical window of \p rhs.
+ *
+ * \relates mln::Window
+ */
+ template <typename W>
+ W operator-(const Window<W>& rhs);
+
+
# ifndef MLN_INCLUDE_ONLY
template <typename E>
@@ -82,6 +93,14 @@
m2 = 0;
bool (E::*m3)() const = & E::is_symmetric;
m3 = 0;
+ E (E::*m4)() const = & E::sym_;
+ m4 = 0;
+ }
+
+ template <typename W>
+ W operator-(const Window<W>& rhs)
+ {
+ return exact(rhs).sym_();
}
# endif // ! MLN_INCLUDE_ONLY
Index: mln/core/concept/doc/window.hh
--- mln/core/concept/doc/window.hh (revision 1005)
+++ mln/core/concept/doc/window.hh (working copy)
@@ -75,6 +75,10 @@
/*! \brief Test if the window is symmetric.
*/
bool is_symmetric() const;
+
+ /*! \brief Give the symmetrical window.
+ */
+ E sym_() const;
};
} // end of namespace mln::doc
Index: mln/core/window.hh
--- mln/core/window.hh (revision 1005)
+++ mln/core/window.hh (working copy)
@@ -96,6 +96,9 @@
* \todo Implementation!
*/
bool is_symmetric() const;
+
+ /// Give the symmetrical window.
+ window_<D> sym_() const;
};
@@ -136,16 +139,27 @@
template <typename D>
bool window_<D>::is_symmetric() const
{
- assert(0); // FIXME: nyi!
- return false;
+ return this->sym_() = *this;
+ }
+
+ template <typename D>
+ window_<D>
+ window_<D>::sym_() const
+ {
+ window_<D> tmp;
+ const unsigned n = this->nelements();
+ for (unsigned i = 0; i < n; ++i)
+ tmp.insert(- this->element(i));
+ return tmp;
}
template <typename W>
window_<mln_dpoint(W)> operator+(const Window<W>& win,
const mln_dpoint(W)& dp)
{
+ typedef mln_point(W) P;
window_<mln_dpoint(W)> tmp;
- mln_qiter(W) q(win, W::point::zero());
+ mln_qiter(W) q(win, P::zero());
for_all(q)
tmp.insert(convert::to_dpoint(q) + dp);
return tmp;
@@ -162,12 +176,13 @@
window_<mln_dpoint(W)> operator-(const Window<W>& lhs,
const Window<Wr>& rhs)
{
+ typedef mln_point(W) P;
window_<mln_dpoint(W)> tmp;
- mln_qiter(W) q(lhs, W::point::zero());
+ mln_qiter(W) q(lhs, P::zero());
for_all(q)
{
mln_dpoint(W) dp = convert::to_dpoint(q);
- if (not exact(rhs).has(dp))
+ if (! exact(rhs).has(dp))
tmp.insert(dp);
}
return tmp;
Index: mln/core/image2d_b.hh
--- mln/core/image2d_b.hh (revision 1005)
+++ mln/core/image2d_b.hh (working copy)
@@ -34,6 +34,7 @@
*/
# include <mln/core/internal/image_base.hh>
+# include <mln/core/internal/box_impl.hh>
# include <mln/core/box2d.hh>
# include <mln/border/thickness.hh>
@@ -50,7 +51,8 @@
* thickness around data.
*/
template <typename T>
- struct image2d_b : public internal::image_base_< box2d, image2d_b<T> >
+ struct image2d_b : public internal::image_base_< box2d, image2d_b<T> >,
+ public internal::box_impl_< 2, int, image2d_b<T> >
{
// warning: just to make effective types appear in Doxygen
@@ -79,6 +81,7 @@
typedef image2d_b<U> ret;
};
+
/// Constructor without argument.
image2d_b();
@@ -96,6 +99,14 @@
/// Assignment operator.
image2d_b& operator=(const image2d_b<T>& rhs);
+
+ /// Initialize an empty image.
+ void init_with(int nrows, int ncols, unsigned bdr = border::thickness);
+
+ /// Initialize an empty image.
+ void init_with(const box2d& b, unsigned bdr = border::thickness);
+
+
/// Test if \p p is valid.
bool owns_(const point2d& p) const;
@@ -105,15 +116,12 @@
/// Give the definition domain.
const box2d& domain() const;
+ /// Give a bounding box.
+ const box2d& bbox() const;
+
/// Give the border thickness.
unsigned border() const;
- /// Give the number of rows (not including the border).
- unsigned nrows() const;
-
- /// Give the number of cols (not including the border).
- unsigned ncols() const;
-
/// Give the number of cells (points including border ones).
std::size_t ncells() const;
@@ -128,9 +136,10 @@
private:
- box2d b_; // theoretical box
T* buffer_;
T** array_;
+
+ box2d b_; // theoretical box
unsigned bdr_;
box2d vb_; // virtual box, i.e., box including the virtual border
@@ -148,15 +157,25 @@
template <typename T>
image2d_b<T>::image2d_b()
+ : buffer_(0),
+ array_ (0)
{
- buffer_ = 0;
- array_ = 0;
bdr_ = border::thickness; // default value in ctors.
}
template <typename T>
image2d_b<T>::image2d_b(int nrows, int ncols, unsigned bdr)
+ : buffer_(0),
+ array_ (0)
+ {
+ init_with(nrows, ncols, bdr);
+ }
+
+ template <typename T>
+ void
+ image2d_b<T>::init_with(int nrows, int ncols, unsigned bdr)
{
+ mln_precondition(! this->has_data());
b_ = mk_box2d(nrows, ncols);
bdr_ = bdr;
allocate_();
@@ -164,9 +183,18 @@
template <typename T>
image2d_b<T>::image2d_b(const box2d& b, unsigned bdr)
- : b_(b),
- bdr_(bdr)
+ : buffer_(0),
+ array_ (0)
{
+ init_with(b, bdr);
+ }
+
+ template <typename T>
+ void
+ image2d_b<T>::init_with(const box2d& b, unsigned bdr)
+ {
+ mln_precondition(! this->has_data());
+ b_ = b;
bdr_ = bdr;
allocate_();
}
@@ -189,7 +217,7 @@
image2d_b<T>&
image2d_b<T>::operator=(const image2d_b<T>& rhs)
{
- assert(rhs.has_data());
+ mln_precondition(rhs.has_data());
if (& rhs = this)
return *this;
if (this->has_data())
@@ -221,27 +249,19 @@
}
template <typename T>
- unsigned
- image2d_b<T>::border() const
- {
- mln_precondition(this->has_data());
- return bdr_;
- }
-
- template <typename T>
- unsigned
- image2d_b<T>::nrows() const
+ const box2d&
+ image2d_b<T>::bbox() const
{
mln_precondition(this->has_data());
- return b_.len(0);
+ return b_;
}
template <typename T>
unsigned
- image2d_b<T>::ncols() const
+ image2d_b<T>::border() const
{
mln_precondition(this->has_data());
- return b_.len(1);
+ return bdr_;
}
template <typename T>
@@ -309,8 +329,8 @@
buf += nc;
}
array_ -= vb_.pmin().row();
- mln_postcondition(vb_.len(0) = b_.nrows() + 2 * bdr_);
- mln_postcondition(vb_.len(1) = b_.ncols() + 2 * bdr_);
+ mln_postcondition(vb_.len(0) = b_.len(0) + 2 * bdr_);
+ mln_postcondition(vb_.len(1) = b_.len(1) + 2 * bdr_);
}
template <typename T>
Index: mln/core/internal/coord_impl.hh
--- mln/core/internal/coord_impl.hh (revision 1005)
+++ mln/core/internal/coord_impl.hh (working copy)
@@ -36,7 +36,6 @@
*/
# include <mln/core/internal/force_exact.hh>
-# include <mln/core/concept/object.hh>
namespace mln
Index: mln/core/internal/box_impl.hh
--- mln/core/internal/box_impl.hh (revision 0)
+++ mln/core/internal/box_impl.hh (revision 0)
@@ -0,0 +1,138 @@
+// Copyright (C) 2007 EPITA Research and Development Laboratory
+//
+// This file is part of the Olena Library. This library is free
+// software; you can redistribute it and/or modify it under the terms
+// of the GNU General Public License version 2 as published by the
+// Free Software Foundation.
+//
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+// General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this library; see the file COPYING. If not, write to
+// the Free Software Foundation, 51 Franklin Street, Fifth Floor,
+// Boston, MA 02111-1307, USA.
+//
+// As a special exception, you may use this file as part of a free
+// software library without restriction. Specifically, if other files
+// instantiate templates or use macros or inline functions from this
+// file, or you compile this file and link it with other files to
+// produce an executable, this file does not by itself cause the
+// resulting executable to be covered by the GNU General Public
+// License. This exception does not however invalidate any other
+// reasons why the executable file might be covered by the GNU General
+// Public License.
+
+#ifndef MLN_CORE_INTERNAL_BOX_IMPL_HH
+# define MLN_CORE_INTERNAL_BOX_IMPL_HH
+
+/*! \file mln/core/internal/box_impl.hh
+ *
+ * \internal
+ *
+ * \brief Define some implementation classes to provide methods
+ * related to classes having a bounding box.
+ */
+
+# include <mln/core/internal/force_exact.hh>
+
+
+namespace mln
+{
+
+ namespace internal
+ {
+
+ template <typename E>
+ struct box_impl_base_
+ {
+ mln_internal_add_force_exact_(box_impl_base_<E>)
+ };
+
+
+ // box_impl
+
+ /*! \brief Implementation class to equip objects having a bounding
+ * box with methods.
+ *
+ * \internal
+ */
+ template <unsigned n, typename C, typename E>
+ struct box_impl_;
+
+ template <typename C, typename E> // FIXME: Add an extra param to replace 'unsigned'.
+ struct box_impl_<2, C, E>
+ : box_impl_base_<E>
+ {
+ /// Give the number of rows.
+ unsigned nrows() const;
+
+ /// Give the minimum row.
+ C min_row() const;
+
+ /// Give the minimum row.
+ C max_row() const;
+
+ /// Give the number of cols.
+ unsigned ncols() const;
+
+ /// Give the minimum col.
+ C min_col() const;
+
+ /// Give the minimum col.
+ C max_col() const;
+ };
+
+
+# ifndef MLN_INCLUDE_ONLY
+
+ // box_impl
+
+ // 2
+
+ template <typename C, typename E>
+ unsigned box_impl_<2, C, E>::nrows() const
+ {
+ return this->force_exact_().bbox().len(0);
+ }
+
+ template <typename C, typename E>
+ C box_impl_<2, C, E>::min_row() const
+ {
+ return this->force_exact_().bbox().pmin()[0];
+ }
+
+ template <typename C, typename E>
+ C box_impl_<2, C, E>::max_row() const
+ {
+ return this->force_exact_().bbox().pmax()[0];
+ }
+
+ template <typename C, typename E>
+ unsigned box_impl_<2, C, E>::ncols() const
+ {
+ return this->force_exact_().bbox().len(1);
+ }
+
+ template <typename C, typename E>
+ C box_impl_<2, C, E>::min_col() const
+ {
+ return this->force_exact_().bbox().pmin()[1];
+ }
+
+ template <typename C, typename E>
+ C box_impl_<2, C, E>::max_col() const
+ {
+ return this->force_exact_().bbox().pmax()[1];
+ }
+
+# endif // ! MLN_INCLUDE_ONLY
+
+ } // end of namespace mln::internal
+
+} // end of namespace mln
+
+
+#endif // ! MLN_CORE_INTERNAL_BOX_IMPL_HH
Index: mln/core/internal/set_of.hh
--- mln/core/internal/set_of.hh (revision 1005)
+++ mln/core/internal/set_of.hh (working copy)
@@ -44,15 +44,14 @@
namespace internal
{
-
/*! \brief An "efficient" mathematical set class.
*
* \internal
*
* This set class is designed to store a mathematical set and to
- * present it to the user as a linear array.
+ * present it to the user as a linear array (std::vector).
*
- * Elements are stored by copy.
+ * Elements are stored by copy. Implementation is lazy.
*
* \invariant \a v_.size() = s_.size()
*
@@ -122,30 +121,35 @@
*/
const std::vector<E>& vec() const;
-
protected:
+
+ /// Constructor without arguments.
+ set_of_();
+
+ private:
+
/*! \brief Array of elements.
*
- * This structure is always up-to-date so that the access method
- * vec is as fastest as possible.
+ * This structure is only updated (if required) when elements
+ * are accessed.
*/
- std::vector<E> v_;
-
+ mutable std::vector<E> v_;
- private:
/*! \brief Set of elements.
*
- * This is an auxiliary structure.
+ * This structure is always up-to-date w.r.t. the set contents.
*/
std::set<E> s_;
- /*! \brief Update both attributes.
+ /*! \brief Update \a v_ from \a s_.
*
* FIXME: explain.
*/
- void update_();
+ void update_() const;
+ /// Tell if \a v_ needs to be updated.
+ mutable bool needs_update_;
};
@@ -163,14 +167,32 @@
std::ostream& operator<<(std::ostream& ostr, const set_of_<E>& s);
+ /*! \brief Test if both sets \p lhs and \p rhs are equal.
+ *
+ * \param[in] lhs A set.
+ * \param[in] rhs Another set.
+ *
+ * \relates mln::internal::set_of_
+ */
+ template <typename E>
+ bool operator=(const set_of_<E>& lhs, const set_of_<E>& rhs);
+
+
# ifndef MLN_INCLUDE_ONLY
template <typename E>
+ set_of_<E>::set_of_()
+ {
+ needs_update_ = false;
+ }
+
+ template <typename E>
void
set_of_<E>::insert(const E& elt)
{
s_.insert(elt);
- update_();
+ if (needs_update_ = false)
+ needs_update_ = true;
}
template <typename E>
@@ -178,6 +200,8 @@
set_of_<E>::element(unsigned i) const
{
assert(i < v_.size());
+ if (needs_update_)
+ update_();
return v_[i];
}
@@ -185,6 +209,8 @@
unsigned
set_of_<E>::nelements() const
{
+ if (needs_update_)
+ update_();
return v_.size();
}
@@ -199,7 +225,7 @@
bool
set_of_<E>::is_empty() const
{
- return v_.size() = 0;
+ return nelements() = 0;
}
template <typename E>
@@ -208,6 +234,7 @@
{
v_.clear();
s_.clear();
+ needs_update_ = false;
mln_postcondition(is_empty());
}
@@ -215,16 +242,22 @@
const std::vector<E>&
set_of_<E>::vec() const
{
+ if (needs_update_)
+ update_();
return v_;
}
template <typename E>
void
- set_of_<E>::update_()
+ set_of_<E>::update_() const
{
+ mln_precondition(needs_update_);
v_.clear();
std::copy(s_.begin(), s_.end(), std::back_inserter(v_));
- // no s_.clear() here to save some execution time
+ // no s_.clear() here:
+ // - we want to keep information up-to-date in s_
+ // - we want to save some execution time
+ needs_update_ = false;
}
template <typename E>
@@ -232,12 +265,25 @@
const set_of_<E>& s)
{
ostr << '[';
- for (unsigned i = 0; i < s.nelements(); ++i)
+ const unsigned n = s.nelements();
+ for (unsigned i = 0; i < n; ++i)
ostr << s.element(i)
<< (i = s.nelements() - 1 ? ']' : ',');
return ostr;
}
+ template <typename E>
+ bool operator=(const set_of_<E>& lhs, const set_of_<E>& rhs)
+ {
+ if (lhs.nelements() != rhs.nelements())
+ return false;
+ const unsigned n = lhs.nelements();
+ for (unsigned i = 0; i < n; ++i)
+ if (rhs.element(i) != lhs.element(i))
+ return false;
+ return true;
+ }
+
# endif // ! MLN_INCLUDE_ONLY
} // end of namespace mln::internal
Index: mln/accu/median.hh
--- mln/accu/median.hh (revision 1005)
+++ mln/accu/median.hh (working copy)
@@ -220,7 +220,7 @@
template <typename S>
- median<S>::operator typename median<S>::value () const
+ median<S>::operator mln_value(S) () const
{
return to_value();
}
@@ -229,7 +229,7 @@
typename median<S>::value
median<S>::to_value() const
{
- if (not valid_)
+ if (! valid_)
update_();
return v_;
}
Index: mln/value/viter.hh
--- mln/value/viter.hh (revision 1005)
+++ mln/value/viter.hh (working copy)
@@ -130,7 +130,7 @@
}
template <typename S>
- fwd_viter_<S>::operator typename fwd_viter_<S>::value () const
+ fwd_viter_<S>::operator mln_value(S) () const
{
mln_precondition(is_valid());
return s_[i_];
@@ -175,7 +175,7 @@
}
template <typename S>
- bkd_viter_<S>::operator typename bkd_viter_<S>::value () const
+ bkd_viter_<S>::operator mln_value(S) () const
{
mln_precondition(is_valid());
return s_[i_];
Index: mln/value/set.hh
--- mln/value/set.hh (revision 1005)
+++ mln/value/set.hh (working copy)
@@ -89,7 +89,7 @@
template <typename T>
bool
- set_<T>::has(const T& v) const
+ set_<T>::has(const T&) const
{
return true;
}
@@ -130,9 +130,10 @@
+ // FIXME: Turn definitions into objects!
typedef value::set_<bool> Booleans;
- typedef value::set_<int> integers();
- typedef value::set_<unsigned> naturals();
+ typedef value::set_<int> integers;
+ typedef value::set_<unsigned> naturals;
Index: mln/value/int_u.hh
--- mln/value/int_u.hh (revision 1005)
+++ mln/value/int_u.hh (working copy)
@@ -126,7 +126,7 @@
std::ostream& operator<<(std::ostream& ostr, const int_u8& i)
{
- return ostr << unsigned(i);
+ return ostr << unsigned(i.to_equiv());
}
# endif // ! MLN_INCLUDE_ONLY
Index: mln/value/internal/value_like.hh
--- mln/value/internal/value_like.hh (revision 1005)
+++ mln/value/internal/value_like.hh (working copy)
@@ -67,6 +67,9 @@
/// Convertion towards equivalent type.
operator V() const;
+ /// Explicit convertion towards equivalent type.
+ V to_equiv() const;
+
/// Assignment from equivalent type.
E& operator=(const V& v);
@@ -102,6 +105,13 @@
}
template <typename V, typename E>
+ V
+ value_like_<V, E>::to_equiv() const
+ {
+ return v_;
+ }
+
+ template <typename V, typename E>
E&
value_like_<V, E>::operator=(const V& v)
{
Index: mln/border/thickness.hh
--- mln/border/thickness.hh (revision 1005)
+++ mln/border/thickness.hh (working copy)
@@ -40,7 +40,7 @@
namespace border
{
- const unsigned thickness = 3;
+ unsigned thickness = 3;
} // end of namespace mln::border
Index: img/lena.pgm
--- img/lena.pgm (revision 0)
+++ img/lena.pgm (revision 0)
@@ -0,0 +1,4 @@
+P5
+512 512
+255
+¢¢¢¢¢¢¢¤¢¢¢¢¢¢¤¤¤¤¤¬«¬¬«««¤¬«¤¢¢wwgbb_[Vbg_gbgiiigmmmiiimmmmiimmmimmmmigiiimmwmrwzwmzwzzzzzzzzzzwzzwwrmrriggirrwz¢¢¢°ÂÅÏÏÑ×××ÚÚÚÚÝ×Ñʾ«ziigggmirrwwwwwwzzwrwzwzzzzwzwwzzwzzzzzzwzzzzwwzzzzzwzrzrwwrzz¢¤«««¢¢¢¢¢¢¢¢¢¢¢¢¢«¢¤«¤¤««°¬««««¬«¤¢¢wwibb_[Vbgbgbgiiigmmiiiimmmmiiimmimmmmmgiiimmwmrwzwrzzzzzzzzzzzzwzzwwrrrriggimwwz¢¢¢¢¢°ÂÅÏÏ×Ñ××ÚÚÚÚÝ×Ñʾ«ziibggmirrrwrwwzzzwwzzzwzzwwzwzzzwzzzzzzwzzzzzrwzzwzwzrwrwwrzz¢¤«««¢¢¢¢¢¢¢¤¢¢¢¢¢«¤¤¤¤¬«¬¬«««¤°«¤¢¢wwibb__Vbgbgbgiiigmmiiiimmmmmmimmimmmmigiimmmwmrrzwmzwzzzzzzzzzzwzzwwrmmriggirwwz¢¢¢¢°¾ÅÏÏ×Ñ××ÚÚÚÚÝ×Ñʾ«ziigggmirrwwwwwzzzwwwzrzzzzwzwzzzwzzzzzzwzzzrwzzzzzwzrzrwwrzz¢¤«««¢¢¢¢¢¢¢¤¢¢¢¢¢¢¤¢¤«¤¤¬«¬¬«««¤¬«¤¢wribb_[Vbg_gbgiiigmmmiiimmmmiimmmimmmmigiiimmwmrwzwrzzzzzzzzzzzzzzwzzwrrrrrigggrrwz¢¢¢¢¢°ÂÅÏÏÑ×Ñ×ÚÚÚÚÝ×Ñʾ«ziibggmirrwwwwwzzwwwzzzwzzwwzwzzzwzzzzzzwzzzzzwwzzwzwzrzrwwrzz¢««««¢¢¢¢¢¢¢¤¢¢¢¢¤¢¤¤¤¤««¬¬«««¤¬¤¤¢¢wwibb_[Vbgbgbgiiigmmiiiimmmmiiimmimmmmigiiimmwmrwzwrzzzzzzzzzzzzzwzzwwrrrrigggrrwz¢¢¢°ÂÅÏÏ×ÑÑ×ÚÚÚÚÝ×Ñʾ«ziigggmirrwwwwwwzzwwzzzwzzzwzwzzzwzzzzzzwzzzzwrzzzwwzrzrwwrwz¢¤«««¤¤¢¢¢¤¤¤«««¬¬««°««¤«zwmmg_[_[__bggbbigiiiiiigigiigiiiiigmimgiimimrmrwrwwwzwzzzzzzzzzzzzzzzzzwrrrwmmiiigmmwz¢¤«¸ÂÅÏÑ××××ÚÚÚÚÚ×ÑŸ¢mgbggirmmzrwwwwzzzzrzzzzzzzwwwzwwzzzzzzzzzzwwzwzzzzzwrrzzzzgM¢¢¢¢¢¢¢¢¢¤¤«¤«««««¬¬¬«¤¤¤zii_b[_[b[bb_bgimmggbigigigbgimmigiiiiiggrgiimrzwrwwwwzzzzzwzzzzzzzzzzwwwmmmmggggbrwzz¢¢¬ÂÅÊÑ×××Ú×ÚÚÚÚÚÑϰiibggiirwrrwzwrwzzwzzzzzzwwzzzzzwzzzwzzzzwzzzzzwzzzzwzwzr_M=9¢¢¢¢¤««¤¬¬¬««¬«¬¤¤¢zzrm_[[QVVV_[bbbimimiiggbgimgigbigiiggiiiiiimmmmmrrwzzzzzwzzzzwwzzrwrrwmiimbgrwzz¢¢¢¤´ÂÊÊÏÑ×××ÚÚÚÚÚ×Ñʸ«zgbggmmrrwrwwrrwrwwzrzwwzzzwzzzwzzzzzwzwzzzzwzzzwzr_QFB37,¢¢¢¢¢«¤««¬¤«««¬¬¤««¤¢zzmrb_[VV[[__gbgigggimigggiiggiiigiggmrgiigrmrmrmrwrwwzzwzzzzzzzzzzwzzwzrrrrmmrmiggiirwz¢«¸ÂÊÏ×Ñ×××Ú×ÚÚÚ×ʰmggmmimmrrrwzwwzwzwzzwwzwwwzzwwwzwzzzwzzzzzwzzzzzzi_IB33,,3¢¢¢¢¤¤«¤«««¬«¬«¬«««¢zzri__[_[[[[b_ggbbggigigbgimiiiiigggbigbbmimmmirrrwrwrwwzzzzzzzzzzwzzrwwwrrrmmrgmiggimwwz¢¢¢¢¢°¾ÅÏÑÑ××ÚÚ×ÚÚÚ××ʾ«zmiiimmrmrwwwwwzwzwzzwzwwwzzwwzzzzzzzzzzwzzzzzzzwibQ=7,,,,+¢¢¤¤«¤¤«««¬¤¤«¢«¤¢zrib[[V[[_bg_bbbggggggigibggimigggggiggimmmmimmrwzrwzzzzzzzzzzzzzwwzrwwzwmrwrimimiggmrw¢¢¢¢¢«¸ÂÊÏÑ××××Ú×ÚÚÚ×ÏÅ´¢miggiiimmrmwwzzwwwrzzzwzzwwwwwrzwwwzwzzzzzwzzzzzzzzzzzzzri[M=,333,33¤¢¢¤¤««««««¬¬««¤¤«¢wii_[[[VVV_b[bg_bigggiigimiiggiggiiimgbgigirmrrmrrwrwwzzzzzzzzzwwzzwrrwimmmgmgmiirw¢¢¢¬¸ÅÊÏÑÑ××ÚÚÚÝÚ×ÑϾ¬igiigirrrmrwwzzwzwzzwzwrzwzzwwzwwwwzzzwzzzzzzzzzzzzzwiVF77+,+,,,,¢¢¢¤¢¤¤««¤«««¤¤¬¤«¤«¤¢wigb_V[[Vb_[_bbggiiggiiimimiiiggbggggiggbiirrmrrrrwwwwwzzzzzzzzzzzzzzzzzzwwwzwwrrrrrmmiriggimzz¢¢¢¢¢¢¢¢¢¤´ÂÊÏÑ××ÚÚÚÚÚÚÚÚÑʸ¤rigigiimrmwrrwzwzwwzzzzzzwwzrwzwzwzzzzzzwwzzzzzwzzzzzzzzm_I933+,+3,33¢¢¤¤¤¤¤«¤¤«««¤«¤«¤¢¢zrmig[V[_[_[_bbggbiiiimmiimirmgiggiigbggigimrmmrrrwzzwrwzwwwzzzzzzwzzzwrzmimmrrmmigbgiwz¢¢¢¢¢¢¢¢¢¢¢¢¢¢«¸ÂÊÏÑÑ××ÚÚÚÚÝÚ×ÏŰigiimrrmwrrrrzwwzwrwzwzzzzwwwzzwzwzwzzzzzwzzzzrm_F99B,++,,3,3¢¢¤¤«¤«¤«¤¤«¤««¤«¤¢¤¢rib[_VV____bbggbigiiimgimiiriggbiiiggbgbiimimrrrrwrwwzzzzzzwzzzzwzzzzwwwwirrmwimiiggmrww¢¤¢¢¢¢¢¢¢¤¤¢¢¢¤¤¢¢´ÂÊÏÏ×××ÚÚÚÚÚÚÚÑϾ¬zgiimiimrmmwwrrrmzwzzwzzwzzwwwrwzzzwwwzzwzzzzzzzrg[B7,3F33337333¢¢¢¢¤«¤««««¬¤¤¤¤«¤¢¤zrmmb[_[[[[[[bggigggiimiiiiigiigggigiigbggimmmmmmrwrrwwwwzzzzzzzwrrwmrrimriiiiimrz¢¢¢¢¢¤¢¢¢¢¢¢¢¤¢¢¢«¸ÂÅÏÑ×××ÚÚÚÚÝÚ×ÏŸ¤miimimmiimzrwrrwzzwrwwwzwwzzzwzwzzzzzzzzzzwzmbVs++3,,,,7,7,¤¢¢¢¤¤«¤¤¤¤««¤¤¤«¤¤¤¤¢zigb_[Q[[[[[_gggg_bimmimgmmbiggigmggigibbigimmmrrrrrwzzwzzwzzzzrwzrzwrrrzwmimmiggirwz¢¢¤¤¤¢¢¤¢¢¤¢¤¢¢¢¢¢¢°ÂÅÏÑ××××ÚÚÝÝÚÚÑϰzriibirimrwwrrrrwzzwwwzzwwrzzwwwzwzzwzzzr_Q=,33++3+33,,+37¢¢¤¤««¤¤¤¤¤¤¤¢«¤¤¤¢¢¢zmmg_V_[Q[__Vbgbmbggmiggigimmiiibimibggbggggmmrmmwmzwwwzwzzzzzzzzrrrrrrrwmmmwiiiigmrz¢¢¢¢¢¤¢¢¢¤¢¢¢¢¢¢¢¢¢¢¢¢¢«´ÂÊÏÑ×ÚÚÚÚÝÚÚÚ×Ñʸ«wbgmigimrrwwwwzzwwwzwzzwzzzzzzzzzzzr_Q=,,3+,,%33,3+%,7¢¢¢¢¢¤¤¤¤«¤¤«¤«¤¤¤¤¢¢«¤¢¢¢rmg_b_V_V[b_bgibbgggiggmigiggmggigibbggggmmimrmrzrzwwwrwzzzzzwzzzzzzzzzrrwrmwrmmirggiggmrw¢¢¢¤¢¢¤¢¢¢¤¢¤¢¤¢¤¢¢¤¢¢¢¬¸ÅÊÑÑ×ÚÚÚÚÚÚÚÚ×ÏŰigggmmimrrmzrwzrwwwzzzzzwzzzzzzzzwzm_Q93+%,3,,+3,3,33,3¢¢¢¢¢¤¤¤¤¢¤«¢«¤¤«¢¢¢¤¤¢¢r_bVVV[___bbbibbbiimiiriiigiggmgimgmiggiimrwmwrrrzzzzwwzwzzzzzzzzwzwwrrwrmmmriigggmrrz¢¢¢¢¢¢¢¤¢¢¢¢¢¢¢¤¤¢¢¢¢¢¢¢¢´ÂÊÏÑ××ÚÚÚÚÚÚÚ×Ñʾ¬wggggiimrrrwmrwwwzzwzzzzwzzzzzzzzzzzzmbI=3%,33,3,3937++,,3¢¢¢¢¢¢¢¢¢¢¤¤¤¤¤««¢¢¢¢¤¤¢¢¢¢rg_bVV[V___bbgiigiimggmiiggggigggiigiggbimrrmrrmrzwwwwwwzzrzzzzzzzzzzzrmrrmmiimiggmrwz¢¤¢¢¢¢¤¢¢¢¤¤¤¢¢¤¤¢¢¢¢¢¢¤«¸ÅÊÏÑ××ÚÚÚÚÝÝÚ×ÏŸ¢rbmrmirwrrmrwwwrzzzzzzzzzwwwzrzzzzmgQs++7B73,,97,3,7,7¢¢¢¢¤«¤«¤¤¢¢¤¢¤¤¤¢¤¢¢¢¢¢¢¢zmib_bVV__bb[gbgiggwiiiggimgimi_bgbgmbgggiimrmrrrwrwrwzzwzzzzzzzzzzzzzzzzzzzzzrmrrrmimimiigmmmr¢¢¢¤¢¢¤¤¢¢¢¢¢¢¢¢¢¢¢¢¢¢°¾ÊÏÑ×Ñ×ÚÚÚÚÝÚÚ×ÊŬziimriirrrmwwrwwwzrwzwzrzzzzzzm_F93,,,++,,73,+,,,,,73¢¢¢¢¢¤¤¤«¤¤¢¤¤¢¤¢¤¢¢¢zzib[[V[b___gbbbgbgiggiibbggmgbbibiggiggimmmwrmmwzrwwrwwwwzzzzzzzzzzzwzzzzzwwzrrwrmmrwiiiggimmr¢¤¢¢¢¤¢¤¢¢¢¢¢¤¢¢¢¢¢¢¢¤´ÅÊÑÏ××ÚÚÚÚÚÚÚÚÑʸ¢iigiiimwrmzrwwrwwrrrzzzwwzwwzzwzr[F737++,+,77=,77+,33737¢¢¢¤«¤«¤¤«¤¤¢¤¤¢¢¤¢¢¤¤rgb_V[VV__bbgbbiiiiggggiigggggimmgbgiigiigiimimrrrmrzwwzzwzwzzzzzzzzzwwwwzrrrrmirriimimmmrz¢¢¢¢¢¤¢¢¤¢¢¢¤¢¢¢¢¢¬¾ÅÏÏ×××ÚÚÚÚÚÝÚ×ϰrigirmmmrrrwwrwzrzwzwzzzzzzrzzzwzzzrbF9399,73373,,,,,3,,3=¢¢¢¢¢¢¢¤¤¤¤««¤¤¤¤¢¤¢¤¤¢zrib_[V[V_____bgbgimgigiggbgmiigbgiibgggiimiimwmmmrzwwzwzzwzzrzwzzzzzzzzzzzwzzzzwwwrmmmmiimiiiimwrw¢¢¤¤¢¤¢¢«¢¢¢¢¢¢¢¢¢¢¢¢¢¤´ÅÊÏÑ×ÚÚÚÝÚÚÚÚÚÑʾ«rgigmmrrrwwzwzwrwzwzwzzzzwwwwzzwr_I9I=,3+,,,3%+7+,+7337777¤¢¢¢¢¢¤¤««¤¤«¤¤¤¢¢¢¢¢¢¢¢¢wrgb_[VQ[[g_[_bbggiimgmiiiggimgggggbiibgimirrmmrrrrzwzwzzzwzwzzzzzzzzzzzzzzzzzzzwrmmimmmiiiimmmwz¢¢¢¢¢¢¢¢¢¤¤¢¢¢¢¢¢¢¬¾ÅÊÑ×××ÚÚÚÝÝÝÚ×ÏŸ¤iggiimirwrwzzwzzwzzwzzzzwzzwwzzzzm_F9=II33+,,,,+%,,,+,333779¢¢¤¢¢¤¢¢¤¤¤¤¤¤«¤¤¤¢¢¢¢¢¢¢¢¢¢zwib_VVVMQQb__bbbggbggigigggiigigbgiigggiimimmmirrrrwzzwwwwzzzzzzzzzzzzzzzzzzzzzzzzwwrmrriiigiimmrrww¢¢¢¤¢¢¢¢¢¢¢¤¢¢¢°ÅÊÏÑ××ÚÚÚÝÝÝÝÚ×ϰzbgimmmmrrrrzzzzzzzzzwzwwzwwzzm_Q73%,93,%%%+,++,,,,37399,,¢¢¢¢¢¤««¤«¤«¤¢¤¤«¢¤¢¢¢¢¤zrmb_V[[QVVQ__bgggiggiigiiwigiimgggbibgggiimmiiimrwwwwwwwzzzzzzzzzzwwzzzzzzzzzzzzzzzzzwwzzzzrwimrmrimgiimrwzz¢¤¢¢¢¢¢¢¢¢¢¤¢¢¢¬¾ÅÏÑ×××ÚÚÝÚÝÝÝÚÑʤmggirmrrrmmzzzzwzzzzzwrrzzwzzr_F7+,,,7,,%,+,,,,,33,,3933,3¢¢¢¢¢¢¢¢¤¤¢«¤¤¬¤¢¤¤¤¢¢¢¢¢¢zwmg_V[QVQV__b_gbggigbigimggimigiibgggbiigmmimmmrwrrrzzzzwwzzzzzwzzzzwzzzzzzzzzzzzzzzzzzzzzzzzzwzzzrzwwmrmmmiiiirmzz¢¢¢¤¢¢¢¢¤¢¢¢¢¢¢¢¢¢°ÂÊÏÑ×ÚÚÚÚÚÝÝÝÚ×ÏÅ´bgiimmmwwrrzzwwwzzzzwzwzzwzzwzzrr[I7+%+%33,3+,+,,,,,,,3797,79M¢¢¢¢¢¢¢¤¢««««««¤¤««¤¤¢¢¢¢¢¤¢¤¤rmgg[[VQV[__gbbbiiiggmggiiiiigiiggiiigbgiimimgmrrrwrwwwzzzzzzzzzzzzzzzzzzzzzzzzwzzzzzzzzzzzzzzzzwrwwzrzwmmrrrmmmmmmrrw¢¢¢¢¢¢¢¢¢¢¢¢¢¢«¸ÅÏÑÑ××ÚÚÝÝÝÝÝÚ×Ê«mgiiimrrrwrrwzzzzzwzzzwzwwzwzzi[F33,%%+,,+,37+++933733,73,33=¢¢¢¢¤¢¢¢¤¤«¤¤«¤¤¤¤¤¤¤¤¤¢¢¢¢¤¢¢wrg_[[[VV[__bgbbigiiiiirgbgimgggggggigggmgmimiimmrrrwwwzzzzzzzzzwzzwzzzwzzzzzzzzzzzzzzzzrwwwwwwwrrmrimmmiirwwz¢¤¢¢¢¢¢¢¢¢¢°ÅÅÏÑ××ÚÚÚÝÚÝÝÝ×Ñʸgbirmrrwwrrwrrwzzrrwzzzwzzzzr_I,++,,,33,3,+,,7+,,373373,7799¢¢¢¢¢¤¢¢¢¢¢¢¢¤¤¤¤¤¤¤««««««¤¤¢¢¤¢¢¤rrgb_[VVV___bbgbbgimirmmmggimmbgggigmggiiiiimmmmrrrwzwzzzzzwzzzzzzzzzwzzzzzzzzzwzzzzzzzzzzzzmwwrwwwwrrirrrmimrmz¢¤¢¢¢¢¢¢¢¢¢¤´ÅÊÏÑ××ÚÚÝÝÝÝÝÝÚÑŬwiiiigmmrrwwzwwzzwwzwwzzzzzm[F7++%+33+,,3,,,7,37333,7,3,3793¢¢¢¢¢¢¤«¤««««¤««¤¤¤«¢¢¢¢¢¢¢zmib_[VV[[bb__bggggggmimmmimimgbggbigbggggiiimrwrmrwrrzzwzzzzwwzzzzzzzzzzwzzzzzzzmzzwzzzzzzzzzzzzzzzwzzwzwrriwrmmmmimiiirzz¢¢¢¢¢¢¢¢¢¢¢¢¢¢´¾Å¾ÊÑÑ××ÚÚÚÝÝÝÚÑϸ¢wmwiwrrrwzwwwwwwzzzzzwzwzzzmVB337+++73,+,,++,333773333,33¢¢¢¢¢¢¢¢¤¢¢¤¤¤¤¤«««««««¤«¤«¤¢¢¢¢¢¢¢¢¢¤wmg_V[[_[_b__bibbbgiiigiiiiimgggggbbigiimiiirrimmrwwwwwzzzzwzzzzzzzzzzwwwzzwzzzzzwzzwzzzzzzzwzzzrwmrmimrmgiimmrwz¢¢¢¢¢¢¢¢¢¢¢¢¢°ÂÊÑÑ×××ÝÝÝÝÝÝÝÚ×ʸmiiimimwrrwrrzrzzzzzzzzzi_F93%%,3%%773773+,9973733,3,333977¢¢¢¢¢¢¢¢¢¢¢¤¤¢¤«¤¤¤¤«¤«¤¤¤«¤¢¢¢¢¢¢¢zrmg_bQV[[b[[gbb_biggiiiiiiibggbgggbgbigggigmmmrirwrrwrwzrzwzzzwzzzzzzzzzzzwwzzwwzzzzzzwzzzzzzzzzzzzzzzzwrzrmmriwmmgmmmwwwz¢¢¤¢¢¢¢«¸ÊÏÑ××ÚÚÚÝÝÝÝÝÝ×Ͼ°riigiimirrmrwwwwzzzzzzwzzzrbI9,++%+,++,3737377,3393373379339¢¤¤¢¢¢¢¤¢¤¤¤«¤««««¤¤¤¤¤«¤¢¢¢¢¢¢¤¢¢rmb_[V[[VV_bbbgbgimiigigiiiggigmiggggb_biigmimrmwrwwwrwzzzwzwzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzwzzwzzwwzwzzzzzzzzzzwwwrzwrwrmmrrizrimmmrwww¢¢¢¢¢´ÂÊÑ××ÚÝÝáÝÝÝÝÝÚÑʾ¤igibmimrrrrrrwzwzzwzwzzwbF7,+++++%+,3,7937B3333373333,77733,¢¢¢¢¤¢¢¢¢¤¢¤¢¢¤«¤¤¤¤¤«¤««¤«¤«¢¢¢¢¢¢¢wimbV[VV_V_gbbggbbgbiigggggggggggbigiiiiiigmmmmrrmrwwrwwzzwzzwzzzwwzzzzzzzzzzzwzzzzzzzzzwzzwzwwwzwzzzzzzzzzzzwwwzwrwzrmrwrmmgimmrwzzz¢¢¢«¸ÅÏÑ××ÚÚÝÝÝÝÝÝÝ×Ïʰzibiigirrwrrrwwzwzzzi[I9+++%++,,,7739977773,3733,,3,777,3+¢¢««¤¢¢¢¢¤¤¤«¤««¤«¤«¤¤¤¤¤¤¢¤¢¢¢¢¢¢¢¢¢¢¢wig_[QQQQ[[gV[bbiggiggbgbgggigiggbi_giiiiiimiirrmmrwwrwzzrwzmzzzzwzzzzzzzzzzzzzzzzwzzzwwwwzzzzwwzrzzzwzzzzzzzzzzzzzzzzwzwwwrwzrrrmmmmmimiwr¢¢¢¢¬¾ÅÑ××ÚÚÚÝÝÝÝáÝÝÑʾ«r_bggmimmwwwrwzzwzzwi[B9+%+,+++,,,,3,,3337777,979333,773+,+¢¢¤¢¢¢¢¢¤¤¤¤¤¤««¤««¤««¤¢¤¢¢¢¤¢¢¢¢¢¢¢¢¢¢¢¢zwmb_QQQVQV[[__bbibgmiggbbgbgibggggggiggbbigimmmmwrrrwwrzzzwwwwzwzzzzzzzzzzzzzzzzzzzzzwzwwzzzzzwzwwwzwwwzzwzzzzzzzzzzzzwzzwwzwwwrmmiiiiiirrz¢¢¢¢¢¸ÅÏÑ××ÚÝÝÝÝÝÝáÝÚÑʸgbbbiimmmmrrrwwwwwzzwi_I7,+33,+++++,7333777w77377,,33,37¤¤¢¢¢¢¢¤¢¤¢¤«¤¤««¤¢¢¤¤¤¢¤¢¢¤¢¢¢¢¢¢¢wmbV[VQQQV_bbbbgbggggmmbgigggbgbiiggiigbggigrrirrwwrwwrzzwwzwrzwwzzzzzzzzzwzzzzzzzzzwzzzzzzwzzzzzwrrzwzwzwwzwzzzzzzzzzzzzzzzzzzzwrwrrrwrrwmmrimmmrwwz¢¢¬¾ÊÏÑ×ÚÝÝÝÝÝááÝÝ×ÑŰwbbbrmmmmmrrwwzmwzzwm_I7+%,%,3+,3,+,9BBIF==937,333,3,,,,9¤¤¤¢¢¢¢¢¢¢¢¢¢¤¤¢¤¤««¤¤¤¤¤¢¢¢¢¤¤¤¤¢¢¢¢¢¢¢¢¢¢¢¤zwib_[QMQV[b[[gbiigggbgbgigigggbgbgibbigigiiimwmrrwrrwwwzwzzwzzzwzzzwzwzzzzzzzzzwzzwzwwrzwzwzzzzzzrwwwzwwwzzwzzzzzzzzzzzzzzzwwzrrwrwwrmwrrrrmmmrrz¢¢¤´ÅÏÑ××ÚÚÝÝÝáááÝÚÑÊ¢ibgiirgirmmrwrwzzzwzm[I93,%,3,++,3,++33377373333,33,,,7,,,,,33¢¢¢¢¢¢¢¤¢¢¤¢¤¤«««¤¤¤¤¤¤¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢zrgb_[QQQ[[[bVViggrigmgbbbgggggbgiggbibgggbigiimmmrrwzwzwwzzwwzwwwzzzzzwzzzzzzzzzzzzzzzzzzzzzzwrwwzzrwzwwzwzwwzrzzwzwzzzzzzwzwzwrrrwrwrmzwmmmmrmmrzz¢¢¬¾ÊÑ××ÚÚÝÝÝÝÝáÝÝ×ÏŬwgbimimimrwrrmrwwzzrbQ77,+,+,+,%+,7,3977393933,77733,,3,,,,,+,¢¢¢¢¢¤¤««¤«¤¤¢¢¢¤¢¢¢¤¤¢¢¢¢¢¢¢¢¢¢zmig_VVQQQ[[Vbbiggbggbiggggggiimbbibgbigiggiiimrmrrrrzzwzzrwwwzzzwzzzzzzzzzzzzzzzzzzzzwwwzwrwwzzwzwwwwwzwrrwzwwzzzzwzzzzzzzzzzzzwwmzwrrrwrrzrmrmimrrww¢´ÅÊÑ×ÚÚÚÝÝÝÝÝÝÝÚ×ʸ¢ibggmgimirmrirrwzzwr_Q=,,+,++++,+,73,77799s3739333,373+,,,,+,¤¢¢¤¢¢¢¢¢¢¢¤««««¤¬¤¢¢¢¢¢¢¤¢¢¢¢¢¢zmb_VVM[VVb___gbggibgigiiiiggmibgiigibbiigimmmmmmrrrzwzwwwwwwzzwzzzzwzwzzzzzzzzzzzwzzzzzrzrwrwzrwzrwwzwzrwrzzzzzzzzzzzwwwwzwwwzwrrrrrrmmmmmimmrrwz¢¬¾ÊÏ×ÚÚÝÚÝÝÝÝáÝÝ×ÏŰzbbgimmiimiwrwwzzwr_I=,3,%++++,,3,,77799F=9937733933,,+,,,3,+,¢¢¢¢¢¢¢¢¢¢¤¤¤¬««¬¤¢¢¢¢¤¢¢¢¢¢¢rib__QMVV[_[bbbibbmibggibgiggimibgggbiggggimiimmrrwwrzrzzzwzzzzzzzzzzzzzzzzzwzzwwzzzwwzrrrrwwwzwwwwwzzzzzzzzzzzzzzzrwzrrmrwwrrrmimimrrrrz´ÅÊÑ××ÚÚÝÝÝÝÝÝÝÚÑϤibigiiimmrrmwwzzzibM93++++,,,+33333737997y733373+++,,,3,+3¢¢¢¢¢¢¢¢¢«¬«¬«¢¢¢¢¢¢¤¤¢¢¢¢¢¢¤¢rib_[QMQQ____bbbgbbggigigbibgbgigggibggiggmrmimmwwwrwzwzrwzwzzzzzwwzzzzzzzzzzzzzzzzzzzzzz«°«°¢¢wzzwrwzwzzzwwzzzzzwzzzzzzzzzzzzwwwrrwmwwrmmmgimimrrrz«¸ÊÏÏ×ÚÝÝÝÝÝáÝÝÝ×ÏŰwgbigimirzmmrzwg_Q9,+33,+++++,3,33333999=97333,7793,+,,37,,3,¤¤¢¢¢¢¢¢¢¤¤¤¤¤¤¤¤¢¤¤¤¢¢¢¢¢¢¢¤zwig[[VMVQ_[[[__gbigggmiimgmgigiiigggggggigmwmmmwwwrrwwwzzzzzzzzzzzzzzzzzzzzzzzz°´°¸«¢°°¤¤¬¸¬¤¤zrwwwwrwzwwzzzwzzzzwzzzzzzwwrwrrwmmwwrmmrmiimrwrwz°ÂÏÏÑ×ÚÚÝÝÝááÝÝÚ×Ï«ibgwiimwwwrzzriVQ=,,+++33,+++3,,33379979797777=7+93,7,,,,,3+,,¤¤¤¤¢¢¢¤¢¢««««¢¢¢¢¢¤¢¢¢¢«¤¢¢zigb[[QVQ_[bbbgbggigmggmmrigbgggggiggibgigmrimmmrrrwwzzwwzwzzzzzzzzzzzzzzzzzzz´°¢¸¬¤¤´°¬¾¾¬°¸Â¾¬«¤¤wwwrrwrwwmwzzzzzzzzzzzzzzzzzzzzzzzwwwzwwrwwrrwrrmmiirgimrwwz«¸ÅÊÑ×ÚÚÝÝÝÝáÝÝÝÚÑʾ¢mmmmmrwmrzwwi[B3,,,,++333,+,3333397799=9997333,,++3,,,,+,33,¢¢¢¢¢¢¢¢¢«¤«««¤¤¢¢¤¢¢¤¢¢¢¢¤¢¢¢¢mi__[QQV[[__[__gbggiiiiiimgbigiggggiggiiiirmrrmmrmmwwzzzwzzzzzzzzzzzzzzz¢¤¬««¸¬¢°°«¢°Â´«°Â°¬¸Å´¤¢¢zzrwwwrrwzzzzzzzzzzzzzzzwzzwwwrmrmrmrrrimimmrrwwzz¬ÂÊÏÑ×ÚÚÝÝÝÝáÝÝÝ×ÑŬrgmigmwrrzzrmbM9,%,+%+++,++,33339933977973373,++,,,3,+,,,37¢¢¢¢¢¢¢¤««««¬«¢¢¢¢¢¢¢¢¢¤¢¢¢¢zmb_[[QQVV[[b_ibbbgggggigiigiggigigg_gggiiimmrrrrmrrwwwwzwwwzzzzzzzzzzzzz¢´¢¤«°¬¬¸´¢¬¸´°«¸Å¸¬°¾Â¸°°¸Â¸¬zwwrwzrrwrzzzzzzzzzzzzrwwzzwwwmrrrmrrmmiimmmrzw¢´ÅÊÑ×ÚÚÚÝÝÝáááÝÚ×ʾ«imgimwwwzwi_I3+%++,3+++3,,+337377737I97=97+,%+,++37,373,+¢¢¢¢¢¢¢¢¢¤¤««¬¤«¤¢¢¤¢¤¢¤¢¤¢¢¢¢¢¢¢¢zmb[_QQ[[[[_[bbbbbigiigiiibgggbgiigbbggigmmrmrmrrmrwwzzzzzzzzzzzzzzzzzzzzz¢¤´°¤°¢¤¬°´°´¸««¬¸¸°¬´¸¸°«°¸¸¾Â¾¸«wwrrzmrzzwzzzzzzzzzzzzzzwwzwzwwmmmrmmmmiimmmrrw«¾ÅÏÑ×ÚÚÚÝÝÝáááÝÚÑÊ´mimwwzrg_F93+%++++,,++,,+,37939777797977379,3,++,++++,+3+,3¢¢¢¢¢¢¤««¬««¤¢¤¤¤¤¢¤¢¤¢¢¢¢¤¢¢wig_VVQQQ[[[_bV_bbggmgggigggbggiiigmmgggmmmmmrrmrwwwwzzzwwzwwwzzzzzzzzzzz¢«°¬°¤¢¤°««¸Â¸«¸´¬¬«´¸¬«¤°°°¸¸¾Â¸¸¾¾¾¾¸°rrmmrzwwzzzwzwzzzzzzzzzwwwzrzzwrrrwrrmrrmmmiigmimrwrz´ÂÊÑÑ×ÚÚÝÝáááááÝ×Ͼ«wrmwrwzzg_I3,++%++++,,,,+,,,,7337333773377933,,%++,+,3++,,++,¢¢¢¢¢¢«¤««««¤¢¢¤¢¤¤¢¢¢¢¢¤¤¢¢¢¢wmgbQVQQQ[[_[[[gggggiigiggigbmiggggimggbmgmmimwrrwrwwzwwzwwzwzzzzwzzzzzz¬¬¢«´¬¢¤««¤´¸¸¬¸¸¸¬«¸¾´¬¬¤¬´Â´¬¬¸¾¾¾Âž¸´¬wwrwwrwrwzwzzzzzzzzzzwwwzwwwzzwwrmrrmrmmimgimmmww¤¸ÂÏÏ×ÚÚÚÝÝáááááÝ×Ͼ¤wmwwwwrgM93++%++,,+++,,3+,+339773373733,73,,,3+,,,,3,,,++3+,¢¢¢¢¢¢¢¤¤¤««¤¤¤¤¢¢¢¢¢¤¤¢¢¢¢¤¤¤¢¢wig_VQQM[VV_[__gbgbgmgiggiibimggiiggiiiirmiimirrrwrwwzzzzzwwzzzzzzzzzzzzz¢¤¢¬°¢«¬¤¬´°¬¸°´¬«°¸´¬¢«¬¬«¬¸´¬«´¾¾¸¬´¾Å¾¾¾´¬¢imrrwwwzwzzzzzzzzwzzzzzwzwwwzwwwmrrwrmrrrrrmiiiimrmwz«¾ÅÏ××ÚÝÝáááááááÝ×Ê´wzzwrgM9,,,+ %%+,+,,,,,+,37939737,373333373,3+3333377+,++++¢¢¢¤¤«¤«««¤«¢¢¤¢¤¤¢¤¢¤¢¢¢¤¢¤¢¢zwmb_VQQV[V[b_[bg_gbggiigb_iggigbgbimigbigmmmrrwzwwrrzzzwwzzzzzwzzzzzzzzzzzzz¢««¢¢¢¢¬¬¤«°¸«°´¸¸«¬¬°«««´¬¤¬¸¾¸´¬´¾Â¾´´ÂžÂ¾´wrrwrrwwzwzzzzzzzwzzwzzzzwzwwrwmmrwmmmmrrrmiigimmrzz´ÅÊÑ×ÚÝÝÝáÝáäááÝÚÑŰwzmbM=3%%,3+,+,,733,7737797777,9,7733+3++,3737,73,,3,33+,3¢¢¢¢¤¤¤¤«¤«¤¤¢¢¢¢¤¤¤¤¢¢¢¢¢¢¤«¢¤¢¢¢wmb[VIMQVV[[V[____bbggig_bgggbgigggmgggiggmmmmwwwrwzwzwzwzwzzzzzzzzzwz¢¢¢«¢¤¬««°¬¤«¸Â´°¬°°¤°´°¤«°¸Â°¤¬´¾´°¸¸¾Âž¾ÂÅž¬mmrwzrrwrzzzzzzwwzzzzwwwwzmrrwrwmrririiiiiirwz«¾ÊÏÑ×ÚÝÝáááááááÝ×Ѿ¤zmb[=3,7%++%+77+,3737337777799333777,,++,,379933,+3,+++,,3¢¢¢¢¢¤«¬«««¤¤¢¢¢¤¤¤¢¤¢¢¤¤«¤¤¤¤¢¢¢zi_[VMMMQVVV[__b__gggbgibbgbgiiggggigiiiigmmimrzrrrwwwwzwwzzwwwzzzzzzzzz¢¢«¤¬¢«´´´«¸´«´¾´¬¤«¸¾¬¬°´¸¸°«´¸Å´¾¾ÂÊÊÊž¸«zrmrrwzrwzzzzzzzzzzzwzzwzwwzwwwiwrrrmrwmmmriigrzirzz°ÂÊÑ×ÝÝÝÝáááäáááÝ×Ê´wgQB,%+,+,++%37++,,3773733377,73733,,++397733,,,++7%+,,73,¢¢¤¢¤¤«¬««¤¤¢zzz¢¤¤¢¤¤¤¤¢¢¤¤¤«¤¤¤¢wi_[VMMMQVVQ_[_bb_____bgg_giggbbgbggggmmggiimmrwrrrwwrwzwzwwzzzzzzzzzzzzzzzzzzzzzzzzzzz¤«¤¢«¬¢¤°´°¬¤´°¤¬¸¸°¤¢´Â¾°¬´¸¾¾¸¸¸¾ÂÅÅÅžÂŰrrmmwmrzzzzzzzzzwzzwzwzrrrmwmrrrwrmmmwimrmmiimmrzz¢´ÅÏÑÚÝÝÝÝáááäáááÚÑŤz[=3,+,%%,%+%,+,3397797937y37,377,33+3,77993,,9,%+,,,3,,¢¢¢¢¤¢¤«¬¬¤«¢¢zwww¢¢¤¤¤¢¤¤¢¤¢¤¤¢¤¢¢¢rib[QMMMVVVV[___b[bbgbbbbigg_gbigbb_gimmmiiimmrrrwrrwzwwwzzzzzzzzzrzzwwzzzzzwwzzzwwzwrzz¢¢¢¢¢««¤¬¤¤¢¤´°¬¬¬¤¬°¸¸«¢´´¾¸°¬¸Å¸°¸¾Âž¾ÂÅÊž«wrmmrrzzzzzwzwwzzzzzzzzzwwrwwrrrrmrmmmrmmmmiigiiimmrrrz«¾ÏÑ×ÚÝÝÝÝááäáááÝÚϸM,,,+++%,3%++3,++777733977,379s39,,,7933,,33++,,,,3,3¢¢¢¢¢¤««¬¬¤«¤¢zzrwwrw¢¤¤¤¤¤«¤¤¤¢¢¤¤¤¤¢rib[VMMMMMVgg[bgb_b__bggbbgbbgbbbbbbgiigiiiimmrmmwrzwwrwwwzzwzwwwzzzzzzwwwzwzzzzw¤wrwz«¢¤¢¢°°¬¬¤«¬¬«¢¬¸´¬«¬¬¾°¬¬¸Âž´°¾Âž¸¸¾ÅÅž¾ÅÊŰmmmrwwzwwwwzwwzwzwzwzwzzzzzzwwrrrrwwwrrwmrrmmmmiiggigmrirww¢´ÊÏÑ×ÚÝÝáääáäääáÝÚ¸B++%++%+,3+,7+3+,,37777,37733773,,,7,,33,3,,,3,9,93,+%,37¢¢¤¢«««««¬¤¤¢¢wwmmgrw¤¢««¤¢¤«¤¤¢¤¤¢¢¤¤¢wi_VQMMQVV_b[_[b_biibbbggb_bggbbbgbbimgimiiimmrrrriwrmwrzrwwzwzwzwwzwwzzzzwzzzzzzzzzz¬´¢zzwzw¢¤¬¤««¬««««¬¸°°¬´¸°««¸¸Â¾´°¸Â¾Â¾¸¸ÂÂÅʾ¾Â¾ÅÊÊʸ¤rmmzzwrrzwwwwzzwwzrzzwzwzzzzwzzzrwmrrmrrwrrmmiimiibgbiiimrww«ÂÅÏ×ÚÚÝÝáäääääáá×´r, +%+%%+,3,333+,793733,333733,,,,,3333M7337,,+777,,,9339¢¢¢¤¬¤«««««¤¢zzmiigiw««¤¤¢¤¤¤¢¢¤¢¤¤¤¢¢¢zmb_V[QIIMV[QVQ[_[b_gmi__gbbbbg_gbiggggbiiiimmmmmrrrwrwzwrzzzwwzzzzzzzzzzzzzwzzzw¤«zzzwzwz¤¢¬«¤¢¤°°¤¢¢¤°«««¸¾´°¤¤´Â¾°°´¾Â´°´Â¾¾¾¾ÅÊÅÅÂÅÅÊÅ´iwrrmwrrrrrwzzzzzwwzzwzwrwzzzzwwwwrwwrwrrmmrmmrmmiigggmirmww°ÂÊÏ××ÚÝÝáäääääÝ׸r+% ,+%+,,,+,3%,37779973773=93+,,,++33337737+%+337+,+,933¢¢¢¤«««¬««¢¢wmgbbgr¢¤¤¤«¤«¢«¤¤¢¢¤¤¤¢¤zmgVVQIMMQQ[[VV_[[_bbbbb_[bbbbgb_gigbbggiiirirmmmwwrrwzrrzwwzwzwzrzzzzzzzzzzzzzzzzzzzwzzzrzzwzzzz¢¢¢¢«¢¢¤¢¢¬¢°¬¬¤«¬´¾«¢°´¾¾´°°¾¾Â´«¬¾Å¾¸°¸ÂÅÅÂÂÂÂÂÂÊÏÊÅ´¤zrrwmrmrzzwwwzwwwzzzwzwzrzrwwwrwrwrrrmmrriimmmmgiggbiimrrwz«¸ÅÏ×ÚÚÝááääääáÚÂ7 %+%+++,++,33333377773773773,,,,+,+3399,73,,,++,,,,+37993¢¤¤¤¤«¬°¤«¤¤zrgg[[grz««¤¤¤¤¤¤¢«¢¤¤¤¢«¢rmb[QMIQMQVVQ[V_V_bb____b_bgbb_gbggbibgggibgimirrmrrzmwwrmwzzwzzrzzwzwzwzzzzzzzzwzz°zzzzzwzzzzz¢¢¤¢¤¤¢¤¢¬¤¬¬¤«°´´´´°°¾Â´´¾¾¾´¬¬¸¾Â´°¸¾ÂÅŸ¾ÂÅÊÊÊžÅÅÅ´mimmmmrrwwwrrwzzzwzwzwwwzzwwwwwrrrrmwrmmgmiigimi_bmmimww¬¾Ï×ÚÚÝááäääáÚʤ[%+%%++,++,3+%,,,7377773777773,3,,,,+337733,+,,,3,,33377993¤¤¤«¬°«¬««¢zwii[[[brz¢¤«¤¤«¤¢¤¤¢¢«¢«¤¢¤¢wib_QQIIMIQQVV[_[b_b_b_[b_gbgbbbgbbgggiigiiiimmiimmwzrwwrmzrzwzwzrzzzzwzzwwzzzzzzzzzzzzz¬Åmrzzzzzwwzzzwzzz¤¢¤¬¬´´¬¤¤¬¸´¾¾¾¸¸¾¾´°°¸¾¾Â¸´¾¾ÂŸ´¾¾ÂÊÅžÂÂÂÊÊ´¢mimimmmmrrrrwzwrwwrzzwwrwwrwrrwwrrmirmmimmiimmgibgimmrrz°ÊÑ×ÚáááääáÚÑ´z3 %+% %%+++33+33,7977,3,9s93+,,,,+,377393,,++,+,+3379733,¤¤«¬¬¬¬¬«¤wmg_QQVbmz¤¤«¢«¤¤¤¤¤¢¢¤¤¤¢¢¢wm_[MIIIMVVMQVVV[________bgb_ibbgg_gggbiiiiigmmiirrmwrwrrzwwrwrwwrzzzzzzzzwzzzzzzzz°igmzzzrzzwwwzzwzwzzzzwwz¢¤¢¤«¢¬´°¢¢¬¬°¸´¸´¸¾¾¸°«¸¾¾¸´¸¾Â¾¸´¬´Â¾¾ÂÂÊÅž°mimimmirwwwrwwwrwrwwwwrrwrzwrrrrrrwrrrrgiimgiiigimmmz¤´ÏÚÚÝáääáÚѸF%% +++%+++,+3,3379w7339793,,%++++,3,733,7,,+,,+,33,733+%%¤««¬°¬««¤¢¢¢wi_VQMVimw¢«¤«¤¤¤¤¢¤¤¤¢¢¢¢¤¤¢zrr_VMMIFMQQVV[[[__[_[b[bb_b__bbbgibgibgmigggmgiigmmmrwrwrrwzzrrrwwwzzzzzzzzzzzzzzzwz¾«m[Vimwwwzzmzzrzzzzwzzr¢¢¤´¸°¤¤¤¬¸´¬¬¸¸¾¾°°¸¾¾¾¸´°´Â¾Â¾°¬´¾ÂÅž¾ÂÅÅÅÅÅÅÂÂÂÂÂÅŸ¢migmgmirmrrrrrwrrrwzwwwrrwrmrmmwiimmimiiiibggbgimmr«Ê×ÚÝááÝÚѾV, + %+++++++,7+3979937y79977+,,+,,33773,+,,,,,,,,97797,% ««°¬°°«««mg_VFM[grz¤¢¢«¤¤¢««¤¤¢¤¤¢¤¢wmg[QQIFMIMQVV[[_[___b___bbbggbbbbb_gibgibgmgiigiirrrmrwmrrrrwrrwwwzzzzzzwzzzzzzzzzrrz¢Ï¤gb[mrzwzzwwzwrzwwwwrwzz¤¤°¸¬¬°´´¬«´¸¸¸¸¬«´¾¾Â´«´¾Å¾°´¸¾Â¾¾¾ÂÊÊžÂÂÂÂÅž¾Â«wggbiiimmrmrrmrrrrmwwrrwrwwrrmmmmmmmimmmiigibggirrzzz¸Ê×ÝÝÝ×ѾV3+++%,++,,,+,+33399793779973773%%+,3333393,++,,+33977977+% ¤¤«¬«¬¤«¤wm[QIIMVbmw¤¢¢¤«¤«¤¤¢¤¢¤¤¤¤¢¢wibVVQIFIVQQV[____b__g_g_bbbgggg_bggggbbbbggimimmmmrmrrrrrirwrrwwrrwzwzrwwzzzwwzzwzzz°i_gmrwwwwwwzwzzwwwrwzzzzz¢««¤¢¤°´°¬¤¤´¸¸°«¬¸¸¾¸°´¸´¾Å¾´°¸Â¾´¸¾ÂÅÅžÂÅÅÅž¾ÂÅÅÊŸ¢igggiriigimmrmrrmrwrrrrrrwwmmmmmrmiimiimmgggigirrw¬ÅÑÚÚ×Ͼb3,%%+,,,++,+,+,373333,7977739,,,,,,,337,3,,+,++3+,3979+%««¬¬¬«¤¢zi_QMMIQ[brw¢¤¢¤¤««¤¢¢¤¤¤¢¢¤¤¢ri_QVFIFQMV[V[V[[[b__bbbgbb_bbbbbgbiggbgggmimimmmrmrwrmmrwrrwwrwwwwwwwzwwwwzzzzzzzzrmrrmrwwwzzrwrwzzmzz«¢«°¸¬¤´´´°¤«¸´¸¸°°´´¸¾¾´´´´¾Åž¸¸¾¾Â¾¾Â¾¾ÂÅÊÊʸÂÅÊÊÅÅÊÅʾ«rggmmiiiiiiiimrrrmwrmrrmrrmmirmriiimgiigibggmmrrw¤¾Ê×Ñʸ[7%,+++,,,,+++,+3,93,3733337973,3,333377397,++33+3,,79=79+ «««¬¬«¤¢wwgVQMIIQ[grz¢¤¤«¤«¤«¢¢¢¤«¤¤¤¤¢¢rmbQVQFFIMQV_V[_V[bbgigiiigbiggbgbbbgbgimigmiimgirrwrrwmmrrwwwwrwwrzrzwwwzwzzwwzzrmmmrwmmrwwzzwrzrzzwzrwwzzw¢¢«¬«««°¸´¤¢«¸¾´¬¤¢¸Â¾¸°¬¬¸Â¾¾¸¾Åž¸¸ÂÅÅÊÊÅÅÂÂÅÅÅÅÊÅÅÊÊÏÊÊ«mbgb_bgmggmimiimrrrrmrwmmmrmrmriiiiimiggb_gimrmz¢´ÊʬQ3,%,,+,,,+,,,,,7373,373,777373,,3,93777B77773+,,3337==F=3% ¬¬««¬¤¤¤¢wi_QIIIQV_grw¢¤¤««¤¤¢¢¢¤¤¢¤¤¢¢rm_QQFIIMQVVVVV[___giibbgbi_bggbbbbgbggbibgiiimmmmmmwwwimmmmwrrwwzwwwwwwwzwzwwwzwzzzzzzzzrmmrrrmrzwwwwrmzzzwrzzwzzz¢¢¬¤«¬´°«¢«°¾¸¬¤¬°¸Â¸¬«¬´¸ÂŸ´ÂÅž¸¸ÅÂÅʾÂÅÊÊžÂÅÏÊÊÊÅÊŰib_bgbggggiiimrrrwwmmrrrmrimimiimimmiimibbigmrzz°¾´¢Q7,++,3,+++,+,3,,3,%733,3993373,,,33w73,3,33++333,33FBM=,% 7¬¬¬«««¢¢rg[QIMFMVbgmw¢¢¤¢¤««¤¤¤¤¤¤¢¢¤¢¢¢wri_QIMIFMQQVQ_[[___ggbb_bmrgbgb_bbbgbbg_b_gggimmrmmrrrrrzwrrwwmrzrrwwrzmwzwzzwzzzzwzzrwzzmrrmmwwrzrrrmiizzwwwzzzzwzzw¢¢¢¢°°¢««°°¬«°´¾¾¾¸¬¬´¾Â¾¸¸¾¾Åʾ¸¾¾ÅÅÂÂÂÂÂÅÅÅÅž¾ÂÅÊÊÏÊÊÅÅÏÊÊ´rbV__bb_bggbimimrrmrrrimmmiiimmmrmimgggbgiimmw¢¢rI33%+,33,+++,,337,,37,3,97739933+++,3=737,3++3++93,9=FIIB73+ 7b««¬«¤¤¢wi_QQIIFQVbgmz¢«««««««¤«¤¢¢¢¢¢¢zzm_VMMIFFMQV_VV_b_bg_gbg__gbbgb__bgbbgg_ggggmimimimwmrmrwrwmwwwrwzwwwzwzzzzzzzzzzzwwz¢wimwmrzwwrmrmmmwrrwrwzzzwzrz¢««¢¢«´´¤¢´¾¾¸¸¬°¸¾Â¸¾¾¸ÂÅž¸¸ÂÅÅŸÂÅÅÅÅž¸ÅÅÅÅÊÅÂÂÅÊÊÊÊÊÊ´¢m__[__[_gbbgiiirmiimmmmigigimmimmimgggbggimww¢mM73,,33%+,,%,3,3+33777773773,33,++%,,799733,=3,+337779BFBF=+%%%3_¬¬«¬¤¢¢zrb[MMMMMM[bgrz¢¢¤¤«¤¤¤«¤¢¤¢¤¢¤¤¢zm[VFQIFMQQVVV[__[__bb_bgggbbigg[gggbbbbgiimiiimmmmrrrrwmwwmrrrrwwwwwwzwwzzzwzzwzzzzzz´´immrwwrrimrimmrrmwrzwzmzwzzz¤¤¢««¢«´¸´¬¬´´¸¸¾¸°´¾Â¾¾°¾ÂÅŸ¾ÂÊÅÅÅÅÂÂÂÂÅÅÅÅÅÂÂÅÊÅÊÅÅÅÅÊÊÊrmmib[Vb_gbgggriiimrmmmiiiiiigirgiggg_gbimmrzrQ93,,3,+%%,+,%++,379¹3333,33,,+%++,7779999=3,77,3777ûB7,% %3Vz«««¤¢¤zrm_VMMMIMVV[gww¢¢««¤«¤¤¤¤«¤¢¤¤¤¤¢¢zrgbQMIFIMQQV[gV_b_bbbgbbigggbgggbggbbbbgggbgiiimmmirmrrrrrmmrmrwrwzzzwwwwwwzzzwzzzzzzŤwrrmrwrrrmriirrrwwwwwwzzzmzwzw¢¤¬¬¬¾¸°°«´¸¾¾°¬¾¾¾Â¾¾¸ÂÂÅŸ¾¾ÂÊÊÊž¸ÅÅÊž¾¾ÅÊÅŸ´´¸ÂÊÊÑѸ¬«¢iV[___igmmrmmriigimmigigiiigggbbbbgmmwwzzwwzzVB,,,++%,++7+%+++,337737377,3,+,,,++,3373977,,,,3,373=BBF93,% 3Qr«¬¤¤¢¤wmbVQMQ[MMQV_ir¤¤¤¤«¤¤«¤¤«¢¢¢¤¢¢rg_VIMFIMVQQVVQ_b_ggg__b_g_bbgbgbbbbgggbgibmgbiiriiirrmrwwwmwwwwwwzwzmwwwrzwzzwzzwzzzzw«mrrwwmiimgimmrmrwwwwrwzzwwzzzzz¢«¬°´¬¤¬´¸´¸¸´´´¸¾Â¾°´Â¾ÂÅž¸¾¾ÂÊÅžÂÂÂÅÅŸ¸¾ÂÅž´°´¸¸ÂÅÏÑ××ÚÚ××ÑÏÂr_Q[_bbgmiiimbriigiggiggmmmggggbgmmmwr¢wzwrwwwz¢iF,,,,+,,+7,++%+,,7737373797733,,,+3+7777B733,,+333377¿B9,+%% +3Im¤¤¤¤¤¢wg_MQmQMMIQ[bgrz¢¤¢¤¤¤¤«««¤¤¢¤¢¢¢¤¢¢zrg_VMIMIIQQVVVV___[igbbg_b_b_bgbggbgbbgbibgigimimmrirrmrzwwmwmmrrzzrwzwzzzrzzzwwzzzzz«rrrrrrimmrigmrrmwzwwwrzwzrzwzwzw¢¤´´«¤¬´¸´¸°°´¾Â¸´°´¸¾Â¾´´¾Âž¾ÅÅÅž¾¾Â´´¬¸ÅÊÏÑÑ××ÝÚÝááäááÝÊ¢iVV[[ggimmimimgiigbigmiggbgggg_bgimwwzwrrmrwrwmV7,,++,,++%++++,337,3777773,33++,,3379399333,73333,377BMM=7+%% ,Fb«¤¤¢¤zi_QMQMVVVQQ[[gwz¢¢¤««¬««¤«¤¤¤¢¢¢¢zrmb[QFIMMIV_[V[[__irbbgbbgbi_bgbibbbgggggigibirmmmrmwwrrrrrrmrwrzrwwzwwzrwzzzzzzwzwzzzz¢mrzmmimmiimimmwwwwwrrrwrizrwzzwzw¢¢«¬««´¸¾¾°°¸¸¾Â°«´¾¾Å¾´°¾Â¸ÂÊÅ´´ÂÅÅÊž¸¾Â¾´´¸¸ÂÅÑÑÑÑ×××ÚÚÚÚáäáäáäÝÊ[[[V[_giggimmiggbggggiiigggibbiiimmw¢zwwiiimrmwzw[933++,33,%+,9%%+,333737373,3++,,,+3,9977977,,,,7337979FMI=7%%+,39_w¢«¤¤¢wrg[QQ[VV[QQIVbgmz¢¤«¢«¤¤««««¤¤¢¤¢¢zrgbVMIMIQQQV[V[_bgbib_g_bbgib_ggbbbggbgggggiigirmrmzrwzrmrwrwmzrrmzwwwwzzzwwzzzwwrrrmimbgiwmirzwzwwwrwrizzzzwzzwwz¢«¢¤¬¬´´¬°°¾Â¸´´´¾Â¸´°¸¾ÂÅÅ´´ÅÊÅž¸¸Âž¾°«´¾ÊÅÏÏ××××××ÚÚ××ÚÚÝááääáÚ¸zQQQQ[bbgiiigbbgbgbgbiggggb__bgiimiwzwrmgbgggimwz[B9,,,+++,,%%,3,,373333333333+++,+++7,9,37,33,3,,79BFMVM93+%%3=Vi¢«¢¤¤wm__QMQQVVV[QV_ir¤¢¤«¤¤««¤¤««¤¤¤¢¢¢zri_VVMIBIMQQQ[[____[bb[bbbgibbg__bggiggbggiiiimgrmmmirrwwmwzmwwzzwzzzwwzwzzwwwwzzzzwmimimmiimmmmrwrrrrwrmzwzwzzzw«¤¬¬´´¬«°¾¾Â´°¬¾¸¾¾´¬´¾¾Â¾¾Â¸¾ÂŸ´¾¾¸´´°´ÂÊÏÑÑÑÑÑ×Ú×Ñ×Ñ×××××ÚÝááääá×¢bQMQV[bgbgggbggigbgggbbgbg_gbigmrrrzmmg__[bggrzmF,+,3++,3+++,77,3,399,339333739,,++,377793,,3,,,,3337=FI[QI=3+,3B[r¤«¤wri[QMQQQQQQVQ[bir¢¢¤¤«¤¤¤¤¤«¤¤¤¢¤¢wrg[VMIIFIQV[V_[_V_bbbbgg_[_bigibgggbigbbigiiimmrmmmrmrrrrmmrrzzzrzzzzwzwzzwzwwzwzwwimrgmmrmmmmzrwwzrrrmwzwzzwzrwzrwzzz¢¤¢¢«¬«««´¸Â¾°¬´´¸ÂÅ´«°¸¾Åž¸°´ÂÅÅž´´¸¾¾´°´ÂÂÊÑÑ×ÑÚÑÑÑÑ×××ÑÑ×××Ú××ÝÝááááݸ[IQ[[[bbbgggiggbggggggbgg__[bgmmrrzrgb_[[V[bmmwmM7,+37%,9%,,%9+3,339773377777,,,,%+,7B73,+333++3,79FMQQMF=,%39[m¤«¢¢zrg_MQQQQQVQVQVV_im¢¢««¤¤¤¤««¤¤«¤¢¢¢zrg[VQMMIMQVV[[___b_[bgir_bbgg_g_bbbbbgbggiiimiimimmmmmrwwrwwrwmwwwwwwwwzzzzrwrzzzzzwmirmimiwmrrrwrwwwzrmzzrwzzwzwwrwzzwz¢¬«¬¤¬´¾Å¸««°¸Â¸´«¸Â¾´¬´¾Â¾¸°°¸°°¬¸¸ÅÏÏÑÑ××ÑÑ×ÑÑÑÑ××ÑÑÑÑ×××××ÝááááÝÏ«wQIV[V_bbgbbigbigbbbggbgbb_b_iimmrzwi[[QVQV[_irzr[7+++,+%++,++,+3,,7,7393,737333+,3+,3797993,,7,7,,,779B9MFMIB9339Qi¢¢¤¢¢wrb_VMVMQ_VQMVVV_irz¢¢¤«¤«¤«¤«¤¤¢«¤¢¢¢wmi_QQIIMIQVV[V_b_b__bbigbgbbb_igb_g_gbigggigiimrmziwrrrmrrrrrrwwwzwwwwzzzzzzzzzwzwmiiiirrmmmmwwwrwwrizzmrzwzrrwimzzz¢¢¤¤¢¬°´¸°´¸¾Â°´¸¸ÂÅ´¬´¸Âž°¬´°«¤¬¾ÂÊÊÏ×××××ÑÏÏÑÑÑÑÏÑ×ÑÑÏÑÑ××××ÚÝááááÚϤgMMQV[[bgbbgbgbggbbbbbgbb_[_girrrwi_VMQQMQVgrwiB3,3%+%% %+++++,3379377s3,,,+++,%,397933+%,3+3,3,39BBFIBMF9,,BQmz¢zrg_VMMVQVVVVVV[[bmrz¤¤¤««¤¤«¤¤¤««¢¢wirgVQIIIIMVV[[[b___bbbbg[gbgbbbiiigb_bgbbgggbgmmmmmrwrrmrrzwrrwzrwzzzzwrzzzzwzzzzrmmmmgmmmmmrwwzzrrwrrwzzwzrrwzrzzrmzwwzzwzzz¢¤¬¬´¤«°¸¾Â¸¾´°¾¾ÅÅ´°¾Â¾¸´°¬¬««¬´ÂÊÑÑ×ÑÏ×Ñ×ÑÑÑÏÏÑÑÑÏÏÑÑÑÏÊÏÏÑ××ÚÚáááÝáÝÊ[QVQVV___b_bbbbbb_g__bgbb[_gmmmwri[VQûFQ[iwiQ33+, % ++,7+,37733777,393,333,+,7+,373733,,,3,,7337=FIIIBBB=FQgwwi_VQMQV[VV[QVVV[_grw¢¤¤«¤¤«¤«¤«¤¤¤¤¢¢rrgg_VQIMQQVVVV___b__bbbg_g_bb_gimgiigggg_imggimmrmrmrwwrrmwwrwzrrwrwzzwzzwzzzwwmgimmirrimmmiwzrzzwmzzwwzzwzrzrmzz¤«¤¤¬«¤«´¾Â¸°«¸¸¾¾Â¸¾¾¾Â¸´¬«¬¬««°¾ÅÅÏÑÑ×Ñ×ÏÑÑÏÑÏÑÑÏÏÑÑÏÑÏÑÑ×ÏÏÏÏÑÚÚ×ÝááÝááÚ¸wVMQVVV__[[_gbbbbgggb__bbb_biirr¢zi_QF9B=M[gmwwV7++ ++,%+++++,,97397777,77733,,%+,33799933++,+3,7373=FMQMB=7=I[iw¢wmbVMQVVVVV_VVVQ[[[grw¢¤«««¤««««¤¤¤¤¤¢¤zrib[VMMVIQV[V[_[[[[bbgb_gb_gbggmggbbgbbbgggiiiiiimrmmrrrrrrwrrwrrwwzzzwwwzzzzzzzwriiigmmirirrzrzwrrrrwzrzzwzzzwwwrmzz¤¤¬¬«¸Â´¤¤°¸¾¾´¸°¾Â¸¤¢««¤«´¾ÊÏÏÑÚÚÑ×ÑÑÏÏÏÑÑÏÑÑÑÑÏÏÑÏÏÏÑ××ÑÊÊÏ××Ú×ÝááÝÝáѤmVIMMVVb[_b_b___big_bb[bVbbirmrwgbMB7999BV_rmz_7++%%%++%+%%,+,,337;7739773++%%,377799,,,+37+39BMI=BFQ[=F=9IQgwzrg[QQQV[V[[[_[VQ[_bir¢¢¤¤¢««¤¤«¤¤¢¤¤¤¤¢zrmb[QMIQQQQ_V[[_[b_bbb_ggbgg_bmgiggbgbbgbgggmmmimmmwmrrrrrwwmrzwwwwzwwwrzzwzzzrriiggmgirrrwwrzwiizzwzrzwzzrirrmwzzww¢¤¢¬¬´¬°´°´´¾´¬°´¸¾¾¾¸«¤¬¾ÅÊÑÑÑ×Ú×ÑÑÑÊÅÊÊÊÏÏÑÑÑÑÏÊÏÑÊÏÏÑÑ×ÑÊÏÑ×××ÚÝÝÝÝÝÚÅ¢mMIQQQV[[_bgbbbbg_[b___[bbgirwzzmbMB=7,39M[bmwzmF7+,%%%++%+%+,3,799373,7733933,,++,737977,3,,+,3,9ÿQB=FVFBFBI[iwri_[VMQV[V[[[[QQMV[bim¢¢«¤¤«¤¤¤«¢«¤««¤¢rib[VMMFMMQQV__[__b_b_bbgbgiggiggbgggbgggibimiiimriirmrrrrwwrmzwwzzzrzzzwzzzwzzrwmmmriimiirmmrmmzmiwzzrwrrzzwrrzrmwwwzzz¢¢¤¤¬¬¤¢¬´°¾¸°¤°¸¾Â¸°«¬«¬¾ÂÊÑÑÑ××ÑÑ×ÑÏÏÏÅÅÊÏÑÏÏÊÏÏÏÏÊÏÏÏÏÏÏ×ÑÑÏÊÏÑÑÑ×ÚááÝÝÚÅiQIMVVQ_[[bbbb_bb_g___[_ggiwwrgVF93,77BQVgwwzmQ7%+%%+33%,%+3,,799937977777373+3%,399=7,,,,%++,,7BB=FFBIVIIBQ[izrb[VMVVVV[V[VVQV[Q[_imz¢¢¤¤«¤««¤¢¤¤¤¤¤¤¢rri_VQMIIMQVVV_[V_bb___g__gigbggmggibggbgbgbimmrirmimwmwzrrrwwwrwzwwzwwzzzwzzzzwmmrrgmgirimmrwrwimmzwwzwwmrmmzirwmmwwrzzrz¢«¤¢«¬¸¸°«¬°´¾Â¬¤¢¤¸ÂÅÊÊ××ÑÑ×ÏÏÏÏÏÏÊÏÊÅÏÏÑÏÊÏÏÏÏÊÊÏÏÊÏÏÊÑ×ÏÏÏÑ×ÑÑ×ÝáÝÚÝÚÅ[IQMMV[VV[b__________bg_gmmrzzmiQI=3,379FV_mrw[7,%3++%,,+3,7979,w733,+,,++7=99733,,333,y99¿BIQIIMVgrrb[[QQVVQ[[V[[[VV[V[birz¢¤¤«¤«¤¤¤¤¤¤¤¤¤¢wmib[MMIIMQ[[[_[____b_[bibggg_iiiggbggbggbgiiimmiiirmrrzrrwwmwwrzwzzzzrzzzwrzzzrgmigimiiriiwmrrriwzzwrwwrmwwmrrriwzzwwzzr¤«¤«°¸¾«¬´°°¾¾°¢¬´ÅÏÏÏÏÑÚ×ÏÏÏÊÊÊÊÊÏÑÏÅÅÏÑÏÏÏÏÏÏÏÊÊÏÏÏÏÊÊÏÑÑÑ××Ñ×ÚÝááÝÚÝ׬rVMMQQQ[[[VV[gbbb_bb____ggmrzrb_Q93++,7BM[girzgF,+%=IF9+,++,397w77799,737,,3,,+7797,3+,,3++79=FMMIMQQ[grwmb[QVQQ_V_V[[[VVV[QVbgmr¢¢¢¤¤¤«¤¤¤¤¢¤¤¢¢¤¢zrmb[MIIMMQVV_V__bbbb_bbi_gig_ggggg_gb_ggbgmgiiiimmirrmrrzrwrrwzzwzwzzwzwrzwzzzmimriiimmrrmmrrwrirzwrrzrrzrzwzrgiwwwzzzrz«¢¤«°¸´¬«´´°°¾¬¢¬¾ÂÅÊÏÑÏÏÊÑÑÏÅÊÊÏÊÊÏÏÏÏÏÅÊÏÏÑÏÏÏÏÊÏÊÊÊÏÏÊÏÏÑ×Ú×ÚÑÚÝÝääáÝÝÚÊgMIQMQQQVV[V[_[V___[V_bgimwzrg[M9,+%3,9IVbirwz¢iF3+,3QV9,++37737733,77797,3,,,+37779973,3,,733,9=7»IMIMBQ[gmzrg_MQV[V[__[V_[QQ[VV[_gr¢¤¤¤¢¤¤«¤¤¤¤¤¤¢¢¢zmbb_QMMFIQVQV[_b__b___bb_bg_bbbbgbgb_gbibgiiiiiiimmiwirwrrwrrwwwwwzzwzwwwzzzzwiimmgimmrrzmrrwriwzwzwwwrwwzwizzibgrrrzzw¢¤°´°¬¤´´´´¬¢¤¢«¾ÅÊÊÊÅÊÏÏÏÏÅÏÏÊÊÏÑ×ÑÏÏÊÊÏÏÅÊÏÏÏÊÏÏÊÊÊÊÅÊÑÑ×Ï××××ÚÚ×ÚÝáääáÝÚÚÂ[IIMIVQVV[[[[VV[[[[__bggrwzzwg_M=,,+,,9FQbbirww[9+33++3,,,,,+,3,37337,33799733+,+,333,,3,3,773377=I=FMIQQVbmz¢zzwibVVVQQ_[[b[V[[[[[[VVVgmz¢¤¢¤¢««««¤¢¢¢¢¢¤¢zzmg__QMIMQV[[[[_b_bggb_[g_bgb__ggb[bgbbbigimiggiimwrrrmzrwwrwrwwzwrzrwzzzwzwwzrmmiimmmmrmwmmwmmiwwwzrrzwzwrrrrwmimwwmzw¢¢¬«¤¢«´¬¸°¤°ÂÊÊÏÏÏÏÊÅÊÏÊÅÅÅÏÑÑÑ××ÏÏÑÊÅÊÅÅÊÅÊÊÅÅÅÅÊÏÑÑ×ÚÚÏÑÚÚÑ××Ú×ÝÝÝáááÝÝÚ¾MFIMMMMVQVV[VV_[[[[_bggrw¢wi_I73+%,379QbbiiwzgB++,%+,%3,%++,+7737373,37333,,,,,3379û,,337937,33,3B=BIIQQQVbmz¢zzmbVQQVVQVib[[[[[V[QVVVbbrw¢¢¤¤«¤¤¤¤«¤«¤¢ziibVQMIVMQV[__b_bgbgbgbg__gbb_gig_bigbbbgiimgiimimmzwmwmrrrrrzwwwwwzzzzzzzzwwrimiimrzrrmmmzrrwrwwrwrrzrbmwrimmrmwzwwzz¢¢¬¤¢°´°«¬¢«ÂÏÏÏÏÑÏÏÏÅÂÅÊÏÊÊÊÚ×ÏÏÑÑÏÊÊÊÅžÂÊÅÊÊÅÑÏÚ×ÚÚ××Ï××ÑÏÑÑ×ÚÚÚááäÝÝá׫_VQIIIIMQVMV[V_[[[V__girwrbVM=,%%%+7=IMggrwzrQ9%%%%%,,+%++33337773377,3,+ ++,779¹,+,33373377399BBQMMM_grz¢¤¢rri_QVM[V[[_[[[[V[_VMVV[bbiz¢¤¤¢««¤«¤««¤¤¤¤¢rmgb[QMFMMMVVVb_bb__mbbbb_bbgbbgbbgigggbbgiiggiiiiirmiwrrwzwwrwrwwrrwwrwzzwrrrrmmimmwwmmrimwmrwwwrwrzzmimrmbgmrrrwrwzzz¢¤¤¤´¸´«¬¾¾ÂÑÏÏÊÏÏÏÏÊÅÂÊÏÏÏÊ××ÏÊÊÏÊÊÅÊÅžÂÂÅÏÑÑÊÑÏ×Ñ××ÑÑÊÏÏÑÏÏÏÑÏ×Ñ×ÚÝÝÚÝÝÂi[MMIFQQQMVQQVQVVVb_girwwmgVM=,% ++37FMgbgwzb=+++% +,+++33337937977397773%,+%%,,79793,+++3,333,,97y=IIM[irz¢¢¢iigQMQQ[VV[[[V_[[[V[VM[Q_gmw¢¢¤¢¤¤««¤¤¤¤¤¤¢wriw[QFFMVV_[V___gV_bigi_bbgbbg_gbgiibgg_gigbggimmmmwmrwwzwzrrrrwwwwwzzwzzzzwwzrrmirzmiwwrrwmrrwrwzrzzzrrrwmmrrrrzzwwzzrzzz¤¬°´¤¬¾ÊÊÅÏÏÊÊÊÊÊÊÊÊÅÅÏÑÏÊÅÏÑÏÅÅÊÊÂÂÊÏÊÅÅÏÅÑÑÑÊÏÏ×ÑÏÊÊÏÅÊÊÏÏÏÏÊÑ×ÑÑ×××ÚÚÝ×´zbVMMIIQMIV[Q_[QQV__imwzrb[I93%,B7++9Q_biirmI97,% %+,,,3,39777=733933,,,+%%3379,++373373777=I9=7=FMVbrz¢¢¤bb[VVVVQV[[__[_[[[VVQQ[_[giz¢¢«¢¤«¤¤«¤¤¢¤¢«¢zmib[QMIMMIQ_[V_bbbgbbbg[ibbgbb_ggbbbggigiigiigimirmrrrrzrrzrwzwwwwwwzwzwwzzrrzrmwmmziimrmrmimzrrzwmzmimrrizrzzwrwzzzzzwz¤««°«¤¾¾¸ÊÏÊÊÊÅÊÊÊÏÊÊÊÏÏÅÏÏÅÂÅÊÅŸÅÅÂÅÏÑÏÊÑÅÏÑÏÅÅÂÅÅÅÅÅÊÏÏÏÏÏÑÏÑÑÑ××ÑÑ×ÚÝÝÝÚϸiVMFIIIMMQQ[[V[__imrbVM93++ +9B=9V[_gmwr[3++,%%+%%%+,,739999=3,7373,,,3,++3993,,,,77779999=B=9=FQbm¢¤¢¤bbVQVV[VV[[b[_[[[_[VV[V[ggiw¢¢¢¢¢¤«¤¤¤«¤¢¢¢¢zmib[QMMIMMMVV____bbgg_ibgggbbbb_bbbggibmiggiirigmmmrrrzwzrwrwrrzwzzzwzwzzwmrrrrrzwmmmmrirrrmmrwmrzrirmwrzzimizwzzz¤«¬¢zz°´ÅÅÂÅÊÏÊÊÅÂÅÊÏÏÑÑÏÊÂÂÊÊÊžÂÅÂÂÅÏÅÏÑÏÊÏÅÅÊÅÅÂÅÅÅÊÅÊÅÏÑÑÑÑÑ×ÑÑÑ××Ñ×Ú×ÚÚÝááÝÏ´bFFBIIMIVVQVVV_bgmw¢rg[Q73+,+,39M_bgzzzg=%+ ++%%+%,33,÷77777737393,,,+3+377,,++379379339979=FFVgz¢«¢¤¢[[VQQ[Q[[VV___[[V_[[VVQV[iizz¢¢¢¤¤¤¤¤¤¤¤¢¢¤¢¢zrib_QIIIIMMQ_V___b_b_bbb_bgbbgb_bbb_gbbgbigiggiiirmmrrwwrrrzrrmzrrwwzzzzwmirimmrwwwrrmmmrmwwrwwzwwrrwwwzzwwwzzrzwzzz««z¢¸¾¾¸ÊžÂÊÊÊÊÂÂÊÏÑÑÑÏÊÅÂÂÊÏÊž¾ÅϾÏÅÏÑÑÊÅÂÅÊÅÅÊÏÑÊÊÏÊÏÏÑÑÑÑÏÑÑÑÑÑÑ×××××ÚÚÝááÝÚÂ_MQMFFIQMQMQVbbgmwzzrbVQ93,,,,+ ,,3=V[biwziI7,,,%+%%+%+3+9399y9977733,++%,,,39=7,+,+3,,7937,779B9B=FQbm¢¢¤¢¤¤¤¤VVMVQ___VV[[VV[V[b_VVVQ[_biwz¢¢¤¤¤««¢¤¤¤¢«¤¤¢¢zri_[QIMIMMQVQ[___bb_gibggbgbgggbbgbbggigggggiirmmmmmmrwwrrrmwzwzwrwrwzwzwmimrimmmwrwimiiirmrrrzwrrmmzwzzwrzrzzzr¢«¢«¾Åž¾Å¾ÂÊÏÊÅÂÏÏÏÏÏÊÊŸÅÊÊÊžÊÑŸÅÅÅÅÊÅÅÊÊÊÊÊÊÏÏÏÊÏÏÊÏÏÏ×ÑÑÏÑÑ×ÏÑÑ××××ÚÚÚÝáááÚÂmiQ=FIMQQQVV[bgir«zig[Q=3%+%%+++33=FM_brwwV3+%+%%%%+,+++3s397B97733397++%,39B9973++39,,977937799»FM[m¢¢¤¤¤¢¢¤[[VVV[V[[[[[[[[[_[[VQVV[bbrw¢¤¤¢¤¤¤«¤¢¤¤¢¢¢zrib_QMIMIMV[[V[b[__[gggbbb__ggbbbgg_ggimggbgigimmmmmrrrwrwrrwwwrwwzrrwzwriiimimmrwwrmwrmmmmmmmrwzmrrwrmzzmwzrrzz¬¾ÅÅÅž¾¾Å¾ÂÊÏÊÅÂÅÊÊÅÊÅÅÅÅÂÂÊÏÊÅÅÑŸÂÅÅÂÂÊÏÏÏÊÏÏÊÏÏÏÏÏÏÏÏÏÊÑÑÏÑÏÑÑÑÑÑÑ××××ÚÚÚÝÝááÝÅwVBFFIFMQMQV_gmrzzzri[M=73++ ++73=MVbgrb=,% %%++%%+,,,,,7999777977737,,+,,377773+,333,,97379399=M_iz¤¤¤¤¤¤¤¤¢[[[QQ[[[__V_[_[[__[VV[V[_gmr¢¤¤¤¤¤¤¤¤«¤«¤¢¢¢rmb_VMIFMMQVV[[____gb_bb__b_bgbbbgbggigbbigggmmmmrmmrwwwwwwwwwwwzwzzwzwzzrimrmgimmmrwrmrmrrmwrimrmmrrwrwrrwzwrzwz¤°¾ÅÅÅÅÅÅ´ÂÊžÂÊÅÂÂÂÅÅÅÅÂÅÅÅÅÅÏʸÅÅÂÅÏÏÊÂÅÏÑÑÑÊÏÏÏÏÏÏÏÑÑÏÑÑÏÑÑÑÑÏÑÑ×ÏÏ×××Ñ×××ÚÝÝáäÚÅbBBBBFIMMV[_bir¢zig[QB3,+3+% ++,,9FV[igwrF,3% +%++%++7,7,7B7793737797,,3,3,799BF97,,,9=,37373773797=M[rz¢¤¤¢¤¢¤¢¢[[V[V_[_[[_[_[b[VV_VV[[[bgmr¢¤¤«¤¤¤¤«¤¢¤¤¤¢zmibbVMIFMQQVQ[_[_[_bb_bgbgggggggbgbggbg_bgggiiimrmmmrwrwrwrzwwzwrrrwwwzwwiirmigbimmwwwrmrwmmmrwwrirrmwwrizmwwzzzzwz¾Â¾ÂÂÅÅÂÅÅ´Ïʾ¸¸Âž¾¾¾ÅÅÅÅÊÊÊÅʾÂÊÊÅÏÑÑÊÂÂÊÑÑÏÏÑÏÊÏÏÑÏÏÑÏÏÊÏÏÏÑÏÑÑÑÊÊÑÑ××ÑÑÑÑ××ÝááÚÂI¹FFIMVV_giwz¢zmg_MB7+73++%+,3+7=M[[_mwV7+++%,++++3+3+379773373779733+++7,797373+,,39773337377,97=MQi¢¢¤¤¤¤¤¤¤¢QV[V__[__[[__[b_[[_[[VVbbgmz¢¢¤¤¤¤«¤«¤¢¤¤¤¢¢zrm_bVMIMMQQ[VV__b[b___[__igggbgg_gbbbggbbiggggimrmgirrwwrwrwwzzwrwrwrrzzrrmi_gbbgigiwzrwwrrmmrzrwzwwmwmrrzzrmzzzw«´´Å¾ÅÅÂÊÅÊž¸Å¾¾¾Âž¾¸ÂÊÅžÂÊÊÊÏÏÅÅÏÑÑÊÅÂÏ×ÏÏÏÑÏÏÏÏÑÊÑÏÏÊÅÏÏÏÏÑÏÏÊÏ×××Ñ×ÏÑ××Ñ×áÝÝ×´rwÿIQ[[bmrwrb[MF3,,+++%%%,+,39I[_gzzbB,,+%+,,3++,,7,3373973,337F33,3,3333933,+++,3333=73,73739FVgz¢¤¤¤¢¤¢¤¢¤VVVVQ_[__[_[[[_[_[V[VV___br¢¢¢¤¤¤¤¤¢¤¢¢¢¢zmi[_[MMMFIQQ[__b[__bbg_b_ibiiigb_bbbbbgibbgggriimmirmmrrwwrzwwzwwmmrrr¾rgg_migbimbimmrrwrwmiwmirmrwzrimwrwwzwwzzz¬¬°°´´Â¾ÂÊÊÅÅÅÊ´¸Åž¸¸¾Å¾¾ÅŸ¸ÂÅÅÏÏÏÏÏÏÂÅÑÑÑÏÅÅÏÑÏÏÑÏÏÏÊÑÊÏÏÊÊÊÑÏÑÏ×ÑÑÏÏÑÑÚ××××Ú×ÑÚÚ×Ýáפ[999BFIQV__mrzwi_[B9,,,++++%+%+37BI[grzzrQ,+++,%+3+,3,37,973737777977333,,,3=9=,3+,+%3733,3B73,33,9=Mgw¢«¤«¢¤¤¢¢¢¤VVVQV[[_[___[___[_[_V[[_gimr¤¤¤¤¢¢¢«¢«¢¢¤¢wri_VVQIMIQQVQV[b____[_gg_bgggg_bb_bb__bgbgggiigimmrmwmmrrwwwwrwzmwwrr°Âmbbigimgbiimmrmrrrrmmmimrirrmirrrizzwzwzzzrzzzzw«´¾¸°°°°ÂÅÂÅÏž¸¾Åž´´¸ÂÅž°¾¸¾¾¾ÂÊÊÊÊÏÏÏÏÊÂÅÏÑÏÏÊÅÏÑÊÊÏÊÅÊÏÏÑ×ÏÏÏ××ÏÏÑÏÏÏÏÊÏ×Ú××××Ú×ÝÝÑÝÝÚÅF»FFMQV_imzri_VB9,+,+33%+%+%,3=IV__rwwV7%,+,+++,%+7+,37793777³w3,,,,+337+,,3,73,373,7799F[mz¢¢¢¢¤¢¢¤¤¢¤¢¢VV[VVb[b[_V[[[__[[V[[[[[bgrw¢¢¤¢¢¢¢¢¢¤¢¢¢¢¢wrib[QMMMIIVVV__[[___b__b[bigibgggbbbbbggggggiiimmimwmrmwrrwmrrrrmrimr¾¸wgbgggimibrimrrirrmrmrwrrrwrmmrrmmzzzwmzwwzwww¢¾Â¾¸¬´´¸¾ÅŸÊʾ¾ÂŸ´ÅŸÂ°¬´¸ÂÅÅÅÊÏÏÊÏÏÅÏÏÊÅÊÏÏÑÏÅÅÑÏÊÑÏÊÏÏÑÑÑÏÏÊÏÏÏÏÏÏÏÑÏÊÊ××Ñ×××Ú×ÝÚ×ÚÚÚ×°V=BBBMQ[_bmwwi_QB93,,3,,3%3++,+,BFQ[iwwgB7++,,+,,+3++3,7739933s73737,3,73337333+,,773973,,7,+,9=IViz¢¢¢¢¢¢¢¤¤¢¤¢¤__[V_[[[_[[_V[QV[_[VV[[Vbgrw¢¢¢¤¤¤¢¢¤¢¢¢¢¤¢¢¢¢zrmbb[MMMMQQVV[[_[V_bbgbb__gbgbggbgbbbg_ggibigiiimmmwrrwwrrwmmwrwrrmrrÅ«wgbbbggirggmrwrmrmmmrrmrzwimwwrrrwzzmwwrzwzzw¢¬¬´Å¾¸´°¾¾¸¾Ê¾ÂŸ¸Âž¸°Âʾ¸¬¸´¸¸ÂÅÅÊÅÅÅÏÊÊÏÏÊÏÏÅÅÏÑ×ÑŸÑÏÏÑÑÏÊÏÏÑÑÊÏÏÏÏÏÏÊÊÏÏÊÅÊÏÏÏ×××××ÝÝÚÝÝÝÝÂrV[VFBFMVbimwzzri_VB=7++,,+,+%%%%+37BM[bmwzrI3+,%++++%+,93,3393797979373=3,+,37933,37377=9737+++,7MViw¢¢¢¢¤¢¤¢¤¤¤[VV[V[_g[[b_[[_[[[[VV[VQ_gmwz¤¢«¤¢¤¤¢¢¢¤¢¢¤¢wmib_VMFFQVQQV[V[_[_bbbggbbbbbbgibg_gbgbgbggiigiimmrrrwmwwrrwrwrmmmrm¸Å«mb[giiirmgmrmrimwrirmrmwmmmrrwrzzrzzzzzzzzzrzrzwrw¢¬´°¬¾Å¾¸¾¾Â¸°Å¸´Â¸¾ÂŸ´Â´´´ÂÂÂÂÅÊÅÊÊÂÅÏÏÊÅÏÏÏÑÑÊÂÑÑÏÅÂÊÑÏÊÏÏÏÏÏÏÏÊÏÏÏÏÏÊÅÅÊÊÅÊÊÑÏÑ××Ú××ÚÝÝÝáÝÝѤzbQ7FIIQV_mwz¢zri_VB93,,,,+,,+,%+,,,7FMVbirzzz_7++++,++3+,,7337973,,,7733793,,+,73779737++7,779737,,++,99Igz¢¢¢¤¤¢¢¢¢¤¢¢[[V_[[[[_V[V[[__V[VVQ[VQ_grw¢¢¢¢¢¤¤¢«¢¢¢¢¢¤¢wigVVMMIMM[VQVV[__[_bb_gbbggggbgbggbbgbg_ggmmirrrmrrrrrwmrwwwwrriimmÅÅ«ibggbrwbgiimiiirwimwmwrwmmzwwzwrzwwzwzzzrzzrgrmmz¬¤¬¬¸´´ÂÊž¸Â¾°¸¾¾´¸Å¾ÂÅž°¬¸¾ÂÂÅÅÅÅÅÂÅÊÊÊÂÅÊÏÊÊÏÊÏÏϾÊÑÑÏÅÊÏÏÏÊÊÏÊÊÏÊÏÊÏÊÊÊÏÊÊÊÏÏÏÏÑ××Ñ×ÚÚ××ÝÝááááÝÏ¢mI7=IIQVbmzzmi[VF97,,+,33+,%%++++37BM[birwgB3+++%+3%+,3333,333397797,73+7779799,+3,,777=9,33,% +,3F_r¢¤¢¢¢¢¢¢¢¢¢¢___[[[[__VV__[[___V[V[_V[gmrz¢¢¤¢¤¤¤¤¢¤¢¤¢¢«¤¢zrib[QMFIMQMV[QVVb___bbb_bbbggbggigigggggigimmmrmmiirmmrrmrrwmmmiiirw«Ï¾¢rbibbggggmmimmmrmiriimwrrwrwzzwwzwwwzzzzwzmmmrm°¸¬¤¬¾Â´ÂÊʸ¸Â´´´´Â¾¸Âž´°°«°¾ÅÅÂÂÅÊŸÂÂÊÊÅÂÂÊÏÊÏÊÊÏÏÅÂÊÑÑÊÊÅÊÏÏÊÏÏÊÅÊÅÊÂÅÂÊÑÑÑÏÏÑÏÊÊÑ×ÑÑ×××××ÝáÝáäáÚÏ¢b97FFM[bmzzmi_QIB373,,++3,++%%+%+,=BM[_giz¬°¸ÂÂÊŸ¢¤¬¢rI,++,3++73++,337999B7333s9977373,393393,,777399973,++ 39_g¢¢¤¢¢¢¢¢¢¤¢¢¢[Vg_V__V___b_[__[_V_QQ[V_biw¢¤¤¤¤¤¤¤¤¤¢¢¢¤¢¢¢wrm_[MQIFQVQVVVV[g______[_bbbbbmigbbgbbbiiimmigimrrmmmwwwrwmrmrmmimrÏÏ´rbggiigiiiimgmiirrrimwmrzmrzwwwzzzmrzzzwziiwgz¤°¾´´°°¸Å´ÅÊÅ´°¸¸¸´°Â¾¸Â´¬¤¬¸ÂÅÅÊÅÂÂÊÊž¾ÊÅÅÅÊÏÏÏÏÊÏÏÊÅÅÊÑÊÏÊÊÏÑÏÊÏʾ¾ÂÅÊÊÊÊÏ×ÑÑÑÏÏÏÏÏÑÑÑ×××Ñ××ÝÝááäáÝÅ=7=BIVbmwribQBs,+++,3+,%3+%%%+,7BMVb¤ÂÂÊÑÚÚÚÚÑ«¬°ÅÅ«r[7,+%%+,,+9373,77,797733,9379s,9339777+,,77793373373,%+,9Qgz¢¢¢¢¢¢¢¢¢__[b[[[_[V[[[_[[[VV[VMQV[bir¢¢¢¢¤¢¤¤¢¤¢¤¢¤¢¢¢zwmg[QMMIMMVVVV____b[[b__b_ggbggigbgibgiggmmmimgmimrmrmwrwrrrmmirgiz°×Ŭwbbgmiiibgiiirmmimrrrrrmmmzwmrwwrzzzmggiz«¸´´´¸¾¾´¸Â¸´¾¾¾°¸¾¾¸´¸Â´¬°¬¬¸¸¾ÂÅÊÅÊÅÂÂÅÊʾ¾ÅÊÊÅÊÏÏÏÏÏÅÊÊÏÊÊÏÏÏÊÊÊÏÊÅž¾ÅÏÏÊÏÏÏÑÑ×ÑÏÊÏÑÏÑÑÑÑÑ××Ñ×ÝÝÝááááݰ[7=BIQ_imwg_Q=3+,,,3,+,++,%++ %,,=Mi¾ÊÊÑÚÝÚ×××Ïž¸ÅÊÑÏ«[=,,,,++,3,3,+3,77373797779BB997,9977,,7,+3,3399993,,,,,,,9Mbr¢¢¢¢¢¢¢¢¢¢[[bb[V[[[V[[VV[QVVVVQVQV_giw¢¤¤¤¤¢¢¤¤¢¤¢«¢¢ig_[QFMIQQQ[__[____[[bbg_imbbbibgb_bgiiizrmimiiigmirmmmwrmmrriiiiÅѤrgbbmmiggiimmmrmgrrrrwmiiimbrzrrwzwzzwrmzwmir¢¤¬¸°¸¾¾Â´°¸Â´°´¾¾¸¾¾¾¾´°´¤¢«´´¸Å¾¾ÂÂÂÅÊÅÂÂÂÊÊÅžÂÊÊÊÂÏÏÏÊÊÊÅÊÊÏÊÅÏÏÊÊÂÅÂÅÊÊÊÅÊÊÊÏÏÏÊÊÑ×ÑÏÊÊÊÑ××ÏÑÑ×××ÚáááááÝÝÅg33BI[_imwb_VI973%+,,,,+,,% % %%3Ir¬ÅÏÑÚáÚÚÑÏÏÂÂÅÏÑÚ×ÚÚ×ϰrF,++,+3++7B7+33737737979»733399793,3,,373797733+++,79M[r¢¢¢¢¢¢¢¢¢¢[[_VV_V[[[VVVV[[VVQQVVQV[biw¤¢¤«¤¢¤¤¢¢¢¢¢¢¢zzrg[QMIIQQQMQV[[_[[[____bb_b___b_b__b_gigbgggirimmmimrwirrmmmmmigmÑϾ¢i_bgigiiggibiirwrrrrrmmmmigmzzmmzzzmbiwrrriw¤¬«´Â¾¾¬¬¸°°°¾Å¾Â¾ÅÅ´¤¤¬«¾Â¸¾ÂÂÂÂÅÅÅÅÊÂÂÅÊÊÂÂÂÊÅÊÂÂÊÊÊÊÏÊÅÅÏÊÅÅÅÅÂÅÅÅÊÑÑÏÊÅÅÏÏÏÏÏÊÑ×Ñ×ÏÅÅÊÑÑÑÑÑÑ×××ÚÝááááÝÑB9=MQ[iwzri_QI373,3+,3+,+%+ % %3B´ÑÑ×Ýá××ÑŸ¾ÂÏÑ×××××ÚÝÝÊ=++%++,++++,+,+39933777373373773,773773,7+7377=7,,+%%%379M[m¢¢¢¤¢¤¢¢¢¢¢¢¢VV[_[_VV_Q_VV[V[V_[VQ[VV[ggrz¢¢¢¤¤¤¢¤¢¤¤¢¢¢¢¤¢zrmb_VIFFMMQMVV[V[V_[_bVb[__bb___b_bggg__bgbbgimiirmmrwrmrmrmmigmbz¾ÚÊ´wi_bgigibiiimiirwrzwmrizwiirwwmzzzwrzmrwzzmrmm¬«°¬¤«°Åž¾¸°¬«¬°¬´¾¸Å¾«¤«´¾´´Å¸¸Â¾ÂÂÅÅÊÊžÅÊÅÂÅÅÅÊÂÂÂÅÊÏÏÊÊÂÅÊž¾ÅÊÊÏÊÅÏ×ÑÏÊÅÅÊÏÏÏÏÏÏÏÑÑÏÊÏÏ×ÑÑÏÑ×Ñ××ÚÝáÝáÝÚ¬Q7=FQ[grzmigQF9,3,,,,,,%+++%3%%,F¸Ñ×ÚÝÚ×ÏŸ´ÂÏÏÏÑ××Ú×ÚÚÚÚÑ´M %%+,+,+,37+397=By79=,39373,979777973,,3397F=7,+%%+,,=[iz¢¢¤¢¢¢¢¢¢¢VV[VVV_[[[[[V_[__b_QQMVQVbiwz¢¢¤¤¤¤¢¢¤¢¤¤¢¢¢¢¢wrgb_MFBBIMMQQV[[QVV[______b__b___[_bbb_ggmggggigiimiimmmmrmiigbgb××ʤzigbgmigbgmmmmrmrwzrgmmwrwrmgwzzwmizwzwmmzzrrmrrw«¬°°°¬¬Âʸ¸°¸¬««¬°°¸ÂŸ¬¬¬¸¸¸ÅÅ´´Â¾¾¾ÅÅÂÅÂÂÅÊŸ¸ÊÊÅžÂÂÊÅÅÂÅÏÊÊž¾ÂÂÂÏÏÏÑÊÊÊÏÑÑÏÊÂÅÊÏÏÏÏÏÏÑÑÏÑÏÑÑÑÑÑÑÑÑ×××ÝäÝÝáÚÂz=FI[bmwzmi_VI93+,+,++%%% % %%,MÂÏÚÚÚ×ÏÊ´´¾ÅÏÏÑ×ÚÝáááááÚÑ×Åm%%+,,,+,,,,3337773733BBM73+3737737793733,77B9¹7+3++,3F_w¢¢¤«¤¢¢¢¢_b[V[V_[[VQVVV[[[[VVVQ[QQggm¢¢¤¢¤¢¤¤¢¢¢¤¤¢¢wmibQMFBIIQQVQVV[VV__[_[bb_b_bb_b_b_bbg_gbgggiggiiiimimmmimmmgbbim¢ÝѾzmi_gibbiiigrmiirrwmmwmrrwwmmwmzzzzrrirwzmbbgm¤«¢¢«´´¸´¬¸Ê´¬¬°°´°¬«¬´¾´´««¬¸Â¸¸Â¾´´¾¾¾Âޞ¸ÂÏžÂÂÅÅÅÅÅÅÊʾ¸¸ÂÂÅÊÊÏÏÏÏÏÅÊÏÑÏÏÊÅÊÊÊÏÏÑÏÏÑÑÑÏÑÑÊÑÑÑÑÑ××ÑÚááááÚÏM9BIQ_mzzwmgbM,+++,%+%%%% ,7m¤ÅÏÚáÚÑʾ°¸ÊÏÏ×ÚÝáááääééäáÝÝ×3+%+,+3,,,,37977,7,=7w993333,7797,,3,97393773,%++,FVm¤¤¢«¢¢¢¢¢¢¢__V[[[VV[V[[V[[VV[[VVVQVV_gr¢¢¤¤¢¢¢¤¤¢¢¤¤¢¤¤¤zwi_QQFIFMIQM[QV[V_[____g_bb__b_b__[b_ggbgimiimiiiiiiiiwimmrmiggmzÂÚÏ´¤mgg[_igiiirrimwiimwwrrwrwwwrwrzzrzzzwwzzzzwmgiir««¤¤¬¾¸¾´¤´¾´°««°°°´´°°°¢«¸¸¸Å¾´´¾¸°°¸ÂžÂÂÅÅŸÂÅžÂÂÂÅÅÅž¾¸ÂÅÊÅÊÊÊÊÊÏÏÏÊÊÊÏÏÏÏÊÊÊÏÊÏÏÏÏÏÏÏÑÑÏÊÊÏÑÑÏÑÑ×ÚÚÝááÝ×¾rBBMVbirwmb[MB93,++++% +%++Bz°ÅÑÚÝÚÑ«¬ÂÏÑÑ×ÝÝáááÝäääääääáݾM +,+,%,7,+,979s337s9333,3773733,,93=,777779,3%++=Iiz«¢¢¢¢¢¢¢¢VV[_[Q[[[_[_V_V_[[__V[MQ[gmrz¢¤¤¤¢¤¤¤¢¢¢¢¢¢zzri_MMIFFIIMIMQ[[[[[__bbbbbbbbbgb__bggbgbbiggggmiimimmmmmrmimiggiÚ×°«rib_giiigimrmmigrrwrrzmmrzmrwzwrzzwmiwzwwiiiir¢«¬¤¬«°°¾¾°«¤«°¸´¬¬¤¬°´Â´¢««¾¾¾¾¾¾´°´Â¾¸´¸ÂÅÅžÂÅÂÂÅž¾ÂÅž¾Â¸´¾ÅÅÊÏÊÊÊÊÊÊÊÏÏÊÊÅÅÊÏÏÏÊÅÅÊÏÏÏÏÊÏÏÏÏÏÊÊÊÊÏÊÏÑÑÚ×ÝááÝÚÏ¢_=BV[mwzzmb_QB3,,%+%%3% +3M¸Ê×ÚÝ×ϸ¢¤ÂÑÑ×ÚÝÝÝáÝÝáÝááääéééáÑ++,++3,++,3,3793779777373,,,,73373,+37379333s,++=BIgw¢¢¢¢¢¢¢¢¢¢¢¢VVQ[V_[[[__[___b__[V[[V[[bmrz¢¢¢«¢««¤¤¢¤¢¢¤¢¤¢ri[[MBBIIIMQQQVV_[[[b_b_bbb_bbbg_bgbbbbgbggmgigiiiimmrrrmmmribbi×Ϭ«¢rggibibbimrmribmwwwrmrwwwrwwwwrrzzwwrgrwzrimigw¤¤¬°¬´´¸¸¸¬¢¢¢¢¬°°°°¸´¸¬¢¢«°°°´¸¸°´¾¸¸¾¸¾Â¾¸¾Å¾Â¾¾Ê¾ÂÅŸ¾Å¾¾Â¸´¸¸ÂÅÅÊÏÏÊÊÊÊÊÊÊÏÏÊÊÊÅÂÅÏÏÊÅÂÅÊÊÏÏÏÊÏÏÊÊÏÊÅÊÊÏÏÏÑ××ÚááÝÝÚ¾MFIVirwig_VB33,+%+ %%%%3b¾Ï×ÚÚÑÅ«¬ÊÑÑÚÝÚÝÝÝááÝÚÝÝÝááäééäÝ3+++++,,+33,3379777933,,+33,9,73,33,,,979y,7,,,33FVr¢¢¢¢¢¤¢¢¢¢¢[[VV[VQ[[[[[[__[_b_V[[[V_biw¢¤¢¤«¢«¤¤««¤¢¤¢¢rg[VMIBFIFIQMQ[[___[__gbbibbbibbb_bbggb_gbgibiigiiiirrrmmmiiigiz«×Ѱ¤wibibbg_ibimiggimwrmmmwwmizwirmwmzri_wzzrmmmiw¢¤¬¸¸´´´°¬«¢¢¤¢¤°¸Â¾´¤¢¬¬°´¸´«°¸°°¸¾¾¾¾¸¾¾¾¸ÅŸ´¾ÊÅÂÂÅž¾¾Å¸´´´ÂÅÊÊÅÊÊÏÏÊÅÊÏÊÊÏÊÊÊÊÅÅÂÅÊÊÅÂÅÅÏÏÏÏÊÊÏÊÊÏÏÊÊÊÑÑÏÏÏ×ÚÝááÝÝѰiIIVgmz¢zmi[F7+%%+ % % ,Bi°ÅÏ×××ϸ¢´ÏÑÑÚÚÚÚÚÚÚÚÚÚÚÚÝÝÝÝáééäÝ´B%+++,++,7,,373379F,+,373,,379993,,9,,33333737,373FVi¢¤¢¤¢¢¢¢¢¢¢¢[[_V_[Vg_V__[[g__b[V[[[Q[bmwz¢¢¢¤¤¤«¤¤¤¤¤¢¢¢¤¢wmg[VQFFIFMIIIQVV_b_[[__bbb_bggbgggbbbbbgbgiiiiigiiimrrmrriwiibiÊÚѸriggbbbiigiriimimwwmmmwmrrrimwwmrrbmwzzrirrgi¤«¤«´¸¾¬°¬««¢¤¤¢«¤°¾Â«¤¤°¸¸´¬´´¬¤«´¸´¸Â¸´¾Â¸¾Â¸´ÅÊÂÂÅÂÅ´°¸´¸¾¾ÊÅÅÊÊÅÊÅÊÅÅÊÊÏÏÊÅÂÅÊÊÅÅÂÂÊÊÅÅÂÏÊÏÏÏÊÊÊÏÏÑÏÏÑÑÑÑÏÏÑ××ÝÝÝÝÚÊ[IVbrz¢¢zzm[VF3++% %%+,I´ÊÑÚ×Ï۸ÏÑ×ÚÝÚÚÚÚ×××Ú×ÑÚÚÚÝÝÝäééÝÅ_+++%%,+,37939B3779,3933,33977,+%+333337379733,,9=Fgz¢¢¢¢¢¢¢¢¢¢[[_V____[[[_[[____[[[[V[[grmw¢¤¤¤«¤«¤¤¢¤¢¤¤¢¢wmgbVMQIIIIIFMVVQ[b[[_bbbgb__bggb_gbbbgbbbgggiggimgimmrrrrwwiggiÚ×Ï¢wg_bbbggiiggimmiwwzrriimzrrirzwrzzmmzzwzwiimi[g¤¢¬¬¢°´¸¸¬¤««¤«¢¤¢«¾°¤¬¢°°¸Â¾°´´°«¤°Â¾¸¾Âž°´Å¸´¸Å¾¸´ÅÅÂÂÂŰ«¸ÂÅžÂÊÅÅÊÊÅÂÂÅÅÊÊÏÊÅÊÂÊÊÊÊÊÂÂÅÊÅÅÂÊÏÏÏÑÏÅÏÑÏÑÑÑÏÑÑÑÏÑÏ××ÚÝÝÚÝѸzMQ[mzwg_MF3,% % %%3Q¾Ê×ÚÚÏ«´ÊÑÚÝÚÚ×××ÑÑÑ×Ú×Ú××Ñ×ÚÝáééÝÊr+++,%3+,7,,337,939739,7,3,3+,++%+7,,3999997737,9FVm¢¢¢¢¢¢¢¤¢¢¢¢¢bb[[V_V[_[____bg__[_[QM[[bimz¢¤¤¤«¤«¤«¤«¤¤«¤¢¢wrg[QIQMIMQMMMVV_[b__gggbmbbbbgbi_bgbggb_bggggiiiiimmmrrrzrriigm¬ÝÑʸ¬rbb__igimbiiiimwrirzm_gwwiizzwrzzmirzwzrimwrgg««¬¤´°¬°¸´¤«¢¤¢¤¤«¤¬´´¤¤«¬´¸´¾¾´°¬¬¬«°¸ÅŸ¾Â¸°´¸¸¾´¾Â¸´Âʾ¸¸¬´¸ÂÅÊÊÅÂÅÊÅÅÅÅžÂÅÅÅÏÊÊÅÅÅÊÊÊÊÅÅÅÅÏÏÊÊÊÏÏÑÏÊÏÑÑÏÑÑÏÏÑÏÊÊÏÑÑÑÚÚ×ÝÚÏ«iM[rzrib[=,, % +7_¢ÅÏ×ÚÑʸ¬ÂÅ×ÚÚÚÚ××××ÑÑÑ×××ÑÏÊÊ×ÑÝáäéáÏ,++,+,+,,33379,73333,+,37,33,%+,,973999793373,,=Mi¢¢¢¢¢¢[[[[_[[bbV___b__b[b__VV[_gmmz¢¢«««¤¤¤««¤¤¤¤¤¤¢zrm_QMIIMIIMQMVQ[[__b_bgbbbbbgggibgbbbggiggggggmmrrrrrmwrrrzmiir°ÚѾ¸°r__[bbmiggiigrrwmwrg[brmimzzrwzwrrwzwrzwrmwmgi««¬°°¸°¬««¤¤¢¢¤¤¬¸¸¬¢¢¬°¸°°°´°¸¸´¬°¬´¸°¾Å¸Âž°´¾´¸¸¾Â¸°´¾¬«°ÂÅÊÊÊÊÊÂÂÂÅÅÂÅž¾¸¾ÅÊÊÊÊÊÅÅÅÊÊÊÊÅÅÊÊÊÊÏÏÑÏÏÏÏÑÏÏÏÊÊÊÊÏÊÏÑÏÏÑ×××ÚÝ×ÅQViz¢wmi_b9+% %+Br«ÊÑÝÚÑÊ´°ÅÊ×ÚÚÚÚ×××ÑÑÑÑÑ×ÑÏÑÊÅÏ××ÝáäéáÑ,,,+++,+,3,39933=93,,3,,33+,%+33337,w377,,79Fbr¢¢¢¢__[[[_[[_[_b_b__bb__b_[[[bir¢¢¢«¤¤«¤¤«¤¤¤««¢wribVMFFIFMMQM[V_[[bbbgbbgbbbbggbgbiibbbgbgigiiimmmrmimrimmimggÅ×ϸ¢¢i_[b_bbbgbmiriirrm_V_iwwmrwzzzzrmirwmwrrwigiw¢¢°¬¬°°´««¢¢¢¤«¤´´°¤¢°´¾´¸°¬¬´°¬´¸´´¸Â´°ÅŸ´¾Â¸´¸´´¸¸¸Â°¤¬´¸¸ÅÊÊÅÅÅÊžÅÊÅÅʾ¸¸¾ÅÊÏÊÊÊÅÊÊÊÏÊÏÊÊÊÏÏÏÏÑÏÊÅÊÅÊÅÅÊÊÊÏÏÏÊÑÏÏÑÑÑ××Ú×Ñ«i_mwrr[QF3,+ %,M´Ê×ÝÚϾ«¬ÅÏ×Ú×Ú×Ú×ÑÑÑÑÑÑÏÑÑÊÊÅÏÑ×ÚÚÝäää×++%+%+3,33,33,3777,,,,3337+,+,%,,3+3,37737,,,,=Vm¢¢¢¢¢¢¢[[_[__b___bbb[b__b__i_bb_bmwz¤¤«¬¤¤«««¤¤«¤¢¢wmg_QMMIMMQFQV[[__[_bb__bbbb_bgiggbbg_gbiigmmiiimmmmrmrwrmibibg××ʬ««mb[bggbbmimrmbiim[Vgrrzwwzwwzwrzzmmmzzwzzrwmgiz¢¢¢¢¬´¬°¬¬«¢¢¢¬´´«¤°¸¸¸¸¸´¬¬°¬¬°¾Â¸¸Å¾¬´Â¾´°Â¾¸Â´°´¸¸´¬¬´Â¾¾ÅÅÅÅÊÅÅžÂÅÊÅÅÅž¸ÂÅÊÊÊÊÅÅÅÊÊÊÏÏÏÑÅÏÏÊÊžÂÂÅÊÅÊÏÏÊÏÏÏÊÏÏÏÏÑÑÑ××××Âriwzri[Q=7++,=gÂÑÚÚ×Ϥ¢´ÅÏ×××××××××ÑÏÏÊÂÊÑÊÊÊÏÑÑ×ÚÝááäá×%+%%++,,377w7,,3+++,,33,,+%,+,33,3w33,++37Mg¢¢¢¢¢¢¢¢¢[___b[_b__i_gbb_bg_bbb_[bbiw¢¤¤¤¤¤«¤«««¤¤¤¤¤¢¢zrmb[VIMMMQQQQV[V[[__bbbbbgggigbbgbgbggggiimigmmmmimmrrmrwmigbb××ϸ««rg_bbimiigmimimbQ_iwrrwrwzzrzzwwgwzzrmmbr¢«¤¢¢¤«°°¤¤¢¢«¢«¸´¤¤°°´´´´¸´°°««¬´°¾Â¸´¾¾´¬°¾¾°´¾Â¸´¾Â¸¬«¤¢°¾Â¾¸ÂÊÅÅÅÊÊŸ¸ÂÅÅÅÅž¾¾ÊÊÊÊÊÅÅÅÅÅÊÑÏÏʾžÅÅÏÏÏÏÏÊÊÊÊÏÏÏÏÏÏÑÑÏÑ×××Ñ¢wwrmb_VF,,9V¬Å×Ú×Ñʸ¬¢¬ÂÊÏ××××Ñ×ÑÑÑÑÏÑʾÂÊÏÊÏÏÑ××ÚÚÝááéä×+%%++373379939+,+,+,%+,733,337,,393737,,%%+33BVm¢¢¢¢¢______bbb_bbgbbb_g_bb_b_bgmrw¢¤¤¤«««¤«««¤«¢¤¤¢¢zribQQMMIIMMVVV[[_b_gbi__bgb_ibgbbiggbb_gimiimgmmiirmrrrmmimigmÚÑ׸¸zmi_biiibbriibgbQVmrrrzwmrwwwzwwzzzzwrzwmgbiz¤«¬¢¤¬¤¤¢¢«««¬«¬¢¢«¾´°´´¸´´°¬««°¾¾´Â¾´°´¾¸´°¸¾°°¾¾¸°¸¸¤¤«´Â¾¸¾Â¾ÂÅÊÅÅÊÊž¾¾¾ÅÅÅÅžÂÊÊÊÏÊÅžÂÏÏ´°¾ÅžÅÏÊÊÊÏÏÊÊÂÏÏÊÊÏÏÏÏÑÏÏ×××××Å«zi_QF9=Ir¸ÑÚÚÑÊÅ´««¸ÊÊÑÚ××××Ñ×ÑÑÑÏÏÊÅÂÊÊÊÊÊÑÑ××ÚÝÝááäáÑ%%%+++,,3799B73,3,3,++,,%+73+7733,37++% %97Ig¢¢¢¤¢¢¢___g_b_bbb_bgbbg_gb_b____bmrz¢¤¤««¤«¤«¤¢¤¤¤¢«¤¢zrig[VVIMQVQQV[[b[__bbgggggbgbbbmggbggbgggiigiimmrmmmmrrrmiiggr´Ú×ÅÅ«wwibbgib_iiigig[biwwzzrwmwwzzwrrzzzmzmbbi«°¬¤¤¢¢¢¤´¸«¢¬«´¾¸´°´´¬´´¬°´¸¸°´Â°¸¸´¸°¬¸¾´°´Â´«««¾¾°¾Â¾°´¾ÂÂÂÅÊÅÂÅžÅÅÅÂÅÅÅÂÂÅÊÊÊÅž´¸´¤¬ÂÊÊÅÅÂÂÏÊÊÊÊÊÊÊÅÏÏÊÏÏÊÏÏÊÏÑÑ×××××Ͼzwg[QFIb´ÊÑÚ×Ï´¬««¾ÊÏ××ÝÚ×ÑÑÑÑÏÑÊÏÊÅÊÊÏÊÏÊÏÏÑÑ×ÚÝÝáááÝÑ+%%++,777397799+333+,+,,,++,,37393733,+ %,F[w¢¢¤¢¢¢¢¢¢__g_bbb_bbgibbbbb_b[_b___gmr¢«¤¤¤¤¤«««¤¤¤««¢¢zmibVQMIMQMQQ[[___[bbbgbbbigbgbgigrgggbggggmmimimmmrrrmwrriggbwÏÚÊÅÊgm[b__bbggigb_imrwzwrrwzrrwrzwigmzzzzwzzzm[[m¢°´¬«´¸¬¤¬¬°«°¾¸°°¬¬¸¸¾´¸«´°°¸Â¾´´´¾¸°¬¸¾¸¬°´¤«°¾Â¾¾¾¾¸´´´ÂÂÂÂÂÂÂÅÅÅÅÅÂÂÂÅÂÅÊžÂÊÊÊÊž´«¤¬¾ÅÊÊÅÊÅÅÅÏÊÊÊÊÊÊÊÅÊÊÊÏÊÊÊÊÊÏÏ×Ñ×Ñ×Ú×¢zrb[V[w¤ÂÑÝ×Ïʾ°´¬¬¾ÊÑ×××××ÑÏÏÑÑÑÏÏÏÊÊÅÊÊÊÊÏÏÑ×××ÚÚÝáááÝÑ%,%+33+333379773,7333,,3,+%+7,777=3+ %+=Vi¢¢¢¢¢¢¢¢¢bbg_bb[gbbbbbb_gbb__g_V[bgir¤¢¢«¤«¢«¢¢«««¬«¤«¢zri_[VMIMQQMVV[bb_[ggggbbgimimggggmgigbgbigmmmrrimmmrwrrwmmibbÑÚÊÏÂwrig_[bbbbggb_irmrrzwirzrmmwmgrzwzzzzwzwg__bz¤¢¢¢¬¤°´¬¢¬¬¬¬¬««°¸¸¬°¬¸¾Â¸°««°°´°¾¾°¬¬´¸´°¸¾«¢«¬´°´¸Â¾¾´¸´´¸Â¾¾¾ÂÅÅÅÂÅÂÅÂÅÅÅÅÂÊÅÂÂÊÊÊÏʸ¢´ÅÅÊÊÅÊÊÅÊÅÊÏÊÅÅÊÊÊÅÅÊÊÊÊÅÊÅÏÊÏÑ××Ñ×ÚÚ×Ârr_gr¸Ï×Ú×ʾ°Â¸°°ÅÊÏ×Ú×ÑÑÑÏÏÏÏÏÏÊÊÊÊÅÅÊÊÊÊÏÑ××ÚÚÚÚÝááÝÝÏi%+++333333373F,3,33,,,3,7,37977779933, %3Ib¢¢¢¢¢bb_bgbgbgbbbggbgb_b__bb_bgimz¢¢¤¤¤¤¤««««¢¤««¤¤¢zri_[MMIMQQQ[VV[__b_b_bbggggbgiigiiibgbbgbgiirimmrmrmiwmrriiig×ÑÑϰwwmgb__b_gii_gmmmmrmrmrwribiwwrgizwwwzrrzmg_r¤¢¤¤¢´°¢°¬´¬«««««°´¸´´´¸¾¾°«¬«¬´°°Â¸´¬´¸´´¬¬¢¤°¸´´°°´¾Â¾¸¾¸´°¾Â¾¾ÂÅÅž¸ÅÅÊÊÅÂÅÅÊÂÅÊÊŬ«´ÅÂÂÅÅÊÅÅÊÊÊÏÅÅÊÊÏÊÊÊÊÅÅÅÂÅÅÏÊÊÊÑÑ×ÑÚ×Úϸwmw´ÊÑÝ×Ïž´¾¾°¸ÅÏÑ×Ñ××ÑÑÑÏÊÊÊÏÊÊÊÊÅÊÅÏÏÊÏÏÏÑ×ÚÚÚÝÝÝáÝÝÊ[+,+%%,,3,,,,7wB777,33,,733,3,73373,% +9_w¢¢¢¢¢¢¤bbbbbbbi_ggbgbbibbi_[__b[gir¢¤¤¤«¤¤¤¤¤¢¤«¤«¤¤rib[VMIQMVMVQVV___[gbbbbbbgbggbiiibiggbbbgimrimmmmmrmrmrriggi«ÝÑ×Ê´¢zwwrwg_bV[bbbgrmrwrigirzi__gzwwwggwzwrmmwzzwibgm¢¤¢¢¤¤«´°¬«¬«¬¬¬««¾¾¸°«¸¾´¬°¬«°´´°´¾°´´´°«°´´¸¸´°°°¸Â¾¸¸¸´¸¾¾Â¾¸ÂžÅÅÊÊÅÅÂÅÏÅÅÊŰ«¤°¸¸¸¾ÂÂÅÅÊÊÊÊÊÏÊÊÊÊÊÊÊÊÊÅÅÅÅÂÂÅÊÊÊÊÏÑÑÑÑ×ÑÊ«¬ÅÑÚÚÚÏ´¾¾¾´ÂÊÏ×××ÑÑÑÑÑÏÏÊÊÊÏÊÊÅÊÅÊÊÊÊÏÑÑÑÑ××ÚÚÚÝááÝݸ=+3,++,33+3,373777973,+++,,,7777733% %7Qi¢¢¢ggbbbbbgbgbbbgbbbib_bb__gbmr¢¤¤«¤«¤«««¤¤«¤¤¤¤«zwmg[QIIMQMQVVVV____ggbb_gggggbggbbigbbb[ggmmigimmimmmrmmmg__i´á×Ѹ°wmwrgb_[gg_immimzmbbmwmgbiwzwwrwzzzwzzrrwzzwwigir¢¢¤¤«¤«¬¬°°«¬¬°´°°°°¸´°¤«´´´°««¬´´°°¾¾´¬«¤¢´Â¾¾¸¸´°°°¾Â¾¸´¸¸¸Â¾¸¸¾Â¾¸¾ÅÊÊÊÊÅÅÊÊÊ´¤´¾Â¾¾¾¾ÂÅÂÊÊÅÅÊÊÅÊÏÊÊÊÊÅÅÊÅÅÅžÂÅÅÊÅÊÏÏÏÏÏÑѾ´ÂÏ×ÚÑÏÅ´¸Â°¸ÅÅÏ××ÑÑÑÑÏÏÏÊÊÅÏÏÊÊÊÅÅÏÏÏÅÏÏÑÑÑ×××ÚÚÝÝÝÝÝݬ7+,+3,373,,3,773973,,3,+,,+,733777973% %+9_r¢¢¢¢¢¢¢¢ggi_bb_iigbbbggbbbbbbb[bbgmwz¢¢¤¢¤«««¤«¤¤«¤¤¢zwrg[MQIIMQQV[Q_[[bgbiigggbggggib_iigg_b_gbbgigmmgrmmmrmiigb_i¬Ý×ʸzzwmig_bggiiimmigbbmmg_gmrwwrwwwwwwzzzwmrzwrmimr¢«¢¬¬««¬°¬¬¬¬°°°¸¸¬¤«¬´¬««¬´¸°¬¬°´¸¬°Â¾¬¢¢«¬°¸Â¾´¸¸´°¸¸´¾¾Â¸¾¸¸¸Â¾¾¾¸¾Â¸ÂÅÊÅÊÊÊÊÅÅÅ´¤´¸Â¾¾ÂÂÂÅÅÅÊÅÊÅÅÅÊÊÅÅÊÅÅÊÅÅÅÅÅÂÂÅÅÅÊÅÊÊÏÏÏÏ×ʤ´ÂÏÑÚ×ÑŸ´¾Â´¬¸ÅÅÑÑ×ÑÑÑÑÏÑÏÊÊÊÏÊÊÊÅÊÊÊÊÊÊÊÏÏÑ×Ñ×××ÚÚÝÝáÝÝÚ+%++,7,9=3,3,7,,3337,%++,++,33,77,3++,%%,BQm¢¢¢¢¢¢¢¢¢bbgbgbgbgbbbbbbbg_bbbbbbbimw¢«¤¤¤¤««««¤««¤«««¢zrmb[MMMMQMVV[V_[__b_bgggbgggggbbbgbib_gbggibggimiimwmiiggb__mÂÝѰwwmbgi_bmgimggbbig_[gwwrwrwzwrmwzzwmmrwzrriir«¤¢¬°¬«««°¬´°°¸¤««¢¬¬¬¤¢¬¾¾¸°¬¬´´«°´¢¤°´´°¬´¾¸´¾´°¸´´¬¬¸Â¾¸°°´Â¾¾¾¾Â¾ÂÊÊÊÊÏÊž°«¤«°´¸¾¾¸ÂÅÅÅÊÅÅÅÅÅÅÅÂÅÊÊÅÅÅÅÅÅÊÅÊÅÅÂÂÂÂÊÂÂÅÅÏÏÊ×ϸ«ÂÊ×Ú×Ñʾ¸¸Å«°ÂÊÏÑ×ÑÑÑÏÏÏÏÏÊÅÊÊÊÊÅÊÊÊÅÊÊÊÊÏÑÑÑ××Ú×ÚÚÚÝÝÝÚÝ×,+,++,73,333,,37,79333,3,3%,33773,,3,+,39Ibz¤¢¢bbbbiigggbbgbgbbgg_bbbbgimrz¤¤¢¢«««°«««««¬¬«wmb[MMMIQQVVV[b[_b[bb__bgigggigg_ggbgbg_gbgbimiiimmmmmmiib_b×ÚÏÅzwwmgmbbiigigg[gwi[[imrmmrzwmbgmzzriiwzwwrrrwiw¢¢¤¢wz¢¤¤¤¤««¬°°¸´°¤«°¤¬¤¢¬¬°¬°Åž´¬«°¤¢¬´°´¸°¬¬°¸¾¸´´´´´°¤«´¾¾´´¬¬°¾Â¾ÅÊÊÊÊŸ¢°¾¾¸¾¾¾¾¸¾ÂÅÂÂÅÅžÅÅÅÅÅÅÅÊÅÅÅž¸ÂÅÅÂÂÅÊÏÊÑѸÂÏÑ×Ñϰ¬Âʸ´¾ÅÏÏÑÑ×ÑÑÏÏÏÏÊÊÊÊÅÊÅÅÊÏÏÊÊÊÊÏÊÏÑÑÑ××Ñ×ÚÚÚÝÝÝÝÝÏi%++%+333,79,,33,37,33%,+,+,,,3,7,7333,39I_r¢¢¢¢¢¢¢¢¢¢bbgb_gbgbgg_gbgbgb___g_bimmw¢¤¤¤¤«««¤¬««¬«««¤¢wib_MIMMMMQV[[bV[__b_gbbbgibbgbgbggbgbbbgbibiigmmiiiiimmb_bgÚÚÑÂwiiigmggmgb_ggg__irg_grrmg[grzzwwwzzrmiwzrrrrwrz«¤¤«¤«¬¬´´°¸¤¤¢«¤¤¬¢¢«¸¸´´¾¾¸°¤¢°¸¸´°°°°°«°¾Â¸´°´´´°°¬«°¾¾´¬«´¾ÂÅÅÅŸÅÅ´¤¤¬¾Â¾Åž¾¾Â´¾¾¸¾Å¾ÂžÂÊž¾ÅÅÅÅÅÅŸ¾¾Â¾¾ÂÂÅÊÏѬ¾ÅÏ×ÑÊŸ¸´Â¬°¾ÅÏÑÑÑÑÏÏÏÏÊÊÊÅÅÅÊÊÊÅÊÏÊÏÊÏÊÊÊÏÏÏÑÑ×Ñ××ÚÚÚÚÝÝÝÝÅQ,+,33B77737,737,37++7+++%+,,37733737777FQi¢¢¢¢¢¢¢ggbgbbb_b_bbgbb_gg__bb_gbrrw¢¤¤¤¤««¬«¬¬««¬¤«¤¢¢rmb_IMMIIM[[V[bV_bgbibbbb_ggg_ggiggggbig_ggbiimiimmgimgi_[bgÚ×Ϥzwgggimgmibgimb[[mrmg_rrig_iwzzwwwwrrgmzzzzwwwmm¢¢z¢¤¢¢¤¤°¾´°¤¬¬¤««¤¢¤¬¬¤¤«¾¾¬°¾¸°¢¢«´¸¸´¬««¬°¬«¬¸Â´¬¬°°´°°¤«´¾´°°¬°Â¾¾¸¬°°°°««°´¸¾¸¾¾¸´¸´´´¸¸¾Â¾¾ÂÅÅÂÅž¸Â¾¸¸ÅÂÂÅž´¾Â¾¾¸¸ÂÅÅÏʰ¬¾ÂÊÑ××ʾ°´ÅÊ´°¸ÅÊ××ÑÑÏÏÏÏÅÊÅÊÊÊÊÅÅÊÅÊÊÊÊÊÏÏÊÊÏÏÏÏÑÑÑ×××ÚÝáÝÝÝÝÝ´B%+3,3,373733373,3,,+++%+,73337739y=FM_w¢¢¢¢¢¢¢¢¢bbg_ibggbbbbg_bbggb_g__ggmmw¢¤¢«««¤««¬«««¬¬¬¬¤¢rib[MQMMIMVV[Vb[___gg_bbbbggggbggg__bgbgbbggiimimimiiiiib_[i´ÝÑʸ¬¢zzibimiimiimmmbgiiigimwmmbmwzzwzimrrzzzzmm¢z¢¢¢¢¢¤¢¤¬¤°´««¬««¤«¤¤«¬´´¤¢«¾´¬¬°«¬°´°°°«¬°«¬°´¬°´¸¸¬«°´¾°«««´¸¸´°¸¾¾´°´¬¢«¬¬°´¸¾¾Â¸¸°°«´´´´¾¸¾¾¾¾¾ÊÅÅÅÅ´´¾Â¾¾¾¸¾¾Â¾¾¾´¸¸¾¸¸´ÂÂÂÊʾ¢«¸ÅÅÏ×ϾÂÂÂʾ´¸ÅÅÊÑ×ÑÏÏÏÏÏÊÅÅÅÅÊÅÊÊÅÊÅÊÊÊÏÏÊÊÊÏÏÊÏÏÏÑÑÑ×ÚÝÝÝÝÝÝÝÚ373,333337793,77+3,+++%+,73+337,,799BBBIVi¢¢¢¢¢¢¢¢¢¢gggbbb_bbbbbbbgggibg__bggmrw¢¢¤¤¤««¬°¬¬««¬°¬¬¬«¤¢wi__MMMMQVQ[__[[b__ggbgbbgg_bggbbgb__gbgggigiimgmimgiibbb_[wÏÝÑʸ¬zzmbggigbgmmrmmmmbbiirmmiwwrmrwzmirmzzwrmz¤¤rz¢¢«¬««°¬«¤¤«««¢¤´´´¢«¾¬¢¤¬°¸°°¬¬°¬¬¬¬´°°«¬´´««°Â´´¬¤¬¸Â¾°¾¾Â¬¤««´°´°¸¾¾¾¸¢°¬´´´¾¾¾¸¾Âž¾ÂÅʾ´¸¾¾¾¾Â¸¾Â¾¾¾¾¸°¸¾¾¸¸¾¾¾ÂÊÅ´«ÅÊÊÏÏʾ¾¸ÅÊž´¾ÅÅÏÑ×ÑÏÏÊÏÏÊÅÊÊÊÊÊÊÊÊÊÊÊÊÏÏÊÏÏÊÊÊÏÊÅÊÊÑÑÑÑ×ÚÚÝÝÝÝÝ×7,,,,,37,9377379333,,%%3,33,3973999FVgr¢¢¢¢¢¢¢bbg_bbbggbgb_bbbggggbb_gggrw¤¢¤««¤««¬¬¬¬««°¬«¤«rgb_QQFMQQV[mg_V__bbbgbbb_gbbgbgbgb_bg_gibbggiggigimiigb[__ÑÚ×Ê«¤rimbgib_giigmmmggirgbgrmrrmrzzzriirzzriiz¤¢¤««°¤¬«¢¤«¬¬«¤¤°´¸¬¤¬«°°¬¬¬´´°°´´°´°«¬´°««°´°¬°¸¸´«¬¸Â¸´¸¾Â´¢«°¸¸´¸´¾¸´´«¢«´Â¾¾¾Å¾¾¾Âʾ¾Âž¾¸´¸¸Â¾Â¾¾¸Â¾¾¸¾¸´´¾¾¾¾´¾¾¾ÅÊ««´Ê×ÑÑʾ´¬ÅŸ¸ÂÊÏÏÏÑÏÑÏÏÊÏÏÊÅÅÊÏÊÊÊÊÅÅÊÊÏÏÊÏÏÊÊÊÊÊÊÊÅÊÏÑÑÑ×ÚÚÝÝÝÝáÝÑ+%,373777w+79973,33,+,,33,,,3,,3»FI[m¢¢¢¢¢¢ggggggbbbggbgggbgbbbbg_bgmrwz¢¢¤¤¤¤«««¬«¬««¬«¬««¤¢zrmg[QIMQIMVVVb[[V[__gbgggbgbbbbbbbb[b_bbgbgigggiiiggggbb[V[Ñ×ÑÊ´´¤zwwggigbimimigggmwwggmzrmiizzrmmzwriiw¢¤rz¤¢¬¬¢«««°¬°°¬«¢¬´´¬¢«°´¸°¬¤¤¬´°°°°´¬««°´°««´´°¬«¸¾¸´¸¾Â¾¾Â´««¬°°¾¾¾¾¾Â¾¸¸´°°´¾¾¾¾ÂŸÂÅž¾¾Â¸¸°°¸¸¸¾¸¸¾´´¾¾¾´¸´°¾Â¸¸¸¸¸´¾ÅŸ¤°ÂÅ×ÑÑʾ°¬¾¾¸°¾ÊÊÏÏÏÏÏÏÏÊÏÊÊÊÊÅÊÊÅÅÅÊÊÊÊÊÊÏÊÏÏÏÏÊÏÊÊÅÅÅÊÑÑÑ×Ñ×ÚÝáÝÝÝÝÏg %++3,33+737,3,77,,+,++3+73,3779B9=FI_i¢¢¢¢¢¢¢¢¢bbbbgbgiigbb_[bbbb_bgbbggmrz¢¢¤««¬««¬¬¬«¬¬¬¬¬«¤rmi[VMIFIMMVQQ[[_[b_bbbb_gggbbgbbbbbbbggbbbigggigiigiggbV[b¤ÚÚÑÅ´´¤zwimgbimimiigbbimimmrwrwrmrzwwmizzzrmiwzz¢¢¤¢¤¤¢¤¤¢¢«¬°¸°°´«¢°¬¬¢¬´¬°°´°¤¤¤°¸´°°´¬¬¬¬°¬¬¤«¸´°«¬¾Â¾Ÿ°«°¬´´¬°°´´¾Â¾Â¾Â¸´¸¾¾Â¾¾Â¸´Å¾¸´¸¾¸¸°´¸¸¸¾¾¸¾¸°¸¾¾´¸¸°°¾¾¸´¸Â¸¾Âž¾ÅÏÏÑÊŸ¾¾Å¸¾ÂÅÊÏÏÑÏÏÊÏÏÏÊÊÊÊÊÊÊÊÂÅÅÅÅÅÊÊÏÏÏÏÏÊÊÊÏÅÂÂÂÅÏÑÑÑÑÑÑÝÝÝÚÝáÝÂI%%+++%3,%+,37F7=9,33+%+3,,,,3739B=FMI[iz¢¢¢¢¢¢¢¢¢bg_gbgbgg_bb_bg_mgbbb_ggimrw¢«¤«««¬«°°°¬¬°¬¬««¤¢wrb[QIMMMQMV[[[___bV_gbgbggbbgbbbb__bgg__gbbbbigirgiggb__[i¾Ý×Ѿ´´wrmmbgirrmimbbgimmimrrwwzzwrwrmzwzzzriigwwww«´«¢¢¢¢¤¢¢°´¸¸°¾´¢¢¢¤«´°´°«¬°°¬¬«¤¤´¸°¬¬¬°°¬««¤¤°¸´°¬°ÂÅŸ¸°¬°´´¸¸´´´´´°¸¾¾¾¾Â¸¸¸¸¸¸Â¾¸¸¸Â¾¸°°´¸´¸¸¸´¸¸¸´¸¸´´¾¸°°´¬¬°´´´°¸¸¸¸ÂÅÅÊÏÏÅ´¸ÅÂÂÂÊÅÅÊÏÑÏÏÊÅÏÊÊÊÊÊÅÅÊÅÅÅÂÅÊÊÊÊÊÊÏÊÊÏÊÊÏÏÊÂÂÂÅÅÏÑÑÑÑÑ×ÚÝÝÝáÝÚ«3%,%+,++373++37337,7,%,++93=3,99=B=BIV[r¢¢¢¢¢¢¢¢bbg_bbgbgi_bg_g_ggbbbggbgmwr¢¤¤««««¬«¬°°¬¬°¬¬««¤wrrgVVMIMMMQQV[[[____b_b_bgigibgbb_gb_bgbgb_bbbiiigggggbb_[rÅá×ÏÊ´«¬rzzmiwmmmgibgigmmirmmmwzwwwwzwmibmzww¢¤¬¤¤¤«¬«¤«´´¸´´«¢¤«´¾¬°°¤¤¬°¬««¢¬¬¸°«¬°°¬¤¬«¬¤«°´´°´Â¾´°°°´¸¸¸¸¸´¸¾¸°°°¸¾¾¸¾Â¾¸¸¾Â¾¾¾¾Â¸¸¾Â´´°¬°°°´¾¸¸¾¸¬´¾´°¸¸´°°««¤¬¸´¬¸¸¸¾ÊÊÊÅŸÂÂÅÅÂÂÅÊÏÏÑÑÏÏÊÏÊÅÊÅÊÊÊÊÅÊÊÅÅÊÅÅÅÊÏÊÏÊÊÊÏÊÊÏÊž¾¾ÅÊÊÏÑÑÑÑ×ÚÝÝÝÝÝ×% %%+++37,,,,737,,,,++++,7,39377339=F[gw¢¢¢¤¢¢¢¢¢iibbgbbgb_V___g_bbggggbgiimwz¢¢¤¤¬¬««¬¬°°¬¬¬¬«««¤zrr_[QQIFMQMVV[[_b[__b__bgbb_bbbb_bbbb_b_i_gbgbimiiibbgb[[_wÏáÑÊŬ´¸zzmzwimibgrbbimiwmrrwmrirzzwzzzzmgrzzz¢¢¢¤¤«¬°«¤¬¬´¬«¢¤¤¤¢°¾´´««¤«°°°´««¢¬°°¬°°°¬¤¬¤¤¢«´¸¸´¬¬°¸¸´´´´´´´´¾¾°°°°°¸¾¾¾Å¸´´¾¾¾¾¾Â¸´°°´¸´¬¤°°°¸¸¾¸¸´¬¸´´°¸¸°««¤¤¤°°´¸ÂÂÏÏʰ««¸ÅÊÂÂÂÂÊÏÑÑÑÑÏÊÊÅÂÅÊÊÊÊÊÅÅÊÅÅÅÅÂÅÊÊÊÊÏÊÅÏÊÏÏϸ´¾¾ÅÊÊÏÑÑÑ××ÝÚÚÝÚÚÊi+%%%3+,,3,,+773,,,,+,%3379s9,79MMiw¢¢¢¢¢¢¢iig__b_b_bbbbbbb_b__b_bgigmr¢¢««¬««¬¬¬°¬¬««°¬««¤wmb[QIFMIMMV[[V[_bb_ggb__gb_gb_bbbgbb__g_ggbbgirigiggib[[_z×Ú×ϸ´Â¸¢wwwrimmimgimiigmrmgbirzwrwzzzzrgr«z«¢««¬¬«°¬°¤¤¢¤«¢¤´°«¢¤°°¬«««««¬°°´««¤¤°¸¬°¬¬¬°«¤«¬««¸°¬¬¬°¸Â¾¸´´¬°°¸¸¬«°´´¸¸´¾Â¾¸¾´¸¾Â¸¸¸´´°«°´°««¬°¸¸¸¸´¾¬¬´°¬°´«¤¢¤¢¤«¸¾ÅÑÏž´¬¤«¸ÂÅÅÂÅÅÏÑÑÑ×ÑÏÏÏʾ¾ÅÅÊÅÅÊÅÊÅÅÂÅÅÅÊÊÊÊÊÏÏÊÊÊÏÏʸ´°´¸ÂÅÊÏÏÑÑÑÑ×ÚÚÚÚÚ´B+% %+,,++3,3+33737,%+,,++39777+3%,9Q_mz¢¢¢¢¢¢¢¢¢¢¢ggbbb_biggbg__bb___bbg_bgirwz¢««««¬¬°¬¬°¬¬¬°¬«¤¢¢zrmg[QMIIIQVVV_Vb[_b_bg_gbbb_bbbgbg_bgb_[bgggggigmggbggg_[_ÑÚÑŰ´zzrwrrzggimmbgmimmbQgwwzrrzzzrrriw¢wz¢«°´´°¬««°¤¤´°´°«¢¤¢¤´¬¤«°¬¬°¸°¬¤¤«´°¬¬¬¬¬««°¬«¤«¬°°¬°´¸¾¾¸¸¸°¬´´´°«°´¸¸´¸¾Â¾¸´¸¸¾¸´°¸¸´¬«¤¬´¬¬°¸¸¸¸¸¸´¤°´¤«°¤¢¤¤°¸ÅÏÏʾ°«°°¾ÂÅÅÅÂÅÊÏÏÑÑÑÑÏÏÏž¾ÅÊÅÊÊÅÅÊÊÅÂÂÅÊÅÊÊÏÊÊÊÊÏÏÏÏϾ¬´¬¬¸ÂÅÂÏÏÏÏÏÑ×ÚÚ×××7, %+,,+7,,93,779737,3,,,,77w,+%39Ibw¢¢¢¢¢¢¢¢¢¢¢¢¤¢¢¢__b__bbg_gb_b_bbbbbgbg_[birmw¢¤«««¬¬«¬¬««¬°¬«««¤¢wrb[VMMMQQVVV_[_[b___bbgbbbb_ggbg_g_bggbbbbggigggiiibbb[[[×ÚÏŸ´rrwmwwggmmggmmmgb_gmrwrrzwrwmir¤wmr¢¢¢°´´¬««««¢°´°°°°°«¬°¬««¬¬¬¸´¸¬¤««´´°«¬««¬¤«¬¤«¤¬°´°°¸´¸¸´°´´´¸¸¾°°¬¸¸¸¸¾¾Â¾¸´´°´´´´¸¸´°«¤°°¬¤°¸´´¸´°¤¤°«¤¤«¸ÅÊÏž¸¤¢°¾Â¾ÂÅÅÊÅÊÏÑÏÏÏÏÏÏÊÅÂÂÅÅÅÊÊÊÊÅÅÊÅÅÊÅÅÊÊÊÏÊÊÏÏÏÏÏϾ¬««¤«°¸Â¾ÊÏÏÏÊÑ×ÚÚ×ÚÏi3, %++%+++,,3333ù,++3,37937++%3=Vr¢¢¢¢¢¤¢¢¢¢¢¢¢¢¢¢¢bb__bb_g_mib_b_bbbgb[bbbbgir¢¤¤¤¤¬¬¬«°¬«¬¬¬¬«¬¤¢¤zrb[MIMIMMMQV[[b_bb__bgbbggbbbbgbbb_g_g_bgbggibbggigggb_[_ÝÚÏ۰°rzzwmiggiigiwriimrrirwrwmmirmgzwiw¢¬¤¢°´´¤¢«¢¬°´´°°°«««¢¬´´°«¬°°°¸´¬¤¬«¬°¬¬««¬¢¤¬¬¬¤¬°¸´´°¬´¤¤°´¸¸¸¸´°¬«´¸¸¾Â¾¾¾¾´´¬°°¸´´¸¸´°¬«¬´¬¤°¸´´¸´¬¤¬¤¢¢´¾ÏÏϸ´««¸¸ÅÅÅÅÂÊÊÑÑÊÏÏÏÊÊÏÅÅÅÂÂÅÊÅÊÅÅÅÊÅÅÊÊÅÅÊÊÊÊÊÏÏÅÏÊÏÑÅ´¤¢¤¤¤«´¸ÂÏÑÊÊÊÑÑÚ×Ñ׸=,++%++,,,,+33339B93%+,7,3377s3++7Fbz¢¢¢¢¢¢¢¤¢¢¢¢¢¢¢¢¢__bbggbb[b__bb[gb_gb___gbgrwz¤¤««««««¬«¬«¬«¬¬«¤¤¢zrb_VMIMQQV[[V___[__bbbbbggbb_bgbbbb_bb_bbbgiggigiigibb_V_áÚÑʰ¸¢«¢zziirggiiimmgirwigrrg_ggmwzmrw¢«¬°¬¤´¬°¸´¬°«¤¤«¢¢¢°°°°¤«°¬´´´«¤¤¤¢¬¬°°«¢¢¬¬¬°¬°´´«¢«¬°°°°¸¸¸¸¸´¬°¸¾¾¾¾¸¸¸´°¬°¬°´´°´´¾¸«¤°¸«¢´´°°¬«¢°ÂÊÏÏž´¬¬¾¾¸¸ÂÂÅÅÊÑÏÏÏÊÊÊÊÊÊÅÅÅÅÅÂÅÅÅÅÊÅÅÊÂÅÊÅÊÊÊÊÏÊÊÊÊÏÏÊÏÊ´¬¢¤¢¤°¸ÅÏž¾ÅÏÑ×Ñ×Ñ+,+%+,,+,,393,+,73,73+,,3,,333733,,=Qm¢¢¢¤¢¢¢¢¢¢¢¢¢¢¢¢¢__ggbg_b__gbbbbbg_gbbb_bggrwz¢¤¤¤«¬¬¬¬¬°¬«¬¬°¬««¢zwrg[VQQMQQV__[[___[b_gggggbbg__gbbgb_ggbgbbgggggiiibgbb_[_ÚÚÑ´¾°«´¤wirmimmibbbgwwrimwrmgbbgrrmz¤¤«¬««¤°««¬¬°¤¤««¢¤¤¢¤´´°¬¬¬¬¬°°«¢¤°°¬¤¤¤¤¤°´°¤««¢¢¤¬´¸°°°¸¸¾¸¾°¬°¸¸¾¸´¸°´´¬°°°´´°´´Â´¸«¤¸««°°¬«¤¢¤¸ÊÑÏʾ´°¬¾Â¾ÂÂÂÅÊÏÊÏÏÊÊÊÊÅÊÊÅÅÅÅÅÅÅÅÊÊÊÊÅÅÅÊÅÅÊÅÊÅÊÏÏÏÏÊÏÊÊϾ¬«¢¢¢¤¬¾Ê¬´¸¾ÊÑÑÏ×Å_+%++3+3,+3,,73,,3,3+++33,,3+333793=Igw¢¢¢¢¢¤¢¢¢¢¢¢¢¢¢bb__bb_bg_bi_bbb__g__bbbiimr¢¤¢¬«¬««¬°¬¬¬¬«¬¬¬¤¤rmbV[MQIMQV[[__bbb_bbbbiggbggb_bbgbbb_bbbgbbgbibbggigbb[[[ÚÚϴ´¤°¬«°«zwmrwmrmbQVimrggmwzwrgiggrrrww¢«¢¤¤¢¬°¬¬¬¬¤¤¤¤¢¬«««¤«¢¤¤´°¬«¤¢««¢¤¢¢¢¢¤¬¬¤¬«««¢¬¤¢«°¤«¬´´°°°¾¾¸¾´´¬´´¸¸´°°°´°¬«¬´¸´¸¾´¸´°°°¢°¬¤¢¢´ÂÏÑϾ´´°¸Â¸ÅÂÂÅÊÊÏÊÊÏÊÊÅÊÂÅÂÅÂÂÅÅÅÅÅÅÊÊÊÊÅÅÅÅÊÊÊÊÅÊÊÊÊÏÏÑÊÊÏŰ«¤¤´¾¸«°ÂÊÏÏÑ×¢=+,++93777,,7,7779,,++%+3,,,+3399IBF[r¢¢¢¢¢¢¢¢¢¤¢¢¢¢¢bbb_b__g[b[[__bb_bbb_b__gimw¢¤«¬«««°««¬¬¬«««««¤¤wm_VQMMMMQV[V_[__b[bbbbbibgb_bggbbbb_bgbbgbbggiggigbggbV[[Ý×ÅŸ¬¬°¢«mzwwmbVQ_rmibiwzwwwwmg_rz¢rimwz¢«¢¢¢«°¬°°¤¢¤¢¤¤«¬«¤««««¢«¬°¬¤¤««¤¢¤¢«¬¬¬¬¤¢¢«¬¬°«¬«¤°°¬¬´¸¸¸¾´´¬¬´°°°°¬¬°¬¤¤¬¸´´°°°¬´¢¬¢«¢¤¤¬´ÊÏʾ°«´Â¾ÂÂÂÏÏÏÊÊÅÊÊÅŸ¾Â¾ÂÂÅÅÂÂÅÊÅÅÅÊÊÅÅÊÊÊÊÅÊÏÊÊÏÏÏÅÊϸ¬¢¤°¾¸«°¾ÂÅÏ×Ïr,,%,,3B9,,733733+3++,,33+%+,3BIQMVgz¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢__b[[_gg___b___b_b__[bgbggiz¢¤«««««««¬°¬«««¬¬¤«¢wig[MVMMMQQ[[b_____bgbbb__bbg_bbbbbgbbbbbigbbgggigggbg____ÝÚÊ«´«zri[[bib_ggrwrmwrg_wwmmr¢¤¤«¢«°´¬««¢¢¤¤¤¤««««¬¤«¢¢¤¬¬«¢¢¤¤¬¤¢¤««¢««««¢¢¬¬¬°«¬¬¬°°°«°´¸¾¸¸´¬°¬°°°°°¬¬¬¬¢¤¬°´¸´¬¬¬¤¤¢¢«´ÂÅϸ°´´¸¾¸ÂÂÂÅÊÏÑÏÏÅÊÅÅÊÅž¸Â¾ÂÂÂÅÂÂÅÊÅÅÅÊÅÅÅÅÊÊÊÅÊÏÊÊÏÏÏÊÊÑÅ«¤¢«°¾´¤´¸ÅÂÏ׸B,3, %,3,3,733,,+3%+,37+,3,39=FMMgw¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢ggbgb__i[[b_g_b___bb_gg_bgiw¢¤¤«¬«««¬«¬«¬¬¤¬¤¤¢¤¢wmb[[MQMMIMVQ___bbbigibg__gbggbbgbbgbbbbbggbggbgib_bbb_[Q[Ý×Ű¾Å¬¢¤¢¢zwggbgm_VQbrrmmrmrgiwmrw¢¢¤«««««¬«¤«¢¢¢¤«¬«¤°«««¢¢«¬´¢¢¢«¤¤¤¤¬«¢¢¢¤¤¤««°°°°¬°¤¬«¤¬¸¸¸´´°¬««°°°¬¬°¤¬¤¤¢¬¸¸¸°¬¤«¤«´ÂÊÊž°¤¬¾¾Â¾ÂÂÂÏÏÏÊÊÊÅÅÅž¾Â¾¾ÂÂÅÂÅÅÊÊÊÅÊÊÊÊÅÅÊÊÊÊÊÏÏÊÏÏÏÊÏѰ¢¢¤«°¾¾¤¸¸ÂÅÑ×,%%,%%+,sI9333,,+++,3,37++3,9=MVV_m¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢bb_bb__[__b[[_b_bb__bbbgbgmw¢¤¤««¬¤««««««¬¤«««¢¢wibVVIMMMMVV[__[[b__bibgbbb_bbgbbbg_b_bbbbbbgbbbigbb_b_VV_¤Ýϸ¸¾¸´¬¤°´¤wriggib_V_iwrimmi_bwmwwrz¢«¢¢¤«¤¢¤¤¤«¬«¤¤¢¤«««¤¬¬¤¢¢¢¸°¤¢¤¤««¬¬¢¤¤¤¬¤¤¬«°¬«°°¢¤°¤¢°¸¸¸´¬¬¬¤¤«¬«¬°¬¤«¬¤¢¬´°¬¬¢¢«¸ÂÏʸ´¬°´¸´´¾ÅÅÅÏÊÏÏÊÊÊÊÊÅž¸¾Â¾Å¾¾¾ÂÂÅÅÅÅÅÊÊÊÊÊÊÅÊÊÊÏÅÊÊÏÏÏÏÏÏÏÏÏÅ¢¢«°¸¾zz¢¬´¸ÊÏÚÊ[%%%%%+++3,3IB97,,+%+7,373,+,337BIM[m¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢bbb_[[_[__V_[_b[V_b_[_bbggrz¢¢««««««««¬¬¤«««««¤¤¢wig[[MIMQMQQV_[__b_b_g_bgbbbb_i__bgbbb_bbbgggggggg_gb_[V[g«Ýʸ«¬°¬¬«zwmbigb[__rggiimi[[wzbwzz¢¢¢«¬¤¤¢¢¬«¬°¢¢««¤¤¤¤¤¢¢¢¬¬°«¢¢¢¤«¤¤«««¤«¬¬«¤¤«°¬´¬¢°¬¤«¬¸´´°¬¬««¤«¬°¬¬¢¢¬«¤«´¬«¤¢¢¤´ÂÅÊۤ°´¾Â¸´¾ÂÂÏÑÑÏÊÊÊÊÅÅŸ´¾Â¾¸ÂÅÂÂÅÅÊÊÊÅÊÅÊÊÊÊÊÊÊÊÊÏÏÏÏÏÑÊÑϰ¢¤¢°¸¸¢«¬°´ÅÑÚ¸9%+%+%+++7,7F773,,%++,,77,7,,,7=FQbr¢¢¢¢¤¢¢¢¢¢¢¢¤¢¢¢_[bi_[_____bb___b____g__girz¢¤¤¤««¬¬««¬«¬¬«¬««¤¢¢wmb_QIMMMMQV[[___g___bggigbbb___bbb_gbg_bgbggbbib_bb__[[Vb´áÏž¤´¸«¤¢¢ziiigbbmimmirig_bmzwiwrrww«¤¤¤¢¢¤«°°«¢¢¢«¢¢¢¤¤¢¢¢¢«°«¤¤¬¢¢¤¤«¤¤«««¤¤°°««¤¢«¬««¤¬´°¬¬«¬«¤¤¤´¬¬¤¢°¤«¤¤¢«¬¾ÅϾ°«¢¤¸¾´¸ÂÅÅÊÑÑÏÏÏÊÊÊž¾¾Â¾¾Â¾ÅÅÅÅÅÅÊÊÊÊÊÊÅÅÊÊÊÊÊÊÊÊÏÏÏÏÏÊÏ¢¢«¬´¸¤¬°´´Å××, %%+%%+,3373,733,++3,93,33,,,ÿI[m¢¢¢¢¢¢¢¢¤¢¢¢¢¢¢__mi__g_[_bb__[[__b__[bgbirw¢¤¤¤¤¬««¬««««¬«¬«««¢¢wmg[VMMIQVQ[_____b_gbbg_b_bgb____bbbb_bgggbigg_b_gbb[[[VMiÅÝÊ«¸¸°¢¤«zriwrgbiimmmmmgmgwzzmwww¢¢¤¤«¢°´°¢¢¤«¤«¤¢¬¬¤¢¤°¬¤¢¢«¤¢««¬««°¬¤«¢¢¤°«¤««««¤°¬«¢¤«¬«¤¢«¢¢¢¬¸ÂÊÅ´¬««°¾´¸¸ÅÅÅÊÊÏÏÏÊÊÅÅž¾¾ÂÂÂÂÂÂÂÂÂÂÅÅÅÅÅÅÅÅÊÊÊÅÅÊÊÊÊÏÊÊÏÏÏÏÏÑÑÑÏ«¢«°¸´«¬«¬°¸ÏÚÏm%%%+%,++,33,37,,%,%+,,777,,,377FQMbz¢¢¢¢¢¢¢¢¢¢___bb[[_[__bb[_[_[_bg_b_bmww¤¤««¬¬«¬¬«««««¬«««¢wig_VMMMQQQVV__[bg[bbbbbgbg_b__gg_bb_bggiibggbbi_bb__[[_VrÑÚÅ´°¾´¢«´¬«¢zzzwwrwmimgigrmg_rbwz¢«¢¢¢¢¢¤¤¬«¤¢¢¤¢¤««««¢¢«¬¤¢¤¬¤¤¢««¢¢¬°¬¢¬°«¤¢¤«¬¤¢¢¢¢¤«¬«««¢¢¤¬«¢¤¤°ÂÅž´¤«¸´´´ÂÅÅÊÏÊÊÊÊÊÅÅÅž¾ÂÂÂÂÂÂÂÅÂÂÂÅÅÊÊÊÏÅÊÊÊÅÊÊÊÏÊÊÊÏÏÏÏÑÑÏÑÏѤ°´´¢¤«¤¤¬¸Å×Ý´=%%,%++,+3,7,337F+%+,+,377,,+77BFFbm¢¢¢¢¤¢¢¢¢¢¢¢___bb_______[g___[[b[_bbbgmw¢¢¤¤«««««¬¬¤«««««««««zibb[QMMVQV[[V_[_bgbb_b_b_b_g_bbbbggbbbggg_bgbbggbb___VQQÏ×¾°°¸¸¢¤zrwwmmbgigbbbiizww¢¢¢¢¤¢¢¤¢¢¢¤¤¤¢¤¤«««¢««°¤¢¤«¬¬««¤¤«°¤¤°¬«¬¤¢«¤¢¢¢¬¬«¤¢¬¤¤«°ÂÊ´¬«¬¸¾«´ÅÂÂÊÊÏÅÊÊÅÅž¾¾¸¾ÂÂÂÂÅÂÂÅÅÅÅÅÊÅÅÊÊÊÊÊÏÅÊÅÊÏÊÏÊÏÊÏÑÑÑÑÑÏÏ¢«´¬¢«««¤«¾ÑÚ×,++,3+7+3,,,97,+=B+++,373,77,3¿Ibz¢¢¢¢b__gg[[_[[__b_b_b___[_gbimrz¢¢««¬¤«««¬¤«¬«¬«¤«¬¢¤wmg[QQIIVQQ[[[b[bg_bbbbgbbbg_bggb_i__bbb_bbbb_bbggg_[[QQVzÑÏÂʬ´Â«¬¢«zwzrmimig_bwwimwwzzw¢¢¢««¢¢¤¢¢¤¤«¤¤«««¢¢¢¢°¬¢¤¤«¤«¤¢¢¢¢¬¢¢«¢¢««¢¢«¤¢««¢¢¢¢¢¢¬´ÂÂʾ¬¤«´´´¸¾ÅÊÂÅÊÅÅÂÅŸ¸´¸¾Â¾¾¾¾ÂÂÂÅÅÂÂÂÂÅÅÊÊÅÊÊÊÏÏÏÊÊÊÊÊÊÊÊÊÏÑÑÏÑÑÑÑÏ´«°°¤««¤«Ê×ÝÊ_++%%+37+333,7+,++,77377993,3,7F9FQm¢¢¢¢¢¢¢¢¢bbbbgb_bV[___[bb_[___bibimw¢¢¢¤¤««¬«¬¬««¬¬¬«««¤¢¢zmg_MQIFMQV[VV[[_b_bg_bb___bbbb_b_____bbbbbbb_bbbg[b[[VQVÝÊÊÅ´¸¾Â¬«««¤¤zzzmmmiib[bmzrmrzzwzm¢¢¢¢«¬«¢¤¢««««¢¤¤¢¢¤¢¢¢¢««¢¤«¤¬¤¢«¤¢«¬¤¤¤¤¤«¢¢¢°¸Âž°«°´°«¬¾ÅÅÊÊÊÅž¾¾¾´¸°´´¸¾¾¾¾ÂÂÅÅÂÅÅÂÂÅÅÅÊÊÊÊÏÊÊÊÊÊÊÊÊÊÊÊÊÏÊÏÑÑÑÏ×ÑϤ°¬¤«¤¢¸ÏÚݬ9+%%+++3,337,,3=7%+3F379373,33BFFMgz¢¢¢¢¢¢__b_gbbg_b__g___b_g_bbbbirrz¤¤¬«¬¬¬«¬¬¬¬«¬¬««¤¤¢zrmbQMIFVMQ[[[[_[bb__g__b__bi__bbbbbbbbg_bgbbbgigb__[[VQ[¢Ý×ʾ¾Ê°¢¾°¬«¤¢ziimib[[zwzirzzwzmrz¢¢««¤¤z¢¤«¢¤¢¤¢¤«¢«¢«¬«¤«¤««¤¢«¬¢¤«¤¢¢¢¬´¸ÊŸ««¬¸¾¬¸¾ÂÊÏÏÊÅž¾¸¸¸´´´´¸¸¸ÂÂÂÂÂÅÂÂÅÅÂÅÅÊÊÊÊÊÊÊÊÊÊÊÊÊÊÅÊÏÊÊÊÏÑÑÑÑÏ×ÑÏ««°¤¢«¢¢zr°Å×Ý×+ ++,+3,777333,99,33FFw=,97,39IVm¢¢¢¢¢¢____b_bbgb____b_bbb_gbgbgmwz¢¢«¤«««¬«¬¬¬°«¬¬««¤¢¢rbbVIIMQIQQQV_b__[__gb___b[_____bgbgbbbbb[_bbg_b__[[VQMVÚÑÊÅÑÊ´¬¾Å¬°°¤«wiiib[[izzzmwwzzwz¤¢¢¢¢wmi[[_m««¤¤¤¢¤¢¢¤¢¢¤¢¢¢¤¬¤¢¢«¢¢¢¢¤¤¢¤¬¢¢¤¸Â¾Å°¤¢°°¸Â¾¸ÊÊÏÊž¸¸¾¸´¸¸¸¸¾¾¾ÂžÂÅÅÅÅÅÅÊÊÊÊÏÊÊÏÏÊÏÊÊÊÊÊÏÊÏÏÑÑÑÑÑÑ׍°¤¢¤mgmrz«¾ÑÝÝÂQ%%%++,3+377933y,773BF993,377,=Ibr¢¢¢¢¢¢___bb_bbb_g_____bbbbigmimmzz¢¢¢«««¬¬¬«««¬««¬««¤¤¢¢i_[QIIMIMMQV[[b[b[_[_bbbbb_b[_gbgbbbbbgbbb_bb_gb____QQMQ×ÏÊÑϾ°Âϸ«´¬¬wmb[Vbzzzriwzwzw¢zw¢«¤zribIF«¤¢¤¢¢¢¢¤¤¢¢¢¤¢¤¢¢¢¢¤«¢¢¤¤«¸ÂϾ´°¬¬¬¬´ÅÅŸÂÊÏÊÊŸ¾¾¸¸¾¾¸¾¸¾¾¾ÂÅÂÂÂÂÂÅÂÅÅÊÅÅÅÅÊÊÊÊÊÊÊÊÊÊÊÏÊÅÊÏÊÏÏÑÑÑÑÑÑ×Ï«¤¬wmgV_mw°Å×ÝÚ«7 ++ %,,3779=3,37,3,,9IB3733,37=B[i¢¢¢bb_bb_bgb_b_____bbgbggigirrz¢¢¤«««¬««¬¬¬«««¬«««¤¢wm__QQIIFM[V[[[[_gb_bbggb___[__bbbbb[_b_gbgbbbbbb__[VVMM[¢ÝÏ×ϸ´ÅÊ¢¬°««¤¢¤«rb[_rwgmwzwz¢¢wmgiimrwwzzi[9¢¢¢¢¢¢¤¤¢¢¤¤«¢¢¢¤¤¤¤¢«¤¢¤°¸ÂÊŬ««¬¬Â¾ÅÊÂÅÂÊÅŸ¾¾¸¾¾Â¾¾¾ÂÂÂÂÂÅÅÅÂÅÂÅÅÅÅÊÊÊÊÊÊÊÏÏÊÊÊÊÏÏÊÊÏÏÏÊÑÏ×ÑÑÑÑѤ¬w__gg__m¤¸×ÚÝÑz++ %%,,7,7,3,3,,3+,3=s3BF79BBb¢¢¢¢¢¢¢gg_bbb_b__b_bg_bg_bggiiimmrz¢¢««««¬¬¬««««««««««¤¢wmb[VMIIIQMQV[[bVggbb__bbb__[__bbb_b_bb_bbbgibbib_b_VQVMVÝÚ×¾Êʾ««Â°¾«¤«¢gbbgwzgiwrmmzrb_biimig[[_[irwrw¢ziMm¢¢¢¢¢¢¢¤¤¢¤¤¤¢¢bz««¤¤°ÂŸ°«¢°¬¸Â¾ÂÊÊÅÅÂÅž¾´¸¾¾Â¾¾¾¾ÂÂÂÂÂÅÅÅÅÅÅÅÊÅÅÅÅÊÏÊÅÊÏÊÊÊÏÊÏÊÊÊÊÊÏÏÏÏÑÑÑ×ÑÑÊ¢¢«zgQMQV__g¬ÊÚÝݸB% %,,,,+37+,7,,,+7797337373=IVm¢¢¢¢¢bb_bbbbb[_bbgbgb_gbbiigimmwz¢¢«¬¬«¬««¬¬¬¬«¬«¬«««¢zi__QIFIIQQVV[V[[b_gb__b______bg__b_ggbbb_bbbbbb___[[VMMMÚÚÅÂÑÑŬ¾Â¸¢¤´¢«¢¢¢rbwmrzzwbgzwzrzzziQgwzwmmmbV__gi_r¢¢g_m¢¢««¢¤¢«¢zibQ7=z«´Âʾ¬««««¸ÂÅÅÅÅÊÊÊÅÅÅž¾¾¾¾Â¾¾¾ÂÅÂÂÅÅÅÅÊÅÊÊÅÅÊÊÅÊÊÊÏÏÏÊÊÊÊÏÏÊÊÏÏÏÏÏÑ×××ÑϬ¢¤¤gVQQQVbbbm°Å×ÝÝÚ+ %%%,+,3373++%,,3739973,39397I_w¢¢¢¢¢__bg_bgg_bbbb_bbbbgbggiiirrw¢¤«¤«¤««¬¬¬«¬¬¬¬¬«¤«¢zmb[VQIFIIMV[V_[_bgbg_bbgb_bg_g__gb__bbb_bbbbg_b[b___[QQQÚÑÊÑÑ´ÅѾ¢°«¢«¢zwwzwwzzzz_izrwzzzw_[_wwrwwm_gVMbmbV¤¤¤¢¢rgbb_irz¢¬¢wmi¢¢¢wwV79M¢¢¬¸Âۤ¤°¤¢¸ÅÂÊÑÏÊÊÊÅž¾Â¾ÂÂÂÂÂÅÅÊÊÅÅÅÊÊÊÊÅÅÊÊÊÊÏÏÊÊÊÊÏÏÊÊÊÊÊÏÏÏÑÑÑ××Ñ´¢¬wVMIVQ[Vbir°ÂÑÚÚÝÂ_%%%+%%+,,73+,33+,,,393773,33379=Mg¢¢¢¢¢¢bbgbbbbb__bgbb_bibbggiigirwz¤««¬««¬¬¬¬¬«¬¬«¬¬«¤¢¢zrb[MMFFFMMV[V[[_b_bbbb_g_gbi_b_bggggbb_bbgbgb___b__[QMMVÝÑÚ×´ÂÑʬ«°°¢«««mrzwrzzzbimwrmmzz[[mwwwwrrmQIIMM¢««¤¤¤¤rrwrm_[bm¤«¢¤¤¤ggwr¤gmiF,3[´ÂÅ´°«¤¤¤°Â¾ÊÑÏÊÅÅž¾Â¾¾¾¾ÂÂÂÂÂÂÅÅÊÅÊÊÊÊÊÊÊÊÅÏÏÊÏÊÏÊÊÊÊÊÊÊÊÏÊÊÏÑÑÑ×××Ѹ¤¤¤¢z_MIQVVb[_irz¤¾Ï×ÝÚ×, % +%%3,7,,73,,7,,,337=93799BM_r¢¤¢¢¢¢bbbbb_bgbb___bgbgb_bgbbiimw¢¢«¬¬««¬¬°°¬«¬««¬««¤¤zmg[QIBIMMVQQVV[[_b_bgb___gg_g_b_gbbbggbgbbbbb_g_b[VVVMMQÚÚÚÅ´ÊÑÊ´´Â¸¬¢««¬¤¢wwrwwwzmzrgzwwwzrmzigwzzwimgmg[QM9V««¤«¤«¢zwmrzwrib[iz«mgg[BQb[=Bmrb3 ,z¤¢°ÂÅ´¢¢¢«´¾¾¸¾ÅÊÅÅÊžÂÂÂÅÂÂÂÂÂÅž¾¾ÂÂÂÅÂÅÅÊÅÅÊÊÅÊÊÊÊÅÅÏÊÊÏÏÏÊÊÊÊÊÊÊÊÊÏÊÏÏÑ×ÑÑϾ«mVIQ[V[[i_bmw´ÅÑÚÚݬB% %%,=+,,3,,,33,++%,777y3,,79IViz¢¤¢¤¢¢¢¢¢¢bbgbb_bbbggb_b_bgbbbbigirmw¢¤««¬«¬««°¬¬¬¬¬¬¬«¬¤¢zrb[QMFFMIQMQV_[bb__g___bbgbgbbbggg__gbgbbgggbbg__[[VVMQQ×ÝÏÂÏÑŸ°ÊÅ´¢°¸¤¤zwmrwrrmrzziimzzrwmwzzrwrrmiig__[V[[bI9F¤«¤¢¢rriQFBFQ_mibrgVbb_V[339BF37Q_F+ ,[°¸Å¾«¢¢´´¾Å¾ÂÂÅÅÅÅžÂÂÂÅÅž¾ÂÂÂÅÅÅÅÊÊÊÊÅÊÅÅÊÊÊÅÊÊÊÏÏÏÏÅÊÏÊÏÏÊÏÏÏÏÑ××Ϭ¢g[[MMQ[bV___gz°ÂÊ×ÚÚÊi+,+%%+,,,,7,,,7,+++++3373,3,3,37Fgw¢¢¢¤¢¢¢¢¢bbbbgbb_b_gi[bbiiggiggiirr¤¤¬«°¬«¬¬°°«¬«««¬¤¢¤¢rmbVQIFIIMMQVV[b[[[__bbb_iggib__giibbgbbbbbg_bbgbb_[VVQQVÚ×ÂÑ×Ê´¾Êʾ¬´´´¤w¢¢°mmrgizwrrzr_grzmrzzwrrggggibQIF=9=IB3=z¢¤«¢wzzwmb_[QQVwbMFFQQQ[BFBQ9,,777+,=3%%+Fz¢´ÅÅ´¢¢¸ÂÂÊÊÅÅÂÅÅÅž¾¾Â¾Ê޾ÂÂÅÅÅÂÅÊÊÅÅÅÊÊÅÅÊÅÅÊÅÏÊÏÏÊÊÏÏÊÊÏÏÊÏÏÏÑÑŰ«rbQQVQVV[_V_bgm°¸Ê×××Ï3%% %%%373,37+,7+++++,,77773,,,7MVg¢¢¢¢¢¢¤¤¢¢¢bbgbbbgbb_ggbbbbgbgggimrrwz¢¢¤«¬«¬¬«««°¬¬¬¬°¬¬«¤¢mgbVIMFFMMVQQ[_[g___[b_bgbgbb__g_g_bbbbg_gbbgb_b[_[bVMQM××Ï×ϸÂÏϸ´¾Å´¤°¤z¤¤wrgmrmzzwm[imwrzzmrzzm[zzi[[gibm[MMQMIF9=IFzmgVQbbQB=QQ_rmQ=BMB=÷9F7++3,,,+%%%++I¸ÊŬ¤°¸¸ÂÅÊÏÅÅÂÅÅž¾ÂÂÅÅž¾Â¾¾¾ÂÅÅÅÂÅÅÊÅÅÊÊÊÅÅÊÊÅÊÅÊÏÏÊÊÊÊÏÏÏÏÏÏÊÏÑÏŰm_[[QQVVVV[_[bmr¬¾ÂÊÑ×׸M%++%,+3,37,33+37++3,,,933++,33Mbw¢¢¢¢¢¢¢¢¢gggbbbgggbgb_gbggbigmgiiizwz¢¤¬¬¬¬¬¬¬¬´¬¬¬¬¬°««¤¢mg[QIIFMMQVQQ_b_[_bb__bb_gbbgb_ggb__b[b_bbbgbbb__b__[VQImÅÚÚѾ¾Ïϸ°Êʾ«««¢zzr«wimiimwrwwm__rzwwwrzzzwgwrg[bbgmgb[V_gibVFV[_zmMF=IBFF=9Mbzg79B[·37377,+,,++,%%% ,Qw¬Â¾¬«¾ÂÂÂÅÅÅÊÂÂÂÊž¾ÂÅÅÅž¾¸ÂÂÂÂÂÅÅÅÊÅÊÊÊÅÊÅÅÅÊÅÅÅÏÏÑÏÏÊÏÏÏÏÏÊÑÊÊŬig_[[[VVVVV[_[_[bw«¸¾ÂÏ×ÚÑ+,++%+,3+,3333,,3%+7973779,,,+%37Mm¢¢¢¢¢¢¢¢¢¢¢¢¢¢bb_bbmgggbbbbb_bgbggimmrmww¢¤«¬¬««¬«¬¬«¬¬°¬¬««¤¤zrgVQQMBIIQVQV_b__b__g_bb_iibb_bggibbbbgb_bgbbgg_bb__VVQMb¬Ý×ÂÂÑʾ´ÏÚ۸¬¢zmzwigmrmrrrzi[biwwwzwwrzigzr[brwwwb[[rwwzmgbi_ggrwzi[VMMI79FQig9_MB7,,++,+%+,7++%,39_«Â°¤´ÂÅÊÅÊÊÊÅÅžÂÂÂÅÂÅÅž¸ÂÂÂÅÂÅÂÅÅÅÂÊÊÅÅÊÊÊÅÊʾÂÊÑÏÏÊÏÊÏÏÏÏÑÏʾ¬zrb_Q[V[b[_Q[[Q[_bgbm«´¾ÂÊÏ×ѤF%g%,%,,37,73733337++,,7973,,,%%,=[w¤¤¢¢¢¤¢¢¢¢¢¢¢bbbgbiggbgbbbgi__ibbimmrmrw¢¤¤««««°¬¬¬«¬¬¬««°««¤¢zrg[QIFBIMQQQV[[_g[_bgbgg__b_ggbbbbbbgbggg_gbbgmbb_b_V[VQ_ÝÏÊ×Ï´Ï×Ï´¸Å¬iwwwrmrmmmrzr[gmmrwiwzm[iriirwmgrzziMIFVbi_[_rw[QMQgF9B97Biw_B9=9F[VF++3% % %+FF%%3b_m´¾°¢¸ÅÅÊÊÊÊÊÅžž¾Â¾ÂÂÂÂÂÂÅž¾¸ÂÂÂÂÂÅÂÅÅÅÅÅÅÅÊÊÅÅÅʾÅÊÑÏÊÊÏÏÏÏÑÏʸmb[[VVV[__[V_QV[Vbgmrw°°¸¾ÅÏ××°[,%3,,%++3377,937,,,++,,973,++7%,7I_¢«¢¢¢¢¢¢¢¢¢¢¢¢__gbbgigibbbbb_bgiggiimmmwwz¢¢¬«¤«¬¬¬«¬«¬°«¬¬¬««¤¢¢wbVQFFIIQQQVV__[[b[_bbb__b[bbbbggi_bgbbbg_iggbbbb_[b[VQM[ÏÑ×ѾÊ×ʸÊϾ¤¢wwmzzwzrwzrrwmrrzi_rzrrzwmrzwbwzzwgiwibiiwwrVBQQIgbMI_rm[QVFVV33FBFmmB39IMMQ=FV++3% %+% %I´¸«¢¸ÊÊÊÏÏÏÊÅÅ޾¾ž¾¾ÅÅÂÂÂÅÅÅÅÅÅÅÅÅÅÊÊÂÅÂÏÏÏÏÏÏÑÏÑŰw_[[V[VQ[[V[gV[____ggrz¬¾¾ÂÊÊÊÅV,%+++%+337373,,,3797,+733,+%%,9Qi¤¢¤¢¢¢¢¢¢¤¢¢¢¢bbbbggimigbbbb__bgmiiiimirzz¢¤¤¬«¬««««¬¬¬¬¬«¬¬¬¬¤¢m__MQIIMVQVQ[[[bb_b__bbbbgbg_gibbbb_bbbgbbibb_bb_[b_[QQQMiÂÝ×ÊÅÏ×ʸÅÑÏ´¬°¤wmmgzrrwrzrmzwwmgirwwwmiwzzrbmzigrzgimmmw[bVBFM[MQMBQmrr_bigIMF9MVViwV=I__MIBII_37I++%%%% %,V°Â´¢¸¾ÅÊÂÊÊÅÅÂÂÅžÂÂÅÊž¾Â¾ÅÅÂÂÂÅÅÅÂÂÂÅÅÅÅÅÏÊÊÅÊÑÑÏÏÑÏÑʬib[VVVV[[VVVbb_V[__bbbr¢¬´ÅÅÅÏÂb=3%+%+%+3,37,33,737+373393,++%+,=bw¢¤¤¢¢¤¤¢¢¢¢¢¢¢¢¢¢¢ggggggbbg_ggg_b_bbiimmmirwz¢¢«««¬««¤««¬¬¬¬«¬¬¬¤«¤¢zib[QMIFIQMQV[___bg___bgbgbbg__bgggi_bbggbggb___gb_[[[VQMQiÊÝÊÊÑ×ʸÂÏÊ´¾¸¬zriwrzwzrwwi_irwrrmzzzwrigrm_rzwzmggQIBMBy7BBFFQbrg[w[bb__bim=BQ[gQ973,M_g,,,7,%+ %3_°Â´°¾¸°ÅÂÂÊÅÂÂÂÅÅž¾¾Âž¾Âž¾¾¾¾¾¾¾ÅÂÅÅÂÅÂÅÊÊÏÊÏÊÊÊÏÏÑÑÏÑϸb[V__QV[[VVQVV[[__[bgirr¢¤°¸ÂÅÅÊÂ3,+%%3%,3333333,+,+,,7,33979,3++++3Vr¢¢¤¤¢¢¢¢¢¤¢¢¢¢¢bbbbmgggiggbg[b_bbbmgmimmrz¢¤«¬¬¬«««¬¤«¬¬¬¬«««¤¤zmg[MMIFMQQQV[b[_____b_b__g_g_bggbgibbgig_gbg_gb__b_[_VQQM_¸ÚÏ××ÏÂÅÑϸÅŬwii¢zmzrmg_gmwrwrrzzbmzriizwwwgQM9F9=799¿I_ib_b[wrigmF[mm7,7=,+9gw9,+,%7+ %=i¬Â°rr¸Â¸¸¾¾¾¾¾ÂÂÂÅŸ¾Â¾¸¸Â¾¾¾Âž¾ÂÂÂÂÂÅÂÂÅÅÊÊÊÏÊÊÊÅÊÏÏÑÏÏÊ«rg_V[[b[[_[[VVV[gbggrimz¤°´¾ÅÏÅÊÅ7%++%+++,3,377333,++37++79377y3++,3B[r¢¢¤¢¢¢¢¢¢¢¢¤¢¢¢¢¢ggggbgiiggbgb___bggiiiimrrw¤¤««¬¬¬«¬«¬°¬¬¬««¤«¤¢¢ib_MIIIMQQIQV_[g[b__bggg_bgbb_gbggbb___gbbbbb_b____[_VQMMV×ÚÑÅÂÏÑʸÅÚÅ¢¤wiw¢¢rzrri_mzrwmzzzzwrmbmzibwwwmbibQB99B7399797999I_mg[zgMimVIgzgF[wzyMF9=Ig7% + +3=w¸´¢ri´ÅÅž¾´´¸¸Â¾Â¾¾¾¾¾¾¾¸¾¾¾Å¾¾Â¸¾¾¾¾Â¾ÂÂÂÅÂÅÅÅÅÊÊÅÅÊÊÏÊÏʾ¢b[_[__b_[V[[QQ_[[biwz«°´ÂÅÊÅÏÏ3%++++,3+,,,337,3+,,333%+,,3379773,,37Qi¢¤¤¢¢¤¢¢¤¢¢¢¢¢¢¢¢¢iiiiigigiggbbbbbbbbmiimmmww¤¤«««¬««¤¬¬¬¬«¬«¬¬«¢¤mb[QQIIMIMVQV[[_[_[[bbgbbbb_bbbbbmb_b_bgbgbbb____[bbb_VQQQz×ÝŸÊ×ϾÂ×Ѹ¬¤zzwriggimzrwmrzzzwbbgbmrg_QMMMFFMMFB377=B9=BVmm[zmQgbQ7Iig[Bwwg3FIMQ9,3mz9% ,FVw«Â¸rmw´¾ÂŸ¾¸¸¾´¸¾Â¾¾¾¾¾Â¾´¸¸¾Â¸¾Â¾¸¾ÂÂÂÂÂÂÂÅÂÂÂÂÊÅÅÅÊÅÅÅÊÊÊŸ¢zm[[[[__[[[[[V[[[gww¤°´¾ÂÂÂÏÑ´V+%++3,+++,,773777,+,3,+,33339B9997739B_r¤¢¤¤¤¤¤¢¢¢¤¤¢¢¢¢¢¢¤¢¢¢iiiggiggggbb___bb_bigmmmirw¤««««««««¬¬«¬«¬¬«¤«¢r__QQQIIQMVV_[__[__g_b__bb_bg_bb_ggg[_b_bibi_bb_b_bb[_gMQQrÏÚÅÅÑϾÅÏϸ¤zzg_brrrmzmrwzzmVzrbgb_I=9I_MMMMB39FVib_rQ[V=[bQ__[II_bbM3%,zz%% %B[«Â°wr´¸ÂÅž¸°°´´´´¾¾Â¾¾¾¾¾Â¾´´¾¸¾¾¾¾Â¾¾¸¸ÂžÂÅÅÂÅÅÂÅÅÅÊÅÅÂÅÊʸib___g_VVVV[_bgmz¢¤¢¤¬°´¾¾ÂÅѸb,+,33,3,7333733337,,++++,39==B=M3,,33Iiz¤¤¤¤¤¢¤¤¢¢¢¢¢¤¤¢¢¢¢¢¢iiiiimggggb_gbg_gbggbiimmmz¤¤¤««¬««¬«««¬¬¬¬«««¤¢zmbV[IFIFIVQVgV__b_b__bb_bb__gbgigbgbb__ggig___bggbgbb__QIM_°×××ʾ¾ÏϸÂϸ¢wb_grwmwrrzzzzwiFwbbQIVIFbbQQ[F37,,37,3=Iir[rz_gI7,393F[giQIMQ_iM=7 ,,wi +_¤¾¬rr¢´´¾Â¾¸´°°°´°¸¸¾¾¾¾¾¾¾¾¾¾¸¾¸¸¾¾¾¸¾Â¾¾¾¸¾Â¾¾¾Â¾ÂÅÂÂÂÅÅÊÊÊÊÊʸw[VwwgbbbbV_[_grwz¢¤«¤¬°´¸¸ÂÅÏ«_3%++,,7,,,,737779333++3++++,3333,9FM,3FQr¢¢¤¤¤¤¤¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢igiigmgigib_gbgggbbgggiimmz¢¤¤««¬¬««¬«««««¬«««¤¤¢mg_VVFFMIMVQ[[[b__b[_bb_bbbg_bbggbg_gbb__gbbbbbb_bbb_V[VMMQ×ÝÑÂÅÑÊ´´ÑÅ«¬¤¢zz¤¢zr_iwrrizzwmrzzzwrzgIzwgV_QM;IVbig[Fy333777,9Ib_igbI3,+3,,[rwB9M[mb[y +,F++ 3[°¸wz¬¾¾¸Â´´°°´°°¾¾¸¾¾¸¾¸¾¾¾¾¾´¸¾¾¾¸¾¾¾¾¾¾¾Å¾ÂÂÂÂÂÂÂÅÅÅÅÅÅÊÊʾmigb_rzmb__g_gmw¤¤¢¢¤««¬°°°¸ÅÊϬV3,%%+3,3,7,7939=,+,+,,++,79BI939939=Qg¢¢¤¤¤¢¢¢¢¢¢¢¢¢¤¢¤¢¢¢¢¢¢¢¢¢iiigimigigggigibibgbggiimrw¤¤¤««««««¤¬¤««««¬¤¤¢mi[VMMMIMVQQV[V_[___[b_g_gg_[b_bg_i___gbbbigbbbbbbbbb_[VQMMrÊÝÊÏÑϸ¸ÏѰ´Å°rw¤rmb[mwwww_mwzwwrwi[mb[QQ9737I_mr_BBB7779+,793+9bwrwgI++++3,BwV9=Qiz_9+%+ %IBV, 9g¬¾¢z«Åž¾Â¾¾´´´´´´¾¸¾¸¸Â¾¸¸¾¾¾¸¾¸¾¸¾¸¸¸Â¾¾¾Â¸¾¾¾¾ÂÂÂÂÅÂÂÅÊÅÅÅÅÅʾ«[Ibimbwmmrzz¢¢¤«¤¤¢¤¢¢¤«°°´ÂÏϤQ,,%+,,+,,,,7,7733999333,+%++3399BI77,739[r¢¤¤¤¢¤«¤¢¤¤¤¤¢¢¤¢¢¢¢¢¤¤¢¤¢¢mmigiiiibggiiii_gbi_bigirrz¢¤¤«¬«¤«¬««¬¤¬«««««¤¢rg[VMFIIMMQVQ[[b[_[____bg[bb[gbg__bbgbbb_gggbbgggbgbb_[[VMMb¤ÚÑ×ʾÂÊʸ¸Ê¢«¢rzriigiwwwmmzzwzmIzbb_MB7979ImrbM333,73773,7=3,Mwwzrzg_Q,,9+%,Br[=F[_g_M,+ % +_z_g+%Br¬°z¬ÂÊŸ´°¸´°´´¾¸¸¾¸¸´¾¸¾¸¸¸¸¸´°¸¸¸¸¾¾¾Â¾¾¾Â¾¾ÂÂÂÂÂÂÂÅÊÅÅ´iQFMgmmgw¢¢«¤¤«¤«¬¤¤¢«¬´´¾ÊϬV++%,,%+7,337B9377,773,,7,3%+++373373,Bgz¢¤¤¤¤¤¤¢¤¢¤¤¤¤¢¤¤¢¢¢¢¢¢¢¤mmigbiggmiiiigb_bggbgigirrw¢«¢«««¤¤¬««¬«««««««¤¤zmg[VMFIIIQQQQV[_[bbbbbbbi_bggbbbbb_bbbgb___b_bbgbbggbb_[VQMQÑÝϾÅÏÏ´¸Ïϰ°¤z¢zzimirrzrbizzwwrrwrQwm[QFw9FgmmQ73,,,+3997+337+,_wiziVM,339,,BmiQ=IVV_M3 3,%%miBi3Iz°°ww´¾Åž¸¸¸´¸´°´´´¸¸¸´´´¾¸°¸¸¾¸´´¸¸¾¾¸¸¾¾¾¾Â¾¾¾¾ÂÂÂÅÅÅÅÅÊÊŰVBi_QM[rmiiz¢¢¢¤¤«¢¤¤«¤¤¬¬«¤«¬´´ÂÏÑ´b,%%+,%+,333977B77s33+37,37,337=3,,%+773[i¤¢¤¤¤¢¤¤¤¤¢¢«¤¤¢¢¢¢¢¢¢¢¤¢¢mmmgbmggigbgggg_bb_gbggimrrz¤¤«¤¬¬¬¬«¤¬«¬««««¬«¤¢¢ri[VMFIIIQQVV[__[____b__bbi_bgbggbgg_gbb_g_____gggbibbb[QMMVmÊÝÅÊÑÅ´´Ïϸ¸¾¾¢¤¤z«wzigrwrrrgbrrzzwwzwwgmz_izVB99=9=IgmQ99,33,3+7=,+,,,3,=bQ_b_333777Biz[F=Mb_F,% +3+ 3V+I[´°z¢´ÂÅÅž´´¾¸°°°´´´¸¾¸´¸¸¸°°´¾¸¸°¸¸¾¾´¸¾¾¾¾¾¾¾¾ÂÂÂÂÂÂÅÅÊÅÊÊŸ_77B_ig[Vbmg_r¤¤¢¤¢¢¤«¤¤¤¤¤¤¤¬««°´¸ÅÏÑÂr3%%+%+,,3,777w373,,73+,7+3737,797,++,3,Fgw¤¤«¤¢¢¢¤¤¢¤«¤¤¢¢¢¢¢¢¢¤¢¢¢¢¤¢¢mmiiiiggggiiigbbgigiigiiimr¤¤¤¬¬««¬«¤¬«««¬««¬«¤¢mg[QMFFMIVV[V[__bbb[___bbgbgbbbggbgbbg_b_b_bb_bbbibibi_[VQQQb¸ÚÑÑʸ¸ÏѾ¸Åʾ¢¬¤¤¤wg_irzzwgbbwwzrmwzrb[[izrVVr_B¹=9QggM3393++,79B7+%%37,3bwg=QVB,+,39Fmg[IM[iB%% 3I+ ,3F3b°¬zr¸¾ÂÅÅž´¸´¸´°°´¸¸¸¸´¸¸´´´¬´´´´°´¾¸¸´¸¾¾¾¾¾Â¾¾¾¾ÂÂÅÂÅÅÅÅÅÅÂ__B,,=izwmb_wibi¤¤¤¤¤¤¤«¤«¤¤«¤¬¬°¬¾ÂÅÏѾw9,++,%+%,,33373797,37s,,,,37,337333%,3Mg¢¤¤¤¢¤¤¢¤¤¢¢¤¤¤¤¢¢¤¢¢¢¢¤¢¢¢¢¢¢¢iimmiiigigibii_ggbbgggiiiwr¢¤¤«¬«¬¬«¤¬«««¬¬««««¤rm[[VFFMMQVV[[_V[__bg[[__gbbbgbggbgbbbbgbgbbb_gggbgbgb_[_QVQ[¬ÝÝѾÅÏѾ°ÏÏÅ«¤«¤´«i[gizi_brwwzwzzzzwwwwmb[MQwm[V[QB=QbVF97BB3,,,ÿ3+ +79,FwzM3MI333,9Imri[_gg[% %3bQFM_´w«¾°¸ÂÊž´´´°¬°´´°¾¸¸¸´´´°´°´°°´´´´´¸´´¾¸¾Â¾¾ÂÂÂÂÅŰzB7Qb;bwggrwib¤¤¤¢¤¤¤¤¢«¤¤«¤¤¬¬´¸ÂÅÏѸr,+%%%%%+,337,77399w9793+,+,,++7979s+737[r¤¤¢«¢¤¤¤¢¢¢«¤¢¤¢¤¢¢¢¢¢¢¢¢¢iiiimgiggiigigbgbigi_ggiirz¢¢«¤¬¬«¬«¬¬««¬«¬«««¢¢¢zri[[IFIQIQ[QV_[[__Vb_[b_g__g_b_gb_g__b[bggb_bbgbgggbbib_[[QMVÊÝÊÊÑ×Å´ÊѰ¤°°°¬m_grzgrwwzzwzwwrzzmbQI[zzw[VB9=MVVQMBB¹79,,=MM,% %%,7Fgir_99=7+33,7bzrMM[zwr[3 %+_wI _r¬«zz«¸Â´¾ÅÅž¸°´°«°´¸¸´´°¸¸°´´°´´°´´°°«´°¸¾¸¾¾¾¸¾¾¸¸Â¾¢[33=Vg_=BVrgwzwgw¤¢¤¢«««¤««««°¬¸¸¸ÂÂÏÏÂ,%+%%++,,,3,3,79,377337733,,,,33,37337,3,73Igw¢¢«¢¤¤¤«¤¤¤¢¢«¤¤¢¢¢¤¢¢¢¤¤¢¤¤¢¢¢¢¢¢imimiiiigggggbbgbgbigbggimrz¢¢¤««««¤°«¬«¬«¬¤««««wi[VMFIIIQ[V[__[___b_gb[bbbbbbbgg______bbbgbbbggbimiggbb_[VQVg¤×ÑÚÑʾÅ×Ű«¢°¸¬¤¢gbgmzzzimzzzwwwzzwrzziiVVMbmiM99BBBFIVIFM9939=QQ9,%+%%77_bMmF+,97F93=gzbIB_wrgB+++Vw ,z°°zwww¤¾ÊÅÂÂÂÅž¸´°´´°´´´¸´´¸´¸¸´°°°´´°¤«°´´¾¾¾¾¸¾¾¾¸¸¾Â¾Â¾¾¸F, +F_rr[=Fwzgiwbi¢¤««¬¬««¬°¬°¾¸ÂÅÅϾ9%%+9+,,3,,3377779777,37377,++,7,3379,39397=Vi¢¤¤¤«¤¤¤¤¤¢¤¢««¤¤¢¢¢¢¢¢¢¤¢¢¢¢¢¢¢¢¢¢ggiggiiigiggggbggbbgbbibgmrw¢¤«««¬¬¤««««¤«««¬¬««¢wb_MIBIBMQQV_V[V_[__b_b_______giib__b___b_bb_giiiimigbgbb__[[Vw¸ÝÚÊÂÏÚʸ´«¢¤«¸¸¢«ib[brwwzwg_zzrwzrmzzwzmig_rm[MMIQMIIFB=IV_QMM=3=[bI+%%%%+=gI_r=,7979=7MbIBVmw_QF,%3MzQ%F°¬zmwz«¾ÅÅÅž¾¾¾´°´°°´´´¸´¬´¸°´°°¬°¬´°¬¬°°´´¾Â¸¸Â¾¸Â¾¾ÂŸ«[7,,,9_iriI=_mizwm«¤¬«««¬¬°´°¸ÂÅϾb9,%%++++,,,,373337377397=7,3+,,+3+777333,,73Ibm¢¢«¢¤¤¤¤¤«¤¤¢¤¤¤¤¤¤¤«¤¢¢¢¢¢¢¢¢¢¢¢¢iiiiigigiggggbbbibgbbiggimrz¢¢¤«««¬¬««¬¬«««¬¬«¬¬«¢wiVVMFBFFMMQV_[[[[_bb__[b_bg_b_bbbg_b_bbgbb__bggggmggiggbb[V[Q_¤ÚÝÏ×ÚϾž«¬°´´¬i[VgzwwibizzzzwzwrzzrzmV=7I__FFBM[VQFFMbgQF=F=,+39_zb,+% %%+IMm9b[,,+,+++3=_QIBVV__Q=%%M+,m¤¢wr¬¾ÂÅÅÅŸ¾¾¾¸¸¸´´°´´´´°´´´´´°¬¬¬¬°°´¸°«°´¾¸¾¾¾Â¾¾¾¾Â´´rVMFF937FimrmQFbiwzmiz«««««¬¬°´´¸ÂÊʸ93++7 %%++,,,37777337999w3,773,+,333,7,33779Qgw¢¢«¤¤¤¤¤¤¤¢¢¤¤¤¢¤¢¢¤¢¤¢¢¤¤¤¢¢¢¢¢¢¢iimiimriiggggbggibbgggg_bmrz¢¤¤«¬¬«¬««««««¬««¬¬«¢¢¢wg[QIBFIIVVVV[[VV__[[[_bb[_bb__bb__bg____b_b_bgiiggmimgigb_[VV[ÅÚÚÝÑÅÅѾ«¢¬°«¸°¤¢r_bizzzrmmwzzzzzwwzzzwrbM937=B=MQVQBFMVVbVIB=B=,%+,VriB+%%+++,Q[i7_F++%,,79=V[QF3=Igg93%,b¤m +F¬rzzw°¾ÂÂÅʾ¾¾¾¸¸´¸´¸´´´°´´´´¬°´¬«¬°´°¸¬°°´¸¾Â¾¾Â¾¾¸¾´°¤r[QIQ[V=FQgmwg_Mrzmbw¤¤¢««¬«¬´¾ÅÏϬg3%%,%% +,,+,3337777FB73B73,73+,33737973,,=FViz¢¤¤¤¤¤¤¢¢¢«¤¤«¤¤¢¢¢¢¤¢¢¢¤¤¢¢¢¢¢¤¢¢¢¢¢wwimimmgmiiimgbbbbbbgbggbmrw¤¤«««««««¬¬¬°¬«««¬«¤¢¢wg[MMIBIMMVVQ___g___[g_b_b_b_b__[_bbib_bbbgbbggibgggmggbggb_[VV_Ïá×ÊÊ×Ï´¤¤¬«¸¾¤igmzwwmirzzzzzwwwrzzwmi[gbi[VMF=BVFIFBBb[MFB==7,+,39_r7+%%,%+3Qbb,b7+,,7=QI=B3,,9Vi[++%7z9 +Fiz_mw´ÅžÂž¾¾¾¾¾¸¸´´¸´´°´´¸¸¸°¬°¬«¤¬´´´´°´°¸¸¸Â¾Â¾Â¾¸¾¸´¸¸°°¤w_MI_i_Q=FigggbImmwig¢¤¤¤¬°¬´¾ÊÏÅ_3++++,7+%+,,37,,,,3397wB73,,,7,,+++,33733,3BBIVr¤¤¢¤«««««¤¢¢¤¤¤¤¢¢¢¢¤¤¤¢¢¢¢¢¢¢¢¢¢¢ggmmmmmgrimiiigbbbbbgbgbgirw¢¤««¬¤«¬««¬¬¬«¬¬¬¬«¢¢rbVVMIIFMQQQV[_[_____bggbgbbgbb___b_g___gbbb_ggggiimmigggbbb_VQVi¬ÝÏÏ×Úʾ¾´«¬«´¸¾¬wgzwiiwwwzzwzzgigiiwwiim[VQQVIB=BVb[I9B,,7,++,B_ri+ %+++9Qbg,_,,+77933,3%=gwM%% Bm%=[gwwbg¢¸¾Åž¾¸¸¸¸´´´´´°¬´¸¸¸´´´¬¬¤¤«°´¸´´´´°¸¸¾¾¸¸Â¾¸¾´°¸Â¾¸¬«gQII[mmQM[___bV[rwwggz¤¬¬´´¾ÂÊϾI7+++7+3%,%,,,,37333,9977y,7++,9,+,,+73739,7BFBQgw¤«¤¤¤¤«¤¢¤¤¤¤¤¢¢¢¢¢¢¢¢¢¤¢¢¢¤¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢iiiiiimmiiggibgbgbbb__[bbimw¢¤¤«¬¬¬¬«¬¬¬«¬°««¬«¤¤¢zwgVQIIIIMVVVMQV[[[_[___bbbbbg__bbbgbbb___bbbbggmiigiigmmigggb[[QVÂÏÝÚÑŸ¾Â¸°¬´¸¸«iwzzwrmrzzzwzmrzwwwzzwrrgggg[[VB9=FQ[[M97,++%% 3BB[mi,++%+3,3Vb_3g,+,7=9,3997733=mwB, ,I[BrzQbmbm¢¾Å¾ÅžÂ¾¸¸¸¸¸´´´°°°°´´´°¸´¬«¤¤««°´¸°°´¸°¸¾¸¾¸¸¸´°°´°Â¾¾°«w_QIFImwbIQgbVg[rzwzig¢«´´¸ÂÅÊ´=,,%++,++,%+33377977339779y33+,++,3,+,99739FFFVrz¢«¤««¤¤«¢¢¤¢¤¢¢¤¢¢¢¢¢¢¢¢¢¢¤¢¤¢¤¢¢¢¢¢¤¢¢¢¢¢¢mmmiiigmibigigggbgbb_b_bbgmwz¢¤¤¤¤¬¬¬«¬°¬¬¬¬¬«¬¤¬¢wi[QIFIFMMQVVQ[[__[Vgbb_bb_bb_b_bbbb____bgg_ggbiggimiiiggggb__[VQbÑáÑÏžÂÅÅ´´¾¸¬i_wwrwrzzzzwzwmmzwzw__gb[MI=IFVb__Q=9,,%%+++FBgrM+%,+3,+,VI[9V9%+,993+397++%=rmB+%7rgmzBVmr°Â¸¾Â¾¾Â¾´´¸´´°´°°°´´´´¸°¸°¬«««¬¬´´´¸´¸´´¸¾¸¸¸¸°´°¸¾¾Â¾Â¾¾´¬m_[M9Bii[ig[_wgzzrw¤°¸¸ÅÏʾrB,,,%%,+,,++37,77799733393777933,33,7,,,33793979FFQbrzzz¤¤¤¤¤¤««¤¢¤¢¤¢¢¤¤¢¢¢¤¤«¤¤¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢mmmmmimmigggggggggbgbb_b_girz¢«¤«¤¬«¬¬¬¬¬°¬°¬¬¬««¤wgVQIIBIIQIMVVV[[_[_bbb_bbbb_b_bgbgbggbbb[gbggigiimmiiimiiigbb_[Q[rÂáÏÑϾ¾ÅŴ¸¤wVirrwzzzmwwzzzzzzwmzziQFIMVVMFMIIQQg_igB933,++%%%3FizzB% %%79=BI==I93,FI37=,,,MrVI3+Mgz¢mFg¸¾¸¾Â¾Â¾Â¾¾¾¾´¸´´´¬°°´°´´´¸´°¬«¬°¬¬°´´¸¾´´´´¸¾´´´´´¸¸¸¾Â¾Â¸°¢zg__[FFrwmimgmizzz«´¾ÅÅÅ«[7,,+3,+++,,++3379937333,39397379,,,,33+,37799,,999I[mzzz¤¢«««¤«¤¤¤¢¢¢¢¢¢¤¢¢¤¢¢¢¢¢¤¢¢¤¢¢¢¤¢¢¢¢¢¢¢¢¢¢¢imiimiimigiiiggb_bggb__b_gmrz¢¤«¬«¬¬¬¬«¬«¬°¬°°«««¢¢ri[QMFFIIVQQ[QVV[[[bbbb_____b[b_ggb_gbbiggbbbgigiiimiirmimmggg_VVQ[Ñ×ÏžŸ¾¾Å¾rgrrrzziwzwzrwzrrg_rwmgVF=B_[IBQVQ_[_bgQF733,3++ ,9Qzmr7 ++3[b+9799779=MV[QVQVM9,_zVFF3_zz_ziQw¬¸¸¾¾¾¾¸¸¾Â¾¸¸¸´¸´¸°°°¸°°°¸°°¬¬«¬°°¬¬°°¸¸¸´¸´´¾´°´¸¸¸¸Â¸ÂÅÅÅž¸°«m_V[_IIwiib_[_z¢°¸Â°i933%,,,,3,++++,739399977,377339733+3++,3,,33777379=BIbwwz¢«¤««¤¤«¤¢¢¢¢¢¢¢¢¢¤¢¢¤¤¤¢¤¤¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢iiimimimgiigggbbbbgb_b___gimz¢¢¤««¬«««¬¬¬««¬°°¬¬««¢wg[[IIFFFMMQQV_V_b[[gbbbbbbb_bbbb___bbggb_bggiiibimmirmmmimigg_[VVQw´ÝÏÅÅŸžiw¤zrwrwzrmimzwzzwmmmwzzzwwmrigg[[QI=FMIFQ[[M[gbg[¹7997+%33=[mbm=%,3B7V[+,3,337==M[[b__b[QMbz[QMIBrV_gziw´¬¢¾¸¸¾¸¸´¸¾¾¾¸¸´¸´°°°°°°¬°°¬°°«°¬¬°°¬«°´¸´¸´¸´´¸´¸Â¾¸ÂÂÂÅÅÊÊÅŸ¸´g[[[QBIwiM[FQ=i¤¬´«[s,%+++,,,7,+++77977B9977799779,+%++3,,73=3,37BIBQiwzw¢«¤«¤«««¢¤¢¢¢¢¤¢¤¤¤¤¢¢¢¢¢¤¢¢¢¢¢¢¢¢¢¢¢¢¢iiimmrmggigbigigggb______bgmz¢¢¢¤«¬«¬««°«¬¬¬¬¬°¬«¬¢rb[MMFBFIMMVQ[VV[[___b____bb__bbbbbbb_bbbb_biimgmiiwmmriimmii_b_[[VbÚÝ×Êʾ¾¾Ï¢wrrrwrggmrwrwrigmzmmm[BQQMBIV_FI_g_bFBF7{7,++7BQVIgF+,79BiF+,3773,3,B99=IB97F9=Vi9IMB=miVVbzi´¬«¸¸¸¸´´°´¸¸¸´¸´´¬«¬¬¬°¬´¬¬¬¬°¬°¬¬´¬°«¬°´°´´´°´¸¾Â¾ÅÂÂÅÅÂÂÊÊÊÅŸ«mbVV[Q9Bg[QVQFB¤mQ7++++%+,,+33333,,37979377797=9,,+++,3,337333++3=M[iz¢¤¤«««¢¤«¤«¢¤¤¢¤¢¤¢¢¢¤¤¢¢¤¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢mmmmmimigggigigiggbbbb[[__irz¢¢««¬¬¬¬«¬«¬°°¬¬«¬««¢wibQMBFIFQVVQV[_V[[[b___bbbb[b___bgbbbb_bbbbgiigmimmirrmmmmmiigb_[V[×Ýá×ÊÂÅÅÂÅÂwzzwrwrmbirwzzwmmirimzrzriVBBBFM=9FQQBI[bV_FFIw333,,=BIVQbM3ÿFI,+,+,,33339,+399=+,+,B_7II=FigF_zw¤««´´°´¬¬´¸´¾¸´´°¬«¬«««¬´°«¬«¬¬°´°¬¬°¬¬°¬°°¬´°¸¾ÅžÂ¾¾ÅÂÅÂÅÅÊÊŰ¢zg_QQQF,7VQQ[B[¢rr[9++%++,3,+,,+,373337797=777793,,%+733339,,737=IQbzzz¢¤««¤¢¤«¤¤¤¤¤¢¤¤¤¢¢¢¢¢¤¢¢¢¢¢¢¢¢¢¤¢¢¢¢¢¢¢¤¢¢¢¢¢miiimigigiiggbbgb__bb[[__bimw¢¤¤««¬«¬«¬«¬°¬¬°¬«¤«wm[QMFFFIMMQMQV[[[_b__b_b_b__g___b_bbggbbgbgggggmmgmmmrmmiigibbb__V[ÏÚÚÝÑÅÏÅÅž¤¬zrzwggimrzzrrmirzzw__zwi[MFBVF9979FF=BV[_[FIF77,3,3,9BFBFB_bBVMB3++,7,3,,,,,3373,,,+ +9V=BM[I_[7Qzrzr«´´°°«¬´¸°¸´°°««¬¤¤¢¬´´««¬°¬¬´°«°¬¬¬°°¬«¬¬°¾¾Âʾ¾ÅÅÅÂÂÅÅÅÅÂÅ´«mb[IBQ=,9zzVbVF=zwi[9% ++,,,%+,,+37,77799973779793,+,%++33997733,9BBIbmzzw¤¤¤¤¢¤«¤¢¤¤¢¤¢¤¢¢¢¢¤¤¢¢¤¤¢¤¢¢¢¤¢¤¢¢¢¢¢¢¤¢¢¤¢¢¢¢¢¢iirrmiigggiggg_ggg_gb[[_[_grz¤¤«««¬¬¬¬¬«¬¬°°«¬«««¢wmbQIBBIIQMVVQ[[VV__g__gbb_b_bg__[_b_bb_bbbgbbigiiiirirrziwimigb_VV_Ñ×ÑÚÚÏÊÂÊʾ«´wzrb_gwrzzwwrrmr[MzzzrVB=Bÿ999799B[bMVQBBó,773=FMB3=_g_V_I337,,+,3,,33373,3+33%++7MFQimQQ[7Mgiwz¢«´´°¬¬°´´°¸°°««°«¤¤«°°¬¬¬«¬°°´°«°«°°¬¬¢««¸¾ÅÅÅÊžÂÂÂÂÂÅÅÅÅÂÅÅÅÊÅÅ´«rgb_III9+=m[_VQ7_riQ93%%%++++,,,,77979377999y79733,7,,+%+3337333,,»Mbwzww¢¤¤«¤¢¤¤«¤¤¤¢¤¤««¢¢¢¤¢¢¢¤¤«¤¢¢¢¢¤¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢iiimiiiiiggiibbgggbgb_[[Vbgmwz¢««¤«¬««¬«¬¬°°¬¬¬¬«¤¢wm_QMBFIMQIQQV[___[bbgbgbbgggbg____b_gb_bgggggiigimmrrmimirimiib_VV[ÑÚ××Ú×ÅÊÅʾ°wzzzmimzzzzwzriwwb[wwwmbbVBMFB7=,,7=VbBQFBFMQB7s9FV9%3gimg[I%%+,,7,3,33,,793+,,,,++B_[gzgVV_=[¢¢¤¬°¬´°°´¸¸¸´´°««¬¬¢¤«¬°¬¬°´¬°´¬°««°¬°¬«¤¢¬¸¾¾¾ÂÅÊÊÂÅÂÅÅÂÅÅÅÊÅÅÂÊÊž¸°zb_gVB9=+%=iV[MBBrwgI333+%++%%,3,37=9777399B99w37+3 %,,,,7333,97=F[mzw¢¤¤¤¤«¤«¤¤¤¤¤¢¤¢¤¤¤¢¢¢¢¢¤¢¤¤¤¢¤¢¢¢¢¢¢¢¢¢¢¢¢¢¢mmigmigiigiigggb_gb_b[[[Vggm¢¤««¬¬««¬««¬°¬¬°¬¬«¤wi[MMFBIMQMMQQ[_[V[[bbbbbbb[bbbg_ggbbb__bbggbgiibgmrrrrrmmmimmib_[[VÑÝÚÑ×ÚÏÏŸ¢wrwwzwzwwrwwzzrmwmwwzwm[[zri[VQIIQMI=93,++99FMIMBBFFVQF=9%7IQ9%7m[zw_V3+++,9,,,3,73,9,++++%++=_iiVV[bMr¤¢´¬¬«°¸°°°´´¸¸¾¸°¬¬¬¤¢¤«¬°¬°´¬°´´¬«¤¢°°¬¬«¢¤°¾¾ÂÂÂÂÅÊžÂÅÅÅÅÅÅÅÂÅÅÅÅÂÊž´¬i_bMQ=7,%3VibIMMgwb9,,,%,+%+++,,,399979777977I9B933,,3,,+,+%,,933,777FIbrwz¢¢¤¢¤«¤¤¤¤¤¢«¤«¤¢¤¢¢¢¢¤¤¢¢¤¢¤¢¢¢¢¢¢¤¢¢¢¢¢¢¢¢¢¢¢mmmgiigiggiggib_gb_g_[V[[bgm¢«««°¬«¬°¬¬°¬¬¬°°¬¬¢wi_MIFFMIQM[V[__VV_bb[_bb_gbbgb_bb_bg____bbgbgimgiirrrmrrmrmiiggb_[[zÑÚÚ×ÑÚ×ÑϸrmirzzzrrzzzwggmwzwigVMgb_MF=BV[MB37,,,,+379IVMFVFFV_I=7%9IM=+,_[zm_7+,,3,,337,,+33+, %,%7=QmwVIQ_mgz°¤¾´´°´´´´´¸¾¾¾¸´´¬¬¤¢«««¬¬°°°´°¬°««¬«¤¤«´¸ÂÅÅÅÂÅÊÊÅÂÂÅÅÂÂÅÅÅÂÊÅÅÅÅÅž¸¬¤rb[QMF73+%7mbVIVIz_=3+3%,+++,+3,3,,79997939B997333B,,+,%+3393,,,,9IVizw¢¢¢¢¤¤¤¤¢¤¤¢¢¢¤¢¢¢¢¢¢¢¢¤¢¤¢¢¢¢¤¤¢¤¢¢¢¢¢¢¢¢¢¢¢¢¢¤¢iibiggiiiiiiigbbbbb___VV[_irw¢¤««««¬¬¬¬°¬°¬¬¬¬°«wm_QMFFBMMQVV[_[[[bbbbbbbbgbbibgbbbbbbb_b__bgggiimrmrrrmwrmiiiggb_V[ÏÚÚÚÑ×××ʾ¤wigiwzrrzwwzzwmgggzzm_VBIQF333Ig[I=,33++3+,33FbI9FB[V[[F+,7FQ9 ,9[wmI+++,,37,+++++,++ %%%7[imziMM_m°°´°´°´°´¸´¾¾¾¸´´°««¢¢¢¤¤¤¤¤«°´´°¬«¢¤¤««¬¸¾¾ÂžÅÊÏÊÅÅÂÅÂÂÂÅÅÊÏÊÂÅʸ¬«zb_QI=7,,+3M_VIQFrmQ37+,,+,,,33,3,337wF377999979=3+3,+3++,,7737++3,9Qbw¤¢¢¤¤¤¤«¤¢¢¢¤¤¤¤¤¤¢¢¢¢¢¢¢¤¤¢¤¤¤¤¢¢¢¢¢¢¢¢¢¢¤¢¢¢iiiggbmimiimgigbg_gb_[_[[_gm¢¢¤¤«««¬¬¬¬°°¬¬¬¬¬¬«¢¢wi[QMFIIIIVVV__[__gbggbbgbgibgbbbibgbgibgbggiiigmimmwrwwrmrmrggmb_V[ÊÚ×Ú×Ï×Úʬwgbmwzwwwzzzzmibrrwrwzw[B37=9,+9M_I73+,33+3,337Ib[IÿQVb9+,7IVB%%,Fwrb9+++,,,37+,+, %+7_wmw_M[w¢z°¸´´´´´´¸¸¸¸¾¸´´´«¤¢¢¢¢¢¤¢¤««´¸´¬¬¤¢¤¬´¸¸¾¾ÂÅÂÊÅÅÊÊÊÅÊÅÊžÂÊÅÅÏÅÊÅÏÅÅž´«wg[QQB,,3,+7MQMII_bF+97,,733,73+,377379=999IBB=s3+,%33+3,9333+,779[iz¢¢¤¢¤«¤¤¤¤¤¤¤¤¤¤¤¢¢¢¢¢¢¤¤¢¢¢¤¢¢¤¢¤¢¢¢¢¢¢¢¢iimmggiigiigigmbbgb__V[[V_bir¢¤¬¬«««°¬¬¬¬¬°¬¬«¬«¢mi[QMIIIFMMVM_[__[b_bbbbb__gbb_gbi_bb_bbbggbgimggmmrwrrrwrrmrmimb_[[zÂÝ××ÚÏÑÚÏ«zbbbirwwmrrwwzwmimwwzzwwQ,%+397,9QQ++,,,7,,+,9[_VB9BQVbM+%,=VQ%++9[g[F=7,,+,++%+ %+%,_zgi_[w´¬w¤¤¾´°´´´´¸¾Â¾¾¾¸´°«¢¤¢¤¤««¬°´´°°¤¢¤«¬´´´¸¸¸ÂÅÂÅÂÂÊÊÊÅÅÅÅÊÅÅÅÊÅÅÏÊÏÏÅÊŸ¬wi[VVB7+,,++F[VQ=Q¤[737937,++3,+33,9797977999BF99B973,33,+%,7,3,,++379B[iz¢¤¤¤¤¤¢¢¤¤«¤¤¢¢¢¤¢¢¢¢¢¢¤¢¢¢¤¢¢¢¢¢¢¢¢¢¢¢¢¢ggiigiimgmigmbgbbb_b_[_[V[bwz¢¢¤«¬«««¬¬¬¬¬¬¬«¬¬«¤¤¢wmbVMMBIMMQQV[[b____bbbgig_gibg_bbbgb_ggb_bbimimgmmmmwmmmrrmrmmibb__m´ÝÚ×Ú×Ï×Åmgggimwrrmrrrzwrrmmwzwwrwzr_3,%+,;[FB33,++3,337,,3F[QQ9=IM[I=+,9bQ% +73Qrii___F7 %+% %%% 3[w[Qgw°´¤w¬¸¸´°´¸¸¸Â¾´°¤«¢¤¢¢¢¤¤«¬¬´¸¸°¬¤¤¢¤¬¬¬°¸´¸¸¾¾Å¾ÂÅÊÊÅÊÅÊÅÅÊÅÊÊÊÏÊÊÏÊÊŸ°¤i_VQF3++,%%7[QM=I¢¢V7,3+++,+3,,3,33377{979==9=,7,+,,,,,,73,,3,,7=Qgw¢«¢¤¤¤¤¢¤¤¤¤¤¢¢¢¢¢¢¢¢¢¢¢¢¢¢¤¢¤¤¤¢¢¢¢¢¢¢¢¢¢iiiiimimgibggbbgbggbb__[[giiz¢««¬««¬«¬¬¬¬¬¬«¬¬¬¤¢¢wgbVQIBMIMQQMV_g_[bb_b_gb_gggiggg_bb__bbigiggigimmmmmmmrrrrrmmmmgg__g¤ÝÝ×ÚÚÑϬziggiigimrmwwrwmggrzzzmgzrmrzwiV3+%+7=[_7,,++3++++,,,+7BMVQM9=IVQF9+9iQ ,9+9bbVQgmbV3% + %,M¢g[b´«¢¤zz¬¾¾¬¬´´¾Â¾¾Â¾´¬«¤¢¤¢¢¤«¬´¸´°°¢¢¤¬¬¬¬¸¾¸¾ÂÂÅÂÂÅÂÅÊÊÊÊÅÊÅÊÊÊÊÏÏÏÏÏÏÏÏÊž´¬ig[[I3%%,3,,QQIBFr¢«wI33,,,3+++,3,73,33379379B=9=937,,7,3,+,+337,73979IVr¤¢¤««¤¤¤¤¤¢¤¤¢¢¢¢¢¢¢¢¢¤¢¤¢¢«¢¢¢¢¢¢¢¢¢¢bbiiimgigg_ggbbggggb_b[_[ggrz¤«¤¬°¬¬«««°°¬¬¬¬¬««¢wgbMFIIFQVQQQ[_[[[__b_gbggbgbbiigb_gbbbbgggggiigimmmrmrwwwmmmrmii_gbbÏÝÚ×Ú×ÊiiiiiiiiirwwrwwwmwziVwzrrrrzmmwiF,%+,=VbV,,%,%+,73,+33+339IVMF9=IIF?b[+,=,3QV3=IB=,+%% +V¢rmgw¸´¤¢z¢¸¸°´«´¾Â¾¾¾¸´¬«¬¢¤¢¢¢«°´´¾°°¢¤«¤°°´¸¸¸¾¾¾ÅÅÂÂÅÊÊÊÊÊÊÊÊÊÊÏÊÊÑÑÏÏÏÑÑÏϸ¬¤ri[[M=,%+,,,BIVI=g¬¢I,,,33++,3+3+337377393=9=7=FF973+,+3,3,,3=3+,,37=M_w¢¢¤«¤¢¢¢¤¢¤¢¤¤¢¢¢¢¢¢¢¢¢¤¢¢¢¢¢¢¢¢¢¢ggggbibgiggbgggbbgbgb_[V[_gmw¢¢¤¤«¬««¬«¬¬°¬¬¬¬¬««¤zmiVQIFBMMMVQV[_[b[gbgb_g_bggbgbggbbggbgbgigigggimiirmrwwzrrmmrmiib__w¸ÚÝ×ÚÚÊiirmrmriimwrmmwrrzrVgrrmrmgVVMVB,,33Q_bM3+++%,373,393,7,39QVIIFBFBB9=bV+,=7=V[+%++++%%+ %I¤rir¢¸¾¤¤¤¤¢°´´¬¢°Â´¸°¸°«¤¤¢¤¢¤¤¤¬¬°¸´¤¢¤¬¬¬´´°¾¸¾ÂÂÅÅÅÅÂÂÊÏÊÅÏÅÅÊÊÊÏÏÏÑ×ÑÑÏÑÑÑŸ°¢zi_bQ=,+%,,,7BMI=V«¤wM3+3,3++373+,77379y79779BB=7,3,,,%+%+,,73,,,,79BMm¢¢¢¢¢¢¢¢¢¢¢¤¢¢¢¢¤¢¢¢¢¢ggigigigigiiggigbbgg_gb[_birw¢¤¤¤«¬¬««¬¬«¬¬°¬¬¬¬«¤¢wibQQBBFMQQMV[[__[[_b_g_b_bgbggiggbgbbgbgbgigbgggirimwrrrrrrrrribb_i«ÝÝÚÚÚ¸rmmmrrrrmmwriibmzwwzm[Vb[_MIB9BBBB77,,Vbb=,+%,+,39,,93,733BQIIBù=MF[M++I97,[_%+% ,+ %Bw¢«rgr´¾¬¤¤¤¤¤¤¢¬¬¢°¾¾´¬¬¾¬¤¬«««¢¤«¢¬°´´¤¤«°¬¬´¾°¸¾ÂÅÂÂÏÅÅÅÅÊÊÊÊÊÅÊÊÏÊÊÏÏÑÑÑÑÑ×ÑÑÏʸ¤ib[QF3% %,,3=FMF=w°¬M,,337,,,BF77w7977779»9¹733+,,+3333973%,+77M_rz¢¢¤¢¢¢¢¢¢¢¤¤¢¤¤¤¤¢¢¢¢¢¢¢¢¢bbbmggmgigigiggbb_b___[[[Vbmw¢¤¢¤¤««¬¬««¬°°¬¬¬¬°¬«¢zr_[QMIQQIMQVQ___bb_gggbigbiiibibbgggggggbgiggbbgm¤zimwrwmrwrmriggbbgÑáÝÚ×°zrrirrzwwrrmmgbizzwmbgQB=9IVMQIIM[[[B7,7Vi[3,%+,%,BB7,B93+,7+,99BM99B77FV_M37b9+,=mr+,+ %% %7m¤rgr´¾°«¤¤¤¤¢«¢«´Â¸´¬´´««««««¤«¤««°´¬¤¤¤«¬¬´¸¸¸¾ÂÂÂÂÅÊÂÂÊÊÊÊÊÅÊÊÅÊÏÊÑÑÏÑÑÑÑÑÑÑÏÊŸ«zgb[F7,%%%%,7FMM9V«¬Q37979,9+7337B7773939979BB¹73,+,333,779777++,37Qiz¤¢¢¢¢¢¢¢¢¢¢¢¢¢¢¤¢¢¢¢¢¢¢¢¢bbgmmigbmgimgggbgbbbb_b[_bgmw¢¢¤«««¬¬¬¬¬¬¬°°¬¬¬°¬¤¢wmg[VIFIMMMVVV[VV_bb_gibgiggiigiigbbibbgbbgbbgiim¸rmmrwrwmrrimiimgbg°ááÝѤwwriwwwrrrggbiz_I[[QQ=F[[M977MQF3+,7gmI7,++,,7FF9999%+,,,9737B¹77B[bb9Bi7,,3Q7+,+%% 3i¢zii´´««¤¤¤¤¤¢¤¬¬¢°¸Â¾¾¸´°¤¤¤««««««¬¬««¢¢¢«««¬¬¬´¸¾¾´ÂÂÂÂÂÊÅÅÊÊÅÊÊÊÅÊÊÊÏÏÑÏÏÏÑ×ÏÏÑ×Ïʾ°¤zmbVM73,,+%++7FQ=B¤«¤g93Bs+397,,9777997999=B»w7,+++37377=7,+,+,9Qr¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢ggiggggggggbgbgbibbb___[Vbiiw¢¢¤«¬«¬¬«¬«¬°°¬¬¬¬¬««wm_[MIFQFMMVM[_[[__bbgigbiiggibimbgbbggbbbbb_ggm¬¢wmmrmwwwrrrrwmmmgiimÚäÝ×¢riwrrwwwrmbbrwzzriziibIFQQF,,3=7,+,+=imM,3,++,=F39733377B,+,9=9337Mbmg_z=7,39F% + + +,b¤wrz¢´¸¤¬¬««¢«¤««´°«¤¬¸¾ÂŸ¸¬¤««««¬««¬«¬¢¢¤¤«¤¬«°°¸¾¾¸¸¾ÂÂÂÅÅÅÅÅÊÅÊÊÊÊÊÏÏÏÏÑÑÑÑÑÑÏ×××ÑÊ´¢mbQM993,%%++,7IF,w¢¬«iB3339,+,,3733799=99F9»=773,,,,+3,,73373++,,B_w¢¢¢¢¢¢¢¤¢¢¢¢¢¢¢¢¢iiiigiiibggggbgbbbg___[[[bbrw¢¤««¬¬¬¬¬°¬¬¬¬¬°«¬¬«¢wmg[QFMMFQMVV[__b_bgbggbgiigiigiibigbbgbgbbbbgi¤zrrmzzrmrrrrwrrwrmrgm¸áÝ׫wmwrrwwwzzrgizzzzrmmibV[F3,,,3+3%,77imB%++,,BIF7+7=,+373B77+,7B97773=briwM=+77g[% % 7_«zw´¸««´°¬«¤¢¬¢«´¬¬°¬¸¾Â¸´«¤««¤«¬«««¤¢¤¤««¤«¬°´¸¾¾¾¾¸ÂÂÅÅÊÅÅÅÅÊÏÊÊÊÊÊÊÑÑÏÑÑÑÑÑÑ××ÑÏʸ¤rbQM973+ ++37IQ3g«¤rI73379,33777379779=9=¿Bw33,++33,77977+,++7Ibz¢¤¤¢¢¢¢¢¢¢¢¤¢¢ggmriggiigggbgggbbgbb_[[[_grw¢««¬«¬¬¬¬°¬¬¬¬¬¬¬¬¤¤¢rib[QIFFQVQVV__[_gggbgggggiiiigigibgbgbbbbggbgmrrmrwmrrrrwrrwrrrmimmirÚáÚ¾mrrwmrmrrrrzzrwwigii_[Q977779%+%,93[iB%%%,3FQ=,7BB+++7377++,9F9,973FIgimz[M99,_iB%%,[¢zrz´¾««°¸¸¬¬«««¬¤¤¤¤´¸¾¾¾Å¾°«¤«¬¤¤«¤¢¤¤¤«¤««¬´´¸Â¾¾ÂÂÅÂÅÊÅÊÊÂÊÊÊÊÊÊÏÊÏÑÑÑÑÑÑÑ×ÑÑÑÏÏÊʾ«rgVQF7,% +,3I[9M¤¢«¤iF77I9,373379799=97B=93,3,+,,,333777++,79[i¢¤¤¤¢¢¢¢¢¢¢iigiiigbggg_gbgb_bbbb[[[Vbimw¢¢¤«««¬°¬°°«¬¬¬°«°¬«¤mgVVIFMQQVVV[[_b_gigggggggibgggbbgbbbbbbgigimmwmrmrwrwwwwwrwrrwwwrmigrÂááÊrwwrrmgmrwzwwriggbQ=77973B,+%%,%+Vm=++,+9B=,77B3+,37=7,3,,B93,3=IVI[[Fgg_QQ=i¢m7 +Qzrz¬Â´¤¬¸´¸°°¬´°°¢¤¤¤«°´ÂÅÅʾ°«¤¬¬«¤¢¢¤¢¢¤««««««´¸¾¾¾ÂÂÂÂÂÂÅÅÊÊÊÅÊÊÏÊÊÊÊÅÑÏÑÑÑÑÑÑÑÑÑÑÑÏÊž¬wbVVF9,% %%3B[F=«¢¢«b[99333B97379==B»B7s,7+3,,7377,,+,39Q_w¤«¤«¤¢¢¢¢¢¢¢ggiiigiggbb_bgbbgbb_[[[[iggiwz¢¤««««¬¬¬°¬°¬¬°¬°¬¬¤¢mr_[QMMQVVQQV[bgbbggbgbbgbggbggggbbgibgbgiggiimrwrrrrwrrwwrwzzrwrrwrmriir¤ÚáÏwzwrrriirzzzwigbb_I,,333=M=+%%,++3MmI,379=3,,7=F,,3739B3379I=7%%,Fi[Mg9I[__VVw¤_%+Fwzzw«¾´¤«¬¸°¸¸´´¬´°¤¢¬´ÂÊÅ´¬¤¤««¢¢¤¢¢¤¬««¤¬°´°¸¸¾¾ÂÂÅÂÂÅÂÅÅÊÊÊÊÏÏÏÊÅÏÏÏÑÑÏÑÑÑÑ××××ÑÏŰ¢zg_VM=3+% ++%39QM7°¤««zb[B979++,79977BB7B=9Bû973,+,33,,33773++%,9Qr¤¢¢¢¤¢¢¤¢¢iiiiiiiigg__g_gi_bg[______gmr¢¤¤««¬¬°¬¬°¬°¬°¬¬«¬¤¢zmb[VMQMQ[[[[_[_b[bgbgggggi_gbggibggibbibgiigirrwwrwrmrwwzwwwrrzrwwrrrmmmÅáÑwwrmwmizwzzwg__gbM999,3BQ_,%%+ ,%,Fi[7FIM7+,,9B333,7777339II99%%,7i_9gBBQF733MQ+ Bz«zmw¢´°«««¬¾¸¸¾´´¬´°¤¤°¸ÅÅŸ¬«¢¤¤¢¢¤¤¤¢«¤««¬¬«¬°´´¸¾¾ÂÂÂÅÅÂÅÂÅÊÊÊÊÊÏÊÏÊÊÑÏÑÏÑÑÑ×Ñ×Ñ×××ÑÏÊ´¢ib_M=7,+ %++%3F_7g¬¢««bmM,,3,,339y399=û9w7,+,373377797,+,7Igz¤¤¤¤¢¤¢¤¢¢¤¢iggigiigbgbbgbgb__[[[[_V[[gmr¢«««¬««¬°°°°°¬¬«¬¬««wibVQIMMQQV__[_b_[_bbbgbggbigigiibgbigigggiggmiwmmrmmwzzrzzwzwwzwwrrrmr×Ú«wzrmbwwzwzw_[_VB,7,39Q__I++%,++++7[iM==7,=BII3,+37F3,,,=Q,%,7ib,IQII,% %,mi, 7i¢wzrz¸«¤¤«¬¬°¾Â¾¸¸´¸°«¤«´¸Åʰ¬¤¢¢¢«¢¢¤¤««¬¬«¬«¬«°¾¸´¾ÂÅÂÂÂÅÊÂÊÅÅÊÏÊÊÊÊÏÊÏÏÏÏÑÑÑÑÑÑÑÑÑ×ÑÑÊŸ«wi[MF9,++%+,,+9V9M¢«««_rQ,,33337777w979=9=I333,3,77777,3,,33Qm¢¤¤¤¤¤¤¢¢¢¢¢¤iiiiggiggbbgg_bb_______[VVbiwz¤«¬«¬°¬¬°¬°°¬¬¬°¬¬¤¤wmgVQIMQIQ[[V__bb_gbgbbbbbggbggmiibgibggggbiggirwrwrrrzwzwwzwzzwwrrwwww¾Ñ«zzrigrzmiQB,,3=3+Qr_g9% %+,+++3Ii_93+,,7M[F7,+779,,,3IV,39+,,3QV+3MQB+% +FzI,gzw°«¤«¬°¬°¾Â¾´¸¸¸¬¬¬°¸ÂÅ´°«¤¢«¢«¢¤¤««¬¬¬¬¬°°¬¸¸¸¸Â¾¾ÅÅÅÅÅÅÅÏÏÊÊÊÏÏÏÏÏÏÏÑÑÏÑ××××××ÑÏŸ«wg_[M=3,,++++39VBI««°[r=,%337779779977w¹93393,+,,397773+3,,9Qr¤¤«¤¤¢¢¢¢¢¢¢¢bbmgggi_bigggbib_b[_V_VVV[_m¢¤«««¬¬¬¬°¬°°¬¬¬¬««¤¢wg_[IIIMMQV_[_[__b_bbbgigggggigiigiiiggibiigmiimrzmmwzwwzwzwwzzwwzwzwrmwzw´wzrimm__B3,3B9%%BMbg3++%77%+++7IgI7 3,=VM33,97,9+,+7[I3=M,373,B,7MQ=% %3r[3Qmwz´«¢¤¤«¬´°¸¾¸¸¾¸¸°w¬¬´Â¾¸««¢¢¢¢¢¢¢¢««¬¬¬¬¬°¬°°¬°´¸¸¾ÂÂÂÂÂÂÅÅÊÅÅÊÊÏÊÊÊÊÊÏÏÏÑÑÑÏÏ××××××ÑÑʰg_[MB7,,,++%,3V[=¤¤¬¢_m93,73%379797B»9999=937777,33,,33733,%++3Fbw¤¤¤¢¤¢¢¤¢¤¢¢¢¢¢¢¢¢¢¢¢ggggigbgbggbbbb_bbb_[__V[[imz¢«««¬¬¬°¬°¬°°¬¬¬¬««¤¢wibQIIMII[V[_Vbbb[ggbgbgbbigigimibggggggggigimimwrwmwrrwwzzzwzwzzzzzzwzrrzwmzzzwbQI3,7IB3%%+=mF3++3F3%,+%+7Ib9,+9VVI9,+,7,9+++9_B+F_3+7%+,=7Mg= +Mg_rwmz«¬¢¢¢¤¤«´´¾¸¸´¾¸¸°r¤¬¸Â´¬¤¢¢¢¤¢¢¤««¬«««¬°°´¬´´¸´¾ÂÂÂÂÅÂÂÅÅÊÂÅÅÅÊÊÊÊÊÊÏÏÏÑÑÑÑÑ×××ÑÑ×ÑÑϰ¤m__VM=3,+++%%3FbBi¢«¬¢g[B3B=3+97399999B9B=9=7,,3733,39773,++,7F[r¢¢¢«¤¢¢¢¢¢¤¢¤¤¢¢¤¤¤¢¢¢ggggbibbbggbbgb[_g_b__[[[_bmr«¤¤¬««¬°¬¬¬¬°¬°¬¬¬«¢¢wi_QVQIIQQ[V[______bggggggibggigmggggbgggbimmimrrrwwrmrrmririrmmmmiggzmmrmwmzzm_[M9,,F[9+ %%Fw=9+%IQ339+%%%3QI=9[bQ=3%++377+++=g9%9[373 %3F7MzQ %3bg¢ir¢°¤¢¢¢¢¢¤°°Â¸¸¸¾¸¸¸¬¢«°¸Â¸¬«¤¢¢¢¢¤¤««¬¬«¬¬°¬°´´´´´¾¾¾ÂÂÅÅÅÅÅÊÊÅÅÅÅÊÊÊÊÊÊÏÏÏÑÑÏÑÑÑÑ××ÑÑÑϸ«rgb[Q=3+++%++,FgMi¤¬¬«m[I3B9++,9¹9=97=B=F,37,39937797,++3FMmw¢¤¤¤¢¢¢¢¢¢¢¢¢¢¤¢¢¤¢¢¢¢¢¢¢¢bggibggiigbbbgbbbgg_b[[V[_bmw¢«¬«¬¬¬°¬°¬°°´´°¬¬«¤rgbVQIQMQQQQ[_____ggbggibgigigimiiiigbgggiiimiirirwwwrrmmrmmmmmgiibggrwV[Vzgirzzzrb[MF,+,V[,% %%MzF3,9b7+%9+%%%,7=Mbibw%+,99,+++Qg,%,I9=9+37,,b_+ +=izrm¤¾¬¢¢¢¢¤¬¬¸¾¸¸¸¸¾¸°¬«´¾´¤«¤¤¢¢¤¤¢¢¢¤¢««¬«¬¬¬°°¬°´´°´¸¸¾¾¾ÂÅÂÅÅÂÅÂÅÅÂÂÅÊÊÊÊÊÏÊÊÏÏÏÑÑÑÑ××ÑÑÏÊž¬rg[VQB3+%%+++37[IV«¬«[V,9=,,+399379F=BBB993,++3,3393933+++39Qrz¢¢¤¤¢¢¢¢¢¢¢¢¢¢¤¢¤¢¢¢¤¢¤¢gggigbiigbbibg__b__g__[[V_gizz¤«««¬¬¬¬¬°°°°¬°¬¬¬«¤¢wigVMIMIMQVQQQ___bibbbggbgiigigggiibggbgigiiiimmrrrzwwzwwwrwrwrrrmrwrzr[[Vbzzw_rzzzzmgVF++=b[,+% %MQ=,=M+%373,,7BiigF79+% +97+%+7[b+%+FQV7BF,%=zmB3 3Qrwmbi°¬¢¢¢¢¢¢¤¬¾¸¾¾´¸¸´´¬¢´¸´¬¢¤¤¢¢¤«¢¢¢¢¢«¤¤¤¬°¬¬¬¬¬°°´´°°´¸¾Â¸ÂÂÅÅÅÂÅÂÅÂÅÂÊÊÅÊÊÊÊÊÏÏÏÑÑÑÑÑ××ÑÏÏÊÊŰwg_bMB3+%%+%+,7_FV«¬«b[,,93397979739=9¿B=93,373,33739,++33B[w¤¤¢¢¤¢¢¢¢¢¢¢¢¢¢¢¢¤¤¢¤¢¤¤¢¤¤¢gggmgbgibbg_gg_bb_bgg_V[[[bgw¢¤¤¬«««¬¬°¬¬¬´°°¬¬¬««rg_VVMFIQQV[Q[___bbbgbggg_gibiigggbgiiggigiiimmmmrrwwwzwwwwrwwwwzzwwIMbrgrzzwwrzmiV9,3_mM%% +V[=73%%=,9=9?mrB9F73 %,,97+%%7iM%++=__999++_w9+,+ ++Izwg[gw¸¬¢¢¤¢¤¢¢¤¬¸¾Â¸¸´¾´¸°«°¸´««¤¤«¢¢«¢¤¤¤¤¢¤¢«¤¤¬¬´°¬°°¬°°°°¬¬°´¸¾¾¾ÂÂÂÊÂÅÂÂÂÅÂÊÅÊÊÊÊÊÏÊÊÏÑÑÏÑ×ÑÑ×ÑÑÏÏÅ´¢wgb[VB3+%+++%,7MIMz««°b[77B399=I9==999FFB973,,73,,777,3+,,3Igz¢¢¢¢¤¢¢¢¢¤¢¤¢¢¢¢¢¢¤¤¤¤«¤¢¤«¤¢¢¢bggggggggbbbbb[bbbb_b[[V[_ggr¢¢¤««¬«¬¬°¬°°°¬°°¬¬««¢rmgVMIIIMMQV[[[b_bgbgggggbggggggiiigiigiggiiimrmrirwrrwzzzzwzzwwzzwww¢bmw¤¸´mzrzrrzwiV9,3B[zI+% %,I_QF%++77 3IMFMiwVIMI73%%,+7=3%+Fr3+%+=_r=7+,B9+ ,7, =wiV[m´¸¢¤¤¤¤«¤¢«°¾¾¾¾¸´Â¸¸¬¬°´°¬°¤¢¢¢¤¤¤¤¤¤«¤«««¬°´°°°°°°°°°´°¸¸¸¸¾Â¾ÅÅÅÅÂÂÂÂÅÅÊÅÅÊÊÊÏÊÊÑÏÏÑÑ×Ñ×ÑÑÑÑÏۤi_VM93%%%%,+77QMFw¬°°m[79I379BIyBBB=7,,33s73773,3++7BQiz¢¢¢¤¢«¢¢¢¢¢¢¢¢¤¤«¢¤¤¤¢¤¤¤¢¢¢bbgmbbb_gbb_gb__[_____[V[[giw¤¤«¬¬«¬¬¬°¬¬°¬°°°¬¬¢wmbQVMFMMMQVV____bggbg_bbgbmggigbggggigigggmiirmrrrrwrrwwrwwwzwwzrwww¤¬¾Âwwwwwzrwm[9,,9=[w= % %,M_g7% %7%%39FQgmVMVB=3++,,3993++Fm,%+%7bw9+%,[g++,93% ,br_[g°¸¬¢«¤¬¬¬«¤¢¢«°¾¾¾¸¸¸¾¾´°´°°´¬¢¢¢¢¤«¤¤¬««¬¬¬°°°°´´´°´°°´´¸¸´¸¸¾¾ÂÂÂÅÂÂÅÅÂÅÅÅÅÅÊÏÊÊÊÏÏÊÑÑÑ×ÑÏÏÏÊÊÅ´¤i_QF=3,%%%+,+7BF9z¤°°wMFBF7=QIBB,399B=9733,33373,+79I_r¤¢¤¤¢¢¢¢¢¢¤¢¢¢¢¢¤¢¢¢¤«¤«¤¢¢¤¢¢__ggggbgg_bggbbgbbgb_[_[[[iim¤¤¤«¬¬¬¬°¬°°°¬°°´¬¬¤¢wi_VQIFMMQVQV_V__bbgbbggggimgggbgbbgbibbbggiiimrrrrrrwmrwwzwzwzwzz¬[mwz¢zzzwrwgB,,7VIir, % +,Ig[+ +,3%+3=[b_QBF993+%++++377+3[[, %%9ib=% 9iB+3=7,,+V¤_[b´Â°¢¤°¬´°¬¤¤«´´¾¾¾¸¾¾¸´¸´´´¤ibizz¢¤¤¤««¤¬°¬°¬°´°´°°°°°¬´´´¸´¸¾Â¾ÂÅÅžÂÅÅÅÊÅÊÊÊÊÏÏÊÑÑ×Ñ×ÑÑÏÊÏÅ´«zgV++%++%++,=Q3m¤°´MBMI73=B997BF9Fy333,39,,7397,++,3BQgw¢¢¤¤¢¢¢¢¢¢¢¢¢¢¢¤¤¢¤¢¤¤¤¤¢¢¢¢¢¢¢iiggmbbib_bgbbbbb_b_____V_gir¤¤««¬¬¬¬°¬¬°¬°¬¬¬¬««¤wi_VQIFQQQVVQVV___bbbgbimgggbggigggbggibimgiirmmmwmwwzrwzwwwrwww«´¢73»M[bwzrir_7,3M_FwV %+%,9[i9%% ,737FMF=B,++%%+%,33393,VF%%%,Qgm9 %ImBFM9% +Fw[b«Å¸¤«¤«´°´«¤«°¸Â¾¾Å¾¾¾¸´´¢mMIQgrmzw¤««¬¬¬°´°´´´¬´¬¬°°°°°´´´¸¾¾ÅÅÅÅž¾ÂÅÅÅÅÊÊÅÅÊÊÏÑÏÏÑÑÏÊÏÊž°zbFs33+%++,%,F[,_°°_BBB97¹BIB=BûMQ=77,3+773739=7,+,33FVr¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¤¤¢¢¢¤¤¢¢¤ggbbgbggg__bbgbbbbgbb[bV[[_ir¢¢¤««¬¬°°°°°°°°°°¬«¤¤¢wibVQMFIQQVV[_b[b_bgigiiggbgb[gbbggb_gbggimiimiwrwrwrwwzrwzzwwwzÏʾ¤F%%%%%%+=mzzmirr_VF,=bF[m=% %+7Mwr+ %393,,3=3%3+++7,,733,,F7+++,gQm9+3[[73,+ 9zz_brŸ««¤«°¸¸¸«¢¢°¾Âž¾¾¸¬MFFQ[_gimgrz¤¤¬°¬´´´´´´°¬°°¬°°°´´¸´¾¸Â¾¾¾ÂÂÂÂÅÅÅÊÊÊÅÊÊÏÏÏÏÏÏÏŸ¬¤mQB=7,3+%%% %+,=_,Q¸´_w¿9779=99IIFFIs33,33,,37333,3+3I_r¢¢¢¤¢¢¢¢¢¤¢¤¢¢¢¢bbgggbg_gbgbbbgggbb__[_[[_bgr¢¤¤¤«¬¬°°°¬°°°°°°¬«¬«¢zib[[FIQMVVVQ[[[[_bgggiggiigiggbgigbbbgiggibgimrmrmzzrwwwwwwwww°äÊmrV7% % +%I¤«zzmigwiM9,7=[g=i_+ ++%9_i %+B+,,7339+3793+,++797,3973,IF,++7_Im=,3bB+% +mb_m´Â«¤¬¬°°¾¾¸¬¬´¾ÂÂÂÅž¾«zVQVV_b_gb[bigbVgmwz¢¤¬°°°´¸´°°´°°°´¬«°´¸´¸¸Â¾¾¾¾Â¾¾ÂÂÅÅÊÊÊÊÊÏÏÏÏÏÊÅ۬¤rgI,+%%+%%++,Fb7=¾´wQ3339FMB37B99BÿF99,7,3,,3373797,+339Qgw¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢bbgbbbgbbggbibbbiggbb_[[_[bgw¤¤¤«¬¬¬´¬´°°¬°°¬¬¬¬¤zi_VQIMIM[QVQV[[b_bb_bibgiggiiggbgibibiiggiimmmmrwwzwwrwzzzzwzz´Ý´m[377+%%,%+7b¬××¾zwiVQmVF3379[F[I+%3++F_r +%7,%,3,9797=I93+,,79,+%,FFM[Q3=7V3iM%,_7%% +I¤i[b°¾¬¤««¬´¸¾Â¸«¢´¸¾¾Âžwggmwzwwwig_gg[QMVV_gir¤¬°¸´´°¬°°°°¬¬¬«°´¸¸¾¾Â¸¸¸¾¾¾ÂÅÂÅÊÊÅÊÊÏÏÏÊÊÊ´´«rb_F33+%%%+%%3B[77¸¸¢z[99,9=IB=9=I·77,,,37,79,7373++3BViz¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢bbgbggbbgbggibbbbbgb___[V[bgr¢¤««¬¬¬°°´¬°¬´°°°°««¢ri_QMIMMQMVVVVbg__bggggggigggggmiiggggggg_giiiimrzrrwzwwzzzzzz°Ñ¬g373,,%+39Vz¸Ê¸m[IFVMB73»Fw+%,%+=[gzr% +7 +779VB393FF9,++97,3+3,+B_gMF39_,[Q%,V3%% =wm[_z«´¬¤¬¬´°¸Â´¤«´¸¸¾Â¸zwzzwmib[M=FFII[imz¤¤°°°°¬°´´´¬«¬¬°´´¸¸Âž¾´¾¾¾¾ÂÂÂÅÊÊÅÅÅÊÏÏž¬¤zmi_VB,+%+%+++,39M73¬¸«_39,39FM79BB9=37937+9933399333+3,Fbi¢«¤¢¢¢¢¢¢¢¢¢ggiibigbggg_ggbgbbbg___[V[[mw¢«¤¬¬¬¬°°°¬°°´¬°°¬«¤¤wi_QQIFIMVVVQ[_b_[__bgmgbgbbbgggggbgiggbggiiigmmrwrrmwwwrzz¢°mII9=,%%+,V«¢wmV=VQB=7V_[F+%,%3V[[Vm+ %%%+9IBMM97+9MI73+9,%+%+%+,Im_3+Mb+I[+7M+ ,9mgbz¾°¢«¬°¸¸¸Âž¬«¬¸¾¸Å¾¸zwg_IB9F=FMV_r¤«¬°¬¬´¬¬¬¬¬°°¬°¾¾¸¾Â¾¾¸Â¾¾¾¾¾ÂÅÊÊÅž¸¬rgb_b[MIF=B93+%+%++,39B9,z¬¾«b79,979Iû99FB77793,,,339w373,7I_w¢¢¢¢¤¢¢¢¢iibmgiiggi_bbggigbg[b___V__ir¢¤¤¬¬¬¬«¬°°¬¬°°°°¬¬««¢¢zmbVMIIIVQV_V[[b____gbmggiggbbgb_ggggbggbbggimmmmmrwmwwwzwz¤_F73, %,3Qzm[_m_=I_VwB[MiV,,,7,Fb_Q9, %+%%3M¹,=Q+3IQ3%7=++ ++ %+7Mg[=ib 3_9,= +%+Q¢rbr¾¾¤«¬°¸¸ÂÅۤ¢«´¸¾Âž°ww¢zm__QFMBBM[g«¬««¬«««««¬°¬´¸¾¸¾Â¾¾¾¸¾Â¾¾¾Âž¾¸°«ri[MVBIVV[_VVVVF7,,3,,+3,7B9,w¬´¤w=7779M=BQFBBFBw+,7,3,3,,399933739Mi¤¢¢¢¢¢¢¢¢¢¢¢¢¢¢iigigbgbgigigbbbiggb____[[_gmz¢¤«¬¬°¬¬°°¬°°°°´¬¬¤«¢i_QQMVVQQQVV_V[bbbgbgiigggigb_bbb_ggbmgbggmmmmirmrrwrwrww¤FB9,, %+%Qi[V_bI=M[Q97B__Q[73++%B__gB3=%%,3FbMF97¿=[[B%79++%+% % ,3M_gwQ%,[[,+ 9w¤mg´Â¬¤««´°¾ÂÅž«¢¢«°¸¾ÅÅÅ«zwwz¢rbbVQFIF=BM[z¢¤«¤«¤¤««¬¬°°¸´¸Å¾¾¸Â¸¸¸Âž¾Â¾¸°¤mbVVVM[MVQmmwmgiibV=3,7++%%+3FB,z´´¢wF=737VB»û=733+73373,397B777,79Vm¢¢¢¢¢¢¢¢¢ggbbgibbigmggbbgg_bbbb[[V[bgrw¢««¬¬°«¬°°¬¬¬°´°°¬¬«¢zg_QMMMVQQVVV_[gb_b_gggiibggbgggbg[bggbgggigiiirimgmrrwrzB33=9=+ +QzgQQMrgMFI99=Fg__93,337[r_Q%+m_+%+3%3F9=9,+,39[_b97,%% +%%%+,3VQ_Q%+I[+ 3b¤r¤Â´¢¤¬°°¸¾ÅŸ¤««¸¾ÂÅÅÂmmzwz¤¢¢[i[_VQMIMFMMbw¤«¤¤«¤««¬«¬¬´´¸Â¾¾Â¾¸¸Â¾Â¾¾¸¸¸´¤wbVVQb_Vigrgzzmmg_V7++%%+,BF3i«´¤rV97397FQ9==FBy3+,3,37,979799737B_r¢¢¢¤¢¢¢¢bbgbgggggmimgigigb_bg_QV[[_ir¢¤«°¬«¬¬¬°°°°°°°°¬«¢zmg[MMMQQVV[[_b___bgwigggbggggbggb[_bbbbgmbgbgiiigmrrrmr«_I9_rrB+%IwbM9V[=3sIMgbi93737MziQ3%3Q7+%++3I=7++%3%7VggI7+ ++++,%%+37BmmB+3, Izr¢Â¸¤«««°´¾ÂÅÅ´«¢°´¾ÅÅžmmrwzzrMzrw_mbib_V_[Q[[bmw¢¢¢¢¤«¢¤«¬°¸¸¸¾Â¾Â¾¸¸¸¾´¸°´´¬m[V[_gwiirzzmzrbbb[IB797+++,+3BB+g¢´¢r[733,7BI39B=Ió39,,B733379777=9Igz¢¢¢¢¢¢¢¢¢bbibggggiibigibbgbb__V[VQV_ir¢¤¬¬°¬¬°¬¬°¬°°°´´´¬«¢zrb[MIFFVQV[[[g__bgiiggbbgggbbbgbgbbggbgbbbbggmmmgmmirmz°¸zVi¤gMFgwV9[Q73+39FQmzgFB=BI[zb7 %=rB,,++9QQ3%%++33Vgg[,%+%%++,,+%++,,7Qb=+ % 7zrmw¸Â¤¢¬¬¬´¾ÂÂÅŸ¬¢¢¢¤´¸ÂÅÊ´bbmrrrwwwzrzmV3[rbw[Vrrzmigmb_bbgmz¢¤¤¤¤¬¬¸¸´¾Â¾¾¾°¬¬«mmigimwzzbgmgrwmi_QMQQF9=M9,7,+%3FI+_´«r[M73379M79B9û9339,333,373977+37=FQm¢¢¢¢¢¢bbgiggggiibigggbggb[_[V[[[bgr¤¬¬°°¬°¬°¬°¬°¬°´¬¬«¤¢zr_[MIMMMVQQV[[[g_bgbgibbggggbiibg__igbbbgigigmiimmiiwr°Â°¬«wwziwm979=%39FMQ[zrûMFMgrb+ 7[iV,,3+,[V7,+% ,Mgib7++%%%+33,,%,+%%,9V% ,b¢rii¸Â°¤«¤°¸¾ÂÂÊʸ°«¤¤°¸¾ÅʰwVg_imig__bggiiiV=,FmzQBbmIimi_wwmmrrgmz¢¢¢¤¤«°¸¾ÅÅž¸¾¾¾¾¸¬¤zzzmmwr_FVIF[_V_MIMQIB=BM9++%,,9BI,g¸¬mb_,,,37_9=F=B33,,,777777733,37=I_w¢¢¢¢¢¢¢__gbbbgigigibgb_bbb__[VVQ[_gr¢¤«¬°°°°¬°°°°°¬¬¬««¤¢¢zibVMMIMM[VQVV[g_[bbbgibgggbb_bi_bbgib_bbgigbbigiirmz«¸°´¬¤¬¤gVQV[F9,9B+%3BQVgwF+IVQV=bwb% 3QQm3,,,9Q_3,,%%+3=__iV3 3+++,,3+,+++,%%F= =¢ii°Å´¢««¬¬¸¾ÅÊÊÊ´°«¬¬´¾ÅʬgQV_b_ggg_IIIBQIM97,9Qi_I,,BFBVrzVgwzwrwwwz¢¢¤¬°¸¾ÂÂÂÅÅž¾¾¾¾¾¸«w[MVI77779BF¿=FMFBFIB,,+%%,7FM,[´°wmgV33,79Q=BBB977,3,3,3,733797,++3=Vm¢¢¢iiigigbmbgbbgbbgib_[_[VVQV_gw¢¤«¬°°¬´°¬°°°°´°°¬«¤¢¢miVMFIIMMQV[V[__gbbgbbgiibggbbbgggbb___b_gbgbigmw¤«¬zM3B73,+,,9V_9IIQ_rzb3+=I[VIirM+ 7_=gB%+,7[[++%% +,3B[w_9+++,3,+,,,3+,%% %= +mwgm¢¾¸¤««¬¬´¾ÂÊÊÊž¸´«°´¾ÅϤ_MQM_VMBFVVB=By773+37977,,,3,9Qzg_zwzzzwz¢¢¬°¸Â¾¾Â¾¾¸°¢gm_F99733333397ÿB=FM3++,+ +,IQ+V´«rwrQB73,9[B9ù9737,33,333,3337+%+79Qm¢¢¤¤¢bbgbgggbgbbgbbbggbb__V[QQQ_iw¢«¤«¬¬°°¬°´°°¬°°°¬««¢rgVQQQIIMMQVV[_[[bbbgbgiigggbbg__b__bggb_b_bbgrzizzM+3+% %%+=9MIQ[VmwF39BQiQMirI++%+9b7QV,,+,_g,+% %3,9IzwgB,%%+++9,33+% %% +M¢mg¸¾¤««¬°°¾ÂÅÊÅʸ¸¸´´¾ÅÊ[FMVMMIF939B77973733733733,+,,+%+7FMizz¢«¬°¸¾ÅÂÂÅÅÅÅÅÅ´«rbbBF7337773,3,3,97979=IBF9,,3+%%%,IV,I¬°¤rmQQF339QF»B93,3,93,,3,797,+%,9_w¢¢bbiggbgbbbbgbbbb[_bb[V[[QVVgm¢¤«¬¬¬°°¬´°°´°°°¬¬«¤¢zmbV[IIIIQVVVQ[___bggiggggbbbbggbbbbg__b_[__b_i¢¸¸wbbgz_B++, +BVg_MM[_iV=F_iFVrzQ+%%+3b77IF+33bg,+%,%%%%+3[zmM3,+,%++,,+ %+39z¢m«Ê´«¬°¬°´¸ÂÅÊž¸¸¸°¾ÅÅMBFFFFB37733333,3,,39,777B,,+%,++9_¢«´´¸ÂÅÂÅÊÊÊÅž¸¬wV993373333333,,3779777779FF7++3%+%%,IM,I¬°¢miVMB7,9MF999F7=,,,3,73,999973,%%,=bz¢¢¢bbiggb_bbgbg______b[_[VQQQQbmz¤««¤¬°¬°°°°°°°°¬¬°«¢zmb[[MIFIVQQV[[_VVgb_giibgbgbgb_bg__gb[_[[[[_bw¢ÊϾiQF9MigF+%% +=gwg[MM[i_VbQFImMIbzzV%%,%3_=+7V9,3[r,%+% %%%,7rzrr_=%% %+,33+ %+%[¬wgz¤¤¬°¬´´¸ÅÅʸ¾¾¸ÂÅ¢VFBBIw97333393,33,,,,+37=VF73,+,%+,+7Vmz¤«´¸¾ÂÅÊÅÊÊÊʸ°[M9993797393,333779B777=33,33,,%+,FF3F¤´mg_FFI,3I=»73,,3,333+997377++%,Ig¢¢¢¢¢¢___bbb___g____[_[_[[QQQMMV[bmr¤¢««¬°°¬°´°°´°°°°¬«¤zmbQMFFFMIQVVVQ[Q[b[__ggbgbg_bb__gbbb_b__VV_bz¢°¤Å×ʤwwiM33IQI7%% +=[wrgMB=gb3BgVMMgFMmwM ,+7V= +=V=,_9,,++% %+%+=izzrgF% +%+,,%+% F¢gb¸Å¬¤¤¬°¬¸¸ÂÂÏʾ¾¾¾¾Å¤_IBBBB973,37337737,++,,,3MBbwm_F9,+%,+%,=Vr¢¤«´¸¾ÅÊÊÊÏÏÏÊŸwIw93333FV[I,337B99773,,,+%++3BF,F¤´¢bb_IB=7QF=93,,,37337,33s,++7Qm¢¢¢¢_[_[bb[[[[[b_[[[_[_V[QQIMMQ_mr¤««¬¬°°¬¬¬°°¬°°¬°¬«¤zrbVMFMFIMQQV[[V[_______gbb___b___b___[VVVQVm¬Ï¬ÏÑÅzrV73FM9,% %7wi[F3,Q_F79[[M_[FQrI+ %3=Q=+,9QV7[F%,73,%++++3=mzmmgQ9+%%++ % 3i¤rb¬Ê¾¤«««¬´¸¸ÂÊÊÊž¾ÂÂŤ[BII3,,7,,3,7,33++,3+37F[¢gM7++++%+,Bbr¢«´¾¾ÅÊÏÏÊÑÑʾg9793,37739=3Vi[B3,++33397993,,733+%,,3MI,B¢¸¬_[VF3B7=MI=9973+,,3,,33777337,,3B_z¢¢¢bbg[_b__b_bb_[[_[[_Q[QQMIMQbgz¢¤«°°°°°¬°°´°°°°°¬«¤¢zmbVIIIBIMQVV[Vb_[_b__g_gb_b_bg___b[[[b[VQQQÏʸ´ÑϬwzgzi[=VQ,%+++ 3b_7,+Bwg3+,,F[VgVMbb3%% ,3IF+3,7B3MQ+,,+,+%+%%+7Ig_I[Qm_,++% % %QggÂÅ«¬¤¬°¬´´´ÅÊÊÂÅž¾Ê¬bFIQIIF9+,3,3337,+733+,,I=F_¢Â¬wb9+%%++,3Qm¢¢¤¬¸¾ÊÊÑÑÑÑÏŤm33,,+,99Qr_Ir_=,%++3777977,+,33,+ ,,MB,B¢´«bQgIBB9=VQ=99333,,333,3,73333+37Ii¢¢¤__bbbb_[_[__[[[[[_[VMV[IMMQ_gr¢««¬¬°°°¬°°°°´°°°¬¬¤¢zrgVQIIMIQVVV[[[[__bbbbbgbb_bgb_bb_b_[VV[VQVÏŰ¾Ï´zg[mMMV7, 3,++[rb7%,7mwF%%+=Virb_bwI9,,%,+=9+,3+,3Fg+3,3,,+3,+,,399+39M[V3++ 3ribz°Ê°¤«¬´´¬´¸´ÊÏÅÅÂÅÅŬiIQVVIF=3+++37=MB+,=9,% %VVBVz¬Êʾ°¢bF+,9II=Mmzzww¤¤«¸ÂÊÏ××Ñ×Ï´zQ733++3,,77[F¢¢iM7++++777997,3,,3,%%,,M=+7¢¸«_[b[FB=[B=Fs,,73337973,,,++3=_r¢¢__gii_[_b[[b[[b[[V[QQMQMIIQ_iw¢«¬¬¬´¬¬°´°°¬°´´°¬¬¤zrbQIIMIMQV[[[[bgbgbbbg__b_ggb_bgb[_[[[[V[VV¬ÅÅ_miBó %+933QwbM=%%3_rM3%%+,I_zzb_[wm7,++%F,,3%%7,%,=z=+7++++++7,,3,,++,=IB99%%% %Qbiž¤¬¬°´°°´¸ÅÏÊÊÅÂÅÅÊ´mQQ[VMB737+++3BQ[M3=MM3% %7[B3F¢ÏÊž¸iI9=imQIbzzzwz¢«°¸ÅÏÑ×××ÑÂ[B33393,++=9II¬¢z_B7,+,3333733,33,,%+7=QF,7¢°¤ggViB=I9_B=977,,,,3+79393,,3,39I_w¢¢bbbb_g[bb_b_[__[[VVQQQQIFIQ_mz¢¢«¬°¬´°°°¬¬°°´¬´°´°«zi_[IIIMQVVQ_b__b[_bbgb__bb[bbgbgbb_[[_[VVQI_´¾Å´¤gF,IQ+,%%BIVm[=,3%7MgFB,+ +3QVwV[Qr777,+,,, +3+++3gI3=7+%+%,,3,933+++393++,II99rg_ÂÊ´¤¬´°¸¸¸´ÂÊÏÊÅÅÊÂʾzQ[_VQF7737+,39F[g[39__I,%+BrM7BÊÊÅÅŬbFF_mQ[rzrwrr¤¬´ÂÅÑÚÚÚ×ÊmVF73BB=7,%=FbiF°¤¢bI=7,3B,,7w,,7,3%%+7_=+3¤¬«r[VgMBBFV=99733+,9=3,337,+,,37BMmz¢ggbb_b_b___b_b[[[VQVQQMIFIV_mw¢«¬°´°°¬¬°´°´°´°°°´«¢zrbVMFIIMVVV[[bg[gbgbgggbbbbgbiggbbgb[[[[VB9M¸¬¸Â°¢zig3+++ %+,Imi_B+%,3M[97F9,3+9FV_Bb[rB373,+,3++7+,%%,QV7F,, %%,%,79,++%393+ +,7FIbw_r«Ï¾«¢¬«°¾´¾¾ÊÊÊÅÅÊÊÊÂ_bigbVQB7333,,BF_riF3_b[IBB[mI7V°ÏÏÏÏÊʾ«[F[zz_[iwrmrrwz¤°´ÂÅÏÚÚÚ×¾gMMM39VM=+,FQFQIF°«¢iQF7+,7++,,,3+,+3I=+3=_9+9«°¬zFQiVFFVV79B7733,33,,3,333+,,79BVr¢¢¢zbbbbbi__bb_g_[_[[VV[VVMMIIQ_iw¢¤¤¬°°¬¬°°¬´´´´°´°¬¬«¤zmg_QIIIMVVQ_b_ibggbgggbbiigggibbbgg____VF33I¸VQi¢¾Â´«_mrVB%%%+% ,9wz[M7+%9MVI77MM,,39BgbMQgr9,,3,+,,3+9,+++3BzzF=+++++,,+39,+%%+++%% %%,IirVi¾¾¤¢«¬´¾ÂÊÊÊÅÂÅÊÅibgrmi[VQMB9,+,FI_wzbB9QbVV[VF9BÅÑÏÏÑÊÏÅ´mMFii[bmrmrwwzz¢¤°¸ÂÊ×Ú×ÑÊ«z[Vgb9=_g[IBViVI9V¢°¤wM=9,,+++,,3,3++3+%+,¹,3z«¬´MMg[MB[V39F=,+,,7333733733,737Fbr¢¢¢bgbbgg__bbb[gb[[[V[_QMMMFIM_iw¤««¬¬´°´´´´°¸´´´´°««¢zrb[MMQMQ[Q[[bbb_biiggibiibgiigggbgigbbVI9,,9r¸VBVm¤ÏѰ«¢gQ,7373+%%++3BVmbI,3,,IV9B79I[7+3=Izi[Vzr9,++,73,,%9+%%%,=gM7,3+7++3,3=,%,%++% ,% %,[wrQ_°¢«°¸ÂÅÊÊÅÅÂÂÂgmgrwzwmg_bVM7,3FQ[irV9=MV[MI7Br¬ÏÑÑÑÑÏÏʸz_Qbwgbimmwrwz¢¢¤´´ÅÏ×Ú××Åm[izw_9Qbb[VV[VFBz¬¬«mVF=,,,+%+,3++7++,+,3Fg3,3r¬¬´QF_[IIV[99733,33379777,+,3,7Qi¢iibgbb_bb_bbg_[[[_VVQMMIFFMVgz¢¢¤«¬°°°°¬°´´´´´°°°°¬¢¢zrb[VMIQQVQ[[_b_bggiiigbgiim_giimirziVFFB9,++=«rm¬Â×ÏÑÅ´¬i9+%++,, %%,,=_bQF7733=BQ=I79BV99=FVwbVw=,%3+33,,7B,+%,+9QwM++733+,++773+,+%%+%,+%,=gMg¤¢¢««¸¸ÂÅÅÅÅÅÂÂÅÂmbmrzrwwmgbI3+3B_irrV99=MiÅÏÏÑÏÑÊŰr_grgmrwzwrz¢«°¸Ê××ÚÚ×¾gimwQBVgg_bQFFm¢´¬¤mQF=,77+,+,,+,,%,%%,3Mg3,7i¬¤¸V=[VIIVM77773,=9,7,3=73,3,,37[i¢¤¬bgbb_bbbbgb___VV[_V[QMMIFIV[ir¢¤«°°´°´°°´´´´°´°°¬«¢¢zrg_VQQMQV[[[bggbggiggiigggmgbgigwiM93793,73F«°Â¾¸ÊáîáѸz=B+,+,+++%+37Qb[FByVI=9=IVMVQ[wi[MwI7%%,93,3997%,+,7FM9++,93,+%+,79%%% %+337=mzQV°¸«°°´¸¾ÂÅÊÊÂÅÂÅÂmgrwwwzwmVB,,Ibrmrzr_Q=BI[¾ÊÊÊÊÏÏž¢wirzmrrzwwzz¤¬¬ÂÏ×ÚÝ×Ï´bmrm[MIV[VIMr´´°¤iMB733,,3333+,,++++,3Q_939i««´_=V_[Q_Q99797,,,7733,,+,+,9br¢¢¤«¬°bbigb_bg_bbbg__V[[[VQMMIFFQ_iw¢¤¬¬°´°°´°°´´´´´°°¬¬¢¢wri[VIMQMV[[_bgibgbiiimiiigmbgiigim973=7,79IVw´«¾´ÂÝôñäÏ99I,%%,+ %%,3QgQMIQQ[F33BVVFFQQMb_[FbggIVmM7++77,,+=++7,,+7,%7=3%%+,,37% ,, +79[bVg¢Â¬¬´°´¾ÂÂÅÊÅžiirwzrwzwgQBBQbrwwzmggw¢¸ÅÅÊÏÏÏÏÊŬrmzrrzrzz¢«´ÅÏÚÝÝ×ϬbbiriVMMVbz´´°¬¤ziQF9773,,,3973%+73,,3QV337[«¸¢g=M_VQ_IF37,33373,+,799333,,3Qbz¢¢¢¢¤¬«¬´´bbgbgibbbbbb___V_[[VQQMIIFQ[bwz¢««¬¬°´´´´°°°´°°´´¬«¢zrg_VQVQ[[[_bbbggggrimiimmmiiibMB=B,73_gVM_w¤´¬¬¸äôñáÂr?gB%+%++%+3Igmmb[IF33+,7QQQ[_[VV[FBgiw9Qr[I,9=3%%,=3+%+ +,993,7B=,,7,,,37% %% 9+MzbgÂÅ¢¬°¸´ÂÅÅÅÅŸggrzzzzzri_[___mw´¸ÂÅÅÊÏÑÏÅ´rmwrwz¢«´ÊÑÝÝÝ×ʤg[[bzzrw°¾´¬¬wgQF3,7s,7733,,77333[V739[«¾¢gFIbMbQMI93,33,3,+37799,,3,,3Mg¢¢¤¢¤«¬¬°°´¸¸bb_gggbb_bbbb[[[[V[[VMIIIIQ[iz¢¤¬¬¬°°°´°´´´´´°´°¬«¢¢rg_VQVVQV[[VbgbgiimmmimmimriB7,+++77Izz¤´¾«´ÚéÚ¾Q=,39mV++%,,,B[zriV,+,% %Bb7=[_VMBVMIgwz3Mw¤i[FI3,,%,7+%%%+33,3,39B97,+,3B9,7+ + ++9m_bz«Ï¾¤¤¬°¸¸ÅÅÊÊž¾bbwzzzzwibiQIr«¬°¸¸Â¸¬¤«wwwwzz¤¬¸ÂÏÝáÝ×ʤrg_[iw«¬´¬¢zg[I7,7B=9979733373337[V977[¤¾°mQV_QgF=37,,+,,,+3,777,+%,,B[w¢¢¢¢¢¤¬¬¬°°¸´¸¾¾ggggggb_bbb_bbV[_[[V_MIII=Q[iw¢¤«¬°°´°´´°´´´´´´´°«¤¢rgb[VQ[V[[[_ggbgmmimrimmrgzV,3,+,39Fb¢°Â¾¤ÏÏ´Q73,,,3Qb=,79Igzi_i3% + 3Mm%7[[MMIM_Mbw7Q¤wwmIB3FQ%3++%%+%+,733,393,933,+9,%%, +QmViÂʬ¤¤¬´¸¾¾ÅÊÊÅžb[mwzzzririmzrmr«¤¬°°«°´¸¾°¢zwzrzz«´ÂÏÚÝÝ×Ê«zwzw¢m_M9,,=IB973,,3I7379[V,,7V¢¸´rVIV[iB7BBF,,+,9,+3397993+7BIbw¢¢¤«¤¢¢««¬´´´¸´¸¸¾¾Âiiggbbgbbgibb_[[[VVQVMMIIFM[gw¤««¬°°°´´´´´´¸´´´´°¬¤¢zmg_VQMQV[_bb_ggiiirrmmrmim«=%, +7=Mb¢Å°M,7,++%3Fr_Q_iwiQIF_V+%%%++7[z+3b[QIMMM__zQg¤mmrB99bI+,,3+ ++,+7,3,,3+++3,9,9+%% % 9w_b´Ê¸¤««°´¸¾ÂÊÊʾ__grwzwimizmbz¤¢¢¤¬¬««¬¬zrzz«´¾ÑÚÝá×ʰ¬¬¤¢wb[MB3,9VQIF977+3I7739QI,,7Q¸´[MM[gI7FB3,333,,+%39,79zVmz¤°¢¢¤«¬°°´´´¸¸¸¸¾¸¾Âgggigiggiigb__[[[VVQMMQQFII[gz¤¤«««°°´°´´´°´¸´´°´¬¤¤rb_VQVV[[[bbbgiigrmriwrrmi=++%3Ibm¬¤¸¸rB33,,7Frmii[VF79Bbi3+ %%+3=_z%7[b[I7FFVgrzgg¢mMmFFi_7%,,+%+,,+,,+,,3,3,3393,+3 % +_m[g¢¢«¬°¸¾ÂÅÏÅÅÅÂb_imwwzmgwb[rgirg¢««°¬°«wzz¤´¸ÏÚááÚÏ´««¤¢zrrr[=B=»=B[[VF77797,,37737BQQ333V°¸_VFVbQB99,,3,737,399B7,37BM_r¢¤««°´´¸´¸¸¸¸¾¸¸¸¾¾gggggmigbbgb[_V[[[VVMQQIFII[gr¤««¬¬°°°°´´¸¸¸´¸´¸°¬«¤wgbQMQQQ___bggigirrrmmmmim¢V+,7Fi¢´¤°bB9=IF9379MwzQ9=,3FgzF% %++,97[z79Mig[,3M[iwirmbI__I+ +,++,%,+,,+,77++,99,,+ %% %Fzb[°Â¬««°´¸ÂÂÊÊÅÅÂ[Qiirmwzm[rmzg¤¤¢¤zwzz¤°´ÏÚÝáÚÏ´«¢¢immrr_r_B9M9BVVQMVVQB97393% ,3,99IVQ339M´¾gVB_bQ977,,,,33,+799773,7B[iz¢¢¢¢¤«¬°°´´¸¾¾¸¾¾¾¾¸¸¾¸¾gggbbiiggbg_[__[VQVVMQFFBIMVgm¢¤«¬¬´°´´´´´¸¸¸´¸´°¬«¤¢rgbVMQVV[_bibggigimmimmmimzg9BI_¢zwzr_QFBIF9++,33+,Qr[F7Iiz=7,,+,33,Qr7MI_b_9%3Qgmzgrwrbbwwi+%%+3,33B+%+3,,,,++,,377,+%% 3imbi¸´¢¢°¬´´¾ÅÅÊÊÅÅ[Q_gmwwzrmzm¤ww¤«¸ÏÚÝáÝϸ¬¢¢mzrwwrziVB_MIM[VVQVVF77793,%339QMQ3,7M´¸m[9[bM9333373%,7=3,,77Bgm¢¢¢¢¢«¬°°´¸¸¸¸¾¾¾¾Â¾¾¸¾¾¸¾ggiigiig_bgb[V[VQVVVQQIIFIFVgr¤¤«¬¬°´´°´´´´´´¸¾°°¬«¤wig[IMVVV[[_bgimimrrrrmmmmmbmwwrzrMBI[VQ[[I97,%++3,%%=m_MiiMMQI,79++MrB9IQiiM+3_rgbrzwzrwm3 %393,++3,33+,33,,,,7737,%%% %[¢bgr¤¸¢¢«°¬°´¾ÅÊÊÅÂ[MQbimzzwwz¢¢«¾Ê×ÝáÚѾ´¤¢zwiQi_IQbbb[_QF9,99,%%33+39MFQ3+7M¬¾¤w_7QgB9,79+,3,++,9s7,+,Mgz¢««°´´¸¸¸¾¾¾¾¾¾¾¾¾¾¾¸¸¸¾ggibbgb_bbb__[V_QQVQQIMIFBIQirz¤¤«¬¬°´°´°´¸¸´¸´¸´°°«¤ri_QMIQQVV[_b_gggimmwiiiigw¤«mVFFBBFFbiQ73,++++7%+77BrzrgmwM+79 %9gFBFBmr[B3iiQQrwz7%++,797++7333,%,733,773+,3% 9wmbr¸«¤¬´°°¾ÂÊÊÊÅ¢_MQ_brwz¢zz¢¤¬¸ÅÑÝáÝÑ´¬«¢ziVggM_i_b[b[M=7=7,%+33,39=IM3+7M«Â«zb9BgBB7+93+3%,+3FI=,+%,7Ibz¢¤¢¤«¬°¸¸¸¾¸¾¾¾¾Â¸¾¾¾¾¾¾¸¾¾gbggbgbb_b_[_V[VVQV[QMIF=FMVbmz¤¬¬¬°´¬°´´¸´´¸¸¸´°´°¤¤wibQMIQQV[[_bbggimmmiimiigmz¢¤¢¤¬¢m_FIQI9=VgVQ7,,3%+=7+ 777=gzzrF373%+3VVMF=bwiVFiVMF_rwrzzw[B3B,,+%+3,,+,3,,,7,,,+,+3%%+% +_¢ig«¾«¢«°¸¸°ÂÅÊÊÊ«_IV_bmwr¢¢¤¤¢¢¢¤¬¾ÊÑÚáÝÑʸ´¬¤¢zrbii_gggg_b[M=7=9,%%777399MF,,3I«¸¤b=[I7=+73393+,3BB7+,+,3Qr¤«¬´¸¸¸Â¾¾Â¾¾¸¾¾¾¾¾¾¾¸¸¾¾bbgbbgbg____V[QQVQQQMMFF=IQgr¢¢¤«¬°°°°´´´°¸¸´´´°´¬¤¤rgbVMMQQ_b__bbggmimmimmimiim¤««¤wm_MMFBBBQ_VQ=9,%%%3Q3,,9Qrzww_I9,++3MMIF7=wmb_I=IBbm_bVQ__I[MI++,,,333,+,3777,,,,++ % =zrim°«¤«°´¸ÂÊÊÏÏ´bFQ__gmrzzz¢¤«¤¢¤¤¢¢¤¢zz¤«¸ÊÏ×ÝÝ×ʾ¸¸¬«¢¢zzwrmrmiimmigVQ9,++77,==FQ377F«¾¤_99_B79+99,73,33,%++BVr¢«¬´¸¸¸¾¾¾Â¾¾Â¾¾¾¾¾¾¾¾¸¾¾¾¾iibbbb___[[_[[VQQQVIMFBw=M_r¢¢¤««¬°°¸´´´´´¸´¸¸¸°¬«¢zi_MQVMQ[[_[_bgigmmmmmgmimmmz¬¤wrwmbI=9BMib[M73++%9=[939FB7Mbbiirii_gF93%+, +=IFF77MwwgIVb_gbVVi9=[_=I373,,++,,,+,,+37,,3+,3+% % ,gggz¤¸«´°°´¸¾ÅÊÊϸm=MV_gmmwww¤¤¢¤¢¢¤¤¤«¤¤¤¢¤¢¤¢«´ÂÏÚÝÝמ¸¸°¬¤¢zwmwrwrmibbQ77%,77,9=9IQ333F¢¤¾¬g=B_M,9+,93,+,37773++3+Bgw¤«°¸¾¾¾¾Â¾¾¾¾¾¾¾¾¾¾¾¾¾¾gbbgbV_[_[VQMVQQQVQMMFBBM_mz¢¤¤«¬°°°´´´¸¸´´´¸´´¬¤¢wg[VMQQ[[V[__ggibmimmmmmmmmmrrrmmziV=QigV9=7+%,,M[97BV_VmgwMBIFBgiQI,,, 377=VQ733MrwzwrIIimB=_F%+,3,,,,,,+,3%++,77,333,,%%%+Figi´¬°°´¾¸ÅÅÊÏÏÂ=FV_grmmrz¤¢¢¢¤¤¢¢¢¢¢¤¤««¢¤°¬¬¤¢¬¬¢¤«¤¢¢¤´¾ÑÚáÝמ¸¸´¬¢zrwmwwrri_VI=I97%,773B9=VI3+3=¢¸°i=BV_,,939,+%+339+,,%,,Igz¤¬°´¾Âž¾¾¾¾¾¾¾¸¾¸¾¾¾¾¾gg__[[[_[_V[VVQMMQQQIFF==BIViz¢¤«°°¬°´´´°¸´¸´´´¸°«¤¤rg[[QIMQ[___bbgmimmmimirimmmwwrigrmiM=9IFM_m_B,,93++3=VQF=MgiwimF933MibQ3%%+%3B,9=_[F737Fz_=rIIr++++3,3+33,,,,%,,33=,,,33+++,7imbgw¢´¬°´¸¾¾ÅÊÑÏÅB=M[_imrwww¢¢¢¤«¤¤¢¤«¬«¤¤¢¤¤¢¤¢¤««¬««°¬«¤¤«°¤¤¬¤¤°°ÂÏÚÝÝ×ϸ¸¸¬¤¢zwrrrmmmbbV=+3739=9=IB3+7=¢¢¸°b9=QV,,7393,%,3773++++7Mi¤«°´¸ÂÂÂÂÅž¾¾¾¾¸¾¾¾¸¾¸¾Âbb[b_V[VV[[QMQQQQQMIFF=M[i¢¤«¬¬´°°´¸°¸¸¸´¸´´´¬«¤wgb_MMVVQ[[_g_igiirmrrmrmmrwzwmmiwrgMB[bwzzw_M93933+3,=_[QF_wwmggI77Fiw[F%%%%,7,3MQimQB7+3gzQB9BgQz¤¢[+,+,,33,,373%+,,++37377337+,,M¢gbm¸¤°´¸¾¾ÂÂÅÏϤ=FQ[_irrwzzz¢¤««¢¤¢««¬°«««¢¤«¢¤¤¬°°¬¬¤«¤¤¤¤¤¤¢¤¤´ÂÏ×ÚÝÚϾ´´°¬«¢zzzwzrmigg[B7+3,39BB3 ,9«´°¤i79QI+%33B++%+777,+++,=[w«¬´¸¸¾ÂÅÅÅž¾¾¾¾¾¸¸¾¾¾Â¾¾¸¾¾¾b___[[V[_VVVVQMQVMQQFBB==IV[gz«¤«¬¬°°°´´´¸¸°¸¸´°¬¤¢¢wi_VMMQQ[[b_bbgggimmimmmrmrrzzm_mrzmgrw_w933,,7MibMMir_wi_¿miQ,%%%%,3,9MbriVQ=FMMmiQ=_gr¤«r9337373333377,+,,+,3,73,,33%%9mrmi¬¾´´¾¾¾ÂÅÅʰM9BIV_gmrwzzz«««¢¢¢««¬°«««¢¤¢¤¤««¬¬¬«¤««¤««««¢¢¢¤´ÅÊÑÝÝÚÑŸ´°´°«¢¤zzzzrribQFB9=7%,339979QI, +9w¤´´¤mM% 373+7,37773++,3Fgr¢¢¤¬´¸¾¾ÂÅÅÅÅÅž¾Â¾Â¾¸¸¸¾¸¾¾¾¾¾¾¾[[[[V_V[QQVVQVMMQIMIFBB999FIVmz¢¤««¬°°¸°°°°´¸´´°´¬°¤¢wi_VMMMQV[V[_bgbiimrmmmmrwrwrgiw¤«¢z_MB9BB=9QwgMFrizm[[QMgw_B %+++3+9=QbzbVVVQFFbwzzw9BFIBBB=,+,,73,,,,+33,337,+3++Q¤ggr°«´¾¾¾ÂÅÊʸ[77FQQbimrmzz¢¢««¤¤¤¬¬«°¬¬¬¬¬«««««¬¬««¤««°¬¬«¬¢zz¤¬ÂÊÑÚáÝÑŸ¸´°¬«¤zzzzrrmg_IB,93+,7³=QB3,+9«¬¸¤w97II+%3B93,++33,,,,,=Vmz¢¤«´¸¾ÂÂÅÅÅÅÅÅÅž¾Â¾¸¾¾¾¸¾¾Â¾¾¾ÂÂVV__[[V[VQVVVQQMQIMFB9=FQViw¤¤¬¬¬°°´°´°´´´´´´°°¬«¢mg[[QMMQV[[__bbbgigimimrrw¤¬¤¤wbIIF=¿FB9=_zVFQmzwz[_m_gzr[I+% ++ +3,339B_mwVbmmb[[M[wFBib_QQVIB%%%737+%,,++,,,,+++,Bwi_iw¤¾¤°¾¾¸¾ÅÊÏÂz77=FIVgirrrzzz¢¤¤¤«¬¤¬¬¬°¬¬¬°°°¬¬«««¬¤¤¬°°°¬°¬¤¢zz¤°¾ÊÑÝáÝÑʾ´°¬¬¬«¢zzwrmi[MF797337973F9[=+ %7z¢¢¬°¤wF3F=+%+B3+++3793,,,+9[m¢¢¬´´¾¾ÂÅÅÅÅÅž¾¾¾¾¾¾¾¾¾Â¾¾¾¾Â¾___[ib_[V[VVVVVMMMMIIBB=9BM[gw¢¢¤««¬°°°´´´´´¸´´¸´°¬«¢mg_MQMMV[[_Vbbb_bbmmmw¢¢¢¢««¤zbQIMMVQB7779¿=3IgiQI[izmQQbzrwbF+%%++% +733,+7IQigmwzzri_Vii=3_wgQV[Q,%,37,,33,,73++++%%,Q¢zggm¸°¬¸¾Â¾ÂÊÏÊ333=IQ__mrwzwzz¢¢¢¤«¤¬¤¤°¬´°¬«°´´¬°¬¬¬«¤«¬°¬°¬¬««¢¢z¬¾Å××áÝÑϸ¬¬¬¬¬«zwzri[F999,+37B73I9Q9,,%,w¢°¬zI3B7 +B=, ,9777,,3+Fgw¢¢¢«°´¾¾ÂÅÅÊÅÅÅÅ޾¾¾¾¾¸¾¾¾¾Â¾ÂÂÂÂ[[[_gbVVQQVMQQQIIIIFFB9BMbmz¢¤«¬¬¬°°´°´°´´¸´°¸°¬¤¢wi_VMMQV[[[[_bbgggir¢¢¢¢M÷9I_V==BFF9QigVMVwrMQbwwbV=,++3++%+%,++,3=QQBFmwzzwiM973,3_rbb_I,,373,9,,+33,+,+++%3mmgmw¤¾¬´¾¾ÂÂÊÑϤ=++7BIV[gmwwrz¢¤«¬«¬«¬¬´´¬«««°°°°´´°°¬¬¬°°°°««¤¢«¸Ê×ÚáÝÑÏ´¬¬«¤¤¤¢zwwmi[F99=3,3=I79F=V9+3+,g¤°«¢Q,FB,,+99++,393+,,,3Qgz¢¢«°¸¾¾ÂÂÅÅÅÅž¾¾¾¾¾¾¾¾Â¾ÂÂÂÂÂVVVV[[VVVQMVMMQMMMIII=wBMbrz¢¢««¬°°°°´´´´´´´´´°¬¤¢ri[QIMMMQQV[[bgigwzrB,7,9QQVw9=B÷9BFQg_QM_[Qm[F3377,,%++,+,,379MM=IiwrmM% %%7bwiV=7,,,,,3,,3,,,,3,+,7Q«rrw´´°¸¾ÂÂÅÏϾV+%37BMV_imwwwzz¢¢¤«««¬¬«¬´°°°¬«´°°°°°°°¬¬°°°¬¬««¤¤«¸ÊÑ×ÝÚÑϸ¬¤¤¤¢¢¢wmg_I9=9,+99B{BV7++%,_¤´¤¤b9B7+++73+3799+,%+,7Vm¢¢¢¢¤¬´¸ÂÂÂÅÅÅÅÂÅÅÅž¾Â¾¸¾¾ÂÂÂÂÂÂÅÅÂV[QQ[_[QQQIMQ_MMMMFFIB9BQ_iw¢¤«¬°°¬°°´°°´°´´¸´´¬¤¤rg[VIMIQQQ[[_ggwzwzzrbQF973B[[MI=B=B=9I=7=IVb[FQ_wwbmw9773777,+,33,7,+3,37F_[B7=QiM, %+33BbwgF79+,,3,,,,,,+,3+++,9irrww¸«´ÂÂÂÂÏÑÊz, %,9FVbbmmwzzz¢¤¤¤¤«¬¬«°°´°´¬°´°´´¬°¬°°°°°°¬«¤¤¢¢z¤¸ÏÑ×ÝÚ×ÏÅ´°«¤¢¤¢¢¢wzzwi[F9³,3B977MBV93++,_¢¬¤¤i393,+,,7+%33,7++++B[w¢¢«°¸¸¾ÂÂÂÂÅÂÅÂÂÅÂÅž¾¾¾¾¾Â¾ÂÅÂÅÅÊÊÊQQV[Q[VQMMQMMVMMIFFFBI9=M_iz¢¤«¬¬°´¬°´´¬´´¸¸´°¬«¤¢wb[VMQQQV[[_biizzrwriwzwr[_VIFIMIM[I99¹7=9IQQmV9Fbiizwzri=3++73,+333+,,,3,37,79_b9,+I_M3+%7Vbwzm[FQ9,,%3+,3+,,,+%%%+3_izw°¸«¸¾Â¾ÅÑÏ7%%,39BQbgmrzwzzz¤¤¤¤¬«¬¬°´°´´°¬¬°¬¬¬°°¬¬°´°«««¤¢¢¤¸ÅÑÚÝÝÚÑʸ°«¤¢¤¢¢zziiVw73,7BwQMQ3++++_¤¬¢¢¢z=,3%%%+,3+,97,+++,Bbr¢¢¢¬´¸¾ÂÂÂÂÂÂÂÂÂÂÅÅž¾¾Â¾ÂÂÅÅÅÅÅÅÊÊQQVQMVQQIMIMMQQQIIIBF=9=I[iz¤««¬°°°°°°°´´¾´°¸°°°¤¤ri_[MIMQVVV_bbmiwmmmrrrwwiigi_ib_VVV[[_B7,9=BMbmr=7IQrwMI=VV,33=3,+3,,+,,,3,79++,=[_=+B_=,%% ,_bii[g_73+ ++,+%%33,% ++9zwmr¢Ï°´¾¸¾¾ÊѬB++,977FVbimwwzwzzzzz¢¤«¬¬¬¬°°´°´°°´°°¬¬´¬¬°°¬°«¬¬¤¤¢¢z¤°ÅÑÝÝáÚÑÊ´¬«¤¢¢¢¢wrbV99,,99737FVM73++,Q¤¬¤¢B+7% ++,=3,33,+3+,Miz¢¢¢¬°¸¾ÂÂÂÅžÂÂÂÂÂÂÂÂÂÅÅÅÅÅÅÊÊÊVVVMQIMMMQIIMQMIIIIFBB9997=F[iz¢¤«¬¬°¬°°´°´´´°°°°°«¤¢mgb[IIQQ[[[_biimggimmmrmz_[[MF[b[VVg_IM9FM779BIVbrr[7=FVmb799Mi7373,,,+3,3,,++777+7,I7QV99[I7+ %+[gmizzQ,,737 +,++3+%% %3_¢rwr¾Ï°¾Â¾¸ÂÑÂb%%+,37BFV_grrzzzzz¢¤¬¬¬¬¬°´°°´´¸¸´°¬°««¬°¬¬«¬¤¤¤¢¬ÅÏÝÝÝÝÑʸ¬«¤¢¢¢¢zmmbQ=9=9+3s79F_I7++%,M¢¬¤«V%, %,+,I7773,3,+9Vm¢¢¢¢¢¤´´¸¾ÂÅž¾ÂÅÅÅÊÊÊÊÊÊÊÊQQQMQQQMMIMFIMQIFMIFBBI79=FI[iz¢¤«¤¬´°¬°´´¸´´´´´°¬«¤¢wg_VMMM[[[_[bbbmigmmmmwrmM_[FFQVI_gbMB[_MI33=FV_mw[93=Bim_bgBB=Fi397,,+,+,973333339,,7B33993QQ7+ +ViiB33,+%+++%%3 + 9wrrwwϾ¸Â¸¸ÊÊ7 %++,7FM[bgwrwwzz¢¤¤««¬¬°¬°°°´´¸¾¸´¬¬¬«¬¬«««¬«¢¢¢z¤°ÂÏÚÝÝÝ×Ê´°¤¤¤¤¤¢zwgbI9997+3s39F[I3%% ,I¢¬¢¢V+3+++%3M93773+,+B[r¢¢¢¢¢z¢«´¸¾ÂÅÅž¾ÂÂÂÂÂÂÂÂÅÅÅÂÂÂÅÅÅÅÏÊÊÊÊÊÏÊQQQMMMMMMMMMIIFFIIIFB=7=F_iz¢¤««¬°¬´´´°°´¬°´´°°¬¤mi[VMIVMVQ[bbbbiimmirmrrwiQQVQ[MIgwr[B_g[BViwz_9379Qmr[grM7BmI99%+,+7,77377,,77,,,3F73333IV9% +9Mgmr[=%% %,% %3% +[wmmr¾Å¸¾Å¾¾ÅϬ9,+,7,37=M[bmrrwwzz¢¤«¤¤««°°´´°°¬°´°¬°¬«¬°¬«¬«¢¢¤¬¸Ñ×ÚÝÚÚϸ°«¤¤¤¢¢zribF3%397379I_I3++%,F¤«¢¤b+, +9+3=33,+,+,Ibz¢¢¢¢z«°¸¸ÂÅÅÅÅžÂÂÂÂÂÂÂÂÂÂÂÂÂÂÅÅÊÅÅÊÊÏÊÏÏÏÊÊQQVQIIFQFIIIIIFFI¿=7BIVg¢¢«¬«¬°¬¬´°¬´¬°°°°¬«¤¤wi_QIIMQVV[[_iiggimmmrrrrwrgB=[wgizz_IF_i_IFI_iwiM9,+79VQg[[miB=M9B9++++737373,3333,,I+,+%3B[9% ,I[gmmm¤w[,% % % 9rrrmrŸ¸¾ÅÂÅÊÂi33++9,77=M[girwzwww¢¢¢«¤¬°¬°°¸¬°°´¸¬¬¬¬«°¬««¤¤¢¢¢¢«´Ê×ÚÚÝ×Ͼ¬«¤«¤¢¢¢zwwiVB9F7,+773339M[I3++%+9«¬«¢m9,%++%3BF793,,,3Vi¢¤¤¤°´¾¾ÂÅžÂÂÂÂÂÂÂÂÂÂÅÂÅÊÅÊÊÊÊÊÏÏÊÏÊÏÊQQIQIMFIIIMFBIIBFIBB=B979BIVgw¤¤¬«¬¬°°°°¬°°°°¬¬¬«¤¢zg_QMMVQQV_[[_biigiiirmrrrmV9Qzz[=B_bmbVFIbriF77397997[m__r939Bs+7,3=,33+=3+7333,9B,,3IB+% 9B_grzg[°zF+ +,+ +% +Qwrrwz´Å´¾ÅÅÊÑÊ3++%7B,39=IV_gmrzwwz¤¤¢¤««°¬°°°¬°´°¬¬««¬¬¤¤¤¤zr¢¤¸ÂÑÝÝÝÚѸ«¤¢«¢wzrgVF+%933,,3F_I,,+%+Bz¬°¬=++ % 3BB=,3737=Vw¬¢Å¤¢¢¬°Â¾ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÅÅÊÊÅÊÊÏÏÏÏÊÏÊÊÏÊÏIIMIMMFIIIMMIIFFFBFFB7¿Vgw¤¤«¬«°°¬°¬¬°°´¬°°¬««¢wg[MIM[Q[_[bb_bbggiimmrrrriQVw[FBVmirb=F_rmI999{393Frz_QzI399B993333B9,++73,+,,%,,+BVi3+%7B,++++Qmrm_M[¤«mB,%+% % ++3rirrwŸ¾ÂÅÊÏѰF+ %+,39BMMbgmmzzzzz¤¤¤¬¤¬°°¬°´°°°¬««««««¤¤¤¢¢zz¤°¸Ï×ÝáÚѾ«¤¤¢¢zzmbM=3++,7,3,79I_I3%%% 7w¤¬¬F%3++ ,B,7,3Fbw¤¬°°«°¸¾¾ÂÂÅž¾Â¾ÅÂÂÂÂÂÂÅÅÊÊÊÏÏÊÏÏÊÏÏÏÏÏÊÊMMIIIMMFQIIIIMIFF¿w733=FViz¢¤¬«¬°¬¬¬«¬¬°°¬°¬°««wg[QIIIM[Vgrmb_gbgiimimmmrww¢r_BIFMriiF9_z_9979IM7Q733B_iMb739F99377,F73,,,3,+,3,+,,Fi_3%%,F7+,+3MmmzrVIw¬¤rI,% %+ +++Mzbrz¬Ê¸ÂÊÊÑ×Êw3+ %%³37=FQbiirwzz¢¤«¤¬««´¬¬¬°¬°°°«««¬«««¤¢¢«´Ï×ÝÝ×Ñ«¢¤¢¢¤¢zwmbQ=++,39,79=MVF3%%%%9r¢°¤V9= %37B9,7333Ig¢¢¤¢¤°´¾¾ÂÂÂÅž¾¾¾¾ÂÂÂÂÂÂÊÊÊÊÊÏÏÊÏÏÊÏÊÊÊÊÊÊÊIIMMQMMIIIMMMQIFIFIB9=7739F[gw¢«¬¬°°«¬««¬¬¬¬°°°«¤¤ri[MQFMQQ[rb_bbiigigmzwQF,=IVriMBVV779gI=VI=7Mrr[F%3B9B9B73I93,37+,+++3%%,MIV3%,3=9,,,=_mwiMMz°m3, %++++,_ibrzÂÊÅÅÊÏÑѤ, %%%,9F77=FQQ_bmmwrz¤«¤¬««°°¬¬°¬°¬¬«¤««¤«¤¤¢¢zzz¢«¸ÊÚÚÝÚ×Ê«¢¢¢wwi[F=7,3,773BM_F+ % %3i«¤g7B 3+,979+,%+9[w¢¢¤¢«°¸¾Âž¾¾ÂÂÂÂÂÂÅÅÅÅÅÊÊÊÏÑÏÑÏÏÊÏÏÊÊÊÊÊÏMQIIFFIFFIIIMFFFBBBB=7377=FViw¢¤««¬°¬¬¬«¬°°°°°°«¤¢wiVVFFIMM_zg___iigrz¢¤bF9973FQmzV=_b9,,,7_wIFV799rQm[w773973BB3++,%+3++9+%%ÿBFF+7=QbgrV9V_´¬M+ %+%+ 9zmmm¢ÏÅÅÊÊÏÑÂ_% % %%BM937=MQ[bbmrmzz¢¢¤¢«¬°¬¬¬¬¬«¬¬¬¤««¤«¤¢¢¢zwz¤¬¸Å×ÚÝÝÚʬ¢¤¢wziVF3+,7939I_M3%%%%3g¤¤g=9 ,9y73,+=_z¢¢¢¢¢¬´¾¾ÂÅÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÅÂÅÅÊÊÊÏÏÏÑÑÑÏÑÏÏÊÊÊÊÊÊÊVQMQIMIMIIQIIIIMFBBB99333,BI_iw¤¤¤«¬¬«¬«««¬°´°´°¬¢¢¢wm_MIMMII_zr_[__iiw¤««mF+,797QiwIQzz[373,+9wmIMV77V[[m333797Q{7++%,%%+%+,%++BQMMBFM9,7FM[_z¢b=7Qr¬i% % %[mir´ÏÅÊÏÏÏÊ3%%%%+%BV9379MV[ggmrrww¢¤¢¢«¢¬°««¤¬«¬°««««¤¤¢¤¤zzzz¤¬¸Ê×ÝÝÝÚÏ´¢¢¤¢zwbQB73%++777F97=IVV3 % ,,b¢¤zmI7+ ,9797,,%,Mgz¢¤¢¢¢¢¢«´¾¾Âž¾¾Â¾ÂÂÂÂÅÅÊÊÏÊÏÏÑÑÑÑÏÏÏÏÊÊÊÅÅÅÊQMIFIMIQMQMIIFFBFFû97333BI_iw¢¢¢«¬«°¬«¬¬«°¸°°°¬««¢¢rg[IIFMFQ[z_b_gw¢¢wzgB%,93=mzb_zzF9=,3QzgBi[39bwbBzI33yF9=,,%%+%%%+3,3=Q[[QMVM3,FbVMb¤¤«wI3Bb_%% =wmrÅÅÊÊÊÏʤ=% +BV9779FQ[ggmmrwzz¢¢¢¤«¬¬¤¢««¬«¤«««¬¤¤¤¤wwzz¢¬¾ÊÏ×ÚÝÝ׸¢¢«¢zwm_MB7+%+373ù=BMVV,%+%,3_¢¬zwQ, +9733+,%=Vm¢¢¢¤°¸¾Â¾¾¾¾ÂÅÊÊÊÊÊÏÏÏÑÑÑÑÑÏÏÏÊÊÊÊÊÊÊÊQQMMMMMIMMMIMQMFB=F3,3+9MVgz¤¤««¬¬«¬¬¬«¬°°°¬°¬«¤wbVMIIIIMVrm[gw¢¢mrV3+77=_QQzzF9=97br_MiBMzzbrrBmb99B=9I739=,%%%% +7BIbmgVVMI,,Q_Ib«´´¬M+3QgwV%%[rmmr¤ÅÊÊÊÊÏ´F% +% +FV=FVVigirwwz¢¢¢¢¢¢«¤«¢¢««¤««¤¤«¤¤¢¤¢zwzz¢«´ÂÏÑÝáÝ×¢¢wg_II3+7+3737IBBMFV_,%+%%7V¢«¢Q+ %9733,%%=_r¤¢¢«´¾¾Âž¾¾Â¾ÂÂÂÂÅÅÊÊÊÏÏÏÏÑÑÑÑÑÑÑÏÊÏÊÊÊÊÊÊÊIIQMIMIMMVFQMIFBB=B¹7773=FQgw¢¢¤««¬¬¬¬«¬«¬°¬°°°«¤¢¢rbVQFIMIIVgmi¢wimrV73=Fmz_=bwQB9·7B[ibFgV9MwgwwF[z=99s973+ %+%%%+7,9BmzgVB933MVgz¸´¸´_+3=[wF% 7mmww¾ÂÊÊÊÏÂb+ %% %,IVB79BIQVgiirmzz¢¢¢¢¤««««¤««««¤¤¤¤¢zwzzzz«°¾ÅÑáááÚÊzmg[F9,++,,3,7B=FMBM[,+ 3I¤¤¤Q++93++,,3Fgw¢¢¤°¸¾ÂÂÅž¾Â¾ÂÂÂÂÅÊÊÏÊÏÏÏÏÑÑÑÑÑÑÑÏÏÏÊÊÊÊÊÊÏQMMMIQIIIQIFIIFFFB=9993,,7BQgz¢¢««¤«°«¬¬«¬«°°°°¬««¢¢wb[QFFFIMI_mwmrmzzw[99FMzwriBMi[QgbzB37Vi_IMzI9Vwwbw[[I97+,97379,+% ++%+ó9=_rmM=Fgwzzw°¾¸´g,%3IrM%%Mzmzww¤ÅÅÏÏÏÏ3%%%% +%+I_F7=FIM[bgirrwz¢¢¢¢¢¢¢¢¢«¢¢«¤«¤¤«¢¤¤¢¢zzwwzzzz¢¬¸Â×ÝäáÝÏ«¢wigVF3%%+,9,,9BBBMIF[3% 7Iz¤¤¤[,%,9+%,,+,Qg¢¢¬¸¸ÂÂÅžÂÂÂÂÂÂÂÂÂÅÅÏÏÏÏÏÏÏÏÏÏÑÑÑÑÏÑÊÏÊÏÏÊÊÏÏMMQMMQIIIIIIFFFBF=Bw73++7B[gz¢¤«¬¬¬«¬°¬«¬¬¬°°°¬¬«¤¢rg[MIIQIIMV_mwmbimirzwwbI7B=mirQBib[II_V7=F_b[QriI9bmgiz¢[B_I%+++79y,,%+,+%%37,F=QiiM99MrgmwzgM¸¾¸z9 ,=M7 3irmrw¾ÏÊÏÊÏ¢9% %+%%% %%MgM9BFFIVbgmrrwz¢¢¢«¢¤¢¤¢¢¢¤¢¤zzzzzzzz«´Å×áäáÚѬ¢¢zwibVB,,+,733,=B=MBQQ,% %3Ir¤¤¤_+ 77++3,79Vr¤¢¢¢«°¸¸ÂÂÅÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÅÊÊÏÑÏÑÏÏÏÏÑÑÏÏÑÑÏÏÏÑÏÊÏÏÏÏQQVMVMIFMIFFIFMIBBB7733,,33=Qgw¤¤««¬¬¬«°°°°¬°°°°¬«¤mgVQIIFFMM[[imrwwwzwmrgI377bwmiMMbVVQ_I39V[[VM[wgQ=[zb[rz_9BzQ +%+,%3,9,+,%+ +7,7[IFMV_Q9IirmrVBQ¢¢m7 %37,+ Fzrwr«ÑÏÏÊϸI% +%++% % %QbQ9BIIV_bgirrwzw¢¤¤¤¤¢¢¢zzzzww¢¬°ÂÑÝääÝѸzwb_I9,++++737=I=IIMQ3% 3Im¤«¤m,% ,3%++,9=_r¢¤¬´¸¾ÂÅž¾¾ÂÅÅÅÊÊÏÑÑÑÑÑÏÏÏÏÏÊÏÏÏÏÏÏÏÏÏÏÑÏÏMMQMVMMMIMFIIFIBBFB73333++,FQgw¢¢¢«¤¬°°¬°°°¬°°°°¬¬«¤¢rgVQIIQMQMQ[[__giwzzzVF39Fmgg_Ibi_Vi_97MibQIFwQ__F_z_Mri97wm%%%+,,,,933+3,,+9333g_gMI[IF[z¢rrm[B9=[MBF,+%+93 3 ,%[rwzz¾ÊÏʾÅ, %++ %%%+3Vg[B7IFQV[_grwww¢¢¤¤¤¢¤¢¤¢zzzzzzzzwz¤°¸ÑáääÝѸmbVF,+++,+73BFBIFFFFI77 3F[¢¤r79,,,%%,+IBbz¢¢¢¢«´¸ÂÂÅÅÅž¾ÂÂÂÂÅÂÊÊÏÏÑÏÑÑÑÑÏÊÏÏÏÏÏÏÏÏÏÏÏÏÑÊÏÏÊVVQQQIIMIIMIMIMBB=99733,%3FVgr¢¤«¤¬«¬¬°°¬°¬¬°°´¬¬«¤¢wg_QMIIIQQV[[_giziiwzrVB9=I_VQMVgib_gB7VbbVI=IzFFM=[rVFg¢m;7 %,,,3+++73,933,,+3QgI=FMFQbwbb[B3BV_F93+%3,7, ,MImwrzÊÊÊ«¢9% %%+%%+%%+[i_¿MQ[[gimwrwzz¢¢¢¤¤¤¤¢wrzzzzzz¢«°´ÏÝääáÑÂmgM7++++,,3+,9BBBQBBFB,+ ,F[¢B++,+% %,BMg¢¢¢¬´¾ÂÅÅÅÅÂÂÂÂÂÂÂÂÂÂÂÅÊÊÊÏÏÑÑÏÑÏÏÏÏÏÏÊÏÊÏÏÏÏÏÏÑÏÏÏÏÏQQMMQMMQQIMMQIIMB=773,7+%,=Mbw¤««¬¬°¬¬°¬°´°°´°´°««¤wm[MIFIIMQV__gwzigmrzzwg99IVb[[9Fgrrg[=9Qg_MBB9bm9,3Bgw[=g¢rF7FQ+%%,B,%,+I+%% ++9b7,QMM_z¤wbQI=FmrM9,% 3,+ +Qgiimrr´Ê¤z7 % +% +%++[i[B9FIMV_ggirwrz¢¢¤¤¢¢¢¢¢zwrwzzzz¤¬°¸ÊÝääá×ÅzrrgI3,++,,77,39BBMQBIB7, 39Q«¢_77+% + ,I[w¤¢¢¤´¾¾ÂÅÅÅÂÂÂÂÂÂÂÂÂÂÂÅÅÊÊÏÏÑÑÏÏÏÏÏÏÏÊÊÊÏÏÏÊÏÏÏÏÏÏÏÏÏÏQQMMMMMMMMQIIMFIB99777,,+%3=Qbwz¤¤«¬«¬°¬°¬¬°¬°°´´°¬¤¤wi_MIFBIQV[gzmimimrrrmV7BFVV[V3FizbM=V[MFF=F[33=MrV=bM99m+%%+3,+7IM=+%%%%797V97rrBM«¢rgbgmg[B3%% %3% Mzwzzggii´¬¢[B,% +%+%% ,[m[BBIMQQ__iwrwwzz¢¢¢¢¤¢¢¢wrmrzz¬°¸ÏÝääáÑÂwri_=3,,%+373+,B=FIIFFF37 % 33F«_+9+ ,++Qiw¢¬¸ÂÂÅÅÅÅÂÂÂÂÂÂÂÂÅÅÅÅÊÊÊÏÏÏÏÏÑÏÏÏÏÏÊÏÏÏÏÏÏÏÏÏÑÏÏÏÏÏÏVVVQVQMMQIQIFFBBB99,,,%,=Mbw¤¤¤«¬«°¬¬¬°°°°°´´°¬¬¬zi[QFFFIV_wzmigimmzrwrgIFMMI[b[=_rzzMFM[QBMI99gzI,+7[wb9QQ37g=+,+,79IF97++, %FM=[[i[FV_i¢_I9F3,+% %,, %Iwimgw¢¬m3%%% %,%,F%,Vr_MFBBM[Vbiwrwzz¢¢¢rimw¬´¸ÊÚäéáÑÂzwrgI3,++,3,73,9BBFMIBIB37% 3,=¬¢_397% +,Vr¢¢¤°¸ÂÂÅÅÅžÂÂÂÂÂÂÅÊÊÊÏÏÏÑÏÏÏÏÏÏÏÊÊÊÊÊÊÏÏÏÏÑÑÑÏÏÏÏÏVVVVQQQQMMMMIIFBB=977,,++,BMgz¢¤¤«¬«¬¬¬°°°¬°´°°°°¬«¢zgVMIBIQbriibimiirwwmiMFI=[_FQwrmBQ__IBQI,7w_M3%7Qmb=IV33QF+3,9FM77,+%79 79BQi¢i{M[grg=3+,+% % %,% +w«¢¤¤ww¢«¾°g3% %%%3%%%%%+_rb[FFII[[immrzzwz¢¢¢¢¢wgmwzw«´¾Å×ÝáÝѾzzzr[=,%++%%,,339=BIIII9,7+ 3+7w¬¢mB33 +%,[w¢¢¢¢¢¤°¾ÂÂÅÅÅÅžÂÂÅÊÊÏÏÏÏÏÏÑÏÊÏÊÊÏÊÏÏÏÏÑÏÏÏÑÏÏÑÏÏÏÊQQVVVMMMQIIIIIFIIF=B=9+3+%3FViw¤¤«°¬¬°¬°¬°¬°´°´°°¬««¢ri[QMVbmrgbiiiirwwwrr_FMFF9[[VmwwwVI[MBûQ,FQI,,3MrbI=gb379g,3=IFB3,%,9I= %++39FBmQM9++79I_rmQ3,% %+%9¢¢¢¤¢¤«¢«¾¸«_=% %7+,%+++3[ig[FB=Q[_irrrwwz¤¢wirwzzwz¤´¾ÅÏ×ÚÚÑ´rgM9,%+,,%733,7BBFF=IM=,7,%+733r¤¤¢mQ3+% %3V¢¢¤¬¸¾ÂÅÅÅÂÅÂÅžÂÂÂÅÅÅÊÏÏÏÏÏÏÏÏÏÏÏÏÏÊÏÊÊÊÏÏÏÏÑÏÑÏÑÏÏÏÏ[[VQQMMVMIIQIIFBFBBB=,+++9M[iw¢¤¤¬«¬«¬¬¬«¬°°°´´´¬¬°¤wrb[[izmg__bbggirwwzwgVFM=B[__mgwmVVMFB739M=giM=3,,9igIBQ¢i7,=B,+9=7+,+39MB+ %+7I97,3++%+3=irrF+% %% ,+b«««¤¬«¬¤°´´¸¾¬wM7% %%%,+33,%%3[i[VV[_bmrrw¢¢riwzwwwz¬¸ÅÊÏÑÑʤwm[B3+%++++79337=IQ=FM9+3,+%3%+g¤¤¤zrM3,+%%%=_¢¢«°¸ÂÂÅžÂÂÂÂÂÊÊÊÊÊÏÏÏÏÏÏÏÊÏÊÏÏÏÏÏÊÏÏÏÏÑÑÑÑÑÑÏÏÑÏ[[QMQMM[QIQQFIMIBFB9=93,+9IVgz¤««¬«¬«¬¬«¬¬¬°°°°°¬«¤mbgg_gg_[[[__bgbgimzwzb[VI37I_bgbgziiVIBI, 3Qm[Q=B,+7bmQIVw¬B77¤_,+,3+,3,39_F%%++9IB=9++%+3BIrbMF3%%+%%%,+ %¬¤¤«´´«°¬°¸´´´zI,+% 3++%++%3_mb_FMMQ__gmrmzzzz¢rirwmrzzzz¤°ÂÊÏÏϸwwiF3+++,,,,3333799IF9=I=+,7+ 3++V¢««¢wV+ , +Bb¢¢¬´¸¾ÂÅÅÅÂÂÂÂÂÂÂÂÅÅÊÅÏÊÊÊÏÏÊÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÑÑÑÑÏÏÏÏÏÏVV[QQMVIQMMIMQMFB»997733=M_iw¢¤¤¤««¬««¬¬°°°´°´°°«¤¢zmii[QIMQVQ[[__gbgimww[_QIF=MVg__mwgQMB= 7[m_Q=Q7,3Vm_VVr´[=7m¢r9+3,,3M993_M% %%3,9=I=3+,3VrB%%%%+%+++%7¢°¬¬¬¾°°¸¾¸°¬¤¢[=7% %+,,,%%+%,_m[_IQMV_bgiwrzwzzzzwwwV979FVgrrwwzz¢°¾ÂÅʾ¤zr_93%+%,3,,7973»MI7=M93,7,%++%V«¤¢z_3%3+,,Vm¢¢¤¬´¾ÂÂÅÅÅÂÅÂÂÅÂÂÅÅÊÅÏÏÏÏÏÏÏÊÏÊÏÊÏÏÏÑÏÏÏÏÑÑÑÑÑÏÑÑÏÑÏÏÏÏMMQMQMMQQIQIIMIFBBB9BB9937BQbm¤¤«««¬°¬¬°¬°°°´°°°°¬¤ribQFMIMQV[[_biigiimrri[MMVIBVg[QgzbVQM7%%7g¤_[9B_=+9Qzm_b[i««i7,Q9+,337FMB=M=% + +,9MB,7g°«7 % %++,+,%% V¬°¬´¸Å´´¾¾¾¸¬¢r,++ %%%%%+9,+,++,Vib_IIQ___birrwzwzzz¢¢¢¢wzgB3,3=I[_[brwzzz«¸¾ÊŬzwiI3++,3,,+,97739BFQF7BM=,333,+%%I««¢w_7%,7%9bz¢¢¤°¸¾¾ÅÂÅÅÂÂÂÅÂÂÅÅÅÊÏÊÊÏÏÊÏÊÏÊÊÏÏÏÏÑÑÑÏÏÑÏÑÑÑÑÏÑÑÑÑÏÏÏÏQQQMVMQFIQMQMQIFFBB=B7=BVgw¢¢¤««¬«¬¬¬°¬¬°°°´´¬««¤rg[IIIMMV_[[_bggigrmrmiM=Q[Q9[_VQmw_MM=% ,9rQ=3MmB,IIwm[b[r¬zB7I=%+7%9Bg[3F=,% % %,3F_MBb°¤w=+,++++33+ ,¢¤«°´Å´¾¾Â¾¾¬g7 %++%%%++337,+%%,[mriFMV[bggimrrzzz¢¢zrziVF9FQb_[VV[_rwwz¢°¾Å¾«¢¤¢wb9,3,3,,,,,93,39BFI=BIQ733337+%%=z¬¬b7 +;bz«´¾¾ÂÅÅÅÅÂÅÅÂÅÅÅÅÊÊÏÏÊÏÏÏÏÏÏÏÏÏÏÏÏÏÑÑÑÑÏÑÑÑÑÑÑÑÑÑÏÏÏÏÏMMVIMIMMIQIMQMIIFBB=FF==M[gw¤¤«¬¬¬¬°¬¬°«°°°°°°¬«¤¢mbQIIBMQQQ[[b_bbgimmmmiVIbbM=___Vmzg[MF+ %,giB3=gmF,MBmw_V[z¬Q,BM ,%+BF?=F=% %%% ++FVMwzV7+,33377%% Q¢¢¬Â¸¾ÂÅž¢= % %%+%%%++,,,,,+%+_irgMMQ_gbimmmwrwwwzzwzzrig_giwrmi_bVbmwwz«¾¾°«¤¢mV,,3+,33+,,9337ÿQ97FQ=,,,79 % 9w«¬_=+%7FIm¢¢«¸¾ÂÅÂÂÅÅÂÂÅÂÅÅÅÅÊÊÏÑÏÏÏÏÑÊÏÏÏÏÏÑÏÏÑÑÑÑÑÑÑÑÑÑÑÑÑÏÏÊÏÏÑMMVQQMMMMMMMMMIFBFIFFF»FQ_iz¤¤«¤¤¬¬¬«¬¬¬¬°°´°°°°«¤¢zm[VMIMQVQ__[bgggmimmrwmMIggIB__QQMMm[IQF% 7VrmB7FimQ33IwzgbVzzw¤g=F_+ ,337Vgw_3,++% +3[gQ7++3=73, ,,+9Fi¢¬¬°´¾¾¸¬+%%%%+,++7,,,,3+3+33_mmgMMMbggiwwrwwzz¢¢zwwzwmmgbmzwz°¾´°«¤¢rbB3,3377++,+B3399FIV99BIF,,,7B++ 3g¤«iF3 +MVw¢¢¬´¾ÂÂÅÂÂÅÅÅÅÂÅÅÅÅÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÑÑÑ×ÑÑÑÑ×ÑÑÑÑÑÏÏÏÏÏÏMMVMMMMMMIMMIFFIIFBFFBBFBFQbm¢¤¤«¬¬«¬««°°°°´°°´°¬«¢zi_VIFFQQV[__gbbgimmwwzrQ[_VB=b[QMBQbM9=3,%FwbVM9VbgM93=wmbQrwr«zFMm¤i %+3+,mzB3,+% +VzV3+%3B3,M=9VQM_bmrz«¤¬_7%% %,99,3,+++3%,,+3bwriQIQ_giiwmrwwzz¢¢zzzwwwwmww¬¾¾°¬¤¤wm[3,3,,93,++3wB9IMVB=IMB3++79+% ,_¤¬z[Q+%,Mbz¢¢«°´ÂÂÅÂÅÂÅÅÂÅÂÅÊÊÊÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÑÑÑÑÑÑÑÑÑÑÑÑÑÑÏÏÏÏÏÑÏMMQMIIQMMIIBIIMFFBBBBIBMIIVgm¢¤¤¤««¤««¬¬¬¬¬°°´´´¬«¤zmgVMIIQMQ_V[bbbggmzrrgVbV99=V_VV=MVF3+ +IrwiMF_F[VQIB7FwiIFgzr«[[z3 %+77%,r¤MM7%% 3mzmM,,% I[FIgg_gm_mmmzz´´´b3% %%+9QIIFF++,,%393+Vrzi[QQ_biimwwrwz¢zzzzwwwz«°¸¾¸´¬«¢wi=,,,3,77,,7,999M_MB9MQF3,,93%%%+M¤¬g[9%%Mm¢«´¾¾ÂÅÂÅÅÂÅÂÅÅÅÊÊÊÏÑÑÑÏÏÏÏÏÏÏÏÏÏÏÏÏÑÑ×ÑÑÑÑÏÑÑÏ×ÑÏÏÏÏÑÑÑMMVQQMQMMIIMMMMFBBÿIFIMQ[gw¢¢¤«¤«««¤«««¬°°´´´´¬«¤¢zi_VIFFQQV[[_b_bbiwzzwwg[Q,77=VbVVBIFB3% 7gzgF=[VVFMFV=ib[Vbrb¢mbM +97+,r´wr,%Vz_F_M% +Ibbbgwmrwbirimmr¸ÏÏ++%+ ++39BM[333+%3 ++,7bwgbMQ[imrmmwwwzzz¢¢wz¬´¾¾Â¾¾¸°«¤¢zwV7,,,+33+3,,3937=I[bI=IF=7,,=,+, ,I¢°¢zbb7++Qz¢¢¬´¾ÂÅÂÅÂÂÂÅÅÂÅÊÊÏÏÊÏÑÑÏÏÏÏÏÏÏÏÏÏÏÏÏÑÑÑÑÑÑÑÑÑÏÏÏÏÏÏÏÊÏÑÑIIMMQMQIIFQMQIIMFB=FIMMIVQ[izz¤¢¢¤«¤««««««¬°°°°´´°¬«¤wr_QMIIMQV[_[bb_giwwrrwmbB++%3MbV[FM9=,%7[z_I33û_BFMiBImmbVVwiV¤zbb3 ,=,+,i¤«79zb77QF,3F[_imiw¬¬rgwgbmr¢Ñ×¾Q%%+% %+,379=7,3,,,%%+%,gwz_bIV[girwrrwrzz¢«¸Åž¸¬«¤¢zm=7,3,,73+,+37y=9Q[IMIQBF973B+3+ %=«¤wVb=,3V¢¢¬¸¾ÂÅÅÂÅÅÂÅÅÅÅÊÊÏÏÏÑÑÑÏÏÏÏÏÏÏÏÏÏÑÏÏÑÑÑÑÑÑÑÑÚÏÏÑÑÏÏÑÏÑÑÑQQQQMIFMIFMQQMIIBFFIBFFMVV_iz¤¢««¤««¤««¬¬¬°°°°´°°¬¤zm_VQMFQQVV[[b__gimrrrzwI+,%+MVQMFF=9,,[b=9,3=FQV=_zM_rg[bzzgIggw3%%%39+,V7+ +[b7%99IQQgbbgmr¤´°_bi_gwÂÑÊz,+++,,,+333+FB777333++,3gwzVgMV[_mmrrzwzzzzzz¢¢¤¢¬ÂÅÅ´°««¢wV3333,+,733+3399_[FBFQBB93=M,,3++=w««wVgF,=b«°¾¾ÂÅÂÂÂÅÂÅÅÅÊÊÏÊÏÏÑÑÏÏÏÏÏÏÏÏÏÊÏÏÑÑÑÑÑÑÑÑÏÑÑÑÑÑÏÑÑÑÏÑÑ×IIMQIIIFQQQMQMMIFIFFBFIQV_bmz¢¤¤«¤¤«¬«¬¬«¬¬°°°´°°«¤¢zm_[IIQIVV[bV__bbggirw[+%%3M[V¿B=+MmM3,+3=QMV=QwVmgiimziQIVr[3,+3=,7MrzrgF9%+,FV=,7MIbigmmimw°°¸[bm_iwz¬ÏÑ¢93,,7977399=39373,337_w_iQQ_bmmrwwzzzzzzzw¢¢¤°´¤¢¬¾ÅŸ°¬¤wF733,3+,,+337+7=7B_bB=M[M97,=M+,,% 7r¤«mVbI9Ig«´¸¾ÂÂÂÅÂÂÂÅÂÅÊÊÊÏÏÏÑÏÏÏÏÏÏÏÏÊÏÏÏÑÑÑÑÑÑÑÑÑÑÑÑÑÏÏÑÑÑÑÑÑÑ×QQQVQQMQQMQQQMMIFFIBBBFMQ_biz¢¢¤««¤«¤«¬¬¬°°°°°°°´¬¬¤rbVMIMMQQV[[__bgigrzQ9+,3IVQF=MFIFzmVB97+,=FMIM=Q[[irbirmmVBMimmF,+,B77IizbI,9%3BF7 +7Vzwmz¬¾°g[mibw¤ÂѸM,,,,333,3,333B777733,,+33_rw_iVVbbirmwwzzz¢¢¤°¸Â°¢¢°¸Êʾ´°«¢wb933373,3,++,37BI97=b_I9F[F7B7BB,7++ 3i¢´mM_Q=[i¢¤«°¸¾ÂÅÂÂÂÅÅÅÅÅÅÏÏÏÑÏÑÏÑÑÏÏÏÏÊÏÏÏÏÑÑÏÏÑÑÑÑÑÑÑÑÑÑÑÏÑÑÑÑ×Ñ×QQMMIFFIQQQIMBIIFFB9¿MVbbmz¢¢¢¤¤«««¤«¬¬°°´°´´´°¬¬¤¢mbVQIMMVV_b_bbbiimwrVB379Ib[MFQMbm[,77BIIVMFFM_gri[rmwiII¢i_VI=BMIFiimrB7B=IM9++%37Q«¬°´¾Qbb[bwÂÊÂr97773B=773993=977+,3%+,3[mm_mVV_gimrwwzzzz¢¢«¸ÂŸ«¢¤´¾ÊŸ°¤¢wB333373,737,373FI__IBF[B=7F=7=++ 3[´Q[[Bgw¢¬´¾ÂÂÅÂÂÂÅÅÅÅÊÊÊÏÑÑÑÑÏÏÏÏÏÊÏÏÏÏÏÏÏÏÏÏÑÑÑÑÑÑÑÑÑÑÑÑÑÑ×ÑÑÑÑMMQMFFIMMIMQIIIIFFB999FIVbgr¤¢¤¤¤«««««¬¬¬°°´´´°¬«¢zigQMIFFQ[Q[__bbggrrbV9,99B_I9F[rwbB9B,,333BBBIûQ__QFgmmwrMFrzVzgQ=FM_MFV_QgIIB9BF+ ,3Iw¤««´´¬[MiVQ[i°ÊÅ9%%+++337799=BBIBBB999,999[rwgmb_biimrzz¢¬¾ÊŬ¤¬°¾ÅÅÅÂÅŰ«¢z_7,,3,3,33,,3,79QF97Q_VB9FIF99·39+,,,M¬[[bMrz¢¢°´¾ÂÂÂÂÂÂÅÅÅÊÊÏÏÏÑÑÑÑÏÏÊÏÏÏÊÏÏÊÏÏÑÑÑÑÑÑÑÑÑ×ÑÑÑÑ×ÑÑÑ×ÑÑÑÑIIIIFFFIIIFIMIIIFB=9=BIVVbr¢¢¢«¤¤««¬¬««¬°°´°´´°¬««¢mb[MMMMQVV[[_b_birigVB39=MV»wrb379,,3,,7IFBIMF=Q_QIBVw[mrVQM[mwwQBBV__V_b__M=3,=B+%%3Iz¤«¤¬¤¬¾¬Q[i[[bgÂÅ7+3%+3%33,33,,,73B,3,+++%ImrmggQbimrrmwzzzz¤´ÅÊÊ´««°¾ÊÅÅÂÅŬ¤¢wB7,7333++,+,3,37IF99Q[QF=IMB=7·,3%% 3Bw¬¢VVmViz¢¤¬¸ÂÂÂÅÂÂÂÂÅÊÊÊÏÏÏÑÑÑÏÏÏÏÏÏÏÏÊÏÏÏÑÑÑÏÏÑÑÑÑÑÑÑÑÑ×ÑÑÑ××ÑÑ×ÑFFMIIFIMIFFMMFII=B=9¿MQ_iw¢¤¢«««««¤¬««¬°°´´°°¬¬«¤wr_VMIIQMMQV[_b[grwmgMFQB9MQI_[F;F3,33II9[IBBIQFQB_gg[VVFgm_zwb=VimbVMIQI+%%7F3%,=Q´«¤¤¬´´¾¸«_[b[[__wÊ«=+ %+33,+,373,3999IB¹33,3,,IzimbiQ__irrrwzzzz¢«¸ÊÏÏŸ°«°ÂÏÊÊÅŸ«¤¢wg7,+3,33,33,+,,3û79V[VF9IMI7»3,++%,=w«¤[Qrgw¢«°¸ÂÂÂÅÅÅÅÅÊÅÏÊÏÑÑÑÑÑÑÏÏÏÏÏÏÏÏÏÏÏÏÑÑÏÏÏÑÑÑÑ×××ÑÑÑÑ×ÑÑÑÑ××MMMBFFMFFFFIMIIFBB=9=FI[_gr¢¢¤«¤«¤««¤«¬¬¬°°¸´´°¬¬¤zmg[IFFIIQ_V__bgrriwziM39B=QIVwg,,37FB339377MF7IQ=I[MFI[bwmMFQQ[iwg97IrmMF9=F%%{IVr¢«°´Å¾¸Vi_[[[m¾°_+% +,33,,%+33+,,33IB973,73%%,MwbiimV_bimmrwzww¢¢«¾ÏÏÏž°¬°ÅÏÏÅŸ°¤¢wF,333,7,3373,,79BBF9=VMVF=B[F7FB9,3, % ,9r¤¢bIimw¤°¾ÂÂÂÂÅÂÅÅÊÏÏÑÑÏÑÑÑÑÑÏÏÏÏÏÏÏÑÑÏÏÑÑÏÏÏÑÑÑÑÑÑÑ×ÏÑÑÑÑÑÑÑÑÑ×IFMIFIIIIFBIIIB=BF»FIQ[gr¢¤¢¤¤««¤¤««¬°°¬´´´´´¬¬¤¢zmb[IBMIMQVQ[[_irirzw_{B9QVgzI%++,[g39F9,9IF7F_B=BMVBMVMm7=I_grwwI3IbB9,,3=,+%7F[[gz¤¬°Â¾¢[_m_V_g«Âm3+ ++++³3,33+,7=,MF=3,7,%%+Figi[w[[bgmrrrwwz¢¤¤°ÂÑÏÏÊ´«¬¾ÏÏÊž¸¬«¢i7,,,,,,33,3,,+37BFB9IQ[QIB=QB9BB9733++ ,=r¢¢wgMmzw«´¸ÂÅÂÅÂÂÂÊÊÊÏÏÑÑÑÏÏÑÑÑÏÏÏÏÑÏÏÑÏÏÑÑÏÏÏÑÏÑÑ×ÑÑÑÑÑÑÑ×ÑÑÑÑÑÑIIFIIIFBFFB¿BBB=F»FMM[br¢¢¤«««««¬«¬¬¬¬°´°´°°«¤¢zr_QMFIMMV_QVVgzrmgwwg»=F_mizr=%,379_9QF=9=IB97_QB=FMFFBQzm93MVrmzzg7iQ37,%+=I37BVgmgir¢¤¬¸Â¾°g[[V[[_rÂ9+%+,97,7F93,373+3=7IB=B,,7,+++Bbbgbz[Q_iwmmwww¢«¬Å×ÑÏÏۤ¬´ÅÊÏž¸¬¤M,,9,3,+7,,73,,39FB77QQ[IFBFMB3B,7%+%%Fm¢«rgMw¢«´¾ÅÂÅÅÂÅÅÅÊÏÏÊÑÑÑÑÏÏÑÏÏÏÏÏÑÑÑÏÏÏÑÏÏÏÏÏÏÑÑ××××ÑÑÑÑÑÑÑÑÑ××IIFIFFFI=IBFFFIFIBB=IMMIV_rwz¢¤¤¤«««««¬¬°°¬¬°°°´°¬¤¢zmbVIIFQMQMQ__wrmmizw_7=B=Vmmrzg7+,9979QQIBF=QsV_II9IMF=MgwQ7IBMzzziwizV¤9 39% +B[_bg_i_gw¤´ÂŸwVgb[[[mÂ=+,+%+7733777+39,3,IMB77,,,+%Bibg_zbI_bimwwrzz¢¤«¬ÂÏÑÏʬ«°¸ÊÏÊϸ¾°¤m=3,,+3,,33,,+7777=B=FIMQQMFII7,F973++%+=m¬wgIr¢¬´¾ÂÅÂÅÅÅÅÊÏÊÑÏÑÑÑÏÑÑÏÏÏÑÏÏÑÑÑÏÏÏÑÏÏÑÏÑÑÑÑ×ÑÑÑÑÑÑÑ×××Ñ×ÑÑMMIBFIBIFBFFFBBFB9=BBMMQV_mw¤¤¤««¤¤«¬«¬¬°°°°´´´´¬¤¢zrbQFFFMQVV[_mgggmwV7=FQgg_mzzV9+7973=VM=FIFFF=BbMMFBIFBF_igB937Mrwimz, +=+ %Qrrii___m¢¬¾Å¾QbbVV[g¸´B++%%%,BQ73939,3977,97BIQ,,%+%=igg[rgQ[bgirmwzzz«¬ÂÏÊÑϾ°°¸ÊÑÑÑÏʾ°¢M7+,,,,+99333+,3B7=9BIQMMFBIF79B999+3+%%%7m¬rwBr¢¢¢¬¸¾ÂÅÅÅÅÅÊÏÏÏÑÑÑÑÑÏÏÏÑÏÏÏÑÑÑÑÏÏÏÏÏÏÏÏÑ×ÑÑ××ÑÑ×Ñ×ÑÑÑÑÑ×ÑÑÑBBFBFB=IBFFFBFFB=BÿFIM__iz¢¤¤¤««««°¬¬°°°°¸´°°°¬¤¤mbQFFFMIQQVimiggmzwV7IV[IFMwibF,77937FFMF=BMMFQ[MB9ÿFV__b9,3=Qwwr9%+3Iirmir¤¤«´Â¤V[rVVbgw¤¾r+%+ %+7MMB33,,++737377FIFFB3,3%++7gg_[m_MQ[bgwmwzzzzz¢¢°´¾ÊÏ×ÑÊÂÂÅÏ×ʾ¾¾´«z9++,+,3,9F733+,377=FMIQIVBBMI»ù,3,%%%,iz¬wIr¤¬´¾ÂÅÅÅÅÊÊÏÏÑÑÑÑÑÑÑÏÑÏÑÏÑÑÑÑÏÏÏÏÏÏÏÏÏÑ××Ñ×ÑÑÑ××ÑÑÑ×ÑÑ××Ñ×IIB99=F=BÿIIBBBBÿBFMV_iz¢¤¤¤¤¬«¬¬¬¬°°°°´´´´¬¬«¤riQIFFIMQQ_i_bggmwiQ9I[F39QgVB+7sIQB9=QF9BQbMI_IMB9FIMQQQr_=,39[mz[%% 3Vm¤¢¤´¸´Â°i[mg[biw¾9%3+,%+=VbF7933++=,3+37BBQQF33+++%9b[b_mb[[[ggwmrwwz¢¢¢¤«¤¬°¸¾¾ÊÑÏʾ¸¬¬¬¬¸´´¤z[=,+,+,,77I33,,3973ÿFIQMQFBIMBIF9F=,,%%%%+_z¬wM¤°¸¾ÂÅÅÊÊÊÊÊÑÏÑ×ÑÏÑÑÑÏÏÏÏÑÑÑÑÑÏÑÏÑÏÑÏÑÑÑÑÑ×Ñ×ÑÑ×ÑÑ×ÑÑ×ÑÑÑ×FFB9=B=BFIIIBBB=B=B=BIFQV_iw¢¢«««¬«¬¬«¬°°¬´´°´´°°¬«¢zmgQFFIFMMVrm__ggirzwiI9FF7%3iwg[937B3=MFB_I=VQigI_[VQFIIQMFI[rQ993I_wwrwi3+++%Bbw¢´¾°¬«¾Å¾ÂÅ´wM_rV_mw´´F,,,+%%+B_iI3,33%+93773ûVMM,++,++9[iVVggQM[_bmrrzwz¢¢¢¬¸Â°«¤¢¤«¬zz=3,+,,+3779,,3,,937FF=FIVQ[FBFVQBB9IF3,%%%%+V¤¢w[z¤°¸¸ÂÅÅÅÊÊÏÏÑÑÑÑÑÏÑÑÑÏÑÑÑÑÑÑÑÑÑÑÏÏÑÑÑÑÑÑÑÑÚ××××ÑÑ×Ñ××Ñ×ÑÑ×FF=9=FûIBBBBBBBFBMQV_i¢¢¢«««««¬¤°¬¬°°´´´°´°°«¢zmbQIIIIMVgwb___gbriQB=9+%9rwmF99B3=FB977MF=BbwVQbbVVMQMMFBFmwQB99BVVVm_+%Qrbbm¤¬ÅÊž¾ÏʾŰV_i[Q_r«Åw+++,%%++=_rQ7++3++97377=FFFB3,7,%+9VgQ[ib[FV_bimrzz¢wz[,,3+33,39373333793=BIF9=VI[IFFQMBB9FF7,%%%%,B¤¢rwb¢¬¾¾ÂÅÅÊÊÊÏÏÑÑÑÑÑÏÑÑÏÏÏÑÑÑÑÑÑÑÑÑÏÏÑÑÑÑ×ÑÑ×ÑÑÑ××Ñ×ÑÑÑ×Ñ×ÑÑ×FF=999BBûûFFB99=BMMIQ[m¤¤¤¤«¬¬¬¬¬¬¬¬¬°´¸¸´°°¬«¢zm_MMFFIM[wi_[[_birmF7,++,[i_i933B79»7937BFB=__Qbig_VV[IMBB[wmI339I_[gV3+9ri_m¢°ÂÊÏÏÊÑʸQ[ig[[bzÅ,%%%%+,+7IbI,+,7+%79777BIQFIM7,,,+,=bmMVg_QIQ[_irrrzzzrggww9,,3+,3+333,7,7739,9FIB=FVFVMIM[BByF3,%%,,3=z¢rmg«°¸¾ÂÅÅÏÏÏÏÑÑÑÑÑÑÑÑÏÏÑÑÏÑÑÏÑÑÑÑÑÑÑÑ×ÑÑ×ÑÑ××××Ñ××Ñ×××××Ñ×Ñ×=B9979=9=FFBFBB9IIMV_iz¢¤¤¤««¬¬¬«°°°°°´´¸´¬´°««¢zm_VIFBMQim[[[_girgB77,+3_Q3iiM77F»BB399379»wQ[mbgbVMFIFBBVzmQ=9Mm_grrbi[bww¾¾ÊÑÏÊÑʾ[_im[[gw¸´B+ % +,+,+,BVI,3+,,%33,99F9M=FM9+++,,,_wM[_bQFQ_bgmmrrwzriiiwzzzwwzwrzrgirzzrb_bgw[37,,+3,,97,3,7,,9737QQ99B[BVBMQ[³3FFB,% +++=m¢zirz«°¸ÂÅÅÊÏÏÏÏÑÑ×ÑÑÑÑÑÑÑÑÑÏÏÑÏÑÑÑÑÏÑÑÑÑÑ×××Ñ××Ñ×××Ñ×××Ñ×Ñ×××Ñ7777997=BBBB===FIIMV[gw¢¤«¬«¬¬¬°¬°°°°´´°´´°´«¤¢zmbMBBFViwgVV__gr_B7+,3F[7+BVIB9BMMB97337=IigbgibibMQQFB=F_zmVFbmVQ[wz_VVr¬«ww¤¾¾Å×ÏÏÊ«gViwg[bi°Å,+,,,,33,%%=QM3%+33,,339÷FBIQF++,+,3VzFQViMMI[_bimwwwzzzr_FFM[gmmrzzzwzwwzwmrmrrmiiimmmmrzrVMBV_bimgbmrF+,,,+,,777+3,3,3939=II3=FV=M=IQQBF339FB3, %%+7g¢mz«´¾¾ÅÊÊÏÏÑÑ×ÑÑÑÑÑÑÑÑÑÑÑÑÑÏÏÏÏÑÏÑÑÑÑÑÑÑÑ×Ñ×ÑÑ×××ÑÑÑ×Ñ××Ñ×Ú×99979B==9=BIBBB9FFMIQ[bm¢¢«¬°°¬«°¬°°´°°´´°°´¬¬«¢zmbQIFImi[VVV_r¢z_F=,99bV7+7FB=9·FMQ=3=7Mmzgmm_gig[MMM=MVzwbzzM9Fbr_I9_r«´Â¸ÅÏÑϾ´zI_mib[b¤Ê¬= %333393%%,7IM=,%+7++3,97B3BBMMI,+%%,7Vr=IVmVMFQ[girwwwwr[VQVIIIMV__iiiiiirmrgb___[[QMV[[bgmwwzzrb_[V[bgmwrmr_7+7,,%3,7=3,733,7979FIM7IMQ=MFQVQF=+,=VF=3 +,+7bw¢¢¢¬´¾ÂÅÊÏÊÑÑÑÑÑ×Ñ×ÑÑÑÑÑÑÑÏÏÏÏÏÑÑÑÑÑÑÑ×ÑÑ×ÑÑÑÑ××××××Ñ××××××Ñ×997w7=BBFBB=»=IMMQbbrz¢¢««¬¬¬°°´°°´´°´°´°°¬¬¤¢wm_VIB[i[MVQ_gw[977B[VB, +,,7=MM3BIV37I7997Fwmig[gmrgV_VB9BM_zFF=_IBB=Qmzzwwz¬¾ÅÅÑÑ×Ï¢VVim[bbwŸ_%%%,,,33,,+,3=IF3%++3+7779{=MQM,%%++3Qm=QQbVIFQ_gmiwwwzzzrigmgb[[QQVVQV_[_gbmmigggbbbV[[b_gmmrwrwzrimmgbiwww=++,3+3,3373+++,7933BIB9QVBMFMQM=9++9VMB3%,,+7[¢¢¢¤z°´¸ÂÅÊÏÏÑÑ×ÑÑÑÑÑÑÑÑÑÑÑÑÑÑÏÏÑÑÑÑÑÑÑÑÑÑÑÑÑÑ×ÑÑ×××Ú×ÑÑ××ÑÑ×Ñ×9977797=F»==B=FQQQ[grz¢¤«¬°¬¬°°´°°°°°´´´´´¬¬¤wr_QIVzw[VMQ[[rwVB,9QM=B,3%+9=IM[7BMF77V=97Bwrmbg[_gbgmibVMQM[gzwMF,9F[w¾ÑÚÚÑÑÊ´M_iVV_w´Å3,3++73,3,+++,9IB7,77,,7779w=IQQ9++,%3VgBQQb[QMQ_[girzzzzzwzwzwmib___bbimirrrrmrrmimiiiimmimrzwwQ3+,3++,,339,+,++,737FIB97=VMIQ=IQQF9+37MM=3 %3+3Qz¢¤¬¸¾ÅÊÊÏÑÑÑ×××ÑÑÑÑÑÑÑÑÑÑÑÑÏÑÑÑ××ÑÑÑ×ÑÑÑÑ××Ñ×××Ñ××××××Ñ×××Ñ×33997=¿FB=B=BBI[[V[grz¤¤««¬¬°¬´°°°°°´´°¸´´««¢¢wm[V[wrbVMQQ[gzmQ93=V99s%+B99FVF37[V==mbbbbb_[iwmib[V_iwVIFBQ7IQmz¬Úáá×Ͼi_i_Qbw¸Å=,+,+33,33,3++37B=9,+,+3y79=9¿M=++3,3Qm9QVVVIMM[_bgrrwwwzzzzzzrrmimmrwrwzzw93+,,3,33797,,,333FI977B[IMIIIQVF937=[b=,++,+3Qz¢w¢z¤°¾¾ÅÏÏÏÑÑÑÑÑÑÑÑÑÑ×ÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑ×Ñ×Ñ×××××Ñ×ÑÑ××Ñ××Ñ777979999B99B=B=BI[[_Viwz¢¢¤««¬°¬°°¬°°°°´¸´°´°¬«¢wi_bz[QMMV[_rzzzg_F7IF9BF7+,99,79,7=VF79Ig9939¤iIMb_b_bVgbimgb_gQ[Qig=bIggÑáÝѤzVim[_rÅ´V%+,3933733,,%+97B9=,+,33=9=7³9FIQB+,%,3MiBIQ[VIMQVbbgrrwwzzzzzzzzzwzzz««°¬°´¬¢M3++,3,,3+99,,3,3,39=MB399FbIFIQIQVMF,39Mb33,+,Mi¤z¢zz¤°¸ÂÅÊÏÑ×Ñ×ÑÑ×Ñ×ÑÑÑÑÑÑÑÑÑÑÑÑ×ÑÏ×ÑÑÑÑÑ×ÑÑ××××××ÑÑ×Ñ××ÑÑÑÑ×ÑÑ997=9=3=9=B==99IIMVQ__gr¤¤¤«°¬°¬¬´°°°¸¸´´¸´°¬«¤wmi¤gMIMMQVmzwwwb_Iû7IQ=,79, 7,,3=bI73FbB73=¬mM9VVbgigibb_V[bV=9=gwV9g_zzwz°ÝÚÏ«__mggr¬´¾93+33777773,3%%3B7973+,33=B=9B799FMF,3337V_BBIQQQQQMbbgrrrwrwzzzzzzzzwzz¢««°¬°´«°ÅÂÅÊÂÅ´¤b9,,+3,3+73337,,,+,39B7979I[IBMFIVM¹79Q_F7%%,,3Qi¤¢«°¾ÅÊÊÏ×ÑÑÑ××ÑÑÑÑÑÑ×ÑÑ×ÑÑÑÑÑÑÑ×Ñ×××××Ñ×××Ñ×××Ñ×Ñ×ÑÑÑÑ××ÑÑÑÑ979799=¿=FFBMVQ__bmw¢¢¤«¬¬°°°°°´´´´´¸´´´¬¬¤¢zz¢_MIIQQV_mrmwrbbQFF=QbI9B3+%3++,FbI9_,7=´gI99I_mmimi[QMVbV999QrrQrmzzzrz¤ÚѸi_igmz¸¸¾B7+73,7737,,+%+%,39779++,33=33B999BI=3+,39M_I=VVMQIIM[bbirrwwrwwwzwzzzzzwz«´¸¾¬¾Â°¸ÊÅÅÏÊŰ¢zB,+,++,373337+++++739377,37BIgIBIMMQI97,7FF[I7%%3+3Mb¤¢z¤´¾ÅÊÏÑÑÑ××Ñ×ÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑ×ÑÑÑÑ×Ñ××ÑÑ×Ñ××ÑÑ××ÑÑ×ÑÑÑÑÑ×ÑÏ7397977B9»B9B·9=IMQV_[brz¢¢¤¬¬¬°°°´¬°´°´´´´°´¬¤¤¢zbIIFMQQVbwggwigg»3BmB=9,%%3+%3MgQy_g7+F´mI=7IQ[mmwwi[V[_I9=7M_mbmrw«ÏÊm[iri¬¾¾«V,,7979773737++3,,,7=,=7++,3797·¿MI9,,39FVF9VMQMBBFQV_gmmmwmrwwzzzzzwwzz¢¤°¬´°¢¤¬¸°¸¸´¬[3,,,,+,,,7337,++++77=7=,737FMiM=MMMQIwBI=[V7,+,,,Mg¢zzz«´¾ÊÏÑÑ××××ÑÑÑÑÑ×ÏÑÑ××ÑÑÑ×ÑÑÑ××Ñ×××Ñ××××××××××Ñ×ÑÑÑÑÑÑÑÑÑÑÏ7799779=9{99=B77=FQV[[bbmw¢¢«««¬°°¬°°¬°´´°¸´°¬¬«¤¢¤[IFFIMMV[migiibgVBII7MFB,%%,3%+BgbFF99Qi=,B°mM3,BQV[[mzzi_[bF9Q9B[_biwrÂѸiVirr¢¤°¬¢m3,33+337,3773,,3+,+3w73++,7999B==FIB=,++9BQF7[QVQ9FMV[giimrrrwzwwwwzwzzzzzw¢¤¢¢¤¤¢¢w9++,%,+,+,B3,7++++%3,9F=,,+79QmMBVQVVII{9IV[7,3,,3M_¤zz«´ÂÊÏÑÑ×××Ñ××ÑÑ××ÑÑÑÑÑÑÑÑÑ×Ñ×ÑÑÑ××Ñ××Ñ×××××Ñ×ÑÑÑÑÑÑÑÑÏÏÏÏÏÑ99773777999B»9939=FVQV[_bmz¢¤«¬°¬°´´°°´°´´´´°°¬«««°¤bIFBBFMMQimimibVFBMV=gwM9%+%,+%3Qgb7MF7BmM=V«zgB99[MQIF[wi[VQQMFQ[Qg¢rw¢¾ÏÏMbww«¸r9,,373+,7799733+,+,+,7,77333,,9B979=FFFB9,,7=FI7VMMM9IQQ[b_imgrrwrrwwwzwzzzzzzzzzzV,3+++3+,,39,,3+3,%,7,7I93,+9BQmM=QM__FB9=I9B[V333,73Q_«¢z¬¸ÅÊÑÑÑ××××××ÑÑÑÑÑÑÑ××××Ñ×Ñ×××Ñ××Ñ××××××ÑÑ×ÑÑÑÏÑÏÑÑÏÏÏÏÏÏÏÏ9973393997377=FQQ[___iz««««¬°´°°´´´´´´¸¸°°¬¤¤¬´´ziQB¿FMM[r¢migimmM7=QFzbF33,,+,Qi_9FbI3ib=b¤«mz[37IV[V=Vr[irQ_Mgbbizm°××¾__w¬Ê¸z73,7,,,,,7777993,,,33797w33,39IB999=F=I93,,7IV[9MVVI9BIM[_bgmimmwrrrwmzwzzzzzzi=,+33,,,,,3=,3333,,77+7F7,,,9BQmFÿbVFB=BI=9V_9,3,73Ib¤z«¸ÊÏÑ××××××Ñ××Ñ×ÑÑÑÑÑÑ×××××××Ñ×Ñ×××××××ÑÑÑÑÑÑÏÑÏÏÏÏÏÏÏÏÊÏÊÏ9973979997397977BBMVV[[[gr¢¢¤¤««¬¬°´°´°°´´´´´´°¬¬¤¤¢¢m_MBBBFMMVmigbgrrbF3797M[7,+37+3+9[mQ3Bi[9b_B´wmir=9MQ[gB3IbizMriwm_¢rm°ÏÊ_m¬«¬×°Q37799997977B9979,3,377733,7733339B797BFFM93,79IQVBVVMB9FFFM[bimimmmmrrrrwwwwzzzzzb=+3,,33+,,9=,3,33,,=3,9F737,9FVgB=IFbQIMFFB99__3,9,,,Fi¤¢zwz¢«¾ÊÏÑ××××××Ñ××Ñ×ÑÑÑÑÑ××××××××××××××××Ñ×ÑÑÑÑÑÑÏÏÏÊÊÏÏÊÊÊÏÊÏÏ73,3397777999997797BIQQ[_i[gr¢¤¤«¬°°°´°´°´´´´¸´´¬««zg_IFIFIMQbgbgirrgI7B33b_3%%,73+9BgmI,7V[IV_F°miV[IM_mrM=9QVwwQzzQm«¢rm°¾Åg««Ï¸g7,397,773379777y,379737,33737773=BFBF977,7BQV=BVBI=BMMQ_bgigmiimrrwwzwzzzzzzzzzbM3%+,3,733377=7,79339B77,,9FVgB9MFbVFMBF[b9+7973Br¤¢¢zz¬¾ÅÏÏ××××××××ÑÑ×××Ñ×××Ñ××××××Ñ××××××××ÑÏÏÏÏÏÏÊÏÏÊÊÏÏÊÏÏÊÏÊÏ333,3373777797977379FQV[[[[gr¢«¬°´°´´°´´´°°°´´°¬¬¤¢ri[MIBBIIMmmbggrr[F,73=rQ,+737,+,QmiF,79[MVVQ°rgBrz[[gzz_F=9Vmbgbz°¬wr«ÂŤ°ÑÅ[977799777379=77I9733797993,9==9=7»7=FIII=3,BFVB=[MQF=FQMMVbbgggiimrmwmzzwzzzzzwwwzz_IM3%%3,,+,,+93%,7=3,973733,9IV_FBMF_V=MM=Vi=,7+3+9g«¢¢¢¢zzrz¢°ÂÅÏ×××ÚÚ××××ÑÑ×Ñ××××Ñ××××Ú××Ú×××××ÑÑÑÑÏÏÊÏÊÏÊÏÊÏÊÊÏÊÏÊÏÊÊÏBB33,,3377=9993777=IQ__VQVir¢¢¤«°°°´°°°´´°´´´´´°¬«zi[QFFBBF[mgbbgrzgI9797Iz¢I%%33, 9_m_B773QQVVV«´b9[mmrzwgFIBB7bwirgI¢mww¬ÏÊ¢ÂÅ׬g37979379979¹s,79w37,7=÷7û97ûB9937=BMF9[VQB7FIIIQV_biiiigimrmwwwrwzzzrwwrrwzwwzzwwwzrzm9QB7+%,,+%%+,3,+3997993377993,3=Q_VFIVB[V=QFyFM_3,,3=g¤wwwz°ÂÊÑ×ÚÚ×Ú×××××Ñ×ÑÑ××Ñ×××Ú×ÚÚ×Ú××ÑÑÑÑÑÏÏÏÏÏÏÏÊÊÏÏÊÏÏÏÏÏÏÏÑÏÑ9933377333939793977=M[__VVVbr«¬¬°´´°´´°°°´´´°´¬«¤wmVQBBBFI_¤i__iimmV3=9IrF+%337+%=g[B93++7Q_Vw´´V7ImbmzgB=FI3Bb_Vwr7wizz´Ñ«°«ÝÂw97,77,,379977737773,,,%379,37,+7=9B979BB9B=F77,79=QM9MQIBFFVQ[bgiigggmmmmwrwzwzzwrwrrwwmrrrwwz¢zF7[=++3,%%+,,,3,37979F7,77,379,+=Vm[FFQFb_FMF=B=V[73779g«¢¢zzrw°ÂÊÑ×ÚÚÚÚ×××Ñ××Ñ××Ñ××××ÚÚ×ÚÚÚÚ×××ÑÑÑÑÏÏÏÊÊÏÏÏÏÏÏÑÏÑÏÏÑÏÑÑÏÑ333,3777,77,33,,377FQ[__[V[bm¢««¬°°´°°°°°¸¸´¸¸°¬¬¢¢wm[MB=FIb¢b[gmmigF3+3=[rwB,,,7,,%Fb_B973%,=Mb¸¬gB=[rrwmFMIV9Izzi_wg9mzVzwz¢ÂϬ´ÊÅ=,,,,,3+,7,,7379{99,++3973773F7979BI73B99737=II=I[QFIMMQV_biiiiimiiirwwwwzzwwzrb39V9++,,3+,,,,733733IB73s77B+,9Ir[=FMB_gIFFB==M[B,=I779g¤°¢¤¢zwmw¬ÅÊÑ×ÚÚÚÚÚ×Ñ××Ú××Ñ×××××××ÚÚÚ×××ÑÑÑÑÑÑÏÊÏÏÏÏÏÏÏÑÑÏÑÏÑÑÑÑÑÑÑÑ7333,7797,3333,,337IV__b_[_br¢¤¬°°°°´´°´´´°¸´´°¬¬¢¢zm[QF=BIM_¢rb_bgriVw39B[[B,+,%+%3Mb[=B3+,=b¸z_9VrrV[V_Vimwgb[MmzQgmw¤ÊÑ´ÏÅB3,373937,779777+3+777,+3,733797977979y=79,77FB7BMVBB3IFMQMQ[[[_gbgmgiirrrwzwB,=V73,+,+,,+33y939MB9397739B+39Mw_IMMFb_IBI79IBMbF7=,373b««¢¢zwwz°ÂÏÑ×ÚÚ×Ú××Ñ×Ñ××××××××××Ú×××××Ñ×ÑÑÑÑÏÏÏÏÏÏÏÑÑÑÑÑÑÑÑÑÑÑÑ××Ñ×,,,3377333773333,39Vmbbgbbgmrz¢««°¬¬°°°°°°´´°´´°¬««mbIB¿Mb¢w___i_MIBI773F[zB7373+ %,M[M77B=9+%7m¢¾zQ=gwwb_irzwgVbwwiVIVwigimÊϤ¤´¸Ú¢Q7737377333733799Bw37779739977379=»9¿B9377BB7BMQF=7=FVVMV[_Vbbigimimrrzwzz_,,=Q7,3++++3,,,s977÷7333,3=+,7Ir[FMIF__IBI==9M_Q,3,73,_«¤¤¤zzww°ÂÏÑÚÚÚÚÚÚÚ××××××××Ú×××××Ú×××××ÑÑÑÏÑÏÑÑÏÑÑÑÑÏÑÑÑÑÑÑÑ×Ñ×ÑÑÑ×=3,77,7333,33,3,7=Vgbibi_giw¢¢«¬°°°´°´°°°°´´´°°¬¤¤m[VF=B=IbzgVbbVVVMI99BFIrg79373+ +7QbQ77BF7,,B¢¸wrMFzii_w[MQQrrF79mrizzÊן׸z733,3,,3+,3+3,,797739973+,3997337337379979993999==+,3=B=9MFF977=IIFQQ[V[[ggggimrmrzwzz=+,IF,=3+++%,3+3933w7s377,39++9Mr_FQQI_[IFIBBBFMVM73377,[¢«¢zwzrw´ÅÏ×ÚÚÚÚÚÚÚÚ××××Ñ×ÚÚÚ×××ÚÚ×Ñ×ÑÑÑÑÑÑÑÏÑÑÑÑ×ÑÑÑÑ×ÑÑÑÑÑÑÑÑÑÑÑÑ7773,37,,333,3,3+3FVggiggbimr¢¢«¬¬¬°°¬°¬°°´´°´´¬«¤¢¢zm_MFBIFI[zm_bb[b[IB9FMIMgV,77,,,%+7VbI39÷9BBi¾_wwQi¢gmgmBFVVwzB77_gr¬×ÝÏ´×ÂQ7+%+,,7973373,,,,9933%33B3,,3373,3,779=9979=7,+77=9BBI9BIFFMV[_Vbiggimrmrrwzz¢¢¤¢¢[3,3VF73 %++,7,3377,B979=3337+7=+39QwbFIBB_VQMMBFFBMVM93399%Q¤¬¤¢¢¢zrwr´ÅÏÑ×ÚÚÚÚÚÚ××××Ú×××××××××ÚÑÑÑÑ×ÑÑÑÑÑÑÑ××Ñ×ÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑ33,73733,3,,,+,,37M[gigiggiiz¢¤«°¬°°°°°°´°°°¸´°¬«¤r_VI¿FVmrirb[_VFBBV[MFbB7=9,,+++=[[I,3ù7+3M°z_bwi[¢zmmrrr[FMb[[mwVMFimIwwÂÚÝÅÊÏI973,3,3737,33,3777,%,3993,7793,3733=9979=9+,37=7=M9FFF9MQ[V[_biigimmmmwzz¢¤¤««¤¤¢9,+3MB,,,+3+,3,37337I799=B,3=7+37+39Vw_BMQFbQMIMFFIVQMFB,3=,Q¢¬«¢¤¢zzzrww¢´ÊÑ×ÚÚÚÚÚÝÚÚ××××××××××Ñ×ÑÑ×ÚÑÑÑÑ×Ñ×Ñ×Ñ××××ÑÑÑÑ×ÑÑÑÏÑÑÑÑÏÏÑÏ,33,,7377,33,,333BM_gggbgbimz¢¤¬¬¬¬°°°°¬°°´°´´°¬¤¤¢zmg[MFFBMQgwzmim[MMFBI_i[M_w3++%++=[_F++3F3F¤mmwbwgzz_wimzgg_MM[VVbz_bbri3gbw¤ÏÚÏÑ¢Q7,3,33777997,,739999s,+3377733,,+399977=9=I973,33=IF733BBF9BBQVQ_bbbigmirmmwz¢¬¤¤¤«««¢¢¢g++%3F73,,,,,3,,,397³BI973393,,7,,=bzbFIMIgMIIIBBMFVVBF979=3I¢°¤¤¤¢zzwzwr¢´ÅÏ×ÚÝÚÚÚÚÚ×××Ñ××××××Ñ×ÑÑ×ÑÑÑ×Ñ×ÑÑÑÑ××Ñ××ÑÑÑÑÑÏÑÑÏÏÑÏÏÏÏÏÑÏ,3,3+,,33,3377337BQbbgigibgmz¢««¬°°°´°°°¬°°´°´°¬«¤¢zi_VIFBBIM[mwrggiVFBMFMbb[Vb,,+%,,FbbF3+,9=77B¤gbgVrwrr_iwrzibb[VMFMVrmg=Vbg¤ÅÏF73937,33377793773937w7+,77=,7,797,+,,,,7777FB9733,79BB9¿733=IMB99=IQV[[_bgiiirrwzz«¤¤¤«¬¬¬«¬¢¢¢B%%,7I7,+3+,333,7799FI3333=,73773=_rbIQMMiMVMFFFMI[M=I9997,I«¬¢¢¤¢¢¢zzwmw¤¾ÅÑ×ÚÚÚ×ÚÚÚ××××Ñ×Ñ××Ñ×ÑÑ×Ñ×××Ñ×ÑÑ×ÑÑ×ÑÑ×ÑÑÑÑÏÏÏÏÑÏÏÏÏÏÏÏÊÏÏ,,333,,7937,,33379M[gbggb_grz¤¬¬°¬¬°°¬°°°°°°´´¬«¤¤zr_VIB=FMQ_gmmgbmgIIMF[___bV97=7,+%+,Ib[B++,3»=B«b_gQgmzwrimmwmim_MIMQrgg7Qimz¸Åz773s337933,33,7,+7·7B73,+37=,33,9=,,,33337797799F973,339=7B9F7339FMF937BFM[[__bggimmwwz¤¤¤««««¤««¤¢¤¤¢r,%++=M3,+3%+7+,3979339BF=,,37,F[rgFQQMiQ[MÿII[M3MBy,Q¤¬¢¢¤¢¢zzwrz«ÂÏÑÚÚÚÚÚÝÚÚ××××ÚÑ×ÑÑ×ÑÑÑ×××××××Ñ×××Ñ××ÑÑÑÑÑÏÑÑÏÑÏÏÏÏÏÏÏÑÊÊÊ,,,3,3,73,3,,3937BM[gmiiibgrw¢¢«¬°¬¬¬¬°°°°°°´°°¬«¢¢wibVIBBIMV[_mi[bi_IFFIMFI[bVB33% ,Bg[F3,737=FIMw[gm[I_irmzzwwmi_IIIwbbm,Fm_r¸Â[,,³,++,3,,37,7,3,7IFw7,,,,7993,373933,33,3399739379B77737=9997BFMI9339=FVIQVbbb_gmmrwwz¤¢¢¢¢¤«¬¬««¢««¬¤¤¤¢¢¢b33,,MM33+3,,33+3=3ù37BB,,9FB%3+399I_wiFMMIiQVIûIMQF3QM73M¢«¢¢¤¢¢wrrz°ÂÏ×ÚÝÝÚÚÚÚÚ×××××ÑÑÑ×ÑÑÑÑ×Ñ××××××××ÑÑÑÑÑÏÏÑÏÑÑÏÏÏÏÏÏÏÏÏÏÏÏÏÊ3,,,+,+3,3,,7,3,3BV[briiigbir¤¤«°¬¬°¬¬°°¬´¬´°´°¬«¤¢zm_MIB=FQQ[gri_imV77FQ=7Ibr_7,B777%%,BgV=+%,97=IMMmVmmF7BFF_zzmzzwwiVFQw¢bb¢m,9b[z¾V37[B,,37373773,77377bB7,+%3793,33s,,37333979y9B33973BBB=7,7FMM=3,779BFMV[b__bgmmrwz¢¢¤¤«¢¢¤¢¢¤¤«¤¤¤¢¢««¢¤¤¢¤B++,3QB,,,3977,,7939F999B7+37V=+7,797I_wiF[MImMVIBMFFIMB3M[9,33F¤°¢¢¢zzrr´ÅÏÑÚÚÝÝÚÚÚ××ÑÑÑÑÑ×Ñ×ÑÑÑÑ××××Ñ××××ÑÑÑÑÏÑÑÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÊÊ,,33,77,3,,3333,7IV[[ggggbgmz¢¤«°°´°°°°°°°°¬°°´¬«¤¢¢zr[QIB=IMMVgig[[iI79QI93BmQ3,79=9,3+=bVB3+9B73BVVzQigB,99=BVwrzzwg[Mi¤mgwQFMQiQ¤¤B9Q[73,7,773773333,,9¹9993,,399B3,+,39=7,,,,33,3799797797999999»39FFMF93,339FFIQV[[b_imwwz¢«¤««¤¤¤¢¤«««¤¤¤¤««¤«¬«¤i9%%,3M=,,+3333,33777=B==3,,7I7,9,,77MbiMMIIrIVM=MMMMQB3I[7+=«¬¤¢¢¢zrrw´ÊÏ×ÚÝÝÚÚÝÚÚ×Ñ×Ñ×ÑÑ×××××××××××××ÑÑ×ÑÑÏÑÏÏÏÏÊÏÏÏÏÏÏÏÏÑÊÏÏÏÅÅÅ,,,,3933,,+,,37+7BVVV[____gmz¢««¬°°°°°¬¬°°°°´°°°«¤¢m_VIFFFQQ[_bbbVII9ÿ7,FzQ,3==7,,3=[VF+37=7,9Q[VbgF93973IVmirwigbwm_IIz[BVQ9BiF333973B933,3777,9B=9=9=+,,39=9,377,3s,3,7337997B9779799799979B·79MIIB37,,,37BIQVV[__irrwwz¢««¬¤¤«¤¤««¤¤¤¤¤¤«¬¬°¬«¢[7+,,7I733393733,77=I933+37=7+,3777F[ziQMQMrMMM=QVIQVF,IV+B¬°¬¢¢¢zwwr¸ÊÑÚÚÝÝÝÚÚ××ÑÑ×ÑÑÑÑÑÑ×Ñ××××××××××ÑÑÑÏÑÏÏÊÏÑÏÊÏÊÊÊÏÊÊÊÊÊÊž,3,37797,++,3737B=QQV_b_bbgmz¢««¬°¬¬°¬¬°´°°°´´´¬«¢¢¢wr_MFBBIMM[ibww[77779793MrV3,93s339MMB,+,=3+=M_bmzM,3BB7BQVmrwmiwmiw[[rgIiwM799II73,77B93,,737739BBBB=7,3,37I=,33373993+,,,,,39979933997979F7BBB939IBI=3,,,,39=BIIQQ[bgirrzzz¬«¤¤¤«¤¤¬¤¢«¤¤«¤¬«°¬«¢zQ,,+7Bs779973977377B7M773,,999+37,99IgriBQVMmIQQFQQIIMF3V[F9F,F°°¤«zzzrwz¤¸ÊÑÚÝÝÝÝÚÚ××ÑÑÑÏÑ×ÑÑ×××Ñ××××××Ñ××ÑÑÏÑÏÏÊÊÏÏÏÊÊÊÊÊÊÊÊÊÅž¾´¬33+,,77333,,,,+3=9IMQ___bbgrz¢««¬¬°¬°°°°°°°°°´°¬«¤¢¢zi_MIBBFMQ[_gzi9773997+3MmbB+79BB93,9VFB3+,=,,+9gwzV739F=[_[iizrirrwiMmi[rzQ77BF7737,,7799973,33,37B99B3+,97Fs3773BB77,+33,,3,999B73397=F3IBIFB,33,+77=FQQVV_mmrwzzzz¤¤¢¢¤«¤¤¬«««¤¤««¤«««¢mQ+%+3F77399973337999BM73337737339,9=MiwgFIMMmFMFBMVMFMI7FVF39+F¬¬¢¢¤zzwrww¤¾ÏÑÚáÝÝÝÚÚ××ÑÑÑÑ×ÑÑÑÑ××××××Ú×Ñ×ÑÑÑÑÏÏÏÊÏÏÏÏÊÊÊÊÅÅÅž¸´°¤¢33,,73733,3,33,+37BMQ[bbgirw¢¤«¬¬¬°¬¬°°°´°°´°¬´¬¤¢zm[MF»MMV[rwM9337939,3[_gI,399FB,3FQBF3%,7,+ 9_zi937FIB_iVmmirzrirzr_QVIbi[B=F=7333,33333,,,,99B9=B=7,,,73FB,,337,397,,337,,337=9379933,7ù9F7BMBMI3,++%,7=FQM_bimwrwwrw¤¤«¤«¬¬¬««¤¤¤«¤¤¤¢¢mQ,++,399y7973977=QB3,777,79,73=FMirgMMMMiIMIII[MM[I3I[F77,B«¬¢¢¤zwwwz¬ÂÊ××ÝÝÝÝÚÚ×Ñ×ÑÑÑ××Ñ×××××××××Ñ×××ÑÑÑÑÊÏÏÏÏÏÊÏÊÊÅž¸´¬«rb3733,33,,+++,77,339IQV_bggmz¤«««¬¬¬¬¬¬°°¬°´°´°°¬«¤zi[QB9ûBVgzbB=3,,33B97giQ_B,3=FI93IFBB3,,93,++IwrM9,MQIQg__z[bzwzmr¤QBIV_V_Mw3937,779777733397»FMB33,+,7F=,,37977393,,,733,,379=B979=973=IQFII=7377,,3=7=MMV[bbgbimrzzz¤¤¤«¤««¬¤¢¤¢¤¤¤mV,+33B973999799w7937FMw9B,,399977FVgmgQVVIgIQIMM[QVVM=MbI97,F¬«zzww°ÅÏ×ÚÝÝÝÚÚÚ××ÑÑÑÑ×Ñ×Ñ×Ñ×Ñ××××Ñ××ÑÑÏÑÏÊÏÏÏÏÏÏÊÊž´°¬¤rbQ3,,+,,,,,+%++,7779BI[__ggmw¢¤¤¬¬¬««°¬°°´´°°°°¬¬¤¤zm[MB=B=FIbzrQB999++7BIIgQBVF739B9»FBFB3%+773%,=¢w[_MIQV[wm_m_mzzrz´¢_FMmmiw[933,733337,333773979»FQw,399I=7,3399993373777737999=BB97779=9739IFFFI733,,7,,37=BMFII_V_[[_imwmrzwr¤¤«¤¤««¢¢¢¢ziV3,+7B9=979yw=VI9939I377,3=VbmgI[VQbM[IIQbQVVI=Q_FQ««zzwrr´ÅÏ×ÚÝÝÚÚÚ×××ÑÑÑ×Ñ××ÑÑ××Ñ××××ÑÑÑÑÑÏÏÏÏÏÊÏÊÊÅž¸´¤¢wbMB7333+++7,,3373,,++373,9=IV_bgiirz¤¤««¬¬¬¬¬«°°°°°°°°¬¬«¤zi[MB77=IgwbVFVg3,++BM_iM=MM9BF9=BV3++779% 3z¤wVB9BMMFFBVizir[[grmzz¤¤wrzwrmB333,,37s3337337777FBMM9,33,3=Iy3733937973337,+,3,7377=9w7=B9B99BQIFIF=7=,7+779FFFFFBFMV[__gmrwrzzz¢¢¤¤¤¤¤¢wbB+,,,99379773739777397I377937,377==Q_rgMVVMbM[IMQ_Q[[I7M[F9=,V°¬zwwww¤¸ÊÑ×ÚÝÝÚÚ×××ÑÑÑ×Ñ×Ñ×××××××××ÑÑ×ÏÏÑÏÏÏÏÊÊÅž¸°«¢iVB7333,++%+,+,7,3,,+++%+3+37=FV_b_b_ir¢¤¤«¬¬««¬¬¬°°°´°°´°«¤¤¢zi_I977Fb__[r33+,9I__I¿B9=ByIB9993%+7,7,,,¤_I=B[VMFBM[zrwzgV[wwQmzg=,%+++,,,373793337BFIFMQ3+%++7BQ=3,,,,37997,,,,7,++,777379=9=9=IFBBBB39=MFFMMF=9=BB99=BIIQM[[__bgizzwz¢¢¢¢¤¢m[F33,73,779737999399QB77999397,3BV_rmQ__MbQQFQM[M__IBIVM[°°¤wwwzwwmwz¬ÂÊÑ×ÚÚÚÚ×Ú×××ÑÑ×Ñ×Ñ×ÑÑÑ×ÑÑÑÏÑÑÑÏÏÑÏÏÏÊÊž¸´°¤gI97,+++,,++,,,,,,3,+,+,,+7++3»V____[brz¢¤¬¬«¬«¬¬¬¬¬°¬°´´°¬¤¢¢mg[B9BIm¬Ê_grw,,++3FQVFB99FI9,,=7+,3,3+ +b[MQbbQB7B_rriQIgm[m¤««I77,,,,,77,779,733BIIFQM93+++,=V93333,7997,3773,73,733799»9BF=F=B97IIBQ[IBF9=B9BBFFIMQ_[[__bg_gmrwzrw¢¤¢¢¢i[777379777793w9979M797,,73,,9B=Q_rmQQVVbQ[IVI[M[_FBFIQBM3Q°°¢rrwwzzzzzwwrwz°ÂÏÑ×ÝÚÚÚ×××ÑÑÑÑ×××ÑÑÑ×ÑÑÑÑÑÑÑÑÑÏÏÏÊÅÊÅž´°¤¢r_I97++ %+++++,,3,,,=3,,++,3+%%+,3=FIVbb[[bmz¤¤¬¬¬¬¬¬«¬¬¬°¬°°´°¬«¢zrbQF=Iw¸Ñ¢[g[¤g3%+,,=QM[B37=I=9ÿ33373+,7+3+,7_zgbm_MB79_irQ=Virimr¢zz¬¢¤rFy3737333333337BQVFQQ7,7,,,=M=3,,73,,3977+3,377+,737399==979BB7,77ûMV[IB=B=FIV_b[_gbbimmrrzwwwwwwzzz¢¢¤«¤¤¢¢¢¢¢¤¢ibB33,73799B9³97,79MI9999,3s,7B7BM_rgMV_[_VQFQMQQ[VI9IIQ÷[´°zrrmrmrrzzwrrw¢´ÅÏÑ×ÝÚÚÚ×Ñ×ÑÑÑÑÑÑÑÑÑÑÑÑÑÑÏÑÏÑÏÑÏÏÏʾ´¬¢w_IB7,,7,%+%,,3,33,,,33+,+%+%,++%%,3BIIV__[__iw¢¤¤«¬¬°°««¬°¬¬°´°¬¬¬«¢wm[QIVz¢Ê×QMIFb7+%%%9I_[B337FB979I=9+37,+,,+,%%+VrQVQMF77B[wzBBVggMbwQFbr¬¢mQ=7,+++,,3333,73BQMFVM93%+%3FI773337,,37997+7377,+73337799B9B=9977=FIQQQFBIIQV_mimimmwz¤¢¢¢¢¢¢¤««««¤°«¬«««¢¢¤¤¢rIB777¹99977997779Bw=7,,9,7,7F79M_rrVQ_VbQ[MQMVVQVBBMIIBM9b¸¬wmrmmmrrwzzzzzzzrrrr¤¸ÊÑ×ÚÚÚÚ××ÑÑÑÑÑÑÑÏÑÑÑÏÑÑÑÏÑÑÏÏÑÏÏÊž¸´¬«wbM7,+%% % +33777,,7373337,+++,+++,7=FM[V[VQVbrz¢¤¤¬«¬¬¬«¬°¬¬«¬°¬¬¬¤¤zmbV_«×ÝQF=MF3++%+3IbQBBFB9FI733993++,+3++,_zw¢iIFQMI979I_zzgBB_r[Fg¢_7FMVm«¢bB+%+%,,%,77+,39QFFVM7,%++39F9,,,7,333333,+3,73,,377,,39=w3979=97,,39FBBMMV[Q[gbmmrrzz¢¢¤¢¢¤¤¤««¤¤¬°°´´¸¸´¬rbQF939=739977799779·777,3977,9I99Q[imQQMViVVIIM[V[[F=FIFIF9g´«¢rgzwiimrrrrwwzzwwzzzwrrw¬ÂÊ×××ÚÚ×ÑÑÑÑÑÑÑÑÏÑ×ÑÑÑÑÏÑÑÏÏÏÏÏÏÊž¸°°¢m_I9,, ++++++33399939s39,,+%+%+,,%3=BIMVMIMViw¢¤¬«¬¬¬¬¬¬¬«¬¬¬¬°°°¤¢wmbm¬ÑÚI[VB=_°I=7=3%3F_[MFBBBB9BM7379ó+,7,37+9gzwwmzbIM[M=FVg[IQm¤bIV¤wF=7=w¢´¢¤rB+%++,,3,3337=IIMVF3,%%,3IM333,3,,,73777+33333,+333339997¹77333337IFFQ[VQ[giimmwwz¢¢¤¢«¬¬¸´¸¾ÂÅÅ´¬r[FB7937737s733=7=377+%393,7I=9M[rmQQMVbQ[MQQVQ_bMIIQFF=Bg°¢rgzwriimmimmrzwrwwzzrwzzzzzwwmrz´ÂÊÑ×ÚÚÚ×ÑÑÏÑÑÑÑÑÏÑ×ÑÑÏÏÏÏÏÏÏÏÊÏÊÅŸ°¬¤wbQ9,,+3,,+9 +,3ÿBF99777997,,3%++%+++3¿IQMMIQbw¢¤««¬¬¬¬¬¬¬¬«¬¬¬°¬¬«¢wrr°Ú×MFwgI9IgI7+7++%BgVFI=9=9IQF7373QM3,+33,,,BrwigIMQ=,,79FigQibV[Mw«wbI,,Qz¬´¾¬m=+%+,,,,37379IIIVF33++%9QV7,,3337,,7977,,7337+337,399979B937F97737,,,3IIQMMMV_girrw¤«¤«°´¸¾ÂÅÂÅÊÊŸ¬iM739733737333,933,9,+37F9339F=IVimVQQ_bQ[MIQMI__FFQQ=I=i°zmirwzrgrmmmrrrrrrwwrrwwwrwwzzzzzzzmw´ÅÑ×Ú×Ú××ÑÏÏÑÑÑÑÏÑÏ×ÑÑÑÏÑÏÏÑÏÏÏÊÅÅŸ´¬¤mVB7,,%%%%+3337BFMQII77777ó933+,%+%++79¿MIMIQbr¤««««¬«¬«¬¬««°¬°¬¬«¤¢¸ÚÏM=VQFB7QwV3%+, +,9bbVI=MQy93[V93,7,77,=izrb[FF=+++9QwgmriVQ_rzi_I9BV««´¬w=+3,3,3,779BFMVQw+3+9V_3,,37737339993,,,,3337,3379999s39F979,,7,,=FIQQV_gimrwzz¢¤«°´°¸ÂÂÂÅÅÅÊÅÅÊÅ´¢iI97933,73977,3,++,3+7,7Q=MVirQMQVVMgFQMFM[_IIMMBII=m¢°¢zrizmzzmgmmrrmmwrmrrrrrwzmwwwrrwzzzzwwmr´ÅÏÑ××××ÑÏÊÏÏÏÏÏÏÑÑÑÑÑÑÏÏÏÏÊÏÏÊÅʸ°¬¢r_F733%%%++,39ÿMMIQI99=B·773,,33,%%%,99BIQMFIQ_r¢¤¤¬«¬««¬«¬¬¬¬°°°°°¤¾Ñ¾I9FQs7mI3++,%,+=_[VFFy=I39999ImM37B77,37MgimwV97+,9IbwV_iVQmimr__w[77I¢¢¤i9,3333,7=BFM[Q=3,,3,BFQ773,379+,3,777,,3333+,3377779=B9B93937937=IQVQV_brrwwzz¢¢¢««¬°´¾ÂÂÂÅÂÅÊÊÊÊÏÏž¤wVI=9779777,3+3,9797=VQQ[grVFMQ[VbMVQIQ__IMQQFM=Fm«¬zzrwzzrrrrmmwwrrmrwmmrmmrrrrrwwzzzzwwrwr¢¸ÊÑÑ×××ÑÑÏÏÏÏÏÏÏÏÑÑÑÑÑÑÑÑÑÏÊÊÊž¾´°«z_I=3+,++,,37=FMVQVQMIBB=FIBB9933733,%+%,79BIIFBIMViwz¢¢¤«««¬¬««««¬«¬¬¬««¤¢¸Ï¬iF7BQVI33Vw7%%%+ %9V_[IFF7=F=,979Bw[+97,=FVggiwI+,39[VmrBMbgVVbbwrQbm_M7Ii¤g3++++,79IBFMbM973+,77=V797,w7,,,3399733,7379w,39=BF997937s379MQVQV_gmwzzzzzz¢¤¬¬¬°¸¸ÂÂÅÅÅÅÅÅÅÊÊÊÏÏʸ¬rVF7779979933739379=F[[[mr_IVM[Q_FQQMM_[MIMQMQBIw°«zrzwrzwrrrrrmmmrmrmmimmmimmmwmrwzzzzwzzzzzzwrwr¢¸ÅÏÑ×××ÑÏÏÊÊÏÏÏÏÑÑÑÏÏÏÑÑÑÑÑÊÊž¾¸¸°¬wgI9,,%,,,3799=BIMVIQMIIIIBI=B93777,3,37BFBBBBFI_gm¢¤¤««««««¬¤««¬«¬¬««¢¢¬ÊÊ¢iMB=Q_I{«m3+,,,+++7IgVM9337II39999BmiM9737IFIiwVbrVQQVVbrVMBFimVQ[gzmFIFbbQrwwz°M,+,737=BBI[M997+,,9FV=3,7973,3+7793,37377733339979=97797,9=IQQ[Vbirrwzzz¢«¬¬°°¸¸¾ÂÂÅÅÅÅÅÊÊÊÊÊÏÏÊʬw_F933333393+33%3,3=B[VVgr[I[M_MVFMMIV_QMFFVVM9I´¤rzwwwzrrrrmmrrimiiimiiiimgmiimrmrrrrrzrzzrzzzzzwwzrrmr¢¸ÅÏÑ××ÑÑÏÏÏÊÊÏÏÏÑÏÑÑÏÑÑÑÑÑÏÊÅž¾¸°¬¤gQ7,++%,,7BMMMV[[[MQV__QQFFIB97777,3,3BF9I=9Q_iw¢¤¤¬««««¤«««¬««¬¬¬««¤¢´ÏÊwVF=7MFI7Bg¤¢V3%%++% 7F[VM=++7F=,7397BziVFB=MB97yFrgQ[zzwzw¤_IQMMVwm[_[iVB=_wwwwV[¤«I9++37799BIQF3+%+++9I_=7,,7973333,393,77773,793379999997399,37FFQ[_biwmwzzzzzz¤«««°°¸¸¾ÂÂÅÅÅÊÅÅÊÊÊÏÊÊÊÊÏʰz_s3+,7+%+3++%337=Q[I_w[FMM[MQIIQBQ_QQFBM[I7I´¢zzzzzrrrrgimigimmgiigiigmirrmwwrrmrmwrrwwrrzzrmmmrrz¤¸ÊÏÏ×ÑÑÏÊÏÊÏÊÏÏÏÑÑÑÑÏÏÑÑÑÑÏϾ¸´¬¤rbI7%+%+,37=¿IMQVVMVM[[mmbg[VIBFBw33,333BF¹79=BIVir¢¤¤««««¬«««««««°¬¬«««¬°Â¾zgVF»IV=b¤7% % ++% +3FVMI,+9=9,37,7IiriQ99FB==++,Mr[[irmwm=BQb_I[ri_bbrzzbQMb´Q7z´«m=+++,977=IVI9,3+3,7VVs,973+3+,,797777,,3,3,73,+37=9=73=7,77FIVV__iwwrzzzwzz¢¬«¬°´¸¸¾ÂÅÅÅÅÊÊÅÊÊÅÅÊÊÅÊÊÊÏÏÊ´wb=3,33,+% %%%+39BV[IVw[FQM_MVIMVBV_QQBBFFF7M´¢wwwzzwrwriiiiiiggbbg_giiiimriigiimmmimmimmmigggi¢¸ÂÏÏ×ÑÑÏÏÅÏÊÏÑÑÏÏÑÏÑÑÏÏÑÏÑÏÏŸ´°«zbQB37,+++3999=FIQQV[VVQQ[[zzwrbb_QQII=973397=7997,39BI_mw¢«¤«¤««¬¤«¬««««°°°´¾¸°«rgVMBFB_bVV3+%,,3%+%,,9MVVB,FV+%,,7,9[igV=II=9MQ+ %9mzw[V=M[izrz¢V=FMgi_IVrwmgimwbbbw°Åz_9=°V3+3,937BIVM7,++377V[9,,,773,33,+3377333,3373,3739=Bù99s799333=MI[Vbmwzzwzrzzzzz¢¤«¬¬´¸¸¾¾¾ÅÅÂÅÅÅÅÅÊÅÊÊÊÊÊÊÊÏÏÑÏŰzV93,+% +%%%+73BQMIQr_BIM[MVFQQBM[MIBIIBF7Q°wwrrmrmiiiiibgbgggbg[bbmgmgbbggiibimirigbbg_b´¾ÊÏÏÏÑÏÏÊÊÊÏÏÏÏÏÑÑÏÑÏÑÑÑÑÏÏ´°¤wbF3,,+,,37=B=BFBIVQQQQQVVV[zrmg[VMMMI7ûs79FM[gr¢¤¤««««¬¬««««¬¬«°¸¾Ê°wi[IFFQz_«_=,+%+ +%++,,3=I_QI[Q %+7,9Vrg_QIIF=[Q+ 3FzzbI3=BMVFVIF_[[_ib[_bmriwmgmzzm°´z_Q_MBF¤z3+,39=FF[F3,3++,9Q_=,3,77,,+73,,=7733,73,,3,3799==7=9=B999,,39MQQ[_imwzrzzzzzzz¢««¬¬°¸¾¾¾ÂÂÂÂÅÅÅÅÊÊÊÊÊÏÊÊÊÊÊÏÏÑÑÏÊ´iF3+%%+% %33BMI_Vm_BFM[M[MMMBMVFIBMB9Q3[°zwwwzrrmibiiggbbbgbb_bgbb_g[bb_gmmmmmb_[VVVw¬¾ÊÏÑÏÏÊÏÊÊÏÏÏÑÏÏÏÑÑÏÏÑÏÏÏÊÊŸ°«_F3,,3337BFBBIMIVVVQQVVVV[zri_[QVQBF99ÿ97,39BMVim¢«««««¬«¬«¬««¬¬´¾Â¾«¤wm[MBMmwr´«b=,+%%%+%%%%,,+,BVbbrM 3399MwmbVMIBQiB%% +9MwiVIIVbIQw7Bgmb_b[bggbzmwmwmimr_«QBVIMMIig3,3973=M[B7,,%%+9Q_93,,733,,73,,7y79333,,,397977=79FIB77973,37FIQ[[iimrwwzzwwzz¢«¬¬´¸¾¸¾¾¾ÂÂÂÂÅÂÅÊÊÊÊÊÊÊÏÊÊÊÏÊÏÏÑÑÑ«_73+%%%%%37FII[QmgBMI[IVIIIBQVIIFFIBQ3_°zzwzmmriimiibgbbbbb_bb_bV[_b_imirmgb_VMM[i¬ÂÊÏÑÑÏÏÏÊÊÏÏÑÑÑÑÏÏÑÏÏÏÏÊÊÊ´¤iI,%,+,7B»FFBFIMQMVQQQQ[QQQVwi__VVMFBB=MI937,7BFVgr¢¤¤««¤««¬««¬«¬´´°´°¤¢¢zi[MQbgÏ¢93,%%,%+++%+3+++3M_wwF %+39BwwiQIMIbrB% %+9Qwwg[i_=[zi=3VwgggiriV[mrmmwi¤¢[iF7Q_QV37737BFQB333,%+7QM77,+73,,,,,++777s373,,3379997==IIB97773,37=FQ_bggrrrwzwzzzzzw¢¢¢«¤¬°¸´¸¾¾¾¾¾ÂÂÂÂÂÅÅÅÅÊÅÊÊÏÊÊÊÑÊÑÏÑÑÑϾmI,++ %%97MFIVQibFIIVFMFFI9QMFIFMM9I3_«zrwrrrrmggigbb_b[bb_[[[b[bimwrmmi_QMIMi¬¾ÊÏÏÏÏÊÊÊÏÏÑÑÑÑÏÏÑÏÏÊÏÊʾ´«rQ9,+,3=IMIMIIIIIIQVQ[QQ[Q[_VVVrmib[[QMFFMQFB9973,3BM[br¢¤¤«¤«¤«««««¤«¬°°«¬¤¢ri[Vg[´Ñ7,,,++++,%+3++%+7FQF %% ,7BwmQIMMwzB3,, %79Vig[[wFBF9[zmbgrz_Fmwmzw¤zM7,=gbb°97737BIM97,+%%+9VM7733993,,73+,7y999,97337379737ûIMB=7379BIVggiimrmmwrzw¢¢«¤¬¬°´´¸¾¾¾Â¾¾¾¾¾ÂÂÅÂÅÅÊÅÊÊÊÊÊÏÏÏÏÑÑ×ÑÑŬQ3+% %77IF7VVggFBIQFQIBIBIQBFIQF7F7g¤¢zzwrrmrmmggbbg[__b[[[[_bmwzrwri_QMFQb¬ÂÊÏÏÏÏÏÊÊÏÏÑÑÑÑÏÏÏÏÏÏÏʾ´°«rQB3,,7BBIQMMMIFMMIQQV[VQ_Q[[[[Vzwi__VQQQQMIB=9,737=IVgm¢¢¤¤««¤«««¬¬«««¬°¬««¤¢zm__igbÂÂ_%+3+%%,+,+++%%7=IFrB%% 39IrFIM_wb7,7+%+3IQVVMizbbFBM=QirmzmIQzwwiiig7,,[b¢V3,79FFM73+,%%+=bVs,7993,7,++7s9MF3333,737,9799FMB9B977,9=MQ[_bmmmrwwwzzwz¢¤¬¬¬°´¸¸¸¾¾¾¾¾¸¾ÂÂÂÂÂÂÂÊÅÊÊÊÊÏÊÊÊÏÑÑÑÑ×Ñʸb9, %+,=3B[gbB=IIIQBIMBMQIFFI9r¢¤zzwzrwrrmimgg[gb[VVVb_iwzzwwrg[MMMb¬ÂÏÏÑÏÏÏÏÏÑÑÑ×ÑÑÑÑÏÏÏÏÊŸ°«¢_M9,,33=FIIMVMIQMQQQVQ[V[_[QQ[VQVzwmgb[VQVQMFF73,+,BIVim¢¤¤¤««¤¬¤««««¬«¬«¬¬«¤¢rmzr¢Vi¾9,,%%+++,+%++,%Bib_[wiB% +BrbBIVmgF,39, +Fb[_B7FVwmizbMBBQVF=_zrwrwbVm¢wz_gr¢b3+3Mgm¢B399FI7,,%,39_IB3,3977739,3,,7979FF33737+377737=9FIQM9779337BQQVbgiwwwrrrwzwzzzzz¤¬¬¬°´´¸¸¸¾¾¾¾¾¸¾ÂÂÅÂÂÂÂÅÅÊÅÊÊÏÊÏÏÏÏÑÑÑÑ×ÑÑÂrB3,3,9979_b_FBMMMQIBQI[QIBIM?=w«zzzzwrmriigimg_[Q[giirriiVIFQg°ÂÊÑÑÑÑÏÏÏÑÑ×××ÑÑÑÏÏÊÊʰ«z[=,,+37=FIMQQIQMVMQQVV[_Vb_[VQQVQVzwmrbb__[QMF=3,+3=IVgrz¢¤««¤«««««¬¬¬«¬¬¬¬«¢¢z°bww,,,++,++%%%+ +7izrzmVB,,+3IrwF9I[[I·,,+9grbMB79FgiVFIQQ=B_zzwmigw¢zgMmbr¢I%,3Mrz«g777=s,,,,,=[MF93393373733373w=IF73739339=7BB9=MQQF9937379QMb[gimrrrwwwzzzz¤¢««°°°´¸´¾Â¾¾¾¾¾¾¾ÂÅÂÂÂÂÊÅÊÊÅÏÏÊÊÏÊÑÏÑÑÑÑÑ×ÑÊ«zI,,79,39Vg_F=MFFMBBQFQQBFFF77F9z«zzzzzzwzrwmmmmrgbg[bbiwwrmbQMFVw´ÅÊÑÑÑÑÑÏÏÑÑ××ÑÑÑÑÑÏÏÏʾ¬iV=3+++3=MMQVVQIMIMM[[[[[_[___QVMQV[rrib_bVQMM=,++39BQgrz¢¤¤««««¬«««¬«°°¬«¬«¤wÅm_z[3%,,,+,+%%+ %%+9gzri_[imIûQFFQ[3%,9_wwM9MwmMQM99MQMVQFMirwzzrzw9B=w9,37ig«B37B=Bw7,+3B[II979737,,397979=w777337=B=F97IMMF7379VQ[bbrrwrrwwwrwzzz¢¢¤¤¤«¬¬°´´¾¾¸¸¸¾¸¾¾¾¾¾ÂÂÂÂÅÅÊÏÊÊÊÊÏÏÏÏÑÏÑÑÑ×ÑÑʰM,,7,+,M[VB9FBFF=F=MQIFBI37I9¬zwzwwwrrmiiggb[_rmwmb[QM_¾ÅÏÏ×ÑÑÑÑ×ÑÑÑ×Ñ×ÑÑÑÏÏÏŸ¢mQ9B%%+39I[QVVQMMMMMMQ[[[[_b_VQVVMQQVzrgig[[IFB7,+77BVgr¢¤«¤«««««¤¬¬«¬«¬¬¬«¤¤¢¤«¾¸V_mr[9,++++,3, %+% +,=[imgFFMQûIVB++=g_=IgzbF9MFF[V_QFVrwzzV,,,9¢i3%,Mg°m33=9733,,33=bM39779,73,,73999B99w333,3·BFB7IVMQ777773BVMV_gmrwwwwwzzzzz¢¢¢¤«««°´´´¸¸¸¸¸¸¸¾Â¾¾¾¾¾¾ÂÅÅÅÅÊÏÊÊÏÊÏÏÑÏÑÑÑÑ×××Ï´M73++3F[VB7=BIFB9IFVM=IFF339=«wwwwwrrrrmiggbmwzzmiVQQi«¾ÊÏÑÑÑÑÑ×ÑÑÑ××ÑÑÑÏÏÊÏʰ[F3+7,3=IV_[VVMMMQIMQ[[_[bg____VQQQV[zrmi_[QIB73+,7FVbw¢¢«¤¬¬°¬¬«¬««¬«¬°¬¬«¢¢ÂÅÏFr_mVF973%%+++%+,,%+%3»9FV_iwwbFIQQ[÷9Igi=,,3=IzVM99FF799=Mgb_MMbzrm3+%7¬b,+B__¬B,3,+3+,,3_IBB3,B777773+,3,3B¹93333,¹BI=MVV_B99,73=VQQ[mmrrrwwzzwzz¢¢¢¢¤«¤««¬´´°¸¾´´¸¸¾Â¾¾¾¾¾ÂÂÅÅÅÅÅÊÏÊÊÊÏÏÏÑÑÑÑ×××Ñ×ϸQ7,+,BVV939=FIIVI=Q=F+,7F«zzzzrwzmigimrrwmg[V_z°ÅÏÏÑ×ÑÑÑÑÑ×ÑÑ××ÑÏÏÊÊÊŸ¤zV9+++99M[[[_[[VVQQMQ[b_b_gbb__[QMQQ[_zwmg[QFB=,+%3FVgw¢¤«°¬°¬¬««°««¬¬°°°¬«¢¢´×ÚÂmFgF[MIB93+,%,+%%++%,,3=I9%+,7IV[MM=9BFI99=BMVimziM,,%+9g97999IF999B[gg[V[_ir¢I %i«°M+7VM´[73777,,,+++7[MB9337339w,7s=F³,3777379M7=B=VV_bI3,+7VQV[mrrrrwzrmwz¢¢¢¤¤«¤«¬¬°°°´¸¸¸¸¸¸¾¸¸Â¾¾ÂÅÅÅÅÂÂÊÊÊÏÏÏÑÏÏÑÑ×Ñ××Ñ××ѸV3+7BQQB377BIFQB=I9B+,7I¤zzwwzwwrmimrzwmib[b¢¸ÅÊÑ×Ñ×××××ÑÑ×××ÑÑÊÊÊž°¢gF3%+,7FM[[_[VQV[VQQQ_bbgbmg___[_[QV[bzzzwibVFB97+%7IVgmz¢¤«¬°¬¬¬¬«¬¬«¬¬¬°¬«¤¤Å×ݬb[bF[99=93,,,3+,+%+33BQQ9 %%3FMB»B9939=IV_iirim_F9, %,Vw7+7=BV=B=MgggQV_Vgrr¢¢g3 %9°¸93bVb´797,3,%3+,,9VQ99379737,937333,·+3737379QBI9BFQ[_bVB9,33,MVI_mrwrrwzzrrrrz¢¢¤¤¤«¬¬°°´´´´´¸¸¸¾¸¸¾¾¾¾ÂÂÂÂÅÅÅÊÅÊÏÏÏÏÏÑÑÑÑ××××××ѸM37FM[BBF=B=IMQVIII=I,79V¬zzzwzzrmrwwzwrmg_m«¾ÊÊÑÑ××ÑÑ×ÑÑ×Ñ××ÑÏÊÊž¸¬V9+%,7FMV[_V[VVQQVQV_bigiggi_[[[_QV_ggzwi_VF=7,+7IVbm¢¤¬¬¬¬¬°¬¬¬¬¬°°°°¬«¤Å×ÚrziV,3+773337s79,9=BIM7,,,9I[IFBB997733=BFIBB9%%%=brB,3F=B[FFB=BIgriV[Q[grz¤I+++_¤¾°b=rVM¤F,3,+++3,+37VIB37397,77777,3779ûF373337779Q9FB9MM_bggI73,,+BIMQmwrwrwwzrmrz¢¢¤¢¤¤«¤««¬°°°´°°¸´´´¸¸¾¾¾Â¾ÂÂÂÂÂÅÅÊÊÊÊÊÏÏÑÑÑÑÑÑÑ××××ÚÑ´wB,9BM=,97977FMQQFIFFF%39_«wwwwrrwzrrggz°ÂÊÏÑ×Ñ×ÑÑÑ×××ÑÑÑÑÏÊŸ°¢mQ9,,3=IV[_V_b[[[[QVV__biiiib__[V[VQ_b_zzrbVMB7++9BQbr¢¤¤«¬°°°¬¬°¬¬°¬´¬¬¬¤¢ÏÚÑz¢_% +7%+339777F=BMF=7,+9[_QBy=9=B379933+,3,+,9VrM3+79BQQMFIBBVmm[[MV[i[rF79I¢Ê[zV=¸i7979,337379[IB7y7997999=ûI97737799B[IF=9IVbiig[s,,=QM[rzrzwwwzzrgmz¢¢¢¢¢««¤¤«¤«°¬°°´¸°´´¸¸Â¾¾¾¾¾ÂÂÂÂÂÊÅÊÅÊÊÏÏÑÏÑÑ××ÑÑ××ÚÚÚϰmFB,37s=BMF9MIMF+,9b¤¤zzwzwwwzzmmm¢´ÅÊÑ×ÑÑ×ÑÑÑ××Ñ××ÑÑÏʾ°«gI73,9FV[[[V[[_b[[VV[biiwmiig___VVQV_b_zzwzm[[F3,,=IQ_m¢¤¤¬°°¬¬¬¬°¬¬¬°°°««¤¤ÅÚÅw[rÅi%% % %,3779=99BI=QMF7,%9QFB97339BBBB=7=,++,3,¹,,9Mrimg9++7FQIIQFMIMbzgggQVgwz_wm_QB°¬r_B9[´=3,+,,3773=bIF9797393799¿I99B=B79B_IIBBM[biig_w7,=QM_wzwzwrwzriwz¢¢¢¤¤«¤««¢«°¬¬°°´°°°´¸¸¸¾¸¸¾Â¾ÂÂÂÅÊÅÊÏÊÏÏÏÏÏÑÑÑ×Ñ×Ú×Ú××Ϭg9+=B,3,9,7FFI=IMM=+39i«¢zzwzwwwzzzwmr¤¸ÊÏÑÑÑ××Ñ××Ñ××Ñ×ÑÑÊž¸¬z_B337FM[__[[[___[[[[gimirmigbb_VQQ___bggimzmgQB3+,7F[bm¤«°°¬°°¬°¬¬¬¬¬´°¬««¢¢¬Ñ¾gMMÅM +%,+,,+3373+33BMFFBBB3377793+33FV[IFB973 +++,=M7,,33FQgw[7,39FBÿVIIImwbbVM_wgiwmbzzz[,3=«¬V,333,,3+39_F=B377373,,,3799BIB399937737IFFB=I_gimi_I9,++=MFbwwwzwwmrmz¢¢¤¢¢¢¤¢¤««¬°¬¬¬¬°°¬´´°´¸´´¸¾¾¾Â¾ÅÅÅÊÊÏÊÊÏÊÑÏÑÑ××Ñ××××ÚÚÚÏ¢[,39%+,3,7BMI¿FI7,3Bm«zzzzzzwzzww°ÂÊÏ×××Ñ×ÑÑ××Ñ××ÑÑÑÏž´«rVF7=IMV_b_[VV_[[[[[_gmwwrmiibb_[V[[bbgg[V_gzwgMB7,+3IVgr¢¤««°°´°°°°°°¬°°´°°«¤¢¤¸¸m[Bg9%%%%+3+,3,7,+,,,FI79FI93,+73+++7FgbQw73%++++BbQ,%%%9B_rg[73,B=BFVMBF[zrg[VQwmg_Mi_Mz«3,7Åw7,+,+++%,¿=9=9=,3,,73,+397Qw9,,3,39BFBB=I_iwwgbM7+3+7QIVmzwrrrmm¢¢¢¢¢¤¢«¤¤¬°¬°¬¬°°°¸´´´¾´´´¸¾ÂÂÅÂÂÅÅÊÊÅÏÏÏÏÑÏÑ×ÑÑ××Ú×ÚÚÚÚÊF393+%,33=IB99B9F3%,Bz¬zzzzz¢´ÅÊÑÑ××Ñ×××××××××ÑÏÅ´¬¤zgQB=MQ___[_V[[_[_[bbmirmmmgg_[b[[b_biggFFM_mz¢¢¢¢¢zmVI3++7BVbmz¢¤«¬°°°°°°°¬¬°´´°¬«««¢¬¤rgBMV+%%%3,,,%+,33,,,7FB739B=,++3+,%,3Mgg_B7B=9%%+,,9m_9,%%,=QmmgV,+9BIMIMF=IMbwrgVMrrm9iM9g°V,7rÑ¢7%+%%,%%,=_I9977B33,39+,,3333BFFB773,,3+,7BIBI9M_iwzii_B+3+,MV[mzmrimiz¢¢¢¢¢¢¢¤«««¬°°¬¬°°°´°´´¸´¸´¸¾¾ÂÂÂÅÅÊÊÊÊÊÏÏÏÏÏÑÑÑÑ×ÚÚÚÚÚÚÝÚÂ=9,,++33û37==,%3B¬zzz«¾ÅÏÑ×××Ñ×Ñ×××Ñ×ÑÑÑÏʾ´¢m[IBBIMV_b_[V[[[[[_bgimmimmmib___[Q[bbggg99FVir¢¤¢¢¤wbI3,,7=Qbw¤«¬°´°°°°¬°°°´´´°°¤¤´«rzwBV7++%%%+7%%%+7,,%,F_B3,79993,,++++=bmbb97IIB+%3++7bgB%%+,9MbgVbI,,BBMFIFFIVFmwg[[wzwzVzM,9«Å93gÚ¸M+ %+3%%+7_B9y3337,+,73379BM=,,,3,,+,3II»[grwmi_B,3+,IQV_zrbgww¤¢¢¢¤¤¤¤«¬°¬¬¬¬¬°´´¸´´¸´´¾ÂÂÂÂÂÂÅÅÅÊÏÏÊÏÏÑÑÑÑÑÑ××Ú×ÚÚÚÚѰiB7,++3+9BB37=F=%%,I¬zz¬¾ÅÊÑ×Ú×ÑÑ××Ñ×Ñ×ÑÑÏÊʾ°zbQFFFM[_bb_Q[__b_bbbbimwmmmibgb[_[_bbbggg339M_iwz¢¤¢¤¤¢wgV7+%7BQ_m¤«°°°°°´¬°°°°°´°¬°«¢¢¾ÅzMQ=,++%++3++++7,,,9_M7,39y73+,,+,I_mi[3+MQF,%++%3QwQ3+3+3Q_IV[gB39BMMIIIFVB[ri_Vzwzrwmwr¤¤zi=+9b¬[9QÏÏg,+%%+%+,7[B·9F777793+37793»979w,+,7II=FQimzwri_I3,+3MVVbrgrgw¢¤¢¢¢¤¤¤¤«¬¬«¬¬°´´´°´¸¾¸¸¾¾¾¾ÂÂÅÅÂÅÊÊÊÊÏÏÏÑÑÑÑ×××××ÚÚÝÝÚÏV73,,339B9337FB,+7Q«z°¾ÊÑ××Ú××Ñ×Ñ××Ñ××ÏÏÊž«iVIFFIQ_b__[[_b__[bbiimrrwrgb____[[bgigggg++3FVbwz¤¢¢¤¤¢zi[9++3=Vbw¢¤«¬´°°°¬¬°°°´¸°°´¬¬¤¾ÚmrFMQ7,%++%,,%%+9,3,BgB,+79,,393++,%,MbwiI++M[I7%+% +MwgB3%++IbMIM_bI9=F[V_I=I=Bmi_[ibrimz«¬_,%+7¾BQÅÑr% %+%%%,[3=B,3373,7+37,79·7w33+,3BI97MVmrwmibI7,+,IMVbibwmz¢¢¢¢¤¤¤¤«¬¬¬°¬°°´°°´´¾¸¸¸¾¾¸ÂÂÂÅÅÅÊÊÊÏÊÊÏÏÑÑÏÑ×××ÚÚÚÝÝÝ×ÂI+%+,3397,,7B=%+3b¢zzzz´ÂÏÑ×ÚÚ××××××ÑÑ×ÑÑÏʸ¢wbMMMQMV[b__V[bbgbbbimmwwwmib_[[__[bbiigigg%%,9M_mr¢¢¢¤««¤mV9+ ,BQ_r¤¬¬¬°´´°°°´°´°´°¬¬«¢¢¤×mgF[b,%,%+,,+++37,,3Vg7333,,F73,++3QimI3+=[=9+%+%%=bmV9+%+9iMB9QmbF3B_b_QQFB9[[b_w_Qiwrwz¢¤¬wQ+%%+Q¢MM´×%% % 7Q9IB3ó3393+++++37FMB9777,=,,,B977M_iwwrriQ3%++MIQgbizwz¢¢¢¢¢¢¤¤««¤¤°¬¬¬°°°´´´¸¸¸¾¾¾¾ÂÅÅÅÅÅÅÊÏÊÊÏÏÑÏÏÑÑ××××ÚÚÝÝÝÝѰg3%%,,3=9,,3F7%%9b¢z¤´ÅÏÑ×Ú××ÑÑ×××ÑÑÑÑÑÏʾ°iVIIMQQQ[b_VV_bbb_bgimrrrmib_[V_[__bggigigg%%+7BQbmw¢¤¤«¤¤r_=,%,9Ibr¢¤¬°°°°¬´°´°¬¬°´´°¬«¤¸rIz+%++3%%%7,%,FgQ3++33+3=,9333,,VrrQ++9M=9%%+ ,IbbB3%,=iVF99[bbI9Mrb_[MB=FI_[m_Qmriw¬¤zQ,% %3bgM¸Ú3%%%%%%+3M999,FB33,37,+,7,39FQQB,397=++7=9=9Qbmrwwwm_V9,+%9IQggrwz¢¢¢¢¢¢¤«¤¬¬«««¬¬°°°´´¸¸¸´¸¾¾¾¾ÂÂÅÅÅÊÊÊÊÊÊÏÑÑÏÏÑ××××ÚÚÝáÝÝÚÏ=%%+,9m9+,7B3 %7i¢zwz¬¸ÅÏÑÚÚÚÑ×××××ÑÑÑÏÑÏž¬r_IIIM[V___[VVbggbbggmrwmmi_b[[_[__bgigiiiig %%+7BMgr¢«¤««««¢_B+%,3Mbr¢¤«°°°¬°°¬°°´´°°°°¬«¢¢rIz3 % ,7+,++33,3[QB7+++373733,7,,3ImrM+%3I=I,%+ +9FbbI3%,bVF99Ibi[MIggggg[MBBQbww[Qmii´¤zb9%+FM¸Ú°7 3 +%+%9MF=7FF3+37,+,+33377I[9,y39,,7FVgwwwzwibQ7++%»igwzrz¢¢¤¤¤¤¢¤«¤¬¬¬°°´°°¸¸´°¸¾¾ÅÂÂÂÂÅÅÂÊÊÊÏÊÊÏÑÏÑÏÑ×Ñ××ÚÚÚÝÝÝÝ׸i%+%+,37+,7=+%%9mzzzww¢¢«´¾ÅÏÑ××××Ñ××××ÑÑÏÑÏÏŸ¢m[MIQQVV[bVV_[_iibiiimrmigb_V[V_[[bgbiigigig ++37Igm¤¤«««¬¢w_=+++3BQr¤«°¬¬°°¬°°´°°°°°°¬««¢gzÂM[I,% +37,,+++77BQ933+,,,393%3+7333[mrV7+7QFF9%+% +,3BbbF7+Q[B77I[g_VM[igmrzi[F=[ii[Qriz°z_gV7% 7Ib¸Ý¸F%+++ %%7QI9=MM373,7,,373,39IV93,979,+37979M_grrmrwm_M,%%%BI[giwmrz¢¤¢¤¤¤¤«¤«««¬°°°´¸¸´´´¸¸¾¾¸ÂÂÅÂÅÊÊÊÏÏÏÏÑÏÑÏÑ×Ñ×××ÚÚÝÝÚÝÚÑF9%,+33,+7,% +=¢zzz¤«¬´¸ÂÅÊÏÑ×××××Ú×Ñ××ÑÑÏÏʬi[MMVV[__[V[[_bgiiimrrrmib_bVVQV[_ggiggi_bgb%,3=[g¤¤«««¤¢¢zb9% %+BQr¤«¬¬´°°°¬¬¬¬°°°´´°««¤iÊFF=+%%+3,+%,,9I=7,,,,,33,7++3+333QrrB,,3IQI=%%+ %, ,Ibb[=gI7,9MM[[VM_rrrwmmM=Q[_VQgzz¤_=M= %9M¸´Ú¾M+%% %%9QI39=MI73,77,+37,39=IF7337,3,,,377=V__iiiwzib[73%+9Ibbizrz¤¤¢¢¢¤¤¬«¬¬¬¬¬´°´¸°´´¸¸¾¾¾¾ÂÂÅÅÅÅÊÊÊÊÏÑÏÏÑÑÏÑ×××ÚÚÚÚÝÚÝÝÚ¾g+++,3,+,,+ +Fzzwz¤°°´¸¾ÅÊÏÑ×××××××Ñ×Ñ×ÑÏÊÏŸ«wbQQQ[[_b_[V[_gggiimmrrrmib_V[V[V[bgggiibgibg +3=br¤««¤««¢¢zbB+ +=[m¢¤«¬°°°°°¬°¬°´°°´°°««¤zmi¤MV9+%,3,+,%%973BB39,+,3+39,,+%,%,,9Vzw9%%9I[I7+ % +3% 9IbiQFgVB,7M=M_bMImiirmV=MV[VIb¢wi3+7F3+=Fr°״=++++%+BVB79FMM33377+,3,9399FB7+3,,373,7779M_bmiwmm_g[93+,=Mgbgzzrwzz¢¢¢¤«¤¤«««¬¬¬¬°´´´°´¸¸¸¸¾¸¾¾ÅÂÅÅÊÅÊÏÊÏÑÑÑÑÑÑÑ××ÚÚÚÝÚÝÝÝÝÏ9 ,%,3%%,+,%+I¤zwzzrz¤¬´¸¾¾ÂÊÊÏÑ××Ú××××××ÑÑÑÏÊʰm[Q[[V[__b[V[bbgggmmmrmmib__[QQ[[__ggigigbbig%%%%,79Qm¤«¬«¬««¢wV3 ++,=[r¤¤¤°°°´°°´¬°°°´´°°°¬«¤¢zigzgrw,%%+,33+++339F9793,+333,7++,,,,,9_r,+,,=_M7,% ++F%+7=M[i_i_F,3MB9ViVIrrmmgibMQQ[QI[w¢9 %9VI79i«´×¬9 %FM=,7MVM,33,7,+3,w7BB73,339Fw77I[_imriggbb[=7%9=Qbbmzzzzz¢¢¢¢¤¤¬¬¬«¬¬°´¬°°¸´¸¸¸Â¾¸¾¾ÅÅÅÅÊÊÊÏÊÏÑÑÑÑ××Ñ××××ÚÝÝÝÝÝÝ׸b+%+,3%%+,+M¢zzzzzz¤¬°´¾¾ÂÅÅÊÏÑÑ××Ú××Ñ×××ÑÑÏÑϾ¬g[V[V[bb_[[[_ggbgiirmrmmgb_[[[[b[bgmbigbg_gii %+%79Qgz¢¬«¬¬««¤zQ+%%3FVm¢¬°°°¸´°°°°°°°´´´¬««¤miim¢3+++33,,++,,=373,7,,+,39+93,++3Mir7 %+9QM33+%+373+777BMVV[I93[M7F[bV_rii[_QMQ[_MM[w¢Q% ,[M33i¸´´Ï¢, + % %+IFI33Mg[3+37,++33,+77M3,,39,3797=V_irrmib_gmbB9%,9Q_Vwwww¢¢¢¤¢¤«°««¬¬°°°°°´¾¸´¾¾¸¾¾ÂÅÅÅÊÅÊÏÏÏÑÑÏÑÑ××Ñ×Ñ×ÚÚÚÚÝÝÝÝÚÏ9%++%%%%++[zzzzw¢«°¾ÅÂÅÅÅÅÊÑÑ×××Ú××××××ÑÏÏÏÊ´¢m_V[_[[_g_[__giggiimrrmigbb[[V[[Vbbbigggg_gigg%%+37M_z¢«¬«¬¬¬¤mM,%%%,I[m¢¢«¬´´´´°´´°´°´´°°¬¬«¤¤rzgz°i,7333,,,,39=9,373,3,37,,,,,33%7Mm7%%%,I[B7 %%=, 399777=I9,,M_=9Vi[VgrgQbVFQ_[IVbwz¢¤i% 3B7,3g¸¸´Å, +++ +MQM,9Ig_3,977,39+,,99M=7,++37,,9{VbiribbbgmmbB3+3=V[Virwz¢¢¢¢«¢¤¬¬««°°¬¬°¸¸¾´¸¸¸¾¸¾¾ÂÂÅÊÊÏÊÏÊÑÑÑÏÑÑ×Ñ××××ÚÚÚÝÝÝÝÚ×°Q%%%+ +% ,bzzzzz¤¬°¾ÂÅÅÂÊÊÊÏÏ×××Ú×××××××ÑÏÏÊŸ¬zg[_V_[[b_V[_bbigiimrrrrig_[VVV[__bbgmgib_bgbbm %+3+33I_w««¬¬¬¤¢rV7% %,F[i¤¬°°°´´°°¬°´°´´´´´¬«¤F++397+++,,9=9,33933+,3,77793,,,9[b9+% +F[I=%%3F=3%3÷% 3=3,,9bM7Mgg_Vii[[[II[QQQbrmr¬¤wM+,,,,9[¸¾¸¸r++ +,,,9VQV37F_M9979777777397,++,33,997MVbiibb_mrrw_B,3+=_[bgrw¢¤«¤«¤«««¬°¬°°°´¸¸¸´´¸¾¾¾ÂÂÂÅÅÊÊÏÏÏÑÑÏÏÑ×ÑÑÑ×××ÚÝÝÚÝÝáÚÊ3 % %%+ 3izzzz¢¬¸ÂÂÅÊÅÊÊÊÏÏÑ××ÚÚÚÚ××××Ñ×ÑÏʾ´¢rb[[V_[[__[_bbiiiimrrwrmig_[_[[___gbimbg___igii %,7=I_w¢««¬¬«¢rQ7 ,B[m¢«¬°´°°°°°°´¬´´¸´´°¬¬¤¢°zr73+79,%%,39B3,,7+++%,,3733,3+3Bib7 %%%=VM9+%3IB937¹+%+37s[[=Bgig[rwbVb[BQI=Vgmir«irm3%, +3V´¸¸V+% %+9VVV+9IVM,,977,3337BF=3,+,,3997=Q[_b_gbgwzrbF7,39g__mr¢¤¤¤«¢«««««¬¬°´°´°¸¾¸¸¾¸¾¾ÂÂÂÅÅÊÊÏÊÏÏÑÏÏÑÑ×ÑÑ×××ÚÚÚÚÝÝÝÚ׫F %%% + 7wzzzz¬¸ÂÅÊÏÊÊÊÊÏÊÏÏ×ÚÚ×××Ú××××ÑÏÏŸ¤i_[____[[bV_gggiimrmrwrmb____[[___ibii_gbbbrgmg%%,FB[w¢¤«¬«¤¢w[7% %+9[m¢««°°°°´¬¬´°°°°´´´´¬«¢¢¸zr7,+79+++,7FB77,++=,++ ,399+++,%3Mw[7%,++3BB9+ 9MB3++=I=+%%39337M_=9Qg[_izrbb_VMF9Vizi¢igM,3++3V´´¬m9+ %+3VQF+9MQI3,99,,+,33,7=B¹,,,,3997=VV[gbgmrzwrgI3+3=[[bmrw¢¢¤¢¢«¤«««¬¬¬°°´´´´¸¸Â¸¾¾ÂÂÂÂÅÊÊÊÊÏÏÏÑÏÑÑÑ××Ñ××××ÚÚÚÝÝÝÝÚÅi%,3 %% 9zzzwzww«¸ÂÊÊÏÏÏÏÊÊÊÊÏÑ×ÚÚÚÚ××××××ÑÏʾ°¢zgbV[[[[[[[Vbgiiirrrrwwmm[_V[[[V[bbiggiggbgbiiig +,F[r¤««««¤w[9%%,BVm¢¤«°°°´°°´°°°°´´´´°°««¢¬wwr3%+97,++7Bw,+,37+33++93+%%%++7gmV7%%3++7B7,%9Vw,7379,+,7,3,9MI7ViF_mrrb[MQVI3Ibwriz¢zB3,,7g¸¬VBii+ + %=QQM3BIII7379+3333,,3B773,37997FMQbiirwzzwwrgI,+,I_[imrw¢¢¤¤«¤¤¤«¬¬°¬°°°´´´¾¾¸¾¸ÂÂÂÅÅÅÊÊÊÏÑÏÑÏÑÑÑÑÑÑ××××××ÚÝÝÝÝÚÑ=++ % =wwz°ÂÊÏÑ××ÑÑÏÏÊÅÏÑÑÚÚ×××Ú××××ÏÊŸ«mb_V[___[[Vbbgggimrrrrrrgg_[[[__bbiigiigbb_ggigb %,=Vw¤«¬««¤mQ7 %,=Qi¢¤«¬¬´°´°°°°¬´°´´´°¬«¤¬gIF+,9,%,3¹337+%3+,,+++97% %,,Vm[=,3,337B3,+FV7777333=3%79,,+7QI=VbB[rzwiMFIFF9=Qw¤z[r¤w_Q=F´=r¢,%%IVMM3FIB3973=9,,33777737B7339B=IQ_iwrwwwzrbM,+3Q[biimz¢¢¢¤«¤¤¤««¬¬°°°°´°´´¾¸¸¾¾ÂÅÂÅÅÊÏÊÊÏÏÑÑ×ÑÑÑÑ××××Ý××ÚÚÝÝÝÝÚ´V %Fzzzzw«¾ÊÏÑ××××ÑÏÏÏÏÏÑ××××ÚÚÚÑÑÑÑÏÅ´m__[[_[[____gggiwwrwwrwm__[VQV[[_biiiiggibbggb__ %,9Vi¤¬¬¬¬«¢wV7 +,7Vi¢¤¬°°°´´°´°°°´´¸´°°«¤¤I,+%+97+77997,,+++,,,++ 93,% + %=rzmb=%+%%%,737+FI7397%,37,,7=,+33FF7FbBImzw_979=7=I¢g3Brwmz«¬rV¤F%%,+BQIF,ùw933B=+373377333993979=IQ_irwwwzwwwgM3,7[V[imwz¢¤¢¢¤¤¢¤¢««¬¬°°°´´´´¸¾¾¸¾ÂÂÅÂÂÅÊÊÏÊÏÏÑÑ×ÑÑÑÑ××Ñ×××××ÚÚÝÝÝÚÅw%+Vwwzz¬ÂÊÑ×ÚÚ×Ú×ÑÏÏÏÏ×××ÚÚÚÚÚÚ××Ñʸ¬rg__b_[[[[[__bgimmrmrrrrib_[[VV[bbgggmmigggggbibV +9Mm¢¤«¬¬«¤w_9 +3Qi¢««°´°´°°°´°´´´´´°°«««wB+%,37977B93,,3,%%3,%,,33,+ % %7bigQ3%++,++7=,3FB,793%+,3+39933,+BBBû9bb9799BFVQ7z=Vz°«°Ê«F %%FM=3ùBB9939BB7,,7393,337s999MVimzwzzzwwwbQ,+9QVbgmwz¢¢¢¤¤¤¤¤¬¬°¬«°°°´´¸¸¸¾¸¾¾ÂÅÂÅÊÊÏÏÏÏÑÑÑÏÑÑ×Ñ×××××××ÚÝÝÝÝÝÑ7,b¢wzz´ÊÏÑÚÚÚ×××ÑÏÑÑÑ××ÚÚÚÚ××××ÑÏž´¤mbbbb[[[[VV[[_iimmmrrmrib_b_V[[_bgmigii_bi_biig_[ +7Igz¤¤¬¬¬«¤z_=% +7Mm¢¤°°¸´´´°´°°´´´´´¸°¬¬¤¢93%,3379B=7+++9%++3+,,+3+, %%+7QwMrwQ=7%,%%++,79FM=%+93 %%+,+7F79+%=I·33FimF,BFVM_¢wIVB9r¤¬¬z,%,+,FM=7,9=3=B=37BF7337733,373=,B=9IQ_mzzrzzzr_F3,I[__irwzz¢¢¢¢¤¢¢¤¤¤¬¬¬°«¬´°´¸¸¸¸¾¸¸¾Â¾ÂÂÅÊÊÊÊÑÑÏÏÑÑÑÑ××Ñ×××××ÚÚÝÝÝÝÚ´M ,bzzzzwrwz¢¸ÊÑ×ÚÚÚÚÚÑÑÑÑÑ××Ú×Ú××ÚÚ××ÑÏŸ«zgg_bb_[[VQ[gb_gmmrwwrmgg_b_[[[_bbiiiiggggimbiibVM %%7Igz¢«¬¬¬¬¤bB+%%+9Vmz¢¤«°´°´°°°¬´´°´´´´°¬¬¤¢B33,9B=79+ %+,++,,,,3,7+%%,+=[zrI=mmB73+,%+,,+99II=+,=7 %%%,7=I9=+ =VB3BgzrV9=Mgbb¢z_z[b¢«wMQ_M9+,,+7FI97,MB3397=3+33,3,7IB=QQgrzzwzwzzzm[F3+B[[bimzwzz¢¢¢¢¤¤«¤«¬°¬¬¬´°´´¸¸¸¾¾¾ÂÂÂÂÅÊÊÊÅÊÏÑÏÏÏÑÑÑÑÑÑ××××ÚÚÚÚÝÝÝÚÅr 3izzzwzw¤¾ÊÏ×ÚÚÚÚ×ÑÑÑÑÑÑÑ××Ú×ÚÚ××ÑÑÊÅ´¢wggg_b_[[_V__[bimmmrmrmib_[__[___biigiggibbgbb_[VQ ,+9Igz¤«¬°°¬«zgI+%+7Mg««°¬°´°°¬´´´°´°°´´¬««¢rF737BF=3,3,++,,=,+3++,,,+%%,3bz_B9=zmI3,+++337FQF7%+39+%,+3,7F97% ,QI739=gmwmmbQQi[bz¾¬¤=,%,%+ 9M,9MM7,3¹3,3373733939MBIQVmzzzzzwwwm_73,Q[[birz¢¢¢¢¤¢¤¤«¬°¬°°´¸´´¸¸¸¾¾ÂÂÅÅÅÅÊÅÊÊÏÏÏÏÏÏÏÑÑ×ÑÑÑ××××ÚÚÚÝÚÚÏ, 7wzzwzzwzz¬ÂÏÑ××ÚÚ××ÑÏÏÏÑ×××ÚÚÚ×ÑÑÑÑÏŸ¬zmiigggb__b[bbbgiirwwriigb_[_[[_bgiiiigigi__bb_VQ[_ +3Iiw¤¬¬°¬¤¢iF+%%+7Mgz¢««¬°°°´°°°°°´´´´´°¬«¤zrB999FF7333+++3,+++3,,%37,7,3FzzV=,,MbFVI,,+,,37=IQI7,%77+%% +39BF7++M_9B9=_zmimwzwirgrwB=r¢´¾°_9+ % 7bB+9M=3,9=,99=9+799,3,93,779BFBIM[rwzzzzzzrgM93+M[[[gmz¢¢¢¢¢¤¢¤¤¬¬¬¬°°´°°´´¸¾¾Â¾¾ÂÂÅÅÅÊÊÏÑÏÏÏÏÑÑÑÑ×Ñ×Ñ××××ÚÚÚÝÝÚѬF%=zzzzzz°ÂÏÑ×ÚÚÚ×ÑÏÏÑÏÑÑ××Ú×Ú×××ÑÏÊ´¤rmiiiggg__b__bbmrwwwmiigg[_V[[_bgiiimggbb_____[QQQ %7M_¤«°¬««mF,% +3Mbz¢««°°°°°°°°°´°°°°°°¬«¢¢zwiQB99FF7,+++++,3,++,,7,%,+799I[I,%+7_VQQs,,3,,=QQB7,%+7,,+%+37BI=% +QbF3937I[Q_rwzzrmQ=Qz¬¸«z[=+%%3[V3+BF3=M=+9,7,333,7BFFQVbmzzzzzzwmM9,,V_[_imz¢¢¢¢¤¤««««¬¬°¬°°´´´¾¸¾¾¾ÂÂÂÂÅÅÅÊÊÏÏÑÊÏÏÏÑÑ×Ñ×Ñ×Ñ×××ÚÚÚÚÝÚÂi=zzz¬ÅÏÑ××××ÑÏÏÊÏÏÑ××ÚÚ××ÚÚ×ÑÏž¬wrmiiibigbbgbb_bmrrrwrmiiib_[[___bigigiggbi[__VVQQM %+3Imz¤«¬¬«¤¢mV7%%+=Mb¢¤¬°°¬¬¬°°¬¬¬¬¬«°°¬¤¤wrgI=797,%,,,,33,+,3++=,,BIMQI9,3+39mzQ[Q=,,,,+%,F[3%+,+++++79FB7% +MbV97,+3=Bgmzm_[M_z¤[I9[r7%3BI73,÷3B=B97B7939=,,33739IFIM[gmzzzzziF93,Q[_girz¢¢¢¢¤¤«¤«««¬¬°°¬´´¸¸¸¾Â¾¾ÂÂÅÅÅÊÊÊÏÏÏÏÏÏÏÑÑÑÑ×Ñ××Ú××ÚÚÚÚÝÚÏ Fzzz´ÅÏ××ÚÑÑÑÏÏÏÏÑÑ××ÚÚÚÚ××ÑÑÏ´¢wwrimggggbbbbbggiirrmmmig__[[__[bigiggig[_b_[[[QQQI +,Bg¤«¬¬«¤¢w[7+%,=Mbz¢««¬°¬°«¬«¬«««««««««¢¢zwF9,,9,,,3+33+,+,777,,,9Q__s,+,99g[M[_Q7+7+%+3MQ3·%+7,+%,,3=I3,3%,M_[=7,,,977BbwzrzimVQggmz«°´¤zrr=7=QM9333B,3=9IQM7s,F993,3+33BIFMQ[grwzwzzzm=9,9Q_bmmzz¢¢¢¢¤¤«««¬««¬´¸¸¾¸¾Â¾Â¾ÅÅÅÊÊÊÏÊÊÏÏÏÑÑÑÑÑ××Ñ×ÚÚ××ÚÚÝÝÚѤ= Mzzzz´ÊÏ×××ÚÑÑÏÊÊÏÏÑ××ÚÚ××××ÑÏʾ¬wwwwriigb[bb_bgbbgmrrmmrg_[[V[[_bgigggiib[__b[[[VVQQ %,Fbr¢«¬¬««¢w[3,%,7Bbw¤¬°°´°¬¬¬¬¬««¤«¬°¬««¢zB=9,73+,,3,,+,,33=3,,3BViI,++3,3,=_IM[[I,%733,9B7,7F7,,%33+333BQ7 7=9Q[Q³++%79B[wzmzbmgF7Mgr[i¢riwwgQB9FF,7BI[[I79337977,33,,7FIIIQ[irzzwzw_F7+9Q_bgmzz¢¢¢¢¢¤¢¤««¤¤«¬´°¸¸´´¾¾¾¾ÂÂÅÅÊÅÊÊÏÊÏÏÏÏÏÑÑÑÚÑÑ××××××ÚÚÚÚÚ×´V _zzz´ÊÏÑ×××ÑÑÏÊÊÏÑÑ×ÚÚÚÝ××ÑÏʰ¤zwwzrigg___bgbiiigmmrimgbb__[[[[_giigbiibbbgbQQV[VQQ %7=[m«¤¬¬«¤¤w[7% ,9Ibr¢¤¬¬°°´¬¬¬¬«¬«¬¬°°¬«¤¢r9FM,,,++,3+++,++,739,,7MF7+,,,3339bV[[VM9+3,37=3+,399+37,,,37,,QI%79F_gF,B7 %+3BIwrwzb[rF% %%3_V39=QFFzmrgiwgM[ib_9,+,7973,,3,=FIMVVgmwzzzzzz_I?Vbmgrzz¢¢¢¢¤¤««¤«¤«¬´°¸¸´¸¾¾¾¾Â¾ÂÂÅÅÅÊÊÊÏÏÏÏÏÏÑÑ×Ñ×Ñ×Ú×××ÚÚÚÚÚ×Åz %_zwzz¢¸ÊÏÑ×××ÑÏÏÊÊÏÏÑ××Ú×Ú××ÑÑʾ«zwrwzriiigbgbb[bbgimmmmmb[[[[[[_b_mmiggbgb__g_QVV_[[V %,I[r¤¤¬¬¬«¢wV,%%+9Ibw¢««°°°°°´°°°¬°¬´°°°««¢i7FM,+%+3,+7,,,++797,,33I,9,37977+7_VVMFw,,=BI7337B=+,7=+93,,3MB%,7VirB%=% +,B_iziizmMi_+ +Qi,%%++3gF39Irz¢wQB,ó993397,3737BFFQ__irwzzzzr[M7,I[_bgm¢¢««¤««««¬«°¬´´¸¸¸¸¾¾¾ÂÅÅÅÅÅÅÊÏÏÏÊÏÏÑÑÏÑÑÑ×××Ñ××××ÚÚÚ×Ï% %mzzzz¤¾ÊÏÑ×××ÏÏÊÊÊÏÑÑ×ÚÝÚ×Ú×ÑÏŸ«wwrzwmgigbb_g_bggiirmmi_bb_[VVV[_giiiig[bb[b[VVV[___Q%%,BQm¢¢«¬¬°¤¤¢wV7%+,9Ibz¢¤¬¬°¬¬´°°°°´°°´´°°¬¤¤ib9=F,+73,+,9,,,3,733+,+3,3737w,37MVQMFB7=7%BB33%,,F=,773,+ %%7B93%9Vmi7%7I7%97BQbwVrm[ibbrM+ %+Fz3%,,+MM+ ,II[IBIw«¤mmgF9FF77,w7+7779IIMV[_irzzwQF79QVgigw¢¢¢¤«««¤¬¬´°´°´´¸¸¾Â¾ÂÂÂÅÅÅÊÊÊÏÊÏÏÏÑÑÏÑÑÑÑÑ×Ñ×××Ú×ÚÚÚѰF ,z«¾ÊÏÑ×Ú×ÑÏÏÊÏÏÏÑ×ÝÚÚÚ×ÑÏÊ´wrrrrwrigigi[__giiiirgigb_[VVVQ[_ggiiigg[V_b__VVV__[[_ +9Mi¢¤¬¬«¬¬¤m[9%++9Ibz¢¤«¬°°´°°°°°°°°´°°¬¬««¢zb[97=+,7333+99,3,,33,++73,+,79B73,%9IIFF=,337·3,,3BF7+++,+, 79F97,3[rg3 =Q,+7=F[_rrIgr_Vz_w9%+,9zB ,+3V, %,FBB779Mg[=FgiVM3399=3+733FFIVVVbiwzzzbMF+9MQg_iw¢¢¢«¢¤¤«¤¬¬°¬°´´°¸¸¾Â¾ÂÂÂÅÅÅÅÊÊÊÏÏÏÏÏÏÑÑÑ×ÑÑ××××××××ÚÚ×¾_7w¤¾ÅÊÑ×××ÏÏÊÅÊÏÏÑÚÚÝÚ×ÑÑÏŸ¬wwwmwwiigggb[[bgbgigmgbgb_[VVVV_gbiggiii_[[[b_[[V_[V_[ % 3,Mb¤¬¬¬««¢rVB%%+FF_w¢¤¬«¬´°°°´°´°´´´´´°¬«¤¢ziV77,++3773++,,,,,3,,3,,9339Bs3+7BFIFB997,77=3,+397FF7+,%,% 3=%+,7[rbB% +VV=BIQ[bbzzbgzg[zw[+%+7zQ%+%IF% %¿9773FBI3=Igr_B979739,,,,=IBMVVbgmwzwzgQ=3IQbgbr¤¢¢¤¤¤««¬«¬¬¬°´´¸¸¾Â¾¾¾ÂÅÂÅÅÊÊÏÏÑÏÑÏÏÑÑÑÑÑ×××Ñ××××××××Ê 3z¤°ÂÊÑÑ×ÑÏÏÊÅÊÏÑÑÚÚÚ×××Ïʸ«zwwwrrrrmiiibb_V_gggbiib_VV[QV[__ggimiibgb[bb_b[[V[bb_b +,3Fg¢««¬¬«¤z_F%%39Fiw¤¬¬°°°°°°°´´°°´´°°¬¤¤m[779,+39B,+,++%,+773,33,39==7,+3,9BMBF9933,,7,3BFIB,3+%++%7I7+%,=ViFQ9 =i_BIQ[bgzwzzrbwwirzB+,9mb%++F7 ,+,BII=3+3MB37=9=FiB=7,,,3,339BFIQV[_irzzzwbQ7,QVgggw¢¢¤¢¤¤«¤¤«¬¬««¬°´¸¸¾¸Â¾¾¾ÅÅÅÅÅÊÅÊÊÑÑÏÑÏÏÑÑÑ××Ñ×××××Ñ×ÚÚ×Ï+ 9zz¬¾ÅÏÏÑÑÏÏÊÅÊÏÑ×ÚÚÚÚÑ×ÏÅ´¢zzwrrmrmmiigb[[[_bggbggbVVV[V[_bbibigggbg_[_g[__V[b[_bb%% %%++,,Mgw¢«¬««¤wb7+,3FFbw¤«¬°°°´´´°°°°°´¬°´°«¤¢¤wi_397+337F++3,++,+9,++3,3=IIB=3+3333BB=B=I7³++,,++79IV+%+%,,+9I,+%9Q_M=__7%,VmVFMbrbiwrzzbii_rwwzi3+3iw++39+%%,9F==9,3M=,9=93MVFB7+3,+++,9BIQV[_biwwzwVM73QVgggw¢¢¢¤«¤¤¤««¬¬°¬°´¸´¸¾¾Â¾ÂÂÅÅÅÅÊÅÊÏÏÏÏÏÏÑÑÑÑÑÑ×××××Ñ×Ú××ѰF =zz«´¾ÊÊÏÊÊÊÊÅÅÏÑ×ÚÚÚ××ÑÏž°¢zwwwzrrmmimggb[b__bbgi_[_QIQVVgbgiiibbbi____b___[[_V____%%%+ %+3Bbw««««¤z_B,,7BMbw¤«¬¬°°¬°°°°°°°´°´¬°««¢¢¢ri79793%33+++,+%+393,+3,9FFB=B,+37,3=F=7=BB,++37,333I[7+%++,3=B, +=_[=7VmV99=VggQMbM=Vggmi[I[rV,7Vr++7,+%,,=F7=+3F=9w+,9{773+,,,39MMQVVbiirwzzwiQF77V[gmi¢¢¢¢¢¢¤¤¢««¤¤««°°¸¸¸¸¸¸ÂÂÂÂÂÅÊÅÊÊÊÊÊÏÊÏÏÏÑÑÑÑÑ×Ñ×××Ñ××××××¾g Bz¬¸ÂÅÅÅÊÅÊÅÊÏÑ×ÚÚÚÚÑÑÏŸ«wrrrrmrrgmibb_[[bgbig_VMIIMV_bgiiiigbgb_[Vbb[_b_b_V_bbb % ,3B_r¢¤«««¢¢zbI7,39I[w¤««¬°°°°°°°°°¬´°´¬°«¤¤zr977=+,933%+%%%,3=,+,9FQVIB93,,7%,3F7=Bw373337,99I7%++,%+ó+,MmV39=bmQ733_iBFV[B_ribB»rM7[i793% %%BF7B3,+%9I9F733797F73,7+7339FMMV_imgrwzwzgQ9,=Q_bgrz¢¤¢¤¤¤¤«¤¤«««°´´´¸¸¾¾Â¾ÂÅÅÊÅÊÊÊÏÊÏÏÏÏÏ×ÑÑÑ××ÑÑ×××××××Ï3Mzz«¸¾¾¾¾ÂÂÂÊÏÑ×ÚÚÚ×ÑÏÏž¤wrrmmrmigib[__[[_ggg_[MFBIQ_bgiiigbg_g[[V[[__[__[g[_b_[%% %% %39[r¤«¬«¤¢ziF,,9=I_w¢«¬°°°°°¬¬°°´°°°´«¬«¢z73FF,%=3++,%%%+97337VbgV997,,,,+3¹9=9s,3=,,7+33FV+ ,,,3=7%,VbFMgbB%%9ig_rmVQF7BVrwmQ[_,9F= %%3B7,+9=7I977333,3=3,%7+,79=IQV[[mimrwww_I73IQbgmr¢¢¢«¤¤¤¤¢«««¬¬°´´¸¸¸¸¸ÂÂÂÂÅÅÊÅÅÊÊÏÏÏÏÑÏÑÑÑÑÑ×ÑÑÑÑ××Ñ×××ϬFQz¤¬°´´°¸ÂÊÏ×ÚÝÚ××ÑÏÊŸ¢zmrmirmiigbbVb[[_gggb_[QMFMQ[bgmmggbgg_V[V[_[_[bb[b__b_V++%%+ % ,9Vi¢«««¬«¢gV737BM[r¤«¬°°°°°°´¬°°°°´´«««¤¢¢g93VM739++%,%+,,,39IQb[I9333,+,+79BF=I9,7,,3=7977,,9Bg7++377,9B79VI¹FIirM%% FiwVrib[9BBribmr9_w+ +9·79,,B=F97,,773777,%,,39BIMVQ[_mmmwwzzzzzww[B7=M[bbmz¤¢¢¤¢¤«¬«¬«¬´°¸¸¾¸¸Â¾ÂÂÊÅÊÅÊÊÊÏÏÏÏÏÏÑÑÑÑ×××Ñ×××××××ÑÂi_wz¤«««°¾ÊÑ×ÑÝ×ÚÑÑÏŰ¢zmmimiiim_b_V[__bgbb_[[QMFQ[bgmmigbbgb[[VVb[[__g[__gg_[Q+,,,%% %+7Qg¢¤«««¢¤i[B77BM_w««¬°¬°¬´°¬°°°°°°´°««¤¤_B9bV7+7 %%+,%%97BV__M9,3%+,+,%+7»=93,9379F7+3,9_B%79=7+3MMQI799999Mmi9%%M¤¢wm¢ir[gVF9BBirwzwM¢% ,,79973,7=3=73,77,,337+,+,33BIVVQVgmrwrzzzzwmV93BQbbgiz¢¢¢¤¤¤«¤«¬«¬¬°°´¸¸¸¾¾Â¾ÂÅÅÅÅÊÅÊÏÏÏÑÏÏÑ×ÑÑ×Ñ×××Ñ××××××ÑÊgzrz¢°ÂÏÏ××ÝÚ××ÑÏʬwrrrmiggg__[V__bgg___VIIIVQ_bgmmiigb_b[[[V[V[b_b___b_[QI++% % %3Mg¤««¬¤¤r_B99FI[r¤««¬¬°°°°¬°°¬°°¬´°««¢¢¤b=bV77,%+%+++=MM[_M³,,3++++++3BI79I933,779FBBFI93+++FB37=3,+,Qbb=3,7779Fgz[7 %+IbmVmwmVQI93=3_zrzr««[%%7,393+,%3s,33,37,3++333%,39=IM[_bgmwwzwzzzzzrbM7+BV_brwz¢¢¢¤¢¢¤«¤¬¬¬°¬´¸¸´¸¾¾Â¾ÂÂÅÅÊÊÊÅÊÏÏÏÏÏÑÑÑÑ×××ÑÑÑ×Ñ×××××Ê«mwwrww¬ÂÏÑÚÚÝÚ××ÑÏŸ«zrmmmimgb_bV[[b_bbbb[VQMIMQVbgiimigb__[V[[V[[_bbb_[bg[VMF%%+%%+%37Fgw¤«¬¤¢¢z_F99=I_r«¤«¬°°°¬°¬°¬°´°´°°¬«¢¢«gBF_[,933++3%,FQQMB7,33,3,33,,,39FB7BMB9739¿3,3=I9I9%++3Mmi9+++373B_i_=B++3QbmriQF=+93IVr¬¬9 ,33993,++9=7,73,33,9+,,3,,3,7¿Q_biirwwwwzzzzzmVB77M__brz¢¢¢¢¤¤¬°¬°°´´´¸´¸¾¾ÂÂÂÅÅÅÅÊÊÊÊÏÑÏÑÑÑÑ××ÑÑÑÚ×ÑÑ××Ñ×××¾ziiirzrwwz¢´ÅÏÑÚÝÚÚÚ×ÏÊ´¤wrrrmig_bgb_[V[_gbb_VMVIIQVVgiggigb___[[VQ_V_____[bbg[VIF%%% ,++3F[r¢¤¢¢¤rbB39=MVr¢¤¬¬°°¬¬¬°°°°´°°´¬«¬¤¢¬i9M__377++3+,3797973393,3,37,+339B77MFB773,»77=39BFB7,%%3=VmV7++%+73FiibBBM+ 3,,77FbmQ9+33ÿz°«´¢i+,3339=,3+7wB33,37,,,+7,,+3+9BIMMVgmmmrwrzzzzzzzzgQ7,BVb[iw¢¢¢¤¢¬¬¬¬¬´°´´¸´¸¾¾Â¾ÅÂÂÅÊÊÊÊÊÏÑÑÑÑÑÑÑÑÑ××ÑÑ×××××××Êzzwbbgmrimmwrw¢´ÅÏ×ÚÝÝÚ×ÑÑʾ°¢zrmmmiiib__Q_[[gbg_VVVQIMQ[_bgiibg__[_VQV_VV[___[[_b[[QF=%%+ % %+ ,Mg«¢¤¢¢w[F99=M_m¢¤«¬¬°°°°¬¬°¬°°´°°°¤«¤¤b9FbF993++3+3+9333,,7,3,3++=,+,79=3=I·93B=M99,793397=9=,%+% +9[gB7,++,7MVwzm[7QM%,B3,++7Qr[9,79QM7[mw«««z7 %,,39,++%3F7373+3333++++,7,739BMIM[gmrrwrwzzzzm_B33BV__m¢¢¢¤¤«¤«¬«¬°°´´´¸´¾¾ÂÂÂÅÅÅÅÊÊÊÊÏÏÑÑÑÑÑÑÑ×ÑÑ××××Ñ×Ñ×Ú×Ѭwm[V[_m_gimirwwwz¢¾ÊÏ×ÝÚÝ××ÑÏŸ¤zrwmriibg_[[Q__gib_[QIMIMQ[_bbiiggigg__[V__[bbgb_[[_V[QIF9+%%+% %%3Ii¢¢¤¢¢w_IB=IVm¤¤¬¬°¬°°°°°°°°°°¬¬«¢¤_9I_=3=7,%+%+,,,3,3373,+,,7=7+3=I79BB97737=MMB9,,7937BF7,++%%++FgM3373++7FizwwmB7_=+++ =__3,7BV[B_BV[% 33397,%%+9s33++7,+,%,+,9,+39FIQQbimmmwwwwwzzzmMB73I[[ir¢¢¤¢¤«¤¬¬¬¬´¬°´¸¸¾¾¾¾ÂÅÅÅÅÊÊÊÊÏÊÏÏÏÑÑÑÑ×Ñ×Ñ×××××Ñ×Ú××¾riiVMQbg[[_bgigmiwwz«ÂÊÑÚÚÝÝ××ÑÊ´¤wrrmmgbb_[V_[__bbbbQMMQMQ[[bggigg_b_b[VVV_[__bgb_[bb[QMF7=%%% +%3Mi¢«¤«¤r[F9=BM_m¢«¬«¬°°°°¬°°°°´°°°««¤¢gBQ_BBI37+3+,,,37393,3,+,+,7,+9I=+BFsB_VI93+%3+,33,33,+%%+Q[7+773,,7Fbzzwi9BV=,7, ,,7Fww93,=gimgIIVzI+%3,7B9,%+%37,33,+%,,+,+,+37997FFIQ[bimrrwwwzzzzwwiF737QV_i¢¢¤¤¢«¤¤««««¬¬«´¸¸¸¾¸¾Â¾ÂÂÅÅÅÊÊÊÊÊÑÏÑ×ÑÑÑ××ÑÑ××××Ñ×××Ú×Êg[[MIMVgQQV___bbmmrwrzw°ÂÏÑ×ÚÝÝ××Ïž¬zrmigb_VQ[MVV_bgg[VMMBFIV[biiggg____b[QV[__gigg__[[[VIFB=7%%% %+3Fgr¢«¬°««¢m[F=BQ_i¢¢¬¬««°°°°¬°°°°´´°°«¢¤_FMbI=F+%%,,,33377+7,,3+3,3,33ù3FI=7,,79FMQI9,++3+%,773,+++%3QV,%3BB7,7=MzzI3FIB+% +,9=I[bF3+=[wz[[Q9 +33997%7+33,33,3,,,+%%%%+37=BFFMV_irmrwrrwzzzzrVB73=M[bm¢¢¢¢¢¢¤¤¤¤«««¬«´´´´¸¾¸¾¾¾ÂÂÅÂÅÊÊÏÏÏÑÑÑÑÑÑ×××ÑÚÑÑÚ××××ÚÚѬwVQMMFMMbIMQVVVb_bbggimmmrzwzzz¤¸ÅÏ×ÚÚÝÚ×ÑÊž¬wmigg[VMMMMV[_gbb[QMFFIQM[bmgg_b_[bb_[_[_[bggib[[_VVQI==7 % %+ +,F[m¤¬¬¬¬«¢zbB»IVm¢¤««¬«¬¬¬°°°°°´°´°««¤¢¢zwbQM_QI=+%%++,399B7,3739+,,,979FB37B3799MBIM973%,%+97,3,%+%+9MF++,=IM=7=Ibzir779ù++,9BMF9B3+=Vm[bg_w,%+33773+,+,3++,739++ %%+3+79BFBFMQ_gmrmrrwwzzzzzwbM3,3MV_bw¢¢¢¤¤¤¤««««««°°´´¸¾¾¾¾ÂÂÂÂÅÅÊÏÏÊÏÑÑÑÑÑÑ×Ñ×ÑÚ××××××ÚÚÚÚ¸bQQQI=IMFBQQMQ[V[[V_bgbimmrwwrwz¬ÂÊÑ×ÚÝÝÚÑÏʰ¤zwmgg[[VMIVQ[__b__VIIFIMVQbiiig___bb_[_[V[_iiii____Q_MMFy%%%% %+,=Vi«¬¬°¬¬¬¤iIBQmz¢¤¬««¬¬¬¬°°°´°´¸°°««¢mmQFQQQ9+%%+379B37,,+,,,3,,7=FF739BB=,3339B9BV973,3,,+,%,7,+++9939%99Bib___VzrQ73,=[I++7B3933,79QQB[mgzQ+%,,333, %,773+33+++,,%%,33,9IBIIMQ[imwrrwwrrwzzzmV3%3FQ[[m¢¢¤¤¤««¤««¬«¬¬´´¾¾¸¾Â¾¾ÂÂÅÊÊÊÊÏÏÑÏÑÏÑ×××ÑÑ×××××Ú×ÚÚÚÚÅ[IIMMIIVMBBFIMIMQ[MV[[b__bbiiigmmwwwww¢¢z¢´ÅÏÑÚÝÚÚ×ÑÏŸ«zmgb[VQQFQMQ[gbg[[VIBFIQ__gggb___b_[[[_[_[_gmigb__V[MMF9999 + % ,33Mi«¬¬°¬°¬¤rQ99=FQm¢¤«¬¬¬°¬°°°°°°´´°°«¤¤igVMQ_bB+%,++,B9,++%+3,+,,37ÿ7,,=F7777BQ9777,,,+,%%73%+%=,,33QF+Fwzmi_bwB937IbM+3F77=9,=IiM9[gr=%,+3733%%+77,+33%%3++%%+,,,3=FIIMV[gwrwzwrwrwrzwrzr[I3+9IV[gr¢¢¢¢¢¢¤¤««¤««¬°¬°´¸¾¸¸¾¾ÂÂÂÂÅÊÊÏÏÏÑÏÑÏÑÑÑ×Ñ×Ñ×Ñ×Ú×ÚÚÚÚÚÏVFMQQB[bMFIFFFFFIQMQMQ[_V[[__b_bbiimmmmrz¤¢¢¾ÊÑ×ÚÝÝÚ×Ñʾ°zri_V[QQQFMQVV[___QMFFMVVgbirg___[___b_V[__bbiib_b__MIIy79 %3+7Bb¢¤¬°°°¬«w_979IViz¢««¬«¬¬°°´°°¬°°´¬¬¬«¤zri_IM__F%%+%,³33,,,,,93,,7=M773,BF=3+37=F=BI33,,,+,373373,,,,IwB,IzwmbbzgzV939IVF3BIFII7Bi=,=FV_33++333+%%39,,+,+3,3%+%+%+9977FMMQQ_imrwzzwrwrwwwzzgI7%+=VV_mw¢¢¤¤«¬««¬¬¬¬¬°´¾¸¸¸¾¾¾ÂÂÅÅÅÊÊÊÏÏÑÏÏÑÑÑ×ÑÑ××××××ÚÚÚÚÚפ_IQVVF[_QIQMQMMMIQIIMQQVQQQQM[Q[_[b_gbbgmmzz¤¾ÊÑÚÚÚÝ××ÏŸ¤wi__VVQIIFMQ[bb__[QFIFM[bgbiig[__[b__[[V__gbigg_[g_VIIF97379 %% %%7Bm¢¤¬°°¬¬«wb97=MVi¤«««°¬¬°°°°¬¬°°°´°«¤¤zmiz[BQ[b9%,++3=9%++,,+3++,,39IF7,3,BF9373,3BI¿779977,,,,3+77933%33Fw, 3_w[M_imw¬rVM93,BMB[V_[Q_bw++739777773,++%+3B,+++,,,+,+,+3+999=IQMQ[grrwrwzzrwwwwzwr_9,,,F[bgw¢¢¢¤¤¤«¤«««««¬´´¸¸´¾¾¾¾ÅÅÅÊÊÊÊÊÏÏÏÏÑÑÑÑÑÑÑ×××××Ú×ÚÚÚÚ×´bFQQ[Q[_QQQQQMQQIQQMIIIFMIIMIMMQQQVM__[bbmirz¢¬¾ÊÑÚÝÝÚ×Ñʾ°zib_QMIIFIQQV_b[VVQMIIQV_biigbb__[___V[[[g[gimi_gbb[VMFIB9,37+%%% %,Fm««¬°°¬«mB9BFVgw¢¤««¬¬¬°¬¬´¬°´´´´¬¬¤¢¢r_mbF[[b9% +37,%%,,,+,,,,,BFFB3,,,û,,333»BF=7{9+++%,,33333,93BV% %BgbIQbb«irV+37Vg[mrb=[=,,3,,37733++%,33,+,++7+,%+7++,,99=IMMV_irwzwzzwwrzwwwrbB,+%3F_iiw¢¢¢¤¤¤««««¤««¬°´´¸´¸¸¾¾ÂÂÅÅÊÊÊÊÏÏÏÏÏÑÑÑ×ÑÑÑ×××××ÚÚ×ÚÚÚÅzMIVVQb_V[_[QVQQMVIMBIBIFIBÿIFMFIFMMIIQVbgrw¢«¤¢¤´ÅÏ×ÚÝÝÚ×ÏŸ¤mb[QIF9=FIMQ[_[QVMIMIQ_bbim_V_[____b_V[V[bggigV_b__QQMy337%%% +7Fg¢¤«°¬°¬«¢ziF7=IQiw¤¤«¬«¬°°°´°°°°°´´¬°«¤_QrbQ[__9%%+397+,3,,,+,+,,IFI=7,,77MI9,,3339FB9FB97FB97++%7373397773,3%%%%,MV_M_wr_¤zB=IVgb[iB77%%7,++,777FB3,++39,,+++%+%%+,+++77VVQ_girwwwwwwwzzwwiM7%%,FQiir¢¢¢¢¤¤¤«¤««¬°°°¸¸¸¸¾¾ÂÂÅÅÅÅÊÊÊÏÏÏÏÑÑÑÑ×Ñ×Ñ×ÑÑ×ÚÚ×ÚÚÚÏIFM[Qb[__b_[VQ[M_QQMMFIB9¿=F=BB»»QV[_iwzz«¬¬«¤«¸ÊÑ×ÚÚÚÚÑʾ°ri_QMIB9=FIMVVQMMQMIVQVbgimm_V[V[[_[__V[[_bggggb___VVIF99977=++ % +,Fg«¤°°´°«¢wF79FQgw¢¤««¬¬¬°¬°°°°´´´¸¬¬«¤¢rIQzbQQ[[3% 399,+3,3++%+,3=[=97++,,QM773,+7BB9=F¿B93%+,7=+77773,% + ,3,+9bg[gzrziIrViVgr_I3% 3+,,37393+,%,,33+++%%,++%+,++,3799FVVVbgmwwrrwwwwwzwwiM7% ,3MVgmz¢¢¢¢¤¤¤«¤««°¬°´¸¸¾¸¸¸¾ÂÂÅÊÅÅÊÊÑÏÏÏÑÑÑÑ×Ñ×××××××ÚÚ×ÚÚѬVFM[[g[bb__V___VVQVIVMMFIF=B=999733,739BIM[gimww¬¸¸¸´¬¢¢°¾ÊÑÑÚÚÚÑÏʾ¬zi_QMF=79BVQQ[VIIFIQMV_Vmmmig_[__[[V[bV[[V_bggigbb[[VMF=97777+++++%+,+%3Fg¢«¬°´´¬«¢mF=9I[bz¢¢¤««°°°°¬°¬¬°°´°´´°¬¤gB_ww_QQMV9%,,77%%%%,+%++39MQ7397,+,3FB73+37û97IB7=997++3=++9=99++,799, +Fmi_mzrir_g_MMbm_I,+,%+,,37=3,,,++7,,+%%+%+%%++%++3ÿI[[[ggiwmrwrwmzrwwr_B+%%3F[_gr¢¢¢¤¤«¤¤«°°°°´´¾¾¾¸¾ÂÅÅÅÊÊÅÊÊÏÊÏÑÑÑÑÑÑÑ×ÑÑ×××ÚÚÚÚÚ׸iIQ[V__ibbb_____[[[QVVMIIIBBw7377++333379BMQbbgw¬¾¾Â¾°¤¤°ÂÏÑ×ÚÚÚ×Ï´¤m_[MIBw9FQMQVQMMMMQ__biimiib[[[VQ[VVV[__[bggggbbb[_QI=9s73333,,,,73773Mi¤«°´´°¬«¢mI=9M[g¢¤««¬¬°¬¬°¬¬°´´´´°°¬¤¢gM[z[FBFF3%+7=3+%%,,+%+,9IF=9,7=7,,,BB7,++,BMF9y9s333,%+,7=7+,39,,%++MbmmrwgwimrM[_9BmrVB+%+%3,793,+7,,3,,+++,,++ ++,+++39BFQV[_iirrrwmwwrwzrrgF3+ +7M[grz¢¢¤¤¢¢««¬¬°°¬°¸´¸¸¾¸¾ÂÂÅÅÅÅÊÊÏÊÏÏÏÑÑÑÑÑÑ×Ñ×××××Ú×Ú×ÊMQV_b_bggggi_[b[[[V[QQMMFB=79,,,,3,,+379B[Vm¤´Â¾°¤¢¢¤¸ÂÏÑ××××Ñʰ¢ziVMIF999=IMMQQMMIIM[_bibrimig_[[[V[VQ[[_[bbbiibbbb[VMI999933,333,39797Im¢«¬°´´´¬¬¤mM=F[bw¤¤«¬¬°¬°°°¬°°´¸´´°¬¬«¤_[[z_F=93%%37+,,,,9++3B7979,,9B9+37¹3,,7BFB=7==973+99B=3,,+,%3=9=,373++%,,B[igm¤zgrg[_Mb[Ib_MI,+%++773+%+,,39+,+3%% +++%%,9BIFQ[bggrmzrrwwwzwzwiM7+%+3BQgm¢¢¢¤¤¤¤««°´°¬´´´´´¸¸¾ÂÅÅÂÅÅÏÊÏÊÏÏÏÏÑÏÑ××Ñ×Ñ××ÚÚÚÚ×ÚѤ[MV[__gmigggbggb__[_VQMMIIII7,33%%++ %+777B_z¬ÂÅÊŸ´«¢¢«¾ÅÑÑÑÚ××ÏŸ«i[QFIB999IIIMQVMMMIFIV[[_gmmgg__[V[_QQ[VV[[_gbmgib__VQIF9=77337,,9FBFFBBBFQgz¢«¬°´´´°°¬iV=BI[gw¤««¬°¬°¬¬«°´°´¸°°°«¤¢__ViFB93=+,37%,+++339=7,+333,7=,++,37=7++7FBF9=9997=737B7,%++ %%,BI9%+793,,,+%9_gg¤rwI[b_zwzmV=+%%7379,+%%3++++++% %,%%%+%,339FIFMV[bimrwrrwwwrzziV7+++,=M_ir¢¢¤¤¤«¤«°°¬°´´´¸´¾¾ÂÂÂÅÂÅÅÊÊÊÏÏÏÑÑÑÏÑÑ×××××××××Ú×××´gQV[_gbiiggbggggg__[VVQQQQFIF=7373,,%% %%,7Bg«¾ÂÊÊʾ«¬ÂÊÑ××Ú×ÑÏ´¢wbMFFMMQVVQFBBIQ[[ggriigb[[VVQQM[MQ_[__imgggg_[VQF99B77933999MQMMIIFFFVgz¬°°´¸´´´«r[F=M[iw¢¤««°°°°°¬¬¬°°¸¸°°¬¤¤¢zbgViIB779%%3B,+3339FB733++33799,,3,,7F=3,9F=7Fw99=373,++%+3+%+,9I93%7Q9,,,33%3QgrMQgrziiQ,+ %377+ +,+,+ ++,+,+%%+%3+,,39IIFQV_gimrrrrwwwrwwmb=,+++7M_bw¢¤¤««¬°´°¬°´¸¸¾¾¾¾ÂÂÅÅÅÅÊÊÏÊÏÑÏÑÑÏÑÑÑ×Ñ×Ñ××Ú×Ú×××ÊQV[__giigmmgggg_bb[b_[[VQIQIB9=9,33,3%%%3% +Br´ÂÊÏÏÑŸ¢¢´ÅÏÑ×××ÑÏž«z_VII79IFMMQMMIIBFIV_bmmmib_[VVMVQVV[QQV[bgimmrgb_[VIFB=I97377=IIQVQVMVMMQ[gw¤¬°¸¸¾´°«zbIBQVgw¢¤¬¬°°°°°¬¬°°°¸´¸°¬¬¤imb_rIF37,%737+,7,FMI=,++,+,,3=7,,773=77ù77BI97M7B33,3+,+73+%%+399,7[F39333 3Miwwg[_zg=_wi++++39,,3+3+,%,+++,%%%++3%+,,9IQMI[VggrwrwwmwzwzwwbI7+,+,BQbrz¤¢¤¤¤«¬¬¬¬°´´°¸¸¸¾ÂÂÅÂÅÅÊÅÊÊÏÏÏÏÏÑÑÑÑÑÑ×××××××ÚÚ×ÊVVV[_gbgmiiimimgbg_bb[VVVMMMFIw3+,,,,% ,Fr¸ÅÏÏÏÏ۬¾ÅÏÑ××ÑÑÏ´bIIBs=ÿMMMQQFFIMQ[_gmrmr[[Q[QVQVMQVQV[_ggimrib_V[VIIFF=Bw9=[[_[V[QQVV__rz¤«´¸´¸¸¬«wbIBI[gr¢«¬¬°¬¬°°°¬°¬¸´¾´¬¬¬«mr_mi_I3,,%3333779BM773337+,,733977,,3=7,9FF939BF777»3,3,,,,%,3++,%%7F77MI=7+,++++=Iiwrirgb[Vmw3+,3773%,+++,%% ++%%%33,+,+,7FMMMM[bgmrrwzrwrwrw_B,,%%+9I[mz¢¤¢¤««««¬«°°´°´¸¾¾Â¾ÂÅÅÅÅÅÊÊÏÊÏÏÏÑÑÑÏÑÑÑ×××××××ÚÚ׬gQQ__gbgiiiimimggbb___[[_[VMFIBù,+3,++%%%+Fi¸ÅÏÏÏϬ¢°ÂÅÏÑÑÑÑÏ´¤rQ=77w=FIFMMMIIFIIQ[_giiwgb[VQQIQVVQQQVMQ_gimrwggb[[VMIMMFB=77=__[_[QQ[[V[grz¤«°´´¸´°¤iMBQViw¤¤««°¬°°°°°°°´¸¸¸°¬¬«¢m_mz_QV,%%+33%9B=9=9,7,,3,,+7,3,7+7,7+797BFB37=BM99B9B=,,+3,,3+,777,% 7MF39M9733+33+BBBrz¢«¢r[gVgrzw7,,7,,+,++++,,++,++%+%%+++3=IMIIMQbirrwmwrwwzzri=,++=,9QVgwz¢¢¢¤¬««««¬¬°´´¸¸¾¾¾ÂÂÂÅÅÅÅÊÊÏÏÏÏÏÏÑÑÏÑÑ×ÑÑ××ÑÚ×ÚÚ×ÂwMQVVbgimmgiimigggg_b_Q[[VVMIQIB7,3%,%+,+Bi°ÂÅÊÏʾ¬«´ÂÅÏÏÏÑÊž¤wVB7w9B=IFIIMBBFFBIV[bgiimgb__VVQQIMQQMVV[[biwrrmigb_VQMIMFF=999BVV[_[[[[gb[gwz¤¬°´´¸´¬«¤rVIVbgr¢¤¤¬°°´°°°¬°¬´¸¸´´¬«¤¢rrbrzb_[9,+%%7+3=3,373,,33,333,,3333,33333BB9+,=IQ9=I=BB++,,++++3997,%%9MF7Fy7,+77BBBF_wbFVgwI3+37+3%,+++++++,+ %% +3,,,7=MMMIQ_ggwrrmwwwzwbI+% +,MM[brz¢¢¤¤«¤«¤¤«¬¬¬°´¸¸¾¾ÂÂÅÊÅÅÊÊÊÏÊÑÑÏÏÏÑÑ×ÑÑ××Ñ××××Ú××ÅMQV[b_gimimmimigbb_i_V[_[VVQIQIBB=9,,%,+++,Ir¬¾ÂÊÊʰ«¬¬¸ÂÅÊÊÏʾ´¬wQF777739=B=FMQFBFBFMMQbbgmmmibVQQQMMIMMMMV[_bgimwwbb__[VQQMVFB9FBVQV[[V[[bbgiz¤«°´´¸´´¬¤r[FQbgr¢««¬°°°°°°°°°´¸¸´´¬««gmbrzw[VQ=,++373,++,,377,,,3++773B333+,+,933,9=BM97B73=99++,,3+,7Bs ,=I9IB9BBB9=FM=FIgw_bwVIB3,37,++++%,++,,3+ %% %++7,,39FIMQQQiiiwzrwmzwwg=+%% ,=IVgmz¢¢¢¤¤¤¤¤¤««¬°´¸¸´¾¾¾ÂÂÂÅÅÅÊÊÊÊÏÏÏÑÏÏÑÑ×Ñ××××Ñ×××Ú×Ï¢bIQ[__gigmiimmriigbb[b[_[VMQQQIF=Fw,,7399Fm¤¸ÂÅÊÊŸ¾¸¸¸ÅÊÅÊÅ´¤w[B97733779FFFMMFBBFMIQVbiiiib_[QMFMIIMIIMQV_bbgirrrib__QQQVVQM=999FBVV[_[[[bbgir¤¬¬°´´¸´¬¤w_FQbgr¤¤«¬°°°°´¬´°°°¸¸´´°¬«¢bmgwzw[[Q77,37++,3,,33,,,3+3+,377=3333,3,+,+,39FFQ93973¿B,+,33%%79ù%,39=II,733=BV99BIV99IrIgzwz=3,+333,33+,77++%3+%+ %%,37,7=IIIQ[V[girrzwwrwm[=, +7MVgir¢¢¤¤¤¢«¤¬¬°¬°¸´¸¸¸¾Â¾ÂÅÅÊÅÏÊÏÏÏÑÏÑÑÏÏ××Ñ×ÑÏÑ×ÚÚ×Ñ´iMQV__iimimmiiiggbib_b_[_VQVVVMFFB33,,79Ib¢´ÅÊÊÊÅž¾¾ÂŸ¬¤z[Fs37377BFMBIB¿MMQ[_biii_bgQQMIIMQQMMQQV[biirrrgggg[VQQQQIF99==B=VV_[Vbbbgimw¤«¬´´¸´´°«w_F[[gw¤«¤¬°¬°°´´°´°¸¸¸´°°¬¤¤[[mzwr[VI,,,,9,,+,,3+39,,3,3+3737B9,+93773,+++399¹79,,FFQQ7337,+%,B=VI7+,,7FV339,7Fg[7,FV[FMwFIgwi7++,37,++3+,7+++,+++% ++,377BMIFFV_bigmwzwrrwr[9+ %+3=I[bgrzzz¢¢¢¤¤¤¢¢¤¤«¬´¬°´´´´¸¾¾¾ÂÂÂÅÅÊÊÊÏÏÏÏÏÑÑÑÑ×ÑÑ×ÑÑ×××ÚÚÑÅMQV[[[bgimrrmmiiggb_b_[_VVVVQMMIIBBBy79=I[¸ÂÅÊÊÊÊž¸¾´¬«¢wiMF77939ÿIF»FFVQb_bggggb__VQIFMIIMQVQQ[_igirwmib_[_VQQMMFF=9=FIFFQQV[___iimrw«¬°´´´´°¬«zgIM_gr¤¤««°°°°°°°´´´¸¸´°°¬«¢VMrwm[Q=+%,=,+,39,3,7,,,37,++3,3B3+73,333,7M9÷,+37IQ[V,+777+ +9=[bF,+,7=_M,9,,=_mI39Bi_gQBVgzr33,,,,3,,33,+%+++%+++3,,,99IIFMQ_gggmrzzwmrgM++ %,3BIQggrwz¢¢¤«¢¤¤«¬°¬¬°°°´¸¸¾¾ÂÂÂÅÅÊÊÊÊÏÏÏÏÑÑÑ×ÑÑ×××ÑÑ×××××ÏbQQV[b_ggimimigigi__bg_b_[bVQQIFVIIFBBBIIIM_´ÂÊÏÏÏÏÊÅ´´°¤¢wbVI9733797B=BII»BBMQV_bmiiig[[[MQMIQIMMQMQ[gbmrrrmgg___bV[QIBF=7=BIFFIIV_bbiimrzz«¬¬°´´°¬¬¢zgIQ_gr¤¤¬¬¬°¬°°°¸´´¸¸´°°¬«¢[Mzwg[M3++%73333,,,33%3,997++7,7B7,,,37,+,,3=BQ=FQ=+377Q[VV3,,,3,% 7IVm[B3,33Qb+,979Vm_79Fgw_7FQQ_mgM9+,7,+,+,++,3+++%+%%3%,B33=IMQMMbbggbimwwrgV9% + %7IV[giirzzzz¢¢¢¢¢¢¤«¤¬««¤¬¬¬°¸¸¸¾¾¾ÂÂÂÅÅÊÅÊÊÏÏÏÑÏÑÑ×Ñ×ÑÑÑÑ××ÚÚ×ѰiIVV[[_gbgiiigimgg_b[gbb[[[[QMMMQMIMIFMIIM[i¢´ÅÊÏÑÑÑÏʾ¸¬r[IIF97777FÿIIIBB9FMQQ[bimmggbbVVMVIIIIMMMM[bmimrmmigg_[__[QMIIBB»IBBQVbgrrrrrz¤¬¬°°°°¬¬¢zbQQ[ir¤¤«°«°°¬°°°´´¸´¸´°«¬¤¢bMwri_Q3+7%97+,377,39+37B77,3379B73+,,,7,,7F=QQBMI=,,7=IVVV=+++77+%,QF[gQ9=mB+7I9BVVMBMVwwB9M,7FbbB+3,+,,++333,++%+ %%+3,39FFMIQ[ibgmiiirgM7% , +,9M_bgimwwwzz¢¢¢¤¢¤«¤««¤¤«¬°¬´°´¸¾¾¾¾¾ÅÅÅÅÊÊÏÏÏÑÏÑÑÑÑÑ××ÑÑÑ×Ú××Ú×ÂzMMV[bg_bgiiigggmgg___bg__bb_QVQQMMIVMVQMV_r´ÅÏÑ×ÑÑÏŸ¬¤b_VM·737B=BMQIFFFBFIQV[bgiimggb[QIIIFIIMQMV[[bgimwrmggb_Vb[[QMIF9¿FB=7==Q_[grrwmwr¤««°°°°°«¢wmQQ_ir¢¤¬°¬¬¬°°°°´°¸´¸´°°«¤iIiwwgQ++,,33+,=9,,=7+,9s+73,79s3,%,,3+7F[Q=__=3,QV_Q9+,+,,++B[MFQF3_b3,FF97QMMFQ_iM[9 3MiF+7,+7,++77,%+%%+% % +%+37FIMQV[ggmgggVM9, ++9IV_ggimrwwzz¢¤¢¢¢¤¤««¤«¤«¬¬´°´¸¸¸¾¾ÂÂÅÅÅÊÊÊÏÏÊÏÑÑÑÑÑ×Ñ××××Ú××××ÊQVM[[__ggbiigggiibbbbgg_bbb[VQVVQVQ[[[VQQ_w¢´ÂÏÑ×ÑÑʰ¢r[VIIB997IFBIMI9FBFMVVVgbmiigg_[QMIFFBIMMMMV___mmwrriggg_V[_VIQF99B=FMMFB977QV_grmrrrmww¢¤«¬°°¬¬«¢wi[[_im««¬¬¬°°°°´°´´´¸´°¬¬«¢mFbziigI,%%+3%+,3939=++9B99,339F9F=7,%%,+3+3FQFBzV93,B=[b[[VI,%,+3+,Bb[;F37,FwQ+9BM3,[QIBViI[I%7F[[3%+ %%++33,%%%%,%%%%++,9=QQVQ_bb__[M=,,,%,,,=IVbgigmrwwwwzz¢¢¢¢¤¤«¤¤««¬°°¬´´¸¸¸¾¾¸ÂÂÅÅÅÊÅÏÊÏÏÑÑÑÑÑÑ×ÑÑ×ÑÚ××ÚÑÏ¢[MQVb_bbggggbggmmbg___b[bbb[[[VV[[_V_[[[V[w¢°ÅÏÑÑÑÊ´¤iVQFB=B979=I=MFIFBBIFQ[_giimggb_[bVIFFFFFBQQV[[_imrrrmigigg_[_QIIB7BB=FIFI7MV_gmmrriimw¤¬¬¬°¬°«¢wbV[bgm¢¤«¬¬´°°°°°´°´´¸´´°¬«¤mBVwmib=,%%+3+,,,=,,=9,39B9,+3,3+FMFB33%,3,,7MQB=b=3,7=MVbVV[=%+3,7,,__F+,93,,Izw=3»7[MVBFbIMF+9IBQ9++% +,33,+%+%%,,%,+++7FIMQVQ_[QB99I+%,% 39BV__gbimmwwwwzzz¢¤«««¬¬«°¬¬´´¸´¸¸¾ÂÂÂÂÅÅÊÅÊÏÏÏÏÑÑÑ××××ÑÑ××××××ѰgIMQ[b__bgbbgbgggggb_ib_bgbbVVVV[Vb[___[V[r°ÂÅÏÏʸ«zb[MMIM¿99BIIMQMIMIFIFVVbgiimriig[[[IIF=BI=FMQV[__irrrirmggbb[_QIIy=IFFFFF97,,BQV_gigggggw¢¤¬°´´°¬¤zg[Vbir¢«¬°°°°°´´´´´¸¸°¬°«¤¢wMVmgi[3++++,933s377+39F79++3,33MFF7,+,33+9VVB=_93,9BV[i_Q_M,+,73,+FmV= +779b[+7B7+IIQ[MmzmVF7=Q3FB3,+%37,3+%++,+,33++339BBIQQF973,,3%%,,79IQV[bgbimrwzzwzz¢¢¢¤¤««¬«¬¬¬¬¬°´´¸¸¸¾ÂÂÂÂÅÅÅÅÏÏÏÏÏÏÑÑÑÑÑÑÑÑ×××××Ñ×ÂQMQQ[bbggbgbiggigbbbggbggbb__b_bbbgg[_[_bm«¸ÅÅŸ«bVQFMVMIFF=FMIFIMMFIBIMQV_birmmrg__QMIMMFB=B=IMQ_b_gmrmrmmiigbb_[MFB9B=IFBBIFB=9++=FM[_[b_bbir¢«¬´´´°¬«iVV_br¤«¬°°°´´°´´°´¸¸´°¬««¢z_Vb__[3++,%++7,39,99,+,IF=7,,73,,MQ7+,337,,3IV99b=+%9FVMmiMi_=,+,3++7_gQ%%+9B3BB,I,79MIigmr¤zV+3B%7Q,% ++,+%%,=+%,,+,3377937773+%++%%+,3FMMV__bgiimrrwzzzzzzz¢¢¢¢¤¤¤«¤¬°¬°¬°°°¸¸¸¾¾¾ÂÂÅÊÊÅÊÊÏÏÏÏÑÑÏÑ×ÑÑÑ××××Ñ××ÏVMV[[[[bbbgggiiiigggigiibgb__ggbggmiggb__i¢¬°´´°¤_VVQ_V_MQBFIMMMMMIMIIFMI[__giwmiib[[IQMQQIF=B=IMVbggimzrmmmiggbb_VQBB=BMIB»,,7BIMV_V[__iwz¢«¬°°°¬«¤m[V_gr¢¤«¬°°°°°°¸´´´¸¸´°¬«««_MI[_I++33,+33+773993%,=B,333,M[7%+73,33BFF3BrQ7,3IQQizggi[F7,7,,+Im[+++7BB3Vm3BF77BIbrmrm«iB,9,3I, ,%+,=,+7,3,,+73,,,,33,%,,3% +,9=FQQ[biimmmimrwzzzzz¢¢¢¤«¤¬°°°°°´´´¸¸¾¸¾Â¾ÂÅÅÅÊÊÊÊÏÏÑÏÏ××ÑÑ×Ñ×ÚÑ××ÑѬbMQVV[[b_b_bbigmiibggiggbg__bbggmiiiiibigir¢¤¤¢r_[MQFQMMFMIMIMIIQQMIIFIQV[bgirrrbb[VVQFIMF»BFMQ_giiiwwrrwriggg[VQFBBBB9FF¿9,,,7B=IMV_Vb[imz¢«¬°°°°¬¤wb[_gm¢¤¬¬°°°´´´´´´´¸¸´°¬«¤gFIVM7+333+%+,,,33,7997F=I3,3337,Mg7+%337,97FF7ImM=+%3MgQiwgw_I79B7,,7iiB%F ,B97wM3V73=Q_zmrig=9 ,F7 ,,,+%%3733,+3,,,+%++++++%799BFMVIV__[bmmrwzz¢¢¢¤¤¤¤«¬°°°°°°´´¸¸¸¸Â¾ÂÅÅÅÊÅÏÊÊÏÑÑÑÑ×Ñ×Ñ×Ñ××××ÑѸrIMQ[V[[[bbbbbgmimgiiiiigggibiiiimrmmmgiigmwg[QVMFIIIMIMQVQVMIMIFFMQMQb_giimmg[[[FIFFFFB»IM_ggrirrwwwrrggbg[QIIFBB=9»BB793,,,37=BVQ[[_[bmz¤«°°¬°«¤zi[_irz¢¤¬¬¬°´´´¸´´¸¾´¸´°««¤i=MM7++,,3++3%3,7,9,,9=9=,793973Qi3+,77,37,=7[mI7,%77_birwbigI7,3+7B,bmb, , +M7=zBMI9=IVmzzbmbM73I%+++++,+++3,39+++3+%%%%+739=IMMQVV[__bgbimrwwzwzzzz¢¢¢¤¤«¤«¤¬°°°°´¸¸¸¸¸¾¾¾¾ÂÂÅÅÅÊÊÊÏÏÏÑ×ÑÑ×ÑÑ×××××ÚÚ×ÂIMQQVQ[b_bgbggigiimrmigb_gggmmiwrmrmmiimimrzzmgVVVQMQQMMVVQV[[MQQQMBFIQ[bgmggigg_[QMIBBBI9FQQbigmrrwrrrrmbggb[QIIF9BBy=7793,3339Q[Q[[[ir¤¤¬¬¬¬«¤zr_bmrw¤¬°¬°°´°´°´´´´¸¾´¬¤¤¤¢m=MM, ,7+,%+3,33,,3,99={,,B73Qi=+,97,37BFI9biB7%+,3__imwmgiM7,% 3[BQmI %,=M7Irg9BM77MwigIgmmg9+9++,3,3+++,++ %+%+%%,,339==FQQV[_VV_bimmwrwzzzwzzzzzz¢¤«¤¤¤¤«¬¬°°´¸´¸¸Â¸¾¾¾ÂÅÂÅÅÊÊÊÏÏÊÏÏÑ××ÑÑÑ×××××××Ï[FVQVV_[[bbbgggimgmimriigigbrmrwwrrrmmrrmmrmrwrmib_[QVVVQVQV_[VVMVVMMBIFMVV_bbiir[gQQIMFFBF=B»MQ_iiimmmrwzwwrimi_VMIFFB==9=B773,,,9779BIMQVV[bw¢¤¬¬¬¬«¤wmbbiwz¤««°°°°´°´´´´´¸´´¬««¢¢mQ,+,7+3,7IF3+,+937ÿ99yB=3IwM,%,3+3,=FI[_97%++7I[gbimzb3%,%,MbIim3%%3QQ=[_,MM3Fzz_zw=7_wirI39,,,799¹9,%++%%+%+39=BIFIQM[VV[b__gmrrrwwzzzzwzzz¤¤¢¤«¤«¬¬°°´´´¸¸¸¸¾¾¸Â¾ÂÂÅÊÊÅÊÊÏÏÏÑ××Ñ×ÑÑÑ×Ñ×××ѬgFQMMQ_[[b__bgbmmirmmrigiiimizrrwrwmzrmrmmirrmmigb[VV[[_[V[bb_V_[VMFIFMMMV__gmibb[VbQMFMIMF9BB9IM[gmgrmirwzrmmimg_[VMIIB==9=9=773s3997,BBMQVVQbww¢«¬°°°¬«zbbirz¢¤¬¬¬´´´´´´´°´¸´°°¬¤¢i=QF3393,+,99777++,39BBII9B79B9+=m_7%9,+3,9=Q__Q7,++%7I_m[Iwi3%,%3[[_wM+%99[I9wz93VM9bzbzb7=mrbV77,,+,,3+++%+% ,+799BFIIMVV[V_bggbimmrrwrwwwwzwzzzz¢¢¤¤««¤«°¬¬°°¸´¸¸¾¾¾¾¾¾ÂÂÅÊÅÅÊÏÏÏÏÑÑÑÑÑÑ×Ñ××××ÑѾMMIQVQV[_bbbggmimirmmmiimmrrwrwrrwmrrrwmmimggggb__[[[[bbb_gbb[VV[MMMQQQV[_ggggbgVM[MMVIIIBBB=MV_ggimwwwzrriigbbQQFIFB=B979,999799=IMQQQVmw¤«°´´´¬«¢zrgbmmz¤¤¬°¬´´°°´´¸´¸¸´´¬¬¤¤_B9II7737,9%,3,39 +,739F979I339779Qb=,3,+3339IbiB+3,%+,=gr[=izwM+%+ Fmimg9 %=MIVwb,7FBFrgmzgIQiM_B3%%%++M7 %%%,,+,77797BFMVV[[Vggimiimwrwwzzzzzzzzzz¢¢¢¤«¤¢««¬«¬¬°´°´´´¾¸¾¾¾ÂÅÂÂÅÊÊÊÊÏÏÏ××ÑÑ××ÑÑ×××××ÅQIIM[V_[_bb_bggmmmrmimmmmmwrzwwwrrmrrirwrmigigg_[__[[bgigggi_VV_VMIVQQQV_biib__[QQIMMIQIM=IFBFQ_bgzwmwzwwmiigg__VFFB==9793393733B9==BMMMM[mw¤¬°¸¾¸¸°«zmbim¢¤«¬°´°°´´°°¸¸¾¸´´°¬¤¢w[F9FF9IF3,+%37+,7,,7939B99=3BgM33,+,+,=Fgb7,+,+%3Bgmi=Iwzi7 %%%3gmgmF, +=bVrwF 3BIgriwzriVMBIF+%%%+%7,++%,39,,,7999BMMVV[bbirrmmmmmmrwwzzzzz¢¢¤¤¤«¤««¬¬°°°°°´¸¸¾¾¾¾ÂÅÅÂÅÅÊÊÊÏÑÑÑÑÑÑÑÑÑ×××××ÏVFIQQ[[_[bbggiirmmiimrmwrrrwwzzzwwrrwrrwmiigiggggbbb_gimiigbb_VVQMQQVVV_bbbbVMVMQIFFIMMFQIIMBMV[birrrwzzzwiimmb_QMFI999{77333937,,7799BB99B¿IQgr«´¾Â¾¾´«wibiw¤«¬°°´°´¸´´¸¸´¸¸°´¬¤wMF9,BI=37+3377,3,,+9939B797777BF9,7[b7,+,,%+BImg7,%%+++=_rr=7izM3++,3BibwMF+9V[bg3%+=IgirriVMF=7I,+,3 ,,,+,33+,77,37=FIQ[[_b_imrmwwrrzrwwwzzzzz¢¢¢¤¤¤¤«¬««°´°´´´´´¸¸¸¾¾ÂÅÂÅÅÅÊÊÊÏÏÑÑÑÑÑÏÑÑ×ÑÑ×ÑϬbFBIQQV[_bbgiiiiirrrrmmwwzwwrrzwrwmrrwmmmmgiiibgbb_gbiimrmiibb[VQIIMQV___bg_QMIQFFIFIFIIIIBIMM[bgmwrrzrwwmiggb_[QIBF9=797377,,3,73379993¹9FBFgw¢°ÂÂÊÊÊÅŸ¢igmw¢¤«°°°°´°´´´¾´¸¾¸´°¬[B79=7,993,7=9,,,,,937BB779977=B3MgV3%,37%=Vm9B%73,+9giwB3Qg973+%QrbwwFM= % 3BQIV+%+7VQ_iziB3,%=7%,3++3%73+,,333,99MQQ[_gbgmimmrrwrrrwwwwzzzzzz¢¤¢¢¤¤¤¤«««°°°´´´¸´¸¾¸¾¸¾ÂÂÅÅÅÅÊÊÅÏÏÏÑÑÑÑÑÑÑÑ××Ñ×ѾwFBMVQVb__ggiiiimmmmmrrwzwwrzzrmwwwrwrrrmimigggbbbgmrrmriig_[[[QVQ_[[bgbb_[VVIMFB=IFIFBQBFMMVgirrwrw¤rwwribbV[VQFF=y99B97999377333777737F»=I_z«¸ÅÊÏÊÊÊÅž°ibzrz¤«°°°°°´¸°´´¸¸¸¸´°¤wgQI97=7333,%+97,+7,,737BB9339=9=,+BVi9++++,=imB3 ,,,3FwmwF3BwV=7+,FVggMIM3 =VBQzM3 ,=IQ_ri=,+7F,+%%,7,99,333733=IMV[_gbiirmrrwwzrrrwrwwwzzz¢¢¢¤«¤¬¤¬«¬¬°°´°´´´¸¸¾¸¾ÂÂÂÅÊÊÊÊÊÊÏÏÏÏÑÑÏÑÏÊÏ××ÑÑÅIBQVQ[QQbgggmiirgimrrrrzrwzzrrwrrmrrwrmmrrigimgggimrwwwmig_b[VVQ[bbb_gbbV[MQBBFFIFFIFFbFIVQbgmrwzzzzwrmmmbb[VQIBB=79939773739B=3,7=337=9=IIiz¬¾ÊÊÊÊÊÅÊÊ´«mgmr¤¤¬°´´´°¸°°¸¸¸´¸´°«rg_77,39=3+73,,+,,7,79y9779IB39FiM%%+,3FrbB3+337+=wgI=gi=3+%%9Qgr[,MB% %3VQBmg9%+9VBMizmbM+7Q3%+++%+3337,79=IM[V__gggimrrwwrwwwrrrwzzwzz¢¢¤¢¢¤¤¬«¤¬°´°´´°°´¸¾¸¸¸¾ÅÅÊÅÅÅÏÅÏÊÊÏÏÏÑÑÑÏÑÑ×××ÑÊ¢VMMQQVVV[[VV[gmmigmirwzzzwzzwrwwwwmrrrrwiriiiiigmmrwrwrrmiib__VVV_b_bbgbgVVQMFBIBBMBBFIFFQ_[gimwzzzzwwmimi_[[MMFI9B79973799979FQ337793,7799=Fi´ÂÅÅÊÏÊÊÊÅÅ´«rirrz¢¢¤¬¬°¬¬°´´°´°¸´´°°°¤rmMFs%3=M9+9,3+37+BB77797=BB9BM9+33[_%%,,,QVF3+33,+FriBBIQwM,+%%,=bmg,=M9%%+MMFFiV++9[9VbrQQ__IV3+3 %%+%,739ÿMVV[[ggimmmmrrrrwwzwwwmwzzzzzzzzz¢¤¢¤¢««««¤«¬¬°°°¸°°´¸¸¾¾¸¾ÂÅÅÅÅÊÊÊÏÏÏÏÏÏÑÑÑÑÑ×××Ñ×Ѭg=IMQQ[bb_bbgiigiimrrzwwwwwzwwzwzrrwrrwmriimmmmmwwzzwwrriibb_____bbbg[_b[MMMMIFIIMIVMFMQQ[grrrzzzwwmimg[[VIM99,3=Bw3,3I_,33377339B799IiÂÂÅÅÊÊÊÏÅŸ°¤grr¢«¬°°°´°´´´°¸´´´°´««zwVF97,,,9B3,7=3,,=3QB9y777B==B%,3Vr=+3%+QQ=3+,+3,Qwr9BVIiQ,+%++3QgwI,9M=+%9QVBFmm9 3_IFVzi=_rmb+ %%%++,379FFMMVV_gimimmmrmmrwwwzrwwrzzzzzz¢¢¤¤¤¢««¤¤«¬¬°°°°´´´¸¸¾¾¸¾ÂÂÅÂÅÏÊÏÊÏÊÏÏÏÑÑÑÑÑÑÑ×××ѾBFIQQ[[miggbig_bmriwzrwzzwwzwwzwrrrrrwmrmimrrrmwwzzzzwrmig_[[__bigbbbQ[[QMQQVIIMQ_IIFQVQ[bimwzzwwgim__VQIF973337999I93ÿFMV,,7737337w9FiÂÂÅÅÊÊÏÊʸ´«gmw¢¤¬°°¬°¬°´°°´´¸´´¬¤«r_7++7=%%377,,F,3=B=7{9BMBFFQ3,+BiF77,,bgMI9+3,99[wr,9VIM_r=,+3%,Vgzi,,=M9+3M[FFMbV,,IM9VwVgmzQ3%% %+,,3=IMQ[_Vbbiiggiiwmmrzwwwrwwwzzzzz¢¢¤¤¤¤¤¤¤¤¤¬«°°¬¬°´´¸¾¸¸¸¾¾ÂÂÅÅÊÂÊÅÏÏÏÏÏÑÑÑÑÑÑÑÑÑ×ÑÅMMQFVVVV[ibggbgigirwrwwwwwrzwzwwrwwrrirrwrmrzzwwriib_____bggb[[VQ[Q[V[M[VIMMFMMMQ[bgrwzzrwiiibVVQQ=973,,,33793F9=FMQQ[_3377773779=FiÅÂÅÅÅÊÏÊÅž´«imw¢¢«¬°°°°°°´°´´´°¸°¬¬¤zg_37333+,9++797+I73399,9B7B9IVFQBQB979BIF7+3g[II7,339=Qiiz%3_MQF_3+%,7VzbM3,IF779_[==[7%7MMQmFQ_wwQ, % %++379=IMQ[V[_bggiiirwwrrrzwwzwwwzwzzzz¢¢¢¤¤¤¢¢¢¤¤««°°¬¬´°¸¸¸¸¸¾¾¾ÂÂÅÂÅÊÊÅÊÏÏÊÏÑÑÑÑÑÑÑÑÑ×ÑÏ¢_BMMQQVQV[_bibbigirrrrwzwzwzzzwzrrwrrwwwwzrwzzwrig__[[V__b_V[VVMMVMQ[VMVQIQIIM[[_iwwzzrmmib_[MIFB9B7,+,97779BB9BIM_[[_77,,3737979=bzÂÂÂÂÊÅÊÅž´¬irrz¢¤¬°°°°´´´°´´´¸¸°«¬wigVV73773+7+,+379,+7979F9=MQI[IMF337=BQ939M=F=,37=Mmrz++V_IFrrB, 39Qgg7333FF9M_[BB9=+37MIQiQ=Q_z_, ++%,=FIIMM[[__imgiimwrrwmzwwzzwzzzzzz¢¢¤¢¤¢¢¤¢¤«¬«°¬«¬°¸´¸¾¸¸¾¾¾ÂÂÂÅÅÊÊÊÊÏÏÊÊÏÏÑÑÑÏ××ÑÑ×ѰiIIMVVV[[_[bb_bggiirrwrrmwwzzzrwwrmwwzwzwrmggg[_g[__b[VQVMVIIVVVVQQQQMIQ[Vbmmwwzzwmmg_VQQB97377,77377937=BMQ[[[_[,,33333397937FVwÂÅÂÅÅÅÅÊž¸°¬gmm¢««°°¬°°°´´°´´´¸´¬¬rbbVM379B,%,%%,9=9,+9I93M7F=MMB_FIM3,77=QF7MB3F=,3F=9Qwww++I_IIMgzg=++9Mwzi93% %9=M[VI,++77=__IMVg[33737FIMM_QQ[_[bimmmmrwzwwrwwzzwzzwzz¢¢«¤¢¢¤¤¤««¤«¬¬¬°°´´¸¸¸Â¾¾ÂÂÂÅÅÂÊÏÅÏÏÊÏÏÏÑÑÑÏÑÑÑ×××¾zVIQQV[[[b[V_V_gimiwrrriwzwzzzwzwzzwzwwrg_[b[_[V_VQQIQQIM[VVVV[VQQQMMVg_imwzmg_VQMF997,7+7,7,779=FIQV_bgbb++3,7,3,=7,77=QmÂÂÅÅÅÅÅÅž¸°¤imw¢¢««°°´°´´´´´´´¸´´°¬¢zIV[=,9F=,%,++,=B=++7M37B9FF7B=MF=IFIV7777=VVFi¢w=,9I9%F=7Iwrr+ =[IQFM_w[97,Fbb3%,+%3=[BQI»,%7+9QmF9IMimbr[773=QQQMQ[QV[bbiiimrrrrrwwrwzzzzzzzzz¢¢¢¢¤¤«¤¢¢¤¤««¬¬¬¬¬´´´´¸¾¾Â¾ÂÂÂÂÂÊÅÅÊÊÊÊÏÏÑÑÑÑÑ×Ñ×××Åg[__Q[[__[VV[bbgmigmmwmwzzwzzzzzwzzrrib_[[b[VQVQMMIIIMV___V[[QVQVMV[_girwzwwg_[MMF37,,3,,7,379FFMQ[bbibb++737,3393,377Mm¸ÂÅÅÊÅÅž´°¢wimw¤¢¤°¬´´°´´°¸´´´´°°¬¢M__F97F3+%+%%7ù %7I+,IF=V9B=IF9FIFVB979IgbF¢[937MB%399Irrr3%,QMIBI=ww[93=_V,%373%,3FBQQBBF,%733Iw_,+=_gIQz[99IQQQQQ_V[[_ggiimmmmrrzwzwwwwzzzzz¢¢¢¤«¤¢¤¢«¤«««¬¬°¬´¸¸¸¸¸Â¾¾¾ÂÂÂÂÅÅÅÊÊÊÊÏÏÏÑÑÏÑ×ÑÑ×ÑÏwmmb__[_[[[_b_bbigiigwzzwzzwwig_V_[[VQMFMIFMFQVV[[[[[[QVQQQ[__gmwzzzwrg_VI9933+++3,379BIIQ_[biggii++737,3393,337Mm¸ÂÅÅÊÅÅÅ´°wimw¢¢¤°¬´´°´´°¸´¸´´°°¬¢M__B97F3+%,%%7ù %7I+,IF=V9B=IF9FIFVB979IgbF[977MB%399Irrr3%3QMMBI=ww_93=_V, 373%33FBMQBBF,%773Iwb,+=_gIQz[99IQQQQQ_[[[_ggiimmmrrmzwzwzzwwzzzz¢¢¤¢¤¤¤¢¤¢«««««¬¬°¬°¸¸¸¸¸Â¾¾¾ÂÂÂÂÅÅÅÊÊÊÊÏÏÏÑÑÏÑ×ÑÑÑÑÏwmmg__V[[[[[b_bbigiigzzwzzwwib_V[[[VQMFMIFMFQV[[[[[[[QVQQQ[__grwzzzwmg_VI9933+++3,379BIIQ_[biggii
\ No newline at end of file
1
0
https://svn.lrde.epita.fr/svn/oln/trunk/milena
Index: ChangeLog
from Thierry Geraud <thierry.geraud(a)lrde.epita.fr>
Better milena median.
* tests/median.cc: Update.
* mln/convert/to_dpoint.hh: New.
* mln/debug/println.hh (println): Add endl.
* mln/level/median.hh: New.
* mln/io/save_pgm.hh: New.
* mln/io/load_pgm.hh: New.
* mln/core/box.hh (len): New.
* mln/core/concept/box.hh: Likewise.
* mln/core/point.hh (zero): New.
* mln/core/dpoint.hh: Likewise.
* mln/core/concept/window.hh (dpoint, point): New.
* mln/core/window.hh,
* mln/core/rectangle2d.hh: Update.
* mln/core/concept/genpoint.hh: Remove dead line.
* mln/core/concept/dpoint.hh (operator+): New.
* mln/core/image2d_b.hh: .
* mln/core/internal/force_exact.hh: Avoid obj creation.
* mln/accu: New.
* mln/value/histo.hh: Rename as...
* mln/value/median.hh: ...this.
* mln/accu/histo.hh: Rename as...
* mln/accu/median.hh: ...this.
* mln/accu/median_alt.hh: New.
mln/accu/histo.hh | 20 +-
mln/accu/median.hh | 147 +++++++++-----------
mln/accu/median_alt.hh | 279 +++++++++++++++++++++++++++++++++++++++
mln/convert/to_dpoint.hh | 66 +++++++++
mln/core/box.hh | 13 +
mln/core/concept/box.hh | 6
mln/core/concept/dpoint.hh | 22 +++
mln/core/concept/genpoint.hh | 1
mln/core/concept/window.hh | 6
mln/core/dpoint.hh | 13 +
mln/core/image2d_b.hh | 32 +---
mln/core/internal/force_exact.hh | 6
mln/core/point.hh | 11 +
mln/core/rectangle2d.hh | 6
mln/core/window.hh | 61 ++++++++
mln/debug/println.hh | 1
mln/io/load_pgm.hh | 177 ++++++++++++++++++++++++
mln/io/save_pgm.hh | 74 ++++++++++
mln/level/median.hh | 136 +++++++++++++++++++
tests/median.cc | 230 ++++++++++++++++++--------------
20 files changed, 1092 insertions(+), 215 deletions(-)
Index: tests/median.cc
--- tests/median.cc (revision 1004)
+++ tests/median.cc (working copy)
@@ -30,155 +30,185 @@
* \brief Tests on mln::value::median<S>.
*/
+#include <cmath>
+
+#include <mln/core/image2d_b.hh>
#include <mln/value/int_u.hh>
-#include <mln/value/median.hh>
+#include <mln/level/fill.hh>
+#include <mln/level/median.hh>
+#include <mln/debug/println.hh>
+
+#include <mln/core/rectangle2d.hh>
+
+#include <mln/io/load_pgm.hh>
+#include <mln/io/save_pgm.hh>
-int main()
-{
using namespace mln;
using namespace mln::value;
- typedef set_<int_u8> S;
- median<S> m(S::the());
+int_u8 f(const point2d& p)
+{
+ return unsigned((2
+ + std::cos(float(p.row()))
+ + std::sin(float(p.col()))) * 63.9);
+}
+int main()
{
- unsigned vals[] = { 42, 69, 51, 12, 51, 12, 42 };
- unsigned n = sizeof(vals)/sizeof(unsigned);
- for (unsigned i = 0; i < n; ++i)
- {
- std::cout << "taking " << vals[i] << ':' << std::endl;
- m.take(vals[i]);
- std::cout << m << std::endl;
- }
+// typedef set_<int_u8> S;
- for (int i = int(n) - 1; i >= 0; --i)
- {
- std::cout << "untaking " << vals[i] << ':' << std::endl;
- m.untake(vals[i]);
- std::cout << m << std::endl;
- }
+// median<S> m(S::the());
- }
+// {
+// unsigned vals[] = { 42, 69, 51, 12, 51, 12, 42 };
+// unsigned n = sizeof(vals)/sizeof(unsigned);
- {
+// for (unsigned i = 0; i < n; ++i)
+// {
+// std::cout << "taking " << vals[i] << ':' << std::endl;
+// m.take(vals[i]);
+// std::cout << m << std::endl;
+// }
- unsigned vals[] = { 42, 69, 51, 12, 51, 12, 42 };
- unsigned n = sizeof(vals)/sizeof(unsigned);
+// for (int i = int(n) - 1; i >= 0; --i)
+// {
+// std::cout << "untaking " << vals[i] << ':' << std::endl;
+// m.untake(vals[i]);
+// std::cout << m << std::endl;
+// }
- for (unsigned i = 0; i < n; ++i)
- {
- std::cout << "taking " << vals[i] << ':' << std::endl;
- m.take(vals[i]);
- std::cout << m << std::endl;
- }
+// }
- for (unsigned i = 0; i < n; ++i)
- {
- std::cout << "untaking " << vals[i] << ':' << std::endl;
- m.untake(vals[i]);
- std::cout << m << std::endl;
- }
+ image2d_b<int_u8>
+ lena = io::load_pgm("lena.pgm"),
+ out(lena.domain());
+
+ rectangle2d rec(64, 64);
+ level::median(lena, rec, out);
+ io::save_pgm(out, "out.pgm");
}
- {
- unsigned vals[] = { 42, 42, 69, 69, 51, 51, 12, 12, 51, 51, 12, 12, 42, 42 };
- unsigned n = sizeof(vals)/sizeof(unsigned);
+// {
- for (unsigned i = 0; i < n; ++i)
- {
- std::cout << "taking " << vals[i] << ':' << std::endl;
- m.take(vals[i]);
- std::cout << m << std::endl;
- }
+// unsigned vals[] = { 42, 69, 51, 12, 51, 12, 42 };
+// unsigned n = sizeof(vals)/sizeof(unsigned);
- for (int i = int(n) - 1; i >= 0; --i)
- {
- std::cout << "untaking " << vals[i] << ':' << std::endl;
- m.untake(vals[i]);
- std::cout << m << std::endl;
- }
+// for (unsigned i = 0; i < n; ++i)
+// {
+// std::cout << "taking " << vals[i] << ':' << std::endl;
+// m.take(vals[i]);
+// std::cout << m << std::endl;
+// }
- }
+// for (unsigned i = 0; i < n; ++i)
+// {
+// std::cout << "untaking " << vals[i] << ':' << std::endl;
+// m.untake(vals[i]);
+// std::cout << m << std::endl;
+// }
+// }
- {
- unsigned vals[] = { 42, 42, 69, 69, 51, 51, 12, 12, 51, 51, 12, 12, 42, 42 };
- unsigned n = sizeof(vals)/sizeof(unsigned);
- for (unsigned i = 0; i < n; ++i)
- {
- std::cout << "taking " << vals[i] << ':' << std::endl;
- m.take(vals[i]);
- std::cout << m << std::endl;
- }
+// {
- for (unsigned i = 0; i < n; ++i)
- {
- std::cout << "untaking " << vals[i] << ':' << std::endl;
- m.untake(vals[i]);
- std::cout << m << std::endl;
- }
+// unsigned vals[] = { 42, 42, 69, 69, 51, 51, 12, 12, 51, 51, 12, 12, 42, 42 };
+// unsigned n = sizeof(vals)/sizeof(unsigned);
- }
+// for (unsigned i = 0; i < n; ++i)
+// {
+// std::cout << "taking " << vals[i] << ':' << std::endl;
+// m.take(vals[i]);
+// std::cout << m << std::endl;
+// }
+// for (int i = int(n) - 1; i >= 0; --i)
+// {
+// std::cout << "untaking " << vals[i] << ':' << std::endl;
+// m.untake(vals[i]);
+// std::cout << m << std::endl;
+// }
+// }
- {
+// {
- unsigned vals[] = { 42, 69, 51, 12, 51, 12, 42, 69, 51, 12, 51, 12, 42 };
- unsigned n = sizeof(vals)/sizeof(unsigned);
+// unsigned vals[] = { 42, 42, 69, 69, 51, 51, 12, 12, 51, 51, 12, 12, 42, 42 };
+// unsigned n = sizeof(vals)/sizeof(unsigned);
- for (unsigned i = 0; i < n; ++i)
- {
- std::cout << "taking " << vals[i] << ':' << std::endl;
- m.take(vals[i]);
- std::cout << m << std::endl;
- }
+// for (unsigned i = 0; i < n; ++i)
+// {
+// std::cout << "taking " << vals[i] << ':' << std::endl;
+// m.take(vals[i]);
+// std::cout << m << std::endl;
+// }
- for (int i = int(n) - 1; i >= 0; --i)
- {
- std::cout << "untaking " << vals[i] << ':' << std::endl;
- m.untake(vals[i]);
- std::cout << m << std::endl;
- }
+// for (unsigned i = 0; i < n; ++i)
+// {
+// std::cout << "untaking " << vals[i] << ':' << std::endl;
+// m.untake(vals[i]);
+// std::cout << m << std::endl;
+// }
- }
+// }
- {
- unsigned vals[] = { 42, 69, 51, 12, 51, 12, 42, 69, 51, 12, 51, 12, 42 };
- unsigned n = sizeof(vals)/sizeof(unsigned);
- for (unsigned i = 0; i < n; ++i)
- {
- std::cout << "taking " << vals[i] << ':' << std::endl;
- m.take(vals[i]);
- std::cout << m << std::endl;
- }
+// {
- for (unsigned i = 0; i < n; ++i)
- {
- std::cout << "untaking " << vals[i] << ':' << std::endl;
- m.untake(vals[i]);
- std::cout << m << std::endl;
- }
+// unsigned vals[] = { 42, 69, 51, 12, 51, 12, 42, 69, 51, 12, 51, 12, 42 };
+// unsigned n = sizeof(vals)/sizeof(unsigned);
- }
+// for (unsigned i = 0; i < n; ++i)
+// {
+// std::cout << "taking " << vals[i] << ':' << std::endl;
+// m.take(vals[i]);
+// std::cout << m << std::endl;
+// }
+// for (int i = int(n) - 1; i >= 0; --i)
+// {
+// std::cout << "untaking " << vals[i] << ':' << std::endl;
+// m.untake(vals[i]);
+// std::cout << m << std::endl;
+// }
+
+// }
+
+
+// {
+
+// unsigned vals[] = { 42, 69, 51, 12, 51, 12, 42, 69, 51, 12, 51, 12, 42 };
+// unsigned n = sizeof(vals)/sizeof(unsigned);
+
+// for (unsigned i = 0; i < n; ++i)
+// {
+// std::cout << "taking " << vals[i] << ':' << std::endl;
+// m.take(vals[i]);
+// std::cout << m << std::endl;
+// }
+
+// for (unsigned i = 0; i < n; ++i)
+// {
+// std::cout << "untaking " << vals[i] << ':' << std::endl;
+// m.untake(vals[i]);
+// std::cout << m << std::endl;
+// }
+
+// }
-}
Index: mln/convert/to_dpoint.hh
--- mln/convert/to_dpoint.hh (revision 0)
+++ mln/convert/to_dpoint.hh (revision 0)
@@ -0,0 +1,66 @@
+// Copyright (C) 2007 EPITA Research and Development Laboratory
+//
+// This file is part of the Olena Library. This library is free
+// software; you can redistribute it and/or modify it under the terms
+// of the GNU General Public License version 2 as published by the
+// Free Software Foundation.
+//
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+// General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this library; see the file COPYING. If not, write to
+// the Free Software Foundation, 51 Franklin Street, Fifth Floor,
+// Boston, MA 02111-1307, USA.
+//
+// As a special exception, you may use this file as part of a free
+// software library without restriction. Specifically, if other files
+// instantiate templates or use macros or inline functions from this
+// file, or you compile this file and link it with other files to
+// produce an executable, this file does not by itself cause the
+// resulting executable to be covered by the GNU General Public
+// License. This exception does not however invalidate any other
+// reasons why the executable file might be covered by the GNU General
+// Public License.
+
+#ifndef MLN_CONVERT_TO_DPOINT_HH
+# define MLN_CONVERT_TO_DPOINT_HH
+
+/*! \file mln/convert/to_dpoint.hh
+ *
+ * \brief Convertions to mln::Dpoint.
+ */
+
+
+namespace mln
+{
+
+ namespace convert
+ {
+
+ template <typename P>
+ mln_dpoint(P) to_dpoint(const GenPoint<P>& p);
+
+
+# ifndef MLN_INCLUDE_ONLY
+
+ template <typename P>
+ mln_dpoint(P) to_dpoint(const GenPoint<P>& p_)
+ {
+ const P& p = p_.force_exact_();
+ mln_dpoint(P) tmp;
+ for (unsigned i = 0; i < P::dim; ++i)
+ tmp[i] = p[i];
+ return tmp;
+ }
+
+# endif // ! MLN_INCLUDE_ONLY
+
+ } // end of namespace mln::convert
+
+} // end of namespace mln
+
+
+#endif // ! MLN_CONVERT_TO_DPOINT_HH
Index: mln/debug/println.hh
--- mln/debug/println.hh (revision 1004)
+++ mln/debug/println.hh (working copy)
@@ -74,6 +74,7 @@
std::cout << input(mk_point2d(row, col)) << ' ';
std::cout << std::endl;
}
+ std::cout << std::endl;
}
} // end of namespace mln::debug::impl
Index: mln/level/median.hh
--- mln/level/median.hh (revision 0)
+++ mln/level/median.hh (revision 0)
@@ -0,0 +1,136 @@
+// Copyright (C) 2007 EPITA Research and Development Laboratory
+//
+// This file is part of the Olena Library. This library is free
+// software; you can redistribute it and/or modify it under the terms
+// of the GNU General Public License version 2 as published by the
+// Free Software Foundation.
+//
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+// General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this library; see the file COPYING. If not, write to
+// the Free Software Foundation, 51 Franklin Street, Fifth Floor,
+// Boston, MA 02111-1307, USA.
+//
+// As a special exception, you may use this file as part of a free
+// software library without restriction. Specifically, if other files
+// instantiate templates or use macros or inline functions from this
+// file, or you compile this file and link it with other files to
+// produce an executable, this file does not by itself cause the
+// resulting executable to be covered by the GNU General Public
+// License. This exception does not however invalidate any other
+// reasons why the executable file might be covered by the GNU General
+// Public License.
+
+#ifndef MLN_LEVEL_MEDIAN_HH
+# define MLN_LEVEL_MEDIAN_HH
+
+/*! \file mln/level/median.hh
+ *
+ * \brief Median filter on an image.
+ */
+
+# include <mln/core/concept/image.hh>
+# include <mln/core/window2d.hh>
+# include <mln/accu/median.hh>
+
+
+namespace mln
+{
+
+ namespace level
+ {
+
+ /*! FIXME: Median the image \p ima with the values of the image \p data.
+ *
+ * \param[in] input The image to be filtered.
+ * \param[in] win The window.
+ * \param[in,out] output The output image.
+ *
+ * \warning The definition domain of \p ima has to be included in
+ * the one of \p data.
+ *
+ * \pre \p ima has to be initialized.
+ *
+ * \todo Test domain inclusion.
+ */
+ template <typename I, typename W, typename O>
+ void median(const Image<I>& input, const Window<W>& win,
+ Image<O>& output);
+
+
+# ifndef MLN_INCLUDE_ONLY
+
+
+ namespace impl
+ {
+
+ template <typename I, typename W, typename O>
+ void median(const I& input,
+ const W& win,
+ O& output)
+ {
+ dpoint2d dp = mk_dpoint2d(0, 1);
+
+ window2d
+ w_plus = win - (win - dp),
+ w_minus = (win - dp) - win;
+
+ accu::median_on<mln_value(I)> med;
+
+ point2d p;
+ mln_qiter(W) q(win, p);
+ mln_qiter(W) q_plus(w_plus, p);
+ mln_qiter(W) q_minus(w_minus, p);
+
+ for (p.row() = input.domain().pmin().row();
+ p.row() <= input.domain().pmax().row();
+ ++p.row())
+ {
+ // init
+ med.init();
+ p.col() = input.domain().pmin().col();
+ for_all(q)
+ if (input.has(q))
+ med.take(input(q));
+ output(p) = med;
+
+ // other col
+ for (++p.col();
+ p.col() <= input.domain().pmax().col();
+ ++p.col())
+ {
+ for_all(q_plus)
+ if (input.has(q_plus))
+ med.take(input(q_plus));
+ for_all(q_minus)
+ if (input.has(q_minus))
+ med.untake(input(q_minus));
+ output(p) = med;
+ }
+ }
+ }
+
+ } // end of namespace mln::level::impl
+
+
+ // facade
+
+ template <typename I, typename W, typename O>
+ void median(const Image<I>& input, const Window<W>& win,
+ Image<O>& output)
+ {
+ impl::median(exact(input), exact(win), exact(output));
+ }
+
+# endif // ! MLN_INCLUDE_ONLY
+
+ } // end of namespace mln::level
+
+} // end of namespace mln
+
+
+#endif // ! MLN_LEVEL_MEDIAN_HH
Index: mln/io/save_pgm.hh
--- mln/io/save_pgm.hh (revision 0)
+++ mln/io/save_pgm.hh (revision 0)
@@ -0,0 +1,74 @@
+// Copyright (C) 2001, 2002, 2003, 2004, 2005, 2006, 2007 EPITA
+// Research and Development Laboratory
+//
+// This file is part of the Olena Library. This library is free
+// software; you can redistribute it and/or modify it under the terms
+// of the GNU General Public License version 2 as published by the
+// Free Software Foundation.
+//
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+// General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this library; see the file COPYING. If not, write to
+// the Free Software Foundation, 51 Franklin Street, Fifth Floor,
+// Boston, MA 02111-1307, USA.
+//
+// As a special exception, you may use this file as part of a free
+// software library without restriction. Specifically, if other files
+// instantiate templates or use macros or inline functions from this
+// file, or you compile this file and link it with other files to
+// produce an executable, this file does not by itself cause the
+// resulting executable to be covered by the GNU General Public
+// License. This exception does not however invalidate any other
+// reasons why the executable file might be covered by the GNU General
+// Public License.
+
+#ifndef MLN_IO_SAVE_PGM_HH
+# define MLN_IO_SAVE_PGM_HH
+
+# include <iostream>
+# include <fstream>
+
+# include <mln/core/image2d_b.hh>
+# include <mln/value/int_u.hh>
+
+
+namespace mln
+{
+
+ namespace io
+ {
+
+ void save_pgm(const image2d_b<value::int_u8>& ima, const std::string& filename)
+ {
+ std::ofstream file(filename.c_str());
+ if (not file)
+ {
+ std::cerr << "error: cannot open file '" << filename
+ << "'!";
+ abort();
+ }
+ file << "P5" << std::endl;
+ file << "# olena" << std::endl;
+ file << ima.ncols() << ' ' << ima.nrows() << std::endl;
+ file << "255" << std::endl;
+ point2d p = mk_point2d(ima.domain().pmin().row(),
+ ima.domain().pmin().col());
+ size_t len = ima.ncols() * sizeof(unsigned char);
+ for (;
+ p.row() <= ima.domain().pmax().row();
+ ++p.row())
+ {
+ file.write((char*)(& ima(p)), len);
+ }
+ }
+
+ } // end of namespace mln::io
+
+} // end of namespace mln
+
+
+#endif // ! MLN_IO_SAVE_PGM_HH
Index: mln/io/load_pgm.hh
--- mln/io/load_pgm.hh (revision 0)
+++ mln/io/load_pgm.hh (revision 0)
@@ -0,0 +1,177 @@
+// Copyright (C) 2001, 2002, 2003, 2004, 2005, 2006, 2007 EPITA
+// Research and Development Laboratory
+//
+// This file is part of the Olena Library. This library is free
+// software; you can redistribute it and/or modify it under the terms
+// of the GNU General Public License version 2 as published by the
+// Free Software Foundation.
+//
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+// General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this library; see the file COPYING. If not, write to
+// the Free Software Foundation, 51 Franklin Street, Fifth Floor,
+// Boston, MA 02111-1307, USA.
+//
+// As a special exception, you may use this file as part of a free
+// software library without restriction. Specifically, if other files
+// instantiate templates or use macros or inline functions from this
+// file, or you compile this file and link it with other files to
+// produce an executable, this file does not by itself cause the
+// resulting executable to be covered by the GNU General Public
+// License. This exception does not however invalidate any other
+// reasons why the executable file might be covered by the GNU General
+// Public License.
+
+#ifndef MLN_IO_LOAD_PGM_HH
+# define MLN_IO_LOAD_PGM_HH
+
+# include <iostream>
+# include <fstream>
+# include <string>
+
+# include <mln/core/image2d_b.hh>
+# include <mln/value/int_u.hh>
+
+
+namespace mln
+{
+
+ namespace io
+ {
+
+ namespace internal
+ {
+
+ void abort()
+ {
+ std::cerr << " aborting." << std::endl;
+ exit(0);
+ }
+
+ bool read_pnm_header(std::istream& istr,
+ char& type,
+ int& nrows, int& ncols,
+ bool test = false)
+ {
+ // check magic
+ if (istr.get() != 'P' )
+ goto err;
+ type = istr.get();
+ if (type < '1' or type > '6')
+ goto err;
+ if (istr.get() != '\n')
+ goto err;
+
+ // skip comments
+ while (istr.peek() = '#')
+ {
+ std::string line;
+ std::getline(istr, line);
+ }
+
+ // get size
+ istr >> ncols >> nrows;
+ if (nrows <= 0 or ncols <= 0)
+ goto err;
+
+ // skip maxvalue
+ if (istr.get() != '\n')
+ goto err;
+ if (type != '1' and type != '4')
+ {
+ std::string line;
+ std::getline(istr, line);
+ }
+ return true;
+
+ err:
+ if (not test)
+ {
+ std::cerr << "error: badly formed header!";
+ abort();
+ }
+ return false;
+ }
+
+ void read_pnm_header(char ascii, char raw,
+ std::istream& istr,
+ char& type,
+ int& nrows, int& ncols)
+ {
+ read_pnm_header(istr, type, nrows, ncols);
+ if (not (type = ascii or type = raw))
+ {
+ std::cerr << "error: bad pnm type; "
+ << "expected P" << ascii
+ << " or P" << raw
+ << ", get P" << type << "!";
+ abort();
+ }
+ }
+
+
+ /// load_ascii.
+ template <typename I>
+ void load_pgm_ascii(std::ifstream& file, I& ima)
+ {
+ mln_fwd_piter(I) p(ima.domain());
+ for_all(p)
+ {
+ unsigned value;
+ file >> value;
+ ima(p) = value;
+ // FIXME: Test alt code below.
+ // file >> ima(p);
+ }
+ }
+
+
+ /// load_raw_2d.
+ template <typename I>
+ void load_pgm_raw_2d(std::ifstream& file, I& ima)
+ {
+ point2d p = mk_point2d(0, ima.domain().pmin().col());
+ size_t len = ima.ncols() * sizeof(mln_value(I));
+ for (p.row() = ima.domain().pmin().row();
+ p.row() <= ima.domain().pmax().row();
+ ++p.row())
+ {
+ file.read((char*)(& ima(p)), len);
+ }
+ }
+
+
+ } // end of namespace mln::io::internal
+
+
+ image2d_b<value::int_u8> load_pgm(const std::string& filename)
+ {
+ std::ifstream file(filename.c_str());
+ if (not file)
+ {
+ std::cerr << "error: file '" << filename
+ << "' not found!";
+ abort();
+ }
+ char type;
+ int nrows, ncols;
+ internal::read_pnm_header('2', '5', file, type, nrows, ncols);
+ image2d_b<value::int_u8> ima(nrows, ncols);
+ if (type = '5')
+ internal::load_pgm_raw_2d(file, ima);
+ else
+ if (type = '2')
+ internal::load_pgm_ascii(file, ima);
+ return ima;
+ }
+
+ } // end of namespace mln::io
+
+} // end of namespace mln
+
+
+#endif // ! MLN_IO_LOAD_PGM_HH
Index: mln/core/dpoints_piter.hh
Index: mln/core/box.hh
--- mln/core/box.hh (revision 1004)
+++ mln/core/box.hh (working copy)
@@ -88,6 +88,11 @@
*/
P& pmax();
+ /*! \brief Give the length of the \p i-th side.
+ * \pre i < dim
+ */
+ unsigned len(unsigned i) const;
+
/*! \brief Constructor without argument.
*/
box_();
@@ -151,6 +156,14 @@
}
template <typename P>
+ unsigned
+ box_<P>::len(unsigned i) const
+ {
+ mln_precondition(i < P::dim);
+ return 1 + pmax_[i] - pmin_[i];
+ }
+
+ template <typename P>
box_<P>::box_()
{
}
Index: mln/core/point.hh
--- mln/core/point.hh (revision 1004)
+++ mln/core/point.hh (working copy)
@@ -35,6 +35,7 @@
# include <mln/core/concept/point.hh>
# include <mln/core/internal/coord_impl.hh>
+# include <mln/fun/all.hh>
namespace mln
@@ -92,6 +93,9 @@
*/
void set_all(C c);
+ /// Give the origin (all coordinates are 0).
+ static const point_<n,C>& zero();
+
protected:
C coord_[n];
};
@@ -133,6 +137,13 @@
coord_[i] = c;
}
+ template <unsigned n, typename C>
+ const point_<n,C>& point_<n,C>::zero()
+ {
+ static const point_<n,C> zero_(all(0));
+ return zero_;
+ }
+
# endif // ! MLN_INCLUDE_ONLY
} // end of namespace mln
Index: mln/core/rectangle2d.hh
--- mln/core/rectangle2d.hh (revision 1004)
+++ mln/core/rectangle2d.hh (working copy)
@@ -56,6 +56,12 @@
struct rectangle2d : public Window< rectangle2d >,
public internal::set_of_<dpoint2d>
{
+ /// Point associated type.
+ typedef point2d point;
+
+ /// Dpoint associated type.
+ typedef dpoint2d dpoint;
+
/*! \brief Piter type to browse a rectangle such as: "for each row
* (increasing), for each column (increasing)."
*/
Index: mln/core/concept/genpoint.hh
--- mln/core/concept/genpoint.hh (revision 1004)
+++ mln/core/concept/genpoint.hh (working copy)
@@ -60,7 +60,6 @@
*/
template <typename E>
struct GenPoint
- // : virtual internal::object_<E>
{
/*
Index: mln/core/concept/box.hh
--- mln/core/concept/box.hh (revision 1004)
+++ mln/core/concept/box.hh (working copy)
@@ -52,6 +52,7 @@
/*
const point& pmin() const;
const point& pmax() const;
+ unsigned len(unsigned i) const; // FIXME: Doc!
*/
/*! \brief Return the bounding box of this point set.
@@ -102,10 +103,7 @@
std::size_t count = 1;
typedef typename E::point P; // helps g++-3.3.5
for (unsigned i = 0; i < P::dim; ++i)
- count *- exact(this)->pmax()[i]
- + 1
- - exact(this)->pmin()[i];
+ count *= exact(this)->len(i);
return count;
}
Index: mln/core/concept/dpoint.hh
--- mln/core/concept/dpoint.hh (revision 1004)
+++ mln/core/concept/dpoint.hh (working copy)
@@ -78,6 +78,19 @@
D operator-(const Dpoint<D>& rhs);
+ /*! \brief Add the couple of delta-points \p lhs and \p rhs.
+ *
+ * \param[in] lhs A delta-point.
+ * \param[in] rhs Another delta-point.
+ *
+ * \return A delta-point (temporary object).
+ *
+ * \relates mln::Dpoint
+ */
+ template <typename D>
+ D operator+(const Dpoint<D>& lhs, const Dpoint<D>& rhs);
+
+
/*! \brief Equality comparison between a couple of delta-point \p lhs
* and \p rhs.
*
@@ -149,6 +162,15 @@
return tmp;
}
+ template <typename D>
+ D operator+(const Dpoint<D>& lhs, const Dpoint<D>& rhs)
+ {
+ D tmp;
+ for (unsigned i = 0; i < D::dim; ++i)
+ tmp[i] = exact(lhs)[i] + exact(rhs)[i];
+ return tmp;
+ }
+
template <typename Dl, typename Dr>
bool operator=(const Dpoint<Dl>& lhs, const Dpoint<Dr>& rhs)
{
Index: mln/core/concept/window.hh
--- mln/core/concept/window.hh (revision 1004)
+++ mln/core/concept/window.hh (working copy)
@@ -47,6 +47,9 @@
struct Window : public Object<E>
{
/*
+ typedef point;
+ typedef dpoint;
+
typedef qiter;
typedef fwd_qiter;
typedef bkd_qiter;
@@ -66,6 +69,9 @@
template <typename E>
Window<E>::Window()
{
+ typedef mln_point(E) point;
+ typedef mln_dpoint(E) dpoint;
+
typedef mln_qiter(E) qiter;
typedef mln_fwd_qiter(E) fwd_qiter;
typedef mln_bkd_qiter(E) bkd_qiter;
Index: mln/core/dpoint.hh
--- mln/core/dpoint.hh (revision 1004)
+++ mln/core/dpoint.hh (working copy)
@@ -35,6 +35,7 @@
# include <mln/core/concept/dpoint.hh>
# include <mln/core/internal/coord_impl.hh>
+# include <mln/fun/all.hh>
namespace mln
@@ -86,12 +87,15 @@
/*! \brief Constructor; coordinates are set by function \p f.
*/
template <typename F>
- dpoint_(F f);
+ dpoint_(F f); // FIXME: Bound parameter!
/*! \brief Set all coordinates to the value \p c.
*/
void set_all(C c);
+ /// Give the null delta-point (all coordinates are 0).
+ static const dpoint_<n,C>& zero();
+
protected:
C coord_[n];
};
@@ -133,6 +137,13 @@
coord_[i] = c;
}
+ template <unsigned n, typename C>
+ const dpoint_<n,C>& dpoint_<n,C>::zero()
+ {
+ static const dpoint_<n,C> zero_(all(0));
+ return zero_;
+ }
+
# endif // ! MLN_INCLUDE_ONLY
} // end of namespace mln
Index: mln/core/window.hh
--- mln/core/window.hh (revision 1004)
+++ mln/core/window.hh (working copy)
@@ -34,8 +34,11 @@
*/
# include <mln/core/concept/window.hh>
+# include <mln/core/concept/genpoint.hh>
# include <mln/core/internal/set_of.hh>
# include <mln/core/dpoint.hh>
+
+# include <mln/convert/to_dpoint.hh>
# include <mln/fun/all.hh>
@@ -56,6 +59,12 @@
struct window_ : public Window< window_<D> >,
public internal::set_of_<D>
{
+ /// Point associated type.
+ typedef mln_point(D) point;
+
+ /// Dpoint associated type.
+ typedef D dpoint;
+
/*! \brief Piter type to browse the points of a generic window
* w.r.t. the ordering of delta-points.
*/
@@ -90,6 +99,25 @@
};
+ // FIXME: Move both ops below to mln/core/concept/window.hh
+
+ /// Shift a window \p win with a delta-point \p dp.
+ template <typename W>
+ window_<mln_dpoint(W)> operator+(const Window<W>& win,
+ const mln_dpoint(W)& dp);
+
+ /// Shift a window \p win with the delta-point (-\p dp).
+ template <typename W>
+ window_<mln_dpoint(W)> operator-(const Window<W>& win,
+ const mln_dpoint(W)& dp);
+
+ /// Substract \p rhs from \p lhs.
+ // FIXME: Give details!
+ template <typename Wl, typename Wr>
+ window_<mln_dpoint(Wl)> operator-(const Window<Wl>& lhs,
+ const Window<Wr>& rhs);
+
+
# ifndef MLN_INCLUDE_ONLY
@@ -112,6 +140,39 @@
return false;
}
+ template <typename W>
+ window_<mln_dpoint(W)> operator+(const Window<W>& win,
+ const mln_dpoint(W)& dp)
+ {
+ window_<mln_dpoint(W)> tmp;
+ mln_qiter(W) q(win, W::point::zero());
+ for_all(q)
+ tmp.insert(convert::to_dpoint(q) + dp);
+ return tmp;
+ }
+
+ template <typename W>
+ window_<mln_dpoint(W)> operator-(const Window<W>& win,
+ const mln_dpoint(W)& dp)
+ {
+ return win + (-dp);
+ }
+
+ template <typename W, typename Wr>
+ window_<mln_dpoint(W)> operator-(const Window<W>& lhs,
+ const Window<Wr>& rhs)
+ {
+ window_<mln_dpoint(W)> tmp;
+ mln_qiter(W) q(lhs, W::point::zero());
+ for_all(q)
+ {
+ mln_dpoint(W) dp = convert::to_dpoint(q);
+ if (not exact(rhs).has(dp))
+ tmp.insert(dp);
+ }
+ return tmp;
+ }
+
# endif // ! MLN_INCLUDE_ONLY
} // end of namespace mln
Index: mln/core/image2d_b.hh
--- mln/core/image2d_b.hh (revision 1004)
+++ mln/core/image2d_b.hh (working copy)
@@ -180,7 +180,7 @@
allocate_();
std::memcpy(this->buffer_,
rhs.buffer_,
- ncells() * sizeof(value));
+ ncells() * sizeof(T));
}
// assignment
@@ -199,7 +199,7 @@
allocate_();
std::memcpy(this->buffer_,
rhs.buffer_,
- ncells() * sizeof(value));
+ ncells() * sizeof(T));
return *this;
}
@@ -233,7 +233,7 @@
image2d_b<T>::nrows() const
{
mln_precondition(this->has_data());
- return 1 + b_.pmax().row() - b_.pmin().row();
+ return b_.len(0);
}
template <typename T>
@@ -241,7 +241,7 @@
image2d_b<T>::ncols() const
{
mln_precondition(this->has_data());
- return 1 + b_.pmax().col() - b_.pmin().col();
+ return b_.len(1);
}
template <typename T>
@@ -249,10 +249,7 @@
image2d_b<T>::ncells() const
{
mln_precondition(this->has_data());
- std::size_t s = 1;
- s *= nrows() + 2 * bdr_;
- s *= ncols() + 2 * bdr_;
- return s;
+ return vb_.npoints();
}
template <typename T>
@@ -260,10 +257,7 @@
image2d_b<T>::owns_(const point2d& p) const
{
mln_precondition(this->has_data());
- return p.row() >= vb_.pmin().row()
- && p.row() <= vb_.pmax().row()
- && p.col() >= vb_.pmin().col()
- && p.col() <= vb_.pmax().col();
+ return vb_.has(p);
}
template <typename T>
@@ -304,17 +298,19 @@
{
update_vb_();
unsigned
- nr = nrows() + 2 * bdr_,
- nc = ncols() + 2 * bdr_;
- buffer_ = new T[ncells()];
+ nr = vb_.len(0),
+ nc = vb_.len(1);
+ buffer_ = new T[nr * nc];
array_ = new T*[nr];
- T* buf = buffer_ - (b_.pmin().col() - bdr_);
+ T* buf = buffer_ - vb_.pmin().col();
for (unsigned i = 0; i < nr; ++i)
{
array_[i] = buf;
buf += nc;
}
- array_ -= b_.pmin().row() - bdr_;
+ array_ -= vb_.pmin().row();
+ mln_postcondition(vb_.len(0) = b_.nrows() + 2 * bdr_);
+ mln_postcondition(vb_.len(1) = b_.ncols() + 2 * bdr_);
}
template <typename T>
@@ -328,7 +324,7 @@
}
if (array_)
{
- array_ += b_.pmin().row() - bdr_;
+ array_ += vb_.pmin().row();
delete[] array_;
array_ = 0;
}
Index: mln/core/internal/force_exact.hh
--- mln/core/internal/force_exact.hh (revision 1004)
+++ mln/core/internal/force_exact.hh (working copy)
@@ -50,11 +50,11 @@
\
E& force_exact_() const \
{ \
- static const E exact_obj; \
- static const Type& exact_obj_ref = exact_obj; \
+ static const E* exact_obj; \
+ static const Type& exact_obj_ref = *exact_obj; \
static const int exact_offset = \
(const char*)(void*)(&exact_obj_ref) \
- - (const char*)(void*)(&exact_obj); \
+ - (const char*)(void*)( exact_obj); \
return *(E*)((char*)(this) - exact_offset); \
}
Index: mln/accu/histo.hh
--- mln/accu/histo.hh (revision 0)
+++ mln/accu/histo.hh (working copy)
@@ -25,8 +25,8 @@
// reasons why the executable file might be covered by the GNU General
// Public License.
-#ifndef MLN_VALUE_HISTO_HH
-# define MLN_VALUE_HISTO_HH
+#ifndef MLN_ACCU_HISTO_HH
+# define MLN_ACCU_HISTO_HH
/*! \file mln/value/histo.hh
*
@@ -43,7 +43,7 @@
namespace mln
{
- namespace value
+ namespace accu
{
@@ -58,7 +58,7 @@
void take(const value& v);
void untake(const value& v);
- void clear();
+ void init();
std::size_t operator()(const value& v) const;
std::size_t operator[](std::size_t i) const;
@@ -86,7 +86,7 @@
/*! Generic histogram class over the set of values of type \c T.
*/
template <typename T>
- struct histo_on_type : public histo_on_set< set_<T> >
+ struct histo_on_type : public histo_on_set< value::set_<T> >
{
histo_on_type();
};
@@ -127,9 +127,10 @@
template <typename S>
void
- histo_on_set<S>::clear()
+ histo_on_set<S>::init()
{
std::fill(h_.begin(), h_.end(), 0);
+ sum_ = 0;
}
template <typename S>
@@ -180,6 +181,7 @@
{
mln_viter(S) v(h.vset());
for_all(v)
+ if (h(v) != 0)
ostr << v << ':' << h(v) << ' ';
ostr << std::endl;
return ostr;
@@ -190,7 +192,7 @@
template <typename T>
histo_on_type<T>::histo_on_type()
- : histo_on_set< set_<T> >(set_<T>::the())
+ : histo_on_set< value::set_<T> >(value::set_<T>::the())
{
}
@@ -198,9 +200,9 @@
# endif // ! MLN_INCLUDE_ONLY
- } // end of namespace mln::value
+ } // end of namespace mln::accu
} // end of namespace mln
-#endif // ! MLN_VALUE_HISTO_HH
+#endif // ! MLN_ACCU_HISTO_HH
Index: mln/accu/median.hh
--- mln/accu/median.hh (revision 0)
+++ mln/accu/median.hh (working copy)
@@ -25,21 +25,21 @@
// reasons why the executable file might be covered by the GNU General
// Public License.
-#ifndef MLN_VALUE_MEDIAN_HH
-# define MLN_VALUE_MEDIAN_HH
+#ifndef MLN_ACCU_MEDIAN_HH
+# define MLN_ACCU_MEDIAN_HH
-/*! \file mln/value/median.hh
+/*! \file mln/accu/median.hh
*
* \brief Define FIXME
*/
-# include <mln/value/histo.hh>
+# include <mln/accu/histo.hh>
namespace mln
{
- namespace value
+ namespace accu
{
@@ -55,11 +55,15 @@
void take(const value& v);
void untake(const value& v);
- void clear();
+ void init();
+
+ unsigned card() const { return h_.sum(); }
operator value() const;
value to_value() const;
+ const histo_on_set<S>& histo() const;
+
// FIXME: remove
void debug__() const
{
@@ -71,20 +75,31 @@
protected:
- histo_on_set<S> h_;
+ mutable histo_on_set<S> h_;
const S& s_; // derived from h_
- std::size_t sum_minus_, sum_plus_;
+ mutable std::size_t sum_minus_, sum_plus_;
- std::size_t i_; // the median index
- value v_; // the median value
+ mutable bool valid_;
+ mutable std::size_t i_; // the median index
+ mutable value v_; // the median value
// Auxiliary methods
- void go_minus_();
- void go_plus_();
+ void update_() const;
+ void go_minus_() const;
+ void go_plus_() const;
};
+ template <typename T>
+ struct median_on : public median< value::set_<T> >
+ {
+ median_on()
+ : median< value::set_<T> >(value::set_<T>::the())
+ {
+ }
+ };
+
# ifndef MLN_INCLUDE_ONLY
@@ -94,7 +109,7 @@
: h_(s),
s_(h_.vset())
{
- clear();
+ init();
}
@@ -102,42 +117,15 @@
void
median<S>::take(const value& v)
{
- // update h_
h_.take(v);
- // particular case:
- // current state was initialization
- if (h_[i_] = 0)
- {
- // std::cout << "init!" << std::endl;
- i_ = s_.index_of(v);
- v_ = v;
- return;
- }
-
- // particular case:
- // the median does not change
- if (v = v_)
- {
- // std::cout << "no change!" << std::endl;
- return;
- }
-
- // general case:
-
if (v < v_)
- {
++sum_minus_;
- if (2 * sum_minus_ > h_.sum())
- go_minus_();
- }
- else
- // v > v_
- {
+ else if (v > v_)
++sum_plus_;
- if (2 * sum_plus_ > h_.sum())
- go_plus_();
- }
+
+ if (valid_)
+ valid_ = false;
}
@@ -146,34 +134,33 @@
median<S>::untake(const value& v)
{
mln_precondition(h_(v) != 0);
-
- // update h_
h_.untake(v);
- // particular case:
- // the only value has been removed
- if (h_.sum() = 0)
- {
- clear();
- return;
- }
-
- // general case:
if (v < v_)
- {
--sum_minus_;
- if (2 * sum_plus_ > h_.sum())
- go_plus_();
- }
else if (v > v_)
- {
--sum_plus_;
+
+ if (valid_)
+ valid_ = false;
+ }
+
+
+ template <typename S>
+ void
+ median<S>::update_() const
+ {
+ valid_ = true;
+
+ if (h_.sum() = 0)
+ return;
+
if (2 * sum_minus_ > h_.sum())
go_minus_();
- }
else
- // v = v_
- {
+ if (2 * sum_plus_ > h_.sum())
+ go_plus_();
+ else
if (h_[i_] = 0)
{
// go to the heaviest side
@@ -182,21 +169,12 @@
else
go_minus_(); // default when both sides are balanced
}
- else
- {
- if (2 * sum_plus_ > h_.sum())
- go_plus_();
- else if (2 * sum_minus_ > h_.sum())
- go_minus_();
- // else no change
- }
- }
}
template <typename S>
void
- median<S>::go_minus_()
+ median<S>::go_minus_() const
{
do
{
@@ -213,7 +191,7 @@
template <typename S>
void
- median<S>::go_plus_()
+ median<S>::go_plus_() const
{
do
{
@@ -230,29 +208,40 @@
template <typename S>
void
- median<S>::clear()
+ median<S>::init()
{
- h_.clear();
+ h_.init();
sum_minus_ = 0;
sum_plus_ = 0;
i_ = (mln_max(value) - mln_min(value)) / 2;
v_ = s_[i_];
+ valid_ = true;
}
+
template <typename S>
median<S>::operator typename median<S>::value () const
{
- return v_;
+ return to_value();
}
template <typename S>
typename median<S>::value
median<S>::to_value() const
{
+ if (not valid_)
+ update_();
return v_;
}
template <typename S>
+ const histo_on_set<S>&
+ median<S>::histo() const
+ {
+ return h_;
+ }
+
+ template <typename S>
std::ostream& operator<<(std::ostream& ostr, const median<S>& m)
{
m.debug__();
@@ -262,9 +251,9 @@
# endif // ! MLN_INCLUDE_ONLY
- } // end of namespace mln::value
+ } // end of namespace mln::accu
} // end of namespace mln
-#endif // ! MLN_VALUE_MEDIAN_HH
+#endif // ! MLN_ACCU_MEDIAN_HH
Index: mln/accu/median_alt.hh
--- mln/accu/median_alt.hh (revision 0)
+++ mln/accu/median_alt.hh (revision 0)
@@ -0,0 +1,279 @@
+// Copyright (C) 2007 EPITA Research and Development Laboratory
+//
+// This file is part of the Olena Library. This library is free
+// software; you can redistribute it and/or modify it under the terms
+// of the GNU General Public License version 2 as published by the
+// Free Software Foundation.
+//
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+// General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this library; see the file COPYING. If not, write to
+// the Free Software Foundation, 51 Franklin Street, Fifth Floor,
+// Boston, MA 02111-1307, USA.
+//
+// As a special exception, you may use this file as part of a free
+// software library without restriction. Specifically, if other files
+// instantiate templates or use macros or inline functions from this
+// file, or you compile this file and link it with other files to
+// produce an executable, this file does not by itself cause the
+// resulting executable to be covered by the GNU General Public
+// License. This exception does not however invalidate any other
+// reasons why the executable file might be covered by the GNU General
+// Public License.
+
+#ifndef MLN_ACCU_MEDIAN_ALT_HH
+# define MLN_ACCU_MEDIAN_ALT_HH
+
+/*! \file mln/accu/median_alt.hh
+ *
+ * \brief Define FIXME
+ */
+
+# include <mln/accu/histo.hh>
+
+
+namespace mln
+{
+
+ namespace accu
+ {
+
+
+ /*! Generic median_alt function based on histogram over a value set
+ * with type \c S.
+ */
+ template <typename S>
+ struct median_alt
+ {
+ typedef mln_value(S) value;
+
+ median_alt(const Value_Set<S>& s);
+
+ void take(const value& v);
+ void untake(const value& v);
+ void init();
+
+ operator value() const;
+ value to_value() const;
+
+ // FIXME: remove
+ void debug__() const
+ {
+ std::cout << " i = " << i_
+ << " v = " << v_
+ << " s = " << sum_minus_ << " ; " << h_[i_] << " ; " << sum_plus_ << " = " << h_.sum()
+ << std::endl;
+ }
+
+ protected:
+
+ histo_on_set<S> h_;
+ const S& s_; // derived from h_
+
+ std::size_t sum_minus_, sum_plus_;
+
+ std::size_t i_; // the median index
+ value v_; // the median value
+
+ // Auxiliary methods
+ void go_minus_();
+ void go_plus_();
+ };
+
+
+ template <typename T>
+ struct median_alt_on : public median_alt< value::set_<T> >
+ {
+ median_alt_on()
+ : median_alt< value::set_<T> >(value::set_<T>::the())
+ {
+ }
+ };
+
+
+# ifndef MLN_INCLUDE_ONLY
+
+
+ template <typename S>
+ median_alt<S>::median_alt(const Value_Set<S>& s)
+ : h_(s),
+ s_(h_.vset())
+ {
+ init();
+ }
+
+
+ template <typename S>
+ void
+ median_alt<S>::take(const value& v)
+ {
+ // update h_
+ h_.take(v);
+
+ // particular case:
+ // current state was initialization
+ if (h_[i_] = 0)
+ {
+ // std::cout << "init!" << std::endl;
+ i_ = s_.index_of(v);
+ v_ = v;
+ return;
+ }
+
+ // particular case:
+ // the median does not change
+ if (v = v_)
+ {
+ // std::cout << "no change!" << std::endl;
+ return;
+ }
+
+ // general case:
+
+ if (v < v_)
+ {
+ ++sum_minus_;
+ if (2 * sum_minus_ > h_.sum())
+ go_minus_();
+ }
+ else
+ // v > v_
+ {
+ ++sum_plus_;
+ if (2 * sum_plus_ > h_.sum())
+ go_plus_();
+ }
+ }
+
+
+ template <typename S>
+ void
+ median_alt<S>::untake(const value& v)
+ {
+ mln_precondition(h_(v) != 0);
+
+ // update h_
+ h_.untake(v);
+
+ // particular case:
+ // the only value has been removed
+ if (h_.sum() = 0)
+ {
+ init();
+ return;
+ }
+
+ // general case:
+ if (v < v_)
+ {
+ --sum_minus_;
+ if (2 * sum_plus_ > h_.sum())
+ go_plus_();
+ }
+ else if (v > v_)
+ {
+ --sum_plus_;
+ if (2 * sum_minus_ > h_.sum())
+ go_minus_();
+ }
+ else
+ // v = v_
+ {
+ if (h_[i_] = 0)
+ {
+ // go to the heaviest side
+ if (sum_plus_ > sum_minus_)
+ go_plus_();
+ else
+ go_minus_(); // default when both sides are balanced
+ }
+ else
+ {
+ if (2 * sum_plus_ > h_.sum())
+ go_plus_();
+ else if (2 * sum_minus_ > h_.sum())
+ go_minus_();
+ // else no change
+ }
+ }
+ }
+
+
+ template <typename S>
+ void
+ median_alt<S>::go_minus_()
+ {
+ do
+ {
+ sum_plus_ += h_[i_];
+ do
+ --i_;
+ while (h_[i_] = 0);
+ sum_minus_ -= h_[i_];
+ }
+ while (2 * sum_minus_ > h_.sum());
+ v_ = s_[i_];
+ }
+
+
+ template <typename S>
+ void
+ median_alt<S>::go_plus_()
+ {
+ do
+ {
+ sum_minus_ += h_[i_];
+ do
+ ++i_;
+ while (h_[i_] = 0);
+ sum_plus_ -= h_[i_];
+ }
+ while (2 * sum_plus_ > h_.sum());
+ v_ = s_[i_];
+ }
+
+
+ template <typename S>
+ void
+ median_alt<S>::init()
+ {
+ h_.init();
+ sum_minus_ = 0;
+ sum_plus_ = 0;
+ i_ = (mln_max(value) - mln_min(value)) / 2;
+ v_ = s_[i_];
+ }
+
+ template <typename S>
+ median_alt<S>::operator typename median_alt<S>::value () const
+ {
+ return v_;
+ }
+
+ template <typename S>
+ typename median_alt<S>::value
+ median_alt<S>::to_value() const
+ {
+ return v_;
+ }
+
+ template <typename S>
+ std::ostream& operator<<(std::ostream& ostr, const median_alt<S>& m)
+ {
+ m.debug__();
+ return ostr << m.to_value();
+ }
+
+
+# endif // ! MLN_INCLUDE_ONLY
+
+ } // end of namespace mln::accu
+
+} // end of namespace mln
+
+
+#endif // ! MLN_ACCU_MEDIAN_ALT_HH
1
0
https://svn.lrde.epita.fr/svn/oln/trunk/milena
Index: ChangeLog
from Thierry Geraud <thierry.geraud(a)lrde.epita.fr>
Add border to milena 2D image.
* tests/main.cc: Update.
* tests/image2d_b.cc: New.
* mln/core/concept/image.hh (npoints): New.
* mln/core/concept/doc/image.hh: Update.
* mln/core/internal/image_base.hh: Update.
* mln/core/concept/genpoint.hh
(operator-): New.
* mln/core/image2d.hh: Rename as...
* mln/core/image2d_b.hh: ...this.
(vb_, bdr_): New.
(image2d_b): Update.
* mln/border/thickness.hh: New.
mln/border/thickness.hh | 50 ++++++++++
mln/core/concept/doc/image.hh | 4
mln/core/concept/genpoint.hh | 32 +++++++
mln/core/concept/image.hh | 1
mln/core/image2d_b.hh | 182 +++++++++++++++++++++++++++++-----------
mln/core/internal/image_base.hh | 18 +--
tests/image2d_b.cc | 48 ++++++++++
tests/main.cc | 10 +-
8 files changed, 283 insertions(+), 62 deletions(-)
Index: tests/main.cc
--- tests/main.cc (revision 1003)
+++ tests/main.cc (working copy)
@@ -27,7 +27,7 @@
#include <cmath>
-#include <mln/core/image2d.hh>
+#include <mln/core/image2d_b.hh>
#include <mln/level/fill.hh>
#include <mln/debug/println.hh>
@@ -54,7 +54,7 @@
using namespace mln;
const unsigned size = 1000;
- image2d<int_u8> f(size, size);
+ image2d_b<int_u8> f(size, size);
morpho::Rd(f, f, c8());
}
@@ -73,7 +73,7 @@
// std::cout << c8() << std::endl;
// {
-// image2d<int> ima(b);
+// image2d_b<int> ima(b);
// level::fill(ima, 51);
// debug::println(ima);
@@ -87,12 +87,12 @@
// {
-// image2d<int> ima(b);
+// image2d_b<int> ima(b);
// level::fill(ima, cos_sin);
// debug::println(ima);
// std::cout << std::endl;
-// image2d<int> ima2 = morpho::erosion(ima, win);
+// image2d_b<int> ima2 = morpho::erosion(ima, win);
// debug::println(ima2);
// }
Index: tests/image2d_b.cc
--- tests/image2d_b.cc (revision 0)
+++ tests/image2d_b.cc (revision 0)
@@ -0,0 +1,48 @@
+// Copyright (C) 2007 EPITA Research and Development Laboratory
+//
+// This file is part of the Olena Library. This library is free
+// software; you can redistribute it and/or modify it under the terms
+// of the GNU General Public License version 2 as published by the
+// Free Software Foundation.
+//
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+// General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this library; see the file COPYING. If not, write to
+// the Free Software Foundation, 51 Franklin Street, Fifth Floor,
+// Boston, MA 02111-1307, USA.
+//
+// As a special exception, you may use this file as part of a free
+// software library without restriction. Specifically, if other files
+// instantiate templates or use macros or inline functions from this
+// file, or you compile this file and link it with other files to
+// produce an executable, this file does not by itself cause the
+// resulting executable to be covered by the GNU General Public
+// License. This exception does not however invalidate any other
+// reasons why the executable file might be covered by the GNU General
+// Public License.
+
+/*! \file tests/image2d_b.cc
+ *
+ * \brief Tests on mln::image2d_b.
+ */
+
+#include <mln/core/image2d_b.hh>
+
+
+int main()
+{
+ using namespace mln;
+
+ const unsigned nrows = 1;
+ const unsigned ncols = 66;
+ const unsigned border = 4;
+
+ image2d_b<int> f(nrows, ncols, border);
+
+ mln_assertion(f.npoints() = f.nrows() * f.ncols());
+ mln_assertion(f.ncells() = (nrows + 2 * border) * (ncols + 2 * border));
+}
Index: mln/core/concept/image.hh
--- mln/core/concept/image.hh (revision 1003)
+++ mln/core/concept/image.hh (working copy)
@@ -80,6 +80,7 @@
bool has(const psite& p) const;
const box_<point>& bbox() const;
+ std::size_t npoints() const;
*/
protected:
Index: mln/core/concept/genpoint.hh
--- mln/core/concept/genpoint.hh (revision 1003)
+++ mln/core/concept/genpoint.hh (working copy)
@@ -176,6 +176,27 @@
operator+(const GenPoint<P>& lhs, const mln_dpoint(P)& rhs);
+ /*! \brief Substract a delta-point \p rhs to a generalized point \p lhs.
+ *
+ * \param[in] lhs A generalized point.
+ * \param[in] rhs A delta-point.
+ *
+ * The type of \p rhs has to be exactly the delta-point type
+ * associated with the type of \p lhs.
+ *
+ * \return A point (temporary object).
+ *
+ * \see mln::Dpoint
+ * \relates mln::GenPoint
+ *
+ * \todo Introduce the notion of "generalized dpoint" and
+ * add the more general extra operator-(GenPoint, GenDpoint).
+ */
+ template <typename P>
+ mln_point(P)
+ operator-(const GenPoint<P>& lhs, const mln_dpoint(P)& rhs);
+
+
/*! \brief Print a generalized point \p p into the output stream \p
* ostr.
*
@@ -263,6 +284,17 @@
}
template <typename P>
+ mln_point(P)
+ operator-(const GenPoint<P>& lhs, const mln_dpoint(P)& rhs)
+ {
+ const P& lhs_ = lhs.force_exact_();
+ mln_point(P) tmp;
+ for (unsigned i = 0; i < P::dim; ++i)
+ tmp[i] = lhs_[i] - rhs[i];
+ return tmp;
+ }
+
+ template <typename P>
std::ostream& operator<<(std::ostream& ostr, const GenPoint<P>& p)
{
const P& p_ = p.force_exact_();
Index: mln/core/concept/doc/image.hh
--- mln/core/concept/doc/image.hh (revision 1003)
+++ mln/core/concept/doc/image.hh (working copy)
@@ -156,6 +156,10 @@
* \return A bounding box of the image domain.
*/
const box_<point>& bbox() const;
+
+ /*! \brief Give the number of points of the image domain.
+ */
+ std::size_t npoints() const;
};
} // end of namespace mln::doc
Index: mln/core/image2d_b.hh
--- mln/core/image2d_b.hh (revision 1003)
+++ mln/core/image2d_b.hh (working copy)
@@ -25,17 +25,20 @@
// reasons why the executable file might be covered by the GNU General
// Public License.
-#ifndef MLN_CORE_IMAGE2D_HH
-# define MLN_CORE_IMAGE2D_HH
+#ifndef MLN_CORE_IMAGE2D_B_HH
+# define MLN_CORE_IMAGE2D_B_HH
-/*! \file mln/core/image2d.hh
+/*! \file mln/core/image2d_b.hh
*
- * \brief Definition of the basic mln::image2d class.
+ * \brief Definition of the basic mln::image2d_b class.
*/
# include <mln/core/internal/image_base.hh>
# include <mln/core/box2d.hh>
+# include <mln/border/thickness.hh>
+# include <mln/fun/all.hh>
+
namespace mln
{
@@ -43,10 +46,11 @@
/*! \brief Basic 2D image class.
*
* The parameter \c T is the type of pixel values. This image class
- * stores data in memory and has no virtual border.
+ * stores data in memory and has a virtual border with constant
+ * thickness around data.
*/
template <typename T>
- struct image2d : public internal::image_base_< box2d, image2d<T> >
+ struct image2d_b : public internal::image_base_< box2d, image2d_b<T> >
{
// warning: just to make effective types appear in Doxygen
@@ -72,23 +76,28 @@
template <typename U>
struct change_value
{
- typedef image2d<U> ret;
+ typedef image2d_b<U> ret;
};
/// Constructor without argument.
- image2d();
-
- /// Constructor with the numbers of rows and columns.
- image2d(int nrows, int ncols);
+ image2d_b();
- /// Constructor with a box.
- image2d(const box2d& b);
+ /// Constructor with the numbers of rows and columns and the
+ /// border thickness.
+ image2d_b(int nrows, int ncols, unsigned bdr = border::thickness);
+
+ /// Constructor with a box and the border thickness (default is
+ /// 3).
+ image2d_b(const box2d& b, unsigned bdr = border::thickness);
/// Copy constructor.
- image2d(const image2d<T>& rhs);
+ image2d_b(const image2d_b<T>& rhs);
/// Assignment operator.
- image2d& operator=(const image2d<T>& rhs);
+ image2d_b& operator=(const image2d_b<T>& rhs);
+
+ /// Test if \p p is valid.
+ bool owns_(const point2d& p) const;
/// Test if this image has been initialized.
bool has_data() const;
@@ -96,6 +105,18 @@
/// Give the definition domain.
const box2d& domain() const;
+ /// Give the border thickness.
+ unsigned border() const;
+
+ /// Give the number of rows (not including the border).
+ unsigned nrows() const;
+
+ /// Give the number of cols (not including the border).
+ unsigned ncols() const;
+
+ /// Give the number of cells (points including border ones).
+ std::size_t ncells() const;
+
/// Read-only access to the image value located at \p p.
const T& operator()(const point2d& p) const;
@@ -103,18 +124,21 @@
T& operator()(const point2d& p);
/// Destructor.
- ~image2d();
+ ~image2d_b();
private:
- box2d b_;
+ box2d b_; // theoretical box
T* buffer_;
T** array_;
+ unsigned bdr_;
+ box2d vb_; // virtual box, i.e., box including the virtual border
+ void update_vb_();
void allocate_();
void deallocate_();
- typedef internal::image_base_< box2d, image2d<T> > super;
+ typedef internal::image_base_< box2d, image2d_b<T> > super;
};
@@ -123,42 +147,47 @@
// ctors
template <typename T>
- image2d<T>::image2d()
+ image2d_b<T>::image2d_b()
{
buffer_ = 0;
array_ = 0;
+ bdr_ = border::thickness; // default value in ctors.
}
template <typename T>
- image2d<T>::image2d(int nrows, int ncols)
+ image2d_b<T>::image2d_b(int nrows, int ncols, unsigned bdr)
{
b_ = mk_box2d(nrows, ncols);
+ bdr_ = bdr;
allocate_();
}
template <typename T>
- image2d<T>::image2d(const box2d& b)
- : b_(b)
+ image2d_b<T>::image2d_b(const box2d& b, unsigned bdr)
+ : b_(b),
+ bdr_(bdr)
{
+ bdr_ = bdr;
allocate_();
}
template <typename T>
- image2d<T>::image2d(const image2d<T>& rhs)
+ image2d_b<T>::image2d_b(const image2d_b<T>& rhs)
: super(rhs),
- b_(rhs.domain())
+ b_(rhs.domain()),
+ bdr_(rhs.border())
{
allocate_();
std::memcpy(this->buffer_,
rhs.buffer_,
- b_.npoints() * sizeof(value));
+ ncells() * sizeof(value));
}
// assignment
template <typename T>
- image2d<T>&
- image2d<T>::operator=(const image2d<T>& rhs)
+ image2d_b<T>&
+ image2d_b<T>::operator=(const image2d_b<T>& rhs)
{
assert(rhs.has_data());
if (& rhs = this)
@@ -166,9 +195,11 @@
if (this->has_data())
this->deallocate_();
this->b_ = rhs.domain();
+ this->bdr_ = rhs.border();
+ allocate_();
std::memcpy(this->buffer_,
rhs.buffer_,
- b_.npoints() * sizeof(value));
+ ncells() * sizeof(value));
return *this;
}
@@ -176,36 +207,83 @@
template <typename T>
bool
- image2d<T>::has_data() const
+ image2d_b<T>::has_data() const
{
return buffer_ != 0 && array_ != 0;
}
template <typename T>
const box2d&
- image2d<T>::domain() const
+ image2d_b<T>::domain() const
{
+ mln_precondition(this->has_data());
return b_;
}
template <typename T>
+ unsigned
+ image2d_b<T>::border() const
+ {
+ mln_precondition(this->has_data());
+ return bdr_;
+ }
+
+ template <typename T>
+ unsigned
+ image2d_b<T>::nrows() const
+ {
+ mln_precondition(this->has_data());
+ return 1 + b_.pmax().row() - b_.pmin().row();
+ }
+
+ template <typename T>
+ unsigned
+ image2d_b<T>::ncols() const
+ {
+ mln_precondition(this->has_data());
+ return 1 + b_.pmax().col() - b_.pmin().col();
+ }
+
+ template <typename T>
+ std::size_t
+ image2d_b<T>::ncells() const
+ {
+ mln_precondition(this->has_data());
+ std::size_t s = 1;
+ s *= nrows() + 2 * bdr_;
+ s *= ncols() + 2 * bdr_;
+ return s;
+ }
+
+ template <typename T>
+ bool
+ image2d_b<T>::owns_(const point2d& p) const
+ {
+ mln_precondition(this->has_data());
+ return p.row() >= vb_.pmin().row()
+ && p.row() <= vb_.pmax().row()
+ && p.col() >= vb_.pmin().col()
+ && p.col() <= vb_.pmax().col();
+ }
+
+ template <typename T>
const T&
- image2d<T>::operator()(const point2d& p) const
+ image2d_b<T>::operator()(const point2d& p) const
{
- assert(this->has_data() && this->owns_(p));
+ mln_precondition(this->owns_(p));
return array_[p.row()][p.col()];
}
template <typename T>
T&
- image2d<T>::operator()(const point2d& p)
+ image2d_b<T>::operator()(const point2d& p)
{
- assert(this->has_data() && this->owns_(p));
+ mln_precondition(this->owns_(p));
return array_[p.row()][p.col()];
}
template <typename T>
- image2d<T>::~image2d()
+ image2d_b<T>::~image2d_b()
{
deallocate_();
}
@@ -214,26 +292,34 @@
template <typename T>
void
- image2d<T>::allocate_()
+ image2d_b<T>::update_vb_()
+ {
+ vb_.pmin() = b_.pmin() - dpoint2d(all(bdr_));
+ vb_.pmax() = b_.pmax() + dpoint2d(all(bdr_));
+ }
+
+ template <typename T>
+ void
+ image2d_b<T>::allocate_()
{
+ update_vb_();
unsigned
- nrows = 1 + b_.pmax().row() - b_.pmin().row(),
- ncols = 1 + b_.pmax().col() - b_.pmin().col(),
- len = nrows * ncols;
- buffer_ = new T[len];
- array_ = new T*[nrows];
- T* buf = buffer_ - b_.pmin().col();
- for (unsigned i = 0; i < nrows; ++i)
+ nr = nrows() + 2 * bdr_,
+ nc = ncols() + 2 * bdr_;
+ buffer_ = new T[ncells()];
+ array_ = new T*[nr];
+ T* buf = buffer_ - (b_.pmin().col() - bdr_);
+ for (unsigned i = 0; i < nr; ++i)
{
array_[i] = buf;
- buf += ncols;
+ buf += nc;
}
- array_ -= b_.pmin().row();
+ array_ -= b_.pmin().row() - bdr_;
}
template <typename T>
void
- image2d<T>::deallocate_()
+ image2d_b<T>::deallocate_()
{
if (buffer_)
{
@@ -242,7 +328,7 @@
}
if (array_)
{
- array_ += b_.pmin().row();
+ array_ += b_.pmin().row() - bdr_;
delete[] array_;
array_ = 0;
}
@@ -253,4 +339,4 @@
} // end of namespace mln
-#endif // ! MLN_CORE_IMAGE2D_HH
+#endif // ! MLN_CORE_IMAGE2D_B_HH
Index: mln/core/internal/image_base.hh
--- mln/core/internal/image_base.hh (revision 1003)
+++ mln/core/internal/image_base.hh (working copy)
@@ -70,12 +70,12 @@
/// Test if \p p belongs to the image domain.
bool has(const psite& p) const;
- /// Test if a pixel value is accessible at \p p.
- bool owns_(const psite& p) const;
-
/// Give a bounding box of the image domain.
const box_<point>& bbox() const;
+ /// Give the number of points of the image domain.
+ std::size_t npoints() const;
+
protected:
image_base_();
};
@@ -91,17 +91,17 @@
}
template <typename S, typename E>
- bool
- image_base_<S,E>::owns_(const psite& p) const // default
+ const box_<mln_point(S)>&
+ image_base_<S,E>::bbox() const
{
- return this->has(p);
+ return exact(this)->domain().bbox();
}
template <typename S, typename E>
- const box_<mln_point(S)>&
- image_base_<S,E>::bbox() const
+ std::size_t
+ image_base_<S,E>::npoints() const
{
- return exact(this)->domain().bbox();
+ return exact(this)->domain().npoints();
}
template <typename S, typename E>
Index: mln/border/thickness.hh
--- mln/border/thickness.hh (revision 0)
+++ mln/border/thickness.hh (revision 0)
@@ -0,0 +1,50 @@
+// Copyright (C) 2007 EPITA Research and Development Laboratory
+//
+// This file is part of the Olena Library. This library is free
+// software; you can redistribute it and/or modify it under the terms
+// of the GNU General Public License version 2 as published by the
+// Free Software Foundation.
+//
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+// General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this library; see the file COPYING. If not, write to
+// the Free Software Foundation, 51 Franklin Street, Fifth Floor,
+// Boston, MA 02111-1307, USA.
+//
+// As a special exception, you may use this file as part of a free
+// software library without restriction. Specifically, if other files
+// instantiate templates or use macros or inline functions from this
+// file, or you compile this file and link it with other files to
+// produce an executable, this file does not by itself cause the
+// resulting executable to be covered by the GNU General Public
+// License. This exception does not however invalidate any other
+// reasons why the executable file might be covered by the GNU General
+// Public License.
+
+#ifndef MLN_BORDER_THICKNESS_HH
+# define MLN_BORDER_THICKNESS_HH
+
+/*! \file mln/border/thickness.hh
+ *
+ * \brief FIXME.
+ */
+
+
+namespace mln
+{
+
+ namespace border
+ {
+
+ const unsigned thickness = 3;
+
+ } // end of namespace mln::border
+
+} // end of namespace mln
+
+
+#endif // ! MLN_BORDER_THICKNESS_HH
1
0
https://svn.lrde.epita.fr/svn/oln/trunk/milena
Index: ChangeLog
from Thierry Geraud <thierry.geraud(a)lrde.epita.fr>
Add progressive histogram and median in milena.
* tests/median.cc: New.
* mln/value/vset.hh: Rename as...
* mln/value/set.hh: ... this new file.
* tests/vset.cc: Update.
* tests/histo.cc: New.
* mln/histo: New.
* mln/core/concept/value_set.hh: Update.
* mln/core/concept/doc/value_set.hh: Update.
* mln/value/histo.hh: New.
* mln/value/median.hh: New.
* mln/value/int_u.hh: Update.
mln/core/concept/doc/value_set.hh | 4
mln/core/concept/value_set.hh | 3
mln/value/histo.hh | 206 ++++++++++++++++++++++++++++
mln/value/int_u.hh | 11 +
mln/value/median.hh | 270 ++++++++++++++++++++++++++++++++++++++
mln/value/set.hh | 61 +++++++-
tests/histo.cc | 67 +++++++++
tests/median.cc | 184 +++++++++++++++++++++++++
tests/vset.cc | 6
9 files changed, 798 insertions(+), 14 deletions(-)
Index: tests/median.cc
--- tests/median.cc (revision 0)
+++ tests/median.cc (revision 0)
@@ -0,0 +1,184 @@
+// Copyright (C) 2007 EPITA Research and Development Laboratory
+//
+// This file is part of the Olena Library. This library is free
+// software; you can redistribute it and/or modify it under the terms
+// of the GNU General Public License version 2 as published by the
+// Free Software Foundation.
+//
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+// General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this library; see the file COPYING. If not, write to
+// the Free Software Foundation, 51 Franklin Street, Fifth Floor,
+// Boston, MA 02111-1307, USA.
+//
+// As a special exception, you may use this file as part of a free
+// software library without restriction. Specifically, if other files
+// instantiate templates or use macros or inline functions from this
+// file, or you compile this file and link it with other files to
+// produce an executable, this file does not by itself cause the
+// resulting executable to be covered by the GNU General Public
+// License. This exception does not however invalidate any other
+// reasons why the executable file might be covered by the GNU General
+// Public License.
+
+/*! \file tests/median.cc
+ *
+ * \brief Tests on mln::value::median<S>.
+ */
+
+#include <mln/value/int_u.hh>
+#include <mln/value/median.hh>
+
+
+
+int main()
+{
+ using namespace mln;
+ using namespace mln::value;
+
+ typedef set_<int_u8> S;
+
+ median<S> m(S::the());
+
+
+ {
+
+ unsigned vals[] = { 42, 69, 51, 12, 51, 12, 42 };
+ unsigned n = sizeof(vals)/sizeof(unsigned);
+
+ for (unsigned i = 0; i < n; ++i)
+ {
+ std::cout << "taking " << vals[i] << ':' << std::endl;
+ m.take(vals[i]);
+ std::cout << m << std::endl;
+ }
+
+ for (int i = int(n) - 1; i >= 0; --i)
+ {
+ std::cout << "untaking " << vals[i] << ':' << std::endl;
+ m.untake(vals[i]);
+ std::cout << m << std::endl;
+ }
+
+ }
+
+
+ {
+
+ unsigned vals[] = { 42, 69, 51, 12, 51, 12, 42 };
+ unsigned n = sizeof(vals)/sizeof(unsigned);
+
+ for (unsigned i = 0; i < n; ++i)
+ {
+ std::cout << "taking " << vals[i] << ':' << std::endl;
+ m.take(vals[i]);
+ std::cout << m << std::endl;
+ }
+
+ for (unsigned i = 0; i < n; ++i)
+ {
+ std::cout << "untaking " << vals[i] << ':' << std::endl;
+ m.untake(vals[i]);
+ std::cout << m << std::endl;
+ }
+
+ }
+
+
+
+ {
+
+ unsigned vals[] = { 42, 42, 69, 69, 51, 51, 12, 12, 51, 51, 12, 12, 42, 42 };
+ unsigned n = sizeof(vals)/sizeof(unsigned);
+
+ for (unsigned i = 0; i < n; ++i)
+ {
+ std::cout << "taking " << vals[i] << ':' << std::endl;
+ m.take(vals[i]);
+ std::cout << m << std::endl;
+ }
+
+ for (int i = int(n) - 1; i >= 0; --i)
+ {
+ std::cout << "untaking " << vals[i] << ':' << std::endl;
+ m.untake(vals[i]);
+ std::cout << m << std::endl;
+ }
+
+ }
+
+
+ {
+
+ unsigned vals[] = { 42, 42, 69, 69, 51, 51, 12, 12, 51, 51, 12, 12, 42, 42 };
+ unsigned n = sizeof(vals)/sizeof(unsigned);
+
+ for (unsigned i = 0; i < n; ++i)
+ {
+ std::cout << "taking " << vals[i] << ':' << std::endl;
+ m.take(vals[i]);
+ std::cout << m << std::endl;
+ }
+
+ for (unsigned i = 0; i < n; ++i)
+ {
+ std::cout << "untaking " << vals[i] << ':' << std::endl;
+ m.untake(vals[i]);
+ std::cout << m << std::endl;
+ }
+
+ }
+
+
+
+
+ {
+
+ unsigned vals[] = { 42, 69, 51, 12, 51, 12, 42, 69, 51, 12, 51, 12, 42 };
+ unsigned n = sizeof(vals)/sizeof(unsigned);
+
+ for (unsigned i = 0; i < n; ++i)
+ {
+ std::cout << "taking " << vals[i] << ':' << std::endl;
+ m.take(vals[i]);
+ std::cout << m << std::endl;
+ }
+
+ for (int i = int(n) - 1; i >= 0; --i)
+ {
+ std::cout << "untaking " << vals[i] << ':' << std::endl;
+ m.untake(vals[i]);
+ std::cout << m << std::endl;
+ }
+
+ }
+
+
+ {
+
+ unsigned vals[] = { 42, 69, 51, 12, 51, 12, 42, 69, 51, 12, 51, 12, 42 };
+ unsigned n = sizeof(vals)/sizeof(unsigned);
+
+ for (unsigned i = 0; i < n; ++i)
+ {
+ std::cout << "taking " << vals[i] << ':' << std::endl;
+ m.take(vals[i]);
+ std::cout << m << std::endl;
+ }
+
+ for (unsigned i = 0; i < n; ++i)
+ {
+ std::cout << "untaking " << vals[i] << ':' << std::endl;
+ m.untake(vals[i]);
+ std::cout << m << std::endl;
+ }
+
+ }
+
+
+
+}
Index: tests/vset.cc
--- tests/vset.cc (revision 1002)
+++ tests/vset.cc (working copy)
@@ -27,11 +27,11 @@
/*! \file tests/vset.cc
*
- * \brief Tests on mln::vset.
+ * \brief Tests on mln::value::set_<T>.
*/
#include <mln/value/int_u.hh>
-#include <mln/value/vset.hh>
+#include <mln/value/set.hh>
@@ -43,7 +43,7 @@
// typedef value::int_u8 T;
// typedef short T;
- typedef value::vset_<T> S;
+ typedef value::set_<T> S;
S s;
{
Index: tests/histo.cc
--- tests/histo.cc (revision 0)
+++ tests/histo.cc (revision 0)
@@ -0,0 +1,67 @@
+// Copyright (C) 2007 EPITA Research and Development Laboratory
+//
+// This file is part of the Olena Library. This library is free
+// software; you can redistribute it and/or modify it under the terms
+// of the GNU General Public License version 2 as published by the
+// Free Software Foundation.
+//
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+// General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this library; see the file COPYING. If not, write to
+// the Free Software Foundation, 51 Franklin Street, Fifth Floor,
+// Boston, MA 02111-1307, USA.
+//
+// As a special exception, you may use this file as part of a free
+// software library without restriction. Specifically, if other files
+// instantiate templates or use macros or inline functions from this
+// file, or you compile this file and link it with other files to
+// produce an executable, this file does not by itself cause the
+// resulting executable to be covered by the GNU General Public
+// License. This exception does not however invalidate any other
+// reasons why the executable file might be covered by the GNU General
+// Public License.
+
+/*! \file tests/histo.cc
+ *
+ * \brief Tests on mln::value::histo<S>.
+ */
+
+#include <mln/value/int_u.hh>
+#include <mln/value/set.hh>
+#include <mln/value/histo.hh>
+
+
+
+int main()
+{
+ using namespace mln;
+ using namespace mln::value;
+
+
+ histo_on_type<bool> h;
+
+ for (unsigned i = 0; i < 5; ++i)
+ h.take(false);
+ for (unsigned i = 0; i < 2; ++i)
+ h.take(true);
+ h.untake(true);
+
+ std::cout << h << std::endl;
+ std::cout << h[0] * 10 + h[1] << std::endl;
+ std::cout << h(false) * 10 + h(true) << std::endl;
+
+ h.clear();
+ std::cout << h << std::endl;
+
+
+ // ...
+
+
+ typedef value::set_<int_u8> S;
+ histo_on_set<S> h_u8(S::the());
+ std::cout << h_u8 << std::endl;
+}
Index: mln/core/concept/value_set.hh
--- mln/core/concept/value_set.hh (revision 1002)
+++ mln/core/concept/value_set.hh (working copy)
@@ -53,7 +53,10 @@
typedef bkd_viter;
bool has(const value& v) const;
+
value operator[](std::size_t i) const;
+ std::size_t index_of(const value& v) const;
+
std::size_t nvalues() const;
*/
Index: mln/core/concept/doc/value_set.hh
--- mln/core/concept/doc/value_set.hh (revision 1002)
+++ mln/core/concept/doc/value_set.hh (working copy)
@@ -72,6 +72,10 @@
/*! \brief Give the \p i-th value of this set.
*/
value operator[](std::size_t i) const;
+
+ /*! \brief Give the index of value \p v in this set.
+ */
+ std::size_t index_of(const value& v) const;
};
} // end of namespace mln::doc
Index: mln/value/histo.hh
--- mln/value/histo.hh (revision 0)
+++ mln/value/histo.hh (revision 0)
@@ -0,0 +1,206 @@
+// Copyright (C) 2007 EPITA Research and Development Laboratory
+//
+// This file is part of the Olena Library. This library is free
+// software; you can redistribute it and/or modify it under the terms
+// of the GNU General Public License version 2 as published by the
+// Free Software Foundation.
+//
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+// General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this library; see the file COPYING. If not, write to
+// the Free Software Foundation, 51 Franklin Street, Fifth Floor,
+// Boston, MA 02111-1307, USA.
+//
+// As a special exception, you may use this file as part of a free
+// software library without restriction. Specifically, if other files
+// instantiate templates or use macros or inline functions from this
+// file, or you compile this file and link it with other files to
+// produce an executable, this file does not by itself cause the
+// resulting executable to be covered by the GNU General Public
+// License. This exception does not however invalidate any other
+// reasons why the executable file might be covered by the GNU General
+// Public License.
+
+#ifndef MLN_VALUE_HISTO_HH
+# define MLN_VALUE_HISTO_HH
+
+/*! \file mln/value/histo.hh
+ *
+ * \brief Define a couple of generic histogram classes.
+ */
+
+# include <vector>
+# include <algorithm>
+
+# include <mln/core/concept/value_set.hh>
+# include <mln/value/set.hh>
+
+
+namespace mln
+{
+
+ namespace value
+ {
+
+
+ /*! Generic histogram class over a value set with type \c S.
+ */
+ template <typename S>
+ struct histo_on_set
+ {
+ histo_on_set(const Value_Set<S>& s);
+
+ typedef mln_value(S) value;
+
+ void take(const value& v);
+ void untake(const value& v);
+ void clear();
+
+ std::size_t operator()(const value& v) const;
+ std::size_t operator[](std::size_t i) const;
+ std::size_t nvalues() const;
+ std::size_t sum() const;
+
+ const std::vector<std::size_t>& vec() const;
+
+ const S& vset() const;
+
+ protected:
+
+ const S& s_;
+ std::vector<std::size_t> h_;
+ std::size_t sum_;
+ };
+
+
+ template <typename S>
+ std::ostream& operator<<(std::ostream& ostr, const histo_on_set<S>& h);
+
+
+
+
+ /*! Generic histogram class over the set of values of type \c T.
+ */
+ template <typename T>
+ struct histo_on_type : public histo_on_set< set_<T> >
+ {
+ histo_on_type();
+ };
+
+
+
+
+# ifndef MLN_INCLUDE_ONLY
+
+
+ // histo_on_set<S>
+
+ template <typename S>
+ histo_on_set<S>::histo_on_set(const Value_Set<S>& s)
+ : s_(exact(s)),
+ h_(exact(s).nvalues(), 0),
+ sum_(0)
+ {
+ }
+
+ template <typename S>
+ void
+ histo_on_set<S>::take(const value& v)
+ {
+ ++h_[s_.index_of(v)];
+ ++sum_;
+ }
+
+ template <typename S>
+ void
+ histo_on_set<S>::untake(const value& v)
+ {
+ mln_precondition(h_[s_.index_of(v)] > 0);
+ mln_precondition(sum_ > 0);
+ --h_[s_.index_of(v)];
+ --sum_;
+ }
+
+ template <typename S>
+ void
+ histo_on_set<S>::clear()
+ {
+ std::fill(h_.begin(), h_.end(), 0);
+ }
+
+ template <typename S>
+ std::size_t
+ histo_on_set<S>::operator()(const value& v) const
+ {
+ return h_[s_.index_of(v)];
+ }
+
+ template <typename S>
+ std::size_t
+ histo_on_set<S>::operator[](std::size_t i) const
+ {
+ mln_precondition(i < s_.nvalues());
+ return h_[i];
+ }
+
+ template <typename S>
+ std::size_t
+ histo_on_set<S>::nvalues() const
+ {
+ return s_.nvalues();
+ }
+
+ template <typename S>
+ std::size_t
+ histo_on_set<S>::sum() const
+ {
+ return sum_;
+ }
+
+ template <typename S>
+ const std::vector<std::size_t>&
+ histo_on_set<S>::vec() const
+ {
+ return h_;
+ }
+
+ template <typename S>
+ const S&
+ histo_on_set<S>::vset() const
+ {
+ return s_;
+ }
+
+ template <typename S>
+ std::ostream& operator<<(std::ostream& ostr, const histo_on_set<S>& h)
+ {
+ mln_viter(S) v(h.vset());
+ for_all(v)
+ ostr << v << ':' << h(v) << ' ';
+ ostr << std::endl;
+ return ostr;
+ }
+
+
+ // histo_on_type<T>
+
+ template <typename T>
+ histo_on_type<T>::histo_on_type()
+ : histo_on_set< set_<T> >(set_<T>::the())
+ {
+ }
+
+
+
+# endif // ! MLN_INCLUDE_ONLY
+
+ } // end of namespace mln::value
+
+} // end of namespace mln
+
+
+#endif // ! MLN_VALUE_HISTO_HH
Index: mln/value/set.hh
--- mln/value/set.hh (revision 1002)
+++ mln/value/set.hh (working copy)
@@ -25,8 +25,8 @@
// reasons why the executable file might be covered by the GNU General
// Public License.
-#ifndef MLN_VALUE_VSET_HH
-# define MLN_VALUE_VSET_HH
+#ifndef MLN_VALUE_SET_HH
+# define MLN_VALUE_SET_HH
/*! \file mln/value/vset.hh
*
@@ -48,37 +48,55 @@
template <typename S> struct bkd_viter_;
- /*! Class that defines the properties of the value type \c T.
+ /*! Class that defines the set of values of type \c T.
+ *
+ * This is an exhaustive value set over \c T.
*/
template <typename T>
- struct vset_ : public Value_Set< vset_<T> >
+ struct set_ : public Value_Set< set_<T> >
{
+ /// Value associated type.
typedef T value;
- typedef fwd_viter_< vset_<T> > fwd_viter;
- typedef bkd_viter_< vset_<T> > bkd_viter;
+ /// Forward Viter associated type.
+ typedef fwd_viter_< set_<T> > fwd_viter;
+
+ /// Backward Viter associated type.
+ typedef bkd_viter_< set_<T> > bkd_viter;
+
+ /// Viter associated type.
typedef fwd_viter viter;
+ /// Test if \p v belongs to this set: always true!
bool has(const T& v) const;
+ /// Give the \p i-th value.
T operator[](std::size_t i) const;
+ /// Give the index of value \p v in this set.
+ std::size_t index_of(const T& v) const;
+
+ /// Give the number of values.
std::size_t nvalues() const;
+
+ /// Return a singleton.
+ static const set_<T>& the();
};
+
# ifndef MLN_INCLUDE_ONLY
template <typename T>
bool
- vset_<T>::has(const T& v) const
+ set_<T>::has(const T& v) const
{
return true;
}
template <typename T>
T
- vset_<T>::operator[](std::size_t i) const
+ set_<T>::operator[](std::size_t i) const
{
mln_precondition(i < nvalues());
return mln_min(T) + i;
@@ -86,19 +104,42 @@
template <typename T>
std::size_t
- vset_<T>::nvalues() const
+ set_<T>::index_of(const T& v) const
+ {
+ return v - mln_min(T);
+ }
+
+ template <typename T>
+ std::size_t
+ set_<T>::nvalues() const
{
return mln_card(T);
}
+ template <typename T>
+ const set_<T>&
+ set_<T>::the()
+ {
+ static set_<T> the_;
+ return the_;
+ }
+
# endif // ! MLN_INCLUDE_ONLY
} // end of namespace mln::value
+
+
+ typedef value::set_<bool> Booleans;
+ typedef value::set_<int> integers();
+ typedef value::set_<unsigned> naturals();
+
+
+
} // end of namespace mln
# include <mln/value/viter.hh>
-#endif // ! MLN_VALUE_VSET_HH
+#endif // ! MLN_VALUE_SET_HH
Index: mln/value/median.hh
--- mln/value/median.hh (revision 0)
+++ mln/value/median.hh (revision 0)
@@ -0,0 +1,270 @@
+// Copyright (C) 2007 EPITA Research and Development Laboratory
+//
+// This file is part of the Olena Library. This library is free
+// software; you can redistribute it and/or modify it under the terms
+// of the GNU General Public License version 2 as published by the
+// Free Software Foundation.
+//
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+// General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this library; see the file COPYING. If not, write to
+// the Free Software Foundation, 51 Franklin Street, Fifth Floor,
+// Boston, MA 02111-1307, USA.
+//
+// As a special exception, you may use this file as part of a free
+// software library without restriction. Specifically, if other files
+// instantiate templates or use macros or inline functions from this
+// file, or you compile this file and link it with other files to
+// produce an executable, this file does not by itself cause the
+// resulting executable to be covered by the GNU General Public
+// License. This exception does not however invalidate any other
+// reasons why the executable file might be covered by the GNU General
+// Public License.
+
+#ifndef MLN_VALUE_MEDIAN_HH
+# define MLN_VALUE_MEDIAN_HH
+
+/*! \file mln/value/median.hh
+ *
+ * \brief Define FIXME
+ */
+
+# include <mln/value/histo.hh>
+
+
+namespace mln
+{
+
+ namespace value
+ {
+
+
+ /*! Generic median function based on histogram over a value set
+ * with type \c S.
+ */
+ template <typename S>
+ struct median
+ {
+ typedef mln_value(S) value;
+
+ median(const Value_Set<S>& s);
+
+ void take(const value& v);
+ void untake(const value& v);
+ void clear();
+
+ operator value() const;
+ value to_value() const;
+
+ // FIXME: remove
+ void debug__() const
+ {
+ std::cout << " i = " << i_
+ << " v = " << v_
+ << " s = " << sum_minus_ << " ; " << h_[i_] << " ; " << sum_plus_ << " = " << h_.sum()
+ << std::endl;
+ }
+
+ protected:
+
+ histo_on_set<S> h_;
+ const S& s_; // derived from h_
+
+ std::size_t sum_minus_, sum_plus_;
+
+ std::size_t i_; // the median index
+ value v_; // the median value
+
+ // Auxiliary methods
+ void go_minus_();
+ void go_plus_();
+ };
+
+
+
+# ifndef MLN_INCLUDE_ONLY
+
+
+ template <typename S>
+ median<S>::median(const Value_Set<S>& s)
+ : h_(s),
+ s_(h_.vset())
+ {
+ clear();
+ }
+
+
+ template <typename S>
+ void
+ median<S>::take(const value& v)
+ {
+ // update h_
+ h_.take(v);
+
+ // particular case:
+ // current state was initialization
+ if (h_[i_] = 0)
+ {
+ // std::cout << "init!" << std::endl;
+ i_ = s_.index_of(v);
+ v_ = v;
+ return;
+ }
+
+ // particular case:
+ // the median does not change
+ if (v = v_)
+ {
+ // std::cout << "no change!" << std::endl;
+ return;
+ }
+
+ // general case:
+
+ if (v < v_)
+ {
+ ++sum_minus_;
+ if (2 * sum_minus_ > h_.sum())
+ go_minus_();
+ }
+ else
+ // v > v_
+ {
+ ++sum_plus_;
+ if (2 * sum_plus_ > h_.sum())
+ go_plus_();
+ }
+ }
+
+
+ template <typename S>
+ void
+ median<S>::untake(const value& v)
+ {
+ mln_precondition(h_(v) != 0);
+
+ // update h_
+ h_.untake(v);
+
+ // particular case:
+ // the only value has been removed
+ if (h_.sum() = 0)
+ {
+ clear();
+ return;
+ }
+
+ // general case:
+ if (v < v_)
+ {
+ --sum_minus_;
+ if (2 * sum_plus_ > h_.sum())
+ go_plus_();
+ }
+ else if (v > v_)
+ {
+ --sum_plus_;
+ if (2 * sum_minus_ > h_.sum())
+ go_minus_();
+ }
+ else
+ // v = v_
+ {
+ if (h_[i_] = 0)
+ {
+ // go to the heaviest side
+ if (sum_plus_ > sum_minus_)
+ go_plus_();
+ else
+ go_minus_(); // default when both sides are balanced
+ }
+ else
+ {
+ if (2 * sum_plus_ > h_.sum())
+ go_plus_();
+ else if (2 * sum_minus_ > h_.sum())
+ go_minus_();
+ // else no change
+ }
+ }
+ }
+
+
+ template <typename S>
+ void
+ median<S>::go_minus_()
+ {
+ do
+ {
+ sum_plus_ += h_[i_];
+ do
+ --i_;
+ while (h_[i_] = 0);
+ sum_minus_ -= h_[i_];
+ }
+ while (2 * sum_minus_ > h_.sum());
+ v_ = s_[i_];
+ }
+
+
+ template <typename S>
+ void
+ median<S>::go_plus_()
+ {
+ do
+ {
+ sum_minus_ += h_[i_];
+ do
+ ++i_;
+ while (h_[i_] = 0);
+ sum_plus_ -= h_[i_];
+ }
+ while (2 * sum_plus_ > h_.sum());
+ v_ = s_[i_];
+ }
+
+
+ template <typename S>
+ void
+ median<S>::clear()
+ {
+ h_.clear();
+ sum_minus_ = 0;
+ sum_plus_ = 0;
+ i_ = (mln_max(value) - mln_min(value)) / 2;
+ v_ = s_[i_];
+ }
+
+ template <typename S>
+ median<S>::operator typename median<S>::value () const
+ {
+ return v_;
+ }
+
+ template <typename S>
+ typename median<S>::value
+ median<S>::to_value() const
+ {
+ return v_;
+ }
+
+ template <typename S>
+ std::ostream& operator<<(std::ostream& ostr, const median<S>& m)
+ {
+ m.debug__();
+ return ostr << m.to_value();
+ }
+
+
+# endif // ! MLN_INCLUDE_ONLY
+
+ } // end of namespace mln::value
+
+} // end of namespace mln
+
+
+#endif // ! MLN_VALUE_MEDIAN_HH
Index: mln/value/int_u.hh
--- mln/value/int_u.hh (revision 1002)
+++ mln/value/int_u.hh (working copy)
@@ -86,8 +86,17 @@
};
+ // Fwd decl.
+ template <typename T> struct vset_;
+
+
/// Alias for unsigned 8bit integers.
- typedef value::int_u_<8> int_u8;
+ typedef int_u_<8> int_u8;
+
+ /// Alias for the set of unsigned 8bit integers.
+ typedef vset_<int_u8> int_u8_set;
+
+
/*! \brief Print an int_u8 \p i into the output stream \p ostr.
1
0
https://svn.lrde.epita.fr/svn/oln/trunk/milena
Index: ChangeLog
from Thierry Geraud <thierry.geraud(a)lrde.epita.fr>
Add materials to handle values in milena.
* tests/vset.cc: New.
* tests/int_u8.cc: New.
* TODO: New.
* mln/core/concept/value_set.hh: New.
* mln/core/concept/viter.hh: New.
* mln/core/concept/doc/value_set.hh: New.
* mln/core/concept/doc/viter.hh: New.
* mln/core/concept/value.hh: New.
* mln/value/vset.hh: New.
* mln/value/viter.hh: New.
* mln/value/int_u.hh: New.
* mln/value/internal: New.
* mln/value/internal/value_like.hh: New.
* doc/Doxyfile.in (PREDEFINED): Add mln_viter et al.
* mln/core/macros.hh: Sort.
(mln_enc, mln_equiv): New.
* mln/value/props.hh (mln_card, card): New.
TODO | 25 ++++
doc/Doxyfile.in | 3
mln/core/concept/doc/value_set.hh | 79 +++++++++++++
mln/core/concept/doc/viter.hh | 58 +++++++++
mln/core/concept/value.hh | 73 ++++++++++++
mln/core/concept/value_set.hh | 88 ++++++++++++++
mln/core/concept/viter.hh | 104 +++++++++++++++++
mln/core/macros.hh | 97 ++++++++++++----
mln/value/int_u.hh | 130 ++++++++++++++++++++++
mln/value/internal/value_like.hh | 135 ++++++++++++++++++++++
mln/value/props.hh | 14 ++
mln/value/viter.hh | 224 ++++++++++++++++++++++++++++++++++++++
mln/value/vset.hh | 104 +++++++++++++++++
tests/int_u8.cc | 49 ++++++++
tests/vset.cc | 63 ++++++++++
15 files changed, 1220 insertions(+), 26 deletions(-)
Index: tests/vset.cc
--- tests/vset.cc (revision 0)
+++ tests/vset.cc (revision 0)
@@ -0,0 +1,63 @@
+// Copyright (C) 2007 EPITA Research and Development Laboratory
+//
+// This file is part of the Olena Library. This library is free
+// software; you can redistribute it and/or modify it under the terms
+// of the GNU General Public License version 2 as published by the
+// Free Software Foundation.
+//
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+// General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this library; see the file COPYING. If not, write to
+// the Free Software Foundation, 51 Franklin Street, Fifth Floor,
+// Boston, MA 02111-1307, USA.
+//
+// As a special exception, you may use this file as part of a free
+// software library without restriction. Specifically, if other files
+// instantiate templates or use macros or inline functions from this
+// file, or you compile this file and link it with other files to
+// produce an executable, this file does not by itself cause the
+// resulting executable to be covered by the GNU General Public
+// License. This exception does not however invalidate any other
+// reasons why the executable file might be covered by the GNU General
+// Public License.
+
+/*! \file tests/vset.cc
+ *
+ * \brief Tests on mln::vset.
+ */
+
+#include <mln/value/int_u.hh>
+#include <mln/value/vset.hh>
+
+
+
+int main()
+{
+ using namespace mln;
+
+ typedef bool T;
+ // typedef value::int_u8 T;
+ // typedef short T;
+
+ typedef value::vset_<T> S;
+ S s;
+
+ {
+ S::fwd_viter v(s);
+ for_all(v)
+ std::cout << v << ' ';
+ std::cout << std::endl;
+ }
+
+ {
+ S::bkd_viter v(s);
+ for_all(v)
+ std::cout << v << ' ';
+ std::cout << std::endl;
+ }
+
+}
Index: tests/int_u8.cc
--- tests/int_u8.cc (revision 0)
+++ tests/int_u8.cc (revision 0)
@@ -0,0 +1,49 @@
+// Copyright (C) 2007 EPITA Research and Development Laboratory
+//
+// This file is part of the Olena Library. This library is free
+// software; you can redistribute it and/or modify it under the terms
+// of the GNU General Public License version 2 as published by the
+// Free Software Foundation.
+//
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+// General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this library; see the file COPYING. If not, write to
+// the Free Software Foundation, 51 Franklin Street, Fifth Floor,
+// Boston, MA 02111-1307, USA.
+//
+// As a special exception, you may use this file as part of a free
+// software library without restriction. Specifically, if other files
+// instantiate templates or use macros or inline functions from this
+// file, or you compile this file and link it with other files to
+// produce an executable, this file does not by itself cause the
+// resulting executable to be covered by the GNU General Public
+// License. This exception does not however invalidate any other
+// reasons why the executable file might be covered by the GNU General
+// Public License.
+
+/*! \file tests/int_u8.cc
+ *
+ * \brief Tests on mln::value::int_u8.
+ */
+
+#include <mln/value/int_u.hh>
+
+
+
+int main()
+{
+ using namespace mln;
+ using value::int_u8;
+
+ int_u8 i = 3;
+ i = 2;
+ mln_assertion(i = 2);
+ mln_assertion(i != 3);
+
+ mln_assertion(-i = -2);
+ mln_assertion(-3 * i = -6);
+}
Index: doc/Doxyfile.in
--- doc/Doxyfile.in (revision 1001)
+++ doc/Doxyfile.in (working copy)
@@ -1051,6 +1051,9 @@
"mln_niter(T)=typename T::niter" \
"mln_fwd_niter(T)=typename T::fwd_niter" \
"mln_bkd_niter(T)=typename T::bkd_niter" \
+ "mln_viter(T)=typename T::viter" \
+ "mln_fwd_viter(T)=typename T::fwd_viter" \
+ "mln_bkd_viter(T)=typename T::bkd_viter" \
"mln_value(T)=typename T::value" \
"mln_rvalue(T)=typename T::rvalue" \
"mln_lvalue(T)=typename T::lvalue" \
Index: TODO
--- TODO (revision 0)
+++ TODO (revision 0)
@@ -0,0 +1,25 @@
+ -*- outline -*-
+
+
+* compilation
+
+g++-4.1 -I.. int_u8.cc -Wall -Wextra -Wconversion
+
+
+* value
+
+Value_Set
+props { ... }
+notion of lowq
++ values() : vset dans Image ?
+
+
+* function
+
+Function_p2v
+Function_p2b
+Function_v2w
+
+F apply(I, F)
+O transform(I, F)
+
Index: mln/core/macros.hh
--- mln/core/macros.hh (revision 1001)
+++ mln/core/macros.hh (working copy)
@@ -33,63 +33,108 @@
* \brief Definition of the set of milena macros.
*/
-/// Shortcut to access the point type associated to T.
-# define mln_point(T) typename T::point
-/// Shortcut to access the dpoint type associated to T.
-# define mln_dpoint(T) typename T::dpoint
+// b
-/// Shortcut to access the psite type associated to T.
-# define mln_psite(T) typename T::psite
+/// Shortcut to access the bkd_niter type associated to T.
+# define mln_bkd_niter(T) typename T::bkd_niter
-/// Shortcut to access the pset type associated to T.
-# define mln_pset(T) typename T::pset
+/// Shortcut to access the bkd_piter type associated to T.
+# define mln_bkd_piter(T) typename T::bkd_piter
+
+/// Shortcut to access the bkd_qiter type associated to T.
+# define mln_bkd_qiter(T) typename T::bkd_qiter
+
+/// Shortcut to access the bkd_viter type associated to T.
+# define mln_bkd_viter(T) typename T::bkd_viter
/// Shortcut to access the box type associated to T.
# define mln_box(T) typename T::box
+
+// c
+
/// Shortcut to access the coord type associated to T.
# define mln_coord(T) typename T::coord
-/// Shortcut to access the piter type associated to T.
-# define mln_piter(T) typename T::piter
+// d
+
+/// Shortcut to access the dpoint type associated to T.
+# define mln_dpoint(T) typename T::dpoint
+
+
+// e
+
+/// Shortcut to access the encoding type associated to T.
+# define mln_enc(T) typename T::enc
+
+/// Shortcut to access the equivalent type associated to T.
+# define mln_equiv(T) typename T::equiv
+
+
+// f
+
+/// Shortcut to access the fwd_niter type associated to T.
+# define mln_fwd_niter(T) typename T::fwd_niter
/// Shortcut to access the fwd_piter type associated to T.
# define mln_fwd_piter(T) typename T::fwd_piter
-/// Shortcut to access the bkd_piter type associated to T.
-# define mln_bkd_piter(T) typename T::bkd_piter
+/// Shortcut to access the fwd_qiter type associated to T.
+# define mln_fwd_qiter(T) typename T::fwd_qiter
+
+/// Shortcut to access the fwd_viter type associated to T.
+# define mln_fwd_viter(T) typename T::fwd_viter
+
+// l
+
+
+/// Shortcut to access the lvalue type associated to T.
+# define mln_lvalue(T) typename T::lvalue
+
+
+// p
+
+/// Shortcut to access the piter type associated to T.
+# define mln_piter(T) typename T::piter
+
+/// Shortcut to access the pset type associated to T.
+# define mln_pset(T) typename T::pset
+
+/// Shortcut to access the psite type associated to T.
+# define mln_psite(T) typename T::psite
+
+/// Shortcut to access the point type associated to T.
+# define mln_point(T) typename T::point
+
+
+// q
/// Shortcut to access the qiter type associated to T.
# define mln_qiter(T) typename T::qiter
-/// Shortcut to access the fwd_qiter type associated to T.
-# define mln_fwd_qiter(T) typename T::fwd_qiter
-
-/// Shortcut to access the bkd_qiter type associated to T.
-# define mln_bkd_qiter(T) typename T::bkd_qiter
+// n
/// Shortcut to access the niter type associated to T.
# define mln_niter(T) typename T::niter
-/// Shortcut to access the fwd_niter type associated to T.
-# define mln_fwd_niter(T) typename T::fwd_niter
-/// Shortcut to access the bkd_niter type associated to T.
-# define mln_bkd_niter(T) typename T::bkd_niter
+// r
+
+/// Shortcut to access the rvalue type associated to T.
+# define mln_rvalue(T) typename T::rvalue
+// v
+
/// Shortcut to access the value type associated to T.
# define mln_value(T) typename T::value
-/// Shortcut to access the rvalue type associated to T.
-# define mln_rvalue(T) typename T::rvalue
-
-/// Shortcut to access the lvalue type associated to T.
-# define mln_lvalue(T) typename T::lvalue
+/// Shortcut to access the viter type associated to T.
+# define mln_viter(T) typename T::viter
Index: mln/core/concept/value_set.hh
--- mln/core/concept/value_set.hh (revision 0)
+++ mln/core/concept/value_set.hh (revision 0)
@@ -0,0 +1,88 @@
+// Copyright (C) 2007 EPITA Research and Development Laboratory
+//
+// This file is part of the Olena Library. This library is free
+// software; you can redistribute it and/or modify it under the terms
+// of the GNU General Public License version 2 as published by the
+// Free Software Foundation.
+//
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+// General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this library; see the file COPYING. If not, write to
+// the Free Software Foundation, 51 Franklin Street, Fifth Floor,
+// Boston, MA 02111-1307, USA.
+//
+// As a special exception, you may use this file as part of a free
+// software library without restriction. Specifically, if other files
+// instantiate templates or use macros or inline functions from this
+// file, or you compile this file and link it with other files to
+// produce an executable, this file does not by itself cause the
+// resulting executable to be covered by the GNU General Public
+// License. This exception does not however invalidate any other
+// reasons why the executable file might be covered by the GNU General
+// Public License.
+
+#ifndef MLN_CORE_CONCEPT_VALUE_SET_HH
+# define MLN_CORE_CONCEPT_VALUE_SET_HH
+
+/*! \file mln/core/concept/value_set.hh
+ * \brief Definition of the concept of mln::Value_Set.
+ */
+
+# include <mln/core/concept/viter.hh>
+
+
+namespace mln
+{
+
+ /*! \brief Base class for implementation classes of sets of values.
+ *
+ * \see mln::doc::Value_Set for a complete documentation of this
+ * class contents.
+ */
+ template <typename E>
+ struct Value_Set : public Object<E>
+ {
+ /*
+ typedef value;
+ typedef viter;
+ typedef fwd_viter;
+ typedef bkd_viter;
+
+ bool has(const value& v) const;
+ value operator[](std::size_t i) const;
+ std::size_t nvalues() const;
+ */
+
+ protected:
+ Value_Set();
+ };
+
+
+# ifndef MLN_INCLUDE_ONLY
+
+ template <typename E>
+ Value_Set<E>::Value_Set()
+ {
+ typedef mln_value(E) value;
+ typedef mln_viter(E) viter;
+ typedef mln_fwd_viter(E) fwd_viter;
+ typedef mln_bkd_viter(E) bkd_viter;
+
+ bool (E::*m1)(const value&) const = & E::has;
+ m1 = 0;
+ value (E::*m2)(std::size_t) const = & E::operator[];
+ m2 = 0;
+ std::size_t (E::*m3)() const = & E::nvalues;
+ m3 = 0;
+ }
+
+# endif // ! MLN_INCLUDE_ONLY
+
+} // end of namespace mln
+
+
+#endif // ! MLN_CORE_CONCEPT_VALUE_SET_HH
Index: mln/core/concept/viter.hh
--- mln/core/concept/viter.hh (revision 0)
+++ mln/core/concept/viter.hh (revision 0)
@@ -0,0 +1,104 @@
+// Copyright (C) 2007 EPITA Research and Development Laboratory
+//
+// This file is part of the Olena Library. This library is free
+// software; you can redistribute it and/or modify it under the terms
+// of the GNU General Public License version 2 as published by the
+// Free Software Foundation.
+//
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+// General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this library; see the file COPYING. If not, write to
+// the Free Software Foundation, 51 Franklin Street, Fifth Floor,
+// Boston, MA 02111-1307, USA.
+//
+// As a special exception, you may use this file as part of a free
+// software library without restriction. Specifically, if other files
+// instantiate templates or use macros or inline functions from this
+// file, or you compile this file and link it with other files to
+// produce an executable, this file does not by itself cause the
+// resulting executable to be covered by the GNU General Public
+// License. This exception does not however invalidate any other
+// reasons why the executable file might be covered by the GNU General
+// Public License.
+
+#ifndef MLN_CORE_CONCEPT_VITER_HH
+# define MLN_CORE_CONCEPT_VITER_HH
+
+/*! \file mln/core/concept/viter.hh
+ *
+ * \brief Definition of the concept of mln::Viter.
+ */
+
+# include <mln/core/concept/iterator.hh>
+# include <mln/core/concept/genpoint.hh>
+
+
+namespace mln
+{
+
+ /*! \brief Base class for implementation of classes of iterator on
+ * values.
+ *
+ * An iterator on values is an iterator that browse over a set of
+ * values.
+ *
+ * \see mln::doc::Viter for a complete documentation of this class
+ * contents.
+ */
+ template <typename E>
+ struct Viter : public Iterator<E>
+ {
+ /*
+ typedef value;
+ operator value() const;
+ */
+
+ protected:
+ Viter();
+ };
+
+
+ /*! \brief Print an iterator \p v on value set into the output
+ * stream \p ostr.
+ *
+ * \param[in,out] ostr An output stream.
+ * \param[in] v An iterator on value set.
+ *
+ * \pre \p v is a valid.
+ *
+ * \return The modified output stream \p ostr.
+ *
+ * \relates mln::Viter
+ */
+ template <typename E>
+ std::ostream& operator<<(std::ostream& ostr, const Viter<E>& v);
+
+
+
+# ifndef MLN_INCLUDE_ONLY
+
+ template <typename E>
+ Viter<E>::Viter()
+ {
+ typedef mln_value(E) value;
+ value (E::*m)() const = & E::operator value;
+ m = 0;
+ }
+
+ template <typename E>
+ std::ostream& operator<<(std::ostream& ostr, const Viter<E>& v)
+ {
+ mln_precondition(exact(v).is_valid());
+ return ostr << mln_value(E)(exact(v));
+ }
+
+# endif // ! MLN_INCLUDE_ONLY
+
+} // end of namespace mln
+
+
+#endif // ! MLN_CORE_CONCEPT_VITER_HH
Index: mln/core/concept/doc/value_set.hh
--- mln/core/concept/doc/value_set.hh (revision 0)
+++ mln/core/concept/doc/value_set.hh (revision 0)
@@ -0,0 +1,79 @@
+// Copyright (C) 2007 EPITA Research and Development Laboratory
+//
+// This file is part of the Olena Library. This library is free
+// software; you can redistribute it and/or modify it under the terms
+// of the GNU General Public License version 2 as published by the
+// Free Software Foundation.
+//
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+// General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this library; see the file COPYING. If not, write to
+// the Free Software Foundation, 51 Franklin Street, Fifth Floor,
+// Boston, MA 02111-1307, USA.
+//
+// As a special exception, you may use this file as part of a free
+// software library without restriction. Specifically, if other files
+// instantiate templates or use macros or inline functions from this
+// file, or you compile this file and link it with other files to
+// produce an executable, this file does not by itself cause the
+// resulting executable to be covered by the GNU General Public
+// License. This exception does not however invalidate any other
+// reasons why the executable file might be covered by the GNU General
+// Public License.
+
+/*! \file mln/core/concept/doc/value_set.hh
+ * \brief This file documents the concept of mln::Value_Set.
+ */
+
+namespace mln
+{
+
+ namespace doc
+ {
+
+ /*! \brief Documentation class for mln::Value_Set.
+ *
+ * \see mln::Value_Set
+ */
+ template <typename E>
+ struct Value_Set : public Object<E>
+ {
+ /*! \brief Value associated type.
+ */
+ typedef void value;
+
+ /*! \brief Viter associated type.
+ */
+ typedef void viter;
+
+ /*! \brief Forward Viter associated type.
+ */
+ typedef void fwd_viter;
+
+ /*! \brief Backward Viter associated type.
+ */
+ typedef void bkd_viter;
+
+ /*! \brief Test if \p v belongs to this set of values.
+ *
+ * \param[in] v A value.
+ * \return True if \p v is an element of the set of values.
+ */
+ bool has(const value& v) const;
+
+ /*! \brief Give the number of values in this set.
+ */
+ std::size_t nvalues() const;
+
+ /*! \brief Give the \p i-th value of this set.
+ */
+ value operator[](std::size_t i) const;
+ };
+
+ } // end of namespace mln::doc
+
+} // end of namespace mln
Index: mln/core/concept/doc/viter.hh
--- mln/core/concept/doc/viter.hh (revision 0)
+++ mln/core/concept/doc/viter.hh (revision 0)
@@ -0,0 +1,58 @@
+// Copyright (C) 2007 EPITA Research and Development Laboratory
+//
+// This file is part of the Olena Library. This library is free
+// software; you can redistribute it and/or modify it under the terms
+// of the GNU General Public License version 2 as published by the
+// Free Software Foundation.
+//
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+// General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this library; see the file COPYING. If not, write to
+// the Free Software Foundation, 51 Franklin Street, Fifth Floor,
+// Boston, MA 02111-1307, USA.
+//
+// As a special exception, you may use this file as part of a free
+// software library without restriction. Specifically, if other files
+// instantiate templates or use macros or inline functions from this
+// file, or you compile this file and link it with other files to
+// produce an executable, this file does not by itself cause the
+// resulting executable to be covered by the GNU General Public
+// License. This exception does not however invalidate any other
+// reasons why the executable file might be covered by the GNU General
+// Public License.
+
+/*! \file mln/core/concept/doc/viter.hh
+ * \brief This file documents the concept of mln::Viter.
+ */
+
+namespace mln
+{
+
+ namespace doc
+ {
+
+ /*! \brief Documentation class for mln::Viter.
+ *
+ * \see mln::Viter
+ */
+ template <typename E>
+ struct Viter : public Iterator<E>
+ {
+ /*! \brief Value associated type.
+ */
+ typedef void value;
+
+ /*! \brief Convertion into a value.
+ *
+ * \return A value.
+ */
+ operator value() const;
+ };
+
+ } // end of namespace mln::doc
+
+} // end of namespace mln
Index: mln/core/concept/value.hh
--- mln/core/concept/value.hh (revision 0)
+++ mln/core/concept/value.hh (revision 0)
@@ -0,0 +1,73 @@
+// Copyright (C) 2007 EPITA Research and Development Laboratory
+//
+// This file is part of the Olena Library. This library is free
+// software; you can redistribute it and/or modify it under the terms
+// of the GNU General Public License version 2 as published by the
+// Free Software Foundation.
+//
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+// General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this library; see the file COPYING. If not, write to
+// the Free Software Foundation, 51 Franklin Street, Fifth Floor,
+// Boston, MA 02111-1307, USA.
+//
+// As a special exception, you may use this file as part of a free
+// software library without restriction. Specifically, if other files
+// instantiate templates or use macros or inline functions from this
+// file, or you compile this file and link it with other files to
+// produce an executable, this file does not by itself cause the
+// resulting executable to be covered by the GNU General Public
+// License. This exception does not however invalidate any other
+// reasons why the executable file might be covered by the GNU General
+// Public License.
+
+#ifndef MLN_CORE_CONCEPT_VALUE_HH
+# define MLN_CORE_CONCEPT_VALUE_HH
+
+/*! \file mln/core/concept/value.hh
+ * \brief Definition of the concept of mln::Value.
+ */
+
+# include <mln/core/concept/object.hh>
+
+
+namespace mln
+{
+
+ /*! \brief Base class for implementation classes of values.
+ *
+ * \see mln::doc::Value for a complete documentation of this class
+ * contents.
+ */
+ template <typename E>
+ struct Value : public Object<E>
+ {
+ /*
+ typedef enc; // encoding type
+ typedef equiv; // equivalent type
+ */
+
+ protected:
+ Value();
+ };
+
+
+# ifndef MLN_INCLUDE_ONLY
+
+ template <typename E>
+ Value<E>::Value()
+ {
+ typedef mln_enc(E) enc;
+ typedef mln_equiv(E) equiv;
+ }
+
+# endif // ! MLN_INCLUDE_ONLY
+
+} // end of namespace mln
+
+
+#endif // ! MLN_CORE_CONCEPT_VALUE_HH
Index: mln/value/vset.hh
--- mln/value/vset.hh (revision 0)
+++ mln/value/vset.hh (revision 0)
@@ -0,0 +1,104 @@
+// Copyright (C) 2007 EPITA Research and Development Laboratory
+//
+// This file is part of the Olena Library. This library is free
+// software; you can redistribute it and/or modify it under the terms
+// of the GNU General Public License version 2 as published by the
+// Free Software Foundation.
+//
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+// General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this library; see the file COPYING. If not, write to
+// the Free Software Foundation, 51 Franklin Street, Fifth Floor,
+// Boston, MA 02111-1307, USA.
+//
+// As a special exception, you may use this file as part of a free
+// software library without restriction. Specifically, if other files
+// instantiate templates or use macros or inline functions from this
+// file, or you compile this file and link it with other files to
+// produce an executable, this file does not by itself cause the
+// resulting executable to be covered by the GNU General Public
+// License. This exception does not however invalidate any other
+// reasons why the executable file might be covered by the GNU General
+// Public License.
+
+#ifndef MLN_VALUE_VSET_HH
+# define MLN_VALUE_VSET_HH
+
+/*! \file mln/value/vset.hh
+ *
+ * \brief Define some basic sets of values from value types.
+ */
+
+# include <mln/core/concept/value_set.hh>
+# include <mln/value/props.hh>
+
+
+namespace mln
+{
+
+ namespace value
+ {
+
+ // Fwd decls.
+ template <typename S> struct fwd_viter_;
+ template <typename S> struct bkd_viter_;
+
+
+ /*! Class that defines the properties of the value type \c T.
+ */
+ template <typename T>
+ struct vset_ : public Value_Set< vset_<T> >
+ {
+ typedef T value;
+
+ typedef fwd_viter_< vset_<T> > fwd_viter;
+ typedef bkd_viter_< vset_<T> > bkd_viter;
+ typedef fwd_viter viter;
+
+ bool has(const T& v) const;
+
+ T operator[](std::size_t i) const;
+
+ std::size_t nvalues() const;
+ };
+
+
+# ifndef MLN_INCLUDE_ONLY
+
+ template <typename T>
+ bool
+ vset_<T>::has(const T& v) const
+ {
+ return true;
+ }
+
+ template <typename T>
+ T
+ vset_<T>::operator[](std::size_t i) const
+ {
+ mln_precondition(i < nvalues());
+ return mln_min(T) + i;
+ }
+
+ template <typename T>
+ std::size_t
+ vset_<T>::nvalues() const
+ {
+ return mln_card(T);
+ }
+
+# endif // ! MLN_INCLUDE_ONLY
+
+ } // end of namespace mln::value
+
+} // end of namespace mln
+
+
+# include <mln/value/viter.hh>
+
+
+#endif // ! MLN_VALUE_VSET_HH
Index: mln/value/props.hh
--- mln/value/props.hh (revision 1001)
+++ mln/value/props.hh (working copy)
@@ -45,6 +45,10 @@
# define mln_max(T) mln::value::props<T>::max()
+/// Get the number of values for value type \c T.
+# define mln_card(T) mln::value::props<T>::card()
+
+
namespace mln
{
@@ -62,6 +66,9 @@
/// Maximum value for type \c T.
static T max();
+
+ /// Number of values for type \c T.
+ static std::size_t card();
};
@@ -72,6 +79,7 @@
{
static bool min() { return false; }
static bool max() { return true; }
+ static std::size_t card() { return 2; }
};
// integers
@@ -81,6 +89,7 @@
{
static unsigned char min() { return 0; }
static unsigned char max() { return 255; }
+ static std::size_t card() { return 256; }
};
template <>
@@ -88,6 +97,7 @@
{
static signed char min() { return -128; }
static signed char max() { return 127; }
+ static std::size_t card() { return 256; }
};
template <>
@@ -95,6 +105,7 @@
{
static unsigned short min() { return 0; }
static unsigned short max() { return 65535; }
+ static std::size_t card() { return 65536; }
};
template <>
@@ -102,6 +113,7 @@
{
static signed short min() { return -32768; }
static signed short max() { return 32767; }
+ static std::size_t card() { return 655356; }
};
template <>
@@ -109,6 +121,7 @@
{
static unsigned int min() { return 0; }
static unsigned int max() { return UINT_MAX; }
+ static std::size_t card() { return std::size_t(UINT_MAX) + 1; }
};
template <>
@@ -116,6 +129,7 @@
{
static signed int min() { return INT_MIN; }
static signed int max() { return INT_MAX; }
+ static std::size_t card() { return std::size_t(UINT_MAX) + 1; }
};
template <>
Index: mln/value/viter.hh
--- mln/value/viter.hh (revision 0)
+++ mln/value/viter.hh (revision 0)
@@ -0,0 +1,224 @@
+// Copyright (C) 2007 EPITA Research and Development Laboratory
+//
+// This file is part of the Olena Library. This library is free
+// software; you can redistribute it and/or modify it under the terms
+// of the GNU General Public License version 2 as published by the
+// Free Software Foundation.
+//
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+// General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this library; see the file COPYING. If not, write to
+// the Free Software Foundation, 51 Franklin Street, Fifth Floor,
+// Boston, MA 02111-1307, USA.
+//
+// As a special exception, you may use this file as part of a free
+// software library without restriction. Specifically, if other files
+// instantiate templates or use macros or inline functions from this
+// file, or you compile this file and link it with other files to
+// produce an executable, this file does not by itself cause the
+// resulting executable to be covered by the GNU General Public
+// License. This exception does not however invalidate any other
+// reasons why the executable file might be covered by the GNU General
+// Public License.
+
+#ifndef MLN_VALUE_VITER_HH
+# define MLN_VALUE_VITER_HH
+
+/*! \file mln/value/viter.hh
+ *
+ * \brief Definition of iterators on value sets.
+ */
+
+# include <mln/core/concept/viter.hh>
+
+
+
+namespace mln
+{
+
+ namespace value
+ {
+
+
+ /*! \brief FIXME: Forward iterator on a set of values.
+ *
+ * The parameter \c S is the type of value set.
+ */
+ template <typename S>
+ struct fwd_viter_ : public Viter< fwd_viter_<S> >
+ {
+ /// Value associated type.
+ typedef mln_value(S) value;
+
+ /// Constructor.
+ fwd_viter_(const Value_Set<S>& s);
+
+ /// Convertion into a value.
+ operator value() const;
+
+ /// Test if the iterator is valid.
+ bool is_valid() const;
+
+ /// Invalidate the iterator.
+ void invalidate();
+
+ /// Start an iteration.
+ void start();
+
+ /// Go to the next value.
+ void next_();
+
+ private:
+
+ const S& s_;
+ std::size_t i_;
+ };
+
+
+
+
+ /*! \brief FIXME: Backward iterator on a set of values.
+ *
+ * The parameter \c S is the type of value set.
+ */
+ template <typename S>
+ struct bkd_viter_ : public Viter< bkd_viter_<S> >
+ {
+ /// Value associated type.
+ typedef mln_value(S) value;
+
+ /// Constructor.
+ bkd_viter_(const Value_Set<S>& s);
+
+ /// Convertion into a value.
+ operator value() const;
+
+ /// Test if the iterator is valid.
+ bool is_valid() const;
+
+ /// Invalidate the iterator.
+ void invalidate();
+
+ /// Start an iteration.
+ void start();
+
+ /// Go to the next value.
+ void next_();
+
+ private:
+
+ const S& s_;
+ std::size_t i_;
+ };
+
+
+
+# ifndef MLN_INCLUDE_ONLY
+
+
+ // fwd_viter_<S>
+
+ template <typename S>
+ fwd_viter_<S>::fwd_viter_(const Value_Set<S>& s)
+ : s_(exact(s))
+ {
+ invalidate();
+ }
+
+ template <typename S>
+ fwd_viter_<S>::operator typename fwd_viter_<S>::value () const
+ {
+ mln_precondition(is_valid());
+ return s_[i_];
+ }
+
+ template <typename S>
+ bool
+ fwd_viter_<S>::is_valid() const
+ {
+ return i_ < s_.nvalues();
+ }
+
+ template <typename S>
+ void
+ fwd_viter_<S>::invalidate()
+ {
+ i_ = s_.nvalues();
+ }
+
+ template <typename S>
+ void
+ fwd_viter_<S>::start()
+ {
+ i_ = 0;
+ }
+
+ template <typename S>
+ void
+ fwd_viter_<S>::next_()
+ {
+ ++i_;
+ }
+
+
+ // bkd_viter_<S>
+
+ template <typename S>
+ bkd_viter_<S>::bkd_viter_(const Value_Set<S>& s)
+ : s_(exact(s))
+ {
+ invalidate();
+ }
+
+ template <typename S>
+ bkd_viter_<S>::operator typename bkd_viter_<S>::value () const
+ {
+ mln_precondition(is_valid());
+ return s_[i_];
+ }
+
+ template <typename S>
+ bool
+ bkd_viter_<S>::is_valid() const
+ {
+ return i_ != s_.nvalues();
+ }
+
+ template <typename S>
+ void
+ bkd_viter_<S>::invalidate()
+ {
+ i_ = s_.nvalues();
+ }
+
+ template <typename S>
+ void
+ bkd_viter_<S>::start()
+ {
+ i_ = s_.nvalues() - 1;
+ }
+
+ template <typename S>
+ void
+ bkd_viter_<S>::next_()
+ {
+ if (i_ = 0)
+ {
+ invalidate();
+ return;
+ }
+ --i_;
+ }
+
+# endif // ! MLN_INCLUDE_ONLY
+
+ } // end of namespace mln::value
+
+} // end of namespace mln
+
+
+#endif // ! MLN_VALUE_VITER_HH
Index: mln/value/int_u.hh
--- mln/value/int_u.hh (revision 0)
+++ mln/value/int_u.hh (revision 0)
@@ -0,0 +1,130 @@
+// Copyright (C) 2007 EPITA Research and Development Laboratory
+//
+// This file is part of the Olena Library. This library is free
+// software; you can redistribute it and/or modify it under the terms
+// of the GNU General Public License version 2 as published by the
+// Free Software Foundation.
+//
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+// General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this library; see the file COPYING. If not, write to
+// the Free Software Foundation, 51 Franklin Street, Fifth Floor,
+// Boston, MA 02111-1307, USA.
+//
+// As a special exception, you may use this file as part of a free
+// software library without restriction. Specifically, if other files
+// instantiate templates or use macros or inline functions from this
+// file, or you compile this file and link it with other files to
+// produce an executable, this file does not by itself cause the
+// resulting executable to be covered by the GNU General Public
+// License. This exception does not however invalidate any other
+// reasons why the executable file might be covered by the GNU General
+// Public License.
+
+#ifndef MLN_VALUE_INT_U_HH
+# define MLN_VALUE_INT_U_HH
+
+/*! \file mln/value/int_u.hh
+ *
+ * \brief Define a generic class for unsigned integers.
+ */
+
+# include <mln/core/concept/value.hh>
+# include <mln/value/internal/value_like.hh>
+# include <mln/value/props.hh>
+
+
+namespace mln
+{
+
+ namespace value
+ {
+
+
+ namespace internal
+ {
+ template <unsigned n> struct encoding_;
+ template <> struct encoding_<8> { typedef unsigned char ret; };
+ }
+
+
+ /*! \brief Unsigned integer value class.
+ *
+ * The parameter is \c n the number of encoding bits.
+ */
+ template <unsigned n>
+ struct int_u_
+ : public internal::value_like_< typename internal::encoding_<n>::ret,
+ int_u_<n> >
+ {
+ protected:
+ typedef internal::value_like_< typename internal::encoding_<n>::ret,
+ int_u_<n> > super;
+
+ public:
+
+ /// Encoding associated type.
+ typedef typename super::enc enc;
+
+ /// Constructor without argument.
+ int_u_();
+
+ /// Constructor from an integer.
+ int_u_(int i);
+ };
+
+
+
+
+ template <unsigned n>
+ struct props< int_u_<n> > : public props< typename internal::encoding_<n>::ret >
+ {
+ };
+
+
+ /// Alias for unsigned 8bit integers.
+ typedef value::int_u_<8> int_u8;
+
+
+ /*! \brief Print an int_u8 \p i into the output stream \p ostr.
+ *
+ * \param[in,out] ostr An output stream.
+ * \param[in] i An int_u8.
+ *
+ * \return The modified output stream \p ostr.
+ */
+ std::ostream& operator<<(std::ostream& ostr, const int_u8& i);
+
+
+# ifndef MLN_INCLUDE_ONLY
+
+ template <unsigned n>
+ int_u_<n>::int_u_()
+ {
+ }
+
+ template <unsigned n>
+ int_u_<n>::int_u_(int i)
+ {
+ mln_precondition(i >= 0);
+ mln_precondition(i <= mln_max(enc));
+ this->v_ = enc(i);
+ }
+
+ std::ostream& operator<<(std::ostream& ostr, const int_u8& i)
+ {
+ return ostr << unsigned(i);
+ }
+
+# endif // ! MLN_INCLUDE_ONLY
+
+ } // end of namespace mln::value
+
+} // end of namespace mln
+
+
+#endif // ! MLN_VALUE_INT_U_HH
Index: mln/value/internal/value_like.hh
--- mln/value/internal/value_like.hh (revision 0)
+++ mln/value/internal/value_like.hh (revision 0)
@@ -0,0 +1,135 @@
+// Copyright (C) 2007 EPITA Research and Development Laboratory
+//
+// This file is part of the Olena Library. This library is free
+// software; you can redistribute it and/or modify it under the terms
+// of the GNU General Public License version 2 as published by the
+// Free Software Foundation.
+//
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+// General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this library; see the file COPYING. If not, write to
+// the Free Software Foundation, 51 Franklin Street, Fifth Floor,
+// Boston, MA 02111-1307, USA.
+//
+// As a special exception, you may use this file as part of a free
+// software library without restriction. Specifically, if other files
+// instantiate templates or use macros or inline functions from this
+// file, or you compile this file and link it with other files to
+// produce an executable, this file does not by itself cause the
+// resulting executable to be covered by the GNU General Public
+// License. This exception does not however invalidate any other
+// reasons why the executable file might be covered by the GNU General
+// Public License.
+
+#ifndef MLN_VALUE_INTERNAL_VALUE_LIKE_HH
+# define MLN_VALUE_INTERNAL_VALUE_LIKE_HH
+
+/*! \file mln/value/internal/value_like.hh
+ *
+ * \brief Factor code for value classes defined over another type.
+ *
+ * \internal
+ */
+
+# include <mln/core/concept/value.hh>
+
+
+namespace mln
+{
+
+ namespace value
+ {
+
+ namespace internal
+ {
+
+ /*! \brief Base class for value classes defined over another
+ * type.
+ *
+ * \internal
+ *
+ * Parameters are \c V the equivalent value type and \c E the
+ * exact value type.
+ */
+ template <typename V, typename E>
+ struct value_like_ : public Value<E>
+ {
+ /// Encoding associated type.
+ typedef V enc;
+
+ /// Equivalent associated type.
+ typedef V equiv;
+
+ /// Convertion towards equivalent type.
+ operator V() const;
+
+ /// Assignment from equivalent type.
+ E& operator=(const V& v);
+
+ protected:
+ enc v_; /// The actual value.
+ };
+
+
+ /*! \brief General definition of the "equal to" operator between
+ * value-like types.
+ *
+ * \relates value_like_
+ */
+ template <typename V, typename E>
+ bool operator=(const value_like_<V,E>& lhs, const value_like_<V,E>& rhs);
+
+
+ /*! \brief General definition of the "less than" operator
+ * between value-like types.
+ *
+ * \relates value_like_
+ */
+ template <typename V, typename E>
+ bool operator<(const value_like_<V,E>& lhs, const value_like_<V,E>& rhs);
+
+
+# ifndef MLN_INCLUDE_ONLY
+
+ template <typename V, typename E>
+ value_like_<V, E>::operator V() const
+ {
+ return v_;
+ }
+
+ template <typename V, typename E>
+ E&
+ value_like_<V, E>::operator=(const V& v)
+ {
+ v_ = v;
+ return exact(*this);
+ }
+
+ template <typename V, typename E>
+ bool operator=(const value_like_<V, E>& lhs,
+ const value_like_<V, E>& rhs)
+ {
+ return V(lhs) = V(rhs);
+ }
+
+ template <typename V, typename E>
+ bool operator<(const value_like_<V, E>& lhs,
+ const value_like_<V, E>& rhs)
+ {
+ return V(lhs) < V(rhs);
+ }
+
+# endif // ! MLN_INCLUDE_ONLY
+
+ } // end of namespace mln::value::internal
+
+ } // end of namespace mln::value
+
+} // end of namespace mln
+
+
+#endif // ! MLN_VALUE_INTERNAL_VALUE_LIKE_HH
1
0
https://svn.lrde.epita.fr/svn/oln/trunk/milena
Index: ChangeLog
from Thierry Geraud <thierry.geraud(a)lrde.epita.fr>
Make milena work correctly with g++-2.95.
* mln/core/exact.hh (force_exact): Move in...
* mln/core/internal/force_exact.hh: ...this new file.
(force_exact_): Now a method and g++-2.95 compatible.
* mln/core/concept/genpoint.hh: Update.
* mln/core/dpoints_piter.hh: Update.
* mln/core/internal/coord_impl.hh: Update.
* tests/window2d.cc: New.
* tests/box2d.cc: New.
* tests/point2d.cc: New.
* tests/dpoint2d.cc: New.
* mln/fun: New.
* mln/fun/all.hh: New.
* mln/core/window.hh (is_centered): Update.
* doc/Doxyfile.in (PREDEFINED): Add extra macros.
* mln/core/point.hh (point_): Change arg from val to fun.
* mln/core/dpoint.hh (dpoint_): Change arg from val to fun.
* mln/core/image2d.hh: Add explicit typedefs.
doc/Doxyfile.in | 12 +++++
mln/core/concept/genpoint.hh | 28 +++++++----
mln/core/dpoint.hh | 11 ++--
mln/core/dpoints_piter.hh | 2
mln/core/exact.hh | 84 -----------------------------------
mln/core/image2d.hh | 11 ++++
mln/core/internal/coord_impl.hh | 55 +++++++++++++++--------
mln/core/internal/force_exact.hh | 62 ++++++++++++++++++++++++++
mln/core/point.hh | 15 +++---
mln/core/window.hh | 3 -
mln/fun/all.hh | 92 +++++++++++++++++++++++++++++++++++++++
tests/box2d.cc | 42 +++++++++++++++++
tests/dpoint2d.cc | 50 +++++++++++++++++++++
tests/point2d.cc | 59 +++++++++++++++++++++++++
tests/window2d.cc | 43 ++++++++++++++++++
15 files changed, 445 insertions(+), 124 deletions(-)
Index: tests/window2d.cc
--- tests/window2d.cc (revision 0)
+++ tests/window2d.cc (revision 0)
@@ -0,0 +1,43 @@
+// Copyright (C) 2007 EPITA Research and Development Laboratory
+//
+// This file is part of the Olena Library. This library is free
+// software; you can redistribute it and/or modify it under the terms
+// of the GNU General Public License version 2 as published by the
+// Free Software Foundation.
+//
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+// General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this library; see the file COPYING. If not, write to
+// the Free Software Foundation, 51 Franklin Street, Fifth Floor,
+// Boston, MA 02111-1307, USA.
+//
+// As a special exception, you may use this file as part of a free
+// software library without restriction. Specifically, if other files
+// instantiate templates or use macros or inline functions from this
+// file, or you compile this file and link it with other files to
+// produce an executable, this file does not by itself cause the
+// resulting executable to be covered by the GNU General Public
+// License. This exception does not however invalidate any other
+// reasons why the executable file might be covered by the GNU General
+// Public License.
+
+/*! \file tests/window2d.cc
+ *
+ * \brief Tests on mln::window2d.
+ */
+
+#include <mln/core/window2d.hh>
+
+
+
+int main()
+{
+ using namespace mln;
+
+ window2d w;
+ std::cout << w.is_centered() << std::endl;
+}
Index: tests/box2d.cc
--- tests/box2d.cc (revision 0)
+++ tests/box2d.cc (revision 0)
@@ -0,0 +1,42 @@
+// Copyright (C) 2007 EPITA Research and Development Laboratory
+//
+// This file is part of the Olena Library. This library is free
+// software; you can redistribute it and/or modify it under the terms
+// of the GNU General Public License version 2 as published by the
+// Free Software Foundation.
+//
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+// General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this library; see the file COPYING. If not, write to
+// the Free Software Foundation, 51 Franklin Street, Fifth Floor,
+// Boston, MA 02111-1307, USA.
+//
+// As a special exception, you may use this file as part of a free
+// software library without restriction. Specifically, if other files
+// instantiate templates or use macros or inline functions from this
+// file, or you compile this file and link it with other files to
+// produce an executable, this file does not by itself cause the
+// resulting executable to be covered by the GNU General Public
+// License. This exception does not however invalidate any other
+// reasons why the executable file might be covered by the GNU General
+// Public License.
+
+/*! \file tests/box2d.cc
+ *
+ * \brief Tests on mln::box2d.
+ */
+
+#include <mln/core/box2d.hh>
+
+
+
+int main()
+{
+ using namespace mln;
+
+ box2d b(2, 3);
+}
Index: tests/point2d.cc
--- tests/point2d.cc (revision 0)
+++ tests/point2d.cc (revision 0)
@@ -0,0 +1,59 @@
+// Copyright (C) 2007 EPITA Research and Development Laboratory
+//
+// This file is part of the Olena Library. This library is free
+// software; you can redistribute it and/or modify it under the terms
+// of the GNU General Public License version 2 as published by the
+// Free Software Foundation.
+//
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+// General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this library; see the file COPYING. If not, write to
+// the Free Software Foundation, 51 Franklin Street, Fifth Floor,
+// Boston, MA 02111-1307, USA.
+//
+// As a special exception, you may use this file as part of a free
+// software library without restriction. Specifically, if other files
+// instantiate templates or use macros or inline functions from this
+// file, or you compile this file and link it with other files to
+// produce an executable, this file does not by itself cause the
+// resulting executable to be covered by the GNU General Public
+// License. This exception does not however invalidate any other
+// reasons why the executable file might be covered by the GNU General
+// Public License.
+
+/*! \file tests/point2d.cc
+ *
+ * \brief Tests on mln::point2d.
+ */
+
+#include <mln/core/point2d.hh>
+
+
+
+int main()
+{
+ using namespace mln;
+
+ point2d p, q;
+
+ // assignment
+
+ p[0] = 4;
+ p.row() += 1;
+ mln_assertion(p.row() = 5 && p[0] = 5);
+ p[1] = 0;
+ p.col() += 1;
+ mln_assertion(p.col() = 1 && p[1] = 1);
+
+ // construction
+ q = mk_point2d(5, 1);
+ mln_assertion(p = q);
+
+ q.set_all(0);
+ for (unsigned i = 0; i < p.dim; ++i)
+ mln_assertion(q[i] = 0);
+}
Index: tests/dpoint2d.cc
--- tests/dpoint2d.cc (revision 0)
+++ tests/dpoint2d.cc (revision 0)
@@ -0,0 +1,50 @@
+// Copyright (C) 2007 EPITA Research and Development Laboratory
+//
+// This file is part of the Olena Library. This library is free
+// software; you can redistribute it and/or modify it under the terms
+// of the GNU General Public License version 2 as published by the
+// Free Software Foundation.
+//
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+// General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this library; see the file COPYING. If not, write to
+// the Free Software Foundation, 51 Franklin Street, Fifth Floor,
+// Boston, MA 02111-1307, USA.
+//
+// As a special exception, you may use this file as part of a free
+// software library without restriction. Specifically, if other files
+// instantiate templates or use macros or inline functions from this
+// file, or you compile this file and link it with other files to
+// produce an executable, this file does not by itself cause the
+// resulting executable to be covered by the GNU General Public
+// License. This exception does not however invalidate any other
+// reasons why the executable file might be covered by the GNU General
+// Public License.
+
+/*! \file tests/dpoint2d.cc
+ *
+ * \brief Tests on mln::dpoint2d.
+ */
+
+#include <mln/core/dpoint2d.hh>
+
+
+
+int main()
+{
+ using namespace mln;
+
+ point2d p, q;
+ dpoint2d dp;
+
+ p = mk_point2d(1, 2);
+ q = mk_point2d(4, 7);
+ dp = mk_dpoint2d(3, 5);
+
+ mln_assertion(dp = q - p);
+ mln_assertion(q = p + dp);
+}
Index: doc/Doxyfile.in
--- doc/Doxyfile.in (revision 1000)
+++ doc/Doxyfile.in (working copy)
@@ -1042,6 +1042,18 @@
# instead of the = operator.
PREDEFINED = \
+ "mln_piter(T)=typename T::piter" \
+ "mln_fwd_piter(T)=typename T::fwd_piter" \
+ "mln_bkd_piter(T)=typename T::bkd_piter" \
+ "mln_qiter(T)=typename T::qiter" \
+ "mln_fwd_qiter(T)=typename T::fwd_qiter" \
+ "mln_bkd_qiter(T)=typename T::bkd_qiter" \
+ "mln_niter(T)=typename T::niter" \
+ "mln_fwd_niter(T)=typename T::fwd_niter" \
+ "mln_bkd_niter(T)=typename T::bkd_niter" \
+ "mln_value(T)=typename T::value" \
+ "mln_rvalue(T)=typename T::rvalue" \
+ "mln_lvalue(T)=typename T::lvalue" \
"mln_coord(T)=typename T::coord" \
"mln_point(T)=typename T::point" \
"mln_dpoint(T)=typename T::dpoint"
Index: mln/core/dpoints_piter.hh
--- mln/core/dpoints_piter.hh (revision 1000)
+++ mln/core/dpoints_piter.hh (working copy)
@@ -112,7 +112,7 @@
dpoints_fwd_piter<D>::dpoints_fwd_piter(const Dps& dps,
const GenPoint<Pref>& p_ref)
: dps_(exact(dps).vec()),
- p_ref_(* force_exact<Pref>(p_ref).pointer())
+ p_ref_(* p_ref.force_exact_().pointer())
{
invalidate();
}
Index: mln/core/point.hh
--- mln/core/point.hh (revision 1000)
+++ mln/core/point.hh (working copy)
@@ -83,9 +83,10 @@
*/
point_();
- /*! \brief Constructor; all coordinates are set to the value \p c.
+ /*! \brief Constructor; coordinates are set by function \p f.
*/
- point_(C c);
+ template <typename F>
+ point_(F f);
/*! \brief Set all coordinates to the value \p c.
*/
@@ -102,14 +103,14 @@
C point_<n,C>::operator[](unsigned i) const
{
assert(i < n);
- return coord_[i];
+ return this->coord_[i];
}
template <unsigned n, typename C>
C& point_<n,C>::operator[](unsigned i)
{
assert(i < n);
- return coord_[i];
+ return this->coord_[i];
}
template <unsigned n, typename C>
@@ -118,9 +119,11 @@
}
template <unsigned n, typename C>
- point_<n,C>::point_(C c)
+ template <typename F>
+ point_<n,C>::point_(F f)
{
- set_all(c);
+ for (unsigned i = 0; i < n; ++i)
+ coord_[i] = f(i);
}
template <unsigned n, typename C>
Index: mln/core/concept/genpoint.hh
--- mln/core/concept/genpoint.hh (revision 1000)
+++ mln/core/concept/genpoint.hh (working copy)
@@ -36,8 +36,10 @@
# include <mlc/same_coord.hh>
# include <mln/core/concept/object.hh>
+
# include <mln/core/macros.hh>
# include <mln/core/contract.hh>
+# include <mln/core/internal/force_exact.hh>
namespace mln
@@ -57,7 +59,8 @@
* class contents.
*/
template <typename E>
- struct GenPoint // stand-alone class!
+ struct GenPoint
+ // : virtual internal::object_<E>
{
/*
@@ -75,8 +78,11 @@
coord operator[](unsigned i) const;
*/
+ mln_internal_add_force_exact_(GenPoint<E>)
+
protected:
GenPoint();
+
};
@@ -189,8 +195,9 @@
template <typename E>
GenPoint<E>::GenPoint()
{
- const int dim = E::dim;
+ int dim = E::dim;
mln_invariant(dim > 0);
+ dim = 0;
typedef mln_point(E) point;
typedef mln_dpoint(E) dpoint;
typedef mln_coord(E) coord;
@@ -204,8 +211,8 @@
bool operator=(const GenPoint<Pl>& lhs, const GenPoint<Pr>& rhs)
{
// FIXME: mlc::same_grid<Pl, Pr>::check();
- const Pl& lhs_ = force_exact<Pl>(lhs);
- const Pr& rhs_ = force_exact<Pr>(rhs);
+ const Pl& lhs_ = lhs.force_exact_();
+ const Pr& rhs_ = rhs.force_exact_();
mlc::same_point<Pl, Pr>::check();
for (unsigned i = 0; i < Pl::dim; ++i)
if (lhs_[i] != rhs_[i])
@@ -217,8 +224,8 @@
bool operator<(const GenPoint<Pl>& lhs, const GenPoint<Pr>& rhs)
{
// FIXME: mlc::same_grid<Pl, Pr>::check();
- const Pl& lhs_ = force_exact<Pl>(lhs);
- const Pr& rhs_ = force_exact<Pr>(rhs);
+ const Pl& lhs_ = lhs.force_exact_();
+ const Pr& rhs_ = rhs.force_exact_();
for (unsigned i = 0; i < Pl::dim; ++i)
{
if (lhs_[i] = rhs_[i])
@@ -235,8 +242,8 @@
mlc::equal<mln_dpoint(Pl), mln_dpoint(Pr)>::check();
// FIXME: mlc::same_grid<Pl, Pr>::check();
mlc::same_coord<Pl, Pr>::check();
- const Pl& lhs_ = force_exact<Pl>(lhs);
- const Pr& rhs_ = force_exact<Pr>(rhs);
+ const Pl& lhs_ = lhs.force_exact_();
+ const Pr& rhs_ = rhs.force_exact_();
mln_dpoint(Pl) tmp;
for (unsigned i = 0; i < Pl::dim; ++i)
tmp[i] = lhs_[i] - rhs_[i];
@@ -248,7 +255,7 @@
mln_point(P)
operator+(const GenPoint<P>& lhs, const mln_dpoint(P)& rhs)
{
- const P& lhs_ = force_exact<P>(lhs);
+ const P& lhs_ = lhs.force_exact_();
mln_point(P) tmp;
for (unsigned i = 0; i < P::dim; ++i)
tmp[i] = lhs_[i] + rhs[i];
@@ -258,7 +265,8 @@
template <typename P>
std::ostream& operator<<(std::ostream& ostr, const GenPoint<P>& p)
{
- const P& p_ = force_exact<P>(p);
+ const P& p_ = p.force_exact_();
+
ostr << '(';
for (unsigned i = 0; i < P::dim; ++i)
{
Index: mln/core/dpoint.hh
--- mln/core/dpoint.hh (revision 1000)
+++ mln/core/dpoint.hh (working copy)
@@ -83,9 +83,10 @@
*/
dpoint_();
- /*! \brief Constructor; all coordinates are set to the value \p c.
+ /*! \brief Constructor; coordinates are set by function \p f.
*/
- dpoint_(C c);
+ template <typename F>
+ dpoint_(F f);
/*! \brief Set all coordinates to the value \p c.
*/
@@ -118,9 +119,11 @@
}
template <unsigned n, typename C>
- dpoint_<n,C>::dpoint_(C c)
+ template <typename F>
+ dpoint_<n,C>::dpoint_(F f)
{
- set_all(c);
+ for (unsigned i = 0; i < n; ++i)
+ coord_[i] = f(i);
}
template <unsigned n, typename C>
Index: mln/core/exact.hh
--- mln/core/exact.hh (revision 1000)
+++ mln/core/exact.hh (working copy)
@@ -66,57 +66,6 @@
/// \}
- namespace internal
- {
-
- template <typename E, typename O>
- struct helper_force_exact_
- {
- typedef E ret;
- };
-
- template <typename E, typename O>
- struct helper_force_exact_< E, const O >
- {
- typedef const E ret;
- };
-
- } // end of namespace mln::internal
-
-
- /*! \brief Violent exact cast routine.
- *
- * This cast is an alternative to the mln::exact cast. It is used
- * for objects than do not derive from mln::Object.
- *
- * It preserves the nature (pointer or reference, const or mutable)
- * of its argument. The parameter \a E should not have qualifiers.
- *
- * \warning Prefer not to use this cast!
- *
- * \see mln::exact
- * \todo Move into mln::internal.
- */
- /// \{
-
- template <typename E, typename O>
- E* force_exact(O* ptr);
-
- template <typename E, typename O>
- const E* force_exact(const O* ptr);
-
- template <typename E, typename O>
- typename internal::helper_force_exact_<E, O>::ret & // help g++-3.3
- force_exact(O& ref);
-
- /// \}
-
-
-// template <typename E, typename O>
-// E& force_exact(O& ref);
-
-// template <typename E, typename O>
-// const E& force_exact(const O& ref);
# ifndef MLN_INCLUDE_ONLY
@@ -147,39 +96,6 @@
return *(const E*)(const void*)(&ref);
}
- // force_exact
-
- template <typename E, typename O>
- E* force_exact(O* ptr)
- {
- return (E*)(void*)ptr;
- }
-
- template <typename E, typename O>
- const E* force_exact(const O* ptr)
- {
- return (const E*)(const void*)ptr;
- }
-
-// template <typename E, typename O>
-// E& force_exact(O& ref)
-// {
-// return *(E*)(void*)(&ref);
-// }
-
-// template <typename E, typename O>
-// const E& force_exact(const O& ref)
-// {
-// return *(const E*)(const void*)(&ref);
-// }
-
- template <typename E, typename O>
- typename internal::helper_force_exact_<E, O>::ret &
- force_exact(O& ref)
- {
- return *(E*)(void*)(&ref);
- }
-
# endif // ! MLN_INCLUDE_ONLY
} // end of namespace mln
Index: mln/core/window.hh
--- mln/core/window.hh (revision 1000)
+++ mln/core/window.hh (working copy)
@@ -36,6 +36,7 @@
# include <mln/core/concept/window.hh>
# include <mln/core/internal/set_of.hh>
# include <mln/core/dpoint.hh>
+# include <mln/fun/all.hh>
namespace mln
@@ -100,7 +101,7 @@
template <typename D>
bool window_<D>::is_centered() const
{
- static const D origin(0);
+ static const D origin = all(0);
return this->has(origin);
}
Index: mln/core/image2d.hh
--- mln/core/image2d.hh (revision 1000)
+++ mln/core/image2d.hh (working copy)
@@ -48,6 +48,17 @@
template <typename T>
struct image2d : public internal::image_base_< box2d, image2d<T> >
{
+
+ // warning: just to make effective types appear in Doxygen
+ typedef box2d pset;
+ typedef point2d psite;
+ typedef point2d point;
+ typedef mln_fwd_piter(box2d) fwd_piter;
+ typedef mln_bkd_piter(box2d) bkd_piter;
+ typedef fwd_piter piter;
+ // end of warning
+
+
/// Value associated type.
typedef T value;
Index: mln/core/internal/force_exact.hh
--- mln/core/internal/force_exact.hh (revision 0)
+++ mln/core/internal/force_exact.hh (revision 0)
@@ -0,0 +1,62 @@
+// Copyright (C) 2007 EPITA Research and Development Laboratory
+//
+// This file is part of the Olena Library. This library is free
+// software; you can redistribute it and/or modify it under the terms
+// of the GNU General Public License version 2 as published by the
+// Free Software Foundation.
+//
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+// General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this library; see the file COPYING. If not, write to
+// the Free Software Foundation, 51 Franklin Street, Fifth Floor,
+// Boston, MA 02111-1307, USA.
+//
+// As a special exception, you may use this file as part of a free
+// software library without restriction. Specifically, if other files
+// instantiate templates or use macros or inline functions from this
+// file, or you compile this file and link it with other files to
+// produce an executable, this file does not by itself cause the
+// resulting executable to be covered by the GNU General Public
+// License. This exception does not however invalidate any other
+// reasons why the executable file might be covered by the GNU General
+// Public License.
+
+#ifndef MLN_CORE_INTERNAL_FORCE_EXACT_HH
+# define MLN_CORE_INTERNAL_FORCE_EXACT_HH
+
+/*! \file mln/core/internal/force_exact.hh
+ *
+ * \brief Definition of a macro for internal use only.
+ */
+
+
+/*! \brief Macro to add a violent exact cast method.
+ *
+ * \internal
+ *
+ * This cast is an alternative to the mln::exact cast. It is used
+ * for objects than do not derive from mln::Object.
+ *
+ * \warning Do not to use this cast!
+ *
+ * \see mln::exact
+ */
+
+# define mln_internal_add_force_exact_(Type) \
+ \
+ E& force_exact_() const \
+ { \
+ static const E exact_obj; \
+ static const Type& exact_obj_ref = exact_obj; \
+ static const int exact_offset = \
+ (const char*)(void*)(&exact_obj_ref) \
+ - (const char*)(void*)(&exact_obj); \
+ return *(E*)((char*)(this) - exact_offset); \
+ }
+
+
+#endif // ! MLN_CORE_INTERNAL_FORCE_EXACT_HH
Index: mln/core/internal/coord_impl.hh
--- mln/core/internal/coord_impl.hh (revision 1000)
+++ mln/core/internal/coord_impl.hh (working copy)
@@ -30,9 +30,12 @@
/*! \file mln/core/internal/coord_impl.hh
*
+ * \internal
+ *
* \brief Define some implementation classes for generalized points.
*/
+# include <mln/core/internal/force_exact.hh>
# include <mln/core/concept/object.hh>
@@ -42,6 +45,13 @@
namespace internal
{
+ template <typename E>
+ struct coord_impl_base_
+ {
+ mln_internal_add_force_exact_(coord_impl_base_<E>)
+ };
+
+
// coord_impl
/*! \brief Implementation class to equip generalized points with
@@ -54,12 +64,17 @@
template <typename C, typename E>
struct coord_impl_<1, C, E>
+ : coord_impl_base_<E>
{
C ind() const;
+ private:
+ typedef coord_impl_<1, C, E> self_;
+
};
template <typename C, typename E>
struct coord_impl_<2, C, E>
+ : coord_impl_base_<E>
{
C row() const;
C col() const;
@@ -67,6 +82,7 @@
template <typename C, typename E>
struct coord_impl_<3, C, E>
+ : coord_impl_base_<E>
{
C sli() const;
C row() const;
@@ -81,6 +97,7 @@
template <typename C, typename E>
struct mutable_coord_impl_<1, C, E>
+ : coord_impl_base_<E>
{
C ind() const;
C& ind();
@@ -88,6 +105,7 @@
template <typename C, typename E>
struct mutable_coord_impl_<2, C, E>
+ : coord_impl_base_<E>
{
C row() const;
C& row();
@@ -97,6 +115,7 @@
template <typename C, typename E>
struct mutable_coord_impl_<3, C, E>
+ : coord_impl_base_<E>
{
C sli() const;
C& sli();
@@ -116,7 +135,7 @@
template <typename C, typename E>
C coord_impl_<1, C, E>::ind() const
{
- return force_exact<E>(*this)[0];
+ return this->force_exact_()[0];
}
// 2
@@ -124,13 +143,13 @@
template <typename C, typename E>
C coord_impl_<2, C, E>::row() const
{
- return force_exact<E>(*this)[0];
+ return this->force_exact_()[0];
}
template <typename C, typename E>
C coord_impl_<2, C, E>::col() const
{
- return force_exact<E>(*this)[1];
+ return this->force_exact_()[1];
}
// 3
@@ -138,19 +157,19 @@
template <typename C, typename E>
C coord_impl_<3, C, E>::sli() const
{
- return force_exact<E>(*this)[0];
+ return this->force_exact_()[0];
}
template <typename C, typename E>
C coord_impl_<3, C, E>::row() const
{
- return force_exact<E>(*this)[1];
+ return this->force_exact_()[1];
}
template <typename C, typename E>
C coord_impl_<3, C, E>::col() const
{
- return force_exact<E>(*this)[2];
+ return this->force_exact_()[2];
}
@@ -161,13 +180,13 @@
template <typename C, typename E>
C mutable_coord_impl_<1, C, E>::ind() const
{
- return force_exact<E>(*this)[0];
+ return this->force_exact_()[0];
}
template <typename C, typename E>
C& mutable_coord_impl_<1, C, E>::ind()
{
- return force_exact<E>(*this)[0];
+ return this->force_exact_()[0];
}
// 2
@@ -175,25 +194,25 @@
template <typename C, typename E>
C mutable_coord_impl_<2, C, E>::row() const
{
- return force_exact<E>(*this)[0];
+ return this->force_exact_()[0];
}
template <typename C, typename E>
C& mutable_coord_impl_<2, C, E>::row()
{
- return force_exact<E>(*this)[0];
+ return this->force_exact_()[0];
}
template <typename C, typename E>
C mutable_coord_impl_<2, C, E>::col() const
{
- return force_exact<E>(*this)[1];
+ return this->force_exact_()[1];
}
template <typename C, typename E>
C& mutable_coord_impl_<2, C, E>::col()
{
- return force_exact<E>(*this)[1];
+ return this->force_exact_()[1];
}
// 3
@@ -201,37 +220,37 @@
template <typename C, typename E>
C mutable_coord_impl_<3, C, E>::sli() const
{
- return force_exact<E>(*this)[0];
+ return this->force_exact_()[0];
}
template <typename C, typename E>
C& mutable_coord_impl_<3, C, E>::sli()
{
- return force_exact<E>(*this)[0];
+ return this->force_exact_()[0];
}
template <typename C, typename E>
C mutable_coord_impl_<3, C, E>::row() const
{
- return force_exact<E>(*this)[1];
+ return this->force_exact_()[1];
}
template <typename C, typename E>
C& mutable_coord_impl_<3, C, E>::row()
{
- return force_exact<E>(*this)[1];
+ return this->force_exact_()[1];
}
template <typename C, typename E>
C mutable_coord_impl_<3, C, E>::col() const
{
- return force_exact<E>(*this)[2];
+ return this->force_exact_()[2];
}
template <typename C, typename E>
C& mutable_coord_impl_<3, C, E>::col()
{
- return force_exact<E>(*this)[2];
+ return this->force_exact_()[2];
}
# endif // ! MLN_INCLUDE_ONLY
Index: mln/fun/all.hh
--- mln/fun/all.hh (revision 0)
+++ mln/fun/all.hh (revision 0)
@@ -0,0 +1,92 @@
+// Copyright (C) 2007 EPITA Research and Development Laboratory
+//
+// This file is part of the Olena Library. This library is free
+// software; you can redistribute it and/or modify it under the terms
+// of the GNU General Public License version 2 as published by the
+// Free Software Foundation.
+//
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+// General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this library; see the file COPYING. If not, write to
+// the Free Software Foundation, 51 Franklin Street, Fifth Floor,
+// Boston, MA 02111-1307, USA.
+//
+// As a special exception, you may use this file as part of a free
+// software library without restriction. Specifically, if other files
+// instantiate templates or use macros or inline functions from this
+// file, or you compile this file and link it with other files to
+// produce an executable, this file does not by itself cause the
+// resulting executable to be covered by the GNU General Public
+// License. This exception does not however invalidate any other
+// reasons why the executable file might be covered by the GNU General
+// Public License.
+
+#ifndef MLN_FUN_ALL_HH
+# define MLN_FUN_ALL_HH
+
+/*! \file mln/fun/all.hh
+ *
+ * \brief FIXME.
+ */
+
+
+namespace mln
+{
+
+ namespace fun
+ {
+
+ template <typename T>
+ struct all
+ {
+ all(T t);
+ template <typename U>
+ T operator()(const U&) const;
+ private:
+ T t_;
+ };
+
+ } // end of namespace mln::fun
+
+ template <typename T>
+ fun::all<T> all(T t);
+
+
+# ifndef MLN_INCLUDE_ONLY
+
+ namespace fun
+ {
+
+ template <typename T>
+ all<T>::all(T t)
+ : t_(t)
+ {
+ }
+
+ template <typename T>
+ template <typename U>
+ T
+ all<T>::operator()(const U&) const
+ {
+ return t_;
+ }
+
+ } // end of namespace mln::fun
+
+ template <typename T>
+ fun::all<T> all(T t)
+ {
+ fun::all<T> tmp(t);
+ return tmp;
+ }
+
+# endif // ! MLN_INCLUDE_ONLY
+
+} // end of namespace mln
+
+
+#endif // ! MLN_FUN_ALL_HH
1
0
Sorry : Histogram not Histogramm.
Mais surtout *1000*ème patche !!!
------
...damn' une faute de frappes dans le millième patche :'(.
1
0
https://svn.lrde.epita.fr/svn/oln/trunk/olena
Draft Draft.
Index: ChangeLog
from Ugo Jardonnet <ugo.jardonnet(a)lrde.epita.fr>
Histogramm : Draft.
* oln/histo: New.
* oln/histo/histo_median.hh: New.
* oln/histo/histo_min.hh: New.
* oln/histo/histogram.hh: New.
canvas/two_pass.hh | 6 +--
histo/histo_median.hh | 85 ++++++++++++++++++++++++++++++++++++++++++++++
histo/histo_min.hh | 90 +++++++++++++++++++++++++++++++++++++++++++++++++
histo/histogram.hh | 69 +++++++++++++++++++++++++++++++++++++
morpho/cc_tarjan_v1.hh | 1
5 files changed, 247 insertions(+), 4 deletions(-)
Index: oln/histo/histo_median.hh
--- oln/histo/histo_median.hh (revision 0)
+++ oln/histo/histo_median.hh (revision 0)
@@ -0,0 +1,85 @@
+// Copyright (C) 2007 EPITA Research and Development Laboratory
+//
+// This file is part of the Olena Library. This library is free
+// software; you can redistribute it and/or modify it under the terms
+// of the GNU General Public License version 2 as published by the
+// Free Software Foundation.
+//
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+// General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this library; see the file COPYING. If not, write to
+// the Free Software Foundation, 51 Franklin Street, Fifth Floor,
+// Boston, MA 02111-1307, USA.
+//
+// As a special exception, you may use this file as part of a free
+// software library without restriction. Specifically, if other files
+// instantiate templates or use macros or inline functions from this
+// file, or you compile this file and link it with other files to
+// produce an executable, this file does not by itself cause the
+// resulting executable to be covered by the GNU General Public
+// License. This exception does not however invalidate any other
+// reasons why the executable file might be covered by the GNU General
+// Public License.
+
+#ifndef OLN_HISTO_MEDIAN_HH
+# define OLN_HISTO_MEDIAN_HH
+
+# include <oln/histo/histogram.hh>
+
+
+namespace oln
+{
+
+ namespace histo_median
+ {
+
+ template <typename T>
+ struct histo_median : public Histogram< histo_median<T> >
+ {
+ histo_median() : imed(this.ival) {}
+
+ void slide(T i)
+ {
+ int last_i = take(i);
+ untake();
+ if (imed == -1)
+ compute_median();
+ else
+ compute_median();
+ }
+
+ void compute_median()
+ {
+ T total = 0;
+ for (int i = 0; i < this.v.size; i++)
+ total += this.v[i];
+
+ imed = 0;
+ T sum = this.v[imed];
+ while (sum < total/2)
+ {
+ ++imed;
+ sum += this.v[imed];
+ }
+ }
+
+ T median() { return this.v[imed]; }
+ private:
+ int& imed;
+ T rest;
+ };
+
+
+# ifndef OLN_INCLUDE_ONLY
+
+# endif // ! OLN_INCLUDE_ONLY
+
+ } // end of namespace oln::histo_median
+
+} // end of namespace oln
+
+#endif // ! OLN_HISTO_MEDIAN_HH
Index: oln/histo/histo_min.hh
--- oln/histo/histo_min.hh (revision 0)
+++ oln/histo/histo_min.hh (revision 0)
@@ -0,0 +1,90 @@
+// Copyright (C) 2007 EPITA Research and Development Laboratory
+//
+// This file is part of the Olena Library. This library is free
+// software; you can redistribute it and/or modify it under the terms
+// of the GNU General Public License version 2 as published by the
+// Free Software Foundation.
+//
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+// General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this library; see the file COPYING. If not, write to
+// the Free Software Foundation, 51 Franklin Street, Fifth Floor,
+// Boston, MA 02111-1307, USA.
+//
+// As a special exception, you may use this file as part of a free
+// software library without restriction. Specifically, if other files
+// instantiate templates or use macros or inline functions from this
+// file, or you compile this file and link it with other files to
+// produce an executable, this file does not by itself cause the
+// resulting executable to be covered by the GNU General Public
+// License. This exception does not however invalidate any other
+// reasons why the executable file might be covered by the GNU General
+// Public License.
+
+#ifndef OLN_HISTO_HISTO_MIN_HH
+# define OLN_HISTO_HISTO_MIN_HH
+
+# include <oln/histo/histogram.hh>
+# include <oln/core/internal/max_value.hh>
+
+namespace oln
+{
+
+ namespace histo_min
+ {
+
+ template <typename T>
+ struct histo_min : public Histogram< histo_min<T> >
+ {
+ histo_min() : imin(this.ival) {}
+
+ template <typename L>
+ void init(L line)
+ {
+ int i;
+ for (i = 0; i < line.norme; i++)
+ take(oln_max(T));
+ imin = i/2;
+ }
+
+ void slide(T i)
+ {
+ int last_i = take(i);
+ untake();
+ if (imin == -1)
+ compute_min();
+ else if (i < this.v[imin])
+ imin = last_i;
+ }
+
+ void compute_min()
+ {
+ imin = 0;
+ for (int i = 1; i < this.v.size; i++)
+ if (this.v[i] < this.v[imin])
+ imin = i;
+ }
+
+ T min() { return this.v[imin]; }
+ private:
+ int& imin;
+ };
+
+
+# ifndef OLN_INCLUDE_ONLY
+
+# endif // ! OLN_INCLUDE_ONLY
+
+ } // end of namespace oln::histo_min
+
+} // end of namespace oln
+
+#endif // ! OLN_HISTO_HISTO_MIN_HH
+
+
+
+
Index: oln/histo/histogram.hh
--- oln/histo/histogram.hh (revision 0)
+++ oln/histo/histogram.hh (revision 0)
@@ -0,0 +1,69 @@
+// Copyright (C) 2007 EPITA Research and Development Laboratory
+//
+// This file is part of the Olena Library. This library is free
+// software; you can redistribute it and/or modify it under the terms
+// of the GNU General Public License version 2 as published by the
+// Free Software Foundation.
+//
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+// General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this library; see the file COPYING. If not, write to
+// the Free Software Foundation, 51 Franklin Street, Fifth Floor,
+// Boston, MA 02111-1307, USA.
+//
+// As a special exception, you may use this file as part of a free
+// software library without restriction. Specifically, if other files
+// instantiate templates or use macros or inline functions from this
+// file, or you compile this file and link it with other files to
+// produce an executable, this file does not by itself cause the
+// resulting executable to be covered by the GNU General Public
+// License. This exception does not however invalidate any other
+// reasons why the executable file might be covered by the GNU General
+// Public License.
+
+#ifndef OLN_HISTO_HISTOGRAM_HH
+# define OLN_HISTO_HISTOGRAM_HH
+
+namespace oln
+{
+
+ /// Concept-class "Histogram".
+
+ template <typename T>
+ struct Histogram
+ {
+ void take(T t)
+ {
+ v.insert(v.begin(), t);
+ if (ival > 0)
+ ival++;
+ return 0;
+ }
+
+ void untake()
+ {
+ if (this.ival == v.size)
+ ival = -1;
+ T ret = v.back();
+ v.pop_back();
+ return ret;
+ }
+
+ T operator()(int i) { return v[i]; }
+ void clean() { v.clear(); }
+
+ protected:
+ Histogram() : ival(-1) {}
+
+ std::vector<unsigned> v;
+ int ival;
+ }; // end of oln::Histogram<Exact>
+
+
+} // end of namespace oln
+
+#endif // ! OLN_HISTO_HISTOGRAM_HH
Index: oln/core/2d/line2d.hh
Index: oln/morpho/cc_tarjan_v1.hh
--- oln/morpho/cc_tarjan_v1.hh (revision 999)
+++ oln/morpho/cc_tarjan_v1.hh (working copy)
@@ -33,7 +33,6 @@
# include <oln/level/fill.hh>
# include <oln/core/internal/f_ch_value.hh>
-
namespace oln
{
Index: oln/canvas/two_pass.hh
--- oln/canvas/two_pass.hh (revision 999)
+++ oln/canvas/two_pass.hh (working copy)
@@ -37,9 +37,9 @@
namespace canvas
{
- namespace v1
+ namespace v1 // Data owned by f.
{
- template <typename F> // Data owned by f.
+ template <typename F>
void two_pass(F& fun)
{
@@ -109,7 +109,7 @@
}
- namespace v4 // Via Inheritance.
+ namespace v4 // Via static Inheritens.
{
template <typename I, typename Exact>
struct two_pass : public virtual Any<Exact>
1
0
Re: [Transformers-patches] Re: [Olena-patches] scool r49: Merge main branch to trunk
by yabo 06 Jul '07
by yabo 06 Jul '07
06 Jul '07
Roland Levillain a écrit :
> Good. Thanks!
Posting to olena-patches was involuntary, however should I continue ?
> Ouch! I think this message did not need to be so long. :)
Sorry! :)
--
\__/ \__/
(00) Maxime `yabo` van Noppen (00)
___) \ Epita 2009 / (___
(_____/ Président de Prologin \_____)
1
0
URL: https://svn.lrde.epita.fr/svn/scool/trunk
ChangeLog:
2007-07-05 Maxime van Noppen <maxime.van-noppen(a)lrde.epita.fr>
Merge main branch to trunk
* AUTHORS: New.
* ChangeLog: .
* Makefile.am: New.
* Makefile: Remove.
* NEWS: New.
* README: New.
* bin/scoolc: New.
* bootstrap: New.
* config/Makefile.am: New.
* config: New.
* configure.ac: New.
* src/Makefile.am: New.
* src/cxx-syn/Cxx.sdf: New.
* src/cxx-syn/CxxDecl.sdf: New.
* src/cxx-syn/CxxExp.sdf: New.
* src/cxx-syn/CxxFun.sdf: New.
* src/cxx-syn/CxxScope.sdf: New.
* src/cxx-syn/CxxStm.sdf: New.
* src/cxx-syn/CxxType.sdf: New.
* src/cxx-syn/Lexical.sdf: New.
* src/cxx-syn/Makefile.am: New.
* src/cxx-syn: New.
* src/parse-scool/parse-scool: New.
* src/pp-cxx/CxxDecl.meta: New.
* src/pp-cxx/CxxDecl.str: New.
* src/pp-cxx/CxxExp.str: New.
* src/pp-cxx/CxxFun.meta: New.
* src/pp-cxx/CxxFun.str: New.
* src/pp-cxx/CxxId.meta: New.
* src/pp-cxx/CxxId.str: New.
* src/pp-cxx/CxxProgram.meta: New.
* src/pp-cxx/CxxProgram.str: New.
* src/pp-cxx/CxxStm.meta: New.
* src/pp-cxx/CxxStm.str: New.
* src/pp-cxx/CxxType.meta: New.
* src/pp-cxx/CxxType.str: New.
* src/pp-cxx/Makefile.am: New.
* src/pp-cxx/pp-cxx.meta: New.
* src/pp-cxx/pp-cxx.str: New.
* src/pp-cxx: New.
* src/scl-syn/Decl.sdf: .
* src/scl-syn/Lexical.sdf: .
* src/scl-syn/Makefile.am: New.
* src/scl-syn/Type.sdf: .
* src/scoolt/Access.str: New.
* src/scoolt/Decl.str: New.
* src/scoolt/Exp.str: New.
* src/scoolt/Makefile.am: New.
* src/scoolt/Program.str: New.
* src/scoolt/Stm.str: New.
* src/scoolt/Tools.str: New.
* src/scoolt/Type.str: New.
* src/scoolt/scoolt.str: New.
* src/scoolt: New.
* tests/input/class_decl_1.scl: New.
* tests/input/class_decl_2.scl: New.
* tests/input/class_decl_3.scl: New.
* tests/input/class_decl_inh.scl: New.
* tests/input/class_decl_inh_abst.scl: New.
* tests/input/class_decl_inh_fin.scl: New.
* tests/input/class_members_1.scl: New.
* tests/input/class_predecl.scl: New.
* tests/input/class_predecl_inh.scl: New.
* tests/input/class_template_1.scl: New.
* tests/input/class_template_2.scl: New.
* tests/input/cons_decl_1.scl: New.
* tests/input/cons_decl_2.scl: New.
* tests/input/function_call_1.scl: New.
* tests/input/function_call_2.scl: New.
* tests/input/function_call_3.scl: New.
* tests/input/function_decl_1.scl: New.
* tests/input/function_decl_10.scl: New.
* tests/input/function_decl_2.scl: New.
* tests/input/function_decl_3.scl: New.
* tests/input/function_decl_4.scl: New.
* tests/input/function_decl_5.scl: New.
* tests/input/function_decl_6.scl: New.
* tests/input/function_decl_7.scl: New.
* tests/input/function_decl_8.scl: New.
* tests/input/function_decl_9.scl: New.
* tests/input/function_ftype_1.scl: New.
* tests/input/function_ftype_2.scl: New.
* tests/input/function_return_1.scl: New.
* tests/input/function_return_2.scl: New.
* tests/input/function_return_3.scl: New.
* tests/input/sample_1.scl: New.
* tests/input/sample_2.scl: New.
* tests/input/sample_3.scl: New.
* tests/input/sample_4.scl: New.
* tests/input/sample_container.scl: New.
* tests/input/var_decl_1.scl: New.
* tests/input/var_decl_2.scl: New.
* tests/input/var_decl_3.scl: New.
* tests/input/var_decl_4.scl: New.
* tests/input/var_decl_5.scl: New.
* tests/input/var_decl_6.scl: New.
* tests/input/var_decl_7.scl: New.
* tests/mouline.sh: .
* tests/parser/class_decl_1.ref: New.
* tests/parser/class_decl_2.ref: New.
* tests/parser/class_decl_3.ref: New.
* tests/parser/class_decl_inh.ref: New.
* tests/parser/class_decl_inh_abst.ref: New.
* tests/parser/class_decl_inh_fin.ref: New.
* tests/parser/class_members_1.ref: New.
* tests/parser/class_predecl.ref: New.
* tests/parser/class_predecl_inh.ref: New.
* tests/parser/class_template_1.ref: New.
* tests/parser/class_template_2.ref: New.
* tests/parser/command: .
* tests/parser/cons_decl_1.ref: New.
* tests/parser/cons_decl_2.ref: New.
* tests/parser/function_call_1.ref: New.
* tests/parser/function_call_2.ref: New.
* tests/parser/function_call_3.ref: New.
* tests/parser/function_decl_1.ref: New.
* tests/parser/function_decl_10.ref: New.
* tests/parser/function_decl_2.ref: New.
* tests/parser/function_decl_3.ref: New.
* tests/parser/function_decl_4.ref: New.
* tests/parser/function_decl_5.ref: New.
* tests/parser/function_decl_6.ref: New.
* tests/parser/function_decl_7.ref: New.
* tests/parser/function_decl_8.ref: New.
* tests/parser/function_decl_9.ref: New.
* tests/parser/function_ftype_1.ref: New.
* tests/parser/function_ftype_2.ref: New.
* tests/parser/function_return_1.ref: New.
* tests/parser/function_return_2.ref: New.
* tests/parser/function_return_3.ref: New.
* tests/parser/sample_1.ref: New.
* tests/parser/sample_2.ref: New.
* tests/parser/sample_3.ref: New.
* tests/parser/sample_4.ref: New.
* tests/parser/var_decl_1.ref: New.
* tests/parser/var_decl_2.ref: New.
* tests/parser/var_decl_3.ref: New.
* tests/parser/var_decl_4.ref: New.
* tests/parser/var_decl_5.ref: New.
* tests/parser/var_decl_6.ref: New.
* tests/transformer/class_decl_1.ref: New.
* tests/transformer/class_decl_2.ref: New.
* tests/transformer/class_decl_3.ref: New.
* tests/transformer/class_decl_abst.ref: New.
* tests/transformer/class_decl_inh.ref: New.
* tests/transformer/class_decl_inh_abst.ref: New.
* tests/transformer/class_decl_inh_fin.ref: New.
* tests/transformer/class_members_1.ref: New.
* tests/transformer/class_predecl.ref: New.
* tests/transformer/class_predecl_inh.ref: New.
* tests/transformer/class_template_1.ref: New.
* tests/transformer/class_template_2.ref: New.
* tests/transformer/command: New.
* tests/transformer/cons_decl_1.ref: New.
* tests/transformer/cons_decl_2.ref: New.
* tests/transformer/empty.ref: New.
* tests/transformer/function_decl_1.ref: New.
* tests/transformer/function_decl_10.ref: New.
* tests/transformer/function_decl_3.ref: New.
* tests/transformer/function_decl_4.ref: New.
* tests/transformer/function_decl_5.ref: New.
* tests/transformer/function_decl_6.ref: New.
* tests/transformer/function_decl_7.ref: New.
* tests/transformer/function_decl_8.ref: New.
* tests/transformer/function_decl_9.ref: New.
* tests/transformer/function_return_1.ref: New.
* tests/transformer/function_return_2.ref: New.
* tests/transformer/function_return_3.ref: New.
* tests/transformer/sample_1.ref: New.
* tests/transformer/sample_3.ref: New.
* tests/transformer/sample_4.ref: New.
* tests/transformer/var_decl_1.ref: New.
* tests/transformer/var_decl_2.ref: New.
* tests/transformer/var_decl_3.ref: New.
* tests/transformer/var_decl_5.ref: New.
* tests/transformer/var_decl_6.ref: New.
* tests/transformer: New.
AUTHORS | 2
Makefile.am | 10
bin/scoolc | 17
bootstrap | 7
config/Makefile.am | 15
configure.ac | 29 +
src/Makefile | 835 +++++++++++++++++++++++++++---
src/Makefile.am | 7
src/cxx-syn/Cxx.sdf | 12
src/cxx-syn/CxxDecl.sdf | 34 +
src/cxx-syn/CxxExp.sdf | 15
src/cxx-syn/CxxFun.sdf | 24
src/cxx-syn/CxxStm.sdf | 11
src/cxx-syn/CxxType.sdf | 14
src/cxx-syn/Lexical.sdf | 15
src/cxx-syn/Makefile.am | 19
src/parse-scool/parse-scool | 1
src/pp-cxx/CxxDecl.meta | 1
src/pp-cxx/CxxDecl.str | 90 +++
src/pp-cxx/CxxExp.str | 31 +
src/pp-cxx/CxxFun.meta | 1
src/pp-cxx/CxxFun.str | 69 ++
src/pp-cxx/CxxId.meta | 1
src/pp-cxx/CxxId.str | 12
src/pp-cxx/CxxProgram.meta | 1
src/pp-cxx/CxxProgram.str | 15
src/pp-cxx/CxxStm.meta | 1
src/pp-cxx/CxxStm.str | 8
src/pp-cxx/CxxType.meta | 1
src/pp-cxx/CxxType.str | 25
src/pp-cxx/Makefile.am | 21
src/pp-cxx/pp-cxx.meta | 1
src/pp-cxx/pp-cxx.str | 6
src/scl-syn/Decl.sdf | 8
src/scl-syn/Lexical.sdf | 7
src/scl-syn/Makefile.am | 19
src/scl-syn/Type.sdf | 2
src/scoolt/Access.str | 15
src/scoolt/Decl.str | 229 ++++++++
src/scoolt/Exp.str | 21
src/scoolt/Makefile.am | 21
src/scoolt/Program.str | 8
src/scoolt/Stm.str | 21
src/scoolt/Tools.str | 29 +
src/scoolt/Type.str | 32 +
src/scoolt/scoolt.str | 184 ++++++
tests/input/class_decl_1.scl | 1
tests/input/class_decl_2.scl | 15
tests/input/class_decl_3.scl | 12
tests/input/class_decl_inh.scl | 9
tests/input/class_decl_inh_abst.scl | 9
tests/input/class_decl_inh_fin.scl | 14
tests/input/class_members_1.scl | 6
tests/input/class_predecl.scl | 1
tests/input/class_predecl_inh.scl | 1
tests/input/class_template_1.scl | 3
tests/input/class_template_2.scl | 3
tests/input/cons_decl_1.scl | 1
tests/input/cons_decl_2.scl | 1
tests/input/function_call_1.scl | 4
tests/input/function_call_2.scl | 4
tests/input/function_call_3.scl | 1
tests/input/function_decl_1.scl | 2
tests/input/function_decl_10.scl | 1
tests/input/function_decl_2.scl | 1
tests/input/function_decl_3.scl | 1
tests/input/function_decl_4.scl | 3
tests/input/function_decl_5.scl | 2
tests/input/function_decl_6.scl | 3
tests/input/function_decl_7.scl | 4
tests/input/function_decl_8.scl | 1
tests/input/function_decl_9.scl | 1
tests/input/function_ftype_1.scl | 1
tests/input/function_ftype_2.scl | 1
tests/input/function_return_1.scl | 4
tests/input/function_return_2.scl | 4
tests/input/function_return_3.scl | 1
tests/input/sample_1.scl | 9
tests/input/sample_2.scl | 5
tests/input/sample_3.scl | 9
tests/input/sample_4.scl | 4
tests/input/sample_container.scl | 26
tests/input/var_decl_1.scl | 1
tests/input/var_decl_2.scl | 1
tests/input/var_decl_3.scl | 4
tests/input/var_decl_4.scl | 1
tests/input/var_decl_5.scl | 1
tests/input/var_decl_6.scl | 1
tests/input/var_decl_7.scl | 1
tests/mouline.sh | 116 +++-
tests/parser/class_decl_1.ref | 1
tests/parser/class_decl_2.ref | 1
tests/parser/class_decl_3.ref | 1
tests/parser/class_decl_inh.ref | 1
tests/parser/class_decl_inh_abst.ref | 1
tests/parser/class_decl_inh_fin.ref | 1
tests/parser/class_members_1.ref | 1
tests/parser/class_predecl.ref | 1
tests/parser/class_predecl_inh.ref | 1
tests/parser/class_template_1.ref | 1
tests/parser/class_template_2.ref | 1
tests/parser/command | 2
tests/parser/cons_decl_1.ref | 1
tests/parser/cons_decl_2.ref | 1
tests/parser/function_call_1.ref | 1
tests/parser/function_call_2.ref | 1
tests/parser/function_call_3.ref | 1
tests/parser/function_decl_1.ref | 1
tests/parser/function_decl_10.ref | 1
tests/parser/function_decl_2.ref | 1
tests/parser/function_decl_3.ref | 1
tests/parser/function_decl_4.ref | 1
tests/parser/function_decl_5.ref | 1
tests/parser/function_decl_6.ref | 1
tests/parser/function_decl_7.ref | 1
tests/parser/function_decl_8.ref | 1
tests/parser/function_decl_9.ref | 1
tests/parser/function_ftype_1.ref | 1
tests/parser/function_ftype_2.ref | 1
tests/parser/function_return_1.ref | 1
tests/parser/function_return_2.ref | 1
tests/parser/function_return_3.ref | 1
tests/parser/sample_1.ref | 1
tests/parser/sample_2.ref | 1
tests/parser/sample_3.ref | 1
tests/parser/sample_4.ref | 1
tests/parser/var_decl_1.ref | 1
tests/parser/var_decl_2.ref | 1
tests/parser/var_decl_3.ref | 1
tests/parser/var_decl_4.ref | 1
tests/parser/var_decl_5.ref | 1
tests/parser/var_decl_6.ref | 1
tests/transformer/class_decl_1.ref | 11
tests/transformer/class_decl_2.ref | 20
tests/transformer/class_decl_3.ref | 20
tests/transformer/class_decl_abst.ref | 1
tests/transformer/class_decl_inh.ref | 19
tests/transformer/class_decl_inh_abst.ref | 17
tests/transformer/class_decl_inh_fin.ref | 26
tests/transformer/class_members_1.ref | 13
tests/transformer/class_predecl.ref | 5
tests/transformer/class_predecl_inh.ref | 4
tests/transformer/class_template_1.ref | 7
tests/transformer/class_template_2.ref | 7
tests/transformer/command | 85 +++
tests/transformer/cons_decl_1.ref | 4
tests/transformer/cons_decl_2.ref | 4
tests/transformer/empty.ref | 2
tests/transformer/function_decl_1.ref | 6
tests/transformer/function_decl_10.ref | 7
tests/transformer/function_decl_3.ref | 4
tests/transformer/function_decl_4.ref | 6
tests/transformer/function_decl_5.ref | 6
tests/transformer/function_decl_6.ref | 7
tests/transformer/function_decl_7.ref | 8
tests/transformer/function_decl_8.ref | 8
tests/transformer/function_decl_9.ref | 8
tests/transformer/function_return_1.ref | 7
tests/transformer/function_return_2.ref | 7
tests/transformer/function_return_3.ref | 7
tests/transformer/sample_1.ref | 10
tests/transformer/sample_3.ref | 11
tests/transformer/sample_4.ref | 7
tests/transformer/var_decl_1.ref | 4
tests/transformer/var_decl_2.ref | 4
tests/transformer/var_decl_3.ref | 6
tests/transformer/var_decl_5.ref | 4
tests/transformer/var_decl_6.ref | 4
168 files changed, 2573 insertions(+), 87 deletions(-)
Index: trunk/Makefile (deleted)
===================================================================
Index: trunk/tests/input/class_members_1.scl
===================================================================
--- trunk/tests/input/class_members_1.scl (revision 0)
+++ trunk/tests/input/class_members_1.scl (revision 49)
@@ -0,0 +1,6 @@
+final Student : class =
+{
+ public {
+ var money : int;
+ }
+};
Index: trunk/tests/input/class_predecl_inh.scl
===================================================================
--- trunk/tests/input/class_predecl_inh.scl (revision 0)
+++ trunk/tests/input/class_predecl_inh.scl (revision 49)
@@ -0,0 +1 @@
+Foo : class < Bar;
Index: trunk/tests/input/sample_1.scl
===================================================================
--- trunk/tests/input/sample_1.scl (revision 0)
+++ trunk/tests/input/sample_1.scl (revision 49)
@@ -0,0 +1,9 @@
+
+f : () -> void =
+{
+ i : int16 = 3;
+ i := 4;
+
+ var j : int16 := 3;
+ j := 4;
+}
Index: trunk/tests/input/sample_2.scl
===================================================================
--- trunk/tests/input/sample_2.scl (revision 0)
+++ trunk/tests/input/sample_2.scl (revision 49)
@@ -0,0 +1,5 @@
+f : () -> void =
+{
+ var a : array[int16, 2];
+ var i : int16 := a.at(0);
+}
Index: trunk/tests/input/class_decl_inh_abst.scl
===================================================================
--- trunk/tests/input/class_decl_inh_abst.scl (revision 0)
+++ trunk/tests/input/class_decl_inh_abst.scl (revision 49)
@@ -0,0 +1,9 @@
+abstract Animal: class =
+{
+
+};
+
+Mammal : class < Animal =
+{
+
+};
Index: trunk/tests/input/class_predecl.scl
===================================================================
--- trunk/tests/input/class_predecl.scl (revision 0)
+++ trunk/tests/input/class_predecl.scl (revision 49)
@@ -0,0 +1 @@
+Foo : class;
Index: trunk/tests/input/sample_3.scl
===================================================================
--- trunk/tests/input/sample_3.scl (revision 0)
+++ trunk/tests/input/sample_3.scl (revision 49)
@@ -0,0 +1,9 @@
+f : () -> void =
+{
+ var i : int;
+ var j : int;
+
+ i := 0;
+ j := i;
+ i := j + i;
+}
Index: trunk/tests/input/function_return_1.scl
===================================================================
--- trunk/tests/input/function_return_1.scl (revision 0)
+++ trunk/tests/input/function_return_1.scl (revision 49)
@@ -0,0 +1,4 @@
+answer : () -> int =
+{
+ -> 42;
+}
Index: trunk/tests/input/sample_4.scl
===================================================================
--- trunk/tests/input/sample_4.scl (revision 0)
+++ trunk/tests/input/sample_4.scl (revision 49)
@@ -0,0 +1,4 @@
+sqrt : (arg : float) -> float =
+{
+ -> |[ std::sqrt(arg) ]|;
+}
Index: trunk/tests/input/function_return_2.scl
===================================================================
--- trunk/tests/input/function_return_2.scl (revision 0)
+++ trunk/tests/input/function_return_2.scl (revision 49)
@@ -0,0 +1,4 @@
+answer : (a : int, b : bool) -> int =
+{
+ -> 42;
+}
Index: trunk/tests/input/function_return_3.scl
===================================================================
--- trunk/tests/input/function_return_3.scl (revision 0)
+++ trunk/tests/input/function_return_3.scl (revision 49)
@@ -0,0 +1 @@
+answer : () -> int => 42;
Index: trunk/tests/input/cons_decl_1.scl
===================================================================
--- trunk/tests/input/cons_decl_1.scl (revision 0)
+++ trunk/tests/input/cons_decl_1.scl (revision 49)
@@ -0,0 +1 @@
+i : int;
Index: trunk/tests/input/cons_decl_2.scl
===================================================================
--- trunk/tests/input/cons_decl_2.scl (revision 0)
+++ trunk/tests/input/cons_decl_2.scl (revision 49)
@@ -0,0 +1 @@
+i : int = 3;
Index: trunk/tests/input/class_decl_1.scl
===================================================================
--- trunk/tests/input/class_decl_1.scl (revision 0)
+++ trunk/tests/input/class_decl_1.scl (revision 49)
@@ -0,0 +1 @@
+Foo: class = {};
Index: trunk/tests/input/class_decl_2.scl
===================================================================
--- trunk/tests/input/class_decl_2.scl (revision 0)
+++ trunk/tests/input/class_decl_2.scl (revision 49)
@@ -0,0 +1,15 @@
+point : class =
+{
+ public
+ {
+ x : () -> int =
+ {
+ -> x;
+ }
+ }
+ private
+ {
+ var x :int;
+ var y :int;
+ }
+};
Index: trunk/tests/input/class_decl_3.scl
===================================================================
--- trunk/tests/input/class_decl_3.scl (revision 0)
+++ trunk/tests/input/class_decl_3.scl (revision 49)
@@ -0,0 +1,12 @@
+point : class =
+{
+ public
+ {
+ x : () -> int => x;
+ }
+ private
+ {
+ var x :int;
+ var y :int;
+ }
+};
Index: trunk/tests/input/class_template_1.scl
===================================================================
--- trunk/tests/input/class_template_1.scl (revision 0)
+++ trunk/tests/input/class_template_1.scl (revision 49)
@@ -0,0 +1,3 @@
+A : [T : type] -> class =
+{
+}
Index: trunk/tests/input/class_template_2.scl
===================================================================
--- trunk/tests/input/class_template_2.scl (revision 0)
+++ trunk/tests/input/class_template_2.scl (revision 49)
@@ -0,0 +1,3 @@
+A : [T : type, B : bool] -> class =
+{
+}
Index: trunk/tests/input/class_decl_inh.scl
===================================================================
--- trunk/tests/input/class_decl_inh.scl (revision 0)
+++ trunk/tests/input/class_decl_inh.scl (revision 49)
@@ -0,0 +1,9 @@
+Bar: class =
+{
+
+};
+
+Foo : class < Bar =
+{
+
+};
Index: trunk/tests/input/function_decl_1.scl
===================================================================
--- trunk/tests/input/function_decl_1.scl (revision 0)
+++ trunk/tests/input/function_decl_1.scl (revision 49)
@@ -0,0 +1,2 @@
+f : (a: int, b : int) -> bool =
+{}
Index: trunk/tests/input/function_decl_2.scl
===================================================================
--- trunk/tests/input/function_decl_2.scl (revision 0)
+++ trunk/tests/input/function_decl_2.scl (revision 49)
@@ -0,0 +1 @@
+f : [i : int where i > 0]() -> int = {}
Index: trunk/tests/input/function_decl_3.scl
===================================================================
--- trunk/tests/input/function_decl_3.scl (revision 0)
+++ trunk/tests/input/function_decl_3.scl (revision 49)
@@ -0,0 +1 @@
+decl foo : () -> void;
Index: trunk/tests/input/function_decl_4.scl
===================================================================
--- trunk/tests/input/function_decl_4.scl (revision 0)
+++ trunk/tests/input/function_decl_4.scl (revision 49)
@@ -0,0 +1,3 @@
+decl foo : () -> void;
+decl foo : (arg1 : int) -> float;
+decl foo : (arg1 : toto, arg2 : ref double) -> char;
Index: trunk/tests/input/var_decl_1.scl
===================================================================
--- trunk/tests/input/var_decl_1.scl (revision 0)
+++ trunk/tests/input/var_decl_1.scl (revision 49)
@@ -0,0 +1 @@
+var i : int;
Index: trunk/tests/input/function_decl_5.scl
===================================================================
--- trunk/tests/input/function_decl_5.scl (revision 0)
+++ trunk/tests/input/function_decl_5.scl (revision 49)
@@ -0,0 +1,2 @@
+f : (a: int, b: ref int) -> bool =
+{}
Index: trunk/tests/input/function_call_1.scl
===================================================================
--- trunk/tests/input/function_call_1.scl (revision 0)
+++ trunk/tests/input/function_call_1.scl (revision 49)
@@ -0,0 +1,4 @@
+doit : () -> int =
+{
+ -> foo();
+}
\ No newline at end of file
Index: trunk/tests/input/var_decl_2.scl
===================================================================
--- trunk/tests/input/var_decl_2.scl (revision 0)
+++ trunk/tests/input/var_decl_2.scl (revision 49)
@@ -0,0 +1 @@
+var i : int := 42;
Index: trunk/tests/input/function_decl_6.scl
===================================================================
--- trunk/tests/input/function_decl_6.scl (revision 0)
+++ trunk/tests/input/function_decl_6.scl (revision 49)
@@ -0,0 +1,3 @@
+f : [T : type] () -> void =
+{
+}
Index: trunk/tests/input/function_call_2.scl
===================================================================
--- trunk/tests/input/function_call_2.scl (revision 0)
+++ trunk/tests/input/function_call_2.scl (revision 49)
@@ -0,0 +1,4 @@
+doit : () -> int =
+{
+ -> foo("bar", "baz");
+}
\ No newline at end of file
Index: trunk/tests/input/var_decl_3.scl
===================================================================
--- trunk/tests/input/var_decl_3.scl (revision 0)
+++ trunk/tests/input/var_decl_3.scl (revision 49)
@@ -0,0 +1,4 @@
+answer : int = 42;
+
+var i : int;
+var j : int := i;
Index: trunk/tests/input/function_decl_7.scl
===================================================================
--- trunk/tests/input/function_decl_7.scl (revision 0)
+++ trunk/tests/input/function_decl_7.scl (revision 49)
@@ -0,0 +1,4 @@
+f : [T : type] (a : int) -> void =
+{
+ -> 42;
+}
Index: trunk/tests/input/function_call_3.scl
===================================================================
--- trunk/tests/input/function_call_3.scl (revision 0)
+++ trunk/tests/input/function_call_3.scl (revision 49)
@@ -0,0 +1 @@
+i : int = pow[4](3);
Index: trunk/tests/input/var_decl_4.scl
===================================================================
--- trunk/tests/input/var_decl_4.scl (revision 0)
+++ trunk/tests/input/var_decl_4.scl (revision 49)
@@ -0,0 +1 @@
+var l : list[int];
Index: trunk/tests/input/function_decl_8.scl
===================================================================
--- trunk/tests/input/function_decl_8.scl (revision 0)
+++ trunk/tests/input/function_decl_8.scl (revision 49)
@@ -0,0 +1 @@
+f : [T : type] (a : int) -> void => 42;
Index: trunk/tests/input/var_decl_5.scl
===================================================================
--- trunk/tests/input/var_decl_5.scl (revision 0)
+++ trunk/tests/input/var_decl_5.scl (revision 49)
@@ -0,0 +1 @@
+var a : array[int, 42];
Index: trunk/tests/input/function_decl_9.scl
===================================================================
--- trunk/tests/input/function_decl_9.scl (revision 0)
+++ trunk/tests/input/function_decl_9.scl (revision 49)
@@ -0,0 +1 @@
+f : [T : type] (a : T) -> T => a + 42;
Index: trunk/tests/input/var_decl_6.scl
===================================================================
--- trunk/tests/input/var_decl_6.scl (revision 0)
+++ trunk/tests/input/var_decl_6.scl (revision 49)
@@ -0,0 +1 @@
+var a : buffer[int];
Index: trunk/tests/input/var_decl_7.scl
===================================================================
--- trunk/tests/input/var_decl_7.scl (revision 0)
+++ trunk/tests/input/var_decl_7.scl (revision 49)
@@ -0,0 +1 @@
+var a : test[int];
Index: trunk/tests/input/function_decl_10.scl
===================================================================
--- trunk/tests/input/function_decl_10.scl (revision 0)
+++ trunk/tests/input/function_decl_10.scl (revision 49)
@@ -0,0 +1 @@
+f : (a : int, b : double) -> double => a + b;
Index: trunk/tests/input/function_ftype_1.scl
===================================================================
--- trunk/tests/input/function_ftype_1.scl (revision 0)
+++ trunk/tests/input/function_ftype_1.scl (revision 49)
@@ -0,0 +1 @@
+var f : () -> void;
Index: trunk/tests/input/function_ftype_2.scl
===================================================================
--- trunk/tests/input/function_ftype_2.scl (revision 0)
+++ trunk/tests/input/function_ftype_2.scl (revision 49)
@@ -0,0 +1 @@
+var f : (int, bool) -> float;
Index: trunk/tests/input/sample_container.scl
===================================================================
--- trunk/tests/input/sample_container.scl (revision 0)
+++ trunk/tests/input/sample_container.scl (revision 49)
@@ -0,0 +1,26 @@
+// Container
+
+Container : class =
+{
+ public {
+ value_type : type;
+
+ iterator : type;
+ const_iterator : type;
+
+ reference : type;
+ const_reference : type;
+
+ size_type : type;
+
+ decl begin : () -> iterator;
+ decl begin : const () -> const_iterator;
+
+ decl end : () -> iterator;
+ decl end : const () -> const_iterator;
+
+ decl size : const () -> size_type;
+ decl empty : const () -> bool;
+ }
+};
+
Index: trunk/tests/input/class_decl_inh_fin.scl
===================================================================
--- trunk/tests/input/class_decl_inh_fin.scl (revision 0)
+++ trunk/tests/input/class_decl_inh_fin.scl (revision 49)
@@ -0,0 +1,14 @@
+Animal: class =
+{
+
+};
+
+Mammal : class < Animal =
+{
+
+};
+
+final Monkey : class < Mammal =
+{
+
+};
Index: trunk/tests/mouline.sh
===================================================================
--- trunk/tests/mouline.sh (revision 48)
+++ trunk/tests/mouline.sh (revision 49)
@@ -1,7 +1,4 @@
-function align
-{
- echo -e -n "\033[$1G"
-}
+#!/bin/sh
red="\033[33;00;31m"
bred="\033[33;01;31m"
@@ -12,31 +9,106 @@
blue="\033[33;00;34m"
bblue="\033[33;01;34m"
-alias echo="echo -e"
+print_diff=0
+gen_ref=0
+
+align ()
+{
+ echo -e -n "\033[$1G"
+}
-for dir in `dirname $0`/*; do
- if [ -d "$dir" ] && ! [ "x"`basename $dir` = "xinput" ]; then
+prolog()
+{
align 2
- echo $bblue`basename $dir`
- for test in $dir/*.ref; do
- name=${test%.ref}
- name=${name#$dir/}
+ echo -e ${bblue}`basename ${1}`/
+}
+
+perform_test()
+{
+ test_name=`basename $1 .scl`
+ input=$1
+ ref=$2/${test_name}.ref
+ cmd=$2/command
+
align 6
- echo -n $yell$name
- align 26
- if [ "x$1" = "x--gen" ]; then
- `cat $dir/command` -i input/$name.scl > $test
- echo
+ echo -e -n ${yell}${test_name}
+ align 36
+
+ if [ $gen_ref -eq 1 ]; then
+ $cmd $input > $ref
+ else
+ if [ -r $ref ]; then
+ cmd_log=`$cmd $input 2> /dev/null`
+ diff_log=`printf "%s\n" "$cmd_log" | diff -u $ref -`
+ if [ "$diff_log" = "" ]; then
+ echo -e "$bblue[$bgreen ok $bblue]"
else
- if `dirname $0`/`cat $dir/command` -i `dirname $0`/input/$name.scl | diff - $test > /dev/null 2> /dev/null; then
- echo "$bblue[$bgreen ok $bblue]"
+ echo -e "$bblue[$bred ko $bblue]"
+ if [ $print_diff -eq 1 ]; then
+ echo -e -n $red
+ echo "$diff_log"
+ echo -e
+ fi
+ fi
else
- echo "$bblue[$bred ko $bblue]"
- echo -n $red
- `dirname $0`/`cat $dir/command` -i `dirname $0`/input/$name.scl | diff - $test
- echo
+ echo -e "$bblue[$byell sk $bblue]"
+ echo -e -n $red
fi
fi
+}
+
+# Parse command line options
+while [ $# -gt 0 ]
+do
+ case "$1" in
+ -d | --diff)
+ print_diff=1
+ ;;
+
+ -g | --gen)
+ gen_ref=1
+ ;;
+
+ -*)
+ echo Unknown option : $1
+ exit 1
+ ;;
+
+ *)
+ break
+ ;;
+ esac
+ shift
+done
+
+# If files are given on the command line, only check those tests
+cmd_line=0
+while [ $# -gt 0 ]
+do
+ cmd_line=1
+ prolog "$1"
+
+ for dir in `dirname $0`/*
+ do
+ align 4
+ if [ -d "$dir" ] && ! [ "`basename $dir`" = "input" ]; then
+ echo -e ${red}`basename ${dir}`/
+ perform_test "$1" "$dir"
+ fi
+ done
+ shift
+done
+
+if [ $cmd_line -eq 1 ]; then
+ exit 0
+fi
+
+for dir in `dirname $0`/*
+do
+ if [ -d "$dir" ] && ! [ "`basename $dir`" = "input" ]; then
+ prolog "$dir"
+ for input in `dirname $0`/input/*.scl; do
+ perform_test "$input" "$dir"
done
fi
done
Index: trunk/tests/transformer/sample_4.ref
===================================================================
--- trunk/tests/transformer/sample_4.ref (revision 0)
+++ trunk/tests/transformer/sample_4.ref (revision 49)
@@ -0,0 +1,7 @@
+#include <stc/any.hh>
+#include <stc/find_exact.hh>
+
+float sqrt(float arg)
+{
+ return std::sqrt(arg);
+}
Index: trunk/tests/transformer/function_return_1.ref
===================================================================
--- trunk/tests/transformer/function_return_1.ref (revision 0)
+++ trunk/tests/transformer/function_return_1.ref (revision 49)
@@ -0,0 +1,7 @@
+#include <stc/any.hh>
+#include <stc/find_exact.hh>
+
+int answer()
+{
+ return 42;
+}
Index: trunk/tests/transformer/function_return_2.ref
===================================================================
--- trunk/tests/transformer/function_return_2.ref (revision 0)
+++ trunk/tests/transformer/function_return_2.ref (revision 49)
@@ -0,0 +1,7 @@
+#include <stc/any.hh>
+#include <stc/find_exact.hh>
+
+int answer(int a, bool b)
+{
+ return 42;
+}
Index: trunk/tests/transformer/class_decl_abst.ref
===================================================================
--- trunk/tests/transformer/class_decl_abst.ref (revision 0)
+++ trunk/tests/transformer/class_decl_abst.ref (revision 49)
@@ -0,0 +1 @@
+
Index: trunk/tests/transformer/function_return_3.ref
===================================================================
--- trunk/tests/transformer/function_return_3.ref (revision 0)
+++ trunk/tests/transformer/function_return_3.ref (revision 49)
@@ -0,0 +1,7 @@
+#include <stc/any.hh>
+#include <stc/find_exact.hh>
+
+int answer()
+{
+ return 42;
+}
Index: trunk/tests/transformer/cons_decl_1.ref
===================================================================
--- trunk/tests/transformer/cons_decl_1.ref (revision 0)
+++ trunk/tests/transformer/cons_decl_1.ref (revision 49)
@@ -0,0 +1,4 @@
+#include <stc/any.hh>
+#include <stc/find_exact.hh>
+
+const int i;
Index: trunk/tests/transformer/cons_decl_2.ref
===================================================================
--- trunk/tests/transformer/cons_decl_2.ref (revision 0)
+++ trunk/tests/transformer/cons_decl_2.ref (revision 49)
@@ -0,0 +1,4 @@
+#include <stc/any.hh>
+#include <stc/find_exact.hh>
+
+const int i = 3;
Index: trunk/tests/transformer/class_decl_1.ref
===================================================================
--- trunk/tests/transformer/class_decl_1.ref (revision 0)
+++ trunk/tests/transformer/class_decl_1.ref (revision 49)
@@ -0,0 +1,11 @@
+#include <stc/any.hh>
+#include <stc/find_exact.hh>
+
+// Class Foo
+
+template < typename T >
+class Foo_: public stc::any<stc_find_exact(Foo_, T)>
+{
+};
+
+typedef Foo_<stc::itself> Foo;
Index: trunk/tests/transformer/class_decl_2.ref
===================================================================
--- trunk/tests/transformer/class_decl_2.ref (revision 0)
+++ trunk/tests/transformer/class_decl_2.ref (revision 49)
@@ -0,0 +1,20 @@
+#include <stc/any.hh>
+#include <stc/find_exact.hh>
+
+// Class point
+
+template < typename T >
+class point_: public stc::any<stc_find_exact(point_, T)>
+{
+ public:
+ int x()
+ {
+ return x;
+ }
+
+ private:
+ int x;
+ int y;
+};
+
+typedef point_<stc::itself> point;
Index: trunk/tests/transformer/class_decl_3.ref
===================================================================
--- trunk/tests/transformer/class_decl_3.ref (revision 0)
+++ trunk/tests/transformer/class_decl_3.ref (revision 49)
@@ -0,0 +1,20 @@
+#include <stc/any.hh>
+#include <stc/find_exact.hh>
+
+// Class point
+
+template < typename T >
+class point_: public stc::any<stc_find_exact(point_, T)>
+{
+ public:
+ int x()
+ {
+ return x;
+ }
+
+ private:
+ int x;
+ int y;
+};
+
+typedef point_<stc::itself> point;
Index: trunk/tests/transformer/class_template_1.ref
===================================================================
--- trunk/tests/transformer/class_template_1.ref (revision 0)
+++ trunk/tests/transformer/class_template_1.ref (revision 49)
@@ -0,0 +1,7 @@
+#include <stc/any.hh>
+#include <stc/find_exact.hh>
+
+template < class T >
+class A
+{
+};
Index: trunk/tests/transformer/class_template_2.ref
===================================================================
--- trunk/tests/transformer/class_template_2.ref (revision 0)
+++ trunk/tests/transformer/class_template_2.ref (revision 49)
@@ -0,0 +1,7 @@
+#include <stc/any.hh>
+#include <stc/find_exact.hh>
+
+template < class T, bool B >
+class A
+{
+};
Index: trunk/tests/transformer/class_decl_inh.ref
===================================================================
--- trunk/tests/transformer/class_decl_inh.ref (revision 0)
+++ trunk/tests/transformer/class_decl_inh.ref (revision 49)
@@ -0,0 +1,19 @@
+#include <stc/any.hh>
+#include <stc/find_exact.hh>
+
+// Class Bar
+
+template < typename T >
+class Bar_: public stc::any<stc_find_exact(Bar_, T)>
+{
+};
+
+typedef Bar_<stc::itself> Bar;
+// Class Foo
+
+template < typename T >
+class Foo_: public Bar_<stc_find_exact(Foo_, T)>
+{
+};
+
+typedef Foo_<stc::itself> Foo;
Index: trunk/tests/transformer/function_decl_1.ref
===================================================================
--- trunk/tests/transformer/function_decl_1.ref (revision 0)
+++ trunk/tests/transformer/function_decl_1.ref (revision 49)
@@ -0,0 +1,6 @@
+#include <stc/any.hh>
+#include <stc/find_exact.hh>
+
+bool f(int a, int b)
+{
+}
Index: trunk/tests/transformer/function_decl_3.ref
===================================================================
--- trunk/tests/transformer/function_decl_3.ref (revision 0)
+++ trunk/tests/transformer/function_decl_3.ref (revision 49)
@@ -0,0 +1,4 @@
+#include <stc/any.hh>
+#include <stc/find_exact.hh>
+
+void foo();
Index: trunk/tests/transformer/empty.ref
===================================================================
--- trunk/tests/transformer/empty.ref (revision 0)
+++ trunk/tests/transformer/empty.ref (revision 49)
@@ -0,0 +1,2 @@
+#include <stc/any.hh>
+#include <stc/find_exact.hh>
Index: trunk/tests/transformer/var_decl_1.ref
===================================================================
--- trunk/tests/transformer/var_decl_1.ref (revision 0)
+++ trunk/tests/transformer/var_decl_1.ref (revision 49)
@@ -0,0 +1,4 @@
+#include <stc/any.hh>
+#include <stc/find_exact.hh>
+
+int i;
Index: trunk/tests/transformer/function_decl_4.ref
===================================================================
--- trunk/tests/transformer/function_decl_4.ref (revision 0)
+++ trunk/tests/transformer/function_decl_4.ref (revision 49)
@@ -0,0 +1,6 @@
+#include <stc/any.hh>
+#include <stc/find_exact.hh>
+
+void foo();
+float foo(int arg1);
+char foo(const toto& arg1, double& arg2);
Index: trunk/tests/transformer/function_decl_5.ref
===================================================================
--- trunk/tests/transformer/function_decl_5.ref (revision 0)
+++ trunk/tests/transformer/function_decl_5.ref (revision 49)
@@ -0,0 +1,6 @@
+#include <stc/any.hh>
+#include <stc/find_exact.hh>
+
+bool f(int a, int& b)
+{
+}
Index: trunk/tests/transformer/var_decl_2.ref
===================================================================
--- trunk/tests/transformer/var_decl_2.ref (revision 0)
+++ trunk/tests/transformer/var_decl_2.ref (revision 49)
@@ -0,0 +1,4 @@
+#include <stc/any.hh>
+#include <stc/find_exact.hh>
+
+int i = 42;
Index: trunk/tests/transformer/function_decl_6.ref
===================================================================
--- trunk/tests/transformer/function_decl_6.ref (revision 0)
+++ trunk/tests/transformer/function_decl_6.ref (revision 49)
@@ -0,0 +1,7 @@
+#include <stc/any.hh>
+#include <stc/find_exact.hh>
+
+template < class T >
+void f()
+{
+}
Index: trunk/tests/transformer/var_decl_3.ref
===================================================================
--- trunk/tests/transformer/var_decl_3.ref (revision 0)
+++ trunk/tests/transformer/var_decl_3.ref (revision 49)
@@ -0,0 +1,6 @@
+#include <stc/any.hh>
+#include <stc/find_exact.hh>
+
+const int answer = 42;
+int i;
+int j = i;
Index: trunk/tests/transformer/function_decl_7.ref
===================================================================
--- trunk/tests/transformer/function_decl_7.ref (revision 0)
+++ trunk/tests/transformer/function_decl_7.ref (revision 49)
@@ -0,0 +1,8 @@
+#include <stc/any.hh>
+#include <stc/find_exact.hh>
+
+template < class T >
+void f(int a)
+{
+ return 42;
+}
Index: trunk/tests/transformer/function_decl_8.ref
===================================================================
--- trunk/tests/transformer/function_decl_8.ref (revision 0)
+++ trunk/tests/transformer/function_decl_8.ref (revision 49)
@@ -0,0 +1,8 @@
+#include <stc/any.hh>
+#include <stc/find_exact.hh>
+
+template < class T >
+void f(int a)
+{
+ return 42;
+}
Index: trunk/tests/transformer/command
===================================================================
--- trunk/tests/transformer/command (revision 0)
+++ trunk/tests/transformer/command (revision 49)
@@ -0,0 +1,85 @@
+#!/bin/sh
+
+red="\033[33;00;31m"
+bred="\033[33;01;31m"
+green="\033[33;00;32m"
+bgreen="\033[33;01;32m"
+yell="\033[33;00;33m"
+byell="\033[33;01;33m"
+blue="\033[33;00;34m"
+bblue="\033[33;01;34m"
+
+step=0
+verb=0
+printsrc=0
+while [ $# -gt 0 ]
+do
+ case "$1" in
+ -s | --step)
+ step=1
+ ;;
+
+ -v | --verbose)
+ verb=1
+ ;;
+
+ -p | --print)
+ printsrc=1
+ ;;
+
+ -*)
+ echo Unknown option : $1
+ exit 1
+ ;;
+
+ *)
+ break
+ ;;
+ esac
+ shift
+done
+
+base="`dirname $0`/../../src/"
+parser="$base/parse-scool/parse-scool $1"
+transformer="$base/scoolt/scoolt"
+printer="$base/pp-cxx/pp-cxx"
+cxxprinter="abox2text"
+
+if [ $printsrc -eq 1 ]; then
+ echo "----[ cat $1 ]----"
+ cat $1
+ echo
+fi
+
+if [ $step -eq 1 ]
+then
+ echo '----[' $parser ']----'
+ tmp=`$parser`
+ if [ $? -ne 0 ]; then exit $?; fi
+ printf "%s\n" "$tmp" | pp-aterm
+ echo
+
+ echo '----[' $transformer ']----'
+ tmp=`printf "%s\n" "$tmp" | $transformer`
+ if [ $? -ne 0 ]; then exit $?; fi
+ printf "%s\n" "$tmp" | pp-aterm
+ echo
+
+ echo '----[' $printer ']----'
+ tmp=`printf "%s\n" "$tmp" | $printer`
+ if [ $? -ne 0 ]; then exit $?; fi
+ printf "%s\n" "$tmp"
+ echo
+
+ echo '---[' $cxxprinter ']----'
+ tmp=`printf "%s\n" "$tmp" | $cxxprinter`
+ if [ $? -ne 0 ]; then exit $?; fi
+ printf "%s\n" "$tmp"
+ echo
+else
+ if [ $verb -eq 1 ]; then
+ printf "%s\n" "`$parser | $transformer | $printer | $cxxprinter`"
+ else
+ printf "%s\n" "`$parser 2> err-log | $transformer 2>> err-log | $printer 2>> err-log | $cxxprinter 2>> err-log`"
+ fi
+fi
Property changes on: trunk/tests/transformer/command
___________________________________________________________________
Name: svn:executable
+ *
Index: trunk/tests/transformer/var_decl_5.ref
===================================================================
--- trunk/tests/transformer/var_decl_5.ref (revision 0)
+++ trunk/tests/transformer/var_decl_5.ref (revision 49)
@@ -0,0 +1,4 @@
+#include <stc/any.hh>
+#include <stc/find_exact.hh>
+
+int a[42];
Index: trunk/tests/transformer/function_decl_9.ref
===================================================================
--- trunk/tests/transformer/function_decl_9.ref (revision 0)
+++ trunk/tests/transformer/function_decl_9.ref (revision 49)
@@ -0,0 +1,8 @@
+#include <stc/any.hh>
+#include <stc/find_exact.hh>
+
+template < class T >
+T f(const T& a)
+{
+ return a + 42;
+}
Index: trunk/tests/transformer/var_decl_6.ref
===================================================================
--- trunk/tests/transformer/var_decl_6.ref (revision 0)
+++ trunk/tests/transformer/var_decl_6.ref (revision 49)
@@ -0,0 +1,4 @@
+#include <stc/any.hh>
+#include <stc/find_exact.hh>
+
+std::vector<int> a;
Index: trunk/tests/transformer/function_decl_10.ref
===================================================================
--- trunk/tests/transformer/function_decl_10.ref (revision 0)
+++ trunk/tests/transformer/function_decl_10.ref (revision 49)
@@ -0,0 +1,7 @@
+#include <stc/any.hh>
+#include <stc/find_exact.hh>
+
+double f(int a, double b)
+{
+ return a + b;
+}
Index: trunk/tests/transformer/class_decl_inh_fin.ref
===================================================================
--- trunk/tests/transformer/class_decl_inh_fin.ref (revision 0)
+++ trunk/tests/transformer/class_decl_inh_fin.ref (revision 49)
@@ -0,0 +1,26 @@
+#include <stc/any.hh>
+#include <stc/find_exact.hh>
+
+// Class Animal
+
+template < typename T >
+class Animal_: public stc::any<stc_find_exact(Animal_, T)>
+{
+};
+
+typedef Animal_<stc::itself> Animal;
+// Class Mammal
+
+template < typename T >
+class Mammal_: public Animal_<stc_find_exact(Mammal_, T)>
+{
+};
+
+typedef Mammal_<stc::itself> Mammal;
+// Class Monkey
+
+class Monkey: public Mammal_<Monkey>
+{
+};
+
+typedef Monkey_<stc::itself> Monkey;
Index: trunk/tests/transformer/class_members_1.ref
===================================================================
--- trunk/tests/transformer/class_members_1.ref (revision 0)
+++ trunk/tests/transformer/class_members_1.ref (revision 49)
@@ -0,0 +1,13 @@
+#include <stc/any.hh>
+#include <stc/find_exact.hh>
+
+// Class Student
+
+template < typename T >
+class Student_: public stc::any<stc_find_exact(Student_, T)>
+{
+ public:
+ int money;
+};
+
+typedef Student_<stc::itself> Student;
Index: trunk/tests/transformer/sample_1.ref
===================================================================
--- trunk/tests/transformer/sample_1.ref (revision 0)
+++ trunk/tests/transformer/sample_1.ref (revision 49)
@@ -0,0 +1,10 @@
+#include <stc/any.hh>
+#include <stc/find_exact.hh>
+
+void f()
+{
+ const int16 i = 3;
+ i = 4;
+ int16 j = 3;
+ j = 4;
+}
Index: trunk/tests/transformer/class_predecl_inh.ref
===================================================================
--- trunk/tests/transformer/class_predecl_inh.ref (revision 0)
+++ trunk/tests/transformer/class_predecl_inh.ref (revision 49)
@@ -0,0 +1,4 @@
+#include <stc/any.hh>
+#include <stc/find_exact.hh>
+
+class Foo: public Bar;
Index: trunk/tests/transformer/sample_3.ref
===================================================================
--- trunk/tests/transformer/sample_3.ref (revision 0)
+++ trunk/tests/transformer/sample_3.ref (revision 49)
@@ -0,0 +1,11 @@
+#include <stc/any.hh>
+#include <stc/find_exact.hh>
+
+void f()
+{
+ int i;
+ int j;
+ i = 0;
+ j = i;
+ i = j + i;
+}
Index: trunk/tests/transformer/class_decl_inh_abst.ref
===================================================================
--- trunk/tests/transformer/class_decl_inh_abst.ref (revision 0)
+++ trunk/tests/transformer/class_decl_inh_abst.ref (revision 49)
@@ -0,0 +1,17 @@
+#include <stc/any.hh>
+#include <stc/find_exact.hh>
+
+// Class Animal
+
+template < typename T >
+class Animal_: public stc::any<stc_find_exact(Animal_, T)>
+{
+};
+// Class Mammal
+
+template < typename T >
+class Mammal_: public Animal_<stc_find_exact(Mammal_, T)>
+{
+};
+
+typedef Mammal_<stc::itself> Mammal;
Index: trunk/tests/transformer/class_predecl.ref
===================================================================
--- trunk/tests/transformer/class_predecl.ref (revision 0)
+++ trunk/tests/transformer/class_predecl.ref (revision 49)
@@ -0,0 +1,5 @@
+#include <stc/any.hh>
+#include <stc/find_exact.hh>
+
+template < typename T >
+class Foo_;
Index: trunk/tests/parser/function_return_1.ref
===================================================================
--- trunk/tests/parser/function_return_1.ref (revision 0)
+++ trunk/tests/parser/function_return_1.ref (revision 49)
@@ -0,0 +1 @@
+Program([FunDec([],"answer",[],Var("int"),[Return(Int("42"))])])
Index: trunk/tests/parser/sample_4.ref
===================================================================
--- trunk/tests/parser/sample_4.ref (revision 0)
+++ trunk/tests/parser/sample_4.ref (revision 49)
@@ -0,0 +1 @@
+Program([FunDec([],"sqrt",[("arg",Var("float"))],Var("float"),[Return(Cxx("std::sqrt(arg)"))])])
Index: trunk/tests/parser/function_return_2.ref
===================================================================
--- trunk/tests/parser/function_return_2.ref (revision 0)
+++ trunk/tests/parser/function_return_2.ref (revision 49)
@@ -0,0 +1 @@
+Program([FunDec([],"answer",[("a",Var("int")),("b",Var("bool"))],Var("int"),[Return(Int("42"))])])
Index: trunk/tests/parser/function_return_3.ref
===================================================================
--- trunk/tests/parser/function_return_3.ref (revision 0)
+++ trunk/tests/parser/function_return_3.ref (revision 49)
@@ -0,0 +1 @@
+Program([FunDec([],"answer",[],Var("int"),ExpStm(Int("42")))])
Index: trunk/tests/parser/cons_decl_1.ref
===================================================================
--- trunk/tests/parser/cons_decl_1.ref (revision 0)
+++ trunk/tests/parser/cons_decl_1.ref (revision 49)
@@ -0,0 +1 @@
+Program([ConstDec([],"i",None,Var("int"))])
Index: trunk/tests/parser/cons_decl_2.ref
===================================================================
--- trunk/tests/parser/cons_decl_2.ref (revision 0)
+++ trunk/tests/parser/cons_decl_2.ref (revision 49)
@@ -0,0 +1 @@
+Program([ConstDec([],"i",Var("int"),Int("3"))])
Index: trunk/tests/parser/class_decl_1.ref
===================================================================
--- trunk/tests/parser/class_decl_1.ref (revision 0)
+++ trunk/tests/parser/class_decl_1.ref (revision 49)
@@ -0,0 +1 @@
+Program([ConstDec([],"Foo",Class,ClassVal([]))])
Index: trunk/tests/parser/class_decl_2.ref
===================================================================
--- trunk/tests/parser/class_decl_2.ref (revision 0)
+++ trunk/tests/parser/class_decl_2.ref (revision 49)
@@ -0,0 +1 @@
+Program([ConstDec([],"point",Class,ClassVal([Accessblock(Public,[FunDec([],"x",[],Var("int"),[Return(Var("x"))])]),Accessblock(Private,[VarDec([],"x",Var("int")),VarDec([],"y",Var("int"))])]))])
Index: trunk/tests/parser/class_decl_3.ref
===================================================================
--- trunk/tests/parser/class_decl_3.ref (revision 0)
+++ trunk/tests/parser/class_decl_3.ref (revision 49)
@@ -0,0 +1 @@
+Program([ConstDec([],"point",Class,ClassVal([Accessblock(Public,[FunDec([],"x",[],Var("int"),ExpStm(Var("x")))]),Accessblock(Private,[VarDec([],"x",Var("int")),VarDec([],"y",Var("int"))])]))])
Index: trunk/tests/parser/class_template_1.ref
===================================================================
--- trunk/tests/parser/class_template_1.ref (revision 0)
+++ trunk/tests/parser/class_template_1.ref (revision 49)
@@ -0,0 +1 @@
+Program([StaticFunDec([],"A",[("T",Var("type"),None)],Class,[])])
Index: trunk/tests/parser/class_template_2.ref
===================================================================
--- trunk/tests/parser/class_template_2.ref (revision 0)
+++ trunk/tests/parser/class_template_2.ref (revision 49)
@@ -0,0 +1 @@
+Program([StaticFunDec([],"A",[("T",Var("type"),None),("B",Var("bool"),None)],Class,[])])
Index: trunk/tests/parser/class_decl_inh.ref
===================================================================
--- trunk/tests/parser/class_decl_inh.ref (revision 0)
+++ trunk/tests/parser/class_decl_inh.ref (revision 49)
@@ -0,0 +1 @@
+Program([ConstDec([],"Bar",Class,ClassVal([])),ConstDec([],"Foo",Class(Var("Bar")),ClassVal([]))])
Index: trunk/tests/parser/function_decl_1.ref
===================================================================
--- trunk/tests/parser/function_decl_1.ref (revision 0)
+++ trunk/tests/parser/function_decl_1.ref (revision 49)
@@ -0,0 +1 @@
+Program([FunDec([],"f",[("a",Var("int")),("b",Var("int"))],Var("bool"),[])])
Index: trunk/tests/parser/function_decl_2.ref
===================================================================
--- trunk/tests/parser/function_decl_2.ref (revision 0)
+++ trunk/tests/parser/function_decl_2.ref (revision 49)
@@ -0,0 +1 @@
+Program([BiFunDec([],"f",[("i",Var("int"),Some((Sup(Var("i"),Int("0")))))],[],Var("int"),[])])
Index: trunk/tests/parser/function_decl_3.ref
===================================================================
--- trunk/tests/parser/function_decl_3.ref (revision 0)
+++ trunk/tests/parser/function_decl_3.ref (revision 49)
@@ -0,0 +1 @@
+Program([ConstDec(["decl"],"foo",None,FunType([],Var("void")))])
Index: trunk/tests/parser/function_decl_4.ref
===================================================================
--- trunk/tests/parser/function_decl_4.ref (revision 0)
+++ trunk/tests/parser/function_decl_4.ref (revision 49)
@@ -0,0 +1 @@
+Program([ConstDec(["decl"],"foo",None,FunType([],Var("void"))),ConstDec(["decl"],"foo",None,FunType([FunArg("arg1",Var("int"))],Var("float"))),ConstDec(["decl"],"foo",None,FunType([FunArg("arg1",Var("toto")),FunArg("arg2",RefType(Var("double")))],Var("char")))])
Index: trunk/tests/parser/var_decl_1.ref
===================================================================
--- trunk/tests/parser/var_decl_1.ref (revision 0)
+++ trunk/tests/parser/var_decl_1.ref (revision 49)
@@ -0,0 +1 @@
+Program([VarDec([],"i",Var("int"))])
Index: trunk/tests/parser/function_decl_5.ref
===================================================================
--- trunk/tests/parser/function_decl_5.ref (revision 0)
+++ trunk/tests/parser/function_decl_5.ref (revision 49)
@@ -0,0 +1 @@
+Program([FunDec([],"f",[("a",Var("int")),("b",RefType(Var("int")))],Var("bool"),[])])
Index: trunk/tests/parser/function_call_1.ref
===================================================================
--- trunk/tests/parser/function_call_1.ref (revision 0)
+++ trunk/tests/parser/function_call_1.ref (revision 49)
@@ -0,0 +1 @@
+Program([FunDec([],"doit",[],Var("int"),[Return(FunCall("foo",[]))])])
Index: trunk/tests/parser/var_decl_2.ref
===================================================================
--- trunk/tests/parser/var_decl_2.ref (revision 0)
+++ trunk/tests/parser/var_decl_2.ref (revision 49)
@@ -0,0 +1 @@
+Program([VarDec([],"i",Var("int"),Int("42"))])
Index: trunk/tests/parser/function_decl_6.ref
===================================================================
--- trunk/tests/parser/function_decl_6.ref (revision 0)
+++ trunk/tests/parser/function_decl_6.ref (revision 49)
@@ -0,0 +1 @@
+Program([BiFunDec([],"f",[("T",Var("type"),None)],[],Var("void"),[])])
Index: trunk/tests/parser/function_call_2.ref
===================================================================
--- trunk/tests/parser/function_call_2.ref (revision 0)
+++ trunk/tests/parser/function_call_2.ref (revision 49)
@@ -0,0 +1 @@
+Program([FunDec([],"doit",[],Var("int"),[Return(FunCall("foo",[String("\"bar\""),String("\"baz\"")]))])])
Index: trunk/tests/parser/var_decl_3.ref
===================================================================
--- trunk/tests/parser/var_decl_3.ref (revision 0)
+++ trunk/tests/parser/var_decl_3.ref (revision 49)
@@ -0,0 +1 @@
+Program([ConstDec([],"answer",Var("int"),Int("42")),VarDec([],"i",Var("int")),VarDec([],"j",Var("int"),Var("i"))])
Index: trunk/tests/parser/function_decl_7.ref
===================================================================
--- trunk/tests/parser/function_decl_7.ref (revision 0)
+++ trunk/tests/parser/function_decl_7.ref (revision 49)
@@ -0,0 +1 @@
+Program([BiFunDec([],"f",[("T",Var("type"),None)],[("a",Var("int"))],Var("void"),[Return(Int("42"))])])
Index: trunk/tests/parser/function_call_3.ref
===================================================================
--- trunk/tests/parser/function_call_3.ref (revision 0)
+++ trunk/tests/parser/function_call_3.ref (revision 49)
@@ -0,0 +1 @@
+Program([ConstDec([],"i",Var("int"),BiFunCall("pow",[Int("4")],[Int("3")]))])
Index: trunk/tests/parser/var_decl_4.ref
===================================================================
--- trunk/tests/parser/var_decl_4.ref (revision 0)
+++ trunk/tests/parser/var_decl_4.ref (revision 49)
@@ -0,0 +1 @@
+Program([VarDec([],"l",StaticFunCall("list",[Var("int")]))])
Index: trunk/tests/parser/command
===================================================================
--- trunk/tests/parser/command (revision 48)
+++ trunk/tests/parser/command (revision 49)
@@ -1 +1 @@
-../bin/parse-scool
\ No newline at end of file
+`dirname $0`/../../bin/parse-scool -i $1
Index: trunk/tests/parser/function_decl_8.ref
===================================================================
--- trunk/tests/parser/function_decl_8.ref (revision 0)
+++ trunk/tests/parser/function_decl_8.ref (revision 49)
@@ -0,0 +1 @@
+Program([BiFunDec([],"f",[("T",Var("type"),None)],[("a",Var("int"))],Var("void"),ExpStm(Int("42")))])
Index: trunk/tests/parser/var_decl_5.ref
===================================================================
--- trunk/tests/parser/var_decl_5.ref (revision 0)
+++ trunk/tests/parser/var_decl_5.ref (revision 49)
@@ -0,0 +1 @@
+Program([VarDec([],"a",StaticFunCall("array",[Var("int"),Int("42")]))])
Index: trunk/tests/parser/function_decl_9.ref
===================================================================
--- trunk/tests/parser/function_decl_9.ref (revision 0)
+++ trunk/tests/parser/function_decl_9.ref (revision 49)
@@ -0,0 +1 @@
+Program([BiFunDec([],"f",[("T",Var("type"),None)],[("a",Var("T"))],Var("T"),ExpStm(Sum(Var("a"),Int("42"))))])
Index: trunk/tests/parser/var_decl_6.ref
===================================================================
--- trunk/tests/parser/var_decl_6.ref (revision 0)
+++ trunk/tests/parser/var_decl_6.ref (revision 49)
@@ -0,0 +1 @@
+Program([VarDec([],"a",StaticFunCall("buffer",[Var("int")]))])
Index: trunk/tests/parser/function_decl_10.ref
===================================================================
--- trunk/tests/parser/function_decl_10.ref (revision 0)
+++ trunk/tests/parser/function_decl_10.ref (revision 49)
@@ -0,0 +1 @@
+Program([FunDec([],"f",[("a",Var("int")),("b",Var("double"))],Var("double"),ExpStm(Sum(Var("a"),Var("b"))))])
Index: trunk/tests/parser/function_ftype_1.ref
===================================================================
--- trunk/tests/parser/function_ftype_1.ref (revision 0)
+++ trunk/tests/parser/function_ftype_1.ref (revision 49)
@@ -0,0 +1 @@
+Program([VarDec([],"f",FunType([],Var("void")))])
Index: trunk/tests/parser/function_ftype_2.ref
===================================================================
--- trunk/tests/parser/function_ftype_2.ref (revision 0)
+++ trunk/tests/parser/function_ftype_2.ref (revision 49)
@@ -0,0 +1 @@
+Program([VarDec([],"f",FunType([Var("int"),Var("bool")],Var("float")))])
Index: trunk/tests/parser/class_decl_inh_fin.ref
===================================================================
--- trunk/tests/parser/class_decl_inh_fin.ref (revision 0)
+++ trunk/tests/parser/class_decl_inh_fin.ref (revision 49)
@@ -0,0 +1 @@
+Program([ConstDec([],"Animal",Class,ClassVal([])),ConstDec([],"Mammal",Class(Var("Animal")),ClassVal([])),ConstDec(["final"],"Monkey",Class(Var("Mammal")),ClassVal([]))])
Index: trunk/tests/parser/class_members_1.ref
===================================================================
--- trunk/tests/parser/class_members_1.ref (revision 0)
+++ trunk/tests/parser/class_members_1.ref (revision 49)
@@ -0,0 +1 @@
+Program([ConstDec(["final"],"Student",Class,ClassVal([Accessblock(Public,[VarDec([],"money",Var("int"))])]))])
Index: trunk/tests/parser/class_predecl_inh.ref
===================================================================
--- trunk/tests/parser/class_predecl_inh.ref (revision 0)
+++ trunk/tests/parser/class_predecl_inh.ref (revision 49)
@@ -0,0 +1 @@
+Program([ConstDec([],"Foo",None,Class(Var("Bar")))])
Index: trunk/tests/parser/sample_1.ref
===================================================================
--- trunk/tests/parser/sample_1.ref (revision 0)
+++ trunk/tests/parser/sample_1.ref (revision 49)
@@ -0,0 +1 @@
+Program([FunDec([],"f",[],Var("void"),[ConstDec([],"i",Var("int16"),Int("3")),ExpStm(Affect(Var("i"),Int("4"))),VarDec([],"j",Var("int16"),Int("3")),ExpStm(Affect(Var("j"),Int("4")))])])
Index: trunk/tests/parser/sample_2.ref
===================================================================
--- trunk/tests/parser/sample_2.ref (revision 0)
+++ trunk/tests/parser/sample_2.ref (revision 49)
@@ -0,0 +1 @@
+Program([FunDec([],"f",[],Var("void"),[VarDec([],"a",StaticFunCall("array",[Var("int16"),Int("2")])),VarDec([],"i",Var("int16"),MethodCall("a","at",[Int("0")]))])])
Index: trunk/tests/parser/class_decl_inh_abst.ref
===================================================================
--- trunk/tests/parser/class_decl_inh_abst.ref (revision 0)
+++ trunk/tests/parser/class_decl_inh_abst.ref (revision 49)
@@ -0,0 +1 @@
+Program([ConstDec(["abstract"],"Animal",Class,ClassVal([])),ConstDec([],"Mammal",Class(Var("Animal")),ClassVal([]))])
Index: trunk/tests/parser/class_predecl.ref
===================================================================
--- trunk/tests/parser/class_predecl.ref (revision 0)
+++ trunk/tests/parser/class_predecl.ref (revision 49)
@@ -0,0 +1 @@
+Program([ConstDec([],"Foo",None,Class)])
Index: trunk/tests/parser/sample_3.ref
===================================================================
--- trunk/tests/parser/sample_3.ref (revision 0)
+++ trunk/tests/parser/sample_3.ref (revision 49)
@@ -0,0 +1 @@
+Program([FunDec([],"f",[],Var("void"),[VarDec([],"i",Var("int")),VarDec([],"j",Var("int")),ExpStm(Affect(Var("i"),Int("0"))),ExpStm(Affect(Var("j"),Var("i"))),ExpStm(Affect(Var("i"),Sum(Var("j"),Var("i"))))])])
Index: trunk/configure.ac
===================================================================
--- trunk/configure.ac (revision 0)
+++ trunk/configure.ac (revision 49)
@@ -0,0 +1,29 @@
+AC_PREREQ(2.59)
+
+AC_INIT([scool], 0.1, [yabo(a)lrde.epita.fr]
+
+# Auxiliary files
+AC_CONFIG_AUX_DIR([config])
+AC_CONFIG_FILES(config/Makefile)
+
+AM_INIT_AUTOMAKE([1.9.5 dist-bzip2])
+
+XT_USE_XT_PACKAGES
+XT_PKG_ATERM
+XT_PKG_SDF
+XT_PKG_STRATEGOXT
+
+# Look for common programs
+AC_LANG_C
+AC_PROG_CC
+AC_PROG_INSTALL
+AC_PROG_LIBTOOL
+
+# Output Files
+AC_CONFIG_FILES([Makefile
+ src/Makefile
+ src/cxx-syn/Makefile
+ src/pp-cxx/Makefile
+ src/scl-syn/Makefile
+ src/scoolt/Makefile])
+AC_OUTPUT
Index: trunk/AUTHORS
===================================================================
--- trunk/AUTHORS (revision 0)
+++ trunk/AUTHORS (revision 49)
@@ -0,0 +1,2 @@
+* mefyl <mefyl(a)lrde.epita.fr>
+* yabo <yabo(a)lrde.epita.fr>
Index: trunk/config/Makefile.am
===================================================================
--- trunk/config/Makefile.am (revision 0)
+++ trunk/config/Makefile.am (revision 49)
@@ -0,0 +1,15 @@
+MAINTAINERCLEANFILES = \
+ Makefile.in \
+ $(STANDARD_TOOLS)
+
+STANDARD_TOOLS = \
+ install-sh \
+ missing \
+ mkinstalldirs \
+ depcomp
+
+EXTRA_DIST = \
+ Makefile.xt \
+ autoxt.m4
+
+bootclean:
Index: trunk/src/pp-cxx/CxxProgram.meta
===================================================================
--- trunk/src/pp-cxx/CxxProgram.meta (revision 0)
+++ trunk/src/pp-cxx/CxxProgram.meta (revision 49)
@@ -0,0 +1 @@
+Meta([Syntax("Stratego-Box")])
Index: trunk/src/pp-cxx/CxxDecl.meta
===================================================================
--- trunk/src/pp-cxx/CxxDecl.meta (revision 0)
+++ trunk/src/pp-cxx/CxxDecl.meta (revision 49)
@@ -0,0 +1 @@
+Meta([Syntax("Stratego-Box")])
Index: trunk/src/pp-cxx/CxxFun.str
===================================================================
--- trunk/src/pp-cxx/CxxFun.str (revision 0)
+++ trunk/src/pp-cxx/CxxFun.str (revision 49)
@@ -0,0 +1,69 @@
+module CxxFun
+
+imports Cxx Box libstratego-lib CxxType CxxExp CxxStm CxxId
+
+rules
+
+ CxxTopLevelToAbox:
+ CxxFun(params, t, idf, args) ->
+ V vs=0
+ [
+ ~<CxxParamsToAbox> params
+ H hs=0
+ [
+ H hs=1 [ ~<CxxTypeToAbox> t ~<CxxIdToAbox> idf ] "(" H hs=1 [ ~*<CxxListToAbox(CxxArgDefToAbox|",")> args ] ")" ";"
+ ]
+ ]
+
+ CxxTopLevelToAbox:
+ CxxFun(params, t, idf, args, body) ->
+ V vs=0
+ [
+ ~<CxxParamsToAbox> params
+ H hs=0 [
+ H hs=1 [ ~<CxxTypeToAbox>t ~<CxxIdToAbox>idf] "(" H hs=1 [ ~*<CxxListToAbox(CxxArgDefToAbox|",")> args ] ")"
+ ]
+ V vs=0 is=2
+ [
+ "{"
+ ~*<map(CxxStmToAbox <+ CxxTopLevelToAbox)>body
+ ]
+ "}"
+ ]
+
+ CxxTopLevelToAbox:
+ CxxTypedef(t, idf) ->
+ H hs=0 [ H hs=1 [ "typedef" ~<CxxTypeToAbox> t ~S(idf)] ";" ]
+
+ CxxArgDefToAbox:
+ (t, idf) ->
+ H hs = 1
+ [
+ ~<CxxTypeToAbox>t
+ ~<CxxIdToAbox>idf
+ ]
+
+ CxxListToAbox(sub|sep):
+ [e| [h|tail] ] ->
+ [
+ H hs=1 [
+ H hs=0 [
+ ~<sub>e
+ ~S(sep)
+ ]
+ ~<CxxListToAbox(sub|sep)> [h|tail]
+ ]
+ ]
+
+ CxxListToAbox(sub|sep):
+ [e| [] ] ->
+ [
+ H hs=0 [
+ ~<sub>e
+ ]
+ ]
+
+ CxxListToAbox(sub|sep):
+ [] ->
+ [ H [] ]
+
Index: trunk/src/pp-cxx/pp-cxx.str
===================================================================
--- trunk/src/pp-cxx/pp-cxx.str (revision 0)
+++ trunk/src/pp-cxx/pp-cxx.str (revision 49)
@@ -0,0 +1,6 @@
+module pp-cxx
+
+imports Cxx Box libstratego-lib CxxProgram
+
+strategies
+ pp-cxx = io-wrap(CxxProgramToAbox)
Index: trunk/src/pp-cxx/CxxId.str
===================================================================
--- trunk/src/pp-cxx/CxxId.str (revision 0)
+++ trunk/src/pp-cxx/CxxId.str (revision 49)
@@ -0,0 +1,12 @@
+module CxxId
+
+imports Cxx Box libstratego-lib
+
+rules
+
+ CxxIdToAbox:
+ x -> S(x)
+ where not(<?CxxScope(_, _)> x)
+
+ CxxIdToAbox:
+ CxxScope(idf1, idf2) -> H hs=0 [ ~<CxxIdToAbox>idf1 "::" ~<CxxIdToAbox>idf2 ]
Index: trunk/src/pp-cxx/CxxExp.str
===================================================================
--- trunk/src/pp-cxx/CxxExp.str (revision 0)
+++ trunk/src/pp-cxx/CxxExp.str (revision 49)
@@ -0,0 +1,31 @@
+module CxxExp
+
+imports Cxx Box libstratego-lib CxxId
+
+rules
+
+ CxxExpToAbox:
+ CxxInt(i) -> S(i)
+
+ CxxExpToStr:
+ CxxInt(i) -> i
+
+ CxxExpToStr:
+ CxxSum(e1, e2) -> <concat-strings> [<CxxExpToStr> e1, " + ", <CxxExpToStr> e2]
+
+ CxxExpToStr:
+ x -> x
+ where <is-string> x
+
+ /*
+ * Handle the CxxKeyword ctor.
+ * TODO: Generalize the type of exp.
+ */
+ CxxExpToAbox:
+ CxxKeyword(idf, exp) -> S(<concat-strings> [idf, " ", <CxxExpToStr> exp, ";"])
+
+ CxxExpToAbox:
+ CxxAffect(idf, exp) -> S(<concat-strings> [idf, " = ", <CxxExpToStr> exp, ";"])
+
+ CxxExpToAbox:
+ x -> S(x)
Index: trunk/src/pp-cxx/CxxType.meta
===================================================================
--- trunk/src/pp-cxx/CxxType.meta (revision 0)
+++ trunk/src/pp-cxx/CxxType.meta (revision 49)
@@ -0,0 +1 @@
+Meta([Syntax("Stratego-Box")])
Index: trunk/src/pp-cxx/CxxStm.str
===================================================================
--- trunk/src/pp-cxx/CxxStm.str (revision 0)
+++ trunk/src/pp-cxx/CxxStm.str (revision 49)
@@ -0,0 +1,8 @@
+module CxxStm
+
+imports Cxx Box libstratego-lib CxxType CxxExp CxxId
+
+rules
+
+ CxxStmToAbox:
+ CxxExpStm(e) -> <CxxExpToAbox> e
Index: trunk/src/pp-cxx/CxxFun.meta
===================================================================
--- trunk/src/pp-cxx/CxxFun.meta (revision 0)
+++ trunk/src/pp-cxx/CxxFun.meta (revision 49)
@@ -0,0 +1 @@
+Meta([Syntax("Stratego-Box")])
Index: trunk/src/pp-cxx/CxxProgram.str
===================================================================
--- trunk/src/pp-cxx/CxxProgram.str (revision 0)
+++ trunk/src/pp-cxx/CxxProgram.str (revision 49)
@@ -0,0 +1,15 @@
+module CxxProgram
+
+imports Cxx Box libstratego-lib CxxDecl CxxFun
+
+rules
+
+ CxxProgramToAbox:
+ CxxProgram(l) ->
+ V vs=1 [
+ V vs=0 [
+ "#include <stc/any.hh>"
+ "#include <stc/find_exact.hh>"
+ ]
+ V vs=0 [ ~*<map(CxxTopLevelToAbox)> l ]
+ ]
Index: trunk/src/pp-cxx/CxxDecl.str
===================================================================
--- trunk/src/pp-cxx/CxxDecl.str (revision 0)
+++ trunk/src/pp-cxx/CxxDecl.str (revision 49)
@@ -0,0 +1,90 @@
+module CxxDecl
+
+imports Cxx Box libstratego-lib CxxType CxxExp CxxId
+
+rules
+
+ CxxTopLevelToAbox:
+ l ->
+ V vs=1 [
+ ~*<map(CxxTopLevelToAbox)>l
+ ]
+
+ CxxTopLevelToAbox:
+ CxxDecl(t, idf) -> H hs=0 [ H hs=1 [ ~<CxxTypeToAbox>t ~<CxxIdToAbox>idf ] ";"]
+
+ CxxTopLevelToAbox:
+ CxxDecl(t, idf, v) -> H hs=0 [ H hs=1 [ ~<CxxTypeToAbox>t ~<CxxIdToAbox>idf "=" ~<CxxExpToAbox> v] ";"]
+
+ CxxTopLevelToAbox:
+ CxxArrayDecl(t, idf, n) -> H hs=0 [ H hs=1 [ ~<CxxTypeToAbox> t ~<CxxIdToAbox> idf] "[" ~<CxxExpToAbox> n "]" ";" ]
+
+ CxxTopLevelToAbox:
+ CxxClassDecl(params, idf, parents) ->
+ V vs=0 [
+ ~<CxxParamsToAbox> params
+ H hs=0 [
+ H hs=1 [ "class" ~<CxxIdToAbox>idf ]
+ ~<CxxParentsToAbox>parents
+ ";"
+ ]
+ ]
+
+ CxxTopLevelToAbox:
+ CxxClassDecl(params, idf, parents) ->
+ V vs=0 [
+ ~<CxxParamsToAbox> params
+ H hs=0 [
+ H hs=1 [ "class" ~<CxxIdToAbox>idf ]
+ ~<CxxParentsToAbox>parents
+ ";"
+ ]
+ ]
+
+ CxxTopLevelToAbox:
+ CxxComment(txt) ->
+ H hs=1 [ "//" ~S(txt) ]
+
+// FIXME: MERGE!!!
+
+ CxxBodyToAbox:
+ CxxPublic(b) -> V is=2 [ "public:" V [ ~*<map(CxxTopLevelToAbox)> b ] ]
+
+ CxxBodyToAbox:
+ CxxProtected(b) -> V is=2 [ "private:" V [ ~*<map(CxxTopLevelToAbox)> b ] ]
+
+ CxxBodyToAbox:
+ CxxPrivate(b) -> V is=2 [ "private:" V [ ~*<map(CxxTopLevelToAbox)> b ] ]
+
+ CxxTopLevelToAbox:
+ CxxClassDecl(params, idf, parents, body) ->
+ V vs=0 [
+ ~<CxxParamsToAbox> params
+ H hs=0 [
+ H hs=1 [ "class" ~<CxxIdToAbox> idf ]
+ ~<CxxParentsToAbox> parents
+ ]
+ V vs=0 is=2 [ "{" V vs=1 [ ~*<map (CxxBodyToAbox)> body ] ]
+ H hs=0 [ "}" ";" ]
+ ]
+
+ CxxParamsToAbox:
+ [] -> H []
+
+ CxxParamsToAbox:
+ params -> H hs=1 [ "template" "<" ~<CxxListToAbox(CxxParamToAbox|",")> params ">" ]
+ where not(<?[]> params)
+
+ CxxParamToAbox:
+ (t, idf) -> H hs = 1 [ ~<CxxTypeToAbox> t ~<CxxIdToAbox> idf ]
+
+ CxxParentsToAbox:
+ [] -> H []
+
+ CxxParentsToAbox:
+ parents -> H hs=1 [ ":" ~<CxxListToAbox(CxxParentToAbox|",")>parents ]
+ where not(<?[]> parents)
+
+ CxxParentToAbox:
+ (modifier, t) ->
+ H hs=1 [ ~S(modifier) ~<CxxTypeToAbox>t ]
Index: trunk/src/pp-cxx/pp-cxx.meta
===================================================================
--- trunk/src/pp-cxx/pp-cxx.meta (revision 0)
+++ trunk/src/pp-cxx/pp-cxx.meta (revision 49)
@@ -0,0 +1 @@
+Meta([Syntax("Stratego-Box")])
Index: trunk/src/pp-cxx/CxxId.meta
===================================================================
--- trunk/src/pp-cxx/CxxId.meta (revision 0)
+++ trunk/src/pp-cxx/CxxId.meta (revision 49)
@@ -0,0 +1 @@
+Meta([Syntax("Stratego-Box")])
Index: trunk/src/pp-cxx/Makefile.am
===================================================================
--- trunk/src/pp-cxx/Makefile.am (revision 0)
+++ trunk/src/pp-cxx/Makefile.am (revision 49)
@@ -0,0 +1,21 @@
+# Makefile.am -*-Makefile-*-
+
+MODULES = pp-cxx
+
+include $(top_srcdir)/config/Makefile.xt
+-include $(MODULES:=.c.dep)
+
+SCFLAGS = --main $* --verbose 0
+STRINCLUDES = -I $(top_builddir)/src/scl-syn \
+ -I $(top_builddir)/src/cxx-syn \
+ -I `dirname \`xtc get Stratego-Box.tbl\`` \
+ -I $(srcdir) \
+ -la stratego-lib
+
+libexec_PROGRAMS = pp-cxx
+
+nodist_pp_cxx_SOURCES = pp-cxx.c
+
+EXTRA_DIST = $(MODULES:=.str)
+
+CLEANFILES = $(MODULES:=.c) $(MODULES:=.c.dep)
Index: trunk/src/pp-cxx/CxxType.str
===================================================================
--- trunk/src/pp-cxx/CxxType.str (revision 0)
+++ trunk/src/pp-cxx/CxxType.str (revision 49)
@@ -0,0 +1,25 @@
+module CxxType
+
+imports Cxx Box libstratego-lib CxxId
+
+rules
+
+ CxxTypeToAbox:
+ CxxType(idf) -> <CxxIdToAbox> idf
+
+ CxxTypeToAbox:
+ CxxRefType(t) -> H hs=0 [ ~<CxxTypeToAbox> t "&" ]
+
+ CxxTypeToAbox:
+ CxxType(idf, params) -> H hs=0 [ ~<CxxIdToAbox> idf "<" ~<CxxListToAbox(CxxTypeToAbox|",")> params ">" ]
+
+ CxxTypeToAbox:
+ CxxConstType(t) -> H [ "const" ~<CxxTypeToAbox> t]
+
+ CxxTypeToAbox:
+ Typename -> S("typename")
+
+ /* These function are actually macros */
+
+ CxxTypeToAbox:
+ CxxFunCall(idf, args) -> H hs=0 [ ~<CxxIdToAbox>idf "(" H hs=1 [ ~*<CxxListToAbox(CxxTypeToAbox <+ CxxExpToAbox|",")>args ] ")"]
Index: trunk/src/pp-cxx/CxxStm.meta
===================================================================
--- trunk/src/pp-cxx/CxxStm.meta (revision 0)
+++ trunk/src/pp-cxx/CxxStm.meta (revision 49)
@@ -0,0 +1 @@
+Meta([Syntax("Stratego-Box")])
Index: trunk/src/scoolt/Exp.str
===================================================================
--- trunk/src/scoolt/Exp.str (revision 0)
+++ trunk/src/scoolt/Exp.str (revision 49)
@@ -0,0 +1,21 @@
+module Exp
+
+imports libstratego-lib Cxx AsFix Scool
+
+rules
+
+ ExpToCxx:
+ Int(i) -> CxxInt(i)
+
+ ExpToCxx:
+ Var(v) -> v
+
+ ExpToCxx:
+ Sum(e1, e2) -> CxxSum(<ExpToCxx> e1, <ExpToCxx> e2)
+
+ ExpToCxx:
+ Affect(Var(v), e) -> CxxAffect(v, <ExpToCxx> e)
+ where <debug> e
+
+ ExpToCxx:
+ Cxx(s) -> s
Index: trunk/src/scoolt/Tools.str
===================================================================
--- trunk/src/scoolt/Tools.str (revision 0)
+++ trunk/src/scoolt/Tools.str (revision 49)
@@ -0,0 +1,29 @@
+module Tools
+
+imports libstratego-lib Cxx AsFix Scool
+
+rules
+
+ SclNewIdf:
+ idf -> <conc-strings> (idf, "_")
+
+ CxxTypeToIdf:
+ CxxType(idf) -> idf
+ where <is-string> idf
+
+strategies
+
+ NewCount =
+ rules(count_:- _)
+
+ Count =
+ if count_ => res then
+ rules(count_:- _)
+ ; rules(count_: _ -> <sum> (res, 1))
+ else
+ rules(count_: _ -> 1)
+ end
+ ; count_
+
+ GetCount =
+ count_ <+ !0
Index: trunk/src/scoolt/Access.str
===================================================================
--- trunk/src/scoolt/Access.str (revision 0)
+++ trunk/src/scoolt/Access.str (revision 49)
@@ -0,0 +1,15 @@
+module Access
+
+imports libstratego-lib Cxx Type Exp Stm Tools AsFix Scool
+
+rules
+
+ AccessToCxx:
+ Accessblock(Public, l) -> CxxPublic(<map (DeclToCxx)> l)
+
+ AccessToCxx:
+ Accessblock(Private, l) -> CxxPrivate(<map (DeclToCxx)> l)
+
+ AccessToCxx:
+ Accessblock(Protected, l) -> CxxProtected(<map (DeclToCxx)> l)
+
Index: trunk/src/scoolt/Type.str
===================================================================
--- trunk/src/scoolt/Type.str (revision 0)
+++ trunk/src/scoolt/Type.str (revision 49)
@@ -0,0 +1,32 @@
+module Type
+
+imports libstratego-lib Cxx AsFix Scool
+
+rules
+
+ IsScalar:
+ t -> t
+ where
+ (
+ <eq> (t, "char")
+ <+ <eq> (t, "bool")
+ <+ <eq> (t, "short")
+ <+ <eq> (t, "int")
+ <+ <eq> (t, "float")
+ <+ <eq> (t, "double")
+ )
+
+ TypeToCxx:
+ Var(x) -> CxxType(x)
+
+ TypeToCxx:
+ RefType(t) -> CxxRefType(<TypeToCxx> t)
+
+ // Constify + Referencify a type
+ TypeToConstRefCxx:
+ Var(t) -> CxxConstType(CxxRefType(CxxType(t)))
+ where
+ (
+ <is-string> t
+ ; <not (IsScalar)> t
+ )
Index: trunk/src/scoolt/Makefile.am
===================================================================
--- trunk/src/scoolt/Makefile.am (revision 0)
+++ trunk/src/scoolt/Makefile.am (revision 49)
@@ -0,0 +1,21 @@
+# Makefile.am -*-Makefile-*-
+
+MODULES = scoolt
+
+include $(top_srcdir)/config/Makefile.xt
+-include $(MODULES:=.c.dep)
+
+SCFLAGS = --main $* --verbose 0 --asfix
+STRINCLUDES = -I $(top_builddir)/src/scl-syn \
+ -I $(top_builddir)/src/cxx-syn \
+ -I `dirname \`xtc get Stratego-Box.tbl\`` \
+ -I $(srcdir) \
+ -la stratego-lib
+
+libexec_PROGRAMS = scoolt
+
+nodist_scoolt_SOURCES = scoolt.c
+
+EXTRA_DIST = $(MODULES:=.str)
+
+CLEANFILES = $(MODULES:=.c) $(MODULES:=.c.dep)
Index: trunk/src/scoolt/Stm.str
===================================================================
--- trunk/src/scoolt/Stm.str (revision 0)
+++ trunk/src/scoolt/Stm.str (revision 49)
@@ -0,0 +1,21 @@
+module Stm
+
+imports libstratego-lib Cxx Type Exp AsFix Scool
+
+rules
+
+ StmToCxx:
+ ExpStm(e) -> CxxExpStm(<ExpToCxx> e)
+ where <debug> e
+
+ /* Handle the 'return' statement */
+ StmToCxx:
+ Return(e) -> CxxExpStm(CxxKeyword("return", <ExpToCxx> e))
+
+ StmToCxx:
+ VarDec([], idf, t, i) -> <DeclToCxx> VarDec([], idf, t, i)
+ where <debug> idf
+
+ StmToCxx:
+ x -> <DeclToCxx> x
+ where <debug> x
Index: trunk/src/scoolt/scoolt.str
===================================================================
--- trunk/src/scoolt/scoolt.str (revision 0)
+++ trunk/src/scoolt/scoolt.str (revision 49)
@@ -0,0 +1,184 @@
+module scoolt
+
+imports libstratego-lib Cxx Program AsFix Scool
+
+strategies
+
+ scoolt = io-wrap(ProgramToCxx)
+
+
+
+/*
+ t-Program:
+ Program(l) -> Cxx(<collect-vtypes> l, <map(t-Decl)> l)
+
+
+
+ t-Decl:
+ VarDec(i, t) -> CxxVarDec(<t-Type> t, i)
+ where not(<?Var("type")> t)
+
+ t-Decl:
+ VarDec(i, t, v) -> CxxVarDec(<t-Type> t, i, <t-Exp> v)
+ where not(<?Var("type")> t)
+
+ t-Decl:
+ ConsDec(_, i, t) -> CxxVarDec(CxxConsType(<t-Type> t), i)
+ where not(<?Var("type")> t)
+
+ t-Decl:
+ ConsDec(_, i, t, v) -> CxxVarDec(CxxConsType(<t-Type> t), i, <t-Exp> v)
+ where not(<?Var("type")> t)
+
+
+
+
+ t-Decl:
+ ConsDec(_, i, t) -> CxxEscape(<concat-strings> ["/", "/ virtual typedef /abstract/ ", i, ";"] )
+ where <?Var("type")> t
+
+ t-Decl: // FIXME : vvvvvv
+ ConsDec(_, i, t, Var(v)) -> CxxEscape(<concat-strings> ["/", "/ virtual typedef ", v, " ", i, ";"] )
+ where <?Var("type")> t
+
+
+
+ t-Decl:
+ ConsDec(qualifiers, name, Class, ClassVal(l)) -> [CxxClassDec([CxxTemplateArg("E")], newname, CxxPublic, CxxTemplateType(CxxScope("stc", "any"), "E"), <map(t-ABlock)> l), CxxTypedef(CxxTemplateType(newname, "itself"), name)] where <conc-strings> (name, "_") => newname
+
+ t-Decl:
+ ConsDec(qualifiers, name, Class(parent), ClassVal(l)) -> [CxxClassDec([CxxTemplateArg("E")], newname, CxxPublic, CxxTemplateType(<t-r-Type> parent, "E"), <map(t-ABlock)> l), CxxTypedef(CxxTemplateType(newname, "itself"), name)] where <conc-strings> (name, "_") => newname; <not(one(?"final"))> qualifiers
+
+ t-Decl:
+ ConsDec(qualifiers, name, Class(parent)) -> [CxxClassDec([CxxTemplateArg("E")], newname, CxxPublic, CxxTemplateType(<t-r-Type> parent, "E"), []), CxxTypedef(CxxTemplateType(newname, "itself"), name)] where <conc-strings> (name, "_") => newname; <not(one(?"final"))> qualifiers
+
+ t-Decl:
+ ConsDec(qualifiers, name, Class) -> [CxxClassDec([CxxTemplateArg("E")], newname, CxxPublic, CxxTemplateType(CxxScope("stc", "any"), "E"), []), CxxTypedef(CxxTemplateType(newname, "itself"), name)] where <conc-strings> (name, "_") => newname
+
+ t-Decl:
+ ConsDec(qualifiers, name, Class(parent), ClassVal(l)) -> [CxxClassDec([CxxTemplateArg("E")], newname, CxxPublic, CxxTemplateType(<t-r-Type> parent, "E"), <map(t-ABlock)> l), CxxTypedef(CxxTemplateType(newname, "itself"), name)] where <conc-strings> (name, "_") => newname
+
+
+
+ t-Decl:
+ ConsDec(qualifiers, name, Class(parent), ClassVal(l)) ->
+ [CxxClassDec (
+ newname,
+ CxxPublic,
+ CxxTemplateType(<t-r-Type> parent, newname),
+ <map(t-ABlock)> l
+ ),
+ CxxTypedef(newname, name)
+ ]
+ where <conc-strings> (name, "_") => newname; <one(?"final")> qualifiers
+
+ t-ABlock:
+ Accessblock(acc, decs) -> CxxAccessBlock(<t-ASpecifier> acc, <map(t-Decl)> decs)
+
+ t-ASpecifier:
+ Public -> CxxPublic
+
+ t-ASpecifier:
+ Private -> CxxPrivate
+
+ t-Decl:
+ FunDec(_, name, args, ret, body) -> CxxFunDec(<t-Type> ret, name, <map(t-Arg)> args, <map(t-Stm + t-Decl)> body)
+
+
+ t-Decl:
+ BiFunDec(qualifiers, name, s-args, args, rettype, body) ->
+ CxxOverloadingCase( name,
+ CxxInt(index),
+ <t-StaticCond>s-args,
+ <t-Type>rettype,
+ <map(t-Arg)>args,
+ <map(t-Stm + t-Decl)>body
+ )
+ where
+ <one(?"overloading")> qualifiers
+ ; if not(<index-over> name) then
+// say(!"first"); debug
+ !1 => index
+ ; rules(index-over: name -> 2)
+ else
+// say(!"not first"); debug
+ <index-over> name => index
+ ; rules(index-over: name -> <add>(index, 1))
+ end
+
+
+
+ t-Arg:
+ (name, type, guard) -> <t-Arg> (name, type)
+
+ t-Arg:
+ (name, type) -> (<t-Type> type, name)
+
+
+
+ t-Type:
+ Var(n) -> n
+
+ t-r-Type:
+ Var(n) -> <conc-strings> (n, "_")
+
+ t-Exp:
+ Int(n) -> CxxInt(n)
+
+ t-Exp:
+ Mul(e1, e2) -> CxxMul(<t-Exp> e1, <t-Exp> e2)
+
+ t-Exp:
+ Var(n) -> CxxVar(n)
+
+ t-Exp:
+ Cpp(cxx) -> CxxEscape(cxx)
+
+ t-Stm:
+ Return(e) -> CxxReturn(<t-Exp> e)
+
+ t-Decl:
+ Cpp(cxx) -> CxxEscape(cxx)
+
+ t-StaticCond:
+ [] -> CxxStaticTrue
+
+ t-StaticCond:
+ [h|[]] -> <t-StaticCond> h
+
+ t-StaticCond:
+ [h|t] -> CxxStaticAnd(<t-StaticCond> h, <t-StaticCond> t)
+ where not(<?[]>t)
+
+ t-StaticCond:
+ (idf, type, Guard(guard)) -> <t-StaticCond> guard
+
+ t-StaticCond:
+ (idf, type) -> CxxStaticTrue
+
+ t-StaticCond:
+ Eq(e1, e2) -> CxxStaticEq(<t-Type> e1, <t-Type> e2)
+
+ t-StaticCond:
+ Or(e1, e2) -> CxxStaticOr(<t-StaticCond> e1, <t-StaticCond> e2)
+
+ t-StaticCond:
+ Inf(e1, e2) -> CxxStaticIsA(<t-Type> e1, <t-Type> e2)
+
+ t-StaticCond:
+ Var("true") -> CxxStaticTrue
+
+ t-StaticCond:
+ Var("false") -> CxxStaticFalse
+
+
+
+ strategies
+
+ collect-vtypes =
+ collect(?ConsDec(attr, _, Var("type")); where (<one(?"decl")> attr) )
+ ; map(?ConsDec(_, <id>, _))
+ ; make-set
+
+
+*/
Index: trunk/src/scoolt/Decl.str
===================================================================
--- trunk/src/scoolt/Decl.str (revision 0)
+++ trunk/src/scoolt/Decl.str (revision 49)
@@ -0,0 +1,229 @@
+module Decl
+
+imports libstratego-lib Cxx Type Exp Stm Tools AsFix Scool Access
+
+rules
+
+ /*
+ * Variable declaration.
+ * Grammar: "var" idf ":" t ";"
+ */
+ DeclToCxx:
+ VarDec([], idf, t) -> CxxDecl(<TypeToCxx> t, idf)
+
+ /*
+ * Array declaration.
+ * Grammar: "var" idf ":" "array" "[" t "," n "]" ";"
+ */
+ DeclToCxx:
+ VarDec([], idf, StaticFunCall(st, [t, n])) ->
+ <if <eq> ("array", st) then
+ ! CxxArrayDecl(<TypeToCxx> t, idf, <ExpToCxx> n)
+ else
+ say(<concat-strings> ["Unkown construction: ", st])
+ ; <exit> 1
+ end>
+
+ /*
+ * Buffer declaration.
+ * Grammar: "var" idf ":" "buffer" "[" t "]" ";"
+ */
+ DeclToCxx:
+ VarDec([], idf, StaticFunCall(st, [t])) ->
+ <if <eq> ("buffer", st) then
+ ! CxxDecl(CxxType(CxxScope("std", "vector"), [<TypeToCxx> t]), idf)
+ else
+ say(<concat-strings> ["Unkown construction: ", st])
+ ; <exit> 1
+ end>
+
+ /*
+ * Variable declaration with initialisation.
+ * Grammar: "var" idf ":" t ":=" v ";"
+ */
+ DeclToCxx:
+ VarDec([], idf, t, v) -> CxxDecl(<TypeToCxx> t, idf, <ExpToCxx> v)
+
+ UnVar:
+ Var(x) -> x
+
+ /*
+ * Constant declaration.
+ * Grammar: idf ":" t ";"
+ */
+ DeclToCxx:
+ ConstDec([], idf, cs, t) ->
+ <if <eq> ("type", <UnVar> t) then
+ ! CxxDecl(<TypeToCxx> t, idf)
+ else
+ ! CxxDecl(CxxConstType(<TypeToCxx> t), idf)
+ end>
+ where not(<?Class> t)
+
+ /*
+ * Constant declaration with initialisation.
+ * Grammar: idf ":" t "=" v ";"
+ */
+ DeclToCxx:
+ ConstDec([], idf, t, v) -> CxxDecl(CxxConstType(<TypeToCxx> t), idf, <ExpToCxx> v)
+ where not(<?Class> t)
+
+ DeclToCxx:
+ ConstDec(["decl"], idf, cs, FunType(args, ret)) -> CxxFun([], <TypeToCxx> ret, idf, <map (ArgDefToCxx)> args)
+
+ /*
+ * Root Class predeclaration
+ * Grammar: idf ":" "class" ";"
+ */
+ DeclToCxx:
+ ConstDec([], idf, cs, Class) ->
+ CxxClassDecl(
+ [(Typename, "T")],
+ nidf,
+ []
+ )
+ where <conc-strings> (idf, "_") => nidf
+
+ /*
+ * Root Class declaration
+ * Grammar: specs idf ":" "class" "=" "{" v "}" ";"
+ */
+ DeclToCxx:
+ ConstDec(specs, idf, Class, ClassVal(v)) ->
+ <try(AddTypedef(|specs, idf)); AddClassComment(|idf)>
+ [
+ CxxClassDecl(
+ [(Typename, "T")],
+ nidf,
+ [
+ (
+ "public",
+ CxxType(CxxScope("stc", "any"), [CxxFunCall("stc_find_exact", [CxxType(nidf), CxxType("T")])])
+ )
+ ],
+ <map (AccessToCxx)> v
+ //[]
+ )
+ ]
+ where <SclNewIdf>idf => nidf
+ ; rules(CxxTypeToStc(|T): CxxType(idf) -> CxxType(<SclNewIdf>idf, [T]))
+
+ /*
+ * Final Class declaration
+ * Grammar: final idf ":" "class" "=" "{" v "}" ";"
+ */
+ DeclToCxx:
+ ConstDec(specs, idf, Class(p), v) ->
+ <try(AddTypedef(|specs, idf)); AddClassComment(|idf)>
+ [
+ CxxClassDecl(
+ params,
+ nidf,
+ [
+ (
+ "public",
+ parent
+ )
+ ],
+ [] // fixme
+ )
+ ]
+ where <TypeToCxx> p => cxxp
+ ; if
+ (
+ <one(?"final")> specs
+ ; !idf => nidf
+ ; <CxxTypeToStc(|CxxType(idf))>cxxp => parent
+ )
+ <+ (
+ <SclNewIdf>idf => nidf
+ ; <CxxTypeToStc(|CxxFunCall("stc_find_exact", [CxxType(nidf), CxxType("T")]))>cxxp => parent
+ )
+ then
+ if <one(?"final")> specs then
+ rules(CxxTypeToStcError: CxxType(idf) -> <concat-strings> [idf, " is final."])
+ ; ![] => params
+ else
+ rules(CxxTypeToStc(|T): CxxType(idf) -> CxxType(<SclNewIdf> idf, [T]))
+ ; ![(Typename, "T")] => params
+ end
+ else
+ say(!<concat-strings> [idf, " cannot inherit from ", <CxxTypeToIdf> cxxp])
+ ; if <CxxTypeToStcError> cxxp => error then
+ say(!error)
+ else
+ say(!<concat-strings> [<CxxTypeToIdf>cxxp, " does not exist."])
+ end
+ end
+
+ /*
+ * Handle class declarations with inheritance
+ * Grammar: idf ":" "class" "<" parent ";"
+ */
+ DeclToCxx:
+ ConstDec([], idf, cs, Class(parent)) -> CxxClassDecl([], idf, [("public", <TypeToCxx> parent)])
+ where <conc-strings> (idf, "_") => nidf
+
+ /*
+ * Handle functions
+ * Grammar: idf ":" "(" args ")" "->" t "=" "{" body "}"
+ * TODO: Handle templates
+ */
+ DeclToCxx:
+ FunDec([], idf, args, t, body) -> CxxFun([], <TypeToCxx> t, idf, <map(ArgDefToCxx)> args, <map(StmToCxx)> body)
+ //where <debug> body
+ //FunDec([], idf, args, t, body) -> <AddParameters(|<GetCount> 0)> CxxFun([], <TypeToCxx> t, idf, nargs, <map(StmToCxx)>body)
+ //where <NewCount; map(ArgDefToCxx)>args => nargs
+ /*
+ * Handle functions
+ * Grammar: idf ":" "(" args ")" "->" t "=>" Exp
+ * TODO: Handle templates
+ */
+ DeclToCxx:
+ FunDec([], idf, args, t, ExpStm(body)) -> CxxFun([], <TypeToCxx> t, idf, <map(ArgDefToCxx)> args, [<StmToCxx> Return(body)])
+ //where <debug> body
+
+ DeclToCxx:
+ StaticFunDec(l, idf, params, Class(), body) -> CxxClassDecl(<map (ParamToCxx)> params, idf, [], <map (AccessToCxx)> body)
+
+ DeclToCxx:
+ BiFunDec(l, idf, params, args, t, body) -> CxxFun(<map (ParamToCxx)> params, <TypeToCxx> t, idf, <map (ArgDefToCxx)> args, <map (StmToCxx)> body)
+
+ DeclToCxx:
+ BiFunDec(l, idf, params, args, t, ExpStm(body)) -> CxxFun(<map (ParamToCxx)> params, <TypeToCxx> t, idf, <map (ArgDefToCxx)> args, [<StmToCxx> Return(body)])
+
+ ParamToCxx:
+ (idf, Var(t), wclause) ->
+ <if <eq> (t, "type") then
+ ! (CxxType("class"), idf)
+ else
+ ! (CxxType(t), idf)
+ end>
+
+ ArgDefToCxx:
+ (idf, t) -> (<TypeToConstRefCxx <+ TypeToCxx> t, idf)
+ //(idf, t) -> (<TypeToCxx; try(CxxTypeToStc(|CxxType(p-idf)))> t, idf)
+ //where <concat-strings; SclNewIdf> ["T", <Count; int-to-string> 0] => p-idf
+
+ ArgDefToCxx:
+ FunArg(idf, t) -> <ArgDefToCxx> (idf, t)
+
+ AddTypedef(|specs, idf):
+ [x] -> [x, CxxTypedef(CxxType(<SclNewIdf>idf, [CxxType(CxxScope("stc", "itself"))]), idf)]
+ where <not(one(?"abstract"))> specs
+
+ AddClassComment(|idf):
+ l -> [CxxComment(<concat-strings> ["Class ", idf])|l]
+
+ AddParameters(|n):
+ CxxFun(p, t, idf, args, body) -> CxxFun(<Parameters(|n)> p, t, idf, args, body)
+ //where <debug> n
+
+ Parameters(|n):
+ l -> <Parameters(|<subt>(n, 1))>[(Typename, idf)|l]
+ where <not(?0)> n
+ ; <concat-strings; SclNewIdf> ["T", <int-to-string> n] => idf
+
+ Parameters(|n):
+ l -> l
+ where <?0> n
Index: trunk/src/scoolt/Program.str
===================================================================
--- trunk/src/scoolt/Program.str (revision 0)
+++ trunk/src/scoolt/Program.str (revision 49)
@@ -0,0 +1,8 @@
+module Program
+
+imports libstratego-lib Cxx Decl AsFix Scool
+
+rules
+
+ ProgramToCxx:
+ Program(l) -> CxxProgram(<map(DeclToCxx)> l)
Index: trunk/src/parse-scool/parse-scool
===================================================================
--- trunk/src/parse-scool/parse-scool (revision 0)
+++ trunk/src/parse-scool/parse-scool (revision 49)
@@ -0,0 +1 @@
+sglri -p `dirname $0`/../scl-syn/Scool.tbl -i $1
Property changes on: trunk/src/parse-scool/parse-scool
___________________________________________________________________
Name: svn:executable
+ *
Index: trunk/src/scl-syn/Decl.sdf
===================================================================
--- trunk/src/scl-syn/Decl.sdf (revision 48)
+++ trunk/src/scl-syn/Decl.sdf (revision 49)
@@ -18,9 +18,11 @@
Qualifier* Id ":" Type "=" Exp ";" -> Decl
{cons("ConstDec")}
- Qualifier* Id ":" Type ";" -> Decl
+
+ Qualifier* Id ":" Constifier? Type ";" -> Decl
{cons("ConstDec")}
+ Qualifier* Id ":" "(" {(Id ":" Type) ","}* ")" "->" Type "=>" Stm -> Decl { cons("FunDec") }
Qualifier* Id ":" "(" {(Id ":" Type) ","}* ")" "->" Type
"=" "{" Stm* "}" -> Decl
@@ -33,3 +35,7 @@
Qualifier* Id ":" "[" {(Id ":" Type ("where" Exp)?) ","}* "]" "(" {(Id ":" Type) ","}* ")" "->" Type
"=" "{" Stm* "}" -> Decl
{cons("BiFunDec")}
+
+ Qualifier* Id ":" "[" {(Id ":" Type ("where" Exp)?) ","}* "]" "(" {(Id ":" Type) ","}* ")" "->" Type
+ "=>" Stm -> Decl
+ {cons("BiFunDec")}
Index: trunk/src/scl-syn/Makefile.am
===================================================================
--- trunk/src/scl-syn/Makefile.am (revision 0)
+++ trunk/src/scl-syn/Makefile.am (revision 49)
@@ -0,0 +1,19 @@
+# Makefile.am -*-Makefile-*-
+
+MODULES = Scool
+SDFS = Class Decl Exp ExpOrType Lexical Scool Stm Type
+
+include $(top_srcdir)/config/Makefile.xt
+-include $(MODULES:=.dep)
+
+PGEN_FLAGS = -m $*
+SDF2RTG_FLAGS = -m $*
+SCFLAGS = -m $* --verbose 0
+
+pkgdata_DATA = $(MODULES:=.def) \
+ $(MODULES:=.tbl) \
+ $(MODULES:=.str) \
+ $(MODULES:=.rtree)
+
+EXTRA_DIST = $(SDFS:=.sdf) $(MODULES:=.sdf)
+CLEANFILES = $(pkgdata_DATA) $(MODULES:=.dep)
Index: trunk/src/scl-syn/Lexical.sdf
===================================================================
--- trunk/src/scl-syn/Lexical.sdf (revision 48)
+++ trunk/src/scl-syn/Lexical.sdf (revision 49)
@@ -1,7 +1,7 @@
module Lexical
exports
- sorts Id Int String Asterisk Slash BlockComment CommentPart Cxx RawCxx Qualifier
+ sorts Id Int String Asterisk Slash BlockComment CommentPart Cxx RawCxx Qualifier Constifier
context-free syntax
@@ -30,6 +30,9 @@
"final" -> Qualifier
"overloading" -> Qualifier
"decl" -> Qualifier
+ "abstract" -> Qualifier
+
+ "const" -> Constifier
lexical restrictions
Id -/- [A-Za-z]
@@ -38,4 +41,4 @@
context-free restrictions
LAYOUT? -/- [\ \t\n]
-
+ LAYOUT? -/- [\/].[\/]
Index: trunk/src/scl-syn/Type.sdf
===================================================================
--- trunk/src/scl-syn/Type.sdf (revision 48)
+++ trunk/src/scl-syn/Type.sdf (revision 49)
@@ -10,6 +10,8 @@
context-free syntax
ExpOrType -> Type
+ Id ":" Type -> Type {non-assoc,cons("FunArg")}
+ "ref" Type -> Type {non-assoc,cons("RefType")}
"(" {Type ","}* ")" "->" Type -> Type {cons("FunType")}
"[" {Type ","}* "]" "->" Type -> Type {cons("StaticFunType")}
"[" {Type ","}* "]"
Index: trunk/src/Makefile.am
===================================================================
--- trunk/src/Makefile.am (revision 0)
+++ trunk/src/Makefile.am (revision 49)
@@ -0,0 +1,7 @@
+# Makefile.am -*-Makefile-*-
+
+include $(top_srcdir)/config/Makefile.xt
+
+SUBDIRS = cxx-syn scl-syn pp-cxx scoolt
+
+BOOTCLEAN_SUBDIRS = $(SUBDIRS)
Index: trunk/src/cxx-syn/CxxType.sdf
===================================================================
--- trunk/src/cxx-syn/CxxType.sdf (revision 0)
+++ trunk/src/cxx-syn/CxxType.sdf (revision 49)
@@ -0,0 +1,14 @@
+module CxxType
+
+imports
+ Lexical
+
+exports
+ sorts CxxType
+ context-free syntax
+
+ CxxId -> CxxType {cons("CxxType")}
+ CxxId "<" {CxxType ","}* ">" -> CxxType {cons("CxxType")}
+ "const" CxxType -> CxxType {cons("CxxConstType")}
+ CxxType "&" -> CxxType {cons("CxxRefType")}
+
Index: trunk/src/cxx-syn/CxxStm.sdf
===================================================================
--- trunk/src/cxx-syn/CxxStm.sdf (revision 0)
+++ trunk/src/cxx-syn/CxxStm.sdf (revision 49)
@@ -0,0 +1,11 @@
+module CxxStm
+
+imports
+ CxxType CxxExp CxxDecl
+
+exports
+ sorts CxxStm
+ context-free syntax
+
+ CxxDecl -> CxxStm
+ CxxExp -> CxxStm {cons("CxxExpStm")}
Index: trunk/src/cxx-syn/CxxDecl.sdf
===================================================================
--- trunk/src/cxx-syn/CxxDecl.sdf (revision 0)
+++ trunk/src/cxx-syn/CxxDecl.sdf (revision 49)
@@ -0,0 +1,34 @@
+module CxxDecl
+
+imports
+ CxxType CxxExp Lexical
+
+exports
+ sorts CxxDecl CxxTopLevel
+ context-free syntax
+
+ CxxType CxxId ";" -> CxxDecl {cons("CxxDecl")}
+ CxxType CxxId ("[" CxxExp "]")? ";" -> CxxDecl {cons("CxxArrayDecl")}
+
+ CxxType CxxId "=" CxxExp ";" -> CxxDecl {cons("CxxDecl")}
+
+ "typedef" CxxType CxxId ";" -> CxxDecl {cons("CxxTypedef")}
+
+ "template" "<" {(CxxType CxxId) ","}* ">"
+ "class" CxxId ":" {(CxxAccessModifier CxxId) ","}* ";"
+ -> CxxDecl {cons("CxxClassDecl")}
+
+ "template" "<" {(CxxType CxxId) ","}* ">"
+ "class" CxxId ":" {(CxxAccessModifier CxxId) ","}*
+ "{"
+ CxxDecl*
+ "}" ";"
+ -> CxxDecl {cons("CxxClassDecl")}
+
+ "typename" -> CxxType {cons("Typename")}
+
+ "//" CxxText -> CxxTopLevel {cons("CxxComment")}
+
+ "public" ":" CxxTopLevel* -> CxxTopLevel {cons("CxxPublic")}
+ "protected" ":" CxxTopLevel* -> CxxTopLevel {cons("CxxProtected")}
+ "private" ":" CxxTopLevel* -> CxxTopLevel {cons("CxxPrivate")}
Index: trunk/src/cxx-syn/CxxFun.sdf
===================================================================
--- trunk/src/cxx-syn/CxxFun.sdf (revision 0)
+++ trunk/src/cxx-syn/CxxFun.sdf (revision 49)
@@ -0,0 +1,24 @@
+module CxxFun
+
+imports
+ CxxType CxxExp Lexical CxxStm
+
+exports
+ sorts CxxTopLevel
+ context-free syntax
+
+ "template" "<" {(CxxType CxxId) ","}* ">"
+ CxxType CxxId "(" {(CxxType CxxId) ","}* ")"
+ "{"
+ CxxStm*
+ "}"
+ -> CxxTopLevel {cons("CxxFun")}
+
+ "template" "<" {(CxxType CxxId) ","}* ">"
+ CxxType CxxId "(" {(CxxType CxxId) ","}* ")" ";" -> CxxTopLevel {cons("CxxFun")}
+
+ CxxId ("<" {CxxType ","}* ">")? "(" {(CxxType CxxId) ","}* ")" ";" -> CxxTopLevel {cons("CxxFunCall")}
+
+ CxxDecl -> CxxTopLevel
+
+ CxxTopLevel* -> CxxTopLevel
Index: trunk/src/cxx-syn/CxxScope.sdf
===================================================================
Index: trunk/src/cxx-syn/Makefile.am
===================================================================
--- trunk/src/cxx-syn/Makefile.am (revision 0)
+++ trunk/src/cxx-syn/Makefile.am (revision 49)
@@ -0,0 +1,19 @@
+# Makefile.am -*-Makefile-*-
+
+MODULES = Cxx
+SDFS = Cxx CxxDecl CxxExp CxxFun CxxScope CxxStm CxxType Lexical
+
+include $(top_srcdir)/config/Makefile.xt
+-include $(MODULES:=.dep)
+
+PGEN_FLAGS = -m $*
+SDF2RTG_FLAGS = -m $*
+SCFLAGS = -m $* --verbose 0
+
+pkgdata_DATA = $(MODULES:=.def) \
+ $(MODULES:=.tbl) \
+ $(MODULES:=.str) \
+ $(MODULES:=.rtree)
+
+EXTRA_DIST = $(SDFS:=.sdf) $(MODULES:=.sdf)
+CLEANFILES = $(pkgdata_DATA) $(MODULES:=.dep)
Index: trunk/src/cxx-syn/CxxExp.sdf
===================================================================
--- trunk/src/cxx-syn/CxxExp.sdf (revision 0)
+++ trunk/src/cxx-syn/CxxExp.sdf (revision 49)
@@ -0,0 +1,15 @@
+module CxxExp
+
+imports
+ Lexical
+
+exports
+ sorts CxxExp
+ context-free syntax
+
+ CxxInt -> CxxExp {cons("CxxInt")}
+ CxxId "(" {CxxExp ","}* ")" -> CxxExp {cons("CxxFunCall")}
+
+ CxxId CxxExp ";" -> CxxExp {cons("CxxKeyword")}
+ CxxId "=" CxxExp ";" -> CxxExp {cons("CxxAffect")}
+ CxxExp "+" CxxExp -> CxxExp {cons("CxxSum")}
Index: trunk/src/cxx-syn/Lexical.sdf
===================================================================
--- trunk/src/cxx-syn/Lexical.sdf (revision 0)
+++ trunk/src/cxx-syn/Lexical.sdf (revision 49)
@@ -0,0 +1,15 @@
+module Lexical
+
+exports
+ sorts CxxId CxxInt CxxAccessModifier CxxText
+ lexical syntax
+
+ ~[]* -> CxxText
+ [a-zA-Z0-9]+ -> CxxId
+ [0-9]+ -> CxxInt
+ "private" -> CxxAccessModifier
+ "public" -> CxxAccessModifier
+ "protected" -> CxxAccessModifier
+
+ context-free syntax
+ CxxId "::" CxxId -> CxxId {cons("CxxScope")}
Index: trunk/src/cxx-syn/Cxx.sdf
===================================================================
--- trunk/src/cxx-syn/Cxx.sdf (revision 0)
+++ trunk/src/cxx-syn/Cxx.sdf (revision 49)
@@ -0,0 +1,12 @@
+module Cxx
+
+imports
+ CxxDecl CxxFun
+
+exports
+ sorts CxxProgram CxxTopLevel
+ context-free start-symbols CxxProgram
+ context-free syntax
+
+ CxxTopLevel -> CxxProgram {cons("CxxProgram")}
+
Index: trunk/src/Makefile
===================================================================
--- trunk/src/Makefile (revision 48)
+++ trunk/src/Makefile (revision 49)
@@ -1,62 +1,775 @@
-SCLSDF = $(wildcard scl-syn/*.sdf)
-CXXSDF = $(wildcard cxx-syn/*.sdf)
-ALL = \
-scl-syn/Scool.def scl-syn/Scool.tbl scl-syn/Scool.str scl-syn/Scool.rtg \
-#cxx-syn/Cxx.def cxx-syn/Cxx.tbl cxx-syn/Cxx.rtg cxx-syn/Cxx.str \
-#scoolt/scoolt \
-#pp-cxx/pp-cxx \
+# Makefile.in generated by automake 1.10 from Makefile.am.
+# src/Makefile. Generated from Makefile.in by configure.
-STRC = strc -la stratego-lib
-
-all: $(ALL)
-
-
-
-
-
-
-scl-syn/Scool.def: $(SCLSDF)
- pack-sdf -i scl-syn/Scool.sdf -o $@
-
-scl-syn/Scool.tbl: scl-syn/Scool.def
- sdf2table -i $< -o $@ -m Scool
-
-scl-syn/Scool.rtg: scl-syn/Scool.def
- sdf2rtg -i $< -m Scool -o $@
-
-scl-syn/Scool.str: scl-syn/Scool.rtg
- rtg2sig --module Scool -i $< -o $@
-
-
-
-
-
-cxx-syn/Cxx.def: $(CXXSDF)
- pack-sdf -i cxx-syn/Cxx.sdf -o $@
-
-cxx-syn/Cxx.tbl: cxx-syn/Cxx.def
- sdf2table -i $< -o $@ -m Cxx
-
-cxx-syn/Cxx.rtg: cxx-syn/Cxx.def
- sdf2rtg -i $< -m Cxx -o $@
-
-cxx-syn/Cxx.str: cxx-syn/Cxx.rtg
- rtg2sig --module Cxx -i $< -o $@
-
-
-
-
-scoolt/scoolt: scoolt/scoolt.str
- $(STRC) -i $< -I scl-syn -I cxx-syn
-
-
-
-
-pp-cxx/pp-cxx: pp-cxx/pp-cxx.str
- $(STRC) -I ~/.nix-profile/share/sdf/gpp -I cxx-syn -i $<
-
-
-
-
-clean:
- rm -rf $(ALL)
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005, 2006 Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+
+
+# Makefile.am -*-Makefile-*-
+
+###########################################################
+# File: Makefile.xt
+#
+# autoxt
+#
+# Description
+#
+# This Makefile provides support for compiling Stratego
+# programs and use of some other XT tools.
+#
+###########################################################
+#
+# Variables
+#
+
+pkgdatadir = $(datadir)/scool
+pkglibdir = $(libdir)/scool
+pkgincludedir = $(includedir)/scool
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = x86_64-unknown-linux-gnu
+host_triplet = x86_64-unknown-linux-gnu
+DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \
+ $(top_srcdir)/config/Makefile.xt
+am__append_1 = -DDEFAULT_XTC_REPOSITORY="\"$(REPOSITORY)\""
+subdir = src
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/config/autoxt.m4 \
+ $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+ $(ACLOCAL_M4)
+mkinstalldirs = $(install_sh) -d
+CONFIG_CLEAN_FILES =
+SOURCES =
+DIST_SOURCES =
+RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \
+ html-recursive info-recursive install-data-recursive \
+ install-dvi-recursive install-exec-recursive \
+ install-html-recursive install-info-recursive \
+ install-pdf-recursive install-ps-recursive install-recursive \
+ installcheck-recursive installdirs-recursive pdf-recursive \
+ ps-recursive uninstall-recursive
+RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \
+ distclean-recursive maintainer-clean-recursive
+ETAGS = etags
+CTAGS = ctags
+DIST_SUBDIRS = $(SUBDIRS)
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = ${SHELL} /home/yabo/dev/lrde/scool/trunk/config/missing --run aclocal-1.10
+AMTAR = ${SHELL} /home/yabo/dev/lrde/scool/trunk/config/missing --run tar
+AR = ar
+ASFIX_TOOLS = $(STRATEGOXT)
+ASF_LIBRARY = $(SDF)
+ATERM = /nix/store/0nsws8s9blgv5sq3n1sxr0wsfd1dbgys-aterm-2.5pre20939
+ATERM_CFLAGS = -I/nix/store/0nsws8s9blgv5sq3n1sxr0wsfd1dbgys-aterm-2.5pre20939/include
+ATERM_FRONT = $(STRATEGOXT)
+ATERM_LIBS = -L/nix/store/0nsws8s9blgv5sq3n1sxr0wsfd1dbgys-aterm-2.5pre20939/lib -lATerm
+ATERM_STRCFLAGS =
+ATERM_XTC =
+AUTOCONF = ${SHELL} /home/yabo/dev/lrde/scool/trunk/config/missing --run autoconf
+AUTOHEADER = ${SHELL} /home/yabo/dev/lrde/scool/trunk/config/missing --run autoheader
+AUTOMAKE = ${SHELL} /home/yabo/dev/lrde/scool/trunk/config/missing --run automake-1.10
+AWK = gawk
+BUILD_REPOSITORY = /home/yabo/dev/lrde/scool/trunk/BUILDTIME_XTC
+CC = /usr/bin/gcc32
+CCDEPMODE = depmode=gcc3
+CFLAGS = -g -O2
+CONCRETE_SYNTAX = $(STRATEGOXT)
+CPP = /usr/bin/gcc32 -E
+CPPFLAGS =
+CXX = g++
+CXXCPP = g++ -E
+CXXDEPMODE = depmode=gcc3
+CXXFLAGS = -g -O2
+CYGPATH_W = echo
+C_TOOLS = /nix/store/fd1p042l65aaa440a4v5jl4rxjsxqx2b-strategoxt-0.17M3pre16697
+C_TOOLS_CFLAGS = -I/nix/store/fd1p042l65aaa440a4v5jl4rxjsxqx2b-strategoxt-0.17M3pre16697/include -I/nix/store/0nsws8s9blgv5sq3n1sxr0wsfd1dbgys-aterm-2.5pre20939/include
+C_TOOLS_LIBS = -L/nix/store/fd1p042l65aaa440a4v5jl4rxjsxqx2b-strategoxt-0.17M3pre16697/lib -L/nix/store/0nsws8s9blgv5sq3n1sxr0wsfd1dbgys-aterm-2.5pre20939/lib -lstratego-lib -lstratego-lib-native -lstratego-runtime -lm -lATerm
+C_TOOLS_STRCFLAGS = -I /nix/store/fd1p042l65aaa440a4v5jl4rxjsxqx2b-strategoxt-0.17M3pre16697/share/c-tools -I /nix/store/fd1p042l65aaa440a4v5jl4rxjsxqx2b-strategoxt-0.17M3pre16697/share/sdf/c-tools
+C_TOOLS_XTC =
+DEFS = -DPACKAGE_NAME=\"scool\" -DPACKAGE_TARNAME=\"scool\" -DPACKAGE_VERSION=\"0.1\" -DPACKAGE_STRING=\"scool\ 0.1\" -DPACKAGE_BUGREPORT=\"yabo(a)lrde.epita.fr\" -DPACKAGE=\"scool\" -DVERSION=\"0.1\" -DSTDC_HEADERS=1 -DHAVE_SYS_TYPES_H=1 -DHAVE_SYS_STAT_H=1 -DHAVE_STDLIB_H=1 -DHAVE_STRING_H=1 -DHAVE_MEMORY_H=1 -DHAVE_STRINGS_H=1 -DHAVE_INTTYPES_H=1 -DHAVE_STDINT_H=1 -DHAVE_UNISTD_H=1 -DHAVE_DLFCN_H=1
+DEPDIR = .deps
+ECHO = echo
+ECHO_C =
+ECHO_N = -n
+ECHO_T =
+EGREP = /bin/grep -E
+EXEEXT =
+F77 = gfortran
+FFLAGS = -g -O2
+GPP = $(STRATEGOXT)
+GREP = /bin/grep
+INSTALL = /usr/bin/install -c
+INSTALL_DATA = ${INSTALL} -m 644
+INSTALL_PROGRAM = ${INSTALL}
+INSTALL_SCRIPT = ${INSTALL}
+INSTALL_STRIP_PROGRAM = $(install_sh) -c -s
+LDFLAGS =
+LIBOBJS =
+LIBS =
+LIBTOOL = $(SHELL) $(top_builddir)/libtool
+LN_S = ln -s
+LTLIBOBJS =
+MAKEINFO = ${SHELL} /home/yabo/dev/lrde/scool/trunk/config/missing --run makeinfo
+MKDIR_P = /bin/mkdir -p
+OBJEXT = o
+PACKAGE = scool
+PACKAGE_BUGREPORT = yabo(a)lrde.epita.fr
+PACKAGE_NAME = scool
+PACKAGE_STRING = scool 0.1
+PACKAGE_TARNAME = scool
+PACKAGE_VERSION = 0.1
+PATH_SEPARATOR = :
+PGEN = $(SDF)
+PKG_CONFIG = /usr/bin/pkg-config
+PT_SUPPORT = $(SDF)
+RANLIB = ranlib
+REPOSITORY = ${datarootdir}/scool/XTC
+SCOMPILE = $(STRC)/bin/strc
+SDF = /nix/store/94msp5hiqhb82dh9k0jhzgdr9ld9n9r3-sdf2-bundle-2.4pre206999
+SDF_CFLAGS = -I/nix/store/0nsws8s9blgv5sq3n1sxr0wsfd1dbgys-aterm-2.5pre20939/include
+SDF_FRONT = $(STRATEGOXT)
+SDF_LIBRARY = $(SDF)
+SDF_LIBS = -L/nix/store/0nsws8s9blgv5sq3n1sxr0wsfd1dbgys-aterm-2.5pre20939/lib -lATerm
+SDF_STRCFLAGS =
+SDF_TOOLS = $(STRATEGOXT)
+SDF_XTC =
+SED = /bin/sed
+SET_MAKE =
+SGLR = $(SDF)
+SHELL = /bin/sh
+SRTS = $(STRATEGO_RUNTIME)
+STRATEGOXT = /nix/store/fd1p042l65aaa440a4v5jl4rxjsxqx2b-strategoxt-0.17M3pre16697
+STRATEGOXT_CFLAGS =
+STRATEGOXT_LIBS =
+STRATEGOXT_STRCFLAGS =
+STRATEGOXT_XTC = /nix/store/fd1p042l65aaa440a4v5jl4rxjsxqx2b-strategoxt-0.17M3pre16697/share/strategoxt/XTC
+STRATEGO_ATERM = /nix/store/fd1p042l65aaa440a4v5jl4rxjsxqx2b-strategoxt-0.17M3pre16697
+STRATEGO_ATERM_CFLAGS = -I/nix/store/0nsws8s9blgv5sq3n1sxr0wsfd1dbgys-aterm-2.5pre20939/include -I/nix/store/fd1p042l65aaa440a4v5jl4rxjsxqx2b-strategoxt-0.17M3pre16697/include
+STRATEGO_ATERM_LIBS = -L/nix/store/fd1p042l65aaa440a4v5jl4rxjsxqx2b-strategoxt-0.17M3pre16697/lib -L/nix/store/0nsws8s9blgv5sq3n1sxr0wsfd1dbgys-aterm-2.5pre20939/lib -lstratego-aterm -lstratego-gpp -lstratego-sglr -lstratego-lib -lstratego-lib-native -lstratego-runtime -lm -lATerm
+STRATEGO_ATERM_STRCFLAGS = -I /nix/store/fd1p042l65aaa440a4v5jl4rxjsxqx2b-strategoxt-0.17M3pre16697/share
+STRATEGO_ATERM_XTC =
+STRATEGO_FRONT = $(STRATEGOXT)
+STRATEGO_GPP = /nix/store/fd1p042l65aaa440a4v5jl4rxjsxqx2b-strategoxt-0.17M3pre16697
+STRATEGO_GPP_CFLAGS = -I/nix/store/0nsws8s9blgv5sq3n1sxr0wsfd1dbgys-aterm-2.5pre20939/include -I/nix/store/fd1p042l65aaa440a4v5jl4rxjsxqx2b-strategoxt-0.17M3pre16697/include
+STRATEGO_GPP_LIBS = -L/nix/store/fd1p042l65aaa440a4v5jl4rxjsxqx2b-strategoxt-0.17M3pre16697/lib -L/nix/store/0nsws8s9blgv5sq3n1sxr0wsfd1dbgys-aterm-2.5pre20939/lib -lstratego-gpp -lstratego-sglr -lstratego-lib -lstratego-lib-native -lstratego-runtime -lm -lATerm
+STRATEGO_GPP_STRCFLAGS = -I /nix/store/fd1p042l65aaa440a4v5jl4rxjsxqx2b-strategoxt-0.17M3pre16697/share
+STRATEGO_GPP_XTC =
+STRATEGO_LIB = /nix/store/fd1p042l65aaa440a4v5jl4rxjsxqx2b-strategoxt-0.17M3pre16697
+STRATEGO_LIBRARIES =
+STRATEGO_LIB_CFLAGS = -I/nix/store/fd1p042l65aaa440a4v5jl4rxjsxqx2b-strategoxt-0.17M3pre16697/include -I/nix/store/0nsws8s9blgv5sq3n1sxr0wsfd1dbgys-aterm-2.5pre20939/include
+STRATEGO_LIB_LIBS = -L/nix/store/fd1p042l65aaa440a4v5jl4rxjsxqx2b-strategoxt-0.17M3pre16697/lib -L/nix/store/0nsws8s9blgv5sq3n1sxr0wsfd1dbgys-aterm-2.5pre20939/lib -lstratego-lib -lstratego-lib-native -lstratego-runtime -lm -lATerm
+STRATEGO_LIB_STRCFLAGS = -I /nix/store/fd1p042l65aaa440a4v5jl4rxjsxqx2b-strategoxt-0.17M3pre16697/share/stratego-libraries -I /nix/store/fd1p042l65aaa440a4v5jl4rxjsxqx2b-strategoxt-0.17M3pre16697/share
+STRATEGO_LIB_XTC =
+STRATEGO_REGULAR = $(STRATEGOXT)
+STRATEGO_RTG = /nix/store/fd1p042l65aaa440a4v5jl4rxjsxqx2b-strategoxt-0.17M3pre16697
+STRATEGO_RTG_CFLAGS = -I/nix/store/0nsws8s9blgv5sq3n1sxr0wsfd1dbgys-aterm-2.5pre20939/include -I/nix/store/fd1p042l65aaa440a4v5jl4rxjsxqx2b-strategoxt-0.17M3pre16697/include
+STRATEGO_RTG_LIBS = -L/nix/store/fd1p042l65aaa440a4v5jl4rxjsxqx2b-strategoxt-0.17M3pre16697/lib -L/nix/store/0nsws8s9blgv5sq3n1sxr0wsfd1dbgys-aterm-2.5pre20939/lib -lstratego-rtg -lstratego-sglr -lstratego-lib -lstratego-lib-native -lstratego-runtime -lm -lATerm
+STRATEGO_RTG_STRCFLAGS = -I /nix/store/fd1p042l65aaa440a4v5jl4rxjsxqx2b-strategoxt-0.17M3pre16697/share
+STRATEGO_RTG_XTC =
+STRATEGO_RUNTIME = /nix/store/fd1p042l65aaa440a4v5jl4rxjsxqx2b-strategoxt-0.17M3pre16697
+STRATEGO_RUNTIME_CFLAGS = -I/nix/store/fd1p042l65aaa440a4v5jl4rxjsxqx2b-strategoxt-0.17M3pre16697/include -I/nix/store/0nsws8s9blgv5sq3n1sxr0wsfd1dbgys-aterm-2.5pre20939/include
+STRATEGO_RUNTIME_LIBS = -L/nix/store/fd1p042l65aaa440a4v5jl4rxjsxqx2b-strategoxt-0.17M3pre16697/lib -L/nix/store/0nsws8s9blgv5sq3n1sxr0wsfd1dbgys-aterm-2.5pre20939/lib -lstratego-runtime -lm -lATerm
+STRATEGO_RUNTIME_STRCFLAGS =
+STRATEGO_RUNTIME_XTC =
+STRATEGO_SGLR = /nix/store/fd1p042l65aaa440a4v5jl4rxjsxqx2b-strategoxt-0.17M3pre16697
+STRATEGO_SGLR_CFLAGS = -I/nix/store/0nsws8s9blgv5sq3n1sxr0wsfd1dbgys-aterm-2.5pre20939/include -I/nix/store/fd1p042l65aaa440a4v5jl4rxjsxqx2b-strategoxt-0.17M3pre16697/include
+STRATEGO_SGLR_LIBS = -L/nix/store/fd1p042l65aaa440a4v5jl4rxjsxqx2b-strategoxt-0.17M3pre16697/lib -L/nix/store/0nsws8s9blgv5sq3n1sxr0wsfd1dbgys-aterm-2.5pre20939/lib -lstratego-sglr -lstratego-lib -lstratego-lib-native -lstratego-runtime -lm -lATerm
+STRATEGO_SGLR_STRCFLAGS = -I /nix/store/fd1p042l65aaa440a4v5jl4rxjsxqx2b-strategoxt-0.17M3pre16697/share
+STRATEGO_SGLR_XTC =
+STRATEGO_TOOL_DOC = /nix/store/fd1p042l65aaa440a4v5jl4rxjsxqx2b-strategoxt-0.17M3pre16697
+STRATEGO_TOOL_DOC_CFLAGS = -I/nix/store/0nsws8s9blgv5sq3n1sxr0wsfd1dbgys-aterm-2.5pre20939/include -I/nix/store/fd1p042l65aaa440a4v5jl4rxjsxqx2b-strategoxt-0.17M3pre16697/include
+STRATEGO_TOOL_DOC_LIBS = -L/nix/store/fd1p042l65aaa440a4v5jl4rxjsxqx2b-strategoxt-0.17M3pre16697/lib -L/nix/store/0nsws8s9blgv5sq3n1sxr0wsfd1dbgys-aterm-2.5pre20939/lib -lstratego-tool-doc -lstratego-gpp -lstratego-sglr -lstratego-lib -lstratego-lib-native -lstratego-runtime -lm -lATerm
+STRATEGO_TOOL_DOC_STRCFLAGS = -I /nix/store/fd1p042l65aaa440a4v5jl4rxjsxqx2b-strategoxt-0.17M3pre16697/share
+STRATEGO_TOOL_DOC_XTC =
+STRATEGO_XTC = /nix/store/fd1p042l65aaa440a4v5jl4rxjsxqx2b-strategoxt-0.17M3pre16697
+STRATEGO_XTC_CFLAGS = -I/nix/store/fd1p042l65aaa440a4v5jl4rxjsxqx2b-strategoxt-0.17M3pre16697/include -I/nix/store/0nsws8s9blgv5sq3n1sxr0wsfd1dbgys-aterm-2.5pre20939/include
+STRATEGO_XTC_LIBS = -L/nix/store/fd1p042l65aaa440a4v5jl4rxjsxqx2b-strategoxt-0.17M3pre16697/lib -L/nix/store/0nsws8s9blgv5sq3n1sxr0wsfd1dbgys-aterm-2.5pre20939/lib -lstratego-xtc -lstratego-lib -lstratego-lib-native -lstratego-runtime -lm -lATerm
+STRATEGO_XTC_STRCFLAGS = -I /nix/store/fd1p042l65aaa440a4v5jl4rxjsxqx2b-strategoxt-0.17M3pre16697/share
+STRATEGO_XTC_XTC =
+STRC = $(STRATEGOXT)
+STRIP = strip
+STR_CFLAGS = -Wall -Wno-unused-label -Wno-unused-variable -Wno-unused-function -Wno-unused-parameter
+STR_LDFLAGS =
+VERSION = 0.1
+XML_FRONT = $(STRATEGOXT)
+XTC = /nix/store/fd1p042l65aaa440a4v5jl4rxjsxqx2b-strategoxt-0.17M3pre16697
+XTC_CFLAGS =
+XTC_LIBS = $(STRATEGO_XTC_LIBS)
+XTC_PROG = /nix/store/fd1p042l65aaa440a4v5jl4rxjsxqx2b-strategoxt-0.17M3pre16697/bin/xtc
+XTC_STRCFLAGS = $(STRATEGO_XTC_STRCFLAGS)
+XTC_XTC =
+abs_builddir = /home/yabo/dev/lrde/scool/trunk/src
+abs_srcdir = /home/yabo/dev/lrde/scool/trunk/src
+abs_top_builddir = /home/yabo/dev/lrde/scool/trunk
+abs_top_srcdir = /home/yabo/dev/lrde/scool/trunk
+ac_ct_CC = /usr/bin/gcc32
+ac_ct_CXX = g++
+ac_ct_F77 = gfortran
+am__include = include
+am__leading_dot = .
+am__quote =
+am__tar = ${AMTAR} chof - "$$tardir"
+am__untar = ${AMTAR} xf -
+bindir = ${exec_prefix}/bin
+build = x86_64-unknown-linux-gnu
+build_alias =
+build_cpu = x86_64
+build_os = linux-gnu
+build_vendor = unknown
+builddir = .
+datadir = ${datarootdir}
+datarootdir = ${prefix}/share
+docdir = ${datarootdir}/doc/${PACKAGE_TARNAME}
+dvidir = ${docdir}
+exec_prefix = ${prefix}
+host = x86_64-unknown-linux-gnu
+host_alias =
+host_cpu = x86_64
+host_os = linux-gnu
+host_vendor = unknown
+htmldir = ${docdir}
+includedir = ${prefix}/include
+infodir = ${datarootdir}/info
+install_sh = $(SHELL) /home/yabo/dev/lrde/scool/trunk/config/install-sh
+libdir = ${exec_prefix}/lib
+libexecdir = ${exec_prefix}/libexec
+localedir = ${datarootdir}/locale
+localstatedir = ${prefix}/var
+mandir = ${datarootdir}/man
+mkdir_p = /bin/mkdir -p
+oldincludedir = /usr/include
+pdfdir = ${docdir}
+prefix = /usr/local
+program_transform_name = s,x,x,
+psdir = ${docdir}
+sbindir = ${exec_prefix}/sbin
+sharedstatedir = ${prefix}/com
+srcdir = .
+sysconfdir = ${prefix}/etc
+target_alias =
+top_builddir = ..
+top_srcdir = ..
+AM_CFLAGS = $(STR_CFLAGS) $(am__append_1)
+AM_LDFLAGS = $(STR_LDFLAGS)
+AM_CPPFLAGS = $(STRATEGO_LIB_CFLAGS) $(STRATEGO_RUNTIME_CFLAGS) $(ATERM_CFLAGS)
+LDADD = $(STRATEGO_LIB_LIBS) $(STRATEGO_RUNTIME_LIBS) $(ATERM_LIBS)
+
+# backwards compatibilty: prefer STRATEGO_LIB_LIBS and STRATEGO_RUNTIME_LIBS in new code.
+SSL_LIBS = $(ATERM_LIBS) $(STRATEGO_XTC_LIBS) $(STRATEGO_LIB_LIBS) $(STRATEGO_RUNTIME_LIBS) $(ATERM_LIBS)
+STRATEGORUNLIBS = $(STRATEGO_RUNTIME_LIBS)
+SUFFIXES = .str .cr .r .rtree .def .tbl .pp .sdf .rtg .rtg-nf .dfta
+PARSESTRATEGO = $(STRATEGO_FRONT)/bin/parse-stratego
+pkgconfigdir = $(libdir)/pkgconfig
+sdfdatadir = $(datadir)/sdf/$(PACKAGE)
+docdatadir = $(datadir)/doc/$(PACKAGE)
+
+###########################################################
+#
+# Makerules for XTC
+#
+XTCFLAGS = -I $(XTC)/share/xtc
+DREPOSITORY = $(DESTDIR)$(REPOSITORY)
+SUBDIRS = cxx-syn scl-syn pp-cxx scoolt
+BOOTCLEAN_SUBDIRS = $(SUBDIRS)
+all: all-recursive
+
+.SUFFIXES:
+.SUFFIXES: .str .cr .r .rtree .def .tbl .pp .sdf .rtg .rtg-nf .dfta .c
+$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(top_srcdir)/config/Makefile.xt $(am__configure_deps)
+ @for dep in $?; do \
+ case '$(am__configure_deps)' in \
+ *$$dep*) \
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
+ && exit 0; \
+ exit 1;; \
+ esac; \
+ done; \
+ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/Makefile'; \
+ cd $(top_srcdir) && \
+ $(AUTOMAKE) --gnu src/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+ @case '$?' in \
+ *config.status*) \
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+ *) \
+ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+ esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure: $(am__configure_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4): $(am__aclocal_m4_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+mostlyclean-libtool:
+ -rm -f *.lo
+
+clean-libtool:
+ -rm -rf .libs _libs
+
+# This directory's subdirectories are mostly independent; you can cd
+# into them and run `make' without going through this Makefile.
+# To change the values of `make' variables: instead of editing Makefiles,
+# (1) if the variable is set in `config.status', edit `config.status'
+# (which will cause the Makefiles to be regenerated when you run `make');
+# (2) otherwise, pass the desired values on the `make' command line.
+$(RECURSIVE_TARGETS):
+ @failcom='exit 1'; \
+ for f in x $$MAKEFLAGS; do \
+ case $$f in \
+ *=* | --[!k]*);; \
+ *k*) failcom='fail=yes';; \
+ esac; \
+ done; \
+ dot_seen=no; \
+ target=`echo $@ | sed s/-recursive//`; \
+ list='$(SUBDIRS)'; for subdir in $$list; do \
+ echo "Making $$target in $$subdir"; \
+ if test "$$subdir" = "."; then \
+ dot_seen=yes; \
+ local_target="$$target-am"; \
+ else \
+ local_target="$$target"; \
+ fi; \
+ (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
+ || eval $$failcom; \
+ done; \
+ if test "$$dot_seen" = "no"; then \
+ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \
+ fi; test -z "$$fail"
+
+$(RECURSIVE_CLEAN_TARGETS):
+ @failcom='exit 1'; \
+ for f in x $$MAKEFLAGS; do \
+ case $$f in \
+ *=* | --[!k]*);; \
+ *k*) failcom='fail=yes';; \
+ esac; \
+ done; \
+ dot_seen=no; \
+ case "$@" in \
+ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \
+ *) list='$(SUBDIRS)' ;; \
+ esac; \
+ rev=''; for subdir in $$list; do \
+ if test "$$subdir" = "."; then :; else \
+ rev="$$subdir $$rev"; \
+ fi; \
+ done; \
+ rev="$$rev ."; \
+ target=`echo $@ | sed s/-recursive//`; \
+ for subdir in $$rev; do \
+ echo "Making $$target in $$subdir"; \
+ if test "$$subdir" = "."; then \
+ local_target="$$target-am"; \
+ else \
+ local_target="$$target"; \
+ fi; \
+ (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
+ || eval $$failcom; \
+ done && test -z "$$fail"
+tags-recursive:
+ list='$(SUBDIRS)'; for subdir in $$list; do \
+ test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \
+ done
+ctags-recursive:
+ list='$(SUBDIRS)'; for subdir in $$list; do \
+ test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \
+ done
+
+ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ mkid -fID $$unique
+tags: TAGS
+
+TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
+ $(TAGS_FILES) $(LISP)
+ tags=; \
+ here=`pwd`; \
+ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \
+ include_option=--etags-include; \
+ empty_fix=.; \
+ else \
+ include_option=--include; \
+ empty_fix=; \
+ fi; \
+ list='$(SUBDIRS)'; for subdir in $$list; do \
+ if test "$$subdir" = .; then :; else \
+ test ! -f $$subdir/TAGS || \
+ tags="$$tags $$include_option=$$here/$$subdir/TAGS"; \
+ fi; \
+ done; \
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \
+ test -n "$$unique" || unique=$$empty_fix; \
+ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+ $$tags $$unique; \
+ fi
+ctags: CTAGS
+CTAGS: ctags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
+ $(TAGS_FILES) $(LISP)
+ tags=; \
+ here=`pwd`; \
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ test -z "$(CTAGS_ARGS)$$tags$$unique" \
+ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+ $$tags $$unique
+
+GTAGS:
+ here=`$(am__cd) $(top_builddir) && pwd` \
+ && cd $(top_srcdir) \
+ && gtags -i $(GTAGS_ARGS) $$here
+
+distclean-tags:
+ -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+distdir: $(DISTFILES)
+ @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+ list='$(DISTFILES)'; \
+ dist_files=`for file in $$list; do echo $$file; done | \
+ sed -e "s|^$$srcdirstrip/||;t" \
+ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+ case $$dist_files in \
+ */*) $(MKDIR_P) `echo "$$dist_files" | \
+ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+ sort -u` ;; \
+ esac; \
+ for file in $$dist_files; do \
+ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+ if test -d $$d/$$file; then \
+ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+ fi; \
+ cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+ else \
+ test -f $(distdir)/$$file \
+ || cp -p $$d/$$file $(distdir)/$$file \
+ || exit 1; \
+ fi; \
+ done
+ list='$(DIST_SUBDIRS)'; for subdir in $$list; do \
+ if test "$$subdir" = .; then :; else \
+ test -d "$(distdir)/$$subdir" \
+ || $(MKDIR_P) "$(distdir)/$$subdir" \
+ || exit 1; \
+ distdir=`$(am__cd) $(distdir) && pwd`; \
+ top_distdir=`$(am__cd) $(top_distdir) && pwd`; \
+ (cd $$subdir && \
+ $(MAKE) $(AM_MAKEFLAGS) \
+ top_distdir="$$top_distdir" \
+ distdir="$$distdir/$$subdir" \
+ am__remove_distdir=: \
+ am__skip_length_check=: \
+ distdir) \
+ || exit 1; \
+ fi; \
+ done
+check-am: all-am
+check: check-recursive
+#all-local:
+all-am: Makefile all-local
+installdirs: installdirs-recursive
+installdirs-am:
+install: install-recursive
+install-exec: install-exec-recursive
+install-data: install-data-recursive
+uninstall: uninstall-recursive
+
+install-am: all-am
+ @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-recursive
+install-strip:
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ `test -z '$(STRIP)' || \
+ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+ -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+
+maintainer-clean-generic:
+ @echo "This command is intended for maintainers to use"
+ @echo "it deletes files that may require special tools to rebuild."
+#install-data-local:
+#install-exec-local:
+clean: clean-recursive
+
+clean-am: clean-generic clean-libtool mostlyclean-am
+
+distclean: distclean-recursive
+ -rm -f Makefile
+distclean-am: clean-am distclean-generic distclean-tags
+
+dvi: dvi-recursive
+
+dvi-am:
+
+html: html-recursive
+
+info: info-recursive
+
+info-am:
+
+install-data-am: install-data-local
+
+install-dvi: install-dvi-recursive
+
+install-exec-am: install-exec-local
+
+install-html: install-html-recursive
+
+install-info: install-info-recursive
+
+install-man:
+
+install-pdf: install-pdf-recursive
+
+install-ps: install-ps-recursive
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-recursive
+ -rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-recursive
+
+mostlyclean-am: mostlyclean-generic mostlyclean-libtool
+
+pdf: pdf-recursive
+
+pdf-am:
+
+ps: ps-recursive
+
+ps-am:
+
+uninstall-am:
+
+.MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) install-am \
+ install-strip
+
+.PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \
+ all all-am all-local check check-am clean clean-generic \
+ clean-libtool ctags ctags-recursive distclean \
+ distclean-generic distclean-libtool distclean-tags distdir dvi \
+ dvi-am html html-am info info-am install install-am \
+ install-data install-data-am install-data-local install-dvi \
+ install-dvi-am install-exec install-exec-am install-exec-local \
+ install-html install-html-am install-info install-info-am \
+ install-man install-pdf install-pdf-am install-ps \
+ install-ps-am install-strip installcheck installcheck-am \
+ installdirs installdirs-am maintainer-clean \
+ maintainer-clean-generic mostlyclean mostlyclean-generic \
+ mostlyclean-libtool pdf pdf-am ps ps-am tags tags-recursive \
+ uninstall uninstall-am
+
+
+###########################################################
+#
+# Make rules for Stratego programs
+#
+
+.str.c :
+ $(SCOMPILE) $(STRINCLUDES) $(STRCFLAGS) $(SCFLAGS) -i $< -o $@ -c
+
+.str.rtree :
+ $(PARSESTRATEGO) $(STRINCLUDES) -i $< -o $@
+
+.rtree.c :
+ $(SCOMPILE) $(STRINCLUDES) $(STRCFLAGS) $(SCFLAGS) -i $< -o $@ -c
+
+bootclean-am: clean-am
+ -test -z "$(BOOTCLEANFILES)" || rm -f $(BOOTCLEANFILES)
+
+bootclean : bootclean-recursive
+
+bootclean-recursive :
+ @dot_seen=no; \
+ target=bootclean; \
+ list='$(BOOTCLEAN_SUBDIRS) .'; for subdir in $$list; do \
+ echo "Making $$target in $$subdir"; \
+ if test "$$subdir" = "."; then \
+ dot_seen=yes; \
+ local_target="$$target-am"; \
+ else \
+ local_target="$$target"; \
+ fi; \
+ (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
+ || case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \
+ done; \
+ if test "$$dot_seen" = "no"; then \
+ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \
+ fi; test -z "$$fail"
+
+###########################################################
+#
+# Makerules for SDF definitions
+#
+
+.sdf.def :
+ $(SDF_FRONT)/bin/pack-sdf $(SDFINCLUDES) -i $< -o $@ --dep $*.dep
+
+.def.tbl :
+ $(PGEN)/bin/sdf2table $(PGEN_FLAGS) -i $< -o $@
+
+###########################################################
+#
+# Makerules for GPP
+#
+
+%.pp.af : %.pp
+ $(GPP)/bin/parse-pp-table -i $< -o $@
+
+.def.pp :
+ @if [ ! -f ${srcdir}/$@ ]; then \
+ $(GPP)/bin/ppgen -i $< -o $@ ;\
+ else \
+ $(GPP)/bin/parse-pp-table -i ${srcdir}/$@ -o $@.af ;\
+ $(GPP)/bin/ppgen -t -i $< \
+ | $(GPP)/bin/pptable-diff --old $@.af 2>&1 || \
+ eval "echo '## pptable-diff error: $@ is not consistent with syntax definition' >&2; exit 1";\
+ touch $@ ;\
+ $(RM) $@.af ;\
+ fi
+
+###########################################################
+#
+# Makerules for Stratego Regular
+#
+
+.def.rtg :
+ $(STRATEGO_REGULAR)/bin/sdf2rtg $(SDF2RTG_FLAGS) -i $< -o $@
+
+.rtg.str :
+ $(STRATEGO_REGULAR)/bin/rtg2sig --module `basename "$*"` -i $< -o $@
+
+.rtg.rtg-nf :
+ $(STRATEGO_REGULAR)/bin/parse-rtg -i $< | \
+ $(STRATEGO_REGULAR)/libexec/rtg-reduce | \
+ $(STRATEGO_REGULAR)/libexec/rtg-group -o $@
+
+.rtg.dfta :
+ $(STRATEGO_REGULAR)/bin/rtg2dfta -i $< -o $@
+
+relname:
+ echo -n $(distdir) > relname
+
+install-data-local::
+ $(mkinstalldirs) `dirname $(DREPOSITORY)`
+ @for file in fordummy $(XTC_IMPORT) ; do \
+ if [ "$$file" = "fordummy" ]; then continue; fi; \
+ $(XTC_PROG) -r $(DREPOSITORY) import $$file ; \
+ echo $(XTC_PROG) -r $(DREPOSITORY) import $$file ; \
+ done
+ @for file in fordummy $(pkgdata_DATA) ; do \
+ if [ "$$file" = "fordummy" ]; then continue; fi; \
+ $(XTC_PROG) -r $(DREPOSITORY) register -l $(pkgdatadir) -V $(VERSION) -t `basename $$file` ; \
+ done
+ @for file in fordummy $(nobase_pkgdata_DATA) ; do \
+ if [ "$$file" = "fordummy" ]; then continue; fi; \
+ $(XTC_PROG) -r $(DREPOSITORY) register -l $(pkgdatadir) -V $(VERSION) -t $$file ; \
+ done
+ @for file in fordummy $(sdfdata_DATA) ; do \
+ if [ "$$file" = "fordummy" ]; then continue; fi; \
+ $(XTC_PROG) -r $(DREPOSITORY) register -l $(sdfdatadir) -V $(VERSION) -t `basename $$file` ; \
+ done
+ @for file in fordummy $(nobase_sdfdata_DATA) ; do \
+ if [ "$$file" = "fordummy" ]; then continue; fi; \
+ $(XTC_PROG) -r $(DREPOSITORY) register -l $(sdfdatadir) -V $(VERSION) -t $$file ; \
+ done
+ @for file in fordummy $(data_DATA) ; do \
+ if [ "$$file" = "fordummy" ]; then continue; fi; \
+ $(XTC_PROG) -r $(DREPOSITORY) register -l $(datadir) -V $(VERSION) -t `basename $$file` ; \
+ done
+ @for file in fordummy $(nobase_data_DATA) ; do \
+ if [ "$$file" = "fordummy" ]; then continue; fi; \
+ $(XTC_PROG) -r $(DREPOSITORY) register -l $(datadir) -V $(VERSION) -t $$file ; \
+ done
+ @echo "Data registered in repository $(DREPOSITORY): $(data_DATA) $(nobase_data_DATA) $(pkgdata_DATA) $(nobase_pkgdata_DATA) $(sdfdata_DATA) $(nobase_sdfdata_DATA)"
+
+install-exec-local::
+ $(mkinstalldirs) `dirname $(DREPOSITORY)`
+ @for file in fordummy $(bin_PROGRAMS) $(bin_SCRIPTS) ; do \
+ if [ "$$file" = "fordummy" ]; then continue; fi; \
+ $(XTC_PROG) -r $(DREPOSITORY) register -l $(bindir) -V $(VERSION) -t `basename $$file $(EXEEXT)` ; \
+ done
+ @for file in fordummy $(libexec_PROGRAMS) $(libexec_SCRIPTS) ; do \
+ if [ "$$file" = "fordummy" ]; then continue; fi; \
+ $(XTC_PROG) -r $(DREPOSITORY) register -l $(libexecdir) -V $(VERSION) -t `basename $$file $(EXEEXT)` ; \
+ done
+ @echo "Tools registered in repository $(DREPOSITORY): $(bin_PROGRAMS) $(bin_SCRIPTS) $(libexec_PROGRAMS) $(libexec_SCRIPTS)"
+
+all-local::
+ @for file in fordummy $(XTC_IMPORT) ; do \
+ if [ "$$file" = "fordummy" ]; then continue; fi; \
+ $(XTC_PROG) -r $(BUILD_REPOSITORY) import $$file ; \
+ echo $(XTC_PROG) -r $(BUILD_REPOSITORY) import $$file ; \
+ done
+ @for file in fordummy $(data_DATA) $(pkgdata_DATA) $(sdfdata_DATA) $(bin_SCRIPTS) $(libexec_SCRIPTS); do \
+ if [ "$$file" = "fordummy" ]; then continue; fi; \
+ if test -f "$$file"; then d="`pwd`"; else d="/home/yabo/dev/lrde/scool/trunk/src"; fi; \
+ $(XTC_PROG) -r $(BUILD_REPOSITORY) register -l "$$d" -V $(VERSION) -t `basename $$file` ; \
+ done
+ @for file in fordummy $(nobase_data_DATA) $(nobase_pkgdata_DATA) $(nobase_sdfdata_DATA) ; do \
+ if [ "$$file" = "fordummy" ]; then continue; fi; \
+ if test -f "$$file"; then d="`pwd`"; else d="/home/yabo/dev/lrde/scool/trunk/src"; fi; \
+ $(XTC_PROG) -r $(BUILD_REPOSITORY) register -l "$$d" -V $(VERSION) -t $$file ; \
+ done
+ @for file in fordummy $(bin_PROGRAMS) $(libexec_PROGRAMS) ; do \
+ if [ "$$file" = "fordummy" ]; then continue; fi; \
+ if test -f "$$file"; then d="`pwd`"; else d="/home/yabo/dev/lrde/scool/trunk/src"; fi; \
+ $(XTC_PROG) -r $(BUILD_REPOSITORY) register -l "$$d" -V $(VERSION) -t `basename $$file $(EXEEXT)` ; \
+ done
+ @echo "Tools registered in repository $(BUILD_REPOSITORY): $(bin_PROGRAMS) $(bin_SCRIPTS) $(libexec_PROGRAMS) $(libexec_SCRIPTS)"
+ @echo "Data registered in repository $(BUILD_REPOSITORY): $(data_DATA) $(nobase_data_DATA) $(pkgdata_DATA) $(nobase_pkgdata_DATA) $(sdfdata_DATA) $(nobase_sdfdata_DATA)"
+
+###########################################################
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
Index: trunk/bin/scoolc
===================================================================
--- trunk/bin/scoolc (revision 0)
+++ trunk/bin/scoolc (revision 49)
@@ -0,0 +1,17 @@
+#!/bin/sh
+# -*- sh -*-
+
+if [ "$1" = "--cxx" ]; then
+ shift
+ if [ $# -gt 0 ]; then
+ parse-scool -i $1 | scoolt | pp-cxx | abox2text
+ else
+ parse-scool | scoolt | pp-cxx | abox2text
+ fi
+else
+ if [ $# -gt 0 ]; then
+ parse-scool -i $1 | scoolt | pp-cxx | abox2text | g++ -c -x c++ - -I $SCOOLC_ROOT/static -I $SCOOLC_ROOT/metalic
+ else
+ parse-scool | scoolt | pp-cxx | abox2text | g++ -c -x c++ - -I $SCOOLC_ROOT/static -I $SCOOLC_ROOT/metalic
+ fi
+fi
Property changes on: trunk/bin/scoolc
___________________________________________________________________
Name: svn:executable
+ *
Index: trunk/Makefile.am
===================================================================
--- trunk/Makefile.am (revision 0)
+++ trunk/Makefile.am (revision 49)
@@ -0,0 +1,10 @@
+# Makefile.am -*-Makefile-*-
+
+include $(top_srcdir)/config/Makefile.xt
+
+XTC_IMPORT = $(STRATEGOXT)/share/strategoxt/XTC \
+ $(GENERIC_TOOLS_XTC)
+CLEANFILES = XTC
+BOOTCLEAN_SUBDIRS = $(SUBDIRS)
+ACLOCAL_AMFLAGS = -I config
+SUBDIRS = . config src
Index: trunk/NEWS
===================================================================
Index: trunk/README
===================================================================
Index: trunk/bootstrap
===================================================================
--- trunk/bootstrap (revision 0)
+++ trunk/bootstrap (revision 49)
@@ -0,0 +1,7 @@
+#!/bin/sh -e
+
+here=`pwd`
+cd config
+ autoxt
+cd $here
+autoreconf -f -i --verbose
Property changes on: trunk/bootstrap
___________________________________________________________________
Name: svn:executable
+ *
--
\__/ \__/
(00) Maxime `yabo` van Noppen (00)
___) \ Epita 2009 / (___
(_____/ Président de Prologin \_____)
2
1