Set a maximum limit on element recursion depth
The maximum recursion depth is set to 25. If that's not sufficient for
someone's needs, they're welcome to submit a patch that makes it
configurable.
This fixes a stack overflow found by AutoFuzz. The stack overflow was
caused by recursing too much. I've included the fuzzer's test cases in
the fuzzing/corpus directory. I've also created two (one for SimpleTag
and ChapterAtom each) additional test files, each comprised of 10,000
recursively nested elements. Manually running the fuzzer (with ASan and
UBSan) shows all inputs are now handled correctly, and no stack
overflows occur.
Change-Id: I8514259fd0788e71a58e3ccce2a0fb8a3523acfc
diff --git a/webm_parser/fuzzing/corpus/148357130d1e5ac4059ad2bb6c63d78e2523f7d2 b/webm_parser/fuzzing/corpus/148357130d1e5ac4059ad2bb6c63d78e2523f7d2
new file mode 100644
index 0000000..23129b8
--- /dev/null
+++ b/webm_parser/fuzzing/corpus/148357130d1e5ac4059ad2bb6c63d78e2523f7d2
Binary files differ
diff --git a/webm_parser/fuzzing/corpus/1df9507cc2a54a369646d6d34d846d3fcc172479 b/webm_parser/fuzzing/corpus/1df9507cc2a54a369646d6d34d846d3fcc172479
new file mode 100644
index 0000000..0826b42
--- /dev/null
+++ b/webm_parser/fuzzing/corpus/1df9507cc2a54a369646d6d34d846d3fcc172479
Binary files differ
diff --git a/webm_parser/fuzzing/corpus/27d62874ec87a2552e7c842da65de113aa69f7aa b/webm_parser/fuzzing/corpus/27d62874ec87a2552e7c842da65de113aa69f7aa
new file mode 100644
index 0000000..f83242a
--- /dev/null
+++ b/webm_parser/fuzzing/corpus/27d62874ec87a2552e7c842da65de113aa69f7aa
Binary files differ
diff --git a/webm_parser/fuzzing/corpus/2a8dda90aa286175b5c683b57fae1dc7e6ac1e7e b/webm_parser/fuzzing/corpus/2a8dda90aa286175b5c683b57fae1dc7e6ac1e7e
new file mode 100644
index 0000000..f453884
--- /dev/null
+++ b/webm_parser/fuzzing/corpus/2a8dda90aa286175b5c683b57fae1dc7e6ac1e7e
Binary files differ
diff --git a/webm_parser/fuzzing/corpus/395027454c7d5babff9544414c04a39d712eed1c b/webm_parser/fuzzing/corpus/395027454c7d5babff9544414c04a39d712eed1c
new file mode 100644
index 0000000..e34ef6f
--- /dev/null
+++ b/webm_parser/fuzzing/corpus/395027454c7d5babff9544414c04a39d712eed1c
Binary files differ
diff --git a/webm_parser/fuzzing/corpus/53c27071f53df6b8d2e5c419edf95b7792b278e7 b/webm_parser/fuzzing/corpus/53c27071f53df6b8d2e5c419edf95b7792b278e7
new file mode 100644
index 0000000..87d69ed
--- /dev/null
+++ b/webm_parser/fuzzing/corpus/53c27071f53df6b8d2e5c419edf95b7792b278e7
@@ -0,0 +1 @@
+¶¶¶¶ÿ6¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶ÿ¶¶¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶;¶ÿ¶¶¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶;¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶;¶ÿ¶¶¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶;¶ÿ¶¶¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶;¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶;¶ÿ¶¶¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿö¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶;¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶;¶ÿ¶¶¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶ÿ¶¶¶¶ÿ¶ÿ¶¶ÿ¶;¶ÿ¶¶¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶;¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶;¶ÿ¶¶¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶;¶ÿ¶¶¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶;¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶;¶ÿ¶¶¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿö¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶;¶ÿ¶¶¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶;¶ÿ¶¶¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶;¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶;¶ÿ¶¶¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶;¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶;¶ÿ¶¶¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶ÿ¶¶ÿ¶ÿ¶¶¶ÿ¶¶ÿ¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶Óÿ¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶;¶ÿ¶¶¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶ÿ¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶ÿ¶¶ÿ¶ÿ¶¶¶ÿ¶¶ÿ¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶;¶ÿ¶¶¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶;¶ÿ¶¶¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶ÿ¶¶ÿ¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶ÿ¶¶ÿ¶ÿ¶¶¶ÿ¶¶ÿ¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶;¶ÿ¶¶¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶;¶ÿ¶¶¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶;¶ÿ¶¶¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶;¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶;¶ÿ¶¶¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶;¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶;¶ÿ¶¶¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿö¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶;¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶;¶ÿ¶¶¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶ÿ¶¶ÿ¶ÿ¶¶¶ÿ¶¶ÿ¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶;¶ÿ¶¶¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶;¶ÿ¶¶¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶;¶ÿ¶¶¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶;¶ÿ¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶;¶ÿ¶¶¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶;¶ÿ¶¶¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶;¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶;¶ÿ¶¶¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶;¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶;¶ÿ¶¶¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶ÿ¶¶ÿ¶ÿ¶¶¶ÿ¶¶ÿ¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶;¶ÿ¶¶¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶ÿ¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶ÿ¶¶ÿ¶ÿ¶¶¶ÿ¶¶ÿ¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶;¶ÿ¶¶¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶;¶ÿ¶¶¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶;¶ÿ¶¶¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶;¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶;¶ÿ¶¶¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶;¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶;¶ÿ¶¶¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶ÿ¶¶ÿÿ¶¶¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶;¶ÿ¶¶¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶;¶ÿ¶¶¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶;¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶;¶ÿ¶¶¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶;¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶;¶ÿ¶¶¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶ÿ¶¶ÿ¶ÿ¶¶¶ÿ¶¶ÿ¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶Óÿ¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶;¶ÿ¶¶¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶ÿ¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶ÿ¶¶ÿ¶ÿ¶¶¶ÿ¶¶ÿ¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶;¶ÿ¶¶¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶;¶ÿ¶¶¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶ÿ¶¶ÿ¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶ÿ¶¶ÿ¶ÿ¶¶¶ÿ¶¶ÿ¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶;¶ÿ¶¶¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶;¶ÿ¶¶¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶;¶ÿ¶¶¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶;¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶;¶ÿ¶¶¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶;¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶;¶ÿ¶¶¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿö¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶;¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶;¶ÿ¶¶¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶ÿ¶¶ÿ¶ÿ¶¶¶ÿ¶¶ÿ¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶¶ÿ¶;¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶;¶ÿ¶¶¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶ÿ¶¶ÿ¶ÿ¶¶¶ÿ¶¶ÿ¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶;¶ÿ¶¶¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶;¶ÿ¶¶¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶;¶ÿ¶¶¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶;¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶;¶ÿ¶¶¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶;¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶;¶ÿ¶¶¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶;¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶;¶ÿ¶¶¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿö¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶;¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶;¶ÿ¶¶¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶ÿ¶¶ÿ¶ÿ¶¶¶ÿ¶¶ÿ¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶;¶ÿ¶¶¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶;¶ÿ¶¶¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶;¶ÿ¶¶¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶;¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶;¶ÿ¶¶¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶;¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶;¶ÿ¶¶¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿö¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶;¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶;¶ÿ¶¶¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶ÿ¶¶ÿ¶ÿ¶¶¶ÿ¶¶ÿ¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶;¶ÿ¶¶¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶;¶ÿ¶¶¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶;¶ÿ¶¶¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶;¶ÿ¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶;¶ÿ¶¶¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿö¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶;¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶;¶ÿ¶¶¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶ÿ¶¶ÿ¶ÿ¶¶¶ÿ¶¶ÿ¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶;¶ÿ¶¶¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶;¶ÿ¶¶¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶;¶ÿ¶¶¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶;¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶;¶ÿ¶¶¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶;¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶;¶ÿ¶¶¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿö¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶;¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶;¶ÿ¶¶¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶ÿ¶¶ÿ¶ÿ¶¶¶ÿ¶¶ÿ¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶;¶ÿ¶¶¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶;¶ÿ¶¶¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶;¶ÿ¶¶¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶;¶ÿ¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶;¶ÿ¶¶¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶;¶ÿ¶¶¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶;¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶;¶ÿ¶¶¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶;¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶;¶ÿ¶¶¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶ÿ¶¶ÿ¶ÿ¶¶¶ÿ¶¶ÿ¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶Óÿ¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶;¶ÿ¶¶¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶ÿ¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶ÿ¶¶ÿ¶ÿ¶¶¶ÿ¶¶ÿ¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶;¶ÿ¶¶¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶;¶ÿ¶¶¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶ÿ¶¶ÿ¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶ÿ¶¶ÿ¶ÿ¶¶¶ÿ¶¶ÿ¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶;¶ÿ¶¶¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶;¶ÿ¶¶¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶;¶ÿ¶¶¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶;¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶;¶ÿ¶¶¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶;¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶;¶ÿ¶¶¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿö¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶;¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶;¶ÿ¶¶¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶ÿ¶¶ÿ¶ÿ¶¶¶ÿ¶¶ÿ¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶;¶ÿ¶¶¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶;¶ÿ¶¶¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶;¶ÿ¶¶¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶;¶ÿ¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶;¶ÿ¶¶¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶;¶ÿ¶¶¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶;¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶;¶ÿ¶¶¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶;¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶;¶ÿ¶¶¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶ÿ¶¶ÿ¶ÿ¶¶¶ÿ¶¶ÿ¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶;¶ÿ¶¶¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶ÿ¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶ÿ¶¶ÿ¶ÿ¶¶¶ÿ¶¶ÿ¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶;¶ÿ¶¶¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶;¶ÿ¶¶¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶;¶ÿ¶¶¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶;¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶;¶ÿ¶¶¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶;¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶;¶ÿ¶¶¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶ÿ¶¶ÿÿ¶¶¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶;¶ÿ¶¶¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶;¶ÿ¶¶¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶;¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶;¶ÿ¶¶¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶;¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶;¶ÿ¶¶¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶ÿ¶¶ÿ¶ÿ¶¶¶ÿ¶¶ÿ¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶Óÿ¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶;¶ÿ¶¶¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶ÿ¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶ÿ¶¶ÿ¶ÿ¶¶¶ÿ¶¶ÿ¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶;¶ÿ¶¶¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶;¶ÿ¶¶¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶ÿ¶¶ÿ¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶ÿ¶¶ÿ¶ÿ¶¶¶ÿ¶¶ÿ¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶;¶ÿ¶¶¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶;¶ÿ¶¶¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶;¶ÿ¶¶¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶;¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶;¶ÿ¶¶¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶;¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶;¶ÿ¶¶¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿö¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶;¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶;¶ÿ¶¶¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶ÿ¶¶ÿ¶ÿ¶¶¶ÿ¶¶ÿ¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶;¶ÿ¶¶¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶;¶ÿ¶¶¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶;¶ÿ¶¶¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶;¶ÿ¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶;¶ÿ¶¶¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶;¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶;¶ÿ¶¶¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶;¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶;¶ÿ¶¶¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶ÿ¶¶ÿ¶ÿ¶¶¶ÿ¶¶ÿ¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶;¶ÿ¶¶¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶ÿ¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶ÿ¶¶ÿ¶ÿ¶¶¶ÿ¶¶ÿ¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶;¶ÿ¶¶¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶;¶ÿ¶¶¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶;¶ÿ¶¶¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶;¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶;¶ÿ¶¶¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶;¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶;¶ÿ¶¶¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿö¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶;¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶;¶ÿ¶¶¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶ÿ¶¶ÿ¶ÿ¶¶¶ÿ¶¶ÿ¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶;¶ÿ¶¶¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶ÿ¶¶¶¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶;¶ÿ¶¶¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶;¶ÿ¶¶¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶ÿ¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶;¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶;¶ÿ¶¶¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶;¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶;¶ÿ¶¶¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿö¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶;¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶;¶ÿ¶¶¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶ÿ¶¶:¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶ÿ¶¶ÿ¶ÿ¶¶¶ÿ¶¶ÿ¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶;¶ÿ¶¶¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶;¶ÿ¶¶¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶;¶ÿ¶¶¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶;¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶wÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶;¶ÿ¶¶¶¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶m¶ÿ¶¶ÿ¶¶®®Ý¶ÿ¶¶ÿ¶¶µ¶¶ÿ¶¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶¶¶ÿ¶¶ÿ¶¶¶ÿ¶ÿ¶¶ÿ¶¶¶ÿ¶¶¶ÿ¶¶ÿ¶¶ÿ¶¶å¶¶¶ÿ¶Eߣ¶¶À¶ÿ¶m¶ÿ¶¶ÿ¶¶®®Ý¶ÿ¶¶ÿ¶¶µ¶¶ÿ
\ No newline at end of file
diff --git a/webm_parser/fuzzing/corpus/6538d0517865c8832ee9bec87609b7bd4facb025 b/webm_parser/fuzzing/corpus/6538d0517865c8832ee9bec87609b7bd4facb025
new file mode 100644
index 0000000..7230e70
--- /dev/null
+++ b/webm_parser/fuzzing/corpus/6538d0517865c8832ee9bec87609b7bd4facb025
Binary files differ
diff --git a/webm_parser/fuzzing/corpus/8dc58cfcb396a60db921901f1b0807c4f4f37619 b/webm_parser/fuzzing/corpus/8dc58cfcb396a60db921901f1b0807c4f4f37619
new file mode 100644
index 0000000..e256d2f
--- /dev/null
+++ b/webm_parser/fuzzing/corpus/8dc58cfcb396a60db921901f1b0807c4f4f37619
Binary files differ
diff --git a/webm_parser/fuzzing/corpus/8f8f956eaaf8f7f5e65002be888b946218f0f7ce b/webm_parser/fuzzing/corpus/8f8f956eaaf8f7f5e65002be888b946218f0f7ce
new file mode 100644
index 0000000..7ebec69
--- /dev/null
+++ b/webm_parser/fuzzing/corpus/8f8f956eaaf8f7f5e65002be888b946218f0f7ce
Binary files differ
diff --git a/webm_parser/fuzzing/corpus/95a60268c555a77c1010d75bb44142af47635486 b/webm_parser/fuzzing/corpus/95a60268c555a77c1010d75bb44142af47635486
new file mode 100644
index 0000000..a95f40a
--- /dev/null
+++ b/webm_parser/fuzzing/corpus/95a60268c555a77c1010d75bb44142af47635486
Binary files differ
diff --git a/webm_parser/fuzzing/corpus/a823a019c0b19c97a1d35722cd843109ab016c17 b/webm_parser/fuzzing/corpus/a823a019c0b19c97a1d35722cd843109ab016c17
new file mode 100644
index 0000000..eae1319
--- /dev/null
+++ b/webm_parser/fuzzing/corpus/a823a019c0b19c97a1d35722cd843109ab016c17
Binary files differ
diff --git a/webm_parser/fuzzing/corpus/c2cc55849ff4858bf80f1a4713187618d14a496d b/webm_parser/fuzzing/corpus/c2cc55849ff4858bf80f1a4713187618d14a496d
new file mode 100644
index 0000000..b511eed
--- /dev/null
+++ b/webm_parser/fuzzing/corpus/c2cc55849ff4858bf80f1a4713187618d14a496d
Binary files differ
diff --git a/webm_parser/fuzzing/corpus/d3c74d3a64dba86f98a31bb726587ec97a7e4531 b/webm_parser/fuzzing/corpus/d3c74d3a64dba86f98a31bb726587ec97a7e4531
new file mode 100644
index 0000000..c2ce861
--- /dev/null
+++ b/webm_parser/fuzzing/corpus/d3c74d3a64dba86f98a31bb726587ec97a7e4531
Binary files differ
diff --git a/webm_parser/fuzzing/corpus/d62459bb217d3050bcd9e29a6327cf81f5ed68b9 b/webm_parser/fuzzing/corpus/d62459bb217d3050bcd9e29a6327cf81f5ed68b9
new file mode 100644
index 0000000..c4ec3c4
--- /dev/null
+++ b/webm_parser/fuzzing/corpus/d62459bb217d3050bcd9e29a6327cf81f5ed68b9
Binary files differ
diff --git a/webm_parser/fuzzing/corpus/dd962d74d04aa4aed270fd8e6b0ae9c4ac35fd19 b/webm_parser/fuzzing/corpus/dd962d74d04aa4aed270fd8e6b0ae9c4ac35fd19
new file mode 100644
index 0000000..dcb3af4
--- /dev/null
+++ b/webm_parser/fuzzing/corpus/dd962d74d04aa4aed270fd8e6b0ae9c4ac35fd19
Binary files differ
diff --git a/webm_parser/fuzzing/corpus/de9e0ed8ae29220e5b65e5b97eb3b254ccbe7e0c b/webm_parser/fuzzing/corpus/de9e0ed8ae29220e5b65e5b97eb3b254ccbe7e0c
new file mode 100644
index 0000000..d48be42
--- /dev/null
+++ b/webm_parser/fuzzing/corpus/de9e0ed8ae29220e5b65e5b97eb3b254ccbe7e0c
Binary files differ
diff --git a/webm_parser/fuzzing/corpus/fa79e8ad34cabea4d3c434cc02ea1499069fcafc b/webm_parser/fuzzing/corpus/fa79e8ad34cabea4d3c434cc02ea1499069fcafc
new file mode 100644
index 0000000..ac147e8
--- /dev/null
+++ b/webm_parser/fuzzing/corpus/fa79e8ad34cabea4d3c434cc02ea1499069fcafc
Binary files differ
diff --git a/webm_parser/fuzzing/webm.dict b/webm_parser/fuzzing/webm.dict
index 2aa0eb9..7660ce8 100644
--- a/webm_parser/fuzzing/webm.dict
+++ b/webm_parser/fuzzing/webm.dict
@@ -94,6 +94,12 @@
IdWhitePointChromaticityY = "\x55\xD8"
IdLuminanceMax = "\x55\xD9"
IdLuminanceMin = "\x55\xDA"
+IdProjection = "\x76\x70"
+IdProjectionType = "\x76\x71"
+IdProjectionPrivate = "\x76\x72"
+IdProjectionPoseYaw = "\x76\x73"
+IdProjectionPosePitch = "\x76\x74"
+IdProjectionPoseRoll = "\x76\x75"
IdAudio = "\xE1"
IdSamplingFrequency = "\xB5"
IdOutputSamplingFrequency = "\x78\xB5"
diff --git a/webm_parser/fuzzing/webm_fuzzer.cc b/webm_parser/fuzzing/webm_fuzzer.cc
index 1cb2228..501b151 100644
--- a/webm_parser/fuzzing/webm_fuzzer.cc
+++ b/webm_parser/fuzzing/webm_fuzzer.cc
@@ -49,7 +49,7 @@
assert(status.code != Status::kOkPartial);
// Only the following ranges have status codes defined:
- assert((-1030 <= status.code && status.code <= -1025) ||
+ assert((-1031 <= status.code && status.code <= -1025) ||
(-3 <= status.code && status.code <= 0));
return 0;
diff --git a/webm_parser/include/webm/status.h b/webm_parser/include/webm/status.h
index c0ad135..52abd38 100644
--- a/webm_parser/include/webm/status.h
+++ b/webm_parser/include/webm/status.h
@@ -87,6 +87,11 @@
*/
kInvalidElementValue = -1030,
+ /**
+ A recursive element was so deeply nested that exceeded the parser's limit.
+ */
+ kExceededRecursionDepthLimit = -1031,
+
// The following codes are internal-only and should not be used by users.
// Additionally, these codes should never be returned to the user; doing so
// is considered a bug.
diff --git a/webm_parser/src/chapter_atom_parser.h b/webm_parser/src/chapter_atom_parser.h
index d15f179..653f59f 100644
--- a/webm_parser/src/chapter_atom_parser.h
+++ b/webm_parser/src/chapter_atom_parser.h
@@ -12,7 +12,6 @@
#include "src/chapter_display_parser.h"
#include "src/int_parser.h"
#include "src/master_value_parser.h"
-#include "src/recursive_parser.h"
#include "webm/dom_types.h"
#include "webm/id.h"
@@ -23,7 +22,7 @@
// http://www.webmproject.org/docs/container/#ChapterAtom
class ChapterAtomParser : public MasterValueParser<ChapterAtom> {
public:
- ChapterAtomParser()
+ explicit ChapterAtomParser(std::size_t max_recursive_depth = 25)
: MasterValueParser<ChapterAtom>(
MakeChild<UnsignedIntParser>(Id::kChapterUid, &ChapterAtom::uid),
MakeChild<StringParser>(Id::kChapterStringUid,
@@ -34,8 +33,8 @@
&ChapterAtom::time_end),
MakeChild<ChapterDisplayParser>(Id::kChapterDisplay,
&ChapterAtom::displays),
- MakeChild<RecursiveParser<ChapterAtomParser>>(
- Id::kChapterAtom, &ChapterAtom::atoms)) {}
+ MakeChild<ChapterAtomParser>(Id::kChapterAtom, &ChapterAtom::atoms,
+ max_recursive_depth)) {}
};
} // namespace webm
diff --git a/webm_parser/src/master_value_parser.h b/webm_parser/src/master_value_parser.h
index d504cfb..841d624 100644
--- a/webm_parser/src/master_value_parser.h
+++ b/webm_parser/src/master_value_parser.h
@@ -17,6 +17,7 @@
#include <vector>
#include "src/master_parser.h"
+#include "src/recursive_parser.h"
#include "src/skip_callback.h"
#include "webm/callback.h"
#include "webm/element.h"
@@ -244,6 +245,56 @@
std::vector<Element<Value>> T::*member_;
};
+ template <typename Parser, typename... Tags>
+ class RecursiveChildFactory {
+ public:
+ constexpr RecursiveChildFactory(Id id, std::vector<Element<T>> T::*member,
+ std::size_t max_recursion_depth)
+ : id_(id), member_(member), max_recursion_depth_(max_recursion_depth) {}
+
+ // Builds a std::pair<Id, std::unique_ptr<ElementParser>>. The parent
+ // pointer must be a pointer to the MasterValueParser that is being
+ // constructed. The given value pointer must be the pointer to the fully
+ // constructed MasterValueParser::value_ object.
+ std::pair<Id, std::unique_ptr<ElementParser>> BuildParser(
+ MasterValueParser* parent, T* value) {
+ assert(parent != nullptr);
+ assert(value != nullptr);
+
+ std::vector<Element<T>>* child_member = &(value->*member_);
+ auto lambda = [child_member](RecursiveParser<Parser>* parser) {
+ if (child_member->size() == 1 && !child_member->front().is_present()) {
+ child_member->clear();
+ }
+ child_member->emplace_back(std::move(*parser->mutable_value()), true);
+ };
+
+ return {id_, std::unique_ptr<ElementParser>(
+ new ChildParser<RecursiveParser<Parser>,
+ decltype(lambda), Tags...>(
+ parent, std::move(lambda), max_recursion_depth_))};
+ }
+
+ // If called, OnParseStarted will be called on the parent element when this
+ // particular element is encountered.
+ constexpr RecursiveChildFactory<Parser, TagUseAsStart, Tags...>
+ UseAsStartEvent() const {
+ return {id_, member_, max_recursion_depth_};
+ }
+
+ // If called, OnChildParsed will be called on the parent element when this
+ // particular element is fully parsed.
+ constexpr RecursiveChildFactory<Parser, TagNotifyOnParseComplete, Tags...>
+ NotifyOnParseComplete() const {
+ return {id_, member_, max_recursion_depth_};
+ }
+
+ private:
+ Id id_;
+ std::vector<Element<T>> T::*member_;
+ std::size_t max_recursion_depth_;
+ };
+
// Constructs a new parser. Each argument must be a *ChildFactory, constructed
// from the MakeChild method.
template <typename... Args>
@@ -262,6 +313,8 @@
Id id, Element<Value> T::*member) {
static_assert(std::is_base_of<ElementParser, Parser>::value,
"Parser must derive from ElementParser");
+ static_assert(!std::is_base_of<MasterValueParser<T>, Parser>::value,
+ "Recursive elements should be contained in a std::vector");
return SingleChildFactory<Parser, Value>(id, member);
}
@@ -270,9 +323,20 @@
Id id, std::vector<Element<Value>> T::*member) {
static_assert(std::is_base_of<ElementParser, Parser>::value,
"Parser must derive from ElementParser");
+ static_assert(!std::is_base_of<MasterValueParser<T>, Parser>::value,
+ "Recursive elements require a maximum recursion depth");
return RepeatedChildFactory<Parser, Value>(id, member);
}
+ template <typename Parser>
+ static RecursiveChildFactory<Parser> MakeChild(
+ Id id, std::vector<Element<T>> T::*member,
+ std::size_t max_recursion_depth) {
+ static_assert(std::is_base_of<MasterValueParser<T>, Parser>::value,
+ "Child must be recusrive to use maximum recursion depth");
+ return RecursiveChildFactory<Parser>(id, member, max_recursion_depth);
+ }
+
// Gets the metadata for this element, setting the EBML element ID to id. Only
// call after Init() has been called.
ElementMetadata metadata(Id id) const {
diff --git a/webm_parser/src/recursive_parser.h b/webm_parser/src/recursive_parser.h
index aef49cf..1646f2f 100644
--- a/webm_parser/src/recursive_parser.h
+++ b/webm_parser/src/recursive_parser.h
@@ -27,7 +27,8 @@
template <typename T>
class RecursiveParser : public ElementParser {
public:
- RecursiveParser() = default;
+ explicit RecursiveParser(std::size_t max_recursion_depth = 25)
+ : max_recursion_depth_(max_recursion_depth){};
RecursiveParser(RecursiveParser&&) = default;
RecursiveParser& operator=(RecursiveParser&&) = default;
@@ -39,8 +40,12 @@
std::uint64_t max_size) override {
assert(metadata.size == kUnknownElementSize || metadata.size <= max_size);
+ if (max_recursion_depth_ == 0) {
+ return Status(Status::kExceededRecursionDepthLimit);
+ }
+
if (!impl_) {
- impl_.reset(new T);
+ impl_.reset(new T(max_recursion_depth_ - 1));
}
return impl_->Init(metadata, max_size);
@@ -48,8 +53,9 @@
void InitAfterSeek(const Ancestory& child_ancestory,
const ElementMetadata& child_metadata) override {
+ assert(max_recursion_depth_ > 0);
if (!impl_) {
- impl_.reset(new T);
+ impl_.reset(new T(max_recursion_depth_ - 1));
}
impl_->InitAfterSeek(child_ancestory, child_metadata);
@@ -79,6 +85,7 @@
private:
std::unique_ptr<T> impl_;
+ std::size_t max_recursion_depth_;
};
} // namespace webm
diff --git a/webm_parser/src/simple_tag_parser.h b/webm_parser/src/simple_tag_parser.h
index 8944c99..d8b9da6 100644
--- a/webm_parser/src/simple_tag_parser.h
+++ b/webm_parser/src/simple_tag_parser.h
@@ -11,7 +11,6 @@
#include "src/bool_parser.h"
#include "src/byte_parser.h"
#include "src/master_value_parser.h"
-#include "src/recursive_parser.h"
#include "webm/dom_types.h"
#include "webm/id.h"
@@ -22,15 +21,15 @@
// http://www.webmproject.org/docs/container/#SimpleTag
class SimpleTagParser : public MasterValueParser<SimpleTag> {
public:
- SimpleTagParser()
+ SimpleTagParser(std::size_t max_recursive_depth = 25)
: MasterValueParser<SimpleTag>(
MakeChild<StringParser>(Id::kTagName, &SimpleTag::name),
MakeChild<StringParser>(Id::kTagLanguage, &SimpleTag::language),
MakeChild<BoolParser>(Id::kTagDefault, &SimpleTag::is_default),
MakeChild<StringParser>(Id::kTagString, &SimpleTag::string),
MakeChild<BinaryParser>(Id::kTagBinary, &SimpleTag::binary),
- MakeChild<RecursiveParser<SimpleTagParser>>(Id::kSimpleTag,
- &SimpleTag::tags)) {}
+ MakeChild<SimpleTagParser>(Id::kSimpleTag, &SimpleTag::tags,
+ max_recursive_depth)) {}
};
} // namespace webm
diff --git a/webm_parser/tests/chapter_atom_parser_test.cc b/webm_parser/tests/chapter_atom_parser_test.cc
index 10c656a..5c82061 100644
--- a/webm_parser/tests/chapter_atom_parser_test.cc
+++ b/webm_parser/tests/chapter_atom_parser_test.cc
@@ -11,12 +11,14 @@
#include "test_utils/element_parser_test.h"
#include "webm/id.h"
+#include "webm/status.h"
using webm::ChapterAtom;
using webm::ChapterAtomParser;
using webm::ChapterDisplay;
using webm::ElementParserTest;
using webm::Id;
+using webm::Status;
namespace {
@@ -185,4 +187,23 @@
EXPECT_EQ(expected_chapter_atom, chapter_atom.atoms[0].value());
}
+TEST_F(ChapterAtomParserTest, ExceedMaxRecursionDepth) {
+ ResetParser(1);
+
+ SetReaderData({
+ 0xB6, // ID = 0xB6 (ChapterAtom).
+ 0x80, // Size = 0.
+ });
+ ParseAndVerify();
+
+ SetReaderData({
+ 0xB6, // ID = 0xB6 (ChapterAtom).
+ 0x82, // Size = 2.
+
+ 0xB6, // ID = 0xB6 (ChapterAtom).
+ 0x80, // Size = 0.
+ });
+ ParseAndExpectResult(Status::kExceededRecursionDepthLimit);
+}
+
} // namespace
diff --git a/webm_parser/tests/recursive_parser_test.cc b/webm_parser/tests/recursive_parser_test.cc
index 88af177..8965a3e 100644
--- a/webm_parser/tests/recursive_parser_test.cc
+++ b/webm_parser/tests/recursive_parser_test.cc
@@ -30,22 +30,37 @@
class FailParser : public ElementParser {
public:
- FailParser() { EXPECT_FALSE(true); }
+ explicit FailParser(std::size_t /* max_recursion_depth */) { ADD_FAILURE(); }
Status Init(const ElementMetadata& /* metadata */,
std::uint64_t /* max_size */) override {
+ ADD_FAILURE();
return Status(Status::kInvalidElementSize);
}
Status Feed(Callback* /* callback */, Reader* /* reader */,
std::uint64_t* num_bytes_read) override {
+ ADD_FAILURE();
*num_bytes_read = 0;
return Status(Status::kInvalidElementSize);
}
- int value() const { return 0; }
+ int value() const {
+ ADD_FAILURE();
+ return 0;
+ }
- int* mutable_value() { return nullptr; }
+ int* mutable_value() {
+ ADD_FAILURE();
+ return nullptr;
+ }
+};
+
+class StringParserWrapper : public StringParser {
+ public:
+ explicit StringParserWrapper(std::size_t max_recursion_depth) {
+ EXPECT_EQ(max_recursion_depth, 24);
+ }
};
class RecursiveFailParserTest
@@ -56,7 +71,7 @@
}
class RecursiveStringParserTest
- : public ElementParserTest<RecursiveParser<StringParser>> {};
+ : public ElementParserTest<RecursiveParser<StringParserWrapper>> {};
TEST_F(RecursiveStringParserTest, ParsesOkay) {
ParseAndVerify();
@@ -67,4 +82,9 @@
EXPECT_EQ("Hi", parser_.value());
}
+TEST_F(RecursiveStringParserTest, ExceedMaxRecursionDepth) {
+ ResetParser(0);
+ TestInit(0, Status::kExceededRecursionDepthLimit);
+}
+
} // namespace
diff --git a/webm_parser/tests/simple_tag_parser_test.cc b/webm_parser/tests/simple_tag_parser_test.cc
index 27931ec..f67191c 100644
--- a/webm_parser/tests/simple_tag_parser_test.cc
+++ b/webm_parser/tests/simple_tag_parser_test.cc
@@ -13,11 +13,13 @@
#include "test_utils/element_parser_test.h"
#include "webm/id.h"
+#include "webm/status.h"
using webm::ElementParserTest;
using webm::Id;
using webm::SimpleTag;
using webm::SimpleTagParser;
+using webm::Status;
namespace {
@@ -181,4 +183,23 @@
EXPECT_EQ(expected, simple_tag.tags[0].value());
}
+TEST_F(SimpleTagParserTest, ExceedMaxRecursionDepth) {
+ ResetParser(1);
+
+ SetReaderData({
+ 0x67, 0xC8, // ID = 0x67C8 (SimpleTag).
+ 0x80, // Size = 0.
+ });
+ ParseAndVerify();
+
+ SetReaderData({
+ 0x67, 0xC8, // ID = 0x67C8 (SimpleTag).
+ 0x83, // Size = 3.
+
+ 0x67, 0xC8, // ID = 0x67C8 (SimpleTag).
+ 0x80, // Size = 0.
+ });
+ ParseAndExpectResult(Status::kExceededRecursionDepthLimit);
+}
+
} // namespace